presta
Version:
Hyper minimal framework for the modern web.
82 lines (76 loc) • 100 kB
JavaScript
#!/usr/bin/env node
var Xe=Object.create;var O=Object.defineProperty,Ye=Object.defineProperties,et=Object.getOwnPropertyDescriptor,tt=Object.getOwnPropertyDescriptors,rt=Object.getOwnPropertyNames,le=Object.getOwnPropertySymbols,ot=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty,st=Object.prototype.propertyIsEnumerable;var pe=(e,t,o)=>t in e?O(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,b=(e,t)=>{for(var o in t||(t={}))ce.call(t,o)&&pe(e,o,t[o]);if(le)for(var o of le(t))st.call(t,o)&&pe(e,o,t[o]);return e},k=(e,t)=>Ye(e,tt(t)),ue=e=>O(e,"__esModule",{value:!0});var me=(e,t)=>{ue(e);for(var o in t)O(e,o,{get:t[o],enumerable:!0})},it=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of rt(t))!ce.call(e,r)&&r!=="default"&&O(e,r,{get:()=>t[r],enumerable:!(o=et(t,r))||o.enumerable});return e},c=e=>it(ue(O(e!=null?Xe(ot(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);me(exports,{registerRuntime:()=>G});var Ke=c(require("sade"));var nt="presta",at="0.43.3",lt="Hyper minimal framework for the modern web.",ct="./dist/index.js",pt="./dist/index.d.ts",ut={presta:"dist/bin.js"},mt=["dist"],ft={build:"node scripts/build && pnpx tsc --emitDeclarationOnly",cloc:"pnpm dlx cloc './lib/*.ts'",typecheck:"pnpx tsc --noEmit"},dt={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},gt="estrattonbailey",ht="MIT",yt={url:"https://github.com/sure-thing/presta/issues"},bt="https://github.com/sure-thing/presta#readme",vt={chokidar:"^3.4.3","deep-extend":"^0.6.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"},xt={"@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"},fe={name:nt,version:at,description:lt,main:ct,types:pt,bin:ut,files:mt,scripts:ft,repository:dt,author:gt,license:ht,bugs:yt,homepage:bt,dependencies:vt,devDependencies:xt};var We=c(require("fs-extra")),Ge=c(require("path")),ae=c(require("chokidar"));var Z={};me(Z,{Levels:()=>w,colors:()=>D.default,debug:()=>h,error:()=>d,getLogs:()=>Pt,info:()=>y,logger:()=>F,newline:()=>St,raw:()=>Et,warn:()=>C});var D=c(require("kleur"));var v={PRODUCTION:"production",DEVELOPMENT:"development"};var w;(function(i){i.Debug="debug",i.Info="info",i.Warn="warn",i.Err="error"})(w||(w={}));var J=[],wt={[w.Debug]:"magenta",[w.Info]:"blue",[w.Warn]:"yellow",[w.Err]:"red"};function Pt(){if(!process.env.TESTING)throw new Error("Internal method was called outside test mode");return J}function F(e){if(process.env.TESTING)J.push(e);else{let t=process.env.PRESTA_DEBUG,o=process.env.PRESTA_ENV===v.PRODUCTION?"prod":"dev";if(!t&&e.level===w.Debug)return;console.log([D.default.gray(o),D.default[wt[e.level||"info"]](e.label),e.message,e.duration?D.default.gray("+"+e.duration):"",e.error?`
${e.error.stack||e.error}
`:""].filter(Boolean).join(" "))}}function h(e){F(b({level:w.Debug},e))}function y(e){F(b({level:w.Info},e))}function C(e){F(b({level:w.Warn},e))}function d(e){F(b({level:w.Err},e))}function Et(...e){process.env.TESTING?J.push(e):console.log(...e)}function St(){process.env.TESTING||console.log("")}var de=c(require("fs")),E=c(require("path")),ge=c(require("get-port"));var S="presta.config.js";function T(e){return(0,ge.default)({port:parseInt(e,10)})}function M(e,t=!1){let o=E.default.resolve(e||S);try{return delete require.cache[o],require(o)}catch(r){return de.default.existsSync(o)&&(d({label:"error",error:r}),t&&process.exit(1)),{}}}function j(e,t,o){let r=b({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.output=t.assets),t.port&&(r.port=t.port),r.files&&(r.files=[].concat(r.files).map(i=>E.default.resolve(process.cwd(),i))),r.output&&(r.output=E.default.resolve(process.cwd(),r.output)),r.assets&&(r.assets=E.default.resolve(process.cwd(),r.assets)),k(b({},r),{staticOutputDir:E.default.join(r.output,"static"),functionsOutputDir:E.default.join(r.output,"functions"),functionsManifest:E.default.join(r.output,"routes.json")})}var Y=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"));var L=c(require("fs-extra")),ye=c(require("path")),be=c(require("route-sort"));function he(e){for(var t=5381,o=e.length;o;)t=t*33^e.charCodeAt(--o);return(t>>>0).toString(36)}function Ct(e){return e.replace(process.cwd(),"").split(".").reverse().slice(1).reverse().join("-").split("/").filter(Boolean).join("-")}function $(e,t){let o=e.map(s=>{try{let{route:n}=require(s),p=Ct(s),a=ye.default.join(t.functionsOutputDir,t.env===v.PRODUCTION?p+"-"+he(L.default.readFileSync(s,"utf8"))+".js":p+".js");return h({label:"debug",message:`generating ${p} lambda`}),delete require.cache[s],delete require.cache[a],L.default.outputFileSync(a,`import { wrapHandler } from 'presta/dist/wrapHandler';
import * as file from '${s}';
export const route = file.route
export const handler = wrapHandler(file)`),[n,a]}catch(n){d({label:"error",error:n})}}).filter(Boolean),r=(0,be.default)(o.map(s=>s[0])),i={};for(let s of r){let n=o.find(p=>p[0]===s);n&&(i[s]=n[1])}return L.default.outputFileSync(t.functionsManifest,JSON.stringify(i)),o}var K=c(require("fs-extra")),ve=c(require("path")),xe=c(require("tiny-glob/sync"));function B(e){return/export\s.+\sroute\s+\=/.test(K.default.readFileSync(e,"utf-8"))}function A(e){return/export\s.+\sgetStaticPaths/.test(K.default.readFileSync(e,"utf-8"))}function N(e){try{return[].concat(e).map(t=>(0,xe.default)(t)).flat().map(t=>ve.default.resolve(process.cwd(),t))}catch(t){return d({label:"paths",message:"no files found",error:t}),[]}}var X=c(require("fs-extra")),H=c(require("path")),Ee=c(require("mime-types"));function P(){let e=process.hrtime();return()=>{let[t,o]=process.hrtime(e),r=o/1e6;return t<1?(r>=1?r.toFixed(0):r.toFixed(2))+"ms":t+"."+r.toFixed(0)+"s"}}var we=c(require("regexparam"));function Pe(e,t){let[o]=e.split("?"),r=(0,we.default)(t),i=0,s={},n=r.pattern.exec(o)||[];for(;i<r.keys.length;)s[r.keys[i]]=n[++i];return s}function Rt(e){return typeof e=="object"?JSON.stringify(e):e}function R(e){let{isBase64Encoded:t=!1,statusCode:o=200,headers:r={},multiValueHeaders:i={},body:s="",html:n=void 0,json:p=void 0,xml:a=void 0}=typeof e=="string"?{body:e}:e,l="text/html; charset=utf-8";return p?l="application/json; charset=utf-8":a&&(l="application/xml; charset=utf-8"),{isBase64Encoded:t,statusCode:o,headers:b({"Content-Type":l},r),multiValueHeaders:i,body:Rt(s||n||p||a||"")}}function q({port:e}){return`
<script>
(function (global) {
var socket = new WebSocket('ws://localhost:${e}');
socket.addEventListener('open', function (event) {
console.log('[presta] connected on port ${e}')
});
socket.addEventListener('message', function (event) {
console.log(\`'[presta] received \${event.data}\`)
if (event.data === 'refresh') {
global.location.reload();
}
});
socket.addEventListener('close', function () {
console.log('[presta] disconnected')
});
})(this);
<\/script>
`}function kt(e,t="html"){return H.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}async function V(e){return h({label:"debug",message:`removing old static file ${e}`}),X.default.remove(e)}async function Ot(e){return Promise.all(e.map(V))}async function Dt(e,t,{footer:o}){let r=require(e),i=await r.getStaticPaths(),s=[];if(!i||!i.length)return s;for(let n of i){let p=P(),a={path:n,pathParameters:r.route?Pe(n,r.route):{}},l=R(await r.handler(a,{})),u=l.headers?l.headers["Content-Type"]:"",m=u&&Ee.default.extension(u)||"html",g=kt(n,m),x=l.body+o;X.default.outputFileSync(H.default.join(t,g),x,"utf-8"),y({label:"built",message:n,duration:p()}),s.push(g)}return s}async function _(e,t,o={}){let r=t.env===v.DEVELOPMENT,i=t.staticOutputDir,s=r?q({port:t.port}):"";for(let n of e)try{let p=n.replace(process.cwd(),""),a=o[n]||[],l=await Dt(n,i,{footer:s});if(!l||!l.length){C({label:"paths",message:`${p} - no paths to render`}),Ot(a.map(u=>H.default.join(i,u)));continue}for(let u of a)l.includes(u)||V(H.default.join(i,u));o[n]=l}catch(p){d({label:"error",error:p});break}return{staticFilesMap:o}}function De(e,t){let o=P();$(e,t),e.length&&y({label:"built",message:"lambdas",duration:o()})}function Ft(e,t,o){return(0,ke.default)(t)(e)&&!o.includes(e)}async function Fe(e,t){let o={},r=N(e.files);r.length||C({label:"paths",message:"no files configured"});async function i(a,l,u){if(delete require.cache[a],A(a)){let m=await _([a],u,o);o=(0,Oe.default)({},o,m.staticFilesMap)}De(l.filter(B),u)}async function s(a,l,u){for(let m of a)await i(m,l,u)}await s(r,r,e),t.emitBrowserRefresh();let n=(0,Ce.create)({alias:{"@":process.cwd()}});n.onChange(async a=>{await s(a,r,e),t.emitBrowserRefresh()}),n.onRemove(async([a])=>{h({label:"watch",message:`removed ${a}`}),r.splice(r.indexOf(a),1),De(r.filter(B),e),(o[a]||[]).forEach(l=>V(Se.default.join(e.staticOutputDir,l))),t.emitBrowserRefresh()}),n.onError(a=>{d({label:"error",error:typeof a=="string"?new Error(a):a})}),await n.add(r);let p=Re.default.watch(process.cwd(),{ignoreInitial:!0,ignored:[e.output,e.assets]});return p.on("add",async a=>{!Y.default.existsSync(a)||Y.default.lstatSync(a).isDirectory()||!Ft(a,e.files,r)||(h({label:"watch",message:`add ${a}`}),r.push(a),await n.add(a),await i(a,r,e),t.emitBrowserRefresh())}),t.onBuildFile(async({file:a})=>{await i(a,r,e),t.emitBrowserRefresh()}),{async close(){await n.close(),await p.close()}}}async function U(e,t,o){let r=await Promise.all(e.map(i=>{try{return i(t,o)}catch(s){d({label:"error",error:s})}}).filter(Boolean));return{async cleanup(){return Promise.all(r.map(i=>i&&i.cleanup&&i.cleanup()))}}}var Be;(function(r){r.PostBuild="post-build",r.BuildFile="build-file",r.BrowserRefresh="browser-refresh"})(Be||(Be={}));function z(){let e={};function t(s,...n){e[s]&&e[s].map(p=>p(...n))}function o(s,n){return e[s]=e[s]?e[s].concat(n):[n],()=>e[s].splice(e[s].indexOf(n),1)}function r(){e={}}function i(s){return e[s]||[]}return{emit:t,on:o,clear:r,listeners:i}}function W(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 He=c(require("path")),re=c(require("fs-extra")),Ie=c(require("esbuild"));function ee(e){return delete require.cache[e],require(e)}function te(e){try{return ee(e)}catch(t){return{}}}async function Te(e,t){let o=P(),r=N(e.files),i=r.filter(A),s=r.filter(B);if(h({label:"build",message:"starting build"}),!i.length&&!s.length)C({label:"files",message:"no files were found, nothing to build"});else{let n="",p=0,a="",l="",u=await Promise.allSettled([(async()=>{if(i.length){let m=P(),{staticFilesMap:g}=await _(i,e);n=m(),p=Object.keys(g).reduce((x,Q)=>x+=g[Q].length,0)}})(),(async()=>{if(s.length){let m=P(),g=te(He.default.join(process.cwd(),"package.json"));$(s,e),await(0,Ie.build)({entryPoints:Object.values(require(e.functionsManifest)),outdir:e.functionsOutputDir,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,external:Object.keys(g.dependencies||{}),bundle:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),a=m()}})(),(async()=>{if(re.default.existsSync(e.assets)){let m=P();re.default.copySync(e.assets,e.staticOutputDir),l=m()}})()]);if(u.find(m=>m.status==="rejected"))throw h({label:"build",message:"build partially failed"}),u.forEach(m=>{m.status==="rejected"&&d({label:"error",error:m.reason})}),new Error("presta build failed");n&&y({label:"static",message:`rendered ${p} file(s)`,duration:n}),a&&y({label:"lambda",message:`compiled ${s.length} function(s)`,duration:a}),l&&y({label:"assets",message:`copied in ${l}`}),t.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,functionsManifest:te(e.functionsManifest)}),(n||a)&&y({label:"complete",message:`in ${o()}`})}}var Ve=c(require("http")),se=c(require("sirv")),_e=c(require("mime-types")),Ue=c(require("regexparam")),ie=c(require("statuses")),ze=c(require("ws"));var oe=c(require("statuses"));function Me({statusCode:e}){return`<!-- built with presta https://npm.im/presta -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>${e} \u2014\xA0${oe.default.message[e]}</title>
<link rel="icon" type="image/png" href="https://presta.run/favicon.png">
<link rel="icon" type="image/svg" href="https://presta.run/favicon.svg">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;900&display=swap" rel="stylesheet">
<link rel='stylesheet' href='https://unpkg.com/svbstrate@5.1.0/svbstrate.css' />
<style>
html,body {
font-family: 'Inter', 'sans-serif';
color: #23283D;
background-color: #DADEF0;
}
#favicon {
fill: #23283D;
}
@media (prefers-color-scheme: dark) {
html,body {
color: #DADEF0;
background-color: #23283D;
}
#favicon {
fill: #DADEF0;
}
}
</style>
</head>
<body class='w f aic jcc' style='height: 100vh'>
<div class='p12 tac'>
<h1>${e}</h1>
<p class='mb1'>${oe.default.message[e]}</p>
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#a)">
<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"/>
</g>
<defs>
<clipPath id="a">
<path fill="#fff" d="M0 0h32v32H0z"/>
</clipPath>
</defs>
</svg>
</div>
</body>
</html>
`}var je=c(require("url")),Le=c(require("query-string")),$e=c(require("raw-body")),Ae=c(require("mime-types")),Bt=/image|audio|video|application\/pdf|application\/zip|applicaton\/octet-stream/i;function Ht(e){return Boolean(e)&&Bt.test(e)}function It(e){let t={},o={};for(let r of Object.keys(e)){let i=r.toLowerCase(),s=e[r];!s||(Array.isArray(s)?o[i]=s:t[i]=s)}return{headers:t,multiValueHeaders:o}}function Tt(e){let t=(0,Le.parse)(e,{arrayFormat:"comma"}),o={},r={};for(let i of Object.keys(t)){let s=t[i];Array.isArray(s)?r[i]=s:s&&(o[i]=s)}return{queryStringParameters:o,multiValueQueryStringParameters:r}}async function Ne(e){let{url:t="",method:o}=e,{headers:r,multiValueHeaders:i}=It(e.headers),s=Ht(r["content-type"]||""),n=r["content-length"],p=n?await(0,$e.default)(e,{limit:"1mb",encoding:Ae.default.charset(n)||void 0}):void 0,a=(0,je.parse)(t).query||"",{queryStringParameters:l,multiValueQueryStringParameters:u}=Tt(a);return r["client-ip"]="0.0.0.0",{rawUrl:t,path:t,httpMethod:o,headers:r,multiValueHeaders:i,rawQuery:a,queryStringParameters:l,multiValueQueryStringParameters:u,body:p?Buffer.from(p).toString(s?"base64":"utf8"):null,isBase64Encoded:s,pathParameters:{}}}function qe(e,t){let o=R(t);for(let r in t.multiValueHeaders)e.setHeader(r,String(t.multiValueHeaders[r]));for(let r in t.headers)e.setHeader(r,String(t.headers[r]));e.statusCode=o.statusCode,e.write(o.body),e.end()}function Mt(e,t){let o=new Error(t);return o.statusCode=e,o}function jt(e){let t=((e==null?void 0:e.headers)||{})["Content-Type"]||"html";return t&&_e.default.extension(String(t))||"html"}function Lt(e,t){let r=Object.keys(t).map(i=>({matcher:(0,Ue.default)(i),route:i})).filter(({matcher:i})=>i.pattern.test(e.split("?")[0])).map(({route:i})=>t[i])[0];return r?require(r):void 0}async function $t(e,t){let o=e.headers.Accept||e.headers.accept,r=o&&o.includes("json");try{if(!t||!t.handler)throw Mt(404,"");return R(await t.handler(e,{}))}catch(i){let s=i,{statusCode:n=500}=s;return n>499&&d({label:"error",message:s.message||ie.default.message[n],error:s}),R({statusCode:n,html:r?void 0:Me({statusCode:n}),json:r?{detail:ie.default.message[n]}:void 0})}}function At({port:e,config:t}){return async function(r,i){var g;let s=P(),n=await Ne(r),p=ee(t.functionsManifest),a=Lt(n.path,p),l=await $t(n,a),u=l.statusCode>299&&l.statusCode<399;jt(l)==="html"&&(l.body=(l.body||"").split("</body>")[0]+q({port:e})),Z[l.statusCode<299?"info":"error"]({label:"serve",message:`${l.statusCode} ${u&&((g=l==null?void 0:l.headers)==null?void 0:g.Location)||n.path}`,duration:s()}),qe(i,l)}}function Nt({port:e,config:t}){let o=t.staticOutputDir,r=t.assets;return async function(s,n){let p=P(),a=s.url;h({label:"debug",message:`handling ${a}`});function l(u,m){y({label:"serve",message:`${u.statusCode} ${m}`,duration:p()})}(0,se.default)(r,{dev:!0,setHeaders:l})(s,n,()=>{(0,se.default)(o,{dev:!0,setHeaders:l})(s,n,async()=>{At({port:e,config:t})(s,n)})})}}function ne(e,t){let o=e.port,r=Ve.default.createServer(Nt({port:o,config:e})).listen(o),i=new ze.WebSocketServer({server:r}),s=[];return r.on("connection",n=>{s.push(n),n.on("close",()=>s.splice(s.indexOf(n),1))}),t.onBrowserRefresh(()=>{h({label:"debug",message:"refresh event received"}),i.clients.forEach(n=>n.send("refresh"))}),{async close(){await new Promise(n=>{r.close(()=>n(1)),s.forEach(p=>p.destroy())})}}}async function Qe(e){let t=M(e.config,!0),o=await T(e.port||t.port||4e3),r=z(),i=W(r),s=j(v.PRODUCTION,k(b({},e),{port:o}),t);await U(s.plugins,s,i),We.default.emptyDirSync(s.output),y({label:"build"}),await Te(s,i)}async function Je(e){let t=e["no-serve"],o,r,i=!1;async function s(){let p,a,l,u=M(e.config);(!r||u.port&&r!==u.port)&&(r=await T(e.port||u.port||4e3));let m=z(),g=W(m),x=j(v.DEVELOPMENT,k(b({},e),{port:r}),u),Q=await U(x.plugins,x,g);return h({label:"debug",message:`config created ${JSON.stringify(x)}`}),t||(a=ne(x,g),l=ae.default.watch(x.assets,{ignoreInitial:!0}).on("all",()=>{g.emitBrowserRefresh()})),y({label:i?"restart":"start",message:t?"":`http://localhost:${x.port}`}),p=await Fe(x,g),{config:x,async close(){m.clear(),await Q.cleanup(),await l.close(),await p.close(),a&&await a.close()}}}let n=ae.default.watch(Ge.default.resolve(e.config||S),{ignoreInitial:!0}).on("all",async()=>{if(!i){i=!0;try{await o.close()}catch(p){console.error(p)}console.clear(),o=await s(),i=!1}});return o=await s(),{async close(){await n.close(),await o.close()}}}async function Ze(e){let t=M(e.config,!0),o=await T(e.port||t.port||4e3),r=z(),i=W(r),s=j(v.PRODUCTION,k(b({},e),{port:o}),t);await U(s.plugins,s,i),ne(s,i),y({label:"serve",message:`http://localhost:${s.port}`})}function G(e={}){require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}var I=(0,Ke.default)("presta");I.version(fe.version).option("--config, -c",`Path to a config file. (default ${S})`).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");I.command("build","Build project to output directory.",{default:!0}).example("").example("files/**/*.js").example(`-c ${S}`).action(e=>{process.env.PRESTA_ENV=v.PRODUCTION,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),G(),Qe(e)});I.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 ${S}`).action(e=>{process.env.PRESTA_ENV=v.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),G(),Je(e)});I.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 ${S}`).action(async e=>{process.env.PRESTA_ENV=v.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),G(),Ze(e)});I.parse(process.argv);0&&(module.exports={registerRuntime});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2Jpbi50cyIsICIuLi9saWIvY2xpLnRzIiwgIi4uL2xpYi9sb2cudHMiLCAiLi4vbGliL2NvbnN0YW50cy50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi93YXRjaC50cyIsICIuLi9saWIvb3V0cHV0TGFtYmRhcy50cyIsICIuLi9saWIvaGFzaENvbnRlbnQudHMiLCAiLi4vbGliL2dldEZpbGVzLnRzIiwgIi4uL2xpYi9yZW5kZXJTdGF0aWNFbnRyaWVzLnRzIiwgIi4uL2xpYi90aW1lci50cyIsICIuLi9saWIvZ2V0Um91dGVQYXJhbXMudHMiLCAiLi4vbGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgIi4uL2xpYi9saXZlUmVsb2FkU2NyaXB0LnRzIiwgIi4uL2xpYi9wbHVnaW5zLnRzIiwgIi4uL2xpYi9jcmVhdGVFbWl0dGVyLnRzIiwgIi4uL2xpYi9idWlsZC50cyIsICIuLi9saWIvdXRpbHMudHMiLCAiLi4vbGliL3NlcnZlLnRzIiwgIi4uL2xpYi9jcmVhdGVEZWZhdWx0SHRtbFJlc3BvbnNlLnRzIiwgIi4uL2xpYi9yZXF1ZXN0VG9FdmVudC50cyIsICIuLi9saWIvc2VuZFNlcnZlcmxlc3NSZXNwb25zZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgc2FkZSBmcm9tICdzYWRlJ1xuXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbidcblxuaW1wb3J0IHsgYnVpbGRDb21tYW5kLCBkZXZDb21tYW5kLCBzZXJ2ZUNvbW1hbmQgfSBmcm9tICcuL2NsaSdcbmltcG9ydCB7IGRlZmF1bHRDb25maWdGaWxlcGF0aCB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclJ1bnRpbWUob3B0aW9ucyA9IHt9KSB7XG4gIHJlcXVpcmUoJ21vZHVsZS1hbGlhcycpLmFkZEFsaWFzZXMoe1xuICAgICdAJzogcHJvY2Vzcy5jd2QoKSxcbiAgICAncHJlc3RhOmludGVybmFsJzogX19kaXJuYW1lLCAvLyBUT0RPIHdoZXJldmVyIHRoaXMgaXMgcnVubmluZyBmcm9tXG4gIH0pXG5cbiAgcmVxdWlyZSgnZXNidWlsZC1yZWdpc3Rlci9kaXN0L25vZGUnKS5yZWdpc3RlcihvcHRpb25zKVxufVxuXG5jb25zdCBwcm9ncmFtID0gc2FkZSgncHJlc3RhJylcblxucHJvZ3JhbVxuICAudmVyc2lvbihwa2cudmVyc2lvbilcbiAgLy8gZG8gbm90IHByb3ZpZGUgZGVmYXVsdCBjb25maWcgaGVyZVxuICAub3B0aW9uKCctLWNvbmZpZywgLWMnLCBgUGF0aCB0byBhIGNvbmZpZyBmaWxlLiAgKGRlZmF1bHQgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9KWApXG4gIC5vcHRpb24oJy0tb3V0cHV0LCAtbycsIGBTcGVjaWZ5IG91dHB1dCBkaXJlY3RvcnkgZm9yIGJ1aWx0IGZpbGVzLiAgKGRlZmF1bHQgLi9idWlsZClgKVxuICAub3B0aW9uKCctLWFzc2V0cywgLWEnLCBgU3BlY2lmeSBzdGF0aWMgYXNzZXQgZGlyZWN0b3J5LiAgKGRlZmF1bHQgLi9wdWJsaWMpYClcbiAgLm9wdGlvbignLS1kZWJ1ZywgLWQnLCBgRW5hYmxlIGRlYnVnIG1vZGUgKHByaW50cyBtb3JlIGxvZ3MpYClcbiAgLmV4YW1wbGUoYGRldiBpbmRleC5qc3ggLW8gZGlzdGApXG4gIC5leGFtcGxlKGBkZXYgJ3BhZ2VzLyoudHN4JyAtbyBzdGF0aWNgKVxuICAuZXhhbXBsZShgJ3BhZ2VzLyoudHN4J2ApXG4gIC5leGFtcGxlKGAtYyBzaXRlLmpzb25gKVxuICAuZXhhbXBsZShgc2VydmUgLXAgODA4MGApXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2J1aWxkJywgJ0J1aWxkIHByb2plY3QgdG8gb3V0cHV0IGRpcmVjdG9yeS4nLCB7IGRlZmF1bHQ6IHRydWUgfSlcbiAgLmV4YW1wbGUoYGApXG4gIC5leGFtcGxlKGBmaWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LlBST0RVQ1RJT05cbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBidWlsZENvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnZGV2JywgJ1N0YXJ0IFByZXN0YSBkZXYgc2VydmVyIGFuZCB3YXRjaCBmaWxlcycsIHsgYWxpYXM6ICd3YXRjaCcgfSlcbiAgLm9wdGlvbignLS1wb3J0LCAtcCcsIGBQb3J0IHRvIHJ1biB0aGUgbG9jYWwgc2VydmVyLiAgKGRlZmF1bHQgNDAwMClgKVxuICAub3B0aW9uKCctLW5vLXNlcnZlLCAtbicsIGBEbyBub3QgcnVuIGxvY2FsIGRldiBzZXJ2ZXIuICAoZGVmYXVsdCBmYWxzZSlgKVxuICAuZGVzY3JpYmUoJ1dhdGNoIHByb2plY3QgYW5kIGJ1aWxkIHRvIG91dHB1dCBkaXJlY3RvcnkuJylcbiAgLmV4YW1wbGUoYGRldmApXG4gIC5leGFtcGxlKGBkZXYgLi9maWxlcy8qKi8qLmpzYClcbiAgLmV4YW1wbGUoYGRldiAuL2ZpbGVzLyoqLyouanMgLW8gLi9vdXRgKVxuICAuZXhhbXBsZShgZGV2IC1jICR7ZGVmYXVsdENvbmZpZ0ZpbGVwYXRofWApXG4gIC5hY3Rpb24oKG9wdGlvbnMpID0+IHtcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfRU5WID0gRW52LkRFVkVMT1BNRU5UXG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHID0gb3B0aW9ucy5kZWJ1ZyA/ICdkZWJ1ZycgOiAnJ1xuICAgIGNvbnNvbGUuY2xlYXIoKVxuICAgIHJlZ2lzdGVyUnVudGltZSgpXG4gICAgZGV2Q29tbWFuZChvcHRpb25zKVxuICB9KVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdzZXJ2ZScpXG4gIC5vcHRpb24oJy0tcG9ydCwgLXAnLCBgUG9ydCB0byBydW4gdGhlIGxvY2FsIHNlcnZlci4gIChkZWZhdWx0IDQwMDApYClcbiAgLmRlc2NyaWJlKCdTZXJ2ZSBidWlsdCBmaWxlcywgbGFtYmRhcywgYW5kIHN0YXRpYyBhc3NldHMuJylcbiAgLmV4YW1wbGUoYHNlcnZlYClcbiAgLmV4YW1wbGUoYHNlcnZlIC1vIC4vb3V0IC1wIDgwODBgKVxuICAuZXhhbXBsZShgc2VydmUgLWMgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9YClcbiAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPSBFbnYuREVWRUxPUE1FTlRcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBzZXJ2ZUNvbW1hbmQob3B0aW9ucylcbiAgfSlcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgT3B0aW9ucywgY3JlYXRlLCBnZXRDb25maWdGaWxlLCBkZWZhdWx0Q29uZmlnRmlsZXBhdGgsIGdldEF2YWlsYWJsZVBvcnQgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi93YXRjaCdcbmltcG9ydCB7IGluaXRQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW5zJ1xuaW1wb3J0IHsgY3JlYXRlRW1pdHRlciwgY3JlYXRlSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJy4vYnVpbGQnXG5pbXBvcnQgeyBzZXJ2ZSB9IGZyb20gJy4vc2VydmUnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJT3B0aW9ucyA9IHtcbiAgY29uZmlnPzogc3RyaW5nXG4gIG91dHB1dD86IHN0cmluZ1xuICBkZWJ1Zz86IGJvb2xlYW5cbn0gJiBQYXJ0aWFsPE9wdGlvbnM+XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSUJ1aWxkT3B0aW9ucyA9IFByZXN0YUNMSU9wdGlvbnMgJiB7XG4gIF86IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSVNlcnZlT3B0aW9ucyA9IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyAmIHtcbiAgcG9ydD86IHN0cmluZ1xuICAnbm8tc2VydmUnOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFByZXN0YUNMSURldk9wdGlvbnMgPSBQcmVzdGFDTElTZXJ2ZU9wdGlvbnNcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChvcHRpb25zOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMpIHtcbiAgY29uc3QgY29uZmlnRmlsZSA9IGdldENvbmZpZ0ZpbGUob3B0aW9ucy5jb25maWcsIHRydWUpXG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRBdmFpbGFibGVQb3J0KG9wdGlvbnMucG9ydCB8fCBjb25maWdGaWxlLnBvcnQgfHwgNDAwMClcblxuICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgY29uc3QgY29uZmlnID0gY3JlYXRlKEVudi5QUk9EVUNUSU9OLCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgY29uZmlnRmlsZSlcbiAgYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgZnMuZW1wdHlEaXJTeW5jKGNvbmZpZy5vdXRwdXQpXG5cbiAgbG9nZ2VyLmluZm8oe1xuICAgIGxhYmVsOiAnYnVpbGQnLFxuICB9KVxuXG4gIGF3YWl0IGJ1aWxkKGNvbmZpZywgaG9va3MpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXZDb21tYW5kKG9wdGlvbnM6IFByZXN0YUNMSURldk9wdGlvbnMpIHtcbiAgY29uc3Qgbm9TZXJ2ZSA9IG9wdGlvbnNbJ25vLXNlcnZlJ11cbiAgbGV0IGRldlNlcnZlcjogYW55XG4gIGxldCBwb3J0OiBudW1iZXJcbiAgbGV0IHJlc3RhcnRpbmcgPSBmYWxzZVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKCkge1xuICAgIGxldCB3YXRjaFRhc2s6IGFueVxuICAgIGxldCBodHRwU2VydmVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXJ2ZT5cbiAgICBsZXQgc3RhdGljQXNzZXRXYXRjaGVyOiBSZXR1cm5UeXBlPHR5cGVvZiBjaG9raWRhci53YXRjaD5cblxuICAgIGNvbnN0IHVzZXJDb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShvcHRpb25zLmNvbmZpZylcblxuICAgIGlmICghcG9ydCB8fCAodXNlckNvbmZpZ0ZpbGUucG9ydCAmJiBwb3J0ICE9PSB1c2VyQ29uZmlnRmlsZS5wb3J0KSkge1xuICAgICAgcG9ydCA9IGF3YWl0IGdldEF2YWlsYWJsZVBvcnQob3B0aW9ucy5wb3J0IHx8IHVzZXJDb25maWdGaWxlLnBvcnQgfHwgNDAwMClcbiAgICB9XG5cbiAgICBjb25zdCBlbWl0dGVyID0gY3JlYXRlRW1pdHRlcigpXG4gICAgY29uc3QgaG9va3MgPSBjcmVhdGVIb29rcyhlbWl0dGVyKVxuICAgIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZShFbnYuREVWRUxPUE1FTlQsIHsgLi4ub3B0aW9ucywgcG9ydCB9LCB1c2VyQ29uZmlnRmlsZSlcbiAgICBjb25zdCBwbHVnaW5zID0gYXdhaXQgaW5pdFBsdWdpbnMoY29uZmlnLnBsdWdpbnMsIGNvbmZpZywgaG9va3MpXG5cbiAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICBtZXNzYWdlOiBgY29uZmlnIGNyZWF0ZWQgJHtKU09OLnN0cmluZ2lmeShjb25maWcpfWAsXG4gICAgfSlcblxuICAgIGlmICghbm9TZXJ2ZSkge1xuICAgICAgaHR0cFNlcnZlciA9IHNlcnZlKGNvbmZpZywgaG9va3MpXG5cbiAgICAgIHN0YXRpY0Fzc2V0V2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKGNvbmZpZy5hc3NldHMsIHsgaWdub3JlSW5pdGlhbDogdHJ1ZSB9KS5vbignYWxsJywgKCkgPT4ge1xuICAgICAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyh7XG4gICAgICBsYWJlbDogcmVzdGFydGluZyA/ICdyZXN0YXJ0JyA6ICdzdGFydCcsXG4gICAgICBtZXNzYWdlOiAhbm9TZXJ2ZSA/IGBodHRwOi8vbG9jYWxob3N0OiR7Y29uZmlnLnBvcnR9YCA6ICcnLFxuICAgIH0pXG5cbiAgICB3YXRjaFRhc2sgPSBhd2FpdCB3YXRjaChjb25maWcsIGhvb2tzKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBlbWl0dGVyLmNsZWFyKClcbiAgICAgICAgYXdhaXQgcGx1Z2lucy5jbGVhbnVwKClcbiAgICAgICAgYXdhaXQgc3RhdGljQXNzZXRXYXRjaGVyLmNsb3NlKClcbiAgICAgICAgYXdhaXQgd2F0Y2hUYXNrLmNsb3NlKClcblxuICAgICAgICBpZiAoaHR0cFNlcnZlcikge1xuICAgICAgICAgIGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ1dhdGNoZXIgPSBjaG9raWRhclxuICAgIC53YXRjaChwYXRoLnJlc29sdmUob3B0aW9ucy5jb25maWcgfHwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoKSwgeyBpZ25vcmVJbml0aWFsOiB0cnVlIH0pXG4gICAgLm9uKCdhbGwnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVzdGFydGluZykgcmV0dXJuXG5cbiAgICAgIHJlc3RhcnRpbmcgPSB0cnVlXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRldlNlcnZlci5jbG9zZSgpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5jbGVhcigpXG5cbiAgICAgIGRldlNlcnZlciA9IGF3YWl0IHN0YXJ0RGV2U2VydmVyKClcblxuICAgICAgcmVzdGFydGluZyA9IGZhbHNlXG4gICAgfSlcblxuICBkZXZTZXJ2ZXIgPSBhd2FpdCBzdGFydERldlNlcnZlcigpXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ1dhdGNoZXIuY2xvc2UoKVxuICAgICAgYXdhaXQgZGV2U2VydmVyLmNsb3NlKClcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJ2ZUNvbW1hbmQob3B0aW9uczogUHJlc3RhQ0xJU2VydmVPcHRpb25zKSB7XG4gIGNvbnN0IGNvbmZpZ0ZpbGUgPSBnZXRDb25maWdGaWxlKG9wdGlvbnMuY29uZmlnLCB0cnVlKVxuICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0QXZhaWxhYmxlUG9ydChvcHRpb25zLnBvcnQgfHwgY29uZmlnRmlsZS5wb3J0IHx8IDQwMDApXG5cbiAgY29uc3QgZW1pdHRlciA9IGNyZWF0ZUVtaXR0ZXIoKVxuICBjb25zdCBob29rcyA9IGNyZWF0ZUhvb2tzKGVtaXR0ZXIpXG4gIGNvbnN0IGNvbmZpZyA9IGNyZWF0ZShFbnYuUFJPRFVDVElPTiwgeyAuLi5vcHRpb25zLCBwb3J0IH0sIGNvbmZpZ0ZpbGUpXG4gIGF3YWl0IGluaXRQbHVnaW5zKGNvbmZpZy5wbHVnaW5zLCBjb25maWcsIGhvb2tzKVxuXG4gIHNlcnZlKGNvbmZpZywgaG9va3MpXG5cbiAgbG9nZ2VyLmluZm8oe1xuICAgIGxhYmVsOiAnc2VydmUnLFxuICAgIG1lc3NhZ2U6IGBodHRwOi8vbG9jYWxob3N0OiR7Y29uZmlnLnBvcnR9YCxcbiAgfSlcbn1cbiIsICJpbXBvcnQgYywgeyBLbGV1ciB9IGZyb20gJ2tsZXVyJ1xuXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGVudW0gTGV2ZWxzIHtcbiAgRGVidWcgPSAnZGVidWcnLFxuICBJbmZvID0gJ2luZm8nLFxuICBXYXJuID0gJ3dhcm4nLFxuICBFcnIgPSAnZXJyb3InLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBsZXZlbD86IExldmVsc1xuICBsYWJlbDogc3RyaW5nIHwgbnVtYmVyXG4gIG1lc3NhZ2U/OiBzdHJpbmdcbiAgZHVyYXRpb24/OiBzdHJpbmcgfCBudW1iZXJcbiAgZXJyb3I/OiBFcnJvclxufVxuXG5sZXQgbG9nczogYW55W10gPSBbXVxuXG5jb25zdCBjb2xvcnMgPSB7XG4gIFtMZXZlbHMuRGVidWddOiAnbWFnZW50YScsXG4gIFtMZXZlbHMuSW5mb106ICdibHVlJyxcbiAgW0xldmVscy5XYXJuXTogJ3llbGxvdycsXG4gIFtMZXZlbHMuRXJyXTogJ3JlZCcsXG59XG5cbmV4cG9ydCB7IGMgYXMgY29sb3JzIH1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ3MoKSB7XG4gIGlmICghcHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW50ZXJuYWwgbWV0aG9kIHdhcyBjYWxsZWQgb3V0c2lkZSB0ZXN0IG1vZGUnKVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlcihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgbG9ncy5wdXNoKG1lc3NhZ2UpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGVidWcgPSBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUdcbiAgICBjb25zdCBjb250ZXh0ID0gcHJvY2Vzcy5lbnYuUFJFU1RBX0VOViA9PT0gRW52LlBST0RVQ1RJT04gPyAncHJvZCcgOiAnZGV2J1xuXG4gICAgaWYgKCFkZWJ1ZyAmJiBtZXNzYWdlLmxldmVsID09PSBMZXZlbHMuRGVidWcpIHJldHVyblxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBbXG4gICAgICAgIGMuZ3JheShjb250ZXh0KSxcbiAgICAgICAgY1tjb2xvcnNbbWVzc2FnZS5sZXZlbCB8fCAnaW5mbyddIGFzIGtleW9mIEtsZXVyXShtZXNzYWdlLmxhYmVsKSxcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICBtZXNzYWdlLmR1cmF0aW9uID8gYy5ncmF5KCcrJyArIG1lc3NhZ2UuZHVyYXRpb24pIDogJycsXG4gICAgICAgIG1lc3NhZ2UuZXJyb3IgPyBgXFxuXFxuJHttZXNzYWdlLmVycm9yLnN0YWNrIHx8IG1lc3NhZ2UuZXJyb3J9XFxuXFxuYCA6ICcnLFxuICAgICAgXVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJylcbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5EZWJ1ZywgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mbyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuSW5mbywgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2FybihtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuV2FybiwgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IobWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkVyciwgLi4ubWVzc2FnZSB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmF3KC4uLmFyZ3M6IGFueVtdKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSB7XG4gICAgbG9ncy5wdXNoKGFyZ3MpXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coLi4uYXJncylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV3bGluZSgpIHtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcpIHJldHVyblxuICBjb25zb2xlLmxvZygnJylcbn1cbiIsICJleHBvcnQgY29uc3QgRW52ID0ge1xuICBQUk9EVUNUSU9OOiAncHJvZHVjdGlvbicsXG4gIERFVkVMT1BNRU5UOiAnZGV2ZWxvcG1lbnQnLFxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2V0UG9ydCBmcm9tICdnZXQtcG9ydCdcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgUHJlc3RhQ0xJRGV2T3B0aW9ucywgUHJlc3RhQ0xJQnVpbGRPcHRpb25zIH0gZnJvbSAnLi9jbGknXG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICcuL3BsdWdpbnMnXG5cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIGZpbGVzOiBzdHJpbmdbXVxuICBvdXRwdXQ6IHN0cmluZ1xuICBhc3NldHM6IHN0cmluZ1xuICBwbHVnaW5zOiBQbHVnaW5bXVxuICBwb3J0OiBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgQ29uZmlnID0gT3B0aW9ucyAmIHtcbiAgZW52OiBzdHJpbmdcbiAgc3RhdGljT3V0cHV0RGlyOiBzdHJpbmdcbiAgZnVuY3Rpb25zT3V0cHV0RGlyOiBzdHJpbmdcbiAgZnVuY3Rpb25zTWFuaWZlc3Q6IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoID0gJ3ByZXN0YS5jb25maWcuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdmFpbGFibGVQb3J0KHByZWZlcnJlZDogc3RyaW5nKSB7XG4gIHJldHVybiBnZXRQb3J0KHsgcG9ydDogcGFyc2VJbnQocHJlZmVycmVkLCAxMCkgfSlcbn1cblxuLyoqXG4gKiBGZXRjaCBhIGNvbmZpZyBmaWxlLiBJZiBvbmUgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlciwgbGV0IHRoZW0ga25vdyBpZlxuICogYW55dGhpbmcgZ29lcyB3cm9uZy4gT3V0c2lkZSB3YXRjaCBtb2RlLCB0aGlzIHNob3VsZCBleGl0KDEpIGlmIHRoZSB1c2VyXG4gKiBwcm92aWRlZCBhIGNvbmZpZyBhbmQgdGhlcmUgd2FzIGFuIGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdGaWxlKGZpbGVwYXRoPzogc3RyaW5nLCBzaG91bGRFeGl0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgY29uc3QgZnAgPSBwYXRoLnJlc29sdmUoZmlsZXBhdGggfHwgZGVmYXVsdENvbmZpZ0ZpbGVwYXRoKVxuXG4gIHRyeSB7XG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbZnBdXG4gICAgcmV0dXJuIHJlcXVpcmUoZnApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKGZwKVxuXG4gICAgLy8gY29uZmlnIGZpbGUgZXhpc3RzLCBzaG91bGQgbG9nIGVycm9yLCBvdGhlcndpc2UgaWdub3JlIG1pc3NpbmcgZmlsZVxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICAgIH0pXG5cbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiB3YXRjaCBtb2RlLCBleGl0IGJ1aWxkXG4gICAgICBpZiAoc2hvdWxkRXhpdCkgcHJvY2Vzcy5leGl0KDEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShlbnY6IHN0cmluZywgY2xpOiBQcmVzdGFDTElCdWlsZE9wdGlvbnMgfCBQcmVzdGFDTElEZXZPcHRpb25zLCBmaWxlOiBQYXJ0aWFsPE9wdGlvbnM+KTogQ29uZmlnIHtcbiAgY29uc3QgY29uZmlnID0ge1xuICAgIGVudixcbiAgICBvdXRwdXQ6ICdidWlsZCcsXG4gICAgYXNzZXRzOiAncHVibGljJyxcbiAgICBwbHVnaW5zOiBbXSxcbiAgICBwb3J0OiA0MDAwLFxuICAgIGZpbGVzOiBbXSwgLy8gVE9ETyB3aGVyZSBkbyB3ZSB2YWxpZGF0ZVxuICAgIC4uLmZpbGUsXG4gIH1cblxuICAvLyBvdmVycmlkZSB3aXRoIENMSVxuICBpZiAoY2xpLl8ubGVuZ3RoKSBjb25maWcuZmlsZXMgPSBjbGkuX1xuICBpZiAoY2xpLm91dHB1dCkgY29uZmlnLm91dHB1dCA9IGNsaS5vdXRwdXRcbiAgaWYgKGNsaS5hc3NldHMpIGNvbmZpZy5vdXRwdXQgPSBjbGkuYXNzZXRzXG4gIGlmIChjbGkucG9ydCkgY29uZmlnLnBvcnQgPSBjbGkucG9ydFxuXG4gIC8vIHJlc29sdmUgYWJzb2x1dGUgcGF0aHNcbiAgaWYgKGNvbmZpZy5maWxlcykgY29uZmlnLmZpbGVzID0gKFtdIGFzIHN0cmluZ1tdKS5jb25jYXQoY29uZmlnLmZpbGVzKS5tYXAoKHApID0+IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBwKSlcbiAgaWYgKGNvbmZpZy5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dClcbiAgaWYgKGNvbmZpZy5hc3NldHMpIGNvbmZpZy5hc3NldHMgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLmFzc2V0cylcblxuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBzdGF0aWNPdXRwdXREaXI6IHBhdGguam9pbihjb25maWcub3V0cHV0LCAnc3RhdGljJyksXG4gICAgZnVuY3Rpb25zT3V0cHV0RGlyOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ2Z1bmN0aW9ucycpLFxuICAgIGZ1bmN0aW9uc01hbmlmZXN0OiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ3JvdXRlcy5qc29uJyksXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgY3JlYXRlIH0gZnJvbSAnd2F0Y2gtZGVwZW5kZW5jeS1ncmFwaCdcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcidcbmltcG9ydCBtYXRjaCBmcm9tICdwaWNvbWF0Y2gnXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcC1leHRlbmQnXG5cbmltcG9ydCB7IG91dHB1dExhbWJkYXMgfSBmcm9tICcuL291dHB1dExhbWJkYXMnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBnZXRGaWxlcywgaXNTdGF0aWMsIGlzRHluYW1pYyB9IGZyb20gJy4vZ2V0RmlsZXMnXG5pbXBvcnQgeyBidWlsZFN0YXRpY0ZpbGVzLCByZW1vdmVCdWlsdFN0YXRpY0ZpbGUsIFN0YXRpY0ZpbGVzTWFwIH0gZnJvbSAnLi9yZW5kZXJTdGF0aWNFbnRyaWVzJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcblxuLypcbiAqIFdyYXBzIG91dHB1dExhbWJkYXMgZm9yIGxvZ2dpbmdcbiAqL1xuZnVuY3Rpb24gdXBkYXRlTGFtYmRhcyhpbnB1dHM6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gIC8vIGFsd2F5cyB3cml0ZSB0aGlzLCBldmVuIGlmIGlucHV0cyA9IFtdXG4gIG91dHB1dExhbWJkYXMoaW5wdXRzLCBjb25maWcpXG5cbiAgLy8gaWYgdXNlciBhY3R1YWxseSBoYXMgcm91dGVzIGNvbmZpZ3VyZWQsIGdpdmUgZmVlZGJhY2tcbiAgaWYgKGlucHV0cy5sZW5ndGgpIHtcbiAgICBsb2dnZXIuaW5mbyh7XG4gICAgICBsYWJlbDogJ2J1aWx0JyxcbiAgICAgIG1lc3NhZ2U6IGBsYW1iZGFzYCxcbiAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXdWYWxpZEZpbGUoZmlsZTogc3RyaW5nLCBnbG9iczogc3RyaW5nW10sIGV4aXN0aW5nOiBzdHJpbmdbXSkge1xuICByZXR1cm4gbWF0Y2goZ2xvYnMpKGZpbGUpICYmICFleGlzdGluZy5pbmNsdWRlcyhmaWxlKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2F0Y2goY29uZmlnOiBDb25maWcsIGhvb2tzOiBIb29rcykge1xuICBsZXQgc3RhdGljRmlsZXNNYXA6IFN0YXRpY0ZpbGVzTWFwID0ge31cbiAgY29uc3QgZmlsZXMgPSBnZXRGaWxlcyhjb25maWcuZmlsZXMpXG5cbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIud2Fybih7XG4gICAgICBsYWJlbDogJ3BhdGhzJyxcbiAgICAgIG1lc3NhZ2U6ICdubyBmaWxlcyBjb25maWd1cmVkJyxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYnVpbGRGaWxlKGZpbGU6IHN0cmluZywgZXhpc3Rpbmc6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW2ZpbGVdXG5cbiAgICAvLyByZW5kZXIganVzdCBmaWxlIHRoYXQgY2hhbmdlZFxuICAgIGlmIChpc1N0YXRpYyhmaWxlKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRTdGF0aWNGaWxlcyhbZmlsZV0sIGNvbmZpZywgc3RhdGljRmlsZXNNYXApXG4gICAgICBzdGF0aWNGaWxlc01hcCA9IG1lcmdlKHt9LCBzdGF0aWNGaWxlc01hcCwgcmVzdWx0LnN0YXRpY0ZpbGVzTWFwKVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBkeW5hbWljIGVudHJ5IHdpdGggQUxMIGR5bmFtaWMgZmlsZXNcbiAgICB1cGRhdGVMYW1iZGFzKGV4aXN0aW5nLmZpbHRlcihpc0R5bmFtaWMpLCBjb25maWcpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBidWlsZEZpbGVzKGZpbGVzOiBzdHJpbmdbXSwgZXhpc3Rpbmc6IHN0cmluZ1tdLCBjb25maWc6IENvbmZpZykge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgYXdhaXQgYnVpbGRGaWxlKGZpbGUsIGV4aXN0aW5nLCBjb25maWcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydGFudDogaWYgd2UgZXZlciByZW1vdmUgaW5pdGlhbCByZW5kZXJpbmcsIHdlIHdpbGwgbmVlZCB0b1xuICAgKiByZS1pbnRyb2R1Y2UgXCJmaWxlIHByaW1pbmdcIiB3aGVyZSB3ZSByZXF1aXJlIGFsbCBmaWxlcyBhbmQgc3VyZmFjZSBlcnJvcnNcbiAgICogb24gc3RhcnR1cC5cbiAgICovXG4gIGF3YWl0IGJ1aWxkRmlsZXMoZmlsZXMsIGZpbGVzLCBjb25maWcpXG4gIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG5cbiAgLypcbiAgICogRmlsZXdhdGNoZXIgd2F0Y2hlcyBvbmx5IHByZXN0YSBmaWxlcy4gSXQgaGFuZGxlcyBjaGFuZ2UgYW5kIHJlbW92ZVxuICAgKiBldmVudHMsIGFzIHdlbGwgYXMgc3VyZmFjZXMgZGVwZW5kZW5jeSB0cmVlIHRyYXZlcnNhbCBlcnJvcnNcbiAgICovXG4gIGNvbnN0IGZpbGVXYXRjaGVyID0gY3JlYXRlKHsgYWxpYXM6IHsgJ0AnOiBwcm9jZXNzLmN3ZCgpIH0gfSlcblxuICBmaWxlV2F0Y2hlci5vbkNoYW5nZShhc3luYyAoY2hhbmdlZCkgPT4ge1xuICAgIGF3YWl0IGJ1aWxkRmlsZXMoY2hhbmdlZCwgZmlsZXMsIGNvbmZpZylcbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIGZpbGVXYXRjaGVyLm9uUmVtb3ZlKGFzeW5jIChbaWRdKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKHsgbGFiZWw6ICd3YXRjaCcsIG1lc3NhZ2U6IGByZW1vdmVkICR7aWR9YCB9KVxuXG4gICAgLy8gcmVtb3ZlIGZyb20gbG9jYWwgaGFzaFxuICAgIGZpbGVzLnNwbGljZShmaWxlcy5pbmRleE9mKGlkKSwgMSlcblxuICAgIC8vIHVwZGF0ZSB0aGlzIHJlZ2FyZGxlc3MsIG5vdCBzdXJlIGlmIFtpZF0gd2FzIGR5bmFtaWMgb3Igc3RhdGljXG4gICAgdXBkYXRlTGFtYmRhcyhmaWxlcy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuICAgIDsoc3RhdGljRmlsZXNNYXBbaWRdIHx8IFtdKS5mb3JFYWNoKChmaWxlKSA9PiByZW1vdmVCdWlsdFN0YXRpY0ZpbGUocGF0aC5qb2luKGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsIGZpbGUpKSlcblxuICAgIGhvb2tzLmVtaXRCcm93c2VyUmVmcmVzaCgpXG4gIH0pXG5cbiAgZmlsZVdhdGNoZXIub25FcnJvcigoZSkgPT4ge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgIGVycm9yOiB0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlLFxuICAgIH0pXG4gIH0pXG5cbiAgYXdhaXQgZmlsZVdhdGNoZXIuYWRkKGZpbGVzKVxuXG4gIC8qXG4gICAqIGdsb2JhbFdhdGNoZXIgd2F0Y2hlcyB0aGUgcmF3IGZpbGUgZ2xvYnMgcGFzc2VkIHRvIHRoZSBDTEkgb3IgYXMgYGZpbGVzYFxuICAgKiBpbiB0aGUgY29uZmlnLiBJZiBjaGVja3Mgb24gYWRkL2NoYW5nZSB0byBzZWUgaWYgYSBmaWxlIHNob3VsZCBiZSB1cGdyYWRlZFxuICAgKiB0byBhIGEgUHJlc3RhIHNvdXJjZSBmaWxlLCBhbmQgYWRkZWQgdG8gdGhlIGZpbGVXYXRjaGVyLlxuICAgKi9cbiAgY29uc3QgZ2xvYmFsV2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHByb2Nlc3MuY3dkKCksIHtcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIGlnbm9yZWQ6IFtjb25maWcub3V0cHV0LCBjb25maWcuYXNzZXRzXSxcbiAgfSlcblxuICBnbG9iYWxXYXRjaGVyLm9uKCdhZGQnLCBhc3luYyAoZmlsZSkgPT4ge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlKSB8fCBmcy5sc3RhdFN5bmMoZmlsZSkuaXNEaXJlY3RvcnkoKSkgcmV0dXJuXG4gICAgaWYgKCFpc05ld1ZhbGlkRmlsZShmaWxlLCBjb25maWcuZmlsZXMsIGZpbGVzKSkgcmV0dXJuXG5cbiAgICBsb2dnZXIuZGVidWcoeyBsYWJlbDogJ3dhdGNoJywgbWVzc2FnZTogYGFkZCAke2ZpbGV9YCB9KVxuXG4gICAgZmlsZXMucHVzaChmaWxlKVxuICAgIGF3YWl0IGZpbGVXYXRjaGVyLmFkZChmaWxlKVxuXG4gICAgYXdhaXQgYnVpbGRGaWxlKGZpbGUsIGZpbGVzLCBjb25maWcpXG5cbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIGZvciBldmVudHMgZnJvbSBwbHVnaW5zIHJlcXVlc3RpbmcgYSBmaWxlIHRvIGJlIGJ1aWx0XG4gICAqL1xuICBob29rcy5vbkJ1aWxkRmlsZShhc3luYyAoeyBmaWxlIH0pID0+IHtcbiAgICBhd2FpdCBidWlsZEZpbGUoZmlsZSwgZmlsZXMsIGNvbmZpZylcbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICBhd2FpdCBmaWxlV2F0Y2hlci5jbG9zZSgpXG4gICAgICBhd2FpdCBnbG9iYWxXYXRjaGVyLmNsb3NlKClcbiAgICB9LFxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCByc29ydCBmcm9tICdyb3V0ZS1zb3J0J1xuXG5pbXBvcnQgeyBoYXNoQ29udGVudCB9IGZyb20gJy4vaGFzaENvbnRlbnQnXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5mdW5jdGlvbiBzbHVnaWZ5KGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZpbGVuYW1lXG4gICAgLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpIC8vIC9wYWdlcy9GaWxlLnBhZ2UuanNcbiAgICAuc3BsaXQoJy4nKSAvLyBbL3BhZ2VzL0ZpbGUsIHBhZ2UsIGpzXVxuICAgIC5yZXZlcnNlKClcbiAgICAuc2xpY2UoMSlcbiAgICAucmV2ZXJzZSgpXG4gICAgLmpvaW4oJy0nKSAvLyAvcGFnZXMvRmlsZS5wYWdlXG4gICAgLnNwbGl0KCcvJylcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oJy0nKSAvLyBwYWdlcy1GaWxlLXBhZ2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dExhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgbGFtYmRhcyA9IGlucHV0c1xuICAgIC5tYXAoKGlucHV0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHJvdXRlIH0gPSByZXF1aXJlKGlucHV0KVxuICAgICAgICBjb25zdCBuYW1lID0gc2x1Z2lmeShpbnB1dClcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gcGF0aC5qb2luKFxuICAgICAgICAgIGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICAgICAgY29uZmlnLmVudiA9PT0gRW52LlBST0RVQ1RJT05cbiAgICAgICAgICAgID8gbmFtZSArICctJyArIGhhc2hDb250ZW50KGZzLnJlYWRGaWxlU3luYyhpbnB1dCwgJ3V0ZjgnKSkgKyAnLmpzJ1xuICAgICAgICAgICAgOiBuYW1lICsgJy5qcydcbiAgICAgICAgKVxuXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRpbmcgJHtuYW1lfSBsYW1iZGFgLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIGltcG9ydGFudCBmb3Igd2F0Y2ggdGFza1xuICAgICAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtpbnB1dF1cbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbb3V0cHV0XVxuXG4gICAgICAgIGZzLm91dHB1dEZpbGVTeW5jKFxuICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICBgaW1wb3J0IHsgd3JhcEhhbmRsZXIgfSBmcm9tICdwcmVzdGEvZGlzdC93cmFwSGFuZGxlcic7XG4gICAgICBpbXBvcnQgKiBhcyBmaWxlIGZyb20gJyR7aW5wdXR9JztcbiAgICAgIGV4cG9ydCBjb25zdCByb3V0ZSA9IGZpbGUucm91dGVcbiAgICAgIGV4cG9ydCBjb25zdCBoYW5kbGVyID0gd3JhcEhhbmRsZXIoZmlsZSlgXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gW3JvdXRlLCBvdXRwdXRdXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ11bXVxuXG4gIGNvbnN0IHNvcnRlZCA9IHJzb3J0KGxhbWJkYXMubWFwKChsKSA9PiBsWzBdKSlcbiAgY29uc3QgbWFuaWZlc3Q6IHsgW3JvdXRlOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9XG5cbiAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWQpIHtcbiAgICBjb25zdCBtYXRjaCA9IGxhbWJkYXMuZmluZCgobCkgPT4gbFswXSA9PT0gcm91dGUpXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG1hbmlmZXN0W3JvdXRlXSA9IG1hdGNoWzFdXG4gICAgfVxuICB9XG5cbiAgZnMub3V0cHV0RmlsZVN5bmMoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0LCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCkpXG5cbiAgcmV0dXJuIGxhbWJkYXNcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaGFzaENvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XG4gIHZhciBoID0gNTM4MSxcbiAgICBpID0gY29udGVudC5sZW5ndGhcblxuICB3aGlsZSAoaSkgaCA9IChoICogMzMpIF4gY29udGVudC5jaGFyQ29kZUF0KC0taSlcblxuICByZXR1cm4gKGggPj4+IDApLnRvU3RyaW5nKDM2KVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZ2xvYlN5bmMgZnJvbSAndGlueS1nbG9iL3N5bmMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc3JvdXRlXFxzK1xcPS8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRpYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc2dldFN0YXRpY1BhdGhzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc3RhRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGlzU3RhdGljKGZpbGUpIHx8IGlzRHluYW1pYyhmaWxlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZXMoZmlsZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pXG4gICAgICAuY29uY2F0KGZpbGVzKVxuICAgICAgLm1hcCgoZmlsZSkgPT4gZ2xvYlN5bmMoZmlsZSkpXG4gICAgICAuZmxhdCgpXG4gICAgICAubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZSkpIC8vIG1ha2UgYWJzb2x1dGVcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICBsYWJlbDogJ3BhdGhzJyxcbiAgICAgIG1lc3NhZ2U6IGBubyBmaWxlcyBmb3VuZGAsXG4gICAgICBlcnJvcjogZSBhcyBFcnJvcixcbiAgICB9KVxuXG4gICAgcmV0dXJuIFtdXG4gIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICcuL3RpbWVyJ1xuaW1wb3J0IHsgZ2V0Um91dGVQYXJhbXMgfSBmcm9tICcuL2dldFJvdXRlUGFyYW1zJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCB9IGZyb20gJy4vbGl2ZVJlbG9hZFNjcmlwdCdcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCB0eXBlIFN0YXRpY0ZpbGVzTWFwID0geyBbZmlsZW5hbWU6IHN0cmluZ106IHN0cmluZ1tdIH1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhuYW1lVG9GaWxlKHBhdGhuYW1lOiBzdHJpbmcsIGV4dCA9ICdodG1sJykge1xuICByZXR1cm4gISFwYXRoLmV4dG5hbWUocGF0aG5hbWUpXG4gICAgPyBwYXRobmFtZSAvLyBpZiBwYXRoIGhhcyBleHRlbnNpb24sIHVzZSBpdFxuICAgIDogZXh0ID09PSAnaHRtbCdcbiAgICA/IGAke3BhdGhuYW1lfS9pbmRleC5odG1sYCAvLyBpZiBIVE1MIGlzIGluZmVycmVkLCBjcmVhdGUgaW5kZXhcbiAgICA6IGAke3BhdGhuYW1lfS4ke2V4dH1gIC8vIGFueXRoaW5nIGJ1dCBIVE1MIHdpbGwgbmVlZCBhbiBleHRlbnNpb24sIG90aGVyd2lzZSBicm93c2VycyB3aWxsIHJlbmRlciBhcyB0ZXh0XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVCdWlsdFN0YXRpY0ZpbGUoZmlsZTogc3RyaW5nKSB7XG4gIGxvZ2dlci5kZWJ1Zyh7XG4gICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgbWVzc2FnZTogYHJlbW92aW5nIG9sZCBzdGF0aWMgZmlsZSAke2ZpbGV9YCxcbiAgfSlcblxuICByZXR1cm4gZnMucmVtb3ZlKGZpbGUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVCdWlsdEZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoZmlsZXMubWFwKHJlbW92ZUJ1aWx0U3RhdGljRmlsZSkpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFN0YXRpY0ZpbGUoZmlsZTogc3RyaW5nLCBvdXRwdXQ6IHN0cmluZywgeyBmb290ZXIgfTogeyBmb290ZXI6IHN0cmluZyB9KSB7XG4gIGNvbnN0IGxhbWJkYSA9IHJlcXVpcmUoZmlsZSlcbiAgY29uc3QgcGF0aHMgPSBhd2FpdCBsYW1iZGEuZ2V0U3RhdGljUGF0aHMoKVxuXG4gIGNvbnN0IGJ1aWx0RmlsZXM6IHN0cmluZ1tdID0gW11cblxuICBpZiAoIXBhdGhzIHx8ICFwYXRocy5sZW5ndGgpIHJldHVybiBidWlsdEZpbGVzXG5cbiAgZm9yIChjb25zdCB1cmwgb2YgcGF0aHMpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBwYXRoOiB1cmwsXG4gICAgICBwYXRoUGFyYW1ldGVyczogbGFtYmRhLnJvdXRlID8gZ2V0Um91dGVQYXJhbXModXJsLCBsYW1iZGEucm91dGUpIDoge30sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBub3JtYWxpemVSZXNwb25zZShhd2FpdCBsYW1iZGEuaGFuZGxlcihldmVudCwge30pKVxuICAgIGNvbnN0IHR5cGUgPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gOiAnJ1xuICAgIGNvbnN0IGV4dCA9IHR5cGUgPyBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnIDogJ2h0bWwnXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRobmFtZVRvRmlsZSh1cmwsIGV4dClcbiAgICBjb25zdCBodG1sID0gcmVzcG9uc2UuYm9keSArIGZvb3RlclxuXG4gICAgZnMub3V0cHV0RmlsZVN5bmMocGF0aC5qb2luKG91dHB1dCwgZmlsZW5hbWUpLCBodG1sLCAndXRmLTgnKVxuXG4gICAgbG9nZ2VyLmluZm8oe1xuICAgICAgbGFiZW