logixlysia 6.6.0 → 6.6.1
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/README.md +1 -1
- package/dist/ai.d.ts +1 -1
- package/dist/ai.js +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -8
- package/dist/otel.d.ts +1 -1
- package/dist/otel.js +3 -3
- package/package.json +24 -24
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<h1><code>🦊</code> Logixlysia</h1>
|
|
3
3
|
<strong>Logixlysia is a logging library for ElysiaJS</strong>
|
|
4
|
-
<img src="https://
|
|
4
|
+
<img src="https://logixlysia.vercel.app/opengraph-image.png" alt="Logixlysia" width="100%" height="auto" />
|
|
5
5
|
</div>
|
|
6
6
|
|
|
7
7
|
## `📩` Installation
|
package/dist/ai.d.ts
CHANGED
|
@@ -34,4 +34,4 @@ interface AIMetrics {
|
|
|
34
34
|
* on the final access log (evlog-style `ai` object).
|
|
35
35
|
*/
|
|
36
36
|
declare const mergeAIMetrics: (logger: Pick<Logger, "mergeContext">, request: Request, metrics: AIMetrics) => void;
|
|
37
|
-
export { mergeAIMetrics,
|
|
37
|
+
export { mergeAIMetrics, AIMetrics };
|
package/dist/ai.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var z=(k,w,d)=>{if(Object.keys(d).length===0)return;k.mergeContext(w,{ai:d})};export{z as mergeAIMetrics
|
|
1
|
+
var z=(k,w,d)=>{if(Object.keys(d).length===0)return;k.mergeContext(w,{ai:d})};export{z as mergeAIMetrics};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2FpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEFJTWV0cmljcyB7XG4gIGNhbGxzPzogbnVtYmVyXG4gIGZpbmlzaFJlYXNvbj86IHN0cmluZ1xuICBpbnB1dFRva2Vucz86IG51bWJlclxuICBtb2RlbD86IHN0cmluZ1xuICBtc1RvRmluaXNoPzogbnVtYmVyXG4gIG1zVG9GaXJzdENodW5rPzogbnVtYmVyXG4gIG91dHB1dFRva2Vucz86IG51bWJlclxuICBwcm92aWRlcj86IHN0cmluZ1xuICByZWFzb25pbmdUb2tlbnM/OiBudW1iZXJcbiAgdG9rZW5zUGVyU2Vjb25kPzogbnVtYmVyXG4gIHRvdGFsVG9rZW5zPzogbnVtYmVyXG59XG5cbi8qKlxuICogTWVyZ2VzIEFJIFNESyAvIExMTSB1c2FnZSBtZXRyaWNzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgc28gdGhleSBhcHBlYXJcbiAqIG9uIHRoZSBmaW5hbCBhY2Nlc3MgbG9nIChldmxvZy1zdHlsZSBgYWlgIG9iamVjdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUFJTWV0cmljcyA9IChcbiAgbG9nZ2VyOiBQaWNrPExvZ2dlciwgJ21lcmdlQ29udGV4dCc+
|
|
3
|
+
//# debugId=2447CBBCE831480664756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2FpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEFJTWV0cmljcyB7XG4gIGNhbGxzPzogbnVtYmVyXG4gIGZpbmlzaFJlYXNvbj86IHN0cmluZ1xuICBpbnB1dFRva2Vucz86IG51bWJlclxuICBtb2RlbD86IHN0cmluZ1xuICBtc1RvRmluaXNoPzogbnVtYmVyXG4gIG1zVG9GaXJzdENodW5rPzogbnVtYmVyXG4gIG91dHB1dFRva2Vucz86IG51bWJlclxuICBwcm92aWRlcj86IHN0cmluZ1xuICByZWFzb25pbmdUb2tlbnM/OiBudW1iZXJcbiAgdG9rZW5zUGVyU2Vjb25kPzogbnVtYmVyXG4gIHRvdGFsVG9rZW5zPzogbnVtYmVyXG59XG5cbi8qKlxuICogTWVyZ2VzIEFJIFNESyAvIExMTSB1c2FnZSBtZXRyaWNzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgc28gdGhleSBhcHBlYXJcbiAqIG9uIHRoZSBmaW5hbCBhY2Nlc3MgbG9nIChldmxvZy1zdHlsZSBgYWlgIG9iamVjdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBtZXJnZUFJTWV0cmljcyA9IChcbiAgbG9nZ2VyOiBQaWNrPExvZ2dlciwgJ21lcmdlQ29udGV4dCc+LFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBtZXRyaWNzOiBBSU1ldHJpY3Ncbik6IHZvaWQgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMobWV0cmljcykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCB7IGFpOiBtZXRyaWNzIH0pXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFvQk8sSUFBTSxFQUFpQixDQUM1QixFQUNBLEVBQ0EsSUFDUyxDQUNULEdBQUksT0FBTyxLQUFLLENBQU8sRUFBRSxTQUFXLEVBQ2xDLE9BRUYsRUFBTyxhQUFhLEVBQVMsQ0FBRSxHQUFJLENBQVEsQ0FBQyIsCiAgImRlYnVnSWQiOiAiMjQ0N0NCQkNFODMxNDgwNjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -230,4 +230,4 @@ type LogixlysiaPlugin = Logixlysia & {
|
|
|
230
230
|
wrapWs: ReturnType<typeof createWsHandlerWrapper>;
|
|
231
231
|
};
|
|
232
232
|
declare const logixlysia: (rawOptions?: Options) => LogixlysiaPlugin;
|
|
233
|
-
export { useLogger, resolveRequestIdConfig, resolveOptions,
|
|
233
|
+
export { useLogger, resolveRequestIdConfig, resolveOptions, getOrCreateRequestId, logixlysia as default, createWsHandlerWrapper, createPluginLogger, createLogger, WsHandlerHooks, Transport, StoreData, ResolvedRequestIdConfig, RequestScopedLogger, RequestIdConfig, Pino, Options, LogixlysiaStore, LogixlysiaSingleton, LogixlysiaPlugin, LogixlysiaContext, Logixlysia, Logger, LogPreset, LogLevel, EmptyElysiaSlot };
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{Elysia as
|
|
2
|
-
`)},
|
|
3
|
-
`,
|
|
4
|
-
${
|
|
5
|
-
`)}`:b;console.error(
|
|
1
|
+
import{Elysia as W2}from"elysia";import{promises as W0}from"node:fs";import{basename as y0,dirname as C0}from"node:path";var m0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,x0=/^(\d+)(h|d|w)$/i,P0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,p=($)=>{if(typeof $==="number"){if(!Number.isFinite($)||$<=0)throw Error(`Invalid size: ${$}`);return $}let W=$.trim();if(W!==""){let j=Number(W);if(Number.isFinite(j)){if(j<=0)throw Error(`Invalid size: ${$}`);return j}}let N=W.match(m0);if(!N)throw Error(`Invalid size format: ${$}`);let Q=Number(N[1]),Z=N[2].toLowerCase(),J=1024;if(Z.startsWith("m"))J=1048576;else if(Z.startsWith("g"))J=1073741824;return Math.floor(Q*J)},N0=($)=>{let W=$.trim().match(x0);if(!W)throw Error(`Invalid interval format: ${$}`);let N=Number(W[1]),Q=W[2].toLowerCase(),Z=3600000;if(Q==="d")Z=86400000;else if(Q==="w")Z=604800000;return N*Z},v=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:N0($)}},I0=async($,W)=>{try{return(await W0.stat($)).size>W}catch{return!1}},Q0=async($)=>{let W=C0($),N=y0($),Q;try{Q=await W0.readdir(W)}catch{return[]}return Q.filter((Z)=>Z.startsWith(`${N}.`)&&P0.test(Z)).map((Z)=>`${W}/${Z}`)};var q0=["dev","prod","json"],c0=($)=>{let W=$?.logRotation;if(!W)return;try{if(W.maxSize!==void 0)p(W.maxSize);if(W.maxFiles!==void 0)v(W.maxFiles);if(W.interval!==void 0)N0(W.interval);if(W.compression!==void 0&&W.compression!=="gzip")throw Error(`Invalid compression algorithm: ${W.compression}`)}catch(N){let Q=N instanceof Error?N.message:String(N);throw Error(`logixlysia: invalid logRotation config — ${Q}`,{cause:N})}},h0={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}},p0=($,W)=>{if(!W)return $;let N={...$,...W};if($.pino||W.pino)N.pino={...$.pino,...W.pino,...$.pino?.prettyPrint!==void 0||W.pino?.prettyPrint!==void 0?{prettyPrint:W.pino?.prettyPrint??$.pino?.prettyPrint}:{}};if($.logFilter||W.logFilter)N.logFilter={...$.logFilter,...W.logFilter};if($.logRotation||W.logRotation)N.logRotation={...$.logRotation,...W.logRotation};if($.timestamp||W.timestamp)N.timestamp={...$.timestamp,...W.timestamp};return N},Z0=($={})=>{let{preset:W}=$;if(W&&!q0.includes(W))throw Error(`logixlysia: invalid preset — ${W}`);let N=W?{...$,config:p0(h0[W],$.config)}:$;return c0(N.config),N};var g=()=>{let $=new WeakMap,W=(N)=>{let Q=$.get(N);if(!Q)Q={},$.set(N,Q);return Q};return{clearContext(N){$.delete(N)},getContext(N){let Q=$.get(N);return Q?{...Q}:{}},mergeContext(N,Q){if(Object.keys(Q).length===0)return;let Z=W(N);Object.assign(Z,Q)}}},n=($,W)=>{let N=$.context,Q=Object.keys(W).length>0,Z=N!==void 0&&N!==null&&typeof N==="object"&&!Array.isArray(N)&&Object.keys(N).length>0;if(!(Q||Z))return $;let J={...W,...Z?N:{}};return{...$,context:J}};import{AsyncLocalStorage as v0}from"node:async_hooks";var j0=new v0,g0={debug:()=>{return},error:()=>{return},info:()=>{return},mergeContext:()=>{return},warn:()=>{return}},n0=()=>j0.getStore()??g0;import{createRequire as M0}from"node:module";var d0=(()=>{try{return M0(import.meta.url)("elysia/package.json")}catch{return{}}})(),u0=(()=>{try{return M0(import.meta.url)("../../package.json")}catch{return{}}})(),i0=($,W)=>{if($.length>=W)return $.slice(0,W);let N=Math.floor((W-$.length)/2),Q=W-$.length-N;return`${" ".repeat(N)}${$}${" ".repeat(Q)}`},V0=($,W)=>{let{version:N}=d0,Q=N?`Elysia v${N}`:"Elysia",Z=[{kind:"empty"},{kind:"center",text:Q},{kind:"empty"},{kind:"left",text:$}];if(W)Z.push({kind:"left",text:W});Z.push({kind:"empty"});let j=Math.max(Q.length,$.length,...W?[W.length]:[0])+4,z=`┌${"─".repeat(j)}┐`,H=`└${"─".repeat(j)}┘`,I=`│${" ".repeat(j)}│`,M=[z];for(let T of Z){if(T.kind==="empty"){M.push(I);continue}if(T.kind==="center"){M.push(`│${i0(T.text,j)}│`);continue}let{text:X}=T,G=Math.max(0,j-X.length-4);M.push(`│ ${X}${" ".repeat(G)} │`)}return M.push(H),M.join(`
|
|
2
|
+
`)},O0=()=>{let $=u0.version;if(!$)return null;return` logixlysia v${$}`};var J0=($,W)=>{if(!(W.config?.showStartupMessage??!0))return;let{port:Q,hostname:Z,protocol:J}=$;if(Q===void 0||!Z||!J)return;let j=`${J}://${Z}:${Q}`,z=`\uD83E\uDD8A Elysia is running at ${j}`,H=`\uD83E\uDD8A ${j}`;if((W.config?.startupMessageFormat??"banner")==="simple"){console.log(z);return}console.log(V0(H,O0()))};import{StatusMap as o0}from"elysia";var l0=/^\d+$/,s0=/[_-]+/g,a0=/([a-z0-9])([A-Z])/g,r0=/([A-Z])([A-Z][a-z])/g,t0=/['’]/g,e0=/[^a-z0-9\s]+/g,$$=/\s+/g,T0=($)=>{let W=$.trim();if(!W)return"";return W.replace(s0," ").replace(a0,"$1 $2").replace(r0,"$1 $2").replace(t0,"").toLowerCase().replace(e0," ").replace($$," ").trim()},W$=(()=>{let $=new Map;for(let[W,N]of Object.entries(o0))$.set(T0(W),N);return $})(),d=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let W=$.trim();if(l0.test(W))return Number(W);return W$.get(T0(W))??500}return 500};import k0 from"pino";import e$ from"pino-pretty";var R0=0,N$=5000,U0=($)=>{let W=Date.now();if(W-R0<N$)return;R0=W,console.error("[logixlysia] transport failed:",$)},u=(...$)=>{let W=typeof $[0]==="string"?{data:$[2],level:$[0],options:$[4],request:$[1],store:$[3]}:$[0],{level:N,request:Q,data:Z,store:J,options:j}=W,z=j.config?.transports??[];if(z.length===0)return;let H=typeof Z.message==="string"?Z.message:"",I={request:{method:Q.method,url:Q.url},...Z,durationMs:J.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-J.beforeTime)/1e6};for(let M of z)try{let T=M.log(N,H,I);if(T&&typeof T.catch==="function")T.catch(U0)}catch(T){U0(T)}};import{appendFile as B$}from"node:fs/promises";import{dirname as I$}from"node:path";import{promises as Q$}from"node:fs";var _0=async($)=>{await Q$.mkdir($,{recursive:!0})};import{promises as D}from"node:fs";import{promisify as Z$}from"node:util";import{gzip as j$}from"node:zlib";var J$=Z$(j$),i=new Map,z$=async($)=>{let W=i.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return i.set($,Q),await W,()=>{if(N?.(),i.get($)===Q)i.delete($)}},m=($)=>String($).padStart(2,"0"),H$=($,W)=>{let N=W.getFullYear(),Q=m(W.getMonth()+1),Z=m(W.getDate()),J=m(W.getHours()),j=m(W.getMinutes()),z=m(W.getSeconds()),H=String(W.getMilliseconds()).padStart(3,"0");return`${$}.${N}-${Q}-${Z}-${J}-${j}-${z}-${H}`},X$=async($)=>{try{if((await D.stat($)).size===0)return""}catch{return""}let N=`${H$($,new Date)}-${process.hrtime.bigint()}`;return await D.rename($,N),N},G$=async($)=>{let W=await z$($);try{try{await D.access($)}catch{return}let N=await D.readFile($),Q=await J$(N);await D.writeFile(`${$}.gz`,Q),await D.rm($,{force:!0})}catch(N){throw console.error(`[logixlysia] Failed to compress file ${$}:`,N),N}finally{W()}},b0=async($,W)=>{if(W.maxSize===void 0)return!1;let N=p(W.maxSize);return await I0($,N)},K$=async($,W)=>{let N=await Q0($);if(N.length<=W)return;let Z=(await Promise.allSettled(N.map(async(z)=>({path:z,stat:await D.stat(z)})))).filter((z)=>z.status==="fulfilled").map((z)=>z.value);if(Z.length<=W)return;Z.sort((z,H)=>H.stat.mtimeMs-z.stat.mtimeMs);let J=Z.slice(W);(await Promise.allSettled(J.map(({path:z})=>D.rm(z,{force:!0})))).forEach((z,H)=>{if(z.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${J[H].path}:`,z.reason)})},Y$=async($,W)=>{let N=await Q0($);if(N.length===0)return;let Q=Date.now(),j=(await Promise.allSettled(N.map(async(H)=>({path:H,stat:await D.stat(H)})))).filter((H)=>H.status==="fulfilled").map((H)=>H.value).filter(({stat:H})=>Q-H.mtimeMs>W);(await Promise.allSettled(j.map(({path:H})=>D.rm(H,{force:!0})))).forEach((H,I)=>{if(H.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${j[I].path}:`,H.reason)})},F0=async($,W)=>{let N=await X$($);if(!N)return;if(W.compress===!0){if((W.compression??"gzip")==="gzip")await G$(N)}if(W.maxFiles!==void 0){let Z=v(W.maxFiles);if(Z.type==="count")await K$($,Z.value);else await Y$($,Z.value)}};var o=new Map,M$=async($)=>{let W=o.get($)??Promise.resolve(),N,Q=new Promise((Z)=>{N=Z});return o.set($,Q),await W,()=>{if(N?.(),o.get($)===Q)o.delete($)}},l=async(...$)=>{let W=typeof $[0]==="string"?(()=>{let[V,b,U,F,w,k]=$;return{data:F,filePath:V,level:b,options:k,request:U,store:w}})():$[0],{filePath:N,level:Q,request:Z,data:J,store:j,options:z}=W,{config:H}=z,I=H?.useTransportsOnly===!0,M=H?.disableFileLogging===!0;if(I||M)return;let T=typeof J.message==="string"?J.message:"",X=j.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-j.beforeTime)/1e6,G="/";try{let{pathname:V,search:b}=new URL(Z.url);G=H?.logQueryParams?`${V}${b}`:V}catch{G=Z.url}let K=`${Q} ${X.toFixed(2)}ms ${Z.method} ${G} ${T}
|
|
3
|
+
`,R=await M$(N);try{try{await _0(I$(N)),await B$(N,K,{encoding:"utf-8"})}catch(U){throw console.error(`[logixlysia] Failed to write to log file ${N}:`,U),U}let V=H?.logRotation;if(!V)return;if(await b0(N,V))try{await F0(N,V)}catch(U){console.error(`[logixlysia] Failed to rotate log file ${N}:`,U)}}finally{R()}};var V$=/[a-zA-Z0-9._%+-]{1,64}@[a-zA-Z0-9.-]{1,253}\.[a-zA-Z]{2,63}/g,O$=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,T$=/\b(?:\d[ -]*?){13,19}\b/g,R$=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var z0=($)=>A($).replaceAll("[REDACTED]","redacted"),U$=($)=>{try{let W=new URL($);if(W.username!=="")W.username=z0(W.username);if(W.password!=="")W.password=z0(W.password);return W.hostname=z0(W.hostname),W.pathname=A(W.pathname),W.search=A(W.search),W.hash=A(W.hash),W.toString()}catch{return A($).replaceAll("[REDACTED]","redacted")}},_$=($)=>{if($.length<13||$.length>19)return!1;let W=0,N=!1;for(let Q=$.length-1;Q>=0;Q-=1){let Z=$.charCodeAt(Q);if(Z<48||Z>57)return!1;let J=Z-48;if(N){if(J*=2,J>9)J-=9}W+=J,N=!N}return W%10===0},b$=($)=>$.replace(T$,(W)=>{let N=W.replace(/\D/g,"");if(N.length>=13&&N.length<=19&&_$(N))return"[REDACTED]";return W}),A=($)=>{let W=$;return W=W.replace(V$,"[REDACTED]"),W=W.replace(O$,"[REDACTED]"),W=b$(W),W=W.replace(R$,"[REDACTED]"),W},F$=($,W)=>{let N=A($.message),Q=Object.getPrototypeOf($),Z=Object.create(Q);if(Z.message=N,Z.name=$.name,$.stack!==void 0)Z.stack=A($.stack);let J=$;for(let j of Object.keys(J))if(j!=="message"&&j!=="name"&&j!=="stack")Z[j]=s(J[j],W);return Z},D$=($,W)=>{let N=Array.from({length:$.length});for(let Q=0;Q<$.length;Q+=1)N[Q]=s($[Q],W);return N},A$=($,W)=>{let N={};for(let Q of Object.keys($))N[Q]=s($[Q],W);return N},H0=($,W,N)=>{W.add($);try{return N()}finally{W.delete($)}},s=($,W)=>{if($===null||$===void 0)return $;if(typeof $==="string")return A($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let Q=$;if(W.has(Q))return"[Circular]";if($ instanceof Error)return H0(Q,W,()=>F$($,W));if(Array.isArray($))return H0(Q,W,()=>D$($,W));return H0(Q,W,()=>A$($,W))},a=($)=>s($,new WeakSet),r=($)=>{let W=U$($.url),N=new Headers,Q=!1;for(let[H,I]of $.headers.entries()){let M=A(I);if(M!==I)Q=!0;N.set(H,M)}let Z=A($.method),J=W!==$.url,j=Z!==$.method;if(!(J||Q||j))return $;let z={headers:N,method:Z,redirect:$.redirect,signal:$.signal};return new Request(W,z)};import{STATUS_CODES as w$}from"node:http";import Y from"chalk";var t=($)=>{if($ instanceof Error)return $.message;if($&&typeof $==="object"&&"message"in $)return $.message;return String($)},D0=($)=>typeof $==="object"&&$!==null&&(("why"in $)||("fix"in $)||("link"in $)||("internal"in $));var x=($)=>String($).padStart(2,"0"),E$=($)=>String($).padStart(3,"0"),L$=500,k$=1000,S$=7,f$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",y$=/\{(now|epoch|level|icon|duration|method|pathname|path|query|status|statusText|message|ip|context|service|speed|requestId)\}/g,A0=($)=>{let{config:W}=$,N=W?.useColors??!0,Q=typeof process<"u"&&process.stdout?.isTTY===!0;return N&&Q},C$=($,W)=>{if(!W)return $.toISOString();let N=String($.getFullYear()),Q=x($.getMonth()+1),Z=x($.getDate()),J=x($.getHours()),j=x($.getMinutes()),z=x($.getSeconds()),H=E$($.getMilliseconds());return W.replaceAll("yyyy",N).replaceAll("mm",Q).replaceAll("dd",Z).replaceAll("HH",J).replaceAll("MM",j).replaceAll("ss",z).replaceAll("SSS",H)},m$=($)=>{let W=$.headers.get("x-forwarded-for");if(W)return W.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},x$=($)=>{if($>=1000){let W=$/1000;if(W>=10)return`${Math.round(W)}s`;let N=W.toFixed(1);return N.endsWith(".0")?`${Math.round(W)}s`:`${N}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},P$=($)=>{let{config:W}=$;return{slow:W?.slowThreshold??L$,verySlow:W?.verySlowThreshold??k$}},q$=($,W,N)=>{let Q=x$($),{slow:Z,verySlow:J}=P$(N),j=$>=J;if(!W)return{isVerySlow:j,text:Q};let z=Q;if($<Z)z=Y.green(Q);else if($<J)z=Y.yellow(Q);else z=Y.red.bold(Q);return{isVerySlow:j,text:z}},c$=($,W)=>{if(!$)return"";let N="⚡ slow";if(!W)return` ${N}`;return` ${Y.yellow(N)}`},h$=($,W)=>{if(!W)return"\uD83E\uDD8A";if($==="ERROR")return Y.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return Y.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return Y.bgBlue.black(" \uD83E\uDD8A ");return Y.bgGreen.black(" \uD83E\uDD8A ")},p$=($,W)=>{if(!W)return $;if($==="ERROR")return Y.bgRed.black($);if($==="WARNING")return Y.bgYellow.black($);if($==="DEBUG")return Y.bgBlue.black($);return Y.bgGreen.black($)},v$=($,W)=>{if(!W)return $;let N=$.toUpperCase();if(N==="GET")return Y.green.bold(N);if(N==="POST")return Y.blue.bold(N);if(N==="PUT")return Y.yellow.bold(N);if(N==="PATCH")return Y.yellowBright.bold(N);if(N==="DELETE")return Y.red.bold(N);if(N==="OPTIONS")return Y.cyan.bold(N);if(N==="HEAD")return Y.greenBright.bold(N);if(N==="TRACE")return Y.magenta.bold(N);if(N==="CONNECT")return Y.cyanBright.bold(N);return Y.white.bold(N)},g$=($,W)=>{if(!W)return $;let N=Number.parseInt($,10);if(!Number.isFinite(N))return $;if(N>=500)return Y.red($);if(N>=400)return Y.yellow($);if(N>=300)return Y.cyan($);if(N>=200)return Y.green($);return Y.gray($)},n$=($,W)=>{if(!W)return $;return Y.gray($)},d$=($,W)=>{if(!W)return $;return Y.whiteBright($)},u$=($)=>{return w$[$]??""},i$=($,W)=>{let N=$.config?.service?.trim();if(!N)return"";let Q=`[${N}]`;if(!W)return`${Q} `;return`${Y.dim(Q)} `},w0=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}},o$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),E0=($,W,N)=>{let Q=[];for(let[Z,J]of Object.entries($)){let j=W?`${W}.${Z}`:Z;if(o$(J)&&N>1)Q.push(...E0(J,j,N-1));else Q.push([j,w0(J)])}return Q},l$=($,W)=>{if($.length===0)return[];let N=[],Q=$.length-1;for(let Z=0;Z<$.length;Z+=1){let J=Z===Q?"└─":"├─",j=$[Z];if(!j)continue;let[z,H]=j,I=W?Y.cyan(z):z,M=W?Y.white(H):H;N.push(` ${J} ${I} ${M}`)}return N};var s$=($)=>{let W=[],N=t($);if(N)W.push(["error",N]);if(D0($)){if($.why!==void 0)W.push(["error.why",String($.why)]);if($.fix!==void 0)W.push(["error.fix",String($.fix)]);if($.link!==void 0)W.push(["error.link",String($.link)]);if($.internal!==void 0)W.push(["error.internal",w0($.internal)])}return W},a$=($,W,N)=>{if(N.config?.showContextTree===!1)return[];let Q=A0(N),Z=N.config?.contextDepth??1,J=[],j=W.context;if(j&&typeof j==="object"&&!Array.isArray(j)&&Object.keys(j).length>0&&Z>=1)J.push(...E0(j,"",Z));if($==="ERROR"&&"error"in W&&W.error!==void 0)J.push(...s$(W.error));return l$(J,Q)},r$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},e=({level:$,request:W,data:N,store:Q,options:Z})=>{let{config:J}=Z,j=A0(Z),z=J?.customLogFormat??f$,H=new Date,I=String(H.getTime()),M=C$(H,J?.timestamp?.translateTime),T=n$(M,j),X=typeof N.message==="string"?N.message:"",G=Q.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Q.beforeTime)/1e6,K,R;try{({pathname:K,search:R}=new URL(W.url))}catch{K=W.url||"/",R=""}let V=R,b=J?.logQueryParams?`${K}${V}`:K,U=N.status,F=U===null||U===void 0?200:d(U),w=String(F),k=J?.ip===!0?m$(W):"",P=J?.showContextTree!==!1&&N.context&&typeof N.context==="object"&&!Array.isArray(N.context)&&Object.keys(N.context).length>0?"":r$(N.context),S=p$($,j),B=W.method.toUpperCase().padEnd(S$),O=v$(B,j),_=d$(b,j),E=g$(w,j),{text:f,isVerySlow:y}=q$(G,j,Z),C=c$(y,j),q=h$($,j),c=u$(F),L=i$(Z,j),h={"{context}":P,"{duration}":f,"{epoch}":I,"{icon}":q,"{ip}":k,"{level}":S,"{message}":X,"{method}":O,"{now}":T,"{path}":_,"{pathname}":_,"{query}":V,"{requestId}":typeof N.context==="object"&&N.context!==null&&"requestId"in N.context?String(N.context.requestId):"","{service}":L,"{speed}":C,"{status}":E,"{statusText}":c},f0=z.replace(y$,(B0)=>h[B0]??B0);return{contextLines:a$($,N,Z),main:f0}};var t$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",L0=($,W,N,Q,Z)=>{let{config:J}=Q,j=t$(W)?W.status:500,z="ERROR";if(j<500&&j>=400)z="WARNING";let H=J?.logFilter;if(H?.level&&H.level.length>0&&!H.level.includes(z))return;let I=J?.useTransportsOnly===!0,M=J?.disableInternalLogger===!0,T=J?.disableFileLogging===!0,X=t(W),G={error:W,message:X,status:j},K=Z?n(G,Z.getContext($)):G,R=J?.autoRedact===!0?a(K):K,V=J?.autoRedact===!0?r($):$;if(u({data:R,level:z,options:Q,request:V,store:N}),!(I||T)){let w=J?.logFilePath;if(w)l({data:R,filePath:w,level:z,options:Q,request:V,store:N}).catch(()=>{})}if(I||M)return;let{main:b,contextLines:U}=e({data:R,level:z,options:Q,request:V,store:N}),F=U.length>0?`${b}
|
|
4
|
+
${U.join(`
|
|
5
|
+
`)}`:b;console.error(F)};var S0=($={},W=k0,N)=>{let Q=N??g(),{config:Z}=$,J=Z?.pino,{prettyPrint:j,...z}=J??{},H=typeof j==="object"&&j!==null?j:void 0,M=(j===!0||H!==void 0)&&z.transport===void 0,T=H?.messageKey??z.messageKey,X=H?.errorKey??z.errorKey,G={...z,errorKey:X,level:z.level??"info",messageKey:T},K;if(M){let B=e$({colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...H,errorKey:X,messageKey:T});K=W(G,B)}else K=W({...G,transport:z.transport});let R=(B,O)=>{if(!O?.level||O.level.length===0)return!0;return O.level.includes(B)},V=Z?.useTransportsOnly===!0,b=Z?.disableInternalLogger===!0,U=Z?.disableFileLogging===!0,F=(Z?.transports?.length??0)>0,w=!(V||U)&&!!Z?.logFilePath,k=!(V||b),$0=!(F||w||k),P=(B,O,_,E)=>{if($0||!R(B,Z?.logFilter))return;let f=n(_,Q.getContext(O)),y=Z?.autoRedact===!0?a(f):f,C=Z?.autoRedact===!0?r(O):O;if(F)u({data:y,level:B,options:$,request:C,store:E});if(w){let h=Z?.logFilePath;if(h)l({data:y,filePath:h,level:B,options:$,request:C,store:E}).catch(()=>{})}if(!k)return;let{main:q,contextLines:c}=e({data:y,level:B,options:$,request:C,store:E}),L=c.length>0?`${q}
|
|
6
6
|
${c.join(`
|
|
7
|
-
`)}`:
|
|
7
|
+
`)}`:q;switch(B){case"DEBUG":{console.debug(L);break}case"INFO":{console.info(L);break}case"WARNING":{console.warn(L);break}case"ERROR":{console.error(L);break}default:{console.log(L);break}}},S=(B,O,_,E)=>{if($0||!R(B,Z?.logFilter))return;let f={beforeTime:process.hrtime.bigint()};P(B,O,{context:E,message:_},f)};return{debug:(B,O,_)=>{S("DEBUG",B,O,_)},error:(B,O,_)=>{S("ERROR",B,O,_)},getContext:(B)=>Q.getContext(B),handleHttpError:(B,O,_)=>{L0(B,O,_,$,Q)},info:(B,O,_)=>{S("INFO",B,O,_)},log:P,mergeContext:(B,O)=>{Q.mergeContext(B,O)},pino:K,warn:(B,O,_)=>{S("WARNING",B,O,_)}}},X0=($,W)=>S0($,k0,W);var G0=($)=>{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=($,W)=>{let N=$.headers.get(W.header);if(N)return N;return W.generator()};var $2=($)=>new Request(`http://logixlysia.local${$}`,{method:"WS"}),Y0=($,W,N)=>{let Q=new WeakMap,Z=(J,j,z,H,I)=>{let M=j,X={beforeTime:Q.get(M)??process.hrtime.bigint()},G=N.getContext(M),K=Object.keys(G).length>0||I?{...G,...I,wsId:j.id}:{wsId:j.id};W.log(J,$2(z),{context:K,message:H,status:200},X)};return(J,j)=>({...j,close(z){if(j.close?.(z),$.config?.disableWebSocketLogging!==!0)Z("INFO",z,J,"WebSocket closed");N.clearContext(z),Q.delete(z)},message(z,H){if(j.message?.(z,H),$.config?.disableWebSocketLogging!==!0)Z("INFO",z,J,"WebSocket message",{payloadType:typeof H})},open(z){if(Q.set(z,process.hrtime.bigint()),j.open?.(z),$.config?.disableWebSocketLogging!==!0)Z("INFO",z,J,"WebSocket opened")}})};var N2=($={})=>{let W=Z0($),N=new WeakSet,Q=new WeakMap,Z=g(),J=X0(W,Z),j=Y0(W,J,Z),z=G0(W.config?.requestId),H={...J,debug:(X,G,K)=>{N.add(X),J.debug(X,G,K)},error:(X,G,K)=>{N.add(X),J.error(X,G,K)},info:(X,G,K)=>{N.add(X),J.info(X,G,K)},warn:(X,G,K)=>{N.add(X),J.warn(X,G,K)}},I=(X)=>({debug:(G,K)=>H.debug(X,G,K),error:(G,K)=>H.error(X,G,K),info:(G,K)=>H.info(X,G,K),mergeContext:(G)=>Z.mergeContext(X,G),warn:(G,K)=>H.warn(X,G,K)}),T=new W2({detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]},name:"Logixlysia"}).state("logger",H).state("pino",H.pino).state("beforeTime",BigInt(0)).derive(({request:X})=>({log:I(X)})).onStart(({server:X})=>{if(X)J0(X,W);else{let G=Number(process.env.PORT)||3000,K=process.env.HOST||"localhost";J0({hostname:K,port:G,protocol:"http"},W)}}).onRequest(({request:X})=>{if(Q.set(X,process.hrtime.bigint()),z){let G=K0(X,z);Z.mergeContext(X,{requestId:G})}if(W.config?.useAsyncLocalStorage)j0.enterWith(I(X))}).onAfterHandle(({request:X,set:G})=>{try{if(z){let F=Z.getContext(X).requestId;if(F)G.headers[z.header]=F}if(N.has(X))return;let K=G.status===void 0||G.status===null?200:d(G.status),R="INFO";if(K>=500)R="ERROR";else if(K>=400)R="WARNING";let V=Z.getContext(X),b={status:K};if(Object.keys(V).length>0)b.context={...V};H.log(R,X,b,{beforeTime:Q.get(X)??BigInt(0)})}finally{Q.delete(X),Z.clearContext(X)}}).onError(({request:X,error:G,set:K})=>{try{if(z){let V=Z.getContext(X).requestId;if(V)K.headers[z.header]=V}H.handleHttpError(X,G,{beforeTime:Q.get(X)??BigInt(0)})}finally{Q.delete(X),Z.clearContext(X)}}).as("scoped");return Object.assign(T,{wrapWs:j})},OW=N2;export{n0 as useLogger,G0 as resolveRequestIdConfig,Z0 as resolveOptions,K0 as getOrCreateRequestId,OW as default,Y0 as createWsHandlerWrapper,X0 as createPluginLogger,S0 as createLogger};
|
|
8
8
|
|
|
9
|
-
//# debugId=
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb25maWcvcmVzb2x2ZS1vcHRpb25zLnRzIiwgInNyYy9jb250ZXh0L3JlcXVlc3QtY29udGV4dC50cyIsICJzcmMvY29udGV4dC9zdG9yYWdlLnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy9sb2dnZXIvaGFuZGxlLWh0dHAtZXJyb3IudHMiLCAic3JjL21pZGRsZXdhcmUvcmVxdWVzdC1pZC50cyIsICJzcmMvd2Vic29ja2V0L3dyYXAtd3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQgeyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB7IGxvZ2dlclN0b3JhZ2UgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dpeGx5c2lhU3RvcmUsXG4gIE9wdGlvbnMsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXJcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5pbXBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmltcG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG4vKipcbiAqIEVtcHR5IHNpbmdsZXRvbiBzbG90cyBtdXN0IG5vdCB1c2UgYFJlY29yZDxzdHJpbmcsIG5ldmVyPmA6IGludGVyc2VjdGluZyB0aGF0IHdpdGggRWx5c2lhJ3MgYENvbnRleHRgXG4gKiBtYWtlcyBldmVyeSBrZXkgKGluY2x1ZGluZyBgc3RvcmVgKSBiZWNvbWUgYG5ldmVyYCBiZWNhdXNlIGVhY2gga2V5IGlzIG1lcmdlZCB3aXRoIGBuZXZlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlFbHlzaWFTbG90IHtcbiAgcmVhZG9ubHkgX19sb2dpeGx5c2lhRW1wdHk/OiBuZXZlclxufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uIHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiB7XG4gICAgbG9nOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyXG4gIH1cbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2Uuc3RvcmVgIGlzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IGBMb2dpeGx5c2lhU3RvcmVgIGlzIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG4vLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBjbG9zZWQgc3RvcmUgaXMgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPCcnLCBMb2dpeGx5c2lhU2luZ2xldG9uPlxuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhUGx1Z2luID0gTG9naXhseXNpYSAmIHtcbiAgd3JhcFdzOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyPlxufVxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChyYXdPcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhUGx1Z2luID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVPcHRpb25zKHJhd09wdGlvbnMpXG4gIGNvbnN0IGRpZEN1c3RvbUxvZyA9IG5ldyBXZWFrU2V0PFJlcXVlc3Q+KClcbiAgY29uc3QgY29udGV4dFN0b3JlID0gY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSgpXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVQbHVnaW5Mb2dnZXIob3B0aW9ucywgY29udGV4dFN0b3JlKVxuICBjb25zdCB3cmFwV3MgPSBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyKG9wdGlvbnMsIGJhc2VMb2dnZXIsIGNvbnRleHRTdG9yZSlcbiAgY29uc3QgcmVxdWVzdElkQ29uZmlnID0gcmVzb2x2ZVJlcXVlc3RJZENvbmZpZyhvcHRpb25zLmNvbmZpZz8ucmVxdWVzdElkKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlciA9IChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0XG4gICk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT4gKHtcbiAgICBkZWJ1ZzogKG1lc3NhZ2UsIGNvbnRleHQpID0+IGxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSxcbiAgICBpbmZvOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgd2FybjogKG1lc3NhZ2UsIGNvbnRleHQpID0+IGxvZ2dlci53YXJuKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIGVycm9yOiAobWVzc2FnZSwgY29udGV4dCkgPT4gbG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIG1lcmdlQ29udGV4dDogcGFydGlhbCA9PiBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpXG4gIH0pXG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciDigJQgZGVyaXZlZCBsb2cgdHlwaW5nIG1hdGNoZXMgTG9naXhseXNpYVNpbmdsZXRvbi5cbiAgY29uc3QgcGx1Z2luID0gYXBwXG4gICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgIC5kZXJpdmUoKHsgcmVxdWVzdCB9KSA9PiAoeyBsb2c6IGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIocmVxdWVzdCkgfSkpXG4gICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pOiB2b2lkID0+IHtcbiAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgc3RhcnRTZXJ2ZXIoc2VydmVyLCBvcHRpb25zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwXG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcHJvY2Vzcy5lbnYuSE9TVCB8fCAnbG9jYWxob3N0J1xuICAgICAgICBzdGFydFNlcnZlcih7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbDogJ2h0dHAnIH0sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfSlcbiAgICAub25SZXF1ZXN0KCh7IHJlcXVlc3QsIHN0b3JlIH0pID0+IHtcbiAgICAgIHN0b3JlLmJlZm9yZVRpbWUgPSBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBnZXRPckNyZWF0ZVJlcXVlc3RJZChyZXF1ZXN0LCByZXF1ZXN0SWRDb25maWcpXG4gICAgICAgIGNvbnRleHRTdG9yZS5tZXJnZUNvbnRleHQocmVxdWVzdCwgeyByZXF1ZXN0SWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy51c2VBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgICBsb2dnZXJTdG9yYWdlLmVudGVyV2l0aChjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uQWZ0ZXJIYW5kbGUoKHsgcmVxdWVzdCwgc2V0LCBzdG9yZSB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlcXVlc3RJZENvbmZpZykge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgICAgY29uc3QgaWQgPSBjdHgucmVxdWVzdElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgc2V0LmhlYWRlcnNbcmVxdWVzdElkQ29uZmlnLmhlYWRlcl0gPSBpZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSlcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnRleHRTdG9yZS5jbGVhckNvbnRleHQocmVxdWVzdClcbiAgICAgIH1cbiAgICB9KVxuICAgIC5hcygnc2NvcGVkJykgYXMgTG9naXhseXNpYVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHBsdWdpbiwgeyB3cmFwV3MgfSkgYXMgTG9naXhseXNpYVBsdWdpblxufVxuXG4vLyBiaW9tZS1pZ25vcmUgbGludC9wZXJmb3JtYW5jZS9ub0JhcnJlbEZpbGU6IHB1YmxpYyBwYWNrYWdlIGVudHJ5IHJlLWV4cG9ydHNcbmV4cG9ydCB7IHJlc29sdmVPcHRpb25zIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZS1vcHRpb25zJ1xuZXhwb3J0IHsgdXNlTG9nZ2VyIH0gZnJvbSAnLi9jb250ZXh0L3N0b3JhZ2UnXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIExvZ1ByZXNldCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdElkQ29uZmlnLFxuICBSZXF1ZXN0U2NvcGVkTG9nZ2VyLFxuICBTdG9yZURhdGEsXG4gIFRyYW5zcG9ydFxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5leHBvcnQgeyBjcmVhdGVMb2dnZXIsIGNyZWF0ZVBsdWdpbkxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB9IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuZXhwb3J0IHtcbiAgZ2V0T3JDcmVhdGVSZXF1ZXN0SWQsXG4gIHJlc29sdmVSZXF1ZXN0SWRDb25maWdcbn0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQgdHlwZSB7IFdzSGFuZGxlckhvb2tzIH0gZnJvbSAnLi93ZWJzb2NrZXQvd3JhcC13cydcbmV4cG9ydCB7IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmV4cG9ydCB0eXBlIExvZ1ByZXNldCA9ICdkZXYnIHwgJ3Byb2QnIHwgJ2pzb24nXG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiB0cnVlLFxuICAgIHN0YXJ0dXBNZXNzYWdlRm9ybWF0OiAnYmFubmVyJyxcbiAgICB1c2VDb2xvcnM6IHRydWUsXG4gICAgc2hvd0NvbnRleHRUcmVlOiB0cnVlLFxuICAgIHBpbm86IHtcbiAgICAgIHByZXR0eVByaW50OiB0cnVlXG4gICAgfVxuICB9LFxuICBwcm9kOiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiBmYWxzZSxcbiAgICB1c2VDb2xvcnM6IGZhbHNlLFxuICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2UsXG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICByZXF1ZXN0SWQ6IHRydWUsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfVxuICB9LFxuICBqc29uOiB7XG4gICAgc2hvd1N0YXJ0dXBNZXNzYWdlOiBmYWxzZSxcbiAgICB1c2VDb2xvcnM6IGZhbHNlLFxuICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2UsXG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHByZXNldCA9IG9wdGlvbnMucHJlc2V0XG4gIGlmICghcHJlc2V0KSB7XG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG4gIGNvbnN0IHByZXNldENvbmZpZyA9IFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjb25maWc6IG1lcmdlQ29uZmlnKHByZXNldENvbmZpZywgb3B0aW9ucy5jb25maWcpXG4gIH1cbn1cbiIsCiAgICAiLyoqIEhUVFAgYFJlcXVlc3RgIG9yIFdlYlNvY2tldCBpbnN0YW5jZSBmb3IgYWNjdW11bGF0ZWQgY29udGV4dC4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRLZXkgPSBSZXF1ZXN0IHwgb2JqZWN0XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHRTdG9yZSB7XG4gIGNsZWFyQ29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gdm9pZFxuICBnZXRDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5KSA9PiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgbWVyZ2VDb250ZXh0OiAoa2V5OiBDb250ZXh0S2V5LCBwYXJ0aWFsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSA9ICgpOiBSZXF1ZXN0Q29udGV4dFN0b3JlID0+IHtcbiAgY29uc3QgYmFncyA9IG5ldyBXZWFrTWFwPENvbnRleHRLZXksIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpXG5cbiAgY29uc3QgZ2V0T3JDcmVhdGUgPSAoa2V5OiBDb250ZXh0S2V5KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGxldCBiYWcgPSBiYWdzLmdldChrZXkpXG4gICAgaWYgKCFiYWcpIHtcbiAgICAgIGJhZyA9IHt9XG4gICAgICBiYWdzLnNldChrZXksIGJhZylcbiAgICB9XG4gICAgcmV0dXJuIGJhZ1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXJnZUNvbnRleHQoa2V5LCBwYXJ0aWFsKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFydGlhbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgYmFnID0gZ2V0T3JDcmVhdGUoa2V5KVxuICAgICAgT2JqZWN0LmFzc2lnbihiYWcsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBnZXRDb250ZXh0KGtleSkge1xuICAgICAgY29uc3QgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgICAgcmV0dXJuIGJhZyA/IHsgLi4uYmFnIH0gOiB7fVxuICAgIH0sXG4gICAgY2xlYXJDb250ZXh0KGtleSkge1xuICAgICAgYmFncy5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxufVxuXG4vKiogQWNjdW11bGF0ZWQgcmVxdWVzdCBjb250ZXh0IGZpcnN0OyBleHBsaWNpdCBgZGF0YS5jb250ZXh0YCB3aW5zIG9uIGtleSBjb2xsaXNpb24uICovXG5leHBvcnQgY29uc3QgbWVyZ2VMb2dEYXRhQ29udGV4dCA9IChcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGFjY3VtdWxhdGVkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkYXRhLmNvbnRleHRcbiAgY29uc3QgaGFzQWNjdW11bGF0ZWQgPSBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMFxuICBjb25zdCBoYXNFeHBsaWNpdCA9XG4gICAgZXhwbGljaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGV4cGxpY2l0ICE9PSBudWxsICYmXG4gICAgdHlwZW9mIGV4cGxpY2l0ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGV4cGxpY2l0KSAmJlxuICAgIE9iamVjdC5rZXlzKGV4cGxpY2l0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuXG4gIGlmICghKGhhc0FjY3VtdWxhdGVkIHx8IGhhc0V4cGxpY2l0KSkge1xuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICBjb25zdCBtZXJnZWRDb250ZXh0ID0ge1xuICAgIC4uLmFjY3VtdWxhdGVkLFxuICAgIC4uLihoYXNFeHBsaWNpdCA/IChleHBsaWNpdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB7fSlcbiAgfVxuXG4gIHJldHVybiB7IC4uLmRhdGEsIGNvbnRleHQ6IG1lcmdlZENvbnRleHQgfVxufVxuIiwKICAgICJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RTY29wZWRMb2dnZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4gPVxuICBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8UmVxdWVzdFNjb3BlZExvZ2dlcj4oKVxuXG5jb25zdCBOT09QX0xPR0dFUjogUmVxdWVzdFNjb3BlZExvZ2dlciA9IHtcbiAgZGVidWc6ICgpID0+IHVuZGVmaW5lZCxcbiAgaW5mbzogKCkgPT4gdW5kZWZpbmVkLFxuICB3YXJuOiAoKSA9PiB1bmRlZmluZWQsXG4gIGVycm9yOiAoKSA9PiB1bmRlZmluZWQsXG4gIG1lcmdlQ29udGV4dDogKCkgPT4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCB1c2VMb2dnZXIgPSAoKTogUmVxdWVzdFNjb3BlZExvZ2dlciA9PlxuICBsb2dnZXJTdG9yYWdlLmdldFN0b3JlKCkgPz8gTk9PUF9MT0dHRVJcbiIsCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuXG5jb25zdCBlbHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJ2VseXNpYS9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBsb2dpeGx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge31cbiAgfVxufSkoKVxuXG5jb25zdCBjZW50ZXJUZXh0ID0gKHRleHQ6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmICh0ZXh0Lmxlbmd0aCA+PSB3aWR0aCkge1xuICAgIHJldHVybiB0ZXh0LnNsaWNlKDAsIHdpZHRoKVxuICB9XG5cbiAgY29uc3QgbGVmdCA9IE1hdGguZmxvb3IoKHdpZHRoIC0gdGV4dC5sZW5ndGgpIC8gMilcbiAgY29uc3QgcmlnaHQgPSB3aWR0aCAtIHRleHQubGVuZ3RoIC0gbGVmdFxuICByZXR1cm4gYCR7JyAnLnJlcGVhdChsZWZ0KX0ke3RleHR9JHsnICcucmVwZWF0KHJpZ2h0KX1gXG59XG5cbnR5cGUgUm93U3BlYyA9XG4gIHwgeyBraW5kOiAnZW1wdHknIH1cbiAgfCB7IGtpbmQ6ICdjZW50ZXInOyB0ZXh0OiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2xlZnQnOyB0ZXh0OiBzdHJpbmcgfVxuXG4vKipcbiAqIEJveCBiYW5uZXI6IEVseXNpYSB2ZXJzaW9uIChjZW50ZXJlZCksIFVSTCBsaW5lLCBvcHRpb25hbCBsb2dpeGx5c2lhIHZlcnNpb24gbGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlckJhbm5lciA9IChcbiAgdXJsRGlzcGxheUxpbmU6IHN0cmluZyxcbiAgbG9naXhseXNpYUxpbmU6IHN0cmluZyB8IG51bGxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb24gPSBlbHlzaWFQa2cudmVyc2lvblxuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gcm93LnRleHRcbiAgICBjb25zdCBwYWRkaW5nID0gTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIHRleHQubGVuZ3RoIC0gNClcbiAgICBvdXQucHVzaChg4pSCICAke3RleHR9JHsnICcucmVwZWF0KHBhZGRpbmcpfSAg4pSCYClcbiAgfVxuICBvdXQucHVzaChib3QpXG4gIHJldHVybiBvdXQuam9pbignXFxuJylcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgdiA9IGxvZ2l4bHlzaWFQa2cudmVyc2lvblxuICBpZiAoIXYpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiBgICAgICBsb2dpeGx5c2lhIHYke3Z9YFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lLCByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcbiAgY29uc3QgdXJsRGlzcGxheUxpbmUgPSBg8J+miiAgJHt1cmx9YFxuXG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuY29uZmlnPy5zdGFydHVwTWVzc2FnZUZvcm1hdCA/PyAnYmFubmVyJ1xuICBpZiAoZm9ybWF0ID09PSAnc2ltcGxlJykge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zb2xlLmxvZyhyZW5kZXJCYW5uZXIodXJsRGlzcGxheUxpbmUsIGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSgpKSlcbn1cbiIsCiAgICAiaW1wb3J0IHBpbm8gZnJvbSAncGlubydcbmltcG9ydCBwcmV0dHkgZnJvbSAncGluby1wcmV0dHknXG5pbXBvcnQge1xuICBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlLFxuICBtZXJnZUxvZ0RhdGFDb250ZXh0LFxuICB0eXBlIFJlcXVlc3RDb250ZXh0U3RvcmVcbn0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpbHRlcixcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBmb3JtYXRMb2dPdXRwdXQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2hhbmRsZS1odHRwLWVycm9yJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zID0ge30sXG4gIHBpbm9GYWN0b3J5OiB0eXBlb2YgcGlubyA9IHBpbm8sXG4gIGV4dGVybmFsQ29udGV4dFN0b3JlPzogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IHtcbiAgY29uc3QgY29udGV4dFN0b3JlID0gZXh0ZXJuYWxDb250ZXh0U3RvcmUgPz8gY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSgpXG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG5cbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHByZXR0eVByaW50T3B0aW9ucyA9XG4gICAgdHlwZW9mIHByZXR0eVByaW50ID09PSAnb2JqZWN0JyAmJiBwcmV0dHlQcmludCAhPT0gbnVsbFxuICAgICAgPyAocHJldHR5UHJpbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGVuYWJsZVByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSB8fCBwcmV0dHlQcmludE9wdGlvbnMgIT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBlbmFibGVQcmV0dHlQcmludCAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG1lc3NhZ2VLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/Lm1lc3NhZ2VLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/P1xuICAgIHBpbm9PcHRpb25zLm1lc3NhZ2VLZXlcbiAgY29uc3QgZXJyb3JLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/LmVycm9yS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcGlub09wdGlvbnMuZXJyb3JLZXlcblxuICBjb25zdCBiYXNlUGlub09wdGlvbnMgPSB7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5XG4gIH1cblxuICBsZXQgcGlub0xvZ2dlcjogUGlub1xuXG4gIGlmIChzaG91bGRQcmV0dHlQcmludCkge1xuICAgIGNvbnN0IHByZXR0eVN0cmVhbSA9IHByZXR0eSh7XG4gICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgdHJhbnNsYXRlVGltZTogY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUsXG4gICAgICAuLi5wcmV0dHlQcmludE9wdGlvbnMsXG4gICAgICBtZXNzYWdlS2V5LFxuICAgICAgZXJyb3JLZXlcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuXG4gICAgcGlub0xvZ2dlciA9IHBpbm9GYWN0b3J5KGJhc2VQaW5vT3B0aW9ucywgcHJldHR5U3RyZWFtKVxuICB9IGVsc2Uge1xuICAgIHBpbm9Mb2dnZXIgPSBwaW5vRmFjdG9yeSh7XG4gICAgICAuLi5iYXNlUGlub09wdGlvbnMsXG4gICAgICB0cmFuc3BvcnQ6IHBpbm9PcHRpb25zLnRyYW5zcG9ydFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IGhhc1RyYW5zcG9ydHMgPSAoY29uZmlnPy50cmFuc3BvcnRzPy5sZW5ndGggPz8gMCkgPiAwXG4gIGNvbnN0IGhhc0ZpbGVMb2dnaW5nID1cbiAgICAhKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykgJiYgISFjb25maWc/LmxvZ0ZpbGVQYXRoXG4gIGNvbnN0IGhhc0ludGVybmFsTG9nZ2VyID0gISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpXG4gIGNvbnN0IGlzRWZmZWN0aXZlbHlEaXNhYmxlZCA9ICEoXG4gICAgaGFzVHJhbnNwb3J0cyB8fFxuICAgIGhhc0ZpbGVMb2dnaW5nIHx8XG4gICAgaGFzSW50ZXJuYWxMb2dnZXJcbiAgKVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNFZmZlY3RpdmVseURpc2FibGVkIHx8ICFzaG91bGRMb2cobGV2ZWwsIGNvbmZpZz8ubG9nRmlsdGVyKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YVdpdGhDb250ZXh0ID0gbWVyZ2VMb2dEYXRhQ29udGV4dChcbiAgICAgIGRhdGEsXG4gICAgICBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KVxuICAgIClcbiAgICBjb25zdCBsb2dEYXRhID1cbiAgICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhV2l0aENvbnRleHQpIDogZGF0YVdpdGhDb250ZXh0XG4gICAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gICAgaWYgKGhhc1RyYW5zcG9ydHMpIHtcbiAgICAgIGxvZ1RvVHJhbnNwb3J0cyh7XG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoaGFzRmlsZUxvZ2dpbmcpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIGxvZ1RvRmlsZSh7XG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICAgIHN0b3JlLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8qIElnbm9yZSBlcnJvcnMgKi9cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWhhc0ludGVybmFsTG9nZ2VyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB7IG1haW4sIGNvbnRleHRMaW5lcyB9ID0gZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAgIGxldmVsLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICBzdG9yZSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KVxuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG5cbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdERUJVRyc6IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnSU5GTyc6IHtcbiAgICAgICAgY29uc29sZS5pbmZvKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdXQVJOSU5HJzoge1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9nV2l0aENvbnRleHQgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbWVyZ2VDb250ZXh0OiAocmVxdWVzdCwgcGFydGlhbCkgPT4ge1xuICAgICAgY29udGV4dFN0b3JlLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBwYXJ0aWFsKVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dDogcmVxdWVzdCA9PiBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSxcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zLCBjb250ZXh0U3RvcmUpXG4gICAgfSxcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0lORk8nLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdXQVJOSU5HJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0VSUk9SJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cbn1cblxuLyoqIFBsdWdpbiBlbnRyeTogc2hhcmVzIG9uZSByZXF1ZXN0LWNvbnRleHQgc3RvcmUgYWNyb3NzIHRoZSBFbHlzaWEgbGlmZWN5Y2xlLiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVBsdWdpbkxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pOiBMb2dnZXIgPT4gY3JlYXRlTG9nZ2VyKG9wdGlvbnMsIHBpbm8sIGNvbnRleHRTdG9yZSlcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb1RyYW5zcG9ydHNJbnB1dF1cbiAgICB8IFtMb2dMZXZlbCwgUmVxdWVzdEluZm8sIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTdG9yZURhdGEsIE9wdGlvbnNdXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8ge1xuICAgICAgICAgIGxldmVsOiBhcmdzWzBdLFxuICAgICAgICAgIHJlcXVlc3Q6IGFyZ3NbMV0sXG4gICAgICAgICAgZGF0YTogYXJnc1syXSxcbiAgICAgICAgICBzdG9yZTogYXJnc1szXSxcbiAgICAgICAgICBvcHRpb25zOiBhcmdzWzRdXG4gICAgICAgIH1cbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgICBiZWZvcmVUaW1lOiBzdG9yZS5iZWZvcmVUaW1lXG4gIH1cblxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEpXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdCAmJlxuICAgICAgICB0eXBlb2YgKHJlc3VsdCBhcyB7IGNhdGNoPzogdW5rbm93biB9KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIDsocmVzdWx0IGFzIFByb21pc2U8dm9pZD4pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUcmFuc3BvcnQgZmFpbHVyZXMgbXVzdCBuZXZlciBjcmFzaCBhcHBsaWNhdGlvbiBsb2dnaW5nLlxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBhcHBlbmRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGVuc3VyZURpciB9IGZyb20gJy4vZnMnXG5pbXBvcnQgeyBwZXJmb3JtUm90YXRpb24sIHNob3VsZFJvdGF0ZSB9IGZyb20gJy4vcm90YXRpb24tbWFuYWdlcidcblxuLy8gUGVyLWZpbGUgbXV0ZXggdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIHJvdGF0aW9uXG5jb25zdCBmaWxlTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlTG9jayA9IChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiB2b2lkPiA9PiB7XG4gIGNvbnN0IHByaW9yID0gZmlsZUxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBmaWxlTG9ja3Muc2V0KGZpbGVQYXRoLCBuZXdMb2NrKVxuXG4gICAgLy8gQ3JpdGljYWwgc2VjdGlvbiBjYW4gbm93IHByb2NlZWRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmVzb2x2ZUxvY2s/LigpXG4gICAgICBpZiAoZmlsZUxvY2tzLmdldChmaWxlUGF0aCkgPT09IG5ld0xvY2spIHtcbiAgICAgICAgZmlsZUxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIC8vIFNhZmVseSBwYXJzZSBVUkwgdG8gYXZvaWQgY3Jhc2hlcyBvbiBtYWxmb3JtZWQgVVJMc1xuICBsZXQgcGF0aG5hbWUgPSAnLydcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHBhdGhuYW1lOiByYXdQYXRobmFtZSwgc2VhcmNoIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgIHBhdGhuYW1lID0gY29uZmlnPy5sb2dRdWVyeVBhcmFtcyA/IGAke3Jhd1BhdGhuYW1lfSR7c2VhcmNofWAgOiByYXdQYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICBwYXRobmFtZSA9IHJlcXVlc3QudXJsXG4gIH1cblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7cGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBhbnkgZmlsZSBvcGVyYXRpb25zIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHJlbGVhc2VMb2NrID0gYXdhaXQgYWNxdWlyZUxvY2soZmlsZVBhdGgpXG5cbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICAgYXdhaXQgYXBwZW5kRmlsZShmaWxlUGF0aCwgbGluZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgZmlsZSB3cml0ZSBlcnJvcnMgdG8gc3RkZXJyIHNvIHRoZXkncmUgbm90IGNvbXBsZXRlbHkgc2lsZW50XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byB3cml0ZSB0byBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICBlcnJvclxuICAgICAgKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGQgPSBhd2FpdCBzaG91bGRSb3RhdGUoZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgIGlmIChzaG91bGQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgcm90YXRpb24gZXJyb3JzIGJ1dCBkb24ndCBjcmFzaCAtIGxvZyBlbnRyeSB3YXMgYWxyZWFkeSB3cml0dGVuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIGxvY2tcbiAgICByZWxlYXNlTG9jaygpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbi8vIENvbXByZXNzaW9uIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGNvbXByZXNzaW9uIG9mIHRoZSBzYW1lIGZpbGVcbmNvbnN0IGNvbXByZXNzaW9uTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrPy4oKVxuICAgICAgaWYgKGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgICBjb21wcmVzc2lvbkxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgYWNxdWlyZUNvbXByZXNzaW9uTG9jayhmaWxlUGF0aClcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBmaWxlIHN0aWxsIGV4aXN0cyAobWlnaHQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGFscmVhZHkgY29tcHJlc3NlZCBvciBkZWxldGVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICAgIGF3YWl0IGZzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0cywgaWdub3JlIGZpbGVzIHRoYXQgd2VyZSBkZWxldGVkIGNvbmN1cnJlbnRseVxuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBpZiAoc3RhdHMubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0c1xuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSBvbGQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9XG4gIC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0oPzotXFxkezN9KT8oPzotXFxkKyk/KSg/OlxcLmd6KT8kL1xuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgIHJldHVybiBhc051bWJlclxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiLy8gTG9jYWwgcGFydCDiiaQ2NCwgZG9tYWluIOKJpDI1MywgVExEIDLigJM2MyAoUkZDIDUzMjEgLyAxMDM1LWlzaCBsaW1pdHM7IGJvdW5kZWQgdG8gYXZvaWQgUmVEb1MpXG5jb25zdCBFTUFJTF9SRUdFWCA9XG4gIC9bYS16QS1aMC05Ll8lKy1dezEsNjR9QFthLXpBLVowLTkuLV17MSwyNTN9XFwuW2EtekEtWl17Miw2M30vZ1xuY29uc3QgSVBWNF9SRUdFWCA9IC9cXGIoPzpcXGR7MSwzfVxcLil7M31cXGR7MSwzfVxcYi9nXG4vKiogRGlnaXQgcnVucyB0aGF0IG1heSBiZSBmb3JtYXR0ZWQgUEFOcyAoc3BhY2VzL2Rhc2hlcyk7IHZhbGlkYXRlZCB3aXRoIEx1aG4gYmVmb3JlIHJlZGFjdGluZy4gKi9cbmNvbnN0IENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCA9IC9cXGIoPzpcXGRbIC1dKj8pezEzLDE5fVxcYi9nXG5jb25zdCBKV1RfUkVHRVggPSAvZXlKW2EtekEtWjAtOV8tXStcXC5leUpbYS16QS1aMC05Xy1dK1xcLlthLXpBLVowLTlfLV0rL2dcblxuY29uc3QgUEFOX01JTl9MRU4gPSAxM1xuY29uc3QgUEFOX01BWF9MRU4gPSAxOVxuXG5jb25zdCBSRURBQ1RFRF9URVhUID0gJ1tSRURBQ1RFRF0nXG5jb25zdCBDSVJDVUxBUl9SRUYgPSAnW0NpcmN1bGFyXSdcblxuLyoqXG4gKiBIb3N0IGFuZCB1c2VyaW5mbyBjYW5ub3QgY29udGFpbiBgW1JFREFDVEVEXWAg4oCUIGBbYCBiZWdpbnMgYW4gSVB2NiBsaXRlcmFsIGluIFVSTHMgYW5kIGJyZWFrcyBwYXJzaW5nLlxuICovXG5jb25zdCBVUkxfU0FGRV9SRURBQ1QgPSAncmVkYWN0ZWQnXG5cbmNvbnN0IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PlxuICByZWRhY3RTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuXG4vKiogQXBwbHkgUElJIHJlZGFjdGlvbiB0byBhIHJlcXVlc3QgVVJMIHdoaWxlIGtlZXBpbmcgdGhlIHJlc3VsdCBwYXJzZWFibGUgYnkgdGhlIFVSTC9SZXF1ZXN0IGNvbnN0cnVjdG9ycy4gKi9cbmNvbnN0IHJlZGFjdFJlcXVlc3RVcmwgPSAodXJsU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKHVybFN0cmluZylcbiAgICBpZiAodS51c2VybmFtZSAhPT0gJycpIHtcbiAgICAgIHUudXNlcm5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUudXNlcm5hbWUpXG4gICAgfVxuICAgIGlmICh1LnBhc3N3b3JkICE9PSAnJykge1xuICAgICAgdS5wYXNzd29yZCA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS5wYXNzd29yZClcbiAgICB9XG4gICAgdS5ob3N0bmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS5ob3N0bmFtZSlcbiAgICB1LnBhdGhuYW1lID0gcmVkYWN0U3RyaW5nKHUucGF0aG5hbWUpXG4gICAgdS5zZWFyY2ggPSByZWRhY3RTdHJpbmcodS5zZWFyY2gpXG4gICAgdS5oYXNoID0gcmVkYWN0U3RyaW5nKHUuaGFzaClcbiAgICByZXR1cm4gdS50b1N0cmluZygpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodXJsU3RyaW5nKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcbiAgfVxufVxuXG4vKiogTHVobiBjaGVja3N1bTsgYGRpZ2l0c2AgbXVzdCBjb250YWluIG9ubHkgYDAtOWAgYW5kIGxlbmd0aCBpbiBQQU4gcmFuZ2UuICovXG5jb25zdCBwYXNzZXNMdWhuID0gKGRpZ2l0czogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmIChkaWdpdHMubGVuZ3RoIDwgUEFOX01JTl9MRU4gfHwgZGlnaXRzLmxlbmd0aCA+IFBBTl9NQVhfTEVOKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgc3VtID0gMFxuICBsZXQgYWx0ZXJuYXRlID0gZmFsc2VcblxuICBmb3IgKGxldCBpID0gZGlnaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gNTcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBsZXQgbiA9IGNvZGUgLSA0OFxuICAgIGlmIChhbHRlcm5hdGUpIHtcbiAgICAgIG4gKj0gMlxuICAgICAgaWYgKG4gPiA5KSB7XG4gICAgICAgIG4gLT0gOVxuICAgICAgfVxuICAgIH1cbiAgICBzdW0gKz0gblxuICAgIGFsdGVybmF0ZSA9ICFhbHRlcm5hdGVcbiAgfVxuXG4gIHJldHVybiBzdW0gJSAxMCA9PT0gMFxufVxuXG5jb25zdCByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdGV4dC5yZXBsYWNlKENSRURJVF9DQVJEX0NBTkRJREFURV9SRUdFWCwgbWF0Y2ggPT4ge1xuICAgIGNvbnN0IGRpZ2l0cyA9IG1hdGNoLnJlcGxhY2UoL1xcRC9nLCAnJylcbiAgICBpZiAoXG4gICAgICBkaWdpdHMubGVuZ3RoID49IFBBTl9NSU5fTEVOICYmXG4gICAgICBkaWdpdHMubGVuZ3RoIDw9IFBBTl9NQVhfTEVOICYmXG4gICAgICBwYXNzZXNMdWhuKGRpZ2l0cylcbiAgICApIHtcbiAgICAgIHJldHVybiBSRURBQ1RFRF9URVhUXG4gICAgfVxuICAgIHJldHVybiBtYXRjaFxuICB9KVxuXG5leHBvcnQgY29uc3QgcmVkYWN0U3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCByZXN1bHQgPSB0ZXh0XG5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU1BSUxfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKElQVjRfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG4gIHJlc3VsdCA9IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzKHJlc3VsdClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSldUX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuY29uc3QgcmVkYWN0RXJyb3JDbG9uZSA9IChcbiAgb3JpZ2luYWxFcnJvcjogRXJyb3IsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLm1lc3NhZ2UpXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9yaWdpbmFsRXJyb3IpIGFzIG9iamVjdFxuICBjb25zdCBuZXdFcnJvciA9IE9iamVjdC5jcmVhdGUocHJvdG8pIGFzIEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBuZXdFcnJvci5tZXNzYWdlID0gcmVkYWN0ZWRNZXNzYWdlXG4gIG5ld0Vycm9yLm5hbWUgPSBvcmlnaW5hbEVycm9yLm5hbWVcblxuICBpZiAob3JpZ2luYWxFcnJvci5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbmV3RXJyb3Iuc3RhY2sgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5zdGFjaylcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVjb3JkID0gb3JpZ2luYWxFcnJvciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZXJyb3JSZWNvcmQpKSB7XG4gICAgaWYgKGtleSAhPT0gJ21lc3NhZ2UnICYmIGtleSAhPT0gJ25hbWUnICYmIGtleSAhPT0gJ3N0YWNrJykge1xuICAgICAgbmV3RXJyb3Jba2V5XSA9IHJlZGFjdElubmVyKGVycm9yUmVjb3JkW2tleV0sIGluUHJvZ3Jlc3MpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0Vycm9yXG59XG5cbmNvbnN0IHJlZGFjdEFycmF5SXRlbXMgPSAoXG4gIHZhbHVlOiB1bmtub3duW10sXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogdW5rbm93bltdID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRBcnJheTogdW5rbm93bltdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdmFsdWUubGVuZ3RoIH0pXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICByZWRhY3RlZEFycmF5W2ldID0gcmVkYWN0SW5uZXIodmFsdWVbaV0sIGluUHJvZ3Jlc3MpXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkQXJyYXlcbn1cblxuY29uc3QgcmVkYWN0UmVjb3JkRW50cmllcyA9IChcbiAgcmVjb3JkVmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkVmFsdWUpKSB7XG4gICAgcmVkYWN0ZWRSZWNvcmRba2V5XSA9IHJlZGFjdElubmVyKHJlY29yZFZhbHVlW2tleV0sIGluUHJvZ3Jlc3MpXG4gIH1cbiAgcmV0dXJuIHJlZGFjdGVkUmVjb3JkXG59XG5cbmNvbnN0IHdpdGhSZWVudHJhbmN5R3VhcmQgPSA8VD4oXG4gIG9iajogb2JqZWN0LFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4sXG4gIHJ1bjogKCkgPT4gVFxuKTogVCA9PiB7XG4gIGluUHJvZ3Jlc3MuYWRkKG9iailcbiAgdHJ5IHtcbiAgICByZXR1cm4gcnVuKClcbiAgfSBmaW5hbGx5IHtcbiAgICBpblByb2dyZXNzLmRlbGV0ZShvYmopXG4gIH1cbn1cblxuY29uc3QgcmVkYWN0SW5uZXIgPSA8VD4odmFsdWU6IFQsIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0Pik6IFQgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHZhbHVlKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLmdldFRpbWUoKSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBvYmplY3RcbiAgaWYgKGluUHJvZ3Jlc3MuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gQ0lSQ1VMQVJfUkVGIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RFcnJvckNsb25lKHZhbHVlLCBpblByb2dyZXNzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgICByZWRhY3RBcnJheUl0ZW1zKHZhbHVlLCBpblByb2dyZXNzKVxuICAgICkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICByZXR1cm4gd2l0aFJlZW50cmFuY3lHdWFyZChvYmosIGluUHJvZ3Jlc3MsICgpID0+XG4gICAgcmVkYWN0UmVjb3JkRW50cmllcyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaW5Qcm9ncmVzcylcbiAgKSBhcyB1bmtub3duIGFzIFRcbn1cblxuZXhwb3J0IGNvbnN0IHJlZGFjdCA9IDxUPih2YWx1ZTogVCk6IFQgPT4gcmVkYWN0SW5uZXIodmFsdWUsIG5ldyBXZWFrU2V0KCkpXG5cbi8qKlxuICogQ2xvbmUgcmVxdWVzdCBVUkwsIG1ldGhvZCBhbmQgaGVhZGVycyBmb3IgbG9nZ2luZyB3aXRoIHRoZSBzYW1lIHN0cmluZyByZWRhY3Rpb24gYXMge0BsaW5rIHJlZGFjdH0uXG4gKiBUaGUgcmV0dXJuZWQgcmVxdWVzdCBpcyBhIGxvZ2dpbmctb25seSBhcnRpZmFjdCBjYXJyeWluZyB1cmwvbWV0aG9kL2hlYWRlcnMvc2lnbmFsOyBpdCBpbnRlbnRpb25hbGx5XG4gKiBvbWl0cyB0aGUgYm9keSBzbyBpdCBuZXZlciByZS11c2VzIHRoZSBvcmlnaW5hbCAocG9zc2libHkgYWxyZWFkeS1jb25zdW1lZCkgcmVxdWVzdCBzdHJlYW0uIFRoZVxuICogb3JpZ2luYWwgcmVxdWVzdCBpcyBsZWZ0IHVudG91Y2hlZCBhbmQgcmVtYWlucyB1c2FibGUuXG4gKi9cbmV4cG9ydCBjb25zdCByZWRhY3RSZXF1ZXN0ID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBSZXF1ZXN0ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRVcmwgPSByZWRhY3RSZXF1ZXN0VXJsKHJlcXVlc3QudXJsKVxuICBjb25zdCBuZXh0SGVhZGVycyA9IG5ldyBIZWFkZXJzKClcbiAgbGV0IGhlYWRlcnNDaGFuZ2VkID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcmVxdWVzdC5oZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IHJlZGFjdGVkID0gcmVkYWN0U3RyaW5nKHZhbHVlKVxuICAgIGlmIChyZWRhY3RlZCAhPT0gdmFsdWUpIHtcbiAgICAgIGhlYWRlcnNDaGFuZ2VkID0gdHJ1ZVxuICAgIH1cbiAgICBuZXh0SGVhZGVycy5zZXQobmFtZSwgcmVkYWN0ZWQpXG4gIH1cblxuICBjb25zdCByZWRhY3RlZE1ldGhvZCA9IHJlZGFjdFN0cmluZyhyZXF1ZXN0Lm1ldGhvZClcbiAgY29uc3QgdXJsQ2hhbmdlZCA9IHJlZGFjdGVkVXJsICE9PSByZXF1ZXN0LnVybFxuICBjb25zdCBtZXRob2RDaGFuZ2VkID0gcmVkYWN0ZWRNZXRob2QgIT09IHJlcXVlc3QubWV0aG9kXG5cbiAgaWYgKCEodXJsQ2hhbmdlZCB8fCBoZWFkZXJzQ2hhbmdlZCB8fCBtZXRob2RDaGFuZ2VkKSkge1xuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVxdWVzdChyZWRhY3RlZFVybCwgaW5pdClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgaXNTdHJ1Y3R1cmVkRXJyb3IsIHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuY29uc3QgcGFkMyA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMywgJzAnKVxuXG5jb25zdCBERUZBVUxUX1NMT1dfTVMgPSA1MDBcbmNvbnN0IERFRkFVTFRfVkVSWV9TTE9XX01TID0gMTAwMFxuY29uc3QgTUVUSE9EX1BBRCA9IDdcblxuY29uc3QgREVGQVVMVF9MT0dfRk9STUFUID1cbiAgJ3tub3d9IHtzZXJ2aWNlfXtpY29ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHtkdXJhdGlvbn0ge21lc3NhZ2V9e3NwZWVkfSdcblxuY29uc3QgTE9HX0ZPUk1BVF9SRUdFWCA9XG4gIC9cXHsobm93fGVwb2NofGxldmVsfGljb258ZHVyYXRpb258bWV0aG9kfHBhdGhuYW1lfHBhdGh8cXVlcnl8c3RhdHVzfHN0YXR1c1RleHR8bWVzc2FnZXxpcHxjb250ZXh0fHNlcnZpY2V8c3BlZWR8cmVxdWVzdElkKVxcfS9nXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkTG9nT3V0cHV0IHtcbiAgY29udGV4dExpbmVzOiBzdHJpbmdbXVxuICBtYWluOiBzdHJpbmdcbn1cblxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgZW5hYmxlZEJ5Q29uZmlnID0gY29uZmlnPy51c2VDb2xvcnMgPz8gdHJ1ZVxuXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXG4gIGNvbnN0IGlzVHR5ID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZVxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHBhdHRlcm5cbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuLyoqIFJlc29sdmVzIGNsaWVudCBJUCBmcm9tIHgtZm9yd2FyZGVkLWZvciAoZmlyc3QgSVApIG9yIHgtcmVhbC1pcC4gRW1wdHkgd2hlbiBuZWl0aGVyIGhlYWRlciBpcyBzZXQgKGUuZy4gbG9jYWxob3N0KS4gKi9cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3RJbmZvKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgaWYgKGZvcndhcmRlZCkge1xuICAgIHJldHVybiBmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREdXJhdGlvbiA9IChtczogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKG1zID49IDEwMDApIHtcbiAgICBjb25zdCBzZWMgPSBtcyAvIDEwMDBcbiAgICBpZiAoc2VjID49IDEwKSB7XG4gICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChzZWMpfXNgXG4gICAgfVxuICAgIGNvbnN0IG9uZURlY2ltYWwgPSBzZWMudG9GaXhlZCgxKVxuICAgIHJldHVybiBvbmVEZWNpbWFsLmVuZHNXaXRoKCcuMCcpID8gYCR7TWF0aC5yb3VuZChzZWMpfXNgIDogYCR7b25lRGVjaW1hbH1zYFxuICB9XG4gIGlmIChtcyA+IDAgJiYgbXMgPCAxKSB7XG4gICAgcmV0dXJuIGAke21zLnRvRml4ZWQoMil9bXNgXG4gIH1cbiAgcmV0dXJuIGAke01hdGgucm91bmQobXMpfW1zYFxufVxuXG5jb25zdCBnZXRTbG93VGhyZXNob2xkcyA9IChcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyBzbG93OiBudW1iZXI7IHZlcnlTbG93OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIHJldHVybiB7XG4gICAgc2xvdzogY29uZmlnPy5zbG93VGhyZXNob2xkID8/IERFRkFVTFRfU0xPV19NUyxcbiAgICB2ZXJ5U2xvdzogY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1ZFUllfU0xPV19NU1xuICB9XG59XG5cbmNvbnN0IGNvbG9yRHVyYXRpb25UZXh0ID0gKFxuICBtczogbnVtYmVyLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgdGV4dDogc3RyaW5nOyBpc1ZlcnlTbG93OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCByYXcgPSBmb3JtYXREdXJhdGlvbihtcylcbiAgY29uc3QgeyBzbG93LCB2ZXJ5U2xvdyB9ID0gZ2V0U2xvd1RocmVzaG9sZHMob3B0aW9ucylcbiAgY29uc3QgaXNWZXJ5U2xvdyA9IG1zID49IHZlcnlTbG93XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4geyB0ZXh0OiByYXcsIGlzVmVyeVNsb3cgfVxuICB9XG5cbiAgbGV0IGNvbG9yZWQgPSByYXdcbiAgaWYgKG1zIDwgc2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay5ncmVlbihyYXcpXG4gIH0gZWxzZSBpZiAobXMgPCB2ZXJ5U2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay55ZWxsb3cocmF3KVxuICB9IGVsc2Uge1xuICAgIGNvbG9yZWQgPSBjaGFsay5yZWQuYm9sZChyYXcpXG4gIH1cblxuICByZXR1cm4geyB0ZXh0OiBjb2xvcmVkLCBpc1ZlcnlTbG93IH1cbn1cblxuY29uc3QgZ2V0U3BlZWRUb2tlbiA9IChpc1ZlcnlTbG93OiBib29sZWFuLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmVyeVNsb3cpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBiYWRnZSA9ICfimqEgc2xvdydcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCAke2JhZGdlfWBcbiAgfVxuICByZXR1cm4gYCAke2NoYWxrLnllbGxvdyhiYWRnZSl9YFxufVxuXG4vKiogTG9naXhseXNpYSBicmFuZDogZm94IGVtb2ppIHdpdGggbGV2ZWwtY29sb3JlZCBiYWNrZ3JvdW5kIHdoZW4gY29sb3JzIGFyZSBlbmFibGVkLiAqL1xuY29uc3QgZ2V0TGV2ZWxJY29uID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gJ/CfpoonXG4gIH1cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2soJyDwn6aKICcpXG59XG5cbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGxldmVsXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXG59XG5cbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChudW1lcmljID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheSh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1c0NvZGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRleHQgPSBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV1cbiAgcmV0dXJuIHRleHQgPz8gJydcbn1cblxuY29uc3QgZ2V0U2VydmljZVRva2VuID0gKG9wdGlvbnM6IE9wdGlvbnMsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLmNvbmZpZz8uc2VydmljZT8udHJpbSgpXG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IGBbJHtuYW1lfV1gXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAke2JyYWNrZXRlZH0gYFxuICB9XG4gIHJldHVybiBgJHtjaGFsay5kaW0oYnJhY2tldGVkKX0gYFxufVxuXG5jb25zdCBzdHJpbmdpZnlUcmVlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB2YWx1ZS5tZXNzYWdlXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbn1cblxuLyoqIE5lc3RlZCBvYmplY3RzIHRvIGV4cGFuZCBpbiB0aGUgY29udGV4dCB0cmVlIChleGNsdWRlcyBBcnJheXMsIEVycm9yLCBEYXRlKS4gKi9cbmNvbnN0IGlzRXhwYW5kYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHZhbHVlICE9PSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG5cbmNvbnN0IGNvbGxlY3RDb250ZXh0RW50cmllcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlcHRoUmVtYWluaW5nOiBudW1iZXJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IG91dDogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrfWAgOiBrXG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJDb250ZXh0VHJlZUxpbmVzID0gKFxuICBjdHg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcbiAgaWYgKGRlcHRoIDwgMSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGNvbGxlY3RDb250ZXh0RW50cmllcyhjdHgsICcnLCBkZXB0aClcbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzID0gKGVycm9yOiB1bmtub3duKTogW3N0cmluZywgc3RyaW5nXVtdID0+IHtcbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihlcnJvcilcbiAgaWYgKG1zZykge1xuICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgbXNnXSlcbiAgfVxuICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3IoZXJyb3IpKSB7XG4gICAgaWYgKGVycm9yLndoeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci53aHknLCBTdHJpbmcoZXJyb3Iud2h5KV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5maXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IuZml4JywgU3RyaW5nKGVycm9yLmZpeCldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGluayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5saW5rJywgU3RyaW5nKGVycm9yLmxpbmspXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmludGVybmFsJywgc3RyaW5naWZ5VHJlZVZhbHVlKGVycm9yLmludGVybmFsKV0pXG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKG9wdGlvbnMuY29uZmlnPy5zaG93Q29udGV4dFRyZWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcblxuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuXG4gIGNvbnN0IGN0eCA9IGRhdGEuY29udGV4dFxuICBpZiAoXG4gICAgY3R4ICYmXG4gICAgdHlwZW9mIGN0eCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShjdHgpICYmXG4gICAgT2JqZWN0LmtleXMoY3R4IGFzIG9iamVjdCkubGVuZ3RoID4gMCAmJlxuICAgIGRlcHRoID49IDFcbiAgKSB7XG4gICAgZW50cmllcy5wdXNoKFxuICAgICAgLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJycsIGRlcHRoKVxuICAgIClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAnZXJyb3InIGluIGRhdGEgJiYgZGF0YS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW50cmllcy5wdXNoKC4uLmNvbGxlY3RTdHJ1Y3R1cmVkRXJyb3JFbnRyaWVzKGRhdGEuZXJyb3IpKVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9nT3V0cHV0ID0gKHtcbiAgbGV2ZWwsXG4gIHJlcXVlc3QsXG4gIGRhdGEsXG4gIHN0b3JlLFxuICBvcHRpb25zXG59OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBGb3JtYXR0ZWRMb2dPdXRwdXQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID0gY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz8gREVGQVVMVF9MT0dfRk9STUFUXG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCBlcG9jaCA9IFN0cmluZyhub3cuZ2V0VGltZSgpKVxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSlcbiAgY29uc3QgdGltZXN0YW1wID0gZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycylcblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGxldCByYXdQYXRobmFtZTogc3RyaW5nXG4gIGxldCBzZWFyY2g6IHN0cmluZ1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcmF3UGF0aG5hbWUgPSB1cmwucGF0aG5hbWVcbiAgICBzZWFyY2ggPSB1cmwuc2VhcmNoXG4gIH0gY2F0Y2gge1xuICAgIHJhd1BhdGhuYW1lID0gcmVxdWVzdC51cmwgfHwgJy8nXG4gICAgc2VhcmNoID0gJydcbiAgfVxuICBjb25zdCBxdWVyeSA9IHNlYXJjaFxuICBjb25zdCBwYXRobmFtZSA9IGNvbmZpZz8ubG9nUXVlcnlQYXJhbXNcbiAgICA/IGAke3Jhd1BhdGhuYW1lfSR7cXVlcnl9YFxuICAgIDogcmF3UGF0aG5hbWVcbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcoc3RhdHVzQ29kZSlcbiAgY29uc3QgaXAgPSBjb25maWc/LmlwID09PSB0cnVlID8gZ2V0SXAocmVxdWVzdCkgOiAnJ1xuXG4gIGNvbnN0IHNob3dUcmVlID0gY29uZmlnPy5zaG93Q29udGV4dFRyZWUgIT09IGZhbHNlXG4gIGNvbnN0IGN0eFN0cmluZyA9XG4gICAgc2hvd1RyZWUgJiZcbiAgICBkYXRhLmNvbnRleHQgJiZcbiAgICB0eXBlb2YgZGF0YS5jb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dCkgJiZcbiAgICBPYmplY3Qua2V5cyhkYXRhLmNvbnRleHQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG4gICAgICA/ICcnXG4gICAgICA6IGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxuXG4gIGNvbnN0IGNvbG9yZWRMZXZlbCA9IGdldENvbG9yZWRMZXZlbChsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBtZXRob2RQYWRkZWQgPSByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLnBhZEVuZChNRVRIT0RfUEFEKVxuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gZ2V0Q29sb3JlZE1ldGhvZChtZXRob2RQYWRkZWQsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFBhdGhuYW1lID0gZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxuICBjb25zdCB7IHRleHQ6IGNvbG9yZWREdXJhdGlvbiwgaXNWZXJ5U2xvdyB9ID0gY29sb3JEdXJhdGlvblRleHQoXG4gICAgZHVyYXRpb25NcyxcbiAgICB1c2VDb2xvcnMsXG4gICAgb3B0aW9uc1xuICApXG4gIGNvbnN0IHNwZWVkVG9rZW4gPSBnZXRTcGVlZFRva2VuKGlzVmVyeVNsb3csIHVzZUNvbG9ycylcbiAgY29uc3QgaWNvbiA9IGdldExldmVsSWNvbihsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBzdGF0dXNUZXh0ID0gZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKVxuICBjb25zdCBzZXJ2aWNlVG9rZW4gPSBnZXRTZXJ2aWNlVG9rZW4ob3B0aW9ucywgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IHRva2VuTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne2Vwb2NofSc6IGVwb2NoLFxuICAgICd7bGV2ZWx9JzogY29sb3JlZExldmVsLFxuICAgICd7aWNvbn0nOiBpY29uLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7bWV0aG9kfSc6IGNvbG9yZWRNZXRob2QsXG4gICAgJ3twYXRobmFtZX0nOiBjb2xvcmVkUGF0aG5hbWUsXG4gICAgJ3twYXRofSc6IGNvbG9yZWRQYXRobmFtZSxcbiAgICAne3F1ZXJ5fSc6IHF1ZXJ5LFxuICAgICd7c3RhdHVzfSc6IGNvbG9yZWRTdGF0dXMsXG4gICAgJ3tzdGF0dXNUZXh0fSc6IHN0YXR1c1RleHQsXG4gICAgJ3ttZXNzYWdlfSc6IG1lc3NhZ2UsXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7c2VydmljZX0nOiBzZXJ2aWNlVG9rZW4sXG4gICAgJ3tzcGVlZH0nOiBzcGVlZFRva2VuLFxuICAgICd7cmVxdWVzdElkfSc6XG4gICAgICB0eXBlb2YgZGF0YS5jb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgZGF0YS5jb250ZXh0ICE9PSBudWxsICYmXG4gICAgICAncmVxdWVzdElkJyBpbiBkYXRhLmNvbnRleHRcbiAgICAgICAgPyBTdHJpbmcoKGRhdGEuY29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucmVxdWVzdElkKVxuICAgICAgICA6ICcnXG4gIH1cblxuICBjb25zdCBtYWluID0gZm9ybWF0LnJlcGxhY2UoXG4gICAgTE9HX0ZPUk1BVF9SRUdFWCxcbiAgICBtYXRjaCA9PiB0b2tlbk1hcFttYXRjaF0gPz8gbWF0Y2hcbiAgKVxuXG4gIGNvbnN0IGNvbnRleHRMaW5lcyA9IGJ1aWxkQ29udGV4dFRyZWVMaW5lcyhsZXZlbCwgZGF0YSwgb3B0aW9ucylcblxuICByZXR1cm4geyBtYWluLCBjb250ZXh0TGluZXMgfVxufVxuXG4vKiogQGRlcHJlY2F0ZWQgUHJlZmVyIHtAbGluayBmb3JtYXRMb2dPdXRwdXR9IGZvciBtdWx0aS1saW5lIGNvbnRleHQgdHJlZXMuIFJldHVybnMgdGhlIG1haW4gbGluZSBvbmx5LiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdExpbmUgPSAoaW5wdXQ6IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufSk6IHN0cmluZyA9PlxuICBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIC4uLmlucHV0LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIC4uLmlucHV0Lm9wdGlvbnMsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLi4uaW5wdXQub3B0aW9ucy5jb25maWcsXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cnVjdHVyZWRFcnJvciB7XG4gIGZpeD86IHN0cmluZ1xuICBpbnRlcm5hbD86IHVua25vd25cbiAgbGluaz86IHN0cmluZ1xuICB3aHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGlzU3RydWN0dXJlZEVycm9yID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgU3RydWN0dXJlZEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAoJ3doeScgaW4gdmFsdWUgfHwgJ2ZpeCcgaW4gdmFsdWUgfHwgJ2xpbmsnIGluIHZhbHVlIHx8ICdpbnRlcm5hbCcgaW4gdmFsdWUpXG4iLAogICAgImltcG9ydCB7XG4gIG1lcmdlTG9nRGF0YUNvbnRleHQsXG4gIHR5cGUgUmVxdWVzdENvbnRleHRTdG9yZVxufSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBmb3JtYXRMb2dPdXRwdXQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5cbmNvbnN0IGlzRXJyb3JXaXRoU3RhdHVzID0gKFxuICB2YWx1ZTogdW5rbm93blxuKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyB7IHN0YXR1cz86IHVua25vd24gfSkuc3RhdHVzID09PSAnbnVtYmVyJ1xuXG5leHBvcnQgY29uc3QgaGFuZGxlSHR0cEVycm9yID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgZXJyb3I6IHVua25vd24sXG4gIHN0b3JlOiBTdG9yZURhdGEsXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IHZvaWQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IGxvZ0ZpbHRlciA9IGNvbmZpZz8ubG9nRmlsdGVyXG4gIGlmIChcbiAgICBsb2dGaWx0ZXI/LmxldmVsICYmXG4gICAgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA+IDAgJiZcbiAgICAhbG9nRmlsdGVyLmxldmVsLmluY2x1ZGVzKCdFUlJPUicpXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG5cbiAgY29uc3Qgc3RhdHVzID0gaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXG4gIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZUVycm9yKGVycm9yKVxuXG4gIGNvbnN0IGxldmVsOiBMb2dMZXZlbCA9ICdFUlJPUidcbiAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IHN0YXR1cywgbWVzc2FnZSwgZXJyb3IgfVxuICBjb25zdCBkYXRhV2l0aENvbnRleHQgPSBjb250ZXh0U3RvcmVcbiAgICA/IG1lcmdlTG9nRGF0YUNvbnRleHQoZGF0YSwgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdCkpXG4gICAgOiBkYXRhXG4gIGNvbnN0IGxvZ0RhdGEgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhV2l0aENvbnRleHQpIDogZGF0YVdpdGhDb250ZXh0XG4gIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgIGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdFJlcXVlc3QocmVxdWVzdCkgOiByZXF1ZXN0XG5cbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsIGRhdGE6IGxvZ0RhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgbG9nVG9GaWxlKHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGxldmVsLFxuICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBzdG9yZSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIGxldmVsLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgZGF0YTogbG9nRGF0YSxcbiAgICBzdG9yZSxcbiAgICBvcHRpb25zXG4gIH0pXG5cbiAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9XG4gICAgY29udGV4dExpbmVzLmxlbmd0aCA+IDAgPyBgJHttYWlufVxcbiR7Y29udGV4dExpbmVzLmpvaW4oJ1xcbicpfWAgOiBtYWluXG4gIGNvbnNvbGUuZXJyb3IoZm9ybWF0dGVkTWVzc2FnZSlcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SWRDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBERUZBVUxUX0hFQURFUiA9ICdYLVJlcXVlc3QtSWQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuXG4gIGdlbmVyYXRvcjogKCkgPT4gc3RyaW5nXG4gIGhlYWRlcjogc3RyaW5nXG59XG5cbi8qKlxuICogTm9ybWFsaXNlcyB0aGUgYHJlcXVlc3RJZGAgb3B0aW9uIGludG8gYSBjb25jcmV0ZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIC0gYHVuZGVmaW5lZGAgLyBgZmFsc2VgIOKGkiBgbnVsbGAgKGRpc2FibGVkKVxuICogLSBgdHJ1ZWAg4oaSIGRlZmF1bHQgY29uZmlnXG4gKiAtIGBSZXF1ZXN0SWRDb25maWdgIOKGkiBtZXJnZWQgd2l0aCBkZWZhdWx0czsgYGVuYWJsZWQ6IGZhbHNlYCBpbnNpZGUgdGhlIG9iamVjdCBkaXNhYmxlcyB0aGUgZmVhdHVyZVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZyA9IChcbiAgcmF3PzogYm9vbGVhbiB8IFJlcXVlc3RJZENvbmZpZ1xuKTogUmVzb2x2ZWRSZXF1ZXN0SWRDb25maWcgfCBudWxsID0+IHtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHJhdyA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgaGVhZGVyOiBERUZBVUxUX0hFQURFUixcbiAgICAgIGdlbmVyYXRvcjogKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgfVxuXG4gIC8vIE9iamVjdCBmb3JtIOKAlCBgZW5hYmxlZGAgZGVmYXVsdHMgdG8gYHRydWVgIHdoZW4gdGhlIG9iamVjdCBpcyBwcm92aWRlZFxuICBpZiAocmF3LmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBoZWFkZXI6IHJhdy5oZWFkZXI/LnRyaW0oKSB8fCBERUZBVUxUX0hFQURFUixcbiAgICBnZW5lcmF0b3I6IHJhdy5nZW5lcmF0b3IgPz8gKCgpID0+IGNyeXB0by5yYW5kb21VVUlEKCkpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBleGlzdGluZyByZXF1ZXN0IElEIGZyb20gdGhlIGluY29taW5nIHJlcXVlc3QgaGVhZGVyLCBvciBnZW5lcmF0ZXMgYVxuICogbmV3IG9uZSB1c2luZyB0aGUgY29uZmlndXJlZCBnZW5lcmF0b3IuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVJlcXVlc3RJZCA9IChcbiAgcmVxdWVzdDogUmVxdWVzdCxcbiAgY29uZmlnOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZ1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZXhpc3RpbmcgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGNvbmZpZy5oZWFkZXIpXG4gIGlmIChleGlzdGluZykge1xuICAgIHJldHVybiBleGlzdGluZ1xuICB9XG4gIHJldHVybiBjb25maWcuZ2VuZXJhdG9yKClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi4vY29udGV4dC9yZXF1ZXN0LWNvbnRleHQnXG5pbXBvcnQgdHlwZSB7IExvZ2dlciwgT3B0aW9ucywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRMaWtlIHtcbiAgcmVhZG9ubHkgZGF0YT86IHsgc3RvcmU/OiB7IGxvZ2dlcj86IExvZ2dlciB9IH1cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXc0hhbmRsZXJIb29rczxcbiAgVE1lc3NhZ2UgPSB1bmtub3duLFxuICBUV3MgZXh0ZW5kcyBXZWJTb2NrZXRMaWtlID0gV2ViU29ja2V0TGlrZVxuPiB7XG4gIGNsb3NlPzogKHdzOiBUV3MpID0+IHZvaWRcbiAgbWVzc2FnZT86ICh3czogVFdzLCBtZXNzYWdlOiBUTWVzc2FnZSkgPT4gdm9pZFxuICBvcGVuPzogKHdzOiBUV3MpID0+IHZvaWRcbn1cblxuY29uc3Qgd3NTeW50aGV0aWNSZXF1ZXN0ID0gKHBhdGg6IHN0cmluZyk6IFJlcXVlc3QgPT5cbiAgbmV3IFJlcXVlc3QoYGh0dHA6Ly9sb2dpeGx5c2lhLmxvY2FsJHtwYXRofWAsIHsgbWV0aG9kOiAnV1MnIH0pXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXc0hhbmRsZXJXcmFwcGVyID0gKFxuICBvcHRpb25zOiBPcHRpb25zLFxuICBsb2dnZXI6IExvZ2dlcixcbiAgY29udGV4dFN0b3JlOiBSZXF1ZXN0Q29udGV4dFN0b3JlXG4pID0+IHtcbiAgY29uc3Qgd3NUaW1pbmdzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBiaWdpbnQ+KClcblxuICBjb25zdCBsb2dXcyA9IChcbiAgICBsZXZlbDogJ0lORk8nIHwgJ1dBUk5JTkcnIHwgJ0VSUk9SJyxcbiAgICB3czogV2ViU29ja2V0TGlrZSxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGV4dHJhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5ID0gd3MgYXMgb2JqZWN0XG4gICAgY29uc3QgYmVmb3JlVGltZSA9IHdzVGltaW5ncy5nZXQoa2V5KSA/PyBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWUgfVxuICAgIGNvbnN0IGFjY3VtdWxhdGVkID0gY29udGV4dFN0b3JlLmdldENvbnRleHQoa2V5KVxuICAgIGNvbnN0IGNvbnRleHQgPVxuICAgICAgT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDAgfHwgZXh0cmFcbiAgICAgICAgPyB7IC4uLmFjY3VtdWxhdGVkLCAuLi5leHRyYSwgd3NJZDogd3MuaWQgfVxuICAgICAgICA6IHsgd3NJZDogd3MuaWQgfVxuXG4gICAgbG9nZ2VyLmxvZyhcbiAgICAgIGxldmVsLFxuICAgICAgd3NTeW50aGV0aWNSZXF1ZXN0KHBhdGgpLFxuICAgICAgeyBtZXNzYWdlLCBjb250ZXh0LCBzdGF0dXM6IDIwMCB9LFxuICAgICAgc3RvcmVcbiAgICApXG4gIH1cblxuICByZXR1cm4gPFxuICAgIFRNZXNzYWdlLFxuICAgIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UsXG4gICAgY29uc3QgVEhvb2tzIGV4dGVuZHMgV3NIYW5kbGVySG9va3M8VE1lc3NhZ2UsIFRXcz5cbiAgPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaG9va3M6IFRIb29rc1xuICApOiBUSG9va3MgPT5cbiAgICAoe1xuICAgICAgLi4uaG9va3MsXG4gICAgICBvcGVuKHdzKSB7XG4gICAgICAgIHdzVGltaW5ncy5zZXQod3MgYXMgb2JqZWN0LCBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSlcbiAgICAgICAgaG9va3Mub3Blbj8uKHdzKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBvcGVuZWQnKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbWVzc2FnZSh3cywgbWVzc2FnZSkge1xuICAgICAgICBob29rcy5tZXNzYWdlPy4od3MsIG1lc3NhZ2UpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG1lc3NhZ2UnLCB7XG4gICAgICAgICAgICBwYXlsb2FkVHlwZTogdHlwZW9mIG1lc3NhZ2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2xvc2Uod3MpIHtcbiAgICAgICAgaG9va3MuY2xvc2U/Lih3cylcbiAgICAgICAgaWYgKG9wdGlvbnMuY29uZmlnPy5kaXNhYmxlV2ViU29ja2V0TG9nZ2luZyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxvZ1dzKCdJTkZPJywgd3MsIHBhdGgsICdXZWJTb2NrZXQgY2xvc2VkJylcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0U3RvcmUuY2xlYXJDb250ZXh0KHdzIGFzIG9iamVjdClcbiAgICAgICAgd3NUaW1pbmdzLmRlbGV0ZSh3cyBhcyBvYmplY3QpXG4gICAgICB9XG4gICAgfSkgYXMgVEhvb2tzXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxpQkFBUyxnQkNJVCxJQUFNLEdBQXFFLENBQ3pFLElBQUssQ0FDSCxtQkFBb0IsR0FDcEIscUJBQXNCLFNBQ3RCLFVBQVcsR0FDWCxnQkFBaUIsR0FDakIsS0FBTSxDQUNKLFlBQWEsRUFDZixDQUNGLEVBQ0EsS0FBTSxDQUNKLG1CQUFvQixHQUNwQixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLFdBQVksR0FDWixVQUFXLEdBQ1gsS0FBTSxDQUNKLFlBQWEsRUFDZixDQUNGLEVBQ0EsS0FBTSxDQUNKLG1CQUFvQixHQUNwQixVQUFXLEdBQ1gsZ0JBQWlCLEdBQ2pCLEtBQU0sQ0FDSixZQUFhLEVBQ2YsQ0FDRixDQUNGLEVBRU0sR0FBYyxDQUNsQixFQUNBLElBQ21DLENBQ25DLEdBQUksQ0FBQyxFQUNILE9BQU8sRUFHVCxJQUFNLEVBQXlDLElBQUssS0FBUyxDQUFTLEVBRXRFLEdBQUksRUFBSyxNQUFRLEVBQVMsS0FDeEIsRUFBTyxLQUFPLElBQ1QsRUFBSyxRQUNMLEVBQVMsUUFDUixFQUFLLE1BQU0sY0FBZ0IsUUFDL0IsRUFBUyxNQUFNLGNBQWdCLE9BQzNCLENBQ0UsWUFBYSxFQUFTLE1BQU0sYUFBZSxFQUFLLE1BQU0sV0FDeEQsRUFDQSxDQUFDLENBQ1AsRUFHRixHQUFJLEVBQUssV0FBYSxFQUFTLFVBQzdCLEVBQU8sVUFBWSxJQUNkLEVBQUssYUFDTCxFQUFTLFNBQ2QsRUFHRixHQUFJLEVBQUssYUFBZSxFQUFTLFlBQy9CLEVBQU8sWUFBYyxJQUNoQixFQUFLLGVBQ0wsRUFBUyxXQUNkLEVBR0YsR0FBSSxFQUFLLFdBQWEsRUFBUyxVQUM3QixFQUFPLFVBQVksSUFDZCxFQUFLLGFBQ0wsRUFBUyxTQUNkLEVBR0YsT0FBTyxHQUlJLEVBQWlCLENBQUMsRUFBbUIsQ0FBQyxJQUFlLENBQ2hFLElBQU0sRUFBUyxFQUFRLE9BQ3ZCLEdBQUksQ0FBQyxFQUNILE9BQU8sRUFHVCxJQUFNLEVBQWUsR0FBZ0IsR0FDckMsTUFBTyxJQUNGLEVBQ0gsT0FBUSxHQUFZLEVBQWMsRUFBUSxNQUFNLENBQ2xELEdDbkZLLElBQU0sRUFBNEIsSUFBMkIsQ0FDbEUsSUFBTSxFQUFPLElBQUksUUFFWCxFQUFjLENBQUMsSUFBNkMsQ0FDaEUsSUFBSSxFQUFNLEVBQUssSUFBSSxDQUFHLEVBQ3RCLEdBQUksQ0FBQyxFQUNILEVBQU0sQ0FBQyxFQUNQLEVBQUssSUFBSSxFQUFLLENBQUcsRUFFbkIsT0FBTyxHQUdULE1BQU8sQ0FDTCxZQUFZLENBQUMsRUFBSyxFQUFTLENBQ3pCLEdBQUksT0FBTyxLQUFLLENBQU8sRUFBRSxTQUFXLEVBQ2xDLE9BRUYsSUFBTSxFQUFNLEVBQVksQ0FBRyxFQUMzQixPQUFPLE9BQU8sRUFBSyxDQUFPLEdBRTVCLFVBQVUsQ0FBQyxFQUFLLENBQ2QsSUFBTSxFQUFNLEVBQUssSUFBSSxDQUFHLEVBQ3hCLE9BQU8sRUFBTSxJQUFLLENBQUksRUFBSSxDQUFDLEdBRTdCLFlBQVksQ0FBQyxFQUFLLENBQ2hCLEVBQUssT0FBTyxDQUFHLEVBRW5CLEdBSVcsRUFBc0IsQ0FDakMsRUFDQSxJQUM0QixDQUM1QixJQUFNLEVBQVcsRUFBSyxRQUNoQixFQUFpQixPQUFPLEtBQUssQ0FBVyxFQUFFLE9BQVMsRUFDbkQsRUFDSixJQUFhLFFBQ2IsSUFBYSxNQUNiLE9BQU8sSUFBYSxVQUNwQixDQUFDLE1BQU0sUUFBUSxDQUFRLEdBQ3ZCLE9BQU8sS0FBSyxDQUFrQixFQUFFLE9BQVMsRUFFM0MsR0FBSSxFQUFFLEdBQWtCLEdBQ3RCLE9BQU8sRUFHVCxJQUFNLEVBQWdCLElBQ2pCLEtBQ0MsRUFBZSxFQUF1QyxDQUFDLENBQzdELEVBRUEsTUFBTyxJQUFLLEVBQU0sUUFBUyxDQUFjLEdDOUQzQyw0QkFBUywwQkFHRixJQUFNLEdBQ1gsSUFBSSxHQUVBLEdBQW1DLENBQ3ZDLE1BQU8sSUFBRyxDQUFHLFFBQ2IsS0FBTSxJQUFHLENBQUcsUUFDWixLQUFNLElBQUcsQ0FBRyxRQUNaLE1BQU8sSUFBRyxDQUFHLFFBQ2IsYUFBYyxJQUFHLENBQUcsT0FDdEIsRUFFYSxHQUFZLElBQ3ZCLEdBQWMsU0FBUyxHQUFLLEdDZjlCLHdCQUFTLHFCQUVULElBQU0sSUFBbUMsSUFBTSxDQUM3QyxHQUFJLENBRUYsT0FEZ0IsR0FBYyxZQUFZLEdBQUcsRUFDOUIscUJBQXFCLEVBQ3BDLEtBQU0sQ0FDTixNQUFPLENBQUMsS0FFVCxFQUVHLElBQXVDLElBQU0sQ0FDakQsR0FBSSxDQUVGLE9BRGdCLEdBQWMsWUFBWSxHQUFHLEVBQzlCLG9CQUFvQixFQUNuQyxLQUFNLENBQ04sTUFBTyxDQUFDLEtBRVQsRUFFRyxHQUFhLENBQUMsRUFBYyxJQUEwQixDQUMxRCxHQUFJLEVBQUssUUFBVSxFQUNqQixPQUFPLEVBQUssTUFBTSxFQUFHLENBQUssRUFHNUIsSUFBTSxFQUFPLEtBQUssT0FBTyxFQUFRLEVBQUssUUFBVSxDQUFDLEVBQzNDLEVBQVEsRUFBUSxFQUFLLE9BQVMsRUFDcEMsTUFBTyxHQUFHLElBQUksT0FBTyxDQUFJLElBQUksSUFBTyxJQUFJLE9BQU8sQ0FBSyxLQVd6QyxHQUFlLENBQzFCLEVBQ0EsSUFDVyxDQUNYLElBQU0sRUFBVSxHQUFVLFFBQ3BCLEVBQWMsRUFBVSxXQUFXLElBQVksU0FFL0MsRUFBa0IsQ0FDdEIsQ0FBRSxLQUFNLE9BQVEsRUFDaEIsQ0FBRSxLQUFNLFNBQVUsS0FBTSxDQUFZLEVBQ3BDLENBQUUsS0FBTSxPQUFRLEVBQ2hCLENBQUUsS0FBTSxPQUFRLEtBQU0sQ0FBZSxDQUN2QyxFQUNBLEdBQUksRUFDRixFQUFLLEtBQUssQ0FBRSxLQUFNLE9BQVEsS0FBTSxDQUFlLENBQUMsRUFFbEQsRUFBSyxLQUFLLENBQUUsS0FBTSxPQUFRLENBQUMsRUFPM0IsSUFBTSxFQUxlLEtBQUssSUFDeEIsRUFBWSxPQUNaLEVBQWUsT0FDZixHQUFJLEVBQWlCLENBQUMsRUFBZSxNQUFNLEVBQUksQ0FBQyxDQUFDLENBQ25ELEVBQ2tDLEVBRTVCLEVBQU0sSUFBRyxJQUFJLE9BQU8sQ0FBVSxLQUM5QixFQUFNLElBQUcsSUFBSSxPQUFPLENBQVUsS0FDOUIsRUFBVyxJQUFHLElBQUksT0FBTyxDQUFVLEtBRW5DLEVBQWdCLENBQUMsQ0FBRyxFQUMxQixRQUFXLEtBQU8sRUFBTSxDQUN0QixHQUFJLEVBQUksT0FBUyxRQUFTLENBQ3hCLEVBQUksS0FBSyxDQUFRLEVBQ2pCLFNBRUYsR0FBSSxFQUFJLE9BQVMsU0FBVSxDQUN6QixFQUFJLEtBQUssSUFBRyxHQUFXLEVBQUksS0FBTSxDQUFVLElBQUksRUFDL0MsU0FFRixJQUFNLEVBQU8sRUFBSSxLQUNYLEVBQVUsS0FBSyxJQUFJLEVBQUcsRUFBYSxFQUFLLE9BQVMsQ0FBQyxFQUN4RCxFQUFJLEtBQUssTUFBSyxJQUFPLElBQUksT0FBTyxDQUFPLE1BQU0sRUFHL0MsT0FEQSxFQUFJLEtBQUssQ0FBRyxFQUNMLEVBQUksS0FBSztBQUFBLENBQUksR0FHVCxHQUEyQixJQUFxQixDQUMzRCxJQUFNLEVBQUksR0FBYyxRQUN4QixHQUFJLENBQUMsRUFDSCxPQUFPLEtBRVQsTUFBTyxvQkFBb0IsS0N2RnRCLElBQU0sR0FBYyxDQUN6QixFQUNBLElBQ1MsQ0FFVCxHQUFJLEVBRHVCLEVBQVEsUUFBUSxvQkFBc0IsSUFFL0QsT0FHRixJQUFRLE9BQU0sV0FBVSxZQUFhLEVBQ3JDLEdBQUksSUFBUyxRQUFhLENBQUMsR0FBWSxDQUFDLEVBQ3RDLE9BR0YsSUFBTSxFQUFNLEdBQUcsT0FBYyxLQUFZLElBQ25DLEVBQVUscUNBQTBCLElBQ3BDLEVBQWlCLGlCQUFNLElBRzdCLElBRGUsRUFBUSxRQUFRLHNCQUF3QixZQUN4QyxTQUFVLENBQ3ZCLFFBQVEsSUFBSSxDQUFPLEVBQ25CLE9BR0YsUUFBUSxJQUFJLEdBQWEsRUFBZ0IsR0FBeUIsQ0FBQyxDQUFDLEdDM0J0RSxxQkFDQSw0QkNTTyxJQUFNLEVBQWtCLElBQzFCLElBR00sQ0FDVCxJQUFNLEVBQ0osT0FBTyxFQUFLLEtBQU8sU0FDZixDQUNFLE1BQU8sRUFBSyxHQUNaLFFBQVMsRUFBSyxHQUNkLEtBQU0sRUFBSyxHQUNYLE1BQU8sRUFBSyxHQUNaLFFBQVMsRUFBSyxFQUNoQixFQUNBLEVBQUssSUFFSCxRQUFPLFVBQVMsT0FBTSxRQUFPLFdBQVksRUFDM0MsRUFBYSxFQUFRLFFBQVEsWUFBYyxDQUFDLEVBQ2xELEdBQUksRUFBVyxTQUFXLEVBQ3hCLE9BR0YsSUFBTSxFQUFVLE9BQU8sRUFBSyxVQUFZLFNBQVcsRUFBSyxRQUFVLEdBQzVELEVBQWdDLENBQ3BDLFFBQVMsQ0FDUCxPQUFRLEVBQVEsT0FDaEIsSUFBSyxFQUFRLEdBQ2YsS0FDRyxFQUNILFdBQVksRUFBTSxVQUNwQixFQUVBLFFBQVcsS0FBYSxFQUN0QixHQUFJLENBQ0YsSUFBTSxFQUFTLEVBQVUsSUFBSSxFQUFPLEVBQVMsQ0FBSSxFQUNqRCxHQUNFLEdBQ0EsT0FBUSxFQUErQixRQUFVLFdBRS9DLEVBQXlCLE1BQU0sSUFBTSxFQUV0QyxFQUVILEtBQU0sSUNyRFoscUJBQVMsMEJBQ1Qsa0JBQVMsbUJDRFQsbUJBQVMsaUJBRUYsSUFBTSxHQUFZLE1BQU8sSUFBbUMsQ0FDakUsTUFBTSxHQUFHLE1BQU0sRUFBUyxDQUFFLFVBQVcsRUFBSyxDQUFDLEdDSDdDLG1CQUFTLGdCQUNULG9CQUFTLG1CQUNULGVBQVMsbUJDRlQsbUJBQVMsaUJBQ1QsbUJBQVMsY0FBVSxtQkFFbkIsSUFBTSxHQUFhLHFDQUNiLEdBQWlCLGtCQUNqQixHQUNKLHdFQUVXLEdBQVksQ0FBQyxJQUFtQyxDQUMzRCxHQUFJLE9BQU8sSUFBVSxTQUNuQixPQUFPLEVBR1QsSUFBTSxFQUFVLEVBQU0sS0FBSyxFQUNyQixFQUFXLE9BQU8sQ0FBTyxFQUMvQixHQUFJLE9BQU8sU0FBUyxDQUFRLEVBQzFCLE9BQU8sRUFHVCxJQUFNLEVBQVEsRUFBUSxNQUFNLEVBQVUsRUFDdEMsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLHdCQUF3QixHQUFPLEVBR2pELElBQU0sRUFBUyxPQUFPLEVBQU0sRUFBRSxFQUN4QixFQUFPLEVBQU0sR0FBRyxZQUFZLEVBRTlCLEVBQU8sS0FDWCxHQUFJLEVBQUssV0FBVyxHQUFHLEVBQ3JCLEVBQU8sUUFDRixRQUFJLEVBQUssV0FBVyxHQUFHLEVBQzVCLEVBQU8sV0FHVCxPQUFPLEtBQUssTUFBTSxFQUFTLENBQUksR0FHcEIsR0FBZ0IsQ0FBQyxJQUEwQixDQUN0RCxJQUFNLEVBQVEsRUFBTSxLQUFLLEVBQUUsTUFBTSxFQUFjLEVBQy9DLEdBQUksQ0FBQyxFQUNILE1BQVUsTUFBTSw0QkFBNEIsR0FBTyxFQUdyRCxJQUFNLEVBQVMsT0FBTyxFQUFNLEVBQUUsRUFDeEIsRUFBTyxFQUFNLEdBQUcsWUFBWSxFQUU5QixFQUFLLFFBQ1QsR0FBSSxJQUFTLElBQ1gsRUFBSyxTQUNBLFFBQUksSUFBUyxJQUNsQixFQUFLLFVBR1AsT0FBTyxFQUFTLEdBR0wsR0FBaUIsQ0FDNUIsSUFDOEMsQ0FDOUMsR0FBSSxPQUFPLElBQVUsU0FDbkIsTUFBTyxDQUFFLEtBQU0sUUFBUyxPQUFNLEVBRWhDLE1BQU8sQ0FBRSxLQUFNLE9BQVEsTUFBTyxHQUFjLENBQUssQ0FBRSxHQUd4QyxHQUFxQixNQUNoQyxFQUNBLElBQ3FCLENBQ3JCLEdBQUksQ0FFRixPQURhLE1BQU0sR0FBRyxLQUFLLENBQVEsR0FDdkIsS0FBTyxFQUNuQixLQUFNLENBQ04sTUFBTyxLQUlFLEdBQWtCLE1BQU8sSUFBd0MsQ0FDNUUsSUFBTSxFQUFNLEdBQVEsQ0FBUSxFQUN0QixFQUFPLEdBQVMsQ0FBUSxFQUUxQixFQUNKLEdBQUksQ0FDRixFQUFVLE1BQU0sR0FBRyxRQUFRLENBQUcsRUFDOUIsS0FBTSxDQUNOLE1BQU8sQ0FBQyxFQUdWLE9BQU8sRUFDSixPQUFPLEtBQVEsRUFBSyxXQUFXLEdBQUcsSUFBTyxHQUFLLEdBQWMsS0FBSyxDQUFJLENBQUMsRUFDdEUsSUFBSSxLQUFRLEdBQUcsS0FBTyxHQUFNLEdEL0VqQyxJQUFNLEdBQVksR0FBVSxFQUFJLEVBRzFCLEVBQW1CLElBQUksSUFFdkIsR0FBeUIsQ0FBQyxJQUEwQyxDQUN4RSxJQUFNLEVBQVEsRUFBaUIsSUFBSSxDQUFRLEdBQUssUUFBUSxRQUFRLEVBRTVELEVBQ0UsRUFBVSxJQUFJLFFBQWMsS0FBVyxDQUMzQyxFQUFjLEVBQ2YsRUFFRCxPQUFPLEVBQU0sS0FBSyxJQUFNLENBS3RCLE9BSEEsRUFBaUIsSUFBSSxFQUFVLENBQU8sRUFHL0IsSUFBTSxDQUVYLEdBREEsSUFBYyxFQUNWLEVBQWlCLElBQUksQ0FBUSxJQUFNLEVBQ3JDLEVBQWlCLE9BQU8sQ0FBUSxHQUdyQyxHQUdHLEVBQU8sQ0FBQyxJQUEwQixPQUFPLENBQUssRUFBRSxTQUFTLEVBQUcsR0FBRyxFQUV4RCxHQUFxQixDQUFDLEVBQWtCLElBQXVCLENBQzFFLElBQU0sRUFBTyxFQUFLLFlBQVksRUFDeEIsRUFBSyxFQUFLLEVBQUssU0FBUyxFQUFJLENBQUMsRUFDN0IsRUFBSyxFQUFLLEVBQUssUUFBUSxDQUFDLEVBQ3hCLEVBQUssRUFBSyxFQUFLLFNBQVMsQ0FBQyxFQUN6QixFQUFLLEVBQUssRUFBSyxXQUFXLENBQUMsRUFDM0IsRUFBSyxFQUFLLEVBQUssV0FBVyxDQUFDLEVBQzNCLEVBQU0sT0FBTyxFQUFLLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFDMUQsTUFBTyxHQUFHLEtBQVksS0FBUSxLQUFNLEtBQU0sS0FBTSxLQUFNLEtBQU0sS0FHakQsR0FBYSxNQUFPLElBQXNDLENBQ3JFLEdBQUksQ0FFRixJQURhLE1BQU0sRUFBRyxLQUFLLENBQVEsR0FDMUIsT0FBUyxFQUNoQixNQUFPLEdBRVQsS0FBTSxDQUNOLE1BQU8sR0FJVCxJQUFNLEVBQVUsR0FESSxHQUFtQixFQUFVLElBQUksSUFBTSxLQUN6QixRQUFRLE9BQU8sT0FBTyxJQUV4RCxPQURBLE1BQU0sRUFBRyxPQUFPLEVBQVUsQ0FBTyxFQUMxQixHQUdJLEdBQWUsTUFBTyxJQUFvQyxDQUNyRSxJQUFNLEVBQVUsTUFBTSxHQUF1QixDQUFRLEVBQ3JELEdBQUksQ0FFRixHQUFJLENBQ0YsTUFBTSxFQUFHLE9BQU8sQ0FBUSxFQUN4QixLQUFNLENBRU4sT0FHRixJQUFNLEVBQVUsTUFBTSxFQUFHLFNBQVMsQ0FBUSxFQUNwQyxFQUFhLE1BQU0sR0FBVSxDQUFPLEVBQzFDLE1BQU0sRUFBRyxVQUFVLEdBQUcsT0FBZSxDQUFVLEVBQy9DLE1BQU0sRUFBRyxHQUFHLEVBQVUsQ0FBRSxNQUFPLEVBQUssQ0FBQyxFQUNyQyxNQUFPLEVBQU8sQ0FFZCxNQURBLFFBQVEsTUFBTSx3Q0FBd0MsS0FBYSxDQUFLLEVBQ2xFLFNBQ04sQ0FDQSxFQUFRLElBSUMsR0FBZSxNQUMxQixFQUNBLElBQ3FCLENBQ3JCLEdBQUksRUFBTyxVQUFZLE9BQ3JCLE1BQU8sR0FFVCxJQUFNLEVBQVUsR0FBVSxFQUFPLE9BQU8sRUFDeEMsT0FBTyxNQUFNLEdBQW1CLEVBQVUsQ0FBTyxHQUc3QyxHQUFpQixNQUNyQixFQUNBLElBQ2tCLENBQ2xCLElBQU0sRUFBVSxNQUFNLEdBQWdCLENBQVEsRUFDOUMsR0FBSSxFQUFRLFFBQVUsRUFDcEIsT0FTRixJQUFNLEdBTGUsTUFBTSxRQUFRLFdBQ2pDLEVBQVEsSUFBSSxNQUFNLEtBQU0sQ0FBRSxLQUFNLEVBQUcsS0FBTSxNQUFNLEVBQUcsS0FBSyxDQUFDLENBQUUsRUFBRSxDQUM5RCxHQUlHLE9BQ0MsQ0FDRSxJQUlJLEVBQU8sU0FBVyxXQUMxQixFQUNDLElBQUksS0FBVSxFQUFPLEtBQUssRUFFN0IsR0FBSSxFQUFNLFFBQVUsRUFDbEIsT0FHRixFQUFNLEtBQUssQ0FBQyxFQUFHLElBQU0sRUFBRSxLQUFLLFFBQVUsRUFBRSxLQUFLLE9BQU8sRUFDcEQsSUFBTSxFQUFXLEVBQU0sTUFBTSxDQUFRLEdBR2YsTUFBTSxRQUFRLFdBQ2xDLEVBQVMsSUFBSSxFQUFHLFVBQVcsRUFBRyxHQUFHLEVBQU0sQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQ3pELEdBR2MsUUFBUSxDQUFDLEVBQVEsSUFBUSxDQUNyQyxHQUFJLEVBQU8sU0FBVyxXQUNwQixRQUFRLE1BQ04sNkNBQTZDLEVBQVMsR0FBSyxRQUMzRCxFQUFPLE1BQ1QsRUFFSCxHQUdHLEdBQWdCLE1BQ3BCLEVBQ0EsSUFDa0IsQ0FDbEIsSUFBTSxFQUFVLE1BQU0sR0FBZ0IsQ0FBUSxFQUM5QyxHQUFJLEVBQVEsU0FBVyxFQUNyQixPQUdGLElBQU0sRUFBTSxLQUFLLElBQUksRUFtQmYsR0FoQmUsTUFBTSxRQUFRLFdBQ2pDLEVBQVEsSUFBSSxNQUFNLEtBQU0sQ0FBRSxLQUFNLEVBQUcsS0FBTSxNQUFNLEVBQUcsS0FBSyxDQUFDLENBQUUsRUFBRSxDQUM5RCxHQUlHLE9BQ0MsQ0FDRSxJQUlJLEVBQU8sU0FBVyxXQUMxQixFQUNDLElBQUksS0FBVSxFQUFPLEtBQUssRUFFTixPQUFPLEVBQUcsVUFBVyxFQUFNLEVBQUssUUFBVSxDQUFRLEdBR25ELE1BQU0sUUFBUSxXQUNsQyxFQUFTLElBQUksRUFBRyxVQUFXLEVBQUcsR0FBRyxFQUFNLENBQUUsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUN6RCxHQUdjLFFBQVEsQ0FBQyxFQUFRLElBQVEsQ0FDckMsR0FBSSxFQUFPLFNBQVcsV0FDcEIsUUFBUSxNQUNOLHlDQUF5QyxFQUFTLEdBQUssUUFDdkQsRUFBTyxNQUNULEVBRUgsR0FHVSxHQUFrQixNQUM3QixFQUNBLElBQ2tCLENBQ2xCLElBQU0sRUFBVSxNQUFNLEdBQVcsQ0FBUSxFQUN6QyxHQUFJLENBQUMsRUFDSCxPQUlGLEdBRHVCLEVBQU8sV0FBYSxJQUd6QyxJQURhLEVBQU8sYUFBZSxVQUN0QixPQUNYLE1BQU0sR0FBYSxDQUFPLEVBSTlCLEdBQUksRUFBTyxXQUFhLE9BQVcsQ0FDakMsSUFBTSxFQUFZLEdBQWUsRUFBTyxRQUFRLEVBQ2hELEdBQUksRUFBVSxPQUFTLFFBQ3JCLE1BQU0sR0FBZSxFQUFVLEVBQVUsS0FBSyxFQUU5QyxXQUFNLEdBQWMsRUFBVSxFQUFVLEtBQUssSUZuTm5ELElBQU0sRUFBWSxJQUFJLElBRWhCLEdBQWMsQ0FBQyxJQUEwQyxDQUM3RCxJQUFNLEVBQVEsRUFBVSxJQUFJLENBQVEsR0FBSyxRQUFRLFFBQVEsRUFFckQsRUFDRSxFQUFVLElBQUksUUFBYyxLQUFXLENBQzNDLEVBQWMsRUFDZixFQUVELE9BQU8sRUFBTSxLQUFLLElBQU0sQ0FLdEIsT0FIQSxFQUFVLElBQUksRUFBVSxDQUFPLEVBR3hCLElBQU0sQ0FFWCxHQURBLElBQWMsRUFDVixFQUFVLElBQUksQ0FBUSxJQUFNLEVBQzlCLEVBQVUsT0FBTyxDQUFRLEdBRzlCLEdBWVUsRUFBWSxTQUNwQixJQVVlLENBQ2xCLElBQU0sRUFDSixPQUFPLEVBQUssS0FBTyxVQUNkLElBQU0sQ0FDTCxJQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxHQUNFLEVBUUosTUFBTyxDQUNMLFNBQVUsRUFDVixNQUFPLEVBQ1AsUUFBUyxFQUNULEtBQU0sRUFDTixNQUFPLEVBQ1AsUUFBUyxDQUNYLElBQ0MsRUFDSCxFQUFLLElBRUgsV0FBVSxRQUFPLFVBQVMsT0FBTSxRQUFPLFdBQVksRUFDckQsRUFBUyxFQUFRLE9BQ2pCLEVBQW9CLEdBQVEsb0JBQXNCLEdBQ2xELEVBQXFCLEdBQVEscUJBQXVCLEdBQzFELEdBQUksR0FBcUIsRUFDdkIsT0FHRixJQUFNLEVBQVUsT0FBTyxFQUFLLFVBQVksU0FBVyxFQUFLLFFBQVUsR0FDNUQsRUFDSixFQUFNLGFBQWUsT0FBTyxDQUFDLEVBQ3pCLEVBQ0EsT0FBTyxRQUFRLE9BQU8sT0FBTyxFQUFJLEVBQU0sVUFBVSxFQUFJLElBR3ZELEVBQVcsSUFDZixHQUFJLENBQ0YsSUFBUSxTQUFVLEVBQWEsVUFBVyxJQUFJLElBQUksRUFBUSxHQUFHLEVBQzdELEVBQVcsR0FBUSxlQUFpQixHQUFHLElBQWMsSUFBVyxFQUNoRSxLQUFNLENBRU4sRUFBVyxFQUFRLElBR3JCLElBQU0sRUFBTyxHQUFHLEtBQVMsRUFBVyxRQUFRLENBQUMsT0FBTyxFQUFRLFVBQVUsS0FBWTtBQUFBLEVBRzVFLEVBQWMsTUFBTSxHQUFZLENBQVEsRUFFOUMsR0FBSSxDQUNGLEdBQUksQ0FDRixNQUFNLEdBQVUsR0FBUSxDQUFRLENBQUMsRUFDakMsTUFBTSxHQUFXLEVBQVUsRUFBTSxDQUFFLFNBQVUsT0FBUSxDQUFDLEVBQ3RELE1BQU8sRUFBTyxDQU1kLE1BSkEsUUFBUSxNQUNOLDRDQUE0QyxLQUM1QyxDQUNGLEVBQ00sRUFHUixJQUFNLEVBQVcsR0FBUSxZQUN6QixHQUFJLENBQUMsRUFDSCxPQUlGLEdBRGUsTUFBTSxHQUFhLEVBQVUsQ0FBUSxFQUVsRCxHQUFJLENBQ0YsTUFBTSxHQUFnQixFQUFVLENBQVEsRUFDeEMsTUFBTyxFQUFPLENBRWQsUUFBUSxNQUNOLDBDQUEwQyxLQUMxQyxDQUNGLFVBR0osQ0FFQSxFQUFZLElJN0loQixJQUFNLEdBQ0osK0RBQ0ksR0FBYSwrQkFFYixHQUE4QiwyQkFDOUIsR0FBWSx3REFhbEIsSUFBTSxHQUE0QixDQUFDLElBQ2pDLEVBQWEsQ0FBSyxFQUFFLFdBVEEsYUFNRSxVQUd1QyxFQUd6RCxHQUFtQixDQUFDLElBQThCLENBQ3RELEdBQUksQ0FDRixJQUFNLEVBQUksSUFBSSxJQUFJLENBQVMsRUFDM0IsR0FBSSxFQUFFLFdBQWEsR0FDakIsRUFBRSxTQUFXLEdBQTBCLEVBQUUsUUFBUSxFQUVuRCxHQUFJLEVBQUUsV0FBYSxHQUNqQixFQUFFLFNBQVcsR0FBMEIsRUFBRSxRQUFRLEVBTW5ELE9BSkEsRUFBRSxTQUFXLEdBQTBCLEVBQUUsUUFBUSxFQUNqRCxFQUFFLFNBQVcsRUFBYSxFQUFFLFFBQVEsRUFDcEMsRUFBRSxPQUFTLEVBQWEsRUFBRSxNQUFNLEVBQ2hDLEVBQUUsS0FBTyxFQUFhLEVBQUUsSUFBSSxFQUNyQixFQUFFLFNBQVMsRUFDbEIsS0FBTSxDQUNOLE9BQU8sRUFBYSxDQUFTLEVBQUUsV0EzQmIsYUFNRSxVQXFCb0QsSUFLdEUsR0FBYSxDQUFDLElBQTRCLENBQzlDLEdBQUksRUFBTyxPQXBDTyxJQW9DaUIsRUFBTyxPQW5DeEIsR0FvQ2hCLE1BQU8sR0FHVCxJQUFJLEVBQU0sRUFDTixFQUFZLEdBRWhCLFFBQVMsRUFBSSxFQUFPLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFBSyxDQUMzQyxJQUFNLEVBQU8sRUFBTyxXQUFXLENBQUMsRUFDaEMsR0FBSSxFQUFPLElBQU0sRUFBTyxHQUN0QixNQUFPLEdBRVQsSUFBSSxFQUFJLEVBQU8sR0FDZixHQUFJLEdBRUYsR0FEQSxHQUFLLEVBQ0QsRUFBSSxFQUNOLEdBQUssRUFHVCxHQUFPLEVBQ1AsRUFBWSxDQUFDLEVBR2YsT0FBTyxFQUFNLEtBQU8sR0FHaEIsR0FBNkIsQ0FBQyxJQUNsQyxFQUFLLFFBQVEsR0FBNkIsS0FBUyxDQUNqRCxJQUFNLEVBQVMsRUFBTSxRQUFRLE1BQU8sRUFBRSxFQUN0QyxHQUNFLEVBQU8sUUFsRU8sSUFtRWQsRUFBTyxRQWxFTyxJQW1FZCxHQUFXLENBQU0sRUFFakIsTUFuRWdCLGFBcUVsQixPQUFPLEVBQ1IsRUFFVSxFQUFlLENBQUMsSUFBeUIsQ0FDcEQsSUFBSSxFQUFTLEVBT2IsT0FMQSxFQUFTLEVBQU8sUUFBUSxHQTNFSixZQTJFOEIsRUFDbEQsRUFBUyxFQUFPLFFBQVEsR0E1RUosWUE0RTZCLEVBQ2pELEVBQVMsR0FBMkIsQ0FBTSxFQUMxQyxFQUFTLEVBQU8sUUFBUSxHQTlFSixZQThFNEIsRUFFekMsR0FHSCxHQUFtQixDQUN2QixFQUNBLElBQ29DLENBQ3BDLElBQU0sRUFBa0IsRUFBYSxFQUFjLE9BQU8sRUFDcEQsRUFBUSxPQUFPLGVBQWUsQ0FBYSxFQUMzQyxFQUFXLE9BQU8sT0FBTyxDQUFLLEVBS3BDLEdBSEEsRUFBUyxRQUFVLEVBQ25CLEVBQVMsS0FBTyxFQUFjLEtBRTFCLEVBQWMsUUFBVSxPQUMxQixFQUFTLE1BQVEsRUFBYSxFQUFjLEtBQUssRUFHbkQsSUFBTSxFQUFjLEVBRXBCLFFBQVcsS0FBTyxPQUFPLEtBQUssQ0FBVyxFQUN2QyxHQUFJLElBQVEsV0FBYSxJQUFRLFFBQVUsSUFBUSxRQUNqRCxFQUFTLEdBQU8sRUFBWSxFQUFZLEdBQU0sQ0FBVSxFQUk1RCxPQUFPLEdBR0gsR0FBbUIsQ0FDdkIsRUFDQSxJQUNjLENBQ2QsSUFBTSxFQUEyQixNQUFNLEtBQUssQ0FBRSxPQUFRLEVBQU0sTUFBTyxDQUFDLEVBQ3BFLFFBQVMsRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLElBQ2hDLEVBQWMsR0FBSyxFQUFZLEVBQU0sR0FBSSxDQUFVLEVBRXJELE9BQU8sR0FHSCxHQUFzQixDQUMxQixFQUNBLElBQzRCLENBQzVCLElBQU0sRUFBMEMsQ0FBQyxFQUNqRCxRQUFXLEtBQU8sT0FBTyxLQUFLLENBQVcsRUFDdkMsRUFBZSxHQUFPLEVBQVksRUFBWSxHQUFNLENBQVUsRUFFaEUsT0FBTyxHQUdILEdBQXNCLENBQzFCLEVBQ0EsRUFDQSxJQUNNLENBQ04sRUFBVyxJQUFJLENBQUcsRUFDbEIsR0FBSSxDQUNGLE9BQU8sRUFBSSxTQUNYLENBQ0EsRUFBVyxPQUFPLENBQUcsSUFJbkIsRUFBYyxDQUFJLEVBQVUsSUFBbUMsQ0FDbkUsR0FBSSxJQUFVLE1BQVEsSUFBVSxPQUM5QixPQUFPLEVBR1QsR0FBSSxPQUFPLElBQVUsU0FDbkIsT0FBTyxFQUFhLENBQUssRUFJM0IsR0FEYSxPQUFPLElBQ1AsU0FDWCxPQUFPLEVBR1QsR0FBSSxhQUFpQixLQUNuQixPQUFPLElBQUksS0FBSyxFQUFNLFFBQVEsQ0FBQyxFQUdqQyxJQUFNLEVBQU0sRUFDWixHQUFJLEVBQVcsSUFBSSxDQUFHLEVBQ3BCLE1BbktpQixhQXNLbkIsR0FBSSxhQUFpQixNQUNuQixPQUFPLEdBQW9CLEVBQUssRUFBWSxJQUMxQyxHQUFpQixFQUFPLENBQVUsQ0FDcEMsRUFHRixHQUFJLE1BQU0sUUFBUSxDQUFLLEVBQ3JCLE9BQU8sR0FBb0IsRUFBSyxFQUFZLElBQzFDLEdBQWlCLEVBQU8sQ0FBVSxDQUNwQyxFQUdGLE9BQU8sR0FBb0IsRUFBSyxFQUFZLElBQzFDLEdBQW9CLEVBQWtDLENBQVUsQ0FDbEUsR0FHVyxFQUFTLENBQUksSUFBZ0IsRUFBWSxFQUFPLElBQUksT0FBUyxFQVE3RCxFQUFnQixDQUFDLElBQThCLENBQzFELElBQU0sRUFBYyxHQUFpQixFQUFRLEdBQUcsRUFDMUMsRUFBYyxJQUFJLFFBQ3BCLEVBQWlCLEdBRXJCLFFBQVksRUFBTSxLQUFVLEVBQVEsUUFBUSxRQUFRLEVBQUcsQ0FDckQsSUFBTSxFQUFXLEVBQWEsQ0FBSyxFQUNuQyxHQUFJLElBQWEsRUFDZixFQUFpQixHQUVuQixFQUFZLElBQUksRUFBTSxDQUFRLEVBR2hDLElBQU0sRUFBaUIsRUFBYSxFQUFRLE1BQU0sRUFDNUMsRUFBYSxJQUFnQixFQUFRLElBQ3JDLEVBQWdCLElBQW1CLEVBQVEsT0FFakQsR0FBSSxFQUFFLEdBQWMsR0FBa0IsR0FDcEMsT0FBTyxFQUdULElBQU0sRUFBb0IsQ0FDeEIsT0FBUSxFQUNSLFFBQVMsRUFDVCxTQUFVLEVBQVEsU0FDbEIsT0FBUSxFQUFRLE1BQ2xCLEVBRUEsT0FBTyxJQUFJLFFBQVEsRUFBYSxDQUFJLEdDdk90Qyx1QkFBUyxtQkFDVCxxQkNEQSxvQkFBUyxnQkFFVCxJQUFNLEdBQWMsUUFDZCxHQUFhLFNBQ2IsR0FBbUIscUJBQ25CLEdBQW1CLHVCQUNuQixHQUFjLFFBQ2QsR0FBbUIsZ0JBQ25CLEdBQWEsT0FFYixHQUFzQixDQUFDLElBQTBCLENBS3JELElBQU0sRUFBVSxFQUFNLEtBQUssRUFDM0IsR0FBSSxDQUFDLEVBQ0gsTUFBTyxHQUdULE9BQU8sRUFDSixRQUFRLEdBQVksR0FBRyxFQUN2QixRQUFRLEdBQWtCLE9BQU8sRUFDakMsUUFBUSxHQUFrQixPQUFPLEVBQ2pDLFFBQVEsR0FBYSxFQUFFLEVBQ3ZCLFlBQVksRUFDWixRQUFRLEdBQWtCLEdBQUcsRUFDN0IsUUFBUSxHQUFZLEdBQUcsRUFDdkIsS0FBSyxHQUdKLElBQTZCLElBQU0sQ0FDdkMsSUFBTSxFQUFNLElBQUksSUFFaEIsUUFBWSxFQUFNLEtBQVMsT0FBTyxRQUFRLEVBQVMsRUFDakQsRUFBSSxJQUFJLEdBQW9CLENBQUksRUFBRyxDQUFJLEVBR3pDLE9BQU8sSUFDTixFQUVVLEdBQWdCLENBQUMsSUFBMkIsQ0FDdkQsR0FBSSxPQUFPLElBQVUsVUFBWSxPQUFPLFNBQVMsQ0FBSyxFQUNwRCxPQUFPLEVBR1QsR0FBSSxPQUFPLElBQVUsU0FBVSxDQUM3QixJQUFNLEVBQVUsRUFBTSxLQUFLLEVBQzNCLEdBQUksR0FBWSxLQUFLLENBQU8sRUFDMUIsT0FBTyxPQUFPLENBQU8sRUFJdkIsT0FEYyxHQUEwQixJQUFJLEdBQW9CLENBQU8sQ0FBQyxHQUN4RCxJQUdsQixNQUFPLE1DeERGLElBQU0sRUFBYSxDQUFDLElBQTJCLENBQ3BELElBQUksRUFBVSxvQkFFZCxHQUFJLGFBQWlCLE1BQ25CLEVBQVUsRUFBTSxRQUNYLFFBQUksR0FBUyxPQUFPLElBQVUsVUFBWSxZQUFhLEVBQzVELEVBQVUsRUFBTSxRQUVoQixPQUFVLE9BQU8sQ0FBSyxFQUd4QixPQUFPLEdBVUksR0FBb0IsQ0FDL0IsSUFFQSxPQUFPLElBQVUsVUFDakIsSUFBVSxRQUNULFFBQVMsS0FBUyxRQUFTLEtBQVMsU0FBVSxLQUFTLGFBQWMsSUZkeEUsSUFBTSxFQUFPLENBQUMsSUFBMEIsT0FBTyxDQUFLLEVBQUUsU0FBUyxFQUFHLEdBQUcsRUFDL0QsR0FBTyxDQUFDLElBQTBCLE9BQU8sQ0FBSyxFQUFFLFNBQVMsRUFBRyxHQUFHLEVBRS9ELEdBQWtCLElBQ2xCLEdBQXVCLEtBQ3ZCLEdBQWEsRUFFYixHQUNKLGlGQUVJLEdBQ0osK0hBT0ksR0FBa0IsQ0FBQyxJQUE4QixDQUVyRCxJQUFNLEVBRFMsRUFBUSxRQUNTLFdBQWEsR0FHdkMsRUFBUSxPQUFPLFFBQVksS0FBZSxRQUFRLFFBQVEsUUFBVSxHQUMxRSxPQUFPLEdBQW1CLEdBR3RCLEdBQWtCLENBQUMsRUFBWSxJQUE2QixDQUNoRSxHQUFJLENBQUMsRUFDSCxPQUFPLEVBQUssWUFBWSxFQUcxQixJQUFNLEVBQU8sT0FBTyxFQUFLLFlBQVksQ0FBQyxFQUNoQyxFQUFLLEVBQUssRUFBSyxTQUFTLEVBQUksQ0FBQyxFQUM3QixFQUFLLEVBQUssRUFBSyxRQUFRLENBQUMsRUFDeEIsRUFBSyxFQUFLLEVBQUssU0FBUyxDQUFDLEVBQ3pCLEVBQUssRUFBSyxFQUFLLFdBQVcsQ0FBQyxFQUMzQixFQUFLLEVBQUssRUFBSyxXQUFXLENBQUMsRUFDM0IsRUFBTSxHQUFLLEVBQUssZ0JBQWdCLENBQUMsRUFFdkMsT0FBTyxFQUNKLFdBQVcsT0FBUSxDQUFJLEVBQ3ZCLFdBQVcsS0FBTSxDQUFFLEVBQ25CLFdBQVcsS0FBTSxDQUFFLEVBQ25CLFdBQVcsS0FBTSxDQUFFLEVBQ25CLFdBQVcsS0FBTSxDQUFFLEVBQ25CLFdBQVcsS0FBTSxDQUFFLEVBQ25CLFdBQVcsTUFBTyxDQUFHLEdBSXBCLEdBQVEsQ0FBQyxJQUFpQyxDQUM5QyxJQUFNLEVBQVksRUFBUSxRQUFRLElBQUksaUJBQWlCLEVBQ3ZELEdBQUksRUFDRixPQUFPLEVBQVUsTUFBTSxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUssR0FFNUMsT0FBTyxFQUFRLFFBQVEsSUFBSSxXQUFXLEdBQUssSUFHaEMsR0FBaUIsQ0FBQyxJQUF1QixDQUNwRCxHQUFJLEdBQU0sS0FBTSxDQUNkLElBQU0sRUFBTSxFQUFLLEtBQ2pCLEdBQUksR0FBTyxHQUNULE1BQU8sR0FBRyxLQUFLLE1BQU0sQ0FBRyxLQUUxQixJQUFNLEVBQWEsRUFBSSxRQUFRLENBQUMsRUFDaEMsT0FBTyxFQUFXLFNBQVMsSUFBSSxFQUFJLEdBQUcsS0FBSyxNQUFNLENBQUcsS0FBTyxHQUFHLEtBRWhFLEdBQUksRUFBSyxHQUFLLEVBQUssRUFDakIsTUFBTyxHQUFHLEVBQUcsUUFBUSxDQUFDLE1BRXhCLE1BQU8sR0FBRyxLQUFLLE1BQU0sQ0FBRSxPQUduQixHQUFvQixDQUN4QixJQUN1QyxDQUN2QyxJQUFNLEVBQVMsRUFBUSxPQUN2QixNQUFPLENBQ0wsS0FBTSxHQUFRLGVBQWlCLEdBQy9CLFNBQVUsR0FBUSxtQkFBcUIsRUFDekMsR0FHSSxHQUFvQixDQUN4QixFQUNBLEVBQ0EsSUFDMEMsQ0FDMUMsSUFBTSxFQUFNLEdBQWUsQ0FBRSxHQUNyQixPQUFNLFlBQWEsR0FBa0IsQ0FBTyxFQUM5QyxFQUFhLEdBQU0sRUFFekIsR0FBSSxDQUFDLEVBQ0gsTUFBTyxDQUFFLEtBQU0sRUFBSyxZQUFXLEVBR2pDLElBQUksRUFBVSxFQUNkLEdBQUksRUFBSyxFQUNQLEVBQVUsRUFBTSxNQUFNLENBQUcsRUFDcEIsUUFBSSxFQUFLLEVBQ2QsRUFBVSxFQUFNLE9BQU8sQ0FBRyxFQUUxQixPQUFVLEVBQU0sSUFBSSxLQUFLLENBQUcsRUFHOUIsTUFBTyxDQUFFLEtBQU0sRUFBUyxZQUFXLEdBRy9CLEdBQWdCLENBQUMsRUFBcUIsSUFBK0IsQ0FDekUsR0FBSSxDQUFDLEVBQ0gsTUFBTyxHQUVULElBQU0sRUFBUSxTQUNkLEdBQUksQ0FBQyxFQUNILE1BQU8sSUFBSSxJQUViLE1BQU8sSUFBSSxFQUFNLE9BQU8sQ0FBSyxLQUl6QixHQUFlLENBQUMsRUFBaUIsSUFBK0IsQ0FDcEUsR0FBSSxDQUFDLEVBQ0gsTUFBTyxlQUVULEdBQUksSUFBVSxRQUNaLE9BQU8sRUFBTSxNQUFNLE1BQU0sZ0JBQUssRUFFaEMsR0FBSSxJQUFVLFVBQ1osT0FBTyxFQUFNLFNBQVMsTUFBTSxnQkFBSyxFQUVuQyxHQUFJLElBQVUsUUFDWixPQUFPLEVBQU0sT0FBTyxNQUFNLGdCQUFLLEVBRWpDLE9BQU8sRUFBTSxRQUFRLE1BQU0sZ0JBQUssR0FHNUIsR0FBa0IsQ0FBQyxFQUFpQixJQUErQixDQUN2RSxHQUFJLENBQUMsRUFDSCxPQUFPLEVBR1QsR0FBSSxJQUFVLFFBQ1osT0FBTyxFQUFNLE1BQU0sTUFBTSxDQUFLLEVBRWhDLEdBQUksSUFBVSxVQUNaLE9BQU8sRUFBTSxTQUFTLE1BQU0sQ0FBSyxFQUVuQyxHQUFJLElBQVUsUUFDWixPQUFPLEVBQU0sT0FBTyxNQUFNLENBQUssRUFHakMsT0FBTyxFQUFNLFFBQVEsTUFBTSxDQUFLLEdBRzVCLEdBQW1CLENBQUMsRUFBZ0IsSUFBK0IsQ0FDdkUsR0FBSSxDQUFDLEVBQ0gsT0FBTyxFQUdULElBQU0sRUFBUSxFQUFPLFlBQVksRUFDakMsR0FBSSxJQUFVLE1BQ1osT0FBTyxFQUFNLE1BQU0sS0FBSyxDQUFLLEVBRS9CLEdBQUksSUFBVSxPQUNaLE9BQU8sRUFBTSxLQUFLLEtBQUssQ0FBSyxFQUU5QixHQUFJLElBQVUsTUFDWixPQUFPLEVBQU0sT0FBTyxLQUFLLENBQUssRUFFaEMsR0FBSSxJQUFVLFFBQ1osT0FBTyxFQUFNLGFBQWEsS0FBSyxDQUFLLEVBRXRDLEdBQUksSUFBVSxTQUNaLE9BQU8sRUFBTSxJQUFJLEtBQUssQ0FBSyxFQUU3QixHQUFJLElBQVUsVUFDWixPQUFPLEVBQU0sS0FBSyxLQUFLLENBQUssRUFFOUIsR0FBSSxJQUFVLE9BQ1osT0FBTyxFQUFNLFlBQVksS0FBSyxDQUFLLEVBRXJDLEdBQUksSUFBVSxRQUNaLE9BQU8sRUFBTSxRQUFRLEtBQUssQ0FBSyxFQUVqQyxHQUFJLElBQVUsVUFDWixPQUFPLEVBQU0sV0FBVyxLQUFLLENBQUssRUFHcEMsT0FBTyxFQUFNLE1BQU0sS0FBSyxDQUFLLEdBR3pCLEdBQW1CLENBQUMsRUFBZ0IsSUFBK0IsQ0FDdkUsR0FBSSxDQUFDLEVBQ0gsT0FBTyxFQUdULElBQU0sRUFBVSxPQUFPLFNBQVMsRUFBUSxFQUFFLEVBQzFDLEdBQUksQ0FBQyxPQUFPLFNBQVMsQ0FBTyxFQUMxQixPQUFPLEVBR1QsR0FBSSxHQUFXLElBQ2IsT0FBTyxFQUFNLElBQUksQ0FBTSxFQUV6QixHQUFJLEdBQVcsSUFDYixPQUFPLEVBQU0sT0FBTyxDQUFNLEVBRTVCLEdBQUksR0FBVyxJQUNiLE9BQU8sRUFBTSxLQUFLLENBQU0sRUFFMUIsR0FBSSxHQUFXLElBQ2IsT0FBTyxFQUFNLE1BQU0sQ0FBTSxFQUUzQixPQUFPLEVBQU0sS0FBSyxDQUFNLEdBR3BCLEdBQXNCLENBQUMsRUFBbUIsSUFBK0IsQ0FDN0UsR0FBSSxDQUFDLEVBQ0gsT0FBTyxFQUdULE9BQU8sRUFBTSxLQUFLLENBQVMsR0FHdkIsR0FBcUIsQ0FBQyxFQUFrQixJQUErQixDQUMzRSxHQUFJLENBQUMsRUFDSCxPQUFPLEVBR1QsT0FBTyxFQUFNLFlBQVksQ0FBUSxHQUc3QixHQUFnQixDQUFDLElBQStCLENBRXBELE9BRGEsR0FBYSxJQUNYLElBR1gsR0FBa0IsQ0FBQyxFQUFrQixJQUErQixDQUN4RSxJQUFNLEVBQU8sRUFBUSxRQUFRLFNBQVMsS0FBSyxFQUMzQyxHQUFJLENBQUMsRUFDSCxNQUFPLEdBRVQsSUFBTSxFQUFZLElBQUksS0FDdEIsR0FBSSxDQUFDLEVBQ0gsTUFBTyxHQUFHLEtBRVosTUFBTyxHQUFHLEVBQU0sSUFBSSxDQUFTLE1BR3pCLEdBQXFCLENBQUMsSUFBMkIsQ0FDckQsR0FBSSxJQUFVLEtBQ1osTUFBTyxPQUVULEdBQUksSUFBVSxPQUNaLE1BQU8sWUFFVCxHQUFJLE9BQU8sSUFBVSxTQUNuQixPQUFPLEVBRVQsR0FBSSxPQUFPLElBQVUsVUFBWSxPQUFPLElBQVUsVUFDaEQsT0FBTyxPQUFPLENBQUssRUFFckIsR0FBSSxhQUFpQixNQUNuQixPQUFPLEVBQU0sUUFFZixHQUFJLENBQ0YsT0FBTyxLQUFLLFVBQVUsQ0FBSyxFQUMzQixLQUFNLENBQ04sT0FBTyxPQUFPLENBQUssSUFLakIsR0FBcUIsQ0FBQyxJQUMxQixJQUFVLE1BQ1YsT0FBTyxJQUFVLFVBQ2pCLENBQUMsTUFBTSxRQUFRLENBQUssR0FDcEIsRUFBRSxhQUFpQixRQUNuQixFQUFFLGFBQWlCLE1BRWYsR0FBd0IsQ0FDNUIsRUFDQSxFQUNBLElBQ3VCLENBQ3ZCLElBQU0sRUFBMEIsQ0FBQyxFQUNqQyxRQUFZLEVBQUcsS0FBTSxPQUFPLFFBQVEsQ0FBRyxFQUFHLENBQ3hDLElBQU0sRUFBTSxFQUFTLEdBQUcsS0FBVSxJQUFNLEVBR3hDLEdBRm1CLEdBQW1CLENBQUMsR0FBSyxFQUFpQixFQUczRCxFQUFJLEtBQUssR0FBRyxHQUFzQixFQUFHLEVBQUssRUFBaUIsQ0FBQyxDQUFDLEVBRTdELE9BQUksS0FBSyxDQUFDLEVBQUssR0FBbUIsQ0FBQyxDQUFDLENBQUMsRUFHekMsT0FBTyxHQUdILEdBQTJCLENBQy9CLEVBQ0EsSUFDYSxDQUNiLEdBQUksRUFBUSxTQUFXLEVBQ3JCLE1BQU8sQ0FBQyxFQUdWLElBQU0sRUFBa0IsQ0FBQyxFQUNuQixFQUFPLEVBQVEsT0FBUyxFQUM5QixRQUFTLEVBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3ZDLElBQU0sRUFBUyxJQUFNLEVBQU8sS0FBTSxLQUM1QixFQUFPLEVBQVEsR0FDckIsR0FBSSxDQUFDLEVBQ0gsU0FFRixJQUFPLEVBQUcsR0FBSyxFQUNULEVBQVUsRUFBWSxFQUFNLEtBQUssQ0FBQyxFQUFJLEVBQ3RDLEVBQVUsRUFBWSxFQUFNLE1BQU0sQ0FBQyxFQUFJLEVBQzdDLEVBQU0sS0FBSyxLQUFLLEtBQVUsTUFBWSxHQUFTLEVBRWpELE9BQU8sR0FpQlQsSUFBTSxHQUFnQyxDQUFDLElBQXVDLENBQzVFLElBQU0sRUFBOEIsQ0FBQyxFQUMvQixFQUFNLEVBQVcsQ0FBSyxFQUM1QixHQUFJLEVBQ0YsRUFBUSxLQUFLLENBQUMsUUFBUyxDQUFHLENBQUMsRUFFN0IsR0FBSSxHQUFrQixDQUFLLEVBQUcsQ0FDNUIsR0FBSSxFQUFNLE1BQVEsT0FDaEIsRUFBUSxLQUFLLENBQUMsWUFBYSxPQUFPLEVBQU0sR0FBRyxDQUFDLENBQUMsRUFFL0MsR0FBSSxFQUFNLE1BQVEsT0FDaEIsRUFBUSxLQUFLLENBQUMsWUFBYSxPQUFPLEVBQU0sR0FBRyxDQUFDLENBQUMsRUFFL0MsR0FBSSxFQUFNLE9BQVMsT0FDakIsRUFBUSxLQUFLLENBQUMsYUFBYyxPQUFPLEVBQU0sSUFBSSxDQUFDLENBQUMsRUFFakQsR0FBSSxFQUFNLFdBQWEsT0FDckIsRUFBUSxLQUFLLENBQUMsaUJBQWtCLEdBQW1CLEVBQU0sUUFBUSxDQUFDLENBQUMsRUFHdkUsT0FBTyxHQUdJLEdBQXdCLENBQ25DLEVBQ0EsRUFDQSxJQUNhLENBQ2IsR0FBSSxFQUFRLFFBQVEsa0JBQW9CLEdBQ3RDLE1BQU8sQ0FBQyxFQUdWLElBQU0sRUFBWSxHQUFnQixDQUFPLEVBQ25DLEVBQVEsRUFBUSxRQUFRLGNBQWdCLEVBRXhDLEVBQThCLENBQUMsRUFFL0IsRUFBTSxFQUFLLFFBQ2pCLEdBQ0UsR0FDQSxPQUFPLElBQVEsVUFDZixDQUFDLE1BQU0sUUFBUSxDQUFHLEdBQ2xCLE9BQU8sS0FBSyxDQUFhLEVBQUUsT0FBUyxHQUNwQyxHQUFTLEVBRVQsRUFBUSxLQUNOLEdBQUcsR0FBc0IsRUFBZ0MsR0FBSSxDQUFLLENBQ3BFLEVBR0YsR0FBSSxJQUFVLFNBQVcsVUFBVyxHQUFRLEVBQUssUUFBVSxPQUN6RCxFQUFRLEtBQUssR0FBRyxHQUE4QixFQUFLLEtBQUssQ0FBQyxFQUczRCxPQUFPLEdBQXlCLEVBQVMsQ0FBUyxHQUc5QyxHQUFtQixDQUFDLElBQTJCLENBQ25ELEdBQUksT0FBTyxJQUFVLFVBQVksSUFBVSxLQUN6QyxPQUFPLEtBQUssVUFBVSxDQUFLLEVBRzdCLE1BQU8sSUFHSSxFQUFrQixFQUM3QixRQUNBLFVBQ0EsT0FDQSxRQUNBLGFBT3dCLENBQ3hCLElBQU0sRUFBUyxFQUFRLE9BQ2pCLEVBQVksR0FBZ0IsQ0FBTyxFQUNuQyxFQUFTLEdBQVEsaUJBQW1CLEdBRXBDLEVBQU0sSUFBSSxLQUNWLEVBQVEsT0FBTyxFQUFJLFFBQVEsQ0FBQyxFQUM1QixFQUFlLEdBQWdCLEVBQUssR0FBUSxXQUFXLGFBQWEsRUFDcEUsRUFBWSxHQUFvQixFQUFjLENBQVMsRUFFdkQsRUFBVSxPQUFPLEVBQUssVUFBWSxTQUFXLEVBQUssUUFBVSxHQUM1RCxFQUNKLEVBQU0sYUFBZSxPQUFPLENBQUMsRUFDekIsRUFDQSxPQUFPLFFBQVEsT0FBTyxPQUFPLEVBQUksRUFBTSxVQUFVLEVBQUksSUFFdkQsRUFDQSxFQUNKLEdBQUksQ0FDRixJQUFNLEVBQU0sSUFBSSxJQUFJLEVBQVEsR0FBRyxFQUMvQixFQUFjLEVBQUksU0FDbEIsRUFBUyxFQUFJLE9BQ2IsS0FBTSxDQUNOLEVBQWMsRUFBUSxLQUFPLElBQzdCLEVBQVMsR0FFWCxJQUFNLEVBQVEsRUFDUixFQUFXLEdBQVEsZUFDckIsR0FBRyxJQUFjLElBQ2pCLEVBQ0UsRUFBYyxFQUFLLE9BQ25CLEVBQ0osSUFBZ0IsTUFBUSxJQUFnQixPQUNwQyxJQUNBLEdBQWMsQ0FBVyxFQUN6QixFQUFTLE9BQU8sQ0FBVSxFQUMxQixFQUFLLEdBQVEsS0FBTyxHQUFPLEdBQU0sQ0FBTyxFQUFJLEdBRzVDLEVBRFcsR0FBUSxrQkFBb0IsSUFHM0MsRUFBSyxTQUNMLE9BQU8sRUFBSyxVQUFZLFVBQ3hCLENBQUMsTUFBTSxRQUFRLEVBQUssT0FBTyxHQUMzQixPQUFPLEtBQUssRUFBSyxPQUFpQixFQUFFLE9BQVMsRUFDekMsR0FDQSxHQUFpQixFQUFLLE9BQU8sRUFFN0IsRUFBZSxHQUFnQixFQUFPLENBQVMsRUFDL0MsRUFBZSxFQUFRLE9BQU8sWUFBWSxFQUFFLE9BQU8sRUFBVSxFQUM3RCxFQUFnQixHQUFpQixFQUFjLENBQVMsRUFDeEQsRUFBa0IsR0FBbUIsRUFBVSxDQUFTLEVBQ3hELEVBQWdCLEdBQWlCLEVBQVEsQ0FBUyxHQUNoRCxLQUFNLEVBQWlCLGNBQWUsR0FDNUMsRUFDQSxFQUNBLENBQ0YsRUFDTSxFQUFhLEdBQWMsRUFBWSxDQUFTLEVBQ2hELEVBQU8sR0FBYSxFQUFPLENBQVMsRUFDcEMsRUFBYSxHQUFjLENBQVUsRUFDckMsRUFBZSxHQUFnQixFQUFTLENBQVMsRUFFakQsRUFBbUMsQ0FDdkMsUUFBUyxFQUNULFVBQVcsRUFDWCxVQUFXLEVBQ1gsU0FBVSxFQUNWLGFBQWMsRUFDZCxXQUFZLEVBQ1osYUFBYyxFQUNkLFNBQVUsRUFDVixVQUFXLEVBQ1gsV0FBWSxFQUNaLGVBQWdCLEVBQ2hCLFlBQWEsRUFDYixPQUFRLEVBQ1IsWUFBYSxFQUNiLFlBQWEsRUFDYixVQUFXLEVBQ1gsY0FDRSxPQUFPLEVBQUssVUFBWSxVQUN4QixFQUFLLFVBQVksTUFDakIsY0FBZSxFQUFLLFFBQ2hCLE9BQVEsRUFBSyxRQUFvQyxTQUFTLEVBQzFELEVBQ1IsRUFFTSxHQUFPLEVBQU8sUUFDbEIsR0FDQSxLQUFTLEVBQVMsSUFBVSxDQUM5QixFQUVNLEdBQWUsR0FBc0IsRUFBTyxFQUFNLENBQU8sRUFFL0QsTUFBTyxDQUFFLFFBQU0sZUFBYSxHRy9mOUIsSUFBTSxHQUFvQixDQUN4QixJQUVBLE9BQU8sSUFBVSxVQUNqQixJQUFVLE9BQ1YsV0FBWSxJQUNaLE9BQVEsRUFBK0IsU0FBVyxTQUV2QyxHQUFrQixDQUM3QixFQUNBLEVBQ0EsRUFDQSxFQUNBLElBQ1MsQ0FDVCxJQUFNLEVBQVMsRUFBUSxPQUVqQixFQUFZLEdBQVEsVUFDMUIsR0FDRSxHQUFXLE9BQ1gsRUFBVSxNQUFNLE9BQVMsR0FDekIsQ0FBQyxFQUFVLE1BQU0sU0FBUyxPQUFPLEVBRWpDLE9BR0YsSUFBTSxFQUFvQixHQUFRLG9CQUFzQixHQUNsRCxFQUF3QixHQUFRLHdCQUEwQixHQUMxRCxFQUFxQixHQUFRLHFCQUF1QixHQUVwRCxFQUFTLEdBQWtCLENBQUssRUFBSSxFQUFNLE9BQVMsSUFDbkQsRUFBVSxFQUFXLENBQUssRUFFMUIsRUFBa0IsUUFDbEIsRUFBZ0MsQ0FBRSxTQUFRLFVBQVMsT0FBTSxFQUN6RCxFQUFrQixFQUNwQixFQUFvQixFQUFNLEVBQWEsV0FBVyxDQUFPLENBQUMsRUFDMUQsRUFDRSxFQUNKLEdBQVEsYUFBZSxHQUFPLEVBQU8sQ0FBZSxFQUFJLEVBQ3BELEVBQ0osR0FBUSxhQUFlLEdBQU8sRUFBYyxDQUFPLEVBQUksRUFJekQsR0FGQSxFQUFnQixDQUFFLFFBQU8sUUFBUyxFQUFZLEtBQU0sRUFBUyxRQUFPLFNBQVEsQ0FBQyxFQUV6RSxFQUFFLEdBQXFCLEdBQXFCLENBQzlDLElBQU0sRUFBVyxHQUFRLFlBQ3pCLEdBQUksRUFDRixFQUFVLENBQ1IsV0FDQSxRQUNBLFFBQVMsRUFDVCxLQUFNLEVBQ04sUUFDQSxTQUNGLENBQUMsRUFBRSxNQUFNLElBQU0sRUFFZCxFQUlMLEdBQUksR0FBcUIsRUFDdkIsT0FHRixJQUFRLE9BQU0sZ0JBQWlCLEVBQWdCLENBQzdDLFFBQ0EsUUFBUyxFQUNULEtBQU0sRUFDTixRQUNBLFNBQ0YsQ0FBQyxFQUVLLEVBQ0osRUFBYSxPQUFTLEVBQUksR0FBRztBQUFBLEVBQVMsRUFBYSxLQUFLO0FBQUEsQ0FBSSxJQUFNLEVBQ3BFLFFBQVEsTUFBTSxDQUFnQixHVmhFekIsSUFBTSxHQUFlLENBQzFCLEVBQW1CLENBQUMsRUFDcEIsRUFBMkIsR0FDM0IsSUFDVyxDQUNYLElBQU0sRUFBZSxHQUF3QixFQUEwQixFQUNqRSxFQUFTLEVBQVEsT0FFakIsRUFBYSxHQUFRLE1BQ25CLGlCQUFnQixHQUFnQixHQUFjLENBQUMsRUFFakQsRUFDSixPQUFPLElBQWdCLFVBQVksSUFBZ0IsS0FDOUMsRUFDRCxPQUtBLEdBRkosSUFBZ0IsSUFBUSxJQUF1QixTQUcxQixFQUFZLFlBQWMsT0FFM0MsRUFDSCxHQUFvQixZQUNyQixFQUFZLFdBQ1IsRUFDSCxHQUFvQixVQUFtQyxFQUFZLFNBRWhFLEVBQWtCLElBQ25CLEVBQ0gsTUFBTyxFQUFZLE9BQVMsT0FDNUIsYUFDQSxVQUNGLEVBRUksRUFFSixHQUFJLEVBQW1CLENBQ3JCLElBQU0sRUFBZSxHQUFPLENBQzFCLFNBQVUsUUFBUSxRQUFRLFFBQVUsR0FDcEMsY0FBZSxHQUFRLFdBQVcsaUJBQy9CLEVBQ0gsYUFDQSxVQUNGLENBQTRCLEVBRTVCLEVBQWEsRUFBWSxFQUFpQixDQUFZLEVBRXRELE9BQWEsRUFBWSxJQUNwQixFQUNILFVBQVcsRUFBWSxTQUN6QixDQUFDLEVBR0gsSUFBTSxFQUFZLENBQUMsRUFBaUIsSUFBbUMsQ0FDckUsR0FBSSxDQUFDLEdBQVcsT0FBUyxFQUFVLE1BQU0sU0FBVyxFQUNsRCxNQUFPLEdBRVQsT0FBTyxFQUFVLE1BQU0sU0FBUyxDQUFLLEdBR2pDLEVBQW9CLEdBQVEsb0JBQXNCLEdBQ2xELEVBQXdCLEdBQVEsd0JBQTBCLEdBQzFELEVBQXFCLEdBQVEscUJBQXVCLEdBRXBELEdBQWlCLEdBQVEsWUFBWSxRQUFVLEdBQUssRUFDcEQsRUFDSixFQUFFLEdBQXFCLElBQXVCLENBQUMsQ0FBQyxHQUFRLFlBQ3BELEVBQW9CLEVBQUUsR0FBcUIsR0FDM0MsRUFBd0IsRUFDNUIsR0FDQSxHQUNBLEdBR0ksRUFBTSxDQUNWLEVBQ0EsRUFDQSxFQUNBLElBQ1MsQ0FDVCxHQUFJLEdBQXlCLENBQUMsRUFBVSxFQUFPLEdBQVEsU0FBUyxFQUM5RCxPQUdGLElBQU0sRUFBa0IsRUFDdEIsRUFDQSxFQUFhLFdBQVcsQ0FBTyxDQUNqQyxFQUNNLEVBQ0osR0FBUSxhQUFlLEdBQU8sRUFBTyxDQUFlLEVBQUksRUFDcEQsRUFDSixHQUFRLGFBQWUsR0FBTyxFQUFjLENBQU8sRUFBSSxFQUV6RCxHQUFJLEVBQ0YsRUFBZ0IsQ0FDZCxRQUNBLFFBQVMsRUFDVCxLQUFNLEVBQ04sUUFDQSxTQUNGLENBQUMsRUFHSCxHQUFJLEVBQWdCLENBQ2xCLElBQU0sRUFBVyxHQUFRLFlBQ3pCLEdBQUksRUFDRixFQUFVLENBQ1IsV0FDQSxRQUNBLFFBQVMsRUFDVCxLQUFNLEVBQ04sUUFDQSxTQUNGLENBQUMsRUFBRSxNQUFNLElBQU0sRUFFZCxFQUlMLEdBQUksQ0FBQyxFQUNILE9BR0YsSUFBUSxPQUFNLGdCQUFpQixFQUFnQixDQUM3QyxRQUNBLFFBQVMsRUFDVCxLQUFNLEVBQ04sUUFDQSxTQUNGLENBQUMsRUFDSyxFQUNKLEVBQWEsT0FBUyxFQUFJLEdBQUc7QUFBQSxFQUFTLEVBQWEsS0FBSztBQUFBLENBQUksSUFBTSxFQUVwRSxPQUFRLE9BQ0QsUUFBUyxDQUNaLFFBQVEsTUFBTSxDQUFPLEVBQ3JCLEtBQ0YsS0FDSyxPQUFRLENBQ1gsUUFBUSxLQUFLLENBQU8sRUFDcEIsS0FDRixLQUNLLFVBQVcsQ0FDZCxRQUFRLEtBQUssQ0FBTyxFQUNwQixLQUNGLEtBQ0ssUUFBUyxDQUNaLFFBQVEsTUFBTSxDQUFPLEVBQ3JCLEtBQ0YsU0FDUyxDQUNQLFFBQVEsSUFBSSxDQUFPLEVBQ25CLEtBQ0YsSUFJRSxFQUFpQixDQUNyQixFQUNBLEVBQ0EsRUFDQSxJQUNTLENBQ1QsR0FBSSxHQUF5QixDQUFDLEVBQVUsRUFBTyxHQUFRLFNBQVMsRUFDOUQsT0FFRixJQUFNLEVBQW1CLENBQUUsV0FBWSxRQUFRLE9BQU8sT0FBTyxDQUFFLEVBQy9ELEVBQUksRUFBTyxFQUFTLENBQUUsVUFBUyxTQUFRLEVBQUcsQ0FBSyxHQUdqRCxNQUFPLENBQ0wsS0FBTSxFQUNOLGFBQWMsQ0FBQyxFQUFTLElBQVksQ0FDbEMsRUFBYSxhQUFhLEVBQVMsQ0FBTyxHQUU1QyxXQUFZLEtBQVcsRUFBYSxXQUFXLENBQU8sRUFDdEQsTUFDQSxnQkFBaUIsQ0FBQyxFQUFTLEVBQU8sSUFBVSxDQUMxQyxHQUFnQixFQUFTLEVBQU8sRUFBTyxFQUFTLENBQVksR0FFOUQsTUFBTyxDQUFDLEVBQVMsRUFBUyxJQUFZLENBQ3BDLEVBQWUsUUFBUyxFQUFTLEVBQVMsQ0FBTyxHQUVuRCxLQUFNLENBQUMsRUFBUyxFQUFTLElBQVksQ0FDbkMsRUFBZSxPQUFRLEVBQVMsRUFBUyxDQUFPLEdBRWxELEtBQU0sQ0FBQyxFQUFTLEVBQVMsSUFBWSxDQUNuQyxFQUFlLFVBQVcsRUFBUyxFQUFTLENBQU8sR0FFckQsTUFBTyxDQUFDLEVBQVMsRUFBUyxJQUFZLENBQ3BDLEVBQWUsUUFBUyxFQUFTLEVBQVMsQ0FBTyxFQUVyRCxHQUlXLEdBQXFCLENBQ2hDLEVBQ0EsSUFDVyxHQUFhLEVBQVMsR0FBTSxDQUFZLEVXN005QyxJQUFNLEdBQXlCLENBQ3BDLElBQ21DLENBQ25DLEdBQUksSUFBUSxRQUFhLElBQVEsR0FDL0IsT0FBTyxLQUdULEdBQUksSUFBUSxHQUNWLE1BQU8sQ0FDTCxRQUFTLEdBQ1QsT0F6QmlCLGVBMEJqQixVQUFXLElBQU0sT0FBTyxXQUFXLENBQ3JDLEVBSUYsR0FBSSxFQUFJLFVBQVksR0FDbEIsT0FBTyxLQUdULE1BQU8sQ0FDTCxRQUFTLEdBQ1QsT0FBUSxFQUFJLFFBQVEsS0FBSyxHQXJDTixlQXNDbkIsVUFBVyxFQUFJLFlBQWMsSUFBTSxPQUFPLFdBQVcsRUFDdkQsR0FPVyxHQUF1QixDQUNsQyxFQUNBLElBQ1csQ0FDWCxJQUFNLEVBQVcsRUFBUSxRQUFRLElBQUksRUFBTyxNQUFNLEVBQ2xELEdBQUksRUFDRixPQUFPLEVBRVQsT0FBTyxFQUFPLFVBQVUsR0N2QzFCLElBQU0sR0FBcUIsQ0FBQyxJQUMxQixJQUFJLFFBQVEsMEJBQTBCLElBQVEsQ0FBRSxPQUFRLElBQUssQ0FBQyxFQUVuRCxHQUF5QixDQUNwQyxFQUNBLEVBQ0EsSUFDRyxDQUNILElBQU0sRUFBWSxJQUFJLFFBRWhCLEVBQVEsQ0FDWixFQUNBLEVBQ0EsRUFDQSxFQUNBLElBQ1MsQ0FDVCxJQUFNLEVBQU0sRUFFTixFQUFtQixDQUFFLFdBRFIsRUFBVSxJQUFJLENBQUcsR0FBSyxRQUFRLE9BQU8sT0FBTyxDQUN6QixFQUNoQyxFQUFjLEVBQWEsV0FBVyxDQUFHLEVBQ3pDLEVBQ0osT0FBTyxLQUFLLENBQVcsRUFBRSxPQUFTLEdBQUssRUFDbkMsSUFBSyxLQUFnQixFQUFPLEtBQU0sRUFBRyxFQUFHLEVBQ3hDLENBQUUsS0FBTSxFQUFHLEVBQUcsRUFFcEIsRUFBTyxJQUNMLEVBQ0EsR0FBbUIsQ0FBSSxFQUN2QixDQUFFLFVBQVMsVUFBUyxPQUFRLEdBQUksRUFDaEMsQ0FDRixHQUdGLE1BQU8sQ0FLTCxFQUNBLEtBRUMsSUFDSSxFQUNILElBQUksQ0FBQyxFQUFJLENBR1AsR0FGQSxFQUFVLElBQUksRUFBYyxRQUFRLE9BQU8sT0FBTyxDQUFDLEVBQ25ELEVBQU0sT0FBTyxDQUFFLEVBQ1gsRUFBUSxRQUFRLDBCQUE0QixHQUM5QyxFQUFNLE9BQVEsRUFBSSxFQUFNLGtCQUFrQixHQUc5QyxPQUFPLENBQUMsRUFBSSxFQUFTLENBRW5CLEdBREEsRUFBTSxVQUFVLEVBQUksQ0FBTyxFQUN2QixFQUFRLFFBQVEsMEJBQTRCLEdBQzlDLEVBQU0sT0FBUSxFQUFJLEVBQU0sb0JBQXFCLENBQzNDLFlBQWEsT0FBTyxDQUN0QixDQUFDLEdBR0wsS0FBSyxDQUFDLEVBQUksQ0FFUixHQURBLEVBQU0sUUFBUSxDQUFFLEVBQ1osRUFBUSxRQUFRLDBCQUE0QixHQUM5QyxFQUFNLE9BQVEsRUFBSSxFQUFNLGtCQUFrQixFQUU1QyxFQUFhLGFBQWEsQ0FBWSxFQUN0QyxFQUFVLE9BQU8sQ0FBWSxFQUVqQyxJbEJ0Q0csSUFBTSxHQUFhLENBQUMsRUFBc0IsQ0FBQyxJQUF3QixDQUN4RSxJQUFNLEVBQVUsRUFBZSxDQUFVLEVBQ25DLEVBQWUsSUFBSSxRQUNuQixFQUFlLEVBQTBCLEVBQ3pDLEVBQWEsR0FBbUIsRUFBUyxDQUFZLEVBQ3JELEVBQVMsR0FBdUIsRUFBUyxFQUFZLENBQVksRUFDakUsRUFBa0IsR0FBdUIsRUFBUSxRQUFRLFNBQVMsRUFDbEUsRUFBUyxJQUNWLEVBQ0gsTUFBTyxDQUNMLEVBQ0EsRUFDQSxJQUNHLENBQ0gsRUFBYSxJQUFJLENBQU8sRUFDeEIsRUFBVyxNQUFNLEVBQVMsRUFBUyxDQUFPLEdBRTVDLEtBQU0sQ0FDSixFQUNBLEVBQ0EsSUFDRyxDQUNILEVBQWEsSUFBSSxDQUFPLEVBQ3hCLEVBQVcsS0FBSyxFQUFTLEVBQVMsQ0FBTyxHQUUzQyxLQUFNLENBQ0osRUFDQSxFQUNBLElBQ0csQ0FDSCxFQUFhLElBQUksQ0FBTyxFQUN4QixFQUFXLEtBQUssRUFBUyxFQUFTLENBQU8sR0FFM0MsTUFBTyxDQUNMLEVBQ0EsRUFDQSxJQUNHLENBQ0gsRUFBYSxJQUFJLENBQU8sRUFDeEIsRUFBVyxNQUFNLEVBQVMsRUFBUyxDQUFPLEVBRTlDLEVBRU0sRUFBNEIsQ0FDaEMsS0FDeUIsQ0FDekIsTUFBTyxDQUFDLEVBQVMsSUFBWSxFQUFPLE1BQU0sRUFBUyxFQUFTLENBQU8sRUFDbkUsS0FBTSxDQUFDLEVBQVMsSUFBWSxFQUFPLEtBQUssRUFBUyxFQUFTLENBQU8sRUFDakUsS0FBTSxDQUFDLEVBQVMsSUFBWSxFQUFPLEtBQUssRUFBUyxFQUFTLENBQU8sRUFDakUsTUFBTyxDQUFDLEVBQVMsSUFBWSxFQUFPLE1BQU0sRUFBUyxFQUFTLENBQU8sRUFDbkUsYUFBYyxLQUFXLEVBQWEsYUFBYSxFQUFTLENBQU8sQ0FDckUsR0FZTSxFQVZNLElBQUksR0FBTyxDQUNyQixLQUFNLGFBQ04sT0FBUSxDQUNOLFlBQ0UsNEVBQ0YsS0FBTSxDQUFDLFVBQVcsTUFBTSxDQUMxQixDQUNGLENBQUMsRUFJRSxNQUFNLFNBQVUsQ0FBTSxFQUN0QixNQUFNLE9BQVEsRUFBTyxJQUFJLEVBQ3pCLE1BQU0sYUFBYyxPQUFPLENBQUMsQ0FBQyxFQUM3QixPQUFPLEVBQUcsY0FBZSxDQUFFLElBQUssRUFBMEIsQ0FBTyxDQUFFLEVBQUUsRUFDckUsUUFBUSxFQUFHLFlBQW1CLENBQzdCLEdBQUksRUFDRixHQUFZLEVBQVEsQ0FBTyxFQUN0QixLQUNMLElBQU0sRUFBTyxPQUFPLFFBQVEsSUFBSSxJQUFJLEdBQUssS0FDbkMsRUFBVyxRQUFRLElBQUksTUFBUSxZQUNyQyxHQUFZLENBQUUsT0FBTSxXQUFVLFNBQVUsTUFBTyxFQUFHLENBQU8sR0FFNUQsRUFDQSxVQUFVLEVBQUcsVUFBUyxXQUFZLENBRWpDLEdBREEsRUFBTSxXQUFhLFFBQVEsT0FBTyxPQUFPLEVBQ3JDLEVBQWlCLENBQ25CLElBQU0sRUFBWSxHQUFxQixFQUFTLENBQWUsRUFDL0QsRUFBYSxhQUFhLEVBQVMsQ0FBRSxXQUFVLENBQUMsRUFHbEQsR0FBSSxFQUFRLFFBQVEscUJBQ2xCLEdBQWMsVUFBVSxFQUEwQixDQUFPLENBQUMsRUFFN0QsRUFDQSxjQUFjLEVBQUcsVUFBUyxNQUFLLFdBQVksQ0FDMUMsR0FBSSxDQUNGLEdBQUksRUFBaUIsQ0FFbkIsSUFBTSxFQURNLEVBQWEsV0FBVyxDQUFPLEVBQzVCLFVBQ2YsR0FBSSxFQUNGLEVBQUksUUFBUSxFQUFnQixRQUFVLEVBSTFDLEdBQUksRUFBYSxJQUFJLENBQU8sRUFDMUIsT0FHRixJQUFNLEVBQVMsT0FBTyxFQUFJLFNBQVcsU0FBVyxFQUFJLE9BQVMsSUFDekQsRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsSUFBTSxFQUFjLEVBQWEsV0FBVyxDQUFPLEVBQzdDLEVBQWdDLENBQUUsUUFBTyxFQUMvQyxHQUFJLE9BQU8sS0FBSyxDQUFXLEVBQUUsT0FBUyxFQUNwQyxFQUFLLFFBQVUsSUFBSyxDQUFZLEVBR2xDLEVBQU8sSUFBSSxFQUFPLEVBQVMsRUFBTSxDQUFLLFNBQ3RDLENBQ0EsRUFBYSxhQUFhLENBQU8sR0FFcEMsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLE1BQUssV0FBWSxDQUMzQyxHQUFJLENBQ0YsR0FBSSxFQUFpQixDQUVuQixJQUFNLEVBRE0sRUFBYSxXQUFXLENBQU8sRUFDNUIsVUFDZixHQUFJLEVBQ0YsRUFBSSxRQUFRLEVBQWdCLFFBQVUsRUFHMUMsRUFBTyxnQkFBZ0IsRUFBUyxFQUFPLENBQUssU0FDNUMsQ0FDQSxFQUFhLGFBQWEsQ0FBTyxHQUVwQyxFQUNBLEdBQUcsUUFBUSxFQUVkLE9BQU8sT0FBTyxPQUFPLEVBQVEsQ0FBRSxRQUFPLENBQUMsR0E0QjFCIiwKICAiZGVidWdJZCI6ICI2NzBCNkZCMUFDOUQ2RTM4NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
9
|
+
//# debugId=7DF387E8E4621F0864756E2164756E21
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvY29uZmlnL3Jlc29sdmUtb3B0aW9ucy50cyIsICJzcmMvY29udGV4dC9yZXF1ZXN0LWNvbnRleHQudHMiLCAic3JjL2NvbnRleHQvc3RvcmFnZS50cyIsICJzcmMvZXh0ZW5zaW9ucy9iYW5uZXIudHMiLCAic3JjL2V4dGVuc2lvbnMvaW5kZXgudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy9sb2dnZXIvaW5kZXgudHMiLCAic3JjL291dHB1dC9pbmRleC50cyIsICJzcmMvb3V0cHV0L2ZpbGUudHMiLCAic3JjL291dHB1dC9mcy50cyIsICJzcmMvb3V0cHV0L3JvdGF0aW9uLW1hbmFnZXIudHMiLCAic3JjL3V0aWxzL3JlZGFjdC50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy9sb2dnZXIvaGFuZGxlLWh0dHAtZXJyb3IudHMiLCAic3JjL21pZGRsZXdhcmUvcmVxdWVzdC1pZC50cyIsICJzcmMvd2Vic29ja2V0L3dyYXAtd3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5pbXBvcnQgeyBjcmVhdGVSZXF1ZXN0Q29udGV4dFN0b3JlIH0gZnJvbSAnLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB7IGxvZ2dlclN0b3JhZ2UgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgT3B0aW9ucyxcbiAgUmVxdWVzdFNjb3BlZExvZ2dlclxufSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVQbHVnaW5Mb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcbmltcG9ydCB7XG4gIGdldE9yQ3JlYXRlUmVxdWVzdElkLFxuICByZXNvbHZlUmVxdWVzdElkQ29uZmlnXG59IGZyb20gJy4vbWlkZGxld2FyZS9yZXF1ZXN0LWlkJ1xuaW1wb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbi8qKlxuICogRW1wdHkgc2luZ2xldG9uIHNsb3RzIG11c3Qgbm90IHVzZSBgUmVjb3JkPHN0cmluZywgbmV2ZXI+YDogaW50ZXJzZWN0aW5nIHRoYXQgd2l0aCBFbHlzaWEncyBgQ29udGV4dGBcbiAqIG1ha2VzIGV2ZXJ5IGtleSAoaW5jbHVkaW5nIGBzdG9yZWApIGJlY29tZSBgbmV2ZXJgIGJlY2F1c2UgZWFjaCBrZXkgaXMgbWVyZ2VkIHdpdGggYG5ldmVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXB0eUVseXNpYVNsb3Qge1xuICByZWFkb25seSBfX2xvZ2l4bHlzaWFFbXB0eT86IG5ldmVyXG59XG5cbi8qKlxuICogRXhwbGljaXQgc2luZ2xldG9uIHdpdGhvdXQgRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2VgIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAgb24gZGVjb3JhdG9yL2Rlcml2ZS9yZXNvbHZlIHNvXG4gKiBtZXJnZWQgYENvbnRleHRgIGFuZCBXZWJTb2NrZXQgYHdzLmRhdGFgIGtlZXAgcHJlY2lzZSBrZXlzIGFmdGVyIGAudXNlKGxvZ2l4bHlzaWEoKSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4bHlzaWFTaW5nbGV0b24ge1xuICBkZWNvcmF0b3I6IEVtcHR5RWx5c2lhU2xvdFxuICBkZXJpdmU6IHtcbiAgICBsb2c6IFJlcXVlc3RTY29wZWRMb2dnZXJcbiAgfVxuICByZXNvbHZlOiBFbXB0eUVseXNpYVNsb3RcbiAgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZVxufVxuXG4vLyBFbHlzaWEncyBgU2luZ2xldG9uQmFzZS5zdG9yZWAgaXMgYFJlY29yZDxzdHJpbmcsIHVua25vd24+YDsgYExvZ2l4bHlzaWFTdG9yZWAgaXMgaW50ZW50aW9uYWxseSBjbG9zZWQgKHNlZSAjMjIwKS5cbi8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGNsb3NlZCBzdG9yZSBpcyBjb3JyZWN0IGF0IHJ1bnRpbWUgYW5kIGZvciBtZXJnZWQgYHdzLmRhdGFgIGluZmVyZW5jZS5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8JycsIExvZ2l4bHlzaWFTaW5nbGV0b24+XG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWFQbHVnaW4gPSBMb2dpeGx5c2lhICYge1xuICB3cmFwV3M6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVdzSGFuZGxlcldyYXBwZXI+XG59XG5cbmNvbnN0IGxvZ2l4bHlzaWEgPSAocmF3T3B0aW9uczogT3B0aW9ucyA9IHt9KTogTG9naXhseXNpYVBsdWdpbiA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlT3B0aW9ucyhyYXdPcHRpb25zKVxuICBjb25zdCBkaWRDdXN0b21Mb2cgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXG4gIGNvbnN0IHJlcXVlc3RTdGFydFRpbWVzID0gbmV3IFdlYWtNYXA8UmVxdWVzdCwgYmlnaW50PigpXG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlUGx1Z2luTG9nZ2VyKG9wdGlvbnMsIGNvbnRleHRTdG9yZSlcbiAgY29uc3Qgd3JhcFdzID0gY3JlYXRlV3NIYW5kbGVyV3JhcHBlcihvcHRpb25zLCBiYXNlTG9nZ2VyLCBjb250ZXh0U3RvcmUpXG4gIGNvbnN0IHJlcXVlc3RJZENvbmZpZyA9IHJlc29sdmVSZXF1ZXN0SWRDb25maWcob3B0aW9ucy5jb25maWc/LnJlcXVlc3RJZClcbiAgY29uc3QgbG9nZ2VyID0ge1xuICAgIC4uLmJhc2VMb2dnZXIsXG4gICAgZGVidWc6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZVJlcXVlc3RTY29wZWRMb2dnZXIgPSAoXG4gICAgcmVxdWVzdDogUmVxdWVzdFxuICApOiBSZXF1ZXN0U2NvcGVkTG9nZ2VyID0+ICh7XG4gICAgZGVidWc6IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgZXJyb3I6IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCksXG4gICAgaW5mbzogKG1lc3NhZ2UsIGNvbnRleHQpID0+IGxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpLFxuICAgIG1lcmdlQ29udGV4dDogcGFydGlhbCA9PiBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpLFxuICAgIHdhcm46IChtZXNzYWdlLCBjb250ZXh0KSA9PiBsb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICB9KVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9LFxuICAgIG5hbWU6ICdMb2dpeGx5c2lhJ1xuICB9KVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Ig4oCUIGRlcml2ZWQgbG9nIHR5cGluZyBtYXRjaGVzIExvZ2l4bHlzaWFTaW5nbGV0b24uXG4gIGNvbnN0IHBsdWdpbiA9IGFwcFxuICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxuICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAuZGVyaXZlKCh7IHJlcXVlc3QgfSkgPT4gKHsgbG9nOiBjcmVhdGVSZXF1ZXN0U2NvcGVkTG9nZ2VyKHJlcXVlc3QpIH0pKVxuICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHByb2Nlc3MuZW52LkhPU1QgfHwgJ2xvY2FsaG9zdCdcbiAgICAgICAgc3RhcnRTZXJ2ZXIoeyBob3N0bmFtZSwgcG9ydCwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uUmVxdWVzdCgoeyByZXF1ZXN0IH0pID0+IHtcbiAgICAgIHJlcXVlc3RTdGFydFRpbWVzLnNldChyZXF1ZXN0LCBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSlcbiAgICAgIGlmIChyZXF1ZXN0SWRDb25maWcpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gZ2V0T3JDcmVhdGVSZXF1ZXN0SWQocmVxdWVzdCwgcmVxdWVzdElkQ29uZmlnKVxuICAgICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHsgcmVxdWVzdElkIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8udXNlQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgICAgbG9nZ2VyU3RvcmFnZS5lbnRlcldpdGgoY3JlYXRlUmVxdWVzdFNjb3BlZExvZ2dlcihyZXF1ZXN0KSlcbiAgICAgIH1cbiAgICB9KVxuICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAgICAgc2V0LnN0YXR1cyA9PT0gdW5kZWZpbmVkIHx8IHNldC5zdGF0dXMgPT09IG51bGxcbiAgICAgICAgICAgID8gMjAwXG4gICAgICAgICAgICA6IGdldFN0YXR1c0NvZGUoc2V0LnN0YXR1cylcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpXG4gICAgICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMgfVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmNvbnRleHQgPSB7IC4uLmFjY3VtdWxhdGVkIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHtcbiAgICAgICAgICBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gQmlnSW50KDApXG4gICAgICAgIH0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXF1ZXN0U3RhcnRUaW1lcy5kZWxldGUocmVxdWVzdClcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLm9uRXJyb3IoKHsgcmVxdWVzdCwgZXJyb3IsIHNldCB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVxdWVzdElkQ29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICAgICAgICBjb25zdCBpZCA9IGN0eC5yZXF1ZXN0SWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICBzZXQuaGVhZGVyc1tyZXF1ZXN0SWRDb25maWcuaGVhZGVyXSA9IGlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHtcbiAgICAgICAgICBiZWZvcmVUaW1lOiByZXF1ZXN0U3RhcnRUaW1lcy5nZXQocmVxdWVzdCkgPz8gQmlnSW50KDApXG4gICAgICAgIH0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXF1ZXN0U3RhcnRUaW1lcy5kZWxldGUocmVxdWVzdClcbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dChyZXF1ZXN0KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmFzKCdzY29wZWQnKSBhcyBMb2dpeGx5c2lhXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocGx1Z2luLCB7IHdyYXBXcyB9KSBhcyBMb2dpeGx5c2lhUGx1Z2luXG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3BlcmZvcm1hbmNlL25vQmFycmVsRmlsZTogcHVibGljIHBhY2thZ2UgZW50cnkgcmUtZXhwb3J0c1xuZXhwb3J0IHsgcmVzb2x2ZU9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy9yZXNvbHZlLW9wdGlvbnMnXG5leHBvcnQgeyB1c2VMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQvc3RvcmFnZSdcbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgTG9nUHJlc2V0LFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SWRDb25maWcsXG4gIFJlcXVlc3RTY29wZWRMb2dnZXIsXG4gIFN0b3JlRGF0YSxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcbmV4cG9ydCB7IGNyZWF0ZUxvZ2dlciwgY3JlYXRlUGx1Z2luTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInXG5leHBvcnQgdHlwZSB7IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnIH0gZnJvbSAnLi9taWRkbGV3YXJlL3JlcXVlc3QtaWQnXG5leHBvcnQge1xuICBnZXRPckNyZWF0ZVJlcXVlc3RJZCxcbiAgcmVzb2x2ZVJlcXVlc3RJZENvbmZpZ1xufSBmcm9tICcuL21pZGRsZXdhcmUvcmVxdWVzdC1pZCdcbmV4cG9ydCB0eXBlIHsgV3NIYW5kbGVySG9va3MgfSBmcm9tICcuL3dlYnNvY2tldC93cmFwLXdzJ1xuZXhwb3J0IHsgY3JlYXRlV3NIYW5kbGVyV3JhcHBlciB9IGZyb20gJy4vd2Vic29ja2V0L3dyYXAtd3MnXG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2l4bHlzaWFcbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLihcXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfSg/Oi1cXGR7M30pPyg/Oi1cXGQrKT8pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplOiAke3ZhbHVlfWApXG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAodHJpbW1lZCAhPT0gJycpIHtcbiAgICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgICBpZiAoYXNOdW1iZXIgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZTogJHt2YWx1ZX1gKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzTnVtYmVyXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IHBhcnNlSW50ZXJ2YWwsIHBhcnNlUmV0ZW50aW9uLCBwYXJzZVNpemUgfSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuZXhwb3J0IHR5cGUgTG9nUHJlc2V0ID0gJ2RldicgfCAncHJvZCcgfCAnanNvbidcblxuY29uc3QgVkFMSURfUFJFU0VUUzogcmVhZG9ubHkgTG9nUHJlc2V0W10gPSBbJ2RldicsICdwcm9kJywgJ2pzb24nXVxuXG5jb25zdCB2YWxpZGF0ZUxvZ1JvdGF0aW9uID0gKGNvbmZpZzogT3B0aW9uc1snY29uZmlnJ10pOiB2b2lkID0+IHtcbiAgY29uc3QgbG9nUm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gIGlmICghbG9nUm90YXRpb24pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvZ1JvdGF0aW9uLm1heFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VTaXplKGxvZ1JvdGF0aW9uLm1heFNpemUpXG4gICAgfVxuICAgIGlmIChsb2dSb3RhdGlvbi5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJzZVJldGVudGlvbihsb2dSb3RhdGlvbi5tYXhGaWxlcylcbiAgICB9XG4gICAgaWYgKGxvZ1JvdGF0aW9uLmludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcnNlSW50ZXJ2YWwobG9nUm90YXRpb24uaW50ZXJ2YWwpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGxvZ1JvdGF0aW9uLmNvbXByZXNzaW9uICE9PSAnZ3ppcCdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgY29tcHJlc3Npb24gYWxnb3JpdGhtOiAke2xvZ1JvdGF0aW9uLmNvbXByZXNzaW9ufWBcbiAgICAgIClcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBsb2dSb3RhdGlvbiBjb25maWcg4oCUICR7bWVzc2FnZX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JcbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IFBSRVNFVF9ERUZBVUxUUzogUmVjb3JkPExvZ1ByZXNldCwgTm9uTnVsbGFibGU8T3B0aW9uc1snY29uZmlnJ10+PiA9IHtcbiAgZGV2OiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWVcbiAgICB9LFxuICAgIHNob3dDb250ZXh0VHJlZTogdHJ1ZSxcbiAgICBzaG93U3RhcnR1cE1lc3NhZ2U6IHRydWUsXG4gICAgc3RhcnR1cE1lc3NhZ2VGb3JtYXQ6ICdiYW5uZXInLFxuICAgIHVzZUNvbG9yczogdHJ1ZVxuICB9LFxuICBqc29uOiB7XG4gICAgcGlubzoge1xuICAgICAgcHJldHR5UHJpbnQ6IGZhbHNlXG4gICAgfSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9LFxuICBwcm9kOiB7XG4gICAgYXV0b1JlZGFjdDogdHJ1ZSxcbiAgICBwaW5vOiB7XG4gICAgICBwcmV0dHlQcmludDogZmFsc2VcbiAgICB9LFxuICAgIHJlcXVlc3RJZDogdHJ1ZSxcbiAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlLFxuICAgIHNob3dTdGFydHVwTWVzc2FnZTogZmFsc2UsXG4gICAgdXNlQ29sb3JzOiBmYWxzZVxuICB9XG59XG5cbmNvbnN0IG1lcmdlQ29uZmlnID0gKFxuICBiYXNlOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4sXG4gIG92ZXJyaWRlPzogT3B0aW9uc1snY29uZmlnJ11cbik6IE5vbk51bGxhYmxlPE9wdGlvbnNbJ2NvbmZpZyddPiA9PiB7XG4gIGlmICghb3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gYmFzZVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkOiBOb25OdWxsYWJsZTxPcHRpb25zWydjb25maWcnXT4gPSB7IC4uLmJhc2UsIC4uLm92ZXJyaWRlIH1cblxuICBpZiAoYmFzZS5waW5vIHx8IG92ZXJyaWRlLnBpbm8pIHtcbiAgICBtZXJnZWQucGlubyA9IHtcbiAgICAgIC4uLmJhc2UucGlubyxcbiAgICAgIC4uLm92ZXJyaWRlLnBpbm8sXG4gICAgICAuLi4oYmFzZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBvdmVycmlkZS5waW5vPy5wcmV0dHlQcmludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgcHJldHR5UHJpbnQ6IG92ZXJyaWRlLnBpbm8/LnByZXR0eVByaW50ID8/IGJhc2UucGlubz8ucHJldHR5UHJpbnRcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UubG9nRmlsdGVyIHx8IG92ZXJyaWRlLmxvZ0ZpbHRlcikge1xuICAgIG1lcmdlZC5sb2dGaWx0ZXIgPSB7XG4gICAgICAuLi5iYXNlLmxvZ0ZpbHRlcixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ0ZpbHRlclxuICAgIH1cbiAgfVxuXG4gIGlmIChiYXNlLmxvZ1JvdGF0aW9uIHx8IG92ZXJyaWRlLmxvZ1JvdGF0aW9uKSB7XG4gICAgbWVyZ2VkLmxvZ1JvdGF0aW9uID0ge1xuICAgICAgLi4uYmFzZS5sb2dSb3RhdGlvbixcbiAgICAgIC4uLm92ZXJyaWRlLmxvZ1JvdGF0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGJhc2UudGltZXN0YW1wIHx8IG92ZXJyaWRlLnRpbWVzdGFtcCkge1xuICAgIG1lcmdlZC50aW1lc3RhbXAgPSB7XG4gICAgICAuLi5iYXNlLnRpbWVzdGFtcCxcbiAgICAgIC4uLm92ZXJyaWRlLnRpbWVzdGFtcFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqIEFwcGxpZXMgcHJlc2V0IGRlZmF1bHRzOyBleHBsaWNpdCBgY29uZmlnYCBrZXlzIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgcHJlc2V0IH0gPSBvcHRpb25zXG4gIGlmIChwcmVzZXQgJiYgIVZBTElEX1BSRVNFVFMuaW5jbHVkZXMocHJlc2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbG9naXhseXNpYTogaW52YWxpZCBwcmVzZXQg4oCUICR7cHJlc2V0fWApXG4gIH1cblxuICBjb25zdCByZXNvbHZlZCA9IHByZXNldFxuICAgID8ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjb25maWc6IG1lcmdlQ29uZmlnKFBSRVNFVF9ERUZBVUxUU1twcmVzZXRdLCBvcHRpb25zLmNvbmZpZylcbiAgICAgIH1cbiAgICA6IG9wdGlvbnNcblxuICB2YWxpZGF0ZUxvZ1JvdGF0aW9uKHJlc29sdmVkLmNvbmZpZylcbiAgcmV0dXJuIHJlc29sdmVkXG59XG4iLAogICAgIi8qKiBIVFRQIGBSZXF1ZXN0YCBvciBXZWJTb2NrZXQgaW5zdGFuY2UgZm9yIGFjY3VtdWxhdGVkIGNvbnRleHQuICovXG5leHBvcnQgdHlwZSBDb250ZXh0S2V5ID0gUmVxdWVzdCB8IG9iamVjdFxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0U3RvcmUge1xuICBjbGVhckNvbnRleHQ6IChrZXk6IENvbnRleHRLZXkpID0+IHZvaWRcbiAgZ2V0Q29udGV4dDogKGtleTogQ29udGV4dEtleSkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4gIG1lcmdlQ29udGV4dDogKGtleTogQ29udGV4dEtleSwgcGFydGlhbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUgPSAoKTogUmVxdWVzdENvbnRleHRTdG9yZSA9PiB7XG4gIGNvbnN0IGJhZ3MgPSBuZXcgV2Vha01hcDxDb250ZXh0S2V5LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKVxuXG4gIGNvbnN0IGdldE9yQ3JlYXRlID0gKGtleTogQ29udGV4dEtleSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBsZXQgYmFnID0gYmFncy5nZXQoa2V5KVxuICAgIGlmICghYmFnKSB7XG4gICAgICBiYWcgPSB7fVxuICAgICAgYmFncy5zZXQoa2V5LCBiYWcpXG4gICAgfVxuICAgIHJldHVybiBiYWdcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xlYXJDb250ZXh0KGtleSkge1xuICAgICAgYmFncy5kZWxldGUoa2V5KVxuICAgIH0sXG4gICAgZ2V0Q29udGV4dChrZXkpIHtcbiAgICAgIGNvbnN0IGJhZyA9IGJhZ3MuZ2V0KGtleSlcbiAgICAgIHJldHVybiBiYWcgPyB7IC4uLmJhZyB9IDoge31cbiAgICB9LFxuICAgIG1lcmdlQ29udGV4dChrZXksIHBhcnRpYWwpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJ0aWFsKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBiYWcgPSBnZXRPckNyZWF0ZShrZXkpXG4gICAgICBPYmplY3QuYXNzaWduKGJhZywgcGFydGlhbClcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFjY3VtdWxhdGVkIHJlcXVlc3QgY29udGV4dCBmaXJzdDsgZXhwbGljaXQgYGRhdGEuY29udGV4dGAgd2lucyBvbiBrZXkgY29sbGlzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IG1lcmdlTG9nRGF0YUNvbnRleHQgPSAoXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBhY2N1bXVsYXRlZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IGV4cGxpY2l0ID0gZGF0YS5jb250ZXh0XG4gIGNvbnN0IGhhc0FjY3VtdWxhdGVkID0gT2JqZWN0LmtleXMoYWNjdW11bGF0ZWQpLmxlbmd0aCA+IDBcbiAgY29uc3QgaGFzRXhwbGljaXQgPVxuICAgIGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgJiZcbiAgICBleHBsaWNpdCAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBleHBsaWNpdCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShleHBsaWNpdCkgJiZcbiAgICBPYmplY3Qua2V5cyhleHBsaWNpdCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcblxuICBpZiAoIShoYXNBY2N1bXVsYXRlZCB8fCBoYXNFeHBsaWNpdCkpIHtcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgY29uc3QgbWVyZ2VkQ29udGV4dCA9IHtcbiAgICAuLi5hY2N1bXVsYXRlZCxcbiAgICAuLi4oaGFzRXhwbGljaXQgPyAoZXhwbGljaXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge30pXG4gIH1cblxuICByZXR1cm4geyAuLi5kYXRhLCBjb250ZXh0OiBtZXJnZWRDb250ZXh0IH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJ1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0U2NvcGVkTG9nZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGNvbnN0IGxvZ2dlclN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+ID1cbiAgbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFJlcXVlc3RTY29wZWRMb2dnZXI+KClcblxuY29uc3QgTk9PUF9MT0dHRVI6IFJlcXVlc3RTY29wZWRMb2dnZXIgPSB7XG4gIGRlYnVnOiAoKSA9PiB1bmRlZmluZWQsXG4gIGVycm9yOiAoKSA9PiB1bmRlZmluZWQsXG4gIGluZm86ICgpID0+IHVuZGVmaW5lZCxcbiAgbWVyZ2VDb250ZXh0OiAoKSA9PiB1bmRlZmluZWQsXG4gIHdhcm46ICgpID0+IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgdXNlTG9nZ2VyID0gKCk6IFJlcXVlc3RTY29wZWRMb2dnZXIgPT5cbiAgbG9nZ2VyU3RvcmFnZS5nZXRTdG9yZSgpID8/IE5PT1BfTE9HR0VSXG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7IHZlcnNpb24gfSA9IGVseXNpYVBrZ1xuICBjb25zdCB2ZXJzaW9uTGluZSA9IHZlcnNpb24gPyBgRWx5c2lhIHYke3ZlcnNpb259YCA6ICdFbHlzaWEnXG5cbiAgY29uc3Qgcm93czogUm93U3BlY1tdID0gW1xuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2NlbnRlcicsIHRleHQ6IHZlcnNpb25MaW5lIH0sXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnbGVmdCcsIHRleHQ6IHVybERpc3BsYXlMaW5lIH1cbiAgXVxuICBpZiAobG9naXhseXNpYUxpbmUpIHtcbiAgICByb3dzLnB1c2goeyBraW5kOiAnbGVmdCcsIHRleHQ6IGxvZ2l4bHlzaWFMaW5lIH0pXG4gIH1cbiAgcm93cy5wdXNoKHsga2luZDogJ2VtcHR5JyB9KVxuXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KFxuICAgIHZlcnNpb25MaW5lLmxlbmd0aCxcbiAgICB1cmxEaXNwbGF5TGluZS5sZW5ndGgsXG4gICAgLi4uKGxvZ2l4bHlzaWFMaW5lID8gW2xvZ2l4bHlzaWFMaW5lLmxlbmd0aF0gOiBbMF0pXG4gIClcbiAgY29uc3QgaW5uZXJXaWR0aCA9IGNvbnRlbnRXaWR0aCArIDRcblxuICBjb25zdCB0b3AgPSBg4pSMJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSQYFxuICBjb25zdCBib3QgPSBg4pSUJHsn4pSAJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSYYFxuICBjb25zdCBlbXB0eVJvdyA9IGDilIIkeycgJy5yZXBlYXQoaW5uZXJXaWR0aCl94pSCYFxuXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbdG9wXVxuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgaWYgKHJvdy5raW5kID09PSAnZW1wdHknKSB7XG4gICAgICBvdXQucHVzaChlbXB0eVJvdylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChyb3cua2luZCA9PT0gJ2NlbnRlcicpIHtcbiAgICAgIG91dC5wdXNoKGDilIIke2NlbnRlclRleHQocm93LnRleHQsIGlubmVyV2lkdGgpfeKUgmApXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IHJvd1xuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgeyBTdGF0dXNNYXAgfSBmcm9tICdlbHlzaWEnXG5cbmNvbnN0IERJR0lUU19PTkxZID0gL15cXGQrJC9cbmNvbnN0IERFTElNSVRFUlMgPSAvW18tXSsvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMSA9IC8oW2EtejAtOV0pKFtBLVpdKS9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8yID0gLyhbQS1aXSkoW0EtWl1bYS16XSkvZ1xuY29uc3QgQVBPU1RST1BIRVMgPSAvWyfigJldL2dcbmNvbnN0IE5PTl9BTFBIQU5VTUVSSUMgPSAvW15hLXowLTlcXHNdKy9nXG5jb25zdCBXSElURVNQQUNFID0gL1xccysvZ1xuXG5jb25zdCBub3JtYWxpemVTdGF0dXNOYW1lID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBIYW5kbGVzIGNvbW1vbiB2YXJpYW50czpcbiAgLy8gLSBjYXNlIGRpZmZlcmVuY2VzOiBcIm5vdCBmb3VuZFwiIHZzIFwiTm90IEZvdW5kXCJcbiAgLy8gLSBzcGFjaW5nL3B1bmN0dWF0aW9uOiBcIk5vdC1Gb3VuZFwiLCBcIm5vdF9mb3VuZFwiXG4gIC8vIC0gY2FtZWxDYXNlL1Bhc2NhbENhc2U6IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiXG4gIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICByZXR1cm4gdHJpbW1lZFxuICAgIC5yZXBsYWNlKERFTElNSVRFUlMsICcgJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8xLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzIsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQVBPU1RST1BIRVMsICcnKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoTk9OX0FMUEhBTlVNRVJJQywgJyAnKVxuICAgIC5yZXBsYWNlKFdISVRFU1BBQ0UsICcgJylcbiAgICAudHJpbSgpXG59XG5cbmNvbnN0IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUgPSAoKCkgPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMoU3RhdHVzTWFwKSkge1xuICAgIG1hcC5zZXQobm9ybWFsaXplU3RhdHVzTmFtZShuYW1lKSwgY29kZSlcbiAgfVxuXG4gIHJldHVybiBtYXBcbn0pKClcblxuZXhwb3J0IGNvbnN0IGdldFN0YXR1c0NvZGUgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKClcbiAgICBpZiAoRElHSVRTX09OTFkudGVzdCh0cmltbWVkKSkge1xuICAgICAgcmV0dXJuIE51bWJlcih0cmltbWVkKVxuICAgIH1cblxuICAgIGNvbnN0IGtub3duID0gU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRS5nZXQobm9ybWFsaXplU3RhdHVzTmFtZSh0cmltbWVkKSlcbiAgICByZXR1cm4ga25vd24gPz8gNTAwXG4gIH1cblxuICByZXR1cm4gNTAwXG59XG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgcHJldHR5IGZyb20gJ3Bpbm8tcHJldHR5J1xuaW1wb3J0IHtcbiAgY3JlYXRlUmVxdWVzdENvbnRleHRTdG9yZSxcbiAgbWVyZ2VMb2dEYXRhQ29udGV4dCxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dFN0b3JlXG59IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyA9IHt9LFxuICBwaW5vRmFjdG9yeTogdHlwZW9mIHBpbm8gPSBwaW5vLFxuICBleHRlcm5hbENvbnRleHRTdG9yZT86IFJlcXVlc3RDb250ZXh0U3RvcmVcbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbnRleHRTdG9yZSA9IGV4dGVybmFsQ29udGV4dFN0b3JlID8/IGNyZWF0ZVJlcXVlc3RDb250ZXh0U3RvcmUoKVxuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBwcmV0dHlQcmludE9wdGlvbnMgPVxuICAgIHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgJiYgcHJldHR5UHJpbnQgIT09IG51bGxcbiAgICAgID8gKHByZXR0eVByaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBlbmFibGVQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgfHwgcHJldHR5UHJpbnRPcHRpb25zICE9PSB1bmRlZmluZWRcblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgZW5hYmxlUHJldHR5UHJpbnQgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCBtZXNzYWdlS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5tZXNzYWdlS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz9cbiAgICBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5XG4gIGNvbnN0IGVycm9yS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5lcnJvcktleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHBpbm9PcHRpb25zLmVycm9yS2V5XG5cbiAgY29uc3QgYmFzZVBpbm9PcHRpb25zID0ge1xuICAgIC4uLnBpbm9PcHRpb25zLFxuICAgIGVycm9yS2V5LFxuICAgIGxldmVsOiBwaW5vT3B0aW9ucy5sZXZlbCA/PyAnaW5mbycsXG4gICAgbWVzc2FnZUtleVxuICB9XG5cbiAgbGV0IHBpbm9Mb2dnZXI6IFBpbm9cblxuICBpZiAoc2hvdWxkUHJldHR5UHJpbnQpIHtcbiAgICBjb25zdCBwcmV0dHlTdHJlYW0gPSBwcmV0dHkoe1xuICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcbiAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgLi4ucHJldHR5UHJpbnRPcHRpb25zLFxuICAgICAgZXJyb3JLZXksXG4gICAgICBtZXNzYWdlS2V5XG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcblxuICAgIHBpbm9Mb2dnZXIgPSBwaW5vRmFjdG9yeShiYXNlUGlub09wdGlvbnMsIHByZXR0eVN0cmVhbSlcbiAgfSBlbHNlIHtcbiAgICBwaW5vTG9nZ2VyID0gcGlub0ZhY3Rvcnkoe1xuICAgICAgLi4uYmFzZVBpbm9PcHRpb25zLFxuICAgICAgdHJhbnNwb3J0OiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgc2hvdWxkTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbG9nRmlsdGVyPzogTG9nRmlsdGVyKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFsb2dGaWx0ZXI/LmxldmVsIHx8IGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMobGV2ZWwpXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBoYXNUcmFuc3BvcnRzID0gKGNvbmZpZz8udHJhbnNwb3J0cz8ubGVuZ3RoID8/IDApID4gMFxuICBjb25zdCBoYXNGaWxlTG9nZ2luZyA9XG4gICAgISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpICYmICEhY29uZmlnPy5sb2dGaWxlUGF0aFxuICBjb25zdCBoYXNJbnRlcm5hbExvZ2dlciA9ICEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUludGVybmFsTG9nZ2VyKVxuICBjb25zdCBpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgPSAhKFxuICAgIGhhc1RyYW5zcG9ydHMgfHxcbiAgICBoYXNGaWxlTG9nZ2luZyB8fFxuICAgIGhhc0ludGVybmFsTG9nZ2VyXG4gIClcblxuICBjb25zdCBsb2cgPSAoXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHN0b3JlOiBTdG9yZURhdGFcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzRWZmZWN0aXZlbHlEaXNhYmxlZCB8fCAhc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IG1lcmdlTG9nRGF0YUNvbnRleHQoXG4gICAgICBkYXRhLFxuICAgICAgY29udGV4dFN0b3JlLmdldENvbnRleHQocmVxdWVzdClcbiAgICApXG4gICAgY29uc3QgbG9nRGF0YSA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YVdpdGhDb250ZXh0KSA6IGRhdGFXaXRoQ29udGV4dFxuICAgIGNvbnN0IGxvZ1JlcXVlc3QgPVxuICAgICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICAgIGlmIChoYXNUcmFuc3BvcnRzKSB7XG4gICAgICBsb2dUb1RyYW5zcG9ydHMoe1xuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgICAgc3RvcmVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGhhc0ZpbGVMb2dnaW5nKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IGNvbmZpZz8ubG9nRmlsZVBhdGhcbiAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICAgIHN0b3JlXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvKiBJZ25vcmUgZXJyb3JzICovXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFoYXNJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgbGV2ZWwsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIHN0b3JlXG4gICAgfSlcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnREVCVUcnOiB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0lORk8nOiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnV0FSTklORyc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ1dpdGhDb250ZXh0ID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc0VmZmVjdGl2ZWx5RGlzYWJsZWQgfHwgIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZTogcHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgfVxuICAgIGxvZyhsZXZlbCwgcmVxdWVzdCwgeyBjb250ZXh0LCBtZXNzYWdlIH0sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkZWJ1ZzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdERUJVRycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBnZXRDb250ZXh0OiByZXF1ZXN0ID0+IGNvbnRleHRTdG9yZS5nZXRDb250ZXh0KHJlcXVlc3QpLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucywgY29udGV4dFN0b3JlKVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGxvZyxcbiAgICBtZXJnZUNvbnRleHQ6IChyZXF1ZXN0LCBwYXJ0aWFsKSA9PiB7XG4gICAgICBjb250ZXh0U3RvcmUubWVyZ2VDb250ZXh0KHJlcXVlc3QsIHBhcnRpYWwpXG4gICAgfSxcbiAgICBwaW5vOiBwaW5vTG9nZ2VyLFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5cbi8qKiBQbHVnaW4gZW50cnk6IHNoYXJlcyBvbmUgcmVxdWVzdC1jb250ZXh0IHN0b3JlIGFjcm9zcyB0aGUgRWx5c2lhIGxpZmVjeWNsZS4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVQbHVnaW5Mb2dnZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGNvbnRleHRTdG9yZTogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogTG9nZ2VyID0+IGNyZWF0ZUxvZ2dlcihvcHRpb25zLCBwaW5vLCBjb250ZXh0U3RvcmUpXG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5sZXQgbGFzdFRyYW5zcG9ydEVycm9yQXQgPSAwXG5jb25zdCBUUkFOU1BPUlRfRVJST1JfSU5URVJWQUxfTVMgPSA1MDAwXG5cbmNvbnN0IHJlcG9ydFRyYW5zcG9ydEVycm9yID0gKGVycm9yOiB1bmtub3duKTogdm9pZCA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgaWYgKG5vdyAtIGxhc3RUcmFuc3BvcnRFcnJvckF0IDwgVFJBTlNQT1JUX0VSUk9SX0lOVEVSVkFMX01TKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGFzdFRyYW5zcG9ydEVycm9yQXQgPSBub3dcbiAgY29uc29sZS5lcnJvcignW2xvZ2l4bHlzaWFdIHRyYW5zcG9ydCBmYWlsZWQ6JywgZXJyb3IpXG59XG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvVHJhbnNwb3J0cyA9IChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb1RyYW5zcG9ydHNJbnB1dF1cbiAgICB8IFtMb2dMZXZlbCwgUmVxdWVzdEluZm8sIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBTdG9yZURhdGEsIE9wdGlvbnNdXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvVHJhbnNwb3J0c0lucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8ge1xuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgbGV2ZWw6IGFyZ3NbMF0sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIHN0b3JlOiBhcmdzWzNdXG4gICAgICAgIH1cbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCB0cmFuc3BvcnRzID0gb3B0aW9ucy5jb25maWc/LnRyYW5zcG9ydHMgPz8gW11cbiAgaWYgKHRyYW5zcG9ydHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybFxuICAgIH0sXG4gICAgLi4uZGF0YSxcbiAgICBkdXJhdGlvbk1zOlxuICAgICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICAgID8gMFxuICAgICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG4gIH1cblxuICBmb3IgKGNvbnN0IHRyYW5zcG9ydCBvZiB0cmFuc3BvcnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyYW5zcG9ydC5sb2cobGV2ZWwsIG1lc3NhZ2UsIG1ldGEpXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdCAmJlxuICAgICAgICB0eXBlb2YgKHJlc3VsdCBhcyB7IGNhdGNoPzogdW5rbm93biB9KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIDsocmVzdWx0IGFzIFByb21pc2U8dm9pZD4pLmNhdGNoKHJlcG9ydFRyYW5zcG9ydEVycm9yKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXBvcnRUcmFuc3BvcnRFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbi8vIFBlci1maWxlIG11dGV4IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGR1cmluZyByb3RhdGlvblxuY29uc3QgZmlsZUxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KClcblxuY29uc3QgYWNxdWlyZUxvY2sgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID8/IFByb21pc2UucmVzb2x2ZSgpXG5cbiAgbGV0IHJlc29sdmVMb2NrOiAoKSA9PiB2b2lkXG4gIGNvbnN0IG5ld0xvY2sgPSBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlTG9jayA9IHJlc29sdmVcbiAgfSlcblxuICAvLyBSZWdpc3RlciBiZWZvcmUgYXdhaXRpbmc6IHNhbWUtdGljayBjYWxsZXJzIG11c3QgY2hhaW4gb250byBUSElTIGxvY2suXG4gIGZpbGVMb2Nrcy5zZXQoZmlsZVBhdGgsIG5ld0xvY2spXG5cbiAgYXdhaXQgcHJpb3JcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIHJlc29sdmVMb2NrPy4oKVxuICAgIGlmIChmaWxlTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgZmlsZUxvY2tzLmRlbGV0ZShmaWxlUGF0aClcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIExvZ1RvRmlsZUlucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgZmlsZVBhdGg6IHN0cmluZ1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgb3B0aW9uczogT3B0aW9uc1xuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBzdG9yZTogU3RvcmVEYXRhXG59XG5cbmV4cG9ydCBjb25zdCBsb2dUb0ZpbGUgPSBhc3luYyAoXG4gIC4uLmFyZ3M6XG4gICAgfCBbTG9nVG9GaWxlSW5wdXRdXG4gICAgfCBbXG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgIFJlcXVlc3RJbmZvLFxuICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICBPcHRpb25zXG4gICAgICBdXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgaW5wdXQ6IExvZ1RvRmlsZUlucHV0ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZydcbiAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBbXG4gICAgICAgICAgICBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZUFyZyxcbiAgICAgICAgICAgIG9wdGlvbnNBcmdcbiAgICAgICAgICBdID0gYXJncyBhcyBbXG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgICAgIFJlcXVlc3RJbmZvLFxuICAgICAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgICAgICBPcHRpb25zXG4gICAgICAgICAgXVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmdcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgIDogYXJnc1swXVxuXG4gIGNvbnN0IHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gIGNvbnN0IGRpc2FibGVGaWxlTG9nZ2luZyA9IGNvbmZpZz8uZGlzYWJsZUZpbGVMb2dnaW5nID09PSB0cnVlXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgLy8gU2FmZWx5IHBhcnNlIFVSTCB0byBhdm9pZCBjcmFzaGVzIG9uIG1hbGZvcm1lZCBVUkxzXG4gIGxldCBwYXRobmFtZSA9ICcvJ1xuICB0cnkge1xuICAgIGNvbnN0IHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gICAgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zID8gYCR7cmF3UGF0aG5hbWV9JHtzZWFyY2h9YCA6IHJhd1BhdGhuYW1lXG4gIH0gY2F0Y2gge1xuICAgIC8vIEZhbGxiYWNrIHRvIHJhdyBVUkwgaWYgcGFyc2luZyBmYWlsc1xuICAgIHBhdGhuYW1lID0gcmVxdWVzdC51cmxcbiAgfVxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtwYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICAvLyBBY3F1aXJlIGxvY2sgYmVmb3JlIGFueSBmaWxlIG9wZXJhdGlvbnMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgY29uc3QgcmVsZWFzZUxvY2sgPSBhd2FpdCBhY3F1aXJlTG9jayhmaWxlUGF0aClcblxuICB0cnkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gICAgICBhd2FpdCBhcHBlbmRGaWxlKGZpbGVQYXRoLCBsaW5lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExvZyBmaWxlIHdyaXRlIGVycm9ycyB0byBzdGRlcnIgc28gdGhleSdyZSBub3QgY29tcGxldGVseSBzaWxlbnRcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIHdyaXRlIHRvIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgIGVycm9yXG4gICAgICApXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGNvbnN0IHJvdGF0aW9uID0gY29uZmlnPy5sb2dSb3RhdGlvblxuICAgIGlmICghcm90YXRpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZCA9IGF3YWl0IHNob3VsZFJvdGF0ZShmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgaWYgKHNob3VsZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcGVyZm9ybVJvdGF0aW9uKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIExvZyByb3RhdGlvbiBlcnJvcnMgYnV0IGRvbid0IGNyYXNoIC0gbG9nIGVudHJ5IHdhcyBhbHJlYWR5IHdyaXR0ZW5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byByb3RhdGUgbG9nIGZpbGUgJHtmaWxlUGF0aH06YCxcbiAgICAgICAgICBlcnJvclxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIC8vIFJlbGVhc2UgbG9ja1xuICAgIHJlbGVhc2VMb2NrKClcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCBjb25zdCBlbnN1cmVEaXIgPSBhc3luYyAoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGd6aXAgfSBmcm9tICdub2RlOnpsaWInXG5pbXBvcnQgdHlwZSB7IExvZ1JvdGF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7XG4gIGdldFJvdGF0ZWRGaWxlcyxcbiAgcGFyc2VSZXRlbnRpb24sXG4gIHBhcnNlU2l6ZSxcbiAgc2hvdWxkUm90YXRlQnlTaXplXG59IGZyb20gJy4uL3V0aWxzL3JvdGF0aW9uJ1xuXG5jb25zdCBnemlwQXN5bmMgPSBwcm9taXNpZnkoZ3ppcClcblxuLy8gQ29tcHJlc3Npb24gbG9jayB0byBwcmV2ZW50IGNvbmN1cnJlbnQgY29tcHJlc3Npb24gb2YgdGhlIHNhbWUgZmlsZVxuY29uc3QgY29tcHJlc3Npb25Mb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpXG5cbmNvbnN0IGFjcXVpcmVDb21wcmVzc2lvbkxvY2sgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8KCkgPT4gdm9pZD4gPT4ge1xuICBjb25zdCBwcmlvciA9IGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA/PyBQcm9taXNlLnJlc29sdmUoKVxuXG4gIGxldCByZXNvbHZlTG9jazogKCkgPT4gdm9pZFxuICBjb25zdCBuZXdMb2NrID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgcmVzb2x2ZUxvY2sgPSByZXNvbHZlXG4gIH0pXG5cbiAgLy8gUmVnaXN0ZXIgYmVmb3JlIGF3YWl0aW5nOiBzYW1lLXRpY2sgY2FsbGVycyBtdXN0IGNoYWluIG9udG8gVEhJUyBsb2NrLlxuICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICBhd2FpdCBwcmlvclxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgcmVzb2x2ZUxvY2s/LigpXG4gICAgaWYgKGNvbXByZXNzaW9uTG9ja3MuZ2V0KGZpbGVQYXRoKSA9PT0gbmV3TG9jaykge1xuICAgICAgY29tcHJlc3Npb25Mb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gU3RyaW5nKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpLnBhZFN0YXJ0KDMsICcwJylcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9LSR7U1NTfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGJhc2VSb3RhdGVkID0gZ2V0Um90YXRlZEZpbGVOYW1lKGZpbGVQYXRoLCBuZXcgRGF0ZSgpKVxuICBjb25zdCByb3RhdGVkID0gYCR7YmFzZVJvdGF0ZWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YFxuICBhd2FpdCBmcy5yZW5hbWUoZmlsZVBhdGgsIHJvdGF0ZWQpXG4gIHJldHVybiByb3RhdGVkXG59XG5cbmV4cG9ydCBjb25zdCBjb21wcmVzc0ZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByZWxlYXNlID0gYXdhaXQgYWNxdWlyZUNvbXByZXNzaW9uTG9jayhmaWxlUGF0aClcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBmaWxlIHN0aWxsIGV4aXN0cyAobWlnaHQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIGFscmVhZHkgY29tcHJlc3NlZCBvciBkZWxldGVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXG4gICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICAgIGF3YWl0IGZzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byBjb21wcmVzcyBmaWxlICR7ZmlsZVBhdGh9OmAsIGVycm9yKVxuICAgIHRocm93IGVycm9yXG4gIH0gZmluYWxseSB7XG4gICAgcmVsZWFzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0cywgaWdub3JlIGZpbGVzIHRoYXQgd2VyZSBkZWxldGVkIGNvbmN1cnJlbnRseVxuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBpZiAoc3RhdHMubGVuZ3RoIDw9IG1heEZpbGVzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSByb3RhdGVkIGxvZyAke3RvRGVsZXRlW2lkeF0ucGF0aH06YCxcbiAgICAgICAgcmVzdWx0LnJlYXNvblxuICAgICAgKVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gIC8vIFVzZSBQcm9taXNlLmFsbFNldHRsZWQgdG8gaGFuZGxlIGluZGl2aWR1YWwgZmlsZSBzdGF0IGZhaWx1cmVzIGdyYWNlZnVsbHlcbiAgY29uc3Qgc3RhdHNSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIC8vIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBzdGF0c1xuICBjb25zdCBzdGF0cyA9IHN0YXRzUmVzdWx0c1xuICAgIC5maWx0ZXIoXG4gICAgICAoXG4gICAgICAgIHJlc3VsdFxuICAgICAgKTogcmVzdWx0IGlzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8e1xuICAgICAgICBwYXRoOiBzdHJpbmdcbiAgICAgICAgc3RhdDogaW1wb3J0KCdub2RlOmZzJykuU3RhdHNcbiAgICAgIH0+ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgKVxuICAgIC5tYXAocmVzdWx0ID0+IHJlc3VsdC52YWx1ZSlcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuXG4gIC8vIERlbGV0ZSBmaWxlcyBpbmRpdmlkdWFsbHksIGNvbnRpbnVpbmcgZXZlbiBpZiBzb21lIGZhaWxcbiAgY29uc3QgZGVsZXRlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICB0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKVxuICApXG5cbiAgLy8gTG9nIGZhaWx1cmVzIGJ1dCBkb24ndCBjcmFzaFxuICBkZWxldGVSZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGRlbGV0ZSBvbGQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgIi8vIExvY2FsIHBhcnQg4omkNjQsIGRvbWFpbiDiiaQyNTMsIFRMRCAy4oCTNjMgKFJGQyA1MzIxIC8gMTAzNS1pc2ggbGltaXRzOyBib3VuZGVkIHRvIGF2b2lkIFJlRG9TKVxuY29uc3QgRU1BSUxfUkVHRVggPVxuICAvW2EtekEtWjAtOS5fJSstXXsxLDY0fUBbYS16QS1aMC05Li1dezEsMjUzfVxcLlthLXpBLVpdezIsNjN9L2dcbmNvbnN0IElQVjRfUkVHRVggPSAvXFxiKD86XFxkezEsM31cXC4pezN9XFxkezEsM31cXGIvZ1xuLyoqIERpZ2l0IHJ1bnMgdGhhdCBtYXkgYmUgZm9ybWF0dGVkIFBBTnMgKHNwYWNlcy9kYXNoZXMpOyB2YWxpZGF0ZWQgd2l0aCBMdWhuIGJlZm9yZSByZWRhY3RpbmcuICovXG5jb25zdCBDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVggPSAvXFxiKD86XFxkWyAtXSo/KXsxMywxOX1cXGIvZ1xuY29uc3QgSldUX1JFR0VYID0gL2V5SlthLXpBLVowLTlfLV0rXFwuZXlKW2EtekEtWjAtOV8tXStcXC5bYS16QS1aMC05Xy1dKy9nXG5cbmNvbnN0IFBBTl9NSU5fTEVOID0gMTNcbmNvbnN0IFBBTl9NQVhfTEVOID0gMTlcblxuY29uc3QgUkVEQUNURURfVEVYVCA9ICdbUkVEQUNURURdJ1xuY29uc3QgQ0lSQ1VMQVJfUkVGID0gJ1tDaXJjdWxhcl0nXG5cbi8qKlxuICogSG9zdCBhbmQgdXNlcmluZm8gY2Fubm90IGNvbnRhaW4gYFtSRURBQ1RFRF1gIOKAlCBgW2AgYmVnaW5zIGFuIElQdjYgbGl0ZXJhbCBpbiBVUkxzIGFuZCBicmVha3MgcGFyc2luZy5cbiAqL1xuY29uc3QgVVJMX1NBRkVfUkVEQUNUID0gJ3JlZGFjdGVkJ1xuXG5jb25zdCByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgcmVkYWN0U3RyaW5nKHZhbHVlKS5yZXBsYWNlQWxsKFJFREFDVEVEX1RFWFQsIFVSTF9TQUZFX1JFREFDVClcblxuLyoqIEFwcGx5IFBJSSByZWRhY3Rpb24gdG8gYSByZXF1ZXN0IFVSTCB3aGlsZSBrZWVwaW5nIHRoZSByZXN1bHQgcGFyc2VhYmxlIGJ5IHRoZSBVUkwvUmVxdWVzdCBjb25zdHJ1Y3RvcnMuICovXG5jb25zdCByZWRhY3RSZXF1ZXN0VXJsID0gKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmxTdHJpbmcpXG4gICAgaWYgKHUudXNlcm5hbWUgIT09ICcnKSB7XG4gICAgICB1LnVzZXJuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnVzZXJuYW1lKVxuICAgIH1cbiAgICBpZiAodS5wYXNzd29yZCAhPT0gJycpIHtcbiAgICAgIHUucGFzc3dvcmQgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUucGFzc3dvcmQpXG4gICAgfVxuICAgIHUuaG9zdG5hbWUgPSByZWRhY3RVcmxBdXRob3JpdHlTZWdtZW50KHUuaG9zdG5hbWUpXG4gICAgdS5wYXRobmFtZSA9IHJlZGFjdFN0cmluZyh1LnBhdGhuYW1lKVxuICAgIHUuc2VhcmNoID0gcmVkYWN0U3RyaW5nKHUuc2VhcmNoKVxuICAgIHUuaGFzaCA9IHJlZGFjdFN0cmluZyh1Lmhhc2gpXG4gICAgcmV0dXJuIHUudG9TdHJpbmcoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmVkYWN0U3RyaW5nKHVybFN0cmluZykucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG4gIH1cbn1cblxuLyoqIEx1aG4gY2hlY2tzdW07IGBkaWdpdHNgIG11c3QgY29udGFpbiBvbmx5IGAwLTlgIGFuZCBsZW5ndGggaW4gUEFOIHJhbmdlLiAqL1xuY29uc3QgcGFzc2VzTHVobiA9IChkaWdpdHM6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGlnaXRzLmxlbmd0aCA8IFBBTl9NSU5fTEVOIHx8IGRpZ2l0cy5sZW5ndGggPiBQQU5fTUFYX0xFTikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IHN1bSA9IDBcbiAgbGV0IGFsdGVybmF0ZSA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgIGNvbnN0IGNvZGUgPSBkaWdpdHMuY2hhckNvZGVBdChpKVxuICAgIGlmIChjb2RlIDwgNDggfHwgY29kZSA+IDU3KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IG4gPSBjb2RlIC0gNDhcbiAgICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgICBuICo9IDJcbiAgICAgIGlmIChuID4gOSkge1xuICAgICAgICBuIC09IDlcbiAgICAgIH1cbiAgICB9XG4gICAgc3VtICs9IG5cbiAgICBhbHRlcm5hdGUgPSAhYWx0ZXJuYXRlXG4gIH1cblxuICByZXR1cm4gc3VtICUgMTAgPT09IDBcbn1cblxuY29uc3QgcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gIHRleHQucmVwbGFjZShDUkVESVRfQ0FSRF9DQU5ESURBVEVfUkVHRVgsIG1hdGNoID0+IHtcbiAgICBjb25zdCBkaWdpdHMgPSBtYXRjaC5yZXBsYWNlKC9cXEQvZywgJycpXG4gICAgaWYgKFxuICAgICAgZGlnaXRzLmxlbmd0aCA+PSBQQU5fTUlOX0xFTiAmJlxuICAgICAgZGlnaXRzLmxlbmd0aCA8PSBQQU5fTUFYX0xFTiAmJlxuICAgICAgcGFzc2VzTHVobihkaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gUkVEQUNURURfVEVYVFxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hcbiAgfSlcblxuZXhwb3J0IGNvbnN0IHJlZGFjdFN0cmluZyA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzdWx0ID0gdGV4dFxuXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEVNQUlMX1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShJUFY0X1JFR0VYLCBSRURBQ1RFRF9URVhUKVxuICByZXN1bHQgPSByZWRhY3RDcmVkaXRDYXJkQ2FuZGlkYXRlcyhyZXN1bHQpXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEpXVF9SRUdFWCwgUkVEQUNURURfVEVYVClcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmNvbnN0IHJlZGFjdEVycm9yQ2xvbmUgPSAoXG4gIG9yaWdpbmFsRXJyb3I6IEVycm9yLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IEVycm9yICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSByZWRhY3RTdHJpbmcob3JpZ2luYWxFcnJvci5tZXNzYWdlKVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbEVycm9yKSBhcyBvYmplY3RcbiAgY29uc3QgbmV3RXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvKSBhcyBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgbmV3RXJyb3IubWVzc2FnZSA9IHJlZGFjdGVkTWVzc2FnZVxuICBuZXdFcnJvci5uYW1lID0gb3JpZ2luYWxFcnJvci5uYW1lXG5cbiAgaWYgKG9yaWdpbmFsRXJyb3Iuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgIG5ld0Vycm9yLnN0YWNrID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3Iuc3RhY2spXG4gIH1cblxuICBjb25zdCBlcnJvclJlY29yZCA9IG9yaWdpbmFsRXJyb3IgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9yUmVjb3JkKSkge1xuICAgIGlmIChrZXkgIT09ICdtZXNzYWdlJyAmJiBrZXkgIT09ICduYW1lJyAmJiBrZXkgIT09ICdzdGFjaycpIHtcbiAgICAgIG5ld0Vycm9yW2tleV0gPSByZWRhY3RJbm5lcihlcnJvclJlY29yZFtrZXldLCBpblByb2dyZXNzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFcnJvclxufVxuXG5jb25zdCByZWRhY3RBcnJheUl0ZW1zID0gKFxuICB2YWx1ZTogdW5rbm93bltdLFxuICBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD5cbik6IHVua25vd25bXSA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkQXJyYXk6IHVua25vd25bXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHZhbHVlLmxlbmd0aCB9KVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgcmVkYWN0ZWRBcnJheVtpXSA9IHJlZGFjdElubmVyKHZhbHVlW2ldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZEFycmF5XG59XG5cbmNvbnN0IHJlZGFjdFJlY29yZEVudHJpZXMgPSAoXG4gIHJlY29yZFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZFZhbHVlKSkge1xuICAgIHJlZGFjdGVkUmVjb3JkW2tleV0gPSByZWRhY3RJbm5lcihyZWNvcmRWYWx1ZVtrZXldLCBpblByb2dyZXNzKVxuICB9XG4gIHJldHVybiByZWRhY3RlZFJlY29yZFxufVxuXG5jb25zdCB3aXRoUmVlbnRyYW5jeUd1YXJkID0gPFQ+KFxuICBvYmo6IG9iamVjdCxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+LFxuICBydW46ICgpID0+IFRcbik6IFQgPT4ge1xuICBpblByb2dyZXNzLmFkZChvYmopXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJ1bigpXG4gIH0gZmluYWxseSB7XG4gICAgaW5Qcm9ncmVzcy5kZWxldGUob2JqKVxuICB9XG59XG5cbmNvbnN0IHJlZGFjdElubmVyID0gPFQ+KHZhbHVlOiBULCBpblByb2dyZXNzOiBXZWFrU2V0PG9iamVjdD4pOiBUID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh2YWx1ZSkgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkpIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0XG4gIGlmIChpblByb2dyZXNzLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIENJUkNVTEFSX1JFRiBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0RXJyb3JDbG9uZSh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgICAgcmVkYWN0QXJyYXlJdGVtcyh2YWx1ZSwgaW5Qcm9ncmVzcylcbiAgICApIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgcmV0dXJuIHdpdGhSZWVudHJhbmN5R3VhcmQob2JqLCBpblByb2dyZXNzLCAoKSA9PlxuICAgIHJlZGFjdFJlY29yZEVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGluUHJvZ3Jlc3MpXG4gICkgYXMgdW5rbm93biBhcyBUXG59XG5cbmV4cG9ydCBjb25zdCByZWRhY3QgPSA8VD4odmFsdWU6IFQpOiBUID0+IHJlZGFjdElubmVyKHZhbHVlLCBuZXcgV2Vha1NldCgpKVxuXG4vKipcbiAqIENsb25lIHJlcXVlc3QgVVJMLCBtZXRob2QgYW5kIGhlYWRlcnMgZm9yIGxvZ2dpbmcgd2l0aCB0aGUgc2FtZSBzdHJpbmcgcmVkYWN0aW9uIGFzIHtAbGluayByZWRhY3R9LlxuICogVGhlIHJldHVybmVkIHJlcXVlc3QgaXMgYSBsb2dnaW5nLW9ubHkgYXJ0aWZhY3QgY2FycnlpbmcgdXJsL21ldGhvZC9oZWFkZXJzL3NpZ25hbDsgaXQgaW50ZW50aW9uYWxseVxuICogb21pdHMgdGhlIGJvZHkgc28gaXQgbmV2ZXIgcmUtdXNlcyB0aGUgb3JpZ2luYWwgKHBvc3NpYmx5IGFscmVhZHktY29uc3VtZWQpIHJlcXVlc3Qgc3RyZWFtLiBUaGVcbiAqIG9yaWdpbmFsIHJlcXVlc3QgaXMgbGVmdCB1bnRvdWNoZWQgYW5kIHJlbWFpbnMgdXNhYmxlLlxuICovXG5leHBvcnQgY29uc3QgcmVkYWN0UmVxdWVzdCA9IChyZXF1ZXN0OiBSZXF1ZXN0KTogUmVxdWVzdCA9PiB7XG4gIGNvbnN0IHJlZGFjdGVkVXJsID0gcmVkYWN0UmVxdWVzdFVybChyZXF1ZXN0LnVybClcbiAgY29uc3QgbmV4dEhlYWRlcnMgPSBuZXcgSGVhZGVycygpXG4gIGxldCBoZWFkZXJzQ2hhbmdlZCA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCByZWRhY3RlZCA9IHJlZGFjdFN0cmluZyh2YWx1ZSlcbiAgICBpZiAocmVkYWN0ZWQgIT09IHZhbHVlKSB7XG4gICAgICBoZWFkZXJzQ2hhbmdlZCA9IHRydWVcbiAgICB9XG4gICAgbmV4dEhlYWRlcnMuc2V0KG5hbWUsIHJlZGFjdGVkKVxuICB9XG5cbiAgY29uc3QgcmVkYWN0ZWRNZXRob2QgPSByZWRhY3RTdHJpbmcocmVxdWVzdC5tZXRob2QpXG4gIGNvbnN0IHVybENoYW5nZWQgPSByZWRhY3RlZFVybCAhPT0gcmVxdWVzdC51cmxcbiAgY29uc3QgbWV0aG9kQ2hhbmdlZCA9IHJlZGFjdGVkTWV0aG9kICE9PSByZXF1ZXN0Lm1ldGhvZFxuXG4gIGlmICghKHVybENoYW5nZWQgfHwgaGVhZGVyc0NoYW5nZWQgfHwgbWV0aG9kQ2hhbmdlZCkpIHtcbiAgICByZXR1cm4gcmVxdWVzdFxuICB9XG5cbiAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgaGVhZGVyczogbmV4dEhlYWRlcnMsXG4gICAgbWV0aG9kOiByZWRhY3RlZE1ldGhvZCxcbiAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsXG4gIH1cblxuICByZXR1cm4gbmV3IFJlcXVlc3QocmVkYWN0ZWRVcmwsIGluaXQpXG59XG4iLAogICAgImltcG9ydCB7IFNUQVRVU19DT0RFUyB9IGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcbmltcG9ydCB7IGdldFN0YXR1c0NvZGUgfSBmcm9tICcuLi9oZWxwZXJzL3N0YXR1cydcbmltcG9ydCB0eXBlIHtcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGlzU3RydWN0dXJlZEVycm9yLCBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3QgREVGQVVMVF9TTE9XX01TID0gNTAwXG5jb25zdCBERUZBVUxUX1ZFUllfU0xPV19NUyA9IDEwMDBcbmNvbnN0IE1FVEhPRF9QQUQgPSA3XG5cbmNvbnN0IERFRkFVTFRfTE9HX0ZPUk1BVCA9XG4gICd7bm93fSB7c2VydmljZX17aWNvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7ZHVyYXRpb259IHttZXNzYWdlfXtzcGVlZH0nXG5cbmNvbnN0IExPR19GT1JNQVRfUkVHRVggPVxuICAvXFx7KG5vd3xlcG9jaHxsZXZlbHxpY29ufGR1cmF0aW9ufG1ldGhvZHxwYXRobmFtZXxwYXRofHF1ZXJ5fHN0YXR1c3xzdGF0dXNUZXh0fG1lc3NhZ2V8aXB8Y29udGV4dHxzZXJ2aWNlfHNwZWVkfHJlcXVlc3RJZClcXH0vZ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZExvZ091dHB1dCB7XG4gIGNvbnRleHRMaW5lczogc3RyaW5nW11cbiAgbWFpbjogc3RyaW5nXG59XG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbi8qKiBSZXNvbHZlcyBjbGllbnQgSVAgZnJvbSB4LWZvcndhcmRlZC1mb3IgKGZpcnN0IElQKSBvciB4LXJlYWwtaXAuIEVtcHR5IHdoZW4gbmVpdGhlciBoZWFkZXIgaXMgc2V0IChlLmcuIGxvY2FsaG9zdCkuICovXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0SW5mbyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGlmIChmb3J3YXJkZWQpIHtcbiAgICByZXR1cm4gZm9yd2FyZGVkLnNwbGl0KCcsJylbMF0/LnRyaW0oKSA/PyAnJ1xuICB9XG4gIHJldHVybiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LXJlYWwtaXAnKSA/PyAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0RHVyYXRpb24gPSAobXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmIChtcyA+PSAxMDAwKSB7XG4gICAgY29uc3Qgc2VjID0gbXMgLyAxMDAwXG4gICAgaWYgKHNlYyA+PSAxMCkge1xuICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2VjKX1zYFxuICAgIH1cbiAgICBjb25zdCBvbmVEZWNpbWFsID0gc2VjLnRvRml4ZWQoMSlcbiAgICByZXR1cm4gb25lRGVjaW1hbC5lbmRzV2l0aCgnLjAnKSA/IGAke01hdGgucm91bmQoc2VjKX1zYCA6IGAke29uZURlY2ltYWx9c2BcbiAgfVxuICBpZiAobXMgPiAwICYmIG1zIDwgMSkge1xuICAgIHJldHVybiBgJHttcy50b0ZpeGVkKDIpfW1zYFxuICB9XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zKX1tc2Bcbn1cblxuY29uc3QgZ2V0U2xvd1RocmVzaG9sZHMgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgc2xvdzogbnVtYmVyOyB2ZXJ5U2xvdzogbnVtYmVyIH0gPT4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gb3B0aW9uc1xuICByZXR1cm4ge1xuICAgIHNsb3c6IGNvbmZpZz8uc2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1NMT1dfTVMsXG4gICAgdmVyeVNsb3c6IGNvbmZpZz8udmVyeVNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9WRVJZX1NMT1dfTVNcbiAgfVxufVxuXG5jb25zdCBjb2xvckR1cmF0aW9uVGV4dCA9IChcbiAgbXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHRleHQ6IHN0cmluZzsgaXNWZXJ5U2xvdzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcmF3ID0gZm9ybWF0RHVyYXRpb24obXMpXG4gIGNvbnN0IHsgc2xvdywgdmVyeVNsb3cgfSA9IGdldFNsb3dUaHJlc2hvbGRzKG9wdGlvbnMpXG4gIGNvbnN0IGlzVmVyeVNsb3cgPSBtcyA+PSB2ZXJ5U2xvd1xuXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogcmF3IH1cbiAgfVxuXG4gIGxldCBjb2xvcmVkID0gcmF3XG4gIGlmIChtcyA8IHNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsuZ3JlZW4ocmF3KVxuICB9IGVsc2UgaWYgKG1zIDwgdmVyeVNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsueWVsbG93KHJhdylcbiAgfSBlbHNlIHtcbiAgICBjb2xvcmVkID0gY2hhbGsucmVkLmJvbGQocmF3KVxuICB9XG5cbiAgcmV0dXJuIHsgaXNWZXJ5U2xvdywgdGV4dDogY29sb3JlZCB9XG59XG5cbmNvbnN0IGdldFNwZWVkVG9rZW4gPSAoaXNWZXJ5U2xvdzogYm9vbGVhbiwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFpc1ZlcnlTbG93KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYmFkZ2UgPSAn4pqhIHNsb3cnXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAgJHtiYWRnZX1gXG4gIH1cbiAgcmV0dXJuIGAgJHtjaGFsay55ZWxsb3coYmFkZ2UpfWBcbn1cblxuLyoqIExvZ2l4bHlzaWEgYnJhbmQ6IGZveCBlbW9qaSB3aXRoIGxldmVsLWNvbG9yZWQgYmFja2dyb3VuZCB3aGVuIGNvbG9ycyBhcmUgZW5hYmxlZC4gKi9cbmNvbnN0IGdldExldmVsSWNvbiA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuICfwn6aKJ1xuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKCcg8J+miiAnKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBsZXZlbFxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbWV0aG9kXG4gIH1cblxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3cuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xuICAgIHJldHVybiBjaGFsay5yZWQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcbiAgICByZXR1cm4gY2hhbGsubWFnZW50YS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZS5ib2xkKHVwcGVyKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkU3RhdHVzID0gKHN0YXR1czogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIucGFyc2VJbnQoc3RhdHVzLCAxMClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpZiAobnVtZXJpYyA+PSA1MDApIHtcbiAgICByZXR1cm4gY2hhbGsucmVkKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMjAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cylcbiAgfVxuICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpXG59XG5cbmNvbnN0IGdldENvbG9yZWRUaW1lc3RhbXAgPSAodGltZXN0YW1wOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcFxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmdyYXkodGltZXN0YW1wKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkUGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gcGF0aG5hbWVcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZUJyaWdodChwYXRobmFtZSlcbn1cblxuY29uc3QgZ2V0U3RhdHVzVGV4dCA9IChzdGF0dXNDb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ZXh0ID0gU1RBVFVTX0NPREVTW3N0YXR1c0NvZGVdXG4gIHJldHVybiB0ZXh0ID8/ICcnXG59XG5cbmNvbnN0IGdldFNlcnZpY2VUb2tlbiA9IChvcHRpb25zOiBPcHRpb25zLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuYW1lID0gb3B0aW9ucy5jb25maWc/LnNlcnZpY2U/LnRyaW0oKVxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBicmFja2V0ZWQgPSBgWyR7bmFtZX1dYFxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgJHticmFja2V0ZWR9IGBcbiAgfVxuICByZXR1cm4gYCR7Y2hhbGsuZGltKGJyYWNrZXRlZCl9IGBcbn1cblxuY29uc3Qgc3RyaW5naWZ5VHJlZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJ1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gdmFsdWUubWVzc2FnZVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG59XG5cbi8qKiBOZXN0ZWQgb2JqZWN0cyB0byBleHBhbmQgaW4gdGhlIGNvbnRleHQgdHJlZSAoZXhjbHVkZXMgQXJyYXlzLCBFcnJvciwgRGF0ZSkuICovXG5jb25zdCBpc0V4cGFuZGFibGVPYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKVxuXG5jb25zdCBjb2xsZWN0Q29udGV4dEVudHJpZXMgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZXB0aFJlbWFpbmluZzogbnVtYmVyXG4pOiBbc3RyaW5nLCBzdHJpbmddW10gPT4ge1xuICBjb25zdCBvdXQ6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a31gIDoga1xuICAgIGNvbnN0IGV4cGFuZGFibGUgPSBpc0V4cGFuZGFibGVPYmplY3QodikgJiYgZGVwdGhSZW1haW5pbmcgPiAxXG5cbiAgICBpZiAoZXhwYW5kYWJsZSkge1xuICAgICAgb3V0LnB1c2goLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKHYsIGtleSwgZGVwdGhSZW1haW5pbmcgLSAxKSlcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2goW2tleSwgc3RyaW5naWZ5VHJlZVZhbHVlKHYpXSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMgPSAoXG4gIGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbGFzdCA9IGVudHJpZXMubGVuZ3RoIC0gMVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBicmFuY2ggPSBpID09PSBsYXN0ID8gJ+KUlOKUgCcgOiAn4pSc4pSAJ1xuICAgIGNvbnN0IHBhaXIgPSBlbnRyaWVzW2ldXG4gICAgaWYgKCFwYWlyKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBbaywgdl0gPSBwYWlyXG4gICAgY29uc3Qga2V5UGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLmN5YW4oaykgOiBrXG4gICAgY29uc3QgdmFsUGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLndoaXRlKHYpIDogdlxuICAgIGxpbmVzLnB1c2goYCAgJHticmFuY2h9ICR7a2V5UGFydH0gICR7dmFsUGFydH1gKVxuICB9XG4gIHJldHVybiBsaW5lc1xufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgY3R4OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG4gIGlmIChkZXB0aCA8IDEpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBjb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4LCAnJywgZGVwdGgpXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBjb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyA9IChlcnJvcjogdW5rbm93bik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGNvbnN0IG1zZyA9IHBhcnNlRXJyb3IoZXJyb3IpXG4gIGlmIChtc2cpIHtcbiAgICBlbnRyaWVzLnB1c2goWydlcnJvcicsIG1zZ10pXG4gIH1cbiAgaWYgKGlzU3RydWN0dXJlZEVycm9yKGVycm9yKSkge1xuICAgIGlmIChlcnJvci53aHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3Iud2h5JywgU3RyaW5nKGVycm9yLndoeSldKVxuICAgIH1cbiAgICBpZiAoZXJyb3IuZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yLmZpeCcsIFN0cmluZyhlcnJvci5maXgpXSlcbiAgICB9XG4gICAgaWYgKGVycm9yLmxpbmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW50cmllcy5wdXNoKFsnZXJyb3IubGluaycsIFN0cmluZyhlcnJvci5saW5rKV0pXG4gICAgfVxuICAgIGlmIChlcnJvci5pbnRlcm5hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvci5pbnRlcm5hbCcsIHN0cmluZ2lmeVRyZWVWYWx1ZShlcnJvci5pbnRlcm5hbCldKVxuICAgIH1cbiAgfVxuICByZXR1cm4gZW50cmllc1xufVxuXG5leHBvcnQgY29uc3QgYnVpbGRDb250ZXh0VHJlZUxpbmVzID0gKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChvcHRpb25zLmNvbmZpZz8uc2hvd0NvbnRleHRUcmVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG5cbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cblxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKFxuICAgIGN0eCAmJlxuICAgIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoY3R4KSAmJlxuICAgIE9iamVjdC5rZXlzKGN0eCBhcyBvYmplY3QpLmxlbmd0aCA+IDAgJiZcbiAgICBkZXB0aCA+PSAxXG4gICkge1xuICAgIGVudHJpZXMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyhjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICcnLCBkZXB0aClcbiAgICApXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgJ2Vycm9yJyBpbiBkYXRhICYmIGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGVudHJpZXMucHVzaCguLi5jb2xsZWN0U3RydWN0dXJlZEVycm9yRW50cmllcyhkYXRhLmVycm9yKSlcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5jb25zdCBnZXRDb250ZXh0U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH1cblxuICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdExvZ091dHB1dCA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogRm9ybWF0dGVkTG9nT3V0cHV0ID0+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdGlvbnNcbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGZvcm1hdCA9IGNvbmZpZz8uY3VzdG9tTG9nRm9ybWF0ID8/IERFRkFVTFRfTE9HX0ZPUk1BVFxuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgZXBvY2ggPSBTdHJpbmcobm93LmdldFRpbWUoKSlcbiAgY29uc3QgcmF3VGltZXN0YW1wID0gZm9ybWF0VGltZXN0YW1wKG5vdywgY29uZmlnPy50aW1lc3RhbXA/LnRyYW5zbGF0ZVRpbWUpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGdldENvbG9yZWRUaW1lc3RhbXAocmF3VGltZXN0YW1wLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBsZXQgcmF3UGF0aG5hbWU6IHN0cmluZ1xuICBsZXQgc2VhcmNoOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICA7KHsgcGF0aG5hbWU6IHJhd1BhdGhuYW1lLCBzZWFyY2ggfSA9IG5ldyBVUkwocmVxdWVzdC51cmwpKVxuICB9IGNhdGNoIHtcbiAgICByYXdQYXRobmFtZSA9IHJlcXVlc3QudXJsIHx8ICcvJ1xuICAgIHNlYXJjaCA9ICcnXG4gIH1cbiAgY29uc3QgcXVlcnkgPSBzZWFyY2hcbiAgY29uc3QgcGF0aG5hbWUgPSBjb25maWc/LmxvZ1F1ZXJ5UGFyYW1zXG4gICAgPyBgJHtyYXdQYXRobmFtZX0ke3F1ZXJ5fWBcbiAgICA6IHJhd1BhdGhuYW1lXG4gIGNvbnN0IHN0YXR1c1ZhbHVlID0gZGF0YS5zdGF0dXNcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgc3RhdHVzVmFsdWUgPT09IG51bGwgfHwgc3RhdHVzVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAyMDBcbiAgICAgIDogZ2V0U3RhdHVzQ29kZShzdGF0dXNWYWx1ZSlcbiAgY29uc3Qgc3RhdHVzID0gU3RyaW5nKHN0YXR1c0NvZGUpXG4gIGNvbnN0IGlwID0gY29uZmlnPy5pcCA9PT0gdHJ1ZSA/IGdldElwKHJlcXVlc3QpIDogJydcblxuICBjb25zdCBzaG93VHJlZSA9IGNvbmZpZz8uc2hvd0NvbnRleHRUcmVlICE9PSBmYWxzZVxuICBjb25zdCBjdHhTdHJpbmcgPVxuICAgIHNob3dUcmVlICYmXG4gICAgZGF0YS5jb250ZXh0ICYmXG4gICAgdHlwZW9mIGRhdGEuY29udGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbnRleHQpICYmXG4gICAgT2JqZWN0LmtleXMoZGF0YS5jb250ZXh0IGFzIG9iamVjdCkubGVuZ3RoID4gMFxuICAgICAgPyAnJ1xuICAgICAgOiBnZXRDb250ZXh0U3RyaW5nKGRhdGEuY29udGV4dClcblxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgbWV0aG9kUGFkZGVkID0gcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKS5wYWRFbmQoTUVUSE9EX1BBRClcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QobWV0aG9kUGFkZGVkLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRQYXRobmFtZSA9IGdldENvbG9yZWRQYXRobmFtZShwYXRobmFtZSwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkU3RhdHVzID0gZ2V0Q29sb3JlZFN0YXR1cyhzdGF0dXMsIHVzZUNvbG9ycylcbiAgY29uc3QgeyB0ZXh0OiBjb2xvcmVkRHVyYXRpb24sIGlzVmVyeVNsb3cgfSA9IGNvbG9yRHVyYXRpb25UZXh0KFxuICAgIGR1cmF0aW9uTXMsXG4gICAgdXNlQ29sb3JzLFxuICAgIG9wdGlvbnNcbiAgKVxuICBjb25zdCBzcGVlZFRva2VuID0gZ2V0U3BlZWRUb2tlbihpc1ZlcnlTbG93LCB1c2VDb2xvcnMpXG4gIGNvbnN0IGljb24gPSBnZXRMZXZlbEljb24obGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3Qgc3RhdHVzVGV4dCA9IGdldFN0YXR1c1RleHQoc3RhdHVzQ29kZSlcbiAgY29uc3Qgc2VydmljZVRva2VuID0gZ2V0U2VydmljZVRva2VuKG9wdGlvbnMsIHVzZUNvbG9ycylcblxuICBjb25zdCB0b2tlbk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAne2NvbnRleHR9JzogY3R4U3RyaW5nLFxuICAgICd7ZHVyYXRpb259JzogY29sb3JlZER1cmF0aW9uLFxuICAgICd7ZXBvY2h9JzogZXBvY2gsXG4gICAgJ3tpY29ufSc6IGljb24sXG4gICAgJ3tpcH0nOiBpcCxcbiAgICAne2xldmVsfSc6IGNvbG9yZWRMZXZlbCxcbiAgICAne21lc3NhZ2V9JzogbWVzc2FnZSxcbiAgICAne21ldGhvZH0nOiBjb2xvcmVkTWV0aG9kLFxuICAgICd7bm93fSc6IHRpbWVzdGFtcCxcbiAgICAne3BhdGh9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cGF0aG5hbWV9JzogY29sb3JlZFBhdGhuYW1lLFxuICAgICd7cXVlcnl9JzogcXVlcnksXG4gICAgJ3tyZXF1ZXN0SWR9JzpcbiAgICAgIHR5cGVvZiBkYXRhLmNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICBkYXRhLmNvbnRleHQgIT09IG51bGwgJiZcbiAgICAgICdyZXF1ZXN0SWQnIGluIGRhdGEuY29udGV4dFxuICAgICAgICA/IFN0cmluZygoZGF0YS5jb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yZXF1ZXN0SWQpXG4gICAgICAgIDogJycsXG4gICAgJ3tzZXJ2aWNlfSc6IHNlcnZpY2VUb2tlbixcbiAgICAne3NwZWVkfSc6IHNwZWVkVG9rZW4sXG4gICAgJ3tzdGF0dXN9JzogY29sb3JlZFN0YXR1cyxcbiAgICAne3N0YXR1c1RleHR9Jzogc3RhdHVzVGV4dFxuICB9XG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdC5yZXBsYWNlKFxuICAgIExPR19GT1JNQVRfUkVHRVgsXG4gICAgbWF0Y2ggPT4gdG9rZW5NYXBbbWF0Y2hdID8/IG1hdGNoXG4gIClcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgY29udGV4dExpbmVzLCBtYWluIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLmlucHV0Lm9wdGlvbnMuY29uZmlnLFxuICAgICAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9KS5tYWluXG5cbmV4cG9ydCBjb25zdCBsb2dXaXRoUGlubyA9IChcbiAgbG9nZ2VyOiBQaW5vLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkID0+IHtcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgbG9nZ2VyLmVycm9yKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICBsb2dnZXIud2FybihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGxvZ2dlci5pbmZvKGRhdGEpXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBwYXJzZUVycm9yID0gKGVycm9yOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZVxuICB9XG4gIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9XG4gIHJldHVybiBTdHJpbmcoZXJyb3IpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RydWN0dXJlZEVycm9yIHtcbiAgZml4Pzogc3RyaW5nXG4gIGludGVybmFsPzogdW5rbm93blxuICBsaW5rPzogc3RyaW5nXG4gIHdoeT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgaXNTdHJ1Y3R1cmVkRXJyb3IgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBTdHJ1Y3R1cmVkRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICgnd2h5JyBpbiB2YWx1ZSB8fCAnZml4JyBpbiB2YWx1ZSB8fCAnbGluaycgaW4gdmFsdWUgfHwgJ2ludGVybmFsJyBpbiB2YWx1ZSlcbiIsCiAgICAiaW1wb3J0IHtcbiAgbWVyZ2VMb2dEYXRhQ29udGV4dCxcbiAgdHlwZSBSZXF1ZXN0Q29udGV4dFN0b3JlXG59IGZyb20gJy4uL2NvbnRleHQvcmVxdWVzdC1jb250ZXh0J1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB7IHJlZGFjdCwgcmVkYWN0UmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlZGFjdCdcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH0gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAnc3RhdHVzJyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogdW5rbm93bixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgY29udGV4dFN0b3JlPzogUmVxdWVzdENvbnRleHRTdG9yZVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRpb25zXG5cbiAgY29uc3Qgc3RhdHVzID0gaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXG4gIGxldCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGlmIChzdGF0dXMgPCA1MDAgJiYgc3RhdHVzID49IDQwMCkge1xuICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gIH1cblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgZXJyb3IsIG1lc3NhZ2UsIHN0YXR1cyB9XG4gIGNvbnN0IGRhdGFXaXRoQ29udGV4dCA9IGNvbnRleHRTdG9yZVxuICAgID8gbWVyZ2VMb2dEYXRhQ29udGV4dChkYXRhLCBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChyZXF1ZXN0KSlcbiAgICA6IGRhdGFcbiAgY29uc3QgbG9nRGF0YSA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0KGRhdGFXaXRoQ29udGV4dCkgOiBkYXRhV2l0aENvbnRleHRcbiAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICBsb2dUb1RyYW5zcG9ydHMoeyBkYXRhOiBsb2dEYXRhLCBsZXZlbCwgb3B0aW9ucywgcmVxdWVzdDogbG9nUmVxdWVzdCwgc3RvcmUgfSlcblxuICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICBkYXRhOiBsb2dEYXRhLFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgIHN0b3JlXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgZGF0YTogbG9nRGF0YSxcbiAgICBsZXZlbCxcbiAgICBvcHRpb25zLFxuICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgc3RvcmVcbiAgfSlcblxuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID1cbiAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cbiAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJZENvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmNvbnN0IERFRkFVTFRfSEVBREVSID0gJ1gtUmVxdWVzdC1JZCdcblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgZ2VuZXJhdG9yOiAoKSA9PiBzdHJpbmdcbiAgaGVhZGVyOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBOb3JtYWxpc2VzIHRoZSBgcmVxdWVzdElkYCBvcHRpb24gaW50byBhIGNvbmNyZXRlIGNvbmZpZyBvYmplY3QuXG4gKlxuICogLSBgdW5kZWZpbmVkYCAvIGBmYWxzZWAg4oaSIGBudWxsYCAoZGlzYWJsZWQpXG4gKiAtIGB0cnVlYCDihpIgZGVmYXVsdCBjb25maWdcbiAqIC0gYFJlcXVlc3RJZENvbmZpZ2Ag4oaSIG1lcmdlZCB3aXRoIGRlZmF1bHRzOyBgZW5hYmxlZDogZmFsc2VgIGluc2lkZSB0aGUgb2JqZWN0IGRpc2FibGVzIHRoZSBmZWF0dXJlXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlUmVxdWVzdElkQ29uZmlnID0gKFxuICByYXc/OiBib29sZWFuIHwgUmVxdWVzdElkQ29uZmlnXG4pOiBSZXNvbHZlZFJlcXVlc3RJZENvbmZpZyB8IG51bGwgPT4ge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAocmF3ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBnZW5lcmF0b3I6ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICBoZWFkZXI6IERFRkFVTFRfSEVBREVSXG4gICAgfVxuICB9XG5cbiAgLy8gT2JqZWN0IGZvcm0g4oCUIGBlbmFibGVkYCBkZWZhdWx0cyB0byBgdHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIHByb3ZpZGVkXG4gIGlmIChyYXcuZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGdlbmVyYXRvcjogcmF3LmdlbmVyYXRvciA/PyAoKCkgPT4gY3J5cHRvLnJhbmRvbVVVSUQoKSksXG4gICAgaGVhZGVyOiByYXcuaGVhZGVyPy50cmltKCkgfHwgREVGQVVMVF9IRUFERVJcbiAgfVxufVxuXG4vKipcbiAqIFJlYWRzIGFuIGV4aXN0aW5nIHJlcXVlc3QgSUQgZnJvbSB0aGUgaW5jb21pbmcgcmVxdWVzdCBoZWFkZXIsIG9yIGdlbmVyYXRlcyBhXG4gKiBuZXcgb25lIHVzaW5nIHRoZSBjb25maWd1cmVkIGdlbmVyYXRvci5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlUmVxdWVzdElkID0gKFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBjb25maWc6IFJlc29sdmVkUmVxdWVzdElkQ29uZmlnXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBleGlzdGluZyA9IHJlcXVlc3QuaGVhZGVycy5nZXQoY29uZmlnLmhlYWRlcilcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nXG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5nZW5lcmF0b3IoKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0U3RvcmUgfSBmcm9tICcuLi9jb250ZXh0L3JlcXVlc3QtY29udGV4dCdcbmltcG9ydCB0eXBlIHsgTG9nZ2VyLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldExpa2Uge1xuICByZWFkb25seSBkYXRhPzogeyBzdG9yZT86IHsgbG9nZ2VyPzogTG9nZ2VyIH0gfVxuICByZWFkb25seSBpZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdzSGFuZGxlckhvb2tzPFxuICBUTWVzc2FnZSA9IHVua25vd24sXG4gIFRXcyBleHRlbmRzIFdlYlNvY2tldExpa2UgPSBXZWJTb2NrZXRMaWtlXG4+IHtcbiAgY2xvc2U/OiAod3M6IFRXcykgPT4gdm9pZFxuICBtZXNzYWdlPzogKHdzOiBUV3MsIG1lc3NhZ2U6IFRNZXNzYWdlKSA9PiB2b2lkXG4gIG9wZW4/OiAod3M6IFRXcykgPT4gdm9pZFxufVxuXG5jb25zdCB3c1N5bnRoZXRpY1JlcXVlc3QgPSAocGF0aDogc3RyaW5nKTogUmVxdWVzdCA9PlxuICBuZXcgUmVxdWVzdChgaHR0cDovL2xvZ2l4bHlzaWEubG9jYWwke3BhdGh9YCwgeyBtZXRob2Q6ICdXUycgfSlcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVdzSGFuZGxlcldyYXBwZXIgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnMsXG4gIGxvZ2dlcjogTG9nZ2VyLFxuICBjb250ZXh0U3RvcmU6IFJlcXVlc3RDb250ZXh0U3RvcmVcbikgPT4ge1xuICBjb25zdCB3c1RpbWluZ3MgPSBuZXcgV2Vha01hcDxvYmplY3QsIGJpZ2ludD4oKVxuXG4gIGNvbnN0IGxvZ1dzID0gKFxuICAgIGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InLFxuICAgIHdzOiBXZWJTb2NrZXRMaWtlLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBrZXkgPSB3cyBhcyBvYmplY3RcbiAgICBjb25zdCBiZWZvcmVUaW1lID0gd3NUaW1pbmdzLmdldChrZXkpID8/IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpXG4gICAgY29uc3Qgc3RvcmU6IFN0b3JlRGF0YSA9IHsgYmVmb3JlVGltZSB9XG4gICAgY29uc3QgYWNjdW11bGF0ZWQgPSBjb250ZXh0U3RvcmUuZ2V0Q29udGV4dChrZXkpXG4gICAgY29uc3QgY29udGV4dCA9XG4gICAgICBPYmplY3Qua2V5cyhhY2N1bXVsYXRlZCkubGVuZ3RoID4gMCB8fCBleHRyYVxuICAgICAgICA/IHsgLi4uYWNjdW11bGF0ZWQsIC4uLmV4dHJhLCB3c0lkOiB3cy5pZCB9XG4gICAgICAgIDogeyB3c0lkOiB3cy5pZCB9XG5cbiAgICBsb2dnZXIubG9nKFxuICAgICAgbGV2ZWwsXG4gICAgICB3c1N5bnRoZXRpY1JlcXVlc3QocGF0aCksXG4gICAgICB7IGNvbnRleHQsIG1lc3NhZ2UsIHN0YXR1czogMjAwIH0sXG4gICAgICBzdG9yZVxuICAgIClcbiAgfVxuXG4gIHJldHVybiA8XG4gICAgVE1lc3NhZ2UsXG4gICAgVFdzIGV4dGVuZHMgV2ViU29ja2V0TGlrZSxcbiAgICBjb25zdCBUSG9va3MgZXh0ZW5kcyBXc0hhbmRsZXJIb29rczxUTWVzc2FnZSwgVFdzPlxuICA+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBob29rczogVEhvb2tzXG4gICk6IFRIb29rcyA9PlxuICAgICh7XG4gICAgICAuLi5ob29rcyxcbiAgICAgIGNsb3NlKHdzKSB7XG4gICAgICAgIGhvb2tzLmNsb3NlPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IGNsb3NlZCcpXG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dFN0b3JlLmNsZWFyQ29udGV4dCh3cyBhcyBvYmplY3QpXG4gICAgICAgIHdzVGltaW5ncy5kZWxldGUod3MgYXMgb2JqZWN0KVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2Uod3MsIG1lc3NhZ2UpIHtcbiAgICAgICAgaG9va3MubWVzc2FnZT8uKHdzLCBtZXNzYWdlKVxuICAgICAgICBpZiAob3B0aW9ucy5jb25maWc/LmRpc2FibGVXZWJTb2NrZXRMb2dnaW5nICE9PSB0cnVlKSB7XG4gICAgICAgICAgbG9nV3MoJ0lORk8nLCB3cywgcGF0aCwgJ1dlYlNvY2tldCBtZXNzYWdlJywge1xuICAgICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiBtZXNzYWdlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9wZW4od3MpIHtcbiAgICAgICAgd3NUaW1pbmdzLnNldCh3cyBhcyBvYmplY3QsIHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpKVxuICAgICAgICBob29rcy5vcGVuPy4od3MpXG4gICAgICAgIGlmIChvcHRpb25zLmNvbmZpZz8uZGlzYWJsZVdlYlNvY2tldExvZ2dpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICBsb2dXcygnSU5GTycsIHdzLCBwYXRoLCAnV2ViU29ja2V0IG9wZW5lZCcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSBhcyBUSG9va3Ncbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLGlCQUFTLGdCQ0FULG1CQUFTLGlCQUNULG1CQUFTLGNBQVUsbUJBRW5CLElBQU0sR0FBYSxxQ0FDYixHQUFpQixrQkFDakIsR0FDSix3RUFFVyxFQUFZLENBQUMsSUFBbUMsQ0FDM0QsR0FBSSxPQUFPLElBQVUsU0FBVSxDQUM3QixHQUFJLENBQUMsT0FBTyxTQUFTLENBQUssR0FBSyxHQUFTLEVBQ3RDLE1BQVUsTUFBTSxpQkFBaUIsR0FBTyxFQUUxQyxPQUFPLEVBR1QsSUFBTSxFQUFVLEVB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
|
package/dist/otel.d.ts
CHANGED
|
@@ -27,4 +27,4 @@ interface TraceContextFields {
|
|
|
27
27
|
declare const injectTraceContext: (logger: Pick<Logger, "mergeContext">, request: Request) => TraceContextFields | undefined;
|
|
28
28
|
/** @internal Reset the cached OTel API reference. Only intended for tests. */
|
|
29
29
|
declare const __resetForTesting: () => void;
|
|
30
|
-
export { injectTraceContext,
|
|
30
|
+
export { injectTraceContext, __resetForTesting, TraceContextFields };
|
package/dist/otel.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as
|
|
1
|
+
import{createRequire as C}from"node:module";var D=C(import.meta.url),b,E=()=>{if(b!==void 0)return b;try{b=D("@opentelemetry/api")}catch{b=null}return b},G=(w,x)=>{let j=E();if(!j)return;let k=j.trace.getSpan(j.context.active());if(!k)return;let{traceId:z,spanId:B}=k.spanContext(),v={span_id:B,trace_id:z};return w.mergeContext(x,v),v},H=()=>{b=void 0};export{G as injectTraceContext,H as __resetForTesting};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+
|
|
3
|
+
//# debugId=7368325CD5F9403C64756E2164756E21
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL290ZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJ1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5cbmNvbnN0IHJlcXVpcmVPdGVsID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VDb250ZXh0RmllbGRzIHtcbiAgc3Bhbl9pZD86IHN0cmluZ1xuICB0cmFjZV9pZD86IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgT3RlbEFwaSB7XG4gIGNvbnRleHQ6IHsgYWN0aXZlOiAoKSA9PiB1bmtub3duIH1cbiAgdHJhY2U6IHtcbiAgICBnZXRTcGFuOiAoXG4gICAgICBjdHg6IHVua25vd25cbiAgICApID0+IHsgc3BhbkNvbnRleHQ6ICgpID0+IHsgdHJhY2VJZDogc3RyaW5nOyBzcGFuSWQ6IHN0cmluZyB9IH0gfCB1bmRlZmluZWRcbiAgfVxufVxuXG5sZXQgb3RlbEFwaTogT3RlbEFwaSB8IG51bGwgfCB1bmRlZmluZWRcblxuY29uc3QgZ2V0T3RlbEFwaSA9ICgpOiBPdGVsQXBpIHwgbnVsbCA9PiB7XG4gIGlmIChvdGVsQXBpICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb3RlbEFwaVxuICB9XG4gIHRyeSB7XG4gICAgb3RlbEFwaSA9IHJlcXVpcmVPdGVsKCdAb3BlbnRlbGVtZXRyeS9hcGknKSBhcyBPdGVsQXBpXG4gIH0gY2F0Y2gge1xuICAgIG90ZWxBcGkgPSBudWxsXG4gIH1cbiAgcmV0dXJuIG90ZWxBcGlcbn1cblxuLyoqXG4gKiBJbmplY3RzIGFjdGl2ZSBPcGVuVGVsZW1ldHJ5IHNwYW4gSURzIGludG8gdGhlIHJlcXVlc3QgY29udGV4dCBiYWcgd2hlblxuICogYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgaW5zdGFsbGVkIGFuZCBhIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0VHJhY2VDb250ZXh0ID0gKFxuICBsb2dnZXI6IFBpY2s8TG9nZ2VyLCAnbWVyZ2VDb250ZXh0Jz4sXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IFRyYWNlQ29udGV4dEZpZWxkcyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGFwaSA9IGdldE90ZWxBcGkoKVxuICBpZiAoIWFwaSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3BhbiA9IGFwaS50cmFjZS5nZXRTcGFuKGFwaS5jb250ZXh0LmFjdGl2ZSgpKVxuICBpZiAoIXNwYW4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgdHJhY2VJZCwgc3BhbklkIH0gPSBzcGFuLnNwYW5Db250ZXh0KClcbiAgY29uc3QgZmllbGRzID0ge1xuICAgIHNwYW5faWQ6IHNwYW5JZCxcbiAgICB0cmFjZV9pZDogdHJhY2VJZFxuICB9IHNhdGlzZmllcyBUcmFjZUNvbnRleHRGaWVsZHNcbiAgbG9nZ2VyLm1lcmdlQ29udGV4dChyZXF1ZXN0LCBmaWVsZHMpXG4gIHJldHVybiBmaWVsZHNcbn1cblxuLyoqIEBpbnRlcm5hbCBSZXNldCB0aGUgY2FjaGVkIE9UZWwgQVBJIHJlZmVyZW5jZS4gT25seSBpbnRlbmRlZCBmb3IgdGVzdHMuICovXG5leHBvcnQgY29uc3QgX19yZXNldEZvclRlc3RpbmcgPSAoKTogdm9pZCA9PiB7XG4gIG90ZWxBcGkgPSB1bmRlZmluZWRcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLHdCQUFTLG9CQUdULElBQU0sRUFBYyxFQUFjLFlBQVksR0FBRyxFQWdCN0MsRUFFRSxFQUFhLElBQXNCLENBQ3ZDLEdBQUksSUFBWSxPQUNkLE9BQU8sRUFFVCxHQUFJLENBQ0YsRUFBVSxFQUFZLG9CQUFvQixFQUMxQyxLQUFNLENBQ04sRUFBVSxLQUVaLE9BQU8sR0FPSSxFQUFxQixDQUNoQyxFQUNBLElBQ21DLENBQ25DLElBQU0sRUFBTSxFQUFXLEVBQ3ZCLEdBQUksQ0FBQyxFQUNILE9BR0YsSUFBTSxFQUFPLEVBQUksTUFBTSxRQUFRLEVBQUksUUFBUSxPQUFPLENBQUMsRUFDbkQsR0FBSSxDQUFDLEVBQ0gsT0FHRixJQUFRLFVBQVMsVUFBVyxFQUFLLFlBQVksRUFDdkMsRUFBUyxDQUNiLFFBQVMsRUFDVCxTQUFVLENBQ1osRUFFQSxPQURBLEVBQU8sYUFBYSxFQUFTLENBQU0sRUFDNUIsR0FJSSxFQUFvQixJQUFZLENBQzNDLEVBQVUiLAogICJkZWJ1Z0lkIjogIjczNjgzMjVDRDVGOTQwM0M2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
package/package.json
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "logixlysia",
|
|
3
|
-
"version": "6.6.
|
|
3
|
+
"version": "6.6.1",
|
|
4
4
|
"description": "🦊 Logixlysia is a logger for Elysia",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"logixlysia",
|
|
7
|
+
"elysiajs",
|
|
8
|
+
"logger"
|
|
9
|
+
],
|
|
10
|
+
"homepage": "https://logixlysia.vercel.app",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/PunGrumpy/logixlysia/issues"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/PunGrumpy/logixlysia.git"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "Noppakorn Kaewsalabnil <hello@pungrumpy.com>",
|
|
5
20
|
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
21
|
"exports": {
|
|
8
22
|
".": {
|
|
9
23
|
"types": "./dist/index.d.ts",
|
|
@@ -22,39 +36,21 @@
|
|
|
22
36
|
},
|
|
23
37
|
"./package.json": "./package.json"
|
|
24
38
|
},
|
|
39
|
+
"main": "dist/index.js",
|
|
25
40
|
"files": [
|
|
26
41
|
"dist",
|
|
27
42
|
"README.md"
|
|
28
43
|
],
|
|
29
44
|
"scripts": {
|
|
30
|
-
"dev": "bunup --watch",
|
|
31
45
|
"build": "bunup",
|
|
46
|
+
"clean": "git clean -fdx .turbo dist node_modules coverage",
|
|
47
|
+
"dev": "bunup --watch",
|
|
32
48
|
"test": "bun test",
|
|
33
49
|
"test:coverage": "bun test --coverage --coverage-reporter=lcov",
|
|
34
|
-
"clean": "git clean -fdx .turbo dist node_modules coverage",
|
|
35
50
|
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
|
36
51
|
},
|
|
37
|
-
"author": "Noppakorn Kaewsalabnil <hello@pungrumpy.com>",
|
|
38
|
-
"bugs": {
|
|
39
|
-
"url": "https://github.com/PunGrumpy/logixlysia/issues"
|
|
40
|
-
},
|
|
41
|
-
"homepage": "https://logixlysia.vercel.app",
|
|
42
|
-
"keywords": [
|
|
43
|
-
"logixlysia",
|
|
44
|
-
"elysiajs",
|
|
45
|
-
"logger"
|
|
46
|
-
],
|
|
47
|
-
"license": "MIT",
|
|
48
|
-
"publishConfig": {
|
|
49
|
-
"access": "public",
|
|
50
|
-
"registry": "https://registry.npmjs.org/"
|
|
51
|
-
},
|
|
52
|
-
"repository": {
|
|
53
|
-
"type": "git",
|
|
54
|
-
"url": "git+https://github.com/PunGrumpy/logixlysia.git"
|
|
55
|
-
},
|
|
56
52
|
"dependencies": {
|
|
57
|
-
"chalk": "^
|
|
53
|
+
"chalk": "^6.0.0",
|
|
58
54
|
"pino": "^10.3.1",
|
|
59
55
|
"pino-pretty": "^13.1.3"
|
|
60
56
|
},
|
|
@@ -77,5 +73,9 @@
|
|
|
77
73
|
"ai": {
|
|
78
74
|
"optional": true
|
|
79
75
|
}
|
|
76
|
+
},
|
|
77
|
+
"publishConfig": {
|
|
78
|
+
"access": "public",
|
|
79
|
+
"registry": "https://registry.npmjs.org/"
|
|
80
80
|
}
|
|
81
81
|
}
|