logixlysia 6.9.1 → 6.9.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.
- package/CHANGELOG.md +6 -0
- package/dist/index.js +6 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{k as R}from"./shared/Logixlysia-nrt7tysy.js";import{Elysia as
|
|
2
|
-
`)},C0=()=>{let $=S$.version;if(!$)return null;return` logixlysia v${$}`};var Q0=($,Z)=>{if(!(Z.config?.showStartupMessage??!0))return;let{port:Q,hostname:Y,protocol:B}=$;if(Q===void 0||!Y||!B)return;let X=`${B}://${Y}:${Q}`,G=`\uD83E\uDD8A Elysia is running at ${X}`,j=`\uD83E\uDD8A ${X}`;if((Z.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(R0(j,C0()))};import{StatusMap as q$}from"elysia";var x$=/^\d+$/,y$=/[_-]+/g,k$=/([a-z0-9])([A-Z])/g,m$=/([A-Z])([A-Z][a-z])/g,v$=/['’]/g,h$=/[^a-z0-9\s]+/g,g$=/\s+/g,w0=($)=>{let Z=$.trim();if(!Z)return"";return Z.replace(y$," ").replace(k$,"$1 $2").replace(m$,"$1 $2").replace(v$,"").toLowerCase().replace(h$," ").replace(g$," ").trim()},c$=(()=>{let $=new Map;for(let[Z,J]of Object.entries(q$))$.set(w0(Z),J);return $})(),o=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let Z=$.trim();if(x$.test(Z))return Number(Z);return c$.get(w0(Z))??500}return 500};import Q$ from"pino";import U1 from"pino-pretty";var p$=/[.*+?^${}()|[\]\\]/g,d$=/\*\*.*\*\*/,u$=/\*\*/,l$=/[a-zA-Z0-9]/,n$=($)=>$.replace(p$,"\\$&"),i$=($)=>{if(!d$.test($))return!1;let Z=$.split(u$);for(let J=1;J<Z.length;J+=1){let Q=Z[J];if(Q===""||Q.length<2&&!l$.test(Q))return!0}return!1},P0=($)=>{if(i$($))throw Error("Invalid glob pattern: repeated recursive wildcards (**) can cause performance issues");let Z="",J=0;while(J<$.length){let Q=$[J];if(Q==="*"){let Y=$[J+1]==="*";Z+=Y?".*":"[^/]*",J+=Y?2:1;continue}if(Q==="?"){Z+="[^/]",J+=1;continue}Z+=n$(Q),J+=1}return new RegExp(`^${Z}$`)};var t=100,a$=100,T0=Object.freeze([]),s$=($)=>{if(!$)return;let Z=$.paths?.length?$.paths.map(P0):void 0;if($.durationMs===void 0&&$.status===void 0&&Z===void 0)return;return{durationMs:$.durationMs,paths:Z,status:$.status}},o$=($,Z)=>{if($.status!==void 0&&Z.status>=$.status)return!0;if($.durationMs!==void 0&&Z.durationMs>=$.durationMs)return!0;if($.paths){for(let J of $.paths)if(J.test(Z.pathname))return!0}return!1},t$=($)=>{if(!$)return;let Z={},J=!1;for(let[Q,Y]of Object.entries($))if(typeof Y==="number"&&Y<t)Z[Q]=Y,J=!0;return J?Z:void 0},Y0=($,Z=Math.random)=>{let J=t$($?.head);if(!J)return;let Q=s$($?.tail),Y=$?.maxBufferedPerRequest??a$,B=new WeakMap,X=new WeakSet,G=new WeakSet;return{begin(j){if(Q)X.add(j)},buffer(j,H){let N=B.get(j);if(!N)N=[],B.set(j,N);if(N.length>=Y)return;N.push(H)},decide(j,H){if(G.has(H))return"keep";let N=J[j]??t;if(N>=t||N>0&&Z()*t<N)return"keep";return Q&&X.has(H)?"buffer":"drop"},finalize(j,H){X.delete(j);let N=B.get(j);if(B.delete(j),!(Q&&o$(Q,H)))return T0;return G.add(j),N??T0}}};var L=($)=>$===BigInt(0)?0:Number(process.hrtime.bigint()-$)/1e6;var r$=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,e$=/(?<![\w/.])(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?![\w.])/g,$2=/(?<![\w:])(?:(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|(?:[0-9a-f]{1,4}:){1,7}:(?:[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){0,6})?|::(?:[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){0,6}))(?![\w:])/gi,Z2=/\b(?:\d[ -]*?){13,19}\b/g,J2=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var S0=["authorization","proxy-authorization","cookie","set-cookie","x-api-key","api-key","apikey","x-auth-token","password","passwd","secret","client-secret","token","access-token","refresh-token","id-token","session","session-id","private-key","credit-card","card-number","cvv","ssn"],Q2=/([a-z0-9])([A-Z])/g,E0=($)=>$.replace(Q2,"$1-$2").replaceAll("_","-").toLowerCase(),r=($,Z)=>{let J=E0($);if(S0.includes(J))return!0;return Z?.some((Q)=>E0(Q)===J)??!1},f0=($)=>{return[...S0,...$??[]].flatMap((J)=>{if(J.includes("-"))return[`["${J}"]`,`*["${J}"]`];return[J,`*.${J}`]})};var B0=($)=>T($).replaceAll("[REDACTED]","redacted"),Y2=($,Z)=>{try{let J=new URL($);if(J.username!=="")J.username=B0(J.username);if(J.password!=="")J.password=B0(J.password);J.hostname=B0(J.hostname),J.pathname=T(J.pathname);for(let Q of[...J.searchParams.keys()]){if(r(Q,Z)){J.searchParams.set(Q,"redacted");continue}let Y=J.searchParams.get(Q);if(Y!==null){let B=T(Y);if(B!==Y)J.searchParams.set(Q,B)}}return J.hash=T(J.hash),J.toString()}catch{return T($).replaceAll("[REDACTED]","redacted")}},B2=($)=>{if($.length<13||$.length>19)return!1;let Z=0,J=!1;for(let Q=$.length-1;Q>=0;Q-=1){let Y=$.charCodeAt(Q);if(Y<48||Y>57)return!1;let B=Y-48;if(J){if(B*=2,B>9)B-=9}Z+=B,J=!J}return Z%10===0},X2=($)=>$.replace(Z2,(Z)=>{let J=Z.replace(/\D/g,"");if(J.length>=13&&J.length<=19&&B2(J))return"[REDACTED]";return Z}),T=($)=>{let Z=$;return Z=Z.replace(r$,"[REDACTED]"),Z=Z.replace(e$,"[REDACTED]"),Z=Z.replace($2,"[REDACTED]"),Z=X2(Z),Z=Z.replace(J2,"[REDACTED]"),Z},j2=($,Z,J)=>{let Q=T($.message),Y=Object.getPrototypeOf($),B=Object.create(Y);if(B.message=Q,B.name=$.name,$.stack!==void 0)B.stack=T($.stack);let X=$;for(let G of Object.getOwnPropertyNames(X)){if(G==="message"||G==="name"||G==="stack")continue;let j=Object.getOwnPropertyDescriptor(X,G);if(j===void 0)continue;if(j.get!==void 0||j.set!==void 0){Object.defineProperty(B,G,j);continue}let H=r(G,J)?"[REDACTED]":e(j.value,Z,J);Object.defineProperty(B,G,{...j,value:H})}return B},G2=($,Z,J)=>{let Q;for(let[Y,B]of $.entries()){let X=e(B,Z,J);if(Q===void 0&&X!==B)Q=$.slice(0,Y);Q?.push(X)}return Q??$},z2=($,Z,J)=>{let Q=Object.keys($),Y;for(let[B,X]of Q.entries()){let G=$[X],j=r(X,J),H=j?"[REDACTED]":e(G,Z,J);if(Y===void 0&&(j||H!==G)){Y={};for(let N of Q.slice(0,B))Y[N]=$[N]}if(Y!==void 0)Y[X]=H}return Y??$},X0=($,Z,J)=>{Z.add($);try{return J()}finally{Z.delete($)}},e=($,Z,J)=>{if($===null||$===void 0)return $;if(typeof $==="string")return T($);if(typeof $!=="object")return $;if($ instanceof Date)return $;let Y=$;if(Z.has(Y))return"[Circular]";if($ instanceof Error)return X0(Y,Z,()=>j2($,Z,J));if(Array.isArray($))return X0(Y,Z,()=>G2($,Z,J));return X0(Y,Z,()=>z2($,Z,J))},q0=($,Z)=>e($,new WeakSet,Z),x0=($,Z)=>{let J=Y2($.url,Z),Q=new Headers,Y=!1;for(let[H,N]of $.headers.entries()){let K=r(H,Z)?"[REDACTED]":T(N);if(K!==N)Y=!0;Q.set(H,K)}let B=T($.method),X=J!==$.url,G=B!==$.method;if(!(X||Y||G))return $;let j={headers:Q,method:B,redirect:$.redirect,signal:$.signal};return new Request(J,j)};import{STATUS_CODES as V2}from"node:http";import F from"chalk";var v=($)=>{if($ instanceof Error)return $.message;if($&&typeof $==="object"&&"message"in $)return $.message;return String($)},j0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("code"in $)||("internal"in $)),H2=($)=>$ instanceof Error&&($.code==="VALIDATION"||$.name==="ValidationError"||$.constructor?.name==="ValidationError"),W2=["code","fix","internal","link","message","name","status","why"],y0=($)=>{let Z={};for(let J of W2)if($[J]!==void 0)Z[J]=$[J];return Z},k0=($,Z)=>{if(H2($)&&!Z){let Q=(Array.isArray($.all)?$.all:[]).map((X)=>typeof X==="object"&&X!==null&&("path"in X)?String(X.path):"").filter(Boolean),Y=typeof $.type==="string"?$.type:"request",B=Q.length>0?`Validation failed (${Y}): ${Q.join(", ")}`:`Validation failed (${Y})`;return{error:{failedPaths:Q,name:"ValidationError",type:Y},message:B}}if($ instanceof Error){let J=y0($);return J.message=$.message,J.name=$.name==="Error"?$.constructor?.name??$.name:$.name,{error:J,message:v($)}}if(j0($))return{error:y0($),message:v($)};return{error:{value:String($)},message:v($)}};var h=($)=>String($).padStart(2,"0"),N2=($)=>String($).padStart(3,"0"),K2=500,U2=1000,F2=7,I2="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",m0=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,v0=($)=>{let{config:Z}=$,J=Z?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return J&&Q},O2="yyyy-mm-dd HH:MM:ss.SSS",M2=/^sys:/i,D2=/^utc:/i,_2=($)=>{let Z=$,J=!1;if(M2.test(Z))Z=Z.slice(4);else if(D2.test(Z))Z=Z.slice(4),J=!0;return{pattern:Z==="standard"?O2:Z,utc:J}},A2=($,Z)=>{if(!Z)return $.toISOString();let{pattern:J,utc:Q}=_2(Z),Y=String(Q?$.getUTCFullYear():$.getFullYear()),B=h((Q?$.getUTCMonth():$.getMonth())+1),X=h(Q?$.getUTCDate():$.getDate()),G=h(Q?$.getUTCHours():$.getHours()),j=h(Q?$.getUTCMinutes():$.getMinutes()),H=h(Q?$.getUTCSeconds():$.getSeconds()),N=N2(Q?$.getUTCMilliseconds():$.getMilliseconds());return J.replaceAll("yyyy",Y).replaceAll("mm",B).replaceAll("dd",X).replaceAll("HH",G).replaceAll("MM",j).replaceAll("ss",H).replaceAll("SSS",N)},b2=($)=>{let Z=$.headers.get("x-forwarded-for"),J=Z?Z.split(",")[0]?.trim()??"":$.headers.get("x-real-ip")??"";return R(J,64)},L2=($)=>{if($>=1000){let Z=$/1000;if(Z>=10)return`${Math.round(Z)}s`;let J=Z.toFixed(1);return J.endsWith(".0")?`${Math.round(Z)}s`:`${J}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},R2=($)=>{let{config:Z}=$;return{slow:Z?.slowThreshold??K2,verySlow:Z?.verySlowThreshold??U2}},C2=($,Z,J,Q)=>{let Y=L2($),B=$>=Q;if(!Z)return{isVerySlow:B,text:Y};let X=Y;if($<J)X=F.green(Y);else if($<Q)X=F.yellow(Y);else X=F.red.bold(Y);return{isVerySlow:B,text:X}},w2=($,Z)=>{if(!$)return"";let J="⚡ slow";if(!Z)return` ${J}`;return` ${F.yellow(J)}`},P2=($,Z)=>{if(!Z)return"\uD83E\uDD8A";if($==="ERROR")return F.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return F.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return F.bgBlue.black(" \uD83E\uDD8A ");return F.bgGreen.black(" \uD83E\uDD8A ")},T2=($,Z)=>{if(!Z)return $;if($==="ERROR")return F.bgRed.black($);if($==="WARNING")return F.bgYellow.black($);if($==="DEBUG")return F.bgBlue.black($);return F.bgGreen.black($)},E2=($,Z)=>{if(!Z)return $;let J=$.toUpperCase();if(J==="GET")return F.green.bold(J);if(J==="POST")return F.blue.bold(J);if(J==="PUT")return F.yellow.bold(J);if(J==="PATCH")return F.yellowBright.bold(J);if(J==="DELETE")return F.red.bold(J);if(J==="OPTIONS")return F.cyan.bold(J);if(J==="HEAD")return F.greenBright.bold(J);if(J==="TRACE")return F.magenta.bold(J);if(J==="CONNECT")return F.cyanBright.bold(J);return F.white.bold(J)},S2=($,Z)=>{if(!Z)return $;let J=Number.parseInt($,10);if(!Number.isFinite(J))return $;if(J>=500)return F.red($);if(J>=400)return F.yellow($);if(J>=300)return F.cyan($);if(J>=200)return F.green($);return F.gray($)},f2=($,Z)=>{if(!Z)return $;return F.gray($)},q2=($,Z)=>{if(!Z)return $;return F.whiteBright($)},x2=($)=>{return V2[$]??""},y2=($,Z)=>{let J=$.config?.service?.trim();if(!J)return"";let Q=`[${J}]`;if(!Z)return`${Q} `;return`${F.dim(Q)} `},G0=($)=>{let{config:Z}=$,J=v0($),Q=Z?.customLogFormat??I2,Y=new Set(Q.match(m0)??[]),{slow:B,verySlow:X}=R2($),G=y2($,J);return{format:Q,serviceToken:G,slowThreshold:B,tokens:Y,useColors:J,verySlowThreshold:X}},h0=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return R($);if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return R($.message);try{return R(JSON.stringify($))}catch{return R(String($))}},k2=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),g0=($,Z,J)=>{let Q=[];for(let[Y,B]of Object.entries($)){let X=Z?`${Z}.${Y}`:Y;if(k2(B)&&J>1)Q.push(...g0(B,X,J-1));else Q.push([X,h0(B)])}return Q},m2=($,Z)=>{if($.length===0)return[];let J=[],Q=$.length-1;for(let Y=0;Y<$.length;Y+=1){let B=Y===Q?"└─":"├─",X=$[Y];if(!X)continue;let[G,j]=X,H=Z?F.cyan(G):G,N=Z?F.white(j):j;J.push(` ${B} ${H} ${N}`)}return J},v2=($)=>{let Z=[],J=v($);if(J)Z.push(["error",R(J)]);if(j0($)){if($.code!==void 0)Z.push(["error.code",String($.code)]);if($.why!==void 0)Z.push(["error.why",String($.why)]);if($.fix!==void 0)Z.push(["error.fix",String($.fix)]);if($.link!==void 0)Z.push(["error.link",String($.link)]);if($.internal!==void 0)Z.push(["error.internal",h0($.internal)])}return Z},h2=($,Z,J,Q=v0(J))=>{if(J.config?.showContextTree===!1)return[];let Y=J.config?.contextDepth??1,B=[],X=Z.context;if(X&&typeof X==="object"&&!Array.isArray(X)&&Object.keys(X).length>0&&Y>=1)B.push(...g0(X,"",Y));if(($==="ERROR"||$==="WARNING")&&Z.error!==void 0)B.push(...v2(Z.error));return m2(B,Q)},g2=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},c2=($,Z,J)=>{if(!($.has("{now}")||$.has("{epoch}")))return{epoch:"",timestamp:""};let Q=new Date,Y=$.has("{epoch}")?String(Q.getTime()):"";if(!$.has("{now}"))return{epoch:Y,timestamp:""};let B=A2(Q,Z);return{epoch:Y,timestamp:f2(B,J)}},p2=($,Z)=>{if(!$.has("{message}"))return"";return typeof Z.message==="string"?R(Z.message):""},d2=($,Z,J,Q,Y)=>{let B=$.has("{pathname}")||$.has("{path}"),X=$.has("{query}");if(!(B||X))return{coloredPathname:"",query:""};let G,j;if(Y)({pathname:G,search:j}=Y);else try{({pathname:G,search:j}=new URL(Z.url))}catch{G=R(Z.url||"/",1024),j=""}let H=X?j:"";if(!B)return{coloredPathname:"",query:H};let N=J?.logQueryParams?`${G}${j}`:G;return{coloredPathname:q2(N,Q),query:H}},u2=($,Z,J)=>{let Q=$.has("{status}"),Y=$.has("{statusText}");if(!(Q||Y))return{coloredStatus:"",statusText:""};let B=Z.status,X=B===null||B===void 0?200:o(B);return{coloredStatus:Q?S2(String(X),J):"",statusText:Y?x2(X):""}},l2=($,Z,J)=>J?.ip===!0&&$.has("{ip}")?b2(Z):"",n2=($)=>$!==null&&$!==void 0&&typeof $==="object"&&!Array.isArray($)&&Object.keys($).length>0,i2=($,Z,J)=>{if(!$.has("{context}"))return"";if(J?.showContextTree!==!1&&n2(Z.context))return"";return g2(Z.context)},a2=($,Z,J,Q,Y,B)=>{let X=$.has("{duration}"),G=$.has("{speed}");if(!(X||G))return{coloredDuration:"",speedToken:""};let j=B?.durationMs??L(Z.beforeTime),{text:H,isVerySlow:N}=C2(j,J,Q,Y);return{coloredDuration:X?H:"",speedToken:G?w2(N,J):""}},s2=($,Z)=>{if(!$.has("{requestId}"))return"";let J=Z.context;if(typeof J!=="object"||J===null||!("requestId"in J))return"";return R(String(J.requestId),128)},c0=({level:$,request:Z,data:J,store:Q,options:Y,formatContext:B,precomputed:X})=>{let{config:G}=Y,{format:j,serviceToken:H,slowThreshold:N,tokens:K,useColors:I,verySlowThreshold:O}=B??G0(Y),{timestamp:M,epoch:C}=c2(K,G?.timestamp?.translateTime,I),_=p2(K,J),{coloredPathname:w,query:S}=d2(K,Z,G,I,X),{coloredStatus:A,statusText:P}=u2(K,J,I),x=l2(K,Z,G),y=i2(K,J,G),W=K.has("{level}")?T2($,I):"",z=K.has("{method}")?E2(Z.method.toUpperCase().padEnd(F2),I):"",{coloredDuration:V,speedToken:U}=a2(K,Q,I,N,O,X),D=K.has("{icon}")?P2($,I):"",b=s2(K,J),d={"{context}":y,"{duration}":V,"{epoch}":C,"{icon}":D,"{ip}":x,"{level}":W,"{message}":_,"{method}":z,"{now}":M,"{path}":w,"{pathname}":w,"{query}":S,"{requestId}":b,"{service}":H,"{speed}":U,"{status}":A,"{statusText}":P},u=j.replace(m0,(I0)=>d[I0]??I0);return{contextLines:h2($,J,Y,I),main:u}};var z0=i("transport","transport failed"),o2=1024,q=new Set,t2=($)=>{if(q.size>=o2){let Z=q.values().next().value;if(Z)q.delete(Z)}q.add($),$.finally(()=>q.delete($)).catch(()=>{return})},p0=($)=>{let{level:Z,request:J,data:Q,store:Y,options:B,precomputed:X}=$,G=B.config?.transports??[];if(G.length===0)return;let j=B.config?.onError,H=typeof Q.message==="string"?Q.message:"",N={request:{method:J.method,url:J.url},...Q,durationMs:X?.durationMs??L(Y.beforeTime)};for(let K of G)try{let I=K.log(Z,H,N);if(I&&typeof I.catch==="function"){let O=I;t2(O),O.catch((M)=>z0(M,j))}}catch(I){z0(I,j)}},d0=($,Z)=>{let J=$.config?.onError;return($.config?.transports??[]).map((Q)=>Promise.resolve().then(()=>Q[Z]?.()).catch((Y)=>z0(Y,J)))},u0=async($)=>{await Promise.allSettled([...q,...d0($,"flush")])},l0=async($)=>{await Promise.allSettled(d0($,"close"))};import{open as G1}from"node:fs/promises";import{dirname as z1}from"node:path";import{promises as r2}from"node:fs";var n0=async($,Z=448)=>{await r2.mkdir($,{mode:Z,recursive:!0})};import{promises as E}from"node:fs";import{promisify as e2}from"node:util";import{gzip as $1}from"node:zlib";var i0=()=>{let $=new Map;return{acquire:async(J)=>{let Q=$.get(J)??Promise.resolve(),Y,B=new Promise((X)=>{Y=X});return $.set(J,B),await Q,()=>{if(Y?.(),$.get(J)===B)$.delete(J)}}}};var Z1=e2($1),J1=i0(),a0=($,Z,J)=>{if(J){J(Z);return}console.error($,Z)},g=($)=>String($).padStart(2,"0"),Q1=($,Z)=>{let J=Z.getFullYear(),Q=g(Z.getMonth()+1),Y=g(Z.getDate()),B=g(Z.getHours()),X=g(Z.getMinutes()),G=g(Z.getSeconds()),j=String(Z.getMilliseconds()).padStart(3,"0");return`${$}.${J}-${Q}-${Y}-${B}-${X}-${G}-${j}`},Y1=async($)=>{try{if((await E.stat($)).size===0)return""}catch{return""}let J=`${Q1($,new Date)}-${process.hrtime.bigint()}`;return await E.rename($,J),J},B1=async($,Z)=>{let J=await J1.acquire($);try{try{await E.access($)}catch{return}let Q=await E.readFile($),Y=await Z1(Q);await E.writeFile(`${$}.gz`,Y),await E.rm($,{force:!0})}catch(Q){throw a0(`[logixlysia] Failed to compress file ${$}:`,Q,Z),Q}finally{J()}};var X1=($)=>$.status==="fulfilled",j1=async($,Z,J)=>{let Q=await O0($);if(Q.length===0)return;if(Z.type==="count"&&Q.length<=Z.value)return;let B=(await Promise.allSettled(Q.map(async(j)=>({path:j,stat:await E.stat(j)})))).filter(X1).map((j)=>j.value),X;if(Z.type==="count"){if(B.length<=Z.value)return;B.sort((j,H)=>H.stat.mtimeMs-j.stat.mtimeMs),X=B.slice(Z.value)}else{let j=Date.now();X=B.filter(({stat:H})=>j-H.mtimeMs>Z.value)}(await Promise.allSettled(X.map(({path:j})=>E.rm(j,{force:!0})))).forEach((j,H)=>{if(j.status==="rejected")a0(`[logixlysia] Failed to delete rotated log ${X[H].path}:`,j.reason,J)})},s0=async($,Z,J)=>{let Q=await Y1($);if(!Q)return;if(Z.compress===!0){if((Z.compression??"gzip")==="gzip")try{await B1(Q,J)}catch{}}if(Z.maxFiles!==void 0){let B=l(Z.maxFiles);await j1($,B,J)}};var H1=($,Z)=>$&&$>0?$:Z;class o0{filePath;handle=null;bytesWritten=0;openedAt=0;latestOptions={};pendingBatch=null;flushChain=Promise.resolve();constructor($){this.filePath=$}write($,Z){return this.latestOptions=Z,new Promise((J,Q)=>{if(this.pendingBatch){this.pendingBatch.lines.push($),this.pendingBatch.resolvers.push({reject:Q,resolve:J});return}let Y={lines:[$],resolvers:[{reject:Q,resolve:J}]};this.pendingBatch=Y,queueMicrotask(()=>{this.pendingBatch=null,this.flushChain=this.flushChain.then(()=>this.flushBatch(Y),()=>this.flushBatch(Y))})})}async flushBatch($){let Z=this.latestOptions,J=$.lines.join("");try{await this.ensureOpen(Z),await this.handle.write(J),this.bytesWritten+=Buffer.byteLength(J)}catch(Q){for(let Y of $.resolvers)Y.reject(Q);return}await this.maybeRotate(Z);for(let Q of $.resolvers)Q.resolve()}async ensureOpen($){if(this.handle)return;await n0(z1(this.filePath),$.logDirMode);let Z=await G1(this.filePath,"a",$.logFileMode??384),J=await Z.stat();this.handle=Z,this.bytesWritten=J.size,this.openedAt=H1(J.birthtimeMs,Date.now())}shouldRotateNow($){if($.maxSize!==void 0&&this.bytesWritten>k($.maxSize))return!0;return $.interval!==void 0&&Date.now()-this.openedAt>=m($.interval)}async maybeRotate($){let Z=$.logRotation;if(!Z||Z.maxSize===void 0&&Z.interval===void 0)return;try{if(!this.shouldRotateNow(Z))return;let{handle:J}=this;this.handle=null,this.bytesWritten=0,this.openedAt=Date.now(),await J?.close(),await s0(this.filePath,Z,$.onRotationError)}catch(J){if($.onRotationError)$.onRotationError(J);else console.error(`[logixlysia] Failed to rotate log file ${this.filePath}:`,J)}}async flush(){await Promise.resolve(),await this.flushChain}async close(){await this.flush();let{handle:$}=this;this.handle=null,await $?.close(),c.delete(this.filePath)}}var c=new Map,t0=($)=>{let Z=c.get($);if(!Z)Z=new o0($),c.set($,Z);return Z},r0=async()=>{await Promise.allSettled([...c.values()].map(($)=>$.flush()))},e0=async()=>{await Promise.allSettled([...c.values()].map(($)=>$.close()))};var W1=($,Z,J)=>{if(J){let{pathname:Q,search:Y}=J;return Z?`${Q}${Y}`:Q}try{let{pathname:Q,search:Y}=new URL($.url);return Z?`${Q}${Y}`:Q}catch{return $.url}},$$=($,Z,J,Q)=>{let Y=$?.onError;if(!Y){console.error(J,Q);return}try{Y({error:Q,sink:Z})}catch{}},Z$=async($)=>{let{filePath:Z,level:J,request:Q,data:Y,store:B,options:X,precomputed:G}=$,{config:j}=X,H=j?.useTransportsOnly===!0,N=j?.disableFileLogging===!0;if(H||N)return;let K=typeof Y.message==="string"?Y.message:"",I=G?.durationMs??L(B.beforeTime),O=W1(Q,j?.logQueryParams,G),M=`${J} ${I.toFixed(2)}ms ${Q.method} ${R(O,1024)} ${R(K)}
|
|
3
|
-
`,C=j?.onError?(_)=>$$(j,"rotation","",_):void 0;try{await t0(Z).write(M,{logDirMode:j?.logDirMode,logFileMode:j?.logFileMode,logRotation:j?.logRotation,onRotationError:C})}catch(_){throw $$(j,"file",`[logixlysia] Failed to write to log file ${Z}:`,_),_}};var $0=($)=>{let Z=$?.useTransportsOnly===!0,J=$?.disableInternalLogger===!0,Q=$?.disableFileLogging===!0,Y=($?.transports?.length??0)>0,B=!(Z||Q)&&!!$?.logFilePath,X=!(Z||J);return{hasFileLogging:B,hasInternalLogger:X,hasTransports:Y,isEffectivelyDisabled:!(Y||B||X),needsUrlParts:B||X}},f=($,Z)=>{if(!Z?.level||Z.level.length===0)return!0;return Z.level.includes($)},H0=($)=>{try{let{pathname:Z,search:J}=new URL($.url);return{pathname:Z,search:J}}catch{return{pathname:$.url||"/",search:""}}},
|
|
1
|
+
import{k as R}from"./shared/Logixlysia-nrt7tysy.js";import{Elysia as b1}from"elysia";import{promises as W$}from"node:fs";import{basename as V$,dirname as N$}from"node:path";var K$=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,U$=/^(\d+)(h|d|w)$/i,F$=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,k=($)=>{if(typeof $==="number"){if(!Number.isFinite($)||$<=0)throw Error(`Invalid size: ${$}`);return $}let Z=$.trim();if(Z!==""){let X=Number(Z);if(Number.isFinite(X)){if(X<=0)throw Error(`Invalid size: ${$}`);return X}}let J=Z.match(K$);if(!J)throw Error(`Invalid size format: ${$}`);let Q=Number(J[1]),Y=J[2].toLowerCase(),B=1024;if(Y.startsWith("m"))B=1048576;else if(Y.startsWith("g"))B=1073741824;return Math.floor(Q*B)},m=($)=>{let Z=$.trim().match(U$);if(!Z)throw Error(`Invalid interval format: ${$}`);let J=Number(Z[1]),Q=Z[2].toLowerCase(),Y=3600000;if(Q==="d")Y=86400000;else if(Q==="w")Y=604800000;return J*Y},l=($)=>{if(typeof $==="number"){if(!(Number.isInteger($)&&$>0))throw Error(`maxFiles must be a positive integer, got ${$}`);return{type:"count",value:$}}return{type:"time",value:m($)}};var O0=async($)=>{let Z=N$($),J=V$($),Q;try{Q=await W$.readdir(Z)}catch{return[]}return Q.filter((Y)=>Y.startsWith(`${J}.`)&&F$.test(Y)).map((Y)=>`${Z}/${Y}`)};var I$=["dev","prod","json"],O$=($)=>{let Z=$?.logRotation;if(!Z)return;try{if(Z.maxSize!==void 0)k(Z.maxSize);if(Z.maxFiles!==void 0)l(Z.maxFiles);if(Z.interval!==void 0)m(Z.interval);if(Z.compression!==void 0&&Z.compression!=="gzip")throw Error(`Invalid compression algorithm: ${Z.compression}`)}catch(J){let Q=J instanceof Error?J.message:String(J);throw Error(`logixlysia: invalid logRotation config — ${Q}`,{cause:J})}},M$=100,D$=($)=>typeof $==="number"&&Number.isFinite($)&&$>=0&&$<=M$,n=($)=>typeof $==="number"&&Number.isFinite($)&&$>=0,_$=["DEBUG","INFO","WARNING","ERROR"],A$=($)=>{let Z=$?.sampling;if(!Z)return;let J=(B)=>{throw Error(`logixlysia: invalid sampling config — ${B}`)};for(let[B,X]of Object.entries(Z.head??{})){if(!_$.includes(B))J(`head.${B} is not a valid level (must be DEBUG, INFO, WARNING, or ERROR)`);if(!D$(X))J(`head.${B} must be a number between 0 and 100`)}let{tail:Q}=Z;if(Q?.status!==void 0&&!n(Q.status))J("tail.status must be a non-negative number");if(Q?.durationMs!==void 0&&!n(Q.durationMs))J("tail.durationMs must be a non-negative number");if(Q?.paths!==void 0){if(!Array.isArray(Q.paths))J("tail.paths must be an array");if(Q.paths.some((B)=>typeof B!=="string"||B.length===0))J("tail.paths must contain non-empty glob strings")}let{maxBufferedPerRequest:Y}=Z;if(Y!==void 0&&!(Number.isInteger(Y)&&Y>=0))J("maxBufferedPerRequest must be a non-negative integer")},b$=($)=>{let Z=$?.slowThreshold,J=$?.verySlowThreshold,Q=(Y)=>{throw Error(`logixlysia: invalid formatting config — ${Y}`)};if(Z!==void 0&&!n(Z))Q(`slowThreshold must be a finite non-negative number, got ${Z}`);if(J!==void 0&&!n(J))Q(`verySlowThreshold must be a finite non-negative number, got ${J}`);if(Z!==void 0&&J!==void 0&&Z>J)Q(`slowThreshold (${Z}) must not exceed verySlowThreshold (${J})`)},L$={dev:{pino:{prettyPrint:!0},showContextTree:!0,showStartupMessage:!0,startupMessageFormat:"banner",useColors:!0},json:{pino:{prettyPrint:!1},showContextTree:!1,showStartupMessage:!1,useColors:!1},prod:{autoRedact:!0,pino:{prettyPrint:!1},requestId:!0,showContextTree:!1,showStartupMessage:!1,useColors:!1}},R$=($,Z)=>{if(!Z)return $;let J={...$,...Z};if($.pino||Z.pino)J.pino={...$.pino,...Z.pino,...$.pino?.prettyPrint!==void 0||Z.pino?.prettyPrint!==void 0?{prettyPrint:Z.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||Z.logFilter)J.logFilter={...$.logFilter,...Z.logFilter};if($.sampling||Z.sampling)J.sampling={...$.sampling,...Z.sampling};if($.logRotation||Z.logRotation)J.logRotation={...$.logRotation,...Z.logRotation};if($.timestamp||Z.timestamp)J.timestamp={...$.timestamp,...Z.timestamp};return J},Z0=($={})=>{let{preset:Z}=$;if(Z&&!I$.includes(Z))throw Error(`logixlysia: invalid preset — ${Z}`);let J=Z?{...$,config:R$(L$[Z],$.config)}:$;return O$(J.config),A$(J.config),b$(J.config),J};var i=($,Z)=>{let J=0;return(Q,Y)=>{if(Y){try{Y({error:Q,sink:$})}catch{}return}let B=Date.now();if(B-J<5000)return;J=B,console.error(`[logixlysia] ${Z}:`,Q)}};var C$=i("enricher","enricher failed"),M0=($)=>{if(!$?.length)return;let Z=[],J=[];for(let Q of $){if(typeof Q==="function"){Z.push(Q);continue}if(Q.request)Z.push(Q.request);if(Q.response)J.push(Q.response)}return Z.length===0&&J.length===0?void 0:{request:Z,response:J}},D0=($,Z,J,Q,Y)=>{for(let B of $){let X;try{X=B(Z)}catch(G){C$(G,Y);continue}if(X)J.mergeContext(Q,X)}},_0=($,Z,J,Q)=>{D0($.request,J,Z,J,Q)},A0=($,Z,J,Q)=>{D0($.response,J,Z,J.request,Q)};var w$=Object.freeze({}),a=()=>{let $=new WeakMap,Z=(J)=>{let Q=$.get(J);if(!Q)Q={},$.set(J,Q);return Q};return{clearContext(J){$.delete(J)},getContext(J){let Q=$.get(J);return Q?{...Q}:{}},mergeContext(J,Q){if(Object.keys(Q).length===0)return;let Y=Z(J);Object.assign(Y,Q)},peekContext(J){return $.get(J)??w$}}},b0=($,Z)=>{let J=$.context,Q=Object.keys(Z).length>0,Y=J!==void 0&&J!==null&&typeof J==="object"&&!Array.isArray(J)&&Object.keys(J).length>0;if(!(Q||Y))return $;let B={...Z,...Y?J:{}};return{...$,context:B}};import{AsyncLocalStorage as P$}from"node:async_hooks";var s=new P$,J0={debug:()=>{return},error:()=>{return},info:()=>{return},mergeContext:()=>{return},warn:()=>{return}},T$=()=>s.getStore()??J0;import{createRequire as L0}from"node:module";var E$=(()=>{try{return L0(import.meta.url)("elysia/package.json")}catch{return{}}})(),S$=(()=>{try{return L0(import.meta.url)("../../package.json")}catch{return{}}})(),f$=($,Z)=>{if($.length>=Z)return $.slice(0,Z);let J=Math.floor((Z-$.length)/2),Q=Z-$.length-J;return`${" ".repeat(J)}${$}${" ".repeat(Q)}`},R0=($,Z)=>{let{version:J}=E$,Q=J?`Elysia v${J}`:"Elysia",Y=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(Z)Y.push({kind:"left",text:Z});Y.push({kind:"empty"});let X=Math.max(Q.length,$.length,...Z?[Z.length]:[0])+4,G=`┌${"─".repeat(X)}┐`,j=`└${"─".repeat(X)}┘`,H=`│${" ".repeat(X)}│`,N=[G];for(let K of Y){if(K.kind==="empty"){N.push(H);continue}if(K.kind==="center"){N.push(`│${f$(K.text,X)}│`);continue}let{text:I}=K,O=Math.max(0,X-I.length-4);N.push(`│ ${I}${" ".repeat(O)} │`)}return N.push(j),N.join(`
|
|
2
|
+
`)},C0=()=>{let $=S$.version;if(!$)return null;return` logixlysia v${$}`};var Q0=($,Z)=>{if(!(Z.config?.showStartupMessage??!0))return;let{port:Q,hostname:Y,protocol:B}=$;if(Q===void 0||!Y||!B)return;let X=`${B}://${Y}:${Q}`,G=`\uD83E\uDD8A Elysia is running at ${X}`,j=`\uD83E\uDD8A ${X}`;if((Z.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(R0(j,C0()))};import{StatusMap as q$}from"elysia";var x$=/^\d+$/,y$=/[_-]+/g,k$=/([a-z0-9])([A-Z])/g,m$=/([A-Z])([A-Z][a-z])/g,v$=/['’]/g,h$=/[^a-z0-9\s]+/g,g$=/\s+/g,w0=($)=>{let Z=$.trim();if(!Z)return"";return Z.replace(y$," ").replace(k$,"$1 $2").replace(m$,"$1 $2").replace(v$,"").toLowerCase().replace(h$," ").replace(g$," ").trim()},c$=(()=>{let $=new Map;for(let[Z,J]of Object.entries(q$))$.set(w0(Z),J);return $})(),o=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let Z=$.trim();if(x$.test(Z))return Number(Z);return c$.get(w0(Z))??500}return 500};import Q$ from"pino";import F1 from"pino-pretty";var p$=/[.*+?^${}()|[\]\\]/g,d$=/\*\*.*\*\*/,u$=/\*\*/,l$=/[a-zA-Z0-9]/,n$=($)=>$.replace(p$,"\\$&"),i$=($)=>{if(!d$.test($))return!1;let Z=$.split(u$);for(let J=1;J<Z.length;J+=1){let Q=Z[J];if(Q===""||Q.length<2&&!l$.test(Q))return!0}return!1},P0=($)=>{if(i$($))throw Error("Invalid glob pattern: repeated recursive wildcards (**) can cause performance issues");let Z="",J=0;while(J<$.length){let Q=$[J];if(Q==="*"){let Y=$[J+1]==="*";Z+=Y?".*":"[^/]*",J+=Y?2:1;continue}if(Q==="?"){Z+="[^/]",J+=1;continue}Z+=n$(Q),J+=1}return new RegExp(`^${Z}$`)};var t=100,a$=100,T0=Object.freeze([]),s$=($)=>{if(!$)return;let Z=$.paths?.length?$.paths.map(P0):void 0;if($.durationMs===void 0&&$.status===void 0&&Z===void 0)return;return{durationMs:$.durationMs,paths:Z,status:$.status}},o$=($,Z)=>{if($.status!==void 0&&Z.status>=$.status)return!0;if($.durationMs!==void 0&&Z.durationMs>=$.durationMs)return!0;if($.paths){for(let J of $.paths)if(J.test(Z.pathname))return!0}return!1},t$=($)=>{if(!$)return;let Z={},J=!1;for(let[Q,Y]of Object.entries($))if(typeof Y==="number"&&Y<t)Z[Q]=Y,J=!0;return J?Z:void 0},Y0=($,Z=Math.random)=>{let J=t$($?.head);if(!J)return;let Q=s$($?.tail),Y=$?.maxBufferedPerRequest??a$,B=new WeakMap,X=new WeakSet,G=new WeakSet;return{begin(j){if(Q)X.add(j)},buffer(j,H){let N=B.get(j);if(!N)N=[],B.set(j,N);if(N.length>=Y)return;N.push(H)},decide(j,H){if(G.has(H))return"keep";let N=J[j]??t;if(N>=t||N>0&&Z()*t<N)return"keep";return Q&&X.has(H)?"buffer":"drop"},finalize(j,H){X.delete(j);let N=B.get(j);if(B.delete(j),!(Q&&o$(Q,H)))return T0;return G.add(j),N??T0}}};var L=($)=>$===BigInt(0)?0:Number(process.hrtime.bigint()-$)/1e6;var r$=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,e$=/(?<![\w/.])(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?![\w.])/g,$2=/(?<![\w:])(?:(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|(?:[0-9a-f]{1,4}:){1,7}:(?:[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){0,6})?|::(?:[0-9a-f]{1,4}(?::[0-9a-f]{1,4}){0,6}))(?![\w:])/gi,Z2=/\b(?:\d[ -]*?){13,19}\b/g,J2=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var S0=["authorization","proxy-authorization","cookie","set-cookie","x-api-key","api-key","apikey","x-auth-token","password","passwd","secret","client-secret","token","access-token","refresh-token","id-token","session","session-id","private-key","credit-card","card-number","cvv","ssn"],Q2=/([a-z0-9])([A-Z])/g,E0=($)=>$.replace(Q2,"$1-$2").replaceAll("_","-").toLowerCase(),r=($,Z)=>{let J=E0($);if(S0.includes(J))return!0;return Z?.some((Q)=>E0(Q)===J)??!1},f0=($)=>{return[...S0,...$??[]].flatMap((J)=>{if(J.includes("-"))return[`["${J}"]`,`*["${J}"]`];return[J,`*.${J}`]})};var B0=($)=>T($).replaceAll("[REDACTED]","redacted"),Y2=($,Z)=>{try{let J=new URL($);if(J.username!=="")J.username=B0(J.username);if(J.password!=="")J.password=B0(J.password);J.hostname=B0(J.hostname),J.pathname=T(J.pathname);for(let Q of[...J.searchParams.keys()]){if(r(Q,Z)){J.searchParams.set(Q,"redacted");continue}let Y=J.searchParams.get(Q);if(Y!==null){let B=T(Y);if(B!==Y)J.searchParams.set(Q,B)}}return J.hash=T(J.hash),J.toString()}catch{return T($).replaceAll("[REDACTED]","redacted")}},B2=($)=>{if($.length<13||$.length>19)return!1;let Z=0,J=!1;for(let Q=$.length-1;Q>=0;Q-=1){let Y=$.charCodeAt(Q);if(Y<48||Y>57)return!1;let B=Y-48;if(J){if(B*=2,B>9)B-=9}Z+=B,J=!J}return Z%10===0},X2=($)=>$.replace(Z2,(Z)=>{let J=Z.replace(/\D/g,"");if(J.length>=13&&J.length<=19&&B2(J))return"[REDACTED]";return Z}),T=($)=>{let Z=$;return Z=Z.replace(r$,"[REDACTED]"),Z=Z.replace(e$,"[REDACTED]"),Z=Z.replace($2,"[REDACTED]"),Z=X2(Z),Z=Z.replace(J2,"[REDACTED]"),Z},j2=($,Z,J)=>{let Q=T($.message),Y=Object.getPrototypeOf($),B=Object.create(Y);if(B.message=Q,B.name=$.name,$.stack!==void 0)B.stack=T($.stack);let X=$;for(let G of Object.getOwnPropertyNames(X)){if(G==="message"||G==="name"||G==="stack")continue;let j=Object.getOwnPropertyDescriptor(X,G);if(j===void 0)continue;if(j.get!==void 0||j.set!==void 0){Object.defineProperty(B,G,j);continue}let H=r(G,J)?"[REDACTED]":e(j.value,Z,J);Object.defineProperty(B,G,{...j,value:H})}return B},G2=($,Z,J)=>{let Q;for(let[Y,B]of $.entries()){let X=e(B,Z,J);if(Q===void 0&&X!==B)Q=$.slice(0,Y);Q?.push(X)}return Q??$},z2=($,Z,J)=>{let Q=Object.keys($),Y;for(let[B,X]of Q.entries()){let G=$[X],j=r(X,J),H=j?"[REDACTED]":e(G,Z,J);if(Y===void 0&&(j||H!==G)){Y={};for(let N of Q.slice(0,B))Y[N]=$[N]}if(Y!==void 0)Y[X]=H}return Y??$},X0=($,Z,J)=>{Z.add($);try{return J()}finally{Z.delete($)}},e=($,Z,J)=>{if($===null||$===void 0)return $;if(typeof $==="string")return T($);if(typeof $!=="object")return $;if($ instanceof Date)return $;let Y=$;if(Z.has(Y))return"[Circular]";if($ instanceof Error)return X0(Y,Z,()=>j2($,Z,J));if(Array.isArray($))return X0(Y,Z,()=>G2($,Z,J));return X0(Y,Z,()=>z2($,Z,J))},q0=($,Z)=>e($,new WeakSet,Z),x0=($,Z)=>{let J=Y2($.url,Z),Q=new Headers,Y=!1;for(let[H,N]of $.headers.entries()){let K=r(H,Z)?"[REDACTED]":T(N);if(K!==N)Y=!0;Q.set(H,K)}let B=T($.method),X=J!==$.url,G=B!==$.method;if(!(X||Y||G))return $;let j={headers:Q,method:B,redirect:$.redirect,signal:$.signal};return new Request(J,j)};import{STATUS_CODES as V2}from"node:http";import F from"chalk";var v=($)=>{if($ instanceof Error)return $.message;if($&&typeof $==="object"&&"message"in $)return $.message;return String($)},j0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("code"in $)||("internal"in $)),H2=($)=>$ instanceof Error&&($.code==="VALIDATION"||$.name==="ValidationError"||$.constructor?.name==="ValidationError"),W2=["code","fix","internal","link","message","name","status","why"],y0=($)=>{let Z={};for(let J of W2)if($[J]!==void 0)Z[J]=$[J];return Z},k0=($,Z)=>{if(H2($)&&!Z){let Q=(Array.isArray($.all)?$.all:[]).map((X)=>typeof X==="object"&&X!==null&&("path"in X)?String(X.path):"").filter(Boolean),Y=typeof $.type==="string"?$.type:"request",B=Q.length>0?`Validation failed (${Y}): ${Q.join(", ")}`:`Validation failed (${Y})`;return{error:{failedPaths:Q,name:"ValidationError",type:Y},message:B}}if($ instanceof Error){let J=y0($);return J.message=$.message,J.name=$.name==="Error"?$.constructor?.name??$.name:$.name,{error:J,message:v($)}}if(j0($))return{error:y0($),message:v($)};return{error:{value:String($)},message:v($)}};var h=($)=>String($).padStart(2,"0"),N2=($)=>String($).padStart(3,"0"),K2=500,U2=1000,F2=7,I2="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",m0=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,v0=($)=>{let{config:Z}=$,J=Z?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return J&&Q},O2="yyyy-mm-dd HH:MM:ss.SSS",M2=/^sys:/i,D2=/^utc:/i,_2=($)=>{let Z=$,J=!1;if(M2.test(Z))Z=Z.slice(4);else if(D2.test(Z))Z=Z.slice(4),J=!0;return{pattern:Z==="standard"?O2:Z,utc:J}},A2=($,Z)=>{if(!Z)return $.toISOString();let{pattern:J,utc:Q}=_2(Z),Y=String(Q?$.getUTCFullYear():$.getFullYear()),B=h((Q?$.getUTCMonth():$.getMonth())+1),X=h(Q?$.getUTCDate():$.getDate()),G=h(Q?$.getUTCHours():$.getHours()),j=h(Q?$.getUTCMinutes():$.getMinutes()),H=h(Q?$.getUTCSeconds():$.getSeconds()),N=N2(Q?$.getUTCMilliseconds():$.getMilliseconds());return J.replaceAll("yyyy",Y).replaceAll("mm",B).replaceAll("dd",X).replaceAll("HH",G).replaceAll("MM",j).replaceAll("ss",H).replaceAll("SSS",N)},b2=($)=>{let Z=$.headers.get("x-forwarded-for"),J=Z?Z.split(",")[0]?.trim()??"":$.headers.get("x-real-ip")??"";return R(J,64)},L2=($)=>{if($>=1000){let Z=$/1000;if(Z>=10)return`${Math.round(Z)}s`;let J=Z.toFixed(1);return J.endsWith(".0")?`${Math.round(Z)}s`:`${J}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},R2=($)=>{let{config:Z}=$;return{slow:Z?.slowThreshold??K2,verySlow:Z?.verySlowThreshold??U2}},C2=($,Z,J,Q)=>{let Y=L2($),B=$>=Q;if(!Z)return{isVerySlow:B,text:Y};let X=Y;if($<J)X=F.green(Y);else if($<Q)X=F.yellow(Y);else X=F.red.bold(Y);return{isVerySlow:B,text:X}},w2=($,Z)=>{if(!$)return"";let J="⚡ slow";if(!Z)return` ${J}`;return` ${F.yellow(J)}`},P2=($,Z)=>{if(!Z)return"\uD83E\uDD8A";if($==="ERROR")return F.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return F.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return F.bgBlue.black(" \uD83E\uDD8A ");return F.bgGreen.black(" \uD83E\uDD8A ")},T2=($,Z)=>{if(!Z)return $;if($==="ERROR")return F.bgRed.black($);if($==="WARNING")return F.bgYellow.black($);if($==="DEBUG")return F.bgBlue.black($);return F.bgGreen.black($)},E2=($,Z)=>{if(!Z)return $;let J=$.toUpperCase();if(J==="GET")return F.green.bold(J);if(J==="POST")return F.blue.bold(J);if(J==="PUT")return F.yellow.bold(J);if(J==="PATCH")return F.yellowBright.bold(J);if(J==="DELETE")return F.red.bold(J);if(J==="OPTIONS")return F.cyan.bold(J);if(J==="HEAD")return F.greenBright.bold(J);if(J==="TRACE")return F.magenta.bold(J);if(J==="CONNECT")return F.cyanBright.bold(J);return F.white.bold(J)},S2=($,Z)=>{let J=$.toUpperCase(),Q=" ".repeat(Math.max(0,F2-J.length));return E2(J,Z)+Q},f2=($,Z)=>{if(!Z)return $;let J=Number.parseInt($,10);if(!Number.isFinite(J))return $;if(J>=500)return F.red($);if(J>=400)return F.yellow($);if(J>=300)return F.cyan($);if(J>=200)return F.green($);return F.gray($)},q2=($,Z)=>{if(!Z)return $;return F.gray($)},x2=($,Z)=>{if(!Z)return $;return F.whiteBright($)},y2=($)=>{return V2[$]??""},k2=($,Z)=>{let J=$.config?.service?.trim();if(!J)return"";let Q=`[${J}]`;if(!Z)return`${Q} `;return`${F.dim(Q)} `},G0=($)=>{let{config:Z}=$,J=v0($),Q=Z?.customLogFormat??I2,Y=new Set(Q.match(m0)??[]),{slow:B,verySlow:X}=R2($),G=k2($,J);return{format:Q,serviceToken:G,slowThreshold:B,tokens:Y,useColors:J,verySlowThreshold:X}},h0=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return R($);if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return R($.message);try{return R(JSON.stringify($))}catch{return R(String($))}},m2=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),g0=($,Z,J)=>{let Q=[];for(let[Y,B]of Object.entries($)){let X=Z?`${Z}.${Y}`:Y;if(m2(B)&&J>1)Q.push(...g0(B,X,J-1));else Q.push([X,h0(B)])}return Q},v2=($,Z)=>{if($.length===0)return[];let J=[],Q=$.length-1;for(let Y=0;Y<$.length;Y+=1){let B=Y===Q?"└─":"├─",X=$[Y];if(!X)continue;let[G,j]=X,H=Z?F.cyan(G):G,N=Z?F.white(j):j;J.push(` ${B} ${H} ${N}`)}return J},h2=($)=>{let Z=[],J=v($);if(J)Z.push(["error",R(J)]);if(j0($)){if($.code!==void 0)Z.push(["error.code",String($.code)]);if($.why!==void 0)Z.push(["error.why",String($.why)]);if($.fix!==void 0)Z.push(["error.fix",String($.fix)]);if($.link!==void 0)Z.push(["error.link",String($.link)]);if($.internal!==void 0)Z.push(["error.internal",h0($.internal)])}return Z},g2=($,Z,J,Q=v0(J))=>{if(J.config?.showContextTree===!1)return[];let Y=J.config?.contextDepth??1,B=[],X=Z.context;if(X&&typeof X==="object"&&!Array.isArray(X)&&Object.keys(X).length>0&&Y>=1)B.push(...g0(X,"",Y));if(($==="ERROR"||$==="WARNING")&&Z.error!==void 0)B.push(...h2(Z.error));return v2(B,Q)},c2=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},p2=($,Z,J)=>{if(!($.has("{now}")||$.has("{epoch}")))return{epoch:"",timestamp:""};let Q=new Date,Y=$.has("{epoch}")?String(Q.getTime()):"";if(!$.has("{now}"))return{epoch:Y,timestamp:""};let B=A2(Q,Z);return{epoch:Y,timestamp:q2(B,J)}},d2=($,Z)=>{if(!$.has("{message}"))return"";return typeof Z.message==="string"?R(Z.message):""},u2=($,Z,J,Q,Y)=>{let B=$.has("{pathname}")||$.has("{path}"),X=$.has("{query}");if(!(B||X))return{coloredPathname:"",query:""};let G,j;if(Y)({pathname:G,search:j}=Y);else try{({pathname:G,search:j}=new URL(Z.url))}catch{G=R(Z.url||"/",1024),j=""}let H=X?j:"";if(!B)return{coloredPathname:"",query:H};let N=J?.logQueryParams?`${G}${j}`:G;return{coloredPathname:x2(N,Q),query:H}},l2=($,Z,J)=>{let Q=$.has("{status}"),Y=$.has("{statusText}");if(!(Q||Y))return{coloredStatus:"",statusText:""};let B=Z.status,X=B===null||B===void 0?200:o(B);return{coloredStatus:Q?f2(String(X),J):"",statusText:Y?y2(X):""}},n2=($,Z,J)=>J?.ip===!0&&$.has("{ip}")?b2(Z):"",i2=($)=>$!==null&&$!==void 0&&typeof $==="object"&&!Array.isArray($)&&Object.keys($).length>0,a2=($,Z,J)=>{if(!$.has("{context}"))return"";if(J?.showContextTree!==!1&&i2(Z.context))return"";return c2(Z.context)},s2=($,Z,J,Q,Y,B)=>{let X=$.has("{duration}"),G=$.has("{speed}");if(!(X||G))return{coloredDuration:"",speedToken:""};let j=B?.durationMs??L(Z.beforeTime),{text:H,isVerySlow:N}=C2(j,J,Q,Y);return{coloredDuration:X?H:"",speedToken:G?w2(N,J):""}},o2=($,Z)=>{if(!$.has("{requestId}"))return"";let J=Z.context;if(typeof J!=="object"||J===null||!("requestId"in J))return"";return R(String(J.requestId),128)},c0=({level:$,request:Z,data:J,store:Q,options:Y,formatContext:B,precomputed:X})=>{let{config:G}=Y,{format:j,serviceToken:H,slowThreshold:N,tokens:K,useColors:I,verySlowThreshold:O}=B??G0(Y),{timestamp:M,epoch:C}=p2(K,G?.timestamp?.translateTime,I),_=d2(K,J),{coloredPathname:w,query:S}=u2(K,Z,G,I,X),{coloredStatus:A,statusText:P}=l2(K,J,I),x=n2(K,Z,G),y=a2(K,J,G),W=K.has("{level}")?T2($,I):"",z=K.has("{method}")?S2(Z.method,I):"",{coloredDuration:V,speedToken:U}=s2(K,Q,I,N,O,X),D=K.has("{icon}")?P2($,I):"",b=o2(K,J),d={"{context}":y,"{duration}":V,"{epoch}":C,"{icon}":D,"{ip}":x,"{level}":W,"{message}":_,"{method}":z,"{now}":M,"{path}":w,"{pathname}":w,"{query}":S,"{requestId}":b,"{service}":H,"{speed}":U,"{status}":A,"{statusText}":P},u=j.replace(m0,(I0)=>d[I0]??I0);return{contextLines:g2($,J,Y,I),main:u}};var z0=i("transport","transport failed"),t2=1024,q=new Set,r2=($)=>{if(q.size>=t2){let Z=q.values().next().value;if(Z)q.delete(Z)}q.add($),$.finally(()=>q.delete($)).catch(()=>{return})},p0=($)=>{let{level:Z,request:J,data:Q,store:Y,options:B,precomputed:X}=$,G=B.config?.transports??[];if(G.length===0)return;let j=B.config?.onError,H=typeof Q.message==="string"?Q.message:"",N={request:{method:J.method,url:J.url},...Q,durationMs:X?.durationMs??L(Y.beforeTime)};for(let K of G)try{let I=K.log(Z,H,N);if(I&&typeof I.catch==="function"){let O=I;r2(O),O.catch((M)=>z0(M,j))}}catch(I){z0(I,j)}},d0=($,Z)=>{let J=$.config?.onError;return($.config?.transports??[]).map((Q)=>Promise.resolve().then(()=>Q[Z]?.()).catch((Y)=>z0(Y,J)))},u0=async($)=>{await Promise.allSettled([...q,...d0($,"flush")])},l0=async($)=>{await Promise.allSettled(d0($,"close"))};import{open as z1}from"node:fs/promises";import{dirname as H1}from"node:path";import{promises as e2}from"node:fs";var n0=async($,Z=448)=>{await e2.mkdir($,{mode:Z,recursive:!0})};import{promises as E}from"node:fs";import{promisify as $1}from"node:util";import{gzip as Z1}from"node:zlib";var i0=()=>{let $=new Map;return{acquire:async(J)=>{let Q=$.get(J)??Promise.resolve(),Y,B=new Promise((X)=>{Y=X});return $.set(J,B),await Q,()=>{if(Y?.(),$.get(J)===B)$.delete(J)}}}};var J1=$1(Z1),Q1=i0(),a0=($,Z,J)=>{if(J){J(Z);return}console.error($,Z)},g=($)=>String($).padStart(2,"0"),Y1=($,Z)=>{let J=Z.getFullYear(),Q=g(Z.getMonth()+1),Y=g(Z.getDate()),B=g(Z.getHours()),X=g(Z.getMinutes()),G=g(Z.getSeconds()),j=String(Z.getMilliseconds()).padStart(3,"0");return`${$}.${J}-${Q}-${Y}-${B}-${X}-${G}-${j}`},B1=async($)=>{try{if((await E.stat($)).size===0)return""}catch{return""}let J=`${Y1($,new Date)}-${process.hrtime.bigint()}`;return await E.rename($,J),J},X1=async($,Z)=>{let J=await Q1.acquire($);try{try{await E.access($)}catch{return}let Q=await E.readFile($),Y=await J1(Q);await E.writeFile(`${$}.gz`,Y),await E.rm($,{force:!0})}catch(Q){throw a0(`[logixlysia] Failed to compress file ${$}:`,Q,Z),Q}finally{J()}};var j1=($)=>$.status==="fulfilled",G1=async($,Z,J)=>{let Q=await O0($);if(Q.length===0)return;if(Z.type==="count"&&Q.length<=Z.value)return;let B=(await Promise.allSettled(Q.map(async(j)=>({path:j,stat:await E.stat(j)})))).filter(j1).map((j)=>j.value),X;if(Z.type==="count"){if(B.length<=Z.value)return;B.sort((j,H)=>H.stat.mtimeMs-j.stat.mtimeMs),X=B.slice(Z.value)}else{let j=Date.now();X=B.filter(({stat:H})=>j-H.mtimeMs>Z.value)}(await Promise.allSettled(X.map(({path:j})=>E.rm(j,{force:!0})))).forEach((j,H)=>{if(j.status==="rejected")a0(`[logixlysia] Failed to delete rotated log ${X[H].path}:`,j.reason,J)})},s0=async($,Z,J)=>{let Q=await B1($);if(!Q)return;if(Z.compress===!0){if((Z.compression??"gzip")==="gzip")try{await X1(Q,J)}catch{}}if(Z.maxFiles!==void 0){let B=l(Z.maxFiles);await G1($,B,J)}};var W1=($,Z)=>$&&$>0?$:Z;class o0{filePath;handle=null;bytesWritten=0;openedAt=0;latestOptions={};pendingBatch=null;flushChain=Promise.resolve();constructor($){this.filePath=$}write($,Z){return this.latestOptions=Z,new Promise((J,Q)=>{if(this.pendingBatch){this.pendingBatch.lines.push($),this.pendingBatch.resolvers.push({reject:Q,resolve:J});return}let Y={lines:[$],resolvers:[{reject:Q,resolve:J}]};this.pendingBatch=Y,queueMicrotask(()=>{this.pendingBatch=null,this.flushChain=this.flushChain.then(()=>this.flushBatch(Y),()=>this.flushBatch(Y))})})}async flushBatch($){let Z=this.latestOptions,J=$.lines.join("");try{await this.ensureOpen(Z),await this.handle.write(J),this.bytesWritten+=Buffer.byteLength(J)}catch(Q){for(let Y of $.resolvers)Y.reject(Q);return}await this.maybeRotate(Z);for(let Q of $.resolvers)Q.resolve()}async ensureOpen($){if(this.handle)return;await n0(H1(this.filePath),$.logDirMode);let Z=await z1(this.filePath,"a",$.logFileMode??384),J=await Z.stat();this.handle=Z,this.bytesWritten=J.size,this.openedAt=W1(J.birthtimeMs,Date.now())}shouldRotateNow($){if($.maxSize!==void 0&&this.bytesWritten>k($.maxSize))return!0;return $.interval!==void 0&&Date.now()-this.openedAt>=m($.interval)}async maybeRotate($){let Z=$.logRotation;if(!Z||Z.maxSize===void 0&&Z.interval===void 0)return;try{if(!this.shouldRotateNow(Z))return;let{handle:J}=this;this.handle=null,this.bytesWritten=0,this.openedAt=Date.now(),await J?.close(),await s0(this.filePath,Z,$.onRotationError)}catch(J){if($.onRotationError)$.onRotationError(J);else console.error(`[logixlysia] Failed to rotate log file ${this.filePath}:`,J)}}async flush(){await Promise.resolve(),await this.flushChain}async close(){await this.flush();let{handle:$}=this;this.handle=null,await $?.close(),c.delete(this.filePath)}}var c=new Map,t0=($)=>{let Z=c.get($);if(!Z)Z=new o0($),c.set($,Z);return Z},r0=async()=>{await Promise.allSettled([...c.values()].map(($)=>$.flush()))},e0=async()=>{await Promise.allSettled([...c.values()].map(($)=>$.close()))};var V1=($,Z,J)=>{if(J){let{pathname:Q,search:Y}=J;return Z?`${Q}${Y}`:Q}try{let{pathname:Q,search:Y}=new URL($.url);return Z?`${Q}${Y}`:Q}catch{return $.url}},$$=($,Z,J,Q)=>{let Y=$?.onError;if(!Y){console.error(J,Q);return}try{Y({error:Q,sink:Z})}catch{}},Z$=async($)=>{let{filePath:Z,level:J,request:Q,data:Y,store:B,options:X,precomputed:G}=$,{config:j}=X,H=j?.useTransportsOnly===!0,N=j?.disableFileLogging===!0;if(H||N)return;let K=typeof Y.message==="string"?Y.message:"",I=G?.durationMs??L(B.beforeTime),O=V1(Q,j?.logQueryParams,G),M=`${J} ${I.toFixed(2)}ms ${Q.method} ${R(O,1024)} ${R(K)}
|
|
3
|
+
`,C=j?.onError?(_)=>$$(j,"rotation","",_):void 0;try{await t0(Z).write(M,{logDirMode:j?.logDirMode,logFileMode:j?.logFileMode,logRotation:j?.logRotation,onRotationError:C})}catch(_){throw $$(j,"file",`[logixlysia] Failed to write to log file ${Z}:`,_),_}};var $0=($)=>{let Z=$?.useTransportsOnly===!0,J=$?.disableInternalLogger===!0,Q=$?.disableFileLogging===!0,Y=($?.transports?.length??0)>0,B=!(Z||Q)&&!!$?.logFilePath,X=!(Z||J);return{hasFileLogging:B,hasInternalLogger:X,hasTransports:Y,isEffectivelyDisabled:!(Y||B||X),needsUrlParts:B||X}},f=($,Z)=>{if(!Z?.level||Z.level.length===0)return!0;return Z.level.includes($)},H0=($)=>{try{let{pathname:Z,search:J}=new URL($.url);return{pathname:Z,search:J}}catch{return{pathname:$.url||"/",search:""}}},N1=($,Z,J,Q)=>{let Y=Q??L($.beforeTime),{pathname:B,search:X}=J?H0(Z):{pathname:"",search:""};return{durationMs:Y,pathname:B,search:X}},K1=($)=>{switch($){case"DEBUG":return console.debug;case"INFO":return console.info;case"WARNING":return console.warn;case"ERROR":return console.error;default:return console.log}},p=({bypassSampling:$,contextStore:Z,data:J,durationOverride:Q,formatContext:Y,level:B,options:X,request:G,sampling:j,sinks:H,store:N})=>{let{config:K}=X;if(H.isEffectivelyDisabled||!f(B,K?.logFilter))return;if(j&&!$){let A=j.decide(B,G);if(A==="drop")return;if(A==="buffer"){j.buffer(G,{data:J,durationMs:L(N.beforeTime),level:B});return}}let I=b0(J,Z.peekContext(G)),O=K?.autoRedact===!0?q0(I,K?.redactKeys):I,M=K?.autoRedact===!0?x0(G,K?.redactKeys):G,C=N1(N,M,H.needsUrlParts,Q);if(H.hasTransports)p0({data:O,level:B,options:X,precomputed:C,request:M,store:N});if(H.hasFileLogging){let A=K?.logFilePath;if(A)Z$({data:O,filePath:A,level:B,options:X,precomputed:C,request:M,store:N}).catch(()=>{})}if(!H.hasInternalLogger)return;let{main:_,contextLines:w}=c0({data:O,formatContext:Y,level:B,options:X,precomputed:C,request:M,store:N}),S=w.length>0?`${_}
|
|
4
4
|
${w.join(`
|
|
5
|
-
`)}`:_;
|
|
5
|
+
`)}`:_;K1(B)(S)};var U1=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",W0=($)=>U1($)?$.status:500,J$=($,Z,J,Q,Y,B,X,G)=>{let{config:j}=Q,H=W0(Z),N=H>=400&&H<500?"WARNING":"ERROR";if(B.isEffectivelyDisabled||!f(N,j?.logFilter))return;let{error:K,message:I}=k0(Z,j?.logErrorPayload===!0);p({contextStore:Y,data:{error:K,message:I,status:H},formatContext:X,level:N,options:Q,request:$,sampling:G,sinks:B,store:J})};var I1={beforeTime:BigInt(0)},Y$=($={},Z=Q$,J)=>{let Q=J??a(),{config:Y}=$,B=G0($),X=Y?.pino,{prettyPrint:G,...j}=X??{},H=typeof G==="object"&&G!==null?G:void 0,K=(G===!0||H!==void 0)&&j.transport===void 0,I=H?.messageKey??j.messageKey,O=H?.errorKey??j.errorKey,M={...j,errorKey:O,level:j.level??"info",messageKey:I,...Y?.autoRedact===!0&&j.redact===void 0?{redact:{censor:"[REDACTED]",paths:f0(Y?.redactKeys)}}:{}},C=()=>F1({colorize:process.stdout?.isTTY===!0,translateTime:Y?.timestamp?.translateTime,...H,errorKey:O,messageKey:I}),_,w=()=>{if(!_)_=K?Z(M,C()):Z({...M,transport:j.transport});return _},S=new Proxy({},{get(z,V){let U=w(),D=U[V];return typeof D==="function"?D.bind(U):D},has:(z,V)=>(V in w())});if(Y?.pino!==void 0)w();let A=$0(Y),P=Y0(Y?.sampling),x=(z,V,U,D)=>{p({contextStore:Q,data:U,formatContext:B,level:z,options:$,request:V,sampling:P,sinks:A,store:D})},y=(z,V,U)=>{if(!P)return;let D={durationMs:L(V.beforeTime),pathname:H0(z).pathname,status:U};for(let b of P.finalize(z,D))p({bypassSampling:!0,contextStore:Q,data:b.data,durationOverride:b.durationMs,formatContext:B,level:b.level,options:$,request:z,sampling:P,sinks:A,store:I1})},W=(z,V,U,D)=>{if(A.isEffectivelyDisabled||!f(z,Y?.logFilter))return;let b={beforeTime:process.hrtime.bigint()};x(z,V,{context:D,message:U},b)};return{beginRequest:(z)=>{P?.begin(z)},debug:(z,V,U)=>{W("DEBUG",z,V,U)},error:(z,V,U)=>{W("ERROR",z,V,U)},finalizeRequest:y,getContext:(z)=>Q.getContext(z),handleHttpError:(z,V,U)=>{J$(z,V,U,$,Q,A,B,P)},info:(z,V,U)=>{W("INFO",z,V,U)},log:x,mergeContext:(z,V)=>{Q.mergeContext(z,V)},pino:S,warn:(z,V,U)=>{W("WARNING",z,V,U)}}},V0=($,Z)=>Y$($,Q$,Z);var O1=/^[A-Za-z0-9._-]{1,128}$/,N0=($)=>{if($===void 0||$===!1)return null;if($===!0)return{enabled:!0,generator:()=>crypto.randomUUID(),header:"X-Request-Id"};if($.enabled===!1)return null;return{enabled:!0,generator:$.generator??(()=>crypto.randomUUID()),header:$.header?.trim()||"X-Request-Id"}},K0=($,Z)=>{let J=$.headers.get(Z.header);if(J&&O1.test(J))return J;return Z.generator()};var B$=($,Z)=>{let J=$.then(()=>!1,()=>!1);if(Z<=0)return Promise.resolve(!0);return new Promise((Q)=>{let Y=setTimeout(()=>Q(!0),Z);Y.unref?.(),J.then((B)=>{clearTimeout(Y),Q(B)})})},X$=($,Z)=>{let J=Error(`[logixlysia] shutdown flush did not complete within ${Z}ms; some transport or file writes may not have been flushed.`);if($){try{$({error:J,sink:"shutdown"})}catch{}return}console.error(J.message)},U0=async($)=>{await Promise.allSettled([u0($),r0()])};var j$=new Map,M1=($)=>{let Z=j$.get($);if(!Z)Z=new Request(`http://logixlysia.local${$}`,{method:"WS"}),j$.set($,Z);return Z},D1=($)=>{if($ instanceof ArrayBuffer||ArrayBuffer.isView($))return"binary";if(typeof $==="string")return"string";return typeof $},F0=($,Z,J)=>{let Q=new WeakMap,Y=(B,X,G,j,H)=>{let N=X,I={beforeTime:Q.get(N)??process.hrtime.bigint()},O=J.peekContext(N),M=Object.keys(O).length>0||H?{...O,...H,wsId:X.id}:{wsId:X.id};Z.log(B,M1(G),{context:M,message:j,status:200},I)};return(B,X)=>({...X,close(G,j,H){try{X.close?.(G,j,H)}finally{if($.config?.disableWebSocketLogging!==!0){let N={};if(j!==void 0)N.code=j;if(H!==void 0)N.reason=H;Y("INFO",G,B,"WebSocket closed",Object.keys(N).length>0?N:void 0)}J.clearContext(G),Q.delete(G)}},message(G,j){try{X.message?.(G,j)}finally{if($.config?.disableWebSocketLogging!==!0)Y("INFO",G,B,"WebSocket message",{payloadType:D1(j)})}},open(G){Q.set(G,process.hrtime.bigint());try{X.open?.(G)}finally{if($.config?.disableWebSocketLogging!==!0)Y("INFO",G,B,"WebSocket opened")}}})};var _1=new Set([101,103,204,205,304]);var A1=($)=>$>=200&&$<=599&&!_1.has($)?$:500;class G$ extends Error{code;fix;link;status;why;constructor($,Z,J={}){super(Z);if(this.status=$,this.code=J.code,this.fix=J.fix,this.link=J.link,this.why=J.why,Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:"HttpError",writable:!0}),Object.defineProperty(this,"internal",{configurable:!0,enumerable:!1,value:J.internal,writable:!1}),J.code!==void 0||J.why!==void 0||J.fix!==void 0||J.link!==void 0)Object.defineProperty(this,"toResponse",{configurable:!0,enumerable:!1,value:()=>Response.json(this.toJSON(),{status:A1(this.status)}),writable:!0})}toJSON(){return{code:this.code,fix:this.fix,link:this.link,message:this.message,status:this.status,why:this.why}}}var z$=200,L1=($,Z)=>{if($!==void 0&&$!==null){let J=o($);if(J!==z$)return J}if(Z instanceof Response)return Z.status;return z$},R1=5000,H$=($={})=>{let Z=Z0($),J=new WeakSet,Q=new WeakSet,Y=new WeakMap,B=a(),X=V0(Z,B),G=F0(Z,X,B),j=N0(Z.config?.requestId),H=M0(Z.config?.enrichers),N=Z.config?.onError,K=Z.config?.logFilter,I=$0(Z.config),O=(W,z,V,U)=>{if(I.isEffectivelyDisabled||!f(W,K))return;J.add(z),X.log(W,z,{context:U,message:V},{beforeTime:Y.get(z)??process.hrtime.bigint()})},M={...X,debug:(W,z,V)=>{O("DEBUG",W,z,V)},error:(W,z,V)=>{O("ERROR",W,z,V)},info:(W,z,V)=>{O("INFO",W,z,V)},warn:(W,z,V)=>{O("WARNING",W,z,V)}},C=(W)=>({debug:(z,V)=>O("DEBUG",W,z,V),error:(z,V)=>O("ERROR",W,z,V),info:(z,V)=>O("INFO",W,z,V),mergeContext:(z)=>B.mergeContext(W,z),warn:(z,V)=>O("WARNING",W,z,V)}),_=(W,z)=>{let V={};return z?.forEach((U,D)=>{V[D]=U}),Object.assign(V,W)},w=(W,z,V,U)=>{if(j){let b=B.getContext(W).requestId;if(b)z[j.header]=b}let D={beforeTime:Y.get(W)??BigInt(0)};if(H)A0(H,B,{durationMs:L(D.beforeTime),headers:_(z,U),request:W,status:V},N);return M.finalizeRequest(W,D,V),D},S=Z.config?.useAsyncLocalStorage===!0,A=()=>{if(S)s.enterWith(J0)},P=(W,z,V)=>{if(Q.has(W))return{beforeTime:Y.get(W)??BigInt(0)};let U=w(W,z,W0(V));return Q.add(W),U},y=new b1({detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]},name:"Logixlysia"}).state("logger",M).state("pino",M.pino).state("beforeTime",BigInt(0)).derive(({request:W})=>({log:C(W)})).onStart(({server:W})=>{if(W)Q0(W,Z);else{let z=Number(process.env.PORT)||3000,V=process.env.HOST||"localhost";Q0({hostname:V,port:z,protocol:"http"},Z)}}).onStop(async()=>{let W=Z.config?.flushTimeoutMs??R1;if(await B$(U0(Z),W)&&W>0)X$(Z.config?.onError,W)}).onRequest(({request:W,store:z})=>{let V=process.hrtime.bigint();if(Y.set(W,V),z.beforeTime=V,M.beginRequest(W),j){let U=K0(W,j);B.mergeContext(W,{requestId:U})}if(H)_0(H,B,W,N);if(S)s.enterWith(C(W))}).onAfterHandle(({request:W,set:z,response:V})=>{try{if(Q.has(W))return;let U=L1(z.status,V),D=w(W,z.headers,U,V instanceof Response?V.headers:void 0);if(Q.add(W),J.has(W))return;let b="INFO";if(U>=500)b="ERROR";else if(U>=400)b="WARNING";let d=B.getContext(W),u={status:U};if(Object.keys(d).length>0)u.context={...d};M.log(b,W,u,D)}finally{A()}}).onError(({request:W,error:z,set:V})=>{try{M.handleHttpError(W,z,P(W,V.headers,z))}finally{Y.delete(W),B.clearContext(W),A()}}).as("scoped");return Object.assign(y,{wrapWs:G})},K6=async($,{close:Z=!1}={})=>{if(await U0($),Z)await Promise.allSettled([l0($),e0()])},L6=H$,U6=H$;export{T$ as useLogger,Y0 as resolveSampling,N0 as resolveRequestIdConfig,Z0 as resolveOptions,U6 as logixlysia,K0 as getOrCreateRequestId,K6 as flushLogixlysia,L6 as default,F0 as createWsHandlerWrapper,V0 as createPluginLogger,Y$ as createLogger,G$ as HttpError};
|
|
6
6
|
|
|
7
|
-
//# debugId=
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvdXRpbHMvcmVwb3J0LnRzIiwgInNyYy9jb250ZXh0L2VucmljaC50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL3NhbXBsaW5nL2dsb2IudHMiLCAic3JjL3NhbXBsaW5nL2luZGV4LnRzIiwgInNyYy91dGlscy9kdXJhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvdXRpbHMvZXJyb3IudHMiLCAic3JjL291dHB1dC9pbmRleC50cyIsICJzcmMvb3V0cHV0L2ZpbGUtc2luay50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvb3V0cHV0L2tleWVkLW11dGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvbG9nZ2VyL2VtaXQudHMiLCAic3JjL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmMvbWlkZGxld2FyZS9yZXF1ZXN0LWlkLnRzIiwgInNyYy9vdXRwdXQvc2h1dGRvd24udHMiLCAic3JjL3dlYnNvY2tldC93cmFwLXdzLnRzIiwgInNyYy9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQge1xuICBhcHBseVJlcXVlc3RFbnJpY2hlcnMsXG4gIGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMsXG4gIHJlc29sdmVFbnJpY2hlcnNcbn0gZnJvbSAnLi9jb250ZXh0L2VucmljaCdcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgbG9nZ2VyU3RvcmFnZSwgbm9vcFJlcXVlc3RMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpZWxkcyxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlcixcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgcmVzb2x2ZVNpbmtzLCBzaG91bGRMb2cgfSBmcm9tICcuL2xvZ2dlci9lbWl0J1xuaW1wb3J0IHsgZXJyb3JTdGF0dXMgfSBmcm9tICcuL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvcidcbmltcG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuaW1wb3J0IHsgY2xvc2VUcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG5pbXBvcnQgeyBjbG9zZUFsbEZpbGVTaW5rcyB9IGZyb20gJy4vb3V0cHV0L2ZpbGUtc2luaydcbmltcG9ydCB7XG4gIGZsdXNoQWxsLFxuICByYWNlV2l0aFRpbWVvdXQsXG4gIHJlcG9ydFNodXRkb3duVGltZW91dFxufSBmcm9tICcuL291dHB1dC9zaHV0ZG93bidcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcblxuLyoqXG4gKiBFbXB0eSBzaW5nbGV0b24gc2xvdHMgbXVzdCBub3QgdXNlIGBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5gOiBpbnRlcnNlY3RpbmcgdGhhdCB3aXRoIEVseXNpYSdzIGBDb250ZXh0YFxuICogbWFrZXMgZXZlcnkga2V5IChpbmNsdWRpbmcgYHN0b3JlYCkgYmVjb21lIGBuZXZlcmAgYmVjYXVzZSBlYWNoIGtleSBpcyBtZXJnZWQgd2l0aCBgbmV2ZXJgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5RWx5c2lhU2xvdCB7XG4gIHJlYWRvbmx5IF9fbG9naXhseXNpYUVtcHR5PzogbmV2ZXJcbn1cblxuY29uc3QgREVGQVVMVF9TVEFUVVMgPSAyMDBcblxuLyoqXG4gKiBUaGUgc3RhdHVzIHRoZSBjbGllbnQgYWN0dWFsbHkgc2Vlcy4gRWx5c2lhIGxlYXZlcyBgc2V0LnN0YXR1c2AgYXQgMjAwXG4gKiB1bmxlc3MgYSBoYW5kbGVyIGFzc2lnbmVkIG9uZSwgYW5kIG9uIHRoZSB3aXJlIGEgcmV0dXJuZWQgYFJlc3BvbnNlYCBiZWF0c1xuICogdGhhdCB1bnRvdWNoZWQgZGVmYXVsdCDigJQgc28gYSBzdHJlYW1pbmcsIHJlZGlyZWN0aW5nIG9yIHByb3h5aW5nIGhhbmRsZXInc1xuICogb3duIHN0YXR1cyBpcyB0aGUgb25lIHdvcnRoIGxvZ2dpbmcuXG4gKi9cbmNvbnN0IHJlc29sdmVIYW5kbGVkU3RhdHVzID0gKFxuICBzZXRTdGF0dXM6IHVua25vd24sXG4gIHJlc3BvbnNlOiB1bmtub3duXG4pOiBudW1iZXIgPT4ge1xuICBpZiAoc2V0U3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc2V0U3RhdHVzICE9PSBudWxsKSB7XG4gICAgY29uc3QgYXNzaWduZWQgPSBnZXRTdGF0dXNDb2RlKHNldFN0YXR1cylcbiAgICBpZiAoYXNzaWduZWQgIT09IERFRkFVTFRfU1RBVFVTKSB7XG4gICAgICByZXR1cm4gYXNzaWduZWRcbiAgICB9XG4gIH1cblxuICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXNcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUQVRVU1xufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uPFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHM+IHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiB7XG4gICAgbG9nOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+XG4gIH1cbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIHNsb3RzIGFyZSBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gOyBvdXJzIGFyZSBpbnRlbnRpb25hbGx5IGNsb3NlZCAoc2VlICMyMjApLlxuZXhwb3J0IHR5cGUgTG9naXhseXNpYTxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPiA9IEVseXNpYTxcbiAgJycsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzbG90cyBhcmUgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG4gIExvZ2l4bHlzaWFTaW5nbGV0b248VEZpZWxkcz5cbj5cblxuZXhwb3J0IHR5cGUgTG9naXhseXNpYVBsdWdpbjxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPiA9XG4gIExvZ2l4bHlzaWE8VEZpZWxkcz4gJiB7XG4gICAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxuICB9XG5cbmNvbnN0IERFRkFVTFRfRkxVU0hfVElNRU9VVF9NUyA9IDUwMDBcblxuLyoqXG4gKiBAdHlwZVBhcmFtIFRGaWVsZHMgLSBGaWVsZCBiYWcgZm9yIHRoZSByZXF1ZXN0LXNjb3BlZCBgbG9nYC4gU3VwcGx5IHlvdXIgb3duXG4gKiBpbnRlcmZhY2UgdG8gaGF2ZSBUeXBlU2NyaXB0IHJlamVjdCBtaXNzcGVsbGVkIGNvbnRleHQga2V5czsgdGhlIGRlZmF1bHRcbiAqIGFsbG93cyBhbnkga2V5LCBzbyB1bnR5cGVkIHVzYWdlIGlzIHVuY2hhbmdlZC5cbiAqL1xuY29uc3QgY3JlYXRlTG9naXhseXNpYVBsdWdpbiA9IDxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPihcbiAgcmF3T3B0aW9uczogT3B0aW9ucyA9IHt9XG4pOiBMb2dpeGx5c2lhUGx1Z2luPFRGaWVsZHM+ID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKHJhd09wdGlvbnMpXG4gIGNvbnN0IGRpZEN1c3RvbUxvZyA9IG5ldyBXZWFrU2V0PFJlcXVlc3Q+KClcbiAgY29uc3QgY2xvc2VkID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lcyA9IG5ldyBXZWFrTWFwPFJlcXVlc3QsIGJpZ2ludD4oKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCByZXF1ZXN0SWRDb25maWcgPSByZXNvbHZlUmVxdWVzdElkQ29uZmlnKG9wdGlvbnMuY29uZmlnPy5yZXF1ZXN0SWQpXG4gIGNvbnN0IGVucmljaGVycyA9IHJlc29sdmVFbnJpY2hlcnMob3B0aW9ucy5jb25maWc/LmVucmljaGVycylcbiAgY29uc3Qgb25TaW5rRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuICBjb25zdCBsb2dGaWx0ZXIgPSBvcHRpb25zLmNvbmZpZz8ubG9nRmlsdGVyXG4gIGNvbnN0IHNpbmtzID0gcmVzb2x2ZVNpbmtzKG9wdGlvbnMuY29uZmlnKVxuXG4gIC8qKlxuICAgKiBBIGN1c3RvbSBsb2cgaW5zaWRlIGEgcmVxdWVzdC4gSXQgYXBwbGllcyB0aGUgc2FtZSBnYXRlIHRoZSBsb2dnZXIncyBvd25cbiAgICogYGRlYnVnYC9gaW5mb2AvLi4uIGFwcGx5LCBmb3IgdHdvIHJlYXNvbnM6IGEgcmVjb3JkIHRoZSBsZXZlbCBmaWx0ZXIgZHJvcHNcbiAgICogbXVzdCBub3QgY2xhaW0gdGhlIHJlcXVlc3QgYW5kIHN1cHByZXNzIGl0cyBhY2Nlc3MgbGluZSwgYW5kIHRoZSByZWNvcmRcbiAgICogdGhhdCBkb2VzIGdvIG91dCBoYXMgdG8gYmUgdGltZWQgZnJvbSB0aGUgcmVxdWVzdCdzIHN0YXJ0IHJhdGhlciB0aGFuIGZyb21cbiAgICogdGhlIG1vbWVudCB0aGUgaGFuZGxlciBjYWxsZWQgaXQuXG4gICAqL1xuICBjb25zdCBlbWl0Q3VzdG9tTG9nID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHNpbmtzLmlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBsb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgYmFzZUxvZ2dlci5sb2coXG4gICAgICBsZXZlbCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UgfSxcbiAgICAgIHsgYmVmb3JlVGltZTogcmVxdWVzdFN0YXJ0VGltZXMuZ2V0KHJlcXVlc3QpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICApXG4gIH1cblxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZW1pdEN1c3RvbUxvZygnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGVtaXRDdXN0b21Mb2coJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGVtaXRDdXN0b21Mb2coJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZW1pdEN1c3RvbUxvZygnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlciA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT4gKHtcbiAgICBkZWJ1ZzogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGVycm9yOiAobWVzc2FnZSwgY29udGV4dCkgPT5cbiAgICAgIGVtaXRDdXN0b21Mb2coJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgaW5mbzogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgbWVyZ2VDb250ZXh0OiBwYXJ0aWFsID0+IGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgcGFydGlhbCksXG4gICAgd2FybjogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgfSlcblxuICAvKipcbiAgICogVGhlIHJlc3BvbnNlIGhlYWRlcnMgYW4gZW5yaWNoZXIgZ2V0cyB0byByZWFkLiBgc2V0LmhlYWRlcnNgIGFsb25lIG1pc3Nlc1xuICAgKiBhbnl0aGluZyBhIGhhbmRsZXIgcHV0IG9uIGEgcmV0dXJuZWQgYFJlc3BvbnNlYCAoYSBgY29udGVudC1sZW5ndGhgLCBzYXkpLFxuICAgKiBzbyB0aGUgdHdvIGFyZSBtZXJnZWQg4oCUIHdpdGggYHNldC5oZWFkZXJzYCB3aW5uaW5nLCBzaW5jZSBFbHlzaWEgYXBwbGllc1xuICAgKiBpdCBsYXN0LiBPbmx5IGJ1aWx0IHdoZW4gYW4gZW5yaWNoZXIgd2lsbCBhY3R1YWxseSByZWFkIGl0LlxuICAgKi9cbiAgY29uc3QgcmVhZGFibGVSZXNwb25zZUhlYWRlcnMgPSAoXG4gICAgc2V0SGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgICByZXNwb25zZUhlYWRlcnM/OiBIZWFkZXJzXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICByZXNwb25zZUhlYWRlcnM/LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIG1lcmdlZFtrZXldID0gdmFsdWVcbiAgICB9KVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG1lcmdlZCwgc2V0SGVhZGVycylcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeXRoaW5nIGJvdGggZXhpdHMgc2hhcmUgb25jZSB0aGUgc3RhdHVzIGlzIGtub3duOiBlY2hvIHRoZSByZXF1ZXN0IGlkLFxuICAgKiBydW4gdGhlIHJlc3BvbnNlLXBoYXNlIGVucmljaGVycywgYW5kIHJlc29sdmUgdGFpbCBzYW1wbGluZyDigJQgYWxsIGJlZm9yZVxuICAgKiB0aGUgcmVxdWVzdCdzIGZpbmFsIGxvZyBsaW5lLCBzbyBpdCBhbmQgYW55IHJlcGxheWVkIHJlY29yZHMgc2VlIHRoZSBzYW1lXG4gICAqIGNvbnRleHQuIFJldHVybnMgdGhlIHRpbWluZyBzdG9yZSBmb3IgdGhhdCBmaW5hbCBsaW5lLlxuICAgKlxuICAgKiBgc2V0SGVhZGVyc2AgaXMgdGhlIGxpdmUgYHNldC5oZWFkZXJzYCBhbmQgaXMgd3JpdHRlbiB0bzsgdGhlIG1lcmdlZCB2aWV3XG4gICAqIGhhbmRlZCB0byBlbnJpY2hlcnMgaXMgcmVhZC1vbmx5LCBzbyBpdCBtdXN0IG5vdCBzdGFuZCBpbiBmb3IgaXQuXG4gICAqL1xuICBjb25zdCBjbG9zZVJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBzZXRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+LFxuICAgIHN0YXR1czogbnVtYmVyLFxuICAgIHJlc3BvbnNlSGVhZGVycz86IEhlYWRlcnNcbiAgKTogU3RvcmVEYXRhID0+IHtcbiAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICBjb25zdCBpZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpLnJlcXVlc3RJZCBhc1xuICAgICAgICB8IHN0cmluZ1xuICAgICAgICB8IHVuZGVmaW5lZFxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHNldEhlYWRlcnNbcmVxdWVzdElkQ29uZmlnLmhlYWRlcl0gPSBpZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7XG4gICAgICBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gQmlnSW50KDApXG4gICAgfVxuXG4gICAgaWYgKGVucmljaGVycykge1xuICAgICAgYXBwbHlSZXNwb25zZUVucmljaGVycyhcbiAgICAgICAgZW5yaWNoZXJzLFxuICAgICAgICBjb250ZXh0U3RvcmUsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhdGlvbk1zOiBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSksXG4gICAgICAgICAgaGVhZGVyczogcmVhZGFibGVSZXNwb25zZUhlYWRlcnMoc2V0SGVhZGVycywgcmVzcG9uc2VIZWFkZXJzKSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHN0YXR1c1xuICAgICAgICB9LFxuICAgICAgICBvblNpbmtFcnJvclxuICAgICAgKVxuICAgIH1cblxuICAgIGxvZ2dlci5maW5hbGl6ZVJlcXVlc3QocmVxdWVzdCwgc3RvcmUsIHN0YXR1cylcbiAgICByZXR1cm4gc3RvcmVcbiAgfVxuXG4gIGNvbnN0IHVzZUFzeW5jTG9jYWxTdG9yYWdlID0gb3B0aW9ucy5jb25maWc/LnVzZUFzeW5jTG9jYWxTdG9yYWdlID09PSB0cnVlXG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBuby1vcCBsb2dnZXIgb25jZSBhIHJlcXVlc3QgaXMgb3Zlciwgc28gYSBwcm9taXNlIHRoYXRcbiAgICogb3V0bGl2ZXMgaXQgYW5kIGNhbGxzIGB1c2VMb2dnZXIoKWAgd3JpdGVzIG5vd2hlcmUgaW5zdGVhZCBvZiBpbnRvXG4gICAqIHdoaWNoZXZlciByZXF1ZXN0IGhhcHBlbmVkIHRvIHJ1biBsYXN0LlxuICAgKi9cbiAgY29uc3QgZXhpdFJlcXVlc3RTY29wZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodXNlQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGxvZ2dlclN0b3JhZ2UuZW50ZXJXaXRoKG5vb3BSZXF1ZXN0TG9nZ2VyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltaW5nIHN0b3JlIGZvciB0aGUgZXJyb3IgbGluZS4gV2hlbiBhIGhvb2sgYWZ0ZXIgdGhlIGhhbmRsZXIgdGhyb3dzLFxuICAgKiBvbkVycm9yIHJ1bnMgZm9yIGEgcmVxdWVzdCBvbkFmdGVySGFuZGxlIGFscmVhZHkgY2xvc2VkOiBpdHMgc3VjY2VzcyBsaW5lXG4gICAqIGlzIG9uIHRoZSB3aXJlIGFuZCBjYW5ub3QgYmUgcmV0cmFjdGVkLCBidXQgdGhlIGVycm9yIGxpbmUgc3RpbGwgaGFzIHRvXG4gICAqIGNhcnJ5IHRoZSByZXF1ZXN0J3MgcmVhbCBkdXJhdGlvbiwgYW5kIGNsb3NpbmcgdHdpY2Ugd291bGQgcmVzb2x2ZSB0YWlsXG4gICAqIHNhbXBsaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZXF1ZXN0LlxuICAgKi9cbiAgY29uc3QgZXJyb3JTdG9yZSA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHNldEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4sXG4gICAgZXJyb3I6IHVua25vd25cbiAgKTogU3RvcmVEYXRhID0+IHtcbiAgICBpZiAoY2xvc2VkLmhhcyhyZXF1ZXN0KSkge1xuICAgICAgcmV0dXJuIHsgYmVmb3JlVGltZTogcmVxdWVzdFN0YXJ0VGltZXMuZ2V0KHJlcXVlc3QpID8/IEJpZ0ludCgwKSB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmUgPSBjbG9zZVJlcXVlc3QocmVxdWVzdCwgc2V0SGVhZGVycywgZXJyb3JTdGF0dXMoZXJyb3IpKVxuICAgIGNsb3NlZC5hZGQocmVxdWVzdClcbiAgICByZXR1cm4gc3RvcmVcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9LFxuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGRlcml2ZWQgbG9nIHR5cGluZyBtYXRjaGVzIExvZ2l4bHlzaWFTaW5nbGV0b24uXG4gIGNvbnN0IHBsdWdpbiA9IGFwcFxuICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxuICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAuZGVyaXZlKCh7IHJlcXVlc3QgfSkgPT4gKHsgbG9nOiBjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpIH0pKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBob3N0bmFtZSwgcG9ydCwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uU3RvcChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0TXMgPVxuICAgICAgICBvcHRpb25zLmNvbmZpZz8uZmx1c2hUaW1lb3V0TXMgPz8gREVGQVVMVF9GTFVTSF9USU1FT1VUX01TXG4gICAgICBjb25zdCB0aW1lZE91dCA9IGF3YWl0IHJhY2VXaXRoVGltZW91dChmbHVzaEFsbChvcHRpb25zKSwgdGltZW91dE1zKVxuICAgICAgLy8gQSB6ZXJvIHRpbWVvdXQgbWVhbnMgdGhlIGNhbGxlciBvcHRlZCBvdXQgb2Ygd2FpdGluZywgc28gdGhlIGZsdXNoXG4gICAgICAvLyBcInRpbWluZyBvdXRcIiBpcyBleHBlY3RlZCBhbmQgbm90IHdvcnRoIHJlcG9ydGluZy5cbiAgICAgIGlmICh0aW1lZE91dCAmJiB0aW1lb3V0TXMgPiAwKSB7XG4gICAgICAgIHJlcG9ydFNodXRkb3duVGltZW91dChvcHRpb25zLmNvbmZpZz8ub25FcnJvciwgdGltZW91dE1zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyByZXF1ZXN0LCBzdG9yZSB9KSA9PiB7XG4gICAgICBjb25zdCBiZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIHJlcXVlc3RTdGFydFRpbWVzLnNldChyZXF1ZXN0LCBiZWZvcmVUaW1lKVxuICAgICAgLy8gUHVibGlzaGVkIGZvciBoYW5kbGVycyB0aGF0IHJlYWQgYHN0b3JlLmJlZm9yZVRpbWVgLiBUaGUgcGx1Z2luJ3Mgb3duXG4gICAgICAvLyB0aW1pbmcgY29tZXMgZnJvbSB0aGUgcGVyLXJlcXVlc3QgbWFwIGFib3ZlLCBzaW5jZSBFbHlzaWEncyBzdG9yZSBpc1xuICAgICAgLy8gYXBwLWdsb2JhbCBhbmQgY29uY3VycmVudCByZXF1ZXN0cyBzaGFyZSB0aGlzIHNsb3QuXG4gICAgICBzdG9yZS5iZWZvcmVUaW1lID0gYmVmb3JlVGltZVxuICAgICAgbG9nZ2VyLmJlZ2luUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBnZXRPckNyZWF0ZVJlcXVlc3RJZChyZXF1ZXN0LCByZXF1ZXN0SWRDb25maWcpXG4gICAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgeyByZXF1ZXN0SWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVucmljaGVycykge1xuICAgICAgICBhcHBseVJlcXVlc3RFbnJpY2hlcnMoZW5yaWNoZXJzLCBjb250ZXh0U3RvcmUsIHJlcXVlc3QsIG9uU2lua0Vycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAodXNlQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgICAgbG9nZ2VyU3RvcmFnZS5lbnRlcldpdGgoY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlcihyZXF1ZXN0KSlcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgcmVzcG9uc2UgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGNsb3NlZC5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc29sdmVIYW5kbGVkU3RhdHVzKHNldC5zdGF0dXMsIHJlc3BvbnNlKVxuXG4gICAgICAgIC8vIFJ1bnMgYmVmb3JlIHRoZSBlYXJseSByZXR1cm46IGEgcmVxdWVzdCB0aGF0IG9ubHkgZW1pdHRlZCBjdXN0b21cbiAgICAgICAgLy8gbG9ncyBzdGlsbCBuZWVkcyBpdHMgYnVmZmVyZWQgcmVjb3JkcyByZXBsYXllZC5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjbG9zZVJlcXVlc3QoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBzZXQuaGVhZGVycyxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSA/IHJlc3BvbnNlLmhlYWRlcnMgOiB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICBjbG9zZWQuYWRkKHJlcXVlc3QpXG5cbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xuICAgICAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdXQVJOSU5HJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgICAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc3RhdHVzIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0ID0geyAuLi5hY2N1bXVsYXRlZCB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSlcbiAgICAgICAgLy8gTm90aGluZyBlbHNlIGlzIGNsZWFuZWQgdXAgaGVyZTogdGhlIHRpbWluZ3MgYW5kIHRoZSBjb250ZXh0IGJhZ1xuICAgICAgICAvLyBsaXZlIGluIFdlYWtNYXBzIGtleWVkIGJ5IHRoZSByZXF1ZXN0LCBhbmQgYSBob29rIHJ1bm5pbmcgYWZ0ZXIgdGhpc1xuICAgICAgICAvLyBvbmUgbWF5IHN0aWxsIHRocm93LCBpbiB3aGljaCBjYXNlIG9uRXJyb3IgbmVlZHMgYm90aCB0byBzdGF5XG4gICAgICAgIC8vIHRydXRoZnVsLlxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZXhpdFJlcXVlc3RTY29wZSgpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgc2V0IH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBlcnJvclN0b3JlKHJlcXVlc3QsIHNldC5oZWFkZXJzLCBlcnJvcilcbiAgICAgICAgKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVxdWVzdFN0YXJ0VGltZXMuZGVsZXRlKHJlcXVlc3QpXG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQocmVxdWVzdClcbiAgICAgICAgZXhpdFJlcXVlc3RTY29wZSgpXG4gICAgICB9XG4gICAgfSlcbiAgICAuYXMoJ3Njb3BlZCcpIGFzIExvZ2l4bHlzaWE8VEZpZWxkcz5cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihwbHVnaW4sIHsgd3JhcFdzIH0pIGFzIExvZ2l4bHlzaWFQbHVnaW48VEZpZWxkcz5cbn1cblxuLyoqXG4gKiBEcmFpbnMgZXZlcnkgdHJhbnNwb3J0IGFuZCBmaWxlIHNpbms7IHdpdGggYGNsb3NlOiB0cnVlYCBhbHNvIHJlbGVhc2VzXG4gKiB0aGVtLiBGb3IgcHJvY2Vzc2VzIHRoYXQgc3RvcCB3aXRob3V0IEVseXNpYSdzIGBvblN0b3BgICh3b3JrZXJzLFxuICogc2NyaXB0cywgY3VzdG9tIHNpZ25hbCBoYW5kbGVycykuIFNhZmUgdG8gY2FsbCBtb3JlIHRoYW4gb25jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZsdXNoTG9naXhseXNpYSA9IGFzeW5jIChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgeyBjbG9zZSA9IGZhbHNlIH06IHsgY2xvc2U/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IGZsdXNoQWxsKG9wdGlvbnMpXG4gIGlmIChjbG9zZSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbY2xvc2VUcmFuc3BvcnRzKG9wdGlvbnMpLCBjbG9zZUFsbEZpbGVTaW5rcygpXSlcbiAgfVxufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9wZXJmb3JtYW5jZS9ub0JhcnJlbEZpbGU6IHB1YmxpYyBwYWNrYWdlIGVudHJ5IHJlLWV4cG9ydHNcbmV4cG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuZXhwb3J0IHsgdXNlTG9nZ2VyIH0gZnJvbSAnLi9jb250ZXh0L3N0b3JhZ2UnXG5leHBvcnQgdHlwZSB7IEh0dHBFcnJvckluaXQsIEh0dHBFcnJvclBheWxvYWQgfSBmcm9tICcuL2Vycm9ycydcbmV4cG9ydCB7IEh0dHBFcnJvciB9IGZyb20gJy4vZXJyb3JzJ1xuZXhwb3J0IHR5cGUge1xuICBFbnJpY2hlcixcbiAgRW5yaWNoZXJGaWVsZHMsXG4gIEVucmljaGVyTGlrZSxcbiAgRW5yaWNoZXJSZXNwb25zZUlucHV0LFxuICBIZWFkU2FtcGxpbmdDb25maWcsXG4gIExvZ0ZpZWxkcyxcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgTG9nUHJlc2V0LFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SWRDb25maWcsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXIsXG4gIFNhbXBsaW5nQ29uZmlnLFxuICBTdG9yZURhdGEsXG4gIFRhaWxTYW1wbGluZ0NvbmZpZyxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmV4cG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5leHBvcnQgdHlwZSB7IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIH0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmV4cG9ydCB0eXBlIHtcbiAgUmVxdWVzdE91dGNvbWUsXG4gIFNhbXBsaW5nRGVjaXNpb24sXG4gIFNhbXBsaW5nUnVudGltZVxufSBmcm9tICcuL3NhbXBsaW5nJ1xuZXhwb3J0IHsgcmVzb2x2ZVNhbXBsaW5nIH0gZnJvbSAnLi9zYW1wbGluZydcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhOiB0eXBlb2YgY3JlYXRlTG9naXhseXNpYVBsdWdpbiA9IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW5cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLihcXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfSg/Oi1cXGR7M30pPyg/Oi1cXGQrKT8pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplOiAke3ZhbHVlfWApXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAodHJpbW1lZCAhPT0gJycpIHtcbiAgICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgICBpZiAoYXNOdW1iZXIgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZTogJHt2YWx1ZX1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzTnVtYmVyXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+IDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heEZpbGVzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgJHt2YWx1ZX1gKVxuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dQcmVzZXQsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VJbnRlcnZhbCwgcGFyc2VSZXRlbnRpb24sIHBhcnNlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuXG5jb25zdCBWQUxJRF9QUkVTRVRTOiByZWFkb25seSBMb2dQcmVzZXRbXSA9IFsnZGV2JywgJ3Byb2QnLCAnanNvbiddXG5cbmNvbnN0IHZhbGlkYXRlTG9nUm90YXRpb24gPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBsb2dSb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFsb2dSb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAobG9nUm90YXRpb24ubWF4U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZVNpemUobG9nUm90YXRpb24ubWF4U2l6ZSlcbiAgICB9XG4gICAgaWYgKGxvZ1JvdGF0aW9uLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlUmV0ZW50aW9uKGxvZ1JvdGF0aW9uLm1heEZpbGVzKVxuICAgIH1cbiAgICBpZiAobG9nUm90YXRpb24uaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VJbnRlcnZhbChsb2dSb3RhdGlvbi5pbnRlcnZhbClcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbG9nUm90YXRpb24uY29tcHJlc3Npb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgbG9nUm90YXRpb24uY29tcHJlc3Npb24gIT09ICdnemlwJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG06ICR7bG9nUm90YXRpb24uY29tcHJlc3Npb259YFxuICAgICAgKVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2dpeGx5c2lhOiBpbnZhbGlkIGxvZ1JvdGF0aW9uIGNvbmZpZyDigJQgJHttZXNzYWdlfWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvclxuICAgIH0pXG4gIH1cbn1cblxuY29uc3QgTUFYX1NBTVBMSU5HX1JBVEUgPSAxMDBcblxuY29uc3QgaXNQZXJjZW50YWdlID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiZcbiAgdmFsdWUgPj0gMCAmJlxuICB2YWx1ZSA8PSBNQVhfU0FNUExJTkdfUkFURVxuXG5jb25zdCBpc05vbk5lZ2F0aXZlTnVtYmVyID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMFxuXG5jb25zdCBWQUxJRF9TQU1QTElOR19MRVZFTFMgPSBbJ0RFQlVHJywgJ0lORk8nLCAnV0FSTklORycsICdFUlJPUiddIGFzIGNvbnN0XG5cbmNvbnN0IHZhbGlkYXRlU2FtcGxpbmcgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBzYW1wbGluZyA9IGNvbmZpZz8uc2FtcGxpbmdcbiAgaWYgKCFzYW1wbGluZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgaW52YWxpZCA9IChkZXRhaWw6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgc2FtcGxpbmcgY29uZmlnIOKAlCAke2RldGFpbH1gKVxuICB9XG5cbiAgZm9yIChjb25zdCBbbGV2ZWwsIHJhdGVdIG9mIE9iamVjdC5lbnRyaWVzKHNhbXBsaW5nLmhlYWQgPz8ge30pKSB7XG4gICAgaWYgKCFWQUxJRF9TQU1QTElOR19MRVZFTFMuaW5jbHVkZXMobGV2ZWwgYXMgbmV2ZXIpKSB7XG4gICAgICBpbnZhbGlkKFxuICAgICAgICBgaGVhZC4ke2xldmVsfSBpcyBub3QgYSB2YWxpZCBsZXZlbCAobXVzdCBiZSBERUJVRywgSU5GTywgV0FSTklORywgb3IgRVJST1IpYFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIWlzUGVyY2VudGFnZShyYXRlKSkge1xuICAgICAgaW52YWxpZChgaGVhZC4ke2xldmVsfSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwYClcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IHRhaWwgfSA9IHNhbXBsaW5nXG4gIGlmICh0YWlsPy5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcih0YWlsLnN0YXR1cykpIHtcbiAgICBpbnZhbGlkKCd0YWlsLnN0YXR1cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpXG4gIH1cbiAgaWYgKHRhaWw/LmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcih0YWlsLmR1cmF0aW9uTXMpKSB7XG4gICAgaW52YWxpZCgndGFpbC5kdXJhdGlvbk1zIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcbiAgfVxuICBpZiAodGFpbD8ucGF0aHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWlsLnBhdGhzKSkge1xuICAgICAgaW52YWxpZCgndGFpbC5wYXRocyBtdXN0IGJlIGFuIGFycmF5JylcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGFpbC5wYXRocy5zb21lKHBhdGggPT4gdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8IHBhdGgubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgaW52YWxpZCgndGFpbC5wYXRocyBtdXN0IGNvbnRhaW4gbm9uLWVtcHR5IGdsb2Igc3RyaW5ncycpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBtYXhCdWZmZXJlZFBlclJlcXVlc3QgfSA9IHNhbXBsaW5nXG4gIGlmIChcbiAgICBtYXhCdWZmZXJlZFBlclJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICEoTnVtYmVyLmlzSW50ZWdlcihtYXhCdWZmZXJlZFBlclJlcXVlc3QpICYmIG1heEJ1ZmZlcmVkUGVyUmVxdWVzdCA+PSAwKVxuICApIHtcbiAgICBpbnZhbGlkKCdtYXhCdWZmZXJlZFBlclJlcXVlc3QgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJylcbiAgfVxufVxuXG5jb25zdCB2YWxpZGF0ZUZvcm1hdHRpbmcgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBzbG93VGhyZXNob2xkID0gY29uZmlnPy5zbG93VGhyZXNob2xkXG4gIGNvbnN0IHZlcnlTbG93VGhyZXNob2xkID0gY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZFxuXG4gIGNvbnN0IGludmFsaWQgPSAoZGV0YWlsOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2dpeGx5c2lhOiBpbnZhbGlkIGZvcm1hdHRpbmcgY29uZmlnIOKAlCAke2RldGFpbH1gKVxuICB9XG5cbiAgaWYgKHNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcihzbG93VGhyZXNob2xkKSkge1xuICAgIGludmFsaWQoXG4gICAgICBgc2xvd1RocmVzaG9sZCBtdXN0IGJlIGEgZmluaXRlIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke3Nsb3dUaHJlc2hvbGR9YFxuICAgIClcbiAgfVxuICBpZiAoXG4gICAgdmVyeVNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFpc05vbk5lZ2F0aXZlTnVtYmVyKHZlcnlTbG93VGhyZXNob2xkKVxuICApIHtcbiAgICBpbnZhbGlkKFxuICAgICAgYHZlcnlTbG93VGhyZXNob2xkIG11c3QgYmUgYSBmaW5pdGUgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7dmVyeVNsb3dUaHJlc2hvbGR9YFxuICAgIClcbiAgfVxuICBpZiAoXG4gICAgc2xvd1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgdmVyeVNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHNsb3dUaHJlc2hvbGQgPiB2ZXJ5U2xvd1RocmVzaG9sZFxuICApIHtcbiAgICBpbnZhbGlkKFxuICAgICAgYHNsb3dUaHJlc2hvbGQgKCR7c2xvd1RocmVzaG9sZH0pIG11c3Qgbm90IGV4Y2VlZCB2ZXJ5U2xvd1RocmVzaG9sZCAoJHt2ZXJ5U2xvd1RocmVzaG9sZH0pYFxuICAgIClcbiAgfVxufVxuXG5jb25zdCBQUkVTRVRfREVGQVVMVFM6IFJlY29yZDxMb2dQcmVzZXQsIE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPj4gPSB7XG4gIGRldjoge1xuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiB0cnVlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IHRydWUsXG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiB0cnVlLFxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0OiAnYmFubmVyJyxcbiAgICB1c2VDb2xvcnM6IHRydWVcbiAgfSxcbiAganNvbjoge1xuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH0sXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2VcbiAgfSxcbiAgcHJvZDoge1xuICAgIGF1dG9SZWRhY3Q6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICByZXF1ZXN0SWQ6IHRydWUsXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2VcbiAgfVxufVxuXG5jb25zdCBtZXJnZUNvbmZpZyA9IChcbiAgYmFzZTogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+LFxuICBvdmVycmlkZT86IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPT4ge1xuICBpZiAoIW92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+ID0geyAuLi5iYXNlLCAuLi5vdmVycmlkZSB9XG5cbiAgaWYgKGJhc2UucGlubyB8fCBvdmVycmlkZS5waW5vKSB7XG4gICAgbWVyZ2VkLnBpbm8gPSB7XG4gICAgICAuLi5iYXNlLnBpbm8sXG4gICAgICAuLi5vdmVycmlkZS5waW5vLFxuICAgICAgLi4uKGJhc2UucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3ZlcnJpZGUucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByZXR0eVByaW50OiBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCA/PyBiYXNlLnBpbm8/LnByZXR0eVByaW50XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ0ZpbHRlciB8fCBvdmVycmlkZS5sb2dGaWx0ZXIpIHtcbiAgICBtZXJnZWQubG9nRmlsdGVyID0ge1xuICAgICAgLi4uYmFzZS5sb2dGaWx0ZXIsXG4gICAgICAuLi5vdmVycmlkZS5sb2dGaWx0ZXJcbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS5zYW1wbGluZyB8fCBvdmVycmlkZS5zYW1wbGluZykge1xuICAgIG1lcmdlZC5zYW1wbGluZyA9IHtcbiAgICAgIC4uLmJhc2Uuc2FtcGxpbmcsXG4gICAgICAuLi5vdmVycmlkZS5zYW1wbGluZ1xuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgcHJlc2V0IH0gPSBvcHRpb25zXG4gIGlmIChwcmVzZXQgJiYgIVZBTElEX1BSRVNFVFMuaW5jbHVkZXMocHJlc2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBwcmVzZXQg4oCUICR7cHJlc2V0fWApXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHByZXNldFxuICAgID8ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjb25maWc6IG1lcmdlQ29uZmlnKFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdLCBvcHRpb25zLmNvbmZpZylcbiAgICAgIH1cbiAgICA6IG9wdGlvbnNcblxuICB2YWxpZGF0ZUxvZ1JvdGF0aW9uKHJlc29sdmVkLmNvbmZpZylcbiAgdmFsaWRhdGVTYW1wbGluZyhyZXNvbHZlZC5jb25maWcpXG4gIHZhbGlkYXRlRm9ybWF0dGluZyhyZXNvbHZlZC5jb25maWcpXG4gIHJldHVybiByZXNvbHZlZFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFNpbmtFcnJvckNvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBSRVBPUlRfSU5URVJWQUxfTVMgPSA1MDAwXG5cbmV4cG9ydCB0eXBlIEVycm9yUmVwb3J0ZXIgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbikgPT4gdm9pZFxuXG4vKipcbiAqIFJvdXRlcyBhIGZhaWx1cmUgdG8gYGNvbmZpZy5vbkVycm9yYCwgb3Ig4oCUIHdoZW4gbm8gaG9vayBpcyBjb25maWd1cmVkIOKAlCB0b1xuICogc3RkZXJyIGF0IG1vc3Qgb25jZSBwZXIgaW50ZXJ2YWwsIHNvIGEgY29tcG9uZW50IHRoYXQgZmFpbHMgb24gZXZlcnkgcmVxdWVzdFxuICogY2Fubm90IGZsb29kIHRoZSB2ZXJ5IGxvZyBpdCBpcyBtZWFudCB0byBiZSBmZWVkaW5nLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRXJyb3JSZXBvcnRlciA9IChcbiAgc2luazogU2lua0Vycm9yQ29udGV4dFsnc2luayddLFxuICBsYWJlbDogc3RyaW5nXG4pOiBFcnJvclJlcG9ydGVyID0+IHtcbiAgbGV0IGxhc3RSZXBvcnRlZEF0ID0gMFxuXG4gIHJldHVybiAoZXJyb3IsIG9uRXJyb3IpID0+IHtcbiAgICBpZiAob25FcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb25FcnJvcih7IGVycm9yLCBzaW5rIH0pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBob29rIGl0c2VsZi5cbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICBpZiAobm93IC0gbGFzdFJlcG9ydGVkQXQgPCBSRVBPUlRfSU5URVJWQUxfTVMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsYXN0UmVwb3J0ZWRBdCA9IG5vd1xuICAgIGNvbnNvbGUuZXJyb3IoYFtsb2dpeGx5c2lhXSAke2xhYmVsfTpgLCBlcnJvcilcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIEVucmljaGVyRmllbGRzLFxuICBFbnJpY2hlckxpa2UsXG4gIEVucmljaGVyUmVzcG9uc2VJbnB1dCxcbiAgU2lua0Vycm9yQ29udGV4dFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlRXJyb3JSZXBvcnRlciB9IGZyb20gJy4uL3V0aWxzL3JlcG9ydCdcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4vcmVxdWVzdC1jb250ZXh0J1xuXG5jb25zdCByZXBvcnRFbnJpY2hlckVycm9yID0gY3JlYXRlRXJyb3JSZXBvcnRlcignZW5yaWNoZXInLCAnZW5yaWNoZXIgZmFpbGVkJylcblxudHlwZSBSZXF1ZXN0UGhhc2UgPSAocmVxdWVzdDogUmVxdWVzdCkgPT4gRW5yaWNoZXJGaWVsZHNcbnR5cGUgUmVzcG9uc2VQaGFzZSA9IChpbnB1dDogRW5yaWNoZXJSZXNwb25zZUlucHV0KSA9PiBFbnJpY2hlckZpZWxkc1xuXG4vKiogRW5yaWNoZXIgcGhhc2VzIHNwbGl0IHNvIGVhY2ggcmVxdWVzdCBvbmx5IHdhbGtzIHRoZSBob29rcyB0aGF0IGV4aXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEVucmljaGVycyB7XG4gIHJlcXVlc3Q6IFJlcXVlc3RQaGFzZVtdXG4gIHJlc3BvbnNlOiBSZXNwb25zZVBoYXNlW11cbn1cblxuLyoqIFNwbGl0cyBjb25maWd1cmVkIGVucmljaGVycyBieSBwaGFzZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlRW5yaWNoZXJzID0gKFxuICBlbnJpY2hlcnM/OiBFbnJpY2hlckxpa2VbXVxuKTogUmVzb2x2ZWRFbnJpY2hlcnMgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWVucmljaGVycz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXF1ZXN0OiBSZXF1ZXN0UGhhc2VbXSA9IFtdXG4gIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZVBoYXNlW10gPSBbXVxuXG4gIGZvciAoY29uc3QgZW5yaWNoZXIgb2YgZW5yaWNoZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBlbnJpY2hlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5wdXNoKGVucmljaGVyKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGVucmljaGVyLnJlcXVlc3QpIHtcbiAgICAgIHJlcXVlc3QucHVzaChlbnJpY2hlci5yZXF1ZXN0KVxuICAgIH1cbiAgICBpZiAoZW5yaWNoZXIucmVzcG9uc2UpIHtcbiAgICAgIHJlc3BvbnNlLnB1c2goZW5yaWNoZXIucmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3QubGVuZ3RoID09PSAwICYmIHJlc3BvbnNlLmxlbmd0aCA9PT0gMFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB7IHJlcXVlc3QsIHJlc3BvbnNlIH1cbn1cblxuLyoqXG4gKiBSdW5zIG9uZSBwaGFzZSBhbmQgbWVyZ2VzIHdoYXQgaXQgcmV0dXJucyBpbnRvIHRoZSByZXF1ZXN0IGNvbnRleHQuIEEgaG9va1xuICogdGhhdCB0aHJvd3MgaXMgcmVwb3J0ZWQgYW5kIHNraXBwZWQ6IGVucmljaG1lbnQgaXMgZGVjb3JhdGlvbiwgYW5kIG11c3RcbiAqIG5ldmVyIHRha2UgYSByZXF1ZXN0IGRvd24gd2l0aCBpdC5cbiAqL1xuY29uc3QgcnVuUGhhc2UgPSA8VElucHV0PihcbiAgaG9va3M6ICgoaW5wdXQ6IFRJbnB1dCkgPT4gRW5yaWNoZXJGaWVsZHMpW10sXG4gIGlucHV0OiBUSW5wdXQsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZSxcbiAga2V5OiBSZXF1ZXN0LFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICBsZXQgZmllbGRzOiBFbnJpY2hlckZpZWxkc1xuICAgIHRyeSB7XG4gICAgICBmaWVsZHMgPSBob29rKGlucHV0KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRFbnJpY2hlckVycm9yKGVycm9yLCBvbkVycm9yKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChrZXksIGZpZWxkcylcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5UmVxdWVzdEVucmljaGVycyA9IChcbiAgZW5yaWNoZXJzOiBSZXNvbHZlZEVucmljaGVycyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBydW5QaGFzZShlbnJpY2hlcnMucmVxdWVzdCwgcmVxdWVzdCwgY29udGV4dFN0b3JlLCByZXF1ZXN0LCBvbkVycm9yKVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlSZXNwb25zZUVucmljaGVycyA9IChcbiAgZW5yaWNoZXJzOiBSZXNvbHZlZEVucmljaGVycyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICBpbnB1dDogRW5yaWNoZXJSZXNwb25zZUlucHV0LFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBydW5QaGFzZShlbnJpY2hlcnMucmVzcG9uc2UsIGlucHV0LCBjb250ZXh0U3RvcmUsIGlucHV0LnJlcXVlc3QsIG9uRXJyb3IpXG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIE5vbi1jbG9uaW5nIHJlYWQgb2YgdGhlIGxpdmUgY29udGV4dCBiYWcuIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHN0b3JlZCBpbnRlcm5hbGx5IChvciBhXG4gICAqIHNoYXJlZCBmcm96ZW4gZW1wdHkgb2JqZWN0KSDigJQgbmV2ZXIgaGFuZCB0aGlzIHRvIHVzZXItZmFjaW5nIGNvZGUsIHdoaWNoIG1heSByZXRhaW4gb3JcbiAgICogbXV0YXRlIGl0LiBPbmx5IGludGVybmFsLCByZWFkLW9ubHkgY2FsbCBzaXRlcyAodGhhdCBpbW1lZGlhdGVseSBzcHJlYWQgdGhlIHJlc3VsdCBpbnRvIGFcbiAgICogbmV3IG9iamVjdCkgbWF5IHVzZSB0aGlzOyBldmVyeXRoaW5nIGVsc2UgbXVzdCB1c2Uge0BsaW5rIFJlcXVlc3RDb250ZXh0U3RvcmUuZ2V0Q29udGV4dH0uXG4gICAqL1xuICBwZWVrQ29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG59XG5cbmNvbnN0IEVNUFRZX0NPTlRFWFQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IE9iamVjdC5mcmVlemUoe30pXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlID0gKCk6IFJlcXVlc3RDb250ZXh0U3RvcmUgPT4ge1xuICBjb25zdCBiYWdzID0gbmV3IFdlYWtNYXA8Q29udGV4dEtleSwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KClcblxuICBjb25zdCBnZXRPckNyZWF0ZSA9IChrZXk6IENvbnRleHRLZXkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgbGV0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICBpZiAoIWJhZykge1xuICAgICAgYmFnID0ge31cbiAgICAgIGJhZ3Muc2V0KGtleSwgYmFnKVxuICAgIH1cbiAgICByZXR1cm4gYmFnXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNsZWFyQ29udGV4dChrZXkpIHtcbiAgICAgIGJhZ3MuZGVsZXRlKGtleSlcbiAgICB9LFxuICAgIGdldENvbnRleHQoa2V5KSB7XG4gICAgICBjb25zdCBiYWcgPSBiYWdzLmdldChrZXkpXG4gICAgICByZXR1cm4gYmFnID8geyAuLi5iYWcgfSA6IHt9XG4gICAgfSxcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwZWVrQ29udGV4dChrZXkpIHtcbiAgICAgIHJldHVybiBiYWdzLmdldChrZXkpID8/IEVNUFRZX0NPTlRFWFRcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJ1xuaW1wb3J0IHR5cGUgeyBMb2dGaWVsZHMsIFJlcXVlc3RTY29wZWRMb2dnZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4gPVxuICBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4oKVxuXG4vKipcbiAqIFN0YW5kcyBpbiB3aGVyZXZlciBubyByZXF1ZXN0IGlzIGluIGZsaWdodCwgaW5jbHVkaW5nIGFmdGVyIG9uZSBlbmRzOiB0aGVcbiAqIHBsdWdpbiByZXN0b3JlcyBpdCBzbyBhIGNvbnRpbnVhdGlvbiB0aGF0IG91dGxpdmVzIGl0cyByZXF1ZXN0IGNhbm5vdCBrZWVwXG4gKiB3cml0aW5nIGludG8gdGhlIGZpbmlzaGVkIHJlcXVlc3QncyBsb2cuXG4gKi9cbmV4cG9ydCBjb25zdCBub29wUmVxdWVzdExvZ2dlcjogUmVxdWVzdFNjb3BlZExvZ2dlciA9IHtcbiAgZGVidWc6ICgpID0+IHVuZGVmaW5lZCxcbiAgZXJyb3I6ICgpID0+IHVuZGVmaW5lZCxcbiAgaW5mbzogKCkgPT4gdW5kZWZpbmVkLFxuICBtZXJnZUNvbnRleHQ6ICgpID0+IHVuZGVmaW5lZCxcbiAgd2FybjogKCkgPT4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgcmVxdWVzdCdzIGxvZ2dlciwgb3IgYSBuby1vcCBvbmUgb3V0c2lkZSBhIHJlcXVlc3QuXG4gKlxuICogUGFzcyB0aGUgc2FtZSBmaWVsZCB0eXBlIHlvdSBnYXZlIHRoZSBwbHVnaW4gdG8ga2VlcCBjb250ZXh0IHR5cGVkIGF3YXlcbiAqIGZyb20gdGhlIEVseXNpYSBoYW5kbGVyOiBgdXNlTG9nZ2VyPENoZWNrb3V0RmllbGRzPigpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUxvZ2dlciA9IDxcbiAgVEZpZWxkcyBleHRlbmRzIG9iamVjdCA9IExvZ0ZpZWxkc1xuPigpOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+ID0+XG4gIC8vIFRoZSBzdG9yZWQgbG9nZ2VyIHdyaXRlcyBpbnRvIGFuIHVudHlwZWQgY29udGV4dCBiYWc7IHRoZSB0eXBlIHBhcmFtZXRlclxuICAvLyBvbmx5IG5hcnJvd3Mgd2hhdCBjYWxsZXJzIG1heSBoYW5kIGl0LlxuICAobG9nZ2VyU3RvcmFnZS5nZXRTdG9yZSgpID8/XG4gICAgbm9vcFJlcXVlc3RMb2dnZXIpIGFzIFJlcXVlc3RTY29wZWRMb2dnZXI8VEZpZWxkcz5cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHsgdmVyc2lvbiB9ID0gZWx5c2lhUGtnXG4gIGNvbnN0IHZlcnNpb25MaW5lID0gdmVyc2lvbiA/IGBFbHlzaWEgdiR7dmVyc2lvbn1gIDogJ0VseXNpYSdcblxuICBjb25zdCByb3dzOiBSb3dTcGVjW10gPSBbXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnY2VudGVyJywgdGV4dDogdmVyc2lvbkxpbmUgfSxcbiAgICB7IGtpbmQ6ICdlbXB0eScgfSxcbiAgICB7IGtpbmQ6ICdsZWZ0JywgdGV4dDogdXJsRGlzcGxheUxpbmUgfVxuICBdXG4gIGlmIChsb2dpeGx5c2lhTGluZSkge1xuICAgIHJvd3MucHVzaCh7IGtpbmQ6ICdsZWZ0JywgdGV4dDogbG9naXhseXNpYUxpbmUgfSlcbiAgfVxuICByb3dzLnB1c2goeyBraW5kOiAnZW1wdHknIH0pXG5cbiAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5tYXgoXG4gICAgdmVyc2lvbkxpbmUubGVuZ3RoLFxuICAgIHVybERpc3BsYXlMaW5lLmxlbmd0aCxcbiAgICAuLi4obG9naXhseXNpYUxpbmUgPyBbbG9naXhseXNpYUxpbmUubGVuZ3RoXSA6IFswXSlcbiAgKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNFxuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5Um93ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFt0b3BdXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBpZiAocm93LmtpbmQgPT09ICdlbXB0eScpIHtcbiAgICAgIG91dC5wdXNoKGVtcHR5Um93KVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHJvdy5raW5kID09PSAnY2VudGVyJykge1xuICAgICAgb3V0LnB1c2goYOKUgiR7Y2VudGVyVGV4dChyb3cudGV4dCwgaW5uZXJXaWR0aCl94pSCYClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dCB9ID0gcm93XG4gICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSB0ZXh0Lmxlbmd0aCAtIDQpXG4gICAgb3V0LnB1c2goYOKUgiAgJHt0ZXh0fSR7JyAnLnJlcGVhdChwYWRkaW5nKX0gIOKUgmApXG4gIH1cbiAgb3V0LnB1c2goYm90KVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHYgPSBsb2dpeGx5c2lhUGtnLnZlcnNpb25cbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gYCAgICAgbG9naXhseXNpYSB2JHt2fWBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSwgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG4gIGNvbnN0IHVybERpc3BsYXlMaW5lID0gYPCfpoogICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKHVybERpc3BsYXlMaW5lLCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUoKSkpXG59XG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuY29uc3QgRElHSVRTX09OTFkgPSAvXlxcZCskL1xuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKFtBLVpdKShbQS1aXVthLXpdKS9nXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcbmNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzKy9nXG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMiwgJyQxICQyJylcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDLCAnICcpXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxuICAgIC50cmltKClcbn1cblxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XG4gICAgbWFwLnNldChub3JtYWxpemVTdGF0dXNOYW1lKG5hbWUpLCBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufSkoKVxuXG5leHBvcnQgY29uc3QgZ2V0U3RhdHVzQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXG4gICAgfVxuXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxuICAgIHJldHVybiBrbm93biA/PyA1MDBcbiAgfVxuXG4gIHJldHVybiA1MDBcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBwcmV0dHkgZnJvbSAncGluby1wcmV0dHknXG5pbXBvcnQge1xuICBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHJlc29sdmVTYW1wbGluZyB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBidWlsZFBpbm9SZWRhY3RQYXRocyB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGNyZWF0ZUZvcm1hdENvbnRleHQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBlbWl0LCBwYXJzZVJlcXVlc3RVcmxPbmNlLCByZXNvbHZlU2lua3MsIHNob3VsZExvZyB9IGZyb20gJy4vZW1pdCdcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmNvbnN0IFpFUk9fU1RPUkU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogQmlnSW50KDApIH1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyA9IHt9LFxuICBwaW5vRmFjdG9yeTogdHlwZW9mIHBpbm8gPSBwaW5vLFxuICBleHRlcm5hbENvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGV4dGVybmFsQ29udGV4dFN0b3JlID8/IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICAvLyBIb2lzdGVkIG9uY2UgcGVyIGxvZ2dlciBpbnN0YW5jZTogY29sb3JzL2Zvcm1hdC90aHJlc2hvbGRzL3NlcnZpY2UgZG9uJ3QgY2hhbmdlIGFjcm9zc1xuICAvLyByZXF1ZXN0cyB3aXRoaW4gYSBwcm9jZXNzIGxpZmV0aW1lIChzZWUgY3JlYXRlRm9ybWF0Q29udGV4dCdzIGRvYyBjb21tZW50KS5cbiAgY29uc3QgZm9ybWF0Q29udGV4dCA9IGNyZWF0ZUZvcm1hdENvbnRleHQob3B0aW9ucylcblxuICBjb25zdCBwaW5vQ29uZmlnID0gY29uZmlnPy5waW5vXG4gIGNvbnN0IHsgcHJldHR5UHJpbnQsIC4uLnBpbm9PcHRpb25zIH0gPSBwaW5vQ29uZmlnID8/IHt9XG5cbiAgY29uc3QgcHJldHR5UHJpbnRPcHRpb25zID1cbiAgICB0eXBlb2YgcHJldHR5UHJpbnQgPT09ICdvYmplY3QnICYmIHByZXR0eVByaW50ICE9PSBudWxsXG4gICAgICA/IChwcmV0dHlQcmludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZW5hYmxlUHJldHR5UHJpbnQgPVxuICAgIHByZXR0eVByaW50ID09PSB0cnVlIHx8IHByZXR0eVByaW50T3B0aW9ucyAhPT0gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2hvdWxkUHJldHR5UHJpbnQgPVxuICAgIGVuYWJsZVByZXR0eVByaW50ICYmIHBpbm9PcHRpb25zLnRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkXG5cbiAgY29uc3QgbWVzc2FnZUtleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8ubWVzc2FnZUtleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgcGlub09wdGlvbnMubWVzc2FnZUtleVxuICBjb25zdCBlcnJvcktleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8uZXJyb3JLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyBwaW5vT3B0aW9ucy5lcnJvcktleVxuXG4gIGNvbnN0IGJhc2VQaW5vT3B0aW9ucyA9IHtcbiAgICAuLi5waW5vT3B0aW9ucyxcbiAgICBlcnJvcktleSxcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxuICAgIG1lc3NhZ2VLZXksXG4gICAgLi4uKGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSAmJiBwaW5vT3B0aW9ucy5yZWRhY3QgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7XG4gICAgICAgICAgcmVkYWN0OiB7XG4gICAgICAgICAgICBjZW5zb3I6ICdbUkVEQUNURURdJyxcbiAgICAgICAgICAgIHBhdGhzOiBidWlsZFBpbm9SZWRhY3RQYXRocyhjb25maWc/LnJlZGFjdEtleXMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA6IHt9KVxuICB9XG5cbiAgLy8gUGlubyAoYW5kLCB3aGVuIGNvbmZpZ3VyZWQsIGl0cyBwaW5vLXByZXR0eSB0cmFuc2Zvcm0gc3RyZWFtKSBpcyBleHBlbnNpdmUgdG8gY29uc3RydWN0XG4gIC8vIGFuZCBpcyBvbmx5IGV2ZXIgbmVlZGVkIHdoZW4gYSBjYWxsZXIgZXhwbGljaXRseSByZWFkcyBzdG9yZS5waW5vL2xvZ2dlci5waW5vIG9yIGNvbmZpZ3VyZXNcbiAgLy8gY29uZmlnLnBpbm8g4oCUIHRoZSBwbHVnaW4ncyBvd24gbG9nIHBhdGggd3JpdGVzIHZpYSBjb25zb2xlLiogYW5kIG5ldmVyIHRvdWNoZXMgaXQuIEJ1aWxkaW5nXG4gIC8vIGl0IGxhemlseSBiZWhpbmQgYSBzdGFibGUgUHJveHkga2VlcHMgYHN0b3JlLnBpbm8gPT09IGxvZ2dlci5waW5vYCBpZGVudGl0eSB3aGlsZSBkZWZlcnJpbmdcbiAgLy8gdGhlIGNvc3QgdW50aWwgZmlyc3QgYWNjZXNzLlxuICBjb25zdCBwcmV0dHlTdHJlYW0gPSAoKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJldHR5PiA9PlxuICAgIHByZXR0eSh7XG4gICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAuLi5wcmV0dHlQcmludE9wdGlvbnMsXG4gICAgICBlcnJvcktleSxcbiAgICAgIG1lc3NhZ2VLZXlcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuXG4gIGxldCByZWFsUGlubzogUGlubyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFBpbm8gPSAoKTogUGlubyA9PiB7XG4gICAgaWYgKCFyZWFsUGlubykge1xuICAgICAgcmVhbFBpbm8gPSBzaG91bGRQcmV0dHlQcmludFxuICAgICAgICA/IHBpbm9GYWN0b3J5KGJhc2VQaW5vT3B0aW9ucywgcHJldHR5U3RyZWFtKCkpXG4gICAgICAgIDogcGlub0ZhY3Rvcnkoe1xuICAgICAgICAgICAgLi4uYmFzZVBpbm9PcHRpb25zLFxuICAgICAgICAgICAgdHJhbnNwb3J0OiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcbiAgICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhbFBpbm9cbiAgfVxuXG4gIGNvbnN0IGxhenlQaW5vID0gbmV3IFByb3h5KHt9IGFzIFBpbm8sIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UGlubygpXG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbXG4gICAgICAgIHByb3BcbiAgICAgIF1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyAodmFsdWUgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bikuYmluZCh0YXJnZXQpXG4gICAgICAgIDogdmFsdWVcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIHByb3ApID0+IHByb3AgaW4gKGdldFBpbm8oKSBhcyBvYmplY3QpXG4gIH0pXG5cbiAgLy8gRXhwbGljaXQgY29uZmlnLnBpbm8gbWVhbnMgdGhlIHVzZXIgb3B0ZWQgaW4gdG8gcGlubyBkaXJlY3RseTogY29uc3RydWN0IGVhZ2VybHkgc29cbiAgLy8gaW52YWxpZCBvcHRpb25zIGZhaWwgZmFzdCBhdCBwbHVnaW4gc2V0dXAgdGltZSwgbWF0Y2hpbmcgcHJlLWxhenkgYmVoYXZpb3IuXG4gIGlmIChjb25maWc/LnBpbm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGdldFBpbm8oKVxuICB9XG5cbiAgLy8gUmVzb2x2ZWQgb25jZSBwZXIgbG9nZ2VyIGluc3RhbmNlOiBub25lIG9mIHRoZXNlIGRlcGVuZCBvbiBwZXItcmVxdWVzdCBzdGF0ZS5cbiAgY29uc3Qgc2lua3MgPSByZXNvbHZlU2lua3MoY29uZmlnKVxuICBjb25zdCBzYW1wbGluZyA9IHJlc29sdmVTYW1wbGluZyhjb25maWc/LnNhbXBsaW5nKVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICBlbWl0KHtcbiAgICAgIGNvbnRleHRTdG9yZSxcbiAgICAgIGRhdGEsXG4gICAgICBmb3JtYXRDb250ZXh0LFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHNhbXBsaW5nLFxuICAgICAgc2lua3MsXG4gICAgICBzdG9yZVxuICAgIH0pXG4gIH1cblxuICAvKiogUmVzb2x2ZXMgdGhlIHRhaWwgdmVyZGljdCBhbmQgcmUtZW1pdHMgd2hhdGV2ZXIgaXQgcmVzY3VlZC4gKi9cbiAgY29uc3QgZmluYWxpemVSZXF1ZXN0ID0gKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIHN0b3JlOiBTdG9yZURhdGEsXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKCFzYW1wbGluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb3V0Y29tZSA9IHtcbiAgICAgIGR1cmF0aW9uTXM6IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKSxcbiAgICAgIHBhdGhuYW1lOiBwYXJzZVJlcXVlc3RVcmxPbmNlKHJlcXVlc3QpLnBhdGhuYW1lLFxuICAgICAgc3RhdHVzXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2Ygc2FtcGxpbmcuZmluYWxpemUocmVxdWVzdCwgb3V0Y29tZSkpIHtcbiAgICAgIGVtaXQoe1xuICAgICAgICBieXBhc3NTYW1wbGluZzogdHJ1ZSxcbiAgICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgICBkYXRhOiByZWNvcmQuZGF0YSxcbiAgICAgICAgZHVyYXRpb25PdmVycmlkZTogcmVjb3JkLmR1cmF0aW9uTXMsXG4gICAgICAgIGZvcm1hdENvbnRleHQsXG4gICAgICAgIGxldmVsOiByZWNvcmQubGV2ZWwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHNhbXBsaW5nLFxuICAgICAgICBzaW5rcyxcbiAgICAgICAgLy8gVW5yZWFkIG9uIHRoaXMgcGF0aDogYGR1cmF0aW9uT3ZlcnJpZGVgIHN1cHBsaWVzIHRoZSBkdXJhdGlvbiBlYWNoXG4gICAgICAgIC8vIHJlY29yZCBoYWQgd2hlbiBpdCB3YXMgY2FwdHVyZWQuXG4gICAgICAgIHN0b3JlOiBaRVJPX1NUT1JFXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBjb250ZXh0LCBtZXNzYWdlIH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiZWdpblJlcXVlc3Q6IHJlcXVlc3QgPT4ge1xuICAgICAgc2FtcGxpbmc/LmJlZ2luKHJlcXVlc3QpXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBmaW5hbGl6ZVJlcXVlc3QsXG4gICAgZ2V0Q29udGV4dDogcmVxdWVzdCA9PiBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSxcbiAgICBoYW5kbGVIdHRwRXJyb3I6IChyZXF1ZXN0LCBlcnJvciwgc3RvcmUpID0+IHtcbiAgICAgIGhhbmRsZUh0dHBFcnJvcihcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb250ZXh0U3RvcmUsXG4gICAgICAgIHNpbmtzLFxuICAgICAgICBmb3JtYXRDb250ZXh0LFxuICAgICAgICBzYW1wbGluZ1xuICAgICAgKVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGxvZyxcbiAgICBtZXJnZUNvbnRleHQ6IChyZXF1ZXN0LCBwYXJ0aWFsKSA9PiB7XG4gICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwaW5vOiBsYXp5UGlubyxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxufVxuXG4vKiogUGx1Z2luIGVudHJ5OiBzaGFyZXMgb25lIHJlcXVlc3QtY29udGV4dCBzdG9yZSBhY3Jvc3MgdGhlIEVseXNpYSBsaWZlY3ljbGUuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUGx1Z2luTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiBjcmVhdGVMb2dnZXIob3B0aW9ucywgcGlubywgY29udGV4dFN0b3JlKVxuIiwKICAgICJjb25zdCBSRUdFWFBfU1BFQ0lBTFMgPSAvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2dcbmNvbnN0IFJFUEVBVEVEX1JFQ1VSU0lWRV9QQVRURVJOID0gL1xcKlxcKi4qXFwqXFwqL1xuY29uc3QgUkVDVVJTSVZFX1dJTERDQVJEX1NQTElUID0gL1xcKlxcKi9cbmNvbnN0IEFMUEhBTlVNRVJJQ19QQVRURVJOID0gL1thLXpBLVowLTldL1xuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKFJFR0VYUF9TUEVDSUFMUywgJ1xcXFwkJicpXG5cbi8qKlxuICogRGV0ZWN0cyBpZiBhIHBhdHRlcm4gY29udGFpbnMgcmVwZWF0ZWQgcmVjdXJzaXZlIHdpbGRjYXJkcyB0aGF0IGNvdWxkIGNhdXNlIFJlRG9TLlxuICogUGF0dGVybnMgd2l0aCBhZGphY2VudCBvciBuZWFybHktYWRqYWNlbnQgYCoqYCB3aWxkY2FyZHMgY2FuIGxlYWQgdG8gY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAqL1xuY29uc3QgaGFzUmVwZWF0ZWRSZWN1cnNpdmVXaWxkY2FyZHMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmICghUkVQRUFURURfUkVDVVJTSVZFX1BBVFRFUk4udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBwYXR0ZXJuLnNwbGl0KFJFQ1VSU0lWRV9XSUxEQ0FSRF9TUExJVClcbiAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSAqKiB3aXRoIG9ubHkgc2hvcnQgbGl0ZXJhbCBzZXBhcmF0b3JzIGJldHdlZW4gdGhlbSwgcmVqZWN0IGl0XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBzZWdtZW50c1tpXVxuICAgIC8vIEFsbG93ICoqIGZvbGxvd2VkIGJ5IHJlYXNvbmFibGUgbGl0ZXJhbCBwYXRocywgYnV0IHJlamVjdCBhZGphY2VudCBvciBuZWFybHktYWRqYWNlbnQgKipcbiAgICBpZiAoXG4gICAgICBzZXBhcmF0b3IgPT09ICcnIHx8XG4gICAgICAoc2VwYXJhdG9yLmxlbmd0aCA8IDIgJiYgIUFMUEhBTlVNRVJJQ19QQVRURVJOLnRlc3Qoc2VwYXJhdG9yKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBwYXRoIGdsb2IgaW50byBhbiBhbmNob3JlZCBgUmVnRXhwYC5cbiAqXG4gKiAtIGAqKmAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVycywgaW5jbHVkaW5nIGAvYFxuICogLSBgKmAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVycyBleGNlcHQgYC9gXG4gKiAtIGA/YCBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgYC9gXG4gKlxuICogRXZlcnl0aGluZyBlbHNlIGlzIG1hdGNoZWQgbGl0ZXJhbGx5LCBzbyBgL3YxL3VzZXJzYCBvbmx5IG1hdGNoZXMgaXRzZWxmLlxuICovXG5leHBvcnQgY29uc3QgZ2xvYlRvUmVnRXhwID0gKHBhdHRlcm46IHN0cmluZyk6IFJlZ0V4cCA9PiB7XG4gIC8vIERldGVjdCByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzIHRoYXQgY291bGQgY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAgaWYgKGhhc1JlcGVhdGVkUmVjdXJzaXZlV2lsZGNhcmRzKHBhdHRlcm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgZ2xvYiBwYXR0ZXJuOiByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzICgqKikgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3VlcydcbiAgICApXG4gIH1cblxuICBsZXQgc291cmNlID0gJydcbiAgbGV0IGluZGV4ID0gMFxuXG4gIHdoaWxlIChpbmRleCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHBhdHRlcm5baW5kZXhdXG5cbiAgICBpZiAoY2hhciA9PT0gJyonKSB7XG4gICAgICBjb25zdCBjcm9zc2VzU2VnbWVudHMgPSBwYXR0ZXJuW2luZGV4ICsgMV0gPT09ICcqJ1xuICAgICAgc291cmNlICs9IGNyb3NzZXNTZWdtZW50cyA/ICcuKicgOiAnW14vXSonXG4gICAgICBpbmRleCArPSBjcm9zc2VzU2VnbWVudHMgPyAyIDogMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJz8nKSB7XG4gICAgICBzb3VyY2UgKz0gJ1teL10nXG4gICAgICBpbmRleCArPSAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZSArPSBlc2NhcGVSZWdFeHAoY2hhcilcbiAgICBpbmRleCArPSAxXG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7c291cmNlfSRgKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBTYW1wbGluZ0NvbmZpZyxcbiAgVGFpbFNhbXBsaW5nQ29uZmlnXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnbG9iVG9SZWdFeHAgfSBmcm9tICcuL2dsb2InXG5cbmNvbnN0IEZVTExfUkFURSA9IDEwMFxuY29uc3QgREVGQVVMVF9NQVhfQlVGRkVSRURfUEVSX1JFUVVFU1QgPSAxMDBcblxuY29uc3QgTk9fUkVDT1JEUzogcmVhZG9ubHkgQnVmZmVyZWRSZWNvcmRbXSA9IE9iamVjdC5mcmVlemUoW10pXG5cbi8qKlxuICogV2hhdCBoZWFkIHNhbXBsaW5nIGRlY2lkZWQgZm9yIGEgc2luZ2xlIHJlY29yZDpcbiAqXG4gKiAtIGBrZWVwYCDigJQgZW1pdCBub3dcbiAqIC0gYGJ1ZmZlcmAg4oCUIGhvbGQgaXQgdW50aWwgdGhlIHJlcXVlc3QncyB0YWlsIHZlcmRpY3QgaXMga25vd25cbiAqIC0gYGRyb3BgIOKAlCBkaXNjYXJkIGl0OyBubyB0YWlsIHJ1bGUgY2FuIGJyaW5nIGl0IGJhY2tcbiAqL1xuZXhwb3J0IHR5cGUgU2FtcGxpbmdEZWNpc2lvbiA9ICdidWZmZXInIHwgJ2Ryb3AnIHwgJ2tlZXAnXG5cbi8qKiBBIGhlYWQtZHJvcHBlZCByZWNvcmQgaGVsZCB1bnRpbCBpdHMgcmVxdWVzdCdzIHRhaWwgdmVyZGljdCBpcyBrbm93bi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSZWNvcmQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAvKiogRWxhcHNlZCB0aW1lIGF0IGNhcHR1cmUsIHNvIGEgcmVwbGF5ZWQgcmVjb3JkIGtlZXBzIGl0cyBvcmlnaW5hbCBkdXJhdGlvbi4gKi9cbiAgZHVyYXRpb25NczogbnVtYmVyXG4gIGxldmVsOiBMb2dMZXZlbFxufVxuXG4vKiogSG93IGEgcmVxdWVzdCBmaW5pc2hlZCwgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBUYWlsU2FtcGxpbmdDb25maWd9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3V0Y29tZSB7XG4gIGR1cmF0aW9uTXM6IG51bWJlclxuICBwYXRobmFtZTogc3RyaW5nXG4gIHN0YXR1czogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FtcGxpbmdSdW50aW1lIHtcbiAgLyoqIE1hcmtzIGEgcmVxdWVzdCBhcyBvbmUgdGhhdCB3aWxsIHJlYWNoIHtAbGluayBTYW1wbGluZ1J1bnRpbWUuZmluYWxpemV9LiAqL1xuICBiZWdpbjogKGtleTogb2JqZWN0KSA9PiB2b2lkXG4gIC8qKiBIb2xkcyBhIGhlYWQtZHJvcHBlZCByZWNvcmQsIHVwIHRvIGBtYXhCdWZmZXJlZFBlclJlcXVlc3RgLiAqL1xuICBidWZmZXI6IChrZXk6IG9iamVjdCwgcmVjb3JkOiBCdWZmZXJlZFJlY29yZCkgPT4gdm9pZFxuICBkZWNpZGU6IChsZXZlbDogTG9nTGV2ZWwsIGtleTogb2JqZWN0KSA9PiBTYW1wbGluZ0RlY2lzaW9uXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgdGFpbCB2ZXJkaWN0IGZvciBhIGZpbmlzaGVkIHJlcXVlc3QuIFJldHVybnMgdGhlIHJlY29yZHMgdG9cbiAgICogcmVwbGF5IOKAlCBlbXB0eSB3aGVuIHRoZSBvdXRjb21lIG1hdGNoZWQgbm8gdGFpbCBydWxlIOKAlCBhbmQgbWFya3MgYSByZXNjdWVkXG4gICAqIHJlcXVlc3Qgc28gdGhlIGNhbGxlcidzIG93biBmaW5hbCBsb2cgYnlwYXNzZXMgaGVhZCBzYW1wbGluZyB0b28uXG4gICAqL1xuICBmaW5hbGl6ZTogKGtleTogb2JqZWN0LCBvdXRjb21lOiBSZXF1ZXN0T3V0Y29tZSkgPT4gcmVhZG9ubHkgQnVmZmVyZWRSZWNvcmRbXVxufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRUYWlsIHtcbiAgZHVyYXRpb25Ncz86IG51bWJlclxuICBwYXRocz86IFJlZ0V4cFtdXG4gIHN0YXR1cz86IG51bWJlclxufVxuXG5jb25zdCByZXNvbHZlVGFpbCA9IChcbiAgdGFpbDogVGFpbFNhbXBsaW5nQ29uZmlnIHwgdW5kZWZpbmVkXG4pOiBSZXNvbHZlZFRhaWwgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXRhaWwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gdGFpbC5wYXRocz8ubGVuZ3RoID8gdGFpbC5wYXRocy5tYXAoZ2xvYlRvUmVnRXhwKSA6IHVuZGVmaW5lZFxuICBpZiAoXG4gICAgdGFpbC5kdXJhdGlvbk1zID09PSB1bmRlZmluZWQgJiZcbiAgICB0YWlsLnN0YXR1cyA9PT0gdW5kZWZpbmVkICYmXG4gICAgcGF0aHMgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHJldHVybiB7IGR1cmF0aW9uTXM6IHRhaWwuZHVyYXRpb25NcywgcGF0aHMsIHN0YXR1czogdGFpbC5zdGF0dXMgfVxufVxuXG4vKiogVGFpbCBydWxlcyBhcmUgT1ItZWQ6IGFueSBzaW5nbGUgbWF0Y2ggcmVzY3VlcyB0aGUgd2hvbGUgcmVxdWVzdC4gKi9cbmNvbnN0IG1hdGNoZXNUYWlsID0gKHRhaWw6IFJlc29sdmVkVGFpbCwgb3V0Y29tZTogUmVxdWVzdE91dGNvbWUpOiBib29sZWFuID0+IHtcbiAgaWYgKHRhaWwuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgb3V0Y29tZS5zdGF0dXMgPj0gdGFpbC5zdGF0dXMpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh0YWlsLmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiBvdXRjb21lLmR1cmF0aW9uTXMgPj0gdGFpbC5kdXJhdGlvbk1zKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAodGFpbC5wYXRocykge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0YWlsLnBhdGhzKSB7XG4gICAgICBpZiAocGF0aC50ZXN0KG91dGNvbWUucGF0aG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiogS2VlcHMgb25seSB0aGUgcmF0ZXMgdGhhdCBhY3R1YWxseSBkcm9wIHNvbWV0aGluZy4gKi9cbmNvbnN0IHJlc29sdmVSYXRlcyA9IChcbiAgaGVhZDogU2FtcGxpbmdDb25maWdbJ2hlYWQnXVxuKTogUGFydGlhbDxSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFoZWFkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByYXRlczogUGFydGlhbDxSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4+ID0ge31cbiAgbGV0IGhhc1JhdGUgPSBmYWxzZVxuICBmb3IgKGNvbnN0IFtsZXZlbCwgcmF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZCkpIHtcbiAgICBpZiAodHlwZW9mIHJhdGUgPT09ICdudW1iZXInICYmIHJhdGUgPCBGVUxMX1JBVEUpIHtcbiAgICAgIHJhdGVzW2xldmVsIGFzIExvZ0xldmVsXSA9IHJhdGVcbiAgICAgIGhhc1JhdGUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc1JhdGUgPyByYXRlcyA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc2FtcGxpbmcgcnVudGltZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29uZmlnIGRyb3BzIG5vdGhpbmcg4oCUXG4gKiB0YWlsIHJ1bGVzIGFsb25lIGFyZSBhIG5vLW9wLCBzaW5jZSBvbmx5IGhlYWQtZHJvcHBlZCByZWNvcmRzIGFyZSBldmVyXG4gKiBidWZmZXJlZC5cbiAqXG4gKiBAcGFyYW0gcmFuZG9tIEluamVjdGFibGUgZm9yIGRldGVybWluaXN0aWMgdGVzdHM7IGRlZmF1bHRzIHRvIGBNYXRoLnJhbmRvbWAuXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlU2FtcGxpbmcgPSAoXG4gIGNvbmZpZzogU2FtcGxpbmdDb25maWcgfCB1bmRlZmluZWQsXG4gIHJhbmRvbTogKCkgPT4gbnVtYmVyID0gTWF0aC5yYW5kb21cbik6IFNhbXBsaW5nUnVudGltZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJhdGVzID0gcmVzb2x2ZVJhdGVzKGNvbmZpZz8uaGVhZClcbiAgaWYgKCFyYXRlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGFpbCA9IHJlc29sdmVUYWlsKGNvbmZpZz8udGFpbClcbiAgY29uc3QgbWF4QnVmZmVyZWQgPVxuICAgIGNvbmZpZz8ubWF4QnVmZmVyZWRQZXJSZXF1ZXN0ID8/IERFRkFVTFRfTUFYX0JVRkZFUkVEX1BFUl9SRVFVRVNUXG5cbiAgY29uc3QgYnVmZmVycyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQnVmZmVyZWRSZWNvcmRbXT4oKVxuICAvLyBPbmx5IHJlcXVlc3RzIHRoZSBwbHVnaW4gb3BlbmVkIChhbmQgd2lsbCBjbG9zZSkgbWF5IGJ1ZmZlcjogV2ViU29ja2V0XG4gIC8vIHBzZXVkby1yZXF1ZXN0cyBhbmQgaGFuZC1yb2xsZWQgYGNyZWF0ZUxvZ2dlcmAgY2FsbGVycyBuZXZlciBmaW5hbGl6ZSwgc29cbiAgLy8gYnVmZmVyaW5nIGZvciB0aGVtIHdvdWxkIGdyb3cgd2l0aG91dCBib3VuZC5cbiAgY29uc3QgaW5GbGlnaHQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcbiAgY29uc3QgcmVzY3VlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW4oa2V5KSB7XG4gICAgICBpZiAodGFpbCkge1xuICAgICAgICBpbkZsaWdodC5hZGQoa2V5KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBidWZmZXIoa2V5LCByZWNvcmQpIHtcbiAgICAgIGxldCBidWNrZXQgPSBidWZmZXJzLmdldChrZXkpXG4gICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICBidWNrZXQgPSBbXVxuICAgICAgICBidWZmZXJzLnNldChrZXksIGJ1Y2tldClcbiAgICAgIH1cbiAgICAgIGlmIChidWNrZXQubGVuZ3RoID49IG1heEJ1ZmZlcmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnVja2V0LnB1c2gocmVjb3JkKVxuICAgIH0sXG5cbiAgICBkZWNpZGUobGV2ZWwsIGtleSkge1xuICAgICAgaWYgKHJlc2N1ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuICdrZWVwJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXRlID0gcmF0ZXNbbGV2ZWxdID8/IEZVTExfUkFURVxuICAgICAgaWYgKHJhdGUgPj0gRlVMTF9SQVRFIHx8IChyYXRlID4gMCAmJiByYW5kb20oKSAqIEZVTExfUkFURSA8IHJhdGUpKSB7XG4gICAgICAgIHJldHVybiAna2VlcCdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhaWwgJiYgaW5GbGlnaHQuaGFzKGtleSkgPyAnYnVmZmVyJyA6ICdkcm9wJ1xuICAgIH0sXG5cbiAgICBmaW5hbGl6ZShrZXksIG91dGNvbWUpIHtcbiAgICAgIGluRmxpZ2h0LmRlbGV0ZShrZXkpXG4gICAgICBjb25zdCBidWNrZXQgPSBidWZmZXJzLmdldChrZXkpXG4gICAgICBidWZmZXJzLmRlbGV0ZShrZXkpXG5cbiAgICAgIGlmICghKHRhaWwgJiYgbWF0Y2hlc1RhaWwodGFpbCwgb3V0Y29tZSkpKSB7XG4gICAgICAgIHJldHVybiBOT19SRUNPUkRTXG4gICAgICB9XG5cbiAgICAgIHJlc2N1ZWQuYWRkKGtleSlcbiAgICAgIHJldHVybiBidWNrZXQgPz8gTk9fUkVDT1JEU1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJjb25zdCBOQU5PU19QRVJfTUlMTEkgPSAxXzAwMF8wMDBcblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgZWxhcHNlZCBzaW5jZSBgYmVmb3JlVGltZWAsIG9yIGAwYCB3aGVuIG5vIHN0YXJ0IHdhcyByZWNvcmRlZFxuICogKGBCaWdJbnQoMClgIGlzIHRoZSBwbHVnaW4ncyBcIm5ldmVyIHN0YXJ0ZWRcIiBzZW50aW5lbCkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbGFwc2VkTXMgPSAoYmVmb3JlVGltZTogYmlnaW50KTogbnVtYmVyID0+XG4gIGJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgID8gMFxuICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gYmVmb3JlVGltZSkgLyBOQU5PU19QRVJfTUlMTElcbiIsCiAgICAiLy8gTG9jYWwgcGFydCDiiaQ2NCwgZG9tYWluIOKJpDI1MywgVExEIDLigJM2MyAoUkZDIDUzMjEgLyAxMDM1LWlzaCBsaW1pdHM7IGJvdW5kZWQgdG8gYXZvaWQgUmVEb1MpXG5jb25zdCBFTUFJTF9SRUdFWCA9XG4gIC9bYS16QS1aMC05Ll8lKy1dezEsNjR9QFthLXpBLVowLTkuLV17MSwyNTN9XFwuW2EtekEtWl17Miw2M30vZ1xuY29uc3QgSVBWNF9SRUdFWCA9XG4gIC8oPzwhW1xcdy8uXSkoPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZClcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD8hW1xcdy5dKS9nXG4vKipcbiAqIEJvdW5kZWQgSVB2NjogZWl0aGVyIGFsbCA4IGdyb3Vwcywgb3IgYSBzaW5nbGUgYDo6YCBjb21wcmVzc2lvbi4gUmVxdWlyaW5nXG4gKiBvbmUgb2YgdGhvc2Ugc2hhcGVzIChyYXRoZXIgdGhhbiBcIjIrIGNvbG9uLXNlcGFyYXRlZCBoZXggZ3JvdXBzXCIpIGtlZXBzXG4gKiBjbG9jayB0aW1lcyAoYDEyOjMwOjQ1YCkgYW5kIE1BQyBhZGRyZXNzZXMgKGBhYTpiYjpjYzpkZDplZTpmZmApIGZyb21cbiAqIG1hdGNoaW5nLlxuICovXG5jb25zdCBJUFY2X1JFR0VYID1cbiAgLyg/PCFbXFx3Ol0pKD86KD86WzAtOWEtZl17MSw0fTopezd9WzAtOWEtZl17MSw0fXwoPzpbMC05YS1mXXsxLDR9Oil7MSw3fTooPzpbMC05YS1mXXsxLDR9KD86OlswLTlhLWZdezEsNH0pezAsNn0pP3w6Oig/OlswLTlhLWZdezEsNH0oPzo6WzAtOWEtZl17MSw0fSl7MCw2fSkpKD8hW1xcdzpdKS9naVxuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ1xuY29uc3QgSldUX1JFR0VYID0gL2V5SlthLXpBLVowLTlfLV0rXFwuZXlKW2EtekEtWjAtOV8tXStcXC5bYS16QS1aMC05Xy1dKy9nXG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKiBDYXNlLWluc2Vuc2l0aXZlIGtleS9oZWFkZXIgbmFtZXMgd2hvc2UgVkFMVUVTIGFyZSBhbHdheXMgcmVkYWN0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRURBQ1RfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdhdXRob3JpemF0aW9uJyxcbiAgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAnY29va2llJyxcbiAgJ3NldC1jb29raWUnLFxuICAneC1hcGkta2V5JyxcbiAgJ2FwaS1rZXknLFxuICAnYXBpa2V5JyxcbiAgJ3gtYXV0aC10b2tlbicsXG4gICdwYXNzd29yZCcsXG4gICdwYXNzd2QnLFxuICAnc2VjcmV0JyxcbiAgJ2NsaWVudC1zZWNyZXQnLFxuICAndG9rZW4nLFxuICAnYWNjZXNzLXRva2VuJyxcbiAgJ3JlZnJlc2gtdG9rZW4nLFxuICAnaWQtdG9rZW4nLFxuICAnc2Vzc2lvbicsXG4gICdzZXNzaW9uLWlkJyxcbiAgJ3ByaXZhdGUta2V5JyxcbiAgJ2NyZWRpdC1jYXJkJyxcbiAgJ2NhcmQtbnVtYmVyJyxcbiAgJ2N2dicsXG4gICdzc24nXG5dXG5cbmNvbnN0IENBTUVMX0NBU0VfQk9VTkRBUllfUkVHRVggPSAvKFthLXowLTldKShbQS1aXSkvZ1xuXG4vKiogTm9ybWFsaXplIGBYX0FwaS1LZXlgIC8gYGFwaUtleWAgc3R5bGUgdmFyaWFudHMgdG8gYHgtYXBpLWtleWAgZm9ybS4gKi9cbmNvbnN0IG5vcm1hbGl6ZUtleU5hbWUgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAga2V5XG4gICAgLnJlcGxhY2UoQ0FNRUxfQ0FTRV9CT1VOREFSWV9SRUdFWCwgJyQxLSQyJylcbiAgICAucmVwbGFjZUFsbCgnXycsICctJylcbiAgICAudG9Mb3dlckNhc2UoKVxuXG5leHBvcnQgY29uc3QgaXNTZW5zaXRpdmVLZXkgPSAoXG4gIGtleTogc3RyaW5nLFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVLZXlOYW1lKGtleSlcbiAgaWYgKERFRkFVTFRfUkVEQUNUX0tFWVMuaW5jbHVkZXMobm9ybWFsaXplZCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiAoXG4gICAgZXh0cmFLZXlzPy5zb21lKGV4dHJhS2V5ID0+IG5vcm1hbGl6ZUtleU5hbWUoZXh0cmFLZXkpID09PSBub3JtYWxpemVkKSA/P1xuICAgIGZhbHNlXG4gIClcbn1cblxuLyoqIHBpbm8gcmVkYWN0IHBhdGhzIGZvciBvbmUga2V5OiB0b3AtbGV2ZWwgYW5kIG9uZSBuZXN0aW5nIGxldmVsLiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkUGlub1JlZGFjdFBhdGhzID0gKFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBrZXlzID0gWy4uLkRFRkFVTFRfUkVEQUNUX0tFWVMsIC4uLihleHRyYUtleXMgPz8gW10pXVxuICByZXR1cm4ga2V5cy5mbGF0TWFwKGtleSA9PiB7XG4gICAgLy8gcGlubyBwYXRocyBkb24ndCBhbGxvdyBgLWAgaW4gYmFyZSBpZGVudGlmaWVyczsgYnJhY2tldC1xdW90ZSB0aGVtLlxuICAgIGlmIChrZXkuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgcmV0dXJuIFtgW1wiJHtrZXl9XCJdYCwgYCpbXCIke2tleX1cIl1gXVxuICAgIH1cbiAgICByZXR1cm4gW2tleSwgYCouJHtrZXl9YF1cbiAgfSlcbn1cblxuLyoqXG4gKiBIb3N0IGFuZCB1c2VyaW5mbyBjYW5ub3QgY29udGFpbiBgW1JFREFDVEVEXWAg4oCUIGBbYCBiZWdpbnMgYW4gSVB2NiBsaXRlcmFsIGluIFVSTHMgYW5kIGJyZWFrcyBwYXJzaW5nLlxuICovXG5jb25zdCBVUkxfU0FGRV9SRURBQ1QgPSAncmVkYWN0ZWQnXG5cbmNvbnN0IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICByZWRhY3RTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuXG4vKiogQXBwbHkgUElJIHJlZGFjdGlvbiB0byBhIHJlcXVlc3QgVVJMIHdoaWxlIGtlZXBpbmcgdGhlIHJlc3VsdCBwYXJzZWFibGUgYnkgdGhlIFVSTC9SZXF1ZXN0IGNvbnN0cnVjdG9ycy4gKi9cbmNvbnN0IHJlZGFjdFJlcXVlc3RVcmwgPSAoXG4gIHVybFN0cmluZzogc3RyaW5nLFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmxTdHJpbmcpXG4gICAgaWYgKHUudXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICB1LnVzZXJuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnVzZXJuYW1lKVxuICAgIH1cbiAgICBpZiAodS5wYXNzd29yZCAhPT0gJycpIHtcbiAgICAgIHUucGFzc3dvcmQgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUucGFzc3dvcmQpXG4gICAgfVxuICAgIHUuaG9zdG5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUuaG9zdG5hbWUpXG4gICAgdS5wYXRobmFtZSA9IHJlZGFjdFN0cmluZyh1LnBhdGhuYW1lKVxuICAgIC8vIGBzZWFyY2hQYXJhbXMuc2V0YCByZS1zZXJpYWxpemVzIHRoZSB3aG9sZSBxdWVyeSBzdHJpbmcsIHNvIHJlZGFjdFxuICAgIC8vIGRlY29kZWQgdmFsdWVzIGRpcmVjdGx5IHJhdGhlciB0aGFuIHJlLXJ1bm5pbmcgcGF0dGVybiByZWRhY3Rpb24gb25cbiAgICAvLyBgdS5zZWFyY2hgIGFmdGVyd2FyZCAod2hpY2ggd291bGQgc2VlIGFscmVhZHkgcGVyY2VudC1lbmNvZGVkIHRleHQpLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIFsuLi51LnNlYXJjaFBhcmFtcy5rZXlzKCldKSB7XG4gICAgICBpZiAoaXNTZW5zaXRpdmVLZXkoa2V5LCBleHRyYUtleXMpKSB7XG4gICAgICAgIHUuc2VhcmNoUGFyYW1zLnNldChrZXksIFVSTF9TQUZFX1JFREFDVClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdS5zZWFyY2hQYXJhbXMuZ2V0KGtleSlcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZWRhY3RlZFZhbHVlID0gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgICAgICBpZiAocmVkYWN0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICB1LnNlYXJjaFBhcmFtcy5zZXQoa2V5LCByZWRhY3RlZFZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHUuaGFzaCA9IHJlZGFjdFN0cmluZyh1Lmhhc2gpXG4gICAgcmV0dXJuIHUudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHVybFN0cmluZykucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG4gIH1cbn1cblxuLyoqIEx1aG4gY2hlY2tzdW07IGBkaWdpdHNgIG11c3QgY29udGFpbiBvbmx5IGAwLTlgIGFuZCBsZW5ndGggaW4gUEFOIHJhbmdlLiAqL1xuY29uc3QgcGFzc2VzTHVobiA9IChkaWdpdHM6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGlnaXRzLmxlbmd0aCA8IFBBTl9NSU5fTEVOIHx8IGRpZ2l0cy5sZW5ndGggPiBQQU5fTUFYX0xFTikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IHN1bSA9IDBcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IDU3KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IG4gPSBjb2RlIC0gNDhcbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBuICo9IDJcbiAgICAgIGlmIChuID4gOSkge1xuICAgICAgICBuIC09IDlcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtICs9IG5cbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlXG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDBcbn1cblxuY29uc3QgcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVgsIG1hdGNoID0+IHtcbiAgICBjb25zdCBkaWdpdHMgPSBtYXRjaC5yZXBsYWNlKC9cXEQvZywgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuLyoqIFJldHVybnMgYHRleHRgIHVuY2hhbmdlZCAoc2FtZSB2YWx1ZSkgd2hlbiBub3RoaW5nIG1hdGNoZWQg4oCUIGNhbGxlcnMgY2FuIGNvbXBhcmUgYD09PSBpbnB1dGAuICovXG5leHBvcnQgY29uc3QgcmVkYWN0U3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZXh0XG5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU1BSUxfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjRfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjZfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzKHJlc3VsdClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSldUX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gRXJyb3JzIGFyZSBleGVtcHQgZnJvbSB0aGUgaWRlbnRpdHkgZmFzdCBwYXRoIGJlbG93OiBhIHJlZGFjdGVkIEVycm9yIGlzIGFsd2F5cyBjb25zdHJ1Y3RlZFxuLy8gZnJlc2ggKGV2ZW4gd2hlbiBub3RoaW5nIGNoYW5nZWQpIHNvIGNvbnN1bWVycyBuZXZlciByZWNlaXZlIHRoZSBvcmlnaW5hbCwgcG90ZW50aWFsbHlcbi8vIHN0YWNrLXRyYWNlLWNhcnJ5aW5nIGluc3RhbmNlIGJ5IHJlZmVyZW5jZS5cbmNvbnN0IHJlZGFjdEVycm9yQ2xvbmUgPSAoXG4gIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3IubWVzc2FnZSlcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWxFcnJvcikgYXMgb2JqZWN0XG4gIGNvbnN0IG5ld0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90bykgYXMgRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIG5ld0Vycm9yLm1lc3NhZ2UgPSByZWRhY3RlZE1lc3NhZ2VcbiAgbmV3RXJyb3IubmFtZSA9IG9yaWdpbmFsRXJyb3IubmFtZVxuXG4gIGlmIChvcmlnaW5hbEVycm9yLnN0YWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICBuZXdFcnJvci5zdGFjayA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLnN0YWNrKVxuICB9XG5cbiAgY29uc3QgZXJyb3JSZWNvcmQgPSBvcmlnaW5hbEVycm9yIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvclJlY29yZCkpIHtcbiAgICBpZiAoa2V5ID09PSAnbWVzc2FnZScgfHwga2V5ID09PSAnbmFtZScgfHwga2V5ID09PSAnc3RhY2snKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVycm9yUmVjb3JkLCBrZXkpXG4gICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZGVzY3JpcHRvci5nZXQgIT09IHVuZGVmaW5lZCB8fCBkZXNjcmlwdG9yLnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwgZGVzY3JpcHRvcilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgcmVkYWN0ZWRWYWx1ZSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICA6IHJlZGFjdElubmVyKGRlc2NyaXB0b3IudmFsdWUsIGluUHJvZ3Jlc3MsIGV4dHJhS2V5cylcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFcnJvciwga2V5LCB7XG4gICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgdmFsdWU6IHJlZGFjdGVkVmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5ld0Vycm9yXG59XG5cbi8qKlxuICogUmVkYWN0cyBlYWNoIGl0ZW07IHJldHVybnMgdGhlIE9SSUdJTkFMIGFycmF5IHJlZmVyZW5jZSB3aGVuIG5vIGl0ZW0gY2hhbmdlZCAoemVyb1xuICogYWxsb2NhdGlvbnMgZm9yIHRoZSBjb21tb24gbm8tUElJIGNhc2UpLiBBIG5ldyBhcnJheSBpcyBtYXRlcmlhbGl6ZWQgbGF6aWx5LCBzdGFydGluZyBmcm9tXG4gKiB0aGUgZmlyc3QgaXRlbSB0aGF0IGNoYW5nZXMg4oCUIGl0ZW1zIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBrbm93bi11bmNoYW5nZWQsIHNvIHRoZXkncmUgY29waWVkXG4gKiBmcm9tIGB2YWx1ZWAgYXMtaXMgcmF0aGVyIHRoYW4gcmVjb21wdXRlZC5cbiAqL1xuY29uc3QgcmVkYWN0QXJyYXlJdGVtcyA9IChcbiAgdmFsdWU6IHVua25vd25bXSxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogdW5rbm93bltdID0+IHtcbiAgbGV0IHJlc3VsdDogdW5rbm93bltdIHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIG9yaWdpbmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdElubmVyKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmIHJlZGFjdGVkICE9PSBvcmlnaW5hbCkge1xuICAgICAgcmVzdWx0ID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpXG4gICAgfVxuICAgIHJlc3VsdD8ucHVzaChyZWRhY3RlZClcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPz8gdmFsdWVcbn1cblxuLyoqIFNhbWUgbGF6eS1tYXRlcmlhbGl6YXRpb24gc3RyYXRlZ3kgYXMge0BsaW5rIHJlZGFjdEFycmF5SXRlbXN9LCBmb3IgcGxhaW4gb2JqZWN0cy4gKi9cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpXG4gIGxldCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2Yga2V5cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHJlY29yZFZhbHVlW2tleV1cbiAgICBjb25zdCBzZW5zaXRpdmUgPSBpc1NlbnNpdGl2ZUtleShrZXksIGV4dHJhS2V5cylcbiAgICBjb25zdCByZWRhY3RlZCA9IHNlbnNpdGl2ZVxuICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICA6IHJlZGFjdElubmVyKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG5cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgJiYgKHNlbnNpdGl2ZSB8fCByZWRhY3RlZCAhPT0gb3JpZ2luYWwpKSB7XG4gICAgICByZXN1bHQgPSB7fVxuICAgICAgZm9yIChjb25zdCBwcmlvcktleSBvZiBrZXlzLnNsaWNlKDAsIGluZGV4KSkge1xuICAgICAgICByZXN1bHRbcHJpb3JLZXldID0gcmVjb3JkVmFsdWVbcHJpb3JLZXldXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0W2tleV0gPSByZWRhY3RlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPz8gcmVjb3JkVmFsdWVcbn1cblxuY29uc3Qgd2l0aFJlZW50cmFuY3lHdWFyZCA9IDxUPihcbiAgb2JqOiBvYmplY3QsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgcnVuOiAoKSA9PiBUXG4pOiBUID0+IHtcbiAgaW5Qcm9ncmVzcy5hZGQob2JqKVxuICB0cnkge1xuICAgIHJldHVybiBydW4oKVxuICB9IGZpbmFsbHkge1xuICAgIGluUHJvZ3Jlc3MuZGVsZXRlKG9iailcbiAgfVxufVxuXG5jb25zdCByZWRhY3RJbm5lciA9IDxUPihcbiAgdmFsdWU6IFQsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgLy8gRGF0ZXMgY2Fycnkgbm8gcmVkYWN0YWJsZSBzdHJpbmcgY29udGVudCBhbmQgYXJlIG5ldmVyIG11dGF0ZWQgYnkgdGhpcyBtb2R1bGUsIHNvIHRoZXlcbiAgICAvLyBwYXNzIHRocm91Z2ggYnkgcmVmZXJlbmNlIChwYXJ0IG9mIHRoZSBpZGVudGl0eSBmYXN0IHBhdGgpIGluc3RlYWQgb2YgYmVpbmcgZGVmZW5zaXZlbHlcbiAgICAvLyBjbG9uZWQgYXMgYmVmb3JlLlxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RBcnJheUl0ZW1zKHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICByZWRhY3RSZWNvcmRFbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQsIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdKTogVCA9PlxuICByZWRhY3RJbm5lcih2YWx1ZSwgbmV3IFdlYWtTZXQoKSwgZXh0cmFLZXlzKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMLCBtZXRob2QgYW5kIGhlYWRlcnMgZm9yIGxvZ2dpbmcgd2l0aCB0aGUgc2FtZSBzdHJpbmcgcmVkYWN0aW9uIGFzIHtAbGluayByZWRhY3R9LlxuICogVGhlIHJldHVybmVkIHJlcXVlc3QgaXMgYSBsb2dnaW5nLW9ubHkgYXJ0aWZhY3QgY2FycnlpbmcgdXJsL21ldGhvZC9oZWFkZXJzL3NpZ25hbDsgaXQgaW50ZW50aW9uYWxseVxuICogb21pdHMgdGhlIGJvZHkgc28gaXQgbmV2ZXIgcmUtdXNlcyB0aGUgb3JpZ2luYWwgKHBvc3NpYmx5IGFscmVhZHktY29uc3VtZWQpIHJlcXVlc3Qgc3RyZWFtLiBUaGVcbiAqIG9yaWdpbmFsIHJlcXVlc3QgaXMgbGVmdCB1bnRvdWNoZWQgYW5kIHJlbWFpbnMgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFJlcXVlc3QgPT4ge1xuICBjb25zdCByZWRhY3RlZFVybCA9IHJlZGFjdFJlcXVlc3RVcmwocmVxdWVzdC51cmwsIGV4dHJhS2V5cylcbiAgY29uc3QgbmV4dEhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIGxldCBoZWFkZXJzQ2hhbmdlZCA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IGlzU2Vuc2l0aXZlS2V5KG5hbWUsIGV4dHJhS2V5cylcbiAgICAgID8gUkVEQUNURURfVEVYVFxuICAgICAgOiByZWRhY3RTdHJpbmcodmFsdWUpXG4gICAgaWYgKHJlZGFjdGVkICE9PSB2YWx1ZSkge1xuICAgICAgaGVhZGVyc0NoYW5nZWQgPSB0cnVlXG4gICAgfVxuICAgIG5leHRIZWFkZXJzLnNldChuYW1lLCByZWRhY3RlZClcbiAgfVxuXG4gIGNvbnN0IHJlZGFjdGVkTWV0aG9kID0gcmVkYWN0U3RyaW5nKHJlcXVlc3QubWV0aG9kKVxuICBjb25zdCB1cmxDaGFuZ2VkID0gcmVkYWN0ZWRVcmwgIT09IHJlcXVlc3QudXJsXG4gIGNvbnN0IG1ldGhvZENoYW5nZWQgPSByZWRhY3RlZE1ldGhvZCAhPT0gcmVxdWVzdC5tZXRob2RcblxuICBpZiAoISh1cmxDaGFuZ2VkIHx8IGhlYWRlcnNDaGFuZ2VkIHx8IG1ldGhvZENoYW5nZWQpKSB7XG4gICAgcmV0dXJuIHJlcXVlc3RcbiAgfVxuXG4gIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIG1ldGhvZDogcmVkYWN0ZWRNZXRob2QsXG4gICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbFxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHJlZGFjdGVkVXJsLCBpbml0KVxufVxuIiwKICAgICJpbXBvcnQgeyBTVEFUVVNfQ09ERVMgfSBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgaXNTdHJ1Y3R1cmVkRXJyb3IsIHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB7IHNhbml0aXplTG9nVGV4dCB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IERFRkFVTFRfU0xPV19NUyA9IDUwMFxuY29uc3QgREVGQVVMVF9WRVJZX1NMT1dfTVMgPSAxMDAwXG5jb25zdCBNRVRIT0RfUEFEID0gN1xuXG5jb25zdCBERUZBVUxUX0xPR19GT1JNQVQgPVxuICAne25vd30ge3NlcnZpY2V9e2ljb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge2R1cmF0aW9ufSB7bWVzc2FnZX17c3BlZWR9J1xuXG5jb25zdCBMT0dfRk9STUFUX1JFR0VYID1cbiAgL1xceyhub3d8ZXBvY2h8bGV2ZWx8aWNvbnxkdXJhdGlvbnxtZXRob2R8cGF0aG5hbWV8cGF0aHxxdWVyeXxzdGF0dXN8c3RhdHVzVGV4dHxtZXNzYWdlfGlwfGNvbnRleHR8c2VydmljZXxzcGVlZHxyZXF1ZXN0SWQpXFx9L2dcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZWRMb2dPdXRwdXQge1xuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdXG4gIG1haW46IHN0cmluZ1xufVxuXG5jb25zdCBzaG91bGRVc2VDb2xvcnMgPSAob3B0aW9uczogT3B0aW9ucyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXG5cbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXG4gIHJldHVybiBlbmFibGVkQnlDb25maWcgJiYgaXNUdHlcbn1cblxuLy8gcGluby1wcmV0dHkncyBzaG9ydGhhbmQgZm9yIGB5eXl5LW1tLWRkIEhIOk1NOnNzLlNTU2AgKG1pbnVzIHRoZSBgb2Bcbi8vIHRpbWV6b25lLW9mZnNldCB0b2tlbiwgd2hpY2ggdGhpcyBmb3JtYXR0ZXIgZG9lcyBub3Qgc3VwcG9ydCkuXG5jb25zdCBTVEFOREFSRF9USU1FU1RBTVBfUEFUVEVSTiA9ICd5eXl5LW1tLWRkIEhIOk1NOnNzLlNTUydcblxuY29uc3QgU1lTX1BSRUZJWF9SRUdFWCA9IC9ec3lzOi9pXG5jb25zdCBVVENfUFJFRklYX1JFR0VYID0gL151dGM6L2lcblxuLyoqXG4gKiBTcGxpdHMgYSBgdGltZXN0YW1wLnRyYW5zbGF0ZVRpbWVgIHZhbHVlIGludG8gdGhlIGxpdGVyYWwgcGF0dGVybiB0b1xuICogZXhwYW5kIGFuZCB3aGV0aGVyIGl0IHNob3VsZCBiZSByZWFkIHdpdGggVVRDIGdldHRlcnMuIE1pcnJvcnNcbiAqIHBpbm8tcHJldHR5J3MgYFNZUzpgL2BVVEM6YCBwcmVmaXhlcyAoY2FzZS1pbnNlbnNpdGl2ZSk7IGEgYmFyZSBwYXR0ZXJuXG4gKiBrZWVwcyB0aGlzIGZvcm1hdHRlcidzIGhpc3RvcmljYWwgbG9jYWwtdGltZSBiZWhhdmlvdXIuXG4gKi9cbmNvbnN0IHJlc29sdmVUaW1lc3RhbXBQYXR0ZXJuID0gKFxuICBwYXR0ZXJuOiBzdHJpbmdcbik6IHsgcGF0dGVybjogc3RyaW5nOyB1dGM6IGJvb2xlYW4gfSA9PiB7XG4gIGxldCByZXN0ID0gcGF0dGVyblxuICBsZXQgdXRjID0gZmFsc2VcblxuICBpZiAoU1lTX1BSRUZJWF9SRUdFWC50ZXN0KHJlc3QpKSB7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoJ3N5czonLmxlbmd0aClcbiAgfSBlbHNlIGlmIChVVENfUFJFRklYX1JFR0VYLnRlc3QocmVzdCkpIHtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgndXRjOicubGVuZ3RoKVxuICAgIHV0YyA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkID0gcmVzdCA9PT0gJ3N0YW5kYXJkJyA/IFNUQU5EQVJEX1RJTUVTVEFNUF9QQVRURVJOIDogcmVzdFxuICByZXR1cm4geyBwYXR0ZXJuOiByZXNvbHZlZCwgdXRjIH1cbn1cblxuY29uc3QgZm9ybWF0VGltZXN0YW1wID0gKGRhdGU6IERhdGUsIHBhdHRlcm4/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBjb25zdCB7IHBhdHRlcm46IHJlc29sdmVkLCB1dGMgfSA9IHJlc29sdmVUaW1lc3RhbXBQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyh1dGMgPyBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgOiBkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMigodXRjID8gZGF0ZS5nZXRVVENNb250aCgpIDogZGF0ZS5nZXRNb250aCgpKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMih1dGMgPyBkYXRlLmdldFVUQ0RhdGUoKSA6IGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIodXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIodXRjID8gZGF0ZS5nZXRVVENNaW51dGVzKCkgOiBkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKHV0YyA/IGRhdGUuZ2V0VVRDU2Vjb25kcygpIDogZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IHBhZDModXRjID8gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSA6IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHJlc29sdmVkXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbi8qKiBSZXNvbHZlcyBjbGllbnQgSVAgZnJvbSB4LWZvcndhcmRlZC1mb3IgKGZpcnN0IElQKSBvciB4LXJlYWwtaXAuIEVtcHR5IHdoZW4gbmVpdGhlciBoZWFkZXIgaXMgc2V0IChlLmcuIGxvY2FsaG9zdCkuICovXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0SW5mbyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGZvcndhcmRlZFxuICAgID8gKGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJycpXG4gICAgOiAocmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJycpXG4gIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoY2FuZGlkYXRlLCA2NClcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAobXMgPj0gMTAwMCkge1xuICAgIGNvbnN0IHNlYyA9IG1zIC8gMTAwMFxuICAgIGlmIChzZWMgPj0gMTApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNlYyl9c2BcbiAgICB9XG4gICAgY29uc3Qgb25lRGVjaW1hbCA9IHNlYy50b0ZpeGVkKDEpXG4gICAgcmV0dXJuIG9uZURlY2ltYWwuZW5kc1dpdGgoJy4wJykgPyBgJHtNYXRoLnJvdW5kKHNlYyl9c2AgOiBgJHtvbmVEZWNpbWFsfXNgXG4gIH1cbiAgaWYgKG1zID4gMCAmJiBtcyA8IDEpIHtcbiAgICByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX1tc2BcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgXG59XG5cbmNvbnN0IGdldFNsb3dUaHJlc2hvbGRzID0gKFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHNsb3c6IG51bWJlcjsgdmVyeVNsb3c6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgcmV0dXJuIHtcbiAgICBzbG93OiBjb25maWc/LnNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9TTE9XX01TLFxuICAgIHZlcnlTbG93OiBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkID8/IERFRkFVTFRfVkVSWV9TTE9XX01TXG4gIH1cbn1cblxuY29uc3QgY29sb3JEdXJhdGlvblRleHQgPSAoXG4gIG1zOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgc2xvdzogbnVtYmVyLFxuICB2ZXJ5U2xvdzogbnVtYmVyXG4pOiB7IHRleHQ6IHN0cmluZzsgaXNWZXJ5U2xvdzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcmF3ID0gZm9ybWF0RHVyYXRpb24obXMpXG4gIGNvbnN0IGlzVmVyeVNsb3cgPSBtcyA+PSB2ZXJ5U2xvd1xuXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogcmF3IH1cbiAgfVxuXG4gIGxldCBjb2xvcmVkID0gcmF3XG4gIGlmIChtcyA8IHNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsuZ3JlZW4ocmF3KVxuICB9IGVsc2UgaWYgKG1zIDwgdmVyeVNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsueWVsbG93KHJhdylcbiAgfSBlbHNlIHtcbiAgICBjb2xvcmVkID0gY2hhbGsucmVkLmJvbGQocmF3KVxuICB9XG5cbiAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogY29sb3JlZCB9XG59XG5cbmNvbnN0IGdldFNwZWVkVG9rZW4gPSAoaXNWZXJ5U2xvdzogYm9vbGVhbiwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFpc1ZlcnlTbG93KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYmFkZ2UgPSAn4pqhIHNsb3cnXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAgJHtiYWRnZX1gXG4gIH1cbiAgcmV0dXJuIGAgJHtjaGFsay55ZWxsb3coYmFkZ2UpfWBcbn1cblxuLyoqIExvZ2l4bHlzaWEgYnJhbmQ6IGZveCBlbW9qaSB3aXRoIGxldmVsLWNvbG9yZWQgYmFja2dyb3VuZCB3aGVuIGNvbG9ycyBhcmUgZW5hYmxlZC4gKi9cbmNvbnN0IGdldExldmVsSWNvbiA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuICfwn6aKJ1xuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKCcg8J+miiAnKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBsZXZlbFxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbWV0aG9kXG4gIH1cblxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3cuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xuICAgIHJldHVybiBjaGFsay5yZWQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcbiAgICByZXR1cm4gY2hhbGsubWFnZW50YS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZS5ib2xkKHVwcGVyKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkU3RhdHVzID0gKHN0YXR1czogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIucGFyc2VJbnQoc3RhdHVzLCAxMClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpZiAobnVtZXJpYyA+PSA1MDApIHtcbiAgICByZXR1cm4gY2hhbGsucmVkKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMjAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cylcbiAgfVxuICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpXG59XG5cbmNvbnN0IGdldENvbG9yZWRUaW1lc3RhbXAgPSAodGltZXN0YW1wOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcFxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmdyYXkodGltZXN0YW1wKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkUGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gcGF0aG5hbWVcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZUJyaWdodChwYXRobmFtZSlcbn1cblxuY29uc3QgZ2V0U3RhdHVzVGV4dCA9IChzdGF0dXNDb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ZXh0ID0gU1RBVFVTX0NPREVTW3N0YXR1c0NvZGVdXG4gIHJldHVybiB0ZXh0ID8/ICcnXG59XG5cbmNvbnN0IGdldFNlcnZpY2VUb2tlbiA9IChvcHRpb25zOiBPcHRpb25zLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuYW1lID0gb3B0aW9ucy5jb25maWc/LnNlcnZpY2U/LnRyaW0oKVxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBicmFja2V0ZWQgPSBgWyR7bmFtZX1dYFxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgJHticmFja2V0ZWR9IGBcbiAgfVxuICByZXR1cm4gYCR7Y2hhbGsuZGltKGJyYWNrZXRlZCl9IGBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRDb250ZXh0IHtcbiAgZm9ybWF0OiBzdHJpbmdcbiAgc2VydmljZVRva2VuOiBzdHJpbmdcbiAgc2xvd1RocmVzaG9sZDogbnVtYmVyXG4gIC8qKiBGb3JtYXQgdG9rZW5zIGFjdHVhbGx5IHByZXNlbnQgaW4gYGZvcm1hdGAgKHNlZSB7QGxpbmsgTE9HX0ZPUk1BVF9SRUdFWH0pLiAqL1xuICB0b2tlbnM6IFNldDxzdHJpbmc+XG4gIHVzZUNvbG9yczogYm9vbGVhblxuICB2ZXJ5U2xvd1RocmVzaG9sZDogbnVtYmVyXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgY29sb3JzL2Zvcm1hdC90aHJlc2hvbGRzL3NlcnZpY2Ugb25jZSBwZXIgbG9nZ2VyIGluc3RhbmNlIGluc3RlYWQgb2YgcGVyIGxvZyBsaW5lLlxuICogU2FmZSB0byBob2lzdDogVFRZLW5lc3MgYW5kIGNvbmZpZyBkb24ndCBjaGFuZ2UgYWNyb3NzIGEgcHJvY2VzcydzIGxpZmV0aW1lLCBzbyBmcmVlemluZyB0aGVcbiAqIGNvbG9ycyBkZWNpc2lvbiBhdCBjb25zdHJ1Y3Rpb24gdGltZSBtYXRjaGVzIHJlYWwgcHJvY2VzcyBsaWZlY3ljbGVzLlxuICpcbiAqIE5PVEU6IGFkZGluZyBhIG5ldyBmb3JtYXQgdG9rZW4gcmVxdWlyZXMgYWRkaW5nIGl0IGJvdGggdG8ge0BsaW5rIExPR19GT1JNQVRfUkVHRVh9IGFuZCB0byB0aGVcbiAqIHRva2VuLWdhdGluZyBjaGVja3MgaW4ge0BsaW5rIGZvcm1hdExvZ091dHB1dH0gYmVsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtYXRDb250ZXh0ID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBGb3JtYXRDb250ZXh0ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuICBjb25zdCB0b2tlbnMgPSBuZXcgU2V0KGZvcm1hdC5tYXRjaChMT0dfRk9STUFUX1JFR0VYKSA/PyBbXSlcbiAgY29uc3QgeyBzbG93OiBzbG93VGhyZXNob2xkLCB2ZXJ5U2xvdzogdmVyeVNsb3dUaHJlc2hvbGQgfSA9XG4gICAgZ2V0U2xvd1RocmVzaG9sZHMob3B0aW9ucylcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICByZXR1cm4ge1xuICAgIGZvcm1hdCxcbiAgICBzZXJ2aWNlVG9rZW4sXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB0b2tlbnMsXG4gICAgdXNlQ29sb3JzLFxuICAgIHZlcnlTbG93VGhyZXNob2xkXG4gIH1cbn1cblxuY29uc3Qgc3RyaW5naWZ5VHJlZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJ1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KHZhbHVlKVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUubWVzc2FnZSlcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gc2FuaXRpemVMb2dUZXh0KFN0cmluZyh2YWx1ZSkpXG4gIH1cbn1cblxuLyoqIE5lc3RlZCBvYmplY3RzIHRvIGV4cGFuZCBpbiB0aGUgY29udGV4dCB0cmVlIChleGNsdWRlcyBBcnJheXMsIEVycm9yLCBEYXRlKS4gKi9cbmNvbnN0IGlzRXhwYW5kYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHZhbHVlICE9PSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG5cbmNvbnN0IGNvbGxlY3RDb250ZXh0RW50cmllcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlcHRoUmVtYWluaW5nOiBudW1iZXJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IG91dDogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrfWAgOiBrXG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmNvbnN0IGNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzID0gKGVycm9yOiB1bmtub3duKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihlcnJvcilcbiAgaWYgKG1zZykge1xuICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgc2FuaXRpemVMb2dUZXh0KG1zZyldKVxuICB9XG4gIGlmIChpc1N0cnVjdHVyZWRFcnJvcihlcnJvcikpIHtcbiAgICBpZiAoZXJyb3IuY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5jb2RlJywgU3RyaW5nKGVycm9yLmNvZGUpXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLndoeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci53aHknLCBTdHJpbmcoZXJyb3Iud2h5KV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5maXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuZml4JywgU3RyaW5nKGVycm9yLmZpeCldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5saW5rJywgU3RyaW5nKGVycm9yLmxpbmspXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmludGVybmFsJywgc3RyaW5naWZ5VHJlZVZhbHVlKGVycm9yLmludGVybmFsKV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIHVzZUNvbG9yczogYm9vbGVhbiA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAob3B0aW9ucy5jb25maWc/LnNob3dDb250ZXh0VHJlZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG5cbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cblxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKFxuICAgIGN0eCAmJlxuICAgIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoY3R4KSAmJlxuICAgIE9iamVjdC5rZXlzKGN0eCBhcyBvYmplY3QpLmxlbmd0aCA+IDAgJiZcbiAgICBkZXB0aCA+PSAxXG4gICkge1xuICAgIGVudHJpZXMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyhjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICcnLCBkZXB0aClcbiAgICApXG4gIH1cblxuICAvLyBXQVJOSU5HIGFzIHdlbGwgYXMgRVJST1I6IGEgNHh4IGlzIGxvZ2dlZCBhdCBXQVJOSU5HLCBhbmQgaXRzXG4gIC8vIGB3aHlgL2BmaXhgL2BsaW5rYCBhcmUgZXhhY3RseSBhcyB3b3J0aCBzaG93aW5nIGFzIGEgNXh4J3MuXG4gIGlmICgobGV2ZWwgPT09ICdFUlJPUicgfHwgbGV2ZWwgPT09ICdXQVJOSU5HJykgJiYgZGF0YS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW50cmllcy5wdXNoKC4uLmNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzKGRhdGEuZXJyb3IpKVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG4vKiogUmF3IGR1cmF0aW9uL1VSTCBwYXJ0cyBjb21wdXRlZCBvbmNlIHBlciBsb2cgZW1pc3Npb24gYnkgdGhlIGNhbGxlciAoc2VlIGBsb2dnZXIvaW5kZXgudHNgKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlY29tcHV0ZWRMb2dQYXJ0cyB7XG4gIGR1cmF0aW9uTXM6IG51bWJlclxuICBwYXRobmFtZTogc3RyaW5nXG4gIHNlYXJjaDogc3RyaW5nXG59XG5cbi8qKiBge25vd31gL2B7ZXBvY2h9YCBzaGFyZSBhIHNpbmdsZSBgRGF0ZWAgc2FtcGxlOyBlYWNoIGlzIG9ubHkgZm9ybWF0dGVkIHdoZW4gcmVxdWVzdGVkLiAqL1xuY29uc3QgZ2V0VGltZXN0YW1wVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICB0cmFuc2xhdGVUaW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogeyB0aW1lc3RhbXA6IHN0cmluZzsgZXBvY2g6IHN0cmluZyB9ID0+IHtcbiAgaWYgKCEodG9rZW5zLmhhcygne25vd30nKSB8fCB0b2tlbnMuaGFzKCd7ZXBvY2h9JykpKSB7XG4gICAgcmV0dXJuIHsgZXBvY2g6ICcnLCB0aW1lc3RhbXA6ICcnIH1cbiAgfVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gdG9rZW5zLmhhcygne2Vwb2NofScpID8gU3RyaW5nKG5vdy5nZXRUaW1lKCkpIDogJydcbiAgaWYgKCF0b2tlbnMuaGFzKCd7bm93fScpKSB7XG4gICAgcmV0dXJuIHsgZXBvY2gsIHRpbWVzdGFtcDogJycgfVxuICB9XG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIHRyYW5zbGF0ZVRpbWUpXG4gIHJldHVybiB7IGVwb2NoLCB0aW1lc3RhbXA6IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpIH1cbn1cblxuY29uc3QgZ2V0TWVzc2FnZVRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF0b2tlbnMuaGFzKCd7bWVzc2FnZX0nKSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IHNhbml0aXplTG9nVGV4dChkYXRhLm1lc3NhZ2UpIDogJydcbn1cblxuLyoqIGB7cGF0aG5hbWV9YC9ge3BhdGh9YC9ge3F1ZXJ5fWAgc2hhcmUgYSBzaW5nbGUgVVJMIHBhcnNlIChvciB0aGUgcHJlY29tcHV0ZWQgb25lKS4gKi9cbmNvbnN0IGdldFBhdGhuYW1lVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgY29uZmlnOiBPcHRpb25zWydjb25maWcnXSxcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBwcmVjb21wdXRlZD86IFByZWNvbXB1dGVkTG9nUGFydHNcbik6IHsgY29sb3JlZFBhdGhuYW1lOiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IG5lZWRzUGF0aG5hbWUgPSB0b2tlbnMuaGFzKCd7cGF0aG5hbWV9JykgfHwgdG9rZW5zLmhhcygne3BhdGh9JylcbiAgY29uc3QgbmVlZHNRdWVyeSA9IHRva2Vucy5oYXMoJ3txdWVyeX0nKVxuICBpZiAoIShuZWVkc1BhdGhuYW1lIHx8IG5lZWRzUXVlcnkpKSB7XG4gICAgcmV0dXJuIHsgY29sb3JlZFBhdGhuYW1lOiAnJywgcXVlcnk6ICcnIH1cbiAgfVxuXG4gIGxldCByYXdQYXRobmFtZTogc3RyaW5nXG4gIGxldCBzZWFyY2g6IHN0cmluZ1xuICBpZiAocHJlY29tcHV0ZWQpIHtcbiAgICA7KHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IHByZWNvbXB1dGVkKVxuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICA7KHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmF3UGF0aG5hbWUgPSBzYW5pdGl6ZUxvZ1RleHQocmVxdWVzdC51cmwgfHwgJy8nLCAxMDI0KVxuICAgICAgc2VhcmNoID0gJydcbiAgICB9XG4gIH1cblxuICBjb25zdCBxdWVyeSA9IG5lZWRzUXVlcnkgPyBzZWFyY2ggOiAnJ1xuICBpZiAoIW5lZWRzUGF0aG5hbWUpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6ICcnLCBxdWVyeSB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3NlYXJjaH1gXG4gICAgOiByYXdQYXRobmFtZVxuICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKSwgcXVlcnkgfVxufVxuXG4vKiogYHtzdGF0dXN9YC9ge3N0YXR1c1RleHR9YCBzaGFyZSBhIHNpbmdsZSBzdGF0dXMtY29kZSByZXNvbHV0aW9uLiAqL1xuY29uc3QgZ2V0U3RhdHVzVG9rZW5zID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiB7IGNvbG9yZWRTdGF0dXM6IHN0cmluZzsgc3RhdHVzVGV4dDogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBuZWVkc1N0YXR1cyA9IHRva2Vucy5oYXMoJ3tzdGF0dXN9JylcbiAgY29uc3QgbmVlZHNTdGF0dXNUZXh0ID0gdG9rZW5zLmhhcygne3N0YXR1c1RleHR9JylcbiAgaWYgKCEobmVlZHNTdGF0dXMgfHwgbmVlZHNTdGF0dXNUZXh0KSkge1xuICAgIHJldHVybiB7IGNvbG9yZWRTdGF0dXM6ICcnLCBzdGF0dXNUZXh0OiAnJyB9XG4gIH1cbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICByZXR1cm4ge1xuICAgIGNvbG9yZWRTdGF0dXM6IG5lZWRzU3RhdHVzXG4gICAgICA/IGdldENvbG9yZWRTdGF0dXMoU3RyaW5nKHN0YXR1c0NvZGUpLCB1c2VDb2xvcnMpXG4gICAgICA6ICcnLFxuICAgIHN0YXR1c1RleHQ6IG5lZWRzU3RhdHVzVGV4dCA/IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSkgOiAnJ1xuICB9XG59XG5cbmNvbnN0IGdldElwVG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBzdHJpbmcgPT4gKGNvbmZpZz8uaXAgPT09IHRydWUgJiYgdG9rZW5zLmhhcygne2lwfScpID8gZ2V0SXAocmVxdWVzdCkgOiAnJylcblxuY29uc3QgaGFzTm9uRW1wdHlDb250ZXh0ID0gKFxuICBjb250ZXh0OiB1bmtub3duXG4pOiBjb250ZXh0IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIGNvbnRleHQgIT09IG51bGwgJiZcbiAgY29udGV4dCAhPT0gdW5kZWZpbmVkICYmXG4gIHR5cGVvZiBjb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheShjb250ZXh0KSAmJlxuICBPYmplY3Qua2V5cyhjb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuXG5jb25zdCBnZXRDb250ZXh0VG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRva2Vucy5oYXMoJ3tjb250ZXh0fScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3Qgc2hvd1RyZWUgPSBjb25maWc/LnNob3dDb250ZXh0VHJlZSAhPT0gZmFsc2VcbiAgaWYgKHNob3dUcmVlICYmIGhhc05vbkVtcHR5Q29udGV4dChkYXRhLmNvbnRleHQpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxufVxuXG4vKiogYHtkdXJhdGlvbn1gL2B7c3BlZWR9YCBzaGFyZSBhIHNpbmdsZSBkdXJhdGlvbiBzYW1wbGUgYW5kIHNsb3ctdGhyZXNob2xkIGNoZWNrLiAqL1xuY29uc3QgZ2V0RHVyYXRpb25Ub2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgc2xvd1RocmVzaG9sZDogbnVtYmVyLFxuICB2ZXJ5U2xvd1RocmVzaG9sZDogbnVtYmVyLFxuICBwcmVjb21wdXRlZD86IFByZWNvbXB1dGVkTG9nUGFydHNcbik6IHsgY29sb3JlZER1cmF0aW9uOiBzdHJpbmc7IHNwZWVkVG9rZW46IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgbmVlZHNEdXJhdGlvbiA9IHRva2Vucy5oYXMoJ3tkdXJhdGlvbn0nKVxuICBjb25zdCBuZWVkc1NwZWVkID0gdG9rZW5zLmhhcygne3NwZWVkfScpXG4gIGlmICghKG5lZWRzRHVyYXRpb24gfHwgbmVlZHNTcGVlZCkpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkRHVyYXRpb246ICcnLCBzcGVlZFRva2VuOiAnJyB9XG4gIH1cbiAgY29uc3QgZHVyYXRpb25NcyA9IHByZWNvbXB1dGVkPy5kdXJhdGlvbk1zID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuICBjb25zdCB7IHRleHQsIGlzVmVyeVNsb3cgfSA9IGNvbG9yRHVyYXRpb25UZXh0KFxuICAgIGR1cmF0aW9uTXMsXG4gICAgdXNlQ29sb3JzLFxuICAgIHNsb3dUaHJlc2hvbGQsXG4gICAgdmVyeVNsb3dUaHJlc2hvbGRcbiAgKVxuICByZXR1cm4ge1xuICAgIGNvbG9yZWREdXJhdGlvbjogbmVlZHNEdXJhdGlvbiA/IHRleHQgOiAnJyxcbiAgICBzcGVlZFRva2VuOiBuZWVkc1NwZWVkID8gZ2V0U3BlZWRUb2tlbihpc1ZlcnlTbG93LCB1c2VDb2xvcnMpIDogJydcbiAgfVxufVxuXG5jb25zdCBnZXRSZXF1ZXN0SWRUb2tlbiA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHN0cmluZyA9PiB7XG4gIGlmICghdG9rZW5zLmhhcygne3JlcXVlc3RJZH0nKSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGN0eCA9IGRhdGEuY29udGV4dFxuICBpZiAodHlwZW9mIGN0eCAhPT0gJ29iamVjdCcgfHwgY3R4ID09PSBudWxsIHx8ICEoJ3JlcXVlc3RJZCcgaW4gY3R4KSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoXG4gICAgU3RyaW5nKChjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJlcXVlc3RJZCksXG4gICAgMTI4XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvZ091dHB1dCA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9ucyxcbiAgZm9ybWF0Q29udGV4dCxcbiAgcHJlY29tcHV0ZWRcbn06IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xuICAvKiogSG9pc3RlZCBwZXItbG9nZ2VyIGNvbnN0YW50czsgY29tcHV0ZWQgb24gdGhlIGZseSB3aGVuIGEgZGlyZWN0IGNhbGxlciBvbWl0cyBpdC4gKi9cbiAgZm9ybWF0Q29udGV4dD86IEZvcm1hdENvbnRleHRcbiAgLyoqIER1cmF0aW9uL1VSTCBwYXJ0cyBhbHJlYWR5IGNvbXB1dGVkIGJ5IHRoZSBjYWxsZXI7IHBhcnNlZCBvbiB0aGUgZmx5IHdoZW4gb21pdHRlZC4gKi9cbiAgcHJlY29tcHV0ZWQ/OiBQcmVjb21wdXRlZExvZ1BhcnRzXG59KTogRm9ybWF0dGVkTG9nT3V0cHV0ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3Qge1xuICAgIGZvcm1hdCxcbiAgICBzZXJ2aWNlVG9rZW4sXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB0b2tlbnMsXG4gICAgdXNlQ29sb3JzLFxuICAgIHZlcnlTbG93VGhyZXNob2xkXG4gIH0gPSBmb3JtYXRDb250ZXh0ID8/IGNyZWF0ZUZvcm1hdENvbnRleHQob3B0aW9ucylcblxuICBjb25zdCB7IHRpbWVzdGFtcCwgZXBvY2ggfSA9IGdldFRpbWVzdGFtcFRva2VucyhcbiAgICB0b2tlbnMsXG4gICAgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgdXNlQ29sb3JzXG4gIClcbiAgY29uc3QgbWVzc2FnZSA9IGdldE1lc3NhZ2VUb2tlbih0b2tlbnMsIGRhdGEpXG4gIGNvbnN0IHsgY29sb3JlZFBhdGhuYW1lLCBxdWVyeSB9ID0gZ2V0UGF0aG5hbWVUb2tlbnMoXG4gICAgdG9rZW5zLFxuICAgIHJlcXVlc3QsXG4gICAgY29uZmlnLFxuICAgIHVzZUNvbG9ycyxcbiAgICBwcmVjb21wdXRlZFxuICApXG4gIGNvbnN0IHsgY29sb3JlZFN0YXR1cywgc3RhdHVzVGV4dCB9ID0gZ2V0U3RhdHVzVG9rZW5zKHRva2VucywgZGF0YSwgdXNlQ29sb3JzKVxuICBjb25zdCBpcCA9IGdldElwVG9rZW4odG9rZW5zLCByZXF1ZXN0LCBjb25maWcpXG4gIGNvbnN0IGN0eFN0cmluZyA9IGdldENvbnRleHRUb2tlbih0b2tlbnMsIGRhdGEsIGNvbmZpZylcbiAgY29uc3QgY29sb3JlZExldmVsID0gdG9rZW5zLmhhcygne2xldmVsfScpXG4gICAgPyBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgICA6ICcnXG4gIGNvbnN0IGNvbG9yZWRNZXRob2QgPSB0b2tlbnMuaGFzKCd7bWV0aG9kfScpXG4gICAgPyBnZXRDb2xvcmVkTWV0aG9kKFxuICAgICAgICByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLnBhZEVuZChNRVRIT0RfUEFEKSxcbiAgICAgICAgdXNlQ29sb3JzXG4gICAgICApXG4gICAgOiAnJ1xuICBjb25zdCB7IGNvbG9yZWREdXJhdGlvbiwgc3BlZWRUb2tlbiB9ID0gZ2V0RHVyYXRpb25Ub2tlbnMoXG4gICAgdG9rZW5zLFxuICAgIHN0b3JlLFxuICAgIHVzZUNvbG9ycyxcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHZlcnlTbG93VGhyZXNob2xkLFxuICAgIHByZWNvbXB1dGVkXG4gIClcbiAgY29uc3QgaWNvbiA9IHRva2Vucy5oYXMoJ3tpY29ufScpID8gZ2V0TGV2ZWxJY29uKGxldmVsLCB1c2VDb2xvcnMpIDogJydcbiAgY29uc3QgcmVxdWVzdElkID0gZ2V0UmVxdWVzdElkVG9rZW4odG9rZW5zLCBkYXRhKVxuXG4gIGNvbnN0IHRva2VuTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICd7Y29udGV4dH0nOiBjdHhTdHJpbmcsXG4gICAgJ3tkdXJhdGlvbn0nOiBjb2xvcmVkRHVyYXRpb24sXG4gICAgJ3tlcG9jaH0nOiBlcG9jaCxcbiAgICAne2ljb259JzogaWNvbixcbiAgICAne2lwfSc6IGlwLFxuICAgICd7bGV2ZWx9JzogY29sb3JlZExldmVsLFxuICAgICd7bWVzc2FnZX0nOiBtZXNzYWdlLFxuICAgICd7bWV0aG9kfSc6IGNvbG9yZWRNZXRob2QsXG4gICAgJ3tub3d9JzogdGltZXN0YW1wLFxuICAgICd7cGF0aH0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3twYXRobmFtZX0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3txdWVyeX0nOiBxdWVyeSxcbiAgICAne3JlcXVlc3RJZH0nOiByZXF1ZXN0SWQsXG4gICAgJ3tzZXJ2aWNlfSc6IHNlcnZpY2VUb2tlbixcbiAgICAne3NwZWVkfSc6IHNwZWVkVG9rZW4sXG4gICAgJ3tzdGF0dXN9JzogY29sb3JlZFN0YXR1cyxcbiAgICAne3N0YXR1c1RleHR9Jzogc3RhdHVzVGV4dFxuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICByZXR1cm4geyBjb250ZXh0TGluZXMsIG1haW4gfVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yLm1lc3NhZ2VcbiAgfVxuICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZSBhcyBzdHJpbmdcbiAgfVxuICByZXR1cm4gU3RyaW5nKGVycm9yKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cnVjdHVyZWRFcnJvciB7XG4gIGNvZGU/OiBzdHJpbmdcbiAgZml4Pzogc3RyaW5nXG4gIGludGVybmFsPzogdW5rbm93blxuICBsaW5rPzogc3RyaW5nXG4gIHdoeT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgaXNTdHJ1Y3R1cmVkRXJyb3IgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBTdHJ1Y3R1cmVkRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICgnd2h5JyBpbiB2YWx1ZSB8fFxuICAgICdmaXgnIGluIHZhbHVlIHx8XG4gICAgJ2xpbmsnIGluIHZhbHVlIHx8XG4gICAgJ2NvZGUnIGluIHZhbHVlIHx8XG4gICAgJ2ludGVybmFsJyBpbiB2YWx1ZSlcblxuZXhwb3J0IGludGVyZmFjZSBOb3JtYWxpemVkTG9nZ2VkRXJyb3Ige1xuICAvKiogU2FmZSBzdHJ1Y3R1cmVkIHJlcHJlc2VudGF0aW9uIGZvciBkYXRhL3RyYW5zcG9ydCBtZXRhLiAqL1xuICBlcnJvcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgLyoqIFNhZmUgb25lLWxpbmUgbWVzc2FnZSBmb3IgdGhlIGxvZyBsaW5lLiAqL1xuICBtZXNzYWdlOiBzdHJpbmdcbn1cblxuY29uc3QgaXNWYWxpZGF0aW9uRXJyb3JMaWtlID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgRXJyb3IgJiB7IGFsbD86IHVua25vd25bXTsgc3RhdHVzPzogbnVtYmVyOyB0eXBlPzogc3RyaW5nIH0gPT5cbiAgdmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAvLyBgY29kZWAgaXMgRWx5c2lhJ3MgbWluaWZpY2F0aW9uLXNhZmUgZGlzY3JpbWluYW50IOKAlCBgLm5hbWVgIGFuZFxuICAvLyBgLmNvbnN0cnVjdG9yLm5hbWVgIGJvdGggZGVncmFkZSB0byBhIG1hbmdsZWQgc3RyaW5nIHVuZGVyIGJ1bmRsZXJcbiAgLy8gbWluaWZpY2F0aW9uIChlLmcuIGBidW4gYnVpbGQgLS1taW5pZnlgLCBlc2J1aWxkKSwgc28gYGNvZGVgIG11c3QgYmVcbiAgLy8gY2hlY2tlZCB0b28gb3IgdmFsaWRhdGlvbiBib2RpZXMgc2lsZW50bHkgcmUtbGVhayBpbiB0aGF0IGJ1aWxkIG1vZGUuXG4gICgodmFsdWUgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlID09PSAnVkFMSURBVElPTicgfHxcbiAgICB2YWx1ZS5uYW1lID09PSAnVmFsaWRhdGlvbkVycm9yJyB8fFxuICAgIHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lID09PSAnVmFsaWRhdGlvbkVycm9yJylcblxuY29uc3QgU1RSVUNUVVJFRF9FUlJPUl9LRVlTID0gW1xuICAnY29kZScsXG4gICdmaXgnLFxuICAnaW50ZXJuYWwnLFxuICAnbGluaycsXG4gICdtZXNzYWdlJyxcbiAgJ25hbWUnLFxuICAnc3RhdHVzJyxcbiAgJ3doeSdcbl0gYXMgY29uc3RcblxuY29uc3QgY29weVN0cnVjdHVyZWRFcnJvckZpZWxkcyA9IChcbiAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBzYWZlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIFNUUlVDVFVSRURfRVJST1JfS0VZUykge1xuICAgIGlmIChyZWNvcmRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzYWZlW2tleV0gPSByZWNvcmRba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2FmZVxufVxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplTG9nZ2VkRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBsb2dFcnJvclBheWxvYWQ6IGJvb2xlYW5cbik6IE5vcm1hbGl6ZWRMb2dnZWRFcnJvciA9PiB7XG4gIGlmIChpc1ZhbGlkYXRpb25FcnJvckxpa2UoZXJyb3IpICYmICFsb2dFcnJvclBheWxvYWQpIHtcbiAgICBjb25zdCBmYWlsdXJlcyA9IEFycmF5LmlzQXJyYXkoZXJyb3IuYWxsKSA/IGVycm9yLmFsbCA6IFtdXG4gICAgY29uc3QgcGF0aHMgPSBmYWlsdXJlc1xuICAgICAgLm1hcChmYWlsdXJlID0+XG4gICAgICAgIHR5cGVvZiBmYWlsdXJlID09PSAnb2JqZWN0JyAmJiBmYWlsdXJlICE9PSBudWxsICYmICdwYXRoJyBpbiBmYWlsdXJlXG4gICAgICAgICAgPyBTdHJpbmcoKGZhaWx1cmUgYXMgeyBwYXRoOiB1bmtub3duIH0pLnBhdGgpXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgIGNvbnN0IHNjb3BlID0gdHlwZW9mIGVycm9yLnR5cGUgPT09ICdzdHJpbmcnID8gZXJyb3IudHlwZSA6ICdyZXF1ZXN0J1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgcGF0aHMubGVuZ3RoID4gMFxuICAgICAgICA/IGBWYWxpZGF0aW9uIGZhaWxlZCAoJHtzY29wZX0pOiAke3BhdGhzLmpvaW4oJywgJyl9YFxuICAgICAgICA6IGBWYWxpZGF0aW9uIGZhaWxlZCAoJHtzY29wZX0pYFxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogeyBmYWlsZWRQYXRoczogcGF0aHMsIG5hbWU6ICdWYWxpZGF0aW9uRXJyb3InLCB0eXBlOiBzY29wZSB9LFxuICAgICAgbWVzc2FnZVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgY29uc3Qgc2FmZSA9IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMoXG4gICAgICBlcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKVxuICAgIHNhZmUubWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgICAvLyBOYXRpdmUgc3ViY2xhc3NlcyAoZS5nLiBgY2xhc3MgSHR0cEVycm9yIGV4dGVuZHMgRXJyb3JgKSBkb24ndCBzZXRcbiAgICAvLyBgLm5hbWVgIHVubGVzcyB0aGUgYXV0aG9yIG92ZXJyaWRlcyBpdCwgc28gaXQgcmVhZHMgYmFjayBhcyB0aGVcbiAgICAvLyBnZW5lcmljIFwiRXJyb3JcIi4gUHJlZmVyIHRoZSBjb25zdHJ1Y3RvciBuYW1lIGluIHRoYXQgY2FzZS5cbiAgICBzYWZlLm5hbWUgPVxuICAgICAgZXJyb3IubmFtZSA9PT0gJ0Vycm9yJ1xuICAgICAgICA/IChlcnJvci5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBlcnJvci5uYW1lKVxuICAgICAgICA6IGVycm9yLm5hbWVcbiAgICByZXR1cm4geyBlcnJvcjogc2FmZSwgbWVzc2FnZTogcGFyc2VFcnJvcihlcnJvcikgfVxuICB9XG5cbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogY29weVN0cnVjdHVyZWRFcnJvckZpZWxkcyhlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gICAgICBtZXNzYWdlOiBwYXJzZUVycm9yKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9yOiB7IHZhbHVlOiBTdHJpbmcoZXJyb3IpIH0sIG1lc3NhZ2U6IHBhcnNlRXJyb3IoZXJyb3IpIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbGFwc2VkTXMgfSBmcm9tICcuLi91dGlscy9kdXJhdGlvbidcbmltcG9ydCB7IGNyZWF0ZUVycm9yUmVwb3J0ZXIgfSBmcm9tICcuLi91dGlscy9yZXBvcnQnXG5cbmNvbnN0IHJlcG9ydFRyYW5zcG9ydEVycm9yID0gY3JlYXRlRXJyb3JSZXBvcnRlcihcbiAgJ3RyYW5zcG9ydCcsXG4gICd0cmFuc3BvcnQgZmFpbGVkJ1xuKVxuXG5jb25zdCBNQVhfVFJBQ0tFRF9QRU5ESU5HID0gMTAyNFxuY29uc3QgcGVuZGluZ1RyYW5zcG9ydFdvcmsgPSBuZXcgU2V0PFByb21pc2U8dW5rbm93bj4+KClcblxuLyoqXG4gKiBSZW1lbWJlcnMgaW4tZmxpZ2h0IGBsb2coKWAgcHJvbWlzZXMgc28gc2h1dGRvd24gY2FuIHdhaXQgZm9yIHRoZW0uIFRoZSBzZXRcbiAqIGlzIGJvdW5kZWQ6IHVuZGVyIHN1c3RhaW5lZCBsb2FkIHRoZSBvbGRlc3QgZW50cnkgaXMgZHJvcHBlZCByYXRoZXIgdGhhblxuICogbGV0dGluZyBhIHNsb3cgdHJhbnNwb3J0IGdyb3cgaXQgd2l0aG91dCBsaW1pdC5cbiAqL1xuY29uc3QgdHJhY2sgPSAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IHZvaWQgPT4ge1xuICBpZiAocGVuZGluZ1RyYW5zcG9ydFdvcmsuc2l6ZSA+PSBNQVhfVFJBQ0tFRF9QRU5ESU5HKSB7XG4gICAgY29uc3Qgb2xkZXN0ID0gcGVuZGluZ1RyYW5zcG9ydFdvcmsudmFsdWVzKCkubmV4dCgpLnZhbHVlXG4gICAgaWYgKG9sZGVzdCkge1xuICAgICAgcGVuZGluZ1RyYW5zcG9ydFdvcmsuZGVsZXRlKG9sZGVzdClcbiAgICB9XG4gIH1cbiAgcGVuZGluZ1RyYW5zcG9ydFdvcmsuYWRkKHByb21pc2UpXG4gIHByb21pc2VcbiAgICAuZmluYWxseSgoKSA9PiBwZW5kaW5nVHJhbnNwb3J0V29yay5kZWxldGUocHJvbWlzZSkpXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZClcbn1cblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgLyoqIER1cmF0aW9uIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgc2FtcGxlZCBvbiB0aGUgZmx5IHdoZW4gb21pdHRlZC4gKi9cbiAgcHJlY29tcHV0ZWQ/OiB7IGR1cmF0aW9uTXM6IG51bWJlcjsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfVxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb1RyYW5zcG9ydHMgPSAoaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zLCBwcmVjb21wdXRlZCB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGR1cmF0aW9uTXM6IHByZWNvbXB1dGVkPy5kdXJhdGlvbk1zID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gcmVzdWx0IGFzIFByb21pc2U8dm9pZD5cbiAgICAgICAgdHJhY2socGVuZGluZylcbiAgICAgICAgcGVuZGluZy5jYXRjaChlcnJvciA9PiByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcikpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlcG9ydFRyYW5zcG9ydEVycm9yKGVycm9yLCBvbkVycm9yKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIG9wdGlvbmFsIGxpZmVjeWNsZSBtZXRob2Qgb24gZXZlcnkgY29uZmlndXJlZCB0cmFuc3BvcnQuIEZhaWx1cmVzXG4gKiBhcmUgcmVwb3J0ZWQgbGlrZSBgbG9nKClgIGZhaWx1cmVzIGFuZCBuZXZlciBzdG9wIHRoZSBvdGhlciB0cmFuc3BvcnRzLlxuICovXG5jb25zdCBydW5UcmFuc3BvcnRMaWZlY3ljbGUgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIG1ldGhvZDogJ2Nsb3NlJyB8ICdmbHVzaCdcbik6IFByb21pc2U8dW5rbm93bj5bXSA9PiB7XG4gIGNvbnN0IG9uRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuICByZXR1cm4gKG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdKS5tYXAodHJhbnNwb3J0ID0+XG4gICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHRyYW5zcG9ydFttZXRob2RdPy4oKSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcikpXG4gIClcbn1cblxuLyoqIFdhaXRzIGZvciBpbi1mbGlnaHQgYGxvZygpYCB3b3JrIGFuZCBldmVyeSB0cmFuc3BvcnQncyBvd24gYGZsdXNoKClgLiAqL1xuZXhwb3J0IGNvbnN0IGZsdXNoVHJhbnNwb3J0cyA9IGFzeW5jIChvcHRpb25zOiBPcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgLi4ucGVuZGluZ1RyYW5zcG9ydFdvcmssXG4gICAgLi4ucnVuVHJhbnNwb3J0TGlmZWN5Y2xlKG9wdGlvbnMsICdmbHVzaCcpXG4gIF0pXG59XG5cbi8qKiBSZWxlYXNlcyBlYWNoIHRyYW5zcG9ydCdzIHJlc291cmNlczsgb25seSByZWFjaGVkIHZpYSBgZmx1c2hMb2dpeGx5c2lhYC4gKi9cbmV4cG9ydCBjb25zdCBjbG9zZVRyYW5zcG9ydHMgPSBhc3luYyAob3B0aW9uczogT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocnVuVHJhbnNwb3J0TGlmZWN5Y2xlKG9wdGlvbnMsICdjbG9zZScpKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEZpbGVIYW5kbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgb3BlbiB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBwYXJzZUludGVydmFsLCBwYXJzZVNpemUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IGVuc3VyZURpciB9IGZyb20gJy4vZnMnXG5pbXBvcnQgeyBwZXJmb3JtUm90YXRpb24gfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8qKlxuICogVGhlIGxpdmUgZmlsZSdzIGNyZWF0aW9uIHRpbWUgd2hlbiB0aGUgZmlsZXN5c3RlbSByZXBvcnRzIG9uZTtcbiAqIHNvbWUgZmlsZXN5c3RlbXMgcmVwb3J0IDAvYWJzZW50IGJpcnRodGltZSDigJQgZmFsbCBiYWNrIHRvIGBub3dgXG4gKiAobG9zaW5nIHJlc3RhcnQtc3Vydml2YWwgZm9yIHRoZSBpbnRlcnZhbCBjbG9jaywgYnV0IG5ldmVyIHdyb25nXG4gKiBieSBtb3JlIHRoYW4gdGhlIHByb2Nlc3MgbGlmZXRpbWUpLlxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wZW5lZEF0ID0gKFxuICBiaXJ0aHRpbWVNczogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBub3c6IG51bWJlclxuKTogbnVtYmVyID0+IChiaXJ0aHRpbWVNcyAmJiBiaXJ0aHRpbWVNcyA+IDAgPyBiaXJ0aHRpbWVNcyA6IG5vdylcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2lua09wdGlvbnMge1xuICBsb2dEaXJNb2RlPzogbnVtYmVyXG4gIGxvZ0ZpbGVNb2RlPzogbnVtYmVyXG4gIGxvZ1JvdGF0aW9uPzogTG9nUm90YXRpb25Db25maWdcbiAgLyoqIFJlcG9ydHMgYSByb3RhdGlvbi1zaW5rIGZhaWx1cmU7IGZhbGxzIGJhY2sgdG8gYSBzdGRlcnIgbGluZSB3aGVuIG9taXR0ZWQuICovXG4gIG9uUm90YXRpb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTaW5rIHtcbiAgLyoqIEZsdXNoZXMsIHRoZW4gcmVsZWFzZXMgdGhlIGZpbGUgaGFuZGxlLiBJZGVtcG90ZW50LiAqL1xuICBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogUmVzb2x2ZXMgb25jZSBldmVyeSB3cml0ZSBpc3N1ZWQgc28gZmFyIGlzIGR1cmFibHkgb24gZGlzay4gKi9cbiAgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFJlc29sdmVzIGFmdGVyIGBsaW5lYCBpcyBkdXJhYmx5IHdyaXR0ZW4gdG8gZGlzay4gKi9cbiAgd3JpdGU6IChsaW5lOiBzdHJpbmcsIG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5pbnRlcmZhY2UgQmF0Y2hSZXNvbHZlciB7XG4gIHJlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkXG4gIHJlc29sdmU6ICgpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIFBlbmRpbmdCYXRjaCB7XG4gIGxpbmVzOiBzdHJpbmdbXVxuICByZXNvbHZlcnM6IEJhdGNoUmVzb2x2ZXJbXVxufVxuXG5jbGFzcyBGaWxlU2lua0ltcGwgaW1wbGVtZW50cyBGaWxlU2luayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZ1xuICBwcml2YXRlIGhhbmRsZTogRmlsZUhhbmRsZSB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgYnl0ZXNXcml0dGVuID0gMFxuICBwcml2YXRlIG9wZW5lZEF0ID0gMFxuICBwcml2YXRlIGxhdGVzdE9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyA9IHt9XG4gIHByaXZhdGUgcGVuZGluZ0JhdGNoOiBQZW5kaW5nQmF0Y2ggfCBudWxsID0gbnVsbFxuICAvLyBTZXJpYWxpemVzIGZsdXNoIGFuZCByb3RhdGlvbiB3b3JrIHBlciBwYXRoOiBldmVyeSBiYXRjaCAoYW5kIHRoZVxuICAvLyByb3RhdGlvbiBpdCBtYXkgdHJpZ2dlcikgaXMgY2hhaW5lZCBvbnRvIHRoaXMgc28gYXQgbW9zdCBvbmUgaG9sZGVyIG9mXG4gIC8vIHRoZSBmaWxlIGhhbmRsZSBpcyBkb2luZyBJL08gYXQgYSB0aW1lLlxuICBwcml2YXRlIGZsdXNoQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKVxuXG4gIGNvbnN0cnVjdG9yKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGhcbiAgfVxuXG4gIHdyaXRlKGxpbmU6IHN0cmluZywgb3B0aW9uczogRmlsZVNpbmtPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQWx3YXlzIHVzZSB0aGUgbGF0ZXN0IGNhbGwncyBvcHRpb25zLCBpbiBjYXNlIGNvbmZpZyBkaWZmZXJzIGJldHdlZW5cbiAgICAvLyBjYWxscyB0byB0aGUgc2FtZSBwYXRoIChlLmcuIGluIHRlc3RzKS5cbiAgICB0aGlzLmxhdGVzdE9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ0JhdGNoKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhdGNoLmxpbmVzLnB1c2gobGluZSlcbiAgICAgICAgdGhpcy5wZW5kaW5nQmF0Y2gucmVzb2x2ZXJzLnB1c2goeyByZWplY3QsIHJlc29sdmUgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhdGNoOiBQZW5kaW5nQmF0Y2ggPSB7XG4gICAgICAgIGxpbmVzOiBbbGluZV0sXG4gICAgICAgIHJlc29sdmVyczogW3sgcmVqZWN0LCByZXNvbHZlIH1dXG4gICAgICB9XG4gICAgICB0aGlzLnBlbmRpbmdCYXRjaCA9IGJhdGNoXG5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmF0Y2ggPSBudWxsXG4gICAgICAgIHRoaXMuZmx1c2hDaGFpbiA9IHRoaXMuZmx1c2hDaGFpbi50aGVuKFxuICAgICAgICAgICgpID0+IHRoaXMuZmx1c2hCYXRjaChiYXRjaCksXG4gICAgICAgICAgKCkgPT4gdGhpcy5mbHVzaEJhdGNoKGJhdGNoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZsdXNoQmF0Y2goYmF0Y2g6IFBlbmRpbmdCYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmxhdGVzdE9wdGlvbnNcbiAgICAvLyBMaW5lcyBhbHJlYWR5IGNhcnJ5IHRoZWlyIG93biB0cmFpbGluZyBuZXdsaW5lOyBqb2luIG5lZWRzIG5vIHNlcGFyYXRvci5cbiAgICBjb25zdCB0ZXh0ID0gYmF0Y2gubGluZXMuam9pbignJylcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZU9wZW4ob3B0aW9ucylcbiAgICAgIGNvbnN0IGhhbmRsZSA9IHRoaXMuaGFuZGxlIGFzIEZpbGVIYW5kbGVcbiAgICAgIGF3YWl0IGhhbmRsZS53cml0ZSh0ZXh0KVxuICAgICAgdGhpcy5ieXRlc1dyaXR0ZW4gKz0gQnVmZmVyLmJ5dGVMZW5ndGgodGV4dClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBiYXRjaC5yZXNvbHZlcnMpIHtcbiAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gUm90YXRpb24gKGlmIHRyaWdnZXJlZCkgaXMgYXdhaXRlZCBiZWZvcmUgcmVzb2x2aW5nIHNvIGNhbGxlcnMgb2JzZXJ2ZVxuICAgIC8vIGEgY29uc2lzdGVudCBvbi1kaXNrIHN0YXRlOiB0aGUgbGluZSdzIHdyaXRlIHBsdXMgYW55IHJvdGF0aW9uIGl0XG4gICAgLy8gY2F1c2VkLiBtYXliZVJvdGF0ZSgpIGNhdGNoZXMgYW5kIHJlcG9ydHMgaXRzIG93biBlcnJvcnMsIHNvIGl0IG5ldmVyXG4gICAgLy8gcmVqZWN0cyB0aGlzIGNoYWluLlxuICAgIGF3YWl0IHRoaXMubWF5YmVSb3RhdGUob3B0aW9ucylcblxuICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgYmF0Y2gucmVzb2x2ZXJzKSB7XG4gICAgICByZXNvbHZlci5yZXNvbHZlKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZU9wZW4ob3B0aW9uczogRmlsZVNpbmtPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaGFuZGxlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBUaGUgZGlyZWN0b3J5IG9ubHkgbmVlZHMgY3JlYXRpbmcgb24gZmlyc3Qgb3BlbiAob3Igb24gcmVvcGVuIGFmdGVyIGFcbiAgICAvLyByb3RhdGlvbiBjbGVhcmVkIHRoZSBoYW5kbGUpIOKAlCBuZXZlciBwZXIgbGluZS5cbiAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgb3B0aW9ucy5sb2dEaXJNb2RlKVxuICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IG9wZW4odGhpcy5maWxlUGF0aCwgJ2EnLCBvcHRpb25zLmxvZ0ZpbGVNb2RlID8/IDBvNjAwKVxuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBoYW5kbGUuc3RhdCgpXG4gICAgdGhpcy5oYW5kbGUgPSBoYW5kbGVcbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IHN0YXQuc2l6ZVxuICAgIHRoaXMub3BlbmVkQXQgPSByZXNvbHZlT3BlbmVkQXQoc3RhdC5iaXJ0aHRpbWVNcywgRGF0ZS5ub3coKSlcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gZWl0aGVyIGNvbmZpZ3VyZWQgdHJpZ2dlciAoc2l6ZSwgaW50ZXJ2YWwpIGhhcyBiZWVuIGNyb3NzZWQuICovXG4gIHByaXZhdGUgc2hvdWxkUm90YXRlTm93KHJvdGF0aW9uOiBMb2dSb3RhdGlvbkNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHJvdGF0aW9uLm1heFNpemUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdGhpcy5ieXRlc1dyaXR0ZW4gPiBwYXJzZVNpemUocm90YXRpb24ubWF4U2l6ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICByb3RhdGlvbi5pbnRlcnZhbCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5vcGVuZWRBdCA+PSBwYXJzZUludGVydmFsKHJvdGF0aW9uLmludGVydmFsKVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWF5YmVSb3RhdGUob3B0aW9uczogRmlsZVNpbmtPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm90YXRpb24gPSBvcHRpb25zLmxvZ1JvdGF0aW9uXG4gICAgaWYgKFxuICAgICAgIXJvdGF0aW9uIHx8XG4gICAgICAocm90YXRpb24ubWF4U2l6ZSA9PT0gdW5kZWZpbmVkICYmIHJvdGF0aW9uLmludGVydmFsID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZFJvdGF0ZU5vdyhyb3RhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaGFuZGxlIH0gPSB0aGlzXG4gICAgICB0aGlzLmhhbmRsZSA9IG51bGxcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMFxuICAgICAgdGhpcy5vcGVuZWRBdCA9IERhdGUubm93KClcbiAgICAgIGF3YWl0IGhhbmRsZT8uY2xvc2UoKVxuICAgICAgYXdhaXQgcGVyZm9ybVJvdGF0aW9uKHRoaXMuZmlsZVBhdGgsIHJvdGF0aW9uLCBvcHRpb25zLm9uUm90YXRpb25FcnJvcilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGVudHJpZXMgd2VyZSBhbHJlYWR5IGR1cmFibHkgd3JpdHRlbiBhbmQgcmVzb2x2ZWQgYWJvdmU7XG4gICAgICAvLyByb3RhdGlvbiBmYWlsdXJlcyBtdXN0IG5vdCBmYWlsIHRoZSBjYWxsZXIncyB3cml0ZS5cbiAgICAgIGlmIChvcHRpb25zLm9uUm90YXRpb25FcnJvcikge1xuICAgICAgICBvcHRpb25zLm9uUm90YXRpb25FcnJvcihlcnJvcilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7dGhpcy5maWxlUGF0aH06YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd3JpdGUoKSBjaGFpbnMgb250byBmbHVzaENoYWluIGZyb20gYSBtaWNyb3Rhc2ssIHNvIHlpZWxkIG9uY2UgYmVmb3JlXG4gICAgLy8gcmVhZGluZyB0aGUgY2hhaW4gb3IgYSB3cml0ZSBpc3N1ZWQgaW4gdGhlIHNhbWUgdGljayB3b3VsZCBiZSBtaXNzZWQuXG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKClcbiAgICBhd2FpdCB0aGlzLmZsdXNoQ2hhaW5cbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZmx1c2goKVxuICAgIGNvbnN0IHsgaGFuZGxlIH0gPSB0aGlzXG4gICAgdGhpcy5oYW5kbGUgPSBudWxsXG4gICAgYXdhaXQgaGFuZGxlPy5jbG9zZSgpXG4gICAgc2lua3MuZGVsZXRlKHRoaXMuZmlsZVBhdGgpXG4gIH1cbn1cblxuY29uc3Qgc2lua3MgPSBuZXcgTWFwPHN0cmluZywgRmlsZVNpbms+KClcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVTaW5rID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBGaWxlU2luayA9PiB7XG4gIGxldCBzaW5rID0gc2lua3MuZ2V0KGZpbGVQYXRoKVxuICBpZiAoIXNpbmspIHtcbiAgICBzaW5rID0gbmV3IEZpbGVTaW5rSW1wbChmaWxlUGF0aClcbiAgICBzaW5rcy5zZXQoZmlsZVBhdGgsIHNpbmspXG4gIH1cbiAgcmV0dXJuIHNpbmtcbn1cblxuZXhwb3J0IGNvbnN0IGZsdXNoQWxsRmlsZVNpbmtzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnNpbmtzLnZhbHVlcygpXS5tYXAoc2luayA9PiBzaW5rLmZsdXNoKCkpKVxufVxuXG5leHBvcnQgY29uc3QgY2xvc2VBbGxGaWxlU2lua3MgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4uc2lua3MudmFsdWVzKCldLm1hcChzaW5rID0+IHNpbmsuY2xvc2UoKSkpXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBtb2RlID0gMG83MDBcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IG1vZGUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcbmltcG9ydCB7IGNyZWF0ZUtleWVkTXV0ZXggfSBmcm9tICcuL2tleWVkLW11dGV4J1xuXG5jb25zdCBnemlwQXN5bmMgPSBwcm9taXNpZnkoZ3ppcClcblxuLy8gUHJldmVudHMgY29uY3VycmVudCBjb21wcmVzc2lvbiBvZiB0aGUgc2FtZSBmaWxlIChrZXllZCBieSBmaWxlUGF0aCkuXG5jb25zdCBjb21wcmVzc2lvbkxvY2sgPSBjcmVhdGVLZXllZE11dGV4KClcblxuLyoqIFJlcG9ydHMgYSBzaW5rIGZhaWx1cmU7IHdoZW4gb21pdHRlZCwgdGhlIGNhbGxlciBmYWxscyBiYWNrIHRvIHN0ZGVyci4gKi9cbmV4cG9ydCB0eXBlIFJvdGF0aW9uRXJyb3JSZXBvcnRlciA9IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuXG5jb25zdCByZXBvcnRSb3RhdGlvbkVycm9yID0gKFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiB2b2lkID0+IHtcbiAgaWYgKG9uRXJyb3IpIHtcbiAgICBvbkVycm9yKGVycm9yKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IpXG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9uRXJyb3I/OiBSb3RhdGlvbkVycm9yUmVwb3J0ZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgY29tcHJlc3Npb25Mb2NrLmFjcXVpcmUoZmlsZVBhdGgpXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgZmlsZSBzdGlsbCBleGlzdHMgKG1pZ2h0IGhhdmUgYmVlbiBjb21wcmVzc2VkIGJ5IGFub3RoZXIgcHJvY2VzcylcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBhbHJlYWR5IGNvbXByZXNzZWQgb3IgZGVsZXRlZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCBnemlwQXN5bmMoY29udGVudClcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydFJvdGF0aW9uRXJyb3IoXG4gICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICBlcnJvcixcbiAgICAgIG9uRXJyb3JcbiAgICApXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5pbnRlcmZhY2UgRmlsZVN0YXQge1xuICBwYXRoOiBzdHJpbmdcbiAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbn1cblxuY29uc3QgaXNGdWxmaWxsZWQgPSA8VD4oXG4gIHJlc3VsdDogUHJvbWlzZVNldHRsZWRSZXN1bHQ8VD5cbik6IHJlc3VsdCBpcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG5cbi8qKlxuICogRGVsZXRlcyByb3RhdGVkIGZpbGVzIGJleW9uZCBgcmV0ZW50aW9uYDogZm9yIGAnY291bnQnYCwga2VlcHMgdGhlIG5ld2VzdFxuICogYHJldGVudGlvbi52YWx1ZWAgZmlsZXMgKGJ5IG10aW1lKTsgZm9yIGAndGltZSdgLCBkZWxldGVzIGZpbGVzIG9sZGVyIHRoYW5cbiAqIGByZXRlbnRpb24udmFsdWVgIG1zLiBJbmRpdmlkdWFsIHN0YXQvZGVsZXRlIGZhaWx1cmVzIGFyZSB0b2xlcmF0ZWQgKHZpYVxuICogYGFsbFNldHRsZWRgKSBzbyBvbmUgYmFkIGZpbGUgbmV2ZXIgYmxvY2tzIGNsZWFudXAgb2YgdGhlIHJlc3QuXG4gKi9cbmNvbnN0IGNsZWFudXBSb3RhdGVkID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICByZXRlbnRpb246IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9LFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnICYmIHJvdGF0ZWQubGVuZ3RoIDw9IHJldGVudGlvbi52YWx1ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzLCBpZ25vcmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgY29uY3VycmVudGx5XG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzLmZpbHRlcihpc0Z1bGZpbGxlZDxGaWxlU3RhdD4pLm1hcChyID0+IHIudmFsdWUpXG5cbiAgbGV0IHRvRGVsZXRlOiBGaWxlU3RhdFtdXG4gIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgIGlmIChzdGF0cy5sZW5ndGggPD0gcmV0ZW50aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgICB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKHJldGVudGlvbi52YWx1ZSlcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgdG9EZWxldGUgPSBzdGF0cy5maWx0ZXIoKHsgc3RhdCB9KSA9PiBub3cgLSBzdGF0Lm10aW1lTXMgPiByZXRlbnRpb24udmFsdWUpXG4gIH1cblxuICAvLyBEZWxldGUgZmlsZXMgaW5kaXZpZHVhbGx5LCBjb250aW51aW5nIGV2ZW4gaWYgc29tZSBmYWlsXG4gIGNvbnN0IGRlbGV0ZVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgdG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgKVxuXG4gIC8vIExvZyBmYWlsdXJlcyBidXQgZG9uJ3QgY3Jhc2hcbiAgZGVsZXRlUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGlkeCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICByZXBvcnRSb3RhdGlvbkVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBkZWxldGUgcm90YXRlZCBsb2cgJHt0b0RlbGV0ZVtpZHhdLnBhdGh9OmAsXG4gICAgICAgIHJlc3VsdC5yZWFzb24sXG4gICAgICAgIG9uRXJyb3JcbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwZXJmb3JtUm90YXRpb24gPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWcsXG4gIG9uRXJyb3I/OiBSb3RhdGlvbkVycm9yUmVwb3J0ZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgcm90YXRlRmlsZShmaWxlUGF0aClcbiAgaWYgKCFyb3RhdGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBzaG91bGRDb21wcmVzcyA9IGNvbmZpZy5jb21wcmVzcyA9PT0gdHJ1ZVxuICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcbiAgICBjb25zdCBhbGdvID0gY29uZmlnLmNvbXByZXNzaW9uID8/ICdnemlwJ1xuICAgIGlmIChhbGdvID09PSAnZ3ppcCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbXByZXNzRmlsZShyb3RhdGVkLCBvbkVycm9yKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGNvbXByZXNzRmlsZSBhbHJlYWR5IHJlcG9ydGVkIHRoaXMgZXJyb3IgdmlhIG9uRXJyb3IvY29uc29sZS5lcnJvcjtcbiAgICAgICAgLy8gc3dhbGxvdyB0aGUgcmV0aHJvdyBoZXJlIHNvIHJldGVudGlvbiBjbGVhbnVwIGJlbG93IHN0aWxsIHJ1bnMgYW5kXG4gICAgICAgIC8vIHRoZSBmYWlsdXJlIGlzbid0IHJlcG9ydGVkIGEgc2Vjb25kIHRpbWUgYnkgdGhlIGNhbGxlcidzIGNhdGNoLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcubWF4RmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcbiAgICBhd2FpdCBjbGVhbnVwUm90YXRlZChmaWxlUGF0aCwgcmV0ZW50aW9uLCBvbkVycm9yKVxuICB9XG5cbiAgLy8gSW50ZXJ2YWwtYmFzZWQgdHJpZ2dlcmluZyBsaXZlcyBpbiBgRmlsZVNpbmtJbXBsLm1heWJlUm90YXRlYFxuICAvLyAoZmlsZS1zaW5rLnRzKTsgcGVyZm9ybVJvdGF0aW9uIGlzIHRyaWdnZXItYWdub3N0aWMg4oCUIGl0IHJlbmFtZXMsXG4gIC8vIGNvbXByZXNzZXMsIGFuZCBjbGVhbnMgdXAgcmVnYXJkbGVzcyBvZiB3aHkgcm90YXRpb24gZmlyZWQuXG59XG4iLAogICAgImV4cG9ydCBpbnRlcmZhY2UgS2V5ZWRNdXRleCB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHdvcmsgZm9yIGBrZXlgOiByZXNvbHZlcyBvbmNlIGFueSBwcmlvciBob2xkZXIgZm9yIHRoZSBzYW1lXG4gICAqIGtleSBoYXMgcmVsZWFzZWQsIGFuZCByZXR1cm5zIGEgcmVsZWFzZSBmdW5jdGlvbiB0aGUgY2FsbGVyIE1VU1QgY2FsbFxuICAgKiBleGFjdGx5IG9uY2UgdG8gaGFuZCB0aGUgbG9jayB0byB0aGUgbmV4dCB3YWl0ZXIgKGlmIGFueSkuXG4gICAqL1xuICBhY3F1aXJlOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8KCkgPT4gdm9pZD5cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGluZGVwZW5kZW50IGtleWVkIG11dGV4OiBhY3F1aXNpdGlvbnMgZm9yIGRpZmZlcmVudCBrZXlzIG5ldmVyXG4gKiBibG9jayBlYWNoIG90aGVyLCB3aGlsZSBhY3F1aXNpdGlvbnMgZm9yIHRoZSBzYW1lIGtleSBhcmUgc2VyaWFsaXplZCBpblxuICogRklGTyBvcmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUtleWVkTXV0ZXggPSAoKTogS2V5ZWRNdXRleCA9PiB7XG4gIGNvbnN0IGxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuICBjb25zdCBhY3F1aXJlID0gYXN5bmMgKGtleTogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gICAgY29uc3QgcHJpb3IgPSBsb2Nrcy5nZXQoa2V5KSA/PyBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgbGV0IHJlbGVhc2U6ICgpID0+IHZvaWRcbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICByZWxlYXNlID0gcmVzb2x2ZVxuICAgIH0pXG5cbiAgICAvLyBSZWdpc3RlciBiZWZvcmUgYXdhaXRpbmc6IHNhbWUtdGljayBjYWxsZXJzIG11c3QgY2hhaW4gb250byBUSElTIGxvY2ssXG4gICAgLy8gbm90IHRoZSBvbmUgdGhhdCB3YXMgY3VycmVudCB3aGVuIHRoZXkgY2FsbGVkIGFjcXVpcmUoKS5cbiAgICBsb2Nrcy5zZXQoa2V5LCBjdXJyZW50KVxuXG4gICAgYXdhaXQgcHJpb3JcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZWxlYXNlPy4oKVxuICAgICAgaWYgKGxvY2tzLmdldChrZXkpID09PSBjdXJyZW50KSB7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShrZXkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWNxdWlyZSB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTaW5rRXJyb3JDb250ZXh0LFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgc2FuaXRpemVMb2dUZXh0IH0gZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUnXG5pbXBvcnQgeyBnZXRGaWxlU2luayB9IGZyb20gJy4vZmlsZS1zaW5rJ1xuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIC8qKiBEdXJhdGlvbi9VUkwgcGFydHMgYWxyZWFkeSBjb21wdXRlZCBieSB0aGUgY2FsbGVyOyBwYXJzZWQgb24gdGhlIGZseSB3aGVuIG9taXR0ZWQuICovXG4gIHByZWNvbXB1dGVkPzogeyBkdXJhdGlvbk1zOiBudW1iZXI7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nIH1cbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG4vKiogUmVzb2x2ZXMgdGhlIGxvZ2dlZCBwYXRobmFtZSAod2l0aCBxdWVyeSBzdHJpbmcgd2hlbiBjb25maWd1cmVkKSBmcm9tIHByZWNvbXB1dGVkIHBhcnRzIG9yIGEgZnJlc2ggcGFyc2UuICovXG5jb25zdCByZXNvbHZlUGF0aG5hbWUgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBsb2dRdWVyeVBhcmFtczogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgcHJlY29tcHV0ZWQ/OiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nIH1cbik6IHN0cmluZyA9PiB7XG4gIGlmIChwcmVjb21wdXRlZCkge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUsIHNlYXJjaCB9ID0gcHJlY29tcHV0ZWRcbiAgICByZXR1cm4gbG9nUXVlcnlQYXJhbXMgPyBgJHtwYXRobmFtZX0ke3NlYXJjaH1gIDogcGF0aG5hbWVcbiAgfVxuICB0cnkge1xuICAgIC8vIFNhZmVseSBwYXJzZSBVUkwgdG8gYXZvaWQgY3Jhc2hlcyBvbiBtYWxmb3JtZWQgVVJMc1xuICAgIGNvbnN0IHsgcGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgICByZXR1cm4gbG9nUXVlcnlQYXJhbXMgPyBgJHtwYXRobmFtZX0ke3NlYXJjaH1gIDogcGF0aG5hbWVcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbGJhY2sgdG8gcmF3IFVSTCBpZiBwYXJzaW5nIGZhaWxzXG4gICAgcmV0dXJuIHJlcXVlc3QudXJsXG4gIH1cbn1cblxuLyoqIFJlcG9ydHMgYSBzaW5rIGZhaWx1cmUgdmlhIGBjb25maWcub25FcnJvcmAgd2hlbiBzZXQgKHN3YWxsb3dpbmcgaG9vayBlcnJvcnMpLCBlbHNlIHN0ZGVyci4gKi9cbmNvbnN0IHJlcG9ydFNpbmtFcnJvciA9IChcbiAgY29uZmlnOiBPcHRpb25zWydjb25maWcnXSxcbiAgc2luazogU2lua0Vycm9yQ29udGV4dFsnc2luayddLFxuICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZyxcbiAgZXJyb3I6IHVua25vd25cbik6IHZvaWQgPT4ge1xuICBjb25zdCBvbkVycm9yID0gY29uZmlnPy5vbkVycm9yXG4gIGlmICghb25FcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoZmFsbGJhY2tNZXNzYWdlLCBlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuICB0cnkge1xuICAgIG9uRXJyb3IoeyBlcnJvciwgc2luayB9KVxuICB9IGNhdGNoIHtcbiAgICAvLyBTd2FsbG93IGVycm9ycyB0aHJvd24gYnkgdGhlIGhvb2sgaXRzZWxmLlxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb0ZpbGUgPSBhc3luYyAoaW5wdXQ6IExvZ1RvRmlsZUlucHV0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgcHJlY29tcHV0ZWQgfSA9IGlucHV0XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID0gcHJlY29tcHV0ZWQ/LmR1cmF0aW9uTXMgPz8gZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpXG5cbiAgY29uc3QgcGF0aG5hbWUgPSByZXNvbHZlUGF0aG5hbWUocmVxdWVzdCwgY29uZmlnPy5sb2dRdWVyeVBhcmFtcywgcHJlY29tcHV0ZWQpXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtzYW5pdGl6ZUxvZ1RleHQocGF0aG5hbWUsIDEwMjQpfSAke3Nhbml0aXplTG9nVGV4dChtZXNzYWdlKX1cXG5gXG5cbiAgY29uc3Qgb25Sb3RhdGlvbkVycm9yID0gY29uZmlnPy5vbkVycm9yXG4gICAgPyAoZXJyb3I6IHVua25vd24pID0+IHJlcG9ydFNpbmtFcnJvcihjb25maWcsICdyb3RhdGlvbicsICcnLCBlcnJvcilcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZ2V0RmlsZVNpbmsoZmlsZVBhdGgpLndyaXRlKGxpbmUsIHtcbiAgICAgIGxvZ0Rpck1vZGU6IGNvbmZpZz8ubG9nRGlyTW9kZSxcbiAgICAgIGxvZ0ZpbGVNb2RlOiBjb25maWc/LmxvZ0ZpbGVNb2RlLFxuICAgICAgbG9nUm90YXRpb246IGNvbmZpZz8ubG9nUm90YXRpb24sXG4gICAgICBvblJvdGF0aW9uRXJyb3JcbiAgICB9KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydFNpbmtFcnJvcihcbiAgICAgIGNvbmZpZyxcbiAgICAgICdmaWxlJyxcbiAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHdyaXRlIHRvIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICBlcnJvclxuICAgIClcbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG4iLAogICAgImltcG9ydCB7XG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHtcbiAgTG9nRmlsdGVyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgdHlwZSB7IFNhbXBsaW5nUnVudGltZSB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQge1xuICB0eXBlIEZvcm1hdENvbnRleHQsXG4gIGZvcm1hdExvZ091dHB1dCxcbiAgdHlwZSBQcmVjb21wdXRlZExvZ1BhcnRzXG59IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuLyoqXG4gKiBXaGljaCBzaW5rcyBhcmUgYWN0aXZlIGZvciBhIGdpdmVuIGNvbmZpZywgcmVzb2x2ZWQgb25jZSBwZXIgbG9nZ2VyXG4gKiBpbnN0YW5jZSAoc2VlIGBjcmVhdGVMb2dnZXJgKSBzaW5jZSBub25lIG9mIHRoZXNlIGRlcGVuZCBvbiBwZXItcmVxdWVzdFxuICogc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua3Mge1xuICBoYXNGaWxlTG9nZ2luZzogYm9vbGVhblxuICBoYXNJbnRlcm5hbExvZ2dlcjogYm9vbGVhblxuICBoYXNUcmFuc3BvcnRzOiBib29sZWFuXG4gIC8qKiBUcnVlIHdoZW4gbm8gc2luayBpcyBhY3RpdmUgYXQgYWxsOiBgbG9nKClgL2BoYW5kbGVIdHRwRXJyb3IoKWAgY2FuIHNraXAgYWxsIHdvcmsuICovXG4gIGlzRWZmZWN0aXZlbHlEaXNhYmxlZDogYm9vbGVhblxuICAvKiogVHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSBhY3RpdmUgc2luayByZWFkcyBwYXRobmFtZS9zZWFyY2ggKGZpbGUgbG9nZ2luZyBvciB0aGUgY29uc29sZSBmb3JtYXR0ZXIpLiAqL1xuICBuZWVkc1VybFBhcnRzOiBib29sZWFuXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlU2lua3MgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IFNpbmtzID0+IHtcbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgY29uc3QgaGFzVHJhbnNwb3J0cyA9IChjb25maWc/LnRyYW5zcG9ydHM/Lmxlbmd0aCA/PyAwKSA+IDBcbiAgY29uc3QgaGFzRmlsZUxvZ2dpbmcgPVxuICAgICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSAmJiAhIWNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgY29uc3QgaGFzSW50ZXJuYWxMb2dnZXIgPSAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcilcbiAgY29uc3QgaXNFZmZlY3RpdmVseURpc2FibGVkID0gIShcbiAgICBoYXNUcmFuc3BvcnRzIHx8XG4gICAgaGFzRmlsZUxvZ2dpbmcgfHxcbiAgICBoYXNJbnRlcm5hbExvZ2dlclxuICApXG4gIGNvbnN0IG5lZWRzVXJsUGFydHMgPSBoYXNGaWxlTG9nZ2luZyB8fCBoYXNJbnRlcm5hbExvZ2dlclxuXG4gIHJldHVybiB7XG4gICAgaGFzRmlsZUxvZ2dpbmcsXG4gICAgaGFzSW50ZXJuYWxMb2dnZXIsXG4gICAgaGFzVHJhbnNwb3J0cyxcbiAgICBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQsXG4gICAgbmVlZHNVcmxQYXJ0c1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG59XG5cbi8qKiBQYXJzZXMgdGhlIFVSTCBvbmNlOyBvbmx5IGNhbGxlZCB3aGVuIGF0IGxlYXN0IG9uZSBhY3RpdmUgc2luayByZWFkcyBwYXRobmFtZS9zZWFyY2guICovXG5leHBvcnQgY29uc3QgcGFyc2VSZXF1ZXN0VXJsT25jZSA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbik6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmcgfSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHJldHVybiB7IHBhdGhuYW1lLCBzZWFyY2ggfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBwYXRobmFtZTogcmVxdWVzdC51cmwgfHwgJy8nLCBzZWFyY2g6ICcnIH1cbiAgfVxufVxuXG4vKipcbiAqIFNhbXBsZXMgZHVyYXRpb24gYW5kIHBhcnNlcyB0aGUgVVJMIG9uY2UgcGVyIGVtaXNzaW9uIGZvciB0aGUgc2lua3MgdGhhdCB3aWxsIGFjdHVhbGx5IHJ1bi5cbiAqIGBsb2dUb1RyYW5zcG9ydHNgJyBtZXRhIG9ubHkgcmVhZHMgYGR1cmF0aW9uTXNgIChub3QgcGF0aG5hbWUvc2VhcmNoKSwgc28gdGhlIFVSTCBpcyBwYXJzZWRcbiAqIG9ubHkgd2hlbiBmaWxlIGxvZ2dpbmcgb3IgdGhlIGludGVybmFsIGNvbnNvbGUgbG9nZ2VyIGlzIGFjdGl2ZSDigJQgc2tpcHBpbmcgaXQgZW50aXJlbHkgZm9yXG4gKiB0cmFuc3BvcnRzLW9ubHkgY29uZmlncywgbWF0Y2hpbmcgdGhhdCBwYXRoJ3MgcHJlLW9wdGltaXphdGlvbiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXB1dGVQcmVjb21wdXRlZExvZ1BhcnRzID0gKFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgbmVlZHNVcmxQYXJ0czogYm9vbGVhbixcbiAgZHVyYXRpb25PdmVycmlkZT86IG51bWJlclxuKTogUHJlY29tcHV0ZWRMb2dQYXJ0cyA9PiB7XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBkdXJhdGlvbk92ZXJyaWRlID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IG5lZWRzVXJsUGFydHNcbiAgICA/IHBhcnNlUmVxdWVzdFVybE9uY2UocmVxdWVzdClcbiAgICA6IHsgcGF0aG5hbWU6ICcnLCBzZWFyY2g6ICcnIH1cblxuICByZXR1cm4geyBkdXJhdGlvbk1zLCBwYXRobmFtZSwgc2VhcmNoIH1cbn1cblxuY29uc3QgY29uc29sZUZvckxldmVsID0gKGxldmVsOiBMb2dMZXZlbCk6IHR5cGVvZiBjb25zb2xlLmxvZyA9PiB7XG4gIHN3aXRjaCAobGV2ZWwpIHtcbiAgICBjYXNlICdERUJVRyc6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmRlYnVnXG4gICAgfVxuICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICByZXR1cm4gY29uc29sZS5pbmZvXG4gICAgfVxuICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuXG4gICAgfVxuICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3JcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdElucHV0IHtcbiAgLyoqIFNraXBzIHRoZSBzYW1wbGluZyBnYXRlOyBzZXQgd2hlbiByZXBsYXlpbmcgYSB0YWlsLXJlc2N1ZWQgcmVjb3JkLiAqL1xuICBieXBhc3NTYW1wbGluZz86IGJvb2xlYW5cbiAgLyoqIFNoYXJlZCBwZXItcmVxdWVzdCBjb250ZXh0IGJhZyAocGVla2VkLCBuZXZlciBjbG9uZWQvcmV0YWluZWQpLiAqL1xuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgLyoqIER1cmF0aW9uIGNhcHR1cmVkIHdoZW4gYSByZWNvcmQgd2FzIGJ1ZmZlcmVkLCByZXBsYWNpbmcgdGhlIGxpdmUgc2FtcGxlLiAqL1xuICBkdXJhdGlvbk92ZXJyaWRlPzogbnVtYmVyXG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgY29uc3RhbnRzIGZvciBgZm9ybWF0TG9nT3V0cHV0YDsgb25seSByZWFkIHdoZW4gdGhlIGludGVybmFsIGNvbnNvbGUgbG9nZ2VyIGlzIGFjdGl2ZS4gKi9cbiAgZm9ybWF0Q29udGV4dDogRm9ybWF0Q29udGV4dFxuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICAvKiogSG9pc3RlZCBwZXItbG9nZ2VyIHNhbXBsaW5nIHJ1bnRpbWU7IHVuZGVmaW5lZCB3aGVuIHNhbXBsaW5nIGlzIG9mZi4gKi9cbiAgc2FtcGxpbmc/OiBTYW1wbGluZ1J1bnRpbWVcbiAgLyoqIEhvaXN0ZWQgcGVyLWxvZ2dlciBzaW5rIGdhdGVzIGZyb20ge0BsaW5rIHJlc29sdmVTaW5rc30uICovXG4gIHNpbmtzOiBTaW5rc1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbi8qKlxuICogVGhlIHNpbmdsZSBsb2ctZW1pc3Npb24gcGlwZWxpbmUgc2hhcmVkIGJ5IHRoZSBzdWNjZXNzIHBhdGggKGBsb2coKWApIGFuZFxuICogdGhlIGVycm9yIHBhdGggKGBoYW5kbGVIdHRwRXJyb3IoKWApOiBmaWx0ZXIgY2hlY2sgLT4gY29udGV4dCBtZXJnZSAtPlxuICogcmVkYWN0IC0+IHRyYW5zcG9ydHMgLT4gZmlsZSAtPiBjb25zb2xlLCBhbGwgZ2F0ZWQgYnkgdGhlIHNhbWUgYHNpbmtzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXQgPSAoe1xuICBieXBhc3NTYW1wbGluZyxcbiAgY29udGV4dFN0b3JlLFxuICBkYXRhLFxuICBkdXJhdGlvbk92ZXJyaWRlLFxuICBmb3JtYXRDb250ZXh0LFxuICBsZXZlbCxcbiAgb3B0aW9ucyxcbiAgcmVxdWVzdCxcbiAgc2FtcGxpbmcsXG4gIHNpbmtzLFxuICBzdG9yZVxufTogRW1pdElucHV0KTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG5cbiAgaWYgKHNpbmtzLmlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChzYW1wbGluZyAmJiAhYnlwYXNzU2FtcGxpbmcpIHtcbiAgICBjb25zdCBkZWNpc2lvbiA9IHNhbXBsaW5nLmRlY2lkZShsZXZlbCwgcmVxdWVzdClcbiAgICBpZiAoZGVjaXNpb24gPT09ICdkcm9wJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWNpc2lvbiA9PT0gJ2J1ZmZlcicpIHtcbiAgICAgIC8vIEJ1ZmZlcmVkIHJhdzogY29udGV4dCBtZXJnZSwgcmVkYWN0aW9uIGFuZCBmb3JtYXR0aW5nIGFyZSBkZWZlcnJlZCB0b1xuICAgICAgLy8gcmVwbGF5LCBzbyBhIHJlcXVlc3QgdGhhdCBuZXZlciBnZXRzIHJlc2N1ZWQgcGF5cyBhbG1vc3Qgbm90aGluZy5cbiAgICAgIHNhbXBsaW5nLmJ1ZmZlcihyZXF1ZXN0LCB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGR1cmF0aW9uTXM6IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKSxcbiAgICAgICAgbGV2ZWxcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBjb25zdCBkYXRhV2l0aENvbnRleHQgPSBtZXJnZUxvZ0RhdGFDb250ZXh0KFxuICAgIGRhdGEsXG4gICAgLy8gbWVyZ2VMb2dEYXRhQ29udGV4dCBvbmx5IHJlYWRzL3NwcmVhZHMgdGhpcyBiYWcgaW50byBhIG5ldyBvYmplY3Q7IGl0IG5ldmVyIHJldGFpbnNcbiAgICAvLyB0aGUgcmVmZXJlbmNlLCBzbyBhIG5vbi1jbG9uaW5nIHBlZWsgaXMgc2FmZSBoZXJlLlxuICAgIGNvbnRleHRTdG9yZS5wZWVrQ29udGV4dChyZXF1ZXN0KVxuICApXG4gIGNvbnN0IGxvZ0RhdGEgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZVxuICAgICAgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0LCBjb25maWc/LnJlZGFjdEtleXMpXG4gICAgICA6IGRhdGFXaXRoQ29udGV4dFxuICBjb25zdCBsb2dSZXF1ZXN0ID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWVcbiAgICAgID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0LCBjb25maWc/LnJlZGFjdEtleXMpXG4gICAgICA6IHJlcXVlc3RcblxuICBjb25zdCBwcmVjb21wdXRlZCA9IGNvbXB1dGVQcmVjb21wdXRlZExvZ1BhcnRzKFxuICAgIHN0b3JlLFxuICAgIGxvZ1JlcXVlc3QsXG4gICAgc2lua3MubmVlZHNVcmxQYXJ0cyxcbiAgICBkdXJhdGlvbk92ZXJyaWRlXG4gIClcblxuICBpZiAoc2lua3MuaGFzVHJhbnNwb3J0cykge1xuICAgIGxvZ1RvVHJhbnNwb3J0cyh7XG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcHJlY29tcHV0ZWQsXG4gICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgc3RvcmVcbiAgICB9KVxuICB9XG5cbiAgaWYgKHNpbmtzLmhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHByZWNvbXB1dGVkLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBzdG9yZVxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvKiBJZ25vcmUgZXJyb3JzOiBmaWxlLnRzIGFscmVhZHkgcmVwb3J0ZWQgdGhlbSAoY29uc29sZS5lcnJvciBvciBjb25maWcub25FcnJvcikuICovXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghc2lua3MuaGFzSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgZm9ybWF0Q29udGV4dCxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHByZWNvbXB1dGVkLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgc3RvcmVcbiAgfSlcbiAgY29uc3QgbWVzc2FnZSA9XG4gICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG5cbiAgY29uc29sZUZvckxldmVsKGxldmVsKShtZXNzYWdlKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHR5cGUgeyBTYW1wbGluZ1J1bnRpbWUgfSBmcm9tICcuLi9zYW1wbGluZydcbmltcG9ydCB7IG5vcm1hbGl6ZUxvZ2dlZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5pbXBvcnQgdHlwZSB7IEZvcm1hdENvbnRleHQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBlbWl0LCB0eXBlIFNpbmtzLCBzaG91bGRMb2cgfSBmcm9tICcuL2VtaXQnXG5cbmNvbnN0IGlzRXJyb3JXaXRoU3RhdHVzID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyB7IHN0YXR1cz86IHVua25vd24gfSkuc3RhdHVzID09PSAnbnVtYmVyJ1xuXG4vKiogVGhlIHN0YXR1cyBhIHRocm93biB2YWx1ZSBtYXBzIHRvOyBhbnl0aGluZyB3aXRob3V0IG9uZSBpcyBhIDUwMC4gKi9cbmV4cG9ydCBjb25zdCBlcnJvclN0YXR1cyA9IChlcnJvcjogdW5rbm93bik6IG51bWJlciA9PlxuICBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmUsXG4gIHNpbmtzOiBTaW5rcyxcbiAgZm9ybWF0Q29udGV4dDogRm9ybWF0Q29udGV4dCxcbiAgc2FtcGxpbmc/OiBTYW1wbGluZ1J1bnRpbWVcbik6IHZvaWQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHN0YXR1cyA9IGVycm9yU3RhdHVzKGVycm9yKVxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSBzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8IDUwMCA/ICdXQVJOSU5HJyA6ICdFUlJPUidcblxuICAvLyBNaXJyb3JzIGVtaXQoKSdzIG93biBnYXRlIGNoZWNrLCBidXQgcGVyZm9ybWVkICpiZWZvcmUqIG5vcm1hbGl6aW5nIHRoZVxuICAvLyBlcnJvciBzbyBhIGZpbHRlcmVkLW91dC9kaXNhYmxlZCBsb2dnZXIgbmV2ZXIgcGF5cyBmb3IgdGhhdCB3b3JrLlxuICAvLyBlbWl0KCkgcmUtY2hlY2tzIHRoZSBzYW1lIGdhdGUsIHdoaWNoIGlzIGNoZWFwIGFuZCBrZWVwcyB0aGlzIGZ1bmN0aW9uIGFcbiAgLy8gdGhpbiwgcHJvdmFibHktY29ycmVjdCB3cmFwcGVyIGFyb3VuZCB0aGUgc2hhcmVkIHBpcGVsaW5lLlxuICBpZiAoc2lua3MuaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBlcnJvcjogc2FmZUVycm9yLCBtZXNzYWdlIH0gPSBub3JtYWxpemVMb2dnZWRFcnJvcihcbiAgICBlcnJvcixcbiAgICBjb25maWc/LmxvZ0Vycm9yUGF5bG9hZCA9PT0gdHJ1ZVxuICApXG5cbiAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGVycm9yOiBzYWZlRXJyb3IsIG1lc3NhZ2UsIHN0YXR1cyB9XG5cbiAgZW1pdCh7XG4gICAgY29udGV4dFN0b3JlLFxuICAgIGRhdGEsXG4gICAgZm9ybWF0Q29udGV4dCxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHJlcXVlc3QsXG4gICAgc2FtcGxpbmcsXG4gICAgc2lua3MsXG4gICAgc3RvcmVcbiAgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBERUZBVUxUX0hFQURFUiA9ICdYLVJlcXVlc3QtSWQnXG5jb25zdCBWQUxJRF9SRVFVRVNUX0lEID0gL15bQS1aYS16MC05Ll8tXXsxLDEyOH0kL1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICBnZW5lcmF0b3I6ICgpID0+IHN0cmluZ1xuICBoZWFkZXI6IHN0cmluZ1xufVxuXG4vKipcbiAqIE5vcm1hbGlzZXMgdGhlIGByZXF1ZXN0SWRgIG9wdGlvbiBpbnRvIGEgY29uY3JldGUgY29uZmlnIG9iamVjdC5cbiAqXG4gKiAtIGB1bmRlZmluZWRgIC8gYGZhbHNlYCDihpIgYG51bGxgIChkaXNhYmxlZClcbiAqIC0gYHRydWVgIOKGkiBkZWZhdWx0IGNvbmZpZ1xuICogLSBgUmVxdWVzdElkQ29uZmlnYCDihpIgbWVyZ2VkIHdpdGggZGVmYXVsdHM7IGBlbmFibGVkOiBmYWxzZWAgaW5zaWRlIHRoZSBvYmplY3QgZGlzYWJsZXMgdGhlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVSZXF1ZXN0SWRDb25maWcgPSAoXG4gIHJhdz86IGJvb2xlYW4gfCBSZXF1ZXN0SWRDb25maWdcbik6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIHwgbnVsbCA9PiB7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGlmIChyYXcgPT09IHRydWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGdlbmVyYXRvcjogKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIGhlYWRlcjogREVGQVVMVF9IRUFERVJcbiAgICB9XG4gIH1cblxuICAvLyBPYmplY3QgZm9ybSDigJQgYGVuYWJsZWRgIGRlZmF1bHRzIHRvIGB0cnVlYCB3aGVuIHRoZSBvYmplY3QgaXMgcHJvdmlkZWRcbiAgaWYgKHJhdy5lbmFibGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZ2VuZXJhdG9yOiByYXcuZ2VuZXJhdG9yID8/ICgoKSA9PiBjcnlwdG8ucmFuZG9tVVVJRCgpKSxcbiAgICBoZWFkZXI6IHJhdy5oZWFkZXI/LnRyaW0oKSB8fCBERUZBVUxUX0hFQURFUlxuICB9XG59XG5cbi8qKlxuICogUmVhZHMgYW4gZXhpc3RpbmcgcmVxdWVzdCBJRCBmcm9tIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhlYWRlciwgb3IgZ2VuZXJhdGVzIGFcbiAqIG5ldyBvbmUgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgZ2VuZXJhdG9yLlxuICpcbiAqIEluYm91bmQgdmFsdWVzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCBgVkFMSURfUkVRVUVTVF9JRGAgKGFscGhhbnVtZXJpYyBwbHVzXG4gKiBgLmAsIGBfYCwgYC1gLCAxLTEyOCBjaGFycykgYmVmb3JlIGJlaW5nIHRydXN0ZWQg4oCUIHJlcXVlc3QgSURzIGZsb3cgaW50byBsb2dcbiAqIGxpbmVzLCByZXNwb25zZSBoZWFkZXJzLCBhbmQgY29udGV4dCB0cmVlcywgc28gbWFsZm9ybWVkIG9yIG92ZXJzaXplZFxuICogdmFsdWVzIGFyZSByZXBsYWNlZCB3aXRoIGEgZnJlc2hseSBnZW5lcmF0ZWQgb25lIHJhdGhlciB0aGFuIGVjaG9lZCBiYWNrLlxuICovXG5leHBvcnQgY29uc3QgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGNvbmZpZzogUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWdcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGV4aXN0aW5nID0gcmVxdWVzdC5oZWFkZXJzLmdldChjb25maWcuaGVhZGVyKVxuICBpZiAoZXhpc3RpbmcgJiYgVkFMSURfUkVRVUVTVF9JRC50ZXN0KGV4aXN0aW5nKSkge1xuICAgIHJldHVybiBleGlzdGluZ1xuICB9XG4gIHJldHVybiBjb25maWcuZ2VuZXJhdG9yKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBTaW5rRXJyb3JDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGZsdXNoQWxsRmlsZVNpbmtzIH0gZnJvbSAnLi9maWxlLXNpbmsnXG5pbXBvcnQgeyBmbHVzaFRyYW5zcG9ydHMgfSBmcm9tICcuL2luZGV4J1xuXG4vKipcbiAqIFJlc29sdmVzIGB0cnVlYCB3aGVuIGBtc2AgZWxhcHNlZCBiZWZvcmUgYHdvcmtgIHNldHRsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQSBub24tcG9zaXRpdmUgYG1zYCBtZWFucyBcInN0YXJ0IHRoZSB3b3JrIGJ1dCBkbyBub3Qgd2FpdFwiLlxuICovXG5leHBvcnQgY29uc3QgcmFjZVdpdGhUaW1lb3V0ID0gKFxuICB3b3JrOiBQcm9taXNlPHVua25vd24+LFxuICBtczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgLy8gQSBmYWlsZWQgZmx1c2ggaXMgcmVwb3J0ZWQgYnkgdGhlIHNpbmtzIHRoZW1zZWx2ZXM7IGhlcmUgaXQgb25seSBjb3VudHNcbiAgLy8gYXMgXCJzZXR0bGVkXCIsIHNvIHN3YWxsb3cgdGhlIHJlamVjdGlvbiBlaXRoZXIgd2F5LlxuICBjb25zdCBzZXR0bGVkID0gd29yay50aGVuKFxuICAgICgpID0+IGZhbHNlLFxuICAgICgpID0+IGZhbHNlXG4gIClcblxuICBpZiAobXMgPD0gMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh0cnVlKSwgbXMpXG4gICAgLy8gTmV2ZXIgaG9sZCB0aGUgZXZlbnQgbG9vcCBvcGVuIGp1c3QgdG8gb2JzZXJ2ZSBhIGZsdXNoIHRoYXQgaXMgcmFjaW5nXG4gICAgLy8gYW4gZXhpdGluZyBwcm9jZXNzLlxuICAgIHRpbWVyLnVucmVmPy4oKVxuICAgIHNldHRsZWQudGhlbih0aW1lZE91dCA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICByZXNvbHZlKHRpbWVkT3V0KVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogUmVwb3J0cyBhIHNodXRkb3duIGZsdXNoIHRoYXQgcmFuIG91dCBvZiB0aW1lIOKAlCB0aHJvdWdoIGBvbkVycm9yYCB3aGVuIHRoZVxuICogaG9vayBleGlzdHMsIG90aGVyd2lzZSBvbiBzdGRlcnIsIGJ1dCBuZXZlciBib3RoLlxuICovXG5leHBvcnQgY29uc3QgcmVwb3J0U2h1dGRvd25UaW1lb3V0ID0gKFxuICBvbkVycm9yOiAoKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuICB0aW1lb3V0TXM6IG51bWJlclxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFxuICAgIGBbbG9naXhseXNpYV0gc2h1dGRvd24gZmx1c2ggZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gJHt0aW1lb3V0TXN9bXM7IHNvbWUgdHJhbnNwb3J0IG9yIGZpbGUgd3JpdGVzIG1heSBub3QgaGF2ZSBiZWVuIGZsdXNoZWQuYFxuICApXG5cbiAgaWYgKG9uRXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgb25FcnJvcih7IGVycm9yLCBzaW5rOiAnc2h1dGRvd24nIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IGVycm9ycyB0aHJvd24gYnkgdGhlIGhvb2sgaXRzZWxmLlxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSlcbn1cblxuLyoqIERyYWlucyBldmVyeSB0cmFuc3BvcnQgYW5kIGV2ZXJ5IHJlZ2lzdGVyZWQgZmlsZSBzaW5rLiAqL1xuZXhwb3J0IGNvbnN0IGZsdXNoQWxsID0gYXN5bmMgKG9wdGlvbnM6IE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtmbHVzaFRyYW5zcG9ydHMob3B0aW9ucyksIGZsdXNoQWxsRmlsZVNpbmtzKCldKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldExpa2Uge1xuICByZWFkb25seSBkYXRhPzogeyBzdG9yZT86IHsgbG9nZ2VyPzogTG9nZ2VyIH0gfVxuICByZWFkb25seSBpZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdzSGFuZGxlckhvb2tzPFxuICBUTWVzc2FnZSA9IHVua25vd24sXG4gIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UgPSBXZWJTb2NrZXRMaWtlXG4+IHtcbiAgY2xvc2U/OiAod3M6IFRXcywgY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKSA9PiB2b2lkXG4gIG1lc3NhZ2U/OiAod3M6IFRXcywgbWVzc2FnZTogVE1lc3NhZ2UpID0+IHZvaWRcbiAgb3Blbj86ICh3czogVFdzKSA9PiB2b2lkXG59XG5cbi8vIFN5bnRoZXRpYyByZXF1ZXN0cyBhcmUgb25seSByZWFkIChtZXRob2QvdXJsKSBieSB0aGUgbG9nIHBpcGVsaW5lLCBuZXZlciBtdXRhdGVkLCBzbyBjYWNoaW5nXG4vLyBvbmUgcGVyIHBhdGggYXZvaWRzIGFsbG9jYXRpbmcgYSBmcmVzaCBSZXF1ZXN0IG9uIGV2ZXJ5IFdTIG9wZW4vbWVzc2FnZS9jbG9zZSBsb2cgZXZlbnQuXG5jb25zdCB3c1JlcXVlc3RDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZXF1ZXN0PigpXG5cbmNvbnN0IHdzU3ludGhldGljUmVxdWVzdCA9IChwYXRoOiBzdHJpbmcpOiBSZXF1ZXN0ID0+IHtcbiAgbGV0IHJlcXVlc3QgPSB3c1JlcXVlc3RDYWNoZS5nZXQocGF0aClcbiAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGBodHRwOi8vbG9naXhseXNpYS5sb2NhbCR7cGF0aH1gLCB7IG1ldGhvZDogJ1dTJyB9KVxuICAgIHdzUmVxdWVzdENhY2hlLnNldChwYXRoLCByZXF1ZXN0KVxuICB9XG4gIHJldHVybiByZXF1ZXN0XG59XG5cbmNvbnN0IHBheWxvYWRUeXBlT2YgPSAobWVzc2FnZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuICdiaW5hcnknXG4gIH1cbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnc3RyaW5nJ1xuICB9XG4gIHJldHVybiB0eXBlb2YgbWVzc2FnZVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgbG9nZ2VyOiBMb2dnZXIsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKSA9PiB7XG4gIGNvbnN0IHdzVGltaW5ncyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYmlnaW50PigpXG5cbiAgY29uc3QgbG9nV3MgPSAoXG4gICAgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicsXG4gICAgd3M6IFdlYlNvY2tldExpa2UsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBleHRyYT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleSA9IHdzIGFzIG9iamVjdFxuICAgIGNvbnN0IGJlZm9yZVRpbWUgPSB3c1RpbWluZ3MuZ2V0KGtleSkgPz8gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lIH1cbiAgICAvLyBSZWFkLW9ubHk6IGltbWVkaWF0ZWx5IHNwcmVhZCBiZWxvdyBpbnRvIGEgbmV3IG9iamVjdCwgbmV2ZXIgcmV0YWluZWQgb3IgbXV0YXRlZC5cbiAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5wZWVrQ29udGV4dChrZXkpXG4gICAgY29uc3QgY29udGV4dCA9XG4gICAgICBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMCB8fCBleHRyYVxuICAgICAgICA/IHsgLi4uYWNjdW11bGF0ZWQsIC4uLmV4dHJhLCB3c0lkOiB3cy5pZCB9XG4gICAgICAgIDogeyB3c0lkOiB3cy5pZCB9XG5cbiAgICBsb2dnZXIubG9nKFxuICAgICAgbGV2ZWwsXG4gICAgICB3c1N5bnRoZXRpY1JlcXVlc3QocGF0aCksXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UsIHN0YXR1czogMjAwIH0sXG4gICAgICBzdG9yZVxuICAgIClcbiAgfVxuXG4gIHJldHVybiA8XG4gICAgVE1lc3NhZ2UsXG4gICAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSxcbiAgICBjb25zdCBUSG9va3MgZXh0ZW5kcyBXc0hhbmRsZXJIb29rczxUTWVzc2FnZSwgVFdzPlxuICA+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBob29rczogVEhvb2tzXG4gICk6IFRIb29rcyA9PlxuICAgICh7XG4gICAgICAuLi5ob29rcyxcbiAgICAgIGNsb3NlKHdzLCBjb2RlLCByZWFzb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBob29rcy5jbG9zZT8uKHdzLCBjb2RlLCByZWFzb24pXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXh0cmE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICAgICAgICAgIGlmIChjb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZXh0cmEuY29kZSA9IGNvZGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWFzb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleHRyYS5yZWFzb24gPSByZWFzb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ1dzKFxuICAgICAgICAgICAgICAnSU5GTycsXG4gICAgICAgICAgICAgIHdzLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAnV2ViU29ja2V0IGNsb3NlZCcsXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGV4dHJhKS5sZW5ndGggPiAwID8gZXh0cmEgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dCh3cyBhcyBvYmplY3QpXG4gICAgICAgICAgd3NUaW1pbmdzLmRlbGV0ZSh3cyBhcyBvYmplY3QpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtZXNzYWdlKHdzLCBtZXNzYWdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaG9va3MubWVzc2FnZT8uKHdzLCBtZXNzYWdlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgbWVzc2FnZScsIHtcbiAgICAgICAgICAgICAgcGF5bG9hZFR5cGU6IHBheWxvYWRUeXBlT2YobWVzc2FnZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb3Blbih3cykge1xuICAgICAgICB3c1RpbWluZ3Muc2V0KHdzIGFzIG9iamVjdCwgcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaG9va3Mub3Blbj8uKHdzKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgb3BlbmVkJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSBhcyBUSG9va3Ncbn1cbiIsCiAgICAiLyoqIFRoZSBjbGllbnQtc2FmZSB2aWV3IG9mIGFuIHtAbGluayBIdHRwRXJyb3J9IOKAlCBldmVyeXRoaW5nIGJ1dCBgaW50ZXJuYWxgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwRXJyb3JQYXlsb2FkIHtcbiAgY29kZT86IHN0cmluZ1xuICBmaXg/OiBzdHJpbmdcbiAgbGluaz86IHN0cmluZ1xuICBtZXNzYWdlOiBzdHJpbmdcbiAgc3RhdHVzOiBudW1iZXJcbiAgd2h5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9ySW5pdCB7XG4gIC8qKlxuICAgKiBTdGFibGUsIG1hY2hpbmUtcmVhZGFibGUgaWRlbnRpZmllciB0aGUgY2xpZW50IGNhbiBicmFuY2ggb24sIGUuZy5cbiAgICogYFBBWU1FTlRfREVDTElORURgLiBVbmxpa2UgYG1lc3NhZ2VgLCBpdCBpcyBzYWZlIHRvIGRlcGVuZCBvbjogcmV3b3JkaW5nXG4gICAqIHRoZSBtZXNzYWdlIGRvZXMgbm90IGJyZWFrIGEgY2FsbGVyLlxuICAgKi9cbiAgY29kZT86IHN0cmluZ1xuICAvKiogV2hhdCB0aGUgY2FsbGVyIHNob3VsZCBkbyBhYm91dCBpdCwgaW4gcGxhaW4gbGFuZ3VhZ2UuICovXG4gIGZpeD86IHN0cmluZ1xuICAvKipcbiAgICogRGlhZ25vc3RpY3MgZm9yIHlvdSwgbm90IGZvciB0aGUgY2FsbGVyOiBhIHF1ZXJ5LCBhbiB1cHN0cmVhbSBib2R5LCBhbiBpZC5cbiAgICogTG9nZ2VkIGluIGZ1bGwsIG5ldmVyIHNlcmlhbGl6ZWQgaW50byB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBpbnRlcm5hbD86IHVua25vd25cbiAgLyoqIERvY3VtZW50YXRpb24gVVJMIGZvciB0aGlzIGZhaWx1cmUuICovXG4gIGxpbms/OiBzdHJpbmdcbiAgLyoqIFdoeSB0aGUgcmVxdWVzdCBmYWlsZWQsIGluIHBsYWluIGxhbmd1YWdlLiAqL1xuICB3aHk/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBBbiBIVFRQIGVycm9yIGNhcnJ5aW5nIHRoZSBjb250ZXh0IHRoYXQgbWFrZXMgYSBmYWlsdXJlIGFjdGlvbmFibGUuXG4gKlxuICogYGNvZGVgLCBgd2h5YCwgYGZpeGAsIGFuZCBgbGlua2AgYXBwZWFyIGluIGJvdGggdGhlIGxvZyBhbmQgdGhlIHJlc3BvbnNlLlxuICogYGludGVybmFsYCBhcHBlYXJzIG9ubHkgaW4gdGhlIGxvZyDigJQgaXQgaXMgbm9uLWVudW1lcmFibGUgYW5kIGV4Y2x1ZGVkIGZyb21cbiAqIGB0b0pTT04oKWAsIHNvIG5vIHNlcmlhbGl6ZXIgY2FuIGxlYWsgaXQgaW50byBhIHJlc3BvbnNlIGJvZHkuXG4gKlxuICogYGBgdHNcbiAqIHRocm93IG5ldyBIdHRwRXJyb3IoNDAyLCAnQ2FyZCBkZWNsaW5lZCcsIHtcbiAqICAgY29kZTogJ1BBWU1FTlRfREVDTElORUQnLFxuICogICB3aHk6ICdUaGUgaXNzdWluZyBiYW5rIHJlamVjdGVkIHRoZSBjaGFyZ2UuJyxcbiAqICAgZml4OiAnVHJ5IGEgZGlmZmVyZW50IGNhcmQsIG9yIGNvbnRhY3QgeW91ciBiYW5rLicsXG4gKiAgIGxpbms6ICdodHRwczovL2RvY3MuZXhhbXBsZS5jb20vZXJyb3JzL3BheW1lbnQtZGVjbGluZWQnLFxuICogICBpbnRlcm5hbDogeyBnYXRld2F5Q29kZTogJ2RvX25vdF9ob25vcicsIGNoYXJnZUlkIH1cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBBIGJhcmUgYG5ldyBIdHRwRXJyb3IoNDA0LCAnTm90IGZvdW5kJylgIGJlaGF2ZXMgZXhhY3RseSBhcyBiZWZvcmU6IHRoZVxuICogcmVzcG9uc2UgYm9keSBpcyB0aGUgcGxhaW4gbWVzc2FnZS4gT25seSBhbiBlcnJvciB0aGF0IGNhcnJpZXMgYXQgbGVhc3Qgb25lXG4gKiBjbGllbnQtZmFjaW5nIGZpZWxkIHJlc3BvbmRzIGFzIEpTT04uXG4gKi9cbi8qKlxuICogU3RhdHVzZXMgdGhlIEZldGNoIHNwZWMgZm9yYmlkcyBhIGJvZHkgb24g4oCUIGBSZXNwb25zZS5qc29uYCB0aHJvd3MgZm9yXG4gKiB0aGVzZSwgYXMgaXQgZG9lcyBmb3IgYW55dGhpbmcgb3V0c2lkZSAyMDAtNTk5LlxuICovXG5jb25zdCBOVUxMX0JPRFlfU1RBVFVTRVMgPSBuZXcgU2V0KFsxMDEsIDEwMywgMjA0LCAyMDUsIDMwNF0pXG5jb25zdCBNSU5fUkVTUE9OU0VfU1RBVFVTID0gMjAwXG5jb25zdCBNQVhfUkVTUE9OU0VfU1RBVFVTID0gNTk5XG5jb25zdCBGQUxMQkFDS19SRVNQT05TRV9TVEFUVVMgPSA1MDBcblxuLyoqIEZhbGxzIGJhY2sgdG8gNTAwIGZvciBhIHN0YXR1cyBgUmVzcG9uc2UuanNvbmAgd291bGQgcmVqZWN0LiAqL1xuY29uc3QgcmVzcG9uc2VTdGF0dXMgPSAoc3RhdHVzOiBudW1iZXIpOiBudW1iZXIgPT5cbiAgc3RhdHVzID49IE1JTl9SRVNQT05TRV9TVEFUVVMgJiZcbiAgc3RhdHVzIDw9IE1BWF9SRVNQT05TRV9TVEFUVVMgJiZcbiAgIU5VTExfQk9EWV9TVEFUVVNFUy5oYXMoc3RhdHVzKVxuICAgID8gc3RhdHVzXG4gICAgOiBGQUxMQkFDS19SRVNQT05TRV9TVEFUVVNcblxuZXhwb3J0IGNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZT86IHN0cmluZ1xuICByZWFkb25seSBmaXg/OiBzdHJpbmdcbiAgLyoqIExvZy1vbmx5IGRpYWdub3N0aWNzOyBzZWUgdGhlIGNsYXNzIGRvYy4gKi9cbiAgZGVjbGFyZSByZWFkb25seSBpbnRlcm5hbD86IHVua25vd25cbiAgcmVhZG9ubHkgbGluaz86IHN0cmluZ1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlclxuICAvKipcbiAgICogUHJlc2VudCBvbmx5IHdoZW4gdGhlIGVycm9yIGNhcnJpZXMgYSBjbGllbnQtZmFjaW5nIGZpZWxkLCBzbyBhIHBsYWluXG4gICAqIGBuZXcgSHR0cEVycm9yKDQwNCwgJ05vdCBmb3VuZCcpYCBzdGlsbCByZW5kZXJzIGFzIHRoZSBiYXJlIG1lc3NhZ2UuXG4gICAqIEVseXNpYSBjYWxscyBpdCB0byBidWlsZCB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBkZWNsYXJlIHJlYWRvbmx5IHRvUmVzcG9uc2U/OiAoKSA9PiBSZXNwb25zZVxuICByZWFkb25seSB3aHk/OiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihzdGF0dXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCBpbml0OiBIdHRwRXJyb3JJbml0ID0ge30pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgdGhpcy5jb2RlID0gaW5pdC5jb2RlXG4gICAgdGhpcy5maXggPSBpbml0LmZpeFxuICAgIHRoaXMubGluayA9IGluaXQubGlua1xuICAgIHRoaXMud2h5ID0gaW5pdC53aHlcblxuICAgIC8vIFNldCBleHBsaWNpdGx5IOKAlCBhIG5hdGl2ZSBzdWJjbGFzcyBvdGhlcndpc2UgcmVwb3J0cyB0aGUgZ2VuZXJpY1xuICAgIC8vIFwiRXJyb3JcIiwgYW5kIHRoZSBjb25zdHJ1Y3Rvci1uYW1lIGZhbGxiYWNrIGJyZWFrcyB1bmRlciBtaW5pZmljYXRpb24uXG4gICAgLy8gTm9uLWVudW1lcmFibGUgdG8gbWF0Y2ggYEVycm9yLnByb3RvdHlwZS5uYW1lYC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hbWUnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiAnSHR0cEVycm9yJyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIE5vbi1lbnVtZXJhYmxlIHNvIGBKU09OLnN0cmluZ2lmeWAsIHNwcmVhZHMsIGFuZCBmcmFtZXdvcmsgc2VyaWFsaXplcnNcbiAgICAvLyB0aGF0IHdhbGsgb3duIGtleXMgY2Fubm90IHBpY2sgaXQgdXAuIFByb3BlcnR5IGFjY2VzcyBzdGlsbCB3b3Jrcywgd2hpY2hcbiAgICAvLyBpcyBhbGwgdGhlIGxvZyBwaXBlbGluZSBuZWVkcy5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ludGVybmFsJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogaW5pdC5pbnRlcm5hbCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pXG5cbiAgICAvLyBFbHlzaWEgcmVuZGVycyBhIHRocm93biBlcnJvciB3aXRoIGB0b1Jlc3BvbnNlKClgIHdoZW4gaXQgaGFzIG9uZSwgYW5kXG4gICAgLy8gZmFsbHMgYmFjayB0byB0aGUgcGxhaW4gbWVzc2FnZSBvdGhlcndpc2UuIERlZmluaW5nIGl0IG9ubHkgd2hlbiB0aGVyZVxuICAgIC8vIGlzIHNvbWV0aGluZyBzdHJ1Y3R1cmVkIHRvIHNheSBrZWVwcyBwbGFpbiBlcnJvcnMgYnl0ZS1pZGVudGljYWwgdG9cbiAgICAvLyB0aGVpciBwcmUtYEh0dHBFcnJvckluaXRgIGJlaGF2aW91ci5cbiAgICBjb25zdCBoYXNDbGllbnRGaWVsZHMgPVxuICAgICAgaW5pdC5jb2RlICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXQud2h5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXQuZml4ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXQubGluayAhPT0gdW5kZWZpbmVkXG5cbiAgICBpZiAoaGFzQ2xpZW50RmllbGRzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RvUmVzcG9uc2UnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAoKTogUmVzcG9uc2UgPT5cbiAgICAgICAgICBSZXNwb25zZS5qc29uKHRoaXMudG9KU09OKCksIHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2VTdGF0dXModGhpcy5zdGF0dXMpXG4gICAgICAgICAgfSksXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2xpZW50LXNhZmUgcGF5bG9hZC4gYGludGVybmFsYCBpcyBuZXZlciBwYXJ0IG9mIGl0OyB1bnNldCBmaWVsZHMgYXJlXG4gICAqIGB1bmRlZmluZWRgIGFuZCBzbyBhcmUgZHJvcHBlZCBieSBgSlNPTi5zdHJpbmdpZnlgLlxuICAgKi9cbiAgdG9KU09OKCk6IEh0dHBFcnJvclBheWxvYWQge1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBmaXg6IHRoaXMuZml4LFxuICAgICAgbGluazogdGhpcy5saW5rLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHdoeTogdGhpcy53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LElBQUksRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsSUFBTSxFQUFjLEVBQWEsV0FBVyxDQUFPLEVBQzdDLEVBQWdDLENBQUUsUUFBTyxFQUMvQyxHQUFJLE9BQU8sS0FBSyxDQUFXLEVBQUUsT0FBUyxFQUNwQyxFQUFLLFFBQVUsSUFBSyxDQUFZLEVBR2xDLEVBQU8sSUFBSSxFQUFPLEVBQVMsRUFBTSxDQUFLLFNBS3RDLENBQ0EsRUFBaUIsR0FFcEIsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLFNBQVUsQ0FDcEMsR0FBSSxDQUNGLEVBQU8sZ0JBQ0wsRUFDQSxFQUNBLEVBQVcsRUFBUyxFQUFJLFFBQVMsQ0FBSyxDQUN4QyxTQUNBLENBQ0EsRUFBa0IsT0FBTyxDQUFPLEVBQ2hDLEVBQWEsYUFBYSxDQUFPLEVBQ2pDLEVBQWlCLEdBRXBCLEVBQ0EsR0FBRyxRQUFRLEVBRWQsT0FBTyxPQUFPLE9BQU8sRUFBUSxDQUFFLFFBQU8sQ0FBQyxHQVE1QixHQUFrQixNQUM3QixHQUNFLFFBQVEsSUFBK0IsQ0FBQyxJQUN4QixDQUVsQixHQURBLE1BQU0sR0FBUyxDQUFPLEVBQ2xCLEVBQ0YsTUFBTSxRQUFRLFdBQVcsQ0FBQyxHQUFnQixDQUFPLEVBQUcsR0FBa0IsQ0FBQyxDQUFDLEdBNkM3RCxNQUNGLEdBQTRDIiwKICAiZGVidWdJZCI6ICIyNDdCNENFMDU2ODE5Q0M4NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
7
|
+
//# debugId=3FC159E5478EBE2C64756E2164756E21
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvdXRpbHMvcmVwb3J0LnRzIiwgInNyYy9jb250ZXh0L2VucmljaC50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL3NhbXBsaW5nL2dsb2IudHMiLCAic3JjL3NhbXBsaW5nL2luZGV4LnRzIiwgInNyYy91dGlscy9kdXJhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvdXRpbHMvZXJyb3IudHMiLCAic3JjL291dHB1dC9pbmRleC50cyIsICJzcmMvb3V0cHV0L2ZpbGUtc2luay50cyIsICJzcmMvb3V0cHV0L2ZzLnRzIiwgInNyYy9vdXRwdXQvcm90YXRpb24tbWFuYWdlci50cyIsICJzcmMvb3V0cHV0L2tleWVkLW11dGV4LnRzIiwgInNyYy9vdXRwdXQvZmlsZS50cyIsICJzcmMvbG9nZ2VyL2VtaXQudHMiLCAic3JjL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmMvbWlkZGxld2FyZS9yZXF1ZXN0LWlkLnRzIiwgInNyYy9vdXRwdXQvc2h1dGRvd24udHMiLCAic3JjL3dlYnNvY2tldC93cmFwLXdzLnRzIiwgInNyYy9lcnJvcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQge1xuICBhcHBseVJlcXVlc3RFbnJpY2hlcnMsXG4gIGFwcGx5UmVzcG9uc2VFbnJpY2hlcnMsXG4gIHJlc29sdmVFbnJpY2hlcnNcbn0gZnJvbSAnLi9jb250ZXh0L2VucmljaCdcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHsgbG9nZ2VyU3RvcmFnZSwgbm9vcFJlcXVlc3RMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpZWxkcyxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlcixcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgcmVzb2x2ZVNpbmtzLCBzaG91bGRMb2cgfSBmcm9tICcuL2xvZ2dlci9lbWl0J1xuaW1wb3J0IHsgZXJyb3JTdGF0dXMgfSBmcm9tICcuL2xvZ2dlci9oYW5kbGUtaHR0cC1lcnJvcidcbmltcG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuaW1wb3J0IHsgY2xvc2VUcmFuc3BvcnRzIH0gZnJvbSAnLi9vdXRwdXQnXG5pbXBvcnQgeyBjbG9zZUFsbEZpbGVTaW5rcyB9IGZyb20gJy4vb3V0cHV0L2ZpbGUtc2luaydcbmltcG9ydCB7XG4gIGZsdXNoQWxsLFxuICByYWNlV2l0aFRpbWVvdXQsXG4gIHJlcG9ydFNodXRkb3duVGltZW91dFxufSBmcm9tICcuL291dHB1dC9zaHV0ZG93bidcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcblxuLyoqXG4gKiBFbXB0eSBzaW5nbGV0b24gc2xvdHMgbXVzdCBub3QgdXNlIGBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5gOiBpbnRlcnNlY3RpbmcgdGhhdCB3aXRoIEVseXNpYSdzIGBDb250ZXh0YFxuICogbWFrZXMgZXZlcnkga2V5IChpbmNsdWRpbmcgYHN0b3JlYCkgYmVjb21lIGBuZXZlcmAgYmVjYXVzZSBlYWNoIGtleSBpcyBtZXJnZWQgd2l0aCBgbmV2ZXJgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5RWx5c2lhU2xvdCB7XG4gIHJlYWRvbmx5IF9fbG9naXhseXNpYUVtcHR5PzogbmV2ZXJcbn1cblxuY29uc3QgREVGQVVMVF9TVEFUVVMgPSAyMDBcblxuLyoqXG4gKiBUaGUgc3RhdHVzIHRoZSBjbGllbnQgYWN0dWFsbHkgc2Vlcy4gRWx5c2lhIGxlYXZlcyBgc2V0LnN0YXR1c2AgYXQgMjAwXG4gKiB1bmxlc3MgYSBoYW5kbGVyIGFzc2lnbmVkIG9uZSwgYW5kIG9uIHRoZSB3aXJlIGEgcmV0dXJuZWQgYFJlc3BvbnNlYCBiZWF0c1xuICogdGhhdCB1bnRvdWNoZWQgZGVmYXVsdCDigJQgc28gYSBzdHJlYW1pbmcsIHJlZGlyZWN0aW5nIG9yIHByb3h5aW5nIGhhbmRsZXInc1xuICogb3duIHN0YXR1cyBpcyB0aGUgb25lIHdvcnRoIGxvZ2dpbmcuXG4gKi9cbmNvbnN0IHJlc29sdmVIYW5kbGVkU3RhdHVzID0gKFxuICBzZXRTdGF0dXM6IHVua25vd24sXG4gIHJlc3BvbnNlOiB1bmtub3duXG4pOiBudW1iZXIgPT4ge1xuICBpZiAoc2V0U3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc2V0U3RhdHVzICE9PSBudWxsKSB7XG4gICAgY29uc3QgYXNzaWduZWQgPSBnZXRTdGF0dXNDb2RlKHNldFN0YXR1cylcbiAgICBpZiAoYXNzaWduZWQgIT09IERFRkFVTFRfU1RBVFVTKSB7XG4gICAgICByZXR1cm4gYXNzaWduZWRcbiAgICB9XG4gIH1cblxuICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXNcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUQVRVU1xufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uPFRGaWVsZHMgZXh0ZW5kcyBvYmplY3QgPSBMb2dGaWVsZHM+IHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiB7XG4gICAgbG9nOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+XG4gIH1cbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIHNsb3RzIGFyZSBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gOyBvdXJzIGFyZSBpbnRlbnRpb25hbGx5IGNsb3NlZCAoc2VlICMyMjApLlxuZXhwb3J0IHR5cGUgTG9naXhseXNpYTxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPiA9IEVseXNpYTxcbiAgJycsXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzbG90cyBhcmUgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG4gIExvZ2l4bHlzaWFTaW5nbGV0b248VEZpZWxkcz5cbj5cblxuZXhwb3J0IHR5cGUgTG9naXhseXNpYVBsdWdpbjxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPiA9XG4gIExvZ2l4bHlzaWE8VEZpZWxkcz4gJiB7XG4gICAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxuICB9XG5cbmNvbnN0IERFRkFVTFRfRkxVU0hfVElNRU9VVF9NUyA9IDUwMDBcblxuLyoqXG4gKiBAdHlwZVBhcmFtIFRGaWVsZHMgLSBGaWVsZCBiYWcgZm9yIHRoZSByZXF1ZXN0LXNjb3BlZCBgbG9nYC4gU3VwcGx5IHlvdXIgb3duXG4gKiBpbnRlcmZhY2UgdG8gaGF2ZSBUeXBlU2NyaXB0IHJlamVjdCBtaXNzcGVsbGVkIGNvbnRleHQga2V5czsgdGhlIGRlZmF1bHRcbiAqIGFsbG93cyBhbnkga2V5LCBzbyB1bnR5cGVkIHVzYWdlIGlzIHVuY2hhbmdlZC5cbiAqL1xuY29uc3QgY3JlYXRlTG9naXhseXNpYVBsdWdpbiA9IDxURmllbGRzIGV4dGVuZHMgb2JqZWN0ID0gTG9nRmllbGRzPihcbiAgcmF3T3B0aW9uczogT3B0aW9ucyA9IHt9XG4pOiBMb2dpeGx5c2lhUGx1Z2luPFRGaWVsZHM+ID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKHJhd09wdGlvbnMpXG4gIGNvbnN0IGRpZEN1c3RvbUxvZyA9IG5ldyBXZWFrU2V0PFJlcXVlc3Q+KClcbiAgY29uc3QgY2xvc2VkID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCByZXF1ZXN0U3RhcnRUaW1lcyA9IG5ldyBXZWFrTWFwPFJlcXVlc3QsIGJpZ2ludD4oKVxuICBjb25zdCBjb250ZXh0U3RvcmUgPSBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlKClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZVBsdWdpbkxvZ2dlcihvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHdyYXBXcyA9IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIob3B0aW9ucywgYmFzZUxvZ2dlciwgY29udGV4dFN0b3JlKVxuICBjb25zdCByZXF1ZXN0SWRDb25maWcgPSByZXNvbHZlUmVxdWVzdElkQ29uZmlnKG9wdGlvbnMuY29uZmlnPy5yZXF1ZXN0SWQpXG4gIGNvbnN0IGVucmljaGVycyA9IHJlc29sdmVFbnJpY2hlcnMob3B0aW9ucy5jb25maWc/LmVucmljaGVycylcbiAgY29uc3Qgb25TaW5rRXJyb3IgPSBvcHRpb25zLmNvbmZpZz8ub25FcnJvclxuICBjb25zdCBsb2dGaWx0ZXIgPSBvcHRpb25zLmNvbmZpZz8ubG9nRmlsdGVyXG4gIGNvbnN0IHNpbmtzID0gcmVzb2x2ZVNpbmtzKG9wdGlvbnMuY29uZmlnKVxuXG4gIC8qKlxuICAgKiBBIGN1c3RvbSBsb2cgaW5zaWRlIGEgcmVxdWVzdC4gSXQgYXBwbGllcyB0aGUgc2FtZSBnYXRlIHRoZSBsb2dnZXIncyBvd25cbiAgICogYGRlYnVnYC9gaW5mb2AvLi4uIGFwcGx5LCBmb3IgdHdvIHJlYXNvbnM6IGEgcmVjb3JkIHRoZSBsZXZlbCBmaWx0ZXIgZHJvcHNcbiAgICogbXVzdCBub3QgY2xhaW0gdGhlIHJlcXVlc3QgYW5kIHN1cHByZXNzIGl0cyBhY2Nlc3MgbGluZSwgYW5kIHRoZSByZWNvcmRcbiAgICogdGhhdCBkb2VzIGdvIG91dCBoYXMgdG8gYmUgdGltZWQgZnJvbSB0aGUgcmVxdWVzdCdzIHN0YXJ0IHJhdGhlciB0aGFuIGZyb21cbiAgICogdGhlIG1vbWVudCB0aGUgaGFuZGxlciBjYWxsZWQgaXQuXG4gICAqL1xuICBjb25zdCBlbWl0Q3VzdG9tTG9nID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHNpbmtzLmlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBsb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgYmFzZUxvZ2dlci5sb2coXG4gICAgICBsZXZlbCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UgfSxcbiAgICAgIHsgYmVmb3JlVGltZTogcmVxdWVzdFN0YXJ0VGltZXMuZ2V0KHJlcXVlc3QpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICApXG4gIH1cblxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZW1pdEN1c3RvbUxvZygnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGVtaXRDdXN0b21Mb2coJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGVtaXRDdXN0b21Mb2coJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZW1pdEN1c3RvbUxvZygnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlciA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT4gKHtcbiAgICBkZWJ1ZzogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGVycm9yOiAobWVzc2FnZSwgY29udGV4dCkgPT5cbiAgICAgIGVtaXRDdXN0b21Mb2coJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgaW5mbzogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgbWVyZ2VDb250ZXh0OiBwYXJ0aWFsID0+IGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgcGFydGlhbCksXG4gICAgd2FybjogKG1lc3NhZ2UsIGNvbnRleHQpID0+XG4gICAgICBlbWl0Q3VzdG9tTG9nKCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgfSlcblxuICAvKipcbiAgICogVGhlIHJlc3BvbnNlIGhlYWRlcnMgYW4gZW5yaWNoZXIgZ2V0cyB0byByZWFkLiBgc2V0LmhlYWRlcnNgIGFsb25lIG1pc3Nlc1xuICAgKiBhbnl0aGluZyBhIGhhbmRsZXIgcHV0IG9uIGEgcmV0dXJuZWQgYFJlc3BvbnNlYCAoYSBgY29udGVudC1sZW5ndGhgLCBzYXkpLFxuICAgKiBzbyB0aGUgdHdvIGFyZSBtZXJnZWQg4oCUIHdpdGggYHNldC5oZWFkZXJzYCB3aW5uaW5nLCBzaW5jZSBFbHlzaWEgYXBwbGllc1xuICAgKiBpdCBsYXN0LiBPbmx5IGJ1aWx0IHdoZW4gYW4gZW5yaWNoZXIgd2lsbCBhY3R1YWxseSByZWFkIGl0LlxuICAgKi9cbiAgY29uc3QgcmVhZGFibGVSZXNwb25zZUhlYWRlcnMgPSAoXG4gICAgc2V0SGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgICByZXNwb25zZUhlYWRlcnM/OiBIZWFkZXJzXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICByZXNwb25zZUhlYWRlcnM/LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIG1lcmdlZFtrZXldID0gdmFsdWVcbiAgICB9KVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG1lcmdlZCwgc2V0SGVhZGVycylcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVyeXRoaW5nIGJvdGggZXhpdHMgc2hhcmUgb25jZSB0aGUgc3RhdHVzIGlzIGtub3duOiBlY2hvIHRoZSByZXF1ZXN0IGlkLFxuICAgKiBydW4gdGhlIHJlc3BvbnNlLXBoYXNlIGVucmljaGVycywgYW5kIHJlc29sdmUgdGFpbCBzYW1wbGluZyDigJQgYWxsIGJlZm9yZVxuICAgKiB0aGUgcmVxdWVzdCdzIGZpbmFsIGxvZyBsaW5lLCBzbyBpdCBhbmQgYW55IHJlcGxheWVkIHJlY29yZHMgc2VlIHRoZSBzYW1lXG4gICAqIGNvbnRleHQuIFJldHVybnMgdGhlIHRpbWluZyBzdG9yZSBmb3IgdGhhdCBmaW5hbCBsaW5lLlxuICAgKlxuICAgKiBgc2V0SGVhZGVyc2AgaXMgdGhlIGxpdmUgYHNldC5oZWFkZXJzYCBhbmQgaXMgd3JpdHRlbiB0bzsgdGhlIG1lcmdlZCB2aWV3XG4gICAqIGhhbmRlZCB0byBlbnJpY2hlcnMgaXMgcmVhZC1vbmx5LCBzbyBpdCBtdXN0IG5vdCBzdGFuZCBpbiBmb3IgaXQuXG4gICAqL1xuICBjb25zdCBjbG9zZVJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBzZXRIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+LFxuICAgIHN0YXR1czogbnVtYmVyLFxuICAgIHJlc3BvbnNlSGVhZGVycz86IEhlYWRlcnNcbiAgKTogU3RvcmVEYXRhID0+IHtcbiAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICBjb25zdCBpZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpLnJlcXVlc3RJZCBhc1xuICAgICAgICB8IHN0cmluZ1xuICAgICAgICB8IHVuZGVmaW5lZFxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHNldEhlYWRlcnNbcmVxdWVzdElkQ29uZmlnLmhlYWRlcl0gPSBpZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7XG4gICAgICBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gQmlnSW50KDApXG4gICAgfVxuXG4gICAgaWYgKGVucmljaGVycykge1xuICAgICAgYXBwbHlSZXNwb25zZUVucmljaGVycyhcbiAgICAgICAgZW5yaWNoZXJzLFxuICAgICAgICBjb250ZXh0U3RvcmUsXG4gICAgICAgIHtcbiAgICAgICAgICBkdXJhdGlvbk1zOiBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSksXG4gICAgICAgICAgaGVhZGVyczogcmVhZGFibGVSZXNwb25zZUhlYWRlcnMoc2V0SGVhZGVycywgcmVzcG9uc2VIZWFkZXJzKSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHN0YXR1c1xuICAgICAgICB9LFxuICAgICAgICBvblNpbmtFcnJvclxuICAgICAgKVxuICAgIH1cblxuICAgIGxvZ2dlci5maW5hbGl6ZVJlcXVlc3QocmVxdWVzdCwgc3RvcmUsIHN0YXR1cylcbiAgICByZXR1cm4gc3RvcmVcbiAgfVxuXG4gIGNvbnN0IHVzZUFzeW5jTG9jYWxTdG9yYWdlID0gb3B0aW9ucy5jb25maWc/LnVzZUFzeW5jTG9jYWxTdG9yYWdlID09PSB0cnVlXG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBuby1vcCBsb2dnZXIgb25jZSBhIHJlcXVlc3QgaXMgb3Zlciwgc28gYSBwcm9taXNlIHRoYXRcbiAgICogb3V0bGl2ZXMgaXQgYW5kIGNhbGxzIGB1c2VMb2dnZXIoKWAgd3JpdGVzIG5vd2hlcmUgaW5zdGVhZCBvZiBpbnRvXG4gICAqIHdoaWNoZXZlciByZXF1ZXN0IGhhcHBlbmVkIHRvIHJ1biBsYXN0LlxuICAgKi9cbiAgY29uc3QgZXhpdFJlcXVlc3RTY29wZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodXNlQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGxvZ2dlclN0b3JhZ2UuZW50ZXJXaXRoKG5vb3BSZXF1ZXN0TG9nZ2VyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGltaW5nIHN0b3JlIGZvciB0aGUgZXJyb3IgbGluZS4gV2hlbiBhIGhvb2sgYWZ0ZXIgdGhlIGhhbmRsZXIgdGhyb3dzLFxuICAgKiBvbkVycm9yIHJ1bnMgZm9yIGEgcmVxdWVzdCBvbkFmdGVySGFuZGxlIGFscmVhZHkgY2xvc2VkOiBpdHMgc3VjY2VzcyBsaW5lXG4gICAqIGlzIG9uIHRoZSB3aXJlIGFuZCBjYW5ub3QgYmUgcmV0cmFjdGVkLCBidXQgdGhlIGVycm9yIGxpbmUgc3RpbGwgaGFzIHRvXG4gICAqIGNhcnJ5IHRoZSByZXF1ZXN0J3MgcmVhbCBkdXJhdGlvbiwgYW5kIGNsb3NpbmcgdHdpY2Ugd291bGQgcmVzb2x2ZSB0YWlsXG4gICAqIHNhbXBsaW5nIHR3aWNlIGZvciB0aGUgc2FtZSByZXF1ZXN0LlxuICAgKi9cbiAgY29uc3QgZXJyb3JTdG9yZSA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIHNldEhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4sXG4gICAgZXJyb3I6IHVua25vd25cbiAgKTogU3RvcmVEYXRhID0+IHtcbiAgICBpZiAoY2xvc2VkLmhhcyhyZXF1ZXN0KSkge1xuICAgICAgcmV0dXJuIHsgYmVmb3JlVGltZTogcmVxdWVzdFN0YXJ0VGltZXMuZ2V0KHJlcXVlc3QpID8/IEJpZ0ludCgwKSB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmUgPSBjbG9zZVJlcXVlc3QocmVxdWVzdCwgc2V0SGVhZGVycywgZXJyb3JTdGF0dXMoZXJyb3IpKVxuICAgIGNsb3NlZC5hZGQocmVxdWVzdClcbiAgICByZXR1cm4gc3RvcmVcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9LFxuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGRlcml2ZWQgbG9nIHR5cGluZyBtYXRjaGVzIExvZ2l4bHlzaWFTaW5nbGV0b24uXG4gIGNvbnN0IHBsdWdpbiA9IGFwcFxuICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxuICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAuZGVyaXZlKCh7IHJlcXVlc3QgfSkgPT4gKHsgbG9nOiBjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpIH0pKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBob3N0bmFtZSwgcG9ydCwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uU3RvcChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0TXMgPVxuICAgICAgICBvcHRpb25zLmNvbmZpZz8uZmx1c2hUaW1lb3V0TXMgPz8gREVGQVVMVF9GTFVTSF9USU1FT1VUX01TXG4gICAgICBjb25zdCB0aW1lZE91dCA9IGF3YWl0IHJhY2VXaXRoVGltZW91dChmbHVzaEFsbChvcHRpb25zKSwgdGltZW91dE1zKVxuICAgICAgLy8gQSB6ZXJvIHRpbWVvdXQgbWVhbnMgdGhlIGNhbGxlciBvcHRlZCBvdXQgb2Ygd2FpdGluZywgc28gdGhlIGZsdXNoXG4gICAgICAvLyBcInRpbWluZyBvdXRcIiBpcyBleHBlY3RlZCBhbmQgbm90IHdvcnRoIHJlcG9ydGluZy5cbiAgICAgIGlmICh0aW1lZE91dCAmJiB0aW1lb3V0TXMgPiAwKSB7XG4gICAgICAgIHJlcG9ydFNodXRkb3duVGltZW91dChvcHRpb25zLmNvbmZpZz8ub25FcnJvciwgdGltZW91dE1zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyByZXF1ZXN0LCBzdG9yZSB9KSA9PiB7XG4gICAgICBjb25zdCBiZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIHJlcXVlc3RTdGFydFRpbWVzLnNldChyZXF1ZXN0LCBiZWZvcmVUaW1lKVxuICAgICAgLy8gUHVibGlzaGVkIGZvciBoYW5kbGVycyB0aGF0IHJlYWQgYHN0b3JlLmJlZm9yZVRpbWVgLiBUaGUgcGx1Z2luJ3Mgb3duXG4gICAgICAvLyB0aW1pbmcgY29tZXMgZnJvbSB0aGUgcGVyLXJlcXVlc3QgbWFwIGFib3ZlLCBzaW5jZSBFbHlzaWEncyBzdG9yZSBpc1xuICAgICAgLy8gYXBwLWdsb2JhbCBhbmQgY29uY3VycmVudCByZXF1ZXN0cyBzaGFyZSB0aGlzIHNsb3QuXG4gICAgICBzdG9yZS5iZWZvcmVUaW1lID0gYmVmb3JlVGltZVxuICAgICAgbG9nZ2VyLmJlZ2luUmVxdWVzdChyZXF1ZXN0KVxuICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBnZXRPckNyZWF0ZVJlcXVlc3RJZChyZXF1ZXN0LCByZXF1ZXN0SWRDb25maWcpXG4gICAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgeyByZXF1ZXN0SWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVucmljaGVycykge1xuICAgICAgICBhcHBseVJlcXVlc3RFbnJpY2hlcnMoZW5yaWNoZXJzLCBjb250ZXh0U3RvcmUsIHJlcXVlc3QsIG9uU2lua0Vycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAodXNlQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgICAgbG9nZ2VyU3RvcmFnZS5lbnRlcldpdGgoY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlcihyZXF1ZXN0KSlcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgcmVzcG9uc2UgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGNsb3NlZC5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc29sdmVIYW5kbGVkU3RhdHVzKHNldC5zdGF0dXMsIHJlc3BvbnNlKVxuXG4gICAgICAgIC8vIFJ1bnMgYmVmb3JlIHRoZSBlYXJseSByZXR1cm46IGEgcmVxdWVzdCB0aGF0IG9ubHkgZW1pdHRlZCBjdXN0b21cbiAgICAgICAgLy8gbG9ncyBzdGlsbCBuZWVkcyBpdHMgYnVmZmVyZWQgcmVjb3JkcyByZXBsYXllZC5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSBjbG9zZVJlcXVlc3QoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBzZXQuaGVhZGVycyxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSA/IHJlc3BvbnNlLmhlYWRlcnMgOiB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgICBjbG9zZWQuYWRkKHJlcXVlc3QpXG5cbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyA9ICdJTkZPJ1xuICAgICAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgIGxldmVsID0gJ0VSUk9SJ1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdXQVJOSU5HJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgICAgICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc3RhdHVzIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGFjY3VtdWxhdGVkKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0ID0geyAuLi5hY2N1bXVsYXRlZCB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSlcbiAgICAgICAgLy8gTm90aGluZyBlbHNlIGlzIGNsZWFuZWQgdXAgaGVyZTogdGhlIHRpbWluZ3MgYW5kIHRoZSBjb250ZXh0IGJhZ1xuICAgICAgICAvLyBsaXZlIGluIFdlYWtNYXBzIGtleWVkIGJ5IHRoZSByZXF1ZXN0LCBhbmQgYSBob29rIHJ1bm5pbmcgYWZ0ZXIgdGhpc1xuICAgICAgICAvLyBvbmUgbWF5IHN0aWxsIHRocm93LCBpbiB3aGljaCBjYXNlIG9uRXJyb3IgbmVlZHMgYm90aCB0byBzdGF5XG4gICAgICAgIC8vIHRydXRoZnVsLlxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZXhpdFJlcXVlc3RTY29wZSgpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgc2V0IH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IoXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBlcnJvclN0b3JlKHJlcXVlc3QsIHNldC5oZWFkZXJzLCBlcnJvcilcbiAgICAgICAgKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVxdWVzdFN0YXJ0VGltZXMuZGVsZXRlKHJlcXVlc3QpXG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQocmVxdWVzdClcbiAgICAgICAgZXhpdFJlcXVlc3RTY29wZSgpXG4gICAgICB9XG4gICAgfSlcbiAgICAuYXMoJ3Njb3BlZCcpIGFzIExvZ2l4bHlzaWE8VEZpZWxkcz5cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihwbHVnaW4sIHsgd3JhcFdzIH0pIGFzIExvZ2l4bHlzaWFQbHVnaW48VEZpZWxkcz5cbn1cblxuLyoqXG4gKiBEcmFpbnMgZXZlcnkgdHJhbnNwb3J0IGFuZCBmaWxlIHNpbms7IHdpdGggYGNsb3NlOiB0cnVlYCBhbHNvIHJlbGVhc2VzXG4gKiB0aGVtLiBGb3IgcHJvY2Vzc2VzIHRoYXQgc3RvcCB3aXRob3V0IEVseXNpYSdzIGBvblN0b3BgICh3b3JrZXJzLFxuICogc2NyaXB0cywgY3VzdG9tIHNpZ25hbCBoYW5kbGVycykuIFNhZmUgdG8gY2FsbCBtb3JlIHRoYW4gb25jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZsdXNoTG9naXhseXNpYSA9IGFzeW5jIChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgeyBjbG9zZSA9IGZhbHNlIH06IHsgY2xvc2U/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IGZsdXNoQWxsKG9wdGlvbnMpXG4gIGlmIChjbG9zZSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbY2xvc2VUcmFuc3BvcnRzKG9wdGlvbnMpLCBjbG9zZUFsbEZpbGVTaW5rcygpXSlcbiAgfVxufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9wZXJmb3JtYW5jZS9ub0JhcnJlbEZpbGU6IHB1YmxpYyBwYWNrYWdlIGVudHJ5IHJlLWV4cG9ydHNcbmV4cG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuZXhwb3J0IHsgdXNlTG9nZ2VyIH0gZnJvbSAnLi9jb250ZXh0L3N0b3JhZ2UnXG5leHBvcnQgdHlwZSB7IEh0dHBFcnJvckluaXQsIEh0dHBFcnJvclBheWxvYWQgfSBmcm9tICcuL2Vycm9ycydcbmV4cG9ydCB7IEh0dHBFcnJvciB9IGZyb20gJy4vZXJyb3JzJ1xuZXhwb3J0IHR5cGUge1xuICBFbnJpY2hlcixcbiAgRW5yaWNoZXJGaWVsZHMsXG4gIEVucmljaGVyTGlrZSxcbiAgRW5yaWNoZXJSZXNwb25zZUlucHV0LFxuICBIZWFkU2FtcGxpbmdDb25maWcsXG4gIExvZ0ZpZWxkcyxcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgTG9nUHJlc2V0LFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SWRDb25maWcsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXIsXG4gIFNhbXBsaW5nQ29uZmlnLFxuICBTdG9yZURhdGEsXG4gIFRhaWxTYW1wbGluZ0NvbmZpZyxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmV4cG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5leHBvcnQgdHlwZSB7IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIH0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmV4cG9ydCB0eXBlIHtcbiAgUmVxdWVzdE91dGNvbWUsXG4gIFNhbXBsaW5nRGVjaXNpb24sXG4gIFNhbXBsaW5nUnVudGltZVxufSBmcm9tICcuL3NhbXBsaW5nJ1xuZXhwb3J0IHsgcmVzb2x2ZVNhbXBsaW5nIH0gZnJvbSAnLi9zYW1wbGluZydcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhOiB0eXBlb2YgY3JlYXRlTG9naXhseXNpYVBsdWdpbiA9IGNyZWF0ZUxvZ2l4bHlzaWFQbHVnaW5cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLihcXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfSg/Oi1cXGR7M30pPyg/Oi1cXGQrKT8pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplOiAke3ZhbHVlfWApXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAodHJpbW1lZCAhPT0gJycpIHtcbiAgICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgICBpZiAoYXNOdW1iZXIgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZTogJHt2YWx1ZX1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzTnVtYmVyXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+IDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heEZpbGVzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBnb3QgJHt2YWx1ZX1gKVxuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dQcmVzZXQsIE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VJbnRlcnZhbCwgcGFyc2VSZXRlbnRpb24sIHBhcnNlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuXG5jb25zdCBWQUxJRF9QUkVTRVRTOiByZWFkb25seSBMb2dQcmVzZXRbXSA9IFsnZGV2JywgJ3Byb2QnLCAnanNvbiddXG5cbmNvbnN0IHZhbGlkYXRlTG9nUm90YXRpb24gPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBsb2dSb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFsb2dSb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAobG9nUm90YXRpb24ubWF4U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZVNpemUobG9nUm90YXRpb24ubWF4U2l6ZSlcbiAgICB9XG4gICAgaWYgKGxvZ1JvdGF0aW9uLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlUmV0ZW50aW9uKGxvZ1JvdGF0aW9uLm1heEZpbGVzKVxuICAgIH1cbiAgICBpZiAobG9nUm90YXRpb24uaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VJbnRlcnZhbChsb2dSb3RhdGlvbi5pbnRlcnZhbClcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbG9nUm90YXRpb24uY29tcHJlc3Npb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgbG9nUm90YXRpb24uY29tcHJlc3Npb24gIT09ICdnemlwJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBjb21wcmVzc2lvbiBhbGdvcml0aG06ICR7bG9nUm90YXRpb24uY29tcHJlc3Npb259YFxuICAgICAgKVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2dpeGx5c2lhOiBpbnZhbGlkIGxvZ1JvdGF0aW9uIGNvbmZpZyDigJQgJHttZXNzYWdlfWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvclxuICAgIH0pXG4gIH1cbn1cblxuY29uc3QgTUFYX1NBTVBMSU5HX1JBVEUgPSAxMDBcblxuY29uc3QgaXNQZXJjZW50YWdlID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiZcbiAgdmFsdWUgPj0gMCAmJlxuICB2YWx1ZSA8PSBNQVhfU0FNUExJTkdfUkFURVxuXG5jb25zdCBpc05vbk5lZ2F0aXZlTnVtYmVyID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMFxuXG5jb25zdCBWQUxJRF9TQU1QTElOR19MRVZFTFMgPSBbJ0RFQlVHJywgJ0lORk8nLCAnV0FSTklORycsICdFUlJPUiddIGFzIGNvbnN0XG5cbmNvbnN0IHZhbGlkYXRlU2FtcGxpbmcgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBzYW1wbGluZyA9IGNvbmZpZz8uc2FtcGxpbmdcbiAgaWYgKCFzYW1wbGluZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgaW52YWxpZCA9IChkZXRhaWw6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGxvZ2l4bHlzaWE6IGludmFsaWQgc2FtcGxpbmcgY29uZmlnIOKAlCAke2RldGFpbH1gKVxuICB9XG5cbiAgZm9yIChjb25zdCBbbGV2ZWwsIHJhdGVdIG9mIE9iamVjdC5lbnRyaWVzKHNhbXBsaW5nLmhlYWQgPz8ge30pKSB7XG4gICAgaWYgKCFWQUxJRF9TQU1QTElOR19MRVZFTFMuaW5jbHVkZXMobGV2ZWwgYXMgbmV2ZXIpKSB7XG4gICAgICBpbnZhbGlkKFxuICAgICAgICBgaGVhZC4ke2xldmVsfSBpcyBub3QgYSB2YWxpZCBsZXZlbCAobXVzdCBiZSBERUJVRywgSU5GTywgV0FSTklORywgb3IgRVJST1IpYFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIWlzUGVyY2VudGFnZShyYXRlKSkge1xuICAgICAgaW52YWxpZChgaGVhZC4ke2xldmVsfSBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwYClcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IHRhaWwgfSA9IHNhbXBsaW5nXG4gIGlmICh0YWlsPy5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcih0YWlsLnN0YXR1cykpIHtcbiAgICBpbnZhbGlkKCd0YWlsLnN0YXR1cyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpXG4gIH1cbiAgaWYgKHRhaWw/LmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcih0YWlsLmR1cmF0aW9uTXMpKSB7XG4gICAgaW52YWxpZCgndGFpbC5kdXJhdGlvbk1zIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcbiAgfVxuICBpZiAodGFpbD8ucGF0aHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWlsLnBhdGhzKSkge1xuICAgICAgaW52YWxpZCgndGFpbC5wYXRocyBtdXN0IGJlIGFuIGFycmF5JylcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGFpbC5wYXRocy5zb21lKHBhdGggPT4gdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8IHBhdGgubGVuZ3RoID09PSAwKVxuICAgICkge1xuICAgICAgaW52YWxpZCgndGFpbC5wYXRocyBtdXN0IGNvbnRhaW4gbm9uLWVtcHR5IGdsb2Igc3RyaW5ncycpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBtYXhCdWZmZXJlZFBlclJlcXVlc3QgfSA9IHNhbXBsaW5nXG4gIGlmIChcbiAgICBtYXhCdWZmZXJlZFBlclJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICEoTnVtYmVyLmlzSW50ZWdlcihtYXhCdWZmZXJlZFBlclJlcXVlc3QpICYmIG1heEJ1ZmZlcmVkUGVyUmVxdWVzdCA+PSAwKVxuICApIHtcbiAgICBpbnZhbGlkKCdtYXhCdWZmZXJlZFBlclJlcXVlc3QgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJylcbiAgfVxufVxuXG5jb25zdCB2YWxpZGF0ZUZvcm1hdHRpbmcgPSAoY29uZmlnOiBPcHRpb25zWydjb25maWcnXSk6IHZvaWQgPT4ge1xuICBjb25zdCBzbG93VGhyZXNob2xkID0gY29uZmlnPy5zbG93VGhyZXNob2xkXG4gIGNvbnN0IHZlcnlTbG93VGhyZXNob2xkID0gY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZFxuXG4gIGNvbnN0IGludmFsaWQgPSAoZGV0YWlsOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2dpeGx5c2lhOiBpbnZhbGlkIGZvcm1hdHRpbmcgY29uZmlnIOKAlCAke2RldGFpbH1gKVxuICB9XG5cbiAgaWYgKHNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiAhaXNOb25OZWdhdGl2ZU51bWJlcihzbG93VGhyZXNob2xkKSkge1xuICAgIGludmFsaWQoXG4gICAgICBgc2xvd1RocmVzaG9sZCBtdXN0IGJlIGEgZmluaXRlIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke3Nsb3dUaHJlc2hvbGR9YFxuICAgIClcbiAgfVxuICBpZiAoXG4gICAgdmVyeVNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICFpc05vbk5lZ2F0aXZlTnVtYmVyKHZlcnlTbG93VGhyZXNob2xkKVxuICApIHtcbiAgICBpbnZhbGlkKFxuICAgICAgYHZlcnlTbG93VGhyZXNob2xkIG11c3QgYmUgYSBmaW5pdGUgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7dmVyeVNsb3dUaHJlc2hvbGR9YFxuICAgIClcbiAgfVxuICBpZiAoXG4gICAgc2xvd1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgdmVyeVNsb3dUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHNsb3dUaHJlc2hvbGQgPiB2ZXJ5U2xvd1RocmVzaG9sZFxuICApIHtcbiAgICBpbnZhbGlkKFxuICAgICAgYHNsb3dUaHJlc2hvbGQgKCR7c2xvd1RocmVzaG9sZH0pIG11c3Qgbm90IGV4Y2VlZCB2ZXJ5U2xvd1RocmVzaG9sZCAoJHt2ZXJ5U2xvd1RocmVzaG9sZH0pYFxuICAgIClcbiAgfVxufVxuXG5jb25zdCBQUkVTRVRfREVGQVVMVFM6IFJlY29yZDxMb2dQcmVzZXQsIE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPj4gPSB7XG4gIGRldjoge1xuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiB0cnVlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IHRydWUsXG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiB0cnVlLFxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0OiAnYmFubmVyJyxcbiAgICB1c2VDb2xvcnM6IHRydWVcbiAgfSxcbiAganNvbjoge1xuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiBmYWxzZVxuICAgIH0sXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2VcbiAgfSxcbiAgcHJvZDoge1xuICAgIGF1dG9SZWRhY3Q6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICByZXF1ZXN0SWQ6IHRydWUsXG4gICAgc2hvd0NvbnRleHRUcmVlOiBmYWxzZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IGZhbHNlLFxuICAgIHVzZUNvbG9yczogZmFsc2VcbiAgfVxufVxuXG5jb25zdCBtZXJnZUNvbmZpZyA9IChcbiAgYmFzZTogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+LFxuICBvdmVycmlkZT86IE9wdGlvbnNbJ2NvbmZpZyddXG4pOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPT4ge1xuICBpZiAoIW92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIGJhc2VcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+ID0geyAuLi5iYXNlLCAuLi5vdmVycmlkZSB9XG5cbiAgaWYgKGJhc2UucGlubyB8fCBvdmVycmlkZS5waW5vKSB7XG4gICAgbWVyZ2VkLnBpbm8gPSB7XG4gICAgICAuLi5iYXNlLnBpbm8sXG4gICAgICAuLi5vdmVycmlkZS5waW5vLFxuICAgICAgLi4uKGJhc2UucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3ZlcnJpZGUucGlubz8ucHJldHR5UHJpbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByZXR0eVByaW50OiBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCA/PyBiYXNlLnBpbm8/LnByZXR0eVByaW50XG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ0ZpbHRlciB8fCBvdmVycmlkZS5sb2dGaWx0ZXIpIHtcbiAgICBtZXJnZWQubG9nRmlsdGVyID0ge1xuICAgICAgLi4uYmFzZS5sb2dGaWx0ZXIsXG4gICAgICAuLi5vdmVycmlkZS5sb2dGaWx0ZXJcbiAgICB9XG4gIH1cblxuICBpZiAoYmFzZS5zYW1wbGluZyB8fCBvdmVycmlkZS5zYW1wbGluZykge1xuICAgIG1lcmdlZC5zYW1wbGluZyA9IHtcbiAgICAgIC4uLmJhc2Uuc2FtcGxpbmcsXG4gICAgICAuLi5vdmVycmlkZS5zYW1wbGluZ1xuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgcHJlc2V0IH0gPSBvcHRpb25zXG4gIGlmIChwcmVzZXQgJiYgIVZBTElEX1BSRVNFVFMuaW5jbHVkZXMocHJlc2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBwcmVzZXQg4oCUICR7cHJlc2V0fWApXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHByZXNldFxuICAgID8ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjb25maWc6IG1lcmdlQ29uZmlnKFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdLCBvcHRpb25zLmNvbmZpZylcbiAgICAgIH1cbiAgICA6IG9wdGlvbnNcblxuICB2YWxpZGF0ZUxvZ1JvdGF0aW9uKHJlc29sdmVkLmNvbmZpZylcbiAgdmFsaWRhdGVTYW1wbGluZyhyZXNvbHZlZC5jb25maWcpXG4gIHZhbGlkYXRlRm9ybWF0dGluZyhyZXNvbHZlZC5jb25maWcpXG4gIHJldHVybiByZXNvbHZlZFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFNpbmtFcnJvckNvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBSRVBPUlRfSU5URVJWQUxfTVMgPSA1MDAwXG5cbmV4cG9ydCB0eXBlIEVycm9yUmVwb3J0ZXIgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbikgPT4gdm9pZFxuXG4vKipcbiAqIFJvdXRlcyBhIGZhaWx1cmUgdG8gYGNvbmZpZy5vbkVycm9yYCwgb3Ig4oCUIHdoZW4gbm8gaG9vayBpcyBjb25maWd1cmVkIOKAlCB0b1xuICogc3RkZXJyIGF0IG1vc3Qgb25jZSBwZXIgaW50ZXJ2YWwsIHNvIGEgY29tcG9uZW50IHRoYXQgZmFpbHMgb24gZXZlcnkgcmVxdWVzdFxuICogY2Fubm90IGZsb29kIHRoZSB2ZXJ5IGxvZyBpdCBpcyBtZWFudCB0byBiZSBmZWVkaW5nLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRXJyb3JSZXBvcnRlciA9IChcbiAgc2luazogU2lua0Vycm9yQ29udGV4dFsnc2luayddLFxuICBsYWJlbDogc3RyaW5nXG4pOiBFcnJvclJlcG9ydGVyID0+IHtcbiAgbGV0IGxhc3RSZXBvcnRlZEF0ID0gMFxuXG4gIHJldHVybiAoZXJyb3IsIG9uRXJyb3IpID0+IHtcbiAgICBpZiAob25FcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb25FcnJvcih7IGVycm9yLCBzaW5rIH0pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBob29rIGl0c2VsZi5cbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICBpZiAobm93IC0gbGFzdFJlcG9ydGVkQXQgPCBSRVBPUlRfSU5URVJWQUxfTVMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsYXN0UmVwb3J0ZWRBdCA9IG5vd1xuICAgIGNvbnNvbGUuZXJyb3IoYFtsb2dpeGx5c2lhXSAke2xhYmVsfTpgLCBlcnJvcilcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIEVucmljaGVyRmllbGRzLFxuICBFbnJpY2hlckxpa2UsXG4gIEVucmljaGVyUmVzcG9uc2VJbnB1dCxcbiAgU2lua0Vycm9yQ29udGV4dFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlRXJyb3JSZXBvcnRlciB9IGZyb20gJy4uL3V0aWxzL3JlcG9ydCdcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHRTdG9yZSB9IGZyb20gJy4vcmVxdWVzdC1jb250ZXh0J1xuXG5jb25zdCByZXBvcnRFbnJpY2hlckVycm9yID0gY3JlYXRlRXJyb3JSZXBvcnRlcignZW5yaWNoZXInLCAnZW5yaWNoZXIgZmFpbGVkJylcblxudHlwZSBSZXF1ZXN0UGhhc2UgPSAocmVxdWVzdDogUmVxdWVzdCkgPT4gRW5yaWNoZXJGaWVsZHNcbnR5cGUgUmVzcG9uc2VQaGFzZSA9IChpbnB1dDogRW5yaWNoZXJSZXNwb25zZUlucHV0KSA9PiBFbnJpY2hlckZpZWxkc1xuXG4vKiogRW5yaWNoZXIgcGhhc2VzIHNwbGl0IHNvIGVhY2ggcmVxdWVzdCBvbmx5IHdhbGtzIHRoZSBob29rcyB0aGF0IGV4aXN0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEVucmljaGVycyB7XG4gIHJlcXVlc3Q6IFJlcXVlc3RQaGFzZVtdXG4gIHJlc3BvbnNlOiBSZXNwb25zZVBoYXNlW11cbn1cblxuLyoqIFNwbGl0cyBjb25maWd1cmVkIGVucmljaGVycyBieSBwaGFzZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlRW5yaWNoZXJzID0gKFxuICBlbnJpY2hlcnM/OiBFbnJpY2hlckxpa2VbXVxuKTogUmVzb2x2ZWRFbnJpY2hlcnMgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWVucmljaGVycz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZXF1ZXN0OiBSZXF1ZXN0UGhhc2VbXSA9IFtdXG4gIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZVBoYXNlW10gPSBbXVxuXG4gIGZvciAoY29uc3QgZW5yaWNoZXIgb2YgZW5yaWNoZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBlbnJpY2hlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5wdXNoKGVucmljaGVyKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGVucmljaGVyLnJlcXVlc3QpIHtcbiAgICAgIHJlcXVlc3QucHVzaChlbnJpY2hlci5yZXF1ZXN0KVxuICAgIH1cbiAgICBpZiAoZW5yaWNoZXIucmVzcG9uc2UpIHtcbiAgICAgIHJlc3BvbnNlLnB1c2goZW5yaWNoZXIucmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3QubGVuZ3RoID09PSAwICYmIHJlc3BvbnNlLmxlbmd0aCA9PT0gMFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB7IHJlcXVlc3QsIHJlc3BvbnNlIH1cbn1cblxuLyoqXG4gKiBSdW5zIG9uZSBwaGFzZSBhbmQgbWVyZ2VzIHdoYXQgaXQgcmV0dXJucyBpbnRvIHRoZSByZXF1ZXN0IGNvbnRleHQuIEEgaG9va1xuICogdGhhdCB0aHJvd3MgaXMgcmVwb3J0ZWQgYW5kIHNraXBwZWQ6IGVucmljaG1lbnQgaXMgZGVjb3JhdGlvbiwgYW5kIG11c3RcbiAqIG5ldmVyIHRha2UgYSByZXF1ZXN0IGRvd24gd2l0aCBpdC5cbiAqL1xuY29uc3QgcnVuUGhhc2UgPSA8VElucHV0PihcbiAgaG9va3M6ICgoaW5wdXQ6IFRJbnB1dCkgPT4gRW5yaWNoZXJGaWVsZHMpW10sXG4gIGlucHV0OiBUSW5wdXQsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZSxcbiAga2V5OiBSZXF1ZXN0LFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICBsZXQgZmllbGRzOiBFbnJpY2hlckZpZWxkc1xuICAgIHRyeSB7XG4gICAgICBmaWVsZHMgPSBob29rKGlucHV0KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRFbnJpY2hlckVycm9yKGVycm9yLCBvbkVycm9yKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChrZXksIGZpZWxkcylcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5UmVxdWVzdEVucmljaGVycyA9IChcbiAgZW5yaWNoZXJzOiBSZXNvbHZlZEVucmljaGVycyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBydW5QaGFzZShlbnJpY2hlcnMucmVxdWVzdCwgcmVxdWVzdCwgY29udGV4dFN0b3JlLCByZXF1ZXN0LCBvbkVycm9yKVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlSZXNwb25zZUVucmljaGVycyA9IChcbiAgZW5yaWNoZXJzOiBSZXNvbHZlZEVucmljaGVycyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICBpbnB1dDogRW5yaWNoZXJSZXNwb25zZUlucHV0LFxuICBvbkVycm9yPzogKGNvbnRleHQ6IFNpbmtFcnJvckNvbnRleHQpID0+IHZvaWRcbik6IHZvaWQgPT4ge1xuICBydW5QaGFzZShlbnJpY2hlcnMucmVzcG9uc2UsIGlucHV0LCBjb250ZXh0U3RvcmUsIGlucHV0LnJlcXVlc3QsIG9uRXJyb3IpXG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbiAgLyoqXG4gICAqIE5vbi1jbG9uaW5nIHJlYWQgb2YgdGhlIGxpdmUgY29udGV4dCBiYWcuIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHN0b3JlZCBpbnRlcm5hbGx5IChvciBhXG4gICAqIHNoYXJlZCBmcm96ZW4gZW1wdHkgb2JqZWN0KSDigJQgbmV2ZXIgaGFuZCB0aGlzIHRvIHVzZXItZmFjaW5nIGNvZGUsIHdoaWNoIG1heSByZXRhaW4gb3JcbiAgICogbXV0YXRlIGl0LiBPbmx5IGludGVybmFsLCByZWFkLW9ubHkgY2FsbCBzaXRlcyAodGhhdCBpbW1lZGlhdGVseSBzcHJlYWQgdGhlIHJlc3VsdCBpbnRvIGFcbiAgICogbmV3IG9iamVjdCkgbWF5IHVzZSB0aGlzOyBldmVyeXRoaW5nIGVsc2UgbXVzdCB1c2Uge0BsaW5rIFJlcXVlc3RDb250ZXh0U3RvcmUuZ2V0Q29udGV4dH0uXG4gICAqL1xuICBwZWVrQ29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG59XG5cbmNvbnN0IEVNUFRZX0NPTlRFWFQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IE9iamVjdC5mcmVlemUoe30pXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlID0gKCk6IFJlcXVlc3RDb250ZXh0U3RvcmUgPT4ge1xuICBjb25zdCBiYWdzID0gbmV3IFdlYWtNYXA8Q29udGV4dEtleSwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KClcblxuICBjb25zdCBnZXRPckNyZWF0ZSA9IChrZXk6IENvbnRleHRLZXkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgbGV0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICBpZiAoIWJhZykge1xuICAgICAgYmFnID0ge31cbiAgICAgIGJhZ3Muc2V0KGtleSwgYmFnKVxuICAgIH1cbiAgICByZXR1cm4gYmFnXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNsZWFyQ29udGV4dChrZXkpIHtcbiAgICAgIGJhZ3MuZGVsZXRlKGtleSlcbiAgICB9LFxuICAgIGdldENvbnRleHQoa2V5KSB7XG4gICAgICBjb25zdCBiYWcgPSBiYWdzLmdldChrZXkpXG4gICAgICByZXR1cm4gYmFnID8geyAuLi5iYWcgfSA6IHt9XG4gICAgfSxcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwZWVrQ29udGV4dChrZXkpIHtcbiAgICAgIHJldHVybiBiYWdzLmdldChrZXkpID8/IEVNUFRZX0NPTlRFWFRcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJ1xuaW1wb3J0IHR5cGUgeyBMb2dGaWVsZHMsIFJlcXVlc3RTY29wZWRMb2dnZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4gPVxuICBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4oKVxuXG4vKipcbiAqIFN0YW5kcyBpbiB3aGVyZXZlciBubyByZXF1ZXN0IGlzIGluIGZsaWdodCwgaW5jbHVkaW5nIGFmdGVyIG9uZSBlbmRzOiB0aGVcbiAqIHBsdWdpbiByZXN0b3JlcyBpdCBzbyBhIGNvbnRpbnVhdGlvbiB0aGF0IG91dGxpdmVzIGl0cyByZXF1ZXN0IGNhbm5vdCBrZWVwXG4gKiB3cml0aW5nIGludG8gdGhlIGZpbmlzaGVkIHJlcXVlc3QncyBsb2cuXG4gKi9cbmV4cG9ydCBjb25zdCBub29wUmVxdWVzdExvZ2dlcjogUmVxdWVzdFNjb3BlZExvZ2dlciA9IHtcbiAgZGVidWc6ICgpID0+IHVuZGVmaW5lZCxcbiAgZXJyb3I6ICgpID0+IHVuZGVmaW5lZCxcbiAgaW5mbzogKCkgPT4gdW5kZWZpbmVkLFxuICBtZXJnZUNvbnRleHQ6ICgpID0+IHVuZGVmaW5lZCxcbiAgd2FybjogKCkgPT4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgcmVxdWVzdCdzIGxvZ2dlciwgb3IgYSBuby1vcCBvbmUgb3V0c2lkZSBhIHJlcXVlc3QuXG4gKlxuICogUGFzcyB0aGUgc2FtZSBmaWVsZCB0eXBlIHlvdSBnYXZlIHRoZSBwbHVnaW4gdG8ga2VlcCBjb250ZXh0IHR5cGVkIGF3YXlcbiAqIGZyb20gdGhlIEVseXNpYSBoYW5kbGVyOiBgdXNlTG9nZ2VyPENoZWNrb3V0RmllbGRzPigpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZUxvZ2dlciA9IDxcbiAgVEZpZWxkcyBleHRlbmRzIG9iamVjdCA9IExvZ0ZpZWxkc1xuPigpOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyPFRGaWVsZHM+ID0+XG4gIC8vIFRoZSBzdG9yZWQgbG9nZ2VyIHdyaXRlcyBpbnRvIGFuIHVudHlwZWQgY29udGV4dCBiYWc7IHRoZSB0eXBlIHBhcmFtZXRlclxuICAvLyBvbmx5IG5hcnJvd3Mgd2hhdCBjYWxsZXJzIG1heSBoYW5kIGl0LlxuICAobG9nZ2VyU3RvcmFnZS5nZXRTdG9yZSgpID8/XG4gICAgbm9vcFJlcXVlc3RMb2dnZXIpIGFzIFJlcXVlc3RTY29wZWRMb2dnZXI8VEZpZWxkcz5cbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHsgdmVyc2lvbiB9ID0gZWx5c2lhUGtnXG4gIGNvbnN0IHZlcnNpb25MaW5lID0gdmVyc2lvbiA/IGBFbHlzaWEgdiR7dmVyc2lvbn1gIDogJ0VseXNpYSdcblxuICBjb25zdCByb3dzOiBSb3dTcGVjW10gPSBbXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnY2VudGVyJywgdGV4dDogdmVyc2lvbkxpbmUgfSxcbiAgICB7IGtpbmQ6ICdlbXB0eScgfSxcbiAgICB7IGtpbmQ6ICdsZWZ0JywgdGV4dDogdXJsRGlzcGxheUxpbmUgfVxuICBdXG4gIGlmIChsb2dpeGx5c2lhTGluZSkge1xuICAgIHJvd3MucHVzaCh7IGtpbmQ6ICdsZWZ0JywgdGV4dDogbG9naXhseXNpYUxpbmUgfSlcbiAgfVxuICByb3dzLnB1c2goeyBraW5kOiAnZW1wdHknIH0pXG5cbiAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5tYXgoXG4gICAgdmVyc2lvbkxpbmUubGVuZ3RoLFxuICAgIHVybERpc3BsYXlMaW5lLmxlbmd0aCxcbiAgICAuLi4obG9naXhseXNpYUxpbmUgPyBbbG9naXhseXNpYUxpbmUubGVuZ3RoXSA6IFswXSlcbiAgKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNFxuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5Um93ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFt0b3BdXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBpZiAocm93LmtpbmQgPT09ICdlbXB0eScpIHtcbiAgICAgIG91dC5wdXNoKGVtcHR5Um93KVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHJvdy5raW5kID09PSAnY2VudGVyJykge1xuICAgICAgb3V0LnB1c2goYOKUgiR7Y2VudGVyVGV4dChyb3cudGV4dCwgaW5uZXJXaWR0aCl94pSCYClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHsgdGV4dCB9ID0gcm93XG4gICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSB0ZXh0Lmxlbmd0aCAtIDQpXG4gICAgb3V0LnB1c2goYOKUgiAgJHt0ZXh0fSR7JyAnLnJlcGVhdChwYWRkaW5nKX0gIOKUgmApXG4gIH1cbiAgb3V0LnB1c2goYm90KVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHYgPSBsb2dpeGx5c2lhUGtnLnZlcnNpb25cbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gYCAgICAgbG9naXhseXNpYSB2JHt2fWBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSwgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG4gIGNvbnN0IHVybERpc3BsYXlMaW5lID0gYPCfpoogICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKHVybERpc3BsYXlMaW5lLCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUoKSkpXG59XG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuY29uc3QgRElHSVRTX09OTFkgPSAvXlxcZCskL1xuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKFtBLVpdKShbQS1aXVthLXpdKS9nXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcbmNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzKy9nXG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMiwgJyQxICQyJylcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDLCAnICcpXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxuICAgIC50cmltKClcbn1cblxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XG4gICAgbWFwLnNldChub3JtYWxpemVTdGF0dXNOYW1lKG5hbWUpLCBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufSkoKVxuXG5leHBvcnQgY29uc3QgZ2V0U3RhdHVzQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXG4gICAgfVxuXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxuICAgIHJldHVybiBrbm93biA/PyA1MDBcbiAgfVxuXG4gIHJldHVybiA1MDBcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBwcmV0dHkgZnJvbSAncGluby1wcmV0dHknXG5pbXBvcnQge1xuICBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHJlc29sdmVTYW1wbGluZyB9IGZyb20gJy4uL3NhbXBsaW5nJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBidWlsZFBpbm9SZWRhY3RQYXRocyB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGNyZWF0ZUZvcm1hdENvbnRleHQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBlbWl0LCBwYXJzZVJlcXVlc3RVcmxPbmNlLCByZXNvbHZlU2lua3MsIHNob3VsZExvZyB9IGZyb20gJy4vZW1pdCdcbmltcG9ydCB7IGhhbmRsZUh0dHBFcnJvciB9IGZyb20gJy4vaGFuZGxlLWh0dHAtZXJyb3InXG5cbmNvbnN0IFpFUk9fU1RPUkU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogQmlnSW50KDApIH1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyA9IHt9LFxuICBwaW5vRmFjdG9yeTogdHlwZW9mIHBpbm8gPSBwaW5vLFxuICBleHRlcm5hbENvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGV4dGVybmFsQ29udGV4dFN0b3JlID8/IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICAvLyBIb2lzdGVkIG9uY2UgcGVyIGxvZ2dlciBpbnN0YW5jZTogY29sb3JzL2Zvcm1hdC90aHJlc2hvbGRzL3NlcnZpY2UgZG9uJ3QgY2hhbmdlIGFjcm9zc1xuICAvLyByZXF1ZXN0cyB3aXRoaW4gYSBwcm9jZXNzIGxpZmV0aW1lIChzZWUgY3JlYXRlRm9ybWF0Q29udGV4dCdzIGRvYyBjb21tZW50KS5cbiAgY29uc3QgZm9ybWF0Q29udGV4dCA9IGNyZWF0ZUZvcm1hdENvbnRleHQob3B0aW9ucylcblxuICBjb25zdCBwaW5vQ29uZmlnID0gY29uZmlnPy5waW5vXG4gIGNvbnN0IHsgcHJldHR5UHJpbnQsIC4uLnBpbm9PcHRpb25zIH0gPSBwaW5vQ29uZmlnID8/IHt9XG5cbiAgY29uc3QgcHJldHR5UHJpbnRPcHRpb25zID1cbiAgICB0eXBlb2YgcHJldHR5UHJpbnQgPT09ICdvYmplY3QnICYmIHByZXR0eVByaW50ICE9PSBudWxsXG4gICAgICA/IChwcmV0dHlQcmludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZW5hYmxlUHJldHR5UHJpbnQgPVxuICAgIHByZXR0eVByaW50ID09PSB0cnVlIHx8IHByZXR0eVByaW50T3B0aW9ucyAhPT0gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc2hvdWxkUHJldHR5UHJpbnQgPVxuICAgIGVuYWJsZVByZXR0eVByaW50ICYmIHBpbm9PcHRpb25zLnRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkXG5cbiAgY29uc3QgbWVzc2FnZUtleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8ubWVzc2FnZUtleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgcGlub09wdGlvbnMubWVzc2FnZUtleVxuICBjb25zdCBlcnJvcktleSA9XG4gICAgKHByZXR0eVByaW50T3B0aW9ucz8uZXJyb3JLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyBwaW5vT3B0aW9ucy5lcnJvcktleVxuXG4gIGNvbnN0IGJhc2VQaW5vT3B0aW9ucyA9IHtcbiAgICAuLi5waW5vT3B0aW9ucyxcbiAgICBlcnJvcktleSxcbiAgICBsZXZlbDogcGlub09wdGlvbnMubGV2ZWwgPz8gJ2luZm8nLFxuICAgIG1lc3NhZ2VLZXksXG4gICAgLi4uKGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSAmJiBwaW5vT3B0aW9ucy5yZWRhY3QgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7XG4gICAgICAgICAgcmVkYWN0OiB7XG4gICAgICAgICAgICBjZW5zb3I6ICdbUkVEQUNURURdJyxcbiAgICAgICAgICAgIHBhdGhzOiBidWlsZFBpbm9SZWRhY3RQYXRocyhjb25maWc/LnJlZGFjdEtleXMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICA6IHt9KVxuICB9XG5cbiAgLy8gUGlubyAoYW5kLCB3aGVuIGNvbmZpZ3VyZWQsIGl0cyBwaW5vLXByZXR0eSB0cmFuc2Zvcm0gc3RyZWFtKSBpcyBleHBlbnNpdmUgdG8gY29uc3RydWN0XG4gIC8vIGFuZCBpcyBvbmx5IGV2ZXIgbmVlZGVkIHdoZW4gYSBjYWxsZXIgZXhwbGljaXRseSByZWFkcyBzdG9yZS5waW5vL2xvZ2dlci5waW5vIG9yIGNvbmZpZ3VyZXNcbiAgLy8gY29uZmlnLnBpbm8g4oCUIHRoZSBwbHVnaW4ncyBvd24gbG9nIHBhdGggd3JpdGVzIHZpYSBjb25zb2xlLiogYW5kIG5ldmVyIHRvdWNoZXMgaXQuIEJ1aWxkaW5nXG4gIC8vIGl0IGxhemlseSBiZWhpbmQgYSBzdGFibGUgUHJveHkga2VlcHMgYHN0b3JlLnBpbm8gPT09IGxvZ2dlci5waW5vYCBpZGVudGl0eSB3aGlsZSBkZWZlcnJpbmdcbiAgLy8gdGhlIGNvc3QgdW50aWwgZmlyc3QgYWNjZXNzLlxuICBjb25zdCBwcmV0dHlTdHJlYW0gPSAoKTogUmV0dXJuVHlwZTx0eXBlb2YgcHJldHR5PiA9PlxuICAgIHByZXR0eSh7XG4gICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAuLi5wcmV0dHlQcmludE9wdGlvbnMsXG4gICAgICBlcnJvcktleSxcbiAgICAgIG1lc3NhZ2VLZXlcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuXG4gIGxldCByZWFsUGlubzogUGlubyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGdldFBpbm8gPSAoKTogUGlubyA9PiB7XG4gICAgaWYgKCFyZWFsUGlubykge1xuICAgICAgcmVhbFBpbm8gPSBzaG91bGRQcmV0dHlQcmludFxuICAgICAgICA/IHBpbm9GYWN0b3J5KGJhc2VQaW5vT3B0aW9ucywgcHJldHR5U3RyZWFtKCkpXG4gICAgICAgIDogcGlub0ZhY3Rvcnkoe1xuICAgICAgICAgICAgLi4uYmFzZVBpbm9PcHRpb25zLFxuICAgICAgICAgICAgdHJhbnNwb3J0OiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcbiAgICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVhbFBpbm9cbiAgfVxuXG4gIGNvbnN0IGxhenlQaW5vID0gbmV3IFByb3h5KHt9IGFzIFBpbm8sIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UGlubygpXG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbXG4gICAgICAgIHByb3BcbiAgICAgIF1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyAodmFsdWUgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bikuYmluZCh0YXJnZXQpXG4gICAgICAgIDogdmFsdWVcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIHByb3ApID0+IHByb3AgaW4gKGdldFBpbm8oKSBhcyBvYmplY3QpXG4gIH0pXG5cbiAgLy8gRXhwbGljaXQgY29uZmlnLnBpbm8gbWVhbnMgdGhlIHVzZXIgb3B0ZWQgaW4gdG8gcGlubyBkaXJlY3RseTogY29uc3RydWN0IGVhZ2VybHkgc29cbiAgLy8gaW52YWxpZCBvcHRpb25zIGZhaWwgZmFzdCBhdCBwbHVnaW4gc2V0dXAgdGltZSwgbWF0Y2hpbmcgcHJlLWxhenkgYmVoYXZpb3IuXG4gIGlmIChjb25maWc/LnBpbm8gIT09IHVuZGVmaW5lZCkge1xuICAgIGdldFBpbm8oKVxuICB9XG5cbiAgLy8gUmVzb2x2ZWQgb25jZSBwZXIgbG9nZ2VyIGluc3RhbmNlOiBub25lIG9mIHRoZXNlIGRlcGVuZCBvbiBwZXItcmVxdWVzdCBzdGF0ZS5cbiAgY29uc3Qgc2lua3MgPSByZXNvbHZlU2lua3MoY29uZmlnKVxuICBjb25zdCBzYW1wbGluZyA9IHJlc29sdmVTYW1wbGluZyhjb25maWc/LnNhbXBsaW5nKVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICBlbWl0KHtcbiAgICAgIGNvbnRleHRTdG9yZSxcbiAgICAgIGRhdGEsXG4gICAgICBmb3JtYXRDb250ZXh0LFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHNhbXBsaW5nLFxuICAgICAgc2lua3MsXG4gICAgICBzdG9yZVxuICAgIH0pXG4gIH1cblxuICAvKiogUmVzb2x2ZXMgdGhlIHRhaWwgdmVyZGljdCBhbmQgcmUtZW1pdHMgd2hhdGV2ZXIgaXQgcmVzY3VlZC4gKi9cbiAgY29uc3QgZmluYWxpemVSZXF1ZXN0ID0gKFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIHN0b3JlOiBTdG9yZURhdGEsXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKCFzYW1wbGluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb3V0Y29tZSA9IHtcbiAgICAgIGR1cmF0aW9uTXM6IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKSxcbiAgICAgIHBhdGhuYW1lOiBwYXJzZVJlcXVlc3RVcmxPbmNlKHJlcXVlc3QpLnBhdGhuYW1lLFxuICAgICAgc3RhdHVzXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2Ygc2FtcGxpbmcuZmluYWxpemUocmVxdWVzdCwgb3V0Y29tZSkpIHtcbiAgICAgIGVtaXQoe1xuICAgICAgICBieXBhc3NTYW1wbGluZzogdHJ1ZSxcbiAgICAgICAgY29udGV4dFN0b3JlLFxuICAgICAgICBkYXRhOiByZWNvcmQuZGF0YSxcbiAgICAgICAgZHVyYXRpb25PdmVycmlkZTogcmVjb3JkLmR1cmF0aW9uTXMsXG4gICAgICAgIGZvcm1hdENvbnRleHQsXG4gICAgICAgIGxldmVsOiByZWNvcmQubGV2ZWwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHNhbXBsaW5nLFxuICAgICAgICBzaW5rcyxcbiAgICAgICAgLy8gVW5yZWFkIG9uIHRoaXMgcGF0aDogYGR1cmF0aW9uT3ZlcnJpZGVgIHN1cHBsaWVzIHRoZSBkdXJhdGlvbiBlYWNoXG4gICAgICAgIC8vIHJlY29yZCBoYWQgd2hlbiBpdCB3YXMgY2FwdHVyZWQuXG4gICAgICAgIHN0b3JlOiBaRVJPX1NUT1JFXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBjb250ZXh0LCBtZXNzYWdlIH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiZWdpblJlcXVlc3Q6IHJlcXVlc3QgPT4ge1xuICAgICAgc2FtcGxpbmc/LmJlZ2luKHJlcXVlc3QpXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBmaW5hbGl6ZVJlcXVlc3QsXG4gICAgZ2V0Q29udGV4dDogcmVxdWVzdCA9PiBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSxcbiAgICBoYW5kbGVIdHRwRXJyb3I6IChyZXF1ZXN0LCBlcnJvciwgc3RvcmUpID0+IHtcbiAgICAgIGhhbmRsZUh0dHBFcnJvcihcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb250ZXh0U3RvcmUsXG4gICAgICAgIHNpbmtzLFxuICAgICAgICBmb3JtYXRDb250ZXh0LFxuICAgICAgICBzYW1wbGluZ1xuICAgICAgKVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGxvZyxcbiAgICBtZXJnZUNvbnRleHQ6IChyZXF1ZXN0LCBwYXJ0aWFsKSA9PiB7XG4gICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwaW5vOiBsYXp5UGlubyxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxufVxuXG4vKiogUGx1Z2luIGVudHJ5OiBzaGFyZXMgb25lIHJlcXVlc3QtY29udGV4dCBzdG9yZSBhY3Jvc3MgdGhlIEVseXNpYSBsaWZlY3ljbGUuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUGx1Z2luTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiBjcmVhdGVMb2dnZXIob3B0aW9ucywgcGlubywgY29udGV4dFN0b3JlKVxuIiwKICAgICJjb25zdCBSRUdFWFBfU1BFQ0lBTFMgPSAvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2dcbmNvbnN0IFJFUEVBVEVEX1JFQ1VSU0lWRV9QQVRURVJOID0gL1xcKlxcKi4qXFwqXFwqL1xuY29uc3QgUkVDVVJTSVZFX1dJTERDQVJEX1NQTElUID0gL1xcKlxcKi9cbmNvbnN0IEFMUEhBTlVNRVJJQ19QQVRURVJOID0gL1thLXpBLVowLTldL1xuXG5jb25zdCBlc2NhcGVSZWdFeHAgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICB2YWx1ZS5yZXBsYWNlKFJFR0VYUF9TUEVDSUFMUywgJ1xcXFwkJicpXG5cbi8qKlxuICogRGV0ZWN0cyBpZiBhIHBhdHRlcm4gY29udGFpbnMgcmVwZWF0ZWQgcmVjdXJzaXZlIHdpbGRjYXJkcyB0aGF0IGNvdWxkIGNhdXNlIFJlRG9TLlxuICogUGF0dGVybnMgd2l0aCBhZGphY2VudCBvciBuZWFybHktYWRqYWNlbnQgYCoqYCB3aWxkY2FyZHMgY2FuIGxlYWQgdG8gY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAqL1xuY29uc3QgaGFzUmVwZWF0ZWRSZWN1cnNpdmVXaWxkY2FyZHMgPSAocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmICghUkVQRUFURURfUkVDVVJTSVZFX1BBVFRFUk4udGVzdChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3Qgc2VnbWVudHMgPSBwYXR0ZXJuLnNwbGl0KFJFQ1VSU0lWRV9XSUxEQ0FSRF9TUExJVClcbiAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSAqKiB3aXRoIG9ubHkgc2hvcnQgbGl0ZXJhbCBzZXBhcmF0b3JzIGJldHdlZW4gdGhlbSwgcmVqZWN0IGl0XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBzZWdtZW50c1tpXVxuICAgIC8vIEFsbG93ICoqIGZvbGxvd2VkIGJ5IHJlYXNvbmFibGUgbGl0ZXJhbCBwYXRocywgYnV0IHJlamVjdCBhZGphY2VudCBvciBuZWFybHktYWRqYWNlbnQgKipcbiAgICBpZiAoXG4gICAgICBzZXBhcmF0b3IgPT09ICcnIHx8XG4gICAgICAoc2VwYXJhdG9yLmxlbmd0aCA8IDIgJiYgIUFMUEhBTlVNRVJJQ19QQVRURVJOLnRlc3Qoc2VwYXJhdG9yKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29tcGlsZXMgYSBwYXRoIGdsb2IgaW50byBhbiBhbmNob3JlZCBgUmVnRXhwYC5cbiAqXG4gKiAtIGAqKmAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVycywgaW5jbHVkaW5nIGAvYFxuICogLSBgKmAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVycyBleGNlcHQgYC9gXG4gKiAtIGA/YCBtYXRjaGVzIGEgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgYC9gXG4gKlxuICogRXZlcnl0aGluZyBlbHNlIGlzIG1hdGNoZWQgbGl0ZXJhbGx5LCBzbyBgL3YxL3VzZXJzYCBvbmx5IG1hdGNoZXMgaXRzZWxmLlxuICovXG5leHBvcnQgY29uc3QgZ2xvYlRvUmVnRXhwID0gKHBhdHRlcm46IHN0cmluZyk6IFJlZ0V4cCA9PiB7XG4gIC8vIERldGVjdCByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzIHRoYXQgY291bGQgY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy5cbiAgaWYgKGhhc1JlcGVhdGVkUmVjdXJzaXZlV2lsZGNhcmRzKHBhdHRlcm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgZ2xvYiBwYXR0ZXJuOiByZXBlYXRlZCByZWN1cnNpdmUgd2lsZGNhcmRzICgqKikgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3VlcydcbiAgICApXG4gIH1cblxuICBsZXQgc291cmNlID0gJydcbiAgbGV0IGluZGV4ID0gMFxuXG4gIHdoaWxlIChpbmRleCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHBhdHRlcm5baW5kZXhdXG5cbiAgICBpZiAoY2hhciA9PT0gJyonKSB7XG4gICAgICBjb25zdCBjcm9zc2VzU2VnbWVudHMgPSBwYXR0ZXJuW2luZGV4ICsgMV0gPT09ICcqJ1xuICAgICAgc291cmNlICs9IGNyb3NzZXNTZWdtZW50cyA/ICcuKicgOiAnW14vXSonXG4gICAgICBpbmRleCArPSBjcm9zc2VzU2VnbWVudHMgPyAyIDogMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJz8nKSB7XG4gICAgICBzb3VyY2UgKz0gJ1teL10nXG4gICAgICBpbmRleCArPSAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHNvdXJjZSArPSBlc2NhcGVSZWdFeHAoY2hhcilcbiAgICBpbmRleCArPSAxXG4gIH1cblxuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7c291cmNlfSRgKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBTYW1wbGluZ0NvbmZpZyxcbiAgVGFpbFNhbXBsaW5nQ29uZmlnXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnbG9iVG9SZWdFeHAgfSBmcm9tICcuL2dsb2InXG5cbmNvbnN0IEZVTExfUkFURSA9IDEwMFxuY29uc3QgREVGQVVMVF9NQVhfQlVGRkVSRURfUEVSX1JFUVVFU1QgPSAxMDBcblxuY29uc3QgTk9fUkVDT1JEUzogcmVhZG9ubHkgQnVmZmVyZWRSZWNvcmRbXSA9IE9iamVjdC5mcmVlemUoW10pXG5cbi8qKlxuICogV2hhdCBoZWFkIHNhbXBsaW5nIGRlY2lkZWQgZm9yIGEgc2luZ2xlIHJlY29yZDpcbiAqXG4gKiAtIGBrZWVwYCDigJQgZW1pdCBub3dcbiAqIC0gYGJ1ZmZlcmAg4oCUIGhvbGQgaXQgdW50aWwgdGhlIHJlcXVlc3QncyB0YWlsIHZlcmRpY3QgaXMga25vd25cbiAqIC0gYGRyb3BgIOKAlCBkaXNjYXJkIGl0OyBubyB0YWlsIHJ1bGUgY2FuIGJyaW5nIGl0IGJhY2tcbiAqL1xuZXhwb3J0IHR5cGUgU2FtcGxpbmdEZWNpc2lvbiA9ICdidWZmZXInIHwgJ2Ryb3AnIHwgJ2tlZXAnXG5cbi8qKiBBIGhlYWQtZHJvcHBlZCByZWNvcmQgaGVsZCB1bnRpbCBpdHMgcmVxdWVzdCdzIHRhaWwgdmVyZGljdCBpcyBrbm93bi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVmZmVyZWRSZWNvcmQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAvKiogRWxhcHNlZCB0aW1lIGF0IGNhcHR1cmUsIHNvIGEgcmVwbGF5ZWQgcmVjb3JkIGtlZXBzIGl0cyBvcmlnaW5hbCBkdXJhdGlvbi4gKi9cbiAgZHVyYXRpb25NczogbnVtYmVyXG4gIGxldmVsOiBMb2dMZXZlbFxufVxuXG4vKiogSG93IGEgcmVxdWVzdCBmaW5pc2hlZCwgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBUYWlsU2FtcGxpbmdDb25maWd9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0T3V0Y29tZSB7XG4gIGR1cmF0aW9uTXM6IG51bWJlclxuICBwYXRobmFtZTogc3RyaW5nXG4gIHN0YXR1czogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FtcGxpbmdSdW50aW1lIHtcbiAgLyoqIE1hcmtzIGEgcmVxdWVzdCBhcyBvbmUgdGhhdCB3aWxsIHJlYWNoIHtAbGluayBTYW1wbGluZ1J1bnRpbWUuZmluYWxpemV9LiAqL1xuICBiZWdpbjogKGtleTogb2JqZWN0KSA9PiB2b2lkXG4gIC8qKiBIb2xkcyBhIGhlYWQtZHJvcHBlZCByZWNvcmQsIHVwIHRvIGBtYXhCdWZmZXJlZFBlclJlcXVlc3RgLiAqL1xuICBidWZmZXI6IChrZXk6IG9iamVjdCwgcmVjb3JkOiBCdWZmZXJlZFJlY29yZCkgPT4gdm9pZFxuICBkZWNpZGU6IChsZXZlbDogTG9nTGV2ZWwsIGtleTogb2JqZWN0KSA9PiBTYW1wbGluZ0RlY2lzaW9uXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgdGFpbCB2ZXJkaWN0IGZvciBhIGZpbmlzaGVkIHJlcXVlc3QuIFJldHVybnMgdGhlIHJlY29yZHMgdG9cbiAgICogcmVwbGF5IOKAlCBlbXB0eSB3aGVuIHRoZSBvdXRjb21lIG1hdGNoZWQgbm8gdGFpbCBydWxlIOKAlCBhbmQgbWFya3MgYSByZXNjdWVkXG4gICAqIHJlcXVlc3Qgc28gdGhlIGNhbGxlcidzIG93biBmaW5hbCBsb2cgYnlwYXNzZXMgaGVhZCBzYW1wbGluZyB0b28uXG4gICAqL1xuICBmaW5hbGl6ZTogKGtleTogb2JqZWN0LCBvdXRjb21lOiBSZXF1ZXN0T3V0Y29tZSkgPT4gcmVhZG9ubHkgQnVmZmVyZWRSZWNvcmRbXVxufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRUYWlsIHtcbiAgZHVyYXRpb25Ncz86IG51bWJlclxuICBwYXRocz86IFJlZ0V4cFtdXG4gIHN0YXR1cz86IG51bWJlclxufVxuXG5jb25zdCByZXNvbHZlVGFpbCA9IChcbiAgdGFpbDogVGFpbFNhbXBsaW5nQ29uZmlnIHwgdW5kZWZpbmVkXG4pOiBSZXNvbHZlZFRhaWwgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIXRhaWwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBhdGhzID0gdGFpbC5wYXRocz8ubGVuZ3RoID8gdGFpbC5wYXRocy5tYXAoZ2xvYlRvUmVnRXhwKSA6IHVuZGVmaW5lZFxuICBpZiAoXG4gICAgdGFpbC5kdXJhdGlvbk1zID09PSB1bmRlZmluZWQgJiZcbiAgICB0YWlsLnN0YXR1cyA9PT0gdW5kZWZpbmVkICYmXG4gICAgcGF0aHMgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHJldHVybiB7IGR1cmF0aW9uTXM6IHRhaWwuZHVyYXRpb25NcywgcGF0aHMsIHN0YXR1czogdGFpbC5zdGF0dXMgfVxufVxuXG4vKiogVGFpbCBydWxlcyBhcmUgT1ItZWQ6IGFueSBzaW5nbGUgbWF0Y2ggcmVzY3VlcyB0aGUgd2hvbGUgcmVxdWVzdC4gKi9cbmNvbnN0IG1hdGNoZXNUYWlsID0gKHRhaWw6IFJlc29sdmVkVGFpbCwgb3V0Y29tZTogUmVxdWVzdE91dGNvbWUpOiBib29sZWFuID0+IHtcbiAgaWYgKHRhaWwuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgb3V0Y29tZS5zdGF0dXMgPj0gdGFpbC5zdGF0dXMpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh0YWlsLmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiBvdXRjb21lLmR1cmF0aW9uTXMgPj0gdGFpbC5kdXJhdGlvbk1zKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAodGFpbC5wYXRocykge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0YWlsLnBhdGhzKSB7XG4gICAgICBpZiAocGF0aC50ZXN0KG91dGNvbWUucGF0aG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiogS2VlcHMgb25seSB0aGUgcmF0ZXMgdGhhdCBhY3R1YWxseSBkcm9wIHNvbWV0aGluZy4gKi9cbmNvbnN0IHJlc29sdmVSYXRlcyA9IChcbiAgaGVhZDogU2FtcGxpbmdDb25maWdbJ2hlYWQnXVxuKTogUGFydGlhbDxSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFoZWFkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCByYXRlczogUGFydGlhbDxSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4+ID0ge31cbiAgbGV0IGhhc1JhdGUgPSBmYWxzZVxuICBmb3IgKGNvbnN0IFtsZXZlbCwgcmF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZCkpIHtcbiAgICBpZiAodHlwZW9mIHJhdGUgPT09ICdudW1iZXInICYmIHJhdGUgPCBGVUxMX1JBVEUpIHtcbiAgICAgIHJhdGVzW2xldmVsIGFzIExvZ0xldmVsXSA9IHJhdGVcbiAgICAgIGhhc1JhdGUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhhc1JhdGUgPyByYXRlcyA6IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc2FtcGxpbmcgcnVudGltZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgY29uZmlnIGRyb3BzIG5vdGhpbmcg4oCUXG4gKiB0YWlsIHJ1bGVzIGFsb25lIGFyZSBhIG5vLW9wLCBzaW5jZSBvbmx5IGhlYWQtZHJvcHBlZCByZWNvcmRzIGFyZSBldmVyXG4gKiBidWZmZXJlZC5cbiAqXG4gKiBAcGFyYW0gcmFuZG9tIEluamVjdGFibGUgZm9yIGRldGVybWluaXN0aWMgdGVzdHM7IGRlZmF1bHRzIHRvIGBNYXRoLnJhbmRvbWAuXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlU2FtcGxpbmcgPSAoXG4gIGNvbmZpZzogU2FtcGxpbmdDb25maWcgfCB1bmRlZmluZWQsXG4gIHJhbmRvbTogKCkgPT4gbnVtYmVyID0gTWF0aC5yYW5kb21cbik6IFNhbXBsaW5nUnVudGltZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJhdGVzID0gcmVzb2x2ZVJhdGVzKGNvbmZpZz8uaGVhZClcbiAgaWYgKCFyYXRlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGFpbCA9IHJlc29sdmVUYWlsKGNvbmZpZz8udGFpbClcbiAgY29uc3QgbWF4QnVmZmVyZWQgPVxuICAgIGNvbmZpZz8ubWF4QnVmZmVyZWRQZXJSZXF1ZXN0ID8/IERFRkFVTFRfTUFYX0JVRkZFUkVEX1BFUl9SRVFVRVNUXG5cbiAgY29uc3QgYnVmZmVycyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQnVmZmVyZWRSZWNvcmRbXT4oKVxuICAvLyBPbmx5IHJlcXVlc3RzIHRoZSBwbHVnaW4gb3BlbmVkIChhbmQgd2lsbCBjbG9zZSkgbWF5IGJ1ZmZlcjogV2ViU29ja2V0XG4gIC8vIHBzZXVkby1yZXF1ZXN0cyBhbmQgaGFuZC1yb2xsZWQgYGNyZWF0ZUxvZ2dlcmAgY2FsbGVycyBuZXZlciBmaW5hbGl6ZSwgc29cbiAgLy8gYnVmZmVyaW5nIGZvciB0aGVtIHdvdWxkIGdyb3cgd2l0aG91dCBib3VuZC5cbiAgY29uc3QgaW5GbGlnaHQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KClcbiAgY29uc3QgcmVzY3VlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW4oa2V5KSB7XG4gICAgICBpZiAodGFpbCkge1xuICAgICAgICBpbkZsaWdodC5hZGQoa2V5KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBidWZmZXIoa2V5LCByZWNvcmQpIHtcbiAgICAgIGxldCBidWNrZXQgPSBidWZmZXJzLmdldChrZXkpXG4gICAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgICBidWNrZXQgPSBbXVxuICAgICAgICBidWZmZXJzLnNldChrZXksIGJ1Y2tldClcbiAgICAgIH1cbiAgICAgIGlmIChidWNrZXQubGVuZ3RoID49IG1heEJ1ZmZlcmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgYnVja2V0LnB1c2gocmVjb3JkKVxuICAgIH0sXG5cbiAgICBkZWNpZGUobGV2ZWwsIGtleSkge1xuICAgICAgaWYgKHJlc2N1ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuICdrZWVwJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXRlID0gcmF0ZXNbbGV2ZWxdID8/IEZVTExfUkFURVxuICAgICAgaWYgKHJhdGUgPj0gRlVMTF9SQVRFIHx8IChyYXRlID4gMCAmJiByYW5kb20oKSAqIEZVTExfUkFURSA8IHJhdGUpKSB7XG4gICAgICAgIHJldHVybiAna2VlcCdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhaWwgJiYgaW5GbGlnaHQuaGFzKGtleSkgPyAnYnVmZmVyJyA6ICdkcm9wJ1xuICAgIH0sXG5cbiAgICBmaW5hbGl6ZShrZXksIG91dGNvbWUpIHtcbiAgICAgIGluRmxpZ2h0LmRlbGV0ZShrZXkpXG4gICAgICBjb25zdCBidWNrZXQgPSBidWZmZXJzLmdldChrZXkpXG4gICAgICBidWZmZXJzLmRlbGV0ZShrZXkpXG5cbiAgICAgIGlmICghKHRhaWwgJiYgbWF0Y2hlc1RhaWwodGFpbCwgb3V0Y29tZSkpKSB7XG4gICAgICAgIHJldHVybiBOT19SRUNPUkRTXG4gICAgICB9XG5cbiAgICAgIHJlc2N1ZWQuYWRkKGtleSlcbiAgICAgIHJldHVybiBidWNrZXQgPz8gTk9fUkVDT1JEU1xuICAgIH1cbiAgfVxufVxuIiwKICAgICJjb25zdCBOQU5PU19QRVJfTUlMTEkgPSAxXzAwMF8wMDBcblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgZWxhcHNlZCBzaW5jZSBgYmVmb3JlVGltZWAsIG9yIGAwYCB3aGVuIG5vIHN0YXJ0IHdhcyByZWNvcmRlZFxuICogKGBCaWdJbnQoMClgIGlzIHRoZSBwbHVnaW4ncyBcIm5ldmVyIHN0YXJ0ZWRcIiBzZW50aW5lbCkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbGFwc2VkTXMgPSAoYmVmb3JlVGltZTogYmlnaW50KTogbnVtYmVyID0+XG4gIGJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgID8gMFxuICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gYmVmb3JlVGltZSkgLyBOQU5PU19QRVJfTUlMTElcbiIsCiAgICAiLy8gTG9jYWwgcGFydCDiiaQ2NCwgZG9tYWluIOKJpDI1MywgVExEIDLigJM2MyAoUkZDIDUzMjEgLyAxMDM1LWlzaCBsaW1pdHM7IGJvdW5kZWQgdG8gYXZvaWQgUmVEb1MpXG5jb25zdCBFTUFJTF9SRUdFWCA9XG4gIC9bYS16QS1aMC05Ll8lKy1dezEsNjR9QFthLXpBLVowLTkuLV17MSwyNTN9XFwuW2EtekEtWl17Miw2M30vZ1xuY29uc3QgSVBWNF9SRUdFWCA9XG4gIC8oPzwhW1xcdy8uXSkoPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldP1xcZClcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XT9cXGQpKD8hW1xcdy5dKS9nXG4vKipcbiAqIEJvdW5kZWQgSVB2NjogZWl0aGVyIGFsbCA4IGdyb3Vwcywgb3IgYSBzaW5nbGUgYDo6YCBjb21wcmVzc2lvbi4gUmVxdWlyaW5nXG4gKiBvbmUgb2YgdGhvc2Ugc2hhcGVzIChyYXRoZXIgdGhhbiBcIjIrIGNvbG9uLXNlcGFyYXRlZCBoZXggZ3JvdXBzXCIpIGtlZXBzXG4gKiBjbG9jayB0aW1lcyAoYDEyOjMwOjQ1YCkgYW5kIE1BQyBhZGRyZXNzZXMgKGBhYTpiYjpjYzpkZDplZTpmZmApIGZyb21cbiAqIG1hdGNoaW5nLlxuICovXG5jb25zdCBJUFY2X1JFR0VYID1cbiAgLyg/PCFbXFx3Ol0pKD86KD86WzAtOWEtZl17MSw0fTopezd9WzAtOWEtZl17MSw0fXwoPzpbMC05YS1mXXsxLDR9Oil7MSw3fTooPzpbMC05YS1mXXsxLDR9KD86OlswLTlhLWZdezEsNH0pezAsNn0pP3w6Oig/OlswLTlhLWZdezEsNH0oPzo6WzAtOWEtZl17MSw0fSl7MCw2fSkpKD8hW1xcdzpdKS9naVxuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ1xuY29uc3QgSldUX1JFR0VYID0gL2V5SlthLXpBLVowLTlfLV0rXFwuZXlKW2EtekEtWjAtOV8tXStcXC5bYS16QS1aMC05Xy1dKy9nXG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKiBDYXNlLWluc2Vuc2l0aXZlIGtleS9oZWFkZXIgbmFtZXMgd2hvc2UgVkFMVUVTIGFyZSBhbHdheXMgcmVkYWN0ZWQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRURBQ1RfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdhdXRob3JpemF0aW9uJyxcbiAgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAnY29va2llJyxcbiAgJ3NldC1jb29raWUnLFxuICAneC1hcGkta2V5JyxcbiAgJ2FwaS1rZXknLFxuICAnYXBpa2V5JyxcbiAgJ3gtYXV0aC10b2tlbicsXG4gICdwYXNzd29yZCcsXG4gICdwYXNzd2QnLFxuICAnc2VjcmV0JyxcbiAgJ2NsaWVudC1zZWNyZXQnLFxuICAndG9rZW4nLFxuICAnYWNjZXNzLXRva2VuJyxcbiAgJ3JlZnJlc2gtdG9rZW4nLFxuICAnaWQtdG9rZW4nLFxuICAnc2Vzc2lvbicsXG4gICdzZXNzaW9uLWlkJyxcbiAgJ3ByaXZhdGUta2V5JyxcbiAgJ2NyZWRpdC1jYXJkJyxcbiAgJ2NhcmQtbnVtYmVyJyxcbiAgJ2N2dicsXG4gICdzc24nXG5dXG5cbmNvbnN0IENBTUVMX0NBU0VfQk9VTkRBUllfUkVHRVggPSAvKFthLXowLTldKShbQS1aXSkvZ1xuXG4vKiogTm9ybWFsaXplIGBYX0FwaS1LZXlgIC8gYGFwaUtleWAgc3R5bGUgdmFyaWFudHMgdG8gYHgtYXBpLWtleWAgZm9ybS4gKi9cbmNvbnN0IG5vcm1hbGl6ZUtleU5hbWUgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAga2V5XG4gICAgLnJlcGxhY2UoQ0FNRUxfQ0FTRV9CT1VOREFSWV9SRUdFWCwgJyQxLSQyJylcbiAgICAucmVwbGFjZUFsbCgnXycsICctJylcbiAgICAudG9Mb3dlckNhc2UoKVxuXG5leHBvcnQgY29uc3QgaXNTZW5zaXRpdmVLZXkgPSAoXG4gIGtleTogc3RyaW5nLFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVLZXlOYW1lKGtleSlcbiAgaWYgKERFRkFVTFRfUkVEQUNUX0tFWVMuaW5jbHVkZXMobm9ybWFsaXplZCkpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiAoXG4gICAgZXh0cmFLZXlzPy5zb21lKGV4dHJhS2V5ID0+IG5vcm1hbGl6ZUtleU5hbWUoZXh0cmFLZXkpID09PSBub3JtYWxpemVkKSA/P1xuICAgIGZhbHNlXG4gIClcbn1cblxuLyoqIHBpbm8gcmVkYWN0IHBhdGhzIGZvciBvbmUga2V5OiB0b3AtbGV2ZWwgYW5kIG9uZSBuZXN0aW5nIGxldmVsLiAqL1xuZXhwb3J0IGNvbnN0IGJ1aWxkUGlub1JlZGFjdFBhdGhzID0gKFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBrZXlzID0gWy4uLkRFRkFVTFRfUkVEQUNUX0tFWVMsIC4uLihleHRyYUtleXMgPz8gW10pXVxuICByZXR1cm4ga2V5cy5mbGF0TWFwKGtleSA9PiB7XG4gICAgLy8gcGlubyBwYXRocyBkb24ndCBhbGxvdyBgLWAgaW4gYmFyZSBpZGVudGlmaWVyczsgYnJhY2tldC1xdW90ZSB0aGVtLlxuICAgIGlmIChrZXkuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgcmV0dXJuIFtgW1wiJHtrZXl9XCJdYCwgYCpbXCIke2tleX1cIl1gXVxuICAgIH1cbiAgICByZXR1cm4gW2tleSwgYCouJHtrZXl9YF1cbiAgfSlcbn1cblxuLyoqXG4gKiBIb3N0IGFuZCB1c2VyaW5mbyBjYW5ub3QgY29udGFpbiBgW1JFREFDVEVEXWAg4oCUIGBbYCBiZWdpbnMgYW4gSVB2NiBsaXRlcmFsIGluIFVSTHMgYW5kIGJyZWFrcyBwYXJzaW5nLlxuICovXG5jb25zdCBVUkxfU0FGRV9SRURBQ1QgPSAncmVkYWN0ZWQnXG5cbmNvbnN0IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICByZWRhY3RTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuXG4vKiogQXBwbHkgUElJIHJlZGFjdGlvbiB0byBhIHJlcXVlc3QgVVJMIHdoaWxlIGtlZXBpbmcgdGhlIHJlc3VsdCBwYXJzZWFibGUgYnkgdGhlIFVSTC9SZXF1ZXN0IGNvbnN0cnVjdG9ycy4gKi9cbmNvbnN0IHJlZGFjdFJlcXVlc3RVcmwgPSAoXG4gIHVybFN0cmluZzogc3RyaW5nLFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmxTdHJpbmcpXG4gICAgaWYgKHUudXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICB1LnVzZXJuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnVzZXJuYW1lKVxuICAgIH1cbiAgICBpZiAodS5wYXNzd29yZCAhPT0gJycpIHtcbiAgICAgIHUucGFzc3dvcmQgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUucGFzc3dvcmQpXG4gICAgfVxuICAgIHUuaG9zdG5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUuaG9zdG5hbWUpXG4gICAgdS5wYXRobmFtZSA9IHJlZGFjdFN0cmluZyh1LnBhdGhuYW1lKVxuICAgIC8vIGBzZWFyY2hQYXJhbXMuc2V0YCByZS1zZXJpYWxpemVzIHRoZSB3aG9sZSBxdWVyeSBzdHJpbmcsIHNvIHJlZGFjdFxuICAgIC8vIGRlY29kZWQgdmFsdWVzIGRpcmVjdGx5IHJhdGhlciB0aGFuIHJlLXJ1bm5pbmcgcGF0dGVybiByZWRhY3Rpb24gb25cbiAgICAvLyBgdS5zZWFyY2hgIGFmdGVyd2FyZCAod2hpY2ggd291bGQgc2VlIGFscmVhZHkgcGVyY2VudC1lbmNvZGVkIHRleHQpLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIFsuLi51LnNlYXJjaFBhcmFtcy5rZXlzKCldKSB7XG4gICAgICBpZiAoaXNTZW5zaXRpdmVLZXkoa2V5LCBleHRyYUtleXMpKSB7XG4gICAgICAgIHUuc2VhcmNoUGFyYW1zLnNldChrZXksIFVSTF9TQUZFX1JFREFDVClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdS5zZWFyY2hQYXJhbXMuZ2V0KGtleSlcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByZWRhY3RlZFZhbHVlID0gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgICAgICBpZiAocmVkYWN0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICB1LnNlYXJjaFBhcmFtcy5zZXQoa2V5LCByZWRhY3RlZFZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHUuaGFzaCA9IHJlZGFjdFN0cmluZyh1Lmhhc2gpXG4gICAgcmV0dXJuIHUudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHVybFN0cmluZykucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG4gIH1cbn1cblxuLyoqIEx1aG4gY2hlY2tzdW07IGBkaWdpdHNgIG11c3QgY29udGFpbiBvbmx5IGAwLTlgIGFuZCBsZW5ndGggaW4gUEFOIHJhbmdlLiAqL1xuY29uc3QgcGFzc2VzTHVobiA9IChkaWdpdHM6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGlnaXRzLmxlbmd0aCA8IFBBTl9NSU5fTEVOIHx8IGRpZ2l0cy5sZW5ndGggPiBQQU5fTUFYX0xFTikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IHN1bSA9IDBcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IDU3KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IG4gPSBjb2RlIC0gNDhcbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBuICo9IDJcbiAgICAgIGlmIChuID4gOSkge1xuICAgICAgICBuIC09IDlcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtICs9IG5cbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlXG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDBcbn1cblxuY29uc3QgcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVgsIG1hdGNoID0+IHtcbiAgICBjb25zdCBkaWdpdHMgPSBtYXRjaC5yZXBsYWNlKC9cXEQvZywgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuLyoqIFJldHVybnMgYHRleHRgIHVuY2hhbmdlZCAoc2FtZSB2YWx1ZSkgd2hlbiBub3RoaW5nIG1hdGNoZWQg4oCUIGNhbGxlcnMgY2FuIGNvbXBhcmUgYD09PSBpbnB1dGAuICovXG5leHBvcnQgY29uc3QgcmVkYWN0U3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZXh0XG5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU1BSUxfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjRfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjZfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzKHJlc3VsdClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSldUX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gRXJyb3JzIGFyZSBleGVtcHQgZnJvbSB0aGUgaWRlbnRpdHkgZmFzdCBwYXRoIGJlbG93OiBhIHJlZGFjdGVkIEVycm9yIGlzIGFsd2F5cyBjb25zdHJ1Y3RlZFxuLy8gZnJlc2ggKGV2ZW4gd2hlbiBub3RoaW5nIGNoYW5nZWQpIHNvIGNvbnN1bWVycyBuZXZlciByZWNlaXZlIHRoZSBvcmlnaW5hbCwgcG90ZW50aWFsbHlcbi8vIHN0YWNrLXRyYWNlLWNhcnJ5aW5nIGluc3RhbmNlIGJ5IHJlZmVyZW5jZS5cbmNvbnN0IHJlZGFjdEVycm9yQ2xvbmUgPSAoXG4gIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3IubWVzc2FnZSlcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWxFcnJvcikgYXMgb2JqZWN0XG4gIGNvbnN0IG5ld0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90bykgYXMgRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIG5ld0Vycm9yLm1lc3NhZ2UgPSByZWRhY3RlZE1lc3NhZ2VcbiAgbmV3RXJyb3IubmFtZSA9IG9yaWdpbmFsRXJyb3IubmFtZVxuXG4gIGlmIChvcmlnaW5hbEVycm9yLnN0YWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICBuZXdFcnJvci5zdGFjayA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLnN0YWNrKVxuICB9XG5cbiAgY29uc3QgZXJyb3JSZWNvcmQgPSBvcmlnaW5hbEVycm9yIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvclJlY29yZCkpIHtcbiAgICBpZiAoa2V5ID09PSAnbWVzc2FnZScgfHwga2V5ID09PSAnbmFtZScgfHwga2V5ID09PSAnc3RhY2snKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGVycm9yUmVjb3JkLCBrZXkpXG4gICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZGVzY3JpcHRvci5nZXQgIT09IHVuZGVmaW5lZCB8fCBkZXNjcmlwdG9yLnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3RXJyb3IsIGtleSwgZGVzY3JpcHRvcilcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgcmVkYWN0ZWRWYWx1ZSA9IGlzU2Vuc2l0aXZlS2V5KGtleSwgZXh0cmFLZXlzKVxuICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICA6IHJlZGFjdElubmVyKGRlc2NyaXB0b3IudmFsdWUsIGluUHJvZ3Jlc3MsIGV4dHJhS2V5cylcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFcnJvciwga2V5LCB7XG4gICAgICAuLi5kZXNjcmlwdG9yLFxuICAgICAgdmFsdWU6IHJlZGFjdGVkVmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5ld0Vycm9yXG59XG5cbi8qKlxuICogUmVkYWN0cyBlYWNoIGl0ZW07IHJldHVybnMgdGhlIE9SSUdJTkFMIGFycmF5IHJlZmVyZW5jZSB3aGVuIG5vIGl0ZW0gY2hhbmdlZCAoemVyb1xuICogYWxsb2NhdGlvbnMgZm9yIHRoZSBjb21tb24gbm8tUElJIGNhc2UpLiBBIG5ldyBhcnJheSBpcyBtYXRlcmlhbGl6ZWQgbGF6aWx5LCBzdGFydGluZyBmcm9tXG4gKiB0aGUgZmlyc3QgaXRlbSB0aGF0IGNoYW5nZXMg4oCUIGl0ZW1zIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBrbm93bi11bmNoYW5nZWQsIHNvIHRoZXkncmUgY29waWVkXG4gKiBmcm9tIGB2YWx1ZWAgYXMtaXMgcmF0aGVyIHRoYW4gcmVjb21wdXRlZC5cbiAqL1xuY29uc3QgcmVkYWN0QXJyYXlJdGVtcyA9IChcbiAgdmFsdWU6IHVua25vd25bXSxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogdW5rbm93bltdID0+IHtcbiAgbGV0IHJlc3VsdDogdW5rbm93bltdIHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIG9yaWdpbmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdElubmVyKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkICYmIHJlZGFjdGVkICE9PSBvcmlnaW5hbCkge1xuICAgICAgcmVzdWx0ID0gdmFsdWUuc2xpY2UoMCwgaW5kZXgpXG4gICAgfVxuICAgIHJlc3VsdD8ucHVzaChyZWRhY3RlZClcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPz8gdmFsdWVcbn1cblxuLyoqIFNhbWUgbGF6eS1tYXRlcmlhbGl6YXRpb24gc3RyYXRlZ3kgYXMge0BsaW5rIHJlZGFjdEFycmF5SXRlbXN9LCBmb3IgcGxhaW4gb2JqZWN0cy4gKi9cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBleHRyYUtleXM/OiByZWFkb25seSBzdHJpbmdbXVxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpXG4gIGxldCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGtleV0gb2Yga2V5cy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHJlY29yZFZhbHVlW2tleV1cbiAgICBjb25zdCBzZW5zaXRpdmUgPSBpc1NlbnNpdGl2ZUtleShrZXksIGV4dHJhS2V5cylcbiAgICBjb25zdCByZWRhY3RlZCA9IHNlbnNpdGl2ZVxuICAgICAgPyBSRURBQ1RFRF9URVhUXG4gICAgICA6IHJlZGFjdElubmVyKG9yaWdpbmFsLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG5cbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgJiYgKHNlbnNpdGl2ZSB8fCByZWRhY3RlZCAhPT0gb3JpZ2luYWwpKSB7XG4gICAgICByZXN1bHQgPSB7fVxuICAgICAgZm9yIChjb25zdCBwcmlvcktleSBvZiBrZXlzLnNsaWNlKDAsIGluZGV4KSkge1xuICAgICAgICByZXN1bHRbcHJpb3JLZXldID0gcmVjb3JkVmFsdWVbcHJpb3JLZXldXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0W2tleV0gPSByZWRhY3RlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPz8gcmVjb3JkVmFsdWVcbn1cblxuY29uc3Qgd2l0aFJlZW50cmFuY3lHdWFyZCA9IDxUPihcbiAgb2JqOiBvYmplY3QsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgcnVuOiAoKSA9PiBUXG4pOiBUID0+IHtcbiAgaW5Qcm9ncmVzcy5hZGQob2JqKVxuICB0cnkge1xuICAgIHJldHVybiBydW4oKVxuICB9IGZpbmFsbHkge1xuICAgIGluUHJvZ3Jlc3MuZGVsZXRlKG9iailcbiAgfVxufVxuXG5jb25zdCByZWRhY3RJbm5lciA9IDxUPihcbiAgdmFsdWU6IFQsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgLy8gRGF0ZXMgY2Fycnkgbm8gcmVkYWN0YWJsZSBzdHJpbmcgY29udGVudCBhbmQgYXJlIG5ldmVyIG11dGF0ZWQgYnkgdGhpcyBtb2R1bGUsIHNvIHRoZXlcbiAgICAvLyBwYXNzIHRocm91Z2ggYnkgcmVmZXJlbmNlIChwYXJ0IG9mIHRoZSBpZGVudGl0eSBmYXN0IHBhdGgpIGluc3RlYWQgb2YgYmVpbmcgZGVmZW5zaXZlbHlcbiAgICAvLyBjbG9uZWQgYXMgYmVmb3JlLlxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcywgZXh0cmFLZXlzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RBcnJheUl0ZW1zKHZhbHVlLCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICByZWRhY3RSZWNvcmRFbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzLCBleHRyYUtleXMpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQsIGV4dHJhS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdKTogVCA9PlxuICByZWRhY3RJbm5lcih2YWx1ZSwgbmV3IFdlYWtTZXQoKSwgZXh0cmFLZXlzKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMLCBtZXRob2QgYW5kIGhlYWRlcnMgZm9yIGxvZ2dpbmcgd2l0aCB0aGUgc2FtZSBzdHJpbmcgcmVkYWN0aW9uIGFzIHtAbGluayByZWRhY3R9LlxuICogVGhlIHJldHVybmVkIHJlcXVlc3QgaXMgYSBsb2dnaW5nLW9ubHkgYXJ0aWZhY3QgY2FycnlpbmcgdXJsL21ldGhvZC9oZWFkZXJzL3NpZ25hbDsgaXQgaW50ZW50aW9uYWxseVxuICogb21pdHMgdGhlIGJvZHkgc28gaXQgbmV2ZXIgcmUtdXNlcyB0aGUgb3JpZ2luYWwgKHBvc3NpYmx5IGFscmVhZHktY29uc3VtZWQpIHJlcXVlc3Qgc3RyZWFtLiBUaGVcbiAqIG9yaWdpbmFsIHJlcXVlc3QgaXMgbGVmdCB1bnRvdWNoZWQgYW5kIHJlbWFpbnMgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgZXh0cmFLZXlzPzogcmVhZG9ubHkgc3RyaW5nW11cbik6IFJlcXVlc3QgPT4ge1xuICBjb25zdCByZWRhY3RlZFVybCA9IHJlZGFjdFJlcXVlc3RVcmwocmVxdWVzdC51cmwsIGV4dHJhS2V5cylcbiAgY29uc3QgbmV4dEhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIGxldCBoZWFkZXJzQ2hhbmdlZCA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IGlzU2Vuc2l0aXZlS2V5KG5hbWUsIGV4dHJhS2V5cylcbiAgICAgID8gUkVEQUNURURfVEVYVFxuICAgICAgOiByZWRhY3RTdHJpbmcodmFsdWUpXG4gICAgaWYgKHJlZGFjdGVkICE9PSB2YWx1ZSkge1xuICAgICAgaGVhZGVyc0NoYW5nZWQgPSB0cnVlXG4gICAgfVxuICAgIG5leHRIZWFkZXJzLnNldChuYW1lLCByZWRhY3RlZClcbiAgfVxuXG4gIGNvbnN0IHJlZGFjdGVkTWV0aG9kID0gcmVkYWN0U3RyaW5nKHJlcXVlc3QubWV0aG9kKVxuICBjb25zdCB1cmxDaGFuZ2VkID0gcmVkYWN0ZWRVcmwgIT09IHJlcXVlc3QudXJsXG4gIGNvbnN0IG1ldGhvZENoYW5nZWQgPSByZWRhY3RlZE1ldGhvZCAhPT0gcmVxdWVzdC5tZXRob2RcblxuICBpZiAoISh1cmxDaGFuZ2VkIHx8IGhlYWRlcnNDaGFuZ2VkIHx8IG1ldGhvZENoYW5nZWQpKSB7XG4gICAgcmV0dXJuIHJlcXVlc3RcbiAgfVxuXG4gIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIG1ldGhvZDogcmVkYWN0ZWRNZXRob2QsXG4gICAgcmVkaXJlY3Q6IHJlcXVlc3QucmVkaXJlY3QsXG4gICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbFxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHJlZGFjdGVkVXJsLCBpbml0KVxufVxuIiwKICAgICJpbXBvcnQgeyBTVEFUVVNfQ09ERVMgfSBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgaXNTdHJ1Y3R1cmVkRXJyb3IsIHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB7IHNhbml0aXplTG9nVGV4dCB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IERFRkFVTFRfU0xPV19NUyA9IDUwMFxuY29uc3QgREVGQVVMVF9WRVJZX1NMT1dfTVMgPSAxMDAwXG5jb25zdCBNRVRIT0RfUEFEID0gN1xuXG5jb25zdCBERUZBVUxUX0xPR19GT1JNQVQgPVxuICAne25vd30ge3NlcnZpY2V9e2ljb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge2R1cmF0aW9ufSB7bWVzc2FnZX17c3BlZWR9J1xuXG5jb25zdCBMT0dfRk9STUFUX1JFR0VYID1cbiAgL1xceyhub3d8ZXBvY2h8bGV2ZWx8aWNvbnxkdXJhdGlvbnxtZXRob2R8cGF0aG5hbWV8cGF0aHxxdWVyeXxzdGF0dXN8c3RhdHVzVGV4dHxtZXNzYWdlfGlwfGNvbnRleHR8c2VydmljZXxzcGVlZHxyZXF1ZXN0SWQpXFx9L2dcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0ZWRMb2dPdXRwdXQge1xuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdXG4gIG1haW46IHN0cmluZ1xufVxuXG5jb25zdCBzaG91bGRVc2VDb2xvcnMgPSAob3B0aW9uczogT3B0aW9ucyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCBlbmFibGVkQnlDb25maWcgPSBjb25maWc/LnVzZUNvbG9ycyA/PyB0cnVlXG5cbiAgLy8gQXZvaWQgQU5TSSBzZXF1ZW5jZXMgaW4gbm9uLWludGVyYWN0aXZlIG91dHB1dCAocGlwZXMsIENJIGxvZ3MsIGZpbGVzKS5cbiAgY29uc3QgaXNUdHkgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlXG4gIHJldHVybiBlbmFibGVkQnlDb25maWcgJiYgaXNUdHlcbn1cblxuLy8gcGluby1wcmV0dHkncyBzaG9ydGhhbmQgZm9yIGB5eXl5LW1tLWRkIEhIOk1NOnNzLlNTU2AgKG1pbnVzIHRoZSBgb2Bcbi8vIHRpbWV6b25lLW9mZnNldCB0b2tlbiwgd2hpY2ggdGhpcyBmb3JtYXR0ZXIgZG9lcyBub3Qgc3VwcG9ydCkuXG5jb25zdCBTVEFOREFSRF9USU1FU1RBTVBfUEFUVEVSTiA9ICd5eXl5LW1tLWRkIEhIOk1NOnNzLlNTUydcblxuY29uc3QgU1lTX1BSRUZJWF9SRUdFWCA9IC9ec3lzOi9pXG5jb25zdCBVVENfUFJFRklYX1JFR0VYID0gL151dGM6L2lcblxuLyoqXG4gKiBTcGxpdHMgYSBgdGltZXN0YW1wLnRyYW5zbGF0ZVRpbWVgIHZhbHVlIGludG8gdGhlIGxpdGVyYWwgcGF0dGVybiB0b1xuICogZXhwYW5kIGFuZCB3aGV0aGVyIGl0IHNob3VsZCBiZSByZWFkIHdpdGggVVRDIGdldHRlcnMuIE1pcnJvcnNcbiAqIHBpbm8tcHJldHR5J3MgYFNZUzpgL2BVVEM6YCBwcmVmaXhlcyAoY2FzZS1pbnNlbnNpdGl2ZSk7IGEgYmFyZSBwYXR0ZXJuXG4gKiBrZWVwcyB0aGlzIGZvcm1hdHRlcidzIGhpc3RvcmljYWwgbG9jYWwtdGltZSBiZWhhdmlvdXIuXG4gKi9cbmNvbnN0IHJlc29sdmVUaW1lc3RhbXBQYXR0ZXJuID0gKFxuICBwYXR0ZXJuOiBzdHJpbmdcbik6IHsgcGF0dGVybjogc3RyaW5nOyB1dGM6IGJvb2xlYW4gfSA9PiB7XG4gIGxldCByZXN0ID0gcGF0dGVyblxuICBsZXQgdXRjID0gZmFsc2VcblxuICBpZiAoU1lTX1BSRUZJWF9SRUdFWC50ZXN0KHJlc3QpKSB7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoJ3N5czonLmxlbmd0aClcbiAgfSBlbHNlIGlmIChVVENfUFJFRklYX1JFR0VYLnRlc3QocmVzdCkpIHtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgndXRjOicubGVuZ3RoKVxuICAgIHV0YyA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkID0gcmVzdCA9PT0gJ3N0YW5kYXJkJyA/IFNUQU5EQVJEX1RJTUVTVEFNUF9QQVRURVJOIDogcmVzdFxuICByZXR1cm4geyBwYXR0ZXJuOiByZXNvbHZlZCwgdXRjIH1cbn1cblxuY29uc3QgZm9ybWF0VGltZXN0YW1wID0gKGRhdGU6IERhdGUsIHBhdHRlcm4/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cblxuICBjb25zdCB7IHBhdHRlcm46IHJlc29sdmVkLCB1dGMgfSA9IHJlc29sdmVUaW1lc3RhbXBQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyh1dGMgPyBkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgOiBkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMigodXRjID8gZGF0ZS5nZXRVVENNb250aCgpIDogZGF0ZS5nZXRNb250aCgpKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMih1dGMgPyBkYXRlLmdldFVUQ0RhdGUoKSA6IGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIodXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIodXRjID8gZGF0ZS5nZXRVVENNaW51dGVzKCkgOiBkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKHV0YyA/IGRhdGUuZ2V0VVRDU2Vjb25kcygpIDogZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IHBhZDModXRjID8gZGF0ZS5nZXRVVENNaWxsaXNlY29uZHMoKSA6IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHJlc29sdmVkXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbi8qKiBSZXNvbHZlcyBjbGllbnQgSVAgZnJvbSB4LWZvcndhcmRlZC1mb3IgKGZpcnN0IElQKSBvciB4LXJlYWwtaXAuIEVtcHR5IHdoZW4gbmVpdGhlciBoZWFkZXIgaXMgc2V0IChlLmcuIGxvY2FsaG9zdCkuICovXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0SW5mbyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGZvcndhcmRlZFxuICAgID8gKGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJycpXG4gICAgOiAocmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJycpXG4gIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoY2FuZGlkYXRlLCA2NClcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdER1cmF0aW9uID0gKG1zOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAobXMgPj0gMTAwMCkge1xuICAgIGNvbnN0IHNlYyA9IG1zIC8gMTAwMFxuICAgIGlmIChzZWMgPj0gMTApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKHNlYyl9c2BcbiAgICB9XG4gICAgY29uc3Qgb25lRGVjaW1hbCA9IHNlYy50b0ZpeGVkKDEpXG4gICAgcmV0dXJuIG9uZURlY2ltYWwuZW5kc1dpdGgoJy4wJykgPyBgJHtNYXRoLnJvdW5kKHNlYyl9c2AgOiBgJHtvbmVEZWNpbWFsfXNgXG4gIH1cbiAgaWYgKG1zID4gMCAmJiBtcyA8IDEpIHtcbiAgICByZXR1cm4gYCR7bXMudG9GaXhlZCgyKX1tc2BcbiAgfVxuICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyl9bXNgXG59XG5cbmNvbnN0IGdldFNsb3dUaHJlc2hvbGRzID0gKFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHNsb3c6IG51bWJlcjsgdmVyeVNsb3c6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgcmV0dXJuIHtcbiAgICBzbG93OiBjb25maWc/LnNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9TTE9XX01TLFxuICAgIHZlcnlTbG93OiBjb25maWc/LnZlcnlTbG93VGhyZXNob2xkID8/IERFRkFVTFRfVkVSWV9TTE9XX01TXG4gIH1cbn1cblxuY29uc3QgY29sb3JEdXJhdGlvblRleHQgPSAoXG4gIG1zOiBudW1iZXIsXG4gIHVzZUNvbG9yczogYm9vbGVhbixcbiAgc2xvdzogbnVtYmVyLFxuICB2ZXJ5U2xvdzogbnVtYmVyXG4pOiB7IHRleHQ6IHN0cmluZzsgaXNWZXJ5U2xvdzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcmF3ID0gZm9ybWF0RHVyYXRpb24obXMpXG4gIGNvbnN0IGlzVmVyeVNsb3cgPSBtcyA+PSB2ZXJ5U2xvd1xuXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogcmF3IH1cbiAgfVxuXG4gIGxldCBjb2xvcmVkID0gcmF3XG4gIGlmIChtcyA8IHNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsuZ3JlZW4ocmF3KVxuICB9IGVsc2UgaWYgKG1zIDwgdmVyeVNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsueWVsbG93KHJhdylcbiAgfSBlbHNlIHtcbiAgICBjb2xvcmVkID0gY2hhbGsucmVkLmJvbGQocmF3KVxuICB9XG5cbiAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogY29sb3JlZCB9XG59XG5cbmNvbnN0IGdldFNwZWVkVG9rZW4gPSAoaXNWZXJ5U2xvdzogYm9vbGVhbiwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFpc1ZlcnlTbG93KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYmFkZ2UgPSAn4pqhIHNsb3cnXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAgJHtiYWRnZX1gXG4gIH1cbiAgcmV0dXJuIGAgJHtjaGFsay55ZWxsb3coYmFkZ2UpfWBcbn1cblxuLyoqIExvZ2l4bHlzaWEgYnJhbmQ6IGZveCBlbW9qaSB3aXRoIGxldmVsLWNvbG9yZWQgYmFja2dyb3VuZCB3aGVuIGNvbG9ycyBhcmUgZW5hYmxlZC4gKi9cbmNvbnN0IGdldExldmVsSWNvbiA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuICfwn6aKJ1xuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKCcg8J+miiAnKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBsZXZlbFxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbWV0aG9kXG4gIH1cblxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3cuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xuICAgIHJldHVybiBjaGFsay5yZWQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcbiAgICByZXR1cm4gY2hhbGsubWFnZW50YS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZS5ib2xkKHVwcGVyKVxufVxuXG4vKipcbiAqIENvbG9ycyB0aGUgbWV0aG9kLCB0aGVuIHBhZHMgYWZ0ZXJ3YXJkLCBzbyB0aGUgcGFkZGluZyBuZXZlciBzaXRzIGluc2lkZSB0aGVcbiAqIEFOU0ktd3JhcHBlZCB0ZXh0IChwYWRkaW5nIHRoZSBhbHJlYWR5LWNvbG9yZWQvcGFkZGVkIHN0cmluZyBmaXJzdCB3b3VsZCBtYWtlXG4gKiBgZ2V0Q29sb3JlZE1ldGhvZGAncyBjb21wYXJpc29ucyBhZ2FpbnN0IGxpdGVyYWxzIGxpa2UgYCdHRVQnYCBhbHdheXMgbWlzcykuXG4gKi9cbmNvbnN0IGdldENvbG9yZWRNZXRob2RUb2tlbiA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBjb25zdCBwYWRkaW5nID0gJyAnLnJlcGVhdChNYXRoLm1heCgwLCBNRVRIT0RfUEFEIC0gdXBwZXIubGVuZ3RoKSlcbiAgcmV0dXJuIGdldENvbG9yZWRNZXRob2QodXBwZXIsIHVzZUNvbG9ycykgKyBwYWRkaW5nXG59XG5cbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChudW1lcmljID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheSh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1c0NvZGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRleHQgPSBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV1cbiAgcmV0dXJuIHRleHQgPz8gJydcbn1cblxuY29uc3QgZ2V0U2VydmljZVRva2VuID0gKG9wdGlvbnM6IE9wdGlvbnMsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLmNvbmZpZz8uc2VydmljZT8udHJpbSgpXG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IGBbJHtuYW1lfV1gXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAke2JyYWNrZXRlZH0gYFxuICB9XG4gIHJldHVybiBgJHtjaGFsay5kaW0oYnJhY2tldGVkKX0gYFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdENvbnRleHQge1xuICBmb3JtYXQ6IHN0cmluZ1xuICBzZXJ2aWNlVG9rZW46IHN0cmluZ1xuICBzbG93VGhyZXNob2xkOiBudW1iZXJcbiAgLyoqIEZvcm1hdCB0b2tlbnMgYWN0dWFsbHkgcHJlc2VudCBpbiBgZm9ybWF0YCAoc2VlIHtAbGluayBMT0dfRk9STUFUX1JFR0VYfSkuICovXG4gIHRva2VuczogU2V0PHN0cmluZz5cbiAgdXNlQ29sb3JzOiBib29sZWFuXG4gIHZlcnlTbG93VGhyZXNob2xkOiBudW1iZXJcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBjb2xvcnMvZm9ybWF0L3RocmVzaG9sZHMvc2VydmljZSBvbmNlIHBlciBsb2dnZXIgaW5zdGFuY2UgaW5zdGVhZCBvZiBwZXIgbG9nIGxpbmUuXG4gKiBTYWZlIHRvIGhvaXN0OiBUVFktbmVzcyBhbmQgY29uZmlnIGRvbid0IGNoYW5nZSBhY3Jvc3MgYSBwcm9jZXNzJ3MgbGlmZXRpbWUsIHNvIGZyZWV6aW5nIHRoZVxuICogY29sb3JzIGRlY2lzaW9uIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG1hdGNoZXMgcmVhbCBwcm9jZXNzIGxpZmVjeWNsZXMuXG4gKlxuICogTk9URTogYWRkaW5nIGEgbmV3IGZvcm1hdCB0b2tlbiByZXF1aXJlcyBhZGRpbmcgaXQgYm90aCB0byB7QGxpbmsgTE9HX0ZPUk1BVF9SRUdFWH0gYW5kIHRvIHRoZVxuICogdG9rZW4tZ2F0aW5nIGNoZWNrcyBpbiB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBiZWxvdy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm1hdENvbnRleHQgPSAob3B0aW9uczogT3B0aW9ucyk6IEZvcm1hdENvbnRleHQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID0gY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz8gREVGQVVMVF9MT0dfRk9STUFUXG4gIGNvbnN0IHRva2VucyA9IG5ldyBTZXQoZm9ybWF0Lm1hdGNoKExPR19GT1JNQVRfUkVHRVgpID8/IFtdKVxuICBjb25zdCB7IHNsb3c6IHNsb3dUaHJlc2hvbGQsIHZlcnlTbG93OiB2ZXJ5U2xvd1RocmVzaG9sZCB9ID1cbiAgICBnZXRTbG93VGhyZXNob2xkcyhvcHRpb25zKVxuICBjb25zdCBzZXJ2aWNlVG9rZW4gPSBnZXRTZXJ2aWNlVG9rZW4ob3B0aW9ucywgdXNlQ29sb3JzKVxuXG4gIHJldHVybiB7XG4gICAgZm9ybWF0LFxuICAgIHNlcnZpY2VUb2tlbixcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHRva2VucyxcbiAgICB1c2VDb2xvcnMsXG4gICAgdmVyeVNsb3dUaHJlc2hvbGRcbiAgfVxufVxuXG5jb25zdCBzdHJpbmdpZnlUcmVlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQodmFsdWUpXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHNhbml0aXplTG9nVGV4dCh2YWx1ZS5tZXNzYWdlKVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNhbml0aXplTG9nVGV4dChKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBzYW5pdGl6ZUxvZ1RleHQoU3RyaW5nKHZhbHVlKSlcbiAgfVxufVxuXG4vKiogTmVzdGVkIG9iamVjdHMgdG8gZXhwYW5kIGluIHRoZSBjb250ZXh0IHRyZWUgKGV4Y2x1ZGVzIEFycmF5cywgRXJyb3IsIERhdGUpLiAqL1xuY29uc3QgaXNFeHBhbmRhYmxlT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSlcblxuY29uc3QgY29sbGVjdENvbnRleHRFbnRyaWVzID0gKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVwdGhSZW1haW5pbmc6IG51bWJlclxuKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3Qgb3V0OiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3Qga2V5ID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2t9YCA6IGtcbiAgICBjb25zdCBleHBhbmRhYmxlID0gaXNFeHBhbmRhYmxlT2JqZWN0KHYpICYmIGRlcHRoUmVtYWluaW5nID4gMVxuXG4gICAgaWYgKGV4cGFuZGFibGUpIHtcbiAgICAgIG91dC5wdXNoKC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyh2LCBrZXksIGRlcHRoUmVtYWluaW5nIC0gMSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5wdXNoKFtrZXksIHN0cmluZ2lmeVRyZWVWYWx1ZSh2KV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzID0gKFxuICBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10sXG4gIHVzZUNvbG9yczogYm9vbGVhblxuKTogc3RyaW5nW10gPT4ge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGxhc3QgPSBlbnRyaWVzLmxlbmd0aCAtIDFcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgYnJhbmNoID0gaSA9PT0gbGFzdCA/ICfilJTilIAnIDogJ+KUnOKUgCdcbiAgICBjb25zdCBwYWlyID0gZW50cmllc1tpXVxuICAgIGlmICghcGFpcikge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgW2ssIHZdID0gcGFpclxuICAgIGNvbnN0IGtleVBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay5jeWFuKGspIDoga1xuICAgIGNvbnN0IHZhbFBhcnQgPSB1c2VDb2xvcnMgPyBjaGFsay53aGl0ZSh2KSA6IHZcbiAgICBsaW5lcy5wdXNoKGAgICR7YnJhbmNofSAke2tleVBhcnR9ICAke3ZhbFBhcnR9YClcbiAgfVxuICByZXR1cm4gbGluZXNcbn1cblxuY29uc3QgY29sbGVjdFN0cnVjdHVyZWRFcnJvckVudHJpZXMgPSAoZXJyb3I6IHVua25vd24pOiBbc3RyaW5nLCBzdHJpbmddW10gPT4ge1xuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuICBjb25zdCBtc2cgPSBwYXJzZUVycm9yKGVycm9yKVxuICBpZiAobXNnKSB7XG4gICAgZW50cmllcy5wdXNoKFsnZXJyb3InLCBzYW5pdGl6ZUxvZ1RleHQobXNnKV0pXG4gIH1cbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKGVycm9yKSkge1xuICAgIGlmIChlcnJvci5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmNvZGUnLCBTdHJpbmcoZXJyb3IuY29kZSldKVxuICAgIH1cbiAgICBpZiAoZXJyb3Iud2h5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLndoeScsIFN0cmluZyhlcnJvci53aHkpXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5maXgnLCBTdHJpbmcoZXJyb3IuZml4KV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5saW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmxpbmsnLCBTdHJpbmcoZXJyb3IubGluayldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IuaW50ZXJuYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuaW50ZXJuYWwnLCBzdHJpbmdpZnlUcmVlVmFsdWUoZXJyb3IuaW50ZXJuYWwpXSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgdXNlQ29sb3JzOiBib29sZWFuID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChvcHRpb25zLmNvbmZpZz8uc2hvd0NvbnRleHRUcmVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcblxuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuXG4gIGNvbnN0IGN0eCA9IGRhdGEuY29udGV4dFxuICBpZiAoXG4gICAgY3R4ICYmXG4gICAgdHlwZW9mIGN0eCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShjdHgpICYmXG4gICAgT2JqZWN0LmtleXMoY3R4IGFzIG9iamVjdCkubGVuZ3RoID4gMCAmJlxuICAgIGRlcHRoID49IDFcbiAgKSB7XG4gICAgZW50cmllcy5wdXNoKFxuICAgICAgLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJycsIGRlcHRoKVxuICAgIClcbiAgfVxuXG4gIC8vIFdBUk5JTkcgYXMgd2VsbCBhcyBFUlJPUjogYSA0eHggaXMgbG9nZ2VkIGF0IFdBUk5JTkcsIGFuZCBpdHNcbiAgLy8gYHdoeWAvYGZpeGAvYGxpbmtgIGFyZSBleGFjdGx5IGFzIHdvcnRoIHNob3dpbmcgYXMgYSA1eHgncy5cbiAgaWYgKChsZXZlbCA9PT0gJ0VSUk9SJyB8fCBsZXZlbCA9PT0gJ1dBUk5JTkcnKSAmJiBkYXRhLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbnRyaWVzLnB1c2goLi4uY29sbGVjdFN0cnVjdHVyZWRFcnJvckVudHJpZXMoZGF0YS5lcnJvcikpXG4gIH1cblxuICByZXR1cm4gZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzKGVudHJpZXMsIHVzZUNvbG9ycylcbn1cblxuY29uc3QgZ2V0Q29udGV4dFN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuICcnXG59XG5cbi8qKiBSYXcgZHVyYXRpb24vVVJMIHBhcnRzIGNvbXB1dGVkIG9uY2UgcGVyIGxvZyBlbWlzc2lvbiBieSB0aGUgY2FsbGVyIChzZWUgYGxvZ2dlci9pbmRleC50c2ApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVjb21wdXRlZExvZ1BhcnRzIHtcbiAgZHVyYXRpb25NczogbnVtYmVyXG4gIHBhdGhuYW1lOiBzdHJpbmdcbiAgc2VhcmNoOiBzdHJpbmdcbn1cblxuLyoqIGB7bm93fWAvYHtlcG9jaH1gIHNoYXJlIGEgc2luZ2xlIGBEYXRlYCBzYW1wbGU7IGVhY2ggaXMgb25seSBmb3JtYXR0ZWQgd2hlbiByZXF1ZXN0ZWQuICovXG5jb25zdCBnZXRUaW1lc3RhbXBUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHRyYW5zbGF0ZVRpbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiB7IHRpbWVzdGFtcDogc3RyaW5nOyBlcG9jaDogc3RyaW5nIH0gPT4ge1xuICBpZiAoISh0b2tlbnMuaGFzKCd7bm93fScpIHx8IHRva2Vucy5oYXMoJ3tlcG9jaH0nKSkpIHtcbiAgICByZXR1cm4geyBlcG9jaDogJycsIHRpbWVzdGFtcDogJycgfVxuICB9XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSB0b2tlbnMuaGFzKCd7ZXBvY2h9JykgPyBTdHJpbmcobm93LmdldFRpbWUoKSkgOiAnJ1xuICBpZiAoIXRva2Vucy5oYXMoJ3tub3d9JykpIHtcbiAgICByZXR1cm4geyBlcG9jaCwgdGltZXN0YW1wOiAnJyB9XG4gIH1cbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgdHJhbnNsYXRlVGltZSlcbiAgcmV0dXJuIHsgZXBvY2gsIHRpbWVzdGFtcDogZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycykgfVxufVxuXG5jb25zdCBnZXRNZXNzYWdlVG9rZW4gPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXRva2Vucy5oYXMoJ3ttZXNzYWdlfScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gc2FuaXRpemVMb2dUZXh0KGRhdGEubWVzc2FnZSkgOiAnJ1xufVxuXG4vKiogYHtwYXRobmFtZX1gL2B7cGF0aH1gL2B7cXVlcnl9YCBzaGFyZSBhIHNpbmdsZSBVUkwgcGFyc2UgKG9yIHRoZSBwcmVjb21wdXRlZCBvbmUpLiAqL1xuY29uc3QgZ2V0UGF0aG5hbWVUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBjb25maWc6IE9wdGlvbnNbJ2NvbmZpZyddLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xuKTogeyBjb2xvcmVkUGF0aG5hbWU6IHN0cmluZzsgcXVlcnk6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgbmVlZHNQYXRobmFtZSA9IHRva2Vucy5oYXMoJ3twYXRobmFtZX0nKSB8fCB0b2tlbnMuaGFzKCd7cGF0aH0nKVxuICBjb25zdCBuZWVkc1F1ZXJ5ID0gdG9rZW5zLmhhcygne3F1ZXJ5fScpXG4gIGlmICghKG5lZWRzUGF0aG5hbWUgfHwgbmVlZHNRdWVyeSkpIHtcbiAgICByZXR1cm4geyBjb2xvcmVkUGF0aG5hbWU6ICcnLCBxdWVyeTogJycgfVxuICB9XG5cbiAgbGV0IHJhd1BhdGhuYW1lOiBzdHJpbmdcbiAgbGV0IHNlYXJjaDogc3RyaW5nXG4gIGlmIChwcmVjb21wdXRlZCkge1xuICAgIDsoeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gcHJlY29tcHV0ZWQpXG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIDsoeyBwYXRobmFtZTogcmF3UGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybCkpXG4gICAgfSBjYXRjaCB7XG4gICAgICByYXdQYXRobmFtZSA9IHNhbml0aXplTG9nVGV4dChyZXF1ZXN0LnVybCB8fCAnLycsIDEwMjQpXG4gICAgICBzZWFyY2ggPSAnJ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5ID0gbmVlZHNRdWVyeSA/IHNlYXJjaCA6ICcnXG4gIGlmICghbmVlZHNQYXRobmFtZSkge1xuICAgIHJldHVybiB7IGNvbG9yZWRQYXRobmFtZTogJycsIHF1ZXJ5IH1cbiAgfVxuICBjb25zdCBwYXRobmFtZSA9IGNvbmZpZz8ubG9nUXVlcnlQYXJhbXNcbiAgICA/IGAke3Jhd1BhdGhuYW1lfSR7c2VhcmNofWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIHJldHVybiB7IGNvbG9yZWRQYXRobmFtZTogZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpLCBxdWVyeSB9XG59XG5cbi8qKiBge3N0YXR1c31gL2B7c3RhdHVzVGV4dH1gIHNoYXJlIGEgc2luZ2xlIHN0YXR1cy1jb2RlIHJlc29sdXRpb24uICovXG5jb25zdCBnZXRTdGF0dXNUb2tlbnMgPSAoXG4gIHRva2VuczogU2V0PHN0cmluZz4sXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHsgY29sb3JlZFN0YXR1czogc3RyaW5nOyBzdGF0dXNUZXh0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IG5lZWRzU3RhdHVzID0gdG9rZW5zLmhhcygne3N0YXR1c30nKVxuICBjb25zdCBuZWVkc1N0YXR1c1RleHQgPSB0b2tlbnMuaGFzKCd7c3RhdHVzVGV4dH0nKVxuICBpZiAoIShuZWVkc1N0YXR1cyB8fCBuZWVkc1N0YXR1c1RleHQpKSB7XG4gICAgcmV0dXJuIHsgY29sb3JlZFN0YXR1czogJycsIHN0YXR1c1RleHQ6ICcnIH1cbiAgfVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIHJldHVybiB7XG4gICAgY29sb3JlZFN0YXR1czogbmVlZHNTdGF0dXNcbiAgICAgID8gZ2V0Q29sb3JlZFN0YXR1cyhTdHJpbmcoc3RhdHVzQ29kZSksIHVzZUNvbG9ycylcbiAgICAgIDogJycsXG4gICAgc3RhdHVzVGV4dDogbmVlZHNTdGF0dXNUZXh0ID8gZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKSA6ICcnXG4gIH1cbn1cblxuY29uc3QgZ2V0SXBUb2tlbiA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ11cbik6IHN0cmluZyA9PiAoY29uZmlnPy5pcCA9PT0gdHJ1ZSAmJiB0b2tlbnMuaGFzKCd7aXB9JykgPyBnZXRJcChyZXF1ZXN0KSA6ICcnKVxuXG5jb25zdCBoYXNOb25FbXB0eUNvbnRleHQgPSAoXG4gIGNvbnRleHQ6IHVua25vd25cbik6IGNvbnRleHQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgY29udGV4dCAhPT0gbnVsbCAmJlxuICBjb250ZXh0ICE9PSB1bmRlZmluZWQgJiZcbiAgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KGNvbnRleHQpICYmXG4gIE9iamVjdC5rZXlzKGNvbnRleHQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG5cbmNvbnN0IGdldENvbnRleHRUb2tlbiA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ11cbik6IHN0cmluZyA9PiB7XG4gIGlmICghdG9rZW5zLmhhcygne2NvbnRleHR9JykpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBpZiAoc2hvd1RyZWUgJiYgaGFzTm9uRW1wdHlDb250ZXh0KGRhdGEuY29udGV4dCkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gZ2V0Q29udGV4dFN0cmluZyhkYXRhLmNvbnRleHQpXG59XG5cbi8qKiBge2R1cmF0aW9ufWAvYHtzcGVlZH1gIHNoYXJlIGEgc2luZ2xlIGR1cmF0aW9uIHNhbXBsZSBhbmQgc2xvdy10aHJlc2hvbGQgY2hlY2suICovXG5jb25zdCBnZXREdXJhdGlvblRva2VucyA9IChcbiAgdG9rZW5zOiBTZXQ8c3RyaW5nPixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBzbG93VGhyZXNob2xkOiBudW1iZXIsXG4gIHZlcnlTbG93VGhyZXNob2xkOiBudW1iZXIsXG4gIHByZWNvbXB1dGVkPzogUHJlY29tcHV0ZWRMb2dQYXJ0c1xuKTogeyBjb2xvcmVkRHVyYXRpb246IHN0cmluZzsgc3BlZWRUb2tlbjogc3RyaW5nIH0gPT4ge1xuICBjb25zdCBuZWVkc0R1cmF0aW9uID0gdG9rZW5zLmhhcygne2R1cmF0aW9ufScpXG4gIGNvbnN0IG5lZWRzU3BlZWQgPSB0b2tlbnMuaGFzKCd7c3BlZWR9JylcbiAgaWYgKCEobmVlZHNEdXJhdGlvbiB8fCBuZWVkc1NwZWVkKSkge1xuICAgIHJldHVybiB7IGNvbG9yZWREdXJhdGlvbjogJycsIHNwZWVkVG9rZW46ICcnIH1cbiAgfVxuICBjb25zdCBkdXJhdGlvbk1zID0gcHJlY29tcHV0ZWQ/LmR1cmF0aW9uTXMgPz8gZWxhcHNlZE1zKHN0b3JlLmJlZm9yZVRpbWUpXG4gIGNvbnN0IHsgdGV4dCwgaXNWZXJ5U2xvdyB9ID0gY29sb3JEdXJhdGlvblRleHQoXG4gICAgZHVyYXRpb25NcyxcbiAgICB1c2VDb2xvcnMsXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZFxuICApXG4gIHJldHVybiB7XG4gICAgY29sb3JlZER1cmF0aW9uOiBuZWVkc0R1cmF0aW9uID8gdGV4dCA6ICcnLFxuICAgIHNwZWVkVG9rZW46IG5lZWRzU3BlZWQgPyBnZXRTcGVlZFRva2VuKGlzVmVyeVNsb3csIHVzZUNvbG9ycykgOiAnJ1xuICB9XG59XG5cbmNvbnN0IGdldFJlcXVlc3RJZFRva2VuID0gKFxuICB0b2tlbnM6IFNldDxzdHJpbmc+LFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF0b2tlbnMuaGFzKCd7cmVxdWVzdElkfScpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgY3R4ID0gZGF0YS5jb250ZXh0XG4gIGlmICh0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCBjdHggPT09IG51bGwgfHwgISgncmVxdWVzdElkJyBpbiBjdHgpKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplTG9nVGV4dChcbiAgICBTdHJpbmcoKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucmVxdWVzdElkKSxcbiAgICAxMjhcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9nT3V0cHV0ID0gKHtcbiAgbGV2ZWwsXG4gIHJlcXVlc3QsXG4gIGRhdGEsXG4gIHN0b3JlLFxuICBvcHRpb25zLFxuICBmb3JtYXRDb250ZXh0LFxuICBwcmVjb21wdXRlZFxufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgY29uc3RhbnRzOyBjb21wdXRlZCBvbiB0aGUgZmx5IHdoZW4gYSBkaXJlY3QgY2FsbGVyIG9taXRzIGl0LiAqL1xuICBmb3JtYXRDb250ZXh0PzogRm9ybWF0Q29udGV4dFxuICAvKiogRHVyYXRpb24vVVJMIHBhcnRzIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgcGFyc2VkIG9uIHRoZSBmbHkgd2hlbiBvbWl0dGVkLiAqL1xuICBwcmVjb21wdXRlZD86IFByZWNvbXB1dGVkTG9nUGFydHNcbn0pOiBGb3JtYXR0ZWRMb2dPdXRwdXQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB7XG4gICAgZm9ybWF0LFxuICAgIHNlcnZpY2VUb2tlbixcbiAgICBzbG93VGhyZXNob2xkLFxuICAgIHRva2VucyxcbiAgICB1c2VDb2xvcnMsXG4gICAgdmVyeVNsb3dUaHJlc2hvbGRcbiAgfSA9IGZvcm1hdENvbnRleHQgPz8gY3JlYXRlRm9ybWF0Q29udGV4dChvcHRpb25zKVxuXG4gIGNvbnN0IHsgdGltZXN0YW1wLCBlcG9jaCB9ID0gZ2V0VGltZXN0YW1wVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSxcbiAgICB1c2VDb2xvcnNcbiAgKVxuICBjb25zdCBtZXNzYWdlID0gZ2V0TWVzc2FnZVRva2VuKHRva2VucywgZGF0YSlcbiAgY29uc3QgeyBjb2xvcmVkUGF0aG5hbWUsIHF1ZXJ5IH0gPSBnZXRQYXRobmFtZVRva2VucyhcbiAgICB0b2tlbnMsXG4gICAgcmVxdWVzdCxcbiAgICBjb25maWcsXG4gICAgdXNlQ29sb3JzLFxuICAgIHByZWNvbXB1dGVkXG4gIClcbiAgY29uc3QgeyBjb2xvcmVkU3RhdHVzLCBzdGF0dXNUZXh0IH0gPSBnZXRTdGF0dXNUb2tlbnModG9rZW5zLCBkYXRhLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGlwID0gZ2V0SXBUb2tlbih0b2tlbnMsIHJlcXVlc3QsIGNvbmZpZylcbiAgY29uc3QgY3R4U3RyaW5nID0gZ2V0Q29udGV4dFRva2VuKHRva2VucywgZGF0YSwgY29uZmlnKVxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSB0b2tlbnMuaGFzKCd7bGV2ZWx9JylcbiAgICA/IGdldENvbG9yZWRMZXZlbChsZXZlbCwgdXNlQ29sb3JzKVxuICAgIDogJydcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IHRva2Vucy5oYXMoJ3ttZXRob2R9JylcbiAgICA/IGdldENvbG9yZWRNZXRob2RUb2tlbihyZXF1ZXN0Lm1ldGhvZCwgdXNlQ29sb3JzKVxuICAgIDogJydcbiAgY29uc3QgeyBjb2xvcmVkRHVyYXRpb24sIHNwZWVkVG9rZW4gfSA9IGdldER1cmF0aW9uVG9rZW5zKFxuICAgIHRva2VucyxcbiAgICBzdG9yZSxcbiAgICB1c2VDb2xvcnMsXG4gICAgc2xvd1RocmVzaG9sZCxcbiAgICB2ZXJ5U2xvd1RocmVzaG9sZCxcbiAgICBwcmVjb21wdXRlZFxuICApXG4gIGNvbnN0IGljb24gPSB0b2tlbnMuaGFzKCd7aWNvbn0nKSA/IGdldExldmVsSWNvbihsZXZlbCwgdXNlQ29sb3JzKSA6ICcnXG4gIGNvbnN0IHJlcXVlc3RJZCA9IGdldFJlcXVlc3RJZFRva2VuKHRva2VucywgZGF0YSlcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7ZXBvY2h9JzogZXBvY2gsXG4gICAgJ3tpY29ufSc6IGljb24sXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne21lc3NhZ2V9JzogbWVzc2FnZSxcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne3BhdGh9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cXVlcnl9JzogcXVlcnksXG4gICAgJ3tyZXF1ZXN0SWR9JzogcmVxdWVzdElkLFxuICAgICd7c2VydmljZX0nOiBzZXJ2aWNlVG9rZW4sXG4gICAgJ3tzcGVlZH0nOiBzcGVlZFRva2VuLFxuICAgICd7c3RhdHVzfSc6IGNvbG9yZWRTdGF0dXMsXG4gICAgJ3tzdGF0dXNUZXh0fSc6IHN0YXR1c1RleHRcbiAgfVxuXG4gIGNvbnN0IG1haW4gPSBmb3JtYXQucmVwbGFjZShcbiAgICBMT0dfRk9STUFUX1JFR0VYLFxuICAgIG1hdGNoID0+IHRva2VuTWFwW21hdGNoXSA/PyBtYXRjaFxuICApXG5cbiAgY29uc3QgY29udGV4dExpbmVzID0gYnVpbGRDb250ZXh0VHJlZUxpbmVzKGxldmVsLCBkYXRhLCBvcHRpb25zLCB1c2VDb2xvcnMpXG5cbiAgcmV0dXJuIHsgY29udGV4dExpbmVzLCBtYWluIH1cbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHBhcnNlRXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cbiAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH1cbiAgcmV0dXJuIFN0cmluZyhlcnJvcilcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJ1Y3R1cmVkRXJyb3Ige1xuICBjb2RlPzogc3RyaW5nXG4gIGZpeD86IHN0cmluZ1xuICBpbnRlcm5hbD86IHVua25vd25cbiAgbGluaz86IHN0cmluZ1xuICB3aHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGlzU3RydWN0dXJlZEVycm9yID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgU3RydWN0dXJlZEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAoJ3doeScgaW4gdmFsdWUgfHxcbiAgICAnZml4JyBpbiB2YWx1ZSB8fFxuICAgICdsaW5rJyBpbiB2YWx1ZSB8fFxuICAgICdjb2RlJyBpbiB2YWx1ZSB8fFxuICAgICdpbnRlcm5hbCcgaW4gdmFsdWUpXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9ybWFsaXplZExvZ2dlZEVycm9yIHtcbiAgLyoqIFNhZmUgc3RydWN0dXJlZCByZXByZXNlbnRhdGlvbiBmb3IgZGF0YS90cmFuc3BvcnQgbWV0YS4gKi9cbiAgZXJyb3I6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIC8qKiBTYWZlIG9uZS1saW5lIG1lc3NhZ2UgZm9yIHRoZSBsb2cgbGluZS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nXG59XG5cbmNvbnN0IGlzVmFsaWRhdGlvbkVycm9yTGlrZSA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEVycm9yICYgeyBhbGw/OiB1bmtub3duW107IHN0YXR1cz86IG51bWJlcjsgdHlwZT86IHN0cmluZyB9ID0+XG4gIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgLy8gYGNvZGVgIGlzIEVseXNpYSdzIG1pbmlmaWNhdGlvbi1zYWZlIGRpc2NyaW1pbmFudCDigJQgYC5uYW1lYCBhbmRcbiAgLy8gYC5jb25zdHJ1Y3Rvci5uYW1lYCBib3RoIGRlZ3JhZGUgdG8gYSBtYW5nbGVkIHN0cmluZyB1bmRlciBidW5kbGVyXG4gIC8vIG1pbmlmaWNhdGlvbiAoZS5nLiBgYnVuIGJ1aWxkIC0tbWluaWZ5YCwgZXNidWlsZCksIHNvIGBjb2RlYCBtdXN0IGJlXG4gIC8vIGNoZWNrZWQgdG9vIG9yIHZhbGlkYXRpb24gYm9kaWVzIHNpbGVudGx5IHJlLWxlYWsgaW4gdGhhdCBidWlsZCBtb2RlLlxuICAoKHZhbHVlIGFzIHsgY29kZT86IHVua25vd24gfSkuY29kZSA9PT0gJ1ZBTElEQVRJT04nIHx8XG4gICAgdmFsdWUubmFtZSA9PT0gJ1ZhbGlkYXRpb25FcnJvcicgfHxcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1ZhbGlkYXRpb25FcnJvcicpXG5cbmNvbnN0IFNUUlVDVFVSRURfRVJST1JfS0VZUyA9IFtcbiAgJ2NvZGUnLFxuICAnZml4JyxcbiAgJ2ludGVybmFsJyxcbiAgJ2xpbmsnLFxuICAnbWVzc2FnZScsXG4gICduYW1lJyxcbiAgJ3N0YXR1cycsXG4gICd3aHknXG5dIGFzIGNvbnN0XG5cbmNvbnN0IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMgPSAoXG4gIHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3Qgc2FmZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBTVFJVQ1RVUkVEX0VSUk9SX0tFWVMpIHtcbiAgICBpZiAocmVjb3JkW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FmZVtrZXldID0gcmVjb3JkW2tleV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNhZmVcbn1cblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUxvZ2dlZEVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgbG9nRXJyb3JQYXlsb2FkOiBib29sZWFuXG4pOiBOb3JtYWxpemVkTG9nZ2VkRXJyb3IgPT4ge1xuICBpZiAoaXNWYWxpZGF0aW9uRXJyb3JMaWtlKGVycm9yKSAmJiAhbG9nRXJyb3JQYXlsb2FkKSB7XG4gICAgY29uc3QgZmFpbHVyZXMgPSBBcnJheS5pc0FycmF5KGVycm9yLmFsbCkgPyBlcnJvci5hbGwgOiBbXVxuICAgIGNvbnN0IHBhdGhzID0gZmFpbHVyZXNcbiAgICAgIC5tYXAoZmFpbHVyZSA9PlxuICAgICAgICB0eXBlb2YgZmFpbHVyZSA9PT0gJ29iamVjdCcgJiYgZmFpbHVyZSAhPT0gbnVsbCAmJiAncGF0aCcgaW4gZmFpbHVyZVxuICAgICAgICAgID8gU3RyaW5nKChmYWlsdXJlIGFzIHsgcGF0aDogdW5rbm93biB9KS5wYXRoKVxuICAgICAgICAgIDogJydcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBzY29wZSA9IHR5cGVvZiBlcnJvci50eXBlID09PSAnc3RyaW5nJyA/IGVycm9yLnR5cGUgOiAncmVxdWVzdCdcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIHBhdGhzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgVmFsaWRhdGlvbiBmYWlsZWQgKCR7c2NvcGV9KTogJHtwYXRocy5qb2luKCcsICcpfWBcbiAgICAgICAgOiBgVmFsaWRhdGlvbiBmYWlsZWQgKCR7c2NvcGV9KWBcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHsgZmFpbGVkUGF0aHM6IHBhdGhzLCBuYW1lOiAnVmFsaWRhdGlvbkVycm9yJywgdHlwZTogc2NvcGUgfSxcbiAgICAgIG1lc3NhZ2VcbiAgICB9XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGNvbnN0IHNhZmUgPSBjb3B5U3RydWN0dXJlZEVycm9yRmllbGRzKFxuICAgICAgZXJyb3IgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIClcbiAgICBzYWZlLm1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlXG4gICAgLy8gTmF0aXZlIHN1YmNsYXNzZXMgKGUuZy4gYGNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yYCkgZG9uJ3Qgc2V0XG4gICAgLy8gYC5uYW1lYCB1bmxlc3MgdGhlIGF1dGhvciBvdmVycmlkZXMgaXQsIHNvIGl0IHJlYWRzIGJhY2sgYXMgdGhlXG4gICAgLy8gZ2VuZXJpYyBcIkVycm9yXCIuIFByZWZlciB0aGUgY29uc3RydWN0b3IgbmFtZSBpbiB0aGF0IGNhc2UuXG4gICAgc2FmZS5uYW1lID1cbiAgICAgIGVycm9yLm5hbWUgPT09ICdFcnJvcidcbiAgICAgICAgPyAoZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZSlcbiAgICAgICAgOiBlcnJvci5uYW1lXG4gICAgcmV0dXJuIHsgZXJyb3I6IHNhZmUsIG1lc3NhZ2U6IHBhcnNlRXJyb3IoZXJyb3IpIH1cbiAgfVxuXG4gIGlmIChpc1N0cnVjdHVyZWRFcnJvcihlcnJvcikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IGNvcHlTdHJ1Y3R1cmVkRXJyb3JGaWVsZHMoZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgICAgbWVzc2FnZTogcGFyc2VFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBlcnJvcjogeyB2YWx1ZTogU3RyaW5nKGVycm9yKSB9LCBtZXNzYWdlOiBwYXJzZUVycm9yKGVycm9yKSB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZWxhcHNlZE1zIH0gZnJvbSAnLi4vdXRpbHMvZHVyYXRpb24nXG5pbXBvcnQgeyBjcmVhdGVFcnJvclJlcG9ydGVyIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0J1xuXG5jb25zdCByZXBvcnRUcmFuc3BvcnRFcnJvciA9IGNyZWF0ZUVycm9yUmVwb3J0ZXIoXG4gICd0cmFuc3BvcnQnLFxuICAndHJhbnNwb3J0IGZhaWxlZCdcbilcblxuY29uc3QgTUFYX1RSQUNLRURfUEVORElORyA9IDEwMjRcbmNvbnN0IHBlbmRpbmdUcmFuc3BvcnRXb3JrID0gbmV3IFNldDxQcm9taXNlPHVua25vd24+PigpXG5cbi8qKlxuICogUmVtZW1iZXJzIGluLWZsaWdodCBgbG9nKClgIHByb21pc2VzIHNvIHNodXRkb3duIGNhbiB3YWl0IGZvciB0aGVtLiBUaGUgc2V0XG4gKiBpcyBib3VuZGVkOiB1bmRlciBzdXN0YWluZWQgbG9hZCB0aGUgb2xkZXN0IGVudHJ5IGlzIGRyb3BwZWQgcmF0aGVyIHRoYW5cbiAqIGxldHRpbmcgYSBzbG93IHRyYW5zcG9ydCBncm93IGl0IHdpdGhvdXQgbGltaXQuXG4gKi9cbmNvbnN0IHRyYWNrID0gKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkID0+IHtcbiAgaWYgKHBlbmRpbmdUcmFuc3BvcnRXb3JrLnNpemUgPj0gTUFYX1RSQUNLRURfUEVORElORykge1xuICAgIGNvbnN0IG9sZGVzdCA9IHBlbmRpbmdUcmFuc3BvcnRXb3JrLnZhbHVlcygpLm5leHQoKS52YWx1ZVxuICAgIGlmIChvbGRlc3QpIHtcbiAgICAgIHBlbmRpbmdUcmFuc3BvcnRXb3JrLmRlbGV0ZShvbGRlc3QpXG4gICAgfVxuICB9XG4gIHBlbmRpbmdUcmFuc3BvcnRXb3JrLmFkZChwcm9taXNlKVxuICBwcm9taXNlXG4gICAgLmZpbmFsbHkoKCkgPT4gcGVuZGluZ1RyYW5zcG9ydFdvcmsuZGVsZXRlKHByb21pc2UpKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG59XG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIC8qKiBEdXJhdGlvbiBhbHJlYWR5IGNvbXB1dGVkIGJ5IHRoZSBjYWxsZXI7IHNhbXBsZWQgb24gdGhlIGZseSB3aGVuIG9taXR0ZWQuICovXG4gIHByZWNvbXB1dGVkPzogeyBkdXJhdGlvbk1zOiBudW1iZXI7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nIH1cbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCk6IHZvaWQgPT4ge1xuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucywgcHJlY29tcHV0ZWQgfSA9IGlucHV0XG4gIGNvbnN0IHRyYW5zcG9ydHMgPSBvcHRpb25zLmNvbmZpZz8udHJhbnNwb3J0cyA/PyBbXVxuICBpZiAodHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBvbkVycm9yID0gb3B0aW9ucy5jb25maWc/Lm9uRXJyb3JcblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgICBkdXJhdGlvbk1zOiBwcmVjb21wdXRlZD8uZHVyYXRpb25NcyA/PyBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSlcbiAgfVxuXG4gIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRyYW5zcG9ydHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+XG4gICAgICAgIHRyYWNrKHBlbmRpbmcpXG4gICAgICAgIHBlbmRpbmcuY2F0Y2goZXJyb3IgPT4gcmVwb3J0VHJhbnNwb3J0RXJyb3IoZXJyb3IsIG9uRXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvciwgb25FcnJvcilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG9uZSBvcHRpb25hbCBsaWZlY3ljbGUgbWV0aG9kIG9uIGV2ZXJ5IGNvbmZpZ3VyZWQgdHJhbnNwb3J0LiBGYWlsdXJlc1xuICogYXJlIHJlcG9ydGVkIGxpa2UgYGxvZygpYCBmYWlsdXJlcyBhbmQgbmV2ZXIgc3RvcCB0aGUgb3RoZXIgdHJhbnNwb3J0cy5cbiAqL1xuY29uc3QgcnVuVHJhbnNwb3J0TGlmZWN5Y2xlID0gKFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBtZXRob2Q6ICdjbG9zZScgfCAnZmx1c2gnXG4pOiBQcm9taXNlPHVua25vd24+W10gPT4ge1xuICBjb25zdCBvbkVycm9yID0gb3B0aW9ucy5jb25maWc/Lm9uRXJyb3JcbiAgcmV0dXJuIChvcHRpb25zLmNvbmZpZz8udHJhbnNwb3J0cyA/PyBbXSkubWFwKHRyYW5zcG9ydCA9PlxuICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAudGhlbigoKSA9PiB0cmFuc3BvcnRbbWV0aG9kXT8uKCkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gcmVwb3J0VHJhbnNwb3J0RXJyb3IoZXJyb3IsIG9uRXJyb3IpKVxuICApXG59XG5cbi8qKiBXYWl0cyBmb3IgaW4tZmxpZ2h0IGBsb2coKWAgd29yayBhbmQgZXZlcnkgdHJhbnNwb3J0J3Mgb3duIGBmbHVzaCgpYC4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaFRyYW5zcG9ydHMgPSBhc3luYyAob3B0aW9uczogT3B0aW9ucyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgIC4uLnBlbmRpbmdUcmFuc3BvcnRXb3JrLFxuICAgIC4uLnJ1blRyYW5zcG9ydExpZmVjeWNsZShvcHRpb25zLCAnZmx1c2gnKVxuICBdKVxufVxuXG4vKiogUmVsZWFzZXMgZWFjaCB0cmFuc3BvcnQncyByZXNvdXJjZXM7IG9ubHkgcmVhY2hlZCB2aWEgYGZsdXNoTG9naXhseXNpYWAuICovXG5leHBvcnQgY29uc3QgY2xvc2VUcmFuc3BvcnRzID0gYXN5bmMgKG9wdGlvbnM6IE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHJ1blRyYW5zcG9ydExpZmVjeWNsZShvcHRpb25zLCAnY2xvc2UnKSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBGaWxlSGFuZGxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IG9wZW4gfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VJbnRlcnZhbCwgcGFyc2VTaXplIH0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG4vKipcbiAqIFRoZSBsaXZlIGZpbGUncyBjcmVhdGlvbiB0aW1lIHdoZW4gdGhlIGZpbGVzeXN0ZW0gcmVwb3J0cyBvbmU7XG4gKiBzb21lIGZpbGVzeXN0ZW1zIHJlcG9ydCAwL2Fic2VudCBiaXJ0aHRpbWUg4oCUIGZhbGwgYmFjayB0byBgbm93YFxuICogKGxvc2luZyByZXN0YXJ0LXN1cnZpdmFsIGZvciB0aGUgaW50ZXJ2YWwgY2xvY2ssIGJ1dCBuZXZlciB3cm9uZ1xuICogYnkgbW9yZSB0aGFuIHRoZSBwcm9jZXNzIGxpZmV0aW1lKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVPcGVuZWRBdCA9IChcbiAgYmlydGh0aW1lTXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgbm93OiBudW1iZXJcbik6IG51bWJlciA9PiAoYmlydGh0aW1lTXMgJiYgYmlydGh0aW1lTXMgPiAwID8gYmlydGh0aW1lTXMgOiBub3cpXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNpbmtPcHRpb25zIHtcbiAgbG9nRGlyTW9kZT86IG51bWJlclxuICBsb2dGaWxlTW9kZT86IG51bWJlclxuICBsb2dSb3RhdGlvbj86IExvZ1JvdGF0aW9uQ29uZmlnXG4gIC8qKiBSZXBvcnRzIGEgcm90YXRpb24tc2luayBmYWlsdXJlOyBmYWxscyBiYWNrIHRvIGEgc3RkZXJyIGxpbmUgd2hlbiBvbWl0dGVkLiAqL1xuICBvblJvdGF0aW9uRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2luayB7XG4gIC8qKiBGbHVzaGVzLCB0aGVuIHJlbGVhc2VzIHRoZSBmaWxlIGhhbmRsZS4gSWRlbXBvdGVudC4gKi9cbiAgY2xvc2U6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqIFJlc29sdmVzIG9uY2UgZXZlcnkgd3JpdGUgaXNzdWVkIHNvIGZhciBpcyBkdXJhYmx5IG9uIGRpc2suICovXG4gIGZsdXNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBSZXNvbHZlcyBhZnRlciBgbGluZWAgaXMgZHVyYWJseSB3cml0dGVuIHRvIGRpc2suICovXG4gIHdyaXRlOiAobGluZTogc3RyaW5nLCBvcHRpb25zOiBGaWxlU2lua09wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbn1cblxuaW50ZXJmYWNlIEJhdGNoUmVzb2x2ZXIge1xuICByZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZFxuICByZXNvbHZlOiAoKSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBQZW5kaW5nQmF0Y2gge1xuICBsaW5lczogc3RyaW5nW11cbiAgcmVzb2x2ZXJzOiBCYXRjaFJlc29sdmVyW11cbn1cblxuY2xhc3MgRmlsZVNpbmtJbXBsIGltcGxlbWVudHMgRmlsZVNpbmsge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmdcbiAgcHJpdmF0ZSBoYW5kbGU6IEZpbGVIYW5kbGUgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGJ5dGVzV3JpdHRlbiA9IDBcbiAgcHJpdmF0ZSBvcGVuZWRBdCA9IDBcbiAgcHJpdmF0ZSBsYXRlc3RPcHRpb25zOiBGaWxlU2lua09wdGlvbnMgPSB7fVxuICBwcml2YXRlIHBlbmRpbmdCYXRjaDogUGVuZGluZ0JhdGNoIHwgbnVsbCA9IG51bGxcbiAgLy8gU2VyaWFsaXplcyBmbHVzaCBhbmQgcm90YXRpb24gd29yayBwZXIgcGF0aDogZXZlcnkgYmF0Y2ggKGFuZCB0aGVcbiAgLy8gcm90YXRpb24gaXQgbWF5IHRyaWdnZXIpIGlzIGNoYWluZWQgb250byB0aGlzIHNvIGF0IG1vc3Qgb25lIGhvbGRlciBvZlxuICAvLyB0aGUgZmlsZSBoYW5kbGUgaXMgZG9pbmcgSS9PIGF0IGEgdGltZS5cbiAgcHJpdmF0ZSBmbHVzaENoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKClcblxuICBjb25zdHJ1Y3RvcihmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoXG4gIH1cblxuICB3cml0ZShsaW5lOiBzdHJpbmcsIG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEFsd2F5cyB1c2UgdGhlIGxhdGVzdCBjYWxsJ3Mgb3B0aW9ucywgaW4gY2FzZSBjb25maWcgZGlmZmVycyBiZXR3ZWVuXG4gICAgLy8gY2FsbHMgdG8gdGhlIHNhbWUgcGF0aCAoZS5nLiBpbiB0ZXN0cykuXG4gICAgdGhpcy5sYXRlc3RPcHRpb25zID0gb3B0aW9uc1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdCYXRjaCkge1xuICAgICAgICB0aGlzLnBlbmRpbmdCYXRjaC5saW5lcy5wdXNoKGxpbmUpXG4gICAgICAgIHRoaXMucGVuZGluZ0JhdGNoLnJlc29sdmVycy5wdXNoKHsgcmVqZWN0LCByZXNvbHZlIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXRjaDogUGVuZGluZ0JhdGNoID0ge1xuICAgICAgICBsaW5lczogW2xpbmVdLFxuICAgICAgICByZXNvbHZlcnM6IFt7IHJlamVjdCwgcmVzb2x2ZSB9XVxuICAgICAgfVxuICAgICAgdGhpcy5wZW5kaW5nQmF0Y2ggPSBiYXRjaFxuXG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0JhdGNoID0gbnVsbFxuICAgICAgICB0aGlzLmZsdXNoQ2hhaW4gPSB0aGlzLmZsdXNoQ2hhaW4udGhlbihcbiAgICAgICAgICAoKSA9PiB0aGlzLmZsdXNoQmF0Y2goYmF0Y2gpLFxuICAgICAgICAgICgpID0+IHRoaXMuZmx1c2hCYXRjaChiYXRjaClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaEJhdGNoKGJhdGNoOiBQZW5kaW5nQmF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5sYXRlc3RPcHRpb25zXG4gICAgLy8gTGluZXMgYWxyZWFkeSBjYXJyeSB0aGVpciBvd24gdHJhaWxpbmcgbmV3bGluZTsgam9pbiBuZWVkcyBubyBzZXBhcmF0b3IuXG4gICAgY29uc3QgdGV4dCA9IGJhdGNoLmxpbmVzLmpvaW4oJycpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPcGVuKG9wdGlvbnMpXG4gICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmhhbmRsZSBhcyBGaWxlSGFuZGxlXG4gICAgICBhd2FpdCBoYW5kbGUud3JpdGUodGV4dClcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZXIgb2YgYmF0Y2gucmVzb2x2ZXJzKSB7XG4gICAgICAgIHJlc29sdmVyLnJlamVjdChlcnJvcilcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFJvdGF0aW9uIChpZiB0cmlnZ2VyZWQpIGlzIGF3YWl0ZWQgYmVmb3JlIHJlc29sdmluZyBzbyBjYWxsZXJzIG9ic2VydmVcbiAgICAvLyBhIGNvbnNpc3RlbnQgb24tZGlzayBzdGF0ZTogdGhlIGxpbmUncyB3cml0ZSBwbHVzIGFueSByb3RhdGlvbiBpdFxuICAgIC8vIGNhdXNlZC4gbWF5YmVSb3RhdGUoKSBjYXRjaGVzIGFuZCByZXBvcnRzIGl0cyBvd24gZXJyb3JzLCBzbyBpdCBuZXZlclxuICAgIC8vIHJlamVjdHMgdGhpcyBjaGFpbi5cbiAgICBhd2FpdCB0aGlzLm1heWJlUm90YXRlKG9wdGlvbnMpXG5cbiAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIGJhdGNoLnJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZXIucmVzb2x2ZSgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPcGVuKG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmhhbmRsZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVGhlIGRpcmVjdG9yeSBvbmx5IG5lZWRzIGNyZWF0aW5nIG9uIGZpcnN0IG9wZW4gKG9yIG9uIHJlb3BlbiBhZnRlciBhXG4gICAgLy8gcm90YXRpb24gY2xlYXJlZCB0aGUgaGFuZGxlKSDigJQgbmV2ZXIgcGVyIGxpbmUuXG4gICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUodGhpcy5maWxlUGF0aCksIG9wdGlvbnMubG9nRGlyTW9kZSlcbiAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCBvcGVuKHRoaXMuZmlsZVBhdGgsICdhJywgb3B0aW9ucy5sb2dGaWxlTW9kZSA/PyAwbzYwMClcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgaGFuZGxlLnN0YXQoKVxuICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gPSBzdGF0LnNpemVcbiAgICB0aGlzLm9wZW5lZEF0ID0gcmVzb2x2ZU9wZW5lZEF0KHN0YXQuYmlydGh0aW1lTXMsIERhdGUubm93KCkpXG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGVpdGhlciBjb25maWd1cmVkIHRyaWdnZXIgKHNpemUsIGludGVydmFsKSBoYXMgYmVlbiBjcm9zc2VkLiAqL1xuICBwcml2YXRlIHNob3VsZFJvdGF0ZU5vdyhyb3RhdGlvbjogTG9nUm90YXRpb25Db25maWcpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICByb3RhdGlvbi5tYXhTaXplICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuYnl0ZXNXcml0dGVuID4gcGFyc2VTaXplKHJvdGF0aW9uLm1heFNpemUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgcm90YXRpb24uaW50ZXJ2YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgRGF0ZS5ub3coKSAtIHRoaXMub3BlbmVkQXQgPj0gcGFyc2VJbnRlcnZhbChyb3RhdGlvbi5pbnRlcnZhbClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlUm90YXRlKG9wdGlvbnM6IEZpbGVTaW5rT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvdGF0aW9uID0gb3B0aW9ucy5sb2dSb3RhdGlvblxuICAgIGlmIChcbiAgICAgICFyb3RhdGlvbiB8fFxuICAgICAgKHJvdGF0aW9uLm1heFNpemUgPT09IHVuZGVmaW5lZCAmJiByb3RhdGlvbi5pbnRlcnZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRSb3RhdGVOb3cocm90YXRpb24pKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGhhbmRsZSB9ID0gdGhpc1xuICAgICAgdGhpcy5oYW5kbGUgPSBudWxsXG4gICAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDBcbiAgICAgIHRoaXMub3BlbmVkQXQgPSBEYXRlLm5vdygpXG4gICAgICBhd2FpdCBoYW5kbGU/LmNsb3NlKClcbiAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbih0aGlzLmZpbGVQYXRoLCByb3RhdGlvbiwgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBlbnRyaWVzIHdlcmUgYWxyZWFkeSBkdXJhYmx5IHdyaXR0ZW4gYW5kIHJlc29sdmVkIGFib3ZlO1xuICAgICAgLy8gcm90YXRpb24gZmFpbHVyZXMgbXVzdCBub3QgZmFpbCB0aGUgY2FsbGVyJ3Mgd3JpdGUuXG4gICAgICBpZiAob3B0aW9ucy5vblJvdGF0aW9uRXJyb3IpIHtcbiAgICAgICAgb3B0aW9ucy5vblJvdGF0aW9uRXJyb3IoZXJyb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHJvdGF0ZSBsb2cgZmlsZSAke3RoaXMuZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdyaXRlKCkgY2hhaW5zIG9udG8gZmx1c2hDaGFpbiBmcm9tIGEgbWljcm90YXNrLCBzbyB5aWVsZCBvbmNlIGJlZm9yZVxuICAgIC8vIHJlYWRpbmcgdGhlIGNoYWluIG9yIGEgd3JpdGUgaXNzdWVkIGluIHRoZSBzYW1lIHRpY2sgd291bGQgYmUgbWlzc2VkLlxuICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG4gICAgYXdhaXQgdGhpcy5mbHVzaENoYWluXG4gIH1cblxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoKClcbiAgICBjb25zdCB7IGhhbmRsZSB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlID0gbnVsbFxuICAgIGF3YWl0IGhhbmRsZT8uY2xvc2UoKVxuICAgIHNpbmtzLmRlbGV0ZSh0aGlzLmZpbGVQYXRoKVxuICB9XG59XG5cbmNvbnN0IHNpbmtzID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVTaW5rPigpXG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlU2luayA9IChmaWxlUGF0aDogc3RyaW5nKTogRmlsZVNpbmsgPT4ge1xuICBsZXQgc2luayA9IHNpbmtzLmdldChmaWxlUGF0aClcbiAgaWYgKCFzaW5rKSB7XG4gICAgc2luayA9IG5ldyBGaWxlU2lua0ltcGwoZmlsZVBhdGgpXG4gICAgc2lua3Muc2V0KGZpbGVQYXRoLCBzaW5rKVxuICB9XG4gIHJldHVybiBzaW5rXG59XG5cbmV4cG9ydCBjb25zdCBmbHVzaEFsbEZpbGVTaW5rcyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5zaW5rcy52YWx1ZXMoKV0ubWFwKHNpbmsgPT4gc2luay5mbHVzaCgpKSlcbn1cblxuZXhwb3J0IGNvbnN0IGNsb3NlQWxsRmlsZVNpbmtzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLnNpbmtzLnZhbHVlcygpXS5tYXAoc2luayA9PiBzaW5rLmNsb3NlKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCBjb25zdCBlbnN1cmVEaXIgPSBhc3luYyAoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgbW9kZSA9IDBvNzAwXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyBtb2RlLCByZWN1cnNpdmU6IHRydWUgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZ3ppcCB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHtcbiAgZ2V0Um90YXRlZEZpbGVzLFxuICBwYXJzZVJldGVudGlvbixcbiAgcGFyc2VTaXplLFxuICBzaG91bGRSb3RhdGVCeVNpemVcbn0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5pbXBvcnQgeyBjcmVhdGVLZXllZE11dGV4IH0gZnJvbSAnLi9rZXllZC1tdXRleCdcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbi8vIFByZXZlbnRzIGNvbmN1cnJlbnQgY29tcHJlc3Npb24gb2YgdGhlIHNhbWUgZmlsZSAoa2V5ZWQgYnkgZmlsZVBhdGgpLlxuY29uc3QgY29tcHJlc3Npb25Mb2NrID0gY3JlYXRlS2V5ZWRNdXRleCgpXG5cbi8qKiBSZXBvcnRzIGEgc2luayBmYWlsdXJlOyB3aGVuIG9taXR0ZWQsIHRoZSBjYWxsZXIgZmFsbHMgYmFjayB0byBzdGRlcnIuICovXG5leHBvcnQgdHlwZSBSb3RhdGlvbkVycm9yUmVwb3J0ZXIgPSAoZXJyb3I6IHVua25vd24pID0+IHZvaWRcblxuY29uc3QgcmVwb3J0Um90YXRpb25FcnJvciA9IChcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBlcnJvcjogdW5rbm93bixcbiAgb25FcnJvcj86IFJvdGF0aW9uRXJyb3JSZXBvcnRlclxuKTogdm9pZCA9PiB7XG4gIGlmIChvbkVycm9yKSB7XG4gICAgb25FcnJvcihlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIGVycm9yKVxufVxuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIGNvbnN0IFNTUyA9IFN0cmluZyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKS5wYWRTdGFydCgzLCAnMCcpXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfS0ke1NTU31gXG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKVxuICAgIGlmIChzdGF0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBiYXNlUm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgY29uc3Qgcm90YXRlZCA9IGAke2Jhc2VSb3RhdGVkfS0ke3Byb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpfWBcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGNvbXByZXNzaW9uTG9jay5hY3F1aXJlKGZpbGVQYXRoKVxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGZpbGUgc3RpbGwgZXhpc3RzIChtaWdodCBoYXZlIGJlZW4gY29tcHJlc3NlZCBieSBhbm90aGVyIHByb2Nlc3MpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgYWxyZWFkeSBjb21wcmVzc2VkIG9yIGRlbGV0ZWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2ZpbGVQYXRofS5nemAsIGNvbXByZXNzZWQpXG4gICAgYXdhaXQgZnMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRSb3RhdGlvbkVycm9yKFxuICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gY29tcHJlc3MgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgZXJyb3IsXG4gICAgICBvbkVycm9yXG4gICAgKVxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuaW50ZXJmYWNlIEZpbGVTdGF0IHtcbiAgcGF0aDogc3RyaW5nXG4gIHN0YXQ6IGltcG9ydCgnbm9kZTpmcycpLlN0YXRzXG59XG5cbmNvbnN0IGlzRnVsZmlsbGVkID0gPFQ+KFxuICByZXN1bHQ6IFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+XG4pOiByZXN1bHQgaXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPiA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuXG4vKipcbiAqIERlbGV0ZXMgcm90YXRlZCBmaWxlcyBiZXlvbmQgYHJldGVudGlvbmA6IGZvciBgJ2NvdW50J2AsIGtlZXBzIHRoZSBuZXdlc3RcbiAqIGByZXRlbnRpb24udmFsdWVgIGZpbGVzIChieSBtdGltZSk7IGZvciBgJ3RpbWUnYCwgZGVsZXRlcyBmaWxlcyBvbGRlciB0aGFuXG4gKiBgcmV0ZW50aW9uLnZhbHVlYCBtcy4gSW5kaXZpZHVhbCBzdGF0L2RlbGV0ZSBmYWlsdXJlcyBhcmUgdG9sZXJhdGVkICh2aWFcbiAqIGBhbGxTZXR0bGVkYCkgc28gb25lIGJhZCBmaWxlIG5ldmVyIGJsb2NrcyBjbGVhbnVwIG9mIHRoZSByZXN0LlxuICovXG5jb25zdCBjbGVhbnVwUm90YXRlZCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgcmV0ZW50aW9uOiB7IHR5cGU6ICdjb3VudCcgfCAndGltZSc7IHZhbHVlOiBudW1iZXIgfSxcbiAgb25FcnJvcj86IFJvdGF0aW9uRXJyb3JSZXBvcnRlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50JyAmJiByb3RhdGVkLmxlbmd0aCA8PSByZXRlbnRpb24udmFsdWUpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0cywgaWdub3JlIGZpbGVzIHRoYXQgd2VyZSBkZWxldGVkIGNvbmN1cnJlbnRseVxuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0cy5maWx0ZXIoaXNGdWxmaWxsZWQ8RmlsZVN0YXQ+KS5tYXAociA9PiByLnZhbHVlKVxuXG4gIGxldCB0b0RlbGV0ZTogRmlsZVN0YXRbXVxuICBpZiAocmV0ZW50aW9uLnR5cGUgPT09ICdjb3VudCcpIHtcbiAgICBpZiAoc3RhdHMubGVuZ3RoIDw9IHJldGVudGlvbi52YWx1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHN0YXRzLnNvcnQoKGEsIGIpID0+IGIuc3RhdC5tdGltZU1zIC0gYS5zdGF0Lm10aW1lTXMpXG4gICAgdG9EZWxldGUgPSBzdGF0cy5zbGljZShyZXRlbnRpb24udmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgIHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gcmV0ZW50aW9uLnZhbHVlKVxuICB9XG5cbiAgLy8gRGVsZXRlIGZpbGVzIGluZGl2aWR1YWxseSwgY29udGludWluZyBldmVuIGlmIHNvbWUgZmFpbFxuICBjb25zdCBkZWxldGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpXG4gIClcblxuICAvLyBMb2cgZmFpbHVyZXMgYnV0IGRvbid0IGNyYXNoXG4gIGRlbGV0ZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpZHgpID0+IHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgcmVwb3J0Um90YXRpb25FcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gZGVsZXRlIHJvdGF0ZWQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uLFxuICAgICAgICBvbkVycm9yXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnLFxuICBvbkVycm9yPzogUm90YXRpb25FcnJvclJlcG9ydGVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZCwgb25FcnJvcilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBjb21wcmVzc0ZpbGUgYWxyZWFkeSByZXBvcnRlZCB0aGlzIGVycm9yIHZpYSBvbkVycm9yL2NvbnNvbGUuZXJyb3I7XG4gICAgICAgIC8vIHN3YWxsb3cgdGhlIHJldGhyb3cgaGVyZSBzbyByZXRlbnRpb24gY2xlYW51cCBiZWxvdyBzdGlsbCBydW5zIGFuZFxuICAgICAgICAvLyB0aGUgZmFpbHVyZSBpc24ndCByZXBvcnRlZCBhIHNlY29uZCB0aW1lIGJ5IHRoZSBjYWxsZXIncyBjYXRjaC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgYXdhaXQgY2xlYW51cFJvdGF0ZWQoZmlsZVBhdGgsIHJldGVudGlvbiwgb25FcnJvcilcbiAgfVxuXG4gIC8vIEludGVydmFsLWJhc2VkIHRyaWdnZXJpbmcgbGl2ZXMgaW4gYEZpbGVTaW5rSW1wbC5tYXliZVJvdGF0ZWBcbiAgLy8gKGZpbGUtc2luay50cyk7IHBlcmZvcm1Sb3RhdGlvbiBpcyB0cmlnZ2VyLWFnbm9zdGljIOKAlCBpdCByZW5hbWVzLFxuICAvLyBjb21wcmVzc2VzLCBhbmQgY2xlYW5zIHVwIHJlZ2FyZGxlc3Mgb2Ygd2h5IHJvdGF0aW9uIGZpcmVkLlxufVxuIiwKICAgICJleHBvcnQgaW50ZXJmYWNlIEtleWVkTXV0ZXgge1xuICAvKipcbiAgICogU2VyaWFsaXplcyB3b3JrIGZvciBga2V5YDogcmVzb2x2ZXMgb25jZSBhbnkgcHJpb3IgaG9sZGVyIGZvciB0aGUgc2FtZVxuICAgKiBrZXkgaGFzIHJlbGVhc2VkLCBhbmQgcmV0dXJucyBhIHJlbGVhc2UgZnVuY3Rpb24gdGhlIGNhbGxlciBNVVNUIGNhbGxcbiAgICogZXhhY3RseSBvbmNlIHRvIGhhbmQgdGhlIGxvY2sgdG8gdGhlIG5leHQgd2FpdGVyIChpZiBhbnkpLlxuICAgKi9cbiAgYWNxdWlyZTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPCgpID0+IHZvaWQ+XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBpbmRlcGVuZGVudCBrZXllZCBtdXRleDogYWNxdWlzaXRpb25zIGZvciBkaWZmZXJlbnQga2V5cyBuZXZlclxuICogYmxvY2sgZWFjaCBvdGhlciwgd2hpbGUgYWNxdWlzaXRpb25zIGZvciB0aGUgc2FtZSBrZXkgYXJlIHNlcmlhbGl6ZWQgaW5cbiAqIEZJRk8gb3JkZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVLZXllZE11dGV4ID0gKCk6IEtleWVkTXV0ZXggPT4ge1xuICBjb25zdCBsb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpXG5cbiAgY29uc3QgYWNxdWlyZSA9IGFzeW5jIChrZXk6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICAgIGNvbnN0IHByaW9yID0gbG9ja3MuZ2V0KGtleSkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICAgIGxldCByZWxlYXNlOiAoKSA9PiB2b2lkXG4gICAgY29uc3QgY3VycmVudCA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgcmVsZWFzZSA9IHJlc29sdmVcbiAgICB9KVxuXG4gICAgLy8gUmVnaXN0ZXIgYmVmb3JlIGF3YWl0aW5nOiBzYW1lLXRpY2sgY2FsbGVycyBtdXN0IGNoYWluIG9udG8gVEhJUyBsb2NrLFxuICAgIC8vIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiB0aGV5IGNhbGxlZCBhY3F1aXJlKCkuXG4gICAgbG9ja3Muc2V0KGtleSwgY3VycmVudClcblxuICAgIGF3YWl0IHByaW9yXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmVsZWFzZT8uKClcbiAgICAgIGlmIChsb2Nrcy5nZXQoa2V5KSA9PT0gY3VycmVudCkge1xuICAgICAgICBsb2Nrcy5kZWxldGUoa2V5KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFjcXVpcmUgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBSZXF1ZXN0SW5mbyxcbiAgU2lua0Vycm9yQ29udGV4dCxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbGFwc2VkTXMgfSBmcm9tICcuLi91dGlscy9kdXJhdGlvbidcbmltcG9ydCB7IHNhbml0aXplTG9nVGV4dCB9IGZyb20gJy4uL3V0aWxzL3Nhbml0aXplJ1xuaW1wb3J0IHsgZ2V0RmlsZVNpbmsgfSBmcm9tICcuL2ZpbGUtc2luaydcblxuaW50ZXJmYWNlIExvZ1RvRmlsZUlucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgZmlsZVBhdGg6IHN0cmluZ1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICAvKiogRHVyYXRpb24vVVJMIHBhcnRzIGFscmVhZHkgY29tcHV0ZWQgYnkgdGhlIGNhbGxlcjsgcGFyc2VkIG9uIHRoZSBmbHkgd2hlbiBvbWl0dGVkLiAqL1xuICBwcmVjb21wdXRlZD86IHsgZHVyYXRpb25NczogbnVtYmVyOyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9XG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuLyoqIFJlc29sdmVzIHRoZSBsb2dnZWQgcGF0aG5hbWUgKHdpdGggcXVlcnkgc3RyaW5nIHdoZW4gY29uZmlndXJlZCkgZnJvbSBwcmVjb21wdXRlZCBwYXJ0cyBvciBhIGZyZXNoIHBhcnNlLiAqL1xuY29uc3QgcmVzb2x2ZVBhdGhuYW1lID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgbG9nUXVlcnlQYXJhbXM6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHByZWNvbXB1dGVkPzogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9XG4pOiBzdHJpbmcgPT4ge1xuICBpZiAocHJlY29tcHV0ZWQpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IHByZWNvbXB1dGVkXG4gICAgcmV0dXJuIGxvZ1F1ZXJ5UGFyYW1zID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBTYWZlbHkgcGFyc2UgVVJMIHRvIGF2b2lkIGNyYXNoZXMgb24gbWFsZm9ybWVkIFVSTHNcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcmV0dXJuIGxvZ1F1ZXJ5UGFyYW1zID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIHRvIHJhdyBVUkwgaWYgcGFyc2luZyBmYWlsc1xuICAgIHJldHVybiByZXF1ZXN0LnVybFxuICB9XG59XG5cbi8qKiBSZXBvcnRzIGEgc2luayBmYWlsdXJlIHZpYSBgY29uZmlnLm9uRXJyb3JgIHdoZW4gc2V0IChzd2FsbG93aW5nIGhvb2sgZXJyb3JzKSwgZWxzZSBzdGRlcnIuICovXG5jb25zdCByZXBvcnRTaW5rRXJyb3IgPSAoXG4gIGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10sXG4gIHNpbms6IFNpbmtFcnJvckNvbnRleHRbJ3NpbmsnXSxcbiAgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgb25FcnJvciA9IGNvbmZpZz8ub25FcnJvclxuICBpZiAoIW9uRXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGZhbGxiYWNrTWVzc2FnZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cbiAgdHJ5IHtcbiAgICBvbkVycm9yKHsgZXJyb3IsIHNpbmsgfSlcbiAgfSBjYXRjaCB7XG4gICAgLy8gU3dhbGxvdyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBob29rIGl0c2VsZi5cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKGlucHV0OiBMb2dUb0ZpbGVJbnB1dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMsIHByZWNvbXB1dGVkIH0gPSBpbnB1dFxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9IHByZWNvbXB1dGVkPy5kdXJhdGlvbk1zID8/IGVsYXBzZWRNcyhzdG9yZS5iZWZvcmVUaW1lKVxuXG4gIGNvbnN0IHBhdGhuYW1lID0gcmVzb2x2ZVBhdGhuYW1lKHJlcXVlc3QsIGNvbmZpZz8ubG9nUXVlcnlQYXJhbXMsIHByZWNvbXB1dGVkKVxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7c2FuaXRpemVMb2dUZXh0KHBhdGhuYW1lLCAxMDI0KX0gJHtzYW5pdGl6ZUxvZ1RleHQobWVzc2FnZSl9XFxuYFxuXG4gIGNvbnN0IG9uUm90YXRpb25FcnJvciA9IGNvbmZpZz8ub25FcnJvclxuICAgID8gKGVycm9yOiB1bmtub3duKSA9PiByZXBvcnRTaW5rRXJyb3IoY29uZmlnLCAncm90YXRpb24nLCAnJywgZXJyb3IpXG4gICAgOiB1bmRlZmluZWRcblxuICB0cnkge1xuICAgIGF3YWl0IGdldEZpbGVTaW5rKGZpbGVQYXRoKS53cml0ZShsaW5lLCB7XG4gICAgICBsb2dEaXJNb2RlOiBjb25maWc/LmxvZ0Rpck1vZGUsXG4gICAgICBsb2dGaWxlTW9kZTogY29uZmlnPy5sb2dGaWxlTW9kZSxcbiAgICAgIGxvZ1JvdGF0aW9uOiBjb25maWc/LmxvZ1JvdGF0aW9uLFxuICAgICAgb25Sb3RhdGlvbkVycm9yXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRTaW5rRXJyb3IoXG4gICAgICBjb25maWcsXG4gICAgICAnZmlsZScsXG4gICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byB3cml0ZSB0byBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgZXJyb3JcbiAgICApXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuIiwKICAgICJpbXBvcnQge1xuICBtZXJnZUxvZ0RhdGFDb250ZXh0LFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpbHRlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHR5cGUgeyBTYW1wbGluZ1J1bnRpbWUgfSBmcm9tICcuLi9zYW1wbGluZydcbmltcG9ydCB7IGVsYXBzZWRNcyB9IGZyb20gJy4uL3V0aWxzL2R1cmF0aW9uJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHtcbiAgdHlwZSBGb3JtYXRDb250ZXh0LFxuICBmb3JtYXRMb2dPdXRwdXQsXG4gIHR5cGUgUHJlY29tcHV0ZWRMb2dQYXJ0c1xufSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5cbi8qKlxuICogV2hpY2ggc2lua3MgYXJlIGFjdGl2ZSBmb3IgYSBnaXZlbiBjb25maWcsIHJlc29sdmVkIG9uY2UgcGVyIGxvZ2dlclxuICogaW5zdGFuY2UgKHNlZSBgY3JlYXRlTG9nZ2VyYCkgc2luY2Ugbm9uZSBvZiB0aGVzZSBkZXBlbmQgb24gcGVyLXJlcXVlc3RcbiAqIHN0YXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmtzIHtcbiAgaGFzRmlsZUxvZ2dpbmc6IGJvb2xlYW5cbiAgaGFzSW50ZXJuYWxMb2dnZXI6IGJvb2xlYW5cbiAgaGFzVHJhbnNwb3J0czogYm9vbGVhblxuICAvKiogVHJ1ZSB3aGVuIG5vIHNpbmsgaXMgYWN0aXZlIGF0IGFsbDogYGxvZygpYC9gaGFuZGxlSHR0cEVycm9yKClgIGNhbiBza2lwIGFsbCB3b3JrLiAqL1xuICBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQ6IGJvb2xlYW5cbiAgLyoqIFRydWUgd2hlbiBhdCBsZWFzdCBvbmUgYWN0aXZlIHNpbmsgcmVhZHMgcGF0aG5hbWUvc2VhcmNoIChmaWxlIGxvZ2dpbmcgb3IgdGhlIGNvbnNvbGUgZm9ybWF0dGVyKS4gKi9cbiAgbmVlZHNVcmxQYXJ0czogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVNpbmtzID0gKGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10pOiBTaW5rcyA9PiB7XG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IGhhc1RyYW5zcG9ydHMgPSAoY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGggPz8gMCkgPiAwXG4gIGNvbnN0IGhhc0ZpbGVMb2dnaW5nID1cbiAgICAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykgJiYgISFjb25maWc/LmxvZ0ZpbGVQYXRoXG4gIGNvbnN0IGhhc0ludGVybmFsTG9nZ2VyID0gISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpXG4gIGNvbnN0IGlzRWZmZWN0aXZlbHlEaXNhYmxlZCA9ICEoXG4gICAgaGFzVHJhbnNwb3J0cyB8fFxuICAgIGhhc0ZpbGVMb2dnaW5nIHx8XG4gICAgaGFzSW50ZXJuYWxMb2dnZXJcbiAgKVxuICBjb25zdCBuZWVkc1VybFBhcnRzID0gaGFzRmlsZUxvZ2dpbmcgfHwgaGFzSW50ZXJuYWxMb2dnZXJcblxuICByZXR1cm4ge1xuICAgIGhhc0ZpbGVMb2dnaW5nLFxuICAgIGhhc0ludGVybmFsTG9nZ2VyLFxuICAgIGhhc1RyYW5zcG9ydHMsXG4gICAgaXNFZmZlY3RpdmVseURpc2FibGVkLFxuICAgIG5lZWRzVXJsUGFydHNcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbG9nRmlsdGVyPzogTG9nRmlsdGVyKTogYm9vbGVhbiA9PiB7XG4gIGlmICghbG9nRmlsdGVyPy5sZXZlbCB8fCBsb2dGaWx0ZXIubGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gbG9nRmlsdGVyLmxldmVsLmluY2x1ZGVzKGxldmVsKVxufVxuXG4vKiogUGFyc2VzIHRoZSBVUkwgb25jZTsgb25seSBjYWxsZWQgd2hlbiBhdCBsZWFzdCBvbmUgYWN0aXZlIHNpbmsgcmVhZHMgcGF0aG5hbWUvc2VhcmNoLiAqL1xuZXhwb3J0IGNvbnN0IHBhcnNlUmVxdWVzdFVybE9uY2UgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4pOiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nIH0gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUsIHNlYXJjaCB9ID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgICByZXR1cm4geyBwYXRobmFtZSwgc2VhcmNoIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgcGF0aG5hbWU6IHJlcXVlc3QudXJsIHx8ICcvJywgc2VhcmNoOiAnJyB9XG4gIH1cbn1cblxuLyoqXG4gKiBTYW1wbGVzIGR1cmF0aW9uIGFuZCBwYXJzZXMgdGhlIFVSTCBvbmNlIHBlciBlbWlzc2lvbiBmb3IgdGhlIHNpbmtzIHRoYXQgd2lsbCBhY3R1YWxseSBydW4uXG4gKiBgbG9nVG9UcmFuc3BvcnRzYCcgbWV0YSBvbmx5IHJlYWRzIGBkdXJhdGlvbk1zYCAobm90IHBhdGhuYW1lL3NlYXJjaCksIHNvIHRoZSBVUkwgaXMgcGFyc2VkXG4gKiBvbmx5IHdoZW4gZmlsZSBsb2dnaW5nIG9yIHRoZSBpbnRlcm5hbCBjb25zb2xlIGxvZ2dlciBpcyBhY3RpdmUg4oCUIHNraXBwaW5nIGl0IGVudGlyZWx5IGZvclxuICogdHJhbnNwb3J0cy1vbmx5IGNvbmZpZ3MsIG1hdGNoaW5nIHRoYXQgcGF0aCdzIHByZS1vcHRpbWl6YXRpb24gYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wdXRlUHJlY29tcHV0ZWRMb2dQYXJ0cyA9IChcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIG5lZWRzVXJsUGFydHM6IGJvb2xlYW4sXG4gIGR1cmF0aW9uT3ZlcnJpZGU/OiBudW1iZXJcbik6IFByZWNvbXB1dGVkTG9nUGFydHMgPT4ge1xuICBjb25zdCBkdXJhdGlvbk1zID0gZHVyYXRpb25PdmVycmlkZSA/PyBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSlcbiAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoIH0gPSBuZWVkc1VybFBhcnRzXG4gICAgPyBwYXJzZVJlcXVlc3RVcmxPbmNlKHJlcXVlc3QpXG4gICAgOiB7IHBhdGhuYW1lOiAnJywgc2VhcmNoOiAnJyB9XG5cbiAgcmV0dXJuIHsgZHVyYXRpb25NcywgcGF0aG5hbWUsIHNlYXJjaCB9XG59XG5cbmNvbnN0IGNvbnNvbGVGb3JMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwpOiB0eXBlb2YgY29uc29sZS5sb2cgPT4ge1xuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICByZXR1cm4gY29uc29sZS5kZWJ1Z1xuICAgIH1cbiAgICBjYXNlICdJTkZPJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuaW5mb1xuICAgIH1cbiAgICBjYXNlICdXQVJOSU5HJzoge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FyblxuICAgIH1cbiAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yXG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZ1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtaXRJbnB1dCB7XG4gIC8qKiBTa2lwcyB0aGUgc2FtcGxpbmcgZ2F0ZTsgc2V0IHdoZW4gcmVwbGF5aW5nIGEgdGFpbC1yZXNjdWVkIHJlY29yZC4gKi9cbiAgYnlwYXNzU2FtcGxpbmc/OiBib29sZWFuXG4gIC8qKiBTaGFyZWQgcGVyLXJlcXVlc3QgY29udGV4dCBiYWcgKHBlZWtlZCwgbmV2ZXIgY2xvbmVkL3JldGFpbmVkKS4gKi9cbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIC8qKiBEdXJhdGlvbiBjYXB0dXJlZCB3aGVuIGEgcmVjb3JkIHdhcyBidWZmZXJlZCwgcmVwbGFjaW5nIHRoZSBsaXZlIHNhbXBsZS4gKi9cbiAgZHVyYXRpb25PdmVycmlkZT86IG51bWJlclxuICAvKiogSG9pc3RlZCBwZXItbG9nZ2VyIGNvbnN0YW50cyBmb3IgYGZvcm1hdExvZ091dHB1dGA7IG9ubHkgcmVhZCB3aGVuIHRoZSBpbnRlcm5hbCBjb25zb2xlIGxvZ2dlciBpcyBhY3RpdmUuICovXG4gIGZvcm1hdENvbnRleHQ6IEZvcm1hdENvbnRleHRcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgLyoqIEhvaXN0ZWQgcGVyLWxvZ2dlciBzYW1wbGluZyBydW50aW1lOyB1bmRlZmluZWQgd2hlbiBzYW1wbGluZyBpcyBvZmYuICovXG4gIHNhbXBsaW5nPzogU2FtcGxpbmdSdW50aW1lXG4gIC8qKiBIb2lzdGVkIHBlci1sb2dnZXIgc2luayBnYXRlcyBmcm9tIHtAbGluayByZXNvbHZlU2lua3N9LiAqL1xuICBzaW5rczogU2lua3NcbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG4vKipcbiAqIFRoZSBzaW5nbGUgbG9nLWVtaXNzaW9uIHBpcGVsaW5lIHNoYXJlZCBieSB0aGUgc3VjY2VzcyBwYXRoIChgbG9nKClgKSBhbmRcbiAqIHRoZSBlcnJvciBwYXRoIChgaGFuZGxlSHR0cEVycm9yKClgKTogZmlsdGVyIGNoZWNrIC0+IGNvbnRleHQgbWVyZ2UgLT5cbiAqIHJlZGFjdCAtPiB0cmFuc3BvcnRzIC0+IGZpbGUgLT4gY29uc29sZSwgYWxsIGdhdGVkIGJ5IHRoZSBzYW1lIGBzaW5rc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0ID0gKHtcbiAgYnlwYXNzU2FtcGxpbmcsXG4gIGNvbnRleHRTdG9yZSxcbiAgZGF0YSxcbiAgZHVyYXRpb25PdmVycmlkZSxcbiAgZm9ybWF0Q29udGV4dCxcbiAgbGV2ZWwsXG4gIG9wdGlvbnMsXG4gIHJlcXVlc3QsXG4gIHNhbXBsaW5nLFxuICBzaW5rcyxcbiAgc3RvcmVcbn06IEVtaXRJbnB1dCk6IHZvaWQgPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGlmIChzaW5rcy5pc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2FtcGxpbmcgJiYgIWJ5cGFzc1NhbXBsaW5nKSB7XG4gICAgY29uc3QgZGVjaXNpb24gPSBzYW1wbGluZy5kZWNpZGUobGV2ZWwsIHJlcXVlc3QpXG4gICAgaWYgKGRlY2lzaW9uID09PSAnZHJvcCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVjaXNpb24gPT09ICdidWZmZXInKSB7XG4gICAgICAvLyBCdWZmZXJlZCByYXc6IGNvbnRleHQgbWVyZ2UsIHJlZGFjdGlvbiBhbmQgZm9ybWF0dGluZyBhcmUgZGVmZXJyZWQgdG9cbiAgICAgIC8vIHJlcGxheSwgc28gYSByZXF1ZXN0IHRoYXQgbmV2ZXIgZ2V0cyByZXNjdWVkIHBheXMgYWxtb3N0IG5vdGhpbmcuXG4gICAgICBzYW1wbGluZy5idWZmZXIocmVxdWVzdCwge1xuICAgICAgICBkYXRhLFxuICAgICAgICBkdXJhdGlvbk1zOiBlbGFwc2VkTXMoc3RvcmUuYmVmb3JlVGltZSksXG4gICAgICAgIGxldmVsXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gbWVyZ2VMb2dEYXRhQ29udGV4dChcbiAgICBkYXRhLFxuICAgIC8vIG1lcmdlTG9nRGF0YUNvbnRleHQgb25seSByZWFkcy9zcHJlYWRzIHRoaXMgYmFnIGludG8gYSBuZXcgb2JqZWN0OyBpdCBuZXZlciByZXRhaW5zXG4gICAgLy8gdGhlIHJlZmVyZW5jZSwgc28gYSBub24tY2xvbmluZyBwZWVrIGlzIHNhZmUgaGVyZS5cbiAgICBjb250ZXh0U3RvcmUucGVla0NvbnRleHQocmVxdWVzdClcbiAgKVxuICBjb25zdCBsb2dEYXRhID1cbiAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWVcbiAgICAgID8gcmVkYWN0KGRhdGFXaXRoQ29udGV4dCwgY29uZmlnPy5yZWRhY3RLZXlzKVxuICAgICAgOiBkYXRhV2l0aENvbnRleHRcbiAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlXG4gICAgICA/IHJlZGFjdFJlcXVlc3QocmVxdWVzdCwgY29uZmlnPy5yZWRhY3RLZXlzKVxuICAgICAgOiByZXF1ZXN0XG5cbiAgY29uc3QgcHJlY29tcHV0ZWQgPSBjb21wdXRlUHJlY29tcHV0ZWRMb2dQYXJ0cyhcbiAgICBzdG9yZSxcbiAgICBsb2dSZXF1ZXN0LFxuICAgIHNpbmtzLm5lZWRzVXJsUGFydHMsXG4gICAgZHVyYXRpb25PdmVycmlkZVxuICApXG5cbiAgaWYgKHNpbmtzLmhhc1RyYW5zcG9ydHMpIHtcbiAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgIGxldmVsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHByZWNvbXB1dGVkLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgfVxuXG4gIGlmIChzaW5rcy5oYXNGaWxlTG9nZ2luZykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgbG9nVG9GaWxlKHtcbiAgICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGxldmVsLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBwcmVjb21wdXRlZCxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgc3RvcmVcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLyogSWdub3JlIGVycm9yczogZmlsZS50cyBhbHJlYWR5IHJlcG9ydGVkIHRoZW0gKGNvbnNvbGUuZXJyb3Igb3IgY29uZmlnLm9uRXJyb3IpLiAqL1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBpZiAoIXNpbmtzLmhhc0ludGVybmFsTG9nZ2VyKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICBkYXRhOiBsb2dEYXRhLFxuICAgIGZvcm1hdENvbnRleHQsXG4gICAgbGV2ZWwsXG4gICAgb3B0aW9ucyxcbiAgICBwcmVjb21wdXRlZCxcbiAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgIHN0b3JlXG4gIH0pXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gIGNvbnNvbGVGb3JMZXZlbChsZXZlbCkobWVzc2FnZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB0eXBlIHsgU2FtcGxpbmdSdW50aW1lIH0gZnJvbSAnLi4vc2FtcGxpbmcnXG5pbXBvcnQgeyBub3JtYWxpemVMb2dnZWRFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRDb250ZXh0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgZW1pdCwgdHlwZSBTaW5rcywgc2hvdWxkTG9nIH0gZnJvbSAnLi9lbWl0J1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuLyoqIFRoZSBzdGF0dXMgYSB0aHJvd24gdmFsdWUgbWFwcyB0bzsgYW55dGhpbmcgd2l0aG91dCBvbmUgaXMgYSA1MDAuICovXG5leHBvcnQgY29uc3QgZXJyb3JTdGF0dXMgPSAoZXJyb3I6IHVua25vd24pOiBudW1iZXIgPT5cbiAgaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogdW5rbm93bixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICBzaW5rczogU2lua3MsXG4gIGZvcm1hdENvbnRleHQ6IEZvcm1hdENvbnRleHQsXG4gIHNhbXBsaW5nPzogU2FtcGxpbmdSdW50aW1lXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcblxuICBjb25zdCBzdGF0dXMgPSBlcnJvclN0YXR1cyhlcnJvcilcbiAgY29uc3QgbGV2ZWw6IExvZ0xldmVsID0gc3RhdHVzID49IDQwMCAmJiBzdGF0dXMgPCA1MDAgPyAnV0FSTklORycgOiAnRVJST1InXG5cbiAgLy8gTWlycm9ycyBlbWl0KCkncyBvd24gZ2F0ZSBjaGVjaywgYnV0IHBlcmZvcm1lZCAqYmVmb3JlKiBub3JtYWxpemluZyB0aGVcbiAgLy8gZXJyb3Igc28gYSBmaWx0ZXJlZC1vdXQvZGlzYWJsZWQgbG9nZ2VyIG5ldmVyIHBheXMgZm9yIHRoYXQgd29yay5cbiAgLy8gZW1pdCgpIHJlLWNoZWNrcyB0aGUgc2FtZSBnYXRlLCB3aGljaCBpcyBjaGVhcCBhbmQga2VlcHMgdGhpcyBmdW5jdGlvbiBhXG4gIC8vIHRoaW4sIHByb3ZhYmx5LWNvcnJlY3Qgd3JhcHBlciBhcm91bmQgdGhlIHNoYXJlZCBwaXBlbGluZS5cbiAgaWYgKHNpbmtzLmlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgZXJyb3I6IHNhZmVFcnJvciwgbWVzc2FnZSB9ID0gbm9ybWFsaXplTG9nZ2VkRXJyb3IoXG4gICAgZXJyb3IsXG4gICAgY29uZmlnPy5sb2dFcnJvclBheWxvYWQgPT09IHRydWVcbiAgKVxuXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBlcnJvcjogc2FmZUVycm9yLCBtZXNzYWdlLCBzdGF0dXMgfVxuXG4gIGVtaXQoe1xuICAgIGNvbnRleHRTdG9yZSxcbiAgICBkYXRhLFxuICAgIGZvcm1hdENvbnRleHQsXG4gICAgbGV2ZWwsXG4gICAgb3B0aW9ucyxcbiAgICByZXF1ZXN0LFxuICAgIHNhbXBsaW5nLFxuICAgIHNpbmtzLFxuICAgIHN0b3JlXG4gIH0pXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUmVxdWVzdElkQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuY29uc3QgREVGQVVMVF9IRUFERVIgPSAnWC1SZXF1ZXN0LUlkJ1xuY29uc3QgVkFMSURfUkVRVUVTVF9JRCA9IC9eW0EtWmEtejAtOS5fLV17MSwxMjh9JC9cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgZ2VuZXJhdG9yOiAoKSA9PiBzdHJpbmdcbiAgaGVhZGVyOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBOb3JtYWxpc2VzIHRoZSBgcmVxdWVzdElkYCBvcHRpb24gaW50byBhIGNvbmNyZXRlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogLSBgdW5kZWZpbmVkYCAvIGBmYWxzZWAg4oaSIGBudWxsYCAoZGlzYWJsZWQpXG4gKiAtIGB0cnVlYCDihpIgZGVmYXVsdCBjb25maWdcbiAqIC0gYFJlcXVlc3RJZENvbmZpZ2Ag4oaSIG1lcmdlZCB3aXRoIGRlZmF1bHRzOyBgZW5hYmxlZDogZmFsc2VgIGluc2lkZSB0aGUgb2JqZWN0IGRpc2FibGVzIHRoZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVxdWVzdElkQ29uZmlnID0gKFxuICByYXc/OiBib29sZWFuIHwgUmVxdWVzdElkQ29uZmlnXG4pOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB8IG51bGwgPT4ge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAocmF3ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBnZW5lcmF0b3I6ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBoZWFkZXI6IERFRkFVTFRfSEVBREVSXG4gICAgfVxuICB9XG5cbiAgLy8gT2JqZWN0IGZvcm0g4oCUIGBlbmFibGVkYCBkZWZhdWx0cyB0byBgdHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIHByb3ZpZGVkXG4gIGlmIChyYXcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGdlbmVyYXRvcjogcmF3LmdlbmVyYXRvciA/PyAoKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSksXG4gICAgaGVhZGVyOiByYXcuaGVhZGVyPy50cmltKCkgfHwgREVGQVVMVF9IRUFERVJcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIGV4aXN0aW5nIHJlcXVlc3QgSUQgZnJvbSB0aGUgaW5jb21pbmcgcmVxdWVzdCBoZWFkZXIsIG9yIGdlbmVyYXRlcyBhXG4gKiBuZXcgb25lIHVzaW5nIHRoZSBjb25maWd1cmVkIGdlbmVyYXRvci5cbiAqXG4gKiBJbmJvdW5kIHZhbHVlcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgYFZBTElEX1JFUVVFU1RfSURgIChhbHBoYW51bWVyaWMgcGx1c1xuICogYC5gLCBgX2AsIGAtYCwgMS0xMjggY2hhcnMpIGJlZm9yZSBiZWluZyB0cnVzdGVkIOKAlCByZXF1ZXN0IElEcyBmbG93IGludG8gbG9nXG4gKiBsaW5lcywgcmVzcG9uc2UgaGVhZGVycywgYW5kIGNvbnRleHQgdHJlZXMsIHNvIG1hbGZvcm1lZCBvciBvdmVyc2l6ZWRcbiAqIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCBhIGZyZXNobHkgZ2VuZXJhdGVkIG9uZSByYXRoZXIgdGhhbiBlY2hvZWQgYmFjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlUmVxdWVzdElkID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBjb25maWc6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleGlzdGluZyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoY29uZmlnLmhlYWRlcilcbiAgaWYgKGV4aXN0aW5nICYmIFZBTElEX1JFUVVFU1RfSUQudGVzdChleGlzdGluZykpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdcbiAgfVxuICByZXR1cm4gY29uZmlnLmdlbmVyYXRvcigpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucywgU2lua0Vycm9yQ29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBmbHVzaEFsbEZpbGVTaW5rcyB9IGZyb20gJy4vZmlsZS1zaW5rJ1xuaW1wb3J0IHsgZmx1c2hUcmFuc3BvcnRzIH0gZnJvbSAnLi9pbmRleCdcblxuLyoqXG4gKiBSZXNvbHZlcyBgdHJ1ZWAgd2hlbiBgbXNgIGVsYXBzZWQgYmVmb3JlIGB3b3JrYCBzZXR0bGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEEgbm9uLXBvc2l0aXZlIGBtc2AgbWVhbnMgXCJzdGFydCB0aGUgd29yayBidXQgZG8gbm90IHdhaXRcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IHJhY2VXaXRoVGltZW91dCA9IChcbiAgd29yazogUHJvbWlzZTx1bmtub3duPixcbiAgbXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIC8vIEEgZmFpbGVkIGZsdXNoIGlzIHJlcG9ydGVkIGJ5IHRoZSBzaW5rcyB0aGVtc2VsdmVzOyBoZXJlIGl0IG9ubHkgY291bnRzXG4gIC8vIGFzIFwic2V0dGxlZFwiLCBzbyBzd2FsbG93IHRoZSByZWplY3Rpb24gZWl0aGVyIHdheS5cbiAgY29uc3Qgc2V0dGxlZCA9IHdvcmsudGhlbihcbiAgICAoKSA9PiBmYWxzZSxcbiAgICAoKSA9PiBmYWxzZVxuICApXG5cbiAgaWYgKG1zIDw9IDApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUodHJ1ZSksIG1zKVxuICAgIC8vIE5ldmVyIGhvbGQgdGhlIGV2ZW50IGxvb3Agb3BlbiBqdXN0IHRvIG9ic2VydmUgYSBmbHVzaCB0aGF0IGlzIHJhY2luZ1xuICAgIC8vIGFuIGV4aXRpbmcgcHJvY2Vzcy5cbiAgICB0aW1lci51bnJlZj8uKClcbiAgICBzZXR0bGVkLnRoZW4odGltZWRPdXQgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgcmVzb2x2ZSh0aW1lZE91dClcbiAgICB9KVxuICB9KVxufVxuXG4vKipcbiAqIFJlcG9ydHMgYSBzaHV0ZG93biBmbHVzaCB0aGF0IHJhbiBvdXQgb2YgdGltZSDigJQgdGhyb3VnaCBgb25FcnJvcmAgd2hlbiB0aGVcbiAqIGhvb2sgZXhpc3RzLCBvdGhlcndpc2Ugb24gc3RkZXJyLCBidXQgbmV2ZXIgYm90aC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlcG9ydFNodXRkb3duVGltZW91dCA9IChcbiAgb25FcnJvcjogKChjb250ZXh0OiBTaW5rRXJyb3JDb250ZXh0KSA9PiB2b2lkKSB8IHVuZGVmaW5lZCxcbiAgdGltZW91dE1zOiBudW1iZXJcbik6IHZvaWQgPT4ge1xuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICBgW2xvZ2l4bHlzaWFdIHNodXRkb3duIGZsdXNoIGRpZCBub3QgY29tcGxldGUgd2l0aGluICR7dGltZW91dE1zfW1zOyBzb21lIHRyYW5zcG9ydCBvciBmaWxlIHdyaXRlcyBtYXkgbm90IGhhdmUgYmVlbiBmbHVzaGVkLmBcbiAgKVxuXG4gIGlmIChvbkVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9uRXJyb3IoeyBlcnJvciwgc2luazogJ3NodXRkb3duJyB9KVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyBlcnJvcnMgdGhyb3duIGJ5IHRoZSBob29rIGl0c2VsZi5cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zb2xlLmVycm9yKGVycm9yLm1lc3NhZ2UpXG59XG5cbi8qKiBEcmFpbnMgZXZlcnkgdHJhbnNwb3J0IGFuZCBldmVyeSByZWdpc3RlcmVkIGZpbGUgc2luay4gKi9cbmV4cG9ydCBjb25zdCBmbHVzaEFsbCA9IGFzeW5jIChvcHRpb25zOiBPcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbZmx1c2hUcmFuc3BvcnRzKG9wdGlvbnMpLCBmbHVzaEFsbEZpbGVTaW5rcygpXSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ2dlciwgT3B0aW9ucywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRMaWtlIHtcbiAgcmVhZG9ubHkgZGF0YT86IHsgc3RvcmU/OiB7IGxvZ2dlcj86IExvZ2dlciB9IH1cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc0hhbmRsZXJIb29rczxcbiAgVE1lc3NhZ2UgPSB1bmtub3duLFxuICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlID0gV2ViU29ja2V0TGlrZVxuPiB7XG4gIGNsb3NlPzogKHdzOiBUV3MsIGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZykgPT4gdm9pZFxuICBtZXNzYWdlPzogKHdzOiBUV3MsIG1lc3NhZ2U6IFRNZXNzYWdlKSA9PiB2b2lkXG4gIG9wZW4/OiAod3M6IFRXcykgPT4gdm9pZFxufVxuXG4vLyBTeW50aGV0aWMgcmVxdWVzdHMgYXJlIG9ubHkgcmVhZCAobWV0aG9kL3VybCkgYnkgdGhlIGxvZyBwaXBlbGluZSwgbmV2ZXIgbXV0YXRlZCwgc28gY2FjaGluZ1xuLy8gb25lIHBlciBwYXRoIGF2b2lkcyBhbGxvY2F0aW5nIGEgZnJlc2ggUmVxdWVzdCBvbiBldmVyeSBXUyBvcGVuL21lc3NhZ2UvY2xvc2UgbG9nIGV2ZW50LlxuY29uc3Qgd3NSZXF1ZXN0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVxdWVzdD4oKVxuXG5jb25zdCB3c1N5bnRoZXRpY1JlcXVlc3QgPSAocGF0aDogc3RyaW5nKTogUmVxdWVzdCA9PiB7XG4gIGxldCByZXF1ZXN0ID0gd3NSZXF1ZXN0Q2FjaGUuZ2V0KHBhdGgpXG4gIGlmICghcmVxdWVzdCkge1xuICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChgaHR0cDovL2xvZ2l4bHlzaWEubG9jYWwke3BhdGh9YCwgeyBtZXRob2Q6ICdXUycgfSlcbiAgICB3c1JlcXVlc3RDYWNoZS5zZXQocGF0aCwgcmVxdWVzdClcbiAgfVxuICByZXR1cm4gcmVxdWVzdFxufVxuXG5jb25zdCBwYXlsb2FkVHlwZU9mID0gKG1lc3NhZ2U6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhtZXNzYWdlKSkge1xuICAgIHJldHVybiAnYmluYXJ5J1xuICB9XG4gIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJ3N0cmluZydcbiAgfVxuICByZXR1cm4gdHlwZW9mIG1lc3NhZ2Vcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGxvZ2dlcjogTG9nZ2VyLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbikgPT4ge1xuICBjb25zdCB3c1RpbWluZ3MgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJpZ2ludD4oKVxuXG4gIGNvbnN0IGxvZ1dzID0gKFxuICAgIGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InLFxuICAgIHdzOiBXZWJTb2NrZXRMaWtlLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBrZXkgPSB3cyBhcyBvYmplY3RcbiAgICBjb25zdCBiZWZvcmVUaW1lID0gd3NUaW1pbmdzLmdldChrZXkpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZSB9XG4gICAgLy8gUmVhZC1vbmx5OiBpbW1lZGlhdGVseSBzcHJlYWQgYmVsb3cgaW50byBhIG5ldyBvYmplY3QsIG5ldmVyIHJldGFpbmVkIG9yIG11dGF0ZWQuXG4gICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUucGVla0NvbnRleHQoa2V5KVxuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDAgfHwgZXh0cmFcbiAgICAgICAgPyB7IC4uLmFjY3VtdWxhdGVkLCAuLi5leHRyYSwgd3NJZDogd3MuaWQgfVxuICAgICAgICA6IHsgd3NJZDogd3MuaWQgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIGxldmVsLFxuICAgICAgd3NTeW50aGV0aWNSZXF1ZXN0KHBhdGgpLFxuICAgICAgeyBjb250ZXh0LCBtZXNzYWdlLCBzdGF0dXM6IDIwMCB9LFxuICAgICAgc3RvcmVcbiAgICApXG4gIH1cblxuICByZXR1cm4gPFxuICAgIFRNZXNzYWdlLFxuICAgIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UsXG4gICAgY29uc3QgVEhvb2tzIGV4dGVuZHMgV3NIYW5kbGVySG9va3M8VE1lc3NhZ2UsIFRXcz5cbiAgPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaG9va3M6IFRIb29rc1xuICApOiBUSG9va3MgPT5cbiAgICAoe1xuICAgICAgLi4uaG9va3MsXG4gICAgICBjbG9zZSh3cywgY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaG9va3MuY2xvc2U/Lih3cywgY29kZSwgcmVhc29uKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4dHJhLmNvZGUgPSBjb2RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZXh0cmEucmVhc29uID0gcmVhc29uXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dXcyhcbiAgICAgICAgICAgICAgJ0lORk8nLFxuICAgICAgICAgICAgICB3cyxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgJ1dlYlNvY2tldCBjbG9zZWQnLFxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhleHRyYSkubGVuZ3RoID4gMCA/IGV4dHJhIDogdW5kZWZpbmVkXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQod3MgYXMgb2JqZWN0KVxuICAgICAgICAgIHdzVGltaW5ncy5kZWxldGUod3MgYXMgb2JqZWN0KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbWVzc2FnZSh3cywgbWVzc2FnZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhvb2tzLm1lc3NhZ2U/Lih3cywgbWVzc2FnZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG1lc3NhZ2UnLCB7XG4gICAgICAgICAgICAgIHBheWxvYWRUeXBlOiBwYXlsb2FkVHlwZU9mKG1lc3NhZ2UpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wZW4od3MpIHtcbiAgICAgICAgd3NUaW1pbmdzLnNldCh3cyBhcyBvYmplY3QsIHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGhvb2tzLm9wZW4/Lih3cylcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG9wZW5lZCcpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkgYXMgVEhvb2tzXG59XG4iLAogICAgIi8qKiBUaGUgY2xpZW50LXNhZmUgdmlldyBvZiBhbiB7QGxpbmsgSHR0cEVycm9yfSDigJQgZXZlcnl0aGluZyBidXQgYGludGVybmFsYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cEVycm9yUGF5bG9hZCB7XG4gIGNvZGU/OiBzdHJpbmdcbiAgZml4Pzogc3RyaW5nXG4gIGxpbms/OiBzdHJpbmdcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHN0YXR1czogbnVtYmVyXG4gIHdoeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvckluaXQge1xuICAvKipcbiAgICogU3RhYmxlLCBtYWNoaW5lLXJlYWRhYmxlIGlkZW50aWZpZXIgdGhlIGNsaWVudCBjYW4gYnJhbmNoIG9uLCBlLmcuXG4gICAqIGBQQVlNRU5UX0RFQ0xJTkVEYC4gVW5saWtlIGBtZXNzYWdlYCwgaXQgaXMgc2FmZSB0byBkZXBlbmQgb246IHJld29yZGluZ1xuICAgKiB0aGUgbWVzc2FnZSBkb2VzIG5vdCBicmVhayBhIGNhbGxlci5cbiAgICovXG4gIGNvZGU/OiBzdHJpbmdcbiAgLyoqIFdoYXQgdGhlIGNhbGxlciBzaG91bGQgZG8gYWJvdXQgaXQsIGluIHBsYWluIGxhbmd1YWdlLiAqL1xuICBmaXg/OiBzdHJpbmdcbiAgLyoqXG4gICAqIERpYWdub3N0aWNzIGZvciB5b3UsIG5vdCBmb3IgdGhlIGNhbGxlcjogYSBxdWVyeSwgYW4gdXBzdHJlYW0gYm9keSwgYW4gaWQuXG4gICAqIExvZ2dlZCBpbiBmdWxsLCBuZXZlciBzZXJpYWxpemVkIGludG8gdGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgaW50ZXJuYWw/OiB1bmtub3duXG4gIC8qKiBEb2N1bWVudGF0aW9uIFVSTCBmb3IgdGhpcyBmYWlsdXJlLiAqL1xuICBsaW5rPzogc3RyaW5nXG4gIC8qKiBXaHkgdGhlIHJlcXVlc3QgZmFpbGVkLCBpbiBwbGFpbiBsYW5ndWFnZS4gKi9cbiAgd2h5Pzogc3RyaW5nXG59XG5cbi8qKlxuICogQW4gSFRUUCBlcnJvciBjYXJyeWluZyB0aGUgY29udGV4dCB0aGF0IG1ha2VzIGEgZmFpbHVyZSBhY3Rpb25hYmxlLlxuICpcbiAqIGBjb2RlYCwgYHdoeWAsIGBmaXhgLCBhbmQgYGxpbmtgIGFwcGVhciBpbiBib3RoIHRoZSBsb2cgYW5kIHRoZSByZXNwb25zZS5cbiAqIGBpbnRlcm5hbGAgYXBwZWFycyBvbmx5IGluIHRoZSBsb2cg4oCUIGl0IGlzIG5vbi1lbnVtZXJhYmxlIGFuZCBleGNsdWRlZCBmcm9tXG4gKiBgdG9KU09OKClgLCBzbyBubyBzZXJpYWxpemVyIGNhbiBsZWFrIGl0IGludG8gYSByZXNwb25zZSBib2R5LlxuICpcbiAqIGBgYHRzXG4gKiB0aHJvdyBuZXcgSHR0cEVycm9yKDQwMiwgJ0NhcmQgZGVjbGluZWQnLCB7XG4gKiAgIGNvZGU6ICdQQVlNRU5UX0RFQ0xJTkVEJyxcbiAqICAgd2h5OiAnVGhlIGlzc3VpbmcgYmFuayByZWplY3RlZCB0aGUgY2hhcmdlLicsXG4gKiAgIGZpeDogJ1RyeSBhIGRpZmZlcmVudCBjYXJkLCBvciBjb250YWN0IHlvdXIgYmFuay4nLFxuICogICBsaW5rOiAnaHR0cHM6Ly9kb2NzLmV4YW1wbGUuY29tL2Vycm9ycy9wYXltZW50LWRlY2xpbmVkJyxcbiAqICAgaW50ZXJuYWw6IHsgZ2F0ZXdheUNvZGU6ICdkb19ub3RfaG9ub3InLCBjaGFyZ2VJZCB9XG4gKiB9KVxuICogYGBgXG4gKlxuICogQSBiYXJlIGBuZXcgSHR0cEVycm9yKDQwNCwgJ05vdCBmb3VuZCcpYCBiZWhhdmVzIGV4YWN0bHkgYXMgYmVmb3JlOiB0aGVcbiAqIHJlc3BvbnNlIGJvZHkgaXMgdGhlIHBsYWluIG1lc3NhZ2UuIE9ubHkgYW4gZXJyb3IgdGhhdCBjYXJyaWVzIGF0IGxlYXN0IG9uZVxuICogY2xpZW50LWZhY2luZyBmaWVsZCByZXNwb25kcyBhcyBKU09OLlxuICovXG4vKipcbiAqIFN0YXR1c2VzIHRoZSBGZXRjaCBzcGVjIGZvcmJpZHMgYSBib2R5IG9uIOKAlCBgUmVzcG9uc2UuanNvbmAgdGhyb3dzIGZvclxuICogdGhlc2UsIGFzIGl0IGRvZXMgZm9yIGFueXRoaW5nIG91dHNpZGUgMjAwLTU5OS5cbiAqL1xuY29uc3QgTlVMTF9CT0RZX1NUQVRVU0VTID0gbmV3IFNldChbMTAxLCAxMDMsIDIwNCwgMjA1LCAzMDRdKVxuY29uc3QgTUlOX1JFU1BPTlNFX1NUQVRVUyA9IDIwMFxuY29uc3QgTUFYX1JFU1BPTlNFX1NUQVRVUyA9IDU5OVxuY29uc3QgRkFMTEJBQ0tfUkVTUE9OU0VfU1RBVFVTID0gNTAwXG5cbi8qKiBGYWxscyBiYWNrIHRvIDUwMCBmb3IgYSBzdGF0dXMgYFJlc3BvbnNlLmpzb25gIHdvdWxkIHJlamVjdC4gKi9cbmNvbnN0IHJlc3BvbnNlU3RhdHVzID0gKHN0YXR1czogbnVtYmVyKTogbnVtYmVyID0+XG4gIHN0YXR1cyA+PSBNSU5fUkVTUE9OU0VfU1RBVFVTICYmXG4gIHN0YXR1cyA8PSBNQVhfUkVTUE9OU0VfU1RBVFVTICYmXG4gICFOVUxMX0JPRFlfU1RBVFVTRVMuaGFzKHN0YXR1cylcbiAgICA/IHN0YXR1c1xuICAgIDogRkFMTEJBQ0tfUkVTUE9OU0VfU1RBVFVTXG5cbmV4cG9ydCBjbGFzcyBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZml4Pzogc3RyaW5nXG4gIC8qKiBMb2ctb25seSBkaWFnbm9zdGljczsgc2VlIHRoZSBjbGFzcyBkb2MuICovXG4gIGRlY2xhcmUgcmVhZG9ubHkgaW50ZXJuYWw/OiB1bmtub3duXG4gIHJlYWRvbmx5IGxpbms/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXJcbiAgLyoqXG4gICAqIFByZXNlbnQgb25seSB3aGVuIHRoZSBlcnJvciBjYXJyaWVzIGEgY2xpZW50LWZhY2luZyBmaWVsZCwgc28gYSBwbGFpblxuICAgKiBgbmV3IEh0dHBFcnJvcig0MDQsICdOb3QgZm91bmQnKWAgc3RpbGwgcmVuZGVycyBhcyB0aGUgYmFyZSBtZXNzYWdlLlxuICAgKiBFbHlzaWEgY2FsbHMgaXQgdG8gYnVpbGQgdGhlIHJlc3BvbnNlLlxuICAgKi9cbiAgZGVjbGFyZSByZWFkb25seSB0b1Jlc3BvbnNlPzogKCkgPT4gUmVzcG9uc2VcbiAgcmVhZG9ubHkgd2h5Pzogc3RyaW5nXG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZywgaW5pdDogSHR0cEVycm9ySW5pdCA9IHt9KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIHRoaXMuY29kZSA9IGluaXQuY29kZVxuICAgIHRoaXMuZml4ID0gaW5pdC5maXhcbiAgICB0aGlzLmxpbmsgPSBpbml0LmxpbmtcbiAgICB0aGlzLndoeSA9IGluaXQud2h5XG5cbiAgICAvLyBTZXQgZXhwbGljaXRseSDigJQgYSBuYXRpdmUgc3ViY2xhc3Mgb3RoZXJ3aXNlIHJlcG9ydHMgdGhlIGdlbmVyaWNcbiAgICAvLyBcIkVycm9yXCIsIGFuZCB0aGUgY29uc3RydWN0b3ItbmFtZSBmYWxsYmFjayBicmVha3MgdW5kZXIgbWluaWZpY2F0aW9uLlxuICAgIC8vIE5vbi1lbnVtZXJhYmxlIHRvIG1hdGNoIGBFcnJvci5wcm90b3R5cGUubmFtZWAuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICduYW1lJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogJ0h0dHBFcnJvcicsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICAvLyBOb24tZW51bWVyYWJsZSBzbyBgSlNPTi5zdHJpbmdpZnlgLCBzcHJlYWRzLCBhbmQgZnJhbWV3b3JrIHNlcmlhbGl6ZXJzXG4gICAgLy8gdGhhdCB3YWxrIG93biBrZXlzIGNhbm5vdCBwaWNrIGl0IHVwLiBQcm9wZXJ0eSBhY2Nlc3Mgc3RpbGwgd29ya3MsIHdoaWNoXG4gICAgLy8gaXMgYWxsIHRoZSBsb2cgcGlwZWxpbmUgbmVlZHMuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpbnRlcm5hbCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IGluaXQuaW50ZXJuYWwsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgLy8gRWx5c2lhIHJlbmRlcnMgYSB0aHJvd24gZXJyb3Igd2l0aCBgdG9SZXNwb25zZSgpYCB3aGVuIGl0IGhhcyBvbmUsIGFuZFxuICAgIC8vIGZhbGxzIGJhY2sgdG8gdGhlIHBsYWluIG1lc3NhZ2Ugb3RoZXJ3aXNlLiBEZWZpbmluZyBpdCBvbmx5IHdoZW4gdGhlcmVcbiAgICAvLyBpcyBzb21ldGhpbmcgc3RydWN0dXJlZCB0byBzYXkga2VlcHMgcGxhaW4gZXJyb3JzIGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAgLy8gdGhlaXIgcHJlLWBIdHRwRXJyb3JJbml0YCBiZWhhdmlvdXIuXG4gICAgY29uc3QgaGFzQ2xpZW50RmllbGRzID1cbiAgICAgIGluaXQuY29kZSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpbml0LndoeSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpbml0LmZpeCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBpbml0LmxpbmsgIT09IHVuZGVmaW5lZFxuXG4gICAgaWYgKGhhc0NsaWVudEZpZWxkcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0b1Jlc3BvbnNlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogKCk6IFJlc3BvbnNlID0+XG4gICAgICAgICAgUmVzcG9uc2UuanNvbih0aGlzLnRvSlNPTigpLCB7XG4gICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlU3RhdHVzKHRoaXMuc3RhdHVzKVxuICAgICAgICAgIH0pLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNsaWVudC1zYWZlIHBheWxvYWQuIGBpbnRlcm5hbGAgaXMgbmV2ZXIgcGFydCBvZiBpdDsgdW5zZXQgZmllbGRzIGFyZVxuICAgKiBgdW5kZWZpbmVkYCBhbmQgc28gYXJlIGRyb3BwZWQgYnkgYEpTT04uc3RyaW5naWZ5YC5cbiAgICovXG4gIHRvSlNPTigpOiBIdHRwRXJyb3JQYXlsb2FkIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgZml4OiB0aGlzLmZpeCxcbiAgICAgIGxpbms6IHRoaXMubGluayxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB3aHk6IHRoaXMud2h5XG4gICAgfVxuICB9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAib0RBQUEsaUJBQVMsZ0JDQVQsbUJBQVMsaUJBQ1QsbUJBQVMsY0FBVSxtQkFFbkIsSUFBTSxHQUFhLHFDQUNiLEdBQWlCLGtCQUNqQixHQUNKLHdFQUVXLEVBQVksQ0FBQyxJQUFtQyxDQUMzRCxHQUFJLE9BQU8sSUFBVSxTQUFVLENBQzdCLEdBQUksQ0FBQyxPQUFPLFNBQVMsQ0FBSyxHQUFLLEdBQVMsRUFDdEMsTUFBVSxNQUFNLGlCQUFpQixHQUFPLEVBRTFDLE9BQU8sRUFHVCxJQUFNLEVBQVUsRUFBTSxLQUFLLEVBQzNCLEdBQUksSUFBWSxHQUFJLENBQ2xCLElBQU0sRUFBVyxPQUFPLENBQU8sRUFDL0IsR0FBSSxPQUFPLFNBQVMsQ0FBUSxFQUFHLENBQzdCLEdBQUksR0FBWSxFQUNkLE1BQVUsTUFBTSxpQkFBaUIsR0FBTyxFQUUxQyxPQUFPLEdBSVgsSUFBTSxFQUFRLEVBQVEsTUFBTSxFQUFVLEVBQ3RDLEdBQUksQ0FB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bkQsRUFBWSxFQUMxQixHQUFzQixFQUFRLFFBQVEsUUFBUyxDQUFTLEVBRTNELEVBQ0EsVUFBVSxFQUFHLFVBQVMsV0FBWSxDQUNqQyxJQUFNLEVBQWEsUUFBUSxPQUFPLE9BQU8sRUFPekMsR0FOQSxFQUFrQixJQUFJLEVBQVMsQ0FBVSxFQUl6QyxFQUFNLFdBQWEsRUFDbkIsRUFBTyxhQUFhLENBQU8sRUFDdkIsRUFBaUIsQ0FDbkIsSUFBTSxFQUFZLEdBQXFCLEVBQVMsQ0FBZSxFQUMvRCxFQUFhLGFBQWEsRUFBUyxDQUFFLFdBQVUsQ0FBQyxFQUdsRCxHQUFJLEVBQ0YsR0FBc0IsRUFBVyxFQUFjLEVBQVMsQ0FBVyxFQUdyRSxHQUFJLEVBQ0YsRUFBYyxVQUFVLEVBQTBCLENBQU8sQ0FBQyxFQUU3RCxFQUNBLGNBQWMsRUFBRyxVQUFTLE1BQUssY0FBZSxDQUM3QyxHQUFJLENBQ0YsR0FBSSxFQUFPLElBQUksQ0FBTyxFQUNwQixPQUdGLElBQU0sRUFBUyxHQUFxQixFQUFJLE9BQVEsQ0FBUSxFQUlsRCxFQUFRLEVBQ1osRUFDQSxFQUFJLFFBQ0osRUFDQSxhQUFvQixTQUFXLEVBQVMsUUFBVSxNQUNwRCxFQUdBLEdBRkEsRUFBTyxJQUFJLENBQU8sRUFFZCxFQUFhLElBQUksQ0FBTyxFQUMxQixPQUdGLElBQUksRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsSUFBTSxFQUFjLEVBQWEsV0FBVyxDQUFPLEVBQzdDLEVBQWdDLENBQUUsUUFBTyxFQUMvQyxHQUFJLE9BQU8sS0FBSyxDQUFXLEVBQUUsT0FBUyxFQUNwQyxFQUFLLFFBQVUsSUFBSyxDQUFZLEVBR2xDLEVBQU8sSUFBSSxFQUFPLEVBQVMsRUFBTSxDQUFLLFNBS3RDLENBQ0EsRUFBaUIsR0FFcEIsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLFNBQVUsQ0FDcEMsR0FBSSxDQUNGLEVBQU8sZ0JBQ0wsRUFDQSxFQUNBLEVBQVcsRUFBUyxFQUFJLFFBQVMsQ0FBSyxDQUN4QyxTQUNBLENBQ0EsRUFBa0IsT0FBTyxDQUFPLEVBQ2hDLEVBQWEsYUFBYSxDQUFPLEVBQ2pDLEVBQWlCLEdBRXBCLEVBQ0EsR0FBRyxRQUFRLEVBRWQsT0FBTyxPQUFPLE9BQU8sRUFBUSxDQUFFLFFBQU8sQ0FBQyxHQVE1QixHQUFrQixNQUM3QixHQUNFLFFBQVEsSUFBK0IsQ0FBQyxJQUN4QixDQUVsQixHQURBLE1BQU0sR0FBUyxDQUFPLEVBQ2xCLEVBQ0YsTUFBTSxRQUFRLFdBQVcsQ0FBQyxHQUFnQixDQUFPLEVBQUcsR0FBa0IsQ0FBQyxDQUFDLEdBNkM3RCxNQUNGLEdBQTRDIiwKICAiZGVidWdJZCI6ICIzRkMxNTlFNTQ3OEVCRTJDNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|