pulse-ui-client 0.0.7 → 0.0.9

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.
@@ -0,0 +1,4 @@
1
+ import{useEffect as m,useState as n,useMemo as c,createContext as JW,useContext as XW}from"react";import UW,{cloneElement as H,createElement as e,lazy as DW,Suspense as RW}from"react";var o="$$fragment",r="$$";function a(W){return typeof W==="object"&&W!==null}function t(W){return typeof W==="object"&&W!==null&&W.tag.startsWith("$$")&&W.tag!=="$$fragment"}import{jsx as p,Fragment as CW}from"react/jsx-runtime";class M{client;path;components;callbackCache;constructor(W,q,Z){this.client=W;this.path=q;this.components=Z;this.callbackCache=new Map}getCallback(W){let q=this.callbackCache.get(W);if(!q)q=(...Z)=>this.client.invokeCallback(this.path,W,Z),this.callbackCache.set(W,q);return q}renderNode(W){if(W==null||typeof W==="boolean"||typeof W==="number"||typeof W==="string")return W;if(a(W)){let{tag:q,props:Z={},children:Q=[]}=W,$={};for(let[V,z]of Object.entries(Z))if(typeof z==="string"&&z.startsWith("$$fn:")){let J=z.substring(5);$[V]=this.getCallback(J)}else $[V]=z;if(W.key)$.key=W.key;let X=[];for(let V of Q)X.push(this.renderNode(V));if(t(W)){let V=W.tag.slice(r.length),z=this.components[V];return e(z,$,...X)}return e(q===o?UW.Fragment:q,$,...X)}return null}}function L(W){let q=W.props?.children;if(q==null)return[];return Array.isArray(q)?q.slice():[q]}function AW(W,q){let Z={};for(let[Q,$]of Object.entries(q||{}))if(typeof $==="string"&&$.startsWith("$$fn:")){let X=$.substring(5);Z[Q]=W.getCallback(X)}else Z[Q]=$;return Z}function NW(W,q){return H(W,void 0,...q)}function x(W,q,Z){let Q=W;for(let $ of q){let X=$.path.split(".").filter((z)=>z.length>0).map(Number),V=(z,J)=>{if(J<X.length){K(z,X,J),z=z;let G=X[J],P=L(z),O=P[G];return P[G]=V(O,J+1),NW(z,P)}switch($.type){case"replace":return Z.renderNode($.data);case"update_props":{K(z,X,J),z=z;let G=AW(Z,$.data);return H(z,G)}case"insert":{K(z,X,J),z=z;let G=L(z);return G.splice($.idx,0,Z.renderNode($.data)),H(z,null,...G)}case"remove":{K(z,X,J),z=z;let G=L(z);return G.splice($.idx,1),H(z,null,...G)}case"move":{K(z,X,J),z=z;let G=L(z),P=G.splice($.data.from_index,1)[0];return G.splice($.data.to_index,0,P),H(z,null,...G)}default:throw Error(`[Pulse renderer] Unknown update type: ${$.type}`)}};Q=V(Q,0)}return Q}function OW(W,q){let Z=DW(W);return({children:Q,...$})=>{return p(RW,{fallback:q??p(CW,{}),children:p(Z,{...$,children:Q})})}}function K(W,q,Z){return!0}function f(){function W(q,Z){return(Q)=>{let $={};for(let X of q)$[X]=Q[X];if(Z)for(let X in Z){let V=Z[X];$[X]=V(Q)}return $}}return W}var fW=(W)=>W.tagName.toLowerCase(),IW=["id","className","tagName","localName","clientHeight","clientLeft","clientTop","clientWidth","scrollHeight","scrollLeft","scrollTop","scrollWidth","slot"],yW=["autofocus","tabIndex","nonce"],wW=["accessKey","accessKeyLabel","autocapitalize","dir","draggable","hidden","inert","lang","offsetHeight","offsetLeft","offsetTop","offsetWidth","popover","spellcheck","title","translate","writingSuggestions","contentEditable","enterKeyHint","isContentEditable","inputMode"],kW=f()(IW,{tagName:fW}),BW=f()(yW),KW=f()(wW);function I(W){return{...kW(W),...BW(W),...KW(W)}}function F(W,q){let Z=f()(W,q);return(Q)=>({...I(Q),...Z(Q)})}var HW=["hash","host","hostname","href","origin","password","pathname","port","protocol","search","target","download","rel","hreflang","type","username","ping","referrerPolicy","text"],gW=F(HW),jW=["alt","coords","download","hash","host","hostname","href","origin","password","pathname","port","protocol","rel","search","shape","target","username","ping","referrerPolicy"],YW=F(jW),LW=["autoplay","controls","crossOrigin","currentSrc","currentTime","defaultMuted","defaultPlaybackRate","duration","ended","loop","muted","networkState","paused","playbackRate","preload","readyState","seeking","src","volume","preservesPitch"],zW=F(LW),MW=(W)=>zW(W),bW=["disabled","name","type","value","formAction","formEnctype","formMethod","formNoValidate","formTarget","popoverTargetAction"],SW=F(bW),TW=["value"],_W=F(TW),hW=["height","src","type","width","align","name"],mW=F(hW),pW=["disabled","name","type","validationMessage","willValidate"],xW=F(pW),vW=["acceptCharset","action","autocomplete","encoding","enctype","length","method","name","noValidate","target","rel"],uW=F(vW),EW=["allow","allowFullscreen","height","name","referrerPolicy","src","srcdoc","width","align","frameBorder","longDesc","marginHeight","marginWidth","scrolling","sandbox"],iW=F(EW),nW=["alt","crossOrigin","decoding","height","isMap","loading","naturalHeight","naturalWidth","referrerPolicy","sizes","src","srcset","useMap","width","align","border","complete","hspace","longDesc","lowsrc","name","vspace","x","y","fetchPriority"],cW=F(nW),dW=["accept","alt","autocomplete","checked","defaultChecked","defaultValue","dirName","disabled","height","indeterminate","max","maxLength","min","minLength","multiple","name","pattern","placeholder","readOnly","required","selectionDirection","selectionEnd","selectionStart","size","src","step","type","value","valueAsNumber","width","align","capture","formAction","formEnctype","formMethod","formNoValidate","formTarget","useMap","validationMessage","willValidate","popoverTargetAction"],sW=F(dW),lW=["htmlFor"],oW=F(lW),rW=["value","type"],aW=F(rW),tW=["as","crossOrigin","disabled","fetchPriority","href","hreflang","imageSizes","imageSrcset","integrity","media","referrerPolicy","rel","type","charset","rev","target","sizes"],eW=F(tW),W1=["name"],q1=F(W1),Z1=["high","low","max","min","optimum","value"],$1=F(Z1),z1=["cite","dateTime"],WW=F(z1),Q1=["reversed","start","type","compact"],J1=F(Q1),X1=["data","height","name","type","useMap","width","validationMessage","willValidate","align","archive","border","code","codeBase","codeType","declare","hspace","standby","vspace"],G1=F(X1),F1=["disabled","label"],V1=F(F1),P1=["defaultSelected","disabled","index","label","selected","text","value"],U1=F(P1),D1=["defaultValue","name","type","value","htmlFor","validationMessage","willValidate"],R1=F(D1),A1=["max","position","value"],N1=F(A1),O1=["cite"],qW=F(O1),C1=(W)=>I(W),f1=["async","crossOrigin","defer","fetchPriority","integrity","noModule","referrerPolicy","src","text","type","charset"],I1=f()(f1,{event:(W)=>W.event,htmlFor:(W)=>W.htmlFor}),y1=(W)=>({...I(W),...I1(W)}),w1=["autocomplete","disabled","length","multiple","name","required","selectedIndex","size","type","value","validationMessage","willValidate"],k1=F(w1),B1=["name"],K1=F(B1),H1=["height","media","sizes","src","srcset","type","width"],g1=F(H1),j1=["align"],Y1=F(j1),L1=["abbr","cellIndex","colSpan","headers","rowSpan","scope","align","axis","bgColor","ch","chOff","height","noWrap","vAlign","width"],ZW=F(L1),M1=["span","align","ch","chOff","vAlign","width"],$W=F(M1),b1=["align","bgColor","border","cellPadding","cellSpacing","frame","rules","summary","width"],S1=F(b1),T1=["rowIndex","sectionRowIndex","align","bgColor","ch","chOff","vAlign"],_1=F(T1),h1=["align","ch","chOff","vAlign"],v=F(h1),m1=(W)=>I(W),p1=["autocomplete","cols","defaultValue","dirName","disabled","maxLength","minLength","name","placeholder","readOnly","required","rows","selectionDirection","selectionEnd","selectionStart","value","wrap","textLength","validationMessage","willValidate"],x1=F(p1),v1=["dateTime"],u1=F(v1),E1=["default","kind","label","readyState","src","srclang"],i1=F(E1),n1=["height","poster","videoHeight","videoWidth","width","playsInline"],c1=f()(n1),d1=(W)=>({...zW(W),...c1(W)}),s1=["clear"],l1=F(s1),o1=["href","target"],r1=F(o1),a1=["aLink","background","bgColor","link","text","vLink"],t1=F(a1),e1=["compact"],Wq=F(e1),qq=["open"],Zq=F(qq),$q=["open","returnValue"],zq=F($q),Qq=["align"],Jq=F(Qq),Xq=(W)=>I(W),Gq=["align"],w=F(Gq),Fq=["align","color","noShade","size","width"],Vq=F(Fq),Pq=["version"],Uq=F(Pq),Dq=(W)=>I(W),Rq=["content","httpEquiv","name","scheme"],Aq=F(Rq),Nq=["align"],Oq=F(Nq),Cq=(W)=>I(W),fq=["width"],Iq=F(fq),yq=(W)=>I(W),wq=["media","type","disabled"],kq=F(wq),Bq=["text"],Kq=F(Bq),Hq=["compact","type"],gq=F(Hq),jq={A:gW,AREA:YW,AUDIO:MW,BASE:r1,BLOCKQUOTE:qW,Q:qW,BODY:t1,BR:l1,BUTTON:SW,CANVAS:I,CAPTION:Y1,CITE:C1,COL:$W,COLGROUP:$W,DATA:_W,DETAILS:Zq,DIALOG:zq,DIV:Jq,DL:Wq,EMBED:mW,FIELDSET:xW,FORM:uW,H1:w,H2:w,H3:w,H4:w,H5:w,H6:w,HEAD:Xq,HR:Vq,HTML:Uq,IFRAME:iW,IMG:cW,INPUT:sW,LABEL:oW,LI:aW,LINK:eW,MAP:q1,MENU:Dq,META:Aq,METER:$1,INS:WW,DEL:WW,OBJECT:G1,OL:J1,OPTGROUP:V1,OPTION:U1,OUTPUT:R1,P:Oq,PICTURE:Cq,PRE:Iq,PROGRESS:N1,SCRIPT:y1,SELECT:k1,SLOT:K1,SOURCE:g1,SPAN:yq,STYLE:kq,TABLE:S1,TBODY:v,THEAD:v,TFOOT:v,TD:ZW,TH:ZW,TEMPLATE:m1,TEXTAREA:x1,TIME:u1,TITLE:Kq,TR:_1,TRACK:i1,UL:gq,VIDEO:d1};function b(W){let q=W.tagName.toUpperCase(),Z=jq[q];if(Z)return Z(W);throw Error(`Unexpected HTML element tag: ${W.tagName} (update .web/custom/serialize.ts)`)}var Yq=(W)=>b(W.target),g=(W)=>W.relatedTarget?b(W.relatedTarget):null;function U(W,q){return f()(W,{target:Yq,...q||{}})}var C=["target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","timeStamp","type"],S=[...C,"detail"],T=[...S,"altKey","button","buttons","clientX","clientY","ctrlKey","metaKey","movementX","movementY","pageX","pageY","screenX","screenY","shiftKey"],Lq=[...T,"pointerId","pressure","tangentialPressure","tiltX","tiltY","twist","width","height","pointerType","isPrimary"],Mq=U(C),bq=U(S),Sq=U(T,{relatedTarget:g}),Tq=U(C,{clipboardData:(W)=>QW(W.clipboardData)}),_q=U([...C,"data"]),hq=U(T,{relatedTarget:g,dataTransfer:(W)=>QW(W.dataTransfer)}),mq=U(Lq,{relatedTarget:g}),pq=U(C,{relatedTarget:g}),xq=U(C),vq=U(C),uq=U(C),Eq=U([...S,"altKey","ctrlKey","code","key","locale","location","metaKey","repeat","shiftKey"]),iq=U([...S,"altKey","ctrlKey","metaKey","shiftKey","changedTouches","targetTouches","touches"],{changedTouches:(W)=>u(W.changedTouches),targetTouches:(W)=>u(W.targetTouches),touches:(W)=>u(W.touches)}),nq=U([...T,"deltaMode","deltaX","deltaY","deltaZ"],{relatedTarget:g}),cq=U([...C,"animationName","elapsedTime","pseudoElement"]),dq=U([...C,"oldState","newState"]),sq=U([...C,"elapsedTime","propertyName","pseudoElement"]);function u(W){return Array.from(W).map((q)=>({target:b(q.target),identifier:q.identifier,screenX:q.screenX,screenY:q.screenY,clientX:q.clientX,clientY:q.clientY,pageX:q.pageX,pageY:q.pageY}))}function QW(W){if(!W)return null;let q=[];if(W.items)for(let Z=0;Z<W.items.length;Z++){let Q=W.items[Z];q.push({kind:Q.kind,type:Q.type})}return{drop_effect:W.dropEffect,effect_allowed:W.effectAllowed,items:q,types:Array.from(W.types||[])}}var D={};function R(W,q,Z){for(let Q of q)W[Q]=Z}R(D,["pointerdown","pointermove","pointerup","pointercancel","gotpointercapture","lostpointercapture","pointerenter","pointerleave","pointerover","pointerout"],mq);R(D,["click","contextmenu","dblclick","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup"],Sq);R(D,["drag","dragend","dragenter","dragexit","dragleave","dragover","dragstart","drop"],hq);R(D,["keydown","keypress","keyup"],Eq);R(D,["focus","blur"],pq);R(D,["change","input"],uq);R(D,["invalid"],vq);R(D,["reset","submit"],xq);R(D,["copy","cut","paste"],Tq);R(D,["compositionend","compositionstart","compositionupdate"],_q);R(D,["touchcancel","touchend","touchmove","touchstart"],iq);R(D,["scroll"],bq);R(D,["wheel"],nq);R(D,["animationstart","animationend","animationiteration"],cq);R(D,["transitionend"],sq);R(D,["toggle"],dq);function E(W){if(W&&typeof W==="object"&&"nativeEvent"in W&&typeof W.isDefaultPrevented==="function"){let q=W;if(typeof q.type!=="string")return W;let Z=D[q.type.toLowerCase()];if(Z)return Z(q);return Mq(q)}return W}function lq(W){return W instanceof Date}function oq(W){return typeof File<"u"&&W instanceof File}function rq(W){return typeof FormData<"u"&&W instanceof FormData}function j(W){let q=new Map,Z=1,Q=($)=>{if($===null||typeof $!=="object")return $;let X=$;if(q.has(X))return{__ref:q.get(X)};if(lq($)){let J=Z++;return q.set(X,J),{__pulse:"date",__id:J,timestamp:$.getTime()}}if(oq($)){let J=Z++;return q.set(X,J),{__pulse:"file",__id:J,name:$.name,type:$.type,size:$.size,lastModified:$.lastModified,file:$}}if(rq($)){let J=Z++;q.set(X,J);let G={};for(let[P,O]of $.entries()){let A=Q(O);if(Object.prototype.hasOwnProperty.call(G,P)){let N=G[P];if(Array.isArray(N))N.push(A);else G[P]=[N,A]}else G[P]=A}return{__pulse:"formdata",__id:J,fields:G}}let V=Z++;if(q.set(X,V),Array.isArray($))return{__pulse:"array",__id:V,items:$.map(Q)};let z={};for(let J in $){let G=$[J];if(typeof G==="function"||typeof G==="symbol"||typeof G>"u")continue;z[J]=Q(G)}return{__pulse:"object",__id:V,__data:z}};return Q(W)}function i(W){let q=new Map,Z=(Q)=>{if(Q===null||typeof Q!=="object")return Q;if(Array.isArray(Q))return Q.map(Z);let $=Q;if($.__ref!==void 0){let V=$.__ref;return q.get(V)||null}if($.__pulse==="date"){let V=$.__id,z=new Date($.timestamp);return q.set(V,z),z}if($.__pulse==="file"){let{__id:V,file:z}=$;return q.set(V,z),z}if($.__pulse==="formdata"){let{__id:V,fields:z}=$,J=new FormData;q.set(V,J);for(let[G,P]of Object.entries(z))if(Array.isArray(P))for(let O of P){let A=Z(O);J.append(G,A)}else{let O=Z(P);J.append(G,O)}return J}if($.__pulse==="array"){let V=$.__id,z=[];q.set(V,z);let J=$.items;for(let G=0;G<J.length;G++)z[G]=Z(J[G]);return z}if($.__pulse==="object"){let V=$.__id,z={};q.set(V,z);let J=$.__data;for(let[G,P]of Object.entries(J))z[G]=Z(P);return z}let X={};for(let[V,z]of Object.entries($))X[V]=Z(z);return X};return Z(W)}import{io as aq}from"socket.io-client";class _{url;renderId;frameworkNavigate;activeViews;socket=null;messageQueue;connectionListeners=new Set;serverErrors=new Map;serverErrorListeners=new Set;constructor(W,q,Z){this.url=W;this.renderId=q;this.frameworkNavigate=Z;this.socket=null,this.activeViews=new Map,this.messageQueue=[]}isConnected(){return this.socket?.connected??!1}async connect(){if(this.socket)return;return new Promise((W,q)=>{let Z=aq(this.url,{transports:["websocket","webtransport"],auth:{renderId:this.renderId}});this.socket=Z,Z.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let[Q,$]of this.activeViews)Z.emit("message",j({type:"mount",path:Q,routeInfo:$.routeInfo}));for(let Q of this.messageQueue){if(Q.type==="mount"&&this.activeViews.has(Q.path))continue;if(Q.type==="navigate")continue;Z.emit("message",j(Q))}this.messageQueue=[],this.notifyConnectionListeners(!0),W()}),Z.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),q(Q)}),Z.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),Z.on("message",(Q)=>this.handleServerMessage(i(Q)))})}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let q of this.connectionListeners)q(W)}onServerError(W){this.serverErrorListeners.add(W);for(let[q,Z]of this.serverErrors)W(q,Z);return()=>{this.serverErrorListeners.delete(W)}}notifyServerError(W,q){for(let Z of this.serverErrorListeners)Z(W,q)}async sendMessage(W){if(this.isConnected())this.socket.emit("message",j(W));else this.messageQueue.push(W)}mountView(W,q){if(this.activeViews.has(W))throw Error(`Path ${W} is already mounted`);this.activeViews.set(W,q),this.sendMessage({type:"mount",path:W,routeInfo:q.routeInfo})}async navigate(W,q){await this.sendMessage({type:"navigate",path:W,routeInfo:q})}unmount(W){this.sendMessage({type:"unmount",path:W}),this.activeViews.delete(W)}disconnect(){this.socket?.disconnect(),this.socket=null,this.messageQueue=[],this.connectionListeners.clear(),this.activeViews.clear(),this.serverErrors.clear(),this.serverErrorListeners.clear()}handleServerMessage(W){switch(W.type){case"vdom_init":{let q=this.activeViews.get(W.path);if(!q)return;if(q)q.onInit(W.vdom);if(this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"vdom_update":{let q=this.activeViews.get(W.path);if(!q)return;if(q.onUpdate(W.ops),this.serverErrors.has(W.path))this.serverErrors.delete(W.path),this.notifyServerError(W.path,null);break}case"server_error":{if(!this.activeViews.has(W.path))return;this.serverErrors.set(W.path,W.error),this.notifyServerError(W.path,W.error);break}case"api_call":{this.performApiCall(W);break}case"navigate_to":{let q=!!W.replace,Z=W.path||"";if(Z.startsWith("//"))Z=`${window.location.protocol}${Z}`;if(/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(Z))if(Z.startsWith("http://")||Z.startsWith("https://"))try{let $=new URL(Z);if($.origin===window.location.origin){let X=`${$.pathname}${$.search}${$.hash}`;this.frameworkNavigate(X,{replace:q})}else if(q)window.location.replace(Z);else window.location.assign(Z)}catch{if(q)window.location.replace(Z);else window.location.assign(Z)}else if(q)window.location.replace(Z);else window.location.assign(Z);else this.frameworkNavigate(Z,{replace:q});break}default:console.error("Unexpected message:",W)}}async performApiCall(W){try{let q=await fetch(W.url,{method:W.method||"GET",headers:{...W.headers||{},...W.body!=null&&!("content-type"in(W.headers||{}))?{"content-type":"application/json"}:{}},body:W.body!=null?typeof W.body==="string"?W.body:JSON.stringify(W.body):void 0,credentials:W.credentials||"include"}),Z={};q.headers.forEach((V,z)=>Z[z]=V);let Q=null;if((q.headers.get("content-type")||"").includes("application/json"))Q=await q.json().catch(()=>null);else Q=await q.text().catch(()=>null);let X={type:"api_result",id:W.id,ok:q.ok,status:q.status,headers:Z,body:Q};await this.sendMessage(X)}catch(q){let Z={type:"api_result",id:W.id,ok:!1,status:0,headers:{},body:{error:String(q)}};await this.sendMessage(Z)}}async invokeCallback(W,q,Z){await this.sendMessage({type:"callback",path:W,callback:q,args:Z.map(E)})}}import{useLocation as tq,useParams as eq,useNavigate as WZ}from"react-router";import{jsx as k,jsxs as h}from"react/jsx-runtime";var GW=JW(null),FW=JW(null),VW=()=>{let W=XW(GW);if(!W)throw Error("usePulseClient must be used within a PulseProvider");return W},qZ=(W)=>{let q=XW(FW);if(!q)throw Error("usePulsePrerender must be used within a PulseProvider");let Z=q.views[W];if(!Z)throw Error(`No prerender found for '${W}'`);return Z},d=typeof window<"u";function ZZ({children:W,config:q,prerender:Z}){let[Q,$]=n(!0),X=WZ(),{renderId:V,views:z}=Z,J=c(()=>new _(q.serverAddress,V,X),[q.serverAddress,X,V]);return m(()=>J.onConnectionChange($),[J]),m(()=>{if(d)return J.connect(),()=>J.disconnect()},[J]),k(GW.Provider,{value:J,children:h(FW.Provider,{value:Z,children:[!Q&&k("div",{style:{position:"fixed",bottom:"20px",right:"20px",backgroundColor:"red",color:"white",padding:"10px",borderRadius:"5px",zIndex:1000},children:"Failed to connect to the server."}),W]})})}function $Z({externalComponents:W,path:q}){let Z=VW(),Q=qZ(q),$=c(()=>new M(Z,q,W),[Z,q,W]),[X,V]=n(()=>$.renderNode(Q)),[z,J]=n(null),G=tq(),P=eq(),O=c(()=>{let{"*":A="",...N}=P,y=new URLSearchParams(G.search);return{hash:G.hash,pathname:G.pathname,query:G.search,queryParams:Object.fromEntries(y.entries()),pathParams:N,catchall:A.length>0?A.split("/"):[]}},[G.hash,G.pathname,G.search,JSON.stringify(P)]);if(m(()=>{if(d){Z.mountView(q,{routeInfo:O,onInit:(N)=>{V($.renderNode(N))},onUpdate:(N)=>{V((y)=>y==null?y:x(y,N,$))}});let A=Z.onServerError((N,y)=>{if(N===q)J(y)});return()=>{A(),Z.unmount(q)}}},[Z]),m(()=>{if(d)Z.navigate(q,O)},[Z,q,O]),z)return k(zZ,{error:z});return X}function zZ({error:W}){return h("div",{style:{padding:16,border:"1px solid #e00",background:"#fff5f5",color:"#900",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',whiteSpace:"pre-wrap"},children:[h("div",{style:{fontWeight:700,marginBottom:8},children:["Server Error during ",W.phase]}),W.message&&k("div",{children:W.message}),W.stack&&h("details",{open:!0,style:{marginTop:8},children:[k("summary",{children:"Stack trace"}),k("pre",{style:{margin:0},children:W.stack})]})]})}import{io as QZ}from"socket.io-client";class PW{url;socket=null;listener=null;messageQueue=[];connectionListeners=new Set;constructor(W){this.url=W}connect(W){return this.listener=W,new Promise((q,Z)=>{this.socket=QZ(this.url,{transports:["websocket"]}),this.socket.on("connect",()=>{console.log("[SocketIOTransport] Connected:",this.socket?.id);for(let Q of this.messageQueue)this.socket?.emit("message",Q);this.messageQueue=[],this.notifyConnectionListeners(!0),q()}),this.socket.on("connect_error",(Q)=>{console.error("[SocketIOTransport] Connection failed:",Q),this.notifyConnectionListeners(!1),Z(Q)}),this.socket.on("disconnect",()=>{console.log("[SocketIOTransport] Disconnected"),this.notifyConnectionListeners(!1)}),this.socket.on("message",(Q)=>{this.listener?.(Q)})})}disconnect(){this.socket?.disconnect(),this.socket=null,this.listener=null,this.messageQueue=[],this.connectionListeners.clear()}async sendMessage(W){if(this.isConnected())this.socket.emit("message",W);else this.messageQueue.push(W)}isConnected(){return this.socket?.connected||!1}onConnectionChange(W){return this.connectionListeners.add(W),W(this.isConnected()),()=>{this.connectionListeners.delete(W)}}notifyConnectionListeners(W){for(let q of this.connectionListeners)q(W)}}function JZ({params:W,request:q}){let{"*":Z="",...Q}=W,$=new URL(q.url);return{hash:$.hash,pathname:$.pathname,query:$.search,queryParams:Object.fromEntries($.searchParams.entries()),pathParams:Q,catchall:Z.length>1?Z.split("/"):[]}}function XZ(W){if(W===null||typeof W!=="object")return!1;let q=Object.getPrototypeOf(W);return q===Object.prototype||q===null}function s(W){return typeof W==="function"||typeof W==="symbol"||typeof W>"u"}async function GZ(W){let q=await W.arrayBuffer();return Array.from(new Uint8Array(q))}async function FZ(W){return await Y(W,{seen:new WeakMap,nextId:1})}function VZ(W,q){if(W.seen.get(q)!==void 0)return null;let Q=W.nextId++;return W.seen.set(q,Q),Q}async function Y(W,q){if(W===null||typeof W!=="object")return W;if(W instanceof Date)return{__t:"datetime",timestamp:W.getTime()};if(W instanceof FormData){let z=VZ(q,W);if(z===null)return{__t:"ref",id:q.seen.get(W)};let J={};for(let[P,O]of W.entries()){let A=await Y(O,q);if(A===void 0)continue;if(Object.prototype.hasOwnProperty.call(J,P)){let N=J[P];if(Array.isArray(N))N.push(A);else J[P]=[N,A]}else J[P]=A}return{__t:"formdata",fields:J,__id:z}}if(W instanceof File){let z=W,J=await GZ(W);return{__t:"file",name:z.name,type:z.type,size:z.size,lastModified:z.lastModified,content:J}}let Z=W,Q=q.seen.get(Z);if(Q!==void 0)return{__t:"ref",id:Q};let $=q.nextId++;if(q.seen.set(Z,$),Array.isArray(W)){let J=(await Promise.all(W.map((P)=>Y(P,q)))).filter((P)=>P!==void 0);return{__t:"array",__id:$,items:J}}let X={};if(XZ(W))for(let z of Object.keys(W)){let J=W[z];if(s(J))continue;let G=await Y(J,q);if(G!==void 0)X[z]=G}else for(let z in W){let J=W[z];if(s(J))continue;let G=await Y(J,q);if(G!==void 0)X[z]=G}return{__t:"object",__id:$,props:X}}function PZ(W){return B(W)}function B(W){if(W===null||typeof W!=="object")return W;let q=W,Z=q.__t;if(Z==="datetime"){let $=q.timestamp;return new Date($)}if(Z==="file"){let $=q.content;if(Array.isArray($))return{...q,content:new Uint8Array($)};return q}if(Z==="formdata"){let $=q.fields,X={};for(let V of Object.keys($)){let z=$[V];if(Array.isArray(z))X[V]=z.map((J)=>B(J));else X[V]=B(z)}return{__t:"formdata",fields:X}}if(Z==="array")return q.items.map((X)=>B(X));if(Z==="object"){let $=q.props,X={};for(let V of Object.keys($))X[V]=B($[V]);return X}if(Z==="ref")return q;let Q={};for(let $ of Object.keys(q))Q[$]=B(q[$]);return Q}function UZ(W){return l(W,new WeakSet)}function l(W,q){if(W===null||typeof W!=="object")return W;if(q.has(W))return;if(q.add(W),Array.isArray(W))return W.map((Q)=>l(Q,q)).filter((Q)=>Q!==void 0);let Z={};for(let Q in W){let $=W[Q];if(s($))continue;let X=l($,q);if(X!==void 0)Z[Q]=X}return Z}export{VW as usePulseClient,j as stringify,i as parse,JZ as extractServerRouteInfo,E as extractEvent,FZ as encodeForWire,PZ as decodeFromWire,UZ as cleanForSerialization,x as applyReactTreeUpdates,M as VDOMRenderer,PW as SocketIOTransport,OW as RenderLazy,$Z as PulseView,_ as PulseSocketIOClient,ZZ as PulseProvider};
2
+
3
+ //# debugId=D5998C469EDE20BE64756E2164756E21
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3B1bHNlLnRzeCIsICIuLi9zcmMvcmVuZGVyZXIudHN4IiwgIi4uL3NyYy92ZG9tLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZXh0cmFjdG9yLnRzIiwgIi4uL3NyYy9zZXJpYWxpemUvZWxlbWVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9ldmVudHMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9mbGF0dGVkLnRzIiwgIi4uL3NyYy9jbGllbnQudHN4IiwgIi4uL3NyYy90cmFuc3BvcnQudHMiLCAiLi4vc3JjL2hlbHBlcnMudHMiLCAiLi4vc3JjL3NlcmlhbGl6ZS9jbGVhbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgUmVhY3QsIHtcbiAgdXNlRWZmZWN0LFxuICB1c2VTdGF0ZSxcbiAgdXNlTWVtbyxcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdHlwZSBDb21wb25lbnRUeXBlLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZET01SZW5kZXJlciwgYXBwbHlVcGRhdGVzIH0gZnJvbSBcIi4vcmVuZGVyZXJcIjtcbmltcG9ydCB7IFB1bHNlU29ja2V0SU9DbGllbnQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgVkRPTSwgQ29tcG9uZW50UmVnaXN0cnksIFJlZ2lzdHJ5RW50cnkgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQgeyB1c2VMb2NhdGlvbiwgdXNlUGFyYW1zLCB1c2VOYXZpZ2F0ZSB9IGZyb20gXCJyZWFjdC1yb3V0ZXJcIjtcbmltcG9ydCB0eXBlIHsgU2VydmVyRXJyb3JJbmZvIH0gZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDb25maWcge1xuICBzZXJ2ZXJBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFB1bHNlUHJlcmVuZGVyID0ge1xuICByZW5kZXJJZDogc3RyaW5nO1xuICB2aWV3czogUmVjb3JkPHN0cmluZywgVkRPTT47XG59O1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRleHQgYW5kIEhvb2tzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb250ZXh0IGZvciB0aGUgY2xpZW50LCBwcm92aWRlZCBieSBQdWxzZVByb3ZpZGVyXG5jb25zdCBQdWxzZUNsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFB1bHNlU29ja2V0SU9DbGllbnQgfCBudWxsPihudWxsKTtcbmNvbnN0IFB1bHNlUHJlcmVuZGVyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8UHVsc2VQcmVyZW5kZXIgfCBudWxsPihudWxsKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1bHNlQ2xpZW50ID0gKCkgPT4ge1xuICBjb25zdCBjbGllbnQgPSB1c2VDb250ZXh0KFB1bHNlQ2xpZW50Q29udGV4dCk7XG4gIGlmICghY2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlUHVsc2VDbGllbnQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIFB1bHNlUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VQdWxzZVByZXJlbmRlciA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChQdWxzZVByZXJlbmRlckNvbnRleHQpO1xuICBpZiAoIWN0eCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInVzZVB1bHNlUHJlcmVuZGVyIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBQdWxzZVByb3ZpZGVyXCIpO1xuICB9XG4gIGNvbnN0IHZpZXcgPSBjdHgudmlld3NbcGF0aF07XG4gIGlmICghdmlldykge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJlcmVuZGVyIGZvdW5kIGZvciAnJHtwYXRofSdgKTtcbiAgfVxuICByZXR1cm4gdmlldztcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQcm92aWRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVByb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBjb25maWc6IFB1bHNlQ29uZmlnO1xuICBwcmVyZW5kZXI6IFB1bHNlUHJlcmVuZGVyO1xufVxuXG5jb25zdCBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBjb25maWcsXG4gIHByZXJlbmRlcixcbn06IFB1bHNlUHJvdmlkZXJQcm9wcykge1xuICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IHJyTmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuICBjb25zdCB7IHJlbmRlcklkLCB2aWV3cyB9ID0gcHJlcmVuZGVyO1xuXG4gIGNvbnN0IGNsaWVudCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFB1bHNlU29ja2V0SU9DbGllbnQoY29uZmlnLnNlcnZlckFkZHJlc3MsIHJlbmRlcklkLCByck5hdmlnYXRlKSxcbiAgICBbY29uZmlnLnNlcnZlckFkZHJlc3MsIHJyTmF2aWdhdGUsIHJlbmRlcklkXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBjbGllbnQub25Db25uZWN0aW9uQ2hhbmdlKHNldENvbm5lY3RlZCksIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5jb25uZWN0KCk7XG4gICAgICByZXR1cm4gKCkgPT4gY2xpZW50LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gIH0sIFtjbGllbnRdKTtcblxuICByZXR1cm4gKFxuICAgIDxQdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NsaWVudH0+XG4gICAgICA8UHVsc2VQcmVyZW5kZXJDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcmVyZW5kZXJ9PlxuICAgICAgICB7IWNvbm5lY3RlZCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgYm90dG9tOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgcmlnaHQ6IFwiMjBweFwiLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwicmVkXCIsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCIsXG4gICAgICAgICAgICAgIHBhZGRpbmc6IFwiMTBweFwiLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICAgICAgICAgIHpJbmRleDogMTAwMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9QdWxzZVByZXJlbmRlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9QdWxzZUNsaWVudENvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWaWV3XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVmlld1Byb3BzIHtcbiAgZXh0ZXJuYWxDb21wb25lbnRzOiBDb21wb25lbnRSZWdpc3RyeTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUHVsc2VWaWV3KHsgZXh0ZXJuYWxDb21wb25lbnRzLCBwYXRoIH06IFB1bHNlVmlld1Byb3BzKSB7XG4gIGNvbnN0IGNsaWVudCA9IHVzZVB1bHNlQ2xpZW50KCk7XG4gIGNvbnN0IGluaXRpYWxWRE9NID0gdXNlUHVsc2VQcmVyZW5kZXIocGF0aCk7XG4gIGNvbnN0IHJlbmRlcmVyID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgVkRPTVJlbmRlcmVyKGNsaWVudCwgcGF0aCwgZXh0ZXJuYWxDb21wb25lbnRzKSxcbiAgICBbY2xpZW50LCBwYXRoLCBleHRlcm5hbENvbXBvbmVudHNdXG4gICk7XG4gIGNvbnN0IFt0cmVlLCBzZXRUcmVlXSA9IHVzZVN0YXRlPFJlYWN0LlJlYWN0Tm9kZT4oKCkgPT5cbiAgICByZW5kZXJlci5yZW5kZXJOb2RlKGluaXRpYWxWRE9NKVxuICApO1xuICBjb25zdCBbc2VydmVyRXJyb3IsIHNldFNlcnZlckVycm9yXSA9IHVzZVN0YXRlPFNlcnZlckVycm9ySW5mbyB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gdXNlTG9jYXRpb24oKTtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG5cbiAgY29uc3Qgcm91dGVJbmZvID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBcIipcIjogY2F0Y2hhbGwgPSBcIlwiLCAuLi5wYXRoUGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc2g6IGxvY2F0aW9uLmhhc2gsXG4gICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICBxdWVyeTogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnlQYXJhbXM6IE9iamVjdC5mcm9tRW50cmllcyhxdWVyeVBhcmFtcy5lbnRyaWVzKCkpLFxuICAgICAgcGF0aFBhcmFtcyxcbiAgICAgIGNhdGNoYWxsOiBjYXRjaGFsbC5sZW5ndGggPiAwID8gY2F0Y2hhbGwuc3BsaXQoXCIvXCIpIDogW10sXG4gICAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xuICB9LCBbXG4gICAgbG9jYXRpb24uaGFzaCxcbiAgICBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICBsb2NhdGlvbi5zZWFyY2gsXG4gICAgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaW5Ccm93c2VyKSB7XG4gICAgICBjbGllbnQubW91bnRWaWV3KHBhdGgsIHtcbiAgICAgICAgcm91dGVJbmZvLFxuICAgICAgICBvbkluaXQ6ICh2ZG9tKSA9PiB7XG4gICAgICAgICAgc2V0VHJlZShyZW5kZXJlci5yZW5kZXJOb2RlKHZkb20pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25VcGRhdGU6IChvcHMpID0+IHtcbiAgICAgICAgICBzZXRUcmVlKChwcmV2KSA9PlxuICAgICAgICAgICAgcHJldiA9PSBudWxsID8gcHJldiA6IGFwcGx5VXBkYXRlcyhwcmV2LCBvcHMsIHJlbmRlcmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9mZkVyciA9IGNsaWVudC5vblNlcnZlckVycm9yKChwLCBlcnIpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IHBhdGgpIHNldFNlcnZlckVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG9mZkVycigpO1xuICAgICAgICBjbGllbnQudW5tb3VudChwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIHJvdXRlSW5mbyBpcyBOT1QgaW5jbHVkZWQgaGVyZSBvbiBwdXJwb3NlXG4gIH0sIFtjbGllbnRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpbkJyb3dzZXIpIHtcbiAgICAgIGNsaWVudC5uYXZpZ2F0ZShwYXRoLCByb3V0ZUluZm8pO1xuICAgIH1cbiAgfSwgW2NsaWVudCwgcGF0aCwgcm91dGVJbmZvXSk7XG5cbiAgaWYgKHNlcnZlckVycm9yKSB7XG4gICAgcmV0dXJuIDxTZXJ2ZXJFcnJvciBlcnJvcj17c2VydmVyRXJyb3J9IC8+O1xuICB9XG5cbiAgcmV0dXJuIHRyZWU7XG59XG5cbmZ1bmN0aW9uIFNlcnZlckVycm9yKHsgZXJyb3IgfTogeyBlcnJvcjogU2VydmVyRXJyb3JJbmZvIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBzdHlsZT17e1xuICAgICAgICBwYWRkaW5nOiAxNixcbiAgICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjZTAwXCIsXG4gICAgICAgIGJhY2tncm91bmQ6IFwiI2ZmZjVmNVwiLFxuICAgICAgICBjb2xvcjogXCIjOTAwXCIsXG4gICAgICAgIGZvbnRGYW1pbHk6XG4gICAgICAgICAgJ3VpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBcIkxpYmVyYXRpb24gTW9ub1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgICAgIHdoaXRlU3BhY2U6IFwicHJlLXdyYXBcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBzdHlsZT17eyBmb250V2VpZ2h0OiA3MDAsIG1hcmdpbkJvdHRvbTogOCB9fT5cbiAgICAgICAgU2VydmVyIEVycm9yIGR1cmluZyB7ZXJyb3IucGhhc2V9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtlcnJvci5tZXNzYWdlICYmIDxkaXY+e2Vycm9yLm1lc3NhZ2V9PC9kaXY+fVxuICAgICAge2Vycm9yLnN0YWNrICYmIChcbiAgICAgICAgPGRldGFpbHMgb3BlbiBzdHlsZT17eyBtYXJnaW5Ub3A6IDggfX0+XG4gICAgICAgICAgPHN1bW1hcnk+U3RhY2sgdHJhY2U8L3N1bW1hcnk+XG4gICAgICAgICAgPHByZSBzdHlsZT17eyBtYXJnaW46IDAgfX0+e2Vycm9yLnN0YWNrfTwvcHJlPlxuICAgICAgICA8L2RldGFpbHM+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIiwKICAgICJpbXBvcnQgUmVhY3QsIHsgY2xvbmVFbGVtZW50LCBjcmVhdGVFbGVtZW50LCBpc1ZhbGlkRWxlbWVudCwgbGF6eSwgU3VzcGVuc2UsIHR5cGUgQ29tcG9uZW50VHlwZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRSZWdpc3RyeSwgVkRPTU5vZGUsIFZET01VcGRhdGUgfSBmcm9tIFwiLi92ZG9tXCI7XG5pbXBvcnQge1xuICBGUkFHTUVOVF9UQUcsXG4gIGlzRWxlbWVudE5vZGUsXG4gIGlzTW91bnRQb2ludE5vZGUsXG4gIE1PVU5UX1BPSU5UX1BSRUZJWCxcbn0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHR5cGUgeyBQdWxzZVNvY2tldElPQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBWRE9NUmVuZGVyZXIge1xuICBwcml2YXRlIGNhbGxiYWNrQ2FjaGU6IE1hcDxzdHJpbmcsICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xpZW50OiBQdWxzZVNvY2tldElPQ2xpZW50LFxuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgY29tcG9uZW50czogQ29tcG9uZW50UmVnaXN0cnlcbiAgKSB7XG4gICAgdGhpcy5jYWxsYmFja0NhY2hlID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgZ2V0Q2FsbGJhY2soa2V5OiBzdHJpbmcpIHtcbiAgICBsZXQgZm4gPSB0aGlzLmNhbGxiYWNrQ2FjaGUuZ2V0KGtleSk7XG4gICAgaWYgKCFmbikge1xuICAgICAgZm4gPSAoLi4uYXJncykgPT4gdGhpcy5jbGllbnQuaW52b2tlQ2FsbGJhY2sodGhpcy5wYXRoLCBrZXksIGFyZ3MpO1xuICAgICAgdGhpcy5jYWxsYmFja0NhY2hlLnNldChrZXksIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcmVuZGVyTm9kZShub2RlOiBWRE9NTm9kZSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgZWFybHlcbiAgICBpZiAoXG4gICAgICBub2RlID09IG51bGwgfHwgLy8gY2F0Y2hlcyBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwiYm9vbGVhblwiIHx8XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8vIEVsZW1lbnQgbm9kZXNcbiAgICBpZiAoaXNFbGVtZW50Tm9kZShub2RlKSkge1xuICAgICAgY29uc3QgeyB0YWcsIHByb3BzID0ge30sIGNoaWxkcmVuID0gW10gfSA9IG5vZGU7XG5cbiAgICAgIC8vIFByb2Nlc3MgcHJvcHMgZm9yIGNhbGxiYWNrc1xuICAgICAgY29uc3QgcHJvY2Vzc2VkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW3Byb3BLZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdGFydHNXaXRoKFwiJCRmbjpcIikpIHtcbiAgICAgICAgICBjb25zdCBjYWxsYmFja0tleSA9IHZhbHVlLnN1YnN0cmluZyhcIiQkZm46XCIubGVuZ3RoKTtcbiAgICAgICAgICBwcm9jZXNzZWRQcm9wc1twcm9wS2V5XSA9IHRoaXMuZ2V0Q2FsbGJhY2soY2FsbGJhY2tLZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZFByb3BzW3Byb3BLZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmtleSkge1xuICAgICAgICBwcm9jZXNzZWRQcm9wcy5rZXkgPSBub2RlLmtleTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVuZGVyZWRDaGlsZHJlbiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuLnB1c2godGhpcy5yZW5kZXJOb2RlKGNoaWxkKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc01vdW50UG9pbnROb2RlKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEtleSA9IG5vZGUudGFnLnNsaWNlKE1PVU5UX1BPSU5UX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgICBjb25zdCBDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHNbY29tcG9uZW50S2V5XSE7XG4gICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICBwcm9jZXNzZWRQcm9wcyxcbiAgICAgICAgICAuLi5yZW5kZXJlZENoaWxkcmVuXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgICAgICB0YWcgPT09IEZSQUdNRU5UX1RBRyA/IFJlYWN0LkZyYWdtZW50IDogdGFnLFxuICAgICAgICBwcm9jZXNzZWRQcm9wcyxcbiAgICAgICAgLi4ucmVuZGVyZWRDaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW5rbm93biBub2RlIHR5cGVzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gVkRPTSBub2RlIHR5cGU6XCIsIG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVXBkYXRlIEZ1bmN0aW9ucyAoc2hhbGxvdy1jbG9uZSBhbG9uZyB1cGRhdGUgcGF0aClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KGVsOiBSZWFjdC5SZWFjdEVsZW1lbnQpOiBSZWFjdC5SZWFjdE5vZGVbXSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gKGVsLnByb3BzIGFzIGFueSk/LmNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0Tm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4uc2xpY2UoKSA6IFtjaGlsZHJlbl07XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NQcm9wc0ZvckNhbGxiYWNrcyhcbiAgcmVuZGVyZXI6IFZET01SZW5kZXJlcixcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBwcm9jZXNzZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBbcHJvcEtleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BzIHx8IHt9KSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIiQkZm46XCIpKSB7XG4gICAgICBjb25zdCBjYWxsYmFja0tleSA9IHZhbHVlLnN1YnN0cmluZyhcIiQkZm46XCIubGVuZ3RoKTtcbiAgICAgIHByb2Nlc3NlZFtwcm9wS2V5XSA9IHJlbmRlcmVyLmdldENhbGxiYWNrKGNhbGxiYWNrS2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkW3Byb3BLZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhDaGlsZHJlbihcbiAgZWw6IFJlYWN0LlJlYWN0RWxlbWVudCxcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVtdXG4pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICAvLyBQcmVzZXJ2ZSBleGlzdGluZyBwcm9wczsgb25seSBvdmVycmlkZSBjaGlsZHJlblxuICByZXR1cm4gY2xvbmVFbGVtZW50KGVsLCB1bmRlZmluZWQsIC4uLmNoaWxkcmVuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VXBkYXRlcyhcbiAgaW5pdGlhbFRyZWU6IFJlYWN0LlJlYWN0Tm9kZSxcbiAgdXBkYXRlczogVkRPTVVwZGF0ZVtdLFxuICByZW5kZXJlcjogVkRPTVJlbmRlcmVyXG4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBsZXQgbmV3VHJlZTogUmVhY3QuUmVhY3ROb2RlID0gaW5pdGlhbFRyZWU7XG4gIGZvciAoY29uc3QgdXBkYXRlIG9mIHVwZGF0ZXMpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHVwZGF0ZS5wYXRoXG4gICAgICAuc3BsaXQoXCIuXCIpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKE51bWJlcik7XG5cbiAgICBjb25zdCBkZXNjZW5kID0gKG5vZGU6IFJlYWN0LlJlYWN0Tm9kZSwgZGVwdGg6IG51bWJlcik6IFJlYWN0LlJlYWN0Tm9kZSA9PiB7XG4gICAgICBpZiAoZGVwdGggPCBwYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRJZHggPSBwYXJ0c1tkZXB0aF0hO1xuICAgICAgICBjb25zdCBjaGlsZHJlbkFyciA9IHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KG5vZGUpO1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuQXJyW2NoaWxkSWR4XTtcbiAgICAgICAgY2hpbGRyZW5BcnJbY2hpbGRJZHhdID0gZGVzY2VuZChjaGlsZCwgZGVwdGggKyAxKSBhcyBhbnk7XG4gICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnRXaXRoQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW5BcnIpO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh1cGRhdGUudHlwZSkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJ1cGRhdGVfcHJvcHNcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBuZXh0UHJvcHMgPSBwcm9jZXNzUHJvcHNGb3JDYWxsYmFja3MocmVuZGVyZXIsIHVwZGF0ZS5kYXRhKTtcbiAgICAgICAgICAvLyBOb3QgcGFzc2luZyBjaGlsZHJlbiAtPiBvbmx5IHVwZGF0ZSB0aGUgcHJvcHNcbiAgICAgICAgICByZXR1cm4gY2xvbmVFbGVtZW50KG5vZGUsIG5leHRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImluc2VydFwiOiB7XG4gICAgICAgICAgYXNzZXJ0SXNFbGVtZW50KG5vZGUsIHBhcnRzLCBkZXB0aCk7XG4gICAgICAgICAgbm9kZSA9IG5vZGUgYXMgUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdG9DaGlsZHJlbkFycmF5RnJvbUVsZW1lbnQobm9kZSk7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5pZHgsIDAsIHJlbmRlcmVyLnJlbmRlck5vZGUodXBkYXRlLmRhdGEpKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChub2RlLCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIGFzc2VydElzRWxlbWVudChub2RlLCBwYXJ0cywgZGVwdGgpO1xuICAgICAgICAgIG5vZGUgPSBub2RlIGFzIFJlYWN0LlJlYWN0RWxlbWVudDtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRvQ2hpbGRyZW5BcnJheUZyb21FbGVtZW50KG5vZGUpO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuaWR4LCAxKTtcbiAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgY2hpbGRyZW4gKFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHRoZSBgbnVsbGAsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgb2ZmaWNpYWwgUmVhY3QgZG9jcyBzYXkpXG4gICAgICAgICAgcmV0dXJuIGNsb25lRWxlbWVudChub2RlLCBudWxsISwgLi4uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBhc3NlcnRJc0VsZW1lbnQobm9kZSwgcGFydHMsIGRlcHRoKTtcbiAgICAgICAgICBub2RlID0gbm9kZSBhcyBSZWFjdC5SZWFjdEVsZW1lbnQ7XG4gICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0b0NoaWxkcmVuQXJyYXlGcm9tRWxlbWVudChub2RlKTtcbiAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGRyZW4uc3BsaWNlKHVwZGF0ZS5kYXRhLmZyb21faW5kZXgsIDEpWzBdO1xuICAgICAgICAgIGNoaWxkcmVuLnNwbGljZSh1cGRhdGUuZGF0YS50b19pbmRleCwgMCwgaXRlbSk7XG4gICAgICAgICAgLy8gT25seSB1cGRhdGUgdGhlIGNoaWxkcmVuIChUeXBlU2NyaXB0IGRvZXNuJ3QgbGlrZSB0aGUgYG51bGxgLCBidXQgdGhhdCdzIHdoYXQgdGhlIG9mZmljaWFsIFJlYWN0IGRvY3Mgc2F5KVxuICAgICAgICAgIHJldHVybiBjbG9uZUVsZW1lbnQobm9kZSwgbnVsbCEsIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbUHVsc2UgcmVuZGVyZXJdIFVua25vd24gdXBkYXRlIHR5cGU6ICR7dXBkYXRlW1widHlwZVwiXX1gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbmV3VHJlZSA9IGRlc2NlbmQobmV3VHJlZSwgMCk7XG4gIH1cbiAgcmV0dXJuIG5ld1RyZWU7XG59XG5cbi8vIFRoZSBgY29tcG9uZW50YCBwcm9wIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBgKCkgPT5cbi8vIGltcG9ydCgnfi9wYXRoL3RvL2NvbXBvbmVudCcpICh3ZSdsbCBuZWVkIHRvIHJlbWFwIGlmIHdlJ3JlIGltcG9ydGluZyBhIG5hbWVkIGV4cG9ydCBhbmQgbm90IHRoZSBkZWZhdWx0KVxuZXhwb3J0IGZ1bmN0aW9uIFJlbmRlckxhenkoXG4gIGNvbXBvbmVudDogKCkgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IENvbXBvbmVudFR5cGU8YW55PiB9PixcbiAgZmFsbGJhY2s/OiBSZWFjdC5SZWFjdE5vZGVcbik6IFJlYWN0LkZDPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPHVua25vd24+PiB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGxhenkoY29tcG9uZW50KTtcbiAgcmV0dXJuICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx1bmtub3duPikgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e2ZhbGxiYWNrID8/IDw+PC8+fT5cbiAgICAgICAgPENvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L0NvbXBvbmVudD5cbiAgICAgIDwvU3VzcGVuc2U+XG4gICAgKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNFbGVtZW50KFxuICBub2RlOiBSZWFjdC5SZWFjdE5vZGUsXG4gIHBhcnRzOiBudW1iZXJbXSxcbiAgZGVwdGg6IG51bWJlclxuKTogbm9kZSBpcyBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiICYmICFpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIG5vZGU6XCIsIG5vZGUpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbm9kZSBhdCBwYXRoIFwiICsgcGFydHMuc2xpY2UoMCwgZGVwdGgpLmpvaW4oXCIuXCIpKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDb21wb25lbnRUeXBlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8vIFNwZWNpYWwgcHJlZml4ZXMgZm9yIHJlc2VydmVkIG5vZGUgdHlwZXNcbmV4cG9ydCBjb25zdCBGUkFHTUVOVF9UQUcgPSBcIiQkZnJhZ21lbnRcIjtcbmV4cG9ydCBjb25zdCBNT1VOVF9QT0lOVF9QUkVGSVggPSBcIiQkXCI7XG5cbi8vIGV4cG9ydCB0eXBlIExhenlDb21wb25lbnQgPSAoKSA9PiBQcm9taXNlPHsgZGVmYXVsdDogQ29tcG9uZW50VHlwZTxhbnk+IH0+O1xuZXhwb3J0IHR5cGUgUmVnaXN0cnlFbnRyeSA9IENvbXBvbmVudFR5cGU8YW55PjtcbmV4cG9ydCB0eXBlIENvbXBvbmVudFJlZ2lzdHJ5ID0gUmVjb3JkPHN0cmluZywgQ29tcG9uZW50VHlwZTxhbnk+PjtcblxuZXhwb3J0IGludGVyZmFjZSBWRE9NRWxlbWVudCB7XG4gIHRhZzogc3RyaW5nO1xuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNoaWxkcmVuPzogVkRPTU5vZGVbXTtcbiAga2V5Pzogc3RyaW5nO1xuICBsYXp5PzogYm9vbGVhbjtcbn1cblxuLy8gUHJpbWl0aXZlIG5vZGVzIHRoYXQgY2FuIGJlIHJlbmRlcmVkXG5leHBvcnQgdHlwZSBQcmltaXRpdmVOb2RlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcblxuLy8gVkRPTU5vZGUgaXMgZWl0aGVyIGEgcHJpbWl0aXZlIChzdHJpbmcsIG51bWJlciwgYm9vbGVhbikgb3IgYW4gZWxlbWVudCBub2RlLlxuLy8gQm9vbGVhbnMgYXJlIHZhbGlkIGNoaWxkcmVuIGluIFJlYWN0IGJ1dCBkbyBub3QgcmVuZGVyIGFueXRoaW5nLlxuLy8gTW91bnQgcG9pbnRzIGFyZSBqdXN0IFVJRWxlbWVudE5vZGVzIHdpdGggdGFncyBzdGFydGluZyB3aXRoICQkQ29tcG9uZW50S2V5XG5leHBvcnQgdHlwZSBWRE9NTm9kZSA9IFByaW1pdGl2ZU5vZGUgfCBWRE9NRWxlbWVudDtcblxuZXhwb3J0IHR5cGUgVkRPTSA9IFZET01Ob2RlO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVUeXBlID1cbiAgfCBcImluc2VydFwiXG4gIHwgXCJyZW1vdmVcIlxuICB8IFwicmVwbGFjZVwiXG4gIHwgXCJ1cGRhdGVfcHJvcHNcIlxuICB8IFwibW92ZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogVXBkYXRlVHlwZTtcbiAgcGF0aDogc3RyaW5nOyAvLyBEb3Qtc2VwYXJhdGVkIHBhdGggdG8gdGhlIG5vZGVcbiAgZGF0YT86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRVcGRhdGUgZXh0ZW5kcyBWRE9NVXBkYXRlQmFzZSB7XG4gIHR5cGU6IFwiaW5zZXJ0XCI7XG4gIGRhdGE6IFZET01Ob2RlOyAvLyBUaGUgbm9kZSB0byBpbnNlcnRcbiAgaWR4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlbW92ZVwiO1xuICBpZHg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBsYWNlVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInJlcGxhY2VcIjtcbiAgZGF0YTogVkRPTU5vZGU7IC8vIFRoZSBuZXcgbm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb3BzVXBkYXRlIGV4dGVuZHMgVkRPTVVwZGF0ZUJhc2Uge1xuICB0eXBlOiBcInVwZGF0ZV9wcm9wc1wiO1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyAvLyBUaGUgbmV3IHByb3BzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW92ZVVwZGF0ZSBleHRlbmRzIFZET01VcGRhdGVCYXNlIHtcbiAgdHlwZTogXCJtb3ZlXCI7XG4gIGRhdGE6IHtcbiAgICBmcm9tX2luZGV4OiBudW1iZXI7XG4gICAgdG9faW5kZXg6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgVkRPTVVwZGF0ZSA9XG4gIHwgSW5zZXJ0VXBkYXRlXG4gIHwgUmVtb3ZlVXBkYXRlXG4gIHwgUmVwbGFjZVVwZGF0ZVxuICB8IFVwZGF0ZVByb3BzVXBkYXRlXG4gIHwgTW92ZVVwZGF0ZTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgVUkgdHJlZSBzdHJ1Y3R1cmVcbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKG5vZGU6IFZET01Ob2RlKTogbm9kZSBpcyBWRE9NRWxlbWVudCB7XG4gIC8vIE1hdGNoZXMgYWxsIG5vbi10ZXh0IG5vZGVzXG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJiBub2RlICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb3VudFBvaW50Tm9kZShub2RlOiBWRE9NTm9kZSk6IG5vZGUgaXMgVkRPTUVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmXG4gICAgbm9kZSAhPT0gbnVsbCAmJlxuICAgIG5vZGUudGFnLnN0YXJ0c1dpdGgoTU9VTlRfUE9JTlRfUFJFRklYKSAmJlxuICAgIG5vZGUudGFnICE9PSBGUkFHTUVOVF9UQUdcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZTogVkRPTU5vZGUpOiBub2RlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnJhZ21lbnQobm9kZTogVkRPTU5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBub2RlID09PSBcIm9iamVjdFwiICYmIG5vZGUgIT09IG51bGwgJiYgbm9kZS50YWcgPT09IEZSQUdNRU5UX1RBRztcbn1cbiIsCiAgICAiXG50eXBlIFNpbXBsaWZ5PFQ+ID0geyBbSyBpbiBrZXlvZiBUXTogVFtLXSB9ICYge307XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdD4oKSB7XG4gIGZ1bmN0aW9uIF9jcmVhdGVFeHRyYWN0b3I8XG4gICAgY29uc3QgSyBleHRlbmRzIHJlYWRvbmx5IChrZXlvZiBUKVtdLFxuICAgIEMgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDxLW251bWJlcl0gfCBzdHJpbmcsIChzcmM6IFQpID0+IGFueT4+LFxuICA+KGtleXM6IEssIGNvbXB1dGVkPzogQykge1xuICAgIHJldHVybiAoXG4gICAgICBzcmM6IFRcbiAgICApOiBTaW1wbGlmeTxcbiAgICAgIFBpY2s8VCwgS1tudW1iZXJdPiAmIHtcbiAgICAgICAgW1AgaW4ga2V5b2YgQ10tPzogQ1tQXSBleHRlbmRzICguLi5hcmdzOiBhbnkpID0+IGluZmVyIFIgPyBSIDogbmV2ZXI7XG4gICAgICB9XG4gICAgPiA9PiB7XG4gICAgICBjb25zdCBvdXQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBvdXRba2V5IGFzIHN0cmluZ10gPSAoc3JjIGFzIGFueSlba2V5IGFzIHN0cmluZ107XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb25zdCBmbiA9IGNvbXB1dGVkW2tleV0hO1xuICAgICAgICAgIG91dFtrZXldID0gZm4oc3JjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9O1xuICB9XG4gIHJldHVybiBfY3JlYXRlRXh0cmFjdG9yO1xufSIsCiAgICAiaW1wb3J0IHsgY3JlYXRlRXh0cmFjdG9yIH0gZnJvbSBcIi4vZXh0cmFjdG9yXCI7XG5cbi8vIEJhc2UgZXh0cmFjdG9ycyAoY2FtZWxDYXNlKSBzaW1pbGFyIHRvIGV2ZW50cy50cyBzdHlsZVxuY29uc3QgbG93ZXJUYWdOYW1lID0gKGU6IEVsZW1lbnQpID0+IGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5jb25zdCBFTEVNRU5UX0tFWVMgPSBbXG4gIFwiaWRcIixcbiAgXCJjbGFzc05hbWVcIixcbiAgXCJ0YWdOYW1lXCIsXG4gIFwibG9jYWxOYW1lXCIsXG4gIFwiY2xpZW50SGVpZ2h0XCIsXG4gIFwiY2xpZW50TGVmdFwiLFxuICBcImNsaWVudFRvcFwiLFxuICBcImNsaWVudFdpZHRoXCIsXG4gIFwic2Nyb2xsSGVpZ2h0XCIsXG4gIFwic2Nyb2xsTGVmdFwiLFxuICBcInNjcm9sbFRvcFwiLFxuICBcInNjcm9sbFdpZHRoXCIsXG4gIFwic2xvdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEVsZW1lbnQpW107XG5cbmNvbnN0IEhUTUxfT1JfU1ZHX0tFWVMgPSBbXG4gIFwiYXV0b2ZvY3VzXCIsXG4gIFwidGFiSW5kZXhcIixcbiAgXCJub25jZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPclNWR0VsZW1lbnQpW107XG5cbmNvbnN0IEhUTUxfRUxFTUVOVF9CQVNFX0tFWVMgPSBbXG4gIFwiYWNjZXNzS2V5XCIsXG4gIFwiYWNjZXNzS2V5TGFiZWxcIixcbiAgXCJhdXRvY2FwaXRhbGl6ZVwiLFxuICBcImRpclwiLFxuICBcImRyYWdnYWJsZVwiLFxuICBcImhpZGRlblwiLFxuICBcImluZXJ0XCIsXG4gIFwibGFuZ1wiLFxuICBcIm9mZnNldEhlaWdodFwiLFxuICBcIm9mZnNldExlZnRcIixcbiAgXCJvZmZzZXRUb3BcIixcbiAgXCJvZmZzZXRXaWR0aFwiLFxuICBcInBvcG92ZXJcIixcbiAgXCJzcGVsbGNoZWNrXCIsXG4gIFwidGl0bGVcIixcbiAgXCJ0cmFuc2xhdGVcIixcbiAgXCJ3cml0aW5nU3VnZ2VzdGlvbnNcIixcbiAgXCJjb250ZW50RWRpdGFibGVcIixcbiAgXCJlbnRlcktleUhpbnRcIixcbiAgXCJpc0NvbnRlbnRFZGl0YWJsZVwiLFxuICBcImlucHV0TW9kZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxFbGVtZW50KVtdO1xuXG5jb25zdCBleHRyYWN0RWxlbWVudCA9IGNyZWF0ZUV4dHJhY3RvcjxFbGVtZW50PigpKEVMRU1FTlRfS0VZUywge1xuICB0YWdOYW1lOiBsb3dlclRhZ05hbWUsXG59KTtcblxuY29uc3QgZXh0cmFjdEhUTUxPclNWR0VsZW1lbnQgPVxuICBjcmVhdGVFeHRyYWN0b3I8SFRNTE9yU1ZHRWxlbWVudD4oKShIVE1MX09SX1NWR19LRVlTKTtcblxuY29uc3QgZXh0cmFjdEhUTUxFbGVtZW50QmFzZU9ubHkgPSBjcmVhdGVFeHRyYWN0b3I8SFRNTEVsZW1lbnQ+KCkoXG4gIEhUTUxfRUxFTUVOVF9CQVNFX0tFWVNcbik7XG5cbmZ1bmN0aW9uIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0OiBIVE1MRWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIC4uLmV4dHJhY3RFbGVtZW50KGVsdCksXG4gICAgLi4uZXh0cmFjdEhUTUxPclNWR0VsZW1lbnQoZWx0IGFzIEhUTUxPclNWR0VsZW1lbnQpLFxuICAgIC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2VPbmx5KGVsdCksXG4gIH07XG59XG5cbi8vIEhlbHBlciB0byBjb21wb3NlIHBlci1lbGVtZW50IGV4dHJhY3RvcnMgd2l0aCB0aGUgc2hhcmVkIGJhc2VcbmZ1bmN0aW9uIHdpdGhCYXNlPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4oXG4gIGtleXM6IHJlYWRvbmx5IChrZXlvZiBUKVtdLFxuICBjb21wdXRlZD86IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgKHNyYzogVCkgPT4gYW55Pj5cbikge1xuICBjb25zdCBvbmx5ID0gY3JlYXRlRXh0cmFjdG9yPFQ+KCkoa2V5cywgY29tcHV0ZWQgYXMgYW55KTtcbiAgcmV0dXJuIChlbHQ6IFQpID0+ICh7IC4uLmV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KSwgLi4ub25seShlbHQpIH0pO1xufVxuXG5jb25zdCBIVE1MX0FOQ0hPUl9LRVlTID0gW1xuICBcImhhc2hcIixcbiAgXCJob3N0XCIsXG4gIFwiaG9zdG5hbWVcIixcbiAgXCJocmVmXCIsXG4gIFwib3JpZ2luXCIsXG4gIFwicGFzc3dvcmRcIixcbiAgXCJwYXRobmFtZVwiLFxuICBcInBvcnRcIixcbiAgXCJwcm90b2NvbFwiLFxuICBcInNlYXJjaFwiLFxuICBcInRhcmdldFwiLFxuICBcImRvd25sb2FkXCIsXG4gIFwicmVsXCIsXG4gIFwiaHJlZmxhbmdcIixcbiAgXCJ0eXBlXCIsXG4gIFwidXNlcm5hbWVcIixcbiAgXCJwaW5nXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJ0ZXh0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEFuY2hvckVsZW1lbnQpW107XG5jb25zdCBhbmNob3JFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQW5jaG9yRWxlbWVudD4oSFRNTF9BTkNIT1JfS0VZUyk7XG5cbmNvbnN0IEhUTUxfQVJFQV9LRVlTID0gW1xuICBcImFsdFwiLFxuICBcImNvb3Jkc1wiLFxuICBcImRvd25sb2FkXCIsXG4gIFwiaGFzaFwiLFxuICBcImhvc3RcIixcbiAgXCJob3N0bmFtZVwiLFxuICBcImhyZWZcIixcbiAgXCJvcmlnaW5cIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInBhdGhuYW1lXCIsXG4gIFwicG9ydFwiLFxuICBcInByb3RvY29sXCIsXG4gIFwicmVsXCIsXG4gIFwic2VhcmNoXCIsXG4gIFwic2hhcGVcIixcbiAgXCJ0YXJnZXRcIixcbiAgXCJ1c2VybmFtZVwiLFxuICBcInBpbmdcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxBcmVhRWxlbWVudClbXTtcbmNvbnN0IGFyZWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQXJlYUVsZW1lbnQ+KEhUTUxfQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9NRURJQV9LRVlTID0gW1xuICBcImF1dG9wbGF5XCIsXG4gIFwiY29udHJvbHNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImN1cnJlbnRTcmNcIixcbiAgXCJjdXJyZW50VGltZVwiLFxuICBcImRlZmF1bHRNdXRlZFwiLFxuICBcImRlZmF1bHRQbGF5YmFja1JhdGVcIixcbiAgXCJkdXJhdGlvblwiLFxuICBcImVuZGVkXCIsXG4gIFwibG9vcFwiLFxuICBcIm11dGVkXCIsXG4gIFwibmV0d29ya1N0YXRlXCIsXG4gIFwicGF1c2VkXCIsXG4gIFwicGxheWJhY2tSYXRlXCIsXG4gIFwicHJlbG9hZFwiLFxuICBcInJlYWR5U3RhdGVcIixcbiAgXCJzZWVraW5nXCIsXG4gIFwic3JjXCIsXG4gIFwidm9sdW1lXCIsXG4gIFwicHJlc2VydmVzUGl0Y2hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWVkaWFFbGVtZW50KVtdO1xuY29uc3QgbWVkaWFFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWVkaWFFbGVtZW50PihIVE1MX01FRElBX0tFWVMpO1xuXG5jb25zdCBhdWRpb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxBdWRpb0VsZW1lbnQpID0+IG1lZGlhRXh0cmFjdG9yKGVsdCk7XG5cbmNvbnN0IEhUTUxfQlVUVE9OX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwiZm9ybUFjdGlvblwiLFxuICBcImZvcm1FbmN0eXBlXCIsXG4gIFwiZm9ybU1ldGhvZFwiLFxuICBcImZvcm1Ob1ZhbGlkYXRlXCIsXG4gIFwiZm9ybVRhcmdldFwiLFxuICBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQnV0dG9uRWxlbWVudClbXTtcbmNvbnN0IGJ1dHRvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxCdXR0b25FbGVtZW50PihIVE1MX0JVVFRPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9EQVRBX0tFWVMgPSBbXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGF0YUVsZW1lbnQpW107XG5jb25zdCBkYXRhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERhdGFFbGVtZW50PihIVE1MX0RBVEFfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRU1CRURfS0VZUyA9IFtcbiAgXCJoZWlnaHRcIixcbiAgXCJzcmNcIixcbiAgXCJ0eXBlXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRW1iZWRFbGVtZW50KVtdO1xuY29uc3QgZW1iZWRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRW1iZWRFbGVtZW50PihIVE1MX0VNQkVEX0tFWVMpO1xuXG5jb25zdCBIVE1MX0ZJRUxEU0VUX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEZpZWxkU2V0RWxlbWVudClbXTtcbmNvbnN0IGZpZWxkc2V0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEZpZWxkU2V0RWxlbWVudD4oSFRNTF9GSUVMRFNFVF9LRVlTKTtcblxuY29uc3QgSFRNTF9GT1JNX0tFWVMgPSBbXG4gIFwiYWNjZXB0Q2hhcnNldFwiLFxuICBcImFjdGlvblwiLFxuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImVuY29kaW5nXCIsXG4gIFwiZW5jdHlwZVwiLFxuICBcImxlbmd0aFwiLFxuICBcIm1ldGhvZFwiLFxuICBcIm5hbWVcIixcbiAgXCJub1ZhbGlkYXRlXCIsXG4gIFwidGFyZ2V0XCIsXG4gIFwicmVsXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEZvcm1FbGVtZW50KVtdO1xuY29uc3QgZm9ybUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxGb3JtRWxlbWVudD4oSFRNTF9GT1JNX0tFWVMpO1xuXG5jb25zdCBIVE1MX0lGUkFNRV9LRVlTID0gW1xuICBcImFsbG93XCIsXG4gIFwiYWxsb3dGdWxsc2NyZWVuXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibmFtZVwiLFxuICBcInJlZmVycmVyUG9saWN5XCIsXG4gIFwic3JjXCIsXG4gIFwic3JjZG9jXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImZyYW1lQm9yZGVyXCIsXG4gIFwibG9uZ0Rlc2NcIixcbiAgXCJtYXJnaW5IZWlnaHRcIixcbiAgXCJtYXJnaW5XaWR0aFwiLFxuICBcInNjcm9sbGluZ1wiLFxuICBcInNhbmRib3hcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSUZyYW1lRWxlbWVudClbXTtcbmNvbnN0IGlmcmFtZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJRnJhbWVFbGVtZW50PihIVE1MX0lGUkFNRV9LRVlTKTtcblxuY29uc3QgSFRNTF9JTUFHRV9LRVlTID0gW1xuICBcImFsdFwiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGVjb2RpbmdcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJpc01hcFwiLFxuICBcImxvYWRpbmdcIixcbiAgXCJuYXR1cmFsSGVpZ2h0XCIsXG4gIFwibmF0dXJhbFdpZHRoXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJzaXplc1wiLFxuICBcInNyY1wiLFxuICBcInNyY3NldFwiLFxuICBcInVzZU1hcFwiLFxuICBcIndpZHRoXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJib3JkZXJcIixcbiAgXCJjb21wbGV0ZVwiLFxuICBcImhzcGFjZVwiLFxuICBcImxvbmdEZXNjXCIsXG4gIFwibG93c3JjXCIsXG4gIFwibmFtZVwiLFxuICBcInZzcGFjZVwiLFxuICBcInhcIixcbiAgXCJ5XCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxJbWFnZUVsZW1lbnQpW107XG5jb25zdCBpbWFnZUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxJbWFnZUVsZW1lbnQ+KEhUTUxfSU1BR0VfS0VZUyk7XG5cbmNvbnN0IEhUTUxfSU5QVVRfS0VZUyA9IFtcbiAgXCJhY2NlcHRcIixcbiAgXCJhbHRcIixcbiAgXCJhdXRvY29tcGxldGVcIixcbiAgXCJjaGVja2VkXCIsXG4gIFwiZGVmYXVsdENoZWNrZWRcIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJkaXJOYW1lXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJpbmRldGVybWluYXRlXCIsXG4gIFwibWF4XCIsXG4gIFwibWF4TGVuZ3RoXCIsXG4gIFwibWluXCIsXG4gIFwibWluTGVuZ3RoXCIsXG4gIFwibXVsdGlwbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicGF0dGVyblwiLFxuICBcInBsYWNlaG9sZGVyXCIsXG4gIFwicmVhZE9ubHlcIixcbiAgXCJyZXF1aXJlZFwiLFxuICBcInNlbGVjdGlvbkRpcmVjdGlvblwiLFxuICBcInNlbGVjdGlvbkVuZFwiLFxuICBcInNlbGVjdGlvblN0YXJ0XCIsXG4gIFwic2l6ZVwiLFxuICBcInNyY1wiLFxuICBcInN0ZXBcIixcbiAgXCJ0eXBlXCIsXG4gIFwidmFsdWVcIixcbiAgXCJ2YWx1ZUFzTnVtYmVyXCIsXG4gIFwid2lkdGhcIixcbiAgXCJhbGlnblwiLFxuICBcImNhcHR1cmVcIixcbiAgXCJmb3JtQWN0aW9uXCIsXG4gIFwiZm9ybUVuY3R5cGVcIixcbiAgXCJmb3JtTWV0aG9kXCIsXG4gIFwiZm9ybU5vVmFsaWRhdGVcIixcbiAgXCJmb3JtVGFyZ2V0XCIsXG4gIFwidXNlTWFwXCIsXG4gIFwidmFsaWRhdGlvbk1lc3NhZ2VcIixcbiAgXCJ3aWxsVmFsaWRhdGVcIixcbiAgXCJwb3BvdmVyVGFyZ2V0QWN0aW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTElucHV0RWxlbWVudClbXTtcbmNvbnN0IGlucHV0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTElucHV0RWxlbWVudD4oSFRNTF9JTlBVVF9LRVlTKTtcblxuY29uc3QgSFRNTF9MQUJFTF9LRVlTID0gW1xuICBcImh0bWxGb3JcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTGFiZWxFbGVtZW50KVtdO1xuY29uc3QgbGFiZWxFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTGFiZWxFbGVtZW50PihIVE1MX0xBQkVMX0tFWVMpO1xuXG5jb25zdCBIVE1MX0xJX0tFWVMgPSBbXG4gIFwidmFsdWVcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExJRWxlbWVudClbXTtcbmNvbnN0IGxpRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTExJRWxlbWVudD4oSFRNTF9MSV9LRVlTKTtcblxuY29uc3QgSFRNTF9MSU5LX0tFWVMgPSBbXG4gIFwiYXNcIixcbiAgXCJjcm9zc09yaWdpblwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwiZmV0Y2hQcmlvcml0eVwiLFxuICBcImhyZWZcIixcbiAgXCJocmVmbGFuZ1wiLFxuICBcImltYWdlU2l6ZXNcIixcbiAgXCJpbWFnZVNyY3NldFwiLFxuICBcImludGVncml0eVwiLFxuICBcIm1lZGlhXCIsXG4gIFwicmVmZXJyZXJQb2xpY3lcIixcbiAgXCJyZWxcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY2hhcnNldFwiLFxuICBcInJldlwiLFxuICBcInRhcmdldFwiLFxuICBcInNpemVzXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTExpbmtFbGVtZW50KVtdO1xuY29uc3QgbGlua0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxMaW5rRWxlbWVudD4oSFRNTF9MSU5LX0tFWVMpO1xuXG5jb25zdCBIVE1MX01BUF9LRVlTID0gW1xuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWFwRWxlbWVudClbXTtcbmNvbnN0IG1hcEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNYXBFbGVtZW50PihIVE1MX01BUF9LRVlTKTtcblxuY29uc3QgSFRNTF9NRVRFUl9LRVlTID0gW1xuICBcImhpZ2hcIixcbiAgXCJsb3dcIixcbiAgXCJtYXhcIixcbiAgXCJtaW5cIixcbiAgXCJvcHRpbXVtXCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MTWV0ZXJFbGVtZW50KVtdO1xuY29uc3QgbWV0ZXJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MTWV0ZXJFbGVtZW50PihIVE1MX01FVEVSX0tFWVMpO1xuXG5jb25zdCBIVE1MX01PRF9LRVlTID0gW1xuICBcImNpdGVcIixcbiAgXCJkYXRlVGltZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxNb2RFbGVtZW50KVtdO1xuY29uc3QgbW9kRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE1vZEVsZW1lbnQ+KEhUTUxfTU9EX0tFWVMpO1xuXG5jb25zdCBIVE1MX09MX0tFWVMgPSBbXG4gIFwicmV2ZXJzZWRcIixcbiAgXCJzdGFydFwiLFxuICBcInR5cGVcIixcbiAgXCJjb21wYWN0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE9MaXN0RWxlbWVudClbXTtcbmNvbnN0IG9saXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9MaXN0RWxlbWVudD4oSFRNTF9PTF9LRVlTKTtcblxuY29uc3QgSFRNTF9PQkpFQ1RfS0VZUyA9IFtcbiAgXCJkYXRhXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwibmFtZVwiLFxuICBcInR5cGVcIixcbiAgXCJ1c2VNYXBcIixcbiAgXCJ3aWR0aFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJhcmNoaXZlXCIsXG4gIFwiYm9yZGVyXCIsXG4gIFwiY29kZVwiLFxuICBcImNvZGVCYXNlXCIsXG4gIFwiY29kZVR5cGVcIixcbiAgXCJkZWNsYXJlXCIsXG4gIFwiaHNwYWNlXCIsXG4gIFwic3RhbmRieVwiLFxuICBcInZzcGFjZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPYmplY3RFbGVtZW50KVtdO1xuY29uc3Qgb2JqZWN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTE9iamVjdEVsZW1lbnQ+KEhUTUxfT0JKRUNUX0tFWVMpO1xuXG5jb25zdCBIVE1MX09QVEdST1VQX0tFWVMgPSBbXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJsYWJlbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxPcHRHcm91cEVsZW1lbnQpW107XG5jb25zdCBvcHRncm91cEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPcHRHcm91cEVsZW1lbnQ+KEhUTUxfT1BUR1JPVVBfS0VZUyk7XG5cbmNvbnN0IEhUTUxfT1BUSU9OX0tFWVMgPSBbXG4gIFwiZGVmYXVsdFNlbGVjdGVkXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJpbmRleFwiLFxuICBcImxhYmVsXCIsXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MT3B0aW9uRWxlbWVudClbXTtcbmNvbnN0IG9wdGlvbkV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxPcHRpb25FbGVtZW50PihIVE1MX09QVElPTl9LRVlTKTtcblxuY29uc3QgSFRNTF9PVVRQVVRfS0VZUyA9IFtcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJuYW1lXCIsXG4gIFwidHlwZVwiLFxuICBcInZhbHVlXCIsXG4gIFwiaHRtbEZvclwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE91dHB1dEVsZW1lbnQpW107XG5jb25zdCBvdXRwdXRFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MT3V0cHV0RWxlbWVudD4oSFRNTF9PVVRQVVRfS0VZUyk7XG5cbmNvbnN0IEhUTUxfUFJPR1JFU1NfS0VZUyA9IFtcbiAgXCJtYXhcIixcbiAgXCJwb3NpdGlvblwiLFxuICBcInZhbHVlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFByb2dyZXNzRWxlbWVudClbXTtcbmNvbnN0IHByb2dyZXNzRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFByb2dyZXNzRWxlbWVudD4oSFRNTF9QUk9HUkVTU19LRVlTKTtcblxuY29uc3QgSFRNTF9RVU9URV9LRVlTID0gW1xuICBcImNpdGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MUXVvdGVFbGVtZW50KVtdO1xuY29uc3QgcXVvdGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUXVvdGVFbGVtZW50PihIVE1MX1FVT1RFX0tFWVMpO1xuXG5jb25zdCBjaXRlRXh0cmFjdG9yID0gKGVsdDogSFRNTEVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TQ1JJUFRfS0VZUyA9IFtcbiAgXCJhc3luY1wiLFxuICBcImNyb3NzT3JpZ2luXCIsXG4gIFwiZGVmZXJcIixcbiAgXCJmZXRjaFByaW9yaXR5XCIsXG4gIFwiaW50ZWdyaXR5XCIsXG4gIFwibm9Nb2R1bGVcIixcbiAgXCJyZWZlcnJlclBvbGljeVwiLFxuICBcInNyY1wiLFxuICBcInRleHRcIixcbiAgXCJ0eXBlXCIsXG4gIFwiY2hhcnNldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTY3JpcHRFbGVtZW50KVtdO1xuY29uc3QgZXh0cmFjdEhUTUxTY3JpcHRPbmx5ID0gY3JlYXRlRXh0cmFjdG9yPEhUTUxTY3JpcHRFbGVtZW50PigpKFxuICBIVE1MX1NDUklQVF9LRVlTLFxuICB7XG4gICAgZXZlbnQ6IChzKSA9PiAocyBhcyBhbnkpLmV2ZW50LFxuICAgIGh0bWxGb3I6IChzKSA9PiAocyBhcyBhbnkpLmh0bWxGb3IsXG4gIH1cbik7XG5jb25zdCBzY3JpcHRFeHRyYWN0b3IgPSAoZWx0OiBIVE1MU2NyaXB0RWxlbWVudCkgPT4gKHtcbiAgLi4uZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpLFxuICAuLi5leHRyYWN0SFRNTFNjcmlwdE9ubHkoZWx0KSxcbn0pO1xuXG5jb25zdCBIVE1MX1NFTEVDVF9LRVlTID0gW1xuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImRpc2FibGVkXCIsXG4gIFwibGVuZ3RoXCIsXG4gIFwibXVsdGlwbGVcIixcbiAgXCJuYW1lXCIsXG4gIFwicmVxdWlyZWRcIixcbiAgXCJzZWxlY3RlZEluZGV4XCIsXG4gIFwic2l6ZVwiLFxuICBcInR5cGVcIixcbiAgXCJ2YWx1ZVwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFNlbGVjdEVsZW1lbnQpW107XG5jb25zdCBzZWxlY3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MU2VsZWN0RWxlbWVudD4oSFRNTF9TRUxFQ1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU0xPVF9LRVlTID0gW1xuICBcIm5hbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MU2xvdEVsZW1lbnQpW107XG5jb25zdCBzbG90RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNsb3RFbGVtZW50PihIVE1MX1NMT1RfS0VZUyk7XG5cbmNvbnN0IEhUTUxfU09VUkNFX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwibWVkaWFcIixcbiAgXCJzaXplc1wiLFxuICBcInNyY1wiLFxuICBcInNyY3NldFwiLFxuICBcInR5cGVcIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxTb3VyY2VFbGVtZW50KVtdO1xuY29uc3Qgc291cmNlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFNvdXJjZUVsZW1lbnQ+KEhUTUxfU09VUkNFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1RBQkxFX0NBUFRJT05fS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNhcHRpb25FbGVtZW50KVtdO1xuY29uc3QgdGFibGVDYXB0aW9uRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnQ+KFxuICBIVE1MX1RBQkxFX0NBUFRJT05fS0VZU1xuKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DRUxMX0tFWVMgPSBbXG4gIFwiYWJiclwiLFxuICBcImNlbGxJbmRleFwiLFxuICBcImNvbFNwYW5cIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwicm93U3BhblwiLFxuICBcInNjb3BlXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJheGlzXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJoZWlnaHRcIixcbiAgXCJub1dyYXBcIixcbiAgXCJ2QWxpZ25cIixcbiAgXCJ3aWR0aFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZUNlbGxFbGVtZW50KVtdO1xuY29uc3QgdGFibGVDZWxsRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+KEhUTUxfVEFCTEVfQ0VMTF9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9DT0xfS0VZUyA9IFtcbiAgXCJzcGFuXCIsXG4gIFwiYWxpZ25cIixcbiAgXCJjaFwiLFxuICBcImNoT2ZmXCIsXG4gIFwidkFsaWduXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVDb2xFbGVtZW50KVtdO1xuY29uc3QgdGFibGVDb2xFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGFibGVDb2xFbGVtZW50PihIVE1MX1RBQkxFX0NPTF9LRVlTKTtcblxuY29uc3QgSFRNTF9UQUJMRV9LRVlTID0gW1xuICBcImFsaWduXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImJvcmRlclwiLFxuICBcImNlbGxQYWRkaW5nXCIsXG4gIFwiY2VsbFNwYWNpbmdcIixcbiAgXCJmcmFtZVwiLFxuICBcInJ1bGVzXCIsXG4gIFwic3VtbWFyeVwiLFxuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRhYmxlRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRhYmxlRWxlbWVudD4oSFRNTF9UQUJMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9UUl9LRVlTID0gW1xuICBcInJvd0luZGV4XCIsXG4gIFwic2VjdGlvblJvd0luZGV4XCIsXG4gIFwiYWxpZ25cIixcbiAgXCJiZ0NvbG9yXCIsXG4gIFwiY2hcIixcbiAgXCJjaE9mZlwiLFxuICBcInZBbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxUYWJsZVJvd0VsZW1lbnQpW107XG5jb25zdCB0YWJsZVJvd0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxUYWJsZVJvd0VsZW1lbnQ+KEhUTUxfVFJfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFNFQ1RJT05fS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuICBcImNoXCIsXG4gIFwiY2hPZmZcIixcbiAgXCJ2QWxpZ25cIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGFibGVTZWN0aW9uRWxlbWVudClbXTtcbmNvbnN0IHRhYmxlU2VjdGlvbkV4dHJhY3RvciA9XG4gIHdpdGhCYXNlPEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50PihIVE1MX1RTRUNUSU9OX0tFWVMpO1xuXG5jb25zdCB0ZW1wbGF0ZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpID0+XG4gIGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9URVhUQVJFQV9LRVlTID0gW1xuICBcImF1dG9jb21wbGV0ZVwiLFxuICBcImNvbHNcIixcbiAgXCJkZWZhdWx0VmFsdWVcIixcbiAgXCJkaXJOYW1lXCIsXG4gIFwiZGlzYWJsZWRcIixcbiAgXCJtYXhMZW5ndGhcIixcbiAgXCJtaW5MZW5ndGhcIixcbiAgXCJuYW1lXCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbiAgXCJyZWFkT25seVwiLFxuICBcInJlcXVpcmVkXCIsXG4gIFwicm93c1wiLFxuICBcInNlbGVjdGlvbkRpcmVjdGlvblwiLFxuICBcInNlbGVjdGlvbkVuZFwiLFxuICBcInNlbGVjdGlvblN0YXJ0XCIsXG4gIFwidmFsdWVcIixcbiAgXCJ3cmFwXCIsXG4gIFwidGV4dExlbmd0aFwiLFxuICBcInZhbGlkYXRpb25NZXNzYWdlXCIsXG4gIFwid2lsbFZhbGlkYXRlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFRleHRBcmVhRWxlbWVudClbXTtcbmNvbnN0IHRleHRhcmVhRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRleHRBcmVhRWxlbWVudD4oSFRNTF9URVhUQVJFQV9LRVlTKTtcblxuY29uc3QgSFRNTF9USU1FX0tFWVMgPSBbXG4gIFwiZGF0ZVRpbWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGltZUVsZW1lbnQpW107XG5jb25zdCB0aW1lRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFRpbWVFbGVtZW50PihIVE1MX1RJTUVfS0VZUyk7XG5cbmNvbnN0IEhUTUxfVFJBQ0tfS0VZUyA9IFtcbiAgXCJkZWZhdWx0XCIsXG4gIFwia2luZFwiLFxuICBcImxhYmVsXCIsXG4gIFwicmVhZHlTdGF0ZVwiLFxuICBcInNyY1wiLFxuICBcInNyY2xhbmdcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVHJhY2tFbGVtZW50KVtdO1xuY29uc3QgdHJhY2tFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVHJhY2tFbGVtZW50PihIVE1MX1RSQUNLX0tFWVMpO1xuXG5jb25zdCBIVE1MX1ZJREVPX0tFWVMgPSBbXG4gIFwiaGVpZ2h0XCIsXG4gIFwicG9zdGVyXCIsXG4gIFwidmlkZW9IZWlnaHRcIixcbiAgXCJ2aWRlb1dpZHRoXCIsXG4gIFwid2lkdGhcIixcbiAgXCJwbGF5c0lubGluZVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxWaWRlb0VsZW1lbnQpW107XG5jb25zdCBleHRyYWN0SFRNTFZpZGVvT25seSA9XG4gIGNyZWF0ZUV4dHJhY3RvcjxIVE1MVmlkZW9FbGVtZW50PigpKEhUTUxfVklERU9fS0VZUyk7XG5jb25zdCB2aWRlb0V4dHJhY3RvciA9IChlbHQ6IEhUTUxWaWRlb0VsZW1lbnQpID0+ICh7XG4gIC4uLm1lZGlhRXh0cmFjdG9yKGVsdCksXG4gIC4uLmV4dHJhY3RIVE1MVmlkZW9Pbmx5KGVsdCksXG59KTtcblxuY29uc3QgSFRNTF9CUl9LRVlTID0gW1xuICBcImNsZWFyXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEJSRWxlbWVudClbXTtcbmNvbnN0IGJyRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJSRWxlbWVudD4oSFRNTF9CUl9LRVlTKTtcblxuY29uc3QgSFRNTF9CQVNFX0tFWVMgPSBbXG4gIFwiaHJlZlwiLFxuICBcInRhcmdldFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxCYXNlRWxlbWVudClbXTtcbmNvbnN0IGJhc2VFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MQmFzZUVsZW1lbnQ+KEhUTUxfQkFTRV9LRVlTKTtcblxuY29uc3QgSFRNTF9CT0RZX0tFWVMgPSBbXG4gIFwiYUxpbmtcIixcbiAgXCJiYWNrZ3JvdW5kXCIsXG4gIFwiYmdDb2xvclwiLFxuICBcImxpbmtcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidkxpbmtcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MQm9keUVsZW1lbnQpW107XG5jb25zdCBib2R5RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTEJvZHlFbGVtZW50PihIVE1MX0JPRFlfS0VZUyk7XG5cbmNvbnN0IEhUTUxfRExJU1RfS0VZUyA9IFtcbiAgXCJjb21wYWN0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTERMaXN0RWxlbWVudClbXTtcbmNvbnN0IGRsaXN0RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERMaXN0RWxlbWVudD4oSFRNTF9ETElTVF9LRVlTKTtcblxuY29uc3QgSFRNTF9ERVRBSUxTX0tFWVMgPSBbXG4gIFwib3BlblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEZXRhaWxzRWxlbWVudClbXTtcbmNvbnN0IGRldGFpbHNFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MRGV0YWlsc0VsZW1lbnQ+KEhUTUxfREVUQUlMU19LRVlTKTtcblxuY29uc3QgSFRNTF9ESUFMT0dfS0VZUyA9IFtcbiAgXCJvcGVuXCIsXG4gIFwicmV0dXJuVmFsdWVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MRGlhbG9nRWxlbWVudClbXTtcbmNvbnN0IGRpYWxvZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxEaWFsb2dFbGVtZW50PihIVE1MX0RJQUxPR19LRVlTKTtcblxuY29uc3QgSFRNTF9ESVZfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxEaXZFbGVtZW50KVtdO1xuY29uc3QgZGl2RXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTERpdkVsZW1lbnQ+KEhUTUxfRElWX0tFWVMpO1xuXG5jb25zdCBoZWFkRXh0cmFjdG9yID0gKGVsdDogSFRNTEhlYWRFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfSEVBRElOR19LRVlTID0gW1xuICBcImFsaWduXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEhlYWRpbmdFbGVtZW50KVtdO1xuY29uc3QgaGVhZGluZ0V4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIZWFkaW5nRWxlbWVudD4oSFRNTF9IRUFESU5HX0tFWVMpO1xuXG5jb25zdCBIVE1MX0hSX0tFWVMgPSBbXG4gIFwiYWxpZ25cIixcbiAgXCJjb2xvclwiLFxuICBcIm5vU2hhZGVcIixcbiAgXCJzaXplXCIsXG4gIFwid2lkdGhcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MSFJFbGVtZW50KVtdO1xuY29uc3QgaHJFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MSFJFbGVtZW50PihIVE1MX0hSX0tFWVMpO1xuXG5jb25zdCBIVE1MX0hUTUxfS0VZUyA9IFtcbiAgXCJ2ZXJzaW9uXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTEh0bWxFbGVtZW50KVtdO1xuY29uc3QgaHRtbEV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxIdG1sRWxlbWVudD4oSFRNTF9IVE1MX0tFWVMpO1xuXG5jb25zdCBtZW51RXh0cmFjdG9yID0gKGVsdDogSFRNTE1lbnVFbGVtZW50KSA9PiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlKGVsdCk7XG5cbmNvbnN0IEhUTUxfTUVUQV9LRVlTID0gW1xuICBcImNvbnRlbnRcIixcbiAgXCJodHRwRXF1aXZcIixcbiAgXCJuYW1lXCIsXG4gIFwic2NoZW1lXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTE1ldGFFbGVtZW50KVtdO1xuY29uc3QgbWV0YUV4dHJhY3RvciA9IHdpdGhCYXNlPEhUTUxNZXRhRWxlbWVudD4oSFRNTF9NRVRBX0tFWVMpO1xuXG5jb25zdCBIVE1MX1BfS0VZUyA9IFtcbiAgXCJhbGlnblwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIEhUTUxQYXJhZ3JhcGhFbGVtZW50KVtdO1xuY29uc3QgcGFyYWdyYXBoRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFBhcmFncmFwaEVsZW1lbnQ+KEhUTUxfUF9LRVlTKTtcblxuY29uc3QgcGljdHVyZUV4dHJhY3RvciA9IChlbHQ6IEhUTUxQaWN0dXJlRWxlbWVudCkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50QmFzZShlbHQpO1xuXG5jb25zdCBIVE1MX1BSRV9LRVlTID0gW1xuICBcIndpZHRoXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFByZUVsZW1lbnQpW107XG5jb25zdCBwcmVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MUHJlRWxlbWVudD4oSFRNTF9QUkVfS0VZUyk7XG5cbmNvbnN0IHNwYW5FeHRyYWN0b3IgPSAoZWx0OiBIVE1MU3BhbkVsZW1lbnQpID0+IGV4dHJhY3RIVE1MRWxlbWVudEJhc2UoZWx0KTtcblxuY29uc3QgSFRNTF9TVFlMRV9LRVlTID0gW1xuICBcIm1lZGlhXCIsXG4gIFwidHlwZVwiLFxuICBcImRpc2FibGVkXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgSFRNTFN0eWxlRWxlbWVudClbXTtcbmNvbnN0IHN0eWxlRXh0cmFjdG9yID0gd2l0aEJhc2U8SFRNTFN0eWxlRWxlbWVudD4oSFRNTF9TVFlMRV9LRVlTKTtcblxuY29uc3QgSFRNTF9USVRMRV9LRVlTID0gW1xuICBcInRleHRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVGl0bGVFbGVtZW50KVtdO1xuY29uc3QgdGl0bGVFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVGl0bGVFbGVtZW50PihIVE1MX1RJVExFX0tFWVMpO1xuXG5jb25zdCBIVE1MX1VMX0tFWVMgPSBbXG4gIFwiY29tcGFjdFwiLFxuICBcInR5cGVcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBIVE1MVUxpc3RFbGVtZW50KVtdO1xuY29uc3QgdWxpc3RFeHRyYWN0b3IgPSB3aXRoQmFzZTxIVE1MVUxpc3RFbGVtZW50PihIVE1MX1VMX0tFWVMpO1xuXG4vLyBNYXAgb2YgdGFnTmFtZSAtPiBleHRyYWN0b3IgKGNvbmNpc2UsIGxpa2UgZXZlbnRzLnRzKVxuY29uc3QgZWxlbWVudEV4dHJhY3RvcnM6IFJlY29yZDxzdHJpbmcsIChlbHQ6IGFueSkgPT4gb2JqZWN0PiA9IHtcbiAgQTogYW5jaG9yRXh0cmFjdG9yLFxuICBBUkVBOiBhcmVhRXh0cmFjdG9yLFxuICBBVURJTzogYXVkaW9FeHRyYWN0b3IsXG4gIEJBU0U6IGJhc2VFeHRyYWN0b3IsXG4gIEJMT0NLUVVPVEU6IHF1b3RlRXh0cmFjdG9yLFxuICBROiBxdW90ZUV4dHJhY3RvcixcbiAgQk9EWTogYm9keUV4dHJhY3RvcixcbiAgQlI6IGJyRXh0cmFjdG9yLFxuICBCVVRUT046IGJ1dHRvbkV4dHJhY3RvcixcbiAgQ0FOVkFTOiBleHRyYWN0SFRNTEVsZW1lbnRCYXNlLFxuICBDQVBUSU9OOiB0YWJsZUNhcHRpb25FeHRyYWN0b3IsXG4gIENJVEU6IGNpdGVFeHRyYWN0b3IsXG4gIENPTDogdGFibGVDb2xFeHRyYWN0b3IsXG4gIENPTEdST1VQOiB0YWJsZUNvbEV4dHJhY3RvcixcbiAgREFUQTogZGF0YUV4dHJhY3RvcixcbiAgREVUQUlMUzogZGV0YWlsc0V4dHJhY3RvcixcbiAgRElBTE9HOiBkaWFsb2dFeHRyYWN0b3IsXG4gIERJVjogZGl2RXh0cmFjdG9yLFxuICBETDogZGxpc3RFeHRyYWN0b3IsXG4gIEVNQkVEOiBlbWJlZEV4dHJhY3RvcixcbiAgRklFTERTRVQ6IGZpZWxkc2V0RXh0cmFjdG9yLFxuICBGT1JNOiBmb3JtRXh0cmFjdG9yLFxuICBIMTogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDI6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEgzOiBoZWFkaW5nRXh0cmFjdG9yLFxuICBINDogaGVhZGluZ0V4dHJhY3RvcixcbiAgSDU6IGhlYWRpbmdFeHRyYWN0b3IsXG4gIEg2OiBoZWFkaW5nRXh0cmFjdG9yLFxuICBIRUFEOiBoZWFkRXh0cmFjdG9yLFxuICBIUjogaHJFeHRyYWN0b3IsXG4gIEhUTUw6IGh0bWxFeHRyYWN0b3IsXG4gIElGUkFNRTogaWZyYW1lRXh0cmFjdG9yLFxuICBJTUc6IGltYWdlRXh0cmFjdG9yLFxuICBJTlBVVDogaW5wdXRFeHRyYWN0b3IsXG4gIExBQkVMOiBsYWJlbEV4dHJhY3RvcixcbiAgTEk6IGxpRXh0cmFjdG9yLFxuICBMSU5LOiBsaW5rRXh0cmFjdG9yLFxuICBNQVA6IG1hcEV4dHJhY3RvcixcbiAgTUVOVTogbWVudUV4dHJhY3RvcixcbiAgTUVUQTogbWV0YUV4dHJhY3RvcixcbiAgTUVURVI6IG1ldGVyRXh0cmFjdG9yLFxuICBJTlM6IG1vZEV4dHJhY3RvcixcbiAgREVMOiBtb2RFeHRyYWN0b3IsXG4gIE9CSkVDVDogb2JqZWN0RXh0cmFjdG9yLFxuICBPTDogb2xpc3RFeHRyYWN0b3IsXG4gIE9QVEdST1VQOiBvcHRncm91cEV4dHJhY3RvcixcbiAgT1BUSU9OOiBvcHRpb25FeHRyYWN0b3IsXG4gIE9VVFBVVDogb3V0cHV0RXh0cmFjdG9yLFxuICBQOiBwYXJhZ3JhcGhFeHRyYWN0b3IsXG4gIFBJQ1RVUkU6IHBpY3R1cmVFeHRyYWN0b3IsXG4gIFBSRTogcHJlRXh0cmFjdG9yLFxuICBQUk9HUkVTUzogcHJvZ3Jlc3NFeHRyYWN0b3IsXG4gIFNDUklQVDogc2NyaXB0RXh0cmFjdG9yLFxuICBTRUxFQ1Q6IHNlbGVjdEV4dHJhY3RvcixcbiAgU0xPVDogc2xvdEV4dHJhY3RvcixcbiAgU09VUkNFOiBzb3VyY2VFeHRyYWN0b3IsXG4gIFNQQU46IHNwYW5FeHRyYWN0b3IsXG4gIFNUWUxFOiBzdHlsZUV4dHJhY3RvcixcbiAgVEFCTEU6IHRhYmxlRXh0cmFjdG9yLFxuICBUQk9EWTogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBUSEVBRDogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBURk9PVDogdGFibGVTZWN0aW9uRXh0cmFjdG9yLFxuICBURDogdGFibGVDZWxsRXh0cmFjdG9yLFxuICBUSDogdGFibGVDZWxsRXh0cmFjdG9yLFxuICBURU1QTEFURTogdGVtcGxhdGVFeHRyYWN0b3IsXG4gIFRFWFRBUkVBOiB0ZXh0YXJlYUV4dHJhY3RvcixcbiAgVElNRTogdGltZUV4dHJhY3RvcixcbiAgVElUTEU6IHRpdGxlRXh0cmFjdG9yLFxuICBUUjogdGFibGVSb3dFeHRyYWN0b3IsXG4gIFRSQUNLOiB0cmFja0V4dHJhY3RvcixcbiAgVUw6IHVsaXN0RXh0cmFjdG9yLFxuICBWSURFTzogdmlkZW9FeHRyYWN0b3IsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEhUTUxFbGVtZW50KGVsdDogSFRNTEVsZW1lbnQpOiBvYmplY3Qge1xuICBjb25zdCB0YWdOYW1lID0gZWx0LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCBleHRyYWN0b3IgPSBlbGVtZW50RXh0cmFjdG9yc1t0YWdOYW1lXTtcbiAgaWYgKGV4dHJhY3Rvcikge1xuICAgIHJldHVybiBleHRyYWN0b3IoZWx0KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVuZXhwZWN0ZWQgSFRNTCBlbGVtZW50IHRhZzogJHtlbHQudGFnTmFtZX0gKHVwZGF0ZSAud2ViL2N1c3RvbS9zZXJpYWxpemUudHMpYFxuICApO1xufVxuIiwKICAgICIvKiA9PT0gSU1QT1JUQU5UID09PSAqL1xuXG5pbXBvcnQgeyBleHRyYWN0SFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlRXh0cmFjdG9yIH0gZnJvbSBcIi4vZXh0cmFjdG9yXCI7XG5cbi8vIFJldXNhYmxlIGNvbXB1dGVkIG1hcHBlcnMgKGhlbHBzIGJ1bmRsZXJzL21pbmlmaWVycyBzaGFyZSByZWZlcmVuY2VzKVxuY29uc3QgbWFwVGFyZ2V0ID0gKGU6IHsgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfSkgPT5cbiAgZXh0cmFjdEhUTUxFbGVtZW50KGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbmNvbnN0IG1hcFJlbGF0ZWQgPSAoZTogeyByZWxhdGVkVGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfSkgPT5cbiAgZS5yZWxhdGVkVGFyZ2V0ID8gZXh0cmFjdEhUTUxFbGVtZW50KGUucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCkgOiBudWxsO1xuXG5mdW5jdGlvbiBtYWtlRXh0cmFjdG9yPEsgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4oXG4gIGtleXM6IEssXG4gIGNvbXB1dGVkPzogUmVjb3JkPHN0cmluZywgKGV2dDogYW55KSA9PiBhbnk+XG4pIHtcbiAgcmV0dXJuIGNyZWF0ZUV4dHJhY3Rvcjxhbnk+KCkoXG4gICAga2V5cyBhcyBhbnksXG4gICAge1xuICAgICAgdGFyZ2V0OiBtYXBUYXJnZXQsXG4gICAgICAuLi4oY29tcHV0ZWQgfHwge30pLFxuICAgIH0gYXMgYW55XG4gICk7XG59XG5cbmNvbnN0IFNZTlRIRVRJQ19LRVlTID0gW1xuICBcInRhcmdldFwiLFxuICBcImJ1YmJsZXNcIixcbiAgXCJjYW5jZWxhYmxlXCIsXG4gIFwiZGVmYXVsdFByZXZlbnRlZFwiLFxuICBcImV2ZW50UGhhc2VcIixcbiAgXCJpc1RydXN0ZWRcIixcbiAgXCJ0aW1lU3RhbXBcIixcbiAgXCJ0eXBlXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgUmVhY3QuU3ludGhldGljRXZlbnQpW107XG5cbmNvbnN0IFVJX0tFWVMgPSBbXG4gIC4uLlNZTlRIRVRJQ19LRVlTLFxuICBcImRldGFpbFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0LlVJRXZlbnQpW107XG5cbmNvbnN0IE1PVVNFX0tFWVMgPSBbXG4gIC4uLlVJX0tFWVMsXG4gIFwiYWx0S2V5XCIsXG4gIFwiYnV0dG9uXCIsXG4gIFwiYnV0dG9uc1wiLFxuICBcImNsaWVudFhcIixcbiAgXCJjbGllbnRZXCIsXG4gIFwiY3RybEtleVwiLFxuICBcIm1ldGFLZXlcIixcbiAgXCJtb3ZlbWVudFhcIixcbiAgXCJtb3ZlbWVudFlcIixcbiAgXCJwYWdlWFwiLFxuICBcInBhZ2VZXCIsXG4gIFwic2NyZWVuWFwiLFxuICBcInNjcmVlbllcIixcbiAgXCJzaGlmdEtleVwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIFJlYWN0Lk1vdXNlRXZlbnQpW107XG5cbmNvbnN0IFBPSU5URVJfS0VZUyA9IFtcbiAgLi4uTU9VU0VfS0VZUyxcbiAgXCJwb2ludGVySWRcIixcbiAgXCJwcmVzc3VyZVwiLFxuICBcInRhbmdlbnRpYWxQcmVzc3VyZVwiLFxuICBcInRpbHRYXCIsXG4gIFwidGlsdFlcIixcbiAgXCJ0d2lzdFwiLFxuICBcIndpZHRoXCIsXG4gIFwiaGVpZ2h0XCIsXG4gIFwicG9pbnRlclR5cGVcIixcbiAgXCJpc1ByaW1hcnlcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IChrZXlvZiBSZWFjdC5Qb2ludGVyRXZlbnQpW107XG5cbmNvbnN0IHN5bnRoZXRpY0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMpO1xuXG5jb25zdCB1aUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoVUlfS0VZUyk7XG5cbmNvbnN0IG1vdXNlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihNT1VTRV9LRVlTLCB7IHJlbGF0ZWRUYXJnZXQ6IG1hcFJlbGF0ZWQgfSk7XG5cbmNvbnN0IGNsaXBib2FyZEV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMsIHtcbiAgY2xpcGJvYXJkRGF0YTogKGUpID0+IGV4dHJhY3REYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKSxcbn0pO1xuXG5jb25zdCBjb21wb3NpdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJkYXRhXCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgZHJhZ0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoTU9VU0VfS0VZUywge1xuICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxuICBkYXRhVHJhbnNmZXI6IChlKSA9PiBleHRyYWN0RGF0YVRyYW5zZmVyKGUuZGF0YVRyYW5zZmVyKSxcbn0pO1xuXG5jb25zdCBwb2ludGVyRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihQT0lOVEVSX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbn0pO1xuXG5jb25zdCBmb2N1c0V4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoU1lOVEhFVElDX0tFWVMsIHtcbiAgcmVsYXRlZFRhcmdldDogbWFwUmVsYXRlZCxcbn0pO1xuXG5jb25zdCBmb3JtRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGludmFsaWRFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFNZTlRIRVRJQ19LRVlTKTtcblxuY29uc3QgY2hhbmdlRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihTWU5USEVUSUNfS0VZUyk7XG5cbmNvbnN0IGtleWJvYXJkRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihbXG4gIC4uLlVJX0tFWVMsXG4gIFwiYWx0S2V5XCIsXG4gIFwiY3RybEtleVwiLFxuICBcImNvZGVcIixcbiAgXCJrZXlcIixcbiAgXCJsb2NhbGVcIixcbiAgXCJsb2NhdGlvblwiLFxuICBcIm1ldGFLZXlcIixcbiAgXCJyZXBlYXRcIixcbiAgXCJzaGlmdEtleVwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvdWNoRXh0cmFjdG9yID0gbWFrZUV4dHJhY3RvcihcbiAgW1xuICAgIC4uLlVJX0tFWVMsXG4gICAgXCJhbHRLZXlcIixcbiAgICBcImN0cmxLZXlcIixcbiAgICBcIm1ldGFLZXlcIixcbiAgICBcInNoaWZ0S2V5XCIsXG4gICAgXCJjaGFuZ2VkVG91Y2hlc1wiLFxuICAgIFwidGFyZ2V0VG91Y2hlc1wiLFxuICAgIFwidG91Y2hlc1wiLFxuICBdIGFzIGNvbnN0LFxuICB7XG4gICAgY2hhbmdlZFRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS5jaGFuZ2VkVG91Y2hlcyksXG4gICAgdGFyZ2V0VG91Y2hlczogKGUpID0+IG1hcFRvdWNoTGlzdChlLnRhcmdldFRvdWNoZXMpLFxuICAgIHRvdWNoZXM6IChlKSA9PiBtYXBUb3VjaExpc3QoZS50b3VjaGVzKSxcbiAgfVxuKTtcblxuY29uc3Qgd2hlZWxFeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFxuICBbLi4uTU9VU0VfS0VZUywgXCJkZWx0YU1vZGVcIiwgXCJkZWx0YVhcIiwgXCJkZWx0YVlcIiwgXCJkZWx0YVpcIl0gYXMgY29uc3QsXG4gIHtcbiAgICByZWxhdGVkVGFyZ2V0OiBtYXBSZWxhdGVkLFxuICB9XG4pO1xuXG5jb25zdCBhbmltYXRpb25FeHRyYWN0b3IgPSBtYWtlRXh0cmFjdG9yKFtcbiAgLi4uU1lOVEhFVElDX0tFWVMsXG4gIFwiYW5pbWF0aW9uTmFtZVwiLFxuICBcImVsYXBzZWRUaW1lXCIsXG4gIFwicHNldWRvRWxlbWVudFwiLFxuXSBhcyBjb25zdCk7XG5cbmNvbnN0IHRvZ2dsZUV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJvbGRTdGF0ZVwiLFxuICBcIm5ld1N0YXRlXCIsXG5dIGFzIGNvbnN0KTtcblxuY29uc3QgdHJhbnNpdGlvbkV4dHJhY3RvciA9IG1ha2VFeHRyYWN0b3IoW1xuICAuLi5TWU5USEVUSUNfS0VZUyxcbiAgXCJlbGFwc2VkVGltZVwiLFxuICBcInByb3BlcnR5TmFtZVwiLFxuICBcInBzZXVkb0VsZW1lbnRcIixcbl0gYXMgY29uc3QpO1xuXG5mdW5jdGlvbiBtYXBUb3VjaExpc3QobGlzdDogYW55KTogYW55W10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShsaXN0IGFzIEFycmF5TGlrZTxhbnk+KS5tYXAoKHRvdWNoOiBhbnkpID0+ICh7XG4gICAgdGFyZ2V0OiBleHRyYWN0SFRNTEVsZW1lbnQodG91Y2gudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSxcbiAgICBpZGVudGlmaWVyOiB0b3VjaC5pZGVudGlmaWVyLFxuICAgIHNjcmVlblg6IHRvdWNoLnNjcmVlblgsXG4gICAgc2NyZWVuWTogdG91Y2guc2NyZWVuWSxcbiAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFksXG4gICAgcGFnZVg6IHRvdWNoLnBhZ2VYLFxuICAgIHBhZ2VZOiB0b3VjaC5wYWdlWSxcbiAgfSkpO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBEYXRhVHJhbnNmZXIgcHJvcGVydGllc1xuZnVuY3Rpb24gZXh0cmFjdERhdGFUcmFuc2ZlcihkdDogRGF0YVRyYW5zZmVyIHwgbnVsbCk6IG9iamVjdCB8IG51bGwge1xuICBpZiAoIWR0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgaWYgKGR0Lml0ZW1zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkdC5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGR0Lml0ZW1zW2ldITtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBraW5kOiBpdGVtLmtpbmQsXG4gICAgICAgIHR5cGU6IGl0ZW0udHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGRyb3BfZWZmZWN0OiBkdC5kcm9wRWZmZWN0LFxuICAgIGVmZmVjdF9hbGxvd2VkOiBkdC5lZmZlY3RBbGxvd2VkLFxuICAgIGl0ZW1zOiBpdGVtcyxcbiAgICB0eXBlczogQXJyYXkuZnJvbShkdC50eXBlcyB8fCBbXSksXG4gIH07XG59XG5cbmNvbnN0IGV2ZW50RXh0cmFjdG9yTWFwOiB7IFtrZXk6IHN0cmluZ106IChldnQ6IGFueSkgPT4gb2JqZWN0IH0gPSB7fTtcblxuZnVuY3Rpb24gYWRkKG1hcDogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBmbjogYW55KSB7XG4gIGZvciAoY29uc3QgbiBvZiBuYW1lcykgbWFwW25dID0gZm47XG59XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcInBvaW50ZXJkb3duXCIsXG4gICAgXCJwb2ludGVybW92ZVwiLFxuICAgIFwicG9pbnRlcnVwXCIsXG4gICAgXCJwb2ludGVyY2FuY2VsXCIsXG4gICAgXCJnb3Rwb2ludGVyY2FwdHVyZVwiLFxuICAgIFwibG9zdHBvaW50ZXJjYXB0dXJlXCIsXG4gICAgXCJwb2ludGVyZW50ZXJcIixcbiAgICBcInBvaW50ZXJsZWF2ZVwiLFxuICAgIFwicG9pbnRlcm92ZXJcIixcbiAgICBcInBvaW50ZXJvdXRcIixcbiAgXSxcbiAgcG9pbnRlckV4dHJhY3RvclxuKTtcblxuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1xuICAgIFwiY2xpY2tcIixcbiAgICBcImNvbnRleHRtZW51XCIsXG4gICAgXCJkYmxjbGlja1wiLFxuICAgIFwibW91c2Vkb3duXCIsXG4gICAgXCJtb3VzZWVudGVyXCIsXG4gICAgXCJtb3VzZWxlYXZlXCIsXG4gICAgXCJtb3VzZW1vdmVcIixcbiAgICBcIm1vdXNlb3V0XCIsXG4gICAgXCJtb3VzZW92ZXJcIixcbiAgICBcIm1vdXNldXBcIixcbiAgXSxcbiAgbW91c2VFeHRyYWN0b3Jcbik7XG5cbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcbiAgICBcImRyYWdcIixcbiAgICBcImRyYWdlbmRcIixcbiAgICBcImRyYWdlbnRlclwiLFxuICAgIFwiZHJhZ2V4aXRcIixcbiAgICBcImRyYWdsZWF2ZVwiLFxuICAgIFwiZHJhZ292ZXJcIixcbiAgICBcImRyYWdzdGFydFwiLFxuICAgIFwiZHJvcFwiLFxuICBdLFxuICBkcmFnRXh0cmFjdG9yXG4pO1xuXG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImtleWRvd25cIiwgXCJrZXlwcmVzc1wiLCBcImtleXVwXCJdLCBrZXlib2FyZEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcImZvY3VzXCIsIFwiYmx1clwiXSwgZm9jdXNFeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJjaGFuZ2VcIiwgXCJpbnB1dFwiXSwgY2hhbmdlRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiaW52YWxpZFwiXSwgaW52YWxpZEV4dHJhY3Rvcik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInJlc2V0XCIsIFwic3VibWl0XCJdLCBmb3JtRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wiY29weVwiLCBcImN1dFwiLCBcInBhc3RlXCJdLCBjbGlwYm9hcmRFeHRyYWN0b3IpO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1wiY29tcG9zaXRpb25lbmRcIiwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIFwiY29tcG9zaXRpb251cGRhdGVcIl0sXG4gIGNvbXBvc2l0aW9uRXh0cmFjdG9yXG4pO1xuYWRkKFxuICBldmVudEV4dHJhY3Rvck1hcCxcbiAgW1widG91Y2hjYW5jZWxcIiwgXCJ0b3VjaGVuZFwiLCBcInRvdWNobW92ZVwiLCBcInRvdWNoc3RhcnRcIl0sXG4gIHRvdWNoRXh0cmFjdG9yXG4pO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJzY3JvbGxcIl0sIHVpRXh0cmFjdG9yKTtcbmFkZChldmVudEV4dHJhY3Rvck1hcCwgW1wid2hlZWxcIl0sIHdoZWVsRXh0cmFjdG9yKTtcbmFkZChcbiAgZXZlbnRFeHRyYWN0b3JNYXAsXG4gIFtcImFuaW1hdGlvbnN0YXJ0XCIsIFwiYW5pbWF0aW9uZW5kXCIsIFwiYW5pbWF0aW9uaXRlcmF0aW9uXCJdLFxuICBhbmltYXRpb25FeHRyYWN0b3Jcbik7XG5hZGQoZXZlbnRFeHRyYWN0b3JNYXAsIFtcInRyYW5zaXRpb25lbmRcIl0sIHRyYW5zaXRpb25FeHRyYWN0b3IpO1xuYWRkKGV2ZW50RXh0cmFjdG9yTWFwLCBbXCJ0b2dnbGVcIl0sIHRvZ2dsZUV4dHJhY3Rvcik7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXZlbnQodmFsdWU6IGFueSk6IGFueSB7XG4gIC8vIER1Y2stdHlwaW5nIGZvciBSZWFjdCdzIFN5bnRoZXRpY0V2ZW50LlxuICAvLyBXZSBjaGVjayBmb3IgcHJvcGVydGllcyB0aGF0IGFyZSB1bmlxdWUgdG8gc3ludGhldGljIGV2ZW50cy5cbiAgaWYgKFxuICAgIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJuYXRpdmVFdmVudFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmlzRGVmYXVsdFByZXZlbnRlZCA9PT0gXCJmdW5jdGlvblwiXG4gICkge1xuICAgIGNvbnN0IGV2dCA9IHZhbHVlIGFzIFJlYWN0LlN5bnRoZXRpY0V2ZW50O1xuICAgIC8vIFRoZSBgdHlwZWAgcHJvcGVydHkgaXMgY3J1Y2lhbCBmb3IgdGhlIGxvb2t1cC5cbiAgICBpZiAodHlwZW9mIGV2dC50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFjdG9yID0gZXZlbnRFeHRyYWN0b3JNYXBbZXZ0LnR5cGUudG9Mb3dlckNhc2UoKV07XG4gICAgaWYgKGV4dHJhY3Rvcikge1xuICAgICAgcmV0dXJuIGV4dHJhY3RvcihldnQpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciB1bmtub3duIGV2ZW50IHR5cGVzOiBtaW5pbWFsIHN5bnRoZXRpYyBleHRyYWN0b3JcbiAgICByZXR1cm4gc3ludGhldGljRXh0cmFjdG9yKGV2dCk7XG4gIH1cblxuICAvLyBJZiBpdCdzIG5vdCBhIGR1Y2stdHlwZWQgZXZlbnQsIHJldHVybiBpdCBhcyBpcy5cbiAgcmV0dXJuIHZhbHVlO1xufVxuIiwKICAgICIvLyBTaW1wbGUgb2JqZWN0IHRyYW5zZm9ybWF0aW9uIGZvciBzb2NrZXQuaW8gdHJhbnNwb3J0XG4vLyBIYW5kbGVzIERhdGVzLCBGaWxlcyAodmlhIHNvY2tldC5pbyBiaW5hcnkpLCBGb3JtRGF0YSwgYW5kIGNpcmN1bGFyIHJlZmVyZW5jZXNcblxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG59XG5cbmZ1bmN0aW9uIGlzRmlsZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZpbGUge1xuICByZXR1cm4gdHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlO1xufVxuXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRm9ybURhdGEge1xuICByZXR1cm4gdHlwZW9mIEZvcm1EYXRhICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgRm9ybURhdGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkoaW5wdXQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8b2JqZWN0LCBudW1iZXI+KCk7XG4gIGxldCBuZXh0SWQgPSAxO1xuXG4gIGNvbnN0IHRyYW5zZm9ybSA9ICh2YWx1ZTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgIGNvbnN0IG9iaiA9IHZhbHVlIGFzIG9iamVjdDtcbiAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgcmV0dXJuIHsgX19yZWY6IHNlZW4uZ2V0KG9iaikgfTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIHR5cGUgdHJhbnNmb3JtYXRpb25zXG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkKys7XG4gICAgICBzZWVuLnNldChvYmosIGlkKTtcbiAgICAgIHJldHVybiB7IF9fcHVsc2U6IFwiZGF0ZVwiLCBfX2lkOiBpZCwgdGltZXN0YW1wOiB2YWx1ZS5nZXRUaW1lKCkgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNGaWxlKHZhbHVlKSkge1xuICAgICAgLy8gU29ja2V0LmlvIGNhbiBoYW5kbGUgRmlsZSBvYmplY3RzIGRpcmVjdGx5LCBqdXN0IGFkZCBtZXRhZGF0YSB3cmFwcGVyXG4gICAgICBjb25zdCBpZCA9IG5leHRJZCsrO1xuICAgICAgc2Vlbi5zZXQob2JqLCBpZCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3B1bHNlOiBcImZpbGVcIixcbiAgICAgICAgX19pZDogaWQsXG4gICAgICAgIG5hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIHNpemU6IHZhbHVlLnNpemUsXG4gICAgICAgIGxhc3RNb2RpZmllZDogdmFsdWUubGFzdE1vZGlmaWVkLFxuICAgICAgICBmaWxlOiB2YWx1ZSwgLy8gc29ja2V0LmlvIHdpbGwgaGFuZGxlIHRoZSBiaW5hcnkgZGF0YVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoaXNGb3JtRGF0YSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkKys7XG4gICAgICBzZWVuLnNldChvYmosIGlkKTtcbiAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT4gPSB7fTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbCA9IHRyYW5zZm9ybSh2YWwpO1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZmllbGRzW2tleV07XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICBleGlzdGluZy5wdXNoKHRyYW5zZm9ybWVkVmFsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmllbGRzW2tleV0gPSBbZXhpc3RpbmcsIHRyYW5zZm9ybWVkVmFsXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzW2tleV0gPSB0cmFuc2Zvcm1lZFZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBfX3B1bHNlOiBcImZvcm1kYXRhXCIsIF9faWQ6IGlkLCBmaWVsZHMgfTtcbiAgICB9XG5cbiAgICAvLyBSZWd1bGFyIG9iamVjdHMgYW5kIGFycmF5c1xuICAgIGNvbnN0IGlkID0gbmV4dElkKys7XG4gICAgc2Vlbi5zZXQob2JqLCBpZCk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fcHVsc2U6IFwiYXJyYXlcIixcbiAgICAgICAgX19pZDogaWQsXG4gICAgICAgIGl0ZW1zOiB2YWx1ZS5tYXAodHJhbnNmb3JtKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUGxhaW4gb2JqZWN0cyAtIHVzZSBfX3B1bHNlX2RhdGEgdG8gYXZvaWQgY29uZmxpY3RzXG4gICAgY29uc3QgdXNlckRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB2ID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgdHlwZW9mIHYgPT09IFwic3ltYm9sXCIgfHxcbiAgICAgICAgdHlwZW9mIHYgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHVzZXJEYXRhW2tleV0gPSB0cmFuc2Zvcm0odik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgX19wdWxzZTogXCJvYmplY3RcIiwgX19pZDogaWQsIF9fZGF0YTogdXNlckRhdGEgfTtcbiAgfTtcblxuICByZXR1cm4gdHJhbnNmb3JtKGlucHV0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKGlucHV0OiB1bmtub3duKTogdW5rbm93biB7XG4gIGNvbnN0IG9iamVjdHMgPSBuZXcgTWFwPG51bWJlciwgdW5rbm93bj4oKTtcblxuICBjb25zdCByZXNvbHZlID0gKHZhbHVlOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcChyZXNvbHZlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIEhhbmRsZSByZWZlcmVuY2VzXG4gICAgaWYgKG9iai5fX3JlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpZCA9IG9iai5fX3JlZiBhcyBudW1iZXI7XG4gICAgICByZXR1cm4gb2JqZWN0cy5nZXQoaWQpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNwZWNpYWwgdHlwZXMgKG9ubHkgaWYgdGhleSBoYXZlIF9fcHVsc2UgbWFya2VyKVxuICAgIGlmIChvYmouX19wdWxzZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgIGNvbnN0IGlkID0gb2JqLl9faWQgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgRGF0ZShvYmoudGltZXN0YW1wIGFzIG51bWJlcik7XG4gICAgICBvYmplY3RzLnNldChpZCwgcmVzb2x2ZWQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cblxuICAgIGlmIChvYmouX19wdWxzZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIGNvbnN0IGlkID0gb2JqLl9faWQgYXMgbnVtYmVyO1xuICAgICAgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBGaWxlIG9iamVjdCBkaXJlY3RseSAoc29ja2V0LmlvIHByZXNlcnZlcyBpdClcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gb2JqLmZpbGUgYXMgRmlsZTtcbiAgICAgIG9iamVjdHMuc2V0KGlkLCByZXNvbHZlZCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuXG4gICAgaWYgKG9iai5fX3B1bHNlID09PSBcImZvcm1kYXRhXCIpIHtcbiAgICAgIGNvbnN0IGlkID0gb2JqLl9faWQgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgZmllbGRzID0gb2JqLmZpZWxkcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPjtcblxuICAgICAgLy8gUmVjb25zdHJ1Y3QgRm9ybURhdGEgb2JqZWN0XG4gICAgICBjb25zdCByZXNvbHZlZCA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgb2JqZWN0cy5zZXQoaWQsIHJlc29sdmVkKTtcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiBPYmplY3QuZW50cmllcyhmaWVsZHMpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgdmFsdWVzIGZvciBzYW1lIGtleVxuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2KSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW0gPSByZXNvbHZlKGl0ZW0pO1xuICAgICAgICAgICAgcmVzb2x2ZWQuYXBwZW5kKGtleSwgcmVzb2x2ZWRJdGVtIGFzIHN0cmluZyB8IEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFZhbHVlID0gcmVzb2x2ZSh2KTtcbiAgICAgICAgICByZXNvbHZlZC5hcHBlbmQoa2V5LCByZXNvbHZlZFZhbHVlIGFzIHN0cmluZyB8IEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG5cbiAgICBpZiAob2JqLl9fcHVsc2UgPT09IFwiYXJyYXlcIikge1xuICAgICAgY29uc3QgaWQgPSBvYmouX19pZCBhcyBudW1iZXI7XG4gICAgICBjb25zdCByZXNvbHZlZDogdW5rbm93bltdID0gW107XG4gICAgICBvYmplY3RzLnNldChpZCwgcmVzb2x2ZWQpO1xuXG4gICAgICBjb25zdCBpdGVtcyA9IG9iai5pdGVtcyBhcyB1bmtub3duW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc29sdmVkW2ldID0gcmVzb2x2ZShpdGVtc1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuXG4gICAgaWYgKG9iai5fX3B1bHNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBpZCA9IG9iai5fX2lkIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IHJlc29sdmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgb2JqZWN0cy5zZXQoaWQsIHJlc29sdmVkKTtcblxuICAgICAgY29uc3QgdXNlckRhdGEgPSBvYmouX19kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiBPYmplY3QuZW50cmllcyh1c2VyRGF0YSkpIHtcbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHJlc29sdmUodik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuXG4gICAgLy8gVW5rbm93biBvYmplY3QgdHlwZSAtIHByb2Nlc3MgcHJvcGVydGllc1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gcmVzb2x2ZSh2KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gcmVzb2x2ZShpbnB1dCk7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUm91dGVJbmZvIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRNb3VudE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBWRE9NLCBWRE9NVXBkYXRlIH0gZnJvbSBcIi4vdmRvbVwiO1xuaW1wb3J0IHsgZXh0cmFjdEV2ZW50IH0gZnJvbSBcIi4vc2VyaWFsaXplL2V2ZW50c1wiO1xuaW1wb3J0IHtcbiAgc3RyaW5naWZ5IGFzIGZsYXR0ZWRTdHJpbmdpZnksXG4gIHBhcnNlIGFzIGZsYXR0ZWRQYXJzZSxcbn0gZnJvbSBcIi4vc2VyaWFsaXplL2ZsYXR0ZWRcIjtcblxuaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudEFwaVJlc3VsdE1lc3NhZ2UsXG4gIENsaWVudE1lc3NhZ2UsXG4gIFNlcnZlckFwaUNhbGxNZXNzYWdlLFxuICBTZXJ2ZXJFcnJvckluZm8sXG4gIFNlcnZlck1lc3NhZ2UsXG59IGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IE5hdmlnYXRlRnVuY3Rpb24gfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW91bnRlZFZpZXcge1xuICByb3V0ZUluZm86IFJvdXRlSW5mbztcbiAgb25Jbml0OiAodmRvbTogVkRPTSkgPT4gdm9pZDtcbiAgb25VcGRhdGU6IChvcHM6IFZET01VcGRhdGVbXSkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXJ2ZXJFcnJvckxpc3RlbmVyID0gKFxuICBwYXRoOiBzdHJpbmcsXG4gIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VDbGllbnQge1xuICAvLyBDb25uZWN0aW9uIG1hbmFnZW1lbnRcbiAgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+O1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW47XG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZDtcbiAgLy8gTWVzc2FnZXNcbiAgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbyk6IFByb21pc2U8dm9pZD47XG4gIGxlYXZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuICAvLyBWRE9NIHN1YnNjcmlwdGlvblxuICBtb3VudFZpZXcocGF0aDogc3RyaW5nLCB2aWV3OiBNb3VudGVkVmlldyk6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQdWxzZVNvY2tldElPQ2xpZW50IHtcbiAgcHJpdmF0ZSBhY3RpdmVWaWV3czogTWFwPHN0cmluZywgTW91bnRlZFZpZXc+O1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBDbGllbnRNZXNzYWdlW107XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgc2VydmVyRXJyb3JzOiBNYXA8c3RyaW5nLCBTZXJ2ZXJFcnJvckluZm8+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHNlcnZlckVycm9yTGlzdGVuZXJzOiBTZXQ8U2VydmVyRXJyb3JMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB1cmw6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlbmRlcklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBmcmFtZXdvcmtOYXZpZ2F0ZTogTmF2aWdhdGVGdW5jdGlvblxuICApIHtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVWaWV3cyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdO1xuICB9XG4gIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc29ja2V0ID0gaW8odGhpcy51cmwsIHtcbiAgICAgICAgdHJhbnNwb3J0czogW1wid2Vic29ja2V0XCIsIFwid2VidHJhbnNwb3J0XCJdLFxuICAgICAgICBhdXRoOiB7IHJlbmRlcklkOiB0aGlzLnJlbmRlcklkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgICBzb2NrZXQub24oXCJjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3RlZDpcIiwgdGhpcy5zb2NrZXQ/LmlkKTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHNlbmQgYSBuYXZpZ2F0ZSBwYXlsb2FkIGZvciBhbGwgdGhlIHJvdXRlc1xuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCByb3V0ZV0gb2YgdGhpcy5hY3RpdmVWaWV3cykge1xuICAgICAgICAgIHNvY2tldC5lbWl0KFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICBmbGF0dGVkU3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICByb3V0ZUluZm86IHJvdXRlLnJvdXRlSW5mbyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIENsaWVudE1vdW50TWVzc2FnZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBwYXlsb2FkIG9mIHRoaXMubWVzc2FnZVF1ZXVlKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBzZW50IGFib3ZlXG4gICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gXCJtb3VudFwiICYmIHRoaXMuYWN0aXZlVmlld3MuaGFzKHBheWxvYWQucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBXZSdyZSByZW1vdW50aW5nIGFsbCB0aGUgcm91dGVzLCBzbyBubyBuZWVkIHRvIG5hdmlnYXRlXG4gICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gXCJuYXZpZ2F0ZVwiKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc29ja2V0LmVtaXQoXCJtZXNzYWdlXCIsIGZsYXR0ZWRTdHJpbmdpZnkocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKHRydWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKFwiY29ubmVjdF9lcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbU29ja2V0SU9UcmFuc3BvcnRdIENvbm5lY3Rpb24gZmFpbGVkOlwiLCBlcnIpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnMoZmFsc2UpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBXcmFwIGluIGFuIGFycm93IGZ1bmN0aW9uIHRvIGF2b2lkIGxvc2luZyB0aGUgYHRoaXNgIHJlZmVyZW5jZVxuICAgICAgc29ja2V0Lm9uKFwibWVzc2FnZVwiLCAoZGF0YSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJNZXNzYWdlKGZsYXR0ZWRQYXJzZShkYXRhKSBhcyBTZXJ2ZXJNZXNzYWdlKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TZXJ2ZXJFcnJvcihsaXN0ZW5lcjogU2VydmVyRXJyb3JMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICAvLyBFbWl0IGN1cnJlbnQgZXJyb3JzIHRvIG5ldyBsaXN0ZW5lclxuICAgIGZvciAoY29uc3QgW3BhdGgsIGVycl0gb2YgdGhpcy5zZXJ2ZXJFcnJvcnMpIGxpc3RlbmVyKHBhdGgsIGVycik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlTZXJ2ZXJFcnJvcihwYXRoOiBzdHJpbmcsIGVycm9yOiBTZXJ2ZXJFcnJvckluZm8gfCBudWxsKSB7XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzKSBsaXN0ZW5lcihwYXRoLCBlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgZmxhdHRlZFN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW91bnRWaWV3KHBhdGg6IHN0cmluZywgdmlldzogTW91bnRlZFZpZXcpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVWaWV3cy5oYXMocGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAke3BhdGh9IGlzIGFscmVhZHkgbW91bnRlZGApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVZpZXdzLnNldChwYXRoLCB2aWV3KTtcbiAgICB2b2lkIHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJtb3VudFwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbzogdmlldy5yb3V0ZUluZm8sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbmF2aWdhdGUocGF0aDogc3RyaW5nLCByb3V0ZUluZm86IFJvdXRlSW5mbykge1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJuYXZpZ2F0ZVwiLFxuICAgICAgcGF0aCxcbiAgICAgIHJvdXRlSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bm1vdW50KHBhdGg6IHN0cmluZykge1xuICAgIHZvaWQgdGhpcy5zZW5kTWVzc2FnZSh7IHR5cGU6IFwidW5tb3VudFwiLCBwYXRoIH0pO1xuICAgIHRoaXMuYWN0aXZlVmlld3MuZGVsZXRlKHBhdGgpO1xuICB9XG5cbiAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmFjdGl2ZVZpZXdzLmNsZWFyKCk7XG4gICAgdGhpcy5zZXJ2ZXJFcnJvcnMuY2xlYXIoKTtcbiAgICB0aGlzLnNlcnZlckVycm9yTGlzdGVuZXJzLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlcnZlck1lc3NhZ2UobWVzc2FnZTogU2VydmVyTWVzc2FnZSkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiW1B1bHNlQ2xpZW50XSBSZWNlaXZlZCBtZXNzYWdlOlwiLCBtZXNzYWdlKTtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgY2FzZSBcInZkb21faW5pdFwiOiB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5hY3RpdmVWaWV3cy5nZXQobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgLy8gSWdub3JlIG1lc3NhZ2VzIGZvciBwYXRocyB0aGF0IGFyZSBub3QgbW91bnRlZFxuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm47XG4gICAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICAgIHJvdXRlLm9uSW5pdChtZXNzYWdlLnZkb20pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENsZWFyIGFueSBwcmlvciBlcnJvciBmb3IgdGhpcyBwYXRoIG9uIHN1Y2Nlc3NmdWwgaW5pdFxuICAgICAgICBpZiAodGhpcy5zZXJ2ZXJFcnJvcnMuaGFzKG1lc3NhZ2UucGF0aCkpIHtcbiAgICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUobWVzc2FnZS5wYXRoKTtcbiAgICAgICAgICB0aGlzLm5vdGlmeVNlcnZlckVycm9yKG1lc3NhZ2UucGF0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidmRvbV91cGRhdGVcIjoge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuYWN0aXZlVmlld3MuZ2V0KG1lc3NhZ2UucGF0aCk7XG4gICAgICAgIGlmICghcm91dGUpIHJldHVybjsgLy8gTm90IGFuIGFjdGl2ZSBwYXRoOyBkaXNjYXJkXG4gICAgICAgIHJvdXRlLm9uVXBkYXRlKG1lc3NhZ2Uub3BzKTtcbiAgICAgICAgLy8gQ2xlYXIgYW55IHByaW9yIGVycm9yIGZvciB0aGlzIHBhdGggb24gc3VjY2Vzc2Z1bCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuc2VydmVyRXJyb3JzLmhhcyhtZXNzYWdlLnBhdGgpKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKG1lc3NhZ2UucGF0aCk7XG4gICAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcInNlcnZlcl9lcnJvclwiOiB7XG4gICAgICAgIGlmICghdGhpcy5hY3RpdmVWaWV3cy5oYXMobWVzc2FnZS5wYXRoKSkgcmV0dXJuOyAvLyBkaXNjYXJkIGZvciBpbmFjdGl2ZSBwYXRoc1xuICAgICAgICB0aGlzLnNlcnZlckVycm9ycy5zZXQobWVzc2FnZS5wYXRoLCBtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTZXJ2ZXJFcnJvcihtZXNzYWdlLnBhdGgsIG1lc3NhZ2UuZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcGlfY2FsbFwiOiB7XG4gICAgICAgIHZvaWQgdGhpcy5wZXJmb3JtQXBpQ2FsbChtZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwibmF2aWdhdGVfdG9cIjoge1xuICAgICAgICAvLyBgbmF2aWdhdGVfdG9gIGlzIG5hdmlnYXRpb25hbDsgYWxsb3cgcmVnYXJkbGVzcyBvZiBhY3RpdmVWaWV3cyBtZW1iZXJzaGlwXG4gICAgICAgIGNvbnN0IHJlcGxhY2UgPSAhIW1lc3NhZ2UucmVwbGFjZTtcbiAgICAgICAgbGV0IGRlc3QgPSBtZXNzYWdlLnBhdGggfHwgXCJcIjtcbiAgICAgICAgLy8gTm9ybWFsaXplIHByb3RvY29sLXJlbGF0aXZlIFVSTHMgdG8gYWJzb2x1dGVcbiAgICAgICAgaWYgKGRlc3Quc3RhcnRzV2l0aChcIi8vXCIpKSBkZXN0ID0gYCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfSR7ZGVzdH1gO1xuICAgICAgICBjb25zdCBoYXNTY2hlbWUgPSAvXlthLXpBLVpdW2EtekEtWjAtOSsuLV0qOi8udGVzdChkZXN0KTtcbiAgICAgICAgaWYgKGhhc1NjaGVtZSkge1xuICAgICAgICAgIGlmIChkZXN0LnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpIHx8IGRlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlc3QpO1xuICAgICAgICAgICAgICBpZiAodXJsLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsID0gYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWA7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZXdvcmtOYXZpZ2F0ZShpbnRlcm5hbCwgeyByZXBsYWNlIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgICAgICBlbHNlIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZGVzdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZGVzdCk7XG4gICAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbWFpbHRvOiwgdGVsOiwgZGF0YTosIGV0Yy5cbiAgICAgICAgICAgIGlmIChyZXBsYWNlKSB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShkZXN0KTtcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LmxvY2F0aW9uLmFzc2lnbihkZXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVsYXRpdmUgb3Igcm9vdC1yZWxhdGl2ZSBwYXRoIOKGkiBTUEEgbmF2aWdhdGVcbiAgICAgICAgICB0aGlzLmZyYW1ld29ya05hdmlnYXRlKGRlc3QsIHsgcmVwbGFjZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgbWVzc2FnZTpcIiwgbWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQXBpQ2FsbChtc2c6IFNlcnZlckFwaUNhbGxNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1zZy51cmwsIHtcbiAgICAgICAgbWV0aG9kOiBtc2cubWV0aG9kIHx8IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4obXNnLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAgIC4uLihtc2cuYm9keSAhPSBudWxsICYmICEoXCJjb250ZW50LXR5cGVcIiBpbiAobXNnLmhlYWRlcnMgfHwge30pKVxuICAgICAgICAgICAgPyB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OlxuICAgICAgICAgIG1zZy5ib2R5ICE9IG51bGxcbiAgICAgICAgICAgID8gdHlwZW9mIG1zZy5ib2R5ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gbXNnLmJvZHlcbiAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShtc2cuYm9keSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBjcmVkZW50aWFsczogbXNnLmNyZWRlbnRpYWxzIHx8IFwiaW5jbHVkZVwiLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBoZWFkZXJzT2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICByZXMuaGVhZGVycy5mb3JFYWNoKCh2LCBrKSA9PiAoaGVhZGVyc09ialtrXSA9IHYpKTtcbiAgICAgIGxldCBib2R5OiBhbnkgPSBudWxsO1xuICAgICAgY29uc3QgY3QgPSByZXMuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIikgfHwgXCJcIjtcbiAgICAgIGlmIChjdC5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgICAgYm9keSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5ID0gYXdhaXQgcmVzLnRleHQoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGx5OiBDbGllbnRBcGlSZXN1bHRNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiBcImFwaV9yZXN1bHRcIixcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgb2s6IHJlcy5vayxcbiAgICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzT2JqLFxuICAgICAgICBib2R5LFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2UocmVwbHkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgcmVwbHk6IENsaWVudEFwaVJlc3VsdE1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpX3Jlc3VsdFwiLFxuICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IHsgZXJyb3I6IFN0cmluZyhlcnIpIH0sXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShyZXBseSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGludm9rZUNhbGxiYWNrKHBhdGg6IHN0cmluZywgY2FsbGJhY2s6IHN0cmluZywgYXJnczogYW55W10pIHtcbiAgICBhd2FpdCB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY2FsbGJhY2tcIixcbiAgICAgIHBhdGgsXG4gICAgICBjYWxsYmFjayxcbiAgICAgIGFyZ3M6IGFyZ3MubWFwKGV4dHJhY3RFdmVudCksXG4gICAgfSk7XG4gIH1cblxuICAvLyBwdWJsaWMgZ2V0VkRPTShwYXRoOiBzdHJpbmcpOiBWRE9NIHwgbnVsbCB7XG4gIC8vICAgcmV0dXJuIHRoaXMuYWN0aXZlVmlld3MuZ2V0KHBhdGgpPy52ZG9tID8/IG51bGw7XG4gIC8vIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgaW8sIFNvY2tldCB9IGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlck1lc3NhZ2UsIENsaWVudE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVHJhbnNwb3J0IEFic3RyYWN0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlTGlzdGVuZXIgPSAobWVzc2FnZTogU2VydmVyTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lciA9IChjb25uZWN0ZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwb3J0IHtcbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xuICBzZW5kTWVzc2FnZShwYXlsb2FkOiBDbGllbnRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPjtcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbjtcbiAgb25Db25uZWN0aW9uQ2hhbmdlKGxpc3RlbmVyOiBDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXIpOiAoKSA9PiB2b2lkO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU29ja2V0LklPIFRyYW5zcG9ydFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFNvY2tldElPVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IENsaWVudE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIGNvbm5lY3Rpb25MaXN0ZW5lcnM6IFNldDxDb25uZWN0aW9uU3RhdHVzTGlzdGVuZXI+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdXJsOiBzdHJpbmcpIHt9XG5cbiAgY29ubmVjdChsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IGlvKHRoaXMudXJsLCB7XG4gICAgICAgIHRyYW5zcG9ydHM6IFtcIndlYnNvY2tldFwiXSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gQ29ubmVjdGVkOlwiLCB0aGlzLnNvY2tldD8uaWQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBTZW5kaW5nIHF1ZXVlZCBtZXNzYWdlOlwiLCBwYXlsb2FkKTtcbiAgICAgICAgICB0aGlzLnNvY2tldD8uZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLm5vdGlmeUNvbm5lY3Rpb25MaXN0ZW5lcnModHJ1ZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RfZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1NvY2tldElPVHJhbnNwb3J0XSBDb25uZWN0aW9uIGZhaWxlZDpcIiwgZXJyKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJkaXNjb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIERpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDb25uZWN0aW9uTGlzdGVuZXJzKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcIm1lc3NhZ2VcIiwgKGRhdGE6IFNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU29ja2V0SU9UcmFuc3BvcnRdIFJlY2VpdmVkIG1lc3NhZ2U6XCIsIGRhdGEpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyPy4oZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgdGhpcy5zb2NrZXQ/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5lciA9IG51bGw7XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXTtcbiAgICB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRNZXNzYWdlKHBheWxvYWQ6IENsaWVudE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIltTb2NrZXRJT1RyYW5zcG9ydF0gU2VuZGluZzpcIiwgcGF5bG9hZCk7XG4gICAgICB0aGlzLnNvY2tldCEuZW1pdChcIm1lc3NhZ2VcIiwgcGF5bG9hZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1NvY2tldElPVHJhbnNwb3J0XSBRdWV1aW5nIG1lc3NhZ2U6XCIsIHBheWxvYWQpO1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaChwYXlsb2FkKTtcbiAgICB9XG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LmNvbm5lY3RlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgbGlzdGVuZXIodGhpcy5pc0Nvbm5lY3RlZCgpKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29ubmVjdGlvbkxpc3RlbmVycyhjb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoY29ubmVjdGVkKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEluLU1lbW9yeSBUcmFuc3BvcnQgKGZvciB0ZXN0aW5nKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5VHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgY29ubmVjdGlvbkxpc3RlbmVyczogU2V0PENvbm5lY3Rpb25TdGF0dXNMaXN0ZW5lcj4gPSBuZXcgU2V0KCk7XG5cbiAgLy8gU2ltdWxhdGUgc2VydmVyLXNpZGUgbWVzc2FnZSBkaXNwYXRjaGluZ1xuICBwdWJsaWMgZGlzcGF0Y2hNZXNzYWdlKG1lc3NhZ2U6IFNlcnZlck1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xuICAgICAgLy8gU2ltdWxhdGUgYXN5bmMgYmVoYXZpb3JcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5saXN0ZW5lcj8uKG1lc3NhZ2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb25uZWN0KGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBDb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDtcbiAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKFwiW0luTWVtb3J5VHJhbnNwb3J0XSBEaXNjb25uZWN0ZWQuXCIpO1xuICB9XG5cbiAgYXN5bmMgc2VuZE1lc3NhZ2UocGF5bG9hZDogQ2xpZW50TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltJbk1lbW9yeVRyYW5zcG9ydF0gTm90IGNvbm5lY3RlZC5cIik7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbSW5NZW1vcnlUcmFuc3BvcnRdIFNlbnQgbWVzc2FnZTpgLCBwYXlsb2FkKTtcbiAgICAvLyBJbiBhIHJlYWwgdGVzdCBzZXR1cCwgdGhpcyBtaWdodCB0cmlnZ2VyIGEgc2ltdWxhdGVkIHNlcnZlciByZXNwb25zZVxuICAgIC8vIHZpYSBgZGlzcGF0Y2hNZXNzYWdlYC5cbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgfVxuXG4gIG9uQ29ubmVjdGlvbkNoYW5nZShsaXN0ZW5lcjogQ29ubmVjdGlvblN0YXR1c0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5jb25uZWN0aW9uTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2FkZXJGdW5jdGlvbkFyZ3MgfSBmcm9tIFwicmVhY3Qtcm91dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVJbmZvIHtcbiAgcGF0aG5hbWU6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGF0aFBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgY2F0Y2hhbGw6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFNlcnZlclJvdXRlSW5mbyh7XG4gIHBhcmFtcyxcbiAgcmVxdWVzdCxcbn06IExvYWRlckZ1bmN0aW9uQXJncykge1xuICBjb25zdCB7IFwiKlwiOiBjYXRjaGFsbCA9IFwiXCIsIC4uLnBhdGhQYXJhbXMgfSA9IHBhcmFtcztcbiAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNoOiBwYXJzZWRVcmwuaGFzaCxcbiAgICBwYXRobmFtZTogcGFyc2VkVXJsLnBhdGhuYW1lLFxuICAgIHF1ZXJ5OiBwYXJzZWRVcmwuc2VhcmNoLFxuICAgIHF1ZXJ5UGFyYW1zOiBPYmplY3QuZnJvbUVudHJpZXMocGFyc2VkVXJsLnNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpLFxuICAgIHBhdGhQYXJhbXMsXG4gICAgY2F0Y2hhbGw6IGNhdGNoYWxsLmxlbmd0aCA+IDEgPyBjYXRjaGFsbC5zcGxpdChcIi9cIikgOiBbXSxcbiAgfSBzYXRpc2ZpZXMgUm91dGVJbmZvO1xufSIsCiAgICAiLy8gU2VyaWFsaXphdGlvbiBoZWxwZXJzIHRoYXQgc3VwcG9ydDpcbi8vIC0gQ2lyY3VsYXIgcmVmZXJlbmNlcyB2aWEgb2JqZWN0IGlkZW50aXR5IHJlZnNcbi8vIC0gRGF0ZSBpbnN0YW5jZXMg4oaSIHsgX190OiBcImRhdGV0aW1lXCIsIHRpbWVzdGFtcCB9XG4vLyAtIEZvcm1EYXRhIOKGkiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHMgfVxuLy8gLSBGaWxlIOKGkiB7IF9fdDogXCJmaWxlXCIsIG5hbWUsIHR5cGUsIHNpemUsIGxhc3RNb2RpZmllZCwgY29udGVudDogbnVtYmVyW10gfVxuLy8gQWxvbmcgd2l0aCBhIGRlY29kZXIgZm9yIHRoZSBzeW1tZXRyaWMgc2hhcGVzICh3ZSBkbyBub3QgcmVjb25zdHJ1Y3QgRmlsZS9Gb3JtRGF0YSBvYmplY3RzKS5cblxudHlwZSBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCI7IGlkOiBudW1iZXIgfTtcbnR5cGUgRW5jb2RlZEFycmF5ID0geyBfX3Q6IFwiYXJyYXlcIjsgX19pZDogbnVtYmVyOyBpdGVtczogdW5rbm93bltdIH07XG50eXBlIEVuY29kZWRPYmplY3QgPSB7XG4gIF9fdDogXCJvYmplY3RcIjtcbiAgX19pZDogbnVtYmVyO1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xudHlwZSBFbmNvZGVkRGF0ZSA9IHsgX190OiBcImRhdGV0aW1lXCI7IHRpbWVzdGFtcDogbnVtYmVyIH07XG50eXBlIEVuY29kZWRGaWxlID0ge1xuICBfX3Q6IFwiZmlsZVwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xuICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgY29udGVudDogbnVtYmVyW107IC8vIHJhdyBieXRlcyBhcyBhIEpTT04tc2FmZSBudW1iZXIgYXJyYXlcbn07XG50eXBlIEVuY29kZWRGb3JtRGF0YSA9IHtcbiAgX190OiBcImZvcm1kYXRhXCI7XG4gIGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93biB8IHVua25vd25bXT47XG59O1xuXG50eXBlIElkZW50aXR5TWFwID0gV2Vha01hcDxvYmplY3QsIG51bWJlcj47XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cblxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG59XG5cbmZ1bmN0aW9uIGlzU2tpcHBhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmlsZVRvQnl0ZUFycmF5KGZpbGU6IEZpbGUpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gIGNvbnN0IGFiID0gYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShhYikpO1xufVxuXG5pbnRlcmZhY2UgRW5jb2RlQ29udGV4dCB7XG4gIHNlZW46IElkZW50aXR5TWFwO1xuICBuZXh0SWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY29kZUZvcldpcmUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY3R4OiBFbmNvZGVDb250ZXh0ID0geyBzZWVuOiBuZXcgV2Vha01hcCgpLCBuZXh0SWQ6IDEgfTtcbiAgcmV0dXJuIGF3YWl0IGVuY29kZVJlY3Vyc2l2ZShpbnB1dCwgY3R4KTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIoY3R4OiBFbmNvZGVDb250ZXh0LCBvYmo6IG9iamVjdCk6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBleGlzdGluZyA9IGN0eC5zZWVuLmdldChvYmopO1xuICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGlkID0gY3R4Lm5leHRJZCsrO1xuICBjdHguc2Vlbi5zZXQob2JqLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5jb2RlUmVjdXJzaXZlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY3R4OiBFbmNvZGVDb250ZXh0XG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZXMgZmlyc3RcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBhcyBEYXRlO1xuICAgIGNvbnN0IGVuY29kZWQ6IEVuY29kZWREYXRlID0geyBfX3Q6IFwiZGF0ZXRpbWVcIiwgdGltZXN0YW1wOiBkYXRlLmdldFRpbWUoKSB9O1xuICAgIHJldHVybiBlbmNvZGVkO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICBjb25zdCBpZCA9IHJlbWVtYmVyKGN0eCwgdmFsdWUpO1xuICAgIGlmIChpZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgX190OiBcInJlZlwiLCBpZDogY3R4LnNlZW4uZ2V0KHZhbHVlIGFzIG9iamVjdCkhIH0gYXMgRW5jb2RlZFJlZjtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duIHwgdW5rbm93bltdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdl0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbmNvZGVkVmFsID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYgYXMgdW5rbm93biwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkVmFsID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChlbmNvZGVkVmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZHNba2V5XSA9IFtleGlzdGluZywgZW5jb2RlZFZhbF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkc1trZXldID0gZW5jb2RlZFZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZDogRW5jb2RlZEZvcm1EYXRhICYgeyBfX2lkOiBudW1iZXIgfSA9IHtcbiAgICAgIF9fdDogXCJmb3JtZGF0YVwiLFxuICAgICAgZmllbGRzLFxuICAgICAgX19pZDogaWQsXG4gICAgfSBhcyBhbnk7XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgZmlsZSA9IHZhbHVlO1xuICAgIGNvbnN0IGJ5dGVzID0gYXdhaXQgZmlsZVRvQnl0ZUFycmF5KHZhbHVlKTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkRmlsZSA9IHtcbiAgICAgIF9fdDogXCJmaWxlXCIsXG4gICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgY29udGVudDogYnl0ZXMsXG4gICAgfTtcbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIC8vIElkZW50aXR5IC8gY2lyY3VsYXIgcmVmZXJlbmNlIGhhbmRsaW5nXG4gIGNvbnN0IG9iamVjdCA9IHZhbHVlIGFzIG9iamVjdDtcbiAgY29uc3QgZXhpc3RpbmdJZCA9IGN0eC5zZWVuLmdldChvYmplY3QpO1xuICBpZiAoZXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmVmOiBFbmNvZGVkUmVmID0geyBfX3Q6IFwicmVmXCIsIGlkOiBleGlzdGluZ0lkIH07XG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuICBjb25zdCB0aGlzSWQgPSBjdHgubmV4dElkKys7XG4gIGN0eC5zZWVuLnNldChvYmplY3QsIHRoaXNJZCk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgaXRlbXNSYXcgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh2YWx1ZSBhcyB1bmtub3duW10pLm1hcCgoaXRlbSkgPT4gZW5jb2RlUmVjdXJzaXZlKGl0ZW0sIGN0eCkpXG4gICAgKTtcbiAgICBjb25zdCBpdGVtcyA9IGl0ZW1zUmF3LmZpbHRlcigoaXQpID0+IGl0ICE9PSB1bmRlZmluZWQpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkQXJyYXkgPSB7IF9fdDogXCJhcnJheVwiLCBfX2lkOiB0aGlzSWQsIGl0ZW1zIH07XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3Qgb3Igb3RoZXIgb2JqZWN0IHR5cGVzXG4gIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHYgPSAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICBpZiAoaXNTa2lwcGFibGUodikpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5jb2RlZFYgPSBhd2FpdCBlbmNvZGVSZWN1cnNpdmUodiwgY3R4KTtcbiAgICAgIGlmIChlbmNvZGVkViAhPT0gdW5kZWZpbmVkKSBwcm9wc1trZXldID0gZW5jb2RlZFY7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vbi1wbGFpbiBvYmplY3RzOiBiZXN0IGVmZm9ydCDigJMgZW51bWVyYXRlIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICBjb25zdCB2ID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKGlzU2tpcHBhYmxlKHYpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRWID0gYXdhaXQgZW5jb2RlUmVjdXJzaXZlKHYsIGN0eCk7XG4gICAgICBpZiAoZW5jb2RlZFYgIT09IHVuZGVmaW5lZCkgcHJvcHNba2V5XSA9IGVuY29kZWRWO1xuICAgIH1cbiAgfVxuICBjb25zdCBlbmNvZGVkOiBFbmNvZGVkT2JqZWN0ID0geyBfX3Q6IFwib2JqZWN0XCIsIF9faWQ6IHRoaXNJZCwgcHJvcHMgfTtcbiAgcmV0dXJuIGVuY29kZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGcm9tV2lyZShpbnB1dDogdW5rbm93bik6IHVua25vd24ge1xuICByZXR1cm4gZGVjb2RlUmVjdXJzaXZlKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUmVjdXJzaXZlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdGFnID0gb2JqW1wiX190XCJdO1xuXG4gIGlmICh0YWcgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgIGNvbnN0IHRzID0gb2JqW1widGltZXN0YW1wXCJdIGFzIG51bWJlcjtcbiAgICByZXR1cm4gbmV3IERhdGUodHMpO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmaWxlXCIpIHtcbiAgICAvLyBEbyBub3QgcmVjb25zdHJ1Y3QgRmlsZTsga2VlcCBhcyBwbGFpbiBvYmplY3QuIE9wdGlvbmFsbHksIHR1cm4gY29udGVudCBpbnRvIFVpbnQ4QXJyYXkgZm9yIGNvbnZlbmllbmNlLlxuICAgIGNvbnN0IGNvbnRlbnQgPSBvYmpbXCJjb250ZW50XCJdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgICAvLyBSZXR1cm4gYSBzaGFsbG93IGNsb25lIHdpdGggVWludDhBcnJheSBmb3IgY29udGVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub2JqLFxuICAgICAgICBjb250ZW50OiBuZXcgVWludDhBcnJheShjb250ZW50IGFzIG51bWJlcltdKSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJmb3JtZGF0YVwiKSB7XG4gICAgLy8gS2VlcCBhcy1pcyAocGxhaW4gb2JqZWN0KSwgYnV0IGRlY29kZSBuZXN0ZWQgdmFsdWVzXG4gICAgY29uc3QgZmllbGRzID0gb2JqW1wiZmllbGRzXCJdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+O1xuICAgIGNvbnN0IGRlY29kZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24gfCB1bmtub3duW10+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZmllbGRzKSkge1xuICAgICAgY29uc3QgdiA9IGZpZWxkc1trZXldO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgZGVjb2RlZEZpZWxkc1trZXldID0gdi5tYXAoKHgpID0+IGRlY29kZVJlY3Vyc2l2ZSh4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvZGVkRmllbGRzW2tleV0gPSBkZWNvZGVSZWN1cnNpdmUodik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IF9fdDogXCJmb3JtZGF0YVwiLCBmaWVsZHM6IGRlY29kZWRGaWVsZHMgfSBhcyBFbmNvZGVkRm9ybURhdGE7XG4gIH1cblxuICBpZiAodGFnID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtcyA9IChvYmpbXCJpdGVtc1wiXSBhcyB1bmtub3duW10pLm1hcCgoeCkgPT4gZGVjb2RlUmVjdXJzaXZlKHgpKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBpZiAodGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcHJvcHMgPSBvYmpbXCJwcm9wc1wiXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvcHMpKSB7XG4gICAgICBvdXRba2V5XSA9IGRlY29kZVJlY3Vyc2l2ZShwcm9wc1trZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwicmVmXCIpIHtcbiAgICAvLyBXaXRob3V0IGEgcmVjb25zdHJ1Y3Rpb24gY29udGV4dCBvbiB0aGUgY2xpZW50LCBsZWF2ZSBhcy1pcy5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLy8gVW5rbm93biBvYmplY3Qg4oCTIGRlc2NlbmQgc2hhbGxvd2x5XG4gIGNvbnN0IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICBjb3B5W2tleV0gPSBkZWNvZGVSZWN1cnNpdmUob2JqW2tleV0pO1xuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vLyBMZWdhY3kgY2xlYW5lciBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdoZXJlIGEgcXVpY2sgYmVzdC1lZmZvcnQgSlNPTi1zYWZlIHNoYXBlIGlzIG5lZWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuRm9yU2VyaWFsaXphdGlvbihvYmo6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIGNsZWFuUmVjdXJzaXZlKG9iaiwgbmV3IFdlYWtTZXQoKSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFuUmVjdXJzaXZlKG9iajogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogdW5rbm93biB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG9iajtcbiAgaWYgKHNlZW4uaGFzKG9iaiBhcyBvYmplY3QpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzZWVuLmFkZChvYmogYXMgb2JqZWN0KTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiAob2JqIGFzIHVua25vd25bXSlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IGNsZWFuUmVjdXJzaXZlKGl0ZW0sIHNlZW4pKVxuICAgICAgLmZpbHRlcigoeCkgPT4geCAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IHYgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIGlmIChpc1NraXBwYWJsZSh2KSkgY29udGludWU7XG4gICAgY29uc3QgY2xlYW5lZCA9IGNsZWFuUmVjdXJzaXZlKHYsIHNlZW4pO1xuICAgIGlmIChjbGVhbmVkICE9PSB1bmRlZmluZWQpIG91dFtrZXldID0gY2xlYW5lZDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsb0JBQ0UsY0FDQSxhQUNBLG1CQUNBLGlCQUNBLGVDTEYsMkJBQWdCLG1CQUFjLFVBQStCLGVBQU0sZUNHNUQsSUFBTSxFQUFlLGFBQ2YsRUFBcUIsS0EwRTNCLFNBQVMsQ0FBYSxDQUFDLEVBQXFDLENBRWpFLE9BQU8sT0FBTyxJQUFTLFVBQVksSUFBUyxLQUd2QyxTQUFTLENBQWdCLENBQUMsRUFBcUMsQ0FDcEUsT0FDRSxPQUFPLElBQVMsVUFDaEIsSUFBUyxNQUNULEVBQUssSUFBSSxXQW5GcUIsSUFtRlEsR0FDdEMsRUFBSyxNQXJGbUIsb0VET3JCLE1BQU0sQ0FBYSxDQUdkLE9BQ0EsS0FDQSxXQUpGLGNBQ1IsV0FBVyxDQUNELEVBQ0EsRUFDQSxFQUNSLENBSFEsY0FDQSxZQUNBLGtCQUVSLEtBQUssY0FBZ0IsSUFBSSxJQUczQixXQUFXLENBQUMsRUFBYSxDQUN2QixJQUFJLEVBQUssS0FBSyxjQUFjLElBQUksQ0FBRyxFQUNuQyxHQUFJLENBQUMsRUFDSCxFQUFLLElBQUksSUFBUyxLQUFLLE9BQU8sZUFBZSxLQUFLLEtBQU0sRUFBSyxDQUFJLEVBQ2pFLEtBQUssY0FBYyxJQUFJLEVBQUssQ0FBRSxFQUVoQyxPQUFPLEVBR1QsVUFBVSxDQUFDLEVBQWlDLENBRTFD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QUssQ0FBSyxFQUNqQyxFQUFJLEdBQU8sRUFBZ0IsRUFBTSxFQUFJLEVBRXZDLE9BQU8sRUFHVCxHQUFJLElBQVEsTUFFVixPQUFPLEVBSVQsSUFBTSxFQUFnQyxDQUFDLEVBQ3ZDLFFBQVcsS0FBTyxPQUFPLEtBQUssQ0FBRyxFQUMvQixFQUFLLEdBQU8sRUFBZ0IsRUFBSSxFQUFJLEVBRXRDLE9BQU8sRUFJRixTQUFTLEVBQXFCLENBQUMsRUFBdUIsQ0FDM0QsT0FBTyxFQUFlLEVBQUssSUFBSSxPQUFTLEVBRzFDLFNBQVMsQ0FBYyxDQUFDLEVBQWMsRUFBZ0MsQ0FDcEUsR0FBSSxJQUFRLE1BQVEsT0FBTyxJQUFRLFNBQVUsT0FBTyxFQUNwRCxHQUFJLEVBQUssSUFBSSxDQUFhLEVBQUcsT0FFN0IsR0FEQSxFQUFLLElBQUksQ0FBYSxFQUNsQixNQUFNLFFBQVEsQ0FBRyxFQUNuQixPQUFRLEVBQ0wsSUFBSSxDQUFDLElBQVMsRUFBZSxFQUFNLENBQUksQ0FBQyxFQUN4QyxPQUFPLENBQUMsSUFBTSxJQUFNLE1BQVMsRUFFbEMsSUFBTSxFQUErQixDQUFDLEVBQ3RDLFFBQVcsS0FBTyxFQUFnQyxDQUNoRCxJQUFNLEVBQUssRUFBZ0MsR0FDM0MsR0FBSSxFQUFZLENBQUMsRUFBRyxTQUNwQixJQUFNLEVBQVUsRUFBZSxFQUFHLENBQUksRUFDdEMsR0FBSSxJQUFZLE9BQVcsRUFBSSxHQUFPLEVBRXhDLE9BQU8iLAogICJkZWJ1Z0lkIjogIkQ1OTk4QzQ2OUVERTIwQkU2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pulse-ui-client",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -13,7 +13,9 @@
13
13
  "exports": {
14
14
  ".": {
15
15
  "types": "./dist/index.d.ts",
16
- "import": "./dist/index.js",
16
+ "browser": "./dist/index.js",
17
+ "node": "./dist/index.node.js",
18
+ "bun": "./dist/index.bun.js",
17
19
  "default": "./dist/index.js"
18
20
  }
19
21
  },
@@ -33,8 +35,13 @@
33
35
  "react-router": "^7"
34
36
  },
35
37
  "scripts": {
36
- "build": "rm -rf dist || true && bun build ./src/index.ts --outdir=dist --format=esm --target=browser --minify --sourcemap=external --external react --external react-dom --external react-router --external socket.io-client && tsc -p tsconfig.build.json",
37
- "build:dev": "rm -rf dist || true && bun build ./src/index.ts --outdir=dist --format=esm --target=browser --sourcemap=inline --external react --external react-dom --external react-router --external socket.io-client && tsc -p tsconfig.build.json",
38
+ "build": "bun --bun scripts/build.ts && bun run build:types",
39
+ "build:clean": "rm -rf dist || true",
40
+ "build:browser": "NODE_ENV=production bun build ./src/index.ts --outdir=dist --format=esm --target=browser --minify --sourcemap=external --external react --external react-dom --external react-router --external socket.io-client",
41
+ "build:node": "NODE_ENV=production bun build ./src/index.ts --outfile=dist/index.node.js --format=esm --target=node --minify --sourcemap=inline --define process.env.NODE_ENV=\\\"production\\\" --define __DEV__=false --external react --external react-dom --external react-router --external socket.io-client",
42
+ "build:bun": "NODE_ENV=production bun build ./src/index.ts --outfile=dist/index.bun.js --format=esm --target=bun --minify --sourcemap=inline --define process.env.NODE_ENV=\\\"production\\\" --define __DEV__=false --external react --external react-dom --external react-router --external socket.io-client",
43
+ "build:types": "tsc -p tsconfig.build.json",
44
+ "build:dev": "bun run build:clean && NODE_ENV=development bun build ./src/index.ts --outdir=dist --format=esm --target=browser --sourcemap=inline --external react --external react-dom --external react-router --external socket.io-client && bun run build:types",
38
45
  "prepublishOnly": "bun run build"
39
46
  }
40
47
  }