pup-recorder 0.3.10 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +0,0 @@
1
- import'source-map-support/register.js';import {createRequire}from'module';import {dirname,join}from'path';import {Log}from'node-av';import {AV_LOG_ERROR,AV_LOG_WARNING}from'node-av/constants';import {spawn}from'child_process';import Oe from'tree-kill';import m from'zod';import Fe from'electron';import {platform}from'os';import {HardwareContext}from'node-av/api';import {EventEmitter}from'events';var fe=Object.create;var G=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var A=(o,e)=>(e=Symbol[o])?e:Symbol.for("Symbol."+o),P=o=>{throw TypeError(o)};var J=(o,e,r)=>e in o?G(o,e,{enumerable:true,configurable:true,writable:true,value:r}):o[e]=r;var q=o=>[,,,fe(null)],Y=["class","method","getter","setter","accessor","field","value","get","set"],O=o=>o!==void 0&&typeof o!="function"?P("Function expected"):o,be=(o,e,r,t,n)=>({kind:Y[o],name:e,metadata:t,addInitializer:s=>r._?P("Already initialized"):n.push(O(s||null))}),N=(o,e)=>J(e,A("metadata"),o[3]),Q=(o,e,r,t)=>{for(var n=0,s=o[e>>1],a=s&&s.length;n<a;n++)s[n].call(r);return t},R=(o,e,r,t,n,s)=>{var i,p,d,f,l=e&7,C=false,u=false,x=2,E=Y[l+5],me=o[x]||(o[x]=[]),h=((n=n.prototype),he(n,r));for(var _=t.length-1;_>=0;_--)d=be(l,r,p={},o[3],me),(d.static=C,d.private=u,f=d.access={has:g=>r in g},(f.get=g=>g[r]),l>2),i=(0, t[_])(h[E],d),p._=1,O(i)&&(h[E]=i);return h&&G(n,r,h),n},X=(o,e,r)=>J(o,e+"",r);var je=(o,e,r)=>{if(e!=null){typeof e!="object"&&typeof e!="function"&&P("Object expected");var t,n;r&&(t=e[A("asyncDispose")]),t===void 0&&(t=e[A("dispose")],r&&(n=t)),typeof t!="function"&&P("Object not disposable"),n&&(t=function(){try{n.call(this);}catch(s){return Promise.reject(s)}}),o.push([r,t,e]);}else r&&o.push([r]);return e},Ve=(o,e,r)=>{var t=typeof SuppressedError=="function"?SuppressedError:function(a,i,p,d){return d=Error(p),d.name="SuppressedError",d.error=a,d.suppressed=i,d},n=a=>e=r?new t(a,e,"An error was suppressed during disposal"):(r=true,a),s=a=>{for(;a=o.pop();)try{var i=a[1]&&a[1].call(a[2]);if(a[0])return Promise.resolve(i).then(s,p=>(n(p),s()))}catch(p){n(p);}if(r)throw e};return s()};function Z(o,e,r){try{return e(process.env[o])}catch{return r}}function ee(o){if(typeof o=="number")return o;let e=Number(o);if(Number.isNaN(e))throw new Error(`Value ${o} is not a valid number`);return e}function ze(o){return typeof o=="string"?o:String(o)}var Pe=createRequire(import.meta.url),I=Z("PUP_LOG_LEVEL",ee,2),oe=dirname(Pe.resolve("pup-recorder/package.json")),te=join(oe,"dist","app.cjs"),er=join(oe,"dist","audio_preload.cjs");var M="<pup@debug>",$="<pup@info>",U="<pup@warn>",H="<pup@error>",j="<pup@fatal>";function T(o,e){return function(...r){let t=r.map(n=>n instanceof Error?n.stack??String(n):n);return o.call(this,...t)}}var ne,se,ie,ae,le,k;le=[T],ae=[T],ie=[T],se=[T],ne=[T];var v=class{constructor(e=I){this._level=e;Q(k,5,this);X(this,"_impl");this.impl=console;}_level;get level(){return this._level}set level(e){this._level=e,this.impl=this._impl??console;}get impl(){return this._impl}set impl(e){let r=e.debug??console.debug,t=e.info??console.info,n=e.warn??console.warn,s=e.error??console.error,a=this._level;this._impl={debug:a>=3?r:void 0,info:a>=2?t:void 0,warn:a>=1?n:void 0,error:a>=0?s:void 0};}debug(...e){this.impl?.debug?.(M,...e);}info(...e){this.impl?.info?.($,...e);}warn(...e){this.impl?.warn?.(U,...e);}error(...e){this.impl?.error?.(H,...e);}fatal(...e){this.impl?.error?.(j,...e),process.exit(1);}dispatch(e){let r=e.trimEnd();r.startsWith(M)?this.debug(r.slice(M.length+1)):r.startsWith($)?this.info(r.slice($.length+1)):r.startsWith(U)?this.warn(r.slice(U.length+1)):r.startsWith(H)?this.error(r.slice(H.length+1)):this.info(r);}attach(e,r){return new Promise((t,n)=>{this.debug(`${r}.attach`);let s="",a=i=>{let p=i.toString();p.startsWith(j)?s+=p.slice(j.length+1):this.dispatch(p);};e.stderr?.on("data",a),e.stdout?.on("data",a),e.on("error",i=>{s+=i.message,e.kill();}).once("close",(i,p)=>{i||p||s?(s||=`command failed: ${e.spawnargs.join(" ")}`,this.debug(`${r}.close`,{code:i,signal:p,fatal:s}),n(new Error(s))):(this.debug(`${r}.close`),t());}).on("unhandledRejection",i=>{this.error(`${r}.unhandled`,i);}).on("uncaughtExceptionMonitor",i=>{this.error(`${r}.unhandled`,i);});})}};k=q(),R(k,1,"debug",le,v),R(k,1,"info",ae,v),R(k,1,"warn",ie,v),R(k,1,"error",se,v),R(k,1,"fatal",ne,v),N(k,v);var c=new v;Log.setCallback((o,e)=>{let r=e.trimEnd();r&&(o<=AV_LOG_ERROR?c.error(r):o<=AV_LOG_WARNING&&c.warn(r));});function pr(o,e){return (...r)=>{try{let t=o(...r);return t instanceof Promise?t.catch(()=>e):t}catch{return e}}}var V="--pup-priv-args";function fr(){let o=process.argv,e=o.find(t=>t.startsWith(V));if(!e)return c.debug("procargv",o),process.argv;let r=["exec",...o.slice(-1)];return e=Buffer.from(e.split("=")[1],"base64").toString(),r.push(...JSON.parse(e)),c.debug("pupargs",r),r}function pe(o,e){let r=o.split(" ").filter(i=>i.length),[t,...n]=r;if(!t)throw new Error("empty command");let s=spawn(t,n,{stdio:"inherit",...e}),a=false;return {process:s,wait:c.attach(s,t),get killed(){return a},kill(){if(a)return;a=true;let i=s.pid;i?Oe(i,"SIGKILL"):s.kill("SIGKILL");}}}var Te=1920,Ae=1080,Ie=30,Le=5,Se="out/html.mp4,out/html.webm",yr=m.object({duration:m.number().describe("Duration in seconds"),width:m.number().describe("Video width"),height:m.number().describe("Video height"),fps:m.number().describe("Frames per second"),withAudio:m.boolean().describe("Capture and encode audio"),outFile:m.string().describe("Comma-separated output paths; extension (.mp4/.webm) selects encoder"),useInnerProxy:m.boolean().describe("Use bilibili inner proxy for resource access"),deterministic:m.boolean().describe("Render by frame rather than recording"),disableGpu:m.boolean().describe("Disable GPU rendering, may reduce performance but increase stability"),disableHwCodec:m.boolean().describe("Disable hardware video encoder (NVENC/VideoToolbox), use software x265"),windowTolerant:m.boolean().describe("Fall back to dom-ready if warmup load times out")}),ce={width:Te,height:Ae,fps:Ie,duration:Le,outFile:Se,withAudio:false,useInnerProxy:false,deterministic:false,disableGpu:false,disableHwCodec:false,windowTolerant:false};var De="[HWAccel]";async function Ge(){let o=HardwareContext.auto(),e=o!==null;return o?.dispose(),e}var de=Ge().then(o=>(c.debug(De,"gpu:",o),o));async function ue(o){let e=["no-sandbox","disable-dev-shm-usage","disable-web-security","disable-site-isolation-trials","ignore-certificate-errors","disable-blink-features=AutomationControlled","mute-audio","autoplay-policy=no-user-gesture-required","disable-extensions","force-device-scale-factor=1","force-color-profile=srgb","ignore-gpu-blocklist","use-gl=angle","deterministic-mode","enable-begin-frame-control","disable-new-content-rendering-timeout","run-all-compositor-stages-before-draw","disable-threaded-animation","disable-threaded-scrolling","disable-checker-imaging","disable-image-animation-resync","enable-surface-synchronization","font-render-hinting=none","disable-background-networking","js-flags=--max-old-space-size=512","renderer-process-limit=1","num-raster-threads=2","disable-background-timer-throttling","disable-renderer-backgrounding","disable-backgrounding-occluded-windows","enable-logging=stderr"];I>=3?e.push("log-level=0","v=1"):e.push("log-level=3");let r=["FontationBackend"];if(!(await de&&!o))e.push("use-angle=swiftshader","enable-unsafe-swiftshader");else {e.push("disable-gpu-sandbox","enable-unsafe-webgpu");let n=platform();n==="darwin"?e.push("use-angle=metal"):n==="win32"?e.push("use-angle=d3d11"):(e.push("use-angle=vulkan","disable-vulkan-surface"),r.push("Vulkan"));}return e.push(`enable-features=${r.join(",")}`),e}async function Me(o){return [...await ue(o),"headless=new"]}var $e="[Electron]";async function ge({args:o}){let r=(await Me(o.includes("--disable-gpu"))).map(s=>`--${s}`);r.push(`${V}=${Buffer.from(JSON.stringify(o)).toString("base64")}`);let t=[Fe,...r,te].join(" ");c.debug($e,t);let n={...process.env,RUST_BACKTRACE:"full"};return pe(t,{stdio:["ignore","pipe","pipe","ipc"],env:n})}var L=class extends EventEmitter{constructor(e){super(),e.on("message",r=>{let t=r;switch(t.type){case "console":{this.emit("console",t.level,t.message);break}case "progress":{this.emit("progress",t.value);break}case "done":{this.emit("done",t.payload);break}case "error":{this.emit("error",new Error(t.error));break}}}),e.once("exit",r=>this.emit("close",r));}};var S="[pup]";async function He(o,e){c.debug(S,"runPupApp",o,e);let r=[o,"--width",`${e.width}`,"--height",`${e.height}`,"--fps",`${e.fps}`,"--duration",`${e.duration}`,"--out-file",`${e.outFile}`];return e.withAudio&&r.push("--with-audio"),e.useInnerProxy&&r.push("--use-inner-proxy"),e.deterministic&&r.push("--deterministic"),e.disableGpu&&r.push("--disable-gpu"),e.disableHwCodec&&r.push("--disable-hw-codec"),e.windowTolerant&&r.push("--window-tolerant"),ge({args:r})}var y=ce;async function Kr(o,e){c.debug(S,"pup",o,e);let{signal:r}=e;r?.throwIfAborted();let t=e.outFile??y.outFile,n={width:e.width??y.width,height:e.height??y.height,fps:e.fps??y.fps,duration:e.duration??y.duration,withAudio:e.withAudio??y.withAudio,useInnerProxy:e.useInnerProxy??y.useInnerProxy,deterministic:e.deterministic??y.deterministic,disableGpu:e.disableGpu??y.disableGpu,disableHwCodec:e.disableHwCodec??y.disableHwCodec,windowTolerant:e.windowTolerant??y.windowTolerant,outFile:t},s=performance.now(),a=0,i=f=>{c.info(S,`${o} progress: ${f}%`),a=f,e.onProgress?.(f);},p=await He(o,n),d=()=>{p.process.send?.({type:"cancel",reason:String(r?.reason??"abort")}),setTimeout(()=>p.kill(),5e3);};r?.addEventListener("abort",d,{once:true});try{let f=new Promise((C,u)=>{new L(p.process).on("close",x=>{let E=JSON.stringify({source:o,progress:a,code:x,killed:p.killed});u(new Error(`crashed: ${E}`));}).on("progress",i).on("console",(x,E)=>e.onConsole?.(x,E)).on("done",C).on("error",u);});i(0);let[l]=await Promise.all([f,p.wait]);return i(100),c.info(S,`done ${t} in ${Math.round(performance.now()-s)}ms`),{...l,options:n}}catch(f){throw p.kill(),r?.throwIfAborted(),f}finally{r?.removeEventListener("abort",d);}}export{je as a,Ve as b,Z as c,ee as d,ze as e,I as f,oe as g,te as h,er as i,v as j,c as k,pr as l,V as m,fr as n,pe as o,Te as p,Ae as q,Ie as r,Le as s,Se as t,yr as u,ce as v,Kr as w};//# sourceMappingURL=chunk-7LUJTKTE.js.map
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2Vudi50cyIsIi4uL3NyYy9iYXNlL3BhcnNlci50cyIsIi4uL3NyYy9iYXNlL2NvbnN0YW50cy50cyIsIi4uL3NyYy9iYXNlL2xvZ2dpbmcudHMiLCIuLi9zcmMvYmFzZS9ub2Vyci50cyIsIi4uL3NyYy9iYXNlL3Byb2Nlc3MudHMiLCIuLi9zcmMvcmVuZGVyZXIvc2NoZW1hLnRzIiwiLi4vc3JjL2Jhc2UvaHdhY2NlbC50cyIsIi4uL3NyYy9iYXNlL2Nocm9taXVtLnRzIiwiLi4vc3JjL3JlbmRlcmVyL2VsZWN0cm9uLnRzIiwiLi4vc3JjL3JlbmRlcmVyL2lwYy50cyIsIi4uL3NyYy9wdXAudHMiXSwibmFtZXMiOlsicGVudiIsIm5hbWUiLCJwYXJzZXIiLCJkZWZhdWx0VmFsdWUiLCJwYXJzZU51bWJlciIsIngiLCJudW0iLCJwYXJzZVN0cmluZyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwicHVwTG9nTGV2ZWwiLCJwdXBQa2dSb290IiwiZGlybmFtZSIsInB1cEFwcCIsImpvaW4iLCJwdXBBdWRpb1ByZWxvYWQiLCJERUJVRyIsIklORk8iLCJXQVJOIiwiRVJST1IiLCJGQVRBTCIsInN0YWNrSG9vayIsInRhcmdldCIsIl9jb250ZXh0IiwibWVzc2FnZXMiLCJwcm9jZXNzZWQiLCJtc2ciLCJfZmF0YWxfZGVjIiwiX2Vycm9yX2RlYyIsIl93YXJuX2RlYyIsIl9pbmZvX2RlYyIsIl9kZWJ1Z19kZWMiLCJfaW5pdCIsIkxvZ2dlciIsIl9sZXZlbCIsIl9fcnVuSW5pdGlhbGl6ZXJzIiwiX19wdWJsaWNGaWVsZCIsInZhbHVlIiwiZGVidWciLCJpbmZvIiwid2FybiIsImVycm9yIiwibHYiLCJtZXNzYWdlIiwicHJvYyIsInJlc29sdmUiLCJyZWplY3QiLCJmYXRhbCIsImRpc3BhdGNoIiwiZGF0YSIsImVyciIsImNvZGUiLCJzaWduYWwiLCJyZWFzb24iLCJfX2RlY29yYXRvclN0YXJ0IiwiX19kZWNvcmF0ZUVsZW1lbnQiLCJfX2RlY29yYXRvck1ldGFkYXRhIiwibG9nZ2VyIiwiTG9nIiwibGV2ZWwiLCJBVl9MT0dfRVJST1IiLCJBVl9MT0dfV0FSTklORyIsIm5vZXJyIiwiZm4iLCJhcmdzIiwicmV0IiwiUFVQX0FSR1NfS0VZIiwicGFyZ3MiLCJhcmd2IiwicHJpdiIsImFyZyIsImV4ZWMiLCJjbWQiLCJvcHRpb25zIiwicGFydHMiLCJzIiwiY29tbWFuZCIsInNwYXduIiwia2lsbGVkIiwicGlkIiwidHJlZUtpbGwiLCJERUZBVUxUX1dJRFRIIiwiREVGQVVMVF9IRUlHSFQiLCJERUZBVUxUX0ZQUyIsIkRFRkFVTFRfRFVSQVRJT04iLCJERUZBVUxUX09VVF9GSUxFIiwiUmVuZGVyU2NoZW1hIiwieiIsImRlZmF1bHRSZW5kZXJPcHRpb25zIiwiVEFHIiwiZGV0ZWN0R1BVRHJpdmVyIiwiaHciLCJIYXJkd2FyZUNvbnRleHQiLCJyZXN1bHQiLCJjYW5JVXNlR1BVIiwiY2hyb21pdW1PcHRpb25zIiwiZGlzYWJsZUdwdSIsIm9wdHMiLCJmZWF0dXJlcyIsInBsYXQiLCJwbGF0Zm9ybSIsImVsZWN0cm9uT3B0cyIsInJ1bkVsZWN0cm9uQXBwIiwiZWxlY3Ryb25BcmdzIiwiYSIsImVsZWN0cm9uIiwiZW52IiwiSXBjUmVhZGVyIiwiRXZlbnRFbWl0dGVyIiwiY2hpbGQiLCJyYXciLCJjIiwicnVuUHVwQXBwIiwic291cmNlIiwicmVuZGVyIiwiZCIsInB1cCIsIm91dEZpbGUiLCJyZW5kZXJPcHRzIiwidDAiLCJwcm9ncmVzcyIsInRpY2siLCJwIiwiaGFuZGxlIiwib25BYm9ydCIsImwiLCJtIiwic3VtbWFyeSIsImUiXSwibWFwcGluZ3MiOiI4aUVBTU8sU0FBU0EsQ0FBQUEsQ0FBUUMsRUFBY0MsQ0FBQUEsQ0FBc0JDLENBQUFBLENBQWlDLENBQzNGLEdBQUksQ0FDRixPQUFPRCxDQUFBQSxDQUFPLE9BQUEsQ0FBUSxJQUFJRCxDQUFJLENBQUMsQ0FDakMsQ0FBQSxLQUFRLENBQ04sT0FBT0UsQ0FDVCxDQUNGLEND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ckUsQ0FBQUEsQ0FBTSxNQUFBLENBQVF3RSxFQUFPLE1BQU8sQ0FBQyxFQUM1RTdFLENBQUFBLENBQU8sSUFBSSxNQUFNLENBQUEsU0FBQSxFQUFZcEIsQ0FBRyxFQUFFLENBQUMsRUFDckMsQ0FBQyxDQUFBLENBQ0EsRUFBQSxDQUFHLFdBQVkrRixDQUFJLENBQUEsQ0FDbkIsRUFBQSxDQUFHLFNBQUEsQ0FBVyxDQUFDSSxDQUFBQSxDQUFHQyxJQUFNckQsQ0FBQUEsQ0FBUSxTQUFBLEdBQVlvRCxFQUFHQyxDQUFDLENBQUMsRUFDakQsRUFBQSxDQUFHLE1BQUEsQ0FBUWpGLENBQU8sQ0FBQSxDQUNsQixFQUFBLENBQUcsT0FBQSxDQUFTQyxDQUFNLEVBQ3ZCLENBQUMsRUFDRDJFLENBQUFBLENBQUssQ0FBQyxFQUNOLEdBQU0sQ0FBQ00sQ0FBTyxDQUFBLENBQUksTUFBTSxPQUFBLENBQVEsSUFBSSxDQUFDbEMsQ0FBQUEsQ0FBUThCLEVBQU8sSUFBSSxDQUFDLEVBQ3pELE9BQUFGLENBQUFBLENBQUssR0FBRyxDQUFBLENBQ1JoRSxDQUFBQSxDQUFPLElBQUEsQ0FBS2dDLEVBQUssQ0FBQSxLQUFBLEVBQVE0QixDQUFPLE9BQU8sSUFBQSxDQUFLLEtBQUEsQ0FBTSxZQUFZLEdBQUEsRUFBSSxDQUFJRSxDQUFFLENBQUMsQ0FBQSxFQUFBLENBQUksQ0FBQSxDQUN0RSxDQUFFLEdBQUdRLENBQUFBLENBQVMsUUFBU1QsQ0FBVyxDQUMzQyxPQUFTVSxDQUFBQSxDQUFHLENBQ1YsTUFBQUwsQ0FBQUEsQ0FBTyxJQUFBLEVBQUssQ0FDWnZFLEdBQVEsY0FBQSxFQUFlLENBQ2pCNEUsQ0FDUixDQUFBLE9BQUUsQ0FDQTVFLEdBQVEsbUJBQUEsQ0FBb0IsT0FBQSxDQUFTd0UsQ0FBTyxFQUM5QyxDQUNGIiwiZmlsZSI6ImNodW5rLTdMVUpUS1RFLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNS5cblxuZXhwb3J0IHR5cGUgRW52UGFyc2VyPFQ+ID0gKHZhbHVlOiB1bmtub3duKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHBlbnY8VD4obmFtZTogc3RyaW5nLCBwYXJzZXI6IEVudlBhcnNlcjxUPiwgZGVmYXVsdFZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlcihwcm9jZXNzLmVudltuYW1lXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bWJlcih4OiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgY29uc3QgbnVtID0gTnVtYmVyKHgpO1xuICBpZiAoTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlICR7eH0gaXMgbm90IGEgdmFsaWQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nKHg6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHJldHVybiB4O1xuICByZXR1cm4gU3RyaW5nKHgpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJtb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGVudiB9IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IHsgcGFyc2VOdW1iZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGNvbnN0IHB1cExvZ0xldmVsID0gcGVudihcIlBVUF9MT0dfTEVWRUxcIiwgcGFyc2VOdW1iZXIsIDIpO1xuXG5leHBvcnQgY29uc3QgcHVwUGtnUm9vdCA9IGRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKFwicHVwLXJlY29yZGVyL3BhY2thZ2UuanNvblwiKSk7XG5leHBvcnQgY29uc3QgcHVwQXBwID0gam9pbihwdXBQa2dSb290LCBcImRpc3RcIiwgXCJhcHAuY2pzXCIpO1xuZXhwb3J0IGNvbnN0IHB1cEF1ZGlvUHJlbG9hZCA9IGpvaW4ocHVwUGtnUm9vdCwgXCJkaXN0XCIsIFwiYXVkaW9fcHJlbG9hZC5janNcIik7XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHsgQVZfTE9HX0VSUk9SLCBBVl9MT0dfV0FSTklORyB9IGZyb20gXCJub2RlLWF2L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcHVwTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJMaWtlIHtcbiAgZGVidWc/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIGluZm8/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIHdhcm4/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIGVycm9yPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcbn1cblxuY29uc3QgREVCVUcgPSBcIjxwdXBAZGVidWc+XCI7XG5jb25zdCBJTkZPID0gXCI8cHVwQGluZm8+XCI7XG5jb25zdCBXQVJOID0gXCI8cHVwQHdhcm4+XCI7XG5jb25zdCBFUlJPUiA9IFwiPHB1cEBlcnJvcj5cIjtcbmNvbnN0IEZBVEFMID0gXCI8cHVwQGZhdGFsPlwiO1xuXG5mdW5jdGlvbiBzdGFja0hvb2sodGFyZ2V0OiBGdW5jdGlvbiwgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IExvZ2dlciwgLi4ubWVzc2FnZXM6IHVua25vd25bXSkge1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IG1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICByZXR1cm4gbXNnIGluc3RhbmNlb2YgRXJyb3IgPyAobXNnLnN0YWNrID8/IFN0cmluZyhtc2cpKSA6IG1zZztcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0LmNhbGwodGhpcywgLi4ucHJvY2Vzc2VkKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIExvZ2dlckxpa2Uge1xuICBwcml2YXRlIF9pbXBsPzogTG9nZ2VyTGlrZTtcblxuICBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICBzZXQgbGV2ZWwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2xldmVsID0gdmFsdWU7XG4gICAgdGhpcy5pbXBsID0gdGhpcy5faW1wbCA/PyBjb25zb2xlO1xuICB9XG5cbiAgZ2V0IGltcGwoKTogTG9nZ2VyTGlrZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ltcGw7XG4gIH1cblxuICBzZXQgaW1wbCh2YWx1ZTogTG9nZ2VyTGlrZSkge1xuICAgIGNvbnN0IGRlYnVnID0gdmFsdWUuZGVidWcgPz8gY29uc29sZS5kZWJ1ZztcbiAgICBjb25zdCBpbmZvID0gdmFsdWUuaW5mbyA/PyBjb25zb2xlLmluZm87XG4gICAgY29uc3Qgd2FybiA9IHZhbHVlLndhcm4gPz8gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IGVycm9yID0gdmFsdWUuZXJyb3IgPz8gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBsdiA9IHRoaXMuX2xldmVsO1xuICAgIHRoaXMuX2ltcGwgPSB7XG4gICAgICBkZWJ1ZzogbHYgPj0gMyA/IGRlYnVnIDogdW5kZWZpbmVkLFxuICAgICAgaW5mbzogbHYgPj0gMiA/IGluZm8gOiB1bmRlZmluZWQsXG4gICAgICB3YXJuOiBsdiA+PSAxID8gd2FybiA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yOiBsdiA+PSAwID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xldmVsOiBudW1iZXIgPSBwdXBMb2dMZXZlbCkge1xuICAgIHRoaXMuaW1wbCA9IGNvbnNvbGU7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGRlYnVnKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmRlYnVnPy4oREVCVUcsIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgaW5mbyguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5pbmZvPy4oSU5GTywgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICB3YXJuKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/Lndhcm4/LihXQVJOLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGVycm9yKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmVycm9yPy4oRVJST1IsIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgZmF0YWwoLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uZXJyb3I/LihGQVRBTCwgLi4ubWVzc2FnZXMpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2gobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbXNnID0gbWVzc2FnZS50cmltRW5kKCk7XG4gICAgaWYgKG1zZy5zdGFydHNXaXRoKERFQlVHKSkge1xuICAgICAgdGhpcy5kZWJ1Zyhtc2cuc2xpY2UoREVCVUcubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSBpZiAobXNnLnN0YXJ0c1dpdGgoSU5GTykpIHtcbiAgICAgIHRoaXMuaW5mbyhtc2cuc2xpY2UoSU5GTy5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIGlmIChtc2cuc3RhcnRzV2l0aChXQVJOKSkge1xuICAgICAgdGhpcy53YXJuKG1zZy5zbGljZShXQVJOLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2UgaWYgKG1zZy5zdGFydHNXaXRoKEVSUk9SKSkge1xuICAgICAgdGhpcy5lcnJvcihtc2cuc2xpY2UoRVJST1IubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluZm8obXNnKTtcbiAgICB9XG4gIH1cblxuICBhdHRhY2gocHJvYzogQ2hpbGRQcm9jZXNzLCBuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kZWJ1ZyhgJHtuYW1lfS5hdHRhY2hgKTtcbiAgICAgIGxldCBmYXRhbDogc3RyaW5nID0gXCJcIjtcbiAgICAgIGNvbnN0IGRpc3BhdGNoID0gKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgICBpZiAobWVzc2FnZS5zdGFydHNXaXRoKEZBVEFMKSkge1xuICAgICAgICAgIGZhdGFsICs9IG1lc3NhZ2Uuc2xpY2UoRkFUQUwubGVuZ3RoICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbihcImRhdGFcIiwgZGlzcGF0Y2gpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKFwiZGF0YVwiLCBkaXNwYXRjaCk7XG4gICAgICBwcm9jXG4gICAgICAgIC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICBmYXRhbCArPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICBwcm9jLmtpbGwoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uY2UoXCJjbG9zZVwiLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKGNvZGUgfHwgc2lnbmFsIHx8IGZhdGFsKSB7XG4gICAgICAgICAgICBmYXRhbCB8fD0gYGNvbW1hbmQgZmFpbGVkOiAke3Byb2Muc3Bhd25hcmdzLmpvaW4oXCIgXCIpfWA7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGAke25hbWV9LmNsb3NlYCwgeyBjb2RlLCBzaWduYWwsIGZhdGFsIH0pO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihmYXRhbCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGAke25hbWV9LmNsb3NlYCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAub24oXCJ1bmhhbmRsZWRSZWplY3Rpb25cIiwgKHJlYXNvbikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3IoYCR7bmFtZX0udW5oYW5kbGVkYCwgcmVhc29uKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwidW5jYXVnaHRFeGNlcHRpb25Nb25pdG9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yKGAke25hbWV9LnVuaGFuZGxlZGAsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcblxuLy8gUm91dGUgZmZtcGVnIG5hdGl2ZSBsb2dzIHRocm91Z2ggcHVwJ3MgbG9nZ2VyLlxuTG9nLnNldENhbGxiYWNrKChsZXZlbCwgbWVzc2FnZSkgPT4ge1xuICBjb25zdCBtc2cgPSBtZXNzYWdlLnRyaW1FbmQoKTtcbiAgaWYgKCFtc2cpIHJldHVybjtcbiAgaWYgKGxldmVsIDw9IEFWX0xPR19FUlJPUikgbG9nZ2VyLmVycm9yKG1zZyk7XG4gIGVsc2UgaWYgKGxldmVsIDw9IEFWX0xPR19XQVJOSU5HKSBsb2dnZXIud2Fybihtc2cpO1xufSk7XG5cbmV4cG9ydCB7IGxvZ2dlciB9O1xuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNC5cblxuZXhwb3J0IGZ1bmN0aW9uIG5vZXJyPEZuIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIEQ+KFxuICBmbjogRm4sXG4gIGRlZmF1bHRWYWx1ZTogRCxcbik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEZuPikgPT4gUmV0dXJuVHlwZTxGbj4gfCBEIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJldC5jYXRjaCgoKSA9PiBkZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgdHJlZUtpbGwgZnJvbSBcInRyZWUta2lsbFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG5leHBvcnQgY29uc3QgUFVQX0FSR1NfS0VZID0gXCItLXB1cC1wcml2LWFyZ3NcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcmdzKCkge1xuICBjb25zdCBhcmd2ID0gcHJvY2Vzcy5hcmd2O1xuICBsZXQgcHJpdiA9IGFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChQVVBfQVJHU19LRVkpKTtcbiAgaWYgKCFwcml2KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwicHJvY2FyZ3ZcIiwgYXJndik7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndjtcbiAgfVxuICBjb25zdCBhcmdzID0gW1wiZXhlY1wiLCAuLi5hcmd2LnNsaWNlKC0xKV07XG4gIHByaXYgPSBCdWZmZXIuZnJvbShwcml2LnNwbGl0KFwiPVwiKVsxXSEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG4gIGFyZ3MucHVzaCguLi5KU09OLnBhcnNlKHByaXYpKTtcbiAgbG9nZ2VyLmRlYnVnKFwicHVwYXJnc1wiLCBhcmdzKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0hhbmRsZSB7XG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcbiAgd2FpdDogUHJvbWlzZTx2b2lkPjtcbiAgZ2V0IGtpbGxlZCgpOiBib29sZWFuO1xuICBraWxsKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjKGNtZDogc3RyaW5nLCBvcHRpb25zPzogU3Bhd25PcHRpb25zKTogUHJvY2Vzc0hhbmRsZSB7XG4gIGNvbnN0IHBhcnRzID0gY21kLnNwbGl0KFwiIFwiKS5maWx0ZXIoKHMpID0+IHMubGVuZ3RoKTtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLmFyZ3NdID0gcGFydHM7XG4gIGlmICghY29tbWFuZCkgdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgY29tbWFuZFwiKTtcbiAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG4gIGxldCBraWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBwcm9jZXNzOiBwcm9jLFxuICAgIHdhaXQ6IGxvZ2dlci5hdHRhY2gocHJvYywgY29tbWFuZCksXG4gICAgZ2V0IGtpbGxlZCgpIHtcbiAgICAgIHJldHVybiBraWxsZWQ7XG4gICAgfSxcbiAgICBraWxsKCkge1xuICAgICAgaWYgKGtpbGxlZCkgcmV0dXJuO1xuICAgICAga2lsbGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHBpZCA9IHByb2MucGlkO1xuICAgICAgaWYgKHBpZCkgdHJlZUtpbGwocGlkLCBcIlNJR0tJTExcIik7XG4gICAgICBlbHNlIHByb2Mua2lsbChcIlNJR0tJTExcIik7XG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDYuXG5cbmltcG9ydCB6IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0lEVEggPSAxOTIwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVJR0hUID0gMTA4MDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFVSQVRJT04gPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUX0ZJTEUgPSBcIm91dC9odG1sLm1wNCxvdXQvaHRtbC53ZWJtXCI7XG5cbmV4cG9ydCBjb25zdCBSZW5kZXJTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGR1cmF0aW9uOiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiRHVyYXRpb24gaW4gc2Vjb25kc1wiKSxcbiAgd2lkdGg6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJWaWRlbyB3aWR0aFwiKSxcbiAgaGVpZ2h0OiB6Lm51bWJlcigpLmRlc2NyaWJlKFwiVmlkZW8gaGVpZ2h0XCIpLFxuICBmcHM6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJGcmFtZXMgcGVyIHNlY29uZFwiKSxcbiAgd2l0aEF1ZGlvOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIkNhcHR1cmUgYW5kIGVuY29kZSBhdWRpb1wiKSxcbiAgb3V0RmlsZTogei5zdHJpbmcoKS5kZXNjcmliZShcIkNvbW1hLXNlcGFyYXRlZCBvdXRwdXQgcGF0aHM7IGV4dGVuc2lvbiAoLm1wNC8ud2VibSkgc2VsZWN0cyBlbmNvZGVyXCIpLFxuICB1c2VJbm5lclByb3h5OiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlVzZSBiaWxpYmlsaSBpbm5lciBwcm94eSBmb3IgcmVzb3VyY2UgYWNjZXNzXCIpLFxuICBkZXRlcm1pbmlzdGljOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIlJlbmRlciBieSBmcmFtZSByYXRoZXIgdGhhbiByZWNvcmRpbmdcIiksXG4gIGRpc2FibGVHcHU6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiRGlzYWJsZSBHUFUgcmVuZGVyaW5nLCBtYXkgcmVkdWNlIHBlcmZvcm1hbmNlIGJ1dCBpbmNyZWFzZSBzdGFiaWxpdHlcIiksXG4gIGRpc2FibGVId0NvZGVjOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIkRpc2FibGUgaGFyZHdhcmUgdmlkZW8gZW5jb2RlciAoTlZFTkMvVmlkZW9Ub29sYm94KSwgdXNlIHNvZnR3YXJlIHgyNjVcIiksXG4gIHdpbmRvd1RvbGVyYW50OiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIkZhbGwgYmFjayB0byBkb20tcmVhZHkgaWYgd2FybXVwIGxvYWQgdGltZXMgb3V0XCIpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFJlbmRlck9wdGlvbnMgPSB6LmluZmVyPHR5cGVvZiBSZW5kZXJTY2hlbWE+O1xuXG5leHBvcnQgdHlwZSBDb25zb2xlQ2FsbGJhY2sgPSAobGV2ZWw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBQcm9ncmVzc0NhbGxiYWNrID0gKHByb2dyZXNzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBDUmVuZGVyT3B0aW9ucyBleHRlbmRzIFJlbmRlck9wdGlvbnMge1xuICBzb3VyY2U6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgb25Qcm9ncmVzczogUHJvZ3Jlc3NDYWxsYmFjaztcbiAgb25Db25zb2xlOiBDb25zb2xlQ2FsbGJhY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUmVzdWx0IHtcbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucztcbiAgd3JpdHRlbjogbnVtYmVyO1xuICBqYW5rOiBudW1iZXI7XG4gIG91dEZpbGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZW5kZXJPcHRpb25zOiBSZW5kZXJPcHRpb25zID0ge1xuICB3aWR0aDogREVGQVVMVF9XSURUSCxcbiAgaGVpZ2h0OiBERUZBVUxUX0hFSUdIVCxcbiAgZnBzOiBERUZBVUxUX0ZQUyxcbiAgZHVyYXRpb246IERFRkFVTFRfRFVSQVRJT04sXG4gIG91dEZpbGU6IERFRkFVTFRfT1VUX0ZJTEUsXG4gIHdpdGhBdWRpbzogZmFsc2UsXG4gIHVzZUlubmVyUHJveHk6IGZhbHNlLFxuICBkZXRlcm1pbmlzdGljOiBmYWxzZSxcbiAgZGlzYWJsZUdwdTogZmFsc2UsXG4gIGRpc2FibGVId0NvZGVjOiBmYWxzZSxcbiAgd2luZG93VG9sZXJhbnQ6IGZhbHNlLFxufTtcbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMjcuXG5cbmltcG9ydCB7IEhhcmR3YXJlQ29udGV4dCB9IGZyb20gXCJub2RlLWF2L2FwaVwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG5jb25zdCBUQUcgPSBcIltIV0FjY2VsXVwiO1xuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RHUFVEcml2ZXIoKSB7XG4gIGNvbnN0IGh3ID0gSGFyZHdhcmVDb250ZXh0LmF1dG8oKTtcbiAgY29uc3QgcmVzdWx0ID0gaHcgIT09IG51bGw7XG4gIGh3Py5kaXNwb3NlKCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBjYW5JVXNlR1BVID0gZGV0ZWN0R1BVRHJpdmVyKCkudGhlbigocmVzdWx0KSA9PiB7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIFwiZ3B1OlwiLCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzA0LzAzLlxuXG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgcHVwTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGNhbklVc2VHUFUgfSBmcm9tIFwiLi9od2FjY2VsXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaHJvbWl1bU9wdGlvbnMoZGlzYWJsZUdwdTogYm9vbGVhbikge1xuICBjb25zdCBvcHRzID0gW1xuICAgIC8vIOWuueWZqOaymeeusVxuICAgIFwibm8tc2FuZGJveFwiLFxuICAgIFwiZGlzYWJsZS1kZXYtc2htLXVzYWdlXCIsXG4gICAgLy8g6Leo5Z+fL+WuieWFqFxuICAgIFwiZGlzYWJsZS13ZWItc2VjdXJpdHlcIixcbiAgICBcImRpc2FibGUtc2l0ZS1pc29sYXRpb24tdHJpYWxzXCIsXG4gICAgXCJpZ25vcmUtY2VydGlmaWNhdGUtZXJyb3JzXCIsXG4gICAgLy8g5b2V5Yi26KGM5Li6XG4gICAgXCJkaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUF1dG9tYXRpb25Db250cm9sbGVkXCIsXG4gICAgXCJtdXRlLWF1ZGlvXCIsXG4gICAgXCJhdXRvcGxheS1wb2xpY3k9bm8tdXNlci1nZXN0dXJlLXJlcXVpcmVkXCIsXG4gICAgXCJkaXNhYmxlLWV4dGVuc2lvbnNcIixcbiAgICAvLyDmuLLmn5NcbiAgICBcImZvcmNlLWRldmljZS1zY2FsZS1mYWN0b3I9MVwiLFxuICAgIFwiZm9yY2UtY29sb3ItcHJvZmlsZT1zcmdiXCIsXG4gICAgXCJpZ25vcmUtZ3B1LWJsb2NrbGlzdFwiLFxuICAgIFwidXNlLWdsPWFuZ2xlXCIsXG4gICAgXCJkZXRlcm1pbmlzdGljLW1vZGVcIixcbiAgICBcImVuYWJsZS1iZWdpbi1mcmFtZS1jb250cm9sXCIsXG4gICAgXCJkaXNhYmxlLW5ldy1jb250ZW50LXJlbmRlcmluZy10aW1lb3V0XCIsXG4gICAgXCJydW4tYWxsLWNvbXBvc2l0b3Itc3RhZ2VzLWJlZm9yZS1kcmF3XCIsXG4gICAgXCJkaXNhYmxlLXRocmVhZGVkLWFuaW1hdGlvblwiLFxuICAgIFwiZGlzYWJsZS10aHJlYWRlZC1zY3JvbGxpbmdcIixcbiAgICBcImRpc2FibGUtY2hlY2tlci1pbWFnaW5nXCIsXG4gICAgXCJkaXNhYmxlLWltYWdlLWFuaW1hdGlvbi1yZXN5bmNcIixcbiAgICBcImVuYWJsZS1zdXJmYWNlLXN5bmNocm9uaXphdGlvblwiLFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wdXBwZXRlZXIvcHVwcGV0ZWVyL2lzc3Vlcy8yNDEwXG4gICAgXCJmb250LXJlbmRlci1oaW50aW5nPW5vbmVcIixcbiAgICAvLyDotYTmupDmjqfliLZcbiAgICBcImRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nXCIsXG4gICAgXCJqcy1mbGFncz0tLW1heC1vbGQtc3BhY2Utc2l6ZT01MTJcIixcbiAgICBcInJlbmRlcmVyLXByb2Nlc3MtbGltaXQ9MVwiLFxuICAgIFwibnVtLXJhc3Rlci10aHJlYWRzPTJcIixcbiAgICBcImRpc2FibGUtYmFja2dyb3VuZC10aW1lci10aHJvdHRsaW5nXCIsXG4gICAgXCJkaXNhYmxlLXJlbmRlcmVyLWJhY2tncm91bmRpbmdcIixcbiAgICBcImRpc2FibGUtYmFja2dyb3VuZGluZy1vY2NsdWRlZC13aW5kb3dzXCIsXG4gICAgLy8g5pel5b+X6L+96LiqXG4gICAgXCJlbmFibGUtbG9nZ2luZz1zdGRlcnJcIixcbiAgXTtcblxuICBpZiAocHVwTG9nTGV2ZWwgPj0gMykge1xuICAgIG9wdHMucHVzaChcImxvZy1sZXZlbD0wXCIsIFwidj0xXCIpO1xuICB9IGVsc2Uge1xuICAgIG9wdHMucHVzaChcImxvZy1sZXZlbD0zXCIpO1xuICB9XG5cbiAgY29uc3QgZmVhdHVyZXMgPSBbXCJGb250YXRpb25CYWNrZW5kXCJdO1xuICBjb25zdCBlbmFibGVHcHUgPSAoYXdhaXQgY2FuSVVzZUdQVSkgJiYgIWRpc2FibGVHcHU7XG4gIGlmICghZW5hYmxlR3B1KSB7XG4gICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPXN3aWZ0c2hhZGVyXCIsIFwiZW5hYmxlLXVuc2FmZS1zd2lmdHNoYWRlclwiKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLnB1c2goXCJkaXNhYmxlLWdwdS1zYW5kYm94XCIsIFwiZW5hYmxlLXVuc2FmZS13ZWJncHVcIik7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgaWYgKHBsYXQgPT09IFwiZGFyd2luXCIpIHtcbiAgICAgIG9wdHMucHVzaChcInVzZS1hbmdsZT1tZXRhbFwiKTtcbiAgICB9IGVsc2UgaWYgKHBsYXQgPT09IFwid2luMzJcIikge1xuICAgICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPWQzZDExXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRzLnB1c2goXCJ1c2UtYW5nbGU9dnVsa2FuXCIsIFwiZGlzYWJsZS12dWxrYW4tc3VyZmFjZVwiKTtcbiAgICAgIGZlYXR1cmVzLnB1c2goXCJWdWxrYW5cIik7XG4gICAgfVxuICB9XG5cbiAgb3B0cy5wdXNoKGBlbmFibGUtZmVhdHVyZXM9JHtmZWF0dXJlcy5qb2luKFwiLFwiKX1gKTtcbiAgcmV0dXJuIG9wdHM7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI1LlxuXG5pbXBvcnQgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgeyBjaHJvbWl1bU9wdGlvbnMgfSBmcm9tIFwiLi4vYmFzZS9jaHJvbWl1bVwiO1xuaW1wb3J0IHsgcHVwQXBwIH0gZnJvbSBcIi4uL2Jhc2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBleGVjLCBQVVBfQVJHU19LRVkgfSBmcm9tIFwiLi4vYmFzZS9wcm9jZXNzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbGVjdHJvbk9wdHMoZGlzYWJsZUdwdTogYm9vbGVhbikge1xuICByZXR1cm4gWy4uLihhd2FpdCBjaHJvbWl1bU9wdGlvbnMoZGlzYWJsZUdwdSkpLCBcImhlYWRsZXNzPW5ld1wiXTtcbn1cblxuY29uc3QgVEFHID0gXCJbRWxlY3Ryb25dXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuRWxlY3Ryb25BcHBPcHRpb25zIHtcbiAgYXJnczogdW5rbm93bltdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRWxlY3Ryb25BcHAoeyBhcmdzIH06IFJ1bkVsZWN0cm9uQXBwT3B0aW9ucykge1xuICBjb25zdCBvcHRzID0gYXdhaXQgZWxlY3Ryb25PcHRzKGFyZ3MuaW5jbHVkZXMoXCItLWRpc2FibGUtZ3B1XCIpKTtcbiAgY29uc3QgZWxlY3Ryb25BcmdzID0gb3B0cy5tYXAoKGEpID0+IGAtLSR7YX1gKTtcbiAgZWxlY3Ryb25BcmdzLnB1c2goYCR7UFVQX0FSR1NfS0VZfT0ke0J1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGFyZ3MpKS50b1N0cmluZyhcImJhc2U2NFwiKX1gKTtcbiAgY29uc3QgY21kID0gW2VsZWN0cm9uLCAuLi5lbGVjdHJvbkFyZ3MsIHB1cEFwcF0uam9pbihcIiBcIik7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGNtZCk7XG5cbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHsgLi4ucHJvY2Vzcy5lbnYsIFJVU1RfQkFDS1RSQUNFOiBcImZ1bGxcIiB9O1xuICByZXR1cm4gZXhlYyhjbWQsIHsgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCIsIFwiaXBjXCJdLCBlbnYgfSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzA0LzAxLlxuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBlbnVtIElwY01zZ1R5cGUge1xuICAvLyBjaGlsZCDihpIgcGFyZW50XG4gIENPTlNPTEUgPSBcImNvbnNvbGVcIixcbiAgUFJPR1JFU1MgPSBcInByb2dyZXNzXCIsXG4gIERPTkUgPSBcImRvbmVcIixcbiAgRVJST1IgPSBcImVycm9yXCIsXG4gIC8vIHBhcmVudCDihpIgY2hpbGRcbiAgQ0FOQ0VMID0gXCJjYW5jZWxcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25zb2xlTXNnIHtcbiAgdHlwZTogSXBjTXNnVHlwZS5DT05TT0xFO1xuICBsZXZlbDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsTXNnIHtcbiAgdHlwZTogSXBjTXNnVHlwZS5DQU5DRUw7XG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJcGNEb25lUGF5bG9hZCB7XG4gIHdyaXR0ZW46IG51bWJlcjtcbiAgamFuazogbnVtYmVyO1xuICBvdXRGaWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3Jlc3NNc2cge1xuICB0eXBlOiBJcGNNc2dUeXBlLlBST0dSRVNTO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvbmVNc2cge1xuICB0eXBlOiBJcGNNc2dUeXBlLkRPTkU7XG4gIHBheWxvYWQ6IElwY0RvbmVQYXlsb2FkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTXNnIHtcbiAgdHlwZTogSXBjTXNnVHlwZS5FUlJPUjtcbiAgZXJyb3I6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgSXBjTXNnID0gQ29uc29sZU1zZyB8IFByb2dyZXNzTXNnIHwgRG9uZU1zZyB8IEVycm9yTXNnIHwgQ2FuY2VsTXNnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElwY0V2ZW50cyB7XG4gIHByb2dyZXNzOiBbdmFsdWU6IG51bWJlcl07XG4gIGNvbnNvbGU6IFtsZXZlbDogc3RyaW5nLCBtc2c6IHN0cmluZ107XG4gIGRvbmU6IFtwYXlsb2FkOiBJcGNEb25lUGF5bG9hZF07XG4gIGVycm9yOiBbZXJyb3I6IEVycm9yXTtcbiAgY2xvc2U6IFtjb2RlOiBudW1iZXIgfCBudWxsXTtcbn1cblxuZXhwb3J0IGNsYXNzIElwY1dyaXRlciB7XG4gIHdyaXRlQ29uc29sZShsZXZlbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbmQoeyB0eXBlOiBJcGNNc2dUeXBlLkNPTlNPTEUsIGxldmVsLCBtZXNzYWdlIH0pO1xuICB9XG5cbiAgd3JpdGVQcm9ncmVzcyh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZW5kKHsgdHlwZTogSXBjTXNnVHlwZS5QUk9HUkVTUywgdmFsdWUgfSk7XG4gIH1cblxuICB3cml0ZUVycm9yKGVycm9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKHsgdHlwZTogSXBjTXNnVHlwZS5FUlJPUiwgZXJyb3IgfSk7XG4gIH1cblxuICB3cml0ZURvbmUocGF5bG9hZDogSXBjRG9uZVBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kKHsgdHlwZTogSXBjTXNnVHlwZS5ET05FLCBwYXlsb2FkIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kKG1zZzogSXBjTXNnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoIXByb2Nlc3Muc2VuZCkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIHByb2Nlc3Muc2VuZChtc2csICgpID0+IHJlc29sdmUoKSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElwY1JlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxJcGNFdmVudHM+IHtcbiAgY29uc3RydWN0b3IoY2hpbGQ6IENoaWxkUHJvY2Vzcykge1xuICAgIHN1cGVyKCk7XG4gICAgY2hpbGQub24oXCJtZXNzYWdlXCIsIChyYXcpID0+IHtcbiAgICAgIGNvbnN0IG1zZyA9IHJhdyBhcyBJcGNNc2c7XG4gICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgIGNhc2UgSXBjTXNnVHlwZS5DT05TT0xFOiB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiY29uc29sZVwiLCBtc2cubGV2ZWwsIG1zZy5tZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIElwY01zZ1R5cGUuUFJPR1JFU1M6IHtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJwcm9ncmVzc1wiLCBtc2cudmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgSXBjTXNnVHlwZS5ET05FOiB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiZG9uZVwiLCBtc2cucGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBJcGNNc2dUeXBlLkVSUk9SOiB7XG4gICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbmV3IEVycm9yKG1zZy5lcnJvcikpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY2hpbGQub25jZShcImV4aXRcIiwgKGMpID0+IHRoaXMuZW1pdChcImNsb3NlXCIsIGMpKTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBydW5FbGVjdHJvbkFwcCB9IGZyb20gXCIuL3JlbmRlcmVyL2VsZWN0cm9uXCI7XG5pbXBvcnQgeyBJcGNNc2dUeXBlLCBJcGNSZWFkZXIsIHR5cGUgSXBjRG9uZVBheWxvYWQgfSBmcm9tIFwiLi9yZW5kZXJlci9pcGNcIjtcbmltcG9ydCB7XG4gIGRlZmF1bHRSZW5kZXJPcHRpb25zLFxuICB0eXBlIENvbnNvbGVDYWxsYmFjayxcbiAgdHlwZSBQcm9ncmVzc0NhbGxiYWNrLFxuICB0eXBlIFJlbmRlck9wdGlvbnMsXG4gIHR5cGUgUmVuZGVyUmVzdWx0LFxufSBmcm9tIFwiLi9yZW5kZXJlci9zY2hlbWFcIjtcblxuY29uc3QgVEFHID0gXCJbcHVwXVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFB1cE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFJlbmRlck9wdGlvbnM+IHtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICBvbkNvbnNvbGU/OiBDb25zb2xlQ2FsbGJhY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVwUmVzdWx0IGV4dGVuZHMgUmVuZGVyUmVzdWx0IHt9XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blB1cEFwcChzb3VyY2U6IHN0cmluZywgcmVuZGVyOiBSZW5kZXJPcHRpb25zKSB7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGBydW5QdXBBcHBgLCBzb3VyY2UsIHJlbmRlcik7XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgc291cmNlLFxuICAgIGAtLXdpZHRoYCxcbiAgICBgJHtyZW5kZXIud2lkdGh9YCxcbiAgICBgLS1oZWlnaHRgLFxuICAgIGAke3JlbmRlci5oZWlnaHR9YCxcbiAgICBgLS1mcHNgLFxuICAgIGAke3JlbmRlci5mcHN9YCxcbiAgICBgLS1kdXJhdGlvbmAsXG4gICAgYCR7cmVuZGVyLmR1cmF0aW9ufWAsXG4gICAgYC0tb3V0LWZpbGVgLFxuICAgIGAke3JlbmRlci5vdXRGaWxlfWAsXG4gIF07XG4gIGlmIChyZW5kZXIud2l0aEF1ZGlvKSBhcmdzLnB1c2goYC0td2l0aC1hdWRpb2ApO1xuICBpZiAocmVuZGVyLnVzZUlubmVyUHJveHkpIGFyZ3MucHVzaChgLS11c2UtaW5uZXItcHJveHlgKTtcbiAgaWYgKHJlbmRlci5kZXRlcm1pbmlzdGljKSBhcmdzLnB1c2goYC0tZGV0ZXJtaW5pc3RpY2ApO1xuICBpZiAocmVuZGVyLmRpc2FibGVHcHUpIGFyZ3MucHVzaChgLS1kaXNhYmxlLWdwdWApO1xuICBpZiAocmVuZGVyLmRpc2FibGVId0NvZGVjKSBhcmdzLnB1c2goYC0tZGlzYWJsZS1ody1jb2RlY2ApO1xuICBpZiAocmVuZGVyLndpbmRvd1RvbGVyYW50KSBhcmdzLnB1c2goYC0td2luZG93LXRvbGVyYW50YCk7XG5cbiAgcmV0dXJuIHJ1bkVsZWN0cm9uQXBwKHsgYXJncyB9KTtcbn1cblxuY29uc3QgZCA9IGRlZmF1bHRSZW5kZXJPcHRpb25zO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVwKHNvdXJjZTogc3RyaW5nLCBvcHRpb25zOiBQYXJ0aWFsPFB1cE9wdGlvbnM+KTogUHJvbWlzZTxQdXBSZXN1bHQ+IHtcbiAgbG9nZ2VyLmRlYnVnKFRBRywgYHB1cGAsIHNvdXJjZSwgb3B0aW9ucyk7XG5cbiAgY29uc3QgeyBzaWduYWwgfSA9IG9wdGlvbnM7XG4gIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBvdXRGaWxlID0gb3B0aW9ucy5vdXRGaWxlID8/IGQub3V0RmlsZTtcbiAgY29uc3QgcmVuZGVyT3B0czogUmVuZGVyT3B0aW9ucyA9IHtcbiAgICB3aWR0aDogb3B0aW9ucy53aWR0aCA/PyBkLndpZHRoLFxuICAgIGhlaWdodDogb3B0aW9ucy5oZWlnaHQgPz8gZC5oZWlnaHQsXG4gICAgZnBzOiBvcHRpb25zLmZwcyA/PyBkLmZwcyxcbiAgICBkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiA/PyBkLmR1cmF0aW9uLFxuICAgIHdpdGhBdWRpbzogb3B0aW9ucy53aXRoQXVkaW8gPz8gZC53aXRoQXVkaW8sXG4gICAgdXNlSW5uZXJQcm94eTogb3B0aW9ucy51c2VJbm5lclByb3h5ID8/IGQudXNlSW5uZXJQcm94eSxcbiAgICBkZXRlcm1pbmlzdGljOiBvcHRpb25zLmRldGVybWluaXN0aWMgPz8gZC5kZXRlcm1pbmlzdGljLFxuICAgIGRpc2FibGVHcHU6IG9wdGlvbnMuZGlzYWJsZUdwdSA/PyBkLmRpc2FibGVHcHUsXG4gICAgZGlzYWJsZUh3Q29kZWM6IG9wdGlvbnMuZGlzYWJsZUh3Q29kZWMgPz8gZC5kaXNhYmxlSHdDb2RlYyxcbiAgICB3aW5kb3dUb2xlcmFudDogb3B0aW9ucy53aW5kb3dUb2xlcmFudCA/PyBkLndpbmRvd1RvbGVyYW50LFxuICAgIG91dEZpbGUsXG4gIH07XG5cbiAgY29uc3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgbGV0IHByb2dyZXNzID0gMDtcbiAgY29uc3QgdGljayA9IChwOiBudW1iZXIpID0+IHtcbiAgICBsb2dnZXIuaW5mbyhUQUcsIGAke3NvdXJjZX0gcHJvZ3Jlc3M6ICR7cH0lYCk7XG4gICAgcHJvZ3Jlc3MgPSBwO1xuICAgIG9wdGlvbnMub25Qcm9ncmVzcz8uKHApO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHJ1blB1cEFwcChzb3VyY2UsIHJlbmRlck9wdHMpO1xuXG4gIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgaGFuZGxlLnByb2Nlc3Muc2VuZD8uKHsgdHlwZTogSXBjTXNnVHlwZS5DQU5DRUwsIHJlYXNvbjogU3RyaW5nKHNpZ25hbD8ucmVhc29uID8/IFwiYWJvcnRcIikgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiBoYW5kbGUua2lsbCgpLCA1XzAwMCk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPElwY0RvbmVQYXlsb2FkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBuZXcgSXBjUmVhZGVyKGhhbmRsZS5wcm9jZXNzKVxuICAgICAgICAub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IEpTT04uc3RyaW5naWZ5KHsgc291cmNlLCBwcm9ncmVzcywgY29kZSwga2lsbGVkOiBoYW5kbGUua2lsbGVkIH0pO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYGNyYXNoZWQ6ICR7bXNnfWApKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwicHJvZ3Jlc3NcIiwgdGljaylcbiAgICAgICAgLm9uKFwiY29uc29sZVwiLCAobCwgbSkgPT4gb3B0aW9ucy5vbkNvbnNvbGU/LihsLCBtKSlcbiAgICAgICAgLm9uKFwiZG9uZVwiLCByZXNvbHZlKVxuICAgICAgICAub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIH0pO1xuICAgIHRpY2soMCk7XG4gICAgY29uc3QgW3N1bW1hcnldID0gYXdhaXQgUHJvbWlzZS5hbGwoW3Jlc3VsdCwgaGFuZGxlLndhaXRdKTtcbiAgICB0aWNrKDEwMCk7XG4gICAgbG9nZ2VyLmluZm8oVEFHLCBgZG9uZSAke291dEZpbGV9IGluICR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSAtIHQwKX1tc2ApO1xuICAgIHJldHVybiB7IC4uLnN1bW1hcnksIG9wdGlvbnM6IHJlbmRlck9wdHMgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZS5raWxsKCk7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRocm93IGU7XG4gIH0gZmluYWxseSB7XG4gICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gIH1cbn1cbiJdfQ==