1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./CDfqlCKm.js","./CCqRZnVi.js","./swiper-vue.DJHdZmOr.css","./DlAUqK2U.js","./callback.C_cG8t5w.css","./CA4IE3VV.js","./Bt9NiotI.js","./DJuYQwSd.js","./signIn.C5QXQR5m.css","./p-qy6HvQ.js","./signOut.3j4wUAQt.css","./7Mcj1yY_.js","./BghTxU_u.js","./DydsLA_J.js","./CERA6lJa.js","./oapQfdAa.js","./BotHSeFq.js","./BnNML0th.js","./BspZsups.js","./B1PegwGI.js","./SEw-dYwh.js","./CNAUDoh0.js","./2IkCbGgp.js","./Da0xxq-D.js","./oI4U-7ru.js","./CqkleIqs.js","./BaseVideo.tn0RQdqM.css","./DELXZZEt.js","./AzOeli57.js","./CustomImage.B_dyT1z7.css","./ylDgx30y.js","./DQWkL3TL.js","./CqIiOrav.js","./CR6kahsu.js","./1Bf1Oxu-.js","./DocumentList.W9X6XVOT.css","./BUb06x1l.js","./CoYwTdUy.js","./DiIOoBRb.js","./6qYE1oVG.js","./CznLI4pV.js","./786k4G9l.js","./m8kY0tfX.js","./taU_693R.js","./Claj4C-5.js","./BYW326i2.js","./DHAEN7qr.js","./D2r9V2Oy.js","./BI4ZS1LL.js","./apPbhtC2.js","./Cp0iK4Nv.js","./BWc2rs17.js","./Ci7tDuNS.js","./C2W-hvWH.js","./Bbe_18vB.js","./CmJG9otm.js","./svg-icon.DycpY1rZ.css","./CuIglfQo.js","./BOEKJY8X.js","./zvxOOzKT.js","./DLo2bnV2.js","./BwfbGiNm.js","./CAftV-3w.js","./DNtY0xND.js","./BaseForm.BbYHi9Va.css","./DXSE01DY.js","./Dr9oAN5u.js","./F6W-ppDL.js","./BGuaUZZK.js","./Search.CZqsVU39.css","./BsDKlEvj.js","./CFRJxDbR.js","./BzLBWv0D.js","./Image.DSVnU69W.css","./BZqk89uX.js","./Bg2Bskv_.js","./3_nEjdWT.js","./index.NM0__ayP.css","./DFuMThnc.js","./aFIxpLxo.js","./B5o9ohXQ.js","./Dz-tdVST.js","./Index.B6O2sDis.css","./BTMKUr3n.js","./Oa6sasS3.js","./CIUvqjn2.js","./mapBox.BLwEq-2k.css","./RU0oN4hU.js","./DcD8QYTS.js","./vEWNtBZa.js","./CjGmH8U6.js","./Base.Bq1_lNgs.css","./DsF7hGQH.js","./D0ii4kUF.js","./DSdfZPXS.js","./Dtwpx4_8.js","./B6nNQJC6.js","./c5JoAsIL.js","./DLLKSwhn.js","./DerBzAsh.js","./l_zL22iS.js","./CkBJicpv.js","./_f-bIF5K.js","./Bon0HfwF.js","./DYLBneHj.js","./BtV8al_r.js","./CMUc4pl5.js","./hDNcr3db.js","./DQ8M3CbQ.js","./D2tP9rs2.js","./BMuY5fG7.js","./Dd1dW8fd.js","./D83VhabT.js","./BkHkj-je.js","./BCZnxlqb.js","./BDJLSQek.js","./CaHnPaa6.js","./T17EokH9.js","./DKz1aTaa.js","./30cN7LOz.js","./BUhjCsfE.js","./CAXLUn4_.js","./BHnIrmE0.js","./DvOVWcJ1.js","./v1mtbC8D.js","./B7mEHPmm.js","./TSlbst7t.js","./BZn-Sb3c.js","./tWvGRTnw.js","./BhfciyRO.js","./BCWXWzOP.js","./Ltlqwl0p.js","./CQGqldER.js","./DBfrnyHQ.js","./DQoXUV1P.js","./BAwK0BnK.js","./S-PFIqJe.js"])))=>i.map(i=>d[i]); 2import{s as Qg,r as Mg,e as WZ,g as nA,h as QA,a as aA,i as EI,t as Dl,b as f,m as Tc,c as v,d as qg,f as RZ,j as Ml,o as FA,n as Rg,k as TG,w as $I,l as Ig,p as zc,q as sZ,u as zG,v as LG,x as OI,y as j,z as Bg,A as sI,B as jg,K as EG,C as rG,T as jG,D as OG,E as VA,F as fA,G as rI,H as vG,I as Lc,J as Ec,L as vB,M as xG,N as PG,O as xB,P as X,Q as fG,R as aI,S as ug,U as rc,V as _G,W as DA,X as _A,Y as AA,Z as wI,_ as bZ,$ as qG,a0 as PB,a1 as NC,a2 as UZ,a3 as jc,a4 as id,a5 as $G,a6 as IW,a7 as gW,a8 as CW}from"./CCqRZnVi.js";(function(){const I=document.createElement("link").relList;if(I&&I.supports&&I.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))A(l);new MutationObserver(l=>{for(const d of l)if(d.type==="childList")for(const Z of d.addedNodes)Z.tagName==="LINK"&&Z.rel==="modulepreload"&&A(Z)}).observe(document,{childList:!0,subtree:!0});function g(l){const d={};return l.integrity&&(d.integrity=l.integrity),l.referrerPolicy&&(d.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?d.credentials="include":l.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function A(l){if(l.ep)return;l.ep=!0;const d=g(l);fetch(l.href,d)}})();const AW=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,lW=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,dW=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function ZW(C,I){if(C==="__proto__"||C==="constructor"&&I&&typeof I=="object"&&"prototype"in I){return}return I}function BW(C,I={}){if(typeof C!="string")return C;if(C[0]==='"'&&C[C.length-1]==='"'&&C.indexOf("\\")===-1)return C.slice(1,-1);const g=C.trim();if(g.length<=9)switch(g.toLowerCase()){case"true":return!0;case"false":return!1;case"undefined":return;case"null":return null;case"nan":return Number.NaN;case"infinity":return Number.POSITIVE_INFINITY;case"-infinity":return Number.NEGATIVE_INFINITY}if(!dW.test(C)){if(I.strict)throw new SyntaxError("[destr] Invalid JSON");return C}try{if(AW.test(C)||lW.test(C)){if(I.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(C,ZW)}return JSON.parse(C)}catch(A){if(I.strict)throw A;return C}}const Oc=/#/g,vc=/&/g,xc=/\//g,cW=/=/g,iW=/\?/g,Hl=/\+/g,FW=/%5e/gi,VW=/%60/gi,GW=/%7c/gi,WW=/%20/gi,RW=/%2f/gi,sW=/%252f/gi;function Pc(C){return encodeURI(""+C).replace(GW,"|")}function td(C){return Pc(typeof C=="string"?C:JSON.stringify(C)).replace(Hl,"%2B").replace(WW,"+").replace(Oc,"%23").replace(vc,"%26").replace(VW,"`").replace(FW,"^").replace(xc,"%2F")}function Fd(C){return td(C).replace(cW,"%3D")}function fc(C){return Pc(C).replace(Oc,"%23").replace(iW,"%3F").replace(sW,"%2F").replace(vc,"%26").replace(Hl,"%2B")}function sw(C){return fc(C).replace(xc,"%2F")}function GA(C=""){try{return decodeURIComponent(""+C)}catch{return""+C}}function bW(C){return GA(C.replace(RW,"%252F"))}function UW(C){return GA(C.replace(Hl," "))}function oW(C){return GA(C.replace(Hl," "))}function oZ(C=""){const I=Object.create(null);C[0]==="?"&&(C=C.slice(1));for(const g of C.split("&")){const A=g.match(/([^=]+)=?(.*)/)||[];if(A.length<2)continue;const l=UW(A[1]);if(l==="__proto__"||l==="constructor")continue;const d=oW(A[2]||"");I[l]===void 0?I[l]=d:Array.isArray(I[l])?I[l].push(d):I[l]=[I[l],d]}return I}function mW(C,I){return(typeof I=="number"||typeof I=="boolean")&&(I=String(I)),I?Array.isArray(I)?I.map(g=>`${Fd(C)}=${td(g)}`).join("&"):`${Fd(C)}=${td(I)}`:Fd(C)}function _c(C){return Object.keys(C).filter(I=>C[I]!==void 0).map(I=>
2mW(I,C[I])).filter(Boolean).join("&")}const nW=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,qc=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,QW=/^([/\\]\s*){2,}[^/\\]/,aW=/^[\s\0]*(blob|data|javascript|vbscript):$/i,NW=/\/$|\/\?|\/#/,YW=/^\.?\//;function Ug(C,I={}){return typeof I=="boolean"&&(I={acceptRelative:I}),I.strict?nW.test(C):qc.test(C)||(I.acceptRelative?QW.test(C):!1)}function wW(C){return!!C&&aW.test(C)}function Dd(C="",I){return I?NW.test(C):C.endsWith("/")}function $g(C="",I){if(!I)return(Dd(C)?C.slice(0,-1):C)||"/";if(!Dd(C,!0))return C||"/";let g=C,A="";const l=C.indexOf("#");l!==-1&&(g=C.slice(0,l),A=C.slice(l));const[d,...Z]=g.split("?");return((d.endsWith("/")?d.slice(0,-1):d)||"/")+(Z.length>0?`?${Z.join("?")}`:"")+A}function ul(C="",I){if(!I)return C.endsWith("/")?C:C+"/";if(Dd(C,!0))return C||"/";let g=C,A="";const l=C.indexOf("#");if(l!==-1&&(g=C.slice(0,l),A=C.slice(l),!g))return A;const[d,...Z]=g.split("?");return d+"/"+(Z.length>0?`?${Z.join("?")}`:"")+A}function hW(C=""){return C.startsWith("/")}function eW(C=""){return hW(C)?C:"/"+C}function Md(C,I){if($c(I)||Ug(C))return C;const g=$g(I);if(C.startsWith(g)){const A=C[g.length];if(!A||A==="/"||A==="?")return C}return pl(g,C)}function fB(C,I){if($c(I))return C;const g=$g(I);if(!C.startsWith(g))return C;const A=C[g.length];return A&&A!=="/"&&A!=="?"?C:"/"+C.slice(g.length).replace(/^\/+/,"")}function cl(C,I){const g=NA(C),A={...oZ(g.search),...I};return g.search=_c(A),yW(g)}function $c(C){return!C||C==="/"}function JW(C){return C&&C!=="/"}function pl(C,...I){let g=C||"";for(const A of I.filter(l=>JW(l)))if(g){const l=A.replace(YW,"");g=ul(g)+l}else g=A;return g}function Ii(...C){const I=/\/(?!\/)/,g=C.filter(Boolean),A=[];let l=0;for(const Z of g)if(!(!Z||Z==="/")){for(const[B,c]of Z.split(I).entries())if(!(!c||c===".")){if(c===".."){if(A.length===1&&Ug(A[0]))continue;A.pop(),l--;continue}if(B===1&&A[A.length-1]?.endsWith(":/")){A[A.length-1]+="/"+c;continue}A.push(c),l++}}let d=A.join("/");return l>=0?g[0]?.startsWith("/")&&!d.startsWith("/")?d="/"+d:g[0]?.startsWith("./")&&!d.startsWith("./")&&(d="./"+d):d="../".repeat(-1*l)+d,g[g.length-1]?.endsWith("/")&&!d.endsWith("/")&&(d+="/"),d}function SW(C){return XW(C,"https://")}function XW(C,I){let g=C.match(qc);return g||(g=C.match(/^\/{2,}/)),g?I+C.slice(g[0].length):I+C}function gi(C,I){return GA($g(C))===GA($g(I))}const Ci=Symbol.for("ufo:protocolRelative");function NA(C="",I){const g=C.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(g){const[,V,W=""]=g;return{protocol:V.toLowerCase(),pathname:W,href:V+W,auth:"",host:"",search:"",hash:""}}if(!Ug(C,{acceptRelative:!0}))return _B(C);const[,A="",l,d=""]=C.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[];let[,Z="",B=""]=d.match(/([^#/?]*)(.*)?/)||[];A==="file:"&&(B=B.replace(/\/(?=[A-Za-z]:)/,""));const{pathname:c,search:i,hash:F}=_B(B);return{protocol:A.toLowerCase(),auth:l?l.slice(0,Math.max(0,l.length-1)):"",host:Z,pathname:c,search:i,hash:F,[Ci]:!A}}function _B(C=""){const[I="",g="",A=""]=(C.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:I,search:g,hash:A}}function yW(C){const I=C.pathname||"",g=C.search?(C.search.startsWith("?")?"":"?")+C.search:"",A=C.hash||"",l=C.auth?C.auth+"@":"",d=C.host||"";return(C.protocol||C[Ci]?(C.protocol||"")+"//":"")+l+d+I+g+A}class tW extends Error{constructor(I,g){super(I,g),this.name="FetchError",g?.cause&&!this.cause&&(this.cause=g.cause)}}function DW(C){const I=C.error?.message||C.error?.toString()||"",g=C.request?.method||C.options?.method||"GET",A=C.request?.url||String(C.request)||"/",l=`[${g}] ${JSON.stringify(A)}`,d=C.response?`${C.response.status} ${C.response.statusText}`:"<no response>",Z=`${l}: ${d}${I?` ${I}`:""}`,B=new tW(Z,C.error?{cause:C.error}:void 0);for(const c of["request","options","response"])Object.defineProperty(B,c,{get(){return C[c]}});for(const[c,i]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(B,c,{get(){return C.response&&C.response[i]}});return B}const MW=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function qB(C="GET"){return MW.has(C.toUpperCase())}function HW(C){if(C===void 0)return!1;const I=typeof C;return I==="string"||I==="number"||I==="boolean"||I===null?!0:I!=="object"?!1:Array.isArray(C)?!0:C.buffer||C instanceof FormData||C instanceof URLSearchParams?!1:C.constructor&&C.constructor.name==="Object"||typeof C.toJSON=="function"}const uW=new Set(["image/svg","application/xml","application/xhtml","application/html"]),pW=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function KW(C=""){if(!C)return"json";const I=C.split(";").shift()||"";return pW.test(I)?"json":I==="text/event-stream"?"stream":uW.has(I)||I.startsWith("text/")?"text":"blob"}function kW(C,I,g,A){const l=TW(I?.headers??C?.headers,g?.headers,A);let d;return(g?.query||g?.params||I?.params||I?.query)&&(d={...g?.params,...g?.query,...I?.params,...I?.query}),{...g,...I,query:d,params:d,headers:l}}function TW(C,I,g){if(!I)return new g(C);const A=new g(I);if(C)for(const[l,d]of Symbol.iterator in C||Array.isArray(C)?C:new g(C))A.set(l,d);return A}async function MA(C,I){if(I)if(Array.isArray(I))for(const g of I)await g(C);else await I(C)}const zW=new Set([408,409,425,429,500,502,503,504]),LW=new Set([101,204,205,304]);function Ai(C={}){const{fetch:I=globalThis.fetch,Headers:g=globalThis.Headers,AbortController:A=globalThis.AbortController}=C;async function l(B){const c=B.error&&B.error.name==="AbortError"&&!B.options.timeout||!1;if(B.options.retry!==!1&&!c){let F;typeof B.options.retry=="number"?F=B.options.retry:F=qB(B.options.method)?0:1;const V=B.response&&B.response.status||500;if(F>0&&(Array.isArray(B.options.retryStatusCodes)?B.options.retryStatusCodes.includes(V):zW.has(V))){const W=typeof B.options.retryDelay=="function"?B.options.retryDelay(B):B.options.retryDelay||0;return W>0&&await new Promise(G=>setTimeout(G,W)),d(B.request,{...B.options,retry:F-1})}}const i=DW(B);throw Error.captureStackTrace&&Error.captureStackTrace(i,d),i}const d=async function(c,i={}){const F={request:c,options:kW(c,i,C.defaults,g),response:void 0,error:void 0};if(F.options.method&&(F.options.method=F.options.method.toUpperCase()),F.options.onRequest&&(await MA(F,F.options.onRequest),F.options.headers instanceof g||(F.options.headers=new g(F.options.headers||{}))),typeof F.request=="string"&&(F.options.baseURL&&(F.request=Md(F.request,F.options.baseURL)),F.options.query&&(F.request=cl(F.request,F.options.query),delete F.options.query),"query"in F.options&&delete F.options.query,"params"in F.options&&delete F.options.params),F.options.body&&qB(F.options.method))if(HW(F.options.body)){const G=F.options.headers.get("content-type");typeof F.options.body!="string"&&(F.options.body=G==="application/x-www-form-urlencoded"?new URLSearchParams(F.options.body).toString():JSON.stringify(F.options.body)),G||F.options.headers.set("content-type","application/json"),F.options.headers.has("accept")||F.options.headers.set("accept","application/json")}else("pipeTo"in F.options.body&&typeof F.options.body.pipeTo=="function"||typeof F.options.body.pipe=="function")&&("duplex"in F.options||(F.options.duplex="half"));let V;if(!F.options.signal&&F.options.timeout){const G=new A;V=setTimeout(()=>{const R=new Error("[TimeoutError]: The operation was aborted due to timeout");R.name="TimeoutError",R.code=23,G.abort(R)},F.options.timeout),F.options.signal=G.signal}try{F.response=await I(F.request,F.options)}catch(G){return F.error=G,F.options.onRequestError&&await MA(F,F.options.onRequestError),await l(F)}finally{V&&clearTimeout(V)}if((F.response.body||F.response._bodyInit)&&!LW.has(F.response.status)&&F.options.method!=="HEAD"){const G=(F.options.parseResponse?"json":F.options.responseType)||KW(F.response.headers.get("content-type")||"");switch(G){case"json":{const R=await F.response.text(),s=F.options.parseResponse||BW;F.response._data=s(R);break}case"stream":{F.response._data=F.response.body||F.response._bodyInit;break}default:F.response._data=await F.response[G]()}}return F.options.onResponse&&await MA(F,F.options.onResponse),!F.options.ignoreResponseError&&F.response.status>=400&&F.response.status<600?(F.options.onResponseError&&await MA(F,F.options.onResponseError),await l(F)):F.response},Z=async function(c,i){return(await d(c,i))._data};return Z.raw=d,Z.native=(...B)=>I(...B),Z.create=(B={},c={})=>Ai({...C,...c,defaults:{...C.defaults,...c.defaults,...B}}),Z}const il=(function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")})(),EW=il.fetch?(...C)=>il.fetch(...C):()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!")),rW
2=il.Headers,jW=il.AbortController,OW=Ai({fetch:EW,Headers:rW,AbortController:jW}),vW=OW,xW=()=>window?.__NUXT__?.config||window?.useNuxtApp?.().payload?.config,mZ=()=>xW().app,PW=()=>mZ().baseURL,fW=()=>mZ().buildAssetsDir,nZ=(...C)=>Ii(QZ(),fW(),...C),QZ=(...C)=>{const I=mZ(),g=I.cdnURL||I.baseURL;return C.length?Ii(g,...C):g};globalThis.__buildAssetsURL=nZ,globalThis.__publicAssetsURL=QZ;globalThis.$fetch||(globalThis.$fetch=vW.create({baseURL:PW()}));"global"in globalThis||(globalThis.global=globalThis);function Hd(C,I={},g){for(const A in C){const l=C[A],d=g?`${g}:${A}`:A;typeof l=="object"&&l!==null?Hd(l,I,d):typeof l=="function"&&(I[d]=l)}return I}const li=(()=>{if(console.createTask)return console.createTask;const C={run:I=>I()};return()=>C})();function di(C,I,g,A){for(let l=g;l<C.length;l+=1)try{const d=A?A.run(()=>C[l](...I)):C[l](...I);if(d&&typeof d.then=="function")return Promise.resolve(d).then(()=>di(C,I,l+1,A))}catch(d){return Promise.reject(d)}}function _W(C,I,g){if(C.length>0)return di(C,I,0,li(g))}function qW(C,I,g){if(C.length>0){const A=li(g);return Promise.all(C.map(l=>A.run(()=>l(...I))))}}function Vd(C,I){for(const g of[...C])g(I)}var $W=class{_hooks;_before;_after;_deprecatedHooks;_deprecatedMessages;constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(C,I,g={}){if(!C||typeof I!="function")return()=>{};const A=C;let l;for(;this._deprecatedHooks[C];)l=this._deprecatedHooks[C],C=l.to;if(l&&!g.allowDeprecated){let d=l.message;d||(d=`${A} hook has been deprecated`+(l.to?`, please use ${l.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(d)||this._deprecatedMessages.add(d)}if(!I.name)try{Object.defineProperty(I,"name",{get:()=>"_"+C.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[C]=this._hooks[C]||[],this._hooks[C].push(I),()=>{I&&(this.removeHook(C,I),I=void 0)}}hookOnce(C,I){let g,A=(...l)=>(typeof g=="function"&&g(),g=void 0,A=void 0,I(...l));return g=this.hook(C,A),g}removeHook(C,I){const g=this._hooks[C];if(g){const A=g.indexOf(I);A!==-1&&g.splice(A,1),g.length===0&&(this._hooks[C]=void 0)}}clearHook(C){this._hooks[C]=void 0}deprecateHook(C,I){this._deprecatedHooks[C]=typeof I=="string"?{to:I}:I;const g=this._hooks[C]||[];this._hooks[C]=void 0;for(const A of g)this.hook(C,A)}deprecateHooks(C){for(const I in C)this.deprecateHook(I,C[I])}addHooks(C){const I=Hd(C),g=Object.keys(I).map(A=>this.hook(A,I[A]));return()=>{for(const A of g)A();g.length=0}}removeHooks(C){const I=Hd(C);for(const g in I)this.removeHook(g,I[g])}removeAllHooks(){this._hooks={}}callHook(C,...I){return this.callHookWith(_W,C,I)}callHookParallel(C,...I){return this.callHookWith(qW,C,I)}callHookWith(C,I,g){const A=this._before||this._after?{name:I,args:g,context:{}}:void 0;this._before&&Vd(this._before,A);const l=C(this._hooks[I]?[...this._hooks[I]]:[],g,I);return l instanceof Promise?l.finally(()=>{this._after&&A&&Vd(this._after,A)}):(this._after&&A&&Vd(this._after,A),l)}beforeEach(C){return this._before=this._before||[],this._before.push(C),()=>{if(this._before!==void 0){const I=this._before.indexOf(C);I!==-1&&this._before.splice(I,1)}}}afterEach(C){return this._after=this._after||[],this._after.push(C),()=>{if(this._after!==void 0){const I=this._after.indexOf(C);I!==-1&&this._after.splice(I,1)}}}};function Zi(){return new $W}function IR(C={}){let I,g=!1;const A=Z=>{if(I&&I!==Z)throw new Error("Context conflict")};let l;if(C.asyncContext){const Z=C.AsyncLocalStorage||globalThis.AsyncLocalStorage;Z&&(l=new Z)}const d=()=>{if(l){const Z=l.getStore();if(Z!==void 0)return Z}return I};return{use:()=>{const Z=d();if(Z===void 0)throw new Error("Context is not available");return Z},tryUse:()=>d(),set:(Z,B)=>{B||A(Z),I=Z,g=!0},unset:()=>{I=void 0,g=!1},call:(Z,B)=>{A(Z),I=Z;try{return l?l.run(Z,B):B()}finally{g||(I=void 0)}},async callAsync(Z,B){I=Z;const c=()=>{I=Z},i=()=>I===Z?c:void 0;ud.add(i);try{const F=l?l.run(Z,B):B();return g||(I=void 0),await F}finally{ud.delete(i)}}}}function gR(C={}){const I={};return{get(g,A={}){return I[g]||(I[g]=IR({...C,...A})),I[g]}}}const Fl=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},$B="__unctx__",CR=Fl[$B]||(Fl[$B]=gR()),AR=(C,I={})=>CR.get(C,I),I0="__unctx_async_handlers__",ud=Fl[I0]||(Fl[I0]=new Set);function Og(C){const I=[];for(const l of ud){const d=l();d&&I.push(d)}const g=()=>{for(const l of I)l()};let A=C();return A&&typeof A=="object"&&"catch"in A&&(A=A.catch(l=>{throw g(),l})),[A,g]}const g0=!1,C0=!1,lR=!1,A0={id:"__nuxt-loader"},dR=!0,ZR={componentName:"NuxtLink",prefetch:!0,prefetchOn:{visibility:!0}},BR={deep:!1},cR={},iR="#__nuxt",Bi="nuxt-app",l0=36e5,FR="vite:preloadError";function ci(C=Bi){return AR(C,{asyncContext:!1})}const VR="__nuxt_plugin";function GR(C){let I=0;const g={_id:C.id||Bi||"nuxt-app",_scope:WZ(),provide:void 0,versions:{get nuxt(){return"4.4.5"},get vue(){return g.vueApp.version}}
2,payload:Qg({...C.ssrContext?.payload||{},data:Qg({}),state:Mg({}),once:new Set,_errors:Qg({})}),static:{data:{}},runWithContext(l){return g._scope.active&&!nA()?g._scope.run(()=>d0(g,l)):d0(g,l)},isHydrating:!0,deferHydration(){if(!g.isHydrating)return()=>{};I++;let l=!1;return()=>{if(!l&&(l=!0,I--,I===0))return g.isHydrating=!1,g.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:Qg({}),_state:Qg({}),_payloadRevivers:{},...C};{const l=window.__NUXT__;if(l)for(const d in l)switch(d){case"data":case"state":case"_errors":Object.assign(g.payload[d],l[d]);break;default:g.payload[d]=l[d]}}g.hooks=Zi(),g.hook=g.hooks.hook;{const l=g.hooks.callHook;g.hooks.callHook=(d,...Z)=>Promise.resolve().then(()=>l(d,...Z))}g.callHook=g.hooks.callHook,g.provide=(l,d)=>{const Z="$"+l;HA(g,Z,d),HA(g.vueApp.config.globalProperties,Z,d)},HA(g.vueApp,"$nuxt",g),HA(g.vueApp.config.globalProperties,"$nuxt",g);{window.addEventListener(FR,d=>{g.callHook("app:chunkError",{error:d.payload}),d.payload.message.includes("Unable to preload CSS")&&d.preventDefault()}),window.useNuxtApp||=CI;const l=g.hook("app:error",(...d)=>{});g.hook("app:mounted",l)}const A=g.payload.config;return g.provide("config",A),g}function WR(C,I){I.hooks&&C.hooks.addHooks(I.hooks)}async function RR(C,I){if(typeof I=="function"){const{provide:g}=await C.runWithContext(()=>I(C))||{};if(g&&typeof g=="object")for(const A in g)C.provide(A,g[A])}}async function sR(C,I){const g=new Set,A=[],l=[];let d,Z=0;async function B(c){const i=c.dependsOn?.filter(F=>I.some(V=>V._name===F)&&!g.has(F))??[];if(i.length>0)A.push([new Set(i),c]);else{const F=RR(C,c).then(async()=>{c._name&&(g.add(c._name),await Promise.all(A.map(async([V,W])=>{V.has(c._name)&&(V.delete(c._name),V.size===0&&(Z++,await B(W)))})))}).catch(V=>{if(!c.parallel&&!C.payload.error)throw V;d||=V});c.parallel?l.push(F):await F}}for(const c of I)WR(C,c);for(const c of I)await B(c);if(await Promise.all(l),Z)for(let c=0;c<Z;c++)await Promise.all(l);if(d)throw C.payload.error||d}function WI(C){if(typeof C=="function")return C;const I=C._name||C.name;return delete C.name,Object.assign(C.setup||(()=>{}),C,{[VR]:!0,_name:I})}const bR=WI;function d0(C,I,g){const A=()=>I();return ci(C._id).set(C),C.vueApp.runWithContext(A)}function UR(C){let I;return QA()&&(I=aA()?.appContext.app.$nuxt),I||=ci(C).tryUse(),I||null}function CI(C){const I=UR(C);if(!I)throw new Error("[nuxt] instance unavailable");return I}function og(C){return CI().$config}function HA(C,I,g){Object.defineProperty(C,I,{get:()=>g})}function Gd(C){if(C===null||typeof C!="object")return!1;const I=Object.getPrototypeOf(C);return I!==null&&I!==Object.prototype&&Object.getPrototypeOf(I)!==null||Symbol.iterator in C?!1:Symbol.toStringTag in C?Object.prototype.toString.call(C)==="[object Module]":!0}function pd(C,I,g=".",A){if(!Gd(I))return pd(C,{},g,A);const l={...I};for(const d of Object.keys(C)){if(d==="__proto__"||d==="constructor")continue;const Z=C[d];Z!=null&&(A&&A(l,d,Z,g)||(Array.isArray(Z)&&Array.isArray(l[d])?l[d]=[...Z,...l[d]]:Gd(Z)&&Gd(l[d])?l[d]=pd(Z,l[d],(g?`${g}.`:"")+d.toString(),A):l[d]=Z))}return l}function oR(C){return(...I)=>I.reduce((g,A)=>pd(g,A,"",C),{})}const aZ=oR();function mR(C,I){try{return I in C}catch{return!1}}
2class Z0 extends Error{static __h3_error__=!0;statusCode=500;fatal=!1;unhandled=!1;statusMessage;data;cause;constructor(I,g={}){super(I,g),g.cause&&!this.cause&&(this.cause=g.cause)}toJSON(){const I={message:this.message,statusCode:Kd(this.statusCode,500)};return this.statusMessage&&(I.statusMessage=ii(this.statusMessage)),this.data!==void 0&&(I.data=this.data),I}}function nR(C){if(typeof C=="string")return new Z0(C);if(QR(C))return C;const I=new Z0(C.message??C.statusMessage??"",{cause:C.cause||C});if(mR(C,"stack"))try{Object.defineProperty(I,"stack",{get(){return C.stack}})}catch{try{I.stack=C.stack}catch{}}if(C.data&&(I.data=C.data),C.statusCode?I.statusCode=Kd(C.statusCode,I.statusCode):C.status&&(I.statusCode=Kd(C.status,I.statusCode)),C.statusMessage?I.statusMessage=C.statusMessage:C.statusText&&(I.statusMessage=C.statusText),I.statusMessage){const g=I.statusMessage,A=ii(I.statusMessage)}return C.fatal!==void 0&&(I.fatal=C.fatal),C.unhandled!==void 0&&(I.unhandled=C.unhandled),I}function QR(C){return C?.constructor?.__h3_error__===!0}const aR=/[^\u0009\u0020-\u007E]/g;function ii(C=""){return C.replace(aR,"")}function Kd(C,I=200){return!C||(typeof C=="string"&&(C=Number.parseInt(C,10)),C<100||C>999)?I:C}const Fi=Symbol("layout-meta"),FC=Symbol("route");import.meta.url.replace(/\/app\/.*$/,"/");const HI=()=>CI()?.$router,bC=()=>QA()?EI(FC,CI()._route):CI()._route;function bw(C){return C}const NR=()=>{try{if(CI()._processingMiddleware)return!0}catch{return!1}return!1},qA=(C,I)=>{C||="/";const g=typeof C=="string"?C:"path"in C?kd(C):HI().resolve(C).href;if(I?.open){const{target:i="_blank",windowFeatures:F={}}=I.open,V=[];for(const[W,G]of Object.entries(F))G!==void 0&&V.push(`${W.toLowerCase()}=${G}`);return open(g,i,V.join(", ")),Promise.resolve()}const A=Ug(g,{acceptRelative:!0}),l=I?.external||A;if(l){if(!I?.external)throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const{protocol:i}=new URL(g,window.location.href);if(i&&wW(i))throw new Error(`Cannot navigate to a URL with '${i}' protocol.`)}const d=NR();if(!l&&d){if(I?.replace){if(typeof C=="string"){const{pathname:i,search:F,hash:V}=NA(C);return{path:i,...F&&{query:oZ(F)},...V&&{hash:V},replace:!0}}return{...C,replace:!0}}return C}const Z=HI(),B=CI();if(l)return B._scope.stop(),I?.replace?location.replace(g):location.href=g,d?B.isHydrating?new Promise(()=>{}):!1:Promise.resolve();const c=typeof C=="string"?Vi(C):C;return I?.replace?Z.replace(c):Z.push(c)};function kd(C){return cl(C.path||"",C.query||{})+(C.hash||"")}function Vi(C){const I=NA(C);return fc(bW(I.pathname))+I.search+I.hash}const Gi="__nuxt_error",LC=()=>Dl(CI().payload,"error"),ZC=C=>{const I=tg(C);try{const g=LC();CI().hooks.callHook("app:error",I),g.value||=I}catch{throw I}return I},YR=async(C={})=>{const I=CI(),g=LC();I.callHook("app:error:cleared",C),C.redirect&&await HI().replace(C.redirect),g.value=void 0},Wi=C=>!!C&&typeof C=="object"&&Gi in C,tg=C=>{typeof C!="string"&&C.statusText&&(C.message??=C.statusText);const I=nR(C);return Object.defineProperty(I,Gi,{value:!0,configurable:!1,writable:!1}),Object.defineProperty(I,"status",{get:()=>I.statusCode,configurable:!0}),Object.defineProperty(I,"statusText",{get:()=>I.statusMessage,configurable:!0}),I};let Ri;const pC=C=>Ri=C,si=Symbol();function Td(C){return C&&typeof C=="object"&&Object.prototype.toString.call(C)==="[object Object]"&&typeof C.toJSON!="function"}var lA;(function(C){C.direct="direct",C.patchObject="patch object",C.patchFunction="patch function"})(lA||(lA={}));function wR(){const C=WZ(!0),I=C.run(()=>f({}));let g=[],A=[];const l=Tc({install(d){pC(l),l._a=d,d.provide(si,l),d.config.globalProperties.$pinia=l,A.forEach(Z=>g.push(Z)),A=[]},use(d){return this._a?g.push(d):A.push(d),this},_p:g,_a:null,_e:C,_s:new Map,state:I});return l}const bi=()=>{};function B0(C,I,g,A=bi){C.add(I);const l=()=>{C.delete(I)&&A()};return!g&&nA()&&FA(l),l}function QC(C,...I){C.forEach(g=>{g(...I)})}const hR=C=>C(),c0=Symbol(),Wd=Symbol();function zd(C,I){C instanceof Map&&I instanceof Map?I.forEach((g,A)=>
2C.set(A,g)):C instanceof Set&&I instanceof Set&&I.forEach(C.add,C);for(const g in I){if(!I.hasOwnProperty(g))continue;const A=I[g],l=C[g];Td(l)&&Td(A)&&C.hasOwnProperty(g)&&!qg(A)&&!RZ(A)?C[g]=zd(l,A):C[g]=A}return C}const eR=Symbol();function JR(C){return!Td(C)||!Object.prototype.hasOwnProperty.call(C,eR)}const{assign:kg}=Object;function SR(C){return!!(qg(C)&&C.effect)}function XR(C,I,g,A){const{state:l,actions:d,getters:Z}=I,B=g.state.value[C];let c;function i(){B||(g.state.value[C]=l?l():{});const F=TG(g.state.value[C]);return kg(F,d,Object.keys(Z||{}).reduce((V,W)=>(V[W]=Tc(v(()=>{pC(g);const G=g._s.get(C);return Z[W].call(G,G)})),V),{}))}return c=Ui(C,i,I,g,A,!0),c}function Ui(C,I,g={},A,l,d){let Z;const B=kg({actions:{}},g),c={deep:!0};let i,F,V=new Set,W=new Set,G;const R=A.state.value[C];!d&&!R&&(A.state.value[C]={});let s;function Q(u){let E;i=F=!1,typeof u=="function"?(u(A.state.value[C]),E={type:lA.patchFunction,storeId:C,events:G}):(zd(A.state.value[C],u),E={type:lA.patchObject,payload:u,storeId:C,events:G});const r=s=Symbol();Rg().then(()=>{s===r&&(i=!0)}),F=!0,QC(V,E,A.state.value[C])}const m=d?function(){const{state:E}=g,r=E?E():{};this.$patch(AI=>{kg(AI,r)})}:bi;function n(){Z.stop(),V.clear(),W.clear(),A._s.delete(C)}const o=(u,E="")=>{if(c0 in u)return u[Wd]=E,u;const r=function(){pC(A);const AI=Array.from(arguments),PI=new Set,fI=new Set;function Hg(QI){PI.add(QI)}function Cg(QI){fI.add(QI)}QC(W,{args:AI,name:r[Wd],store:J,after:Hg,onError:Cg});let cg;try{cg=u.apply(this&&this.$id===C?this:J,AI)}catch(QI){throw QC(fI,QI),QI}return cg instanceof Promise?cg.then(QI=>(QC(PI,QI),QI)).catch(QI=>(QC(fI,QI),Promise.reject(QI))):(QC(PI,cg),cg)};return r[c0]=!0,r[Wd]=E,r},w={_p:A,$id:C,$onAction:B0.bind(null,W),$patch:Q,$reset:m,$subscribe(u,E={}){const r=B0(V,u,E.detached,()=>AI()),AI=Z.run(()=>$I(()=>A.state.value[C],PI=>{(E.flush==="sync"?F:i)&&u({storeId:C,type:lA.direct,events:G},PI)},kg({},c,E)));return r},$dispose:n},J=Mg(w);A._s.set(C,J);const t=(A._a&&A._a.runWithContext||hR)(()=>A._e.run(()=>(Z=WZ()).run(()=>I({action:o}))));for(const u in t){const E=t[u];if(qg(E)&&!SR(E)||RZ(E))d||(R&&JR(E)&&(qg(E)?E.value=R[u]:zd(E,R[u])),A.state.value[C][u]=E);else if(typeof E=="function"){const r=o(E,u);t[u]=r,B.actions[u]=E}}return kg(J,t),kg(Ml(J),t),Object.defineProperty(J,"$state",{get:()=>A.state.value[C],set:u=>{Q(E=>{kg(E,u)})}}),A._p.forEach(u=>{kg(J,Z.run(()=>u({store:J,app:A._a,pinia:A,options:B})))}),R&&d&&g.hydrate&&g.hydrate(J.$state,R),i=!0,F=!0,J}function NZ(C,I,g){let A;const l=typeof I=="function";A=l?g:I;function d(Z,B){const c=QA();return Z=Z||(c?EI(si,null):null),Z&&pC(Z),Z=Ri,Z._s.has(C)||(l?Ui(C,I,A,Z):XR(C,A,Z)),Z._s.get(C)}return d.$id=C,d}function Uw(C){const I=Ml(C),g={};for(const A in I){const l=I[A];l.effect?g[A]=v({get:()=>C[A],set(d){C[A]=d}}):(qg(l)||RZ(l))&&(g[A]=Dl(C,A))}return g}function yR(C){return Uint8Array.fromBase64(C).buffer}function tR(C){return Uint8Array.from(Buffer.from(C,"base64")).buffer}function DR(C){const I=atob(C),g=I.length,A=new Uint8Array(g);for(let l=0;l<g;l++)A[l]=I.charCodeAt(l);return A.buffer}const MR=typeof Uint8Array.fromBase64=="function",HR=typeof process=="object"&&process.versions?.node!==void 0,uR=MR?yR:HR?tR:DR,pR=-1,KR=-2,kR=-3,TR=-4,zR=-5,LR=-6,ER=-7;function rR(C,I){return jR(JSON.parse(C),I)}function jR(C,I){if(typeof C=="number")return d(C,!0);if(!Array.isArray(C)||C.length===0)throw new Error("Invalid input");const g=C,A=Array(g.length);let l=null;function d(Z,B=!1){if(Z===pR)return;if(Z===kR)return NaN;if(Z===TR)return 1/0;if(Z===zR)return-1/0;if(Z===LR)return-0;if(B||typeof Z!="number")throw new Error("Invalid input");if(Z in A)return A[Z];const c=g[Z];if(!c||typeof c!="object")A[Z]=c;else if(Array.isArray(c))if(typeof c[0]=="string"){const i=c[0],F=I&&Object.hasOwn(I,i)?I[i]:void 0;if(F){let V=c[1];if(typeof V!="number"&&(V=g.push(c[1])-1),l??=new Set,l.has(V))throw new Error("Invalid circular reference");return l.add(V),A[Z]=F(d(V)),l.delete(V),A[Z]}switch(i){case"Date":A[Z]=new Date(c[1]);break;case"Set":const V=new Set;A[Z]=V;for(let R=1;R<c.length;R+=1)V.add(d(c[R]));break;case"Map":const W=new Map;A[Z]=W;for(let R=1;R<c.length;R+=2)W.set(d(c[R]),d(c[R+1]));break;case"RegExp":A[Z]=new RegExp(c[1],c[2]);break;case"Object":{const R=c[1];if(typeof g[R]=="object"&&g[R][0]!=="BigInt")throw new Error("Invalid input");A[Z]=Object(d(R));break}case"BigInt":A[Z]=BigInt(c[1]);break;case"null":const G=Object.create(null);A[Z]=G;
2for(let R=1;R<c.length;R+=2){if(c[R]==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");G[c[R]]=d(c[R+1])}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":case"DataView":{if(g[c[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");const R=globalThis[i],s=d(c[1]);A[Z]=c[2]!==void 0?new R(s,c[2],c[3]):new R(s);break}case"ArrayBuffer":{const R=c[1];if(typeof R!="string")throw new Error("Invalid ArrayBuffer encoding");const s=uR(R);A[Z]=s;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{const R=i.slice(9);A[Z]=Temporal[R].from(c[1]);break}case"URL":{const R=new URL(c[1]);A[Z]=R;break}case"URLSearchParams":{const R=new URLSearchParams(c[1]);A[Z]=R;break}default:throw new Error(`Unknown type ${i}`)}}else if(c[0]===ER){const i=c[1];if(!Number.isInteger(i)||i<0)throw new Error("Invalid input");const F=new Array(i);A[Z]=F;for(let V=2;V<c.length;V+=2){const W=c[V];if(!Number.isInteger(W)||W<0||W>=i)throw new Error("Invalid input");F[W]=d(c[V+1])}}else{const i=new Array(c.length);A[Z]=i;for(let F=0;F<c.length;F+=1){const V=c[F];V!==KR&&(i[F]=d(V))}}else{const i={};A[Z]=i;for(const F of Object.keys(c)){if(F==="__proto__")throw new Error("Cannot parse an object with a `__proto__` property");const V=c[F];i[F]=d(V)}}return A[Z]}return d(0)}const OR=new Set(["link","style","script","noscript"]),vR=new Set(["title","titleTemplate","script","style","noscript"]),Ld=new Set(["base","meta","link","style","script","noscript"]),xR=new Set(["title","base","htmlAttrs","bodyAttrs","meta","link","style","script","noscript"]),PR=new Set(["base","title","titleTemplate","bodyAttrs","htmlAttrs","templateParams"]),fR=new Set(["key","tagPosition","tagPriority","tagDuplicateStrategy","innerHTML","textContent","processTemplateParams"]),_R=new Set(["templateParams","htmlAttrs","bodyAttrs"]),YZ=new Set(["theme-color","google-site-verification","og","article","book","profile","twitter","author"]),WA={META:new Set(["twitter"]),OG:new Set(["og","book","article","profile","fb"]),MEDIA:new Set(["ogImage","ogVideo","ogAudio","twitterImage"]),HTTP_EQUIV:new Set(["contentType","defaultStyle","xUaCompatible"])},qR={articleExpirationTime:"article:expiration_time",articleModifiedTime:"article:modified_time",articlePublishedTime:"article:published_time",bookReleaseDate:"book:release_date",fbAppId:"fb:app_id",ogAudioSecureUrl:"og:audio:secure_url",ogAudioUrl:"og:audio",ogImageSecureUrl:"og:image:secure_url",ogImageUrl:"og:image",ogSiteName:"og:site_name",ogVideoSecureUrl:"og:video:secure_url",ogVideoUrl:"og:video",profileFirstName:"profile:first_name",profileLastName:"profile:last_name",profileUsername:"profile:username",msapplicationConfig:"msapplication-Config",msapplicationTileColor:"msapplication-TileColor",msapplicationTileImage:"msapplication-TileImage"},oi={appleItunesApp:{unpack:{entrySeparator:", ",resolve:({key:C,value:I})=>`${Xg(C)}=${I}`}},refresh:{metaKey:"http-equiv",unpack:{entrySeparator:";",resolve:({key:C,value:I})=>C==="seconds"?`${I}`:void 0}},robots:{unpack:{entrySeparator:", ",resolve:({key:C,value:I})=>typeof I=="boolean"?Xg(C):`${Xg(C)}:${I}`}},contentSecurityPolicy:{metaKey:"http-equiv",unpack:{entrySeparator:"; ",resolve:({key:C,value:I})=>`${Xg(C)} ${I}`}},charset:{}};function Xg(C){const I=C.replace(/([A-Z])/g,"-$1").toLowerCase(),g=I.indexOf("-");return g===-1?I:WA.META.has(I.slice(0,g))||WA.OG.has(I.slice(0,g))?C.replace(/([A-Z])/g,":$1").toLowerCase():I}function mi(C){return Object.fromEntries(Object.entries(C).filter(([I,g])=>String(g)!=="false"&&I))}function Ed(C){return Array.isArray(C)?C.map(Ed):!C||typeof C!="object"?C:Object.fromEntries(Object.entries(C).map(([I,g])=>[Xg(I),Ed(g)]))}function ni(C,I={}){const{entrySeparator:g="",keyValueSeparator:A="",wrapValue:l,resolve:d}=I;return Object.entries(C).map(([Z,B])=>{if(d){const i=d({key:Z,value:B});if(i!==void 0)return i}const c=typeof B=="object"?ni(B,I):typeof B=="number"?B.toString():typeof B=="str
2ing"&&l?`${l}${B.replace(new RegExp(l,"g"),`\\${l}`)}${l}`:B;return`${Z}${A}${c}`}).join(g)}function i0(C,I){const g=mi(I),A=Xg(C),l=Qi(A);if(!YZ.has(A))return[{[l]:A,...g}];const d=Object.fromEntries(Object.entries(g).map(([Z,B])=>[`${C}${Z==="url"?"":`${Z[0].toUpperCase()}${Z.slice(1)}`}`,B]));return Vl(d||{}).sort((Z,B)=>(Z[l]?.length||0)-(B[l]?.length||0))}function Qi(C){if(oi[C]?.metaKey==="http-equiv"||WA.HTTP_EQUIV.has(C))return"http-equiv";const I=Xg(C),g=I.indexOf(":");return g===-1?"name":WA.OG.has(I.slice(0,g))?"property":"name"}function $R(C){return qR[C]||Xg(C)}function Is(C,I){return I==="refresh"?`${C.seconds};url=${C.url}`:ni(Ed(C),{keyValueSeparator:"=",entrySeparator:", ",resolve:({value:g,key:A})=>g===null?"":typeof g=="boolean"?A:void 0,...oi[I]?.unpack})}function Vl(C){const I=[],g={};for(const[l,d]of Object.entries(C)){if(Array.isArray(d)){if(l==="themeColor"){d.forEach(Z=>{typeof Z=="object"&&Z!==null&&I.push({name:"theme-color",...Z})});continue}for(const Z of d)if(typeof Z=="object"&&Z!==null){const B=[],c=[];for(const[i,F]of Object.entries(Z)){const V=`${l}${i==="url"?"":`:${i}`}`,W=Vl({[V]:F});(i==="url"?B:c).push(...W)}I.push(...B,...c)}else I.push(...typeof Z=="string"?Vl({[l]:Z}):i0(l,Z));continue}if(typeof d=="object"&&d)if(WA.MEDIA.has(l)){const Z=l.startsWith("twitter")?"twitter":"og",B=l.replace(/^(og|twitter)/,"").toLowerCase(),c=Z==="twitter"?"name":"property";d.url&&I.push({[c]:`${Z}:${B}`,content:d.url}),d.secureUrl&&I.push({[c]:`${Z}:${B}:secure_url`,content:d.secureUrl});for(const[i,F]of Object.entries(d))i!=="url"&&i!=="secureUrl"&&I.push({[c]:`${Z}:${B}:${i}`,content:F})}else YZ.has(Xg(l))?I.push(...i0(l,d)):g[l]=mi(d);else g[l]=d}const A=Object.entries(g).map(([l,d])=>{if(l==="charset")return{charset:d===null?"_null":d};const Z=Qi(l),B=$R(l),c=d===null?"_null":typeof d=="object"?Is(d,l):typeof d=="number"?d.toString():d;return Z==="http-equiv"?{"http-equiv":B,content:c}:{[Z]:B,content:c}});return[...I,...A].map(l=>"content"in l&&l.content==="_null"?{...l,content:null}:l)}const gs={key:"flatMeta",hooks:{"entries:normalize":C=>{const I=[];C.tags=C.tags.map(g=>g.tag!=="_flatMeta"?g:(I.push(Vl(g.props).map(A=>({...g,tag:"meta",props:A}))),!1)).filter(Boolean).concat(...I)}}},Cs=["name","property","http-equiv"],As=new Set(["viewport","description","keywords","robots"]);function ai(C){const I=C.split(":");return I.length?YZ.has(I[1]):!1}function rd(C){const{props:I,tag:g}=C;if(PR.has(g))return g;if(g==="link"&&I.rel==="canonical")return"canonical";if(g==="link"&&I.rel==="alternate"){if(I.hreflang)return`alternate:${I.hreflang}`;if(I.type)return`alternate:${I.type}:${I.href||""}`}if(I.charset)return"charset";if(C.tag==="meta"){for(const A of Cs)if(I[A]!==void 0){const l=I[A],d=l&&typeof l=="string"&&l.includes(":"),Z=l&&As.has(l),c=!(d||Z)&&C.key?`:key:${C.key}`:"";return`${g}:${l}${c}`}}if(C.key)return`${g}:key:${C.key}`;if(I.id)return`${g}:id:${I.id}`;if(g==="link"&&I.rel==="alternate")return`alternate:${I.href||""}`;if(vR.has(g)){const A=C.textContent||C.innerHTML;if(A)return`${g}:content:${A}`}}function Ni(C){const I=C._h||C._d;if(I)return I;const g=C.textContent||C.innerHTML;return g||`${C.tag}:${Object.entries(C.props).map(([A,l])=>`${A}:${String(l)}`).join(",")}`}function Gl(C,I,g){typeof C==="function"&&(!g||g!=="titleTemplate"&&!(g[0]==="o"&&g[1]==="n"))&&(C=C());const l=I?I(g,C):C;if(Array.isArray(l))return l.map(d=>Gl(d,I));if(l?.constructor===Object){const d={};for(const Z of Object.keys(l))d[Z]=Gl(l[Z],I,Z);return d}return l}function ls(C,I){const g=C==="style"?new Map:new Set;function A(l){if(l==null||l===void 0)return;const d=String(l).trim();if(d)if(C==="style"){const[Z,...B]=d.split(":").map(c=>c?c.trim():"");Z&&B.length&&g.set(Z,B.join(":"))}else d.split(" ").filter(Boolean).forEach(Z=>g.add(Z))}return typeof I=="string"?C==="style"?I.split(";").forEach(A):A(I):Array.isArray(I)?I.forEach(l=>A(l)):I&&typeof I=="object"&&Object.entries(I).forEach(([l,d])=>{d&&d!=="false"&&(C==="style"?g.set(String(l).trim(),String(d)):A(l))}),g}function Yi(C,I){if(C.props=C.props||{},!I)return C;if(C.tag==="templateParams")return C.props=I,C;const g=Ld.has(C.tag)||C.tag==="htmlAttrs"||C.tag==="bodyAttrs";
2return Object.entries(I).forEach(([A,l])=>{if(A==="__proto__"||A==="constructor"||A==="prototype")return;if(l===null){C.props[A]=null;return}if(A==="class"||A==="style"){C.props[A]=ls(A,l);return}if(fR.has(A)){if((A==="textContent"||A==="innerHTML")&&typeof l=="object"){let i=I.type;if(I.type||(i="application/json"),!i?.endsWith("json")&&i!=="speculationrules")return;I.type=i,C.props.type=i,C[A]=JSON.stringify(l)}else C[A]=l;return}const d=A.startsWith("data-"),Z=g&&!d?A.toLowerCase():A,B=String(l),c=C.tag==="meta"&&Z==="content";B==="true"||B===""?C.props[Z]=d||c?B:!0:!l&&d&&B==="false"?C.props[Z]="false":l!==void 0&&(C.props[Z]=l)}),C}function ds(C,I){const g=typeof I=="object"&&typeof I!="function"?I:{[C==="script"||C==="noscript"||C==="style"?"innerHTML":"textContent"]:I},A=Yi({tag:C,props:{}},g);return A.key&&OR.has(A.tag)&&(A.props["data-hid"]=A._h=A.key),A.tag==="script"&&typeof A.innerHTML=="object"&&(A.innerHTML=JSON.stringify(A.innerHTML),A.props.type=A.props.type||"application/json"),Array.isArray(A.props.content)?A.props.content.map(l=>({...A,props:{...A.props,content:l}})):A}function Zs(C,I){if(!C)return[];typeof C=="function"&&(C=C());const g=(l,d)=>{for(let Z=0;Z<I.length;Z++)d=I[Z](l,d);return d};C=g(void 0,C);const A=[];return C=Gl(C,g),Object.entries(C||{}).forEach(([l,d])=>{if(d!==void 0)for(const Z of Array.isArray(d)?d:[d])A.push(ds(l,Z))}),A.flat()}const F0=(C,I)=>C._w===I._w?C._p-I._p:C._w-I._w,V0={base:-10,title:10},Bs={critical:-8,high:-1,low:2},G0={meta:{"content-security-policy":-30,charset:-20,viewport:-15},link:{preconnect:20,stylesheet:60,preload:70,modulepreload:70,prefetch:90,"dns-prefetch":90,prerender:90},script:{async:30,defer:80,sync:50},style:{imported:40,sync:60}},cs=/@import/,_C=C=>C===""||C===!0;function is(C,I){if(typeof I.tagPriority=="number")return I.tagPriority;let g=100;const A=Bs[I.tagPriority]||0,l=C.resolvedOptions.disableCapoSorting?{link:{},script:{},style:{}}:G0;if(I.tag in V0)g=V0[I.tag];else if(I.tag==="meta"){const d=I.props["http-equiv"]==="content-security-policy"?"content-security-policy":I.props.charset?"charset":I.props.name==="viewport"?"viewport":null;d&&(g=G0.meta[d])}else if(I.tag==="link"&&I.props.rel)g=l.link[I.props.rel];else if(I.tag==="script"){const d=String(I.props.type);_C(I.props.async)?g=l.script.async:I.props.src&&!_C(I.props.defer)&&!_C(I.props.async)&&d!=="module"&&!d.endsWith("json")||I.innerHTML&&!d.endsWith("json")?g=l.script.sync:(_C(I.props.defer)&&I.props.src&&!_C(I.props.async)||d==="module")&&(g=l.script.defer)}else I.tag==="style"&&(g=I.innerHTML&&cs.test(I.innerHTML)?l.style.imported:l.style.sync);return(g||100)+A}function W0(C,I){const g=typeof I=="function"?I(C):I,A=g.key||String(C.plugins.size+1);C.plugins.get(A)||(C.plugins.set(A,g),C.hooks.addHooks(g.hooks||{}))}function Fs(C={}){const I=Zi();I.addHooks(C.hooks||{});const g=!C.document,A=new Map,l=new Map,d=new Set,Z={_entryCount:1,plugins:l,dirty:!1,resolvedOptions:C,hooks:I,ssr:g,entries:A,headEntries(){return[...A.values()]},use:B=>W0(Z,B),push(B,c){const i={...c||{}};delete i.head;const F=i._index??Z._entryCount++,V={_i:F,input:B,options:i},W={_poll(G=!1){Z.dirty=!0,!G&&d.add(F),I.callHook("entries:updated",Z)},dispose(){A.delete(F)&&Z.invalidate()},patch(G){(!i.mode||i.mode==="server"&&g||i.mode==="client"&&!g)&&(V.input=G,A.set(F,V),W._poll())}};return W.patch(B),W},async resolveTags(){const B={tagMap:new Map,tags:[],entries:[...Z.entries.values()]};for(await I.callHook("entries:resolve",B);d.size;){const W=d.values().next().value;d.delete(W);const G=A.get(W);if(G){const R={tags:Zs(G.input,C.propResolvers||[]).map(s=>Object.assign(s,G.options)),entry:G};await I.callHook("entries:normalize",R),G._tags=R.tags.map((s,Q)=>(s._w=is(Z,s),s._p=(G._i<<10)+Q,s._d=rd(s),s._d||(s._h=Ni(s)),s))}}let c=!1;B.entries.flatMap(W=>(W._tags||[]).map(G=>({...G,props:{...G.props}}))).sort(F0).reduce((W,G)=>{const R=G._d||G._h;if(!W.has(R))return W.set(R,G);const s=W.get(R);if((G?.tagDuplicateStrategy||(_R.has(G.tag)?"merge":null)||(G.key&&G.key===s.key?"merge":null))==="merge"){const m={...s.props};
2Object.entries(G.props).forEach(([n,o])=>m[n]=n==="style"?new Map([...s.props.style||new Map,...o]):n==="class"?new Set([...s.props.class||new Set,...o]):o),W.set(R,{...G,props:m})}else G._p>>10===s._p>>10&&G.tag==="meta"&&ai(R)?(W.set(R,Object.assign([...Array.isArray(s)?s:[s],G],G)),c=!0):(G._w===s._w?G._p>s._p:G?._w<s?._w)&&W.set(R,G);return W},B.tagMap);const i=B.tagMap.get("title"),F=B.tagMap.get("titleTemplate");if(Z._title=i?.textContent,F){const W=F?.textContent;if(Z._titleTemplate=W,W){let G=typeof W=="function"?W(i?.textContent):W;typeof G=="string"&&!Z.plugins.has("template-params")&&(G=G.replace("%s",i?.textContent||"")),i?G===null?B.tagMap.delete("title"):B.tagMap.set("title",{...i,textContent:G}):(F.tag="title",F.textContent=G)}}B.tags=Array.from(B.tagMap.values()),c&&(B.tags=B.tags.flat().sort(F0)),await I.callHook("tags:beforeResolve",B),await I.callHook("tags:resolve",B),await I.callHook("tags:afterResolve",B);const V=[];for(const W of B.tags){const{innerHTML:G,tag:R,props:s}=W;if(xR.has(R)&&!(Object.keys(s).length===0&&!W.innerHTML&&!W.textContent)&&!(R==="meta"&&!s.content&&!s["http-equiv"]&&!s.charset)){if(R==="script"&&G){if(String(s.type).endsWith("json")){const Q=typeof G=="string"?G:JSON.stringify(G);W.innerHTML=Q.replace(/</g,"\\u003C")}else typeof G=="string"&&(W.innerHTML=G.replace(new RegExp(`</${R}`,"g"),`<\\/${R}`));W._d=rd(W)}V.push(W)}}return V},invalidate(){for(const B of A.values())d.add(B._i);Z.dirty=!0,I.callHook("entries:updated",Z)}};return(C?.plugins||[]).forEach(B=>W0(Z,B)),Z.hooks.callHook("init",Z),C.init?.forEach(B=>B&&Z.push(B)),Z}const Rd="%separator";function Vs(C,I,g=!1){let A;if(I==="s"||I==="pageTitle")A=C.pageTitle;else if(I.includes(".")){const l=I.indexOf(".");A=C[I.substring(0,l)]?.[I.substring(l+1)]}else A=C[I];if(A!==void 0)return g?(A||"").replace(/\\/g,"\\\\").replace(/</g,"\\u003C").replace(/"/g,'\\"'):A||""}function uA(C,I,g,A=!1){if(typeof C!="string"||!C.includes("%"))return C;let l=C;try{l=decodeURI(C)}catch{}const d=l.match(/%\w+(?:\.\w+)?/g);if(!d)return C;const Z=C.includes(Rd);return C=C.replace(/%\w+(?:\.\w+)?/g,B=>{if(B===Rd||!d.includes(B))return B;const c=Vs(I,B.slice(1),A);return c!==void 0?c:B}).trim(),Z&&(C=C.split(Rd).map(B=>B.trim()).filter(B=>B!=="").join(g?` ${g} `:" ")),C}const Gs={meta:"content",link:"href",htmlAttrs:"lang"},Ws=["innerHTML","textContent"],wi=C=>({key:"template-params",hooks:{"entries:normalize":I=>{const g=I.tags.filter(A=>A.tag==="templateParams"&&A.mode==="server")?.[0]?.props||{};Object.keys(g).length&&(C._ssrPayload={templateParams:{...C._ssrPayload?.templateParams||{},...g}})},"tags:resolve":({tagMap:I,tags:g})=>{const A=I.get("templateParams")?.props||{},l=A.separator||"|";delete A.separator,A.pageTitle=uA(A.pageTitle||C._title||"",A,l);for(const d of g){if(d.processTemplateParams===!1)continue;const Z=Gs[d.tag];if(Z&&typeof d.props[Z]=="string")d.props[Z]=uA(d.props[Z],A,l);else if(d.processTemplateParams||d.tag==="titleTemplate"||d.tag==="title")for(const B of Ws)typeof d[B]=="string"&&(d[B]=uA(d[B],A,l,d.tag==="script"&&d.props.type.endsWith("json")))}C._templateParams=A,C._separator=l},"tags:afterResolve":({tagMap:I})=>{const g=I.get("title");g?.textContent&&g.processTemplateParams!==!1&&(g.textContent=uA(g.textContent,C._templateParams,C._separator))}}});function Rs(C={}){return I=>(I.push({meta:[{name:"twitter:card",content:C.twitterCard||"summary_large_image",tagPriority:"low"},{property:"og:title",tagPriority:"low","data-infer":""},{property:"og:description",tagPriority:"low","data-infer":""}]}),{key:"infer-seo-meta",hooks:{"tags:beforeResolve":({tagMap:g})=>{let A=I._titleTemplate||I._title;const l=g.get("meta:og:title");typeof l?.props["data-infer"]<"u"&&(typeof A=="function"&&(A=A(I._title)),l.props.content=C.ogTitle?C.ogTitle(A):A||"",l.processTemplateParams=!0);const d=g.get("meta:description")?.props?.content,Z=g.get("meta:og:description");typeof Z?.props["data-infer"]<"u"&&(Z.props.content=C.ogDescription?C.ogDescription(d):d||"",Z.processTemplateParams=!0)}}})}const ss=(C,I)=>qg(I)?Ig(I):I,wZ="usehead";function bs(C){return{install(g){g.config.globalProperties.$unhead=C,g.config.globalProperties.$head=C,g.provide(wZ,C)}}.install}function hi(){if(QA()){const C=EI(wZ);if(C)return C}throw new Error("useHead() was called without provide context, ensure you call it through the setup() function.")}function ei(C,I={}){const g=I.head||hi();return g.ssr?g.push(C||{},I):Us(g,C,I)}function Us(C,I,g={}){const A=f(!1);let l;return zc(()=>{const Z=A.value?{}:Gl(I,ss);l?l.patch(Z):l=C.push(Z,g)}),aA()&&(sZ(()=>{l.dispose()}),zG(()=>{A.value=!0}),LG(()=>{A.value=!1})),l}function os(C={},I={}){(I.head||hi()).use(gs);const{title:A,titleTemplate:l,...d}=C;return ei({title:A,titleTemplate:l,_flatMeta:d},I)}function EC(C){const I=C||CI();return I.ssrContext?.head||I.runWithContext(()=>{if(QA()){const g=EI(wZ);if(!g)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return g}})}function Kl(C,I={}){const g=I.head||EC(I.nuxt);return ei(C,{head:g,...I})}function Ji(C,I={}){const g=I.head||EC(I.nuxt);return os(C,{head:g,...I})}const ms=(()=>{const C={},I={ssr:!1},g={payload:!1};return(A,l)=>{let d=[];l.charCodeAt(l.length-1)===47&&(l=l.slice(0,-1)||"/"),l==="/sitemap.xml"?d.unshift({data:C}):l==="/_nuxt"&&d.unshift({data:C});let Z=l.split("/"),B=Z.length;return B>1&&(Z[1]==="dashboard"?d.unshift({data:I,params:{_:Z.slice(2).join("/")}}
2):Z[1]==="auth"?d.unshift({data:I,params:{_:Z.slice(2).join("/")}}):Z[1]==="gazete"?d.unshift({data:g,params:{_:Z.slice(2).join("/")}}):Z[1]==="_og"&&B>2&&(Z[2]==="d"?d.unshift({data:C,params:{_:Z.slice(3).join("/")}}):Z[2]==="r"?d.unshift({data:C,params:{_:Z.slice(3).join("/")}}):Z[2]==="s"&&d.unshift({data:C,params:{_:Z.slice(3).join("/")}}))),d.unshift({data:C,params:{_:Z.slice(1).join("/")}}),d}})(),Si=C=>aZ({},...ms("",C).map(I=>I.data).reverse()),ns=Si;let $A;function Qs(){let C;return C=$fetch(nZ(`builds/meta/${og().app.buildId}.json`),{responseType:"json"}),$A=C,C.catch(I=>{$A===C&&($A=void 0)}),C}function hZ(){return $A||Qs()}function kl(C){const I=typeof C=="string"?C:C.path;try{return ns(I)}catch{return{}}}async function R0(C,I={}){if(await Ys(C)){const g=await Ns(C,I);return await Xi(g)||null}return null}const as="_payload.json";async function Ns(C,I={}){const g=new URL(C,"http://localhost");if(g.host!=="localhost"||Ug(g.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+C);const A=og(),l=I.hash||(I.fresh?Date.now():A.app.buildId),d=A.app.cdnURL,Z=d&&await ws(C)?d:A.app.baseURL;return pl(Z,g.pathname,as+(l?`?${l}`:""))}async function Xi(C){try{if(dR){const I=await fetch(C,{cache:"force-cache"});return I.ok?await Di(await I.text()):null}}catch{}return null}function yi(C){if(C.redirect)return!1;if(C.prerender)return!0}async function ti(C){return C=C==="/"?C:C.replace(/\/$/,""),(await hZ()).prerendered.includes(C)}async function Ys(C=bC().path){const I=kl({path:C});if(I.ssr===!1)return!1;const g=yi(I);return g!==void 0?g:I.payload?!0:await ti(C)}async function ws(C=bC().path){const I=yi(kl({path:C}));return I!==void 0?I:await ti(C)}let AC=null;async function hs(){if(AC)return AC;const C=document.getElementById("__NUXT_DATA__");if(!C)return{};const I=await Di(C.textContent||""),g=C.dataset.src?await Xi(C.dataset.src):void 0;return AC={...I,...g,...window.__NUXT__},AC.config?.public&&(AC.config.public=Mg(AC.config.public)),AC}async function Di(C){return await rR(C,CI()._payloadRevivers)}function Mi(C,I){CI()._payloadRevivers[C]=I}const es=bR(()=>{Mi("skipHydrate",C=>{})});function s0(C){try{return JSON.parse(C)}catch{return C}}const Js=[["NuxtError",C=>tg(C)],["EmptyShallowRef",C=>OI(C==="_"?void 0:C==="0n"?BigInt(0):s0(C))],["EmptyRef",C=>f(C==="_"?void 0:C==="0n"?BigInt(0):s0(C))],["ShallowRef",C=>OI(C)],["ShallowReactive",C=>Qg(C)],["Ref",C=>f(C)],["Reactive",C=>Mg(C)]],Ss=WI({name:"nuxt:revive-payload:client",order:-30,async setup(C){let I,g;for(const[A,l]of Js)Mi(A,l);Object.assign(C.payload,([I,g]=Og(()=>C.runWithContext(hs)),I=await I,g(),I)),delete window.__NUXT__}});async function eZ(C,I={}){const g=I.document||C.resolvedOptions.document;if(!g||!C.dirty)return;const A={shouldRender:!0,tags:[]};if(await C.hooks.callHook("dom:beforeRender",A),!!A.shouldRender)return C._domUpdatePromise||(C._domUpdatePromise=new Promise(async l=>{const d=new Map,Z=new Promise(G=>{C.resolveTags().then(R=>{G(R.map(s=>{const Q=d.get(s._d)||0,m={tag:s,id:(Q?`${s._d}:${Q}`:s._d)||s._h,shouldRender:!0};return s._d&&ai(s._d)&&d.set(s._d,Q+1),m}))})});let B=C._dom;if(!B){B={title:g.title,elMap:new Map().set("htmlAttrs",g.documentElement).set("bodyAttrs",g.body)};for(const G of["body","head"]){const R=g[G]?.children;for(const s of R){const Q=s.tagName.toLowerCase();if(!Ld.has(Q))continue;const m=Yi({tag:Q,props:{}},{innerHTML:s.innerHTML,...s.getAttributeNames().reduce((n,o)=>(n[o]=s.getAttribute(o),n),{})||{}});if(m.key=s.getAttribute("data-hid")||void 0,m._d=rd(m)||Ni(m),B.elMap.has(m._d)){let n=1,o=m._d;for(;B.elMap.has(o);)o=`${m._d}:${n++}`;B.elMap.set(o,s)}else B.elMap.set(m._d,s)}}}B.pendingSideEffects={...B.sideEffects},B.sideEffects={};function c(G,R,s){const Q=`${G}:${R}`;B.sideEffects[Q]=s,delete B.pendingSideEffects[Q]}function i({id:G,$el:R,tag:s}){const Q=s.tag.endsWith("Attrs");B.elMap.set(G,R),Q||(s.textContent&&s.textContent!==R.textContent&&(R.textContent=s.textContent),s.innerHTML&&s.innerHTML!==R.innerHTML&&(R.innerHTML=s.innerHTML),c(G,"el",()=>{R?.remove(),B.elMap.delete(G)}));for(const m in s.props){if(!Object.prototype.hasOwnProperty.call(s.props,m))continue;const n=s.props[m];if(m.startsWith("on")&&typeof n=="function"){const w=R?.dataset;if(w&&w[`${m}fired`]){const J=m.slice(0,-5);n.call(R,new Event(J.substring(2)))}R.getAttribute(`data-${m}`)!==""&&((s.tag==="bodyAttrs"?g.defaultView:R).addEventListener(m.substring(2),n.bind(R)),R.setAttribute(`data-${m}`,""));continue}const o=`attr:${m}`;if(m==="class"){if(!n)continue;for(const w of n)Q&&c(G,`${o}:${w}`,()=>R.classList.remove(w)),!R.classList.contains(w)&&R.classList.add(w)}else if(m==="style"){if(!n)continue;for(const[w,J]of n)c(G,`${o}:${w}`,()=>{R.style.removeProperty(w)}),R.style.setProperty(w,J)}else n!==!1&&n!==null&&(R.getAttribute(m)!==n&&R.setAttribute(m,n===!0?"":String(n)),Q&&c(G,o,()=>R.removeAttribute(m)))}}const F=[],V={bodyClose:void 0,bodyOpen:void 0,head:void 0},W=await Z;
2for(const G of W){const{tag:R,shouldRender:s,id:Q}=G;if(s){if(R.tag==="title"){g.title=R.textContent,c("title","",()=>g.title=B.title);continue}G.$el=G.$el||B.elMap.get(Q),G.$el?i(G):Ld.has(R.tag)&&F.push(G)}}for(const G of F){const R=G.tag.tagPosition||"head";G.$el=g.createElement(G.tag.tag),i(G),V[R]=V[R]||g.createDocumentFragment(),V[R].appendChild(G.$el)}for(const G of W)await C.hooks.callHook("dom:renderTag",G,g,c);V.head&&g.head.appendChild(V.head),V.bodyOpen&&g.body.insertBefore(V.bodyOpen,g.body.firstChild),V.bodyClose&&g.body.appendChild(V.bodyClose);for(const G in B.pendingSideEffects)B.pendingSideEffects[G]();C._dom=B,await C.hooks.callHook("dom:rendered",{renders:W}),l()}).finally(()=>{C._domUpdatePromise=void 0,C.dirty=!1})),C._domUpdatePromise}function Xs(C={}){const I=C.domOptions?.render||eZ;C.document=C.document||(typeof window<"u"?document:void 0);const g=C.document?.head.querySelector('script[id="unhead:payload"]')?.innerHTML||!1;return Fs({...C,plugins:[...C.plugins||[],{key:"client",hooks:{"entries:updated":I}}],init:[g?JSON.parse(g):!1,...C.init||[]]})}function ys(C,I){let g=0;return()=>{const A=++g;I(()=>{g===A&&C()})}}function ts(C={}){const I=Xs({domOptions:{render:ys(()=>eZ(I),g=>setTimeout(g,0))},...C});return I.install=bs(I),I}const Ds={disableDefaults:!0},Ms=WI({name:"nuxt:head",enforce:"pre",setup(C){const I=ts(Ds);C.vueApp.use(I);{let g=!0;const A=async()=>{g=!1,await eZ(I)};I.hooks.hook("dom:beforeRender",d=>{d.shouldRender=!g}),C.hooks.hook("page:start",()=>{g=!0}),C.hooks.hook("page:finish",()=>{C.isHydrating||A()}),C.hooks.hook("app:error",A),C.hooks.hook("app:suspense:resolve",A);const l=I.push.bind(I);I.push=((d,Z)=>{const B=l(d,Z),c=B.dispose.bind(B);return B.dispose=()=>{const i=C["~transitionPromise"];i?i.then(c):c()},B})}}});const YC=typeof document<"u";function Hi(C){return typeof C=="object"||"displayName"in C||"props"in C||"__vccOpts"in C}function Hs(C){return C.__esModule||C[Symbol.toStringTag]==="Module"||C.default&&Hi(C.default)}const ZI=Object.assign;function sd(C,I){const g={};for(const A in I){const l=I[A];g[A]=sg(l)?l.map(C):C(l)}return g}const dA=()=>{},sg=Array.isArray;function b0(C,I){const g={};for(const A in C)g[A]=A in I?I[A]:C[A];return g}let UI=(function(C){return C[C.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",C[C.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",C[C.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",C[C.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",C[C.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",C})({});const ui=Symbol("");UI.MATCHER_NOT_FOUND+"",UI.NAVIGATION_GUARD_REDIRECT+"",UI.NAVIGATION_ABORTED+"",UI.NAVIGATION_CANCELLED+"",UI.NAVIGATION_DUPLICATED+"";function KC(C,I){return ZI(new Error,{type:C,[ui]:!0},I)}function eg(C,I){return C instanceof Error&&ui in C&&(I==null||!!(C.type&I))}const us=["params","query","hash"];function ps(C){if(typeof C=="string")return C;if(C.path!=null)return C.path;const I={};for(const g of us)g in C&&(I[g]=C[g]);return JSON.stringify(I,null,2)}const Ks=Symbol(""),U0=Symbol(""),JZ=Symbol(""),SZ=Symbol(""),jd=Symbol("");function pi(C){return EI(SZ)}const ks={trailing:!0};function Ts(C,I=25,g={}){if(g={...ks,...g},!Number.isFinite(I))throw new TypeError("Expected `wait` to be a finite number");let A,l,d=[],Z,B;const c=(V,W)=>(Z=zs(C,V,W),Z.finally(()=>{if(Z=null,g.trailing&&B&&!l){const G=c(V,B);return B=null,G}}),Z),i=function(...V){return g.trailing&&(B=V),Z||new Promise(W=>{const G=!l&&g.leading;clearTimeout(l),l=setTimeout(()=>{l=null;const R=g.leading?A:c(this,V);B=null;for(const s of d)s(R);d=[]},I),G?(A=c(this,V),W(A)):d.push(W)})},F=V=>{V&&(clearTimeout(V),l=null)};return i.isPending=()=>!!l,i.cancel=()=>{F(l),d=[],B=null},i.flush=()=>
vendor: 22,974 bytes, line 2
2{if(F(l),!B||Z)return;const V=B;return B=null,c(this,V)},i}async function zs(C,I,g){return await C.apply(I,g)}const Ki=/#/g,Ls=/&/g,Es=/\//g,rs=/=/g,js=/\?/g,ki=/\+/g,Os=/%5B/g,vs=/%5D/g,Ti=/%5E/g,xs=/%60/g,zi=/%7B/g,Ps=/%7C/g,Li=/%7D/g,fs=/%20/g;function XZ(C){return C==null?"":encodeURI(""+C).replace(Ps,"|").replace(Os,"[").replace(vs,"]")}function _s(C){return XZ(C).replace(zi,"{").replace(Li,"}").replace(Ti,"^")}function Od(C){return XZ(C).replace(ki,"%2B").replace(fs,"+").replace(Ki,"%23").replace(Ls,"%26").replace(xs,"`").replace(zi,"{").replace(Li,"}").replace(Ti,"^")}function qs(C){return Od(C).replace(rs,"%3D")}function $s(C){return XZ(C).replace(Ki,"%23").replace(js,"%3F")}function Ib(C){return $s(C).replace(Es,"%2F")}function Wl(C){if(C==null)return null;try{return decodeURIComponent(""+C)}catch{}return""+C}const gb=/\/$/,Cb=C=>C.replace(gb,"");function bd(C,I,g="/"){let A,l={},d="",Z="";const B=I.indexOf("#");let c=I.indexOf("?");return c=B>=0&&c>B?-1:c,c>=0&&(A=I.slice(0,c),d=I.slice(c,B>0?B:I.length),l=C(d.slice(1))),B>=0&&(A=A||I.slice(0,B),Z=I.slice(B,I.length)),A=Zb(A??I,g),{fullPath:A+d+Z,path:A,query:l,hash:Wl(Z)}}function Ab(C,I){const g=I.query?C(I.query):"";return I.path+(g&&"?")+g+(I.hash||"")}function o0(C,I){return!I||!C.toLowerCase().startsWith(I.toLowerCase())?C:C.slice(I.length)||"/"}function lb(C,I,g){const A=I.matched.length-1,l=g.matched.length-1;return A>-1&&A===l&&kC(I.matched[A],g.matched[l])&&Ei(I.params,g.params)&&C(I.query)===C(g.query)&&I.hash===g.hash}function kC(C,I){return(C.aliasOf||C)===(I.aliasOf||I)}function Ei(C,I){if(Object.keys(C).length!==Object.keys(I).length)return!1;for(var g in C)if(!db(C[g],I[g]))return!1;return!0}function db(C,I){return sg(C)?m0(C,I):sg(I)?m0(I,C):(C&&C.valueOf())===(I&&I.valueOf())}function m0(C,I){return sg(I)?C.length===I.length&&C.every((g,A)=>g===I[A]):C.length===1&&C[0]===I}function Zb(C,I){if(C.startsWith("/"))return C;if(!C)return I;const g=I.split("/"),A=C.split("/"),l=A[A.length-1];(l===".."||l===".")&&A.push("");let d=g.length-1,Z,B;for(Z=0;Z<A.length;Z++)if(B=A[Z],B!==".")if(B==="..")d>1&&d--;else break;return g.slice(0,d).join("/")+"/"+A.slice(Z).join("/")}const dg={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let vd=(function(C){return C.pop="pop",C.push="push",C})({}),Ud=(function(C){return C.back="back",C.forward="forward",C.unknown="",C})({});function Bb(C){if(!C)if(YC){const I=document.querySelector("base");C=I&&I.getAttribute("href")||"/",C=C.replace(/^\w+:\/\/[^/]+/,"")}else C="/";return C[0]!=="/"&&C[0]!=="#"&&(C="/"+C),Cb(C)}const cb=/^[^#]+#/;function ib(C,I){return C.replace(cb,"#")+I}function Fb(C,I){const g=document.documentElement.getBoundingClientRect(),A=C.getBoundingClientRect();return{behavior:I.behavior,left:A.left-g.left-(I.left||0),top:A.top-g.top-(I.top||0)}}const Tl=()=>({left:window.scrollX,top:window.scrollY});function Vb(C){let I;if("el"in C){const g=C.el,A=typeof g=="string"&&g.startsWith("#"),l=typeof g=="string"?A?document.getElementById(g.slice(1)):document.querySelector(g):g;if(!l)return;I=Fb(l,C)}else I=C;"scrollBehavior"in document.documentElement.style?window.scrollTo(I):window.scrollTo(I.left!=null?I.left:window.scrollX,I.top!=null?I.top:window.scrollY)}function n0(C,I){return(history.state?history.state.position-I:-1)+C}const xd=new Map;function Gb(C,I){xd.set(C,I)}function Wb(C){const I=xd.get(C);return xd.delete(C),I}function Rb(C){return typeof C=="string"||C&&typeof C=="object"}function ri(C){return typeof C=="string"||typeof C=="symbol"}function sb(C){const I={};if(C===""||C==="?")return I;const g=(C[0]==="?"?C.slice(1):C).split("&");for(let A=0;A<g.length;++A){const l=g[A].replace(ki," "),d=l.indexOf("="),Z=Wl(d<0?l:l.slice(0,d)),B=d<0?null:Wl(l.slice(d+1));if(Z in I){let c=I[Z];sg(c)||(c=I[Z]=[c]),c.push(B)}else I[Z]=B}return I}function Q0(C){let I="";for(let g in C){const A=C[g];if(g=qs(g),A==null){A!==void 0&&(I+=(I.length?"&":"")+g);continue}(sg(A)?A.map(l=>l&&Od(l)):[A&&Od(A)]).forEach(l=>{l!==void 0&&(I+=(I.length?"&":"")+g,l!=null&&(I+="="+l))})}return I}function bb(C){const I={};for(const g in C){const A=C[g];A!==void 0&&(I[g]=sg(A)?A.map(l=>l==null?null:""+l):A==null?A:""+A)}return I}function qC(){let C=[];function I(A){return C.push(A),()=>{const l=C.indexOf(A);l>-1&&C.splice(l,1)}}function g(){C=[]}return{add:I,list:()=>C.slice(),reset:g}}function Tg(C,I,g,A,l,d=Z=>Z()){const Z=A&&(A.enterCallbacks[l]=A.enterCallbacks[l]||[]);return()=>new Promise((B,c)=>{const i=W=>{W===!1?c(KC(UI.NAVIGATION_ABORTED,{from:g,to:I})):W instanceof Error?c(W):Rb(W)?c(KC(UI.NAVIGATION_GUARD_REDIRECT,{from:I,to:W})):(Z&&A.enterCallbacks[l]===Z&&typeof W=="function"&&Z.push(W),B())},F=d(()=>C.call(A&&A.instances[l],I,g,i));let V=Promise.resolve(F);C.length<3&&(V=V.then(i)),V.catch(W=>c(W))})}function od(C,I,g,A,l=d=>d()){const d=[];for(const Z of C)for(const B in Z.components){let c=Z.components[B];if(!(I!=="beforeRouteEnter"&&!Z.instances[B]))if(Hi(c)){const i=(c.__vccOpts||c)[I];i&&d.push(Tg(i,g,A,Z,B,l))}else{let i=c();d.push(()=>i.then(F=>{if(!F)throw new Error(`Couldn't resolve component "${B}" at "${Z.path}"`);const V=Hs(F)?F.default:F;Z.mods[B]=F,Z.components[B]=V;const W=(V.__vccOpts||V)[I];return W&&Tg(W,g,A,Z,B,l)()}))}}return d}function Ub(C,I){const g=[],A=[],l=[],d=Math.max(I.matched.length,C.matched.length);for(let Z=0;Z<d;Z++){const B=I.matched[Z];B&&(C.matched.find(i=>kC(i,B))?A.push(B):g.push(B));const c=C.matched[Z];c&&(I.matched.find(i=>kC(i,c))||l.push(c))}return[g,A,l]}let ob=()=>location.protocol+"//"+location.host;function ji(C,I){const{pathname:g,search:A,hash:l}=I,d=C.indexOf("#");if(d>-1){let Z=l.includes(C.slice(d))?C.slice(d).length:1,B=l.slice(Z);return B[0]!=="/"&&(B="/"+B),o0(B,"")}return o0(g,C)+A+l}function mb(C,I,g,A){let l=[],d=[],Z=null;const B=({state:W})=>{const G=ji(C,location),R=g.value,s=I.value;let Q=0;if(W){if(g.value=G,I.value=W,Z&&Z===R){Z=null;return}Q=s?W.position-s.position:0}else A(G);l.forEach(m=>{m(g.value,R,{delta:Q,type:vd.pop,direction:Q?Q>0?Ud.forward:Ud.back:Ud.unknown})})};function c(){Z=g.value}function i(W){l.push(W);const G=()=>{const R=l.indexOf(W);R>-1&&l.splice(R,1)};return d.push(G),G}function F(){if(document.visibilityState==="hidden"){const{history:W}=window;if(!W.state)return;W.replaceState(ZI({},W.state,{scroll:Tl()}),"")}}function V(){for(const W of d)W();d=[],window.removeEventListener("popstate",B),window.removeEventListener("pagehide",F),document.removeEventListener("visibilitychange",F)}return window.addEventListener("popstate",B),window.addEventListener("pagehide",F),document.addEventListener("visibilitychange",F),{pauseListeners:c,listen:i,destroy:V}}function a0(C,I,g,A=!1,l=!1){return{back:C,current:I,forward:g,replaced:A,position:window.history.length,scroll:l?Tl():null}}function nb(C){const{history:I,location:g}=window,A={value:ji(C,g)},l={value:I.state};l.value||d(A.value,{back:null,current:A.value,forward:null,position:I.length-1,replaced:!0,scroll:null},!0);function d(c,i,F){const V=C.indexOf("#"),W=V>-1?(g.host&&document.querySelector("base")?C:C.slice(V))+c:ob()+C+c;try{I[F?"replaceState":"pushState"](i,"",W),l.value=i}catch{g[F?"replace":"assign"](W)}}function Z(c,i){d(c,ZI({},I.state,a0(l.value.back,c,l.value.forward,!0),i,{position:l.value.position}),!0),A.value=c}function B(c,i){const F=ZI({},l.value,I.state,{forward:c,scroll:Tl()});d(F.current,F,!0),d(c,ZI({},a0(A.value,c,null),{position:F.position+1},i),!1),A.value=c}return{location:A,state:l,push:B,replace:Z}}function Qb(C){C=Bb(C);const I=nb(C),g=mb(C,I.state,I.location,I.replace);function A(d,Z=!0){Z||g.pauseListeners(),history.go(d)}const l=ZI({location:"",base:C,go:A,createHref:ib.bind(null,C)},I,g);return Object.defineProperty(l,"location",{enumerable:!0,get:()=>I.location.value}),Object.defineProperty(l,"state",{enumerable:!0,get:()=>I.state.value}),l}let cC=(function(C){return C[C.Static=0]="Static",C[C.Param=1]="Param",C[C.Group=2]="Group",C})({});var YI=(function(C){return C[C.Static=0]="Static",C[C.Param=1]="Param",C[C.ParamRegExp=2]="ParamRegExp",C[C.ParamRegExpEnd=3]="ParamRegExpEnd",C[C.EscapeNext=4]="EscapeNext",C})(YI||{});const ab={type:cC.Static,value:""},Nb=/[a-zA-Z0-9_]/;function Yb(C){if(!C)return[[]];if(C==="/")return[[ab]];if(!C.startsWith("/"))throw new Error(`Invalid path "${C}"`);function I(G){throw new Error(`ERR (${g})/"${i}": ${G}`)}let g=YI.Static,A=g;const l=[];let d;function Z(){d&&l.push(d),d=[]}let B=0,c,i="",F="";function V(){i&&(g===YI.Static?d.push({type:cC.Static,value:i}):g===YI.Param||g===YI.ParamRegExp||g===YI.ParamRegExpEnd?(d.length>1&&(c==="*"||c==="+")&&I(`A repeatable param (${i}) must be alone in its segment. eg: '/:ids+.`),d.push({type:cC.Param,value:i,regexp:F,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):I("Invalid state to consume buffer"),i="")}function W(){i+=c}for(;B<C.length;){if(c=C[B++],c==="\\"&&g!==YI.ParamRegExp){A=g,g=YI.EscapeNext;continue}switch(g){case YI.Static:c==="/"?(i&&V(),Z()):c===":"?(V(),g=YI.Param):W();break;case YI.EscapeNext:W(),g=A;break;case YI.Param:c==="("?g=YI.ParamRegExp:Nb.test(c)?W():(V(),g=YI.Static,c!=="*"&&c!=="?"&&c!=="+"&&B--);break;case YI.ParamRegExp:c===")"?F[F.length-1]=="\\"?F=F.slice(0,-1)+c:g=YI.ParamRegExpEnd:F+=c;break;case YI.ParamRegExpEnd:V(),g=YI.Static,c!=="*"&&c!=="?"&&c!=="+"&&B--,F="";break;default:I("Unknown state");break}}return g===YI.ParamRegExp&&I(`Unfinished custom RegExp for param "${i}"`),V(),Z(),l}const N0="[^/]+?",wb={sensitive:!1,strict:!1,start:!0,end:!0};var KI=(function(C){return C[C._multiplier=10]="_multiplier",C[C.Root=90]="Root",C[C.Segment=40]="Segment",C[C.SubSegment=30]="SubSegment",C[C.Static=40]="Static",C[C.Dynamic=20]="Dynamic",C[C.BonusCustomRegExp=10]="BonusCustomRegExp",C[C.BonusWildcard=-50]="BonusWildcard",C[C.BonusRepeatable=-20]="BonusRepeatable",C[C.BonusOptional=-8]="BonusOptional",C[C.BonusStrict=.7000000000000001]="BonusStrict",C[C.BonusCaseSensitive=.25]="BonusCaseSensitive",C})(KI||{});const hb=/[.+*?^${}()[\]/\\]/g;function eb(C,I){const g=ZI({},wb,I),A=[];let l=g.start?"^":"";const d=[];for(const i of C){const F=i.length?[]:[KI.Root];g.strict&&!i.length&&(l+="/");for(let V=0;V<i.length;V++){const W=i[V];let G=KI.Segment+(g.sensitive?KI.BonusCaseSensitive:0);if(W.type===cC.Static)V||(l+="/"),l+=W.value.replace(hb,"\\$&"),G+=KI.Static;else if(W.type===cC.Param){const{value:R,repeatable:s,optional:Q,regexp:m}=W;d.push({name:R,repeatable:s,optional:Q});const n=m||N0;if(n!==N0){G+=KI.BonusCustomRegExp;try{new RegExp(`(${n})`)}catch(w){throw new Error(`Invalid custom RegExp for param "${R}" (${n}): `+w.message)}}let o=s?`((?:${n})(?:/(?:${n}))*)`:`(${n})`;V||(o=Q&&i.length<2?`(?:/${o})`:"/"+o),Q&&(o+="?"),l+=o,G+=KI.Dynamic,Q&&(G+=KI.BonusOptional),s&&(G+=KI.BonusRepeatable),n===".*"&&(G+=KI.BonusWildcard)}F.push(G)}A.push(F)}if(g.strict&&g.end){const i=A.length-1;A[i][A[i].length-1]+=KI.BonusStrict}g.strict||(l+="/?"),g.end?l+="$":g.strict&&!l.endsWith("/")&&(l+="(?:/|$)");const Z=new RegExp(l,g.sensitive?"":"i");function B(i){const F=i.match(Z),V={};if(!F)return null;for(let W=1;W<F.length;W++){const G=F[W]||"",R=d[W-1];V[R.name]=G&&R.repeatable?G.split("/"):G}return V}function c(i){let F="",V=!1;for(const W of C){(!V||!F.endsWith("/"))&&(F+="/"),V=!1;for(const G of W)if(G.type===cC.Static)F+=G.value;else if(G.type===cC.Param){const{value:R,repeatable:s,optional:Q}=G,m=R in i?i[R]:"";if(sg(m)&&!s)throw new Error(`Provided param "${R}" is an array but it is not repeatable (* or + modifiers)`);const n=sg(m)?m.join("/"):m;if(!n)if(Q)W.length<2&&(F.endsWith("/")?F=F.slice(0,-1):V=!0);else throw new Error(`Missing required param "${R}"`);F+=n}}return F||"/"}return{re:Z,score:A,keys:d,parse:B,stringify:c}}function Jb(C,I){let g=0;for(;g<C.length&&g<I.length;){const A=I[g]-C[g];if(A)return A;g++}return C.length<I.length?C.length===1&&C[0]===KI.Static+KI.Segment?-1:1:C.length>I.length?I.length===1&&I[0]===KI.Static+KI.Segment?1:-1:0}function Oi(C,I){let g=0;const A=C.score,l=I.score;for(;g<A.length&&g<l.length;){const d=Jb(A[g],l[g]);if(d)return d;g++}if(Math.abs(l.length-A.length)===1){if(Y0(A))return 1;if(Y0(l))return-1}return l.length-A.length}function Y0(C){const I=C[C.length-1];return C.length>0&&I[I.length-1]<0}const Sb={strict:!1,end:!0,sensitive:!1};function Xb(C,I,g){const A=eb(Yb(C.path),g),l=ZI(A,{record:C,parent:I,children:[],alias:[]});return I&&!l.record.aliasOf==!I.record.aliasOf&&I.children.push(l),l}function yb(C,I){const g=[],A=new Map;I=b0(Sb,I);function l(V){return A.get(V)}function d(V,W,G){const R=!G,s=h0(V);s.aliasOf=G&&G.record;const Q=b0(I,V),m=[s];if("alias"in V){const w=typeof V.alias=="string"?[V.alias]:V.alias;for(const J of w)m.push(h0(ZI({},s,{components:G?G.record.components:s.components,path:J,aliasOf:G?G.record:s})))}let n,o;for(const w of m){const{path:J}=w;if(W&&J[0]!=="/"){const K=W.record.path,t=K[K.length-1]==="/"?"":"/";w.path=W.record.path+(J&&t+J)}if(n=Xb(w,W,Q),G?G.alias.push(n):(o=o||n,o!==n&&o.alias.push(n),R&&V.name&&!e0(n)&&Z(V.name)),vi(n)&&c(n),s.children){const K=s.children;for(let t=0;t<K.length;t++)d(K[t],n,G&&G.children[t])}G=G||n}return o?()=>{Z(o)}:dA}function Z(V){if(ri(V)){const W=A.get(V);W&&(A.delete(V),g.splice(g.indexOf(W),1),W.children.forEach(Z),W.alias.forEach(Z))}else{const W=g.indexOf(V);W>-1&&(g.splice(W,1),V.record.name&&A.delete(V.record.name),V.children.forEach(Z),V.alias.forEach(Z))}}function B(){return g}function c(V){const W=Mb(V,g);g.splice(W,0,V),V.record.name&&!e0(V)&&A.set(V.record.name,V)}function i(V,W){let G,R={},s,Q;if("name"in V&&V.name){if(G=A.get(V.name),!G)throw KC(UI.MATCHER_NOT_FOUND,{location:V});Q=G.record.name,R=ZI(w0(W.params,G.keys.filter(o=>!o.optional).concat(G.parent?G.parent.keys.filter(o=>o.optional):[]).map(o=>o.name)),V.params&&w0(V.params,G.keys.map(o=>o.name))),s=G.stringify(R)}else if(V.path!=null)s=V.path,G=g.find(o=>o.re.test(s)),G&&(R=G.parse(s),Q=G.record.name);else{if(G=W.name?A.get(W.name):g.find(o=>o.re.test(W.path)),!G)throw KC(UI.MATCHER_NOT_FOUND,{location:V,currentLocation:W});Q=G.record.name,R=ZI({},W.params,V.params),s=G.stringify(R)}const m=[];let n=G;for(;n;)m.unshift(n.record),n=n.parent;return{name:Q,path:s,params:R,matched:m,meta:Db(m)}}C.forEach(V=>d(V));function F(){g.length=0,A.clear()}return{addRoute:d,resolve:i,removeRoute:Z,clearRoutes:F,getRoutes:B,getRecordMatcher:l}}function w0(C,I){const g={};for(const A of I)A in C&&(g[A]=C[A]);return g}function h0(C){const I={path:C.path,redirect:C.redirect,name:C.name,meta:C.meta||{},aliasOf:C.aliasOf,beforeEnter:C.beforeEnter,props:tb(C),children:C.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in C?C.components||null:C.component&&{default:C.component}};return Object.defineProperty(I,"mods",{value:{}}),I}function tb(C){const I={},g=C.props||!1;if("component"in C)I.default=g;else for(const A in C.components)I[A]=typeof g=="object"?g[A]:g;return I}function e0(C){for(;C;){if(C.record.aliasOf)return!0;C=C.parent}return!1}function Db(C){return C.reduce((I,g)=>ZI(I,g.meta),{})}function Mb(C,I){let g=0,A=I.length;for(;g!==A;){const d=g+A>>1;Oi(C,I[d])<0?A=d:g=d+1}const l=Hb(C);return l&&(A=I.lastIndexOf(l,A-1)),A}function Hb(C){let I=C;for(;I=I.parent;)if(vi(I)&&Oi(C,I)===0)return I}function vi({record:C}){return!!(C.name||C.components&&Object.keys(C.components).length||C.redirect)}function J0(C){const I=EI(JZ),g=EI(SZ),A=v(()=>{const c=j(C.to);return I.resolve(c)}),l=v(()=>{const{matched:c}=A.value,{length:i}=c,F=c[i-1],V=g.matched;if(!F||!V.length)return-1;const W=V.findIndex(kC.bind(null,F));if(W>-1)return W;const G=S0(c[i-2]);return i>1&&S0(F)===G&&V[V.length-1].path!==G?V.findIndex(kC.bind(null,c[i-2])):W}),d=v(()=>l.value>-1&&Tb(g.params,A.value.params)),Z=v(()=>l.value>-1&&l.value===g.matched.length-1&&Ei(g.params,A.value.params));function B(c={}){if(kb(c)){const i=I[j(C.replace)?"replace":"push"](j(C.to)).catch(dA);return C.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>i),i}return Promise.resolve()}return{route:A,href:v(()=>A.value.href),isActive:d,isExactActive:Z,navigate:B}}function ub(C){return C.length===1?C[0]:C}const pb=Bg({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:J0,setup(C,{slots:I}){const g=Mg(J0(C)),{options:A}=EI(JZ),l=v(()=>({[X0(C.activeClass,A.linkActiveClass,"router-link-active")]:g.isActive,[X0(C.exactActiveClass,A.linkExactActiveClass,"router-link-exact-active")]:g.isExactActive}));return()=>{const d=I.default&&ub(I.default(g));return C.custom?d:sI("a",{"aria-current":g.isExactActive?C.ariaCurrentValue:null,href:g.href,onClick:g.navigate,class:l.value},d)}}}),Kb=pb;function kb(C){if(!(C.metaKey||C.altKey||C.ctrlKey||C.shiftKey)&&!C.defaultPrevented&&!(C.button!==void 0&&C.button!==0)){if(C.currentTarget&&C.currentTarget.getAttribute){const I=C.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(I))return}return C.preventDefault&&C.preventDefault(),!0}}function Tb(C,I){for(const g in I){const A=I[g],l=C[g];if(typeof A=="string"){if(A!==l)return!1}else if(!sg(l)||l.length!==A.length||A.some((d,Z)=>d.valueOf()!==l[Z].valueOf()))return!1}return!0}function S0(C){return C?C.aliasOf?C.aliasOf.path:C.path:""}const X0=(C,I,g)=>C??I??g,zb=Bg({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(C,{attrs:I,slots:g}){const A=EI(jd),l=v(()=>C.route||A.value),d=EI(U0,0),Z=v(()=>{let i=j(d);const{matched:F}=l.value;let V;for(;(V=F[i])&&!V.components;)i++;return i}),B=v(()=>l.value.matched[Z.value]);jg(U0,v(()=>Z.value+1)),jg(Ks,B),jg(jd,l);const c=f();return $I(()=>[c.value,B.value,C.name],([i,F,V],[W,G,R])=>{F&&(F.instances[V]=i,G&&G!==F&&i&&i===W&&(F.leaveGuards.size||(F.leaveGuards=G.leaveGuards),F.updateGuards.size||(F.updateGuards=G.updateGuards))),i&&F&&(!G||!kC(F,G)||!W)&&(F.enterCallbacks[V]||[]).forEach(s=>s(i))},{flush:"post"}),()=>{const i=l.value,F=C.name,V=B.value,W=V&&V.components[F];if(!W)return y0(g.default,{Component:W,route:i});const G=V.props[F],R=G?G===!0?i.params:typeof G=="function"?G(i):G:null,Q=sI(W,ZI({},R,I,{onVnodeUnmounted:m=>{m.component.isUnmounted&&(V.instances[F]=null)},ref:c}));return y0(g.default,{Component:Q,route:i})||Q}}});function y0(C,I){if(!C)return null;const g=C(I);return g.length===1?g[0]:g}const xi=zb;function Lb(C){const I=yb(C.routes,C),g=C.parseQuery||sb,A=C.stringifyQuery||Q0,l=C.history,d=qC(),Z=qC(),B=qC(),c=OI(dg);let i=dg;YC&&C.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const F=sd.bind(null,N=>""+N),V=sd.bind(null,Ib),W=sd.bind(null,Wl);function G(N,p){let M,L;return ri(N)?(M=I.getRecordMatcher(N),L=p):L=N,I.addRoute(L,M)}function R(N){const p=I.getRecordMatcher(N);p&&I.removeRoute(p)}function s(){return I.getRoutes().map(N=>N.record)}function Q(N){return!!I.getRecordMatcher(N)}function m(N,p){if(p=ZI({},p||c.value),typeof N=="string"){const O=bd(g,N,p.path),oI=I.resolve({path:O.path},p),mg=l.createHref(O.fullPath);return ZI(O,oI,{params:W(oI.params),redirectedFrom:void 0,href:mg})}let M;if(N.path!=null)M=ZI({},N,{path:bd(g,N.path,p.path).path});else{const O=ZI({},N.params);for(const oI in O)O[oI]==null&&delete O[oI];M=ZI({},N,{params:V(O)}),p.params=V(p.params)}const L=I.resolve(M,p),q=N.hash||"";L.params=F(W(L.params));const RI=Ab(A,ZI({},N,{hash:_s(q),path:L.path})),_=l.createHref(RI);return ZI({fullPath:RI,hash:q,query:A===Q0?bb(N.query):N.query||{}},L,{redirectedFrom:void 0,href:_})}function n(N){return typeof N=="string"?bd(g,N,c.value.path):ZI({},N)}function o(N,p){if(i!==N)return KC(UI.NAVIGATION_CANCELLED,{from:p,to:N})}function w(N){return t(N)}function J(N){return w(ZI(n(N),{replace:!0}))}function K(N,p){const M=N.matched[N.matched.length-1];if(M&&M.redirect){const{redirect:L}=M;let q=typeof L=="function"?L(N,p):L;return typeof q=="string"&&(q=q.includes("?")||q.includes("#")?q=n(q):{path:q},q.params={}),ZI({query:N.query,hash:N.hash,params:q.path!=null?{}:N.params},q)}}function t(N,p){const M=i=m(N),L=c.value,q=N.state,RI=N.force,_=N.replace===!0,O=K(M,L);if(O)return t(ZI(n(O),{state:typeof O=="object"?ZI({},q,O.state):q,force:RI,replace:_}),p||M);const oI=M;oI.redirectedFrom=p;let mg;return!RI&&lb(A,L,M)&&(mg=KC(UI.NAVIGATION_DUPLICATED,{to:oI,from:L}),CC(L,L,!0,!1)),(mg?Promise.resolve(mg):r(oI,L)).catch(JI=>eg(JI)?eg(JI,UI.NAVIGATION_GUARD_REDIRECT)?JI:Ag(JI):mC(JI,oI,L)).then(JI=>{if(JI){if(eg(JI,UI.NAVIGATION_GUARD_REDIRECT))return t(ZI({replace:_},n(JI.to),{state:typeof JI.to=="object"?ZI({},q,JI.to.state):q,force:RI}),p||oI)}else JI=PI(oI,L,!0,_,q);return AI(oI,L,JI),JI})}function u(N,p){const M=o(N,p);return M?Promise.reject(M):Promise.resolve()}function E(N){const p=_I.values().next().value;return p&&typeof p.runWithContext=="function"?p.runWithContext(N):N()}function r(N,p){let M;const[L,q,RI]=Ub(N,p);M=od(L.reverse(),"beforeRouteLeave",N,p);for(const O of L)O.leaveGuards.forEach(oI=>{M.push(Tg(oI,N,p))});const _=u.bind(null,N,p);return M.push(_),eI(M).then(()=>{M=[];for(const O of d.list())M.push(Tg(O,N,p));return M.push(_),eI(M)}).then(()=>{M=od(q,"beforeRouteUpdate",N,p);for(const O of q)O.updateGuards.forEach(oI=>{M.push(Tg(oI,N,p))});return M.push(_),eI(M)}).then(()=>{M=[];for(const O of RI)if(O.beforeEnter)if(sg(O.beforeEnter))for(const oI of O.beforeEnter)M.push(Tg(oI,N,p));else M.push(Tg(O.beforeEnter,N,p));return M.push(_),eI(M)}).then(()=>(N.matched.forEach(O=>O.enterCallbacks={}),M=od(RI,"beforeRouteEnter",N,p,E),M.push(_),eI(M))).then(()=>{M=[];for(const O of Z.list())M.push(Tg(O,N,p));return M.push(_),eI(M)}).catch(O=>eg(O,UI.NAVIGATION_CANCELLED)?O:Promise.reject(O))}function AI(N,p,M){B.list().forEach(L=>E(()=>L(N,p,M)))}function PI(N,p,M,L,q){const RI=o(N,p);if(RI)return RI;const _=p===dg,O=YC?history.state:{};M&&(L||_?l.replace(N.fullPath,ZI({scroll:_&&O&&O.scroll},q)):l.push(N.fullPath,q)),c.value=N,CC(N,p,M,_),Ag()}let fI;function Hg(){fI||(fI=l.listen((N,p,M)=>{if(!ig.listening)return;const L=m(N),q=K(L,ig.currentRoute.value);if(q){t(ZI(q,{replace:!0,force:!0}),L).catch(dA);return}i=L;const RI=c.value;YC&&Gb(n0(RI.fullPath,M.delta),Tl()),r(L,RI).catch(_=>eg(_,UI.NAVIGATION_ABORTED|UI.NAVIGATION_CANCELLED)?_:eg(_,UI.NAVIGATION_GUARD_REDIRECT)?(t(ZI(n(_.to),{force:!0}),L).then(O=>{eg(O,UI.NAVIGATION_ABORTED|UI.NAVIGATION_DUPLICATED)&&!M.delta&&M.type===vd.pop&&l.go(-1,!1)}).catch(dA),Promise.reject()):(M.delta&&l.go(-M.delta,!1),mC(_,L,RI))).then(_=>{_=_||PI(L,RI,!1),_&&(M.delta&&!eg(_,UI.NAVIGATION_CANCELLED)?l.go(-M.delta,!1):M.type===vd.pop&&eg(_,UI.NAVIGATION_ABORTED|UI.NAVIGATION_DUPLICATED)&&l.go(-1,!1)),AI(L,RI,_)}).catch(dA)}))}let Cg=qC(),cg=qC(),QI;function mC(N,p,M){Ag(N);const L=cg.list();
2return L.length&&L.forEach(q=>q(N,p,M)),Promise.reject(N)}function eA(){return QI&&c.value!==dg?Promise.resolve():new Promise((N,p)=>{Cg.add([N,p])})}function Ag(N){return QI||(QI=!N,Hg(),Cg.list().forEach(([p,M])=>N?M(N):p()),Cg.reset()),N}function CC(N,p,M,L){const{scrollBehavior:q}=C;if(!YC||!q)return Promise.resolve();const RI=!M&&Wb(n0(N.fullPath,0))||(L||!M)&&history.state&&history.state.scroll||null;return Rg().then(()=>q(N,p,RI)).then(_=>_&&Vb(_)).catch(_=>mC(_,N,p))}const nC=N=>l.go(N);let xC;const _I=new Set,ig={currentRoute:c,listening:!0,addRoute:G,removeRoute:R,clearRoutes:I.clearRoutes,hasRoute:Q,getRoutes:s,resolve:m,options:C,push:w,replace:J,go:nC,back:()=>nC(-1),forward:()=>nC(1),beforeEach:d.add,beforeResolve:Z.add,afterEach:B.add,onError:cg.add,isReady:eA,install(N){N.component("RouterLink",Kb),N.component("RouterView",xi),N.config.globalProperties.$router=ig,Object.defineProperty(N.config.globalProperties,"$route",{enumerable:!0,get:()=>j(c)}),YC&&!xC&&c.value===dg&&(xC=!0,w(l.location).catch(L=>{}));const p={};for(const L in dg)Object.defineProperty(p,L,{get:()=>c.value[L],enumerable:!0});N.provide(JZ,ig),N.provide(SZ,Qg(p)),N.provide(jd,c);const M=N.unmount;_I.add(N),N.unmount=function(){_I.delete(N),_I.size<1&&(i=dg,fI&&fI(),fI=null,c.value=dg,xC=!1,QI=!1),M()}}};function eI(N){return N.reduce((p,M)=>p.then(()=>E(M)),Promise.resolve())}return ig}const Eb=/(:\w+)\([^)]+\)/g,rb=/(:\w+)[?+*]/g,jb=/:\w+/g,Ob=(C,I)=>I.path.replace(Eb,"$1").replace(rb,"$1").replace(jb,g=>C.params[g.slice(1)]?.toString()||""),Pd=(C,I)=>{const g=C.route.matched.find(l=>l.components?.default===C.Component.type),A=I??g?.meta.key??(g&&Ob(C.route,g));return typeof A=="function"?A(C.route):A},vb=(C,I)=>({default:()=>C?sI(EG,C===!0?{}:C,I):I});function Pi(C){return Array.isArray(C)?C:[C]}const xb="modulepreload",Pb=function(C,I){return new URL(C,I).href},t0={},h=function(I,g,A){let l=Promise.resolve();if(g&&g.length>0){let i=function(F){return Promise.all(F.map(V=>Promise.resolve(V).then(W=>({status:"fulfilled",value:W}),W=>({status:"rejected",reason:W}))))};const Z=document.getElementsByTagName("link"),B=document.querySelector("meta[property=csp-nonce]"),c=B?.nonce||B?.getAttribute("nonce");l=i(g.map(F=>{if(F=Pb(F,A),F in t0)return;t0[F]=!0;const V=F.endsWith(".css"),W=V?'[rel="stylesheet"]':"";if(A)for(let R=Z.length-1;R>=0;R--){const s=Z[R];if(s.href===F&&(!V||s.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${F}"]${W}`))return;const G=document.createElement("link");if(G.rel=V?"stylesheet":xb,V||(G.as="script"),G.crossOrigin="",G.href=F,c&&G.setAttribute("nonce",c),document.head.appendChild(G),V)return new Promise((R,s)=>{G.addEventListener("load",R),G.addEventListener("error",()=>s(new Error(`Unable to preload CSS for ${F}`)))})}))}function d(Z){const B=new Event("vite:preloadError",{cancelable:!0});if(B.payload=Z,window.dispatchEvent(B),!B.defaultPrevented)throw Z}return l.then(Z=>{for(const B of Z||[])B.status==="rejected"&&d(B.reason);return I().catch(d)})},fb={auth:{unauthenticatedOnly:!0,navigateAuthenticatedTo:"/"}},_b={layout:"dashboard",auth:!0},md=[{name:"auth-callback",path:"/auth/callback",component:()=>h(()=>import("./CDfqlCKm.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url)},{name:"auth-error",path:"/auth/error",meta:fb||{},component:()=>h(()=>import("./CA4IE3VV.js"),__vite__mapDeps([5,1,2]),import.meta.url)},{name:"auth-signIn",path:"/auth/signIn",component:()=>h(()=>import("./Bt9NiotI.js"),__vite__mapDeps([6,7,3,1,2,8]),import.meta.url)},{name:"auth-signOut",path:"/auth/signOut",component:()=>h(()=>import("./p-qy6HvQ.js"),__vite__mapDeps([9,1,2,3,10]),import.meta.url)}
2,{name:"detail-slug",path:"/detail/:slug(.*)*",component:()=>h(()=>import("./7Mcj1yY_.js"),__vite__mapDeps([11,1,2]),import.meta.url)},{name:"dashboard",path:"/dashboard",meta:{..._b||{},middleware:["auth"]},component:()=>h(()=>import("./BghTxU_u.js"),__vite__mapDeps([12,1,2]),import.meta.url)},{name:"login",path:"/login",component:()=>h(()=>import("./DydsLA_J.js"),__vite__mapDeps([13,7,3,1,2]),import.meta.url)},{name:"slug",path:"/:slug(.*)*",component:()=>h(()=>import("./CERA6lJa.js"),__vite__mapDeps([14,15,1,2,16]),import.meta.url)}],fi=(C,I)=>({default:()=>C?sI(jG,C===!0?{}:C,I):I.default?.()}),qb=/(:\w+)\([^)]+\)/g,$b=/(:\w+)[?+*]/g,IU=/:\w+/g;function D0(C){const I=C?.meta.key??C.path.replace(qb,"$1").replace($b,"$1").replace(IU,g=>C.params[g.slice(1)]?.toString()||"");return typeof I=="function"?I(C):I}function gU(C,I){return C===I||I===dg?!1:D0(C)!==D0(I)?!0:!C.matched.every((A,l)=>A.components&&A.components.default===I.matched[l]?.components?.default)}function CU(C,I=!1){if(C){if(C.nodeName==="#comment"&&C.nodeValue==="[")return _i(C,[],I);if(I){const g=C.cloneNode(!0);return g.querySelectorAll("[data-island-slot]").forEach(A=>{A.innerHTML=""}),[g.outerHTML]}return[C.outerHTML]}}function _i(C,I=[],g=!1){if(C&&C.nodeName){if(dU(C))return I;if(!lU(C)){const A=C.cloneNode(!0);g&&A.querySelectorAll?.("[data-island-slot]").forEach(l=>{l.innerHTML=""}),I.push(A.outerHTML)}_i(C.nextSibling,I,g)}return I}function AU(C,I){const g=C?CU(C):[I];return g?rG(g.join(""),g.length):sI("div")}function lU(C){return C.nodeName==="#comment"&&C.nodeValue==="["}function dU(C){return C.nodeName==="#comment"&&C.nodeValue==="]"}function M0(C){return Array.isArray(C)?C:[C]}function qi(C){const I=[];for(const g of C)g&&I.push({...g,onAfterLeave:g.onAfterLeave?M0(g.onAfterLeave):void 0,onBeforeLeave:g.onBeforeLeave?M0(g.onBeforeLeave):void 0});return aZ(...I)}const ZU={scrollBehavior(C,I,g){const A=CI(),l=HI().options?.scrollBehaviorType??"auto";return C.path.replace(/\/$/,"")===I.path.replace(/\/$/,"")?I.hash&&!C.hash?{left:0,top:0}:C.hash?{el:C.hash,top:$i(C.hash),behavior:l}:!1:(typeof C.meta.scrollToTop=="function"?C.meta.scrollToTop(C,I):C.meta.scrollToTop)===!1?!1:I===dg?H0(C,I,g,l):new Promise(Z=>{const B=()=>{requestAnimationFrame(()=>Z(H0(C,I,g,l)))};A.hooks.hookOnce("page:loading:end",()=>{const c=A["~transitionPromise"];c?c.then(B):B()})})}};function $i(C){try{const I=document.querySelector(C);if(I)return(Number.parseFloat(getComputedStyle(I).scrollMarginTop)||0)+(Number.parseFloat(getComputedStyle(document.documentElement).scrollPaddingTop)||0)}catch{}return 0}function H0(C,I,g,A){return g||(C.hash?{el:C.hash,top:$i(C.hash),behavior:gU(C,I)?A:"instant"}:{left:0,top:0})}const BU={hashMode:!1,scrollBehaviorType:"auto"},pg={...BU,...ZU},cU=async(C,I)=>{let g,A;if(!C.meta?.validate)return;const l=([g,A]=Og(()=>Promise.resolve(C.meta.validate(C))),g=await g,A(),g);if(l===!0)return;const d=tg({fatal:!0,status:l&&(l.status||l.statusCode)||404,statusText:l&&(l.statusText||l.statusMessage)||`Page Not Found: ${C.fullPath}`,data:{path:C.fullPath}});return typeof window<"u"&&window.history.pushState({},"",I.fullPath),d},iU=C=>{if(C.path.toLowerCase().replace(/\/+$/,"")==="/menu/qr")return qA("/menu/food");if(C.params.slug&&C.params.slug.length==2&&C.params.slug[1]=="")return qA("/news/"+C.params.slug[0]);if(C.fullPath.includes("/api/auth/signin?error=Callback"))return qA("/")},FU=C=>{const I=kl({path:C.path});if(I.redirect){const g=I.redirect.includes("#")?I.redirect:I.redirect+C.hash;return Ug(g,{acceptRelative:!0})?(window.location.href=g,!1):g}},VU=[cU,iU,FU],fd={auth:()=>h(()=>import("./BnNML0th.js"),__vite__mapDeps([17,1,2]),import.meta.url)};function GU(C,I,g){const{pathname:A,search:l,hash:d}=I,Z=C.indexOf("#");if(Z>-1){const i=d.includes(C.slice(Z))?C.slice(Z).length:1;let F=d.slice(i);return F[0]!=="/"&&(F="/"+F),fB(F,"")}const B=fB(A,C),c=!g||gi(B,g)?B:g;return c+(c.includes("?")?"":l)+d}const WU=WI({name:"nuxt:router",enforce:"pre",async setup(C){let I,g,A=og().app.baseURL;const l=pg.history?.(A)??Qb(A),d=pg.routes?([I,g]=Og(()=>pg.routes(md)),I=await I,g(),I??md):md;let Z;const B=Lb({...pg,scrollBehavior:(m,n,o)=>
2{if(n===dg){Z=o;return}if(pg.scrollBehavior){if(B.options.scrollBehavior=pg.scrollBehavior,"scrollRestoration"in window.history){const w=B.beforeEach(()=>{w(),window.history.scrollRestoration="manual"})}return pg.scrollBehavior(m,dg,Z||o)}},history:l,routes:d});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),C.vueApp.use(B);const c=OI(B.currentRoute.value);B.afterEach((m,n)=>{c.value=n}),Object.defineProperty(C.vueApp.config.globalProperties,"previousRoute",{get:()=>c.value});const i=GU(A,window.location,C.payload.path),F=OI(B.currentRoute.value),V=()=>{F.value=B.currentRoute.value};B.afterEach((m,n)=>{const o=m.matched.at(-1)?.components?.default,w=n.matched.at(-1)?.components?.default;if(o===w){V();return}m.matched.length<n.matched.length&&m.matched.every((J,K)=>J.components?.default===n.matched[K]?.components?.default)&&V()});const W={sync:V};for(const m in F.value)Object.defineProperty(W,m,{get:()=>F.value[m],enumerable:!0});C._route=Qg(W),C._middleware||={global:[],named:{}};const G=LC();B.afterEach(async(m,n,o)=>{delete C._processingMiddleware,!C.isHydrating&&G.value&&await C.runWithContext(YR),o&&await C.callHook("page:loading:end")});try{[I,g]=Og(()=>B.isReady()),await I,g()}catch(m){[I,g]=Og(()=>C.runWithContext(()=>ZC(m))),await I,g()}const R=i!==B.currentRoute.value.fullPath?B.resolve(i):B.currentRoute.value,s=C.isHydrating&&C.payload.prerenderedAt&&C.payload.path&&i!==C.payload.path&&gi(B.currentRoute.value.path,C.payload.path);V();const Q=C.payload.state._layout;return B.beforeEach(async(m,n)=>{await C.callHook("page:loading:start"),m.meta=Mg(m.meta),C.isHydrating&&Q&&!OG(m.meta.layout)&&(m.meta.layout=Q),C._processingMiddleware=!0;{const o=new Set([...VU,...C._middleware.global]);for(const J of m.matched){const K=J.meta.middleware;if(K)for(const t of Pi(K))o.add(t)}const w=kl({path:m.path});if(w.appMiddleware)for(const J in w.appMiddleware)w.appMiddleware[J]?o.add(J):o.delete(J);for(const J of o){const K=typeof J=="string"?C._middleware.named[J]||await fd[J]?.().then(t=>t.default||t):J;if(!K)throw new Error(`Unknown route middleware: '${J}'.`);try{const t=await C.runWithContext(()=>K(m,n));if(!C.payload.serverRendered&&C.isHydrating&&(t===!1||t instanceof Error)){const u=t||tg({status:404,statusText:`Page Not Found: ${i}`});return await C.runWithContext(()=>ZC(u)),!1}if(t===!0)continue;if(t===!1)return t;if(t)return Wi(t)&&t.fatal&&await C.runWithContext(()=>ZC(t)),t}catch(t){const u=tg(t);return u.fatal&&await C.runWithContext(()=>ZC(u)),u}}}}),B.onError(async()=>{delete C._processingMiddleware,await C.callHook("page:loading:end")}),B.afterEach(m=>{if(m.matched.length===0&&!G.value)return C.runWithContext(()=>ZC(tg({status:404,fatal:!1,statusText:`Page not found: ${m.fullPath}`,data:{path:m.fullPath}})))}),C.hooks.hookOnce("app:created",async()=>{try{if("name"in R&&(R.name=void 0),s){const m=B.resolve(C.payload.path);"name"in m&&(m.name=void 0),await B.replace({...m,force:!0}),C.hooks.hookOnce("app:suspense:resolve",async()=>{await B.replace({...R,force:!0})})}else await B.replace({...R,force:!0});B.options.scrollBehavior=pg.scrollBehavior}catch(m){await C.runWithContext(()=>ZC(m))}}),{provide:{router:B}}}});function _d(C){return typeof C=="string"?`'${C}'`:new RU().serialize(C)}const RU=(function(){class C{#I=new Map;compare(g,A){const l=typeof g,d=typeof A;return l==="string"&&d==="string"?g.localeCompare(A):l==="number"&&d==="number"?g-A:String.prototype.localeCompare.call(this.serialize(g,!0),this.serialize(A,!0))}serialize(g,A){if(g===null)return"null";switch(typeof g){case"string":return A?g:`'${g}'`;case"bigint":return`${g}n`;case"object":return this.$object(g);case"function":return this.$function(g)}return String(g)}serializeObject(g){const A=Object.prototype.toString.call(g);if(A!=="[object Object]")return this.serializeBuiltInType(A.length<10?`unknown:${A}`:A.slice(8,-1),g);const l=g.constructor,d=l===Object||l===void 0?"":l.name;if(d!==""&&globalThis[d]===l)return this.serializeBuiltInType(d,g);if(typeof g.toJSON=="function"){const Z=g.toJSON();return d+(Z!==null&&typeof Z=="object"?this.$object(Z):`(${this.serialize(Z)})`)}return this.serializeObjectEntries(d,Object.entries(g))}serializeBuiltInType(g,A){const l=this["$"+g];if(l)return l.call(this,A);if(typeof A?.entries=="function")return this.serializeObjectEntries(g,A.entries());throw new Error(`Cannot serialize ${g}`)}serializeObjectEntries(g,A){const l=Array.from(A).sort((Z,B)=>this.compare(Z[0],B[0]));let d=`${g}{`;for(let Z=0;Z<l.length;Z++){const[B,c]=l[Z];d+=`${this.serialize(B,!0)}:${this.serialize(c)}
2`,Z<l.length-1&&(d+=",")}return d+"}"}$object(g){let A=this.#I.get(g);return A===void 0&&(this.#I.set(g,`#${this.#I.size}`),A=this.serializeObject(g),this.#I.set(g,A)),A}$function(g){const A=Function.prototype.toString.call(g);return A.slice(-15)==="[native code] }"?`${g.name||""}()[native]`:`${g.name}(${g.length})${A.replace(/\s*\n\s*/g,"")}`}$Array(g){let A="[";for(let l=0;l<g.length;l++)A+=this.serialize(g[l]),l<g.length-1&&(A+=",");return A+"]"}$Date(g){try{return`Date(${g.toISOString()})`}catch{return"Date(null)"}}$ArrayBuffer(g){return`ArrayBuffer[${new Uint8Array(g).join(",")}]`}$Set(g){return`Set${this.$Array(Array.from(g).sort((A,l)=>this.compare(A,l)))}`}$Map(g){return this.serializeObjectEntries("Map",g.entries())}}for(const I of["Error","RegExp","URL"])C.prototype["$"+I]=function(g){return`${I}(${g})`};for(const I of["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array"])C.prototype["$"+I]=function(g){return`${I}[${g.join(",")}]`};for(const I of["BigInt64Array","BigUint64Array"])C.prototype["$"+I]=function(g){return`${I}[${g.join("n,")}${g.length>0?"n":""}]`};return C})();function sU(C,I){return C===I||_d(C)===_d(I)}const bU=[1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225],UU=[1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998],oU="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",lC=[];class mU{_data=new JC;_hash=new JC([...bU]);_nDataBytes=0;_minBufferSize=0;finalize(I){I&&this._append(I);const g=this._nDataBytes*8,A=this._data.sigBytes*8;return this._data.words[A>>>5]|=128<<24-A%32,this._data.words[(A+64>>>9<<4)+14]=Math.floor(g/4294967296),this._data.words[(A+64>>>9<<4)+15]=g,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}_doProcessBlock(I,g){const A=this._hash.words;let l=A[0],d=A[1],Z=A[2],B=A[3],c=A[4],i=A[5],F=A[6],V=A[7];for(let W=0;W<64;W++){if(W<16)lC[W]=I[g+W]|0;else{const o=lC[W-15],w=(o<<25|o>>>7)^(o<<14|o>>>18)^o>>>3,J=lC[W-2],K=(J<<15|J>>>17)^(J<<13|J>>>19)^J>>>10;lC[W]=w+lC[W-7]+K+lC[W-16]}const G=c&i^~c&F,R=l&d^l&Z^d&Z,s=(l<<30|l>>>2)^(l<<19|l>>>13)^(l<<10|l>>>22),Q=(c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25),m=V+Q+G+UU[W]+lC[W],n=s+R;V=F,F=i,i=c,c=B+m|0,B=Z,Z=d,d=l,l=m+n|0}A[0]=A[0]+l|0,A[1]=A[1]+d|0,A[2]=A[2]+Z|0,A[3]=A[3]+B|0,A[4]=A[4]+c|0,A[5]=A[5]+i|0,A[6]=A[6]+F|0,A[7]=A[7]+V|0}_append(I){typeof I=="string"&&(I=JC.fromUtf8(I)),this._data.concat(I),this._nDataBytes+=I.sigBytes}_process(I){let g,A=this._data.sigBytes/64;I?A=Math.ceil(A):A=Math.max((A|0)-this._minBufferSize,0);const l=A*16,d=Math.min(l*4,this._data.sigBytes);if(l){for(let Z=0;Z<l;Z+=16)this._doProcessBlock(this._data.words,Z);g=this._data.words.splice(0,l),this._data.sigBytes-=d}return new JC(g,d)}}class JC{words;sigBytes;constructor(I,g){I=this.words=I||[],this.sigBytes=g===void 0?I.length*4:g}static fromUtf8(I){const g=unescape(encodeURIComponent(I)),A=g.length,l=[];for(let d=0;d<A;d++)l[d>>>2]|=(g.charCodeAt(d)&255)<<24-d%4*8;return new JC(l,A)}toBase64(){const I=[];for(let g=0;g<this.sigBytes;g+=3){const A=this.words[g>>>2]>>>24-g%4*8&255,l=this.words[g+1>>>2]>>>24-(g+1)%4*8&255,d=this.words[g+2>>>2]>>>24-(g+2)%4*8&255,Z=A<<16|l<<8|d;for(let B=0;B<4&&g*8+B*6<this.sigBytes*8;B++)I.push(oU.charAt(Z>>>6*(3-B)&63))}return I.join("")}concat(I){if(this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4),this.sigBytes%4)for(let g=0;g<I.sigBytes;g++){const A=I.words[g>>>2]>>>24-g%4*8&255;this.words[this.sigBytes+g>>>2]|=A<<24-(this.sigBytes+g)%4*8}else for(let g=0;g<I.sigBytes;g+=4)this.words[this.sigBytes+g>>>2]=I.words[g>>>2];this.sigBytes+=I.sigBytes}}function nU(C){return new mU().finalize(C).toBase64()}function wC(C){return nU(_d(C))}const IF=Symbol.for("nuxt:client-only"),QU="<div></div>";function aU(C){return C.nodeName==="#comment"&&C.nodeValue==="placeholder"}
2function nd(C){return C&&!aU(C)?AU(C,QU):sI("div")}const ow=Bg({name:"ClientOnly",inheritAttrs:!1,props:["fallback","placeholder","placeholderTag","fallbackTag"],setup(C,{slots:I,attrs:g}){const A=OI(!1);VA(()=>{A.value=!0});const l=aA();return l&&(l._nuxtClientOnly=!0),jg(IF,!0),()=>{if(A.value){const c=I.default?.();return c&&c.length===1?[fA(c[0],g)]:c}const d=I.fallback||I.placeholder;if(d)return sI(d);const Z=C.fallback||C.placeholder||"",B=C.fallbackTag||C.placeholderTag||"span";return rI(B,g,Z)}}}),Qd=new WeakMap;function NU(C){if(Qd.has(C))return Qd.get(C);const I={...C};if(I.render)I.render=(g,A,l,d,Z,B)=>{if(d.mounted$??g.mounted$){const c=C.render?.bind(g)(g,A,l,d,Z,B);return c.children===null||typeof c.children=="string"?fA(c):sI(c)}return nd(g._.vnode.el)};else{const g="<div></div>";I.template&&=` 3 <template v-if="mounted$">${C.template}</template> 4 <template v-else>${g}</template> 5 `}return I.setup=(g,A)=>{const l=CI(),d=OI(l.isHydrating===!1),Z=aA();if(l.isHydrating){const c={...Z.attrs},i=YU(Z);for(const F in c)delete Z.attrs[F];VA(()=>{Object.assign(Z.attrs,c),Z.vnode.dirs=i})}VA(()=>{d.value=!0});const B=C.setup?.(g,A)||{};return vG(B)?Promise.resolve(B).then(c=>typeof c!="function"?(c||={},c.mounted$=d,c):(...i)=>{if(d.value||!l.isHydrating){const F=c(...i);return F.children===null||typeof F.children=="string"?fA(F):sI(F)}return nd(Z?.vnode.el)}):typeof B=="function"?(...c)=>{if(d.value){const i=B(...c),F=I.inheritAttrs!==!1?A.attrs:void 0;return i.children===null||typeof i.children=="string"?fA(i,F):sI(i,F)}return nd(Z?.vnode.el)}:Object.assign(B,{mounted$:d})},Qd.set(C,I),I}function YU(C){if(!C||!C.vnode.dirs)return null;const I=C.vnode.dirs;return C.vnode.dirs=null,I}const qd=globalThis.requestIdleCallback||(C=>{const I=Date.now(),g={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-I))};return setTimeout(()=>{C(g)},1)}),wU=globalThis.cancelIdleCallback||(C=>{clearTimeout(C)}),zl=C=>{const I=CI();I.isHydrating?I.hooks.hookOnce("app:suspense:resolve",()=>{qd(()=>C())}):qd(()=>C())},hU=/\d/,eU=["-","_","/","."];function JU(C=""){if(!hU.test(C))return C!==C.toLowerCase()}function SU(C,I){const g=eU,A=[];
5if(!C||typeof C!="string")return A;let l="",d,Z;for(const B of C){const c=g.includes(B);if(c===!0){A.push(l),l="",d=void 0;continue}const i=JU(B);if(Z===!1){if(d===!1&&i===!0){A.push(l),l=B,d=i;continue}if(d===!0&&i===!1&&l.length>1){const F=l.at(-1);A.push(l.slice(0,Math.max(0,l.length-1))),l=F+B,d=i;continue}}l+=B,d=i,Z=c}return A.push(l),A}function XU(C){return C?C[0].toUpperCase()+C.slice(1):""}const yU=/^(a|an|and|as|at|but|by|for|if|in|is|nor|of|on|or|the|to|with)$/i;function tU(C,I){return(Array.isArray(C)?C:SU(C)).filter(Boolean).map(g=>yU.test(g)?g.toLowerCase():XU(g)).join(" ")}function gF(C){return Object.defineProperty(function(){throw new Error(`[nuxt] \`${C.name}\` is a compiler macro and cannot be called at runtime.`)},"__nuxt_factory",{enumerable:!1,get:()=>C.factory})}const CF=gF({name:"createUseAsyncData",factory(C={}){function I(...g){const A=typeof g[g.length-1]=="string"?g.pop():void 0;DU(g[0],g[1])&&g.unshift(A);let[l,d,Z={}]=g,B=!1;const c=qg(l)||typeof l=="function",i=c?v(()=>Ig(l)):{value:l};if(!i.value||typeof i.value!="string")throw new TypeError("[nuxt] [useAsyncData] key must be a non-empty string.");if(typeof d!="function")throw new TypeError("[nuxt] [useAsyncData] handler must be a function.");const F=typeof C=="function",V=CI(),W=F?C(Z):C;if(!F)for(const o in W)W[o]!==void 0&&Z[o]===void 0&&(Z[o]=W[o]);if(Z.server??=!0,Z.default??=HU,Z.getCachedData??=dF,Z.lazy??=!1,Z.immediate??=!0,Z.deep??=BR.deep,Z.dedupe??="cancel",F)for(const o in W)W[o]!==void 0&&(Z[o]=W[o]);V._asyncData[i.value];function G(){const o={cause:"initial",dedupe:Z.dedupe},w=V._asyncData[i.value];return w?._init?o.cachedData=w._initialCachedData:(o.cachedData=Z.getCachedData(i.value,V,{cause:"initial"}),V._asyncData[i.value]=u0(V,i.value,d,Z,o.cachedData),V._asyncData[i.value]._initialCachedData=o.cachedData),()=>V._asyncData[i.value].execute(o)}const R=G(),s=V._asyncData[i.value];s._deps++;const Q=Z.server!==!1&&V.payload.serverRendered;{let o=function(r){const AI=V._asyncData[r];AI?._deps&&(AI._deps--,AI._deps===0&&AI?._off())};const w=aA();if(w&&Q&&Z.immediate&&!w.sp&&(w.sp=[]),w&&!w._nuxtOnBeforeMountCbs){w._nuxtOnBeforeMountCbs=[];const r=w._nuxtOnBeforeMountCbs;Lc(()=>{r.forEach(AI=>{AI()}),r.splice(0,r.length)}),Ec(()=>r.splice(0,r.length))}const J=w&&(w._nuxtClientOnly||EI(IF,!1));Q&&V.isHydrating&&(s.error.value||s.data.value!==void 0)?s.status.value=s.error.value?"error":"success":w&&(!J&&V.payload.serverRendered&&V.isHydrating||Z.lazy)&&Z.immediate?w._nuxtOnBeforeMountCbs.push(R):Z.immediate&&s.status.value!=="success"&&R();const K=nA(),t=()=>{},u=c?$I(i,(r,AI)=>{if((r||AI)&&r!==AI){B=!0;const PI=V._asyncData[AI]?.data.value!==void 0,fI=V._asyncDataPromises[AI]!==void 0,Hg={cause:"initial",dedupe:Z.dedupe};if(!V._asyncData[r]?._init){let Cg;AI&&PI?Cg=V._asyncData[AI].data.value:(Cg=Z.getCachedData(r,V,{cause:"initial"}),Hg.cachedData=Cg),V._asyncData[r]=u0(V,r,d,Z,Cg)}V._asyncData[r]._deps++,AI&&o(AI),(Z.immediate||PI||fI)&&V._asyncData[r].execute(Hg),vB(()=>{B=!1})}},{flush:"sync"}):t,E=Z.watch?$I(Z.watch,()=>{B||(V._asyncData[i.value]?._execute.isPending()&&vB(()=>{V._asyncData[i.value]?._execute.flush()}),V._asyncData[i.value]?._execute({cause:"watch",dedupe:Z.dedupe}))}):t;K&&FA(()=>{u(),E(),o(i.value)})}const m={data:pA(()=>V._asyncData[i.value]?.data),pending:pA(()=>V._asyncData[i.value]?.pending),status:pA(()=>V._asyncData[i.value]?.status),error:pA(()=>V._asyncData[i.value]?.error),refresh:(...o)=>V._asyncData[i.value]?._init?V._asyncData[i.value].execute(...o):G()(),execute:(...o)=>m.refresh(...o),clear:()=>{const o=V._asyncData[i.value];if(o?._abortController)try{o._abortController.abort(new DOMException("AsyncData aborted by user.","AbortError"))}finally{o._abortController=void 0}lF(V,i.value)}},n=Promise.resolve(V._asyncDataPromises[i.value]).then(()=>m);return Object.assign(n,m),Object.defineProperties(n,{then:{enumerable:!0,value:n.then.bind(n)},catch:{enumerable:!0,value:n.catch.bind(n)},finally:{enumerable:!0,value:n.finally.bind(n)}}),n}return I}}),AF=CF.__nuxt_factory();CF.__nuxt_factory({lazy:!0,_functionName:"useLazyAsyncData"});function pA(C){return v({get(){return C()?.value},set(I){const g=C();
5g&&(g.value=I)}})}function DU(C,I){return!(typeof C=="string"||typeof C=="object"&&C!==null||typeof C=="function"&&typeof I=="function")}function lF(C,I){I in C.payload.data&&(C.payload.data[I]=void 0),I in C.payload._errors&&(C.payload._errors[I]=void 0),C._asyncData[I]&&(C._asyncData[I].data.value=j(C._asyncData[I]._default()),C._asyncData[I].error.value=void 0,C._asyncData[I].status.value="idle",C._asyncData[I]._initialCachedData=void 0),I in C._asyncDataPromises&&(C._asyncDataPromises[I]=void 0)}function MU(C,I){const g={};for(const A of I)g[A]=C[A];return g}function u0(C,I,g,A,l){C.payload._errors[I]??=void 0;const d=A.getCachedData!==dF,Z=g,B=A.deep?f:OI,c=l!==void 0,i=C.hook("app:data:refresh",async V=>{(!V||V.includes(I))&&await F.execute({cause:"refresh:hook"})}),F={data:B(c?l:A.default()),pending:v(()=>F.status.value==="pending"),error:Dl(C.payload._errors,I),status:OI("idle"),execute:(...V)=>{const[W,G=void 0]=V,R=W&&G===void 0&&typeof W=="object"?W:{};if(C._asyncDataPromises[I]&&(R.dedupe??A.dedupe)==="defer")return C._asyncDataPromises[I];{const m="cachedData"in R?R.cachedData:A.getCachedData(I,C,{cause:R.cause??"refresh:manual"});if(m!==void 0)return C.payload.data[I]=F.data.value=m,F.error.value=void 0,F.status.value="success",Promise.resolve(m)}F._abortController&&F._abortController.abort(new DOMException("AsyncData request cancelled by deduplication","AbortError")),F._abortController=new AbortController,F.status.value="pending";const s=new AbortController,Q=new Promise((m,n)=>{try{const o=R.timeout??A.timeout,w=uU([F._abortController?.signal,R?.signal],s.signal,o);if(w.aborted){const J=w.reason;n(J instanceof Error?J:new DOMException(String(J??"Aborted"),"AbortError"));return}return w.addEventListener("abort",()=>{const J=w.reason;n(J instanceof Error?J:new DOMException(String(J??"Aborted"),"AbortError"))},{once:!0,signal:s.signal}),Promise.resolve(Z(C,{signal:w})).then(m,n)}catch(o){n(o)}}).then(async m=>{if(C._asyncDataPromises[I]!==Q)return;let n=m;A.transform&&(n=await A.transform(m)),A.pick&&(n=MU(n,A.pick)),C.payload.data[I]=n,F.data.value=n,F.error.value=void 0,F.status.value="success"}).catch(m=>{if(C._asyncDataPromises[I]!==Q||F._abortController?.signal.aborted)return C._asyncDataPromises[I];if(typeof DOMException<"u"&&m instanceof DOMException&&m.name==="AbortError")return F.status.value="idle",C._asyncDataPromises[I];F.error.value=tg(m),F.data.value=j(A.default()),F.status.value="error"}).finally(()=>{s.abort(),C._asyncDataPromises[I]===Q&&delete C._asyncDataPromises[I]});return C._asyncDataPromises[I]=Q,C._asyncDataPromises[I]},_execute:Ts((...V)=>F.execute(...V),0,{leading:!0}),_default:A.default,_deps:0,_init:!0,_hash:void 0,_off:()=>{i(),C._asyncData[I]?._init&&(C._asyncData[I]._init=!1),d||Rg(()=>{C._asyncData[I]?._init||(lF(C,I),F.execute=()=>Promise.resolve())})}};return F}const HU=()=>{},dF=(C,I,g)=>{if(I.isHydrating)return I.payload.data[C];if(g.cause!=="refresh:manual"&&g.cause!=="refresh:hook")return I.static.data[C]};function uU(C,I,g){const A=C.filter(Z=>!!Z);if(typeof g=="number"&&g>=0){const Z=AbortSignal.timeout?.(g);Z&&A.push(Z)}if(AbortSignal.any)return AbortSignal.any(A);const l=new AbortController;for(const Z of A)if(Z.aborted){const B=Z.reason??new DOMException("Aborted","AbortError");try{l.abort(B)}catch{l.abort()}return l.signal}const d=()=>{const B=A.find(c=>c.aborted)?.reason??new DOMException("Aborted","AbortError");try{l.abort(B)}catch{l.abort()}};for(const Z of A)Z.addEventListener?.("abort",d,{once:!0,signal:I});return l.signal}const pU="$s";function ZF(...C){const I=typeof C[C.length-1]=="string"?C.pop():void 0;typeof C[0]!="string"&&C.unshift(I);const[g,A]=C;if(!g||typeof g!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+g);if(A!==void 0&&typeof A!="function")throw new Error("[nuxt] [useState] init must be a function: "+A);const l=pU+g,d=CI(),Z=Dl(d.payload.state,l);if(A&&(d._state[l]??={_default:A}),Z.value===void 0&&A){const B=A();if(qg(B))return d.payload.state[l]=B,B;Z.value=B}return Z}function KU(C){const I=[Ig(C.method)?.toUpperCase()||"GET",Ig(C.baseURL)];
5for(const g of[C.query||C.params]){const A=Ig(g);if(!A)continue;const l={};for(const[d,Z]of Object.entries(A))l[Ig(d)]=Ig(Z);I.push(l)}if(C.body){const g=Ig(C.body);if(!g)I.push(wC(g));else if(g instanceof ArrayBuffer)I.push(wC(Object.fromEntries([...new Uint8Array(g).entries()].map(([A,l])=>[A,l.toString()]))));else if(g instanceof FormData){const A=[];for(const l of g.entries()){const[d,Z]=l;A.push([d,Z instanceof File?`${Z.name}:${Z.size}:${Z.lastModified}`:Z])}I.push(wC(A))}else if(xG(g))I.push(wC(Mg(g)));else try{I.push(wC(g))}catch{}}return I}const BF=gF({name:"createUseFetch",factory(C={}){function I(g,A,l){const[d={},Z]=typeof A=="string"?[{},A]:[A,l],B=typeof C=="function"?C(d):C,{server:c,lazy:i,default:F,transform:V,pick:W,watch:G,immediate:R,getCachedData:s,deep:Q,dedupe:m,timeout:n,...o}={...typeof C=="function"?{}:B,...d,...typeof C=="function"?B:{}},w=v(()=>Ig(g)),J=v(()=>Ig(o.key)||"$f"+wC([Z,typeof w.value=="string"?w.value:"",...KU(o)]));if(!o.baseURL&&typeof w.value=="string"&&w.value[0]==="/"&&w.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const K=Mg({...cR,...o,cache:typeof o.cache=="boolean"?void 0:o.cache}),t={server:c,lazy:i,default:F,transform:V,pick:W,immediate:R,getCachedData:s,deep:Q,dedupe:m,timeout:n,watch:G===!1?[]:[...G||[],K]};return AF(G===!1?J.value:J,(E,{signal:r})=>(o.$fetch||globalThis.$fetch)(w.value,{signal:r,...K}),t)}return I}}),yZ=BF.__nuxt_factory();BF.__nuxt_factory({lazy:!0,_functionName:"useLazyFetch"});const kU=(()=>{const C=function(){};return C.prototype=Object.create(null),C})();function TU(C,I){if(typeof C!="string")throw new TypeError("argument str must be a string");const g=new kU,A=I||{},l=A.decode||zU;let d=0;for(;d<C.length;){const Z=C.indexOf("=",d);if(Z===-1)break;let B=C.indexOf(";",d);if(B===-1)B=C.length;else if(B<Z){d=C.lastIndexOf(";",Z-1)+1;continue}const c=C.slice(d,Z).trim();if(A?.filter&&!A?.filter(c)){d=B+1;continue}if(g[c]===void 0){let i=C.slice(Z+1,B).trim();i.codePointAt(0)===34&&(i=i.slice(1,-1)),g[c]=LU(i,l)}d=B+1}return g}function zU(C){return C.includes("%")?decodeURIComponent(C):C}function LU(C,I){try{return I(C)}catch{return C}}const KA=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function p0(C,I,g){const A=g||{},l=A.encode||encodeURIComponent;if(typeof l!="function")throw new TypeError("option encode is invalid");if(!KA.test(C))throw new TypeError("argument name is invalid");const d=l(I);if(d&&!KA.test(d))throw new TypeError("argument val is invalid");let Z=C+"="+d;if(A.maxAge!==void 0&&A.maxAge!==null){const B=A.maxAge-0;if(Number.isNaN(B)||!Number.isFinite(B))throw new TypeError("option maxAge is invalid");Z+="; Max-Age="+Math.floor(B)}if(A.domain){if(!KA.test(A.domain))throw new TypeError("option domain is invalid");Z+="; Domain="+A.domain}if(A.path){if(!KA.test(A.path))throw new TypeError("option path is invalid");Z+="; Path="+A.path}if(A.expires){if(!EU(A.expires)||Number.isNaN(A.expires.valueOf()))throw new TypeError("option expires is invali
5d");Z+="; Expires="+A.expires.toUTCString()}if(A.httpOnly&&(Z+="; HttpOnly"),A.secure&&(Z+="; Secure"),A.priority)switch(typeof A.priority=="string"?A.priority.toLowerCase():A.priority){case"low":{Z+="; Priority=Low";break}case"medium":{Z+="; Priority=Medium";break}case"high":{Z+="; Priority=High";break}default:throw new TypeError("option priority is invalid")}if(A.sameSite)switch(typeof A.sameSite=="string"?A.sameSite.toLowerCase():A.sameSite){case!0:{Z+="; SameSite=Strict";break}case"lax":{Z+="; SameSite=Lax";break}case"strict":{Z+="; SameSite=Strict";break}case"none":{Z+="; SameSite=None";break}default:throw new TypeError("option sameSite is invalid")}return A.partitioned&&(Z+="; Partitioned"),Z}function EU(C){return Object.prototype.toString.call(C)==="[object Date]"||C instanceof Date}function Vg(C){if(typeof C!="object")return C;var I,g,A=Object.prototype.toString.call(C);if(A==="[object Object]"){if(C.constructor!==Object&&typeof C.constructor=="function"){g=new C.constructor;for(I in C)C.hasOwnProperty(I)&&g[I]!==C[I]&&(g[I]=Vg(C[I]))}else{g={};for(I in C)I==="__proto__"?Object.defineProperty(g,I,{value:Vg(C[I]),configurable:!0,enumerable:!0,writable:!0}):g[I]=Vg(C[I])}return g}if(A==="[object Array]"){for(I=C.length,g=Array(I);I--;)g[I]=Vg(C[I]);return g}return A==="[object Set]"?(g=new Set,C.forEach(function(l){g.add(Vg(l))}),g):A==="[object Map]"?(g=new Map,C.forEach(function(l,d){g.set(Vg(d),Vg(l))}),g):A==="[object Date]"?new Date(+C):A==="[object RegExp]"?(g=new RegExp(C.source,C.flags),g.lastIndex=C.lastIndex,g):A==="[object DataView]"?new C.constructor(Vg(C.buffer)):A==="[object ArrayBuffer]"?C.slice(0):A.slice(-6)==="Array]"?new C.constructor(C):C}function rU(C){if(C!=="undefined")try{const I=JSON.parse(C);return typeof I=="number"&&String(I)!==C?C:I}catch{return C}}const jU={path:"/",watch:!0,decode:C=>C&&rU(decodeURIComponent(C)),encode:C=>{if(typeof C!="string"||C==="undefined")return encodeURIComponent(JSON.stringify(C));try{if(typeof JSON.parse(C)!="string")return encodeURIComponent(JSON.stringify(C))}catch{}return encodeURIComponent(C)},refresh:!1},kA=globalThis.cookieStore;function Il(C,I){const g={...jU,...I};g.filter??=i=>i===C;const A=K0(g)||{};let l;g.maxAge!==void 0?l=g.maxAge*1e3:g.expires&&(l=g.expires.getTime()-Date.now());const d=l!==void 0&&l<=0,Z=d||A[C]===void 0||A[C]===null,B=Vg(d?void 0:A[C]??g.default?.()),c=l&&!d?fU(B,l,g.watch&&g.watch!=="shallow"):f(B);{let i=null;try{!kA&&typeof BroadcastChannel<"u"&&(i=new BroadcastChannel(`nuxt:cookies:${C}`))}catch{}const F=(R=!1)=>{if(!R&&(g.readonly||sU(c.value,A[C])))return;const s=c.value===null||c.value===void 0?void 0:g.encode(c.value);PU(C,s,g),A[C]=Vg(c.value),i?.postMessage({value:g.encode(c.value)})},V=R=>{const s=R.refresh?K0(g)?.[C]:g.decode(R.value);W=!0,c.value=s,A[C]=Vg(s),Rg(()=>{W=!1})};let W=!1;const G=!!nA();if(G&&FA(()=>{W=!0,F(),i?.close()}),kA){const R=s=>{const Q=s.changed.find(n=>n.name===C),m=s.deleted.find(n=>n.name===C);Q&&V({value:Q.value}),m&&V({value:null})};kA.addEventListener("change",R),G&&FA(()=>kA.removeEventListener("change",R))}else i&&(i.onmessage=({data:R})=>V(R));g.watch&&$I(c,()=>{W||F(g.refresh)},{deep:g.watch!=="shallow"}),Z&&F(Z)}return c}function K0(C={}){return TU(document.cookie,C)}const OU=C=>C;function vU(C){const{encode:I,decode:g,...A}=C;return{...A,encode:OU}}function xU(C,I,g={}){const A=vU(g);return I===void 0?p0(C,"",{...A,maxAge:-1}):p0(C,I,A)}function PU(C,I,g={}){document.cookie=xU(C,I,g)}const k0=2147483647;function fU(C,I,g){let A,l,d=0;const Z=g?f(C):{value:C};return nA()&&FA(()=>{l?.(),clearTimeout(A)}),PG((B,c)=>{g&&(l=$I(Z,c));function i(){const V=I-d,W=V<k0?V:k0;A=setTimeout(()=>{if(d+=W,d<I)return i();Z.value=void 0,c()},W)}function F(){d=0,clearTimeout(A),i()}return{get(){return B(),Z.value},set(V){F(),Z.value=V,c()}}})}function _U(C){if(C?.__asyncLoader&&!C.__asyncResolved)return C.__asyncLoader()}async function cF(C,I=HI()){const{path:g,matched:A}=I.resolve(C);if(!A.length||(I._routePreloaded||=new Set,I._routePreloaded.has(g)))return;const l=I._preloadPromises||=[];if(l.length>4)return Promise.all(l).then(()=>cF(C,I));I._routePreloaded.add(g);for(const d of A){const Z=d.components?.default;if(typeof Z!="function")continue;
5const B=Promise.resolve(Z()).catch(()=>{}).finally(()=>l.splice(l.indexOf(B),1));l.push(B)}await Promise.all(l)}function qU(C={}){const I=C.path||window.location.pathname;let g={};try{g=JSON.parse(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(C.force||g?.path!==I||g?.expires<Date.now()){try{sessionStorage.setItem("nuxt:reload",JSON.stringify({path:I,expires:Date.now()+(C.ttl??1e4)}))}catch{}if(C.persistState)try{sessionStorage.setItem("nuxt:reload:state",JSON.stringify({state:CI().payload.state}))}catch{}window.location.pathname!==I?window.location.href=I:window.location.reload()}}const $U=(...C)=>C.find(I=>I!==void 0);function Io(C){const I=C.componentName||"NuxtLink";function g(d){return typeof d=="string"&&d.startsWith("#")}function A(d,Z,B){const c=B??C.trailingSlash;if(!d||c!=="append"&&c!=="remove")return d;if(typeof d=="string")return TA(d,c);const i="path"in d&&d.path!==void 0?d.path:Z(d).path;return{...d,name:void 0,path:TA(i,c)}}function l(d){const Z=HI(),B=og(),c=v(()=>!!j(d.target)&&j(d.target)!=="_self"),i=v(()=>{const Q=j(d.to)||j(d.href)||"";return typeof Q=="string"&&Ug(Q,{acceptRelative:!0})}),F=xB("RouterLink"),V=F&&typeof F!="string"?F.useLink:void 0,W=v(()=>{if(j(d.external))return!0;const Q=j(d.to)||j(d.href)||"";return typeof Q=="object"?!1:Q===""||i.value}),G=v(()=>{const Q=j(d.to)||j(d.href)||"";return W.value?Q:A(Q,Z.resolve,j(d.trailingSlash))}),R=W.value?void 0:V?.({...d,to:G,viewTransition:j(d.viewTransition)}),s=v(()=>{const Q=j(d.trailingSlash)??C.trailingSlash;if(!G.value||i.value||g(G.value))return G.value;if(W.value){const m=typeof G.value=="object"&&"path"in G.value?kd(G.value):G.value,n=typeof m=="object"?Z.resolve(m).href:m;return TA(n,Q)}return typeof G.value=="object"?Z.resolve(G.value)?.href??null:TA(pl(B.app.baseURL,G.value),Q)});return{to:G,hasTarget:c,isAbsoluteUrl:i,isExternal:W,href:s,isActive:R?.isActive??v(()=>G.value===Z.currentRoute.value.path),isExactActive:R?.isExactActive??v(()=>G.value===Z.currentRoute.value.path),route:R?.route??v(()=>Z.resolve(G.value)),async navigate(Q){await qA(s.value,{replace:j(d.replace),external:W.value||c.value})}}}return Bg({name:I,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},prefetchOn:{type:[String,Object],default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1},trailingSlash:{type:String,default:void 0,required:!1}},useLink:l,setup(d,{slots:Z}){const B=HI(),{to:c,href:i,navigate:F,isExternal:V,hasTarget:W,isAbsoluteUrl:G}=l(d),R=OI(!1),s=f(null),Q=o=>{s.value=d.custom?o?.$el?.nextElementSibling:o?.$el};function m(o){return!R.value&&(typeof d.prefetchOn=="string"?d.prefetchOn===o:d.prefetchOn?.[o]??C.prefetchOn?.[o])&&(d.prefetch??C.prefetch)!==!1&&d.noPrefetch!==!0&&d.target!=="_blank"&&!lo()}async function n(o=CI()){if(R.value)return;R.value=!0;const w=typeof c.value=="string"?c.value:V.value?kd(c.value):B.resolve(c.value).fullPath,J=V.value?new URL(w,window.location.href).href:w;await Promise.all([o.hooks.callHook("link:prefetch",J)?.catch(()=>{}),!V.value&&!W.value&&cF(c.value,B).catch(()=>{})])}if(m("visibility")){const o=CI();let w,J=null;VA(()=>{const K=Co();zl(()=>{w=qd(()=>{s?.value?.tagName&&(J=K.observe(s.value,async()=>{J?.(),J=null,await n(o)}))})})}),sZ(()=>{w&&wU(w),J?.(),J=null})}return()=>{if(!V.value&&!W.value&&!g(c.value)){const J={ref:Q,to:c.value,activeClass:d.activeClass||C.activeClass,exactActiveClass:d.exactActiveClass||C.exactActiveClass,replace:d.replace,ariaCurrentValue:d.ariaCurrentValue,custom:d.custom};
5return d.custom||(m("interaction")&&(J.onPointerenter=n.bind(null,void 0),J.onFocus=n.bind(null,void 0)),R.value&&(J.class=d.prefetchedClass||C.prefetchedClass),J.rel=d.rel||void 0),sI(xB("RouterLink"),J,Z.default)}const o=d.target||null,w=$U(d.noRel?"":d.rel,C.externalRelAttribute,G.value||W.value?"noopener noreferrer":"")||null;return d.custom?Z.default?Z.default({href:i.value,navigate:F,prefetch:n,get route(){if(!i.value)return;const J=new URL(i.value,window.location.href);return{path:J.pathname,fullPath:J.pathname,get query(){return oZ(J.search)},hash:J.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:i.value}},rel:w,target:o,isExternal:V.value||W.value,isActive:!1,isExactActive:!1}):null:sI("a",{ref:s,href:i.value||null,rel:w,target:o,onClick:async J=>{if(!(V.value||W.value)){J.preventDefault();try{const K=Vi(i.value);return await(d.replace?B.replace(K):B.push(K))}finally{if(g(c.value)){const K=c.value.slice(1);let t=K;try{t=decodeURIComponent(K)}catch{}document.getElementById(t)?.focus()}}}}},Z.default?.())}}})}const go=Io(ZR);function TA(C,I){const g=I==="append"?ul:$g;return Ug(C)&&!C.startsWith("http")?C:g(C,!0)}function Co(){const C=CI();if(C._observer)return C._observer;let I=null;const g=new Map,A=(d,Z)=>(I||=new IntersectionObserver(B=>{for(const c of B){const i=g.get(c.target);(c.isIntersecting||c.intersectionRatio>0)&&i&&i()}}),g.set(d,Z),I.observe(d),()=>{g.delete(d),I?.unobserve(d),g.size===0&&(I?.disconnect(),I=null)});return C._observer={observe:A}}const Ao=/2g/;function lo(){const C=navigator.connection;return!!(C&&(C.saveData||Ao.test(C.effectiveType)))}function Zo(C){typeof C.indexable<"u"&&(C.indexable=String(C.indexable)!=="false"),typeof C.trailingSlash<"u"&&!C.trailingSlash&&(C.trailingSlash=String(C.trailingSlash)!=="false"),C.url&&!Ug(String(C.url),{acceptRelative:!0,strict:!1})&&(C.url=SW(String(C.url)));const I=Object.keys(C).sort((A,l)=>A.localeCompare(l)),g={};for(const A of I)g[A]=C[A];return g}function Bo(C){const g=[];function A(d){if(!d||typeof d!="object"||Object.keys(d).length===0)return()=>{};d._context;const Z={};for(const B in d){const c=d[B];typeof c<"u"&&c!==""&&(Z[B]=c)}return Object.keys(Z).filter(B=>!B.startsWith("_")).length===0?()=>{}:(g.push(Z),()=>{const B=g.indexOf(Z);B!==-1&&g.splice(B,1)})}function l(d){const Z={};d?.debug&&(Z._context={}),Z._priority={};for(const B in g.sort((c,i)=>(c._priority||0)-(i._priority||0)))for(const c in g[B]){const i=c,F=d?.resolveRefs?Ig(g[B][c]):g[B][c];!c.startsWith("_")&&typeof F<"u"&&F!==""&&(Z[c]=F,typeof g[B]._priority<"u"&&g[B]._priority!==-1&&(Z._priority[i]=g[B]._priority),d?.debug&&(Z._context[i]=g[B]._context?.[i]||g[B]._context||"anonymous"))}return d?.skipNormalize?Z:Zo(Z)}return{stack:g,push:A,get:l}}const co=WI({name:"nuxt-site-config:init",enforce:"pre",async setup(C){const I=Bo(),g=ZF("site-config");{const A=g.value||window.__NUXT_SITE_CONFIG__||{};for(const l in A)l[0]!=="_"&&I.push({[l]:A[l],_priority:A._priority?.[l]||-1})}return{provide:{nuxtSiteConfig:I}}}}),io=WI({name:"nuxt:payload",setup(C){const I=new Set;HI().beforeResolve(async(g,A)=>{if(g.path===A.path)return;const l=await R0(g.path);if(l){for(const d of I)delete C.static.data[d];for(const d in l.data)d in C.static.data||I.add(d),C.static.data[d]=l.data[d]}}),zl(()=>{C.hooks.hook("link:prefetch",async g=>{const{hostname:A}=new URL(g,window.location.href);A===window.location.hostname&&await R0(g).catch(()=>{})}),navigator.connection?.effectiveType!=="slow-2g"&&setTimeout(hZ,1e3)})}}),Fo=WI(()=>{const C=HI();zl(()=>{C.beforeResolve(async()=>{await new Promise(I=>{setTimeout(I,100),requestAnimationFrame(()=>{setTimeout(I,0)})})})})}),Vo=WI(C=>{let I;async function g(){let A;try{A=await hZ()}catch(l){const d=l;if(!("status"in d&&(d.status===404||d.status===403)))throw d}I&&clearTimeout(I),I=setTimeout(g,l0);try{const l=await $fetch(nZ("builds/latest.json")+`?${Date.now()}`);l.id!==A?.id&&(C.hooks.callHook("app:manifest:update",l),I&&clearTimeout(I))}catch{}}zl(()=>{I=setTimeout(g,l0)})}),Go=WI({name:"nuxt:chunk-reload",setup(C){const I=HI(),g=og(),A=new Set;I.beforeEach(()=>{A.clear()}),C.hook("app:chunkError",({error:d})=>{A.add(d)});function l(d){const Z=pl(g.app.baseURL,d.fullPath);qU({path:Z,persistState:!0})}C.hook("app:manifest:update",()=>{I.beforeResolve(l)}),I.onError((d,Z)=>{A.has(d)&&l(Z)})}}),Wo=WI({name:"pinia",setup(C){const I=wR();return C.vueApp.use(I),pC(I),C.payload&&C.payload.pinia&&(I.state.value=C.payload.pinia),{provide:{pinia:I}}},hooks:{"app:rendered"(){const C=CI();C.payload.pinia=Ml(C.$pinia).state.value,pC(void 0)}}});function tZ(C){const I=Mg({});return zc(()=>{const g=CI().$nuxtSiteConfig.get(aZ({resolveRefs:!0},C));
5I&&g&&Object.assign(I,g)}),delete I._priority,I}const Ro=WI(()=>{const C=EC();if(!C)return;const I=tZ(),g={meta:[],templateParams:{site:I,siteUrl:I.url,siteName:I.name}};I.separator&&(g.templateParams.separator=I.separator),I.titleSeparator&&(g.templateParams.titleSeparator=I.titleSeparator),I.description&&(g.templateParams.siteDescription=I.description,g.meta.push({name:"description",content:"%site.description",tagPriority:"low"})),C.push(g)}),so=WI(()=>{const C=EC();C&&(C.use(wi),C.use(Rs()))}),bo=WI({name:"nuxt-seo:fallback-titles",env:{islands:!1},setup(){const C=bC(),I=LC(),g=v(()=>{if(I.value&&[404,500].includes(I.value?.statusCode))return`${I.value.statusCode} - ${I.value.message}`;if(typeof C.meta?.title=="string")return C.meta?.title;const d=$g(C.path||"/").split("/").pop();return d?tU(d):null});Kl({title:()=>g.value},{tagPriority:101})}}),Uo=X(()=>h(()=>import("./BspZsups.js"),__vite__mapDeps([18,19,20,1,2,21]),import.meta.url).then(C=>C.default||C.default||C)),oo=X(()=>h(()=>import("./2IkCbGgp.js"),__vite__mapDeps([22,1,2]),import.meta.url).then(C=>C.default||C.default||C)),mo=X(()=>h(()=>import("./Da0xxq-D.js"),__vite__mapDeps([23,24,25,1,2,3,26]),import.meta.url).then(C=>C.default||C.default||C)),no=X(()=>h(()=>import("./DELXZZEt.js"),__vite__mapDeps([27,28,1,2,24,25,3,29]),import.meta.url).then(C=>C.default||C.default||C)),Qo=X(()=>h(()=>import("./ylDgx30y.js"),__vite__mapDeps([30,1,2]),import.meta.url).then(C=>C.default||C.default||C)),ao=X(()=>h(()=>import("./AzOeli57.js"),__vite__mapDeps([28,1,2,24,25,3,29]),import.meta.url).then(C=>C.default||C.default||C)),No=X(()=>h(()=>import("./DQWkL3TL.js"),__vite__mapDeps([31,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Yo=X(()=>h(()=>import("./CqIiOrav.js"),__vite__mapDeps([32,24,25,1,2,3,26]),import.meta.url).then(C=>C.default||C.default||C)),wo=X(()=>h(()=>import("./CR6kahsu.js"),__vite__mapDeps([33,34,1,2,3,35]),import.meta.url).then(C=>C.default||C.default||C)),ho=X(()=>h(()=>import("./BUb06x1l.js"),__vite__mapDeps([36,1,2]),import.meta.url).then(C=>C.default||C.default||C)),eo=X(()=>h(()=>import("./CoYwTdUy.js"),__vite__mapDeps([37,38,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Jo=X(()=>h(()=>import("./6qYE1oVG.js"),__vite__mapDeps([39,40,1,2]),import.meta.url).then(C=>C.default||C.default||C)),So=X(()=>h(()=>import("./786k4G9l.js"),__vite__mapDeps([41,1,2,42,43,38,40,34,44,45,46,47,48]),import.meta.url).then(C=>C.default||C.default||C)),Xo=X(()=>h(()=>import("./DJuYQwSd.js"),__vite__mapDeps([7,3,1,2]),import.meta.url).then(C=>C.default||C.default||C)),yo=X(()=>h(()=>import("./apPbhtC2.js"),__vite__mapDeps([49,28,1,2,24,25,3,29,32,26]),import.meta.url).then(C=>C.default||C.default||C)),to=X(()=>h(()=>import("./Cp0iK4Nv.js"),__vite__mapDeps([50,44,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Do=X(()=>h(()=>import("./BWc2rs17.js"),__vite__mapDeps([51,45,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Mo=X(()=>h(()=>import("./Ci7tDuNS.js"),__vite__mapDeps([52,1,2,47]),import.meta.url).then(C=>C.default||C.default||C)),Ho=X(()=>h(()=>import("./C2W-hvWH.js"),__vite__mapDeps([53,1,2,3,26]),import.meta.url).then(C=>C.default||C.default||C)),uo=X(()=>h(()=>import("./Bbe_18vB.js"),__vite__mapDeps([54,1,2,55,3,56,57,20,21]),import.meta.url).then(C=>C.default||C.default||C)),po=X(()=>h(()=>import("./BOEKJY8X.js"),__vite__mapDeps([58,43,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Ko=X(()=>h(()=>import("./zvxOOzKT.js"),__vite__mapDeps([59,1,2]),import.meta.url).then(C=>C.default||C.default||C)),ko=X(()=>h(()=>import("./DLo2bnV2.js"),__vite__mapDeps([60,1,2]),import.meta.url).then(C=>C.default||C.default||C)),To=X(()=>h(()=>import("./BwfbGiNm.js"),__vite__mapDeps([61,41,1,2,42,43,38,40,34,44,45,46,47,48,62,63,3,64]),import.meta.url).then(C=>C.default||C.default||C)),zo=X(()=>h(()=>import("./DXSE01DY.js"),__vite__mapDeps([65,1,2,46]),import.meta.url).then(C=>C.default||C.default||C)),Lo=X(()=>h(()=>import("./Dr9oAN5u.js"),__vite__mapDeps([66,50,44,1,2,61,41,42,43,38,40,34,45,46,47,48,62,63,3,64,67,25]),import.meta.url).then(C=>C.default||C.default||C)),Eo=X(()=>h(()=>import("./BGuaUZZK.js"),__vite__mapDeps([68,46,1,2,3,69]),import.meta.url).then(C=>C.default||C.default||C)),ro=X(()=>h(()=>
5import("./BsDKlEvj.js"),__vite__mapDeps([70,1,2]),import.meta.url).then(C=>C.default||C.default||C)),jo=X(()=>h(()=>import("./CFRJxDbR.js"),__vite__mapDeps([71,72,28,1,2,24,25,3,29,73,74,75,19,20,48,26]),import.meta.url).then(C=>C.default||C.default||C)),Oo=X(()=>h(()=>import("./3_nEjdWT.js"),__vite__mapDeps([76,1,2,3,77]),import.meta.url).then(C=>C.default||C.default||C)),vo=X(()=>h(()=>import("./DFuMThnc.js"),__vite__mapDeps([78,79,1,2]),import.meta.url).then(C=>C.default||C.default||C)),xo=X(()=>h(()=>import("./B5o9ohXQ.js"),__vite__mapDeps([80,81,1,2,3,82,24,25]),import.meta.url).then(C=>C.default||C.default||C)),Po=X(()=>h(()=>import("./BTMKUr3n.js"),__vite__mapDeps([83,1,2]),import.meta.url).then(C=>C.default||C.default||C)),fo=X(()=>h(()=>import("./Oa6sasS3.js"),__vite__mapDeps([84,1,2]),import.meta.url).then(C=>C.default||C.default||C)),_o=X(()=>h(()=>import("./CIUvqjn2.js"),__vite__mapDeps([85,25,1,2,86]),import.meta.url).then(C=>C.default||C.default||C)),qo=X(()=>h(()=>import("./BZqk89uX.js"),__vite__mapDeps([74,75,19,20,1,2,48,3,26]),import.meta.url).then(C=>C.default||C.default||C)),$o=X(()=>h(()=>import("./RU0oN4hU.js"),__vite__mapDeps([87,3,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Im=X(()=>h(()=>import("./Dz-tdVST.js"),__vite__mapDeps([81,1,2,3,82]),import.meta.url).then(C=>NU(C.default||C.default||C))),gm=X(()=>h(()=>import("./aFIxpLxo.js"),__vite__mapDeps([79,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Cm=X(()=>h(()=>import("./DcD8QYTS.js"),__vite__mapDeps([88,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Am=X(()=>h(()=>import("./oapQfdAa.js"),__vite__mapDeps([15,1,2]),import.meta.url).then(C=>C.default||C.default||C)),lm=X(()=>h(()=>import("./vEWNtBZa.js"),__vite__mapDeps([89,22,1,2,79]),import.meta.url).then(C=>C.default||C.default||C)),dm=X(()=>h(()=>import("./CjGmH8U6.js"),__vite__mapDeps([90,1,2,42,3,91]),import.meta.url).then(C=>C.default||C.default||C)),Zm=X(()=>h(()=>import("./BzLBWv0D.js"),__vite__mapDeps([72,28,1,2,24,25,3,29,73]),import.meta.url).then(C=>C.default||C.default||C)),Bm=X(()=>h(()=>import("./DsF7hGQH.js"),__vite__mapDeps([92,28,1,2,24,25,3,29]),import.meta.url).then(C=>C.default||C.default||C)),cm=X(()=>h(()=>import("./D0ii4kUF.js"),__vite__mapDeps([93,1,2]),import.meta.url).then(C=>C.default||C.default||C)),im=X(()=>h(()=>import("./DSdfZPXS.js"),__vite__mapDeps([94,1,2,62,67,25,63]),import.meta.url).then(C=>C.default||C.default||C)),Fm=X(()=>h(()=>import("./Dtwpx4_8.js"),__vite__mapDeps([95,3,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Vm=X(()=>h(()=>import("./B6nNQJC6.js"),__vite__mapDeps([96,24,25,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Gm=X(()=>h(()=>import("./c5JoAsIL.js"),__vite__mapDeps([97,24,25,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Wm=X(()=>h(()=>import("./DLLKSwhn.js"),__vite__mapDeps([98,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Rm=X(()=>h(()=>import("./DerBzAsh.js"),__vite__mapDeps([99,28,1,2,24,25,3,29,55,56]),import.meta.url).then(C=>C.default||C.default||C)),sm=X(()=>h(()=>import("./l_zL22iS.js"),__vite__mapDeps([100,1,2]),import.meta.url).then(C=>C.default||C.default||C)),bm=X(()=>h(()=>import("./CkBJicpv.js"),__vite__mapDeps([101,102,24,25,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Um=X(()=>h(()=>import("./Bon0HfwF.js"),__vite__mapDeps([103,1,2]),import.meta.url).then(C=>C.default||C.default||C)),om=X(()=>h(()=>import("./DYLBneHj.js"),__vite__mapDeps([104,28,1,2,24,25,3,29,20,75,19]),import.meta.url).then(C=>C.default||C.default||C)),mm=X(()=>h(()=>import("./BtV8al_r.js"),__vite__mapDeps([105,28,1,2,24,25,3,29]),import.meta.url).then(C=>C.default||C.default||C)),nm=X(()=>h(()=>import("./CMUc4pl5.js"),__vite__mapDeps([106,100,1,2,24,25]),import.meta.url).then(C=>C.default||C.default||C)),Qm=X(()=>h(()=>import("./hDNcr3db.js"),__vite__mapDeps([107,1,2]),import.meta.url).then(C=>C.default||C.default||C)),am=X(()=>h(()=>import("./DQ8M3CbQ.js"),__vite__mapDeps([108,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Nm=X(()=>h(()=>
5import("./D2tP9rs2.js"),__vite__mapDeps([109,110,1,2,55,3,56,57,20,21,28,24,25,29,111,112,113,16]),import.meta.url).then(C=>C.default||C.default||C)),Ym=X(()=>h(()=>import("./BCZnxlqb.js"),__vite__mapDeps([114,108,1,2]),import.meta.url).then(C=>C.default||C.default||C)),wm=X(()=>h(()=>import("./BDJLSQek.js"),__vite__mapDeps([115,1,2]),import.meta.url).then(C=>C.default||C.default||C)),hm=X(()=>h(()=>import("./CaHnPaa6.js"),__vite__mapDeps([116,1,2]),import.meta.url).then(C=>C.default||C.default||C)),em=X(()=>h(()=>import("./T17EokH9.js"),__vite__mapDeps([117,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Jm=X(()=>h(()=>import("./BMuY5fG7.js"),__vite__mapDeps([110,1,2,55,3,56,57,20,21]),import.meta.url).then(C=>C.default||C.default||C)),Sm=X(()=>h(()=>import("./D83VhabT.js"),__vite__mapDeps([112,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Xm=X(()=>h(()=>import("./DKz1aTaa.js"),__vite__mapDeps([118,1,2]),import.meta.url).then(C=>C.default||C.default||C)),ym=X(()=>h(()=>import("./BkHkj-je.js"),__vite__mapDeps([113,1,2]),import.meta.url).then(C=>C.default||C.default||C)),tm=X(()=>h(()=>import("./Dd1dW8fd.js"),__vite__mapDeps([111,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Dm=X(()=>h(()=>import("./30cN7LOz.js"),__vite__mapDeps([119,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Mm=X(()=>h(()=>import("./BUhjCsfE.js"),__vite__mapDeps([120,28,1,2,24,25,3,29]),import.meta.url).then(C=>C.default||C.default||C)),Hm=X(()=>h(()=>import("./CAXLUn4_.js"),__vite__mapDeps([121,1,2]),import.meta.url).then(C=>C.default||C.default||C)),um=X(()=>h(()=>import("./BHnIrmE0.js"),__vite__mapDeps([122,28,1,2,24,25,3,29]),import.meta.url).then(C=>C.default||C.default||C)),pm=X(()=>h(()=>import("./DvOVWcJ1.js"),__vite__mapDeps([123,124,63,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Km=X(()=>h(()=>import("./B7mEHPmm.js"),__vite__mapDeps([125,1,2]),import.meta.url).then(C=>C.default||C.default||C)),km=X(()=>h(()=>import("./TSlbst7t.js"),__vite__mapDeps([126,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Tm=X(()=>h(()=>import("./BZn-Sb3c.js"),__vite__mapDeps([127,24,25,1,2]),import.meta.url).then(C=>C.default||C.default||C)),zm=X(()=>h(()=>import("./tWvGRTnw.js"),__vite__mapDeps([128,124,63,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Lm=X(()=>h(()=>import("./BhfciyRO.js"),__vite__mapDeps([129,1,2]),import.meta.url).then(C=>C.default||C.default||C)),Em=X(()=>h(()=>import("./BCWXWzOP.js"),__vite__mapDeps([130,1,2]),import.meta.url).then(C=>C.default||C.default||C)),rm=X(()=>h(()=>import("./Ltlqwl0p.js"),__vite__mapDeps([131,120,28,1,2,24,25,3,29,122,126,113]),import.meta.url).then(C=>C.default||C.default||C)),jm=X(()=>h(()=>import("./CQGqldER.js"),__vite__mapDeps([132,126,1,2,113,102,24,25]),import.meta.url).then(C=>C.default||C.default||C)),Om=X(()=>h(()=>import("./DBfrnyHQ.js"),__vite__mapDeps([133,120,28,1,2,24,25,3,29,122,127,126,113,102]),import.meta.url).then(C=>C.default||C.default||C)),vm=X(()=>h(()=>import("./DQoXUV1P.js"),__vite__mapDeps([134,24,25,1,2]),import.meta.url).then(C=>C.default||C.default||C)),xm=[["BasePopover",Uo],["BaseTitle",oo],["BaseVideo",mo],["BrandLine",no],["Collapse",Qo],["CustomImage",ao],["CustomStatic",No],["CustomVideo",Yo],["DocumentList",wo],["ExactDate",ho],["Faq",eo],["FooterMenu",Jo],["Icon",So],["LoginBackground",Xo],["Media",yo],["MessageBox",to],["NoData",Do],["Rate",Mo],["SelectColor",Ho],["ShareButton",uo],["TextView",po],["WhatsAppButton",Ko],["FormBase",ko],["FormBaseForm",To],["FormVariantFilter",zo],["FormVariantMessage",Lo],["FormVariantSearch",Eo],["Gallery",ro],["GalleryVariantMasonry",jo],["GoogleReview",Oo],["Hero",vo],["HeroVariantParallax",xo],["Map",Po],["MapVariantGoogle",fo],["MapVariantMapBox",_o],["Modal",qo],["ParalaxImage",$o],["Paralax",Im],["RenderComponent",gm],["RenderCustomComponent",Cm],["RenderItems",Am],["Slider",lm],["SliderVariantBase",dm],["SliderVariantImage",Zm],["CustomUINewsAdvInlineAd",Bm],["CustomUINewsAdvSidebarAd",cm],["CustomUINewsContactUsForm",im],["CustomUINewsAdvertisingFull",Fm],["CustomUINe
5wsAuthorSpotlight",Vm],["CustomUINewsCareers",Gm],["CustomUINewsFeed",Wm],["CustomUINewsFooter",Rm],["CustomUINewsHero",sm],["CustomUINewsJournalists",bm],["CustomUINewsListSection",Um],["CustomUINewsNavbar",om],["CustomUINewsPdfHero",mm],["CustomUINewsStories",nm],["CustomUINewsTextSection",Qm],["CustomUINewsDetailArticleItem",am],["CustomUINewsDetailArticleView",Nm],["CustomUINewsDetailFeed",Ym],["CustomUINewsDetailInlineAd",wm],["CustomUINewsDetailNavbar",hm],["CustomUINewsDetailPagination",em],["CustomUINewsDetailShareButton",Jm],["CustomUINewsDetailSidebarAd",Sm],["CustomUINewsDetailSidebarAuthors",Xm],["CustomUINewsDetailSidebarNewsletter",ym],["CustomUINewsDetailSidebarRelated",tm],["CustomUINewsDetailSidebarTrending",Dm],["CustomUINewsListArticleItem",Mm],["CustomUINewsListFooter",Hm],["CustomUINewsListInlineAd",um],["CustomUINewsListInlineGoogleAd",pm],["CustomUINewsListPagination",Km],["CustomUINewsListSidebarAd",km],["CustomUINewsListSidebarAuthors",Tm],["CustomUINewsListSidebarGoogleAd",zm],["CustomUINewsListSidebarNewsletter",Lm],["CustomUINewsListSidebarTrending",Em],["CustomUINewsListPage",rm],["CustomUINewsPagesAuthorList",jm],["CustomUINewsPagesList",Om],["CustomUINewsPagesWeekly",vm]],Pm=WI({name:"nuxt:global-components",setup(C){for(const[I,g]of xm)C.vueApp.component(I,g),C.vueApp.component("Lazy"+I,g)}}),Eg={dashboard:X(()=>h(()=>import("./BAwK0BnK.js"),__vite__mapDeps([135,1,2]),import.meta.url).then(C=>C.default||C)),dunyanews:X(()=>h(()=>import("./S-PFIqJe.js"),__vite__mapDeps([136,104,28,1,2,24,25,3,29,20,75,19,99,55,56,63]),import.meta.url).then(C=>C.default||C))},fm=WI({name:"nuxt:prefetch",setup(C){const I=HI();C.hooks.hook("app:mounted",()=>{I.beforeEach(async g=>{const A=g?.meta?.layout;A&&typeof Eg[A]=="function"&&await Eg[A]()})}),C.hooks.hook("link:prefetch",g=>{if(Ug(g))return;const A=I.resolve(g);if(!A)return;const l=A.meta.layout;let d=Pi(A.meta.middleware);d=d.filter(Z=>typeof Z=="string");for(const Z of d)typeof fd[Z]=="function"&&fd[Z]();typeof l=="string"&&l in Eg&&_U(Eg[l])})}});function ad(...C){window.dataLayer?.push(arguments)}function _m({tags:C}){window.dataLayer=window.dataLayer||[];for(const I of C)for(const g of I.initCommands??[])ad(...g);ad("js",new Date);for(const I of C)ad("config",I.id,I.config??{})}function qm(C){const I=Ml(C),g=I.tags.filter(Boolean).map(A=>typeof A=="string"?{id:A}:A);if(I.id){const{id:A,config:l,initCommands:d}=I;g.unshift({id:A,config:l,initCommands:d})}return g}const $m=WI({parallel:!0,setup(){const C=og().public.gtag,I=qm(C);if(!I.length||(_m({tags:I}),C.initMode==="manual"))return;const g=C.loadingStrategy==="async"?"async":"defer";Kl({link:[{rel:"preload",as:"script",href:cl(C.url,{id:I[0].id})}],script:[{src:cl(C.url,{id:I[0].id}),[g]:!0,"data-gtag":""}]})}});function In(C,I){if(C==null)return;let g=C;for(let A=0;A<I.length;A++){if(g===void 0||g[I[A]]===void 0)return;if(g===null||g[I[A]]===null)return null;g=g[I[A]]}return g}function DZ(C,I,g){if(g.length===0)return I;const A=g[0];return g.length>1&&(I=DZ(typeof C!="object"||C===null||!Object.prototype.hasOwnProperty.call(C,A)?Number.isInteger(Number(g[1]))?[]:{}:C[A],I,Array.prototype.slice.call(g,1))),Number.isInteger(Number(A))&&Array.isArray(C)?C.slice()[A]:Object.assign({},C,{[A]:I})}function iF(C,I){if(C==null||I.length===0)return C;if(I.length===1){if(C==null)return C;if(Number.isInteger(I[0])&&Array.isArray(C))return Array.prototype.slice.call(C,0).splice(I[0],1);const g={};for(const A in C)g[A]=C[A];return delete g[I[0]],g}if(C[I[0]]==null){if(Number.isInteger(I[0])&&Array.isArray(C))return Array.prototype.concat.call([],C);const g={};for(const A in C)g[A]=C[A];return g}return DZ(C,iF(C[I[0]],Array.prototype.slice.call(I,1)),[I[0]])}function FF(C,I){return I.map(g=>g.split(".")).map(g=>[g,In(C,g)]).filter(g=>g[1]!==void 0).reduce((g,A)=>DZ(g,A[1],A[0]),{})}function VF(C,I){return I.map(g=>g.split(".")).reduce((g,A)=>iF(g,A),C)}function T0(C,{storage:I,serializer:g,key:A,debug:l,pick:d,omit:Z,beforeHydrate:B,afterHydrate:c},i,F=!0){try{F&&B?.(i);const V=I.getItem(A);if(V){const W=g.deserialize(V),G=d?FF(W,d):W,R=Z?VF(G,Z):G;C.$patch(R)}F&&c?.(i)}catch{}}function z0(C,{storage:I,serializer:g,key:A,debug:l,pick:d,omit:Z}){try{const B=d?FF(C,d):C,c=Z?VF(B,Z):B,i=g.serialize(c);I.setItem(A,i)}catch{}}function gn(C,I){return typeof C=="function"?C(I):typeof C=="string"?C:I}function Cn(C,I,g){const{pinia:A,store:l,options:{persist:d=g}}=C;if(!d)return;
5if(!(l.$id in A.state.value)){const B=A._s.get(l.$id.replace("__hot:",""));B&&Promise.resolve().then(()=>B.$persist());return}const Z=(Array.isArray(d)?d:d===!0?[{}]:[d]).map(I);l.$hydrate=({runHooks:B=!0}={})=>{Z.forEach(c=>{T0(l,c,C,B)})},l.$persist=()=>{Z.forEach(B=>{z0(l.$state,B)})},Z.forEach(B=>{T0(l,B,C),l.$subscribe((c,i)=>z0(i,B),{detached:!0})})}function An(C={}){return function(I){Cn(I,g=>{const A=gn(g.key,I.store.$id);return{key:(C.key?C.key:l=>l)(A),debug:g.debug??C.debug??!1,serializer:g.serializer??C.serializer??{serialize:l=>JSON.stringify(l),deserialize:l=>JSON.parse(l)},storage:g.storage??C.storage??window.localStorage,beforeHydrate:g.beforeHydrate??C.beforeHydrate,afterHydrate:g.afterHydrate??C.afterHydrate,pick:g.pick,omit:g.omit}},C.auto??!1)}}function L0(C){return{getItem:I=>C?.readonly?Il(I,{...C,encode:encodeURIComponent,decode:decodeURIComponent,readonly:!0}).value:Il(I,{...C,encode:encodeURIComponent,decode:decodeURIComponent,readonly:!1}).value,setItem:(I,g)=>{if(C?.readonly)throw new Error("Cannot set a readonly cookie.");Il(I,{...C,encode:encodeURIComponent,decode:decodeURIComponent,readonly:!1}).value=g}}}function ln(){return{getItem:C=>CI().ssrContext?null:localStorage.getItem(C),setItem:(C,I)=>{CI().ssrContext||localStorage.setItem(C,I)}}}function dn(){return{getItem:C=>CI().ssrContext?null:sessionStorage.getItem(C),setItem:(C,I)=>{CI().ssrContext||sessionStorage.setItem(C,I)}}}const E0={localStorage:ln(),sessionStorage:dn(),cookies:L0(),cookiesWithOptions:L0},Zn=WI(C=>{const{cookieOptions:I,debug:g,storage:A}=og().public.persistedState;C.$pinia.use(An({storage:A==="cookies"?E0.cookiesWithOptions(I):E0[A],debug:g}))}),Bn=WI(async()=>{let C,I;const{default:g}=([C,I]=Og(()=>h(()=>import("./B1xJCNVl.js"),[],import.meta.url)),C=await C,I(),C),A=g(window);return{provide:{sanitizeHtml:(d,Z)=>d?A.sanitize(d,Z):""}}});function GF(C){return C&&C.__esModule&&Object.prototype.hasOwnProperty.call(C,"default")?C.default:C}var zA={exports:{}},r0;function cn(){if(r0)return zA.exports;r0=1;function C(){}return C.prototype={on:function(I,g,A){var l=this.e||(this.e={});return(l[I]||(l[I]=[])).push({fn:g,ctx:A}),this},once:function(I,g,A){var l=this;function d(){l.off(I,d),g.apply(A,arguments)}return d._=g,this.on(I,d,A)},emit:function(I){var g=[].slice.call(arguments,1),A=((this.e||(this.e={}))[I]||[]).slice(),l=0,d=A.length;for(l;l<d;l++)A[l].fn.apply(A[l].ctx,g);return this},off:function(I,g){var A=this.e||(this.e={}),l=A[I],d=[];if(l&&g)for(var Z=0,B=l.length;Z<B;Z++)l[Z].fn!==g&&l[Z].fn._!==g&&d.push(l[Z]);return d.length?A[I]=d:delete A[I],this}},zA.exports=C,zA.exports.TinyEmitter=C,zA.exports}var Fn=cn(),Vn=GF(Fn),Nd,j0;function Gn(){if(j0)return Nd;j0=1,Nd=function(g,A,l){l||(typeof A=="function"?(l=A,A=null):l=C);var d=g&&g.length;if(!d)return l(null,[]);var Z=!1,B=new Array(d);g.forEach(A?function(i,F){i.call(A,c(F))}:function(i,F){i(c(F))});function c(i){return function(F,V){if(!Z){if(F){l(F,B),Z=!0;return}B[i]=V,--d||l(null,B)}}}};function C(){}return Nd}var Wn=Gn(),Rn=GF(Wn);function lg(C){return parseFloat(C)||0}class YA{constructor(I,g){this.x=lg(I),this.y=lg(g)}static equals(I,g){return I.x===g.x&&I.y===g.y}}class ZA{constructor(I,g,A,l,d){this.id=d,this.left=I,this.top=g,this.width=A,this.height=l}static intersects(I,g){return I.left<g.left+g.width&&g.left<I.left+I.width&&I.top<g.top+g.height&&g.top<I.top+I.height}}var ng={BASE:"shuffle",SHUFFLE_ITEM:"shuffle-item",VISIBLE:"shuffle-item--visible",HIDDEN:"shuffle-item--hidden"};let O0=0;class bI{constructor(I,g){O0+=1,this.id=O0,this.element=I,this.isRTL=g,this.isVisible=!0,this.isHidden=!1}show(){this.isVisible=!0,this.element.classList.remove(ng.HIDDEN),this.element.classList.add(ng.VISIBLE),this.element.removeAttribute("aria-hidden")}hide(){this.isVisible=!1,this.element.classList.remove(ng.VISIBLE),this.element.classList.add(ng.HIDDEN),this.element.setAttribute("aria-hidden",!0)}init(){this.addClasses([ng.SHUFFLE_ITEM,ng.VISIBLE]),this.applyCss(bI.Css.INITIAL),this.applyCss(this.isRTL?bI.Css.DIRECTION.rtl:bI.Css.DIRECTION.ltr),this.scale=bI.Scale.VISIBLE,this.point=new YA}addClasses(I){I.forEach(g=>{this.element.classList.add(g)})}removeClasses(I){I.forEach(g=>{this.element.classList.remove(g)})}
5applyCss(I){Object.keys(I).forEach(g=>{this.element.style[g]=I[g]})}dispose(){this.removeClasses([ng.HIDDEN,ng.VISIBLE,ng.SHUFFLE_ITEM]),this.element.removeAttribute("style"),this.element=null}}bI.Css={INITIAL:{position:"absolute",top:0,visibility:"visible",willChange:"transform"},DIRECTION:{ltr:{left:0},rtl:{right:0}},VISIBLE:{before:{opacity:1,visibility:"visible"},after:{transitionDelay:""}},HIDDEN:{before:{opacity:0},after:{visibility:"hidden",transitionDelay:""}}};bI.Scale={VISIBLE:1,HIDDEN:.001};let LA=null;var v0=()=>{if(LA!==null)return LA;const C=document.body||document.documentElement,I=document.createElement("div");I.style.cssText="width:10px;padding:2px;box-sizing:border-box;",C.appendChild(I);const{width:g}=window.getComputedStyle(I,null);return LA=Math.round(lg(g))===10,C.removeChild(I),LA};function dC(C,I,g=window.getComputedStyle(C,null)){let A=lg(g[I]);return!v0()&&I==="width"?A+=lg(g.paddingLeft)+lg(g.paddingRight)+lg(g.borderLeftWidth)+lg(g.borderRightWidth):!v0()&&I==="height"&&(A+=lg(g.paddingTop)+lg(g.paddingBottom)+lg(g.borderTopWidth)+lg(g.borderBottomWidth)),A}function sn(C){let I=C.length;for(;I;){I-=1;const g=Math.floor(Math.random()*(I+1)),A=C[g];C[g]=C[I],C[I]=A}return C}const bn={reverse:!1,by:null,compare:null,randomize:!1,key:"element"};function gl(C,I){const g={...bn,...I},A=Array.from(C);let l=!1;return C.length?g.randomize?sn(C):(typeof g.by=="function"?C.sort((d,Z)=>{if(l)return 0;const B=g.by(d[g.key]),c=g.by(Z[g.key]);return B===void 0&&c===void 0?(l=!0,0):B<c||B==="sortFirst"||c==="sortLast"?-1:B>c||B==="sortLast"||c==="sortFirst"?1:0}):typeof g.compare=="function"&&C.sort(g.compare),l?A:(g.reverse&&C.reverse(),C)):[]}const IA={},MZ="transitionend";let x0=0;function Un(){return x0+=1,MZ+x0}function WF(C){return IA[C]?(IA[C].element.removeEventListener(MZ,IA[C].listener),IA[C]=null,!0):!1}function on(C,I){const g=Un(),A=l=>{l.currentTarget===l.target&&(WF(g),I(l))};return C.addEventListener(MZ,A),IA[g]={element:C,listener:A},g}function RF(C){return Math.max(...C)}function mn(C){return Math.min(...C)}function sF(C,I,g,A){let l=C/I;return Math.abs(Math.round(l)-l)<A&&(l=Math.round(l)),Math.min(Math.ceil(l),g)}function bF(C,I,g){if(I===1)return C;const A=[];for(let l=0;l<=g-I;l++)A.push(RF(C.slice(l,l+I)));return A}function UF(C,I){const g=mn(C);for(let A=0,l=C.length;A<l;A++)if(C[A]>=g-I&&C[A]<=g+I)return A;return 0}function nn({itemSize:C,positions:I,gridSize:g,total:A,threshold:l,buffer:d}){const Z=sF(C.width,g,A,l),B=bF(I,Z,A),c=UF(B,d),i=new YA(g*c,B[c]),F=B[c]+C.height;for(let V=0;V<Z;V++)I[c+V]=F;return i}function oF(C,I){const g={};C.forEach(Z=>{g[Z.top]?g[Z.top].push(Z):g[Z.top]=[Z]});let A=[];const l=[],d=[];return Object.keys(g).forEach(Z=>{const B=g[Z];l.push(B);const c=B[B.length-1],i=c.left+c.width,F=Math.round((I-i)/2);let V=B,W=!1;if(F>0){const G=[];W=B.every(R=>{const s=new ZA(R.left+F,R.top,R.width,R.height,R.id),Q=!A.some(m=>ZA.intersects(s,m));return G.push(s),Q}),W&&(V=G)}if(!W){let G;if(B.some(s=>A.some(Q=>{const m=ZA.intersects(s,Q);return m&&(G=Q),m}))){const s=d.findIndex(Q=>Q.includes(G));d.splice(s,1,l[s])}}A=A.concat(V),d.push(V)}),d.flat().sort((Z,B)=>Z.id-B.id).map(Z=>new YA(Z.left,Z.top))}function Qn(C){return C.replace(/([A-Z])/g,(I,g)=>`-${g.toLowerCase()}`)}function P0(C){return Array.from(new Set(C))}let f0=0;class P extends Vn{constructor(I,g={}){super(),this.options={...P.options,...g},this.lastSort={},this.group=P.ALL_ITEMS,this.lastFilter=P.ALL_ITEMS,this.isEnabled=!0,this.isDestroyed=!1,this.isInitialized=!1,this._transitions=[],this.isTransitioning=!1,this._queue=[];const A=this._getElementOption(I);if(!A)throw new TypeError("Shuffle needs to be initialized with an element.");this.element=A,this.id=`shuffle_${f0}`,f0+=1,this._init(),this.isInitialized=!0}_init(){if(this.items=this._getItems(),this.sortedItems=this.items,this.options.sizer=this._getElementOption(this.options.sizer),this.element.classList.add(P.Classes.BASE),this._initItems(this.items),document.readyState!=="complete"){const A=this.layout.bind(this);window.addEventListener("load",function l(){window.removeEventListener("load",l),A()})}const I=window.getComputedStyle(this.element,null),g=P.getSize(this.element).width;
5this._validateStyles(I),this._setColumns(g),this.filter(this.options.group,this.options.initialSort),this._rafId=null,"ResizeObserver"in window&&(this._resizeObserver=new ResizeObserver(this._handleResizeCallback.bind(this)),this._resizeObserver.observe(this.element)),this.element.offsetWidth,this.setItemTransitions(this.items),this.element.style.transition=`height ${this.options.speed}ms ${this.options.easing}`}_getElementOption(I){return typeof I=="string"?this.element.querySelector(I):I&&I.nodeType&&I.nodeType===1?I:I&&I.jquery?I[0]:null}_validateStyles(I){I.position==="static"&&(this.element.style.position="relative"),I.overflow!=="hidden"&&(this.element.style.overflow="hidden")}_filter(I=this.lastFilter,g=this.items){const A=this._getFilteredSets(I,g);return this._toggleFilterClasses(A),this.lastFilter=I,typeof I=="string"&&(this.group=I),A}_getFilteredSets(I,g){let A=[];const l=[];return I===P.ALL_ITEMS?A=g:g.forEach(d=>{this._doesPassFilter(I,d.element)?A.push(d):l.push(d)}),{visible:A,hidden:l}}_doesPassFilter(I,g){if(typeof I=="function")return I.call(g,g,this);const A=g.dataset[P.FILTER_ATTRIBUTE_KEY],l=this.options.delimiter?A.split(this.options.delimiter):JSON.parse(A);function d(Z){return l.includes(Z)}return Array.isArray(I)?this.options.filterMode===P.FilterMode.ANY?I.some(d):I.every(d):l.includes(I)}_toggleFilterClasses({visible:I,hidden:g}){I.forEach(A=>{A.show()}),g.forEach(A=>{A.hide()})}_initItems(I){I.forEach(g=>{g.init()})}_disposeItems(I){I.forEach(g=>{g.dispose()})}_updateItemCount(){this.visibleItems=this._getFilteredItems().length}setItemTransitions(I){const{speed:g,easing:A}=this.options,l=this.options.useTransforms?["transform"]:["top","left"],d=Object.keys(bI.Css.HIDDEN.before).map(B=>Qn(B)),Z=l.concat(d).join();I.forEach(B=>{B.element.style.transitionDuration=`${g}ms`,B.element.style.transitionTimingFunction=A,B.element.style.transitionProperty=Z})}_getItems(){return Array.from(this.element.children).filter(I=>I.matches(this.options.itemSelector)).map(I=>new bI(I,this.options.isRTL))}_mergeNewItems(I){const g=Array.from(this.element.children);return gl(this.items.concat(I),{by(A){return g.indexOf(A)}})}_getFilteredItems(){return this.items.filter(I=>I.isVisible)}_getConcealedItems(){return this.items.filter(I=>!I.isVisible)}_getColumnSize(I,g){let A;return typeof this.options.columnWidth=="function"?A=this.options.columnWidth(I):this.options.sizer?A=P.getSize(this.options.sizer).width:this.options.columnWidth?A=this.options.columnWidth:this.items.length>0?A=P.getSize(this.items[0].element,!0).width:A=I,A===0&&(A=I),A+g}_getGutterSize(I){let g;return typeof this.options.gutterWidth=="function"?g=this.options.gutterWidth(I):this.options.sizer?g=dC(this.options.sizer,"marginLeft"):g=this.options.gutterWidth,g}_setColumns(I=P.getSize(this.element).width){const g=this._getGutterSize(I),A=this._getColumnSize(I,g);let l=(I+g)/A;Math.abs(Math.round(l)-l)<this.options.columnThreshold&&(l=Math.round(l)),this.cols=Math.max(Math.floor(l||0),1),this.containerWidth=I,this.colWidth=A}_setContainerSize(){this.element.style.height=`${this._getContainerSize()}px`}_getContainerSize(){return RF(this.positions)}_getStaggerAmount(I){return Math.min(I*this.options.staggerAmount,this.options.staggerAmountMax)}_dispatch(I,g={}){this.isDestroyed||(g.shuffle=this,this.emit(I,g))}_resetCols(){let I=this.cols;for(this.positions=[];I;)I-=1,this.positions.push(0)}_layout(I){const g=this._getNextPositions(I);let A=0;I.forEach((l,d)=>{function Z(){l.applyCss(bI.Css.VISIBLE.after)}if(YA.equals(l.point,g[d])&&!l.isHidden){l.applyCss(bI.Css.VISIBLE.before),Z();return}l.point=g[d],l.scale=bI.Scale.VISIBLE,l.isHidden=!1;const B=this.getStylesForTransition(l,bI.Css.VISIBLE.before);B.transitionDelay=`${this._getStaggerAmount(A)}ms`,this._queue.push({item:l,styles:B,callback:Z}),A+=1})}_getNextPositions(I){if(this.options.isCentered){const g=I.map((A,l)=>{const d=P.getSize(A.element,!0),Z=this._getItemPosition(d);return new ZA(Z.x,Z.y,d.width,d.height,l)});return this.getTransformedPositions(g,this.containerWidth)}return I.map(g=>this._getItemPosition(P.getSize(g.element,!0)))}_getItemPosition(I){return nn({itemSize:I,positions:this.positions,gridSize:this.colWidth,total:this.cols,threshold:this.options.columnThreshold,buffer:this.options.buffer})}getTransformedPositions(I,g){return oF(I,g)}_shrink(I=this._getConcealedItems()){let g=0;I.forEach(A=>{function l(){A.applyCss(bI.Css.HIDDEN.after)}if(A.isHidden){A.applyCss(bI.Css.HIDDEN.before),l();return}A.scale=bI.Scale.HIDDEN,A.isHidden=!0;const d=this.getStylesForTransition(A,bI.Css.HIDDEN.before);d.transitionDelay=`${this._getStaggerAmount(g)}ms`,this._queue.push({item:A,styles:d,callback:l}),g+=1})}_handleResizeCallback(I){if(!(!this.isEnabled||this.isDestroyed))for(const g of I)Math.round(g.contentRect.width)!==Math.round(this.containerWidth)&&(cancelAnimationFrame(this._rafId),this._rafId=requestAnimationFrame(this.update.bind(this)))}getStylesForTransition(I,g){const A={...g};if(this.options.useTransforms){const l=this.options.isRTL?"-":"",d=this.options.roundTransforms?Math.round(I.point.x):I.point.x,Z=this.options.roundTransforms?Math.round(I.point.y):I.point.y;A.transform=`translate(${l}${d}px, ${Z}px) scale(${I.scale})`}else this.options.isRTL?A.right=`${I.point.x}px`:A.left=`${I.point.x}px`,A.top=`${I.point.y}px`;return A}_whenTransitionDone(I,g,A){const l=on(I,d=>{g(),A(null,d)});this._transitions.push(l)}_getTransitionFunction(I){return g=>{I.item.applyCss(I.styles),this._whenTransitionDone(I.item.element,I.callback,g)}}_processQueue(){this.isTransitioning&&this._cancelMovement();const I=this.options.speed>0,g=this._queue.length>0;g&&I&&this.isInitialized?this._startTransitions(this._queue):g?(this._styleImmediately(this._queue),this._dispatch(P.EventType.LAYOUT)):this._dispatch(P.EventType.LAYOUT),this._queue.length=0}_startTransitions(I){this.isTransitioning=!0;const g=I.map(A=>this._getTransitionFunction(A));Rn(g,this._movementFinished.bind(this))}_cancelMovement(){this._transitions.forEach(WF),this._transitions.length=0,this.isTransitioning=!1}
5_styleImmediately(I){if(I.length){const g=I.map(A=>A.item.element);P._skipTransitions(g,()=>{I.forEach(A=>{A.item.applyCss(A.styles),A.callback()})})}}_movementFinished(){this._transitions.length=0,this.isTransitioning=!1,this._dispatch(P.EventType.LAYOUT)}filter(I,g){this.isEnabled&&((!I||I&&I.length===0)&&(I=P.ALL_ITEMS),this._filter(I),this._shrink(),this._updateItemCount(),this.sort(g))}sort(I=this.lastSort){if(!this.isEnabled)return;this._resetCols();const g=gl(this._getFilteredItems(),I);this.sortedItems=g,this._layout(g),this._processQueue(),this._setContainerSize(),this.lastSort=I}update({recalculateSizes:I=!0,force:g=!1}={}){(this.isEnabled||g)&&(I&&this._setColumns(),this.sort())}layout(){this.update({recalculateSizes:!0})}add(I){const g=P0(I).map(i=>new bI(i,this.options.isRTL));this._initItems(g),this._resetCols();const A=this._mergeNewItems(g),l=gl(A,this.lastSort),d=this._filter(this.lastFilter,l),Z=i=>g.includes(i),B=i=>{i.scale=bI.Scale.HIDDEN,i.isHidden=!0,i.applyCss(bI.Css.HIDDEN.before),i.applyCss(bI.Css.HIDDEN.after)},c=this._getNextPositions(d.visible);d.visible.forEach((i,F)=>{Z(i)&&(i.point=c[F],B(i),i.applyCss(this.getStylesForTransition(i,{})))}),d.hidden.forEach(i=>{Z(i)&&B(i)}),this.element.offsetWidth,this.setItemTransitions(g),this.items=this._mergeNewItems(g),this.filter(this.lastFilter)}disable(){this.isEnabled=!1}enable(I=!0){this.isEnabled=!0,I&&this.update()}remove(I){if(!I.length)return;const g=P0(I),A=g.map(d=>this.getItemByElement(d)).filter(d=>!!d),l=()=>{this._disposeItems(A),g.forEach(d=>{d.parentNode.removeChild(d)}),this._dispatch(P.EventType.REMOVED,{collection:g})};this._toggleFilterClasses({visible:[],hidden:A}),this._shrink(A),this.sort(),this.items=this.items.filter(d=>!A.includes(d)),this._updateItemCount(),this.once(P.EventType.LAYOUT,l)}getItemByElement(I){return this.items.find(g=>g.element===I)}resetItems(){this._disposeItems(this.items),this.isInitialized=!1,this.items=this._getItems(),this._initItems(this.items),this.once(P.EventType.LAYOUT,()=>{this.setItemTransitions(this.items),this.isInitialized=!0}),this.filter(this.lastFilter)}destroy(){this._cancelMovement(),this._resizeObserver&&(this._resizeObserver.unobserve(this.element),this._resizeObserver=null),this.element.classList.remove("shuffle"),this.element.removeAttribute("style"),this._disposeItems(this.items),this.items.length=0,this.sortedItems.length=0,this._transitions.length=0,this.options.sizer=null,this.element=null,this.isDestroyed=!0,this.isEnabled=!1}static getSize(I,g=!1){const A=window.getComputedStyle(I,null);let l=dC(I,"width",A),d=dC(I,"height",A);if(g){const Z=dC(I,"marginLeft",A),B=dC(I,"marginRight",A),c=dC(I,"marginTop",A),i=dC(I,"marginBottom",A);l+=Z+B,d+=c+i}return{width:l,height:d}}static _skipTransitions(I,g){const l=I.map(d=>{const{style:Z}=d,B=Z.transitionDuration,c=Z.transitionDelay;return Z.transitionDuration="0ms",Z.transitionDelay="0ms",{duration:B,delay:c}});g(),I[0].offsetWidth,I.forEach((d,Z)=>{d.style.transitionDuration=l[Z].duration,d.style.transitionDelay=l[Z].delay})}}P.ShuffleItem=bI;P.ALL_ITEMS="all";P.FILTER_ATTRIBUTE_KEY="groups";P.EventType={LAYOUT:"shuffle:layout",REMOVED:"shuffle:removed"};P.Classes=ng;P.FilterMode={ANY:"any",ALL:"all"};P.options={group:P.ALL_ITEMS,speed:250,easing:"cubic-bezier(0.4, 0.0, 0.2, 1)",itemSelector:"*",sizer:null,gutterWidth:0,columnWidth:0,delimiter:null,buffer:0,columnThreshold:.01,initialSort:null,staggerAmount:15,staggerAmountMax:150,useTransforms:!0,filterMode:P.FilterMode.ANY,isCentered:!1,isRTL:!1,roundTransforms:!0};P.Point=YA;P.Rect=ZA;P.__sorter=gl;P.__getColumnSpan=sF;P.__getAvailablePositions=bF;P.__getShortColumn=UF;P.__getCenteredPositions=oF;class an{element;shuffle;_activeFilters;constructor(I){I&&(this.element=I,this.shuffle=new P(I,{itemSelector:".picture-item"}),this.addShuffleEventListeners(),this._activeFilters=[],this.addFilterButtons())}addShuffleEventListeners(){const{EventType:I}=P;this.shuffle.on(I.LAYOUT,()=>{}),this.shuffle.on(I.REMOVED,()=>{})}load(){this.shuffle.filter("1")}addFilterButtons(){const I=document.querySelector(".filter-options");
5if(!I)return;const g=Array.from(I.children),A=this._handleFilterClick.bind(this);g.forEach(l=>{l.addEventListener("click",A,!1)})}_handleFilterClick(I){const g=I.currentTarget,A=g.classList.contains("active"),l=g.getAttribute("data-group");this._removeActiveClassFromChildren(g.parentNode);let d;A?(g.classList.remove("active"),d="1"):(g.classList.add("active"),d=l),this.shuffle.filter(d)}_removeActiveClassFromChildren(I){const{children:g}=I;for(let A=g.length-1;A>=0;A--)g[A].classList.remove("active")}}const Nn=WI(()=>({provide:{shuffle:C=>new an(C)}}));function uI(C,I,g,A){var l=arguments.length,d=l<3?I:A,Z;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")d=Reflect.decorate(C,I,g,A);else for(var B=C.length-1;B>=0;B--)(Z=C[B])&&(d=(l<3?Z(d):l>3?Z(I,g,d):Z(I,g))||d);return l>3&&d&&Object.defineProperty(I,g,d),d}function Cl(C,I,g,A){function l(d){return d instanceof g?d:new g(function(Z){Z(d)})}return new(g||(g=Promise))(function(d,Z){function B(F){try{i(A.next(F))}catch(V){Z(V)}}function c(F){try{i(A.throw(F))}catch(V){Z(V)}}function i(F){F.done?d(F.value):l(F.value).then(B,c)}i((A=A.apply(C,[])).next())})}function mF(C){return C.replace(/[A-Z]+/g,I=>`-${I}`).replace(/^-/,"").toLowerCase()}function UC(C){return function(I,g){const A=mF(g);I.addObservedAttribute&&I.addObservedAttribute(A),Object.defineProperty(I,g,{get(){return this.getAttribute(A)},set(l){l==null?this.removeAttribute(A):this.setAttribute(A,l),this.notifyPropertyChanged(g)},enumerable:!0,configurable:!0})}}function Yn(C){return function(I,g){const A=mF(g);I.addObservedAttribute&&I.addObservedAttribute(A),Object.defineProperty(I,g,{get(){return this.hasAttribute(A)},set(l){l?this.setAttribute(A,""):this.removeAttribute(A),this.notifyPropertyChanged(g)},enumerable:!0,configurable:!0})}}function HZ(C){return function(I,g){Object.defineProperty(I,g,{get(){return this[`$__${g}`]},set(A){this[`$__${g}`]=A,this.notifyPropertyChanged(g)},enumerable:!0,configurable:!0})}}function cI(C){return function(I,g){Object.defineProperty(I,C,{get(){return this[g]},set(A){this[g]=A},enumerable:!0,configurable:!1})}}let Yd={};function wn(C){const I=Yd[C];
5if(I)return I;const g=new Promise((A,l)=>{const d=document.createElement("script");d.src=C,d.async=!0;const Z=()=>{A()},B=()=>{c(),delete Yd[C],d.remove(),l(new Error(`Unable to load script ${C}`))};d.addEventListener("load",Z),d.addEventListener("error",B),document.body.appendChild(d);function c(){d.removeEventListener("load",Z),d.removeEventListener("error",B)}});return Yd[C]=g,g}class hn{constructor(I){this.handleClick=g=>Cl(this,void 0,void 0,function*(){const A=this.config;if(!A)throw new Error("google-pay-button: Missing configuration");const l=this.createLoadPaymentDataRequest(A);try{if(A.onClick&&A.onClick(g),g.defaultPrevented)return;const d=yield this.client.loadPaymentData(l);A.onLoadPaymentData&&A.onLoadPaymentData(d)}catch(d){d.statusCode==="CANCELED"?A.onCancel&&A.onCancel(d):A.onError&&A.onError(d)}}),this.options=I}getElement(){return this.element}isGooglePayLoaded(){var I,g;return"google"in(window||global)&&!!(!((g=(I=google==null?void 0:google.payments)===null||I===void 0?void 0:I.api)===null||g===void 0)&&g.PaymentsClient)}mount(I){var g;return Cl(this,void 0,void 0,function*(){if(!this.isGooglePayLoaded())try{yield wn("https://pay.google.com/gp/p/js/pay.js")}catch(A){!((g=this.config)===null||g===void 0)&&g.onError&&this.config.onError(A);return}this.element=I,I&&(this.appendStyles(),this.config&&this.updateElement())})}unmount(){this.element=void 0}configure(I){let g;return this.config=I,(!this.oldInvalidationValues||this.isClientInvalidated(I))&&(g=this.updateElement()),this.oldInvalidationValues=this.getInvalidationValues(I),g??Promise.resolve()}createClientOptions(I){const g={environment:I.environment,merchantInfo:this.createMerchantInfo(I)};return(I.onPaymentDataChanged||I.onPaymentAuthorized)&&(g.paymentDataCallbacks={},I.onPaymentDataChanged&&(g.paymentDataCallbacks.onPaymentDataChanged=A=>I.onPaymentDataChanged(A)||{}),I.onPaymentAuthorized&&(g.paymentDataCallbacks.onPaymentAuthorized=A=>I.onPaymentAuthorized(A)||{})),g}createIsReadyToPayRequest(I){const g=I.paymentRequest;return{apiVersion:g.apiVersion,apiVersionMinor:g.apiVersionMinor,allowedPaymentMethods:g.allowedPaymentMethods,existingPaymentMethodRequired:I.existingPaymentMethodRequired}}createLoadPaymentDataRequest(I){return Object.assign(Object.assign({},I.paymentRequest),{merchantInfo:this.createMerchantInfo(I)})}createMerchantInfo(I){const g=Object.assign({},I.paymentRequest.merchantInfo);return g.softwareInfo||(g.softwareInfo={id:this.options.softwareInfoId,version:this.options.softwareInfoVersion}),g}isMounted(){return this.element!=null&&this.element.isConnected!==!1}removeButton(){if(this.element instanceof ShadowRoot||this.element instanceof Element)for(const I of Array.from(this.element.children))I.tagName!=="STYLE"&&I.remove()}updateElement(){return Cl(this,void 0,void 0,function*(){if(!this.isMounted())return;const I=this.getElement();if(!this.config)throw new Error("google-pay-button: Missing configuration");this.removeButton();try{this.client=new google.payments.api.PaymentsClient(this.createClientOptions(this.config))}catch(B){this.config.onError&&this.config.onError(B);return}const g={buttonType:this.config.buttonType,buttonColor:this.config.buttonColor,buttonRadius:this.config.buttonRadius,buttonSizeMode:this.config.buttonSizeMode,buttonLocale:this.config.buttonLocale,buttonBorderType:this.config.buttonBorderType,onClick:this.handleClick,allowedPaymentMethods:this.config.paymentRequest.allowedPaymentMethods},A=I.getRootNode();A instanceof ShadowRoot&&(g.buttonRootNode=A);const l=this.client.createButton(g);this.setClassName(I,[I.className,"not-ready"]),I.appendChild(l);let d=!1,Z;try{Z=yield this.client.isReadyToPay(this.createIsReadyToPayRequest(this.config)),d=Z.result&&!this.config.existingPaymentMethodRequired||Z.result&&Z.paymentMethodPresent&&this.config.existingPaymentMethodRequired||!1}catch(B){this.config.onError&&this.config.onError(B)}if(this.isMounted()){if(d){try{this.client.prefetchPaymentData(this.createLoadPaymentDataRequest(this.config))}catch{}this.setClassName(I,(I.className||"").split(" ").filter(B=>B&&B!=="not-ready"))}if((this.isReadyToPay!==Z?.result||this.paymentMethodPresent!==Z?.paymentMethodPresent)&&(this.isReadyToPay=!!Z?.result,this.paymentMethodPresent=Z?.paymentMethodPresent,this.config.onReadyToPayChange)){const B={isButtonVisible:d,isReadyToPay:this.isReadyToPay};this.paymentMethodPresent&&(B.paymentMethodPresent=this.paymentMethodPresent),this.config.onReadyToPayChange(B)}}})}setClassName(I,g){const A=g.filter(l=>l).join(" ");A?I.className=A:I.removeAttribute("class")}appendStyles(){var I,g,A;if(typeof document>"u")return;const l=(I=this.element)===null||I===void 0?void 0:I.getRootNode(),d=`default-google-style-${this.options.cssSelector.replace(/[^\w-]+/g,"")}-${(g=this.config)===null||g===void 0?void 0:g.buttonLocale}`;if(l&&!(!((A=l.getElementById)===null||A===void 0)&&A.call(l,d))
5){const Z=document.createElement("style");Z.id=d,Z.type="text/css",Z.innerHTML=` 6 ${this.options.cssSelector} { 7 display: inline-block; 8 } 9 ${this.options.cssSelector}.not-ready { 10 width: 0; 11 height: 0; 12 overflow: hidden; 13 } 14 `,l instanceof Document&&l.head?l.head.appendChild(Z):l.appendChild(Z)}}isClientInvalidated(I){return this.oldInvalidationValues?this.getInvalidationValues(I).some((A,l)=>JSON.stringify(A)!==JSON.stringify(this.oldInvalidationValues[l])):!0}getInvalidationValues(I){var g,A;return[I.environment,I.existingPaymentMethodRequired,!!I.onPaymentDataChanged,!!I.onPaymentAuthorized,I.buttonType,I.buttonColor,I.buttonRadius,I.buttonLocale,I.buttonSizeMode,I.buttonBorderType,I.paymentRequest.merchantInfo.merchantId,I.paymentRequest.merchantInfo.merchantName,(g=I.paymentRequest.merchantInfo.softwareInfo)===null||g===void 0?void 0:g.id,(A=I.paymentRequest.merchantInfo.softwareInfo)===null||A===void 0?void 0:A.version,I.paymentRequest.allowedPaymentMethods]}}var en="@google-pay/button-element",Jn="3.2.1";function Sn(C,I=0){let g;return function(...A){window.clearTimeout(g);const l=function(){return g=void 0,C(...A)};return new Promise(d=>{g=window.setTimeout(()=>{const Z=l();d(Z)},I)})}}class nI extends HTMLElement{constructor(){super(...arguments),this.manager=new hn({cssSelector:"google-pay-button",softwareInfoId:en,softwareInfoVersion:Jn}),this.initializeButton=Sn(()=>{if(!this.assertRequiredProperty("paymentRequest")||!this.assertRequiredProperty("environment"))return;const I={paymentRequest:this.paymentRequest,environment:this.environment,existingPaymentMethodRequired:this.existingPaymentMethodRequired,onPaymentDataChanged:this.onPaymentDataChanged,onPaymentAuthorized:this.onPaymentAuthorized,buttonColor:this.buttonColor,buttonType:this.buttonType,buttonRadius:this.buttonRadius,buttonSizeMode:this.buttonSizeMode,buttonLocale:this.buttonLocale,buttonBorderType:this.buttonBorderType,onReadyToPayChange:g=>{this.onReadyToPayChange&&this.onReadyToPayChange(g),this.dispatch("readytopaychange",g)},onCancel:g=>{this.onCancel&&this.onCancel(g),this.dispatch("cancel",g)},onError:g=>{var A;this.onError&&((A=this.onError)===null||A===void 0||A.call(this,g)),this.dispatchEvent(new ErrorEvent("error",{error:g}))},onLoadPaymentData:g=>{this.onLoadPaymentData&&this.onLoadPaymentData(g),this.dispatch("loadpaymentdata",g)},onClick:g=>{var A;this.onClick&&((A=this.onClick)===null||A===void 0||A.call(this,g))}};this.manager.configure(I)})}get isReadyToPay(){return this.manager.isReadyToPay}assertRequiredProperty(I){const g=this[I];return g==null?(this.throwError(Error(`Required property not set: ${I}`)),!1):!0}
14throwError(I){throw I}static get observedAttributes(){return nI._observedAttributes}addObservedAttribute(I){nI._observedAttributes.push(I)}dispatch(I,g){this.dispatchEvent(new CustomEvent(I,{bubbles:!0,cancelable:!1,detail:g}))}connectedCallback(){return Cl(this,void 0,void 0,function*(){return yield this.manager.mount(this),this.initializeButton()})}disconnectedCallback(){this.manager.unmount()}attributeChangedCallback(I){return this.initializeButton()}notifyPropertyChanged(I){return this.initializeButton()}}nI._observedAttributes=[];uI([HZ(),cI("paymentrequest")],nI.prototype,"paymentRequest",void 0);uI([UC()],nI.prototype,"environment",void 0);uI([Yn(),cI("existingpaymentmethodrequired")],nI.prototype,"existingPaymentMethodRequired",void 0);uI([UC(),cI("buttoncolor")],nI.prototype,"buttonColor",void 0);uI([UC(),cI("buttontype")],nI.prototype,"buttonType",void 0);uI([UC(),cI("buttonradius")],nI.prototype,"buttonRadius",void 0);uI([UC(),cI("buttonsizemode")],nI.prototype,"buttonSizeMode",void 0);uI([UC(),cI("buttonlocale")],nI.prototype,"buttonLocale",void 0);uI([UC(),cI("buttonbordertype")],nI.prototype,"buttonBorderType",void 0);uI([HZ(),cI("paymentDataChangedCallback"),cI("paymentdatachangedcallback"),cI("onpaymentdatachanged")],nI.prototype,"onPaymentDataChanged",void 0);uI([HZ(),cI("paymentAuthorizedCallback"),cI("paymentauthorizedcallback"),cI("onpaymentauthorized")],nI.prototype,"onPaymentAuthorized",void 0);uI([cI("readyToPayChangeCallback"),cI("readytopaychangecallback"),cI("onreadytopaychange")],nI.prototype,"onReadyToPayChange",void 0);uI([cI("loadPaymentDataCallback"),cI("loadpaymentdatacallback"),cI("onloadpaymentdata")],nI.prototype,"onLoadPaymentData",void 0);uI([cI("cancelCallback"),cI("cancelcallback"),cI("oncancel")],nI.prototype,"onCancel",void 0);uI([cI("errorCallback"),cI("errorcallback"),cI("onerror")],nI.prototype,"onError",void 0);uI([cI("clickCallback"),cI("clickcallback"),cI("onclick")],nI.prototype,"onClick",void 0);customElements.define("google-pay-button",nI);const Xn=WI(()=>{});const Y={LIBRARY_NAME:"MSAL.JS",SKU:"msal.js.common",DEFAULT_AUTHORITY:"https://login.microsoftonline.com/common/",DEFAULT_AUTHORITY_HOST:"login.microsoftonline.com",DEFAULT_COMMON_TENANT:"common",ADFS:"adfs",DSTS:"dstsv2",AAD_INSTANCE_DISCOVERY_ENDPT:"https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=",CIAM_AUTH_URL:".ciamlogin.com",AAD_TENANT_DOMAIN_SUFFIX:".onmicrosoft.com",RESOURCE_DELIM:"|",NO_ACCOUNT:"NO_ACCOUNT",CLAIMS:"claims",CONSUMER_UTID:"9188040d-6c67-4c5b-b112-36a304b66dad",OPENID_SCOPE:"openid",PROFILE_SCOPE:"profile",OFFLINE_ACCESS_SCOPE:"offline_access",EMAIL_SCOPE:"email",CODE_GRANT_TYPE:"authorization_code",RT_GRANT_TYPE:"refresh_token",S256_CODE_CHALLENGE_METHOD:"S256",URL_FORM_CONTENT_TYPE:"application/x-www-form-urlencoded;charset=utf-8",AUTHORIZATION_PENDING:"authorization_pending",NOT_DEFINED:"not_defined",EMPTY_STRING:"",NOT_APPLICABLE:"N/A",NOT_AVAILABLE:"Not Available",FORWARD_SLASH:"/",IMDS_ENDPOINT:"http://169.254.169.254/metadata/instance/compute/location",IMDS_VERSION:"2020-06-01",IMDS_TIMEOUT:2e3,AZURE_REGION_AUTO_DISCOVER_FLAG:"TryAutoDetect",REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX:"login.microsoft.com",KNOWN_PUBLIC_CLOUDS:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"],SHR_NONCE_VALIDITY:240,INVALID_INSTANCE:"invalid_instance"},rg={SUCCESS:200,SUCCESS_RANGE_START:200,SUCCESS_RANGE_END:299,REDIRECT:302,CLIENT_ERROR:400,CLIENT_ERROR_RANGE_START:400,BAD_REQUEST:400,UNAUTHORIZED:401,NOT_FOUND:404,REQUEST_TIMEOUT:408,GONE:410,TOO_MANY_REQUESTS:429,CLIENT_ERROR_RANGE_END:499,SERVER_ERROR:500,SERVER_ERROR_RANGE_START:500,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504,SERVER_ERROR_RANGE_END:599,MULTI_SIDED_ERROR:600},iC={GET:"GET",POST:"POST"},rC=[Y.OPENID_SCOPE,Y.PROFILE_SCOPE,Y.OFFLINE_ACCESS_SCOPE],_0=[...rC,Y.EMAIL_SCOPE],kI={CONTENT_TYPE:"Content-Type",CONTENT_LENGTH:"Content-Length",RETRY_AFTER:"Retry-After",CCS_HEADER:"X-AnchorMailbox",WWWAuthenticate:"WWW-Authenticate",AuthenticationInfo:"Authentication-Info",X_MS_REQUEST_ID:"x-ms-request-id",X_MS_HTTP_VERSION:"x-ms-httpver"},q0={ACTIVE_ACCOUNT_FILTERS:"active-account-filters"},vg={COMMON:"common",ORGANIZATIONS:"organizations",CONSUMERS:"consumers"},EA={ACCESS_TOKEN:"access_token",XMS_CC:"xms_cc"},SI={LOGIN:"login",SELECT_ACCOUNT:"select_account",CONSENT:"consent",NONE:"none",
14NO_SESSION:"no_session"},uZ={CODE:"code",IDTOKEN_TOKEN_REFRESHTOKEN:"id_token token refresh_token"},Ll={QUERY:"query",FRAGMENT:"fragment"},yn={QUERY:"query"},nF={AUTHORIZATION_CODE_GRANT:"authorization_code",REFRESH_TOKEN_GRANT:"refresh_token"},rA={MSSTS_ACCOUNT_TYPE:"MSSTS",ADFS_ACCOUNT_TYPE:"ADFS",GENERIC_ACCOUNT_TYPE:"Generic"},RA={CACHE_KEY_SEPARATOR:"-",CLIENT_INFO_SEPARATOR:"."},tI={ID_TOKEN:"IdToken",ACCESS_TOKEN:"AccessToken",ACCESS_TOKEN_WITH_AUTH_SCHEME:"AccessToken_With_AuthScheme",REFRESH_TOKEN:"RefreshToken"},pZ="appmetadata",tn="client_info",Rl="1",sl={CACHE_KEY:"authority-metadata",REFRESH_TIME_SECONDS:3600*24},qI={CONFIG:"config",CACHE:"cache",NETWORK:"network",HARDCODED_VALUES:"hardcoded_values"},yI={SCHEMA_VERSION:5,MAX_LAST_HEADER_BYTES:330,MAX_CACHED_ERRORS:50,CACHE_KEY:"server-telemetry",CATEGORY_SEPARATOR:"|",VALUE_SEPARATOR:",",OVERFLOW_TRUE:"1",OVERFLOW_FALSE:"0",UNKNOWN_ERROR:"unknown_error"},BI={BEARER:"Bearer",POP:"pop",SSH:"ssh-cert"},BA={DEFAULT_THROTTLE_TIME_SECONDS:60,DEFAULT_MAX_THROTTLE_TIME_SECONDS:3600,THROTTLING_PREFIX:"throttling",X_MS_LIB_CAPABILITY_VALUE:"retry-after, h429"},$0={INVALID_GRANT_ERROR:"invalid_grant",CLIENT_MISMATCH_ERROR:"client_mismatch"},aC={FAILED_AUTO_DETECTION:"1",INTERNAL_CACHE:"2",ENVIRONMENT_VARIABLE:"3",IMDS:"4"},wd={CONFIGURED_NO_AUTO_DETECTION:"2",AUTO_DETECTION_REQUESTED_SUCCESSFUL:"4",AUTO_DETECTION_REQUESTED_FAILED:"5"},BC={NOT_APPLICABLE:"0",FORCE_REFRESH_OR_CLAIMS:"1",NO_CACHED_ACCESS_TOKEN:"2",CACHED_ACCESS_TOKEN_EXPIRED:"3",PROACTIVELY_REFRESHED:"4"},Dn={Pop:"pop"},QF=300;const bl="unexpected_error",Mn="post_request_failed";const Ic={[bl]:"Unexpected error in authentication.",[Mn]:"Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details."};class FI extends Error{constructor(I,g,A){const l=g?`${I}: ${g}`:I;super(l),Object.setPrototypeOf(this,FI.prototype),this.errorCode=I||Y.EMPTY_STRING,this.errorMessage=g||Y.EMPTY_STRING,this.subError=A||Y.EMPTY_STRING,this.name="AuthError"}setCorrelationId(I){this.correlationId=I}}function $d(C,I){return new FI(C,I?`${Ic[C]} ${I}`:Ic[C])}const KZ="client_info_decoding_error",aF="client_info_empty_error",kZ="token_parsing_error",NF="null_or_empty_token",Sg="endpoints_resolution_error",YF="network_error",wF="openid_config_error",hF="hash_not_deserialized",TC="invalid_state",eF="state_mismatch",IZ="state_not_found",JF="nonce_mismatch",TZ="auth_time_not_found",SF="max_age_transpired",Hn="multiple_matching_tokens",un="multiple_matching_accounts",XF="multiple_matching_appMetadata",yF="request_cannot_be_made",tF="cannot_remove_empty_scope",DF="cannot_append_scopeset",gZ="empty_input_scopeset",pn="device_code_polling_cancelled",Kn="device_code_expired",kn="device_code_unknown_error",zZ="no_account_in_silent_request",MF="invalid_cache_record",LZ="invalid_cache_environment",CZ="no_account_found",AZ="no_crypto_object",Tn="unexpected_credential_type",zn="invalid_assertion",Ln="invalid_client_credential",xg="token_refresh_required",En="user_timeout_reached",HF="token_claims_cnf_required_for_signedjwt",uF="authorization_code_missing_from_server_response",pF="binding_key_not_removed",KF="end_session_endpoint_not_supported",EZ="key_id_missing",rn="no_network_connectivity",jn="user_canceled",On="missing_tenant_id_error",x="method_not_implemented",vn="nested_app_auth_bridge_disabled",xn="platform_broker_error";const gc={[KZ]:"The client info could not be parsed/decoded correctly",[aF]:"The client info was empty",[kZ]:"Token cannot be parsed",[NF]:"The token is null or empty",[Sg]:"Endpoints cannot be resolved",[YF]:"Network request failed",[wF]:"Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints.",[hF]:"The hash parameters could not be deserialized",[TC]:"State was not the expected format",[eF]:"State mismatch error",[IZ]:"State not found",[JF]:"Nonce mismatch error",[TZ]:"Max Age was requested and the ID token is missing the auth_time variable. auth_time is an optional claim and is not enabled by default - it must be enabled. See https://aka.ms/msaljs/optional-claims for more information.",[SF]:"Max Age is set to 0, or too much time has elapsed since the last end-user authentication.",[Hn]:"The cache contains multiple tokens satisfying the requirements. Call AcquireToken again providing more requirements such as authority or account.",[un]:"The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account",[XF]:"The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata",[yF]:"Token request cannot be made without authorization code or refresh token.",[tF]:"Cannot remove null or empty scope from ScopeSet",[DF]:"Cannot append ScopeSet",[gZ]:"Empty input ScopeSet cannot be processed",[pn]:"Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true.",[Kn]:"Device code is expired.",[kn]:"Device code stopped polling for unknown reasons.",[zZ]:"Please pass an account object, silent flow is not supported without account information",[MF]:"Cache record object was null or undefined.",[LZ]:"Invalid environment when attempting to create cache entry",[CZ]:"No account found in cache for given key.",[AZ]:"No crypto object detected.",[Tn]:"Unexpected credential type.",[zn]:"Client assertion must meet requirements described
14in https://tools.ietf.org/html/rfc7515",[Ln]:"Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential",[xg]:"Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired.",[En]:"User defined timeout for device code polling reached",[HF]:"Cannot generate a POP jwt if the token_claims are not populated",[uF]:"Server response does not contain an authorization code to proceed",[pF]:"Could not remove the credential's binding key from storage.",[KF]:"The provided authority does not support logout",[EZ]:"A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key.",[rn]:"No network connectivity. Check your internet connection.",[jn]:"User cancelled the flow.",[On]:"A tenant id - not common, organizations, or consumers - must be specified when using the client_credentials flow.",[x]:"This method has not been implemented",[vn]:"The nested app auth bridge is disabled",[xn]:"An error occurred in the native broker. See the platformBrokerError property for details."};class rZ extends FI{constructor(I,g){super(I,g?`${gc[I]}: ${g}`:gc[I]),this.name="ClientAuthError",Object.setPrototypeOf(this,rZ.prototype)}}function e(C,I){return new rZ(C,I)}const Ul={createNewGuid:()=>{throw e(x)},base64Decode:()=>{throw e(x)},base64Encode:()=>{throw e(x)},base64UrlEncode:()=>{throw e(x)},encodeKid:()=>{throw e(x)},async getPublicKeyThumbprint(){throw e(x)},async removeTokenBindingKey(){throw e(x)},async clearKeystore(){throw e(x)},async signJwt(){throw e(x)},async hashString(){throw e(x)}};var GI;(function(C){C[C.Error=0]="Error",C[C.Warning=1]="Warning",C[C.Info=2]="Info",C[C.Verbose=3]="Verbose",C[C.Trace=4]="Trace"})(GI||(GI={}));class IC{constructor(I,g,A){this.level=GI.Info;const l=()=>{},d=I||IC.createDefaultLoggerOptions();this.localCallback=d.loggerCallback||l,this.piiLoggingEnabled=d.piiLoggingEnabled||!1,this.level=typeof d.logLevel=="number"?d.logLevel:GI.Info,this.correlationId=d.correlationId||Y.EMPTY_STRING,this.packageName=g||Y.EMPTY_STRING,this.packageVersion=A||Y.EMPTY_STRING}static createDefaultLoggerOptions(){return{loggerCallback:()=>{},piiLoggingEnabled:!1,logLevel:GI.Info}}clone(I,g,A){return new IC({loggerCallback:this.localCallback,piiLoggingEnabled:this.piiLoggingEnabled,logLevel:this.level,correlationId:A||this.correlationId},I,g)}logMessage(I,g){if(g.logLevel>this.level||!this.piiLoggingEnabled&&g.containsPii)return;const d=`${`[${new Date().toUTCString()}] : [${g.correlationId||this.correlationId||""}]`} : ${this.packageName}@${this.packageVersion} : ${GI[g.logLevel]} - ${I}`;this.executeCallback(g.logLevel,d,g.containsPii||!1)}executeCallback(I,g,A){this.localCallback&&this.localCallback(I,g,A)}error(I,g){this.logMessage(I,{logLevel:GI.Error,containsPii:!1,correlationId:g||Y.EMPTY_STRING})}errorPii(I,g){this.logMessage(I,{logLevel:GI.Error,containsPii:!0,correlationId:g||Y.EMPTY_STRING})}warning(I,g){this.logMessage(I,{logLevel:GI.Warning,containsPii:!1,correlationId:g||Y.EMPTY_STRING})}warningPii(I,g){this.logMessage(I,{logLevel:GI.Warning,containsPii:!0,correlationId:g||Y.EMPTY_STRING})}info(I,g){this.logMessage(I,{logLevel:GI.Info,containsPii:!1,correlationId:g||Y.EMPTY_STRING})}infoPii(I,g){this.logMessage(I,{logLevel:GI.Info,containsPii:!0,correlationId:g||Y.EMPTY_STRING})}verbose(I,g){this.logMessage(I,{logLevel:GI.Verbose,containsPii:!1,correlationId:g||Y.EMPTY_STRING})}verbosePii(I,g){this.logMessage(I,{logLevel:GI.Verbose,containsPii:!0,correlationId:g||Y.EMPTY_STRING})}trace(I,g){this.logMessage(I,{logLevel:GI.Trace,containsPii:!1,correlationId:g||Y.EMPTY_STRING})}tracePii(I,g){this.logMessage(I,{logLevel:GI.Trace,containsPii:!0,correlationId:g||Y.EMPTY_STRING})}isPiiLoggingEnabled(){return this.piiLoggingEnabled||!1}}const kF="@azure/msal-common",jZ="15.17.0";const OZ={None:"none"};const TF="redirect_uri_empty",Pn="claims_request_parsing_error",zF="authority_uri_insecure",gA="url_parse_error",LF="empty_url_error",EF="empty_input_scopes_error",vZ="invalid_claims",rF="token_request_empty",jF="logout_request_empty",fn="invalid_code_challenge_method",xZ="pkce_params_missing",PZ="invalid_cloud_discovery_metadata",OF="invalid_authority_metadata",vF="untrusted_authority",El="missing_ssh_jwk",xF="missing_ssh_kid",_n="missing_nonce_authentication_header",qn="invalid_authentication_header",PF="cannot_set_OIDCOptions",fF="cannot_allow_platform_broker",_F="authority_mismatch",qF="invalid_request_method_for_EAR",$F="invalid_authorize_post_body_parameters",IV="invalid_platform_broker_configuration";const $n={[TF]:"A redirect URI is required for all calls, and none has been set.",[Pn]:"Could not parse the given claims request object.",[zF]:"Authority URIs must use https. Please see here for valid authority configuration options: https://docs.microsoft.com/en-us
14/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options",[gA]:"URL could not be parsed into appropriate segments.",[LF]:"URL was empty or null.",[EF]:"Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token.",[vZ]:"Given claims parameter must be a stringified JSON object.",[rF]:"Token request was empty and not found in cache.",[jF]:"The logout request was null or undefined.",[fn]:'code_challenge_method passed is invalid. Valid values are "plain" and "S256".',[xZ]:"Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request",[PZ]:"Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields",[OF]:"Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields.",[vF]:"The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter.",[El]:"Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme.",[xF]:"Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme.",[_n]:"Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce.",[qn]:"Invalid authentication header provided",[PF]:"Cannot set OIDCOptions parameter. Please change the protocol mode to OIDC or use a non-Microsoft authority.",[fF]:"Cannot set allowPlatformBroker parameter to true when not in AAD protocol mode.",[_F]:"Authority mismatch error. Authority provided in login request or PublicClientApplication config does not match the environment of the provided account. Please use a matching account or make an interactive request to login to this authority.",[$F]:"Invalid authorize post body parameters provided. If you are using authorizePostBodyParameters, the request method must be POST. Please check the request method and parameters.",[qF]:"Invalid request method for EAR protocol mode. The request method cannot be GET when using EAR protocol mode. Please change the request method to POST.",[IV]:"Invalid platform broker configuration. `allowPlatformBrokerWithDOM` can only be enabled when `allowPlatformBroker` is enabled."};class fZ extends FI{constructor(I){super(I,$n[I]),this.name="ClientConfigurationError",Object.setPrototypeOf(this,fZ.prototype)}}function iI(C){return new fZ(C)}class gg{static isEmptyObj(I){if(I)try{const g=JSON.parse(I);return Object.keys(g).length===0}catch{}return!0}static startsWith(I,g){return I.indexOf(g)===0}static endsWith(I,g){return I.length>=g.length&&I.lastIndexOf(g)===I.length-g.length}static queryStringToObject(I){const g={},A=I.split("&"),l=d=>decodeURIComponent(d.replace(/\+/g," "));return A.forEach(d=>{if(d.trim()){const[Z,B]=d.split(/=(.+)/g,2);Z&&B&&(g[l(Z)]=l(B))}}),g}static trimArrayEntries(I){return I.map(g=>g.trim())}static removeEmptyStringsFromArray(I){return I.filter(g=>!!g)}static jsonParseHelper(I){try{return JSON.parse(I)}catch{return null}}static matchPattern(I,g){return new RegExp(I.replace(/\\/g,"\\\\").replace(/\*/g,"[^ ]*").replace(/\?/g,"\\?")).test(g)}static matchPatternStrict(I,g,A){const l=A?.component;let d=I.replace(/[.+^${}()|[\]\\*?]/g,"\\$&");return l==="host"?d=d.replace(/\\\*/g,"[^.]*"):d=d.replace(/\\\*/g,".*"),new RegExp(`^${d}$`).test(g)}}class hI{constructor(I){const g=I?gg.trimArrayEntries([...I]):[],A=g?gg.removeEmptyStringsFromArray(g):[];if(!A||!A.length)throw iI(EF);this.scopes=new Set,A.forEach(l=>this.scopes.add(l))}static fromString(I){const A=(I||Y.EMPTY_STRING).split(" ");return new hI(A)}static createSearchScopes(I){const g=I&&I.length>0?I:[...rC],A=new hI(g);return A.containsOnlyOIDCScopes()?A.removeScope(Y.OFFLINE_ACCESS_SCOPE):A.removeOIDCScopes(),A}containsScope(I){const g=this.printScopesLowerCase().split(" "),A=new hI(g);return I?A.scopes.has(I.toLowerCase()):!1}containsScopeSet(I){return!I||I.scopes.size<=0?!1:this.scopes.size>=I.scopes.size&&I.asArray().every(g=>this.containsScope(g))}containsOnlyOIDCScopes(){let I=0;
14return _0.forEach(g=>{this.containsScope(g)&&(I+=1)}),this.scopes.size===I}appendScope(I){I&&this.scopes.add(I.trim())}appendScopes(I){try{I.forEach(g=>this.appendScope(g))}catch{throw e(DF)}}removeScope(I){if(!I)throw e(tF);this.scopes.delete(I.trim())}removeOIDCScopes(){_0.forEach(I=>{this.scopes.delete(I)})}unionScopeSets(I){if(!I)throw e(gZ);const g=new Set;return I.scopes.forEach(A=>g.add(A.toLowerCase())),this.scopes.forEach(A=>g.add(A.toLowerCase())),g}intersectingScopeSets(I){if(!I)throw e(gZ);I.containsOnlyOIDCScopes()||I.removeOIDCScopes();const g=this.unionScopeSets(I),A=I.getScopeCount(),l=this.getScopeCount();return g.size<l+A}getScopeCount(){return this.scopes.size}asArray(){const I=[];return this.scopes.forEach(g=>I.push(g)),I}printScopes(){return this.scopes?this.asArray().join(" "):Y.EMPTY_STRING}printScopesLowerCase(){return this.printScopes().toLowerCase()}}function ol(C,I){if(!C)throw e(aF);try{const g=I(C);return JSON.parse(g)}catch{throw e(KZ)}}function SC(C){if(!C)throw e(KZ);const I=C.split(RA.CLIENT_INFO_SEPARATOR,2);return{uid:I[0],utid:I.length<2?Y.EMPTY_STRING:I[1]}}function Cc(C,I){return!!C&&!!I&&C===I.split(".")[1]}function XC(C,I,g,A){if(A){const{oid:l,sub:d,tid:Z,name:B,tfp:c,acr:i,preferred_username:F,upn:V,login_hint:W}=A,G=Z||c||i||"";return{tenantId:G,localAccountId:l||d||"",name:B,username:F||V||"",loginHint:W,isHomeTenant:Cc(G,C)}}else return{tenantId:g,localAccountId:I,username:"",isHomeTenant:Cc(g,C)}}function _Z(C,I,g,A){let l=C;if(I){const{isHomeTenant:d,...Z}=I;l={...C,...Z}}if(g){const{isHomeTenant:d,...Z}=XC(C.homeAccountId,C.localAccountId,C.tenantId,g);return l={...l,...Z,idTokenClaims:g,idToken:A},l}return l}const Gg={Default:0,Adfs:1,Dsts:2,Ciam:3};function qZ(C){return C&&(C.tid||C.tfp||C.acr)||null}const vI={AAD:"AAD",OIDC:"OIDC",EAR:"EAR"};class mI{static getAccountInfo(I){const g=I.tenantProfiles||[];return g.length===0&&I.realm&&I.localAccountId&&g.push(XC(I.homeAccountId,I.localAccountId,I.realm)),{homeAccountId:I.homeAccountId,environment:I.environment,tenantId:I.realm,username:I.username,localAccountId:I.localAccountId,loginHint:I.loginHint,name:I.name,nativeAccountId:I.nativeAccountId,authorityType:I.authorityType,tenantProfiles:new Map(g.map(A=>[A.tenantId,A])),dataBoundary:I.dataBoundary}}isSingleTenant(){return!this.tenantProfiles}static createAccount(I,g,A){const l=new mI;g.authorityType===Gg.Adfs?l.authorityType=rA.ADFS_ACCOUNT_TYPE:g.protocolMode===vI.OIDC?l.authorityType=rA.GENERIC_ACCOUNT_TYPE:l.authorityType=rA.MSSTS_ACCOUNT_TYPE;let d;I.clientInfo&&A&&(d=ol(I.clientInfo,A),d.xms_tdbr&&(l.dataBoundary=d.xms_tdbr==="EU"?"EU":"None")),l.clientInfo=I.clientInfo,l.homeAccountId=I.homeAccountId,l.nativeAccountId=I.nativeAccountId;const Z=I.environment||g&&g.getPreferredCache();if(!Z)throw e(LZ);l.environment=Z,l.realm=d?.utid||qZ(I.idTokenClaims)||"",l.localAccountId=d?.uid||I.idTokenClaims?.oid||I.idTokenClaims?.sub||"";const B=I.idTokenClaims?.preferred_username||I.idTokenClaims?.upn,c=I.idTokenClaims?.emails?I.idTokenClaims.emails[0]:null;if(l.username=B||c||"",l.loginHint=I.idTokenClaims?.login_hint,l.name=I.idTokenClaims?.name||"",l.cloudGraphHostName=I.cloudGraphHostName,l.msGraphHost=I.msGraphHost,I.tenantProfiles)l.tenantProfiles=I.tenantProfiles;else{const i=XC(I.homeAccountId,l.localAccountId,l.realm,I.idTokenClaims);l.tenantProfiles=[i]}return l}static createFromAccountInfo(I,g,A){const l=new mI;l.authorityType=I.authorityType||rA.GENERIC_ACCOUNT_TYPE,l.homeAccountId=I.homeAccountId,l.localAccountId=I.localAccountId,l.nativeAccountId=I.nativeAccountId,l.realm=I.tenantId,l.environment=I.environment,l.username=I.username,l.name=I.name,l.loginHint=I.loginHint,l.cloudGraphHostName=g,l.msGraphHost=A;const d=Array.from(I.tenantProfiles?.values()||[]);return d.length===0&&I.tenantId&&I.localAccountId&&d.push(XC(I.homeAccountId,I.localAccountId,I.tenantId,I.idTokenClaims)),l.tenantProfiles=d,l.dataBoundary=I.dataBoundary,l}static generateHomeAccountId(I,g,A,l,d){if(!(g===Gg.Adfs||g===Gg.Dsts)){if(I)try{const Z=ol(I,l.base64Decode);if(Z.uid&&Z.utid)return`${Z.uid}.${Z.utid}`}catch{}A.warning("No client info in response")}return d?.sub||""}static isAccountEntity(I){return I?I.hasOwnProperty("homeAccountId")&&I.hasOwnProperty("environment")&&I.hasOwnProperty("realm")&&I.hasOwnProperty("localAccountId")&&I.hasOwnProperty("username")&&I.hasOwnProperty("authorityType"):!1}
14static accountInfoIsEqual(I,g,A){if(!I||!g)return!1;let l=!0;if(A){const d=I.idTokenClaims||{},Z=g.idTokenClaims||{};l=d.iat===Z.iat&&d.nonce===Z.nonce}return I.homeAccountId===g.homeAccountId&&I.localAccountId===g.localAccountId&&I.username===g.username&&I.tenantId===g.tenantId&&I.loginHint===g.loginHint&&I.environment===g.environment&&I.nativeAccountId===g.nativeAccountId&&l}}function Yg(C,I){const g=IQ(C);try{const A=I(g);return JSON.parse(A)}catch{throw e(kZ)}}function wg(C){if(!C.signin_state)return!1;const I=["kmsi","dvc_dmjd"];return C.signin_state.some(A=>I.includes(A.trim().toLowerCase()))}function IQ(C){if(!C)throw e(NF);const g=/^([^\.\s]*)\.([^\.\s]+)\.([^\.\s]*)$/.exec(C);if(!g||g.length<4)throw e(kZ);return g[2]}function gV(C,I){if(I===0||Date.now()-3e5>C+I)throw e(SF)}function Ac(C){if(!C)return C;let I=C.toLowerCase();return gg.endsWith(I,"?")?I=I.slice(0,-1):gg.endsWith(I,"?/")&&(I=I.slice(0,-2)),gg.endsWith(I,"/")||(I+="/"),I}function CV(C){return C.startsWith("#/")?C.substring(2):C.startsWith("#")||C.startsWith("?")?C.substring(1):C}function ml(C){if(!C||C.indexOf("=")<0)return null;try{const I=CV(C),g=Object.fromEntries(new URLSearchParams(I));if(g.code||g.ear_jwe||g.error||g.error_description||g.state)return g}catch{throw e(hF)}return null}function sA(C,I=!0,g){const A=new Array;
14return C.forEach((l,d)=>{!I&&g&&d in g?A.push(`${d}=${l}`):A.push(`${d}=${encodeURIComponent(l)}`)}),A.join("&")}function lc(C){if(!C)return C;const I=C.split("#")[0];try{const g=new URL(I),A=g.origin+g.pathname+g.search;return Ac(A)}catch{return Ac(I)}}class lI{get urlString(){return this._urlString}constructor(I){if(this._urlString=I,!this._urlString)throw iI(LF);I.includes("#")||(this._urlString=lI.canonicalizeUri(I))}static canonicalizeUri(I){if(I){let g=I.toLowerCase();return gg.endsWith(g,"?")?g=g.slice(0,-1):gg.endsWith(g,"?/")&&(g=g.slice(0,-2)),gg.endsWith(g,"/")||(g+="/"),g}return I}validateAsUri(){let I;try{I=this.getUrlComponents()}catch{throw iI(gA)}if(!I.HostNameAndPort||!I.PathSegments)throw iI(gA);if(!I.Protocol||I.Protocol.toLowerCase()!=="https:")throw iI(zF)}static appendQueryString(I,g){return g?I.indexOf("?")<0?`${I}?${g}`:`${I}&${g}`:I}static removeHashFromUrl(I){return lI.canonicalizeUri(I.split("#")[0])}replaceTenantPath(I){const g=this.getUrlComponents(),A=g.PathSegments;return I&&A.length!==0&&(A[0]===vg.COMMON||A[0]===vg.ORGANIZATIONS)&&(A[0]=I),lI.constructAuthorityUriFromObject(g)}getUrlComponents(){const I=RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"),g=this.urlString.match(I);if(!g)throw iI(gA);const A={Protocol:g[1],HostNameAndPort:g[4],AbsolutePath:g[5],QueryString:g[7]};let l=A.AbsolutePath.split("/");return l=l.filter(d=>d&&d.length>0),A.PathSegments=l,A.QueryString&&A.QueryString.endsWith("/")&&(A.QueryString=A.QueryString.substring(0,A.QueryString.length-1)),A}static getDomainFromUrl(I){const g=RegExp("^([^:/?#]+://)?([^/?#]*)"),A=I.match(g);if(!A)throw iI(gA);return A[2]}static getAbsoluteUrl(I,g){if(I[0]===Y.FORWARD_SLASH){const l=new lI(g).getUrlComponents();return l.Protocol+"//"+l.HostNameAndPort+I}return I}static constructAuthorityUriFromObject(I){return new lI(I.Protocol+"//"+I.HostNameAndPort+"/"+I.PathSegments.join("/"))}static hashContainsKnownProperties(I){return!!ml(I)}}const AV={endpointMetadata:{"login.microsoftonline.com":{token_endpoint:"https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/token",jwks_uri:"https://login.microsoftonline.com/{tenantid}/discovery/v2.0/keys",issuer:"https://login.microsoftonline.com/{tenantid}/v2.0",authorization_endpoint:"https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/authorize",end_session_endpoint:"https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/logout"},"login.chinacloudapi.cn":{token_endpoint:"https://login.chinacloudapi.cn/{tenantid}/oauth2/v2.0/token",jwks_uri:"https://login.chinacloudapi.cn/{tenantid}/discovery/v2.0/keys",issuer:"https://login.partner.microsoftonline.cn/{tenantid}/v2.0",authorization_endpoint:"https://login.chinacloudapi.cn/{tenantid}/oauth2/v2.0/authorize",end_session_endpoint:"https://login.chinacloudapi.cn/{tenantid}/oauth2/v2.0/logout"},"login.microsoftonline.us":{token_endpoint:"https://login.microsoftonline.us/{tenantid}/oauth2/v2.0/token",jwks_uri:"https://login.microsoftonline.us/{tenantid}/discovery/v2.0/keys",issuer:"https://login.microsoftonline.us/{tenantid}/v2.0",authorization_endpoint:"https://login.microsoftonline.us/{tenantid}/oauth2/v2.0/authorize",end_session_endpoint:"https://login.microsoftonline.us/{tenantid}/oauth2/v2.0/logout"},"login.sovcloud-identity.fr":{token_endpoint:"https://login.sovcloud-identity.fr/{tenantid}/oauth2/v2.0/token",jwks_uri:"https://login.sovcloud-identity.fr/{tenantid}/discovery/v2.0/keys",issuer:"https://login.sovcloud-identity.fr/{tenantid}/v2.0",authorization_endpoint:"https://login.sovcloud-identity.fr/{tenantid}/oauth2/v2.0/authorize",end_session_endpoint:"https://login.sovcloud-identity.fr/{tenantid}/oauth2/v2.0/logout"},"login.sovcloud-identity.de":{token_endpoint:"https://login.sovcloud-identity.de/{tenantid}/oauth2/v2.0/token",jwks_uri:"https://login.sovcloud-identity.de/{tenantid}/discovery/v2.0/keys",issuer:"https://login.sovcloud-identity.de/{tenantid}/v2.0",authorization_endpoint:"https://login.sovcloud-identity.de/{tenantid}/oauth2/v2.0/authorize",end_session_endpoint:"https://login.sovcloud-identity.de/{tenantid}/oauth2/v2.0/logout"},"login.sovcloud-identity.sg":{token_endpoint:"https://login.sovcloud-identity.sg/common/o
14auth2/v2.0/token",jwks_uri:"https://login.sovcloud-identity.sg/common/discovery/v2.0/keys",issuer:"https://login.sovcloud-identity.sg/{tenantid}/v2.0",authorization_endpoint:"https://login.sovcloud-identity.sg/common/oauth2/v2.0/authorize",end_session_endpoint:"https://login.sovcloud-identity.sg/common/oauth2/v2.0/logout"}},instanceDiscoveryMetadata:{metadata:[{preferred_network:"login.microsoftonline.com",preferred_cache:"login.windows.net",aliases:["login.microsoftonline.com","login.windows.net","login.microsoft.com","sts.windows.net"]},{preferred_network:"login.partner.microsoftonline.cn",preferred_cache:"login.partner.microsoftonline.cn",aliases:["login.partner.microsoftonline.cn","login.chinacloudapi.cn"]},{preferred_network:"login.microsoftonline.de",preferred_cache:"login.microsoftonline.de",aliases:["login.microsoftonline.de"]},{preferred_network:"login.microsoftonline.us",preferred_cache:"login.microsoftonline.us",aliases:["login.microsoftonline.us","login.usgovcloudapi.net"]},{preferred_network:"login-us.microsoftonline.com",preferred_cache:"login-us.microsoftonline.com",aliases:["login-us.microsoftonline.com"]},{preferred_network:"login.sovcloud-identity.fr",preferred_cache:"login.sovcloud-identity.fr",aliases:["login.sovcloud-identity.fr"]},{preferred_network:"login.sovcloud-identity.de",preferred_cache:"login.sovcloud-identity.de",aliases:["login.sovcloud-identity.de"]},{preferred_network:"login.sovcloud-identity.sg",preferred_cache:"login.sovcloud-identity.sg",aliases:["login.sovcloud-identity.sg"]}]}},dc=AV.endpointMetadata,$Z=AV.instanceDiscoveryMetadata,lV=new Set;$Z.metadata.forEach(C=>{C.aliases.forEach(I=>{lV.add(I)})});function gQ(C,I){let g;const A=C.canonicalAuthority;if(A){const l=new lI(A).getUrlComponents().HostNameAndPort;g=Zc(l,C.cloudDiscoveryMetadata?.metadata,qI.CONFIG,I)||Zc(l,$Z.metadata,qI.HARDCODED_VALUES,I)||C.knownAuthorities}return g||[]}function Zc(C,I,g,A){if(A?.trace(`getAliasesFromMetadata called with source: ${g}`),C&&I){const l=nl(I,C);if(l)return A?.trace(`getAliasesFromMetadata: found cloud discovery metadata in ${g}, returning aliases`),l.aliases;A?.trace(`getAliasesFromMetadata: did not find cloud discovery metadata in ${g}`)}return null}function CQ(C){return nl($Z.metadata,C)}function nl(C,I){for(let g=0;g<C.length;g++){const A=C[g];if(A.aliases.includes(I))return A}return null}const Ql="cache_quota_exceeded",IB="cache_error_unknown";
14const hd={[Ql]:"Exceeded cache storage capacity.",[IB]:"Unexpected error occurred when using cache storage."};class yC extends FI{constructor(I,g){const A=g||(hd[I]?hd[I]:hd[IB]);super(`${I}: ${A}`),Object.setPrototypeOf(this,yC.prototype),this.name="CacheError",this.errorCode=I,this.errorMessage=A}}function lZ(C){return C instanceof Error?C.name==="QuotaExceededError"||C.name==="NS_ERROR_DOM_QUOTA_REACHED"||C.message.includes("exceeded the quota")?new yC(Ql):new yC(C.name,C.message):new yC(IB)}class dZ{constructor(I,g,A,l,d){this.clientId=I,this.cryptoImpl=g,this.commonLogger=A.clone(kF,jZ),this.staticAuthorityOptions=d,this.performanceClient=l}getAllAccounts(I,g){return this.buildTenantProfiles(this.getAccountsFilteredBy(I,g),g,I)}getAccountInfoFilteredBy(I,g){if(Object.keys(I).length===0||Object.values(I).every(l=>!l))return this.commonLogger.warning("getAccountInfoFilteredBy: Account filter is empty or invalid, returning null"),null;const A=this.getAllAccounts(I,g);return A.length>1?A.sort(d=>d.idTokenClaims?-1:1)[0]:A.length===1?A[0]:null}getBaseAccountInfo(I,g){const A=this.getAccountsFilteredBy(I,g);return A.length>0?mI.getAccountInfo(A[0]):null}buildTenantProfiles(I,g,A){return I.flatMap(l=>this.getTenantProfilesFromAccountEntity(l,g,A?.tenantId,A))}getTenantedAccountInfoByFilter(I,g,A,l,d){let Z=null,B;if(d&&!this.tenantProfileMatchesFilter(A,d))return null;const c=this.getIdToken(I,l,g,A.tenantId);return c&&(B=Yg(c.secret,this.cryptoImpl.base64Decode),!this.idTokenClaimsMatchTenantProfileFilter(B,d))?null:(Z=_Z(I,A,B,c?.secret),Z)}getTenantProfilesFromAccountEntity(I,g,A,l){const d=mI.getAccountInfo(I);let Z=d.tenantProfiles||new Map;const B=this.getTokenKeys();if(A){const i=Z.get(A);if(i)Z=new Map([[A,i]]);else return[]}const c=[];return Z.forEach(i=>{const F=this.getTenantedAccountInfoByFilter(d,B,i,g,l);F&&c.push(F)}),c}tenantProfileMatchesFilter(I,g){return!(g.localAccountId&&!this.matchLocalAccountIdFromTenantProfile(I,g.localAccountId)||g.name&&I.name!==g.name||g.isHomeTenant!==void 0&&I.isHomeTenant!==g.isHomeTenant)}idTokenClaimsMatchTenantProfileFilter(I,g){return!(g&&(g.localAccountId&&!this.matchLocalAccountIdFromTokenClaims(I,g.localAccountId)||g.loginHint&&!this.matchLoginHintFromTokenClaims(I,g.loginHint)||g.username&&!this.matchUsername(I.preferred_username,g.username)||g.name&&!this.matchName(I,g.name)||g.sid&&!this.matchSid(I,g.sid)))}async saveCacheRecord(I,g,A,l,d){if(!I)throw e(MF);try{I.account&&await this.setAccount(I.account,g,A,l),I.idToken&&d?.idToken!==!1&&await this.setIdTokenCredential(I.idToken,g,A),I.accessToken&&d?.accessToken!==!1&&await this.saveAccessToken(I.accessToken,g,A),I.refreshToken&&d?.refreshToken!==!1&&await this.setRefreshTokenCredential(I.refreshToken,g,A),I.appMetadata&&this.setAppMetadata(I.appMetadata,g)}catch(Z){throw this.commonLogger?.error("CacheManager.saveCacheRecord: failed"),Z instanceof FI?Z:lZ(Z)}}async saveAccessToken(I,g,A){const l={clientId:I.clientId,credentialType:I.credentialType,environment:I.environment,homeAccountId:I.homeAccountId,realm:I.realm,tokenType:I.tokenType,requestedClaimsHash:I.requestedClaimsHash},d=this.getTokenKeys(),Z=hI.fromString(I.target);d.accessToken.forEach(B=>{if(!this.accessTokenKeyMatchesFilter(B,l,!1))return;const c=this.getAccessTokenCredential(B,g);c&&this.credentialMatchesFilter(c,l)&&hI.fromString(c.target).intersectingScopeSets(Z)&&this.removeAccessToken(B,g)}),await this.setAccessTokenCredential(I,g,A)}getAccountsFilteredBy(I,g){const A=this.getAccountKeys(),l=[];return A.forEach(d=>{const Z=this.getAccount(d,g);if(!Z||I.homeAccountId&&!this.matchHomeAccountId(Z,I.homeAccountId)||I.username&&!this.matchUsername(Z.username,I.username)||I.environment&&!this.matchEnvironment(Z,I.environment)||I.realm&&!this.matchRealm(Z,I.realm)||I.nativeAccountId&&!this.matchNativeAccountId(Z,I.nativeAccountId)||I.authorityType&&!this.matchAuthorityType(Z,I.authorityType))return;const B={localAccountId:I?.localAccountId,name:I?.name},c=Z.tenantProfiles?.filter(i=>this.tenantProfileMatchesFilter(i,B));c&&c.length===0||l.push(Z)}),l}credentialMatchesFilter(I,g){return!(g.clientId&&!this.matchClientId(I,g.clientId)||g.userAssertionHash&&!this.matchUserAssertionHash(I,g.userAssertionHash)||typeof g.homeAccountId=="string"&&!this.matchHomeAccountId(I,g.homeAccountId)||g.environment&&!this.matchEnvironment(I,g.environment)||g.realm&&!this.matchRealm(I,g.realm)||g.credentialType&&!this.matchCredentialType(I,g.credentialType)||g.familyId&&!this.matchFamilyId(I,g.familyId)||g.target&&!this.matchTarget(I,g.target)||(g.requestedClaimsHash||I.requestedClaimsHash)&&I.requestedClaimsHash!==g.requestedClaimsHash||I.credentialType===tI.ACCESS_TOKEN_WITH_AUTH_SCHEME&&(g.tokenType&&!this.matchTokenType(I,g.tokenType)||g.tokenType===BI.SSH&&g.keyId&&!this.matchKeyId(I,g.keyId)))}getAppMetadataFilteredBy(I){const g=this.getKeys(),A={};return g.forEach(l=>{if(!this.isAppMetadata(l))return;const d=this.getAppMetadata(l);d&&(I.environment&&!this.matchEnvironment(d,I.environment)||I.clientId&&!this.matchClientId(d,I.clientId)||(A[l]=d))}),A}getAuthorityMetadataByAlias(I){const g=this.getAuthorityMetadataKeys();let A=null;return g.forEach(l=>{if(!this.isAuthorityMetadata(l)||l.indexOf(this.clientId)===-1)return;const d=this.getAuthorityMetadata(l);d&&d.aliases.indexOf(I)!==-1&&(A=d)}),A}removeAllAccounts(I){this.getAllAccounts({}
14,I).forEach(A=>{this.removeAccount(A,I)})}removeAccount(I,g){this.removeAccountContext(I,g);const A=this.getAccountKeys(),l=d=>d.includes(I.homeAccountId)&&d.includes(I.environment);A.filter(l).forEach(d=>{this.removeItem(d,g),this.performanceClient.incrementFields({accountsRemoved:1},g)})}removeAccountContext(I,g){const A=this.getTokenKeys(),l=d=>d.includes(I.homeAccountId)&&d.includes(I.environment);A.idToken.filter(l).forEach(d=>{this.removeIdToken(d,g)}),A.accessToken.filter(l).forEach(d=>{this.removeAccessToken(d,g)}),A.refreshToken.filter(l).forEach(d=>{this.removeRefreshToken(d,g)})}removeAccessToken(I,g){const A=this.getAccessTokenCredential(I,g);if(this.removeItem(I,g),this.performanceClient.incrementFields({accessTokensRemoved:1},g),!A||A.credentialType.toLowerCase()!==tI.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()||A.tokenType!==BI.POP)return;const l=A.keyId;l&&this.cryptoImpl.removeTokenBindingKey(l).catch(()=>{this.commonLogger.error(`Failed to remove token binding key ${l}`,g),this.performanceClient?.incrementFields({removeTokenBindingKeyFailure:1},g)})}removeAppMetadata(I){return this.getKeys().forEach(A=>{this.isAppMetadata(A)&&this.removeItem(A,I)}),!0}getIdToken(I,g,A,l,d){this.commonLogger.trace("CacheManager - getIdToken called");const Z={homeAccountId:I.homeAccountId,environment:I.environment,credentialType:tI.ID_TOKEN,clientId:this.clientId,realm:l},B=this.getIdTokensByFilter(Z,g,A),c=B.size;if(c<1)return this.commonLogger.info("CacheManager:getIdToken - No token found"),null;if(c>1){let i=B;if(!l){const F=new Map;B.forEach((W,G)=>{W.realm===I.tenantId&&F.set(G,W)});const V=F.size;if(V<1)return this.commonLogger.info("CacheManager:getIdToken - Multiple ID tokens found for account but none match account entity tenant id, returning first result"),B.values().next().value;if(V===1)return this.commonLogger.info("CacheManager:getIdToken - Multiple ID tokens found for account, defaulting to home tenant profile"),F.values().next().value;i=F}return this.commonLogger.info("CacheManager:getIdToken - Multiple matching ID tokens found, clearing them"),i.forEach((F,V)=>{this.removeIdToken(V,g)}),d&&g&&d.addFields({multiMatchedID:B.size},g),null}return this.commonLogger.info("CacheManager:getIdToken - Returning ID token"),B.values().next().value}getIdTokensByFilter(I,g,A){const l=A&&A.idToken||this.getTokenKeys().idToken,d=new Map;return l.forEach(Z=>{if(!this.idTokenKeyMatchesFilter(Z,{clientId:this.clientId,...I}))return;const B=this.getIdTokenCredential(Z,g);B&&this.credentialMatchesFilter(B,I)&&d.set(Z,B)}),d}idTokenKeyMatchesFilter(I,g){const A=I.toLowerCase();return!(g.clientId&&A.indexOf(g.clientId.toLowerCase())===-1||g.homeAccountId&&A.indexOf(g.homeAccountId.toLowerCase())===-1)}removeIdToken(I,g){this.removeItem(I,g)}removeRefreshToken(I,g){this.removeItem(I,g)}getAccessToken(I,g,A,l){const d=g.correlationId;this.commonLogger.trace("CacheManager - getAccessToken called",d);const Z=hI.createSearchScopes(g.scopes),B=g.authenticationScheme||BI.BEARER,c=B.toLowerCase()!==BI.BEARER.toLowerCase()?tI.ACCESS_TOKEN_WITH_AUTH_SCHEME:tI.ACCESS_TOKEN,i={homeAccountId:I.homeAccountId,environment:I.environment,credentialType:c,clientId:this.clientId,realm:l||I.tenantId,target:Z,tokenType:B,keyId:g.sshKid,requestedClaimsHash:g.requestedClaimsHash},F=A&&A.accessToken||this.getTokenKeys().accessToken,V=[];F.forEach(G=>{if(this.accessTokenKeyMatchesFilter(G,i,!0)){const R=this.getAccessTokenCredential(G,d);R&&this.credentialMatchesFilter(R,i)&&V.push(R)}});const W=V.length;return W<1?(this.commonLogger.info("CacheManager:getAccessToken - No token found",d),null):W>1?(this.commonLogger.info("CacheManager:getAccessToken - Multiple access tokens found, clearing them",d),V.forEach(G=>{this.removeAccessToken(this.generateCredentialKey(G),d)}),this.performanceClient.addFields({multiMatchedAT:V.length},d),null):(this.commonLogger.info("CacheManager:getAccessToken - Returning access token",d),V[0])}accessTokenKeyMatchesFilter(I,g,A){const l=I.toLowerCase();if(g.clientId&&l.indexOf(g.clientId.toLowerCase())===-1||g.homeAccountId&&l.indexOf(g.homeAccountId.toLowerCase())===-1||g.realm&&l.indexOf(g.realm.toLowerCase())===-1||g.requestedClaimsHash&&l.indexOf(g.requestedClaimsHash.toLowerCase())===-1)return!1;if(g.target){const d=g.target.asArray();for(let Z=0;Z<d.length;Z++){if(A&&!l.includes(d[Z].toLowerCase()))return!1;if(!A&&l.includes(d[Z].toLowerCase()))return!0}}return!0}getAccessTokensByFilter(I,g){const A=this.getTokenKeys(),l=[];
14return A.accessToken.forEach(d=>{if(!this.accessTokenKeyMatchesFilter(d,I,!0))return;const Z=this.getAccessTokenCredential(d,g);Z&&this.credentialMatchesFilter(Z,I)&&l.push(Z)}),l}getRefreshToken(I,g,A,l,d){this.commonLogger.trace("CacheManager - getRefreshToken called");const Z=g?Rl:void 0,B={homeAccountId:I.homeAccountId,environment:I.environment,credentialType:tI.REFRESH_TOKEN,clientId:this.clientId,familyId:Z},c=l&&l.refreshToken||this.getTokenKeys().refreshToken,i=[];c.forEach(V=>{if(this.refreshTokenKeyMatchesFilter(V,B)){const W=this.getRefreshTokenCredential(V,A);W&&this.credentialMatchesFilter(W,B)&&i.push(W)}});const F=i.length;return F<1?(this.commonLogger.info("CacheManager:getRefreshToken - No refresh token found."),null):(F>1&&d&&A&&d.addFields({multiMatchedRT:F},A),this.commonLogger.info("CacheManager:getRefreshToken - returning refresh token"),i[0])}refreshTokenKeyMatchesFilter(I,g){const A=I.toLowerCase();return!(g.familyId&&A.indexOf(g.familyId.toLowerCase())===-1||!g.familyId&&g.clientId&&A.indexOf(g.clientId.toLowerCase())===-1||g.homeAccountId&&A.indexOf(g.homeAccountId.toLowerCase())===-1)}readAppMetadataFromCache(I){const g={environment:I,clientId:this.clientId},A=this.getAppMetadataFilteredBy(g),l=Object.keys(A).map(Z=>A[Z]),d=l.length;if(d<1)return null;if(d>1)throw e(XF);return l[0]}isAppMetadataFOCI(I){const g=this.readAppMetadataFromCache(I);return!!(g&&g.familyId===Rl)}matchHomeAccountId(I,g){return typeof I.homeAccountId=="string"&&g===I.homeAccountId}matchLocalAccountIdFromTokenClaims(I,g){const A=I.oid||I.sub;return g===A}matchLocalAccountIdFromTenantProfile(I,g){return I.localAccountId===g}matchName(I,g){return g.toLowerCase()===I.name?.toLowerCase()}matchUsername(I,g){return!!(I&&typeof I=="string"&&g?.toLowerCase()===I.toLowerCase())}matchUserAssertionHash(I,g){return!!(I.userAssertionHash&&g===I.userAssertionHash)}matchEnvironment(I,g){if(this.staticAuthorityOptions){const l=gQ(this.staticAuthorityOptions,this.commonLogger);if(l.includes(g)&&l.includes(I.environment))return!0}const A=this.getAuthorityMetadataByAlias(g);return!!(A&&A.aliases.indexOf(I.environment)>-1)}matchCredentialType(I,g){return I.credentialType&&g.toLowerCase()===I.credentialType.toLowerCase()}matchClientId(I,g){return!!(I.clientId&&g===I.clientId)}matchFamilyId(I,g){return!!(I.familyId&&g===I.familyId)}matchRealm(I,g){return I.realm?.toLowerCase()===g.toLowerCase()}matchNativeAccountId(I,g){return!!(I.nativeAccountId&&g===I.nativeAccountId)}matchLoginHintFromTokenClaims(I,g){return I.login_hint===g||I.preferred_username===g||I.upn===g}matchSid(I,g){return I.sid===g}matchAuthorityType(I,g){return!!(I.authorityType&&g.toLowerCase()===I.authorityType.toLowerCase())}matchTarget(I,g){return I.credentialType!==tI.ACCESS_TOKEN&&I.credentialType!==tI.ACCESS_TOKEN_WITH_AUTH_SCHEME||!I.target?!1:hI.fromString(I.target).containsScopeSet(g)}matchTokenType(I,g){return!!(I.tokenType&&I.tokenType===g)}matchKeyId(I,g){return!!(I.keyId&&I.keyId===g)}isAppMetadata(I){return I.indexOf(pZ)!==-1}isAuthorityMetadata(I){return I.indexOf(sl.CACHE_KEY)!==-1}generateAuthorityMetadataCacheKey(I){return`${sl.CACHE_KEY}-${this.clientId}-${I}`}static toObject(I,g){for(const A in g)I[A]=g[A];return I}}class AQ extends dZ{async setAccount(){throw e(x)}getAccount(){throw e(x)}async setIdTokenCredential(){throw e(x)}getIdTokenCredential(){throw e(x)}async setAccessTokenCredential(){throw e(x)}getAccessTokenCredential(){throw e(x)}async setRefreshTokenCredential(){throw e(x)}getRefreshTokenCredential(){throw e(x)}setAppMetadata(){throw e(x)}getAppMetadata(){throw e(x)}setServerTelemetry(){throw e(x)}getServerTelemetry(){throw e(x)}setAuthorityMetadata(){throw e(x)}getAuthorityMetadata(){throw e(x)}getAuthorityMetadataKeys(){throw e(x)}setThrottlingCache(){throw e(x)}getThrottlingCache(){throw e(x)}removeItem(){throw e(x)}getKeys(){throw e(x)}getAccountKeys(){throw e(x)}getTokenKeys(){throw e(x)}generateCredentialKey(){throw e(x)}generateAccountKey(){throw e(x)}}const b={AcquireTokenByCode:"acquireTokenByCode",AcquireTokenByRefreshToken:"acquireTokenByRefreshToken",AcquireTokenSilent:"acquireTokenSilent",AcquireTokenSilentAsync:"acquireTokenSilentAsync",AcquireTokenPopup:"acquireTokenPopup",AcquireTokenPreRedirect:"acquireTokenPreRedirect",AcquireTokenRedirect:"acquireTokenRedirect",CryptoOptsGetPublicKeyThumbprint:"cryptoOptsGetPublicKeyThumbprint",CryptoOptsSignJwt:"cryptoOptsSignJwt",SilentCacheClientAcquireToken:"silentCacheClientAcquireToken",SilentIframeClientAcquireToken:"silentIframeClientAcquireToken",AwaitConcurrentIframe:"awaitConcurrentIframe",SilentRefreshClientAcquireToken:"silentRefreshClientAcquireToken",SsoSilent:"ssoSilent",StandardInteractionClientGetDiscoveredAuthority:"standardInteractionClientGetDiscoveredAuthority",FetchAccountIdWithNativeBroker:"fetchAccountIdWithNativeBroker",NativeInteractionClientAcquireToken:"nativeInteractionClientAcquireToken",BaseClientCreateTokenRequestHeaders:"baseClientCreateTokenRequestHeaders",NetworkClientSendPostRequestAsync:"networkClientSendPostRequestAsync",RefreshTokenClientExecutePostToTokenEndpoint:"refreshTokenClientExecutePostToTokenEndpoint",AuthorizationCodeClientExecutePostToTokenEndpoint:"authorizationCodeClientExecutePostToTokenEndpoint",BrokerHandhshake:"brokerHandshake",AcquireTokenByRefreshTokenInBroker:"acquireTokenByRefreshTokenInBroker",AcquireTokenByBroker:"acquireTokenByBroker",RefreshTokenClientExecuteTokenRequest:"refreshTokenClientExecuteTokenRequest",RefreshTokenClientAcquireToken:"refreshTokenClientAcquireToken",RefreshTokenClientAcquireTokenWithCachedRefreshToken:"refreshTokenClientAcquireTokenWithCachedRefreshToken",RefreshTokenClientAcquireTokenByRefreshToken:"refreshTokenClientAcquireTokenByRefreshToken",RefreshTokenClientCreateTokenRequestBody:"refreshTokenClientCreateTokenRequestBody",AcquireTokenFromCache:"acquireTokenFromCache",SilentFlowClientAcquireCachedToken:"silentFlowClientAcquireCachedToken",SilentFlowClientGenerateResultFromCacheRecord:"silentFlowClientGenerateResultFromCacheRecord",AcquireTokenBySilentIframe:"acquireTokenBySilentIframe",InitializeBaseRequest:"initializeBaseRequest",InitializeSilentRequest:"initializeSilentRequest",InitializeClientApplication:"initializeClientApplication",InitializeCache:"initializeCache",SilentIframeClientTokenHelper:"silentIframeClientTokenHelper",SilentHandlerInitiateAuthRequest:"silentHandlerInitiateAuthRequest",SilentHandlerMonitorIframeForHash:"silentHandlerMonitorIframeForHash",SilentHandlerLoadFrame:"silentHandlerLoadFrame",SilentHandlerLoadFrameSync:"silentHandlerLoadFrameSync",StandardInteractionClientCreateAuthCodeClient:"standardInteractionClientCreateAuthCodeClient",
14StandardInteractionClientGetClientConfiguration:"standardInteractionClientGetClientConfiguration",StandardInteractionClientInitializeAuthorizationRequest:"standardInteractionClientInitializeAuthorizationRequest",GetAuthCodeUrl:"getAuthCodeUrl",GetStandardParams:"getStandardParams",HandleCodeResponseFromServer:"handleCodeResponseFromServer",HandleCodeResponse:"handleCodeResponse",HandleResponseEar:"handleResponseEar",HandleResponsePlatformBroker:"handleResponsePlatformBroker",HandleResponseCode:"handleResponseCode",UpdateTokenEndpointAuthority:"updateTokenEndpointAuthority",AuthClientAcquireToken:"authClientAcquireToken",AuthClientExecuteTokenRequest:"authClientExecuteTokenRequest",AuthClientCreateTokenRequestBody:"authClientCreateTokenRequestBody",PopTokenGenerateCnf:"popTokenGenerateCnf",PopTokenGenerateKid:"popTokenGenerateKid",HandleServerTokenResponse:"handleServerTokenResponse",DeserializeResponse:"deserializeResponse",AuthorityFactoryCreateDiscoveredInstance:"authorityFactoryCreateDiscoveredInstance",AuthorityResolveEndpointsAsync:"authorityResolveEndpointsAsync",AuthorityResolveEndpointsFromLocalSources:"authorityResolveEndpointsFromLocalSources",AuthorityGetCloudDiscoveryMetadataFromNetwork:"authorityGetCloudDiscoveryMetadataFromNetwork",AuthorityUpdateCloudDiscoveryMetadata:"authorityUpdateCloudDiscoveryMetadata",AuthorityGetEndpointMetadataFromNetwork:"authorityGetEndpointMetadataFromNetwork",AuthorityUpdateEndpointMetadata:"authorityUpdateEndpointMetadata",AuthorityUpdateMetadataWithRegionalInformation:"authorityUpdateMetadataWithRegionalInformation",RegionDiscoveryDetectRegion:"regionDiscoveryDetectRegion",RegionDiscoveryGetRegionFromIMDS:"regionDiscoveryGetRegionFromIMDS",RegionDiscoveryGetCurrentVersion:"regionDiscoveryGetCurrentVersion",AcquireTokenByCodeAsync:"acquireTokenByCodeAsync",GetEndpointMetadataFromNetwork:"getEndpointMetadataFromNetwork",GetCloudDiscoveryMetadataFromNetworkMeasurement:"getCloudDiscoveryMetadataFromNetworkMeasurement",HandleRedirectPromiseMeasurement:"handleRedirectPromise",HandleNativeRedirectPromiseMeasurement:"handleNativeRedirectPromise",UpdateCloudDiscoveryMetadataMeasurement:"updateCloudDiscoveryMetadataMeasurement",UsernamePasswordClientAcquireToken:"usernamePasswordClientAcquireToken",NativeMessageHandlerHandshake:"nativeMessageHandlerHandshake",NativeGenerateAuthResult:"nativeGenerateAuthResult",RemoveHiddenIframe:"removeHiddenIframe",ClearTokensAndKeysWithClaims:"clearTokensAndKeysWithClaims",CacheManagerGetRefreshToken:"cacheManagerGetRefreshToken",ImportExistingCache:"importExistingCache",SetUserData:"setUserData",LocalStorageUpdated:"localStorageUpdated",GeneratePkceCodes:"generatePkceCodes",GenerateCodeVerifier:"generateCodeVerifier",GenerateCodeChallengeFromVerifier:"generateCodeChallengeFromVerifier",Sha256Digest:"sha256Digest",GetRandomValues:"getRandomValues",GenerateHKDF:"generateHKDF",GenerateBaseKey:"generateBaseKey",Base64Decode:"base64Decode",UrlEncodeArr:"urlEncodeArr",Encrypt:"encrypt",Decrypt:"decrypt",GenerateEarKey:"generateEarKey",DecryptEarResponse:"decryptEarResponse",LoadExternalTokens:"LoadExternalTokens",LoadAccount:"loadAccount",LoadIdToken:"loadIdToken",LoadAccessToken:"loadAccessToken",LoadRefreshToken:"loadRefreshToken",SsoCapable:"ssoCapable"},lQ={InProgress:1};class Bc{startMeasurement(){}endMeasurement(){}flushMeasurement(){return null}}class dV{generateId(){return"callback-id"}startMeasurement(I,g){return{end:()=>null,discard:()=>{},add:()=>{},increment:()=>{},event:{eventId:this.generateId(),status:lQ.InProgress,authority:"",libraryName:"",libraryVersion:"",clientId:"",name:I,startTimeMs:Date.now(),correlationId:g||""},measurement:new Bc}}startPerformanceMeasurement(){return new Bc}calculateQueuedTime(){return 0}addQueueMeasurement(){}setPreQueueTime(){}endMeasurement(){return null}discardMeasurements(){}removePerformanceCallback(){return!0}addPerformanceCallback(){return""}emitEvents(){}addFields(){}incrementFields(){}cacheEventByCorrelationId(){}}const ZV={tokenRenewalOffsetSeconds:QF,preventCorsPreflight:!1},dQ={loggerCallback:()=>{},piiLoggingEnabled:!1,logLevel:GI.Info,correlationId:Y.EMPTY_STRING},ZQ={claimsBasedCachingEnabled:!1},BQ={async sendGetRequestAsync(){throw e(x)},async sendPostRequestAsync(){throw e(x)}},cQ={sku:Y.SKU,version:jZ,cpu:Y.EMPTY_STRING,os:Y.EMPTY_STRING},iQ={clientSecret:Y.EMPTY_STRING,clientAssertion:void 0},FQ={azureCloudInstance:OZ.None,tenant:`${Y.DEFAULT_COMMON_TENANT}`},VQ={application:{appName:"",appVersion:""}};function GQ({authOptions:C,systemOptions:I,loggerOptions:g,cacheOptions:A,storageInterface:l,networkInterface:d,cryptoInterface:Z,clientCredentials:B,library
14Info:c,telemetry:i,serverTelemetryManager:F,persistencePlugin:V,serializableCache:W}){const G={...dQ,...g};return{authOptions:WQ(C),systemOptions:{...ZV,...I},loggerOptions:G,cacheOptions:{...ZQ,...A},storageInterface:l||new AQ(C.clientId,Ul,new IC(G),new dV),networkInterface:d||BQ,cryptoInterface:Z||Ul,clientCredentials:B||iQ,libraryInfo:{...cQ,...c},telemetry:{...VQ,...i},serverTelemetryManager:F||null,persistencePlugin:V||null,serializableCache:W||null}}function WQ(C){return{clientCapabilities:[],azureCloudOptions:FQ,skipAuthorityMetadataCache:!1,instanceAware:!1,encodeExtraQueryParams:!1,...C}}function BV(C){return C.authOptions.authority.options.protocolMode===vI.OIDC}const Wg={HOME_ACCOUNT_ID:"home_account_id",UPN:"UPN"};const VC="client_id",cV="redirect_uri",RQ="response_type",sQ="response_mode",bQ="grant_type",UQ="claims",oQ="scope",mQ="refresh_token",nQ="state",QQ="nonce",aQ="prompt",NQ="code",YQ="code_challenge",wQ="code_challenge_method",hQ="code_verifier",eQ="client-request-id",JQ="x-client-SKU",SQ="x-client-VER",XQ="x-client-OS",yQ="x-client-CPU",tQ="x-client-current-telemetry",DQ="x-client-last-telemetry",MQ="x-ms-lib-capability",HQ="x-app-name",uQ="x-app-ver",pQ="post_logout_redirect_uri",KQ="id_token_hint",kQ="client_secret",TQ="client_assertion",zQ="client_assertion_type",iV="token_type",FV="req_cnf",cc="return_spa_code",LQ="nativebroker",EQ="logout_hint",rQ="sid",jQ="login_hint",OQ="domain_hint",vQ="x-client-xtra-sku",GC="brk_client_id",al="brk_redirect_uri",ZZ="instance_aware",xQ="ear_jwk",PQ="ear_jwe_crypto",fQ="clidata";function rl(C,I,g){if(!I)return;const A=C.get(VC);A&&C.has(GC)&&g?.addFields({embeddedClientId:A,embeddedRedirectUri:C.get(cV)},I)}function gB(C,I){C.set(RQ,I)}function _Q(C,I){C.set(sQ,I||yn.QUERY)}function qQ(C){C.set(LQ,"1")}function CB(C,I,g=!0,A=rC){g&&!A.includes("openid")&&!I.includes("openid")&&A.push("openid");const l=g?[...I||[],...A]:I||[],d=new hI(l);C.set(oQ,d.printScopes())}function AB(C,I){C.set(VC,I)}function lB(C,I){C.set(cV,I)}function $Q(C,I){C.set(pQ,I)}function Ia(C,I){C.set(KQ,I)}function ga(C,I){C.set(OQ,I)}function jA(C,I){C.set(jQ,I)}function Nl(C,I){C.set(kI.CCS_HEADER,`UPN:${I}`)}function cA(C,I){C.set(kI.CCS_HEADER,`Oid:${I.uid}@${I.utid}`)}function ic(C,I){C.set(rQ,I)}function dB(C,I,g){const A=UV(I,g);try{JSON.parse(A)}catch{throw iI(vZ)}C.set(UQ,A)}function wA(C,I){C.set(eQ,I)}function ZB(C,I){C.set(JQ,I.sku),C.set(SQ,I.version),I.os&&C.set(XQ,I.os),I.cpu&&C.set(yQ,I.cpu)}function BB(C,I){I?.appName&&C.set(HQ,I.appName),I?.appVersion&&C.set(uQ,I.appVersion)}function Ca(C,I){C.set(aQ,I)}function VV(C,I){I&&C.set(nQ,I)}function Aa(C,I){C.set(QQ,I)}function cB(C,I,g){if(I&&g)C.set(YQ,I),C.set(wQ,g);else throw iI(xZ)}function la(C,I){C.set(NQ,I)}function da(C,I){C.set(mQ,I)}function Za(C,I){C.set(hQ,I)}function GV(C,I){C.set(kQ,I)}function WV(C,I){I&&C.set(TQ,I)}function RV(C,I){I&&C.set(zQ,I)}function sV(C,I){C.set(bQ,I)}function iB(C){C.set(tn,"1")}function Ba(C){C.set(fQ,"1")}function bV(C){C.has(ZZ)||C.set(ZZ,"true")}function Pg(C,I){Object.entries(I).forEach(([g,A])=>{!C.has(g)&&A&&C.set(g,A)})}function UV(C,I){let g;if(!C)g={};else try{g=JSON.parse(C)}catch{throw iI(vZ)}return I&&I.length>0&&(g.hasOwnProperty(EA.ACCESS_TOKEN)||(g[EA.ACCESS_TOKEN]={}),g[EA.ACCESS_TOKEN][EA.XMS_CC]={values:I}),JSON.stringify(g)}function FB(C,I){I&&(C.set(iV,BI.POP),C.set(FV,I))}function oV(C,I){I&&(C.set(iV,BI.SSH),C.set(FV,I))}function mV(C,I){C.set(tQ,I.generateCurrentRequestHeaderValue()),C.set(DQ,I.generateLastRequestHeaderValue())}function nV(C){C.set(MQ,BA.X_MS_LIB_CAPABILITY_VALUE)}function ca(C,I){C.set(EQ,I)}function jl(C,I,g){C.has(GC)||C.set(GC,I),C.has(al)||C.set(al,g)}function ia(C,I){C.set(xQ,encodeURIComponent(I)),C.set(PQ,"eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0")}function Fa(C,I){Object.entries(I).forEach(([g,A])=>{A&&C.set(g,A)})}function Va(C){return C.hasOwnProperty("authorization_endpoint")&&C.hasOwnProperty("token_endpoint")&&C.hasOwnProperty("issuer")&&C.hasOwnProperty("jwks_uri")}function Ga(C){return C.hasOwnProperty("tenant_discovery_endpoint")&&C.hasOwnProperty("metadata")}function Wa(C){return C.hasOwnProperty("error")&&C.hasOwnProperty("error_description")}const xI=(C,I,g,A,l)=>(...d)=>{g.trace(`Executing function ${I}`);const Z=A?.startMeasurement(I,l);if(l){const B=I+"CallCount";A?.incrementFields({[B]:1},l)}try{const B=C(...d);return Z?.end({success:!0}),g.trace(`Returning result from ${I}`),B}catch(B){g.trace(`Error occurred in ${I}`);try{g.trace(JSON.stringify(B))}catch{g.trace("Unable to print error message.")}throw Z?.end({success:!1},B),B}},a=(C,I,g,A,l)=>(...d)=>{g.trace(`Executing function ${I}`);const Z=A?.startMeasurement(I,l);if(l){const B=I+"CallCount";A?.incrementFields({[B]:1},l)}return A?.setPreQueueTime(I,l),C(...d).then(B=>(g.trace(`Returning result from ${I}`),Z?.end({success:!0}),B)).catch(B=>{g.trace(`Error occurred in ${I}`);try{g.trace(JSON.stringify(B))}catch{g.trace("Unable to print error message.")}throw Z?.end({success:!1},B),B})};class Ol{constructor(I,g,A,l){this.networkInterface=I,this.logger=g,this.performanceClient=A,this.correlationId=l}async detectRegion(I,g){this.performanceClient?.addQueueMeasurement(b.RegionDiscoveryDetectRegion,this.correlationId);let A=I;
14if(A)g.region_source=aC.ENVIRONMENT_VARIABLE;else{const l=Ol.IMDS_OPTIONS;try{const d=await a(this.getRegionFromIMDS.bind(this),b.RegionDiscoveryGetRegionFromIMDS,this.logger,this.performanceClient,this.correlationId)(Y.IMDS_VERSION,l);if(d.status===rg.SUCCESS&&(A=d.body,g.region_source=aC.IMDS),d.status===rg.BAD_REQUEST){const Z=await a(this.getCurrentVersion.bind(this),b.RegionDiscoveryGetCurrentVersion,this.logger,this.performanceClient,this.correlationId)(l);if(!Z)return g.region_source=aC.FAILED_AUTO_DETECTION,null;const B=await a(this.getRegionFromIMDS.bind(this),b.RegionDiscoveryGetRegionFromIMDS,this.logger,this.performanceClient,this.correlationId)(Z,l);B.status===rg.SUCCESS&&(A=B.body,g.region_source=aC.IMDS)}}catch{return g.region_source=aC.FAILED_AUTO_DETECTION,null}}return A||(g.region_source=aC.FAILED_AUTO_DETECTION),A||null}async getRegionFromIMDS(I,g){return this.performanceClient?.addQueueMeasurement(b.RegionDiscoveryGetRegionFromIMDS,this.correlationId),this.networkInterface.sendGetRequestAsync(`${Y.IMDS_ENDPOINT}?api-version=${I}&format=text`,g,Y.IMDS_TIMEOUT)}async getCurrentVersion(I){this.performanceClient?.addQueueMeasurement(b.RegionDiscoveryGetCurrentVersion,this.correlationId);try{const g=await this.networkInterface.sendGetRequestAsync(`${Y.IMDS_ENDPOINT}?format=json`,I);return g.status===rg.BAD_REQUEST&&g.body&&g.body["newest-versions"]&&g.body["newest-versions"].length>0?g.body["newest-versions"][0]:null}catch{return null}}}Ol.IMDS_OPTIONS={headers:{Metadata:"true"}};function LI(){return Math.round(new Date().getTime()/1e3)}function Fc(C){return C.getTime()/1e3}function tC(C){return C?new Date(Number(C)*1e3):new Date}function Yl(C,I){const g=Number(C)||0;return LI()+I>g}function Vc(C,I){const g=Number(C)+I*24*60*60*1e3;return Date.now()>g}function Ra(C){return Number(C)>LI()}function vl(C,I,g,A,l){return{credentialType:tI.ID_TOKEN,homeAccountId:C,environment:I,clientId:A,secret:g,realm:l,lastUpdatedAt:Date.now().toString()}}function xl(C,I,g,A,l,d,Z,B,c,i,F,V,W,G,R){const s={homeAccountId:C,credentialType:tI.ACCESS_TOKEN,secret:g,cachedAt:LI().toString(),expiresOn:Z.toString(),extendedExpiresOn:B.toString(),environment:I,clientId:A,realm:l,target:d,tokenType:F||BI.BEARER,lastUpdatedAt:Date.now().toString()};if(V&&(s.userAssertionHash=V),i&&(s.refreshOn=i.toString()),G&&(s.requestedClaims=G,s.requestedClaimsHash=R),s.tokenType?.toLowerCase()!==BI.BEARER.toLowerCase())switch(s.credentialType=tI.ACCESS_TOKEN_WITH_AUTH_SCHEME,s.tokenType){case BI.POP:const Q=Yg(g,c);if(!Q?.cnf?.kid)throw e(HF);s.keyId=Q.cnf.kid;break;case BI.SSH:s.keyId=W}return s}function QV(C,I,g,A,l,d,Z){const B={credentialType:tI.REFRESH_TOKEN,homeAccountId:C,environment:I,clientId:A,secret:g,lastUpdatedAt:Date.now().toString()};return d&&(B.userAssertionHash=d),l&&(B.familyId=l),Z&&(B.expiresOn=Z.toString()),B}function Pl(C){return C.hasOwnProperty("homeAccountId")&&C.hasOwnProperty("environment")&&C.hasOwnProperty("credentialType")&&C.hasOwnProperty("clientId")&&C.hasOwnProperty("secret")}function Gc(C){return C?Pl(C)&&C.hasOwnProperty("realm")&&C.hasOwnProperty("target")&&(C.credentialType===tI.ACCESS_TOKEN||C.credentialType===tI.ACCESS_TOKEN_WITH_AUTH_SCHEME):!1}function sa(C){return C?Pl(C)&&C.hasOwnProperty("realm")&&C.credentialType===tI.ID_TOKEN:!1}function Wc(C){return C?Pl(C)&&C.credentialType===tI.REFRESH_TOKEN:!1}function ba(C,I){const g=C.indexOf(yI.CACHE_KEY)===0;let A=!0;return I&&(A=I.hasOwnProperty("failedRequests")&&I.hasOwnProperty("errors")&&I.hasOwnProperty("cacheHits")),g&&A}function Ua(C,I){let g=!1;C&&(g=C.indexOf(BA.THROTTLING_PREFIX)===0);let A=!0;return I&&(A=I.hasOwnProperty("throttleTime")),g&&A}function oa({environment:C,clientId:I}){return[pZ,C,I].join(RA.CACHE_KEY_SEPARATOR).toLowerCase()}function ma(C,I){return I?C.indexOf(pZ)===0&&I.hasOwnProperty("clientId")&&I.hasOwnProperty("environment"):!1}function na(C,I){return I?C.indexOf(sl.CACHE_KEY)===0&&I.hasOwnProperty("aliases")&&I.hasOwnProperty("preferred_cache")&&I.hasOwnProperty("preferred_network")&&I.hasOwnProperty("canonical_authority")&&I.hasOwnProperty("authorization_endpoint")&&I.hasOwnProperty("token_endpoint")&&I.hasOwnProperty("issuer")&&I.hasOwnProperty("aliasesFromNetwork")&&I.hasOwnProperty("endpointsFromNetwork")&&I.hasOwnProperty("expiresAt")&&I.hasOwnProperty("jwks_uri"):!1}function Rc(){return LI()+sl.REFRESH_TIME_SECONDS}function OA(C,I,g){C.authorization_endpoint=I.authorization_endpoint,C.token_endpoint=I.token_endpoint,C.end_session_endpoint=I.end_session_endpoint,C.issuer=I.issuer,C.endpointsFromNetwork=g,C.jwks_uri=I.jwks_uri}function ed(C,I,g){C.aliases=I.aliases,C.preferred_cache=I.preferred_cache,C.preferred_network=I.preferred_network,C.aliasesFromNetwork=g}function sc(C){return C.expiresAt<=LI()}class TI{constructor(I,g,A,l,d,Z,B,c){this.canonicalAuthority=I,this._canonicalAuthority.val
14idateAsUri(),this.networkInterface=g,this.cacheManager=A,this.authorityOptions=l,this.regionDiscoveryMetadata={region_used:void 0,region_source:void 0,region_outcome:void 0},this.logger=d,this.performanceClient=B,this.correlationId=Z,this.managedIdentity=c||!1,this.regionDiscovery=new Ol(g,this.logger,this.performanceClient,this.correlationId)}getAuthorityType(I){if(I.HostNameAndPort.endsWith(Y.CIAM_AUTH_URL))return Gg.Ciam;const g=I.PathSegments;if(g.length)switch(g[0].toLowerCase()){case Y.ADFS:return Gg.Adfs;case Y.DSTS:return Gg.Dsts}return Gg.Default}get authorityType(){return this.getAuthorityType(this.canonicalAuthorityUrlComponents)}get protocolMode(){return this.authorityOptions.protocolMode}get options(){return this.authorityOptions}get canonicalAuthority(){return this._canonicalAuthority.urlString}set canonicalAuthority(I){this._canonicalAuthority=new lI(I),this._canonicalAuthority.validateAsUri(),this._canonicalAuthorityUrlComponents=null}get canonicalAuthorityUrlComponents(){return this._canonicalAuthorityUrlComponents||(this._canonicalAuthorityUrlComponents=this._canonicalAuthority.getUrlComponents()),this._canonicalAuthorityUrlComponents}get hostnameAndPort(){return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase()}get tenant(){return this.canonicalAuthorityUrlComponents.PathSegments[0]}get authorizationEndpoint(){if(this.discoveryComplete())return this.replacePath(this.metadata.authorization_endpoint);throw e(Sg)}get tokenEndpoint(){if(this.discoveryComplete())return this.replacePath(this.metadata.token_endpoint);throw e(Sg)}get deviceCodeEndpoint(){if(this.discoveryComplete())return this.replacePath(this.metadata.token_endpoint.replace("/token","/devicecode"));throw e(Sg)}get endSessionEndpoint(){if(this.discoveryComplete()){if(!this.metadata.end_session_endpoint)throw e(KF);return this.replacePath(this.metadata.end_session_endpoint)}else throw e(Sg)}get selfSignedJwtAudience(){if(this.discoveryComplete())return this.replacePath(this.metadata.issuer);throw e(Sg)}get jwksUri(){if(this.discoveryComplete())return this.replacePath(this.metadata.jwks_uri);throw e(Sg)}canReplaceTenant(I){return I.PathSegments.length===1&&!TI.reservedTenantDomains.has(I.PathSegments[0])&&this.getAuthorityType(I)===Gg.Default&&this.protocolMode!==vI.OIDC}replaceTenant(I){return I.replace(/{tenant}|{tenantid}/g,this.tenant)}replacePath(I){let g=I;const l=new lI(this.metadata.canonical_authority).getUrlComponents(),d=l.PathSegments;return this.canonicalAuthorityUrlComponents.PathSegments.forEach((B,c)=>{let i=d[c];if(c===0&&this.canReplaceTenant(l)){const F=new lI(this.metadata.authorization_endpoint).getUrlComponents().PathSegments[0];i!==F&&(this.logger.verbose(`Replacing tenant domain name ${i} with id ${F}`),i=F)}B!==i&&(g=g.replace(`/${i}/`,`/${B}/`))}),this.replaceTenant(g)}get defaultOpenIdConfigurationEndpoint(){const I=this.hostnameAndPort;return this.canonicalAuthority.endsWith("v2.0/")||this.authorityType===Gg.Adfs||this.protocolMode===vI.OIDC&&!this.isAliasOfKnownMicrosoftAuthority(I)?`${this.canonicalAuthority}.well-known/openid-configuration`:`${this.canonicalAuthority}v2.0/.well-known/openid-configuration`}discoveryComplete(){return!!this.metadata}async resolveEndpointsAsync(){this.performanceClient?.addQueueMeasurement(b.AuthorityResolveEndpointsAsync,this.correlationId);const I=this.getCurrentMetadataEntity(),g=await a(this.updateCloudDiscoveryMetadata.bind(this),b.AuthorityUpdateCloudDiscoveryMetadata,this.logger,this.performanceClient,this.correlationId)(I);this.canonicalAuthority=this.canonicalAuthority.replace(this.hostnameAndPort,I.preferred_network);const A=await a(this.updateEndpointMetadata.bind(this),b.AuthorityUpdateEndpointMetadata,this.logger,this.performanceClient,this.correlationId)(I);this.updateCachedMetadata(I,g,{source:A}),this.performanceClient?.addFields({cloudDiscoverySource:g,authorityEndpointSource:A},this.correlationId)}getCurrentMetadataEntity(){let I=this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);return I||(I={aliases:[],preferred_cache:this.hostnameAndPort,preferred_network:this.hostnameAndPort,canonical_authority:this.canonicalAuthority,authorization_endpoint:"",token_endpoint:"",end_session_endpoint:"",issuer:"",aliasesFromNetwork:!1,endpointsFromNetwork:!1,expiresAt:Rc(),jwks_uri:""}),I}updateCachedMetadata(I,g,A){g!==qI.CACHE&&A?.source!==qI.CACHE&&(I.expiresAt=Rc(),I.canonical_authority=this.canonicalAuthority);const l=this.cacheManager.generateAuthorityMetadataCacheKey(I.preferred_cache);this.cacheManager.setAuthorityMetadata(l,I),this.metadata=I}async updateEndpointMetadata(I){this.performanceClient?.addQueueMeasurement(b.AuthorityUpdateEndpointMetadata,this.correlationId);const g=this.updateEndpointMetadataFromLocalSources(I);if(g){if(g.source===qI.HARDCODED_VALUES&&this.authorityOptions.azureRegionConfiguration?.azureRegion&&g.metadata){const l=await a(this.updateMetadataWithRegionalInformation.bind(this),b.AuthorityUpdateMetadataWithRegionalInformation,this.logger,this.performanceClient,this.correlationId)(g.metadata);OA(I,l,!1),I.canonical_authority=this.canonicalAuthority}return g.source}let A=await a(this.getEndpointMetadataFromNetwork.bind(this),b.AuthorityGetEndpointMetadataFromNetwork,this.logger,this.performanceClient,this.correlationId)();if(A)return this.authorityOptions.azureRegionConfiguration?.azureRegion&&(A=await a(this.updateMetadataWithRegionalInformation.bind(this),b.AuthorityUpdateMetadataWithRegionalInformation,this.logger,this.performanceClient,this.correlationId)(A)),OA(I,A,!0),qI.NETWORK;throw e(wF,this.defaultOpenIdConfigurationEndpoint)}updateEndpointMetadataFromLocalSources(I){this.logger.verbose("Attempting to get endpoint metadata from authority configuration");const g=this.getEndpointMetadataFromConfig();if(g)return this.logger.verbose("Found endpoint metadata in authority configuration"),OA(I,g,!1),{source:qI.CONFIG};if(this.logger.verbose("Did not find endpoint metadata in the config... Attempting to get endpoint metadata from the hardcoded values."),this.authorityOptions.skipAuthorityMetadataCache)this.logger.verbose("Skipping hardcoded metadata cache since skipAuthorityMetadataCache is set to true. Attempting to get endpoint metadata from the network metadata cache.");else{const l=this.getEndpointMetadataFromHardcodedValues();if(l)return OA(I,l,!1),{source:qI.HARDCODED_VALUES,metadata:l};this.logger.verbose("Did not find endpoint metadata in hardcoded values... Attempting to get endpoint metadata from the network metadata cache.")}const A=sc(I);return this.isAuthoritySameType(I)&&I.endpointsFromNetwork&&!A?(this.logger.verbose("Found endpoint metadata in the cache."),{source:qI.CACHE}):(A&&this.logger.verbose("The metadata entity is expired."),null)}isAuthoritySameType(I){return new lI(I.canonical_authority).getUrlComponents().PathSegments.length===this.canonicalAuthorityUrlComponents.PathSegments.length}getEndpointMetadataFromConfig(){if(this.authorityOptions.authorityMetadata)try{return JSON.parse(this.authorityOptions.authorityMetadata)}catch{throw iI(OF)}return null}async getEndpointMetadataFromNetwork(){this.performanceClient?.addQueueMeasurement(b.AuthorityGetEndpointMetadataFromNetwork,this.correlationId);const I={},g=this.defaultOpenIdConfigurationEndpoint;this.logger.verbose(`Authority.getEndpointMetadataFromNetwork: attempting to retrieve OAuth endpoints from ${g}`);try{const A=await this.networkInterface.sendGetRequestAsync(g,I);return Va(A.body)?A.body:(this.logger.verbose("Authority.getEndpointMetadataFromNetwork: could not parse response as OpenID configuration"),null)}catch(A){return this.logger.verbose(`Authority.getEndpointMetadataFromNetwork: ${A}`),null}}getEndpointMetadataFromHardcodedValues(){return this.hostnameAndPort in dc?dc[this.hostnameAndPort]:null}async updateMetadataWithRegionalInformation(I){this.performanceClient?.addQueueMeasurement(b.AuthorityUpdateMetadataWithRegionalInformation,this.correlationId);const g=this.authorityOptions.azureRegionConfiguration?.azureRegion;if(g){if(g!==Y.AZURE_REGION_AUTO_DISCOVER_FLAG)return this.regionDiscoveryMetadata.region_outcome=wd.CONFIGURED_NO_AUTO_DETECTION,this.regionDiscoveryMetadata.region_used=g,TI.replaceWithRegionalInformation(I,g);const A=await a(this.regionDiscovery.detectRegion.bind(this.regionDiscovery),b.RegionDiscoveryDetectRegion,this.logger,this.performanceClient,this.correlationId)(this.authorityOptions.azureRegionConfiguration?.environmentRegion,this.regionDiscoveryMetadata);if(A)return this.regionDiscoveryMetadata.region_outcome=wd.AUTO_DETECTION_REQUESTED_SUCCESSFUL,this.regionDiscoveryMetadata.region_used=A,TI.replaceWithRegionalInformation(I,A);this.regionDiscoveryMetadata.region_outcome=wd.AUTO_DETECTION_REQUESTED_FAILED}return I}async updateCloudDiscoveryMetadata(I){this.performanceClient?.addQueueMeasurement(b.AuthorityUpdateCloudDiscoveryMetadata,this.correlationId);const g=this.updateCloudDiscoveryMetadataFromLocalSources(I);if(g)return g;const A=await a(this.getCloudDiscoveryMetadataFromNetwork.bind(this),b.AuthorityGetCloudDiscoveryMetadataFromNetwork,this.logger,this.performanceClient,this.correlationId)();if(A)return ed(I,A,!0),qI.NETWORK;throw iI(vF)}updateCloudDiscoveryMetadataFromLocalSources(I){this.logger.verbose("Attempting to get cloud discovery metadata from authority configuration"),this.logger.verbosePii(`Known Authorities: ${this.authorityOptions.knownAuthorities||Y.NOT_APPLICABLE}`),this.logger.verbosePii(`Authority Metadata: ${this.authorityOptions.authorityMetadata||Y.NOT_APPLICABLE}`),this.logger.verbosePii(`Canonical Authority: ${I.canonical_authority||Y.NOT_APPLICABLE}`);const g=this.getCloudDiscoveryMetadataFromConfig();if(g)return this.logger.verbose("Found cloud discovery metadata in authority configuration"),ed(I,g,!1),qI.CONFIG;if(this.logger.verbose("Did not find cloud discovery metadata in the config... Attempting to get cloud discovery metadata from the hardcoded values."),this.options.skipAuthorityMetadataCache)this.logger.verbose("Skipping hardcoded cloud discovery metadata cache since skipAuthorityMetadataCache is set to true. Attempting to get cloud discovery metadata from the network metadata cache.");else{const l=CQ(this.hostnameAndPort);if(l)return this.logger.verbose("Found cloud discovery metadata from hardcoded values."),ed(I,l,!1),qI.HARDCODED_VALUES;this.logger.verbose("Did not find cloud discovery metadata in hardcoded values... Attempting to get cloud discovery metadata from the network metadata cache.")}const A=sc(I);return this.isAuthoritySameType(I)&&I.aliasesFromNetwork&&!A?(this.logger.verbose("Found cloud discovery metadata in the cache."),qI.CACHE):(A&&this.logger.verbose("The metadata entity is expired."),null)}getCloudDiscoveryMetadataFromConfig(){if(this.authorityType===Gg.Ciam)return this.logger.verbose("CIAM authorities do not support cloud discovery metadata, generate the aliases from authority host."),TI.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);if(this.authorityOptions.cloudDiscoveryMetadata){this.logger.verbose("The cloud discovery metadata has been provided as a network response, in the config.");try{this.logger.verbose("Attempting to parse the cloud discovery metadata.");const I=JSON.parse(this.authorityOptions.cloudDiscoveryMetadata),g=nl(I.metadata,this.hostnameAndPort);if(this.logger.verbose("Parsed the cloud discovery metadata."),g)return this.logger.verbose("There is returnable metadata attached to the parsed cloud discovery metadata."),g;this.logger.verbose("There is no metadata attached to the parsed cloud discovery metadata.")}catch{throw this.logger.verbose("Unable to parse the cloud discovery metadata. Throwing Invalid Cloud Discovery Metadata Error."),iI(PZ)}}return this.isInKnownAuthorities()?(this.logger.verbose("The host is included in knownAuthorities. Creating new cloud discovery metadata from the host."),TI.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort)):null}async getCloudDiscoveryMetadataFromNetwork(){this.performanceClient?.addQueueMeasurement(b.AuthorityGetCloudDiscoveryMetadataFromNetwork,this.correlationId);const I=`${Y.AAD_INSTANCE_DISCOVERY_ENDPT}${this.canonicalAuthority}oauth2/v2.0/authorize`,g={};let A=null;try{const l=await this.networkInterface.sendGetRequestAsync(I,g);let d,Z;
14if(Ga(l.body))d=l.body,Z=d.metadata,this.logger.verbosePii(`tenant_discovery_endpoint is: ${d.tenant_discovery_endpoint}`);else if(Wa(l.body)){if(this.logger.warning(`A CloudInstanceDiscoveryErrorResponse was returned. The cloud instance discovery network request's status code is: ${l.status}`),d=l.body,d.error===Y.INVALID_INSTANCE)return this.logger.error("The CloudInstanceDiscoveryErrorResponse error is invalid_instance."),null;this.logger.warning(`The CloudInstanceDiscoveryErrorResponse error is ${d.error}`),this.logger.warning(`The CloudInstanceDiscoveryErrorResponse error description is ${d.error_description}`),this.logger.warning("Setting the value of the CloudInstanceDiscoveryMetadata (returned from the network) to []"),Z=[]}else return this.logger.error("AAD did not return a CloudInstanceDiscoveryResponse or CloudInstanceDiscoveryErrorResponse"),null;this.logger.verbose("Attempting to find a match between the developer's authority and the CloudInstanceDiscoveryMetadata returned from the network request."),A=nl(Z,this.hostnameAndPort)}catch(l){if(l instanceof FI)this.logger.error(`There was a network error while attempting to get the cloud discovery instance metadata. 15Error: ${l.errorCode} 16Error Description: ${l.errorMessage}`);else{const d=l;this.logger.error(`A non-MSALJS error was thrown while attempting to get the cloud instance discovery metadata. 17Error: ${d.name} 18Error Description: ${d.message}`)}return null}return A||(this.logger.warning("The developer's authority was not found within the CloudInstanceDiscoveryMetadata returned from the network request."),this.logger.verbose("Creating custom Authority for custom domain scenario."),A=TI.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort)),A}isInKnownAuthorities(){return this.authorityOptions.knownAuthorities.filter(g=>g&&lI.getDomainFromUrl(g).toLowerCase()===this.hostnameAndPort).length>0}static generateAuthority(I,g){let A;if(g&&g.azureCloudInstance!==OZ.None){const l=g.tenant?g.tenant:Y.DEFAULT_COMMON_TENANT;A=`${g.azureCloudInstance}/${l}/`}return A||I}static createCloudDiscoveryMetadataFromHost(I){return{preferred_network:I,preferred_cache:I,aliases:[I]}}getPreferredCache(){if(this.managedIdentity)return Y.DEFAULT_AUTHORITY_HOST;if(this.discoveryComplete())return this.metadata.preferred_cache;throw e(Sg)}isAlias(I){return this.metadata.aliases.indexOf(I)>-1}isAliasOfKnownMicrosoftAuthority(I){return lV.has(I)}static isPublicCloudAuthority(I){return Y.KNOWN_PUBLIC_CLOUDS.indexOf(I)>=0}static buildRegionalAuthorityString(I,g,A){const l=new lI(I);l.validateAsUri();const d=l.getUrlComponents();let Z=`${g}.${d.HostNameAndPort}`;this.isPublicCloudAuthority(d.HostNameAndPort)&&(Z=`${g}.${Y.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX}`);const B=lI.constructAuthorityUriFromObject({...l.getUrlComponents(),HostNameAndPort:Z}).urlString;return A?`${B}?${A}`:B}static replaceWithRegionalInformation(I,g){const A={...I};return A.authorization_endpoint=TI.buildRegionalAuthorityString(A.authorization_endpoint,g),A.token_endpoint=TI.buildRegionalAuthorityString(A.token_endpoint,g),A.end_session_endpoint&&(A.end_session_endpoint=TI.buildRegionalAuthorityString(A.end_session_endpoint,g)),A}static transformCIAMAuthority(I){let g=I;const l=new lI(I).getUrlComponents();if(l.PathSegments.length===0&&l.HostNameAndPort.endsWith(Y.CIAM_AUTH_URL)){const d=l.HostNameAndPort.split(".")[0];g=`${g}${d}${Y.AAD_TENANT_DOMAIN_SUFFIX}`}return g}}TI.reservedTenantDomains=new Set(["{tenant}","{tenantid}",vg.COMMON,vg.CONSUMERS,vg.ORGANIZATIONS]);function Qa(C){const A=new lI(C).getUrlComponents().PathSegments.slice(-1)[0]?.toLowerCase();switch(A){case vg.COMMON:case vg.ORGANIZATIONS:case vg.CONSUMERS:return;default:return A}}function aV(C){return C.endsWith(Y.FORWARD_SLASH)?C:`${C}${Y.FORWARD_SLASH}`}function aa(C){const I=C.cloudDiscoveryMetadata;let g;if(I)try{g=JSON.parse(I)}catch{throw iI(PZ)}return{canonicalAuthority:C.authority?aV(C.authority):void 0,knownAuthorities:C.knownAuthorities,cloudDiscoveryMetadata:g}}async function VB(C,I,g,A,l,d,Z){Z?.addQueueMeasurement(b.AuthorityFactoryCreateDiscoveredInstance,d);const B=TI.transformCIAMAuthority(aV(C)),c=new TI(B,I,g,A,l,d,Z);try{return await a(c.resolveEndpointsAsync.bind(c),b.AuthorityResolveEndpointsAsync,l,Z,d)(),c}catch{throw e(Sg)}}class oC extends FI{constructor(I,g,A,l,d){super(I,g,A),this.name="ServerError",this.errorNo=l,this.status=d,Object.setPrototypeOf(this,oC.prototype)}}function fl(C,I,g){return{clientId:C,authority:I.authority,scopes:I.scopes,homeAccountIdentifier:g,claims:I.claims,authenticationScheme:I.authenticationScheme,resourceRequestMethod:I.resourceRequestMethod,resourceRequestUri:I.resourceRequestUri,shrClaims:I.shrClaims,sshKid:I.sshKid,embeddedClientId:I.embeddedClientId||I.tokenBodyParameters?.clientId}}class ag{static generateThrottlingStorageKey(I){return`${BA.THROTTLING_PREFIX}.${JSON.stringify(I)}`}static preProcess(I,g,A){const l=ag.generateThrottlingStorageKey(g),d=I.getThrottlingCache(l);if(d){if(d.throttleTime<Date.now()){I.removeItem(l,A);return}throw new oC(d.errorCodes?.join(" ")||Y.EMPTY_STRING,d.errorMessage,d.subError)}}static postProcess(I,g,A,l){if(ag.checkResponseStatus(A)||ag.checkResponseForRetryAfter(A)){const d={throttleTime:ag.calculateThrottleTime(parseInt(A.headers[kI.RETRY_AFTER])),error:A.body.error,errorCodes:A.body.error_codes,errorMessage:A.body.error_description,subError:A.body.suberror};I.setThrottlingCache(ag.generateThrottlingStorageKey(g),d,l)}}static checkResponseStatus(I){return I.status===429||I.status>=500&&I.status<600}static checkResponseForRetryAfter(I){return I.headers?I.headers.hasOwnProperty(kI.RETRY_AFTER)&&(I.status<200||I.status>=300):!1}static calculateThrottleTime(I){const g=I<=0?0:I,A=Date.now()/1e3;return Math.floor(Math.min(A+(g||BA.DEFAULT_THROTTLE_TIME_SECONDS),A+BA.DEFAULT_MAX_THROTTLE_TIME_SECONDS)*1e3)}static removeThrottle(I,g,A,l){const d=fl(g,A,l),Z=this.generateThrottlingStorageKey(d);I.removeItem(Z,A.correlationId)}}class _l extends FI{constructor(I,g,A){super(I.errorCode,I.errorMessage,I.subError),Object.setPrototypeOf(this,_l.prototype),this.name="NetworkError",this.error=I,this.httpStatus=g,this.responseHeaders=A}}function CA(C,I,g,A){return C.errorMessage=`${C.errorMessage}, additionalErrorInfo: error.name:${A?.name}, error.message:${A?.message}`,new _l(C,I,g)}class GB{constructor(I,g){this.config=GQ(I),this.logger=new IC(this.config.loggerOptions,kF,jZ),this.cryptoUtils=this.config.cryptoInterface,this.cacheManager=this.config.storageInterface,this.networkClient=this.config.networkInterface,this.serverTelemetryManager=this.config.serverTelemetryManager,this.authority=this.config.authOptions.authority,this.performanceClient=g}createTokenRequestHeaders(I){const g={};if(g[kI.CONTENT_TYPE]=Y.URL_FORM_CONTENT_TYPE,!this.config.systemOptions.preventCorsPreflight&&I)switch(I.type){case Wg.HOME_ACCOUNT_ID:try{const A=SC(I.credential);g[kI.CCS_HEADER]=`Oid:${A.uid}@${A.utid}`}catch(A){this.logger.verbose("Could not parse home account ID for CCS Header: "+A)}break;case Wg.UPN:g[kI.CCS_HEADER]=`UPN: ${I.credential}`;break}return g}async executePostToTokenEndpoint(I,g,A,l,d,Z){Z&&this.performanceClient?.addQueueMeasurement(Z,d);const B=await this.sendPostRequest(l,I,{body:g,headers:A},d);return this.config.serverTelemetryManager&&B.status<500&&B.status!==429&&this.config.serverTelemetryManager.clearTelemetryCache(),B}async sendPostRequest(I,g,A,l){ag.preProcess(this.cacheManager,I,l);let d;try{d=await a(this.networkClient.sendPostRequestAsync.bind(this.networkClient),b.NetworkClientSendPostRequestAsync,this.logger,this.performanceClient,l)(g,A);const Z=d.headers||{};this.performanceClient?.addFields({refreshTokenSize:d.body.refresh_token?.length||0,httpVerToken:Z[kI.X_MS_HTTP_VERSION]||"",requestId:Z[kI.X_MS_REQUEST_ID]||""},l)}catch(Z){if(Z instanceof _l){const B=Z.responseHeaders;throw B&&this.performanceClient?.addFields({httpVerToken:B[kI.X_MS_HTTP_VERSION]||"",requestId:B[kI.X_MS_REQUEST_ID]||"",contentTypeHeader:B[kI.CONTENT_TYPE]||void 0,contentLengthHeader:B[kI.CONTENT_LENGTH]||void 0,httpStatus:Z.httpStatus},l),Z.error}throw Z instanceof FI?Z:e(YF)}return ag.postProcess(this.cacheManager,I,d,l),d}async updateAuthority(I,g){this.performanceClient?.addQueueMeasurement(b.UpdateTokenEndpointAuthority,g);const A=`https://${I}/${this.authority.tenant}/`,l=await VB(A,this.networkClient,this.cacheManager,this.authority.options,this.logger,g,this.performanceClient);this.authority=l}createTokenQueryParameters(I){const g=new Map;return I.embeddedClientId&&jl(g,this.config.authOptions.clientId,this.config.authOptions.redirectUri),I.tokenQueryParameters&&Pg(g,I.tokenQueryParameters),wA(g,I.correlationId),rl(g,I.correlationId,this.performanceClient),sA(g)}}const wl="no_tokens_found",NV="native_account_unavailable",WB="refresh_token_expired",RB="ux_not_allowed",Na="interaction_required",Ya="consent_required",wa="login_required",ql="bad_token",YV="interrupted_user";const bc=[Na,Ya,wa,ql,RB,YV],ha=["message_only","additional_action","basic_action","user_password_expired","consent_required","bad_token","interrupted_user"],ea={[wl]:"No refresh token found in the cache. Please sign-in.",[NV]:"The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API.",[WB]:"Refresh token has expired.",[ql]:"Identity provider returned bad_token due to an expired or invalid refresh token. Please invoke an interactive API to resolve.",[RB]:"`canShowUI` flag in Edge was set to false. User interaction required on web page. Please invoke an interactive API to resolve.",[YV]:"The user could not be authenticated due to an interrupted state. Please invoke an interactive API to resolve."};class bg extends FI{constructor(I,g,A,l,d,Z,B,c){super(I,g,A),Object.setPrototypeOf(this,bg.prototype),this.timestamp=l||Y.EMPTY_STRING,this.traceId=d||Y.EMPTY_STRING,this.correlationId=Z||Y.EMPTY_STRING,this.claims=B||Y.EMPTY_STRING,this.name="InteractionRequiredAuthError",this.errorNo=c}}function wV(C,I,g){const A=!!C&&bc.indexOf(C)>-1,l=!!g&&ha.indexOf(g)>-1,d=!!I&&bc.some(Z=>I.indexOf(Z)>-1);return A||d||l}function hl(C){return new bg(C,ea[C])}class jC{static setRequestState(I,g,A){const l=jC.generateLibraryState(I,A);return g?`${l}${Y.RESOURCE_DELIM}${g}`:l}static generateLibraryState(I,g){if(!I)throw e(AZ);const A={id:I.createNewGuid()};g&&(A.meta=g);const l=JSON.stringify(A);return I.base64Encode(l)}static parseRequestState(I,g){if(!I)throw e(AZ);if(!g)throw e(TC);try{const A=g.split(Y.RESOURCE_DELIM),l=A[0],d=A.length>1?A.slice(1).join(Y.RESOURCE_DELIM):Y.EMPTY_STRING,Z=I.base64Decode(l),B=JSON.parse(Z);return{userRequestState:d||Y.EMPTY_STRING,libraryState:B}}catch{throw e(TC)}}}const Ja={SW:"sw"};class zC{constructor(I,g){this.cryptoUtils=I,this.performanceClient=g}async generateCnf(I,g){this.performanceClient?.addQueueMeasurement(b.PopTokenGenerateCnf,I.correlationId);const A=await a(this.generateKid.bind(this),b.PopTokenGenerateCnf,g,this.performanceClient,I.correlationId)(I),l=this.cryptoUtils.base64UrlEncode(JSON.stringify(A));return{kid:A.kid,reqCnfString:l}}async generateKid(I){return this.performanceClient?.addQueueMeasurement(b.PopTokenGenerateKid,I.correlationId),{kid:await this.cryptoUtils.getPublicKeyThumbprint(I),xms_ksl:Ja.SW}}async signPopToken(I,g,A){return this.signPayload(I,g,A)}async signPayload(I,g,A,l){const{resourceRequestMethod:d,resourceRequestUri:Z,shrClaims:B,shrNonce:c,shrOptions:i}=A,V=(Z?new lI(Z):void 0)?.getUrlComponents();return this.cryptoUtils.signJwt({at:I,ts:LI(),m:d?.toUpperCase(),u:V?.HostNameAndPort,nonce:c||this.cryptoUtils.createNewGuid(),p:V?.AbsolutePath,q:V?.QueryString?[[],V.QueryString]:void 0,client_claims:B||void 0,...l},g,i,A.correlationId)}}class Sa{constructor(I,g){this.cache=I,this.hasChanged=g}get cacheHasChanged(){return this.hasChanged}get tokenCache(){return this.cache}}class WC{constructor(I,g,A,l,d,Z,B){this.clientId=I,this.cacheStorage=g,this.cryptoObj=A,this.logger=l,this.serializableCache=d,this.persistencePlugin=Z,this.performanceClient=B}validateTokenResponse(I,g){if(I.error||I.error_description||I.suberror){const A=`Error(s): ${I.error_codes||Y.NOT_AVAILABLE} - Timestamp: ${I.timestamp||Y.NOT_AVAILABLE} - Description: ${I.error_description||Y.NOT_AVAILABLE} - Correlation ID: ${I.correlation_id||Y.NOT_AVAILABLE} - Trace ID: ${I.trace_id||Y.NOT_AVAILABLE}`,l=I.error_codes?.length?I.error_codes[0]:void 0,d=new oC(I.error,A,I.suberror,l,I.status);if(g&&I.status&&I.status>=rg.SERVER_ERROR_RANGE_START&&I.status<=rg.SERVER_ERROR_RANGE_END){this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently unavailable and the access token is unable to be refreshed. 19${d}`);return}else if(g&&I.status&&I.status>=rg.CLIENT_ERROR_RANGE_START&&I.status<=rg.CLIENT_ERROR_RANGE_END){this.logger.warning(`executeTokenRequest:validateTokenResponse - AAD is currently available but is unable to refresh the access token. 20${d}`);return}throw wV(I.error,I.error_description,I.suberror)?new bg(I.error,I.error_description,I.suberror,I.timestamp||Y.EMPTY_STRING,I.trace_id||Y.EMPTY_STRING,I.correlation_id||Y.EMPTY_STRING,I.claims||Y.EMPTY_STRING,l):d}}async handleServerTokenResponse(I,g,A,l,d,Z,B,c,i,F){this.performanceClient?.addQueueMeasurement(b.HandleServerTokenResponse,I.correlation_id);let V;if(I.id_token){if(V=Yg(I.id_token||Y.EMPTY_STRING,this.cryptoObj.base64Decode),Z&&Z.nonce&&V.nonce!==Z.nonce)throw e(JF);if(l.maxAge||l.maxAge===0){const s=V.auth_time;if(!s)throw e(TZ);gV(s,l.maxAge)}}this.homeAccountIdentifier=mI.generateHomeAccountId(I.client_info||Y.EMPTY_STRING,g.authorityType,this.logger,this.cryptoObj,V);let W;Z&&Z.state&&(W=jC.parseRequestState(this.cryptoObj,Z.state)),I.key_id=I.key_id||l.sshKid||void 0;const G=this.generateCacheRecord(I,g,A,l,V,B,Z);let R;try{if(this.persistencePlugin&&this.serializableCache&&(this.logger.verbose("Persistence enabled, calling beforeCacheAccess"),R=new Sa(this.serializableCache,!0),await this.persistencePlugin.beforeCacheAccess(R)),c&&!i&&G.account&&this.cacheStorage.getAllAccounts({homeAccountId:G.account.homeAccountId,environment:G.account.environment},l.correlationId).length<1)return this.logger.warning("Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache"),this.performanceClient?.addFields({acntLoggedOut:!0},l.correlationId),await WC.generateAuthenticationResult(this.cryptoObj,g,G,!1,l,V,W,void 0,F);await this.cacheStorage.saveCacheRecord(G,l.correlationId,wg(V||{}),d,l.storeInCache)}finally{this.persistencePlugin&&this.serializableCache&&R&&(this.logger.verbose("Persistence enabled, calling afterCacheAccess"),await this.persistencePlugin.afterCacheAccess(R))}return WC.generateAuthenticationResult(this.cryptoObj,g,G,!1,l,V,W,I,F)}generateCacheRecord(I,g,A,l,d,Z,B){const c=g.getPreferredCache();if(!c)throw e(LZ);const i=qZ(d);let F,V;I.id_token&&d&&(F=vl(this.homeAccountIdentifier,c,I.id_token,this.clientId,i||""),V=sB(this.cacheStorage,g,this.homeAccountIdentifier,this.cryptoObj.base64Decode,l.correlationId,d,I.client_info,c,i,B,void 0,this.logger));let W=null;if(I.access_token){const s=I.scope?hI.fromString(I.scope):new hI(l.scopes||[]),Q=(typeof I.expires_in=="str
20ing"?parseInt(I.expires_in,10):I.expires_in)||0,m=(typeof I.ext_expires_in=="string"?parseInt(I.ext_expires_in,10):I.ext_expires_in)||0,n=(typeof I.refresh_in=="string"?parseInt(I.refresh_in,10):I.refresh_in)||void 0,o=A+Q,w=o+m,J=n&&n>0?A+n:void 0;W=xl(this.homeAccountIdentifier,c,I.access_token,this.clientId,i||g.tenant||"",s.printScopes(),o,w,this.cryptoObj.base64Decode,J,I.token_type,Z,I.key_id,l.claims,l.requestedClaimsHash)}let G=null;if(I.refresh_token){let s;if(I.refresh_token_expires_in){const Q=typeof I.refresh_token_expires_in=="string"?parseInt(I.refresh_token_expires_in,10):I.refresh_token_expires_in;s=A+Q,this.performanceClient?.addFields({ntwkRtExpiresOnSeconds:s},l.correlationId)}G=QV(this.homeAccountIdentifier,c,I.refresh_token,this.clientId,I.foci,Z,s)}let R=null;return I.foci&&(R={clientId:this.clientId,environment:c,familyId:I.foci}),{account:V,idToken:F,accessToken:W,refreshToken:G,appMetadata:R}}static async generateAuthenticationResult(I,g,A,l,d,Z,B,c,i){let F=Y.EMPTY_STRING,V=[],W=null,G,R,s=Y.EMPTY_STRING;if(A.accessToken){if(A.accessToken.tokenType===BI.POP&&!d.popKid){const o=new zC(I),{secret:w,keyId:J}=A.accessToken;if(!J)throw e(EZ);F=await o.signPopToken(w,J,d)}else F=A.accessToken.secret;V=hI.fromString(A.accessToken.target).asArray(),W=tC(A.accessToken.expiresOn),G=tC(A.accessToken.extendedExpiresOn),A.accessToken.refreshOn&&(R=tC(A.accessToken.refreshOn))}A.appMetadata&&(s=A.appMetadata.familyId===Rl?Rl:"");const Q=Z?.oid||Z?.sub||"",m=Z?.tid||"";c?.spa_accountid&&A.account&&(A.account.nativeAccountId=c?.spa_accountid);const n=A.account?_Z(mI.getAccountInfo(A.account),void 0,Z,A.idToken?.secret):null;return{authority:g.canonicalAuthority,uniqueId:Q,tenantId:m,scopes:V,account:n,idToken:A?.idToken?.secret||"",idTokenClaims:Z||{},accessToken:F,fromCache:l,expiresOn:W,extExpiresOn:G,refreshOn:R,correlationId:d.correlationId,requestId:i||Y.EMPTY_STRING,familyId:s,tokenType:A.accessToken?.tokenType||Y.EMPTY_STRING,state:B?B.userRequestState:Y.EMPTY_STRING,cloudGraphHostName:A.account?.cloudGraphHostName||Y.EMPTY_STRING,msGraphHost:A.account?.msGraphHost||Y.EMPTY_STRING,code:c?.spa_code,fromNativeBroker:!1}}}function sB(C,I,g,A,l,d,Z,B,c,i,F,V){V?.verbose("setCachedAccount called");const G=C.getAccountKeys().find(n=>n.startsWith(g));let R=null;G&&(R=C.getAccount(G,l));const s=R||mI.createAccount({homeAccountId:g,idTokenClaims:d,clientInfo:Z,environment:B,cloudGraphHostName:i?.cloud_graph_host_name,msGraphHost:i?.msgraph_host,nativeAccountId:F},I,A),Q=s.tenantProfiles||[],m=c||s.realm;if(m&&!Q.find(n=>n.tenantId===m)){const n=XC(g,s.localAccountId,m,d);Q.push(n)}return s.tenantProfiles=Q,s}async function hV(C,I,g){return typeof C=="string"?C:C({clientId:I,tokenEndpoint:g})}class eV extends GB{constructor(I,g){super(I,g),this.includeRedirectUri=!0,this.oidcDefaultScopes=this.config.authOptions.authority.options.OIDCOptions?.defaultScopes}async acquireToken(I,g,A){if(this.performanceClient?.addQueueMeasurement(b.AuthClientAcquireToken,I.correlationId),!I.code)throw e(yF);const l=LI(),d=await a(this.executeTokenRequest.bind(this),b.AuthClientExecuteTokenRequest,this.logger,this.performanceClient,I.correlationId)(this.authority,I),Z=d.headers?.[kI.X_MS_REQUEST_ID],B=new WC(this.config.authOptions.clientId,this.cacheManager,this.cryptoUtils,this.logger,this.config.serializableCache,this.config.persistencePlugin,this.performanceClient);return B.validateTokenResponse(d.body),a(B.handleServerTokenResponse.bind(B),b.HandleServerTokenResponse,this.logger,this.performanceClient,I.correlationId)(d.body,this.authority,l,I,g,A,void 0,void 0,void 0,Z)}getLogoutUri(I){if(!I)throw iI(jF);const g=this.createLogoutUrlQueryString(I);return lI.appendQueryString(this.authority.endSessionEndpoint,g)}async executeTokenRequest(I,g){this.performanceClient?.addQueueMeasurement(b.AuthClientExecuteTokenRequest,g.correlationId);const A=this.createTokenQueryParameters(g),l=lI.appendQueryString(I.tokenEndpoint,A),d=await a(this.createTokenRequestBody.bind(this),b.AuthClientCreateTokenRequestBody,this.logger,this.performanceClient,g.correlationId)(g);let Z;if(g.clientInfo)try{const i=ol(g.clientInfo,this.cryptoUtils.base64Decode);Z={credential:`${i.uid}${RA.CLIENT_INFO_SEPARATOR}${i.utid}`,type:Wg.HOME_ACCOUNT_ID}}catch(i){this.logger.verbose("Could not parse client info for CCS Header: "+i)}const B=this.createTokenRequestHeaders(Z||g.ccsCredential),c=fl(this.config.authOptions.clientId,g);return a(this.executePostToTokenEndpoint.bind(this),b.AuthorizationCodeClientExecutePostToTokenEndpoint,this.logger,this.performanceClient,g.correlationId)(l,d,B,c,g.correlationId,b.AuthorizationCodeClientExecutePostToTokenEndpoint)}async createTokenRequestBody(I){this.performanceClient?.addQueueMeasurement(b.AuthClientCreateTokenRequestBody,I.correlationId);const g=new Map;if(AB(g,I.embeddedClientId||I.tokenBodyParameters?.[VC]||this.config.authOptions.clientId),this.includeRedirectUri)lB(g,I.redirectUri);else if(!I.redirectUri)throw iI(TF);if(CB(g,I.scopes,!0,this.oidcDefaultScopes),la(g,I.code),ZB(g,this.config.libraryInfo),BB(g,this.config.telemetry.application),nV(g),this.serverTelemetryManager&&!BV(this.config)&&mV(g,this.serverTelemetryManager),I.codeVerifier&&Za(g,I.codeVerifier),this.config.clientCredentials.clientSecret&&GV(g,this.config.clientCredentials.clientSecret),this.config.clientCredentials.clientAssertion){const d=this.config.clientCredentials.clientAssertion;WV(g,await hV(d.assertion,this.config.authOptions.clientId,I.resourceRequestUri)),RV(g,d.assertionType)}if(sV(g,nF.AUTHORIZATION_CODE_GRANT),iB(g),I.authenticationScheme===BI.POP){const d=new zC(this.cryptoUtils,this.performanceClient);let Z;I.popKid?Z=this.cryptoUtils.encodeKid(I.popKid):Z=(await a(d.generateCnf.bind(d),b.PopTokenGenerateCnf,this.logger,this.performanceClient,I.correlationId)(I,this.logger)).reqCnfString,FB(g,Z)}else if(I.authenticationScheme===BI.SSH)if(I.sshJwk)oV(g,I.sshJwk);else throw iI(El);let A;if(I.clientInfo)try{const d=ol(I.clientInfo,this.cryptoUtils.base64Decode);A={credential:`${d.uid}${RA.CLIENT_INFO_SEPARATOR}${d.utid}`,type:Wg.HOME_ACCOUNT_ID}}catch(d){this.logger.verbose("Could not parse client info for CCS Header: "+d)}else A=I.ccsCredential;if(this.config.systemOptions.preventCorsPreflight&&A)switch(A.type){case Wg.HOME_ACCOUNT_ID:try{const d=SC(A.credential);cA(g,d)}catch(d){this.logger.verbose("Could not parse home account ID for CCS Header: "+d)}break;case Wg.UPN:Nl(g,A.credential);break}I.embeddedClientId&&jl(g,this.config.authOptions.clientId,this.config.authOptions.redirectUri),I.tokenBodyParameters&&Pg(g,I.tokenBodyParameters),I.enableSpaAuthorizationCode&&(!I.tokenBodyParameters||!I.tokenBodyParameters[cc])&&Pg(g,{[cc]:"1"}),rl(g,I.correlationId,this.performanceClient);const l=I.skipBrokerClaims&&g.has(GC)?void 0:this.config.authOptions.clientCapabilities;return(!gg.isEmptyObj(I.claims)||l&&l.length>0)&&dB(g,I.claims,l),sA(g)}createLogoutUrlQueryString(I){const g=new Map;return I.postLogoutRedirectUri&&$Q(g,I.postLogoutRedirectUri),I.correlationId&&wA(g,I.correlationId),I.idTokenHint&&Ia(g,I.idTokenHint),I.state&&VV(g,I.state),I.logoutHint&&ca(g,I.logoutHint),I.extraQueryParameters&&Pg(g,I.extraQueryParameters),this.config.authOptions.instanceAware&&bV(g),sA(g,this.config.authOptions.encodeExtraQueryParams,I.extraQueryParameters)}}const Xa=300;class ya extends GB{constructor(I,g){super(I,g)}async acquireToken(I,g){this.performanceClient?.addQueueMeasurement(b.RefreshTokenClientAcquireToken,I.correlationId);const A=LI(),l=await a(this.executeTokenRequest.bind(this),b.RefreshTokenClientExecuteTokenRequest,this.logger,this.performanceClient,I.correlationId)(I,this.authority),d=l.headers?.[kI.X_MS_REQUEST_ID],Z=new WC(this.config.authOptions.clientId,this.cacheManager,this.cryptoUtils,this.logger,this.config.serializableCache,this.config.persistencePlugin);return Z.validateTokenResponse(l.body),a(Z.handleServerTokenResponse.bind(Z),b.HandleServerTokenResponse,this.logger,this.performanceClient,I.correlationId)(l.body,this.authority,A,I,g,void 0,void 0,!0,I.forceCache,d)}async acquireTokenByRefreshToken(I,g){if(!I)throw iI(rF);if(this.performanceClient?.addQueueMeasurement(b.RefreshTokenClientAcquireTokenByRefreshToken,I.correlationId),!I.account)throw e(zZ);if(this.cacheManager.isAppMetadataFOCI(I.account.environment))try{return await a(this.acquireTokenWithCachedRefreshToken.bind(this),b.RefreshTokenClientAcquireTokenWithCachedRefreshToken,this.logger,this.performanceClient,I.correlationId)(I,!0,g)}catch(l){const d=l instanceof bg&&l.errorCode===wl,Z=l instanceof oC&&l.errorCode===$0.INVALID_GRANT_ERROR&&l.subError===$0.CLIENT_MISMATCH_ERROR;if(d||Z)return a(this.acquireTokenWithCachedRefreshToken.bind(this),b.RefreshTokenClientAcquireTokenWithCachedRefreshToken,this.logger,this.performanceClient,I.correlationId)(I,!1,g);throw l}return a(this.acquireTokenWithCachedRefreshToken.bind(this),b.RefreshTokenClientAcquireTokenWithCachedRefreshToken,this.logger,this.performanceClient,I.correlationId)(I,!1,g)}async acquireTokenWithCachedRefreshToken(I,g,A){this.performanceClient?.addQueueMeasurement(b.RefreshTokenClientAcquireTokenWithCachedRefreshToken,I.correlationId);const l=xI(this.cacheManager.getRefreshToken.bind(this.cacheManager),b.CacheManagerGetRefreshToken,this.logger,this.performanceClient,I.correlationId)(I.account,g,I.correlationId,void 0,this.performanceClient);if(!l)throw hl(wl);if(l.expiresOn){const Z=I.refreshTokenExpirationOffsetSeconds||Xa;if(this.performanceClient?.addFields({cacheRtExpiresOnSeconds:Number(l.expiresOn),rtOffsetSeconds:Z},I.correlationId),Yl(l.expiresOn,Z))throw hl(WB)}const d={...I,refreshToken:l.secret,authenticationScheme:I.authenticationScheme||BI.BEARER,ccsCredential:{credential:I.account.homeAccountId,type:Wg.HOME_ACCOUNT_ID}};try{return await a(this.acquireToken.bind(this),b.RefreshTokenClientAcquireToken,this.logger,this.performanceClient,I.correlationId)(d,A)}catch(Z){if(Z instanceof bg&&Z.subError===ql){this.logger.verbose("acquireTokenWithRefreshToken: bad refresh token, removing from cache");const B=this.cacheManager.generateCredentialKey(l);this.cacheManager.removeRefreshToken(B,I.correlationId)}throw Z}}async executeTokenRequest(I,g){this.performanceClient?.addQueueMeasurement(b.RefreshTokenClientExecuteTokenRequest,I.correlationId);const A=this.createTokenQueryParameters(I),l=lI.appendQueryString(g.tokenEndpoint,A),d=await a(this.createTokenRequestBody.bind(this),b.RefreshTokenClientCreateTokenRequestBody,this.logger,this.performanceClient,I.correlationId)(I),Z=this.createTokenRequestHeaders(I.ccsCredential),B=fl(this.config.authOptions.clientId,I);return a(this.executePostToTokenEndpoint.bind(this),b.RefreshTokenClientExecutePostToTokenEndpoint,this.logger,this.performanceClient,I.correlationId)(l,d,Z,B,I.correlationId,b.RefreshTokenClientExecutePostToTokenEndpoint)}async createTokenRequestBody(I){this.performanceClient?.addQueueMeasurement(b.RefreshTokenClientCreateTokenRequestBody,I.correlationId);const g=new Map;if(AB(g,I.embeddedClientId||I.tokenBodyParameters?.[VC]||this.config.authOptions.clientId),I.redirectUri&&lB(g,I.redirectUri),CB(g,I.scopes,!0,this.config.authOptions.authority.options.OIDCOptions?.defaultScopes),sV(g,nF.REFRESH_TOKEN_GRANT),iB(g),ZB(g,this.config.libraryInfo),BB(g,this.config.telemetry.application),nV(g),this.serverTelemetryManager&&!BV(this.config)&&mV(g,this.serverTelemetryManager),da(g,I.refreshToken),this.config.clientCredentials.clientSecret&&GV(g,this.config.clientCredentials.clientSecret),this.config.clientCredentials.clientAssertion){const l=this.config.clientCredentials.clientAssertion;WV(g,await hV(l.assertion,this.config.authOptions.clientId,I.resourceRequestUri)),RV(g,l.assertionType)}if(I.authenticationScheme===BI.POP){const l=new zC(this.cryptoUtils,this.performanceClient);let d;I.popKid?d=this.cryptoUtils.encodeKid(I.popKid):d=(await a(l.generateCnf.bind(l),b.PopTokenGenerateCnf,this.logger,this.performanceClient,I.correlationId)(I,this.logger)).reqCnfString,FB(g,d)}else if(I.authenticationScheme===BI.SSH)if(I.sshJwk)oV(g,I.sshJwk);else throw iI(El);if(this.config.systemOptions.preventCorsPreflight&&I.ccsCredential)switch(I.ccsCredential.type){case Wg.HOME_ACCOUNT_ID:try{const l=SC(I.ccsCredential.credential);cA(g,l)}catch(l){this.logger.verbose("Could not parse home account ID for CCS Header: "+l)}break;case Wg.UPN:Nl(g,I.ccsCredential.credential);break}I.embeddedClientId&&jl(g,this.config.authOptions.clientId,this.config.authOptions.redirectUri),I.tokenBodyParameters&&Pg(g,I.tokenBodyParameters),rl(g,I.correlationId,this.performanceClient);const A=I.skipBrokerClaims&&g.has(GC)?void 0:this.config.authOptions.clientCapabilities;return(!gg.isEmptyObj(I.claims)||A&&A.length>0)&&dB(g,I.claims,A),sA(g)}}class ta extends GB{constructor(I,g){super(I,g)}async acquireCachedToken(I){this.performanceClient?.addQueueMeasurement(b.SilentFlowClientAcquireCachedToken,I.correlationId);let g=BC.NOT_APPLICABLE;if(I.forceRefresh||!this.config.cacheOptions.claimsBasedCachingEnabled&&!gg.isEmptyObj(I.claims))throw this.setCacheOutcome(BC.FORCE_REFRESH_OR_CLAIMS,I.correlationId),e(xg);if(!I.account)throw e(zZ);const A=I.account.tenantId||Qa(I.authority),l=this.cacheManager.getTokenKeys(),d=this.cacheManager.getAccessToken(I.account,I,l,A);if(d){if(Ra(d.cachedAt)||Yl(d.expiresOn,this.config.systemOptions.tokenRenewalOffsetSeconds))throw this.setCacheOutcome(BC.CACHED_ACCESS_TOKEN_EXPIRED,I.correlationId),e(xg);d.refreshOn&&Yl(d.refreshOn,0)&&(g=BC.PROACTIVELY_REFRESHED)}else throw this.setCacheOutcome(BC.NO_CACHED_ACCESS_TOKEN,I.correlationId),e(xg);const Z=I.authority||this.authority.getPreferredCache(),B={account:this.cacheManager.getAccount(this.cacheManager.generateAccountKey(I.account),I.correlationId),accessToken:d,idToken:this.cacheManager.getIdToken(I.account,I.correlationId,l,A,this.performanceClient),refreshToken:null,appMetadata:this.cacheManager.readAppMetadataFromCac
20he(Z)};return this.setCacheOutcome(g,I.correlationId),this.config.serverTelemetryManager&&this.config.serverTelemetryManager.incrementCacheHits(),[await a(this.generateResultFromCacheRecord.bind(this),b.SilentFlowClientGenerateResultFromCacheRecord,this.logger,this.performanceClient,I.correlationId)(B,I),g]}setCacheOutcome(I,g){this.serverTelemetryManager?.setCacheOutcome(I),this.performanceClient?.addFields({cacheOutcome:I},g),I!==BC.NOT_APPLICABLE&&this.logger.info(`Token refresh is required due to cache outcome: ${I}`)}async generateResultFromCacheRecord(I,g){this.performanceClient?.addQueueMeasurement(b.SilentFlowClientGenerateResultFromCacheRecord,g.correlationId);let A;if(I.idToken&&(A=Yg(I.idToken.secret,this.config.cryptoInterface.base64Decode)),g.maxAge||g.maxAge===0){const l=A?.auth_time;if(!l)throw e(TZ);gV(l,g.maxAge)}return WC.generateAuthenticationResult(this.cryptoUtils,this.authority,I,!0,g,A)}}const Da={sendGetRequestAsync:()=>Promise.reject(e(x)),sendPostRequestAsync:()=>Promise.reject(e(x))};function Ma(C,I,g,A){const l=I.correlationId,d=new Map;AB(d,I.embeddedClientId||I.extraQueryParameters?.[VC]||C.clientId);const Z=[...I.scopes||[],...I.extraScopesToConsent||[]];if(CB(d,Z,!0,C.authority.options.OIDCOptions?.defaultScopes),lB(d,I.redirectUri),wA(d,l),_Q(d,I.responseMode),iB(d),Ba(d),I.prompt&&(Ca(d,I.prompt),A?.addFields({prompt:I.prompt},l)),I.domainHint&&(ga(d,I.domainHint),A?.addFields({domainHintFromRequest:!0},l)),I.prompt!==SI.SELECT_ACCOUNT)if(I.sid&&I.prompt===SI.NONE)g.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from request"),ic(d,I.sid),A?.addFields({sidFromRequest:!0},l);else if(I.account){const c=pa(I.account);let i=Ka(I.account);if(i&&I.domainHint&&(g.warning('AuthorizationCodeClient.createAuthCodeUrlQueryString: "domainHint" param is set, skipping opaque "login_hint" claim. Please consider not passing domainHint'),i=null),i){g.verbose("createAuthCodeUrlQueryString: login_hint claim present on account"),jA(d,i),A?.addFields({loginHintFromClaim:!0},l);try{const F=SC(I.account.homeAccountId);cA(d,F)}catch{g.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header")}}else if(c&&I.prompt===SI.NONE){g.verbose("createAuthCodeUrlQueryString: Prompt is none, adding sid from account"),ic(d,c),A?.addFields({sidFromClaim:!0},l);try{const F=SC(I.account.homeAccountId);cA(d,F)}catch{g.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header")}}else if(I.loginHint)g.verbose("createAuthCodeUrlQueryString: Adding login_hint from request"),jA(d,I.loginHint),Nl(d,I.loginHint),A?.addFields({loginHintFromRequest:!0},l);else if(I.account.username){g.verbose("createAuthCodeUrlQueryString: Adding login_hint from account"),jA(d,I.account.username),A?.addFields({loginHintFromUpn:!0},l);try{const F=SC(I.account.homeAccountId);cA(d,F)}catch{g.verbose("createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header")}}}else I.loginHint&&(g.verbose("createAuthCodeUrlQueryString: No account, adding login_hint from request"),jA(d,I.loginHint),Nl(d,I.loginHint),A?.addFields({loginHintFromRequest:!0},l));else g.verbose("createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints");I.nonce&&Aa(d,I.nonce),I.state&&VV(d,I.state),I.embeddedClientId&&jl(d,C.clientId,C.redirectUri);const B=I.skipBrokerClaims&&d.has(GC)?void 0:C.clientCapabilities;return(I.claims||B&&B.length>0)&&dB(d,I.claims,B),C.instanceAware&&(!I.extraQueryParameters||!Object.keys(I.extraQueryParameters).includes(ZZ))&&bV(d),d}function bB(C,I,g,A){const l=sA(I,g,A);return lI.appendQueryString(C.authorizationEndpoint,l)}function Ha(C,I){if(UB(C,I),!C.code)throw e(uF);return C}function UB(C,I){if(!C.state||!I)throw C.state?e(IZ,"Cached State"):e(IZ,"Server State");let g,A;try{g=decodeURIComponent(C.state)}catch{throw e(TC,C.state)}try{A=decodeURIComponent(I)}catch{throw e(TC,C.state)}if(g!==A)throw e(eF);if(C.error||C.error_description||C.suberror){const l=ua(C);throw wV(C.error,C.error_description,C.suberror)?new bg(C.error||"",C.error_description,C.suberror,C.timestamp||"",C.trace_id||"",C.correlation_id||"",C.claims||"",l):new oC(C.error||"",C.error_description,C.suberror,l)}}function ua(C){const I="code=",g=C.error_uri?.lastIndexOf(I);return g&&g>=0?C.error_uri?.substring(g+I.length):void 0}function pa(C){return C.idTokenClaims?.sid||null}function Ka(C){return C.loginHint||C.idTokenClaims?.login_hint||null}const Uc=",",JV="|";function ka(C){const{skus:I,libraryName:g,libraryVersion:A,extensionName:l,extensionVersion:d}=C,Z=new Map([[0,[g,A]],[2,[l,d]]]);let B=[];if(I?.length){if(B=I.split(Uc),B.length<4)return I}else B=Array.from({length:4},()=>JV);return Z.forEach((c,i)=>{c.length===2&&c[0]?.length&&c[1]?.length&&Ta({skuArr:B,index:i,skuName:c[0],skuVersion:c[1]})}),B.join(Uc)}function Ta(C){const{skuArr:I,index:g,skuName:A,skuVersion:l}=C;g>=I.length||(I[g]=[A,l].join(JV))}class bA{constructor(I,g){this.cacheOutcome=BC.NOT_APPLICABLE,this.cacheManager=g,this.apiId=I.apiId,this.correlationId=I.correlationId,this.wrapperSKU=I.wrapperSKU||Y.EMPTY_STRING,this.wrapperVer=I.wrapperVer||Y.EMPTY_STRING,this.telemetryCacheKey=yI.CACHE_KEY+RA.CACHE_KEY_SEPARATOR+I.clientId}generateCurrentRequestHeaderValue(){const I=`${this.apiId}${yI.VALUE_SEPARATOR}${this.cacheOutcome}`,g=[this.wrapperSKU,this.wrapperVer],A=this.getNativeBrokerErrorCode();A?.length&&g.push(`broker_error=${A}`);const l=g.join(yI.VALUE_SEPARATOR),d=this.getRegionDiscoveryFields(),Z=[I,d].join(yI.VALUE_SEPARATOR);return[yI.SCHEMA_VERSION,Z,l].join(yI.CATEGORY_SEPARATOR)}generateLastRequestHeaderValue(){const I=this.getLastRequests(),g=bA.maxErrorsToSend(I),A=
20I.failedRequests.slice(0,2*g).join(yI.VALUE_SEPARATOR),l=I.errors.slice(0,g).join(yI.VALUE_SEPARATOR),d=I.errors.length,Z=g<d?yI.OVERFLOW_TRUE:yI.OVERFLOW_FALSE,B=[d,Z].join(yI.VALUE_SEPARATOR);return[yI.SCHEMA_VERSION,I.cacheHits,A,l,B].join(yI.CATEGORY_SEPARATOR)}cacheFailedRequest(I){const g=this.getLastRequests();g.errors.length>=yI.MAX_CACHED_ERRORS&&(g.failedRequests.shift(),g.failedRequests.shift(),g.errors.shift()),g.failedRequests.push(this.apiId,this.correlationId),I instanceof Error&&I&&I.toString()?I instanceof FI?I.subError?g.errors.push(I.subError):I.errorCode?g.errors.push(I.errorCode):g.errors.push(I.toString()):g.errors.push(I.toString()):g.errors.push(yI.UNKNOWN_ERROR),this.cacheManager.setServerTelemetry(this.telemetryCacheKey,g,this.correlationId)}incrementCacheHits(){const I=this.getLastRequests();return I.cacheHits+=1,this.cacheManager.setServerTelemetry(this.telemetryCacheKey,I,this.correlationId),I.cacheHits}getLastRequests(){const I={failedRequests:[],errors:[],cacheHits:0};return this.cacheManager.getServerTelemetry(this.telemetryCacheKey)||I}clearTelemetryCache(){const I=this.getLastRequests(),g=bA.maxErrorsToSend(I),A=I.errors.length;if(g===A)this.cacheManager.removeItem(this.telemetryCacheKey,this.correlationId);else{const l={failedRequests:I.failedRequests.slice(g*2),errors:I.errors.slice(g),cacheHits:0};this.cacheManager.setServerTelemetry(this.telemetryCacheKey,l,this.correlationId)}}static maxErrorsToSend(I){let g,A=0,l=0;const d=I.errors.length;for(g=0;g<d;g++){const Z=I.failedRequests[2*g]||Y.EMPTY_STRING,B=I.failedRequests[2*g+1]||Y.EMPTY_STRING,c=I.errors[g]||Y.EMPTY_STRING;if(l+=Z.toString().length+B.toString().length+c.length+3,l<yI.MAX_LAST_HEADER_BYTES)A+=1;else break}return A}getRegionDiscoveryFields(){const I=[];return I.push(this.regionUsed||Y.EMPTY_STRING),I.push(this.regionSource||Y.EMPTY_STRING),I.push(this.regionOutcome||Y.EMPTY_STRING),I.join(",")}updateRegionDiscoveryMetadata(I){this.regionUsed=I.region_used,this.regionSource=I.region_source,this.regionOutcome=I.region_outcome}setCacheOutcome(I){this.cacheOutcome=I}setNativeBrokerErrorCode(I){const g=this.getLastRequests();g.nativeBrokerErrorCode=I,this.cacheManager.setServerTelemetry(this.telemetryCacheKey,g,this.correlationId)}getNativeBrokerErrorCode(){return this.getLastRequests().nativeBrokerErrorCode}clearNativeBrokerErrorCode(){const I=this.getLastRequests();delete I.nativeBrokerErrorCode,this.cacheManager.setServerTelemetry(this.telemetryCacheKey,I,this.correlationId)}static makeExtraSkuString(I){return ka(I)}}const SV="missing_kid_error",XV="missing_alg_error";const za={[SV]:"The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided.",[XV]:"The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided."};class oB extends FI{constructor(I,g){super(I,g),this.name="JoseHeaderError",Object.setPrototypeOf(this,oB.prototype)}}function oc(C){return new oB(C,za[C])}class mB{constructor(I){this.typ=I.typ,this.alg=I.alg,this.kid=I.kid}static getShrHeaderString(I){if(!I.kid)throw oc(SV);if(!I.alg)throw oc(XV);const g=new mB({typ:I.typ||Dn.Pop,kid:I.kid,alg:I.alg});return JSON.stringify(g)}}const nB="pkce_not_created",QB="ear_jwk_empty",yV="ear_jwe_empty",BZ="crypto_nonexistent",$l="empty_navigate_uri",tV="hash_empty_error",aB="no_state_in_hash",DV="hash_does_not_contain_known_properties",MV="unable_to_parse_state",HV="state_interaction_type_mismatch",uV="interaction_in_progress",pV="popup_window_error",KV="empty_window_error",UA="user_cancelled",La="monitor_popup_timeout",kV="monitor_window_timeout",TV="redirect_in_iframe",zV="block_iframe_reload",LV="block_nested_popups",Ea="iframe_closed_prematurely",Id="silent_logout_unsupported",EV="no_account_error",ra="silent_prompt_value_error",rV="no_token_request_cache_error",jV="unable_to_parse_token_request_cache_error",ja="auth_request_not_set_error",Oa="invalid_cache_type",gd="non_browser_environment",hC="database_not_open",el="no_network_connectivity",OV="post_request_failed",v
20V="get_request_failed",cZ="failed_to_parse_response",xV="unable_to_load_token",NB="crypto_key_not_found",PV="auth_code_required",fV="auth_code_or_nativeAccountId_required",_V="spa_code_and_nativeAccountId_present",YB="database_unavailable",qV="unable_to_acquire_token_from_native_platform",$V="native_handshake_timeout",IG="native_extension_not_installed",wB="native_connection_not_established",iA="uninitialized_public_client_application",gG="native_prompt_not_supported",CG="invalid_base64_string",AG="invalid_pop_token_request",lG="failed_to_build_headers",dG="failed_to_parse_headers",Al="failed_to_decrypt_ear_response",Jl="timed_out";const Jg="For more visit: aka.ms/msaljs/browser-errors",va={[nB]:"The PKCE code challenge and verifier could not be generated.",[QB]:"No EAR encryption key provided. This is unexpected.",[yV]:"Server response does not contain ear_jwe property. This is unexpected.",[BZ]:"The crypto object or function is not available.",[$l]:"Navigation URI is empty. Please check stack trace for more info.",[tV]:`Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. ${Jg}`,[aB]:"Hash does not contain state. Please verify that the request originated from msal.",[DV]:`Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. ${Jg}`,[MV]:"Unable to parse state. Please verify that the request originated from msal.",[HV]:"Hash contains state but the interaction type does not match the caller.",[uV]:`Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API. ${Jg}`,[pV]:"Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser.",[KV]:"window.open returned null or undefined window object.",[UA]:"User cancelled the flow.",[La]:`Token acquisition in popup failed due to timeout. ${Jg}`,[kV]:`Token acquisition in iframe failed due to timeout. ${Jg}`,[TV]:"Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs.",[zV]:`Request was blocked inside an iframe because MSAL detected an authentication response. ${Jg}`,[LV]:"Request was blocked inside a popup because MSAL detected it was running in a popup.",[Ea]:"The iframe being monitored was closed prematurely.",[Id]:"Silent logout not supported. Please call logoutRedirect or logoutPopup instead.",[EV]:"No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request.",[ra]:"The value given for the prompt value is not valid for silent requests - must be set to 'none' or 'no_session'.",[rV]:"No token request found in cache.",[jV]:"The cached token request could not be parsed.",[ja]:"Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler",[Oa]:"Invalid cache type",[gd]:"Login and token requests are not supported in non-browser environments.",[hC]:"Database is not open!",[el]:"No network connectivity. Check your internet connection.",[OV]:"Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type 'SPA'",[vV]:"Network request failed. Please check the network trace to determine root cause.",[cZ]:"Failed to parse network response. Check network trace.",[xV]:"Error loading token to cache.",[NB]:"Cryptographic Key or Keypair not found in browser storage.",[PV]:"An authorization code must be provided (as the `code` property on the request) to this flow.",[fV]:"An authorization code or nativeAccountId must be provided to this flow.",[_V]:"Request cannot contain both spa code and native account id.",[YB]:"IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts.",[qV]:`Unable to acquire token from native platform. ${Jg}`,[$V]:"Timed out while attempting to establish connection to browser extension",[IG]:"Native extension is not installed. If you think this is a mistake call the initialize function.",[wB]:`Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). ${Jg}`,[iA]:`You must call and await the initialize function before attempting to call any other MSAL API. ${Jg}`,[gG]:"The provided prompt is not supported by the native platform. This request should be routed to the web based flow.",[CG]:"Invalid base64 encoded string.",[AG]:"Invalid PoP token request. The request should not have both a popKid value and signPopToken set to true.",[lG]:"Failed to build request headers object.",[dG]:"Failed to parse response headers",[Al]:"Failed to decrypt ear response",[Jl]:"The request timed out."};class hA extends FI{constructor(I,g){super(I,va[I],g),Object.setPrototypeOf(this,hA.prototype),this.name="BrowserAuthError"}}function H(C,I){return new hA(C,I)}const jI={INVALID_GRANT_ERROR:"invalid_grant",POPUP_WIDTH:483,POPUP_HEIGHT:600,POPUP_NAME_PREFIX:"msal",DEFAULT_POLL_INTERVAL_MS:30,MSAL_SKU:"msal.js.browser"},Zg={CHANNEL_ID:"53ee284d-920a-4b59-9d30-a60315b26836",PREFERRED_EXTENSION_ID:"ppnbnpeolgkicgegkbkbjmhlideopiji",MATS_TELEMETRY:"MATS",MICROSOFT_ENTRA_BROKERID:"MicrosoftEntra",DOM_API_NAME:"DOM API",PLATFORM_DOM_APIS:"get-token-and-sign-out",P
20LATFORM_DOM_PROVIDER:"PlatformAuthDOMHandler",PLATFORM_EXTENSION_PROVIDER:"PlatformAuthExtensionHandler"},$C={HandshakeRequest:"Handshake",HandshakeResponse:"HandshakeResponse",GetToken:"GetToken",Response:"Response"},XI={LocalStorage:"localStorage",SessionStorage:"sessionStorage",MemoryStorage:"memoryStorage"},mc={GET:"GET",POST:"POST"},Lg={SIGNIN:"signin",SIGNOUT:"signout"},NI={ORIGIN_URI:"request.origin",URL_HASH:"urlHash",REQUEST_PARAMS:"request.params",VERIFIER:"code.verifier",INTERACTION_STATUS_KEY:"interaction.status",NATIVE_REQUEST:"request.native"},vA={WRAPPER_SKU:"wrapper.sku",WRAPPER_VER:"wrapper.version"},$={acquireTokenRedirect:861,acquireTokenPopup:862,ssoSilent:863,acquireTokenSilent_authCode:864,handleRedirectPromise:865,acquireTokenByCode:866,acquireTokenSilent_silentFlow:61,logout:961,logoutPopup:962,hydrateCache:963,loadExternalTokens:964},nc={861:"acquireTokenRedirect",862:"acquireTokenPopup",863:"ssoSilent",864:"acquireTokenSilent_authCode",865:"handleRedirectPromise",866:"acquireTokenByCode",61:"acquireTokenSilent_silentFlow",961:"logout",962:"logoutPopup",963:"hydrateCache",964:"loadExternalTokens"},xa=C=>typeof C=="number"&&C in nc?nc[C]:"unknown";var k;(function(C){C.Redirect="redirect",C.Popup="popup",C.Silent="silent",C.None="none"})(k||(k={}));const Qc={scopes:rC},ZG="jwk",iZ="msal.db",Pa=1,fa=`${iZ}.keys`,pI={Default:0,AccessToken:1,AccessTokenAndRefreshToken:2,RefreshToken:3,RefreshTokenAndNetwork:4,Skip:5},_a=[pI.Default,pI.Skip,pI.RefreshTokenAndNetwork];function xA(C){return encodeURIComponent(oA(C).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_"))}function gC(C){return BG(C).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}function oA(C){return BG(new TextEncoder().encode(C))}function BG(C){const I=Array.from(C,g=>String.fromCodePoint(g)).join("");return btoa(I)}function zI(C){return new TextDecoder().decode(fg(C))}function fg(C){let I=C.replace(/-/g,"+").replace(/_/g,"/");switch(I.length%4){case 0:break;case 2:I+="==";break;case 3:I+="=";break;default:throw H(CG)}const g=atob(I);return Uint8Array.from(g,A=>A.codePointAt(0)||0)}const qa="RSASSA-PKCS1-v1_5",OC="AES-GCM",cG="HKDF",hB="SHA-256",$a=2048,IN=new Uint8Array([1,0,1]),ac="0123456789abcdef",
20Nc=new Uint32Array(1),eB="raw",iG="encrypt",JB="decrypt",gN="deriveKey",CN="crypto_subtle_undefined",SB={name:qa,hash:hB,modulusLength:$a,publicExponent:IN};function AN(C){if(!window)throw H(gd);if(!window.crypto)throw H(BZ);if(!C&&!window.crypto.subtle)throw H(BZ,CN)}async function FG(C,I,g){I?.addQueueMeasurement(b.Sha256Digest,g);const l=new TextEncoder().encode(C);return window.crypto.subtle.digest(hB,l)}function lN(C){return window.crypto.getRandomValues(C)}function Jd(){return window.crypto.getRandomValues(Nc),Nc[0]}function hg(){const C=Date.now(),I=Jd()*1024+(Jd()&1023),g=new Uint8Array(16),A=Math.trunc(I/2**30),l=I&2**30-1,d=Jd();g[0]=C/2**40,g[1]=C/2**32,g[2]=C/2**24,g[3]=C/2**16,g[4]=C/2**8,g[5]=C,g[6]=112|A>>>8,g[7]=A,g[8]=128|l>>>24,g[9]=l>>>16,g[10]=l>>>8,g[11]=l,g[12]=d>>>24,g[13]=d>>>16,g[14]=d>>>8,g[15]=d;let Z="";for(let B=0;B<g.length;B++)Z+=ac.charAt(g[B]>>>4),Z+=ac.charAt(g[B]&15),(B===3||B===5||B===7||B===9)&&(Z+="-");return Z}async function dN(C,I){return window.crypto.subtle.generateKey(SB,C,I)}async function Sd(C){return window.crypto.subtle.exportKey(ZG,C)}async function ZN(C,I,g){return window.crypto.subtle.importKey(ZG,C,SB,I,g)}async function BN(C,I){return window.crypto.subtle.sign(SB,C,I)}async function XB(){const C=await VG(),g={alg:"dir",kty:"oct",k:gC(new Uint8Array(C))};return oA(JSON.stringify(g))}async function cN(C){const I=zI(C),A=JSON.parse(I).k,l=fg(A);return window.crypto.subtle.importKey(eB,l,OC,!1,[JB])}async function iN(C,I){const g=I.split(".");if(g.length!==5)throw H(Al,"jwe_length");const A=await cN(C).catch(()=>{throw H(Al,"import_key")});try{const l=new TextEncoder().encode(g[0]),d=fg(g[2]),Z=fg(g[3]),B=fg(g[4]),c=B.byteLength*8,i=new Uint8Array(Z.length+B.length);i.set(Z),i.set(B,Z.length);const F=await window.crypto.subtle.decrypt({name:OC,iv:d,tagLength:c,additionalData:l},A,i);return new TextDecoder().decode(F)}catch{throw H(Al,"decrypt")}}async function VG(){const C=await window.crypto.subtle.generateKey({name:OC,length:256},!0,[iG,JB]);return window.crypto.subtle.exportKey(eB,C)}async function Yc(C){return window.crypto.subtle.importKey(eB,C,cG,!1,[gN])}async function GG(C,I,g){return window.crypto.subtle.deriveKey({name:cG,salt:I,hash:hB,info:new TextEncoder().encode(g)},C,{name:OC,length:256},!1,[iG,JB])}async function FN(C,I,g){const A=new TextEncoder().encode(I),l=window.crypto.getRandomValues(new Uint8Array(16)),d=await GG(C,l,g),Z=await window.crypto.subtle.encrypt({name:OC,iv:new Uint8Array(12)},d,A);return{data:gC(new Uint8Array(Z)),nonce:gC(l)}}async function wc(C,I,g,A){const l=fg(A),d=await GG(C,fg(I),g),Z=await window.crypto.subtle.decrypt({name:OC,iv:new Uint8Array(12)},d,l);return new TextDecoder().decode(Z)}async function WG(C){const I=await FG(C),g=new Uint8Array(I);return gC(g)}const Cd="storage_not_supported",RG="stubbed_public_client_application_called",yB="in_mem_redirect_unavailable";const ll={[Cd]:"Given storage configuration option was not supported.",[RG]:"Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors",[yB]:"Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true."};ll[Cd],ll[RG],ll[yB];class tB extends FI{constructor(I,g){super(I,g),this.name="BrowserConfigurationAuthError",Object.setPrototypeOf(this,tB.prototype)}}function DB(C){return new tB(C,ll[C])}function sG(C){C.location.hash="",typeof C.history.replaceState=="function"&&C.history.replaceState(null,"",`${C.location.origin}${C.location.pathname}${C.location.search}`)}function VN(C){const I=C.split("#");I.shift(),window.location.hash=I.length>0?I.join("#"):""}function MB(){return window.parent!==window}function GN(){return typeof window<"u"&&!!window.opener&&window.opener!==window&&typeof window.name=="string"&&window.name.indexOf(`${jI.POPUP_NAME_PREFIX}.`)===0}function yg(){return typeof window<"u"&&window.location?window.location.href.split("?")[0].split("#")[0]:""}function WN(){const I=new lI(window.location.href).getUrlComponents();return`${I.Protocol}//${I.HostNameAndPort}/`}function RN(){if(lI.hashContainsKnownProperties(window.location.hash)&&MB())throw H(zV)}function sN(C){if(MB()&&!C)throw H(TV)}function bN(){if(GN())throw H(LV)}function bG(){if(typeof window>"u")throw H(gd)}function UG(C){if(!C)throw H(iA)}function HB(C){bG(),RN(),bN(),UG(C)}function hc(C,I){if(HB(C),sN(I.system.allowRedirectInIframe),I.cache.cac
20heLocation===XI.MemoryStorage&&!I.cache.storeAuthStateInCookie)throw DB(yB)}function oG(C){const I=document.createElement("link");I.rel="preconnect",I.href=new URL(C).origin,I.crossOrigin="anonymous",document.head.appendChild(I),window.setTimeout(()=>{try{document.head.removeChild(I)}catch{}},1e4)}function UN(){return hg()}class Sl{navigateInternal(I,g){return Sl.defaultNavigateWindow(I,g)}navigateExternal(I,g){return Sl.defaultNavigateWindow(I,g)}static defaultNavigateWindow(I,g){return g.noHistory?window.location.replace(I):window.location.assign(I),new Promise((A,l)=>{setTimeout(()=>{l(H(Jl,"failed_to_redirect"))},g.timeout)})}}class oN{async sendGetRequestAsync(I,g){let A,l={},d=0;const Z=ec(g);try{A=await fetch(I,{method:mc.GET,headers:Z})}catch(B){throw CA(H(window.navigator.onLine?vV:el),void 0,void 0,B)}l=Jc(A.headers);try{return d=A.status,{headers:l,body:await A.json(),status:d}}catch(B){throw CA(H(cZ),d,l,B)}}async sendPostRequestAsync(I,g){const A=g&&g.body||"",l=ec(g);let d,Z=0,B={};try{d=await fetch(I,{method:mc.POST,headers:l,body:A})}catch(c){throw CA(H(window.navigator.onLine?OV:el),void 0,void 0,c)}B=Jc(d.headers);try{return Z=d.status,{headers:B,body:await d.json(),status:Z}}catch(c){throw CA(H(cZ),Z,B,c)}}}function ec(C){try{const I=new Headers;if(!(C&&C.headers))return I;const g=C.headers;return Object.entries(g).forEach(([A,l])=>{I.append(A,l)}),I}catch(I){throw CA(H(lG),void 0,void 0,I)}}function Jc(C){try{const I={};
20return C.forEach((g,A)=>{I[A]=g}),I}catch{throw H(dG)}}const mN=6e4,FZ=1e4,nN=3e4,mG=2e3;function QN({auth:C,cache:I,system:g,telemetry:A},l){const d={clientId:Y.EMPTY_STRING,authority:`${Y.DEFAULT_AUTHORITY}`,knownAuthorities:[],cloudDiscoveryMetadata:Y.EMPTY_STRING,authorityMetadata:Y.EMPTY_STRING,redirectUri:typeof window<"u"?yg():"",postLogoutRedirectUri:Y.EMPTY_STRING,navigateToLoginRequestUrl:!0,clientCapabilities:[],protocolMode:vI.AAD,OIDCOptions:{serverResponseType:Ll.FRAGMENT,defaultScopes:[Y.OPENID_SCOPE,Y.PROFILE_SCOPE,Y.OFFLINE_ACCESS_SCOPE]},azureCloudOptions:{azureCloudInstance:OZ.None,tenant:Y.EMPTY_STRING},skipAuthorityMetadataCache:!1,supportsNestedAppAuth:!1,instanceAware:!1,encodeExtraQueryParams:!1,verifySSO:!1},Z={cacheLocation:XI.SessionStorage,cacheRetentionDays:5,temporaryCacheLocation:XI.SessionStorage,storeAuthStateInCookie:!1,secureCookies:!1,cacheMigrationEnabled:!!(I&&I.cacheLocation===XI.LocalStorage),claimsBasedCachingEnabled:!1},B={loggerCallback:()=>{},logLevel:GI.Info,piiLoggingEnabled:!1},i={...{...ZV,loggerOptions:B,networkClient:l?new oN:Da,navigationClient:new Sl,loadFrameTimeout:0,windowHashTimeout:g?.loadFrameTimeout||mN,iframeHashTimeout:g?.loadFrameTimeout||FZ,navigateFrameWait:0,redirectNavigationTimeout:nN,asyncPopups:!1,allowRedirectInIframe:!1,allowPlatformBroker:!1,allowPlatformBrokerWithDOM:!1,nativeBrokerHandshakeTimeout:g?.nativeBrokerHandshakeTimeout||mG,pollIntervalMilliseconds:jI.DEFAULT_POLL_INTERVAL_MS},...g,loggerOptions:g?.loggerOptions||B},F={application:{appName:Y.EMPTY_STRING,appVersion:Y.EMPTY_STRING},client:new dV};if(C?.protocolMode!==vI.OIDC&&C?.OIDCOptions&&new IC(i.loggerOptions).warning(JSON.stringify(iI(PF))),C?.protocolMode&&C.protocolMode===vI.OIDC&&i?.allowPlatformBroker)throw iI(fF);return{auth:{...d,...C,OIDCOptions:{...d.OIDCOptions,...C?.OIDCOptions}},cache:{...Z,...I},system:i,telemetry:{...F,...A}}}const aN="@azure/msal-browser",RC="4.30.0";const MI="msal",nG="browser",Sc="|",DI=2,dl=2,NN=`${MI}.${nG}.log.level`,YN=`${MI}.${nG}.log.pii`,Xc=`${MI}.version`,yc="account.keys",tc="token.keys";function DC(C=dl){return C<1?`${MI}.${yc}`:`${MI}.${C}.${yc}`}function MC(C,I=DI){return I<1?`${MI}.${tc}.${C}`:`${MI}.${I}.${tc}.${C}`}class uB{static loggerCallback(I,g){switch(I){case GI.Error:return;case GI.Info:return;case GI.Verbose:return;case GI.Warning:return;default:return}}constructor(I){this.browserEnvironment=typeof window<"u",this.config=QN(I,this.browserEnvironment);let g;try{g=window[XI.SessionStorage]}catch{}const A=g?.getItem(NN),l=g?.getItem(YN)?.toLowerCase(),d=l==="true"?!0:l==="false"?!1:void 0,Z={...this.config.system.loggerOptions},B=A&&Object.keys(GI).includes(A)?GI[A]:void 0;B&&(Z.loggerCallback=uB.loggerCallback,Z.logLevel=B),d!==void 0&&(Z.piiLoggingEnabled=d),this.logger=new IC(Z,aN,RC),this.available=!1}getConfig(){return this.config}getLogger(){return this.logger}isAvailable(){return this.available}isBrowserEnvironment(){return this.browserEnvironment}}class sC extends uB{getModuleName(){return sC.MODULE_NAME}getId(){return sC.ID}async initialize(){return this.available=typeof window<"u",this.available}}sC.MODULE_NAME="";sC.ID="StandardOperatingContext";class wN{constructor(){this.dbName=iZ,this.version=Pa,this.tableName=fa,this.dbOpen=!1}async open(){return new Promise((I,g)=>{const A=window.indexedDB.open(this.dbName,this.version);A.addEventListener("upgradeneeded",l=>{l.target.result.createObjectStore(this.tableName)}),A.addEventListener("success",l=>{const d=l;this.db=d.target.result,this.dbOpen=!0,I()}),A.addEventListener("error",()=>g(H(YB)))})}closeConnection(){const I=this.db;I&&this.dbOpen&&(I.close(),this.dbOpen=!1)}async validateDbIsOpen(){if(!this.dbOpen)return this.open()}async getItem(I){return await this.validateDbIsOpen(),new Promise((g,A)=>{if(!this.db)return A(H(hC));const Z=this.db.transaction([this.tableName],"readonly").objectStore(this.tableName).get(I);Z.addEventListener("success",B=>{const c=B;this.closeConnection(),g(c.target.result)}),Z.addEventListener("error",B=>{this.closeConnection(),A(B)})})}async setItem(I,g){return await this.validateDbIsOpen(),new Promise((A,l)=>{if(!this.db)return l(H(hC));const B=this.db.transaction([this.tableName],"readwrite").objectStore(this.tableName).put(g,I);B.addEventListener("success",()=>{this.closeConnection(),A()}),B.addEventListener("error",c=>{this.closeConnection(),l(c)})})}async removeItem(I){return await this.validateDbIsOpen(),new Promise((g,A)=>{if(!this.db)return A(H(hC));const Z=this.db.transaction([this.tableName],"readwrite").objectStore(this.tableName).delete(I);Z.addEventListener("success",()=>{this.closeConnection(),g()}),Z.addEventListener("error",B=>{this.closeConnection(),A(B)})})}async getKeys(){return await this.validateDbIsOpen(),new Promise((I,g)=>{if(!this.db)return g(H(hC));const d=this.db.transaction([this.tableName],"readonly").objectStore(this.tableName).getAllKeys();d.addEventListener("success",Z=>{const B=Z;this.closeConnection(),I(B.target.result)}),d.addEventListener("error",Z=>{this.closeConnection(),g(Z)})})}async containsKey(I){return await this.validateDbIsOpen(),new Promise((g,A)=>{if(!this.db)return A(H(hC));const Z=this.db.transaction([this.tableName],"readonly").objectStore(this.tableName).count(I);Z.addEventListener("success",B=>{const c=B;this.closeConnection(),g(c.target.result===1)}),Z.addEventListener("error",B=>{this.closeConnection(),A(B)})})}async deleteDatabase(){return this.db&&this.dbOpen&&this.closeConnection(),new Promise((I,g)=>{const A=window.indexedDB.deleteDatabase(iZ),l=setTimeout(()=>g(!1),200);A.addEventListener("success",()=>(clearTimeout(l),I(!0))),A.addEventListener("blocked",()=>(clearTimeout(l),I(!0))),A.addEventListener("error",()=>(clearTimeout(l),g(!1)))})}}class Ad{constructor(){this.cache=new Map}async initialize(){}getItem(I){return this.cache.get(I)||null}getUserData(I){return this.getItem(I)}setItem(I,g){this.cache.set(I,g)}async setUserData(I,g){this.setItem(I,g)}removeItem(I){this.cache.delete(I)}getKeys(){const I=[];return this.cache.forEach((g,A)=>{I.push(A)}),I}containsKey(I){return this.cache.has(I)}clear(){this.cache.clear()}decryptData(){return Promise.resolve(null)}}class hN{constructor(I){this.inMemoryCache=new Ad,this.indexedDBCache=new wN,this.logger=I}
20handleDatabaseAccessError(I){if(I instanceof hA&&I.errorCode===YB)this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.");else throw I}async getItem(I){const g=this.inMemoryCache.getItem(I);if(!g)try{return this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage."),await this.indexedDBCache.getItem(I)}catch(A){this.handleDatabaseAccessError(A)}return g}async setItem(I,g){this.inMemoryCache.setItem(I,g);try{await this.indexedDBCache.setItem(I,g)}catch(A){this.handleDatabaseAccessError(A)}}async removeItem(I){this.inMemoryCache.removeItem(I);try{await this.indexedDBCache.removeItem(I)}catch(g){this.handleDatabaseAccessError(g)}}async getKeys(){const I=this.inMemoryCache.getKeys();if(I.length===0)try{return this.logger.verbose("In-memory cache is empty, now querying persistent storage."),await this.indexedDBCache.getKeys()}catch(g){this.handleDatabaseAccessError(g)}return I}async containsKey(I){const g=this.inMemoryCache.containsKey(I);if(!g)try{return this.logger.verbose("Key not found in in-memory cache, now querying persistent storage."),await this.indexedDBCache.containsKey(I)}catch(A){this.handleDatabaseAccessError(A)}return g}clearInMemory(){this.logger.verbose("Deleting in-memory keystore"),this.inMemoryCache.clear(),this.logger.verbose("In-memory keystore deleted")}async clearPersistent(){try{this.logger.verbose("Deleting persistent keystore");const I=await this.indexedDBCache.deleteDatabase();return I&&this.logger.verbose("Persistent keystore deleted"),I}catch(I){return this.handleDatabaseAccessError(I),!1}}}class Dg{constructor(I,g,A){this.logger=I,AN(A??!1),this.cache=new hN(this.logger),this.performanceClient=g}createNewGuid(){return hg()}base64Encode(I){return oA(I)}base64Decode(I){return zI(I)}base64UrlEncode(I){return xA(I)}encodeKid(I){return this.base64UrlEncode(JSON.stringify({kid:I}))}async getPublicKeyThumbprint(I){const g=this.performanceClient?.startMeasurement(b.CryptoOptsGetPublicKeyThumbprint,I.correlationId),A=await dN(Dg.EXTRACTABLE,Dg.POP_KEY_USAGES),l=await Sd(A.publicKey),d={e:l.e,kty:l.kty,n:l.n},Z=Dc(d),B=await this.hashString(Z),c=await Sd(A.privateKey),i=await ZN(c,!1,["sign"]);return await this.cache.setItem(B,{privateKey:i,publicKey:A.publicKey,requestMethod:I.resourceRequestMethod,requestUri:I.resourceRequestUri}),g&&g.end({success:!0}),B}async removeTokenBindingKey(I){if(await this.cache.removeItem(I),await this.cache.containsKey(I))throw e(pF)}async clearKeystore(){this.cache.clearInMemory();try{return await this.cache.clearPersistent(),!0}catch(I){return I instanceof Error?this.logger.error(`Clearing keystore failed with error: ${I.message}`):this.logger.error("Clearing keystore failed with unknown error"),!1}}async signJwt(I,g,A,l){const d=this.performanceClient?.startMeasurement(b.CryptoOptsSignJwt,l),Z=await this.cache.getItem(g);if(!Z)throw H(NB);const B=await Sd(Z.publicKey),c=Dc(B),i=xA(JSON.stringify({kid:g})),F=mB.getShrHeaderString({...A?.header,alg:B.alg,kid:i}),V=xA(F);I.cnf={jwk:JSON.parse(c)};const W=xA(JSON.stringify(I)),G=`${V}.${W}`,s=new TextEncoder().encode(G),Q=await BN(Z.privateKey,s),m=gC(new Uint8Array(Q)),n=`${G}.${m}`;return d&&d.end({success:!0}),n}async hashString(I){return WG(I)}}Dg.POP_KEY_USAGES=["sign","verify"];Dg.EXTRACTABLE=!0;function Dc(C){return JSON.stringify(C,Object.keys(C).sort())}const eN=1440*60*1e3,VZ={Lax:"Lax",None:"None"};class QG{initialize(){return Promise.resolve()}getItem(I){const g=`${encodeURIComponent(I)}`,A=document.cookie.split(";");for(let l=0;l<A.length;l++){const d=A[l],[Z,...B]=decodeURIComponent(d).trim().split("="),c=B.join("=");if(Z===g)return c}return""}getUserData(){throw e(x)}setItem(I,g,A,l=!0,d=VZ.Lax){let Z=`${encodeURIComponent(I)}=${encodeURIComponent(g)};path=/;SameSite=${d};`;if(A){const B=JN(A);Z+=`expires=${B};`}(l||d===VZ.None)&&(Z+="Secure;"),document.cookie=Z}async setUserData(){return Promise.reject(e(x))}removeItem(I){this.setItem(I,"",-1)}getKeys(){const I=document.cookie.split(";"),g=[];return I.forEach(A=>{const l=decodeURIComponent(A).trim().split("=");g.push(l[0])}),g}containsKey(I){return this.getKeys().includes(I)}decryptData(){return Promise.resolve(null)}}function JN(C){const I=new Date;return new Date(I.getTime()+C*eN).toUTCString()}function zg(C,I){const g=C.getItem(DC(I));return g?JSON.parse(g):[]}function Fg(C,I,g){const A=I.getItem(MC(C,g));if(A){const l=JSON.parse(A);if(l&&l.hasOwnProperty("idToken")&&l.hasOwnProperty("accessToken")&&l.hasOwnProperty("refreshToken"))return l}return{idToken:[],accessToken:[],refreshToken:[]}}function Zl(C){return C.hasOwnProperty("id")&&C.hasOwnProperty("nonce")&&C.hasOwnProperty("data")}const Mc="msal.cache.encryption",SN="msal.broadcast.cache";class XN{constructor(I,g,A){if(!window.localStorage)throw DB(Cd);this.memoryStorage=new Ad,this.initialized=!1,this.clientId=I,this.logger=g,this.performanceClient=A,this.broadcast=new BroadcastChannel(SN)}async initialize(I){const g=new QG,A=g.getItem(Mc);let l={key:"",id:""};if(A)try{l=JSON.parse(A)}catch{}if(l.key&&l.id){const d=xI(fg,b.Base64Decode,this.logger,this.performanceClient,I)(l.key);this.encryptionCookie={id:l.id,key:await a(Yc,b.GenerateHKDF,this.logger,this.performanceClient,I)(d)}}else{const d=hg(),Z=await a(VG,b.GenerateBaseKey,this.logger,this.performanceClient,I)(),B=xI(gC,b.UrlEncodeArr,this.logger,this.performanceClient,I)(new Uint8Array(Z));this.encryptionCookie={id:d,key:await a(Yc,b.GenerateHKDF,this.logger,this.performanceClient,I)(Z)};const c={id:d,key:B};g.setItem(Mc,JSON.stringify(c),0,!0,VZ.None)}await a(this.importExistingCache.bind(this),b.ImportExistingCache,this.logger,this.performanceClient,I)(I),this.broadcast.addEventListener("message",this.updateCache.bind(this)),this.initialized=!0}getItem(I){return window.localStorage.getItem(I)}getUserData(I){if(!this.initialized)throw H(iA);return this.memoryStorage.getItem(I)}async decryptData(I,g,A){if(!this.initialized||!this.encryptionCookie)throw H(iA);
20if(g.id!==this.encryptionCookie.id)return this.performanceClient.incrementFields({encryptedCacheExpiredCount:1},A),null;const l=await a(wc,b.Decrypt,this.logger,this.performanceClient,A)(this.encryptionCookie.key,g.nonce,this.getContext(I),g.data);if(!l)return null;try{return{...JSON.parse(l),lastUpdatedAt:g.lastUpdatedAt}}catch{return this.performanceClient.incrementFields({encryptedCacheCorruptionCount:1},A),null}}setItem(I,g){window.localStorage.setItem(I,g)}async setUserData(I,g,A,l,d){if(!this.initialized||!this.encryptionCookie)throw H(iA);if(d)this.setItem(I,g);else{const{data:Z,nonce:B}=await a(FN,b.Encrypt,this.logger,this.performanceClient,A)(this.encryptionCookie.key,g,this.getContext(I)),c={id:this.encryptionCookie.id,nonce:B,data:Z,lastUpdatedAt:l};this.setItem(I,JSON.stringify(c))}this.memoryStorage.setItem(I,g),this.broadcast.postMessage({key:I,value:g,context:this.getContext(I)})}removeItem(I){this.memoryStorage.containsKey(I)&&(this.memoryStorage.removeItem(I),this.broadcast.postMessage({key:I,value:null,context:this.getContext(I)})),window.localStorage.removeItem(I)}getKeys(){return Object.keys(window.localStorage)}containsKey(I){return window.localStorage.hasOwnProperty(I)}clear(){this.memoryStorage.clear(),zg(this).forEach(A=>this.removeItem(A));const g=Fg(this.clientId,this);g.idToken.forEach(A=>this.removeItem(A)),g.accessToken.forEach(A=>this.removeItem(A)),g.refreshToken.forEach(A=>this.removeItem(A)),this.getKeys().forEach(A=>{(A.startsWith(MI)||A.indexOf(this.clientId)!==-1)&&this.removeItem(A)})}async importExistingCache(I){if(!this.encryptionCookie)return;let g=zg(this);g=await this.importArray(g,I),g.length?this.setItem(DC(),JSON.stringify(g)):this.removeItem(DC());const A=Fg(this.clientId,this);A.idToken=await this.importArray(A.idToken,I),A.accessToken=await this.importArray(A.accessToken,I),A.refreshToken=await this.importArray(A.refreshToken,I),A.idToken.length||A.accessToken.length||A.refreshToken.length?this.setItem(MC(this.clientId),JSON.stringify(A)):this.removeItem(MC(this.clientId))}async getItemFromEncryptedCache(I,g){if(!this.encryptionCookie)return null;const A=this.getItem(I);if(!A)return null;let l;try{l=JSON.parse(A)}catch{return null}return Zl(l)?l.id!==this.encryptionCookie.id?(this.performanceClient.incrementFields({encryptedCacheExpiredCount:1},g),null):(this.performanceClient.incrementFields({encryptedCacheCount:1},g),a(wc,b.Decrypt,this.logger,this.performanceClient,g)(this.encryptionCookie.key,l.nonce,this.getContext(I),l.data)):(this.performanceClient.incrementFields({unencryptedCacheCount:1},g),A)}async importArray(I,g){const A=[],l=[];return I.forEach(d=>{const Z=this.getItemFromEncryptedCache(d,g).then(B=>{B?(this.memoryStorage.setItem(d,B),A.push(d)):this.removeItem(d)});l.push(Z)}),await Promise.all(l),A}getContext(I){let g="";return I.includes(this.clientId)&&(g=this.clientId),g}updateCache(I){this.logger.trace("Updating internal cache from broadcast event");const g=this.performanceClient.startMeasurement(b.LocalStorageUpdated);g.add({isBackground:!0});const{key:A,value:l,context:d}=I.data;if(!A){this.logger.error("Broadcast event missing key"),g.end({success:!1,errorCode:"noKey"});return}if(d&&d!==this.clientId){this.logger.trace(`Ignoring broadcast event from clientId: ${d}`),g.end({success:!1,errorCode:"contextMismatch"});return}l?(this.memoryStorage.setItem(A,l),this.logger.verbose("Updated
20item in internal cache")):(this.memoryStorage.removeItem(A),this.logger.verbose("Removed item from internal cache")),g.end({success:!0})}}class yN{constructor(){if(!window.sessionStorage)throw DB(Cd)}async initialize(){}getItem(I){return window.sessionStorage.getItem(I)}getUserData(I){return this.getItem(I)}setItem(I,g){window.sessionStorage.setItem(I,g)}async setUserData(I,g){this.setItem(I,g)}removeItem(I){window.sessionStorage.removeItem(I)}getKeys(){return Object.keys(window.sessionStorage)}containsKey(I){return window.sessionStorage.hasOwnProperty(I)}decryptData(){return Promise.resolve(null)}}const z={INITIALIZE_START:"msal:initializeStart",INITIALIZE_END:"msal:initializeEnd",ACCOUNT_ADDED:"msal:accountAdded",ACCOUNT_REMOVED:"msal:accountRemoved",ACTIVE_ACCOUNT_CHANGED:"msal:activeAccountChanged",LOGIN_START:"msal:loginStart",LOGIN_SUCCESS:"msal:loginSuccess",LOGIN_FAILURE:"msal:loginFailure",ACQUIRE_TOKEN_START:"msal:acquireTokenStart",ACQUIRE_TOKEN_SUCCESS:"msal:acquireTokenSuccess",ACQUIRE_TOKEN_FAILURE:"msal:acquireTokenFailure",ACQUIRE_TOKEN_NETWORK_START:"msal:acquireTokenFromNetworkStart",SSO_SILENT_START:"msal:ssoSilentStart",SSO_SILENT_SUCCESS:"msal:ssoSilentSuccess",SSO_SILENT_FAILURE:"msal:ssoSilentFailure",ACQUIRE_TOKEN_BY_CODE_START:"msal:acquireTokenByCodeStart",ACQUIRE_TOKEN_BY_CODE_SUCCESS:"msal:acquireTokenByCodeSuccess",ACQUIRE_TOKEN_BY_CODE_FAILURE:"msal:acquireTokenByCodeFailure",HANDLE_REDIRECT_START:"msal:handleRedirectStart",HANDLE_REDIRECT_END:"msal:handleRedirectEnd",POPUP_OPENED:"msal:popupOpened",LOGOUT_START:"msal:logoutStart",LOGOUT_SUCCESS:"msal:logoutSuccess",LOGOUT_FAILURE:"msal:logoutFailure",LOGOUT_END:"msal:logoutEnd",RESTORE_FROM_BFCACHE:"msal:restoreFromBFCache",BROKER_CONNECTION_ESTABLISHED:"msal:brokerConnectionEstablished"};function Kg(C,I){const g=C.indexOf(I);g>-1&&C.splice(g,1)}class GZ extends dZ{constructor(I,g,A,l,d,Z,B){super(I,A,l,d,B),this.cacheConfig=g,this.logger=l,this.internalStorage=new Ad,this.browserStorage=Hc(I,g.cacheLocation,l,d),this.temporaryCacheStorage=Hc(I,g.temporaryCacheLocation,l,d),this.cookieStorage=new QG,this.eventHandler=Z}async initialize(I){this.performanceClient.addFields({cacheLocation:this.cacheConfig.cacheLocation,cacheRetentionDays:this.cacheConfig.cacheRetentionDays},I),await this.browserStorage.initialize(I),await this.migrateExistingCache(I),this.trackVersionChanges(I)}async migrateExistingCache(I){let g=zg(this.browserStorage),A=Fg(this.clientId,this.browserStorage);this.performanceClient.addFields({preMigrateAcntCount:g.length,preMigrateATCount:A.accessToken.length,preMigrateITCount:A.idToken.length,preMigrateRTCount:A.refreshToken.length},I);for(let d=0;d<dl;d++){const Z=d;await this.removeStaleAccounts(d,Z,I)}for(let d=0;d<DI;d++){const Z=d;await this.migrateIdTokens(d,Z,I)}const l=this.getKMSIValues();for(let d=0;d<DI;d++)await this.migrateAccessTokens(d,l,I),await this.migrateRefreshTokens(d,l,I);g=zg(this.browserStorage),A=Fg(this.clientId,this.browserStorage),this.performanceClient.addFields({postMigrateAcntCount:g.length,postMigrateATCount:A.accessToken.length,postMigrateITCount:A.idToken.length,postMigrateRTCount:A.refreshToken.length},I)}async updateOldEntry(I,g){const A=this.browserStorage.getItem(I),l=this.validateAndParseJson(A||"");if(!l)return this.browserStorage.removeItem(I),null;if(!l.lastUpdatedAt)l.lastUpdatedAt=Date.now().toString(),this.setItem(I,JSON.stringify(l),g);else if(Vc(l.lastUpdatedAt,this.cacheConfig.cacheRetentionDays))return this.browserStorage.removeItem(I),this.performanceClient.incrementFields({expiredCacheRemovedCount:1},g),null;const d=Zl(l)?await this.browserStorage.decryptData(I,l,g):l;return!d||!Pl(d)?(this.performanceClient.incrementFields({invalidCacheCount:1},g),null):(Gc(d)||Wc(d))&&d.expiresOn&&Yl(d.expiresOn,QF)?(this.browserStorage.removeItem(I),this.performanceClient.incrementFields({expiredCacheRemovedCount:1},g),null):d}async removeStaleAccounts(I,g,A){const l=zg(this.browserStorage,I);if(l.length!==0){for(const d of[...l]){this.performanceClient.incrementFields({oldAcntCount:1},A);const Z=this.browserStorage.getItem(d),B=this.validateAndParseJson(Z||"");if(!B){Kg(l,d);continue}if(B.lastUpdatedAt)Vc(B.lastUpdatedAt,this.cacheConfig.cacheRetentionDays)&&(await this.removeAccountOldSchema(d,B,g,A),Kg(l,d));else{B.lastUpdatedAt=Date.now().toString(),this.setItem(d,JSON.stringify(B),A);continue}}this.setAccountKeys(l,A,I)}}async removeAccountOldSchema(I,g,A,l){const Z=(Zl(g)?await this.browserStorage.decryptData(I,g,l):g)?.homeAccountId;if(Z){const B=this.getTokenKeys(A);[...B.idToken].filter(c=>
20c.includes(Z)).forEach(c=>{this.browserStorage.removeItem(c),Kg(B.idToken,c)}),[...B.accessToken].filter(c=>c.includes(Z)).forEach(c=>{this.browserStorage.removeItem(c),Kg(B.accessToken,c)}),[...B.refreshToken].filter(c=>c.includes(Z)).forEach(c=>{this.browserStorage.removeItem(c),Kg(B.refreshToken,c)}),this.setTokenKeys(B,l,A)}this.performanceClient.incrementFields({expiredAcntRemovedCount:1},l),this.browserStorage.removeItem(I)}getKMSIValues(){const I={},g=this.getTokenKeys().idToken;for(const A of g){const l=this.browserStorage.getUserData(A);if(l){const d=JSON.parse(l),Z=Yg(d.secret,zI);Z&&(I[d.homeAccountId]=wg(Z))}}return I}async migrateIdTokens(I,g,A){const l=Fg(this.clientId,this.browserStorage,I);if(l.idToken.length===0)return;const d=Fg(this.clientId,this.browserStorage,DI),Z=zg(this.browserStorage),B=zg(this.browserStorage,g);for(const c of[...l.idToken]){this.performanceClient.incrementFields({oldITCount:1},A);const i=await this.updateOldEntry(c,A);if(!i){Kg(l.idToken,c);continue}const F=Z.find(n=>n.includes(i.homeAccountId)),V=B.find(n=>n.includes(i.homeAccountId));let W=null;if(F)W=this.getAccount(F,A);else if(V){const n=this.browserStorage.getItem(V),o=this.validateAndParseJson(n||"");W=o&&Zl(o)?await this.browserStorage.decryptData(V,o,A):o}if(!W){this.performanceClient.incrementFields({skipITMigrateCount:1},A);continue}const G=Yg(i.secret,zI),R=this.generateCredentialKey(i),s=this.getIdTokenCredential(R,A),Q=Object.keys(G).includes("signin_state"),m=s&&Object.keys(Yg(s.secret,zI)||{}).includes("signin_state");if(!s||i.lastUpdatedAt>s.lastUpdatedAt&&(Q||!m)){const n=W.tenantProfiles||[],o=qZ(G)||W.realm;if(o&&!n.find(K=>K.tenantId===o)){const K=XC(W.homeAccountId,W.localAccountId,o,G);n.push(K)}W.tenantProfiles=n;const w=this.generateAccountKey(mI.getAccountInfo(W)),J=wg(G);await this.setUserData(w,JSON.stringify(W),A,W.lastUpdatedAt,J),Z.includes(w)||Z.push(w),await this.setUserData(R,JSON.stringify(i),A,i.lastUpdatedAt,J),this.performanceClient.incrementFields({migratedITCount:1},A),d.idToken.push(R)}}this.setTokenKeys(l,A,I),this.setTokenKeys(d,A),this.setAccountKeys(Z,A)}async migrateAccessTokens(I,g,A){const l=Fg(this.clientId,this.browserStorage,I);if(l.accessToken.length===0)return;const d=Fg(this.clientId,this.browserStorage,DI);for(const Z of[...l.accessToken]){this.performanceClient.incrementFields({oldATCount:1},A);const B=await this.updateOldEntry(Z,A);if(!B){Kg(l.accessToken,Z);continue}if(!Object.keys(g).includes(B.homeAccountId)){this.performanceClient.incrementFields({skipATMigrateCount:1},A);continue}const c=this.generateCredentialKey(B),i=g[B.homeAccountId];if(!d.accessToken.includes(c))await this.setUserData(c,JSON.stringify(B),A,B.lastUpdatedAt,i),this.performanceClient.incrementFields({migratedATCount:1},A),d.accessToken.push(c);else{const F=this.getAccessTokenCredential(c,A);(!F||B.lastUpdatedAt>F.lastUpdatedAt)&&(await this.setUserData(c,JSON.stringify(B),A,B.lastUpdatedAt,i),this.performanceClient.incrementFields({migratedATCount:1},A))}}this.setTokenKeys(l,A,I),this.setTokenKeys(d,A)}async migrateRefreshTokens(I,g,A){const l=Fg(this.clientId,this.browserStorage,I);if(l.refreshToken.length===0)return;const d=Fg(this.clientId,this.browserStorage,DI);for(const Z of[...l.refreshToken]){this.performanceClient.incrementFields({oldRTCount:1},A);const B=await this.updateOldEntry(Z,A);if(!B){Kg(l.refreshToken,Z);continue}if(!Object.keys(g).includes(B.homeAccountId)){this.performanceClient.incrementFields({skipRTMigrateCount:1},A);continue}const c=this.generateCredentialKey(B),i=g[B.homeAccountId];if(!d.refreshToken.includes(c))await this.setUserData(c,JSON.stringify(B),A,B.lastUpdatedAt,i),this.performanceClient.incrementFields({migratedRTCount:1},A),d.refreshToken.push(c);else{const F=this.getRefreshTokenCredential(c,A);(!F||B.lastUpdatedAt>F.lastUpdatedAt)&&(await this.setUserData(c,JSON.stringify(B),A,B.lastUpdatedAt,i),this.performanceClient.incrementFields({migratedRTCount:1},A))}}this.setTokenKeys(l,A,I),this.setTokenKeys(d,A)}trackVersionChanges(I){const g=this.browserStorage.getItem(Xc);g&&(this.logger.info(`MSAL.js was last initialized by version: ${g}`),this.performanceClient.addFields({previousLibraryVersion:g},I)),g!==RC&&this.setItem(Xc,RC,I)}validateAndParseJson(I){if(!I)return null;try{const g=JSON.parse(I);return g&&typeof g=="object"?g:null}catch{return null}}setItem(I,g,A){const l=new Array(DI+1).fill(0),d=[],Z=20;for(let B=0;B<=Z;B++)try{if(this.browserStorage.setItem(I,g),B>0)for(let c=0;c<=DI;c++){const i=l.slice(0,c).reduce((V,W)=>V+W,0);if(i>=B)break;const F=B>i+l[c]?i+l[c]:B;B>i&&l[c]>0&&this.removeAccessTokenKeys(d.slice(i,F),A,c)}break}catch(c){const i=lZ(c);if(i.errorCode===Ql&&B<Z){if(!d.length)for(let F=0;F<=DI;F++)if(I===MC(this.clientId,F)){const V=JSON.parse(g).accessToken;d.push(...V),l[F]=V.length}else{const V=this.getTokenKeys(F).accessToken;d.push(...V),l[F]=V.length}if(d.length<=B)throw i;this.removeAccessToken(d[B],A,!1)}else throw i}}async setUserData(I,g,A,l,d){const Z=new Array(DI+1).fill(0),B=[],c=20;for(let i=0;i<=c;i++)try{if(await a(this.browserStorage.setUserData.bind(this.browserStorage),b.SetUserData,this.logger,this.performanceClient)(I,g,A,l,d),i>0)for(let F=0;F<=DI;F++){const V=Z.slice(0,F).reduce((G,R)=>G+R,0);if(V>=i)break;const W=i>V+Z[F]?V+Z[F]:i;i>V&&Z[F]>0&&this.removeAccessTokenKeys(B.slice(V,W),A,F)}break}catch(F){const V=lZ(F);if(V.errorCode===Ql&&i<c){if(!B.length)for(let W=0;W<=DI;W++){const G=this.getTokenKeys(W).accessToken;B.push(...G),Z[W]=G.length}if(B.length<=i)throw V;this.removeAccessToken(B[i],A,!1)}else throw V}}getAccount(I,g){this.logger.trace("BrowserCacheManager.getAccount called");const A=this.browserStorage.getUserData(I);if(!A)return this.removeAccountKeyFromMap(I,g),null;const l=this.validateAndParseJson(A);return!l||!mI.isAccountEntity(l)?null:(this.performanceClient.addFields({accountCachedBy:xa(l.cachedByApiId)},g),dZ.toObject(new mI,l))}async setAccount(I,g,A,l){this.logger.trace("BrowserCacheManager.setAccount called");const d=this.generateAccountKey(mI.getAccountInfo(I)),Z=Date.now().toString();I.lastUpdatedAt=Z,I.cachedByApiId=l,await this.setUserData(d,JSON.stringify(I),g,Z,A);const B=this.addAccountKeyToMap(d,g);this.performanceClient.addFields({kmsi:A},g),this.cacheConfig.cacheLocation===XI.LocalStorage&&B&&this.eventHandler.emitEvent(z.ACCOUNT_ADDED,void 0,mI.getAccountInfo(I))}getAccountKeys(){return zg(this.browserStorage)}setAccountKeys(I,g,A=dl){I.length===0?this.removeItem(DC(A)):this.setItem(DC(A),JSON.stringify(I),g)}addAccountKeyToMap(I,g){this.logger.trace("BrowserCacheManager.addAccountKeyToMap called"),this.logger.tracePii(`BrowserCacheManager.addAccountKeyToMap called with key: ${I}`);const A=this.getAccountKeys();return A.indexOf(I)===-1?(A.push(I),this.setItem(DC(),JSON.stringify(A),g),this.logger.verbose("BrowserCacheManager.addAccountKeyToMap account key added"),!0):(this.logger.verbose("BrowserCacheManager.addAccountKeyToMap account key already exists in map"),!1)}removeAccountKeyFromMap(I,g){this.logger.trace("BrowserCacheManager.removeAccountKeyFromMap called"),this.logger.tracePii(`BrowserCacheManager.removeAccountKeyFromMap called with key: ${I}`);const A=this.getAccountKeys(),l=A.indexOf(I);l>-1?(A.splice(l,1),this.setAccountKeys(A,g),this.logger.trace("BrowserCacheManager.removeAccountKeyFromMap account key removed")):this.logger.trace("BrowserCacheManager.removeAccountKeyFromMap ke
20y not found in existing map")}removeAccount(I,g){const A=this.getActiveAccount(g);A?.homeAccountId===I.homeAccountId&&A?.environment===I.environment&&this.setActiveAccount(null,g),super.removeAccount(I,g),this.removeAccountKeyFromMap(this.generateAccountKey(I),g),this.browserStorage.getKeys().forEach(l=>{l.includes(I.homeAccountId)&&l.includes(I.environment)&&this.browserStorage.removeItem(l)}),this.cacheConfig.cacheLocation===XI.LocalStorage&&this.eventHandler.emitEvent(z.ACCOUNT_REMOVED,void 0,I)}removeIdToken(I,g){super.removeIdToken(I,g);const A=this.getTokenKeys(),l=A.idToken.indexOf(I);l>-1&&(this.logger.info("idToken removed from tokenKeys map"),A.idToken.splice(l,1),this.setTokenKeys(A,g))}removeAccessToken(I,g,A=!0){super.removeAccessToken(I,g),A&&this.removeAccessTokenKeys([I],g)}removeAccessTokenKeys(I,g,A=DI){this.logger.trace("removeAccessTokenKey called");const l=this.getTokenKeys(A);let d=0;if(I.forEach(Z=>{const B=l.accessToken.indexOf(Z);B>-1&&(l.accessToken.splice(B,1),d++)}),d>0){this.logger.info(`removed ${d} accessToken keys from tokenKeys map`),this.setTokenKeys(l,g,A);return}}removeRefreshToken(I,g){super.removeRefreshToken(I,g);const A=this.getTokenKeys(),l=A.refreshToken.indexOf(I);l>-1&&(this.logger.info("refreshToken removed from tokenKeys map"),A.refreshToken.splice(l,1),this.setTokenKeys(A,g))}getTokenKeys(I=DI){return Fg(this.clientId,this.browserStorage,I)}setTokenKeys(I,g,A=DI){if(I.idToken.length===0&&I.accessToken.length===0&&I.refreshToken.length===0){this.removeItem(MC(this.clientId,A));return}else this.setItem(MC(this.clientId,A),JSON.stringify(I),g)}getIdTokenCredential(I,g){const A=this.browserStorage.getUserData(I);if(!A)return this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit"),this.removeIdToken(I,g),null;const l=this.validateAndParseJson(A);return!l||!sa(l)?(this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit"),null):(this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit"),l)}async setIdTokenCredential(I,g,A){this.logger.trace("BrowserCacheManager.setIdTokenCredential called");const l=this.generateCredentialKey(I),d=Date.now().toString();I.lastUpdatedAt=d,await this.setUserData(l,JSON.stringify(I),g,d,A);const Z=this.getTokenKeys();Z.idToken.indexOf(l)===-1&&(this.logger.info("BrowserCacheManager: addTokenKey - idToken added to map"),Z.idToken.push(l),this.setTokenKeys(Z,g))}getAccessTokenCredential(I,g){const A=this.browserStorage.getUserData(I);if(!A)return this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit"),this.removeAccessTokenKeys([I],g),null;const l=this.validateAndParseJson(A);return!l||!Gc(l)?(this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit"),null):(this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit"),l)}async setAccessTokenCredential(I,g,A){this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");const l=this.generateCredentialKey(I),d=Date.now().toString();I.lastUpdatedAt=d,await this.setUserData(l,JSON.stringify(I),g,d,A);const Z=this.getTokenKeys(),B=Z.accessToken.indexOf(l);B!==-1&&Z.accessToken.splice(B,1),this.logger.trace(`access token ${B===-1?"added to":"updated in"} map`),Z.accessToken.push(l),this.setTokenKeys(Z,g)}getRefreshTokenCredential(I,g){const A=this.browserStorage.getUserData(I);if(!A)return this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit"),this.removeRefreshToken(I,g),null;const l=this.validateAndParseJson(A);return!l||!Wc(l)?(this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit"),null):(this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit"),l)}async setRefreshTokenCredential(I,g,A){this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");const l=this.generateCredentialKey(I),d=Date.now().toString();I.lastUpdatedAt=d,await this.setUserData(l,JSON.stringify(I),g,d,A);const Z=this.getTokenKeys();Z.refreshToken.indexOf(l)===-1&&(this.logger.info("BrowserCacheManager: addTokenKey - refreshToken added to map"),Z.refreshToken.push(l),this.setTokenKeys(Z,g))}getAppMetadata(I){const g=this.browserStorage.getItem(I);if(!g)return this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit"),null;const A=this.validateAndParseJson(g);return!A||!ma(I,A)?(this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit"),null):(this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit"),A)}setAppMetadata(I,g){this.logger.trace("BrowserCacheManager.setAppMetadata called");const A=oa(I);this.setItem(A,JSON.stringify(I),g)}getServerTelemetry(I){const g=this.browserStorage.getItem(I);if(!g)return this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit"),null;const A=this.validateAndParseJson(g);return!A||!ba(I,A)?(this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit"),null):(this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit"),A)}setServerTelemetry(I,g,A){this.logger.trace("BrowserCacheManager.setServerTelemetry called"),this.setItem(I,JSON.stringify(g),A)}getAuthorityMetadata(I){const g=this.internalStorage.getItem(I);if(!g)return this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit"),null;const A=this.validateAndParseJson(g);return A&&na(I,A)?(this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit"),A):null}getAuthorityMetadataKeys(){return this.internalStorage.getKeys().filter(g=>this.isAuthorityMetadata(g))}setWrapperMetadata(I,g){this.internalStorage.setItem(vA.WRAPPER_SKU,I),this.internalStorage.setItem(vA.WRAPPER_VER,g)}getWrapperMetadata(){const I=this.internalStorage.getItem(vA.WRAPPER_SKU)||Y.EMPTY_STRING,g=this.internalStorage.getItem(vA.WRAPPER_VER)||Y.EMPTY_STRING;return[I,g]}setAuthorityMetadata(I,g){this.logger.trace("BrowserCacheManager.setAuthorityMetadata called"),this.internalStorage.setItem(I,JSON.stringify(g))}getActiveAccount(I){const g=this.generateCacheKey(q0.ACTIVE_ACCOUNT_FILTERS),A=this.browserStorage.getItem(g);if(!A)return this.logger.trace("BrowserCacheManager.getActiveAccount: No active account filters found"),null;const l=this.validateAndParseJson(A);return l?(this.logger.trace("BrowserCacheManager.getActiveAccount: Active account filters schema found"),this.getAccountInfoFilteredBy({homeAccountId:l.homeAccountId,localAccountId:l.localAccountId,tenantId:l.tenantId},I)):(this.logger.trace("BrowserCacheManager.getActiveAccount: No active account found"),null)}setActiveAccount(I,g){const A=this.generateCacheKey(q0.ACTIVE_ACCOUNT_FILTERS);
20if(I){this.logger.verbose("setActiveAccount: Active account set");const l={homeAccountId:I.homeAccountId,localAccountId:I.localAccountId,tenantId:I.tenantId,lastUpdatedAt:LI().toString()};this.setItem(A,JSON.stringify(l),g)}else this.logger.verbose("setActiveAccount: No account passed, active account not set"),this.browserStorage.removeItem(A);this.eventHandler.emitEvent(z.ACTIVE_ACCOUNT_CHANGED)}getThrottlingCache(I){const g=this.browserStorage.getItem(I);if(!g)return this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit"),null;const A=this.validateAndParseJson(g);return!A||!Ua(I,A)?(this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit"),null):(this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit"),A)}setThrottlingCache(I,g,A){this.logger.trace("BrowserCacheManager.setThrottlingCache called"),this.setItem(I,JSON.stringify(g),A)}getTemporaryCache(I,g){const A=g?this.generateCacheKey(I):I;if(this.cacheConfig.storeAuthStateInCookie){const d=this.cookieStorage.getItem(A);if(d)return this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies"),d}const l=this.temporaryCacheStorage.getItem(A);if(!l){if(this.cacheConfig.cacheLocation===XI.LocalStorage){const d=this.browserStorage.getItem(A);if(d)return this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage"),d}return this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage"),null}return this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned"),l}setTemporaryCache(I,g,A){const l=A?this.generateCacheKey(I):I;this.temporaryCacheStorage.setItem(l,g),this.cacheConfig.storeAuthStateInCookie&&(this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie"),this.cookieStorage.setItem(l,g,void 0,this.cacheConfig.secureCookies))}removeItem(I){this.browserStorage.removeItem(I)}removeTemporaryItem(I){this.temporaryCacheStorage.removeItem(I),this.cacheConfig.storeAuthStateInCookie&&(this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie"),this.cookieStorage.removeItem(I))}getKeys(){return this.browserStorage.getKeys()}clear(I){this.removeAllAccounts(I),this.removeAppMetadata(I),this.temporaryCacheStorage.getKeys().forEach(g=>{(g.indexOf(MI)!==-1||g.indexOf(this.clientId)!==-1)&&this.removeTemporaryItem(g)}),this.browserStorage.getKeys().forEach(g=>{(g.indexOf(MI)!==-1||g.indexOf(this.clientId)!==-1)&&this.browserStorage.removeItem(g)}),this.internalStorage.clear()}clearTokensAndKeysWithClaims(I){this.performanceClient.addQueueMeasurement(b.ClearTokensAndKeysWithClaims,I);const g=this.getTokenKeys();let A=0;g.accessToken.forEach(l=>{const d=this.getAccessTokenCredential(l,I);d?.requestedClaimsHash&&l.includes(d.requestedClaimsHash.toLowerCase())&&(this.removeAccessToken(l,I),A++)}),A>0&&this.logger.warning(`${A} access tokens with claims in the cache keys have been removed from the cache.`)}generateCacheKey(I){return gg.startsWith(I,MI)?I:`${MI}.${this.clientId}.${I}`}generateCredentialKey(I){const g=I.credentialType===tI.REFRESH_TOKEN&&I.familyId||I.clientId,A=I.tokenType&&I.tokenType.toLowerCase()!==BI.BEARER.toLowerCase()?I.tokenType.toLowerCase():"";return[`${MI}.${DI}`,I.homeAccountId,I.environment,I.credentialType,g,I.realm||"",I.target||"",I.requestedClaimsHash||"",A].join(Sc).toLowerCase()}generateAccountKey(I){const g=I.homeAccountId.split(".")[1];return[`${MI}.${dl}`,I.homeAccountId,I.environment,g||I.tenantId||""].join(Sc).toLowerCase()}resetRequestCache(){this.logger.trace("BrowserCacheManager.resetRequestCache called"),this.removeTemporaryItem(this.generateCacheKey(NI.REQUEST_PARAMS)),this.removeTemporaryItem(this.generateCacheKey(NI.VERIFIER)),this.removeTemporaryItem(this.generateCacheKey(NI.ORIGIN_URI)),this.removeTemporaryItem(this.generateCacheKey(NI.URL_HASH)),this.removeTemporaryItem(this.generateCacheKey(NI.NATIVE_REQUEST)),this.setInteractionInProgress(!1)}cacheAuthorizeRequest(I,g){this.logger.trace("BrowserCacheManager.cacheAuthorizeRequest called");const A=oA(JSON.stringify(I));if(this.setTemporaryCache(NI.REQUEST_PARAMS,A,!0),g){const l=oA(g);this.setTemporaryCache(NI.VERIFIER,l,!0)}}getCachedRequest(){this.logger.trace("BrowserCacheManager.getCachedRequest called");const I=this.getTemporaryCache(NI.REQUEST_PARAMS,!0);if(!I)throw H(rV);const g=this.getTemporaryCache(NI.VERIFIER,!0);let A,l="";try{A=JSON.parse(zI(I)),g&&(l=zI(g))}catch(d){throw this.logger.errorPii(`Attempted to parse: ${I}`),this.logger.error(`Parsing cached token request threw with error: ${d}`),H(jV)}return[A,l]}getCachedNativeRequest(){this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");const I=this.getTemporaryCache(NI.NATIVE_REQUEST,!0);if(!I)return this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found"),null;const g=this.validateAndParseJson(I);return g||(this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request"),null)}isInteractionInProgress(I){const g=this.getInteractionInProgress()?.clientId;return I?g===this.clientId:!!g}getInteractionInProgress(){const I=`${MI}.${NI.INTERACTION_STATUS_KEY}`,g=this.getTemporaryCache(I,!1);try{return g?JSON.parse(g):null}catch{return this.logger.error("Cannot parse interaction status. Removing temporary cache items and clearing url hash. Retrying interaction should fix the error"),this.removeTemporaryItem(I),this.resetRequestCache(),sG(window),null}}setInteractionInProgress(I,g=Lg.SIGNIN){const A=`${MI}.${NI.INTERACTION_STATUS_KEY}`;if(I){if(this.getInteractionInProgress())throw H(uV);this.setTemporaryCache(A,JSON.stringify({clientId:this.clientId,type:g}),!1)}else!I&&this.getInteractionInProgress()?.clientId===this.clientId&&this.removeTemporaryItem(A)}async hydrateCache(I,g){const A=vl(I.account.homeAccountId,I.account.environment,I.idToken,this.clientId,I.tenantId);let l;
20g.claims&&(l=await this.cryptoImpl.hashString(g.claims));const d=xl(I.account.homeAccountId,I.account.environment,I.accessToken,this.clientId,I.tenantId,I.scopes.join(" "),I.expiresOn?Fc(I.expiresOn):0,I.extExpiresOn?Fc(I.extExpiresOn):0,zI,void 0,I.tokenType,void 0,g.sshKid,g.claims,l),Z={idToken:A,accessToken:d};return this.saveCacheRecord(Z,I.correlationId,wg(Yg(I.idToken,zI)),$.hydrateCache)}async saveCacheRecord(I,g,A,l,d){try{await super.saveCacheRecord(I,g,A,l,d)}catch(Z){if(Z instanceof yC&&this.performanceClient&&g)try{const B=this.getTokenKeys();this.performanceClient.addFields({cacheRtCount:B.refreshToken.length,cacheIdCount:B.idToken.length,cacheAtCount:B.accessToken.length},g)}catch{}throw Z}}}function Hc(C,I,g,A){try{switch(I){case XI.LocalStorage:return new XN(C,g,A);case XI.SessionStorage:return new yN;case XI.MemoryStorage:default:break}}catch(l){g.error(l)}return new Ad}const tN=(C,I,g,A)=>{const l={cacheLocation:XI.MemoryStorage,cacheRetentionDays:5,temporaryCacheLocation:XI.MemoryStorage,storeAuthStateInCookie:!1,secureCookies:!1,cacheMigrationEnabled:!1,claimsBasedCachingEnabled:!1};return new GZ(C,l,Ul,I,g,A)};function DN(C,I,g,A,l){return C.verbose("getAllAccounts called"),g?I.getAllAccounts(l||{},A):[]}function MN(C,I,g,A){const l=g.getAccountInfoFilteredBy(C,A);return l?(I.verbose("getAccount: Account matching provided filter found, returning"),l):(I.verbose("getAccount: No matching account found, returning null"),null)}function HN(C,I,g,A){if(I.trace("getAccountByUsername called"),!C)return I.warning("getAccountByUsername: No username provided"),null;const l=g.getAccountInfoFilteredBy({username:C},A);return l?(I.verbose("getAccountByUsername: Account matching username found, returning"),I.verbosePii(`getAccountByUsername: Returning signed-in accounts matching username: ${C}`),l):(I.verbose("getAccountByUsername: No matching account found, returning null"),null)}function uN(C,I,g,A){if(I.trace("getAccountByHomeId called"),!C)return I.warning("getAccountByHomeId: No homeAccountId provided"),null;const l=g.getAccountInfoFilteredBy({homeAccountId:C},A);return l?(I.verbose("getAccountByHomeId: Account matching homeAccountId found, returning"),I.verbosePii(`getAccountByHomeId: Returning signed-in accounts matching homeAccountId: ${C}`),l):(I.verbose("getAccountByHomeId: No matching account found, returning null"),null)}function pN(C,I,g,A){if(I.trace("getAccountByLocalId called"),!C)return I.warning("getAccountByLocalId: No localAccountId provided"),null;const l=g.getAccountInfoFilteredBy({localAccountId:C},A);return l?(I.verbose("getAccountByLocalId: Account matching localAccountId found, returning"),I.verbosePii(`getAccountByLocalId: Returning signed-in accounts matching localAccountId: ${C}`),l):(I.verbose("getAccountByLocalId: No matching account found, returning null"),null)}function KN(C,I,g){I.setActiveAccount(C,g)}function kN(C,I){return C.getActiveAccount(I)}const TN="msal.broadcast.event";class zN{constructor(I){this.eventCallbacks=new Map,this.logger=I||new IC({}),typeof BroadcastChannel<"u"&&(this.broadcastChannel=new BroadcastChannel(TN)),this.invokeCrossTabCallbacks=this.invokeCrossTabCallbacks.bind(this)}addEventCallback(I,g,A){if(typeof window<"u"){const l=A||UN();return this.eventCallbacks.has(l)?(this.logger.error(`Event callback with id: ${l} is already registered. Please provide a unique id or remove the existing callback and try again.`),null):(this.eventCallbacks.set(l,[I,g||[]]),this.logger.verbose(`Event callback registered with id: ${l}`),l)}return null}removeEventCallback(I){this.eventCallbacks.delete(I),this.logger.verbose(`Event callback ${I} removed.`)}emitEvent(I,g,A,l){const d={eventType:I,interactionType:g||null,payload:A||null,error:l||null,timestamp:Date.now()};switch(I){case z.ACCOUNT_ADDED:case z.ACCOUNT_REMOVED:case z.ACTIVE_ACCOUNT_CHANGED:this.broadcastChannel?.postMessage(d);break;default:this.invokeCallbacks(d);break}}invokeCallbacks(I){this.eventCallbacks.forEach(([g,A],l)=>{(A.length===0||A.includes(I.eventType))&&(this.logger.verbose(`Emitting event to callback ${l}: ${I.eventType}`),g.apply(null,[I]))})}invokeCrossTabCallbacks(I){const g=I.data;this.invokeCallbacks(g)}
20subscribeCrossTab(){this.broadcastChannel?.addEventListener("message",this.invokeCrossTabCallbacks)}unsubscribeCrossTab(){this.broadcastChannel?.removeEventListener("message",this.invokeCrossTabCallbacks)}}class aG{constructor(I,g,A,l,d,Z,B,c,i){this.config=I,this.browserStorage=g,this.browserCrypto=A,this.networkClient=this.config.system.networkClient,this.eventHandler=d,this.navigationClient=Z,this.platformAuthProvider=c,this.correlationId=i||hg(),this.logger=l.clone(jI.MSAL_SKU,RC,this.correlationId),this.performanceClient=B}async clearCacheOnLogout(I,g){if(g)try{this.browserStorage.removeAccount(g,I),this.logger.verbose("Cleared cache items belonging to the account provided in the logout request.")}catch{this.logger.error("Account provided in logout request was not found. Local cache unchanged.")}else try{this.logger.verbose("No account provided in logout request, clearing all cache items.",this.correlationId),this.browserStorage.clear(I),await this.browserCrypto.clearKeystore()}catch{this.logger.error("Attempted to clear all MSAL cache items and failed. Local cache unchanged.")}}getRedirectUri(I){this.logger.verbose("getRedirectUri called");const g=I||this.config.auth.redirectUri;return lI.getAbsoluteUrl(g,yg())}initializeServerTelemetryManager(I,g){this.logger.verbose("initializeServerTelemetryManager called");const A={clientId:this.config.auth.clientId,correlationId:this.correlationId,apiId:I,forceRefresh:g||!1,wrapperSKU:this.browserStorage.getWrapperMetadata()[0],wrapperVer:this.browserStorage.getWrapperMetadata()[1]};return new bA(A,this.browserStorage)}async getDiscoveredAuthority(I){const{account:g}=I,A=I.requestExtraQueryParameters&&I.requestExtraQueryParameters.hasOwnProperty("instance_aware")?I.requestExtraQueryParameters.instance_aware:void 0;this.performanceClient.addQueueMeasurement(b.StandardInteractionClientGetDiscoveredAuthority,this.correlationId);const l={protocolMode:this.config.auth.protocolMode,OIDCOptions:this.config.auth.OIDCOptions,knownAuthorities:this.config.auth.knownAuthorities,cloudDiscoveryMetadata:this.config.auth.cloudDiscoveryMetadata,authorityMetadata:this.config.auth.authorityMetadata,skipAuthorityMetadataCache:this.config.auth.skipAuthorityMetadataCache},d=I.requestAuthority||this.config.auth.authority,Z=A?.length?A==="true":this.config.auth.instanceAware,B=g&&Z?this.config.auth.authority.replace(lI.getDomainFromUrl(d),g.environment):d,c=TI.generateAuthority(B,I.requestAzureCloudOptions||this.config.auth.azureCloudOptions),i=await a(VB,b.AuthorityFactoryCreateDiscoveredInstance,this.logger,this.performanceClient,this.correlationId)(c,this.config.system.networkClient,this.browserStorage,l,this.logger,this.correlationId,this.performanceClient);if(g&&!i.isAlias(g.environment))throw iI(_F);return i}}async function pB(C,I,g,A){g.addQueueMeasurement(b.InitializeBaseRequest,C.correlationId);const l=C.authority||I.auth.authority,d=[...C&&C.scopes||[]],Z={...C,correlationId:C.correlationId,authority:l,scopes:d};if(!Z.authenticationScheme)Z.authenticationScheme=BI.BEARER,A.verbose(`Authentication Scheme wasn't explicitly set in request, defaulting to "Bearer" request`);else{if(Z.authenticationScheme===BI.SSH){if(!C.sshJwk)throw iI(El);if(!C.sshKid)throw iI(xF)}A.verbose(`Authentication Scheme set to "${Z.authenticationScheme}" as configured in Auth request`)}return I.cache.claimsBasedCachingEnabled&&C.claims&&!gg.isEmptyObj(C.claims)&&(Z.requestedClaimsHash=await WG(C.claims)),Z}async function LN(C,I,g,A,l){A.addQueueMeasurement(b.InitializeSilentRequest,C.correlationId);const d=await a(pB,b.InitializeBaseRequest,l,A,C.correlationId)(C,g,A,l);return{...C,...d,account:I,forceRefresh:C.forceRefresh||!1}}function NG(C,I){let g;const A=C.httpMethod;if(I===vI.EAR){if(g=A||iC.POST,g!==iC.POST)throw iI(qF)}else g=A||iC.GET;if(C.authorizePostBodyParameters&&g!==iC.POST)throw iI($F);return g}class vC extends aG{initializeLogoutRequest(I){this.logger.verbose("initializeLogoutRequest called",I?.correlationId);const g={correlationId:this.correlationId||hg(),...I};if(I)if(I.logoutHint)this.logger.verbose("logoutHint has already been set in logoutRequest");else if(I.account){const A=this.getLogoutHintFromIdTokenClaims(I.account);A&&(this.logger.verbose("Setting logoutHint to login_hint ID Token Claim value for the account provided"),g.logoutHint=A)}else this.logger.verbose("logoutHint was not set and account was not passed into logout request, logoutHint will not be set");else this.logger.verbose("logoutHint will not be set since no logout request was configured");return!I||I.postLogoutRedirectUri!==null?I&&I.postLogoutRedirectUri?(this.logger.verbose("Setting postLogoutRedirectUri to uri set on logout request",g.correlationId),g.postLogoutRedirectUri=lI.getAbsoluteUrl(I.postLogoutRedirectUri,yg())):this.config.auth.postLogoutRedirectUri===null?this.logger.verbose("postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect",g.correlationId):this.config.auth.postLogoutRedirectUri?(this.logger.verbose("Setting postLogoutRedirectUri to configured uri",g.correlationId),g.postLogoutRedirectUri=lI.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri,yg())):(this.logger.verbose("Setting postLogoutRedirectUri to current page",g.correlationId),g.postLogoutRedirectUri=lI.getAbsoluteUrl(yg(),yg())):this.logger.verbose("postLogoutRedirectUri passed as null, not setting post logout redirect uri",g.correlationId),g}getLogoutHintFromIdTokenClaims(I){const g=I.idTokenClaims;if(g){if(g.login_hint)return g.login_hint;this.logger.verbose("The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request")}else this.logger.verbose("The provided account does not contain ID Token Claims, logoutHint will not be added to logout request");return null}async createAuthCodeClient(I){this.performanceClient.addQueueMeasurement(b.StandardInteractionClientCreateAuthCodeClient,this.correlationId);const g=await a(this.getClientConfiguration.bind(this),b.StandardInteractionClientGetClientConfiguration,this.logger,this.performanceClient,this.correlationId)(I);return new eV(g,this.performanceClient)}async getClientConfiguration(I){const{serverTelemetryManager:g,requestAuthority:A,requestAzureCloudOptions:l,requestExtraQueryParameters:d,account:Z}=I;this.performanceClient.addQueueMeasurement(b.StandardInteractionClientGetClientConfiguration,this.correlationId);const B=I.authority||await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,this.correlationId)({requestAuthority:A,requestAzureCloudOptions:l,requestExtraQueryParameters:d,account:Z}),c=this.config.system.loggerOptions;return{authOptions:{clientId:this.config.auth.clientId,authority:B,clientCapabilities:this.config.auth.clientCapabilities,redirectUri:this.config.auth.redirectUri},systemOptions:{tokenRenewalOffsetSeconds:this.config.system.tokenRenewalOffsetSeconds,preventCorsPreflight:!0},loggerOptions:{loggerCallback:c.loggerCallback,piiLoggingEnabled:c.piiLoggingEnabled,logLevel:c.logLevel,correlationId:this.correlationId},cacheOptions:{claimsBasedCachingEnabled:this.config.cache.claimsBasedCachingEnabled},cryptoInterface:this.browserCrypto,networkInterface:this.networkClient,storageInterface:this.browserStorage,serverTelemetryManager:g,libraryInfo:{sku:jI.MSAL_SKU,version:RC,cpu:Y.EMPTY_STRING,os:Y.EMPTY_STRING},telemetry:this.config.telemetry}}async initializeAuthorizationRequest(I,g){this.performanceClient.addQueueMeasurement(b.StandardInteractionClientInitializeAuthorizationRequest,this.correlationId);const A=this.getRedirectUri(I.redirectUri);new URL(A).origin!==new URL(window.location.href).origin&&(this.logger.warning("The origin of the redirect URI does not match the origin of the current page. This is likely to cause issues with authentication.",this.correlationId),this.performanceClient.addFields({isRedirectUriCrossOrigin:!0},this.correlationId));const l={interactionType:g},d=jC.setRequestState(this.browserCrypto,I&&I.state||Y.EMPTY_STRING,l),B={...await a(pB,b.InitializeBaseRequest,this.logger,this.performanceClient,this.correlationId)({...I,correlationId:this.correlationId},this.config,this.performanceClient,this.logger),redirectUri:A,state:d,nonce:I.nonce||hg(),responseMode:this.config.auth.OIDCOptions.serverResponseType},c={...B,httpMethod:NG(B,this.config.auth.protocolMode)};if(I.loginHint||I.sid)return c;const i=I.account||this.browserStorage.getActiveAccount(this.correlationId);return i&&(this.logger.verbose("Setting validated request account",this.correlationId),this.logger.verbosePii(`Setting validated request account: ${i.homeAccountId}`,this.correlationId),c.account=i),c}}function EN(C,I){if(!I)return null;try{return jC.parseRequestState(C,I).libraryState.meta}catch{throw e(TC)}}function HC(C,I,g){const A=ml(C);if(!A)throw CV(C)?(g.error(`A ${I} is present in the iframe but it does not contain known properties. It's likely that the ${I} has been replaced by code running on the redirectUri page.`),g.errorPii(`The ${I} detected is: ${C}`),H(DV)):(g.error(`The request has returned to the redirectUri but a ${I} is not present. It's likely that the ${I} has been removed or the page has been redirected by code running on the redirectUri page.`),H(tV));return A}function rN(C,I,g){if(!C.state)throw H(aB);const A=EN(I,C.state);if(!A)throw H(MV);if(A.interactionType!==g)throw H(HV)}
20class YG{constructor(I,g,A,l,d){this.authModule=I,this.browserStorage=g,this.authCodeRequest=A,this.logger=l,this.performanceClient=d}async handleCodeResponse(I,g,A){this.performanceClient.addQueueMeasurement(b.HandleCodeResponse,g.correlationId);let l;try{l=Ha(I,g.state)}catch(d){throw d instanceof oC&&d.subError===UA?H(UA):d}return a(this.handleCodeResponseFromServer.bind(this),b.HandleCodeResponseFromServer,this.logger,this.performanceClient,g.correlationId)(l,g,A)}async handleCodeResponseFromServer(I,g,A,l=!0){if(this.performanceClient.addQueueMeasurement(b.HandleCodeResponseFromServer,g.correlationId),this.logger.trace("InteractionHandler.handleCodeResponseFromServer called"),this.authCodeRequest.code=I.code,I.cloud_instance_host_name&&await a(this.authModule.updateAuthority.bind(this.authModule),b.UpdateTokenEndpointAuthority,this.logger,this.performanceClient,g.correlationId)(I.cloud_instance_host_name,g.correlationId),l&&(I.nonce=g.nonce||void 0),I.state=g.state,I.client_info)this.authCodeRequest.clientInfo=I.client_info;else{const Z=this.createCcsCredentials(g);Z&&(this.authCodeRequest.ccsCredential=Z)}return await a(this.authModule.acquireToken.bind(this.authModule),b.AuthClientAcquireToken,this.logger,this.performanceClient,g.correlationId)(this.authCodeRequest,A,I)}createCcsCredentials(I){return I.account?{credential:I.account.homeAccountId,type:Wg.HOME_ACCOUNT_ID}:I.loginHint?{credential:I.loginHint,type:Wg.UPN}:null}}const jN="ContentError",ON="PageException",wG="user_switch";const vN="USER_INTERACTION_REQUIRED",xN="USER_CANCEL",PN="NO_NETWORK",fN="DISABLED",_N="ACCOUNT_UNAVAILABLE",qN="UX_NOT_ALLOWED";const $N=-2147186943,IY={[wG]:"User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again."};class Ng extends FI{constructor(I,g,A){super(I,g),Object.setPrototypeOf(this,Ng.prototype),this.name="NativeAuthError",this.ext=A}}function eC(C){if(C.ext&&C.ext.status&&C.ext.status===fN||C.ext&&C.ext.error&&C.ext.error===$N)return!0;switch(C.errorCode){case jN:case ON:return!0;default:return!1}}function Xl(C,I,g){if(g&&g.status)switch(g.status){case _N:return hl(NV);case vN:return new bg(C,I);case xN:return H(UA);case PN:return H(el);case qN:return hl(RB)}return new Ng(C,IY[C]||I,g)}class hG extends vC{async acquireToken(I){this.performanceClient.addQueueMeasurement(b.SilentCacheClientAcquireToken,I.correlationId);const g=this.initializeServerTelemetryManager($.acquireTokenSilent_silentFlow),A=await a(this.getClientConfiguration.bind(this),b.StandardInteractionClientGetClientConfiguration,this.logger,this.performanceClient,this.correlationId)({serverTelemetryManager:g,requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,account:I.account}),l=new ta(A,this.performanceClient);this.logger.verbose("Silent auth client created");try{const Z=(await a(l.acquireCachedToken.bind(l),b.SilentFlowClientAcquireCachedToken,this.logger,this.performanceClient,I.correlationId)(I))[0];return this.performanceClient.addFields({fromCache:!0},I.correlationId),Z}catch(d){throw d instanceof hA&&d.errorCode===NB&&this.logger.verbose("Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair."),d}}logout(I){this.logger.verbose("logoutRedirect called");const g=this.initializeLogoutRequest(I);return this.clearCacheOnLogout(g.correlationId,g?.account)}}class Bl extends aG{constructor(I,g,A,l,d,Z,B,c,i,F,V,W){super(I,g,A,l,d,Z,c,i,W),this.apiId=B,this.accountId=F,this.platformAuthProvider=i,this.nativeStorageManager=V,this.silentCacheClient=new hG(I,this.nativeStorageManager,A,l,d,Z,c,i,W);const G=this.platformAuthProvider.getExtensionName();this.skus=bA.makeExtraSkuString({libraryName:jI.MSAL_SKU,libraryVersion:RC,extensionName:G,extensionVersion:this.platformAuthProvider.getExtensionVersion()})}addRequestSKUs(I){I.extraParameters={...I.extraParameters,[vQ]:this.skus}}async acquireToken(I,g){this.performanceClient.addQueueMeasurement(b.NativeInteractionClientAcquireToken,this.correlationId),this.logger.trace("NativeInteractionClient - acquireToken called.");const A=this.performanceClient.startMeasurement(b.NativeInteractionClientAcquireToken,this.correlationId),l=LI(),d=this.initializeServerTelemetryManager(this.apiId);try{const Z=await this.initializeNativeRequest(I);
20try{const c=await this.acquireTokensFromCache(this.accountId,Z);return A.end({success:!0,isNativeBroker:!1,fromCache:!0}),c}catch(c){if(g===pI.AccessToken)throw this.logger.info("MSAL internal Cache does not contain tokens, return error as per cache policy"),A.end({success:!1,brokerErrorCode:"cache_request_failed"}),c;this.logger.info("MSAL internal Cache does not contain tokens, proceed to make a native call")}const B=await this.platformAuthProvider.sendMessage(Z);return await this.handleNativeResponse(B,Z,l).then(c=>(A.end({success:!0,isNativeBroker:!0,requestId:c.requestId}),d.clearNativeBrokerErrorCode(),c)).catch(c=>{throw A.end({success:!1,errorCode:c.errorCode,subErrorCode:c.subError}),c})}catch(Z){throw Z instanceof Ng&&d.setNativeBrokerErrorCode(Z.errorCode),A.end({success:!1}),Z}}createSilentCacheRequest(I,g){return{authority:I.authority,correlationId:this.correlationId,scopes:hI.fromString(I.scope).asArray(),account:g,forceRefresh:!1}}async acquireTokensFromCache(I,g){if(!I)throw this.logger.warning("NativeInteractionClient:acquireTokensFromCache - No nativeAccountId provided"),e(CZ);const A=this.browserStorage.getBaseAccountInfo({nativeAccountId:I},this.correlationId);if(!A)throw e(CZ);try{const l=this.createSilentCacheRequest(g,A),d=await this.silentCacheClient.acquireToken(l),Z={...A,idTokenClaims:d?.idTokenClaims,idToken:d?.idToken};return{...d,account:Z}}catch(l){throw l}}async acquireTokenRedirect(I,g){this.logger.trace("NativeInteractionClient - acquireTokenRedirect called.");const{...A}=I;delete A.onRedirectNavigate;const l=await this.initializeNativeRequest(A);try{await this.platformAuthProvider.sendMessage(l)}catch(B){if(B instanceof Ng&&(this.initializeServerTelemetryManager(this.apiId).setNativeBrokerErrorCode(B.errorCode),eC(B)))throw B}this.browserStorage.setTemporaryCache(NI.NATIVE_REQUEST,JSON.stringify(l),!0);const d={apiId:$.acquireTokenRedirect,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},Z=this.config.auth.navigateToLoginRequestUrl?window.location.href:this.getRedirectUri(I.redirectUri);g.end({success:!0}),await this.navigationClient.navigateExternal(Z,d)}async handleRedirectPromise(I,g){if(this.logger.trace("NativeInteractionClient - handleRedirectPromise called."),!this.browserStorage.isInteractionInProgress(!0))return this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null."),null;const A=this.browserStorage.getCachedNativeRequest();if(!A)return this.logger.verbose("NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null."),I&&g&&I?.addFields({errorCode:"no_cached_request"},g),null;const{prompt:l,...d}=A;l&&this.logger.verbose("NativeInteractionClient - handleRedirectPromise called and prompt was included in the original request, removing prompt from cached request to prevent second interaction with native broker window."),this.browserStorage.removeItem(this.browserStorage.generateCacheKey(NI.NATIVE_REQUEST));const Z=LI();try{this.logger.verbose("NativeInteractionClient - handleRedirectPromise sending message to native broker.");const B=await this.platformAuthProvider.sendMessage(d),c=await this.handleNativeResponse(B,d,Z);return this.initializeServerTelemetryManager(this.apiId).clearNativeBrokerErrorCode(),I&&this.correlationId&&this.performanceClient.addFields({isNativeBroker:!0},this.correlationId),c}catch(B){throw B}}logout(){return this.logger.trace("NativeInteractionClient - logout called."),Promise.reject("Logout not implemented yet")}async handleNativeResponse(I,g,A){this.logger.trace("NativeInteractionClient - handleNativeResponse called.");const l=Yg(I.id_token,zI),d=this.createHomeAccountIdentifier(I,l),Z=this.browserStorage.getAccountInfoFilteredBy({nativeAccountId:g.accountId},this.correlationId)?.homeAccountId;if(g.extraParameters?.child_client_id&&I.account.id!==g.accountId)this.logger.info("handleNativeServerResponse: Double broker flow detected, ignoring accountId mismatch");else if(d!==Z&&I.account.id!==g.accountId)throw Xl(wG);const B=await this.getDiscoveredAuthority({requestAuthority:g.authority}),c=sB(this.browserStorage,B,d,zI,this.correlationId,l,I.client_info,void 0,l.t
20id,void 0,I.account.id,this.logger);I.expires_in=Number(I.expires_in);const i=await this.generateAuthenticationResult(I,g,l,c,B.canonicalAuthority,A);return await this.cacheAccount(c,this.correlationId,wg(l)),await this.cacheNativeTokens(I,g,d,l,I.access_token,i.tenantId,A),i}createHomeAccountIdentifier(I,g){return mI.generateHomeAccountId(I.client_info||Y.EMPTY_STRING,Gg.Default,this.logger,this.browserCrypto,g)}generateScopes(I,g){return g?hI.fromString(g):hI.fromString(I)}async generatePopAccessToken(I,g){if(g.tokenType===BI.POP&&g.signPopToken){if(I.shr)return this.logger.trace("handleNativeServerResponse: SHR is enabled in native layer"),I.shr;const A=new zC(this.browserCrypto),l={resourceRequestMethod:g.resourceRequestMethod,resourceRequestUri:g.resourceRequestUri,shrClaims:g.shrClaims,shrNonce:g.shrNonce};if(!g.keyId)throw e(EZ);return A.signPopToken(I.access_token,g.keyId,l)}else return I.access_token}async generateAuthenticationResult(I,g,A,l,d,Z){const B=this.addTelemetryFromNativeResponse(I.properties.MATS),c=this.generateScopes(g.scope,I.scope),i=I.account.properties||{},F=i.UID||A.oid||A.sub||Y.EMPTY_STRING,V=i.TenantId||A.tid||Y.EMPTY_STRING,W=_Z(mI.getAccountInfo(l),void 0,A,I.id_token);W.nativeAccountId!==I.account.id&&(W.nativeAccountId=I.account.id);const G=await this.generatePopAccessToken(I,g),R=g.tokenType===BI.POP?BI.POP:BI.BEARER;return{authority:d,uniqueId:F,tenantId:V,scopes:c.asArray(),account:W,idToken:I.id_token,idTokenClaims:A,accessToken:G,fromCache:B?this.isResponseFromCache(B):!1,expiresOn:tC(Z+I.expires_in),tokenType:R,correlationId:this.correlationId,state:I.state,fromNativeBroker:!0}}async cacheAccount(I,g,A){await this.browserStorage.setAccount(I,this.correlationId,A,this.apiId),this.browserStorage.removeAccountContext(mI.getAccountInfo(I),g)}cacheNativeTokens(I,g,A,l,d,Z,B){const c=vl(A,g.authority,I.id_token||"",g.clientId,l.tid||""),i=g.tokenType===BI.POP?Y.SHR_NONCE_VALIDITY:(typeof I.expires_in=="str
20ing"?parseInt(I.expires_in,10):I.expires_in)||0,F=B+i,V=this.generateScopes(I.scope,g.scope),W=xl(A,g.authority,d,g.clientId,l.tid||Z,V.printScopes(),F,0,zI,void 0,g.tokenType,void 0,g.keyId),G={idToken:c,accessToken:W};return this.nativeStorageManager.saveCacheRecord(G,this.correlationId,wg(l),this.apiId,g.storeInCache)}getExpiresInValue(I,g){return I===BI.POP?Y.SHR_NONCE_VALIDITY:(typeof g=="string"?parseInt(g,10):g)||0}addTelemetryFromNativeResponse(I){const g=this.getMATSFromResponse(I);return g?(this.performanceClient.addFields({extensionId:this.platformAuthProvider.getExtensionId(),extensionVersion:this.platformAuthProvider.getExtensionVersion(),matsBrokerVersion:g.broker_version,matsAccountJoinOnStart:g.account_join_on_start,matsAccountJoinOnEnd:g.account_join_on_end,matsDeviceJoin:g.device_join,matsPromptBehavior:g.prompt_behavior,matsApiErrorCode:g.api_error_code,matsUiVisible:g.ui_visible,matsSilentCode:g.silent_code,matsSilentBiSubCode:g.silent_bi_sub_code,matsSilentMessage:g.silent_message,matsSilentStatus:g.silent_status,matsHttpStatus:g.http_status,matsHttpEventCount:g.http_event_count},this.correlationId),g):null}getMATSFromResponse(I){if(I)try{return JSON.parse(I)}catch{this.logger.error("NativeInteractionClient - Error parsing MATS telemetry, returning null instead")}return null}isResponseFromCache(I){return typeof I.is_cached>"u"?(this.logger.verbose("NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false."),!1):!!I.is_cached}async initializeNativeRequest(I){this.logger.trace("NativeInteractionClient - initializeNativeRequest called");const g=await this.getCanonicalAuthority(I),{scopes:A,claims:l,...d}=I,Z=new hI(A||[]);Z.appendScopes(rC);const B=I.skipBrokerClaims&&I.embeddedClientId?void 0:this.config.auth.clientCapabilities,c=B&&B.length?UV(l,B):l,i={...d,claims:c,accountId:this.accountId,clientId:this.config.auth.clientId,authority:g.urlString,scope:Z.printScopes(),redirectUri:this.getRedirectUri(I.redirectUri),prompt:this.getPrompt(I.prompt),correlationId:this.correlationId,tokenType:I.authenticationScheme,windowTitleSubstring:document.title,extraParameters:{...I.extraQueryParameters,...I.tokenQueryParameters},extendedExpiryToken:!1,keyId:I.popKid};if(i.signPopToken&&I.popKid)throw H(AG);if(this.handleExtraBrokerParams(i),i.extraParameters=i.extraParameters||{},i.extraParameters.telemetry=Zg.MATS_TELEMETRY,I.authenticationScheme===BI.POP){const F={resourceRequestUri:I.resourceRequestUri,resourceRequestMethod:I.resourceRequestMethod,shrClaims:I.shrClaims,shrNonce:I.shrNonce},V=new zC(this.browserCrypto);let W;if(i.keyId)W=this.browserCrypto.base64UrlEncode(JSON.stringify({kid:i.keyId})),i.signPopToken=!1;else{const G=await a(V.generateCnf.bind(V),b.PopTokenGenerateCnf,this.logger,this.performanceClient,this.correlationId)(F,this.logger);W=G.reqCnfString,i.keyId=G.kid,i.signPopToken=!0}i.reqCnf=W}return this.addRequestSKUs(i),i}async getCanonicalAuthority(I){const g=I.authority||this.config.auth.authority;I.account&&await this.getDiscoveredAuthority({requestAuthority:g,requestAzureCloudOptions:I.azureCloudOptions,account:I.account});const A=new lI(g);return A.validateAsUri(),A}getPrompt(I){switch(this.apiId){case $.ssoSilent:case $.acquireTokenSilent_silentFlow:return this.logger.trace("initializeNativeRequest: silent request sets prompt to none"),SI.NONE}if(!I){this.logger.trace("initializeNativeRequest: prompt was not provided");return}switch(I){case SI.NONE:case SI.CONSENT:case SI.LOGIN:case SI.SELECT_ACCOUNT:return this.logger.trace("initializeNativeRequest: prompt is compatible with native flow"),I;default:throw this.logger.trace(`initializeNativeRequest: prompt = ${I} is not compatible with native flow`),H(gG)}}handleExtraBrokerParams(I){const g=I.extraParameters&&I.extraParameters.hasOwnProperty(GC)&&I.extraParameters.hasOwnProperty(al)&&I.extraParameters.hasOwnProperty(VC);if(!I.embeddedClientId&&!g)return;let A="";const l=I.redirectUri;I.embeddedClientId?(I.redirectUri=this.config.auth.redirectUri,A=I.embeddedClientId):I.extraParameters&&(I.redirectUri=I.extraParameters[al],A=I.extraParameters[VC
20]),I.extraParameters={child_client_id:A,child_redirect_uri:l},this.performanceClient?.addFields({embeddedClientId:A,embeddedRedirectUri:l},this.correlationId)}}const gY=new Map([["e","AAD"],["m","MSA"]]);function CY(C){if(!C)return null;try{const g=decodeURIComponent(C).split("|");return g.length<5?null:{accountType:gY.get(g[0]?.trim()||"")||"",error:g[1]?.trim()||"",subError:g[2]?.trim()||"",cloudInstance:g[3]?.trim()||"",callerDataBoundary:g[4]?.trim()||""}}catch{return null}}function eG(C,I,g){const A=CY(C.clientdata);A?.accountType&&g.addFields({accountType:A.accountType},I),A?.error&&g.addFields({serverErrorNo:A.error},I),A?.subError&&g.addFields({serverSubErrorNo:A.subError},I)}async function KB(C,I,g,A,l){const d=Ma({...C.auth,authority:I},g,A,l);if(ZB(d,{sku:jI.MSAL_SKU,version:RC,os:"",cpu:""}),C.auth.protocolMode!==vI.OIDC&&BB(d,C.telemetry.application),g.platformBroker&&(qQ(d),l.addFields({isPlatformAuthorizeRequest:!0},g.correlationId),g.authenticationScheme===BI.POP)){const Z=new Dg(A,l),B=new zC(Z);let c;g.popKid?c=Z.encodeKid(g.popKid):c=(await a(B.generateCnf.bind(B),b.PopTokenGenerateCnf,A,l,g.correlationId)(g,A)).reqCnfString,FB(d,c)}return rl(d,g.correlationId,l),d}async function yl(C,I,g,A,l){if(!g.codeChallenge)throw iI(xZ);const d=await a(KB,b.GetStandardParams,A,l,g.correlationId)(C,I,g,A,l);return gB(d,uZ.CODE),cB(d,g.codeChallenge,Y.S256_CODE_CHALLENGE_METHOD),Pg(d,g.extraQueryParameters||{}),bB(I,d,C.auth.encodeExtraQueryParams,g.extraQueryParameters)}async function kB(C,I,g,A,l,d){if(!A.earJwk)throw H(QB);const Z=await KB(I,g,A,l,d);gB(Z,uZ.IDTOKEN_TOKEN_REFRESHTOKEN),ia(Z,A.earJwk),cB(Z,A.codeChallenge,Y.S256_CODE_CHALLENGE_METHOD);const B=new Map;Pg(B,A.extraQueryParameters||{}),wA(B,A.correlationId);const c=bB(g,B,I.auth.encodeExtraQueryParams,A.extraQueryParameters);return JG(C,c,Z)}async function TB(C,I,g,A,l,d){const Z=await KB(I,g,A,l,d);gB(Z,uZ.CODE),cB(Z,A.codeChallenge,A.codeChallengeMethod||Y.S256_CODE_CHALLENGE_METHOD),Fa(Z,A.authorizePostBodyParameters||{});const B=new Map;Pg(B,A.extraQueryParameters||{}),wA(B,A.correlationId);const c=bB(g,B,I.auth.encodeExtraQueryParams,A.extraQueryParameters);return JG(C,c,Z)}function JG(C,I,g){const A=C.createElement("form");return A.method="post",A.action=I,g.forEach((l,d)=>{const Z=C.createElement("input");Z.hidden=!0,Z.name=d,Z.value=l,A.appendChild(Z)}),C.body.appendChild(A),A}async function SG(C,I,g,A,l,d,Z,B,c,i){if(B.verbose("Account id found, calling WAM for token"),!i)throw H(wB);const F=new Dg(B,c),V=new Bl(A,l,F,B,Z,A.system.navigationClient,g,c,i,I,d,C.correlationId),{userRequestState:W}=jC.parseRequestState(F,C.state);return a(V.acquireToken.bind(V),b.NativeInteractionClientAcquireToken,B,c,C.correlationId)({...C,state:W,prompt:void 0})}async function uC(C,I,g,A,l,d,Z,B,c,i,F,V){if(ag.removeThrottle(Z,l.auth.clientId,C),eG(I,C.correlationId,F),I.accountId)return a(SG,b.HandleResponsePlatformBroker,i,F,C.correlationId)(C,I.accountId,A,l,Z,B,c,i,F,V);const W={...C,code:I.code||"",codeVerifier:g},G=new YG(d,Z,W,i,F);return await a(G.handleCodeResponse.bind(G),b.HandleCodeResponse,i,F,C.correlationId)(I,C,A)}async function zB(C,I,g,A,l,d,Z,B,c,i,F){if(ag.removeThrottle(d,A.auth.clientId,C),eG(I,C.correlationId,i),UB(I,C.state),!I.ear_jwe)throw H(yV);if(!C.earJwk)throw H(QB);const V=JSON.parse(await a(iN,b.DecryptEarResponse,c,i,C.correlationId)(C.earJwk,I.ear_jwe));if(V.accountId)return a(SG,b.HandleResponsePlatformBroker,c,i,C.correlationId)(C,V.accountId,g,A,d,Z,B,c,i,F);const W=new WC(A.auth.clientId,d,new Dg(c,i),c,null,null,i);W.validateTokenResponse(V);const G={code:"",state:C.state,nonce:C.nonce,client_info:V.client_info,cloud_graph_host_name:V.cloud_graph_host_name,cloud_instance_host_name:V.cloud_instance_host_name,cloud_instance_name:V.cloud_instance_name,msgraph_host:V.msgraph_host};return await a(W.handleServerTokenResponse.bind(W),b.HandleServerTokenResponse,c,i,C.correlationId)(V,l,LI(),C,g,G,void 0,void 0,void 0,void 0)}const AY=32;async function _g(C,I,g){C.addQueueMeasurement(b.GeneratePkceCodes,g);const A=xI(lY,b.GenerateCodeVerifier,I,C,g)(C,I,g),l=await a(dY,b.GenerateCodeChallengeFromVerifier,I,C,g)(A,C,I,g);return{verifier:A,challenge:l}}function lY(C,I,g){try{const A=new Uint8Array(AY);return xI(lN,b.GetRandomValues,I,C,g)(A),gC(A)}catch{throw H(nB)}}async function dY(C,I,g,A){I.addQueueMeasurement(b.GenerateCodeChallengeFromVerifier,A);try{const l=await a(FG,b.Sha256Digest,g,I,A)(C,I,A);return gC(new Uint8Array(l))}catch{throw H(nB)}}class tl{constructor(I,g,A,l){this.logger=I,this.handshakeTimeoutMs=g,this.extensionId=l,this.resolvers=new Map,this.handshakeResolvers=new Map,this.messageChannel=new MessageChannel,this.windowListener=this.onWindowMessage.bind(this),this.performanceClient=A,this.handshakeEvent=A.startMeasurement(b.NativeMessageHandlerHandshake),this.platformAuthType=Zg.PLATFORM_EXTENSION_PROVIDER}async sendMessage(I){this.logger.trace(this.platformAuthType+" - sendMessage called.");const g={method:$C.GetToken,request:I},A={channel:Zg.CHANNEL_ID,extensionId:this.extensionId,responseId:hg(),body:g};this.logger.trace(this.platformAuthType+" - Sending request to browser extension"),this.logger.tracePii(this.platformAuthType+` - Sending request to browser extension: ${JSON.stringify(A)}`),this.messageChannel.port1.postMessage(A);const l=await new Promise((Z,B)=>{this.resolvers.set(A.responseId,{resolve:Z,reject:B})});return this.validatePlatformBrokerResponse(l)}static async createProvider(I,g,A){I.trace("PlatformAuthExtensionH
20andler - createProvider called.");try{const l=new tl(I,g,A,Zg.PREFERRED_EXTENSION_ID);return await l.sendHandshakeRequest(),l}catch{const d=new tl(I,g,A);return await d.sendHandshakeRequest(),d}}async sendHandshakeRequest(){this.logger.trace(this.platformAuthType+" - sendHandshakeRequest called."),window.addEventListener("message",this.windowListener,!1);const I={channel:Zg.CHANNEL_ID,extensionId:this.extensionId,responseId:hg(),body:{method:$C.HandshakeRequest}};return this.handshakeEvent.add({extensionId:this.extensionId,extensionHandshakeTimeoutMs:this.handshakeTimeoutMs}),this.messageChannel.port1.onmessage=g=>{this.onChannelMessage(g)},window.postMessage(I,window.origin,[this.messageChannel.port2]),new Promise((g,A)=>{this.handshakeResolvers.set(I.responseId,{resolve:g,reject:A}),this.timeoutId=window.setTimeout(()=>{window.removeEventListener("message",this.windowListener,!1),this.messageChannel.port1.close(),this.messageChannel.port2.close(),this.handshakeEvent.end({extensionHandshakeTimedOut:!0,success:!1}),A(H($V)),this.handshakeResolvers.delete(I.responseId)},this.handshakeTimeoutMs)})}onWindowMessage(I){if(this.logger.trace(this.platformAuthType+" - onWindowMessage called"),I.source!==window)return;const g=I.data;if(!(!g.channel||g.channel!==Zg.CHANNEL_ID)&&!(g.extensionId&&g.extensionId!==this.extensionId)&&g.body.method===$C.HandshakeRequest){const A=this.handshakeResolvers.get(g.responseId);if(!A){this.logger.trace(this.platformAuthType+`.onWindowMessage - resolver can't be found for request ${g.responseId}`);return}this.logger.verbose(g.extensionId?`Extension with id: ${g.extensionId} not installed`:"No extension installed"),clearTimeout(this.timeoutId),this.messageChannel.port1.close(),this.messageChannel.port2.close(),window.removeEventListener("message",this.windowListener,!1),this.handshakeEvent.end({success:!1,extensionInstalled:!1}),A.reject(H(IG))}}onChannelMessage(I){this.logger.trace(this.platformAuthType+" - onChannelMessage called.");const g=I.data,A=this.resolvers.get(g.responseId),l=this.handshakeResolvers.get(g.responseId);try{const d=g.body.method;if(d===$C.Response){if(!A)return;const Z=g.body.response;if(this.logger.trace(this.platformAuthType+" - Received response from browser extension"),this.logger.tracePii(this.platformAuthType+` - Received response from browser extension: ${JSON.stringify(Z)}`),Z.status!=="Success")A.reject(Xl(Z.code,Z.description,Z.ext));else if(Z.result)Z.result.code&&Z.result.description?A.reject(Xl(Z.result.code,Z.result.description,Z.result.ext)):A.resolve(Z.result);else throw $d(bl,"Event does not contain result.");this.resolvers.delete(g.responseId)}else if(d===$C.HandshakeResponse){if(!l){this.logger.trace(this.platformAuthType+`.onChannelMessage - resolver can't be found for request ${g.responseId}`);return}clearTimeout(this.timeoutId),window.removeEventListener("message",this.windowListener,!1),this.extensionId=g.extensionId,this.extensionVersion=g.body.version,this.logger.verbose(this.platformAuthType+` - Received HandshakeResponse from extension: ${this.extensionId}`),this.handshakeEvent.end({extensionInstalled:!0,success:!0}),l.resolve(),this.handshakeResolvers.delete(g.responseId)}}catch(d){this.logger.error("Error parsing response from WAM Extension"),this.logger.errorPii(`Error parsing response from WAM Extension: ${d}`),this.logger.errorPii(`Unable to parse ${I}`),A?A.reject(d):l&&l.reject(d)}}validatePlatformBrokerResponse(I){if(I.hasOwnProperty("access_token")&&I.hasOwnProperty("id_token")&&I.hasOwnProperty("client_info")&&I.hasOwnProperty("account")&&I.hasOwnProperty("scope")&&I.hasOwnProperty("expires_in"))return I;throw $d(bl,"Response missing expected properties.")}getExtensionId(){return this.extensionId}getExtensionVersion(){return this.extensionVersion}getExtensionName(){return this.getExtensionId()===Zg.PREFERRED_EXTENSION_ID?"chrome":this.getExtensionId()?.length?"unknown":void 0}}class LB{constructor(I,g,A){this.logger=I,this.performanceClient=g,this.correlationId=A,this.platformAuthType=Zg.PLATFORM_DOM_PROVIDER}static async createProvider(I,g,A){if(I.trace("PlatformAuthDOMHandler: createProvider called"),window.navigator?.platformAuthentication&&(await window.navigator.platformAuthentication.getSupportedContracts(Zg.MICROSOFT_ENTRA_BROKERID))?.includes(Zg.PLATFORM_DOM_APIS))return I.trace("Platform auth api available in DOM"),new LB(I,g,A)}getExtensionId(){return Zg.MICROSOFT_ENTRA_BROKERID}getExtensionVersion(){return""}getExtensionName(){return Zg.DOM_API_NAME}async sendMessage(I){this.logger.trace(this.platformAuthType+" - Sending request to browser DOM API");try{const g=this.initializePlatformDOMRequest(I),A=await window.navigator.platformAuthentication.executeGetToken(g);return this.validatePlatformBrokerResponse(A)}catch(g){throw this.logger.error(this.platformAuthType+" - executeGetToken DOM API error"),g}}initializePlatformDOMRequest(I){this.logger.trace(this.platformAuthType+" - initializeNativeDOMRequest called");const{accountId:g,clientId:A,authority:l,scope:d,redirectUri:Z,correlationId:B,state:c,storeInCache:i,embeddedClientId:F,extraParameters:V,...W}=I,G=this.getDOMExtraParams(W);return{accountId:g,brokerId:this.getExtensionId(),authority:l,clientId:A,correlationId:B||this.correlationId,extraParameters:{...V,...G},isSecurityTokenService:!1,redirectUri:Z,scope:d,state:c,storeInCache:i,embeddedClientId:F}}validatePlatformBrokerResponse(I){if(I.hasOwnProperty("isSuccess")){if(I.hasOwnProperty("accessToken")&&I.hasOwnProperty("idToken")&&I.hasOwnProperty("clientInfo")&&I.hasOwnProperty("account")&&I.hasOwnProperty("scopes")&&I.hasOwnProperty("expiresIn"))return this.logger.trace(this.platformAuthType+" - platform broker returned successful and valid response"),this.convertToPlatformBrokerResponse(I);if(I.hasOwnProperty("error")){const g=I;if(g.isSuccess===!1&&g.error&&g.error.code)throw this.logger.trace(this.platformAuthType+" - platform broker returned error response"),Xl(g.error.code,g.error.description,{error:parseInt(g.error.errorCode),protocol_error:g.error.protocolError,status:g.error.status,properties:g.error.properties})}}throw $d(bl,"Response missing expected properties.")}convertToPlatformBrokerResponse(I){return this.logger.trace(this.platformAuthType+" - convertToNativeResponse called"),{access_token:I.accessToken,id_token:I.idToken,client_info:I.clientInfo,account:I.account,expires_in:I.expiresIn,scope:I.scopes,state:I.state||"",properties:I.properties||{},extendedLifetimeToken:I.extendedLifetimeToken??!1,shr:I.proofOfPosse
20ssionPayload}}getDOMExtraParams(I){try{const g={};for(const[A,l]of Object.entries(I))l&&(typeof l=="object"?g[A]=JSON.stringify(l):g[A]=String(l));return g}catch(g){return this.logger.error(this.platformAuthType+" - Error stringifying extra parameters"),this.logger.errorPii(this.platformAuthType+" - Error stringifying extra parameters: "+g),{}}}}async function ZY(C,I,g,A,l){C.trace("getPlatformAuthProvider called",g),C.trace("Has client allowed platform auth via DOM API: "+l);let d;try{l&&(d=await LB.createProvider(C,I,g)),d||(C.trace("Platform auth via DOM API not available, checking for extension"),d=await tl.createProvider(C,A||mG,I))}catch(Z){C.trace("Platform auth not available",Z)}return d}function mA(C,I,g,A){if(I.trace("isPlatformAuthAllowed called"),!C.system.allowPlatformBroker&&C.system.allowPlatformBrokerWithDOM)throw iI(IV);if(!C.system.allowPlatformBroker)return I.trace("isPlatformAuthAllowed: allowPlatformBroker is not enabled, returning false"),!1;if(!g)return I.trace("isPlatformAuthAllowed: Platform auth provider is not initialized, returning false"),!1;if(A)switch(A){case BI.BEARER:case BI.POP:return I.trace("isPlatformAuthAllowed: authenticationScheme is supported, returning true"),!0;default:return I.trace("isPlatformAuthAllowed: authenticationScheme is not supported, returning false"),!1}return!0}class BY extends vC{constructor(I,g,A,l,d,Z,B,c,i,F){super(I,g,A,l,d,Z,B,i,F),this.unloadWindow=this.unloadWindow.bind(this),this.nativeStorage=c,this.eventHandler=d}acquireToken(I,g){let A;try{if(A={popupName:this.generatePopupName(I.scopes||rC,I.authority||this.config.auth.authority),popupWindowAttributes:I.popupWindowAttributes||{},popupWindowParent:I.popupWindowParent??window},this.performanceClient.addFields({isAsyncPopup:this.config.system.asyncPopups},this.correlationId),this.config.system.asyncPopups)return this.logger.verbose("asyncPopups set to true, acquiring token"),this.acquireTokenPopupAsync(I,A,g);{const d={...I,httpMethod:NG(I,this.config.auth.protocolMode)};return this.logger.verbose("asyncPopup set to false, opening popup before acquiring token"),A.popup=this.openSizedPopup("about:blank",A),this.acquireTokenPopupAsync(d,A,g)}}catch(l){return Promise.reject(l)}}logout(I){try{this.logger.verbose("logoutPopup called");const g=this.initializeLogoutRequest(I),A={popupName:this.generateLogoutPopupName(g),popupWindowAttributes:I?.popupWindowAttributes||{},popupWindowParent:I?.popupWindowParent??window},l=I&&I.authority,d=I&&I.mainWindowRedirectUri;return this.config.system.asyncPopups?(this.logger.verbose("asyncPopups set to true"),this.logoutPopupAsync(g,A,l,d)):(this.logger.verbose("asyncPopup set to false, opening popup"),A.popup=this.openSizedPopup("about:blank",A),this.logoutPopupAsync(g,A,l,d))}catch(g){return Promise.reject(g)}}async acquireTokenPopupAsync(I,g,A){this.logger.verbose("acquireTokenPopupAsync called");const l=await a(this.initializeAuthorizationRequest.bind(this),b.StandardInteractionClientInitializeAuthorizationRequest,this.logger,this.performanceClient,this.correlationId)(I,k.Popup);g.popup&&oG(l.authority);const d=mA(this.config,this.logger,this.platformAuthProvider,I.authenticationScheme);return l.platformBroker=d,this.config.auth.protocolMode===vI.EAR?this.executeEarFlow(l,g,A):this.executeCodeFlow(l,g,A)}async executeCodeFlow(I,g,A){const l=I.correlationId,d=this.initializeServerTelemetryManager($.acquireTokenPopup),Z=A||await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,l)(this.performanceClient,this.logger,l),B={...I,codeChallenge:Z.challenge};try{const c=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,l)({serverTelemetryManager:d,requestAuthority:B.authority,requestAzureCloudOptions:B.azureCloudOptions,requestExtraQueryParameters:B.extraQueryParameters,account:B.account});if(B.httpMethod===iC.POST)return await this.executeCodeFlowWithPost(B,g,c,Z.verifier);{const i=await a(yl,b.GetAuthCodeUrl,this.logger,this.performanceClient,l)(this.config,c.authority,B,this.logger,this.performanceClient),F=this.initiateAuthRequest(i,g);this.eventHandler.emitEvent(z.POPUP_OPENED,k.Popup,{popupWindow:F},null);const V=await this.monitorPopupForHash(F,g.popupWindowParent),W=xI(HC,b.DeserializeResponse,this.logger,this.performanceClient,this.correlationId)(V,this.config.auth.OIDCOptions.serverResponseType,this.logger);return await a(uC,b.HandleResponseCode,this.logger,this.performanceClient,l)(I,W,Z.verifier,$.acquireTokenPopup,this.config,c,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}}catch(c){throw g.popup?.close(),c instanceof FI&&(c.setCorrelationId(this.correlationId),d.cacheFailedRequest(c)),c}}async executeEarFlow(I,g,A){const l=I.correlationId,d=await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,l)({requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account}),Z=await a(XB,b.GenerateEarKey,this.logger,this.performanceClient,l)(),B=A||await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,l)(this.performanceClient,this.logger,l),c={...I,earJwk:Z,codeChallenge:B.challenge},i=g.popup||this.openPopup("about:blank",g);(await kB(i.document,this.config,d,c,this.logger,this.performanceClient)).submit();const V=await a(this.monitorPopupForHash.bind(this),b.SilentHandlerMonitorIframeForHash,this.logger,this.performanceClient,l)(i,g.popupWindowParent),W=xI(HC,b.DeserializeResponse,this.logger,this.performanceClient,this.correlationId)(V,this.config.auth.OIDCOptions.serverResponseType,this.logger);if(!W.ear_jwe&&W.code){const G=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,l)({serverTelemetryManager:this.initializeServerTelemetryManager($.acquireTokenPopup),requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account,authority:d});return a(uC,b.HandleResponseCode,this.logger,this.performanceClient,l)(c,W,B.verifier,$.acquireTokenPopup,this.config,G,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}else return a(zB,b.HandleResponseEar,this.logger,this.performanceClient,l)(c,W,$.acquireTokenPopup,this.config,d,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}async executeCodeFlowWithPost(I,g,A,l){const d=I.correlationId,Z=await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,d)({requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account}),B=g.popup||this.openPopup("about:blank",g);(await TB(B.document,this.config,Z,I,this.logger,this.performanceClient)).submit();const i=await a(this.monitorPopupForHash.bind(this),b.SilentHandlerMonitorIframeForHash,this.logger,this.performanceClient,d)(B,g.popupWindowParent),F=xI(HC,b.DeserializeResponse,this.logger,this.performanceClient,this.correlationId)(i,this.config.auth.OIDCOptions.serverResponseType,this.logger);return a(uC,b.HandleResponseCode,this.logger,this.performanceClient,d)(I,F,l,$.acquireTokenPopup,this.config,A,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}async logoutPopupAsync(I,g,A,l){this.logger.verbose("logoutPopupAsync called"),this.eventHandler.emitEvent(z.LOGOUT_START,k.Popup,I);const d=this.initializeServerTelemetryManager($.logoutPopup);try{await this.clearCacheOnLogout(this.correlationId,I.account);const Z=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,this.correlationId)({serverTelemetryManager:d,requestAuthority:A,account:I.account||void 0});try{Z.authority.endSessionEndpoint}catch{if(I.account?.homeAccountId&&I.postLogoutRedirectUri&&Z.authority.protocolMode===vI.OIDC){if(this.eventHandler.emitEvent(z.LOGOUT_SUCCESS,k.Popup,I),l){const i={apiId:$.logoutPopup,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},F=lI.getAbsoluteUrl(l,yg());await this.navigationClient.navigateInternal(F,i)}g.popup?.close();return}}const B=Z.getLogoutUri(I);this.eventHandler.emitEvent(z.LOGOUT_SUCCESS,k.Popup,I);const c=this.openPopup(B,g);if(this.eventHandler.emitEvent(z.POPUP_OPENED,k.Popup,{popupWindow:c},null),await this.monitorPopupForHash(c,g.popupWindowParent).catch(()=>{}),l){const i={apiId:$.logoutPopup,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},F=lI.getAbsoluteUrl(l,yg());this.logger.verbose("Redirecting main window to url specified in the request"),this.logger.verbosePii(`Redirecting main window to: ${F}`),await this.navigationClient.navigateInternal(F,i)}else this.logger.verbose("No main window navigation requested")}catch(Z){throw g.popup?.close(),Z instanceof FI&&(Z.setCorrelationId(this.correlationId),d.cacheFailedRequest(Z)),this.eventHandler.emitEvent(z.LOGOUT_FAILURE,k.Popup,null,Z),this.eventHandler.emitEvent(z.LOGOUT_END,k.Popup),Z}this.eventHandler.emitEvent(z.LOGOUT_END,k.Popup)}
20initiateAuthRequest(I,g){if(I)return this.logger.infoPii(`Navigate to: ${I}`),this.openPopup(I,g);throw this.logger.error("Navigate url is empty"),H($l)}monitorPopupForHash(I,g){return new Promise((A,l)=>{this.logger.verbose("PopupHandler.monitorPopupForHash - polling started");const d=setInterval(()=>{if(I.closed){this.logger.error("PopupHandler.monitorPopupForHash - window closed"),clearInterval(d),l(H(UA));return}let Z="";try{Z=I.location.href}catch{}if(!Z||Z==="about:blank")return;clearInterval(d);let B="";const c=this.config.auth.OIDCOptions.serverResponseType;I&&(c===Ll.QUERY?B=I.location.search:B=I.location.hash),this.logger.verbose("PopupHandler.monitorPopupForHash - popup window is on same origin as caller"),A(B)},this.config.system.pollIntervalMilliseconds)}).finally(()=>{this.cleanPopup(I,g)})}openPopup(I,g){try{let A;if(g.popup?(A=g.popup,this.logger.verbosePii(`Navigating popup window to: ${I}`),A.location.assign(I)):typeof g.popup>"u"&&(this.logger.verbosePii(`Opening popup window to: ${I}`),A=this.openSizedPopup(I,g)),!A)throw H(KV);return A.focus&&A.focus(),this.currentWindow=A,g.popupWindowParent.addEventListener("beforeunload",this.unloadWindow),A}catch(A){throw this.logger.error("error opening popup "+A.message),H(pV)}}openSizedPopup(I,{popupName:g,popupWindowAttributes:A,popupWindowParent:l}){const d=l.screenLeft?l.screenLeft:l.screenX,Z=l.screenTop?l.screenTop:l.screenY,B=l.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,c=l.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;let i=A.popupSize?.width,F=A.popupSize?.height,V=A.popupPosition?.top,W=A.popupPosition?.left;return(!i||i<0||i>B)&&(this.logger.verbose("Default popup window width used. Window width not configured or invalid."),i=jI.POPUP_WIDTH),(!F||F<0||F>c)&&(this.logger.verbose("Default popup window height used. Window height not configured or invalid."),F=jI.POPUP_HEIGHT),(!V||V<0||V>c)&&(this.logger.verbose("Default popup window top position used. Window top not configured or invalid."),V=Math.max(0,c/2-jI.POPUP_HEIGHT/2+Z)),(!W||W<0||W>B)&&(this.logger.verbose("Default popup window left position used. Window left not configured or invalid."),W=Math.max(0,B/2-jI.POPUP_WIDTH/2+d)),l.open(I,g,`width=${i}, height=${F}, top=${V}, left=${W}, scrollbars=yes`)}unloadWindow(I){this.currentWindow&&this.currentWindow.close(),I.preventDefault()}cleanPopup(I,g){I.close(),g.removeEventListener("beforeunload",this.unloadWindow)}generatePopupName(I,g){return`${jI.POPUP_NAME_PREFIX}.${this.config.auth.clientId}.${I.join("-")}.${g}.${this.correlationId}`}generateLogoutPopupName(I){const g=I.account&&I.account.homeAccountId;return`${jI.POPUP_NAME_PREFIX}.${this.config.auth.clientId}.${g}.${this.correlationId}`}}function cY(){if(typeof window>"u"||typeof window.performance>"u"||typeof window.performance.getEntriesByType!="function")return;const C=window.performance.getEntriesByType("navigation");return(C.length?C[0]:void 0)?.type}class iY extends vC{constructor(I,g,A,l,d,Z,B,c,i,F){super(I,g,A,l,d,Z,B,i,F),this.nativeStorage=c}async acquireToken(I){const g=await a(this.initializeAuthorizationRequest.bind(this),b.StandardInteractionClientInitializeAuthorizationRequest,this.logger,this.performanceClient,this.correlationId)(I,k.Redirect);g.platformBroker=mA(this.config,this.logger,this.platformAuthProvider,I.authenticationScheme);const A=d=>{d.persisted&&(this.logger.verbose("Page was restored from back/forward cache. Clearing temporary cache."),this.browserStorage.resetRequestCache(),this.eventHandler.emitEvent(z.RESTORE_FROM_BFCACHE,k.Redirect))},l=this.getRedirectStartPage(I.redirectStartPage);this.logger.verbosePii(`Redirect start page: ${l}`),this.browserStorage.setTemporaryCache(NI.ORIGIN_URI,l,!0),window.addEventListener("pageshow",A);try{this.config.auth.protocolMode===vI.EAR?await this.executeEarFlow(g):await this.executeCodeFlow(g,I.onRedirectNavigate)}catch(d){throw d instanceof FI&&d.setCorrelationId(this.correlationId),window.removeEventListener("pageshow",A),d}}async executeCodeFlow(I,g){const A=I.correlationId,l=this.initializeServerTelemetryManager($.acquireTokenRedirect),d=await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,A)(this.performanceClient,this.logger,A),Z={...I,codeChallenge:d.challenge};this.browserStorage.cacheAuthorizeRequest(Z,d.verifier);try{if(Z.httpMethod===iC.POST)return await this.executeCodeFlowWithPost(Z);{const B=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,this.correlationId)({serverTelemetryManager:l,requestAuthority:Z.authority,requestAzureCloudOptions:Z.azureCloudOptions,requestExtraQueryParameters:Z.extraQueryParameters,account:Z.account}),c=await a(yl,b.GetAuthCodeUrl,this.logger,this.performanceClient,I.correlationId)(this.config,B.authority,Z,this.logger,this.performanceClient);return await this.initiateAuthRequest(c,g)}}catch(B){throw B instanceof FI&&(B.setCorrelationId(this.correlationId),l.cacheFailedRequest(B)),B}}async executeEarFlow(I){const g=I.correlationId,A=await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,g)({requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account}),l=await a(XB,b.GenerateEarKey,this.logger,this.performanceClient,g)(),d=await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,g)(this.performanceClient,this.logger,g),Z={...I,earJwk:l,codeChallenge:d.challenge};return this.browserStorage.cacheAuthorizeRequest(Z,d.verifier),(await kB(document,this.config,A,Z,this.logger,this.performanceClient)).submit(),new Promise((c,i)=>{setTimeout(()=>{i(H(Jl,"failed_to_redirect"))},this.config.system.redirectNavigationTimeout)})}async executeCodeFlowWithPost(I){const g=I.correlationId,A=await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,g)({requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account});return this.browserStorage.cacheAuthorizeRequest(I),(await TB(document,this.config,A,I,this.logger,this.performanceClient)).submit(),new Promise((d,Z)=>{setTimeout(()=>{Z(H(Jl,"failed_to_redirect"))},this.config.system.redirectNavigationTimeout)})}async handleRedirectPromise(I="",g,A,l){const d=this.initializeServerTelemetryManager($.handleRedirectPromise);try{const[Z,B]=this.getRedirectResponse(I||"");
20if(!Z)return this.logger.info("handleRedirectPromise did not detect a response as a result of a redirect. Cleaning temporary cache."),this.browserStorage.resetRequestCache(),cY()!=="back_forward"?l.event.errorCode="no_server_response":this.logger.verbose("Back navigation event detected. Muting no_server_response error"),null;const c=this.browserStorage.getTemporaryCache(NI.ORIGIN_URI,!0)||Y.EMPTY_STRING,i=lc(c),F=lc(window.location.href);if(i===F&&this.config.auth.navigateToLoginRequestUrl)return this.logger.verbose("Current page is loginRequestUrl, handling response"),c.indexOf("#")>-1&&VN(c),await this.handleResponse(Z,g,A,d);if(this.config.auth.navigateToLoginRequestUrl){if(!MB()||this.config.system.allowRedirectInIframe){this.browserStorage.setTemporaryCache(NI.URL_HASH,B,!0);const V={apiId:$.handleRedirectPromise,timeout:this.config.system.redirectNavigationTimeout,noHistory:!0};let W=!0;if(!c||c==="null"){const G=WN();this.browserStorage.setTemporaryCache(NI.ORIGIN_URI,G,!0),this.logger.warning("Unable to get valid login request url from cache, redirecting to home page"),W=await this.navigationClient.navigateInternal(G,V)}else this.logger.verbose(`Navigating to loginRequestUrl: ${c}`),W=await this.navigationClient.navigateInternal(c,V);if(!W)return await this.handleResponse(Z,g,A,d)}}else return this.logger.verbose("NavigateToLoginRequestUrl set to false, handling response"),await this.handleResponse(Z,g,A,d);return null}catch(Z){throw Z instanceof FI&&(Z.setCorrelationId(this.correlationId),d.cacheFailedRequest(Z)),Z}}getRedirectResponse(I){this.logger.verbose("getRedirectResponseHash called");let g=I;g||(this.config.auth.OIDCOptions.serverResponseType===Ll.QUERY?g=window.location.search:g=window.location.hash);let A=ml(g);if(A){try{rN(A,this.browserCrypto,k.Redirect)}catch(d){return d instanceof FI&&this.logger.error(`Interaction type validation failed due to ${d.errorCode}: ${d.errorMessage}`),[null,""]}return sG(window),this.logger.verbose("Hash contains known properties, returning response hash"),[A,g]}const l=this.browserStorage.getTemporaryCache(NI.URL_HASH,!0);return this.browserStorage.removeItem(this.browserStorage.generateCacheKey(NI.URL_HASH)),l&&(A=ml(l),A)?(this.logger.verbose("Hash does not contain known properties, returning cached hash"),[A,l]):[null,""]}async handleResponse(I,g,A,l){if(!I.state)throw H(aB);if(I.ear_jwe){const B=await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,g.correlationId)({requestAuthority:g.authority,requestAzureCloudOptions:g.azureCloudOptions,requestExtraQueryParameters:g.extraQueryParameters,account:g.account});return a(zB,b.HandleResponseEar,this.logger,this.performanceClient,g.correlationId)(g,I,$.acquireTokenRedirect,this.config,B,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}const Z=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,this.correlationId)({serverTelemetryManager:l,requestAuthority:g.authority});return a(uC,b.HandleResponseCode,this.logger,this.performanceClient,g.correlationId)(g,I,A,$.acquireTokenRedirect,this.config,Z,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}async initiateAuthRequest(I,g){if(this.logger.verbose("RedirectHandler.initiateAuthRequest called"),I){this.logger.infoPii(`RedirectHandler.initiateAuthRequest: Navigate to: ${I}`);const A={apiId:$.acquireTokenRedirect,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},l=g||this.config.auth.onRedirectNavigate;if(typeof l=="function")if(this.logger.verbose("RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback"),l(I)!==!1){this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating"),await this.navigationClient.navigateExternal(I,A);return}else{this.logger.verbose("RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation");return}else{this.logger.verbose("RedirectHandler.initiateAuthRequest: Navigating window to navigate url"),await this.navigationClient.navigateExternal(I,A);return}}else throw this.logger.info("RedirectHandler.initiateAuthRequest: Navigate url is empty"),H($l)}async logout(I){this.logger.verbose("logoutRedirect called");
20const g=this.initializeLogoutRequest(I),A=this.initializeServerTelemetryManager($.logout);try{this.eventHandler.emitEvent(z.LOGOUT_START,k.Redirect,I),await this.clearCacheOnLogout(this.correlationId,g.account);const l={apiId:$.logout,timeout:this.config.system.redirectNavigationTimeout,noHistory:!1},d=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,this.correlationId)({serverTelemetryManager:A,requestAuthority:I&&I.authority,requestExtraQueryParameters:I?.extraQueryParameters,account:I&&I.account||void 0});if(d.authority.protocolMode===vI.OIDC)try{d.authority.endSessionEndpoint}catch{if(g.account?.homeAccountId){this.eventHandler.emitEvent(z.LOGOUT_SUCCESS,k.Redirect,g);return}}const Z=d.getLogoutUri(g);if(this.eventHandler.emitEvent(z.LOGOUT_SUCCESS,k.Redirect,g),I&&typeof I.onRedirectNavigate=="function")if(I.onRedirectNavigate(Z)!==!1){this.logger.verbose("Logout onRedirectNavigate did not return false, navigating"),this.browserStorage.getInteractionInProgress()||this.browserStorage.setInteractionInProgress(!0,Lg.SIGNOUT),await this.navigationClient.navigateExternal(Z,l);return}else this.browserStorage.setInteractionInProgress(!1),this.logger.verbose("Logout onRedirectNavigate returned false, stopping navigation");else{this.browserStorage.getInteractionInProgress()||this.browserStorage.setInteractionInProgress(!0,Lg.SIGNOUT),await this.navigationClient.navigateExternal(Z,l);return}}catch(l){throw l instanceof FI&&(l.setCorrelationId(this.correlationId),A.cacheFailedRequest(l)),this.eventHandler.emitEvent(z.LOGOUT_FAILURE,k.Redirect,null,l),this.eventHandler.emitEvent(z.LOGOUT_END,k.Redirect),l}this.eventHandler.emitEvent(z.LOGOUT_END,k.Redirect)}getRedirectStartPage(I){const g=I||window.location.href;return lI.getAbsoluteUrl(g,yg())}}async function uc(C,I,g,A,l){if(I.addQueueMeasurement(b.SilentHandlerInitiateAuthRequest,A),!C)throw g.info("Navigate url is empty"),H($l);return l?a(GY,b.SilentHandlerLoadFrame,g,I,A)(C,l,I,A):xI(WY,b.SilentHandlerLoadFrameSync,g,I,A)(C)}async function FY(C,I,g,A,l){const d=ld();if(!d.contentDocument)throw"No document associated with iframe!";return(await TB(d.contentDocument,C,I,g,A,l)).submit(),d}async function VY(C,I,g,A,l){const d=ld();if(!d.contentDocument)throw"No document associated with iframe!";return(await kB(d.contentDocument,C,I,g,A,l)).submit(),d}async function Xd(C,I,g,A,l,d,Z){A.addQueueMeasurement(b.SilentHandlerMonitorIframeForHash,d),A.addFields({iframePollIntervalMs:g,iframeTimeoutMs:I},d);let B=0,c=0;return new Promise((i,F)=>{I<FZ&&l.warning(`system.loadFrameTimeout or system.iframeHashTimeout set to lower (${I}ms) than the default (${FZ}ms). This may result in timeouts.`);const V=window.setTimeout(()=>{window.clearInterval(W),F(H(kV))},I),W=window.setInterval(()=>{B++;let G="";const R=C.contentWindow;try{G=R?R.location.href:""}catch{c++}if(!G||G==="about:blank")return;let s="";R&&(Z===Ll.QUERY?s=R.location.search:s=R.location.hash),window.clearTimeout(V),window.clearInterval(W),i(s)},g)}).finally(()=>{A.addFields({iframeTickCount:B,crossOriginTickCount:c},d),xI(RY,b.RemoveHiddenIframe,l,A,d)(C)})}function GY(C,I,g,A){return g.addQueueMeasurement(b.SilentHandlerLoadFrame,A),new Promise((l,d)=>{const Z=ld();window.setTimeout(()=>{if(!Z){d("Unable to load iframe");return}Z.src=C,l(Z)},I)})}function WY(C){const I=ld();return I.src=C,I}function ld(){const C=document.createElement("iframe");return C.className="msalSilentIframe",C.style.visibility="hidden",C.style.position="absolute",C.style.width=C.style.height="0",C.style.border="0",C.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms"),C.setAttribute("allow","local-network-access *"),document.body.appendChild(C),C}function RY(C){document.body===C.parentNode&&document.body.removeChild(C)}class sY extends vC{constructor(I,g,A,l,d,Z,B,c,i,F,V){super(I,g,A,l,d,Z,c,F,V),this.apiId=B,this.nativeStorage=i}async acquireToken(I){this.performanceClient.addQueueMeasurement(b.SilentIframeClientAcquireToken,I.correlationId),!I.loginHint&&!I.sid&&(!I.account||!I.account.username)&&this.logger.warning("No user hint provided. The authorization server may need more information to complete this request.");const g={...I};g.prompt?g.prompt!==SI.NONE&&g.prompt!==SI.NO_SESSION&&(this.logger.warning(`SilentIframeClient. Replacing invalid prompt ${g.prompt} with ${SI.NONE}`),g.prompt=SI.NONE):g.prompt=SI.NONE;const A=await a(this.initializeAuthorizationRequest.bind(this),b.StandardInteractionClientInitializeAuthorizationRequest,this.logger,this.performanceClient,I.correlationId)(g,k.Silent);return A.platformBroker=mA(this.config,this.logger,this.platformAuthProvider,A.authenticationScheme),oG(A.authority),this.config.auth.protocolMode===vI.EAR?this.executeEarFlow(A):this.executeCodeFlow(A)}async executeCodeFlow(I){let g;const A=this.initializeServerTelemetryManager(this.apiId);try{return g=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,I.correlationId)({serverTelemetryManager:A,requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account}),await a(this.silentTokenHelper.bind(this),b.SilentIframeClientTokenHelper,this.logger,this.performanceClient,I.correlationId)(g,I)}catch(l){if(l instanceof FI&&(l.setCorrelationId(this.correlationId),A.cacheFailedRequest(l)),!g||!(l instanceof FI)||l.errorCode!==jI.INVALID_GRANT_ERROR)throw l;return this.performanceClient.addFields({retryError:l.errorCode},this.correlationId),await a(this.silentTokenHelper.bind(this),b.SilentIframeClientTokenHelper,this.logger,this.performanceClient,this.correlationId)(g,I)}}async executeEarFlow(I){const g=I.correlationId,A=await a(this.getDiscoveredAuthority.bind(this),b.StandardInteractionClientGetDiscoveredAuthority,this.logger,this.performanceClient,g)({requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account}),l=await a(XB,b.GenerateEarKey,this.logger,this.performanceClient,g)(),d=await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,g)(this.performanceClient,this.logger,g),Z={...I,earJwk:l,codeChallenge:d.challenge},B=await a(VY,b.SilentHandlerInitiateAuthRequest,this.logger,this.performanceClient,g)(this.config,A,Z,this.logger,this.performanceClient),c=this.config.auth.OIDCOptions.serverResponseType,i=await a(Xd,b.SilentHandlerMonitorIframeForHash,this.logger,this.performanceClient,g)(B,this.config.system.iframeHashTimeout,this.config.system.pollIntervalMilliseconds,this.performanceClient,this.logger,g,c),F=xI(HC,b.DeserializeResponse,this.logger,this.performanceClient,g)(i,c,this.logger);if(!F.ear_jwe&&F.code){const V=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,g)({serverTelemetryManager:this.initializeServerTelemetryManager(this.apiId),requestAuthority:I.authority,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account,authority:A});return a(uC,b.HandleResponseCode,this.logger,this.performanceClient,g)(Z,F,d.verifier,this.apiId,this.config,V,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}else return a(zB,b.HandleResponseEar,this.logger,this.performanceClient,g)(Z,F,this.apiId,this.config,A,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}async verifySso(I){this.performanceClient.addQueueMeasurement(b.SilentIframeClientAcquireToken,I.correlationId);const g={...I};g.prompt||(g.prompt=SI.NONE);const A=await a(this.initializeAuthorizationRequest.bind(this),b.StandardInteractionClientInitializeAuthorizationRequest,this.logger,this.performanceClient,I.correlationId)(g,k.Silent),l=await a(this.createAuthCodeClient.bind(this),b.StandardInteractionClientCreateAuthCodeClient,this.logger,this.performanceClient,I.correlationId)({serverTelemetryManager:this.initializeServerTelemetryManager(this.apiId),requestAuthority:A.authority,requestAzureCloudOptions:A.azureCloudOptions,requestExtraQueryParameters:A.extraQueryParameters,account:A.account}),d=A.correlationId,Z=await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,d)(this.performanceClient,this.logger,d),B={...A,codeChallenge:Z.challenge},c=await a(yl,b.GetAuthCodeUrl,this.logger,this.performanceClient,d)(this.config,l.authority,B,this.logger,this.performanceClient),i=await a(uc,b.SilentHandlerInitiateAuthRequest,this.logger,this.performanceClient,d)(c,this.performanceClient,this.logger,d,this.config.system.navigateFrameWait),F=this.config.auth.OIDCOptions.serverResponseType,V=await a(Xd,b.SilentHandlerMonitorIframeForHash,this.logger,this.performanceClient,d)(i,this.config.system.iframeHashTimeout,this.config.system.pollIntervalMilliseconds,this.performanceClient,this.logger,d,F),W=xI(HC,b.DeserializeResponse,this.logger,this.performanceClient,d)(V,F,this.logger);return UB(W,A.state),W.code?(this.logger.verbose("SSO verification completed successfully with valid authorization code - skipped token exchange",d),!0):(this.logger.warning("SSO verification response did not contain an authorization code",d),!1)}logout(){return Promise.reject(H(Id))}async silentTokenHelper(I,g){const A=g.correlationId;this.performanceClient.addQueueMeasurement(b.SilentIframeClientTokenHelper,A);const l=await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,A)(this.performanceClient,this.logger,A),d={...g,codeChallenge:l.challenge};let Z;if(g.httpMethod===iC.POST)Z=await a(FY,b.SilentHandlerInitiateAuthRequest,this.logger,this.performanceClient,A)(this.config,I.authority,d,this.logger,this.performanceClient);else{const F=await a(yl,b.GetAuthCodeUrl,this.logger,this.performanceClient,A)(this.config,I.authority,d,this.logger,this.performanceClient);Z=await a(uc,b.SilentHandlerInitiateAuthRequest,this.logger,this.performanceClient,A)(F,this.performanceClient,this.logger,A,this.config.system.navigateFrameWait)}const B=this.config.auth.OIDCOptions.serverResponseType,c=await a(Xd,b.SilentHandlerMonitorIframeForHash,this.logger,this.performanceClient,A)(Z,this.config.system.iframeHashTimeout,this.config.system.pollIntervalMilliseconds,this.performanceClient,this.logger,A,B),i=xI(HC,b.DeserializeResponse,this.logger,this.performanceClient,A)(c,B,this.logger);return a(uC,b.HandleResponseCode,this.logger,this.performanceClient,A)(g,i,l.verifier,this.apiId,this.config,I,this.browserStorage,this.nativeStorage,this.eventHandler,this.logger,this.performanceClient,this.platformAuthProvider)}}class bY extends vC{async acquireToken(I){this.performanceClient.addQueueMeasurement(b.SilentRefreshClientAcquireToken,I.correlationId);const g=await a(pB,b.InitializeBaseRequest,this.logger,this.performanceClient,I.correlationId)(I,this.config,this.performanceClient,this.logger),A={...I,...g};I.redirectUri&&(A.redirectUri=this.getRedirectUri(I.redirectUri));const l=this.initializeServerTelemetryManager($.acquireTokenSilent_silentFlow),d=await this.createRefreshTokenClient({serverTelemetryManager:l,authorityUrl:A.authority,azureCloudOptions:A.azureCloudOptions,account:A.account});return a(d.acquireTokenByRefreshToken.bind(d),b.RefreshTokenClientAcquireTokenByRefreshToken,this.logger,this.performanceClient,I.correlationId)(A,$.acquireTokenSilent_silentFlow).catch(Z=>{throw Z.setCorrelationId(this.correlationId),l.cacheFailedRequest(Z),Z})}logout(){return Promise.reject(H(Id))}async createRefreshTokenClient(I){const g=await a(this.getClientConfiguration.bind(this),b.StandardInteractionClientGetClientConfiguration,this.logger,this.performanceClient,this.correlationId)({serverTelemetryManager:I.serverTelemetryManager,requestAuthority:I.authorityUrl,requestAzureCloudOptions:I.azureCloudOptions,requestExtraQueryParameters:I.extraQueryParameters,account:I.account});return new ya(g,this.performanceClient)}}class UY{constructor(I,g,A,l,d){this.isBrowserEnvironment=typeof window<"u",this.config=I,this.storage=g,this.logger=A,this.cryptoObj=l,this.performanceClient=d}async loadExternalTokens(I,g,A){if(!this.isBrowserEnvironment)throw H(gd);const l=I.correlationId||hg(),d=this.performanceClient.startMeasurement(b.LoadExternalTokens,l);try{const Z=g.id_token?Yg(g.id_token,zI):void 0,B=wg(Z||{}),c={protocolMode:this.config.auth.protocolMode,knownAuthorities:this.config.auth.knownAuthorities,cloudDiscoveryMetadata:this.config.auth.cloudDiscoveryMetadata,authorityMetadata:this.config.auth.authorityMetadata,skipAuthorityMetadataCache:this.config.auth.skipAuthorityMetadataCache},i=I.authority||this.config.auth.authority,F=await VB(TI.generateAuthority(i,I.azureCloudOptions),this.config.system.networkClient,this.storage,c,this.logger,l,this.performanceClient),V=await a(this.loadAccount.bind(this),b.LoadAccount,this.logger,this.performanceClient,l)(I,A.clientInfo||g.client_info||"",l,F,Z),W=await a(this.loadIdToken.bind(this),b.LoadIdToken,this.logger,this.performanceClient,l)(g,V.homeAccountId,V.environment,V.realm,l,B),G=await a(this.loadAccessToken.bind(this),b.LoadAccessToken,this.logger,this.performanceClient,l)(I,g,V.homeAccountId,V.environment,V.realm,A,l,B),R=await a(this.loadRefreshToken.bind(this),b.LoadRefreshToken,this.logger,this.performanceClient,l)(g,V.homeAccountId,V.environment,l,B);return d.end({success:!0},void 0,mI.getAccountInfo(V)),this.generateAuthenticationResult(I,{account:V,idToken:W,accessToken:G,refreshToken:R},F,Z)}catch(Z){throw d.end({success:!1},Z),Z}}async loadAccount(I,g,A,l,d){if(this.logger.verbose("TokenCache - loading account"),I.account){const i=mI.createFromAccountInfo(I.account);return await this.storage.setAccount(i,A,wg(d||{}),$.loadExternalTokens),i}else if(!g&&!d)throw this.logger.error("TokenCache - if an account is not provided on the request, clientInfo or idToken must be provided instead."),H(xV);const Z=mI.generateHomeAccountId(g,l.authorityType,this.logger,this.cryptoObj,d),B=d?.tid,c=sB(this.storage,l,Z,zI,A,d,g,l.getPreferredCache(),B,void 0,void 0,this.logger);return await this.storage.setAccount(c,A,wg(d||{}),$.loadExternalTokens),c}async loadIdToken(I,g,A,l,d,Z){if(!I.id_token)return this.logger.verbose("TokenCache - no id token found in response"),null;this.logger.verbose("TokenCache - loading id token");const B=vl(g,A,I.id_token,this.config.auth.clientId,l);return await this.storage.setIdTokenCredential(B,d,Z),B}async loadAccessToken(I,g,A,l,d,Z,B,c){if(g.access_token)if(g.expires_in){if(!g.scope&&(!I.scopes||!I.scopes.length))return this.logger.error("TokenCache - scopes not specified in the request or response. Cannot add token to the cache."),null}else return this.logger.error("TokenCache - no expiration set on the access token. Cannot add it to the cache."),null;else return this.logger.verbose("TokenCache - no access token found in response"),null;this.logger.verbose("TokenCache - loading access token");const i=g.scope?hI.fromString(g.scope):new hI(I.scopes),F=Z.expiresOn||g.expires_in+LI(),V=Z.extendedExpiresOn||(g.ext_expires_in||g.expires_in)+LI(),W=xl(A,l,g.access_token,this.config.auth.clientId,d,i.printScopes(),F,V,zI);return await this.storage.setAccessTokenCredential(W,B,c),W}async loadRefreshToken(I,g,A,l,d){if(!I.refresh_token)return this.logger.verbose("TokenCache - no refresh token found in response"),null;const Z=I.refresh_token_expires_in?I.refresh_token_expires_in+LI():void 0;this.performanceClient.addFields({extRtExpiresOnSeconds:Z},l),this.logger.verbose("TokenCache - loading refresh token");const B=QV(g,A,I.refresh_token,this.config.auth.clientId,I.foci,void 0,Z);return await this.storage.setRefreshTokenCredential(B,l,d),B}generateAuthenticationResult(I,g,A,l){let d="",Z=[],B=null,c;g?.accessToken&&(d=g.accessToken.secret,Z=hI.fromString(g.accessToken.target).asArray(),B=tC(g.accessToken.expiresOn),c=tC(g.accessToken.extendedExpiresOn));const i=g.account;return{authority:A?A.canonicalAuthority:"",uniqueId:g.account.localAccountId,tenantId:g.account.realm,scopes:Z,account:mI.getAccountInfo(i),idToken:g.idToken?.secret||"",idTokenClaims:l||{},accessToken:d,fromCache:!0,expiresOn:B,correlationId:I.correlationId||"",
20requestId:"",extExpiresOn:c,familyId:g.refreshToken?.familyId||"",tokenType:g?.accessToken?.tokenType||"",state:I.state||"",cloudGraphHostName:i.cloudGraphHostName||"",msGraphHost:i.msGraphHost||"",fromNativeBroker:!1}}}class oY extends eV{constructor(I){super(I),this.includeRedirectUri=!1}}class mY extends vC{constructor(I,g,A,l,d,Z,B,c,i,F){super(I,g,A,l,d,Z,c,i,F),this.apiId=B}async acquireToken(I){if(!I.code)throw H(PV);const g=await a(this.initializeAuthorizationRequest.bind(this),b.StandardInteractionClientInitializeAuthorizationRequest,this.logger,this.performanceClient,I.correlationId)(I,k.Silent),A=this.initializeServerTelemetryManager(this.apiId);try{const l={...g,code:I.code},d=await a(this.getClientConfiguration.bind(this),b.StandardInteractionClientGetClientConfiguration,this.logger,this.performanceClient,I.correlationId)({serverTelemetryManager:A,requestAuthority:g.authority,requestAzureCloudOptions:g.azureCloudOptions,requestExtraQueryParameters:g.extraQueryParameters,account:g.account}),Z=new oY(d);this.logger.verbose("Auth code client created");const B=new YG(Z,this.browserStorage,l,this.logger,this.performanceClient);return await a(B.handleCodeResponseFromServer.bind(B),b.HandleCodeResponseFromServer,this.logger,this.performanceClient,I.correlationId)({code:I.code,msgraph_host:I.msGraphHost,cloud_graph_host_name:I.cloudGraphHostName,cloud_instance_host_name:I.cloudInstanceHostName},g,this.apiId,!1)}catch(l){throw l instanceof FI&&(l.setCorrelationId(this.correlationId),A.cacheFailedRequest(l)),l}}logout(){return Promise.reject(H(Id))}}function nY(C,I,g){const A=window.msal?.clientIds||[],l=A.length,d=A.filter(Z=>Z===C).length;d>1&&g.warning("There is already an instance of MSAL.js in the window with the same client id."),I.add({msalInstanceCount:l,sameClientIdInstanceCount:d})}function PA(C,I,g){try{HB(C)}catch(A){throw I.end({success:!1},A,g),A}}class dd{constructor(I){this.operatingContext=I,this.isBrowserEnvironment=this.operatingContext.isBrowserEnvironment(),this.config=I.getConfig(),this.initialized=!1,this.logger=this.operatingContext.getLogger(),this.networkClient=this.config.system.networkClient,this.navigationClient=this.config.system.navigationClient,this.redirectResponse=new Map,this.hybridAuthCodeResponses=new Map,this.performanceClient=this.config.telemetry.client,this.browserCrypto=this.isBrowserEnvironment?new Dg(this.logger,this.performanceClient):Ul,this.eventHandler=new zN(this.logger),this.browserStorage=this.isBrowserEnvironment?new GZ(this.config.auth.clientId,this.config.cache,this.browserCrypto,this.logger,this.performanceClient,this.eventHandler,aa(this.config.auth)):tN(this.config.auth.clientId,this.logger,this.performanceClient,this.eventHandler);const g={cacheLocation:XI.MemoryStorage,cacheRetentionDays:5,temporaryCacheLocation:XI.MemoryStorage,storeAuthStateInCookie:!1,secureCookies:!1,cacheMigrationEnabled:!1,claimsBasedCachingEnabled:!1};this.nativeInternalStorage=new GZ(this.config.auth.clientId,g,this.browserCrypto,this.logger,this.performanceClient,this.eventHandler),this.tokenCache=new UY(this.config,this.browserStorage,this.logger,this.browserCrypto,this.performanceClient),this.activeSilentTokenRequests=new Map,this.trackStateChangeWithMeasurement=this.trackStateChangeWithMeasurement.bind(this)}static async createController(I,g){const A=new dd(I);return await A.initialize(g),A}trackStateChange(I,g){I&&(g.type==="visibilitychange"?(this.logger.info("Perf: Visibility change detected"),this.performanceClient.incrementFields({visibilityChangeCount:1},I)):g.type==="online"?(this.logger.info("Perf: Online status change detected"),this.performanceClient.incrementFields({onlineStatusChangeCount:1},I)):g.type==="offline"&&(this.logger.info("Perf: Offline status change detected"),this.performanceClient.incrementFields({onlineStatusChangeCount:1},I)))}async initialize(I,g){if(this.logger.trace("initialize called"),this.initialized){this.logger.info("initialize has already been called, exiting early.");return}if(!this.isBrowserEnvironment){this.logger.info("in non-browser environment, exiting early."),this.initialized=!0,this.eventHandler.emitEvent(z.INITIALIZE_END);return}const A=I?.correlationId||this.getRequestCorrelationId(),l=this.config.system.allowPlatformBroker,d=this.performanceClient.startMeasurement(b.InitializeClientApplication,A);if(this.eventHandler.emitEvent(z.INITIALIZE_START),!g)try{this.logMultipleInstances(d)}catch{}if(await a(this.browserStorage.initialize.bind(this.browserStorage),b.InitializeCache,this.logger,this.performanceClient,A)(A),l)try{this.platformAuthProvider=await ZY(this.logger,this.performanceClient,A,this.config.system.nativeBrokerHandshakeTimeout,this.config.system.allowPlatformBrokerWithDOM)}catch(Z){this.logger.verbose(Z)}this.config.cache.claimsBasedCachingEnabled||(this.logger.verbose("Claims-based caching is disabled. Clearing the previous cache with claims"),xI(this.browserStorage.clearTokensAndKeysWithClaims.bind(this.browserStorage),b.ClearTokensAndKeysWithClaims,this.logger,this.performanceClient,A)(A)),this.config.system.asyncPopups&&await this.preGeneratePkceCodes(A),this.initialized=!0,this.eventHandler.emitEvent(z.INITIALIZE_END),d.end({allowPlatformBroker:l,success:!0})}async handleRedirectPromise(I){if(this.logger.verbose("handleRedirectPromise called"),UG(this.initialized),this.isBrowserEnvironment){const g=I||"";let A=this.redirectResponse.get(g);return typeof A>"u"?(A=this.handleRedirectPromiseInternal(I),this.redirectResponse.set(g,A),this.logger.verbose("handleRedirectPromise has been called for the first time, storing the promise")):this.logger.verbose("handleRedirectPromise has been called previously, returning the result from the first call"),A}return this.logger.verbose("handleRedirectPromise returns null, not browser environment"),null}async handleRedirectPromiseInternal(I){if(!this.browserStorage.isInteractionInProgress(!0))return this.logger.info("handleRedirectPromise called but there is no interaction in progress, returning null."),null;if(this.browserStorage.getInteractionInProgress()?.type===Lg.SIGNOUT)return this.logger.verbose("handleRedirectPromise remov
20ing interaction_in_progress flag and returning null after sign-out"),this.browserStorage.setInteractionInProgress(!1),Promise.resolve(null);const A=this.getAllAccounts(),l=this.browserStorage.getCachedNativeRequest(),d=l&&this.platformAuthProvider&&!I;let Z;this.eventHandler.emitEvent(z.HANDLE_REDIRECT_START,k.Redirect);let B;try{if(d&&this.platformAuthProvider){Z=this.performanceClient.startMeasurement(b.AcquireTokenRedirect,l?.correlationId||""),this.logger.trace("handleRedirectPromise - acquiring token from native platform"),Z.add({isPlatformBrokerRequest:!0});const c=new Bl(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,$.handleRedirectPromise,this.performanceClient,this.platformAuthProvider,l.accountId,this.nativeInternalStorage,l.correlationId);B=a(c.handleRedirectPromise.bind(c),b.HandleNativeRedirectPromiseMeasurement,this.logger,this.performanceClient,Z.event.correlationId)(this.performanceClient,Z.event.correlationId)}else{const[c,i]=this.browserStorage.getCachedRequest(),F=c.correlationId;Z=this.performanceClient.startMeasurement(b.AcquireTokenRedirect,F),this.logger.trace("handleRedirectPromise - acquiring token from web flow");const V=this.createRedirectClient(F);B=a(V.handleRedirectPromise.bind(V),b.HandleRedirectPromiseMeasurement,this.logger,this.performanceClient,Z.event.correlationId)(I,c,i,Z)}}catch(c){throw this.browserStorage.resetRequestCache(),c}return B.then(c=>(c?(this.browserStorage.resetRequestCache(),A.length<this.getAllAccounts().length?(this.eventHandler.emitEvent(z.LOGIN_SUCCESS,k.Redirect,c),this.logger.verbose("handleRedirectResponse returned result, login success")):(this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_SUCCESS,k.Redirect,c),this.logger.verbose("handleRedirectResponse returned result, acquire token success")),Z.end({success:!0},void 0,c.account),this.verifySsoCapability(c.account,k.Redirect)):Z.event.errorCode?Z.end({success:!1},void 0):Z.discard(),this.eventHandler.emitEvent(z.HANDLE_REDIRECT_END,k.Redirect),c)).c
20atch(c=>{this.browserStorage.resetRequestCache();const i=c;throw A.length>0?this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_FAILURE,k.Redirect,null,i):this.eventHandler.emitEvent(z.LOGIN_FAILURE,k.Redirect,null,i),this.eventHandler.emitEvent(z.HANDLE_REDIRECT_END,k.Redirect),Z.end({success:!1},i),c})}async acquireTokenRedirect(I){const g=this.getRequestCorrelationId(I);this.logger.verbose("acquireTokenRedirect called",g);const A=this.performanceClient.startMeasurement(b.AcquireTokenPreRedirect,g);A.add({scenarioId:I.scenarioId});const l=I.onRedirectNavigate;if(l)I.onRedirectNavigate=Z=>{const B=typeof l=="function"?l(Z):void 0;return A.add({navigateCallbackResult:B!==!1}),A.event=A.end({success:!0},void 0,I.account)||A.event,B};else{const Z=this.config.auth.onRedirectNavigate;this.config.auth.onRedirectNavigate=B=>{const c=typeof Z=="function"?Z(B):void 0;return A.add({navigateCallbackResult:c!==!1}),A.event=A.end({success:!0},void 0,I.account)||A.event,c}}const d=this.getAllAccounts().length>0;try{hc(this.initialized,this.config),this.browserStorage.setInteractionInProgress(!0,Lg.SIGNIN),d?this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_START,k.Redirect,I):this.eventHandler.emitEvent(z.LOGIN_START,k.Redirect,I);let Z;return this.platformAuthProvider&&this.canUsePlatformBroker(I)?Z=new Bl(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,$.acquireTokenRedirect,this.performanceClient,this.platformAuthProvider,this.getNativeAccountId(I),this.nativeInternalStorage,g).acquireTokenRedirect(I,A).catch(c=>{if(A.add({brokerErrorName:c.name,brokerErrorCode:c.errorCode}),c instanceof Ng&&eC(c))return this.platformAuthProvider=void 0,this.createRedirectClient(g).acquireToken(I);if(c instanceof bg)return this.logger.verbose("acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow"),this.createRedirectClient(g).acquireToken(I);throw c}):Z=this.createRedirectClient(g).acquireToken(I),await Z}catch(Z){throw this.browserStorage.resetRequestCache(),A.event.status===2?this.performanceClient.startMeasurement(b.AcquireTokenRedirect,g).end({success:!1},Z,I.account):A.end({success:!1},Z,I.account),d?this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_FAILURE,k.Redirect,null,Z):this.eventHandler.emitEvent(z.LOGIN_FAILURE,k.Redirect,null,Z),Z}}acquireTokenPopup(I){const g=this.getRequestCorrelationId(I),A=this.performanceClient.startMeasurement(b.AcquireTokenPopup,g);A.add({scenarioId:I.scenarioId});try{this.logger.verbose("acquireTokenPopup called",g),PA(this.initialized,A,I.account),this.browserStorage.setInteractionInProgress(!0,Lg.SIGNIN)}catch(B){return Promise.reject(B)}const l=this.getAllAccounts();l.length>0?this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_START,k.Popup,I):this.eventHandler.emitEvent(z.LOGIN_START,k.Popup,I);let d;const Z=this.getPreGeneratedPkceCodes(g);return this.canUsePlatformBroker(I)?(A.add({isPlatformBrokerRequest:!0}),d=this.acquireTokenNative({...I,correlationId:g},$.acquireTokenPopup).then(B=>(A.end({success:!0},void 0,B.account),B)).catch(B=>{if(A.add({brokerErrorName:B.name,brokerErrorCode:B.errorCode}),B instanceof Ng&&eC(B))return this.platformAuthProvider=void 0,this.createPopupClient(g).acquireToken(I,Z);if(B instanceof bg)return this.logger.verbose("acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow"),this.createPopupClient(g).acquireToken(I,Z);throw B})):d=this.createPopupClient(g).acquireToken(I,Z),d.then(B=>(l.length<this.getAllAccounts().length?this.eventHandler.emitEvent(z.LOGIN_SUCCESS,k.Popup,B):this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_SUCCESS,k.Popup,B),A.end({success:!0,accessTokenSize:B.accessToken.length,idTokenSize:B.idToken.length},void 0,B.account),this.verifySsoCapability(B.account,k.Popup),B)).catch(B=>(l.length>0?this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_FAILURE,k.Popup,null,B):this.eventHandler.emitEvent(z.LOGIN_FAILURE,k.Popup,null,B),A.end({success:!1},B,I.account),Promise.reject(B))).finally(async()=>{this.browserStorage.setInteractionInProgress(!1),this.config.system.asyncPopups&&await this.preGeneratePkceCodes(g)})}trackStateChangeWithMeasurement(I){const g=this.ssoSilentMeasurement||this.acquireTokenByCodeAsyncMeasurement;g&&(I.type==="visibilitychange"?(this.logger.info("Perf: Visibility change detected in ",g.event.name),g.increment({visibilityChangeCount:1})):I.type==="online"?(this.logger.info("Perf: Online status change detected in ",g.event.name),g.increment({onlineStatusChangeCount:1})):I.type==="offline"&&(this.logger.info("Perf: Offline status change detected in ",g.event.name),g.increment({onlineStatusChangeCount:1})))}addStateChangeListeners(I){document.addEventListener("visibilitychange",I),window.addEventListener("online",I),window.addEventListener("offline",I)}removeStateChangeListeners(I){document.removeEventListener("visibilitychange",I),window.removeEventListener("online",I),window.removeEventListener("offline",I)}verifySsoCapability(I,g){if(!this.config.auth.verifySSO)return;const A=this.browserCrypto.createNewGuid(),l=this.performanceClient.startMeasurement(b.SsoCapable,A);l.add({parentApi:g}),this.logger.verbose(`SSO capability verification initiated after ${g}`,A),setTimeout(()=>{const d={account:I,correlationId:A};this.createSilentIframeClient(A).verifySso(d).then(B=>{this.logger.verbose(`SSO capability verification completed after ${g}, success: ${B}`,A),l.end({fromCache:!1,success:B},void 0,I)}).catch(B=>{this.logger.warning(`SSO capability verification failed after ${g}: ${B.message}`,A),l.end({fromCache:!1,success:!1},B,I)})}
20,0)}async ssoSilent(I){const g=this.getRequestCorrelationId(I),A={...I,prompt:I.prompt,correlationId:g};this.ssoSilentMeasurement=this.performanceClient.startMeasurement(b.SsoSilent,g),this.ssoSilentMeasurement?.add({scenarioId:I.scenarioId}),PA(this.initialized,this.ssoSilentMeasurement,I.account),this.ssoSilentMeasurement?.increment({visibilityChangeCount:0,onlineStatusChangeCount:0}),this.addStateChangeListeners(this.trackStateChangeWithMeasurement),this.logger.verbose("ssoSilent called",g),this.eventHandler.emitEvent(z.SSO_SILENT_START,k.Silent,A);let l;return this.canUsePlatformBroker(A)?(this.ssoSilentMeasurement?.add({isPlatformBrokerRequest:!0}),l=this.acquireTokenNative(A,$.ssoSilent).catch(d=>{if(this.ssoSilentMeasurement?.add({brokerErrorName:d.name,brokerErrorCode:d.errorCode}),d instanceof Ng&&eC(d))return this.platformAuthProvider=void 0,this.createSilentIframeClient(A.correlationId).acquireToken(A);throw d})):l=this.createSilentIframeClient(A.correlationId).acquireToken(A),l.then(d=>(this.eventHandler.emitEvent(z.SSO_SILENT_SUCCESS,k.Silent,d),this.ssoSilentMeasurement?.end({success:!0,accessTokenSize:d.accessToken.length,idTokenSize:d.idToken.length},void 0,d.account),d)).catch(d=>{throw this.eventHandler.emitEvent(z.SSO_SILENT_FAILURE,k.Silent,null,d),this.ssoSilentMeasurement?.end({success:!1},d,I.account),d}).finally(()=>{this.removeStateChangeListeners(this.trackStateChangeWithMeasurement)})}async acquireTokenByCode(I){const g=this.getRequestCorrelationId(I);this.logger.trace("acquireTokenByCode called",g);const A=this.performanceClient.startMeasurement(b.AcquireTokenByCode,g);PA(this.initialized,A),this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_BY_CODE_START,k.Silent,I),A.add({scenarioId:I.scenarioId});try{if(I.code&&I.nativeAccountId)throw H(_V);if(I.code){const l=I.code;let d=this.hybridAuthCodeResponses.get(l);return d?(this.logger.verbose("Existing acquireTokenByCode request found",g),A.discard()):(this.logger.verbose("Initiating new acquireTokenByCode request",g),d=this.acquireTokenByCodeAsync({...I,correlationId:g}).then(Z=>(this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_BY_CODE_SUCCESS,k.Silent,Z),this.hybridAuthCodeResponses.delete(l),A.end({success:!0,accessTokenSize:Z.accessToken.length,idTokenSize:Z.idToken.length},void 0,Z.account),Z)).catch(Z=>{throw this.hybridAuthCodeResponses.delete(l),this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_BY_CODE_FAILURE,k.Silent,null,Z),A.end({success:!1},Z),Z}),this.hybridAuthCodeResponses.set(l,d)),await d}else if(I.nativeAccountId)if(this.canUsePlatformBroker(I,I.nativeAccountId)){A.add({isPlatformBrokerRequest:!0});const l=await this.acquireTokenNative({...I,correlationId:g},$.acquireTokenByCode,I.nativeAccountId).catch(d=>{throw d instanceof Ng&&eC(d)&&(this.platformAuthProvider=void 0),A.add({brokerErrorName:d.name,brokerErrorCode:d.errorCode}),d});return A.end({success:!0},void 0,l.account),l}else throw H(qV);else throw H(fV)}catch(l){throw this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_BY_CODE_FAILURE,k.Silent,null,l),A.end({success:!1},l),l}}async acquireTokenByCodeAsync(I){return this.logger.trace("acquireTokenByCodeAsync called",I.correlationId),this.acquireTokenByCodeAsyncMeasurement=this.performanceClient.startMeasurement(b.AcquireTokenByCodeAsync,I.correlationId),this.acquireTokenByCodeAsyncMeasurement?.increment({visibilityChangeCount:0,onlineStatusChangeCount:0}),this.addStateChangeListeners(this.trackStateChangeWithMeasurement),await this.createSilentAuthCodeClient(I.correlationId).acquireToken(I).then(l=>(this.acquireTokenByCodeAsyncMeasurement?.end({success:!0,fromCache:l.fromCache}),l)).catch(l=>{throw this.acquireTokenByCodeAsyncMeasurement?.end({success:!1},l),l}).finally(()=>{this.removeStateChangeListeners(this.trackStateChangeWithMeasurement)})}async acquireTokenFromCache(I,g){switch(this.performanceClient.addQueueMeasurement(b.AcquireTokenFromCache,I.correlationId),g){case pI.Default:case pI.AccessToken:case pI.AccessTokenAndRefreshToken:const A=this.createSilentCacheClient(I.correlationId);return a(A.acquireToken.bind(A),b.SilentCacheClientAcquireToken,this.logger,this.performanceClient,I.correlationId)(I);default:throw e(xg)}}async acquireTokenByRefreshToken(I,g){switch(this.performanceClient.addQueueMeasurement(b.AcquireTokenByRefreshToken,I.correlationId),g){case pI.Default:case pI.AccessTokenAndRefreshToken:case pI.RefreshToken:case pI.RefreshTokenAndNetwork:const A=this.createSilentRefreshClient(I.correlationId);return a(A.acquireToken.bind(A),b.SilentRefreshClientAcquireToken,this.logger,this.performanceClient,I.correlationId)(I);default:throw e(xg)}}async acquireTokenBySilentIframe(I){this.performanceClient.addQueueMeasurement(b.AcquireTokenBySilentIframe,I.correlationId);const g=this.createSilentIframeClient(I.correlationId);return a(g.acquireToken.bind(g),b.SilentIframeClientAcquireToken,this.logger,this.performanceClient,I.correlationId)(I)}async logout(I){const g=this.getRequestCorrelationId(I);return this.logger.warning("logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.",g),this.logoutRedirect({correlationId:g,...I})}async logoutRedirect(I){const g=this.getRequestCorrelationId(I);return hc(this.initialized,this.config),this.browserStorage.setInteractionInProgress(!0,Lg.SIGNOUT),this.createRedirectClient(g).logout(I)}logoutPopup(I){try{const g=this.getRequestCorrelationId(I);return HB(this.initialized),this.browserStorage.setInteractionInProgress(!0,Lg.SIGNOUT),this.createPopupClient(g).logout(I).finally(()=>{this.browserStorage.setInteractionInProgress(!1)})}catch(g){return Promise.reject(g)}}async clearCache(I){if(!this.isBrowserEnvironment){this.logger.info("in non-browser environment, returning early.");return}const g=this.getRequestCorrelationId(I);return this.createSilentCacheClient(g).logout(I)}getAllAccounts(I){const g=this.getRequestCorrelationId();return DN(this.logger,this.browserStorage,this.isBrowserEnvironment,g,I)}getAccount(I){const g=this.getRequestCorrelationId();return MN(I,this.logger,this.browserStorage,g)}getAccountByUsername(I){const g=this.getRequestCorrelationId();return HN(I,this.logger,this.browserStorage,g)}getAccountByHomeId(I){const g=this.getRequestCorrelationId();return uN(I,this.logger,this.browserStorage,g)}getAccountByLocalId(I){const g=this.getRequestCorrelationId();return pN(I,this.logger,this.browserStorage,g)}setActiveAccount(I){const g=this.getRequestCorrelationId();KN(I,this.browserStorage,g)}getActiveAccount(){const I=this.getRequestCorrelationId();return kN(this.browserStorage,I)}async hydrateCache(I,g){this.logger.verbose("hydrateCache called");const A=mI.createFromAccountInfo(I.account,I.cloudGraphHostName,I.msGraphHost);return await this.browserStorage.setAccount(A,I.correlationId,wg(I.idTokenClaims),$.hydrateCache),I.fromNativeBroker?(this.logger.verbose("Response was from native broker, storing in-memory"),this.nativeInternalStorage.hydrateCache(I,g)):this.browserStorage.hydrateCache(I,g)}async acquireTokenNative(I,g,A,l){if(this.logger.trace("acquireTokenNative called"),!this.platformAuthProvider)throw H(wB);return new Bl(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,g,this.performanceClient,this.platformAuthProvider,A||this.getNativeAccountId(I),this.nativeInternalStorage,I.correlationId).acquireToken(I,l)}canUsePlatformBroker(I,g){if(this.logger.trace("canUsePlatformBroker called"),!this.platformAuthProvider)return this.logger.trace("canUsePlatformBroker: platform broker unavilable, returning false"),!1;if(!mA(this.config,this.logger,this.platformAuthProvider,I.authenticationScheme))return this.logger.trace("canUsePlatformBroker: isBrokerAvailable returned false, returning false"),!1;if(I.prompt)switch(I.prompt){case SI.NONE:case SI.CONSENT:case SI.LOGIN:case SI.SELECT_ACCOUNT:this.logger.trace("canUsePlatformBroker: prompt is compatible with platform broker flow");break;default:return this.logger.trace(`canUsePlatformBroker: prompt = ${I.prompt} is not compatible with platform broker flow, returning false`),!1}return!g&&!this.getNativeAccountId(I)?(this.logger.trace("canUsePlatformBroker: nativeAccountId is not available, returning false"),!1):!0}
20getNativeAccountId(I){const g=I.account||this.getAccount({loginHint:I.loginHint,sid:I.sid})||this.getActiveAccount();return g&&g.nativeAccountId||""}createPopupClient(I){return new BY(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.nativeInternalStorage,this.platformAuthProvider,I)}createRedirectClient(I){return new iY(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.nativeInternalStorage,this.platformAuthProvider,I)}createSilentIframeClient(I){return new sY(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,$.ssoSilent,this.performanceClient,this.nativeInternalStorage,this.platformAuthProvider,I)}createSilentCacheClient(I){return new hG(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.platformAuthProvider,I)}createSilentRefreshClient(I){return new bY(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,this.performanceClient,this.platformAuthProvider,I)}createSilentAuthCodeClient(I){return new mY(this.config,this.browserStorage,this.browserCrypto,this.logger,this.eventHandler,this.navigationClient,$.acquireTokenByCode,this.performanceClient,this.platformAuthProvider,I)}addEventCallback(I,g){return this.eventHandler.addEventCallback(I,g)}removeEventCallback(I){this.eventHandler.removeEventCallback(I)}addPerformanceCallback(I){return bG(),this.performanceClient.addPerformanceCallback(I)}removePerformanceCallback(I){return this.performanceClient.removePerformanceCallback(I)}enableAccountStorageEvents(){if(this.config.cache.cacheLocation!==XI.LocalStorage){this.logger.info("Account storage events are only available when cacheLocation is set to localStorage");return}this.eventHandler.subscribeCrossTab()}disableAccountStorageEvents(){if(this.config.cache.cacheLocation!==XI.LocalStorage){this.logger.info("Account storage events are only available when cacheLocation is set to localStorage");return}this.eventHandler.unsubscribeCrossTab()}getTokenCache(){return this.tokenCache}getLogger(){return this.logger}setLogger(I){this.logger=I}initializeWrapperLibrary(I,g){this.browserStorage.setWrapperMetadata(I,g)}setNavigationClient(I){this.navigationClient=I}getConfiguration(){return this.config}getPerformanceClient(){return this.performanceClient}isBrowserEnv(){return this.isBrowserEnvironment}getRequestCorrelationId(I){return I?.correlationId?I.correlationId:this.isBrowserEnvironment?hg():Y.EMPTY_STRING}async loginRedirect(I){const g=this.getRequestCorrelationId(I);return this.logger.verbose("loginRedirect called",g),this.acquireTokenRedirect({correlationId:g,...I||Qc})}loginPopup(I){const g=this.getRequestCorrelationId(I);return this.logger.verbose("loginPopup called",g),this.acquireTokenPopup({correlationId:g,...I||Qc})}async acquireTokenSilent(I){const g=this.getRequestCorrelationId(I),A=this.performanceClient.startMeasurement(b.AcquireTokenSilent,g);A.add({cacheLookupPolicy:I.cacheLookupPolicy,scenarioId:I.scenarioId}),PA(this.initialized,A,I.account),this.logger.verbose("acquireTokenSilent called",g);const l=I.account||this.getActiveAccount();if(!l)throw H(EV);return this.acquireTokenSilentDeduped(I,l,g).then(d=>(A.end({success:!0,fromCache:d.fromCache,accessTokenSize:d.accessToken.length,idTokenSize:d.idToken.length},void 0,d.account),{...d,state:I.state,correlationId:g})).catch(d=>{throw d instanceof FI&&d.setCorrelationId(g),A.end({success:!1},d,l),d})}async acquireTokenSilentDeduped(I,g,A){const l=fl(this.config.auth.clientId,{...I,authority:I.authority||this.config.auth.authority},g.homeAccountId),d=JSON.stringify(l),Z=this.activeSilentTokenRequests.get(d);if(typeof Z>"u"){this.logger.verbose("acquireTokenSilent called for the first time, storing active request",A),this.performanceClient.addFields({deduped:!1},A);const B=a(this.acquireTokenSilentAsync.bind(this),b.AcquireTokenSilentAsync,this.logger,this.performanceClient,A)({...I,correlationId:A},g);return this.activeSilentTokenRequests.set(d,B),B.finally(()=>
20{this.activeSilentTokenRequests.delete(d)})}else return this.logger.verbose("acquireTokenSilent has been called previously, returning the result from the first call",A),this.performanceClient.addFields({deduped:!0},A),Z}async acquireTokenSilentAsync(I,g){const A=B=>this.trackStateChange(I.correlationId,B);this.performanceClient.addQueueMeasurement(b.AcquireTokenSilentAsync,I.correlationId),this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_START,k.Silent,I),I.correlationId&&this.performanceClient.incrementFields({visibilityChangeCount:0,onlineStatusChangeCount:0},I.correlationId),this.addStateChangeListeners(A);const l=await a(LN,b.InitializeSilentRequest,this.logger,this.performanceClient,I.correlationId)(I,g,this.config,this.performanceClient,this.logger),d=I.cacheLookupPolicy||pI.Default;return this.acquireTokenSilentNoIframe(l,d).catch(async B=>{if(QY(B,d)){const i=`${B.errorCode}${B.subError?`|${B.subError}`:""}`;if(this.performanceClient.addFields({silentRefreshReason:i},l.correlationId),this.activeIframeRequest)if(d!==pI.Skip){const[F,V]=this.activeIframeRequest;this.logger.verbose(`Iframe request is already in progress, awaiting resolution for request with correlationId: ${V}`,l.correlationId);const W=this.performanceClient.startMeasurement(b.AwaitConcurrentIframe,l.correlationId);W.add({awaitIframeCorrelationId:V});const G=await F;if(W.end({success:G}),G)return this.logger.verbose(`Parallel iframe request with correlationId: ${V} succeeded. Retrying cache and/or RT redemption`,l.correlationId),this.acquireTokenSilentNoIframe(l,d);throw this.logger.info(`Iframe request with correlationId: ${V} failed. Interaction is required.`),B}else return this.logger.warning("Another iframe request is currently in progress and CacheLookupPolicy is set to Skip. This may result in degraded performance and/or reliability for both calls. Please consider changing the CacheLookupPolicy to take advantage of request queuing and token cache.",l.correlationId),a(this.acquireTokenBySilentIframe.bind(this),b.AcquireTokenBySilentIframe,this.logger,this.performanceClient,l.correlationId)(l);else{let F;return this.activeIframeRequest=[new Promise(V=>{F=V}),l.correlationId],this.logger.verbose("Refresh token expired/invalid or CacheLookupPolicy is set to Skip, attempting acquire token by iframe.",l.correlationId),a(this.acquireTokenBySilentIframe.bind(this),b.AcquireTokenBySilentIframe,this.logger,this.performanceClient,l.correlationId)(l).then(V=>(F(!0),V)).catch(V=>{throw F(!1),V}).finally(()=>{this.activeIframeRequest=void 0})}}else throw B}).then(B=>(this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_SUCCESS,k.Silent,B),this.performanceClient.addFields({fromCache:B.fromCache},I.correlationId),B)).catch(B=>{throw this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_FAILURE,k.Silent,null,B),B}).finally(()=>{this.removeStateChangeListeners(A)})}async acquireTokenSilentNoIframe(I,g){return mA(this.config,this.logger,this.platformAuthProvider,I.authenticationScheme)&&I.account.nativeAccountId?(this.logger.verbose("acquireTokenSilent - attempting to acquire token from native platform"),this.performanceClient.addFields({isPlatformBrokerRequest:!0},I.correlationId),this.acquireTokenNative(I,$.acquireTokenSilent_silentFlow,I.account.nativeAccountId,g).catch(async A=>{throw this.performanceClient.addFields({brokerErrorName:A.name,brokerErrorCode:A.errorCode},I.correlationId),A instanceof Ng&&eC(A)?(this.logger.verbose("acquireTokenSilent - native platform unavailable, falling back to web flow"),this.platformAuthProvider=void 0,e(xg)):A})):(this.logger.verbose("acquireTokenSilent - attempting to acquire token from web flow"),g===pI.AccessToken&&this.logger.verbose("acquireTokenSilent - cache lookup policy set to AccessToken, attempting to acquire token from local cache"),a(this.acquireTokenFromCache.bind(this),b.AcquireTokenFromCache,this.logger,this.performanceClient,I.correlationId)(I,g).catch(A=>{if(g===pI.AccessToken)throw A;return this.eventHandler.emitEvent(z.ACQUIRE_TOKEN_NETWORK_START,k.Silent,I),a(this.acquireTokenByRefreshToken.bind(this),b.AcquireTokenByRefreshToken,this.logger,this.performanceClient,I.correlationId)(I,g)}))}async preGeneratePkceCodes(I){return this.logger.verbose("Generating new PKCE codes"),this.pkceCode=await a(_g,b.GeneratePkceCodes,this.logger,this.performanceClient,I)(this.performanceClient,this.logger,I),Promise.resolve()}getPreGeneratedPkceCodes(I){this.logger.verbose("Attempting to pick up pre-generated PKCE codes");const g=this.pkceCode?{...this.pkceCode}:void 0;return this.pkceCode=void 0,this.logger.verbose(`${g?"Found":"Did not find"} pre-generated PKCE codes`),this.performanceClient.addFields({usePreGeneratedPkce:!!g},I),g}logMultipleInstances(I){const g=this.config.auth.clientId;if(!window)return;window.msal=window.msal||{},window.msal.clientIds=window.msal.clientIds||[],window.msal.clientIds.length>0&&this.logger.verbose("There is already an instance of MSAL.js in the window."),window.msal.clientIds.push(g),nY(g,I,this.logger)}}
20function QY(C,I){const g=!(C instanceof bg&&C.subError!==ql),A=C.errorCode===jI.INVALID_GRANT_ERROR||C.errorCode===xg,l=g&&A||C.errorCode===wl||C.errorCode===WB,d=_a.includes(I);return l&&d}async function aY(C,I){const g=new sC(C);return await g.initialize(),dd.createController(g,I)}class EB{static async createPublicClientApplication(I){const g=await aY(I);return new EB(I,g)}constructor(I,g){this.isBroker=!1,this.controller=g||new dd(new sC(I))}async initialize(I){return this.controller.initialize(I,this.isBroker)}async acquireTokenPopup(I){return this.controller.acquireTokenPopup(I)}acquireTokenRedirect(I){return this.controller.acquireTokenRedirect(I)}acquireTokenSilent(I){return this.controller.acquireTokenSilent(I)}acquireTokenByCode(I){return this.controller.acquireTokenByCode(I)}addEventCallback(I,g){return this.controller.addEventCallback(I,g)}removeEventCallback(I){return this.controller.removeEventCallback(I)}addPerformanceCallback(I){return this.controller.addPerformanceCallback(I)}removePerformanceCallback(I){return this.controller.removePerformanceCallback(I)}enableAccountStorageEvents(){this.controller.enableAccountStorageEvents()}disableAccountStorageEvents(){this.controller.disableAccountStorageEvents()}getAccount(I){return this.controller.getAccount(I)}getAccountByHomeId(I){return this.controller.getAccountByHomeId(I)}getAccountByLocalId(I){return this.controller.getAccountByLocalId(I)}getAccountByUsername(I){return this.controller.getAccountByUsername(I)}getAllAccounts(I){return this.controller.getAllAccounts(I)}handleRedirectPromise(I){return this.controller.handleRedirectPromise(I)}loginPopup(I){return this.controller.loginPopup(I)}loginRedirect(I){return this.controller.loginRedirect(I)}logout(I){return this.controller.logout(I)}logoutRedirect(I){return this.controller.logoutRedirect(I)}logoutPopup(I){return this.controller.logoutPopup(I)}ssoSilent(I){return this.controller.ssoSilent(I)}getTokenCache(){return this.controller.getTokenCache()}getLogger(){return this.controller.getLogger()}setLogger(I){this.controller.setLogger(I)}setActiveAccount(I){this.controller.setActiveAccount(I)}getActiveAccount(){return this.controller.getActiveAccount()}initializeWrapperLibrary(I,g){return this.controller.initializeWrapperLibrary(I,g)}setNavigationClient(I){this.controller.setNavigationClient(I)}getConfiguration(){return this.controller.getConfiguration()}async hydrateCache(I,g){return this.controller.hydrateCache(I,g)}clearCache(I){return this.controller.clearCache(I)}}const NY=WI(async()=>{let C,I;const g=og(),A={auth:{clientId:g.public.azure.clientId,authority:g.public.azure.authority,redirectUri:g.public.appUrl+"/auth/callback",postLogoutRedirectUri:g.public.appUrl+"/auth/signout",navigateToLoginRequestUrl:!1},cache:{cacheLocation:XI.LocalStorage,storeAuthStateInCookie:!1},system:{allowPlatformBroker:!1,loggerOptions:{loggerCallback(d,Z,B){},piiLoggingEnabled:!0,logLevel:GI.Error}}},l=new EB(A);try{[C,I]=Og(()=>l.initialize()),await C,I()}catch{}return{provide:{msal:l,msalLoginRequest:{scopes:[g.public.azure.apiScope]},msalInteraction:k}}}),YY={class:"pdf-vue3-main",style:{height:"100%",position:"relative","min-height":"10px"}},wY={class:"pdf-vue3-container",style:{height:"100%"}},hY={key:0,class:"pdf-vue3-progress",style:{position:"absolute",left:"0",top:"0",width:"100%","user-select":"none","pointer-events":"none"}},eY={key:1,class:"pdf-vue3-pageTooltip",style:{position:"absolute",left:"12px",top:"12px",width:"calc(100% - 12px)","user-select":"none","pointer-events":"none"}},JY={key:1,style:{width:"50px",height:"50px",background:"rgba(0, 0, 0, 0.4)",color:"#ffffff","font-size":"16px","border-radius":"50%",display:"flex","justify-content":"center","align-items":"center"}},SY=aI("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[aI("path",{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M11.0001 22.2877H13.0001V7.80237L16.2428 11.045L17.657 9.63079L12.0001 3.97394L6.34326 9.63079L7.75748 11.045L11.0001 7.80236V22.2877ZM18 3H6V1H18V3Z",fill:"currentColor"})],-1),XY=[SY],yY=Bg({__name:"pdf-vue3",props:{src:{default:void 0},httpHeaders:{default:void 0},withCredentials:{type:Boolean,default:void 0},password:{default:void 0},useSystemFonts:{type:Boolean,default:void 0},stopAtErrors:{type:Boolean,default:void 0},disableFontFace:{type:Boolean,default:void 0},disableRange:{type:Boolean,default:void 0},disableStream:{type:Boolean,default:void 0},disableAutoFetch:{type:Boolean,default:void 0},showProgress:{type:Boolean,default:!0},progressColor:{default:"#87ceeb"},showPageTooltip:{type:Boolean,default:!0},showBackToTopBtn:{type:Boolean,default:!0},scrollThreshold:{default:300},pdfWidth:{default:"100%"},rowGap:{default:8},page:{default:1},cMapUrl:{default:"https://unpkg.com/[email protected]/cmaps/"},scale:{default:1},virtual:{type:Boolean,default:!0},preloadPages:{default:2},workerSrc:{default:void 0}},emits:["onProgress","onComplete","onScroll","onPageChange","onPdfInit","onError"],setup(C,{expose:I,emit:g}){const A=C;let l,d;const Z=f(1),B=v(()=>{const U=Number(A.rowGap);return Number.isFinite(U)?Math.max(0,U):8}),c=v(()=>{const U=Number(A.preloadPages);return Number.isFinite(U)?Math.max(0,Math.floor(U)):0}),i=v(()=>{const U=Number(A.scale);return Number.isFinite(U)&&U>0?U:1}),F=fG(),V=f(0);let W=null,G=null,R=0,s=0;const Q=f(0),m=f(1),n=f(0),o=OI([]),w=OI([]),J=new Map,K=f(),t=f(),u=f(!1),E=f(!1),r=f(!1);let AI=null;const PI=U=>/^data:/i.test(U),fI=U=>{const S=(U.includes(",")?U.split(",")[1]:U).replace(/\s/g,"");return S.length>32&&S.startsWith("JVBERi0")&&/^[A-Za-z0-9+/=]+$/.test(S)},Hg=U=>{const S=(U.includes(",")?U.split(",")[1]:U).replace(/\s/g,""),y=atob(S),D=new Uint8Array(y.length);for(let T=0;T<y.length;T++)D[T]=y.charCodeAt(T);return D},Cg=()=>{const U={httpHeaders:A.httpHeaders,withCredentials:A.withCredentials,password:A.password,useSystemFonts:A.useSystemFonts,stopAtErrors:A.stopAtErrors,disableFontFace:A.disableFontFace,disableRange:A.disableRange,disableStream:A.disableStream,disableAutoFetch:A.disableAutoFetch,cMapUrl:A.cMapUrl,cMapPacked:!0};A.src instanceof Uint8Array?U.data=A.src:typeof A.src=="string"&&(PI(A.src)||fI(A.src)?U.data=Hg(A.src):U.url=A.src);for(const S in U)U[S]===void 0&&delete U[S];return U},cg=U=>typeof U=="string"&&U.length>0||U instanceof Uint8Array,QI=()=>{o.value=[],w.value=[],J.clear(),Ag.value=[],CC.value=0,Q.value=0,m.value=1,n.value=0,r.value=!1,AI=null},mC=()=>
20{if(u.value)return null;JA();const U=++R,S=Cg();V.value=0;try{W=d(S);const y=W;return W.onProgress=D=>{if(u.value||U!==R||W!==y)return;const T=D.total||0,II=D.loaded||0,dI=T>0?II/T*100:0;V.value=dI>=100?100:dI,g("onProgress",V.value)},W.promise.then(()=>{u.value||U!==R||W!==y||(V.value=100,g("onComplete"))},D=>{u.value||U!==R||W!==y||g("onError",D)}),U}catch(y){return g("onError",y),null}},eA=U=>{var S;const y=(((S=t.value)==null?void 0:S.clientWidth)||0)-4;return y<=0||U<=0?i.value:y/U*i.value},Ag=OI([]),CC=f(0),nC=()=>{const U=o.value,S=new Array(U.length);let y=0;for(let D=0;D<U.length;D++)S[D]=y,y+=U[D].renderHeight+B.value;Ag.value=S,CC.value=Math.max(y-B.value,0)},xC=async(U,S)=>{if(!S||U!==R)return;const y=S.numPages,D=[];for(let T=1;T<=y;T++){if(u.value||U!==R)return;let II=null;try{const dI=await S.getPage(T);if(II=dI,u.value||U!==R){try{dI.cleanup()}catch{}return}const gI=dI.getViewport({scale:1}),VI=eA(gI.width);D.push({baseWidth:gI.width,baseHeight:gI.height,fitScale:VI,finalScale:VI*Z.value,renderWidth:gI.width*VI,renderHeight:gI.height*VI,rendered:!1,inView:!1}),dI.cleanup(),II=null}catch(dI){if(u.value||U!==R){try{II?.cleanup()}catch{}return}g("onError",dI),D.push({baseWidth:595,baseHeight:842,fitScale:1,finalScale:Z.value,renderWidth:595,renderHeight:842,rendered:!1,inView:!1})}}u.value||U!==R||(o.value=D,w.value=new Array(D.length).fill(null),nC())},_I=new Map,ig=new Map,eI=new Map,N=new Map,p=async U=>{const S=ig.get(U);if(S)try{await S}catch{}},M=U=>{const S=_I.get(U);if(S){try{S.cancel()}catch{}return p(U)}return Promise.resolve()},L=U=>{var S;const y=w.value[U];return!!((S=o.value[U])!=null&&S.rendered)||_I.has(U)||ig.has(U)||eI.has(U)||N.has(U)||!!(y&&(y.width||y.height))},q=async(U,S=s)=>{const y=o.value[U];y&&(y.rendered=!1);const D=N.get(U),T=w.value[U];if(await M(U),!(u.value||S!==s)){if(D&&N.get(U)===D){try{D.cleanup()}catch{}N.delete(U)}if(T){const II=T.getContext("2d");if(II)try{II.clearRect(0,0,T.width,T.height)}catch{}T.width=0,T.height=0}}},RI=async(U,S=s)=>{if(u.value||S!==s||!G)return;const y=o.value[U];if(!y||y.rendered||eI.get(U)===S)return;const D=w.value[U];if(!D)return;if(eI.set(U,S),await M(U),u.value||S!==s||!G){eI.get(U)===S&&eI.delete(U);return}const T=w.value[U];if(!T||T!==D||o.value[U]!==y){eI.get(U)===S&&eI.delete(U);return}let II=null;try{const dI=await G.getPage(U+1);if(II=dI,u.value||S!==s||w.value[U]!==D){try{dI.cleanup()}catch{}return}N.set(U,dI);const gI=y.finalScale,VI=dI.getViewport({scale:gI});D.width=VI.width,D.height=VI.height,D.style.width=y.renderWidth+"px",D.style.height=y.renderHeight+"px";const PC=D.getContext("2d");if(!PC)return;const fC=dI.render({canvasContext:PC,viewport:VI});_I.set(U,fC);const OB=fC.promise.catch(()=>{}).finally(()=>{_I.get(U)===fC&&_I.delete(U),ig.get(U)===OB&&ig.delete(U)});if(ig.set(U,OB),await fC.promise,_I.get(U)===fC&&_I.delete(U),u.value||S!==s||w.value[U]!==D||o.value[U]!==y)return;y.rendered=!0}catch(dI){if(dI?.name==="RenderingCancelledException")return;g("onError",dI)}finally{if(eI.get(U)===S&&eI.delete(U),N.get(U)===II){try{II?.cleanup()}catch{}N.delete(U)}}},_=f(0),O=f(!1),oI=()=>{const U=Ag.value,S=o.value;if(!U.length||!S.length||!K.value)return{start:0,end:-1};const y=K.value.scrollTop,D=y+K.value.clientHeight;let T=0,II=S.length-1;for(let gI=0;gI<U.length;gI++)if(U[gI]+S[gI].renderHeight>=y){T=gI;break}for(let gI=T;gI<U.length;gI++)if(U[gI]>D){II=gI-1;break}II<T&&(II=T);const dI=c.value;return{start:Math.max(0,T-dI),end:Math.min(S.length-1,II+dI)}},mg=()=>{if(u.value)return;const U=o.value;if(!U.length)return;const S=s,{start:y,end:D}=oI(),T=A.virtual!==!1,II=T?y:0,dI=T?D:U.length-1;for(let gI=0;gI<U.length;gI++){const VI=U[gI],PC=gI>=II&&gI<=dI;PC&&!VI.inView?VI.inView=!0:!PC&&VI.inView&&(VI.inView=!1)}o.value=[...U],Rg(()=>{if(!(u.value||S!==s)){for(let gI=II;gI<=dI;gI++){const VI=U[gI];VI&&!VI.rendered&&RI(gI,S)}if(T){const gI=c.value+2;for(let VI=0;VI<U.length;VI++)(VI<II-gI||VI>dI+gI)&&L(VI)&&q(VI,S)}}})};let JI;const DG=U=>{var S;if(!K.value)return;O.value=!0,clearTimeout(JI),JI=window.setTimeout(()=>{O.value=!1},1e3);const y=U.target;
20if(n.value=y.scrollTop,g("onScroll",y.scrollTop),K.value.scrollTop+K.value.offsetHeight>=K.value.scrollHeight-10)m.value=o.value.length;else{const D=Ag.value,T=o.value;for(let II=0;II<D.length;II++)if(D[II]+(((S=T[II])==null?void 0:S.renderHeight)||0)>y.scrollTop+4){m.value=II+1;break}}mg()},JA=()=>{var U;R++,s++,eI.clear();for(const S of Array.from(_I.keys()))M(S);for(const S of Array.from(N.keys()))try{(U=N.get(S))==null||U.cleanup()}catch{}if(N.clear(),G){try{G.cleanup()}catch{}try{G.destroy()}catch{}G=null}if(W){try{W.destroy()}catch{}W=null}},rB=async U=>{if(U!==null){r.value=!1;try{const S=W;if(!S)return;const y=await S.promise;if(u.value||U!==R||W!==S||(G=y,Q.value=y.numPages,g("onPdfInit",y),await xC(U,y),u.value||U!==R||G!==y))return;await Rg(),HG(),mg(),U===R&&G===y&&(r.value=!0)}catch(S){if(S?.name==="RenderingCancelledException"||U!==R)return;g("onError",S)}}},jB=f(0),MG=f(0),SA=()=>{typeof window>"u"||!t.value||(jB.value=window.innerWidth,MG.value=t.value.offsetWidth)},Zd=()=>{const U=o.value;if(!U.length){SA();return}const S=++s;eI.clear(),SA();for(let y=0;y<U.length;y++){const D=U[y],T=eA(D.baseWidth);D.fitScale=T,D.finalScale=T*Z.value,D.renderWidth=D.baseWidth*T,D.renderHeight=D.baseHeight*T,q(y,S)}o.value=[...U],nC(),mg()};let Bd;const cd=()=>{clearTimeout(Bd),Bd=window.setTimeout(()=>{u.value||(_.value=window.innerHeight,Zd())},200)},XA=f(!1),HG=()=>{if(!A.page||!o.value.length)return;let U=Math.max(1,Math.min(A.page,o.value.length));U!==m.value&&tA(U)};Lc(async()=>{if(!(typeof window>"u"))try{const U=await h(()=>import("./C2x26wjn.js"),[],import.meta.url);l=U.GlobalWorkerOptions,d=U.getDocument;let S=A.workerSrc;if(S||(S=new URL("data:application/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDI0IE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KCi8qKioqKiovIHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHsKCi8qKiovIDkzMDY6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkwMSk7CnZhciB0cnlUb1N0cmluZyA9IF9fd2VicGFja19yZXF1aXJlX18oNjgyMyk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKCi8vIGBBc3NlcnQ6IElzQ2FsbGFibGUoYXJndW1lbnQpIGlzIHRydWVgCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgaWYgKGlzQ2FsbGFibGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7CiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IodHJ5VG9TdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYSBmdW5jdGlvbicpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMzUwNjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBpc1Bvc3NpYmxlUHJvdG90eXBlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOTI1KTsKCnZhciAkU3RyaW5nID0gU3RyaW5nOwp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgaWYgKGlzUG9zc2libGVQcm90b3R5cGUoYXJndW1lbnQpKSByZXR1cm4gYXJndW1lbnQ7CiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoIkNhbid0IHNldCAiICsgJFN0cmluZyhhcmd1bWVudCkgKyAnIGFzIGEgcHJvdG90eXBlJyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA3MDgwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGhhcyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0MDIpLmhhcyk7CgovLyBQZXJmb3JtID8gUmVxdWlyZUludGVybmFsU2xvdChNLCBbW1NldERhdGFdXSkKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICBoYXMoaXQpOwogIHJldHVybi
20BpdDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDY3OToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjI1KTsKCnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFByb3RvdHlwZSkgewogIGlmIChpc1Byb3RvdHlwZU9mKFByb3RvdHlwZSwgaXQpKSByZXR1cm4gaXQ7CiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0luY29ycmVjdCBpbnZvY2F0aW9uJyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA4NTUxOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7Cgp2YXIgJFN0cmluZyA9IFN0cmluZzsKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7CgovLyBgQXNzZXJ0OiBUeXBlKGFyZ3VtZW50KSBpcyBPYmplY3RgCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgaWYgKGlzT2JqZWN0KGFyZ3VtZW50KSkgcmV0dXJuIGFyZ3VtZW50OwogIHRocm93IG5ldyAkVHlwZUVycm9yKCRTdHJpbmcoYXJndW1lbnQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA3ODExOgovKioqLyAoKG1vZHVsZSkgPT4gewoKCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby10eXBlZC1hcnJheXMgLS0gc2FmZQptb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBBcnJheUJ1ZmZlciAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgRGF0YVZpZXcgIT0gJ3VuZGVmaW5lZCc7CgoKLyoqKi8gfSksCgovKioqLyA3Mzk0OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjcwNik7CnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTk1KTsKCnZhciBBcnJheUJ1ZmZlciA9IGdsb2JhbFRoaXMuQXJyYXlCdWZmZXI7CnZhciBUeXBlRXJyb3IgPSBnbG9iYWxUaGlzLlR5cGVFcnJvcjsKCi8vIEluY2x1ZGVzCi8vIC0gUGVyZm9ybSA/IFJlcXVpcmVJbnRlcm5hbFNsb3QoTywgW1tBcnJheUJ1ZmZlckRhdGFdXSkuCi8vIC0gSWYgSXNTaGFyZWRBcnJheUJ1ZmZlcihPKSBpcyB0cnVlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uCm1vZHVsZS5leHBvcnRzID0gQXJyYXlCdWZmZXIgJiYgdW5jdXJyeVRoaXNBY2Nlc3NvcihBcnJheUJ1ZmZlci5wcm90b3R5cGUsICdieXRlTGVuZ3RoJywgJ2dldCcpIHx8IGZ1bmN0aW9uIChPKSB7CiAgaWYgKGNsYXNzb2YoTykgIT09ICdBcnJheUJ1ZmZlcicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5QnVmZmVyIGV4cGVjdGVkJyk7CiAgcmV0dXJuIE8uYnl0ZUxlbmd0aDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDMyMzg6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ3Nik7CnZhciBhcnJheUJ1ZmZlckJ5dGVMZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDczOTQpOwoKdmFyIEFycmF5QnVmZmVyID0gZ2xvYmFsVGhpcy5BcnJheUJ1ZmZlcjsKdmFyIEFycmF5QnVmZmVyUHJvdG90eXBlID0gQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIucHJvdG90eXBlOwp2YXIgc2xpY2UgPSBBcnJheUJ1ZmZlclByb3RvdHlwZSAmJiB1bmN1cnJ5VGhpcyhBcnJheUJ1ZmZlclByb3RvdHlwZS5zbGljZSk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPKSB7CiAgaWYgKGFycmF5QnVmZmVyQnl0ZUxlbmd0aChPKSAhPT0gMCkgcmV0dXJuIGZhbHNlOwogIGlmICghc2xpY2UpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgc2xpY2UoTywgMCwgMCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovIDUxNjk6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgaXNEZXRhY2hlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzIzOCk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKGlzRGV0YWNoZWQoaXQpKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQXJyYXlCdWZmZXIgaXMgZGV0YWNoZWQnKTsKICByZXR1cm4gaXQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyA1NjM2OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MDQpOwp2YXIgdW5jdXJyeVRoaXNBY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjcwNik7CnZhciB0b0luZGV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3Njk2KTsKdmFyIG5vdERldGFjaGVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTY5KTsKdmFyIGFycmF5QnVmZmVyQnl0ZUxlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNzM5NCk7CnZhciBkZXRhY2hUcmFuc2ZlcmFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0ODMpOwp2YXIgUFJPUEVSX1NUUlVDVFVSRURfQ0xPTkVfVFJBTlNGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NDgpOwoKdmFyIHN0cnVjdHVyZWRDbG9uZSA9IGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lOwp2YXIgQXJyYXlCdWZmZXIgPSBnbG9iYWxUaGlzLkFycmF5QnVmZmVyOwp2YXIgRGF0YVZpZXcgPSBnbG9iYWxUaGlzLkRhdGFWaWV3Owp2YXIgbWluID0gTWF0aC5taW47CnZhciBBcnJheUJ1ZmZlclByb3RvdHlwZSA9IEFycmF5QnVmZmVyLnByb3RvdHlwZTsKdmFyIERhdGFWaWV3UHJvdG90eXBlID0gRGF0YVZpZXcucHJvdG90eXBlOwp2YXIgc2xpY2UgPSB1bmN1cnJ5VGhpcyhBcnJheUJ1ZmZlclByb3RvdHlwZS5zbGljZSk7CnZhciBpc1Jlc2l6YWJsZSA9IHVuY3VycnlUaGlzQWNjZXNzb3IoQXJyYXlCdWZmZXJQcm90b3R5cGUsICdyZXNpemFibGUnLCAnZ2V0Jyk7CnZhciBtYXhCeXRlTGVuZ3RoID0gdW5jdXJyeVRoaXNBY2Nlc3NvcihBcnJheUJ1ZmZlclByb3RvdHlwZSwgJ21heEJ5dGVMZW5ndGgnLCAnZ2V0Jyk7CnZhciBnZXRJbnQ4ID0gdW5jdXJyeVRoaXMoRGF0YVZpZXdQcm90b3R5cGUuZ2V0SW50OCk7CnZhciBzZXRJbnQ4ID0gdW5jdXJyeVRoaXMoRGF0YVZpZXdQcm90b3R5cGUuc2V0SW50OCk7Cgptb2R1bGUuZXhwb3J0cyA9IChQUk9QRVJfU1RSVUNUVVJFRF9DTE9ORV9UUkFOU0ZFUiB8fCBkZXRhY2hUcmFuc2ZlcmFibGUpICYmIGZ1bmN0aW9uIChhcnJheUJ1ZmZlciwgbmV3TGVuZ3RoLCBwcmVzZXJ2ZVJlc2l6YWJpbGl0eSkgewogIHZhciBieXRlTGVuZ3RoID0gYXJyYXlCdWZmZXJCeXRlTGVuZ3RoKGFycmF5QnVmZmVyKTsKICB2YXIgbmV3Qnl0ZUxlbmd0aCA9IG5ld0xlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnl0ZUxlbmd0aCA6IHRvSW5kZXgobmV3TGVuZ3RoKTsKICB2YXIgZml4ZWRMZW5ndGggPSAhaXNSZXNpemFibGUgfHwgIWlzUmVzaXphYmxlKGFycmF5QnVmZmVyKTsKICB2YXIgbmV3QnVmZmVyOwogIG5vdERldGFjaGVkKGFycmF5QnVmZmVyKTsKICBpZiAoUFJPUEVSX1NUUlVDVFVSRURfQ0xPTkVfVFJBTlNGRVIpIHsKICAgIGFycmF5QnVmZmVyID0gc3RydWN0dXJlZENsb25lKGFycmF5QnVmZmVyLCB7IHRyYW5zZmVyOiBbYXJyYXlCdWZmZXJdIH0pOwogICAgaWYgKGJ5dGVMZW5ndGggPT09IG5ld0J5dGVMZW5ndGggJiYgKHByZXNlcnZlUmVzaXphYmlsaXR5IHx8IGZpeGVkTGVuZ3RoKSkgcmV0dXJuIGFycmF5QnVmZmVyOwogIH0KICBpZiAoYnl0ZUxlbmd0aCA+PSBuZXdCeXRlTGVuZ3RoICYmICghcHJlc2VydmVSZXNpemFiaWxpdHkgfHwgZml4ZWRMZW5ndGgpKSB7CiAgICBuZXdCdWZmZXIgPSBzbGljZShhcnJheUJ1ZmZlciwgMCwgbmV3Qnl0ZUxlbmd0aCk7CiAgfSBlbHNlIHsKICAgIHZhciBvcHRpb25zID0gcHJlc2VydmVSZXNpemFiaWxpdHkgJiYgIWZpeGVkTGVuZ3RoICYmIG1heEJ5dGVMZW5ndGggPyB7IG1heEJ5dGVMZW5ndGg6IG1heEJ5dGVMZW5ndGgoYXJyYXlCdWZmZXIpIH0gOiB1bmRlZmluZWQ7CiAgICBuZXdCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3Qnl0ZUxlbmd0aCwgb3B0aW9ucyk7CiAgICB2YXIgYSA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7CiAgICB2YXIgYiA9IG5ldyBEYXRhVmlldyhuZXdCdWZmZXIpOwogICAgdmFyIGNvcHlMZW5ndGggPSBtaW4obmV3Qnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHlMZW5ndGg7IGkrKykgc2V0SW50OChiLCBpLCBnZXRJbnQ4KGEsIGkpKTsKICB9CiAgaWYgKCFQUk9QRVJfU1RSVUNUVVJFRF9DTE9ORV9UUkFOU0ZFUikgZGV0YWNoVHJhbnNmZXJhYmxlKGFycmF5QnVmZmVyKTsKICByZXR1cm4gbmV3QnVmZmVyOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNDY0NDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBOQVRJVkVfQVJSQVlfQlVGRkVSID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3ODExKTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzI0KTsKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkwMSk7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpOwp2YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk3KTsKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5NTUpOwp2YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MjMpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Njk5KTsKdmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4NDApOwp2YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA2KTsKdmFyIGlzUHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2MjUpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3ODcpOwp2YXIgc2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5NjcpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MjI3KTsKdmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzM5Mik7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTgxKTsKCnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKdmFyIEludDhBcnJheSA9IGdsb2JhbFRoaXMuSW50OEFycmF5Owp2YXIgSW50OEFycmF5UHJvdG90eXBlID0gSW50OEFycmF5ICYmIEludDhBcnJheS5wcm90b3R5cGU7CnZhciBVaW50OENsYW1wZWRBcnJheSA9IGdsb2JhbFRoaXMuVWludDhDbGFtcGVkQXJyYXk7CnZhciBVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSA9IFVpbnQ4Q2xhbXBlZEFycmF5ICYmIFVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZTsKdmFyIFR5cGVkQXJyYXkgPSBJbnQ4QXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5KTsKdmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBJbnQ4QXJyYXlQcm90b3R5cGUgJiYgZ2V0UHJvdG90eXBlT2YoSW50OEFycmF5UHJvdG90eXBlKTsKdmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CnZhciBUeXBlRXJyb3IgPSBnbG9iYWxUaGlzLlR5cGVFcnJvcjsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwp2YXIgVFlQRURfQVJSQVlfVEFHID0gdWlkKCdUWVBFRF9BUlJBWV9UQUcnKTsKdmFyIFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SID0gJ1R5cGVkQXJyYXlDb25zdHJ1Y3Rvcic7Ci8vIEZpeGluZyBuYXRpdmUgdHlwZWQgYXJyYXlzIGluIE9wZXJhIFByZXN0byBjcmFzaGVzIHRoZSBicm93c2VyLCBzZWUgIzU5NQp2YXIgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IE5BVElWRV9BUlJBWV9CVUZGRVIgJiYgISFzZXRQcm90b3R5cGVPZiAmJiBjbGFzc29mKGdsb2JhbFRoaXMub3BlcmEpICE9PSAnT3BlcmEnOwp2YXIgVFlQRURfQVJSQVlfVEFHX1JFUVVJUkVEID0gZmFsc2U7CnZhciBOQU1FLCBDb25zdHJ1Y3RvciwgUHJvdG90eXBlOwoKdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0ID0gewogIEludDhBcnJheTogMSwKICBVaW50OEFycmF5OiAxLAogIFVpbnQ4Q2xhbXBlZEFycmF5OiAxLAogIEludDE2QXJyYXk6IDIsCiAgVWludDE2QXJyYXk6IDIsCiAgSW50MzJBcnJheTogNCwKICBVaW50MzJBcnJheTogNCwKICBGbG9hdDMyQXJyYXk6IDQsCiAgRmxvYXQ2NEFycmF5OiA4Cn07Cgp2YXIgQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0ID0gewogIEJpZ0ludDY0QXJyYXk6IDgsCiAgQmlnVWludDY0QXJyYXk6IDgKfTsKCnZhciBpc1ZpZXcgPSBmdW5jdGlvbiBpc1ZpZXcoaXQpIHsKICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGZhbHNlOwogIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpOwogIHJldHVybiBrbGFzcyA9PT0gJ0RhdGFWaWV3JwogICAgfHwgaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcykKICAgIHx8IGhhc093bihCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKTsKfTsKCnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBmdW5jdGlvbiAoaXQpIHsKICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihpdCk7CiAgaWYgKCFpc09iamVjdChwcm90bykpIHJldHVybjsKICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHByb3RvKTsKICByZXR1cm4gKHN0YXRlICYmIGhhc093bihzdGF0ZSwgVFlQRURfQVJSQVlfQ09OU1RSVUNUT1IpKSA/IHN0YXRlW1RZUEVEX0FSUkFZX0NPTlNUUlVDVE9SXSA6IGdldFR5cGVkQXJyYXlDb25zdHJ1Y3Rvcihwcm90byk7Cn07Cgp2YXIgaXNUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBmYWxzZTsKICB2YXIga2xhc3MgPSBjbGFzc29mKGl0KTsKICByZXR1cm4gaGFzT3duKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LCBrbGFzcykKICAgIHx8IGhhc093bihCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QsIGtsYXNzKTsKfTsKCnZhciBhVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpc1R5cGVkQXJyYXkoaXQpKSByZXR1cm4gaXQ7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBhIHR5cGVkIGFycmF5Jyk7Cn07Cgp2YXIgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIChDKSB7CiAgaWYgKGlzQ2FsbGFibGUoQykgJiYgKCFzZXRQcm90b3R5cGVPZiB8fCBpc1Byb3RvdHlwZU9mKFR5cGVkQXJyYXksIEMpKSkgcmV0dXJuIEM7CiAgdGhyb3cgbmV3IFR5cGVFcnJvcih0cnlUb1N0cmluZyhDKSArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3InKTsKfTsKCnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gZnVuY3Rpb24gKEtFWSwgcHJvcGVydHksIGZvcmNlZCwgb3B0aW9ucykgewogIGlmICghREVTQ1JJUFRPUlMpIHJldHVybjsKICBpZiAoZm9yY2VkKSBmb3IgKHZhciBBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogICAgdmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IGdsb2JhbFRoaXNbQVJSQVldOwogICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZSwgS0VZKSkgdHJ5IHsKICAgICAgZGVsZXRlIFR5cGVkQXJyYXlDb25zdHJ1Y3Rvci5wcm90b3R5cGVbS0VZXTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIC8vIG9sZCBXZWJLaXQgYnVnIC0gc29tZSBtZXRob2RzIGFyZSBub24tY29uZmlndXJhYmxlCiAgICAgI
20HRyeSB7CiAgICAgICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yLnByb3RvdHlwZVtLRVldID0gcHJvcGVydHk7CiAgICAgIH0gY2F0Y2ggKGVycm9yMikgeyAvKiBlbXB0eSAqLyB9CiAgICB9CiAgfQogIGlmICghVHlwZWRBcnJheVByb3RvdHlwZVtLRVldIHx8IGZvcmNlZCkgewogICAgZGVmaW5lQnVpbHRJbihUeXBlZEFycmF5UHJvdG90eXBlLCBLRVksIGZvcmNlZCA/IHByb3BlcnR5CiAgICAgIDogTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyAmJiBJbnQ4QXJyYXlQcm90b3R5cGVbS0VZXSB8fCBwcm9wZXJ0eSwgb3B0aW9ucyk7CiAgfQp9OwoKdmFyIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QgPSBmdW5jdGlvbiAoS0VZLCBwcm9wZXJ0eSwgZm9yY2VkKSB7CiAgdmFyIEFSUkFZLCBUeXBlZEFycmF5Q29uc3RydWN0b3I7CiAgaWYgKCFERVNDUklQVE9SUykgcmV0dXJuOwogIGlmIChzZXRQcm90b3R5cGVPZikgewogICAgaWYgKGZvcmNlZCkgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogICAgICBUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBnbG9iYWxUaGlzW0FSUkFZXTsKICAgICAgaWYgKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciAmJiBoYXNPd24oVHlwZWRBcnJheUNvbnN0cnVjdG9yLCBLRVkpKSB0cnkgewogICAgICAgIGRlbGV0ZSBUeXBlZEFycmF5Q29uc3RydWN0b3JbS0VZXTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogICAgfQogICAgaWYgKCFUeXBlZEFycmF5W0tFWV0gfHwgZm9yY2VkKSB7CiAgICAgIC8vIFY4IH4gQ2hyb21lIDQ5LTUwIGAlVHlwZWRBcnJheSVgIG1ldGhvZHMgYXJlIG5vbi13cml0YWJsZSBub24tY29uZmlndXJhYmxlCiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGRlZmluZUJ1aWx0SW4oVHlwZWRBcnJheSwgS0VZLCBmb3JjZWQgPyBwcm9wZXJ0eSA6IE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgVHlwZWRBcnJheVtLRVldIHx8IHByb3BlcnR5KTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogICAgfSBlbHNlIHJldHVybjsKICB9CiAgZm9yIChBUlJBWSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogICAgVHlwZWRBcnJheUNvbnN0cnVjdG9yID0gZ2xvYmFsVGhpc1tBUlJBWV07CiAgICBpZiAoVHlwZWRBcnJheUNvbnN0cnVjdG9yICYmICghVHlwZWRBcnJheUNvbnN0cnVjdG9yW0tFWV0gfHwgZm9yY2VkKSkgewogICAgICBkZWZpbmVCdWlsdEluKFR5cGVkQXJyYXlDb25zdHJ1Y3RvciwgS0VZLCBwcm9wZXJ0eSk7CiAgICB9CiAgfQp9OwoKZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CiAgQ29uc3RydWN0b3IgPSBnbG9iYWxUaGlzW05BTUVdOwogIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yICYmIENvbnN0cnVjdG9yLnByb3RvdHlwZTsKICBpZiAoUHJvdG90eXBlKSBlbmZvcmNlSW50ZXJuYWxTdGF0ZShQcm90b3R5cGUpW1RZUEVEX0FSUkFZX0NPTlNUUlVDVE9SXSA9IENvbnN0cnVjdG9yOwogIGVsc2UgTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyA9IGZhbHNlOwp9Cgpmb3IgKE5BTUUgaW4gQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CiAgQ29uc3RydWN0b3IgPSBnbG9iYWxUaGlzW05BTUVdOwogIFByb3RvdHlwZSA9IENvbnN0cnVjdG9yICYmIENvbnN0cnVjdG9yLnByb3RvdHlwZTsKICBpZiAoUHJvdG90eXBlKSBlbmZvcmNlSW50ZXJuYWxTdGF0ZShQcm90b3R5cGUpW1RZUEVEX0FSUkFZX0NPTlNUUlVDVE9SXSA9IENvbnN0cnVjdG9yOwp9CgovLyBXZWJLaXQgYnVnIC0gdHlwZWQgYXJyYXlzIGNvbnN0cnVjdG9ycyBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZQppZiAoIU5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgfHwgIWlzQ2FsbGFibGUoVHlwZWRBcnJheSkgfHwgVHlwZWRBcnJheSA9PT0gRnVuY3Rpb24ucHJvdG90eXBlKSB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSBzYWZlCiAgVHlwZWRBcnJheSA9IGZ1bmN0aW9uIFR5cGVkQXJyYXkoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbmNvcnJlY3QgaW52b2NhdGlvbic
20pOwogIH07CiAgaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MpIGZvciAoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCkgewogICAgaWYgKGdsb2JhbFRoaXNbTkFNRV0pIHNldFByb3RvdHlwZU9mKGdsb2JhbFRoaXNbTkFNRV0sIFR5cGVkQXJyYXkpOwogIH0KfQoKaWYgKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTIHx8ICFUeXBlZEFycmF5UHJvdG90eXBlIHx8IFR5cGVkQXJyYXlQcm90b3R5cGUgPT09IE9iamVjdFByb3RvdHlwZSkgewogIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5LnByb3RvdHlwZTsKICBpZiAoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUykgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSB7CiAgICBpZiAoZ2xvYmFsVGhpc1tOQU1FXSkgc2V0UHJvdG90eXBlT2YoZ2xvYmFsVGhpc1tOQU1FXS5wcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOwogIH0KfQoKLy8gV2ViS2l0IGJ1ZyAtIG9uZSBtb3JlIG9iamVjdCBpbiBVaW50OENsYW1wZWRBcnJheSBwcm90b3R5cGUgY2hhaW4KaWYgKE5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MgJiYgZ2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUpICE9PSBUeXBlZEFycmF5UHJvdG90eXBlKSB7CiAgc2V0UHJvdG90eXBlT2YoVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUsIFR5cGVkQXJyYXlQcm90b3R5cGUpOwp9CgppZiAoREVTQ1JJUFRPUlMgJiYgIWhhc093bihUeXBlZEFycmF5UHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkgewogIFRZUEVEX0FSUkFZX1RBR19SRVFVSVJFRCA9IHRydWU7CiAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHsKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gaXNPYmplY3QodGhpcykgPyB0aGlzW1RZUEVEX0FSUkFZX1RBR10gOiB1bmRlZmluZWQ7CiAgICB9CiAgfSk7CiAgZm9yIChOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KSBpZiAoZ2xvYmFsVGhpc1tOQU1FXSkgewogICAgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbFRoaXNbTkFNRV0sIFRZUEVEX0FSUkFZX1RBRywgTkFNRSk7CiAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTOiBOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTLAogIFRZUEVEX0FSUkFZX1RBRzogVFlQRURfQVJSQVlfVEFHX1JFUVVJUkVEICYmIFRZUEVEX0FSUkFZX1RBRywKICBhVHlwZWRBcnJheTogYVR5cGVkQXJyYXksCiAgYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcjogYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciwKICBleHBvcnRUeXBlZEFycmF5TWV0aG9kOiBleHBvcnRUeXBlZEFycmF5TWV0aG9kLAogIGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6IGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2QsCiAgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yOiBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IsCiAgaXNWaWV3OiBpc1ZpZXcsCiAgaXNUeXBlZEFycmF5OiBpc1R5cGVkQXJyYXksCiAgVHlwZWRBcnJheTogVHlwZWRBcnJheSwKICBUeXBlZEFycmF5UHJvdG90eXBlOiBUeXBlZEFycmF5UHJvdG90eXBlCn07CgoKLyoqKi8gfSksCgovKioqLyA1MzcwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGxlbmd0aE9mQXJyYXlMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MTk4KTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBsaXN0LCAkbGVuZ3RoKSB7CiAgdmFyIGluZGV4ID0gMDsKICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyAkbGVuZ3RoIDogbGVuZ3RoT2ZBcnJheUxpa2UobGlzdCk7CiAgdmFyIHJlc3VsdCA9IG5ldyBDb25zdHJ1Y3RvcihsZW5ndGgpOwogIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107CiAgcmV0dXJuIHJlc3VsdDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDk2MTc6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mzk3KTsKdmFyIHRvQWJzb2x1dGVJbmRleCA9IF9fd2VicGFja19yZXF1aXJlX18oNTYxMCk7CnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjE5OCk7CgovLyBgQXJyYXkucHJvdG90eXBlLnsgaW5kZXhPZiwgaW5jbHVkZXMgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvbgp2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7CiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkgewogICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpOwogICAgdmFyIGxlbmd0aCA9IGxlbmd0aE9mQXJyYXlMaWtlKE8pOwogICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTsKICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7CiAgICB2YXIgdmFsdWU7CiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtCiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVjawogICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9PSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7CiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZSAtLSBOYU4gY2hlY2sKICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZSkgcmV0dXJuIHRydWU7CiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90CiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHsKICAgICAgaWYgKChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSAmJiBPW2luZGV4XSA9PT0gZWwpIHJldHVybi
20BJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwOwogICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xOwogIH07Cn07Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAvLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlcwogIGluY2x1ZGVzOiBjcmVhdGVNZXRob2QodHJ1ZSksCiAgLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2QKICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mCiAgaW5kZXhPZjogY3JlYXRlTWV0aG9kKGZhbHNlKQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNDUyNzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7CnZhciBpc0FycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mzc2KTsKCnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlCnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwoKLy8gU2FmYXJpIDwgMTMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaW4gdGhpcyBjYXNlCnZhciBTSUxFTlRfT05fTk9OX1dSSVRBQkxFX0xFTkdUSF9TRVQgPSBERVNDUklQVE9SUyAmJiAhZnVuY3Rpb24gKCkgewogIC8vIG1ha2VzIG5vIHNlbnNlIHdpdGhvdXQgcHJvcGVyIHN0cmljdCBtb2RlIHN1cHBvcnQKICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTsKICB0cnkgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoW10sICdsZW5ndGgnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KS5sZW5ndGggPSAxOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3I7CiAgfQp9KCk7Cgptb2R1bGUuZXhwb3J0cyA9IFNJTEVOVF9PTl9OT05fV1JJVEFCTEVfTEVOR1RIX1NFVCA/IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHsKICBpZiAoaXNBcnJheShPKSAmJiAhZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sICdsZW5ndGgnKS53cml0YWJsZSkgewogICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBzZXQgcmVhZCBvbmx5IC5sZW5ndGgnKTsKICB9IHJldHVybiBPLmxlbmd0aCA9IGxlbmd0aDsKfSA6IGZ1bmN0aW9uIChPLCBsZW5ndGgpIHsKICByZXR1cm4gTy5sZW5ndGggPSBsZW5ndGg7Cn07CgoKLyoqKi8gfSksCgovKioqLyA3NjgwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKCm1vZHVsZS5leHBvcnRzID0gdW5jdXJyeVRoaXMoW10uc2xpY2UpOwoKCi8qKiovIH0pLAoKLyoqKi8gNzYyODoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjE5OCk7CgovLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtY2hhbmdlLWFycmF5LWJ5LWNvcHkvI3NlYy1hcnJheS5wcm90b3R5cGUudG9SZXZlcnNlZAovLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtY2hhbmdlLWFycmF5LWJ5LWNvcHkvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvUmV2ZXJzZWQKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgQykgewogIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTsKICB2YXIgQSA9IG5ldyBDKGxlbik7CiAgdmFyIGsgPSAwOwogIGZvciAoOyBrIDwgbGVuOyBrKyspIEFba10gPSBPW2xlbiAtIGsgLSAxXTsKICByZXR1cm4gQTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDk5Mjg6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgbGVuZ3RoT2ZBcnJheUxpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxOTgpOwp2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5MSk7Cgp2YXIgJFJhbmdlRXJyb3IgPSBSYW5nZUVycm9yOwoKLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtYXJyYXkucHJvdG90eXBlLndpdGgKLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWNoYW5nZS1hcnJheS1ieS1jb3B5LyNzZWMtJXR5cGVkYXJyYXklLnByb3RvdHlwZS53aXRoCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEMsIGluZGV4LCB2YWx1ZSkgewogIHZhciBsZW4gPSBsZW5ndGhPZkFycmF5TGlrZShPKTsKICB2YXIgcmVsYXRpdmVJbmRleCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpOwogIHZhciBhY3R1YWxJbmRleCA9IHJlbGF0aXZlSW5kZXggPCAwID8gbGVuICsgcmVsYXRpdmVJbmRleCA6IHJlbGF0aXZlSW5kZXg7CiAgaWYgKGFjdHVhbEluZGV4ID49IGxlbiB8fCBhY3R1YWxJbmRleCA8IDApIHRocm93IG5ldyAkUmFuZ2VFcnJvcignSW5jb3JyZWN0IGluZGV4Jyk7CiAgdmFyIEEgPSBuZXcgQyhsZW4pOwogIHZhciBrID0gMDsKICBmb3IgKDsgayA8IGxlbjsgaysrKSBBW2tdID0gayA9PT0gYWN0dWFsSW5kZXggPyB2YWx1ZSA6IE9ba107CiAgcmV0dXJuIEE7Cn07CgoKLyoqKi8gfSksCgovKioqLyA2MzE5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MzkpOwoKLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvcgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7CiAgdHJ5IHsKICAgIHJldHVybi
20BFTlRSSUVTID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICd0aHJvdycsIGVycm9yKTsKICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyAyMTk1OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKCnZhciB0b1N0cmluZyA9IHVuY3VycnlUaGlzKHt9LnRvU3RyaW5nKTsKdmFyIHN0cmluZ1NsaWNlID0gdW5jdXJyeVRoaXMoJycuc2xpY2UpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gc3RyaW5nU2xpY2UodG9TdHJpbmcoaXQpLCA4LCAtMSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA2OTU1OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIFRPX1NUUklOR19UQUdfU1VQUE9SVCA9IF9fd2VicGFja19yZXF1aXJlX18oMjE0MCk7CnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKdmFyIGNsYXNzb2ZSYXcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxOTUpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MjI3KTsKCnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwp2YXIgJE9iamVjdCA9IE9iamVjdDsKCi8vIEVTMyB3cm9uZyBoZXJlCnZhciBDT1JSRUNUX0FSR1VNRU5UUyA9IGNsYXNzb2ZSYXcoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09PSAnQXJndW1lbnRzJzsKCi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yCnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkgewogIHRyeSB7CiAgICByZXR1cm4gaXRba2V5XTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9Cn07CgovLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgCm1vZHVsZS5leHBvcnRzID0gVE9fU1RSSU5HX1RBR19TVVBQT1JUID8gY2xhc3NvZlJhdyA6IGZ1bmN0aW9uIChpdCkgewogIHZhciBPLCB0YWcsIHJlc3VsdDsKICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCcKICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZQogICAgOiB0eXBlb2YgKHRhZyA9IHRyeUdldChPID0gJE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZwogICAgLy8gYnVpbHRpblRhZyBjYXNlCiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKQogICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFjawogICAgOiAocmVzdWx0ID0gY2xhc3NvZlJhdyhPKSkgPT09ICdPYmplY3QnICYmIGlzQ2FsbGFibGUoTy5jYWxsZWUpID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyA3NzQwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5Nyk7CnZhciBvd25LZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDMxKTsKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzM0Nyk7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkxMyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSwgZXhjZXB0aW9ucykgewogIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpOwogIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7CiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mOwogIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgdmFyIGtleSA9IGtleXNbaV07CiAgICBpZiAoIWhhc093bih0YXJnZXQsIGtleSkgJiYgIShleGNlcHRpb25zICYmIGhhc093bihleGNlcHRpb25zLCBrZXkpKSkgewogICAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICB9CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMjIxMToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oOTAzOSk7Cgptb2R1bGUuZXhwb3J0cyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7CiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfQogIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldHByb3RvdHlwZW9mIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nCiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gMjUyOToKLyoqKi8gKChtb2R1bGUpID0+IHsKCgovLyBgQ3JlYXRlSXRlclJlc3VsdE9iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtY3JlYXRlaXRlcnJlc3VsdG9iamVjdAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh2YWx1ZSwgZG9uZSkgewogIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogZG9uZSB9Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNjY5OToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7CnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkxMyk7CnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5ODApOwoKbW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7Cn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7CiAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKICByZXR1cm4gb2JqZWN0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNjk4MDoKLyoqKi8gKChtb2R1bGUpID0+IHsKCgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7CiAgcmV0dXJuIHsKICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksCiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksCiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSwKICAgIHZhbHVlOiB2YWx1ZQogIH07Cn07CgoKLyoqKi8gfSksCgovKioqLyA0NjU5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzI0KTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTEzKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjk4MCk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBpZiAoREVTQ1JJUFRPUlMpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBrZXksIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCB2YWx1ZSkpOwogIGVsc2Ugb2JqZWN0W2tleV0gPSB2YWx1ZTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDIxMDY6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgbWFrZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4Myk7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkxMyk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbW
20UsIGRlc2NyaXB0b3IpIHsKICBpZiAoZGVzY3JpcHRvci5nZXQpIG1ha2VCdWlsdEluKGRlc2NyaXB0b3IuZ2V0LCBuYW1lLCB7IGdldHRlcjogdHJ1ZSB9KTsKICBpZiAoZGVzY3JpcHRvci5zZXQpIG1ha2VCdWlsdEluKGRlc2NyaXB0b3Iuc2V0LCBuYW1lLCB7IHNldHRlcjogdHJ1ZSB9KTsKICByZXR1cm4gZGVmaW5lUHJvcGVydHkuZih0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNjg0MDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKdmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTEzKTsKdmFyIG1ha2VCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXygyODMpOwp2YXIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MzMpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywga2V5LCB2YWx1ZSwgb3B0aW9ucykgewogIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9OwogIHZhciBzaW1wbGUgPSBvcHRpb25zLmVudW1lcmFibGU7CiAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubmFtZSA6IGtleTsKICBpZiAoaXNDYWxsYWJsZSh2YWx1ZSkpIG1ha2VCdWlsdEluKHZhbHVlLCBuYW1lLCBvcHRpb25zKTsKICBpZiAob3B0aW9ucy5nbG9iYWwpIHsKICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlOwogICAgZWxzZSBkZWZpbmVHbG9iYWxQcm9wZXJ0eShrZXksIHZhbHVlKTsKICB9IGVsc2UgewogICAgdHJ5IHsKICAgICAgaWYgKCFvcHRpb25zLnVuc2FmZSkgZGVsZXRlIE9ba2V5XTsKICAgICAgZWxzZSBpZiAoT1trZXldKSBzaW1wbGUgPSB0cnVlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogICAgaWYgKHNpbXBsZSkgT1trZXldID0gdmFsdWU7CiAgICBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5LCB7CiAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgIGNvbmZpZ3VyYWJsZTogIW9wdGlvbnMubm9uQ29uZmlndXJhYmxlLAogICAgICB3cml0YWJsZTogIW9wdGlvbnMubm9uV3JpdGFibGUKICAgIH0pOwogIH0gcmV0dXJuIE87Cn07CgoKLyoqKi8gfSksCgovKioqLyA2Mjc5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4NDApOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHsKICBmb3IgKHZhciBrZXkgaW4gc3JjKSBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzcmNba2V5XSwgb3B0aW9ucyk7CiAgcmV0dXJuIHRhcmdldDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDk0MzM6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmUKdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIHRyeSB7CiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBnbG9iYWxUaGlzW2tleV0gPSB2YWx1ZTsKICB9IHJldHVybiB2YWx1ZTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDM3MjQ6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwoKLy8gRGV0ZWN0IElFOCdzIGluY29tcGxldGUgZGVmaW5lUHJvcGVydHkgaW1wbGVtZW50YXRpb24KbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcKICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAxLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KVsxXSAhPT0gNzsKfSk7CgoKLyoqKi8gfSksCgovKioqLyA0NDgzOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgZ2V0QnVpbHRJbk5vZGVNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MjkpOwp2YXIgUFJPUEVSX1NUUlVDVFVSRURfQ0xPTkVfVFJBTlNGRVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NDgpOwoKdmFyIHN0cnVjdHVyZWRDbG9uZSA9IGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lOwp2YXIgJEFycmF5QnVmZmVyID0gZ2xvYmFsVGhpcy5BcnJheUJ1ZmZlcjsKdmFyICRNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbFRoaXMuTWVzc2FnZUNoYW5uZWw7CnZhciBkZXRhY2ggPSBmYWxzZTsKdmFyIFdvcmtlclRocmVhZHMsIGNoYW5uZWwsIGJ1ZmZlciwgJGRldGFjaDsKCmlmIChQUk9QRVJfU1RSVUNUVVJFRF9DTE9ORV9UUkFOU0ZFUikgewogIGRldGFjaCA9IGZ1bmN0aW9uICh0cmFuc2ZlcmFibGUpIHsKICAgIHN0cnVjdHVyZWRDbG9uZSh0cmFuc2ZlcmFibGUsIHsgdHJhbnNmZXI6IFt0cmFuc2ZlcmFibGVdIH0pOwogIH07Cn0gZWxzZSBpZiAoJEFycmF5QnVmZmVyKSB0cnkgewogIGlmICghJE1lc3NhZ2VDaGFubmVsKSB7CiAgICBXb3JrZXJUaHJlYWRzID0gZ2V0QnVpbHRJbk5vZGVNb2R1bGUoJ3dvcmtlcl90aHJlYWRzJyk7CiAgICBpZiAoV29ya2VyVGhyZWFkcykgJE1lc3NhZ2VDaGFubmVsID0gV29ya2VyVGhyZWFkcy5NZXNzYWdlQ2hhbm5lbDsKICB9CgogIGlmICgkTWVzc2FnZUNoYW5uZWwpIHsKICAgIGNoYW5uZWwgPSBuZXcgJE1lc3NhZ2VDaGFubmVsKCk7CiAgICBidWZmZXIgPSBuZXcgJEFycmF5QnVmZmVyKDIpOwoKICAgICRkZXRhY2ggPSBmdW5jdGlvbiAodHJhbnNmZXJhYmxlKSB7CiAgICAgIGNoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UobnVsbCwgW3RyYW5zZmVyYWJsZV0pOwogICAgfTsKCiAgICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggPT09IDIpIHsKICAgICAgJGRldGFjaChidWZmZXIpOwogICAgICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggPT09IDApIGRldGFjaCA9ICRkZXRhY2g7CiAgICB9CiAgfQp9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9Cgptb2R1bGUuZXhwb3J0cyA9IGRldGFjaDsKCgovKioqLyB9KSwKCi8qKiovIDQwNTU6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpOwoKdmFyIGRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudDsKLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFCnZhciBFWElTVFMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHJldHVybiBFWElTVFMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNjgzNzoKLyoqKi8gKChtb2R1bGUpID0+IHsKCgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKdmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxCgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIGlmIChpdCA+IE1BWF9TQUZFX0lOVEVHRVIpIHRocm93ICRUeXBlRXJyb3IoJ01heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCcpOwogIHJldHVybiBpdDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDUwMDI6Ci8qKiovICgobW9kdWxlKSA9PiB7CgoKbW9kdWxlLmV4cG9ydHMgPSB7CiAgSW5kZXhTaXplRXJyb3I6IHsgczogJ0lOREVYX1NJWkVfRVJSJywgYzogMSwgbTogMSB9LAogIERPTVN0cmluZ1NpemVFcnJvcjogeyBzOiAnRE9NU1RSSU5HX1NJWkVfRVJSJywgYzogMiwgbTogMCB9LAogIEhpZXJhcmNoeVJlcXVlc3RFcnJvcjogeyBzOiAnSElFUkFSQ0hZX1JFUVVFU1RfRVJSJywgYzogMywgbTogMSB9LAogIFdyb25nRG9jdW1lbnRFcnJvcjogeyBzOiAnV1JPTkdfRE9DVU1FTlRfRVJSJywgYzogNCwgbTogMSB9LAogIEludmFsaWRDaGFyYWN0ZXJFcnJvcjogeyBzOiAnSU5WQUxJRF9DSEFSQUNURVJfRVJSJywgYzogNSwgbTogMSB9LAogIE5vRGF0YUFsbG93ZWRFcnJvcjogeyBzOiAnTk9fREFUQV9BTExPV0VEX0VSUicsIGM6IDYsIG06IDAgfSwKICBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcjogeyBzOiAnTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSJywgYzogNywgbTogMSB9LAogIE5vdEZvdW5kRXJyb3I6IHsgczogJ05PVF9GT1VORF9FUlInLCBjOiA4LCBtOiAxIH0sCiAgTm90U3VwcG9ydGVkRXJyb3I6IHsgczogJ05PVF9TVVBQT1JURURfRVJSJywgYzogOSwgbTogMSB9LAogIEluVXNlQXR0cmlidXRlRXJyb3I6IHsgczogJ0lOVVNFX0FUVFJJQlVURV9FUlInLCBjOiAxMCwgbTogMSB9LAogIEludmFsaWRTdGF0ZUVycm9yOiB7IHM6ICdJTlZBTElEX1NUQVRFX0VSUicsIGM6IDExLCBtOiAxIH0sCiAgU3ludGF4RXJyb3I6IHsgczogJ1NZTlRBWF9FUlInLCBjOiAxMiwgbTogMSB9LAogIEludmFsaWRNb2RpZmljYXRpb25FcnJvcjogeyBzOiAnSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSJywgYzogMTMsIG06IDEgfSwKICBOYW1lc3BhY2VFcnJvcjogeyBzOiAnTkFNRVNQQUNFX0VSUicsIGM6IDE0LCBtOiAxIH0sCiAgSW52YWxpZEFjY2Vzc0Vycm9yOiB7IHM6ICdJTlZBTElEX0FDQ0VTU19FUlInLCBjOiAxNSwgbTogMSB9LAogIFZhbGlkYXRpb25FcnJvcjogeyBzOiAnVkFMSURBVElPTl9FUlInLCBjOiAxNiwgbTogMCB9LAogIFR5cGVNaXNtYXRjaEVycm9yOiB7IHM6ICdUWVBFX01JU01BVENIX0VSUicsIGM6IDE3LCBtOiAxIH0sCiAgU2VjdXJpdHlFcnJvcjogeyBzOiAnU0VDVVJJVFlfRVJSJywgYzogMTgsIG06IDEgfSwKICBOZXR3b3JrRXJyb3I6IHsgczogJ05FVFdPUktfRVJSJywgYzogMTksIG06IDEgfSwKICBBYm9ydEVycm9yOiB7IHM6ICdBQk9SVF9FUlInLCBjOiAyMCwgbTogMSB9LAogIFVSTE1pc21hdGNoRXJyb3I6IHsgczogJ1VSTF9NSVNNQVRDSF9FUlInLCBjOiAyMSwgbTogMSB9LAogIFF1b3RhRXhjZWVkZWRFcnJvcjogeyBzOiAnUVVPVEFfRVhDRUVERURfRVJSJywgYzogMjIsIG06IDEgfSwKICBUaW1lb3V0RXJyb3I6IHsgczogJ1RJTUVPVVRfRVJSJywgYzogMjMsIG06IDEgfSwKICBJbnZhbGlkTm9kZVR5cGVFcnJvcjogeyBzOiAnSU5WQUxJRF9OT0RFX1RZUEVfRVJSJywgYzogMjQsIG06IDEgfSwKICBEYXRhQ2xvbmVFcnJvcjogeyBzOiAnREFUQV9DTE9ORV9FUlInLCBjOiAyNSwgbTogMSB9Cn07CgoKLyoqKi8gfSksCgovKioqLyA4NzI3OgovKioqLyAoKG1vZHVsZSkgPT4gewoKCi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5cwptb2R1bGUuZXhwb3J0cyA9IFsKICAnY29uc3RydWN0b3InLAogICdoYXNPd25Qcm9wZXJ0eScsCiAgJ2lzUHJvdG90eXBlT2YnLAogICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsCiAgJ3RvTG9jYWxlU3RyaW5nJywKICAndG9TdHJpbmcnLAogICd2YWx1ZU9mJwpdOwoKCi8qKiovIH0pLAoKLyoqKi8gNjE5MzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBFTlZJUk9OTUVOVCA9IF9fd2VicGFja19yZXF1aXJlX18oNDIxNSk7Cgptb2R1bGUuZXhwb3J0cyA9IEVOVklST05NRU5UID09PSAnTk9ERSc7CgoKLyoqKi8gfSksCgovKioqLyAyODM5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwoKdmFyIG5hdmlnYXRvciA9IGdsb2JhbFRoaXMubmF2aWdhdG9yOwp2YXIgdXNlckFnZW50ID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQ7Cgptb2R1bGUuZXhwb3J0cyA9IHVzZXJBZ2VudCA/IFN0cmluZyh1c2VyQWdlbnQpIDogJyc7CgoKLyoqKi8gfSksCgovKioqLyA5NTE5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyODM5KTsKCnZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzOwp2YXIgRGVubyA9IGdsb2JhbFRoaXMuRGVubzsKdmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zIHx8IERlbm8gJiYgRGVuby52ZXJzaW9uOwp2YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52ODsKdmFyIG1hdGNoLCB2ZXJzaW9uOwoKaWYgKHY4KSB7CiAgbWF0Y2ggPSB2OC5zcGxpdCgnLicpOwogIC8vIGluIG9sZCBDaHJvbWUsIHZlcnNpb25zIG9mIFY4IGlzbid0IFY4ID0gQ2hyb21lIC8gMTAKICAvLyBidXQgdGhlaXIgY29ycmVjdCB2ZXJzaW9ucyBhcmUgbm90IGludGVyZXN0aW5nIGZvciB1cwogIHZlcnNpb24gPSBtYXRjaFswXSA+IDAgJiYgbWF0Y2hbMF0gPCA0ID8gMSA6ICsobWF0Y2hbMF0gKyBtYXRjaFsxXSk7Cn0KCi8vIEJyb3dzZXJGUyBOb2RlSlMgYHByb2Nlc3NgIHBvbHlmaWxsIGluY29ycmVjdGx5IHNldCBgLnY4YCB0byBgMC4wYAovLyBzbyBjaGVjayBgdXNlckFnZW50YCBldmVuIGlmIGAudjhgIGV4aXN0cywgYnV0IDAKaWYgKCF2ZXJzaW9uICYmIHVzZXJBZ2VudCkgewogIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9FZGdlXC8oXGQrKS8pOwogIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gPj0gNzQpIHsKICAgIG1hdGNoID0gdXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhcZCspLyk7CiAgICBpZiAobWF0Y2gpIHZlcnNpb24gPSArbWF0Y2hbMV07CiAgfQp9Cgptb2R1bGUuZXhwb3J0cyA9IHZlcnNpb247CgoKLyoqKi8gfSksCgovKioqLyA0MjE1OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKLyogZ2xvYmFsIEJ1biwgRGVubyAtLSBkZXRlY3Rpb24gKi8KdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgdXNlckFnZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyODM5KTsKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxOTUpOwoKdmFyIHVzZXJBZ2VudFN0YXJ0c1dpdGggPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgcmV0dXJuIHVzZXJBZ2VudC5zbGljZSgwLCBzdHJpbmcubGVuZ3RoKSA9PT0gc3RyaW5nOwp9OwoKbW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkgewogIGlmICh1c2VyQWdlbnRTdGFydHNXaXRoKCdCdW4vJykpIHJldHVybiAnQlVOJzsKICBpZiAodXNlckFnZW50U3RhcnRzV2l0aCgnQ2xvdWRmbGFyZS1Xb3JrZXJzJykpIHJldHVybiAnQ0xPVURGTEFSRSc7CiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ0Rlbm8vJykpIHJldHVybiAnREVOTyc7CiAgaWYgKHVzZXJBZ2VudFN0YXJ0c1dpdGgoJ05vZGUuanMvJykpIHJldHVybiAnTk9ERSc7CiAgaWYgKGdsb2JhbFRoaXMuQnVuICYmIHR5cGVvZiBCdW4udmVyc2lvbiA9PSAnc3RyaW5nJykgcmV0dXJuICdCVU4nOwogIGlmIChnbG9iYWxUaGlzLkRlbm8gJiYgdHlwZW9mIERlbm8udmVyc2lvbiA9PSAnb2JqZWN0JykgcmV0dXJuICdERU5PJzsKICBpZiAoY2xhc3NvZihnbG9iYWxUaGlzLnByb2Nlc3MpID09PSAncHJvY2VzcycpIHJldHVybiAnTk9ERSc7CiAgaWYgKGdsb2JhbFRoaXMud2luZG93ICYmIGdsb2JhbFRoaXMuZG9jdW1lbnQpIHJldHVybiAnQlJPV1NFUic7CiAgcmV0dXJuICdSRVNUJzsKfSkoKTsKCgovKioqLyB9KSwKCi8qKiovIDg1NzQ6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MDQpOwoKdmFyICRFcnJvciA9IEVycm9yOwp2YXIgcmVwbGFjZSA9IHVuY3VycnlUaGlzKCcnLnJlcGxhY2UpOwoKdmFyIFRFU1QgPSAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gU3RyaW5nKG5ldyAkRXJyb3IoYXJnKS5zdGFjayk7IH0pKCd6eGNhc2QnKTsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zL25vLXZ1bG5lcmFibGUsIHNvbmFyanMvc2xvdy1yZWdleCAtLSBzYWZlCnZhciBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlkgPSAvXG5ccyphdCBbXjpdKjpbXlxuXSovOwp2YXIgSVNfVjhfT1JfQ0hBS1JBX1NUQUNLID0gVjhfT1JfQ0hBS1JBX1NUQUNLX0VOVFJZLnRlc3QoVEVTVCk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdGFjaywgZHJvcEVudHJpZXMpIHsKICBpZiAoSVNfVjhfT1JfQ0hBS1JBX1NUQUNLICYmIHR5cGVvZiBzdGFjayA9PSAnc3RyaW5nJyAmJiAhJEVycm9yLnByZXBhcmVTdGFja1RyYWNlKSB7CiAgICB3aGlsZSAoZHJvcEVudHJpZXMtLSkgc3RhY2sgPSByZXBsYWNlKHN0YWNrLCBWOF9PUl9DSEFLUkFfU1RBQ0tfRU5UUlksICcnKTsKICB9IHJldHVybiBzdGFjazsKfTsKCgovKioqLyB9KSwKCi8qKiovIDY1MTg6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg3MzQ3KS5mKTsKdmFyIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oNjY5OSk7CnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODQwKTsKdmFyIGRlZmluZUdsb2JhbFByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDMzKTsKdmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NDApOwp2YXIgaXNGb3JjZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3OTYpOwoKLyoKICBvcHRpb25zLnRhcmdldCAgICAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdAogIG9wdGlvbnMuZ2xvYmFsICAgICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3QKICBvcHRpb25zLnN0YXQgICAgICAgICAgIC0gZXhwb3J0IGFzIHN0YXRpYyBtZXRob2RzIG9mIHRhcmdldAogIG9wdGlvbnMucHJvdG8gICAgICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0CiAgb3B0aW9ucy5yZWFsICAgICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy5mb3JjZWQgICAgICAgICAtIGV4cG9ydCBldmVuIGlmIHRoZSBuYXRpdmUgZmVhdHVyZSBpcyBhdmFpbGFibGUKICBvcHRpb25zLmJpbmQgICAgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb24KICBvcHRpb25zLndyYXAgICAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uCiAgb3B0aW9ucy51bnNhZmUgICAgICAgICAtIHVzZSB0aGUgc2ltcGxlIGFzc2lnbm1lbnQgb2YgcHJvcGVydHkgaW5zdGVhZCBvZiBkZWxldGUgKyBkZWZpbmVQcm9wZXJ0eQogIG9wdGlvbnMuc2hhbSAgICAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzCiAgb3B0aW9ucy5lbnVtZXJhYmxlICAgICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5CiAgb3B0aW9ucy5kb250Q2FsbEdldFNldCAtIHByZXZlbnQgY2FsbGluZyBhIGdldHRlciBvbiB0YXJnZXQKICBvcHRpb25zLm5hbWUgICAgICAgICAgIC0gdGhlIC5uYW1lIG9mIHRoZSBmdW5jdGlvbiBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUga2V5CiovCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkgewogIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDsKICB2YXIgR0xPQkFMID0gb3B0aW9ucy5nbG9iYWw7CiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDsKICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yOwogIGlmIChHTE9CQUwpIHsKICAgIHRhcmdldCA9IGdsb2JhbFRoaXM7CiAgfSBlbHNlIGlmIChTVEFUSUMpIHsKICAgIHRhcmdldCA9IGdsb2JhbFRoaXNbVE
20FSR0VUXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShUQVJHRVQsIHt9KTsKICB9IGVsc2UgewogICAgdGFyZ2V0ID0gZ2xvYmFsVGhpc1tUQVJHRVRdICYmIGdsb2JhbFRoaXNbVEFSR0VUXS5wcm90b3R5cGU7CiAgfQogIGlmICh0YXJnZXQpIGZvciAoa2V5IGluIHNvdXJjZSkgewogICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTsKICAgIGlmIChvcHRpb25zLmRvbnRDYWxsR2V0U2V0KSB7CiAgICAgIGRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpOwogICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTsKICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldOwogICAgRk9SQ0VEID0gaXNGb3JjZWQoR0xPQkFMID8ga2V5IDogVEFSR0VUICsgKFNUQVRJQyA/ICcuJyA6ICcjJykgKyBrZXksIG9wdGlvbnMuZm9yY2VkKTsKICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXQKICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHR5cGVvZiBzb3VyY2VQcm9wZXJ0eSA9PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlOwogICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7CiAgICB9CiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzCiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkgewogICAgICBjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7CiAgICB9CiAgICBkZWZpbmVCdWlsdEluKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gOTAzOToKLyoqKi8gKChtb2R1bGUpID0+IHsKCgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7CiAgdHJ5IHsKICAgIHJldHVybiAhIWV4ZWMoKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHRydWU7CiAgfQp9OwoKCi8qKiovIH0pLAoKLyoqKi8gODc0NToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oNjE2KTsKCnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTsKdmFyIGFwcGx5ID0gRnVuY3Rpb25Qcm90b3R5cGUuYXBwbHk7CnZhciBjYWxsID0gRnVuY3Rpb25Qcm90b3R5cGUuY2FsbDsKCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1yZWZsZWN0IC0tIHNhZmUKbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgUmVmbGVjdCA9PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmFwcGx5IHx8IChOQVRJVkVfQklORCA/IGNhbGwuYmluZChhcHBseSkgOiBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIGNhbGwuYXBwbHkoYXBwbHksIGFyZ3VtZW50cyk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gNjA4MDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQ3Nik7CnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgTkFUSVZFX0JJTkQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxNik7Cgp2YXIgYmluZCA9IHVuY3VycnlUaGlzKHVuY3VycnlUaGlzLmJpbmQpOwoKLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0KSB7CiAgYUNhbGxhYmxlKGZuKTsKICByZXR1cm4gdGhhdCA9PT0gdW5kZWZpbmVkID8gZm4gOiBOQVRJVkVfQklORCA/IGJpbmQoZm4sIHRoYXQpIDogZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHsKICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpOwogIH07Cn07CgoKLyoqKi8gfSksCgovKioqLyA2MTY6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwoKbW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1mdW5jdGlvbi1wcm90b3R5cGUtYmluZCAtLSBzYWZlCiAgdmFyIHRlc3QgPSAoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KS5iaW5kKCk7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAtLSBzYWZlCiAgcmV0dXJuIHR5cGVvZiB0ZXN0ICE9ICdmdW5jdGlvbicgfHwgdGVzdC5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJyk7Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gOTU2NToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oNjE2KTsKCnZhciBjYWxsID0gRnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7Cgptb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9CSU5EID8gY2FsbC5iaW5kKGNhbGwpIDogZnVuY3Rpb24gKCkgewogIHJldHVybiBjYWxsLmFwcGx5KGNhbGwsIGFyZ3VtZW50cyk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAzNTA6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MjQpOwp2YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk3KTsKCnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZQp2YXIgZ2V0RGVzY3JpcHRvciA9IERFU0NSSVBUT1JTICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7Cgp2YXIgRVhJU1RTID0gaGFzT3duKEZ1bmN0aW9uUHJvdG90eXBlLCAnbmFtZScpOwovLyBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZnJvbSBtaW5pZmllZCAvIG1hbmdsZWQgLyBkcm9wcGVkIGZ1bmN0aW9uIG5hbWVzCnZhciBQUk9QRVIgPSBFWElTVFMgJiYgKGZ1bmN0aW9uIHNvbWV0aGluZygpIHsgLyogZW1wdHkgKi8gfSkubmFtZSA9PT0gJ3NvbWV0aGluZyc7CnZhciBDT05GSUdVUkFCTEUgPSBFWElTVFMgJiYgKCFERVNDUklQVE9SUyB8fCAoREVTQ1JJUFRPUlMgJiYgZ2V0RGVzY3JpcHRvcihGdW5jdGlvblByb3RvdHlwZSwgJ25hbWUnKS5jb25maWd1cmFibGUpKTsKCm1vZHVsZS5leHBvcnRzID0gewogIEVYSVNUUzogRVhJU1RTLAogIFBST1BFUjogUFJPUEVSLAogIENPTkZJR1VSQUJMRTogQ09ORklHVVJBQkxFCn07CgoKLyoqKi8gfSksCgovKioqLyA2NzA2OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKdmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTMwNik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgbWV0aG9kKSB7CiAgdHJ5IHsKICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmUKICAgIHJldHVybi
20B1bmN1cnJ5VGhpcyhhQ2FsbGFibGUoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIGtleSlbbWV0aG9kXSkpOwogIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KfTsKCgovKioqLyB9KSwKCi8qKiovIDc0NzY6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgY2xhc3NvZlJhdyA9IF9fd2VicGFja19yZXF1aXJlX18oMjE5NSk7CnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbikgewogIC8vIE5hc2hvcm4gYnVnOgogIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzExMjgKICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xMTMwCiAgaWYgKGNsYXNzb2ZSYXcoZm4pID09PSAnRnVuY3Rpb24nKSByZXR1cm4gdW5jdXJyeVRoaXMoZm4pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gOTUwNDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBOQVRJVkVfQklORCA9IF9fd2VicGFja19yZXF1aXJlX18oNjE2KTsKCnZhciBGdW5jdGlvblByb3RvdHlwZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTsKdmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsOwp2YXIgdW5jdXJyeVRoaXNXaXRoQmluZCA9IE5BVElWRV9CSU5EICYmIEZ1bmN0aW9uUHJvdG90eXBlLmJpbmQuYmluZChjYWxsLCBjYWxsKTsKCm1vZHVsZS5leHBvcnRzID0gTkFUSVZFX0JJTkQgPyB1bmN1cnJ5VGhpc1dpdGhCaW5kIDogZnVuY3Rpb24gKGZuKSB7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiBjYWxsLmFwcGx5KGZuLCBhcmd1bWVudHMpOwogIH07Cn07CgoKLyoqKi8gfSksCgovKioqLyA5NDI5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgSVNfTk9ERSA9IF9fd2VicGFja19yZXF1aXJlX18oNjE5Myk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgaWYgKElTX05PREUpIHsKICAgIHRyeSB7CiAgICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0QnVpbHRpbk1vZHVsZShuYW1lKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICAgIHRyeSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuYyAtLSBzYWZlCiAgICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHJlcXVpcmUoIicgKyBuYW1lICsgJyIpJykoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH0KICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyA3NzUxOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkwMSk7Cgp2YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgcmV0dXJuIGlzQ2FsbGFibGUoYXJndW1lbnQpID8gYXJndW1lbnQgOiB1bmRlZmluZWQ7Cn07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1ldGhvZCkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGFGdW5jdGlvbihnbG9iYWxUaGlzW25hbWVzcGFjZV0pIDogZ2xvYmFsVGhpc1tuYW1lc3BhY2VdICYmIGdsb2JhbFRoaXNbbmFtZXNwYWNlXVttZXRob2RdOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMTc2NzoKLyoqKi8gKChtb2R1bGUpID0+IHsKCgovLyBgR2V0SXRlcmF0b3JEaXJlY3Qob2JqKWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1pdGVyYXRvci1oZWxwZXJzLyNzZWMtZ2V0aXRlcmF0b3JkaXJlY3QKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7CiAgcmV0dXJuIHsKICAgIGl0ZXJhdG9yOiBvYmosCiAgICBuZXh0OiBvYmoubmV4dCwKICAgIGRvbmU6IGZhbHNlCiAgfTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDg1MToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBjbGFzc29mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OTU1KTsKdmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTk2Nik7CnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oNDExNyk7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyNjkpOwp2YXIgd2VsbEtub3duU3ltYm9sID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MjI3KTsKCnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdCkpIHJldHVybiBnZXRNZXRob2QoaXQsIElURVJBVE9SKQogICAgfHwgZ2V0TWV0aG9kKGl0LCAnQEBpdGVyYXRvcicpCiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gODE6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTU2NSk7CnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgdHJ5VG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MjMpOwp2YXIgZ2V0SXRlcmF0b3JNZXRob2QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1MSk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50LCB1c2luZ0l0ZXJhdG9yKSB7CiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBnZXRJdGVyYXRvck1ldGhvZChhcmd1bWVudCkgOiB1c2luZ0l0ZXJhdG9yOwogIGlmIChhQ2FsbGFibGUoaXRlcmF0b3JNZXRob2QpKSByZXR1cm4gYW5PYmplY3QoY2FsbChpdGVyYXRvck1ldGhvZCwgYXJndW1lbnQpKTsKICB0aHJvdyBuZXcgJFR5cGVFcnJvcih0cnlUb1N0cmluZyhhcmd1bWVudCkgKyAnIGlzIG5vdCBpdGVyYWJsZScpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNTk2NjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgaXNOdWxsT3JVbmRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQxMTcpOwoKLy8gYEdldE1ldGhvZGAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFYsIFApIHsKICB2YXIgZnVuYyA9IFZbUF07CiAgcmV0dXJuIGlzTnVsbE9yVW5kZWZpbmVkKGZ1bmMpID8gdW5kZWZpbmVkIDogYUNhbGxhYmxlKGZ1bmMpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMzc4OToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTU2NSk7CnZhciB0b0ludGVnZXJPckluZmluaXR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjkxKTsKdmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzY3KTsKCnZhciBJTlZBTElEX1NJWkUgPSAnSW52YWxpZCBzaXplJzsKdmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjsKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7CnZhciBtYXggPSBNYXRoLm1heDsKCnZhciBTZXRSZWNvcmQgPSBmdW5jdGlvbiAoc2V0LCBpbnRTaXplKSB7CiAgdGhpcy5zZXQgPSBzZXQ7CiAgdGhpcy5zaXplID0gbWF4KGludFNpemUsIDApOwogIHRoaXMuaGFzID0gYUNhbGx
20hYmxlKHNldC5oYXMpOwogIHRoaXMua2V5cyA9IGFDYWxsYWJsZShzZXQua2V5cyk7Cn07CgpTZXRSZWNvcmQucHJvdG90eXBlID0gewogIGdldEl0ZXJhdG9yOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gZ2V0SXRlcmF0b3JEaXJlY3QoYW5PYmplY3QoY2FsbCh0aGlzLmtleXMsIHRoaXMuc2V0KSkpOwogIH0sCiAgaW5jbHVkZXM6IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIGNhbGwodGhpcy5oYXMsIHRoaXMuc2V0LCBpdCk7CiAgfQp9OwoKLy8gYEdldFNldFJlY29yZGAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jc2VjLWdldHNldHJlY29yZAptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHsKICBhbk9iamVjdChvYmopOwogIHZhciBudW1TaXplID0gK29iai5zaXplOwogIC8vIE5PVEU6IElmIHNpemUgaXMgdW5kZWZpbmVkLCB0aGVuIG51bVNpemUgd2lsbCBiZSBOYU4KICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVjawogIGlmIChudW1TaXplICE9PSBudW1TaXplKSB0aHJvdyBuZXcgJFR5cGVFcnJvcihJTlZBTElEX1NJWkUpOwogIHZhciBpbnRTaXplID0gdG9JbnRlZ2VyT3JJbmZpbml0eShudW1TaXplKTsKICBpZiAoaW50U2l6ZSA8IDApIHRocm93IG5ldyAkUmFuZ2VFcnJvcihJTlZBTElEX1NJWkUpOwogIHJldHVybiBuZXcgU2V0UmVjb3JkKG9iaiwgaW50U2l6ZSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA0NTc2OgovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgoKdmFyIGNoZWNrID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGl0ICYmIGl0Lk1hdGggPT09IE1hdGggJiYgaXQ7Cn07CgovLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOAptb2R1bGUuZXhwb3J0cyA9CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWdsb2JhbC10aGlzIC0tIHNhZmUKICBjaGVjayh0eXBlb2YgZ2xvYmFsVGhpcyA9PSAnb2JqZWN0JyAmJiBnbG9iYWxUaGlzKSB8fAogIGNoZWNrKHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93KSB8fAogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gc2FmZQogIGNoZWNrKHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYpIHx8CiAgY2hlY2sodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwpIHx8CiAgY2hlY2sodHlwZW9mIHRoaXMgPT0gJ29iamVjdCcgJiYgdGhpcykgfHwKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmMgLS0gZmFsbGJhY2sKICAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwoKCi8qKiovIH0pLAoKLyoqKi8gOTI5NzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODk4MSk7Cgp2YXIgaGFzT3duUHJvcGVydHkgPSB1bmN1cnJ5VGhpcyh7fS5oYXNPd25Qcm9wZXJ0eSk7CgovLyBgSGFzT3duUHJvcGVydHlgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWhhc293bnByb3BlcnR5Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtaGFzb3duIC0tIHNhZmUKbW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaGFzT3duIHx8IGZ1bmN0aW9uIGhhc093bihpdCwga2V5KSB7CiAgcmV0dXJuIGhhc093blByb3BlcnR5KHRvT2JqZWN0KGl0KSwga2V5KTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDQyMToKLyoqKi8gKChtb2R1bGUpID0+IHsKCgptb2R1bGUuZXhwb3J0cyA9IHt9OwoKCi8qKiovIH0pLAoKLyoqKi8gMzk3OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdldEJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NTEpOwoKbW9kdWxlLmV4cG9ydHMgPSBnZXRCdWlsdEluKCdkb2N1bWVudCcsICdkb2N1bWVudEVsZW1lbnQnKTsKCgovKioqLyB9KSwKCi8qKiovIDU5MTc6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MjQpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwp2YXIgY3JlYXRlRWxlbWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNDA1NSk7CgovLyBUaGFua3MgdG8gSUU4IGZvciBpdHMgZnVubnkgZGVmaW5lUHJvcGVydHkKbW9kdWxlLmV4cG9ydHMgPSAhREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nCiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmVhdGVFbGVtZW50KCdkaXYnKSwgJ2EnLCB7CiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0KICB9KS5hICE9PSA3Owp9KTsKCgovKioqLyB9KSwKCi8qKiovIDcwNTU6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MDQpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oMjE5NSk7Cgp2YXIgJE9iamVjdCA9IE9iamVjdDsKdmFyIHNwbGl0ID0gdW5jdXJyeVRoaXMoJycuc3BsaXQpOwoKLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3MKbW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgLy8gdGhyb3dzIGFuIGVycm9yIGluIHJoaW5vLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvcmhpbm8vaXNzdWVzLzM0NgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgLS0gc2FmZQogIHJldHVybiAhJE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApOwp9KSA/IGZ1bmN0aW9uIChpdCkgewogIHJldHVybi
20BjbGFzc29mKGl0KSA9PT0gJ1N0cmluZycgPyBzcGxpdChpdCwgJycpIDogJE9iamVjdChpdCk7Cn0gOiAkT2JqZWN0OwoKCi8qKiovIH0pLAoKLyoqKi8gMzE2NzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7CnZhciBzZXRQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMjk2Nyk7CgovLyBtYWtlcyBzdWJjbGFzc2luZyB3b3JrIGNvcnJlY3QgZm9yIHdyYXBwZWQgYnVpbHQtaW5zCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCR0aGlzLCBkdW1teSwgV3JhcHBlcikgewogIHZhciBOZXdUYXJnZXQsIE5ld1RhcmdldFByb3RvdHlwZTsKICBpZiAoCiAgICAvLyBpdCBjYW4gd29yayBvbmx5IHdpdGggbmF0aXZlIGBzZXRQcm90b3R5cGVPZmAKICAgIHNldFByb3RvdHlwZU9mICYmCiAgICAvLyB3ZSBoYXZlbid0IGNvbXBsZXRlbHkgY29ycmVjdCBwcmUtRVM2IHdheSBmb3IgZ2V0dGluZyBgbmV3LnRhcmdldGAsIHNvIHVzZSB0aGlzCiAgICBpc0NhbGxhYmxlKE5ld1RhcmdldCA9IGR1bW15LmNvbnN0cnVjdG9yKSAmJgogICAgTmV3VGFyZ2V0ICE9PSBXcmFwcGVyICYmCiAgICBpc09iamVjdChOZXdUYXJnZXRQcm90b3R5cGUgPSBOZXdUYXJnZXQucHJvdG90eXBlKSAmJgogICAgTmV3VGFyZ2V0UHJvdG90eXBlICE9PSBXcmFwcGVyLnByb3RvdHlwZQogICkgc2V0UHJvdG90eXBlT2YoJHRoaXMsIE5ld1RhcmdldFByb3RvdHlwZSk7CiAgcmV0dXJuICR0aGlzOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMzcwNjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7CnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKdmFyIHN0b3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjI5KTsKCnZhciBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24udG9TdHJpbmcpOwoKLy8gdGhpcyBoZWxwZXIgYnJva2VuIGluIGBjb3JlLWpzQDMuNC4xLTMuNC40YCwgc28gd2UgY2FuJ3QgdXNlIGBzaGFyZWRgIGhlbHBlcgppZiAoIWlzQ2FsbGFibGUoc3RvcmUuaW5zcGVjdFNvdXJjZSkpIHsKICBzdG9yZS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGl0KSB7CiAgICByZXR1cm4gZnVuY3Rpb25Ub1N0cmluZyhpdCk7CiAgfTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBzdG9yZS5pbnNwZWN0U291cmNlOwoKCi8qKiovIH0pLAoKLyoqKi8gMTE4MToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBOQVRJVkVfV0VBS19NQVAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2MjIpOwp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Njk5KTsKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5Nyk7CnZhciBzaGFyZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc2MjkpOwp2YXIgc2hhcmVkS2V5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MTE5KTsKdmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMSk7Cgp2YXIgT0JKRUNUX0FMUkVBRFlfSU5JVElBTElaRUQgPSAnT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQnOwp2YXIgVHlwZUVycm9yID0gZ2xvYmFsVGhpcy5UeXBlRXJyb3I7CnZhciBXZWFrTWFwID0gZ2xvYmFsVGhpcy5XZWFrTWFwOwp2YXIgc2V0LCBnZXQsIGhhczsKCnZhciBlbmZvcmNlID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7Cn07Cgp2YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHsKICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7CiAgICB2YXIgc3RhdGU7CiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7CiAgICB9IHJldHVybiBzdGF0ZTsKICB9Owp9OwoKaWYgKE5BVElWRV9XRUFLX01BUCB8fCBzaGFyZWQuc3RhdGUpIHsKICB2YXIgc3RvcmUgPSBzaGFyZWQuc3RhdGUgfHwgKHNoYXJlZC5zdGF0ZSA9IG5ldyBXZWFrTWFwKCkpOwogIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi8KICBzdG9yZS5nZXQgPSBzdG9yZS5nZXQ7CiAgc3RvcmUuaGFzID0gc3RvcmUuaGFzOwogIHN0b3JlLnNldCA9IHN0b3JlLnNldDsKICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtYXNzaWduIC0tIHByb3RvdHlwZSBtZXRob2RzIHByb3RlY3Rpb24gKi8KICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7CiAgICBpZiAoc3RvcmUuaGFzKGl0KSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7CiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDsKICAgIHN0b3JlLnNldChpdCwgbWV0YWRhdGEpOwogICAgcmV0dXJuIG1ldGFkYXRhOwogIH07CiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7CiAgICByZXR1cm4gc3RvcmUuZ2V0KGl0KSB8fCB7fTsKICB9OwogIGhhcyA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIHN0b3JlLmhhcyhpdCk7CiAgfTsKfSBlbHNlIHsKICB2YXIgU1RBVEUgPSBzaGFyZWRLZXkoJ3N0YXRlJyk7CiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlOwogIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHsKICAgIGlmIChoYXNPd24oaXQsIFNUQVRFKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihPQkpFQ1RfQUxSRUFEWV9JTklUSUFMSVpFRCk7CiAgICBtZXRhZGF0YS5mYWNhZGUgPSBpdDsKICAgIGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShpdCwgU1RBVEUsIG1ldGFkYXRhKTsKICAgIHJldHVybi
20BtZXRhZGF0YTsKICB9OwogIGdldCA9IGZ1bmN0aW9uIChpdCkgewogICAgcmV0dXJuIGhhc093bihpdCwgU1RBVEUpID8gaXRbU1RBVEVdIDoge307CiAgfTsKICBoYXMgPSBmdW5jdGlvbiAoaXQpIHsKICAgIHJldHVybiBoYXNPd24oaXQsIFNUQVRFKTsKICB9Owp9Cgptb2R1bGUuZXhwb3J0cyA9IHsKICBzZXQ6IHNldCwKICBnZXQ6IGdldCwKICBoYXM6IGhhcywKICBlbmZvcmNlOiBlbmZvcmNlLAogIGdldHRlckZvcjogZ2V0dGVyRm9yCn07CgoKLyoqKi8gfSksCgovKioqLyA0MjA5OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oODIyNyk7CnZhciBJdGVyYXRvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYyNjkpOwoKdmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpOwp2YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7CgovLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA0Mzc2OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxOTUpOwoKLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWlzYXJyYXkKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLWFycmF5LWlzYXJyYXkgLS0gc2FmZQptb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmd1bWVudCkgewogIHJldHVybiBjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ0FycmF5JzsKfTsKCgovKioqLyB9KSwKCi8qKiovIDExMDg6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgY2xhc3NvZiA9IF9fd2VicGFja19yZXF1aXJlX18oNjk1NSk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkgewogIHZhciBrbGFzcyA9IGNsYXNzb2YoaXQpOwogIHJldHVybiBrbGFzcyA9PT0gJ0JpZ0ludDY0QXJyYXknIHx8IGtsYXNzID09PSAnQmlnVWludDY0QXJyYXknOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNDkwMToKLyoqKi8gKChtb2R1bGUpID0+IHsKCgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLUlzSFRNTEREQS1pbnRlcm5hbC1zbG90CnZhciBkb2N1bWVudEFsbCA9IHR5cGVvZiBkb2N1bWVudCA9PSAnb2JqZWN0JyAmJiBkb2N1bWVudC5hbGw7CgovLyBgSXNDYWxsYWJsZWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaXNjYWxsYWJsZQovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby10eXBlb2YtdW5kZWZpbmVkIC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nCm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIGRvY3VtZW50QWxsID09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50QWxsICE9PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoYXJndW1lbnQpIHsKICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09ICdmdW5jdGlvbicgfHwgYXJndW1lbnQgPT09IGRvY3VtZW50QWxsOwp9IDogZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMjc5NjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oOTAzOSk7CnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKCnZhciByZXBsYWNlbWVudCA9IC8jfFwucHJvdG90eXBlXC4vOwoKdmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikgewogIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTsKICByZXR1cm4gdmFsdWUgPT09IFBPTFlGSUxMID8gdHJ1ZQogICAgOiB2YWx1ZSA9PT0gTkFUSVZFID8gZmFsc2UKICAgIDogaXNDYWxsYWJsZShkZXRlY3Rpb24pID8gZmFpbHMoZGV0ZWN0aW9uKQogICAgOiAhIWRldGVjdGlvbjsKfTsKCnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTsKfTsKCnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9Owp2YXIgTkFUSVZFID0gaXNGb3JjZWQuTkFUSVZFID0gJ04nOwp2YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJzsKCm1vZHVsZS5leHBvcnRzID0gaXNGb3JjZWQ7CgoKLyoqKi8gfSksCgovKioqLyA0MTE3OgovKioqLyAoKG1vZHVsZSkgPT4gewoKCi8vIHdlIGNhbid0IHVzZSBqdXN0IGBpdCA9PSBudWxsYCBzaW5jZSBvZiBgZG9jdW1lbnQuYWxsYCBzcGVjaWFsIGNhc2UKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1Jc0hUTUxEREEtaW50ZXJuYWwtc2xvdC1hZWMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gaXQgPT09IG51bGwgfHwgaXQgPT09IHVuZGVmaW5lZDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDM0OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MDEpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiBpc0NhbGxhYmxlKGl0KTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDM5MjU6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgcmV0dXJuIGlzT2JqZWN0KGFyZ3VtZW50KSB8fCBhcmd1bWVudCA9PT0gbnVsbDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDYzOTU6Ci8qKiovICgobW9kdWxlKSA9PiB7CgoKbW9kdWxlLmV4cG9ydHMgPSBmYWxzZTsKCgovKioqLyB9KSwKCi8qKiovIDc1NzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzUxKTsKdmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MDEpOwp2YXIgaXNQcm90b3R5cGVPZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTYyNSk7CnZhciBVU0VfU1lNQk9MX0
20FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oNzA0MCk7Cgp2YXIgJE9iamVjdCA9IE9iamVjdDsKCm1vZHVsZS5leHBvcnRzID0gVVNFX1NZTUJPTF9BU19VSUQgPyBmdW5jdGlvbiAoaXQpIHsKICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnOwp9IDogZnVuY3Rpb24gKGl0KSB7CiAgdmFyICRTeW1ib2wgPSBnZXRCdWlsdEluKCdTeW1ib2wnKTsKICByZXR1cm4gaXNDYWxsYWJsZSgkU3ltYm9sKSAmJiBpc1Byb3RvdHlwZU9mKCRTeW1ib2wucHJvdG90eXBlLCAkT2JqZWN0KGl0KSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA1MDc6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTU2NSk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZWNvcmQsIGZuLCBJVEVSQVRPUl9JTlNURUFEX09GX1JFQ09SRCkgewogIHZhciBpdGVyYXRvciA9IElURVJBVE9SX0lOU1RFQURfT0ZfUkVDT1JEID8gcmVjb3JkIDogcmVjb3JkLml0ZXJhdG9yOwogIHZhciBuZXh0ID0gcmVjb3JkLm5leHQ7CiAgdmFyIHN0ZXAsIHJlc3VsdDsKICB3aGlsZSAoIShzdGVwID0gY2FsbChuZXh0LCBpdGVyYXRvcikpLmRvbmUpIHsKICAgIHJlc3VsdCA9IGZuKHN0ZXAudmFsdWUpOwogICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcmVzdWx0OwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovIDI2NTI6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgYmluZCA9IF9fd2VicGFja19yZXF1aXJlX18oNjA4MCk7CnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTY1KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIHRyeVRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODIzKTsKdmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oNDIwOSk7CnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjE5OCk7CnZhciBpc1Byb3RvdHlwZU9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjI1KTsKdmFyIGdldEl0ZXJhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSk7CnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oODUxKTsKdmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MzkpOwoKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7Cgp2YXIgUmVzdWx0ID0gZnVuY3Rpb24gKHN0b3BwZWQsIHJlc3VsdCkgewogIHRoaXMuc3RvcHBlZCA9IHN0b3BwZWQ7CiAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7Cn07Cgp2YXIgUmVzdWx0UHJvdG90eXBlID0gUmVzdWx0LnByb3RvdHlwZTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCB1bmJvdW5kRnVuY3Rpb24sIG9wdGlvbnMpIHsKICB2YXIgdGhhdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50aGF0OwogIHZhciBBU19FTlRSSUVTID0gISEob3B0aW9ucyAmJiBvcHRpb25zLkFTX0VOVFJJRVMpOwogIHZhciBJU19SRUNPUkQgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfUkVDT1JEKTsKICB2YXIgSVNfSVRFUkFUT1IgPSAhIShvcHRpb25zICYmIG9wdGlvbnMuSVNfSVRFUkFUT1IpOwogIHZhciBJTlRFUlJVUFRFRCA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5JTlRFUlJVUFRFRCk7CiAgdmFyIGZuID0gYmluZCh1bmJvdW5kRnVuY3Rpb24sIHRoYXQpOwogIHZhciBpdGVyYXRvciwgaXRlckZuLCBpbmRleCwgbGVuZ3RoLCByZXN1bHQsIG5leHQsIHN0ZXA7CgogIHZhciBzdG9wID0gZnVuY3Rpb24gKGNvbmRpdGlvbikgewogICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgY29uZGl0aW9uKTsKICAgIHJldHVybiBuZXcgUmVzdWx0KHRydWUsIGNvbmRpdGlvbik7CiAgfTsKCiAgdmFyIGNhbGxGbiA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgaWYgKEFTX0VOVFJJRVMpIHsKICAgICAgYW5PYmplY3QodmFsdWUpOwogICAgICByZXR1cm4gSU5URVJSVVBURUQgPyBmbih2YWx1ZVswXSwgdmFsdWVbMV0sIHN0b3ApIDogZm4odmFsdWVbMF0sIHZhbHVlWzFdKTsKICAgIH0gcmV0dXJuIElOVEVSUlVQVEVEID8gZm4odmFsdWUsIHN0b3ApIDogZm4odmFsdWUpOwogIH07CgogIGlmIChJU19SRUNPUkQpIHsKICAgIGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3I7CiAgfSBlbHNlIGlmIChJU19JVEVSQVRPUikgewogICAgaXRlcmF0b3IgPSBpdGVyYWJsZTsKICB9IGVsc2UgewogICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpOwogICAgaWYgKCFpdGVyRm4pIHRocm93IG5ldyAkVHlwZUVycm9yKHRyeVRvU3RyaW5nKGl0ZXJhYmxlKSArICcgaXMgbm90IGl0ZXJhYmxlJyk7CiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9ycwogICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7CiAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBsZW5ndGhPZkFycmF5TGlrZShpdGVyYWJsZSk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7CiAgICAgICAgcmVzdWx0ID0gY2FsbEZuKGl0ZXJhYmxlW2luZGV4XSk7CiAgICAgICAgaWYgKHJlc3VsdCAmJiBpc1Byb3RvdHlwZU9mKFJlc3VsdFByb3RvdHlwZSwgcmVzdWx0KSkgcmV0dXJuIHJlc3VsdDsKICAgICAgfSByZXR1cm4gbmV3IFJlc3VsdChmYWxzZSk7CiAgICB9CiAgICBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlLCBpdGVyRm4pOwogIH0KCiAgbmV4dCA9IElTX1JFQ09SRCA/IGl0ZXJhYmxlLm5leHQgOiBpdGVyYXRvci5uZXh0OwogIHdoaWxlICghKHN0ZXAgPSBjYWxsKG5leHQsIGl0ZXJhdG9yKSkuZG9uZSkgewogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gY2FsbEZuKHN0ZXAudmFsdWUpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgaXRlcmF0b3JDbG9zZShpdGVyYXRvciwgJ3Rocm93JywgZXJyb3IpOwogICAgfQogICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gJ29iamVjdCcgJiYgcmVzdWx0ICYmIGlzUHJvdG90eXBlT2YoUmVzdWx0UHJvdG90eXBlLCByZXN1bHQpKSByZXR1cm4gcmVzdWx0OwogIH0gcmV0dXJuIG5ldyBSZXN1bHQoZmFsc2UpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gOTUzOToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTY1KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTk2Nik7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwga2luZCwgdmFsdWUpIHsKICB2YXIgaW5uZXJSZXN1bHQsIGlubmVyRXJyb3I7CiAgYW5PYmplY3QoaXRlcmF0b3IpOwogIHRyeSB7CiAgICBpbm5lclJlc3VsdCA9IGdldE1ldGhvZChpdGVyYXRvciwgJ3JldHVybicpOwogICAgaWYgKCFpbm5lclJlc3VsdCkgewogICAgICBpZiAoa2luZCA9PT0gJ3Rocm93JykgdGhyb3cgdmFsdWU7CiAgICAgI
20HJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlubmVyUmVzdWx0ID0gY2FsbChpbm5lclJlc3VsdCwgaXRlcmF0b3IpOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBpbm5lckVycm9yID0gdHJ1ZTsKICAgIGlubmVyUmVzdWx0ID0gZXJyb3I7CiAgfQogIGlmIChraW5kID09PSAndGhyb3cnKSB0aHJvdyB2YWx1ZTsKICBpZiAoaW5uZXJFcnJvcikgdGhyb3cgaW5uZXJSZXN1bHQ7CiAgYW5PYmplY3QoaW5uZXJSZXN1bHQpOwogIHJldHVybiB2YWx1ZTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDk0NjI6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgY2FsbCA9IF9fd2VicGFja19yZXF1aXJlX18oOTU2NSk7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzNjApOwp2YXIgY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Njk5KTsKdmFyIGRlZmluZUJ1aWx0SW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mjc5KTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oODIyNyk7CnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTgxKTsKdmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTk2Nik7CnZhciBJdGVyYXRvclByb3RvdHlwZSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDc2NTcpLkl0ZXJhdG9yUHJvdG90eXBlKTsKdmFyIGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1MjkpOwp2YXIgaXRlcmF0b3JDbG9zZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTUzOSk7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKdmFyIElURVJBVE9SX0hFTFBFUiA9ICdJdGVyYXRvckhlbHBlcic7CnZhciBXUkFQX0ZPUl9WQUxJRF9JVEVSQVRPUiA9ICdXcmFwRm9yVmFsaWRJdGVyYXRvcic7CnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7Cgp2YXIgY3JlYXRlSXRlcmF0b3JQcm94eVByb3RvdHlwZSA9IGZ1bmN0aW9uIChJU19JVEVSQVRPUikgewogIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoSVNfSVRFUkFUT1IgPyBXUkFQX0ZPUl9WQUxJRF9JVEVSQVRPUiA6IElURVJBVE9SX0hFTFBFUik7CgogIHJldHVybiBkZWZpbmVCdWlsdElucyhjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpLCB7CiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkgewogICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogICAgICAvLyBmb3Igc2ltcGxpZmljYXRpb246CiAgICAgIC8vICAgZm9yIGAlV3JhcEZvclZhbGlkSXRlcmF0b3JQcm90b3R5cGUlLm5leHRgIG91ciBgbmV4dEhhbmRsZXJgIHJldHVybnMgYEl0ZXJSZXN1bHRPYmplY3RgCiAgICAgIC8vICAgZm9yIGAlSXRlcmF0b3JIZWxwZXJQcm90b3R5cGUlLm5leHRgIC0ganVzdCBhIHZhbHVlCiAgICAgIGlmIChJU19JVEVSQVRPUikgcmV0dXJuIHN0YXRlLm5leHRIYW5kbGVyKCk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHN0YXRlLmRvbmUgPyB1bmRlZmluZWQgOiBzdGF0ZS5uZXh0SGFuZGxlcigpOwogICAgICAgIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHJlc3VsdCwgc3RhdGUuZG9uZSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgc3RhdGUuZG9uZSA9IHRydWU7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgIH0sCiAgICAncmV0dXJuJzogZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpOwogICAgICB2YXIgaXRlcmF0b3IgPSBzdGF0ZS5pdGVyYXRvcjsKICAgICAgc3RhdGUuZG9uZSA9IHRydWU7CiAgICAgIGlmIChJU19JVEVSQVRPUikgewogICAgICAgIHZhciByZXR1cm5NZXRob2QgPSBnZXRNZXRob2QoaXRlcmF0b3IsICdyZXR1cm4nKTsKICAgICAgICByZXR1cm4gcmV0dXJuTWV0aG9kID8gY2FsbChyZXR1cm5NZXRob2QsIGl0ZXJhdG9yKSA6IGNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTsKICAgICAgfQogICAgICBpZiAoc3RhdGUuaW5uZXIpIHRyeSB7CiAgICAgICAgaXRlcmF0b3JDbG9zZShzdGF0ZS5pbm5lci5pdGVyYXRvciwgJ25vcm1hbCcpOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHJldHVybiBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAndGhyb3cnLCBlcnJvcik7CiAgICAgIH0KICAgICAgaWYgKGl0ZXJhdG9yKSBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJyk7CiAgICAgIHJldHVybiBjcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICB9CiAgfSk7Cn07Cgp2YXIgV3JhcEZvclZhbGlkSXRlcmF0b3JQcm90b3R5cGUgPSBjcmVhdGVJdGVyYXRvclByb3h5UHJvdG90eXBlKHRydWUpOwp2YXIgSXRlcmF0b3JIZWxwZXJQcm90b3R5cGUgPSBjcmVhdGVJdGVyYXRvclByb3h5UHJvdG90eXBlKGZhbHNlKTsKCmNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShJdGVyYXRvckhlbHBlclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgJ0l0ZXJhdG9yIEhlbHBlcicpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmV4dEhhbmRsZXIsIElTX0lURVJBVE9SKSB7CiAgdmFyIEl0ZXJhdG9yUHJveHkgPSBmdW5jdGlvbiBJdGVyYXRvcihyZWNvcmQsIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUpIHsKICAgICAgc3RhdGUuaXRlcmF0b3IgPSByZWNvcmQuaXRlcmF0b3I7CiAgICAgIHN0YXRlLm5leHQgPSByZWNvcmQubmV4dDsKICAgIH0gZWxzZSBzdGF0ZSA9IHJlY29yZDsKICAgIHN0YXRlLnR5cGUgPSBJU19JVEVSQVRPUiA/IFdSQVBfRk9SX1ZBTElEX0lURVJBVE9SIDogSVRFUkFUT1JfSEVMUEVSOwogICAgc3RhdGUubmV4dEhhbmRsZXIgPSBuZXh0SGFuZGxlcjsKICAgIHN0YXRlLmNvdW50ZXIgPSAwOwogICAgc3RhdGUuZG9uZSA9IGZhbHNlOwogICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCBzdGF0ZSk7CiAgfTsKCiAgSXRlcmF0b3JQcm94eS5wcm90b3R5cGUgPSBJU19JVEVSQVRPUiA/IFdyYXBGb3JWYWxpZEl0ZXJhdG9yUHJvdG90eXBlIDogSXRlcmF0b3JIZWxwZXJQcm90b3R5cGU7CgogIHJldHVybi
20BJdGVyYXRvclByb3h5Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNzEzOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1NjUpOwp2YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzA2KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzY3KTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0NjIpOwp2YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oNjMxOSk7Cgp2YXIgSXRlcmF0b3JQcm94eSA9IGNyZWF0ZUl0ZXJhdG9yUHJveHkoZnVuY3Rpb24gKCkgewogIHZhciBpdGVyYXRvciA9IHRoaXMuaXRlcmF0b3I7CiAgdmFyIHJlc3VsdCA9IGFuT2JqZWN0KGNhbGwodGhpcy5uZXh0LCBpdGVyYXRvcikpOwogIHZhciBkb25lID0gdGhpcy5kb25lID0gISFyZXN1bHQuZG9uZTsKICBpZiAoIWRvbmUpIHJldHVybiBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCB0aGlzLm1hcHBlciwgW3Jlc3VsdC52YWx1ZSwgdGhpcy5jb3VudGVyKytdLCB0cnVlKTsKfSk7CgovLyBgSXRlcmF0b3IucHJvdG90eXBlLm1hcGAgbWV0aG9kCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWl0ZXJhdG9yLWhlbHBlcnMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtYXAobWFwcGVyKSB7CiAgYW5PYmplY3QodGhpcyk7CiAgYUNhbGxhYmxlKG1hcHBlcik7CiAgcmV0dXJuIG5ldyBJdGVyYXRvclByb3h5KGdldEl0ZXJhdG9yRGlyZWN0KHRoaXMpLCB7CiAgICBtYXBwZXI6IG1hcHBlcgogIH0pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNzY1NzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oOTAzOSk7CnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7CnZhciBjcmVhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzNjApOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3ODcpOwp2YXIgZGVmaW5lQnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNjg0MCk7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyMjcpOwp2YXIgSVNfUFVSRSA9IF9fd2VicGFja19yZXF1aXJlX18oNjM5NSk7Cgp2YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7CnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gZmFsc2U7CgovLyBgJUl0ZXJhdG9yUHJvdG90eXBlJWAgb2JqZWN0Ci8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJWl0ZXJhdG9ycHJvdG90eXBlJS1vYmplY3QKdmFyIEl0ZXJhdG9yUHJvdG90eXBlLCBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGUsIGFycmF5SXRlcmF0b3I7CgovKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1hcnJheS1wcm90b3R5cGUta2V5cyAtLSBzYWZlICovCmlmIChbXS5rZXlzKSB7CiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTsKICAvLyBTYWZhcmkgOCBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGAKICBpZiAoISgnbmV4dCcgaW4gYXJyYXlJdGVyYXRvcikpIEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgPSB0cnVlOwogIGVsc2UgewogICAgUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoZ2V0UHJvdG90eXBlT2YoYXJyYXlJdGVyYXRvcikpOwogICAgaWYgKFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgSXRlcmF0b3JQcm90b3R5cGUgPSBQcm90b3R5cGVPZkFycmF5SXRlcmF0b3JQcm90b3R5cGU7CiAgfQp9Cgp2YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRSA9ICFpc09iamVjdChJdGVyYXRvclByb3RvdHlwZSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkgewogIHZhciB0ZXN0ID0ge307CiAgLy8gRkY0NC0gbGVnYWN5IGl0ZXJhdG9ycyBjYXNlCiAgcmV0dXJuIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXS5jYWxsKHRlc3QpICE9PSB0ZXN0Owp9KTsKCmlmIChORVdfSVRFUkFUT1JfUFJPVE9UWVBFKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9OwplbHNlIGlmIChJU19QVVJFKSBJdGVyYXRvclByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7CgovLyBgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0laXRlcmF0b3Jwcm90b3R5cGUlLUBAaXRlcmF0b3IKaWYgKCFpc0NhbGxhYmxlKEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSkpIHsKICBkZWZpbmVCdWlsdEluKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSk7Cn0KCm1vZHVsZS5leHBvcnRzID0gewogIEl0ZXJhdG9yUHJvdG90eXBlOiBJdGVyYXRvclByb3RvdHlwZSwKICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTCn07CgoKLyoqKi8gfSksCgovKioqLyA2MjY5OgovKioqLyAoKG1vZHVsZSkgPT4gewoKCm1vZHVsZS5leHBvcnRzID0ge307CgoKLyoqKi8gfSksCgovKioqLyA2MTk4OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHRvTGVuZ3RoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MDE0KTsKCi8vIGBMZW5ndGhPZkFycmF5TGlrZWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbGVuZ3Rob2ZhcnJheWxpa2UKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7CiAgcmV0dXJuIHRvTGVuZ3RoKG9iai5sZW5ndGgpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMjgzOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDM5KTsKdmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MDEpOwp2YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk3KTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzI0KTsKdmFyIENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FID0gKF9fd2VicGFja19yZXF1aXJlX18oMzUwKS5DT05GSUdVUkFCTEUpOwp2YXIgaW5zcGVjdFNvdXJjZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzcwNik7CnZhciBJbnRlcm5hbFN0YXRlTW9
20kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTgxKTsKCnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTsKdmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDsKdmFyICRTdHJpbmcgPSBTdHJpbmc7Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZQp2YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CnZhciBzdHJpbmdTbGljZSA9IHVuY3VycnlUaGlzKCcnLnNsaWNlKTsKdmFyIHJlcGxhY2UgPSB1bmN1cnJ5VGhpcygnJy5yZXBsYWNlKTsKdmFyIGpvaW4gPSB1bmN1cnJ5VGhpcyhbXS5qb2luKTsKCnZhciBDT05GSUdVUkFCTEVfTEVOR1RIID0gREVTQ1JJUFRPUlMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAnbGVuZ3RoJywgeyB2YWx1ZTogOCB9KS5sZW5ndGggIT09IDg7Cn0pOwoKdmFyIFRFTVBMQVRFID0gU3RyaW5nKFN0cmluZykuc3BsaXQoJ1N0cmluZycpOwoKdmFyIG1ha2VCdWlsdEluID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsdWUsIG5hbWUsIG9wdGlvbnMpIHsKICBpZiAoc3RyaW5nU2xpY2UoJFN0cmluZyhuYW1lKSwgMCwgNykgPT09ICdTeW1ib2woJykgewogICAgbmFtZSA9ICdbJyArIHJlcGxhY2UoJFN0cmluZyhuYW1lKSwgL15TeW1ib2xcKChbXildKilcKS4qJC8sICckMScpICsgJ10nOwogIH0KICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdldHRlcikgbmFtZSA9ICdnZXQgJyArIG5hbWU7CiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXR0ZXIpIG5hbWUgPSAnc2V0ICcgKyBuYW1lOwogIGlmICghaGFzT3duKHZhbHVlLCAnbmFtZScpIHx8IChDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSAmJiB2YWx1ZS5uYW1lICE9PSBuYW1lKSkgewogICAgaWYgKERFU0NSSVBUT1JTKSBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lLCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICBlbHNlIHZhbHVlLm5hbWUgPSBuYW1lOwogIH0KICBpZiAoQ09ORklHVVJBQkxFX0xFTkdUSCAmJiBvcHRpb25zICYmIGhhc093bihvcHRpb25zLCAnYXJpdHknKSAmJiB2YWx1ZS5sZW5ndGggIT09IG9wdGlvbnMuYXJpdHkpIHsKICAgIGRlZmluZVByb3BlcnR5KHZhbHVlLCAnbGVuZ3RoJywgeyB2YWx1ZTogb3B0aW9ucy5hcml0eSB9KTsKICB9CiAgdHJ5IHsKICAgIGlmIChvcHRpb25zICYmIGhhc093bihvcHRpb25zLCAnY29uc3RydWN0b3InKSAmJiBvcHRpb25zLmNvbnN0cnVjdG9yKSB7CiAgICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkodmFsdWUsICdwcm90b3R5cGUnLCB7IHdyaXRhYmxlOiBmYWxzZSB9KTsKICAgIC8vIGluIFY4IH4gQ2hyb21lIDUzLCBwcm90b3R5cGVzIG9mIHNvbWUgbWV0aG9kcywgbGlrZSBgQXJyYXkucHJvdG90eXBlLnZhbHVlc2AsIGFyZSBub24td3JpdGFibGUKICAgIH0gZWxzZSBpZiAodmFsdWUucHJvdG90eXBlKSB2YWx1ZS5wcm90b3R5cGUgPSB1bmRlZmluZWQ7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIHZhciBzdGF0ZSA9IGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKTsKICBpZiAoIWhhc093bihzdGF0ZSwgJ3NvdXJjZScpKSB7CiAgICBzdGF0ZS5zb3VyY2UgPSBqb2luKFRFTVBMQVRFLCB0eXBlb2YgbmFtZSA9PSAnc3RyaW5nJyA/IG5hbWUgOiAnJyk7CiAgfSByZXR1cm4gdmFsdWU7Cn07CgovLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmUKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV4dGVuZC1uYXRpdmUgLS0gcmVxdWlyZWQKRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbWFrZUJ1aWx0SW4oZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgcmV0dXJuIGlzQ2FsbGFibGUodGhpcykgJiYgZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKS5zb3VyY2UgfHwgaW5zcGVjdFNvdXJjZSh0aGlzKTsKfSwgJ3RvU3RyaW5nJyk7CgoKLyoqKi8gfSksCgovKioqLyA3NDE6Ci8qKiovICgobW9kdWxlKSA9PiB7CgoKdmFyIGNlaWwgPSBNYXRoLmNlaWw7CnZhciBmbG9vciA9IE1hdGguZmxvb3I7CgovLyBgTWF0aC50cnVuY2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbWF0aC50cnVuYwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tbWF0aC10cnVuYyAtLSBzYWZlCm1vZHVsZS5leHBvcnRzID0gTWF0aC50cnVuYyB8fCBmdW5jdGlvbiB0cnVuYyh4KSB7CiAgdmFyIG4gPSAreDsKICByZXR1cm4gKG4gPiAwID8gZmxvb3IgOiBjZWlsKShuKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDYwNDM6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzA2KTsKCnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yOwoKdmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHsKICB2YXIgcmVzb2x2ZSwgcmVqZWN0OwogIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7CiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTsKICAgIHJlc29sdmUgPSAkJHJlc29sdmU7CiAgICByZWplY3QgPSAkJHJlamVjdDsKICB9KTsKICB0aGlzLnJlc29sdmUgPSBhQ2FsbGFibGUocmVzb2x2ZSk7CiAgdGhpcy5yZWplY3QgPSBhQ2FsbGFibGUocmVqZWN0KTsKfTsKCi8vIGBOZXdQcm9taXNlQ2FwYWJpbGl0eWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbmV3cHJvbWlzZWNhcGFiaWxpdHkKbW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDI2MDM6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1NSk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCwgJGRlZmF1bHQpIHsKICByZXR1cm4gYXJndW1lbnQgPT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gJycgOiAkZGVmYXVsdCA6IHRvU3RyaW5nKGFyZ3VtZW50KTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDIzNjA6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovKiBnbG9iYWwgQWN0aXZlWE9iamVjdCAtLSBvbGQgSUUsIFdTSCAqLwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgZGVmaW5lUHJvcGVydGllc01vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjgwMSk7CnZhciBlbnVtQnVnS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oODcyNyk7CnZhciBoaWRkZW5L
20ZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjEpOwp2YXIgaHRtbCA9IF9fd2VicGFja19yZXF1aXJlX18oMzk3KTsKdmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNDA1NSk7CnZhciBzaGFyZWRLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxMTkpOwoKdmFyIEdUID0gJz4nOwp2YXIgTFQgPSAnPCc7CnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJzsKdmFyIFNDUklQVCA9ICdzY3JpcHQnOwp2YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7Cgp2YXIgRW1wdHlDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTsKCnZhciBzY3JpcHRUYWcgPSBmdW5jdGlvbiAoY29udGVudCkgewogIHJldHVybiBMVCArIFNDUklQVCArIEdUICsgY29udGVudCArIExUICsgJy8nICsgU0NSSVBUICsgR1Q7Cn07CgovLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgQWN0aXZlWCBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZQp2YXIgTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWCA9IGZ1bmN0aW9uIChhY3RpdmVYRG9jdW1lbnQpIHsKICBhY3RpdmVYRG9jdW1lbnQud3JpdGUoc2NyaXB0VGFnKCcnKSk7CiAgYWN0aXZlWERvY3VtZW50LmNsb3NlKCk7CiAgdmFyIHRlbXAgPSBhY3RpdmVYRG9jdW1lbnQucGFyZW50V2luZG93Lk9iamVjdDsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1hc3NpZ25tZW50IC0tIGF2b2lkIG1lbW9yeSBsZWFrCiAgYWN0aXZlWERvY3VtZW50ID0gbnVsbDsKICByZXR1cm4gdGVtcDsKfTsKCi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGUKdmFyIE51bGxQcm90b09iamVjdFZpYUlGcmFtZSA9IGZ1bmN0aW9uICgpIHsKICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1ZwogIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogIHZhciBKUyA9ICdqYXZhJyArIFNDUklQVCArICc6JzsKICB2YXIgaWZyYW1lRG9jdW1lbnQ7CiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgaHRtbC5hcHBlbmRDaGlsZChpZnJhbWUpOwogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80NzUKICBpZnJhbWUuc3JjID0gU3RyaW5nKEpTKTsKICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwogIGlmcmFtZURvY3VtZW50Lm9wZW4oKTsKICBpZnJhbWVEb2N1bWVudC53cml0ZShzY3JpcHRUYWcoJ2RvY3VtZW50LkY9T2JqZWN0JykpOwogIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7CiAgcmV0dXJuIGlmcmFtZURvY3VtZW50LkY7Cn07CgovLyBDaGVjayBmb3IgZG9jdW1lbnQuZG9tYWluIGFuZCBhY3RpdmUgeCBzdXBwb3J0Ci8vIE5vIG5lZWQgdG8gdXNlIGFjdGl2ZSB4IGFwcHJvYWNoIHdoZW4gZG9jdW1lbnQuZG9tYWluIGlzIG5vdCBzZXQKLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwCi8vIHZhcmlhdGlvbiBvZiBodHRwczovL2dpdGh1Yi5jb20va2l0Y2FtYnJpZGdlL2VzNS1zaGltL2NvbW1pdC80ZjczOGFjMDY2MzQ2Ci8vIGF2b2lkIElFIEdDIGJ1Zwp2YXIgYWN0aXZlWERvY3VtZW50Owp2YXIgTnVsbFByb3RvT2JqZWN0ID0gZnVuY3Rpb24gKCkgewogIHRyeSB7CiAgICBhY3RpdmVYRG9jdW1lbnQgPSBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTsKICB9IGNhdGNoIChlcnJvcikgeyAvKiBpZ25vcmUgKi8gfQogIE51bGxQcm90b09iamVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPSAndW5kZWZpbmVkJwogICAgPyBkb2N1bWVudC5kb21haW4gJiYgYWN0aXZlWERvY3VtZW50CiAgICAgID8gTnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpIC8vIG9sZCBJRQogICAgICA6IE51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpCiAgICA6IE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KTsgLy8gV1NICiAgdmFyIGxlbmd0aCA9IGVudW1CdWdLZXlzLmxlbmd0aDsKICB3aGlsZSAobGVuZ3RoLS0pIGRlbGV0ZSBOdWxsUHJvdG9PYmplY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTsKICByZXR1cm4gTnVsbFByb3RvT2JqZWN0KCk7Cn07CgpoaWRkZW5LZXlzW0lFX1BST1RPXSA9IHRydWU7CgovLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmNyZWF0ZQovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWNyZWF0ZSAtLSBzYWZlCm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykgewogIHZhciByZXN1bHQ7CiAgaWYgKE8gIT09IG51bGwpIHsKICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pOwogICAgcmVzdWx0ID0gbmV3IEVtcHR5Q29uc3RydWN0b3IoKTsKICAgIEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFXSA9IG51bGw7CiAgICAvLyBhZGQgIl9fcHJvdG9fXyIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbAogICAgcmVzdWx0W0lFX1BST1RPXSA9IE87CiAgfSBlbHNlIHJlc3VsdCA9IE51bGxQcm90b09iamVjdCgpOwogIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzTW9kdWxlLmYocmVzdWx0LCBQcm9wZXJ0aWVzKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDY4MDE6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MjQpOwp2YXIgVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2ODYpOwp2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MTMpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mzk3KTsKdmFyIG9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNzIpOwoKLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3QuZGVmaW5lcHJvcGVydGllcwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnRpZXMgLS0gc2FmZQpleHBvcnRzLmYgPSBERVNDUklQVE9SUyAmJiAhVjhfUFJPVE9UWVBFX0RFRklORV9CVUcgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykgewogIGFuT2JqZWN0KE8pOwogIHZhciBwcm9wcyA9IHRvSW5kZXhlZE9iamVjdChQcm9wZXJ0aWVzKTsKICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7CiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoOwogIHZhciBpbmRleCA9IDA7CiAgdmFyIGtleTsKICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpbmRleCsrXSwgcHJvcHNba2V5XSk7CiAgcmV0dXJuIE87Cn07CgoKLyoqKi8gfSksCgovKioqLyA0OTEzOgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzI0KTsKdmFyIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1OTE3KTsKdmFyIFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4Njg2KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIHRvUHJv
20cGVydHlLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5NjkpOwoKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZGVmaW5lcHJvcGVydHkgLS0gc2FmZQp2YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlCnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKdmFyIEVOVU1FUkFCTEUgPSAnZW51bWVyYWJsZSc7CnZhciBDT05GSUdVUkFCTEUgPSAnY29uZmlndXJhYmxlJzsKdmFyIFdSSVRBQkxFID0gJ3dyaXRhYmxlJzsKCi8vIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eQpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IFY4X1BST1RPVFlQRV9ERUZJTkVfQlVHID8gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgewogIGFuT2JqZWN0KE8pOwogIFAgPSB0b1Byb3BlcnR5S2V5KFApOwogIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOwogIGlmICh0eXBlb2YgTyA9PT0gJ2Z1bmN0aW9uJyAmJiBQID09PSAncHJvdG90eXBlJyAmJiAndmFsdWUnIGluIEF0dHJpYnV0ZXMgJiYgV1JJVEFCTEUgaW4gQXR0cmlidXRlcyAmJiAhQXR0cmlidXRlc1tXUklUQUJMRV0pIHsKICAgIHZhciBjdXJyZW50ID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKTsKICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnRbV1JJVEFCTEVdKSB7CiAgICAgIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlOwogICAgICBBdHRyaWJ1dGVzID0gewogICAgICAgIGNvbmZpZ3VyYWJsZTogQ09ORklHVVJBQkxFIGluIEF0dHJpYnV0ZXMgPyBBdHRyaWJ1dGVzW0NPTkZJR1VSQUJMRV0gOiBjdXJyZW50W0NPTkZJR1VSQUJMRV0sCiAgICAgICAgZW51bWVyYWJsZTogRU5VTUVSQUJMRSBpbiBBdHRyaWJ1dGVzID8gQXR0cmlidXRlc1tFTlVNRVJBQkxFXSA6IGN1cnJlbnRbRU5VTUVSQUJMRV0sCiAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgfSByZXR1cm4gJGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpOwp9IDogJGRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykgewogIGFuT2JqZWN0KE8pOwogIFAgPSB0b1Byb3BlcnR5S2V5KFApOwogIGFuT2JqZWN0KEF0dHJpYnV0ZXMpOwogIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHsKICAgIHJldHVybiAkZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IG5ldyAkVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCcpOwogIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlOwogIHJldHVybiBPOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNzM0NzoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7CnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTY1KTsKdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzczKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjk4MCk7CnZhciB0b0luZGV4ZWRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUzOTcpOwp2YXIgdG9Qcm9wZXJ0eUtleSA9IF9fd2VicGFja19yZXF1aXJlX18oNjk2OSk7CnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTcpOwp2YXIgSUU4X0RPTV9ERUZJTkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU5MTcpOwoKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZQp2YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CgovLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcgpleHBvcnRzLmYgPSBERVNDUklQVE9SUyA/ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkgewogIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7CiAgUCA9IHRvUHJvcGVydHlLZXkoUCk7CiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkgewogICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIGlmIChoYXNPd24oTywgUCkpIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoIWNhbGwocHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZiwgTywgUCksIE9bUF0pOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gODQ4MDoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBpbnRlcm5hbE9iamVjdEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4MjgpOwp2YXIgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg3MjcpOwoKdmFyIGhpZGRlbktleXMgPSBlbnVtQnVnS2V5cy5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTsKCi8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXMKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eW5hbWVzIC0tIHNhZmUKZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7CiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5L
20ZXlzKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDM3MTc6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHsKCgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5c3ltYm9scyAtLSBzYWZlCmV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7CgoKLyoqKi8gfSksCgovKioqLyAyNzg3OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5Nyk7CnZhciBpc0NhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTAxKTsKdmFyIHRvT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4OTgxKTsKdmFyIHNoYXJlZEtleSA9IF9fd2VicGFja19yZXF1aXJlX18oNjExOSk7CnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyMTEpOwoKdmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpOwp2YXIgJE9iamVjdCA9IE9iamVjdDsKdmFyIE9iamVjdFByb3RvdHlwZSA9ICRPYmplY3QucHJvdG90eXBlOwoKLy8gYE9iamVjdC5nZXRQcm90b3R5cGVPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmdldHByb3RvdHlwZW9mCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0cHJvdG90eXBlb2YgLS0gc2FmZQptb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/ICRPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykgewogIHZhciBvYmplY3QgPSB0b09iamVjdChPKTsKICBpZiAoaGFzT3duKG9iamVjdCwgSUVfUFJPVE8pKSByZXR1cm4gb2JqZWN0W0lFX1BST1RPXTsKICB2YXIgY29uc3RydWN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7CiAgaWYgKGlzQ2FsbGFibGUoY29uc3RydWN0b3IpICYmIG9iamVjdCBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yKSB7CiAgICByZXR1cm4gY29uc3RydWN0b3IucHJvdG90eXBlOwogIH0gcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mICRPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMTYyNToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7Cgptb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzKHt9LmlzUHJvdG90eXBlT2YpOwoKCi8qKiovIH0pLAoKLyoqKi8gMTgyODoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7CnZhciBoYXNPd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTcpOwp2YXIgdG9JbmRleGVkT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Mzk3KTsKdmFyIGluZGV4T2YgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg5NjE3KS5pbmRleE9mKTsKdmFyIGhpZGRlbktleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMSk7Cgp2YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykgewogIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7CiAgdmFyIGkgPSAwOwogIHZhciByZXN1bHQgPSBbXTsKICB2YXIga2V5OwogIGZvciAoa2V5IGluIE8pICFoYXNPd24oaGlkZGVuS2V5cywga2V5KSAmJiBoYXNPd24oTywga2V5KSAmJiBwdXNoKHJlc3VsdCwga2V5KTsKICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzCiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXNPd24oTywga2V5ID0gbmFtZXNbaSsrXSkpIHsKICAgIH5pbmRleE9mKHJlc3VsdCwga2V5KSB8fCBwdXNoKHJlc3VsdCwga2V5KTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDEwNzI6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODI4KTsKdmFyIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzI3KTsKCi8vIGBPYmplY3Qua2V5c2AgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXMKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1rZXlzIC0tIHNhZmUKbW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHsKICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDg3NzM6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHsKCgp2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmUKdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CgovLyBOYXNob3JuIH4gSkRLOCBidWcKdmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICEkcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh7IDE6IDIgfSwgMSk7CgovLyBgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZWAgbWV0aG9kIGltcGxlbWVudGF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eWlzZW51bWVyYWJsZQpleHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHsKICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBWKTsKICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTsKfSA6ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTsKCgovKioqLyB9KSwKCi8qKiovIDI5Njc6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAtLSBzYWZlICovCnZhciB1bmN1cnJ5VGhpc0FjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NzA2KTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzUwKTsKdmFyIGFQb3NzaWJsZVByb3RvdHlwZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzUwNik7CgovLyBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2YKLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3Qtc2V0cHJvdG90eXBlb2YgLS0gc2FmZQptb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7CiAgdmFyIENPUlJFQ1RfU0VUVEVSID0gZmFsc2U7CiAgdmFyIHRlc3QgPSB7fTsKICB2YXIgc2V0dGVyOwogIHRyeSB7CiAgICBzZXR0ZXIgPSB1bmN1cnJ5VGhpc0FjY2Vzc29yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nLCA
20nc2V0Jyk7CiAgICBzZXR0ZXIodGVzdCwgW10pOwogICAgQ09SUkVDVF9TRVRURVIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7CiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQogIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90bykgewogICAgcmVxdWlyZU9iamVjdENvZXJjaWJsZShPKTsKICAgIGFQb3NzaWJsZVByb3RvdHlwZShwcm90byk7CiAgICBpZiAoIWlzT2JqZWN0KE8pKSByZXR1cm4gTzsKICAgIGlmIChDT1JSRUNUX1NFVFRFUikgc2V0dGVyKE8sIHByb3RvKTsKICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bzsKICAgIHJldHVybiBPOwogIH07Cn0oKSA6IHVuZGVmaW5lZCk7CgoKLyoqKi8gfSksCgovKioqLyA0MjcwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1NjUpOwp2YXIgaXNDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkwMSk7CnZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpOwoKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7CgovLyBgT3JkaW5hcnlUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtb3JkaW5hcnl0b3ByaW1pdGl2ZQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbnB1dCwgcHJlZikgewogIHZhciBmbiwgdmFsOwogIGlmIChwcmVmID09PSAnc3RyaW5nJyAmJiBpc0NhbGxhYmxlKGZuID0gaW5wdXQudG9TdHJpbmcpICYmICFpc09iamVjdCh2YWwgPSBjYWxsKGZuLCBpbnB1dCkpKSByZXR1cm4gdmFsOwogIGlmIChpc0NhbGxhYmxlKGZuID0gaW5wdXQudmFsdWVPZikgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7CiAgaWYgKHByZWYgIT09ICdzdHJpbmcnICYmIGlzQ2FsbGFibGUoZm4gPSBpbnB1dC50b1N0cmluZykgJiYgIWlzT2JqZWN0KHZhbCA9IGNhbGwoZm4sIGlucHV0KSkpIHJldHVybiB2YWw7CiAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNTAzMToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzUxKTsKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKdmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0ODApOwp2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzE3KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKCnZhciBjb25jYXQgPSB1bmN1cnJ5VGhpcyhbXS5jb25jYXQpOwoKLy8gYWxsIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBub24tZW51bWVyYWJsZSBhbmQgc3ltYm9scwptb2R1bGUuZXhwb3J0cyA9IGdldEJ1aWx0SW4oJ1JlZmxlY3QnLCAnb3duS2V5cycpIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHsKICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpOwogIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjsKICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gY29uY2F0KGtleXMsIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkpIDoga2V5czsKfTsKCgovKioqLyB9KSwKCi8qKiovIDExMDM6Ci8qKiovICgobW9kdWxlKSA9PiB7CgoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykgewogIHRyeSB7CiAgICByZXR1cm4geyBlcnJvcjogZmFsc2UsIHZhbHVlOiBleGVjKCkgfTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9OwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovIDc5Nzk6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwoKLy8gYFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3NgIGdldHRlciBpbXBsZW1lbnRhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogIHZhciB0aGF0ID0gYW5PYmplY3QodGhpcyk7CiAgdmFyIHJlc3VsdCA9ICcnOwogIGlmICh0aGF0Lmhhc0luZGljZXMpIHJlc3VsdCArPSAnZCc7CiAgaWYgKHRoYXQuZ2xvYmFsKSByZXN1bHQgKz0gJ2cnOwogIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7CiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nOwogIGlmICh0aGF0LmRvdEFsbCkgcmVzdWx0ICs9ICdzJzsKICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnOwogIGlmICh0aGF0LnVuaWNvZGVTZXRzKSByZXN1bHQgKz0gJ3YnOwogIGlmICh0aGF0LnN0aWNreSkgcmVzdWx0ICs9ICd5JzsKICByZXR1cm4gcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNzc1MDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBpc051bGxPclVuZGVmaW5lZCA9IF9fd2VicGFja19yZXF1aXJlX18oNDExNyk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKCi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhY
20nN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKGl0KSkgdGhyb3cgbmV3ICRUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIgKyBpdCk7CiAgcmV0dXJuIGl0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gOTI4NjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBTZXRIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDAyKTsKdmFyIGl0ZXJhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg0NjkpOwoKdmFyIFNldCA9IFNldEhlbHBlcnMuU2V0Owp2YXIgYWRkID0gU2V0SGVscGVycy5hZGQ7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXQpIHsKICB2YXIgcmVzdWx0ID0gbmV3IFNldCgpOwogIGl0ZXJhdGUoc2V0LCBmdW5jdGlvbiAoaXQpIHsKICAgIGFkZChyZXN1bHQsIGl0KTsKICB9KTsKICByZXR1cm4gcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMzQ0MDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBhU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDgwKTsKdmFyIFNldEhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0MDIpOwp2YXIgY2xvbmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyODYpOwp2YXIgc2l6ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTE3MCk7CnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3ODkpOwp2YXIgaXRlcmF0ZVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oODQ2OSk7CnZhciBpdGVyYXRlU2ltcGxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDcpOwoKdmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzOwp2YXIgcmVtb3ZlID0gU2V0SGVscGVycy5yZW1vdmU7CgovLyBgU2V0LnByb3RvdHlwZS5kaWZmZXJlbmNlYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaWZmZXJlbmNlKG90aGVyKSB7CiAgdmFyIE8gPSBhU2V0KHRoaXMpOwogIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7CiAgdmFyIHJlc3VsdCA9IGNsb25lKE8pOwogIGlmIChzaXplKE8pIDw9IG90aGVyUmVjLnNpemUpIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmVtb3ZlKHJlc3VsdCwgZSk7CiAgfSk7CiAgZWxzZSBpdGVyYXRlU2ltcGxlKG90aGVyUmVjLmdldEl0ZXJhdG9yKCksIGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoaGFzKE8sIGUpKSByZW1vdmUocmVzdWx0LCBlKTsKICB9KTsKICByZXR1cm4gcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNDQwMjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7CgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc2V0IC0tIHNhZmUKdmFyIFNldFByb3RvdHlwZSA9IFNldC5wcm90b3R5cGU7Cgptb2R1bGUuZXhwb3J0cyA9IHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tc2V0IC0tIHNhZmUKICBTZXQ6IFNldCwKICBhZGQ6IHVuY3VycnlUaGlzKFNldFByb3RvdHlwZS5hZGQpLAogIGhhczogdW5jdXJyeVRoaXMoU2V0UHJvdG90eXBlLmhhcyksCiAgcmVtb3ZlOiB1bmN1cnJ5VGhpcyhTZXRQcm90b3R5cGVbJ2RlbGV0ZSddKSwKICBwcm90bzogU2V0UHJvdG90eXBlCn07CgoKLyoqKi8gfSksCgovKioqLyA4NzUwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGFTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwODApOwp2YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oNDQwMik7CnZhciBzaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTcwKTsKdmFyIGdldFNldFJlY29yZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzc4OSk7CnZhciBpdGVyYXRlU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDY5KTsKdmFyIGl0ZXJhdGVTaW1wbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwNyk7Cgp2YXIgU2V0ID0gU2V0SGVscGVycy5TZXQ7CnZhciBhZGQgPSBTZXRIZWxwZXJzLmFkZDsKdmFyIGhhcyA9IFNldEhlbHBlcnMuaGFzOwoKLy8gYFNldC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uYCBtZXRob2QKLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbnRlcnNlY3Rpb24ob3RoZXIpIHsKICB2YXIgTyA9IGFTZXQodGhpcyk7CiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTsKICB2YXIgcmVzdWx0ID0gbmV3IFNldCgpOwoKICBpZiAoc2l6ZShPKSA+IG90aGVyUmVjLnNpemUpIHsKICAgIGl0ZXJhdGVTaW1wbGUob3RoZXJSZWMuZ2V0SXRlcmF0b3IoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGhhcyhPLCBlKSkgYWRkKHJlc3VsdCwgZSk7CiAgICB9KTsKICB9IGVsc2UgewogICAgaXRlcmF0ZVNldChPLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAob3RoZXJSZWMuaW5jbHVkZXMoZSkpIGFkZChyZXN1bHQsIGUpOwogICAgfSk7CiAgfQoKICByZXR1cm4gcmVzdWx0Owp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNDQ0OToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBhU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDgwKTsKdmFyIGhhcyA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0MDIpLmhhcyk7CnZhciBzaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTcwKTsKdmFyIGdldFNldFJlY29yZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzc4OSk7CnZhciBpdGVyYXRlU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NDY5KTsKdmFyIGl0ZXJhdGVTaW1wbGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwNyk7CnZhciBpdGVyYXRvckNsb3NlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTM5KTsKCi8vIGBTZXQucHJvdG90eXBlLmlzRGlzam9pbnRGcm9tYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc0Rpc2pvaW50RnJvbQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzRGlzam9pbnRGcm9tKG9
200aGVyKSB7CiAgdmFyIE8gPSBhU2V0KHRoaXMpOwogIHZhciBvdGhlclJlYyA9IGdldFNldFJlY29yZChvdGhlcik7CiAgaWYgKHNpemUoTykgPD0gb3RoZXJSZWMuc2l6ZSkgcmV0dXJuIGl0ZXJhdGVTZXQoTywgZnVuY3Rpb24gKGUpIHsKICAgIGlmIChvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmV0dXJuIGZhbHNlOwogIH0sIHRydWUpICE9PSBmYWxzZTsKICB2YXIgaXRlcmF0b3IgPSBvdGhlclJlYy5nZXRJdGVyYXRvcigpOwogIHJldHVybiBpdGVyYXRlU2ltcGxlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGhhcyhPLCBlKSkgcmV0dXJuIGl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsICdub3JtYWwnLCBmYWxzZSk7CiAgfSkgIT09IGZhbHNlOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMzgzODoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBhU2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3MDgwKTsKdmFyIHNpemUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUxNzApOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oODQ2OSk7CnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3ODkpOwoKLy8gYFNldC5wcm90b3R5cGUuaXNTdWJzZXRPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0LW1ldGhvZHMvI1NldC5wcm90b3R5cGUuaXNTdWJzZXRPZgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzU3Vic2V0T2Yob3RoZXIpIHsKICB2YXIgTyA9IGFTZXQodGhpcyk7CiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTsKICBpZiAoc2l6ZShPKSA+IG90aGVyUmVjLnNpemUpIHJldHVybiBmYWxzZTsKICByZXR1cm4gaXRlcmF0ZShPLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFvdGhlclJlYy5pbmNsdWRlcyhlKSkgcmV0dXJuIGZhbHNlOwogIH0sIHRydWUpICE9PSBmYWxzZTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDg1Mjc6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgYVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNzA4MCk7CnZhciBoYXMgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg0NDAyKS5oYXMpOwp2YXIgc2l6ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTE3MCk7CnZhciBnZXRTZXRSZWNvcmQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3ODkpOwp2YXIgaXRlcmF0ZVNpbXBsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTA3KTsKdmFyIGl0ZXJhdG9yQ2xvc2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MzkpOwoKLy8gYFNldC5wcm90b3R5cGUuaXNTdXBlcnNldE9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXQtbWV0aG9kcy8jU2V0LnByb3RvdHlwZS5pc1N1cGVyc2V0T2YKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N1cGVyc2V0T2Yob3RoZXIpIHsKICB2YXIgTyA9IGFTZXQodGhpcyk7CiAgdmFyIG90aGVyUmVjID0gZ2V0U2V0UmVjb3JkKG90aGVyKTsKICBpZiAoc2l6ZShPKSA8IG90aGVyUmVjLnNpemUpIHJldHVybiBmYWxzZTsKICB2YXIgaXRlcmF0b3IgPSBvdGhlclJlYy5nZXRJdGVyYXRvcigpOwogIHJldHVybiBpdGVyYXRlU2ltcGxlKGl0ZXJhdG9yLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFoYXMoTywgZSkpIHJldHVybiBpdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCAnbm9ybWFsJywgZmFsc2UpOwogIH0pICE9PSBmYWxzZTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDg0Njk6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MDQpOwp2YXIgaXRlcmF0ZVNpbXBsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNTA3KTsKdmFyIFNldEhlbHBlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0MDIpOwoKdmFyIFNldCA9IFNldEhlbHBlcnMuU2V0Owp2YXIgU2V0UHJvdG90eXBlID0gU2V0SGVscGVycy5wcm90bzsKdmFyIGZvckVhY2ggPSB1bmN1cnJ5VGhpcyhTZXRQcm90b3R5cGUuZm9yRWFjaCk7CnZhciBrZXlzID0gdW5jdXJyeVRoaXMoU2V0UHJvdG90eXBlLmtleXMpOwp2YXIgbmV4dCA9IGtleXMobmV3IFNldCgpKS5uZXh0OwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0LCBmbiwgaW50ZXJydXB0aWJsZSkgewogIHJldHVybiBpbnRlcnJ1cHRpYmxlID8gaXRlcmF0ZVNpbXBsZSh7IGl0ZXJhdG9yOiBrZXlzKHNldCksIG5leHQ6IG5leHQgfSwgZm4pIDogZm9yRWFjaChzZXQsIGZuKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDQ5MTY6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZ2V0QnVpbHRJbiA9IF9fd2VicGFja19yZXF1aXJlX18oNzc1MSk7Cgp2YXIgY3JlYXRlU2V0TGlrZSA9IGZ1bmN0aW9uIChzaXplKSB7CiAgcmV0dXJuIHsKICAgIHNpemU6IHNpemUsCiAgICBoYXM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGtleXM6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlIH07CiAgICAgICAgfQogICAgICB9OwogICAgfQogIH07Cn07Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgdmFyIFNldCA9IGdldEJ1aWx0SW4oJ1NldCcpOwogIHRyeSB7CiAgICBuZXcgU2V0KClbbmFtZV0oY3JlYXRlU2V0TGlrZSgwKSk7CiAgICB0cnkgewogICAgICAvLyBsYXRlIHNwZWMgY2hhbmdlLCBlYXJseSBXZWJLaXQgfiBTYWZhcmkgMTcuMCBiZXRhIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHBhc3MgaXQKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2V0LW1ldGhvZHMvcHVsbC84OAogICAgICBuZXcgU2V0KClbbmFtZV0oY3JlYXRlU2V0TGlrZSgtMSkpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGNhdGNoIChlcnJvcjIpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJldHVybi
20BmYWxzZTsKICB9Cn07CgoKLyoqKi8gfSksCgovKioqLyA1MTcwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHVuY3VycnlUaGlzQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3MDYpOwp2YXIgU2V0SGVscGVycyA9IF9fd2VicGFja19yZXF1aXJlX18oNDQwMik7Cgptb2R1bGUuZXhwb3J0cyA9IHVuY3VycnlUaGlzQWNjZXNzb3IoU2V0SGVscGVycy5wcm90bywgJ3NpemUnLCAnZ2V0JykgfHwgZnVuY3Rpb24gKHNldCkgewogIHJldHVybiBzZXQuc2l6ZTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDM2NTA6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgYVNldCA9IF9fd2VicGFja19yZXF1aXJlX18oNzA4MCk7CnZhciBTZXRIZWxwZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDAyKTsKdmFyIGNsb25lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjg2KTsKdmFyIGdldFNldFJlY29yZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzc4OSk7CnZhciBpdGVyYXRlU2ltcGxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDcpOwoKdmFyIGFkZCA9IFNldEhlbHBlcnMuYWRkOwp2YXIgaGFzID0gU2V0SGVscGVycy5oYXM7CnZhciByZW1vdmUgPSBTZXRIZWxwZXJzLnJlbW92ZTsKCi8vIGBTZXQucHJvdG90eXBlLnN5bW1ldHJpY0RpZmZlcmVuY2VgIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kcwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIpIHsKICB2YXIgTyA9IGFTZXQodGhpcyk7CiAgdmFyIGtleXNJdGVyID0gZ2V0U2V0UmVjb3JkKG90aGVyKS5nZXRJdGVyYXRvcigpOwogIHZhciByZXN1bHQgPSBjbG9uZShPKTsKICBpdGVyYXRlU2ltcGxlKGtleXNJdGVyLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKGhhcyhPLCBlKSkgcmVtb3ZlKHJlc3VsdCwgZSk7CiAgICBlbHNlIGFkZChyZXN1bHQsIGUpOwogIH0pOwogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqKi8gfSksCgovKioqLyA0MjA0OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGFTZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwODApOwp2YXIgYWRkID0gKF9fd2VicGFja19yZXF1aXJlX18oNDQwMikuYWRkKTsKdmFyIGNsb25lID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjg2KTsKdmFyIGdldFNldFJlY29yZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzc4OSk7CnZhciBpdGVyYXRlU2ltcGxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDcpOwoKLy8gYFNldC5wcm90b3R5cGUudW5pb25gIG1ldGhvZAovLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zZXQtbWV0aG9kcwptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVuaW9uKG90aGVyKSB7CiAgdmFyIE8gPSBhU2V0KHRoaXMpOwogIHZhciBrZXlzSXRlciA9IGdldFNldFJlY29yZChvdGhlcikuZ2V0SXRlcmF0b3IoKTsKICB2YXIgcmVzdWx0ID0gY2xvbmUoTyk7CiAgaXRlcmF0ZVNpbXBsZShrZXlzSXRlciwgZnVuY3Rpb24gKGl0KSB7CiAgICBhZGQocmVzdWx0LCBpdCk7CiAgfSk7CiAgcmV0dXJuIHJlc3VsdDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDYxMTk6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzQ1KTsKdmFyIHVpZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzM5Mik7Cgp2YXIga2V5cyA9IHNoYXJlZCgna2V5cycpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7CiAgcmV0dXJuIGtleXNba2V5XSB8fCAoa2V5c1trZXldID0gdWlkKGtleSkpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNzYyOToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mzk1KTsKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgZGVmaW5lR2xvYmFsUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0MzMpOwoKdmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nOwp2YXIgc3RvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXNbU0hBUkVEXSB8fCBkZWZpbmVHbG9iYWxQcm9wZXJ0eShTSEFSRUQsIHt9KTsKCihzdG9yZS52ZXJzaW9ucyB8fCAoc3RvcmUudmVyc2lvbnMgPSBbXSkpLnB1c2goewogIHZlcnNpb246ICczLjM5LjAnLAogIG1vZGU6IElTX1BVUkUgPyAncHVyZScgOiAnZ2xvYmFsJywKICBjb3B5cmlnaHQ6ICfCqSAyMDE0LTIwMjQgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknLAogIGxpY2Vuc2U6ICdodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjM5LjAvTElDRU5TRScsCiAgc291cmNlOiAnaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMnCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gNTc0NToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBzdG9yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzYyOSk7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSB8fCB7fSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyAxNTQ4OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwp2YXIgVjggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MTkpOwp2YXIgRU5WSVJPTk1FTlQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyMTUpOwoKdmFyIHN0cnVjdHVyZWRDbG9uZSA9IGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lOwoKbW9kdWxlLmV4cG9ydHMgPSAhIXN0cnVjdHVyZWRDbG9uZSAmJiAhZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIHByZXZlbnQgVjggQXJyYXlCdWZmZXJEZXRhY2hpbmcgcHJvdGVjdG9yIGNlbGwgaW52YWxpZGF0aW9uIGFuZCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy82NzkKICBpZiAoKEVOVklST05NRU5UID09PSAnREVOTycgJiYgVjggPiA5MikgfHwgKEVOVklST05NRU5UID09PSAnTk9ERScgJiYgVjggPiA5NCkgfHwgKEVOVklST05NRU5UID09PSAnQlJPV1NFUicgJiYgVjggPiA5NykpIHJldHVybiBmYWxzZTsKICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDgpOwogIHZhciBjbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShidWZmZXIsIHsgdHJhbnNmZXI6IFtidWZmZXJdIH0pOwogIHJldHVybiBidWZmZXIuYnl0ZUxlbmd0aCAhPT0gMCB8fCBjbG9uZS5ieXRlTGVuZ3RoICE9PSA4Owp9KTsKCgovKioqLyB9KSwKCi8qKiovIDQ0OTU6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovKiBlc2xpbnQtZGlzYWJsZSBlcy9uby1zeW1ib2wgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcgKi8KdmFyIFY4X1ZFUlNJT04gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MTkpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7Cgp2YXIgJFN0cmluZyA9IGdsb2JhbFRoaXMuU3RyaW5nOwoKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eXN5bWJvbHMgLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcKbW9kdWxlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHsKICB2YXIgc3ltYm9sID0gU3ltYm9sKCdzeW1ib2wgZGV0ZWN0aW9uJyk7CiAgLy8gQ2hyb21lIDM4IFN5bWJvbCBoYXMgaW5jb3JyZWN0IHRvU3RyaW5nIGNvbnZlcnNpb24KICAvLyBgZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzYCBwb2x5ZmlsbCBzeW1ib2xzIGNvbnZlcnRlZCB0byBvYmplY3QgYXJlIG5vdCBTeW1ib2wgaW5zdGFuY2VzCiAgLy8gbmI6IERvIG5vdCBjYWxsIGBTdHJpbmdgIGRpcmVjdGx5IHRvIGF2b2lkIHRoaXMgYmVpbmcgb3B0aW1pemVkIG91dCB0byBgc3ltYm9sKycnYCB3aGljaCB3aWxsLAogIC8vIG9mIGNvdXJzZSwgZmFpbC4KICByZXR1cm4gISRTdHJpbmcoc3ltYm9sKSB8fCAhKE9iamVjdChzeW1ib2wpIGluc3RhbmNlb2YgU3ltYm9sKSB8fAogICAgLy8gQ2hyb21lIDM4LTQwIHN5bWJvbHMgYXJlIG5vdCBpbmhlcml0ZWQgZnJvbSBET00gY29sbGVjdGlvbnMgcHJvdG90eXBlcyB0byBpbnN0YW5jZXMKICAgICFTeW1ib2wuc2hhbSAmJiBWOF9WRVJTSU9OICYmIFY4X1ZFUlNJT04gPCA0MTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyA1NjEwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOTEpOwoKdmFyIG1heCA9IE1hdGgubWF4Owp2YXIgbWluID0gTWF0aC5taW47CgovLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzoKLy8gTGV0IGludGVnZXIgYmUgPyBUb0ludGVnZXIoaW5kZXgpLgovLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihpbnRlZ2VyLCBsZW5ndGgpLgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7CiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGluZGV4KTsKICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDU4NTQ6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3NzcpOwoKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7CgovLyBgVG9CaWdJb
20nRgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvYmlnaW50Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgdmFyIHByaW0gPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ251bWJlcicpOwogIGlmICh0eXBlb2YgcHJpbSA9PSAnbnVtYmVyJykgdGhyb3cgbmV3ICRUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgbnVtYmVyIHRvIGJpZ2ludCIpOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1iaWdpbnQgLS0gc2FmZQogIHJldHVybiBCaWdJbnQocHJpbSk7Cn07CgoKLyoqKi8gfSksCgovKioqLyA3Njk2OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOTEpOwp2YXIgdG9MZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgwMTQpOwoKdmFyICRSYW5nZUVycm9yID0gUmFuZ2VFcnJvcjsKCi8vIGBUb0luZGV4YCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2luZGV4Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgaWYgKGl0ID09PSB1bmRlZmluZWQpIHJldHVybiAwOwogIHZhciBudW1iZXIgPSB0b0ludGVnZXJPckluZmluaXR5KGl0KTsKICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTsKICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IG5ldyAkUmFuZ2VFcnJvcignV3JvbmcgbGVuZ3RoIG9yIGluZGV4Jyk7CiAgcmV0dXJuIGxlbmd0aDsKfTsKCgovKioqLyB9KSwKCi8qKiovIDUzOTc6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5ncwp2YXIgSW5kZXhlZE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNzA1NSk7CnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzUwKTsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7CiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMTI5MToKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciB0cnVuYyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQxKTsKCi8vIGBUb0ludGVnZXJPckluZmluaXR5YCBhYnN0cmFjdCBvcGVyYXRpb24KLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy10b2ludGVnZXJvcmluZmluaXR5Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgdmFyIG51bWJlciA9ICthcmd1bWVudDsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlIC0tIE5hTiBjaGVjawogIHJldHVybiBudW1iZXIgIT09IG51bWJlciB8fCBudW1iZXIgPT09IDAgPyAwIDogdHJ1bmMobnVtYmVyKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDgwMTQ6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdG9JbnRlZ2VyT3JJbmZpbml0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5MSk7Cgp2YXIgbWluID0gTWF0aC5taW47CgovLyBgVG9MZW5ndGhgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgdmFyIGxlbiA9IHRvSW50ZWdlck9ySW5maW5pdHkoYXJndW1lbnQpOwogIHJldHVybiBsZW4gPiAwID8gbWluKGxlbiwgMHgxRkZGRkZGRkZGRkZGRikgOiAwOyAvLyAyICoqIDUzIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxCn07CgoKLyoqKi8gfSksCgovKioqLyA4OTgxOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3NTApOwoKdmFyICRPYmplY3QgPSBPYmplY3Q7CgovLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvbgovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXRvb2JqZWN0Cm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgcmV0dXJuICRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gMjc3NzoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBjYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTY1KTsKdmFyIGlzT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7CnZhciBpc1N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oNzU3KTsKdmFyIGdldE1ldGhvZCA9IF9fd2VicGFja19yZXF1aXJlX18oNTk2Nik7CnZhciBvcmRpbmFyeVRvUHJpbWl0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MjcwKTsKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oODIyNyk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKdmFyIFRPX1BSSU1JVElWRSA9IHdlbGxLbm93blN5bWJvbCgndG9QcmltaXRpdmUnKTsKCi8vIGBUb1ByaW1pdGl2ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmUKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5wdXQsIHByZWYpIHsKICBpZiAoIWlzT2JqZWN0KGlucHV0KSB8fCBpc1N5bWJvbChpbnB1dCkpIHJldHVybiBpbnB1dDsKICB2YXIgZXhvdGljVG9QcmltID0gZ2V0TWV0aG9kKGlucHV0LCBUT19QUklNSVRJVkUpOwogIHZhciByZXN1bHQ7CiAgaWYgKGV4b3RpY1RvUHJpbSkgewogICAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdkZWZhdWx0JzsKICAgIHJlc3VsdCA9IGNhbGwoZXhvdGljVG9QcmltLCBpbnB1dCwgcHJlZik7CiAgICBpZiAoIWlzT2JqZWN0KHJlc3VsdCkgfHwgaXNTeW1ib2wocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDsKICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKTsKICB9CiAgaWYgKHByZWYgPT09IHVuZGVmaW5lZCkgcHJlZiA9ICdudW1iZXInOwogIHJldHVybi
20BvcmRpbmFyeVRvUHJpbWl0aXZlKGlucHV0LCBwcmVmKTsKfTsKCgovKioqLyB9KSwKCi8qKiovIDY5Njk6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdG9QcmltaXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3NzcpOwp2YXIgaXNTeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1Nyk7CgovLyBgVG9Qcm9wZXJ0eUtleWAgYWJzdHJhY3Qgb3BlcmF0aW9uCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleQptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgewogIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmd1bWVudCwgJ3N0cmluZycpOwogIHJldHVybiBpc1N5bWJvbChrZXkpID8ga2V5IDoga2V5ICsgJyc7Cn07CgoKLyoqKi8gfSksCgovKioqLyAyMTQwOgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIHdlbGxLbm93blN5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oODIyNyk7Cgp2YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTsKdmFyIHRlc3QgPSB7fTsKCnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7Cgptb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSA9PT0gJ1tvYmplY3Qgel0nOwoKCi8qKiovIH0pLAoKLyoqKi8gNjU1OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGNsYXNzb2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY5NTUpOwoKdmFyICRTdHJpbmcgPSBTdHJpbmc7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkgewogIGlmIChjbGFzc29mKGFyZ3VtZW50KSA9PT0gJ1N5bWJvbCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nJyk7CiAgcmV0dXJuICRTdHJpbmcoYXJndW1lbnQpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNjgyMzoKLyoqKi8gKChtb2R1bGUpID0+IHsKCgp2YXIgJFN0cmluZyA9IFN0cmluZzsKCm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7CiAgdHJ5IHsKICAgIHJldHVybiAkU3RyaW5nKGFyZ3VtZW50KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuICdPYmplY3QnOwogIH0KfTsKCgovKioqLyB9KSwKCi8qKiovIDMzOTI6Ci8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MDQpOwoKdmFyIGlkID0gMDsKdmFyIHBvc3RmaXggPSBNYXRoLnJhbmRvbSgpOwp2Y
20XIgdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcygxLjAudG9TdHJpbmcpOwoKbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7CiAgcmV0dXJuICdTeW1ib2woJyArIChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5KSArICcpXycgKyB0b1N0cmluZygrK2lkICsgcG9zdGZpeCwgMzYpOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gNzA0MDoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCi8qIGVzbGludC1kaXNhYmxlIGVzL25vLXN5bWJvbCAtLSByZXF1aXJlZCBmb3IgdGVzdGluZyAqLwp2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ5NSk7Cgptb2R1bGUuZXhwb3J0cyA9IE5BVElWRV9TWU1CT0wgJiYKICAhU3ltYm9sLnNoYW0gJiYKICB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnOwoKCi8qKiovIH0pLAoKLyoqKi8gODY4NjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7CnZhciBmYWlscyA9IF9fd2VicGFja19yZXF1aXJlX18oOTAzOSk7CgovLyBWOCB+IENocm9tZSAzNi0KLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzMzNAptb2R1bGUuZXhwb3J0cyA9IERFU0NSSVBUT1JTICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHJlcXVpcmVkIGZvciB0ZXN0aW5nCiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sICdwcm90b3R5cGUnLCB7CiAgICB2YWx1ZTogNDIsCiAgICB3cml0YWJsZTogZmFsc2UKICB9KS5wcm90b3R5cGUgIT09IDQyOwp9KTsKCgovKioqLyB9KSwKCi8qKiovIDI4MTI6Ci8qKiovICgobW9kdWxlKSA9PiB7CgoKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXNzZWQsIHJlcXVpcmVkKSB7CiAgaWYgKHBhc3NlZCA8IHJlcXVpcmVkKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignTm90IGVub3VnaCBhcmd1bWVudHMnKTsKICByZXR1cm4gcGFzc2VkOwp9OwoKCi8qKiovIH0pLAoKLyoqKi8gODYyMjoKLyoqKi8gKChtb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBnbG9iYWxUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NTc2KTsKdmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MDEpOwoKdmFyIFdlYWtNYXAgPSBnbG9iYWxUaGlzLldlYWtNYXA7Cgptb2R1bGUuZXhwb3J0cyA9IGlzQ2FsbGFibGUoV2Vha01hcCkgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KFN0cmluZyhXZWFrTWFwKSk7CgoKLyoqKi8gfSksCgovKioqLyA4MjI3OgovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2Y
20XIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NzQ1KTsKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5Nyk7CnZhciB1aWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzOTIpOwp2YXIgTkFUSVZFX1NZTUJPTCA9IF9fd2VicGFja19yZXF1aXJlX18oNDQ5NSk7CnZhciBVU0VfU1lNQk9MX0FTX1VJRCA9IF9fd2VicGFja19yZXF1aXJlX18oNzA0MCk7Cgp2YXIgU3ltYm9sID0gZ2xvYmFsVGhpcy5TeW1ib2w7CnZhciBXZWxsS25vd25TeW1ib2xzU3RvcmUgPSBzaGFyZWQoJ3drcycpOwp2YXIgY3JlYXRlV2VsbEtub3duU3ltYm9sID0gVVNFX1NZTUJPTF9BU19VSUQgPyBTeW1ib2xbJ2ZvciddIHx8IFN5bWJvbCA6IFN5bWJvbCAmJiBTeW1ib2wud2l0aG91dFNldHRlciB8fCB1aWQ7Cgptb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgaWYgKCFoYXNPd24oV2VsbEtub3duU3ltYm9sc1N0b3JlLCBuYW1lKSkgewogICAgV2VsbEtub3duU3ltYm9sc1N0b3JlW25hbWVdID0gTkFUSVZFX1NZTUJPTCAmJiBoYXNPd24oU3ltYm9sLCBuYW1lKQogICAgICA/IFN5bWJvbFtuYW1lXQogICAgICA6IGNyZWF0ZVdlbGxLbm93blN5bWJvbCgnU3ltYm9sLicgKyBuYW1lKTsKICB9IHJldHVybiBXZWxsS25vd25TeW1ib2xzU3RvcmVbbmFtZV07Cn07CgoKLyoqKi8gfSksCgovKioqLyA2NTczOgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgREVTQ1JJUFRPUlMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM3MjQpOwp2YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA2KTsKdmFyIGlzRGV0YWNoZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyMzgpOwoKdmFyIEFycmF5QnVmZmVyUHJvdG90eXBlID0gQXJyYXlCdWZmZXIucHJvdG90eXBlOwoKLy8gYEFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXRhY2hlZGAgZ2V0dGVyCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LWFycmF5YnVmZmVyLnByb3RvdHlwZS5kZXRhY2hlZAppZiAoREVTQ1JJUFRPUlMgJiYgISgnZGV0YWNoZWQnIGluIEFycmF5QnVmZmVyUHJvdG90eXBlKSkgewogIGRlZmluZUJ1aWx0SW5BY2Nlc3NvcihBcnJheUJ1ZmZlclByb3RvdHlwZSwgJ2RldGFjaGVkJywgewogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgZ2V0OiBmdW5jdGlvbiBkZXRhY2hlZCgpIHsKICAgICAgcmV0dXJuIGlzRGV0YWNoZWQodGhpcyk7CiAgICB9CiAgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovIDc5MzY6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyICR0cmFuc2ZlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTYzNik7CgovLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnRyYW5zZmVyVG9GaXhlZExlbmd0aGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1hcnJheWJ1ZmZlci10cmFuc2Zlci8jc2VjLWFycmF5YnVmZmVyLnByb3RvdHlwZS50cmFuc2ZlcnRvZml4ZWRsZW5ndGgKaWYgKCR0cmFuc2ZlcikgJCh7IHRhcmdldDogJ0FycmF5QnVmZmVyJywgcHJvdG86IHRydWUgfSwgewogIHRyYW5zZmVyVG9GaXhlZExlbmd0aDogZnVuY3Rpb24gdHJhbnNmZXJUb0ZpeGVkTGVuZ3RoKCkgewogICAgcmV0dXJuICR0cmFuc2Zlcih0aGlzLCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkLCBmYWxzZSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovIDgxMDA6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyICR0cmFuc2ZlciA9IF9fd2VicGFja19yZXF1aXJlX18oNTYzNik7CgovLyBgQXJyYXlCdWZmZXIucHJvdG90eXBlLnRyYW5zZmVyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWFycmF5YnVmZmVyLXRyYW5zZmVyLyNzZWMtYXJyYXlidWZmZXIucHJvdG90eXBlLnRyYW5zZmVyCmlmICgkdHJhbnNmZXIpICQoeyB0YXJnZXQ6ICdBcnJheUJ1ZmZlcicsIHByb3RvOiB0cnVlIH0sIHsKICB0cmFuc2ZlcjogZnVuY3Rpb24gdHJhbnNmZXIoKSB7CiAgICByZXR1cm4gJHRyYW5zZmVyKHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQsIHRydWUpOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyA0MTE0OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciB0b09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODk4MSk7CnZhciBsZW5ndGhPZkFycmF5TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjE5OCk7CnZhciBzZXRBcnJheUxlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNDUyNyk7CnZhciBkb2VzTm90RXhjZWVkU2FmZUludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4MzcpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwoKdmFyIElOQ09SUkVDVF9UT19MRU5HVEggPSBmYWlscyhmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIFtdLnB1c2guY2FsbCh7IGxlbmd0aDogMHgxMDAwMDAwMDAgfSwgMSkgIT09IDQyOTQ5NjcyOTc7Cn0pOwoKLy8gVjggPD0gMTIxIGFuZCBTYWZhcmkgPD0gMTUuNDsgRkYgPCAyMyB0aHJvd3MgSW50ZXJuYWxFcnJvcgovLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjY4MQp2YXIgcHJvcGVyRXJyb3JPbk5vbldyaXRhYmxlTGVuZ3RoID0gZnVuY3Rpb24gKCkgewogIHRyeSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmUKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShbXSwgJ2xlbmd0aCcsIHsgd3JpdGFibGU6IGZhbHNlIH0pLnB1c2goKTsKICB9IGNhdGNoIChlcnJvcikgewogICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yOwogIH0KfTsKCnZhciBGT1JDRUQgPSBJTkNPUlJFQ1RfVE9fTEVOR1RIIHx8ICFwcm9wZXJFcnJvck9uTm9uV3JpdGFibGVMZW5ndGgoKTsKCi8vIGBBcnJheS5wcm90b3R5cGUucHVzaGAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjY
20yLyNzZWMtYXJyYXkucHJvdG90eXBlLnB1c2gKJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGFyaXR5OiAxLCBmb3JjZWQ6IEZPUkNFRCB9LCB7CiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIHJlcXVpcmVkIGZvciBgLmxlbmd0aGAKICBwdXNoOiBmdW5jdGlvbiBwdXNoKGl0ZW0pIHsKICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7CiAgICB2YXIgbGVuID0gbGVuZ3RoT2ZBcnJheUxpa2UoTyk7CiAgICB2YXIgYXJnQ291bnQgPSBhcmd1bWVudHMubGVuZ3RoOwogICAgZG9lc05vdEV4Y2VlZFNhZmVJbnRlZ2VyKGxlbiArIGFyZ0NvdW50KTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgewogICAgICBPW2xlbl0gPSBhcmd1bWVudHNbaV07CiAgICAgIGxlbisrOwogICAgfQogICAgc2V0QXJyYXlMZW5ndGgoTywgbGVuKTsKICAgIHJldHVybiBsZW47CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovIDgxMTE6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyIGdsb2JhbFRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1NzYpOwp2YXIgYW5JbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjc5KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIGlzQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MDEpOwp2YXIgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3ODcpOwp2YXIgZGVmaW5lQnVpbHRJbkFjY2Vzc29yID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMTA2KTsKdmFyIGNyZWF0ZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjU5KTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDM5KTsKdmFyIGhhc093biA9IF9fd2VicGFja19yZXF1aXJlX18oOTI5Nyk7CnZhciB3ZWxsS25vd25TeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyMjcpOwp2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSAoX193ZWJwYWNrX3JlcXVpcmVfXyg3NjU3KS5JdGVyYXRvclByb3RvdHlwZSk7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mzk1KTsKCnZhciBDT05TVFJVQ1RPUiA9ICdjb25zdHJ1Y3Rvcic7CnZhciBJVEVSQVRPUiA9ICdJdGVyYXRvcic7CnZhciBUT19TVFJJTkdfVEFHID0gd2VsbEtub3duU3ltYm9sKCd0b1N0cmluZ1RhZycpOwoKdmFyICRUeXBlRXJyb3IgPSBUeXBlRXJyb3I7CnZhciBOYXRpdmVJdGVyYXRvciA9IGdsb2JhbFRoaXNbSVRFUkFUT1JdOwoKLy8gRkY1Ni0gaGF2ZSBub24tc3RhbmRhcmQgZ2xvYmFsIGhlbHBlciBgSXRlcmF0b3JgCnZhciBGT1JDRUQgPSBJU19QVVJFCiAgfHwgIWlzQ2FsbGFibGUoTmF0aXZlSXRlcmF0b3IpCiAgfHwgTmF0aXZlSXRlcmF0b3IucHJvdG90eXBlICE9PSBJdGVyYXRvclByb3RvdHlwZQogIC8vIEZGNDQtIG5vbi1zdGFuZGFyZCBgSXRlcmF0b3JgIHBhc3NlcyBwcmV2aW91cyB0ZXN0cwogIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7IE5hdGl2ZUl0ZXJhdG9yKHt9KTsgfSk7Cgp2YXIgSXRlcmF0b3JDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uIEl0ZXJhdG9yKCkgewogIGFuSW5zdGFuY2UodGhpcywgSXRlcmF0b3JQcm90b3R5cGUpOwogIGlmIChnZXRQcm90b3R5cGVPZih0aGlzKSA9PT0gSXRlcmF0b3JQcm90b3R5cGUpIHRocm93IG5ldyAkVHlwZUVycm9yKCdBYnN0cmFjdCBjbGFzcyBJdGVyYXRvciBub3QgZGlyZWN0bHkgY29uc3RydWN0YWJsZScpOwp9OwoKdmFyIGRlZmluZUl0ZXJhdG9yUHJvdG90eXBlQWNjZXNzb3IgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogIGlmIChERVNDUklQVE9SUykgewogICAgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKEl0ZXJhdG9yUHJvdG90eXBlLCBrZXksIHsKICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24gKHJlcGxhY2VtZW50KSB7CiAgICAgICAgYW5PYmplY3QodGhpcyk7CiAgICAgICAgaWYgKHRoaXMgPT09IEl0ZXJhdG9yUHJvdG90eXBlKSB0aHJvdyBuZXcgJFR5cGVFcnJvcigiWW91IGNhbid0IHJlZGVmaW5lIHRoaXMgcHJvcGVydHkiKTsKICAgICAgICBpZiAoaGFzT3duKHRoaXMsIGtleSkpIHRoaXNba2V5XSA9IHJlcGxhY2VtZW50OwogICAgICAgIGVsc2UgY3JlYXRlUHJvcGVydHkodGhpcywga2V5LCByZXBsYWNlbWVudCk7CiAgICAgIH0KICAgIH0pOwogIH0gZWxzZSBJdGVyYXRvclByb3RvdHlwZVtrZXldID0gdmFsdWU7Cn07CgppZiAoIWhhc093bihJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRykpIGRlZmluZUl0ZXJhdG9yUHJvdG90eXBlQWNjZXNzb3IoVE9fU1RSSU5HX1RBRywgSVRFUkFUT1IpOwoKaWYgKEZPUkNFRCB8fCAhaGFzT3duKEl0ZXJhdG9yUHJvdG90eXBlLCBDT05TVFJVQ1RPUikgfHwgSXRlcmF0b3JQcm90b3R5cGVbQ09OU1RSVUNUT1JdID09PSBPYmplY3QpIHsKICBkZWZpbmVJdGVyYXRvclByb3RvdHlwZUFjY2Vzc29yKENPTlNUUlVDVE9SLCBJdGVyYXRvckNvbnN0cnVjdG9yKTsKfQoKSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBJdGVyYXRvclByb3RvdHlwZTsKCi8vIGBJdGVyYXRvcmAgY29uc3RydWN0b3IKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pdGVyYXRvcgokKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogIEl0ZXJhdG9yOiBJdGVyYXRvckNvbnN0cnVjdG9yCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gMTE0ODoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1MTgpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjY1Mik7CnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgZ2V0SXRlcmF0b3JEaXJlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NjcpOwoKLy8gYEl0ZXJhdG9yLnByb3RvdHlwZS5ldmVyeWAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjY
20yLyNzZWMtaXRlcmF0b3IucHJvdG90eXBlLmV2ZXJ5CiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBldmVyeTogZnVuY3Rpb24gZXZlcnkocHJlZGljYXRlKSB7CiAgICBhbk9iamVjdCh0aGlzKTsKICAgIGFDYWxsYWJsZShwcmVkaWNhdGUpOwogICAgdmFyIHJlY29yZCA9IGdldEl0ZXJhdG9yRGlyZWN0KHRoaXMpOwogICAgdmFyIGNvdW50ZXIgPSAwOwogICAgcmV0dXJuICFpdGVyYXRlKHJlY29yZCwgZnVuY3Rpb24gKHZhbHVlLCBzdG9wKSB7CiAgICAgIGlmICghcHJlZGljYXRlKHZhbHVlLCBjb3VudGVyKyspKSByZXR1cm4gc3RvcCgpOwogICAgfSwgeyBJU19SRUNPUkQ6IHRydWUsIElOVEVSUlVQVEVEOiB0cnVlIH0pLnN0b3BwZWQ7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovIDI0ODk6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyIGNhbGwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1NjUpOwp2YXIgYUNhbGxhYmxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MzA2KTsKdmFyIGFuT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTUxKTsKdmFyIGdldEl0ZXJhdG9yRGlyZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzY3KTsKdmFyIGNyZWF0ZUl0ZXJhdG9yUHJveHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk0NjIpOwp2YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IF9fd2VicGFja19yZXF1aXJlX18oNjMxOSk7CnZhciBJU19QVVJFID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2Mzk1KTsKCnZhciBJdGVyYXRvclByb3h5ID0gY3JlYXRlSXRlcmF0b3JQcm94eShmdW5jdGlvbiAoKSB7CiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcjsKICB2YXIgcHJlZGljYXRlID0gdGhpcy5wcmVkaWNhdGU7CiAgdmFyIG5leHQgPSB0aGlzLm5leHQ7CiAgdmFyIHJlc3VsdCwgZG9uZSwgdmFsdWU7CiAgd2hpbGUgKHRydWUpIHsKICAgIHJlc3VsdCA9IGFuT2JqZWN0KGNhbGwobmV4dCwgaXRlcmF0b3IpKTsKICAgIGRvbmUgPSB0aGlzLmRvbmUgPSAhIXJlc3VsdC5kb25lOwogICAgaWYgKGRvbmUpIHJldHVybjsKICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlOwogICAgaWYgKGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIHByZWRpY2F0ZSwgW3ZhbHVlLCB0aGlzLmNvdW50ZXIrK10sIHRydWUpKSByZXR1cm4gdmFsdWU7CiAgfQp9KTsKCi8vIGBJdGVyYXRvci5wcm90b3R5cGUuZmlsdGVyYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pdGVyYXRvci5wcm90b3R5cGUuZmlsdGVyCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6IElTX1BVUkUgfSwgewogIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKHByZWRpY2F0ZSkgewogICAgYW5PYmplY3QodGhpcyk7CiAgICBhQ2FsbGFibGUocHJlZGljYXRlKTsKICAgIHJldHVybiBuZXcgSXRlcmF0b3JQcm94eShnZXRJdGVyYXRvckRpcmVjdCh0aGlzKSwgewogICAgICBwcmVkaWNhdGU6IHByZWRpY2F0ZQogICAgfSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovIDExNjoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1MTgpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjY1Mik7CnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgZ2V0SXRlcmF0b3JEaXJlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NjcpOwoKLy8gYEl0ZXJhdG9yLnByb3RvdHlwZS5maW5kYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pdGVyYXRvci5wcm90b3R5cGUuZmluZAokKHsgdGFyZ2V0OiAnSXRlcmF0b3InLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSB9LCB7CiAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUpIHsKICAgIGFuT2JqZWN0KHRoaXMpOwogICAgYUNhbGxhYmxlKHByZWRpY2F0ZSk7CiAgICB2YXIgcmVjb3JkID0gZ2V0SXRlcmF0b3JEaXJlY3QodGhpcyk7CiAgICB2YXIgY291bnRlciA9IDA7CiAgICByZXR1cm4gaXRlcmF0ZShyZWNvcmQsIGZ1bmN0aW9uICh2YWx1ZSwgc3RvcCkgewogICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBjb3VudGVyKyspKSByZXR1cm4gc3RvcCh2YWx1ZSk7CiAgICB9LCB7IElTX1JFQ09SRDogdHJ1ZSwgSU5URVJSVVBURUQ6IHRydWUgfSkucmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyA3NTg4OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjUyKTsKdmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTMwNik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODU1MSk7CnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTc2Nyk7CgovLyBgSXRlcmF0b3IucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yLnByb3RvdHlwZS5mb3JlYWNoCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7CiAgICBhbk9iamVjdCh0aGlzKTsKICAgIGFDYWxsYWJsZShmbik7CiAgICB2YXIgcmVjb3JkID0gZ2V0SXRlcmF0b3JEaXJlY3QodGhpcyk7CiAgICB2YXIgY291bnRlciA9IDA7CiAgICBpdGVyYXRlKHJlY29yZCwgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgIGZuKHZhbHVlLCBjb3VudGVyKyspOwogICAgfSwgeyBJU19SRUNPUkQ6IHRydWUgfSk7CiAgfQp9KTsKCgovKioqLyB9KSwKCi8qKiovIDE3MDE6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyIG1hcCA9IF9fd2VicGFja19yZXF1aXJlX18oNzEzKTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzOTUpOwoKLy8gYEl0ZXJhdG9yLnByb3RvdHlwZS5tYXBgIG1ldGhvZAov
20LyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yLnByb3RvdHlwZS5tYXAKJCh7IHRhcmdldDogJ0l0ZXJhdG9yJywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB9LCB7CiAgbWFwOiBtYXAKfSk7CgoKLyoqKi8gfSksCgovKioqLyA4MjM3OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjUyKTsKdmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTMwNik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODU1MSk7CnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTc2Nyk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKCi8vIGBJdGVyYXRvci5wcm90b3R5cGUucmVkdWNlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1pdGVyYXRvci5wcm90b3R5cGUucmVkdWNlCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShyZWR1Y2VyIC8qICwgaW5pdGlhbFZhbHVlICovKSB7CiAgICBhbk9iamVjdCh0aGlzKTsKICAgIGFDYWxsYWJsZShyZWR1Y2VyKTsKICAgIHZhciByZWNvcmQgPSBnZXRJdGVyYXRvckRpcmVjdCh0aGlzKTsKICAgIHZhciBub0luaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoIDwgMjsKICAgIHZhciBhY2N1bXVsYXRvciA9IG5vSW5pdGlhbCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgIHZhciBjb3VudGVyID0gMDsKICAgIGl0ZXJhdGUocmVjb3JkLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgaWYgKG5vSW5pdGlhbCkgewogICAgICAgIG5vSW5pdGlhbCA9IGZhbHNlOwogICAgICAgIGFjY3VtdWxhdG9yID0gdmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWNjdW11bGF0b3IgPSByZWR1Y2VyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgY291bnRlcik7CiAgICAgIH0KICAgICAgY291bnRlcisrOwogICAgfSwgeyBJU19SRUNPUkQ6IHRydWUgfSk7CiAgICBpZiAobm9Jbml0aWFsKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGl0ZXJhdG9yIHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpOwogICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAzNTc5OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBpdGVyYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNjUyKTsKdmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTMwNik7CnZhciBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oODU1MSk7CnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTc2Nyk7CgovLyBgSXRlcmF0b3IucHJvdG90eXBlLnNvbWVgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yLnByb3RvdHlwZS5zb21lCiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICBzb21lOiBmdW5jdGlvbiBzb21lKHByZWRpY2F0ZSkgewogICAgYW5PYmplY3QodGhpcyk7CiAgICBhQ2FsbGFibGUocHJlZGljYXRlKTsKICAgIHZhciByZWNvcmQgPSBnZXRJdGVyYXRvckRpcmVjdCh0aGlzKTsKICAgIHZhciBjb3VudGVyID0gMDsKICAgIHJldHVybiBpdGVyYXRlKHJlY29yZCwgZnVuY3Rpb24gKHZhbHVlLCBzdG9wKSB7CiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGNvdW50ZXIrKykpIHJldHVybiBzdG9wKCk7CiAgICB9LCB7IElTX1JFQ09SRDogdHJ1ZSwgSU5URVJSVVBURUQ6IHRydWUgfSkuc3RvcHBlZDsKICB9Cn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gMTgwNjoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1MTgpOwp2YXIgYW5PYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1NTEpOwp2YXIgaXRlcmF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMjY1Mik7CnZhciBnZXRJdGVyYXRvckRpcmVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTc2Nyk7Cgp2YXIgcHVzaCA9IFtdLnB1c2g7CgovLyBgSXRlcmF0b3IucHJvdG90eXBlLnRvQXJyYXlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yLnByb3RvdHlwZS50b2FycmF5CiQoeyB0YXJnZXQ6ICdJdGVyYXRvcicsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHsKICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KCkgewogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgaXRlcmF0ZShnZXRJdGVyYXRvckRpcmVjdChhbk9iamVjdCh0aGlzKSksIHB1c2gsIHsgdGhhdDogcmVzdWx0LCBJU19SRUNPUkQ6IHRydWUgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyAxNjg5OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBnbG9iYWxUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NTc2KTsKdmFyIGFwcGx5ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzQ1KTsKdmFyIHNsaWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjgwKTsKdmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MDQzKTsKdmFyIGFDYWxsYWJsZSA9IF9fd2VicGFja19yZXF1aXJlX18oOTMwNik7CnZhciBwZXJmb3JtID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTAzKTsKCnZhciBQcm9taXNlID0gZ2xvYmFsVGh
20pcy5Qcm9taXNlOwoKdmFyIEFDQ0VQVF9BUkdVTUVOVFMgPSBmYWxzZTsKLy8gQXZvaWRpbmcgdGhlIHVzZSBvZiBwb2x5ZmlsbHMgb2YgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiBvZiB0aGlzIHByb3Bvc2FsCi8vIHRoYXQgZG9lcyBub3QgYWNjZXB0IGFyZ3VtZW50cyBvZiB0aGUgY2FsbGJhY2sKdmFyIEZPUkNFRCA9ICFQcm9taXNlIHx8ICFQcm9taXNlWyd0cnknXSB8fCBwZXJmb3JtKGZ1bmN0aW9uICgpIHsKICBQcm9taXNlWyd0cnknXShmdW5jdGlvbiAoYXJndW1lbnQpIHsKICAgIEFDQ0VQVF9BUkdVTUVOVFMgPSBhcmd1bWVudCA9PT0gODsKICB9LCA4KTsKfSkuZXJyb3IgfHwgIUFDQ0VQVF9BUkdVTUVOVFM7CgovLyBgUHJvbWlzZS50cnlgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb21pc2UudHJ5CiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwgewogICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbiAvKiAsIC4uLmFyZ3MgKi8pIHsKICAgIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZShhcmd1bWVudHMsIDEpIDogW107CiAgICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKHRoaXMpOwogICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gYXBwbHkoYUNhbGxhYmxlKGNhbGxiYWNrZm4pLCB1bmRlZmluZWQsIGFyZ3MpOwogICAgfSk7CiAgICAocmVzdWx0LmVycm9yID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnZhbHVlKTsKICAgIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlOwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyA0NjI4OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjA0Myk7CgovLyBgUHJvbWlzZS53aXRoUmVzb2x2ZXJzYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1wcm9taXNlLndpdGhSZXNvbHZlcnMKJCh7IHRhcmdldDogJ1Byb21pc2UnLCBzdGF0OiB0cnVlIH0sIHsKICB3aXRoUmVzb2x2ZXJzOiBmdW5jdGlvbiB3aXRoUmVzb2x2ZXJzKCkgewogICAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZih0aGlzKTsKICAgIHJldHVybiB7CiAgICAgIHByb21pc2U6IHByb21pc2VDYXBhYmlsaXR5LnByb21pc2UsCiAgICAgIHJlc29sdmU6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUsCiAgICAgI
20HJlamVjdDogcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0CiAgICB9OwogIH0KfSk7CgoKLyoqKi8gfSksCgovKioqLyA5NDc5OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7CnZhciBkZWZpbmVCdWlsdEluQWNjZXNzb3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIxMDYpOwp2YXIgcmVnRXhwRmxhZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5NzkpOwp2YXIgZmFpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkwMzkpOwoKLy8gYmFiZWwtbWluaWZ5IGFuZCBDbG9zdXJlIENvbXBpbGVyIHRyYW5zcGlsZXMgUmVnRXhwKCcuJywgJ2QnKSAtPiAvLi9kIGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3IKdmFyIFJlZ0V4cCA9IGdsb2JhbFRoaXMuUmVnRXhwOwp2YXIgUmVnRXhwUHJvdG90eXBlID0gUmVnRXhwLnByb3RvdHlwZTsKCnZhciBGT1JDRUQgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7CiAgdmFyIElORElDRVNfU1VQUE9SVCA9IHRydWU7CiAgdHJ5IHsKICAgIFJlZ0V4cCgnLicsICdkJyk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIElORElDRVNfU1VQUE9SVCA9IGZhbHNlOwogIH0KCiAgdmFyIE8gPSB7fTsKICAvLyBtb2Rlcm4gVjggYnVnCiAgdmFyIGNhbGxzID0gJyc7CiAgdmFyIGV4cGVjdGVkID0gSU5ESUNFU19TVVBQT1JUID8gJ2RnaW1zeScgOiAnZ2ltc3knOwoKICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKGtleSwgY2hyKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWRlZmluZXByb3BlcnR5IC0tIHNhZmUKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgIGNhbGxzICs9IGNocjsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IH0pOwogIH07CgogIHZhciBwYWlycyA9IHsKICAgIGRvdEFsbDogJ3MnLAogICAgZ2xvYmFsOiAnZycsCiAgICBpZ25vcmVDYXNlOiAnaScsCiAgICBtdWx0aWxpbmU6ICdtJywKICAgIHN0aWNreTogJ3knCiAgfTsKCiAgaWYgKElORElDRVNfU1VQUE9SVCkgcGFpcnMuaGFzSW5kaWNlcyA9ICdkJzsKCiAgZm9yICh2YXIga2V5IGluIHBhaXJzKSBhZGRHZXR0ZXIoa2V5LCBwYWlyc1trZXldKTsKCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3IgLS0gc2FmZQogIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFJlZ0V4cFByb3RvdHlwZSwgJ2ZsYWdzJykuZ2V0LmNhbGwoTyk7CgogIHJldHVybiByZXN1bHQgIT09IGV4cGVjdGVkIHx8IGNhbGxzICE9PSBleHBlY3RlZDsKfSk7CgovLyBgUmVnRXhwLnByb3RvdHlwZS5mbGFnc2AgZ2V0dGVyCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtZ2V0LXJlZ2V4cC5wcm90b3R5cGUuZmxhZ3MKaWYgKEZPUkNFRCkgZGVmaW5lQnVpbHRJbkFjY2Vzc29yKFJlZ0V4cFByb3RvdHlwZSwgJ2ZsYWdzJywgewogIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICBnZXQ6IHJlZ0V4cEZsYWdzCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gNzY0MjoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1MTgpOwp2YXIgZGlmZmVyZW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzQ0MCk7CnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTE2KTsKCi8vIGBTZXQucHJvdG90eXBlLmRpZmZlcmVuY2VgIG1ldGhvZAovLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuZGlmZmVyZW5jZQokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2RpZmZlcmVuY2UnKSB9LCB7CiAgZGlmZmVyZW5jZTogZGlmZmVyZW5jZQp9KTsKCgovKioqLyB9KSwKCi8qKiovIDgwMDQ6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyIGZhaWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MDM5KTsKdmFyIGludGVyc2VjdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oODc1MCk7CnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTE2KTsKCnZhciBJTkNPUlJFQ1QgPSAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnaW50ZXJzZWN0aW9uJykgfHwgZmFpbHMoZnVuY3Rpb24gKCkgewogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1hcnJheS1mcm9tLCBlcy9uby1zZXQgLS0gdGVzdGluZwogIHJldHVybiBTdHJpbmcoQXJyYXkuZnJvbShuZXcgU2V0KFsxLCAyLCAzXSkuaW50ZXJzZWN0aW9uKG5ldyBTZXQoWzMsIDJdKSkpKSAhPT0gJzMsMic7Cn0pOwoKLy8gYFNldC5wcm90b3R5cGUuaW50ZXJzZWN0aW9uYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmludGVyc2VjdGlvbgokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUIH0sIHsKICBpbnRlcnNlY3Rpb246IGludGVyc2VjdGlvbgp9KTsKCgovKioqLyB9KSwKCi8qKiovIDM4NTM6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyIGlzRGlzam9pbnRGcm9tID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NDQ5KTsKdmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MTYpOwoKLy8gYFNldC5wcm90b3R5cGUuaXNEaXNqb2ludEZyb21gIG1ldGhvZAov
20LyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXNldC5wcm90b3R5cGUuaXNkaXNqb2ludGZyb20KJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdpc0Rpc2pvaW50RnJvbScpIH0sIHsKICBpc0Rpc2pvaW50RnJvbTogaXNEaXNqb2ludEZyb20KfSk7CgoKLyoqKi8gfSksCgovKioqLyA1ODc2OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBpc1N1YnNldE9mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzODM4KTsKdmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MTYpOwoKLy8gYFNldC5wcm90b3R5cGUuaXNTdWJzZXRPZmAgbWV0aG9kCi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2V0LnByb3RvdHlwZS5pc3N1YnNldG9mCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgnaXNTdWJzZXRPZicpIH0sIHsKICBpc1N1YnNldE9mOiBpc1N1YnNldE9mCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gMjQ3NToKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1MTgpOwp2YXIgaXNTdXBlcnNldE9mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTI3KTsKdmFyIHNldE1ldGhvZEFjY2VwdFNldExpa2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MTYpOwoKLy8gYFNldC5wcm90b3R5cGUuaXNTdXBlcnNldE9mYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLmlzc3VwZXJzZXRvZgokKHsgdGFyZ2V0OiAnU2V0JywgcHJvdG86IHRydWUsIHJlYWw6IHRydWUsIGZvcmNlZDogIXNldE1ldGhvZEFjY2VwdFNldExpa2UoJ2lzU3VwZXJzZXRPZicpIH0sIHsKICBpc1N1cGVyc2V0T2Y6IGlzU3VwZXJzZXRPZgp9KTsKCgovKioqLyB9KSwKCi8qKiovIDUwMjQ6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciAkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTE4KTsKdmFyIHN5bW1ldHJpY0RpZmZlcmVuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2NTApOwp2YXIgc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDkxNik7CgovLyBgU2V0LnByb3RvdHlwZS5zeW1tZXRyaWNEaWZmZXJlbmNlYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLnN5bW1ldHJpY2RpZmZlcmVuY2UKJCh7IHRhcmdldDogJ1NldCcsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlLCBmb3JjZWQ6ICFzZXRNZXRob2RBY2NlcHRTZXRMaWtlKCdzeW1tZXRyaWNEaWZmZXJlbmNlJykgfSwgewogIHN5bW1ldHJpY0RpZmZlcmVuY2U6IHN5bW1ldHJpY0RpZmZlcmVuY2UKfSk7CgoKLyoqKi8gfSksCgovKioqLyAxNjk4OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciB1bmlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oNDIwNCk7CnZhciBzZXRNZXRob2RBY2NlcHRTZXRMaWtlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OTE2KTsKCi8vIGBTZXQucHJvdG90eXBlLnVuaW9uYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zZXQucHJvdG90eXBlLnVuaW9uCiQoeyB0YXJnZXQ6ICdTZXQnLCBwcm90bzogdHJ1ZSwgcmVhbDogdHJ1ZSwgZm9yY2VkOiAhc2V0TWV0aG9kQWNjZXB0U2V0TGlrZSgndW5pb24nKSB9LCB7CiAgdW5pb246IHVuaW9uCn0pOwoKCi8qKiovIH0pLAoKLyoqKi8gNzQ2NzoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGFycmF5VG9SZXZlcnNlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNzYyOCk7CnZhciBBcnJheUJ1ZmZlclZpZXdDb3JlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjQ0KTsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBleHBvcnRUeXBlZEFycmF5TWV0aG9kID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kOwp2YXIgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5nZXRUeXBlZEFycmF5Q29uc3RydWN0b3I7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS50b1JldmVyc2VkYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLnRvcmV2ZXJzZWQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9SZXZlcnNlZCcsIGZ1bmN0aW9uIHRvUmV2ZXJzZWQoKSB7CiAgcmV0dXJuIGFycmF5VG9SZXZlcnNlZChhVHlwZWRBcnJheSh0aGlzKSwgZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKHRoaXMpKTsKfSk7CgoKLyoqKi8gfSksCgovKioqLyA0NzMyOgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDY0NCk7CnZhciB1bmN1cnJ5VGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oOTUwNCk7CnZhciBhQ2FsbGFibGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkzMDYpOwp2YXIgYXJyYXlGcm9tQ29uc3RydWN0b3JBbmRMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MzcwKTsKCnZhciBhVHlwZWRBcnJheSA9IEFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXk7CnZhciBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvcjsKdmFyIGV4cG9ydFR5cGVkQXJyYXlNZXRob2QgPSBBcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7CnZhciBzb3J0ID0gdW5jdXJyeVRoaXMoQXJyYXlCdWZmZXJWaWV3Q29yZS5UeXBlZEFycmF5UHJvdG90eXBlLnNvcnQpOwoKLy8gYCVUeXBlZEFycmF5JS5wcm90b3R5cGUudG9Tb3J0ZWRgIG1ldGhvZAov
20LyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLSV0eXBlZGFycmF5JS5wcm90b3R5cGUudG9zb3J0ZWQKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgndG9Tb3J0ZWQnLCBmdW5jdGlvbiB0b1NvcnRlZChjb21wYXJlRm4pIHsKICBpZiAoY29tcGFyZUZuICE9PSB1bmRlZmluZWQpIGFDYWxsYWJsZShjb21wYXJlRm4pOwogIHZhciBPID0gYVR5cGVkQXJyYXkodGhpcyk7CiAgdmFyIEEgPSBhcnJheUZyb21Db25zdHJ1Y3RvckFuZExpc3QoZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yKE8pLCBPKTsKICByZXR1cm4gc29ydChBLCBjb21wYXJlRm4pOwp9KTsKCgovKioqLyB9KSwKCi8qKiovIDk1Nzc6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBhcnJheVdpdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5MjgpOwp2YXIgQXJyYXlCdWZmZXJWaWV3Q29yZSA9IF9fd2VicGFja19yZXF1aXJlX18oNDY0NCk7CnZhciBpc0JpZ0ludEFycmF5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTA4KTsKdmFyIHRvSW50ZWdlck9ySW5maW5pdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOTEpOwp2YXIgdG9CaWdJbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4NTQpOwoKdmFyIGFUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheTsKdmFyIGdldFR5cGVkQXJyYXlDb25zdHJ1Y3RvciA9IEFycmF5QnVmZmVyVmlld0NvcmUuZ2V0VHlwZWRBcnJheUNvbnN0cnVjdG9yOwp2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZCA9IEFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDsKCnZhciBQUk9QRVJfT1JERVIgPSAhIWZ1bmN0aW9uICgpIHsKICB0cnkgewogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWwsIGVzL25vLXR5cGVkLWFycmF5cywgZXMvbm8tYXJyYXktcHJvdG90eXBlLXdpdGggLS0gcmVxdWlyZWQgZm9yIHRlc3RpbmcKICAgIG5ldyBJbnQ4QXJyYXkoMSlbJ3dpdGgnXSgyLCB7IHZhbHVlT2Y6IGZ1bmN0aW9uICgpIHsgdGhyb3cgODsgfSB9KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgLy8gc29tZSBlYXJseSBpbXBsZW1lbnRhdGlvbnMsIGxpa2UgV2ViS2l0LCBkb2VzIG5vdCBmb2xsb3cgdGhlIGZpbmFsIHNlbWFudGljCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1jaGFuZ2UtYXJyYXktYnktY29weS9wdWxsLzg2CiAgICByZXR1cm4gZXJyb3IgPT09IDg7CiAgfQp9KCk7CgovLyBgJVR5cGVkQXJyYXklLnByb3RvdHlwZS53aXRoYCBtZXRob2QKLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy0ldHlwZWRhcnJheSUucHJvdG90eXBlLndpdGgKZXhwb3J0VHlwZWRBcnJheU1ldGhvZCgnd2l0aCcsIHsgJ3dpdGgnOiBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7CiAgdmFyIE8gPSBhVHlwZWRBcnJheSh0aGlzKTsKICB2YXIgcmVsYXRpdmVJbmRleCA9IHRvSW50ZWdlck9ySW5maW5pdHkoaW5kZXgpOwogIHZhciBhY3R1YWxWYWx1ZSA9IGlzQmlnSW50QXJyYXkoTykgPyB0b0JpZ0ludCh2YWx1ZSkgOiArdmFsdWU7CiAgcmV0dXJuIGFycmF5V2l0aChPLCBnZXRUeXBlZEFycmF5Q29uc3RydWN0b3IoTyksIHJlbGF0aXZlSW5kZXgsIGFjdHVhbFZhbHVlKTsKfSB9Wyd3aXRoJ10sICFQUk9QRVJfT1JERVIpOwoKCi8qKiovIH0pLAoKLyoqKi8gODk5MjoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXyg4MTExKTsKCgovKioqLyB9KSwKCi8qKiovIDMyMTU6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oMTE0OCk7CgoKLyoqKi8gfSksCgovKioqLyA0NTIwOgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYnBhY2tfcmVxdWlyZV9fKDI0ODkpOwoKCi8qKiovIH0pLAoKLyoqKi8gMjU3NzoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXygxMTYpOwoKCi8qKiovIH0pLAoKLyoqKi8gMzk0OToKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXyg3NTg4KTsKCgovKioqLyB9KSwKCi8qKiovIDE0NTQ6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oMTcwMSk7CgoKLyoqKi8gfSksCgovKioqLyA4ODcyOgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYnBhY2tfcmVxdWlyZV9fKDgyMzcpOwoKCi8qKiovIH0pLAoKLyoqKi8gNzU1MDoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKLy8gVE9ETzogUmVtb3ZlIGZyb20gYGNvcmUtanNANGAKX193ZWJwYWNrX3JlcXVpcmVfXygzNTc5KTsKCgovKioqLyB9KSwKCi8qKiovIDE3OTU6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCi8vIFRPRE86IFJlbW92ZSBmcm9tIGBjb3JlLWpzQDRgCl9fd2VicGFja19yZXF1aXJlX18oMTgwNik7CgoKLyoqKi8gfSksCgovKioqLyA1MjQ3OgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgovLyBUT0RPOiBSZW1vdmUgZnJvbSBgY29yZS1qc0A0YApfX3dlYn
20BhY2tfcmVxdWlyZV9fKDE2ODkpOwoKCi8qKiovIH0pLAoKLyoqKi8gNDk3OToKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyICQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1MTgpOwp2YXIgZ2xvYmFsVGhpcyA9IF9fd2VicGFja19yZXF1aXJlX18oNDU3Nik7CnZhciBnZXRCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NzUxKTsKdmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IF9fd2VicGFja19yZXF1aXJlX18oNjk4MCk7CnZhciBkZWZpbmVQcm9wZXJ0eSA9IChfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5MTMpLmYpOwp2YXIgaGFzT3duID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk3KTsKdmFyIGFuSW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY3OSk7CnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oMzE2Nyk7CnZhciBub3JtYWxpemVTdHJpbmdBcmd1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMjYwMyk7CnZhciBET01FeGNlcHRpb25Db25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUwMDIpOwp2YXIgY2xlYXJFcnJvclN0YWNrID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NTc0KTsKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzI0KTsKdmFyIElTX1BVUkUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzOTUpOwoKdmFyIERPTV9FWENFUFRJT04gPSAnRE9NRXhjZXB0aW9uJzsKdmFyIEVycm9yID0gZ2V0QnVpbHRJbignRXJyb3InKTsKdmFyIE5hdGl2ZURPTUV4Y2VwdGlvbiA9IGdldEJ1aWx0SW4oRE9NX0VYQ0VQVElPTik7Cgp2YXIgJERPTUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIERPTUV4Y2VwdGlvbigpIHsKICBhbkluc3RhbmNlKHRoaXMsIERPTUV4Y2VwdGlvblByb3RvdHlwZSk7CiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgdmFyIG1lc3NhZ2UgPSBub3JtYWxpemVTdHJpbmdBcmd1bWVudChhcmd1bWVudHNMZW5ndGggPCAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdKTsKICB2YXIgbmFtZSA9IG5vcm1hbGl6ZVN0cmluZ0FyZ3VtZW50KGFyZ3VtZW50c0xlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV0sICdFcnJvcicpOwogIHZhciB0aGF0ID0gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKTsKICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7CiAgZXJyb3IubmFtZSA9IERPTV9FWENFUFRJT047CiAgZGVmaW5lUHJvcGVydHkodGhhdCwgJ3N0YWNrJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIGNsZWFyRXJyb3JTdGFjayhlcnJvci5zdGFjaywgMSkpKTsKICBpbmhlcml0SWZSZXF1aXJlZCh0aGF0LCB0aGlzLCAkRE9NRXhjZXB0aW9uKTsKICByZXR1cm4gdGhhdDsKfTsKCnZhciBET01FeGNlcHRpb25Qcm90b3R5cGUgPSAkRE9NRXhjZXB0aW9uLnByb3RvdHlwZSA9IE5hdGl2ZURPTUV4Y2VwdGlvbi5wcm90b3R5cGU7Cgp2YXIgRVJST1JfSEFTX1NUQUNLID0gJ3N0YWNrJyBpbiBuZXcgRXJyb3IoRE9NX0VYQ0VQVElPTik7CnZhciBET01fRVhDRVBUSU9OX0hBU19TVEFDSyA9ICdzdGFjaycgaW4gbmV3IE5hdGl2ZURPTUV4Y2VwdGlvbigxLCAyKTsKCi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcy9uby1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yIC0tIHNhZmUKdmFyIGRlc2NyaXB0b3IgPSBOYXRpdmVET01FeGNlcHRpb24gJiYgREVTQ1JJUFRPUlMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWxUaGlzLCBET01fRVhDRVBUSU9OKTsKCi8vIEJ1biB+IDAuMS4xIERPTUV4Y2VwdGlvbiBoYXZlIGluY29ycmVjdCBkZXNjcmlwdG9yIGFuZCB3ZSBjYW4ndCByZWRlZmluZSBpdAovLyBodHRwczovL2dpdGh1Yi5jb20vSmFycmVkLVN1bW5lci9idW4vaXNzdWVzLzM5OQp2YXIgQlVHR1lfREVTQ1JJUFRPUiA9ICEhZGVzY3JpcHRvciAmJiAhKGRlc2NyaXB0b3Iud3JpdGFibGUgJiYgZGVzY3JpcHRvci
205jb25maWd1cmFibGUpOwoKdmFyIEZPUkNFRF9DT05TVFJVQ1RPUiA9IEVSUk9SX0hBU19TVEFDSyAmJiAhQlVHR1lfREVTQ1JJUFRPUiAmJiAhRE9NX0VYQ0VQVElPTl9IQVNfU1RBQ0s7CgovLyBgRE9NRXhjZXB0aW9uYCBjb25zdHJ1Y3RvciBwYXRjaCBmb3IgYC5zdGFja2Agd2hlcmUgaXQncyByZXF1aXJlZAovLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLURPTUV4Y2VwdGlvbi1zcGVjaWFsbmVzcwokKHsgZ2xvYmFsOiB0cnVlLCBjb25zdHJ1Y3RvcjogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRF9DT05TVFJVQ1RPUiB9LCB7IC8vIFRPRE86IGZpeCBleHBvcnQgbG9naWMKICBET01FeGNlcHRpb246IEZPUkNFRF9DT05TVFJVQ1RPUiA/ICRET01FeGNlcHRpb24gOiBOYXRpdmVET01FeGNlcHRpb24KfSk7Cgp2YXIgUG9seWZpbGxlZERPTUV4Y2VwdGlvbiA9IGdldEJ1aWx0SW4oRE9NX0VYQ0VQVElPTik7CnZhciBQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uUHJvdG90eXBlID0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbi5wcm90b3R5cGU7CgppZiAoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciAhPT0gUG9seWZpbGxlZERPTUV4Y2VwdGlvbikgewogIGlmICghSVNfUFVSRSkgewogICAgZGVmaW5lUHJvcGVydHkoUG9seWZpbGxlZERPTUV4Y2VwdGlvblByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIFBvbHlmaWxsZWRET01FeGNlcHRpb24pKTsKICB9CgogIGZvciAodmFyIGtleSBpbiBET01FeGNlcHRpb25Db25zdGFudHMpIGlmIChoYXNPd24oRE9NRXhjZXB0aW9uQ29uc3RhbnRzLCBrZXkpKSB7CiAgICB2YXIgY29uc3RhbnQgPSBET01FeGNlcHRpb25Db25zdGFudHNba2V5XTsKICAgIHZhciBjb25zdGFudE5hbWUgPSBjb25zdGFudC5zOwogICAgaWYgKCFoYXNPd24oUG9seWZpbGxlZERPTUV4Y2VwdGlvbiwgY29uc3RhbnROYW1lKSkgewogICAgICBkZWZpbmVQcm9wZXJ0eShQb2x5ZmlsbGVkRE9NRXhjZXB0aW9uLCBjb25zdGFudE5hbWUsIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig2LCBjb25zdGFudC5jKSk7CiAgICB9CiAgfQp9CgoKLyoqKi8gfSksCgovKioqLyAzNjExOgovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCgp2YXIgJCA9IF9fd2VicGFja19yZXF1aXJlX18oNjUxOCk7CnZhciBnbG9iYWxUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NTc2KTsKdmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oMjEwNik7CnZhciBERVNDUklQVE9SUyA9IF9fd2VicGFja19yZXF1aXJlX18oMzcyNCk7Cgp2YXIgJFR5cGVFcnJvciA9IFR5cGVFcnJvcjsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVzL25vLW9iamVjdC1kZWZpbmVwcm9wZXJ0eSAtLSBzYWZlCnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKdmFyIElOQ09SUkVDVF9WQUxVRSA9IGdsb2JhbFRoaXMuc2VsZiAhPT0gZ2xvYmFsVGhpczsKCi8vIGBzZWxmYCBnZXR0ZXIKLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2luZG93LW9iamVjdC5odG1sI2RvbS1zZWxmCnRyeSB7CiAgaWYgKERFU0NSSVBUT1JTKSB7CiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXMvbm8tb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvciAtLSBzYWZlCiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsVGhpcywgJ3NlbGYnKTsKICAgIC8vIHNvbWUgZW5naW5lcyBoYXZlIGBzZWxmYCwgYnV0IHdpdGggaW5jb3JyZWN0IGRlc2NyaXB0b3IKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZW5vbGFuZC9kZW5vL2lzc3Vlcy8xNTc2NQogICAgaWYgKElOQ09SUkVDVF9WQUxVRSB8fCAhZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci
205nZXQgfHwgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSkgewogICAgICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoZ2xvYmFsVGhpcywgJ3NlbGYnLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiBzZWxmKCkgewogICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXM7CiAgICAgICAgfSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNlbGYodmFsdWUpIHsKICAgICAgICAgIGlmICh0aGlzICE9PSBnbG9iYWxUaGlzKSB0aHJvdyBuZXcgJFR5cGVFcnJvcignSWxsZWdhbCBpbnZvY2F0aW9uJyk7CiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCAnc2VsZicsIHsKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9LAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0gZWxzZSAkKHsgZ2xvYmFsOiB0cnVlLCBzaW1wbGU6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX1ZBTFVFIH0sIHsKICAgIHNlbGY6IGdsb2JhbFRoaXMKICB9KTsKfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfQoKCi8qKiovIH0pLAoKLyoqKi8gNDYwMzoKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIGRlZmluZUJ1aWx0SW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY4NDApOwp2YXIgdW5jdXJyeVRoaXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1MDQpOwp2YXIgdG9TdHJpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1NSk7CnZhciB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aCA9IF9fd2VicGFja19yZXF1aXJlX18oMjgxMik7Cgp2YXIgJFVSTFNlYXJjaFBhcmFtcyA9IFVSTFNlYXJjaFBhcmFtczsKdmFyIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSA9ICRVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlOwp2YXIgYXBwZW5kID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmFwcGVuZCk7CnZhciAkZGVsZXRlID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlWydkZWxldGUnXSk7CnZhciBmb3JFYWNoID0gdW5jdXJyeVRoaXMoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmZvckVhY2gpOwp2YXIgcHVzaCA9IHVuY3VycnlUaGlzKFtdLnB1c2gpOwp2YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MSZhPTImYj0zJyk7CgpwYXJhbXNbJ2RlbGV0ZSddKCdhJywgMSk7Ci8vIGB1bmRlZmluZWRgIGNhc2UgaXMgYSBDaHJvbWl1bSAxMTcgYnVnCi8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTE0MjIyCnBhcmFtc1snZGVsZXRlJ10oJ2InLCB1bmRlZmluZWQpOwoKaWYgKHBhcmFtcyArICcnICE9PSAnYT0yJykgewogIGRlZmluZUJ1aWx0SW4oVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAnZGVsZXRlJywgZnVuY3Rpb24gKG5hbWUgLyogLCB2YWx1ZSAqLykgewogICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICB2YXIgJHZhbHVlID0gbGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTsKICAgIGlmIChsZW5ndGggJiYgJHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAkZGVsZXRlKHRoaXMsIG5hbW
20UpOwogICAgdmFyIGVudHJpZXMgPSBbXTsKICAgIGZvckVhY2godGhpcywgZnVuY3Rpb24gKHYsIGspIHsgLy8gYWxzbyB2YWxpZGF0ZXMgYHRoaXNgCiAgICAgIHB1c2goZW50cmllcywgeyBrZXk6IGssIHZhbHVlOiB2IH0pOwogICAgfSk7CiAgICB2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChsZW5ndGgsIDEpOwogICAgdmFyIGtleSA9IHRvU3RyaW5nKG5hbWUpOwogICAgdmFyIHZhbHVlID0gdG9TdHJpbmcoJHZhbHVlKTsKICAgIHZhciBpbmRleCA9IDA7CiAgICB2YXIgZGluZGV4ID0gMDsKICAgIHZhciBmb3VuZCA9IGZhbHNlOwogICAgdmFyIGVudHJpZXNMZW5ndGggPSBlbnRyaWVzLmxlbmd0aDsKICAgIHZhciBlbnRyeTsKICAgIHdoaWxlIChpbmRleCA8IGVudHJpZXNMZW5ndGgpIHsKICAgICAgZW50cnkgPSBlbnRyaWVzW2luZGV4KytdOwogICAgICBpZiAoZm91bmQgfHwgZW50cnkua2V5ID09PSBrZXkpIHsKICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgJGRlbGV0ZSh0aGlzLCBlbnRyeS5rZXkpOwogICAgICB9IGVsc2UgZGluZGV4Kys7CiAgICB9CiAgICB3aGlsZSAoZGluZGV4IDwgZW50cmllc0xlbmd0aCkgewogICAgICBlbnRyeSA9IGVudHJpZXNbZGluZGV4KytdOwogICAgICBpZiAoIShlbnRyeS5rZXkgPT09IGtleSAmJiBlbnRyeS52YWx1ZSA9PT0gdmFsdWUpKSBhcHBlbmQodGhpcywgZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7CiAgICB9CiAgfSwgeyBlbnVtZXJhYmxlOiB0cnVlLCB1bnNhZmU6IHRydWUgfSk7Cn0KCgovKioqLyB9KSwKCi8qKiovIDc1NjY6Ci8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKCnZhciBkZWZpbmVCdWlsdEluID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2ODQwKTsKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKdmFyIHRvU3RyaW5nID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NTUpOwp2YXIgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4MTIpOwoKdmFyICRVUkxTZWFyY2hQYXJhbXMgPSBVUkxTZWFyY2hQYXJhbXM7CnZhciBVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUgPSAkVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTsKdmFyIGdldEFsbCA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5nZXRBbGwpOwp2YXIgJGhhcyA9IHVuY3VycnlUaGlzKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZS5oYXMpOwp2YXIgcGFyYW1zID0gbmV3ICRVUkxTZWFyY2hQYXJhbXMoJ2E9MScpOwoKLy8gYHVuZGVmaW5lZGAgY2FzZSBpcyBhIENocm9taXVtIDExNyBidWcKLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTQyMjIKaWYgKHBhcmFtcy5oYXMoJ2EnLCAyKSB8fCAhcGFyYW1zLmhhcygnYScsIHVuZGVmaW5lZCkpIHsKICBkZWZpbmVCdWlsdEluKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSwgJ2hhcycsIGZ1bmN0aW9uIGhhcyhuYW1lIC8qICwgdmFsdWUgKi8pIHsKICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOwogICAgdmFyICR2YWx1ZSA9IGxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07CiAgICBpZiAobGVuZ3RoICYmICR2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJGhhcyh0aGlzLCBuYW1lKTsKICAgIHZhciB2YWx1ZXMgPSBnZXRBbGwodGhpcywgbmFtZSk7IC8vIGFsc28gdmFsaWRhdGVzIGB0aGlzYAogICAgdmFsaWRhdGVBcmd1bWVudHNMZW5ndGgobGVuZ3RoLCAxKTsKICAgIHZhciB2YWx1ZSA9IHRvU3RyaW5nKCR2YWx1ZSk7CiAgICB2YXIgaW5kZXggPSAwOwogICAgd2hpbGUgKGluZGV4IDwgdmFsdWVzLmxlbmd0aCkgewogICAgICBpZiAodmFsdWVzW2luZGV4KytdID09PSB2YWx1ZSkgcmV0dXJuIHRydWU7CiAgICB9IHJldHVybiBmYWxzZTsKICB9LCB7IGVudW1lcmFibGU6IHRydWUsIHVuc2FmZTogdHJ1ZSB9KTsKfQoKCi8qKiovIH0pLAoKLyoqKi8gODcyMToKLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoKdmFyIERFU0NSSVBUT1JTID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNzI0KTsKdmFyIHVuY3VycnlUaGlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NTA0KTsKdmFyIGRlZmluZUJ1aWx0SW5BY2Nlc3NvciA9IF9fd2VicGFja19yZXF1aXJlX18oMjEwNik7Cgp2YXIgVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlID0gVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTsKdmFyIGZvckVhY2ggPSB1bmN1cnJ5VGhpcyhVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUuZm9yRWFjaCk7CgovLyBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5zaXplYCBnZXR0ZXIKLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy91cmwvcHVsbC83MzQKaWYgKERFU0NSSVBUT1JTICYmICEoJ3NpemUnIGluIFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSkpIHsKICBkZWZpbmVCdWlsdEluQWNjZXNzb3IoVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLCAnc2l6ZScsIHsKICAgIGdldDogZnVuY3Rpb24gc2l6ZSgpIHsKICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgZm9yRWFjaCh0aGlzLCBmdW5jdGlvbiAoKSB7IGNvdW50Kys7IH0pOwogICAgICByZXR1cm4gY291bnQ7CiAgICB9LAogICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgZW51bWVyYWJsZTogdHJ1ZQogIH0pOwp9CgoKLyoqKi8gfSkKCi8qKioqKiovIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAvLyBUaGUgbW9kdWxlIGNhY2hlCi8qKioqKiovIHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTsKLyoqKioqKi8gCi8qKioqKiovIC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCi8qKioqKiovIGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKLyoqKioqKi8gCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJdmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07Ci8qKioqKiovIAlpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHsKLyoqKioqKi8gCQlyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAl9Ci8qKioqKiovIAkvLyBDcmVhdGUgYSBuZXcgbW9k
20dWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJdmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7Ci8qKioqKiovIAkJLy8gbm8gbW9kdWxlLmlkIG5lZWRlZAovKioqKioqLyAJCS8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkCi8qKioqKiovIAkJZXhwb3J0czoge30KLyoqKioqKi8gCX07Ci8qKioqKiovIAovKioqKioqLyAJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCi8qKioqKiovIAlfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTsKLyoqKioqKi8gCi8qKioqKiovIAkvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZQovKioqKioqLyAJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyB9Ci8qKioqKiovIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi8KLyoqKioqKi8gKCgpID0+IHsKLyoqKioqKi8gCS8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCV9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7Ci8qKioqKiovIAkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQlpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHsKLyoqKioqKi8gCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9Ci8qKioqKiovIAl9OwovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKi8gLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLwovKioqKioqLyAoKCkgPT4gewovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKQovKioqKioqLyB9KSgpOwovKioqKioqLyAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSBnbG9iYWxUaGlzLnBkZmpzV29ya2VyID0ge307CgovLyBFWFBPUlRTCl9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7CiAgV29ya2VyTWVzc2FnZUhhbmRsZXI6ICgpID0+ICgvKiByZWV4cG9ydCAqLyBXb3JrZXJNZXNzYWdlSGFuZGxlcikKfSk7CgovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzCnZhciBlc19hcnJheV9wdXNoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MTE0KTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXktYnVmZmVyLmRldGFjaGVkLmpzCnZhciBlc19hcnJheV9idWZmZXJfZGV0YWNoZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1NzMpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS1idWZmZXIudHJhbnNmZXIuanMKdmFyIGVzX2FycmF5X2J1ZmZlcl90cmFuc2ZlciA9IF9fd2VicGFja19yZXF1aXJlX18oODEwMCk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LWJ1ZmZlci50cmFuc2Zlci10by1maXhlZC1sZW5ndGguanMKdmFyIGVzX2FycmF5X2J1ZmZlcl90cmFuc2Zlcl90b19maXhlZF9sZW5ndGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5MzYpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5wcm9taXNlLndpdGgtcmVzb2x2ZXJzLmpzCnZhciBlc19wcm9taXNlX3dpdGhfcmVzb2x2ZXJzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NjI4KTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LmRpZmZlcmVuY2UudjIuanMKdmFyIGVzX3NldF9kaWZmZXJlbmNlX3YyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NjQyKTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52Mi5qcwp2YXIgZXNfc2V0X2ludGVyc2VjdGlvbl92MiA9IF9fd2VicGFja19yZXF1aXJlX18oODAwNCk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnNldC5pcy1kaXNqb2ludC1mcm9tLnYyLmpzCnZhciBlc19zZXRfaXNfZGlzam9pbnRfZnJvbV92MiA9IF9fd2VicGFja19yZXF1aXJlX18oMzg1Myk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnNldC5pcy1zdWJzZXQtb2YudjIuanMKdmFyIGVzX3NldF9pc19zdWJzZXRfb2ZfdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU4NzYpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zZXQuaXMtc3VwZXJzZXQtb2YudjIuanMKdmFyIGVzX3NldF9pc19zdXBlcnNldF9vZl92MiA9IF9fd2VicGFja19yZXF1aXJlX18oMjQ3NSk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZS52Mi5qcwp2YXIgZXNfc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3YyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MDI0KTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LnVuaW9uLnYyLmpzCnZhciBlc19zZXRfdW5pb25fdjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2OTgpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1yZXZlcnNlZC5qcwp2YXIgZXNfdHlwZWRfYXJyYXlfdG9fcmV2ZXJzZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc0NjcpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy50eXBlZC1hcnJheS50by1zb3J0ZWQuanMKdmFyIGVzX3R5cGVkX2FycmF5X3RvX3NvcnRlZCA9IF9fd2VicGFja19yZXF1aXJlX18oNDczMik7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnR5cGVkLWFycmF5LndpdGguanMKdmFyIGVzX3R5cGVkX2FycmF5X3dpdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1NzcpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMKdmFyIGVzbmV4dF9pdGVyYXRvcl9jb25zdHJ1Y3RvciA9IF9fd2VicGFja19yZXF1aXJlX18oODk5Mik7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5tYXAuanMKdmFyIGVzbmV4dF9pdGVyYXRvcl9tYXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0NTQpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qcwp2YXIgZXNuZXh0X2l0ZXJhdG9yX3NvbWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc1NTApOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuc2VsZi5qcwp2YXIgd2ViX3NlbGYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2MTEpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucHJvbWlzZS50cnkuanMKdmFyIGVzbmV4dF9wcm9taXNlX3RyeSA9IF9fd2VicGFja19yZXF1aXJlX18oNTI0Nyk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tZXhjZXB0aW9uLnN0YWNrLmpzCnZhciB3ZWJfZG9tX2
20V4Y2VwdGlvbl9zdGFjayA9IF9fd2VicGFja19yZXF1aXJlX18oNDk3OSk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi51cmwtc2VhcmNoLXBhcmFtcy5kZWxldGUuanMKdmFyIHdlYl91cmxfc2VhcmNoX3BhcmFtc19kZWxldGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ2MDMpOwovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudXJsLXNlYXJjaC1wYXJhbXMuaGFzLmpzCnZhciB3ZWJfdXJsX3NlYXJjaF9wYXJhbXNfaGFzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NTY2KTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnVybC1zZWFyY2gtcGFyYW1zLnNpemUuanMKdmFyIHdlYl91cmxfc2VhcmNoX3BhcmFtc19zaXplID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4NzIxKTsKOy8vIC4vc3JjL3NoYXJlZC91dGlsLmpzCgoKCgoKCgoKCgoKCmNvbnN0IGlzTm9kZUpTID0gdHlwZW9mIHByb2Nlc3MgPT09ICJvYmplY3QiICYmIHByb2Nlc3MgKyAiIiA9PT0gIltvYmplY3QgcHJvY2Vzc10iICYmICFwcm9jZXNzLnZlcnNpb25zLm53ICYmICEocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiAmJiBwcm9jZXNzLnR5cGUgJiYgcHJvY2Vzcy50eXBlICE9PSAiYnJvd3NlciIpOwpjb25zdCBJREVOVElUWV9NQVRSSVggPSBbMSwgMCwgMCwgMSwgMCwgMF07CmNvbnN0IEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07CmNvbnN0IE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFID0gMTBlNjsKY29uc3QgTElORV9GQUNUT1IgPSAxLjM1Owpjb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTsKY29uc3QgQkFTRUxJTkVfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAvIExJTkVfRkFDVE9SOwpjb25zdCBSZW5kZXJpbmdJbnRlbnRGbGFnID0gewogIEFOWTogMHgwMSwKICBESVNQTEFZOiAweDAyLAogIFBSSU5UOiAweDA0LAogIFNBVkU6IDB4MDgsCiAgQU5OT1RBVElPTlNfRk9STVM6IDB4MTAsCiAgQU5OT1RBVElPTlNfU1RPUkFHRTogMHgyMCwKICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLAogIElTX0VESVRJTkc6IDB4ODAsCiAgT1BMSVNUOiAweDEwMAp9Owpjb25zdCBBbm5vdGF0aW9uTW9kZSA9IHsKICBESVNBQkxFOiAwLAogIEVOQUJMRTogMSwKICBFTkFCTEVfRk9STVM6IDIsCiAgRU5BQkxFX1NUT1JBR0U6IDMKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9ICJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIjsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7CiAgRElTQUJMRTogLTEsCiAgTk9ORTogMCwKICBGUkVFVEVYVDogMywKICBISUdITElHSFQ6IDksCiAgU1RBTVA6IDEzLAogIElOSzogMTUKfTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7CiAgUkVTSVpFOiAxLAogIENSRUFURTogMiwKICBGUkVFVEVYVF9TSVpFOiAxMSwKICBGUkVFVEVYVF9DT0xPUjogMTIsCiAgRlJFRVRFWFRfT1BBQ0lUWTogMTMsCiAgSU5LX0NPTE9SOiAyMSwKICBJTktfVEhJQ0tORVNTOiAyMiwKICBJTktfT1BBQ0lUWTogMjMsCiAgSElHSExJR0hUX0NPTE9SOiAzMSwKICBISUdITElHSFRfREVGQVVMVF9DT0xPUjogMzIsCiAgSElHSExJR0hUX1RISUNLTkVTUzogMzMsCiAgSElHSExJR0hUX0ZSRUU6IDM0LAogIEhJR0hMSUdIVF9TSE9XX0FMTDogMzUsCiAgRFJBV19TVEVQOiA0MQp9Owpjb25zdCBQZXJtaXNzaW9uRmxhZyA9IHsKICBQUklOVDogMHgwNCwKICBNT0RJRllfQ09OVEVOVFM6IDB4MDgsCiAgQ09QWTogMHgxMCwKICBNT0RJRllfQU5OT1RBVElPTlM6IDB4MjAsCiAgRklMTF9JTlRFUkFDVElWRV9GT1JNUzogMHgxMDAsCiAgQ09QWV9GT1JfQUNDRVNTSUJJTElUWTogMHgyMDAsCiAgQVNTRU1CTEU6IDB4NDAwLAogIFBSSU5UX0hJR0hfUVVBTElUWTogMHg4MDAKfTsKY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CiAgRklMTDogMCwKICBTVFJPS0U6IDEsCiAgRklMTF9TVFJPS0U6IDIsCiAgSU5WSVNJQkxFOiAzLAogIEZJTExfQUREX1RPX1BBVEg6IDQsCiAgU1RST0tFX0FERF9UT19QQVRIOiA1LAogIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAogIEFERF9UT19QQVRIOiA3LAogIEZJTExfU1RST0tFX01BU0s6IDMsCiAgQUREX1RPX1BBVEhfRkxBRzogNAp9Owpjb25zdCBJbWFnZUtpbmQgPSB7CiAgR1JBWVNDQUxFXzFCUFA6IDEsCiAgUkdCXzI0QlBQOiAyLAogIFJHQkFfMzJCUFA6IDMKfTsKY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CiAgVEVYVDogMSwKICBMSU5LOiAyLAogIEZSRUVURVhUOiAzLAogIExJTkU6IDQsCiAgU1FVQVJFOiA1LAogIENJUkNMRTogNiwKICBQT0xZR09OOiA3LAogIFBPTFlMSU5FOiA4LAogIEhJR0hMSUdIVDogOSwKICBVTkRFUkxJTkU6IDEwLAogIFNRVUlHR0xZOiAxMSwKICBTVFJJS0VPVVQ6IDEyLAogIFNUQU1QOiAxMywKICBDQVJFVDogMTQsCiAgSU5LOiAxNSwKICBQT1BVUDogMTYsCiAgRklMRUFUVEFDSE1FTlQ6IDE3LAogIFNPVU5EOiAxOCwKICBNT1ZJRTogMTksCiAgV0lER0VUOiAyMCwKICBTQ1JFRU46IDIxLAogIFBSSU5URVJNQVJLOiAyMiwKICBUUkFQTkVUOiAyMywKICBXQVRFUk1BUks6IDI0LAogIFRIUkVFRDogMjUsCiAgUkVEQUNUOiAyNgp9Owpjb25zdCBBbm5vdGF0aW9uUmVwbHlUeXBlID0gewogIEdST1VQOiAiR3JvdXAiLAogIFJFUExZOiAiUiIKfTsKY29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7CiAgSU5WSVNJQkxFOiAweDAxLAogIEhJRERFTjogMHgwMiwKICBQUklOVDogMHgwNCwKICBOT1pPT006IDB4MDgsCiAgTk9ST1RBVEU6IDB4MTAsCiAgTk9WSUVXOiAweDIwLAogIFJFQURPTkxZOiAweDQwLAogIExPQ0tFRDogMHg4MCwKICBUT0dHTEVOT1ZJRVc6IDB4MTAwLAogIExPQ0tFRENPTlRFTlRTOiAweDIwMAp9Owpjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0gewogIFJFQURPTkxZOiAweDAwMDAwMDEsCiAgUkVRVUlSRUQ6IDB4MDAwMDAwMiwKICBOT0VYUE9SVDogMHgwMDAwMDA0LAogIE1VTFRJTElORTogMHgwMDAxMDAwLAogIFBBU1NXT1JEOiAweDAwMDIwMDAsCiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAogIFJBRElPOiAweDAwMDgwMDAsCiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLAogIENPTUJPOiAweDAwMjAwMDAsCiAgRURJVDogMHgwMDQwMDAwLAogIFNPUlQ6IDB4MDA4MDAwMCwKICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKICBET05PVFN
20QRUxMQ0hFQ0s6IDB4MDQwMDAwMCwKICBET05PVFNDUk9MTDogMHgwODAwMDAwLAogIENPTUI6IDB4MTAwMDAwMCwKICBSSUNIVEVYVDogMHgyMDAwMDAwLAogIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAp9Owpjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gewogIFNPTElEOiAxLAogIERBU0hFRDogMiwKICBCRVZFTEVEOiAzLAogIElOU0VUOiA0LAogIFVOREVSTElORTogNQp9Owpjb25zdCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gewogIEU6ICJNb3VzZSBFbnRlciIsCiAgWDogIk1vdXNlIEV4aXQiLAogIEQ6ICJNb3VzZSBEb3duIiwKICBVOiAiTW91c2UgVXAiLAogIEZvOiAiRm9jdXMiLAogIEJsOiAiQmx1ciIsCiAgUE86ICJQYWdlT3BlbiIsCiAgUEM6ICJQYWdlQ2xvc2UiLAogIFBWOiAiUGFnZVZpc2libGUiLAogIFBJOiAiUGFnZUludmlzaWJsZSIsCiAgSzogIktleXN0cm9rZSIsCiAgRjogIkZvcm1hdCIsCiAgVjogIlZhbGlkYXRlIiwKICBDOiAiQ2FsY3VsYXRlIgp9Owpjb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHsKICBXQzogIldpbGxDbG9zZSIsCiAgV1M6ICJXaWxsU2F2ZSIsCiAgRFM6ICJEaWRTYXZlIiwKICBXUDogIldpbGxQcmludCIsCiAgRFA6ICJEaWRQcmludCIKfTsKY29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHsKICBPOiAiUGFnZU9wZW4iLAogIEM6ICJQYWdlQ2xvc2UiCn07CmNvbnN0IFZlcmJvc2l0eUxldmVsID0gewogIEVSUk9SUzogMCwKICBXQVJOSU5HUzogMSwKICBJTkZPUzogNQp9Owpjb25zdCBPUFMgPSB7CiAgZGVwZW5kZW5jeTogMSwKICBzZXRMaW5lV2lkdGg6IDIsCiAgc2V0TGluZUNhcDogMywKICBzZXRMaW5lSm9pbjogNCwKICBzZXRNaXRlckxpbWl0OiA1LAogIHNldERhc2g6IDYsCiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAogIHNldEZsYXRuZXNzOiA4LAogIHNldEdTdGF0ZTogOSwKICBzYXZlOiAxMCwKICByZXN0b3JlOiAxMSwKICB0cmFuc2Zvcm06IDEyLAogIG1vdmVUbzogMTMsCiAgbGluZVRvOiAxNCwKICBjdXJ2ZVRvOiAxNSwKICBjdXJ2ZVRvMjogMTYsCiAgY3VydmVUbzM6IDE3LAogIGNsb3NlUGF0aDogMTgsCiAgcmVjdGFuZ2xlOiAxOSwKICBzdHJva2U6IDIwLAogIGNsb3NlU3Ryb2tlOiAyMSwKICBmaWxsOiAyMiwKICBlb0ZpbGw6IDIzLAogIGZpbGxTdHJva2U6IDI0LAogIGVvRmlsbFN0cm9rZTogMjUsCiAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsCiAgZW5kUGF0aDogMjgsCiAgY2xpcDogMjksCiAgZW9DbGlwOiAzMCwKICBiZWdpblRleHQ6IDMxLAogIGVuZFRleHQ6IDMyLAogIHNldENoYXJTcGFjaW5nOiAzMywKICBzZXRXb3JkU3BhY2luZzogMzQsCiAgc2V0SFNjYWxlOiAzNSwKICBzZXRMZWFkaW5nOiAzNiwKICBzZXRGb250OiAzNywKICBzZXRUZX
20h0UmVuZGVyaW5nTW9kZTogMzgsCiAgc2V0VGV4dFJpc2U6IDM5LAogIG1vdmVUZXh0OiA0MCwKICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAogIHNldFRleHRNYXRyaXg6IDQyLAogIG5leHRMaW5lOiA0MywKICBzaG93VGV4dDogNDQsCiAgc2hvd1NwYWNlZFRleHQ6IDQ1LAogIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAogIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKICBzZXRDaGFyV2lkdGg6IDQ4LAogIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLAogIHNldFN0cm9rZUNvbG9yOiA1MiwKICBzZXRTdHJva2VDb2xvck46IDUzLAogIHNldEZpbGxDb2xvcjogNTQsCiAgc2V0RmlsbENvbG9yTjogNTUsCiAgc2V0U3Ryb2tlR3JheTogNTYsCiAgc2V0RmlsbEdyYXk6IDU3LAogIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKICBzZXRGaWxsUkdCQ29sb3I6IDU5LAogIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsCiAgc2V0RmlsbENNWUtDb2xvcjogNjEsCiAgc2hhZGluZ0ZpbGw6IDYyLAogIGJlZ2luSW5saW5lSW1hZ2U6IDYzLAogIGJlZ2luSW1hZ2VEYXRhOiA2NCwKICBlbmRJbmxpbmVJbWFnZTogNjUsCiAgcGFpbnRYT2JqZWN0OiA2NiwKICBtYXJrUG9pbnQ6IDY3LAogIG1hcmtQb2ludFByb3BzOiA2OCwKICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LAogIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKICBlbmRNYXJrZWRDb250ZW50OiA3MSwKICBiZWdpbkNvbXBhdDogNzIsCiAgZW5kQ29tcGF0OiA3MywKICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAogIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LAogIGJlZ2luR3JvdXA6IDc2LAogIGVuZEdyb3VwOiA3NywKICBiZWdpbkFubm90YXRpb246IDgwLAogIGVuZEFubm90YXRpb246IDgxLAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsCiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAogIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsCiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksCiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKICBjb25zdHJ1Y3RQYXRoOiA5MSwKICBzZXRTdHJva2VUcmFuc3BhcmVudDogOTIsCiAgc2V0RmlsbFRyYW5zcGFyZW50OiA5Mwp9Owpjb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHsKICBORUVEX1BBU1NXT1JEOiAxLAogIElOQ09SUkVDVF9QQVNTV09SRDogMgp9OwpsZXQgdmVyYm9zaXR5ID0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1M7CmZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7CiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7CiAgICB2ZXJib3NpdHkgPSBsZXZlbDsKICB9Cn0KZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7CiAgcmV0dXJuIHZlcmJvc2l0eTsKfQpmdW5jdGlvbiBpbmZvKG1zZykgewogIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHsKICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTsKICB9Cn0KZnVuY3Rpb24gd2Fybihtc2cpIHsKICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7CiAgICBjb25zb2xlLmxvZyhgV2FybmluZzogJHttc2d9YCk7CiAgfQp9CmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykgewogIHRocm93IG5ldyBFcnJvcihtc2cpOwp9CmZ1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHsKICBpZiAoIWNvbmQpIHsKICAgIHVucmVhY2hhYmxlKG1zZyk7CiAgfQp9CmZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7CiAgc3dpdGNoICh1cmw/LnByb3RvY29sKSB7CiAgICBjYXNlICJodHRwOiI6CiAgICBjYXNlICJodHRwczoiOgogICAgY2FzZSAiZnRwOiI6CiAgICBjYXNlICJtYWlsdG86IjoKICAgIGNhc2UgInRlbDoiOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICB9Cn0KZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwgPSBudWxsLCBvcHRpb25zID0gbnVsbCkgewogIGlmICghdXJsKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgdHJ5IHsKICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmIChvcHRpb25zLmFkZERlZmF1bHRQcm90b2NvbCAmJiB1cmwuc3RhcnRzV2l0aCgid3d3LiIpKSB7CiAgICAgICAgY29uc3QgZG90cyA9IHVybC5tYXRjaCgvXC4vZyk7CiAgICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICB1cmwgPSBgaHR0cDovLyR7dXJsfWA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLnRyeUNvbnZlcnRFbmNvZGluZykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTsKICAgICAgICB9IGNhdGNoIHt9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTsKICAgIGlmIChfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSkgewogICAgICByZXR1cm4gYWJzb2x1dGVVcmw7CiAgICB9CiAgfSBjYXRjaCB7fQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHNoYWRvdyhvYmosIHByb3AsIHZhbHVlLCBub25TZXJpYWxpemFibGUgPSBmYWxzZSkgewogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHsKICAgIHZhbHVlLAogICAgZW51bWVyYWJsZTogIW5vblNlcmlhbGl6YWJsZSwKICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIHdyaXRhYmxlOiBmYWxzZQogIH0pOwogIHJldHVybiB2YWx1ZTsKfQpjb25zdCBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7CiAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgdGhpcy5uYW1lID0gbmFtZTsKICB9CiAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjsKICByZXR1cm4gQmFzZUV4Y2VwdGlvbjsKfSgpOwpjbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZywgY29kZSkgewogICAgc3VwZXIobXNnLCAiUGFzc3dvcmRFeGNlcHRpb24iKTsKICAgIHRoaXMuY29kZSA9IGNvZGU7CiAgfQp9CmNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZywgZGV0YWlscykgewogICAgc3VwZXIobXNnLCAiVW5rbm93bkVycm9yRXhjZXB0aW9uIik7CiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzOwogIH0KfQpjbGFzcyBJbnZhbGlkUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJJbnZhbGlkUERGRXhjZXB0aW9uIik7CiAgfQp9CmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIk1pc3NpbmdQREZFeGNlcHRpb24iKTsKICB9Cn0KY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnLCBzdGF0dXMpIHsKICAgIHN1cGVyKG1zZywgIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiIpOwogICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgfQp9CmNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJGb3JtYXRFcnJvciIpOwogIH0KfQpjbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiQWJvcnRFeGNlcHRpb24iKTsKICB9Cn0KZnVuY3Rpb24gYnl0ZXNUb1N0cmluZyhieXRlcykgewogIGlmICh0eXBlb2YgYnl0ZXMgIT09ICJvYmplY3QiIHx8IGJ5dG
20VzPy5sZW5ndGggPT09IHVuZGVmaW5lZCkgewogICAgdW5yZWFjaGFibGUoIkludmFsaWQgYXJndW1lbnQgZm9yIGJ5dGVzVG9TdHJpbmciKTsKICB9CiAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOwogIGNvbnN0IE1BWF9BUkdVTUVOVF9DT1VOVCA9IDgxOTI7CiAgaWYgKGxlbmd0aCA8IE1BWF9BUkdVTUVOVF9DT1VOVCkgewogICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpOwogIH0KICBjb25zdCBzdHJCdWYgPSBbXTsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHsKICAgIGNvbnN0IGNodW5rRW5kID0gTWF0aC5taW4oaSArIE1BWF9BUkdVTUVOVF9DT1VOVCwgbGVuZ3RoKTsKICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpOwogICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpOwogIH0KICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7CiAgaWYgKHR5cGVvZiBzdHIgIT09ICJzdHJpbmciKSB7CiAgICB1bnJlYWNoYWJsZSgiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nVG9CeXRlcyIpOwogIH0KICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoOwogIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICB9CiAgcmV0dXJuIGJ5dGVzOwp9CmZ1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOwp9CmZ1bmN0aW9uIG9iamVjdFNpemUob2JqKSB7CiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoOwp9CmZ1bmN0aW9uIG9iamVjdEZyb21NYXAobWFwKSB7CiAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXApIHsKICAgIG9ialtrZXldID0gdmFsdWU7CiAgfQogIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7CiAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpOwogIGJ1ZmZlcjhbMF0gPSAxOwogIGNvbnN0IHZpZXczMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXI4LmJ1ZmZlciwgMCwgMSk7CiAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTsKfQpmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7CiAgdHJ5IHsKICAgIG5ldyBGdW5jdGlvbigiIik7CiAgICByZXR1cm4gdHJ1ZTsKICB9IGNhdGNoIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KY2xhc3MgRmVhdHVyZVRlc3QgewogIHN0YXRpYyBnZXQgaXNMaXR0bGVFbmRpYW4oKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0xpdHRsZUVuZGlhbiIsIGlzTGl0dGxlRW5kaWFuKCkpOwogIH0KICBzdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzRXZhbFN1cHBvcnRlZCIsIGlzRXZhbFN1cHBvcnRlZCgpKTsKICB9CiAgc3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwgdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gInVuZGVmaW5lZCIpOwogIH0KICBzdGF0aWMgZ2V0IGlzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQiLCB0eXBlb2YgSW1hZ2VEZWNvZGVyICE9PSAidW5kZWZpbmVkIik7CiAgfQogIHN0YXRpYyBnZXQgcGxhdGZvcm0oKSB7CiAgICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIG5hdmlnYXRvcj8ucGxhdGZvcm0gPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgInBsYXRmb3JtIiwgewogICAgICAgIGlzTWFjOiBuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoIk1hYyIpLAogICAgICAgIGlzV2luZG93czogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKCJXaW4iKSwKICAgICAgICBpc0ZpcmVmb3g6IHR5cGVvZiBuYXZpZ2F0b3I/LnVzZXJBZ2VudCA9PT0gInN0cmluZyIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygiRmlyZWZveCIpCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGxhdGZvcm0iLCB7CiAgICAgIGlzTWFjOiBmYWxzZSwKICAgICAgaXNXaW5kb3dzOiBmYWxzZSwKICAgICAgaXNGaXJlZm94OiBmYWxzZQogICAgfSk7CiAgfQogIHN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzQ1NTUm91bmRTdXBwb3J0ZWQiLCBnbG9iYWxUaGlzLkNTUz8uc3VwcG9ydHM/Ligid2lkdGg6IHJvdW5kKDEuNXB4LCAxcHgpIikpOwogIH0KfQpjb25zdCBoZXhOdW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwgbiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKTsKY2xhc3MgVXRpbCB7CiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7CiAgICByZXR1cm4gYCMke2hleE51bWJlcnNbcl19JHtoZXhOdW1iZXJzW2ddfSR7aGV4TnVtYmVyc1tiXX1gOwogIH0KICBzdGF0aWMgc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHsKICAgIGxldCB0ZW1wOwogICAgaWYgKHRyYW5zZm9ybVswXSkgewogICAgICBpZiAodHJhbnNmb3JtWzBdIDwgMCkgewogICAgICAgIHRlbXAgPSBtaW5NYXhbMF07CiAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdOwogICAgICAgIG1pbk1heFsyXSA9IHRlbXA7CiAgICAgIH0KICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVswXTsKICAgICAgbWluTWF4WzJdICo9IHRyYW5zZm9ybVswXTsKICAgICAgaWYgKHRyYW5zZm9ybVszXSA8IDApIHsKICAgICAgICB0ZW1wID0gbWluTWF4WzFdOwogICAgICAgIG1pbk1
20heFsxXSA9IG1pbk1heFszXTsKICAgICAgICBtaW5NYXhbM10gPSB0ZW1wOwogICAgICB9CiAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bM107CiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bM107CiAgICB9IGVsc2UgewogICAgICB0ZW1wID0gbWluTWF4WzBdOwogICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMV07CiAgICAgIG1pbk1heFsxXSA9IHRlbXA7CiAgICAgIHRlbXAgPSBtaW5NYXhbMl07CiAgICAgIG1pbk1heFsyXSA9IG1pbk1heFszXTsKICAgICAgbWluTWF4WzNdID0gdGVtcDsKICAgICAgaWYgKHRyYW5zZm9ybVsxXSA8IDApIHsKICAgICAgICB0ZW1wID0gbWluTWF4WzFdOwogICAgICAgIG1pbk1heFsxXSA9IG1pbk1heFszXTsKICAgICAgICBtaW5NYXhbM10gPSB0ZW1wOwogICAgICB9CiAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bMV07CiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bMV07CiAgICAgIGlmICh0cmFuc2Zvcm1bMl0gPCAwKSB7CiAgICAgICAgdGVtcCA9IG1pbk1heFswXTsKICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMl07CiAgICAgICAgbWluTWF4WzJdID0gdGVtcDsKICAgICAgfQogICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzJdOwogICAgICBtaW5NYXhbMl0gKj0gdHJhbnNmb3JtWzJdOwogICAgfQogICAgbWluTWF4WzBdICs9IHRyYW5zZm9ybVs0XTsKICAgIG1pbk1heFsxXSArPSB0cmFuc2Zvcm1bNV07CiAgICBtaW5NYXhbMl0gKz0gdHJhbnNmb3JtWzRdOwogICAgbWluTWF4WzNdICs9IHRyYW5zZm9ybVs1XTsKICB9CiAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHsKICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dOwogIH0KICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkgewogICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTsKICAgIGNvbnN0IHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07CiAgICByZXR1cm4gW3h0LCB5dF07CiAgfQogIHN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkgewogICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07CiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkOwogICAgY29uc3QgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7CiAgICByZXR1cm4gW3h0LCB5dF07CiAgfQogIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyLCBtKSB7CiAgICBjb25zdCBwMSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ociwgbSk7CiAgICBjb25zdCBwMiA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7CiAgICBjb25zdCBwMyA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0oW3JbMF0sIHJbM11dLCBtKTsKICAgIGNvbnN0IHA0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pOwogICAgcmV0dXJuIFtNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSwgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSldOwogIH0KICBzdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShtKSB7CiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKICAgIHJldHVybiBbbVszXSAvIGQsIC1tWzFdIC8gZCwgLW1bMl0gLyBkLCBtWzBdIC8gZCwgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCwgKG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZF07CiAgfQogIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7CiAgICBjb25zdCB0cmFuc3Bvc2UgPSBbbVswXSwgbVsyXSwgbVsxXSwgbVszXV07CiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07CiAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107CiAgICBjb25zdCBjID0gbVsyXSAqIHRyYW5zcG9zZVswXSArIG1bM10gKiB0cmFuc3Bvc2VbMl07CiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107CiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyOwogICAgY29uc3Qgc2Vjb25kID0gTWF0aC5zcXJ0KChhICsgZCkgKiogMiAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjsKICAgIGNvbnN0IHN4ID0gZmlyc3QgKyBzZWNvbmQgfHwgMTsKICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTsKICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07CiAgfQogIHN0YXRpYyBub3JtYWxpemVSZWN0KHJlY3QpIHsKICAgIGNvbnN0IHIgPSByZWN0LnNsaWNlKDApOwogICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7CiAgICAgIHJbMF0gPSByZWN0WzJdOwogICAgICByWzJdID0gcmVjdFswXTsKICAgIH0KICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkgewogICAgICByWzFdID0gcmVjdFszXTsKICAgICAgclszXSA9IHJlY3RbMV07CiAgICB9CiAgICByZXR1cm4gcjsKICB9CiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHsKICAgIGNvbnN0IHhMb3cgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1pbihyZWN0MlswXSwgcmVjdDJbMl0pKTsKICAgIGNvbnN0IHhIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5tYXgocmVjdDJbMF0sIHJlY3QyWzJdKSk7CiAgICBpZiAoeExvdyA+IHhIaWdoKSB7CiAgICAgI
20HJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeUxvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWluKHJlY3QyWzFdLCByZWN0MlszXSkpOwogICAgY29uc3QgeUhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVsxXSwgcmVjdDFbM10pLCBNYXRoLm1heChyZWN0MlsxXSwgcmVjdDJbM10pKTsKICAgIGlmICh5TG93ID4geUhpZ2gpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gW3hMb3csIHlMb3csIHhIaWdoLCB5SGlnaF07CiAgfQogIHN0YXRpYyAjZ2V0RXh0cmVtdW1PbkN1cnZlKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgdCwgbWluTWF4KSB7CiAgICBpZiAodCA8PSAwIHx8IHQgPj0gMSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBtdCA9IDEgLSB0OwogICAgY29uc3QgdHQgPSB0ICogdDsKICAgIGNvbnN0IHR0dCA9IHR0ICogdDsKICAgIGNvbnN0IHggPSBtdCAqIChtdCAqIChtdCAqIHgwICsgMyAqIHQgKiB4MSkgKyAzICogdHQgKiB4MikgKyB0dHQgKiB4MzsKICAgIGNvbnN0IHkgPSBtdCAqIChtdCAqIChtdCAqIHkwICsgMyAqIHQgKiB5MSkgKyAzICogdHQgKiB5MikgKyB0dHQgKiB5MzsKICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgeCk7CiAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIHkpOwogICAgbWluTWF4WzJdID0gTWF0aC5tYXgobWluTWF4WzJdLCB4KTsKICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgeSk7CiAgfQogIHN0YXRpYyAjZ2V0RXh0cmVtdW0oeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCBhLCBiLCBjLCBtaW5NYXgpIHsKICAgIGlmIChNYXRoLmFicyhhKSA8IDFlLTEyKSB7CiAgICAgIGlmIChNYXRoLmFicyhiKSA+PSAxZS0xMikgewogICAgICAgIHRoaXMuI2dldEV4dHJlbXVtT25DdXJ2ZSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIC1jIC8gYiwgbWluTWF4KTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkZWx0YSA9IGIgKiogMiAtIDQgKiBjICogYTsKICAgIGlmIChkZWx0YSA8IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3FydERlbHRhID0gTWF0aC5zcXJ0KGRlbHRhKTsKICAgIGNvbnN0IGEyID0gMiAqIGE7CiAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAoLWIgKyBzcXJ0RGVsdGEpIC8gYTIsIG1pbk1heCk7CiAgICB0aGlzLiNnZXRFeHRyZW11bU9uQ3VydmUoeDAsIHgxLCB4MiwgeDMsIHkwLCB5MSwgeTIsIHkzLCAoLWIgLSBzcXJ0RGVsdGEpIC8gYTIsIG1pbk1heCk7CiAgfQogIHN0YXRpYyBiZXppZXJCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCkgewogICAgaWYgKG1pbk1heCkgewogICAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIHgwLCB4Myk7CiAgICAgIG1pbk1heFsxXSA9IE1hdGgubWluKG1pbk1heFsxXSwgeTAsIHkzKTsKICAgICAgbWluTWF4WzJdID0gTWF0aC5tYXgobWluTWF4WzJdLCB4MCwgeDMpOwogICAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIHkwLCB5Myk7CiAgICB9IGVsc2UgewogICAgICBtaW5NYXggPSBbTWF0aC5taW4oeDAsIHgzKSwgTWF0aC5taW4oeTAsIHkzKSwgTWF0aC5tYXgoeDAsIHgzKSwgTWF0aC5tYXgoeTAsIHkzKV07CiAgICB9CiAgICB0aGlzLiNnZXRFeHRyZW11bSh4MCwgeDEsIHgyLCB4MywgeTAsIHkxLCB5MiwgeTMsIDMgKiAoLXgwICsgMyAqICh4MSAtIHgyKSArIHgzKSwgNiAqICh4MCAtIDIgKiB4MSArIHgyKSwgMyAqICh4MSAtIHgwKSwgbWluTWF4KTsKICAgIHRoaXMuI2dldEV4dHJlbXVtKHgwLCB4MSwgeDIsIHgzLCB5MCwgeTEsIHkyLCB5MywgMyAqICgteTAgKyAzICogKHkxIC0geTIpICsgeTMpLCA2ICogKHkwIC0gMiAqIHkxICsgeTIpLCAzICogKHkxIC0geTApLCBtaW5NYXgpOwogICAgcmV0dXJuIG1pbk1heDsKICB9Cn0KY29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyZDgsIDB4MmM3LCAweDJjNiwgMHgyZDksIDB4MmRkLCAweDJkYiwgMHgyZGEsIDB4MmRjLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzYSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxZSwgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWEsIDB4MjEyMiwgMHhmYjAxLCAweGZiMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3ZCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdlLCAwLCAweDIwYWNdOwpmdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHsKICBpZiAoc3RyWzBdID49ICJceEVGIikgewogICAgbGV0IGVuY29kaW5nOwogICAgaWYgKHN0clswXSA9PT0gIlx4RkUiICYmIHN0clsxXSA9PT0gIlx4RkYiKSB7CiAgICAgIGVuY29kaW5nID0gInV0Zi0xNmJlIjsKICAgICAgaWYgKHN0ci5sZW5ndGggJSAyID09PSAxKSB7CiAgICAgICAgc3RyID0gc3RyLnNsaWNlKDAsIC0xKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJbMF0gPT09ICJceEZGIiAmJiBzdHJbMV0gPT09ICJceEZFIikgewogICAgICBlbmNvZGluZyA9ICJ1dGYtMTZsZSI7CiAgICAgIGlmIChzdHIubGVuZ3RoICUgMiA9PT0gMSkgewogICAgICAgI
20HN0ciA9IHN0ci5zbGljZSgwLCAtMSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSAiXHhFRiIgJiYgc3RyWzFdID09PSAiXHhCQiIgJiYgc3RyWzJdID09PSAiXHhCRiIpIHsKICAgICAgZW5jb2RpbmcgPSAidXRmLTgiOwogICAgfQogICAgaWYgKGVuY29kaW5nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywgewogICAgICAgICAgZmF0YWw6IHRydWUKICAgICAgICB9KTsKICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJpbmdUb0J5dGVzKHN0cik7CiAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7CiAgICAgICAgaWYgKCFkZWNvZGVkLmluY2x1ZGVzKCJceDFiIikpIHsKICAgICAgICAgIHJldHVybiBkZWNvZGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVjb2RlZC5yZXBsYWNlQWxsKC9ceDFiW15ceDFiXSooPzpceDFifCQpL2csICIiKTsKICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB3YXJuKGBzdHJpbmdUb1BERlN0cmluZzogIiR7ZXh9Ii5gKTsKICAgICAgfQogICAgfQogIH0KICBjb25zdCBzdHJCdWYgPSBbXTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGlmIChjaGFyQ29kZSA9PT0gMHgxYikgewogICAgICB3aGlsZSAoKytpIDwgaWkgJiYgc3RyLmNoYXJDb2RlQXQoaSkgIT09IDB4MWIpIHt9CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgY29kZSA9IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlW2NoYXJDb2RlXTsKICAgIHN0ckJ1Zi5wdXNoKGNvZGUgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUp
20IDogc3RyLmNoYXJBdChpKSk7CiAgfQogIHJldHVybiBzdHJCdWYuam9pbigiIik7Cn0KZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikgewogIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpOwp9CmZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHsKICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOwp9CmZ1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7CiAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBhcnIxLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShkYXRlID0gbmV3IERhdGUoKSkgewogIGNvbnN0IGJ1ZmZlciA9IFtkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDU2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKV07CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQpsZXQgTm9ybWFsaXplUmVnZXggPSBudWxsOwpsZXQgTm9ybWFsaXphdGlvbk1hcCA9IG51bGw7CmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUoc3RyKSB7CiAgaWYgKCFOb3JtYWxpemVSZWdleCkgewogICAgTm9ybWFsaXplUmVnZXggPSAvKFtcdTAwYTBcdTAwYjVcdTAzN2VcdTBlYjNcdTIwMDAtXHUyMDBhXHUyMDJmXHUyMTI2XHVmYjAwLVx1ZmIwNFx1ZmIwNlx1ZmIyMC1cdWZiMzZcdWZiMzgtXHVmYjNjXHVmYjNlXHVmYjQwLVx1ZmI0MVx1ZmI0My1cdWZiNDRcdWZiNDYtXHVmYmExXHVmYmE0LVx1ZmJhOVx1ZmJhZS1cdWZiYjFcdWZiZDMtXHVmYmRjXHVmYmRlLVx1ZmJlN1x1ZmJlYS1cdWZiZjhcdWZiZmMtXHVmYmZkXHVmYzAwLVx1ZmM1ZFx1ZmM2NC1cdWZjZjFcdWZjZjUtXHVmZDNkXHVmZDg4XHVmZGY0XHVmZGZhLVx1ZmRmYlx1ZmU3MVx1ZmU3N1x1ZmU3OVx1ZmU3Ylx1ZmU3ZF0rKXwoXHVmYjA1KykvZ3U7CiAgICBOb3JtYWxpemF0aW9uTWFwID0gbmV3IE1hcChbWyLvrIUiLCAixb90Il1dKTsKICB9CiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKE5vcm1hbGl6ZVJlZ2V4LCAoXywgcDEsIHAyKSA9PiBwMSA/IHAxLm5vcm1hbGl6ZSgiTkZLQyIpIDogTm9ybWFsaXphdGlvbk1hcC5nZXQocDIpKTsKfQpmdW5jdGlvbiBnZXRVdWlkKCkgewogIGlmICh0eXBlb2YgY3J5cHRvLnJhbmRvbVVVSUQgPT09ICJmdW5jdGlvbiIpIHsKICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpOwogIH0KICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheSgzMik7CiAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhidWYpOwogIHJldHVybiBieXRlc1RvU3RyaW5nKGJ1Zik7Cn0KY29uc3QgQW5ub3RhdGlvblByZWZpeCA9ICJwZGZqc19pbnRlcm5hbF9pZF8iOwpmdW5jdGlvbiB0b0hleFV0aWwoYXJyKSB7CiAgaWYgKFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvSGV4KSB7CiAgICByZXR1cm4gYXJyLnRvSGV4KCk7CiAgfQogIHJldHVybiBBcnJheS5mcm9tKGFyciwgbnVtID0+IGhleE51bWJlcnNbbnVtXSkuam9pbigiIik7Cn0KZnVuY3Rpb24gdG9CYXNlNjRVdGlsKGFycikgewogIGlmIChVaW50OEFycmF5LnByb3RvdHlwZS50b0Jhc2U2NCkgewogICAgcmV0dXJuIGFyci50b0Jhc2U2NCgpOwogIH0KICByZXR1cm4gYnRvYShieXRlc1RvU3RyaW5nKGFycikpOwp9CmZ1bmN0aW9uIGZyb21CYXNlNjRVdGlsKHN0cikgewogIGlmIChVaW50OEFycmF5LmZyb21CYXNlNjQpIHsKICAgIHJldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQoc3RyKTsKICB9CiAgcmV0dXJuIHN0cmluZ1RvQnl0ZXMoYXRvYihzdHIpKTsKfQoKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmV2ZXJ5LmpzCnZhciBlc25leHRfaXRlcmF0b3JfZXZlcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyMTUpOwo7Ly8gLi9zcmMvY29yZS9wcmltaXRpdmVzLmpzCgoKCgoKCgoKCmNvbnN0IENJUkNVTEFSX1JFRiA9IFN5bWJvbCgiQ0lSQ1VMQVJfUkVGIik7CmNvbnN0IEVPRiA9IFN5bWJvbCgiRU9GIik7CmxldCBDbWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CmxldCBOYW1lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpsZXQgUmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBjbGVhclByaW1pdGl2ZUNhY2hlcygpIHsKICBDbWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgTmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICBSZWZDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7Cn0KY2xhc3MgTmFtZSB7CiAgY29uc3RydWN0b3IobmFtZSkgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICB9CiAgc3RhdGljIGdldChuYW1lKSB7CiAgICByZXR1cm4gTmFtZUNhY2hlW25hbWVdIHx8PSBuZXcgTmFtZShuYW1lKTsKICB9Cn0KY2xhc3MgQ21kIHsKICBjb25zdHJ1Y3RvcihjbWQpIHsKICAgIHRoaXMuY21kID0gY21kOwogIH0KICBzdGF0aWMgZ2V0KGNtZCkgewogICAgcmV0dXJuIENtZENhY2hlW2NtZF0gfHw9IG5ldyBDbWQoY21kKTsKICB9Cn0KY29uc3Qgbm9uU2VyaWFsaXphYmxlID0gZnVuY3Rpb24gbm9uU2VyaWFsaXphYmxlQ2xvc3VyZSgpIHsKICByZXR1cm4gbm9uU2VyaWFsaXphYmxlOwp9OwpjbGFzcyBEaWN0IHsKICBjb25zdHJ1Y3Rvcih4cmVmID0gbnVsbCkgewogICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMub2JqSWQgPSBudWxsOwogICAgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZTsKICAgIHRoaXMuX19ub25TZXJpYWxpemFibGVfXyA9IG5vblNlcmlhbGl6YWJsZTsKICB9CiAgYXNzaWduWHJlZihuZXdYcmVmKSB7CiAgICB0aGlzLnhyZWYgPSBuZXdYcmVmOwogIH0KICBnZXQgc2l6ZSgpIHsKICAgIHJldHVybi
20B0aGlzLl9tYXAuc2l6ZTsKICB9CiAgZ2V0KGtleTEsIGtleTIsIGtleTMpIHsKICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5MSk7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkyICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTIpOwogICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB2YWx1ZSA9IHRoaXMuX21hcC5nZXQoa2V5Myk7CiAgICAgIH0KICAgIH0KICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKICAgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaCh2YWx1ZSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KICBhc3luYyBnZXRBc3luYyhrZXkxLCBrZXkyLCBrZXkzKSB7CiAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTEpOwogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkyKTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTMpOwogICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7CiAgICAgIHJldHVybiB0aGlzLnhyZWYuZmV0Y2hBc3luYyh2YWx1ZSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KICBnZXRBcnJheShrZXkxLCBrZXkyLCBrZXkzKSB7CiAgICBsZXQgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTEpOwogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5fbWFwLmdldChrZXkyKTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXAuZ2V0KGtleTMpOwogICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7CiAgICAgIHZhbHVlID0gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB2YWx1ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgaWYgKHZhbHVlW2ldIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICAgICAgdmFsdWVbaV0gPSB0aGlzLnhyZWYuZmV0Y2godmFsdWVbaV0sIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9CiAgZ2V0UmF3KGtleSkgewogICAgcmV0dXJuIHRoaXMuX21hcC5nZXQoa2V5KTsKICB9CiAgZ2V0S2V5cygpIHsKICAgIHJldHVybiBbLi4udGhpcy5fbWFwLmtleXMoKV07CiAgfQogIGdldFJhd1ZhbHVlcygpIHsKICAgIHJldHVybiBbLi4udGhpcy5fbWFwLnZhbHVlcygpXTsKICB9CiAgc2V0KGtleSwgdmFsdWUpIHsKICAgIHRoaXMuX21hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgfQogIGhhcyhrZXkpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7CiAgfQogICpbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuX21hcCkgewogICAgICB5aWVsZCBba2V5LCB2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYgPyB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKSA6IHZhbHVlXTsKICAgIH0KICB9CiAgc3RhdGljIGdldCBlbXB0eSgpIHsKICAgIGNvbnN0IGVtcHR5RGljdCA9IG5ldyBEaWN0KG51bGwpOwogICAgZW1wdHlEaWN0LnNldCA9IChrZXksIHZhbHVlKSA9PiB7CiAgICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgYHNldGAgb24gdGhlIGVtcHR5IGRpY3Rpb25hcnkuIik7CiAgICB9OwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZW1wdHkiLCBlbXB0eURpY3QpOwogIH0KICBzdGF0aWMgbWVyZ2UoewogICAgeHJlZiwKICAgIGRpY3RBcnJheSwKICAgIG1lcmdlU3ViRGljdHMgPSBmYWxzZQogIH0pIHsKICAgIGNvbnN0IG1lcmdlZERpY3QgPSBuZXcgRGljdCh4cmVmKSwKICAgICAgcHJvcGVydGllcyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3QgZGljdCBvZiBkaWN0QXJyYXkpIHsKICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGljdC5fbWFwKSB7CiAgICAgICAgbGV0IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXQoa2V5KTsKICAgICAgICBpZiAocHJvcGVydHkgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcHJvcGVydHkgPSBbXTsKICAgICAgICAgIHByb3BlcnRpZXMuc2V0KGtleSwgcHJvcGVydHkpOwogICAgICAgIH0gZWxzZSBpZiAoIW1lcmdlU3ViRGljdHMgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcHJvcGVydHkucHVzaCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlc10gb2YgcHJvcGVydGllcykgewogICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSB8fCAhKHZhbHVlc1swXSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgbWVyZ2VkRGljdC5fbWFwLnNldChuYW1lLCB2YWx1ZXNbMF0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHN1YkRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgZm9yIChjb25zdCBkaWN0IG9mIHZhbHVlcykgewogICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRpY3QuX21hcCkgewogICAgICAgICAgaWYgKCFzdWJEaWN0Ll9tYXAuaGFzKGtleSkpIHsKICAgICAgICAgICAgc3ViRGljdC5fbWFwLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgI
20H0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN1YkRpY3Quc2l6ZSA+IDApIHsKICAgICAgICBtZXJnZWREaWN0Ll9tYXAuc2V0KG5hbWUsIHN1YkRpY3QpOwogICAgICB9CiAgICB9CiAgICBwcm9wZXJ0aWVzLmNsZWFyKCk7CiAgICByZXR1cm4gbWVyZ2VkRGljdC5zaXplID4gMCA/IG1lcmdlZERpY3QgOiBEaWN0LmVtcHR5OwogIH0KICBjbG9uZSgpIHsKICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5nZXRLZXlzKCkpIHsKICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldFJhdyhrZXkpKTsKICAgIH0KICAgIHJldHVybiBkaWN0OwogIH0KICBkZWxldGUoa2V5KSB7CiAgICBkZWxldGUgdGhpcy5fbWFwW2tleV07CiAgfQp9CmNsYXNzIFJlZiB7CiAgY29uc3RydWN0b3IobnVtLCBnZW4pIHsKICAgIHRoaXMubnVtID0gbnVtOwogICAgdGhpcy5nZW4gPSBnZW47CiAgfQogIHRvU3RyaW5nKCkgewogICAgaWYgKHRoaXMuZ2VuID09PSAwKSB7CiAgICAgIHJldHVybiBgJHt0aGlzLm51bX1SYDsKICAgIH0KICAgIHJldHVybiBgJHt0aGlzLm51bX1SJHt0aGlzLmdlbn1gOwogIH0KICBzdGF0aWMgZnJvbVN0cmluZyhzdHIpIHsKICAgIGNvbnN0IHJlZiA9IFJlZkNhY2hlW3N0cl07CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiByZWY7CiAgICB9CiAgICBjb25zdCBtID0gL14oXGQrKVIoXGQqKSQvLmV4ZWMoc3RyKTsKICAgIGlmICghbSB8fCBtWzFdID09PSAiMCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gUmVmQ2FjaGVbc3RyXSA9IG5ldyBSZWYocGFyc2VJbnQobVsxXSksICFtWzJdID8gMCA6IHBhcnNlSW50KG1bMl0pKTsKICB9CiAgc3RhdGljIGdldChudW0sIGdlbikgewogICAgY29uc3Qga2V5ID0gZ2VuID09PSAwID8gYCR7bnVtfVJgIDogYCR7bnVtfVIke2dlbn1gOwogICAgcmV0dXJuIFJlZkNhY2hlW2tleV0gfHw9IG5ldyBSZWYobnVtLCBnZW4pOwogIH0KfQpjbGFzcyBSZWZTZXQgewogIGNvbnN0cnVjdG9yKHBhcmVudCA9IG51bGwpIHsKICAgIHRoaXMuX3NldCA9IG5ldyBTZXQocGFyZW50Py5fc2V0KTsKICB9CiAgaGFzKHJlZikgewogICAgcmV0dXJuIHRoaXMuX3NldC5oYXMocmVmLnRvU3RyaW5nKCkpOwogIH0KICBwdXQocmVmKSB7CiAgICB0aGlzLl9zZXQuYWRkKHJlZi50b1N0cmluZygpKTsKICB9CiAgcmVtb3ZlKHJlZikgewogICAgdGhpcy5fc2V0LmRlbGV0ZShyZWYudG9TdHJpbmcoKSk7CiAgfQogIFtTeW1ib2wuaXRlcmF0b3JdKCkgewogICAgcmV0dXJuIHRoaXMuX3NldC52YWx1ZXMoKTsKICB9CiAgY2xlYXIoKSB7CiAgICB0aGlzLl9zZXQuY2xlYXIoKTsKICB9Cn0KY2xhc3MgUmVmU2V0Q2FjaGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOwogIH0KICBnZXQgc2l6ZSgpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuc2l6ZTsKICB9CiAgZ2V0KHJlZikgewogICAgcmV0dXJuIHRoaXMuX21hcC5nZXQocmVmLnRvU3RyaW5nKCkpOwogIH0KICBoYXMocmVmKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmhhcyhyZWYudG9TdHJpbmcoKSk7CiAgfQogIHB1dChyZWYsIG9iaikgewogICAgdGhpcy5fbWFwLnNldChyZWYudG9TdHJpbmcoKSwgb2JqKTsKICB9CiAgcHV0QWxpYXMocmVmLCBhbGlhc1JlZikgewogICAgdGhpcy5fbWFwLnNldChyZWYudG9TdHJpbmcoKSwgdGhpcy5nZXQoYWxpYXNSZWYpKTsKICB9CiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpOwogIH0KICBjbGVhcigpIHsKICAgIHRoaXMuX21hcC5jbGVhcigpOwogIH0KICAqdmFsdWVzKCkgewogICAgeWllbGQqIHRoaXMuX21hcC52YWx1ZXMoKTsKICB9CiAgKml0ZW1zKCkgewogICAgZm9yIChjb25zdCBbcmVmLCB2YWx1ZV0gb2YgdGhpcy5fbWFwKSB7CiAgICAgIHlpZWxkIFtSZWYuZnJvbVN0cmluZyhyZWYpLCB2YWx1ZV07CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGlzTmFtZSh2LCBuYW1lKSB7CiAgcmV0dXJuIHYgaW5zdGFuY2VvZiBOYW1lICYmIChuYW1lID09PSB1bmRlZmluZWQgfHwgdi5uYW1lID09PSBuYW1lKTsKfQpmdW5jdGlvbiBpc0NtZCh2LCBjbWQpIHsKICByZXR1cm4gdiBpbnN0YW5jZW9mIENtZCAmJiAoY21kID09PSB1bmRlZmluZWQgfHwgdi5jbWQgPT09IGNtZCk7Cn0KZnVuY3Rpb24gaXNEaWN0KHYsIHR5cGUpIHsKICByZXR1cm4gdiBpbnN0YW5jZW9mIERpY3QgJiYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCBpc05hbWUodi5nZXQoIlR5cGUiKSwgdHlwZSkpOwp9CmZ1bmN0aW9uIGlzUmVmc0VxdWFsKHYxLCB2MikgewogIHJldHVybiB2MS5udW0gPT09IHYyLm51bSAmJiB2MS5nZW4gPT09IHYyLmdlbjsKfQoKOy8vIC4vc3JjL2NvcmUvYmFzZV9zdHJlYW0uanMKCmNsYXNzIEJhc2VTdHJlYW0gewogIGdldCBsZW5ndGgoKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgZ2V0dGVyIGBsZW5ndGhgIGFjY2Vzc2VkIik7CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IGdldHRlciBgaXNFbXB0eWAgYWNjZXNzZWQiKTsKICB9CiAgZ2V0IGlzRGF0YUxvYWRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzRGF0YUxvYWRlZCIsIHRydWUpOwogIH0KICBnZXRCeXRlKCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZWAgY2FsbGVkIik7CiAgfQogIGdldEJ5dGVzKGxlbmd0aCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZXNgIGNhbGxlZCIpOwogIH0KICBhc3luYyBnZXRJbWFnZURhdGEobGVuZ3RoLCBkZWNvZGVyT3B0aW9ucykgewogICAgcmV0dXJuIHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoLCBkZWNvZGVyT3B0aW9ucyk7CiAgfQogIGFzeW5jIGFzeW5jR2V0Qnl0ZXMoKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBhc3luY0dldEJ5dGVzYCBjYWxsZWQiKTsKICB9CiAgZ2V0IGlzQXN5bmMoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcigpIHsKICAgIHJldHVybi
20BmYWxzZTsKICB9CiAgYXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcGVla0J5dGUoKSB7CiAgICBjb25zdCBwZWVrZWRCeXRlID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAocGVla2VkQnl0ZSAhPT0gLTEpIHsKICAgICAgdGhpcy5wb3MtLTsKICAgIH0KICAgIHJldHVybiBwZWVrZWRCeXRlOwogIH0KICBwZWVrQnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgIHRoaXMucG9zIC09IGJ5dGVzLmxlbmd0aDsKICAgIHJldHVybiBieXRlczsKICB9CiAgZ2V0VWludDE2KCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBpZiAoYjAgPT09IC0xIHx8IGIxID09PSAtMSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gKGIwIDw8IDgpICsgYjE7CiAgfQogIGdldEludDMyKCkgewogICAgY29uc3QgYjAgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIxID0gdGhpcy5nZXRCeXRlKCk7CiAgICBjb25zdCBiMiA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgY29uc3QgYjMgPSB0aGlzLmdldEJ5dGUoKTsKICAgIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZVJhbmdlYCBjYWxsZWQiKTsKICB9CiAgZ2V0U3RyaW5nKGxlbmd0aCkgewogICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcodGhpcy5nZXRCeXRlcyhsZW5ndGgpKTsKICB9CiAgc2tpcChuKSB7CiAgICB0aGlzLnBvcyArPSBuIHx8IDE7CiAgfQogIHJlc2V0KCkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgcmVzZXRgIGNhbGxlZCIpOwogIH0KICBtb3ZlU3RhcnQoKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtb3ZlU3RhcnRgIGNhbGxlZCIpOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtYWtlU3ViU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NvcmVfdXRpbHMuanMKCgoKCgoKCgoKCgoKCgoKCgoKCgpjb25zdCBQREZfVkVSU0lPTl9SRUdFWFAgPSAvXlsxLTldXC5cZCQvOwpjb25zdCBNQVhfSU5UXzMyID0gMiAqKiAzMSAtIDE7CmNvbnN0IE1JTl9JTlRfMzIgPSAtKDIgKiogMzEpOwpmdW5jdGlvbiBnZXRMb29rdXBUYWJsZUZhY3RvcnkoaW5pdGlhbGl6ZXIpIHsKICBsZXQgbG9va3VwOwogIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoaW5pdGlhbGl6ZXIpIHsKICAgICAgbG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgaW5pdGlhbGl6ZXIobG9va3VwKTsKICAgICAgaW5pdGlhbGl6ZXIgPSBudWxsOwogICAgfQogICAgcmV0dXJuIGxvb2t1cDsKICB9Owp9CmNsYXNzIE1pc3NpbmdEYXRhRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IoYmVnaW4sIGVuZCkgewogICAgc3VwZXIoYE1pc3NpbmcgZGF0YSBbJHtiZWdpbn0sICR7ZW5kfSlgLCAiTWlzc2luZ0RhdGFFeGNlcHRpb24iKTsKICAgIHRoaXMuYmVnaW4gPSBiZWdpbjsKICAgIHRoaXMuZW5kID0gZW5kOwogIH0KfQpjbGFzcyBQYXJzZXJFT0ZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIlBhcnNlckVPRkV4Y2VwdGlvbiIpOwogIH0KfQpjbGFzcyBYUmVmRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIlhSZWZFbnRyeUV4Y2VwdGlvbiIpOwogIH0KfQpjbGFzcyBYUmVmUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIlhSZWZQYXJzZUV4Y2VwdGlvbiIpOwogIH0KfQpmdW5jdGlvbiBhcnJheUJ1ZmZlcnNUb0J5dGVzKGFycikgewogIGNvbnN0IGxlbmd0aCA9IGFyci5sZW5ndGg7CiAgaWYgKGxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICBpZiAobGVuZ3RoID09PSAxKSB7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXJyWzBdKTsKICB9CiAgbGV0IGRhdGFMZW5ndGggPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIGRhdGFMZW5ndGggKz0gYXJyW2ldLmJ5dGVMZW5ndGg7CiAgfQogIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhTGVuZ3RoKTsKICBsZXQgcG9zID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBpdGVtID0gbmV3IFVpbnQ4QXJyYXkoYXJyW2ldKTsKICAgIGRhdGEuc2V0KGl0ZW0sIHBvcyk7CiAgICBwb3MgKz0gaXRlbS5ieXRlTGVuZ3RoOwogIH0KICByZXR1cm4gZGF0YTsKfQpmdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICBkaWN0LAogIGtleSwKICBnZXRBcnJheSA9IGZhbHNlLAogIHN0b3BXaGVuRm91bmQgPSB0cnVlCn0pIHsKICBsZXQgdmFsdWVzOwogIGNvbnN0IHZpc2l0ZWQgPSBuZXcgUmVmU2V0KCk7CiAgd2hpbGUgKGRpY3QgaW5zdGFuY2VvZiBEaWN0ICYmICEoZGljdC5vYmpJZCAmJiB2aXNpdGVkLmhhcyhkaWN0Lm9iaklkKSkpIHsKICAgIGlmIChkaWN0Lm9iaklkKSB7CiAgICAgIHZpc2l0ZWQucHV0KGRpY3Qub2JqSWQpOwogICAgfQogICAgY29uc3QgdmFsdWUgPSBnZXRBcnJheSA/IGRpY3QuZ2V0QXJyYXkoa2V5KSA6IGRpY3QuZ2V0KGtleSk7CiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoc3RvcFdoZW5Gb3VuZCkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICAodmFsdWVzIHx8PSBbXSkucHVzaCh2YWx1ZSk7CiAgICB9CiAgICBkaWN0ID0gZGljdC5nZXQoIlBhcmVudCIpOwogIH0KICByZXR1cm4gdmFsdWVzOwp9CmZ1bmN0aW9uIGdldFBhcmVudFRvVXBkYXRlKGRpY3QsIHJlZiwgeHJlZikgewogIGNvbnN0IHZpc2l0ZWQgPSBuZXcgUmVmU2V0KCk7CiAgY29uc3QgZmlyc3REaWN0ID0gZGljdDsKICBjb25zdCByZXN1bHQgPSB7CiAgICBkaWN0OiBudWxsLAogICAgcmVmOiBudWxsCiAgfTsKICB3aGlsZSAoZGljdCBpbnN0YW5jZW9mIERpY3QgJiYgIXZpc2l0ZWQuaGFzKHJlZikpIHsKICAgIHZpc2l0ZWQucHV0KHJlZik7CiAgICBpZiAoZGljdC5oYXMoIlQiKSkgewogICAgICBicmVhazsKICAgIH0KICAgIHJlZiA9IGRpY3QuZ2V0UmF3KCJQYXJlbnQiKTsKICAgIGlmICghKHJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGRpY3QgPSB4cmVmLmZldGNoKHJlZik7CiAgfQogIGlmIChkaWN0IGluc3RhbmNlb2YgRGljdCAmJiBkaWN0ICE9PSBmaXJzdERpY3QpIHsKICAgIHJlc3VsdC5kaWN0ID0gZGljdDsKICAgIHJlc3VsdC5yZWYgPSByZWY7CiAgfQogIHJldHVybi
20ByZXN1bHQ7Cn0KY29uc3QgUk9NQU5fTlVNQkVSX01BUCA9IFsiIiwgIkMiLCAiQ0MiLCAiQ0NDIiwgIkNEIiwgIkQiLCAiREMiLCAiRENDIiwgIkRDQ0MiLCAiQ00iLCAiIiwgIlgiLCAiWFgiLCAiWFhYIiwgIlhMIiwgIkwiLCAiTFgiLCAiTFhYIiwgIkxYWFgiLCAiWEMiLCAiIiwgIkkiLCAiSUkiLCAiSUlJIiwgIklWIiwgIlYiLCAiVkkiLCAiVklJIiwgIlZJSUkiLCAiSVgiXTsKZnVuY3Rpb24gdG9Sb21hbk51bWVyYWxzKG51bWJlciwgbG93ZXJDYXNlID0gZmFsc2UpIHsKICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpICYmIG51bWJlciA+IDAsICJUaGUgbnVtYmVyIHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIuIik7CiAgY29uc3Qgcm9tYW4gPSAiTSIucmVwZWF0KG51bWJlciAvIDEwMDAgfCAwKSArIFJPTUFOX05VTUJFUl9NQVBbbnVtYmVyICUgMTAwMCAvIDEwMCB8IDBdICsgUk9NQU5fTlVNQkVSX01BUFsxMCArIChudW1iZXIgJSAxMDAgLyAxMCB8IDApXSArIFJPTUFOX05VTUJFUl9NQVBbMjAgKyBudW1iZXIgJSAxMF07CiAgcmV0dXJuIGxvd2VyQ2FzZSA/IHJvbWFuLnRvTG93ZXJDYXNlKCkgOiByb21hbjsKfQpmdW5jdGlvbiBsb2cyKHgpIHsKICByZXR1cm4geCA+IDAgPyBNYXRoLmNlaWwoTWF0aC5sb2cyKHgpKSA6IDA7Cn0KZnVuY3Rpb24gcmVhZEludDgoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCA+PiAyNDsKfQpmdW5jdGlvbiByZWFkVWludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07Cn0KZnVuY3Rpb24gcmVhZFVpbnQzMihkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdKSA+Pj4gMDsKfQpmdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHsKICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MGQgfHwgY2ggPT09IDB4MGE7Cn0KZnVuY3Rpb24gaXNCb29sZWFuQXJyYXkoYXJyLCBsZW4pIHsKICByZXR1cm4gQXJyYXkuaXNBcnJheShhcnIpICYmIChsZW4gPT09IG51bGwgfHwgYXJyLmxlbmd0aCA9PT0gbGVuKSAmJiBhcnIuZXZlcnkoeCA9PiB0eXBlb2YgeCA9PT0gImJvb2xlYW4iKTsKfQpmdW5jdGlvbiBpc051bWJlckFycmF5KGFyciwgbGVuKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgewogICAgcmV0dXJuIChsZW4gPT09IG51bGwgfHwgYXJyLmxlbmd0aCA9PT0gbGVuKSAmJiBhcnIuZXZlcnkoeCA9PiB0eXBlb2YgeCA9PT0gIm51bWJlciIpOwogIH0KICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycikgJiYgKGFyci5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGFyclswXSA9PT0gIm51bWJlciIpICYmIChsZW4gPT09IG51bGwgfHwgYXJyLmxlbmd0aCA9PT0gbGVuKTsKfQpmdW5jdGlvbiBsb29rdXBNYXRyaXgoYXJyLCBmYWxsYmFjaykgewogIHJldHVybiBpc051bWJlckFycmF5KGFyciwgNikgPyBhcnIgOiBmYWxsYmFjazsKfQpmdW5jdGlvbiBsb29rdXBSZWN0KGFyciwgZmFsbGJhY2spIHsKICByZXR1cm4gaXNOdW1iZXJBcnJheShhcnIsIDQpID8gYXJyIDogZmFsbGJhY2s7Cn0KZnVuY3Rpb24gbG9va3VwTm9ybWFsUmVjdChhcnIsIGZhbGxiYWNrKSB7CiAgcmV0dXJuIGlzTnVtYmVyQXJyYXkoYXJyLCA0KSA/IFV0aWwubm9ybWFsaXplUmVjdChhcnIpIDogZmFsbGJhY2s7Cn0KZnVuY3Rpb24gcGFyc2VYRkFQYXRoKHBhdGgpIHsKICBjb25zdCBwb3NpdGlvblBhdHRlcm4gPSAvKC4rKVxbKFxkKylcXSQvOwogIHJldHVybiBwYXRoLnNwbGl0KCIuIikubWFwKGNvbXBvbmVudCA9PiB7CiAgICBjb25zdCBtID0gY29tcG9uZW50Lm1hdGNoKHBvc2l0aW9uUGF0dGVybik7CiAgICBpZiAobSkgewogICAgICByZXR1cm4gewogICAgICAgIG5hbWU6IG1bMV0sCiAgICAgICAgcG9zOiBwYXJzZUludChtWzJdLCAxMCkKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWU6IGNvbXBvbmVudCwKICAgICAgcG9zOiAwCiAgICB9OwogIH0pOwp9CmZ1bmN0aW9uIGVzY2FwZVBERk5hbWUoc3RyKSB7CiAgY29uc3QgYnVmZmVyID0gW107CiAgbGV0IHN0YXJ0ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgaWYgKGNoYXIgPCAweDIxIHx8IGNoYXIgPiAweDdlIHx8IGNoYXIgPT09IDB4MjMgfHwgY2hhciA9PT0gMHgyOCB8fCBjaGFyID09PSAweDI5IHx8IGNoYXIgPT09IDB4M2MgfHwgY2hhciA9PT0gMHgzZSB8fCBjaGFyID09PSAweDViIHx8IGNoYXIgPT09IDB4NWQgfHwgY2hhciA9PT0gMHg3YiB8fCBjaGFyID09PSAweDdkIHx8IGNoYXIgPT09IDB4MmYgfHwgY2hhciA9PT0gMHgyNSkgewogICAgICBpZiAoc3RhcnQgPCBpKSB7CiAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGAjJHtjaGFyLnRvU3RyaW5nKDE2KX1gKTsKICAgICAgc3RhcnQgPSBpICsgMTsKICAgIH0KICB9CiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBzdHI7CiAgfQogIGlmIChzdGFydCA8IHN0ci5sZW5ndGgpIHsKICAgIGJ1ZmZlci5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIHN0ci5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQpmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKC8oWygpXFxcblxyXSkvZywgbWF0Y2ggPT4gewogICAgaWYgKG1hdGNoID09PSAiXG4iKSB7CiAgICAgIHJldHVybiAiXFxuIjsKICAgIH0gZWxzZSBpZiAobWF0Y2ggPT09ICJcciIpIHsKICAgICAgcmV0dXJuICJcXHIiOwogICAgfQogICAgcmV0dXJuIGBcXCR7bWF0Y2h9YDsKICB9KTsKfQpmdW5jdGlvbiBfY29sbGVjdEpTKGVudHJ5LCB4cmVmLCBsaXN0LCBwYXJlbnRzKSB7CiAgaWYgKCFlbnRyeSkgewogICAgcmV0dXJuOwogIH0KICBsZXQgcGFyZW50ID0gbnVsbDsKICBpZiAoZW50cnkgaW5zdGFuY2VvZiBSZWYpIHsKICAgIGlmIChwYXJlbnRzLmhhcyhlbnRyeSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgcGFyZW50ID0gZW50cnk7CiAgICBwYXJlbnRzLnB1dChwYXJlbnQpOwogICAgZW50cnkgPSB4cmVmLmZldGNoKGVudHJ5KTsKICB9CiAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnkpKSB7CiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgX2NvbGxlY3RKUyhlbGVtZW50LCB4cmVmLCBsaXN0LCBwYXJlbnRzKTsKICAgIH0KICB9IGVsc2UgaWYgKGVudHJ5IGluc3RhbmNlb2YgRGljdCkgewogICAgaWYgKGlzTmFtZShlbnRyeS5nZXQoIlMiKSwgIkphdmFTY3JpcHQiKSkgewogICAgICBjb25zdCBqcyA9IGVudHJ5LmdldCgiSlMiKTsKICAgICAgbGV0IGNvZGU7CiAgICAgIGlmIChqcyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0p
20IHsKICAgICAgICBjb2RlID0ganMuZ2V0U3RyaW5nKCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzID09PSAic3RyaW5nIikgewogICAgICAgIGNvZGUgPSBqczsKICAgICAgfQogICAgICBjb2RlICYmPSBzdHJpbmdUb1BERlN0cmluZyhjb2RlKS5yZXBsYWNlQWxsKCJceDAwIiwgIiIpOwogICAgICBpZiAoY29kZSkgewogICAgICAgIGxpc3QucHVzaChjb2RlKTsKICAgICAgfQogICAgfQogICAgX2NvbGxlY3RKUyhlbnRyeS5nZXRSYXcoIk5leHQiKSwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgfQogIGlmIChwYXJlbnQpIHsKICAgIHBhcmVudHMucmVtb3ZlKHBhcmVudCk7CiAgfQp9CmZ1bmN0aW9uIGNvbGxlY3RBY3Rpb25zKHhyZWYsIGRpY3QsIGV2ZW50VHlwZSkgewogIGNvbnN0IGFjdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGNvbnN0IGFkZGl0aW9uYWxBY3Rpb25zRGljdHMgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgIGRpY3QsCiAgICBrZXk6ICJBQSIsCiAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQogIH0pOwogIGlmIChhZGRpdGlvbmFsQWN0aW9uc0RpY3RzKSB7CiAgICBmb3IgKGxldCBpID0gYWRkaXRpb25hbEFjdGlvbnNEaWN0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBjb25zdCBhZGRpdGlvbmFsQWN0aW9ucyA9IGFkZGl0aW9uYWxBY3Rpb25zRGljdHNbaV07CiAgICAgIGlmICghKGFkZGl0aW9uYWxBY3Rpb25zIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGtleSBvZiBhZGRpdGlvbmFsQWN0aW9ucy5nZXRLZXlzKCkpIHsKICAgICAgICBjb25zdCBhY3Rpb24gPSBldmVudFR5cGVba2V5XTsKICAgICAgICBpZiAoIWFjdGlvbikgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBhZGRpdGlvbmFsQWN0aW9ucy5nZXRSYXcoa2V5KTsKICAgICAgICBjb25zdCBwYXJlbnRzID0gbmV3IFJlZlNldCgpOwogICAgICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgICAgICBfY29sbGVjdEpTKGFjdGlvbkRpY3QsIHhyZWYsIGxpc3QsIHBhcmVudHMpOwogICAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIGFjdGlvbnNbYWN0aW9uXSA9IGxpc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGlmIChkaWN0LmhhcygiQSIpKSB7CiAgICBjb25zdCBhY3Rpb25EaWN0ID0gZGljdC5nZXQoIkEiKTsKICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBsaXN0ID0gW107CiAgICBfY29sbGVjdEpTKGFjdGlvbkRpY3QsIHhyZWYsIGxpc3QsIHBhcmVudHMpOwogICAgaWYgKGxpc3QubGVuZ3RoID4gMCkgewogICAgICBhY3Rpb25zLkFjdGlvbiA9IGxpc3Q7CiAgICB9CiAgfQogIHJldHVybiBvYmplY3RTaXplKGFjdGlvbnMpID4gMCA/IGFjdGlvbnMgOiBudWxsOwp9CmNvbnN0IFhNTEVudGl0aWVzID0gewogIDB4M2M6ICImbHQ7IiwKICAweDNlOiAiJmd0OyIsCiAgMHgyNjogIiZhbXA7IiwKICAweDIyOiAiJnF1b3Q7IiwKICAweDI3OiAiJmFwb3M7Igp9OwpmdW5jdGlvbiogY29kZVBvaW50SXRlcihzdHIpIHsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jb2RlUG9pbnRBdChpKTsKICAgIGlmIChjaGFyID4gMHhkN2ZmICYmIChjaGFyIDwgMHhlMDAwIHx8IGNoYXIgPiAweGZmZmQpKSB7CiAgICAgIGkrKzsKICAgIH0KICAgIHlpZWxkIGNoYXI7CiAgfQp9CmZ1bmN0aW9uIGVuY29kZVRvWG1sU3RyaW5nKHN0cikgewogIGNvbnN0IGJ1ZmZlciA9IFtdOwogIGxldCBzdGFydCA9IDA7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNoYXIgPSBzdHIuY29kZVBvaW50QXQoaSk7CiAgICBpZiAoMHgyMCA8PSBjaGFyICYmIGNoYXIgPD0gMHg3ZSkgewogICAgICBjb25zdCBlbnRpdHkgPSBYTUxFbnRpdGllc1tjaGFyXTsKICAgICAgaWYgKGVudGl0eSkgewogICAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICAgIGJ1ZmZlci5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKICAgICAgICB9CiAgICAgICAgYnVmZmVyLnB1c2goZW50aXR5KTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoc3RhcnQgPCBpKSB7CiAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGAmI3gke2NoYXIudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9O2ApOwogICAgICBpZiAoY2hhciA+IDB4ZDdmZiAmJiAoY2hhciA8IDB4ZTAwMCB8fCBjaGFyID4gMHhmZmZkKSkgewogICAgICAgIGkrKzsKICAgICAgfQogICAgICBzdGFydCA9IGkgKyAxOwogICAgfQogIH0KICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIHN0cjsKICB9CiAgaWYgKHN0YXJ0IDwgc3RyLmxlbmd0aCkgewogICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgc3RyLmxlbmd0aCkpOwogIH0KICByZXR1cm4gYnVmZmVyLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHZhbGlkYXRlRm9udE5hbWUoZm9udEZhbWlseSwgbXVzdFdhcm4gPSBmYWxzZSkgewogIGNvbnN0IG0gPSAvXigifCcpLiooInwnKSQvLmV4ZWMoZm9udEZhbWlseSk7CiAgaWYgKG0gJiYgbVsxXSA9PT0gbVsyXSkgewogICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGBbXlxcXFxdJHttWzFdfWApOwogICAgaWYgKHJlLnRlc3QoZm9udEZhbWlseS5zbGljZSgxLCAtMSkpKSB7CiAgICAgIGlmIChtdXN0V2FybikgewogICAgICAgIHdhcm4oYEZvbnRGYW1pbHkgY29udGFpbnMgdW5lc2NhcGVkICR7bVsxXX06ICR7Zm9udEZhbWlseX0uYCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGNvbnN0IGlkZW50IG9mIGZvbnRGYW1pbHkuc3BsaXQoL1sgXHRdKy8pKSB7CiAgICAgIGlmICgvXihcZHwoLShcZHwtKSkpLy50ZXN0KGlkZW50KSB8fCAhL15bXHctXFxdKyQvLnRlc3QoaWRlbnQpKSB7CiAgICAgICAgaWYgKG11c3RXYXJuKSB7CiAgICAgICAgICB3YXJuKGBGb250RmFtaWx5IGNvbnRhaW5zIGludmFsaWQgPGN1c3RvbS1pZGVudD46ICR7Zm9udEZhbWlseX0uYCk7CiAgICAgICAgfQogICAgICAgI
20HJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiB2YWxpZGF0ZUNTU0ZvbnQoY3NzRm9udEluZm8pIHsKICBjb25zdCBERUZBVUxUX0NTU19GT05UX09CTElRVUUgPSAiMTQiOwogIGNvbnN0IERFRkFVTFRfQ1NTX0ZPTlRfV0VJR0hUID0gIjQwMCI7CiAgY29uc3QgQ1NTX0ZPTlRfV0VJR0hUX1ZBTFVFUyA9IG5ldyBTZXQoWyIxMDAiLCAiMjAwIiwgIjMwMCIsICI0MDAiLCAiNTAwIiwgIjYwMCIsICI3MDAiLCAiODAwIiwgIjkwMCIsICIxMDAwIiwgIm5vcm1hbCIsICJib2xkIiwgImJvbGRlciIsICJsaWdodGVyIl0pOwogIGNvbnN0IHsKICAgIGZvbnRGYW1pbHksCiAgICBmb250V2VpZ2h0LAogICAgaXRhbGljQW5nbGUKICB9ID0gY3NzRm9udEluZm87CiAgaWYgKCF2YWxpZGF0ZUZvbnROYW1lKGZvbnRGYW1pbHksIHRydWUpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IHdlaWdodCA9IGZvbnRXZWlnaHQgPyBmb250V2VpZ2h0LnRvU3RyaW5nKCkgOiAiIjsKICBjc3NGb250SW5mby5mb250V2VpZ2h0ID0gQ1NTX0ZPTlRfV0VJR0hUX1ZBTFVFUy5oYXMod2VpZ2h0KSA/IHdlaWdodCA6IERFRkFVTFRfQ1NTX0ZPTlRfV0VJR0hUOwogIGNvbnN0IGFuZ2xlID0gcGFyc2VGbG9hdChpdGFsaWNBbmdsZSk7CiAgY3NzRm9udEluZm8uaXRhbGljQW5nbGUgPSBpc05hTihhbmdsZSkgfHwgYW5nbGUgPCAtOTAgfHwgYW5nbGUgPiA5MCA/IERFRkFVTFRfQ1NTX0ZPTlRfT0JMSVFVRSA6IGl0YWxpY0FuZ2xlLnRvU3RyaW5nKCk7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gcmVjb3ZlckpzVVJMKHN0cikgewogIGNvbnN0IFVSTF9PUEVOX01FVEhPRFMgPSBbImFwcC5sYXVuY2hVUkwiLCAid2luZG93Lm9wZW4iLCAieGZhLmhvc3QuZ290b1VSTCJdOwogIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgiXlxccyooIiArIFVSTF9PUEVOX01FVEhPRFMuam9pbigifCIpLnJlcGxhY2VBbGwoIi4iLCAiXFwuIikgKyAiKVxcKCg/Oid8XCIpKFteJ1wiXSopKD86J3xcIikoPzosXFxzKihcXHcrKVxcKXxcXCkpIiwgImkiKTsKICBjb25zdCBqc1VybCA9IHJlZ2V4LmV4ZWMoc3RyKTsKICBpZiAoanNVcmw/LlsyXSkgewogICAgcmV0dXJuIHsKICAgICAgdXJsOiBqc1VybFsyXSwKICAgICAgbmV3V2luZG93OiBqc1VybFsxXSA9PT0gImFwcC5sYXVuY2hVUkwiICYmIGpzVXJsWzNdID09PSAidHJ1ZSIKICAgIH07CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIG51bWJlclRvU3RyaW5nKHZhbHVlKSB7CiAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICB9CiAgY29uc3Qgcm91bmRlZFZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMCk7CiAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwMCA9PT0gMCkgewogICAgcmV0dXJuIChyb3VuZGVkVmFsdWUgLyAxMDApLnRvU3RyaW5nKCk7CiAgfQogIGlmIChyb3VuZGVkVmFsdWUgJSAxMCA9PT0gMCkgewogICAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMSk7CiAgfQogIHJldHVybiB2YWx1ZS50b0ZpeGVkKDIpOwp9CmZ1bmN0aW9uIGdldE5ld0Fubm90YXRpb25zTWFwKGFubm90YXRpb25TdG9yYWdlKSB7CiAgaWYgKCFhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IG5ld0Fubm90YXRpb25zQnlQYWdlID0gbmV3IE1hcCgpOwogIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBpZiAoIWtleS5zdGFydHNXaXRoKEFubm90YXRpb25FZGl0b3JQcmVmaXgpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IGFubm90YXRpb25zID0gbmV3QW5ub3RhdGlvbnNCeVBhZ2UuZ2V0KHZhbHVlLnBhZ2VJbmRleCk7CiAgICBpZiAoIWFubm90YXRpb25zKSB7CiAgICAgIGFubm90YXRpb25zID0gW107CiAgICAgIG5ld0Fubm90YXRpb25zQnlQYWdlLnNldCh2YWx1ZS5wYWdlSW5kZXgsIGFubm90YXRpb25zKTsKICAgIH0KICAgIGFubm90YXRpb25zLnB1c2godmFsdWUpOwogIH0KICByZXR1cm4gbmV3QW5ub3RhdGlvbnNCeVBhZ2Uuc2l6ZSA+IDAgPyBuZXdBbm5vdGF0aW9uc0J5UGFnZSA6IG51bGw7Cn0KZnVuY3Rpb24gc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShzdHIpIHsKICByZXR1cm4gaXNBc2NpaShzdHIpID8gc3RyIDogc3RyaW5nVG9VVEYxNlN0cmluZyhzdHIsIHRydWUpOwp9CmZ1bmN0aW9uIGlzQXNjaWkoc3RyKSB7CiAgcmV0dXJuIC9eW1x4MDAtXHg3Rl0qJC8udGVzdChzdHIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvVVRGMTZIZXhTdHJpbmcoc3RyKSB7CiAgY29uc3QgYnVmID0gW107CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGJ1Zi5wdXNoKGhleE51bWJlcnNbY2hhciA+PiA4ICYgMHhmZl0sIGhleE51bWJlcnNbY2hhciAmIDB4ZmZdKTsKICB9CiAgcmV0dXJuIGJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBzdHJpbmdUb1VURjE2U3RyaW5nKHN0ciwgYmlnRW5kaWFuID0gZmFsc2UpIHsKICBjb25zdCBidWYgPSBbXTsKICBpZiAoYmlnRW5kaWFuKSB7CiAgICBidWYucHVzaCgiXHhGRVx4RkYiKTsKICB9CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhciA+PiA4ICYgMHhmZiksIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhciAmIDB4ZmYpKTsKICB9CiAgcmV0dXJuIGJ1Zi5qb2luKCIiKTsKfQpmdW5jdGlvbiBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgd2lkdGgsIGhlaWdodCkgewogIHN3aXRjaCAocm90YXRpb24pIHsKICAgIGNhc2UgOTA6CiAgICAgIHJldHVybiBbMCwgMSwgLTEsIDAsIHdpZHRoLCAwXTsKICAgIGNhc2UgMTgwOgogICAgICByZXR1cm4gWy0xLCAwLCAwLCAtMSwgd2lkdGgsIGhlaWdodF07CiAgICBjYXNlIDI3MDoKICAgICAgcmV0dXJuIFswLCAtMSwgMSwgMCwgMCwgaGVpZ2h0XTsKICAgIGRlZmF1bHQ6CiAgICAgI
20HRocm93IG5ldyBFcnJvcigiSW52YWxpZCByb3RhdGlvbiIpOwogIH0KfQpmdW5jdGlvbiBnZXRTaXplSW5CeXRlcyh4KSB7CiAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmNlaWwoTWF0aC5sb2cyKDEgKyB4KSkgLyA4KTsKfQoKOy8vIC4vc3JjL2NvcmUvc3RyZWFtLmpzCgoKCgoKCgoKY2xhc3MgU3RyZWFtIGV4dGVuZHMgQmFzZVN0cmVhbSB7CiAgY29uc3RydWN0b3IoYXJyYXlCdWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLmJ5dGVzID0gYXJyYXlCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gYXJyYXlCdWZmZXIgOiBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQgfHwgMDsKICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDsKICAgIHRoaXMuZW5kID0gc3RhcnQgKyBsZW5ndGggfHwgdGhpcy5ieXRlcy5sZW5ndGg7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuZW5kIC0gdGhpcy5zdGFydDsKICB9CiAgZ2V0IGlzRW1wdHkoKSB7CiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDA7CiAgfQogIGdldEJ5dGUoKSB7CiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnl0ZXNbdGhpcy5wb3MrK107CiAgfQogIGdldEJ5dGVzKGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CiAgICBjb25zdCBzdHJFbmQgPSB0aGlzLmVuZDsKICAgIGlmICghbGVuZ3RoKSB7CiAgICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIHN0ckVuZCk7CiAgICB9CiAgICBsZXQgZW5kID0gcG9zICsgbGVuZ3RoOwogICAgaWYgKGVuZCA+IHN0ckVuZCkgewogICAgICBlbmQgPSBzdHJFbmQ7CiAgICB9CiAgICB0aGlzLnBvcyA9IGVuZDsKICAgIHJldHVybiBieXRlcy5zdWJhcnJheShwb3MsIGVuZCk7CiAgfQogIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBpZiAoYmVnaW4gPCAwKSB7CiAgICAgIGJlZ2luID0gMDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLmVuZCkgewogICAgICBlbmQgPSB0aGlzLmVuZDsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ5dGVzLnN1YmFycmF5KGJlZ2luLCBlbmQpOwogIH0KICByZXNldCgpIHsKICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDsKICB9CiAgbW92ZVN0YXJ0KCkgewogICAgdGhpcy5zdGFydCA9IHRoaXMucG9zOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICByZXR1cm4gbmV3IFN0cmVhbSh0aGlzLmJ5dGVzLmJ1ZmZlciwgc3RhcnQsIGxlbmd0aCwgZGljdCk7CiAgfQp9CmNsYXNzIFN0cmluZ1N0cmVhbSBleHRlbmRzIFN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyKSB7CiAgICBzdXBlcihzdHJpbmdUb0J5dGVzKHN0cikpOwogIH0KfQpjbGFzcyBOdWxsU3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKG5ldyBVaW50OEFycmF5KDApKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2NodW5rZWRfc3RyZWFtLmpzCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIENodW5rZWRTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewogIGNvbnN0cnVjdG9yKGxlbmd0aCwgY2h1bmtTaXplLCBtYW5hZ2VyKSB7CiAgICBzdXBlcihuZXcgVWludDhBcnJheShsZW5ndGgpLCAwLCBsZW5ndGgsIG51bGwpOwogICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CiAgICB0aGlzLl9sb2FkZWRDaHVua3MgPSBuZXcgU2V0KCk7CiAgICB0aGlzLm51bUNodW5rcyA9IE1hdGguY2VpbChsZW5ndGggLyBjaHVua1NpemUpOwogICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKICAgIHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmsgPSAtMTsKICB9CiAgZ2V0TWlzc2luZ0NodW5rcygpIHsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgZm9yIChsZXQgY2h1bmsgPSAwLCBuID0gdGhpcy5udW1DaHVua3M7IGNodW5rIDwgbjsgKytjaHVuaykgewogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KICBnZXQgbnVtQ2h1bmtzTG9hZGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplOwogIH0KICBnZXQgaXNEYXRhTG9hZGVkKCkgewogICAgcmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkID09PSB0aGlzLm51bUNodW5rczsKICB9CiAgb25SZWNlaXZlRGF0YShiZWdpbiwgY2h1bmspIHsKICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplOwogICAgaWYgKGJlZ2luICUgY2h1bmtTaXplICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGJlZ2luIG9mZnNldDogJHtiZWdpbn1gKTsKICAgIH0KICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2h1bmsuYnl0ZUxlbmd0aDsKICAgIGlmIChlbmQgJSBjaHVua1NpemUgIT09IDAgJiYgZW5kICE9PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBlbmQgb2Zmc2V0OiAke2VuZH1gKTsKICAgIH0KICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyBjaHVua1NpemUpOwogICAgY29uc3QgZW5kQ2h1bmsgPSBNYXRoLmZsb29yKChlbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOwogICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CiAgICAgIHRoaXMuX2xvYWRlZENodW5rcy5hZGQoY3VyQ2h1bmspOwogICAgfQogIH0KICBvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoZGF0YSkgewogICAgbGV0IHBvc2l0aW9uID0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg7CiAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihwb3NpdGlvbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGRhdGEpLCBwb3NpdGlvbik7CiAgICBwb3NpdGlvbiArPSBkYXRhLmJ5dGVMZW5ndGg7CiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IHBvc2l0aW9uOwogICAgY29uc3QgZW5kQ2h1bmsgPSBwb3NpdGlvbiA+PSB0aGlzLmVuZCA/IHRoaXMubnVtQ2h1bmtzIDogTWF0aC5mbG9vcihwb3NpdGlvbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPC
20BlbmRDaHVuazsgKytjdXJDaHVuaykgewogICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKICAgIH0KICB9CiAgZW5zdXJlQnl0ZShwb3MpIHsKICAgIGlmIChwb3MgPCB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjaHVuayA9IE1hdGguZmxvb3IocG9zIC8gdGhpcy5jaHVua1NpemUpOwogICAgaWYgKGNodW5rID4gdGhpcy5udW1DaHVua3MpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNodW5rID09PSB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKICAgICAgdGhyb3cgbmV3IE1pc3NpbmdEYXRhRXhjZXB0aW9uKHBvcywgcG9zICsgMSk7CiAgICB9CiAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gY2h1bms7CiAgfQogIGVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGlmIChiZWdpbiA+PSBlbmQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGVuZCA8PSB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGlmIChiZWdpbkNodW5rID4gdGhpcy5udW1DaHVua3MpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZW5kQ2h1bmsgPSBNYXRoLm1pbihNYXRoLmZsb29yKChlbmQgLSAxKSAvIHRoaXMuY2h1bmtTaXplKSArIDEsIHRoaXMubnVtQ2h1bmtzKTsKICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgewogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdEYXRhRXhjZXB0aW9uKGJlZ2luLCBlbmQpOwogICAgICB9CiAgICB9CiAgfQogIG5leHRFbXB0eUNodW5rKGJlZ2luQ2h1bmspIHsKICAgIGNvbnN0IG51bUNodW5rcyA9IHRoaXMubnVtQ2h1bmtzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1DaHVua3M7ICsraSkgewogICAgICBjb25zdCBjaHVuayA9IChiZWdpbkNodW5rICsgaSkgJSBudW1DaHVua3M7CiAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKICAgICAgICByZXR1cm4gY2h1bms7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBoYXNDaHVuayhjaHVuaykgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspOwogIH0KICBnZXRCeXRlKCkgewogICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CiAgICBpZiAocG9zID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmIChwb3MgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVCeXRlKHBvcyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLnBvcysrXTsKICB9CiAgZ2V0Qnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIGNvbnN0IHN0ckVuZCA9IHRoaXMuZW5kOwogICAgaWYgKCFsZW5ndGgpIHsKICAgICAgaWYgKHN0ckVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIHN0ckVuZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTsKICAgIH0KICAgIGxldCBlbmQgPSBwb3MgKyBsZW5ndGg7CiAgICBpZiAoZW5kID4gc3RyRW5kKSB7CiAgICAgIGVuZCA9IHN0ckVuZDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICB0aGlzLmVuc3VyZVJhbmdlKHBvcywgZW5kKTsKICAgIH0KICAgIHRoaXMucG9zID0gZW5kOwogICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KHBvcywgZW5kKTsKICB9CiAgZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGlmIChiZWdpbiA8IDApIHsKICAgICAgYmVnaW4gPSAwOwogICAgfQogICAgaWYgKGVuZCA+IHRoaXMuZW5kKSB7CiAgICAgIGVuZCA9IHRoaXMuZW5kOwogICAgfQogICAgaWYgKGVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlUmFuZ2UoYmVnaW4sIGVuZCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgaWYgKGxlbmd0aCkgewogICAgICBpZiAoc3RhcnQgKyBsZW5ndGggPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICAgIHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdGFydCA+PSB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICB0aGlzLmVuc3VyZUJ5dGUoc3RhcnQpOwogICAgfQogICAgZnVuY3Rpb24gQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbSgpIHt9CiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzID0gZnVuY3Rpb24gKCkgewogICAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKICAgICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IodGhpcy5zdGFydCAvIGNodW5rU2l6ZSk7CiAgICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigodGhpcy5lbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOwogICAgICBjb25zdCBtaXNzaW5nQ2h1bmtzID0gW107CiAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgewogICAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKICAgICAgICAgIG1pc3NpbmdDaHVua3MucHVzaChjaHVuayk7CiAgICAgICAgfQogICAgICB9CiAgICAgI
20HJldHVybiBtaXNzaW5nQ2h1bmtzOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSwgImlzRGF0YUxvYWRlZCIsIHsKICAgICAgZ2V0KCkgewogICAgICAgIGlmICh0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3MpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5nZXRNaXNzaW5nQ2h1bmtzKCkubGVuZ3RoID09PSAwOwogICAgICB9LAogICAgICBjb25maWd1cmFibGU6IHRydWUKICAgIH0pOwogICAgY29uc3Qgc3ViU3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKTsKICAgIHN1YlN0cmVhbS5wb3MgPSBzdWJTdHJlYW0uc3RhcnQgPSBzdGFydDsKICAgIHN1YlN0cmVhbS5lbmQgPSBzdGFydCArIGxlbmd0aCB8fCB0aGlzLmVuZDsKICAgIHN1YlN0cmVhbS5kaWN0ID0gZGljdDsKICAgIHJldHVybiBzdWJTdHJlYW07CiAgfQogIGdldEJhc2VTdHJlYW1zKCkgewogICAgcmV0dXJuIFt0aGlzXTsKICB9Cn0KY2xhc3MgQ2h1bmtlZFN0cmVhbU1hbmFnZXIgewogIGNvbnN0cnVjdG9yKHBkZk5ldHdvcmtTdHJlYW0sIGFyZ3MpIHsKICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7CiAgICB0aGlzLmNodW5rU2l6ZSA9IGFyZ3MucmFuZ2VDaHVua1NpemU7CiAgICB0aGlzLnN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtKHRoaXMubGVuZ3RoLCB0aGlzLmNodW5rU2l6ZSwgdGhpcyk7CiAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtOwogICAgdGhpcy5kaXNhYmxlQXV0b0ZldGNoID0gYXJncy5kaXNhYmxlQXV0b0ZldGNoOwogICAgdGhpcy5tc2dIYW5kbGVyID0gYXJncy5tc2dIYW5kbGVyOwogICAgdGhpcy5jdXJyUmVxdWVzdElkID0gMDsKICAgIHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdCA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuayA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0ID0gbmV3IE1hcCgpOwogICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSAwOwogICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7CiAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgfQogIHNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpIHsKICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5wZGZOZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpOwogICAgaWYgKCFyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkgewogICAgICByYW5nZVJlYWRlci5vblByb2dyZXNzID0gdGhpcy5vblByb2dyZXNzLmJpbmQodGhpcyk7CiAgICB9CiAgICBsZXQgY2h1bmtzID0gW10sCiAgICAgIGxvYWRlZCA9IDA7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICBjb25zdCByZWFkQ2h1bmsgPSAoewogICAgICAgIHZhbHVlLAogICAgICAgIGRvbmUKICAgICAgfSkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoZG9uZSkgewogICAgICAgICAgICBjb25zdCBjaHVua0RhdGEgPSBhcnJheUJ1ZmZlcnNUb0J5dGVzKGNodW5rcyk7CiAgICAgICAgICAgIGNodW5rcyA9IG51bGw7CiAgICAgICAgICAgIHJlc29sdmUoY2h1bmtEYXRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CiAgICAgICAgICBpZiAocmFuZ2VSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsKICAgICAgICAgICAgICBsb2FkZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgfSkudGhlbihkYXRhID0+IHsKICAgICAgaWYgKHRoaXMuYWJvcnRlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLm9uUmVjZWl2ZURhdGEoew
20ogICAgICAgIGNodW5rOiBkYXRhLAogICAgICAgIGJlZ2luCiAgICAgIH0pOwogICAgfSk7CiAgfQogIHJlcXVlc3RBbGxDaHVua3Mobm9GZXRjaCA9IGZhbHNlKSB7CiAgICBpZiAoIW5vRmV0Y2gpIHsKICAgICAgY29uc3QgbWlzc2luZ0NodW5rcyA9IHRoaXMuc3RyZWFtLmdldE1pc3NpbmdDaHVua3MoKTsKICAgICAgdGhpcy5fcmVxdWVzdENodW5rcyhtaXNzaW5nQ2h1bmtzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5LnByb21pc2U7CiAgfQogIF9yZXF1ZXN0Q2h1bmtzKGNodW5rcykgewogICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5jdXJyUmVxdWVzdElkKys7CiAgICBjb25zdCBjaHVua3NOZWVkZWQgPSBuZXcgU2V0KCk7CiAgICB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3Quc2V0KHJlcXVlc3RJZCwgY2h1bmtzTmVlZGVkKTsKICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CiAgICAgIGlmICghdGhpcy5zdHJlYW0uaGFzQ2h1bmsoY2h1bmspKSB7CiAgICAgICAgY2h1bmtzTmVlZGVkLmFkZChjaHVuayk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjaHVua3NOZWVkZWQuc2l6ZSA9PT0gMCkgewogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB9CiAgICBjb25zdCBjYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5zZXQocmVxdWVzdElkLCBjYXBhYmlsaXR5KTsKICAgIGNvbnN0IGNodW5rc1RvUmVxdWVzdCA9IFtdOwogICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3NOZWVkZWQpIHsKICAgICAgbGV0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGNodW5rKTsKICAgICAgaWYgKCFyZXF1ZXN0SWRzKSB7CiAgICAgICAgcmVxdWVzdElkcyA9IFtdOwogICAgICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuay5zZXQoY2h1bmssIHJlcXVlc3RJZHMpOwogICAgICAgIGNodW5rc1RvUmVxdWVzdC5wdXNoKGNodW5rKTsKICAgICAgfQogICAgICByZXF1ZXN0SWRzLnB1c2gocmVxdWVzdElkKTsKICAgIH0KICAgIGlmIChjaHVua3NUb1JlcXVlc3QubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBncm91cGVkQ2h1bmtzVG9SZXF1ZXN0ID0gdGhpcy5ncm91cENodW5rcyhjaHVua3NUb1JlcXVlc3QpOwogICAgICBmb3IgKGNvbnN0IGdyb3VwZWRDaHVuayBvZiBncm91cGVkQ2h1bmtzVG9SZXF1ZXN0KSB7CiAgICAgICAgY29uc3QgYmVnaW4gPSBncm91cGVkQ2h1bmsuYmVnaW5DaHVuayAqIHRoaXMuY2h1bmtTaXplOwogICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKGdyb3VwZWRDaHVuay5lbmRDaHVuayAqIHRoaXMuY2h1bmtTaXplLCB0aGlzLmxlbmd0aCk7CiAgICAgICAgdGhpcy5zZW5kUmVxdWVzdChiZWdpbiwgZW5kKS5jYXRjaChjYXBhYmlsaXR5LnJlamVjdCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2UuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHRoaXMuYWJvcnRlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9KTsKICB9CiAgZ2V0U3RyZWFtKCkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtOwogIH0KICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgewogICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLmxlbmd0aCk7CiAgICBjb25zdCBiZWdpbkNodW5rID0gdGhpcy5nZXRCZWdpbkNodW5rKGJlZ2luKTsKICAgIGNvbnN0IGVuZENodW5rID0gdGhpcy5nZXRFbmRDaHVuayhlbmQpOwogICAgY29uc3QgY2h1bmtzID0gW107CiAgICBmb3IgKGxldCBjaHVuayA9IGJlZ2luQ2h1bms7IGNodW5rIDwgZW5kQ2h1bms7ICsrY2h1bmspIHsKICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgfQogICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RDaHVua3MoY2h1bmtzKTsKICB9CiAgcmVxdW
20VzdFJhbmdlcyhyYW5nZXMgPSBbXSkgewogICAgY29uc3QgY2h1bmtzVG9SZXF1ZXN0ID0gW107CiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykgewogICAgICBjb25zdCBiZWdpbkNodW5rID0gdGhpcy5nZXRCZWdpbkNodW5rKHJhbmdlLmJlZ2luKTsKICAgICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKHJhbmdlLmVuZCk7CiAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgewogICAgICAgIGlmICghY2h1bmtzVG9SZXF1ZXN0LmluY2x1ZGVzKGNodW5rKSkgewogICAgICAgICAgY2h1bmtzVG9SZXF1ZXN0LnB1c2goY2h1bmspOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY2h1bmtzVG9SZXF1ZXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgLSBiOwogICAgfSk7CiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3NUb1JlcXVlc3QpOwogIH0KICBncm91cENodW5rcyhjaHVua3MpIHsKICAgIGNvbnN0IGdyb3VwZWRDaHVua3MgPSBbXTsKICAgIGxldCBiZWdpbkNodW5rID0gLTE7CiAgICBsZXQgcHJldkNodW5rID0gLTE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tpXTsKICAgICAgaWYgKGJlZ2luQ2h1bmsgPCAwKSB7CiAgICAgICAgYmVnaW5DaHVuayA9IGNodW5rOwogICAgICB9CiAgICAgIGlmIChwcmV2Q2h1bmsgPj0gMCAmJiBwcmV2Q2h1bmsgKyAxICE9PSBjaHVuaykgewogICAgICAgIGdyb3VwZWRDaHVua3MucHVzaCh7CiAgICAgICAgICBiZWdpbkNodW5rLAogICAgICAgICAgZW5kQ2h1bms6IHByZXZDaHVuayArIDEKICAgICAgICB9KTsKICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CiAgICAgIH0KICAgICAgaWYgKGkgKyAxID09PSBjaHVua3MubGVuZ3RoKSB7CiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsKICAgICAgICAgIGJlZ2luQ2h1bmssCiAgICAgICAgICBlbmRDaHVuazogY2h1bmsgKyAxCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcHJldkNodW5rID0gY2h1bms7CiAgICB9CiAgICByZXR1cm4gZ3JvdXBlZENodW5rczsKICB9CiAgb25Qcm9ncmVzcyhhcmdzKSB7CiAgICB0aGlzLm1zZ0hhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CiAgICAgIGxvYWRlZDogdGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkICogdGhpcy5jaHVua1NpemUgKyBhcmdzLmxvYWRlZCwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25SZWNlaXZlRGF0YShhcmdzKSB7CiAgICBjb25zdCBjaHVuayA9IGFyZ3MuY2h1bms7CiAgICBjb25zdCBpc1Byb2dyZXNzaXZlID0gYXJncy5iZWdpbiA9PT0gdW5kZWZpbmVkOwogICAgY29uc3QgYmVnaW4gPSBpc1Byb2dyZXNzaXZlID8gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggOiBhcmdzLmJlZ2luOwogICAgY29uc3QgZW5kID0gYmVnaW4gKyBjaHVuay5ieXRlTGVuZ3RoOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBjb25zdCBlbmRDaHVuayA9IGVuZCA8IHRoaXMubGVuZ3RoID8gTWF0aC5mbG9vcihlbmQgLyB0aGlzLmNodW5rU2l6ZSkgOiBNYXRoLmNlaWwoZW5kIC8gdGhpcy5jaHVua1NpemUpOwogICAgaWYgKGlzUHJvZ3Jlc3NpdmUpIHsKICAgICAgdGhpcy5zdHJlYW0ub25SZWNlaXZlUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTsKICAgICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSBlbmQ7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVEYXRhKGJlZ2luLCBjaHVuayk7CiAgICB9CiAgICBpZiAodGhpcy5zdHJlYW0uaXNEYXRhTG9hZGVkKSB7CiAgICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVzb2x2ZSh0aGlzLnN0cmVhbSk7CiAgICB9CiAgICBjb25zdCBsb2FkZWRSZXF1ZXN0cyA9IFtdOwogICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CiAgICAgIGNvbnN0IHJlcXVlc3RJZHMgPSB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZ2V0KGN1ckNodW5rKTsKICAgICAgaWYgKCFyZXF1ZXN0SWRzKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLmRlbGV0ZShjdXJDaHVuayk7CiAgICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIHJlcXVlc3RJZHMpIHsKICAgICAgICBjb25zdCBjaHVua3NOZWVkZWQgPSB0aGlzLl9jaHVua3NOZWVkZWRCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5oYXMoY3VyQ2h1bmspKSB7CiAgICAgICAgICBjaHVua3NOZWVkZWQuZGVsZXRlKGN1ckNodW5rKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNodW5rc05lZWRlZC5zaXplID4gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxvYWRlZFJlcXVlc3RzLnB1c2gocmVxdWVzdElkKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLmRpc2FibGVBdXRvRmV0Y2ggJiYgdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNpemUgPT09IDApIHsKICAgICAgbGV0IG5leHRFbXB0eUNodW5rOwogICAgICBpZiAodGhpcy5zdHJlYW0ubnVtQ2h1bmtzTG9hZGVkID09PSAxKSB7CiAgICAgICAgY29uc3QgbGFzdENodW5rID0gdGhpcy5zdHJlYW0ubnVtQ2h1bmtzIC0gMTsKICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmhhc0NodW5rKGxhc3RDaHVuaykpIHsKICAgICAgICAgIG5leHRFbXB0eUNodW5rID0gbGFzdENodW5rOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBuZXh0RW1wdHlDaHVuayA9IHRoaXMuc3RyZWFtLm5leHRFbXB0eUNodW5rKGVuZENodW5rKTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihuZXh0RW1wdHlDaHVuaykpIHsKICAgICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKFtuZXh0RW1wdHlDaHVua10pOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlcXVlc3RJZCBvZiBsb2FkZWRSZXF1ZXN0cykgewogICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGh
20pcy5fcHJvbWlzZXNCeVJlcXVlc3QuZ2V0KHJlcXVlc3RJZCk7CiAgICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LmRlbGV0ZShyZXF1ZXN0SWQpOwogICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTsKICAgIH0KICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSwKICAgICAgdG90YWw6IHRoaXMubGVuZ3RoCiAgICB9KTsKICB9CiAgb25FcnJvcihlcnIpIHsKICAgIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucmVqZWN0KGVycik7CiAgfQogIGdldEJlZ2luQ2h1bmsoYmVnaW4pIHsKICAgIHJldHVybiBNYXRoLmZsb29yKGJlZ2luIC8gdGhpcy5jaHVua1NpemUpOwogIH0KICBnZXRFbmRDaHVuayhlbmQpIHsKICAgIHJldHVybiBNYXRoLmZsb29yKChlbmQgLSAxKSAvIHRoaXMuY2h1bmtTaXplKSArIDE7CiAgfQogIGFib3J0KHJlYXNvbikgewogICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTsKICAgIHRoaXMucGRmTmV0d29ya1N0cmVhbT8uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTsKICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgewogICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOwogICAgfQogIH0KfQoKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcwp2YXIgZXNuZXh0X2l0ZXJhdG9yX2ZpbHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oNDUyMCk7Ci8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5mbGFncy5qcwp2YXIgZXNfcmVnZXhwX2ZsYWdzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5NDc5KTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbmQuanMKdmFyIGVzbmV4dF9pdGVyYXRvcl9maW5kID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNTc3KTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLnJlZHVjZS5qcwp2YXIgZXNuZXh0X2l0ZXJhdG9yX3JlZHVjZSA9IF9fd2VicGFja19yZXF1aXJlX18oODg3Mik7CjsvLyAuL3NyYy9jb3JlL2NvbG9yc3BhY2UuanMKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKICBjb25zdCBDT01QT05FTlRTID0gMzsKICBhbHBoYTAxID0gYWxwaGEwMSAhPT0gMSA/IDAgOiBhbHBoYTAxOwogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pICogQ09NUE9ORU5UUzsKICB9CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICBjb25zdCBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBuZXdJbmRleCArPSBhbHBoYTAxOwogICAgfQogIH0KfQpmdW5jdGlvbiByZXNpemVSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCB3MSwgaDEsIHcyLCBoMiwgYWxwaGEwMSkgewogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwOwogIGNvbnN0IHhTY2FsZWQgPSBuZXcgVWludDE2QXJyYXkodzIpOwogIGlmIChhbHBoYTAxID09PSAxKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbyk7CiAgICB9CiAgICBjb25zdCBzcmMzMiA9IG5ldyBVaW50MzJBcnJheShzcmMuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgICBjb25zdCByZ2JNYXNrID0gRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweDAwZmZmZmZmIDogMHhmZmZmZmYwMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaDI7IGkrKykgewogICAgICBjb25zdCBidWYgPSBzcmMzMi5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzEpOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHcyOyBqKyspIHsKICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gfD0gYnVmW3hTY2FsZWRbal1dICYgcmdiTWFzazsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAgICBjb25zdCBDT01QT05FTlRTID0gNDsKICAgIGNvbnN0IHcxU2NhbmxpbmUgPSB3MSAqIENPTVBPTkVOVFM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgICAgeFNjYWxlZFtpXSA9IE1hdGguZmxvb3IoaSAqIHhSYXRpbykgKiBDT01QT05FTlRTOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICAgIGNvbnN0IGJ1ZiA9IHNyYy5zdWJhcnJheShNYXRoLmZsb29yKGkgKiB5UmF0aW8pICogdzFTY2FubGluZSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdzI7IGorKykgewogICAgICAgIGNvbnN0IG9sZEluZGV4ID0geFNjYWxlZFtqXTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4XTsKICAgICAgICBkZXN0W25ld0luZGV4KytdID0gYnVmW29sZEluZGV4ICsgMV07CiAgICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IGJ1ZltvbGRJbmRleCArIDJdOwogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGNvcHlSZ2JhSW1hZ2Uoc3JjLCBkZXN0LCBhbHBoYTAxKSB7CiAgaWYgKGFscGhhMDEgPT09IDEpIHsKICAgIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF
205KHNyYy5idWZmZXIpOwogICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTsKICAgIGNvbnN0IHJnYk1hc2sgPSBGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4MDBmZmZmZmYgOiAweGZmZmZmZjAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0MzJbaV0gfD0gc3JjMzJbaV0gJiByZ2JNYXNrOwogICAgfQogIH0gZWxzZSB7CiAgICBsZXQgaiA9IDA7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkgewogICAgICBkZXN0W2orK10gPSBzcmNbaV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMV07CiAgICAgIGRlc3RbaisrXSA9IHNyY1tpICsgMl07CiAgICB9CiAgfQp9CmNsYXNzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKG5hbWUsIG51bUNvbXBzKSB7CiAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgdGhpcy5udW1Db21wcyA9IG51bUNvbXBzOwogIH0KICBnZXRSZ2Ioc3JjLCBzcmNPZmZzZXQpIHsKICAgIGNvbnN0IHJnYiA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICAgIHRoaXMuZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgcmdiLCAwKTsKICAgIHJldHVybiByZ2I7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIik7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICB1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoIik7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpc0RlZmF1bHREZWNvZGUoZGVjb2RlTWFwLCBicGMpIHsKICAgIHJldHVybiBDb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIHRoaXMubnVtQ29tcHMpOwogIH0KICBmaWxsUmdiKGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGJwYywgY29tcHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWxXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0OwogICAgbGV0IHJnYkJ1ZiA9IG51bGw7CiAgICBjb25zdCBudW1Db21wb25lbnRDb2xvcnMgPSAxIDw8IGJwYzsKICAgIGNvbnN0IG5lZWRzUmVzaXppbmcgPSBvcmlnaW5hbEhlaWdodCAhPT0gaGVpZ2h0IHx8IG9yaWdpbmFsV2lkdGggIT09IHdpZHRoOwogICAgaWYgKHRoaXMuaXNQYXNzdGhyb3VnaChicGMpKSB7CiAgICAgIHJnYkJ1ZiA9IGNvbXBzOwogICAgfSBlbHNlIGlmICh0aGlzLm51bUNvbXBzID09PSAxICYmIGNvdW50ID4gbnVtQ29tcG9uZW50Q29sb3JzICYmIHRoaXMubmFtZSAhPT0gIkRldmljZUdyYXkiICYmIHRoaXMubmFtZSAhPT0gIkRldmljZVJHQiIpIHsKICAgICAgY29uc3QgYWxsQ29sb3JzID0gYnBjIDw9IDggPyBuZXcgVWludDhBcnJheShudW1Db21wb25lbnRDb2xvcnMpIDogbmV3IFVpbnQxNkFycmF
205KG51bUNvbXBvbmVudENvbG9ycyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50Q29sb3JzOyBpKyspIHsKICAgICAgICBhbGxDb2xvcnNbaV0gPSBpOwogICAgICB9CiAgICAgIGNvbnN0IGNvbG9yTWFwID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG51bUNvbXBvbmVudENvbG9ycyAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihhbGxDb2xvcnMsIDAsIG51bUNvbXBvbmVudENvbG9ycywgY29sb3JNYXAsIDAsIGJwYywgMCk7CiAgICAgIGlmICghbmVlZHNSZXNpemluZykgewogICAgICAgIGxldCBkZXN0UG9zID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgIGNvbnN0IGtleSA9IGNvbXBzW2ldICogMzsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDJdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZ2JCdWYgPSBuZXcgVWludDhBcnJheShjb3VudCAqIDMpOwogICAgICAgIGxldCByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3Qga2V5ID0gY29tcHNbaV0gKiAzOwogICAgICAgICAgcmdiQnVmW3JnYlBvcysrXSA9IGNvbG9yTWFwW2tleV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMV07CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5ICsgMl07CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CiAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGNvbXBzLCAwLCB3aWR0aCAqIGFjdHVhbEhlaWdodCwgZGVzdCwgMCwgYnBjLCBhbHBoYTAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShjb3VudCAqIDMpOwogICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAwKTsKICAgIH0KICAgIGlmIChyZ2JCdWYpIHsKICAgICAgaWYgKG5lZWRzUmVzaXppbmcpIHsKICAgICAgICByZXNpemVSZ2JJbWFnZShyZ2JCdWYsIGRlc3QsIG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBhbHBoYTAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGVzdFBvcyA9IDAsCiAgICAgICAgICByZ2JQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7IGkrKykgewogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOwogICAgICAgICAgZGVzdFBvcyArPSBhbHBoYTAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBnZXQgdXNlc1plcm9Ub09uZVJhbmdlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlc1plcm9Ub09uZVJhbmdlIiwgdHJ1ZSk7CiAgfQogIHN0YXRpYyBfY2FjaGUoY2FjaGVLZXksIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKSB7CiAgICBpZiAoIWxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAibG9jYWxDb2xvclNwYWNlQ2FjaGUiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKCFwYXJzZWRDb2xvclNwYWNlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5fY2FjaGUgLSBleHBlY3RlZCAicGFyc2VkQ29sb3JTcGFjZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBsZXQgY3NOYW1lLCBjc1JlZjsKICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIFJlZikgewogICAgICBjc1JlZiA9IGNhY2hlS2V5OwogICAgICBjYWNoZUtleSA9IHhyZWYuZmV0Y2goY2FjaGVLZXkpOwogICAgfQogICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjc05hbWUgPSBjYWNoZUtleS5uYW1lOwogICAgfQogICAgaWYgKGNzTmFtZSB8fCBjc1JlZikgewogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZS5zZXQoY3NOYW1lLCBjc1JlZiwgcGFyc2VkQ29sb3JTcGFjZSk7CiAgICB9CiAgfQogIHN0YXRpYyBnZXRDYWNoZWQoY2FjaGVLZXksIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBpZiAoIWxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sb3JTcGFjZS5nZXRDYWNoZWQgLSBleHBlY3RlZCAibG9jYWxDb2xvclNwYWNlQ2FjaGUiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIGNvbnN0IGxvY2FsQ29sb3JTcGFjZSA9IGxvY2FsQ29sb3JTcGFjZUNhY2hlLmdldEJ5UmVmKGNhY2hlS2V5KTsKICAgICAgaWYgKGxvY2FsQ29sb3JTcGFjZSkgewogICAgICAgIHJldHVybiBsb2NhbENvbG9yU3BhY2U7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjYWNoZUtleSA9IHhyZWYuZmV0Y2goY2FjaGVLZXkpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgICB0aHJvdyBleDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgY29uc3QgbG9jYWxDb2xvclNwYWNlID0gbG9jYWxDb2xvclNwYWNlQ2FjaGUuZ2V0QnlOYW1lKGNhY2hlS2V5Lm5hbWUpOwogICAgICBpZiAobG9jYWxDb2xvclNwYWNlKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsQ29sb3JTcGFjZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHN0YXRpYyBhc3luYyBwYXJzZUFzeW5jKHsKICAgIGNzLAogICAgeHJlZiwKICAgIHJlc291cmNlcyA9IG51bGwsCiAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IHBhcnNlZENvbG9yU3BhY2UgPSB0aGlzLl9wYXJzZShjcywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTsKICAgIHJldHVybi
20BwYXJzZWRDb2xvclNwYWNlOwogIH0KICBzdGF0aWMgcGFyc2UoewogICAgY3MsCiAgICB4cmVmLAogICAgcmVzb3VyY2VzID0gbnVsbCwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgfSkgewogICAgY29uc3QgY2FjaGVkQ29sb3JTcGFjZSA9IHRoaXMuZ2V0Q2FjaGVkKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkgewogICAgICByZXR1cm4gY2FjaGVkQ29sb3JTcGFjZTsKICAgIH0KICAgIGNvbnN0IHBhcnNlZENvbG9yU3BhY2UgPSB0aGlzLl9wYXJzZShjcywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogICAgdGhpcy5fY2FjaGUoY3MsIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBwYXJzZWRDb2xvclNwYWNlKTsKICAgIHJldHVybiBwYXJzZWRDb2xvclNwYWNlOwogIH0KICBzdGF0aWMgX3BhcnNlKGNzLCB4cmVmLCByZXNvdXJjZXMgPSBudWxsLCBwZGZGdW5jdGlvbkZhY3RvcnkpIHsKICAgIGNzID0geHJlZi5mZXRjaElmUmVmKGNzKTsKICAgIGlmIChjcyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgc3dpdGNoIChjcy5uYW1lKSB7CiAgICAgICAgY2FzZSAiRyI6CiAgICAgICAgY2FzZSAiRGV2aWNlR3JheSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CiAgICAgICAgY2FzZSAiUkdCIjoKICAgICAgICBjYXNlICJEZXZpY2VSR0IiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5yZ2I7CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCQSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYmE7CiAgICAgICAgY2FzZSAiQ01ZSyI6CiAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7CiAgICAgICAgY2FzZSAiUGF0dGVybiI6CiAgICAgICAgICByZXR1cm4gbmV3IFBhdHRlcm5DUyhudWxsKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgY29sb3JTcGFjZXMgPSByZXNvdXJjZXMuZ2V0KCJDb2xvclNwYWNlIik7CiAgICAgICAgICAgIGlmIChjb2xvclNwYWNlcyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZXNDUyA9IGNvbG9yU3BhY2VzLmdldChjcy5uYW1lKTsKICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzQ1MpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDUyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKHJlc291cmNlc0NTLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjcyA9IHJlc291cmNlc0NTOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB3YXJuKGBVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogJHtjcy5uYW1lfWApOwogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OwogICAgICB9CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShjcykpIHsKICAgICAgY29uc3QgbW9kZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1swXSkubmFtZTsKICAgICAgbGV0IHBhcmFtcywgbnVtQ29tcHMsIGJhc2VDUywgd2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWE7CiAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgIGNhc2UgIkciOgogICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OwogICAgICAgIGNhc2UgIlJHQiI6CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiOwogICAgICAgIGNhc2UgIkNNWUsiOgogICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOwogICAgICAgIGNhc2UgIkNhbEdyYXkiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldCgiR2FtbWEiKTsKICAgICAgICAgIHJldHVybiBuZXcgQ2FsR3JheUNTKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKTsKICAgICAgICBjYXNlICJDYWxSR0IiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldEFycmF5KCJHYW1tYSIpOwogICAgICAgICAgY29uc3QgbWF0cml4ID0gcGFyYW1zLmdldEFycmF5KCJNYXRyaXgiKTsKICAgICAgICAgIHJldHVybiBuZXcgQ2FsUkdCQ1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEsIG1hdHJpeCk7CiAgICAgICAgY2FzZSAiSUNDQmFzZWQiOgogICAgICAgICAgY29uc3Qgc3RyZWFtID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIGNvbnN0IGRpY3QgPSBzdHJlYW0uZGljdDsKICAgICAgICAgIG51bUNvbXBzID0gZGljdC5nZXQoIk4iKTsKICAgICAgICAgIGNvbnN0IGFsdCA9IGRpY3QuZ2V0KCJBbHRlcm5hdGUiKTsKICAgICAgICAgIGlmIChhbHQpIHsKICAgICAgICAgICAgY29uc3QgYWx0Q1MgPSB0aGlzLl9wYXJzZShhbHQsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICAgICAgICAgICAgaWYgKGFsdENTLm51bUNvbXBzID09PSBudW1Db21wcykgewogICAgICAgICAgICAgIHJldHVybiBhbHRDUzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3YXJuKCJJQ0NCYXNlZCBjb2xvciBzcGFjZTogSWdub3JpbmcgaW5jb3JyZWN0IC9BbHRlcm5hdGUgZW50cnkuIik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobnVtQ29tcHMgPT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OwogICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gMykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLnJnYjsKICAgICAgICAgI
20H0gZWxzZSBpZiAobnVtQ29tcHMgPT09IDQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUGF0dGVybiI6CiAgICAgICAgICBiYXNlQ1MgPSBjc1sxXSB8fCBudWxsOwogICAgICAgICAgaWYgKGJhc2VDUykgewogICAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShiYXNlQ1MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcgUGF0dGVybkNTKGJhc2VDUyk7CiAgICAgICAgY2FzZSAiSSI6CiAgICAgICAgY2FzZSAiSW5kZXhlZCI6CiAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShjc1sxXSwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogICAgICAgICAgY29uc3QgaGlWYWwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4cmVmLmZldGNoSWZSZWYoY3NbMl0pLCAyNTUpKTsKICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IHhyZWYuZmV0Y2hJZlJlZihjc1szXSk7CiAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRDUyhiYXNlQ1MsIGhpVmFsLCBsb29rdXApOwogICAgICAgIGNhc2UgIlNlcGFyYXRpb24iOgogICAgICAgIGNhc2UgIkRldmljZU4iOgogICAgICAgICAgY29uc3QgbmFtZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CiAgICAgICAgICBudW1Db21wcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lLmxlbmd0aCA6IDE7CiAgICAgICAgICBiYXNlQ1MgPSB0aGlzLl9wYXJzZShjc1syXSwgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogICAgICAgICAgY29uc3QgdGludEZuID0gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZShjc1szXSk7CiAgICAgICAgICByZXR1cm4gbmV3IEFsdGVybmF0ZUNTKG51bUNvbXBzLCBiYXNlQ1MsIHRpbnRGbik7CiAgICAgICAgY2FzZSAiTGFiIjoKICAgICAgICAgIHBhcmFtcyA9IHhyZWYuZmV0Y2hJZlJlZihjc1sxXSk7CiAgICAgICAgICB3aGl0ZVBvaW50ID0gcGFyYW1zLmdldEFycmF5KCJXaGl0ZVBvaW50Iik7CiAgICAgICAgICBibGFja1BvaW50ID0gcGFyYW1zLmdldEFycmF5KCJCbGFja1BvaW50Iik7CiAgICAgICAgICBjb25zdCByYW5nZSA9IHBhcmFtcy5nZXRBcnJheSgiUmFuZ2UiKTsKICAgICAgICAgIHJldHVybiBuZXcgTGFiQ1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgcmFuZ2UpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB3YXJuKGBVbmltcGxlbWVudGVkIENvbG9yU3BhY2Ugb2JqZWN0OiAke21vZGV9YCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CiAgICAgIH0KICAgIH0KICAgIHdhcm4oYFVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogJHtjc31gKTsKICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMuZ3JheTsKICB9CiAgc3RhdGljIGlzRGVmYXVsdERlY29kZShkZWNvZGUsIG51bUNvbXBzKSB7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjb2RlKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChudW1Db21wcyAqIDIgIT09IGRlY29kZS5sZW5ndGgpIHsKICAgICAgd2FybigiVGhlIGRlY29kZSBtYXAgaXMgbm90IHRoZSBjb3JyZWN0IGxlbmd0aCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRlY29kZS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgIGlmIChkZWNvZGVbaV0gIT09IDAgfHwgZGVjb2RlW2kgKyAxXSAhPT0gMSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHN0YXRpYyBnZXQgc2luZ2xldG9ucygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInNpbmdsZXRvbnMiLCB7CiAgICAgIGdldCBncmF5KCkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgImdyYXkiLCBuZXcgRGV2aWNlR3JheUNTKCkpOwogICAgICB9LAogICAgICBnZXQgcmdiKCkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgInJnYiIsIG5ldyBEZXZpY2VSZ2JDUygpKTsKICAgICAgfSwKICAgICAgZ2V0IHJnYmEoKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmdiYSIsIG5ldyBEZXZpY2VSZ2JhQ1MoKSk7CiAgICAgIH0sCiAgICAgIGdldCBjbXlrKCkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNteWsiLCBuZXcgRGV2aWNlQ215a0NTKCkpOwogICAgICB9CiAgICB9KTsKICB9Cn0KY2xhc3MgQWx0ZXJuYXRlQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcihudW1Db21wcywgYmFzZSwgdGludEZuKSB7CiAgICBzdXBlcigiQWx0ZXJuYXRlIiwgbnVtQ29tcHMpOwogICAgdGhpcy5iYXNlID0gYmFzZTsKICAgIHRoaXMudGludEZuID0gdGludEZuOwogICAgdGhpcy50bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2UubnVtQ29tcHMpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCB0bXBCdWYgPSB0aGlzLnRtcEJ1ZjsKICAgIHRoaXMudGludEZuKHNyYywgc3JjT2Zmc2V0LCB0bXBCdWYsIDApOwogICAgdGhpcy5iYXNlLmdldFJnYkl0ZW0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3QgdGludEZuID0gdGhpcy50aW50Rm47CiAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlOwogICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBjb25zdCBiYXNlTnVtQ29tcHMgPSBiYXNlLm51bUNvbXBzOwogICAgY29uc3QgdXNlc1plcm9Ub09uZVJhbmdlID0gYmFzZS51c2VzWmVyb1RvT25lUmFuZ2U7CiAgICBjb25zdCBpc1Bhc3N0aHJvdWdoID0gKGJhc2UuaXNQYXNzdGhyb3VnaCg4KSB8fCAhdXNlc1plcm9Ub09uZVJhbmdlKSAmJiBhbHBoYTAxID09PSAwOwogICAgbGV0IHBvcyA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0T2Zmc2V0IDogMDsKICAgIGNvbnN0IGJhc2VCdWYgPSBpc1Bhc3N0aHJvdWdoID8gZGVzdCA6IG5ldyBVaW50OENsYW1wZWRBcnJheShiYXNlTnVtQ29tcHMgKiBjb3VudCk7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CiAgICBjb25zdCBzY2FsZWQgPSBuZXcgRmxvYXQzMkFycmF
205KG51bUNvbXBzKTsKICAgIGNvbnN0IHRpbnRlZCA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZU51bUNvbXBzKTsKICAgIGxldCBpLCBqOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IG51bUNvbXBzOyBqKyspIHsKICAgICAgICBzY2FsZWRbal0gPSBzcmNbc3JjT2Zmc2V0KytdICogc2NhbGU7CiAgICAgIH0KICAgICAgdGludEZuKHNjYWxlZCwgMCwgdGludGVkLCAwKTsKICAgICAgaWYgKHVzZXNaZXJvVG9PbmVSYW5nZSkgewogICAgICAgIGZvciAoaiA9IDA7IGogPCBiYXNlTnVtQ29tcHM7IGorKykgewogICAgICAgICAgYmFzZUJ1Zltwb3MrK10gPSB0aW50ZWRbal0gKiAyNTU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGJhc2UuZ2V0UmdiSXRlbSh0aW50ZWQsIDAsIGJhc2VCdWYsIHBvcyk7CiAgICAgICAgcG9zICs9IGJhc2VOdW1Db21wczsKICAgICAgfQogICAgfQogICAgaWYgKCFpc1Bhc3N0aHJvdWdoKSB7CiAgICAgIGJhc2UuZ2V0UmdiQnVmZmVyKGJhc2VCdWYsIDAsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCBhbHBoYTAxKTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcyAvIHRoaXMubnVtQ29tcHMsIGFscGhhMDEpOwogIH0KfQpjbGFzcyBQYXR0ZXJuQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcihiYXNlQ1MpIHsKICAgIHN1cGVyKCJQYXR0ZXJuIiwgbnVsbCk7CiAgICB0aGlzLmJhc2UgPSBiYXNlQ1M7CiAgfQogIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgewogICAgdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY2FsbCBQYXR0ZXJuQ1MuaXNEZWZhdWx0RGVjb2RlIik7CiAgfQp9CmNsYXNzIEluZGV4ZWRDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKGJhc2UsIGhpZ2hWYWwsIGxvb2t1cCkgewogICAgc3VwZXIoIkluZGV4ZWQiLCAxKTsKICAgIHRoaXMuYmFzZSA9IGJhc2U7CiAgICBjb25zdCBsZW5ndGggPSBiYXNlLm51bUNvbXBzICogKGhpZ2hWYWwgKyAxKTsKICAgIHRoaXMubG9va3VwID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICAgIGlmIChsb29rdXAgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGNvbnN0IGJ5dGVzID0gbG9va3VwLmdldEJ5dGVzKGxlbmd0aCk7CiAgICAgIHRoaXMubG9va3VwLnNldChieXRlcyk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb29rdXAgPT09ICJzdHJpbmciKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICB0aGlzLmxvb2t1cFtpXSA9IGxvb2t1cC5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbmRleGVkQ1MgLSB1bnJlY29nbml6ZWQgbG9va3VwIHRhYmxlOiAke2xvb2t1cH1gKTsKICAgIH0KICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLmJhc2UubnVtQ29tcHM7CiAgICBjb25zdCBzdGFydCA9IHNyY1tzcmNPZmZzZXRdICogbnVtQ29tcHM7CiAgICB0aGlzLmJhc2UuZ2V0UmdiQnVmZmVyKHRoaXMubG9va3VwLCBzdGFydCwgMSwgZGVzdCwgZGVzdE9mZnNldCwgOCwgMCk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2U7CiAgICBjb25zdCBudW1Db21wcyA9IGJhc2UubnVtQ29tcHM7CiAgICBjb25zdCBvdXRwdXREZWx0YSA9IGJhc2UuZ2V0T3V0cHV0TGVuZ3RoKG51bUNvbXBzLCBhbHBoYTAxKTsKICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIGNvbnN0IGxvb2t1cFBvcyA9IHNyY1tzcmNPZmZzZXQrK10gKiBudW1Db21wczsKICAgICAgYmFzZS5nZXRSZ2JCdWZmZXIobG9va3VwLCBsb29rdXBQb3MsIDEsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIGFscGhhMDEpOwogICAgICBkZXN0T2Zmc2V0ICs9IG91dHB1dERlbHRhOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoICogdGhpcy5iYXNlLm51bUNvbXBzLCBhbHBoYTAxKTsKICB9CiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjb2RlTWFwKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChkZWNvZGVNYXAubGVuZ3RoICE9PSAyKSB7CiAgICAgIHdhcm4oIkRlY29kZSBtYXAgbGVuZ3RoIGlzIG5vdCBjb3JyZWN0Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJwYykgfHwgYnBjIDwgMSkgewogICAgICB3YXJuKCJCaXRzIHBlciBjb21wb25lbnQgaXMgbm90IGNvcnJlY3QiKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZGVjb2RlTWFwWzBdID09PSAwICYmIGRlY29kZU1hcFsxXSA9PT0gKDEgPDwgYnBjKSAtIDE7CiAgfQp9CmNsYXNzIERldmljZUdyYXlDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZUdyYXkiLCAxKTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgY29uc3QgYyA9IHNyY1tzcmNPZmZzZXRdICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IGRlc3RbZGVzdE9mZnNldCArIDFdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBjOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PC
20BiaXRzKSAtIDEpOwogICAgbGV0IGogPSBzcmNPZmZzZXQsCiAgICAgIHEgPSBkZXN0T2Zmc2V0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIGNvbnN0IGMgPSBzY2FsZSAqIHNyY1tqKytdOwogICAgICBkZXN0W3ErK10gPSBjOwogICAgICBkZXN0W3ErK10gPSBjOwogICAgICBkZXN0W3ErK10gPSBjOwogICAgICBxICs9IGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKICB9Cn0KY2xhc3MgRGV2aWNlUmdiQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJEZXZpY2VSR0IiLCAzKTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNyY1tzcmNPZmZzZXRdICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBzcmNbc3JjT2Zmc2V0ICsgMV0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHNyY1tzcmNPZmZzZXQgKyAyXSAqIDI1NTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgaWYgKGJpdHMgPT09IDggJiYgYWxwaGEwMSA9PT0gMCkgewogICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjb3VudCAqIDMpLCBkZXN0T2Zmc2V0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc2NhbGUgPSAyNTUgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGxldCBqID0gc3JjT2Zmc2V0LAogICAgICBxID0gZGVzdE9mZnNldDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdOwogICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdOwogICAgICBkZXN0W3ErK10gPSBzY2FsZSAqIHNyY1tqKytdOwogICAgICBxICs9IGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOwogIH0KICBpc1Bhc3N0aHJvdWdoKGJpdHMpIHsKICAgIHJldHVybiBiaXRzID09PSA4OwogIH0KfQpjbGFzcyBEZXZpY2VSZ2JhQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHN1cGVyKCJEZXZpY2VSR0JBIiwgNCk7CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgX2FscGhhMDEpIHsKICAgIHJldHVybiBpbnB1dExlbmd0aCAqIDQ7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGJpdHMgPT09IDg7CiAgfQogIGZpbGxSZ2IoZGVzdCwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIGFjdHVhbEhlaWdodCwgYnBjLCBjb21wcywgYWxwaGEwMSkgewogICAgaWYgKG9yaWdpbmFsSGVpZ2h0ICE9PSBoZWlnaHQgfHwgb3JpZ2luYWxXaWR0aCAhPT0gd2lkdGgpIHsKICAgICAgcmVzaXplUmdiYUltYWdlKGNvbXBzLCBkZXN0LCBvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCwgd2lkdGgsIGhlaWdodCwgYWxwaGEwMSk7CiAgICB9IGVsc2UgewogICAgICBjb3B5UmdiYUltYWdlKGNvbXBzLCBkZXN0LCBhbHBoYTAxKTsKICAgIH0KICB9Cn0KY2xhc3MgRGV2aWNlQ215a0NTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigiRGV2aWNlQ01ZSyIsIDQpOwogIH0KICAjdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIHNyY1NjYWxlLCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBjID0gc3JjW3NyY09mZnNldF0gKiBzcmNTY2FsZTsKICAgIGNvbnN0IG0gPSBzcmNbc3JjT2Zmc2V0ICsgMV0gKiBzcmNTY2FsZTsKICAgIGNvbnN0IHkgPSBzcmNbc3JjT2Zmc2V0ICsgMl0gKiBzcmNTY2FsZTsKICAgIGNvbnN0IGsgPSBzcmNbc3JjT2Zmc2V0ICsgM10gKiBzcmNTY2FsZTsKICAgIGRlc3RbZGVzdE9mZnNldF0gPSAyNTUgKyBjICogKC00LjM4NzMzMjM4NDYwOTk4OCAqIGMgKyA1NC40ODYxNTE5NDE4OTE3NiAqIG0gKyAxOC44MjI5MDUwMjE2NTMwMiAqIHkgKyAyMTIuMjU2NjI0NTE2Mzk1ODUgKiBrICsgLTI4NS4yMzMxMDI2MTM3MDA0KSArIG0gKiAoMS43MTQ5NzYzNDc3MzYyMTM0ICogbSAtIDUuNjA5NjczNjkwNDA0NzMxNSAqIHkgKyAtMTcuODczODcwODYxNDE1NDQ0ICogayAtIDUuNDk3MDA2NDI3MTk2MzY2KSArIHkgKiAoLTIuNTIxNzM0MDEzMTY4MzAzMyAqIHkgLSAyMS4yNDg5MjMzMzczNTMwNzMgKiBrICsgMTcuNTExOTI3MDg0MTgxMykgKyBrICogKC0yMS44NjEyMjE0NzQ2MzYwNSAqIGsgLSAxODkuNDgxODA4MzU5MjI3NDcpOwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSAyNTUgKyBjICogKDguODQxMDQxNDIyMDM2MTQ5ICogYyArIDYwLjExODAyNzA0NTU5NzM2NiAqIG0gKyA2Ljg3MTQyNTU5MjA0OTAwNyAqIHkgKyAzMS4xNTkxMDAxMzAwNTU5MjIgKiBrICsgLTc5LjI5NzA4NDQ4MTY1NDgpICsgbSAqICgtMTUuMzEwMzYxMzA2OTY3ODE3ICogbSArIDE3LjU3NTI1MTI2MTEwOTQ4MiAqIHkgKyAxMzEuMzUyNTA5MTI0OTM5NzYgKiBrIC0gMTkwLjk0NTMzMDI1ODg5NTEpICsgeSAqICg0LjQ0NDMzOTEwMjg1MjczOSAqIHkgKyA5Ljg2MzI4NjE0OTM0MDUgKiBrIC0gMjQuODY3NDE1ODI1NTU4NzgpICsgayAqICgtMjAuNzM3MzI1NDcxMTgxMDM0ICogayAtIDE4Ny44MDQ1MzcwOTcxOTU3OCk7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IDI1NSArIGMgKiAoMC44ODQyNTIyNDMwMDAzMjk2ICogYyArIDguMDc4Njc3NTAzMTEyOTI4ICogbSArIDMwLjg5OTc4MzA5NzAzNzI5ICogeSAtIDAuMjM4ODMyMzg2ODkxNzg5MzQgKiBrICsgLTE0LjE4MzU3Njc5OTY3MzI4NikgKyBtICogKDEwLjQ5NTkzMjczNDMyMDcyICogbSArIDYzLjAyMzc4NDk0NzU0MDUyICogeSArIDUwLjYwNjk1NzY1NjM2MDczNCAqIGsgLSAxMTIuMjM4ODQyNTM3MTkyNDgpICsgeSAqICgwLjAzMjk2MDQxMTE0ODczMjE3ICogeSArIDExNS42MDM4NDQ0OTY0NjY0MSAqIGsgKyAtMTkzLjU4MjA5MzU2ODYxNTA1KSArIGsgKiAoLTIyLjMzODE2ODA3MzA5ODg2ICogayAtIDE4MC4xMjYxMzk3NDcwODM2Nyk7CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCAxLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIHNjYWxlLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgICAgc3JjT2Zmc2V0ICs9IDQ7CiAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICB9CiAgfQogIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgcmV0dXJuIGlucHV0TGVuZ3RoIC8gNCAqICgzICsgYWxwaGEwMSkgfCAwOwogIH0KfQpjbGFzcyBDYWxHcmF5Q1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSkgewogICAgc3VwZXIoIkNhbEdyYXkiLCAxKTsKICAgIGlmICghd2hpdGVQb2ludCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxHcmF5Iik7CiAgICB9CiAgICBbdGhpcy5YVywgdGhpcy5ZVywgdGh
20pcy5aV10gPSB3aGl0ZVBvaW50OwogICAgW3RoaXMuWEIsIHRoaXMuWUIsIHRoaXMuWkJdID0gYmxhY2tQb2ludCB8fCBbMCwgMCwgMF07CiAgICB0aGlzLkcgPSBnYW1tYSB8fCAxOwogICAgaWYgKHRoaXMuWFcgPCAwIHx8IHRoaXMuWlcgPCAwIHx8IHRoaXMuWVcgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9LCBubyBmYWxsYmFjayBhdmFpbGFibGVgKTsKICAgIH0KICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkgewogICAgICBpbmZvKGBJbnZhbGlkIEJsYWNrUG9pbnQgZm9yICR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7CiAgICAgIHRoaXMuWEIgPSB0aGlzLllCID0gdGhpcy5aQiA9IDA7CiAgICB9CiAgICBpZiAodGhpcy5YQiAhPT0gMCB8fCB0aGlzLllCICE9PSAwIHx8IHRoaXMuWkIgIT09IDApIHsKICAgICAgd2FybihgJHt0aGlzLm5hbWV9LCBCbGFja1BvaW50OiBYQjogJHt0aGlzLlhCfSwgWUI6ICR7dGhpcy5ZQn0sIGAgKyBgWkI6ICR7dGhpcy5aQn0sIG9ubHkgZGVmYXVsdCB2YWx1ZXMgYXJlIHN1cHBvcnRlZC5gKTsKICAgIH0KICAgIGlmICh0aGlzLkcgPCAxKSB7CiAgICAgIGluZm8oYEludmFsaWQgR2FtbWE6ICR7dGhpcy5HfSBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTsKICAgICAgdGhpcy5HID0gMTsKICAgIH0KICB9CiAgI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSkgewogICAgY29uc3QgQSA9IHNyY1tzcmNPZmZzZXRdICogc2NhbGU7CiAgICBjb25zdCBBRyA9IEEgKiogdGhpcy5HOwogICAgY29uc3QgTCA9IHRoaXMuWVcgKiBBRzsKICAgIGNvbnN0IHZhbCA9IE1hdGgubWF4KDI5NS44ICogTCAqKiAwLjMzMzMzMzMzMzMzMzMzMzMgLSA0MC44LCAwKTsKICAgIGRlc3RbZGVzdE9mZnNldF0gPSB2YWw7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHZhbDsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gdmFsOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIHRoaXMuI3RvUmdiKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCBzY2FsZSk7CiAgICAgIHNyY09mZnNldCArPSAxOwogICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSk7CiAgfQp9CmNsYXNzIENhbFJHQkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgc3RhdGljICNCUkFERk9SRF9TQ0FMRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFswLjg5NTEsIDAuMjY2NCwgLTAuMTYxNCwgLTAuNzUwMiwgMS43MTM1LCAwLjAzNjcsIDAuMDM4OSwgLTAuMDY4NSwgMS4wMjk2XSk7CiAgc3RhdGljICNCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzAuOTg2OTkyOSwgLTAuMTQ3MDU0MywgMC4xNTk5NjI3LCAwLjQzMjMwNTMsIDAuNTE4MzYwMywgMC4wNDkyOTEyLCAtMC4wMDg1Mjg3LCAwLjA0MDA0MjgsIDAuOTY4NDg2N10pOwogIHN0YXRpYyAjU1JHQl9ENjVfWFlaX1RPX1JHQl9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFszLjI0MDQ1NDIsIC0xLjUzNzEzODUsIC0wLjQ5ODUzMTQsIC0wLjk2OTI2NjAsIDEuODc2MDEwOCwgMC4wNDE1NTYwLCAwLjA1NTY0MzQsIC0wLjIwNDAyNTksIDEuMDU3MjI1Ml0pOwogIHN0YXRpYyAjRkxBVF9XSElURVBPSU5UX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTsKICBzdGF0aWMgI3RlbXBOb3JtYWxpemVNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogIHN0YXRpYyAjdGVtcENvbnZlcnRNYXRyaXgxID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKICBzdGF0aWMgI3RlbXBDb252ZXJ0TWF0cml4MiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgc3RhdGljICNERUNPREVfTF9DT05TVEFOVCA9ICgoOCArIDE2KSAvIDExNikgKiogMyAvIDguMDsKICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KSB7CiAgICBzdXBlcigiQ2FsUkdCIiwgMyk7CiAgICBpZiAoIXdoaXRlUG9pbnQpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7CiAgICB9CiAgICBjb25zdCBbWFcsIFlXLCBaV10gPSB0aGlzLndoaXRlUG9pbnQgPSB3aGl0ZVBvaW50OwogICAgY29uc3QgW1hCLCBZQiwgWkJdID0gdGhpcy5ibGFja1BvaW50ID0gYmxhY2tQb2ludCB8fCBuZXcgRmxvYXQzMkFycmF5KDMpOwogICAgW3RoaXMuR1IsIHRoaXMuR0csIHRoaXMuR0JdID0gZ2FtbWEgfHwgbmV3IEZsb2F0MzJBcnJheShbMSwgMSwgMV0pOwogICAgW3RoaXMuTVhBLCB0aGlzLk1ZQSwgdGhpcy5NWkEsIHRoaXMuTVhCLCB0aGlzLk1ZQiwgdGhpcy5NWkIsIHRoaXMuTVhDLCB0aGlzLk1ZQywgdGhpcy5NWkNdID0gbWF0cml4IHx8IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDFdKTsKICAgIGlmIChYVyA8IDAgfHwgWlcgPCAwIHx8IFlXICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMgZm9yICR7dGhpcy5uYW1lfSwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlYCk7CiAgICB9CiAgICBpZiAoWEIgPCAwIHx8IFlCIDwgMCB8fCBaQiA8IDApIHsKICAgICAgaW5mbyhgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7WEJ9LCAke1lCfSwgJHtaQn1dLCBgICsgImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpOwogICAgICB0aGlzLmJsYWNrUG9pbnQgPSBuZXcgRmxvYXQzMkFycmF
205KDMpOwogICAgfQogICAgaWYgKHRoaXMuR1IgPCAwIHx8IHRoaXMuR0cgPCAwIHx8IHRoaXMuR0IgPCAwKSB7CiAgICAgIGluZm8oYEludmFsaWQgR2FtbWEgWyR7dGhpcy5HUn0sICR7dGhpcy5HR30sICR7dGhpcy5HQn1dIGZvciBgICsgYCR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7CiAgICAgIHRoaXMuR1IgPSB0aGlzLkdHID0gdGhpcy5HQiA9IDE7CiAgICB9CiAgfQogICNtYXRyaXhQcm9kdWN0KGEsIGIsIHJlc3VsdCkgewogICAgcmVzdWx0WzBdID0gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdOwogICAgcmVzdWx0WzFdID0gYVszXSAqIGJbMF0gKyBhWzRdICogYlsxXSArIGFbNV0gKiBiWzJdOwogICAgcmVzdWx0WzJdID0gYVs2XSAqIGJbMF0gKyBhWzddICogYlsxXSArIGFbOF0gKiBiWzJdOwogIH0KICAjdG9GbGF0KHNvdXJjZVdoaXRlUG9pbnQsIExNUywgcmVzdWx0KSB7CiAgICByZXN1bHRbMF0gPSBMTVNbMF0gKiAxIC8gc291cmNlV2hpdGVQb2ludFswXTsKICAgIHJlc3VsdFsxXSA9IExNU1sxXSAqIDEgLyBzb3VyY2VXaGl0ZVBvaW50WzFdOwogICAgcmVzdWx0WzJdID0gTE1TWzJdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMl07CiAgfQogICN0b0Q2NShzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIHJlc3VsdCkgewogICAgY29uc3QgRDY1WCA9IDAuOTUwNDc7CiAgICBjb25zdCBENjVZID0gMTsKICAgIGNvbnN0IEQ2NVogPSAxLjA4ODgzOwogICAgcmVzdWx0WzBdID0gTE1TWzBdICogRDY1WCAvIHNvdXJjZVdoaXRlUG9pbnRbMF07CiAgICByZXN1bHRbMV0gPSBMTVNbMV0gKiBENjVZIC8gc291cmNlV2hpdGVQb2ludFsxXTsKICAgIHJlc3VsdFsyXSA9IExNU1syXSAqIEQ2NVogLyBzb3VyY2VXaGl0ZVBvaW50WzJdOwogIH0KICAjc1JHQlRyYW5zZmVyRnVuY3Rpb24oY29sb3IpIHsKICAgIGlmIChjb2xvciA8PSAwLjAwMzEzMDgpIHsKICAgICAgcmV0dXJuIHRoaXMuI2FkanVzdFRvUmFuZ2UoMCwgMSwgMTIuOTIgKiBjb2xvcik7CiAgICB9CiAgICBpZiAoY29sb3IgPj0gMC45OTU1NDUyNSkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiB0aGlzLiNhZGp1c3RUb1JhbmdlKDAsIDEsICgxICsgMC4wNTUpICogY29sb3IgKiogKDEgLyAyLjQpIC0gMC4wNTUpOwogIH0KICAjYWRqdXN0VG9SYW5nZShtaW4sIG1heCwgdmFsdWUpIHsKICAgIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgdmFsdWUpKTsKICB9CiAgI2RlY29kZUwoTCkgewogICAgaWYgKEwgPCAwKSB7CiAgICAgIHJldHVybiAtdGhpcy4jZGVjb2RlTCgtTCk7CiAgICB9CiAgICBpZiAoTCA+IDguMCkgewogICAgICByZXR1cm4gKChMICsgMTYpIC8gMTE2KSAqKiAzOwogICAgfQogICAgcmV0dXJuIEwgKiBDYWxSR0JDUy4jREVDT0RFX0xfQ09OU1RBTlQ7CiAgfQogICNjb21wZW5zYXRlQmxhY2tQb2ludChzb3VyY2VCbGFja1BvaW50LCBYWVpfRmxhdCwgcmVzdWx0KSB7CiAgICBpZiAoc291cmNlQmxhY2tQb2ludFswXSA9PT0gMCAmJiBzb3VyY2VCbGFja1BvaW50WzFdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMl0gPT09IDApIHsKICAgICAgcmVzdWx0WzBdID0gWFlaX0ZsYXRbMF07CiAgICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdOwogICAgICByZXN1bHRbMl0gPSBYWVpfRmxhdFsyXTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgemVyb0RlY29kZUwgPSB0aGlzLiNkZWNvZGVMKDApOwogICAgY29uc3QgWF9EU1QgPSB6ZXJvRGVjb2RlTDsKICAgIGNvbnN0IFhfU1JDID0gdGhpcy4jZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzBdKTsKICAgIGNvbnN0IFlfRFNUID0gemVyb0RlY29kZUw7CiAgICBjb25zdCBZX1NSQyA9IHRoaXMuI2RlY29kZUwoc291cmNlQmxhY2tQb2ludFsxXSk7CiAgICBjb25zdCBaX0RTVCA9IHplcm9EZWNvZGVMOwogICAgY29uc3QgWl9TUkMgPSB0aGlzLiNkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMl0pOwogICAgY29uc3QgWF9TY2FsZSA9ICgxIC0gWF9EU1QpIC8gKDEgLSBYX1NSQyk7CiAgICBjb25zdCBYX09mZnNldCA9IDEgLSBYX1NjYWxlOwogICAgY29uc3QgWV9TY2FsZSA9ICgxIC0gWV9EU1QpIC8gKDEgLSBZX1NSQyk7CiAgICBjb25zdCBZX09mZnNldCA9IDEgLSBZX1NjYWxlOwogICAgY29uc3QgWl9TY2FsZSA9ICgxIC0gWl9EU1QpIC8gKDEgLSBaX1NSQyk7CiAgICBjb25zdCBaX09mZnNldCA9IDEgLSBaX1NjYWxlOwogICAgcmVzdWx0WzBdID0gWFlaX0ZsYXRbMF0gKiBYX1NjYWxlICsgWF9PZmZzZXQ7CiAgICByZXN1bHRbMV0gPSBYWVpfRmxhdFsxXSAqIFlfU2NhbGUgKyBZX09mZnNldDsKICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdICogWl9TY2FsZSArIFpfT2Zmc2V0OwogIH0KICAjbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBYWVpfSW4sIHJlc3VsdCkgewogICAgaWYgKHNvdXJjZVdoaXRlUG9pbnRbMF0gPT09IDEgJiYgc291cmNlV2hpdGVQb2ludFsyXSA9PT0gMSkgewogICAgICByZXN1bHRbMF0gPSBYWVpfSW5bMF07CiAgICAgIHJlc3VsdFsxXSA9IFhZWl9JblsxXTsKICAgICAgcmVzdWx0WzJdID0gWFlaX0luWzJdOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBMTVMgPSByZXN1bHQ7CiAgICB0aGlzLiNtYXRyaXhQcm9kdWN0KENhbFJHQkNTLiNCUkFERk9SRF9TQ0FMRV9NQVRSSVgsIFhZWl9JbiwgTE1TKTsKICAgIGNvbnN0IExNU19GbGF0ID0gQ2FsUkdCQ1MuI3RlbXBOb3JtYWxpemVNYXRyaXg7CiAgICB0aGlzLiN0b0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRmxhdCk7CiAgICB0aGlzLiNtYXRyaXhQcm9kdWN0KENhbFJHQkNTLiNCUkFERk9SRF9TQ0FMRV9JTlZFUlNFX01BVFJJWCwgTE1TX0ZsYXQsIHJlc3VsdCk7CiAgfQogICNub3JtYWxpem
20VXaGl0ZVBvaW50VG9ENjUoc291cmNlV2hpdGVQb2ludCwgWFlaX0luLCByZXN1bHQpIHsKICAgIGNvbnN0IExNUyA9IHJlc3VsdDsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOwogICAgY29uc3QgTE1TX0Q2NSA9IENhbFJHQkNTLiN0ZW1wTm9ybWFsaXplTWF0cml4OwogICAgdGhpcy4jdG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRDY1KTsKICAgIHRoaXMuI21hdHJpeFByb2R1Y3QoQ2FsUkdCQ1MuI0JSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRDY1LCByZXN1bHQpOwogIH0KICAjdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CiAgICBjb25zdCBBID0gdGhpcy4jYWRqdXN0VG9SYW5nZSgwLCAxLCBzcmNbc3JjT2Zmc2V0XSAqIHNjYWxlKTsKICAgIGNvbnN0IEIgPSB0aGlzLiNhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNjYWxlKTsKICAgIGNvbnN0IEMgPSB0aGlzLiNhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNjYWxlKTsKICAgIGNvbnN0IEFHUiA9IEEgPT09IDEgPyAxIDogQSAqKiB0aGlzLkdSOwogICAgY29uc3QgQkdHID0gQiA9PT0gMSA/IDEgOiBCICoqIHRoaXMuR0c7CiAgICBjb25zdCBDR0IgPSBDID09PSAxID8gMSA6IEMgKiogdGhpcy5HQjsKICAgIGNvbnN0IFggPSB0aGlzLk1YQSAqIEFHUiArIHRoaXMuTVhCICogQkdHICsgdGhpcy5NWEMgKiBDR0I7CiAgICBjb25zdCBZID0gdGhpcy5NWUEgKiBBR1IgKyB0aGlzLk1ZQiAqIEJHRyArIHRoaXMuTVlDICogQ0dCOwogICAgY29uc3QgWiA9IHRoaXMuTVpBICogQUdSICsgdGhpcy5NWkIgKiBCR0cgKyB0aGlzLk1aQyAqIENHQjsKICAgIGNvbnN0IFhZWiA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDE7CiAgICBYWVpbMF0gPSBYOwogICAgWFlaWzFdID0gWTsKICAgIFhZWlsyXSA9IFo7CiAgICBjb25zdCBYWVpfRmxhdCA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDI7CiAgICB0aGlzLiNub3JtYWxpem
20VXaGl0ZVBvaW50VG9GbGF0KHRoaXMud2hpdGVQb2ludCwgWFlaLCBYWVpfRmxhdCk7CiAgICBjb25zdCBYWVpfQmxhY2sgPSBDYWxSR0JDUy4jdGVtcENvbnZlcnRNYXRyaXgxOwogICAgdGhpcy4jY29tcGVuc2F0ZUJsYWNrUG9pbnQodGhpcy5ibGFja1BvaW50LCBYWVpfRmxhdCwgWFlaX0JsYWNrKTsKICAgIGNvbnN0IFhZWl9ENjUgPSBDYWxSR0JDUy4jdGVtcENvbnZlcnRNYXRyaXgyOwogICAgdGhpcy4jbm9ybWFsaXplV2hpdGVQb2ludFRvRDY1KENhbFJHQkNTLiNGTEFUX1dISVRFUE9JTlRfTUFUUklYLCBYWVpfQmxhY2ssIFhZWl9ENjUpOwogICAgY29uc3QgU1JHQiA9IENhbFJHQkNTLiN0ZW1wQ29udmVydE1hdHJpeDE7CiAgICB0aGlzLiNtYXRyaXhQcm9kdWN0KENhbFJHQkNTLiNTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCwgWFlaX0Q2NSwgU1JHQik7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gdGhpcy4jc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlswXSkgKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHRoaXMuI3NSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMV0pICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSB0aGlzLiNzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzJdKSAqIDI1NTsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIDEpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpOwogICAgICBzcmNPZmZzZXQgKz0gMzsKICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CiAgfQp9CmNsYXNzIExhYkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3Iod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgcmFuZ2UpIHsKICAgIHN1cGVyKCJMYWIiLCAzKTsKICAgIGlmICghd2hpdGVQb2ludCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBMYWIiKTsKICAgIH0KICAgIFt0aGlzLlhXLCB0aGlzLllXLCB0aGlzLlpXXSA9IHdoaXRlUG9pbnQ7CiAgICBbdGhpcy5hbWluLCB0aGlzLmFtYXgsIHRoaXMuYm1pbiwgdGhpcy5ibWF4XSA9IHJhbmdlIHx8IFstMTAwLCAxMDAsIC0xMDAsIDEwMF07CiAgICBbdGhpcy5YQiwgdGhpcy5ZQiwgdGhpcy5aQl0gPSBibGFja1BvaW50IHx8IFswLCAwLCAwXTsKICAgIGlmICh0aGlzLlhXIDwgMCB8fCB0aGlzLlpXIDwgMCB8fCB0aGlzLllXICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOwogICAgfQogICAgaWYgKHRoaXMuWEIgPCAwIHx8IHRoaXMuWUIgPCAwIHx8IHRoaXMuWkIgPCAwKSB7CiAgICAgIGluZm8oIkludmFsaWQgQmxhY2tQb2ludCwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQiKTsKICAgICAgdGhpcy5YQiA9IHRoaXMuWUIgPSB0aGlzLlpCID0gMDsKICAgIH0KICAgIGlmICh0aGlzLmFtaW4gPiB0aGlzLmFtYXggfHwgdGhpcy5ibWluID4gdGhpcy5ibWF4KSB7CiAgICAgIGluZm8oIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIpOwogICAgICB0aGlzLmFtaW4gPSAtMTAwOwogICAgICB0aGlzLmFtYXggPSAxMDA7CiAgICAgIHRoaXMuYm1pbiA9IC0xMDA7CiAgICAgIHRoaXMuYm1heCA9IDEwMDsKICAgIH0KICB9CiAgI2ZuX2coeCkgewogICAgcmV0dXJuIHggPj0gNiAvIDI5ID8geCAqKiAzIDogMTA4IC8gODQxICogKHggLSA0IC8gMjkpOwogIH0KICAjZGVjb2RlKHZhbHVlLCBoaWdoMSwgbG93MiwgaGlnaDIpIHsKICAgIHJldHVybiBsb3cyICsgdmFsdWUgKiAoaGlnaDIgLSBsb3cyKSAvIGhpZ2gxOwogIH0KICAjdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIG1heFZhbCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgbGV0IExzID0gc3JjW3NyY09mZnNldF07CiAgICBsZXQgYXMgPSBzcmNbc3JjT2Zmc2V0ICsgMV07CiAgICBsZXQgYnMgPSBzcmNbc3JjT2Zmc2V0ICsgMl07CiAgICBpZiAobWF4VmFsICE9PSBmYWxzZSkgewogICAgICBMcyA9IHRoaXMuI2RlY29kZShMcywgbWF4VmFsLCAwLCAxMDApOwogICAgICBhcyA9IHRoaXMuI2RlY29kZShhcywgbWF4VmFsLCB0aGlzLmFtaW4sIHRoaXMuYW1heCk7CiAgICAgIGJzID0gdGhpcy4jZGVjb2RlKGJzLCBtYXhWYWwsIHRoaXMuYm1pbiwgdGhpcy5ibWF4KTsKICAgIH0KICAgIGlmIChhcyA+IHRoaXMuYW1heCkgewogICAgICBhcyA9IHRoaXMuYW1heDsKICAgIH0gZWxzZSBpZiAoYXMgPCB0aGlzLmFtaW4pIHsKICAgICAgYXMgPSB0aGlzLmFtaW47CiAgICB9CiAgICBpZiAoYnMgPiB0aGlzLmJtYXgpIHsKICAgICAgYnMgPSB0aGlzLmJtYXg7CiAgICB9IGVsc2UgaWYgKGJzIDwgdGhpcy5ibWluKSB7CiAgICAgIGJzID0gdGhpcy5ibWluOwogICAgfQogICAgY29uc3QgTSA9IChMcyArIDE2KSAvIDExNjsKICAgIGNvbnN0IEwgPSBNICsgYXMgLyA1MDA7CiAgICBjb25zdCBOID0gTSAtIGJzIC8gMjAwOwogICAgY29uc3QgWCA9IHRoaXMuWFcgKiB0aGlzLiNmbl9nKEwpOwogICAgY29uc3QgWSA9IHRoaXMuWVcgKiB0aGlzLiNmbl9nKE0pOwogICAgY29uc3QgWiA9IHRoaXMuWlcgKiB0aGlzLiNmbl9nKE4pOwogICAgbGV0IHIsIGcsIGI7CiAgICBpZiAodGhpcy5aVyA8IDEpIHsKICAgICAgciA9IFggKiAzLjEzMzkgKyBZICogLTEuNjE3ICsgWiAqIC0wLjQ5MDY7CiAgICAgIGcgPSBYICogLTAuOTc4NSArIFkgKiAxLjkxNiArIFogKiAwLjAzMzM7CiAgICAgIGIgPSBYICogMC4wNzIgKyBZICogLTAuMjI5ICsgWiAqIDEuNDA1NzsKICAgIH0gZWxzZSB7CiAgICAgI
20HIgPSBYICogMy4yNDA2ICsgWSAqIC0xLjUzNzIgKyBaICogLTAuNDk4NjsKICAgICAgZyA9IFggKiAtMC45Njg5ICsgWSAqIDEuODc1OCArIFogKiAwLjA0MTU7CiAgICAgIGIgPSBYICogMC4wNTU3ICsgWSAqIC0wLjIwNCArIFogKiAxLjA1NzsKICAgIH0KICAgIGRlc3RbZGVzdE9mZnNldF0gPSBNYXRoLnNxcnQocikgKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IE1hdGguc3FydChnKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gTWF0aC5zcXJ0KGIpICogMjU1OwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICB0aGlzLiN0b1JnYihzcmMsIHNyY09mZnNldCwgZmFsc2UsIGRlc3QsIGRlc3RPZmZzZXQpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBtYXhWYWwgPSAoMSA8PCBiaXRzKSAtIDE7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgdGhpcy4jdG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIG1heFZhbCwgZGVzdCwgZGVzdE9mZnNldCk7CiAgICAgIHNyY09mZnNldCArPSAzOwogICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgfQogIH0KICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgIHJldHVybiBpbnB1dExlbmd0aCAqICgzICsgYWxwaGEwMSkgLyAzIHwgMDsKICB9CiAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZ2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgInVzZXNaZXJvVG9PbmVSYW5nZSIsIGZhbHNlKTsKICB9Cn0KCi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcwp2YXIgZXNuZXh0X2l0ZXJhdG9yX2Zvcl9lYWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOTQ5KTsKOy8vIC4vc3JjL2NvcmUvYmluYXJ5X2NtYXAuanMKCgoKCgoKCmZ1bmN0aW9uIGhleFRvSW50KGEsIHNpemUpIHsKICBsZXQgbiA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CiAgICBuID0gbiA8PCA4IHwgYVtpXTsKICB9CiAgcmV0dXJuIG4gPj4+IDA7Cn0KZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkgewogIGlmIChzaXplID09PSAxKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTsKICB9CiAgaWYgKHNpemUgPT09IDMpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOwogIH0KICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7Cn0KZnVuY3Rpb24gYWRkSGV4KGEsIGIsIHNpemUpIHsKICBsZXQgYyA9IDA7CiAgZm9yIChsZXQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKSB7CiAgICBjICs9IGFbaV0gKyBiW2ldOwogICAgYVtpXSA9IGMgJiAyNTU7CiAgICBjID4+PSA4OwogIH0KfQpmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgewogIGxldCBjID0gMTsKICBmb3IgKGxldCBpID0gc2l6ZTsgaSA+PSAwICYmIGMgPiAwOyBpLS0pIHsKICAgIGMgKz0gYVtpXTsKICAgIGFbaV0gPSBjICYgMjU1OwogICAgYyA+Pj0gODsKICB9Cn0KY29uc3QgTUFYX05VTV9TSVpFID0gMTY7CmNvbnN0IE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CmNsYXNzIEJpbmFyeUNNYXBTdHJlYW0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KE1BWF9FTkNPREVEX05VTV9TSVpFKTsKICB9CiAgcmVhZEJ5dGUoKSB7CiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdOwogIH0KICByZWFkTnVtYmVyKCkgewogICAgbGV0IG4gPSAwOwogICAgbGV0IGxhc3Q7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIG4gPSBuIDw8IDcgfCBiICYgMHg3ZjsKICAgIH0gd2hpbGUgKCFsYXN0KTsKICAgIHJldHVybiBuOwogIH0KICByZWFkU2lnbmVkKCkgewogICAgY29uc3QgbiA9IHRoaXMucmVhZE51bWJlcigpOwogICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CiAgfQogIHJlYWRIZXgobnVtLCBzaXplKSB7CiAgICBudW0uc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLCB0aGlzLnBvcyArIHNpemUgKyAxKSk7CiAgICB0aGlzLnBvcyArPSBzaXplICsgMTsKICB9CiAgcmVhZEhleE51bWJlcihudW0sIHNpemUpIHsKICAgIGxldCBsYXN0OwogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnRtcEJ1ZjsKICAgIGxldCBzcCA9IDA7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIHN0YWNrW3NwKytdID0gYiAmIDB4N2Y7CiAgICB9IHdoaWxlICghbGFzdCk7CiAgICBsZXQgaSA9IHNpemUsCiAgICAgIGJ1ZmZlciA9IDAsCiAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgd2hpbGUgKGkgPj0gMCkgewogICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgIGJ1ZmZlciB8PSBzdGFja1stLXNwXSA8PCBidWZmZXJTaXplOwogICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKICAgICAgfQogICAgICBudW1baV0gPSBidWZmZXIgJiAyNTU7CiAgICAgIGktLTsKICAgICAgYnVmZmVyID4+PSA4OwogICAgICBidWZmZXJTaXplIC09IDg7CiAgICB9CiAgfQogIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7CiAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTsKICAgIGNvbnN0IHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKICAgIGxldCBjID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykgewogICAgICBjID0gKGMgJiAxKSA8PCA4IHwgbnVtW2ldOwogICAgICBudW1baV0gPSBjID4+IDEgXiBzaWduOwogICAgfQogIH0KICByZWFkU3RyaW5nKCkgewogICAgY29uc3QgbGVuID0gdGhpcy5yZWFkTnVtYmVyKCksCiAgICAgIGJ1ZiA9IG5ldyBBcnJheShsZW4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBidWZbaV0gPSB0aGlzLnJlYWROdW1iZXIoKTsKICAgIH0KICAgIHJldHVybi
20BTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgfQp9CmNsYXNzIEJpbmFyeUNNYXBSZWFkZXIgewogIGFzeW5jIHByb2Nlc3MoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpOwogICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpOwogICAgbGV0IHVzZUNNYXAgPSBudWxsOwogICAgY29uc3Qgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGNvbnN0IGNoYXIgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGxldCBjb2RlOwogICAgbGV0IGI7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkgewogICAgICBjb25zdCB0eXBlID0gYiA+PiA1OwogICAgICBpZiAodHlwZSA9PT0gNykgewogICAgICAgIHN3aXRjaCAoYiAmIDB4MWYpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgc3RyZWFtLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgc2VxdWVuY2UgPSAhIShiICYgMHgxMCk7CiAgICAgIGNvbnN0IGRhdGFTaXplID0gYiAmIDE1OwogICAgICBpZiAoZGF0YVNpemUgKyAxID4gTUFYX05VTV9TSVpFKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7CiAgICAgIH0KICAgICAgY29uc3QgdWNzMkRhdGFTaXplID0gMTsKICAgICAgY29uc3Qgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChjaGFyLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOwogICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgI
20H0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgewogICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHRtcCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluY0hleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleFNpZ25lZCh0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGNoYXJDb2RlLCB0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKICAgICAgICAgIGNNYXAubWFwQmZSYW5nZShoZXhUb0ludChzdGFydCwgdWNzMkRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLCBoZXhUb1N0cihjaGFyQ29kZSwgZGF0YVNpemUpKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3MgLSB1bmtub3duIHR5cGU6ICR7dHlwZX1gKTsKICAgICAgfQogICAgfQogICAgaWYgKHVzZUNNYXApIHsKICAgICAgcmV0dXJuIGV4dGVuZCh1c2VDTWFwKTsKICAgIH0KICAgIHJldHVybiBjTWFwOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZGVjb2RlX3N0cmVhbS5qcwoKCgoKCgoKCgoKCmNvbnN0IGVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7CmNsYXNzIERlY29kZVN0cmVhbSBleHRlbmRzIEJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5fcmF3TWluQnVmZmVyTGVuZ3RoID0gbWF5YmVNaW5CdWZmZXJMZW5ndGggfHwgMDsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKICAgIHRoaXMuZW9mID0gZmFsc2U7CiAgICB0aGlzLmJ1ZmZlciA9IGVtcHR5QnVmZmVyOwogICAgdGhpcy5taW5CdWZmZXJMZW5ndGggPSA1MTI7CiAgICBpZiAobWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgICB0aGlzLm1pbkJ1ZmZlckxlbmd0aCAqPSAyOwogICAgICB9CiAgICB9CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMCkgewogICAgICB0aGlzLnJlYWRCbG9jaygpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwOwogIH0KICBlbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGlmIChyZXF1ZXN0ZWQgPD0gYnVmZmVyLmJ5dGVMZW5ndGgpIHsKICAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgIH0KICAgIGxldCBzaXplID0gdGhpcy5taW5CdWZmZXJMZW5ndGg7CiAgICB3aGlsZSAoc2l6ZSA8IHJlcXVlc3RlZCkgewogICAgICBzaXplICo9IDI7CiAgICB9CiAgICBjb25zdCBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7CiAgICBidWZmZXIyLnNldChidWZmZXIpOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IHBvcykgewogICAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgI
20H0KICAgICAgdGhpcy5yZWFkQmxvY2soKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXTsKICB9CiAgZ2V0Qnl0ZXMobGVuZ3RoLCBkZWNvZGVyT3B0aW9ucyA9IG51bGwpIHsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgbGV0IGVuZDsKICAgIGlmIChsZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuZ3RoKTsKICAgICAgZW5kID0gcG9zICsgbGVuZ3RoOwogICAgICB3aGlsZSAoIXRoaXMuZW9mICYmIHRoaXMuYnVmZmVyTGVuZ3RoIDwgZW5kKSB7CiAgICAgICAgdGhpcy5yZWFkQmxvY2soZGVjb2Rlck9wdGlvbnMpOwogICAgICB9CiAgICAgIGNvbnN0IGJ1ZkVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgICBpZiAoZW5kID4gYnVmRW5kKSB7CiAgICAgICAgZW5kID0gYnVmRW5kOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3aGlsZSAoIXRoaXMuZW9mKSB7CiAgICAgICAgdGhpcy5yZWFkQmxvY2soZGVjb2Rlck9wdGlvbnMpOwogICAgICB9CiAgICAgIGVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgfQogICAgdGhpcy5wb3MgPSBlbmQ7CiAgICByZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkocG9zLCBlbmQpOwogIH0KICBhc3luYyBnZXRJbWFnZURhdGEobGVuZ3RoLCBkZWNvZGVyT3B0aW9ucyA9IG51bGwpIHsKICAgIGlmICghdGhpcy5jYW5Bc3luY0RlY29kZUltYWdlRnJvbUJ1ZmZlcikgewogICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhsZW5ndGgsIGRlY29kZXJPcHRpb25zKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnN0cmVhbS5hc3luY0dldEJ5dGVzKCk7CiAgICByZXR1cm4gdGhpcy5kZWNvZGVJbWFnZShkYXRhLCBkZWNvZGVyT3B0aW9ucyk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5wb3MgPSAwOwogIH0KICBtYWtlU3ViU3RyZWFtKHN0YXJ0LCBsZW5ndGgsIGRpY3QgPSBudWxsKSB7CiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgICAgd2hpbGUgKCF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICB3aGlsZSAodGhpcy5idWZmZXJMZW5ndGggPD0gZW5kICYmICF0aGlzLmVvZikgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gdGhpcy5zdHIgPyB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpIDogbnVsbDsKICB9Cn0KY2xhc3MgU3RyZWFtc1NlcXVlbmNlU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW1zLCBvbkVycm9yID0gbnVsbCkgewogICAgc3RyZWFtcyA9IHN0cmVhbXMuZmlsdGVyKHMgPT4gcyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pOwogICAgbGV0IG1heWJlTGVuZ3RoID0gMDsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHN0cmVhbXMpIHsKICAgICAgbWF5YmVMZW5ndGggKz0gc3RyZWFtIGluc3RhbmNlb2YgRGVjb2RlU3RyZWFtID8gc3RyZWFtLl9yYXdNaW5CdWZmZXJMZW5ndGggOiBzdHJlYW0ubGVuZ3RoOwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW1zID0gc3RyZWFtczsKICAgIHRoaXMuX29uRXJyb3IgPSBvbkVycm9yOwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCBzdHJlYW1zID0gdGhpcy5zdHJlYW1zOwogICAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpOwogICAgbGV0IGNodW5rOwogICAgdHJ5IHsKICAgICAgY2h1bmsgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICBpZiAodGhpcy5fb25FcnJvcikgewogICAgICAgIHRoaXMuX29uRXJyb3IocmVhc29uLCBzdHJlYW0uZGljdD8ub2JqSWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IG5ld0xlbmd0aCA9IGJ1ZmZlckxlbmd0aCArIGNodW5rLmxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQogIGdldEJhc2VTdHJlYW1zKCkgewogICAgY29uc3QgYmFzZVN0cmVhbXNCdWYgPSBbXTsKICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIHRoaXMuc3RyZWFtcykgewogICAgICBjb25zdCBiYXNlU3RyZWFtcyA9IHN0cmVhbS5nZXRCYXNlU3RyZWFtcygpOwogICAgICBpZiAoYmFzZVN0cmVhbXMpIHsKICAgICAgICBiYXNlU3RyZWFtc0J1Zi5wdXNoKC4uLmJhc2VTdHJlYW1zKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGJhc2VTdHJlYW1zQnVmLmxlbmd0aCA+IDAgPyBiYXNlU3RyZWFtc0J1ZiA6IG51bGw7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hc2NpaV84NV9zdHJlYW0uanMKCgoKCgoKCgpjbGFzcyBBc2NpaTg1U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoKSB7CiAgICBpZiAobWF5YmVMZW5ndGgpIHsKICAgICAgbWF5YmVMZW5ndGggKj0gMC44OwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuaW5wdXQgPSBuZXcgVWludDhBcnJheSg1KTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgVElMREFfQ0hBUiA9IDB4N2U7CiAgICBjb25zdCBaX0xPV0VSX0NIQVIgPSAweDdhOwogICAgY29uc3QgRU9GID0gLTE7CiAgICBjb25zdCBzdHIgPSB0aGlzLnN0cjsKICAgIGxldCBjID0gc3RyLmdldEJ5dGUoKTsKICAgIHdoaWxlIChpc1doaXRlU3BhY2UoYykpIHsKICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICB9CiAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIp
20IHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGxldCBidWZmZXIsIGk7CiAgICBpZiAoYyA9PT0gWl9MT1dFUl9DSEFSKSB7CiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIDQpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCArIGldID0gMDsKICAgICAgfQogICAgICB0aGlzLmJ1ZmZlckxlbmd0aCArPSA0OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0OwogICAgICBpbnB1dFswXSA9IGM7CiAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyArK2kpIHsKICAgICAgICBjID0gc3RyLmdldEJ5dGUoKTsKICAgICAgICB3aGlsZSAoaXNXaGl0ZVNwYWNlKGMpKSB7CiAgICAgICAgICBjID0gc3RyLmdldEJ5dGUoKTsKICAgICAgICB9CiAgICAgICAgaW5wdXRbaV0gPSBjOwogICAgICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIGkgLSAxKTsKICAgICAgdGhpcy5idWZmZXJMZW5ndGggKz0gaSAtIDE7CiAgICAgIGlmIChpIDwgNSkgewogICAgICAgIGZvciAoOyBpIDwgNTsgKytpKSB7CiAgICAgICAgICBpbnB1dFtpXSA9IDB4MjEgKyA4NDsKICAgICAgICB9CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICB9CiAgICAgIGxldCB0ID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgewogICAgICAgIHQgPSB0ICogODUgKyAoaW5wdXRbaV0gLSAweDIxKTsKICAgICAgfQogICAgICBmb3IgKGkgPSAzOyBpID49IDA7IC0taSkgewogICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGggKyBpXSA9IHQgJiAweGZmOwogICAgICAgIHQgPj49IDg7CiAgICAgIH0KICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2FzY2lpX2hleF9zdHJlYW0uanMKCmNsYXNzIEFzY2lpSGV4U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoKSB7CiAgICBpZiAobWF5YmVMZW5ndGgpIHsKICAgICAgbWF5YmVMZW5ndGggKj0gMC41OwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuZmlyc3REaWdpdCA9IC0xOwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCBVUFNUUkVBTV9CTE9DS19TSVpFID0gODAwMDsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoVVBTVFJFQU1fQkxPQ0tfU0laRSk7CiAgICBpZiAoIWJ5dGVzLmxlbmd0aCkgewogICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1heERlY29kZUxlbmd0aCA9IGJ5dGVzLmxlbmd0aCArIDEgPj4gMTsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgbWF4RGVjb2RlTGVuZ3RoKTsKICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGxldCBmaXJzdERpZ2l0ID0gdGhpcy5maXJzdERpZ2l0OwogICAgZm9yIChjb25zdCBjaCBvZiBieXRlcykgewogICAgICBsZXQgZGlnaXQ7CiAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgICAgICBkaWdpdCA9IGNoICYgMHgwZjsKICAgICAgfSBlbHNlIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CiAgICAgICAgZGlnaXQgPSAoY2ggJiAweDBmKSArIDk7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4M2UpIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGZpcnN0RGlnaXQgPCAwKSB7CiAgICAgICAgZmlyc3REaWdpdCA9IGRpZ2l0OwogICAgICB9IGVsc2UgewogICAgICAgIGJ1ZmZlcltidWZmZXJMZW5ndGgrK10gPSBmaXJzdERpZ2l0IDw8IDQgfCBkaWdpdDsKICAgICAgICBmaXJzdERpZ2l0ID0gLTE7CiAgICAgIH0KICAgIH0KICAgIGlmIChmaXJzdERpZ2l0ID49IDAgJiYgdGhpcy5lb2YpIHsKICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGZpcnN0RGlnaXQgPDwgNDsKICAgICAgZmlyc3REaWdpdCA9IC0xOwogICAgfQogICAgdGhpcy5maXJzdERpZ2l0ID0gZmlyc3REaWdpdDsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2NpdHQuanMKCgoKCgoKCmNvbnN0IGNjaXR0RU9MID0gLTI7CmNvbnN0IGNjaXR0RU9GID0gLTE7CmNvbnN0IHR3b0RpbVBhc3MgPSAwOwpjb25zdCB0d29EaW1Ib3JpeiA9IDE7CmNvbnN0IHR3b0RpbVZlcnQwID0gMjsKY29uc3QgdHdvRGltVmVydFIxID0gMzsKY29uc3QgdHdvRGltVmVydEwxID0gNDsKY29uc3QgdHdvRGltVmVydFIyID0gNTsKY29uc3QgdHdvRGltVmVydEwyID0gNjsKY29uc3QgdHdvRGltVmVydFIzID0gNzsKY29uc3QgdHdvRGltVmVydEwzID0gODsKY29uc3QgdHdvRGltVGFibGUgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbNywgdHdvRGltVmVydEwzXSwgWzcsIHR3b0RpbVZlcnRSM10sIFs2LCB0d29EaW1WZXJ0TDJdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRSMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbUhvcml6XSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdLCBbMSwgdHdvRGltVmVydDBdXTsKY29uc3Qgd2hpdGVUYWJsZTEgPSBbWy0xLCAtMV0sIFsxMiwgY2NpdHRFT0xdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFsxMSwgMTc5Ml0sIFsxMSwgMTc5Ml0sIFsxMiwgMTk4NF0sIFsxMiwgMjA0OF0sIFsxMiwgMjExMl0sIFsxMiwgMjE3Nl0sIFsxMiwgMjI0MF0sIFsxMiwgMjMwNF0sIFsxMSwgMTg1Nl0sIFsxMSwgMTg1Nl0sIFsxMSwgMTkyMF0sIFsxMSwgMTkyMF0sIFsxMiwgMjM2OF0sIFsxMiwgMjQzMl0sIFsxMiwgMjQ5Nl0sIFsxMiwgMjU2MF1dOwpjb25zdCB3aGl0ZVRhYmxlMiA9IFtbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzgsIDI5XSwgWzgsIDI5XSwgWzgsIDMwXSwgWzgsIDMwXSwgWzgsIDQ1XSwgWzgsIDQ1XSwgWzgsIDQ2XSwgWzgsIDQ2XSwgWzcsIDIyXSwgWzcsIDIyXSwgWzcsIDIyXSwgWzcsIDIyXSwgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgWzcsIDIzXSwgWzgsIDQ3XSwgWzgsIDQ3XSwgWzgsIDQ4XSwgWzgsIDQ4XSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzYsIDEzXSwgWzcsIDIwXSwgWzcsIDIwXSwgWzcsIDIwXSwgWzcsIDIwXSwgWzgsIDMzXSwgWzgsIDMzXSwgWzgsIDM0XSwgWzgsIDM0XSwgWzgsIDM1XSwgWzgsIDM1XSwgWzgsIDM2XSwgWzgsIDM2XSwgWzgsIDM3XSwgWzgsIDM3XSwgWzgsIDM4XSwgWzgsIDM4XSwgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgWzcsIDE5XSwgWzgsIDMxXSwgWzgsIDMxXSwgWzgsIDMyXSwgWzgsIDMyXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs2LCAxMl0sIFs4LCA1M10sIFs4LCA1M10sIFs4LCA1NF0sIFs4LCA1NF0sIFs3LCAyNl0sIFs3LCAyNl0sIFs3LCAyNl0sIFs3LCAyNl0sIFs4LCAzOV0sIFs4LCAzOV0sIFs4LCA0MF0sIFs4LCA0MF0sIFs4LCA0MV0sIFs4LCA0MV0sIFs4LCA0Ml0sIFs4LCA0Ml0sIFs4LCA0M10sIFs4LCA0M10sIFs4LCA0NF0sIFs4LCA0NF0sIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyMV0sIFs3LCAyOF0sIFs3LCAyOF0sIFs3LCAyOF0sIFs3LCAyOF0sIFs4LCA2MV0sIFs4LCA2MV0sIFs4LCA2Ml0sIFs4LCA2Ml0sIFs4LCA2M10sIFs4LCA2M10sIFs4LCAwXSwgWzgsIDBdLCBbOCwgMzIwXSwgWzgsIDMyMF0sIFs4LCAzODRdLCBbOCwgMzg0XSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDEwXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzUsIDExXSwgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgWzcsIDI3XSwgWzgsIDU5XSwgWzgsIDU5XSwgWzgsIDYwXSwgWzgsIDYwXSwgWzksIDE0NzJdLCBbOSwgMTUzNl0sIFs5LCAxNjAwXSwgWzksIDE3MjhdLCBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCBbNywgMThdLCBbNywgMjRdLCBbNywgMjRdLCBbNywgMjRdLCBbNywgMjRdLCBbOCwgNDldLCBbOCwgNDldLCBbOCwgNTBdLCBbOCwgNTBdLCBbOCwgNTFdLCBbOCwgNTFdLCBbOCwgNTJdLCBbOCwgNTJdLCBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCBbNywgMjVdLCBbOCwgNTVdLCBbOCwgNTVdLCBbOCwgNTZdLCBbOCwgNTZdLCBbOCwgNTddLCBbOCwgNTddLCBbOCwgNThdLCBbOCwgNThdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbOCwgNDQ4XSwgWzgsIDQ0OF0sIFs4LCA1MTJdLCBbOCwgNTEyXSwgWzksIDcwNF0sIFs5LCA3NjhdLCBbOCwgNjQwXSwgWzgsIDY0MF0sIFs4LCA1NzZdLCBbOCwgNTc2XSwgWzksIDgzMl0sIFs5LCA4OTZdLCBbOSwgOTYwXSwgWzksIDEwMjRdLCBbOSwgMTA4OF0sIFs5LCAxMTUyXSwgWzksIDEyMTZdLCBbOSwgMTI4MF0sIFs5LCAxMzQ0XSwgWzksIDE0MDhdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxNl0sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs2LCAxN10sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE0XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzYsIDE1XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzUsIDY0XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddXTsKY29uc3QgYmxhY2tUYWJsZTEgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWzEyLCBjY2l0dEVPTF0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdLCBbMTIsIDI1NjBdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMiwgNTJdLCBbMTIsIDUyXSwgWzEzLCA2NDBdLCBbMTMsIDcwNF0sIFsxMywgNzY4XSwgWzEzLCA4MzJdLCBbMTIsIDU1XSwgWzEyLCA1NV0sIFsxMiwgNTZdLCBbMTIsIDU2XSwgWzEzLCAxMjgwXSwgWzEzLCAxMzQ0XSwgWzEzLCAxNDA4XSwgWzEzLCAxNDcyXSwgWzEyLCA1OV0sIFsxMiwgNTldLCBbMTIsIDYwXSwgWzEyLCA2MF0sIFsxMywgMTUzNl0sIFsxMywgMTYwMF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzEzLCAxNjY0XSwgWzEzLCAxNzI4XSwgWzEyLCAzMjBdLCBbMTIsIDMyMF0sIFsxMiwgMzg0XSwgWzEyLCAzODRdLCBbMTIsIDQ0OF0sIFsxMiwgNDQ4XSwgWzEzLCA1MTJdLCBbMTMsIDU3Nl0sIFsxMiwgNT
20NdLCBbMTIsIDUzXSwgWzEyLCA1NF0sIFsxMiwgNTRdLCBbMTMsIDg5Nl0sIFsxMywgOTYwXSwgWzEzLCAxMDI0XSwgWzEzLCAxMDg4XSwgWzEzLCAxMTUyXSwgWzEzLCAxMjE2XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdXTsKY29uc3QgYmxhY2tUYWJsZTIgPSBbWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzgsIDEzXSwgWzExLCAyM10sIFsxMSwgMjNdLCBbMTIsIDUwXSwgWzEyLCA1MV0sIFsxMiwgNDRdLCBbMTIsIDQ1XSwgWzEyLCA0Nl0sIFsxMiwgNDddLCBbMTIsIDU3XSwgWzEyLCA1OF0sIFsxMiwgNjFdLCBbMTIsIDI1Nl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEyLCA0OF0sIFsxMiwgNDldLCBbMTIsIDYyXSwgWzEyLCA2M10sIFsxMiwgMzBdLCBbMTIsIDMxXSwgWzEyLCAzMl0sIFsxMiwgMzNdLCBbMTIsIDQwXSwgWzEyLCA0MV0sIFsxMSwgMjJdLCBbMTEsIDIyXSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzgsIDE0XSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDEwXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzcsIDExXSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzksIDE1XSwgWzEyLCAxMjhdLCBbMTIsIDE5Ml0sIFsxMiwgMjZdLCBbMTIsIDI3XSwgWzEyLCAyOF0sIFsxMiwgMjldLCBbMTEsIDE5XSwgWzExLCAxOV0sIFsxMSwgMjBdLCBbMTEsIDIwXSwgWzEyLCAzNF0sIFsxMiwgMzVdLCBbMTIsIDM2XSwgWzEyLCAzN10sIFsxMiwgMzhdLCBbMTIsIDM5XSwgWzExLCAyMV0sIFsxMSwgMjFdLCBbMTIsIDQyXSwgWzEyLCA0M10sIFsxMCwgMF0sIFsxMCwgMF0sIFsxMCwgMF0sIFsxMCwgMF0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl0sIFs3LCAxMl1dOwpjb25zdCBibGFja1RhYmxlMyA9IFtbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzYsIDldLCBbNiwgOF0sIFs1LCA3XSwgWzUsIDddLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXV07CmNsYXNzIENDSVRURmF4RGVjb2RlciB7CiAgY29uc3RydWN0b3Ioc291cmNlLCBvcHRpb25zID0ge30pIHsKICAgIGlmICh0eXBlb2Ygc291cmNlPy5uZXh0ICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQ0NJVFRGYXhEZWNvZGVyIC0gaW52YWxpZCAic291cmNlIiBwYXJhbWV0ZXIuJyk7CiAgICB9CiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgIHRoaXMuZW9mID0gZmFsc2U7CiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5LIHx8IDA7CiAgICB0aGlzLmVvbGluZSA9IG9wdGlvbnMuRW5kT2ZMaW5lIHx8IGZhbHNlOwogICAgdGhpcy5ieXRlQWxpZ24gPSBvcHRpb25zLkVuY29kZWRCeXRlQWxpZ24gfHwgZmFsc2U7CiAgICB0aGlzLmNvbHVtbnMgPSBvcHRpb25zLkNvbHVtbnMgfHwgMTcyODsKICAgIHRoaXMucm93cyA9IG9wdGlvbnMuUm93cyB8fCAwOwogICAgdGhpcy5lb2Jsb2NrID0gb3B0aW9ucy5FbmRPZkJsb2NrID8/IHRydWU7CiAgICB0aGlzLmJsYWNrID0gb3B0aW9ucy5CbGFja0lzMSB8fCBmYWxzZTsKICAgIHRoaXMuY29kaW5nTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAxKTsKICAgIHRoaXMucmVmTGluZSA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmNvbHVtbnMgKyAyKTsKICAgIHRoaXMuY29kaW5nTGluZVswXSA9IHRoaXMuY29sdW1uczsKICAgIHRoaXMuY29kaW5nUG9zID0gMDsKICAgIHRoaXMucm93ID0gMDsKICAgIHRoaXMubmV4dExpbmUyRCA9IHRoaXMuZW5jb2RpbmcgPCAwOwogICAgdGhpcy5pbnB1dEJpdHMgPSAwOwogICAgdGhpcy5pbnB1dEJ1ZiA9IDA7CiAgICB0aGlzLm91dHB1dEJpdHMgPSAwOwogICAgdGhpcy5yb3dzRG9uZSA9IGZhbHNlOwogICAgbGV0IGNvZGUxOwogICAgd2hpbGUgKChjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKSkgPT09IDApIHsKICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgIH0KICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgIH0KICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkgewogICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgI
20HRoaXMuX2VhdEJpdHMoMSk7CiAgICB9CiAgfQogIHJlYWROZXh0Q2hhcigpIHsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBjb25zdCByZWZMaW5lID0gdGhpcy5yZWZMaW5lOwogICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7CiAgICBsZXQgcmVmUG9zLCBibGFja1BpeGVscywgYml0cywgaTsKICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDApIHsKICAgICAgaWYgKHRoaXMucm93c0RvbmUpIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIHRoaXMuZXJyID0gZmFsc2U7CiAgICAgIGxldCBjb2RlMSwgY29kZTIsIGNvZGUzOwogICAgICBpZiAodGhpcy5uZXh0TGluZTJEKSB7CiAgICAgICAgZm9yIChpID0gMDsgY29kaW5nTGluZVtpXSA8IGNvbHVtbnM7ICsraSkgewogICAgICAgICAgcmVmTGluZVtpXSA9IGNvZGluZ0xpbmVbaV07CiAgICAgICAgfQogICAgICAgIHJlZkxpbmVbaSsrXSA9IGNvbHVtbnM7CiAgICAgICAgcmVmTGluZVtpXSA9IGNvbHVtbnM7CiAgICAgICAgY29kaW5nTGluZVswXSA9IDA7CiAgICAgICAgdGhpcy5jb2RpbmdQb3MgPSAwOwogICAgICAgIHJlZlBvcyA9IDA7CiAgICAgICAgYmxhY2tQaXhlbHMgPSAwOwogICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgIGNvZGUxID0gdGh
20pcy5fZ2V0VHdvRGltQ29kZSgpOwogICAgICAgICAgc3dpdGNoIChjb2RlMSkgewogICAgICAgICAgICBjYXNlIHR3b0RpbVBhc3M6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zICsgMV0sIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBpZiAocmVmTGluZVtyZWZQb3MgKyAxXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1Ib3JpejoKICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUyID0gMDsKICAgICAgICAgICAgICBpZiAoYmxhY2tQaXhlbHMpIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgY29kZTIgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gKyBjb2RlMSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUyLCBibGFja1BpeGVscyBeIDEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjM6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDMsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjI6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDIsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0UjE6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKHJlZkxpbmVbcmVmUG9zXSArIDEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0MDoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwzOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAzLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAtLXJlZlBvczsKICAgICAgICAgICAgICAgI
20H0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDI6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDIsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMToKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHsKICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgY2NpdHRFT0Y6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvbHVtbnMsIDApOwogICAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpbmZvKCJiYWQgMmQgY29kZSIpOwogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2x1bW5zLCAwKTsKICAgICAgICAgICAgICB0aGlzLmVyciA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvZGluZ0xpbmVbMF0gPSAwOwogICAgICAgIHRoaXMuY29kaW5nUG9zID0gMDsKICAgICAgICBibGFja1BpeGVscyA9IDA7CiAgICAgICAgd2hpbGUgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgY29kZTEgPSAwOwogICAgICAgICAgaWYgKGJsYWNrUGl4ZWxzKSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOwogICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRXaGl0ZUNvZGUoKTsKICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTEsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBnb3RFT0wgPSBmYWxzZTsKICAgICAgaWYgKHRoaXMuYnl0ZUFsaWduKSB7CiAgICAgICAgdGhpcy5pbnB1dEJpdHMgJj0gfjc7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmVvYmxvY2sgJiYgdGhpcy5yb3cgPT09IHRoaXMucm93cyAtIDEpIHsKICAgICAgICB0aGlzLnJvd3NEb25lID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgICBpZiAodGhpcy5lb2xpbmUpIHsKICAgICAgICAgIHdoaWxlIChjb2RlMSAhPT0gY2NpdHRFT0YgJiYgY29kZTEgIT09IDEpIHsKICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdoaWxlIChjb2RlMSA9PT0gMCkgewogICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgICAgICAgIGdvdEVPTCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChjb2RlMSA9PT0gY2NpdHRFT0YpIHsKICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmVvZiAmJiB0aGlzLmVuY29kaW5nID4gMCAmJiAhdGhpcy5yb3dzRG9uZSkgewogICAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTsKICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmVvYmxvY2sgJiYgZ290RU9MICYmIHRoaXMuYnl0ZUFsaWduKSB7CiAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgaWYgKGNvZGUxID09PSAxKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID4gMCkgewogICAgICAgICAgICB0aGlzLl9sb29rQml0cygxKTsKICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgI
20H0KICAgICAgICAgIGlmICh0aGlzLmVuY29kaW5nID49IDApIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgICAgICAgIGlmIChjb2RlMSAhPT0gMSkgewogICAgICAgICAgICAgICAgaW5mbygiYmFkIHJ0YyBjb2RlOiAiICsgY29kZTEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xvb2tCaXRzKDEpOwogICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5lcnIgJiYgdGhpcy5lb2xpbmUpIHsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMyk7CiAgICAgICAgICBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhKGNvZGUxICYgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbMF0gPiAwID8gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyA9IDBdIDogY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyA9IDFdOwogICAgICB0aGlzLnJvdysrOwogICAgfQogICAgbGV0IGM7CiAgICBpZiAodGhpcy5vdXRwdXRCaXRzID49IDgpIHsKICAgICAgYyA9IHRoaXMuY29kaW5nUG9zICYgMSA/IDAgOiAweGZmOwogICAgICB0aGlzLm91dHB1dEJpdHMgLT0gODsKICAgICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCAmJiBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICB0aGlzLmNvZGluZ1BvcysrOwogICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIC0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1BvcyAtIDFdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBiaXRzID0gODsKICAgICAgYyA9IDA7CiAgICAgIGRvIHsKICAgICAgICBpZiAodHlwZW9mIHRoaXMub3V0cHV0Qml0cyAhPT0gIm51bWJlciIpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcignSW52YWxpZCAvQ0NJVFRGYXhEZWNvZGUgZGF0YSwgIm91dHB1dEJpdHMiIG11c3QgYmUgYSBudW1iZXIuJyk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPiBiaXRzKSB7CiAgICAgICAgICBjIDw8PSBiaXRzOwogICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgewogICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIGJpdHM7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgLT0gYml0czsKICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjIDw8PSB0aGlzLm91dHB1dEJpdHM7CiAgICAgICAgICBpZiAoISh0aGlzLmNvZGluZ1BvcyAmIDEpKSB7CiAgICAgICAgICAgIGMgfD0gMHhmZiA+PiA4IC0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgfQogICAgICAgICAgYml0cyAtPSB0aGlzLm91dHB1dEJpdHM7CiAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSAwOwogICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICB0aGlzLmNvZGluZ1BvcysrOwogICAgICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKICAgICAgICAgIH0gZWxzZSBpZiAoYml0cyA+IDApIHsKICAgICAgICAgICAgYyA8PD0gYml0czsKICAgICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IHdoaWxlIChiaXRzKTsKICAgIH0KICAgIGlmICh0aGlzLmJsYWNrKSB7CiAgICAgIGMgXj0gMHhmZjsKICAgIH0KICAgIHJldHVybiBjOwogIH0KICBfYWRkUGl4ZWxzKGExLCBibGFja1BpeGVscykgewogICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvczsKICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgewogICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHsKICAgICAgICBpbmZvKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgIGExID0gdGhpcy5jb2x1bW5zOwogICAgICB9CiAgICAgIGlmIChjb2RpbmdQb3MgJiAxIF4gYmxhY2tQaXhlbHMpIHsKICAgICAgICArK2NvZGluZ1BvczsKICAgICAgfQogICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTsKICAgIH0KICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOwogIH0KICBfYWRkUGl4ZWxzTmVnKGExLCBibGFja1BpeGVscykgewogICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvczsKICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgewogICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHsKICAgICAgICBpbmZvKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgIGExID0gdGhpcy5jb2x1bW5zOwogICAgICB9CiAgICAgIGlmIChjb2RpbmdQb3MgJiAxIF4gYmxhY2tQaXhlbHMpIHsKICAgICAgICArK2NvZGluZ1BvczsKICAgICAgfQogICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTsKICAgIH0gZWxzZSBpZiAoYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExIDwgMCkgewogICAgICAgIGluZm8oImludmFsaWQgY29kZSIpOwogICAgICAgI
20HRoaXMuZXJyID0gdHJ1ZTsKICAgICAgICBhMSA9IDA7CiAgICAgIH0KICAgICAgd2hpbGUgKGNvZGluZ1BvcyA+IDAgJiYgYTEgPCBjb2RpbmdMaW5lW2NvZGluZ1BvcyAtIDFdKSB7CiAgICAgICAgLS1jb2RpbmdQb3M7CiAgICAgIH0KICAgICAgY29kaW5nTGluZVtjb2RpbmdQb3NdID0gYTE7CiAgICB9CiAgICB0aGlzLmNvZGluZ1BvcyA9IGNvZGluZ1BvczsKICB9CiAgX2ZpbmRUYWJsZUNvZGUoc3RhcnQsIGVuZCwgdGFibGUsIGxpbWl0KSB7CiAgICBjb25zdCBsaW1pdFZhbHVlID0gbGltaXQgfHwgMDsKICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgewogICAgICBsZXQgY29kZSA9IHRoaXMuX2xvb2tCaXRzKGkpOwogICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKICAgICAgICByZXR1cm4gW3RydWUsIDEsIGZhbHNlXTsKICAgICAgfQogICAgICBpZiAoaSA8IGVuZCkgewogICAgICAgIGNvZGUgPDw9IGVuZCAtIGk7CiAgICAgIH0KICAgICAgaWYgKCFsaW1pdFZhbHVlIHx8IGNvZGUgPj0gbGltaXRWYWx1ZSkgewogICAgICAgIGNvbnN0IHAgPSB0YWJsZVtjb2RlIC0gbGltaXRWYWx1ZV07CiAgICAgICAgaWYgKHBbMF0gPT09IGkpIHsKICAgICAgICAgIHRoaXMuX2VhdEJpdHMoaSk7CiAgICAgICAgICByZXR1cm4gW3RydWUsIHBbMV0sIHRydWVdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIFtmYWxzZSwgMCwgZmFsc2VdOwogIH0KICBfZ2V0VHdvRGltQ29kZSgpIHsKICAgIGxldCBjb2RlID0gMDsKICAgIGxldCBwOwogICAgaWYgKHRoaXMuZW9ibG9jaykgewogICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoNyk7CiAgICAgIHAgPSB0d29EaW1UYWJsZVtjb2RlXTsKICAgICAgaWYgKHA/LlswXSA+IDApIHsKICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOwogICAgICAgIHJldHVybiBwWzFdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEsIDcsIHR3b0RpbVRhYmxlKTsKICAgICAgaWYgKHJlc3VsdFswXSAmJiByZXN1bHRbMl0pIHsKICAgICAgICByZXR1cm4gcmVzdWx0WzFdOwogICAgICB9CiAgICB9CiAgICBpbmZvKCJCYWQgdHdvIGRpbSBjb2RlIik7CiAgICByZXR1cm4gY2NpdHRFT0Y7CiAgfQogIF9nZXRXaGl0ZUNvZGUoKSB7CiAgICBsZXQgY29kZSA9IDA7CiAgICBsZXQgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgcCA9IGNvZGUgPj4gNSA9PT0gMCA/IHdoaXRlVGFibGUxW2NvZGVdIDogd2hpdGVUYWJsZTJbY29kZSA+PiAzXTsKICAgICAgaWYgKHBbMF0gPiAwKSB7CiAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKICAgICAgICByZXR1cm4gcFsxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMSwgOSwgd2hpdGVUYWJsZTIpOwogICAgICBpZiAocmVzdWx0WzBdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDExLCAxMiwgd2hpdGVUYWJsZTEpOwogICAgICBpZiAocmVzdWx0WzBdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgfQogICAgaW5mbygiYmFkIHdoaXRlIGNvZGUiKTsKICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICByZXR1cm4gMTsKICB9CiAgX2dldEJsYWNrQ29kZSgpIHsKICAgIGxldCBjb2RlLCBwOwogICAgaWYgKHRoaXMuZW9ibG9jaykgewogICAgICBjb2RlID0gdGhpcy5fbG9va0JpdHMoMTMpOwogICAgICBpZiAoY29kZSA9PT0gY2NpdHRFT0YpIHsKICAgICAgICByZXR1cm4gMTsKICAgICAgfQogICAgICBpZiAoY29kZSA+PiA3ID09PSAwKSB7CiAgICAgICAgcCA9IGJsYWNrVGFibGUxW2NvZGVdOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPj4gOSA9PT0gMCAmJiBjb2RlID4+IDcgIT09IDApIHsKICAgICAgICBwID0gYmxhY2tUYWJsZTJbKGNvZGUgPj4gMSkgLSA2NF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcCA9IGJsYWNrVGFibGUzW2NvZGUgPj4gN107CiAgICAgIH0KICAgICAgaWYgKHBbMF0gPiAwKSB7CiAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKICAgICAgICByZXR1cm4gcFsxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMiwgNiwgYmxhY2tUYWJsZTMpOwogICAgICBpZiAocmVzdWx0WzBdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDcsIDEyLCBibGFja1RhYmxlMiwgNjQpOwogICAgICBpZiAocmVzdWx0WzBdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgICByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDEwLCAxMywgYmxhY2tUYWJsZTEpOwogICAgICBpZiAocmVzdWx0WzBdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgfQogICAgaW5mbygiYmFkIGJsYWNrIGNvZGUiKTsKICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICByZXR1cm4gMTsKICB9CiAgX2xvb2tCaXRzKG4pIHsKICAgIGxldCBjOwogICAgd2hpbGUgKHRoaXMuaW5wdXRCaXRzIDwgbikgewogICAgICBpZiAoKGMgPSB0aGlzLnNvdXJjZS5uZXh0KCkpID09PSAtMSkgewogICAgICAgIGlmICh0aGlzLmlucHV0Qml0cyA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIGNjaXR0RU9GOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEJ1ZiA8PCBuIC0gdGhpcy5pbnB1dEJpdHMgJiAweGZmZmYgPj4gMTYgLSBuOwogICAgICB9CiAgICAgIHRoaXMuaW5wdXRCdWYgPSB0aGlzLmlucHV0QnVmIDw8IDggfCBjOwogICAgICB0aGlzLmlucHV0Qml0cyArPSA4OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPj4gdGhpcy5pbnB1dEJpdHMgLSBuICYgMHhmZmZmID4+IDE2IC0gbjsKICB9CiAgX2VhdEJpdHMobikgewogICAgaWYgKCh0aGlzLmlucHV0Qml0cyAtPSBuKSA8IDApIHsKICAgICAgdGhpcy5pbnB1dEJpdHMgPSAwOwogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2NpdHRfc3RyZWFtLmpzCgoKCmNsYXNzIENDSVRURmF4U3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICBpZiAoIShwYXJhbXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICBwYXJhbXMgPSBEaWN0LmVtcHR5OwogICAgfQogICAgY29uc3Qgc291cmNlID0gewogICAgICBuZXh0KCkgewogICAgICAgI
20HJldHVybiBzdHIuZ2V0Qnl0ZSgpOwogICAgICB9CiAgICB9OwogICAgdGhpcy5jY2l0dEZheERlY29kZXIgPSBuZXcgQ0NJVFRGYXhEZWNvZGVyKHNvdXJjZSwgewogICAgICBLOiBwYXJhbXMuZ2V0KCJLIiksCiAgICAgIEVuZE9mTGluZTogcGFyYW1zLmdldCgiRW5kT2ZMaW5lIiksCiAgICAgIEVuY29kZWRCeXRlQWxpZ246IHBhcmFtcy5nZXQoIkVuY29kZWRCeXRlQWxpZ24iKSwKICAgICAgQ29sdW1uczogcGFyYW1zLmdldCgiQ29sdW1ucyIpLAogICAgICBSb3dzOiBwYXJhbXMuZ2V0KCJSb3dzIiksCiAgICAgIEVuZE9mQmxvY2s6IHBhcmFtcy5nZXQoIkVuZE9mQmxvY2siKSwKICAgICAgQmxhY2tJczE6IHBhcmFtcy5nZXQoIkJsYWNrSXMxIikKICAgIH0pOwogIH0KICByZWFkQmxvY2soKSB7CiAgICB3aGlsZSAoIXRoaXMuZW9mKSB7CiAgICAgIGNvbnN0IGMgPSB0aGlzLmNjaXR0RmF4RGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKICAgICAgaWYgKGMgPT09IC0xKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIDEpOwogICAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXSA9IGM7CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9mbGF0ZV9zdHJlYW0uanMKCgoKCgoKCgoKCmNvbnN0IGNvZGVMZW5Db2RlTWFwID0gbmV3IEludDMyQXJyYXkoWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdKTsKY29uc3QgbGVuZ3RoRGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDMsIDB4MDAwMDQsIDB4MDAwMDUsIDB4MDAwMDYsIDB4MDAwMDcsIDB4MDAwMDgsIDB4MDAwMDksIDB4MDAwMGEsIDB4MTAwMGIsIDB4MTAwMGQsIDB4MTAwMGYsIDB4MTAwMTEsIDB4MjAwMTMsIDB4MjAwMTcsIDB4MjAwMWIsIDB4MjAwMWYsIDB4MzAwMjMsIDB4MzAwMmIsIDB4MzAwMzMsIDB4MzAwM2IsIDB4NDAwNDMsIDB4NDAwNTMsIDB4NDAwNjMsIDB4NDAwNzMsIDB4NTAwODMsIDB4NTAwYTMsIDB4NTAwYzMsIDB4NTAwZTMsIDB4MDAxMDIsIDB4MDAxMDIsIDB4MDAxMDJdKTsKY29uc3QgZGlzdERlY29kZSA9IG5ldyBJbnQzMkFycmF5KFsweDAwMDAxLCAweDAwMDAyLCAweDAwMDAzLCAweDAwMDA0LCAweDEwMDA1LCAweDEwMDA3LCAweDIwMDA5LCAweDIwMDBkLCAweDMwMDExLCAweDMwMDE5LCAweDQwMDIxLCAweDQwMDMxLCAweDUwMDQxLCAweDUwMDYxLCAweDYwMDgxLCAweDYwMGMxLCAweDcwMTAxLCAweDcwMTgxLCAweDgwMjAxLCAweDgwMzAxLCAweDkwNDAxLCAweDkwNjAxLCAweGEwODAxLCAweGEwYzAxLCAweGIxMDAxLCAweGIxODAxLCAweGMyMDAxLCAweGMzMDAxLCAweGQ0MDAxLCAweGQ2MDAxXSk7CmNvbnN0IGZpeGVkTGl0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMCwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMCwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMCwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MCwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMCwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMCwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMCwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOCwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOCwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOCwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OCwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOCwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOCwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOCwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNCwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNCwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNCwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NCwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNCwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNCwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNCwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjYywgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhYywgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlYywgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5YywgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkYywgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiYywgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmYywgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMiwgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMiwgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMiwgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MiwgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMiwgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMiwgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMiwgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYSwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYSwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYSwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YSwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYSwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYSwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYSwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNiwgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNiwgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNiwgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NiwgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNiwgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNiwgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNiwgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZSwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZSwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZSwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZSwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZSwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZSwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZSwgMHg3MDEwMCwgMHg4MDA1MCwgMHg4MDAxMCwgMHg4MDExOCwgMHg3MDExMCwgMHg4MDA3MCwgMHg4MDAzMCwgMHg5MDBjMSwgMHg3MDEwOCwgMHg4MDA2MCwgMHg4MDAyMCwgMHg5MDBhMSwgMHg4MDAwMCwgMHg4MDA4MCwgMHg4MDA0MCwgMHg5MDBlMSwgMHg3MDEwNCwgMHg4MDA1OCwgMHg4MDAxOCwgMHg5MDA5MSwgMHg3MDExNCwgMHg4MDA3OCwgMHg4MDAzOCwgMHg5MDBkMSwgMHg3MDEwYywgMHg4MDA2OCwgMHg4MDAyOCwgMHg5MDBiMSwgMHg4MDAwOCwgMHg4MDA4OCwgMHg4MDA0OCwgMHg5MDBmMSwgMHg3MDEwMiwgMHg4MDA1NCwgMHg4MDAxNCwgMHg4MDExYywgMHg3MDExMiwgMHg4MDA3NCwgMHg4MDAzNCwgMHg5MDBjOSwgMHg3MDEwYSwgMHg4MDA2NCwgMHg4MDAyNCwgMHg5MDBhOSwgMHg4MDAwNCwgMHg4MDA4NCwgMHg4MDA0NCwgMHg5MDBlOSwgMHg3MDEwNiwgMHg4MDA1YywgMHg4MDAxYywgMHg5MDA5OSwgMHg3MDExNiwgMHg4MDA3YywgMHg4MDAzYywgMHg5MDBkOSwgMHg3MDEwZSwgMHg4MDA2YywgMHg4MDAyYywgMHg5MDBiOSwgMHg4MDAwYywgMHg4MDA4YywgMHg4MDA0YywgMHg5MDBmOSwgMHg3MDEwMSwgMHg4MDA1MiwgMHg4MDAxMiwgMHg4MDExYSwgMHg3MDExMSwgMHg4MDA3MiwgMHg4MDAzMiwgMHg5MDBjNSwgMHg3MDEwOSwgMHg4MDA2MiwgMHg4MDAyMiwgMHg5MDBhNSwgMHg4MDAwMiwgMHg4MDA4MiwgMHg4MDA0MiwgMHg5MDBlNSwgMHg3MDEwNSwgMHg4MDA1YSwgMHg4MDAxYSwgMHg5MDA5NSwgMHg3MDExNSwgMHg4MDA3YSwgMHg4MDAzYSwgMHg5MDBkNSwgMHg3MDEwZCwgMHg4MDA2YSwgMHg4MDAyYSwgMHg5MDBiNSwgMHg4MDAwYSwgMHg4MDA4YSwgMHg4MDA0YSwgMHg5MDBmNSwgMHg3MDEwMywgMHg4MDA1NiwgMHg4MDAxNiwgMHg4MDExZSwgMHg3MDExMywgMHg4MDA3NiwgMHg4MDAzNiwgMHg5MDBjZCwgMHg3MDEwYiwgMHg4MDA2NiwgMHg4MDAyNiwgMHg5MDBhZCwgMHg4MDAwNiwgMHg4MDA4NiwgMHg4MDA0NiwgMHg5MDBlZCwgMHg3MDEwNywgMHg4MDA1ZSwgMHg4MDAxZSwgMHg5MDA5ZCwgMHg3MDExNywgMHg4MDA3ZSwgMHg4MDAzZSwgMHg5MDBkZCwgMHg3MDEwZiwgMHg4MDA2ZSwgMHg4MDAyZSwgMHg5MDBiZCwgMHg4MDAwZSwgMHg4MDA4ZSwgMHg4MDA0ZSwgMHg5MDBmZCwgMHg3MDEwMCwgMHg4MDA1MSwgMHg4MDAxMSwgMHg4MDExOSwgMHg3MDExMCwgMHg4MDA3MSwgMHg4MDAzMSwgMHg5MDBjMywgMHg3MDEwOCwgMHg4MDA2MSwgMHg4MDAyMSwgMHg5MDBhMywgMHg4MDAwMSwgMHg4MDA4MSwgMHg4MDA0MSwgMHg5MDBlMywgMHg3MDEwNCwgMHg4MDA1OSwgMHg4MDAxOSwgMHg5MDA5MywgMHg3MDExNCwgMHg4MDA3OSwgMHg4MDAzOSwgMHg5MDBkMywgMHg3MDEwYywgMHg4MDA2OSwgMHg4MDAyOSwgMHg5MDBiMywgMHg4MDAwOSwgMHg4MDA4OSwgMHg4MDA0OSwgMHg5MDBmMywgMHg3MDEwMiwgMHg4MDA1NSwgMHg4MDAxNSwgMHg4MDExZCwgMHg3MDExMiwgMHg4MDA3NSwgMHg4MDAzNSwgMHg5MDBjYiwgMHg3MDEwYSwgMHg4MDA2NSwgMHg4MDAyNSwgMHg5MDBhYiwgMHg4MDAwNSwgMHg4MDA4NSwgMHg4MDA0NSwgMHg5MDBlYiwgMHg3MDEwNiwgMHg4MDA1ZCwgMHg4MDAxZCwgMHg5MDA5YiwgMHg3MDExNiwgMHg4MDA3ZCwgMHg4MDAzZCwgMHg5MDBkYiwgMHg3MDEwZSwgMHg4MDA2ZCwgMHg4MDAyZCwgMHg5MDBiYiwgMHg4MDAwZCwgMHg4MDA4ZCwgMHg4MDA0ZCwgMHg5MDBmYiwgMHg3MDEwMSwgMHg4MDA1MywgMHg4MDAxMywgMHg4MDExYiwgMHg3MDExMSwgMHg4MDA3MywgMHg4MDAzMywgMHg5MDBjNywgMHg3MDEwOSwgMHg4MDA2MywgMHg4MDAyMywgMHg5MDBhNywgMHg4MDAwMywgMHg4MDA4MywgMHg4MDA0MywgMHg5MDBlNywgMHg3MDEwNSwgMHg4MDA1YiwgMHg4MDAxYiwgMHg5MDA5NywgMHg3MDExNSwgMHg4MDA3YiwgMHg4MDAzYiwgMHg5MDBkNywgMHg3MDEwZCwgMHg4MDA2YiwgMHg4MDAyYiwgMHg5MDBiNywgMHg4MDAwYiwgMHg4MDA4YiwgMHg4MDA0YiwgMHg5MDBmNywgMHg3MDEwMywgMHg4MDA1NywgMHg4MDAxNywgMHg4MDExZiwgMHg3MDExMywgMHg4MDA3NywgMHg4MDAzNywgMHg5MDBjZiwgMHg3MDEwYiwgMHg4MDA2NywgMHg4MDAyNywgMHg5MDBhZiwgMHg4MDAwNywgMHg4MDA4NywgMHg4MDA0NywgMHg5MDBlZiwgMHg3MDEwNywgMHg4MDA1ZiwgMHg4MDAxZiwgMHg5MDA5ZiwgMHg3MDExNywgMHg4MDA3ZiwgMHg4MDAzZiwgMHg5MDBkZiwgMHg3MDEwZiwgMHg4MDA2ZiwgMHg4MDAyZiwgMHg5MDBiZiwgMHg4MDAwZiwgMHg4MDA4ZiwgMHg4MDA0ZiwgMHg5MDBmZl0pLCA5XTsKY29uc3QgZml4ZWREaXN0Q29kZVRhYiA9IFtuZXcgSW50MzJBcnJheShbMHg1MDAwMCwgMHg1MDAxMCwgMHg1MDAwOCwgMHg1MDAxOCwgMHg1MDAwNCwgMHg1MDAxNCwgMHg1MDAwYywgMHg1MDAxYywgMHg1MDAwMiwgMHg1MDAxMiwgMHg1MDAwYSwgMHg1MDAxYSwgMHg1MDAwNiwgMHg1MDAxNiwgMHg1MDAwZSwgMHgwMDAwMCwgMHg1MDAwMSwgMHg1MDAxMSwgMHg1MDAwOSwgMHg1MDAxOSwgMHg1MDAwNSwgMHg1MDAxNSwgMHg1MDAwZCwgMHg1MDAxZCwgMHg1MDAwMywgMHg1MDAxMywgMHg1MDAwYiwgMHg1MDAxYiwgMHg1MDAwNywgMHg1MDAxNywgMHg1MDAwZiwgMHgwMDAwMF0pLCA1XTsKY2xhc3MgRmxhdGVTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICBjb25zdCBjbWYgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgY29uc3QgZmxnID0gc3RyLmdldEJ5dGUoKTsKICAgIGlmIChjbWYgPT09IC0xIHx8IGZsZyA9PT0gLTEpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoKGNtZiAmIDB4MGYpICE9PSAweDA4KSB7CiAgICAgI
20HRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgaWYgKCgoY21mIDw8IDgpICsgZmxnKSAlIDMxICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgQmFkIEZDSEVDSyBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoZmxnICYgMHgyMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEZESUNUIGJpdCBzZXQgaW4gZmxhdGUgc3RyZWFtOiAke2NtZn0sICR7ZmxnfWApOwogICAgfQogICAgdGhpcy5jb2RlU2l6ZSA9IDA7CiAgICB0aGlzLmNvZGVCdWYgPSAwOwogIH0KICBhc3luYyBnZXRJbWFnZURhdGEobGVuZ3RoLCBfZGVjb2Rlck9wdGlvbnMpIHsKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmFzeW5jR2V0Qnl0ZXMoKTsKICAgIHJldHVybiBkYXRhPy5zdWJhcnJheSgwLCBsZW5ndGgpIHx8IHRoaXMuZ2V0Qnl0ZXMobGVuZ3RoKTsKICB9CiAgYXN5bmMgYXN5bmNHZXRCeXRlcygpIHsKICAgIHRoaXMuc3RyLnJlc2V0KCk7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKCk7CiAgICB0cnkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVhZGFibGUsCiAgICAgICAgd3JpdGFibGUKICAgICAgfSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCJkZWZsYXRlIik7CiAgICAgIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICBhd2FpdCB3cml0ZXIucmVhZHk7CiAgICAgIHdyaXRlci53cml0ZShieXRlcykudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICAgIGF3YWl0IHdyaXRlci5jbG9zZSgpOwogICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7CiAgICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgICBsZXQgdG90YWxMZW5ndGggPSAwOwogICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlYWRhYmxlKSB7CiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgICAgIHRvdGFsTGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTsKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7CiAgICAgICAgZGF0YS5zZXQoY2h1bmssIG9mZnNldCk7CiAgICAgICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7CiAgICAgIH0KICAgICAgcmV0dXJuIGRhdGE7CiAgICB9IGNhdGNoIHsKICAgICAgdGhpcy5zdHIgPSBuZXcgU3RyZWFtKGJ5dGVzLCAyLCBieXRlcy5sZW5ndGgsIHRoaXMuc3RyLmRpY3QpOwogICAgICB0aGlzLnJlc2V0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICBnZXQgaXNBc3luYygpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBnZXRCaXRzKGJpdHMpIHsKICAgIGNvbnN0IHN0ciA9IHRoaXMuc3RyOwogICAgbGV0IGNvZGVTaXplID0gdGhpcy5jb2RlU2l6ZTsKICAgIGxldCBjb2RlQnVmID0gdGhpcy5jb2RlQnVmOwogICAgbGV0IGI7CiAgICB3aGlsZSAoY29kZVNpemUgPCBiaXRzKSB7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKICAgICAgY29kZVNpemUgKz0gODsKICAgIH0KICAgIGIgPSBjb2RlQnVmICYgKDEgPDwgYml0cykgLSAxOwogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBiaXRzOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC09IGJpdHM7CiAgICByZXR1cm4gYjsKICB9CiAgZ2V0Q29kZSh0YWJsZSkgewogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBjb25zdCBjb2RlcyA9IHRhYmxlWzBdOwogICAgY29uc3QgbWF4TGVuID0gdGFibGVbMV07CiAgICBsZXQgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOwogICAgbGV0IGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CiAgICBsZXQgYjsKICAgIHdoaWxlIChjb2RlU2l6ZSA8IG1heExlbikgewogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb2RlQnVmIHw9IGIgPDwgY29kZVNpemU7CiAgICAgIGNvZGVTaXplICs9IDg7CiAgICB9CiAgICBjb25zdCBjb2RlID0gY29kZXNbY29kZUJ1ZiAmICgxIDw8IG1heExlbikgLSAxXTsKICAgIGNvbnN0IGNvZGVMZW4gPSBjb2RlID4+IDE2OwogICAgY29uc3QgY29kZVZhbCA9IGNvZGUgJiAweGZmZmY7CiAgICBpZiAoY29kZUxlbiA8IDEgfHwgY29kZVNpemUgPCBjb2RlTGVuKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGVuY29kaW5nIGluIGZsYXRlIHN0cmVhbSIpOwogICAgfQogICAgdGhpcy5jb2RlQnVmID0gY29kZUJ1ZiA+PiBjb2RlTGVuOwogICAgdGhpcy5jb2RlU2l6ZSA9IGNvZGVTaXplIC0gY29kZUxlbjsKICAgIHJldHVybiBjb2RlVmFsOwogIH0KICBnZW5lcmF0ZUh1ZmZtYW5UYWJsZShsZW5ndGhzKSB7CiAgICBjb25zdCBuID0gbGVuZ3Rocy5sZW5ndGg7CiAgICBsZXQgbWF4TGVuID0gMDsKICAgIGxldCBpOwogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobGVuZ3Roc1tpXSA+IG1heExlbikgewogICAgICAgIG1heExlbiA9IGxlbmd0aHNbaV07CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNpemUgPSAxIDw8IG1heExlbjsKICAgIGNvbnN0IGNvZGVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7CiAgICBmb3IgKGxldCBsZW4gPSAxLCBjb2RlID0gMCwgc2tpcCA9IDI7IGxlbiA8PSBtYXhMZW47ICsrbGVuLCBjb2RlIDw8PSAxLCBza2lwIDw8PSAxKSB7CiAgICAgIGZvciAobGV0IHZhbCA9IDA7IHZhbCA8IG47ICsrdmFsKSB7CiAgICAgICAgaWYgKGxlbmd0aHNbdmFsXSA9PT0gbGVuKSB7CiAgICAgICAgICBsZXQgY29kZTIgPSAwOwogICAgICAgICAgbGV0IHQgPSBjb2RlOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgIGNvZGUyID0gY29kZTIgPDwgMSB8IHQgJiAxOwogICAgICAgICAgICB0ID4+PSAxOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChpID0gY29kZTI7IGkgPCBzaXplOyBpICs9IHNraXApIHsKICAgICAgICAgICAgY29
20kZXNbaV0gPSBsZW4gPDwgMTYgfCB2YWw7CiAgICAgICAgICB9CiAgICAgICAgICArK2NvZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gW2NvZGVzLCBtYXhMZW5dOwogIH0KICAjZW5kc1N0cmVhbU9uRXJyb3IoZXJyKSB7CiAgICBpbmZvKGVycik7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBidWZmZXIsIGhkciwgbGVuOwogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICB0cnkgewogICAgICBoZHIgPSB0aGlzLmdldEJpdHMoMyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcihleC5tZXNzYWdlKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGhkciAmIDEpIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgfQogICAgaGRyID4+PSAxOwogICAgaWYgKGhkciA9PT0gMCkgewogICAgICBsZXQgYjsKICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CiAgICAgICAgdGhpcy4jZW5kc1N0cmVhbU9uRXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBibG9ja0xlbiA9IGI7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBibG9ja0xlbiB8PSBiIDw8IDg7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRoaXMuI2VuZHNTdHJlYW1PbkVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgY2hlY2sgPSBiOwogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICB0aGlzLiNlbmRzU3RyZWFtT25FcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY2hlY2sgfD0gYiA8PCA4OwogICAgICBpZiAoY2hlY2sgIT09ICh+YmxvY2tMZW4gJiAweGZmZmYpICYmIChibG9ja0xlbiAhPT0gMCB8fCBjaGVjayAhPT0gMCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkJhZCB1bmNvbXByZXNzZWQgYmxvY2sgbGVuZ3RoIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIHRoaXMuY29kZUJ1ZiA9IDA7CiAgICAgIHRoaXMuY29kZVNpemUgPSAwOwogICAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aCwKICAgICAgICBlbmQgPSBidWZmZXJMZW5ndGggKyBibG9ja0xlbjsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoZW5kKTsKICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmQ7CiAgICAgIGlmIChibG9ja0xlbiA9PT0gMCkgewogICAgICAgIGlmIChzdHIucGVla0J5dGUoKSA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmxvY2sgPSBzdHIuZ2V0Qnl0ZXMoYmxvY2tMZW4pOwogICAgICAgIGJ1ZmZlci5zZXQoYmxvY2ssIGJ1ZmZlckxlbmd0aCk7CiAgICAgICAgaWYgKGJsb2NrLmxlbmd0aCA8IGJsb2NrTGVuKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBsaXRDb2RlVGFibGU7CiAgICBsZXQgZGlzdENvZGVUYWJsZTsKICAgIGlmIChoZHIgPT09IDEpIHsKICAgICAgbGl0Q29kZVRhYmxlID0gZml4ZWRMaXRDb2RlVGFiOwogICAgICBkaXN0Q29kZVRhYmxlID0gZml4ZWREaXN0Q29kZVRhYjsKICAgIH0gZWxzZSBpZiAoaGRyID09PSAyKSB7CiAgICAgIGNvbnN0IG51bUxpdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMjU3OwogICAgICBjb25zdCBudW1EaXN0Q29kZXMgPSB0aGlzLmdldEJpdHMoNSkgKyAxOwogICAgICBjb25zdCBudW1Db2RlTGVuQ29kZXMgPSB0aGlzLmdldEJpdHMoNCkgKyA0OwogICAgICBjb25zdCBjb2RlTGVuQ29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuQ29kZU1hcC5sZW5ndGgpOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bUNvZGVMZW5Db2RlczsgKytpKSB7CiAgICAgICAgY29kZUxlbkNvZGVMZW5ndGhzW2NvZGVMZW5Db2RlTWFwW2ldXSA9IHRoaXMuZ2V0Qml0cygzKTsKICAgICAgfQogICAgICBjb25zdCBjb2RlTGVuQ29kZVRhYiA9IHRoaXMuZ2VuZXJhdGVIdWZmbWFuVGFibGUoY29kZUxlbkNvZGVMZW5ndGhzKTsKICAgICAgbGVuID0gMDsKICAgICAgaSA9IDA7CiAgICAgIGNvbnN0IGNvZGVzID0gbnVtTGl0Q29kZXMgKyBudW1EaXN0Q29kZXM7CiAgICAgIGNvbnN0IGNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZXMpOwogICAgICBsZXQgYml0c0xlbmd0aCwgYml0c09mZnNldCwgd2hhdDsKICAgICAgd2hpbGUgKGkgPCBjb2RlcykgewogICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmdldENvZGUoY29kZUxlbkNvZGVUYWIpOwogICAgICAgIGlmIChjb2RlID09PSAxNikgewogICAgICAgICAgYml0c0xlbmd0aCA9IDI7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW47CiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAxNykgewogICAgICAgICAgYml0c0xlbmd0aCA9IDM7CiAgICAgICAgICBiaXRzT2Zmc2V0ID0gMzsKICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTgpIHsKICAgICAgICAgIGJpdHNMZW5ndGggPSA3OwogICAgICAgICAgYml0c09mZnNldCA9IDExOwogICAgICAgICAgd2hhdCA9IGxlbiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSBsZW4gPSBjb2RlOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCByZXBlYXRMZW5ndGggPSB0aGlzLmdldEJpdHMoYml0c0xlbmd0aCkgKyBiaXRzT2Zmc2V0OwogICAgICAgI
20HdoaWxlIChyZXBlYXRMZW5ndGgtLSA+IDApIHsKICAgICAgICAgIGNvZGVMZW5ndGhzW2krK10gPSB3aGF0OwogICAgICAgIH0KICAgICAgfQogICAgICBsaXRDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KDAsIG51bUxpdENvZGVzKSk7CiAgICAgIGRpc3RDb2RlVGFibGUgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLnN1YmFycmF5KG51bUxpdENvZGVzLCBjb2RlcykpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGJsb2NrIHR5cGUgaW4gZmxhdGUgc3RyZWFtIik7CiAgICB9CiAgICBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBsaW1pdCA9IGJ1ZmZlciA/IGJ1ZmZlci5sZW5ndGggOiAwOwogICAgbGV0IHBvcyA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgbGV0IGNvZGUxID0gdGhpcy5nZXRDb2RlKGxpdENvZGVUYWJsZSk7CiAgICAgIGlmIChjb2RlMSA8IDI1NikgewogICAgICAgIGlmIChwb3MgKyAxID49IGxpbWl0KSB7CiAgICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyAxKTsKICAgICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IGNvZGUxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjb2RlMSA9PT0gMjU2KSB7CiAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBwb3M7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvZGUxIC09IDI1NzsKICAgICAgY29kZTEgPSBsZW5ndGhEZWNvZGVbY29kZTFdOwogICAgICBsZXQgY29kZTIgPSBjb2RlMSA+PiAxNjsKICAgICAgaWYgKGNvZGUyID4gMCkgewogICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKICAgICAgfQogICAgICBsZW4gPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGNvZGUxID0gdGh
20pcy5nZXRDb2RlKGRpc3RDb2RlVGFibGUpOwogICAgICBjb2RlMSA9IGRpc3REZWNvZGVbY29kZTFdOwogICAgICBjb2RlMiA9IGNvZGUxID4+IDE2OwogICAgICBpZiAoY29kZTIgPiAwKSB7CiAgICAgICAgY29kZTIgPSB0aGlzLmdldEJpdHMoY29kZTIpOwogICAgICB9CiAgICAgIGNvbnN0IGRpc3QgPSAoY29kZTEgJiAweGZmZmYpICsgY29kZTI7CiAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGltaXQpIHsKICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihwb3MgKyBsZW4pOwogICAgICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKICAgICAgfQogICAgICBmb3IgKGxldCBrID0gMDsgayA8IGxlbjsgKytrLCArK3BvcykgewogICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGRpc3RdOwogICAgICB9CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9hcml0aG1ldGljX2RlY29kZXIuanMKY29uc3QgUWVUYWJsZSA9IFt7CiAgcWU6IDB4NTYwMSwKICBubXBzOiAxLAogIG5scHM6IDEsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4MzQwMSwKICBubXBzOiAyLAogIG5scHM6IDYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTgwMSwKICBubXBzOiAzLAogIG5scHM6IDksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiA0LAogIG5scHM6IDEyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA1MjEsCiAgbm1wczogNSwKICBubHBzOiAyOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMjIxLAogIG5tcHM6IDM4LAogIG5scHM6IDMzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogNywKICBubHBzOiA2LAogIHN3aXRjaEZsYWc6IDEKfSwgewogIHFlOiAweDU0MDEsCiAgbm1wczogOCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg0ODAxLAogIG5tcHM6IDksCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxMCwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzMDAxLAogIG5tcHM6IDExLAogIG5scHM6IDE3LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDI0MDEsCiAgbm1wczogMTIsCiAgbmxwczogMTgsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAxMywKICBubHBzOiAyMCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxNjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDIxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogMTUsCiAgbmxwczogMTQsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4NTQwMSwKICBubXBzOiAxNiwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1MTAxLAogIG5tcHM6IDE3LAogIG5scHM6IDE1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDQ4MDEsCiAgbm1wczogMTgsCiAgbmxwczogMTYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzgwMSwKICBubXBzOiAxOSwKICBubHBzOiAxNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzNDAxLAogIG5tcHM6IDIwLAogIG5scHM6IDE4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDMwMDEsCiAgbm1wczogMjEsCiAgbmxwczogMTksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MjgwMSwKICBubXBzOiAyMiwKICBubHBzOiAxOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgyNDAxLAogIG5tcHM6IDIzLAogIG5scHM6IDIwLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDIyMDEsCiAgbm1wczogMjQsCiAgbmxwczogMjEsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MWMwMSwKICBubXBzOiAyNSwKICBubHBzOiAyMiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxODAxLAogIG5tcHM6IDI2LAogIG5scHM6IDIzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDE2MDEsCiAgbm1wczogMjcsCiAgbmxwczogMjQsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTQwMSwKICBubXBzOiAyOCwKICBubHBzOiAyNSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxMjAxLAogIG5tcHM6IDI5LAogIG5scHM6IDI2LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDExMDEsCiAgbm1wczogMzAsCiAgbmxwczogMjcsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MGFjMSwKICBubXBzOiAzMSwKICBubHBzOiAyOCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwOWMxLAogIG5tcHM6IDMyLAogIG5scHM6IDI5LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA4YTEsCiAgbm1wczogMzMsCiAgbmxwczogMzAsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDUyMSwKICBubXBzOiAzNCwKICBubHBzOiAzMSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwNDQxLAogIG5tcHM6IDM1LAogIG5scHM6IDMyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAyYTEsCiAgbm1wczogMzYsCiAgbmxwczogMzMsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDIyMSwKICBubXBzOiAzNywKICBubHBzOiAzNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMTQxLAogIG5tcHM6IDM4LAogIG5scHM6IDM1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAxMTEsCiAgbm1wczogMzksCiAgbmxwczogMzYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDA4NSwKICBubXBzOiA0MCwKICBubHBzOiAzNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDQ5LAogIG5tcHM6IDQxLAogIG5scHM6IDM4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMjUsCiAgbm1wczogNDIsCiAgbmxwczogMzksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAxNSwKICBubXBzOiA0MywKICBubHBzOiA0MCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDA5LAogIG5tcHM6IDQ0LAogIG5scHM6IDQxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMDUsCiAgbm1wczogNDUsCiAgbmxwczogNDIsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAwMSwKICBubXBzOiA0NSwKICBubHBzOiA0MywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHg1NjAxLAogIG5tcHM6IDQ2LAogIG5scHM6IDQ2LAogIHN3aXRjaEZsYWc6IDAKfV07CmNsYXNzIEFyaXRobWV0aWNEZWNvZGVyIHsKICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy5icCA9IHN0YXJ0OwogICAgdGhpcy5kYXRhRW5kID0gZW5kOwogICAgdGhpcy5jaGlnaCA9IGRhdGFbc3RhcnRdOwogICAgdGhpcy5jbG93ID0gMDsKICAgIHRoaXMuYnl0ZUluKCk7CiAgICB0aGlzLmNoaWdoID0gdGh
20pcy5jaGlnaCA8PCA3ICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDkgJiAweDdmOwogICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDcgJiAweGZmZmY7CiAgICB0aGlzLmN0IC09IDc7CiAgICB0aGlzLmEgPSAweDgwMDA7CiAgfQogIGJ5dGVJbigpIHsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7CiAgICBsZXQgYnAgPSB0aGlzLmJwOwogICAgaWYgKGRhdGFbYnBdID09PSAweGZmKSB7CiAgICAgIGlmIChkYXRhW2JwICsgMV0gPiAweDhmKSB7CiAgICAgICAgdGhpcy5jbG93ICs9IDB4ZmYwMDsKICAgICAgICB0aGlzLmN0ID0gODsKICAgICAgfSBlbHNlIHsKICAgICAgICBicCsrOwogICAgICAgIHRoaXMuY2xvdyArPSBkYXRhW2JwXSA8PCA5OwogICAgICAgIHRoaXMuY3QgPSA3OwogICAgICAgIHRoaXMuYnAgPSBicDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYnArKzsKICAgICAgdGhpcy5jbG93ICs9IGJwIDwgdGhpcy5kYXRhRW5kID8gZGF0YVticF0gPDwgOCA6IDB4ZmYwMDsKICAgICAgdGhpcy5jdCA9IDg7CiAgICAgIHRoaXMuYnAgPSBicDsKICAgIH0KICAgIGlmICh0aGlzLmNsb3cgPiAweGZmZmYpIHsKICAgICAgdGhpcy5jaGlnaCArPSB0aGlzLmNsb3cgPj4gMTY7CiAgICAgIHRoaXMuY2xvdyAmPSAweGZmZmY7CiAgICB9CiAgfQogIHJlYWRCaXQoY29udGV4dHMsIHBvcykgewogICAgbGV0IGN4X2luZGV4ID0gY29udGV4dHNbcG9zXSA+PiAxLAogICAgICBjeF9tcHMgPSBjb250ZXh0c1twb3NdICYgMTsKICAgIGNvbnN0IHFlVGFibGVJY3ggPSBRZVRhYmxlW2N4X2luZGV4XTsKICAgIGNvbnN0IHFlSWN4ID0gcWVUYWJsZUljeC5xZTsKICAgIGxldCBkOwogICAgbGV0IGEgPSB0aGlzLmEgLSBxZUljeDsKICAgIGlmICh0aGlzLmNoaWdoIDwgcWVJY3gpIHsKICAgICAgaWYgKGEgPCBxZUljeCkgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gY3hfbXBzOwogICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOwogICAgICB9IGVsc2UgewogICAgICAgIGEgPSBxZUljeDsKICAgICAgICBkID0gMSBeIGN4X21wczsKICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CiAgICAgICAgICBjeF9tcHMgPSBkOwogICAgICAgIH0KICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jaGlnaCAtPSBxZUljeDsKICAgICAgaWYgKChhICYgMHg4MDAwKSAhPT0gMCkgewogICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgcmV0dXJuIGN4X21wczsKICAgICAgfQogICAgICBpZiAoYSA8IHFlSWN4KSB7CiAgICAgICAgZCA9IDEgXiBjeF9tcHM7CiAgICAgICAgaWYgKHFlVGFibGVJY3guc3dpdGNoRmxhZyA9PT0gMSkgewogICAgICAgICAgY3hfbXBzID0gZDsKICAgICAgICB9CiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5scHM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZCA9IGN4X21wczsKICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubm1wczsKICAgICAgfQogICAgfQogICAgZG8gewogICAgICBpZiAodGhpcy5jdCA9PT0gMCkgewogICAgICAgIHRoaXMuYnl0ZUluKCk7CiAgICAgIH0KICAgICAgYSA8PD0gMTsKICAgICAgdGhpcy5jaGlnaCA9IHRoaXMuY2hpZ2ggPDwgMSAmIDB4ZmZmZiB8IHRoaXMuY2xvdyA+PiAxNSAmIDE7CiAgICAgIHRoaXMuY2xvdyA9IHRoaXMuY2xvdyA8PCAxICYgMHhmZmZmOwogICAgICB0aGlzLmN0LS07CiAgICB9IHdoaWxlICgoYSAmIDB4ODAwMCkgPT09IDApOwogICAgdGhpcy5hID0gYTsKICAgIGNvbnRleHRzW3Bvc10gPSBjeF9pbmRleCA8PCAxIHwgY3hfbXBzOwogICAgcmV0dXJuIGQ7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qYmlnMi5qcwoKCgoKCgoKCgoKCmNsYXNzIEpiaWcyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkpiaWcyRXJyb3IiKTsKICB9Cn0KY2xhc3MgQ29udGV4dENhY2hlIHsKICBnZXRDb250ZXh0cyhpZCkgewogICAgaWYgKGlkIGluIHRoaXMpIHsKICAgICAgcmV0dXJuIHRoaXNbaWRdOwogICAgfQogICAgcmV0dXJuIHRoaXNbaWRdID0gbmV3IEludDhBcnJheSgxIDw8IDE2KTsKICB9Cn0KY2xhc3MgRGVjb2RpbmdDb250ZXh0IHsKICBjb25zdHJ1Y3RvcihkYXRhLCBzdGFydCwgZW5kKSB7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy5zdGFydCA9IHN0YXJ0OwogICAgdGhpcy5lbmQgPSBlbmQ7CiAgfQogIGdldCBkZWNvZGVyKCkgewogICAgY29uc3QgZGVjb2RlciA9IG5ldyBBcml0aG1ldGljRGVjb2Rlcih0aGlzLmRhdGEsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImRlY29kZXIiLCBkZWNvZGVyKTsKICB9CiAgZ2V0IGNvbnRleHRDYWNoZSgpIHsKICAgIGNvbnN0IGNhY2hlID0gbmV3IENvbnRleHRDYWNoZSgpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY29udGV4dENhY2hlIiwgY2FjaGUpOwogIH0KfQpmdW5jdGlvbiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgcHJvY2VkdXJlLCBkZWNvZGVyKSB7CiAgY29uc3QgY29udGV4dHMgPSBjb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMocHJvY2VkdXJlKTsKICBsZXQgcHJldiA9IDE7CiAgZnVuY3Rpb24gcmVhZEJpdHMobGVuZ3RoKSB7CiAgICBsZXQgdiA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IGJpdCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHJldik7CiAgICAgIHByZXYgPSBwcmV2IDwgMjU2ID8gcHJldiA8PCAxIHwgYml0IDogKHByZXYgPDwgMSB8IGJpdCkgJiA1MTEgfCAyNTY7CiAgICAgIHYgPSB2IDw8IDEgfCBiaXQ7CiAgICB9CiAgICByZXR1cm4gdiA+Pj4gMDsKICB9CiAgY29uc3Qgc2lnbiA9IHJlYWRCaXRzKDEpOwogIGNvbnN0IHZhbHVlID0gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDMyKSArIDQ0MzYgOiByZWFkQml0cygxMikgKyAzNDAgOiByZWFkQml0cyg4KSArIDg0IDogcmVhZEJpdHMoNikgKyAyMCA6IHJlYWRCaXRzKDQpICsgNCA6IHJlYWRCaXRzKDIpOwogIGxldCBzaWduZWRWYWx1ZTsKICBpZiAoc2lnbiA9PT0gMCkgewogICAgc2lnbmVkVmFsdWUgPSB2YWx1ZTsKICB9IGVsc2UgaWYgKHZhbHVlID4gMCkgewogICAgc2lnbmVkVmFsdWUgPSAtdmFsdWU7CiAgfQogIGlmIChzaWduZWRWYWx1ZSA+PSBNSU5fSU5UXzMyICYmIHNpZ25lZFZhbHVlIDw9IE1BWF9JTlRfMzIpIHsKICAgIHJldHVybi
20BzaWduZWRWYWx1ZTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIGNvZGVMZW5ndGgpIHsKICBjb25zdCBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiSUFJRCIpOwogIGxldCBwcmV2ID0gMTsKICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVMZW5ndGg7IGkrKykgewogICAgY29uc3QgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKICAgIHByZXYgPSBwcmV2IDw8IDEgfCBiaXQ7CiAgfQogIGlmIChjb2RlTGVuZ3RoIDwgMzEpIHsKICAgIHJldHVybiBwcmV2ICYgKDEgPDwgY29kZUxlbmd0aCkgLSAxOwogIH0KICByZXR1cm4gcHJldiAmIDB4N2ZmZmZmZmY7Cn0KY29uc3QgU2VnbWVudFR5cGVzID0gWyJTeW1ib2xEaWN0aW9uYXJ5IiwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZVRleHRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlVGV4dFJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc1RleHRSZWdpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiUGF0dGVybkRpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlSGFsZnRvbmVSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlSGFsZnRvbmVSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NIYWxmdG9uZVJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVHZW5lcmljUmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZUdlbmVyaWNSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uIiwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIiwgbnVsbCwgIkltbWVkaWF0ZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiUGFnZUluZm9ybWF0aW9uIiwgIkVuZE9mUGFnZSIsICJFbmRPZlN0cmlwZSIsICJFbmRPZkZpbGUiLCAiUHJvZmlsZXMiLCAiVGFibGVzIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkV4dGVuc2lvbiJdOwpjb25zdCBDb2RpbmdUZW1wbGF0ZXMgPSBbW3sKICB4OiAtMSwKICB5OiAtMgp9LCB7CiAgeDogMCwKICB5OiAtMgp9LCB7CiAgeDogMSwKICB5OiAtMgp9LCB7CiAgeDogLTIsCiAgeTogLTEKfSwgewogIHg6IC0xLAogIHk6IC0xCn0sIHsKICB4OiAwLAogIHk6IC0xCn0sIHsKICB4OiAxLAogIHk6IC0xCn0sIHsKICB4OiAyLAogIHk6IC0xCn0sIHsKICB4OiAtNCwKICB5OiAwCn0sIHsKICB4OiAtMywKICB5OiAwCn0sIHsKICB4OiAtMiwKICB5OiAwCn0sIHsKICB4OiAtMSwKICB5OiAwCn1dLCBbewogIHg6IC0xLAogIHk6IC0yCn0sIHsKICB4OiAwLAogIHk6IC0yCn0sIHsKICB4OiAxLAogIHk6IC0yCn0sIHsKICB4OiAyLAogIHk6IC0yCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IDIsCiAgeTogLTEKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV0sIFt7CiAgeDogLTEsCiAgeTogLTIKfSwgewogIHg6IDAsCiAgeTogLTIKfSwgewogIHg6IDEsCiAgeTogLTIKfSwgewogIHg6IC0yLAogIHk6IC0xCn0sIHsKICB4OiAtMSwKICB5OiAtMQp9LCB7CiAgeDogMCwKICB5OiAtMQp9LCB7CiAgeDogMSwKICB5OiAtMQp9LCB7CiAgeDogLTIsCiAgeTogMAp9LCB7CiAgeDogLTEsCiAgeTogMAp9XSwgW3sKICB4OiAtMywKICB5OiAtMQp9LCB7CiAgeDogLTIsCiAgeTogLTEKfSwgewogIHg6IC0xLAogIHk6IC0xCn0sIHsKICB4OiAwLAogIHk6IC0xCn0sIHsKICB4OiAxLAogIHk6IC0xCn0sIHsKICB4OiAtNCwKICB5OiAwCn0sIHsKICB4OiAtMywKICB5OiAwCn0sIHsKICB4OiAtMiwKICB5OiAwCn0sIHsKICB4OiAtMSwKICB5OiAwCn1dXTsKY29uc3QgUmVmaW5lbWVudFRlbXBsYXRlcyA9IFt7CiAgY29kaW5nOiBbewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfV0sCiAgcmVmZXJlbmNlOiBbewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfSwgewogICAgeDogMCwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAxLAogICAgeTogMAogIH0sIHsKICAgIHg6IC0xLAogICAgeTogMQogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAxCiAgfSwgewogICAgeDogMSwKICAgIHk6IDEKICB9XQp9LCB7CiAgY29kaW5nOiBbewogICAgeDogLTEsCiAgICB5OiAtMQogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAtMQogIH0sIHsKICAgIHg6IDEsCiAgICB5OiAtMQogIH0sIHsKICAgIHg6IC0xLAogICAgeTogMAogIH1dLAogIHJlZmVyZW5jZTogW3sKICAgIHg6IDAsCiAgICB5OiAtMQogIH0sIHsKICAgIHg6IC0xLAogICAgeTogMAogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAwCiAgfSwgewogICAgeDogMSwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAwLAogICAgeTogMQogIH0sIHsKICAgIHg6IDEsCiAgICB5OiAxCiAgfV0KfV07CmNvbnN0IFJldXNlZENvbnRleHRzID0gWzB4OWIyNSwgMHgwNzk1LCAweDAwZTUsIDB4MDE5NV07CmNvbnN0IFJlZmluZW1lbnRSZXVzZWRDb250ZXh0cyA9IFsweDAwMjAsIDB4MDAwOF07CmZ1bmN0aW9uIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpIHsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOwogIGNvbnN0IGJpdG1hcCA9IFtdOwogIGxldCBjb250ZXh0TGFiZWwsIGksIGosIHBpeGVsLCByb3csIHJvdzEsIHJvdzI7CiAgY29uc3QgT0xEX1BJW
20EVMX01BU0sgPSAweDdiZjc7CiAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICByb3cgPSBiaXRtYXBbaV0gPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICByb3cxID0gaSA8IDEgPyByb3cgOiBiaXRtYXBbaSAtIDFdOwogICAgcm93MiA9IGkgPCAyID8gcm93IDogYml0bWFwW2kgLSAyXTsKICAgIGNvbnRleHRMYWJlbCA9IHJvdzJbMF0gPDwgMTMgfCByb3cyWzFdIDw8IDEyIHwgcm93MlsyXSA8PCAxMSB8IHJvdzFbMF0gPDwgNyB8IHJvdzFbMV0gPDwgNiB8IHJvdzFbMl0gPDwgNSB8IHJvdzFbM10gPDwgNDsKICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIHJvd1tqXSA9IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICBjb250ZXh0TGFiZWwgPSAoY29udGV4dExhYmVsICYgT0xEX1BJWEVMX01BU0spIDw8IDEgfCAoaiArIDMgPCB3aWR0aCA/IHJvdzJbaiArIDNdIDw8IDExIDogMCkgfCAoaiArIDQgPCB3aWR0aCA/IHJvdzFbaiArIDRdIDw8IDQgOiAwKSB8IHBpeGVsOwogICAgfQogIH0KICByZXR1cm4gYml0bWFwOwp9CmZ1bmN0aW9uIGRlY29kZUJpdG1hcChtbXIsIHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHByZWRpY3Rpb24sIHNraXAsIGF0LCBkZWNvZGluZ0NvbnRleHQpIHsKICBpZiAobW1yKSB7CiAgICBjb25zdCBpbnB1dCA9IG5ldyBSZWFkZXIoZGVjb2RpbmdDb250ZXh0LmRhdGEsIGRlY29kaW5nQ29udGV4dC5zdGFydCwgZGVjb2RpbmdDb250ZXh0LmVuZCk7CiAgICByZXR1cm4gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSk7CiAgfQogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwICYmICFza2lwICYmICFwcmVkaWN0aW9uICYmIGF0Lmxlbmd0aCA9PT0gNCAmJiBhdFswXS54ID09PSAzICYmIGF0WzBdLnkgPT09IC0xICYmIGF0WzFdLnggPT09IC0zICYmIGF0WzFdLnkgPT09IC0xICYmIGF0WzJdLnggPT09IDIgJiYgYXRbMl0ueSA9PT0gLTIgJiYgYXRbM10ueCA9PT0gLTIgJiYgYXRbM10ueSA9PT0gLTIpIHsKICAgIHJldHVybiBkZWNvZGVCaXRtYXBUZW1wbGF0ZTAod2lkdGgsIGhlaWdodCwgZGVjb2RpbmdDb250ZXh0KTsKICB9CiAgY29uc3QgdXNlc2tpcCA9ICEhc2tpcDsKICBjb25zdCB0ZW1wbGF0ZSA9IENvZGluZ1RlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XS5jb25jYXQoYXQpOwogIHRlbXBsYXRlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgIHJldHVybiBhLnkgLSBiLnkgfHwgYS54IC0gYi54OwogIH0pOwogIGNvbnN0IHRlbXBsYXRlTGVuZ3RoID0gdGVtcGxhdGUubGVuZ3RoOwogIGNvbnN0IHRlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IHRlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkodGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzID0gW107CiAgbGV0IHJldXNlTWFzayA9IDAsCiAgICBtaW5YID0gMCwKICAgIG1heFggPSAwLAogICAgbWluWSA9IDA7CiAgbGV0IGMsIGs7CiAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgIHRlbXBsYXRlWFtrXSA9IHRlbXBsYXRlW2tdLng7CiAgICB0ZW1wbGF0ZVlba10gPSB0ZW1wbGF0ZVtrXS55OwogICAgbWluWCA9IE1hdGgubWluKG1pblgsIHRlbXBsYXRlW2tdLngpOwogICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHRlbXBsYXRlW2tdLngpOwogICAgbWluWSA9IE1hdGgubWluKG1pblksIHRlbXBsYXRlW2tdLnkpOwogICAgaWYgKGsgPCB0ZW1wbGF0ZUxlbmd0aCAtIDEgJiYgdGVtcGxhdGVba10ueSA9PT0gdGVtcGxhdGVbayArIDFdLnkgJiYgdGVtcGxhdGVba10ueCA9PT0gdGVtcGxhdGVbayArIDFdLnggLSAxKSB7CiAgICAgIHJldXNlTWFzayB8PSAxIDw8IHRlbXBsYXRlTGVuZ3RoIC0gMSAtIGs7CiAgICB9IGVsc2UgewogICAgICBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5wdXNoKGspOwogICAgfQogIH0KICBjb25zdCBjaGFuZ2luZ0VudHJpZXNMZW5ndGggPSBjaGFuZ2luZ1RlbXBsYXRlRW50cmllcy5sZW5ndGg7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZVggPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZVkgPSBuZXcgSW50OEFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZUJpdCA9IG5ldyBVaW50MTZBcnJheShjaGFuZ2luZ0VudHJpZXNMZW5ndGgpOwogIGZvciAoYyA9IDA7IGMgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGMrKykgewogICAgayA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzW2NdOwogICAgY2hhbmdpbmdUZW1wbGF0ZVhbY10gPSB0ZW1wbGF0ZVtrXS54OwogICAgY2hhbmdpbmdUZW1wbGF0ZVlbY10gPSB0ZW1wbGF0ZVtrXS55OwogICAgY2hhbmdpbmdUZW1wbGF0ZUJpdFtjXSA9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKICB9CiAgY29uc3Qgc2JiX2xlZnQgPSAtbWluWDsKICBjb25zdCBzYmJfdG9wID0gLW1pblk7CiAgY29uc3Qgc2JiX3JpZ2h0ID0gd2lkdGggLSBtYXhYOwogIGNvbnN0IHBzZXVkb1BpeGVsQ29udGV4dCA9IFJldXNlZENvbnRleHRzW3RlbXBsYXRlSW5kZXhdOwogIGxldCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgY29uc3QgYml0bWFwID0gW107CiAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOwogIGNvbnN0IGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR0IiKTsKICBsZXQgbHRwID0gMCwKICAgIGosCiAgICBpMCwKICAgIGowLAogICAgY29udGV4dExhYmVsID0gMCwKICAgIGJpdCwKICAgIHNoaWZ0OwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGlmIChwcmVkaWN0aW9uKSB7CiAgICAgIGNvbnN0IHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CiAgICAgIGx0cCBePSBzbHRwOwogICAgICBpZiAobHRwKSB7CiAgICAgICAgYml0bWFwLnB1c2gocm93KTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogICAgcm93ID0gbmV3IFVpbnQ4QXJyYXkocm93KTsKICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICBpZiAodXNlc2tpcCAmJiBza2lwW2ldW2pdKSB7CiAgICAgICAgcm93W2pdID0gMDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaiA+PSBzYmJfbGVmdCAmJiBqIDwgc2JiX3JpZ2h0ICYmIGkgPj0gc2JiX3RvcCkgewogICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxICYgcmV1c2VNYXNrOwogICAgICAgIGZvciAoayA9IDA7IGsgPCBjaGFuZ2luZ0VudHJpZXNMZW5ndGg7IGsrKykgewogICAgICAgICAgaTAgPSBpICsgY2hhbmdpbmdUZW1wbGF0ZVlba107CiAgICAgICAgICBqMCA9IGogKyBjaGFuZ2luZ1RlbXBsYXRlWFtrXTsKICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOwogICAgICAgICAgaWYgKGJpdCkgewogICAgICAgICAgICBiaXQgPSBjaGFuZ2luZ1RlbXBsYXRlQml0W2tdOwogICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0OwogICAgICAgICAgfQogICAgICAgI
20H0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb250ZXh0TGFiZWwgPSAwOwogICAgICAgIHNoaWZ0ID0gdGVtcGxhdGVMZW5ndGggLSAxOwogICAgICAgIGZvciAoayA9IDA7IGsgPCB0ZW1wbGF0ZUxlbmd0aDsgaysrLCBzaGlmdC0tKSB7CiAgICAgICAgICBqMCA9IGogKyB0ZW1wbGF0ZVhba107CiAgICAgICAgICBpZiAoajAgPj0gMCAmJiBqMCA8IHdpZHRoKSB7CiAgICAgICAgICAgIGkwID0gaSArIHRlbXBsYXRlWVtrXTsKICAgICAgICAgICAgaWYgKGkwID49IDApIHsKICAgICAgICAgICAgICBiaXQgPSBiaXRtYXBbaTBdW2owXTsKICAgICAgICAgICAgICBpZiAoYml0KSB7CiAgICAgICAgICAgICAgICBjb250ZXh0TGFiZWwgfD0gYml0IDw8IHNoaWZ0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKICAgICAgcm93W2pdID0gcGl4ZWw7CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlUmVmaW5lbWVudCh3aWR0aCwgaGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCByZWZlcmVuY2VCaXRtYXAsIG9mZnNldFgsIG9mZnNldFksIHByZWRpY3Rpb24sIGF0LCBkZWNvZGluZ0NvbnRleHQpIHsKICBsZXQgY29kaW5nVGVtcGxhdGUgPSBSZWZpbmVtZW50VGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvZGluZzsKICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCkgewogICAgY29kaW5nVGVtcGxhdGUgPSBjb2RpbmdUZW1wbGF0ZS5jb25jYXQoW2F0WzBdXSk7CiAgfQogIGNvbnN0IGNvZGluZ1RlbXBsYXRlTGVuZ3RoID0gY29kaW5nVGVtcGxhdGUubGVuZ3RoOwogIGNvbnN0IGNvZGluZ1RlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKICBjb25zdCBjb2RpbmdUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShjb2RpbmdUZW1wbGF0ZUxlbmd0aCk7CiAgbGV0IGs7CiAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgIGNvZGluZ1RlbXBsYXRlWFtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLng7CiAgICBjb2RpbmdUZW1wbGF0ZVlba10gPSBjb2RpbmdUZW1wbGF0ZVtrXS55OwogIH0KICBsZXQgcmVmZXJlbmNlVGVtcGxhdGUgPSBSZWZpbmVtZW50VGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLnJlZmVyZW5jZTsKICBpZiAodGVtcGxhdGVJbmRleCA9PT0gMCkgewogICAgcmVmZXJlbmNlVGVtcGxhdGUgPSByZWZlcmVuY2VUZW1wbGF0ZS5jb25jYXQoW2F0WzFdXSk7CiAgfQogIGNvbnN0IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoID0gcmVmZXJlbmNlVGVtcGxhdGUubGVuZ3RoOwogIGNvbnN0IHJlZmVyZW5jZVRlbXBsYXRlWCA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKICBjb25zdCByZWZlcmVuY2VUZW1wbGF0ZVkgPSBuZXcgSW50MzJBcnJheShyZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aCk7CiAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLng7CiAgICByZWZlcmVuY2VUZW1wbGF0ZVlba10gPSByZWZlcmVuY2VUZW1wbGF0ZVtrXS55OwogIH0KICBjb25zdCByZWZlcmVuY2VXaWR0aCA9IHJlZmVyZW5jZUJpdG1hcFswXS5sZW5ndGg7CiAgY29uc3QgcmVmZXJlbmNlSGVpZ2h0ID0gcmVmZXJlbmNlQml0bWFwLmxlbmd0aDsKICBjb25zdCBwc2V1ZG9QaXhlbENvbnRleHQgPSBSZWZpbmVtZW50UmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CiAgY29uc3QgYml0bWFwID0gW107CiAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOwogIGNvbnN0IGNvbnRleHRzID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZS5nZXRDb250ZXh0cygiR1IiKTsKICBsZXQgbHRwID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICBpZiAocHJlZGljdGlvbikgewogICAgICBjb25zdCBzbHRwID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwc2V1ZG9QaXhlbENvbnRleHQpOwogICAgICBsdHAgXj0gc2x0cDsKICAgICAgaWYgKGx0cCkgewogICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJwcmVkaWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICBsZXQgaTAsIGowOwogICAgICBsZXQgY29udGV4dExhYmVsID0gMDsKICAgICAgZm9yIChrID0gMDsgayA8IGNvZGluZ1RlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgICAgICBpMCA9IGkgKyBjb2RpbmdUZW1wbGF0ZVlba107CiAgICAgICAgajAgPSBqICsgY29kaW5nVGVtcGxhdGVYW2tdOwogICAgICAgIGlmIChpMCA8IDAgfHwgajAgPCAwIHx8IGowID49IHdpZHRoKSB7CiAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgYml0bWFwW2kwXVtqMF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoayA9IDA7IGsgPCByZWZlcmVuY2VUZW1wbGF0ZUxlbmd0aDsgaysrKSB7CiAgICAgICAgaTAgPSBpICsgcmVmZXJlbmNlVGVtcGxhdGVZW2tdIC0gb2Zmc2V0WTsKICAgICAgICBqMCA9IGogKyByZWZlcmVuY2VUZW1wbGF0ZVhba10gLSBvZmZzZXRYOwogICAgICAgIGlmIChpMCA8IDAgfHwgaTAgPj0gcmVmZXJlbmNlSGVpZ2h0IHx8IGowIDwgMCB8fCBqMCA+PSByZWZlcmVuY2VXaWR0aCkgewogICAgICAgICAgY29udGV4dExhYmVsIDw8PSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZXh0TGFiZWwgPSBjb250ZXh0TGFiZWwgPDwgMSB8IHJlZmVyZW5jZUJpdG1hcFtpMF1bajBdOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBwaXhlbCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKICAgICAgcm93W2pdID0gcGl4ZWw7CiAgICB9CiAgfQogIHJldHVybi
20BiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShodWZmbWFuLCByZWZpbmVtZW50LCBzeW1ib2xzLCBudW1iZXJPZk5ld1N5bWJvbHMsIG51bWJlck9mRXhwb3J0ZWRTeW1ib2xzLCBodWZmbWFuVGFibGVzLCB0ZW1wbGF0ZUluZGV4LCBhdCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpIHsKICBpZiAoaHVmZm1hbiAmJiByZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic3ltYm9sIHJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICB9CiAgY29uc3QgbmV3U3ltYm9scyA9IFtdOwogIGxldCBjdXJyZW50SGVpZ2h0ID0gMDsKICBsZXQgc3ltYm9sQ29kZUxlbmd0aCA9IGxvZzIoc3ltYm9scy5sZW5ndGggKyBudW1iZXJPZk5ld1N5bWJvbHMpOwogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOwogIGxldCB0YWJsZUIxLCBzeW1ib2xXaWR0aHM7CiAgaWYgKGh1ZmZtYW4pIHsKICAgIHRhYmxlQjEgPSBnZXRTdGFuZGFyZFRhYmxlKDEpOwogICAgc3ltYm9sV2lkdGhzID0gW107CiAgICBzeW1ib2xDb2RlTGVuZ3RoID0gTWF0aC5tYXgoc3ltYm9sQ29kZUxlbmd0aCwgMSk7CiAgfQogIHdoaWxlIChuZXdTeW1ib2xzLmxlbmd0aCA8IG51bWJlck9mTmV3U3ltYm9scykgewogICAgY29uc3QgZGVsdGFIZWlnaHQgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhSGVpZ2h0LmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURIIiwgZGVjb2Rlcik7CiAgICBjdXJyZW50SGVpZ2h0ICs9IGRlbHRhSGVpZ2h0OwogICAgbGV0IGN1cnJlbnRXaWR0aCA9IDAsCiAgICAgIHRvdGFsV2lkdGggPSAwOwogICAgY29uc3QgZmlyc3RTeW1ib2wgPSBodWZmbWFuID8gc3ltYm9sV2lkdGhzLmxlbmd0aCA6IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb25zdCBkZWx0YVdpZHRoID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVdpZHRoLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURXIiwgZGVjb2Rlcik7CiAgICAgIGlmIChkZWx0YVdpZHRoID09PSBudWxsKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY3VycmVudFdpZHRoICs9IGRlbHRhV2lkdGg7CiAgICAgIHRvdGFsV2lkdGggKz0gY3VycmVudFdpZHRoOwogICAgICBsZXQgYml0bWFwOwogICAgICBpZiAocmVmaW5lbWVudCkgewogICAgICAgIGNvbnN0IG51bWJlck9mSW5zdGFuY2VzID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUFJIiwgZGVjb2Rlcik7CiAgICAgICAgaWYgKG51bWJlck9mSW5zdGFuY2VzID4gMSkgewogICAgICAgICAgYml0bWFwID0gZGVjb2RlVGV4dFJlZ2lvbihodWZmbWFuLCByZWZpbmVtZW50LCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIDAsIG51bWJlck9mSW5zdGFuY2VzLCAxLCBzeW1ib2xzLmNvbmNhdChuZXdTeW1ib2xzKSwgc3ltYm9sQ29kZUxlbmd0aCwgMCwgMCwgMSwgMCwgaHVmZm1hblRhYmxlcywgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCAwLCBodWZmbWFuSW5wdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBzeW1ib2xJZCA9IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKICAgICAgICAgIGNvbnN0IHJkeCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFgiLCBkZWNvZGVyKTsKICAgICAgICAgIGNvbnN0IHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKICAgICAgICAgIGNvbnN0IHN5bWJvbCA9IHN5bWJvbElkIDwgc3ltYm9scy5sZW5ndGggPyBzeW1ib2xzW3N5bWJvbElkXSA6IG5ld1N5bWJvbHNbc3ltYm9sSWQgLSBzeW1ib2xzLmxlbmd0aF07CiAgICAgICAgICBiaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHN5bWJvbCwgcmR4LCByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICAgICAgfQogICAgICAgIG5ld1N5bWJvbHMucHVzaChiaXRtYXApOwogICAgICB9IGVsc2UgaWYgKGh1ZmZtYW4pIHsKICAgICAgICBzeW1ib2xXaWR0aHMucHVzaChjdXJyZW50V2lkdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChmYWxzZSwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCB0ZW1wbGF0ZUluZGV4LCBmYWxzZSwgbnVsbCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICAgICAgbmV3U3ltYm9scy5wdXNoKGJpdG1hcCk7CiAgICAgIH0KICAgIH0KICAgIGlmIChodWZmbWFuICYmICFyZWZpbmVtZW50KSB7CiAgICAgIGNvbnN0IGJpdG1hcFNpemUgPSBodWZmbWFuVGFibGVzLnRhYmxlQml0bWFwU2l6ZS5kZWNvZGUoaHVmZm1hbklucHV0KTsKICAgICAgaHVmZm1hbklucHV0LmJ5dGVBbGlnbigpOwogICAgICBsZXQgY29sbGVjdGl2ZUJpdG1hcDsKICAgICAgaWYgKGJpdG1hcFNpemUgPT09IDApIHsKICAgICAgICBjb2xsZWN0aXZlQml0bWFwID0gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChodWZmbWFuSW5wdXQsIHRvdGFsV2lkdGgsIGN1cnJlbnRIZWlnaHQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gaHVmZm1hbklucHV0LmVuZDsKICAgICAgICBjb25zdCBiaXRtYXBFbmQgPSBodWZmbWFuSW5wdXQucG9zaXRpb24gKyBiaXRtYXBTaXplOwogICAgICAgIGh1ZmZtYW5JbnB1dC5lbmQgPSBiaXRtYXBFbmQ7CiAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChodWZmbWFuSW5wdXQsIHRvdGFsV2lkdGgsIGN1cnJlbnRIZWlnaHQsIGZhbHNlKTsKICAgICAgICBodWZmbWFuSW5wdXQuZW5kID0gb3JpZ2luYWxFbmQ7CiAgICAgICAgaHVmZm1hbklucHV0LnBvc2l0aW9uID0gYml0bWFwRW5kOwogICAgICB9CiAgICAgIGNvbnN0IG51bWJlck9mU3ltYm9sc0RlY29kZWQgPSBzeW1ib2xXaWR0aHMubGVuZ3RoOwogICAgICBpZiAoZmlyc3RTeW1ib2wgPT09IG51bWJlck9mU3ltYm9sc0RlY29kZWQgLSAxKSB7CiAgICAgICAgbmV3
20U3ltYm9scy5wdXNoKGNvbGxlY3RpdmVCaXRtYXApOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBpLAogICAgICAgICAgeSwKICAgICAgICAgIHhNaW4gPSAwLAogICAgICAgICAgeE1heCwKICAgICAgICAgIGJpdG1hcFdpZHRoLAogICAgICAgICAgc3ltYm9sQml0bWFwOwogICAgICAgIGZvciAoaSA9IGZpcnN0U3ltYm9sOyBpIDwgbnVtYmVyT2ZTeW1ib2xzRGVjb2RlZDsgaSsrKSB7CiAgICAgICAgICBiaXRtYXBXaWR0aCA9IHN5bWJvbFdpZHRoc1tpXTsKICAgICAgICAgIHhNYXggPSB4TWluICsgYml0bWFwV2lkdGg7CiAgICAgICAgICBzeW1ib2xCaXRtYXAgPSBbXTsKICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBjdXJyZW50SGVpZ2h0OyB5KyspIHsKICAgICAgICAgICAgc3ltYm9sQml0bWFwLnB1c2goY29sbGVjdGl2ZUJpdG1hcFt5XS5zdWJhcnJheSh4TWluLCB4TWF4KSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXdTeW1ib2xzLnB1c2goc3ltYm9sQml0bWFwKTsKICAgICAgICAgIHhNaW4gPSB4TWF4OwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBjb25zdCBleHBvcnRlZFN5bWJvbHMgPSBbXSwKICAgIGZsYWdzID0gW107CiAgbGV0IGN1cnJlbnRGbGFnID0gZmFsc2UsCiAgICBpLAogICAgaWk7CiAgY29uc3QgdG90YWxTeW1ib2xzTGVuZ3RoID0gc3ltYm9scy5sZW5ndGggKyBudW1iZXJPZk5ld1N5bWJvbHM7CiAgd2hpbGUgKGZsYWdzLmxlbmd0aCA8IHRvdGFsU3ltYm9sc0xlbmd0aCkgewogICAgbGV0IHJ1bkxlbmd0aCA9IGh1ZmZtYW4gPyB0YWJsZUIxLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUVYIiwgZGVjb2Rlcik7CiAgICB3aGlsZSAocnVuTGVuZ3RoLS0pIHsKICAgICAgZmxhZ3MucHVzaChjdXJyZW50RmxhZyk7CiAgICB9CiAgICBjdXJyZW50RmxhZyA9ICFjdXJyZW50RmxhZzsKICB9CiAgZm9yIChpID0gMCwgaWkgPSBzeW1ib2xzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGlmIChmbGFnc1tpXSkgewogICAgICBleHBvcnRlZFN5bWJvbHMucHVzaChzeW1ib2xzW2ldKTsKICAgIH0KICB9CiAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1iZXJPZk5ld1N5bWJvbHM7IGkrKywgaisrKSB7CiAgICBpZiAoZmxhZ3NbaV0pIHsKICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2gobmV3U3ltYm9sc1tqXSk7CiAgICB9CiAgfQogIHJldHVybiBleHBvcnRlZFN5bWJvbHM7Cn0KZnVuY3Rpb24gZGVjb2RlVGV4dFJlZ2lvbihodWZmbWFuLCByZWZpbmVtZW50LCB3aWR0aCwgaGVpZ2h0LCBkZWZhdWx0UGl4ZWxWYWx1ZSwgbnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsIHN0cmlwU2l6ZSwgaW5wdXRTeW1ib2xzLCBzeW1ib2xDb2RlTGVuZ3RoLCB0cmFuc3Bvc2VkLCBkc09mZnNldCwgcmVmZXJlbmNlQ29ybmVyLCBjb21iaW5hdGlvbk9wZXJhdG9yLCBodWZmbWFuVGFibGVzLCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGxvZ1N0cmlwU2l6ZSwgaHVmZm1hbklucHV0KSB7CiAgaWYgKGh1ZmZtYW4gJiYgcmVmaW5lbWVudCkgewogICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInJlZmluZW1lbnQgd2l0aCBIdWZmbWFuIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICB9CiAgY29uc3QgYml0bWFwID0gW107CiAgbGV0IGksIHJvdzsKICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkgewogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTsKICAgICAgfQogICAgfQogICAgYml0bWFwLnB1c2gocm93KTsKICB9CiAgY29uc3QgZGVjb2RlciA9IGRlY29kaW5nQ29udGV4dC5kZWNvZGVyOwogIGNvbnN0IGNvbnRleHRDYWNoZSA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGU7CiAgbGV0IHN0cmlwVCA9IGh1ZmZtYW4gPyAtaHVmZm1hblRhYmxlcy50YWJsZURlbHRhVC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IC1kZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKICBsZXQgZmlyc3RTID0gMDsKICBpID0gMDsKICB3aGlsZSAoaSA8IG51bWJlck9mU3ltYm9sSW5zdGFuY2VzKSB7CiAgICBjb25zdCBkZWx0YVQgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhVC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVCIsIGRlY29kZXIpOwogICAgc3RyaXBUICs9IGRlbHRhVDsKICAgIGNvbnN0IGRlbHRhRmlyc3RTID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVGaXJzdFMuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRlMiLCBkZWNvZGVyKTsKICAgIGZpcnN0UyArPSBkZWx0YUZpcnN0UzsKICAgIGxldCBjdXJyZW50UyA9IGZpcnN0UzsKICAgIGRvIHsKICAgICAgbGV0IGN1cnJlbnRUID0gMDsKICAgICAgaWYgKHN0cmlwU2l6ZSA+IDEpIHsKICAgICAgICBjdXJyZW50VCA9IGh1ZmZtYW4gPyBodWZmbWFuSW5wdXQucmVhZEJpdHMobG9nU3RyaXBTaXplKSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFJVCIsIGRlY29kZXIpOwogICAgICB9CiAgICAgIGNvbnN0IHQgPSBzdHJpcFNpemUgKiBzdHJpcFQgKyBjdXJyZW50VDsKICAgICAgY29uc3Qgc3ltYm9sSWQgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy5zeW1ib2xJRFRhYmxlLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSUFJRChjb250ZXh0Q2FjaGUsIGRlY29kZXIsIHN5bWJvbENvZGVMZW5ndGgpOwogICAgICBjb25zdCBhcHBseVJlZmluZW1lbnQgPSByZWZpbmVtZW50ICYmIChodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXQoKSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSSSIsIGRlY29kZXIpKTsKICAgICAgbGV0IHN5bWJvbEJpdG1hcCA9IGlucHV0U3ltYm9sc1tzeW1ib2xJZF07CiAgICAgIGxldCBzeW1ib2xXaWR0aCA9IHN5bWJvbEJpdG1hcFswXS5sZW5ndGg7CiAgICAgIGxldCBzeW1ib2xIZWlnaHQgPSBzeW1ib2xCaXRtYXAubGVuZ3RoOwogICAgICBpZiAoYXBwbHlSZWZpbmVtZW50KSB7CiAgICAgICAgY29uc3QgcmR3ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEVyIsIGRlY29kZXIpOwogICAgICAgIGNvbnN0IHJkaCA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSREgiLCBkZWNvZGVyKTsKICAgICAgICBjb25zdCByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRYIiwgZGVjb2Rlcik7CiAgICAgICAgY29uc3QgcmR5ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWSIsIGRlY29kZXIpOwogICAgICAgI
20HN5bWJvbFdpZHRoICs9IHJkdzsKICAgICAgICBzeW1ib2xIZWlnaHQgKz0gcmRoOwogICAgICAgIHN5bWJvbEJpdG1hcCA9IGRlY29kZVJlZmluZW1lbnQoc3ltYm9sV2lkdGgsIHN5bWJvbEhlaWdodCwgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHN5bWJvbEJpdG1hcCwgKHJkdyA+PiAxKSArIHJkeCwgKHJkaCA+PiAxKSArIHJkeSwgZmFsc2UsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgICAgfQogICAgICBsZXQgaW5jcmVtZW50ID0gMDsKICAgICAgaWYgKCF0cmFuc3Bvc2VkKSB7CiAgICAgICAgaWYgKHJlZmVyZW5jZUNvcm5lciA+IDEpIHsKICAgICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbFdpZHRoIC0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5jcmVtZW50ID0gc3ltYm9sV2lkdGggLSAxOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghKHJlZmVyZW5jZUNvcm5lciAmIDEpKSB7CiAgICAgICAgY3VycmVudFMgKz0gc3ltYm9sSGVpZ2h0IC0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbmNyZW1lbnQgPSBzeW1ib2xIZWlnaHQgLSAxOwogICAgICB9CiAgICAgIGNvbnN0IG9mZnNldFQgPSB0IC0gKHJlZmVyZW5jZUNvcm5lciAmIDEgPyAwIDogc3ltYm9sSGVpZ2h0IC0gMSk7CiAgICAgIGNvbnN0IG9mZnNldFMgPSBjdXJyZW50UyAtIChyZWZlcmVuY2VDb3JuZXIgJiAyID8gc3ltYm9sV2lkdGggLSAxIDogMCk7CiAgICAgIGxldCBzMiwgdDIsIHN5bWJvbFJvdzsKICAgICAgaWYgKHRyYW5zcG9zZWQpIHsKICAgICAgICBmb3IgKHMyID0gMDsgczIgPCBzeW1ib2xIZWlnaHQ7IHMyKyspIHsKICAgICAgICAgIHJvdyA9IGJpdG1hcFtvZmZzZXRTICsgczJdOwogICAgICAgICAgaWYgKCFyb3cpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzeW1ib2xSb3cgPSBzeW1ib2xCaXRtYXBbczJdOwogICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1pbih3aWR0aCAtIG9mZnNldFQsIHN5bWJvbFdpZHRoKTsKICAgICAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHsKICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIHw9IHN5bWJvbFJvd1t0Ml07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgbWF4V2lkdGg7IHQyKyspIHsKICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRUICsgdDJdIF49IHN5bWJvbFJvd1t0Ml07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh0MiA9IDA7IHQyIDwgc3ltYm9sSGVpZ2h0OyB0MisrKSB7CiAgICAgICAgICByb3cgPSBiaXRtYXBbb2Zmc2V0VCArIHQyXTsKICAgICAgICAgIGlmICghcm93KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc3ltYm9sUm93ID0gc3ltYm9sQml0bWFwW3QyXTsKICAgICAgICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sV2lkdGg7IHMyKyspIHsKICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRTICsgczJdIHw9IHN5bWJvbFJvd1tzMl07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgZm9yIChzMiA9IDA7IHMyIDwgc3ltYm9sV2lkdGg7IHMyKyspIHsKICAgICAgICAgICAgICAgIHJvd1tvZmZzZXRTICsgczJdIF49IHN5bWJvbFJvd1tzMl07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaSsrOwogICAgICBjb25zdCBkZWx0YVMgPSBodWZmbWFuID8gaHVmZm1hblRhYmxlcy50YWJsZURlbHRhUy5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEUyIsIGRlY29kZXIpOwogICAgICBpZiAoZGVsdGFTID09PSBudWxsKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY3VycmVudFMgKz0gaW5jcmVtZW50ICsgZGVsdGFTICsgZHNPZmZzZXQ7CiAgICB9IHdoaWxlICh0cnVlKTsKICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVQYXR0ZXJuRGljdGlvbmFyeShtbXIsIHBhdHRlcm5XaWR0aCwgcGF0dGVybkhlaWdodCwgbWF4UGF0dGVybkluZGV4LCB0ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KSB7CiAgY29uc3QgYXQgPSBbXTsKICBpZiAoIW1tcikgewogICAgYXQucHVzaCh7CiAgICAgIHg6IC1wYXR0ZXJuV2lkdGgsCiAgICAgIHk6IDAKICAgIH0pOwogICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CiAgICAgIGF0LnB1c2goewogICAgICAgIHg6IC0zLAogICAgICAgIHk6IC0xCiAgICAgIH0sIHsKICAgICAgICB4OiAyLAogICAgICAgIHk6IC0yCiAgICAgIH0sIHsKICAgICAgICB4OiAtMiwKICAgICAgICB5OiAtMgogICAgICB9KTsKICAgIH0KICB9CiAgY29uc3QgY29sbGVjdGl2ZVdpZHRoID0gKG1heFBhdHRlcm5JbmRleCArIDEpICogcGF0dGVybldpZHRoOwogIGNvbnN0IGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVCaXRtYXAobW1yLCBjb2xsZWN0aXZlV2lkdGgsIHBhdHRlcm5IZWlnaHQsIHRlbXBsYXRlLCBmYWxzZSwgbnVsbCwgYXQsIGRlY29kaW5nQ29udGV4dCk7CiAgY29uc3QgcGF0dGVybnMgPSBbXTsKICBmb3IgKGxldCBpID0gMDsgaSA8PSBtYXhQYXR0ZXJuSW5kZXg7IGkrKykgewogICAgY29uc3QgcGF0dGVybkJpdG1hcCA9IFtdOwogICAgY29uc3QgeE1pbiA9IHBhdHRlcm5XaWR0aCAqIGk7CiAgICBjb25zdCB4TWF4ID0geE1pbiArIHBhdHRlcm5XaWR0aDsKICAgIGZvciAobGV0IHkgPSAwOyB5IDwgcGF0dGVybkhlaWdodDsgeSsrKSB7CiAgICAgI
20HBhdHRlcm5CaXRtYXAucHVzaChjb2xsZWN0aXZlQml0bWFwW3ldLnN1YmFycmF5KHhNaW4sIHhNYXgpKTsKICAgIH0KICAgIHBhdHRlcm5zLnB1c2gocGF0dGVybkJpdG1hcCk7CiAgfQogIHJldHVybiBwYXR0ZXJuczsKfQpmdW5jdGlvbiBkZWNvZGVIYWxmdG9uZVJlZ2lvbihtbXIsIHBhdHRlcm5zLCB0ZW1wbGF0ZSwgcmVnaW9uV2lkdGgsIHJlZ2lvbkhlaWdodCwgZGVmYXVsdFBpeGVsVmFsdWUsIGVuYWJsZVNraXAsIGNvbWJpbmF0aW9uT3BlcmF0b3IsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgZ3JpZE9mZnNldFgsIGdyaWRPZmZzZXRZLCBncmlkVmVjdG9yWCwgZ3JpZFZlY3RvclksIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IHNraXAgPSBudWxsOwogIGlmIChlbmFibGVTa2lwKSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic2tpcCBpcyBub3Qgc3VwcG9ydGVkIik7CiAgfQogIGlmIChjb21iaW5hdGlvbk9wZXJhdG9yICE9PSAwKSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgIiR7Y29tYmluYXRpb25PcGVyYXRvcn0iIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaGFsZnRvbmUgcmVnaW9uYCk7CiAgfQogIGNvbnN0IHJlZ2lvbkJpdG1hcCA9IFtdOwogIGxldCBpLCBqLCByb3c7CiAgZm9yIChpID0gMDsgaSA8IHJlZ2lvbkhlaWdodDsgaSsrKSB7CiAgICByb3cgPSBuZXcgVWludDhBcnJheShyZWdpb25XaWR0aCk7CiAgICBpZiAoZGVmYXVsdFBpeGVsVmFsdWUpIHsKICAgICAgZm9yIChqID0gMDsgaiA8IHJlZ2lvbldpZHRoOyBqKyspIHsKICAgICAgICByb3dbal0gPSBkZWZhdWx0UGl4ZWxWYWx1ZTsKICAgICAgfQogICAgfQogICAgcmVnaW9uQml0bWFwLnB1c2gocm93KTsKICB9CiAgY29uc3QgbnVtYmVyT2ZQYXR0ZXJucyA9IHBhdHRlcm5zLmxlbmd0aDsKICBjb25zdCBwYXR0ZXJuMCA9IHBhdHRlcm5zWzBdOwogIGNvbnN0IHBhdHRlcm5XaWR0aCA9IHBhdHRlcm4wWzBdLmxlbmd0aCwKICAgIHBhdHRlcm5IZWlnaHQgPSBwYXR0ZXJuMC5sZW5ndGg7CiAgY29uc3QgYml0c1BlclZhbHVlID0gbG9nMihudW1iZXJPZlBhdHRlcm5zKTsKICBjb25zdCBhdCA9IFtdOwogIGlmICghbW1yKSB7CiAgICBhdC5wdXNoKHsKICAgICAgeDogdGVtcGxhdGUgPD0gMSA/IDMgOiAyLAogICAgICB5OiAtMQogICAgfSk7CiAgICBpZiAodGVtcGxhdGUgPT09IDApIHsKICAgICAgYXQucHVzaCh7CiAgICAgICAgeDogLTMsCiAgICAgICAgeTogLTEKICAgICAgfSwgewogICAgICAgIHg6IDIsCiAgICAgICAgeTogLTIKICAgICAgfSwgewogICAgICAgIHg6IC0yLAogICAgICAgIHk6IC0yCiAgICAgIH0pOwogICAgfQogIH0KICBjb25zdCBncmF5U2NhbGVCaXRQbGFuZXMgPSBbXTsKICBsZXQgbW1ySW5wdXQsIGJpdG1hcDsKICBpZiAobW1yKSB7CiAgICBtbXJJbnB1dCA9IG5ldyBSZWFkZXIoZGVjb2RpbmdDb250ZXh0LmRhdGEsIGRlY29kaW5nQ29udGV4dC5zdGFydCwgZGVjb2RpbmdDb250ZXh0LmVuZCk7CiAgfQogIGZvciAoaSA9IGJpdHNQZXJWYWx1ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICBpZiAobW1yKSB7CiAgICAgIGJpdG1hcCA9IGRlY29kZU1NUkJpdG1hcChtbXJJbnB1dCwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIGJpdG1hcCA9IGRlY29kZUJpdG1hcChmYWxzZSwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCB0ZW1wbGF0ZSwgZmFsc2UsIHNraXAsIGF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgfQogICAgZ3JheVNjYWxlQml0UGxhbmVzW2ldID0gYml0bWFwOwogIH0KICBsZXQgbWcsIG5nLCBiaXQsIHBhdHRlcm5JbmRleCwgcGF0dGVybkJpdG1hcCwgeCwgeSwgcGF0dGVyblJvdywgcmVnaW9uUm93OwogIGZvciAobWcgPSAwOyBtZyA8IGdyaWRIZWlnaHQ7IG1nKyspIHsKICAgIGZvciAobmcgPSAwOyBuZyA8IGdyaWRXaWR0aDsgbmcrKykgewogICAgICBiaXQgPSAwOwogICAgICBwYXR0ZXJuSW5kZXggPSAwOwogICAgICBmb3IgKGogPSBiaXRzUGVyVmFsdWUgLSAxOyBqID49IDA7IGotLSkgewogICAgICAgIGJpdCBePSBncmF5U2NhbGVCaXRQbGFuZXNbal1bbWddW25nXTsKICAgICAgICBwYXR0ZXJuSW5kZXggfD0gYml0IDw8IGo7CiAgICAgIH0KICAgICAgcGF0dGVybkJpdG1hcCA9IHBhdHRlcm5zW3BhdHRlcm5JbmRleF07CiAgICAgIHggPSBncmlkT2Zmc2V0WCArIG1nICogZ3JpZFZlY3RvclkgKyBuZyAqIGdyaWRWZWN0b3JYID4+IDg7CiAgICAgIHkgPSBncmlkT2Zmc2V0WSArIG1nICogZ3JpZFZlY3RvclggLSBuZyAqIGdyaWRWZWN0b3JZID4+IDg7CiAgICAgIGlmICh4ID49IDAgJiYgeCArIHBhdHRlcm5XaWR0aCA8PSByZWdpb25XaWR0aCAmJiB5ID49IDAgJiYgeSArIHBhdHRlcm5IZWlnaHQgPD0gcmVnaW9uSGVpZ2h0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykgewogICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3kgKyBpXTsKICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CiAgICAgICAgICAgIHJlZ2lvblJvd1t4ICsgal0gfD0gcGF0dGVyblJvd1tqXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHJlZ2lvblgsIHJlZ2lvblk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhdHRlcm5IZWlnaHQ7IGkrKykgewogICAgICAgICAgcmVnaW9uWSA9IHkgKyBpOwogICAgICAgICAgaWYgKHJlZ2lvblkgPCAwIHx8IHJlZ2lvblkgPj0gcmVnaW9uSGVpZ2h0KSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgcmVnaW9uUm93ID0gcmVnaW9uQml0bWFwW3JlZ2lvblldOwogICAgICAgICAgcGF0dGVyblJvdyA9IHBhdHRlcm5CaXRtYXBbaV07CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGF0dGVybldpZHRoOyBqKyspIHsKICAgICAgICAgICAgcmVnaW9uWCA9IHggKyBqOwogICAgICAgICAgICBpZiAocmVnaW9uWCA+PSAwICYmIHJlZ2lvblggPCByZWdpb25XaWR0aCkgewogICAgICAgICAgICAgI
20HJlZ2lvblJvd1tyZWdpb25YXSB8PSBwYXR0ZXJuUm93W2pdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiByZWdpb25CaXRtYXA7Cn0KZnVuY3Rpb24gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgc3RhcnQpIHsKICBjb25zdCBzZWdtZW50SGVhZGVyID0ge307CiAgc2VnbWVudEhlYWRlci5udW1iZXIgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0KTsKICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnQgKyA0XTsKICBjb25zdCBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjsKICBpZiAoIVNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV0pIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHNlZ21lbnQgdHlwZTogIiArIHNlZ21lbnRUeXBlKTsKICB9CiAgc2VnbWVudEhlYWRlci50eXBlID0gc2VnbWVudFR5cGU7CiAgc2VnbWVudEhlYWRlci50eXBlTmFtZSA9IFNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV07CiAgc2VnbWVudEhlYWRlci5kZWZlcnJlZE5vblJldGFpbiA9ICEhKGZsYWdzICYgMHg4MCk7CiAgY29uc3QgcGFnZUFzc29jaWF0aW9uRmllbGRTaXplID0gISEoZmxhZ3MgJiAweDQwKTsKICBjb25zdCByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdOwogIGxldCByZWZlcnJlZFRvQ291bnQgPSByZWZlcnJlZEZsYWdzID4+IDUgJiA3OwogIGNvbnN0IHJldGFpbkJpdHMgPSBbcmVmZXJyZWRGbGFncyAmIDMxXTsKICBsZXQgcG9zaXRpb24gPSBzdGFydCArIDY7CiAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHsKICAgIHJlZmVycmVkVG9Db3VudCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gLSAxKSAmIDB4MWZmZmZmZmY7CiAgICBwb3NpdGlvbiArPSAzOwogICAgbGV0IGJ5dGVzID0gcmVmZXJyZWRUb0NvdW50ICsgNyA+PiAzOwogICAgcmV0YWluQml0c1swXSA9IGRhdGFbcG9zaXRpb24rK107CiAgICB3aGlsZSAoLS1ieXRlcyA+IDApIHsKICAgICAgcmV0YWluQml0cy5wdXNoKGRhdGFbcG9zaXRpb24rK10pOwogICAgfQogIH0gZWxzZSBpZiAocmVmZXJyZWRGbGFncyA9PT0gNSB8fCByZWZlcnJlZEZsYWdzID09PSA2KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCByZWZlcnJlZC10byBmbGFncyIpOwogIH0KICBzZWdtZW50SGVhZGVyLnJldGFpbkJpdHMgPSByZXRhaW5CaXRzOwogIGxldCByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSA0OwogIGlmIChzZWdtZW50SGVhZGVyLm51bWJlciA8PSAyNTYpIHsKICAgIHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDE7CiAgfSBlbHNlIGlmIChzZWdtZW50SGVhZGVyLm51bWJlciA8PSA2NTUzNikgewogICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMjsKICB9CiAgY29uc3QgcmVmZXJyZWRUbyA9IFtdOwogIGxldCBpLCBpaTsKICBmb3IgKGkgPSAwOyBpIDwgcmVmZXJyZWRUb0NvdW50OyBpKyspIHsKICAgIGxldCBudW1iZXI7CiAgICBpZiAocmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID09PSAxKSB7CiAgICAgIG51bWJlciA9IGRhdGFbcG9zaXRpb25dOwogICAgfSBlbHNlIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDIpIHsKICAgICAgbnVtYmVyID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICB9IGVsc2UgewogICAgICBudW1iZXIgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgIH0KICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpOwogICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplOwogIH0KICBzZWdtZW50SGVhZGVyLnJlZmVycmVkVG8gPSByZWZlcnJlZFRvOwogIGlmICghcGFnZUFzc29jaWF0aW9uRmllbGRTaXplKSB7CiAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IGRhdGFbcG9zaXRpb24rK107CiAgfSBlbHNlIHsKICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICBwb3NpdGlvbiArPSA0OwogIH0KICBzZWdtZW50SGVhZGVyLmxlbmd0aCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogIHBvc2l0aW9uICs9IDQ7CiAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CiAgICBpZiAoc2VnbWVudFR5cGUgPT09IDM4KSB7CiAgICAgIGNvbnN0IGdlbmVyaWNSZWdpb25JbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CiAgICAgIGNvbnN0IGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uICsgUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGhdOwogICAgICBjb25zdCBnZW5lcmljUmVnaW9uTW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpOwogICAgICBjb25zdCBzZWFyY2hQYXR0ZXJuTGVuZ3RoID0gNjsKICAgICAgY29uc3Qgc2VhcmNoUGF0dGVybiA9IG5ldyBVaW50OEFycmF5KHNlYXJjaFBhdHRlcm5MZW5ndGgpOwogICAgICBpZiAoIWdlbmVyaWNSZWdpb25NbXIpIHsKICAgICAgICBzZWFyY2hQYXR0ZXJuWzBdID0gMHhmZjsKICAgICAgICBzZWFyY2hQYXR0ZXJuWzFdID0gMHhhYzsKICAgICAgfQogICAgICBzZWFyY2hQYXR0ZXJuWzJdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+PiAyNCAmIDB4ZmY7CiAgICAgIHNlYXJjaFBhdHRlcm5bM10gPSBnZW5lcmljUmVnaW9uSW5mby5oZWlnaHQgPj4gMTYgJiAweGZmOwogICAgICBzZWFyY2hQYXR0ZXJuWzRdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDggJiAweGZmOwogICAgICBzZWFyY2hQYXR0ZXJuWzVdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ICYgMHhmZjsKICAgICAgZm9yIChpID0gcG9zaXRpb24sIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgbGV0IGogPSAwOwogICAgICAgIHdoaWxlIChqIDwgc2VhcmNoUGF0dGVybkxlbmd0aCAmJiBzZWFyY2hQYXR0ZXJuW2pdID09PSBkYXRhW2kgKyBqXSkgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoaiA9PT0gc2VhcmNoUGF0dGVybkxlbmd0aCkgewogICAgICAgICAgc2VnbWVudEhlYWRlci5sZW5ndGggPSBpICsgc2VhcmNoUGF0dGVybkxlbmd0aDsKICAgICAgICAgIGJyZWFrOwogICAgICAgI
20H0KICAgICAgfQogICAgICBpZiAoc2VnbWVudEhlYWRlci5sZW5ndGggPT09IDB4ZmZmZmZmZmYpIHsKICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigic2VnbWVudCBlbmQgd2FzIG5vdCBmb3VuZCIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCB1bmtub3duIHNlZ21lbnQgbGVuZ3RoIik7CiAgICB9CiAgfQogIHNlZ21lbnRIZWFkZXIuaGVhZGVyRW5kID0gcG9zaXRpb247CiAgcmV0dXJuIHNlZ21lbnRIZWFkZXI7Cn0KZnVuY3Rpb24gcmVhZFNlZ21lbnRzKGhlYWRlciwgZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IHNlZ21lbnRzID0gW107CiAgbGV0IHBvc2l0aW9uID0gc3RhcnQ7CiAgd2hpbGUgKHBvc2l0aW9uIDwgZW5kKSB7CiAgICBjb25zdCBzZWdtZW50SGVhZGVyID0gcmVhZFNlZ21lbnRIZWFkZXIoZGF0YSwgcG9zaXRpb24pOwogICAgcG9zaXRpb24gPSBzZWdtZW50SGVhZGVyLmhlYWRlckVuZDsKICAgIGNvbnN0IHNlZ21lbnQgPSB7CiAgICAgIGhlYWRlcjogc2VnbWVudEhlYWRlciwKICAgICAgZGF0YQogICAgfTsKICAgIGlmICghaGVhZGVyLnJhbmRvbUFjY2VzcykgewogICAgICBzZWdtZW50LnN0YXJ0ID0gcG9zaXRpb247CiAgICAgIHBvc2l0aW9uICs9IHNlZ21lbnRIZWFkZXIubGVuZ3RoOwogICAgICBzZWdtZW50LmVuZCA9IHBvc2l0aW9uOwogICAgfQogICAgc2VnbWVudHMucHVzaChzZWdtZW50KTsKICAgIGlmIChzZWdtZW50SGVhZGVyLnR5cGUgPT09IDUxKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaGVhZGVyLnJhbmRvbUFjY2VzcykgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBzZWdtZW50c1tpXS5zdGFydCA9IHBvc2l0aW9uOwogICAgICBwb3NpdGlvbiArPSBzZWdtZW50c1tpXS5oZWFkZXIubGVuZ3RoOwogICAgICBzZWdtZW50c1tpXS5lbmQgPSBwb3NpdGlvbjsKICAgIH0KICB9CiAgcmV0dXJuIHNlZ21lbnRzOwp9CmZ1bmN0aW9uIHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgc3RhcnQpIHsKICByZXR1cm4gewogICAgd2lkdGg6IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQpLAogICAgaGVpZ2h0OiByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgNCksCiAgICB4OiByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgOCksCiAgICB5OiByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgMTIpLAogICAgY29tYmluYXRpb25PcGVyYXRvcjogZGF0YVtzdGFydCArIDE2XSAmIDcKICB9Owp9CmNvbnN0IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoID0gMTc7CmZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHsKICBjb25zdCBoZWFkZXIgPSBzZWdtZW50LmhlYWRlcjsKICBjb25zdCBkYXRhID0gc2VnbWVudC5kYXRhLAogICAgZW5kID0gc2VnbWVudC5lbmQ7CiAgbGV0IHBvc2l0aW9uID0gc2VnbWVudC5zdGFydDsKICBsZXQgYXJncywgYXQsIGksIGF0TGVuZ3RoOwogIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHsKICAgIGNhc2UgMDoKICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHt9OwogICAgICBjb25zdCBkaWN0aW9uYXJ5RmxhZ3MgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTsKICAgICAgZGljdGlvbmFyeS5odWZmbWFuID0gISEoZGljdGlvbmFyeUZsYWdzICYgMSk7CiAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDIpOwogICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDIgJiAzOwogICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDQgJiAzOwogICAgICBkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3RvciA9IGRpY3Rpb25hcnlGbGFncyA+PiA2ICYgMTsKICAgICAgZGljdGlvbmFyeS5hZ2dyZWdhdGlvbkluc3RhbmNlc1NlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDcgJiAxOwogICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRVc2VkID0gISEoZGljdGlvbmFyeUZsYWdzICYgMjU2KTsKICAgICAgZGljdGlvbmFyeS5iaXRtYXBDb2RpbmdDb250ZXh0UmV0YWluZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiA1MTIpOwogICAgICBkaWN0aW9uYXJ5LnRlbXBsYXRlID0gZGljdGlvbmFyeUZsYWdzID4+IDEwICYgMzsKICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gMTIgJiAxOwogICAgICBwb3NpdGlvbiArPSAyOwogICAgICBpZiAoIWRpY3Rpb25hcnkuaHVmZm1hbikgewogICAgICAgIGF0TGVuZ3RoID0gZGljdGlvbmFyeS50ZW1wbGF0ZSA9PT0gMCA/IDQgOiAxOwogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0TGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGF0LnB1c2goewogICAgICAgICAgICB4OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgZGljdGlvbmFyeS5hdCA9IGF0OwogICAgICB9CiAgICAgIGlmIChkaWN0aW9uYXJ5LnJlZmluZW1lbnQgJiYgIWRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlKSB7CiAgICAgICAgYXQgPSBbXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICBhdC5wdXNoKHsKICAgICAgICAgICAgeDogcmVhZEludDgoZGF0YSwgcG9zaXRpb24pLAogICAgICAgICAgICB5OiByZWFkSW50OChkYXRhLCBwb3NpdGlvbiArIDEpCiAgICAgICAgICB9KTsKICAgICAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgICAgfQogICAgICAgIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0ID0gYXQ7CiAgICAgIH0KICAgICAgZGljdGlvbmFyeS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scyA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBhcmdzID0gW2RpY3Rpb25hcnksIGhlYWRlci5udW1iZXIsIGhlYWRlci5yZWZlcnJlZFRvLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDY6CiAgICBjYXNlIDc6CiAgICAgIGNvbnN0IHRleHRSZWdpb24gPSB7fTsKICAgICAgdGV4dFJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CiAgICAgI
20HBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOwogICAgICBjb25zdCB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIHRleHRSZWdpb24uaHVmZm1hbiA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50ID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDIpOwogICAgICB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMiAmIDM7CiAgICAgIHRleHRSZWdpb24uc3RyaXBTaXplID0gMSA8PCB0ZXh0UmVnaW9uLmxvZ1N0cmlwU2l6ZTsKICAgICAgdGV4dFJlZ2lvbi5yZWZlcmVuY2VDb3JuZXIgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDQgJiAzOwogICAgICB0ZXh0UmVnaW9uLnRyYW5zcG9zZWQgPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgNjQpOwogICAgICB0ZXh0UmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDcgJiAzOwogICAgICB0ZXh0UmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA5ICYgMTsKICAgICAgdGV4dFJlZ2lvbi5kc09mZnNldCA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPDwgMTcgPj4gMjc7CiAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudFRlbXBsYXRlID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiAxNSAmIDE7CiAgICAgIGlmICh0ZXh0UmVnaW9uLmh1ZmZtYW4pIHsKICAgICAgICBjb25zdCB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID0gcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5GUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAyICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EVCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNCAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERXID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA2ICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50REggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDggJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTAgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWSA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTIgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3IgPSAhISh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMHg0MDAwKTsKICAgICAgfQogICAgICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50ICYmICF0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSkgewogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uKSwKICAgICAgICAgICAgeTogcmVhZEludDgoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRBdCA9IGF0OwogICAgICB9CiAgICAgIHRleHRSZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMgPSByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgYXJncyA9IFt0ZXh0UmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNjoKICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnkgPSB7fTsKICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnlGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1tciA9ICEhKHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkudGVtcGxhdGUgPSBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEgJiAzOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuV2lkdGggPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0ID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGFyZ3MgPSBbcGF0dGVybkRpY3Rpb25hcnksIGhlYWRlci5udW1iZXIsIGRhdGEsIHBvc2l0aW9uLCBlbmRdOwogICAgICBicmVhazsKICAgIGNhc2UgMjI6CiAgICBjYXNlIDIzOgogICAgICBjb25zdCBoYWxmdG9uZVJlZ2lvbiA9IHt9OwogICAgICBoYWxmdG9uZVJlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOwogICAgICBjb25zdCBoYWxmdG9uZVJlZ2lvbkZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgaGFsZnRvbmVSZWdpb24ubW1yID0gISEoaGFsZnRvbmVSZWdpb25GbGFncyAmIDEpOwogICAgICBoYWxmdG9uZVJlZ2lvbi50ZW1wbGF0ZSA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gMSAmIDM7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmVuYWJsZVNraXAgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgOCk7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBoYWxmdG9uZVJlZ2lvbkZsYWdzID4+IDQgJiA3OwogICAgICBoYWxmdG9uZVJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNyAmIDE7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRXaWR0aCA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkSGVpZ2h0ID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbik7CiAgICAgI
20HBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRPZmZzZXRYID0gcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbikgJiAweGZmZmZmZmZmOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBoYWxmdG9uZVJlZ2lvbi5ncmlkT2Zmc2V0WSA9IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24pICYgMHhmZmZmZmZmZjsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclggPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclkgPSByZWFkVWludDE2KGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgYXJncyA9IFtoYWxmdG9uZVJlZ2lvbiwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOwogICAgICBicmVhazsKICAgIGNhc2UgMzg6CiAgICBjYXNlIDM5OgogICAgICBjb25zdCBnZW5lcmljUmVnaW9uID0ge307CiAgICAgIGdlbmVyaWNSZWdpb24uaW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBSZWdpb25TZWdtZW50SW5mb3JtYXRpb25GaWVsZExlbmd0aDsKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIGdlbmVyaWNSZWdpb24ubW1yID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDEpOwogICAgICBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID0gZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyA+PiAxICYgMzsKICAgICAgZ2VuZXJpY1JlZ2lvbi5wcmVkaWN0aW9uID0gISEoZ2VuZXJpY1JlZ2lvblNlZ21lbnRGbGFncyAmIDgpOwogICAgICBpZiAoIWdlbmVyaWNSZWdpb24ubW1yKSB7CiAgICAgICAgYXRMZW5ndGggPSBnZW5lcmljUmVnaW9uLnRlbXBsYXRlID09PSAwID8gNCA6IDE7CiAgICAgICAgYXQgPSBbXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6IHJlYWRJbnQ4KGRhdGEsIHBvc2l0aW9uKSwKICAgICAgICAgICAgeTogcmVhZEludDgoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7CiAgICAgIH0KICAgICAgYXJncyA9IFtnZW5lcmljUmVnaW9uLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDQ4OgogICAgICBjb25zdCBwYWdlSW5mbyA9IHsKICAgICAgICB3aWR0aDogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgaGVpZ2h0OiByZWFkVWludDMyKGRhdGEsIHBvc2l0aW9uICsgNCksCiAgICAgICAgcmVzb2x1dGlvblg6IHJlYWRVaW50MzIoZGF0YSwgcG9zaXRpb24gKyA4KSwKICAgICAgICByZXNvbHV0aW9uWTogcmVhZFVpbnQzMihkYXRhLCBwb3NpdGlvbiArIDEyKQogICAgICB9OwogICAgICBpZiAocGFnZUluZm8uaGVpZ2h0ID09PSAweGZmZmZmZmZmKSB7CiAgICAgICAgZGVsZXRlIHBhZ2VJbmZvLmhlaWdodDsKICAgICAgfQogICAgICBjb25zdCBwYWdlU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIDE2XTsKICAgICAgcmVhZFVpbnQxNihkYXRhLCBwb3NpdGlvbiArIDE3KTsKICAgICAgcGFnZUluZm8ubG9zc2xlc3MgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMSk7CiAgICAgIHBhZ2VJbmZvLnJlZmluZW1lbnQgPSAhIShwYWdlU2VnbWVudEZsYWdzICYgMik7CiAgICAgIHBhZ2VJbmZvLmRlZmF1bHRQaXhlbFZhbHVlID0gcGFnZVNlZ21lbnRGbGFncyA+PiAyICYgMTsKICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvciA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMyAmIDM7CiAgICAgIHBhZ2VJbmZvLnJlcXVpcmVzQnVmZmVyID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDMyKTsKICAgICAgcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDY0KTsKICAgICAgYXJncyA9IFtwYWdlSW5mb107CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OToKICAgICAgYnJlYWs7CiAgICBjYXNlIDUwOgogICAgICBicmVhazsKICAgIGNhc2UgNTE6CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MzoKICAgICAgYXJncyA9IFtoZWFkZXIubnVtYmVyLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDYyOgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBzZWdtZW50IHR5cGUgJHtoZWFkZXIudHlwZU5hbWV9KCR7aGVhZGVyLnR5cGV9KSBpcyBub3QgaW1wbGVtZW50ZWRgKTsKICB9CiAgY29uc3QgY2FsbGJhY2tOYW1lID0gIm9uIiArIGhlYWRlci50eXBlTmFtZTsKICBpZiAoY2FsbGJhY2tOYW1lIGluIHZpc2l0b3IpIHsKICAgIHZpc2l0b3JbY2FsbGJhY2tOYW1lXS5hcHBseSh2aXNpdG9yLCBhcmdzKTsKICB9Cn0KZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKSB7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc2VnbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgcHJvY2Vzc1NlZ21lbnQoc2VnbWVudHNbaV0sIHZpc2l0b3IpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcykgewogIGNvbnN0IHZpc2l0b3IgPSBuZXcgU2ltcGxlU2VnbWVudFZpc2l0b3IoKTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaHVua3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2h1bmsgPSBjaHVua3NbaV07CiAgICBjb25zdCBzZWdtZW50cyA9IHJlYWRTZWdtZW50cyh7fSwgY2h1bmsuZGF0YSwgY2h1bmsuc3RhcnQsIGNodW5rLmVuZCk7CiAgICBwcm9jZXNzU2VnbWVudHMoc2VnbWVudHMsIHZpc2l0b3IpOwogIH0KICByZXR1cm4gdmlzaXRvci5idWZmZXI7Cn0KZnVuY3Rpb24gcGFyc2VKYmlnMihkYXRhKSB7CiAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IHBhcnNlSmJpZzIiKTsKfQpjbGFzcyBTaW1wbGVTZWdtZW50VmlzaXRvciB7CiAgb25QYWdlSW5mb3JtYXRpb24oaW5mbykgewogICAgdGhpcy5jdXJyZW50UGFnZUluZm8gPSBpbmZvOwogICAgY29uc3Qgcm93U2l6ZSA9IGluZm8ud2lkdGggKyA3ID4+IDM7CiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSAqIGluZm8uaGVpZ2h0KTsKICAgIGlmIChpbmZvLmRlZmF1bHRQaXhlbFZhbHVlKSB7CiAgICAgIGJ1ZmZlci5maWxsKDB4ZmYpOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CiAgfQogIGRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKSB7CiAgICBjb25zdCBwYWdlSW5mbyA9IHRoaXMuY3VycmVudFBhZ2VJbmZvOwogICAgY29uc3Qgd2lkdGggPSByZWdpb25JbmZvLndpZHRoLAogICAgICBoZWlnaHQgPSByZWdpb25JbmZvLmhlaWdodDsKICAgIGNvbnN0IHJvd1NpemUgPSBwYWdlSW5mby53aWR0aCArIDcgPj4gMzsKICAgIGNvbnN0IGNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlSW5mby5jb21iaW5
20hdGlvbk9wZXJhdG9yT3ZlcnJpZGUgPyByZWdpb25JbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgOiBwYWdlSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yOwogICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBjb25zdCBtYXNrMCA9IDEyOCA+PiAocmVnaW9uSW5mby54ICYgNyk7CiAgICBsZXQgb2Zmc2V0MCA9IHJlZ2lvbkluZm8ueSAqIHJvd1NpemUgKyAocmVnaW9uSW5mby54ID4+IDMpOwogICAgbGV0IGksIGosIG1hc2ssIG9mZnNldDsKICAgIHN3aXRjaCAoY29tYmluYXRpb25PcGVyYXRvcikgewogICAgICBjYXNlIDA6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICAgICAgICBtYXNrID0gbWFzazA7CiAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQwOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKICAgICAgICAgICAgaWYgKGJpdG1hcFtpXVtqXSkgewogICAgICAgICAgICAgIGJ1ZmZlcltvZmZzZXRdIHw9IG1hc2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWFzayA+Pj0gMTsKICAgICAgICAgICAgaWYgKCFtYXNrKSB7CiAgICAgICAgICAgICAgbWFzayA9IDEyODsKICAgICAgICAgICAgICBvZmZzZXQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0MCArPSByb3dTaXplOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgICAgbWFzayA9IG1hc2swOwogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSBePSBtYXNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICAgIGlmICghbWFzaykgewogICAgICAgICAgICAgIG1hc2sgPSAxMjg7CiAgICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGApOwogICAgfQogIH0KICBvbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24ocmVnaW9uLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBjb25zdCBkZWNvZGluZ0NvbnRleHQgPSBuZXcgRGVjb2RpbmdDb250ZXh0KGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgY29uc3QgYml0bWFwID0gZGVjb2RlQml0bWFwKHJlZ2lvbi5tbXIsIHJlZ2lvbkluZm8ud2lkdGgsIHJlZ2lvbkluZm8uaGVpZ2h0LCByZWdpb24udGVtcGxhdGUsIHJlZ2lvbi5wcmVkaWN0aW9uLCBudWxsLCByZWdpb24uYXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKICB9CiAgb25JbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24oKSB7CiAgICB0aGlzLm9uSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiguLi5hcmd1bWVudHMpOwogIH0KICBvblN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIHJlZmVycmVkU2VnbWVudHMsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGxldCBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7CiAgICBpZiAoZGljdGlvbmFyeS5odWZmbWFuKSB7CiAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhkaWN0aW9uYXJ5LCByZWZlcnJlZFNlZ21lbnRzLCB0aGlzLmN1c3RvbVRhYmxlcyk7CiAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICB9CiAgICBsZXQgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKICAgIGlmICghc3ltYm9scykgewogICAgICB0aGlzLnN5bWJvbHMgPSBzeW1ib2xzID0ge307CiAgICB9CiAgICBjb25zdCBpbnB1dFN5bWJvbHMgPSBbXTsKICAgIGZvciAoY29uc3QgcmVmZXJyZWRTZWdtZW50IG9mIHJlZmVycmVkU2VnbWVudHMpIHsKICAgICAgY29uc3QgcmVmZXJyZWRTeW1ib2xzID0gc3ltYm9sc1tyZWZlcnJlZFNlZ21lbnRdOwogICAgICBpZiAocmVmZXJyZWRTeW1ib2xzKSB7CiAgICAgICAgaW5wdXRTeW1ib2xzLnB1c2goLi4ucmVmZXJyZWRTeW1ib2xzKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIHN5bWJvbHNbY3VycmVudFNlZ21lbnRdID0gZGVjb2RlU3ltYm9sRGljdGlvbmFyeShkaWN0aW9uYXJ5Lmh1ZmZtYW4sIGRpY3Rpb25hcnkucmVmaW5lbWVudCwgaW5wdXRTeW1ib2xzLCBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZkV4cG9ydGVkU3ltYm9scywgaHVmZm1hblRhYmxlcywgZGljdGlvbmFyeS50ZW1wbGF0ZSwgZGljdGlvbmFyeS5hdCwgZGljdGlvbmFyeS5yZWZpbmVtZW50VGVtcGxhdGUsIGRpY3Rpb25hcnkucmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCk7CiAgfQogIG9uSW1tZWRpYXRlVGV4dFJlZ2lvbihyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKICAgIGxldCBodWZmbWFuVGFibGVzLCBodWZmbWFuSW5wdXQ7CiAgICBjb25zdCBzeW1ib2xzID0gdGhpcy5zeW1ib2xzOwogICAgY29uc3QgaW5wdXRTeW1ib2xzID0gW107CiAgICBmb3IgKGNvbnN0IHJlZmVycmVkU2VnbWVudCBvZiByZWZlcnJlZFNlZ21lbnRzKSB7CiAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50XTsKICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgewogICAgICAgIGlucHV0U3ltYm9scy5wdXNoKC4uLnJlZmVycmVkU3ltYm9scyk7CiAgICAgI
20H0KICAgIH0KICAgIGNvbnN0IHN5bWJvbENvZGVMZW5ndGggPSBsb2cyKGlucHV0U3ltYm9scy5sZW5ndGgpOwogICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7CiAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIHRoaXMuY3VzdG9tVGFibGVzLCBpbnB1dFN5bWJvbHMubGVuZ3RoLCBodWZmbWFuSW5wdXQpOwogICAgfQogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24ocmVnaW9uLmh1ZmZtYW4sIHJlZ2lvbi5yZWZpbmVtZW50LCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsIHJlZ2lvbi5zdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgcmVnaW9uLnRyYW5zcG9zZWQsIHJlZ2lvbi5kc09mZnNldCwgcmVnaW9uLnJlZmVyZW5jZUNvcm5lciwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUsIHJlZ2lvbi5yZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgcmVnaW9uLmxvZ1N0cmlwU2l6ZSwgaHVmZm1hbklucHV0KTsKICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApOwogIH0KICBvbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHsKICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uKC4uLmFyZ3VtZW50cyk7CiAgfQogIG9uUGF0dGVybkRpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGxldCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnM7CiAgICBpZiAoIXBhdHRlcm5zKSB7CiAgICAgIHRoaXMucGF0dGVybnMgPSBwYXR0ZXJucyA9IHt9OwogICAgfQogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIHBhdHRlcm5zW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnkubW1yLCBkaWN0aW9uYXJ5LnBhdHRlcm5XaWR0aCwgZGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0LCBkaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCwgZGljdGlvbmFyeS50ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KTsKICB9CiAgb25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wYXR0ZXJuc1tyZWZlcnJlZFNlZ21lbnRzWzBdXTsKICAgIGNvbnN0IHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBjb25zdCBiaXRtYXAgPSBkZWNvZGVIYWxmdG9uZVJlZ2lvbihyZWdpb24ubW1yLCBwYXR0ZXJucywgcmVnaW9uLnRlbXBsYXRlLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24uZW5hYmxlU2tpcCwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIHJlZ2lvbi5ncmlkV2lkdGgsIHJlZ2lvbi5ncmlkSGVpZ2h0LCByZWdpb24uZ3JpZE9mZnNldFgsIHJlZ2lvbi5ncmlkT2Zmc2V0WSwgcmVnaW9uLmdyaWRWZWN0b3JYLCByZWdpb24uZ3JpZFZlY3RvclksIGRlY29kaW5nQ29udGV4dCk7CiAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKICB9CiAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkgewogICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKC4uLmFyZ3VtZW50cyk7CiAgfQogIG9uVGFibGVzKGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgY3VzdG9tVGFibGVzID0gdGhpcy5jdXN0b21UYWJsZXM7CiAgICBpZiAoIWN1c3RvbVRhYmxlcykgewogICAgICB0aGlzLmN1c3RvbVRhYmxlcyA9IGN1c3RvbVRhYmxlcyA9IHt9OwogICAgfQogICAgY3VzdG9tVGFibGVzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgfQp9CmNsYXNzIEh1ZmZtYW5MaW5lIHsKICBjb25zdHJ1Y3RvcihsaW5lRGF0YSkgewogICAgaWYgKGxpbmVEYXRhLmxlbmd0aCA9PT0gMikgewogICAgICB0aGlzLmlzT09CID0gdHJ1ZTsKICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7CiAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMF07CiAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSAwOwogICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNPT0IgPSBmYWxzZTsKICAgICAgdGhpcy5yYW5nZUxvdyA9IGxpbmVEYXRhWzBdOwogICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzFdOwogICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZURhdGFbMl07CiAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzNdOwogICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmVEYXRhWzRdID09PSAibG93ZXIiOwogICAgfQogIH0KfQpjbGFzcyBIdWZmbWFuVHJlZU5vZGUgewogIGNvbnN0cnVjdG9yKGxpbmUpIHsKICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgIGlmIChsaW5lKSB7CiAgICAgIHRoaXMuaXNMZWFmID0gdHJ1ZTsKICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lLnJhbmdlTG93OwogICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmUuaXNMb3dlclJhbmdlOwogICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNMZWFmID0gZmFsc2U7CiAgICB9CiAgfQogIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkgewogICAgY29uc3QgYml0ID0gbGluZS5wcmVmaXhDb2RlID4+IHNoaWZ0ICYgMTsKICAgIGlmIChzaGlmdCA8PSAwKSB7CiAgICAgI
20HRoaXMuY2hpbGRyZW5bYml0XSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobGluZSk7CiAgICB9IGVsc2UgewogICAgICBsZXQgbm9kZSA9IHRoaXMuY2hpbGRyZW5bYml0XTsKICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CiAgICAgIH0KICAgICAgbm9kZS5idWlsZFRyZWUobGluZSwgc2hpZnQgLSAxKTsKICAgIH0KICB9CiAgZGVjb2RlTm9kZShyZWFkZXIpIHsKICAgIGlmICh0aGlzLmlzTGVhZikgewogICAgICBpZiAodGhpcy5pc09PQikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGh0T2Zmc2V0ID0gcmVhZGVyLnJlYWRCaXRzKHRoaXMucmFuZ2VMZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5yYW5nZUxvdyArICh0aGlzLmlzTG93ZXJSYW5nZSA/IC1odE9mZnNldCA6IGh0T2Zmc2V0KTsKICAgIH0KICAgIGNvbnN0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW3JlYWRlci5yZWFkQml0KCldOwogICAgaWYgKCFub2RlKSB7CiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gZGF0YSIpOwogICAgfQogICAgcmV0dXJuIG5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOwogIH0KfQpjbGFzcyBIdWZmbWFuVGFibGUgewogIGNvbnN0cnVjdG9yKGxpbmVzLCBwcmVmaXhDb2Rlc0RvbmUpIHsKICAgIGlmICghcHJlZml4Q29kZXNEb25lKSB7CiAgICAgIHRoaXMuYXNzaWduUHJlZml4Q29kZXMobGluZXMpOwogICAgfQogICAgdGhpcy5yb290Tm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKGxpbmUsIGxpbmUucHJlZml4TGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgIH0KICB9CiAgZGVjb2RlKHJlYWRlcikgewogICAgcmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOwogIH0KICBhc3NpZ25QcmVmaXhDb2RlcyhsaW5lcykgewogICAgY29uc3QgbGluZXNMZW5ndGggPSBsaW5lcy5sZW5ndGg7CiAgICBsZXQgcHJlZml4TGVuZ3RoTWF4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNMZW5ndGg7IGkrKykgewogICAgICBwcmVmaXhMZW5ndGhNYXggPSBNYXRoLm1heChwcmVmaXhMZW5ndGhNYXgsIGxpbmVzW2ldLnByZWZpeExlbmd0aCk7CiAgICB9CiAgICBjb25zdCBoaXN0b2dyYW0gPSBuZXcgVWludDMyQXJyYXkocHJlZml4TGVuZ3RoTWF4ICsgMSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKICAgICAgaGlzdG9ncmFtW2xpbmVzW2ldLnByZWZpeExlbmd0aF0rKzsKICAgIH0KICAgIGxldCBjdXJyZW50TGVuZ3RoID0gMSwKICAgICAgZmlyc3RDb2RlID0gMCwKICAgICAgY3VycmVudENvZGUsCiAgICAgIGN1cnJlbnRUZW1wLAogICAgICBsaW5lOwogICAgaGlzdG9ncmFtWzBdID0gMDsKICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkgewogICAgICBmaXJzdENvZGUgPSBmaXJzdENvZGUgKyBoaXN0b2dyYW1bY3VycmVudExlbmd0aCAtIDFdIDw8IDE7CiAgICAgIGN1cnJlbnRDb2RlID0gZmlyc3RDb2RlOwogICAgICBjdXJyZW50VGVtcCA9IDA7CiAgICAgIHdoaWxlIChjdXJyZW50VGVtcCA8IGxpbmVzTGVuZ3RoKSB7CiAgICAgICAgbGluZSA9IGxpbmVzW2N1cnJlbnRUZW1wXTsKICAgICAgICBpZiAobGluZS5wcmVmaXhMZW5ndGggPT09IGN1cnJlbnRMZW5ndGgpIHsKICAgICAgICAgIGxpbmUucHJlZml4Q29kZSA9IGN1cnJlbnRDb2RlOwogICAgICAgICAgY3VycmVudENvZGUrKzsKICAgICAgICB9CiAgICAgICAgY3VycmVudFRlbXArKzsKICAgICAgfQogICAgICBjdXJyZW50TGVuZ3RoKys7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IGZsYWdzID0gZGF0YVtzdGFydF07CiAgY29uc3QgbG93ZXN0VmFsdWUgPSByZWFkVWludDMyKGRhdGEsIHN0YXJ0ICsgMSkgJiAweGZmZmZmZmZmOwogIGNvbnN0IGhpZ2hlc3RWYWx1ZSA9IHJlYWRVaW50MzIoZGF0YSwgc3RhcnQgKyA1KSAmIDB4ZmZmZmZmZmY7CiAgY29uc3QgcmVhZGVyID0gbmV3IFJlYWRlcihkYXRhLCBzdGFydCArIDksIGVuZCk7CiAgY29uc3QgcHJlZml4U2l6ZUJpdHMgPSAoZmxhZ3MgPj4gMSAmIDcpICsgMTsKICBjb25zdCByYW5nZVNpemVCaXRzID0gKGZsYWdzID4+IDQgJiA3KSArIDE7CiAgY29uc3QgbGluZXMgPSBbXTsKICBsZXQgcHJlZml4TGVuZ3RoLAogICAgcmFuZ2VMZW5ndGgsCiAgICBjdXJyZW50UmFuZ2VMb3cgPSBsb3dlc3RWYWx1ZTsKICBkbyB7CiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOwogICAgcmFuZ2VMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocmFuZ2VTaXplQml0cyk7CiAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbY3VycmVudFJhbmdlTG93LCBwcmVmaXhMZW5ndGgsIHJhbmdlTGVuZ3RoLCAwXSkpOwogICAgY3VycmVudFJhbmdlTG93ICs9IDEgPDwgcmFuZ2VMZW5ndGg7CiAgfSB3aGlsZSAoY3VycmVudFJhbmdlTG93IDwgaGlnaGVzdFZhbHVlKTsKICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOwogIGxpbmVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtsb3dlc3RWYWx1ZSAtIDEsIHByZWZpeExlbmd0aCwgMzIsIDAsICJsb3dlciJdKSk7CiAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaGlnaGVzdFZhbHVlLCBwcmVmaXhMZW5ndGgsIDMyLCAwXSkpOwogIGlmIChmbGFncyAmIDEpIHsKICAgIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CiAgICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbcHJlZml4TGVuZ3RoLCAwXSkpOwogIH0KICByZXR1cm4gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgZmFsc2UpOwp9CmNvbnN0IHN0YW5kYXJkVGFibGVzQ2FjaGUgPSB7fTsKZnVuY3Rpb24gZ2V0U3RhbmRhcmRUYWJsZShudW1iZXIpIHsKICBsZXQgdGFibGUgPSBzdGFuZGFyZFRhYmxlc0NhY2hlW251bWJlcl07CiAgaWYgKHRhYmxlKSB7CiAgICByZXR1cm4gdGFibGU7CiAgfQogIGxldCBsaW5lczsKICBzd2l0Y2ggKG51bWJlcikgewogICAgY2FzZSAxOgogICAgICBsaW5lcyA9IFtbMCwgMSwgNCwgMHgwXSwgWzE2LCAyLCA4LCAweDJdLCBbMjcyLCAz
20LCAxNiwgMHg2XSwgWzY1ODA4LCAzLCAzMiwgMHg3XV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICBsaW5lcyA9IFtbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWzc1LCA2LCAzMiwgMHgzZV0sIFs2LCAweDNmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICBsaW5lcyA9IFtbLTI1NiwgOCwgOCwgMHhmZV0sIFswLCAxLCAwLCAweDBdLCBbMSwgMiwgMCwgMHgyXSwgWzIsIDMsIDAsIDB4Nl0sIFszLCA0LCAzLCAweGVdLCBbMTEsIDUsIDYsIDB4MWVdLCBbLTI1NywgOCwgMzIsIDB4ZmYsICJsb3dlciJdLCBbNzUsIDcsIDMyLCAweDdlXSwgWzYsIDB4M2VdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbNzYsIDUsIDMyLCAweDFmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA1OgogICAgICBsaW5lcyA9IFtbLTI1NSwgNywgOCwgMHg3ZV0sIFsxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDAsIDB4Nl0sIFs0LCA0LCAzLCAweGVdLCBbMTIsIDUsIDYsIDB4MWVdLCBbLTI1NiwgNywgMzIsIDB4N2YsICJsb3dlciJdLCBbNzYsIDYsIDMyLCAweDNlXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2OgogICAgICBsaW5lcyA9IFtbLTIwNDgsIDUsIDEwLCAweDFjXSwgWy0xMDI0LCA0LCA5LCAweDhdLCBbLTUxMiwgNCwgOCwgMHg5XSwgWy0yNTYsIDQsIDcsIDB4YV0sIFstMTI4LCA1LCA2LCAweDFkXSwgWy02NCwgNSwgNSwgMHgxZV0sIFstMzIsIDQsIDUsIDB4Yl0sIFswLCAyLCA3LCAweDBdLCBbMTI4LCAzLCA3LCAweDJdLCBbMjU2LCAzLCA4LCAweDNdLCBbNTEyLCA0LCA5LCAweGNdLCBbMTAyNCwgNCwgMTAsIDB4ZF0sIFstMjA0OSwgNiwgMzIsIDB4M2UsICJsb3dlciJdLCBbMjA0OCwgNiwgMzIsIDB4M2ZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDc6CiAgICAgIGxpbmVzID0gW1stMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDMsIDgsIDB4MF0sIFstMjU2LCA0LCA3LCAweDldLCBbLTEyOCwgNSwgNiwgMHgxYV0sIFstNjQsIDUsIDUsIDB4MWJdLCBbLTMyLCA0LCA1LCAweGFdLCBbMCwgNCwgNSwgMHhiXSwgWzMyLCA1LCA1LCAweDFjXSwgWzY0LCA1LCA2LCAweDFkXSwgWzEyOCwgNCwgNywgMHhjXSwgWzI1NiwgMywgOCwgMHgxXSwgWzUxMiwgMywgOSwgMHgyXSwgWzEwMjQsIDMsIDEwLCAweDNdLCBbLTEwMjUsIDUsIDMyLCAweDFlLCAibG93ZXIiXSwgWzIwNDgsIDUsIDMyLCAweDFmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA4OgogICAgICBsaW5lcyA9IFtbLTE1LCA4LCAzLCAweGZjXSwgWy03LCA5LCAxLCAweDFmY10sIFstNSwgOCwgMSwgMHhmZF0sIFstMywgOSwgMCwgMHgxZmRdLCBbLTIsIDcsIDAsIDB4N2NdLCBbLTEsIDQsIDAsIDB4YV0sIFswLCAyLCAxLCAweDBdLCBbMiwgNSwgMCwgMHgxYV0sIFszLCA2LCAwLCAweDNhXSwgWzQsIDMsIDQsIDB4NF0sIFsyMCwgNiwgMSwgMHgzYl0sIFsyMiwgNCwgNCwgMHhiXSwgWzM4LCA0LCA1LCAweGNdLCBbNzAsIDUsIDYsIDB4MWJdLCBbMTM0LCA1LCA3LCAweDFjXSwgWzI2MiwgNiwgNywgMHgzY10sIFszOTAsIDcsIDgsIDB4N2RdLCBbNjQ2LCA2LCAxMCwgMHgzZF0sIFstMTYsIDksIDMyLCAweDFmZSwgImxvd2VyIl0sIFsxNjcwLCA5LCAzMiwgMHgxZmZdLCBbMiwgMHgxXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA5OgogICAgICBsaW5lcyA9IFtbLTMxLCA4LCA0LCAweGZjXSwgWy0xNSwgOSwgMiwgMHgxZmNdLCBbLTExLCA4LCAyLCAweGZkXSwgWy03LCA5LCAxLCAweDFmZF0sIFstNSwgNywgMSwgMHg3Y10sIFstMywgNCwgMSwgMHhhXSwgWy0xLCAzLCAxLCAweDJdLCBbMSwgMywgMSwgMHgzXSwgWzMsIDUsIDEsIDB4MWFdLCBbNSwgNiwgMSwgMHgzYV0sIFs3LCAzLCA1LCAweDRdLCBbMzksIDYsIDIsIDB4M2JdLCBbNDMsIDQsIDUsIDB4Yl0sIFs3NSwgNCwgNiwgMHhjXSwgWzEzOSwgNSwgNywgMHgxYl0sIFsyNjcsIDUsIDgsIDB4MWNdLCBbNTIzLCA2LCA4LCAweDNjXSwgWzc3OSwgNywgOSwgMHg3ZF0sIFsxMjkxLCA2LCAxMSwgMHgzZF0sIFstMzIsIDksIDMyLCAweDFmZSwgImxvd2VyIl0sIFszMzM5LCA5LCAzMiwgMHgxZmZdLCBbMiwgMHgwXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMDoKICAgICAgbGluZXMgPSBbWy0yMSwgNywgNCwgMHg3YV0sIFstNSwgOCwgMCwgMHhmY10sIFstNCwgNywgMCwgMHg3Yl0sIFstMywgNSwgMCwgMHgxOF0sIFstMiwgMiwgMiwgMHgwXSwgWzIsIDUsIDAsIDB4MTldLCBbMywgNiwgMCwgMHgzNl0sIFs0LCA3LCAwLCAweDdjXSwgWzUsIDgsIDAsIDB4ZmRdLCBbNiwgMiwgNiwgMHgxXSwgWzcwLCA1LCA1LCAweDFhXSwgWzEwMiwgNiwgNSwgMHgzN10sIFsxMzQsIDYsIDYsIDB4MzhdLCBbMTk4LCA2LCA3LCAweDM5XSwgWzMyNiwgNiwgOCwgMHgzYV0sIFs1ODIsIDYsIDksIDB4M2JdLCBbMTA5NCwgNiwgMTAsIDB4M2NdLCBbMjExOCwgNywgMTEsIDB4N2RdLCBbLTIyLCA4LCAzMiwgMHhmZSwgImxvd2VyIl0sIFs0MTY2LCA4LCAzMiwgMHhmZl0sIFsyLCAweDJdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDExOgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDEsIDB4Ml0sIFs0LCA0LCAwLCAweGNdLCBbNSwgNCwgMSwgMHhkXSwgWzcsIDUsIDEsIDB4MWNdLCBbOSwgNSwgMiwgMHgxZF0sIFsxMywgNiwgMiwgMHgzY10sIFsxNywgNywgMiwgMHg3YV0sIFsyMSwgNywgMywgMHg3Yl0sIFsyOSwgNywgNCwgMHg3Y10sIFs0NSwgNywgNSwgMHg3ZF0sIFs3NywgNywgNiwgMHg3ZV0sIFsxNDEsIDcsIDMyLCAweDdmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMjoKICAgICAgbGluZXMgPSBbWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAwLCAweDJdLCBbMywgMywgMSwgMHg2XSwgWzUsIDUsIDAsIDB4MWNdLCBbNiwgNSwgMSwgMHgxZF0sIFs4LCA2LCAxLCAweDNjXSwgWzEwLCA3LCAwLCAweDdhXSwgWzExLCA3LCAxLCAweDdiXSwgWzEzLCA3LCAyLCAweDdjXSwgWzE3LCA3LCAzLCAweDdkXSwgWzI1LCA3LCA0LCAweDdlXSwgWzQxLCA4LCA1LCAweGZlXSwgWzczLCA4LCAzMiwgMHhmZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTM6CiAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMywgMCwgMHg0XSwgWzMsIDQsIDAsIDB4Y10sIFs0LCA1LCAwLCAweDFjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCAzLCAzLCAweDVdLCBbMTUsIDYsIDEsIDB4M2FdLCBbMTcsIDYsIDIsIDB4M2JdLCBbMjEsIDYsIDMsIDB4M2NdLCBbMjksIDYsIDQsIDB4M2RdLCBbNDUsIDYsIDUsIDB4M2VdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTQ6CiAgICAgIGxpbmVzID0gW1stMiwgMywgMCwgMHg0XSwgWy0xLCAzLCAwLCAweDVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4Nl0sIFsyLCAz
20LCAwLCAweDddXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE1OgogICAgICBsaW5lcyA9IFtbLTI0LCA3LCA0LCAweDdjXSwgWy04LCA2LCAyLCAweDNjXSwgWy00LCA1LCAxLCAweDFjXSwgWy0yLCA0LCAwLCAweGNdLCBbLTEsIDMsIDAsIDB4NF0sIFswLCAxLCAwLCAweDBdLCBbMSwgMywgMCwgMHg1XSwgWzIsIDQsIDAsIDB4ZF0sIFszLCA1LCAxLCAweDFkXSwgWzUsIDYsIDIsIDB4M2RdLCBbOSwgNywgNCwgMHg3ZF0sIFstMjUsIDcsIDMyLCAweDdlLCAibG93ZXIiXSwgWzI1LCA3LCAzMiwgMHg3Zl1dOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBzdGFuZGFyZCB0YWJsZSBCLiR7bnVtYmVyfSBkb2VzIG5vdCBleGlzdGApOwogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBsaW5lc1tpXSA9IG5ldyBIdWZmbWFuTGluZShsaW5lc1tpXSk7CiAgfQogIHRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShsaW5lcywgdHJ1ZSk7CiAgc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdID0gdGFibGU7CiAgcmV0dXJuIHRhYmxlOwp9CmNsYXNzIFJlYWRlciB7CiAgY29uc3RydWN0b3IoZGF0YSwgc3RhcnQsIGVuZCkgewogICAgdGhpcy5kYXRhID0gZGF0YTsKICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKICAgIHRoaXMuZW5kID0gZW5kOwogICAgdGhpcy5wb3NpdGlvbiA9IHN0YXJ0OwogICAgdGhpcy5zaGlmdCA9IC0xOwogICAgdGhpcy5jdXJyZW50Qnl0ZSA9IDA7CiAgfQogIHJlYWRCaXQoKSB7CiAgICBpZiAodGhpcy5zaGlmdCA8IDApIHsKICAgICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiZW5kIG9mIGRhdGEgd2hpbGUgcmVhZGluZyBiaXQiKTsKICAgICAgfQogICAgICB0aGlzLmN1cnJlbnRCeXRlID0gdGhpcy5kYXRhW3RoaXMucG9zaXRpb24rK107CiAgICAgIHRoaXMuc2hpZnQgPSA3OwogICAgfQogICAgY29uc3QgYml0ID0gdGhpcy5jdXJyZW50Qnl0ZSA+PiB0aGlzLnNoaWZ0ICYgMTsKICAgIHRoaXMuc2hpZnQtLTsKICAgIHJldHVybiBiaXQ7CiAgfQogIHJlYWRCaXRzKG51bUJpdHMpIHsKICAgIGxldCByZXN1bHQgPSAwLAogICAgICBpOwogICAgZm9yIChpID0gbnVtQml0cyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHJlc3VsdCB8PSB0aGlzLnJlYWRCaXQoKSA8PCBpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgYnl0ZUFsaWduKCkgewogICAgdGhpcy5zaGlmdCA9IC0xOwogIH0KICBuZXh0KCkgewogICAgaWYgKHRoaXMucG9zaXRpb24gPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOwogIH0KfQpmdW5jdGlvbiBnZXRDdXN0b21IdWZmbWFuVGFibGUoaW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcykgewogIGxldCBjdXJyZW50SW5kZXggPSAwOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHJlZmVycmVkVG8ubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgdGFibGUgPSBjdXN0b21UYWJsZXNbcmVmZXJyZWRUb1tpXV07CiAgICBpZiAodGFibGUpIHsKICAgICAgaWYgKGluZGV4ID09PSBjdXJyZW50SW5kZXgpIHsKICAgICAgICByZXR1cm4gdGFibGU7CiAgICAgIH0KICAgICAgY3VycmVudEluZGV4Kys7CiAgICB9CiAgfQogIHRocm93IG5ldyBKYmlnMkVycm9yKCJjYW4ndCBmaW5kIGN1c3RvbSBIdWZmbWFuIHRhYmxlIik7Cn0KZnVuY3Rpb24gZ2V0VGV4dFJlZ2lvbkh1ZmZtYW5UYWJsZXModGV4dFJlZ2lvbiwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzLCBudW1iZXJPZlN5bWJvbHMsIHJlYWRlcikgewogIGNvbnN0IGNvZGVzID0gW107CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMzQ7IGkrKykgewogICAgY29uc3QgY29kZUxlbmd0aCA9IHJlYWRlci5yZWFkQml0cyg0KTsKICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCBjb2RlTGVuZ3RoLCAwLCAwXSkpOwogIH0KICBjb25zdCBydW5Db2Rlc1RhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpOwogIGNvZGVzLmxlbmd0aCA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlN5bWJvbHM7KSB7CiAgICBjb25zdCBjb2RlTGVuZ3RoID0gcnVuQ29kZXNUYWJsZS5kZWNvZGUocmVhZGVyKTsKICAgIGlmIChjb2RlTGVuZ3RoID49IDMyKSB7CiAgICAgIGxldCByZXBlYXRlZExlbmd0aCwgbnVtYmVyT2ZSZXBlYXRzLCBqOwogICAgICBzd2l0Y2ggKGNvZGVMZW5ndGgpIHsKICAgICAgICBjYXNlIDMyOgogICAgICAgICAgaWYgKGkgPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoIm5vIHByZXZpb3VzIHZhbHVlIGluIHN5bWJvbCBJRCB0YWJsZSIpOwogICAgICAgICAgfQogICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDIpICsgMzsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gY29kZXNbaSAtIDFdLnByZWZpeExlbmd0aDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzM6CiAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoMykgKyAzOwogICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzNDoKICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cyg3KSArIDExOwogICAgICAgICAgcmVwZWF0ZWRMZW5ndGggPSAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIGNvZGUgbGVuZ3RoIGluIHN5bWJvbCBJRCB0YWJsZSIpOwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlJlcGVhdHM7IGorKykgewogICAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCByZXBlYXRlZExlbmd0aCwgMCwgMF0pKTsKICAgICAgICBpKys7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvZGVzLnB1c2gobmV3IEh1ZmZtYW5MaW5lKFtpLCBjb2RlTGVuZ3RoLCAwLCAwXSkpOwogICAgICBpKys7CiAgICB9CiAgfQogIHJlYWRlci5ieXRlQWxpZ24oKTsKICBjb25zdCBzeW1ib2xJRFRhYmxlID0gbmV3IEh1ZmZtYW5UYWJsZShjb2RlcywgZmFsc2UpOwogIGxldCBjdXN0b21JbmRleCA9IDAsCiAgICB0YWJsZUZpcnN0UywKICAgIHRhYmxlRGVsdGFTLAogICAgdGFibGVEZWx0YVQ7CiAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5GUykgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICB0YWJsZUZpcnN0UyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRlMgKyA2KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgI
20HRhYmxlRmlyc3RTID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogICAgICBjdXN0b21JbmRleCsrOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRlMgc2VsZWN0b3IiKTsKICB9CiAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EUykgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICB0YWJsZURlbHRhUyA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFMgKyA4KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRhYmxlRGVsdGFTID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogICAgICBjdXN0b21JbmRleCsrOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gRFMgc2VsZWN0b3IiKTsKICB9CiAgc3dpdGNoICh0ZXh0UmVnaW9uLmh1ZmZtYW5EVCkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICB0YWJsZURlbHRhVCA9IGdldFN0YW5kYXJkVGFibGUodGV4dFJlZ2lvbi5odWZmbWFuRFQgKyAxMSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhVCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERUIHNlbGVjdG9yIik7CiAgfQogIGlmICh0ZXh0UmVnaW9uLnJlZmluZW1lbnQpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CiAgfQogIHJldHVybiB7CiAgICBzeW1ib2xJRFRhYmxlLAogICAgdGFibGVGaXJzdFMsCiAgICB0YWJsZURlbHRhUywKICAgIHRhYmxlRGVsdGFUCiAgfTsKfQpmdW5jdGlvbiBnZXRTeW1ib2xEaWN0aW9uYXJ5SHVmZm1hblRhYmxlcyhkaWN0aW9uYXJ5LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKICBsZXQgY3VzdG9tSW5kZXggPSAwLAogICAgdGFibGVEZWx0YUhlaWdodCwKICAgIHRhYmxlRGVsdGFXaWR0aDsKICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldFN0YW5kYXJkVGFibGUoZGljdGlvbmFyeS5odWZmbWFuREhTZWxlY3RvciArIDQpOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgdGFibGVEZWx0YUhlaWdodCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERIIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAoZGljdGlvbmFyeS5odWZmbWFuRFdTZWxlY3RvcikgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgKyAyKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRhYmxlRGVsdGFXaWR0aCA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERXIHNlbGVjdG9yIik7CiAgfQogIGxldCB0YWJsZUJpdG1hcFNpemUsIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzOwogIGlmIChkaWN0aW9uYXJ5LmJpdG1hcFNpemVTZWxlY3RvcikgewogICAgdGFibGVCaXRtYXBTaXplID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogICAgY3VzdG9tSW5kZXgrKzsKICB9IGVsc2UgewogICAgdGFibGVCaXRtYXBTaXplID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKICB9CiAgaWYgKGRpY3Rpb25hcnkuYWdncmVnYXRpb25JbnN0YW5jZXNTZWxlY3RvcikgewogICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgfSBlbHNlIHsKICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKICB9CiAgcmV0dXJuIHsKICAgIHRhYmxlRGVsdGFIZWlnaHQsCiAgICB0YWJsZURlbHRhV2lkdGgsCiAgICB0YWJsZUJpdG1hcFNpemUsCiAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcwogIH07Cn0KZnVuY3Rpb24gcmVhZFVuY29tcHJlc3NlZEJpdG1hcChyZWFkZXIsIHdpZHRoLCBoZWlnaHQpIHsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBiaXRtYXAucHVzaChyb3cpOwogICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgIHJvd1t4XSA9IHJlYWRlci5yZWFkQml0KCk7CiAgICB9CiAgICByZWFkZXIuYnl0ZUFsaWduKCk7CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlTU1SQml0bWFwKGlucHV0LCB3aWR0aCwgaGVpZ2h0LCBlbmRPZkJsb2NrKSB7CiAgY29uc3QgcGFyYW1zID0gewogICAgSzogLTEsCiAgICBDb2x1bW5zOiB3aWR0aCwKICAgIFJvd3M6IGhlaWdodCwKICAgIEJsYWNrSXMxOiB0cnVlLAogICAgRW5kT2ZCbG9jazogZW5kT2ZCbG9jawogIH07CiAgY29uc3QgZGVjb2RlciA9IG5ldyBDQ0lUVEZheERlY29kZXIoaW5wdXQsIHBhcmFtcyk7CiAgY29uc3QgYml0bWFwID0gW107CiAgbGV0IGN1cnJlbnRCeXRlLAogICAgZW9mID0gZmFsc2U7CiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGxldCBzaGlmdCA9IC0xOwogICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgIGlmIChzaGlmdCA8IDApIHsKICAgICAgICBjdXJyZW50Qnl0ZSA9IGRlY29kZXIucmVhZE5leHRDaGFyKCk7CiAgICAgICAgaWYgKGN1cnJlbnRCeXRlID09PSAtMSkgewogICAgICAgICAgY3VycmVudEJ5dGUgPSAwOwogICAgICAgICAgZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgc2hpZnQgPSA3OwogICAgICB9CiAgICAgI
20HJvd1t4XSA9IGN1cnJlbnRCeXRlID4+IHNoaWZ0ICYgMTsKICAgICAgc2hpZnQtLTsKICAgIH0KICB9CiAgaWYgKGVuZE9mQmxvY2sgJiYgIWVvZikgewogICAgY29uc3QgbG9va0ZvckVPRkxpbWl0ID0gNTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va0ZvckVPRkxpbWl0OyBpKyspIHsKICAgICAgaWYgKGRlY29kZXIucmVhZE5leHRDaGFyKCkgPT09IC0xKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpjbGFzcyBKYmlnMkltYWdlIHsKICBwYXJzZUNodW5rcyhjaHVua3MpIHsKICAgIHJldHVybiBwYXJzZUpiaWcyQ2h1bmtzKGNodW5rcyk7CiAgfQogIHBhcnNlKGRhdGEpIHsKICAgIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBKYmlnMkltYWdlLnBhcnNlIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qYmlnMl9zdHJlYW0uanMKCgoKCgoKY2xhc3MgSmJpZzJTdHJlYW0gZXh0ZW5kcyBEZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmRpY3QgPSBzdHJlYW0uZGljdDsKICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogIH0KICBnZXQgYnl0ZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge30KICByZWFkQmxvY2soKSB7CiAgICB0aGlzLmRlY29kZUltYWdlKCk7CiAgfQogIGRlY29kZUltYWdlKGJ5dGVzKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgfHw9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBqYmlnMkltYWdlID0gbmV3IEpiaWcySW1hZ2UoKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBnbG9iYWxzU3RyZWFtID0gdGhpcy5wYXJhbXMuZ2V0KCJKQklHMkdsb2JhbHMiKTsKICAgICAgaWYgKGdsb2JhbHNTdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgZ2xvYmFscyA9IGdsb2JhbHNTdHJlYW0uZ2V0Qnl0ZXMoKTsKICAgICAgICBjaHVua3MucHVzaCh7CiAgICAgICAgICBkYXRhOiBnbG9iYWxzLAogICAgICAgICAgc3RhcnQ6IDAsCiAgICAgICAgICBlbmQ6IGdsb2JhbHMubGVuZ3RoCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGNodW5rcy5wdXNoKHsKICAgICAgZGF0YTogYnl0ZXMsCiAgICAgIHN0YXJ0OiAwLAogICAgICBlbmQ6IGJ5dGVzLmxlbmd0aAogICAgfSk7CiAgICBjb25zdCBkYXRhID0gamJpZzJJbWFnZS5wYXJzZUNodW5rcyhjaHVua3MpOwogICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHsKICAgICAgZGF0YVtpXSBePSAweGZmOwogICAgfQogICAgdGhpcy5idWZmZXIgPSBkYXRhOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBkYXRhTGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9Cn0KCjsvLyAuL3NyYy9zaGFyZWQvaW1hZ2VfdXRpbHMuanMKCgoKCgoKCmZ1bmN0aW9uIGNvbnZlcnRUb1JHQkEocGFyYW1zKSB7CiAgc3dpdGNoIChwYXJhbXMua2luZCkgewogICAgY2FzZSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA6CiAgICAgIHJldHVybiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQShwYXJhbXMpOwogICAgY2FzZSBJbWFnZUtpbmQuUkdCXzI0QlBQOgogICAgICByZXR1cm4gY29udmVydFJHQlRvUkdCQShwYXJhbXMpOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSh7CiAgc3JjLAogIHNyY1BvcyA9IDAsCiAgZGVzdCwKICB3aWR0aCwKICBoZWlnaHQsCiAgbm9uQmxhY2tDb2xvciA9IDB4ZmZmZmZmZmYsCiAgaW52ZXJzZURlY29kZSA9IGZhbHNlCn0pIHsKICBjb25zdCBibGFjayA9IEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7CiAgY29uc3QgW3plcm9NYXBwaW5nLCBvbmVNYXBwaW5nXSA9IGludmVyc2VEZWNvZGUgPyBbbm9uQmxhY2tDb2xvciwgYmxhY2tdIDogW2JsYWNrLCBub25CbGFja0NvbG9yXTsKICBjb25zdCB3aWR0aEluU291cmNlID0gd2lkdGggPj4gMzsKICBjb25zdCB3aWR0aFJlbWFpbmRlciA9IHdpZHRoICYgNzsKICBjb25zdCBzcmNMZW5ndGggPSBzcmMubGVuZ3RoOwogIGRlc3QgPSBuZXcgVWludDMyQXJyYXkoZGVzdC5idWZmZXIpOwogIGxldCBkZXN0UG9zID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICBmb3IgKGNvbnN0IG1heCA9IHNyY1BvcyArIH
20dpZHRoSW5Tb3VyY2U7IHNyY1BvcyA8IG1heDsgc3JjUG9zKyspIHsKICAgICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3NdIDogMjU1OwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZzsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZzsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZzsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZzsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZzsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMSA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZzsKICAgIH0KICAgIGlmICh3aWR0aFJlbWFpbmRlciA9PT0gMCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IGVsZW0gPSBzcmNQb3MgPCBzcmNMZW5ndGggPyBzcmNbc3JjUG9zKytdIDogMjU1OwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aFJlbWFpbmRlcjsgaisrKSB7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAxIDw8IDcgLSBqID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgfQogIH0KICByZXR1cm4gewogICAgc3JjUG9zLAogICAgZGVzdFBvcwogIH07Cn0KZnVuY3Rpb24gY29udmVydFJHQlRvUkdCQSh7CiAgc3JjLAogIHNyY1BvcyA9IDAsCiAgZGVzdCwKICBkZXN0UG9zID0gMCwKICB3aWR0aCwKICBoZWlnaHQKfSkgewogIGxldCBpID0gMDsKICBjb25zdCBsZW4gPSB3aWR0aCAqIGhlaWdodCAqIDM7CiAgY29uc3QgbGVuMzIgPSBsZW4gPj4gMjsKICBjb25zdCBzcmMzMiA9IG5ldyBVaW50MzJBcnJheShzcmMuYnVmZmVyLCBzcmNQb3MsIGxlbjMyKTsKICBpZiAoRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHsKICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkgewogICAgICBjb25zdCBzMSA9IHNyYzMyW2ldOwogICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTsKICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07CiAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmYwMDAwMDA7CiAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPj4+IDI0IHwgczIgPDwgOCB8IDB4ZmYwMDAwMDA7CiAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPj4+IDE2IHwgczMgPDwgMTYgfCAweGZmMDAwMDAwOwogICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzID4+PiA4IHwgMHhmZjAwMDAwMDsKICAgIH0KICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmNQb3MgKyBsZW47IGogPCBqajsgaiArPSAzKSB7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSB8IHNyY1tqICsgMV0gPDwgOCB8IHNyY1tqICsgMl0gPDwgMTYgfCAweGZmMDAwMDAwOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHsKICAgICAgY29uc3QgczEgPSBzcmMzMltpXTsKICAgICAgY29uc3QgczIgPSBzcmMzMltpICsgMV07CiAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdOwogICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAxXSA9IHMxIDw8IDI0IHwgczIgPj4+IDggfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyIDw8IDE2IHwgczMgPj4+IDE2IHwgMHhmZjsKICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA8PCA4IHwgMHhmZjsKICAgIH0KICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmNQb3MgKyBsZW47IGogPCBqajsgaiArPSAzKSB7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSA8PCAyNCB8IHNyY1tqICsgMV0gPDwgMTYgfCBzcmNbaiArIDJdIDw8IDggfCAweGZmOwogICAgfQogIH0KICByZXR1cm4gewogICAgc3JjUG9zOiBzcmNQb3MgKyBsZW4sCiAgICBkZXN0UG9zCiAgfTsKfQpmdW5jdGlvbiBncmF5VG9SR0JBKHNyYywgZGVzdCkgewogIGlmIChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgZGVzdFtpXSA9IHNyY1tpXSAqIDB4MTAxMDEgfCAweGZmMDAwMDAwOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMTAwIHwgMHgwMDAwMDBmZjsKICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2pwZy5qcwoKCgoKCgoKCgoKY2xhc3MgSnBlZ0Vycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJKcGVnRXJyb3IiKTsKICB9Cn0KY2xhc3MgRE5MTWFya2VyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzY2FuTGluZXMpIHsKICAgIHN1cGVyKG1lc3NhZ2UsICJETkxNYXJrZXJFcnJvciIpOwogICAgdGhpcy5zY2FuTGluZXMgPSBzY2FuTGluZXM7CiAgfQp9CmNsYXNzIEVPSU1hcmtlckVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJFT0lNYXJrZXJFcnJvciIpOwogIH0KfQpjb25zdCBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbMCwgMSwgOCwgMTYsIDksIDIsIDMsIDEwLCAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LCAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsIDI3LCAyMCwgMTMsIDYsIDcsIDE0LCAyMSwgMjgsIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2M10pOwpjb25zdCBkY3RDb3MxID0gNDAxNzsKY29uc3QgZGN0U2luMSA9IDc5OTsKY29uc3QgZGN0Q29zMyA9IDM0MDY7CmNvbnN0IGRjdFNpbjMgPSAyMjc2Owpjb25zdCBkY3RDb3M2ID0gMTU2NzsKY29uc3QgZGN0U2luNiA9IDM3ODQ7CmNvbnN0IGRjdFNxcnQyID0gNTc5MzsKY29uc3QgZGN0U3FydDFkMiA9IDI4OTY7CmZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHsKICBsZXQgayA9IDAsCiAgICBpLAogICAgaiwKICAgIGxlbmd0aCA9IDE2OwogIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkgewogICAgbGVuZ3RoLS07CiAgfQogIGNvbnN0IGNvZGUgPSBbewogICAgY2hpbGRyZW46IFtdLAogICAgaW5kZXg6IDAKICB9XTsKICBsZXQgcCA9IGNvZGVbMF0sCiAgICBxOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhzW2ldOyBqKyspIHsKICAgICAgcCA9IGNvZGUucG9wKCk7CiAgICAgI
20HAuY2hpbGRyZW5bcC5pbmRleF0gPSB2YWx1ZXNba107CiAgICAgIHdoaWxlIChwLmluZGV4ID4gMCkgewogICAgICAgIHAgPSBjb2RlLnBvcCgpOwogICAgICB9CiAgICAgIHAuaW5kZXgrKzsKICAgICAgY29kZS5wdXNoKHApOwogICAgICB3aGlsZSAoY29kZS5sZW5ndGggPD0gaSkgewogICAgICAgIGNvZGUucHVzaChxID0gewogICAgICAgICAgY2hpbGRyZW46IFtdLAogICAgICAgICAgaW5kZXg6IDAKICAgICAgICB9KTsKICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKICAgICAgICBwID0gcTsKICAgICAgfQogICAgICBrKys7CiAgICB9CiAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKICAgICAgY29kZS5wdXNoKHEgPSB7CiAgICAgICAgY2hpbGRyZW46IFtdLAogICAgICAgIGluZGV4OiAwCiAgICAgIH0pOwogICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKICAgICAgcCA9IHE7CiAgICB9CiAgfQogIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuOwp9CmZ1bmN0aW9uIGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgcm93LCBjb2wpIHsKICByZXR1cm4gNjQgKiAoKGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSkgKiByb3cgKyBjb2wpOwp9CmZ1bmN0aW9uIGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVQcmV2LCBzdWNjZXNzaXZlLCBwYXJzZUROTE1hcmtlciA9IGZhbHNlKSB7CiAgY29uc3QgbWN1c1BlckxpbmUgPSBmcmFtZS5tY3VzUGVyTGluZTsKICBjb25zdCBwcm9ncmVzc2l2ZSA9IGZyYW1lLnByb2dyZXNzaXZlOwogIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogIGxldCBiaXRzRGF0YSA9IDAsCiAgICBiaXRzQ291bnQgPSAwOwogIGZ1bmN0aW9uIHJlYWRCaXQoKSB7CiAgICBpZiAoYml0c0NvdW50ID4gMCkgewogICAgICBiaXRzQ291bnQtLTsKICAgICAgcmV0dXJuIGJpdHNEYXRhID4+IGJpdHNDb3VudCAmIDE7CiAgICB9CiAgICBiaXRzRGF0YSA9IGRhdGFbb2Zmc2V0KytdOwogICAgaWYgKGJpdHNEYXRhID09PSAweGZmKSB7CiAgICAgIGNvbnN0IG5leHRCeXRlID0gZGF0YVtvZmZzZXQrK107CiAgICAgIGlmIChuZXh0Qnl0ZSkgewogICAgICAgIGlmIChuZXh0Qnl0ZSA9PT0gMHhkYyAmJiBwYXJzZUROTE1hcmtlcikgewogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBjb25zdCBzY2FuTGluZXMgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGlmIChzY2FuTGluZXMgPiAwICYmIHNjYW5MaW5lcyAhPT0gZnJhbWUuc2NhbkxpbmVzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRE5MIG1hcmtlciAoMHhGRkRDKSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIsIHNjYW5MaW5lcyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChuZXh0Qnl0ZSA9PT0gMHhkOSkgewogICAgICAgICAgaWYgKHBhcnNlRE5MTWFya2VyKSB7CiAgICAgICAgICAgIGNvbnN0IG1heWJlU2NhbkxpbmVzID0gYmxvY2tSb3cgKiAoZnJhbWUucHJlY2lzaW9uID09PSA4ID8gOCA6IDApOwogICAgICAgICAgICBpZiAobWF5YmVTY2FuTGluZXMgPiAwICYmIE1hdGgucm91bmQoZnJhbWUuc2NhbkxpbmVzIC8gbWF5YmVTY2FuTGluZXMpID49IDUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRE5MTWFya2VyRXJyb3IoIkZvdW5kIEVPSSBtYXJrZXIgKDB4RkZEOSkgd2hpbGUgcGFyc2luZyBzY2FuIGRhdGEsICIgKyAicG9zc2libHkgY2F1c2VkIGJ5IGluY29ycmVjdCBgc2NhbkxpbmVzYCBwYXJhbWV0ZXIiLCBtYXliZVNjYW5MaW5lcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRocm93IG5ldyBFT0lNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSIpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKGB1bmV4cGVjdGVkIG1hcmtlciAkeyhiaXRzRGF0YSA8PCA4IHwgbmV4dEJ5dGUpLnRvU3RyaW5nKDE2KX1gKTsKICAgICAgfQogICAgfQogICAgYml0c0NvdW50ID0gNzsKICAgIHJldHVybiBiaXRzRGF0YSA+Pj4gNzsKICB9CiAgZnVuY3Rpb24gZGVjb2RlSHVmZm1hbih0cmVlKSB7CiAgICBsZXQgbm9kZSA9IHRyZWU7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBub2RlID0gbm9kZVtyZWFkQml0KCldOwogICAgICBzd2l0Y2ggKHR5cGVvZiBub2RlKSB7CiAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIGh1ZmZtYW4gc2VxdWVuY2UiKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVjZWl2ZShsZW5ndGgpIHsKICAgIGxldCBuID0gMDsKICAgIHdoaWxlIChsZW5ndGggPiAwKSB7CiAgICAgIG4gPSBuIDw8IDEgfCByZWFkQml0KCk7CiAgICAgIGxlbmd0aC0tOwogICAgfQogICAgcmV0dXJuIG47CiAgfQogIGZ1bmN0aW9uIHJlY2VpdmVBbmRFeHRlbmQobGVuZ3RoKSB7CiAgICBpZiAobGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVybiByZWFkQml0KCkgPT09IDEgPyAxIDogLTE7CiAgICB9CiAgICBjb25zdCBuID0gcmVjZWl2ZShsZW5ndGgpOwogICAgaWYgKG4gPj0gMSA8PCBsZW5ndGggLSAxKSB7CiAgICAgIHJldHVybiBuOwogICAgfQogICAgcmV0dXJuIG4gKyAoLTEgPDwgbGVuZ3RoKSArIDE7CiAgfQogIGZ1bmN0aW9uIGRlY29kZUJhc2VsaW5lKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKICAgIGNvbnN0IHQgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVEQyk7CiAgICBjb25zdCBkaWZmID0gdCA9PT0gMCA/IDAgOiByZWNlaXZlQW5kRXh0ZW5kKHQpOwogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOwogICAgbGV0IGsgPSAxOwogICAgd2hpbGUgKGsgPCA2NCkgewogICAgICBjb25zdCBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKICAgICAgY29uc3QgcyA9IHJzICYgMTUsCiAgICAgICAgciA9IHJzID4+IDQ7CiAgICAgIGlmIChzID09PSAwKSB7CiAgICAgICAgaWYgKHIgPCAxNSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGsgKz0gMTY7CiAgICAgICAgY29udGludWU7CiAgICAgI
20H0KICAgICAgayArPSByOwogICAgICBjb25zdCB6ID0gZGN0WmlnWmFnW2tdOwogICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpOwogICAgICBrKys7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRlY29kZURDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKICAgIGNvbnN0IGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCkgPDwgc3VjY2Vzc2l2ZTsKICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdID0gY29tcG9uZW50LnByZWQgKz0gZGlmZjsKICB9CiAgZnVuY3Rpb24gZGVjb2RlRENTdWNjZXNzaXZlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXRdIHw9IHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlOwogIH0KICBsZXQgZW9icnVuID0gMDsKICBmdW5jdGlvbiBkZWNvZGVBQ0ZpcnN0KGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpIHsKICAgIGlmIChlb2JydW4gPiAwKSB7CiAgICAgIGVvYnJ1bi0tOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgayA9IHNwZWN0cmFsU3RhcnQ7CiAgICBjb25zdCBlID0gc3BlY3RyYWxFbmQ7CiAgICB3aGlsZSAoayA8PSBlKSB7CiAgICAgIGNvbnN0IHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOwogICAgICBjb25zdCBzID0gcnMgJiAxNSwKICAgICAgICByID0gcnMgPj4gNDsKICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICBlb2JydW4gPSByZWNlaXZlKHIpICsgKDEgPDwgcikgLSAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGsgKz0gMTY7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgayArPSByOwogICAgICBjb25zdCB6ID0gZGN0WmlnWmFnW2tdOwogICAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0ICsgel0gPSByZWNlaXZlQW5kRXh0ZW5kKHMpICogKDEgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgIGsrKzsKICAgIH0KICB9CiAgbGV0IHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMCwKICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZTsKICBmdW5jdGlvbiBkZWNvZGVBQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgbGV0IGsgPSBzcGVjdHJhbFN0YXJ0OwogICAgY29uc3QgZSA9IHNwZWN0cmFsRW5kOwogICAgbGV0IHIgPSAwOwogICAgbGV0IHM7CiAgICBsZXQgcnM7CiAgICB3aGlsZSAoayA8PSBl
20KSB7CiAgICAgIGNvbnN0IG9mZnNldFogPSBibG9ja09mZnNldCArIGRjdFppZ1phZ1trXTsKICAgICAgY29uc3Qgc2lnbiA9IGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gPCAwID8gLTEgOiAxOwogICAgICBzd2l0Y2ggKHN1Y2Nlc3NpdmVBQ1N0YXRlKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CiAgICAgICAgICBzID0gcnMgJiAxNTsKICAgICAgICAgIHIgPSBycyA+PiA0OwogICAgICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICAgICAgaWYgKHIgPCAxNSkgewogICAgICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKTsKICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgciA9IDE2OwogICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHMgIT09IDEpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJpbnZhbGlkIEFDbiBlbmNvZGluZyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7CiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gciA/IDIgOiAzOwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgY2FzZSAxOgogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByLS07CiAgICAgICAgICAgIGlmIChyID09PSAwKSB7CiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSBzdWNjZXNzaXZlQUNTdGF0ZSA9PT0gMiA/IDMgOiAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgewogICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA9IHN1Y2Nlc3NpdmVBQ05leHRWYWx1ZSA8PCBzdWNjZXNzaXZlOwogICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICBpZiAoY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSkgewogICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdICs9IHNpZ24gKiAocmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaysrOwogICAgfQogICAgaWYgKHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSA0KSB7CiAgICAgIGVvYnJ1bi0tOwogICAgICBpZiAoZW9icnVuID09PSAwKSB7CiAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwOwogICAgICB9CiAgICB9CiAgfQogIGxldCBibG9ja1JvdyA9IDA7CiAgZnVuY3Rpb24gZGVjb2RlTWN1KGNvbXBvbmVudCwgZGVjb2RlLCBtY3UsIHJvdywgY29sKSB7CiAgICBjb25zdCBtY3VSb3cgPSBtY3UgLyBtY3VzUGVyTGluZSB8IDA7CiAgICBjb25zdCBtY3VDb2wgPSBtY3UgJSBtY3VzUGVyTGluZTsKICAgIGJsb2NrUm93ID0gbWN1Um93ICogY29tcG9uZW50LnYgKyByb3c7CiAgICBjb25zdCBibG9ja0NvbCA9IG1jdUNvbCAqIGNvbXBvbmVudC5oICsgY29sOwogICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CiAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CiAgfQogIGZ1bmN0aW9uIGRlY29kZUJsb2NrKGNvbXBvbmVudCwgZGVjb2RlLCBtY3UpIHsKICAgIGJsb2NrUm93ID0gbWN1IC8gY29tcG9uZW50LmJsb2Nrc1BlckxpbmUgfCAwOwogICAgY29uc3QgYmxvY2tDb2wgPSBtY3UgJSBjb21wb25lbnQuYmxvY2tzUGVyTGluZTsKICAgIGNvbnN0IGJsb2NrT2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOwogICAgZGVjb2RlKGNvbXBvbmVudCwgYmxvY2tPZmZzZXQpOwogIH0KICBjb25zdCBjb21wb25lbnRzTGVuZ3RoID0gY29tcG9uZW50cy5sZW5ndGg7CiAgbGV0IGNvbXBvbmVudCwgaSwgaiwgaywgbjsKICBsZXQgZGVjb2RlRm47CiAgaWYgKHByb2dyZXNzaXZlKSB7CiAgICBpZiAoc3BlY3RyYWxTdGFydCA9PT0gMCkgewogICAgICBkZWNvZGVGbiA9IHN1Y2Nlc3NpdmVQcmV2ID09PSAwID8gZGVjb2RlRENGaXJzdCA6IGRlY29kZURDU3VjY2Vzc2l2ZTsKICAgIH0gZWxzZSB7CiAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVBQ0ZpcnN0IDogZGVjb2RlQUNTdWNjZXNzaXZlOwogICAgfQogIH0gZWxzZSB7CiAgICBkZWNvZGVGbiA9IGRlY29kZUJhc2VsaW5lOwogIH0KICBsZXQgbWN1ID0gMCwKICAgIGZpbGVNYXJrZXI7CiAgY29uc3QgbWN1RXhwZWN0ZWQgPSBjb21wb25lbnRzTGVuZ3RoID09PSAxID8gY29tcG9uZW50c1swXS5ibG9ja3NQZXJMaW5lICogY29tcG9uZW50c1swXS5ibG9ja3NQZXJDb2x1bW4gOiBtY3VzUGVyTGluZSAqIGZyYW1lLm1jdXNQZXJDb2x1bW47CiAgbGV0IGgsIHY7CiAgd2hpbGUgKG1jdSA8PSBtY3VFeHBlY3RlZCkgewogICAgY29uc3QgbWN1VG9SZWFkID0gcmVzZXRJbnRlcnZhbCA/IE1hdGgubWluKG1jdUV4cGVjdGVkIC0gbWN1LCByZXNldEludGVydmFsKSA6IG1jdUV4cGVjdGVkOwogICAgaWYgKG1jdVRvUmVhZCA+IDApIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgewogICAgICAgIGNvbXBvbmVudHNbaV0ucHJlZCA9IDA7CiAgICAgI
20H0KICAgICAgZW9icnVuID0gMDsKICAgICAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHsKICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdOwogICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgewogICAgICAgICAgZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1KTsKICAgICAgICAgIG1jdSsrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbWN1VG9SZWFkOyBuKyspIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50c1tpXTsKICAgICAgICAgICAgaCA9IGNvbXBvbmVudC5oOwogICAgICAgICAgICB2ID0gY29tcG9uZW50LnY7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2OyBqKyspIHsKICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaDsgaysrKSB7CiAgICAgICAgICAgICAgICBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGVGbiwgbWN1LCBqLCBrKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG1jdSsrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgYml0c0NvdW50ID0gMDsKICAgIGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0KTsKICAgIGlmICghZmlsZU1hcmtlcikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChmaWxlTWFya2VyLmludmFsaWQpIHsKICAgICAgY29uc3QgcGFydGlhbE1zZyA9IG1jdVRvUmVhZCA+IDAgPyAidW5leHBlY3RlZCIgOiAiZXhjZXNzaXZlIjsKICAgICAgd2FybihgZGVjb2RlU2NhbiAtICR7cGFydGlhbE1zZ30gTUNVIGRhdGEsIGN1cnJlbnQgbWFya2VyIGlzOiAke2ZpbGVNYXJrZXIuaW52YWxpZH1gKTsKICAgICAgb2Zmc2V0ID0gZmlsZU1hcmtlci5vZmZzZXQ7CiAgICB9CiAgICBpZiAoZmlsZU1hcmtlci5tYXJrZXIgPj0gMHhmZmQwICYmIGZpbGVNYXJrZXIubWFya2VyIDw9IDB4ZmZkNykgewogICAgICBvZmZzZXQgKz0gMjsKICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gb2Zmc2V0IC0gc3RhcnRPZmZzZXQ7Cn0KZnVuY3Rpb24gcXVhbnRpemVBbmRJbnZlcnNlKGNvbXBvbmVudCwgYmxvY2tCdWZmZXJPZmZzZXQsIHApIHsKICBjb25zdCBxdCA9IGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSwKICAgIGJsb2NrRGF0YSA9IGNvbXBvbmVudC5ibG9ja0RhdGE7CiAgbGV0IHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NzsKICBsZXQgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3OwogIGxldCB0OwogIGlmICghcXQpIHsKICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIm1pc3NpbmcgcmVxdWlyZWQgUXVhbnRpemF0aW9uIFRhYmxlLiIpOwogIH0KICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCA2NDsgcm93ICs9IDgpIHsKICAgIHAwID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93XTsKICAgIHAxID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgMV07CiAgICBwMiA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDJdOwogICAgcDMgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAzXTsKICAgIHA0ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNF07CiAgICBwNSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDVdOwogICAgcDYgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA2XTsKICAgIHA3ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgN107CiAgICBwMCAqPSBxdFtyb3ddOwogICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHsKICAgICAgdCA9IGRjdFNxcnQyICogcDAgKyA1MTIgPj4gMTA7CiAgICAgIHBbcm93XSA9IHQ7CiAgICAgIHBbcm93ICsgMV0gPSB0OwogICAgICBwW3JvdyArIDJdID0gdDsKICAgICAgcFtyb3cgKyAzXSA9IHQ7CiAgICAgIHBbcm93ICsgNF0gPSB0OwogICAgICBwW3JvdyArIDVdID0gdDsKICAgICAgcFtyb3cgKyA2XSA9IHQ7CiAgICAgIHBbcm93ICsgN10gPSB0OwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHAxICo9IHF0W3JvdyArIDFdOwogICAgcDIgKj0gcXRbcm93ICsgMl07CiAgICBwMyAqPSBxdFtyb3cgKyAzXTsKICAgIHA0ICo9IHF0W3JvdyArIDRdOwogICAgcDUgKj0gcXRbcm93ICsgNV07CiAgICBwNiAqPSBxdFtyb3cgKyA2XTsKICAgIHA3ICo9IHF0W3JvdyArIDddOwogICAgdjAgPSBkY3RTcXJ0MiAqIHAwICsgMTI4ID4+IDg7CiAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAxMjggPj4gODsKICAgIHYyID0gcDI7CiAgICB2MyA9IHA2OwogICAgdjQgPSBkY3RTcXJ0MWQyICogKHAxIC0gcDcpICsgMTI4ID4+IDg7CiAgICB2NyA9IGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAxMjggPj4gODsKICAgIHY1ID0gcDMgPDwgNDsKICAgIHY2ID0gcDUgPDwgNDsKICAgIHYwID0gdjAgKyB2MSArIDEgPj4gMTsKICAgIHYxID0gdjAgLSB2MTsKICAgIHQgPSB2MiAqIGRjdFNpbjYgKyB2MyAqIGRjdENvczYgKyAxMjggPj4gODsKICAgIHYyID0gdjIgKiBkY3RDb3M2IC0gdjMgKiBkY3RTaW42ICsgMTI4ID4+IDg7CiAgICB2MyA9IHQ7CiAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CiAgICB2NiA9IHY0IC0gdjY7CiAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CiAgICB2NSA9IHY3IC0gdjU7CiAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CiAgICB2MyA9IHYwIC0gdjM7CiAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CiAgICB2MiA9IHYxIC0gdjI7CiAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKICAgIHY3ID0gdDsKICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOwogICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOwogICAgdjYgPSB0OwogICAgcFtyb3ddID0gdjAgKyB2NzsKICAgIHBbcm93ICsgN10gPSB2MCAtIHY3OwogICAgcFtyb3cgKyAxXSA9IHYxICsgdjY7CiAgICBwW3JvdyArIDZdID0gdjEgLSB2NjsKICAgIHBbcm93ICsgMl0gPSB2MiArIHY1OwogICAgcFtyb3cgKyA1XSA9IHYyIC0gdjU7CiAgICBwW3JvdyArIDNdID0gdjMgKyB2NDsKICAgIHBbcm93ICsgNF0gPSB2MyAtIHY0OwogIH0KICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA4OyArK2NvbCkgewogICAgcDAgPSBwW2NvbF07CiAgICBwMSA9IHBbY29sICsgOF07CiAgICBwMiA9IHBbY29sICsgMTZdOwogICAgcDMgPSBwW2NvbCArIDI0XTsKICAgIHA0ID0gcFtjb2wgKyAzMl07CiAgICBwNSA9IHBbY29sICsgNDBdOwogICAgcDYgPSBwW2NvbCArIDQ4XTsKICAgIHA3ID0gcFtjb2wgKyA1Nl07CiAgICBpZiAoKHAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgfCBwNiB8IHA3KSA9PT0gMCkgewogICAgICB0ID0gZGN0U3FydDIgKiBwMCArIDgxOTIgPj4gMTQ7CiAgICAgIGlmICh0IDwgLTIwNDApIHsKICAgICAgICB0ID0gMDsKICAgICAgfSBlbHNlIGlmICh0ID49IDIwMjQpIHsKICAgICAgICB0ID0gMjU1OwogICAgICB9IGVsc2UgewogICAgICAgI
20HQgPSB0ICsgMjA1NiA+PiA0OwogICAgICB9CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA4XSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDMyXSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHQ7CiAgICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDU2XSA9IHQ7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdjAgPSBkY3RTcXJ0MiAqIHAwICsgMjA0OCA+PiAxMjsKICAgIHYxID0gZGN0U3FydDIgKiBwNCArIDIwNDggPj4gMTI7CiAgICB2MiA9IHAyOwogICAgdjMgPSBwNjsKICAgIHY0ID0gZGN0U3FydDFkMiAqIChwMSAtIHA3KSArIDIwNDggPj4gMTI7CiAgICB2NyA9IGRjdFNxcnQxZDIgKiAocDEgKyBwNykgKyAyMDQ4ID4+IDEyOwogICAgdjUgPSBwMzsKICAgIHY2ID0gcDU7CiAgICB2MCA9ICh2MCArIHYxICsgMSA+PiAxKSArIDQxMTI7CiAgICB2MSA9IHYwIC0gdjE7CiAgICB0ID0gdjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMjA0OCA+PiAxMjsKICAgIHYyID0gdjIgKiBkY3RDb3M2IC0gdjMgKiBkY3RTaW42ICsgMjA0OCA+PiAxMjsKICAgIHYzID0gdDsKICAgIHY0ID0gdjQgKyB2NiArIDEgPj4gMTsKICAgIHY2ID0gdjQgLSB2NjsKICAgIHY3ID0gdjcgKyB2NSArIDEgPj4gMTsKICAgIHY1ID0gdjcgLSB2NTsKICAgIHYwID0gdjAgKyB2MyArIDEgPj4gMTsKICAgIHYzID0gdjAgLSB2MzsKICAgIHYxID0gdjEgKyB2MiArIDEgPj4gMTsKICAgIHYyID0gdjEgLSB2MjsKICAgIHQgPSB2NCAqIGRjdFNpbjMgKyB2NyAqIGRjdENvczMgKyAyMDQ4ID4+IDEyOwogICAgdjQgPSB2NCAqIGRjdENvczMgLSB2NyAqIGRjdFNpbjMgKyAyMDQ4ID4+IDEyOwogICAgdjcgPSB0OwogICAgdCA9IHY1ICogZGN0U2luMSArIHY2ICogZGN0Q29zMSArIDIwNDggPj4gMTI7CiAgICB2NSA9IHY1ICogZGN0Q29zMSAtIHY2ICogZGN0U2luMSArIDIwNDggPj4gMTI7CiAgICB2NiA9IHQ7CiAgICBwMCA9IHYwICsgdjc7CiAgICBwNyA9IHYwIC0gdjc7CiAgICBwMSA9IHYxICsgdjY7CiAgICBwNiA9IHYxIC0gdjY7CiAgICBwMiA9IHYyICsgdjU7CiAgICBwNSA9IHYyIC0gdjU7CiAgICBwMyA9IHYzICsgdjQ7CiAgICBwNCA9IHYzIC0gdjQ7CiAgICBpZiAocDAgPCAxNikgewogICAgICBwMCA9IDA7CiAgICB9IGVsc2UgaWYgKHAwID49IDQwODApIHsKICAgICAgcDAgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwMCA+Pj0gNDsKICAgIH0KICAgIGlmIChwMSA8IDE2KSB7CiAgICAgIHAxID0gMDsKICAgIH0gZWxzZSBpZiAocDEgPj0gNDA4MCkgewogICAgICBwMSA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAxID4+PSA0OwogICAgfQogICAgaWYgKHAyIDwgMTYpIHsKICAgICAgcDIgPSAwOwogICAgfSBlbHNlIGlmIChwMiA+PSA0MDgwKSB7CiAgICAgIHAyID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDIgPj49IDQ7CiAgICB9CiAgICBpZiAocDMgPCAxNikgewogICAgICBwMyA9IDA7CiAgICB9IGVsc2UgaWYgKHAzID49IDQwODApIHsKICAgICAgcDMgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwMyA+Pj0gNDsKICAgIH0KICAgIGlmIChwNCA8IDE2KSB7CiAgICAgIHA0ID0gMDsKICAgIH0gZWxzZSBpZiAocDQgPj0gNDA4MCkgewogICAgICBwNCA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHA0ID4+PSA0OwogICAgfQogICAgaWYgKHA1IDwgMTYpIHsKICAgICAgcDUgPSAwOwogICAgfSBlbHNlIGlmIChwNSA+PSA0MDgwKSB7CiAgICAgIHA1ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDUgPj49IDQ7CiAgICB9CiAgICBpZiAocDYgPCAxNikgewogICAgICBwNiA9IDA7CiAgICB9IGVsc2UgaWYgKHA2ID49IDQwODApIHsKICAgICAgcDYgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwNiA+Pj0gNDsKICAgIH0KICAgIGlmIChwNyA8IDE2KSB7CiAgICAgIHA3ID0gMDsKICAgIH0gZWxzZSBpZiAocDcgPj0gNDA4MCkgewogICAgICBwNyA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHA3ID4+PSA0OwogICAgfQogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sXSA9IHAwOwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSBwMTsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDE2XSA9IHAyOwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMjRdID0gcDM7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSBwNDsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQwXSA9IHA1OwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNDhdID0gcDY7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSBwNzsKICB9Cn0KZnVuY3Rpb24gYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpIHsKICBjb25zdCBibG9ja3NQZXJMaW5lID0gY29tcG9uZW50LmJsb2Nrc1BlckxpbmU7CiAgY29uc3QgYmxvY2tzUGVyQ29sdW1uID0gY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbjsKICBjb25zdCBjb21wdXRhdGlvbkJ1ZmZlciA9IG5ldyBJbnQ
20xNkFycmF5KDY0KTsKICBmb3IgKGxldCBibG9ja1JvdyA9IDA7IGJsb2NrUm93IDwgYmxvY2tzUGVyQ29sdW1uOyBibG9ja1JvdysrKSB7CiAgICBmb3IgKGxldCBibG9ja0NvbCA9IDA7IGJsb2NrQ29sIDwgYmxvY2tzUGVyTGluZTsgYmxvY2tDb2wrKykgewogICAgICBjb25zdCBvZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CiAgICAgIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIG9mZnNldCwgY29tcHV0YXRpb25CdWZmZXIpOwogICAgfQogIH0KICByZXR1cm4gY29tcG9uZW50LmJsb2NrRGF0YTsKfQpmdW5jdGlvbiBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgY3VycmVudFBvcywgc3RhcnRQb3MgPSBjdXJyZW50UG9zKSB7CiAgY29uc3QgbWF4UG9zID0gZGF0YS5sZW5ndGggLSAxOwogIGxldCBuZXdQb3MgPSBzdGFydFBvcyA8IGN1cnJlbnRQb3MgPyBzdGFydFBvcyA6IGN1cnJlbnRQb3M7CiAgaWYgKGN1cnJlbnRQb3MgPj0gbWF4UG9zKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgY3VycmVudE1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgY3VycmVudFBvcyk7CiAgaWYgKGN1cnJlbnRNYXJrZXIgPj0gMHhmZmMwICYmIGN1cnJlbnRNYXJrZXIgPD0gMHhmZmZlKSB7CiAgICByZXR1cm4gewogICAgICBpbnZhbGlkOiBudWxsLAogICAgICBtYXJrZXI6IGN1cnJlbnRNYXJrZXIsCiAgICAgIG9mZnNldDogY3VycmVudFBvcwogICAgfTsKICB9CiAgbGV0IG5ld01hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgbmV3UG9zKTsKICB3aGlsZSAoIShuZXdNYXJrZXIgPj0gMHhmZmMwICYmIG5ld01hcmtlciA8PSAweGZmZmUpKSB7CiAgICBpZiAoKytuZXdQb3MgPj0gbWF4UG9zKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbmV3TWFya2VyID0gcmVhZFVpbnQxNihkYXRhLCBuZXdQb3MpOwogIH0KICByZXR1cm4gewogICAgaW52YWxpZDogY3VycmVudE1hcmtlci50b1N0cmluZygxNiksCiAgICBtYXJrZXI6IG5ld01hcmtlciwKICAgIG9mZnNldDogbmV3UG9zCiAgfTsKfQpmdW5jdGlvbiBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSkgewogIGNvbnN0IG1jdXNQZXJMaW5lID0gTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCAvIGZyYW1lLm1heEgpOwogIGNvbnN0IG1jdXNQZXJDb2x1bW4gPSBNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCAvIGZyYW1lLm1heFYpOwogIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGZyYW1lLmNvbXBvbmVudHMpIHsKICAgIGNvbnN0IGJsb2Nrc1BlckxpbmUgPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCkgKiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgpOwogICAgY29uc3QgYmxvY2tzUGVyQ29sdW1uID0gTWF0aC5jZWlsKE1hdGguY2VpbChmcmFtZS5zY2FuTGluZXMgLyA4KSAqIGNvbXBvbmVudC52IC8gZnJhbWUubWF4Vik7CiAgICBjb25zdCBibG9ja3NQZXJMaW5lRm9yTWN1ID0gbWN1c1BlckxpbmUgKiBjb21wb25lbnQuaDsKICAgIGNvbnN0IGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjsKICAgIGNvbnN0IGJsb2Nrc0J1ZmZlclNpemUgPSA2NCAqIGJsb2Nrc1BlckNvbHVtbkZvck1jdSAqIChibG9ja3NQZXJMaW5lRm9yTWN1ICsgMSk7CiAgICBjb21wb25lbnQuYmxvY2tEYXRhID0gbmV3IEludDE2QXJyYXkoYmxvY2tzQnVmZmVyU2l6ZSk7CiAgICBjb21wb25lbnQuYmxvY2tzUGVyTGluZSA9IGJsb2Nrc1BlckxpbmU7CiAgICBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uID0gYmxvY2tzUGVyQ29sdW1uOwogIH0KICBmcmFtZS5tY3VzUGVyTGluZSA9IG1jdXNQZXJMaW5lOwogIGZyYW1lLm1jdXNQZXJDb2x1bW4gPSBtY3VzUGVyQ29sdW1uOwp9CmZ1bmN0aW9uIHJlYWREYXRhQmxvY2soZGF0YSwgb2Zmc2V0KSB7CiAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogIG9mZnNldCArPSAyOwogIGxldCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGggLSAyOwogIGNvbnN0IGZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgZW5kT2Zmc2V0LCBvZmZzZXQpOwogIGlmIChmaWxlTWFya2VyPy5pbnZhbGlkKSB7CiAgICB3YXJuKCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBmaWxlTWFya2VyLmludmFsaWQpOwogICAgZW5kT2Zmc2V0ID0gZmlsZU1hcmtlci5vZmZzZXQ7CiAgfQogIGNvbnN0IGFycmF5ID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIGVuZE9mZnNldCk7CiAgb2Zmc2V0ICs9IGFycmF5Lmxlbmd0aDsKICByZXR1cm4gewogICAgYXBwRGF0YTogYXJyYXksCiAgICBuZXdPZmZzZXQ6IG9mZnNldAogIH07Cn0KZnVuY3Rpb24gc2tpcERhdGEoZGF0YSwgb2Zmc2V0KSB7CiAgY29uc3QgbGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogIG9mZnNldCArPSAyOwogIGNvbnN0IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aCAtIDI7CiAgY29uc3QgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBlbmRPZmZzZXQsIG9mZnNldCk7CiAgaWYgKGZpbGVNYXJrZXI/LmludmFsaWQpIHsKICAgIHJldHVybiBmaWxlTWFya2VyLm9mZnNldDsKICB9CiAgcmV0dXJuIGVuZE9mZnNldDsKfQpjbGFzcyBKcGVnSW1hZ2UgewogIGNvbnN0cnVjdG9yKHsKICAgIGRlY29kZVRyYW5zZm9ybSA9IG51bGwsCiAgICBjb2xvclRyYW5zZm9ybSA9IC0xCiAgfSA9IHt9KSB7CiAgICB0aGlzLl9kZWNvZGVUcmFuc2Zvcm0gPSBkZWNvZGVUcmFuc2Zvcm07CiAgICB0aGlzLl9jb2xvclRyYW5zZm9ybSA9IGNvbG9yVHJhbnNmb3JtOwogIH0KICBzdGF0aWMgY2FuVXNlSW1hZ2VEZWNvZGVyKGRhdGEsIGNvbG9yVHJhbnNmb3JtID0gLTEpIHsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IG51bUNvbXBvbmVudHMgPSBudWxsOwogICAgbGV0IGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIGlmIChmaWxlTWFya2VyICE9PSAweGZmZDgpIHsKICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpOwogICAgfQogICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSAyOwogICAgbWFya2VyTG9vcDogd2hpbGUgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOSkgewogICAgICBzd2l0Y2ggKGZpbGVNYXJrZXIpIHsKICAgICAgICBjYXNlIDB4ZmZjMDoKICAgICAgICBjYXNlIDB4ZmZjMToKICAgICAgICBjYXNlIDB4ZmZjMjoKICAgICAgICAgIG51bUNvbXBvbmVudHMgPSBkYXRhW29mZnNldCArICgyICsgMSArIDIgKyAyKV07CiAgICAgICAgICBicmVhayBtYXJrZXJMb29wOwogICAgICAgIGNhc2UgMHhmZmZmOgogICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSAhPT0gMHhmZikgewogICAgICAgICAgICBvZmZzZXQtLTsKICAgICAgICAgI
20H0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG9mZnNldCA9IHNraXBEYXRhKGRhdGEsIG9mZnNldCk7CiAgICAgIGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSAyOwogICAgfQogICAgaWYgKG51bUNvbXBvbmVudHMgPT09IDQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG51bUNvbXBvbmVudHMgPT09IDMgJiYgY29sb3JUcmFuc2Zvcm0gPT09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIHBhcnNlKGRhdGEsIHsKICAgIGRubFNjYW5MaW5lcyA9IG51bGwKICB9ID0ge30pIHsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IGpmaWYgPSBudWxsOwogICAgbGV0IGFkb2JlID0gbnVsbDsKICAgIGxldCBmcmFtZSwgcmVzZXRJbnRlcnZhbDsKICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDsKICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlcyA9IFtdOwogICAgY29uc3QgaHVmZm1hblRhYmxlc0FDID0gW10sCiAgICAgIGh1ZmZtYW5UYWJsZXNEQyA9IFtdOwogICAgbGV0IGZpbGVNYXJrZXIgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIGlmIChmaWxlTWFya2VyICE9PSAweGZmZDgpIHsKICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiU09JIG5vdCBmb3VuZCIpOwogICAgfQogICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSAyOwogICAgbWFya2VyTG9vcDogd2hpbGUgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOSkgewogICAgICBsZXQgaSwgaiwgbDsKICAgICAgc3dpdGNoIChmaWxlTWFya2VyKSB7CiAgICAgICAgY2FzZSAweGZmZTA6CiAgICAgICAgY2FzZSAweGZmZTE6CiAgICAgICAgY2FzZSAweGZmZTI6CiAgICAgICAgY2FzZSAweGZmZTM6CiAgICAgICAgY2FzZSAweGZmZTQ6CiAgICAgICAgY2FzZSAweGZmZTU6CiAgICAgICAgY2FzZSAweGZmZTY6CiAgICAgICAgY2FzZSAweGZmZTc6CiAgICAgICAgY2FzZSAweGZmZTg6CiAgICAgICAgY2FzZSAweGZmZTk6CiAgICAgICAgY2FzZSAweGZmZWE6CiAgICAgICAgY2FzZSAweGZmZWI6CiAgICAgICAgY2FzZSAweGZmZWM6CiAgICAgICAgY2FzZSAweGZmZWQ6CiAgICAgICAgY2FzZSAweGZmZWU6CiAgICAgICAgY2FzZSAweGZmZWY6CiAgICAgICAgY2FzZSAweGZmZmU6CiAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgIGFwcERhdGEsCiAgICAgICAgICAgIG5ld09mZnNldAogICAgICAgICAgfSA9IHJlYWREYXRhQmxvY2soZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCA9IG5ld09mZnNldDsKICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHsKICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NGEgJiYgYXBwRGF0YVsxXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzJdID09PSAweDQ5ICYmIGFwcERhdGFbM10gPT09IDB4NDYgJiYgYXBwRGF0YVs0XSA9PT0gMCkgewogICAgICAgICAgICAgIGpmaWYgPSB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7CiAgICAgICAgICAgICAgICAgIG1ham9yOiBhcHBEYXRhWzVdLAogICAgICAgICAgICAgICAgICBtaW5vcjogYXBwRGF0YVs2XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRlbnNpdHlVbml0czogYXBwRGF0YVs3XSwKICAgICAgICAgICAgICAgIHhEZW5zaXR5OiBhcHBEYXRhWzhdIDw8IDggfCBhcHBEYXRhWzldLAogICAgICAgICAgICAgICAgeURlbnNpdHk6IGFwcERhdGFbMTBdIDw8IDggfCBhcHBEYXRhWzExXSwKICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLAogICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLAogICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KDE0LCAxNCArIDMgKiBhcHBEYXRhWzEyXSAqIGFwcERhdGFbMTNdKQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZWUpIHsKICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NDEgJiYgYXBwRGF0YVsxXSA9PT0gMHg2NCAmJiBhcHBEYXRhWzJdID09PSAweDZmICYmIGFwcERhdGFbM10gPT09IDB4NjIgJiYgYXBwRGF0YVs0XSA9PT0gMHg2NSkgewogICAgICAgICAgICAgIGFkb2JlID0gewogICAgICAgICAgICAgICAgdmVyc2lvbjogYXBwRGF0YVs1XSA8PCA4IHwgYXBwRGF0YVs2XSwKICAgICAgICAgICAgICAgIGZsYWdzMDogYXBwRGF0YVs3XSA8PCA4IHwgYXBwRGF0YVs4XSwKICAgICAgICAgICAgICAgIGZsYWdzMTogYXBwRGF0YVs5XSA8PCA4IHwgYXBwRGF0YVsxMF0sCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRiOgogICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBjb25zdCBxdWFudGl6YXRpb25UYWJsZXNFbmQgPSBxdWFudGl6YXRpb25UYWJsZXNMZW5ndGggKyBvZmZzZXQgLSAyOwogICAgICAgICAgbGV0IHo7CiAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgcXVhbnRpemF0aW9uVGFibGVzRW5kKSB7CiAgICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOwogICAgICAgICAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVWludDE2QXJyYXkoNjQpOwogICAgICAgICAgICBpZiAocXVhbnRpemF0aW9uVGFibGVTcGVjID4+IDQgPT09IDApIHsKICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgewogICAgICAgICAgICAgICAgeiA9IGRjdFppZ1phZ1tqXTsKICAgICAgICAgICAgICAgIHRhYmxlRGF0YVt6XSA9IGRhdGFbb2Zmc2V0KytdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMSkgewogICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CiAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOwogICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgI
20HRocm93IG5ldyBKcGVnRXJyb3IoIkRRVCAtIGludmFsaWQgdGFibGUgc3BlYyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHF1YW50aXphdGlvblRhYmxlc1txdWFudGl6YXRpb25UYWJsZVNwZWMgJiAxNV0gPSB0YWJsZURhdGE7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZjMDoKICAgICAgICBjYXNlIDB4ZmZjMToKICAgICAgICBjYXNlIDB4ZmZjMjoKICAgICAgICAgIGlmIChmcmFtZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJPbmx5IHNpbmdsZSBmcmFtZSBKUEVHcyBzdXBwb3J0ZWQiKTsKICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZnJhbWUgPSB7fTsKICAgICAgICAgIGZyYW1lLmV4dGVuZGVkID0gZmlsZU1hcmtlciA9PT0gMHhmZmMxOwogICAgICAgICAgZnJhbWUucHJvZ3Jlc3NpdmUgPSBmaWxlTWFya2VyID09PSAweGZmYzI7CiAgICAgICAgICBmcmFtZS5wcmVjaXNpb24gPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgIGNvbnN0IHNvZlNjYW5MaW5lcyA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZnJhbWUuc2NhbkxpbmVzID0gZG5sU2NhbkxpbmVzIHx8IHNvZlNjYW5MaW5lczsKICAgICAgICAgIGZyYW1lLnNhbXBsZXNQZXJMaW5lID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBmcmFtZS5jb21wb25lbnRzID0gW107CiAgICAgICAgICBmcmFtZS5jb21wb25lbnRJZHMgPSB7fTsKICAgICAgICAgIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IGRhdGFbb2Zmc2V0KytdOwogICAgICAgICAgbGV0IG1heEggPSAwLAogICAgICAgICAgICBtYXhWID0gMDsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgY29uc3QgaCA9IGRhdGFbb2Zmc2V0ICsgMV0gPj4gNDsKICAgICAgICAgICAgY29uc3QgdiA9IGRhdGFbb2Zmc2V0ICsgMV0gJiAxNTsKICAgICAgICAgICAgaWYgKG1heEggPCBoKSB7CiAgICAgICAgICAgICAgbWF4SCA9IGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1heFYgPCB2KSB7CiAgICAgICAgICAgICAgbWF4ViA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcUlkID0gZGF0YVtvZmZzZXQgKyAyXTsKICAgICAgICAgICAgbCA9IGZyYW1lLmNvbXBvbmVudHMucHVzaCh7CiAgICAgICAgICAgICAgaCwKICAgICAgICAgICAgICB2LAogICAgICAgICAgICAgIHF1YW50aXphdGlvbklkOiBxSWQsCiAgICAgICAgICAgICAgcXVhbnRpemF0aW9uVGFibGU6IG51bGwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkc1tjb21wb25lbnRJZF0gPSBsIC0gMTsKICAgICAgICAgICAgb2Zmc2V0ICs9IDM7CiAgICAgICAgICB9CiAgICAgICAgICBmcmFtZS5tYXhIID0gbWF4SDsKICAgICAgICAgIGZyYW1lLm1heFYgPSBtYXhWOwogICAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMoZnJhbWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmYzQ6CiAgICAgICAgICBjb25zdCBodWZmbWFuTGVuZ3RoID0gcmVhZFVpbnQxNihkYXRhLCBvZmZzZXQpOwogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgaHVmZm1hbkxlbmd0aDspIHsKICAgICAgICAgICAgY29uc3QgaHVmZm1hblRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOwogICAgICAgICAgICBjb25zdCBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgICAgICAgbGV0IGNvZGVMZW5ndGhTdW0gPSAwOwogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKywgb2Zmc2V0KyspIHsKICAgICAgICAgICAgICBjb2RlTGVuZ3RoU3VtICs9IGNvZGVMZW5ndGhzW2pdID0gZGF0YVtvZmZzZXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5WYWx1ZXMgPSBuZXcgVWludDhBcnJheShjb2RlTGVuZ3RoU3VtKTsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhTdW07IGorKywgb2Zmc2V0KyspIHsKICAgICAgICAgICAgICBodWZmbWFuVmFsdWVzW2pdID0gZGF0YVtvZmZzZXRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkgKz0gMTcgKyBjb2RlTGVuZ3RoU3VtOwogICAgICAgICAgICAoaHVmZm1hblRhYmxlU3BlYyA+PiA0ID09PSAwID8gaHVmZm1hblRhYmxlc0RDIDogaHVmZm1hblRhYmxlc0FDKVtodWZmbWFuVGFibGVTcGVjICYgMTVdID0gYnVpbGRIdWZmbWFuVGFibGUoY29kZUxlbmd0aHMsIGh1ZmZtYW5WYWx1ZXMpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmZGQ6CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIHJlc2V0SW50ZXJ2YWwgPSByZWFkVWludDE2KGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRhOgogICAgICAgICAgY29uc3QgcGFyc2VETkxNYXJrZXIgPSArK251bVNPU01hcmtlcnMgPT09IDEgJiYgIWRubFNjYW5MaW5lczsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgY29uc3Qgc2VsZWN0b3JzQ291bnQgPSBkYXRhW29mZnNldCsrXSwKICAgICAgICAgICAgY29tcG9uZW50cyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdG9yc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SW5kZXggPSBmcmFtZS5jb21wb25lbnRJZHNbaW5kZXhdOwogICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2NvbXBvbmVudEluZGV4XTsKICAgICAgICAgICAgY29tcG9uZW50LmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIGNvbnN0IHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOwogICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdOwogICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdOwogICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKICAgICAgICAgI
20H0KICAgICAgICAgIGNvbnN0IHNwZWN0cmFsU3RhcnQgPSBkYXRhW29mZnNldCsrXSwKICAgICAgICAgICAgc3BlY3RyYWxFbmQgPSBkYXRhW29mZnNldCsrXSwKICAgICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID4+IDQsIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uICYgMTUsIHBhcnNlRE5MTWFya2VyKTsKICAgICAgICAgICAgb2Zmc2V0ICs9IHByb2Nlc3NlZDsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEROTE1hcmtlckVycm9yKSB7CiAgICAgICAgICAgICAgd2FybihgJHtleC5tZXNzYWdlfSAtLSBhdHRlbXB0aW5nIHRvIHJlLXBhcnNlIHRoZSBKUEVHIGltYWdlLmApOwogICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlKGRhdGEsIHsKICAgICAgICAgICAgICAgIGRubFNjYW5MaW5lczogZXguc2NhbkxpbmVzCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFT0lNYXJrZXJFcnJvcikgewogICAgICAgICAgICAgIHdhcm4oYCR7ZXgubWVzc2FnZX0gLS0gaWdub3JpbmcgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIGRhdGEuYCk7CiAgICAgICAgICAgICAgYnJlYWsgbWFya2VyTG9vcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRjOgogICAgICAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZmZjoKICAgICAgICAgIGlmIChkYXRhW29mZnNldF0gIT09IDB4ZmYpIHsKICAgICAgICAgICAgb2Zmc2V0LS07CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29uc3QgbmV4dEZpbGVNYXJrZXIgPSBmaW5kTmV4dEZpbGVNYXJrZXIoZGF0YSwgb2Zmc2V0IC0gMiwgb2Zmc2V0IC0gMyk7CiAgICAgICAgICBpZiAobmV4dEZpbGVNYXJrZXI/LmludmFsaWQpIHsKICAgICAgICAgICAgd2FybigiSnBlZ0ltYWdlLnBhcnNlIC0gdW5leHBlY3RlZCBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIiArIG5leHRGaWxlTWFya2VyLmludmFsaWQpOwogICAgICAgICAgICBvZmZzZXQgPSBuZXh0RmlsZU1hcmtlci5vZmZzZXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFuZXh0RmlsZU1hcmtlciB8fCBvZmZzZXQgPj0gZGF0YS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgIHdhcm4oIkpwZWdJbWFnZS5wYXJzZSAtIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UgZGF0YSAiICsgIndpdGhvdXQgZmluZGluZyBhbiBFT0kgbWFya2VyICgweEZGRDkpLiIpOwogICAgICAgICAgICBicmVhayBtYXJrZXJMb29wOwogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiSnBlZ0ltYWdlLnBhcnNlIC0gdW5rbm93biBtYXJrZXI6ICIgKyBmaWxlTWFya2VyLnRvU3RyaW5nKDE2KSk7CiAgICAgIH0KICAgICAgZmlsZU1hcmtlciA9IHJlYWRVaW50MTYoZGF0YSwgb2Zmc2V0KTsKICAgICAgb2Zmc2V0ICs9IDI7CiAgICB9CiAgICBpZiAoIWZyYW1lKSB7CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoIkpwZWdJbWFnZS5wYXJzZSAtIG5vIGZyYW1lIGRhdGEgZm91bmQuIik7CiAgICB9CiAgICB0aGlzLndpZHRoID0gZnJhbWUuc2FtcGxlc1BlckxpbmU7CiAgICB0aGlzLmhlaWdodCA9IGZyYW1lLnNjYW5MaW5lczsKICAgIHRoaXMuamZpZiA9IGpmaWY7CiAgICB0aGlzLmFkb2JlID0gYWRvYmU7CiAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTsKICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGZyYW1lLmNvbXBvbmVudHMpIHsKICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGUgPSBxdWFudGl6YXRpb25UYWJsZXNbY29tcG9uZW50LnF1YW50aXphdGlvbklkXTsKICAgICAgaWYgKHF1YW50aXphdGlvblRhYmxlKSB7CiAgICAgICAgY29tcG9uZW50LnF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGU7CiAgICAgIH0KICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goewogICAgICAgIGluZGV4OiBjb21wb25lbnQuaW5kZXgsCiAgICAgICAgb3V0cHV0OiBidWlsZENvbXBvbmVudERhdGEoZnJhbWUsIGNvbXBvbmVudCksCiAgICAgICAgc2NhbGVYOiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgsCiAgICAgICAgc2NhbGVZOiBjb21wb25lbnQudiAvIGZyYW1lLm1heFYsCiAgICAgICAgYmxvY2tzUGVyTGluZTogY29tcG9uZW50LmJsb2Nrc1BlckxpbmUsCiAgICAgICAgYmxvY2tzUGVyQ29sdW1uOiBjb21wb25lbnQuYmxvY2tzUGVyQ29sdW1uCiAgICAgIH0pOwogICAgfQogICAgdGhpcy5udW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIF9nZXRMaW5lYXJpemVkQmxvY2tEYXRhKHdpZHRoLCBoZWlnaHQsIGlzU291cmNlUERGID0gZmFsc2UpIHsKICAgIGNvbnN0IHNjYWxlWCA9IHRoaXMud2lkdGggLyB3aWR0aCwKICAgICAgc2NhbGVZID0gdGhpcy5oZWlnaHQgLyBoZWlnaHQ7CiAgICBsZXQgY29tcG9uZW50LCBjb21wb25lbnRTY2FsZVgsIGNvbXBvbmVudFNjYWxlWSwgYmxvY2tzUGVyU2NhbmxpbmU7CiAgICBsZXQgeCwgeSwgaSwgaiwgazsKICAgIGxldCBpbmRleDsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IG91dHB1dDsKICAgIGNvbnN0IG51bUNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOwogICAgY29uc3QgZGF0YUxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogbnVtQ29tcG9uZW50czsKICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YUxlbmd0aCk7CiAgICBjb25zdCB4U2NhbGVCbG9ja09mZnNldCA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCk7CiAgICBjb25zdCBtYXNrM0xTQiA9IDB4ZmZmZmZmZjg7CiAgICBsZXQgbGFzdENvbXBvbmVudFNjYWxlWDsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyBpKyspIHsKICAgICAgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2ldOwogICAgICBjb21wb25lbnRTY2FsZVggPSBjb21wb25lbnQuc2NhbGVYICogc2NhbGVYOwogICAgICBjb21wb25lbnRTY2FsZVkgPSBjb21wb25lbnQuc2NhbGVZICogc2NhbGVZOwogICAgICBvZmZzZXQgPSBpOwogICAgICBvdXRwdXQgPSBjb21wb25lbnQub3V0cHV0OwogICAgICBibG9ja3NQZXJTY2FubGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSA8PCAzOwogICAgICBpZiAoY29tcG9uZW50U2NhbGVYICE9PSBsYXN0Q29tcG9uZW50U2NhbGVYKSB7CiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgIGogPSAwIHwgeCAqIGNvbXBvbmVudFNjYWxlWDsKICAgICAgICAgI
20HhTY2FsZUJsb2NrT2Zmc2V0W3hdID0gKGogJiBtYXNrM0xTQikgPDwgMyB8IGogJiA3OwogICAgICAgIH0KICAgICAgICBsYXN0Q29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50U2NhbGVYOwogICAgICB9CiAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgIGogPSAwIHwgeSAqIGNvbXBvbmVudFNjYWxlWTsKICAgICAgICBpbmRleCA9IGJsb2Nrc1BlclNjYW5saW5lICogKGogJiBtYXNrM0xTQikgfCAoaiAmIDcpIDw8IDM7CiAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IG91dHB1dFtpbmRleCArIHhTY2FsZUJsb2NrT2Zmc2V0W3hdXTsKICAgICAgICAgIG9mZnNldCArPSBudW1Db21wb25lbnRzOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IHRyYW5zZm9ybSA9IHRoaXMuX2RlY29kZVRyYW5zZm9ybTsKICAgIGlmICghaXNTb3VyY2VQREYgJiYgbnVtQ29tcG9uZW50cyA9PT0gNCAmJiAhdHJhbnNmb3JtKSB7CiAgICAgIHRyYW5zZm9ybSA9IG5ldyBJbnQzMkFycmF5KFstMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1LCAtMjU2LCAyNTVdKTsKICAgIH0KICAgIGlmICh0cmFuc2Zvcm0pIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7KSB7CiAgICAgICAgZm9yIChqID0gMCwgayA9IDA7IGogPCBudW1Db21wb25lbnRzOyBqKyssIGkrKywgayArPSAyKSB7CiAgICAgICAgICBkYXRhW2ldID0gKGRhdGFbaV0gKiB0cmFuc2Zvcm1ba10gPj4gOCkgKyB0cmFuc2Zvcm1bayArIDFdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGdldCBfaXNDb2xvckNvbnZlcnNpb25OZWVkZWQoKSB7CiAgICBpZiAodGhpcy5hZG9iZSkgewogICAgICByZXR1cm4gISF0aGlzLmFkb2JlLnRyYW5zZm9ybUNvZGU7CiAgICB9CiAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzKSB7CiAgICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbXBvbmVudHNbMF0uaW5kZXggPT09IDB4NTIgJiYgdGhpcy5jb21wb25lbnRzWzFdLmluZGV4ID09PSAweDQ3ICYmIHRoaXMuY29tcG9uZW50c1syXS5pbmRleCA9PT0gMHg0MikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0aGlzLl9jb2xvclRyYW5zZm9ybSA9PT0gMSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgX2NvbnZlcnRZY2NUb1JnYihkYXRhKSB7CiAgICBsZXQgWSwgQ2IsIENyOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDMpIHsKICAgICAgWSA9IGRhdGFbaV07CiAgICAgIENiID0gZGF0YVtpICsgMV07CiAgICAgIENyID0gZGF0YVtpICsgMl07CiAgICAgIGRhdGFbaV0gPSBZIC0gMTc5LjQ1NiArIDEuNDAyICogQ3I7CiAgICAgIGRhdGFbaSArIDFdID0gWSArIDEzNS40NTkgLSAwLjM0NCAqIENiIC0gMC43MTQgKiBDcjsKICAgICAgZGF0YVtpICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX2NvbnZlcnRZY2NUb1JnYmEoZGF0YSwgb3V0KSB7CiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDMsIGogKz0gNCkgewogICAgICBjb25zdCBZID0gZGF0YVtpXTsKICAgICAgY29uc3QgQ2IgPSBkYXRhW2kgKyAxXTsKICAgICAgY29uc3QgQ3IgPSBkYXRhW2kgKyAyXTsKICAgICAgb3V0W2pdID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOwogICAgICBvdXRbaiArIDFdID0gWSArIDEzNS40NTkgLSAwLjM0NCAqIENiIC0gMC43MTQgKiBDcjsKICAgICAgb3V0W2ogKyAyXSA9IFkgLSAyMjYuODE2ICsgMS43NzIgKiBDYjsKICAgICAgb3V0W2ogKyAzXSA9IDI1NTsKICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQogIF9jb252ZXJ0WWNja1RvUmdiKGRhdGEpIHsKICAgIGxldCBZLCBDYiwgQ3IsIGs7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CiAgICAgIFkgPSBkYXRhW2ldOwogICAgICBDYiA9IGRhdGFbaSArIDFdOwogICAgICBDciA9IGRhdGFbaSArIDJdOwogICAgICBrID0gZGF0YVtpICsgM107CiAgICAgIGRhdGFbb2Zmc2V0KytdID0gLTEyMi42NzE5NTQwNjg5NCArIENiICogKC02LjYwNjM1NjY5NDIwMzY0ZS01ICogQ2IgKyAwLjAwMDQzNzEzMDQ3NTkyNjIzMiAqIENyIC0gNS40MDgwNjEwMDY0NTk5ZS01ICogWSArIDAuMDAwNDg0NDk3OTcxMjAyODEgKiBrIC0gMC4xNTQzNjIxNTE4NzExMjYpICsgQ3IgKiAoLTAuMDAwOTU3OTY0Mzc4NDQ1NzczICogQ3IgKyAwLjAwMDgxNzA3NjkxMTM0NjYyNSAqIFkgLSAwLjAwNDc3MjcxNDA1NDA4NzQ3ICogayArIDEuNTMzODAyNTMyMjE3MzQpICsgWSAqICgwLjAwMDk2MTI1MDE4NDEzMDY4OCAqIFkgLSAwLjAwMjY2MjU3MzMyMjgzOTMzICogayArIDAuNDgzNTcwODg0NTEyNjUpICsgayAqICgtMC4wMDAzMzYxOTcxNzc2MTgzOTQgKiBrICsgMC40ODQ3OTE1NjE0OTA3NzYpOwogICAgICBkYXRhW29mZnNldCsrXSA9IDEwNy4yNjgwMzkzOTc3MjQgKyBDYiAqICgyLjE5OTI3MTA0NTI1NzQxZS01ICogQ2IgLSAwLjAwMDY0MDk5MjAxODI5Nzk0NSAqIENyICsgMC4wMDA2NTkzOTcwMDEyNDU1NzcgKiBZICsgMC4wMDA0MjYxMDU2NTI5Mzg4MzcgKiBrIC0gMC4xNzY0OTE3OTI0NjI4NzUpICsgQ3IgKiAoLTAuMDAwNzc4MjY5OTQxNTEzNjgzICogQ3IgKyAwLjAwMTMwODcyMjYxNDA4Mjc1ICogWSArIDAuMDAwNzcwNDgyNjMxODAxMTMyICogayAtIDAuMTUxMDUxNDkyNzc1NTYyKSArIFkgKiAoMC4wMDEyNjkzNTM2ODExNDg0MyAqIFkgLSAwLjAwMjY1MDkwMTg5MDEwODk4ICogayArIDAuMjU4MDI5MTAyMDY4NDUpICsgayAqICgtMC4wMDAzMTg5MTMxMTc1ODgzMjggKiBrIC0gMC4yMTM3NDI0MDAzMjM2NjUpOwogICAgICBkYXRhW29mZnNldCsrXSA9IC0yMC44MTAwMTI1NDY5NDcgKyBDYiAqICgtMC4wMDA1NzAxMTUxOTY5NzM2NzcgKiBDYiAtIDIuNjM0MDkwNTEwMDQ1ODllLTUgKiBDciArIDAuMDAyMDc0MTA4ODExNTAxMiAqIFkgLSAwLjAwMjg4MjYwMjM2ODUzNDQyICogayArIDAuODE0MjcyOTY4MzU5Mjk1KSArIENyICogKC0xLjUzNDk2MDU3NDQwOTc1ZS01ICogQ3IgLSAwLjAwMDEzMjY4OTA0Mzk2MTQ0NiAqIFkgKyAwLjAwMDU2MDgzMzY5MTI0MjgxMiAqIGsgLSAwLjE5NTE1MjAyNzUzNDA0OSkgKyBZICogKDAuMDAxNzQ0MTgxMzI5Mjc1ODIgKiBZIC0gMC4wMDI1NTI0MzMyMTQzOTM0NyAqIGsgKyAwLjExNjkzNTAyMDQ2NTE0NSkgKyBrICogKC0wLjAwMDM0MzUzMTk5NjUxMDU1NSAqIGsgKyAwLjI0MTY1MjYwMjMyNDA3KTsKICAgIH0KICAgIHJldHVybi
20BkYXRhLnN1YmFycmF5KDAsIG9mZnNldCk7CiAgfQogIF9jb252ZXJ0WWNja1RvUmdiYShkYXRhKSB7CiAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewogICAgICBjb25zdCBZID0gZGF0YVtpXTsKICAgICAgY29uc3QgQ2IgPSBkYXRhW2kgKyAxXTsKICAgICAgY29uc3QgQ3IgPSBkYXRhW2kgKyAyXTsKICAgICAgY29uc3QgayA9IGRhdGFbaSArIDNdOwogICAgICBkYXRhW2ldID0gLTEyMi42NzE5NTQwNjg5NCArIENiICogKC02LjYwNjM1NjY5NDIwMzY0ZS01ICogQ2IgKyAwLjAwMDQzNzEzMDQ3NTkyNjIzMiAqIENyIC0gNS40MDgwNjEwMDY0NTk5ZS01ICogWSArIDAuMDAwNDg0NDk3OTcxMjAyODEgKiBrIC0gMC4xNTQzNjIxNTE4NzExMjYpICsgQ3IgKiAoLTAuMDAwOTU3OTY0Mzc4NDQ1NzczICogQ3IgKyAwLjAwMDgxNzA3NjkxMTM0NjYyNSAqIFkgLSAwLjAwNDc3MjcxNDA1NDA4NzQ3ICogayArIDEuNTMzODAyNTMyMjE3MzQpICsgWSAqICgwLjAwMDk2MTI1MDE4NDEzMDY4OCAqIFkgLSAwLjAwMjY2MjU3MzMyMjgzOTMzICogayArIDAuNDgzNTcwODg0NTEyNjUpICsgayAqICgtMC4wMDAzMzYxOTcxNzc2MTgzOTQgKiBrICsgMC40ODQ3OTE1NjE0OTA3NzYpOwogICAgICBkYXRhW2kgKyAxXSA9IDEwNy4yNjgwMzkzOTc3MjQgKyBDYiAqICgyLjE5OTI3MTA0NTI1NzQxZS01ICogQ2IgLSAwLjAwMDY0MDk5MjAxODI5Nzk0NSAqIENyICsgMC4wMDA2NTkzOTcwMDEyNDU1NzcgKiBZICsgMC4wMDA0MjYxMDU2NTI5Mzg4MzcgKiBrIC0gMC4xNzY0OTE3OTI0NjI4NzUpICsgQ3IgKiAoLTAuMDAwNzc4MjY5OTQxNTEzNjgzICogQ3IgKyAwLjAwMTMwODcyMjYxNDA4Mjc1ICogWSArIDAuMDAwNzcwNDgyNjMxODAxMTMyICogayAtIDAuMTUxMDUxNDkyNzc1NTYyKSArIFkgKiAoMC4wMDEyNjkzNTM2ODExNDg0MyAqIFkgLSAwLjAwMjY1MDkwMTg5MDEwODk4ICogayArIDAuMjU4MDI5MTAyMDY4NDUpICsgayAqICgtMC4wMDAzMTg5MTMxMTc1ODgzMjggKiBrIC0gMC4yMTM3NDI0MDAzMjM2NjUpOwogICAgICBkYXRhW2kgKyAyXSA9IC0yMC44MTAwMTI1NDY5NDcgKyBDYiAqICgtMC4wMDA1NzAxMTUxOTY5NzM2NzcgKiBDYiAtIDIuNjM0MDkwNTEwMDQ1ODllLTUgKiBDciArIDAuMDAyMDc0MTA4ODExNTAxMiAqIFkgLSAwLjAwMjg4MjYwMjM2ODUzNDQyICogayArIDAuODE0MjcyOTY4MzU5Mjk1KSArIENyICogKC0xLjUzNDk2MDU3NDQwOTc1ZS01ICogQ3IgLSAwLjAwMDEzMjY4OTA0Mzk2MTQ0NiAqIFkgKyAwLjAwMDU2MDgzMzY5MTI0MjgxMiAqIGsgLSAwLjE5NTE1MjAyNzUzNDA0OSkgKyBZICogKDAuMDAxNzQ0MTgxMzI5Mjc1ODIgKiBZIC0gMC4wMDI1NTI0MzMyMTQzOTM0NyAqIGsgKyAwLjExNjkzNTAyMDQ2NTE0NSkgKyBrICogKC0wLjAwMDM0MzUzMTk5NjUxMDU1NSAqIGsgKyAwLjI0MTY1MjYwMjMyNDA3KTsKICAgICAgZGF0YVtpICsgM10gPSAyNTU7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX2NvbnZlcnRZY2NrVG9DbXlrKGRhdGEpIHsKICAgIGxldCBZLCBDYiwgQ3I7CiAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewogICAgICBZID0gZGF0YVtpXTsKICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKICAgICAgZGF0YVtpXSA9IDQzNC40NTYgLSBZIC0gMS40MDIgKiBDcjsKICAgICAgZGF0YVtpICsgMV0gPSAxMTkuNTQxIC0gWSArIDAuMzQ0ICogQ2IgKyAwLjcxNCAqIENyOwogICAgICBkYXRhW2kgKyAyXSA9IDQ4MS44MTYgLSBZIC0gMS43NzIgKiBDYjsKICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBfY29udmVydENteWtUb1JnYihkYXRhKSB7CiAgICBsZXQgYywgbSwgeSwgazsKICAgIGxldCBvZmZzZXQgPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgYyA9IGRhdGFbaV07CiAgICAgIG0gPSBkYXRhW2kgKyAxXTsKICAgICAgeSA9IGRhdGFbaSArIDJdOwogICAgICBrID0gZGF0YVtpICsgM107CiAgICAgIGRhdGFbb2Zmc2V0KytdID0gMjU1ICsgYyAqICgtMC4wMDAwNjc0NzE0NzA3MzYwMjQ0MSAqIGMgKyAwLjAwMDgzNzkyNjIxMjEwMTM3MjcgKiBtICsgMC4wMDAyODk0NzE4MTg4NjQzMjk0ICogeSArIDAuMDAzMjY0MjMxMDU3NTM3ODA2ICogayAtIDEuMTE4NTYxMTg2NzIwMzkzNykgKyBtICogKDAuMDAwMDI2Mzc0MTA3NjE2MDg5NDA1ICogbSAtIDAuMDAwMDg2MjY5NDkxNTg2Mzg1NzIgKiB5IC0gMC4wMDAyNzQ4NzY5MDY3NDk5NDkxICogayAtIDAuMDIxNTU2ODg3OTQ5Nzg5NjcpICsgeSAqICgtMC4wMDAwMzg3ODA5OTIxMjg2OTM2MyAqIHkgLSAwLjAwMDMyNjc4MDgyNzk0ODUyODYgKiBrICsgMC4wNjg2NzQyMjM4NTk1MzQ1KSAtIGsgKiAoMC4wMDAzMzYxOTcxNzc2MTgzOTM3ICogayArIDAuNzQzMDY1OTE1MTM0MjI1NCk7CiAgICAgIGRhdGFbb2Zmc2V0KytdID0gMjU1ICsgYyAqICgwLjAwMDEzNTk2MzcyODEzNTg4ODQ4ICogYyArIDAuMDAwOTI0NTM3MTMyNTczNTg1ICogbSArIDAuMDAwMTA1NjczNTk2MTg2ODM1OTMgKiB5ICsgMC4wMDA0NzkxODY0Njg3NDM2NTEyICogayAtIDAuMzEwOTY4OTU4NzUxNTg3NSkgKyBtICogKC0wLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0ICogbSArIDAuMDAwMjcwMjg0NTI1MzUzNDcxNCAqIHkgKyAwLjAwMjAyMDAzMDg5NzczMDcxNTYgKiBrIC0gMC43NDg4MDUyMTY3MDE1NDk0KSArIHkgKiAoMC4wMDAwNjgzNDgxNTk5ODIzNTY2MiAqIHkgKyAwLjAwMDE1MTY4NDUyMzYzNDYwOTczICogayAtIDAuMDk3NTE5Mjc3NzQ3Mjg5MzMpIC0gayAqICgwLjAwMDMxODkxMzExNzU4ODMyODEgKiBrICsgMC43MzY0ODgzODA3NzMzMTY4KTsKICAgICAgZGF0YVtvZmZzZXQrK10gPSAyNTUgKyBjICogKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICsgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLSAwLjA1NTYyMTg2OTgwMjY0MDM0KSArIG0gKiAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gKyAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICsgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtIDAuNDQwMTUyMzIzNjc1MjY0NjMpICsgeSAqICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgKyAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC0gMC43NTkxNDU0NjQ5NzQ5NjA5KSAtIGsgKiAoMC4wMDAzNDM1MzE5OTY1MTA1NTUzICogayArIDAuNzA2Mzc3MDE4NjE2MDE0NCk7CiAgICB9CiAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpOwogIH0KICBfY29udmVydENteWtUb1JnYmEoZGF0YSkgewogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgY29uc3QgYyA9IGRhdGFbaV07CiAgICAgIGNvbnN0IG0gPSBkYXRhW2kgKyAxXTsKICAgICAgY29uc3QgeSA9IGRhdGFbaSArIDJdOwogICAgICBjb25zdCBrID0gZGF0YVtpICsgM107CiAgICAgIGRhdGFbaV0gPSAyNTUgKyBjICogKC0wLjAwMDA2NzQ3MTQ3MDczNjAyNDQxICogYyArIDAuMDAwODM3OTI2MjEyMTAxMzcyNyAqIG0gKyAwLjAwMDI4OTQ3MTgxODg2NDMyOTQgKiB5ICsgMC4wMDMyNjQyMzEwNTc1Mzc4MDYgKiBrIC0gMS4xMTg1NjExODY3MjAzOTM3KSArIG0gKiAoMC4wMDAwMjYzNzQxMDc2MTYwODk0MDUgKiBtIC0gMC4wMDAwODYyNjk0OTE1ODYzODU3MiAqIHkgLSAwLjAwMDI3NDg3NjkwNjc0OTk0OTEgKiBrIC0gMC4wMjE1NTY4ODc5NDk3ODk2NykgKyB5ICogKC0wLjAwMDAzODc4MDk5MjEyODY5MzYzICogeSAtIDAuMDAwMzI2NzgwODI3OTQ4NTI4NiAqIGsgKyAwLjA2ODY3NDIyMzg1OTUzNDUpIC0gayAqICgwLjAwMDMzNjE5NzE3NzYxODM5MzcgKiBrICsgMC43NDMwNjU5MTUxMzQyMjU0KTsKICAgICAgZGF0YVtpICsgMV0gPSAyNTUgKyBjICogKDAuMDAwMTM1OTYzNzI4MTM1ODg4NDggKiBjICsgMC4wMDA5MjQ1MzcxMzI1NzM1ODUgKiBtICsgMC4wMDAxMDU2NzM1OTYxODY4MzU5MyAqIHkgKyAwLjAwMDQ3OTE4NjQ2ODc0MzY1MTIgKiBrIC0gMC4zMTA5Njg5NTg3NTE1ODc1KSArIG0gKiAoLTAuMDAwMjM1NDUzNDYxMDgzNzAzNDQgKiBtICsgMC4wMDAyNzAyODQ1MjUzNTM0NzE0ICogeSArIDAuMDAyMDIwMDMwODk3NzMwNzE1NiAqIGsgLSAwLjc0ODgwNTIxNjcwMTU0OTQpICsgeSAqICgwLjAwMDA2ODM0ODE1OTk4MjM1NjYyICogeSArIDAuMDAwMTUxNjg0NTIzNjM0NjA5NzMgKiBrIC0gMC4wOTc1MTkyNzc3NDcyODkzMykgLSBrICogKDAuMDAwMzE4OTEzMTE3NTg4MzI4MSAqIGsgKyAwLjczNjQ4ODM4MDc3MzMxNjgpOwogICAgICBkYXRhW2kgKyAyXSA9IDI1NSArIGMgKiAoMC4wMDAwMTM1OTg2NTA0MTEzODUzMDcgKiBjICsgMC4wMDAxMjQyMzk1NjE3NTQ5MDg1MSAqIG0gKyAwLjAwMDQ3NTE5ODUwOTc1ODM1ODkgKiB5IC0gMC4wMDAwMDM2NzI5MzE3NDc2NjMwNDIyICogayAtIDAuMDU1NjIxODY5ODAyNjQwMzQpICsgb
20SAqICgwLjAwMDE2MTQxMzgwNTk4NzI0Njc2ICogbSArIDAuMDAwOTY5MjIzOTEzMDcyNTE4NiAqIHkgKyAwLjAwMDc3ODI2OTI0NTAwMzYyNTMgKiBrIC0gMC40NDAxNTIzMjM2NzUyNjQ2MykgKyB5ICogKDUuMDY4ODgyOTE0MDY4NzY5ZS03ICogeSArIDAuMDAxNzc3ODM2OTAxMTM3NTA3MSAqIGsgLSAwLjc1OTE0NTQ2NDk3NDk2MDkpIC0gayAqICgwLjAwMDM0MzUzMTk5NjUxMDU1NTMgKiBrICsgMC43MDYzNzcwMTg2MTYwMTQ0KTsKICAgICAgZGF0YVtpICsgM10gPSAyNTU7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZ2V0RGF0YSh7CiAgICB3aWR0aCwKICAgIGhlaWdodCwKICAgIGZvcmNlUkdCQSA9IGZhbHNlLAogICAgZm9yY2VSR0IgPSBmYWxzZSwKICAgIGlzU291cmNlUERGID0gZmFsc2UKICB9KSB7CiAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID4gNCkgewogICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJVbnN1cHBvcnRlZCBjb2xvciBtb2RlIik7CiAgICB9CiAgICBjb25zdCBkYXRhID0gdGhpcy5fZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERik7CiAgICBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAxICYmIChmb3JjZVJHQkEgfHwgZm9yY2VSR0IpKSB7CiAgICAgIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoICogKGZvcmNlUkdCQSA/IDQgOiAzKTsKICAgICAgY29uc3QgcmdiYURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobGVuKTsKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGlmIChmb3JjZVJHQkEpIHsKICAgICAgICBncmF5VG9SR0JBKGRhdGEsIG5ldyBVaW50MzJBcnJheShyZ2JhRGF0YS5idWZmZXIpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGNvbnN0IGdyYXlDb2xvciBvZiBkYXRhKSB7CiAgICAgICAgICByZ2JhRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CiAgICAgICAgICByZ2JhRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CiAgICAgICAgICByZ2JhRGF0YVtvZmZzZXQrK10gPSBncmF5Q29sb3I7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZ2JhRGF0YTsKICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSAzICYmIHRoaXMuX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKSB7CiAgICAgIGlmIChmb3JjZVJHQkEpIHsKICAgICAgICBjb25zdCByZ2JhRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmxlbmd0aCAvIDMgKiA0KTsKICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY1RvUmdiYShkYXRhLCByZ2JhRGF0YSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYihkYXRhKTsKICAgIH0gZWxzZSBpZiAodGhpcy5udW1Db21wb25lbnRzID09PSA0KSB7CiAgICAgIGlmICh0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkgewogICAgICAgIGlmIChmb3JjZVJHQkEpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvUmdiYShkYXRhKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZvcmNlUkdCKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY2tUb1JnYihkYXRhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9DbXlrKGRhdGEpOwogICAgICB9IGVsc2UgaWYgKGZvcmNlUkdCQSkgewogICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiYShkYXRhKTsKICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQikgewogICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q215a1RvUmdiKGRhdGEpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2pwZWdfc3RyZWFtLmpzCgoKCgoKCgoKCgpjbGFzcyBKcGVnU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBzdGF0aWMgI2lzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkID0gRmVhdHVyZVRlc3QuaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMuZGljdCA9IHN0cmVhbS5kaWN0OwogICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgfQogIHN0YXRpYyBnZXQgY2FuVXNlSW1hZ2VEZWNvZGVyKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY2FuVXNlSW1hZ2VEZWNvZGVyIiwgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPyBJbWFnZURlY29kZXIuaXNUeXBlU3VwcG9ydGVkKCJpbWFnZS9qcGVnIikgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTsKICB9CiAgc3RhdGljIHNldE9wdGlvbnMoewogICAgaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBmYWxzZQogIH0pIHsKICAgIHRoaXMuI2lzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkID0gaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgfQogIGdldCBieXRlcygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOwogIH0KICBlbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7fQogIHJlYWRCbG9jaygpIHsKICAgIHRoaXMuZGVjb2RlSW1hZ2UoKTsKICB9CiAgZ2V0IGpwZWdPcHRpb25zKCkgewogICAgY29uc3QganBlZ09wdGlvbnMgPSB7CiAgICAgIGRlY29kZVRyYW5zZm9ybTogdW5kZWZpbmVkLAogICAgICBjb2xvclRyYW5zZm9ybTogdW5kZWZpbmVkCiAgICB9OwogICAgY29uc3QgZGVjb2RlQXJyID0gdGhpcy5kaWN0LmdldEFycmF5KCJEIiwgIkRlY29kZSIpOwogICAgaWYgKCh0aGlzLmZvcmNlUkdCQSB8fCB0aGlzLmZvcmNlUkdCKSAmJiBBcnJheS5pc0FycmF5KGRlY29kZUFycikpIHsKICAgICAgY29uc3QgYml0c1BlckNvbXBvbmVudCA9IHRoaXMuZGljdC5nZXQoIkJQQyIsICJCaXRzUGVyQ29tcG9uZW50IikgfHwgODsKICAgICAgY29uc3QgZGVjb2RlQXJyTGVuZ3RoID0gZGVjb2RlQXJyLmxlbmd0aDsKICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoZGVjb2RlQXJyTGVuZ3RoKTsKICAgICAgbGV0IHRyYW5zZm9ybU5lZWRlZCA9IGZhbHNlOwogICAgICBjb25zdCBtYXhWYWx1ZSA9ICgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVBcnJMZW5ndGg7IGkgKz0gMikgewogICAgICAgI
20HRyYW5zZm9ybVtpXSA9IChkZWNvZGVBcnJbaSArIDFdIC0gZGVjb2RlQXJyW2ldKSAqIDI1NiB8IDA7CiAgICAgICAgdHJhbnNmb3JtW2kgKyAxXSA9IGRlY29kZUFycltpXSAqIG1heFZhbHVlIHwgMDsKICAgICAgICBpZiAodHJhbnNmb3JtW2ldICE9PSAyNTYgfHwgdHJhbnNmb3JtW2kgKyAxXSAhPT0gMCkgewogICAgICAgICAgdHJhbnNmb3JtTmVlZGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRyYW5zZm9ybU5lZWRlZCkgewogICAgICAgIGpwZWdPcHRpb25zLmRlY29kZVRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBjb2xvclRyYW5zZm9ybSA9IHRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTsKICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY29sb3JUcmFuc2Zvcm0pKSB7CiAgICAgICAganBlZ09wdGlvbnMuY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAianBlZ09wdGlvbnMiLCBqcGVnT3B0aW9ucyk7CiAgfQogICNza2lwVXNlbGVzc0J5dGVzKGRhdGEpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHsKICAgICAgaWYgKGRhdGFbaV0gPT09IDB4ZmYgJiYgZGF0YVtpICsgMV0gPT09IDB4ZDgpIHsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIGRhdGEgPSBkYXRhLnN1YmFycmF5KGkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGRlY29kZUltYWdlKGJ5dGVzKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogICAgfQogICAgYnl0ZXMgPSB0aGlzLiNza2lwVXNlbGVzc0J5dGVzKGJ5dGVzIHx8IHRoaXMuYnl0ZXMpOwogICAgY29uc3QganBlZ0ltYWdlID0gbmV3IEpwZWdJbWFnZSh0aGlzLmpwZWdPcHRpb25zKTsKICAgIGpwZWdJbWFnZS5wYXJzZShieXRlcyk7CiAgICBjb25zdCBkYXRhID0ganBlZ0ltYWdlLmdldERhdGEoew
20ogICAgICB3aWR0aDogdGhpcy5kcmF3V2lkdGgsCiAgICAgIGhlaWdodDogdGhpcy5kcmF3SGVpZ2h0LAogICAgICBmb3JjZVJHQkE6IHRoaXMuZm9yY2VSR0JBLAogICAgICBmb3JjZVJHQjogdGhpcy5mb3JjZVJHQiwKICAgICAgaXNTb3VyY2VQREY6IHRydWUKICAgIH0pOwogICAgdGhpcy5idWZmZXIgPSBkYXRhOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgIHJldHVybiB0aGlzLmJ1ZmZlcjsKICB9CiAgZ2V0IGNhbkFzeW5jRGVjb2RlSW1hZ2VGcm9tQnVmZmVyKCkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtLmlzQXN5bmM7CiAgfQogIGFzeW5jIGdldFRyYW5zZmVyYWJsZUltYWdlKCkgewogICAgaWYgKCEoYXdhaXQgSnBlZ1N0cmVhbS5jYW5Vc2VJbWFnZURlY29kZXIpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QganBlZ09wdGlvbnMgPSB0aGlzLmpwZWdPcHRpb25zOwogICAgaWYgKGpwZWdPcHRpb25zLmRlY29kZVRyYW5zZm9ybSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCBkZWNvZGVyOwogICAgdHJ5IHsKICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLmNhbkFzeW5jRGVjb2RlSW1hZ2VGcm9tQnVmZmVyICYmIChhd2FpdCB0aGlzLnN0cmVhbS5hc3luY0dldEJ5dGVzKCkpIHx8IHRoaXMuYnl0ZXM7CiAgICAgIGlmICghYnl0ZXMpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBkYXRhID0gdGhpcy4jc2tpcFVzZWxlc3NCeXRlcyhieXRlcyk7CiAgICAgIGlmICghSnBlZ0ltYWdlLmNhblVzZUltYWdlRGVjb2RlcihkYXRhLCBqcGVnT3B0aW9ucy5jb2xvclRyYW5zZm9ybSkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBkZWNvZGVyID0gbmV3IEltYWdlRGVjb2Rlcih7CiAgICAgICAgZGF0YSwKICAgICAgICB0eXBlOiAiaW1hZ2UvanBlZyIsCiAgICAgICAgcHJlZmVyQW5pbWF0aW9uOiBmYWxzZQogICAgICB9KTsKICAgICAgcmV0dXJuIChhd2FpdCBkZWNvZGVyLmRlY29kZSgpKS5pbWFnZTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICB3YXJuKGBnZXRUcmFuc2ZlcmFibGVJbWFnZSAtIGZhaWxlZDogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBmaW5hbGx5IHsKICAgICAgZGVjb2Rlcj8uY2xvc2UoKTsKICAgIH0KICB9Cn0KCjsvLyAuL2V4dGVybmFsL29wZW5qcGVnL29wZW5qcGVnLmpzCgoKCgoKCgoKCgoKdmFyIE9wZW5KUEVHID0gKCgpID0+IHsKICB2YXIgX3NjcmlwdE5hbWUgPSB0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0Py5zcmMgOiB1bmRlZmluZWQ7CiAgcmV0dXJuIGZ1bmN0aW9uIChtb2R1bGVBcmcgPSB7fSkgewogICAgdmFyIG1vZHVsZVJ0bjsKICAgIHZhciBNb2R1bGUgPSBtb2R1bGVBcmc7CiAgICB2YXIgcmVhZHlQcm9taXNlUmVzb2x2ZSwgcmVhZHlQcm9taXNlUmVqZWN0OwogICAgdmFyIHJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgcmVhZHlQcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgIHJlYWR5UHJvbWlzZVJlamVjdCA9IHJlamVjdDsKICAgIH0pOwogICAgdmFyIEVOVklST05NRU5UX0lTX1dFQiA9IHRydWU7CiAgICB2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSID0gZmFsc2U7CiAgICBNb2R1bGUuZGVjb2RlID0gZnVuY3Rpb24gKGJ5dGVzLCB7CiAgICAgIG51bUNvbXBvbmVudHMgPSA0LAogICAgICBpc0luZGV4ZWRDb2xvcm1hcCA9IGZhbHNlLAogICAgICBzbWFza0luRGF0YSA9IGZhbHNlCiAgICB9KSB7CiAgICAgIGNvbnN0IHNpemUgPSBieXRlcy5sZW5ndGg7CiAgICAgIGNvbnN0IHB0ciA9IE1vZHVsZS5fbWFsbG9jKHNpemUpOwogICAgICBNb2R1bGUuSEVBUFU4LnNldChieXRlcywgcHRyKTsKICAgICAgY29uc3QgcmV0ID0gTW9kdWxlLl9qcDJfZGVjb2RlKHB0ciwgc2l6ZSwgbnVtQ29tcG9uZW50cyA+IDAgPyBudW1Db21wb25lbnRzIDogMCwgISFpc0luZGV4ZWRDb2xvcm1hcCwgISFzbWFza0luRGF0YSk7CiAgICAgIE1vZHVsZS5fZnJlZShwdHIpOwogICAgICBpZiAocmV0KSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgZXJyb3JNZXNzYWdlcwogICAgICAgIH0gPSBNb2R1bGU7CiAgICAgICAgaWYgKGVycm9yTWVzc2FnZXMpIHsKICAgICAgICAgIGRlbGV0ZSBNb2R1bGUuZXJyb3JNZXNzYWdlczsKICAgICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2VzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIlVua25vd24gZXJyb3IiOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBpbWFnZURhdGEKICAgICAgfSA9IE1vZHVsZTsKICAgICAgTW9kdWxlLmltYWdlRGF0YSA9IG51bGw7CiAgICAgIHJldHVybiBpbWFnZURhdGE7CiAgICB9OwogICAgdmFyIG1vZHVsZU92ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oe30sIE1vZHVsZSk7CiAgICB2YXIgYXJndW1lbnRzXyA9IFtdOwogICAgdmFyIHRoaXNQcm9ncmFtID0gIi4vdGhpcy5wcm9ncmFtIjsKICAgIHZhciBxdWl0XyA9IChzdGF0dXMsIHRvVGhyb3cpID0+IHsKICAgICAgdGhyb3cgdG9UaHJvdzsKICAgIH07CiAgICB2YXIgc2NyaXB0RGlyZWN0b3J5ID0gIiI7CiAgICB2YXIgcmVhZEFzeW5jLCByZWFkQmluYXJ5OwogICAgaWYgKEVOVklST05NRU5UX0lTX1dFQiB8fCBFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsKICAgICAgaWYgKEVOVklST05NRU5UX0lTX1dPUktFUikgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNlbGYubG9jYXRpb24uaHJlZjsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gInVuZGVmaW5lZCIgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCkgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOwogICAgICB9CiAgICAgIGlmIChfc2NyaXB0TmFtZSkgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IF9zY3JpcHROYW1lOwogICAgICB9CiAgICAgIGlmIChzY3JpcHREaXJlY3Rvcnkuc3RhcnRzV2l0aCgiYmxvYjoiKSkgewogICAgICAgI
20HNjcmlwdERpcmVjdG9yeSA9ICIiOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdERpcmVjdG9yeSA9IHNjcmlwdERpcmVjdG9yeS5zdWJzdHIoMCwgc2NyaXB0RGlyZWN0b3J5LnJlcGxhY2UoL1s/I10uKi8sICIiKS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CiAgICAgIH0KICAgICAgcmVhZEFzeW5jID0gdXJsID0+IGZldGNoKHVybCwgewogICAgICAgIGNyZWRlbnRpYWxzOiAic2FtZS1vcmlnaW4iCiAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gewogICAgICAgIGlmIChyZXNwb25zZS5vaykgewogICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgIiA6ICIgKyByZXNwb25zZS51cmwpKTsKICAgICAgfSk7CiAgICB9IGVsc2Uge30KICAgIHZhciBvdXQgPSBNb2R1bGVbInByaW50Il0gfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTsKICAgIHZhciBlcnIgPSBNb2R1bGVbInByaW50RXJyIl0gfHwgY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpOwogICAgT2JqZWN0LmFzc2lnbihNb2R1bGUsIG1vZHVsZU92ZXJyaWRlcyk7CiAgICBtb2R1bGVPdmVycmlkZXMgPSBudWxsOwogICAgaWYgKE1vZHVsZVsiYXJndW1lbnRzIl0pIGFyZ3VtZW50c18gPSBNb2R1bGVbImFyZ3VtZW50cyJdOwogICAgaWYgKE1vZHVsZVsidGhpc1Byb2dyYW0iXSkgdGhpc1Byb2dyYW0gPSBNb2R1bGVbInRoaXNQcm9ncmFtIl07CiAgICB2YXIgd2FzbUJpbmFyeSA9IE1vZHVsZVsid2FzbUJpbmFyeSJdOwogICAgZnVuY3Rpb24gaW50QXJyYXlGcm9tQmFzZTY0KHMpIHsKICAgICAgdmFyIGRlY29kZWQgPSBhdG9iKHMpOwogICAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkZWNvZGVkLmxlbmd0aCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7ICsraSkgewogICAgICAgIGJ5dGVzW2ldID0gZGVjb2RlZC5jaGFyQ29kZUF0KGkpOwogICAgICB9CiAgICAgIHJldHVybiBieXRlczsKICAgIH0KICAgIGZ1bmN0aW9uIHRyeVBhcnNlQXNEYXRhVVJJKGZpbGVuYW1lKSB7CiAgICAgIGlmICghaXNEYXRhVVJJKGZpbGVuYW1lKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICByZXR1cm4gaW50QXJyYXlGcm9tQmFzZTY0KGZpbGVuYW1lLnNsaWNlKGRhdGFVUklQcmVmaXgubGVuZ3RoKSk7CiAgICB9CiAgICB2YXIgd2FzbU1lbW9yeTsKICAgIHZhciBBQk9SVCA9IGZhbHNlOwogICAgdmFyIEVYSVRTVEFUVVM7CiAgICB2YXIgSEVBUDgsIEhFQVBVOCwgSEVBUDE2LCBIRUFQVTE2LCBIRUFQMzIsIEhFQVBVMzIsIEhFQVBGMzIsIEhFQVBGNjQ7CiAgICBmdW5jdGlvbiB1cGRhdGVNZW1vcnlWaWV3cygpIHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgTW9kdWxlWyJIRUFQOCJdID0gSEVBUDggPSBuZXcgSW50OEFycmF5KGIpOwogICAgICBNb2R1bGVbIkhFQVAxNiJdID0gSEVBUDE2ID0gbmV3IEludDE2QXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFU4Il0gPSBIRUFQVTggPSBuZXcgVWludDhBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQVTE2Il0gPSBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF
205KGIpOwogICAgICBNb2R1bGVbIkhFQVAzMiJdID0gSEVBUDMyID0gbmV3IEludDMyQXJyYXkoYik7CiAgICAgIE1vZHVsZVsiSEVBUFUzMiJdID0gSEVBUFUzMiA9IG5ldyBVaW50MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjMyIl0gPSBIRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShiKTsKICAgICAgTW9kdWxlWyJIRUFQRjY0Il0gPSBIRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShiKTsKICAgIH0KICAgIHZhciBfX0FUUFJFUlVOX18gPSBbXTsKICAgIHZhciBfX0FUSU5JVF9fID0gW107CiAgICB2YXIgX19BVFBPU1RSVU5fXyA9IFtdOwogICAgdmFyIHJ1bnRpbWVJbml0aWFsaXplZCA9IGZhbHNlOwogICAgZnVuY3Rpb24gcHJlUnVuKCkgewogICAgICBpZiAoTW9kdWxlWyJwcmVSdW4iXSkgewogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXSA9PSAiZnVuY3Rpb24iKSBNb2R1bGVbInByZVJ1biJdID0gW01vZHVsZVsicHJlUnVuIl1dOwogICAgICAgIHdoaWxlIChNb2R1bGVbInByZVJ1biJdLmxlbmd0aCkgewogICAgICAgICAgYWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBSRVJVTl9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXRSdW50aW1lKCkgewogICAgICBydW50aW1lSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICBjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3RSdW4oKSB7CiAgICAgIGlmIChNb2R1bGVbInBvc3RSdW4iXSkgewogICAgICAgIGlmICh0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl0gPT0gImZ1bmN0aW9uIikgTW9kdWxlWyJwb3N0UnVuIl0gPSBbTW9kdWxlWyJwb3N0UnVuIl1dOwogICAgICAgIHdoaWxlIChNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpIHsKICAgICAgICAgIGFkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyk7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPblByZVJ1bihjYikgewogICAgICBfX0FUUFJFUlVOX18udW5zaGlmdChjYik7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRPbkluaXQoY2IpIHsKICAgICAgX19BVElOSVRfXy51bnNoaWZ0KGNiKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZE9uUG9zdFJ1bihjYikgewogICAgICBfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpOwogICAgfQogICAgdmFyIHJ1bkRlcGVuZGVuY2llcyA9IDA7CiAgICB2YXIgcnVuRGVwZW5kZW5jeVdhdGNoZXIgPSBudWxsOwogICAgdmFyIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICBmdW5jdGlvbiBhZGRSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgIHJ1bkRlcGVuZGVuY2llcysrOwogICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXT8uKHJ1bkRlcGVuZGVuY2llcyk7CiAgICB9CiAgICBmdW5jdGlvbiByZW1vdmVSdW5EZXBlbmRlbmN5KGlkKSB7CiAgICAgIHJ1bkRlcGVuZGVuY2llcy0tOwogICAgICBNb2R1bGVbIm1vbml0b3JSdW5EZXBlbmRlbmNpZXMiXT8uKHJ1bkRlcGVuZGVuY2llcyk7CiAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPT0gMCkgewogICAgICAgIGlmIChydW5EZXBlbmRlbmN5V2F0Y2hlciAhPT0gbnVsbCkgewogICAgICAgICAgY2xlYXJJbnRlcnZhbChydW5EZXBlbmRlbmN5V2F0Y2hlcik7CiAgICAgICAgICBydW5EZXBlbmRlbmN5V2F0Y2hlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChkZXBlbmRlbmNpZXNGdWxmaWxsZWQpIHsKICAgICAgICAgIHZhciBjYWxsYmFjayA9IGRlcGVuZGVuY2llc0Z1bGZpbGxlZDsKICAgICAgICAgIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IG51bGw7CiAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWJvcnQod2hhdCkgewogICAgICBNb2R1bGVbIm9uQWJvcnQiXT8uKHdoYXQpOwogICAgICB3aGF0ID0gIkFib3J0ZWQoIiArIHdoYXQgKyAiKSI7CiAgICAgIGVycih3aGF0KTsKICAgICAgQUJPUlQgPSB0cnVlOwogICAgICB3aGF0ICs9ICIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIjsKICAgICAgdmFyIGUgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpOwogICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgIHRocm93IGU7CiAgICB9CiAgICB2YXIgZGF0YVVSSVByZWZpeCA9ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjsKICAgIHZhciBpc0RhdGFVUkkgPSBmaWxlbmFtZSA9PiBmaWxlbmFtZS5zdGFydHNXaXRoKGRhdGFVUklQcmVmaXgpOwogICAgZnVuY3Rpb24gZmluZFdhc21CaW5hcnkoKSB7CiAgICAgIHZhciBmID0gImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxBR0Z6YlFFQUFBQUIyUUVjWUFOL2YzOEJmMkFFZjM5L2Z3Ri9ZQUYvQUdBQ2YzOEFZQUYvQVg5Z0EzOS9md0JnQW45L0FYOWdCSDkvZjM4QVlBTi9mbjhCZm1BRmYzOS9mMzhCZjJBQUFHQUNmbjhCZjJBRGYzNS9BWDlnQW41L0FYNWdCWDkvZjM5L0FHQUhmMzkvZjM5L2Z3Ri9ZQWwvZjM5L2YzOS9mMzhCZjJBTGYzOS9mMzkvZjM5L2YzOEJmMkFHZjM5L2YzOS9BWDlnQUFGL1lBWi9mMzkvZjM4QVlBWi9mSDkvZjM4QmYyQUNmM3dCZjJBSWYzOS9mMzkvZjM4QVlBaC9mMzkvZjM5L2Z3Ri9ZQWQvZjM5L2YzOS9BR0FDZkg4QmZHQUNmM3dBQW5NVEFXRUJZUUFDQVdFQllnQUJBV0VCWXdBRkFXRUJaQUFDQVdFQlpRQU9BV0VCWmdBSEFXRUJad0FEQVdFQmFBQUhBV0VCYVFBRkFXRUJhZ0FKQVdFQmF3QUNBV0VCYkFBS0FXRUJiUUFLQVdFQmJnQVdBV0VCYndBRUFXRUJjQUFHQVdFQmNRQUdBV0VCY2dBRUFXRUJjd0FEQTgwQnl3RUhBZ1VBQmdRQUJRWUVBUVVFRGdVWEJnSUNBZ0lBQmhBR0VRUUNDd3dTQWdVQ0JBY0VBaE1ERkFNQ0FnWUNHQU1IQlFBQUJBTUJDZ2tKQXdBSkJnRUVCQVVGRXc4QkFRTUFBd1lDRUFRVUdRSUhCZ01IQndFQkFnQUVDZ1lhQndRRUR3NERCZ1FBQkFJQ0FnQUdCZ0FCQVFFQkFRRUJBUUFBQUFBQUJnTUNBZ0lEQXdNREF3b0tBZ0liQUFNVkNBUUVBQWdEQXdrRUNBc0
205BQWdBQVFFQkFRRUJBUUVCREFBRUJBVUpEd0VTRVFFQUFBWURBd0VGQlFVRkJRVUZCUUVOQVFFQkFRRUJBUUVCQ3dRRkFYQUJjbklGQndFQmdnS0FnQUlHQ0FGL0FVSFE0QVVMQnlBSEFYUUNBQUYxQUVvQmRnQ3BBUUYzQUJRQmVBRUFBWGtBcUFFQmVnQ2RBUW5SQVFFQVFRRUxjVnJkQWRNQmdRR0JBVEM1QWE0QnFnR1lBWmNCbGdHVkFaUUJrd0dTQVpFQlc0NEJqUUdNQVlzQks0b0JpUUdJQVljQmhnR0ZBWVFCZ3dHQ0Fkd0Iyd0hhQWRrQjJBSFhBVW5XQWRVQlNVblVBZElCMFFIUUFjOEJ6Z0hOQWN3Qnl3SEtBY1FCdUFHM0FiWUJ0UUcwQWJNQnNnR3hBYkFCcndHdEFhd0Jxd0ZTVTFWYlVaQUJYRUJaandGWVRrOVhNU3k4QWJzQnZRSEZBY2tCeGdIQUFib0J2Z0cvQWNjQnlBRjl3UUhDQWNNQldxY0JwZ0dlQWFBQm53R2FBYU1CcEFHbEFhSUJvUUdiQVp3QkNzbXREc3NCZ2dJQkEzOGpBRUdRQkdzaUJDUUFBa0FnQUVVTkFBSkFBa0FDUUFKQUlBRkJBV3NPQkFBQkJBSUVDeUFBUVF4cUlRRU1BZ3NnQUVFUWFpRUJJQUJCQkdvaEFBd0JDeUFBUVJScUlRRWdBRUVJYWlFQUN5QUJLQUlBSWdWRkRRQWdBa1VOQUNBQUtBSUFJUVlnQkVFQVFZQUVFQmtpQVNBRE5nS01CQ01BUWFBQmF5SUFKQUFnQUNBQk5nS1VBU0FBUWY4RE5nS1lBU0FBUVFCQmtBRVFHU0lBUVg4MkFrd2dBRUhuQURZQ0pDQUFRWDgyQWxBZ0FDQUFRWjhCYWpZQ0xDQUFJQUJCbEFGcU5nSlVJQUZCQURvQUFDQUFJQUlnQTBIb0FFSHBBQkIxSUFCQm9BRnFKQUFnQVVFQU9nRC9BeUFCSUFZZ0JSRURBQXNnQkVHUUJHb2tBQXZRQWdFRmZ5QUFCRUFnQUVFRWF5SURLQUlBSWdRaEFTQURJUUlnQUVFSWF5Z0NBQ0lBSUFCQmZuRWlBRWNFUUNBQ0lBQnJJZ0lvQWdRaUFTQUNLQUlJSWdVMkFnZ2dCU0FCTmdJRUlBQWdCR29oQVFzZ0F5QUVhaUlBS0FJQUlnTWdBQ0FEYWtFRWF5Z0NBRWNFUUNBQUtBSUVJZ1FnQUNnQ0NDSUFOZ0lJSUFBZ0JEWUNCQ0FCSUFOcUlRRUxJQUlnQVRZQ0FDQUNJQUZCZkhGcVFRUnJJQUZCQVhJMkFnQWdBZ0ovSUFJb0FnQkJDR3NpQUVIL0FFMEVRQ0FBUVFOMlFRRnJEQUVMSUFCbklRTWdBRUVkSUFOcmRrRUVjeUFEUVFKMGEwSHVBR29nQUVIL0gwME5BQnBCUHlBQVFSNGdBMnQyUVFKeklBTkJBWFJyUWNjQWFpSUFJQUJCUDA4YkN5SUJRUVIwSWdCQjRNMEJhallDQkNBQ0lBQkI2TTBCYWlJQUtBSUFOZ0lJSUFBZ0FqWUNBQ0FDS0FJSUlBSTJBZ1JCNk5VQlFlalZBU2tEQUVJQklBR3Rob1EzQXdBTEM4a0NBUVIvSUFGQkFEWUNBQUpBSUFKRkRRQWdBU0FDYWlFREFrQWdBa0VRU1FSQUlBQWhBUXdCQ3dKQUlBRWdBQ0FDYWs4TkFDQUFJQU5QRFFBZ0FDRUJEQUVMSUFOQkVHc2hCaUFBSUFKQmNIRWlCV29oQVNBRElBVnJJUU1EUUNBR0lBUnJJQUFnQkdyOUFBQUEvUXdBQUFBQUFBQUFBQUFBQUFBQUFBQUEvUTBQRGcwTUN3b0pDQWNHQlFRREFnRUEvUXNBQUNBRVFSQnFJZ1FnQlVjTkFBc2dBaUFGUmcwQkN3SkFJQUpCQTNFaUJrVUVRQ0FGSVFRTUFRdEJBQ0VBSUFVaEJBTkFJQU5CQVdzaUF5QUJMUUFBT2dBQUlBUkJBV29oQkNBQlFRRnFJUUVnQUVFQmFpSUFJQVpIRFFBTEN5QUZJQUpyUVh4TERRQURRQ0FEUVFGcklBRXRBQUE2QUFBZ0EwRUNheUFCTFFBQk9nQUFJQU5CQTJzZ0FTMEFBam9BQUNBRFFRUnJJZ01nQVMwQUF6b0FBQ0FCUVFScUlRRWdCRUVFYWlJRUlBSkhEUUFMQ3d1Q0JBRURmeUFDUVlBRVR3UkFJQUFnQVNBQ0VBSWdBQThMSUFBZ0Ftb2hBd0pBSUFBZ0FYTkJBM0ZGQkVBQ1FDQUFRUU54UlFSQUlBQWhBZ3dCQ3lBQ1JRUkFJQUFoQWd3QkN5QUFJUUlEUUNBQ0lBRXRBQUE2QUFBZ0FVRUJhaUVCSUFKQkFXb2lBa0VEY1VVTkFTQUNJQU5KRFFBTEN5QURRWHh4SVFRQ1FDQURRY0FBU1EwQUlBSWdCRUZBYWlJRlN3MEFBMEFnQWlBQktBSUFOZ0lBSUFJZ0FTZ0NCRFlDQkNBQ0lBRW9BZ2cyQWdnZ0FpQUJLQUlNTmdJTUlBSWdBU2dDRURZQ0VDQUNJQUVvQWhRMkFoUWdBaUFCS0FJWU5nSVlJQUlnQVNnQ0hEWUNIQ0FDSUFFb0FpQTJBaUFnQWlBQktBSWtOZ0lrSUFJZ0FTZ0NLRFlDS0NBQ0lBRW9BaXcyQWl3Z0FpQUJLQUl3TmdJd0lBSWdBU2dDTkRZQ05DQUNJQUVvQWpnMkFqZ2dBaUFCS0FJOE5nSThJQUZCUUdzaEFTQUNRVUJySWdJZ0JVME5BQXNMSUFJZ0JFOE5BUU5BSUFJZ0FTZ0NBRFlDQUNBQlFRUnFJUUVnQWtFRWFpSUNJQVJKRFFBTERBRUxJQU5CQkVrRVFDQUFJUUlNQVFzZ0EwRUVheUlFSUFCSkJFQWdBQ0VDREFFTElBQWhBZ05BSUFJZ0FTMEFBRG9BQUNBQ0lBRXRBQUU2QUFFZ0FpQUJMUUFDT2dBQ0lBSWdBUzBBQXpvQUF5QUJRUVJxSVFFZ0FrRUVhaUlDSUFSTkRRQUxDeUFDSUFOSkJFQURRQ0FDSUFFdEFBQTZBQUFnQVVFQmFpRUJJQUpCQVdvaUFpQURSdzBBQ3dzZ0FBc3dBUUYvQWtBZ0FFVU5BQ0FCUlEwQVFRZ2dBQ0FCYkNJQkVDa2lBQVJBSUFCQkFDQUJFQmthQ3lBQUlRSUxJQUlMRVFBZ0FFVUVRRUVBRHd0QkNDQUFFQ2tMOGdJQ0FuOEJmZ0pBSUFKRkRRQWdBQ0FCT2dBQUlBQWdBbW9pQTBFQmF5QUJPZ0FBSUFKQkEwa05BQ0FBSUFFNkFBSWdBQ0FCT2dBQklBTkJBMnNnQVRvQUFDQURRUUpySUFFNkFBQWdBa0VIU1EwQUlBQWdBVG9BQXlBRFFRUnJJQUU2QUFBZ0FrRUpTUTBBSUFCQkFDQUFhMEVEY1NJRWFpSURJQUZCL3dGeFFZR0NoQWhzSWdFMkFnQWdBeUFDSUFSclFYeHhJZ1JxSWdKQkJHc2dBVFlDQUNBRVFRbEpEUUFnQXlBQk5nSUlJQU1nQVRZQ0JDQUNRUWhySUFFMkFnQWdBa0VNYXlBQk5nSUFJQVJCR1VrTkFDQURJQUUyQWhnZ0F5QUJOZ0lVSUFNZ0FUWUNFQ0FESUFFMkFnd2dBa0VRYXlBQk5nSUFJQUpCRkdzZ0FUWUNBQ0FDUVJocklBRTJBZ0FnQWtFY2F5QUJOZ0lBSUFRZ0EwRUVjVUVZY2lJRWF5SUNRU0JKRFFBZ0FhMUNnWUNBZ0JCK0lRVWdBeUFFYWlFQkEwQWdBU0FGTndNWUlBRWdCVGNERUNBQklBVTNBd2dnQVNBRk53TUFJQUZCSUdvaEFTQUNRU0JySWdKQkgwc05BQXNMSUFBTEp3RUJmeU1BUVJCcklnTWtBQ0FESUFJMkFnd2dBQ0FCSUFKQkFFRUFFSFVnQTBFUWFpUUFDK2dGQVFsL0lBRkZCRUJCQUE4TEFuOGdBRVVFUUVFSUlBRVFLUXdCQ3lBQlJRUkFJQUFRRkVFQURBRUxBa0FnQVVGSFN3MEFJQUFDZjBFSUlBRkJBMnBCZkhFZ0FVRUlUUnNpQjBFSWFpRUJBa0FDZndKQUlBQkJCR3NpQ2lJRUtBSUFJZ1VnQkdvaUFpZ0NBQ0lKSUFJZ0NXb2lDRUVFYXlnQ0FFY0VRQ0FJSUFFZ0JHb2lBMEVRYWs4RVFDQUNLQUlFSWdVZ0FpZ0NDQ0lDTmdJSUlBSWdCVFlDQkNBRElBZ2dBMnNpQWpZQ0FDQURJQUpCZkhGcVFRUnJJQUpCQVhJMkFnQWdBd0ovSUFNb0FnQkJDR3NpQWtIL0FFMEVRQ0FDUVFOMlFRRnJEQUVMSUFKQkhTQUNaeUlGYTNaQkJITWdCVUVDZEd0QjdnQnFJQUpCL3g5TkRRQWFRVDhnQWtFZUlBVnJka0VDY3lBRlFRRjBhMEhIQUdvaUFpQUNRVDlQR3dzaUFrRUVkQ0lGUWVETkFXbzJBZ1FnQXlBRlFlak5BV29pQlNnQ0FEWUNDQ0FGSUFNMkFnQWdBeWdDQ0NBRE5nSUVRZWpWQVVIbzFRRXBBd0JDQVNBQ3JZYUVOd01BSUFRZ0FUWUNBQXdFQ3lBRElBaExEUUVnQWlnQ0JDSUJJQUlvQWdnaUF6WUNDQ0FESUFFMkFnUWdCQ0FGSUFscUlnRTJBZ0FNQXdzZ0JTQUJRUkJxVHdSQUlBUWdBVFlDQUNBRUlBRkJmSEZxUVFScklBRTJBZ0FnQVNBRWFpSURJQVVnQVdzaUFUWUNBQ0FESUFGQmZIRnFRUVJySUFGQkFYSTJBZ0FnQXdKL0lBTW9BZ0JCQ0dzaUFVSC9BRTBFUUNBQlFRTjJRUUZyREFFTElBRkJIU0FCWnlJRWEzWkJCSE1nQkVFQ2RHdEI3Z0JxSUFGQi94OU5EUUFhUVQ4Z0FVRWVJQVJyZGtFQ2N5QUVRUUYwYTBISEFHb2lBU0FCUVQ5UEd3c2lBVUVFZENJRVFlRE5BV28yQWdRZ0F5QUVRZWpOQVdvaUJDZ0NBRFlDQ0NBRUlBTTJBZ0FnQXlnQ0NDQUROZ0lFUWVqVkFVSG8xUUVwQXdCQ0FTQUJyWWFFTndNQVFRRU1CQXRCQVNBQklBVk5EUUVhQzBFQUN3d0JDeUFFSUFGQmZIRnFRUVJySUFFMkFn
20QkJBUXNOQVJwQkNDQUhFQ2tpQVVVTkFDQUJJQUFnQnlBS0tBSUFRUWhySWdZZ0JpQUhTeHNRRmhvZ0FCQVVJQUVoQmdzZ0Jnc0xNd0VCZnlNQVFSQnJJZ0VrQUNBQUJIOGdBVUVNYWtFUUlBQVFlU0VBUVFBZ0FTZ0NEQ0FBR3dWQkFBc2dBVUVRYWlRQUM3d0VBUVYvSUFJZ0FDZ0NNQ0lGVFFSQUlBRWdBQ2dDSkNBQ0VCWWFJQUFnQUNnQ0pDQUNhallDSkNBQUlBQW9BakFnQW1zMkFqQWdBQ0FBS1FNNElBS3RmRGNET0NBQ0R3c2dBQzBBUkVFRWNRUkFJQUVnQUNnQ0pDQUZFQllhSUFBb0FqQWhBU0FBUVFBMkFqQWdBQ0FCSUFBb0FpUnFOZ0lrSUFBZ0FDa0RPQ0FCclh3M0F6Z2dCVUYvSUFVYkR3c0NRQ0FGQkVBZ0FTQUFLQUlrSUFVUUZpRUVJQUFnQUNnQ0lDSUhOZ0lrSUFBb0FqQWhBU0FBUVFBMkFqQWdBQ0FBS1FNNElBR3RmRGNET0NBQ0lBRnJJUUlnQVNBRWFpRUJEQUVMSUFBZ0FDZ0NJQ0lITmdJa0N3SkFBa0FEUUFKQUlBQW9BZ0FoQkNBQUtBSVFJUVlDUUNBQUtBSkFJZ2dnQWtzRVFDQUFJQWNnQ0NBRUlBWVJBQUFpQmpZQ01DQUdRWDlHQkVBTUJnc2dBaUFHVFEwQ0lBRWdBQ2dDSkNBR0VCWWFJQUFnQUNnQ0lDSUhOZ0lrSUFBb0FqQWhCQXdCQ3lBQUlBRWdBaUFFSUFZUkFBQWlCRFlDTUNBRVFYOUdCRUFNQlFzZ0FpQUVUUTBESUFBZ0FDZ0NJQ0lITmdJa0lBUWhCZ3NnQUVFQU5nSXdJQUFnQUNrRE9DQUVyWHczQXpnZ0FTQUVhaUVCSUFJZ0JHc2hBaUFGSUFacUlRVU1BUXNMSUFFZ0FDZ0NKQ0FDRUJZYUlBQWdBQ2dDSkNBQ2FqWUNKQ0FBSUFBb0FqQWdBbXMyQWpBZ0FDQUFLUU00SUFLdGZEY0RPQ0FDSUFWcUR3c2dBRUVBTmdJd0lBQWdBQ2dDSURZQ0pDQUFJQUFwQXpnZ0JLMThOd000SUFRZ0JXb1BDeUFEUVFSQjZma0FRUUFRRXlBQVFRQTJBakFnQUNBQUtBSkVRUVJ5TmdKRUlBVkJmeUFGR3dzWEFDQUFMUUFBUVNCeFJRUkFJQUVnQWlBQUVFWWFDd3VEQndJTGZ3RitJQUFvQWhBaUIwRWdUd1JBSUFBcEF3aW5Ed3NDUUNBQUtBSVlJZ0pCQkU0RVFDQUFLQUlBSWdFb0FnQWhCQ0FBSUFKQkJHc2lCVFlDR0NBQUlBRkJCR28yQWdBTUFRdEJmMEVBSUFBb0Fod2JJUVFnQWtFQVRBUkFJQUloQlF3QkN5QUNRUUZ4SUFBb0FnQWhBUUpBSUFKQkFVWUVRQ0FCSVFZTUFRc2dBa0grLy8vL0IzRWhDZ05BSUFBZ0FVRUJhallDQUNBQkxRQUFJUWtnQUNBQlFRSnFJZ1kyQWdBZ0FDQUNRUUZyTmdJWUlBRXRBQUVoQVNBQUlBSkJBbXNpQWpZQ0dDQUVRZjhCSUFOMFFYOXpjU0FKSUFOMGNrR0EvZ01nQTNSQmYzTnhJQUVnQTBFSWNuUnlJUVFnQTBFUWFpRURJQVloQVNBRlFRSnFJZ1VnQ2tjTkFBc0xRUUFoQlVVTkFDQUFJQVpCQVdvMkFnQWdCaTBBQUNFQklBQWdBa0VCYXpZQ0dDQUVRZjhCSUFOMFFYOXpjU0FCSUFOMGNpRUVDeUFBS0FJVUlRRWdBQ0FFUVJoMklncEIvd0ZHTmdJVUlBQkJCMEVJSUFFYklnRkJCMEVJSUFSQi93RnhJZ1pCL3dGR0cyb2lBa0VIUVFnZ0JFRUlka0gvQVhFaUEwSC9BVVliYWlJSlFRZEJDQ0FFUVJCMlFmOEJjU0lFUWY4QlJoc2dCMnBxSWdnMkFoQWdBQ0FBS1FNSUlBTWdBWFFnQkNBQ2RISWdDaUFKZEhJZ0JuS3RJQWV0aG9RaUREY0RDQ0FJUVI5TkJFQUNRQ0FGUVFST0JFQWdBQ2dDQUNJQktBSUFJUUlnQUNBRlFRUnJOZ0lZSUFBZ0FVRUVhallDQUF3QkMwRUFJUU5CZjBFQUlBQW9BaHdiSVFJZ0JVRUFUQTBBSUFWQkFYRWdBQ2dDQUNFQkFrQWdCVUVCUmdSQUlBRWhCQXdCQ3lBRlFmNy8vLzhIY1NFSlFRQWhCZ05BSUFBZ0FVRUJhallDQUNBQkxRQUFJUXNnQUNBQlFRSnFJZ1EyQWdBZ0FDQUZRUUZyTmdJWUlBRXRBQUVoQVNBQUlBVkJBbXNpQlRZQ0dDQUNRZjhCSUFOMFFYOXpjU0FMSUFOMGNrR0EvZ01nQTNSQmYzTnhJQUVnQTBFSWNuUnlJUUlnQTBFUWFpRURJQVFoQVNBR1FRSnFJZ1lnQ1VjTkFBc0xSUTBBSUFBZ0JFRUJhallDQUNBRUxRQUFJUUVnQUNBRlFRRnJOZ0lZSUFKQi93RWdBM1JCZjNOeElBRWdBM1J5SVFJTElBQWdBa0VZZGlJQlFmOEJSallDRkNBQVFRZEJDQ0FLUWY4QlJoc2lCRUVIUVFnZ0FrSC9BWEVpQmtIL0FVWWJhaUlGUVFkQkNDQUNRUWgyUWY4QmNTSURRZjhCUmh0cUlnZEJCMEVJSUFKQkVIWkIvd0Z4SWdKQi93RkdHeUFJYW1vMkFoQWdBQ0FESUFSMElBSWdCWFJ5SUFFZ0IzUnlJQVp5clNBSXJZWWdESVFpRERjRENBc2dES2NMYXdFQmZ5TUFRWUFDYXlJRkpBQUNRQ0FDSUFOTURRQWdCRUdBd0FSeERRQWdCU0FCSUFJZ0Eyc2lBMEdBQWlBRFFZQUNTU0lCR3hBWkdpQUJSUVJBQTBBZ0FDQUZRWUFDRUI0Z0EwR0FBbXNpQTBIL0FVc05BQXNMSUFBZ0JTQURFQjRMSUFWQmdBSnFKQUFMTVFBZ0FRSi9JQUlvQWt4QkFFZ0VRQ0FBSUFFZ0FoQkdEQUVMSUFBZ0FTQUNFRVlMSWdCR0JFQVBDeUFBSUFGdUdnc1hBQ0FBSUFFZ0FpQURJQVFnQlNBR0lBZEJBUkFxR2d1aEFRRUVmeUFCUVFCTUJFQkJBQThMSUFBb0Fnd2hBaUFBS0FJUUlRTURRQ0FCSVFVQ1FDQUREUUFnQUNBQ1FRaDBRWUQrQTNFaUFqWUNEQ0FBUVFkQkNDQUNRWUQrQTBZYklnTTJBaEFnQUNnQ0NDSUJJQUFvQWdSUERRQWdBQ0FCUVFGcU5nSUlJQUFnQWlBQkxRQUFjaUlDTmdJTUN5QUFJQU5CQVdzaUF6WUNFQ0FDSUFOMlFRRnhJQVZCQVdzaUFYUWdCSEloQkNBRlFRRkxEUUFMSUFRTEhnQWdBQ2dDREFSQUlBQkJBRFlDS0FOQUlBQW9BaGhCQUVvTkFBc0xDMm9CQTM4Z0FBUkFJQUFvQWhnaUFRUkFJQUFvQWhBaUFnUi9RUUFoQVFOQUlBQW9BaGdnQVVFMGJHb29BaXdpQXdSQUlBTVFGQ0FBS0FJUUlRSUxJQUZCQVdvaUFTQUNTUTBBQ3lBQUtBSVlCU0FCQ3hBVUN5QUFLQUljSWdFRVFDQUJFQlFMSUFBUUZBc0xraFVCRDM4Q1FBSkFJQUFvQWd4RkJFQkJBU0VQSUFBb0FnUkJBRW9OQVNBQUtBSUlRUUZLRFFFTUFndEJBU0VOSUFBb0FnaEJBRW9OQUNBQUtBSUVRUUpJRFFFTElBQW9BZ0FpQ0NBTlFRVjBhaUVFQWtBZ0FDZ0NFQ0lISUFBb0FoUWlDazhOQUNBRUlBZEJCblJxSVFFQ1FDQUtJQWRyUVFOeElnWkZCRUFnQnlFQ0RBRUxJQWNoQWdOQUlBRWdBZjBBQkFEOURGaDJuVDlZZHAwL1dIYWRQMWgyblQvOTVnSDlDd1FBSUFFZ0FmMEFCQkQ5REZoMm5UOVlkcDAvV0hhZFAxaDJuVC85NWdIOUN3UVFJQUZCUUdzaEFTQUNRUUZxSVFJZ0EwRUJhaUlESUFaSERRQUxDeUFISUFwclFYeExEUUFEUUNBQklBSDlBQVFBL1F4WWRwMC9XSGFkUDFoMm5UOVlkcDAvL2VZQi9Rc0VBQ0FCSUFIOUFBUVEvUXhZZHAwL1dIYWRQMWgyblQ5WWRwMC8vZVlCL1FzRUVDQUJJQUg5QUFSQS9ReFlkcDAvV0hhZFAxaDJuVDlZZHAwLy9lWUIvUXNFUUNBQklBSDlBQVJRL1F4WWRwMC9XSGFkUDFoMm5UOVlkcDAvL2VZQi9Rc0VVQ0FCSUFIOUFBU0FBZjBNV0hhZFAxaDJuVDlZZHAwL1dIYWRQLzNtQWYwTEJJQUJJQUVnQWYwQUJKQUIvUXhZZHAwL1dIYWRQMWgyblQ5WWRwMC8vZVlCL1FzRWtBRWdBU0FCL1FBRXdBSDlERmgyblQ5WWRwMC9XSGFkUDFoMm5ULzk1Z0g5Q3dUQUFTQUJJQUg5QUFUUUFmME1XSGFkUDFoMm5UOVlkcDAvV0hhZFAvM21BZjBMQk5BQklBRkJnQUpxSVFFZ0FrRUVhaUlDSUFwSERRQUxDeUFJSUE5QkJYUnFJUVVDUUNBQUtBSVlJZ1lnQUNnQ0hDSUxUdzBBSUFVZ0JrRUdkR29oQVFKQUlBc2dCbXRCQTNFaUNFVUVRQ0FHSVFJTUFRdEJBQ0VESUFZaEFnTkFJQUVnQWYwQUJBRDlEQUFZMEQ4QUdOQS9BQmpRUHdBWTBELzk1Z0g5Q3dRQUlBRWdBZjBBQkJEOURBQVkwRDhBR05BL0FCalFQd0FZMEQvOTVnSDlDd1FRSUFGQlFHc2hBU0FDUVFGcUlRSWdBMEVCYWlJRElBaEhEUUFMQ3lBR0lBdHJRWHhMRFFB
20RFFDQUJJQUg5QUFRQS9Rd0FHTkEvQUJqUVB3QVkwRDhBR05BLy9lWUIvUXNFQUNBQklBSDlBQVFRL1F3QUdOQS9BQmpRUHdBWTBEOEFHTkEvL2VZQi9Rc0VFQ0FCSUFIOUFBUkEvUXdBR05BL0FCalFQd0FZMEQ4QUdOQS8vZVlCL1FzRVFDQUJJQUg5QUFSUS9Rd0FHTkEvQUJqUVB3QVkwRDhBR05BLy9lWUIvUXNFVUNBQklBSDlBQVNBQWYwTUFCalFQd0FZMEQ4QUdOQS9BQmpRUC8zbUFmMExCSUFCSUFFZ0FmMEFCSkFCL1F3QUdOQS9BQmpRUHdBWTBEOEFHTkEvL2VZQi9Rc0VrQUVnQVNBQi9RQUV3QUg5REFBWTBEOEFHTkEvQUJqUVB3QVkwRC85NWdIOUN3VEFBU0FCSUFIOUFBVFFBZjBNQUJqUVB3QVkwRDhBR05BL0FCalFQLzNtQWYwTEJOQUJJQUZCZ0FKcUlRRWdBa0VFYWlJQ0lBdEhEUUFMQ3lBS0lBQW9BZ2dpQ1NBQUtBSUVJZzRnRFdzaUFDQUFJQWxLR3lJSUlBZ2dDa3NiSVF3Z0JFRWdhaUVCQW44Z0IwVUVRQ0FNUlFSQVFRQWhBeUFCREFJTElBUWdCUDBBQkFBZ0JmMEFCQUFnQlAwQUJDRDk1QUg5REZVVDR6NVZFK00rVlJQalBsVVQ0ejc5NWdIOTVRSDlDd1FBSUFRZ0JQMEFCQkFnQmYwQUJCQWdCUDBBQkREOTVBSDlERlVUNHo1VkUrTStWUlBqUGxVVDR6Nzk1Z0g5NVFIOUN3UVFRUUVoQXlBRVFlQUFhZ3dCQ3lBQklBY2lBMEVHZEdvTElRSWdBeUFNU1FSQUEwQWdBa0VnYXlJQUlBRDlBQVFBSUFKQlFHcjlBQVFBSUFMOUFBUUEvZVFCL1F4VkUrTStWUlBqUGxVVDR6NVZFK00rL2VZQi9lVUIvUXNFQUNBQ1FSQnJJZ0FnQVAwQUJBQWdBa0V3YS8wQUJBQWdBdjBBQkJEOTVBSDlERlVUNHo1VkUrTStWUlBqUGxVVDR6Nzk1Z0g5NVFIOUN3UUFJQUpCUUdzaEFpQURRUUZxSWdNZ0RFY05BQXNMSUFnZ0NrOGlEVVVFUUNBQ1FTQnJJZ0FnQVAwQUJBQWdBa0
20ZBYXYwQUJBRDlERlVUWXo5VkUyTS9WUk5qUDFVVFl6Lzk1Z0g5NVFIOUN3UUFJQUpCRUdzaUFDQUEvUUFFQUNBQ1FUQnIvUUFFQVAwTVZSTmpQMVVUWXo5VkUyTS9WUk5qUC8zbUFmM2xBZjBMQkFBTElBc2dEaUFKSUE5cklnQWdBQ0FPU2hzaURpQUxJQTVKR3lFSklBVkJJR29oQWlBSkFuOGdCa1VFUUNBSlJRUkFJQUloQTBFQURBSUxJQVVnQmYwQUJBQWdCUDBBQkFBZ0JmMEFCQ0Q5NUFIOURIWUdZajkyQm1JL2RnWmlQM1lHWWovOTVnSDk1UUg5Q3dRQUlBVWdCZjBBQkJBZ0JQMEFCQkFnQmYwQUJERDk1QUg5REhZR1lqOTJCbUkvZGdaaVAzWUdZai85NWdIOTVRSDlDd1FRSUFWQjRBQnFJUU5CQVF3QkN5QUNJQVpCQm5ScUlRTWdCZ3NpQUVzRVFBTkFJQU5CSUdzaUNDQUkvUUFFQUNBRFFVQnEvUUFFQUNBRC9RQUVBUDNrQWYwTWRnWmlQM1lHWWo5MkJtSS9kZ1ppUC8zbUFmM2xBZjBMQkFBZ0EwRVFheUlJSUFqOUFBUUFJQU5CTUd2OUFBUUFJQVA5QUFRUS9lUUIvUXgyQm1JL2RnWmlQM1lHWWo5MkJtSS8vZVlCL2VVQi9Rc0VBQ0FEUVVCcklRTWdBRUVCYWlJQUlBbEhEUUFMQ3lBTElBNU5JZ2hGQkVBZ0EwRWdheUlBSUFEOUFBUUFJQU5CUUdyOUFBUUEvUXgyQnVJL2RnYmlQM1lHNGo5MkJ1SS8vZVlCL2VVQi9Rc0VBQ0FEUVJCcklnQWdBUDBBQkFBZ0EwRXdhLzBBQkFEOURIWUc0ajkyQnVJL2RnYmlQM1lHNGovOTVnSDk1UUg5Q3dRQUN3SkFJQWRGQkVBZ0RFVUVRRUVBSVFjTUFnc2dCQ0FFL1FBRUFDQUYvUUFFQUNBRS9RQUVJUDNrQWYwTXJnRlpQYTRCV1QydUFWazlyZ0ZaUGYzbUFmM2tBZjBMQkFBZ0JDQUUvUUFFRUNBRi9RQUVFQ0FFL1FBRU1QM2tBZjBNcmdGWlBhNEJXVDJ1QVZrOXJnRlpQZjNtQWYza0FmMExCQkFnQkVIZ0FHb2hBVUVCSVFjTUFRc2dBU0FIUVFaMGFpRUJDeUFISUF4SkJFQURRQ0FCUVNCcklnQWdBUDBBQkFBZ0FVRkFhdjBBQkFBZ0FmMEFCQUQ5NUFIOURLNEJXVDJ1QVZrOXJnRlpQYTRCV1QzOTVnSDk1QUg5Q3dRQUlBRkJFR3NpQUNBQS9RQUVBQ0FCUVRCci9RQUVBQ0FCL1FBRUVQM2tBZjBNcmdGWlBhNEJXVDJ1QVZrOXJnRlpQZjNtQWYza0FmMExCQUFnQVVGQWF5RUJJQWRCQVdvaUJ5QU1SdzBBQ3dzZ0RVVUVRQ0FCUVNCcklnQWdBUDBBQkFBZ0FVRkFhdjBBQkFEOURLNEIyVDJ1QWRrOXJnSFpQYTRCMlQzOTVnSDk1QUg5Q3dRQUlBRkJFR3NpQUNBQS9RQUVBQ0FCUVRCci9RQUVBUDBNcmdIWlBhNEIyVDJ1QWRrOXJnSFpQZjNtQWYza0FmMExCQUFMQWtBZ0JrVUVRQ0FKUlFSQVFRQWhCZ3dDQ3lBRklBWDlBQVFBSUFUOUFBUUFJQVg5QUFRZy9lUUIvUXh6QnNzL2N3YkxQM01HeXo5ekJzcy8vZVlCL2VRQi9Rc0VBQ0FGSUFYOUFBUVFJQVQ5QUFRUUlBWDlBQVF3L2VRQi9ReHpCc3MvY3diTFAzTUd5ejl6QnNzLy9lWUIvZVFCL1FzRUVDQUZRZUFBYWlFQ1FRRWhCZ3dCQ3lBQ0lBWkJCblJxSVFJTElBWWdDVWtFUUFOQUlBSkJJR3NpQUNBQS9RQUVBQ0FDUVVCcS9RQUVBQ0FDL1FBRUFQM2tBZjBNY3diTFAzTUd5ejl6QnNzL2N3YkxQLzNtQWYza0FmMExCQUFnQWtFUWF5SUFJQUQ5QUFRQUlBSkJNR3Y5QUFRQUlBTDlBQVFRL2VRQi9ReHpCc3MvY3diTFAzTUd5ejl6QnNzLy9lWUIvZVFCL1FzRUFDQUNRVUJySVFJZ0JrRUJhaUlHSUFsSERRQUxDeUFJRFFBZ0FrRWdheUlBSUFEOUFBUUFJQUpCUUdyOUFBUUEvUXh6Qmt0QWN3WkxRSE1HUzBCekJrdEEvZVlCL2VRQi9Rc0VBQ0FDUVJCcklnQWdBUDBBQkFBZ0FrRXdhLzBBQkFEOURITUdTMEJ6Qmt0QWN3WkxRSE1HUzBEOTVnSDk1QUg5Q3dRQUN3dGRBUVIvSUFBRVFDQUFLQUlVSWdFZ0FDZ0NFQ0lDYkFSQUEwQWdBQ2dDR0NBRFFRSjBhaWdDQUNJRUJFQWdCQkFVSUFBb0FoQWhBaUFBS0FJVUlRRUxJQU5CQVdvaUF5QUJJQUpzU1EwQUN3c2dBQ2dDR0JBVUlBQVFGQXNMaFFFQkFuOENRQUpBSUFBb0FnUWlBeUFBS0FJQUlnUkhCRUFnQUNnQ0NDRUREQUVMSUFBZ0EwRUthaUlFTmdJRUlBQW9BZ2dnQkVFQ2RCQWJJZ05GRFFFZ0FDQUROZ0lJSUFBb0FnQWhCQXNnQXlBRVFRSjBhaUFCTmdJQUlBQWdCRUVCYWpZQ0FFRUJEd3NnQUNnQ0NCQVVJQUJDQURjQ0FDQUNRUUZCeGk5QkFCQVRRUUFMa3dRQ0JuOENmZ0pBQWtBRFFDQUFJQUJCQVd0eERRRWdBVUZIU3cwQklBQkJDQ0FBUVFoTElnY2JJUUJCNk5VQktRTUFJZ2dDZjBFSUlBRkJBMnBCZkhFZ0FVRUlUUnNpQVVIL0FFMEVRQ0FCUVFOMlFRRnJEQUVMSUFGbklRTWdBVUVkSUFOcmRrRUVjeUFEUVFKMGEwSHVBR29nQVVIL0gwME5BQnBCUHlBQlFSNGdBMnQyUVFKeklBTkJBWFJyUWNjQWFpSURJQU5CUDA4YkN5SURyWWdpQ1VJQVVnUkFBMEFnQ1NBSmVpSUlpQ0VKQW40Z0F5QUlwMm9pQTBFRWRDSUVRZWpOQVdvb0FnQWlBaUFFUWVETkFXb2lCVWNFUUNBQ0lBQWdBUkJGSWdRTkJpQUNLQUlFSWdRZ0FpZ0NDQ0lHTmdJSUlBWWdCRFlDQkNBQ0lBVTJBZ2dnQWlBRktBSUVOZ0lFSUFVZ0FqWUNCQ0FDS0FJRUlBSTJBZ2dnQTBFQmFpRURJQWxDQVlnTUFRdEI2TlVCUWVqVkFTa0RBRUorSUFPdGlZTTNBd0FnQ1VJQmhRc2lDVUlBVWcwQUMwSG8xUUVwQXdBaENBdEJQeUFJZWFkcklRVUNRQ0FJVUFSQVFRQWhBZ3dCQ3lBRlFRUjBJZ1JCNk0wQmFpZ0NBQ0VDSUFoQ2dJQ0FnQVJVRFFCQjR3QWhBeUFDSUFSQjRNMEJhaUlHUmcwQUEwQWdBMFVOQVNBQ0lBQWdBUkJGSWdRTkJDQURRUUZySVFNZ0FpZ0NDQ0lDSUFaSERRQUxDeUFCSUFCQk1HcEJNQ0FIRzJvUWVnMEFDeUFDUlEwQUlBSWdCVUVFZEVIZ3pRRnFJZ05HRFFBRFFDQUNJQUFnQVJCRklnUU5BaUFDS0FJSUlnSWdBMGNOQUFzTFFRQWhCQXNnQkF1V0l3SW5md043QWtBZ0F5QUFLQUlBSWdsTERRQWdBU0FEVHcwQUlBRWdDVThOQUNBRUlBQW9BZ1FpQ1VzTkFDQUNJQVJQRFFBZ0FpQUpUdzBBSUFWQkhHc2hKeUFBS0FJSUlobEJBblFoRVNBSFFRSjBJUThnQmtFQ2RDRWZJQVZCQkdzaEtDQUNJQUFvQWd4dUlSNGdHU0FaSUFFZ0dXNGlLV3dnQVd0cUlTb2dCa0VJUnlFaklBSWhIUU5BSUFBb0Fnd2lDU0VLSUFJZ0hVWUVRQ0FKSUFJZ0NYQnJJUW9MSUFvZ0JDQWRheUlNSUFvZ0RFa2JJaE5CZkhFaEd5QVRRUU54SVJZZ0UwRjRjU0VySUJOQkIzRWhKQ0FUUVFGcklSb2dHU0FKUVFKMElBcEJBblJyUVFScWJDRWdJQVpCQWtZZ0UwRUJSbkVoTENBSklBcHJJQmxzSVNVZ0p5QVBJQjBnQW1zaURHd2lDV29oSmlBSklDaHFJUzBnQlNBSmFpRXVJQVVnQnlBTWJFRUNkR29oSENBcElTRWdBU0VZQTBBZ0tpQVpJQUVnR0VZYklnd2dBeUFZYXlJSklBa2dERXNiSVJBZ0dTQU1heUVKSUNGQkFuUWlEU0FBS0FJWUlBQW9BaEFnSG14QkFuUnFhaWdDQUNFU0FrQUNRQ0FJQkVBQ1FBSkFBa0FDUUFKQUlCSUVRQ0FTSUNWQkFuUnFJQWxCQW5ScUlRb2dHQ0FCYXlFTklBWkJBVVlOQkNBY0lBWWdEV3hCQW5ScUlRc2dFRUVCUmcwRElDd05BaUFqRFFFZ0VFRUhUUTBCSUJORkRRZ2dKaUFOSUI5c2FpQVFRUVYwYWlFVklCSWdJQ0FRUVFKMGFpQU1RUUowYTJvaElpQVFRWHh4SVExQkFDRVNEQVVMSUFaQkFVY0VRQ0FUUlEwSUlCQkJmSEVoRFNBUVFRTnhJUXdnSENBWUlBRnJJQVpzUVFKMGF
20pRUxRUUFoRWlBUVFRRnJRUU5KSVJRRFFBSkFJQkJGRFFCQkFDRUpRUUFoQ2tFQUlRNGdGRVVFUUFOQUlBc2dCaUFLYkVFQ2RHcEJBRFlDQUNBTElBcEJBWElnQm14QkFuUnFRUUEyQWdBZ0N5QUtRUUp5SUFac1FRSjBha0VBTmdJQUlBc2dDa0VEY2lBR2JFRUNkR3BCQURZQ0FDQUtRUVJxSVFvZ0RrRUVhaUlPSUExSERRQUxDeUFNUlEwQUEwQWdDeUFHSUFwc1FRSjBha0VBTmdJQUlBcEJBV29oQ2lBSlFRRnFJZ2tnREVjTkFBc0xJQXNnRDJvaEN5QVRJQkpCQVdvaUVrY05BQXNNQ0FzZ0UwVU5CeUFRUVFKMElRd2dIQ0FZSUFGclFRSjBhaUVMUVFBaENTQWFRUWRQQkVBRFFDQUxRUUFnREJBWklBOXFRUUFnREJBWklBOXFRUUFnREJBWklBOXFRUUFnREJBWklBOXFRUUFnREJBWklBOXFRUUFnREJBWklBOXFRUUFnREJBWklBOXFRUUFnREJBWklBOXFJUXNnQ1VFSWFpSUpJQ3RIRFFBTEMwRUFJUWtnSkVVTkJ3TkFJQXRCQUNBTUVCa2dEMm9oQ3lBSlFRRnFJZ2tnSkVjTkFBc01Cd3NnRTBVTkJpQVFRWHh4SVJRZ0VFRURjU0VTUVFBaERTQVFRUUZyUVFOSklSY01CUXRCQUNFSklCQkJmSEVpRGdSQUEwQWdDeUFKUVFOMGFpQUtJQWxCQW5ScUtBSUFOZ0lBSUFzZ0NVRUJjaUlVUVFOMGFpQUtJQlJCQW5ScUtBSUFOZ0lBSUFzZ0NVRUNjaUlVUVFOMGFpQUtJQlJCQW5ScUtBSUFOZ0lBSUFzZ0NVRURjaUlVUVFOMGFpQUtJQlJCQW5ScUtBSUFOZ0lBSUFsQkJHb2lDU0FPU1EwQUN3c2dDU0FRVHcwRkFrQWdFQ0FKYXlJVVFROU5EUUFnTGlBTklCOXNJZzFxSUFsQkEzUnFJQklnSUdvaURpQVFJQXhyUVFKMGFra0VRQ0FPSUFrZ0RHdEJBblJxSUEwZ0xXb2dFRUVEZEdwSkRRRUxJQW9nQ1VFQ2RHb2hEU0FKL1JIOURBQUFBQUFCQUFBQUFnQUFBQU1BQUFEOXJnRWhNQ0FKSUJSQmZIRWlER29oQ1VFQUlRNERRQ0FMSURCQkEvMnJBU0l4L1JzQWFpQU5JQTVCQW5ScS9RQUNBQ0l5L1ZvQ0FBQWdDeUF4L1JzQmFpQXkvVm9DQUFFZ0N5QXgvUnNDYWlBeS9Wb0NBQUlnQ3lBeC9Sc0RhaUF5L1ZvQ0FBTWdNUDBNQkFBQUFBUUFBQUFFQUFBQUJBQUFBUDJ1QVNFd0lBNUJCR29pRGlBTVJ3MEFDeUFNSUJSR0RRWUxRUUFoRENBSklRNGdFQ0FKYTBFRGNTSU5CRUFEUUNBTElBNUJBM1JxSUFvZ0RrRUNkR29vQWdBMkFnQWdEa0VCYWlFT0lBeEJBV29pRENBTlJ3MEFDd3NnQ1NBUWEwRjhTdzBGQTBBZ0N5QU9RUU4wYWlBS0lBNUJBblJxS0FJQU5nSUFJQXNnRGtFQmFpSUpRUU4wYWlBS0lBbEJBblJxS0FJQU5nSUFJQXNnRGtFQ2FpSUpRUU4wYWlBS0lBbEJBblJxS0FJQU5nSUFJQXNnRGtFRGFpSUpRUU4wYWlBS0lBbEJBblJxS0FJQU5nSUFJQTVCQkdvaURpQVFSdzBBQ3d3RkN5QVRSUTBFUVFBaENTQWFRUU5QQkVBRFFDQUxJQW9vQWdBMkFnQWdDeUFQYWlJTUlBb2dFV29pRFNnQ0FEWUNBQ0FNSUE5cUlnd2dEU0FSYWlJTktBSUFOZ0lBSUF3Z0Qyb2lEQ0FOSUJGcUlnMG9BZ0EyQWdBZ0RTQVJhaUVLSUF3Z0Qyb2hDeUFKUVFScUlna2dHMGNOQUFzTFFRQWhDU0FXUlEwRUEwQWdDeUFLS0FJQU5nSUFJQW9nRVdvaENpQUxJQTlxSVFzZ0NVRUJhaUlKSUJaSERRQUxEQVFMSUJ3Z0RVRUNkR29oQ3lBUVFRUkhCRUFnRTBVTkJDQVFRUUowSVFsQkFDRU9JQnBCQTA4RVFBTkFJQXNnQ2lBSkVCWWdDaUFSYWlJTklCRnFJZ3NnRVdvaUVpQVJhaUVLSUE5cUlBMGdDUkFXSUE5cUlBc2dDUkFXSUE5cUlCSWdDUkFXSUE5cUlRc2dEa0VFYWlJT0lCdEhEUUFMQzBFQUlRNGdGa1VOQkFOQUlBc2dDaUFKRUJZZ0NpQVJhaUVLSUE5cUlRc2dEa0VCYWlJT0lCWkhEUUFMREFRTElCTkZEUU5CQUNFSklCcEJBMDhFUUFOQUlBc2dDdjBBQWdEOUN3SUFJQXNnRDJvaURDQUtJQkZxSWczOUFBSUEvUXNDQUNBTUlBOXFJZ3dnRFNBUmFpSU4vUUFDQVAwTEFnQWdEQ0FQYWlJTUlBMGdFV29pRGYwQUFnRDlDd0lBSUEwZ0VXb2hDaUFNSUE5cUlRc2dDVUVFYWlJSklCdEhEUUFMQzBFQUlRa2dGa1VOQXdOQUlBc2dDdjBBQWdEOUN3SUFJQW9nRVdvaENpQUxJQTlxSVFzZ0NVRUJhaUlKSUJaSERRQUxEQU1MQTBCQkFDRUpJQTBFUUFOQUlBc2dDVUVGZEdvZ0NpQUpRUUowYWlnQ0FEWUNBQ0FMSUFsQkFYSWlERUVGZEdvZ0NpQU1RUUowYWlnQ0FEWUNBQ0FMSUFsQkFuSWlERUVGZEdvZ0NpQU1RUUowYWlnQ0FEWUNBQ0FMSUFsQkEzSWlERUVGZEdvZ0NpQU1RUUowYWlnQ0FEWUNBQ0FKUVFScUlna2dEVWtOQUFzTEFrQWdDU0FRVHcwQUFrQUNRQ0FRSUFsckloUkJCMDBOQUNBTElBbEJCWFJxSUNJZ0VTQVNiR3BKQkVBZ0NpQUpRUUowYWlBVklBOGdFbXhxU1EwQkN5QUovUkg5REFBQUFBQUJBQUFBQWdBQUFBTUFBQUQ5cmdFaE1DQUpJQlJCZkhFaUYyb2hERUVBSVE0RFFDQUxJREJCQmYyckFTSXgvUnNBYWlBS0lBa2dEbXBCQW5ScS9RQUNBQ0l5L1ZvQ0FBQWdDeUF4L1JzQmFpQXkvVm9DQUFFZ0N5QXgvUnNDYWlBeS9Wb0NBQUlnQ3lBeC9Sc0RhaUF5L1ZvQ0FBTWdNUDBNQkFBQUFBUUFBQUFFQUFBQUJBQUFBUDJ1QVNFd0lBNUJCR29pRGlBWFJ3MEFDeUFVSUJkSERRRU1BZ3NnQ1NFTUMwRUFJUTRnRUNBTUlnbHJRUU54SWhRRVFBTkFJQXNnQ1VFRmRHb2dDaUFKUVFKMGFpZ0NBRFlDQUNBSlFRRnFJUWtnRGtFQmFpSU9JQlJIRFFBTEN5QU1JQkJyUVh4TERRQURRQ0FMSUFsQkJYUnFJQW9nQ1VFQ2RHb29BZ0EyQWdBZ0N5QUpRUUZxSWd4QkJYUnFJQW9nREVFQ2RHb29BZ0EyQWdBZ0N5QUpRUUpxSWd4QkJYUnFJQW9nREVFQ2RHb29BZ0EyQWdBZ0N5QUpRUU5xSWd4QkJYUnFJQW9nREVFQ2RHb29BZ0EyQWdBZ0NVRUVhaUlKSUJCSERRQUxDeUFLSUJGcUlRb2dDeUFQYWlFTElCTWdFa0VCYWlJU1J3MEFDd3dDQ3lBU1JRUkFRUUVnQUNnQ0NDQUFLQUlNYkVFQ2RCQVhJaEpGQkVCQkFBOExJQUFvQWhnZ0FDZ0NFQ0FlYkVFQ2RHb2dEV29nRWpZQ0FBc2dFaUFsUVFKMGFpQUpRUUowYWlFTElCZ2dBV3NoQ1FKQUlBWkJBVWNFUUNBY0lBWWdDV3hCQW5ScUlRb2dFRUVCUndSQUFrQWdJdzBBSUJCQkIwME5BQ0FUUlEwRklDWWdDU0FmYkdvZ0VFRUZkR29oSWlBZ0lCQkJBblJxSUF4QkFuUnJJUzhnRUVGOGNTRVVRUUFoREFOQVFRQWhDU0FVQkVBRFFDQUxJQWxCQW5ScUlBb2dDVUVGZEdvb0FnQTJBZ0FnQ3lBSlFRRnlJZzFCQW5ScUlBb2dEVUVGZEdvb0FnQTJBZ0FnQ3lBSlFRSnlJZzFCQW5ScUlBb2dEVUVGZEdvb0FnQTJBZ0FnQ3lBSlFRTnlJZzFCQW5ScUlBb2dEVUVGZEdvb0FnQTJBZ0FnQ1VFRWFpSUpJQlJKRFFBTEN3SkFJQWtnRUU4TkFBSkFBa0FnRUNBSmF5SVhRUWRORFFBZ0N5QUpRUUowYWlBaUlBd2dEMnhxU1FSQUlBb2dDVUVGZEdvZ0VpQXZJQXdnRVd4cWFra05BUXNnQ2YwUi9Rd0FBQUFBQVFBQUFBSUFBQUFEQUFBQS9hNEJJVEFnQ1NBWFFYeHhJaFZxSVExQkFDRU9BMEFnQ3lBSklBNXFRUUowYWlBS0lEQkJCZjJyQVNJeC9Sc0RhaUFLSURIOUd3SnFJQW9nTWYwYkFXb2dDaUF4L1JzQWF2MWNBZ0Q5VmdJQUFmMVdBZ0FDL1ZZQ0FBUDlDd0lBSUREOURBUUFBQUFFQUFBQUJBQUFBQVFBQUFEOXJnRWhNQ0FPUVFScUlnNGdGVWNOQUFzZ0ZTQVhSdzBCREFJTElBa2hEUXRCQUNFT0lCQWdEU0lKYTBFRGNTSVhCRUFEUUNBTElBbEJBblJxSUFvZ0NVRUZkR29vQWdBMkFnQWdDVUVCYWlFSklBNUJBV29pRGlBWFJ3MEFDd3NnRFNBUWEwRjhTdzBBQTBBZ0N5QUpRUUowYWlBS0lBbEJCWFJxS0FJQU5nSUFJQXNnQ1VFQmFpSU5RUUowYWlBS0lBMUJCWFJxS0FJQU5nSUFJQXNnQ1VFQ2FpSU5RUUowYWlBS0lBMUJCWFJxS0FJQU5nSUFJQXNnQ1VFRGFpSU5RUUowYWlBS0lBMUJCWFJxS0FJQU5nSUFJQWxCQkdvaUNTQVFSdzBBQ3dzZ0N5QVJhaUVMSUFvZ0Qyb2hDaUFUSUF4QkFXb2lERWNOQUFzTUJRc2dFMFVOQkNBUVFYeHhJUlFnRUVFRGNTRVNRUUFoRFNBUVFRRnJRUU5KSVJjTUFnc2dFMFVOQTBFQUlRa2dHa0VEVHdSQUEwQWdDeUFLS0FJQU5nSUFJQXNnRVdvaURDQUtJQTlxSWcwb0FnQTJBZ0FnRENBUmFpSU1JQTBnRDJvaURTZ0NBRFlDQUNBTUlCRnFJZ3dnRFNBUGFpSU5L
20QUlBTmdJQUlBd2dFV29oQ3lBTklBOXFJUW9nQ1VFRWFpSUpJQnRIRFFBTEMwRUFJUWtnRmtVTkF3TkFJQXNnQ2lnQ0FEWUNBQ0FMSUJGcUlRc2dDaUFQYWlFS0lBbEJBV29pQ1NBV1J3MEFDd3dEQ3lBY0lBbEJBblJxSVFvZ0VFRUVSd1JBSUJORkRRTWdFRUVDZENFSlFRQWhEaUFhUVFOUEJFQURRQ0FMSUFvZ0NSQVdJQW9nRDJvaURTQVBhaUlMSUE5cUloSWdEMm9oQ2lBUmFpQU5JQWtRRmlBUmFpQUxJQWtRRmlBUmFpQVNJQWtRRmlBUmFpRUxJQTVCQkdvaURpQWJSdzBBQ3d0QkFDRU9JQlpGRFFNRFFDQUxJQW9nQ1JBV0lBb2dEMm9oQ2lBUmFpRUxJQTVCQVdvaURpQVdSdzBBQ3d3REN5QVRSUTBDUVFBaENTQWFRUU5QQkVBRFFDQUxJQXI5QUFJQS9Rc0NBQ0FMSUJGcUlnd2dDaUFQYWlJTi9RQUNBUDBMQWdBZ0RDQVJhaUlNSUEwZ0Qyb2lEZjBBQWdEOUN3SUFJQXdnRVdvaURDQU5JQTlxSWczOUFBSUEvUXNDQUNBTklBOXFJUW9nRENBUmFpRUxJQWxCQkdvaUNTQWJSdzBBQ3d0QkFDRUpJQlpGRFFJRFFDQUxJQXI5QUFJQS9Rc0NBQ0FLSUE5cUlRb2dDeUFSYWlFTElBbEJBV29pQ1NBV1J3MEFDd3dDQ3dOQUFrQWdFRVVOQUVFQUlRNUJBQ0VKUVFBaERDQVhSUVJBQTBBZ0N5QUpRUUowYWlBS0lBWWdDV3hCQW5ScUtBSUFOZ0lBSUFzZ0NVRUJjaUlWUVFKMGFpQUtJQVlnRld4QkFuUnFLQUlBTmdJQUlBc2dDVUVDY2lJVlFRSjBhaUFLSUFZZ0ZXeEJBblJxS0FJQU5nSUFJQXNnQ1VFRGNpSVZRUUowYWlBS0lBWWdGV3hCQW5ScUtBSUFOZ0lBSUFsQkJHb2hDU0FNUVFScUlnd2dGRWNOQUFzTElCSkZEUUFEUUNBTElBbEJBblJxSUFvZ0JpQUpiRUVDZEdvb0FnQTJBZ0FnQ1VFQmFpRUpJQTVCQVdvaURpQVNSdzBBQ3dzZ0N5QVJhaUVMSUFvZ0Qyb2hDaUFUSUExQkFXb2lEVWNOQUFzTUFRc0RRQUpBSUJCRkRRQkJBQ0VPUVFBaENVRUFJUXdnRjBVRVFBTkFJQXNnQmlBSmJFRUNkR29nQ2lBSlFRSjBhaWdDQURZQ0FDQUxJQWxCQVhJaUZTQUdiRUVDZEdvZ0NpQVZRUUowYWlnQ0FEWUNBQ0FMSUFsQkFuSWlGU0FHYkVFQ2RHb2dDaUFWUVFKMGFpZ0NBRFlDQUNBTElBbEJBM0lpRlNBR2JFRUNkR29nQ2lBVlFRSjBhaWdDQURZQ0FDQUpRUVJxSVFrZ0RFRUVhaUlNSUJSSERRQUxDeUFTUlEwQUEwQWdDeUFHSUFsc1FRSjBhaUFLSUFsQkFuUnFLQUlBTmdJQUlBbEJBV29oQ1NBT1FRRnFJZzRnRWtjTkFBc0xJQW9nRVdvaENpQUxJQTlxSVFzZ0RVRUJhaUlOSUJOSERRQUxDeUFoUVFGcUlTRWdFQ0FZYWlJWUlBTkpEUUFMSUI1QkFXb2hIaUFUSUIxcUloMGdCRWtOQUFzTFFRRUxHUUVDZmlBQUtRTUFJZ0lnQVNrREFDSURWU0FDSUFOVGF3dTBOZ1VuZnc5K0FYc0JmUUY4SXdCQjBBQnJJZzhrQUNBUFFaRC9BellDS0NBQUtBS0VBU0FBS0FLQUFXd2hHQUovQWtBQ1FBSkFJQUFvQWdnaUMwRUlSd1JBUVFBZ0MwR0FBa2NOQkJvZ0QwSFovd00yQWlnTUFRc2dBQzBBWEVFQmNRMEFJQmhCZkhFaERTQVBRYzBBYWlFb0lBOUJ6QUJxSVNrZ0QwSElBR29oTUVHUS93TWhDd0pBQWtBRFFBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FDZ0NWQ0lNUlEwQUlBd2dBQ2dDVUNJT1RRMEFJQUFvQWxnZ0RrRURkR29wQXdBaE1pQUFJQTVCQVdvMkFsQWdDU0F5SUFvUU1FVUVRQ0FLUVFGQm15cEJBQkFUUVFBTUR3c2dDU0FBS0FJUVFRSWdDaEFkUVFKSEJFQWdDa0VCUVlNVFFRQVFFMEVBREE4TElBQW9BaEFnRDBFb2FrRUNFQlVnRHlnQ0tFR1Evd05HRFFFZ0NrRUJRY1Fm
20UVFBUUUwRUFEQTRMSUF0QmsvOERSZzBCQ3dOQUlBa3BBd2dpTWxBRWZrSUFCU0F5SUFrcEF6aDlDMUFFUUNBQVFjQUFOZ0lJREFJTElBa2dBQ2dDRUVFQ0lBb1FIVUVDUndSQUlBcEJBVUdERTBFQUVCTkJBQXdPQ3lBQUtBSVFJQTlCSkdwQkFoQVZJQThvQWlSQkFVMEVRQ0FLUVFGQit5NUJBQkFUUVFBTURnc0NRQ0FQS0FJb1FZQ0JBa2NOQUNBSktRTUlJakpRQkg1Q0FBVWdNaUFKS1FNNGZRdENBRklOQUNBQVFjQUFOZ0lJREFJTEFrQWdBQ2dDQ0NJVFFSQnhSUVJBSUE4b0FpUWhDd3dCQ3lBUEtBSWtJUXNnQUNnQ0dDSU9SUTBBSUF0QkFtb2lEQ0FPU3dSQUlBcEJBVUdOd1FCQkFCQVRRUUFNRHdzZ0FDQU9JQXhyTmdJWUN5QVBJQXRCQW1zaUVEWUNKRUdnd2dFaERDQVBLQUlvSVE0RFFDQU1JZ3NvQWdBaUd3UkFJQXRCREdvaERDQU9JQnRIRFFFTEN5QUxLQUlFSUJOeFJRUkFJQXBCQVVId0tVRUFFQk5CQUF3T0N3SkFJQUFvQWhRZ0VFOEVRQ0FBS0FJUUlRd01BUXNnQ1NrRENDSXlVQVIrUWdBRklESWdDU2tET0gwTElCQ3RVd1JBSUFwQkFVR0FMVUVBRUJOQkFBd1BDeUFBS0FJUUlBOG9BaVFRR3lJTVJRUkFJQUFvQWhBUUZDQUFRZ0EzQXhBZ0NrRUJRY2dtUVFBUUUwRUFEQThMSUFBZ0REWUNFQ0FBSUE4b0FpUWlFRFlDRkFzZ0NTQU1JQkFnQ2hBZElnd2dEeWdDSkVjRVFDQUtRUUZCZ3hOQkFCQVRRUUFNRGdzZ0N5Z0NDQ0lMUlFSQUlBcEJBVUdvMndCQkFCQVRRUUFNRGdzZ0FDQUFLQUlRSUF3Z0NpQUxFUUVBUlFSQUlBOGdEeWdDS0RZQ0lDQUtRUUZCNHV3QUlBOUJJR29RRTBFQURBNExJQWtwQXpnaE1pQVBLQUlrSVJJZ0FDZ0M0QUVpRXlnQ0tDSVFJQUFvQXVRQklneEJLR3dpRG1vaUZTZ0NGQ0llUVFGcUlod2dGU2dDSENJTFN3UkFJQlVDZnlBTHMwTUFBTWhDa2lKQ1F3QUFnRTlkSUVKREFBQUFBR0J4QkVBZ1Fxa01BUXRCQUFzaUN6WUNIQ0FWS0FJWUlBdEJHR3dRR3lFTElCTW9BaWdpRUNBT2FpRVZJQXRGRFFNZ0ZTQUxOZ0lZSUJVb0FoUWlIa0VCYWlFY0N5QU9JQkJxSWhNb0FoZ2dIa0VZYkdvaUN5QVNRUVJxTmdJUUlBc2dNcWNnRW10QkJHc2lEcXczQXdnZ0N5QWJPd0VBSUJNZ0hEWUNGQUpBSUJ0QmtQOERSdzBBQWtBZ0V5Z0NFQ0lNUlEwQUlCTW9BZ3dpQ3lBVEtBSUVUdzBBSUF3Z0MwRVliR29nRHEwM0F3QUxJQWtwQXppbklBOG9BaVJyUVFScnJTSXlJQUFwQXpCWERRQWdBQ0F5TndNd0N5QUFMUUJjUVFSeEJFQWdDU0FBTlFJWUlBb2dDU2dDS0JFSUFDQUFOUUlZVWdSQUlBcEJBVUdERTBFQUVCTkJBQXdQQ3lBUFFaUC9BellDS0F3Q0N5QUpJQUFvQWhCQkFpQUtFQjFCQWtjRVFDQUtRUUZCZ3hOQkFCQVRRUUFNRGdzZ0FDZ0NFQ0FQUVNocVFRSVFGU0FQS0FJb1FaUC9BMGNOQUFzTEFrQWdDU2tEQ0NJeVVBUitRZ0FGSURJZ0NTa0RPSDBMVUFSQUlBQW9BZ2hCd0FCR0RRRUxJQUF0QUZ3aUMwRUVjVVVFUUNBQUtBTGtBVUdNTEd3aERDQUFLQUswQVFKQUFrQWdBQ2dDT0FSQUlBa3BBd2dpTWxBRWZrSUFCU0F5SUFrcEF6aDlDNmNoRUF3QkN5QUFLQUlZSWhCQkFra05BUXNnQUNBUVFRSnJJaEEyQWhnTElBeHFJUllnRUVVTkF5QUpLUU1JSWpKUUJINUNBQVVnTWlBSktRTTRmUXNnRUsxVEJFQWdBQ2dDMEFFRVFDQUtRUUZCclMxQkFCQVRRUUFNRHdzZ0NrRUNRYTB0UVFBUUV3c2dBQ2dDR0NJT1FYNVBCRUFnQ2tFQlFhTUxRUUFRRTBFQURBNExBa0FnRmlnQzNDc2lEQVJBSUJZb0F1QXJJZ3RCZlNBT2Ewc0VRQ0FLUVFGQmxnbEJBQkFUUVFBTUVBc2dEQ0FMSUE1cVFRSnFFQnNpQ3dSQUlCWWdDellDM0NzTUJnc2dGaWdDM0NzUUZDQVdRUUEyQXR3ckRBRUxJQllnRGtFQ2FoQVlJZ3MyQXR3cklBc05CQXNnQ2tFQlFmc3ZRUUFRRTBFQURBMExJQUJCQ0RZQ0NDQUFJQXRCK2dGeE9nQmNEQU1MSUE4b0FpZ2hDd3dFQ3lBVktBSVlFQlFnRXlnQ0tDQU1RU2hzYWlJQVFRQTJBaHdnQUVJQU53SVVJQXBCQVVIeUhVRUFFQk5CQUF3S0N5QUFLQUxnQVNJYktBSW9JaFVnQUNnQzVBRWlFMEVvYkNJU2FpSU1LQUlRSUF3b0FneEJHR3hxSWdzZ0NTa0RPQ0l6UWdKOUlqSTNBd2dnQ3lBeklBQTFBaGg4TndNUUlBQW9BaGdoRGdKQUlBd29BaFFpSGtFQmFpSWNJQXdvQWh3aUMwMEVRQ0FNS0FJWUlRd01BUXNnREFKL0lBdXpRd0FBeUVLU0lrSkRBQUNBVDEwZ1FrTUFBQUFBWUhFRVFDQkNxUXdCQzBFQUN5SUxOZ0ljSUF3b0FoZ2dDMEVZYkJBYklRd2dHeWdDS0NJVklCSnFJUXNnREVVTkJTQUxJQXcyQWhnZ0N5Z0NGQ0llUVFGcUlSd0xJQXdnSGtFWWJHb2lDeUFPUVFKcU5nSVFJQXNnTXNRM0F3Z2dDMEdUL3dNN0FRQWdFaUFWYWlBY05nSVVJQUFDZnlBUUJFQkJDQ0FKSUJZb0F0d3JJQllvQXVBcmFpQUFLQUlZSUFvUUhTSVFJQUFvQWhoR0RRRWFRY0FBSUJCQmYwY05BUm9nQ2tFQlFZTVRRUUFRRTBFQURBc0xRUUFoRUVIQUFFRUlJQUFvQWhnYkN6WUNDQ0FXSUJZb0F1QXJJQkJxTmdMZ0t3SkFJQUF0QUZ4QkFYRU5BQ0FBS0FJc0lndEJBRWdOQUNBQUtBTGtBU0lNSUF0SERRQWdBQ2dDVEEwQUlBa29BaHhCQWtZTkFDQUFLQUswQVNBTVFZd3NiR29pQ3lnQzJDc2lEaUFBS0FMZ0FTZ0NLQ0FNUVNoc2FpSU1LQUlFUncwQUlBNGdDeWdDMUN0QkFXb2lDMDBOQUFKQUlBd29BaEFnQzBFWWJHb3BBd0FpTWlBSktRTTRVUTBBSUFrZ01pQUtFREFOQUNBS1FRRkJteXBCQUJBVFFRQU1Dd3NnQ1NBQUtBSVFRUUlnQ2hBZFFRSkhCRUFnQ2tFQlFZTVRRUUFRRTBFQURBc0xJQUFvQWhBZ0QwRW9ha0VDRUJVZ0R5Z0NLRUdRL3dOR0RRSWdDa0VCUWNRZlFRQVFFMEVBREFvTElBQXRBRndpQzBFSmNVRUJSdzBBSUFBZ0MwRUljam9BWENBQUtBSzBBU0FBS0FMa0FTSU9RWXdzYkdvb0F0Z3JRUUZHRFFBZ0NTZ0NIRUVDUmcwQUlBa3BBemdpTWtKL1VRMEFBa0FEUUVFQklRd2dDU0FQUWNZQWFpSUxRUUlnQ2hBZFFRSkhEUUVnQ3lBUFFVQnJRUUlRRlNBUEtBSkFRWkQvQTBjTkFVR0RFeUVRSUFrZ0MwRUNJQW9RSFVFQ1J3MEpJQXNnRDBFOGFrRUNFQlVnRHlnQ1BFRUtSd1JBUWZzdUlSQU1DZ3NnRDBFSU5nSThJQWtnRDBIR0FHcEJDQ0FLRUIwaUN5QVBLQUk4UncwSklBdEJDRWNFUUVHcUh5RVFEQW9MSUE5QnhnQnFJQTlCT0dwQkFoQVZJREFnRDBFMGFrRUVFQlVnS1NBUFFUQnFRUUVRRlNBb0lBOUJMR3BCQVJBVklBNGdEeWdDT0VjRVFDQVBLQUkwSWd0QkRra05BaUFQSUF0QkRHc2lDellDTkNBSklBdXRJQW9nQ1NnQ0tCRUlBQ0FQTlFJMFVRMEJEQUlMQ3lBUEtBSXdJQThvQWl4SElRd0xJQWtnTWlBS0lBa29BaXdSREFCRkRRZ2dEQTBBSUFBZ0FDMEFYRUh1QVhGQkVISTZBRndDUUNBWVJRMEFJQUFvQXJRQklSWkJBQ0VMSUJoQkJFOEVRQU5BSUJZZ0MwR01MR3hxSWg0b0F0Z3JJaHo5RVNBV0lBdEJBWEpCakN4c2FpSWJLQUxZS3lJVi9Sd0JJQllnQzBFQ2NrR01MR3hxSWhJb0F0Z3JJaFA5SEFJZ0ZpQUxRUU55UVl3c2JHb2lEaWdDMkNzaURQMGNBLzBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDA0SWtIOUd3QkJBWEVFUUNBZVFkZ3JhaUFjUVFGcU5nSUFDeUJCL1JzQlFRRnhCRUFnRzBIWUsyb2dGVUVCYWpZQ0FBc2dRZjBiQWtFQmN
20RUkFJQkpCMkN0cUlCTkJBV28yQWdBTElFSDlHd05CQVhFRVFDQU9RZGdyYWlBTVFRRnFOZ0lBQ3lBTFFRUnFJZ3NnRFVjTkFBc2dHQ0FOSWd0R0RRRUxBMEFnRmlBTFFZd3NiR29pRGlnQzJDc2lEQVJBSUE1QjJDdHFJQXhCQVdvMkFnQUxJQXRCQVdvaUN5QVlSdzBBQ3dzZ0NrRUNRYWJHQUVFQUVCTUxJQUF0QUZ4QkFYRU5BQ0FKSUFBb0FoQkJBaUFLRUIxQkFrY0VRQUpBSUFBb0F1UUJRUUZxSUJoSERRQWdHRVVOQUNBQUtBSzBBU0VOUVFBaEN3TkFJQTBnQzBHTUxHeHFJZ2tvQXRRclJRUkFJQWtvQXRnclJRMElDeUFMUVFGcUlnc2dHRWNOQUFzTElBcEJBVUdERTBFQUVCTkJBQXdKQ3lBQUtBSVFJQTlCS0dwQkFoQVZDeUFQS0FJb0lRc2dBQzBBWEVFQmNRMEFJQXRCMmY4RFJ3MEJDd3NnQzBIWi93TkhEUUlnQUNnQ0NFR0FBa1lOQWlBQVFZQUNOZ0lJSUFCQkFEWUM1QUVNQWdzZ0N5Z0NHQkFVSUJzb0FpZ2dFMEVvYkdvaUFFRUFOZ0ljSUFCQ0FEY0NGQ0FLUVFGQjhoMUJBQkFUUVFBTUJBc2dEeUFMTmdJUUlBcEJCRUhYMVFBZ0QwRVFhaEFUSUFBZ0N6WUM1QUVnRDBIWi93TTJBaWdnQUVHQUFqWUNDQXNnQUNnQzVBRWhDeUFBS0FLMEFTRUpBa0FDUUNBQUxRQmNRUUZ4RFFBQ1FBSkFJQXNnR0U4TkFDQUpJQXRCakN4c2FpRVFBMEFnRUNnQzNDc05BU0FBSUF0QkFXb2lDellDNUFFZ0VFR01MR29oRUNBTElCaEhEUUFMREFFTElBc2dHRWNOQVFzZ0NFRUFOZ0lBREFFTEFrQUNRQ0FLUVFFZ0NTQUxRWXdzYkdvaUVpZ0N0Q2dFZjBHUU5RVWdFaTBBaUN4QkFuRkZEUUlDUUNBU0tBS29LQ0lPUlFSQVFRQWhEQXdCQ3lBU0tBS3NLQ0VKUVFBaERFRUFJUXNnRGtFRVR3UkFJQTVCZkhFaEMvME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDRkJRUUFoRUFOQUlBa2dFRUVEZEdvaURVRWNhaUFOUVJScUlBMUJER29nRGYxY0FnVDlWZ0lBQWYxV0FnQUMvVllDQUFNZ1FmMnVBU0ZCSUJCQkJHb2lFQ0FMUncwQUN5QkJJRUVnUWYwTkNBa0tDd3dORGc4QUFRSURBQUVDQS8ydUFTSkJJRUVnUWYwTkJBVUdCd0FCQWdNQUFRSURBQUVDQS8ydUFmMGJBQ0VNSUFzZ0RrWU5BUXNEUUNBSklBdEJBM1JxS0FJRUlBeHFJUXdnQzBFQmFpSUxJQTVIRFFBTEN5QVNJQXdRR0NJSk5nSzBLQ0FKRFFGQmhCOExRUUFRRXlBS1FRRkIxajVCQUJBVFFRQU1CUXNnRWlBTU5nSzhLQ0FTS0FLc0tDRUpJQklvQXFnb0lnd0VRRUVBSVJCQkFDRUxBMEFnQ1NBTFFRTjBJaE5xSWc0b0FnQWlEUVJBSUJJb0FyUW9JQkJxSUEwZ0RpZ0NCQkFXR2lBU0tBS3NLQ0FUYWlJSktBSUVJQWtvQWdBUUZDQVNLQUtzS0NJSklCTnFRZ0EzQWdBZ0VHb2hFQ0FTS0FLb0tDRU1DeUFMUVFGcUlnc2dERWtOQUFzTElCSkJBRFlDcUNnZ0NSQVVJQkpCQURZQ3JDZ2dFaUFTS0FLMEtEWUNzQ2dnRWlBU0tBSzhLRFlDdUNnTEFuOGdBQ2dDNkFFaUN5Z0NIQ0lpS0FKTUlBQW9BdVFCSWdsQmpDeHNhaWdDMENzaEdpQUxLQUlZSWhNb0FoZ2hJeUFMS0FJVUtBSUFJaDBnSWlnQ0JDQWlLQUlNSWdzZ0NTQUpJQ0lvQWhnaUNXNGlEU0FKYkd0c2FpSU9JQk1vQWdBaUNTQUpJQTVKR3lJTU5nSUFJQjFCZnlBTElBNXFJZ2tnQ1NBT1NSc2lDeUFUS0FJSUlna2dDU0FMU3hzaUNUWUNDQUpBSUFrZ0RFb2dERUVBVG5GRkJFQWdDa0VCUWZVelFRQVFFd3dCQ3lBZEtBSVVJUkVnSFNBaUtBSUlJQTBnSWlnQ0VDSUxiR29pRENBVEtBSUVJZ2tnQ1NBTVNSc2lEVFlDQkNBZFFYOGdDeUFNYWlJSklBa2dERWtiSWdzZ0V5Z0NEQ0lKSUFrZ0Mwc2JJZ2syQWd3Z0NTQU5TaUFOUVFCT2NVVUVRQ0FLUVFGQnp6TkJBQkFUREFFTEFrQWdH
20aWdDQkFSQUlCMG9BaEFOQVVFQkRBTUxJQXBCQVVISktVRUFFQk1NQVFzQ1FBSkFBMEFnSTBFQU5nSWtJQkVnSXpRQ0FDSTJRZ0Y5SWpJZ0hUUUNBSHdnTm44K0FnQWdFU0FqTkFJRUlqVkNBWDBpTXlBZE5BSUVmQ0ExZno0Q0JDQVJJRElnSFRRQ0NId2dObjgrQWdnZ0hUUUNEQ0V5SUJFZ01UWUNFQ0FSSURJZ00zd2dOWDgrQWd3Z0VTQWFLQUlFSWdzMkFoUWdFVUVCSUFzZ0lpZ0NVQ0lKYXlBSklBdExHellDR0NBUktBSTBFQlFnRVVFQU5nSkVJQkg5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUQ5Q3dJMElBdEJtQUZzSVEwQ1FDQVJLQUljSWdsRkJFQWdFU0FORUJnaUNUWUNIQ0FKUlEwRklCRWdEVFlDSUNBSlFRQWdEUkFaR2d3QkN5QU5JQkVvQWlCTkRRQWdDU0FORUJzaUMwVUVRQ0FLUVFGQjdSZEJBQkFUSUJFb0Fod1FGQ0FSUWdBM0Fod01CUXNnRVNBTE5nSWNJQXNnRVNnQ0lDSUpha0VBSUEwZ0NXc1FHUm9nRVNBTk5nSWdDeUFSS0FJVUlnc0VRQ0FhUWJBSGFpRXdJQnBCckFacUlSNGdHa0VjYWlFcUlCRW9BaHdoR1VFQUlTUURRQ0FaUW44Z0MwRUJheUlKclNJMGhrSi9oU0l6SUJFMEFnQjhJRFNIcHlJVk5nSUFJQmtnTXlBUk5BSUVmQ0EwaDZjaUVqWUNCQ0FaSURNZ0VUUUNDSHdnTkljaU1xY2lFellDQ0NBWklETWdFVFFDREh3Z05JY2lOYWNpRGpZQ0RDQXl4RUlCSUI0Z0pFRUNkQ0lOYWlnQ0FDSWZyU0l5aG54Q0FYMGdNb2VuSUI5MElneEJBRWdOQkNBMXhFSi9JQTBnTUdvb0FnQWlJSzBpTW9aQ2Y0VjhJREtIcHlBZ2RDSU5RUUJJRFFRZ0dTQU5RWDhnSUhRZ0VuRWlLMnNnSUhWQkFDQU9JQkpIR3lJTk5nSVVJQmtnREVGL0lCOTBJQlZ4SWl4cklCOTFRUUFnRXlBVlJ4c2lERFlDRUFKQUlBeEZEUUFnREswZ0RhMStRaUNJVUEwQURBUUxJQXdnRFd3aUxVSG56Smt6VHcwRElDMUJLR3doSVNBWklDUUVmeUFnUVFGcklTQWdIMEVCYXlFZklDdXNRZ0Y4UWdHSXB5RXJJQ3lzUWdGOFFnR0lweUVzUVFNRlFRRUxOZ0lZSUJsQkhHb2hGQ0FyUVFFZ0lIUnFJUndnTEVFQklCOTBhaUViUWdFZ0M2MGlONFloT0VKL0lCb29BZ3dpQ3lBZ0lBc2dJRWtiSWlXdElqMkdRbitGSVQ1Q2Z5QWFLQUlJSWdzZ0h5QUxJQjlKR3lJbXJTSS9oa0ovaFNGQVFRQWhFQU5BQW40Z0pFVUVRQ0F6SUJFMEFnUjhJRFNISVRrZ015QVJOQUlBZkNBMGh5RTZRUUFoQ3lBeklqSWhPeUEwREFFTElEZ2dFRUVCYWlJTFFRRjJyU0EwaGtKL2hYd2lPeUFSTkFJRWZDQTNoeUU1SURnZ0MwRUJjYTBnTklaQ2Y0VjhJaklnRVRRQ0FId2dONGNoT2lBM0N5RThJQkUwQWdnaE5pQVJOQUlNSVRVZ0ZDQTVQZ0lFSUJRZ09qNENBQ0FVSUFzMkFoQWdGQ0ExSUR0OElEeUhQZ0lNSUJRZ01pQTJmQ0E4aHo0Q0NFRUFJUTBDUUNBYUtBSVVSUTBBSUF0RkRRQkJBa0VCSUF0QkEwWWJJUTBMUkFBQUFBQUFBUEEvSVVNQ1FDQWpLQUlZSUExcUlDb29BZ0FpRFdzaUMwR0FDRTRFUUVRQUFBQUFBQURnZnlGRElBdEIvdzlKQkVBZ0MwSC9CMnNoQ3d3Q0MwUUFBQUFBQUFEd2Z5RkRRZjBYSUFzZ0MwSDlGMDhiUWY0UGF5RUxEQUVMSUF0QmdYaEtEUUJFQUFBQUFBQUFZQU1oUXlBTFFiaHdTd1JBSUF0QnlRZHFJUXNNQVF0RUFBQUFBQUFBQUFBaFEwSHdhQ0FMSUF0QjhHaE5HMEdTRDJvaEN3c2dGQ0FxS0FJRXQwUUFBQUFBQUFCQVA2SkVBQUFBQUFBQThEK2dJRU1nQzBIL0IycXRRalNHdjZLaXRqZ0NJQ0FVSUEwZ0dpZ0NwQVpxUVFGck5nSWNJQlFvQWhRaEN3SkFBa0FDUUNBdFJRMEFJQXNOQUNBVUlDRVFHQ0lMTmdJVUlBdEZCRUFnQ2tFQlFZRVdRUUFRRXd3S0N5QUxRUUFnSVJBWkdpQVVJQ0UyQWhnTUFRc2dJU0FVS0FJWVN3UkFJQXNnSVJBYklnMUZCRUFnQ2tFQlFZRVdRUUFRRXlBVUtBSVVFQlFnRkVJQU53SVVEQW9MSUJRZ0RUWUNGQ0FOSUJRb0FoZ2lDMnBCQUNBaElBdHJFQmthSUJRZ0lUWUNHQXNnTFVVTkFRc2dGQ2dDRkNFTFFRQWhMZ05BSUFzZ0xpQXVJQmtvQWhBaURXNGlFeUFOYkdzZ0gzUWlEaUFzYWlJTUlCUW9BZ0FpRFNBTUlBMUtHeUlWTmdJQUlBc2dFeUFnZENJU0lDdHFJZ3dnRkNnQ0JDSU5JQXdnRFVvYkloTTJBZ1FnQ3lBT0lCdHFJZ3dnRkNnQ0NDSU5JQXdnRFVnYklnNDJBZ2dnQ3lBU0lCeHFJZ3dnRkNnQ0RDSU5JQXdnRFVnYklnMDJBZ3dnQ3lCQUlBNnNmQ0EvaDZjZ0ZTQW1kU0lvYXlBbWRDQW1kU0lNTmdJUUlBc2dQaUFOckh3Z1BZZW5JQk1nSlhVaUtXc2dKWFFnSlhVaURUWUNGQ0FNSUExc0lpK3RRc1FBZmtJZ2lFSUFVZ1JBSUFwQkFVSFNGa0VBRUJNTUNRc2dMMEhFQUd3aERnSkFBa0FDUUNBTEtBSVlJZzBOQUNBdlJRMEFJQXNnRGhBWUlnMDJBaGdnRFVVTkN5QU5RUUFnRGhBWkdnd0JDeUFPSUFzb0FoeE5EUUVnRFNBT0VCc2lERVVFUUNBTEtBSVlFQlFnQzBJQU53SVlJQXBCQVVIUUUwRUFFQk1NQ3dzZ0N5QU1OZ0lZSUF3Z0N5Z0NIQ0lOYWtFQUlBNGdEV3NRR1JvTElBc2dEallDSEFzZ0N5Z0NGQ0VPSUFzb0FoQWhEQ0FMQW44Z0N5Z0NJQ0lOUlFSQUlBd2dEaUFLRUd3TUFRc2dEU0FNSUE0Z0NoQnFDellDSUNBTEtBSVVJUTRnQ3lnQ0VDRU1JQXNDZnlBTEtBSWtJZzFGQkVBZ0RDQU9JQW9RYkF3QkN5QU5JQXdnRGlBS0VHb0xOZ0lrSUM4RVFDQXBRUUZxSVJJZ0tFRUJhaUVUUVFBaEp3TkFJQ2NnQ3lnQ0VDSU9iaUVZQWtBZ0N5Z0NHQ0FuUWNRQWJHb2lGeWdDQUNJVkJFQWdGeWdDT0NFTUlCY29BZ1FoRFNBWEtBSXdJUllnRnlnQ1BCQVVJQmY5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUQ5Q3dJb0lCZEJRR3RCQURZQ0FDQVhRZ0EzQWpnZ0YvME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFQMExBaGdnRi8wTUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAwTEFnZ2dGeUFWTmdJQUlCY2dGallDTUNBV0JFQWdGVUVBSUJaQkdHd1FHUm9MSUJjZ0REWUNPQ0FYSUEwMkFnUU1BUXNnRjBFS1FSZ1FGeUlOTmdJQUlBMUZEUXNnRjBFS05nSXdDeUFYSUNjZ0RpQVliR3NpRGlBb2FpQW1kQ0lNSUFzb0FnQWlEU0FNSUExS0d6WUNDQ0FYSUJnZ0tXb2dKWFFpRENBTEtBSUVJZzBnRENBTlNoczJBZ3dnRnlBT0lCTnFJQ1owSWd3Z0N5Z0NDQ0lOSUF3Z0RVZ2JOZ0lRSUJjZ0VpQVlhaUFsZENJTUlBc29BZ3dpRFNBTUlBMUlHellDRkNBblFRRnFJaWNnTDBjTkFBc0xJQXRCS0dvaEN5QXVRUUZxSWk0Z0xVY05BQXNMSUNwQkNHb2hLaUFVUVNScUlSUWdFRUVCYWlJUUlCa29BaGhKRFFBTElCbEJtQUZxSVJrZ0NTRUxJQ1JCQVdvaUpDQVJLQUlVU1EwQUN3c2dJMEUwYWlFaklCRkJ6QUJxSVJFZ0drRzRDR29oR2lBeFFRRnFJakVnSFNnQ0VFa05BQXRCQVF3REN5QUtRUUZCZ1JkQkFCQVREQUVMSUFwQkFVR2dFa0VBRUJNTFFRQUxSUVJBSUFwQkFVR3ZIRUVBRUJOQkFBd0VDeUFBS0FMa0FTRUpJQThnQUNnQ2dBRWdBQ2dDaEFGc05nSUVJQThnQ1VFQmFqWUNBQ0FLUVFSQmpOd0FJQThRRXlBQklBQW9BdVFCTmdJQUlBaEJBVFlDQUNBQ0JFQWdBaUFBS0FMb0FVRUFFRjBpQVRZQ0FFRUFJQUZCZjBZTkJCb0xJQU1nQUNnQzZBRW9BaFFvQWdBaUFTZ0NBRFlDQUNBRUlBRW9BZ1EyQWdBZ0JTQUJLQUlJTmdJQUlBWWdBU2dDRERZQ0FDQUhJQUVvQWhBMkFnQWdBQ0FBS0FJSVFZQUJjallDQ0F0QkFRd0NDeUFLUVFFZ0VFRUFFQk1MSUFwQkFVSFJIRUVBRUJOQkFBc2dEMEhRQUdva0FBdnVFQUlNZndKK0FrQWdBQ2dDSUNJQ0RRQUNRQ0FBS0FJUUlnbEJCVW9FUUNBSklRSU1BUXNDUUFKQUlBQW9BaFFpQmtFRlRnUkFJQUFvQWdBaUFTZ0NBQ0VDSUFBZ0FVRUVhallDQUNBR1FRUnJJUWNNQVFzZ0JrRUFUQVJBUVg4aEFnd0NDeUFBS0FJQUlRRUNmeUFHUV
20FGR0JFQkJmeUVGUVFBTUFRdEJmeUVGSUFaQkFXc2lCRUVCY1FKQUlBWkJBa1lFUUVFQUlRSWdCaUVFREFFTElBUkJmbkVoQzBFQUlRSWdBU0VESUFZaEJBTkFJQUFnQTBFQmFqWUNBQ0FETFFBQUlRd2dBQ0FEUVFKcUlnRTJBZ0FnQUNBRVFRRnJOZ0lVSUFNdEFBRWhBeUFBSUFSQkFtc2lCRFlDRkNBRlFmOEJJQUowUVg5emNTQU1JQUowY2tHQS9nTWdBblJCZjNOeElBTWdBa0VJY25SeUlRVWdBa0VRYWlFQ0lBRWhBeUFJUVFKcUlnZ2dDMGNOQUFzTEJFQWdBQ0FCUVFGcUlnTTJBZ0FnQVMwQUFDRUJJQUFnQkVFQmF6WUNGQ0FGUWY4QklBSjBRWDl6Y1NBQklBSjBjaUVGSUFNaEFRc2dCa0VEZEVFSWF3c2hBaUFBSUFGQkFXbzJBZ0FnQlVIL0FTQUNkRUYvYzNFZ0FTMEFBRUVQY2lBQ2RISWhBZ3NnQUNBSE5nSVVDeUFBS0FJWUlRRWdBQ0FDUVJoMklnUkIvd0ZHTmdJWUlBQWdDU0FDUVJCMlFmOEJjU0lEUWY4QlJpSUdJQUpCQ0haQi93RnhJZ1ZCL3dGR0lnY2dBU0FDUWY4QmNTSUlRZjhCUmlJS2FtcHFJZ0ZyUVNCcUlnSTJBaEFnQUNBQUtRTUlJQWhCQjBFSUlBb2JkQ0FGY2tFSFFRZ2dCeHQwSUFOeVFRZEJDQ0FHRzNRZ0JIS3RJQUVnQ1d0QklHcXRob1EzQXdnZ0FrRUdUZzBBUVFBaEFnd0JDeUFBS0FJY0lnRkJBblJCNEtFQmFpZ0NBQ0VEQW40Z0FDa0RDQ0lOUWdCVEJFQkJEQ0FCUVFGcUlBRkJDMDRiSVFRZ0FrRUJheUVDUVg4Z0EzUkJmM05CQVhRaEFVSUJEQUVMSUFGQkFXdEJBQ0FCUVFGS0d5RUVJQTFCUHlBRGE2MklwMEYvSUFOMFFYOXpjVUVCZEVFQmNpRUJJQUlnQTBFQmFpSURheUVDSUFPdEN5RU9JQUFnQWpZQ0VDQUFJQVEyQWh3Z0FDQU5JQTZHTndNSUlBQWdBYXdnQUNrREtFSkFnNFEzQXlnZ0FrRUdTQVJBUVFFaEFnd0JDeUFBS0FJY0lnRkJBblJCNEtFQmFpZ0NBQ0VEQW40Z0FDa0RDQ0lOUWdCVEJFQkJEQ0FCUVFGcUlBRkJDMDRiSVFRZ0FrRUJheUVDUVg4Z0EzUkJmM05CQVhRaEFVSUJEQUVMSUFGQkFXdEJBQ0FCUVFGS0d5RUVJQTFCUHlBRGE2MklwMEYvSUFOMFFYOXpjVUVCZEVFQmNpRUJJQUlnQTBFQmFpSURheUVDSUFPdEN5RU9JQUFnQWpZQ0VDQUFJQVEyQWh3Z0FDQU5JQTZHTndNSUlBQWdBQ2tES0VML1FJTWdBYXhDQjRhRU53TW9JQUpCQmtnRVFFRUNJUUlNQVFzZ0FDZ0NIQ0lCUVFKMFFlQ2hBV29vQWdBaEF3SitJQUFwQXdnaURVSUFVd1JBUVF3Z0FVRUJhaUFCUVF0T0d5RUVJQUpCQVdzaEFrRi9JQU4wUVg5elFRRjBJUUZDQVF3QkN5QUJRUUZyUVFBZ0FVRUJTaHNoQkNBTlFUOGdBMnV0aUtkQmZ5QURkRUYvYzNGQkFYUkJBWEloQVNBQ0lBTkJBV29pQTJzaEFpQURyUXNoRGlBQUlBSTJBaEFnQUNBRU5nSWNJQUFnRFNBT2hqY0RDQ0FBSUFBcEF5aEMvLzlBZ3lBQnJFSU9ob1EzQXlnZ0FrRUdTQVJBUVFNaEFnd0JDeUFBS0FJY0lnRkJBblJCNEtFQmFpZ0NBQ0VEQW40Z0FDa0RDQ0lOUWdCVEJFQkJEQ0FCUVFGcUlBRkJDMDRiSVFRZ0FrRUJheUVDUVg4Z0EzUkJmM05CQVhRaEFVSUJEQUVMSUFGQkFXdEJBQ0FCUVFGS0d5RUVJQTFCUHlBRGE2MklwMEYvSUFOMFFYOXpjVUVCZEVFQmNpRUJJQUlnQTBFQmFpSURheUVDSUFPdEN5RU9JQUFnQWpZQ0VDQUFJQVEyQWh3Z0FDQU5JQTZHTndNSUlBQWdBQ2tES0VMLy8vOUFneUFCckVJVmhvUTNBeWdnQWtFR1NBUkFRUVFoQWd3QkN5QUFLQUljSWdGQkFuUkI0S0VCYWlnQ0FDRURBbjRnQUNrRENDSU5RZ0JUQkVCQkRDQUJRUUZxSUFGQkMwNGJJUVFnQWtFQmF5RUNRWDhnQTNSQmYzTkJBWFFoQVVJQkRBRUxJQUZCQVd0QkFDQUJRUUZLR3lFRUlBMUJQeUFEYTYySXAwRi9JQU4wUVg5emNVRUJkRUVCY2lFQklBSWdBMEVCYWlJRGF5RUNJQU90Q3lFT0lBQWdBallDRUNBQUlBUTJBaHdnQUNBTklBNkdOd01JSUFBZ0FDa0RLRUwvLy8vL1FJTWdBYXhDSElhRU53TW9JQUpCQmtnRVFFRUZJUUlNQVFzZ0FDZ0NIQ0lCUVFKMFFlQ2hBV29vQWdBaEJBSi9JQUFwQXdnaURVSUFVd1JBSUFKQkFXc2hBMEYvSUFSMFFYOXpRUUYwSVFWQ0FTRU9RUXdnQVVFQmFpQUJRUXRPR3d3QkN5QU5RVDhnQkd1dGlLZEJmeUFFZEVGL2MzRkJBWFJCQVhJaEJTQUNJQVJCQVdvaUJHc2hBeUFFclNFT0lBRkJBV3RCQUNBQlFRRktHd3NoQVNBQUlBTTJBaEFnQUNBQk5nSWNJQUFnRFNBT2hqY0RDQ0FBSUFBcEF5aEMvLy8vLy85QWd5QUZyVUlqaG9RM0F5aEJCaUVDSUFOQkJrZ05BQ0FBS0FJY0lnRkJBblJCNEtFQmFpZ0NBQ0VFQW44Z0FDa0RDQ0lOUWdCVEJFQWdBMEVCYXlFQ1FYOGdCSFJCZjNOQkFYUWhCVUlCSVE1QkRDQUJRUUZxSUFGQkMwNGJEQUVMSUExQlB5QUVhNjJJcDBGL0lBUjBRWDl6Y1VFQmRFRUJjaUVGSUFNZ0JFRUJhaUlFYXlFQ0lBU3RJUTRnQVVFQmEwRUFJQUZCQVVvYkN5RUJJQUFnQWpZQ0VDQUFJQUUyQWh3Z0FDQU5JQTZHTndNSUlBQWdBQ2tES0VMLy8vLy8vLzlBZ3lBRnJVSXFob1EzQXlnZ0FrRUdTQVJBUVFjaEFnd0JDeUFBS0FJY0lnRkJBblJCNEtFQmFpZ0NBQ0VEQW40Z0FDa0RDQ0lOUWdCVEJFQkJEQ0FCUVFGcUlBRkJDMDRiSVFRZ0FrRUJheUVDUVg4Z0EzUkJmM05CQVhRaEFVSUJEQUVMSUFGQkFXdEJBQ0FCUVFGS0d5RUVJQTFCUHlBRGE2MklwMEYvSUFOMFFYOXpjVUVCZEVFQmNpRUJJQUlnQTBFQmFpSURheUVDSUFPdEN5RU9JQUFnQWpZQ0VDQUFJQVEyQWh3Z0FDQU5JQTZHTndNSUlBQWdBQ2tES0VMLy8vLy8vLy8vUUlNZ0FhMUNNWWFFTndNb1FRZ2hBZ3NnQUNBQ1FRRnJOZ0lnSUFBZ0FDa0RLQ0lPUWdlSU53TW9JQTZuUWY4QWNRc2lBUUYvSUFBRVFDQUFLQUlNSWdFRVFDQUJFQlFnQUVFQU5nSU1DeUFBRUJRTEM0SUJBZ0YrQTM4Q1FDQUFRb0NBZ0lBUVZBUkFJQUFoQWd3QkN3TkFJQUZCQVdzaUFTQUFRZ3FBSWdKQzlnRitJQUI4cDBFd2Nqb0FBQ0FBUXYvLy8vK2ZBVllnQWlFQURRQUxDeUFDUWdCU0JFQWdBcWNoQXdOQUlBRkJBV3NpQVNBRFFRcHVJZ1JCOWdGc0lBTnFRVEJ5T2dBQUlBTkJDVXNnQkNFRERRQUxDeUFCQzA4QkFYOGdBRUVBTmdJd0lBQWdBQ2dDSURZQ0pDQUJJQUFvQWdBZ0FDZ0NIQkVMQUNBQUtBSkVJUUpGQkVBZ0FDQUNRUVJ5TmdKRVFRQVBDeUFBSUFFM0F6Z2dBQ0FDUVh0eE5nSkVRUUVMM3Q0QkJIQi9CbnNJZmdGOUl3QkJFR3NpVENRQUFrQWdBQzBBQ0VHQUFYRkZEUUFnQVNBQUtBTGtBVWNOQUNBQUtBSzBBU0FCUVl3c2JHb2lUU2dDM0NzaUYwVUVRQ0JORURRTUFRc2dBQ2dDNEFFYUlBQW9BdWdCSVJzZ0FDZ0NaQ0lIUlFSQUlBQW9BbUFoQndzZ0J5Z0NBQ0VHSUFjb0FnUWhDeUFIS0FJSUlRa2dCeWdDRENFUElBQW9BandoQnlBQUtBSkFJUTRnVFNnQzRDc2hDQ01BUVJCcklqOGtBQ0FiSUFFMkFpUWdHeWdDSENnQ1RDRU1JQnRCQVRZQ1FDQWJJQTgyQWp3Z0d5QUpOZ0k0SUJzZ0N6WUNOQ0FiSUFZMkFqQWdHeUFNSUFGQmpDeHNhallDSUNBYktBSkVFQlJCQUNFTElCdEJBRFlDUkFKQUlBY0VRRUVFSUJzb0FoZ29BaEFRRnlJTFJRUkFEQUlMSUFkQkJFOEVRQ0FIUVh4eElRbEJBQ0VCQTBBZ0N5QU9JQ0pCQW5ScUlnWW9BZ0JCQW5ScVFRRTJBZ0FnQ3lBR0tBSUVRUUowYWtFQk5nSUFJQXNnQmlnQ0NFRUNkR3BCQVRZQ0FDQUxJQVlvQWd4QkFuUnFRUUUyQWdBZ0lrRUVhaUVpSUFGQkJHb2lBU0FKUncwQUN3c2dCMEVEY1NJQkJFQURRQ0FMSUE0Z0lrRUNkR29vQWdCQkFuUn
20FRUUUyQWdBZ0lrRUJhaUVpSUJsQkFXb2lHU0FCUncwQUN3c2dHeUFMTmdKRUN3SkFBa0FnR3lnQ0dDSUdLQUlRSWc1RkRRQkJBQ0VpQWtBRFFBSkFJQXNFUUNBTElDSkJBblJxS0FJQVJRMEJDeUFHS0FJWUlDSkJOR3hxSWdFMUFnUWlmRUlCZlNLQUFTQWJOUUk4ZkNCOGdDR0JBU0FCTlFJQUluMUNBWDBpZmlBYk5RSTRmQ0I5Z0NHQ0FTQ0FBU0FiTlFJMGZDQjhnQ0Y4SUJzb0FoUW9BZ0FvQWhRZ0lrSE1BR3hxSWdFb0FoUWdBU2dDR0dzaUIwRWZTdzBBQWtBZ2ZpQWJOUUl3ZkNCOWdLY2lDU0FCS0FJQWF5SVBRUUFnQ1NBUFR4c2dCM1lOQUNCOHB5SUpJQUVvQWdScklnOUJBQ0FKSUE5UEd5QUhkZzBBSUFFb0FnZ2lDU0NDQWFkcklnOUJBQ0FKSUE5UEd5QUhkZzBBSUFFb0Fnd2lBU0NCQWFkcklnbEJBQ0FCSUFsUEd5QUhka1VOQVFzZ0cwRUFOZ0pBREFJTElDSkJBV29pSWlBT1J3MEFDeUFiS0FKQVJRMEFRUUFoR1FOQUlCc29BaFFvQWdBb0FoUWdHVUhNQUd4cUlnRW9BaHdnQVNnQ0dFR1lBV3hxSWdkQmxBRnJLQUlBSVFZZ0IwR01BV3NvQWdBaEN5QUhRWmdCYXlnQ0FDRU9JQWRCa0FGcktBSUFJUWtDUUNBYktBSkVJZ2NFUUNBSElCbEJBblJxS0FJQVJRMEJDeUFMSUFacklRY2dDU0FPYXlFT0FrQWdCaUFMUmcwQUlBZXRJQTZ0ZmtJZ2lGQU5BRUVBSVNJZ0JVRUJRWUVYUVFBUUV3d0dDeUFISUE1c0lnZEJnSUNBZ0FSUEJFQkJBQ0VpSUFWQkFVR0JGMEVBRUJNTUJnc2dBU0FIUVFKMElnYzJBaXdDUUFKQUFrQWdBU2dDSkNJR0JFQWdCeUFCS0FJd1RRMEVJQUVvQWlnTkFRc2dBU0FIRUJ3aUJ6WUNKQ0FIUVFFZ0FTZ0NMQ0lIRzBVTkFTQUJRUUUyQWlnZ0FTQUhOZ0l3REFNTElBWVFGQ0FCSUFFb0Fpd1FIQ0lITmdJa0lBY05BU0FCUVFBMkFqQWdBVUlBTndJb0MwRUFJU0lnQlVFQlFZRVhRUUFRRXd3R0N5QUJRUUUyQWlnZ0FTQUJLQUlzTmdJd0N5QVpRUUZxSWhrZ0d5Z0NHQ0lHS0FJUVNRMEFDd3dCQ3lBR0tBSVlJUmtnR3lnQ0ZDZ0NBQ2dDRkNFTlFRQWhBUU5BQWtBZ0N3UkFJQXNnQVVFQ2RHb29BZ0JGRFFFTElBMGdBVUhNQUd4cUlnY2dCeWdDQUNJSklCa2dBVUUwYkdvaUR6VUNBQ0o4UWdGOUlvQUJJQnMxQWpCOElIeUFweUlNSUFrZ0RFc2JJZ2syQWpnZ0J5QUhLQUlFSWd3Z0R6VUNCQ0o5UWdGOUlvRUJJQnMxQWpSOElIMkFweUlQSUF3Z0Qwc2JJZzgyQWp3Z0J5QUhLQUlJSWd3Z2dBRWdHelVDT0h3Z2ZJQ25JZ29nQ2lBTVN4c2lERFlDUUNBSElBY29BZ3dpQ2lDQkFTQWJOUUk4ZkNCOWdLY2lGU0FLSUJWSkd5SUtOZ0pFSUFrZ0RFc05BeUFLSUE5SkRRTWdCeWdDRkNJVlJRMEFJQXF0UWdGOUlZRUJJQXl0UWdGOUlYNGdENjFDQVgwaGdnRWdDYTFDQVgwaGd3RWdGYTBoZnlBSEtBSWNJUWxDQUNGOUEwQWdDU0I5cHlJUFFaZ0JiR29pQjBJQklCVWdEMEYvYzJxdElueUdJb0FCSUlFQmZDQjhpRDRDbEFFZ0J5QitJSUFCZkNCOGlENENrQUVnQnlDQUFTQ0NBWHdnZklnK0Fvd0JJQWNnZ0FFZ2d3RjhJSHlJUGdLSUFTQjlRZ0Y4SW4wZ2YxSU5BQXNMSUFGQkFXb2lBU0FPUncwQUN3dEJBQ0VpSUQ5QkFEWUNDQ0FiS0FJY0lRRkJBVUVJRUJjaUl3UkFJQ01nQVRZQ0JDQWpJQVkyQWdBTElDTkZEUUVnR3lnQ0pDRVVJQnNvQWhRb0FnQWhIeU1BUVpBQmF5SVFKQUFnRkVHTUxHd2lBU0FqS0FJRUlna29Ba3hxSWg0b0FxUURJUzRDZnlBaktBSUFJaWdoRlNBRklUTkJBQ0VPSXdCQklHc2lEU1FBSUFFZ0NTZ0NUR29pR0NnQ3BBTWhIUUpBSUJVb0FoQWlGa0dRQkd3UUdDSVBSUTBBQWtBZ0ZrRUNkQkFZSWd0RkJFQWdEeUVMREFFTEFrQUNRQUovSUFrb0Frd2dGRUdNTEd4cUlnb29BcVFESWhsQkFXb2lBVUh3QVJBWElnY0VRQUpBSUFFRVFDQVZLQUlRSVF3Z0J5RUJBMEFnQVNBek5nTHNBU0FCSUF4QkVCQVhJZ1kyQXNnQklBWkZEUUlnQVNBVktBSVFJaG8yQXNRQlFRQWhCa0VBSVF3Z0dnUkFBMEFnQVNnQ3lBRWdCa0VFZEdvaURDQUtLQUxRS3lBR1FiZ0liR29pR2lnQ0JFRVFFQmNpSmpZQ0RDQW1SUTBFSUF3Z0dpZ0NCRFlDQ0NBR1FRRnFJZ1lnRlNnQ0VDSU1TUTBBQ3dzZ0FVSHdBV29oQVNBVElCbEdJQk5CQVdvaEUwVU5BQXNMSUFjTUFnc2dCeWdDQkNJQkJFQWdBUkFVSUFkQkFEWUNCQXNnQnlFQlFRQWhDZ05BSUFFb0FzZ0JJZ1lFUUVFQUlRd2dBU2dDeEFFaUV3Ui9BMEFnQmlnQ0RDSWFCRUFnR2hBVUlBWkJBRFlDRENBQktBTEVBU0VUQ3lBR1FSQnFJUVlnREVFQmFpSU1JQk5KRFFBTElBRW9Bc2dCQlNBR0N4QVVJQUZCQURZQ3lBRUxJQUZCOEFGcUlRRWdDaUFaUmlBS1FRRnFJUXBGRFFBTElBY1FGQXRCQUFzaUJ3UkFJQlpGRFFKQkFDRUtJQThoQmlBV1FRTk5EUUVnQmlBV1FYeHhJZ3BCa0FSc2FpRUdJQThoQVFOQUlBc2dFVUVDZEdvZ0FmMFIvUXdBQUFBQUVBSUFBQ0FFQUFBd0JnQUEvYTRCL1FzQ0FDQUJRY0FRYWlFQklCRkJCR29pRVNBS1J3MEFDeUFLSUJaSERRRU1BZ3NnRHhBVURBSUxBMEFnQ3lBS1FRSjBhaUFHTmdJQUlBWkJrQVJxSVFZZ0NrRUJhaUlLSUJaSERRQUxDeUFMSVJsQkFDRVRJQWtvQWt3Z0ZFR01MR3hxS0FMUUt5RUJJQlVvQWhnaENpQU5JQWtvQWdRZ0NTZ0NEQ0FVSUJRZ0NTZ0NHQ0lHYmlJTElBWnNhMnhxSWdZZ0ZTZ0NBQ0lNSUFZZ0RFc2JOZ0lVSUExQmZ5QUdJQWtvQWd4cUlnd2dCaUFNU3hzaUJpQVZLQUlJSWd3Z0JpQU1TUnMyQWhBZ0RTQUpLQUlJSUFrb0FoQWdDMnhxSWdZZ0ZTZ0NCQ0lMSUFZZ0Mwc2JOZ0lNSUExQmZ5QUdJQWtvQWhCcUlnc2dCaUFMU3hzaUJpQVZLQUlNSWdzZ0JpQUxTUnMyQWdnZ0RVRUFOZ0lZSUExQkFEWUNIQ0FOUWYvLy8vOEhOZ0lFSUExQi8vLy8vd2MyQWdBZ0ZTZ0NFQVJBQTBBZ0dRUi9JQmtnRTBFQ2RHb29BZ0FGUVFBTElRc2dDalVDQkNKOFFnRjlJb0FCSUEwMUFnaDhJSHlBSVlFQklBbzFBZ0FpZlVJQmZTSitJQTAxQWhCOElIMkFJWUlCSUlBQklBMDFBZ3g4SUh5QUlYd2dmaUFOTlFJVWZDQjlnQ0Y5SUFFb0FnUWlDU0FOS0FJY1N3UkFJQTBnQ1RZQ0hDQUJLQUlFSVFrTElBa0VRQ0FCUWJBSGFpRWFJQUZCckFacUlTWWdnUUZDLy8vLy93K0RRZ0Y5SVlBQklJSUJRdi8vLy84UGcwSUJmU0dCQVNCOFF2Ly8vLzhQZzBJQmZTRitJSDFDLy8vLy93K0RRZ0Y5SVlJQlFRQWhGQU5BSUJvZ0ZFRUNkQ0lNYWlnQ0FDRUdJQXdnSm1vb0FnQWhERUVBSVJFZ0N3UkFJQXNnQmpZQ0JDQUxJQXcyQWdBZ0MwRUlhaUVSQ3dKQUlBd2dDVUVCYXlJSmFpSUxRUjlMRFFBZ0NpZ0NBQ0lrUVg4Z0MzWkxEUUFnRFNBTktBSUVJaXdnSkNBTGRDSUxJQXNnTEVzYk5nSUVDd0pBSUFZZ0NXb2lDMEVmU3cwQUlBb29BZ1FpSkVGL0lBdDJTdzBBSUEwZ0RTZ0NBQ0lzSUNRZ0MzUWlDeUF
20MSUN4TEd6WUNBQXRCQUNFTFFnRWdDYTBpZklZaWZTQ0FBWHdnZklnaWd3RkMvLy8vL3crRFFnRWdCcTBpZjRaOFFnRjlJSCtJcHlCOUlINThJSHlJcHlJa0lBWjJhMEYvSUFaMmNVRUFJQ1FnZ3dHblJ4c2hCaUI5SUlFQmZDQjhpQ0tEQVVMLy8vLy9ENE5DQVNBTXJTSi9obnhDQVgwZ2Y0aW5JSDBnZ2dGOElIeUlweUlrSUF4MmEwRi9JQXgyY1VFQUlDUWdnd0duUnhzaERDQVJCRUFnRVNBR05nSUVJQkVnRERZQ0FDQVJRUWhxSVFzTElBWWdER3dpQmlBTktBSVlTd1JBSUEwZ0JqWUNHQXNnRkVFQmFpSVVJQUVvQWdSSkRRQUxDeUFLUVRScUlRb2dBVUc0Q0dvaEFTQVRRUUZxSWhNZ0ZTZ0NFRWtOQUFzTElCMUJBV29oSmlBTktBSWNJUk1nRFNnQ0dDRVVJQWRCQURZQ0JBSkFJQmdvQWdoQkFXb2lBYTBnRXlBVUlCWnNJaVJzSWhxdGZrSWdpRkFFUUNBSElBRWdHbXdpQVRZQ0NDQUhJQUZCQWhBWElnRTJBZ1FnQVEwQkN5QVBFQlFnR1JBVUlBY29BZ1FpQVFSQUlBRVFGQ0FIUVFBMkFnUUxJQ1pGQkVBZ0J5RUxEQUlMUVFBaEN5QUhJUUVEUUNBQktBTElBU0lLQkVCQkFDRUdJQUVvQXNRQkloRUVmd05BSUFvb0Fnd2lDUVJBSUFrUUZDQUtRUUEyQWd3Z0FTZ0N4QUVoRVFzZ0NrRVFhaUVLSUFaQkFXb2lCaUFSU1EwQUN5QUJLQUxJQVFVZ0Nnc1FGQ0FCUVFBMkFzZ0JDeUFCUWZBQmFpRUJJQXNnSFVZZ0MwRUJhaUVMUlEwQUN5QUhJUXNNQVFzZ0ZTZ0NHQ0VNSUFjZ0RTZ0NGQ0lzTmdMTUFTQUhJQTBvQWd3aUxUWUMwQUVnQnlBTktBSVFJaUEyQXRRQklBY2dEU2dDQ0NJNE5nTFlBU0FISUJvMkFnd2dCeUFrTmdJUUlBY2dGRFlDRkVFQklSVWdCMEVCTmdJWUlCWUVRQ0FIS0FMSUFTRUJRUUFoQ1NBTUlRc0RRQ0FaSUFsQkFuUnFLQUlBSVFvZ0FTQUxLQUlBTmdJQUlBRWdDeWdDQkRZQ0JBSkFJQUVvQWdnaURrVU5BQ0FCS0FJTUlRWWdEa0VCUndSQUlBNUJmbkVoUEVFQUlSRURRQ0FHSUFvb0FnQTJBZ0FnQmlBS0tBSUVOZ0lFSUFZZ0NpZ0NDRFlDQ0NBR0lBb29BZ3cyQWd3Z0JpQUtLQUlRTmdJUUlBWWdDaWdDRkRZQ0ZDQUdJQW9vQWhnMkFoZ2dCaUFLS0FJY05nSWNJQVpCSUdvaEJpQUtRU0JxSVFvZ0VVRUNhaUlSSUR4SERRQUxDeUFPUVFGeFJRMEFJQVlnQ2lnQ0FEWUNBQ0FHSUFvb0FnUTJBZ1FnQmlBS0tBSUlOZ0lJSUFZZ0NpZ0NERFlDREFzZ0MwRTBhaUVMSUFGQkVHb2hBU0FKUVFGcUlna2dGa2NOQUFzTElDWkJBVXNFUUNBSElRNERRQ0FPSURnMkFzZ0RJQTRnSURZQ3hBTWdEaUF0TmdMQUF5QU9JQ3cyQXJ3RElBNUJBVFlDaUFJZ0RpQVVOZ0tFQWlBT0lDUTJBb0FDSUE0Z0dqWUMvQUVnRmdSQUlBNG9BcmdESVFGQkFDRUpJQXdoQ3dOQUlCa2dDVUVDZEdvb0FnQWhDaUFCSUFzb0FnQTJBZ0FnQVNBTEtBSUVOZ0lFQWtBZ0FTZ0NDQ0ltUlEwQUlBRW9BZ3doQmlBbVFRRkhCRUFnSmtGK2NTRThRUUFoRVFOQUlBWWdDaWdDQURZQ0FDQUdJQW9vQWdRMkFnUWdCaUFLS0FJSU5nSUlJQVlnQ2lnQ0REWUNEQ0FHSUFvb0FoQTJBaEFnQmlBS0tBSVVOZ0lVSUFZZ0NpZ0NHRFlDR0NBR0lBb29BaHcyQWh3Z0JrRWdhaUVHSUFwQklHb2hDaUFSUVFKcUloRWdQRWNOQUFzTElDWkJBWEZGRFFBZ0JpQUtLQUlBTmdJQUlBWWdDaWdDQkRZQ0JDQUdJQW9vQWdnMkFnZ2dCaUFLS0FJTU5nSU1DeUFMUVRScUlRc2dBVUVRYWlFQklBbEJBV29pQ1NBV1J3MEFDd3NnRGlBT0tRSUVOd0wwQVNBVklCMUhJQTVCOEFGcUlRNGdGVUVCYWlFVkRRQUxDeUFQRUJRZ0dSQVVJQmdvQXFRRElRc0NRQ0FZTFFDSUxFRUVjUVJBSUF0QmYwWU5BU0FZUWFnRGFpRUdJQmdvQWdnaEFVRUFJUkVnQnlFS0EwQWdCaWdDSkNFT0lBcEJBVFlDTENBS0lBNDJBbFFnQ2lBR0tBSUFOZ0l3SUFZb0FnUWhEaUFLUWdBM0FrUWdDaUFPTmdJMElBb2dCaWdDRERZQ1BDQUtJQVlvQWhBMkFrQWdCaWdDQ0NFT0lBb2dGRFlDVENBS0lBNGdBU0FCSUE1TEd6WUNPQ0FHUVpRQmFpRUdJQXBCOEFGcUlRb2dDeUFSUmlBUlFRRnFJUkZGRFFBTERBRUxJQXRCZjBZTkFDQVlLQUlJSVFZZ0dDZ0NCQ0VPSUFjaENpQUxCRUFnQzBFQmFrRitjU0VKUVFBaEFRTkFJQXBDQURjQ1JDQUtRUUEyQWpRZ0NrSUJOd0lzSUFvZ0RqWUNWQ0FLSUJNMkFqd2dDaUFPTmdMRUFpQUtJQlEyQWt3Z0NpQUdOZ0k0SUFwQ0FEY0N0QUlnQ2tFQU5nS2tBaUFLUWdFM0Fwd0NJQW9nRXpZQ3JBSWdDaUFHTmdLb0FpQUtJQlEyQXJ3Q0lBb2dDaWdDeEFFMkFrQWdDaUFLS0FLMEF6WUNzQUlnQ2tIZ0Eyb2hDaUFCUVFKcUlnRWdDVWNOQUFzTElBdEJBWEVOQUNBS1FnQTNBa1FnQ2tFQU5nSTBJQXBDQVRjQ0xDQUtJQTQyQWxRZ0NpQVROZ0k4SUFvZ0ZEWUNUQ0FLSUFZMkFqZ2dDaUFLS0FMRUFUWUNRQXNnQnlFT0RBRUxJQXNRRkFzZ0RVRWdhaVFBQWtBZ0RrVU5BQ0F1UVFGcUlTWWdGeUVaSUE0aEZRSkFBa0FEUUNBVktBSlVRWDlHRFFJZ0tDZ0NFRUVDZEJBWUlnRkZEUUlnQVVFQklDZ29BaEJCQW5RUUdTRWFJQlVRWUFSQUEwQWdIeWdDRkNFSkFrQUNRQ0FWS0FJb0lCNG9BZ3hQRFFBZ0ZTZ0NJQ0lCSUFrZ0ZTZ0NIRUhNQUd4cUlnY29BaGhQRFFBZ0J5Z0NIQ0FCUVpnQmJHb2lCeWdDR0VVTkFDQUhRUnhxSVFaQkFDRU5Ba0FEUUNBYklCVW9BaHdnRlNnQ0lDQUdJQTFCSkd4cUlnRW9BaEFnQVNnQ0ZDQVZLQUlrUVNoc2FpSUJLQUlBSUFFb0FnUWdBU2dDQ0NBQktBSU1FRUZGQkVBZ0RVRUJhaUlOSUFjb0FoaEpEUUVNQWdzTElCb2dGU2dDSEVFQ2RHcEJBRFlDQUNBUVFRQTJBb2dCSUNNb0FnUWdIeWdDRkNBZUlCVWdFRUdNQVdvZ0dTQVFRWWdCYWlBSUlETVFYMFVOQmlBVktBSWdJUTBnRlNnQ0hDRVBJQkFvQW9nQklSRWdFQ2dDakFFRVFDQVFRUUEyQW9nQklCOG9BaFFnRDBITUFHeHFLQUljSUExQm1BRnNhaUlkS0FJWUlna0VmeUFJSUJGcklRWWdDQ0FaYWlFa0lCMUJIR29oRDBFQUlRcEJBQ0VZSUJFZ0dXb2lMaUVVQTBBQ1FDQVBLQUlJSUE4b0FnQkdEUUFnRHlnQ0RDQVBLQUlFUmcwQUlBOG9BaFFnRlNnQ0pFRW9iR29pQVNnQ0ZDQUJLQUlRYkNJc1JRMEFJQUVvQWhnaENVRUFJUk1EUUNBSktBSWtJZ3NFUUFKL0FrQWdHRVVFUUNBSktBSkFSUTBCQ3lBSlFRQTJBalJCQVNFTlFjQUFEQUVMSUFrb0FnQWhEUUpBSUFrZ0NTZ0NLQ0lCQkg4Z0RTQUJRUmhzYWlJTlFSUnJLQUlBSUExQkRHc29BZ0JIQkVBZ0RVRVlheUVOREFJTElBRkJBV29GUVFFTE5nSW9Dd0ovQWtBZ0RTZ0NGQ0lCSUJSQmYzTkxEUUFnRFVFVWFpRU1BMEFnQVNBVWFpQWtTdzBCSUFrb0FnUWhGaUFKS0FJMEloZ2dDU2dDT0VjRWZ5QUxCU0FXSUJoQkFYUkJBWElpQVVFRGRCQWJJaFpGQkVBZ00wRUJRWUFJUVFBUUV3d1NDeUFKSUFFMkFqZ2dDU0FXTmdJRUlBa29BalFoR0NBTUtBSUFJUUVnQ1NnQ0
20pBc2hCeUFXSUJoQkEzUnFJZ3NnQVRZQ0JDQUxJQlEyQWdBZ0NTQVlRUUZxTmdJMElBMGdEU2dDQUNBQmFqWUNBQ0FOSUEwb0FoQWlEQ0FOS0FJRWFpSVdOZ0lFSUFrZ0J5QU1heUlMTmdJa0lBMGdGallDQ0NBQklCUnFJUlJCQUNBSElBeEdEUUlhSUFrZ0NTZ0NLRUVCYWpZQ0tDQU5RU3hxSVF3Z0RTZ0NMQ0VCSUExQkdHb2hEU0FCSUJSQmYzTk5EUUFMQ3lBVktBSWNJUWNnRlNnQ0lDRUxJQlVvQWlRaERDQWpLQUlFS0FKb0JFQWdFQ0FITmdKNElCQWdDellDZENBUUlBbzJBbkFnRUNBTU5nSnNJQkFnRXpZQ2FDQVFJQVkyQW1RZ0VDQUJOZ0pnSUROQkFVSEE4Z0FnRUVIZ0FHb1FFd3dQQ3lBUUlBYzJBbGdnRUNBTE5nSlVJQkFnQ2pZQ1VDQVFJQXcyQWt3Z0VDQVROZ0pJSUJBZ0JqWUNSQ0FRSUFFMkFrQWdNMEVDUWNEeUFDQVFRVUJyRUJNZ0NVRUFOZ0kwSUFsQkFUWUNRRUVCQ3lFWUlBa29BaWdoRFVFc0N5QUphaUFOTmdJQUN5QUpRY1FBYWlFSklCTkJBV29pRXlBc1J3MEFDeUFkS0FJWUlRa0xJQTlCSkdvaER5QUtRUUZxSWdvZ0NVa05BQXNnRlNnQ0lDRU5JQlVvQWh3aER5QUdJQlFnTG1zZ0dCc0ZRUUFMSUJGcUlSRUxJQ2dvQWhnZ0QwRTBiR29pQVNBTklBRW9BaVFpQVNBQklBMUpHellDSkF3Q0N5QWZLQUlVSVFrTElCQkJBRFlDaUFFZ0l5Z0NCQ0FKSUI0Z0ZTQVFRWXdCYWlBWklCQkJpQUZxSUFnZ014QmZSUTBFSUJVb0Fod2hEeUFRS0FLSUFTRVJJQkFvQW93QlJRMEFJQjhvQWhRZ0QwSE1BR3hxS0FJY0lCVW9BaUFpR0VHWUFXeHFJZ0VvQWhnaUpFVU5BQ0FJSUJGcklRWWdBVUVjYWlFV0lCVW9BaVFoREVFQUlRMUJBQ0VkQWtBQ1FBTkFBa0FnRmlnQ0NDQVdLQUlBUmcwQUlCWW9BZ3dnRmlnQ0JFWU5BQ0FXS0FJVUlBeEJLR3hxSWdFb0FoUWdBU2dDRUd3aUxrVU5BQ0FCS0FJWUlRdEJBQ0VLQTBBZ0N5Z0NKQ0lCQkVBZ0N5Z0NBQ0VKQWtBZ0N5QUxLQUlvSWhNRWZ5QUpJQk5CR0d4cUlnbEJGR3NvQWdBZ0NVRU1heWdDQUVjRVFDQUpRUmhySVFrTUFnc2dFMEVCYWdWQkFRc2lFellDS0FzZ0NTZ0NGQ0lVSUExcUlnMGdGRWtOQlNBR0lBMUpEUVVEUUFKQUlBa2dDU2dDRUNJVUlBa29BZ1JxTmdJRUlBRWdGR3NoQnlBQklCUkdEUUFnQ3lBVFFRRnFJaE0yQWlnZ0NTZ0NMQ0lVSUExcUlnMGdGRWtOQmlBSlFSaHFJUWtnQnlFQklBWWdEVThOQVF3R0N3c2dDeUFITmdJa0N5QUxRY1FBYWlFTElBcEJBV29pQ2lBdVJ3MEFDd3NnRmtFa2FpRVdJQjFCQVdvaUhTQWtSdzBBQ3lBTklCRnFJUkVNQWdzZ0N5QUhOZ0lrQ3lBaktBSUVLQUpvUlFSQUlCQWdEellDR0NBUUlCZzJBaFFnRUNBZE5nSVFJQkFnRERZQ0RDQVFJQW8yQWdnZ0VDQUdOZ0lFSUJBZ0ZEWUNBQ0F6UVFKQjYvRUFJQkFRRXlBVktBSWNJUThnQmlBUmFpRVJEQUVMSUJBZ0R6WUNPQ0FRSUJnMkFqUWdFQ0FkTmdJd0lCQWdERFlDTENBUUlBbzJBaWdnRUNBR05nSWtJQkFnRkRZQ0lDQXpRUUZCNi9FQUlCQkJJR29RRXd3RUN3SkFJQm9nRDBFQ2RHb29BZ0JGRFFBZ0tDZ0NHQ0FQUVRSc2FpSUJLQUlrRFFBZ0FTQWZLQUlVSUE5QnpBQnNhaWdDR0VFQmF6WUNKQXNnQ0NBUmF5RUlJQkVnR1dvaEdTQVZFR0FOQUFzTElCb1FGQ0FWUWZBQmFpRVZJQnhCQVdvaUhDQWVLQUtrQTAwTkFBc2dEaUFtRUVJZ1B5QVpJQmRyTmdJSVFRRU1Bd3NnRGlBbUVFSWdHaEFVREFFTElBNGdKaEJDQzBFQUN5QVFRWkFCYWlRQUlDTVFNa1VOQVNBYktBSWdLQUxRS3lFaUlCc29BaFFvQWdBaUVDZ0NGQ0VPSUQ5QkFUWUNERUVBSVJsQkFDRU1JQnNvQWlBaUFTZ0NEQ0FCS0FJSVJnUkFJQ0lvQWhCQkJIWkJBWEVoREFzQ1FDQVFLQUlRSWdwRkRRQURRQUpBSUJzb0FrUWlBUVJBSUFFZ0dVRUNkR29vQWdCRkRRRUxJRDlCREdvaEZFRUFJUW9DUUNBT0tBSVlJZ0ZGRFFBZ0d5Z0NMQ0VSQTBBZ0RpZ0NIQ0FLUVpnQmJHb2lEeWdDR0NJTEJFQWdEMEVjYWlFVElBOG9BaFFoQVNBUEtBSVFJUlZCQUNFWEEwQWdBU0FWYkFSQUlCTWdGMEVrYkdvaERVRUFJUWtEUUNBYklBNG9BaEFnQ2lBTktBSVFJQTBvQWhRZ0NVRW9iR29pQnlnQ0FDQUhLQUlFSUFjb0FnZ2dCeWdDREJCQklRWWdCeWdDRkNJTElBY29BaEFpQ0d3aEFRSkFJQVlFUUNBQlJRMEJRUUFoQ0FOQUFrQWdHeUFPS0FJUUlBb2dEU2dDRUNBSEtBSVlJQWhCeEFCc2FpSUdLQUlJSUFZb0Fnd2dCaWdDRUNBR0tBSVVFRUZGQkVBZ0JpZ0NQQ0lCUlEwQklBRVFGQ0FHUVFBMkFqd01BUXNnR3lnQ1FFVUVRQ0FHS0FJOERRRWdCaWdDRUNBR0tBSUlSZzBCSUFZb0FoUWdCaWdDREVZTkFRdEJBVUVzRUJjaUFVVUVRQ0EvUVFBMkFnd01DZ3NnR3lnQ1FDRUxJQUZCQURZQ0pDQUJJQlEyQWh3Z0FTQWlOZ0lVSUFFZ0RqWUNFQ0FCSUEwMkFnd2dBU0FHTmdJSUlBRWdDallDQkNBQklBczJBZ0FnQVNBTU5nSW9JQUVnTXpZQ0lDQUJJQkVvQWdSQkFVbzJBaGdnRVVFT0lBRVFNeUEvS0FJTVJRMEpDeUFJUVFGcUlnZ2dCeWdDRkNBSEtBSVFiRWtOQUFzTUFRc2dBVVVOQUVFQUlSVURRQ0FIS0FJWUlCVkJ4QUJzYWlJQktBSThJZ1lFUUNBR0VCUWdBVUVBTmdJOElBY29BaFFoQ3lBSEtBSVFJUWdMSUJWQkFXb2lGU0FJSUF0c1NRMEFDd3NnQ1VFQmFpSUpJQThvQWhRaUFTQVBLQUlRSWhWc1NRMEFDeUFQS0FJWUlRc0xJQmRCQVdvaUZ5QUxTUTBBQ3lBT0tBSVlJUUVMSUFwQkFXb2lDaUFCU1EwQUN3c2dQeWdDREVVTkFpQVFLQUlRSVFvTElDSkJ1QWhxSVNJZ0RrSE1BR29oRGlBWlFRRnFJaGtnQ2trTkFBc0xRUUFoSWlBYktBSXNFQ1FnUHlnQ0RFVU5BUUpBSUJzb0FrQU5BQ0FiS0FJWUloa29BaEJGRFFCQkFDRU9BMEFnR3lnQ0ZDZ0NBQ2dDRkNBT1Fjd0FiR29pQVNnQ0hDQVpLQUlZSUE1Qk5HeHFLQUlrUVpnQmJHb2lCeWdDaUFFaEJpQUhLQUtRQVNFSUlBY29Bb3dCSVFzZ0J5Z0NsQUVoQnlBQktBSTBFQlFnQVVFQU5nSTBBa0FnR3lnQ1JDSUpCRUFnQ1NBT1FRSjBhaWdDQUVVTkFRc2dCaUFJUmcwQUlBY2dDMFlOQUNBSElBdHJJZ2V0SUFnZ0Jtc2lCcTErUWlDSVFnQlNCRUFnTTBFQlFZRVhRUUFRRXd3RkN5QUdJQWRzSWdkQmdJQ0FnQVJQQkVBZ00wRUJRWUVYUVFBUUV3d0ZDeUFCSUFkQkFuUVFIQ0lCTmdJMElBRU5BQ0F6UVFGQmdSZEJBQkFUREFRTElBNUJBV29pRGlBYktBSVlJaGtvQWhCSkRRQUxDeUFiS0FJZ0lSa2dHeWdDRkNnQ0FDSVZL
20QUlRQkVBZ0ZTZ0NGQ0VPSUJrb0F0QXJJUmtnR3lnQ0dDZ0NHQ0VLUVFBaEN3TkFBa0FnR3lnQ1JDSUJCRUFnQVNBTFFRSjBhaWdDQUVVTkFRc2dDaWdDSkVFQmFpRUJJQmtvQWhSQkFVWUVRQ0FCSVI1QkFDRUlRUUFoQnYwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNGMkl3QkJJR3NpSnlRQUFrQUNRQ0FiS0FKQUJFQkJBU0VISUFGQkFVWU5BaUFPS0FJY0lnWWdEaWdDR0VHWUFXeHFJZ0ZCa0FGcktBSUFJZzhnQVVHWUFXc29BZ0FpRVVZTkFpQUdLQUlFSVJRZ0JpZ0NEQ0VXSUFZb0FnQWhHQ0FHS0FJSUlSMGdHeWdDTENJWEtBSUVJUkFnSGtFQmF5SU5JUXdnQmlFSEFrQWdEVUVFVHdSQUlBMUJBM0VoRENBSElBMUJmSEVpQ1VHWUFXeHFJUWRCQUNFQkEwQWdkaUFHSUFGQm1BRnNhaUlJUWVnRWFpQUlRZEFEYWlBSVFiZ0NhaUFJL1Z3Q29BSDlWZ0lBQWYxV0FnQUMvVllDQUFNZ0NFSGdCR29nQ0VISUEyb2dDRUd3QW1vZ0NQMWNBcGdCL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvYkVCL2JrQklBaEI3QVJxSUFoQjFBTnFJQWhCdkFKcUlBajlYQUtrQWYxV0FnQUIvVllDQUFMOVZnSUFBeUFJUWVRRWFpQUlRY3dEYWlBSVFiUUNhaUFJL1Z3Q25BSDlWZ0lBQWYxV0FnQUMvVllDQUFQOXNRSDl1UUVoZGlBQlFRUnFJZ0VnQ1VjTkFBc2dkaUIySUhiOURRZ0pDZ3NNRFE0UEFBRUNBd0FCQWdQOXVRRWlkaUIySUhiOURRUUZCZ2NBQVFJREFBRUNBd0FCQWdQOXVRSDlHd0FoQ0NBSklBMUdEUUVMQTBBZ0NDQUhLQUtnQVNBSEtBS1lBV3NpQVNBQklBaEpHeUlCSUFjb0FxUUJJQWNvQXB3QmF5SUlJQUVnQ0VzYklRZ2dCMEdZQVdvaEJ5QU1RUUZySWd3TkFBc0xRUUFoQnlBSVFmLy8vejlMRFFJZ0p5QUlRUVYwSWhNUU55SU1OZ0lRSUF4RkRRSWdKeUFNTmdJQUlBMEVRQ0FQSUJGcklSRWdGaUFVYXlFSklCMGdHR3NoQVFOQUlBNG9BaVFoRkNBbklBa2lEellDQ0NBbklBRWlCellDR0NBR0tBS2NBU0VJSUFZb0FxUUJJUWtnQmlnQ29BRWhBU0FuSUFZb0FwZ0JJaFpCQW04MkFod2dKeUFCSUJacklnRWdCMnMyQWhRQ1FDQVFRUUpJSWgxRklBa2dDR3NpQ1VFQlMzRkZCRUJCQUNFSUlBbEZEUUVEUUNBblFSQnFJQlFnQ0NBUmJFRUNkR29RWmlBSVFRRnFJZ2dnQ1VjTkFBc01BUXNnQ1NBUUlBa2dFRWtiSWhaQkFXc2hJeUFKSUJadUlSaEJBQ0VIQTBCQkpCQVlJZ2hGRFFVZ0ovMEFBaEFoZGlBSUlCUTJBaGdnQ0NBUk5nSVVJQWdnQVRZQ0VDQUlJSGI5Q3dJQUlBZ2dCeUFZYkRZQ0hDQUhJQ05HSVI4Z0NDQUpJQWRCQVdvaUJ5QVliQ0FmR3pZQ0lDQUlJQk1RTnlJZk5nSUFJQjlGQkVCQkFDRUhJQmNRSkNBSUVCUWdEQkFVREFjTElCZEJDaUFJRURNZ0J5QVdSdzBBQ3lBWEVDUUxJQ2NnQ1NBUGF6WUNCQ0FuSUFZb0Fwd0JRUUp2TmdJTUFrQWdIVVVnQVVFQlMzRkZCRUJCQ0NFSFFRQWhDQ0FCUVFoUEJFQURRQ0FuSUJRZ0NFRUNkR29nRVVFSUVEWWdCeUlJUVFocUlnY2dBVTBOQUFzTElBRWdDRTBOQVNBbklCUWdDRUVDZEdvZ0VTQUJJQWhyRURZTUFRc2dBU0FRSUFFZ0VFa2JJZzlCQVdzaEdDQUJJQTl1SVJaQkFDRUhBMEJCSkJBWUlnaEZEUVVnSi8wQUFnQWhkaUFJSUJRMkFoZ2dDQ0FSTmdJVUlBZ2dDVFlDRUNBSUlIYjlDd0lBSUFnZ0J5QVdiRFlDSENBSElCaEdJUjBnQ0NBQklBZEJBV29pQnlBV2JDQWRHellDSUNBSUlCTVFOeUlkTmdJQUlCMUZCRUJCQUNFSElCY1FKQ0FJRUJRZ0RCQVVEQWNMSUJkQkN5QUlFRE1nQnlBUFJ3MEFDeUFYRUNRTElBWkJtQUZxSVFZZ0RVRUJheUlORFFBTEMwRUJJUWNnREJBVURBSUxRUUVoQnlBT0tBSWNJZ2tnSGtHWUFXeHFJaXRCbUFGcklsMG9BZ0FnSzBHUUFXc29BZ0JHRFFFZ0swR1VBV3NpWGlnQ0FDQXJRWXdCYXlnQ0FFWU5BU0FKS0FJRUlSY2dDU2dDRENFTklBa29BZ0FoRUNBSktBSUlJUkVnRGlnQ1JDRW9JQTRvQWtBaEdpQU9LQUk4SVNZZ0RpZ0NPQ0V1SUE0Z0hoQmxJamxGQkVCQkFDRUhEQUlMQWtBQ1FDQWVRUUZIQkVBQ1FBSkFJQjVCQVdzaUQwRUVTUVJBSUE4aEFTQUpJUWNNQVFzZ0QwRURjU0VCSUFrZ0QwRjhjU0lNUVpnQmJHb2hCd05BSUhZZ0NTQUdRWmdCYkdvaUNFSG9CR29nQ0VIUUEyb2dDRUc0QW1vZ0NQMWNBcUFCL1ZZQ0FBSDlWZ0lBQXYxV0FnQURJQWhCNEFScUlBaEJ5QU5xSUFoQnNBSnFJQWo5WEFLWUFmMVdBZ0FCL1ZZQ0FBTDlWZ0lBQS8yeEFmMjVBU0FJUWV3RWFpQUlRZFFEYWlBSVFid0NhaUFJL1Z3Q3BBSDlWZ0lBQWYxV0FnQUMvVllDQUFNZ0NFSGtCR29nQ0VITUEyb2dDRUcwQW1vZ0NQMWNBcHdCL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvYkVCL2JrQklYWWdCa0VFYWlJR0lBeEhEUUFMSUhZZ2RpQjIvUTBJQ1FvTERBME9Ed0FCQWdNQUFRSUQvYmtCSW5ZZ2RpQjIvUTBFQlFZSEFBRUNBd0FCQWdNQUFRSUQvYmtCL1JzQUlRZ2dEQ0FQUmcwQkN3TkFJQWdnQnlnQ29BRWdCeWdDbUFGcklnWWdCaUFJU1JzaUJpQUhLQUtrQVNBSEtBS2NBV3NpQ0NBR0lBaExHeUVJSUFkQm1BRnFJUWNnQVVFQmF5SUJEUUFMQ3lBSVFZQ0FnSUFCVHcwQ0lBaEJCSFFRTnlJU1JRMENBa0FnSGtVTkFDQU5JQmRySVJZZ0VTQVFheUVUSUJKQkJHc2hPaUFTUVJ4cUlVNGdFa0VZYWlFNElCSkJGR29oUENBU1FReHJJVUVnRWtFTWFpRXBJQkpCQ0dvaE
20pTQVNRUkJySVVJZ0VrRUlheUZBSUJKQkJHb2hJU0FvclNGOElCcXRJWDBnSnEwaGdBRWdMcTBoZ1FGQkFTRkRBMEFnQ1NnQ25BRWlBVUVDYnlFM0lBa29BcGdCSWdkQkFtOGhQaUFKS0FLa0FTQUJheUlrSUJacklTOGdDU2dDb0FFZ0Iyc2lMQ0FUYXlFeElDNGlCaUVISUNZaUhTRVVJQm9pQVNFd0lDZ2lDQ0VSQWtBZ0RpZ0NGQ0lQSUVOR0RRQWdEeUJEYXlFUFFRQWhGRUVBSVFjZ0JnUkFRbjhnRDYwaWZvWkNmNFVnZ1FGOElINklweUVIQ3lBbUJFQkNmeUFQclNKK2hrSi9oU0NBQVh3Z2ZvaW5JUlFMUVFBaENFRUFJUUVnR2dSQVFuOGdENjBpZm9aQ2Y0VWdmWHdnZm9pbklRRUxJQ2dFUUVKL0lBK3RJbjZHUW4rRklIeDhJSDZJcHlFSUMwRUFJVEJCQUNFR1FRRWdEMEVCYTNRaURDQXVTUVJBSUM0Z0RHdXRRbjhnRDYwaWZvWkNmNFY4SUg2SXB5RUdDeUFNSUJwSkJFQWdHaUFNYTYxQ2Z5QVByU0oraGtKL2hYd2dmb2luSVRBTFFRQWhFVUVBSVIwZ0RDQW1TUVJBSUNZZ0RHdXRRbjhnRDYwaWZvWkNmNFY4SUg2SXB5RWRDeUFNSUNoUERRQWdLQ0FNYTYxQ2Z5QVByU0oraGtKL2hYd2dmb2luSVJFTFFYOGdNQ0FKS0FLMEFTSVBheUlNUVFBZ0RDQXdUUnNpREVFQ2FpSVhJQXdnRjBzYklnd2dNU0FNSURGSkd5STFRWDhnQVNBSktBTFlBU0l0YXlJTVFRQWdBU0FNVHhzaUFVRUNhaUlNSUFFZ0RFc2JJZ0VnRXlBQklCTkpHeUkySUQ0YlFRRjBJZ0VnTmlBMUlENGJRUUYwUVFGeUlnd2dBU0FNU3hzaVJpQXNTU0VZSUFZZ0Qyc2lBVUVBSUFFZ0JrMGJJZ0ZCQW1zaUJrRUFJQUVnQms4YkloQWdCeUF0YXlJQlFRQWdBU0FIVFJzaUFVRUNheUlHUVFBZ0FTQUdUeHNpRFNBK0cwRUJkQ0lHSUEwZ0VDQStHMEVCZEVFQmNpSVBTU0VnSUJRZ0NTZ0N1QUVpSTJzaURFRUFJQXdnRkUwYklneEJBbXNpRjBFQUlBd2dGMDhiSWd3aEhDQWRJQWtvQXR3QkloUnJJaGRCQUNBWElCMU5HeUlYUVFKckloMUJBQ0FYSUIxUEd5SVhJU3BCZnlBSUlDTnJJaDFCQUNBSUlCMVBHeUlJUVFKcUloMGdDQ0FkU3hzaUNDQVdJQWdnRmtrYklpTWhNa0YvSUJFZ0ZHc2lDRUVBSUFnZ0VVMGJJZ2hCQW1vaUVTQUlJQkZMR3lJSUlDOGdDQ0F2U1JzaUh5RTdJRGNFUUNBTUlTb2dIeUV5SUNNaE95QVhJUndMSUVZZ0xDQVlHeUZISUFZZ0R5QWdHeUVQSUJZZ0gyb2hUeUFXSUJkcUlWQWdKQVJBSUJJZ0RVRURkR29pUkVFRWFpQTZJREZCQTNRaUJtb2lVU0FOSURGSUlnZ2JJVklnTlNBVFFRRnJJQk1nTlVvYklTQkJBQ0VZSUJOQkFVb2dNVUVBU25JaFV5QWhJRDVCQW5RaUVXc2dFRUVEZEdvaFZDQVJJRVJxSVZVZ0RTQTJJREVnTVNBMlNoc2lFU0FISUMwZ0J5QXRTUnRxUVFJZ0FTQUJRUUpQRzJvZ0IwRi9jMm9pU0VGOGNTSkZhaUUwSUExQkFXb2lGQ0JGYWlFOUlCTWdOV29oVmlBUUlCTnFJVmNnRGYwUi9Rd0FBQUFBQVFBQUFBSUFBQUFEQUFBQS9hNEJJWGtnRWlBUFFRSjBhaUZZSUVBZ0UwRURkQ0lCYWlGSklBRWdPbW9oU2lBR0lFQnFJVXNnRTBVZ01VRUJSbkVoV1NBU0lFZEJBblFpQVdvaFdpQUJJRHBxSVZzZ0ZQMFIvUXdBQUFBQUFRQUFBQUlBQUFBREFBQUEvYTRCSVhvZ09pQU5JREVnQ0J0QkEzUnFJVndEUUFKQUFrQWdHQ0FqU1NBTUlCaE5jUTBBSUJnZ1Qwa2dHQ0JRVDNFTkFDQVlRUUZxSVMwTUFRc2dMQ0JHU3dSQUlGdEJBRFlDQUNCYVFRQTJBZ0FMSURrZ0RTQVlJRFlnR0VFQmFpSXRJRlZCQWtFQUVDSWdPU0JYSUJnZ1ZpQXRJRlJCQWtFQUVDSUNRQUpBQWtBZ1BrVUVRQ0JUUlEwRElBMGdOazROQWdKQUFrQWdEVUVBU2dSQUlGd29BZ0FoQnd3QkN5QWhLQUlBSWdjaEFTQU5RUUJJRFFFTElBY2hBU0JTS0FJQUlRY0xJRVFnUkNnQ0FDQUJJQWRxUVFKcVFRSjFhellDQUNBVUlnY2dFVTROQVVFQUlRY2dGQ0VCSUEwaENDQjZJWFlnZVNGNElFaEJBMHNFUUFOQUlCSWdka0VCL2FzQkluZjlHd0JCQW5ScUlnRWdFaUIzL1JzRFFRSjBhaUlHSUJJZ2QvMGJBa0VDZEdvaUNDQVNJSGY5R3dGQkFuUnFJaDBnQWYxY0FnRDlWZ0lBQWYxV0FnQUMvVllDQUFNZ0VpQjRRUUg5cXdIOURBRUFBQUFCQUFBQUFRQUFBQUVBQUFEOVVDSjcvUnNEUVFKMGFpQVNJSHY5R3dKQkFuUnFJQklnZS8wYkFVRUNkR29nRWlCNy9Sc0FRUUowYXYxY0FnRDlWZ0lBQWYxV0FnQUMvVllDQUFNZ0VpQjMvUXdCQUFBQUFRQUFBQUVBQUFBQkFBQUEvVkFpZC8wYkEwRUNkR29nRWlCMy9Sc0NRUUowYWlBU0lIZjlHd0ZCQW5ScUlCSWdkLzBiQUVFQ2RHcjlYQUlBL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvYTRCL1F3Q0FBQUFBZ0FBQUFJQUFBQUNBQUFBL2E0QlFRTDlyQUg5c1FFaWQvMWFBZ0FBSUIwZ2QvMWFBZ0FCSUFnZ2QvMWFBZ0FDSUFZZ2QvMWFBZ0FESUhqOURBUUFBQUFFQUFBQUJBQUFBQVFBQUFEOXJnRWhlQ0IyL1F3RUFBQUFCQUFBQUFRQUFBQUVBQUFBL2E0QklYWWdCMEVFYWlJSElFVkhEUUFMSUQwaEFTQTBJUWdnRVNFSElFVWdTRVlOQWdzRFFDQVNJQUZCQTNScUlnY2dCeWdDQUNBU0lBaEJBM1JxS0FJRUlBY29BZ1JxUVFKcVFRSjFhellDQUNBQklnaEJBV29pQVNBUlJ3MEFDeUFSSVFjTUFRc0NRQ0JaUlFSQUlBMGlCeUEyVGcwQkEwQWdFaUFIUVFOMGFpSUJLQUlFSVFZZ0FTQUdBbjhDUUNBSFFRQk9CRUFnQVNCTElBY2dNVWdiS0FJQUlUQWdCMEVCYWlFQkRBRUxJQklvQWdBaE1FRUFJUUVnRWlBSFFRRnFJZ2NOQVJvTElBRWdNVTRFUUNBQklRY2dTd3dCQ3lBU0lBRWlCMEVEZEdvTEtBSUFJREJxUVFKcVFRSjFhellDQkNBSElEWklEUUFMREFFTElCSWdFaWdDQUVFQ2JUWUNBQXdEQ3lBUUlnY2dOVTROQWdOQUlCSWdCMEVEZENJQmFpSUdLQUlBSVFnQ2Z5QUhRUUJJQkVBZ0lTZ0NBQ0VkSUNFTUFRc2dFaUFIUVFOMGFrRUVhaUJLSUFjZ0UwZ2JLQUlBSVIwZ0lTQUhSUTBBR2lCS0lBY2dFMG9OQUJvZ0FTQTZhZ3NoQVNBR0lBRW9BZ0FnSFdwQkFYVWdDR28yQWdBZ0IwRUJhaUlISURWSERRQUxEQUlMSUFjZ05rNE5BQU5BSUJJZ0IwRURkR29pQVNBQktBSUFBbjhDUUNBSFFRQktCRUFnT2lBSElERWdCeUF4U0J0QkEzUnFLQUlBSVFnTUFRc2dJU2dDQUNFSUlDRWdCMEVBU0EwQkdnc2dVU0FISURGT0RRQWFJQklnQjBFRGRHcEJCR29MS0FJQUlBaHFRUUpxUVFKMWF6WUNBQ0FIUVFGcUlnY2dOa2NOQUFzTElCQWdOVTROQUNBZ0lCQWlBU0lIU2dSQUEwQWdFaUFIUVFOMGFpSUJJQUVvQWdRZ0VpQUhRUUZxSWdkQkEzUnFLQUlBSUFFb0FnQnFRUUYxYWpZQ0JDQUhJQ0JIRFFBTElDQWhBUXNnQVNBMVRnMEFBMEFDZndKQUlBRWl
20CMEVBVGdSQUlCSWdBVUVEZEdvZ1NTQUJJQk5JR3lnQ0FDRUdJQUZCQVdvaENBd0JDeUFTS0FJQUlRWkJBQ0VJSUJJZ0IwRUJhaUlCRFFFYUN5QUlJQk5PQkVBZ0NDRUJJRWtNQVFzZ0VpQUlJZ0ZCQTNScUN5RUlJQklnQjBFRGRHb2lCeUFIS0FJRUlBZ29BZ0FnQm1wQkFYVnFOZ0lFSUFFZ05VZ05BQXNMSURrZ0R5QVlJRWNnTFNCWVFRRkJBRUVBRUNwRkRRWUxJQzBpR0NBa1J3MEFDd3NnQ1VHWUFXb2hDU0F5UVFGMElnRWdPMEVCZEVFQmNpSUhJQUVnQjBzYklnRWdKQ0FCSUNSSkd5RStJQ2tnREVFRmRDSUJRUkJ5SWdacUlEb2dMMEVGZENJSWFpQU1JQzlJSWdjYklVUWdCaUFsYWlBSUlFQnFJQWNiSVVVZ0JpQWhhaUFJSUVGcUlBY2JJVVlnQmlBU2FpQUlJRUpxSUFjYklVZ2dIeUFXUVFGcklCWWdIMG9iSVEwZ0wwRUFTaUlRSUJaQkFVcHlJVWtnQVNBU2FpSWRJRGRCQkhScUlVb2dLU0FXUVFOMElnWkJDR3NpTWtFQUlCWkJBRXdiUVFKMElnaHFJVXNnQ0NBbGFpRlJJQWdnSVdvaFVpQUlJQkpxSVZNZ0tVRUFJQzlCQTNRaUNFRUlheUk3SUJBYlFRSjBJaEJxSVZRZ0VDQWxhaUZWSUJBZ0lXb2hWaUFRSUJKcUlWY2dFa0VFSURkQkFuUnJRUUowYWlBWFFRVjBhaUZZSUNNZ0x5QWpJQzlJR3lFUUlBeEJBV29oRkNBU0lCeEJBWFFpRVNBcVFRRjBRUUZ5SWhNZ0VTQVRTUnNpV1VFRWRHb2hXaUFCSUNscUlUUWdBU0FsYWlFY0lBRWdJV29oTFNBcElCWkJCWFFpQVdvaFd5QUdRUUZySVQwZ0FTQWxhaUZjSUFaQkFtc2hNU0FCSUNGcUlWOGdCa0VEYXlFMUlBRWdFbW9oWUNBR1FRUnJJVFlnQ0VFRmF5RmhJQWhCQm1zaFlpQUlRUWRySVdNZ0ZrVWdMMEVCUm5FaFpDQXBJREpCQW5RaUFXb2haaUFCSUNWcUlXY2dBU0FoYWlGb0lBRWdFbW9oYVNBcElBaEJCR3NpYWtFQ2RDSUJhaUZySUFFZ0pXb2hiQ0FCSUNGcUlXMGdBU0FTYWlGdUlEb2dEQ0F2SUFjYlFRVjBJZ0ZxSVc4Z0FTQkFhaUVUSUFFZ1FXb2hHQ0FCSUVKcUlYQWdLU0E3UVFKMElnRnFJWEVnQVNBbGFpRnlJQUVnSVdvaGN5QUJJQkpxSVhRRFFBSkFBa0FDZndKQUlBOGlFU0JIU1FSQUlEa2dEeUFNUVFRZ1J5QVBheUlCSUFGQkJFOGJJQTlxSWc4Z0l5QktRUUZCQ0JBaUlEa2dFU0JRSUE4Z1R5QllRUUZCQ0JBaUlEZEZCRUFnU1VVTkJTQU1JQ05PRFFRQ2Z5QU1RUUJLQkVBZ2NDZ0NBQ0VISUJNaEJpQVlJUWdnYnd3QkN5QVNLQUlRSVFjZ0RFRUFTQTBESURnaEJpQThJUWdnVGdzZ0hTQWRLQUlBSUFjZ1NDZ0NBR3BCQW1wQkFuVnJOZ0lBSUMwZ0xTZ0NBQ0FJS0FJQUlFWW9BZ0JxUVFKcVFRSjFhellDQUNBY0lCd29BZ0FnQmlnQ0FDQkZLQUlBYWtFQ2FrRUNkV3MyQWdBZ1JDZ0NBQ0VIS0FJQURBTUxJR1FFUUNBU0lCSW9BZ0JCQW0wMkFnQWdFaUFTS0FJRVFRSnROZ0lFSUNVZ0pTZ0NBRUVDYlRZQ0FDQXBJQ2tvQWdCQkFtMDJBZ0FNQlFzZ0l5QU1JZ2RLQkVBRFFDQUhRUU4wSVFZQ1FBSkFJQWRCQUVnRVFDQUhRWDlHRFFFZ0VpQUdRUUowYWlJQklBSDlBQUlRSUJMOUFBSUFRUUg5cXdIOURBSUFBQUFDQUFBQUFnQUFBQUlBQUFEOXJnRkJBdjJzQWYyeEFmMExBaEFNQWdzZ0VpQUdRUUowYWlJQktBSVFJUWdnTHlBSFFRRnFJaUJNQkVBZ0FTQUlJQklnQmlBN0lBY2dMMGdpQ0J0QkFuUnFLQUlBSUhRb0FnQnFRUUpxUVFKMWF6WUNFQ0FCSUFFb0FoUWdFaUFHUVFGeUlHTWdDQnRCQW5ScUtBSUFJSE1vQWdCcVFRSnFRUUoxYXpZQ0ZDQUJJQUVvQWhnZ0VpQUdRUUp5SUdJZ0NCdEJBblJxS0FJQUlISW9BZ0JxUVFKcVFRSjFhellDR0NBQklBRW9BaHdnRWlBR1FRTnlJR0VnQ0J0QkFuUnFLQUlBSUhFb0FnQnFRUUpxUVFKMWF6WUNIQXdDQ3lBQklBRkJGR29nQ1AwUi9WWUNBQUVnQVVFWWF2MWRBZ0Q5RFFBQkFnTUVCUVlIRUJFU0V4UVZGaGNnQWYwQUFnQWdFaUFnUVFWMGF2MEFBZ0Q5cmdIOURBSUFBQUFDQUFBQUFnQUFBQUlBQUFEOXJnRkJBdjJzQWYyeEFmMExBaEFNQVFzZ1FpQkNLQUlBSUJJb0FnQWdWeWdDQUdwQkFtcEJBblZyTmdJQUlFRWdRU2dDQUNBU0tBSUVJRllvQWdCcVFRSnFRUUoxYXpZQ0FDQkFJRUFvQWdBZ0pTZ0NBQ0JWS0FJQWFrRUNha0VDZFdzMkFnQWdPaUE2S0FJQUlDa29BZ0FnVkNnQ0FHcEJBbXBCQW5Wck5nSUFDeUFIUVFGcUlnY2dJMGNOQUFzTElCOGdGeUlIVEEwRUEwQWdCMEVEZENFR0FrQWdCMEVBU0FSQUlCSWdCa0VDZEdvaUFTQVMvUUFDRUVFQi9hc0JRUUg5ckFFZ0FmMEFBZ0Q5cmdIOUN3SUFEQUVMSUFjRVFDQVNJQVpCQW5RaUNHb2lBU0FCS0FJQUlHQWdBU0FISUJaS0lpQWJRUkJyS0FJQUlCSWdCa0VFY2lBMklBY2dGa2dpS2h0QkFuUnFLQUlBYWtFQmRXbzJBZ0FnQVNBQktBSUVJRjhnQ0NBaGFpQWdHMEVRYXlnQ0FDQVNJQVpCQlhJZ05TQXFHMEVDZEdvb0FnQnFRUUYxYWpZQ0JDQUJJQUVvQWdnZ1hDQUlJQ1ZxSUNBYlFSQnJLQUlBSUJJZ0JrRUdjaUF4SUNvYlFRSjBhaWdDQUdwQkFYVnFOZ0lJSUFFZ0FTZ0NEQ0JiSUFnZ0tXb2dJQnRCRUdzb0FnQWdFaUFHUVFkeUlEMGdLaHRCQW5ScUtBSUFha0VCZFdvMkFnd01BUXNnRWlBU0tBSUFJQklvQWhBZ0VrRUVJRFlnQnlBV1NDSUJHMEVDZEdvb0FnQnFRUUYxYWpZQ0FDQVNJQklvQWdRZ0VpZ0NGQ0FTUVFVZ05TQUJHMEVDZEdvb0FnQnFRUUYxYWpZQ0JDQWxJQ1VvQWdBZ0VpZ0NHQ0FTUVFZZ01TQUJHMEVDZEdvb0FnQnFRUUYxYWpZQ0FDQXBJQ2tvQWdBZ0VpZ0NIQ0FTUVFjZ1BTQUJHMEVDZEdvb0FnQnFRUUYxYWpZQ0FBc2dCMEVCYWlJSElCOUhEUUFMREFRTElDd2hFeUFrSVJZZ1EwRUJhaUpESUI1SERRVU1CZ3NnSFNBZEtBSUFJQWRCQVhSQkFtcEJBblZyTmdJQUlDMGdMU2dDQUNBOEtBSUFRUUYwUVFKcVFRSjFhellDQUNBY0lCd29BZ0FnT0NnQ0FFRUJkRUVDYWtFQ2RXczJBZ0FnVGlnQ0FDSUhDeUVCSURRZ05DZ0NBQ0FCSUFkcVFRSnFRUUoxYXpZQ0FDQU1JUVlnRUNBVUlnRWlCMG9FUUFOQUlCSWdBVUVGZEdvaUJ5QUgvUUFDQUNBU0lBWkJCWFJxL1FBQ0VDQUgvUUFDRVAydUFmME1BZ0FBQUFJQUFBQUNBQUFBQWdBQUFQMnVBVUVDL2F3Qi9iRUIvUXNDQUNBQklnWkJBV29pQVNBUVJ3MEFDeUFRSVFjTElBY2dJMDROQUFOQUlBZEJBM1FpQmtFRWNpRWdJQWNnTDBnaENBSi9JQWRCQUV3RVFDQVNLQUlRSVNvZ0IwRUFUZ1JBSUJJZ0JrRUNkQ0l3YWlJQklBRW9BZ0FnS2lBU0lDQWdhaUFJRzBFQ2RDSUJhaWdDQUdwQkFtcEJBblZyTmdJQUlDRWdNR29pQ0NBSUtBSUFJQklvQWhRZ0FTQWhhaWdDQUdwQkFtcEJBblZyTmdJQUlDVWdNR29pQ0NBSUtBSUFJQklvQWhnZ0FTQWxhaWdDQUdwQkFtcEJBblZyTmdJQUlCSW9BaHdnQVNBcGFpZ0NBR3BCQW1vTUFnc2dFaUFHUVFKMElnRnFJZ2dnQ0NnQ0FDQXFRUUYwUVFKcVFRSjFhellDQUNBQklDRnFJZ2dnQ0NnQ0FDQVNLQUlVUVFGMFFRSnFRUUoxYXpZQ0FDQUJJQ1ZxSWdFZ0FTZ0NBQ0FTS0FJWVFRRjBRUUpxUVFKMWF6WUNBQ0FTS0FJY1FRRjBRUUpxREFFTElCSWdCeUF2SUFnYlFRTjBRUVJyUVFKMElnRnFLQUlBSVNvZ0NFVUVRQ0FTSUFaQkFuUWlDR29pSUNBZ0tBSUFJQ29nYmlnQ0FHcEJBbXBCQW5Wck5nSUFJQWdnSVdvaUlDQWdLQUlBSUFFZ0lXb29BZ0FnYlNnQ0FHcEJBbXBCQW5Wck5nSUFJQWdnSldvaUNDQUlLQUlBSUFFZ0pXb29BZ0FnYkNnQ0FHcEJBbXBCQW5Wck5nSUFJQUVnS1dvb0FnQWdheWdDQUdwQkFtb01BUXNnRWlBR1FRSjBJakJxSWdnZ0NDZ0NBQ0FxSUJJZ0lFRUNkQ0lJYWlnQ0FHcEJBbXBCQW5Wck5nSUFJQ0VnTUdvaUlDQWdLQUlBSUFFZ0lXb29BZ0FnQ0NBaGFpZ0NBR3BCQW1wQkFuVnJOZ0lBSUNVZ01Hb2lJQ0FnS0FJQUlBRWdKV29vQWdBZ0NDQWxhaWdDQUdwQkFtcEJBblZyTmdJQUlBRWdLV29vQWdBZ0NDQXBhaWdDQUdwQkFtb0xJUUVnS1NBR1FRSjBhaUlHSUFZb0FnQWdBVUVDZFdzMkFnQWdCMEVCYWlJSElDTkhEUUFMQ3lBWElCOU9EUUFnRFNBWElnRWlCMG9FUUFOQUlCSWdBVUVGZEdvaUJ5QUgvUUFDSUNBSC9RQUNBUDJ1QVVFQi9hd0JJQWY5QUFJUS9hNEIvUXNDRUNBQlFRRnFJZ0VnRFVjTkFBc2dEU0VIQ3lBSElCOU9EUUFEUUNBcElBZEJBM1FpQVVFRWNpSUdRUUowYWlJcUFuOGdCMEVBU0FSQUlCSW9BZ0FoQVNBSFFYOUhCRUFnRWlBR1FRSjBJZ1pxSWdnZ0NDZ0NBQ0FCYWpZQ0FDQUdJQ0ZxSWdFZ0FTZ0NBQ0FoS0FJQWFqWUNBQ0FHSUNWcUlnRWdBU2dDQUNBbEtBSUFhallDQUNBcEtBSUFEQUlMSUJJZ0JrRUNkQ0lHYWlJSUlBZ29BZ0FnVXlnQ0FDQUJha0VCZFdvMkFnQWdCaUFoYWlJQklBRW9BZ0FnVWlnQ0FDQWhLQUlBYWtFQmRXbzJBZ0FnQmlBbGFpSUJJQUVvQWdBZ1VTZ0NBQ0FsS0FJQWFrRUJkV28yQWdBZ1N5Z0NBQ0FwS0FJQWFrRUJkUXdCQ3lBU0lBRWdNaUFISUJaSUcwRUNkR29pQVNnQ0FDRUlJQllnQjBFQmFpSXdUQVJBSUJJZ0JrRUNkQ0lHYWlJZ0lDQW9BZ0FnYVNnQ0FDQUlha0VCZFdvMkFnQWdCaUFoYWlJSUlBZ29BZ0FnYUNnQ0FDQUJLQUlFYWtFQmRXbzJBZ0FnQmlBbGFpSUdJQVlvQWdBZ1p5Z0NBQ0FCS0FJSWFrRUJkV28yQWdBZ1ppZ0NBQ0FCS0FJTWFrRUJkUXdCQ3lBU0lBW
20kJBblFpSUdvaUJpQUdLQUlBSUFnZ0VpQXdRUVYwYWlJR0tBSUFha0VCZFdvMkFnQWdJQ0FoYWlJSUlBZ29BZ0FnQmlnQ0JDQUJLQUlFYWtFQmRXbzJBZ0FnSUNBbGFpSUlJQWdvQWdBZ0JpZ0NDQ0FCS0FJSWFrRUJkV28yQWdBZ0JpZ0NEQ0FCS0FJTWFrRUJkUXNnS2lnQ0FHbzJBZ0FnQjBFQmFpSUhJQjlIRFFBTEN5QTVJQkVnV1NBUElENGdXa0VCUVFSQkFCQXFEUUFMQ3d3Q0N5QVNFQlJCQVNFSEN5QTVJQ3RCRUdzb0FnQWlBU0JkS0FJQUlnWnJJQ3RCREdzb0FnQWdYaWdDQUNJSWF5QXJRUWhyS0FJQUlna2dCbXNnSzBFRWF5Z0NBQ0FJYXlBT0tBSTBRUUVnQ1NBQmF4QWlJRGtRSnd3REN5QTVFQ2NnRWhBVVFRQWhCd3dDQ3lBNUVDZEJBQ0VIREFFTFFRQWhCeUFYRUNRZ0RCQVVDeUFuUVNCcUpBQWdCdzBCREFVTElBRWhCMEVBSVF6OURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBaGRpTUFRVUJxSWg0a0FBSkFBbjhDUUNBYktBSkFCRUFnRGlnQ0hDSVhJQTRvQWhoQm1BRnNhaUlCUVpnQmF5Z0NBQ0VZSUFGQmtBRnJLQUlBSVIwZ0Z5Z0NCQ0VOSUJjb0Fnd2dGeWdDQUNFUklCY29BZ2doRkVFQklRWWdHeWdDTENJaktBSUVJU1lnQjBFQlJnMERRUUFoQ0NBSFFRRnJJZzhoQ1NBWElRRUNRQ0FQUVFSUEJFQWdEMEVEY1NFSklBRWdEMEY4Y1NJTVFaZ0JiR29oQVVFQUlRWURRQ0IySUJjZ0JrR1lBV3hxSWdkQjZBUnFJQWRCMEFOcUlBZEJ1QUpxSUFmOVhBS2dBZjFXQWdBQi9WWUNBQUw5VmdJQUF5QUhRZUFFYWlBSFFjZ0RhaUFIUWJBQ2FpQUgvVndDbUFIOVZnSUFBZjFXQWdBQy9WWUNBQVA5c1FIOXVRRWdCMEhzQkdvZ0IwSFVBMm9nQjBHOEFtb2dCLzFjQXFRQi9WWUNBQUg5VmdJQUF2MVdBZ0FESUFkQjVBUnFJQWRCekFOcUlBZEJ0QUpxSUFmOVhBS2NBZjFXQWdBQi9WWUNBQUw5VmdJQUEvMnhBZjI1QVNGMklBWkJCR29pQmlBTVJ3MEFDeUIySUhZZ2R2ME5DQWtLQ3d3TkRnOEFBUUlEQUFFQ0EvMjVBU0oySUhZZ2R2ME5CQVVHQndBQkFnTUFBUUlEQUFFQ0EvMjVBZjBiQUNFSUlBd2dEMFlOQVFzRFFDQUlJQUVvQXFBQklBRW9BcGdCYXlJSElBY2dDRWtiSWdjZ0FTZ0NwQUVnQVNnQ25BRnJJZ1lnQmlBSFNSc2hDQ0FCUVpnQmFpRUJJQWxCQVdzaUNRMEFDd3RCQUNFR0lBaEIvLy8vUDBzTkF5QWVJQWhCQlhRaVJ4QWNJZ0UyQWlBZ0FVVU5BeUFlSUFFMkFnQWdEMFVFUUVFQklRWWdBUkFVREFRTElBMXJJUTBnRkNBUmF5RU1RUUlnSmtFQmRpSUJJQUZCQWswYklVUWdEaWdDSkNJSElCMUJIR3dpWFNBWVFSeHNJbDVyYWlFa0lBY2dIVUVZYkNKUklCaEJHR3dpVW10cUlTNGdCeUFkUVJSc0lsTWdHRUVVYkNKVWEyb2hMQ0FISUIxQkJIUWlWU0FZUVFSMElsWnJhaUV0SUFjZ0hVRU1iQ0pYSUJoQkRHd2lXR3RxSVNBZ0J5QWRRUU4wSWxrZ0dFRURkQ0phYTJvaE9DQWRJQmhySWhGQkJYUWhSU0FSUVFkc0lVNGdFVUVHYkNGR0lCRkJCV3doVHlBUlFRTnNJVkFnRVVFQmRDRklJQWNnRVVFQ2RDSkFhaUU4SUJIOUVTRjZBMEFnSGlBTk5nSUlJQjRnRENJQk5nSW9JQmNvQXB3QklSOGdGeWdDcEFFaEtDQVhLQUtnQVNFcUlCY29BcGdCSVJvZ0hrRUFOZ0k0SUI0Z0FUWUNOQ0FlUVFBMkFqQWdIaUFhUVFKdklodzJBaXdnSGlBcUlCcHJJZ3dnQVdzaUZEWUNQQ0FlSUJRMkFpUUNRQ0FtUVFKSUlsdEZJQ2dnSDJzaURVRVBTM0ZGQkVCQkFDRUdJQWNoQ0NBTlFRaEpEUUVnTENBSElGRWdLa0VDZENJQmFpQlNJQnBCQW5RaUNXcHJhaUkrU1NBdUlBY2dBU0JUYWlBSklGUnFhMm9pUVVseElDUWdRVWtnTENBSElBRWdYV29nQ1NCZWFtdHFJa0pKY1hJaFhDQThJQWNnQVNCWmFpQUpJRnBxYTJvaVNVa2dPQ0FISUIwZ0ttb2dHQ0FhYW10QkFuUnFJa3BKY1NBZ0lFcEpJRHdnQnlBQklGZHFJQWtnV0dwcmFpSkxTWEZ5SVY4Z0xTQkJTU0FzSUFjZ0FTQlZhaUFKSUZacWEyb2lRMGx4SUMwZ1Bra2dMaUJEU1hGeUlDMGdRa2tnSkNCRFNYRnlJV0FnTGlCQ1NTQWtJRDVKY1NGaElEZ2dTMGtnSUNCSlNYRWhZaUFISUFFZ0NXdHFJVElnREVGOGNTRUpJQjRvQWlBaUZFRU1haUU3SUJSQkNHb2hOQ0FVUVFScUlUMGdGRUVjYWlFU0lCUkJHR29oSVNBVVFSUnFJU1VnRkVFUWFpRXBJQlFnREVFRmRHb2lGa0VRYXlFbklCWkJGR3NoTHlBV1FSaHJJVEVnRmtFY2F5RTVJQlpCQkdzaE9pQVdRUWhySVRVZ0ZrRU1heUUyUVFBaEhDQU1RYXdCU1NGaklBeEJMRWtoWkFOQUlBWWhFQ0FlUVNCcUlnRWdDQ0FSUVFnUVF5QUJFQ1lDUUNBTVJRMEFJQndnUld3aEJrRUFJUUVDUUFKQUlHTU5BQ0JpSUFnZ09Va2dGQ0FHSURKcUlqZEpjU0FnSURKSklBZ2dCaUJMYWlJVFNYRWdDQ0FHSUVwcUlpdEpJRElnUEV0eElBZ2dCaUJKYWlJd1NTQXlJRGhMY1hKeWNpQUlJREZKSURjZ1BVdHhjaUFJSUM5SklEUWdOMGx4Y2lBSUlDZEpJRGNnTzB0eGNpQmZjaUFVSUN0SklBWWdQR29pTnlBNVNYRnlJQ3NnUFVzZ01TQTNTM0Z5SUNzZ05Fc2dMeUEzUzNGeUlDc2dPMHNnSnlBM1MzRnljZzBBSUJRZ01Fa2dCaUE0YWlJcklEbEpjUTBBSUNzZ01Va2dNQ0E5UzNFTkFDQXJJQzlKSURBZ05FdHhEUUFnTUNBN1N5QW5JQ3RMY1EwQUlBWWdJR29pS3lBNVNTQVRJQlJMY1EwQUlDc2dNVWtnRXlBOVMzRU5BQ0FySUM5SklCTWdORXR4RFFBZ0V5QTdTeUFuSUN0TGNRMEFBMEFnQ0NBQlFRSjBhaUFVSUFGQkJYUnFJaE5CNEFCcUlCTkJRR3NnRTBFZ2FpQVQvVndDQVAxV0FnQUIvVllDQUFMOVZnSUFBLzBMQWdBZ0NDQUJJQkZxUVFKMGFpQVRRZVFBYWlBVFFjUUFhaUFUUVNScUlCUDlYQUlFL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvUXNDQUNBSUlBRWdTR3BCQW5ScUlCTkI2QUJxSUJOQnlBQnFJQk5CS0dvZ0UvMWNBZ2o5VmdJQUFmMVdBZ0FDL1ZZQ0FBUDlDd0lBSUFnZ0FTQlFha0VDZEdvZ0UwSHNBR29nRTBITUFHb2dFMEVzYWlBVC9Wd0NEUDFXQWdBQi9WWUNBQUw5VmdJQUEvMExBZ0FnQVVFRWFpSUJJQWxIRFFBTElBa2lBU0FNUmcwQkN3TkFJQWdnQVVFQ2RHb2dGQ0FCUVFWMGFpSVRLZ0lBT0FJQUlBZ2dBU0FSYWtFQ2RHb2dFeW9DQkRnQ0FDQUlJQUVnU0dwQkFuUnFJQk1xQWdnNEFnQWdDQ0FCSUZCcVFRSjBhaUFUS2dJTU9BSUFJQUZCQVdvaUFTQU1SdzBBQ3d0QkFDRUJBa0FnWkEwQUlHRWdCaUFzYWlJVElEWkpJQ2tnQmlCQmFpSXJTWEVnWUNBR0lDMXFJakFnTmtrZ0tTQUdJRU5xSWpkSmNYSWdKU0EzU1NBd0lEVkpjWElnSVNBM1NTQXdJRHBKY1hJZ0VpQTNTU0FXSURCTGNYSWdYSEp5SUNVZ0swa2dFeUExU1hGeUlDRWdLMGtnRXlBNlNYRnlJQklnSzBrZ0V5QVdTWEZ5Y2cwQUlBWWdMbW9pRXlBMlNTQXBJQVlnUG1vaUswbHhEUUFnSlNBclNTQVRJRFZKY1EwQUlDRWdLMGtnRXlBNlNYRU5BQ0FTSUN0SklCTWdGa2x4RFFBZ0JpQWthaUlUSURaSklDa2dCaUJDYWlJR1NYRU5BQ0FUSURWSklBWWdKVXR4RFFBZ0V5QTZTU0FHSUNGTGNRMEFJQk1nRmtrZ0JpQVNTM0VOQUFOQUlBZ2dBU0JBYWtFQ2RHb2dGQ0FCUVFWMGFpSUdRZkFBYWlBR1FkQUFhaUFHUVRCcUlBYjlYQUlRL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvUXNDQUNBSUlBRWdUMnBCQW5ScUlBWkI5QUJxSUFaQjFBQnFJQVpCTkdvZ0J2MWNBaFQ5VmdJQUFmMVdBZ0FDL1ZZQ0FBUDlDd0lBSUFnZ0FTQkdha0VDZEdvZ0JrSDRBR29nQmtIWUFHb2dCa0U0YWlBRy9Wd0NHUDFXQWdBQi9WWUNBQUw5VmdJQUEvMExBZ0FnQ0NBQklFNXFRUUowYWlBR1Fmd0FhaUFHUWR3QWFpQUdRVHhxSUFiOVhBSWMvVllDQUFIOVZnSUFBdjFXQWdBRC9Rc0NBQ0FCUVFScUlnRWdDVWNOQUFzZ0NTSUJJQXhHRFFFTEEwQWdDQ0FCSUVCcVFRSjBhaUFVSUFGQkJYUnFJZ1lxQWhBNEFnQWdDQ0FCSUU5cVFRSjBhaUFHS2dJVU9BSUFJQWdnQVNCR2FrRUNkR29nQmlvQ0dEZ0NBQ0FJSUFFZ1RtcEJBblJxSUFZcUFodzRBZ0FnQVVFQmFpSUJJQXhIRFFBTEN5QWNRUUZxSVJ3Z0VFRUlhaUVHSUFnZ1JXb2hDQ0FRUVE5cUlBMUpEUUFMREFFTElBMGdEVUVEZGlJR0lDWWdCaUFtU1JzaUUyNUJlSEVoRmlBTlFYaHhJUVpCQUNFSklBY2hDQU5BUVRBUUdDSVFSUTBFSUJBZ1J4QWNJakkyQWdBZ01rVUVRQ0FqRUNRZ0VCQVVRUUFNQmdzZ0VDQUlOZ0lvSUJBZ0VUWUNKQ0FRSUF3MkFpQWdFQ0FVTmdJY0lCQkJBRFlDR0NBUUlBRTJBaFFnRUVFQU5nSVFJQkFnSERZQ0RDQVFJQUUyQWdnZ0VDQVVOZ0lFSUJBZ0JpQUpJQlpzYXlBV0lBbEJBV29pQ1NBVFJoc2lNallDTENBalFRd2dFQkF6SUFnZ0VTQXliRUVDZEdvaENDQUpJQk5IRFFBTElDTVFKQXNDUUNBR0lBMVBEUUFnSGtFZ2FpSUJJQWdnRVNBTklBWnJJaFFRUXlBQkVDWWdERVVOQUNBZUtBSWdJaFlnS2tFRmRDQW9RUUowYWlBR0lCOXFRUUowSUJwQkJYUnFhMnBCSUdzaEdpQVVRWHh4SVJBZ1FDQW9JQVpCZjNOcUlCOXJiQ0VxUV
20FBaENRTkFJQllnQ1VFRmRHb2hIRUVBSVFFQ1FBSkFJQlJCQkVrTkFDQWFJQWdnQ1VFQ2RDSUJhaUlHSUFnZ0FTQXFhbW9pRXlBR0lCTkpHMHNFUUVFQUlRRWdGaUFHSUJNZ0JpQVRTeHRCQkdwSkRRRUxJQW45RVNGMy9Rd0FBQUFBQVFBQUFBSUFBQUFEQUFBQUlYWkJBQ0VCQTBBZ0NDQjJJSHI5dFFFZ2QvMnVBU0o0L1JzQVFRSjBhaUFjSUFGQkFuUnEvUUFDQUNKNS9SOEFPQUlBSUFnZ2VQMGJBVUVDZEdvZ2VmMGZBVGdDQUNBSUlIajlHd0pCQW5ScUlIbjlId0k0QWdBZ0NDQjQvUnNEUVFKMGFpQjUvUjhET0FJQUlIYjlEQVFBQUFBRUFBQUFCQUFBQUFRQUFBRDlyZ0VoZGlBQlFRUnFJZ0VnRUVjTkFBc2dFQ0lCSUJSR0RRRUxBMEFnQ0NBQklCRnNJQWxxUVFKMGFpQWNJQUZCQW5ScUtnSUFPQUlBSUFGQkFXb2lBU0FVUncwQUN3c2dDVUVCYWlJSklBeEhEUUFMQ3lBZUlBMGdIaWdDQ0NJUWF5SVROZ0lFSUJjb0Fwd0JJUUVnSGlBVE5nSWNJQjc5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnQVVFQ2J5SXEvUndBSUJEOUhBSWlkdjBMQWd3Q1FDQmJSU0FNUVE5TGNVVUVRQ0FISVFFZ0RFRUlTUTBCSUExQmZuRWhPeUFOUVFGeElUUWdFMEYrY1NFOUlCTkJBWEVoRWlBUVFYNXhJU0VnRUVFQmNTRWxJQ2dnSDBGL2Myb2hNaUFlS0FJQUloUWdLa0VGZENJR2FpRVdJQlFnQm10QklHb2hIQ0FRSUJGc1FRSjBJU2tnRENFSkEwQkJBQ0VJUVFBaEJnSkFBa0FDUUNBUURnSUNBUUFMQTBBZ0ZpQUlRUVowYWlJYUlBRWdDQ0FSYkVFQ2RHb2lKLzBBQWdEOUN3SUFJQm9nSi8wQUFoRDlDd0lRSUJZZ0NFRUJjaUlhUVFaMGFpSW5JQUVnRVNBYWJFRUNkR29pR3YwQUFoRDlDd0lRSUNjZ0d2MEFBZ0Q5Q3dJQUlBaEJBbW9oQ0NBR1FRSnFJZ1lnSVVjTkFBc0xJQ1ZGRFFBZ0ZpQUlRUVowYWlJR0lBRWdDQ0FSYkVFQ2RHb2lDUDBBQWdEOUN3SUFJQVlnQ1AwQUFoRDlDd0lRQ3dKQUlBMGdFRVlOQUNBQklDbHFJUnBCQUNFSVFRQWhCaU
20FRSURKSEJFQURRQ0FjSUFoQkJuUnFJaWNnR2lBSUlCRnNRUUowYWlJdi9RQUNBUDBMQWdBZ0p5QXYvUUFDRVAwTEFoQWdIQ0FJUVFGeUlpZEJCblJxSWk4Z0dpQVJJQ2RzUVFKMGFpSW4vUUFDRVAwTEFoQWdMeUFuL1FBQ0FQMExBZ0FnQ0VFQ2FpRUlJQVpCQW1vaUJpQTlSdzBBQ3dzZ0VrVU5BQ0FjSUFoQkJuUnFJZ1lnR2lBSUlCRnNRUUowYWlJSS9RQUNBUDBMQWdBZ0JpQUkvUUFDRVAwTEFoQUxJQjRRSmdKQUlBMUZEUUJCQUNFSVFRQWhCaUF5QkVBRFFDQUJJQWdnRVd4QkFuUnFJaG9nRkNBSVFRVjBhaUluL1FBQ0FQMExBZ0FnR2lBbi9RQUNFUDBMQWhBZ0FTQUlRUUZ5SWhvZ0VXeEJBblJxSWljZ0ZDQWFRUVYwYWlJYS9RQUNFUDBMQWhBZ0p5QWEvUUFDQVAwTEFnQWdDRUVDYWlFSUlBWkJBbW9pQmlBN1J3MEFDd3NnTkVVTkFDQUJJQWdnRVd4QkFuUnFJZ1lnRkNBSVFRVjBhaUlJL1FBQ0FQMExBZ0FnQmlBSS9RQUNFUDBMQWhBTElBRkJJR29oQVNBSlFRaHJJZ2xCQjBzTkFBc01BUXRCQVNBTVFRTjJJZ0VnUkNBQklFUkpHeUlKSUFsQkFVMGJJUllnRENBSmJrRjRjU0VVSUF4QmVIRWhIRUVBSVFZZ0J5RUJBMEJCTUJBWUlnaEZEUVFnQ0NCSEVCd2lHallDQUNBYVJRUkFJQ01RSkNBSUVCUkJBQXdHQ3lBSUlBRTJBaWdnQ0NBUk5nSWtJQWdnRFRZQ0lDQUlJQk0yQWh3Z0NDQjIvUXNDRENBSUlCQTJBZ2dnQ0NBVE5nSUVJQWdnSENBR0lCUnNheUFVSUFaQkFXb2lCaUFKUmhzaUdqWUNMQ0FqUVEwZ0NCQXpJQUVnR2tFQ2RHb2hBU0FHSUJaSERRQUxJQ01RSkFzQ1FDQU1RUWR4SWdaRkRRQWdLa0VGZENFYUlCNG9BZ0FoQ1FKQUlCQkZEUUFnQ1NBYWFpRVVJQVpCQW5RaEZrRUFJUWdnRUVFQlJ3UkFJQkJCZm5FaEtrRUFJUndEUUNBVUlBaEJCblJxSUFFZ0NDQVJiRUVDZEdvZ0ZoQVdHaUFVSUFoQkFYSWlNa0VHZEdvZ0FTQVJJREpzUVFKMGFpQVdFQllhSUFoQkFtb2hDQ0FjUVFKcUlod2dLa2NOQUFzTElCQkJBWEZGRFFBZ0ZDQUlRUVowYWlBQklBZ2dFV3hCQW5ScUlCWVFGaG9MQWtBZ0RTQVFSZzBBSUFrZ0dtdEJJR29oRmlBQklCQWdFV3hCQW5ScUlSd2dCa0VDZENFYVFRQWhDQ0FRSUNnZ0gwRi9jMnBIQkVBZ0UwRitjU0VRUVFBaEZBTkFJQllnQ0VFR2RHb2dIQ0FJSUJGc1FRSjBhaUFhRUJZYUlCWWdDRUVCY2lJcVFRWjBhaUFjSUJFZ0tteEJBblJxSUJvUUZob2dDRUVDYWlFSUlCUkJBbW9pRkNBUVJ3MEFDd3NnRTBFQmNVVU5BQ0FXSUFoQkJuUnFJQndnQ0NBUmJFRUNkR29nR2hBV0dnc2dIaEFtSUExRkRRQWdCa0VDZENFUVFRQWhDQ0FmUVFGcUlDaEhCRUFnRFVGK2NTRVVRUUFoQmdOQUlBRWdDQ0FSYkVFQ2RHb2dDU0FJUVFWMGFpQVFFQllhSUFFZ0NFRUJjaUlUSUJGc1FRSjBhaUFKSUJOQkJYUnFJQkFRRmhvZ0NFRUNhaUVJSUFaQkFtb2lCaUFVUncwQUN3c2dEVUVCY1VVTkFDQUJJQWdnRVd4QkFuUnFJQWtnQ0VFRmRHb2dFQkFXR2dzZ0YwR1lBV29oRnlBUFFRRnJJZzhOQUF0QkFRd0NDMEVCSVFZZ0RpZ0NIQ0lYSUFkQm1BRnNhaUlhUVpnQmF5SThLQUlBSUJwQmtBRnJLQUlBUmcwQ0lCcEJsQUZySWlvb0FnQWdHa0dNQVdzb0FnQkdEUUlnRnlnQ0JDRU5JQmNvQWd3aEVDQVhLQUlBSVJFZ0Z5Z0NDQ0VZSUE0b0FrUWhGQ0FPS0FKQUlSTWdEaWdDUENFV0lBNG9BamdoSFNBT0lBY1FaU0lvUlFSQVFRQWhCZ3dEQ3lBSFFRRkdCRUFnS0NBYVFSQnJLQUlBSWdFZ1BDZ0NBQ0lIYXlBYVFReHJLQUlBSUNvb0FnQWlDR3NnR2tFSWF5Z0NBQ0lKSUFkcklCcEJCR3NvQWdBZ0NHc2dEaWdDTkVFQklBa2dBV3NRSWlBb0VDY01Bd3RCQUNFSUFrQUNRQ0FIUVFGcklnbEJCRWtFUUNBSklRWWdGeUVCREFFTElBbEJBM0VoQmlBWElBbEJmSEVpRDBHWUFXeHFJUUVEUUNCMklCY2dERUdZQVd4cUlnaEI2QVJxSUFoQjBBTnFJQWhCdUFKcUlBajlYQUtnQWYxV0FnQUIvVllDQUFMOVZnSUFBeUFJUWVBRWFpQUlRY2dEYWlBSVFiQUNhaUFJL1Z3Q21BSDlWZ0lBQWYxV0FnQUMvVllDQUFQOXNRSDl1UUVnQ0VIc0JHb2dDRUhVQTJvZ0NFRzhBbW9nQ1AxY0FxUUIvVllDQUFIOVZnSUFBdjFXQWdBRElBaEI1QVJxSUFoQnpBTnFJQWhCdEFKcUlBajlYQUtjQWYxV0FnQUIvVllDQUFMOVZnSUFBLzJ4QWYyNUFTRjJJQXhCQkdvaURDQVBSdzBBQ3lCMklIWWdkdjBOQ0FrS0N3d05EZzhBQVFJREFBRUNBLzI1QVNKMklIWWdkdjBOQkFVR0J3QUJBZ01BQVFJREFBRUNBLzI1QWYwYkFDRUlJQWtnRDBZTkFRc0RRQ0FJSUFFb0FxQUJJQUVvQXBnQmF5SUpJQWdnQ1VzYklnZ2dBU2dDcEFFZ0FTZ0NuQUZySWdrZ0NDQUpTeHNoQ0NBQlFaZ0JhaUVCSUFaQkFXc2lCZzBBQ3dzQ1FDQUlRWUNBZ01BQVR3MEFJQjRnQ0VFRmRCQWNJaVkyQWlBZ0prVU5BQ0FlSUNZMkFnQUNRQ0FIQkVBZ0VDQU5heUVOSUJnZ0VXc2hDQ0FtUVNCcUlUSWdCNjBoZlNBVXJTR0FBU0FUclNHQkFTQVdyU0YrSUIydElZSUJJQTRvQWhRaVBhMGhnd0ZDQVNGOEEwQWdIaUFOTmdJSUlCNGdDRFlDS0NBWEtBS2tBU0VISUJjb0FxQUJJUVlnRnlnQ25BRWhBU0FlSUJjb0FwZ0JJZ2xCQW04aUpEWUNMQ0FlSUFGQkFtOGlPellDRENBZUlBWWdDV3NpSXlBSWF5SXVOZ0lrSUI0Z0J5QUJheUlRSUExcklqUTJBZ1FnSFNJUElRa2dGaUlCSVF3Z0V5SUdJUndnRkNJSElSRUNRQ0I4SUlNQlVRMEFJRDBnZktkcklSaEJBQ0VNUVFBaENTQVBCRUJDZnlBWXJTSi9oa0ovaFNDQ0FYd2dmNGluSVFrTElCWUVRRUovSUJpdEluK0dRbitGSUg1OElIK0lweUVNQzBFQUlRZEJBQ0VHSUJNRVFFSi9JQml0SW4rR1FuK0ZJSUVCZkNCL2lLY2hCZ3NnRkFSQVFuOGdHSzBpZjRaQ2Y0VWdnQUY4SUgrSXB5RUhDMEVBSVJ4QkFDRVBRUUVnR0VFQmEzUWlIeUFkU1FSQUlCMGdIMnV0UW44Z0dLMGlmNFpDZjRWOElIK0lweUVQQ3lBVElCOUxCRUFnRXlBZmE2MUNmeUFZclNKL2hrSi9oWHdnZjRpbklSd0xRUUFoRVVFQUlRRWdGaUFmU3dSQUlCWWdIMnV0UW44Z0dLMGlmNFpDZjRWOElIK0lweUVCQ3lBVUlCOU5EUUFnRkNBZmE2MUNmeUFZclNKL2hrSi9oWHdnZjRpbklSRUxRWDhnSENBWEtBSzBBU0lZYXlJZlFRQWdIQ0FmVHhzaUgwRUVhaUljSUJ3Z0gwa2JJaDhnTGlBZklDNUpHeUlnUVg4Z0JpQVhLQUxZQVNJZmF5SWNRUUFnQmlBY1R4c2lCa0VFYWlJY0lBWWdIRXNiSWdZZ0NDQUdJQWhKR3lJNElDUWJRUUYwSWdZZ09DQWdJQ1FiUVFGMFFRRnlJaHdnQmlBY1N4c2lIQ0FqU1NFdUlBOGdHR3NpQmtFQUlBWWdEMDBiSWdaQkJHc2lEMEVBSUFZZ0QwOGJJaXdnQ1NBZmF5SUdRUUFnQmlBSlRSc2lCa0VFYXlJSlFRQWdCaUFKVHhzaUxTQWtHMEVCZENJU0lDMGdMQ0FrRzBFQmRFRUJjaUloU1NFbElBd2dGeWdDdUFFaUNXc2lCa0VBSUFZZ0RFMGJJZ1pCQkdzaUQwRUFJQVlnRDA4YklnWWhEeUFCSUJjb0F0d0JJZ3hySWhoQkFDQUJJQmhQR3lJQlFRUnJJaGhCQUNBQklCaFBHeUlCSVI5QmZ5QUhJQWxySWdsQkFDQUhJQWxQR3lJSFFRUnFJZ2tnQnlBSlN4c2lCeUFOSUFjZ0RVa2JJZ2toQjBGL0lCRWdER3NpREVFQUlBd2dFVTBiSWd4QkJHb2lFU0FNSUJGTEd5SU1JRFFnRENBMFNSc2lHQ0VSSURzRVFDQUJJUThnQmlFZklBa2hFU0FZSVFjTElCd2dJeUF1R3lFdUlCSWdJU0FsR3lFY0lCNGdJRFlDUENBZUlDdzJBamdnSGlBNE5nSTBJQjRnTFRZQ01BSkFJQkJCQ0VrRVFFRUhJUWhCQUNFTURBRUxJRElnSkVFRmRDSU1heUFzUVFaMGFpRTBJQXdnSm1vZ0xVRUdkR29oRWlBSUlDQnFJU0FnQ0NBc2FpRXNJQTBnR0dvaElTQUJJQTFxSVNVZ0
20ppQWNRUVYwYWlFcFFRQWhEQU5BQWtBQ1FDQUpJQXhMSUF4QkIzSWlDQ0FHVDNFTkFDQU1JQ0ZKSUFnZ0pVOXhEUUFnREVFSWFpRU1EQUVMUVFnZ0VDQU1heUlJSUFoQkNFOGJJU2RCQUNFSUEwQWdLQ0F0SUFnZ0RHb2lKQ0E0SUNSQkFXb2lMeUFTSUFoQkFuUWlNV3BCRUVFQUVDSWdLQ0FzSUNRZ0lDQXZJREVnTkdwQkVFRUFFQ0lnQ0VFQmFpSUlJQ2RIRFFBTElCNUJJR29RSmlBb0lCd2dEQ0F1SUF4QkNHb2lEQ0FwUVFoQkFVRUFFQ3BGRFFVTElBeEJCM0lpQ0NBUVNRMEFDd3NDUUNBTUlCQlBEUUFnQmlBSVRTQUpJQXhMY1VVRVFDQU1JQTBnR0dwUERRRWdDQ0FCSUExcVNRMEJDeUFlUVNCcUlRaEJBQ0VrSUJBZ0RHc2lMUVJBQTBBZ0tDQUlLQUlRSWlBZ0RDQWthaUlzSUFnb0FoUWdMRUVCYWlJNElDUkJBblFpTkNBSUtBSUFJQWdvQWd4QkJYUnFJQ0JCQm5ScWFrRVFRUUFRSWlBb0lBZ29BaGdpSUNBSUtBSUlJaEpxSUN3Z0NDZ0NIQ0FTYWlBNElBZ29BZ0FnQ0NnQ0RFRUZkR3NnSUVFR2RHb2dOR3BCSUdwQkVFRUFFQ0lnSkVFQmFpSWtJQzFIRFFBTEN5QUlFQ1lnS0NBY0lBd2dMaUFRSUNZZ0hFRUZkR3BCQ0VFQlFRQVFLa1VOQXdzZ0hpQVlOZ0ljSUI0Z0FUWUNHQ0FlSUFrMkFoUWdIaUFHTmdJUUlCd2dMa2tFUUNBSFFRRjBJZ2NnRVVFQmRFRUJjaUlJSUFjZ0NFc2JJZ2NnRUNBSElCQkpHeUVISURJZ08wRUZkQ0lJYXlBQlFRWjBhaUVNSUFnZ0ptb2dCa0VHZEdvaENDQU5JQmhxSVJFZ0FTQU5haUVOSUNZZ0QwRUJkQ0lCSUI5QkFYUkJBWElpRHlBQklBOUpHeUlQUVFWMGFpRVlBMEFnS0NBY0lBWkJDQ0F1SUJ4cklnRWdBVUVJVHhzZ0hHb2lBU0FKSUFoQkFVRVFFQ0lnS0NBY0lBMGdBU0FSSUF4QkFVRVFFQ0lnSGhBbUlDZ2dIQ0FQSUFFZ0J5QVlRUUZCQ0VFQUVDcEZEUVFnSEVFSWFpSWNJQzVKRFFBTEN5QVhRWmdCYWlFWElDTWhDQ0FRSVEwZ2ZFSUJmQ0o4SUgxU0RRQUxDMEVCSVFZZ0tDQWFRUkJyS0FJQUlnRWdQQ2dDQUNJSGF5QWFRUXhyS0FJQUlDb29BZ0FpQ0dzZ0drRUlheWdDQUNJSklBZHJJQnBCQkdzb0FnQWdDR3NnRGlnQ05FRUJJQWtnQVdzUUlpQW9FQ2NnSmhBVURBUUxJQ2dRSnlBbUVCUkJBQ0VHREFNTElDZ1FKMEVBSVFZTUFnc2dJeEFrUVFBTElRWWdIaWdDSUJBVUN5QWVRVUJySkFBZ0JnMEFEQVFMSUJsQnVBaHFJUmtnQ2tFMGFpRUtJQTVCekFCcUlRNGdDMEVCYWlJTElCVW9BaEJKRFFBTElCc29BaUFoR1NBYktBSVVLQUlBSVJVTEFrQWdHU2dDRUNJT1JRMEFJQnNvQWtRTkFDQVZLQUlVSWdvb0Fod2hBUUpBQWtBQ1FBSkFBa0FnR3lnQ1FDSUdCRUFnRlNnQ0VDSUxRUU5KRFFJQ1FDQUtLQUlZSWdjZ0NpZ0NaRVlFUUNBSElBb29BckFCUmcwQkN5QXpRUUZCeE00QVFRQVFFd3dKQ3dKQUlCc29BaGdvQWhnaUNDZ0NKQ0lKSUFnb0FsaEhEUUFnQ1NBSUtBS01BVWNOQUNBQklBZEJtQUZzSWdocUlnRkJqQUZyS0FJQUlBRkJsQUZyS0FJQWF5QUJRWkFCYXlnQ0FDQUJRWmdCYXlnQ0FHdHNJZ0VnQ2lnQ2FDQUlhaUlIUVl3QmF5Z0NBQ0FIUVpRQmF5Z0NBR3
20NnQjBHUUFXc29BZ0FnQjBHWUFXc29BZ0JyYkVjTkFDQUtLQUswQVNBSWFpSUhRWXdCYXlnQ0FDQUhRWlFCYXlnQ0FHc2dCMEdRQVdzb0FnQWdCMEdZQVdzb0FnQnJiQ0FCUmcwQ0N5QXpRUUZCeE00QVFRQVFFd3dJQ3lBVktBSVFJZ3RCQTBrTkFRSkFJQnNvQWhnb0FoZ2lCeWdDSkNJSUlBY29BbGhIRFFBZ0NDQUhLQUtNQVNJSlJ3MEFJQUVnQ0VHWUFXd2lCMm9pQVNnQ2xBRWdBU2dDakFGcklBRW9BcEFCSUFFb0FvZ0JhMndpQVNBSElBb29BbWhxSWdjb0FwUUJJQWNvQW93QmF5QUhLQUtRQVNBSEtBS0lBV3RzUncwQUlBb29BclFCSUFsQm1BRnNhaUlIS0FLVUFTQUhLQUtNQVdzZ0J5Z0NrQUVnQnlnQ2lBRnJiQ0FCUmcwQkN5QXpRUUZCeE00QVFRQVFFd3dIQ3lBT1FRSkdCRUFnR1NnQzZDdEZEUVVnQzBFQ2RCQVlJZ3RGRFFjZ0ZTZ0NFQ0lKUlEwRUlCc29Ba0FFUUVFQUlSVWdDVUVMVFEwRElBcEJKR29pQ0NBTElBbEJBblJxU1FSL0lBb2dDVUhNQUd4cVFTUnJJQXRMQlVFQUN3MERJQXBCaUFKcUlROGdDa0c4QVdvaERDQUtRZkFBYWlFWElBb2dDVUY4Y1NJR1Fjd0FiR29oQ2tFQUlRNERRQ0FMSUE1QkFuUnFJQThnRGtITUFHd2lCMm9nQnlBTWFpQUhJQmRxSUFjZ0NHcjlYQUlBL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvUXNDQUNBT1FRUnFJZzRnQmtjTkFBc2dCaUFKUncwRURBVUxRUUFoRlFKQUlBbEJERWtFUUVFQUlRWU1BUXNnQ2tFMGFpRUlBa0FnQ3lBS0lBbEJ6QUJzYWtFVWEwOE5BQ0FJSUFzZ0NVRUNkR3BQRFFCQkFDRUdEQUVMSUFwQm1BSnFJUThnQ2tITUFXb2hEQ0FLUVlBQmFpRVhJQW9nQ1VGOGNTSUdRY3dBYkdvaENrRUFJUTREUUNBTElBNUJBblJxSUE4Z0RrSE1BR3dpQjJvZ0J5QU1haUFISUJkcUlBY2dDR3I5WEFJQS9WWUNBQUg5VmdJQUF2MVdBZ0FEL1FzQ0FDQU9RUVJxSWc0Z0JrY05BQXNnQmlBSlJnMEZDd0pBSUFsQkEzRWlCMFVFUUNBR0lRNE1BUXNnQmlFT0EwQWdDeUFPUVFKMGF
20pQUtLQUkwTmdJQUlBNUJBV29oRGlBS1Fjd0FhaUVLSUJWQkFXb2lGU0FIUncwQUN3c2dCaUFKYTBGOFN3MEVJQXRCREdvaEJpQUxRUWhxSVFnZ0MwRUVhaUVQQTBBZ0N5QU9RUUowSWdkcUlBb29BalEyQWdBZ0J5QVBhaUFLS0FLQUFUWUNBQ0FISUFocUlBb29Bc3dCTmdJQUlBWWdCMm9nQ2lnQ21BSTJBZ0FnQ2tHd0Ftb2hDaUFPUVFScUlnNGdDVWNOQUFzTUJBc2dHU2dDMENzb0FoUkJBVVlFUUNBR0JFQWdDaWdDSkNBS0tBSndJQW9vQXJ3QklBRVFhQXdHQ3lBS0tBSTBJQW9vQW9BQklBb29Bc3dCSUFFUWFBd0ZDeUFHQkVBZ0NpZ0NKQ0FLS0FKd0lBb29BcndCSUFFUVp3d0ZDeUFLS0FJMElBb29Bb0FCSUFvb0Fzd0JJQUVRWnd3RUN5QS9JQXMyQWdBZ00wRUJRWUhQQUNBL0VCTU1Bd3RCQUNFR0N3SkFJQWxCQTNFaUIwVUVRQ0FHSVE0TUFRc2dCaUVPQTBBZ0N5QU9RUUowYWlBS0tBSWtOZ0lBSUE1QkFXb2hEaUFLUWN3QWFpRUtJQlZCQVdvaUZTQUhSdzBBQ3dzZ0JpQUphMEY4U3cwQUlBdEJER29oQmlBTFFRaHFJUWdnQzBFRWFpRVBBMEFnQ3lBT1FRSjBJZ2RxSUFvb0FpUTJBZ0FnQnlBUGFpQUtLQUp3TmdJQUlBY2dDR29nQ2lnQ3ZBRTJBZ0FnQmlBSGFpQUtLQUtJQWpZQ0FDQUtRYkFDYWlFS0lBNUJCR29pRGlBSlJ3MEFDd3NnR3lnQ0dDZ0NHQ2dDSUJvQ2Z5QVpLQUxvS3lFSFFRQWhGMEVBSUFsQkEzUVFHQ0lPUlEwQUdnSkFJQUZGRFFBZ0NVVU5BQ0FPSUFsQkFuUnFJUkVnQ1VGOGNTRU5JQWxCQTNFaEdTQUpRUUZySVJBRFFFRUFJUlZCQUNFSUlCQkJBMDhFUUFOQUlBNGdGVUVDZENJR2FpQUdJQXRxS0FJQUtnSUFPQUlBSUE0Z0JrRUVjaUlQYWlBTElBOXFLQUlBS2dJQU9BSUFJQTRnQmtFSWNpSVBhaUFMSUE5cUtBSUFLZ0lBT0FJQUlBNGdCa0VNY2lJR2FpQUdJQXRxS0FJQUtnSUFPQUlBSUJWQkJHb2hGU0FJUVFScUlnZ2dEVWNOQUFzTFFRQWhDaUFaQkVBRFFDQU9JQlZCQW5RaUJtb2dCaUFMYWlnQ0FDb0NBRGdDQUNBVlFRRnFJUlVnQ2tFQmFpSUtJQmxIRFFBTEMwRUFJUVlnQnlFVkEwQWdFU0FHUVFKMEloUnFJZ2hCQURZQ0FFTUFBQUFBSVlRQlFRQWhDa0VBSVE4Z0VFRUNTd1JBQTBBZ0NDQVZLZ0lBSUE0Z0NrRUNkR29pRENvQ0FKUWdoQUdTSW9RQk9BSUFJQWdnRlNvQ0JDQU1LZ0lFbENDRUFaSWloQUU0QWdBZ0NDQVZLZ0lJSUF3cUFnaVVJSVFCa2lLRUFUZ0NBQ0FJSUJVcUFnd2dEQ29DREpRZ2hBR1NJb1FCT0FJQUlBcEJCR29oQ2lBVlFSQnFJUlVnRDBFRWFpSVBJQTFIRFFBTEMwRUFJUXdnR1FSQUEwQWdDQ0FWS2dJQUlBNGdDa0VDZEdvcUFnQ1VJSVFCa2lLRUFUZ0NBQ0FLUVFGcUlRb2dGVUVFYWlFVklBeEJBV29pRENBWlJ3MEFDd3NnQ3lBVWFpSUlJQWdvQWdBaUNFRUVhallDQUNBSUlJUUJPQUlBSUFaQkFXb2lCaUFKUncwQUN5QVhRUUZxSWhjZ0FVY05BQXNMSUE0UUZFRUJDeUFMRUJSRkRRSUxJQnNvQWhRb0FnQWlFQ2dDRUVVRVFFRUJJU0lNQWdzZ0d5Z0NJQ2dDMENzaUZVRzRDR29oRkNBVlFiUUlhaUVUSUJzb0FrUWhFU0FRS0FJVUlRY2dHeWdDR0NnQ0dDRUlRUUFoRndOQUFrQWdFUVJBSUJFZ0YwRUNkR29vQWdCRkRRRUxJQWNvQWh3aUFTQUlLQUlrUVpnQmJHb2hDd0ovSUJzb0FrQkZCRUFnQ3lnQ2xBRWdDeWdDakFGcklRWWdDeWdDa0FFZ0N5Z0NpQUZySVFGQkFDRUpRVFFNQVFzZ0FTQUhLQUlZUVpnQmJHb2lCa0dRQVdzb0FnQWdDeWdDQ0NBTEtBSUFheUlCSUFaQm1BRnJLQUlBYW1zaENTQUxLQUlNSUFzb0FnUnJJUVpCSkFzaER5QUlLQUlZSVFzQ2Z5QUlLQUlnQkVCQkFTQUxRUUZyZENJTFFRRnJJUTVCQUNBTGF3d0JDMEYvSUF0MFFYOXpJUTVCQUFzaERTQUJSUTBBSUFaRkRRQWdCeUFQYWlnQ0FDRWlJQlVvQWhSQkFVWUVRQ0FVSUJkQnVBaHNJZ3RxSVJZZ0N5QVRhaUVZSUFGQkFYRWhNeUFCUVFKMElSMGdBVUY4Y1NJUFFRSjBJU01nRHYwUklYZ2dEZjBSSVhaQkFDRU1JQUZCQkVraEh3TkFBa0FDUUFKQUlCOE5BQ0FZSUIwZ0ltcEpJQllnSWt0eERRQWdJaUFqYWlFWklCWDlDUUswQ0NGNVFRQWhDd05BSUNJZ0MwRUNkR29pQ2lCMklIa2dDdjBBQWdEOXJnRWllaUI0L2JZQklIb2dkdjA1L1ZMOUN3SUFJQXRCQkdvaUN5QVBSdzBBQ3lBUElnc2dBVVlOQWd3QkN5QWlJUmxCQUNFTEN5QUxRUUZ5SVFvZ013UkFJQmtnRFNBVktBSzBDQ0FaS0FJQWFpSUxJQTRnQ3lBT1NCc2dDeUFOU0JzMkFnQWdHVUVFYWlFWklBb2hDd3NnQVNBS1JnMEFBMEFnR1NBTklCVW9BclFJSUJrb0FnQn
20FJZ29nRGlBS0lBNUlHeUFLSUExSUd6WUNBQ0FaSUEwZ0ZTZ0N0QWdnR1NnQ0JHb2lDaUFPSUFvZ0RrZ2JJQW9nRFVnYk5nSUVJQmxCQ0dvaEdTQUxRUUpxSWdzZ0FVY05BQXNMSUJrZ0NVRUNkR29oSWlBTVFRRnFJZ3dnQmtjTkFBc01BUXNnRHEwaGZDQU5yQ0dBQVVFQUlRd0RRRUVBSVFzRFFDQWlBbjhnRGlBaUtnSUFJb1FCUXdBQUFFOWVEUUFhSUEwZ2hBRkRBQUFBejEwTkFCb2dEU0FWTkFLMENBSi9JSVFCa0NLRUFZdERBQUFBVDEwRVFDQ0VBYWdNQVF0QmdJQ0FnSGdMckh3aWZTQjhJSHdnZlZVYnB5QjlJSUFCVXhzTE5nSUFJQ0pCQkdvaElpQUxRUUZxSWdzZ0FVY05BQXNnSWlBSlFRSjBhaUVpSUF4QkFXb2lEQ0FHUncwQUN3c2dCMEhNQUdvaEJ5QVZRYmdJYWlFVklBaEJOR29oQ0VFQklTSWdGMEVCYWlJWElCQW9BaEJKRFFBTERBRUxRUUFoSWlBRlFRRkJoeHBCQUJBVEN5QS9RUkJxSkFBZ0lrVUVRQ0JORURRZ0FDQUFLQUlJUVlDQUFuSTJBZ2dnQlVFQlFaYlpBRUVBRUJNTUFRc0NRQ0FDUlEwQUFuOGdBaUVIUVFBaEJnSkFJQUFvQXVnQklncEJBUkJkSWdGQmYwWU5BQ0FCSUFOTERRQkJBU0FLS0FJWUlnRW9BaEJGRFFFYUlBRW9BaGdoRHlBS0tBSVVLQUlBS0FJVUlSY0RRQ0FQS0FJWUlnRkJCM0VoQWlBQlFRTjJJUU1nRnlnQ0hDSUdJQThvQWlSQm1BRnNhaUVCQW44Z0NpZ0NRQVJBSUFZZ0Z5Z0NHRUdZQVd4cUlnWkJrQUZyS0FJQUlBRW9BZ2dnQVNnQ0FHc2lDQ0FHUVpnQmF5Z0NBR3BySVF3Z0FTZ0NEQ0FCS0FJRWF5RU9RU1FNQVFzZ0FTZ0NsQUVnQVNnQ2pBRnJJUTRnQVNnQ2tBRWdBU2dDaUFGcklRaEJBQ0VNUVRRTElCZHFLQUlBSVFFQ1FBSkFBa0FDUUFKQVFRUWdBeUFDUVFCSGFpSUNJQUpCQTBZYlFRRnJEZ1FCQWdRQUJBc2dEa1VOQXlBSUlBeHFJUVlnQ0VFQ2RDRUNJQTVCQkU4RVFDQU9RWHh4SVF0QkFDRUlBMEFnQnlBQklBSVFGaUVISUFFZ0JrRUNkQ0lEYWlJSklBTnFJZ3dnQTJvaUZTQURhaUVCSUFJZ0Iyb2dDU0FDRUJZZ0Ftb2dEQ0FDRUJZZ0Ftb2dGU0FDRUJZZ0Ftb2hCeUFJUVFScUlnZ2dDMGNOQUFzTFFRQWhDQ0FPUVFOeElnTkZEUU1EUUNBSElBRWdBaEFXSVFjZ0FTQUdRUUowYWlFQklBSWdCMm9oQnlBSVFRRnFJZ2dnQTBjTkFBc01Bd3NnRGtVZ0NFVnlJUUlnRHlnQ0lFVU5BU0FDRFFJZ0NFRUNkQ0VWSUFoQmZIRWlBMEVDZENFWlFRQWhDUU5BQWtBQ1FBSkFJQWhCQkVrTkFDQUJJQWNnQ0dwSklBRWdGV29nQjB0eERRQWdBeUFIYWlBQklCbHFJUVpCQUNFTEEwQWdCeUFMYWlBQklBdEJBblJxL1FBQ0FQME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFQME5BQVFJREFBQUFBQUFBQUFBQUFBQUFQMWFBQUFBSUF0QkJHb2lDeUFEUncwQUN5RUhJQU1pQWlBSVJnMENEQUVMSUFFaEJrRUFJUUlMUVFBaEN5QUlJQUlpQVd0QkIzRWlEUVJBQTBBZ0J5QUdLQUlBT2dBQUlBRkJBV29oQVNBSFFRRnFJUWNnQmtFRWFpRUdJQXRCQVdvaUN5QU5SdzBBQ3dzZ0FpQUlhMEY0U3cwQUEwQWdCeUFHS0FJQU9nQUFJQWNnQmlnQ0JEb0FBU0FISUFZb0FnZzZBQUlnQnlBR0tBSU1PZ0FESUFjZ0JpZ0NFRG9BQkNBSElBWW9BaFE2QUFVZ0J5QUdLQUlZT2dBR0lBY2dCaWdDSERvQUJ5QUhRUWhxSVFjZ0JrRWdhaUVHSUFGQkNHb2lBU0FJUncwQUN3c2dCaUFNUVFKMGFpRUJJQWxCQVdvaUNTQU9SdzBBQ3d3Q0N5QU9SU0FJUlhJaEFpQVBLQUlnQkVBZ0FnMENJQWhCQW5RaEZTQUlRUUYwSVJrZ0NFRjhjU0lEUVFKMElRMGdBMEVCZENFUVFRQWhDUU5BQWtBQ1FBSkFJQWhCQkVrTkFDQUJJQWNnR1dwSklBRWdGV29nQjB0eERRQWdBU0FOYWlFR0lBY2dFR3BCQUNFTEEwQWdCeUFMUVFGMGFpQUJJQXRCQW5ScS9RQUNBUDBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDBOQUFFRUJRZ0pEQTBBQVFBQkFBRUFBZjFiQVFBQUlBdEJCR29pQ3lBRFJ3MEFDeUVISUFNaUFpQUlSZzBDREFFTElBRWhCa0VBSVFJTFFRQWhDeUFJSUFJaUFXdEJCM0VpRVFSQUEwQWdCeUFHS0FJQU93RUFJQUZCQVdvaEFTQUhRUUpxSVFjZ0JrRUVhaUVHSUF0QkFXb2lDeUFSUncwQUN3c2dBaUFJYTBGNFN3MEFBMEFnQnlBR0tBSUFPd0VBSUFjZ0JpZ0NCRHNCQWlBSElBWW9BZ2c3QVFRZ0J5QUdLQUlNT3dFR0lBY2dCaWdDRURzQkNDQUhJQVlvQWhRN0FRb2dCeUFHS0FJWU93RU1JQWNnQmlnQ0hEc0JEaUFIUVJCcUlRY2dCa0VnYWlFR0lBRkJDR29pQVNBSVJ3MEFDd3NnQmlBTVFRSjBhaUVCSUFsQkFXb2lDU0FPUncwQUN3d0NDeUFDRFFFZ0NFRUNkQ0VWSUFoQkFYUWhHU0FJUVh4eElnTkJBblFoRFNBRFFRRjBJUkJCQUNFSkEwQUNRQUpBQWtBZ0NFRUVTUTBBSUFFZ0J5QVpha2tnQVNBVmFpQUhTM0VOQUNBQklBMXFJUVlnQnlBUWFrRUFJUXNEUUNBSElBdEJBWFJxSUFFZ0MwRUNkR3I5QUFJQS9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQS9RMEFBUVFGQ0FrTURRQUJBQUVBQVFBQi9Wc0JBQUFnQzBFRWFpSUxJQU5IRFFBTElRY2dBeUlDSUFoR0RRSU1BUXNnQVNFR1FRQWhBZ3RCQUNFTElBZ2dBaUlCYTBFSGNTSVJCRUFEUUNBSElBWW9BZ0E3QVFBZ0FVRUJhaUVCSUFkQkFtb2hCeUFHUVFScUlRWWdDMEVCYWlJTElCRkhEUUFMQ3lBQ0lBaHJRWGhMRFFBRFFDQUhJQVlvQWdBN0FRQWdCeUFHS0FJRU93RUNJQWNnQmlnQ0NEc0JCQ0FISUFZb0FndzdBUVlnQnlBR0tBSVFPd0VJSUFjZ0JpZ0NGRHNCQ2lBSElBWW9BaGc3QVF3Z0J5QUdLQUljT3dFT0lBZEJFR29oQnlBR1FTQnFJUVlnQVVFSWFpSUJJQWhIRFFBTEN5QUdJQXhCQW5ScUlRRWdDVUVCYWlJSklBNUhEUUFMREFFTElBSU5BQ0FJUVFKMElSVWdDRUY4Y1NJRFFRSjBJUmxCQUNFSkEwQUNRQUpBQWtBZ0NFRUVTUTBBSUFFZ0J5QUlha2tnQVNBVmFpQUhTM0VOQUNBRElBZHFJQUVnR1dvaEJrRUFJUXNEUUNBSElBdHFJQUVnQzBFQ2RHcjlBQUlBL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1EwQUJBZ01BQUFBQUFBQUFBQUFBQUFBL1ZvQUFBQWdDMEVFYWlJTElBTkhEUUFMSVFjZ0F5SUNJQWhHRFFJTUFRc2dBU0VHUVFBaEFndEJBQ0VMSUFnZ0FpSUJhMEVIY1NJTkJFQURRQ0FISUFZb0FnQTZBQUFnQVVFQmFpRUJJQWRCQVdvaEJ5QUdRUVJxSVFZZ0MwRUJhaUlMSUExSERRQUxDeUFDSUFoclFYaExEUUFEUUNBSElBWW9BZ0E2QUFBZ0J5QUdLQUlFT2dBQklBY2dCaWdDQ0RvQUFpQUhJQVlvQWd3NkFBTWdCeUFHS0FJUU9nQUVJQWNnQmlnQ0ZEb0FCU0FISUFZb0FoZzZBQVlnQnlBR0tBSWNPZ0FISUFkQkNHb2hCeUFHUVNCcUlRWWdBVUVJYWlJQklBaEhEUUFMQ3lBR0lBeEJBblJxSVFFZ0NVRUJhaUlKSUE1SERRQUxDeUFYUWN3QWFp
20RVhJQTlCTkdvaEQwRUJJUVlnZFVFQmFpSjFJQW9vQWhnb0FoQkpEUUFMQ3lBR0MwVU5BU0JOS0FMY0t5SUJSUTBBSUFFUUZDQk5RZ0EzQXR3ckN5QUFJQUF0QUZ4Qi9nRnhPZ0JjSUFBZ0FDZ0NDRUgvZm5FMkFnaEJBU0ZsSUFRcEF3Z2lmRkFFZmtJQUJTQjhJQVFwQXpoOUMxQWdBQ2dDQ0NJQlFjQUFSbkVOQUNBQlFZQUNSZzBBSUFRZ1RFRUtha0VDSUFVUUhVRUNSd1JBSUFWQkFVRUNJQUFvQXRBQkcwR0RFMEVBRUJNZ0FDZ0MwQUZGSVdVTUFRc2dURUVLYWlCTVFReHFRUUlRRlNCTUtBSU1JZ0ZCa1A4RFJnMEFJQUZCMmY4RFJnUkFJQUJCZ0FJMkFnZ2dBRUVBTmdMa0FRd0JDeUFFS1FNSUlueFFCSDVDQUFVZ2ZDQUVLUU00ZlF0UUJFQWdBRUhBQURZQ0NDQUZRUUpCdnNFQVFRQVFFd3dCQzBFQUlXVWdCVUVCUWMzQUFFRUFFQk1MSUV4QkVHb2tBQ0JsQ3dzQUlBQUVRQ0FBRUJRTEM3UUJBUUYvSUFBb0FneEZCRUFnQWlBQUtBSWtJQUVSQXdBUEN3SkFRUWdRR0NJRFJRMEFJQU1nQWpZQ0JDQURJQUUyQWdCQkNCQVlJZ0ZGQkVBZ0F4QVVEd3NnQVNBRE5nSUFJQUFnQUNnQ0JFSGtBR3dpQWpZQ0tBTkFJQUFvQWhnZ0Frb05BQXNnQVNBQUtBSVVOZ0lFSUFBZ0FUWUNGQ0FBSUFBb0FoaEJBV28yQWhnZ0FDZ0NIQ0lCUlEwQUlBRW9BZ0JCQURZQ0NDQUFJQUVvQWdRMkFod2dBQ0FBS0FJZ1FRRnJOZ0lnSUFFUUZBc0wrZ0lCQkg4Q1FDQUFSUTBBSUFBb0Fxd29JZ0VFUUNBQUtBS29LQ0lDQkVCQkFDRUJBMEFnQUNnQ3JDZ2dBVUVEZEdvb0FnQWlBd1JBSUFNUUZDQUFLQUtvS0NFQ0N5QUJRUUZxSWdFZ0Fra05BQXNnQUNnQ3JDZ2hBUXNnQUVFQU5nS29LQ0FCRUJRZ0FFRUFOZ0tzS0FzZ0FDZ0N0Q2dpQVFSQUlBRVFGQ0FBUVFBMkFyUW9DeUFBS0FMUUt5SUJCRUFnQVJBVUlBQkJBRFlDMENzTElBQW9BdXdySWdFRVFDQUJFQlFnQUVFQU5nTHNLd3NnQUNnQzZDc2lBUVJBSUFFUUZDQUFRUUEyQXVnckN5QUFLQUw4S3lJQkJFQWdBUkFVSUFCQkFEWUNoQ3dnQUVJQU53TDhLd3NnQUNnQzhDc2lBUVJBSUFBb0F2UXJJZ01FZjBFQUlRSURRQ0FCS0FJTUlnUUVRQ0FFRUJRZ0FVRUFOZ0lNSUFBb0F2UXJJUU1MSUFGQkZHb2hBU0FDUVFGcUlnSWdBMGtOQUFzZ0FDZ0M4Q3NGSUFFTEVCUWdBRUVBTmdMd0t3c2dBQ2dDNUNzaUFRUkFJQUVRRkNBQVFRQTJBdVFyQ3lBQUtBTGNLeUlCUlEwQUlBRVFGQ0FBUWdBM0F0d3JDd3V3QndJTGZ3RitJQUFvQWhBaUNFRWdUd1JBSUFBcEF3aW5Ed3NDUUNBQUtBSVVJZ05CQkU0RVFDQUFLQUlBSWdKQkEyc29BZ0FoQVNBQUlBTkJCR3NpQXpZQ0ZDQUFJQUpCQkdzMkFnQU1BUXNnQTBFQVRBUkFEQUVMSUFOQkFYRWdBQ2dDQUNFQ0FrQWdBMEVCUmdSQVFSZ2hCQXdCQ3lBRFFmNy8vLzhIY1NFSlFSZ2hCQU5BSUFBZ0FrRUJheUlHTmdJQUlBSXRBQUFnQUNBQ1FRSnJJZ0kyQWdBZ0FDQURRUUZyTmdJVUlBWXRBQUFoQmlBQUlBTkJBbXNpQXpZQ0ZDQUVkQ0FCY2lBR0lBUkJDR3QwY2lFQklBUkJFR3NoQkNBRlFRSnFJZ1VnQ1VjTkFBc0xCRUFnQUNBQ1FRRnJOZ0lBSUFJdEFBQWdBQ0FEUVFGck5nSVVJQVIwSUFGeUlRRUxRUUFoQXdzZ0FDZ0NHQ0VDSUFBZ0FVSC9BWEVpQ1VHUEFVczJBaGdnQUVFSFFRZ2dBVUdBZ0lENEIzRkJnSUNBK0FkR0cwRUlJQUliSWdKQkNFRUhRUWdnQVVHQWdQd0RjVUdBZ1B3RFJoc2dBVUgvLy8vL2VFMGJhaUlFUVFoQkIwRUlJQUZCZ1A0QmNVR0EvZ0ZHR3lBQlFSQjJRZjhCY1NJRlFZOEJUUnRxSWdaQkNFRUhRUWdnQVVIL0FIRkIvd0JHR3lBQlFRaDJRZjhCY1NJSFFZOEJUUnNnQ0dwcUlnbzJBaEFnQUNBQUtRTUlJQVVnQW5RZ0FVRVlkbklnQnlBRWRISWdDU0FHZEhLdElBaXRob1FpRERjRENDQUtRUjlOQkVBQ1FDQURRUVJPQkVBZ0FDZ0NBQ0lDUVFOcktBSUFJUUVnQUNBRFFRUnJOZ0lVSUFBZ0FrRUVhellDQUF3QkN5QURRUUJNQkVCQkFDRUJEQUVMSUFOQkFYRWdBQ2dDQUNFQ0FrQWdBMEVCUmdSQVFSZ2hCRUVBSVFFTUFRc2dBMEgrLy8vL0IzRWhCa0VZSVFSQkFDRUJRUUFoQlFOQUlBQWdBa0VCYXlJSE5nSUFJQUl0QUFBZ0FDQUNRUUpySWdJMkFnQWdBQ0FEUVFGck5nSVVJQWN0QUFBaEJ5QUFJQU5CQW1zaUF6WUNGQ0FFZENBQmNpQUhJQVJCQ0d0MGNpRUJJQVJCRUdzaEJDQUZRUUpxSWdVZ0JrY05BQXNMUlEwQUlBQWdBa0VCYXpZQ0FDQUNMUUFBSUFBZ0EwRUJhellDRkNBRWRDQUJjaUVCQ3lBQUlBRkIvd0Z4SWdKQmp3RkxOZ0lZSUFCQkNFRUhRUWdnQVVHQWdJRDRCM0ZCZ0lDQStBZEdHeUFKUVk4QlRSc2lBMEVJUVFkQkNDQUJRWUNBL0FOeFFZQ0EvQU5HR3lBQlFmLy8vLzk0VFJ0cUlnUkJDRUVIUVFnZ0FVR0EvZ0Z4UVlEK0FVWWJJQUZCRUhaQi93RnhJZ1ZCandGTkcyb2lDRUVJUVFkQkNDQUJRZjhBY1VIL0FFWWJJQUZCQ0haQi93RnhJZ2xCandGTkd5QUthbW8yQWhBZ0FDQUZJQU4wSUFGQkdIWnlJQWtnQkhSeUlBSWdDSFJ5clNBS3JZWWdESVFpRERjRENBc2dES2NMd1JRQ0czOEdleUFBS0FJSUlnb2dBQ2dDQkdvaENBSkFJQUFvQWd4RkJFQWdDRUVDU0EwQklBTkJBRXdOQVNBQUtBSUFJZ1VnQ0VFRWF5SUdRUUYySWd4QkFuUWlDU0FCSUFwQkFuUn
20FJZ2NnQTBFQ2RDSUVhbXBCQkdwSklBVWdERUVEZEdwQkNHb2lBQ0FIUVFScVMzRWdCU0FCSUFScUlBbHFRUVJxU1NBQlFRUnFJQUJKY1hJaEVpQUlRUVJKSWhRZ0FrRUJSM0loRlNBQ1FRRkdJQVpCQlV0eElSWWdDRUg4Ly8vL0IzRWhFeUFJUVFGeElSY2dDa0VCYWlFUElBaEJBM0VoRVNBQklBVnJJUmdnQlNBSVFRSjBhaUVaSUFVZ0NFRUJheUlBUVFKMGFpRWFJQXhCQVdvaUcwRjhjU0lRUVFGMElRc2dBaUFLYkVFQ2RDRWNJQUJCQVhZZ0FteEJBblFoSFFOQUlBRW9BZ0FnQVNBY2FpZ0NBQ0lKUVFGcVFRRjFheUVIQWtBZ0ZBUkFJQWtoQkVFQUlRWU1BUXRCQUNFR0FrQUNmMEVBSUJaRkRRQWFRUUFnRWcwQUdpQUovUkVoSUNBSC9SRWhILzBNQUFBQUFBSUFBQUFFQUFBQUJnQUFBQ0VqUVFBaEFBTkFJQUVnQUVFQ2RHcjlBQUlFSVNJZ0FTQUFJQTlxUVFKMGF2MEFBZ0FoSVNBRklBQkJBM1JxSWdRZ0gvMWFBZ0FESUFSQkNHb2dJaUFoSUNBZ0lmME5EQTBPRHhBUkVoTVVGUllYR0JrYUd5SWkvYTRCL1F3Q0FBQUFBZ0FBQUFJQUFBQUNBQUFBL2E0QlFRTDlyQUg5c1FFaUlQMWFBZ0FBSUFSQkVHb2dJUDFhQWdBQklBUkJHR29nSVAxYUFnQUNJQVVnSS8wTUFRQUFBQUVBQUFBQkFBQUFBUUFBQVAxUUlpVDlHd0JCQW5ScUlDQWdIeUFnL1EwTURRNFBFQkVTRXhRVkZoY1lHUm9iL2E0QlFRSDlyQUVnSXYydUFTSWYvVm9DQUFBZ0JTQWsvUnNCUVFKMGFpQWYvVm9DQUFFZ0JTQWsvUnNDUVFKMGFpQWYvVm9DQUFJZ0JTQWsvUnNEUVFKMGFpQWYvVm9DQUFNZ0kvME1DQUFBQUFnQUFBQUlBQUFBQ0FBQUFQMnVBU0VqSUNBaEh5QWhJU0FnQUVFRWFpSUFJQkJIRFFBTElDRDlHd01oQkNBZi9Sc0RJUWNnRUNBYlJnMEJJQXNoQmlBRUlRa2dFQXNoQUFOQUlBRWdBRUVCYWlJS0lBSnNRUUowYWlnQ0FDRWVJQUVnQUNBUGFpQUNiRUVDZEdvb0FnQWhCQ0FGSUFaQkFuUnFJZzRnQnpZQ0FDQU9JQWNnSGlBRUlBbHFRUUpxUVFKMWF5SUhha0VCZFNBSmFqWUNCQ0FHUVFKcUlRWWdBQ0FNUnlBRUlRa2dDaUVBRFFBTERBRUxJQXNoQmdzZ0JTQUdRUUowYWlBSE5nSUFRWHdoQUNBWEJIOGdHaUFCSUIxcUtBSUFJQVJCQVdwQkFYVnJJZ0EyQWdBZ0FDQUhha0VCZFNFSFFYZ0ZRWHdMSUJscUlBUWdCMm8yQWdCQkFDRUdRUUFoQUVFQUlRUUNRQ0FWSUJnZ0RVRUNkR3BCRUVseVJRUkFBMEFnQVNBQVFRSjBJZ1JxSUFRZ0JXcjlBQUlBL1FzQ0FDQUFRUVJxSWdBZ0UwY05BQXNnRXlJRUlBaEdEUUVMSUFRaEFDQVJCRUFEUUNBQklBQWdBbXhCQW5ScUlBVWdBRUVDZEdvb0FnQTJBZ0FnQUVFQmFpRUFJQVpCQVdvaUJpQVJSdzBBQ3dzZ0JDQUlhMEY4U3cwQUEwQWdBU0FBSUFKc1FRSjBhaUFGSUFCQkFuUnFLQUlBTmdJQUlBRWdBRUVCYWlJRUlBSnNRUUowYWlBRklBUkJBblJxS0FJQU5nSUFJQUVnQUVFQ2FpSUVJQUpzUVFKMGFpQUZJQVJCQW5ScUtBSUFOZ0lBSUFFZ0FFRURhaUlFSUFKc1FRSjBhaUFGSUFSQkFuUnFLQUlBTmdJQUlBQkJCR29pQUNBSVJ3MEFDd3NnQVVFRWFpRUJJQTFCQVdvaURTQURSdzBBQ3d3QkN3SkFBa0FDUUNBSVFRRnJEZ0lBQVFJTElBTkJBRXdOQWtFQUlRSUNRQ0FEUVFSSkJFQWdBU0VBREFFTElBRWdBMEg4Ly8vL0IzRWlBa0VDZEdvaEFBTkFJQUVnQmtFQ2RHb2lCQ0FFL1FBQ0FDSWYvUnNBUVFKdC9SRWdILzBiQVVFQ2JmMGNBU0FmL1JzQ1FRSnQvUndDSUIvOUd3TkJBbTM5SEFQOUN3SUFJQVpCQkdvaUJpQUNSdzBBQ3lBQ0lBTkdEUU1MQTBBZ0FDQUFLQUlBUVFKdE5nSUFJQUJCQkdvaEFDQUNRUUZxSWdJZ0EwY05BQXNNQWdzZ0EwRUFUQTBCSUFBb0FnQWhDU0FDSUFwc1FRSjBJUWNEUUNBSklBRW9BZ0FnQVNBSGFpSUVLQUlBUVFGcVFRRjFheUlBTmdJRUlBa2dBQ0FFS0FJQWFpSUFOZ0lBSUFFZ0FEWUNBQ0FCSUFKQkFuUnFJQWtvQWdRMkFnQWdBVUVFYWlFQklBWkJBV29pQmlBRFJ3MEFDd3dCQ3lBSVFRTklEUUFnQTBFQVRBMEFJQUFvQWdBaUJTQUlJQWhCQVhFaUZFVWlCbXRCQkdzaUNVRUJkaUlMUVFKMElnY2dBU0FEUVFKMElnQnFha2tnQlNBTFFRTjBha0VNYWlJRUlBRkJCR3BMY1NBRlFRUnFJQUFnQVNBS1FRSjBhaUlBYWlBSGFrRUlha2tnQUVFSWFpQUVTWEZ5SVJVZ0FrRUJSeUFJUVFSSmNpRVdJQUpCQVVZZ0NVRUZTM0VoRnlBSVFmei8vLzhIY1NFUUlBaEJBM0VoRVNBQklBVnJJUmdnQlNBSVFRSjBha0VFYXlFWklBVWdDRUVDYXlJQVFRSjBhaUVhSUF0QkFXb2lFa0Y4Y1NJTVFRRnlJUk1nREVFQmRFRUJjaUVMSUFJZ0NteEJBblFoR3lBQUlBWnJRUUpKSVJ3Z0NFRUJka0VCYXlBQ2JFRUNkQ0VkQTBBZ0JTQUJLQUlBSUFFZ0cyb2lEeUFDUVFKMGFpZ0NBQ0lKSUE4b0FnQWlBR3BCQW1wQkFuVnJJZ2NnQUdvMkFnQkJBU0VFQWtBZ0hBUkFJQWtoQmd3QkN3SkFBbjlCQVNBWFJRMEFHa0VCSUJVTkFCb2dDZjBSSVI4Z0IvMFJJU0JCQUNFQUEwQWdCU0FBUVFOMGFpSUhJQUVnQUVFQ2RDSUVhdjBBQWdRZ0h5QUVJQTlxL1FBQ0NDSWYvUTBNRFE0UEVCRVNFeFFWRmhjWUdSb2JJaUlnSC8ydUFmME1BZ0FBQUFJQUFBQUNBQUFBQWdBQUFQMnVBVUVDL2F3Qi9iRUJJaUVnSVNBZ0lDSDlEUXdORGc4UUVSSVRGQlVXRnhnWkdodjlyZ0ZCQWYyc0FTQWkvYTRCSWlMOURRUUZCZ2NZR1JvYkNBa0tDeHdkSGgvOUN3SVVJQWNnSUNBaS9RME1EUTRQRUJFU0V3QUJBZ01VRlJZWElDSDlEUUFCQWdNRUJRWUhFQkVTRXd3TkRnLzlDd0lFSUNFaElDQUFRUVJxSWdBZ0RFY05BQXNnSC8wYkF5RUdJQ0Q5R3dNaEJ5QU1JQkpHRFFFZ0N5RUVJQVloQ1NBVEN5RUFBMEFnQVNBQUlBSnNRUUowYWlnQ0FDRWVJQThnQUVFQmFpSUtJQUpzUVFKMGFpZ0NBQ0VHSUFVZ0JFRUNkR29pRGlBSE5nSUFJQTRnQnlBZUlBWWdDV3BCQW1wQkFuVnJJZ2RxUVFGMUlBbHFOZ0lFSUFSQkFtb2hCQ0FBSUJKSElBb2hBQ0FHSVFrTkFBc01BUXNnQ3lFRUN5QVlJQTFCQW5ScUlRa2dCU0FFUVFKMGFpQUhOZ0lBQWtBZ0ZFVUVRQ0FhSUFFZ0hXb29BZ0FnQmtFQmFrRUJkV3NpQUNBSGFrRUJkU0FHYWpZQ0FBd0JDeUFHSUFkcUlRQUxJQmtnQURZQ0FFRUFJUVpCQUNFQVFRQWhCQUpBSUJZZ0NVRVFTWEpGQkVBRFFDQUJJQUJCQW5RaUJHb2dCQ0FGYXYwQUFnRDlDd0lBSUFCQkJHb2lBQ0FRUncwQUN5QVFJZ1FnQ0VZTkFRc2dCQ0VBSUJFRVFBTkFJQUVnQUNBQ2JFRUNkR29nQlNBQVFRSjBhaWdDQURZQ0FDQUFRUUZxSVFBZ0JrRUJhaUlHSUJGSERRQUxDeUFFSUFoclFYeExEUUFEUUNBQklBQWdBbXhCQW5ScUlBVWdBRUVDZEdvb0FnQTJBZ0FnQVNBQVFRRnFJZ1FnQW14QkFuUnFJQVVnQkVFQ2RHb29BZ0EyQWdBZ0FTQUFRUUpxSWdRZ0FteEJBblJxSUFVZ0JFRUNkR29vQWdBMkFnQWdBU0FBUVFOcUlnUWdBbXhCQW5ScUlBVWdCRUVDZEdvb0FnQTJBZ0FnQUVFRWFpSUFJQWhIRFFBTEN5QUJRUVJxSVFFZ0RVRUJhaUlOSUFOSERRQUxDd3N6QVFGL0l3QkJFR3NpQVNRQUlBQUVmeUFCUVF4cVFTQWdBQkI1SVFCQkFDQUJLQUlNSUFBYkJVRUFDeUFCUVJCcUpBQUxHd0VCZnlBQUJFQWdBQ2dDQ0NJQkJFQWdBUkFVQ3lBQUVCUUxDekVCQW45QkFVRU1FQmNpQUFSQUlBQkJDallDQkNBQVFRcEJCQkFYSWdFMkFnZ2dBUVJBSUFBUEN5QUFFQlFMUVFBTFNBRUNmd0ovSUFGQkgwMEVRQ0FBS0FJQUlRSWdBRUVFYWd3QkN5QUJRU0JySVFFZ0FBc29BZ0FoQXlBQUlBSWdBWFEyQWdBZ0FDQURJQUYwSUFKQklDQUJhM1p5TmdJRUM2OENBUVovSXdCQjhBRnJJZ1lrQUNBR0lBSTJBdXdCSUFZZ0FUWUM2QUVnQmlBQU5nSUFJQVJGSVFrQ1FBSkFBa0FDUUNBQlFRRkhCRUFnQUNFSFFRRWhDQXdCQ3lBQUlRZEJBU0VJSUFJTkFDQUFJUVFNQVFzRFFDQUhJQVVnQTBFQ2RHb2lDaWdDQUdzaUJDQUFFQ3RCQUV3RVFDQUhJUVFNQWdzZ0NVRi9jeUVMUVFFaENRSkFJQXNnQTBFQ1NISkJBWEZGQkVBZ0NrRUlheWdDQUNFS0lBZEJDR3NpQ3lBRUVDdEJBRTROQVNBTElBcHJJQVFRSzBFQVRnMEJDeUFHSUFoQkFuUnFJQVEyQWdBZ0JrSG9BV29nQVNBQ0VIY2lBUkE4SUFoQkFXb2hDQ0FCSUFOcUlRTWdCaWdDN0FFaEFpQUVJUWNnQmlnQzZBRWlBVUVCUncwQklBSU5BUXdEQ3dzZ0J5RUVEQUVMSUFsRkRRRUxJQVlnQ0JCMklBUWdBeUFGRUVRTElBWkI4QUZxSkFBTFN3RUNmeUFBS0FJRUlRSWdBQUovSUFGQkgwMEVRQ0FBS0FJQUlRTWdBZ3dCQ3lBQlFTQnJJUUVnQWlFRFFRQUxJZ0lnQVhZMkFnUWdBQ0FDUVNBZ0FXdDBJQU1nQVhaeU5nSUFDeThCQVg4Z0FBUkFJQUFvQWdRaUFRUkFJQUFvQWdBZ0FSRUNBQXNnQUNnQ0lCQVVJQUJCQURZQ0lDQUFFQlFMQ3lvQUlBQUVRQ0FBS0FJd0lBQkJGRUVRSUFBb0Frd2JhaWdDQUJFQ0FDQUFRUUEyQWpBZ0FCQVVDd3VHQXdJRmZ3cCtJd0JCSUdzaUF5UUFBa0FnQUNnQ0VDSUZSUVJBUVFFaEFnd0JDd0pBSUFBMEFnQWlCMElBVXcwQUlBQTBBZ1FpQ0VJQVV3MEFJQUEwQWdnaUNVSUFVdzBBSUFBMEFnd2lDa0lBVXcwQUlBQW9BaGdoQUNBSFFnRjlJUXdnQ0VJQmZTRU5JQWxDQVgwaENTQUtRZ0Y5SVFvRFFDQUFJQXdnQUNnQ0FDSUNyU0lIZkNBSGdDSUxQZ0lRSUFBZ0RTQUFLQUlFSWdhdElnZDhJQWVBSWc0K0FoUkNBU0FBTlFJb0lnZUdJZzlDQVgwaUNDQUpJQUtzSWhCOElCQi94SHdnQjRlbklBZ2dDOFI4SUFlSHAyc2lBa0VBU0FSQUlBTWdBallDQkNBRElBUTJBZ0FnQVVFQlFhSHBBQ0FERUJOQkFDRUNEQU1MSUFBZ0FqWUNDQ0FJSUFvZ0Jxd2lDM3dnQzMvRWZDQUhoNmNnRHNRZ0QzeENBWDBnQjRlbmF5SUNRUUJJQkVBZ0F5QUNOZ0lVSUFNZ0JEWUNFQ0FCUVFGQjV1a0FJQU5CRUdvUUUwRUFJUUlNQXdzZ0FDQUNOZ0lNSUFCQk5Hb2hBRUVCSVFJZ0JFRUJhaUlFSUFWSERRQUxEQUVMSUFGQkFVR2JORUVBRUJNTElBTkJJR29rQUNBQ0MvMEdBUVovSUFBRVFBSkFJQUFvQWdBRVFDQUFLQUlNSWdFRVFDQUJFRFFnQUNnQ0RCQVVJQUJCQURZQ0RBc2dBQ2dDRUNJQkJFQWdBUkFVSUFCQ0FEY0RFQXNnQUNnQ1FCQVVJQUJDQURjQ1BDQUFLQUpJRUJRZ0FFRUFOZ0pJSUFBb0FsZ1FGQ0FBUVFBMkFsZ01BUXNnQUNnQ0xDSUJCRUFnQVJBVUlBQkJBRFlDTEFzZ0FDZ0NJQ0lCQkVBZ0FSQVVJQUJDQURjRElBc2dBQ2dDTkNJQlJRMEFJQUVRRkNBQVFnQTNBalFMSUFBb0F1Z0JFRjRnQUNnQ3RBRWlBUVJBSUFBb0FvQUJJQUFvQW9RQmJDSURCSDhEUUNBQkVEUWdBVUdNTEdvaEFTQUNRUUZxSWdJZ0EwY05BQXNnQUNnQ3RBRUZJQUVMRUJRZ0FFRUFOZ0swQVFzZ0FDZ0NqQUVpQVFSQUlBQW9Bb2dCSWdJRVFFRUFJUUVEUUNBQUtBS01BU0FCUVFOMGFpZ0NBQ0lEQkVBZ0F4QVVJQUFvQW9nQklRSUxJQUZCQVdvaUFTQUNTUTBBQ3lBQUtBS01BU0VCQ3lBQVFRQTJBb2dCSUFFUUZDQUFRUUEyQW93QkN5QUFLQUtnQVJBVUlBQkJBRFlDa0FFZ0FFRUFOZ0tnQVNBQUtBSj
20hFQlFnQUVFQU5nSjhJQUF0QU5RQlFRSnhSUVJBSUFBb0FzQUJFQlFMSUFCQjZBQnFRUUJCOEFBUUdSb2dBQ2dDMkFFUU9DQUFRUUEyQXRnQklBQW9BdHdCRURnZ0FFRUFOZ0xZQVNBQUtBTGdBU0lCQkVBZ0FTZ0NIQ0lDQkVBZ0FoQVVJQUZCQURZQ0hBc2dBU2dDS0NJQ0JFQWdBU2dDSkFSQUEwQWdBaUFGUVNoc0lnTnFLQUlrSWdRRVFDQUVFQlFnQVNnQ0tDSUNJQU5xUVFBMkFpUUxJQUlnQTJvb0FoQWlCQVJBSUFRUUZDQUJLQUlvSWdJZ0EycEJBRFlDRUFzZ0FpQURhaWdDR0NJRUJFQWdCQkFVSUFFb0FpZ2lBaUFEYWtFQU5nSVlDeUFGUVFGcUlnVWdBU2dDSkVrTkFBc0xJQUlRRkNBQlFRQTJBaWdMSUFFUUZBc2dBRUVBTmdMZ0FTQUFLQUpnRUNVZ0FFRUFOZ0pnSUFBb0FtUVFKU0FBUVFBMkFtUWdBQ2dDN0FFaUF3UkFBa0FnQXlnQ0NFVU5BQ0FES0FJTUJFQWdBMEVBTmdJb0EwQWdBeWdDR0VFQVNnMEFDd3NnQTBFQk5nSVFJQU1vQWdBUUZDQURLQUljSWdKRkRRQURRQ0FDS0FJRUlRRWdBaEFVSUFNZ0FUWUNIQ0FCSWdJTkFBc0xJQU1vQWlRaUFnUkFJQUlvQWdRaUJVRUFTZ1JBUVFBaEFRTkFJQUlvQWdBZ0FVRU1iR29pQkNnQ0NDSUdCRUFnQkNnQ0JDQUdFUUlBSUFJb0FnUWhCUXNnQVVFQmFpSUJJQVZJRFFBTEN5QUNLQUlBRUJRZ0FoQVVDeUFERUJRTElBQkJBRFlDN0FFZ0FCQVVDd3ZtQXdJSWZ3UitJQUFvQWhRb0FnQW9BaFFnQVVITUFHeHFJZ2tvQWd3aUNDQUFLQUlZS0FJWUlBRkJOR3hxSWdvMUFnUWlFRUlCZlNJU0lBQTFBang4SUJDQXB5SUxJQWdnQzBrYklRd2dDU2dDQ0NJSUlBbzFBZ0FpRVVJQmZTSVRJQUExQWpoOElCR0FweUlLSUFnZ0Nra2JJUW9nQ1NnQ0JDSUlJQklnQURVQ05Id2dFSUNuSWdzZ0NDQUxTeHNoQ3lBSktBSUFJZ2dnRXlBQU5RSXdmQ0FSZ0tjaURTQUlJQTFMR3lFTlFRQWhDQ0FBS0FJZ0tBTFFLeUFCUWJnSWJHb29BaFFoRGdKQUlBa29BaFJCQUNBQ2EwRi9JQUliYWlJQ1JRUkFJQW9oQUNBTklRZ2dDeUVCREFFTElBTkJBWEVnQWtFQmF5SVBkQ0lKSUExSkJFQWdEU0FKYTYxQ2Z5QUNyU0lRaGtKL2hYd2dFSWluSVFnTFFRQWhBRUVBSVFFZ0EwRUJkaUFQZENJRElBdEpCRUFnQ3lBRGE2MUNmeUFDclNJUWhrSi9oWHdnRUlpbklRRUxJQWtnQ2trRVFDQUtJQWxyclVKL0lBS3RJaENHUW4rRmZDQVFpS2NoQUFzZ0F5QU1Ud1JBUVFBaERBd0JDeUFNSUFOcnJVSi9JQUt0SWhDR1FuK0ZmQ0FRaUtjaERBc2dCRUYvSUFCQkFrRURJQTVCQVVZYklnSnFJZ01nQUNBRFN4dEpJQVZCZnlBQ0lBeHFJZ0FnQUNBTVNSdEpjU0FHSUFnZ0Ftc2lBRUVBSUFBZ0NFMGJTM0VnQnlBQklBSnJJZ0JCQUNBQUlBRk5HMHR4QzZJQkFRWi9JQUFFUUNBQUtBSUVJZ0lFUUNBQ0VCUWdBRUVBTmdJRUN5QUJCRUFnQUNFQ0EwQWdBaWdDeUFFaUF3UkFRUUFoQlNBQ0tBTEVBU0lFQkg4RFFDQURLQUlNSWdZRVFDQUdFQlFnQTBFQU5nSU1JQUlvQXNRQklRUUxJQU5CRUdvaEF5QUZRUUZxSWdVZ0JFa05BQXNnQWlnQ3lBRUZJQU1MRUJRZ0FrRUFOZ0xJQVFzZ0FrSHdBV29oQWlBSFFRRnFJZ2NnQVVjTkFBc0xJQUFRRkFzTHdCZ0NHMzhEZXlBQ1FRZHNJUThnQWtFR2JDRVFJQUpCQld3aEVTQUNRUUowSVF3Z0FrRURiQ0VTSUFKQkFYUWhFeUFBS0FJQUlnb2dBQ2dDRENJWlFRVjBJZ1JxSVFZZ0NpQUVheUFBS0FJUUlRVWdBQ2dDSENFTElBQW9BaFFoQnlBQUtBSUlJUTBDUUFKQUFrQUNRQUpBQWtBQ1FDQURRUWhKRFFBZ0FVRVBjUTBBSUFaQkQzRkZEUUVMSUFVZ0IwOE5CUUpBQWtBZ0EwRUJhdzRDQUFFREN5QUhJQVZySWdoQkYwME5CU0FCSUFWQkFuUnFJUWtnR1VFRmRDSUVJQW9nQlVFR2RHcHFJQUVnQjBFQ2RHcEpCRUFnQ1NBS0lBZEJCblJxSUFScVFUeHJTUTBHQ3lBRi9SSDlEQUFBQUFBQkFBQUFBZ0FBQUFNQUFBRDlyZ0VoSUNBRklBaEJmSEVpRG1vaEJVRUFJUVFEUUNBR0lDQkJCdjJyQVNJZi9Sc0FhaUFKSUFSQkFuUnEvUUFDQUNJaC9SOEFPQUlBSUFZZ0gvMGJBV29nSWYwZkFUZ0NBQ0FHSUIvOUd3SnFJQ0g5SHdJNEFnQWdCaUFmL1JzRGFpQWgvUjhET0FJQUlDRDlEQVFBQUFBRUFBQUFCQUFBQUFRQUFBRDlyZ0VoSUNBRVFRUnFJZ1FnRGtjTkFBc2dDQ0FPUncwRkRBWUxJQUVnQWtFQ2RHb2hDQ0FISUFWcklnNUJHMDBOQWlBWlFRVjBJZ1FnQ2lBRlFRWjBhbW9pQ1NBQklBSWdCMnBCQW5ScVNTQUtJQWRCQm5ScUlBUnFRVGhySWdRZ0FTQUNJQVZxUVFKMGFrdHhEUUlnQ1NBQklBZEJBblJxU1NBQklBVkJBblJxSUFSSmNRMENJQVg5RWYwTUFBQUFBQUVBQUFBQ0FBQUFBd0FBQVAydUFTRWdJQVVnRGtGOGNTSVVhaUVFUVFBaENRTkFJQVlnSUVFRy9hc0JJaC85R3dCcUloVWdBU0FGSUFscVFRSjBJaFpxL1FBQ0FDSWgvUjhBT0FJQUlBWWdILzBiQVdvaUZ5QWgvUjhCT0FJQUlBWWdILzBiQW1vaUdDQWgvUjhDT0FJQUlBWWdILzBiQTJvaUdpQWgvUjhET0FJQUlCVWdDQ0FXYXYwQUFnQWlILzBmQURnQ0JDQVhJQi85SHdFNEFnUWdHQ0FmL1I4Q09BSUVJQm9nSC8wZkF6Z0NCQ0FnL1F3RUFBQUFCQUFBQUFRQUFBQUVBQUFBL2E0QklTQWdDVUVFYWlJSklCUkhEUUFMSUE0Z0ZFY05Bd3dGQ3lBRklBZFBEUVFnQVNBUFFRSjBhaUVKSUFFZ0VFRUNkR29oRGlBQklCRkJBblJxSVJRZ0FTQU1RUUowYWlFVklBRWdFa0VDZEdvaEZpQUJJQk5CQW5ScUlSY2dBU0FDUVFKMGFpRVlBMEFnQmlBRlFRWjBhaUlFSUFFZ0JVRUNkQ0lJYWlvQ0FEZ0NBQ0FFSUFnZ0dHb3FBZ0E0QWdRZ0JDQUlJQmRxS2dJQU9BSUlJQVFnQ0NBV2Fpb0NBRGdDRENBRUlBZ2dGV29xQWdBNEFoQWdCQ0FJSUJScUtnSUFPQUlVSUFRZ0NDQU9haW9DQURnQ0dDQUVJQWdnQ1dvcUFnQTRBaHdnQlVFQmFpSUZJQWRIRFFBTERBUUxJQUVnRDBFQ2RHb2hDU0FCSUJCQkFuUnFJUTRnQVNBUlFRSjBhaUVVSUFFZ0RFRUNkR29oRlNBQklCSkJBblJxSVJZZ0FTQVRRUUowYWlFWElBRWdBa0VDZEdvaEdDQURRUU5HSVJvZ0EwRUVSaUVjSUFOQkJVWWhIU0FEUVFkR0lSNERRQ0FHSUFWQkJuUnFJZ1FnQVNBRlFRSjBJZ2hxS2dJQU9BSUFJQVFnQ0NBWWFpb0NBRGdDQkNBRUlBZ2dGMm9xQWdBNEFnZ0NRQ0FhRFFBZ0JDQUlJQlpxS2dJQU9BSU1JQndOQUNBRUlBZ2dGV29xQWdBNEFoQWdIUTBBSUFRZ0NDQVVhaW9DQURnQ0ZDQURRUVpHRFFBZ0JDQUlJQTVxS2dJQU9BSVlJQjROQUNBRUlBZ2dDV29xQWdBNEFod0xJQVZCQVdvaUJTQUhSdzBBQ3d3REN5QUZJUVFMSUFSQkFXb2hCU0FISUFSclFRRnhCRUFnQmlBRVFRWjBhaUlKSUFFZ0JFRUNkQ0lFYWlvQ0FEZ0NBQ0FKSUFRZ0NHb3FBZ0E0QWdRZ0JTRUVDeUFGSUFkR0RRRURRQ0FHSUFSQkJuUnFJZ1VnQVNBRVFRSjBJZ2xxS2dJQU9BSUFJQVVnQ0NBSmFpb0NBRGdDQkNBR0lBUkJBV29pQlVFR2RHb2lDU0FCSUFWQkFuUWlCV29xQWdBNEFnQWdDU0FGSUFocUtnSUFPQUlFSUFSQkFtb2lCQ0FIUncwQUN3d0JDeUF
20ISUFVaUJHdEJBM0VpQ1FSQVFRQWhDQU5BSUFZZ0JFRUdkR29nQVNBRVFRSjBhaW9DQURnQ0FDQUVRUUZxSVFRZ0NFRUJhaUlJSUFsSERRQUxDeUFGSUFkclFYeExEUUFEUUNBR0lBUkJCblJxSUFFZ0JFRUNkR29xQWdBNEFnQWdCaUFFUVFGcUlnVkJCblJxSUFFZ0JVRUNkR29xQWdBNEFnQWdCaUFFUVFKcUlnVkJCblJxSUFFZ0JVRUNkR29xQWdBNEFnQWdCaUFFUVFOcUlnVkJCblJxSUFFZ0JVRUNkR29xQWdBNEFnQWdCRUVFYWlJRUlBZEhEUUFMQzBFZ2FpRUhJQUVnRFVFQ2RHb2hCaUFBS0FJWUlRVUNRQUpBQWtBQ1FDQURRUWhKRFFBZ0JrRVBjUTBBSUFkQkQzRkZEUUVMSUFVZ0MwOE5BZ0pBQWtBQ1FDQURRUUZyRGdJQUFRSUxJQXNnQldzaUFFRWJUUTBESUFvZ0JVRUdkRUVnY2lBWlFRVjBJZ0pyYWlBQklBc2dEV3BCQW5ScVNRUkFJQUVnQlNBTmFrRUNkR29nQzBFR2RDQUNheUFLYWtFY2Ewa05CQXNnQmlBRlFRSjBhaUVDSUFYOUVmME1BQUFBQUFFQUFBQUNBQUFBQXdBQUFQMnVBU0VnSUFVZ0FFRjhjU0lCYWlFRlFRQWhCQU5BSUFjZ0lFRUcvYXNCSWgvOUd3QnFJQUlnQkVFQ2RHcjlBQUlBSWlIOUh3QTRBZ0FnQnlBZi9Sc0JhaUFoL1I4Qk9BSUFJQWNnSC8wYkFtb2dJZjBmQWpnQ0FDQUhJQi85R3dOcUlDSDlId000QWdBZ0lQME1CQUFBQUFRQUFBQUVBQUFBQkFBQUFQMnVBU0VnSUFSQkJHb2lCQ0FCUncwQUN5QUFJQUZIRFFNTUJBc2dCaUFDUVFKMGFpRURBa0FnQ3lBRmF5SUFRU1JKQkVBZ0JTRUVEQUVMSUFvZ0JVRUdkRUVnY2lBWlFRVjBJZ1JyYWlJSUlBRWdBaUFMSUExcUlnSnFRUUowYWtrZ0MwRUdkQ0FFYXlBS2FrRVlheUlFSUFFZ0RVRUNkR29nQlVFQ2RHb2lDaUFNYWt0eEJFQWdCU0VFREFFTElBZ2dBU0FDUVFKMGFra2dCQ0FLUzNFRVFDQUZJUVFNQVFzZ0JmMFIvUXdBQUFBQUFRQUFBQUlBQUFBREFBQUEvYTRCSVNBZ0JTQUFRWHh4SWdKcUlRUkJBQ0VCQTBBZ0J5QWdRUWI5cXdFaUgvMGJBR29pQ2lBR0lBRWdCV3BCQW5RaUNHcjlBQUlBSWlIOUh3QTRBZ0Fn
20QnlBZi9Sc0JhaUlNSUNIOUh3RTRBZ0FnQnlBZi9Sc0NhaUlOSUNIOUh3STRBZ0FnQnlBZi9Sc0RhaUlQSUNIOUh3TTRBZ0FnQ2lBRElBaHEvUUFDQUNJZi9SOEFPQUlFSUF3Z0gvMGZBVGdDQkNBTklCLzlId0k0QWdRZ0R5QWYvUjhET0FJRUlDRDlEQVFBQUFBRUFBQUFCQUFBQUFRQUFBRDlyZ0VoSUNBQlFRUnFJZ0VnQWtjTkFBc2dBQ0FDUmcwRUN5QUVRUUZxSVFBZ0N5QUVhMEVCY1FSQUlBY2dCRUVHZEdvaUFTQUdJQVJCQW5RaUFtb3FBZ0E0QWdBZ0FTQUNJQU5xS2dJQU9BSUVJQUFoQkFzZ0FDQUxSZzBEQTBBZ0J5QUVRUVowYWlJQUlBWWdCRUVDZENJQmFpb0NBRGdDQUNBQUlBRWdBMm9xQWdBNEFnUWdCeUFFUVFGcUlnQkJCblJxSWdFZ0JpQUFRUUowSWdCcUtnSUFPQUlBSUFFZ0FDQURhaW9DQURnQ0JDQUVRUUpxSWdRZ0MwY05BQXNNQXdzZ0JpQVBRUUowYWlFRUlBWWdFRUVDZEdvaENpQUdJQkZCQW5ScUlRZ2dCaUFNUVFKMGFpRU1JQVlnRWtFQ2RHb2hEU0FHSUJOQkFuUnFJUThnQmlBQ1FRSjBhaUVDSUFOQkEwWWhFQ0FEUVFSR0lSRWdBMEVGUmlFU0lBTkJCMFloRXdOQUlBY2dCVUVHZEdvaUFDQUdJQVZCQW5RaUFXb3FBZ0E0QWdBZ0FDQUJJQUpxS2dJQU9BSUVJQUFnQVNBUGFpb0NBRGdDQ0FKQUlCQU5BQ0FBSUFFZ0RXb3FBZ0E0QWd3Z0VRMEFJQUFnQVNBTWFpb0NBRGdDRUNBU0RRQWdBQ0FCSUFocUtnSUFPQUlVSUFOQkJrWU5BQ0FBSUFFZ0Ntb3FBZ0E0QWhnZ0V3MEFJQUFnQVNBRWFpb0NBRGdDSEFzZ0JVRUJhaUlGSUF0SERRQUxEQUlMSUFVZ0MwOE5BU0FHSUE5QkFuUnFJUU1nQmlBUVFRSjBhaUVFSUFZZ0VVRUNkR29oQ2lBR0lBeEJBblJxSVFnZ0JpQVNRUUowYWlFTUlBWWdFMEVDZEdvaERTQUdJQUpCQW5ScUlRSURRQ0FISUFWQkJuUnFJZ0FnQmlBRlFRSjBJZ0ZxS2dJQU9BSUFJQUFnQVNBQ2Fpb0NBRGdDQkNBQUlBRWdEV29xQWdBNEFnZ2dBQ0FCSUF4cUtnSUFPQUlNSUFBZ0FTQUlhaW9DQURnQ0VDQUFJQUVnQ21vcUFnQTRBaFFnQUNBQklBUnFLZ0lBT0FJWUlBQWdBU0FEYWlvQ0FEZ0NIQ0FGUVFGcUlnVWdDMGNOQUFzTUFRc2dDeUFGSWdSclFRTnhJZ0FFUUVFQUlRZ0RRQ0FISUFSQkJuUnFJQVlnQkVFQ2RHb3FBZ0E0QWdBZ0JFRUJhaUVFSUFoQkFXb2lDQ0FBUncwQUN3c2dCU0FMYTBGOFN3MEFBMEFnQnlBRVFRWjBhaUFHSUFSQkFuUnFLZ0lBT0FJQUlBY2dCRUVCYWlJQVFRWjBhaUFHSUFCQkFuUnFLZ0lBT0FJQUlBY2dCRUVDYWlJQVFRWjBhaUFHSUFCQkFuUnFLZ0lBT0FJQUlBY2dCRUVEYWlJQVFRWjBhaUFHSUFCQkFuUnFLZ0lBT0FJQUlBUkJCR29pQkNBTFJ3MEFDd3NMbkFFQkJYOGpBRUh3QVdzaUJDUUFJQVFnQURZQ0FFRUJJUVVDUUNBQlFRSklEUUFnQUNFREEwQWdBQ0FEUVFocklnTWdBaUFCUVFKcklnZEJBblJxS0FJQWF5SUdFQ3RCQUU0RVFDQUFJQU1RSzBFQVRnMENDeUFFSUFWQkFuUnFJQVlnQXlBR0lBTVFLMEVBVGlJR0d5SUROZ0lBSUFWQkFXb2hCU0FCUVFGcklBY2dCaHNpQVVFQlNnMEFDd3NnQkNBRkVIWWdCRUh3QVdva0FBdWRBd0VFZnlBQklBQkJCR29pQkdwQkFXdEJBQ0FCYTNFaUJTQUNhaUFBSUFBb0FnQWlBV3BCQkd0TkJIOGdBQ2dDQkNJRElBQW9BZ2dpQmpZQ0NDQUdJQU0yQWdRZ0JDQUZSd1JBSUFBZ0FFRUVheWdDQUVGK2NXc2lBeUFGSUFScklnUWdBeWdDQUdvaUJUWUNBQ0FESUFWQmZIRnFRUVJySUFVMkFnQWdBQ0FFYWlJQUlBRWdCR3NpQVRZQ0FBc0NmeUFCSUFKQkdHcFBCRUFnQUNBQ2FpSUVJQUVnQW10QkNHc2lBVFlDQ0NBRVFRaHFJZ1VnQVVGOGNXcEJCR3NnQVVFQmNqWUNBQ0FFQW44Z0JDZ0NDRUVJYXlJQlFmOEFUUVJBSUFGQkEzWkJBV3NNQVFzZ0FXY2hBeUFCUVIwZ0EydDJRUVJ6SUFOQkFuUnJRZTRBYWlBQlFmOGZUUTBBR2tFL0lBRkJIaUFEYTNaQkFuTWdBMEVCZEd0Qnh3QnFJZ0VnQVVFL1R4c0xJZ05CQkhRaUFVSGd6UUZxTmdJTUlBUWdBVUhvelFGcUlnRW9BZ0EyQWhBZ0FTQUZOZ0lBSUFRb0FoQWdCVFlDQkVIbzFRRkI2TlVCS1FNQVFnRWdBNjJHaERjREFDQUFJQUpCQ0dvaUFUWUNBQ0FBSUFGQmZIRnFEQUVMSUFBZ0FXb0xRUVJySUFFMkFnQWdBRUVFYWdWQkFBc0x3Z0VCQTM4Q1FDQUNLQUlRSWdNRWZ5QURCU0FDRUVjTkFTQUNLQUlRQ3lBQ0tBSVVJZ1JySUFGSkJFQWdBaUFBSUFFZ0FpZ0NKQkVBQUE4TEFrQUNRQ0FDS0FKUVFRQklEUUFnQVVVTkFDQUJJUU1EUUNBQUlBTnFJZ1ZCQVdzdEFBQkJDa2NFUUNBRFFRRnJJZ01OQVF3Q0N3c2dBaUFBSUFNZ0FpZ0NKQkVBQUNJRUlBTkpEUUlnQVNBRGF5RUJJQUlvQWhRaEJBd0JDeUFBSVFWQkFDRURDeUFFSUFVZ0FSQVdHaUFDSUFJb0FoUWdBV28yQWhRZ0FTQURhaUVFQ3lBRUMxa0JBWDhnQUNBQUtBSklJZ0ZCQVdzZ0FYSTJBa2dnQUNnQ0FDSUJRUWh4QkVBZ0FDQUJRU0J5TmdJQVFYOFBDeUFBUWdBM0FnUWdBQ0FBS0FJc0lnRTJBaHdnQUNBQk5nSVVJQUFnQVNBQUtBSXdhallDRUVFQUM4d0NBUVIvSUFFZ0FQMEFBZ0Q5Q3dJQUlBRW9BaGdpQWdSQUlBRW9BaEFpQXdSL1FRQWhBZ05BSUFFb0FoZ2dBa0UwYkdvb0Fpd2lCQVJBSUFRUUZDQUJLQUlRSVFNTElBSkJBV29pQWlBRFNRMEFDeUFCS0FJWUJTQUNDeEFVSUFGQkFEWUNHQXNnQVNBQUtBSVFJZ0kyQWhBZ0FTQUNRVFJzRUJnaUFqWUNHQ0FDQkVBZ0FTZ0NFQVJBUVFBaEF3TkFJQUlnQTBFMGJDSUZhaUlDSUFBb0FoZ2dCV29pQlAwQUFnRDlDd0lBSUFJZ0JDZ0NNRFlDTUNBQ0lBVDlBQUlnL1FzQ0lDQUNJQVQ5QUFJUS9Rc0NFQ0FCS0FJWUlnSWdCV3BCQURZQ0xDQURRUUZxSWdNZ0FTZ0NFRWtOQUFzTElBRWdBQ2dDRkRZQ0ZDQUJJQUFvQWlBaUFqWUNJQ0FDQkVBZ0FTQUNFQmdpQWpZQ0hDQUNSUVJBSUFGQ0FEY0NIQThMSUFJZ0FDZ0NIQ0FBS0FJZ0VCWWFEd3NnQVVFQU5nSWNEd3NnQVVFQU5nSVFJQUZCQURZQ0dBc0VBRUVCQzhZQkFRTi9BMEFnQUVFRWRDSUJRZVROQVdvZ0FVSGd6UUZxSWdJMkFnQWdBVUhvelFGcUlBSTJBZ0FnQUVFQmFpSUFRY0FBUncwQUMwRXdFSG9hSXdCQkVHc2lBQ1FBQWtBZ0FFRU1haUFBUVFocUVCQU5BRUh3MVFGQkNDQUFLQUlNUVFKMFFRUnFFQ2tpQVRZQ0FDQUJSUTBBUVFnZ0FDZ0NDQkFwSWdFRVFFSHcxUUVvQWdBaUFpQUFLQUlNUVFKMGFrRUFOZ0lBSUFJZ0FSQVBSUTBCQzBIdzFRRkJBRFlDQUFzZ0FFRVFhaVFBUVl6V0FVRXFOZ0lBUWRUV0FVR1kxd0UyQWdBTGtnWUNCSDhEZXlNQVFSQnJJZ1lrQUFKL0lBQW9BZ2hCRUVZRVFDQUFLQUswQVNBQUtBTGtBVUdNTEd4cURBRUxJQUFvQWd3TElRQUNRQ0FES0FJQUlnVkZCRUJCQUNFQ0lBUkJBVUd0RkVFQUVCTU1BUXNnQUNnQzBDc2dBeUFGUVFGck5nSUFJQUlnQmtFTWFrRUJFQlVnQVVHNENHeHFJZ2NnQmlnQ0RDSUFRUVYyTmdLa0JpQUhJQUJCSDNFaUFUWUNHQ0FDUVFGcUlRQWdBd0ovQW44Q1FBSi9Ba0FDUUNBQkRnSUFBd0VMSUFNb0FnQU1BUXNnQXlnQ0FFRUJkZ3NpQlVIaUFFOEVmeUFHUXVHQWdJQ1FERGNDQkNBR0lBVTJBZ0FnQkVFQ1FaUDlBQ0FHRUJNZ0J5Z0NHQVVnQVFzRVFDQUZJZ0VOQVVFQURBSUxJQVVFUUNBSFFSeHFJUUZCQUNFQ0EwQWdBQ0FHUVF4cVFRRVFGU0FDUWVBQVRRUkFJQVlvQWd3aEJDQUJJQUpCQTNScUlnaEJBRFlDQkNBSUlBUkJBM1kyQWdBTElBQkJBV29oQUNBQ1FRRnFJZ0lnQlVjTkFBc0xJQVVnQXlnQ0FDSUFTd1JBUVFBaEFnd0VDeUFBSUFWckRBSUxJQWRCSEdvaEJFRUFJUUlEUUNBQUlBWkJER3BCQWhBVklBSkI0QUJOQkVBZ0JDQUNRUU4wYWlJRklBWW9BZ3dpQ0VIL0QzRTJBZ1FnQlNBSVFRdDJOZ0lBQ3lBQVFRSnFJUUFnQWtFQmFpSUNJQUZIRFFBTElBRkJBWFFMSVFBZ0FDQURLQUlBSWdGTEJFQkJBQ0VDREFJTElBRWdBR3NMTmdJQVFRRWhBaUFIS0FJWVFRRkhEUUFnQjBFY2FpRUVJQWY5Q1FJY0lRc2dCeWdDSUNFRC9Rd0JBQUFBQWdBQUFBTUFBQUFFQUFBQUlRcEJBQ0VCQTBBZ0JDQUJRUU4wYWlJQVFSaHFJQXNnQ3YwTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8ydUFTSUovUnNBUVFOdS9SRWdDZjBiQVVFRGJ2MGNBU0FKL1JzQ1
20FRTnUvUndDSUFuOUd3TkJBMjc5SEFQOXNRSDlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDl1QUVpQ2YxYUFnQUNJQUJCRUdvZ0NmMWFBZ0FCSUFCQkNHb2dDZjFhQWdBQUlBUWdBVUVFYWlJQlFRTjBhaUlGSUFuOVdnSUFBeUFBSUFNMkFod2dBQ0FETmdJVUlBQWdBellDRENBRklBTTJBZ1FnQ3YwTUJBQUFBQVFBQUFBRUFBQUFCQUFBQVAydUFTRUtJQUZCNEFCSERRQUxDeUFHUVJCcUpBQWdBZ3VFQndFR2Z5TUFRU0JySWdZa0FBSi9JQUFvQWdoQkVFWUVRQ0FBS0FLMEFTQUFLQUxrQVVHTUxHeHFEQUVMSUFBb0Fnd0xJUVVDUUNBREtBSUFRUVJOQkVCQkFDRUFJQVJCQVVHS0ZFRUFFQk1NQVFzZ0FpQUZLQUxRS3lBQlFiZ0liR29pQlNJSlFRUnFRUUVRRlNBRklBVW9BZ1JCQVdvaUJ6WUNCQ0FIUVNKUEJFQWdCa0VoTmdJRUlBWWdCellDQUNBRVFRRkJyanNnQmhBVFFRQWhBQXdCQ3lBSElBQW9BcmdCSWdoTkJFQWdCaUFITmdJWUlBWWdDRFlDRkNBR0lBRTJBaEFnQkVFQlFZS0FBU0FHUVJCcUVCTWdBQ0FBS0FJSVFZQ0FBbkkyQWdoQkFDRUFEQUVMSUFKQkFXb2dCVUVJYWtFQkVCVWdCU0FGS0FJSVFRSnFOZ0lJSUFKQkFtb2dCVUVNYWtFQkVCVWdCU0FGS0FJTVFRSnFJZ0EyQWd3Q1FBSkFJQVVvQWdnaUFVRUtTdzBBSUFCQkNrc05BQ0FBSUFGcVFRMUpEUUVMUVFBaEFDQUVRUUZCdHlwQkFCQVREQUVMSUFKQkEyb2dCVUVRYWtFQkVCVWdCUzBBRUVHQUFYRUVRRUVBSVFBZ0JFRUJRZjh5UVFBUUV3d0JDeUFDUVFScUlBVkJGR3BCQVJBVklBVW9BaFJCQWs4RVFFRUFJUUFnQkVFQlFiNHlRUUFRRXd3QkN5QURJQU1vQWdCQkJXc2lCellDQUVFQklRQWdCU2dDQkNFQkFrQWdCUzBBQUVFQmNVVUVRQ0FCUlEwQ0lBVkJzQWRxSVFJZ0JVR3NCbW9oQkVFQUlRVWdBVUVEVFEwQklBRkJmSEVoQlVFQUlRTURRQ0FFSUFOQkFuUWlCMnI5REE4QUFBQVBBQUFBRHdBQUFBOEFBQUQ5Q3dJQUlBSWdCMnI5REE4QUFBQVBBQUFBRHdBQUFBOEFBQUQ5Q3dJQUlBTkJCR29pQXlBRlJ3MEFDeUFCSUFWSERRRU1BZ3NnQVNBSFRRUkFBa0FnQVVVRVFFRUFJUUVNQVFzZ0FrRUZhaUFHUVJ4cVFRRVFGU0FGSUFZb0Fod2lBRUVFZGpZQ3NBY2dCU0FBUVE5eE5nS3NCaUFGS0FJRUlnRkJBazhFUUNBRlFiQUhhaUVISUFWQnJBWnFJUWdnQWtFR2FpRUFRUUVoQlFOQUlBQWdCa0VjYWtFQkVCVUNRQ0FHS0FJY0lnRkJFRThFUUNBQlFROXhJZ0lOQVF0QkFDRUFJQVJCQVVIa0xrRUFFQk1NQmdzZ0NDQUZRUUowSWdwcUlBSTJBZ0FnQnlBS2FpQUJRUVIyTmdJQUlBQkJBV29oQUNBRlFRRnFJZ1VnQ1NnQ0JDSUJTUTBBQ3dzZ0F5Z0NBQ0VIQ3lBRElBY2dBV3MyQWdCQkFTRUFEQUlMUVFBaEFDQUVRUUZCaWhSQkFCQVREQUVMQTBBZ0JDQUZRUUowSWdCcVFRODJBZ0FnQUNBQ2FrRVBOZ0lBUVFFaEFDQUZRUUZxSWdVZ0FVa05BQXNMSUFaQklHb2tBQ0FBQzFJQUlBRWdBQzBBQURvQUJ5QUJJQUF0QUFFNkFBWWdBU0FBTFFBQ09nQUZJQUVnQUMwQUF6b0FCQ0FCSUFBdEFBUTZBQU1nQVNBQUxRQUZPZ0FDSUFFZ0FDMEFCam9BQVNBQklBQXRBQWM2QUFBTGtnRUJCSDhnQUNBQk5nSzRBUUpBSUFBb0FtQWlBMFVOQUNBREtBSVlJZ1pGRFFBZ0FDZ0NEQ0lFUlEwQUlBUW9BdEFyUlEwQUlBTW9BaEFpQkVVRVFFRUJEd3RCQUNFREEwQWdBQ2dDRENnQzBDc2dBMEc0Q0d4cUtBSUVJQUZOQkVBZ0FrRUJRYlRIQUVFQUVCTkJBQThMSUFZZ0EwRTBiR29nQVRZQ0tFRUJJUVVnQTBFQmFpSURJQVJIRFFBTEN5QUZDNlVIQWdsL0NINGpBRUVRYXlJTEpBQUNRQ0FDUlFSQUlBTkJBVUhJMmdCQkFCQVREQUVMSUFJb0FoQWlDU0FBS0FKZ0lnY29BaEJKQkVBZ0EwRUJRYVhTQUVFQUVCTU1BUXNnQUNnQ2dBRWlCU0FBS0FLRUFXd2lCaUFFVFFSQUlBc2dCRFlDQUNBTElBWkJBV3MyQWdRZ0EwRUJRY1gvQUNBTEVCTkJBQ0VGREFFTElBSWdBQ2dDYkNBRUlBVWdCQ0FGYmlJR2JHc2lDQ0FBS0FKMGJHb2lCVFlDQUNBQ0lBVWdCeWdDQUNJSElBVWdCMHNiSWdjMkFnQWdBaUFBS0FKc0lBQW9BblFnQ0VFQmFteHFJZ1UyQWdnZ0FpQUZJQUFvQW1Bb0FnZ2lDQ0FGSUFoSkd5SUlOZ0lJSUFJZ0FDZ0NjQ0FBS0FKNElBWnNhaUlGTmdJRUlBSWdCU0FBS0FKZ0tBSUVJZ29nQlNBS1N4c2lDallDQkNBQ0lBQW9BbkFnQUNnQ2VDQUdRUUZxYkdvaUJUWUNEQ0FDSUFVZ0FDZ0NZQ2dDRENJR0lBVWdCa2tiSWdVMkFnd2dBQ2dDWUNJTUtBSVFJZ1lFUUNBRnJFSUJmU0VSSUFpc1FnRjlJUklnQ3ExQ0FYMGhFeUFIclVJQmZTRVVJQXdvQWhnaENDQUNLQUlZSVFWQkFDRUhBMEFnQlNBSUlBZEJOR3hxS0FJb0lnbzJBaWdnQlNBVUlBVW9BZ0FpREswaURud2dEb0FpRlQ0Q0VDQUZJQk1nQlNnQ0JDSU5yU0lPZkNBT2dDSVFQZ0lVSUFWQ2Z5QUtyU0lPaGlJUElCREVmU0FPaDZjZ0R5QVJJQTJzSWhCOElCQi94SDBnRG9lbmF6WUNEQ0FGSUE4Z0ZjUjlJQTZIcHlBUElCSWdES3dpRDN3Z0QzL0VmU0FPaDZkck5nSUlJQVZCTkdvaEJTQUhRUUZxSWdjZ0JrY05BQXNMSUFZZ0NVa0VRQ0FDS0FJWUlRVURRQ0FGSUFaQk5Hd2lCMm9vQWl3UUZDQUNLQUlZSWdVZ0IycEJBRFlDTENBR1FRRnFJZ1lnQWlnQ0VFa05BQXNnQWlBQUtBSmdLQUlRTmdJUUN5QUFLQUprSWdVRVFDQUZFQ1VMSUFCQkFVRWtFQmNpQmpZQ1pFRUFJUVVnQmtVTkFDQUNJQVlRU0NBQUlBUTJBaXdnQUNnQzJBRkJHQ0FERUNoRkRRQWdBQ2dDMkFFaUNTZ0NBQ0VFSUFrb0FnZ2hCZ0pBSUFRRVFFRUJJUVVnQkVFQmNTRUlJQVJCQVVZRWYwRUFCU0FFUVg1eElRUkJBQ0VIQTBBQ2YwRUFJQVZGRFFBYVFRQWdBQ0FCSUFNZ0JpZ0NBQkVBQUVVTkFCb2dBQ0FCSUFNZ0JpZ0NCQkVBQUVFQVJ3c2hCU0FHUVFocUlRWWdCMEVDYWlJSElBUkhEUUFMSUFWRkN5RUVRUUFnQlNBSUd5RUZBa0FnQ0VVTkFDQUVEUUFnQUNBQklBTWdCaWdDQUJFQUFFRUFSeUVGQ3lBSlFRQTJBZ0FnQlEwQklBQW9BbUFRSlVFQUlRVWdBRUVBTmdKZ0RBSUxJQWxCQURZQ0FBc2dBQ0FDRUZBaEJRc2dDMEVRYWlRQUlBVUw4Z01CQlg4Q1FBSkFJQUFvQWp3aUFrVUVRQ0FCS0FJUURRRkJBUThMSUFKQk5Hd1FHQ0lGUlEwQklBRW9BaEFFUUNBQktBSVlJUUlEUUNBQ0lBTkJOR3dpQkdvb0Fpd1FGQ0FCS0FJWUlnSWdCR3BCQURZQ0xDQURRUUZxSWdNZ0FTZ0NFQ0lFU1EwQUN3c2dBU0FBS0FJOEJIOGdBQ2dDWkNnQ0dDRURRUUFoQWdOQUlBVWdBa0UwYkdvaUJDQURJQUFvQWtBZ0FrRUNkR29vQWdCQk5Hd2lCbW9pQS8wQUFnRDlDd0lBSUFRZ0F5Z0NNRFlDTUNBRUlBUDlBQUlnL1FzQ0lDQUVJQVA5QUFJUS9Rc0NFQ0FFSUFBb0FtUW9BaGdpQXlBR2FpSUdLQUlrTmdJa0lBUWdCaWdDTERZQ0xDQUdRUUEyQWl3Z0FrRUJhaUlDSUFBb0Fqd2lCa2tOQUFzZ0FTZ0NFQVVnQkFzRWZ5QUFLQUprS0FJWUlRSkJBQ0VEQTBBZ0FpQURRVFJzSWdScUtBSXNFQlFnQUNnQ1pDZ0NHQ0lDSUFScVFRQTJBaXdnQTBFQmFpSURJQUVvQWhCSkRRQUxJQUFvQWp3RklBWUxOZ0lRSUFFb0FoZ1FGQ0FCSUFVMkFoaEJBUThMSUFFb0FoZ2hCQ0FBS0FKa0tBSVlJUU5CQUNFQ0EwQWdCQ0FDUVRSc0lnVnFJZ1
20FnQXlBRmFpZ0NKRFlDSkNBRUtBSXNFQlFnQVNnQ0dDSUVJQVZxSUFBb0FtUW9BaGdpQXlBRmFpSUZLQUlzTmdJc0lBVkJBRFlDTENBQ1FRRnFJZ0lnQVNnQ0VFa05BQXRCQVE4TElBQW9BbUFRSlNBQVFRQTJBbUJCQUF2RkJBRUlmd0pBSUFKRkRRQUNRQ0FBS0FLNEFTSUZSUTBBSUFBb0FtQWlCRVVOQUNBRUtBSVFSUTBBSUFRb0FoZ29BaWdnQlVjTkFDQUNLQUlRSWdoRkRRQWdBaWdDR0NJR0tBSW9EUUFnQmlnQ0xBMEFRUUFoQkNBSVFRaFBCRUFnQ0VGNGNTRUpBMEFnQmlBRVFUUnNhaUFGTmdJb0lBWWdCRUVCY2tFMGJHb2dCVFlDS0NBR0lBUkJBbkpCTkd4cUlBVTJBaWdnQmlBRVFRTnlRVFJzYWlBRk5nSW9JQVlnQkVFRWNrRTBiR29nQlRZQ0tDQUdJQVJCQlhKQk5HeHFJQVUyQWlnZ0JpQUVRUVp5UVRSc2FpQUZOZ0lvSUFZZ0JFRUhja0UwYkdvZ0JUWUNLQ0FFUVFocUlRUWdDa0VJYWlJS0lBbEhEUUFMQ3lBSVFRZHhJZ2dFUUFOQUlBWWdCRUUwYkdvZ0JUWUNLQ0FFUVFGcUlRUWdDMEVCYWlJTElBaEhEUUFMQ3lBQ0lBTVFQdzBBUVFBUEN5QUFLQUprSWdWRkJFQWdBRUVCUVNRUUZ5SUZOZ0prSUFWRkRRRUxJQUlnQlJCSUlBQW9BdGdCUVJZZ0F4QW9SUTBBSUFBb0F0Z0JJZ1lvQWdBaEJDQUdLQUlJSVFVQ1FDQUVCRUJCQVNFSElBUkJBWEVoQ0NBRVFRRkdCSDlCQUFVZ0JFRitjU0VKUVFBaEJBTkFBbjlCQUNBSFJRMEFHa0VBSUFBZ0FTQURJQVVvQWdBUkFBQkZEUUFhSUFBZ0FTQURJQVVvQWdRUkFBQkJBRWNMSVFjZ0JVRUlhaUVGSUFSQkFtb2lCQ0FKUncwQUN5QUhSUXNoQkVFQUlBY2dDQnNoQndKQUlBaEZEUUFnQkEwQUlBQWdBU0FESUFVb0FnQVJBQUJCQUVjaEJ3c2dCa0VBTmdJQUlBY05BU0FBS0FKZ0VDVWdBRUVBTmdKZ1FRQVBDeUFHUVFBMkFnQUxJQUFnQWhCUUlRY0xJQWNMK0FRQkJuOENRRUVCUVRBUUZ5SUNCSDhnQWlBQUtBTGdBU0lCL1FBREFQMExBd0FnQWlBQktRTVFOd01RSUFJZ0FTZ0NHQ0lCTmdJWUlBSWdBVUVZYkJBWUlnRTJBaHdnQVVVRVFDQUNFQlJCQUE4TEFrQWdBQ2dDNEFFb0Fod2lBd1JBSUFFZ0F5QUNLQUlZUVJoc0VCWWFEQUVMSUFFUUZDQUNRUUEyQWh3TElBSWdBQ2dDNEFFb0FpUWlBVFlDSkNBQ0lBRkJLQkFYSWdFMkFpZ2dBVVVFUUNBQ0tBSWNFQlFnQWhBVVFRQVBDd0pBSUFBb0F1QUJLQUlvQkVBZ0FpZ0NKRVVOQVFOQUlBRWdCVUVvYkNJRGFpQUFLQUxnQVNnQ0tDQURhaWdDRkNJQk5nSVVJQUZCR0d3UUdDRUJJQUlvQWlnaUJDQURhaUlHSUFFMkFoZ2dBVVVFUUNBRkJIOUJBQ0VCQTBBZ0FpZ0NLQ0FCUVNoc2FpZ0NHQkFVSUFGQkFXb2lBU0FGUncwQUN5QUNLQUlvQlNBRUN4QVVEQVVMQWtBZ0FDZ0M0QUVvQWlnZ0Eyb29BaGdpQkFSQUlBRWdCQ0FHS0FJVVFSaHNFQllhSUFJb0FpZ2hBUXdCQ3lBQkVCUWdBaWdDS0NJQklBTnFRUUEyQWhnTElBRWdBMm9nQUNnQzRBRW9BaWdnQTJvb0FnUWlBVFlDQkNBQlFSaHNFQmdoQVNBQ0tBSW9JZ1FnQTJvaUJpQUJOZ0lRSUFGRkJFQWdCUVIvUVFBaEFRTkFJQUZCS0d3aUFDQUNLQUlvYWlnQ0dCQVVJQUlvQWlnZ0FHb29BaEFRRkNBQlFRRnFJZ0VnQlVjTkFBc2dBaWdDS0FVZ0JBc1FGQXdGQ3dKQUlBQW9BdUFCS0FJb0lBTnFLQUlRSWdRRVFDQUJJQVFnQmlnQ0JFRVliQkFXR2lBQ0tBSW9JUUVNQVFzZ0FSQVVJQUlvQWlnaUFTQURha0VBTmdJUUN5QUJJQU5xUWdBM0FpQWdCVUVCYWlJRklBSW9BaVJKRFFBTERBRUxJQUVRRkNBQ1FRQTJBaWdMSUFJRlFRQUxEd3NnQWlnQ0hCQVVJQUlRRkVFQUM2QUdBUTUvSXdCQkVHc2lDQ1FBSUFBb0FtQW9BaEFoRFNBSVFRRkJPQkFYSWdFMkFnd0NRQ0FCUlEwQUlBRWdBQ2dDWUNnQ0VDSUpOZ0lZSUFFZ0FQMEFBbXo5Q3dJQUlBRWdBQ2dDZ0FFMkFoQWdBQ2dDaEFFaEF5QUJRUUEyQWpRZ0FTQUROZ0lVSUFFZ0FDZ0NEQ0lNS0FJQU5nSWdJQUVnRENnQ0JEWUNKQ0FCSUF3b0FnZzJBaWdnQVNBTUtBSVFOZ0lzSUFFZ0NVRzRDQkFYSWdBMkFqQWdBQVJBSUEwRVFBTkFJQTVCdUFoc0lnQWdEQ2dDMEN0cUlnUW9BZ1FoQWlBQktBSXdJQUJxSWdVZ0JQMEFBZ0Q5Q3dJRUlBVWdCQ2dDRURZQ0ZDQUZJQVFvQWhRMkFoZ2dBa0VnVFFSQUlBVkJ0QWRxSUFSQnNBZHFJQUlRRmhvZ0JVR3dCbW9nQkVHc0Jtb2dCQ2dDQkJBV0dnc2dCU0FFS0FJWUlnQTJBaHdnQlNBRUtBS2tCallDcUFaQkFTRUdBa0FnQUVFQlJ3UkFJQVFvQWdSQkEyd2lBRUVEYTBIZkFFc05BU0FBUVFKcklRWUxJQVZCcEFOcUlRa2dCVUVnYWlFS0lBUkJIR29oQzBFQUlRQUNRQ0FHUVFoSkRRQWdCQ0FHUVFOMGFrRWNhaUFLU3dSQUlBc2dCU0FHUVFKMGFrR2tBMnBKRFFFTElBWkJmSEVoQUVFQUlRTURRQ0FLSUFOQkFuUWlBbW9nQ3lBRFFRTjBhaUlIUVJ4cUlBZEJGR29nQjBFTWFpQUgvVndDQlAxV0FnQUIvVllDQUFMOVZnSUFBLzBMQWdBZ0FpQUphaUFIUVJocUlBZEJFR29nQjBFSWFpQUgvVndDQVAxV0FnQUIvVllDQUFMOVZnSUFBLzBMQWdBZ0EwRUVhaUlESUFCSERRQUxJQUFnQmtZTkFRc2dBRUVCY2lFQ0lBWkJBWEVFUUNBS0lBQkJBblFpQTJvZ0N5QUFRUU4wYWlJQUtBSUVOZ0lBSUFNZ0NXb2dBQ2dDQURZQ0FDQUNJUUFMSUFJZ0JrWU5BQU5BSUFvZ0FFRUNkQ0lEYWlBTElBQkJBM1JxSWdJb0FnUTJBZ0FnQXlBSmFpQUNLQUlBTmdJQUlBb2dBRUVCYWlJQ1FRSjBJZ05xSUFzZ0FrRURkR29pQWlnQ0JEWUNBQ0FESUFscUlBSW9BZ0EyQWdBZ0FFRUNhaUlBSUFaSERRQUxDeUFGSUFRb0FxZ0dOZ0tzQmlBT1FRRnFJZzRnRFVjTkFBc0xJQUVoQWd3QkN5QUlRUXhxQkVBZ0NDZ0NEQ0lCS0FJd0lnQUVmeUFBRUJRZ0NDZ0NEQVVnQVFzUUZDQUlRUUEyQWd3TEN5QUlRUkJxSkFBZ0FndjVCQUVJZnlNQVFZQUNheUlESkFBZ0FBUkFRZWtOUVJFZ0FoQWhJQU1nQUNnQ0FEWUM4QUVnQWtHSEVpQURRZkFCYWhBYUlBTWdBQ2dDQkRZQzRBRWdBa0dVRWlBRFFlQUJhaEFhSUFNZ0FDZ0NDRFlDMEFFZ0FrRzNPQ0FEUWRBQmFoQWFJQU1nQUNnQ0VEWUN3QUVnQWtIcUVTQURRY0FCYWhBYUlBRkJBRW9FUUFOQUlBQW9BdEFySVFRZ0F5QUhOZ0t3QVNBQ1FZOE9JQU5Cc0FGcUVCb2dBeUFFSUFkQnVBaHNhaUlFS0FJQU5nS2dBU0FDUVlZU0lBTkJvQUZxRUJvZ0F5QUVLQUlFTmdLUUFTQUNRYWs1SUFOQmtBRnFFQm9nQXlBRUtBSUlOZ0tBQVNBQ1FkVTNJQU5CZ0FGcUVCb2dBeUFFS0FJTU5nSndJQUpCNVRjZ0EwSHdBR29RR2lBRElBUW9BaEEyQW1BZ0FrSDFFU0FEUWVBQWFoQWFJQU1nQkNnQ0ZEWUNVQ0FDUWVzNUlBTkIwQUJxRUJwQitndEJGeUFDRUNFZ0JDZ0NCQVJBSUFSQnNBZHFJUVlnQkVHc0Jtb2hDRUVBSVFVRFFDQUlJQVZCQW5RaUNXb29BZ0FoQ2lBRElBWWdDV29vQWdBMkFrUWdBeUFLTmdKQUlBSkIrQXdnQTBGQWF4QWFJQVZCQVdvaUJTQUVLQUlFU1EwQUN3c2dBaEI3SUFNZ0JDZ0NHRFlDTUNBQ1FmVTNJQU5CTUdvUUdpQURJQVFvQXFRR05nSWdJQUpCcGpnZ0EwRWdhaEFhUVFFaEJrR1NERUVVSUFJUUlRSkFJQVFvQWhoQkFVY0VRQ0FFS0FJRUlnVkJBRXdOQVNBRlFRTnNRUUpySVFZTElBUkJIR29oQ0VFQUlRVURRQ0FESUFnZ0JVRURkR29wQWdCQ0lJazNBeEFnQWtINERDQURRUkJxRUJvZ0JVRUJhaUlGSUFaSERRQUxDeUFDRUhzZ0F5QUVLQUtvQmpZQ0FDQUNRWlU0SUFNUUdrR0dEVUVGSUFJUUlTQUhRUUZxSWdjZ0FVY05BQXNMUVljTlFRUWdBaEFoQ3lBRFFZQUNhaVFBQytzSkF3bC9BWDRCZXlNQVFiQUJheUlGSkFBQ1FDQUJRWUFEY1FSQVFaSXVRUXNnQWhBaERBRUxBa0FnQVVFQm
20NVVU5BQ0FBS0FKZ0lnWkZEUUFqQUVIUUFHc2lBeVFBUWRzTlFRMGdBaEFoSUFOQkFEb0FUeUFEUVFrNkFFNGdBeUFHS1FJQU53SkVJQU1nQTBIT0FHb2lCRFlDUUNBQ1FiczZJQU5CUUdzUUdpQURJQVlwQWdnM0FqUWdBeUFFTmdJd0lBSkJxam9nQTBFd2FoQWFJQU1nQmlnQ0VEWUNKQ0FESUFRMkFpQWdBa0hJT0NBRFFTQnFFQm9DUUNBR0tBSVlSUTBBSUFZb0FoQkZEUUFEUUNBRElBTkJ6Z0JxSWdzMkFoQWdBeUFJTmdJVUlBSkIrdzBnQTBFUWFoQWFJQVlvQWhnZ0NFRTBiR29oQ1NNQVFUQnJJZ1FrQUNBRVFRazdBQzRnQkVFSk9nQXRJQVFnQ1NrQ0FEY0NKQ0FFSUFSQkxXb2lDallDSUNBQ1FZUTRJQVJCSUdvUUdpQUVJQWtvQWhnMkFoUWdCQ0FLTmdJUUlBSkIramtnQkVFUWFoQWFJQVFnQ1NnQ0lEWUNCQ0FFSUFvMkFnQWdBa0hmT1NBRUVCb2dCRUV3YWlRQUlBTWdDellDQUNBQ1FZRU5JQU1RR2lBSVFRRnFJZ2dnQmlnQ0VFa05BQXNMUVlrTlFRSWdBaEFoSUFOQjBBQnFKQUFMQWtBZ0FVRUNjVVVOQUNBQUtBSmdSUTBBUWVZT1FTUWdBaEFoSUFVZ0FDa0NiRGNEb0FFZ0FrSFVFaUFGUWFBQmFoQWFJQVVnQUNrQ2REY0RrQUVnQWtHeUVpQUZRWkFCYWhBYUlBVWdBQ2tEZ0FFM0E0QUJJQUpCeEJJZ0JVR0FBV29RR2lBQUtBSU1JQUFvQW1Bb0FoQWdBaEJVUVlrTlFRSWdBaEFoQ3dKQUlBRkJDSEZGRFFBZ0FDZ0NZRVVOQUNBQUtBS0FBU0FBS0FLRUFXd2lCRVVOQUNBQUtBSzBBU0VEQTBBZ0F5QUFLQUpnS0FJUUlBSVFWQ0FEUVl3c2FpRURJQWRCQVdvaUJ5QUVSdzBBQ3dzZ0FVRVFjVVVOQUNBQUtBTGdBU0VBUWNBT1FTVWdBaEFoSUFVZ0FQMEFBd0Q5Q3dSd0lBSkJ2U3dnQlVId0FHb1FHa0d1RGtFUklBSVFJUUpBSUFBb0FoeEZEUUFnQUNnQ0dFVU5BRUVBSVFNRFFDQUFLQUljSUFOQkdHeHFJZ0V2QVFBaEJDQUJLUU1JSVF3Z0JTQUJLQUlRTmdKZ0lBVWdERGNEV0NBRklBUTJBbEFnQWtIQU9TQUZRZEFBYWhBYUlBTkJBV29pQXlBQUtBSVlTUTBBQ3d0Qmh3MUJCQ0FDRUNFQ1FDQUFLQUlvSWdSRkRRQWdBQ2dDSkNJR1JRMEFRUUFoQjBFQUlRTURRQUpBSUFRZ0EwRW9iR29pQVNnQ0JDSUlSUTBBSUFFb0FoQWlBVVVOQUNBQktRTUFRZ0JYRFFBZ0FTa0RDRUlBVWcwQVFmb0tFSGdOQWdzZ0J5QUlhaUVISUFOQkFXb2lBeUFHUncwQUN5QUhSUTBBUVowT1FSQWdBaEFoSUFBb0FpUUVRQ0FBS0FJb0lRRkJBQ0VIQTBBZ0JTQUJJQWRCS0d3aUJHb29BZ1FpQmpZQ1JDQUZJQWMyQWtBZ0FrR0dPaUFGUVVCckVCb2dBQ2dDS0NFQkFrQWdCa1VOQUVFQUlRTWdBU0FFYWlnQ0VFVU5BQU5BSUFBb0FpZ2dCR29vQWhBZ0EwRVliR29pQWYwQUF3QWhEU0FGSUFFcEF4QTNBemdnQlNBTi9Rc0RLQ0FGSUFNMkFpQWdBa0dWMVFBZ0JVRWdhaEFhSUFOQkFXb2lBeUFHUncwQUN5QUFLQUlvSVFFTEFrQWdBU0FFYWlJR0tBSVlSUTBBUVFBaEF5QUdLQUlVUlEwQUEwQWdBU0FFYWlnQ0dDQURRUmhzYWlJQkx3RUFJUVlnQVNrRENDRU1JQVVnQVNnQ0VEWUNFQ0FGSUF3M0F3Z2dCU0FHTmdJQUlBSkJ3RGtnQlJBYUlBTkJBV29pQXlBQUtBSW9JZ0VnQkdvb0FoUkpEUUFMQ3lBSFFRRnFJZ2NnQUNnQ0pFa05BQXNMUVljTlFRUWdBaEFoQzBHSkRVRUNJQUlRSVFzZ0JVR3dBV29rQUF1UkFnRURmd0pBUVFGQmdBSVFGeUlCQkg4Z0FVRUJOZ0lBSUFGQkFUWUMwQUVnQVNBQkxRRFVBVUVHY2pvQTFBRWdBVUVCUVl3c0VCY2lBRFlDRENBQVJRMEJJQUZCQVVIb0J4QVhJZ0EyQWhBZ0FFVU5BU0FCUWdBM0F6QWdBVUYvTmdJc0lBRkI2QWMyQWhRQ1FFRUJRVEFRRnlJQUJFQWdBRUVBTmdJWUlBQkI1QUEyQWlBZ0FFSGtBRUVZRUJjaUFqWUNIQ0FDRFFFZ0FCQVVDeUFCUVFBMkF1QUJEQUlMSUFCQkFEWUNLQ0FCSUFBMkF1QUJJQUVRT1NJQU5nTGNBU0FBUlEwQklBRVFPU0lBTmdMWUFTQUFSUTBCQWtCQjVnb1FlRVVOQUFzZ0FVRUFFSE1pQURZQzdBRWdBRVVFUUNBQlFRQVFjeUlBTmdMc0FTQUFSUTBDQ3lBQkJVRUFDdzhMSUFFUVFFRUFDNUFKQWdsL0FYNGpBRUhRQVdzaUJ5UUFJQUFvQW1BaENRSkFBa0FDUUNBQUtBS0FBVUVCUncwQUlBQW9Bb1FCUVFGSERRQWdBQ2dDdEFFb0F0d3JEUUVMSUFBb0FnaEJDRVlOQUNBR1FRRkIwZElBUVFBUUV3d0JDd0pBSUFFb0FoQWlERVVOQUNBQUtBSzRBU0VLSUFFb0FoZ2hDeUFNUVFoUEJFQWdERUY0Y1NFUEEwQWdDeUFJUVRSc2FpQUtOZ0lvSUFzZ0NFRUJja0UwYkdvZ0NqWUNLQ0FMSUFoQkFuSkJOR3hxSUFvMkFpZ2dDeUFJUVFOeVFUUnNhaUFLTmdJb0lBc2dDRUVFY2tFMGJHb2dDallDS0NBTElBaEJCWEpCTkd4cUlBbzJBaWdnQ3lBSVFRWnlRVFJzYWlBS05nSW9JQXNnQ0VFSGNrRTBiR29nQ2pZQ0tDQUlRUWhxSVFnZ0RrRUlhaUlPSUE5SERRQUxDeUFNUVFkeElneEZEUUFEUUNBTElBaEJOR3hxSUFvMkFpZ2dDRUVCYWlFSUlBMUJBV29pRFNBTVJ3MEFDd3NnQWlBRGNpQUVjaUFGY2tVRVFDQUdRUVJCb3pGQkFCQVRJQUJDQURjQ0hDQUFJQUFwQW9BQk53SWtJQUVnQ2YwQUFnRDlDd0lBSUFFZ0JoQS9JUWdNQVFzZ0FrRUFTQVJBSUFjZ0FqWUNBQ0FHUVFGQmxlSUFJQWNRRTBFQUlRZ01BUXNnQ1NnQ0NDSUlJQUpKQkVBZ0J5QUlOZ0lVSUFjZ0FqWUNFQ0FHUVFGQjZlVUFJQWRCRUdvUUUwRUFJUWdNQVFzQ1FDQUpLQUlBSWdnZ0Frc0VRQ0FISUFnMkFzUUJJQWNnQWpZQ3dBRWdCa0VDUWNub0FDQUhRY0FCYWhBVElBQkJBRFlDSENBSktBSUFJUUlNQVFzZ0FDQUNJQUFvQW14cklBQW9BblJ1TmdJY0N5QUJJQUkyQWdBZ0EwRUFTQVJBSUFjZ0F6WUNJQ0FHUVFGQjFlRUFJQWRCSUdvUUUwRUFJUWdNQVFzZ0NTZ0NEQ0lDSUFOSkJFQWdCeUFDTmdJMElBY2dBellDTUNBR1FRRkJ2T1FBSUFkQk1Hb1FFMEVBSVFnTUFRc0NRQ0FKS0FJRUlnSWdBMHNFUUNBSElBSTJBclFCSUFjZ0F6WUNzQUVnQmtFQ1Facm5BQ0FIUWJBQmFoQVRJQUJCQURZQ0lDQUpLQUlFSVFNTUFRc2dBQ0FESUFBb0FuQnJJQUFvQW5odU5nSWdDeUFCSUFNMkFnUkJBQ0VJSUFSQkFFd0VRQ0FISUFRMkFrQWdCa0VCUVpQaEFDQUhRVUJyRUJNTUFRc2dDU2dDQUNJQ0lBUkxCRUFnQnlBQ05nSlVJQWNnQkRZQ1VDQUdRUUZCOE9jQUlBZEIwQUJxRUJNTUFRc0NRQ0FKS0FJSUlnSWdCRWtFUUNBSElBSTJBcVFCSUFjZ0JEWUNvQUVnQmtFQ1FaSGxBQ0FIUWFBQmFoQVRJQUFnQUNnQ2dBRTJBaVFnQ1NnQ0NDRUVEQUVMSUFBZ0FEVUNkQ0lRSUFRZ0FDZ0NiR3V0ZkVJQmZTQVFnRDRDSkFzZ0FTQUVOZ0lJSUFWQkFFd0VRQ0FISUFVMkFtQWdCa0VCUWREZ0FDQUhRZUFBYWhBVERBRUxJQWtvQWdRaUFpQUZTd1JBSUFjZ0FqWUNkQ0FISUFVMkFuQWdCa0VCUWNEbUFDQUhRZkFBYWhBVERBRUxBa0FnQ1NnQ0RDSUNJQVZKQkVBZ0J5QUNOZ0tVQVNBSElBVTJBcEFCSUFaQkFrSGo0d0FnQjBHUUFXb1FFeUFBSUFBb0FvUUJOZ0lvSUFrb0Fnd2hCUXdCQ3lBQUlBQTFBbmdpRUNBRklBQW9BbkJ
20yclh4Q0FYMGdFSUErQWlnTElBRWdCVFlDRENBQUlBQXRBRnhCQW5JNkFGd2dBU0FHRUQ5RkJFQU1BUXNnQnlBQi9RQUNBUDBMQklBQklBWkJCRUhwT2lBSFFZQUJhaEFUUVFFaENBc2dCMEhRQVdva0FDQUlDNUVDQVFaL0l3QkJJR3NpQlNRQUFuOGdBQ2dDWUNJRVJRUkFJQU5CQVVHVDZ3QkJBQkFUUVFBTUFRdEJBRUVFSUFRb0FoQVFGeUlFUlEwQUdpQUJCRUFnQUNnQ1lDRUlBMEFDUUFKQUlBSWdCa0VDZEdvb0FnQWlCeUFJS0FJUVR3UkFJQVVnQnpZQ0VDQURRUUZCNWhJZ0JVRVFhaEFUREFFTElBUWdCMEVDZEdvaUNTZ0NBRVVOQVNBRklBYzJBZ0FnQTBFQlFmb2FJQVVRRXdzZ0JCQVVRUUFNQXdzZ0NVRUJOZ0lBSUFaQkFXb2lCaUFCUncwQUN3c2dCQkFVSUFBb0FrQVFGQUpBSUFFRVFDQUFJQUZCQW5RaUJCQVlJZ00yQWtBZ0EwVUVRQ0FBUVFBMkFqeEJBQXdEQ3lBRElBSWdCQkFXR2d3QkN5QUFRUUEyQWtBTElBQWdBVFlDUEVFQkN5QUZRU0JxSkFBTG1nUUJCMzhnQVVFQlFTUVFGeUlFTmdKZ0FrQUNRQ0FFUlEwQUFrQWdBU2dDM0FGQkVpQURFQ2dFUUNBQktBTGNBVUVUSUFNUUtBMEJDd3dDQ3lBQktBTGNBU0lIS0FJQUlRVWdCeWdDQ0NFR0FrQWdCUVJBUVFFaEJDQUZRUUZ4SVFnZ0JVRUJSZ1IvUVFBRklBVkJmbkVoQlFOQUFuOUJBQ0FFUlEwQUdrRUFJQUVnQUNBRElBWW9BZ0FSQUFCRkRRQWFJQUVnQUNBRElBWW9BZ1FSQUFCQkFFY0xJUVFnQmtFSWFpRUdJQWxCQW1vaUNTQUZSdzBBQ3lBRVJRc2hCVUVBSUFRZ0NCc2hCQUpBSUFoRkRRQWdCUTBBSUFFZ0FDQURJQVlvQWdBUkFBQkJBRWNoQkFzZ0IwRUFOZ0lBSUFRTkFRd0RDeUFIUVFBMkFnQUxBa0FnQVNnQzJBRkJGQ0FERUNnRVFDQUJLQUxZQVVFVklBTVFLQTBCQ3d3Q0N5QUJLQUxZQVNJSEtBSUFJUVVnQnlnQ0NDRUdBa0FnQlFSQVFRRWhCQ0FGUVFGeElRZ2dCVUVCUmdSL1FRQUZJQVZCZm5FaEJVRUFJUWtEUUFKL1FRQWdCRVVOQUJwQkFDQUJJQUFnQXlBR0tBSUFFUUFBUlEwQUdpQUJJQUFnQXlBR0tBSUVFUUFBUVFCSEN5RUVJQVpCQ0dvaEJpQUpRUUpxSWdrZ0JVY05BQXNnQkVVTElRVkJBQ0FFSUFnYklRUUNRQ0FJUlEwQUlBVU5BQ0FCSUFBZ0F5QUdLQUlBRVFBQVFRQkhJUVFMSUFkQkFEWUNBQ0FFRFFFTUF3c2dCMEVBTmdJQUN5QUNRUUZCSkJBWElnQTJBZ0FnQUVVTkFDQUJLQUpnSUFBUVNFRUJJUW9MSUFvUEN5QUJLQUpnRUNVZ0FVRUFOZ0pnUVFBTEFnQUxCQUJCQVFzMEFBSkFJQUJGRFFBZ0FVVU5BQ0FBSUFFb0FnUTJBcndCSUFBZ0FTZ0NBRFlDdUFFZ0FDQUJLQUs0UUVFQ2NUWUMrQUVMQzdRRkFRaC9JQUFvQWhnaUJDZ0NFQ0lKUlFSQVFRQVBDeUFFS0FJWUlRVWdBQ2dDRkNnQ0FDZ0NGQ0VFQWtBQ1FDQUJSUVJBUVFBaEFRTkFJQVVvQWhnaEFpQUVLQUljSUFRb0FoaEJtQUZzYWlJQVFZd0JheWdDQUNJSElBQkJsQUZyS0FJQUlnaHJJUU1nQUVHUUFXc29BZ0FnQUVHWUFXc29BZ0JySVFBQ1FDQUhJQWhHRFFBZ0FLMGdBNjErUWlDSVVBMEFEQVFMSUFBZ0Eyd2hBd0pBUVFRZ0FrRURkaUFDUVFkeFFRQkhhaUlBSUFCQkEwWWJJZ0pGRFFBZ0FxMGdBNjErUWlDSVVBMEFEQVFMUVg4aEFDQUNJQU5zSWdJZ0FVRi9jMHNOQWlBRVFjd0FhaUVFSUFWQk5Hb2hCU0FCSUFKcUlnRWhBQ0FHUVFGcUlnWWdDVWNOQUFzTUFRdEJBQ0VCSUFBb0FrQkZCRUFEUUNBRktBSVlJUUlnQkNnQ0hDQUVLQUlZUVpnQmJHb2lBRUVFYXlnQ0FDSUhJQUJCREdzb0FnQWlDR3NoQXlBQVFRaHJLQUlBSUFCQkVHc29BZ0JySVFBQ1FDQUhJQWhHRFFBZ0FLMGdBNjErUWlDSVVBMEFEQVFMSUFBZ0Eyd2hBd0pBUVFRZ0FrRURkaUFDUVFkeFFRQkhhaUlBSUFCQkEwWWJJZ0pGRFFBZ0FxMGdBNjErUWlDSVVBMEFEQVFMUVg4aEFDQUNJQU5zSWdJZ0FVRi9jMHNOQWlBRVFjd0FhaUVFSUFWQk5Hb2hCU0FCSUFKcUlnRWhBQ0FHUVFGcUlnWWdDVWNOQUFzTUFRc0RRQ0FGS0FJWUlRSWdCQ2dDSENBRUtBSVlRWmdCYkdvaUFFR01BV3NvQWdBaUJ5QUFRWlFCYXlnQ0FDSUlheUVESUFCQmtBRnJLQUlBSUFCQm1BRnJLQUlBYXlF
20QUFrQWdCeUFJUmcwQUlBQ3RJQU90ZmtJZ2lGQU5BQXdEQ3lBQUlBTnNJUU1DUUVFRUlBSkJBM1lnQWtFSGNVRUFSMm9pQUNBQVFRTkdHeUlDUlEwQUlBS3RJQU90ZmtJZ2lGQU5BQXdEQzBGL0lRQWdBaUFEYkNJQ0lBRkJmM05MRFFFZ0JFSE1BR29oQkNBRlFUUnFJUVVnQVNBQ2FpSUJJUUFnQmtFQmFpSUdJQWxIRFFBTEN5QUFEd3RCZnd2YUJBRUxmeUFBQkVBZ0FDZ0NGQ0lCQkVBZ0FTZ0NBQ0lGQkVBZ0JTZ0NGQ0VESUFVb0FoQUVmMEVRUVJFZ0FDMEFLRUVCY1JzaENBTkFJQU1vQWh3aUFnUkFJQU1vQWlBaUFVR1lBVzRoQ2tFQUlRa2dBVUdZQVU4RWZ3TkFJQUlvQWpBaUFRUkFJQUlvQWpRaUJrRW9iaUVIUVFBaEJDQUdRU2hQQkg4RFFDQUJLQUlnRUM0Z0FVRUFOZ0lnSUFFb0FpUVFMaUFCUVFBMkFpUWdBU0FJRVFJQUlBRkJLR29oQVNBRVFRRnFJZ1FnQjBjTkFBc2dBaWdDTUFVZ0FRc1FGQ0FDUVFBMkFqQUxJQUlvQWxRaUFRUkFJQUlvQWxnaUJrRW9iaUVIUVFBaEJDQUdRU2hQQkg4RFFDQUJLQUlnRUM0Z0FVRUFOZ0lnSUFFb0FpUVFMaUFCUVFBMkFpUWdBU0FJRVFJQUlBRkJLR29oQVNBRVFRRnFJZ1FnQjBjTkFBc2dBaWdDVkFVZ0FRc1FGQ0FDUVFBMkFsUUxJQUlvQW5naUFRUkFJQUlvQW53aUJrRW9iaUVIUVFBaEJDQUdRU2hQQkg4RFFDQUJLQUlnRUM0Z0FVRUFOZ0lnSUFFb0FpUVFMaUFCUVFBMkFpUWdBU0FJRVFJQUlBRkJLR29oQVNBRVFRRnFJZ1FnQjBjTkFBc2dBaWdDZUFVZ0FRc1FGQ0FDUVFBMkFuZ0xJQUpCbUFGcUlRSWdDVUVCYWlJSklBcEhEUUFMSUFNb0Fod0ZJQUlMRUJRZ0EwRUFOZ0ljQ3dKQUlBTW9BaWhGRFFBZ0F5Z0NKQ0lCUlEwQUlBRVFGQ0FEL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1FzQ0pBc2dBeWdDTkJBVUlBTkJ6QUJxSVFNZ0MwRUJhaUlMSUFVb0FoQkpEUUFMSUFVb0FoUUZJQU1MRUJRZ0JVRUFOZ0lVSUFBb0FoUW9BZ0FRRkNBQUtBSVVJZ0ZCQURZQ0FBc2dBUkFVSUFCQkFEWUNGQXNnQUNnQ1JCQVVJQUFRRkFzTDJSTUJFWDhqQUVFZ2F5SVBKQUFnRHlBRk5nSVlJQUVnQXlnQ0hFSE1BR3hxS0FJY0lBTW9BaUJCbUFGc2FpRVFBa0FDUUNBREtBSW9EUUFnRUNnQ0dFVU5BQ0FRUVJ4cUlRa0RRQUpBSUFrb0FnZ2dDU2dDQUVjRWZ5QUpLQUlNSUFrb0FnUkdCVUVCQ3cwQUlBTW9BaVFpQVNBSktBSVlRU2h1VHdSQUlBaEJBVUh2RlVFQUVCTU1CQXNnQ1NnQ0ZDQUJRU2hzYWlJQktBSWdFR3NnQVNnQ0pCQnJJQUVvQWhRZ0FTZ0NFR3dpREVVTkFDQUJLQUlZSVFFZ0RFRUlUd1JBSUF4QmVIRWhDMEVBSVFvRFFDQUJRZ0EzQW9RRUlBRkNBRGNDd0FNZ0FVSUFOd0w4QWlBQlFnQTNBcmdDSUFGQ0FEY0M5QUVnQVVJQU53S3dBU0FCUWdBM0Ftd2dBVUlBTndJb0lBRkJvQVJxSVFFZ0NrRUlhaUlLSUF0SERRQUxDMEVBSVFvZ0RFRUhjU0lNUlEwQUEwQWdBVUlBTndJb0lBRkJ4QUJxSVFFZ0NrRUJhaUlLSUF4SERRQUxDeUFKUVNScUlRa2dEVUVCYWlJTklCQW9BaGhKRFFBTEN5QUZJUXdDUUNBQ0xRQUFRUUp4UlEwQUlBZEJCVTBFUUNBSVFRSkJ2eUJCQUJBVERBRUxBa0FnQlMwQUFFSC9BVVlFUUNBRkxRQUJRWkVCUmcwQkN5QUlRUUpCNlNCQkFCQVREQUVMSUE4Z0JVRUdhaUlNTmdJWUMwRVVFQmdpQzBVTkFBSi9JQUF0QUd4QkFYRUVRQ0FBUVNocUlSRWdBQ2dDS0NFTUlBQkJMR29NQVFzZ0FpMEFpQ3hCQW5FRVFDQUNRYkFvYWlFUklBSW9BckFvSVF3Z0FrRzhLR29NQVFzZ0R5QUZJQWRxSUF4ck5nSWNJQTlCR0dvaEVTQVBRUnhxQ3lJU0tBSUFJUUFnQzBJQU53SU1JQXNnRERZQ0NDQUxJQXcyQWdBZ0N5QUFJQXhxTmdJRUlBdEJBUkFqUlFSQUlBc1FiUm9nQ3lnQ0NDQUxLQUlBYXlBTEVESWdER29oQUNBUktBSUFJUUVnRWlBU0tBSUFJZ01nQWkwQUFFRUVjUVIvSUFNZ0FHc2dBV3BCQVUwRVFDQUlRUUZCb1NKQkFCQVREQU1MQWtBZ0FDMEFBRUgvQVVZRVFDQUFMUUFCUVpJQlJnMEJDeUFJUVFGQmpDSkJBQkFUREFNTElBQkJBbW9GSUFBTElBRnJJZ0JyTmdJQUlCRWdBQ0FCYWpZQ0FDQUVRUUEyQWdBZ0JpQVBLQUlZSUFWck5nSUFRUUVoRnd3QkN5QVFLQUlZQkVBZ0VFRWNhaUVIQTBBZ0F5Z0NKQ0VBSUFjb0FoUWhBUUpBSUFjb0FnZ2dCeWdDQUVjRWZ5QUhLQUlNSUFjb0FnUkdCVUVCQ3cwQUlBRWdBRUVvYkdvaUZDZ0NGQ0FVS0FJUWJDSVlSUTBBSUJRb0FoZ2hDVUVBSVJVRFFBSkFBbjhnQ1NnQ0tFVUVRQ0FMSUJRb0FpQWdGU0FES0FJb1FRRnFFR2tNQVFzZ0MwRUJFQ01MUlFSQUlBbEJBRFlDSkF3QkN5QUpLQUlvUlFSQVFRQWhBUU5BSUFFaUFFRUJhaUVCSUFzZ0ZDZ0NKQ0FWSUFBUWFVVU5BQXNnQnlnQ0hDRUJJQWxCQXpZQ0lDQUpJQUUyQWhnZ0NTQUJJQUJyUVFGcU5nSWNDeUFKQW45QkFTQUxRUUVRSTBVTkFCcEJBaUFMUVFFUUkwVU5BQm9nQzBFQ0VDTWlBRUVEUndSQUlBQkJBMm9NQVFzZ0MwRUZFQ01pQUVFZlJ3UkFJQUJCQm1vTUFRc2dDMEVIRUNOQkpXb0xOZ0lrUVFBaEFRTkFJQUVpQUVFQmFpRUJJQXRCQVJBakRRQUxJQWtnQ1NnQ0lDQUFhallDSUFKQUFrQUNmeUFKS0FJb0lnQkZCRUFnQWlnQzBDc2dBeWdDSEVHNENHeHFLQUlRSVFBZ0NTZ0NNRVVFUUNBSktBSUFRZkFCRUJzaUFVVU5CQ0FKSUFFMkFn
20QWdBU0FKS0FJd1FSaHNha0VBUWZBQkVCa2FJQWxCQ2pZQ01Bc2dDU2dDQUNJS0lnSDlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDlDd0lBSUFGQ0FEY0NFRUVCUVFwQjdRQWdBRUVCY1JzZ0FFRUVjUnNoQVVFQURBRUxJQWtvQWdBaUFTQUFRUUZySWcxQkdHeHFJZ29vQWdRZ0NpZ0NERWNOQVNBQ0tBTFFLeUFES0FJY1FiZ0liR29vQWhBaERTQUpLQUl3SWdvZ0FFRUJha2tFZnlBQklBcEJDbW9pQ2tFWWJCQWJJZ0ZGRFFNZ0NTQUJOZ0lBSUFFZ0NTZ0NNRUVZYkdwQkFFSHdBUkFaR2lBSklBbzJBakFnQ1NnQ0FBVWdBUXNnQUVFWWJHb2lDaUlCL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1FzQ0FDQUJRZ0EzQWhBQ2YwRUJJQTFCQkhFTkFCcEI3UUFnRFVFQmNVVU5BQnBCQWtFQ1FRRWdDa0VNYXlnQ0FDSUJRUXBHR3lBQlFRRkdHd3NoQVNBQUN5RU5JQW9nQVRZQ0RBc2dDU2dDSkNFQUlBSW9BdEFySUFNb0FoeEJ1QWhzYWkwQUVFSEFBSEVFUUFOQUlBMUJHR3dpRGlBSktBSUFhaUFBUVFFZ0RSc2lFellDRUNBSktBSWdJUlpCQUNFS0lBQWhBU0FUUVFKUEJFQURRQ0FLUVFGcUlRb2dBVUVEU3lBQlFRRjJJUUVOQUFzTElBb2dGbW9pQVVFaFR3UkFJQThnQVRZQ0VDQUlRUUZCaXZrQUlBOUJFR29RRXd3REN5QUxJQUVRSXlFS0lBa29BZ0FpQVNBT2FpSU9JQW8yQWhRZ0FDQU9LQUlRYXlJQVFRQk1EUU1nQWlnQzBDc2dBeWdDSEVHNENHeHFLQUlRSVFvZ0NTZ0NNQ0lPSUExQkFtcEpCRUFnQVNBT1FRcHFJZzVCR0d3UUd5SUJSUTBESUFrZ0FUWUNBQ0FCSUFrb0FqQkJHR3hxUVFCQjhBRVFHUm9nQ1NBT05nSXdJQWtvQWdBaEFRc2dBU0FOUVFGcUlnMUJHR3hxSWdIOURBQUFBQUFBQUFBQUFBQUFBQUFBQUFEOUN3SUFJQUZDQURjQ0VDQUtRUVJ4QkVBZ0FVRUJOZ0lNREFFTElBcEJBWEVFUUNBQlFRSkJBa0VCSUFGQkRHc29BZ0FpQVVFS1Joc2dBVUVCUmhzMkFnd0ZJQUZCN1FBMkFnd0xEQUFMQUFzRFFDQU5RUmhzSWc0Z0NTZ0NBR29pQVNBQktBSU1JQUVvQWdScklnRWdBQ0FBSUFGS0d5SUJOZ0lRSUFrb0FpQWhFMEVBSVFvZ0FVRUNUd1JBQTBBZ0NrRUJhaUVLSUFGQkEwc2dBVUVCZGlFQkRRQUxDeUFLSUJOcUlnRkJJVThFUUNBUElBRTJBZ0FnQ0VFQlFZcjVBQ0FQRUJNTUFnc2dDeUFCRUNNaENpQUpLQUlBSWdFZ0Rtb2lEaUFLTmdJVUlBQWdEaWdDRUdzaUFFRUFUQTBDSUFJb0F0QXJJQU1vQWh4QnVBaHNhaWdDRUNFS0lBa29BakFpRGlBTlFRSnFTUVJBSUFFZ0RrRUthaUlPUVJoc0VCc2lBVVVOQWlBSklBRTJBZ0FnQVNBSktBSXdRUmhzYWtFQVFmQUJFQmthSUFrZ0RqWUNNQ0FKS0FJQUlRRUxJQUVnRFVFQmFpSU5RUmhzYWlJQi9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQS9Rc0NBQ0FCUWdBM0FoQWdDa0VFY1FSQUlBRkJBVFlDREF3QkN5QUtRUUZ4QkVBZ0FVRUNRUUpCQVNBQlFReHJLQUlBSWdGQkNrWWJJQUZCQVVZYk5nSU1CU0FCUWUwQU5nSU1Dd3dBQ3dBTElBc1FNZ3dGQ3lBSlFjUUFhaUVKSUJWQkFXb2lGU0FZUncwQUN3c2dCMEVrYWlFSElCbEJBV29pR1NBUUtBSVlTUTBBQ3dzZ0N4QnRSUVJBSUFzUU1nd0JDeUFMS0FJSUlBc29BZ0JySUFzUU1pQU1haUVCSUJFb0FnQWhBQ0FDTFFBQVFRUnhCRUFnRWlnQ0FDQUJheUFBYWtFQlRRUkFJQWhCQVVHaElrRUFFQk1NQWdzQ1FDQUJMUUFBUWY4QlJnUkFJQUV0QUFGQmtnRkdEUUVMSUFoQkFVR01Ja0VBRUJNTUFnc2dBVUVDYWlFQkN5QUFJQUZHRFFBZ0VpQVNLQUlBSUFBZ0FXdHFOZ0lBSUJFZ0FUWUNBRUVCSVJjZ0JFRUJOZ0lBSUFZZ0R5Z0NHQ0FGYXpZQ0FBc2dEMEVnYWlRQUlCY0xseVFDRkg4T2ZnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ2dDVkE0RkFBRUNBd1FLQ3dKQUlBQW9BalFpQmlBQUtBTEVBU0lCU1FSQUlBQW9Ba0FpQnlBQlFRRnFTUTBCQ3lBQUtBTHNBVUVCUVliQ0FFRUFFQk1NREFzZ0FDZ0NMRVVFUUNBQUtBSWtJUUpCQUNFQkRBVUxJQUJCQURZQ0xDQUFLQUpFSVFOQkFTRUJEQVFMQWtBZ0FDZ0NOQ0lHSUFBb0FzUUJJZ0ZKQkVBZ0FDZ0NRQ0lISUFGQkFXcEpEUUVMSUFBb0F1d0JRUUZCczhJQVFRQVFFd3dMQ3lBQUtBSXNSUVJBSUFBb0FpUWhCRUVBSVFFTUNBc2dBRUVBTmdJc0lBQW9BakFoQTBFQklRRU1Cd3NDUUNBQUtBSTBJZ1FnQUNnQ3hBRWlDa2tFUUNBQUtBSkFJZzRnQ2tFQmFra05BUXNnQUNnQzdBRkJBVUc2d3dCQkFCQVREQW9MSUFBb0FpeEZCRUFnQUNnQ0tDRUxEQVlMSUFCQ0FEY0M1QUVnQUVFQU5nSXNJQUFvQXNnQklRd0RRQ0FNSUFkQkJIUnFJZ1VvQWdnaUR3UkFJQVVvQWd3aEVrRUFJUUVEUUFKQUlBOGdBVUYvYzJvaUVDQVNJQUZCQkhScUloRW9BZ0JxSWdsQkgwc05BQ0FGS0FJQUloTkJmeUFKZGtzTkFDQUFJQUlnRXlBSmRDSUpJQUlnQ1VrYklBa2dBaHNpQWpZQzVBRUxBa0FnRVNnQ0JDQVFhaUlKUVI5TERRQWdCU2dDQkNJUVFYOGdDWFpMRFFBZ0FDQURJQkFnQ1hRaUNTQURJQWxKR3lBSklBTWJJZ00yQXVnQkN5QUJRUUZxSWdFZ0QwY05BQXNMSUFkQkFXb2lCeUFLUncwQUN5QUNSUTBISUFORkRRY2dBQzBBQUVVRVFDQUFJQUFvQXRBQk5nSnNJQUFnQUNnQ3pBRTJBbVFnQUNBQUtBTFlBVFlDY0NBQUlBQW9BdFFCTmdKb0N5QUFLQUl3SVFWQkFTRUJEQVVMQWtBZ0FDZ0NOQ0lGSUFBb0FzUUJJZ2xKQkVBZ0FDZ0NRQ0lTSUFsQkFXcEpEUUVMSUFBb0F1d0JRUUZCamNNQVFRQVFFd3dKQ3lBQUtBSXNSUVJBSUFBb0FzZ0JJZzBnQUNnQ0hDSUVRUVIwYWlFTElBQW9BaWdoQ0F3RUN5QUFRZ0EzQXVRQklBQkJBRFlDTENBQUtBTElBU0VOQTBBZ0RTQUdRUVIwYWlJS0tBSUlJZzRFUUNBS0tBSU1JUkJCQUNFQkEwQUNRQ0FPSUFGQmYzTnFJaEVnRUNBQlFRUjBhaUlUS0FJQWFpSU1RUjlMRFFBZ0NpZ0NBQ0lVUVg4Z0RIWkxEUUFnQUNBQ0lCUWdESFFpRENBQ0lBeEpHeUFNSUFJYklnSTJBdVFCQ3dKQUlCTW9BZ1FnRVdvaURFRWZTdzBBSUFvb0FnUWlFVUYvSUF4MlN3MEFJQUFnQXlBUklBeDBJZ3dnQXlBTVNSc2dEQ0FER3lJRE5nTG9BUXNnQVVFQmFpSUJJQTVIRFFBTEN5QUdRUUZxSWdZZ0NVY05BQXNnQWtVTkJpQURSUTBHQWtBZ0FDMEFBQVJBSUFBb0Ftd2hCZ3dCQ3lBQUlBQW9BdEFCSWdZMkFtd2dBQ0FBS0FMTUFUWUNaQ0FBSUFBb0F0Z0JOZ0p3SUFBZ0FDZ0MxQUUyQW1nTFFRRWhBUXdEQ3dKQUlBQW9BalFpQmlBQUtBTEVBU0lCU1FSQUlBQW9Ba0FpRHlBQlFRRnFTUTBCQ3lBQUtBTHNBVUVCUWVEQ0FFRUFFQk1NQmdzZ0FDZ0NMRVVFUUNBQUtBTElBU0FBS0FJY0lnWkJCSFJxSVFVZ0FDZ0NLQ0VIUV
20FBaEFRd0NDeUFBSUFZMkFod2dBRUVBTmdJc1FRRWhBUXdCQ3dOQUFuOENRQ0FCUlFSQUlBSkJBV29oQWd3QkN5QUFJQU0yQWlnZ0FDZ0NPQ0FEVFEwSklBQW9BakFoQkVFQURBRUxRUUVMSVFFRFFBSkFBa0FDUUFKQUlBRkZCRUFnQUNBRU5nSWdJQVFnQUNnQ1BFOE5BU0FBSUFZMkFod2dCaUVCUVFBaEJRd0VDeUFBSUFJMkFpUWdBQ2dDVENBQ1RRUkFJQUFvQWh3aEFVRUJJUVVNQkFzZ0FDZ0NFQ0FBS0FJZ2JDQUFLQUlNSUFBb0FpaHNhaUFBS0FJVUlBQW9BaHhzYWlBQUtBSVlJQUpzYWlJQklBQW9BZ2hQQkVBTURBc2dBQ2dDQkNBQlFRRjBhaUlCTHdFQURRRU1EUXNnQUNnQ0tFRUJhaUVEREFFTFFRQWhBUXdEQzBFQklRRU1BZ3NEUUFKQUFrQUNRQ0FGUlFSQUlBRWdCMDhOQVNBQUtBSWdJZ1VnQUNnQ3lBRWdBVUVFZEdvaURTZ0NDRThOQXlBQUxRQUFSUVJBSUFBZ0RTZ0NEQ0FGUVFSMGFpSUJLQUlNSUFFb0FnaHNOZ0pNQ3lBQUtBSklJUUpCQVNFQkRBVUxJQUFnQVVFQmFpSUJOZ0ljREFFTElBQW9BaUJCQVdvaEJFRUFJUUVNQXd0QkFDRUZEQUVMUVFFaEJRd0FDd0FMQUFzQUN3TkFBbjhDUUNBQlJRUkFJQUFnQjBFQmFpSUhOZ0lvREFFTElBWWdEMDhOQ0NBQVFnQTNBdVFCSUFBb0FzZ0JJQVpCQkhScUlnVW9BZ2dpQzBVTkNDQUZLQUlNSVFwQkFDRUNRUUFoQkVFQUlRRURRQUpBSUFzZ0FVRi9jMm9pQ1NBS0lBRkJCSFJxSWc0b0FnQnFJZ2hCSDBzTkFDQUZLQUlBSWd4QmZ5QUlka3NOQUNBQUlBUWdEQ0FJZENJSUlBUWdDRWtiSUFnZ0JCc2lCRFlDNUFFTEFrQWdEaWdDQkNBSmFpSUlRUjlMRFFBZ0JTZ0NCQ0lKUVg4Z0NIWkxEUUFnQUNBQ0lBa2dDSFFpQ0NBQ0lBaEpHeUFJSUFJYklnSTJBdWdCQ3lBQlFRRnFJZ0VnQzBjTkFBc2dCRVVOQmlBQ1JRMEdBa0FnQUMwQUFBUkFJQUFvQW13aEFnd0JDeUFBSUFBb0F0QUJJZ0kyQW13Z0FDQUFLQUxNQVRZQ1pDQUFJQUFvQXRnQk5nSndJQUFnQUNnQzFBRTJBbWdMUVFBTUFRdEJBUXNoQVFOQUFrQUNRQUpBQWtBZ0FVVUVRQ0FBSUFJMkF1QUJJQUlnQUNnQ2NFOE5BU0FBS0FKa0lRMUJBQ0VCREFRTElBQW9BamdnQjAwRVFDQUFLQUlnSVFOQkFTRUJEQVFMSUFBb0FoQWdBQ2dDSUd3Z0FDZ0NEQ0FIYkdvZ0FDZ0NGQ0FHYkdvZ0FDZ0NHQ0FBS0FJa2JHb2lBU0FBS0FJSVR3UkFEQXNMSUFBb0FnUWdBVUVCZEdvaUFTOEJBQTBCREF3TElBQWdCa0VCYWlJR05nSWNEQUVMUVFBaEFRd0RDMEVCSVFFTUFnc0RRQUpBQWtBQ1FDQUFBbjhnQVVVRVFDQUFJQTAyQXR3QklBMGdBQ2dDYUU4TkFpQUFLQUl3REFFTElBTkJBV29MSWdNMkFpQWdBQ2dDUENJQklBVW9BZ2dpQkNBQklBUkpHeUFEU3dSQUlBVW9BZ0FpQVNBQnJTSWVJQVFnQTBGL2Myb2lDSzBpRm9ZaUZ5QVdpS2RIRFFNZ0JTZ0NCQ0lFUW44Z0ZvaW5jU0FFUncwRElBU3RJaFVnRm9ZaUdFSUJmU0laSUFBMUF0Z0JmQ0FZZ0NFZklCa2dBQ2dDMEFFaUNhMThJQmlBSVJvZ0YwSUJmU0liSUFBMUF0UUJmQ0FYZ0NFZ0lCc2dBQ2dDekFFaURxMThJQmVBSVJ3Z0FVSi9JQVVvQWd3Z0EwRUVkR29pQ3lnQ0FDSUtJQWhxclNJZGlLZHhJQUZIRFFNZ0JDQVZJQXNvQWdRaUFTQUlhcTBpRllZaUlTQVZpS2RIRFFNZ0FDZ0M0QUVpQkswaUlpQWhna0lBVWdSQUlBUWdDVWNOQkVKL0lCV0dRbitGSUJwQy8vLy8vdytESUJhR2cxQU5CQXNnQUNnQzNBRWlCSzBpRlNBZUlCMkdna0lBVWdSQUlBUWdEa2NOQkVKL0lCMkdRbitGSUJ4Qy8vLy8vdytESUJhR2cxQU5CQXNnQ3lnQ0NDSUVSUTBESUFzb0FneEZEUU1nSEtjaUN5QWdwMFlOQXlBYXB5SUlJQituUmcwRElBQWdBQ2dDUkNJSE5nSW9JQUFnRlNBYmZDQVhnS2NnQ25ZZ0N5QUtkbXNnR1NBaWZDQVlnS2NnQVhZZ0NDQUJkbXNnQkd4cU5nSWtRUUVoQVF3RkN5QUFLQUxjQVNJQklBQW9BdVFCSWdScUlBRWdCSEJySVEwTUFRc2dBQ2dDNEFFaUFTQUFLQUxvQVNJRWFpQUJJQVJ3YXlFQ1FRQWhBUXdEQzBFQUlRRU1BUXRCQVNFQkRBQUxBQXNBQ3dBTEEwQUNmd0pBSUFGRkJFQWdBQ0FJUVFGcUlnZzJBaWdNQVFzZ0FDQUdOZ0xnQVNBQUtBSndJQVpORFFjZ0FDZ0NaQ0VQUVFBTUFRdEJBUXNoQVFOQUFrQUNRQUpBQWtBZ0FVVUVRQ0FBSUE4MkF0d0JJQThnQUNnQ2FFOE5BU0FBSUFVMkFod2dCU0VFUVFBaEFRd0VDeUFBS0FJNElBaE5CRUFnQUNnQ0lDRUhRUUVoQVF3RUN5QUFLQUlRSUFBb0FpQnNJQUFvQWd3Z0NHeHFJQUFvQWhRZ0JHeHFJQUFvQWhnZ0FDZ0NKR3hxSWdFZ0FDZ0NDRThFUUF3S0N5QUFLQUlFSUFGQkFYUnFJZ0V2QVFBTkFRd0xDeUFBS0FMZ0FTSUJJQUFvQXVnQklnWnFJQUVnQm5CcklRWU1BUXRCQUNFQkRBTUxRUUVoQVF3Q0N3TkFBa0FDUUFKQUFrQWdBVVVFUUNBRUlCSlBEUUlnQUNBQUtBSXdJZ2MyQWlBZ0RTQUVRUVIwYWlFTERBRUxJQUFnQjBFQmFpSUhOZ0lnQ3lBQUtBSThJZ0VnQ3lnQ0NDSUNJQUVnQWtrYklBZExCRUFnQ3lnQ0FDSUJJQUd0SWg0Z0FpQUhRWDl6YWlJS3JTSVdoaUlYSUJhSXAwY05BeUFMS0FJRUlnSkNmeUFXaUtkeElBSkhEUU1nQXEwaUZTQVdoaUlZUWdGOUloa2dBRFVDMkFGOElCaUFJUjhnR1NBQUtBTFFBU0lPclh3Z0dJQWhHaUFYUWdGOUloc2dBRFVDMUFGOElCZUFJU0FnR3lBQUtBTE1BU0lNclh3Z0Y0QWhIQ0FCUW44Z0N5Z0NEQ0FIUVFSMGFpSURLQUlBSWdrZ0NtcXRJaDJJcDNFZ0FVY05BeUFDSUJVZ0F5Z0NCQ0lCSUFwcXJTSVZoaUloSUJXSXAwY05BeUFBS0FMZ0FTSUNyU0lpSUNHQ1FnQlNCRUFnQWlBT1J3MEVRbjhnRllaQ2Y0VWdHa0wvLy8vL0Q0TWdGb2FEVUEwRUN5QUFLQUxjQVNJQ3JTSVZJQjRnSFlhQ1FnQlNCRUFnQWlBTVJ3MEVRbjhnSFlaQ2Y0VWdIRUwvLy8vL0Q0TWdGb2FEVUEwRUN5QURLQUlJSWdKRkRRTWdBeWdDREVVTkF5QWNweUlESUNDblJnMERJQnFuSWdvZ0g2ZEdEUU1nQUNBQUtBSkVJZ2cyQWlnZ0FDQVZJQnQ4SUJlQXB5QUpkaUFESUFsMmF5QVpJQ0o4SUJpQXB5QUJkaUFLSUFGMmF5QUNiR28yQWlSQkFTRUJEQVVMSUFBZ0JFRUJhaUlFTmdJY0RBRUxJQUFvQXR3QklnRWdBQ2dDNUFFaUFtb2dBU0FDY0dzaEQwRUFJUUVNQXd0QkFDRUJEQUVMUVFFaEFRd0FDd0FMQUFzQUN3TkFBbjhDUUNBQlJRUkFJQUFnQzBFQmFpSUxOZ0lvREFFTElBQWdCVFlDSUNBQUtBSThJQVZORFFZZ0FDZ0NiQ0VJUVFBTUFRdEJBUXNoQVFOQUFrQUNRQUpBQWtBZ0FVVUVRQ0FBSUFnMkF1QUJJQWdnQUNnQ2NFOE5BU0FBS0FKa0lRMUJBQ0VCREFRTElBQW9BamdnQzAwRVFDQUFLQUljSVFaQkFTRUJEQVFMSUFBb0FoQWdBQ2dDSUd3Z0FDZ0NEQ0FMYkdvZ0
20FDZ0NGQ0FBS0FJY2JHb2dBQ2dDR0NBQUtBSWtiR29pQVNBQUtBSUlUd1JBREFrTElBQW9BZ1FnQVVFQmRHb2lBUzhCQUEwQkRBb0xJQUFvQWlCQkFXb2hCUXdCQzBFQUlRRU1Bd3RCQVNFQkRBSUxBMEFDUUFKQUFrQUNRQ0FCUlFSQUlBQWdEVFlDM0FFZ0RTQUFLQUpvVHcwQ0lBQWdCRFlDSENBRUlRWU1BUXNnQUNBR1FRRnFJZ1kyQWh3TElBWWdEa2tFUUNBQUtBSWdJZ2NnQUNnQ3lBRWdCa0VFZEdvaUFTZ0NDQ0lEVHcwRElBRW9BZ0FpQWlBQ3JTSWVJQU1nQjBGL2Myb2lDcTBpRm9ZaUZ5QVdpS2RIRFFNZ0FTZ0NCQ0lEUW44Z0ZvaW5jU0FEUncwRElBT3RJaFVnRm9ZaUdFSUJmU0laSUFBMUF0Z0JmQ0FZZ0NFZklCa2dBQ2dDMEFFaUQ2MThJQmlBSVJvZ0YwSUJmU0liSUFBMUF0UUJmQ0FYZ0NFZ0lCc2dBQ2dDekFFaUNhMThJQmVBSVJ3Z0FrSi9JQUVvQWd3Z0IwRUVkR29pQVNnQ0FDSUhJQXBxclNJZGlLZHhJQUpIRFFNZ0F5QVZJQUVvQWdRaUFpQUthcTBpRllZaUlTQVZpS2RIRFFNZ0FDZ0M0QUVpQTYwaUlpQWhna0lBVWdSQUlBTWdEMGNOQkVKL0lCV0dRbitGSUJwQy8vLy8vdytESUJhR2cxQU5CQXNnQUNnQzNBRWlBNjBpRlNBZUlCMkdna0lBVWdSQUlBTWdDVWNOQkVKL0lCMkdRbitGSUJ4Qy8vLy8vdytESUJhR2cxQU5CQXNnQVNnQ0NDSURSUTBESUFFb0FneEZEUU1nSEtjaUFTQWdwMFlOQXlBYXB5SUtJQituUmcwRElBQWdBQ2dDUkNJTE5nSW9JQUFnRlNBYmZDQVhnS2NnQjNZZ0FTQUhkbXNnR1NBaWZDQVlnS2NnQW5ZZ0NpQUNkbXNnQTJ4cU5nSWtRUUVoQVF3RkN5QUFLQUxjQVNJQklBQW9BdVFCSWdKcUlBRWdBbkJySVEwTUFRc2dBQ2dDNEFFaUFTQUFLQUxvQVNJQ2FpQUJJQUp3YXlFSVFRQWhBUXdEQzBFQUlRRU1BUXRCQVNFQkRBQUxBQXNBQ3dBTEEwQUNmd0pBSUFGRkJFQWdCRUVCYWlFRURBRUxJQUFnQXpZQ0lDQUFLQUk4SUFOTkRRVWdBQ2dDUkNFQ1FRQU1BUXRCQVFzaEFRTkFBa0FDUUFKQUFrQWdBVVVFUUNBQUlBSTJBaWdnQWlBQUtBSTRUdzBCSUFBZ0JqWUNIQ0FHSVFGQkFDRUZEQVFMSUFBZ0JEWUNKQ0FBS0FKTUlBUk5CRUFnQUNnQ0hDRUJRUUVoQlF3RUN5QUFLQUlRSUFBb0FpQnNJQUFvQWd3Z0FDZ0NLR3hxSUFBb0FoUWdBQ2dDSEd4cUlBQW9BaGdnQkd4cUlnRWdBQ2dDQ0U4RVFBd0lDeUFBS0FJRUlBRkJBWFJxSWdFdkFRQU5BUXdKQ3lBQUtBSWdRUUZxSVFNTUFRdEJBQ0VCREFNTFFRRWhBUXdDQ3dOQUFrQUNRQUpBSUFWRkJFQWdBU0FIVHcwQklBQW9BaUFpQlNBQUtBTElBU0FCUVFSMGFpSU5LQUlJVHcwRElBQXRBQUJGQkVBZ0FDQU5LQUlNSUFWQkJIUnFJZ0VvQWd3Z0FTZ0NDR3cyQWt3TElBQW9Ba2doQkVFQklRRU1CUXNnQUNBQlFRRnFJZ0UyQWh3TUFRc2dBQ2dDS0VFQmFpRUNRUUFoQVF3REMwRUFJUVVNQVF0QkFTRUZEQUFMQUFzQUN3QUxRUUFQQ3lBQUtBTHNBVUVCUVpvS1FRQVFFd3RCQUE4TElBRkJBVHNCQUVFQkM1WUxBUXAvQWtBZ0FTZ0NBQ0FFUVFOc0lneDJJZ1pCa0lDQUFYRU5BQ0FBSUFCQkhHb2lEaUFBS0FKc0lBWkI3d054YWkwQUFFRUNkR29pQ2pZQ2FDQUFJQUFvQWdRZ0NpZ0NBQ0lKS0FJQUl
20naHJJZ1kyQWdRQ1FDQUlJQUFvQWdBaUIwRVFka3NFUUNBSktBSUVJUXNnQUNBSU5nSUVJQW9nQ1VFSVFRd2dCaUFJU1NJR0cyb29BZ0EyQWdBZ0N5QUxSU0FHR3lFSklBQW9BZ2doQmdOQUFrQWdCZzBBSUFBb0FoQWlCa0VCYWlFTElBWXRBQUVoQ2lBR0xRQUFRZjhCUmdSQUlBcEJrQUZQQkVBZ0FDQUFLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQmd3Q0N5QUFJQXMyQWhBZ0J5QUtRUWwwYWlFSFFRY2hCZ3dCQ3lBQUlBczJBaEJCQ0NFR0lBY2dDa0VJZEdvaEJ3c2dBQ0FHUVFGcklnWTJBZ2dnQUNBSFFRRjBJZ2MyQWdBZ0FDQUlRUUYwSWdnMkFnUWdDRUdBZ0FKSkRRQUxJQWdoQmd3QkN5QUFJQWNnQ0VFUWRHc2lCellDQUNBR1FZQ0FBbkZGQkVBZ0NTZ0NCQ0VMSUFvZ0NVRU1RUWdnQmlBSVNTSUlHMm9vQWdBMkFnQWdDMFVnQ3lBSUd5RUpJQUFvQWdnaENBTkFBa0FnQ0EwQUlBQW9BaEFpQ0VFQmFpRUxJQWd0QUFFaENpQUlMUUFBUWY4QlJnUkFJQXBCa0FGUEJFQWdBQ0FBS0FJTVFRRnFOZ0lNSUFkQmdQNERhaUVIUVFnaENBd0NDeUFBSUFzMkFoQWdCeUFLUVFsMGFpRUhRUWNoQ0F3QkN5QUFJQXMyQWhCQkNDRUlJQWNnQ2tFSWRHb2hCd3NnQUNBSVFRRnJJZ2cyQWdnZ0FDQUhRUUYwSWdjMkFnQWdBQ0FHUVFGMElnWTJBZ1FnQmtHQWdBSkpEUUFMREFFTElBa29BZ1FoQ1FzZ0NVVU5BQ0FBSUE0Z0FTZ0NCQ0FNUVJGcWRrRUVjU0FCUVFScklnMG9BZ0FnREVFVGFuWkJBWEVnQVNnQ0FDSUlJQXhCRUdwMlFjQUFjU0FJSUF4MlFhb0JjWElnQ0NBTVFReHFRUTRnQkJ0MlFSQnhjbkp5SWc5QmtMNEJhaTBBQUVFQ2RHb2lDellDYUNBQUlBWWdDeWdDQUNJS0tBSUFJZ2hySWdZMkFnUUNRQ0FJSUFkQkVIWkxCRUFnQ2lnQ0JDRUpJQUFnQ0RZQ0JDQUxJQXBCQ0VFTUlBWWdDRWtpQmh0cUtBSUFOZ0lBSUFrZ0NVVWdCaHNoQ2lBQUtBSUlJUVlEUUFKQUlBWU5BQ0FBS0FJUUlnWkJBV29oQ3lBR0xRQUJJUWtnQmkwQUFFSC9BVVlFUUNBSlFaQUJUd1JBSUFBZ0FDZ0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUVlNQWdzZ0FDQUxOZ0lRSUFjZ0NVRUpkR29oQjBFSElRWU1BUXNnQUNBTE5nSVFRUWdoQmlBSElBbEJDSFJxSVFjTElBQWdCa0VCYXlJR05nSUlJQUFnQjBFQmRDSUhOZ0lBSUFBZ0NFRUJkQ0lJTmdJRUlBaEJnSUFDU1EwQUN3d0JDeUFBSUFjZ0NFRVFkR3NpQ1RZQ0FDQUdRWUNBQW5GRkJFQWdDaWdDQkNFSElBc2dDa0VNUVFnZ0JpQUlTU0lJRzJvb0FnQTJBZ0FnQjBVZ0J5QUlHeUVLSUFBb0FnZ2hCd05BQWtBZ0J3MEFJQUFvQWhBaUIwRUJhaUVMSUFjdEFBRWhDQ0FITFFBQVFmOEJSZ1JBSUFoQmtBRlBCRUFnQUNBQUtBSU1RUUZxTmdJTUlBbEJnUDREYWlFSlFRZ2hCd3dDQ3lBQUlBczJBaEFnQ1NBSVFRbDBhaUVKUVFjaEJ3d0JDeUFBSUFzMkFoQkJDQ0VISUFrZ0NFRUlkR29oQ1FzZ0FDQUhRUUZySWdjMkFnZ2dBQ0FKUVFGMElnazJBZ0FnQUNBR1FRRjBJZ1kyQWdRZ0JrR0FnQUpKRFFBTERBRUxJQW9vQWdRaENnc2dBaUFEUVFBZ0Eyc2dDaUFQUVpEQUFXb3RBQUFpQWtZYk5nSUFJQTBnRFNnQ0FFRWdJQXgwY2pZQ0FDQUJJQUVvQWdBZ0FpQUtjeUlEUVJOMFFSQnlJQXgwY2pZQ0FDQUJJQUVvQWdSQkNDQU1kSEkyQWdRZ0JDQUZja1VFUUNBQlFYNGdBQ2dDZkd0QkFuUnFJZ0lnQWlnQ0JFR0FnQUp5TmdJRUlBSWdBaWdDQUNBRFFSOTBja0dBZ0FSeU5nSUFJQUpCQkdzaUFpQUNLQUlBUVlDQUNISTJBZ0FMSUFSQkEwY05BQ0FCSUFBb0FueEJBblJxSWdCQkJHb2dBQ2dDQkVFRWNqWUNBQ0FBSUFBb0FneEJBWEkyQWd3Z0FDQUFLQUlJSUFOQkVuUnlRUUp5TmdJSUN3dXVDd0VKZndKQUlBRW9BZ0FnQkVFRGJDSU5kaUlIUVpDQWdBRnhEUUFnQjBIdkEzRWlCMFVOQUNBQUlBQkJIR29pRGlBQUtBSnNJQWRxTFFBQVFRSjBhaUlMTmdKb0lBQWdBQ2dDQkNBTEtBSUFJZ29vQWdBaUNXc2lCellDQkFKQUlBa2dBQ2dDQUNJSVFSQjJTd1JBSUFvb0FnUWhEQ0FBSUFrMkFnUWdDeUFLUVFoQkRDQUhJQWxKSWdjYmFpZ0NBRFlDQUNBTUlBeEZJQWNiSVFvZ0FDZ0NDQ0VIQTBBQ1FDQUhEUUFnQUNnQ0VDSUhRUUZxSVF3Z0J5MEFBU0VMSUFjdEFBQkIvd0ZHQkVBZ0MwR1FBVThFUUNBQUlBQW9BZ3hCQVdvMkFnd2dDRUdBL2dOcUlRaEJDQ0VIREFJTElBQWdERFlDRUNBSUlBdEJDWFJxSVFoQkJ5RUhEQUVMSUFBZ0REWUNFRUVJSVFjZ0NDQUxRUWgwYWlFSUN5QUFJQWRCQVdzaUJ6WUNDQ0FBSUFoQkFYUWlDRFlDQUNBQUlBbEJBWFFpQ1RZQ0JDQUpRWUNBQWtrTkFBc2dDU0VIREFFTElBQWdDQ0FKUVJCMGF5SUlOZ0lBSUFkQmdJQUNjVVVFUUNBS0tBSUVJUXdnQ3lBS1FReEJDQ0FISUFsSklna2JhaWdDQURZQ0FDQU1SU0FNSUFrYklRb2dBQ2dDQ0NFSkEwQUNRQ0FKRFFBZ0FDZ0NFQ0lKUVFGcUlRd2dDUzBBQVNFTElBa3RBQUJCL3dGR0JFQWdDMEdRQVU4RVFDQUFJQUFvQWd4QkFXbzJBZ3dnQ0VHQS9nTnFJUWhCQ0NFSkRBSUxJQUFnRERZQ0VDQUlJQXRCQ1hScUlRaEJCeUVKREFFTElBQWdERFlDRUVFSUlRa2dDQ0FMUVFoMGFpRUlDeUFBSUFsQkFXc2lDVFlDQ0NBQUlBaEJBWFFpQ0RZQ0FDQUFJQWRCQVhRaUJ6WUNCQ0FIUVlDQUFra05BQXNNQVFzZ0NpZ0NCQ0VLQ3dKQUlBcEZEUUFnQUNBT0lBRW9BZ1FnRFVFUmFuWkJCSEVnQVVFRWF5SVBLQUlBSUExQkUycDJRUUZ4SUFFb0FnQWlDU0FOUVJCcWRrSEFBSEVnQ1NBTmRrR3FBWEZ5SUFrZ0RVRU1ha0VPSUFRYmRrRVFjWEp5Y2lJS1FaQytBV290QUFCQkFuUnFJZ3cyQW1nZ0FDQUhJQXdvQWdBaUN5Z0NBQ0lKYXlJSE5nSUVJQXBCa01BQmFpMEFBQ0VPQWtBZ0NTQUlRUkIyU3dSQUlBc29BZ1FoQ2lBQUlBazJBZ1FnRENBTFFRaEJEQ0FISUFsSklnY2JhaWdDQURZQ0FDQUtJQXBGSUFjYklRc2dBQ2dDQ0NFSEEwQUNRQ0FIRFFBZ0FDZ0NFQ0lIUVFGcUlRd2dCeTBBQVNFS0lBY3RBQUJCL3dGR0JFQWdDa0dRQVU4RVFDQUFJQUFvQWd4QkFXbzJBZ3dnQ0VHQS9nTnFJUWhCQ0NFSERBSUxJQUFnRERZQ0VDQUlJQXBCQ1hScUlRaEJCeUVIREFFTElBQWdERFlDRUVFSUlRY2dDQ0FLUVFoMGFpRUlDeUFBSUFkQkFXc2lCellDQ0NBQUlBaEJBWFFpQ0RZQ0FDQUFJQWxCQVhRaUNUWUNCQ0FKUVlDQUFra05BQXNNQVFzZ0FDQUlJQWxCRUhScklnbzJBZ0FnQjBHQWdBSnhSUVJBSUFzb0FnUWhDQ0FNSUF0QkRFRUlJQWNnQ1VraUNSdHFLQUlBTmdJQUlBaEZJQWdnQ1JzaEN5QUFLQUlJSVFnRFFBSkFJQWdOQUNBQUtBSVFJZ2hCQVdvaERDQUlMUUFCSVFrZ0NDMEFBRUgvQVVZRVFDQUpRWkFCVHdSQUlBQWdBQ2dDREVFQmFqWUNEQ0FLUVlEK0Eyb2hDa0VJSVFnTUFnc2dBQ0FNTmdJUUlBb2dDVUVKZEdvaENrRUhJUWdNQVFzZ0FDQU1OZ0lRUVFnaENDQUtJQWxCQ0hScUlRb0xJQUFnQ0VFQmF5SUlOZ0lJSUFBZ0NrRUJkQ0lLTmdJQUlBQWdCMEVCZENJSE5nSUVJQWRCZ0lBQ1NRMEFDd3dCQ3lBTEtBSUVJUXNMSUFJZ0EwRUFJQU5ySUFzZ0RrWWJOZ0lBSUE4Z0R5Z0NBRUVnSUExMGNqWUNBQ0FCSUFFb0FnQWdDeUFPY3lJQ1FSTjBRUkJ5SUExMGNqWUNBQ0FCSUFFb0FnUkJDQ0FOZEhJMkFnUWdCQ0FHY2tVRVFDQUJJQVZCQW5ScklnQWdBQ2dDQkVHQWdBSnlOZ0lFSUFBZ0FDZ0NBQ0FDUVI5MGNrR0FnQVJ5TmdJQUlBQkJCR3NpQUNBQUtBSUFRWUNBQ0hJMkFnQUxJQVJCQTBjTkFDQUJJQVZCQW5ScUlnQWdBQ2dDQkVFQmNqWUNCQ0FBSUFBb0FnQWdBa0VTZEhKQkFuSTJBZ0FnQUVFRWF5SUFJQUFvQWdCQkJISTJBZ0FMSUFFZ0FTZ0NBRUdBZ0lBQklBMTBjallDQUFzTHJRRUFJQUJCc0tJQk5nSmtJQUJCc0tJQk5nSmdJQUJCc0tJQk5nSmNJQUJCc0tJQk5nSllJQUJCc0tJQk5nSlVJQUJCc0tJQk5nSlFJQUJCc0tJQk5nSk1JQUJCc0tJQk5nSklJQUJCc0tJQk5nSkVJQUJCc0tJQk5nSkFJQUJCc0tJQk5nSThJQUJCc0tJQk5nSTRJQUJCc0tJQk5nSTBJQUJCc0tJQk5nSXdJQUJCc0tJQk5nSXNJQUJCc0tJQk5nSW9JQUJCc0tJQk5nSWtJQUJCc0tJQk5nSWdJQUJCc0tJQk5nSWNDL1FGQWdsL0FYNGdBQ0FCTmdJQUlBRDlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDlDd01JSUFBZ0F6WUNIQ0FBSUFKQkFXc2lCallDR0NBQlFRTnhJUW9DZnlBQ1FRQk1CRU
20FnQVNFRUlBTU1BUXNnQUNBQlFRRnFJZ1EyQWdBZ0FTMEFBQXNoQVVFSUlRZ2dBRUVJTmdJUUlBQWdBVUgvQVVZaUNUWUNGQ0FBSUFHdElnMDNBd2dDUUNBS1FRTkdEUUFnQUNBQ1FRSnJJZ3MyQWhnZ0FBSi9JQUpCQWtnRVFDQUVJUVVnQXd3QkN5QUFJQVJCQVdvaUJUWUNBQ0FFTFFBQUN5SUVRZjhCUmlJSk5nSVVJQUJCRDBFUUlBRkIvd0ZHR3lJSU5nSVFJQUFnQkVFSWRDQUJjcTBpRFRjRENDQUtRUUpHQkVBZ0JTRUVJQVloQWlBTElRWU1BUXNnQUNBQ1FRTnJJZ3cyQWhnZ0FBSi9JQUpCQTBnRVFDQUZJUWNnQXd3QkN5QUFJQVZCQVdvaUJ6WUNBQ0FGTFFBQUN5SUJRZjhCUmlJSk5nSVVJQUJCQjBFSUlBUkIvd0ZHR3lBSWFpSUZOZ0lRSUFBZ0FhMGdDSzJHSUEyRUlnMDNBd2dnQ2tFQlJnUkFJQWNoQkNBRklRZ2dDeUVDSUF3aEJnd0JDeUFBSUFKQkJHc2lCallDR0NBQUFuOGdBa0VFU0FSQUlBY2hCQ0FEREFFTElBQWdCMEVCYWlJRU5nSUFJQWN0QUFBTElnSkIvd0ZHSWdrMkFoUWdBRUVIUVFnZ0FVSC9BVVliSUFWcUlnZzJBaEFnQUNBQ3JTQUZyWVlnRFlRaURUY0RDQ0FNSVFJTEFrQWdBa0VGVGdSQUlBUW9BZ0FoQXlBQUlBSkJCV3MyQWhnZ0FDQUVRUVJxTmdJQURBRUxRUUFoQVVGL1FRQWdBeHNoQXlBQ1FRSklEUUFEUUNBQUlBUkJBV29pQWpZQ0FDQUVMUUFBSVFRZ0FDQUdRUUZySWdVMkFoZ2dBMEgvQVNBQmRFRi9jM0VnQkNBQmRISWhBeUFCUVFocUlRRWdCa0VCU3lBQ0lRUWdCU0VHRFFBTEN5QUFJQU5CR0hZaUFVSC9BVVkyQWhRZ0FFRUhRUWdnQ1JzaUFrRUhRUWdnQTBIL0FYRWlCRUgvQVVZYmFpSUdRUWRCQ0NBRFFRaDJRZjhCY1NJRlFmOEJSaHRxSWdkQkIwRUlJQU5CRUhaQi93RnhJZ05CL3dGR0d5QUlhbW8yQWhBZ0FDQUZJQUowSUFNZ0JuUnlJQUVnQjNSeUlBUnlyU0FJcllZZ0RZUTNBd2dMdHdVQ0VuOENmZ0ovSUFBb0Fod2dBVUdZQVd4cUlnSkJrQUZyS0FJQUlBSkJtQUZyS0FJQWF5SURJUVVnQWtHTUFXc29BZ0FnQWtHVUFXc29BZ0JySWdJaEJrSEFBQ0FESUFOQndBQlBHeUVEUWNBQUlBSWdBa0hBQUU4YklRUUNRQ0FGUlEwQUlBWkZEUUFnQTBVTkFDQUVSUTBBSUFOQmZ5QUVia0VDZGtzTkFFRUJRUndRRnlJQ0lBUTJBZ3dnQWlBRE5nSUlJQUlnQmpZQ0JDQUNJQVUyQWdBZ0FpQUVyU0lVSUFhdGZFSUJmU0FVZ0NJVXB5SUVOZ0lVSUFJZ0E2MGlGU0FGclh4Q0FYMGdGWUFpRmFjaUF6WUNFQUpBSUJSQy8vLy8vdytESUJWQy8vLy8vdytEZmtJZ2lLY05BQ0FDUVFRZ0F5QUViQkFYSWdNMkFoZ2dBMFVOQUNBQ0RBSUxJQUlRRkF0QkFBc2lDVVVFUUVFQUR3c0NRQ0FCQkVBRFFDQU9RWmdCYkNJUElBQW9BaHhxSWdVb0FoZ2lBZ1JBSUFWQkhHb2hFQ0FGS0FJVUlRTWdCU2dDRUNFRVFRQWhDZ05BSUFNZ0JHd0VRQ0FRSUFwQkpHeHFJUVpCQUNFTEEwQWdCaWdDRkNBTFFTaHNhaUlJS0FJVUlnSWdDQ2dDRUNJSGJBUkFRUUFoQkFOQUlBZ29BaGdnQkVIRUFHeHFJZ01vQWp3aUVRUkFJQU1vQWd3aEJ5QURLQUlVSVJJZ0F5Z0NFQ0VNSUFNb0FnZ2lFeUFHS0FJQWF5RURJQVlvQWhBaURVRUJjUVJBSUFBb0Fod2dEMm9pQWtHUUFXc29BZ0FnQTJvZ0FrR1lBV3NvQWdCcklRTUxJQWNnQmlnQ0JHc2hBaUFOUVFKeEJFQWdBaUFBS0FJY0lBOXFJZzFCakFGcktBSUFhaUFOUVpRQmF5Z0NBR3
20NoQWdzZ0NTQURJQUlnQXlBTUlCTnJJZ3hxSUJJZ0Iyc2dBbW9nRVVFQklBeEJBQkFxUlEwSklBZ29BaEFoQnlBSUtBSVVJUUlMSUFSQkFXb2lCQ0FDSUFkc1NRMEFDeUFGS0FJUUlRUWdCU2dDRkNFREN5QUxRUUZxSWdzZ0F5QUViRWtOQUFzZ0JTZ0NHQ0VDQ3lBS1FRRnFJZ29nQWtrTkFBc0xJQTVCQVdvaURpQUJSdzBBQ3dzZ0NROExJQWtRSjBFQUM4Z01BZzUvQm5zZ0FDZ0NDQ0lMSUFBb0FnUnFJUWNDUUNBQUtBSU1SUVJBSUFkQkFrZ05BU0FCS0FJQUlBRWdDMEVDZEdvaURTZ0NBQ0lFUVFGcVFRRjFheUVESUFBb0FnQWhCZ0pBSUFkQkJFa0VRQ0FFSVFJTUFRc2dCMEVFYXlJQVFRRjJJZ2xCQVdvaERBSkFJQUJCRmtrRVFFRUJJUUFNQVFzZ0JpQUJJQXRCQW5ScUlnVWdDVUVDZENJQ2FrRUlha2tnQmlBSlFRTjBha0VJYWlJQUlBVkJCR3BMY1FSQVFRRWhBQXdCQ3lBR0lBRWdBbXBCQ0dwSklBRkJCR29nQUVseEJFQkJBU0VBREFFTElBeEIvUC8vL3dkeElnVkJBWEloQUNBRlFRRjBJUWdnQlAwUklSQWdBLzBSSVJIOURBQUFBQUFDQUFBQUJBQUFBQVlBQUFBaEZFRUFJUUlEUUNBQklBSkJBblJCQkhJaUEycjlBQUlBSVJNZ0F5QU5hdjBBQWdBaEVpQUdJQUpCQTNScUlnTWdFZjFhQWdBRElBTkJDR29nRXlBU0lCQWdFdjBOREEwT0R4QVJFaE1VRlJZWEdCa2FHeUlUL2E0Qi9Rd0NBQUFBQWdBQUFBSUFBQUFDQUFBQS9hNEJRUUw5ckFIOXNRRWlFUDFhQWdBQUlBTkJFR29nRVAxYUFnQUJJQU5CR0dvZ0VQMWFBZ0FDSUFZZ0ZQME1BUUFBQUFFQUFBQUJBQUFBQVFBQUFQMVFJaFg5R3dCQkFuUnFJQkFnRVNBUS9RME1EUTRQRUJFU0V4UVZGaGNZR1JvYi9hNEJRUUg5ckFFZ0UvMnVBU0lSL1ZvQ0FBQWdCaUFWL1JzQlFRSjBhaUFSL1ZvQ0FBRWdCaUFWL1JzQ1FRSjBhaUFSL1ZvQ0FBSWdCaUFWL1JzRFFRSjBhaUFSL1ZvQ0FBTWdGUDBNQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBUDJ1QVNFVUlCQWhFU0FTSVJBZ0FrRUVhaUlDSUFWSERRQUxJQkQ5R3dNaEFpQVIvUnNESVFNZ0JTQU1SZzBCSUFJaEJBc0RRQ0FCSUFCQkFuUWlBbW9vQWdBaENTQUNJQTFxS0FJQUlRSWdCaUFJUVFKMGFpSUZJQU0yQWdBZ0JTQURJQWtnQWlBRWFrRUNha0VDZFdzaUEycEJBWFVnQkdvMkFnUWdDRUVDYWlFSUlBQWdERWNnQWlFRUlBQkJBV29oQUEwQUN3c2dCaUFJUVFKMGFpQUROZ0lBUVh3aEFDQUhRUUZ4Qkg4Z0JpQUhRUUZySWdCQkFuUnFJQUVnQUVFQmRHb29BZ0FnQWtF
20QmFrRUJkV3NpQURZQ0FDQUFJQU5xUVFGMUlRTkJlQVZCZkFzZ0JpQUhRUUowSWdCcWFpQUNJQU5xTmdJQUlBRWdCaUFBRUJZYUR3c0NRQUpBQWtBZ0IwRUJhdzRDQUFFQ0N5QUJJQUVvQWdCQkFtMDJBZ0FQQ3lBQUtBSUFJZ1FnQVNnQ0FDQUJJQXRCQW5ScUlnTW9BZ0JCQVdwQkFYVnJJZ0EyQWdRZ0JDQUFJQU1vQWdCcU5nSUFJQUVnQkNrQ0FEY0NBQThMSUFkQkEwZ05BQ0FBS0FJQUlnb2dBU2dDQUNBQklBdEJBblJxSWc0b0FnUWlCQ0FPS0FJQUlnQnFRUUpxUVFKMWF5SURJQUJxTmdJQVFRRWhDQUpBSUFkQkFtc2lCaUFIUVFGeElneEZJZ0JyUVFKSkJFQWdCQ0VDREFFTElBY2dBR3RCQkdzaUFFRUJkaUlDUVFGcUlROENRQUpBSUFCQkZra05BQ0FLUVFScUlnVWdBU0FDUVFKMElnQnFRUWhxU1NBS0lBSkJBM1JxUVF4cUlnSWdBVUVFYWt0eERRQWdCU0FBSUFFZ0MwRUNkR29pQUdwQkRHcEpJQUJCQ0dvZ0FrbHhEUUFnRDBGOGNTSUZRUUZ5SVFBZ0JVRUJkRUVCY2lFSUlBVDlFU0VSSUFQOUVTRVFRUUFoQWdOQUlBb2dBa0VEZEdvaUJDQUJJQUpCQW5RaUEycjlBQUlFSUJFZ0F5QU9hdjBBQWdnaUVmME5EQTBPRHhBUkVoTVVGUllYR0JrYUd5SVRJQkg5cmdIOURBSUFBQUFDQUFBQUFnQUFBQUlBQUFEOXJnRkJBdjJzQWYyeEFTSVNJQklnRUNBUy9RME1EUTRQRUJFU0V4UVZGaGNZR1JvYi9hNEJRUUg5ckFFZ0UvMnVBU0lUL1EwRUJRWUhHQmthR3dnSkNnc2NIUjRmL1FzQ0ZDQUVJQkFnRS8wTkRBME9EeEFSRWhNQUFRSURGQlVXRnlBUy9RMEFBUUlEQkFVR0J4QVJFaE1NRFE0UC9Rc0NCQ0FTSVJBZ0FrRUVhaUlDSUFWSERRQUxJQkg5R3dNaEFpQVEvUnNESVFNZ0JTQVBSZzBDSUFJaEJBd0JDMEVCSVFBTEEwQWdBU0FBUVFKMGFpZ0NBQ0VOSUE0Z0FFRUJhaUlGUVFKMGFpZ0NBQ0VDSUFvZ0NFRUNkR29pQ1NBRE5nSUFJQWtnQXlBTklBSWdCR3BCQW1wQkFuVnJJZ05xUVFGMUlBUnFOZ0lFSUFoQkFtb2hDQ0FBSUE5SElBSWhCQ0FGSVFBTkFBc0xJQW9nQ0VFQ2RHb2dBellDQUFKQUlBeEZCRUFnQ2lBR1FRSjBhaUFCSUFkQkFYUnFRUVJyS0FJQUlBSkJBV3BCQVhWcklnQWdBMnBCQVhVZ0FtbzJBZ0FNQVFzZ0FpQURhaUVBQ3lBS0lBZEJBblFpQTJwQkJHc2dBRFlDQUNBQklBb2dBeEFXR2dzTG9BY0RBMzBEZXdKL0lBTkJDRThFUUNBRFFRTjJJUXNEUUNBQi9RQUVBQ0VISUFBZ0FQMEFCQUFpQ0NBQy9RQUVBQ0lKL1F5OGRMTS92SFN6UDd4MHN6KzhkTE0vL2VZQi9lUUIvUXNFQUNBQklBZ2dCLzBNenpHd1BzOHhzRDdQTWJBK3p6R3dQdjNtQWYzbEFTQUovUXpoMFRZLzRkRTJQK0hSTmovaDBUWS8vZVlCL2VVQi9Rc0VBQ0FDSUFnZ0IvME01ZERpUCtYUTRqL2wwT0kvNWREaVAvM21BZjNrQWYwTEJBQWdBZjBBQkJBaEJ5QUFJQUQ5QUFRUUlnZ2dBdjBBQkJBaUNmME12SFN6UDd4MHN6KzhkTE0vdkhTelAvM21BZjNrQWYwTEJCQWdBU0FJSUFmOURNOHhzRDdQTWJBK3p6R3dQczh4c0Q3OTVnSDk1UUVnQ2YwTTRkRTJQK0hSTmovaDBUWS80ZEUyUC8zbUFmM2xBZjBMQkJBZ0FpQUlJQWY5RE9YUTRqL2wwT0kvNWREaVArWFE0ai85NWdIOTVBSDlDd1FRSUFKQklHb2hBaUFCUVNCcUlRRWdBRUVnYWlFQUlBcEJBV29pQ2lBTFJ3MEFDd3NDUUNBRFFRZHhJZ05GRFFBZ0FTb0NBQ0VFSUFBZ0Fpb0NBQ0lHUTd4MHN6K1VJQUFxQWdBaUJaSTRBZ0FnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSUFJQUlnQlNBRVErWFE0aitVa2pnQ0FDQURRUUZHRFFBZ0FTb0NCQ0VFSUFBZ0Fpb0NCQ0lHUTd4MHN6K1VJQUFxQWdRaUJaSTRBZ1FnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSUVJQUlnQlNBRVErWFE0aitVa2pnQ0JDQURRUUpHRFFBZ0FTb0NDQ0VFSUFBZ0Fpb0NDQ0lHUTd4MHN6K1VJQUFxQWdnaUJaSTRBZ2dnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSUlJQUlnQlNBRVErWFE0aitVa2pnQ0NDQURRUU5HRFFBZ0FTb0NEQ0VFSUFBZ0Fpb0NEQ0lHUTd4MHN6K1VJQUFxQWd3aUJaSTRBZ3dnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSU1JQUlnQlNBRVErWFE0aitVa2pnQ0RDQURRUVJHRFFBZ0FTb0NFQ0VFSUFBZ0Fpb0NFQ0lHUTd4MHN6K1VJQUFxQWhBaUJaSTRBaEFnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSVFJQUlnQlNBRVErWFE0aitVa2pnQ0VDQURRUVZHRFFBZ0FTb0NGQ0VFSUFBZ0Fpb0NGQ0lHUTd4MHN6K1VJQUFxQWhRaUJaSTRBaFFnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSVVJQUlnQlNBRVErWFE0aitVa2pnQ0ZDQURRUVpHRFFBZ0FTb0NHQ0VFSUFBZ0Fpb0NHQ0lHUTd4MHN6K1VJQUFxQWhnaUJaSTRBaGdnQVNBRklBUkR6ekd3dnBTU0lBWkQ0ZEUydjVTU09BSVlJQUlnQlNBRVErWFE0aitVa2pnQ0dBc0w0QUVDQm44RGV3SkFJQU5GRFFBZ0EwRUVUd1JBSUFOQmZIRWhCZ05BSUFBZ0JFRUNkQ0lGYWlJSElBZjlBQUlBSUFJZ0JXb2lCLzBBQWdBaUN5QUJJQVZxSWdYOUFBSUFJZ3o5cmdGQkF2MnNBZjJ4QVNJS0lBdjlyZ0g5Q3dJQUlBVWdDdjBMQWdBZ0J5QUtJQXo5cmdIOUN3SUFJQVJCQkdvaUJDQUdSdzBBQ3lBRElBWkdEUUVMQTBBZ0FDQUdRUUowSWdScUlnVWdCU2dDQUNBQ0lBUnFJZ1VvQWdBaUJ5QUJJQVJxSWdnb0FnQWlDV3BCQW5WcklnUWdCMm8yQWdBZ0NDQUVOZ0lBSUFVZ0JDQUphallDQUNBR1FRRnFJZ1lnQTBjTkFBc0xDOWtCQVFOL0l3QkJnQUZySWdZa0FDQUdJUVVDUUNBQktBSU1JQUpCQkhScUlnSW9BZ0FpQkVVRVFDQUNJUUVNQVFzRFFDQUZJQUkyQWdBZ0JVRUVhaUVGSUFRaUFTSUNLQUlBSWdRTkFBc0xRUUFoQkFOQUlBRW9BZ2dpQWlBRVNBUkFJQUVnQkRZQ0NDQUVJUUlMQWtBZ0FpQURUZzBBQTBBZ0FpQUJLQUlFVGcwQkFrQWdBRUVCRUNNRVFDQUJJQUkyQWdRTUFRc2dBa0VCYWlFQ0N5QUNJQU5JRFFBTEN5QUJJQUkyQWdnZ0JTQUdSd1JBSUFWQkJHc2lCU2dDQUNFQklBSWhCQXdCQ3dzZ0FTZ0NCQ0FHUVlBQmFpUUFJQU5JQzhRSkFnOS9BM3NqQUVHQUFtc2lDU1FBQWtBZ0FFVUVRRUVBSVFBTUFRc0NRQ0FCSUFBb0FnQkdCRUFnQUNnQ0JDQUNSZzBCQ3lBQUlBSTJBZ1FnQUNBQk5nSUFJQWtnQWpZQ0FDQUpJQUUyQW9BQklBSWhCQ0FCSVFZRFFDQUpJQWdpRDBFQmFpSUlRUUowSWdwcUlBUkJBV3BCQW0waUJ6WUNBQ0FKUVlBQmFpQUthaUFHUVFGcVFRSnRJZ28yQWdBZ0JTQUVJQVpzSWd4cUlRVWdCeUVFSUFvaEJpQU1RUUZMRFFBTElBQWdCVFlDQ0FKQUFrQUNRQ0FGUlFSQUlBQW9BZ3dpQVVVTkFTQUJFQlFnQUVFQU5nSU1EQUVMSUFWQkJIUWlCU0FBS0FJUVRRMENJQUFvQWd3Z0JSQWJJZ0lOQVNBRFFRRkJqakpCQUJBVElBQW9BZ3dpQVVVTkFDQUJFQlFnQUVFQU5nSU1DeUFBRUJSQkFDRUFEQU1MSUFBZ0FqWUNEQ0FDSUFBb0FoQWlBV3BCQUNBRklBRnJFQmthSUFBZ0JUWUNFQ0FBS0FJRUlRSWdBQ2dDQUNFQkN5QUFLQUlNSVFZZ0R3UkFJQVlnQVNBQ2JFRUVkR29pQkNFRkEwQUNRQ0FKSUJCQkFuUWlBV29vQWdBaUMwRUFUQTBBSUF0QkFXc2hEUUpBQWtBZ0NVR0FBV29nQVdvb0FnQWlCMEVBVEFSQUlBdEJBWEVoQ2tFQUlRZ2dDMEVCUncwQklBVWhBUXdDQ3lBSFFRSWdCeUFIUVFKT0cydEJBV3BCQVhZaUFpQUhRWUdBZ0lCNGJFSC8vLy8vQjJwQkFYWWlBU0FCSUFKTEd5SUNRUUZxSWdFZ0FVRURjU0lCUVFRZ0FSdHJJZzVCQkhRaEVTQU9RUVYwSVJJZ0J5QU9RUUYwYXlFTUlBSkJBMHNnQjNFaENFRUFJUUVnQlNFQ0EwQWdDQVIvSUFRZ0VXb2dCaUFTYWtFQUlRVURRQ0FHL1JFaUZQME1BQUFBQUNBQUFBQkFBQUFBWUFBQUFQMnVBU0lWL1JzQUlBVDlFZjBNQUFBQUFCQUFBQUFnQUFBQU1BQUFBUDJ1QVNJVC9Wb0NBQUFnRmYwYkFTQVQvVm9DQUFFZ0ZmMGJBaUFUL1ZvQ0FBSWdGZjBiQXlBVC9Wb0NBQU1nRlAwTUVBQUFBREFBQUFCUUFBQUFjQUFBQVAydUFTSVUvUnNBSUJQOVdnSUFBQ0FVL1JzQklCUDlXZ0lBQVNBVS9Sc0NJQlA5V2dJQUFpQVUvUnNESUJQOVdnSUFBeUFFUVVCcklRUWdCa0dBQVdvaEJpQUZRUVJxSWdVZ0RrY05BQXNoQmlFRUlBd0ZJQWNMSVFVRFFBSkFJQVlnQkRZQ0FDQUZRUUZHQkVBZ0JrRVFhaUVHSUFSQkVHb2hCQXdCQ3lBR0lBUTJBaEFnQkVFUWFpRUVJQVpCSUdvaEJpQUZRUUpLSUFWQkFtc2hCUTBCQ3dzZ0JDQUNJQWRCQkhScUlBRWdBU0FOUm5KQkFYRWlBeHNoQlNBRUlBSWdBeHNoQkNBRklRSWdBVUVCYWlJQklBdEhEUUFMREFJTElBdEIvdi8vL3dkeElRTkJBQ0VDQTBBZ0NDQU5SaUVCSUFoQkFtb2hDQ0FFSUFVZ0FSc2lCQ0VGSUFRaEFTQUNRUUpxSWdJZ0EwY05BQXNMSUFwRkJFQWdCQ0VGREFFTElBUWdBU0FIUVFSMGFpQUlJQWdnRFVaeVFRRnhJZ0liSVFVZ0JDQUJJQUliSVFRTElCQkJBV29pRUNBUFJ3MEFDd3NnQmtFQU5nSUFDeUFBS0FJSUlnSkZEUUFnQUNnQ0RDRUVJQUpCQkU4RVFDQUNRWHh4SVFGQkFDRUdBMEFnQkVFQU5nSThJQVJDNXdjM0FqUWdCRUVBTmdJc0lBUkM1d2MzQWlRZ0JFRUFOZ0ljSUFSQzV3YzNBaFFnQkVFQU5nSU1JQVJDNXdjM0FnUWdCRUZBYXlFRUlBWkJCR29pQmlBQlJ3MEFDd3NnQWtFRGNTSUJSUTBBUVFBaEJnTkFJQVJCQURZQ0RDQUVRdWNITndJRUlBUkJFR29oQkNBR1FRRnFJZ1lnQVVjTkFBc0xJQWxCZ0FKcU
20pBQWdBQXV4QVFFRGZ3SkFJQUJGRFFBZ0FDZ0NDQ0lCUlEwQUlBQW9BZ3doQUNBQlFRUlBCRUFnQVVGOGNTRURBMEFnQUVFQU5nSThJQUJDNXdjM0FqUWdBRUVBTmdJc0lBQkM1d2MzQWlRZ0FFRUFOZ0ljSUFCQzV3YzNBaFFnQUVFQU5nSU1JQUJDNXdjM0FnUWdBRUZBYXlFQUlBSkJCR29pQWlBRFJ3MEFDd3NnQVVFRGNTSUJSUTBBUVFBaEFnTkFJQUJCQURZQ0RDQUFRdWNITndJRUlBQkJFR29oQUNBQ1FRRnFJZ0lnQVVjTkFBc0xDOGtJQWhKL0Ezc2pBRUdBQW1zaUNTUUFBbjlCQVVFVUVCY2lCMFVFUUNBQ1FRRkI2REZCQUJBVFFRQU1BUXNnQnlBQk5nSUVJQWNnQURZQ0FDQUpJQUUyQWdBZ0NTQUFOZ0tBQVFOQUlBa2dCaUlQUVFGcUlnWkJBblFpQldvZ0FVRUJha0VDYlNJRE5nSUFJQWxCZ0FGcUlBVnFJQUJCQVdwQkFtMGlCVFlDQUNBRUlBQWdBV3dpQ0dvaEJDQURJUUVnQlNFQUlBaEJBVXNOQUFzZ0J5QUVOZ0lJSUFSRkJFQWdCeEFVUVFBTUFRc2dCeUFFUVJBUUZ5SUROZ0lNSUFORkJFQWdBa0VCUWNjYlFRQVFFeUFIRUJSQkFBd0JDeUFISUFjb0FnZ2lERUVFZERZQ0VDQURJUUVnRHdSQUlBTWdCeWdDQkNBSEtBSUFiRUVFZEdvaUFDRUdBMEFDUUNBSklCQkJBblFpQW1vb0FnQWlDMEVBVEEwQUlBdEJBV3NoRFFKQUlBbEJnQUZxSUFKcUtBSUFJZ2hCQUV3RVFFRUFJUVFnQzBFQlJ3UkFJQXRCL3YvLy93ZHhJUVZCQUNFQ0EwQWdCQ0FOUmlFS0lBUkJBbW9oQkNBR0lBQWdDaHNpQUNFR0lBSkJBbW9pQWlBRlJ3MEFDd3NnQzBFQmNRMEJJQUFoQmd3Q0N5QUlRUUlnQ0NBSVFRSk9HMnRCQVdwQkFYWWlBaUFJUVlHQWdJQjRiRUgvLy8vL0IycEJBWFlpQlNBQ0lBVkpHeUlDUVFGcUlnVWdCVUVEY1NJRlFRUWdCUnRySWc1QkJYUWhFU0FPUVFSMElSSWdDQ0FPUVFGMGF5RVRJQUpCQTBzZ0NIRWhGRUVBSVFvZ0FDRUNBMEFDZnlBVVJRUkFJQVloQUNBSURBRUxJQUVnRVdvZ0JpQVNhaUVBUVFBaEJBTkFJQUg5RVNJWC9Rd0FBQUFBSUFBQUFFQUFBQUJnQUFBQS9hNEJJaFg5R3dBZ0J2MFIvUXdBQUFBQUVBQUFBQ0FBQUFBd0FBQUEvYTRCSWhiOVdnSUFBQ0FWL1JzQklCYjlXZ0lBQVNBVi9Sc0NJQmI5V2dJQUFpQVYvUnNESUJiOVdnSUFBeUFYL1F3UUFBQUFNQUFBQUZBQUFBQndBQUFBL2E0QkloWDlHd0FnRnYxYUFnQUFJQlg5R3dFZ0Z2MWFBZ0FCSUJYOUd3SWdGdjFhQWdBQ0lCWDlHd01nRnYxYUFnQURJQUZCZ0FGcUlRRWdCa0ZBYXlFR0lBUkJCR29pQkNBT1J3MEFDeUVCSUJNTElRUURRQUpBSUFFZ0FEWUNBQ0FFUVFGR0JFQWdBVUVRYWlFQklBQkJFR29oQUF3QkN5QUJJQUEyQWhBZ0FFRVFhaUVBSUFGQklHb2hBU0FFUVFKS0lBUkJBbXNoQkEwQkN3c2dBQ0FDSUFvZ0NpQU5SbkpCQVhFaUJSc2hCaUFBSUFJZ0NFRUVkR29nQlJzaUFDRUNJQXBCQVdvaUNpQUxSdzBBQ3d3QkN5QUdJQUFnQ0VFRWRHb2dCQ0FFSUExR2NrRUJjU0lGR3lBR0lBQWdCUnNoQmlFQUN5QVFRUUZxSWhBZ0QwY05BQXNMSUFGQkFEWUNBQUpBSUF4RkRRQWdERUVFVHdSQUlBeEJmSEVoQUVFQUlRRURRQ0FEUVFBMkFqd2dBMExuQnpjQ05DQURRUUEyQWl3Z0EwTG5CemNDSkNBRFFRQTJBaHdnQTBMbkJ6Y0NGQ0FEUVFBMkFnd2dBMExuQnpjQ0JDQURRVUJySVFNZ0FVRUVhaUlCSUFCSERRQUxDeUFNUVFOeElnQkZEUUJCQUNFQkEwQWdBMEVBTmdJTUlBTkM1d2MzQWdRZ0EwRVFhaUVESUFGQkFXb2lBU0FBUncwQUN3c2dCd3NnQ1VHQUFtb2tBQXRUQVFGL0FuOGdBQzBBREVIL0FVWUVRQ0FBUW9EK2c0RHdBRGNDREVFQUlBQW9BZ2dpQVNBQUtBSUVUdzBCR2lBQUlBRkJBV28yQWdnZ0FDQUJMUUFBUVlEK0EzSTJBZ3dMSUFCQkFEWUNFRUVCQ3dzRkFCQU1BQXVCQWdBQ1FDQUJRZjhBVFEwQUFrQkIxTllCS0FJQUtBSUFSUVJBSUFGQmdIOXhRWUMvQTBZTkFnd0JDeUFCUWY4UFRRUkFJQUFnQVVFL2NVR0FBWEk2QUFFZ0FDQUJRUVoyUWNBQmNqb0FBRUVDRHdzZ0FVR0FRSEZCZ01BRFJ5QUJRWUN3QTA5eFJRUkFJQUFnQVVFL2NVR0FBWEk2QUFJZ0FDQUJRUXgyUWVBQmNqb0FBQ0FBSUFGQkJuWkJQM0ZCZ0FGeU9nQUJRUU1QQ3lBQlFZQ0FCR3RCLy84L1RRUkFJQUFnQVVFL2NVR0FBWEk2QUFNZ0FDQUJRUkoyUWZBQmNqb0FBQ0FBSUFGQkJuWkJQM0ZCZ0FGeU9nQUNJQUFnQVVFTWRrRS9jVUdBQVhJNkFBRkJCQThMQzBIVXpRRkJHVFlDQUVGL0R3c2dBQ0FCT2dBQVFRRUxmZ0lCZndGK0lBQzlJZ05DTklpblFmOFBjU0lDUWY4UFJ3UjhJQUpGQkVBZ0FTQUFSQUFBQUFBQUFBQUFZUVIvUVFBRklBQkVBQUFBQUFBQThFT2lJQUVRY0NFQUlBRW9BZ0JCUUdvTE5nSUFJQUFQQ3lBQklBSkIvZ2RyTmdJQUlBTkMvLy8vLy8vLy80ZUFmNE5DZ0lDQWdJQ0FnUEEvaEw4RklBQUxDN3dDQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBVUVKYXc0U0FBZ0pDZ2dKQVFJREJBb0pDZ29JQ1FVR0J3c2dBaUFDS0FJQUl
20nRkJCR28yQWdBZ0FDQUJLQUlBTmdJQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJNZ0VBTndNQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJNd0VBTndNQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJNQUFBTndNQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJNUUFBTndNQUR3c2dBaUFDS0FJQVFRZHFRWGh4SWdGQkNHbzJBZ0FnQUNBQkt3TUFPUU1BRHdzZ0FDQUNJQU1SQXdBTER3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJOQUlBTndNQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJOUUlBTndNQUR3c2dBaUFDS0FJQVFRZHFRWGh4SWdGQkNHbzJBZ0FnQUNBQktRTUFOd01BQzI4QkJYOGdBQ2dDQUNJRExBQUFRVEJySWdGQkNVc0VRRUVBRHdzRFFFRi9JUVFnQWtITW1iUG1BRTBFUUVGL0lBRWdBa0VLYkNJRmFpQUJJQVZCLy8vLy93ZHpTeHNoQkFzZ0FDQURRUUZxSWdVMkFnQWdBeXdBQVNBRUlRSWdCU0VEUVRCcklnRkJDa2tOQUFzZ0FndEpBUUYvQWtCQkFVRXNFQmNpQVFSQUlBRkJBRFlDRUFKQUlBQkJBRXdFUUNBQlFRRkJDQkFYSWdBMkFpUWdBRVVOQVF3REN5QUJRUUEyQWd3TElBRVFGQXRCQUNFQkN5QUJDNjRVQWhKL0FuNGpBRUZBYWlJSUpBQWdDQ0FCTmdJOElBaEJKMm9oRnlBSVFTaHFJUklDUUFKQUFrQUNRQU5BUVFBaEJ3TkFJQUVoRFNBSElBNUIvLy8vL3dkelNnMENJQWNnRG1vaERnSkFBa0FDUUFKQUlBRWlCeTBBQUNJTUJFQURRQUpBQWtBZ0RFSC9BWEVpQVVVRVFDQUhJUUVNQVFzZ0FVRWxSdzBCSUFjaERBTkFJQXd0QUFGQkpVY0VRQ0FNSVFFTUFnc2dCMEVCYWlFSElBd3RBQUlnREVFQ2FpSUJJUXhCSlVZTkFBc0xJQWNnRFdzaUJ5QU9RZi8vLy84SGN5SVlTZzBKSUFBRVFDQUFJQTBnQnhBZUN5QUhEUWNnQ0NBQk5nSThJQUZCQVdvaEIwRi9JUkVDUUNBQkxBQUJRVEJySWd0QkNVc05BQ0FCTFFBQ1FTUkhEUUFnQVVFRGFpRUhRUUVoRXlBTElSRUxJQWdnQnpZQ1BFRUFJUWtDUUNBSExBQUFJZ3hCSUdzaUFVRWZTd1JBSUFjaEN3d0JDeUFISVF0QkFTQUJkQ0lCUVluUkJIRkZEUUFEUUNBSUlBZEJBV29pQ3pZQ1BDQUJJQWx5SVFrZ0J5d0FBU0lNUVNCcklnRkJJRThOQVNBTElRZEJBU0FCZENJQlFZblJCSEVOQUFzTEFrQWdERUVxUmdSQUFuOENRQ0FMTEFBQlFUQnJJZ0ZCQ1VzTkFDQUxMUUFDUVNSSERRQUNmeUFBUlFSQUlBUWdBVUVDZEdwQkNqWUNBRUVBREFFTElBTWdBVUVEZEdvb0FnQUxJUkFnQzBFRGFpRUJRUUVNQVFzZ0V3MEdJQXRCQVdvaEFTQUFSUVJBSUFnZ0FUWUNQRUVBSVJOQkFDRVFEQU1MSUFJZ0FpZ0NBQ0lIUVFScU5nSUFJQWNvQWdBaEVFRUFDeUVUSUFnZ0FUWUNQQ0FRUVFCT0RRRkJBQ0FRYXlFUUlBbEJnTUFBY2lFSkRBRUxJQWhCUEdvUWNpSVFRUUJJRFFvZ0NDZ0NQQ0VCQzBFQUlRZEJmeUVLQW45QkFDQUJMUUFBUVM1SERRQWFJQUV0QUFGQktrWUVRQUovQWtBZ0FTd0FBa0V3YXlJTFFRbExEUUFnQVMwQUEwRWtSdzBBSUFGQkJHb2hBUUovSUFCRkJFQWdCQ0FMUVFKMGFrRUtOZ0lBUVFBTUFRc2dBeUFMUVFOMGFpZ0NBQXNNQVFzZ0V3MEdJQUZCQW1vaEFVRUFJQUJGRFFBYUlBSWdBaWdDQUNJTFFRUnFOZ0lBSUFzb0FnQUxJUW9nQ0NBQk5nSThJQXBCQUU0TUFRc2dDQ0FCUVFGcU5nSThJQWhCUEdvUWNpRUtJQWdvQWp3aEFVRUJDeUVVQTBBZ0J5RVZRUndoQ3lBQklnOHNBQUFpQjBIN0FHdEJSa2tOQ3lBQlFRRnFJUUVnQnlBVlFUcHNha0gveEFGcUxRQUFJZ2RCQVd0Qi93RnhRUWhKRFFBTElBZ2dBVFlDUEFKQUlBZEJHMGNFUUNBSFJRME1JQkZCQUU0RVFDQUFSUVJBSUFRZ0VVRUNkR29nQnpZQ0FBd01DeUFJSUFNZ0VVRURkR29wQXdBM0F6QU1BZ3NnQUVVTkNDQUlRVEJxSUFjZ0FpQUdFSEVNQVFzZ0VVRUFUZzBMUVFBaEJ5QUFSUTBJQ3lBQUxRQUFRU0J4RFFzZ0NVSC8vM3R4SWd3Z0NTQUpRWURBQUhFYklRbEJBQ0VSUWJBSUlSWWdFaUVMQWtBQ1FBSi9Ba0FDUUFKQUFrQUNRQUpBQW44Q1FBSkFBa0FDUUFKQUFrQUNRQ0FQTFFBQUlnZkFJZzlCVTNFZ0R5QUhRUTl4UVFOR0d5QVBJQlViSWdkQjJBQnJEaUVFRmhZV0ZoWVdGaFlRRmdrR0VCQVFGZ1lXRmhZV0FnVURGaFlLRmdFV0ZnUUFDd0pBSUFkQndRQnJEZ2NRRmdzV0VCQVFBQXNnQjBIVEFFWU5Dd3dWQ3lBSUtRTXdJUnBCc0FnTUJRdEJBQ0VIQWtBQ1FBSkFBa0FDUUFKQUFrQWdGUTRJQUFFQ0F3UWNCUVljQ3lBSUtBSXdJQTQyQWdBTUd3c2dDQ2dDTUNBT05nSUFEQm9MSUFnb0FqQWdEcXczQXdBTUdRc2dDQ2dDTUNBT093RUFEQmdMSUFnb0FqQWdEam9BQUF3WEN5QUlLQUl3SUE0MkFnQU1GZ3NnQ0NnQ01DQU9yRGNEQUF3VkMwRUlJQW9nQ2tFSVRSc2hDaUFKUVFoeUlRbEIrQUFoQndzZ0VpRUJJQWdwQXpBaUdpSVpRZ0JTQkVBZ0IwRWdjU0VNQTBBZ0FVRUJheUlCSUJtblFROXhRWkRKQVdvdEFBQWdESEk2QUFBZ0dVSVBWaUFaUWdTSUlSa05BQXNMSUFFaERTQWFVQTBESUFsQkNIRkZEUU1nQjBFRWRrR3dDR29oRmtFQ0lSRU1Bd3NnRWlFQklBZ3BBekFpR2lJWlFnQlNCRUFEUUNBQlFRRnJJZ0VnR2FkQkIzRkJNSEk2QUFBZ0dVSUhWaUFaUWdPSUlSa05BQXNMSUFFaERTQUpRUWh4UlEwQ0lBb2dFaUFCYXlJQlFRRnFJQUVnQ2tnYklRb01BZ3NnQ0NrRE1DSWFRZ0JUQkVBZ0NFSUFJQnA5SWhvM0F6QkJBU0VSUWJBSURBRUxJQWxCZ0JCeEJFQkJBU0VSUWJFSURBRUxRYklJUWJBSUlBbEJBWEVpRVJzTElSWWdHaUFTRUM4aERRc2dGQ0FLUVFCSWNRMFJJQWxCLy85N2NTQU
20pJQlFiSVFrQ1FDQWFRZ0JTRFFBZ0NnMEFJQkloRFVFQUlRb01EZ3NnQ2lBYVVDQVNJQTFyYWlJQklBRWdDa2diSVFvTURRc2dDQzBBTUNFSERBc0xBbjlCLy8vLy93Y2dDaUFLUWYvLy8vOEhUeHNpQnlJSlFRQkhJUXNDUUFKQUFrQWdDQ2dDTUNJQlFmRU1JQUViSWcwaUQwRURjVVVOQUNBSlJRMEFBMEFnRHkwQUFFVU5BaUFKUVFGcklnbEJBRWNoQ3lBUFFRRnFJZzlCQTNGRkRRRWdDUTBBQ3dzZ0MwVU5BUUpBSUE4dEFBQkZEUUFnQ1VFRVNRMEFBMEJCZ0lLRUNDQVBLQUlBSWdGcklBRnlRWUNCZ29SNGNVR0FnWUtFZUVjTkFpQVBRUVJxSVE4Z0NVRUVheUlKUVFOTERRQUxDeUFKUlEwQkN3TkFJQThnRHkwQUFFVU5BaG9nRDBFQmFpRVBJQWxCQVdzaUNRMEFDd3RCQUFzaUFTQU5heUFISUFFYklnRWdEV29oQ3lBS1FRQk9CRUFnRENFSklBRWhDZ3dNQ3lBTUlRa2dBU0VLSUFzdEFBQU5Ed3dMQ3lBSUtRTXdJaGxDQUZJTkFVRUFJUWNNQ1FzZ0NnUkFJQWdvQWpBTUFndEJBQ0VISUFCQklDQVFRUUFnQ1JBZ0RBSUxJQWhCQURZQ0RDQUlJQmsrQWdnZ0NDQUlRUWhxSWdjMkFqQkJmeUVLSUFjTElReEJBQ0VIQTBBQ1FDQU1LQUlBSWcxRkRRQWdDRUVFYWlBTkVHOGlEVUVBU0EwUElBMGdDaUFIYTBzTkFDQU1RUVJxSVF3Z0J5QU5haUlISUFwSkRRRUxDMEU5SVFzZ0IwRUFTQTBNSUFCQklDQVFJQWNnQ1JBZ0lBZEZCRUJCQUNFSERBRUxRUUFoQ3lBSUtBSXdJUXdEUUNBTUtBSUFJZzFGRFFFZ0NFRUVhaUlLSUEwUWJ5SU5JQXRxSWdzZ0Iwc05BU0FBSUFvZ0RSQWVJQXhCQkdvaERDQUhJQXRMRFFBTEN5QUFRU0FnRUNBSElBbEJnTUFBY3hBZ0lCQWdCeUFISUJCSUd5RUhEQWdMSUJRZ0NrRUFTSEVOQ1VFOUlRc2dBQ0FJS3dNd0lCQWdDaUFKSUFjZ0JSRVZBQ0lIUVFCT0RRY01DZ3NnQnkwQUFTRU1JQWRCQVdvaEJ3d0FDd0FMSUFBTkNTQVRSUTBEUVFFaEJ3TkFJQVFnQjBFQ2RHb29BZ0FpQUFSQUlBTWdCMEVEZEdvZ0FDQUNJQVlRY1VFQklRNGdCMEVCYWlJSFFRcEhEUUVNQ3dzTElBZEJDazhFUUVFQklRNE1DZ3NEUUNBRUlBZEJBblJxS0FJQURRRkJBU0VPSUFkQkFXb2lCMEVLUncwQUN3d0pDMEVjSVFzTUJnc2dDQ0FIT2dBblFRRWhDaUFYSVEwZ0RDRUpDeUFLSUFzZ0RXc2lEQ0FLSUF4S0d5SUJJQkZCLy8vLy93ZHpTZzBEUVQwaEN5QVFJQUVnRVdvaUNpQUtJQkJJR3lJSElCaEtEUVFnQUVFZ0lBY2dDaUFKRUNBZ0FDQVdJQkVRSGlBQVFUQWdCeUFLSUFsQmdJQUVjeEFnSUFCQk1DQUJJQXhCQUJBZ0lBQWdEU0FNRUI0Z0FFRWdJQWNnQ2lBSlFZREFBSE1RSUNBSUtBSThJUUVNQVFzTEMwRUFJUTRNQXd0QlBTRUxDMEhVelFFZ0N6WUNBQXRCZnlFT0N5QUlRVUJySkFBZ0RndWtBZ0VEZnlNQVFkQUJheUlGSkFBZ0JTQUNOZ0xNQVNBRlFhQUJhaUlDUVFCQktCQVpHaUFGSUFVb0Fzd0JOZ0xJQVFKQVFRQWdBU0FGUWNnQmFpQUZRZEFBYWlBQ0lBTWdCQkIwUVFCSURRQWdBQ2dDVEVFQVNDQUFJQUFvQWdBaUIwRmZjVFlDQUFKL0FrQUNRQ0FBS0FJd1JRUkFJQUJCMEFBMkFqQWdBRUVBTmdJY0lBQkNBRGNERUNBQUtBSXNJUVlnQUNBRk5nSXNEQUVMSUFBb0FoQU5BUXRCZnlBQUVFY05BUm9MSUFBZ0FTQUZRY2dCYWlBRlFkQUFhaUFGUWFBQmFpQURJQVFRZEFzaEFTQUdCSDhnQUVFQVFRQWdBQ2dDSkJFQUFCb2dBRUVBTmdJd0lBQWdCallDTENBQVFRQTJBaHdnQUNnQ0ZCb2dBRUlBTndNUVFRQUZJQUVMR2lBQUlBQW9BZ0FnQjBFZ2NYSTJBZ0FOQUFzZ0JVSFFBV29rQUF1VkFRRUdmMEVJSVFJakFFR0FBbXNpQlNRQUlBRkJBazRFUUNBQUlBRkJBblJxSWdjZ0JUWUNBQU5BSUFjb0FnQWdBQ2dDQUVHQUFpQUNJQUpCZ0FKUEd5SUVFQllhUVFBaEF3TkFJQUFnQTBFQ2RHb2lCaWdDQUNBQUlBTkJBV29pQTBFQ2RHb29BZ0FnQkJBV0dpQUdJQVlvQWdBZ0JHbzJBZ0FnQVNBRFJ3MEFDeUFDSUFScklnSU5BQXNMSUFWQmdBSnFKQUFMS1FBZ0FFRUJheUlBYUVFQUlBQWJJZ0FFZnlBQUJTQUJhRUVBSUFFYklnQkJJSEpCQUNBQUd3c0xuUU1CQ1g4Q1FDQUFJZ0ZCQTNFRVFBTkFJQUV0QUFBaUFrVU5BaUFDUVQxR0RRSWdBVUVCYWlJQlFRTnhEUUFMQ3dKQUFrQkJnSUtFQ0NBQktBSUFJZ05ySUFOeVFZQ0Jnb1I0Y1VHQWdZS0VlRWNOQUFOQVFZQ0NoQWdnQTBHOSt2VHBBM01pQW1zZ0FuSkJnSUdDaEhoeFFZQ0Jnb1I0UncwQklBRW9BZ1FoQXlBQlFRUnFJZ0loQVNBRFFZQ0NoQWdnQTJ0eVFZQ0Jnb1I0Y1VHQWdZS0VlRVlOQUFzTUFRc2dBU0VDQ3dOQUlBSWlBUzBBQUNJRFJRMEJJQUZCQVdvaEFpQURRVDFIRFFBTEN5QUFJQUZHQkVCQkFBOExBa0FnQUNBQklBQnJJZ1pxTFFBQURRQkI4TlVCS0FJQUlnVkZEUUFnQlNnQ0FDSUJSUTBBQTBBQ1FBSi9JQUFoQXlBQklRSkJBQ0FHSWdkRkRRQWFJQU10QUFBaUJBUi9Ba0FEUUNBRUlBSXRBQUFpQ0VjTkFTQUlSUTBCSUFkQkFXc2lCMFVOQVNBQ1FRRnFJUUlnQXkwQUFTRUVJQU5CQVdvaEF5QUVEUUFMUVFBaEJBc2dCQVZCQUFzZ0FpMEFBR3NMUlFSQUlBRWdCbW9pQVMwQUFFRTlSZzBCQ3lBRktBSUVJUUVnQlVFRWFpRUZJQUVOQVF3Q0N3c2dBVUVCYWlFSkN5QUpDeWNCQVg5QkhDRURJQUZCQTNFRWYwRWNCU0FBSUFFZ0FoQXBJZ0EyQWdCQkFFRXdJQUFiQ3d2OUF3RUZmd0ovUWFqTEFTZ0NBQ0lDSUFCQkIycEJlSEVpQVVFSGFrRjRjU0lEYWlFQUFrQWdBMEVBSUFBZ0FrMGJSUVJBSUFBL0FFRVFkRTBOQVNBQUVBNE5BUXRCMU0wQlFUQTJBZ0JCZnd3QkMwR295d0VnQURZQ0FDQUNDeUlDUVg5SEJFQWdBU0FDYWlJQVFRUnJRUkEyQWdBZ0FFRVFheUlEUVJBMkFnQUNRQUovUWVEVkFTZ0NBQ0lCQkg4Z0FTZ0NDQVZCQUFzZ0FrWUVRQ0FDSUFKQkJHc29BZ0JCZm5GcklnUkJCR3NvQWdBaEJTQUJJQUEyQWdnZ0JDQUZRWDV4YXlJQUlBQW9BZ0JxUVFSckxRQUFRUUZ4QkVBZ0FDZ0NCQ0lCSUFBb0FnZ2lCRFlDQ0NBRUlBRTJBZ1FnQUNBRElBQnJJZ0UyQWdBTUF3c2dBa0VRYXd3QkN5QUNRUkEyQWdBZ0FpQUFOZ0lJSUFJZ0FUWUNCQ0FDUVJBMkFneEI0TlVCSUFJMkFnQWdBa0VRYWdzaUFDQURJQUJySWdFMkFnQUxJQUFnQVVGOGNXcEJCR3NnQVVFQmNqWUNBQ0FBQW44Z0FDZ0NBRUVJYXlJQlFmOEFUUVJBSUFGQkEzWkJBV3NNQVFzZ0FVRWRJQUZuSWdOcmRrRUVjeUFEUVFKMGEwSHVBR29nQVVIL0gwME5BQnBCUHlBQlFSNGdBMnQyUVFKeklBTkJBWFJyUWNjQWFpSUJJQUZCUDA4YkN5SUJRUVIwSWdOQjRNMEJhallDQkNBQUlBTkI2TTBCYWlJREtBSUFOZ0lJSUFNZ0FEWUNBQ0FBS0FJSUlBQTJBZ1JCNk5VQlFlalZBU2tEQUVJQklBR3Rob1EzQXdBTElBSkJmMGNMdlFFQkFuOENRQ0FBS0FKTUlnRkJBRTRFUUNBQlJRMEJRWXpXQVNnQ0FDQUJR
20Zi8vLy84RGNVY05BUXNDUUNBQUtBSlFRUXBHRFFBZ0FDZ0NGQ0lCSUFBb0FoQkdEUUFnQUNBQlFRRnFOZ0lVSUFGQkNqb0FBQThMSUFBUWZBOExJQUJCekFCcUlnRWdBU2dDQUNJQ1FmLy8vLzhESUFJYk5nSUFBa0FDUUNBQUtBSlFRUXBHRFFBZ0FDZ0NGQ0lDSUFBb0FoQkdEUUFnQUNBQ1FRRnFOZ0lVSUFKQkNqb0FBQXdCQ3lBQUVId0xJQUVvQWdBYUlBRkJBRFlDQUF0OEFRSi9Jd0JCRUdzaUFTUUFJQUZCQ2pvQUR3SkFBa0FnQUNnQ0VDSUNCSDhnQWdVZ0FCQkhEUUlnQUNnQ0VBc2dBQ2dDRkNJQ1JnMEFJQUFvQWxCQkNrWU5BQ0FBSUFKQkFXbzJBaFFnQWtFS09nQUFEQUVMSUFBZ0FVRVBha0VCSUFBb0FpUVJBQUJCQVVjTkFDQUJMUUFQR2dzZ0FVRVFhaVFBQzdBQ0FRSi9JQUFFUUNBQUtBSUFFRUFnQUVFQU5nSUFJQUFvQWtnaUFRUkFJQUVRRkNBQVFRQTJBa2dMSUFBb0FrUWlBUVJBSUFFUUZDQUFRUUEyQWtRTElBQW9BbXdpQVFSQUlBRVFGQ0FBUVFBMkFtd0xJQUFvQW5RaUFRUkFJQUVvQWdBaUFnUkFJQUlRRkNBQUtBSjBJZ0ZCQURZQ0FBc2dBUkFVSUFCQkFEWUNkQXNnQUNnQ2VDSUJCRUFnQVNnQ0RDSUNCRUFnQWhBVUlBQW9BbmdpQVVFQU5nSU1DeUFCS0FJRUlnSUVRQ0FDRUJRZ0FDZ0NlQ0lCUVFBMkFnUUxJQUVvQWdnaUFnUkFJQUlRRkNBQUtBSjRJZ0ZCQURZQ0NBc2dBU2dDQUNJQ0JFQWdBaEFVSUFBb0FuZ2lBVUVBTmdJQUN5QUJFQlFnQUVFQU5nSjRDeUFBS0FJRUlnRUVRQ0FCRURnZ0FFRUFOZ0lFQ3lBQUtBSUlJZ0VFUUNBQkVEZ2dBRUVBTmdJSUN5QUFFQlFMQzRzYUFoNS9CWHNqQUVId0FXc2lDQ1FBUVFFaERnSkFJQUFvQWdBb0Fqd05BQ0FBS0FLQUFRMEFBa0FDUUNBQUtBSjBJZ2xGQkVBZ0FDZ0NlQ0VGREFFTElBRW9BaEFoQmlBSkx3RUVJUVFDUUNBQUtBSjRJZ1ZGRFFBZ0JTZ0NERVVOQUNBRkxRQVNJUVlMQWtBZ0JBUkFJQWtvQWdBaENRTkFJQWtnQTBFR2JHb2lDaThCQUNJSElBWlBCRUFnQ0NBR05nSzBBU0FJSUFjMkFyQUJJQUpCQVVIdTZnQWdDRUd3QVdvUUUwRUFJUTRNQmdzQ1FDQUtMd0VFSWdwRkRRQWdDa0gvL3dOR0RRQWdDa0VCYXlJS0lBWkpEUUFnQ0NBR05nS2tBU0FJSUFvMkFxQUJJQUpCQVVIdTZnQWdDRUdnQVdvUUUwRUFJUTRNQmdzZ0EwRUJhaUlESUFSSERRQUxEQUVMSUFZTkFnd0JDd05BSUFaQkFXc2hCa0VBSVFNRFFDQUpJQU5CQm14cUx3RUFJQVpIQkVBZ0EwRUJhaUlESUFSSERRRU1CQXNMSUFZTkFBc0xBa0FnQlVVTkFDQUZLQUlNSWdwRkRRQUNRQUpBSUFVdEFCSWlCUVJBUVFBaEEwRUJJUWNEUUNBQktBSVFJZ1FnQ2lBRFFRSjBhaThCQUNJR1RRUkFJQWdnQkRZQ2xBRWdDQ0FHTmdLUUFTQUNRUUZCN3VvQUlBaEJrQUZxRUJOQkFDRUhDeUFEUVFGcUlnTWdCVWNOQUFzZ0JVRUVFQmNpQkVVTkFVRUFJUU1EUUFKQUlBb2dBMEVDZEdvaUJpMEFBaUlKUVFKUEJFQWdDQ0FKTmdKRUlBZ2dBellDUUNBQ1FRRkJtZDRBSUFoQlFHc1FFMEVBSVFjTUFRc2dCU0FHTFFBRElnWk5CRUFnQ0NBR05nS0FBU0FDUVFGQjRkMEFJQWhCZ0FGcUVCTkJBQ0VIREFFTElBUWdCa0VDZEdvaEN3SkFJQWxCQVVjaURBMEFJQXNvQWdCRkRRQWdDQ0FHTmdKUUlBSkJBVUhpMlFBZ0NFSFFBR29RRTBFQUlRY01BUXNDUUNBSkRRQWdCa1VOQUNBSUlBWTJBbVFnQ0NBRE5nSmdJQUpCQVVIWTNBQWdDRUhnQUdvUUUwRUFJUWNNQVFzQ1FDQU1EUUFnQXlBR1JnMEFJQWdnQmpZQ2VDQUlJQU0yQW5RZ0NDQUROZ0p3SUFKQkFVSDgzQUFnQ0VId0FHb1FFMEVBSVFjTUFRc2dDMEVCTmdJQUN5QURRUUZxSWdNZ0JVY05BQXNnQjBVaEIwRUFJUU1EUUFKQUFrQWdCQ0FEUVFKMElnWnFLQUlBUlFSQUlBWWdDbW90QUFJTkFRc2dBMEVCYWlJRElBVkhEUUlnQjBFQmNRMEJJQUVvQWhCQkFVY05CVUVBSVFNRFFDQUVJQU5CQW5ScUtBSUFCRUFnQlNBRFFRRnFJZ05IRFFFTUJ3c0xRUUFoQ1NBQ1FRSkJnTWdBUVFBUUUwRUFJUU1nQlVFRVR3UkFJQVZCL0FGeElRZEJBQ0VHQTBBZ0NpQURRUUowYWlJTElBTTZBQU1nQzBFQk9nQUNJQW9nQTBFQmNpSUxRUUowYWlJTUlBczZBQU1nREVFQk9nQUNJQW9nQTBFQ2NpSUxRUUowYWlJTUlBczZBQU1nREVFQk9nQUNJQW9nQTBFRGNpSUxRUUowYWlJTUlBczZBQU1nREVFQk9nQUNJQU5CQkdvaEF5QUdRUVJxSWdZZ0IwY05BQXNMSUFWQkEzRWlCVVVOQlFOQUlBb2dBMEVDZEdvaUJpQURPZ0FESUFaQkFUb0FBaUFEUVFGcUlRTWdDVUVCYWlJSklBVkhEUUFMREFVTElBZ2dBellDTUVFQklRY2dBa0VCUWJqV0FDQUlRVEJxRUJNZ0EwRUJhaUlESUFWSERRRUxDeUFFRUJSQkFDRU9EQVVMSUFWQkJCQVhJZ1FOQVF0QkFDRU9JQUpCQVVIWTN3QkJBQkFUREFNTElBUVFGQXNDUUNBQUtBSjRJZ1ZGRFFBZ0JTZ0NEQ0lQUlFSQUlBVW9BZ1FRRkNBQUtBSjRLQUlJRUJRZ0FDZ0NlQ2dDQUJBVUlBQW9BbmdpQlNnQ0RDSUVCSDhnQkJBVUlBQW9BbmdGSUFVTEVCUWdBRUVBTmdKNERBRUxJQUVvQWhnaERRSkFBa0FnQlMwQUVpSUxCRUFnQlNnQ0FDRVVJQVVvQWdRaEJpQUZLQUlJSVFwQkFDRURBa0FEUUNBTklBOGdBMEVDZEdvdkFRQkJOR3hxS0FJc0JFQWdDeUFEUVFGcUlnTkhEUUVNQWdzTElBZ2dBellDSUNBQ1FRRkJrT3dBSUFoQklHb1FFMEVBSVE0TUJnc2dDMEUwYkJBWUlnbEZEUUZCQUNFREEwQWdEeUFEUVFKMGFpSUZMd0VBSVFjZ0NTQUZMUUFDQkg4Z0JTMEFBd1VnQXd0Qk5HeHFJZ1FnRFNBSFFUUnNhaUlGL1FBQ0FQMExBZ0FnQkNBRktBSXdOZ0l3SUFRZ0JmMEFBaUQ5Q3dJZ0lBUWdCZjBBQWhEOUN3SVFJQWtnQTBFMGJHb2lCQ0FGS0FJSUlBVW9BZ3hzUVFKMEVCd2lCVFlDTENBRlJRUkFJQU1FUUNBRFFmLy9BM0VoQUFOQUlBQkJOR3dnQ1dwQkNHc29BZ0FRRkNBQVFRRnJJZ0FOQUFzTElBa1FGRUVBSVE0Z0FrRUJRZHpyQUVFQUVCTU1Cd3NnQkNBRElBcHFMUUFBTmdJWUlBUWdBeUFHYWkwQUFEWUNJQ0FEUVFGcUlnTWdDMGNOQUFzZ0FDZ0NlQzhCRUNJUVFRRnJJUklEUUNBSklCTkJOR3hxSWdVb0Fnd2dCU2dDQ0d3aEJDQU5JQThnRTBFQ2RHb2lCaThCQUVFMGJHb29BaXdoQ2dKQUlBWXRBQUpGQkVBZ0JFVU5BU0FGS0FJc0lRTkJBQ0VIUVFBaEJRSkFJQVJCQkVrTkFDQURJQXByUVJCSkRRQWdCRUY4Y1NFRlFRQWhCZ05BSUFNZ0JrRUNkQ0lNYWlBS0lBeHEvUUFDQVAwTEFnQWdCa0VFYWlJR0lBVkhEUUFMSUFRZ0JVWU5BZ3NnQlNFR0lBUkJBM0VpREFSQUEwQWdBeUFHUVFKMEloRnFJQW9nRVdvb0FnQTJBZ0FnQmtFQmFpRUdJQWRCQVdvaUJ5QU1SdzBBQ3dzZ0JTQUVhMEY4U3cwQkEwQWdBeUFHUVFKMElnVnFJQVVnQ21vb0FnQTJBZ0FnQXlBRlFRUnFJZ2RxSUFjZ0Ntb29BZ0EyQWdBZ0F5QUZRUWhxSWdkcUlBY2dDbW9vQWdBMkFnQWdBeUFGUVF4cUlnVnFJQVVnQ21vb0FnQTJBZ0FnQmtFRWFpSUdJQVJIRFFBTERBRUxJQVJGRFFBZ0ZDQUdMUUFESWdaQkFuUnFJUVVnQ1NBR1FUUnNhaWdDTENFRFFRQWhCaU
20FFUVFGSEJFQWdCRUYrY1NFVlFRQWhEQU5BSUFNZ0JrRUNkQ0lIYWlBRklBY2dDbW9vQWdBaUVTQVNJQkFnRVVvYlFRQWdFVUVBVGhzZ0MyeEJBblJxS0FJQU5nSUFJQU1nQjBFRWNpSUhhaUFGSUFjZ0Ntb29BZ0FpQnlBU0lBY2dFRWdiUVFBZ0IwRUFUaHNnQzJ4QkFuUnFLQUlBTmdJQUlBWkJBbW9oQmlBTVFRSnFJZ3dnRlVjTkFBc0xJQVJCQVhGRkRRQWdBeUFHUVFKMElnUnFJQVVnQkNBS2FpZ0NBQ0lFSUJJZ0JDQVFTQnRCQUNBRVFRQk9HeUFMYkVFQ2RHb29BZ0EyQWdBTElCTkJBV29pRXlBTFJ3MEFDd3dDQ3lBTFFUUnNFQmdpQ1EwQkMwRUFJUTRnQWtFQlFkenJBRUVBRUJNTUF3c2dBU2dDRUNJRkJFQkJBQ0VEQTBBZ0RTQURRVFJzYWlnQ0xDSUVCRUFnQkJBVUN5QURRUUZxSWdNZ0JVY05BQXNMSUEwUUZDQUJJQXMyQWhBZ0FTQUpOZ0lZQ3lBQUtBSjBJZ05GRFFFZ0F5Z0NBQ0VISUFNdkFRUWlDd1JBSUFkQkttb2hFaUFIUVNScUlSTWdCMEVlYWlFUklBZEJHR29oRkNBSFFSSnFJUlVnQjBFTWFpRVdJQWRCQm1vaEZ5QUxRUUpySVJoQkFDRURRUUVoQlFOQUFrQWdBU2dDRUNJRUlBY2dBMEVHYkdvaURTOEJBQ0lHVFFSQUlBZ2dCRFlDRkNBSUlBWTJBaEFnQWtFQ1FZRTVJQWhCRUdvUUV3d0JDeUFOTHdFRUlnbEJBV3BCLy84RGNVRUJUUVJBSUFFb0FoZ2dCa0UwYkdvZ0RTOEJBanNCTUF3QkN5QUpRUUZySWdwQi8vOERjU0lQSUFSUEJFQWdDQ0FFTmdJRUlBZ2dEellDQUNBQ1FRSkIyRGdnQ0JBVERBRUxBa0FnQmlBUFJnMEFJQTB2QVFJTkFDQUlJQUVvQWhnaUNTQUdRVFJzYWlJRUtBSXdOZ0xvQVNBSUlBVDlBQUlnL1FzRDJBRWdDQ0FFL1FBQ0VQMExBOGdCSUFnZ0JQMEFBZ0Q5Q3dPNEFTQUVJQWtnRDBFMGJDSU1haUlKS1FJSU53SUlJQVFnQ1NrQ0VEY0NFQ0FFSUFrcEFoZzNBaGdnQkNBSktRSWdOd0lnSUFRZ0NTa0NLRGNDS0NBRUlBa29BakEyQWpBZ0JDQUpLUUlBTndJQUlBRW9BaGdnREdvaUJDQUkvUUFEdUFIOUN3SUFJQVFnQ1AwQUE5Z0IvUXNDSUNBRUlBajlBQVBJQWYwTEFoQWdCQ0FJS0FMb0FUWUNNQ0FEUVFGcUlBdFBEUUFnQlNFSklCZ2dBMnRCLy84RGNTSUVRUWRQQkVBZ0JTQUVRUUZxSWhsQitQOEhjU0lRYWlFSklBcjlFQ0VrSUFiOUVDRWpRUUFoREFOQUlDTWdKQ0FISUFVZ0RHcEJCbXdpQkdvaUdpOEJBUDBRSUFRZ0Yyb2lHeThCQVAwYUFTQUVJQlpxSWh3dkFRRDlHZ0lnQkNBVmFpSWRMd0VBL1JvRElBUWdGR29pSGk4QkFQMGFCQ0FFSUJGcUloOHZBUUQ5R2dVZ0JDQVRhaUlnTHdFQS9Sb0dJQVFnRW1vaUJDOEJBUDBhQnlJaElDUDlMaUFoSUNUOUxTSWwvVTVCRC8yTEFVRVAvWXdCL1ZJaElpQWhJQ1A5TFNBbC9WQWlJZjBaQUVFQmNRUkFJQm9nSXYxWkFRQUFDeUFoL1JrQlFRRnhCRUFnR3lBaS9Wa0JBQUVMSUNIOUdRSkJBWEVFUUNBY0lDTDlXUUVBQWdzZ0lmMFpBMEVCY1FSQUlCMGdJdjFaQVFBREN5QWgvUmtFUVFGeEJFQWdIaUFpL1ZrQkFBUUxJQ0g5R1FWQkFYRUVRQ0FmSUNMOVdRRUFCUXNnSWYwWkJrRUJjUVJBSUNBZ0l2MVpBUUFHQ3lBaC9Sa0hRUUZ4QkVBZ0JDQWkvVmtCQUFjTElBeEJDR29pRENBUVJ3MEFDeUFRSUJsR0RRRUxBMEFnQ2lFRUFrQWdCaUFISUFsQkJteHFJZ3d2QVFBaUVFY0VRQ0FHSVFRZ0R5QVFSdzBCQ3lBTUlBUTdBUUFMSUFzZ0NVRUJhaUlKUWYvL0EzRkhEUUFMQ3lBQktBSVlJQVpCTkd4cUlBMHZBUUk3QVRBTElBVkJBV29oQlNBRFFRRnFJZ01nQzBjTkFBc2dBQ2dDZENJREtBSUFJUWNMSUFjRWZ5QUhFQlFnQUNnQ2RBVWdBd3NRRkNBQVFRQTJBblFNQVF0QkFDRU9JQUpCQVVIMnlRQkJBQkFUQ3lBSVFmQUJhaVFBSUE0TDVRRUJCWDhqQUVFZ2F5SUVKQUFDZndKQUlBQW9BandpQXdSQVFRRWhCUU5BSUFBb0FtUW9BaGdnQUNnQ1FDQUNRUUowYWlnQ0FDSUdRVFJzYWlnQ0xFVUVRQ0FFSUFZMkFoQWdBVUVDUVk4N0lBUkJFR29RRTBFQUlRVWdBQ2dDUENFREN5QUNRUUZxSWdJZ0Ewa05BQXNNQVF0QkFTRUZRUUVnQUNnQ1pDSURLQUlRUlEwQkdnTkFJQU1vQWhnZ0FrRTBiR29vQWl4RkJFQWdCQ0FDTmdJQUlBRkJBa0dQT3lBRUVCTkJBQ0VGSUFBb0FtUWhBd3NnQWtFQmFpSUNJQU1vQWhCSkRRQUxDMEVCSUFVTkFCb2dBVUVCUWF3V1FRQVFFMEVBQ3lBRVFTQnFKQUFMK2dZQ0UzOENmaUFBS0FJWUloQW9BaEJGQkVCQkFROExJQkFvQWhnaERTQUFLQUlVS0FJQUtBSVVJUXNEUUNBQklBMG9BaVFpQWpZQ0pDQUxLQUljSWdZZ0FrR1lBV3hxSVFNQ1FBSkFBbjhnQUNnQ1FDSVJCRUFnQmlBTEtBSVlRWmdCYkdvaUFrR1FBV3NvQWdBZ0FrR1lBV3NvQWdCcklRd2dBMEVNYWlFR0lBTkJCR29oQkNBREtBSUlJUUlnQXlnQ0FDRUZRU1FNQVFzZ0EwR1VBV29oQmlBRFFZd0JhaUVFSUFNb0FwQUJJZ0lnQXlnQ2lBRWlCV3NoREVFMEN5QUxhaWdDQUNJU1JRMEFJQVFvQWdBaEJ5QUdLQUlBSVFrZ0FpQUZheUVHSUFFb0FnZ2lBMEovSUFFMUFpZ2lGWVpDZjRVaUZpQUJOUUlRZkNBVmlLY2lDR29oQkFKL0lBVWdDRXNFUUNBRklBaHJJUTVCQUNFSVFRQWdBaUFFVFEwQkdpQUdJQVFnQldzaUJtc01BUXNnQ0NBRmF5RUlJQUlnQkUwRVFDQUdJQWhySVFaQkFDRU9RUUFNQVF0QkFDRU9JQU1oQmlBQ0lBUnJDeUFKSUFkcklRSWdBU2dDRENJRUlCWWdBVFVDRkh3Z0ZZaW5JZ3BxSVFVQ2Z5QUhJQXBMQkVBZ0J5QUtheUVQUVFBaENrRUFJQVVnQ1U4TkFSb2dBaUFGSUFkcklnSnJEQUVMSUFvZ0Iyc2hDaUFGSUFsUEJFQWdBaUFLYXlFQ1FRQWhEMEVBREFFTFFRQWhEeUFFSVFJZ0NTQUZhd3NoQjBFQUlRVWdDRUVBU0EwQklBcEJBRWdOQVVFQVNBMEJJQWRCQUVnTkFTQUdRUUJJRFFFZ0FrRUFTQTBCSUFNZ0Qyd2dEbW9oQnlBS0lBeHNJQWhxSVFrQ1FBSkFBa0FnQVNnQ0xDSUlEUUFnQ1EwQUlBY05BQ0FESUF4SERRQWdBeUFHUncwQUlBSWdCRWNOQVNBQklBdEJKRUUwSUJFYmFpSUNLQUlBTmdJc0lBSkJBRFlDQUF3REN5QUlEUUVMSUFSRkRRSWdCSzBnQTYxK1FpQ0lwdzBDSUFNZ0JHd2lBMEgvLy8vL0Ewc05BaUFCSUFOQkFuUVFIQ0lETmdJc0lBTkZEUUlnQmlBQktBSUlJZ1JHSUFFb0Fnd2lCU0FDUm5FTkFDQURRUUFnQkNBRmJFRUNkQkFaR2dzZ0FrVU5BQ0FDUVFGeElBWkJBblFoQmlBQktBSXNJQWRCQW5ScUlRUWdFaUFKUVFKMGFpRUZJQUpCQVVjRVFDQUNRZjcvLy84SGNTRUhRUUFoQWdOQUlBUWdCU0FHRUJZZ0JTQU1RUUowSWdscUlnZ2dDV29oQlNBQktBSUlRUUowYWlBSUlBWVFGaUFCS0FJSVFRSjBhaUVFSUFKQkFtb2lBaUFIUncwQUN3dEZEUUFnQkNBRklBWVFGaG9MSUF0QnpBQnFJUXNnRFVFMGFpRU5JQU
20ZCTkdvaEFVRUJJUVVnRkVFQmFpSVVJQkFvQWhCSkRRRUxDeUFGQ3dRQVFYOExnQlFDQ1g4S2ZpTUFRYUFCYXlJRkpBQUNRQ0FDUVNOTkJFQkJBQ0VDSUFOQkFVR3FMMEVBRUJNTUFRc2dBa0VrYXlJQ0lBSkJBMjRpQ1VFRGJFY0VRRUVBSVFJZ0EwRUJRYW92UVFBUUV3d0JDeUFBS0FKZ0lRWWdBU0FGUVp3QmFpSUNRUUlRRlNBQUlBVW9BcHdCT3dGb0lBRkJBbW9nQmtFSWFrRUVFQlVnQVVFR2FpQUdRUXhxUVFRUUZTQUJRUXBxSUFaQkJCQVZJQUZCRG1vZ0JrRUVha0VFRUJVZ0FVRVNhaUFBUWZRQWFrRUVFQlVnQVVFV2FpQUFRZmdBYWtFRUVCVWdBVUVhYWlBQVFld0Fha0VFRUJVZ0FVRWVhaUFBUWZBQWFrRUVFQlVnQVVFaWFpQUNRUUlRRlFKQUFrQUNRQ0FGS0FLY0FTSUNRWUNBQVUwRVFDQUdJQUkyQWhBZ0FpQUpSd1JBSUFVZ0NUWUNoQUVnQlNBQ05nS0FBU0FEUVFGQjMvUUFJQVZCZ0FGcUVCTkJBQ0VDREFVTElBWW9BZ1FpQWlBR0tBSU1JZ2RKSUFZb0FnZ2lDeUFHS0FJQUlnUkxjVVVFUUNBRklBZXRJQUt0ZlRjRGVDQUZJQXV0SUFTdGZUY0RjQ0FEUVFGQnFmRUFJQVZCOEFCcUVCTkJBQ0VDREFVTElBQW9BblFpQ0VFQUlBQW9BbmdpQ2h0RkJFQWdCU0FLTmdJRUlBVWdDRFlDQUNBRFFRRkIwZlVBSUFVUUUwRUFJUUlNQlFzQ1FBSkFJQUFvQW13aURDQUVTdzBBUVg4Z0NDQU1haUlJSUFnZ0RFa2JJQVJORFFBZ0FDZ0NjQ0lJSUFKTERRQkJmeUFJSUFwcUlnb2dDQ0FLU3hzZ0Frc05BUXRCQUNFQ0lBTkJBVUhERlVFQUVCTU1CUXNDUUNBQUtBTDRBUTBBSUFBb0F2QUJJZ2hGRFFBZ0FDZ0M5QUVpQ2tVTkFDQUxJQVJySWdRZ0NFWWdCeUFDYXlJQ0lBcEdjUTBBSUFVZ0FqWUNiQ0FGSUFRMkFtZ2dCU0FLTmdKa0lBVWdDRFlDWUNBRFFRRkJrZTBBSUFWQjRBQnFFQk5CQUNFQ0RBVUxJQVlnQ1VFMEVCY2lCRFlDR0NBRVJRMEJBa0FnQmlnQ0VFVU5BQ0FCUVNScUlBVkJtQUZxSWdKQkFSQVZJQVFnQlNnQ21BRWlDVUVIZGlJS05nSWdJQVFnQ1VIL0FIRkJBV29pRERZQ0dDQUFLQUw0QVNFTElBRkJKV29nQWtFQkVCVWdCQ0FGS0FLWUFUWUNBQ0FCUVNacUlBSkJBUkFWSUFRZ0JTZ0NtQUVpQnpZQ0JFRUFJUUlnQkNnQ0FDSUlRWUFDYTBHQmZra0VRRUVBSVFrTUJRdEJBQ0VKSUFkQmdBSnJRWUYrU1EwRUlBUW9BaGdpQjBFZlN3MERJQVJCQURZQ0pDQUVJQUFvQXJnQk5nSW9RUUVoQ1NBR0tBSVFRUUZORFFCQkFDQUtJQXNiSVFwQkFDQU1JQXNiSVFzZ0FVRW5haUVCQTBBZ0FTQUZRWmdCYWtFQkVCVWdCQ0FGS0FLWUFTSUlRUWQySWdjMkFsUWdCQ0FJUWY4QWNVRUJhaUlJTmdKTUFrQWdBQ2dDK0FFTkFDQUFMUURVQVVFRWNRMEFJQWdnQzBZZ0J5QUtSbkVOQUNBRklBYzJBbFFnQlNBSU5nSlFJQVVnQ1RZQ1RDQUZJQW8yQWtnZ0JTQUxOZ0pFSUFVZ0NUWUNRQ0FEUVFKQmxmTUFJQVZCUUdzUUV3c2dBVUVCYWlBRlFaZ0JhaUlIUVFFUUZTQUVJQVVvQXBnQk5nSTBJQUZCQW1vZ0IwRUJFQlVnQkNBRktBS1lBU0lITmdJNElBUW9BalFpQ0VHQUFtdEJnWDVKRFFVZ0IwR0FBbXRCZ0g1TkRRVWdCQ2dDVENJSFFTQlBEUVFnQVVFRGFpRUJJQVJCQURZQ1dDQUVJQUFvQXJnQk5nSmNJQVJCTkdvaEJDQUpRUUZxSWdrZ0JpZ0NFRWtOQUFzTFFRQWhBaUFBS0FKMElnZEZEUVFnQUNnQ2VDSUxSUTBFSUFBZ0I2MGlEVUlCZlNJUElBWW9BZ2dnQUNnQ2JDSUlhNjE4SUEyQXB5SUJOZ0tBQVNBQUlBdXRJZzVDQVgwaUVDQUdLQUlNSUFBb0FuQWlDbXV0ZkNBT2dLY2lCRFlDaEFFQ1FBSkFJQUZGRFFBZ0JFVU5BRUgvL3dNZ0JHNGdBVThOQVFzZ0JTQUVOZ0lVSUFVZ0FUWUNFQ0FEUVFGQmcrNEFJQVZCRUdvUUV3d0ZDeUFCSUFSc0lRa0NRQ0FBTFFCY1FRSnhCRUFnQUNBQUtBSWNJQWhySUFkdU5nSWNJQUFnQUNnQ0lDQUtheUFMYmpZQ0lDQUFJQThnQUNnQ0pDQUlhNjE4SUEyQVBnSWtJQUFnRUNBQUtBSW9JQXByclh3Z0RvQStBaWdNQVFzZ0FDQUVOZ0lvSUFBZ0FUWUNKQ0FBUWdBM0Fod0xJQUFnQ1VHTUxCQVhJZ0UyQXJRQklBRkZCRUFnQTBFQlFib2VRUUFRRXd3RkN5QUdLQUlRUWJnSUVCY2hBU0FBS0FJTUlBRTJBdEFySUFBb0Fnd29BdEFyUlFSQUlBTkJBVUc2SGtFQUVCTU1CUXRCQ2tFVUVCY2hBU0FBS0FJTUlBRTJBdkFySUFBb0Fnd2lBU2dDOEN0RkJFQWdBMEVCUWJvZVFRQVFFd3dGQ3lBQlFRbzJBdmdyUVFwQkZCQVhJUUVnQUNnQ0RDQUJOZ0w4S3lBQUtBSU1JZ0VvQXZ3clJRUkFJQU5CQVVHNkhrRUFFQk1NQlFzZ0FVRUtOZ0tFTEFKQUlBWW9BaEFpQjBVTkFDQUdLQUlZSVF0QkFDRUJJQWRCQVVjRVFDQUhRWDV4SVFoQkFDRUVBMEFnQ3lBQlFUUnNhaUlLS0FJZ1JRUkFJQUFvQWd3b0F0QXJJQUZCdUFoc2FrRUJJQW9vQWhoQkFXdDBOZ0swQ0FzZ0N5QUJRUUZ5SWdwQk5HeHFJZ3dvQWlCRkJFQWdBQ2dDRENnQzBDc2dDa0c0Q0d4cVFRRWdEQ2dDR0VFQmEzUTJBclFJQ3lBQlFRSnFJUUVnQkVFQ2FpSUVJQWhIRFFBTEN5QUhRUUZ4UlEwQUlBc2dBVUUwYkdvaUJDZ0NJQTBBSUFBb0Fnd29BdEFySUFGQnVBaHNha0VCSUFRb0FoaEJBV3QwTmdLMENBc2dDUVJBSUFBb0FyUUJJUUZCQUNFRUEwQWdBU0FHS0FJUVFiZ0lFQmNpQnpZQzBDc2dCMFVFUUNBRFFRRkJ1aDVCQUJBVERBY0xJQUZCakN4cUlRRWdCRUVCYWlJRUlBbEpEUUFMQ3dKL0lBQW9BdUFCSUFBb0FvUUJJQUFvQW9BQmJDSUJOZ0lrSUFGQktCQVhJUUVnQUNnQzRBRWlBeUFCTmdJb1FRQWdBVVVOQUJwQkFTQURLQUlrUlEwQUdrRUFJUU1EUUFKQVFRQWhCQ0FCSUFOQktHd2lCMm9pQVVFQU5nSVVJQUZCNUFBMkFoeEI1QUJCR0JBWElRa2dCeUFBS0FMZ0FTSUxLQUlvSWdGcUlBazJBaGdnQ1VVTkFFRUJJUVFnQTBFQmFpSURJQXNvQWlSSkRRRUxDeUFFQzBVTkJDQUFRUVEyQWdnZ0JpZ0NFQ0lEQkVCQmZ5QUFLQUp3SWdFZ0FDZ0NlQ0lDSUFBb0FvUUJRUUZyYkdvaUJDQUNhaUlDSUFJZ0JFa2JJZ0lnQmlnQ0RDSUVJQUlnQkVrYnJVSUJmU0VRUVg4Z0FDZ0NiQ0lDSUFBb0FuUWlCQ0FBS0FLQUFVRUJhMnhxSWdBZ0JHb2lCQ0FBSUFSTEd5SUFJQVlvQWdnaUJDQUFJQVJKRzYxQ0FYMGhFU0FCSUFZb0FnUWlBQ0FBSUFGSkc2MUNBWDBoRWlBQ0lBWW9BZ0FpQUNBQUlBSkpHNjFDQVgwaEV5QUdLQUlZSVFCQkFDRUJBMEFnQUNBU0lBQTFBZ1FpRFh3Z0RZQWlGRDRDRkNBQUlCTWdBRFVDQUNJT2ZDQU9nQ0lWUGdJUUlBQkNmeUFBTlFJb0lnK0dRbitGSWhZZ0RTQVFmQ0FOZ0NBVWZVTC8vLy8vRDROOElBK0lQZ0lNSUFBZ0RpQVJmQ0FPZ0NBVmZVTC8vLy8vRDRNZ0Zud2dENGcrQWdnZ0FFRTBhaUVBSUFGQkFXb2lBU0FEUncwQUN3dEJBU0VDREFRTElBVWdBallDa0FFZ0EwRUJRZGM5SUFWQmtBRnFFQk5CQUNFQ0RBTUxRUUFoQWlBR1FRQTJBaEFnQTBFQlFib2VRUUFRRXd3Q0N5QUZJQWMyQWpRZ0JTQUpOZ0l3SUFOQkFVR0YrQUFnQlVFd2FoQVREQUVMSUFVZ0J6WUNLQ0FGSUFnMkFpUWdCU0FKTmdJZ0lBTkJBVUhmN3dBZ0JVRWdhaEFUQ3lBRlFhQUJhaVFBSUFJTG1nTUJCbjhqQUVFUWF5SUdKQUFDZnlBQ0lBSkJBVUVDSUFBb0FtQW9BaEFpQ0VHQkFra2JJZ2RCQVhSQkJXb2lCRzRpQlNBRWJFWWdBaUFFVDNGRkJFQWdBMEVCUWY0alFRQVFFMEVBREFFTEFuOGdBQ2dDQ0VFUVJnUkFJQUFvQXJRQklBQW9BdVFCUVl3c2JHb01BUXNnQUNnQ0RBc2hCRUVBSVFBZ0JDMEFpQ3dpQWtFRWNRUkFJQVFvQXFRRFFRRnFJUUFMSUFBZ0JXb2lCVUVnVHdSQUlBWWdCVFlDQUNBRFFRRkJ3RHdnQmhBVFFRQU1BUXNnQkNBQ1FRUnlPZ0NJTENBQUlBVkpCRUFnQkNBQVFaUUJiR3BCcUFOcUlRSURRQ0FCSUFKQkFSQVZJQU
20ZCQVdvaUFTQUNRUVJxSUFjUUZTQUJJQWRxSWdFZ0FrRUlha0VDRUJVZ0FpQUNLQUlJSWdNZ0JDZ0NDQ0lKSUFNZ0NVa2JOZ0lJSUFGQkFtb2dBa0VNYWtFQkVCVWdBVUVEYWlJQklBSkJFR29nQnhBVklBRWdCMm9pQVNBR1FReHFRUUVRRlNBQ0lBWW9BZ3cyQWlRZ0FpQUNLQUlRSWdNZ0NDQURJQWhKR3pZQ0VDQUNRWlFCYWlFQ0lBRkJBV29oQVNBQVFRRnFJZ0FnQlVjTkFBc0xJQVFnQlVFQmF6WUNwQU5CQVFzZ0JrRVFhaVFBQytnQkFRTi9Jd0JCRUdzaUJDUUFBbjhDUUNBQklBUkJDR29DZnlBQUtBSmdLQUlRUVlBQ1RRUkFJQUlFUUVGL0lRVkJBUXdDQ3lBRFFRRkJzaVJCQUJBVFFRQU1Bd3NnQWtFQlRRMEJRWDRoQlVFQ0N5SUdFQlVnQkNBQ0lBVnFOZ0lNSUFRb0FnZ2lBaUFBS0FKZ0tBSVFJZ1ZQQkVBZ0JDQUZOZ0lFSUFRZ0FqWUNBQ0FEUVFGQit6c2dCQkFUUVFBTUFnc2dBQ0FDSUFFZ0Jtb2dCRUVNYWlBREVFdEZCRUFnQTBFQlFiSWtRUUFRRTBFQURBSUxRUUVnQkNnQ0RFVU5BUm9nQTBFQlFiSWtRUUFRRTBFQURBRUxJQU5CQVVHeUpFRUFFQk5CQUFzZ0JFRVFhaVFBQzlVQkFRTi9Jd0JCRUdzaUJDUUFJQVFnQWpZQ0RBSkFBa0FnQUVFQUlBRWdCRUVNYWlBREVFdEZEUUFnQkNnQ0RBMEFBbjhnQUNnQ0NFRVFSZ1JBSUFBb0FyUUJJQUFvQXVRQlFZd3NiR29NQVFzZ0FDZ0NEQXRCQVNFRklBQW9BbUFvQWhCQkFra05BU2dDMENzaUFrRWNhaUVHUVFFaEFTQUNJUU1EUUNBRElBSW9BaGcyQXRBSUlBTWdBaWdDcEFZMkF0d09JQU5CMUFocUlBWkJpQVlRRmhvZ0EwRzRDR29oQXlBQlFRRnFJZ0VnQUNnQ1lDZ0NFRWtOQUFzTUFRc2dBMEVCUWNvalFRQVFFd3NnQkVFUWFpUUFJQVVMMWdFQkEzOGpBRUVRYXlJRUpBQUNRQ0FDUVFGQkFpQUFLQUpnS0FJUUlnSkJnUUpKR3lJRlFRSnFSd1JBUVFBaEFDQURRUUZCbUNGQkFCQVREQUVMQW44Z0FDZ0NDRUVRUmdSQUlBQW9BclFCSUFBb0F1UUJRWXdzYkdvTUFRc2dBQ2dDREFzaEJpQUJJQVJCREdvZ0JSQVZRUUVoQUNBQklBVnFJZ1VnQkVFSWFrRUJFQlVnQWlBRUtBSU1JZ0ZOQkVBZ0JDQUNOZ0lFSUFRZ0FUWUNBQ0FEUVFGQnB2UUFJQVFRRTBFQUlRQU1BUXNnQlVFQmFpQUdLQUxRS3lBQlFiZ0liR3BCcUFacVFRRVFGUXNnQkVFUWFpUUFJQUFMaEFJQkJYOGpBRUVRYXlJRUpBQUNmeUFBS0FJSVFSQkdCRUFnQUNnQ3RBRWdBQ2dDNUFGQmpDeHNhZ3dCQ3lBQUtBSU1DeUVHQWtCQkFVRUNJQUFvQW1BaUJ5Z0NFRUdCQWtrYklnVWdBazhFUUVFQUlRSWdBMEVCUVpna1FRQVFFd3dCQ3lBRUlBSWdCVUYvYzJvMkFnd2dBU0FFUVFocUlBVVFGU0FFS0FJSUlnZ2dCeWdDRUU4RVFFRUFJUUlnQTBFQlFjN3RBRUVBRUJNTUFRdEJBU0VDSUFFZ0JXb2lBU0FHS0FMUUt5QUlRYmdJYkdwQkFSQVZJQUFnQkNnQ0NDQUJRUUZxSUFSQkRHb2dBeEJNUlFSQVFRQWhBaUFEUVFGQm1DUkJBQkFUREFFTElBUW9BZ3hGRFFCQkFDRUNJQU5CQVVHWUpFRUFFQk1MSUFSQkVHb2tBQ0FDQzZ3R0FRZC9Jd0JCRUdzaUJpUUFJQVlnQWpZQ0RDQUFLQUpnSVFrQ2Z5QUFLQUlJUVJCR0JFQWdBQ2dDdEFFZ0FDZ0M1QUZCakN4c2Fnd0JDeUFBS0FJTUN5SUVJQVF0QUlnc1FRRnlPZ0NJTEFKQUlBSkJCRTBFUUNBRFFRRkJzQ05CQUJBVERBRUxJQUVnQkVFQkVCVWdCQ2dDQUVFSVR3UkFJQU5CQVVHT0kwRUFFQk1NQVFzZ0FVRUJhaUFHUVFocVFRRVFGU0FFSUFZb0FnZ2lBallDQkNBQ1FRVk9CRUFnQTBFQlFlVWlRUUFRRXlBRVFYODJBZ1FMSUFGQkFtb2dCRUVJYWtFQ0VCVWdCQ2dDQ0NJSFFZQ0FCR3RCZ0lCOFRRUkFJQVlnQnpZQ0FDQURRUUZCaWo4Z0JoQVREQUVMSUFRZ0FDZ0N2QUVpQWlBSElBSWJOZ0lNSUFGQkJHb2dCRUVRYWtFQkVCVWdCQ2dDRUVFQ1R3UkFJQU5CQVVIN0trRUFFQk1NQVFzZ0FVRUZhaUVDSUFZZ0JpZ0NERUVGYXpZQ0RBSkFJQWtvQWhBaUIwVU5BQ0FFS0FJQVFRRnhJUWdnQkNnQzBDc2hCRUVBSVFrZ0IwRUlUd1JBSUFkQmVIRWhBUU5BSUFRZ0JVRzRDR3hxSUFnMkFnQWdCQ0FGUVFGeVFiZ0liR29nQ0RZQ0FDQUVJQVZCQW5KQnVBaHNhaUFJTmdJQUlBUWdCVUVEY2tHNENHeHFJQWcyQWdBZ0JDQUZRUVJ5UWJnSWJHb2dDRFlDQUNBRUlBVkJCWEpCdUFoc2FpQUlOZ0lBSUFRZ0JVRUdja0c0Q0d4cUlBZzJBZ0FnQkNBRlFRZHlRYmdJYkdvZ0NEWUNBQ0FGUVFocUlRVWdDa0VJYWlJS0lBRkhEUUFMQ3lBSFFRZHhJZ0ZGRFFBRFFDQUVJQVZCdUFoc2FpQUlOZ0lBSUFWQkFXb2hCU0FKUVFGcUlna2dBVWNOQUFzTFFRQWhCU0FBUVFBZ0FpQUdRUXhxSUFNUVRFVUVRQ0FEUVFGQnNDTkJBQkFUREFFTElBWW9BZ3dFUUNBRFFRRkJzQ05CQUJBVERBRUxBbjhnQUNnQ0NFRVFSZ1JBSUFBb0FyUUJJQUFvQXVRQlFZd3NiR29NQVFzZ0FDZ0NEQXNoQVNBQUtBSmdLQUlRUVFKUEJFQWdBU2dDMENzaUFTZ0NCRUVDZENFSElBRkJzQWRxSVFvZ0FVR3NCbW9oQTBFQklRa2dBU0VDQTBBZ0FpQUIvUUFDQlAwTEFyd0lJQUlnQVNnQ0ZEWUN6QWdnQWtIa0Rtb2dBeUFIRUJZYUlBSkI2QTlxSUFvZ0J4QVdHaUFDUWJnSWFpRUNJQWxCQVdvaUNTQUFLQUpnS0FJUVNRMEFDd3RCQVNFRkN5QUdRUkJxSkFBZ0JRdnJDZ0VHZnlNQVFZQUJheUlGSkFBZ0JVRUFOZ0o0QWtBZ0FrRUlSd1JBSUFOQkFVR3FIMEVBRUJNZ0EwRUJRYW9mUVFBUUV3d0JDeUFCSUFCQjVBRnFRUUlRRlNBQlFRSnFJQVZCL0FCcVFRUVFGU0FCUVFacUlBVkI5QUJxUVFFUUZTQUJRUWRxSUFWQitBQnFRUUVRRlNBQUtBTGtBU0lCSUFBb0FvQUJJZ2dnQUNnQ2hBRnNUd1JBSUFVZ0FUWUNjQ0FEUVFGQi9qd2dCVUh3QUdvUUV3d0JDeUFBS0FLMEFTQUJRWXdzYkdvaEFpQUJJQWh1SVFjZ0JTZ0NkQ0VFQWtBZ0FDZ0NMQ0lHUVFCT0lBRWdCa2R4RFFBZ0FpZ0MxQ3RCQVdvaUJpQUVSZzBBSUFVZ0JqWUNhQ0FGSUFRMkFtUWdCU0FCTmdKZ0lBTkJBVUdXUFNBRlFlQUFhaEFUUVFBaEJBd0JDeUFDSUFRMkF0UXJBa0FnQlNnQ2ZDSUVRUUZyUVF4TkJIOGdCRUVNUncwQklBVkJERFlDUUNBRFFRSkJzOXdBSUFWQlFHc1FFeUFGS0FKOEJTQUVDMFVFUUNBRFFRUkJvdE1BUVFBUUV5QUFRUUUyQWpnTEFrQUNRQUpBQWtBZ0FpZ0MyQ3NpQmdSQUlBVW9BblFpQkNBR1NRMEJJQVVnQmpZQ05DQUZJQVEyQWpBZ0EwRUJRZmtuSUFWQk1Hb1FFeUFBUVFFMkFqaEJBQ0VFREFZTElBVW9BbmdpQkEwQkRBTUxJQVVvQW5naUJFVU5BUXNnQlNBRUlBQXRBRnhCQkhaQkFYRnFJZ1kyQW5nZ0JTZ0NkQ0lFSUFJb0F0Z3JJZ2xCQVd0TEJFQWdCU0FKTmdJVUlBVWdCRFlDRUNBRFFRRkJsaWNnQlVFUWFoQVRJQUJCQVRZQ09FRUFJUVFNQkFzZ0JDQUdUd1JBSUFVZ0JqWUNKQ0FGSUFRMkFpQWdBMEVCUWQwb0lBVkJJR29RRXlBQVFRRTJBamhCQUNFRURBUUxJQUlnQmpZQzJDc0xJQVlnQlNnQ2RFRUJha2NOQUNBQUlBQXRBRnhCQVhJNkFGd0xJQVVvQW53aEFpQUFRUkEyQWdnZ0FFRUFJQUpCREdzZ0FDZ0NPQnMyQWhnQ1FDQUFLQUlzSWdKQmYwWUVRRUVFSVFRQ1FDQUJJQWNnQ0d4cklnRWdBQ2dDSEVrTkFDQUJJQUFvQWlSUERRQWdCeUFBS0FJZ1NRMEFJQWNnQUNnQ0tFOUJBblFoQkFzZ0FDQUFMUUJjUWZzQmNTQUVjam9BWENBQUtBTGtBU0VCREFFTElBQWdBQzBBWEVIN0FYRWdBQ2dDNUFFaUFTQUNSMEVDZEhJNkFGd0xJQUFvQXVBQktBSW9JQUZCS0d4cUlnSWdBVFlDQUNBQ0lBVW9BblEyQWd3Z0JTZ0NlQ0VFSUFBb0FreEZCRUFnQWlnQ0JDQUVUd1JBUVFFaEJBd0RDeUFGSUFFMkFnQWdBMEVDUWFjTUlBVVFFeUFBUVFFMkFrd2dCU2dDZUNFRUN5QUFLQUxrQVNFQklBQW9BdUFCS0FJb0lRSWdCQVJBSUFJZ0FVRW9iR29pQVNBRU5nSUVJQUVnQlNnQ2VDSUNOZ0lJSUFFb0FoQWlBVVVFUUNBQ1FSZ1FGeUVCSUFBb0F1QUJLQUlvSUFBb0F1UUJRU2hzYWlBQk5nSVFJQUVFUUVFQklRUU1CQXRCQUNFRUlBTkJBVUgrTlVFQUVCTU1Bd3NnQVNBQ1FSaHNFQnNoQVNBQUtBTGdBU2dDS0NBQUtBTGtBVUVvYkdvaEFpQUJSUVJBSUFJb0FoQVFGRUVBSVFRZ0FDZ0M0QUVvQWlnZ0FDZ0M1QUZCS0d4cVFRQTJBaEFnQTBFQlFmNDFRUUFRRXd3REN5QUNJQUUyQWhCQkFTRUVEQUlMQWtBZ0FpQUJRU2hzYWlJRUtBSVFJZ1lOQUNBRVFRbzJBZ2hCQ2tFWUVCY2hCaUFBS0FMZ0FTZ0NLQ0lDSUFBb0F1UUJJZ0ZCS0d4cUlBWTJBaEFnQmcwQVFRQWhCQ0FDSUFGQktHeHFRUUEyQWdnZ0EwRUJRZjQxUVFBUUV3d0NDeUFGS0FKMElnY2dBaUFCUVNoc2FpSUJLQUlJU1FSQVFRRWhCQXdDQzBFQklRUWdBU0FIUVFGcUlnRTJBZ2dnQmlBQlFSaHNFQnNoQVNBQUtBTGdBU2dDS0NBQUtBTGtBVUVvYkdvaEFpQUJSUVJBSUFJb0FoQVFGRUVBSVFRZ0FDZ0M0QUVvQWlnZ0FDZ0M1QUZCS0d4cUlnQkJBRFlDQ0NBQVFRQTJBaEFnQTBFQlFmNDFRUUFRRXd3Q0N5QUNJQUUyQWhBTUFRc2dCU0FFTmdKUUlBTkJBVUhBM2dBZ0JVSFFBR29RRTBFQUlRUUxJQVZCZ0FGcUpBQWdCQXZhQmdFSWZ5TUFRZEFBYXlJREpBQWdBMEVCTmdKTUlBQW9BaXdoQ1FKQUFrQWdBQ2dDNEFFb0FpZ2lCRVVOQUNBRUtBSVFSUTBBQWtBZ0JDQUpRU2hzYWlJRUtBSUVSUVJBSUFFZ0FDa0RNRUlDZkNBQ0VEQU5BU0FDUVFGQm15cEJBQkFUREFNTElBRWdCQ2dDRUNrREFDQUNFREJGQkVBZ0FrRUJRWnNxUVFBUUV3d0RDeUFCSUFBb0FoQkJBaUFDRUIxQkFrY0VRQ0FDUVFGQmd4TkJBQkFUREFNTElBQW9BaEFnQTBISUFHcEJBaEFWSUFNb0FraEJrUDhEUmcwQUlBSkJBVUhFSDBFQUVCTU1BZ3NnQUNnQ0NFR0FBa2NOQUNBQVFRZzJBZ2dMQWtBZ0FDZ0NoQUVnQUNnQ2dBRnNJZ2RGRFFBZ0FDZ0N0QUVoQlVFQUlRUWdCMEVJVHdSQUlBZEJlSEVoQ0FOQUlBVWdCRUdNTEd4cVFYODJBdFFySUFVZ0JFRUJja0dNTEd4cVFYODJBdFFySUFVZ0JFRUNja0dNTEd4cVFYODJBdFFySUFVZ0JFRURja0dNTEd4cVFYODJBdFFySUFVZ0JFRUVja0dNTEd4cVFYODJBdFFySUFVZ0JFRUZja0dNTEd4cVFYODJBdFFySUFVZ0JFRUdja0dNTEd4cVFYODJBdFFySUFVZ0JFRUhja0dNTEd4cVFYODJBdFFySUFSQkNHb2hCQ0FLUVFocUlnb2dDRWNOQUFzTElBZEJCM0VpQjBVTkFBTkFJQVVnQkVHTUxHeHFRWDgyQXRRcklBUkJBV29oQkNBR1FRRnFJZ1lnQjBjTkFBc0xRUUFoQmlBQUlBTkJ5QUJxUVFBZ0EwSEVBR29nQTBGQWF5QURRVHhxSUFOQk9Hb2dBMEUwYWlBRFFjd0FhaUFCSUFJUUxFVU5BQ0FKUVFGcUlRY0RRQUpBSUFNb0FreEZEUUFnQUNBREtBSklJZ1JCQUVFQUlBRWdBaEF4UlEwQ0lBQW9Bb0FCSVFnZ0FDZ0NoQUVoQ2lBRElBUkJBV29pQlRZQ0lDQURJQWdnQ213MkFpUWdBa0VFUWU3YkFDQURRU0JxRUJNZ0FDZ0M2QUVnQUNnQ1pDZ0NHQkNBQVVVTkFpQUFLQUswQVNBRVFZd3
20NiR29pQmlnQzNDc2lDQVJBSUFnUUZDQUdRZ0EzQXR3ckN5QURJQVUyQWhBZ0FrRUVRYlNCQVNBRFFSQnFFQk1nQkNBSlJnUkFJQUVnQUNnQzRBRXBBd2hDQW53Z0FoQXdEUUZCQUNFR0lBSkJBVUdiS2tFQUVCTU1Bd3NnQXlBSE5nSUVJQU1nQlRZQ0FDQUNRUUpCcStvQUlBTVFFMEVBSVFZZ0FDQURRY2dBYWtFQUlBTkJ4QUJxSUFOQlFHc2dBMEU4YWlBRFFUaHFJQU5CTkdvZ0EwSE1BR29nQVNBQ0VDd05BUXdDQ3dzZ0FDQUNFSDhoQmdzZ0EwSFFBR29rQUNBR0M0WVVBdzUvQW40QmV5TUFRZEFBYXlJSkpBQWdDVUVCTmdKTUFrQUNRQ0FBS0FLQUFVRUJSdzBBSUFBb0FvUUJRUUZIRFFBZ0FDZ0NiQTBBSUFBb0FuQU5BQ0FBS0FKa0lnTW9BZ0FOQUNBREtBSUVEUUFnQXlnQ0NDQUFLQUowUncwQUlBTW9BZ3dnQUNnQ2VFY05BRUVBSVFNZ0FDQUpRY2dBYWtFQUlBbEJ4QUJxSUFsQlFHc2dDVUU4YWlBSlFUaHFJQWxCTkdvZ0NVSE1BR29nQVNBQ0VDeEZEUUVDUUFKQUlBa29Ba3hGRFFBZ0FDQUpLQUpJUVFCQkFDQUJJQUlRTVVVTkFDQUFLQUprSWdFb0FoQU5BVUVCSVFNTUF3c2dBa0VCUWFQRUFFRUFFQk1NQWdzZ0FTZ0NHQ0VGQTBBZ0JTQUVRVFJzSWdGcUtBSXNFQlFnQUNnQ1pDSUNLQUlZSWdVZ0FXb2lBeUFBS0FMb0FTSUhLQUlVS0FJQUtBSVVJQVJCekFCc2FpSUdLQUlrTmdJc0lBTWdCeWdDR0NnQ0dDQUJhaWdDSkRZQ0pDQUdRUUEyQWlSQkFTRURJQVJCQVdvaUJDQUNLQUlRU1EwQUN3d0JDeUFBUWdBM0ExQWdBQ2dDV0JBVUlBQkJBRFlDV0FKQUFrQWdBQ2dDSEEwQUlBQW9BaUFOQUNBQUtBSWtJQUFvQW9BQlJ3MEFRZ0loRVNBQUtBSW9JQUFvQW9RQlJnMEJDMElDSVJFZ0FDZ0NUQTBBSUFFb0FoeEJBa1lOQUNBQUtBS0FBU0lOSUFBb0FvUUJiQ0lEQkg0Z0EwRUJjU0VFSUFBb0F1QUJLQUlvSVFjQ1FDQURRUUZHQkVCQkFDRURRZ0FoRVF3QkN5QURRWDV4SVFaQkFDRURRZ0FoRVFOQUlBY2dBMEVvYkdvaUNDZ0NCQ0lLQkVBZ0NDZ0NFQ0FLUVJoc2FrRUlheWtEQUNJU0lCRWdFU0FTVXhzaEVRc2dCeUFEUVFGeVFTaHNhaUlJS0FJRUlnb0VRQ0FJS0FJUUlBcEJHR3hxUVFocktRTUFJaElnRVNBUklCSlRHeUVSQ3lBRFFRSnFJUU1nQlVFQ2FpSUZJQVpIRFFBTEN3SkFJQVJGRFFBZ0J5QURRU2hzYWlJREtBSUVJZ1ZGRFFBZ0F5Z0NFQ0FGUVJoc2FrRUlheWtEQUNJU0lCRWdFU0FTVXhzaEVRc2dFVUlDZkFWQ0Fnc2hFVUVBSVFRQ1FDQUFLQUlnSWdZZ0FDZ0NLQ0lPVHcwQUlBQW9BaVFpQ0NBQUtBSWNJZ1ZORFFBZ0JTQUlJQVZySWdwQmZIRWlDMm9oQnlBQUtBTGdBU2dDS0NFUElBcEJCRWtoRUFOQUlBOGdCaUFOYkVFb2JHb2hEQUpBQWtBZ0VBUkFJQVVoQXd3QkMvME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDQUUvUndBSVJOQkFDRUVBMEFnRENBRUlBVnFRU2hzYWlJRFFmd0FhaUFEUWRRQWFpQURRU3hxSUFOQkJHcjlYQUlBL1ZZQ0FBSDlWZ0lBQXYxV0FnQURJQlA5cmdFaEV5QUVRUVJxSWdRZ0MwY05BQXNnRXlBVElCUDlEUWdKQ2dzTURRNFBBQUVDQXdBQkFnUDlyZ0VpRXlBVElCUDlEUVFGQmdjQUFRSURBQUVDQXdBQkFnUDlyZ0g5R3dBaEJDQUhJUU1nQ2lBTFJnMEJDd05BSUF3Z0EwRW9iR29vQWdRZ0JHb2hCQ0FEUVFGcUlnTWdDRWNOQUFzTElBWkJBV29pQmlBT1J3MEFDd3NnQUNBRVFRTjBFQmdpQnpZQ1dDQUVSUTBBSUFkRkRRQkJBQ0VFQWtBZ0FDZ0NJQ0lHSUFBb0FpZ2lBMDhOQUNBQUtBSWtJZ1VnQUNnQ0hFME5BQU5BSUFVZ0FDZ0NIQ0lIU3dSQUlBQW9BdUFCS0FJb0lBQW9Bb0FCSUFac1FTaHNhaUVOQTBBZ0RTQUhRU2hzYWlJSUtBSUVJZ01FUUNBRFFRTnhJUW9nQ0NnQ0VDRUZRUUFoQ3dKQUlBTkJCRWtFUUVFQUlRTU1BUXNnQTBGOGNTRU9RUUFoQTBFQUlRd0RRQ0FFUVFOMElnZ2dBQ2dDV0dvZ0JTQURRUmhzYWlrREFEY0RBQ0FBS0FKWUlBaHFJQVVnQTBFQmNrRVliR29wQXdBM0F3Z2dBQ2dDV0NBSWFpQUZJQU5CQW5KQkdHeHFLUU1BTndNUUlBQW9BbGdnQ0dvZ0JTQURRUU55UVJoc2Fpa0RBRGNER0NBRFFRUnFJUU1nQkVFRWFpRUVJQXhCQkdvaURDQU9SdzBBQ3dzZ0NnUkFBMEFnQUNnQ1dDQUVRUU4wYWlBRklBTkJHR3hxS1FNQU53TUFJQU5CQVdvaEF5QUVRUUZxSVFRZ0MwRUJhaUlMSUFwSERRQUxDeUFBS0FJa0lRVUxJQWRCQVdvaUJ5QUZTUTBBQ3lBQUtBSW9JUU1MSUFaQkFXb2lCaUFEU1EwQUN5QUFLQUpZSVFjTElBQWdCRFlDVkNNQVFkQUJheUlHSkFBZ0JrSUJOd01JQWtBZ0JFRURkQ0lLUlEwQUlBWkJDRFlDRUNBR1FRZzJBaFJCQ0NJRklRUkJBaUVJQTBBZ0JrRVFhaUFJUVFKMGFpQUZJZ01nQkVFSWFtb2lCVFlDQUNBSVFRRnFJUWdnQXlFRUlBVWdDa2tOQUFzQ2Z5QUhJQXBxUVFocklnTWdCMDBFUUVFQklRaEJBU0VGUVFBTUFRdEJBU0VJUVFFaEJRTkFBbjhnQ0VFRGNVRURSZ1JBSUFjZ0JTQUdRUkJxRUVRZ0JrRUlha0VDRUR3Z0JVRUNhZ3dCQ3dKQUlBWkJFR29pQkNBRlFRRnJJZ3BCQW5ScUtBSUFJQU1nQjJ0UEJFQWdCeUFJSUFZb0Fnd2dCVUVBSUFRUU93d0JDeUFISUFVZ0JrRVFhaEJFQ3lBRlFRRkdCRUFnQmtFSWFrRUJFRHBCQUF3QkN5QUdRUWhxSUFvUU9rRUJDeUVGSUFZZ0JpZ0NDRUVCY2lJSU5nSUlJQWRCQ0dvaUJ5QURTUTBBQ3lBR0tBSU1DeUVESUFjZ0NDQURJQVZCQUNBR1FSQnFFRHNnQmlnQ0RDRUVJQVlvQWdnaENBSkFJQVZCQVVjTkFDQUlRUUZIRFFBZ0JFVU5BUXNEUUFKL0lBVkJBVXdFUUNBR1FRaHFJQWdnQkJCM0lnTVFQQ0FESUFWcURBRUxJQVpCQ0dvaUEwRUNFRG9nQmlBR0tBSUlRUWR6TmdJSUlBTkJBUkE4SUFkQkNHc2lDaUFHUVJCcUlnUWdCVUVDYXlJSVFRSjBhaWdDQUdzZ0JpZ0NDQ0FHS0FJTUlBVkJBV3RCQVNBRUVEc2dBMEVCRURvZ0JpQUdLQUlJUVFGeUlnTTJBZ2dnQ2lBRElBWW9BZ3dnQ0VFQklBUVFPeUFJQ3lFRklBZEJDR3NoQnlBR0tBSU1JUVFnQmlnQ0NDRUlJQVZCQVVjTkFDQUlRUUZIRFFBZ0JBMEFDd3NnQmtIUUFXb2tBQXNnQUNnQ2dBRWhBMEVBSVFVQ1FBTkFBbjhDUUNBRFFRRkhEUUFnQUNnQ2hBRkJBVWNOQUNBQUtBSzBBU2dDM0N0RkRRQWdDVUVBTmdKSUlBQkJBRFlDNUFFZ0FDQUFLQUlJUVlBQmNqWUNDRUVBREFFTFFRQWhBeUFBSUFsQnlBQnFRUUFnQ1VIRUFHb2dDVUZBYXlBSlFUeHFJQWxCT0dvZ0NVRTBhaUFKUWN3QWFpQUJJQUlRTEVVTkF5QUpLQUpNUlEwQ0lBa29Ba2dMSWdaQkFXb2hBeUFBSUFaQkFFRUFJQUVnQWhBeElBQW9Bb0FCSUFBb0FvUUJiQ0VIUlFSQUlBa2dCellDQkNBSklBTTJBZ0FnQWtF
20QlFjdzZJQWtRRTBFQUlRTU1Bd3NnQ1NBSE5nSWtJQWtnQXpZQ0lDQUNRUVJCN3RzQUlBbEJJR29RRXlBQUtBTG9BU0FBS0FKa0tBSVlFSUFCUlFSQVFRQWhBd3dEQ3dKQUFrQWdBQ2dDZ0FGQkFVY05BQ0FBS0FLRUFVRUJSdzBBSUFBb0FtUWlCeWdDQUNBQUtBSmdJZ1FvQWdCSERRRWdCeWdDQkNBRUtBSUVSdzBCSUFjb0FnZ2dCQ2dDQ0VjTkFTQUhLQUlNSUFRb0FneEhEUUVMSUFBb0FyUUJJQVpCakN4c2FpSUhLQUxjS3lJRVJRMEFJQVFRRkNBSFFnQTNBdHdyQ3lBSklBTTJBaEFnQWtFRVFiU0JBU0FKUVJCcUVCTWdBU2tEQ0NJU1VBUitRZ0FGSUJJZ0FTa0RPSDBMVUFSQUlBQW9BZ2hCd0FCR0RRSUxJQVZCQVdvaUJTQUFLQUtBQVNJRElBQW9Bb1FCYkVZTkFTQUFLQUpVSWdkRkRRQWdBQ2dDVUNBSFJ3MEFDeUFCSUJFZ0FpQUJLQUlzRVF3QUdnc2dBQ0FDRUg4aEF3c2dDVUhRQUdva0FDQURDN2NHQVF4L0lBQW9BbUFoQ1FKQUlBQW9Bb0FCSUFBb0FvUUJiQ0lNQkVBZ0NTZ0NFQ0lCUWJnSWJDRU5JQUVnQVd4QkFuUWhDaUFBS0FJTUlRUWdBQ2dDdEFFaEF3TkFJQU1vQXRBcklRc2dBeUFFUVl3c0VCWWlBVUVBTmdMb0t5QUJRWDgyQXRRcklBRkJBRFlDc0NnZ0FVRUFOZ0tFTENBQlFRQTJBdkFySUFGQ0FEY0MrQ3NnQVNBTE5nTFFLeUFCSUFFdEFJZ3NRZndCY1RvQWlDd2dCQ2dDNkNzRVFDQUJJQW9RR0NJRE5nTG9LeUFEUlFSQVFRQVBDeUFESUFRb0F1Z3JJQW9RRmhvTElBRWdCQ2dDK0N0QkZHd2lCUkFZSWdNMkF2QXJRUUFoQ0NBRFJRMENJQU1nQkNnQzhDc2dCUkFXR2lBRUtBTDBLeUlHQkVBZ0JDZ0M4Q3NoQXlBQktBTHdLeUVGUVFBaEJ3TkFJQU1vQWd3RVFDQUZJQU1vQWhBUUdDSUdOZ0lNSUFaRkJFQkJBQThMSUFZZ0F5Z0NEQ0FES0FJUUVCWWFJQVFvQXZRcklRWUxJQUVnQVNnQytDdEJBV28yQXZncklBVkJGR29oQlNBRFFSUnFJUU1nQjBFQmFpSUhJQVpKRFFBTEN5QUJJQVFvQW9Rc1FSUnNJZ1VRR0NJRE5nTDhLeUFEUlEwQ0lBTWdCQ2dDL0NzZ0JSQVdHaUFCSUFRb0FvUXNJZ2cyQW9Rc0lBZ0VRQ0FFS0FMOEt5RURJQUVvQXZ3cklRVkJBQ0VIQTBBZ0F5Z0NDQ0lHQkVBZ0JTQUJLQUx3S3lBR0lBUW9BdkFyYTJvMkFnZ0xJQU1vQWd3aUJnUkFJQVVnQVNnQzhDc2dCaUFFS0FMd0sydHFOZ0lNQ3lBRlFSUnFJUVVnQTBFVWFpRURJQWRCQVdvaUJ5QUlSdzBBQ3dzZ0N5QUVLQUxRS3lBTkVCWWFJQUZCakN4cUlRTWdEa0VCYWlJT0lBeEhEUUFMQzBFQklRZ2dBQUovUVFCQkFVSElBQkFYSWdGRkRRQWFJQUVnQVMwQUtFSCtBWEZCQVhJNkFDZ2dBVUVCUVFRUUZ5SUVOZ0lVSUFFZ0JBMEFHaUFCRUJSQkFBc2lBVFlDNkFFZ0FVVUVRRUVBRHdzZ0FDZ0M3QUVoQlVFQUlRUWdBU0FBUWVnQWFqWUNIQ0FCSUFrMkFoaEJBVUhRQmhBWElRTWdBU2dDRkNBRE5nSUFBa0FnQTBVTkFDQUpLQUlRUWN3QUVCY2hBeUFCS0FJVUtBSUFJZ2NnQXpZQ0ZDQURSUTBBSUFjZ0NTZ0NFRFlDRUNBQUtBSzhBU0VFSUFFZ0JUWUNMQ0FCSUFRMkFnQkJBU0VFQ3lBRURRQWdBQ2dDNkFFUVhrRUFJUWdnQUVFQU5nTG9BU0FDUVFGQnJ4eEJBQkFUQ3lBSUM1UVhBd3QvQVg0QmZTTUFRVEJySWdva0FDQUFRUUUyQWdnQ2Z3SkFBa0FnQVNBS1FTaHFJZ05CQWlBQ0VCMUJBa2NOQUNBRElBcEJMR3BCQWhBVklBb29BaXhCei80RFJ3MEFJQUJCQWpZQ0NDQUFLQUxnQVNBQktRTTRRZ0o5SWc0M0F3QWdDaUFPTndNUUlBSkJCRUc4NHdBZ0NrRVFhaEFUSUFBb0F1QUJJZ2NwQXdBaERpQUhLQUlZSWdWQkFXb2lBeUFIS0FJZ0lnUk5CRUFnQnlnQ0hDRUVEQUlMSUFjQ2Z5QUVzME1BQU1oQ2tpSVBRd0FBZ0U5ZElBOURBQUFBQUdCeEJFQWdENmtNQVF0QkFBc2lBellDSUNBSEtBSWNJQU5CR0d3UUd5SUVCRUFnQnlBRU5nSWNJQWNvQWhnaUJVRUJhaUVEREFJTElBY29BaHdRRkNBSFFRQTJBaUFnQjBJQU53TVlJQUpCQVVHV0hrRUFFQk1MSUFKQkFVR0QrZ0JCQUJBVFFRQU1BUXNnQkNBRlFSaHNhaUlFUVFJMkFoQWdCQ0FPeERjRENDQUVRYy8rQXpzQkFDQUhJQU0yQWhnZ0FTQUFLQUlRUVFJZ0FoQWRRUUpIQkVBZ0FrRUJRWU1UUVFBUUUwRUFEQUVMSUFBb0FoQWdDa0VvYWtFQ0VCVUNRQUpBSUFvb0FpZ2lCRUdRL3dOSEJFQURRRUdnd2dFaEJTQUVRZi85QTAwRVFDQUtJQVEyQWdBZ0FrRUJRYmNSSUFvUUUwRUFEQVVMQTBBZ0JTSURLQUlBSWdjRVFDQURRUXhxSVFVZ0JDQUhSdzBCQ3dzQ1FBSkFJQWNOQUVFQ0lRWWdBa0VDUWVJZFFRQVFFMEdERXlFRkFrQUNRQ0FCSUFBb0FoQkJBaUFDRUIxQkFrY05BQU5BSUFBb0FoQWdDa0VzYWtFQ0VCVkJvTUlCSVFjZ0NpZ0NMQ0lFUVlEK0EwOEVRQU5BSUFjaUF5Z0NBQ0lJQkVBZ0EwRU1haUVISUFRZ0NFY05BUXNMSUFNb0FnUWdBQ2dDQ0hGRkJFQkI4Q2toQlF3REN5QUlCRUFnQ0VHUS93TkdCRUFnQ2tHUS93TTJBaWdNQndzZ0FTa0RPQ0VPSUFBb0F1QUJJZ2NvQWhnaUEwRUJhaUlFSUFjb0FpQWlCVTBFUUNBSEtBSWNJUVVNQlFzZ0J3Si9JQVd6UXdBQXlFS1NJZzlEQUFDQVQxMGdEME1BQUFBQVlIRUVRQ0FQcVF3QkMwRUFDeUlETmdJZ0lBY29BaHdnQTBFWWJCQWJJZ1VFUUNBSElBVTJBaHdnQnlnQ0dDSURRUUZxSVFRTUJRc2dCeWdDSEJBVUlBZEJBRFlDSUNBSFFnQTNBeGhCbGg0aEJRd0RDeUFHUVFKcUlRWUxJQUVnQUNnQ0VFRUNJQUlRSFVFQ1JnMEFDd3NnQWtFQklBVkJBQkFUSUFKQkFVSFN6QUJCQUJBVFFRQU1Cd3NnQlNBRFFSaHNhaUlESUFZMkFoQWdBeUFPcHlBR2E2dzNBd2dnQTBFQU93RUFJQWNnQkRZQ0dDQUtJQWcyQWloQm9NSUJJUVFEUUNBRUlnTW9BZ0FpQjBVTkFTQURRUXhxSVFRZ0J5QUlSdzBBQ3dzZ0F5Z0NCQ0FBS0FJSWNVVUVRQ0FDUVFGQjhDbEJBQkFUUVFBTUJnc2dBU0FBS0FJUVFRSWdBaEFkUVFKSEJFQWdBa0VCUVlNVFFRQVFFMEVBREFZTElBQW9BaEFnQ2tFa2FrRUNFQlVnQ2lnQ0pDSUVRUUZOQkVBZ0FrRUJRWlV2UVFBUUUwRUFEQVlMSUFvZ0JFRUNheUlGTmdJa0lBQW9BaEFoQkNBQUtBSVVJQVZKQkVBZ0JDQUZFQnNpQkVVRVFDQUFLQUlRRUJRZ0FFSUFOd01RSUFKQkFVSElKa0VBRUJOQkFBd0hDeUFBSUFRMkFoQWdBQ0FLS0FJa0lnVTJBaFFMSUFFZ0JDQUZJQUlRSFNJRUlBb29BaVJIQkVBZ0FrRUJRWU1UUVFBUUUwRUFEQVlMSUFBZ0FDZ0NFQ0FFSUFJZ0F5Z0NDQkVCQUVVRVFDQUNRUUZCbFJOQkFCQVRRUUFNQmdzZ0FTa0RPQ0VPSUFvb0FpUWhDQUpBSUFBb0F1QUJJZ01vQWhnaUJrRUJhaUlGSUFNb0FpQWlCRTBFUUNBREtBSWNJUVFNQVFzZ0F3Si9JQVN6UXdBQXlFS1NJZzlEQUFDQVQxMGdEME1BQU
20FBQVlIRUVRQ0FQcVF3QkMwRUFDeUlFTmdJZ0lBTW9BaHdnQkVFWWJCQWJJZ1JGRFFVZ0F5QUVOZ0ljSUFNb0FoZ2lCa0VCYWlFRkN5QUVJQVpCR0d4cUlnUWdDRUVFYWpZQ0VDQUVJQTZuSUFoclFRUnJyRGNEQ0NBRUlBYzdBUUFnQXlBRk5nSVlJQUVnQUNnQ0VFRUNJQUlRSFVFQ1J3UkFJQUpCQVVHREUwRUFFQk5CQUF3R0MwRUJJQXdnQjBIYy9nTkdHeUVNUVFFZ0NTQUhRZEwrQTBZYklRbEJBU0FMSUFkQjBmNERSaHNoQ3lBQUtBSVFJQXBCS0dwQkFoQVZJQW9vQWlnaUJFR1Evd05IRFFFTEN5QUxEUUVMSUFKQkFVR01KVUVBRUJOQkFBd0NDeUFKUlFSQUlBSkJBVUc2SlVFQUVCTkJBQXdDQ3lBTVJRUkFJQUpCQVVIb0pVRUFFQk5CQUF3Q0MwRUFJUU5CQUNFRlFRQWhDU01BUVJCcklnY2tBRUVCSVF3Q1FDQUFMUURVQVVFQmNVVU5BQUpBSUFBb0FvZ0JJZ1pGRFFBQ1FBTkFJQUFvQW93QklBbEJBM1JxSWdRb0FnQWlDd1JBSUFNZ0JDZ0NCQ0lJYXlJRVFRQWdBeUFFVHhzaEJDQURJQWhKQkVBZ0NDQURheUVHSUFNZ0Myb2hDQU5BSUFaQkJFa0VRRUdDTENFRERBVUxJQWdnQjBFTWFrRUVFQlVnQnlnQ0RDSURRWDl6SUFWSkJFQkI2Q3NoQXd3RkN5QURJQVpCQkdzaUMyc2dCQ0FESUF0TElnMGJJUVFnQXlBRmFpRUZJQXNnQTJzaEJpQUlRUUFnQXlBTkcycEJCR29oQ0NBRElBdEpEUUFMSUFBb0FvZ0JJUVlMSUFRaEF3c2dDVUVCYWlJSklBWkpEUUFMSUFORkRRRkJBQ0VNSUFKQkFVSFdGMEVBRUJNTUFndEJBQ0VNSUFKQkFTQURRUUFRRXd3QkN5QUFJQVVRR0NJRE5nS2dBU0FEUlFSQVFRQWhEQ0FDUVFGQnpDRkJBQkFUREFFTElBQWdCVFlDbEFFZ0FDZ0NqQUVoQmdKQUlBQW9Bb2dCSWdnRVFFRUFJUVZCQUNFRFFRQWhCQU5BSUFZZ0JFRURkQ0lMYWlJTktBSUFJZ2tFUUNBQUtBS2dBU0FEYWlFSUFuOGdEU2dDQkNJR0lBVk5CRUFnQ0NBSklBWVFGaG9nQXlBR2FpRURJQVVnQm1zTUFRc2dDQ0FKSUFVUUZob2dBeUFGYWlFRElBWWdCV3NoQmlBRklBbHFJUVVEUUNBR1FRUkpEUVVnQlNBSFFRaHFRUVFRRlNBRlFRUnFJUVVnQUNnQ29BRWdBMm9oQ1NBR1FRUnJJZ1lnQnlnQ0NDSUlTUVJBSUFrZ0JTQUdFQllhSUFNZ0Jtb2hBeUFIS0FJSUlBWnJEQUlMSUFrZ0JTQUlFQllhSUFjb0FnZ2lDU0FEYWlFRElBVWdDV29oQlNBR0lBbHJJZ1lOQUF0QkFBc2hCU0FBS0FLTUFTQUxhaWdDQUJBVUlBQW9Bb3dCSWdZZ0MycENBRGNDQUNBQUtBS0lBU0VJQ3lBRVFRRnFJZ1FnQ0VrTkFBc2dBQ2dDbEFFaEJTQUFLQUtnQVNFREN5QUFJQVUyQXFnQklBQWdBellDa0FFZ0FFRUFOZ0tJQVNBR0VCUWdBRUVBTmdLTUFRd0JDMEVBSVF3Z0FrRUJRWUlzUVFBUUV3c2dCMEVRYWlRQUlBeEZCRUFnQWtFQlFmQStRUUFRRTBFQURBSUxJQUpCQkVIRjJ3QkJBQkFUSUFBb0F1QUJJQUVwQXpoQy92Ly8vdzk4UXYvLy8vOFBnemNEQ0VFQUlRRkJBQ0VHSXdCQkVHc2lCeVFBQWtBZ0FDZ0NSQ0lFUlFSQUlBQkJBVFlDVEF3QkN5QUFLQUpNRFFBZ0FDZ0NTQ0VESUFBb0F1QUJJZ3dvQWlnaEJTQUVRUUZIQkVBZ0JFRitjU0VJQTBBZ0JTQURJQUZCQTNScUlnc3ZBUUFpRFVFb2JHb2lDU0FOTmdJQUlBa2dDU2dDQ0VFQmFqWUNDQ0FGSUFzdkFRZ2lDMEVvYkdvaUNTQUxOZ0lBSUFrZ0NTZ0NDRUVCYWpZQ0NDQUJRUUpxSVFFZ0JrRUNhaUlHSUFoSERRQUxDeUFFUVFGeEJFQWdCU0FESUFGQkEzUnFMd0VBSWdaQktHeHFJZ0VnQmpZQ0FDQUJJQUVvQWdoQkFXbzJBZ2dMQWtBZ0RDZ0NKQ0lHQkVCQkFDRUJBMEFnQlNBQlFTaHNhaWdDQ0VVRVFDQUhJQUUyQWdBZ0FrRUJRYlBJQUNBSEVCTU1Bd3NnQVVFQmFpSUJJQVpIRFFBTEN5QU1LUU1JSVE1QkFDRUZBMEFDUUNBQUtBTGdBU2dDS0NBRElBVkJBM1FpREdvdkFRQkJLR3hxSWdFb0FoQWlCa1VFUUNBQklBRW9BZ2hCR0JBWElnWTJBaEFnQmtVTkFTQUFLQUpFSVFRZ0FDZ0NTQ0VEQ3lBR0lBRW9BZ1FpQ1VFWWJHb2lCaUFPTndNQUlBWWdEaUFESUF4cU5RSUVmQ0lPTndNUUlBRWdDVUVCYWpZQ0JDQUZRUUZxSWdVZ0JFa05BUXdEQ3dzZ0FrRUJRYjAxUVFBUUV3c2dBRUVCTmdKTUlBQW9Ba1JGRFFBZ0FDZ0M0QUVvQWlnaEEwRUFJUUVEUUNBRElBQW9Ba2dnQVVFRGRHb3ZBUUJCS0d3aUFtb2lBMEVBTmdJSUlBTW9BaEFRRkNBQUtBTGdBU2dDS0NJRElBSnFRUUEyQWhBZ0FVRUJhaUlCSUFBb0FrUkpEUUFMQ3lBSFFSQnFKQUFnQUVFSU5nSUlRUUVNQVFzZ0F5Z0NIQkFVSUFOQkFEWUNJQ0FEUWdBM0F4Z2dBa0VCUVpZZVFRQVFFMEVBQ3lBS1FUQnFKQUFMSEFBZ0FDZ0NDRVVnQUNnQzJBRkJBRWNnQUNnQzNBRkJBRWR4Y1FzRUFFRUFDeVFBQWtBZ0FFVU5BQ0FBSUFFMkF0QUJJQUZGRFFBZ0FDQUFMUUJjUVFoeU9nQmNDd3VQQVFFRWZ5QUFLQUlZSWdFRVFDQUFLQUljSWdOQk5HNGhCQ0FEUVRSUEJIOUJBQ0VEQTBBZ0FTZ0NBQ0lDQkVBZ0FrRUJheEFVSUFGQkFEWUNBQXNnQVNnQ0JDSUNCRUFnQWhBVUlBRkJBRFlDQkFzZ0FTZ0NDQ0lDQkVBZ0FoQVVJQUZCQURZQ0NBc2dBVUUwYWlFQklBTkJBV29pQXlBRVJ3MEFDeUFBS0FJWUJTQUJDeEFVSUFCQkFEWUNHQXNMaUFFQkJIOGdBQ2dDR0NJQkJFQWdBQ2dDSENJQ1FjUUFiaUVFSUFKQnhBQlBCSDlCQUNFQ0EwQWdBU2dDQUNJREJFQWdBeEFVSUFGQkFEWUNBQXNnQVNnQ0JDSURCRUFnQXhBVUlBRkJBRFlDQkFzZ0FTZ0NQQkFVSUFGQkFEWUNQQ0FCUWNRQWFpRUJJQUpCQVdvaUFpQUVSdzBBQ3lBQUtBSVlCU0FCQ3hBVUlBQkJBRFlDR0FzTFB3RUJmeUFBQkVBZ0FDZ0NkQ0lCQkVBZ0FSQVVJQUJCQURZQ2RBc2dBQ2dDZUNJQkJFQWdBUkFVSUFCQkFEWUNlQXNnQUNnQ2xBRVFGQ0FBRUJRTEM4U1pCUVJGZndKN0JINEJmU01BUWVBQWF5SW1KQUFnQUNnQ0NDRWFBa0FDUUFKQUFrQWdBQ2dDQUVVRVFDQWFJQm9vQWhBZ0dpZ0NDR3NnR2lnQ0ZDQWFLQUlNYTJ4QkFuUWlCaEFjSWdVMkFqd2dCVVVFUUNBQUtBSWtHaUFBS0FJZ1FRRkJzajVCQUJBVElBQW9BaVFhSUFCQkhHb2hCUXdEQ3lBRlFRQWdCaEFaR2d3QkN5QWFLQUk4SWdWRkRRQWdCUkFVSUJwQkFEWUNQQXNnQUNnQ0VDSXlLQUljSURJb0FoaEJtQUZzYWlJRlFaZ0JheWdDQUNFMklBVkJrQUZyS0FJQUlUY2dBQ2dDRkNFdklBQW9BZ3doTUNBQUtBSUVJVGdnQUNnQ0hDZ0NBRVVOQWlBQVFSeHFJUVVDUUFKL1FRQWdBU2dDQkNJSFFRQk1EUUFhSUFFb0FnQWhDRUVBSVFZQ1FBTkFJQWdnQmtFTWJHb2lCQ2dDQUVVTkFTQUdRUUZxSWdZZ0IwY05BQXRCQUF3QkN5QUVLQUlFQ3lJRERRQkJBVUdjQVJBWElnTkZCRUFnQUNnQ0lFRUJRWVF4UVFBUUV3d0NDeUFEUVFBMkFvd0JBbjlCQUNFR1FRQWdBU2dDQkNJSFFmLy8vLzhIUmcwQUdpQUJLQUlBSVFnZ0IwRUFTZ1JBQTBBZ0NDQUdRUXhzYWlJRUtBSUFSUVJBSUFRb0FnZ2lCd1IvSUFRb0FnUWdCeEVDQUNBQktBSUFCU0FJQ3lBR1FReHNhaUlCUVE4MkFnZ2dBU0FETmdJRVFRRU1Bd3NnQmtFQmFpSUdJQWRIRFFBTEMwRUFJQWdnQjBFTWJFRU1haEFiSWdaRkRRQWFJQUVnQmpZQ0FDQUdJQUVvQWdRaUIwRU1iR29pQmtFUE5nSUlJQVlnQXpZQ0JDQUdRUUEyQWdBZ0FTQUhRUUZxTmdJRVFRRUxEUUFnQUNnQ0lFRUJRZTNBQUVFQUVCTWdBeWdDZENJQkJFQWdBUkFVSUFOQkFEWUNkQXNnQXlnQ2VDSUJCRUFnQVJBVUlBTkJBRFlDZUFzZ0F5Z0NsQUVRRkNBREVCUU1BUXNnQXlBQUtBSVlOZ0tRQVNBQUtBSW9JU3NnQUNnQ0pDRWlJQUFvQWlBaEhTQXZL
20QUtvQmlFVElEQW9BaEFoQVFKQUFrQWdMeWdDRUNJWFFjQUFjUVJBSUJjaENpTUFRYkFDYXlJUUpBQUNRQ0FUQkVBZ0lnUkFJQjFCQVVIdUdFRUFFQk1NQWdzZ0hVRUJRZTRZUVFBUUV3d0JDeUFES0FKMElRSUNRQUpBSUJvb0FoUWdHaWdDREdzaUJpQWFLQUlRSUJvb0FnaHJJZ2xzSWdFZ0F5Z0NoQUZMQkVBZ0FoQVVJQU1nQVVFQ2RDSVRFQndpQWpZQ2RDQUNSUVJBUVFBaEFnd0VDeUFESUFFMkFvUUJEQUVMSUFKRkRRRWdBVUVDZENFVEN5QUNRUUFnRXhBWkdnc2dBeWdDZUNFQ0FrQWdBeWdDaUFGQnp4UkxEUUFnQWhBVUlBTkJ3TklBRUJ3aUFqWUNlQ0FDRFFCQkFDRUNEQUVMSUFOQjBCUTJBb2dCSUFKQkFFSEEwZ0FRR1JvZ0F5QUdOZ0tBQVNBRElBazJBbndnR2lnQ0dDSUVSUVJBUVFFaEFnd0JDeUFhS0FJY0lRMUJBU0VDQWtBQ1FBSkFBa0FDUUNBYUtBSTBJZ0VFUUNBYUtBSUVJUWhCQUNFQ1FRQWhDUUpBSUFGQkJFOEVRQ0FCUVh4eElRbEJBQ0VIQTBBZ0NDQUhRUU4wYWlJR1FSeHFJQVpCRkdvZ0JrRU1haUFHL1Z3Q0JQMVdBZ0FCL1ZZQ0FBTDlWZ0lBQXlCSC9hNEJJVWNnQjBFRWFpSUhJQWxIRFFBTElFY2dSeUJIL1EwSUNRb0xEQTBPRHdBQkFnTUFBUUlEL2E0QklrY2dSeUJIL1EwRUJRWUhBQUVDQXdBQkFnTUFBUUlEL2E0Qi9Sc0FJUUlnQVNBSlJnMEJDd05BSUFnZ0NVRURkR29vQWdRZ0Ftb2hBaUFKUVFGcUlna2dBVWNOQUFzTElBRkJBVVlFUUNBREtBS1FBVVVOQlFzZ0FpQURLQUtZQVUwTkFTQURLQUtVQVNBQ0VCc2lFdzBDUVFBaEFnd0dDeUFES0FLUUFVVU5CUXNnQXlnQ2xBRWlFdzBCUVFBaEFnd0VDeUFESUFJMkFwZ0JJQU1nRXpZQ2xBRUxJQm9vQWpSRkJFQkJBQ0VDREFJTElCb29BZ1FoQjBFQUlRSkJBQ0VKQTBBZ0FpQVRhaUFISUFsQkEzUWlBV29pQmlnQ0FDQUdLQUlFRUJZYUlCb29BZ1FpQnlBQmFpZ0NCQ0FDYWlFQ0lBbEJBV29pQ1NBYUtBSTBTUTBBQ3d3QkN5QWFLQUlFS0FJQUlSTUxRUUFoQ1VFQUlRY0NmMEVBSUJvb0FpZ2lBVVVOQUJvZ0dpZ0NBQ0lHS0FJSUlRZEJBQ0FCUVFGR0RRQWFJQVlvQWlBTElRRWdCQ0FOYXdKQUlBRWdCMm9pQjBVRVFFRUFJUVJCQUNFSURBRUxRUUVoQ1NBYUtBSUFJZ0VvQWdBaEJFRUFJUWdnQjBFQlJnUkFRUUFoQ1F3QkN5QUJLQUlZSVFnTFFRRnFJUllnQXlnQ2RDRUxJQU1vQW5naERpQWFLQUlNSVJVZ0dpZ0NGQ0VQSUJvb0FnZ2hHU0FhS0FJUUlTc0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdDVVVOQUNBSURRQWdJa1VOQVNBZFFRSkJrZFFBUVFBUUUwRUJJUWNNQWdzZ0IwRUVTUTBCSUNJRVFDQVFJQWMyQW5BZ0hVRUJRZEhLQUNBUVFmQUFhaEFUREFnTElCQWdCellDWUNBZFFRRkIwY29BSUJCQjRBQnFFQk5CQUNFQ0RBZ0xJQjFCQWtHUjFBQkJBQkFUSUJvb0FoZ2lDVUVlU3cwQlFRRWhHeUFKSUJaUERRTU1CUXNnR2lnQ0dDSUJJZ2xCSGswTkFTQWlSUTBBSUJBZ0FUWUNJQ0FkUVFGQjZkOEFJQkJCSUdvUUV3d0ZDeUFRSUFrMkFnQWdIVUVCUWVuZkFDQVFFQk5CQUNFQ0RBVUxJQWtnRmtrTkFTQUhRUUpKQkVBZ0J5RWJEQUVMSUFrZ0ZrY0VRQ0FISVJzTUFRdEJBU0ViUWRETkFTMEFBQTBBSUNKRkJFQkIwTTBCUVFFNkFBQWdFQ0FITmdKQUlCMUJBa0dXMEFBZ0VFRkFheEFUREFFTFFkRE5BUzBBQUVVRVFFSFF6UUZCQVRvQUFDQVFJQWMyQWxBZ0hVRUNRWmJRQUNBUVFkQUFhaEFUQ3dzQ1FBSkFJQVJCQWtrTkFDQUNJQVJKRFFBZ0JDQUlhaUFDVFEwQkN5QWlCRUJCQUNFQ0lCMUJBVUdYeWdCQkFCQVREQVVMUVFBaEFpQWRRUUZCbDhvQVFRQVFFd3dFQ3dKQUFrQWdCQ0FUYWlJWVFRRnJMUUFBSWdGQkJIUWdHRUVDYXkwQUFFRVBjWElpQmtFQ1NRMEFJQUZCL3dGR0RRQWdCQ0FHVGcwQkN5QWlCRUJCQUNFQ0lCMUJBVUdrOXdCQkFCQVREQVVMUVFBaEFpQWRRUUZCcFBjQVFRQVFFd3dFQ3lBYUtBSWNJU1FDZnlBUVFRQTJBcEFDSUJCQkFEWUNtQUlnRUVJQU53T0lBaUFRUWdBM0E2Z0NJQkJDQURjQ25BSWdFQ0FHUVFGcklnYzJBcFFDSUJBZ0JDQVRhaUFHYXlJSk5nS0FBaUFKTVFBQUlVbEJDQ0VCSUJCQkNEWUNrQUlnRUNBSlFRRnFJZ0kyQW9BQ0lCQWdCa0VDYXlJTk5nS1VBaUFRSUVsQ0Q0UWdTU0FIUVFGR0d5SkpOd09JQWlBUUlFbEMvd0ZSTmdLWUFnSkFJQWxCQTNFaUIwRURSZzBBQWtB
20Z1NVTC9BVklOQUNBQ0xRQUFRWThCVFEwQVFRQU1BZ3RDL3dFaFNpQUdRUU5QQkVBZ0FqRUFBQ0ZLQ3lBUUlBWkJBMnNpRnpZQ2xBSWdFRUVQUVJBZ1NVTC9BVkVpRkJzaUFUWUNrQUlnRUNBQ0lBWkJBa3RxSWdrMkFvQUNJQkFnU2tJUGhDQktJQTFCQVVZYklrcEMvd0ZSTmdLWUFpQVFJRWxDQjBJSUlCUWJoaUJLaENKSk53T0lBaUFIUVFKR0RRQkMvd0VoU3dKQUlFcEMvd0ZTRFFBZ0NTMEFBRUdQQVUwTkFFRUFEQUlMSUFaQkJFOEVRQ0FKTVFBQUlVc0xJQkFnQmtFRWF5SUNOZ0tVQWlBUUlBa2dCa0VEUzJvaUNUWUNnQUlnRUNCTFFnK0VJRXNnRjBFQlJoc2lTMEwvQVZFMkFwZ0NJQkFnQVVFSFFRZ2dTa0wvQVZFaURSdHFJZ0UyQXBBQ0lCQWdTVUlIUWdnZ0RSdUdJRXVFSWtrM0E0Z0NJQWRCQVVZTkFBSkFJRXRDL3dGU0RRQWdDUzBBQUVHUEFVME5BRUVBREFJTFF2OEJJVW9nQmtFRlR3UkFJQWt4QUFBaFNnc2dFQ0FHUVFWck5nS1VBaUFRSUFrZ0JrRUVTMm8yQW9BQ0lCQWdTa0lQaENCS0lBSkJBVVliSWtwQy93RlJOZ0tZQWlBUUlBRkJCMEVJSUV0Qy93RlJJZ2tiYWlJQk5nS1FBaUFRSUVsQ0IwSUlJQWtiaGlCS2hDSkpOd09JQWdzZ0VDQkpRY0FBSUFGcnJZWTNBNGdDUVFFTFJRUkFJQ0lFUUVFQUlRSWdIVUVCUWFuWkFFRUFFQk1NQlF0QkFDRUNJQjFCQVVHcDJRQkJBQkFUREFRTElDc2dHV3NoRWlBUUlBWWlEVUVDYXlJTU5nTDBBU0FRSUFRZ0Uyb2lFVUVEYXlJR05nTGdBU0FRSUJGQkFtc3RBQUFpQVVHUEFVc2lCellDK0FFZ0VDQUJRUVIyclNKSk53UG9BU0FRUVFOQkJDQkpRZ2VEUWdkUkd5SVVOZ0x3QVNBR1FRTnhRUUZxSWdFZ0RDQUJJQXhKR3lFWEFrQUNRQ0FNUlFSQVFRQWhBaUFRSUF3Z0YyczJBdlFCREFFTElCQWdFVUVFYXlJQk5nTGdBU0FRSUFZdEFBQWlBa0dQQVVzaUNUWUMrQUVnRUNBQ3JTSktRdjhCZ3lBVXJZWWdTWVFpU1RjRDZBRWdFRUVIUVFnZ1NrTC9BSU5DL3dCUkcwRUlJQWNiSUJScUloUTJBdkFCQWtBZ0YwRUNTUVJBSUFraEJ3d0JDeUFRSUJGQkJXc2lDVFlDNEFFZ0VDQUJMUUFBSWdaQmp3RkxJZ2MyQXZnQklCQWdCcTBpU2tML0FZTWdGSzJHSUVtRUlrazNBK2dCSUJCQkNFRUhRUWdnU2tML0FJTkMvd0JSR3lBQ1FZOEJUUnNnRkdvaUZEWUM4QUVnRjBFQ1JnUkFJQUVoQmlBSklRRU1BUXNnRUNBUlFRWnJJZ0kyQXVBQklCQWdDUzBBQUNJQklpRkJqd0ZMSWdjMkF2Z0JJQkFnQWEwaVNrTC9BWU1nRksyR0lFbUVJa2szQStnQklCQkJDRUVIUVFnZ1NrTC9BSU5DL3dCUkd5QUdRWThCVFJzZ0ZHb2lGRFlDOEFFZ0YwRURSZ1JBSUFraEJpQUNJUUVNQVFzZ0VDQVJRUWRySWdFMkF1QUJJQkFnQWkwQUFDSUdRWThCU3lJSE5nTDRBU0FRSUFhdElrcEMvd0dESUJTdGhpQkpoQ0pKTndQb0FTQVFRUWhCQjBFSUlFcEMvd0NEUXY4QVVSc2dJVUdQQVUwYklCUnFJaFEyQXZBQklBSWhCZ3NnRUNBTUlCZHJJZ2syQXZRQklCUkJJRXNOQVNBSlFRUk9CRUFnQmtFRWF5Z0NBQ0VDSUJBZ0JrRUZhellDNEFFZ0VDQUpRUVJyTmdMMEFRd0JDeUFKUVFCTUJFQkJBQ0VDREFFTElBbEJBWEVDUUNBWElBMUJBMnRHQkVCQkdDRVhRUUFoQWd3QkN5QUpRZjcvLy84SGNTRWhRUmdoRjBFQUlRSWdBU0VHUVFBaERBTkFJQkFnQmtFQmF5SWdOZ0xnQVNBR0xRQUFJQkFnQmtFQ2F5SUJOZ0xnQVNBUUlBbEJBV3MyQXZRQklDQXRBQUFoQmlBUUlBbEJBbXNpQ1RZQzlBRWdGM1FnQW5JZ0JpQVhRUWhyZEhJaEFpQVhRUkJySVJjZ0FTRUdJQXhCQW1vaURDQWhSdzBBQ3d0RkRRQWdFQ0FCUVFGck5nTGdBU0FCTFFBQUlCQWdDVUVCYXpZQzlBRWdGM1FnQW5JaEFnc2dFQ0FDUWY4QmNTSUJRWThCU3pZQytBRWdFRUVIUVFnZ0FrR0FnSUQ0QjNGQmdJQ0ErQWRHRzBFSUlBY2JJZ1pCQ0VFSFFRZ2dBa0dBZ1B3RGNVR0FnUHdEUmhzZ0FrSC8vLy8vZUUwYmFpSUpRUWhCQjBFSUlBSkJnUDRCY1VHQS9nRkdHeUFDUVJCMlFmOEJjU0lIUVk4QlRSdHFJaGRCQ0VFSFFRZ2dBa0gvQUhGQi93QkdHeUFDUVFoMlFmOEJjU0lNUVk4QlRSc2dGR3BxTmdMd0FTQVFJQWNnQm5RZ0FrRVlkbklnRENBSmRISWdBU0FYZEhLdElCU3RoaUJKaERjRDZBRUxJQkJCd0FGcUlCTWdCQ0FOYTBIL0FSQmtBbjlCQUNBYlFRSkpEUUFhSUJCQm9BRnFJQmdnQ0VFQUVHUkJBQ0FiUVFKR0RRQWFRZ0FoU1VJQUlVc2dFRUVCTmdLWUFTQVFRUUEyQXBBQklCQkNBRGNEaUFFZ0VDQUlRUUZySWdFMkFwUUJJQkFnQkNBVGFpQUlhaUlHUVFGcklnazJBb0FCSUFsQkEzRWhGd0pBSUFoQkFFd0VRQ0FKSVFZTUFRc2dFQ0FHUVFKcklnWTJBb0FCSUFreEFBQWhTUXNnRUNCSk53T0lBU0FRSUVsQ2p3RldJaE0yQXBnQklCQkJCMEVJSUVsQy93Q0RRdjhBVVJzaURUWUNrQUVDUUNBWFJRMEFJQkFnQ0VFQ2F5SUhOZ0tVQVFKQUlBaEJBa2dFUUNBR0lRSU1BUXNnRUNBR1FRRnJJZ0kyQW9BQklBWXhBQUFoU3dzZ0VDQkxRbzhCVmlJVE5nS1lBU0FRSUVzZ0RhMkdJRW1FSWtvM0E0Z0JJQkJCQ0VFSFFRZ2dTMEwvQUlOQy93QlJHeUJKUW84QldCc2dEV29pRFRZQ2tBRWdGMEVCUmdSQUlBSWhCaUJLSVVrZ0FTRUlJQWNoQVF3QkN5QVFJQWhCQTJzaUJEWUNsQUVDUUNBSVFRTklCRUFnQWlFSkRBRUxJQkFnQWtFQmF5SUpOZ0tBQVNBQ01RQUFJVXdMSUJBZ1RFS1BBVllpRXpZQ21BRWdFQ0JNSUEydGhpQktoQ0pKTndPSUFTQVFRUWhCQjBFSUlFeEMvd0NEUXY4QVVSc2dTMEtQQVZnYklBMXFJZzAyQXBBQklCZEJBa1lFUUNBSklRWWdCeUVJSUFRaEFRd0JDeUFRSUFoQkJHc2lBVFlDbEFGQ0FDRkxBa0FnQ0VFRVNBUkFJQWtoQmd3QkN5QVFJQWxCQVdzaUJqWUNnQUVnQ1RFQUFDRkxDeUFRSUV0Q2p3RldJaE0yQXBnQklCQWdTeUFOcllZZ1NZUWlTVGNEaUFFZ0VFRUlRUWRCQ0NCTFF2OEFnMEwvQUZFYklFeENqd0ZZR3lBTmFpSU5OZ0tRQVNBRUlRZ0xJQTFCSUUwRVFBSkFJQWhCQlU0RVFDQUdRUU5yS0FJQUlRSWdFQ0FJUVFWck5nS1VBU0FRSUFaQkJHczJBb0FCREFFTFFRQWhBaUFJUVFKSURRQkJHQ0VJQTBBZ0VDQUdRUUZySWdrMkFvQUJJQVl0QUFBZ0VDQUJRUUZySWdjMkFwUUJJQWgwSUFKeUlRSWdBVUVCU3lBSklRWWdDRUVJYXlFSUlBY2hBUTBBQ3dzZ0VDQUNRZjhCY1NJQlFZOEJTellDbUFFZ0VFRUhRUWdnQWtHQWdJRDRCM0ZCZ0lDQStBZEdHMEVJSUJNYklnWkJDRUVIUVFnZ0FrR0FnUHdEY1VHQWdQd0RSaHNnQWtILy8vLy9lRTBiYWlJSlFRaEJCMEVJSUFKQmdQNEJjVUdBL2dGR0d5QUNRUkIyUWY4QmNTSUhRWThCVFJ0cUlnaEJDRUVIUVFnZ0FrSC9BSEZCL3dCR0d5QUNRUWgyUWY4QmNTSUVRWThCVFJzZ0RXcHFOZ0tRQVNBUUlBY2dCblFnQWtFWWRuSWdCQ0FKZEhJZ0FTQUlkSEt0SUEydGhpQkpoRGNEaUFFTFFRRUxJVE1nRHlBVmF5RWhJQlpCQVdvaExDQU9RUUE2QU1BUUlBNUJ3QkJxSVJZZ0VFR0FBbW9RTFNFRUlCSkJBRW9FUUNBa1FRRnJJUkVnRGlFR0lCWWhCMEVBSVJNZ0N5RUJRUUFoRndOQUlCY2hEU0FUUVFoMElCQkI0QUZxRURWQi93QnhRUUYwY2tIZ2dRRnFMd0VBSVFrQ1FDQVREUUFnQ1VFQUlBUkJBbXNpQWtGL1Joc2hDU0FFUVFGS0JFQWdBaUVFREFFTElCQkJnQUpxRUMwaEJBc2dFQ2tENkFFZ0VDZ0M4QUVnQmlBR0tBSUFJQWxCQkhZaUZVRURjU0FKUVFKMlFUQnhjaUFqZEhJaUZEWUNBQ0FKUVFWMlFRZHhJQWxCRUhFaUQwRUVkbkloRXlBSlFRZHhJZ0pySVJjZ0FxMklJa21uSVF
20oQkFDRUNJQklnRFVFQ2Nrb0VRQ0FUUVFoMElBaEIvd0J4UVFGMGNrSGdnUUZxTHdFQUlRSUNRQ0FURFFBZ0FrRUFJQVJCQW1zaUNFRi9SaHNoQWlBRVFRRktCRUFnQ0NFRURBRUxJQkJCZ0FKcUVDMGhCQXNnQWtFRWRrRUJjU0FDUVFWMlFRZHhjaUVUSUJjZ0FrRUhjU0lJYXlFWElFa2dDSzJJSWttbklRZ0xJQVlnQWtFQ2RFR0FCbkVnQWtFd2NYSWdJMEVFYW5RZ0ZISTJBZ0FDUUNBQ1FRSjJRUUp4SUFsQkEzWkJBWEZ5SWhSQkEwY05BRUVFUVFNZ0JFRUNheUlNUVg5R0d5RVVJQVJCQVVvRVFDQU1JUVFNQVFzZ0VFR0FBbW9RTFNFRUN3Si9JQlJGQkVBZ0VFS0JnSUNBRURjQ2VFRUFEQUVMSUJSQkFrMEVRQ0FRUVFFZ0NFRUhjVUdVb2dGcUxRQUFJZ3hCQlhaQmZ5QU1RUUoyUVFkeEloaDBRWDl6SUFnZ0RFRURjU0lJZG5GcVFRRnFJZ3dnRkVFQlJpSVVHellDZkNBUUlBeEJBU0FVR3pZQ2VDQUlJQmhxREFFTElBZ2dDRUVIY1VHVW9nRnFMUUFBSWd4QkEzRWlHSFloQ0NBVVFRTkdCRUFnREVFRmRrRUJhaUVVSUJoQkEwWUVRQ0FRSUFoQkFYRkJBbkkyQW53Z0VDQVVRWDhnREVFQ2RrRUhjU0lNZEVGL2N5QUlRUUYyY1dvMkFuZ2dERUVFYWd3Q0N5QVFJQlFnQ0NBSVFRZHhRWlNpQVdvdEFBQWlDRUVEY1NJZ2RpSWxRWDhnREVFQ2RrRUhjU0lNZEVGL2MzRnFOZ0o0SUJCQmZ5QUlRUUoyUVFkeEloUjBRWDl6SUNVZ0RIWnhJQWhCQlhacVFRRnFOZ0o4SUF3Z0dHb2dJR29nRkdvTUFRc2dFQ0FJSUFoQkIzRkJsS0lCYWkwQUFDSUlRUU54SWlCMklpVkJmeUFNUVFKMlFRZHhJaFIwUVg5emNTQU1RUVYyYWtFRGFqWUNlQ0FRUVg4Z0NFRUNka0VIY1NJTWRFRi9jeUFsSUJSMmNTQUlRUVYyYWtFRGFqWUNmQ0FZSUNCcUlCUnFJQXhxQ3lFSUFrQWdMQ0FRS0FKNEloUlBCRUFnRUNnQ2ZDSU1JQ3hORFFFTElDSUVRRUVBSVFJZ0hVRUJRZWY2QUVFQUVCTU1Cd3RCQUNFQ0lCMUJBVUhuK2dCQkFCQVREQVlMSUJBZ0Z5QUlhellDOEFFZ0VDQkpJQWl0aURjRDZBRWdBa0h3QVhFZ0ZVRVBjWEpCL3dGQi93RWdEVUVFYWlJWElCSnJRUUYwZGlBU0lCZE9HeUlJSUFoQjFRQnhJQ0ZCQVVvYklnaEJmM054QkVBZ0lnUkFRUUFoQWlBZFFRRkIvZDRBUVFBUUV3d0hDMEVBSVFJZ0hVRUJRZjNlQUVFQUVCTU1CZ3NDUUFKQUlBOEVRQ0FRUWNBQmFoQWZJUlVnRUNBUUtBTFFBU0FVSUFsQkUzUkJIM1ZxSWhock5nTFFBU0FRSUJBcEE4Z0JJQml0aURjRHlBRWdGVUYvSUJoMFFYOXpjU0FKUVFoMlFRRnhJQmgwY2tFQmNrRUNhaUFSZENBVlFSOTBjaUVZREFFTFFRQWhHQ0FJUVFGeFJRMEJDeUFCSUJnMkFnQUxBa0FnQ1VFZ2NRUkFJQkJCd0FGcUVCOGhGU0FRSUJBb0F0QUJJQlFnQ1VFU2RFRWZkV29pR0dzMkF0QUJJQkFnRUNrRHlBRWdHSzJJTndQSUFTQUJJQkpCQW5ScUlCVkJmeUFZZEVGL2MzRWdDVUVKZGtFQmNTQVlkSEpCQVhJaUdFRUNhaUFSZENBVlFSOTBjallDQUNBSFFTQWdHR2RySWhnZ0J5MEFBRUgvQUhFaUZTQVZJQmhKRzBHQUFYSTZBQUFNQVFzZ0NFRUNjVVVOQUNBQklCSkJBblJxUVFBMkFnQUxJQUZCQkdvaEZRSkFBa0FnQ1VIQUFIRUVRQ0FRUWNBQmFoQWZJUThnRUNBUUtBTFFBU0FVSUFsQkVYUkJIM1ZxSWhock5nTFFBU0FRSUJBcEE4Z0JJQml0aURjRHlBRWdEMEYvSUJoMFFYOXpjU0FKUVFwMlFRRnhJQmgwY2tFQmNrRUNhaUFSZENBUFFSOTBjaUVZREFFTFFRQWhHQ0FJUVFSeFJRMEJDeUFWSUJnMkFnQUxJQWRCQURvQUFRSkFJQWxCZ0FGeEJFQWdFRUhBQVdvUUh5RVlJQkFnRUNnQzBBRWdGQ0FKUVJCMFFSOTFhaUlVYXpZQzBBRWdFQ0FRS1FQSUFTQVVyWWczQThnQklCVWdFa0VDZEdvZ0dFRi9JQlIwUVg5emNTQUpRUXQyUVFGeElCUjBja0VCY2lJSlFRSnFJQkYwSUJoQkgzUnlOZ0lBSUFkQm9IOGdDV2RyT2dBQkRBRUxJQWhCQ0hGRkRRQWdGU0FTUVFKMGFrRUFOZ0lBQ3lBQlFRaHFJUWtDUUFKQUlBSkJFSEVFUUNBUVFjQUJhaEFmSVJnZ0VDQVFLQUxRQVNBTUlBSkJFM1JCSDNWcUloUnJOZ0xRQVNBUUlCQXBBOGdCSUJTdGlEY0R5QUVnR0VGL0lCUjBRWDl6Y1NBQ1FRaDJRUUZ4SUJSMGNrRUJja0VDYWlBUmRDQVlRUjkwY2lFVURBRUxRUUFoRkNBSVFSQnhSUTBCQ3lBSklCUTJBZ0FMQWtBZ0FrRWdjUVJBSUJCQndBRnFFQjhoR0NBUUlCQW9BdEFCSUF3Z0FrRVNkRUVmZFdvaUZHczJBdEFCSUJBZ0VDa0R5QUVnRksySU53UElBU0FKSUJKQkFuUnFJQmhCZnlBVWRFRi9jM0VnQWtFSmRrRUJjU0FVZEhKQkFYSWlDVUVDYWlBUmRDQVlRUjkwY2pZQ0FDQUhRU0FnQ1dkcklna2dCeTBBQVVIL0FIRWlGQ0FKSUJSTEcwR0FBWEk2QUFFTUFRc2dDRUVnY1VVTkFDQUpJQkpCQW5ScVFRQTJBZ0FMSUFGQkRHb2hDUUpBQWtBZ0FrSEFBSEVFUUNBUVFjQUJhaEFmSVJnZ0VDQVFLQUxRQVNBTUlBSkJFWFJCSDNWcUloUnJOZ0xRQVNBUUlCQXBBOGdCSUJTdGlEY0R5QUVnR0VGL0lCUjBRWDl6Y1NBQ1FRcDJRUUZ4SUJSMGNrRUJja0VDYWlBUmRDQVlRUjkwY2lFVURBRUxRUUFoRkNBSVFjQUFjVVVOQVFzZ0NTQVVOZ0lBQ3lBSFFRSnFJZ2RCQURvQUFBSkFJQUpCZ0FGeEJFQWdFRUhBQVdvUUh5RVVJQkFnRUNnQzBBRWdEQ0FDUVJCMFFSOTFhaUlJYXpZQzBBRWdFQ0FRS1FQSUFTQUlyWWczQThnQklBa2dFa0VDZEdvZ0ZFRi9JQWgwUVg5emNTQUNRUXQyUVFGeElBaDBja0VCY2lJSlFRSnFJQkYwSUJSQkgzUnlOZ0lBSUFkQm9IOGdDV2RyT2dBQURBRUxJQWhCZ0FGSkRRQWdDU0FTUVFKMGFrRUFOZ0lBQ3lBalFSQnpJU01nQmlBTlFRUnhhaUVHSUFGQkVHb2hBU0FTSUJkS0RRQUxDeUFLUVFoeElUa2dEa0d3REdvaEtDQU9RYUFJYWlFcElBNUJrQVJxSVNVZ0lVRURUZ1JBSUJKQkRHd2hNU0FTUVFOMElUb2dKRUVCYXlFZ1FRTWdKRUVDYXlJQmRDRXRRUUVnQVhRaExpQVNRUWRxUVFGMlFmei8vLzhIY1VFRWFpRTlJQ3NnR1VGL2Myb2lBVUVEZGlJR1FRSjBJajVCQkdvaE95QUdRUUZxSWo5Qi9QLy8vd054SWg5QkFuUWhQQ0FmUVFOMElSVWdBVUVZU1NGQVFRSWhEQU5BSUF3aEVTQVdMUUFBSVJnZ0ZrRUFPZ0FBSUNOQmIzRkJBbk1oSXdKQUlCSkJBRXdFUUNBTVFRSnFJUXdNQVFzZ0pTQU9JQkZCQkhFYklSTWdFVUVDYWlFTUlBc2dFU0FTYkVFQ2RHb2hCMEVBSVJRZ0ZpRUJRUUFoRndOQUlCY2hEU0FCTFFBQlFRVjJRUVJ4SUJRZ0dFSC9BWEVpR0VFSGRuSnlJZ1pCQ0hRZ0VFSGdBV29RTlVIL0FIRkJBWFJ5UWVDUkFXb3ZBUUF
20oQ1FKQUlBWU5BQ0FKUVFBZ0JFRUNheUlHUVg5R0d5RUpJQVJCQVVvRVFDQUdJUVFNQVFzZ0VFR0FBbW9RTFNFRUN5QVFLUVBvQVNBUUtBTHdBU0FUSUJNb0FnQWdDVUVFZGtFRGNTQUpRUUoyUVRCeGNpQWpkSElpQ0RZQ0FDQUpRY0FBY1NJY1FRVjJJQWxCZ0FGeElpcEJCblp5SVJRZ0NVRUhjU0lHYXlFS0lBYXRpQ0pKcHlFWFFRQWhBaUFTSUExQkFuSktCRUFnRkNBQkxRQUNRUVYyUVFSeElBRXRBQUZCQjNaeWNpSUdRUWgwSUJkQi93QnhRUUYwY2tIZ2tRRnFMd0VBSVFJQ1FDQUdEUUFnQWtFQUlBUkJBbXNpQmtGL1Joc2hBaUFFUVFGS0JFQWdCaUVFREFFTElCQkJnQUpxRUMwaEJBc2dDaUFDUVFkeElnWnJJUW9nQWtFRmRpQUNRUVoyY2tFQ2NTRVVJRWtnQnEySUlrbW5JUmNMSUJNZ0FrRUNkRUdBQm5FZ0FrRXdjWElnSTBFRWFuUWdDSEkyQWdCQkFTRUlRUUVoQmdKQUFrQUNRQ0FDUVFKMlFRSnhJQWxCQTNaQkFYRnlJZzhPQkFJQUFBRUFDMEVCSUJkQkIzRkJsS0lCYWkwQUFDSUdRUVYyUVg4Z0JrRUNka0VIY1NJZWRFRi9jeUFYSUFaQkEzRWlGM1p4YWtFQmFpSUdJQTlCQVVZaUR4c2hDQ0FHUVFFZ0R4c2hCaUFYSUI1cUlROE1BUXNnRnlBWFFRZHhRWlNpQVdvdEFBQWlCa0VEY1NJWGRpSWVRUWR4UVpTaUFXb3RBQUFpQ0VFRGNTSW5JQmRxSUFaQkFuWkJCM0VpRjJvZ0NFRUNka0VIY1NJMGFpRVBJQjRnSjNZaUhrRi9JQmQwUVg5emNTQUdRUVYyYWtFQmFpRUdRWDhnTkhSQmYzTWdIaUFYZG5FZ0NFRUZkbXBCQVdvaENBc2dFQ0FLSUE5ck5nTHdBU0FRSUVrZ0Q2MklOd1BvQVNBSlFmQUJjU0lYSUJkQkFXdHhCRUFnQmlBWVFmOEFjU0lLSUFFdEFBRkIvd0J4SWhnZ0NpQVlTeHNpQ2tFQ2F5SVlRUUFn
20Q2lBWVR4dHFJUVlMSUFKQjhBRnhJZ29nQ2tFQmEzRUVRQ0FJSUFFdEFBRkIvd0J4SWhnZ0FTMEFBa0gvQUhFaUR5QVBJQmhKR3lJWVFRSnJRUUFnR0VFQ1N4dHFJUWdMSUFZZ0xFMGdDQ0FzVFhGRkJFQWdJZ1JBUVFBaEFpQWRRUUZCeS9zQVFRQVFFd3dKQzBFQUlRSWdIVUVCUWN2N0FFRUFFQk1NQ0FzZ0FTMEFBaUVZSUFGQkFEc0FBU0FLSUJkQkJIWnlRZjhCUWY4QklBMUJCR29pRnlBU2EwRUJkSFlnRWlBWFRoc2lDa0hWQUhFZ0NpQU1JQ0ZLR3lJUFFYOXpjUVJBSUNJRVFFRUFJUUlnSFVFQlFmM2VBRUVBRUJNTUNRdEJBQ0VDSUIxQkFVSDkzZ0JCQUJBVERBZ0xBa0FDUUNBSlFSQnhCRUFnRUVIQUFXb1FIeUVlSUJBZ0VDZ0MwQUVnQmlBSlFSTjBRUjkxYWlJS2F6WUMwQUVnRUNBUUtRUElBU0FLcllnM0E4Z0JJQjVCZnlBS2RFRi9jM0VnQ1VFSWRrRUJjU0FLZEhKQkFYSkJBbW9nSUhRZ0hrRWZkSEloQ2d3QkMwRUFJUW9nRDBFQmNVVU5BUXNnQnlBS05nSUFDd0pBSUFsQklIRUVRQ0FRUWNBQmFoQWZJUjRnRUNBUUtBTFFBU0FHSUFsQkVuUkJIM1ZxSWdwck5nTFFBU0FRSUJBcEE4Z0JJQXF0aURjRHlBRWdCeUFTUVFKMGFpQWVRWDhnQ25SQmYzTnhJQWxCQ1haQkFYRWdDblJ5UVFGeUlncEJBbW9nSUhRZ0hrRWZkSEkyQWdBZ0FVRWdJQXBuYXlJS0lBRXRBQUJCL3dCeEloNGdDaUFlU3h0QmdBRnlPZ0FBREFFTElBOUJBbkZGRFFBZ0J5QVNRUUowYWtFQU5nSUFDeUFIUVFScUlRb0NRQUpBSUJ3RVFDQVFRY0FCYWhBZklSd2dFQ0FRS0FMUUFTQUdJQWxCRVhSQkgzVnFJaDVyTmdMUUFTQVFJQkFwQThnQklCNnRpRGNEeUFFZ0hFRi9JQjUwUVg5emNTQUpRUXAyUVFGeElCNTBja0VCY2tFQ2FpQWdkQ0FjUVI5MGNpRWVEQUVMUVFBaEhpQVBRUVJ4UlEwQkN5QUtJQjQyQWdBTEFrQWdLZ1JBSUJCQndBRnFFQjhoSGlBUUlCQW9BdEFCSUFZZ0NVRVFkRUVmZFdvaUJtczJBdEFCSUJBZ0VDa0R5QUVnQnEySU53UElBU0FLSUJKQkFuUnFJQjVCZnlBR2RFRi9jM0VnQ1VFTGRrRUJjU0FHZEhKQkFYSWlCa0VDYWlBZ2RDQWVRUjkwY2pZQ0FDQUJRYUIvSUFabmF6b0FBUXdCQ3lBUFFRaHhSUTBBSUFvZ0VrRUNkR3BC
20QURZQ0FBc2dCMEVJYWlFSkFrQUNRQ0FDUVJCeEJFQWdFRUhBQVdvUUh5RUtJQkFnRUNnQzBBRWdDQ0FDUVJOMFFSOTFhaUlHYXpZQzBBRWdFQ0FRS1FQSUFTQUdyWWczQThnQklBcEJmeUFHZEVGL2MzRWdBa0VJZGtFQmNTQUdkSEpCQVhKQkFtb2dJSFFnQ2tFZmRISWhCZ3dCQzBFQUlRWWdEMEVRY1VVTkFRc2dDU0FHTmdJQUN3SkFJQUpCSUhFRVFDQVFRY0FCYWhBZklRb2dFQ0FRS0FMUUFTQUlJQUpCRW5SQkgzVnFJZ1pyTmdMUUFTQVFJQkFwQThnQklBYXRpRGNEeUFFZ0NTQVNRUUowYWlBS1FYOGdCblJCZjNOeElBSkJDWFpCQVhFZ0JuUnlRUUZ5SWdaQkFtb2dJSFFnQ2tFZmRISTJBZ0FnQVVFZ0lBWm5heUlHSUFFdEFBRkIvd0J4SWdrZ0JpQUpTeHRCZ0FGeU9nQUJEQUVMSUE5QklIRkZEUUFnQ1NBU1FRSjBha0VBTmdJQUN5QUhRUXhxSVFrQ1FBSkFJQUpCd0FCeEJFQWdFRUhBQVdvUUh5RUtJQkFnRUNnQzBBRWdDQ0FDUVJGMFFSOTFhaUlHYXpZQzBBRWdFQ0FRS1FQSUFTQUdyWWczQThnQklBcEJmeUFHZEVGL2MzRWdBa0VLZGtFQmNTQUdkSEpCQVhKQkFtb2dJSFFnQ2tFZmRISWhCZ3dCQzBFQUlRWWdEMEhBQUhGRkRRRUxJQWtnQmpZQ0FBc2dBVUVDYWlFQkFrQWdBa0dBQVhFRVFDQVFRY0FCYWhBZklRb2dFQ0FRS0FMUUFTQUlJQUpCRUhSQkgzVnFJZ1pyTmdMUUFTQVFJQkFwQThnQklBYXRpRGNEeUFFZ0NTQVNRUUowYWlBS1FYOGdCblJCZjNOeElBSkJDM1pCQVhFZ0JuUnlRUUZ5SWdaQkFtb2dJSFFnQ2tFZmRISTJBZ0FnQVVHZ2Z5QUdaMnM2QUFBTUFRc2dEMEdBQVVrTkFDQUpJQkpCQW5ScVFRQTJBZ0FMSUNOQkVITWhJeUFUSUExQkJIRnFJUk1nQjBFUWFpRUhJQklnRjBvTkFBc0xBa0FnRzBFQ1NRMEFJQkZCQW5GRkRRQWdERUVFY1NFR0FrQUNmd0pBQWtBZ013UkFJQTRnSlNBR0d5RU5RUUFoRHlBU1FRQk1EUUVnQ3lBUlFRSnJJQkpzUVFKMGFpRVhBMEFnRUVHQUFXb1FOU0VDUVFBaENTQU5LQUlBSWdjRVFDQVhJQTlCQW5ScUlRbEJBQ0VJUVE4aEFRTkFBa0FnQVNBSGNVVU5BQ0FCUVpHaXhJZ0JjU0lUSUFkeEJFQWdDU0FKS0FJQUlBSkJmM05CQVhFZ0lIUnpJQzV5TmdJQUlBSkJBWFloQWdzZ0UwRUJkQ0FIY1FSQUlBa2dFa0VDZEdvaUNpQUtLQUlBSUFKQmYzTkJBWEVnSUhSeklDNXlOZ0lBSUFKQkFYWWhBZ3NnRTBFQ2RDQUhjUVJBSUFrZ09tb2lDaUFLS0FJQUlBSkJmM05CQVhFZ0lIUnpJQzV5TmdJQUlBSkJBWFloQWdzZ0UwRURkQ0FIY1VVTkFDQUpJREZxSWhNZ0V5Z0NBQ0FDUVg5elFRRnhJQ0IwY3lBdWNqWUNBQ0FDUVFGMklRSUxJQWxCQkdvaENTQUJRUVIwSVFFZ0NFRUJhaUlJUVFoSERRQUxJQWRwSVFrTElBMUJCR29oRFNBUUlCQW9BcEFCSUFsck5nS1FBU0FRSUJBcEE0Z0JJQW10aURjRGlBRWdEMEVJYWlJUElCSklEUUFMQ3lBcElDZ2dCaHNoQ2lBT0lDVWdCaHNoRFNBR1JTRVBJQkpCQUV3TkEwRUFJUVlnUUEwQklBb2dEU0E3YWtrZ0RTQUtJRHRxSWdKSmNRMEJRUUFnQ2lJSklBMGlBU0ErYWtFSWFra2dBVUVFYWlBQ1NYRU5BaG9nQVNBOGFpRUJJQWtnUEdvaENmME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDRkhRUUFoQWdOQUlBb2dBa0VDZENJR2FpSUhJQVlnRFdvaUJ2MEFBZ0FpU0VFRS9hMEJJRWhCQlAyckFTQkhJRWo5RFF3TkRnOFFFUklURkJVV0Z4Z1pHaHRCSFAydEFmMVEvVkFnU1AxUUlrZjlDd0lBSUFjZ1J5QUcvUUFDQkVFYy9hc0IvVkFpUjBFQi9hMEIvUXgzZDNkM2QzZDNkM2QzZDNkM2QzZDMvVTRnUjBFQi9hc0IvUXp1N3U3dTd1N3U3dTd1N3U3dTd1N3UvVTc5VUNCSC9WQWdTUDFQL1FzQ0FDQklJVWNnQWtFRWFpSUNJQjlIRFFBTElCOGdQMFlOQXlBVklRWWdSLzBiQXd3Q0N5QUdSU0VQSUNrZ0tDQUdHeUVLREFJTElBb2hDU0FOSVFGQkFBc2hBZ05BSUFKQkhIWWhCeUFKSUFFb0FnQWlBa0VFZGlBSElBSkJCSFJ5Y2lBQ2NpSUhOZ0lBSUFrZ0J5QUJLQUlFUVJ4MGNpSUhRUUYyUWZmdTNic0hjU0FIUVFGMFFlN2R1L2QrY1hJZ0IzSWdBa0YvYzNFMkFnQWdDVUVFYWlFSklBRkJCR29oQVNBR1FRaHFJZ1lnRWtnTkFBc0xJQkZCQmtrTkFFRUFJUWhCQUNFVElBMGhDU0FwSUNnZ0R4c2lIQ0VDSUE0Z0pTQVBHeUlZSVFFZ0VrRUFTZ1JBQTBBZ0NVRUVhaUVISUFJb0FnQWhGeUFKS0FJQUlRWWdBaUE1Qkg4Z0Z3VWdCa0VFZENBVFFSeDJjaUFHUVFSMmNpQUhLQUlBUVJ4MGNpQUdja0VEZEVHSWthTEVlSEVnRjNJTElBRW9BZ0JCZjNOeE5nSUFJQUZCQkdvaEFTQUNRUVJxSVFJZ0JpRVRJQWNoQ1NBSVFRaHFJZ2dnRWtnTkFBc2dDeUFSUVFacklCSnNRUUowYWlGQlFRQWhIaUFZSVJNRFFFRUFJUWNnSENnQ0FDSUJCRUFnSGtFRWNpRkNJQklnSG1zaFEwRUFJUUpCQUNFVUEwQWdBaUFRUWFBQmFoQWZJUUlDUUNBVVFRUnFJRU1nRkNCQ2FpQVNTQnNpTkNBVVRBUkFRUUFoQ1F3QkN5QVRLQUlBUVg5eklTb2dRU0FVSUI1eVFRSjBhaUVQUVFBaENVRVBJQlFpQ0VFQ2RDSkVkQ0lYSVFZRFFBSkFJQUVnQm5GRkRRQWdCa0dSb3NTSUFYRWlKeUFCY1FSQUlBSkJBWEVFUUNBSElDZHlJUWRCTWlBSVFRSjBkQ0FxY1NBQmNpRUJDeUFDUVFGMklRSWdDVUVCYWlFSkN5QUJJQ2RCQVhRaU5YRUVRQ0FDUVFGeEJFQWdCeUExY2lFSElBRkI5QUFnQ0VFQ2RIUWdLbkZ5SVFFTElBSkJBWFloQWlBSlFRRnFJUWtMSUFFZ0owRUNkQ0kxY1FSQUlBSkJBWEVFUUNBSElEVnlJUWNnQVVIb0FTQUlRUUowZENBcWNYSWhBUXNnQWtFQmRpRUNJQWxCQVdvaENRc2dBU0FuUVFOMElpZHhSUTBBSUFKQkFYRUVRQ0FISUNkeUlRY2dBVUhBQVNBSVFRSjBkQ0FxY1hJaEFRc2dDVUVCYWlFSklBSkJBWFloQWdzZ0JrRUVkQ0VHSUFoQkFXb2lDQ0EwU0EwQUN5QUhJRVIyUWYvL0EzRkZEUUFEUUFKQUlBY2dGM0ZGRFFBZ0YwR1Jvc1NJQVhFaUJpQUhjUVJBSUE4Z0R5Z0NBQ0FDUVI5MGNpQXRjallDQUNBQ1FRRjJJUUlnQ1VFQmFpRUpDeUFHUVFGMElBZHhCRUFnRHlBU1FRSjBhaUlJSUFnb0FnQWdBa0VmZEhJZ0xYSTJBZ0FnQWtFQmRpRUNJQWxCQVdvaENRc2dCa0VDZENBSGNRUkFJQThnT21vaUNDQUlLQUlBSUFKQkgzUnlJQzF5TmdJQUlBSkJBWFloQWlBSlFRRnFJUWtMSUFaQkEzUWdCM0ZGRFFBZ0R5QXhhaUlHSUFZb0FnQWdBa0VmZEhJZ0xYSTJBZ0FnQ1VFQmFpRUpJQUpCQVhZaEFnc2dGMEVFZENFWElBOUJCR29oRHlBVVFRRnFJaFFnTkVnTkFBc0xJQkFnRUNnQ3NBRWdDV3MyQXJBQklCQWdFQ2tEcUFFZ0NhMklOd09vQVVFQklRSkJCQ0VVUVFGeFJRMEFDeUFjSUJ3b0FnUWdCMEViZGtFT2NTQUhRUjEyY2lBSFFSeDJjaUFUS0FJRVFYOXpjWEkyQWdRTElCTW9BZ0FnQjNJaUJrRURka0dSb3NTSUFYRWlBVUVFZGlBQlFRUjBjaUFCY2lFSklCNEVRQ0FLUVFScklnSWdBaWdDQUNBTlFRUnJLQUlBUVg5eklBRkJISFJ4Y2pZQ0FBc2dDaUFLS0FJQUlBa2dEU2dDQUVGL2MzRnlOZ0lBSUFvZ0NpZ0NCQ0FOS0FJRVFYOXpJQVpCSDNaeGNqWUNCQ0FjUVFScUlSd2dFMEVFYWlFVElBcEJCR29oQ2lBTlFRUnFJUTBnSGtFSWFpSWVJQkpJRFFBTEN5QVlRUUFnUFJBWkdnc2dEQ0FoU0EwQUN3c0NRQ0FiUVFKSkRRQUNRQ0FoUVFOeFFRRnJJaGRCQWtrZ00zRUVRQ0FTUVFCTURRRkJBU0FrUVFKcmRDRUhJQXNnSVVIOC8vOEhjU0FTYkVFQ2RHb2hDaUFsSUE0Z0lVRUVjUnNoQkNBU1FReHNJUnNnRWtFRGRDRVdJQ1JCQVdzaERVRUFJUlFEUUNBUVFZQUJhaEExSVFKQkFDRUpJQV
20FvQWdBaUJnUkFJQW9nRkVFQ2RHb2hDVUVQSVFGQkFDRUlBMEFDUUNBQklBWnhSUTBBSUFGQmthTEVpQUZ4SWhNZ0JuRUVRQ0FKSUFrb0FnQWdBa0YvYzBFQmNTQU5kSE1nQjNJMkFnQWdBa0VCZGlFQ0N5QVRRUUYwSUFaeEJFQWdDU0FTUVFKMGFpSWRJQjBvQWdBZ0FrRi9jMEVCY1NBTmRITWdCM0kyQWdBZ0FrRUJkaUVDQ3lBVFFRSjBJQVp4QkVBZ0NTQVdhaUlkSUIwb0FnQWdBa0YvYzBFQmNTQU5kSE1nQjNJMkFnQWdBa0VCZGlFQ0N5QVRRUU4wSUFaeFJRMEFJQWtnRzJvaUV5QVRLQUlBSUFKQmYzTkJBWEVnRFhSeklBZHlOZ0lBSUFKQkFYWWhBZ3NnQ1VFRWFpRUpJQUZCQkhRaEFTQUlRUUZxSWdoQkNFY05BQXNnQm1raENRc2dCRUVFYWlFRUlCQWdFQ2dDa0FFZ0NXczJBcEFCSUJBZ0VDa0RpQUVnQ2EySU53T0lBU0FVUVFocUloUWdFa2dOQUFzTElCZEJBVXNOQUNBU1FRQk1EUUFnSlNBT0lDRkJCSEVpQVJzaEJ5QW9JQ2tnQVJzaENFRUFJUVlDZndKQUlDc2dHVUYvYzJvaUFVRTRTUTBBSUFnZ0J5QUJRUUYyUWZ6Ly8vOEhjU0lKUVFScUlnSnFTU0FISUFJZ0NHb2lBa2x4RFFBZ0NDQUhJQWxxUVFocVNTQUhRUVJxSUFKSmNRMEFJQUZCQTNaQkFXb2lEVUg4Ly8vL0EzRWlCRUVEZENFR0lBY2dCRUVDZENJSmFpRUJJQWdnQ1dvaENmME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDRkhRUUFoQWdOQUlBZ2dBa0VDZENJVGFpSVhJQWNnRTJvaUUvMEFBZ0FpU0VFRS9hMEJJRWhCQlAyckFTQkhJRWo5RFF3TkRnOFFFUklURkJVV0Z4Z1pHaHRCSFAydEFmMVEvVkFnU1AxUUlrZjlDd0lBSUJjZ1J5QVQvUUFDQkVFYy9hc0IvVkFpUjBFQi9hMEIvUXgzZDNkM2QzZDNkM2QzZDNkM2QzZDMvVTRnUjBFQi9hc0IvUXp1N3U3dTd1N3U3dTd1N3U3dTd1N3UvVTc5VUNCSC9WQWdTUDFQL1FzQ0FDQklJVWNnQWtFRWFpSUNJQVJIRFFBTElBUWdEVVlOQWlCSC9Sc0REQUVMSUFnaENTQUhJUUZCQUFzaEFnTkFJQUpCSEhZaEJ5QUpJQUVvQWdBaUFrRUVkaUFISUFKQkJIUnljaUFDY2lJSE5nSUFJQWtnQnlBQktBSUVRUngwY2lJSFFRRjJRZmZ1M2JzSGNTQUhRUUYwUWU3ZHUvZCtjWElnQjNJZ0FrRi9jM0UyQWdBZ0NVRUVhaUVKSUFGQkJHb2hBU0FHUVFocUlnWWdFa2dOQUFzTElDRWdJVUVCYWtFRGNXdEJBMnRCQUNBaFFRWktHeUlFSUNGT0RRQWdFa0VNYkNFc0lCSkJBM1FoTFVFRElDUkJBbXQwSVNBZ0t5QVpRWDl6YWlJQlFRTjJJZ1pCQW5RaUdVRUVhaUVkSUFaQkFXb2lKRUg4Ly8vL0EzRWlJa0VDZENFUklDSkJBM1FoRXlBQlFSaEpJU3NnQVVFWFN5RXVBMEFDUUFKQUFrQUNRQUovQWtBZ0lTQUVheUlCUVFGcklnWkJBMDhFUUVGL0lSUWdBVUVGU0EwRklCSkJBRXdOQmlBbElBNGdCRUVFY1NJQkd5RU5JQ2dnS1NBQkd5RUlJRGtFUUVFQUlRRWdMa1VOQkNBTklBZ2dIV3BKSUEwZ0hXb2dDRXR4RFFRZ0RTQVJhaUVKSUFnZ0VXb2hBZ05BSUFnZ0FVRUNkQ0lHYWlJSElBZjlBQUlBSUFZZ0RXcjlBQUlBL1UvOUN3SUFJQUZCQkdvaUFTQWlSdzBBQ3lBVElRRWdJaUFrUmcwR0RBVUxJQTRnSlNBQkd5RVhRUUFoQmlBckRRRWdDQ0FYSUIxcVNTQVhJQWdnSFdvaUFVbHhEUUVnQ0NBWElCbHFRUWhxU1NBWFFRUnFJQUZKY1EwQklBZ2dEU0FkYWtrZ0FTQU5TM0VOQVNBTklCRnFJUWNnQ0NBUmFpRUpJQkVnRjJvaEF2ME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDRkhRUUFoQVFOQUlBZ2dBVUVDZENJR2FpSUtJQVlnRjJvaUcvMEFBZ0FpU0VFRS9hMEJJRWhCQlAyckFTQkhJRWo5RFF3TkRnOFFFUklURkJVV0Z4Z1pHaHRCSFAydEFmMVEvVkFnRy8wQUFnUkJIUDJyQWYxUUlFajlVRUVEL2FzQi9ReUlpSWlJaUlpSWlJaUlpSWlJaUlpSS9VNGdDdjBBQWdEOVVDQUdJQTFxL1FBQ0FQMVAvUXNDQUNCSUlVY2dBVUVFYWlJQklDSkhEUUFMSUNJZ0pFWU5CU0FUSVFZZ1IvMGJBd3dDQ3lBR1FRSjBRWnlpQVdvb0FnQWhGQXdFQ3lBWElRSWdDQ0VKSUEwaEIwRUFDeUVCQTBBZ0FVRWNkaUVJSUFrZ0NTZ0NBQ0FDS0FJQUlnRkJCSFlnQ0NBQlFRUjBjbklnQWlnQ0JFRWNkSElnQVhKQkEzUkJpSkdpeEhoeGNpQUhLQUlBUVg5emNUWUNBQ0FIUVFScUlRY2dDVUVFYWlFSklBSkJCR29oQWlBR1FRaHFJZ1lnRWtnTkFBc01BZ3NnQ0NFQ0lBMGhDUXNEUUNBQ0lBSW9BZ0FnQ1NnQ0FFRi9jM0UyQWdBZ0NVRUVhaUVKSUFKQkJHb2hBaUFCUVFocUlnRWdFa2dOQUFzTElCSkJBRXdOQUNBbElBNGdCRUVFY1NJQkd5RU1JQ2dnS1NBQkd5RVlJQTRnSlNBQkd5RVZJQ2tnS0NBQkd5RUtJQXNnQkNBU2JFRUNkR29oS2tFQUlSc0RRRUVBSVFjZ0dDZ0NBQ0FVY1NJQkJFQWdHMEVFY2lFbklCSWdHMnNoSDBFQUlRSkJBQ0VOQTBBZ0FpQVFRYUFCYWhBZklRSUNRQ0FOUVFScUlCOGdEU0FuYWlBU1NCc2lIQ0FOVEFSQVFRQWhDUXdCQ3lBVUlBd29BZ0JCZjNOeElTTWdLaUFOSUJ0eVFRSjBhaUVXUVFBaENVRVBJQTBpQ0VFQ2RDSXpkQ0lQSVFZRFFBSkFJQUVnQm5GRkRRQWdCa0dSb3NTSUFYRWlIaUFCY1FSQUlBSkJBWEVFUUNBSElCNXlJUWRCTWlBSVFRSjBkQ0FqY1NBQmNpRUJDeUFDUVFGMklRSWdDVUVCYWlFSkN5QUJJQjVCQVhRaU1YRUVRQ0FDUVFGeEJFQWdCeUF4Y2lFSElBRkI5QUFnQ0VFQ2RIUWdJM0Z5SVFFTElBSkJBWFloQWlBSlFRRnFJUWtMSUFFZ0hrRUNkQ0l4Y1FSQUlBSkJBWEVFUUNBSElERnlJUWNnQVVIb0FTQUlRUUowZENBamNYSWhBUXNnQWtFQmRpRUNJQWxCQVdvaENRc2dBU0FlUVFOMEloNXhSUTBBSUFKQkFYRUVRQ0FISUI1eUlRY2dBVUhBQVNBSVFRSjBkQ0FqY1hJaEFRc2dDVUVCYWlFSklBSkJBWFloQWdzZ0JrRUVkQ0VHSUFoQkFXb2lDQ0FjU0EwQUN5QUhJRE4yUWYvL0EzRkZEUUFEUUFKQUlBY2dEM0ZGRFFBZ0QwR1Jvc1NJQVhFaUJpQUhjUVJBSUJZZ0ZpZ0NBQ0FDUVI5MGNpQWdjallDQUNBQ1FRRjJJUUlnQ1VFQmFpRUpDeUFHUVFGMElBZHhCRUFnRmlBU1FRSjBhaUlJSUFnb0FnQWdBa0VmZEhJZ0lISTJBZ0FnQWtFQmRpRUNJQWxCQVdvaENRc2dCa0VDZENBSGNRUkFJQllnTFdvaUNDQUlLQUlBSUFKQkgzUnlJQ0J5TmdJQUlBSkJBWFloQWlBSlFRRnFJUWtMSUFaQkEzUWdCM0ZGRFFBZ0ZpQXNhaUlHSUFZb0FnQWdBa0VmZEhJZ0lISTJBZ0FnQ1VFQmFpRUpJQUpCQVhZaEFnc2dEMEVFZENFUElCWkJCR29oRmlBTlFRRnFJZzBnSEVnTkFBc0xJQkFnRUNnQ3NBRWdDV3MyQXJBQklCQWdFQ2tEcUFFZ0NhMklOd09vQVVFQklRSkJCQ0VOUVFGeFJRMEFDeUFZSUJnb0FnUWdCMEViZGtFT2NTQUhRUjEyY2lBSFFSeDJjaUFNS0FJRVFYOXpjWEkyQWdRTElBd29BZ0FnQjNJaUJrRURka0dSb3NTSUFYRWlBVUVFZGlBQlFRUjBjaUFCY2lFSklCc0VRQ0FLUVFScklnSWdBaWdDQUNBVlFRUnJLQUlBUVg5eklBRkJISFJ4Y2pZQ0FBc2dDaUFLS0FJQUlBa2dGU2dDQUVGL2MzRnlOZ0lBSUFvZ0NpZ0NCQ0FWS0FJRVFYOXpJQVpCSDNaeGNqWUNCQ0FZUVFScUlSZ2dERUVFYWlFTUlBcEJCR29oQ2lBVlFRUnFJUlVnRzBFSWFpSWJJQkpJRFFBTEN5QUVRUVJxSWdRZ0lVZ05BQXNMUVFFaEFpQWhRUUJNRFFNZ0VrRUFUQTBESUJKQi9QLy8vd2R4SWdaQkFuUWhCeUFTUVFSSklRUkJBQ0VJQTBBZ0N5QUlJQkpzUVFKMGF
20pRUJBa0FDUUNBRUJFQWdBU0VDUVFBaENRd0JDeUFCSUFkcUlRSkJBQ0VKQTBBZ0FTQUpRUUowYWlJTklBMzlBQUlBSWtmOURQLy8vMy8vLy85Ly8vLy9mLy8vLzMvOVRpSkkvYUVCSUVnZ1IvME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFQMDUvVkw5Q3dJQUlBbEJCR29pQ1NBR1J3MEFDeUFHSWdrZ0VrWU5BUXNEUUNBQ1FRQWdBaWdDQUNJQlFmLy8vLzhIY1NJTmF5QU5JQUZCQUVnYk5nSUFJQUpCQkdvaEFpQUpRUUZxSWdrZ0VrY05BQXNMUVFFaEFpQUlRUUZxSWdnZ0lVY05BQXNNQXdzZ0lrVU5BQ0FRSUJvb0FoZzJBalFnRUNBV05nSXdJQjFCQVVHeHl3QWdFRUV3YWhBVERBRUxJQkFnQ1RZQ0ZDQVFJQlkyQWhBZ0hVRUJRYkhMQUNBUVFSQnFFQk5CQUNFQ0RBRUxRUUFoQWdzZ0VFR3dBbW9rQUNBQ0RRRU1Bd3NnQXlBQlFRbDBRWkN1QVdvMkFtd0NmMEVBSVFjZ0F5Z0NkQ0VCQWtBQ1FDQWFLQUlRSUJvb0FnaHJJZ29nR2lnQ0ZDQWFLQUlNYXlJTmJDSUdJQU1vQW9RQlN3UkFJQUVRRkNBRElBWkJBblFRSENJQk5nSjBRUUFnQVVVTkF4b2dBeUFHTmdLRUFRd0JDeUFCUlEwQkN5QUJRUUFnQmtFQ2RCQVpHZ3NnQXlnQ2VDRUJBa0FnQ2tFQ2FpSUlJQTFCQTJwQkFuWWlGa0VDYW13aUJpQURLQUtJQVUwRVFDQUdRUUowSVJzTUFRc2dBUkFVSUFNZ0JrRUNkQ0liRUJ3aUFUWUNlQ0FCRFFCQkFBd0JDeUFESUFZMkFvZ0JJQUZCQUNBYkVCa2FBa0FnQ0VVTkFDQURLQUo0SWdRaEFRSkFJQWhCQkU4RVFDQUVJQWhCZkhFaUIwRUNkR29oQVVFQUlSc0RRQ0FFSUJ0QkFuUnEvUXdBQUNCSkFBQWdTUUFBSUVrQUFDQkovUXNDQUNBYlFRUnFJaHNnQjBjTkFBc2dCeUFJUmcwQkN3TkFJQUZCZ0lDQXlRUTJBZ0FnQVVFRWFpRUJJQWRCQVdvaUJ5QUlSdzBBQ3dzZ0JDQVdRUUZxSUFoc1FRSjBhaUVHUVFBaEJ3SkFBa0FnQ0VFRVNRUkFJQVloQVF3QkN5QUdJQWhCZkhFaUIwRUNkR29oQVVFQUlSc0RRQ0FHSUJ0QkFuUnEvUXdBQUNCSkFBQWdTUUFBSUVrQUFDQkovUXNDQUNBYlFRUnFJaHNnQjBjTkFBc2dCeUFJUmcwQkN3TkFJQUZCZ0lDQXlRUTJBZ0FnQVVFRWFpRUJJQWRCQVdvaUJ5QUlSdzBBQ3dzZ0RVRURjU0lCUlEwQVFZQ0FnTWdFUVlDQWdNQUVRWUNBZ0lBRUlBRkJBa1liSUFGQkFVWWJJUlFnQkNBSUlCWnNRUUowYWlFR1FRQWhCd0pBSUFoQkJFa0VRQ0FHSVFFTUFRc2dCaUFJUVh4eElnZEJBblJxSVFFZ0ZQMFJJVWhCQUNFYkEwQWdCaUFiUVFKMGFpQkkvUXNDQUNBYlFRUnFJaHNnQjBjTkFBc2dCeUFJUmcwQkN3TkFJQUVnRkRZQ0FDQUJRUVJxSVFFZ0IwRUJhaUlISUFoSERRQUxDeUFESUEwMkFvQUJJQU1nQ2pZQ2ZFRUJDMFVOQWlBYUtBSWNJQk5xSWh0QkgwNEVRQ0FpUlEwQ0lDWWdHellDRUNBZFFRSkI1OE1BSUNaQkVHb1FFd3dEQ3lBREVHTWdBMEh3clFFMkFtUWdBMEdRb3dFMkFtQWdBMEd3b3dFMkFod2dHaWdDUUEwQUFrQUNRQ0FhS0FJMElnZEJBVTBFUUNBSFFRRkhEUUVnQXlnQ2tBRkZEUUVMSUJvb0FnUWhBVUVBSVFZQ1FDQUhRUVJQQkVBZ0IwRjhjU0VDQTBBZ0FTQUpRUU4wYWlJR1FSeHFJQVpCRkdvZ0JrRU1haUFHL1Z3Q0JQMVdBZ0FCL1ZZQ0FBTDlWZ0lBQXlCSC9hNEJJVWNnQ1VFRWFpSUpJQUpIRFFBTElFY2dSeUJIL1EwSUNRb0xEQTBPRHdBQkFnTUFBUUlEL2E0QklrY2dSeUJIL1EwRUJRWUhBQUVDQXdBQkFnTUFBUUlEL2E0Qi9Sc0FJUVlnQWlBSFJnMEJDd05BSUFFZ0FrRURkR29vQWdRZ0Jtb2hCaUFDUVFGcUlnSWdCMGNOQUFzTElBTW9BcFFCSVJBZ0JrRUNhaUlKSUFNb0FwZ0JTd1JBSUJBZ0NSQWJJZ0ZGRFFVZ0F5QUJOZ0tVQVNBQklBWnFRUUE3QUFBZ0F5QUpOZ0tZQVNBREtBS1VBU0VRSUJvb0FqUkZEUUlnR2lnQ0JDRUJDMEVBSVFKQkFDRUdBMEFnQWlBUWFpQUJJQVpCQTNRaUJXb2lBU2dDQUNBQktBSUVFQllhSUJvb0FnUWlBU0FGYWlnQ0JDQUNhaUVDSUFaQkFXb2lCaUFhS0FJMFNRMEFDd3dCQ3lBSFFRRkhEUUVnR2lnQ0JDZ0NBQ0VRQ3lBYUtBSThJZ0VFUUNBREtBSjBJU3dnQXlBQk5nSjBDeUFhS0FJc0JFQWdGMEVDY1NFdElCZEJDSEVoSlNBRFFSeHFJUmdnRjBFQmNVVWhMa0VDSVNFRFFDQVFJQjVxSVFFZ0dpZ0NBQ0FvUVJoc2FpSWdLQUlBSVFVQ1FDQXVJQnNnR2lnQ0hFRUVhMG9nSVVFQlMzSnlJaU5GQkVBZ0F5QUJOZ0lVSUFNZ0FTQUZhaUlGTmdJWUlBTWdCUzhBQURzQmNDQUZRZjhCT2dBQUlBTW9BaGhCL3dFNkFBRWdBMEVBTmdJSUlBTkJBRFlDQUNBRElBRTJBaEFNQVFzZ0F5QUJOZ0lVSUFNZ0FTQUZhaUlHTmdJWUlBTWdCaThBQURzQmNDQUdRZjhCT2dBQUlBTW9BaGhCL3dFNkFBRWdBeUFEUVJ4cU5nSm9JQU1nQVRZQ0VDQURRUUEyQWd3Z0F5QUZCSDhnQVMwQUFFRVFkQVZCZ0lEOEJ3c2lCVFlDQUVFQklRa2dBVUVCYWlFQ0lBRXRBQUVoQmdKL0lBRXRBQUJCL3dGR0JFQWdCa0dRQVU4RVFDQURRUUUyQWd3Z0JVR0EvZ055REFJTElBTWdBallDRUVFQUlRa2dCa0VKZENBRmFnd0JDeUFESUFJMkFoQWdCa0VJZENBRmNnc2hBU0FESUFrMkFnZ2dBMEdBZ0FJMkFnUWdBeUFCUVFkME5nSUFDeUFnS0FJQUlTb0NRQ0FiUVFCTURRQWdJQ2dDQ0VVTkFFRUFJU2tnTFVFQVJ5QWpjU0VuQTBBQ1FBSkFBa0FDUUFKQUlDRkJBV3NPQWdFQ0FBc2dJMFVFUUVFQklCdDBJZ0ZCQVhZZ0FYSWhCQ0FES0FKOEloWkJBblFpRFNBREtBSjRha0VNYWlFQklBTW9BblFoQmtFQUlSTWdBeWdDZ0FFaUJVRUVUd1JBSUJaRkRRVWdGa0VNYkNFSElCWkJBM1FoQ2tFQUlBUnJJUUlEUUVFQUlRVURRQUpBSUFFaUNTZ0NBQ0lCUlEwQUFrQWdBVUdRZ0lBQmNRMEFJQUZCN3dOeFJRMEFJQU1vQWdBaEFRSkFJQU1vQWdnaUNBMEFJQUZCL3dGR0lSUWdBeWdDRUNJSUxRQUFJUUVDUUNBVVJRUkFJQU1nQVRZQ0FDQURJQWhCQVdvMkFoQU1BUXNnQVVHUEFVMEVRQ0FESUFFMkFnQWdBeUFJUVFGcU5nSVFRUWNoQ0F3Q0MwSC9BU0VCSUFOQi93RTJBZ0FMUVFnaENBc2dBeUFJUVFGcklnZzJBZ2dDUUNBQklBaDJRUUZ4UlEwQUFrQWdDQTBBSUFGQi93RkdJUlFnQXlnQ0VDSUlMUUFBSVFFQ1FDQVVSUVJBSUFNZ0FUWUNBQ0FESUFoQkFXbzJBaEFNQVFzZ0FVR1BBVTBFUUNBRElBRTJBZ0FnQXlBSVFRRnFOZ0lRUVFjaENBd0NDMEgvQVNFQklBTkIvd0UyQWdBTFFRZ2hDQXNnQXlBSVFRRnJJZ2cyQWdnZ0JpQUNJQVFnQVNBSWRrRUJjU0lJR3pZQ0FDQURLQUo4SVFFZ0NVRUVheUlVSUJRb0FnQkJJSEkyQWdBZ0NTQUpLQUlFUVFoeU5nSUVJQWtnQ1NnQ0FDQUlRUk4wY2tFUWNqWUNBQ0FsRFFBZ0NVRitJQUZyUVFKMGFpSUJJQUVvQWdSQmdJQUNjallDQkNBQklBRW9BZ0FnQ0VFZmRISkJnSUFFY2pZQ0FDQUJRUVJySWdFZ0FTZ0NBRUdBZ0FoeU5nSUFDeUFKSUFrb0FnQkJnSUNBQVhJaUFUWUNBQXNDUUNBQlFZQ0JnQWh4RFFBZ0FVSDRIbkZGRFFBZ0F5Z0NBQ0VCQWtBZ0F5Z0NDQ0lJRFFBZ0FVSC9BVVloRkNBREtBSVFJZ2d0QUFBaEFRSkFJQlJGQkVBZ0F5QUJOZ0lBSUFNZ0NFRUJhallDRUF3QkN5QUJRWThCVFFSQUlBTWdBVFlDQUNBRElBaEJBV28yQWhCQkJ5RUlEQUlMUWY4QklRRWdBMEgvQVRZQ0FBdEJDQ0VJQ3lBRElBaEJBV3NpQ0RZQ0NDQUpBbjhnQVNBSWRrRUJjVVVFUUNBSktBSUFEQUVMQWtBZ0NBMEFJQUZCL3dGR0lSUWdBeWdDRUNJSUxRQUFJUUVDUUNBVVJRUkFJQU1nQVRZQ0FDQURJQWhCQVdvMkFoQU1BUXNnQVVHUEFVMEVRQ0FESUFFMkFn
20QWdBeUFJUVFGcU5nSVFRUWNoQ0F3Q0MwSC9BU0VCSUFOQi93RTJBZ0FMUVFnaENBc2dBeUFJUVFGcklnZzJBZ2dnQmlBTmFpQUNJQVFnQVNBSWRrRUJjU0lCR3pZQ0FDQUpRUVJySWdnZ0NDZ0NBRUdBQW5JMkFnQWdDU0FKS0FJRVFjQUFjallDQkNBSktBSUFJQUZCRm5SeVFZQUJjZ3RCZ0lDQUNISWlBVFlDQUFzQ1FDQUJRWUNJZ01BQWNRMEFJQUZCd1BjQmNVVU5BQ0FES0FJQUlRRUNRQ0FES0FJSUlnZ05BQ0FCUWY4QlJpRVVJQU1vQWhBaUNDMEFBQ0VCQWtBZ0ZFVUVRQ0FESUFFMkFnQWdBeUFJUVFGcU5nSVFEQUVMSUFGQmp3Rk5CRUFnQXlBQk5nSUFJQU1nQ0VFQmFqWUNFRUVISVFnTUFndEIvd0VoQVNBRFFmOEJOZ0lBQzBFSUlRZ0xJQU1nQ0VFQmF5SUlOZ0lJSUFrQ2Z5QUJJQWgyUVFGeFJRUkFJQWtvQWdBTUFRc0NRQ0FJRFFBZ0FVSC9BVVloRkNBREtBSVFJZ2d0QUFBaEFRSkFJQlJGQkVBZ0F5QUJOZ0lBSUFNZ0NFRUJhallDRUF3QkN5QUJRWThCVFFSQUlBTWdBVFlDQUNBRElBaEJBV28yQWhCQkJ5RUlEQUlMUWY4QklRRWdBMEgvQVRZQ0FBdEJDQ0VJQ3lBRElBaEJBV3NpQ0RZQ0NDQUdJQXBxSUFJZ0JDQUJJQWgyUVFGeElnRWJOZ0lBSUFsQkJHc2lDQ0FJS0FJQVFZQVFjallDQUNBSklBa29BZ1JCZ0FSeU5nSUVJQWtvQWdBZ0FVRVpkSEpCZ0FoeUMwR0FnSURBQUhJaUFUWUNBQXNnQVVHQXdJQ0FCSEVOQUNBQlFZQzhEM0ZGRFFBZ0F5Z0NBQ0VCQWtBZ0F5Z0NDQ0lJRFFBZ0FVSC9BVVloRkNBREtBSVFJZ2d0QUFBaEFRSkFJQlJGQkVBZ0F5QUJOZ0lBSUFNZ0NFRUJhallDRUF3QkN5QUJRWThCVFFSQUlBTWdBVFlDQUNBRElBaEJBV28yQWhCQkJ5RUlEQUlMUWY4QklRRWdBMEgvQVRZQ0FBdEJDQ0VJQ3lBRElBaEJBV3NpQ0RZQ0NDQUJJQWgyUVFGeEJFQUNRQ0FJRFFBZ0FVSC9BVVloRkNBREtBSVFJZ2d0QUFBaEFRSkFJQlJGQkVBZ0F5QUJOZ0lBSUFNZ0NFRUJhallDRUF3QkN5QUJRWThCVFFSQUlBTWdBVFlDQUNBRElBaEJBV28yQWhCQkJ5RUlEQUlMUWY4QklRRWdBMEgvQVRZQ0FBdEJDQ0VJQ3lBRElBaEJBV3NpQ0RZQ0NDQUdJQWRxSUFJZ0JDQUJJQWgyUVFGeElnZ2JOZ0lBSUFNb0Fud2hBU0FKUVFSckloUWdGQ2dDQUVHQWdBRnlOZ0lBSUFrZ0NTZ0NCRUdBSUhJMkFnUWdDU0FKS0FJQUlBaEJISFJ5UVlEQUFISTJBZ0FnQ1NBQlFRSjBhaUlCSUFFb0FnUkJCSEkyQWdRZ0FTQUJLQUlNUVFGeU5nSU1JQUVnQVNnQ0NDQUlRUkowY2tFQ2NqWUNDQXNnQ1NBSktBSUFRWUNBZ0lBRWNqWUNBQXNnQmtFRWFpRUdJQWxCQkdvaEFTQUZRUUZxSWdVZ0ZrY05BQXNnQmlBSGFpRUdJQWxCREdvaEFTQVRRUVJxSWhNZ0F5Z0NnQUVpQlVGOGNVa05BQXNMSUFVZ0UwME5BeUFXUlEwRFFRQWhDa0VBSUFScklRNGdCU0VJQTBBQ1FDQUlJQk5HQkVBZ0V5RUlEQUVMSUFGQkJHc2hGQ0FCS0FJQUlRMUJBQ0VDQTBBQ1FDQU5JQUpCQTJ3aUNYWWlCMEdRZ0lBQmNRMEFJQWRCN3dOeFJRMEFJQU1vQWdBaEJRSkFJQU1vQWdnaUJ3MEFJQVZCL3dGSElRZ2dBeWdDRUNJSExRQUFJUVVDUUNBSVJRUkFJQVZCa0FGUEJFQkIvd0VoQlNBRFFmOEJOZ0lBREFJTElBTWdCVFlDQUNBRElBZEJBV28yQWhCQkJ5RUhEQUlMSUFNZ0JUWUNBQ0FESUFkQkFXbzJBaEFMUVFnaEJ3c2dBeUFIUVFGcklnYzJBZ2dDUUNBRklBZDJRUUZ4UlEwQUlBWWdBaUFXYkVFQ2RHb0NRQ0FIRFFBZ0JVSC9BVWNoRFNBREtBSVFJZ2N0QUFBaEJRSkFJQTFGQkVBZ0JVR1FBVThFUUVIL0FTRUZJQU5CL3dFMkFnQU1BZ3NnQXlBRk5nSUFJQU1nQjBFQmFqWUNFRUVISVFjTUFnc2dBeUFGTmdJQUlBTWdCMEVCYWpZQ0VBdEJDQ0VIQ3lBRElBZEJBV3NpQnpZQ0NDQU9JQVFnQlNBSGRrRUJjU0lIR3pZQ0FDQURLQUo4SVFnZ0ZDQVVLQUlBUVNBZ0NYUnlOZ0lBSUFFZ0FTZ0NBQ0FIUVJOMFFSQnlJQWwwY2pZQ0FDQUJJQUVvQWdSQkNDQUpkSEkyQWdRZ0FpQWxja1VFUUNBQlFYNGdDR3RCQW5ScUlnVWdCU2dDQkVHQWdBSnlOZ0lFSUFVZ0JTZ0NBQ0FIUVI5MGNrR0FnQVJ5TmdJQUlBVkJCR3NpQlNBRktBSUFRWUNBQ0hJMkFnQUxJQUpCQTBjTkFDQUJJQWhCQW5ScUlnVWdCU2dDQkVFRWNqWUNCQ0FGSUFVb0FneEJBWEkyQWd3Z0JTQUZLQUlJSUFkQkVuUnlRUUp5TmdJSUN5QUJJQUVvQWdCQmdJQ0FBU0FKZEhJaURUWUNBQ0FES0FLQUFTRUZDeUFGSVFnZ0FrRUJhaUlDSUFVZ0UydEpEUUFMQ3lBR1FRUnFJUVlnQVVFRWFpRUJJQXBCQVdvaUNpQVdSdzBBQ3d3REMwRUFJUWxCQUNFV1FRQWhDZ0pBQWtBQ1FBSkFJQU1vQW53aUJFSEFBRWNOQUNBREtBS0FBVUhBQUVjTkFFRUFRUUVnRzNRaUFVRUJkaUFCY2lJVGF5RVVJQU5CSEdvaEJDQURLQUo0UVl3Q2FpRUdJQU1vQWdnaENDQURLQUlFSVFVZ0F5Z0NBQ0VISUFNb0FtZ2hEU0FES0FKMElRRWdGMEVJY1EwQkEwQkJBQ0VLQTBBZ0FTRUNJQVlpQ1NnQ0FDSUdCRUFDUUNBR1FaQ0FnQUZ4RFFBZ0JrSHZBM0VpQVVVTkFDQUZJQVFnQXlnQ2JDQUJhaTBBQUVFQ2RHb2lEU2dDQUNJT0tBSUFJZ0ZySVFVQ2Z5QUJJQWRCRUhaTEJFQWdEaWdDQkNFTUlBMGdEa0VJUVF3Z0FTQUZTeUlMRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRGlBSUxRQUJJUVVnQ0MwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdNQWdzZ0F5QU9OZ0lRSUFWQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBT05nSVFRUWdoQ0NBRlFRaDBJQWRxSVFjTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUF3Z0RFVWdDeHNNQVFzZ0J5QUJRUkIwYXlFSElBVkJnSUFDY1VVRVFDQU9LQUlFSVF3Z0RTQU9RUXhCQ0NBQklBVkxJZ3NiYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVPSUFndEFBRWhBU0FJTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXdDQ3lBRElBNDJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUE0MkFoQkJDQ0VJSUFGQkNIUWdCMm9oQndzZ0NFRUJheUVJSUFkQkFYUWhCeUFGUVFGMElnVkJnSUFDU1EwQUN5QU1SU0FNSUFzYkRBRUxJQTRvQWdRTEJIOGdCU0FFSUFrb0FnUkJFWFpCQkhFZ0NVRUVheUlNS0FJQVFSTjJRUUZ4SUFaQkRuWkJFSEVnQmtFUWRrSEFBSEVnQmtHcUFYRnljbkp5SWd0QmtMNEJhaTBBQUVFQ2RHb2lEU2dDQUNJT0tBSUFJZ0ZySVFVZ0MwR1F3QUZxTFFBQUlRc2dBaUFUSUJRZ0N3Si9JQUVnQjBFUWRrc0VRQ0FPS0FJRUlSRWdEU0FPUVFoQkRDQUJJQVZMSWhVYmFpZ0NBRFlDQUFOQUFrQWdDQTBBSUFNb0FoQWlDRUVCYWlFT0lBZ3RBQUVoQlNBSUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0F3Q0N5QURJQTQyQWhBZ0JVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBNDJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3c2dDRUVCYXlFSUlBZEJBWFFoQnlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFCSVFV
20Z0VTQVJSU0FWR3d3QkN5QUhJQUZCRUhScklRY2dCVUdBZ0FKeFJRUkFJQTRvQWdRaEVTQU5JQTVCREVFSUlBRWdCVXNpRlJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVE0Z0NDMEFBU0VCSUFndEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJREFJTElBTWdEallDRUNBQlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0RqWUNFRUVJSVFnZ0FVRUlkQ0FIYWlFSEN5QUlRUUZySVFnZ0IwRUJkQ0VISUFWQkFYUWlCVUdBZ0FKSkRRQUxJQkZGSUJFZ0ZSc01BUXNnRGlnQ0JBc2lBVVliTmdJQUlBd2dEQ2dDQUVFZ2NqWUNBQ0FKSUFrb0FnUkJDSEkyQWdRZ0NVR01BbXNpRGlBT0tBSUFRWUNBQ0hJMkFnQWdDVUdFQW1zaURpQU9LQUlBUVlDQUFuSTJBZ0FnQ1VHSUFtc2lEaUFPS0FJQUlBRWdDM01pQVVFZmRISkJnSUFFY2pZQ0FDQUdJQUZCRTNSeVFSQnlCU0FHQzBHQWdJQUJjaUVHQ3dKQUlBWkJnSUdBQ0hFTkFDQUdRZmdlY1VVTkFDQUZJQVFnQXlnQ2JDQUdRUU4ySWd0Qjd3TnhhaTBBQUVFQ2RHb2lEU2dDQUNJT0tBSUFJZ0ZySVFVQ2Z5QUJJQWRCRUhaTEJFQWdEaWdDQkNFTUlBMGdEa0VJUVF3Z0FTQUZTeUlSRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRGlBSUxRQUJJUVVnQ0MwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdNQWdzZ0F5QU9OZ0lRSUFWQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBT05nSVFRUWdoQ0NBRlFRaDBJQWRxSVFjTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUF3Z0RFVWdFUnNNQVFzZ0J5QUJRUkIwYXlFSElBVkJnSUFDY1VVRVFDQU9LQUlFSVF3Z0RTQU9RUXhCQ0NBQklBVkxJaEViYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVPSUFndEFBRWhBU0FJTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXdDQ3lBRElBNDJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUE0MkFoQkJDQ0VJSUFGQkNIUWdCMm9oQndzZ0NFRUJheUVJSUFkQkFYUWhCeUFGUVFGMElnVkJnSUFDU1EwQUN5QU1SU0FNSUJFYkRBRUxJQTRvQWdRTEJIOGdCU0FFSUFrb0FnUkJGSFpCQkhFZ0NVRUVheUlNS0FJQVFSWjJRUUZ4SUFaQkQzWkJFSEVnQmtFVGRrSEFBSEVnQzBHcUFYRnljbkp5SWd0QmtMNEJhaTBBQUVFQ2RHb2lEU2dDQUNJT0tBSUFJZ0ZySVFVZ0MwR1F3QUZxTFFBQUlRc2dBaUFUSUJRZ0N3Si9JQUVnQjBFUWRrc0VRQ0FPS0FJRUlSRWdEU0FPUVFoQkRDQUJJQVZMSWhVYmFpZ0NBRFlDQUFOQUFrQWdDQTBBSUFNb0FoQWlDRUVCYWlFT0lBZ3RBQUVoQlNBSUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0F3Q0N5QURJQTQyQWhBZ0JVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBNDJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3c2dDRUVCYXlFSUlBZEJBWFFoQnlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFCSVFVZ0VTQVJSU0FWR3d3QkN5QUhJQUZCRUhScklRY2dCVUdBZ0FKeFJRUkFJQTRvQWdRaEVTQU5JQTVCREVFSUlBRWdCVXNpRlJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVE0Z0NDMEFBU0VCSUFndEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJREFJTElBTWdEallDRUNBQlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0RqWUNFRUVJSVFnZ0FVRUlkQ0FIYWlFSEN5QUlRUUZySVFnZ0IwRUJkQ0VISUFWQkFYUWlCVUdBZ0FKSkRRQUxJQkZGSUJFZ0ZSc01BUXNnRGlnQ0JBc2lBVVliTmdLQUFpQU1JQXdvQWdCQmdBSnlOZ0lBSUFrZ0NTZ0NCRUhBQUhJMkFnUWdCaUFCSUF0elFSWjBja0dBQVhJRklBWUxRWUNBZ0FoeUlRWUxBa0FnQmtHQWlJREFBSEVOQUNBR1FjRDNBWEZGRFFBZ0JTQUVJQU1vQW13Z0JrRUdkaUlMUWU4RGNXb3RBQUJCQW5ScUlnMG9BZ0FpRGlnQ0FDSUJheUVGQW44Z0FTQUhRUkIyU3dSQUlBNG9BZ1FoRENBTklBNUJDRUVNSUFFZ0JVc2lFUnRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUTRnQ0MwQUFTRUZJQWd0QUFCQi93RkdCRUFnQlVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlEQUlMSUFNZ0RqWUNFQ0FGUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nRGpZQ0VFRUlJUWdnQlVFSWRDQUhhaUVIQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQUZCQVhRaUFVR0FnQUpKRFFBTElBRWhCU0FNSUF4RklCRWJEQUVMSUFjZ0FVRVFkR3NoQnlBRlFZQ0FBbkZGQkVBZ0RpZ0NCQ0VNSUEwZ0RrRU1RUWdnQVNBRlN5SVJHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEaUFJTFFBQklRRWdDQzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBSFFZRCtBMm9oQjBFSUlRZ01BZ3NnQXlBT05nSVFJQUZCQ1hRZ0Iyb2hCMEVISVFnTUFRc2dBeUFPTmdJUVFRZ2hDQ0FCUVFoMElBZHFJUWNMSUFoQkFXc2hDQ0FIUVFGMElRY2dCVUVCZENJRlFZQ0FBa2tOQUFzZ0RFVWdEQ0FSR3d3QkN5QU9LQUlFQ3dSL0lBVWdCQ0FKS0FJRVFSZDJRUVJ4SUFsQkJHc2lEQ2dDQUVFWmRrRUJjU0FHUVJKMlFSQnhJQVpCRm5aQndBQnhJQXRCcWdGeGNuSnljaUlMUVpDK0FXb3RBQUJCQW5ScUlnMG9BZ0FpRGlnQ0FDSUJheUVGSUF0QmtNQUJhaTBBQUNFTElBSWdFe
20UFVSUFzQ2Z5QUJJQWRCRUhaTEJFQWdEaWdDQkNFUklBMGdEa0VJUVF3Z0FTQUZTeUlWRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRGlBSUxRQUJJUVVnQ0MwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdNQWdzZ0F5QU9OZ0lRSUFWQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBT05nSVFRUWdoQ0NBRlFRaDBJQWRxSVFjTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUJFZ0VVVWdGUnNNQVFzZ0J5QUJRUkIwYXlFSElBVkJnSUFDY1VVRVFDQU9LQUlFSVJFZ0RTQU9RUXhCQ0NBQklBVkxJaFViYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVPSUFndEFBRWhBU0FJTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXdDQ3lBRElBNDJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUE0MkFoQkJDQ0VJSUFGQkNIUWdCMm9oQndzZ0NFRUJheUVJSUFkQkFYUWhCeUFGUVFGMElnVkJnSUFDU1EwQUN5QVJSU0FSSUJVYkRBRUxJQTRvQWdRTElnRkdHellDZ0FRZ0RDQU1LQUlBUVlBUWNqWUNBQ0FKSUFrb0FnUkJnQVJ5TmdJRUlBWWdBU0FMYzBFWmRISkJnQWh5QlNBR0MwR0FnSURBQUhJaEJnc0NRQ0FHUVlEQWdJQUVjUTBBSUFaQmdMd1BjVVVOQUNBRklBUWdBeWdDYkNBR1FRbDJJZ3RCN3dOeGFpMEFBRUVDZEdvaURTZ0NBQ0lPS0FJQUlnRnJJUVVDZnlBQklBZEJFSFpMQkVBZ0RpZ0NCQ0VNSUEwZ0RrRUlRUXdnQVNBRlN5SVJHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEaUFJTFFBQklRVWdDQzBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBSFFZRCtBMm9oQjBFSUlRZ01BZ3NnQXlBT05nSVFJQVZCQ1hRZ0Iyb2hCMEVISVFnTUFRc2dBeUFPTmdJUVFRZ2hDQ0FGUVFoMElBZHFJUWNMSUFoQkFXc2hDQ0FIUVFGMElRY2dBVUVCZENJQlFZQ0FBa2tOQUFzZ0FTRUZJQXdnREVVZ0VSc01BUXNnQnlBQlFSQjBheUVISUFWQmdJQUNjVVVFUUNBT0tBSUVJUXdnRFNBT1FReEJDQ0FCSUFWTEloRWJhaWdDQURZQ0FBTkFBa0FnQ0EwQUlBTW9BaEFpQ0VFQmFpRU9JQWd0QUFFaEFTQUlMUUFBUWY4QlJnUkFJQUZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFkQmdQNERhaUVIUVFnaENBd0NDeUFESUE0MkFoQWdBVUVKZENBSGFpRUhRUWNoQ0F3QkN5QURJQTQyQWhCQkNDRUlJQUZCQ0hRZ0Iyb2hCd3NnQ0VFQmF5RUlJQWRCQVhRaEJ5QUZRUUYwSWdWQmdJQUNTUTBBQ3lBTVJTQU1JQkViREFFTElBNG9BZ1FMQkg4Z0JTQUVJQWtvQWdSQkduWkJCSEVnQ1VFRWF5SU1LQUlBUVJ4MlFRRnhJQVpCRlhaQkVIRWdCa0VaZGtIQUFIRWdDMEdxQVhGeWNuSnlJZ3RCa0w0QmFpMEFBRUVDZEdvaURTZ0NBQ0lPS0FJQUlnRnJJUVVnQzBHUXdBRnFMUUFBSVFzZ0FpQVRJQlFnQ3dKL0lBRWdCMEVRZGtzRVFDQU9LQUlFSVJFZ0RTQU9RUWhCRENBQklBVkxJaFViYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVPSUFndEFBRWhCU0FJTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXdDQ3lBRElBNDJBaEFnQlVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUE0MkFoQkJDQ0VJSUFWQkNIUWdCMm9oQndzZ0NFRUJheUVJSUFkQkFYUWhCeUFCUVFGMElnRkJnSUFDU1EwQUN5QUJJUVVnRVNBUlJTQVZHd3dCQ3lBSElBRkJFSFJySVFjZ0JVR0FnQUp4UlFSQUlBNG9BZ1FoRVNBTklBNUJERUVJSUFFZ0JVc2lGUnRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUTRnQ0MwQUFTRUJJQWd0QUFCQi93RkdCRUFnQVVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlEQUlMSUFNZ0RqWUNFQ0FCUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nRGpZQ0VFRUlJUWdnQVVFSWRDQUhhaUVIQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQVZCQVhRaUJVR0FnQUpKRFFBTElCRkZJQkVnRlJzTUFRc2dEaWdDQkFzaUFVWWJOZ0tBQmlBTUlBd29BZ0JCZ0lBQmNqWUNBQ0FKSUFrb0FnUkJnQ0J5TmdJRUlBa2dDU2dDaEFKQkJISTJBb1FDSUFrZ0NTZ0NqQUpCQVhJMkFvd0NJQWtnQ1NnQ2lBSWdBU0FMY3lJQlFSSjBja0VDY2pZQ2lBSWdCaUFCUVJ4MGNrR0F3QUJ5QlNBR0MwR0FnSUNBQkhJaEJnc2dDU0FHTmdJQUN5QUpRUVJxSVFZZ0FrRUVhaUVCSUFwQkFXb2lDa0hBQUVjTkFBc2dDVUVNYWlFR0lBSkJoQVpxSVFFZ0ZrRThTU0FXUVFScUlSWU5BQXNNQWd0QkFTQWJkQ0lCUVFGMklBRnlJUllnQXlnQ2VDSUNJQVJCQW5ScVFReHFJUVlnQXlnQ2dBRWhBU0FES0FJSUlRZ2dBeWdDQkNFRklBTW9BZ0FoQnlBREtBSm9JUTBnQXlnQ2RDRVRBa0FnRjBFSWNRUkFBa0FnQVVFRVNRMEFJQVFFUUNBRVFReHNJUkVnQkVFRGRDRWtRUUFnRm1zaEN5QURRUnhxSVJRRFFFRUFJUTREUUNBR0lnSW9BZ0FpQmdSQUFrQWdCa0dRZ0lBQmNRMEFJQVpCN3dOeElnRkZEUUFnQlNBVUlBTW9BbXdnQVdvdEFBQkJBblJxSWcwb0FnQWlEQ2dDQUNJQmF5RUZBbjhnQVNBSFFSQjJUUVJBSUFjZ0FVRVFkR3NoQnlBRlFZQ0FBbkVFUUNBTUtBSUVEQUlMSUF3b0FnUWhGU0FOSUF4QkRFRUlJQUVnQlVzaUVodHFLQUlBTmdJQUEwQUNRQ0FJRFFBZ0F5Z0NFQ0lJUVFGcUlRd2dDQzBBQVNFQklBZ3RBQUJCL3dGSEJFQWdBeUFNTmdJUVFRZ2hDQ0FCUVFoMElBZHFJUWNNQVFzZ0FVR1BBVTBFUUNBRElBdzJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlDeUFJUVFGcklRZ2dCMEVCZENFSElBVkJBWFFpQlVHQWdBSkpEUUFMSUJWRklCVWdFaHNNQVFzZ0RDZ0NCQ0VWSUEwZ0RFRUlRUXdnQVNBRlN5SVNHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEQ0FJTFFBQklRVWdDQzBBQUVIL0FVY0VRQ0FESUF3MkFoQkJDQ0VJSUFWQkNIUWdCMm9oQnd3QkN5QUZRWThCVFFSQUlBTWdERFlDRUNBRlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdMSUFoQkFXc2hDQ0FIUVFGMElRY2dBVUVCZENJQlFZQ0FBa2tOQUFzZ0FTRUZJQlVnRlVVZ0Voc0xCSDhnQlNBVUlBSW9BZ1JCRVhaQkJIRWdBa0VFYXlJVktBSUFRUk4yUVFGeElBWkJEblpCRUhFZ0JrRVFka0hBQUhFZ0JrR3FBWEZ5Y25KeUloSkJrTDRCYWkwQUFFRUNkR29pRFNnQ0FDSU1LQUlBSWdGcklRVWdFa0dRd0FGcUxRQUFJUklnRXlBV0lBc2dFZ0ovSUFFZ0IwRVFkazBFUUNBSElBRkJFSFJySVFjZ0JVR0FnQUp4QkVBZ0RDZ0NCQXdDQ3lBTUtBSUVJUThnRFNBTVFReEJDQ0FCSUFWTElod2JhaWdDQURZQ0FBTkFBa0FnQ0EwQUlBTW9BaEFpQ0VFQmFpRU1JQWd0QUFFaEFTQUlMUUFBUWY4QlJ3UkFJQU1nRERZQ0VF
20RUlJUWdnQVVFSWRDQUhhaUVIREFFTElBRkJqd0ZOQkVBZ0F5QU1OZ0lRSUFGQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXNnQ0VFQmF5RUlJQWRCQVhRaEJ5QUZRUUYwSWdWQmdJQUNTUTBBQ3lBUFJTQVBJQndiREFFTElBd29BZ1FoRHlBTklBeEJDRUVNSUFFZ0JVc2lIQnRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUXdnQ0MwQUFTRUZJQWd0QUFCQi93RkhCRUFnQXlBTU5nSVFRUWdoQ0NBRlFRaDBJQWRxSVFjTUFRc2dCVUdQQVUwRVFDQURJQXcyQWhBZ0JVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQUZCQVhRaUFVR0FnQUpKRFFBTElBRWhCU0FQSUE5RklCd2JDeUlCUmhzMkFnQWdGU0FWS0FJQVFTQnlOZ0lBSUFJZ0FpZ0NCRUVJY2pZQ0JDQUdJQUVnRW5OQkUzUnlRUkJ5QlNBR0MwR0FnSUFCY2lFR0N3SkFJQVpCZ0lHQUNIRU5BQ0FHUWZnZWNVVU5BQ0FGSUJRZ0F5Z0NiQ0FHUVFOMkloSkI3d054YWkwQUFFRUNkR29pRFNnQ0FDSU1LQUlBSWdGcklRVUNmeUFCSUFkQkVIWk5CRUFnQnlBQlFSQjBheUVISUFWQmdJQUNjUVJBSUF3b0FnUU1BZ3NnRENnQ0JDRVZJQTBnREVFTVFRZ2dBU0FGU3lJUEcyb29BZ0EyQWdBRFFBSkFJQWdOQUNBREtBSVFJZ2hCQVdvaERDQUlMUUFCSVFFZ0NDMEFBRUgvQVVjRVFDQURJQXcyQWhCQkNDRUlJQUZCQ0hRZ0Iyb2hCd3dCQ3lBQlFZOEJUUVJBSUFNZ0REWUNFQ0FCUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nQXlnQ0RFRUJhallDRENBSFFZRCtBMm9oQjBFSUlRZ0xJQWhCQVdzaENDQUhRUUYwSVFjZ0JVRUJkQ0lGUVlDQUFra05BQXNnRlVVZ0ZTQVBHd3dCQ3lBTUtBSUVJUlVnRFNBTVFRaEJEQ0FCSUFWTElnOGJhaWdDQURZQ0FBTkFBa0FnQ0EwQUlBTW9BaEFpQ0VFQmFpRU1JQWd0QUFFaEJTQUlMUUFBUWY4QlJ3UkFJQU1nRERZQ0VFRUlJUWdnQlVFSWRDQUhhaUVIREFFTElBVkJqd0ZOQkVBZ0F5QU1OZ0lRSUFWQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXNnQ0VFQmF5RUlJQWRCQVhRaEJ5QUJRUUYwSWdGQmdJQUNTUTBBQ3lBQklRVWdGU0FWUlNBUEd3c0VmeUFGSUJR
20Z0FpZ0NCRUVVZGtFRWNTQUNRUVJySWhVb0FnQkJGblpCQVhFZ0JrRVBka0VRY1NBR1FSTjJRY0FBY1NBU1Fhb0JjWEp5Y25JaUVrR1F2Z0ZxTFFBQVFRSjBhaUlOS0FJQUlnd29BZ0FpQVdzaEJTQVNRWkRBQVdvdEFBQWhFaUFUSUFSQkFuUnFJQllnQ3lBU0FuOGdBU0FIUVJCMlRRUkFJQWNnQVVFUWRHc2hCeUFGUVlDQUFuRUVRQ0FNS0FJRURBSUxJQXdvQWdRaER5QU5JQXhCREVFSUlBRWdCVXNpSEJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVF3Z0NDMEFBU0VCSUFndEFBQkIvd0ZIQkVBZ0F5QU1OZ0lRUVFnaENDQUJRUWgwSUFkcUlRY01BUXNnQVVHUEFVMEVRQ0FESUF3MkFoQWdBVUVKZENBSGFpRUhRUWNoQ0F3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQjBHQS9nTnFJUWRCQ0NFSUN5QUlRUUZySVFnZ0IwRUJkQ0VISUFWQkFYUWlCVUdBZ0FKSkRRQUxJQTlGSUE4Z0hCc01BUXNnRENnQ0JDRVBJQTBnREVFSVFRd2dBU0FGU3lJY0cyb29BZ0EyQWdBRFFBSkFJQWdOQUNBREtBSVFJZ2hCQVdvaERDQUlMUUFCSVFVZ0NDMEFBRUgvQVVjRVFDQURJQXcyQWhCQkNDRUlJQVZCQ0hRZ0Iyb2hCd3dCQ3lBRlFZOEJUUVJBSUFNZ0REWUNFQ0FGUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nQXlnQ0RFRUJhallDRENBSFFZRCtBMm9oQjBFSUlRZ0xJQWhCQVdzaENDQUhRUUYwSVFjZ0FVRUJkQ0lCUVlDQUFra05BQXNnQVNFRklBOGdEMFVnSEJzTElnRkdHellDQUNBVklCVW9BZ0JCZ0FKeU5nSUFJQUlnQWlnQ0JFSEFBSEkyQWdRZ0JpQUJJQkp6UVJaMGNrR0FBWElGSUFZTFFZQ0FnQWh5SVFZTEFrQWdCa0dBaUlEQUFIRU5BQ0FHUWNEM0FYRkZEUUFnQlNBVUlBTW9BbXdnQmtFR2RpSVNRZThEY1dvdEFBQkJBblJxSWcwb0FnQWlEQ2dDQUNJQmF5RUZBbjhnQVNBSFFSQjJUUVJBSUFjZ0FVRVFkR3NoQnlBRlFZQ0FBbkVFUUNBTUtBSUVEQUlMSUF3b0FnUWhGU0FOSUF4QkRFRUlJQUVnQlVzaUR4dHFLQUlBTmdJQUEwQUNRQ0FJRFFBZ0F5Z0NFQ0lJUVFGcUlRd2dDQzBBQVNFQklBZ3RBQUJCL3dGSEJFQWdBeUFNTmdJUVFRZ2hDQ0FCUVFoMElBZHFJUWNNQVFzZ0FVR1BBVTBFUUNBRElBdzJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlDeUFJUVFGcklRZ2dCMEVCZENFSElBVkJBWFFpQlVHQWdBSkpEUUFMSUJWRklCVWdEeHNNQVFzZ0RDZ0NCQ0VWSUEwZ0RFRUlRUXdnQVNBRlN5SVBHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEQ0FJTFFBQklRVWdDQzBBQUVIL0FVY0VRQ0FESUF3MkFoQkJDQ0VJSUFWQkNIUWdCMm9oQnd3QkN5QUZRWThCVFFSQUlBTWdERFlDRUNBRlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdMSUFoQkFXc2hDQ0FIUVFGMElRY2dBVUVCZENJQlFZQ0FBa2tOQUFzZ0FTRUZJQlVnRlVVZ0R4c0xCSDhnQlNBVUlBSW9BZ1JCRjNaQkJIRWdBa0VFYXlJVktBSUFRUmwyUVFGeElBWkJFblpCRUhFZ0JrRVdka0hBQUhFZ0VrR3FBWEZ5Y25KeUloSkJrTDRCYWkwQUFFRUNkR29pRFNnQ0FDSU1LQUlBSWdGcklRVWdFa0dRd0FGcUxRQUFJUklnRXlBa2FpQVdJQXNnRWdKL0lBRWdCMEVRZGswRVFDQUhJQUZCRUhScklRY2dCVUdBZ0FKeEJFQWdEQ2dDQkF3Q0N5QU1LQUlFSVE4Z0RTQU1RUXhCQ0NBQklBVkxJaHdiYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVNSUFndEFBRWhBU0FJTFFBQVFmOEJSd1JBSUFNZ0REWUNFRUVJSVFnZ0FVRUlkQ0FIYWlFSERBRUxJQUZCandGTkJFQWdBeUFNTmdJUUlBRkJDWFFnQjJvaEIwRUhJUWdNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0FzZ0NFRUJheUVJSUFkQkFYUWhCeUFGUVFGMElnVkJnSUFDU1EwQUN5QVBSU0FQSUJ3YkRBRUxJQXdvQWdRaER5QU5JQXhCQ0VFTUlBRWdCVXNpSEJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVF3Z0NDMEFBU0VGSUFndEFBQkIvd0ZIQkVBZ0F5QU1OZ0lRUVFnaENDQUZRUWgwSUFkcUlRY01BUXNnQlVHUEFVMEVRQ0FESUF3MkFoQWdCVUVKZENBSGFpRUhRUWNoQ0F3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQjBHQS9nTnFJUWRCQ0NFSUN5QUlRUUZySVFnZ0IwRUJkQ0VISUFGQkFYUWlBVUdBZ0FKSkRRQUxJQUVoQlNBUElBOUZJQndiQ3lJQlJoczJBZ0FnRlNBVktBSUFRWUFRY2pZQ0FDQUNJQUlvQWdSQmdBUnlOZ0lFSUFZZ0FTQVNjMEVaZEhKQmdBaHlCU0FHQzBHQWdJREFBSEloQmdzQ1FDQUdRWURBZ0lBRWNRMEFJQVpCZ0x3UGNVVU5BQ0FGSUJRZ0F5Z0NiQ0FHUVFsMkloSkI3d054YWkwQUFFRUNkR29pRFNnQ0FDSU1LQUlBSWdGcklRVUNmeUFCSUFkQkVIWk5CRUFnQnlBQlFSQjBheUVISUFWQmdJQUNjUVJBSUF3b0FnUU1BZ3NnRENnQ0JDRVZJQTBnREVFTVFRZ2dBU0FGU3lJUEcyb29BZ0EyQWdBRFFBSkFJQWdOQUNBREtBSVFJZ2hCQVdvaERDQUlMUUFCSVFFZ0NDMEFBRUgvQVVjRVFDQURJQXcyQWhCQkNDRUlJQUZCQ0hRZ0Iyb2hCd3dCQ3lBQlFZOEJUUVJBSUFNZ0REWUNFQ0FCUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nQXlnQ0RFRUJhallDRENBSFFZRCtBMm9oQjBFSUlRZ0xJQWhCQVdzaENDQUhRUUYwSVFjZ0JVRUJkQ0lGUVlDQUFra05BQXNnRlVVZ0ZTQVBHd3dCQ3lBTUtBSUVJUlVnRFNBTVFRaEJEQ0FCSUFWTElnOGJhaWdDQURZQ0FBTkFBa0FnQ0EwQUlBTW9BaEFpQ0VFQmFpRU1JQWd0QUFFaEJTQUlMUUFBUWY4QlJ3UkFJQU1nRERZQ0VFRUlJUWdnQlVFSWRDQUhhaUVIREFFTElBVkJqd0ZOQkVBZ0F5QU1OZ0lRSUFWQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXNnQ0VFQmF5RUlJQWRCQVhRaEJ5QUJRUUYwSWdGQmdJQUNTUTBBQ3lBQklRVWdGU0FWUlNBUEd3c0VmeUFGSUJR
20Z0FpZ0NCRUVhZGtFRWNTQUNRUVJySWhVb0FnQkJISFpCQVhFZ0JrRVZka0VRY1NBR1FSbDJRY0FBY1NBU1Fhb0JjWEp5Y25JaUVrR1F2Z0ZxTFFBQVFRSjBhaUlOS0FJQUlnd29BZ0FpQVdzaEJTQVNRWkRBQVdvdEFBQWhFaUFSSUJOcUlCWWdDeUFTQW44Z0FTQUhRUkIyVFFSQUlBY2dBVUVRZEdzaEJ5QUZRWUNBQW5FRVFDQU1LQUlFREFJTElBd29BZ1FoRHlBTklBeEJERUVJSUFFZ0JVc2lIQnRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUXdnQ0MwQUFTRUJJQWd0QUFCQi93RkhCRUFnQXlBTU5nSVFRUWdoQ0NBQlFRaDBJQWRxSVFjTUFRc2dBVUdQQVUwRVFDQURJQXcyQWhBZ0FVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQVZCQVhRaUJVR0FnQUpKRFFBTElBOUZJQThnSEJzTUFRc2dEQ2dDQkNFUElBMGdERUVJUVF3Z0FTQUZTeUljRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRENBSUxRQUJJUVVnQ0MwQUFFSC9BVWNFUUNBRElBdzJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3d0JDeUFGUVk4QlRRUkFJQU1nRERZQ0VDQUZRUWwwSUFkcUlRZEJCeUVJREFFTElBTWdBeWdDREVFQmFqWUNEQ0FIUVlEK0Eyb2hCMEVJSVFnTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUE4Z0QwVWdIQnNMSWd4R0d6WUNBQ0FWSUJVb0FnQkJnSUFCY2pZQ0FDQUNJQUlvQWdSQmdDQnlOZ0lFSUFNb0FueEJBblFnQW1vaUFTQUJLQUlFUVFSeU5nSUVJQUVnQVNnQ0RFRUJjallDRENBQklBRW9BZ2dnRENBU2N5SUJRUkowY2tFQ2NqWUNDQ0FHSUFGQkhIUnlRWURBQUhJRklBWUxRWUNBZ0lBRWNpRUdDeUFDSUFZMkFnQUxJQUpCQkdvaEJpQVRRUVJxSVJNZ0RrRUJhaUlPSUFSSERRQUxJQUpCREdvaEJpQVJJQk5xSVJNZ0NVRUVhaUlKSUFNb0FvQUJJZ0ZCZkhGSkRRQUxEQUVMUVFRZ0FVRjhjU0lHSUFaQkJFMGJRUUZySWdaQmZIRkJCR29oQ1NBQ0lBWkJBWFJCZUhGcVFSUnFJUVlMSUFNZ0NEWUNDQ0FESUFVMkFnUWdBeUFITmdJQUlBTWdEVFlDYUNBRVJRMEJJQUVnQ1UwTkFRTkFJQUVnQ1VaQkFDRUlJQWtoQVVVRVFBTkFJQU1nQmlBVElBUWdDR3hCQW5ScUlCWWdDQ0FES0FKOFFRSnFRUUVRWWlBSVFRRnFJZ2dnQXlnQ2dBRWlBU0FKYTBrTkFBc0xJQVpCQkdvaEJpQVRRUVJxSVJNZ0NrRUJhaUlLSUFSSERRQUxEQUVMQWtBZ0FVRUVTUTBBSUFRRVFDQUVRUXhzSVJFZ0JFRURkQ0VrUVFBZ0Ztc2hDeUFEUVJ4cUlSUURRRUVBSVE0RFFDQUdJZ0lvQWdBaUJnUkFBa0FnQmtHUWdJQUJjUTBBSUFaQjd3TnhJZ0ZGRFFBZ0JTQVVJQU1vQW13Z0FXb3RBQUJCQW5ScUlnMG9BZ0FpRENnQ0FDSUJheUVGQW44Z0FTQUhRUkIyVFFSQUlBY2dBVUVRZEdzaEJ5QUZRWUNBQW5FRVFDQU1LQUlFREFJTElBd29BZ1FoRlNBTklBeEJERUVJSUFFZ0JVc2lFaHRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUXdnQ0MwQUFTRUJJQWd0QUFCQi93RkhCRUFnQXlBTU5nSVFRUWdoQ0NBQlFRaDBJQWRxSVFjTUFRc2dBVUdQQVUwRVFDQURJQXcyQWhBZ0FVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQVZCQVhRaUJVR0FnQUpKRFFBTElCVkZJQlVnRWhzTUFRc2dEQ2dDQkNFVklBMGdERUVJUVF3Z0FTQUZTeUlTRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRENBSUxRQUJJUVVnQ0MwQUFFSC9BVWNFUUNBRElBdzJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3d0JDeUFGUVk4QlRRUkFJQU1nRERZQ0VDQUZRUWwwSUFkcUlRZEJCeUVJREFFTElBTWdBeWdDREVFQmFqWUNEQ0FIUVlEK0Eyb2hCMEVJSVFnTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUJVZ0ZVVWdFaHNMQkg4Z0JTQVVJQUlvQWdSQkVYWkJCSEVnQWtFRWF5SVZLQUlBUVJOMlFRRnhJQVpCRG5aQkVIRWdCa0VRZGtIQUFIRWdCa0dxQVhGeWNuSnlJaEpCa0w0QmFpMEFBRUVDZEdvaURTZ0NBQ0lNS0FJQUl
20nRnJJUVVnRWtHUXdBRnFMUUFBSVJJZ0V5QVdJQXNnRWdKL0lBRWdCMEVRZGswRVFDQUhJQUZCRUhScklRY2dCVUdBZ0FKeEJFQWdEQ2dDQkF3Q0N5QU1LQUlFSVE4Z0RTQU1RUXhCQ0NBQklBVkxJaHdiYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVNSUFndEFBRWhBU0FJTFFBQVFmOEJSd1JBSUFNZ0REWUNFRUVJSVFnZ0FVRUlkQ0FIYWlFSERBRUxJQUZCandGTkJFQWdBeUFNTmdJUUlBRkJDWFFnQjJvaEIwRUhJUWdNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0FzZ0NFRUJheUVJSUFkQkFYUWhCeUFGUVFGMElnVkJnSUFDU1EwQUN5QVBSU0FQSUJ3YkRBRUxJQXdvQWdRaER5QU5JQXhCQ0VFTUlBRWdCVXNpSEJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVF3Z0NDMEFBU0VGSUFndEFBQkIvd0ZIQkVBZ0F5QU1OZ0lRUVFnaENDQUZRUWgwSUFkcUlRY01BUXNnQlVHUEFVMEVRQ0FESUF3MkFoQWdCVUVKZENBSGFpRUhRUWNoQ0F3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQjBHQS9nTnFJUWRCQ0NFSUN5QUlRUUZySVFnZ0IwRUJkQ0VISUFGQkFYUWlBVUdBZ0FKSkRRQUxJQUVoQlNBUElBOUZJQndiQ3lJTVJoczJBZ0FnRlNBVktBSUFRU0J5TmdJQUlBSWdBaWdDQkVFSWNqWUNCQ0FDUVg0Z0F5Z0NmR3RCQW5ScUlnRWdBU2dDQkVHQWdBSnlOZ0lFSUFFZ0FTZ0NBQ0FNSUJKeklneEJIM1J5UVlDQUJISTJBZ0FnQVVFRWF5SUJJQUVvQWdCQmdJQUljallDQUNBR0lBeE
vendor: 6,213 bytes, line 20
20JFM1J5UVJCeUJTQUdDMEdBZ0lBQmNpRUdDd0pBSUFaQmdJR0FDSEVOQUNBR1FmZ2VjVVVOQUNBRklCUWdBeWdDYkNBR1FRTjJJaEpCN3dOeGFpMEFBRUVDZEdvaURTZ0NBQ0lNS0FJQUlnRnJJUVVDZnlBQklBZEJFSFpOQkVBZ0J5QUJRUkIwYXlFSElBVkJnSUFDY1FSQUlBd29BZ1FNQWdzZ0RDZ0NCQ0VWSUEwZ0RFRU1RUWdnQVNBRlN5SVBHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEQ0FJTFFBQklRRWdDQzBBQUVIL0FVY0VRQ0FESUF3MkFoQkJDQ0VJSUFGQkNIUWdCMm9oQnd3QkN5QUJRWThCVFFSQUlBTWdERFlDRUNBQlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdMSUFoQkFXc2hDQ0FIUVFGMElRY2dCVUVCZENJRlFZQ0FBa2tOQUFzZ0ZVVWdGU0FQR3d3QkN5QU1LQUlFSVJVZ0RTQU1RUWhCRENBQklBVkxJZzhiYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVNSUFndEFBRWhCU0FJTFFBQVFmOEJSd1JBSUFNZ0REWUNFRUVJSVFnZ0JVRUlkQ0FIYWlFSERBRUxJQVZCandGTkJFQWdBeUFNTmdJUUlBVkJDWFFnQjJvaEIwRUhJUWdNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0FzZ0NFRUJheUVJSUFkQkFYUWhCeUFCUVFGMElnRkJnSUFDU1EwQUN5QUJJUVVnRlNBVlJTQVBHd3NFZnlBRklCUWdBaWdDQkVFVWRrRUVjU0FDUVFSckloVW9BZ0JCRm5aQkFYRWdCa0VQZGtFUWNTQUdRUk4yUWNBQWNTQVNRYW9CY1hKeWNuSWlFa0dRdmdGcUxRQUFRUUowYWlJTktBSUFJZ3dvQWdBaUFXc2hCU0FTUVpEQUFXb3RBQUFoRWlBVElBUkJBblJxSUJZZ0N5QVNBbjhnQVNBSFFSQjJUUVJBSUFjZ0FVRVFkR3NoQnlBRlFZQ0FBbkVFUUNBTUtBSUVEQUlMSUF3b0FnUWhEeUFOSUF4QkRFRUlJQUVnQlVzaUhCdHFLQUlBTmdJQUEwQUNRQ0FJRFFBZ0F5Z0NFQ0lJUVFGcUlRd2dDQzBBQVNFQklBZ3RBQUJCL3dGSEJFQWdBeUFNTmdJUVFRZ2hDQ0FCUVFoMElBZHFJUWNNQVFzZ0FVR1BBVTBFUUNBRElBdzJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlDeUFJUVFGcklRZ2dCMEVCZENFSElBVkJBWFFpQlVHQWdBSkpEUUFMSUE5RklBOGdIQnNNQVFzZ0RDZ0NCQ0VQSUEwZ0RFRUlRUXdnQVNBRlN5SWNHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEQ0FJTFFBQklRVWdDQzBBQUVIL0FVY0VRQ0FESUF3MkFoQkJDQ0VJSUFWQkNIUWdCMm9oQnd3QkN5QUZRWThCVFFSQUlBTWdERFlDRUNBRlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdMSUFoQkFXc2hDQ0FIUVFGMElRY2dBVUVCZENJQlFZQ0FBa2tOQUFzZ0FTRUZJQThnRDBVZ0hCc0xJZ0ZHR3pZQ0FDQVZJQlVvQWdCQmdBSnlOZ0lBSUFJZ0FpZ0NCRUhBQUhJMkFnUWdCaUFCSUJKelFSWjBja0dBQVhJRklBWUxRWUNBZ0FoeUlRWUxBa0FnQmtHQWlJREFBSEVOQUNBR1FjRDNBWEZGRFFBZ0JTQVVJQU1vQW13Z0JrRUdkaUlTUWU4RGNXb3RBQUJCQW5ScUlnMG9BZ0FpRENnQ0FDSUJheUVGQW44Z0FTQUhRUkIyVFFSQUlBY2dBVUVRZEdzaEJ5QUZRWUNBQW5FRVFDQU1LQUlFREFJTElBd29BZ1FoRlNBTklBeEJERUVJSUFFZ0JVc2lEeHRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUXdnQ0MwQUFTRUJJQWd0QUFCQi93RkhCRUFnQXlBTU5nSVFRUWdoQ0NBQlFRaDBJQWRxSVFjTUFRc2dBVUdQQVUwRVFDQURJQXcyQWhBZ0FVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQVZCQVhRaUJVR0FnQUpKRFFBTElCVkZJQlVnRHhzTUFRc2dEQ2dDQkNFVklBMGdERUVJUVF3Z0FTQUZTeUlQRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRENBSUxRQUJJUVVnQ0MwQUFFSC9BVWNFUUNBRElBdzJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3d0JDeUFGUVk4QlRRUkFJQU1nRERZQ0VDQUZRUWwwSUFkcUlRZEJCeUVJREFFTElBTWdBeWdDREVFQmFqWUNEQ0FIUVlEK0Eyb2hCMEVJSVFnTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUJVZ0ZVVWdEeHNMQkg4Z0JTQVVJQUlvQWdSQkYzWkJCSEVnQWtFRWF5SVZLQUlBUVJsMlFRRnhJQVpCRW5aQkVIRWdCa0VXZGtIQUFIRWdFa0dxQVhGeWNuSnlJaEpCa0w0QmFpMEFBRUVDZEdvaURTZ0NBQ0lNS0FJQUlnRnJJUVVnRWtHUXdBRnFMUUFBSVJJZ0V5QWthaUFXSUFzZ0VnSi9JQUVnQjBFUWRrMEVRQ0FISUFGQkVIUnJJUWNnQlVHQWdBSnhCRUFnRENnQ0JBd0NDeUFNS0FJRUlROGdEU0FNUVF4QkNDQUJJQVZMSWh3YmFpZ0NBRFlDQUFOQUFrQWdDQTBBSUFNb0FoQWlDRUVCYWlFTUlBZ3RBQUVoQVNBSUxRQUFRZjhCUndSQUlBTWdERFlDRUVFSUlRZ2dBVUVJZENBSGFpRUhEQUVMSUFGQmp3Rk5CRUFnQXlBTU5nSVFJQUZCQ1hRZ0Iyb2hCMEVISVFnTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFkQmdQNERhaUVIUVFnaENBc2dDRUVCYXlFSUlBZEJBWFFoQnlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFQUlNBUElCd2JEQUVMSUF3b0FnUWhEeUFOSUF4QkNFRU1JQUVnQlVzaUhCdHFLQUlBTmdJQUEwQUNRQ0FJRFFBZ0F5Z0NFQ0lJUVFGcUlRd2dDQzBBQVNFRklBZ3RBQUJCL3dGSEJFQWdBeUFNTmdJUVFRZ2hDQ0FGUVFoMElBZHFJUWNNQVFzZ0JVR1BBVTBFUUNBRElBdzJBaEFnQlVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlDeUFJUVFGcklRZ2dCMEVCZENFSElBRkJBWFFpQVVHQWdBSkpEUUFMSUFFaEJTQVBJQTlGSUJ3YkN5SUJSaHMyQWdBZ0ZTQVZLQUlBUVlBUWNqWUNBQ0FDSUFJb0FnUkJnQVJ5TmdJRUlBWWdBU0FTYzBFWmRISkJnQWh5QlNBR0MwR0FnSURBQUhJaEJnc0NRQ0FHUVlEQWdJQUVjUTBBSUFaQmdMd1BjVVVOQUNBRklCUWdBeWdDYkNBR1FRbDJJaEpCN3dOeGFpMEFBRUVDZEdvaURTZ0NBQ0lNS0FJQUlnRnJJUVVDZnlBQklBZEJFSFpOQkVBZ0J5QUJRUkIwYXlFSElBVkJnSUFDY1FSQUlBd29BZ1FNQWdzZ0RDZ0NCQ0VWSUEwZ0RFRU1RUWdnQVNBRlN5SVBHMm9vQWdBMkFnQURRQUpBSUFnTkFDQURLQUlRSWdoQkFXb2hEQ0FJTFFBQklRRWdDQzBBQUVIL0FVY0VRQ0FESUF3MkFoQkJDQ0VJSUFGQkNIUWdCMm9oQnd3QkN5QUJRWThCVFFSQUlBTWdERFlDRUNBQlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdMSUFoQkFXc2hDQ0FIUVFGMElRY2dCVUVCZENJRlFZQ0FBa2tOQUFzZ0ZVVWdGU0FQR3d3QkN5QU1LQUlFSVJVZ0RTQU1RUWhCRENBQklBVkxJZzhiYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVNSUFndEFBRWhCU0FJTFFBQVFmOEJSd1JBSUFNZ0REWUNFRUVJSVFnZ0JVRUlkQ0FIYWlFSERBRUxJQVZCandGTkJFQWdBeUFNTmdJUUlBVkJDWFFnQjJvaEIwRUhJUWdNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0FzZ0NFRUJheUVJSUFkQkFYUWhCeUFCUVFGMElnRkJnSUFDU1EwQUN5QUJJUVVnRlNBVlJTQVBHd3NFZnlBRklCUWdBaWdDQkVFYWRrRUVjU0FDUVFSckloVW9BZ0JCSEhaQkFYRWdCa0VWZGtFUWNTQUdRUmwyUWNBQWNTQVNRYW9CY1hKeWNuSWlFa0dRdmdGcUxRQUFRUUowYWlJTktBSUFJZ3dvQWdBaUFXc2hCU0FTUVpEQUFXb3RBQUFoRWlBUklCTnFJQllnQ3lBU0FuOGdBU0FIUVJCMlRRUkFJQWNnQVVFUWRHc2hCeUFGUVlDQUFuRUVRQ0FNS0FJRURBSUxJQXdvQWdRaER5QU5JQXhCREVFSUlBRWdCVXNpSEJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVF3Z0NDMEFBU0VCSUFndEFBQkIvd0ZIQkVBZ0F5QU1OZ0lRUVFnaENDQUJRUWgwSUFkcUlRY01BUXNnQVVHUEFVMEVRQ0FESUF3MkFoQWdBVUVKZENBSGFpRUhRUWNoQ0F3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQjBHQS9nTnFJUWRCQ0NFSUN5QUlRUUZySVFnZ0IwRUJkQ0VISUFWQkFYUWlCVUdBZ0FKSkRRQUxJQTlGSUE4Z0hCc01BUXNnRENnQ0JDRVBJQTBnREVFSVFRd2dBU0FGU3lJY0cyb29BZ0EyQWdBRFFBSkFJQWdOQUNBREtBSVFJZ2hCQVdvaERDQUlMUUFCSVFVZ0NDMEFBRUgvQVVjRVFDQURJQXcyQWhCQkNDRUlJQVZCQ0hRZ0Iyb2hCd3dCQ3lBRlFZOEJUUVJBSUFNZ0REWUNFQ0FGUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nQXlnQ0RFRUJhallDRENBSFFZRCtBMm9oQjBFSUlRZ0xJQWhCQVdzaENDQUhRUUYwSVFjZ0FVRUJkQ0lCUVlDQUFra05BQXNnQVNFRklBOGdEMFVnSEJzTElneEdHellDQUNBVklCVW9BZ0JCZ0lBQmNqWUNBQ0FDSUFJb0FnUkJnQ0J5TmdJRUlBTW9BbnhCQW5RZ0Ftb2lBU0FCS0FJRVFRUnlOZ0lFSUFFZ0FTZ0NERUVCY2pZQ0RDQUJJQUVvQWdnZ0RDQVNjeUlCUVJKMGNrRUNjallDQ0NBR0lBRkJISFJ5UVlEQUFISUZJQVlMUVlDQWdJQUVjaUVHQ3lBQ0lBWTJBZ0FMSUFKQkJHb2hCaUFUUVFScUlSTWdEa0VCYWlJT0lBUkhEUUFMSUFKQkRHb2hCaUFSSUJOcUlSTWdDVUVFYWlJSklBTW9Bb0FCSWdGQmZIRkpEUUFMREFFTFFRUWdBVUY4Y1NJR0lBWkJCRTBiUVFGcklnWkJmSEZCQkdvaENTQUNJQVpCQVhSQmVIRnFRUlJxSVFZTElBTWdDRFlDQ0NBRElBVTJBZ1FnQXlBSE5nSUFJQU1nRFRZQ2FDQUVSUTB
20BSUFFZ0NVME5BQU5BSUFFZ0NVWkJBQ0VJSUFraEFVVUVRQU5BSUFNZ0JpQVRJQVFnQ0d4QkFuUnFJQllnQ0NBREtBSjhRUUpxUVFBUVlpQUlRUUZxSWdnZ0F5Z0NnQUVpQVNBSmEwa05BQXNMSUFaQkJHb2hCaUFUUVFScUlSTWdDa0VCYWlJS0lBUkhEUUFMQ3d3Q0N3TkFRUUFoQ2dOQUlBRWhBaUFHSWdrb0FnQWlCZ1JBQWtBZ0JrR1FnSUFCY1EwQUlBWkI3d054SWdGRkRRQWdCU0FFSUFNb0Ftd2dBV290QUFCQkFuUnFJZzBvQWdBaURpZ0NBQ0lCYXlFRkFuOGdBU0FIUVJCMlN3UkFJQTRvQWdRaERDQU5JQTVCQ0VFTUlBRWdCVXNpQ3h0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVE0Z0NDMEFBU0VGSUFndEFBQkIvd0ZHQkVBZ0JVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJREFJTElBTWdEallDRUNBRlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0RqWUNFRUVJSVFnZ0JVRUlkQ0FIYWlFSEN5QUlRUUZySVFnZ0IwRUJkQ0VISUFGQkFYUWlBVUdBZ0FKSkRRQUxJQUVoQlNBTUlBeEZJQXNiREFFTElBY2dBVUVRZEdzaEJ5QUZRWUNBQW5GRkJFQWdEaWdDQkNFTUlBMGdEa0VNUVFnZ0FTQUZTeUlMRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRGlBSUxRQUJJUUVnQ0MwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdNQWdzZ0F5QU9OZ0lRSUFGQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBT05nSVFRUWdoQ0NBQlFRaDBJQWRxSVFjTElBaEJBV3NoQ0NBSFFRRjBJUWNnQlVFQmRDSUZRWUNBQWtrTkFBc2dERVVnRENBTEd3d0JDeUFPS0FJRUN3Ui9JQVVnQkNBSktBSUVRUkYyUVFSeElBbEJCR3NpRENnQ0FFRVRka0VCY1NBR1FRNTJRUkJ4SUFaQkVIWkJ3QUJ4SUFaQnFnRnhjbkp5Y2lJTFFaQytBV290QUFCQkFuUnFJZzBvQWdBaURpZ0NBQ0lCYXlFRklBdEJrTUFCYWkwQUFDRUxJQUlnRXlBVUlBc0NmeUFCSUFkQkVIWkxCRUFnRGlnQ0JDRVJJQTBnRGtFSVFRd2dBU0FGU3lJVkcyb29BZ0EyQWdBRFFBSkFJQWdOQUNBREtBSVFJZ2hCQVdvaERpQUlMUUFCSVFVZ0NDMEFBRUgvQVVZRVFDQUZRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FIUVlEK0Eyb2hCMEVJSVFnTUFnc2dBeUFPTmdJUUlBVkJDWFFnQjJvaEIwRUhJUWdNQVFzZ0F5QU9OZ0lRUVFnaENDQUZRUWgwSUFkcUlRY0xJQWhCQVdzaENDQUhRUUYwSVFjZ0FVRUJkQ0lCUVlDQUFra05BQXNnQVNFRklCRWdFVVVnRlJzTUFRc2dCeUFCUVJCMGF5RUhJQVZCZ0lBQ2NVVUVRQ0FPS0FJRUlSRWdEU0FPUVF4QkNDQUJJQVZMSWhVYmFpZ0NBRFlDQUFOQUFrQWdDQTBBSUFNb0FoQWlDRUVCYWlFT0lBZ3RBQUVoQVNBSUxRQUFRZjhCUmdSQUlBRkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0F3Q0N5QURJQTQyQWhBZ0FVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBNDJBaEJCQ0NFSUlBRkJDSFFnQjJvaEJ3c2dDRUVCYXlFSUlBZEJBWFFoQnlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFSUlNBUklCVWJEQUVMSUE0b0FnUUxJZ0ZHR3pZQ0FDQU1JQXdvQWdCQklISTJBZ0FnQ1NBSktBSUVRUWh5TmdJRUlBWWdBU0FMYzBFVGRISkJFSElGSUFZTFFZQ0FnQUZ5SVFZTEFrQWdCa0dBZ1lBSWNRMEFJQVpCK0I1eFJRMEFJQVVnQkNBREtBSnNJQVpCQTNZaUMwSHZBM0ZxTFFBQVFRSjBhaUlOS0FJQUlnNG9BZ0FpQVdzaEJRSi9JQUVnQjBFUWRrc0VRQ0FPS0FJRUlRd2dEU0FPUVFoQkRDQUJJQVZMSWhFYmFpZ0NBRFlDQUFOQUFrQWdDQTBBSUFNb0FoQWlDRUVCYWlFT0lBZ3RBQUVoQlNBSUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0F3Q0N5QURJQTQyQWhBZ0JVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBNDJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3c2dDRUVCYXlFSUlBZEJBWFFoQnlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFCSVFVZ0RDQU1SU0FSR3d3QkN5QUhJQUZCRUhScklRY2dCVUdBZ0FKeFJRUkFJQTRvQWdRaERDQU5JQTVCREVFSUlBRWdCVXNpRVJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVE0Z0NDMEFBU0VCSUFndEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJREFJTElBTWdEallDRUNBQlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0RqWUNFRUVJSVFnZ0FVRUlkQ0FIYWlFSEN5QUlRUUZySVFnZ0IwRUJkQ0VISUFWQkFYUWlCVUdBZ0FKSkRRQUxJQXhGSUF3Z0VSc01BUXNnRGlnQ0JBc0VmeUFGSUFRZ0NTZ0NCRUVVZGtFRWNTQUpRUVJySWd3b0FnQkJGblpCQVhFZ0JrRVBka0VRY1NBR1FSTjJRY0FBY1NBTFFhb0JjWEp5Y25JaUMwR1F2Z0ZxTFFBQVFRSjBhaUlOS0FJQUlnNG9BZ0FpQVdzaEJTQUxRWkRBQVdvdEFBQWhDeUFDSUJNZ0ZDQUxBbjhnQVNBSFFSQjJTd1JBSUE0b0FnUWhFU0FOSUE1QkNFRU1JQUVnQlVzaUZSdHFLQUlBTmdJQUEwQUNRQ0FJRFFBZ0F5Z0NFQ0lJUVFGcUlRNGdDQzBBQVNFRklBZ3RBQUJCL3dGR0JFQWdCVUdRQVU4RVFDQURJQU1vQWd4QkFXbzJBZ3dnQjBHQS9nTnFJUWRCQ0NFSURBSUxJQU1nRGpZQ0VDQUZRUWwwSUFkcUlRZEJCeUVJREFFTElBTWdEallDRUVFSUlRZ2dCVUVJZENBSGFpRUhDeUFJUVFGcklRZ2dCMEVCZENFSElBRkJBWFFpQVVHQWdBSkpEUUFMSUFFaEJTQVJJQkZGSUJVYkRBRUxJQWNnQVVFUWRHc2hCeUFGUVlDQUFuRkZCRUFnRGlnQ0JDRVJJQTBnRGtFTVFRZ2dBU0FGU3lJVkcyb29BZ0EyQWdBRFFBSkFJQWdOQUNBREtBSVFJZ2hCQVdvaERpQUlMUUFCSVFFZ0NDMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FIUVlEK0Eyb2hCMEVJSVFnTUFnc2dBeUFPTmdJUUlBRkJDWFFnQjJvaEIwRUhJUWdNQVFzZ0F5QU9OZ0lRUVFnaENDQUJRUWgwSUFkcUlRY0xJQWhCQVdzaENDQUhRUUYwSVFjZ0JVRUJkQ0lGUVlDQUFra05BQXNnRVVVZ0VTQVZHd3dCQ3lBT0tBSUVDeUlCUmhzMkFvQUNJQXdnRENnQ0FFR0FBbkkyQWdBZ0NTQUpLQUlFUWNBQWNqWUNCQ0FHSUFFZ0MzTkJGblJ5UVlBQmNnVWdCZ3RCZ0lDQUNISWhCZ3NDUUNBR1FZQ0lnTUFBY1EwQUlBWkJ3UGNCY1VVTkFDQUZJQVFnQXlnQ2JDQUdRUVoySWd0Qjd3TnhhaTBBQUVFQ2RHb2lEU2dDQUNJT0tBSUFJZ0ZySVFVQ2Z5QUJJQWRCRUhaTEJFQWdEaWdDQkNFTUlBMGdEa0VJUVF3Z0
20FTQUZTeUlSRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRGlBSUxRQUJJUVVnQ0MwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdNQWdzZ0F5QU9OZ0lRSUFWQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBT05nSVFRUWdoQ0NBRlFRaDBJQWRxSVFjTElBaEJBV3NoQ0NBSFFRRjBJUWNnQVVFQmRDSUJRWUNBQWtrTkFBc2dBU0VGSUF3Z0RFVWdFUnNNQVFzZ0J5QUJRUkIwYXlFSElBVkJnSUFDY1VVRVFDQU9LQUlFSVF3Z0RTQU9RUXhCQ0NBQklBVkxJaEViYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVPSUFndEFBRWhBU0FJTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXdDQ3lBRElBNDJBaEFnQVVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUE0MkFoQkJDQ0VJSUFGQkNIUWdCMm9oQndzZ0NFRUJheUVJSUFkQkFYUWhCeUFGUVFGMElnVkJnSUFDU1EwQUN5QU1SU0FNSUJFYkRBRUxJQTRvQWdRTEJIOGdCU0FFSUFrb0FnUkJGM1pCQkhFZ0NVRUVheUlNS0FJQVFSbDJRUUZ4SUFaQkVuWkJFSEVnQmtFV2RrSEFBSEVnQzBHcUFYRnljbkp5SWd0QmtMNEJhaTBBQUVFQ2RHb2lEU2dDQUNJT0tBSUFJZ0ZySVFVZ0MwR1F3QUZxTFFBQUlRc2dBaUFUSUJRZ0N3Si9JQUVnQjBFUWRrc0VRQ0FPS0FJRUlSRWdEU0FPUVFoQkRDQUJJQVZMSWhVYmFpZ0NBRFlDQUFOQUFrQWdDQTBBSUFNb0FoQWlDRUVCYWlFT0lBZ3RBQUVoQlNBSUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQWRCZ1A0RGFpRUhRUWdoQ0F3Q0N5QURJQTQyQWhBZ0JVRUpkQ0FIYWlFSFFRY2hDQXdCQ3lBRElBNDJBaEJCQ0NFSUlBVkJDSFFnQjJvaEJ3c2dDRUVCYXlFSUlBZEJBWFFoQnlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFCSVFVZ0VTQVJSU0FWR3d3QkN5QUhJQUZCRUhScklRY2dCVUdBZ0FKeFJRUkFJQTRvQWdRaEVTQU5JQTVCREVFSUlBRWdCVXNpRlJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVE0Z0NDMEFBU0VCSUFndEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJREFJTElBTWdEallDRUNBQlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0RqWUNFRUVJSVFnZ0FVRUlkQ0FIYWlFSEN5QUlRUUZySVFnZ0IwRUJkQ0VISUFWQkFYUWlCVUdBZ0FKSkRRQUxJQkZGSUJFZ0ZSc01BUXNnRGlnQ0JBc2lBVVliTmdLQUJDQU1JQXdvQWdCQmdCQnlOZ0lBSUFrZ0NTZ0NCRUdBQkhJMkFnUWdCaUFCSUF0elFSbDBja0dBQ0hJRklBWUxRWUNBZ01BQWNpRUdDd0pBSUFaQmdNQ0FnQVJ4RFFBZ0JrR0F2QTl4UlEwQUlBVWdCQ0FES0FKc0lBWkJDWFlpQzBIdkEzRnFMUUFBUVFKMGFpSU5LQUlBSWc0b0FnQWlBV3NoQlFKL0lBRWdCMEVRZGtzRVFDQU9LQUlFSVF3Z0RTQU9RUWhCRENBQklBVkxJaEViYWlnQ0FEWUNBQU5BQWtBZ0NBMEFJQU1vQWhBaUNFRUJhaUVPSUFndEFBRWhCU0FJTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBZEJnUDREYWlFSFFRZ2hDQXdDQ3lBRElBNDJBaEFnQlVFSmRDQUhhaUVIUVFjaENBd0JDeUFESUE0MkFoQkJDQ0VJSUFWQkNIUWdCMm9oQndzZ0NFRUJheUVJSUFkQkFYUWhCeUFCUVFGMElnRkJnSUFDU1EwQUN5QUJJUVVnRENBTVJTQVJHd3dCQ3lBSElBRkJFSFJySVFjZ0JVR0FnQUp4UlFSQUlBNG9BZ1FoRENBTklBNUJERUVJSUFFZ0JVc2lFUnRxS0FJQU5nSUFBMEFDUUNBSURRQWdBeWdDRUNJSVFRRnFJUTRnQ0MwQUFTRUJJQWd0QUFCQi93RkdCRUFnQVVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0IwR0EvZ05xSVFkQkNDRUlEQUlMSUFNZ0RqWUNFQ0FCUVFsMElBZHFJUWRCQnlFSURBRUxJQU1nRGpZQ0VFRUlJUWdnQVVFSWRDQUhhaUVIQ3lBSVFRRnJJUWdnQjBFQmRDRUhJQVZCQVhRaUJVR0FnQUpKRFFBTElBeEZJQXdnRVJzTUFRc2dEaWdDQkFzRWZ5QUZJQVFnQ1NnQ0JFRWFka0VFY1NBSlFRUnJJZ3dvQWdCQkhIWkJBWEVnQmtFVmRrRVFjU0FHUVJsMlFjQUFjU0FMUWFvQmNYSnljbklpQzBHUXZnRnFMUUFBUVFKMGFpSU5LQUlBSWc0b0FnQWlBV3NoQlNBTFFaREFBV290QUFBaEN5QUNJQk1nRkNBTEFuOGdBU0FIUVJCMlN3UkFJQTRvQWdRaEVTQU5JQTVCQ0VFTUlBRWdCVXNpRlJ0cUtBSUFOZ0lBQTBBQ1FDQUlEUUFnQXlnQ0VDSUlRUUZxSVE0Z0NDMEFBU0VGSUFndEFBQkIvd0ZHQkVBZ0JVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dCMEdBL2dOcUlRZEJDQ0VJREFJTElBTWdEallDRUNBRlFRbDBJQWRxSVFkQkJ5RUlEQUVMSUFNZ0RqWUNFRUVJSVFnZ0JVRUlkQ0FIYWlFSEN5QUlRUUZySVFnZ0IwRUJkQ0VISUFGQkFYUWlBVUdBZ0FKSkRRQUxJQUVoQlNBUklCRkZJQlViREFFTElBY2dBVUVRZEdzaEJ5QUZRWUNBQW5GRkJFQWdEaWdDQkNFUklBMGdEa0VNUVFnZ0FTQU
20ZTeUlWRzJvb0FnQTJBZ0FEUUFKQUlBZ05BQ0FES0FJUUlnaEJBV29oRGlBSUxRQUJJUUVnQ0MwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUhRWUQrQTJvaEIwRUlJUWdNQWdzZ0F5QU9OZ0lRSUFGQkNYUWdCMm9oQjBFSElRZ01BUXNnQXlBT05nSVFRUWdoQ0NBQlFRaDBJQWRxSVFjTElBaEJBV3NoQ0NBSFFRRjBJUWNnQlVFQmRDSUZRWUNBQWtrTkFBc2dFVVVnRVNBVkd3d0JDeUFPS0FJRUN5SUJSaHMyQW9BR0lBd2dEQ2dDQUVHQWdBRnlOZ0lBSUFrZ0NTZ0NCRUdBSUhJMkFnUWdDU0FKS0FLRUFrRUVjallDaEFJZ0NTQUpLQUtNQWtFQmNqWUNqQUlnQ1NBSktBS0lBaUFCSUF0eklnRkJFblJ5UVFKeU5nS0lBaUFHSUFGQkhIUnlRWURBQUhJRklBWUxRWUNBZ0lBRWNpRUdDeUFKSUFZMkFnQUxJQWxCQkdvaEJpQUNRUVJxSVFFZ0NrRUJhaUlLUWNBQVJ3MEFDeUFKUVF4cUlRWWdBa0dFQm1vaEFTQVdRVHhKSUJaQkJHb2hGZzBBQ3dzZ0F5QUlOZ0lJSUFNZ0JUWUNCQ0FESUFjMkFnQWdBeUFOTmdKb0N3d0NDeUFqUlFSQVFRRWdHM1JCQVhZaEJ5QURLQUo4SWdSQkFuUWlDaUFES0FKNGFrRU1haUVCSUFNb0FuUWhCa0VBSVEwZ0F5Z0NnQUVpQlVFRVR3UkFJQVJGRFFRZ0JFRU1iQ0VUSUFSQkEzUWhGa0VBSUFkcklRSURRRUVBSVFVRFFBSkFJQUVpQ1NnQ0FDSUJSUTBBSUFGQmtJQ0FBWEZCRUVZRVFDQURLQUlBSVFFQ1FDQURLQUlJSWdnTkFDQUJRZjhCUmlFVUlBTW9BaEFpQ0MwQUFDRUJBa0FnRkVVRVFDQURJQUUyQWdBZ0F5QUlRUUZxTmdJUURBRUxJQUZCandGTkJFQWdBeUFCTmdJQUlBTWdDRUVCYWpZQ0VFRUhJUWdNQWd0Qi93RWhBU0FEUWY4Qk5nSUFDMEVJSVFnTElBTWdDRUVCYXlJSU5nSUlJQVlnQWlBSElBRWdDSFpCQVhFZ0JpZ0NBQ0lCUVI5MlJoc2dBV28yQWdBZ0NTQUpLQUlBUVlDQXdBQnlJZ0UyQWdBTElBRkJnSUdBQ0hGQmdBRkdCRUFnQXlnQ0FDRUJBa0FnQXlnQ0NDSUlEUUFnQVVIL0FVWWhGQ0FES0FJUUlnZ3RBQUFoQVFKQUlCUkZCRUFnQXlBQk5nSUFJQU1nQ0VFQmFqWUNFQXdCQ3lBQlFZOEJUUVJBSUFNZ0FUWUNBQ0FESUFoQkFXbzJBaEJCQnlFSURBSUxRZjhCSVFFZ0EwSC9BVFlDQUF0QkNDRUlDeUFESUFoQkFXc2lDRFlDQ0NBR0lBcHFJaFFnQWlBSElBRWdDSFpCQVhFZ0ZDZ0NBQ0lCUVI5MlJoc2dBV28yQWdBZ0NTQUpLQUlBUVlDQWdBUnlJZ0UyQWdBTElBRkJnSWlBd0FCeFFZQUlSZ1JBSUFNb0FnQWhBUUpBSUFNb0FnZ2lDQTBBSUFGQi93RkdJUlFnQXlnQ0VDSUlMUUFBSVFFQ1FDQVVSUVJBSUFNZ0FUWUNBQ0FESUFoQkFXbzJBaEFNQVFzZ0FVR1BBVTBFUUNBRElBRTJBZ0FnQXlBSVFRRnFOZ0lRUVFjaENBd0NDMEgvQVNFQklBTkIvd0UyQWdBTFFRZ2hDQXNnQXlBSVFRRnJJZ2cyQWdnZ0JpQVdhaUlVSUFJZ0J5QUJJQWgyUVFGeElCUW9BZ0FpQVVFZmRrWWJJQUZxTmdJQUlBa2dDU2dDQUVHQWdJQWdjaUlCTmdJQUN5QUJRWURBZ0lBRWNVR0F3QUJIRFFBZ0F5Z0NBQ0VCQWtBZ0F5Z0NDQ0lJRFFBZ0FVSC9BVVloRkNBREtBSVFJZ2d0QUFBaEFRSkFJQlJGQkVBZ0F5QUJOZ0lBSUFNZ0NFRUJhallDRUF3QkN5QUJRWThCVFFSQUlBTWdBVFlDQUNBRElBaEJBV28yQWhCQkJ5RUlEQUlMUWY4QklRRWdBMEgvQVRZQ0FBdEJDQ0VJQ3lBRElBaEJBV3NpQ0RZQ0NDQUdJQk5xSWhRZ0FpQUhJQUVnQ0
20haQkFYRWdGQ2dDQUNJQlFSOTJSaHNnQVdvMkFnQWdDU0FKS0FJQVFZQ0FnSUFDY2pZQ0FBc2dCa0VFYWlFR0lBbEJCR29oQVNBRlFRRnFJZ1VnQkVjTkFBc2dCaUFUYWlFR0lBbEJER29oQVNBTlFRUnFJZzBnQXlnQ2dBRWlCVUY4Y1VrTkFBc0xJQVVnRFUwTkFpQUVSUTBDUVFBaENrRUFJQWRySVJZZ0JTRUpBMEFDUUNBSklBMUdCRUFnRFNFSkRBRUxJQUVvQWdBaENFRUFJUUlEUUVHUWdJQUJJQUpCQTJ3aUNYUWdDSEZCRUNBSmRFWUVRQ0FHSUFJZ0JHeEJBblJxSVFnZ0F5Z0NBQ0VGQWtBZ0F5Z0NDQ0lURFFBZ0JVSC9BVWNoRkNBREtBSVFJaE10QUFBaEJRSkFJQlJGQkVBZ0JVR1FBVThFUUVIL0FTRUZJQU5CL3dFMkFnQU1BZ3NnQXlBRk5nSUFJQU1nRTBFQmFqWUNFRUVISVJNTUFnc2dBeUFGTmdJQUlBTWdFMEVCYWpZQ0VBdEJDQ0VUQ3lBRElCTkJBV3NpRXpZQ0NDQUlJQllnQnlBRklCTjJRUUZ4SUFnb0FnQWlCVUVmZGtZYklBVnFOZ0lBSUFFZ0FTZ0NBRUdBZ01BQUlBbDBjaUlJTmdJQUlBTW9Bb0FCSVFVTElBVWhDU0FDUVFGcUlnSWdCU0FOYTBrTkFBc0xJQVpCQkdvaEJpQUJRUVJxSVFFZ0NrRUJhaUlLSUFSSERRQUxEQUlMSUFNb0FuZ2hDQ0FES0FKMElRa2dBeWdDZ0FFaEJRSkFJQU1vQW53aUZrSEFBRWNOQUNBRlFjQUFSdzBBSUFoQmpBSnFJUVZCQUNFV1FRQkJBU0FiZEVFQmRpSUtheUVVSUFNb0FnZ2hBaUFES0FJRUlRWWdBeWdDQUNFQklBTW9BbWdoRFFOQVFRQWhFd05BSUFraEJ5QUZJZ2dvQWdBaUNRUkFJQVVnQ1VHUWdJQUJjVUVRUmdSQUlBWWdHRUVRUVE5QkRpQUpRZThEY1JzZ0NVR0FnTUFBY1J0QkFuUnFJZzBvQWdBaUJDZ0NBQ0lGYXlFR0FuOGdCU0FCUVJCMlN3UkFJQVFvQWdRaERpQU5JQVJCQ0VFTUlBVWdCa3NpREJ0cUtBSUFOZ0lBQTBBQ1FDQUNEUUFn
20QXlnQ0VDSUNRUUZxSVFRZ0FpMEFBU0VHSUFJdEFBQkIvd0ZHQkVBZ0JrR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBVUdBL2dOcUlRRkJDQ0VDREFJTElBTWdCRFlDRUNBR1FRbDBJQUZxSVFGQkJ5RUNEQUVMSUFNZ0JEWUNFRUVJSVFJZ0JrRUlkQ0FCYWlFQkN5QUNRUUZySVFJZ0FVRUJkQ0VCSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQmlBT0lBNUZJQXdiREFFTElBRWdCVUVRZEdzaEFTQUdRWUNBQW5GRkJFQWdCQ2dDQkNFT0lBMGdCRUVNUVFnZ0JTQUdTeUlNRzJvb0FnQTJBZ0FEUUFKQUlBSU5BQ0FES0FJUUlnSkJBV29oQkNBQ0xRQUJJUVVnQWkwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUJRWUQrQTJvaEFVRUlJUUlNQWdzZ0F5QUVOZ0lRSUFWQkNYUWdBV29oQVVFSElRSU1BUXNnQXlBRU5nSVFRUWdoQWlBRlFRaDBJQUZxSVFFTElBSkJBV3NoQWlBQlFRRjBJUUVnQmtFQmRDSUdRWUNBQWtrTkFBc2dEa1VnRGlBTUd3d0JDeUFFS0FJRUN5RUZJQWNnRkNBS0lBVWdCeWdDQUNJRVFSOTJSaHNnQkdvMkFnQWdDVUdBZ01BQWNpRUpDeUFKUVlDQmdBaHhRWUFCUmdSQUlBWWdHRUVRUVE5QkRpQUpRZmdlY1JzZ0NVR0FnSUFFY1J0QkFuUnFJZzBvQWdBaUJDZ0NBQ0lGYXlFR0FuOGdCU0FCUVJCMlN3UkFJQVFvQWdRaERpQU5JQVJCQ0VFTUlBVWdCa3NpREJ0cUtBSUFOZ0lBQTBBQ1FDQUNEUUFnQXlnQ0VDSUNRUUZxSVFRZ0FpMEFBU0VHSUFJdEFBQkIvd0ZHQkVBZ0JrR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBVUdBL2dOcUlRRkJDQ0VDREFJTElBTWdCRFlDRUNBR1FRbDBJQUZxSVFGQkJ5RUNEQUVMSUFNZ0JEWUNFRUVJSVFJZ0JrRUlkQ0FCYWlFQkN5QUNRUUZySVFJZ0FVRUJkQ0VCSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQmlBT0lBNUZJQXdiREFFTElBRWdCVUVRZEdzaEFTQUdRWUNBQW5GRkJFQWdCQ2dDQkNFT0lBMGdCRUVNUVFnZ0JTQUdTeUlNRzJvb0FnQTJBZ0FEUUFKQUlBSU5BQ0FES0FJUUlnSkJBV29oQkNBQ0xRQUJJUVVnQWkwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUJRWUQrQTJvaEFVRUlJUUlNQWdzZ0F5QUVOZ0lRSUFWQkNYUWdBV29oQVVFSElRSU1BUXNnQXlBRU5nSVFRUWdoQWlBRlFRaDBJQUZxSVFFTElBSkJBV3NoQWlBQlFRRjBJUUVnQmtFQmRDSUdRWUNBQWtrTkFBc2dEa1VnRGlBTUd3d0JDeUFFS0FJRUN5RUZJQWNnRkNBS0lBVWdCeWdDZ0FJaUJFRWZka1liSUFScU5nS0FBaUFKUVlDQWdBUnlJUWtMSUFsQmdJaUF3QUJ4UVlBSVJnUkFJQVlnR0VFUVFROUJEaUFKUWNEM0FYRWJJQWxCZ0lDQUlIRWJRUUowYWlJTktBSUFJZ1FvQWdBaUJXc2hCZ0ovSUFVZ0FVRVFka3NFUUNBRUtBSUVJUTRnRFNBRVFRaEJEQ0FGSUFaTElnd2JhaWdDQURZQ0FBTkFBa0FnQWcwQUlBTW9BaEFpQWtFQmFpRUVJQUl0QUFFaEJpQUNMUUFBUWY4QlJnUkFJQVpCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFGQmdQNERhaUVCUVFnaEFnd0NDeUFESUFRMkFoQWdCa0VKZENBQmFpRUJRUWNoQWd3QkN5QURJQVEyQWhCQkNDRUNJQVpCQ0hRZ0FXb2hBUXNnQWtFQmF5RUNJQUZCQVhRaEFTQUZRUUYwSWdWQmdJQUNTUTBBQ3lBRklRWWdEaUFPUlNBTUd3d0JDeUFCSUFWQkVIUnJJUUVnQmtHQWdBSnhSUVJBSUFRb0FnUWhEaUFOSUFSQkRFRUlJQVVnQmtzaURCdHFLQUlBTmdJQUEwQUNRQ0FDRFFBZ0F5Z0NFQ0lDUVFGcUlRUWdBaTBBQVNFRklBSXRBQUJCL3dGR0JFQWdCVUdRQVU4RVFDQURJQU1vQWd4QkFXbzJBZ3dnQVVHQS9nTnFJUUZCQ0NFQ0RBSUxJQU1nQkRZQ0VDQUZRUWwwSUFGcUlRRkJCeUVDREFFTElBTWdCRFlDRUVFSUlRSWdCVUVJZENBQmFpRUJDeUFDUVFGcklRSWdBVUVCZENFQklBWkJBWFFpQmtHQWdBSkpEUUFMSUE1RklBNGdEQnNNQVFzZ0JDZ0NCQXNoQlNBSElCUWdDaUFGSUFjb0FvQUVJZ1JCSDNaR0d5QUVhallDZ0FRZ0NVR0FnSUFnY2lFSkN5QUpRWURBZ0lBRWNVR0F3QUJHQkg4Z0JpQVlRUkJCRDBFT0lBbEJnTHdQY1JzZ0NVR0FnSUNBQW5FYlFRSjBhaUlOS0FJQUlnUW9BZ0FpQldzaEJnSi9JQVVnQVVFUWRrc0VRQ0FFS0FJRUlRNGdEU0FFUVFoQkRDQUZJQVpMSWd3YmFpZ0NBRFlDQUFOQUFrQWdBZzBBSUFNb0FoQWlBa0VCYWlFRUlBSXRBQUVoQmlBQ0xRQUFRZjhCUmdSQUlBWkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUZCZ1A0RGFpRUJRUWdoQWd3Q0N5QURJQVEyQWhBZ0JrRUpkQ0FCYWlFQlFRY2hBZ3dCQ3lBRElBUTJBaEJCQ0NFQ0lBWkJDSFFnQVdvaEFRc2dBa0VCYXlFQ0lBRkJBWFFoQVNBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFGSVFZZ0RpQU9SU0FNR3d3QkN5QUJJQVZCRUhScklRRWdCa0dBZ0FKeFJRUkFJQVFvQWdRaERpQU5JQVJCREVFSUlBVWdCa3NpREJ0cUtBSUFOZ0lBQTBBQ1FDQUNEUUFn
20QXlnQ0VDSUNRUUZxSVFRZ0FpMEFBU0VGSUFJdEFBQkIvd0ZHQkVBZ0JVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBVUdBL2dOcUlRRkJDQ0VDREFJTElBTWdCRFlDRUNBRlFRbDBJQUZxSVFGQkJ5RUNEQUVMSUFNZ0JEWUNFRUVJSVFJZ0JVRUlkQ0FCYWlFQkN5QUNRUUZySVFJZ0FVRUJkQ0VCSUFaQkFYUWlCa0dBZ0FKSkRRQUxJQTVGSUE0Z0RCc01BUXNnQkNnQ0JBc2hCU0FISUJRZ0NpQUZJQWNvQW9BR0lnUkJIM1pHR3lBRWFqWUNnQVlnQ1VHQWdJQ0FBbklGSUFrTE5nSUFDeUFJUVFScUlRVWdCMEVFYWlFSklCTkJBV29pRTBIQUFFY05BQXNnQ0VFTWFpRUZJQWRCaEFacUlRa2dGa0U4U1NBV1FRUnFJUllOQUFzZ0F5QUNOZ0lJSUFNZ0JqWUNCQ0FESUFFMkFnQWdBeUFOTmdKb0RBSUxRUUVnRzNSQkFYWWhGQ0FJSUJaQkFuUWlFV3BCREdvaEJ5QURLQUlJSVFJZ0F5Z0NCQ0VHSUFNb0FnQWhBU0FES0FKb0lRMUJBQ0VFQWtBZ0JVRUVTUTBBSUJZRVFDQVdRUXhzSVF3Z0ZrRURkQ0VWUVFBZ0ZHc2hEZ05BUVFBaEV3TkFJQWNpQ2lnQ0FDSUlCRUFnQnlBSVFaQ0FnQUZ4UVJCR0JFQWdCaUFZUVJCQkQwRU9JQWhCN3dOeEd5QUlRWUNBd0FCeEcwRUNkR29pRFNnQ0FDSUhLQUlBSWdWcklRWUNmeUFGSUFGQkVIWk5CRUFnQVNBRlFSQjBheUVCSUFaQmdJQUNjUVJBSUFjb0FnUU1BZ3NnQnlnQ0JDRUxJQTBnQjBFTVFRZ2dCU0FHU3lJU0cyb29BZ0EyQWdBRFFBSkFJQUlOQUNBREtBSVFJZ0pCQVdvaEJ5QUNMUUFCSVFVZ0FpMEFBRUgvQVVjRVFDQURJQWMyQWhCQkNDRUNJQVZCQ0hRZ0FXb2hBUXdCQ3lBRlFZOEJUUVJBSUFNZ0J6WUNFQ0FGUVFsMElBRnFJUUZCQnlFQ0RBRUxJQU1nQXlnQ0RFRUJhallDRENBQlFZRCtBMm9oQVVFSUlRSUxJQUpCQVdzaEFpQUJRUUYwSVFFZ0JrRUJkQ0lHUVlDQUFra05BQXNnQzBVZ0N5QVNHd3dCQ3lBSEtBSUVJUXNnRFNBSFFRaEJEQ0FGSUFaTEloSWJhaWdDQURZQ0FBTkFBa0FnQWcwQUlBTW9BaEFpQWtFQmFpRUhJQUl0QUFFaEJpQUNMUUFBUWY4QlJ3UkFJQU1nQnpZQ0VFRUlJUUlnQmtFSWRDQUJhaUVCREFFTElBWkJqd0ZOQkVBZ0F5QUhOZ0lRSUFaQkNYUWdBV29oQVVFSElRSU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBRkJnUDREYWlFQlFRZ2hBZ3NnQWtFQmF5RUNJQUZCQVhRaEFTQUZRUUYwSWdWQmdJQUNTUTBBQ3lBRklRWWdDeUFMUlNBU0d3c2hCU0FKSUE0Z0ZDQUZJQWtvQWdBaUIwRWZka1liSUFkcU5nSUFJQWhCZ0lEQUFISWhDQXNnQ0VHQWdZQUljVUdBQVVZRVFDQUdJQmhCRUVFUFFRNGdDRUg0SG5FYklBaEJnSUNBQkhFYlFRSjBhaUlOS0FJQUlnY29BZ0FpQldzaEJnSi9JQVVnQVVFUWRrMEVRQ0FCSUFWQkVIUnJJUUVnQmtHQWdBSnhCRUFnQnlnQ0JBd0NDeUFIS0FJRUlRc2dEU0FIUVF4QkNDQUZJQVpMSWhJYmFpZ0NBRFlDQUFOQUFrQWdBZzBBSUFNb0FoQWlBa0VCYWlFSElBSXRBQUVoQlNBQ0xRQUFRZjhCUndSQUlBTWdCellDRUVFSUlRSWdCVUVJZENBQmFpRUJEQUVMSUFWQmp3Rk5CRUFnQXlBSE5nSVFJQVZCQ1hRZ0FXb2hBVUVISVFJTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFGQmdQNERhaUVCUVFnaEFnc2dBa0VCYXlFQ0lBRkJBWFFoQVNBR1FRRjBJZ1pCZ0lBQ1NRMEFDeUFMUlNBTElCSWJEQUVMSUFjb0FnUWhDeUFOSUFkQkNFRU1JQVVnQmtzaUVodHFLQUlBTmdJQUEwQUNRQ0FDRFFBZ0F5Z0NFQ0lDUVFGcUlRY2dBaTBBQVNFR0lBSXRBQUJCL3dGSEJFQWdBeUFITmdJUVFRZ2hBaUFHUVFoMElBRnFJUUVNQVFzZ0JrR1BBVTBFUUNBRElBYzJBaEFnQmtFSmRDQUJhaUVCUVFjaEFnd0JDeUFESUFNb0FneEJBV28yQWd3Z0FVR0EvZ05xSVFGQkNDRUNDeUFDUVFGcklRSWdBVUVCZENFQklBVkJBWFFpQlVHQWdBSkpEUUFMSUFVaEJpQUxJQXRGSUJJYkN5RUZJQWtnRVdvaUJ5QU9JQlFnQlNBSEtBSUFJZ2RCSDNaR0d5QUhhallDQUNBSVFZQ0FnQVJ5SVFnTElBaEJnSWlBd0FCeFFZQUlSZ1JBSUFZZ0dFRVFRUTlCRGlBSVFjRDNBWEViSUFoQmdJQ0
20FJSEViUVFKMGFpSU5LQUlBSWdjb0FnQWlCV3NoQmdKL0lBVWdBVUVRZGswRVFDQUJJQVZCRUhScklRRWdCa0dBZ0FKeEJFQWdCeWdDQkF3Q0N5QUhLQUlFSVFzZ0RTQUhRUXhCQ0NBRklBWkxJaEliYWlnQ0FEWUNBQU5BQWtBZ0FnMEFJQU1vQWhBaUFrRUJhaUVISUFJdEFBRWhCU0FDTFFBQVFmOEJSd1JBSUFNZ0J6WUNFRUVJSVFJZ0JVRUlkQ0FCYWlFQkRBRUxJQVZCandGTkJFQWdBeUFITmdJUUlBVkJDWFFnQVdvaEFVRUhJUUlNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUZCZ1A0RGFpRUJRUWdoQWdzZ0FrRUJheUVDSUFGQkFYUWhBU0FHUVFGMElnWkJnSUFDU1EwQUN5QUxSU0FMSUJJYkRBRUxJQWNvQWdRaEN5QU5JQWRCQ0VFTUlBVWdCa3NpRWh0cUtBSUFOZ0lBQTBBQ1FDQUNEUUFnQXlnQ0VDSUNRUUZxSVFjZ0FpMEFBU0VHSUFJdEFBQkIvd0ZIQkVBZ0F5QUhOZ0lRUVFnaEFpQUdRUWgwSUFGcUlRRU1BUXNnQmtHUEFVMEVRQ0FESUFjMkFoQWdCa0VKZENBQmFpRUJRUWNoQWd3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQVVHQS9nTnFJUUZCQ0NFQ0N5QUNRUUZySVFJZ0FVRUJkQ0VCSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQmlBTElBdEZJQkliQ3lFRklBa2dGV29pQnlBT0lCUWdCU0FIS0FJQUlnZEJIM1pHR3lBSGFqWUNBQ0FJUVlDQWdDQnlJUWdMSUFoQmdNQ0FnQVJ4UVlEQUFFWUVmeUFHSUJoQkVFRVBRUTRnQ0VHQXZBOXhHeUFJUVlDQWdJQUNjUnRCQW5ScUlnMG9BZ0FpQnlnQ0FDSUZheUVHQW44Z0JTQUJRUkIyVFFSQUlBRWdCVUVRZEdzaEFTQUdRWUNBQW5FRVFDQUhLQUlFREFJTElBY29BZ1FoQ3lBTklBZEJERUVJSUFVZ0Jrc2lFaHRxS0FJQU5nSUFBMEFDUUNBQ0RRQWdBeWdDRUNJQ1FRRnFJUWNnQWkwQUFTRUZJQUl0QUFCQi93RkhCRUFnQXlBSE5nSVFRUWdoQWlBRlFRaDBJQUZxSVFFTUFRc2dCVUdQQVUwRVFDQURJQWMyQWhBZ0JVRUpkQ0FCYWlFQlFRY2hBZ3dCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBVUdBL2dOcUlRRkJDQ0VDQ3lBQ1FRRnJJUUlnQVVFQmRDRUJJQVpCQVhRaUJrR0FnQUpKRFFBTElBdEZJQXNnRWhzTUFRc2dCeWdDQkNFTElBMGdCMEVJUVF3Z0JTQUdTeUlTRzJvb0FnQTJBZ0FEUUFKQUlBSU5BQ0FES0FJUUlnSkJBV29oQnlBQ0xRQUJJUVlnQWkwQUFFSC9BVWNFUUNBRElBYzJBaEJCQ0NFQ0lBWkJDSFFnQVdvaEFRd0JDeUFHUVk4QlRRUkFJQU1nQnpZQ0VDQUdRUWwwSUFGcUlRRkJCeUVDREFFTElBTWdBeWdDREVFQmFqWUNEQ0FCUVlEK0Eyb2hBVUVJSVFJTElBSkJBV3NoQWlBQlFRRjBJUUVnQlVFQmRDSUZRWUNBQWtrTkFBc2dCU0VHSUFzZ0MwVWdFaHNMSVFVZ0NTQU1haUlISUE0Z0ZDQUZJQWNvQWdBaUIwRWZka1liSUFkcU5nSUFJQWhCZ0lDQWdBSnlCU0FJQ3pZQ0FBc2dDa0VFYWlFSElBbEJCR29oQ1NBVFFRRnFJaE1nRmtjTkFBc2dDa0VNYWlFSElBa2dER29oQ1NBRVFRUnFJZ1FnQXlnQ2dBRWlCVUY4Y1VrTkFBc01BUXRCQkNBRlFYeHhJZ2NnQjBFRVRSdEJBV3NpQjBGOGNVRUVhaUVFSUFnZ0IwRUJkRUY0Y1dwQkZHb2hCd3NnQXlBQ05nSUlJQU1nQmpZQ0JDQURJQUUyQWdBZ0F5QU5OZ0pvSUJaRkRRRWdCQ0FGVHcwQlFRQWhDa0VBSUJScklRc2dCU0VCQTBBQ1FDQUJJQVJHQkVBZ0JDRUJEQUVMSUFjb0FnQWhBa0VBSVFnRFFFR1FnSUFCSUFoQkEyd2lEWFFnQW5GQkVDQU5kRVlFUUNBSklBZ2dGbXhCQW5ScUlRNGdBeUFZUVJCQkQwRU9JQUlnRFhZaUFVSHZBM0ViSUFGQmdJREFBSEViUVFKMGFpSVROZ0pvSUFNZ0F5Z0NCQ0FUS0FJQUlnSW9BZ0FpQVdzaUJUWUNCQUovSUFFZ0F5Z0NBQ0lHUVJCMlN3UkFJQUlvQWdRaERDQURJQUUyQWdRZ0V5QUNRUWhCRENBQklBVkxJaEViYWlnQ0FEWUNBQ0FES0FJSUlRSURRQUpBSUFJTkFDQURLQUlRSWdKQkFXb2hFeUFDTFFBQklRVWdBaTBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBR1FZRCtBMm9oQmtFSUlRSU1BZ3NnQXlBVE5nSVFJQVZCQ1hRZ0Jtb2hCa0VISVFJTUFRc2dBeUFUTmdJUVFRZ2hBaUFGUVFoMElBWnFJUVlMSUFNZ0FrRUJheUlDTmdJSUlBTWdCa0VCZENJR05nSUFJQU1nQVVFQmRDSUJOZ0lFSUFGQmdJQUNTUTBBQ3lBTUlBeEZJQkViREFFTElBTWdCaUFCUVJCMGF5SUdOZ0lBSUFWQmdJQUNjVVVFUUNBQ0tBSUVJUXdnRXlBQ1FReEJDQ0FCSUFWTEloRWJhaWdDQURZQ0FDQURLQUlJSVFJRFFBSkFJQUlOQUNBREtBSVFJZ0pCQVdvaEV5QUNMUUFCSVFFZ0FpMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FHUVlEK0Eyb2hCa0VJSVFJTUFnc2dBeUFUTmdJUUlBRkJDWFFnQm1vaEJrRUhJUUlNQVFzZ0F5QVROZ0lRUVFnaEFpQUJRUWgwSUFacUlRWUxJQU1nQWtFQmF5SUNOZ0lJSUFNZ0JrRUJkQ0lHTmdJQUlBTWdCVUVCZENJRk5nSUVJQVZCZ0lBQ1NRMEFDeUFNUlNBTUlCRWJEQUVMSUFJb0FnUUxJUUVnRGlBTElCUWdBU0FPS0FJQUlnVkJIM1pHR3lBRmFqWUNBQ0FISUFjb0FnQkJnSURBQUNBTmRISWlBallDQUNBREtBS0FBU0VGQ3lBSVFRRnFJZ2dnQlNJQklBUnJTUTBBQ3dzZ0IwRUVhaUVISUFsQkJHb2hDU0FLUVFGcUlnb2dGa2NOQUFzTUFRdEJBQ0VSUVFBaEZBSkFBa0FDUUFKQUlBTW9BbndpRmtIQUFFY05BQ0FES0FLQUFVSEFBRWNOQUVFQVFRRWdHM1FpQVVFQmRpQUJjaUlPYXlFTUlBTkI1QUJxSVFjZ0EwSGdBR29oQ0NBRFFSeHFJUllnQXlnQ2VFR01BbW9oQmlBREtBSUlJUVFnQXlnQ0JDRUJJQU1vQWdBaEFpQURLQUpvSVFrZ0F5Z0NkQ0VGSUJkQkNIRU5BUU5BUVFBaEZRTkFJQVVoRXdKQUFrQUNmeUFHSWcwb0FnQWlCa1VFUUNBQklBZ29BZ0FpQlNnQ0FDSUdheUVCQW44Z0JpQUNRUkIyU3dSQUlBVW9BZ1FoQ1NBSUlBVkJDRUVNSUFFZ0Jra2lDaHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRlFRRnFJUVFnQlMwQUFTRUJJQVV0QUFCQi93RkdCRUFnQVVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVEQUlMSUFNZ0JEWUNFQ0FCUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQkRZQ0VFRUlJUVFnQVVFSWRDQUNhaUVDQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FKSUFsRklBb2JEQUVMSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkZGQkVBZ0JTZ0NCQ0VKSUFnZ0JVRU1RUWdnQVNBR1NTSUtHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdaQkFXb2hCQ0FHTF
20FBQklRVWdCaTBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBRU5nSVFJQVZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFFTmdJUVFRZ2hCQ0FGUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdBVUVCZENJQlFZQ0FBa2tOQUFzZ0NVVWdDU0FLR3d3QkN5QUZLQUlFQzBVRVFDQUlJUWtNQkFzZ0FTQUhLQUlBSWdVb0FnQWlCbXNoQVFKL0lBWWdBa0VRZGtzRVFDQUZLQUlFSVFrZ0J5QUZRUWhCRENBQklBWkpJZ3NiYWlnQ0FDSUZOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VCSUFRdEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0NqWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFaQkFYUWlCa0dBZ0FKSkRRQUxJQVloQVNBSklBbEZJQXNiREFFTElBSWdCa0VRZEdzaEFpQUJRWUNBQW5GRkJFQWdCU2dDQkNFSklBY2dCVUVNUVFnZ0FTQUdTU0lMRzJvb0FnQWlCVFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQmlBRUxRQUFRZjhCUmdSQUlBWkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQW8yQWhBZ0JrRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBbzJBaEJCQ0NFRUlBWkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFKUlNBSklBc2JEQUVMSUFVb0FnUUxJUW9nQVNBRktBSUFJZ1pySVFFQ2Z5QUdJQUpCRUhaTEJFQWdCU2dDQkNFSklBY2dCVUVJUVF3Z0FTQUdTU0lMRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnVkJBV29oQkNBRkxRQUJJUUVnQlMwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUVOZ0lRSUFGQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBRU5nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQmtFQmRDSUdRWUNBQWtrTkFBc2dCaUVCSUFrZ0NVVWdDeHNNQVFzZ0FpQUdRUkIwYXlFQ0lBRkJnSUFDY1VVRVFDQUZLQUlFSVFrZ0J5QUZRUXhCQ0NBQklBWkpJZ3NiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJrRUJhaUVFSUFZdEFBRWhCU0FHTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBUTJBaEFnQlVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFRMkFoQkJDQ0VFSUFWQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUpSU0FKSUFzYkRBRUxJQVVvQWdRTElRVkJBQ0VHSUFjaENRSkFBa0FDUUFKL0FrQUNRQ0FGSUFwQkFYUnlEZ1FBQVFNRkNBc2dBU0FXSUEwb0FnUkJFWFpCQkhFZ0RVRUVheUlKS0FJQVFSTjJRUUZ4Y2lJUlFaQytBV290QUFCQkFuUnFJZ29vQWdBaUJTZ0NBQ0lHYXlFQkFuOGdCaUFDUVJCMlN3UkFJQVVvQWdRaEN5QUtJQVZCQ0VFTUlBRWdCa2tpQ2h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUZRUUZxSVFRZ0JTMEFBU0VCSUFVdEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdCRFlDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0JEWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFaQkFYUWlCa0dBZ0FKSkRRQUxJQVloQVNBTElBdEZJQW9iREFFTElBSWdCa0VRZEdzaEFpQUJRWUNBQW5GRkJFQWdCU2dDQkNFTElBb2dCVUVNUVFnZ0FTQUdTU0lLRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnWkJBV29oQkNBR0xRQUJJUVVnQmkwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUVOZ0lRSUFWQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBRU5nSVFRUWdoQkNBRlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDMFVnQ3lBS0d3d0JDeUFGS0FJRUN5RUZJQk1nRGlBTUlBVWdFVUdRd0FGcUxRQUFJZ1pHR3pZQ0FDQUpJQWtvQWdCQklISTJBZ0FnRFNBTktBSUVRUWh5TmdJRUlBMUJqQUpySWdrZ0NTZ0NBRUdBZ0FoeU5nSUFJQTFCaEFKcklna2dDU2dDQUVHQWdBSnlOZ0lBSUExQmlBSnJJZ2tnQ1NnQ0FDQUZJQVp6SWdWQkgzUnlRWUNBQkhJMkFnQWdCVUVUZENBQklCWWdBeWdDYkMwQUFrRUNkR29pQ1NnQ0FDSUZLQUlBSWdacklRRUNmeUFHSUFKQkVIWkxCRUFnQlNnQ0JDRUtJQWtnQlVFSVFRd2dBU0FHU1NJUkcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1ZCQVdvaENTQUZMUUFCSVFFZ0JTMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFKTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUpOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JrRUJkQ0lHUVlDQUFra05BQXNnQmlFQklBb2dDa1VnRVJzTUFRc2dBaUFHUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FGS0FJRUlRb2dDU0FGUVF4QkNDQUJJQVpKSWhFYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCa0VCYWlFSklBWXRBQUVoQlNBR0xRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQWsyQWhBZ0JVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBazJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFLUlNBS0lCRWJEQUVMSUFVb0FnUUxJUVZCRUhJaUJpQUZSUTBCR2dzZ0FTQVdJQTBvQWdSQkZIWkJCSEVnRFVFRWF5SUtLQUlBUVJaMlFRRnhJQVpCRDNaQkVIRWdCa0VUZGtIQUFIRWdCa0VEZGtHcUFYRnljbkp5SWhKQmtMNEJhaTBBQUVFQ2RHb2lDeWdDQUNJSktBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTEJFQWdDU2dDQkNFUklBc2dDVUVJUVF3Z0FTQUZTU0lMRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnbEJBV29oQkNBSkxRQUJJUUVnQ1MwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUVOZ0lRSUFGQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBRU5nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQlVFQmRDSU
20ZRWUNBQWtrTkFBc2dCU0VCSUJFZ0VVVWdDeHNNQVFzZ0FpQUZRUkIwYXlFQ0lBRkJnSUFDY1VVRVFDQUpLQUlFSVJFZ0N5QUpRUXhCQ0NBQklBVkpJZ3NiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUNVRUJhaUVFSUFrdEFBRWhCU0FKTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBUTJBaEFnQlVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFRMkFoQkJDQ0VFSUFWQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QVJSU0FSSUFzYkRBRUxJQWtvQWdRTElRVWdFeUFPSUF3Z0JTQVNRWkRBQVdvdEFBQWlDVVliTmdLQUFpQUtJQW9vQWdCQmdBSnlOZ0lBSUEwZ0RTZ0NCRUhBQUhJMkFnUWdCaUFGSUFselFSWjBja0dBQVhJTElRWWdBU0FXSUFNb0Ftd2dCa0VHZGtIdkEzRnFMUUFBUVFKMGFpSUtLQUlBSWdrb0FnQWlCV3NoQVFKL0lBVWdBa0VRZGtzRVFDQUpLQUlFSVFzZ0NpQUpRUWhCRENBQklBVkpJZ29iYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUNVRUJhaUVFSUFrdEFBRWhBU0FKTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBUTJBaEFnQVVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFRMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFGUVFGMElnVkJnSUFDU1EwQUN5QUZJUUVnQ3lBTFJTQUtHd3dCQ3lBQ0lBVkJFSFJySVFJZ0FVR0FnQUp4UlFSQUlBa29BZ1FoQ3lBS0lBbEJERUVJSUFFZ0JVa2lDaHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJSlFRRnFJUVFnQ1MwQUFTRUZJQWt0QUFCQi93RkdCRUFnQlVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVEQUlMSUFNZ0JEWUNFQ0FGUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQkRZQ0VFRUlJUVFnQlVFSWRDQUNhaUVDQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQUZCQVhRaUFVR0FnQUpKRFFBTElBdEZJQXNnQ2hzTUFRc2dDU2dDQkF0RkRRRUxJQUVnRmlBTktBSUVRUmQyUVFSeElBMUJCR3NpQ2lnQ0FFRVpka0VCY1NBR1FSSjJRUkJ4SUFaQkZuWkJ3QUJ4SUFaQkJuWkJxZ0Z4Y25KeWNpSVNRWkMrQVdvdEFBQkJBblJxSWdzb0FnQWlDU2dDQUNJRmF5RUJBbjhnQlNBQ1FSQjJTd1JBSUFrb0FnUWhFU0FMSUFsQkNFRU1JQUVnQlVraUN4dHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lKUVFGcUlRUWdDUzBBQVNFQklBa3RBQUJCL3dGR0JFQWdBVUdRQVU4RVFDQURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRURBSUxJQU1nQkRZQ0VDQUJRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdCRFlDRUVFSUlRUWdBVUVJZENBQ2FpRUNDeUFFUVFGcklRUWdBa0VCZENFQ0lBVkJBWFFpQlVHQWdBSkpEUUFMSUFVaEFTQVJJQkZGSUFzYkRBRUxJQUlnQlVFUWRHc2hBaUFCUVlDQUFuRkZCRUFnQ1NnQ0JDRVJJQXNnQ1VFTVFRZ2dBU0FGU1NJTEcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ2xCQVdvaEJDQUpMUUFCSVFVZ0NTMEFBRUgvQVVZRVFDQUZRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFFTmdJUUlBVkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUVOZ0lRUVFnaEJDQUZRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0FVRUJkQ0lCUVlDQUFra05BQXNnRVVVZ0VTQUxHd3dCQ3lBSktBSUVDeUVGSUJNZ0RpQU1JQVVnRWtHUXdBRnFMUUFBSWdsR0d6WUNnQVFnQ2lBS0tBSUFRWUFRY2pZQ0FDQU5JQTBvQWdSQmdBUnlOZ0lFSUFZZ0JTQUpjMEVaZEhKQmdBaHlJUVlMSUFFZ0ZpQURLQUpzSUFaQkNYWkI3d054YWkwQUFFRUNkR29pQ1NnQ0FDSUtLQUlBSWdWcklRRUNmeUFGSUFKQkVIWkxCRUFnQ2lnQ0JDRUxJQWtnQ2tFSVFRd2dBU0FGU1NJUkcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1JCQVdvaENpQUVMUUFCSVFFZ0JDMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFLTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUtOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JVRUJkQ0lGUVlDQUFra05BQXNnQlNFQklBc2dDMFVnRVJzTUFRc2dBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FLS0FJRUlRc2dDU0FLUVF4QkNDQUJJQVZKSWhFYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQlNBRUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQW8yQWhBZ0JVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBbzJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFMUlNBTElCRWJEQUVMSUFvb0FnUUxSUTBEQ3lBQklCWWdEU2dDQkVFYWRrRUVjU0FOUVFSckloRW9BZ0JCSEhaQkFYRWdCa0VWZGtFUWNTQUdRUmwyUWNBQWNTQUdRUWwyUWFvQmNYSnljbklpQzBHUXZnRnFMUUFBUVFKMGFpSUpLQUlBSWdvb0FnQWlCV3NNQVFzQ1FDQUdRWkNBZ0FGeERRQWdBU0FXSUFNb0Ftd2dCa0h2QTNGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJXc2hBUUovSUFVZ0FrRVFka3NFUUNBS0tBSUVJUXNnQ1NBS1FRaEJEQ0FCSUFWSkloRWJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEFTQUVMUUFBUWY4QlJnUkFJQUZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdBVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQUZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUZRUUYwSWdWQmdJQUNTUTBBQ3lBRklRRWdDeUFMUlNBUkd3d0JDeUFDSUFWQkVIUnJJUUlnQVVHQWdBSnhSUVJBSUFvb0FnUWhDeUFKSUFwQkRFRUlJQUVnQlVraUVSdHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFRklBUXRBQUJCL3dGR0JFQWdCVUdRQVU4RVFDQURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRURBSUxJQU1nQ2pZQ0VDQUZRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdDallDRUVFSUlRUWdCVUVJZENBQ2FpRUNDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUF0RklBc2dFUnNNQVFzZ0NpZ0NCQXRGRFFBZ0FTQVdJQTBvQWdSQkVYWkJCSEVnRFVFRWF5SUxLQUlBUVJOMlFRRnhJQVpCRG5aQkVIRWdCa0VRZGtIQUFIRWdCa0dxQVhGeWNuSnlJaEpCa0w0QmFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUl
20nVnJJUUVDZnlBRklBSkJFSFpMQkVBZ0NpZ0NCQ0VSSUFrZ0NrRUlRUXdnQVNBRlNTSVBHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFLTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdCVUVCZENJRlFZQ0FBa2tOQUFzZ0JTRUJJQkVnRVVVZ0R4c01BUXNnQWlBRlFSQjBheUVDSUFGQmdJQUNjVVVFUUNBS0tBSUVJUkVnQ1NBS1FReEJDQ0FCSUFWSklnOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJTQUVMUUFBUWY4QlJnUkFJQVZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQVZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBUlJTQVJJQThiREFFTElBb29BZ1FMSVFVZ0V5QU9JQXdnQlNBU1FaREFBV290QUFBaUNrWWJOZ0lBSUFzZ0N5Z0NBRUVnY2pZQ0FDQU5JQTBvQWdSQkNISTJBZ1FnRFVHTUFtc2lDeUFMS0FJQVFZQ0FDSEkyQWdBZ0RVR0VBbXNpQ3lBTEtBSUFRWUNBQW5JMkFnQWdEVUdJQW1zaUN5QUxLQUlBSUFVZ0NuTWlCVUVmZEhKQmdJQUVjallDQUNBR0lBVkJFM1J5UVJCeUlRWUxBa0FnQmtHQWdZQUljUTBBSUFFZ0ZpQURLQUpzSUFaQkEzWWlFVUh2QTNGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJXc2hBUUovSUFVZ0FrRVFka3NFUUNBS0tBSUVJUXNnQ1NBS1FRaEJEQ0FCSUFWSkloSWJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEFTQUVMUUFBUWY4QlJnUkFJQUZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdBVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQUZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUZRUUYwSWdWQmdJQUNTUTBBQ3lBRklRRWdDeUFMUlNBU0d3d0JDeUFDSUFWQkVIUnJJUUlnQVVHQWdBSnhSUVJBSUFvb0FnUWhDeUFKSUFwQkRFRUlJQUVnQlVraUVodHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFRklBUXRBQUJCL3dGR0JFQWdCVUdRQVU4RVFDQURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRURBSUxJQU1nQ2pZQ0VDQUZRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdDallDRUVFSUlRUWdCVUVJZENBQ2FpRUNDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUF0RklBc2dFaHNNQVFzZ0NpZ0NCQXRGRFFBZ0FTQVdJQTBvQWdSQkZIWkJCSEVnRFVFRWF5SUxLQUlBUVJaMlFRRnhJQVpCRDNaQkVIRWdCa0VUZGtIQUFIRWdFVUdxQVhGeWNuSnlJaEpCa0w0QmFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUlnVnJJUUVDZnlBRklBSkJFSFpMQkVBZ0NpZ0NCQ0VSSUFrZ0NrRUlRUXdnQVNBRlNTSVBHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFLTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdCVUVCZENJRlFZQ0FBa2tOQUFzZ0JTRUJJQkVnRVVVZ0R4c01BUXNnQWlBRlFSQjBheUVDSUFGQmdJQUNjVVVFUUNBS0tBSUVJUkVnQ1NBS1FReEJDQ0FCSUFWSklnOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJTQUVMUUFBUWY4QlJnUkFJQVZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQVZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBUlJTQVJJQThiREFFTElBb29BZ1FMSVFVZ0V5QU9JQXdnQlNBU1FaREFBV290QUFBaUNrWWJOZ0tBQWlBTElBc29BZ0JCZ0FKeU5nSUFJQTBnRFNnQ0JFSEFBSEkyQWdRZ0JpQUZJQXB6UVJaMGNrR0FBWEloQmdzQ1FDQUdRWUNJZ01BQWNRMEFJQUVnRmlBREtBSnNJQVpCQm5ZaUVVSHZBM0ZxTFFBQVFRSjBhaUlKS0FJQUlnb29BZ0FpQldzaEFRSi9JQVVnQWtFUWRrc0VRQ0FLS0FJRUlRc2dDU0FLUVFoQkRDQUJJQVZKSWhJYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQVNBRUxRQUFRZjhCUmdSQUlBRkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBbzJBaEJCQ0NFRUlBRkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFGSVFFZ0N5QUxSU0FTR3d3QkN5QUNJQVZCRUhScklRSWdBVUdBZ0FKeFJRUkFJQW9vQWdRaEN5QUpJQXBCREVFSUlBRWdCVWtpRWh0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VGSUFRdEFBQkIvd0ZHQkVBZ0JVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdDallDRUNBRlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0NqWUNFRUVJSVFRZ0JVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQXRGSUFzZ0Voc01BUXNnQ2lnQ0JBdEZEUUFnQVNBV0lBMG9BZ1JCRjNaQkJIRWdEVUVFYXlJTEtBSUFRUmwyUVFGeElBWkJFblpCRUhFZ0JrRVdka0hBQUhFZ0VVR3FBWEZ5Y25KeUloSkJrTDRCYWkwQUFFRUNkR29pQ1NnQ0FDSUtLQUlBSWdWcklRRUNmeUFGSUFKQkVIWkxCRUFnQ2lnQ0JDRVJJQWtnQ2tFSVFRd2dBU0FGU1NJUEcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1JCQVdvaENpQUVMUUFCSVFFZ0JDMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFLTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUtOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JVRUJkQ0lGUVlDQUFra05BQXNnQlNFQklCRWdFVVVnRHhzTUFRc2dBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FLS0FJRUlSRWdDU0FLUVF4QkNDQUJJQVZKSWc4YmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQlNBRUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQW8yQWhBZ0JVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBbzJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFSUlNBUklBOGJEQUVMSUFvb0FnUUxJUVVnRXlBT0lBd2dCU0FTUVpEQUFXb3RBQUFpQ2tZYk5nS0FCQ0FMSUFzb0FnQkJnQkJ5TmdJQUlBMGdEU2dDQkVHQUJISTJBZ1FnQmlBRklBcHpRUmwwY2tHQUNISWhCZ3NnQmtHQXdJQ0FCSEVOQVNBQklCWWdBeWdDYkNBR1FRbDJJaEpCN3dOeGFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUl
20nVnJJUUVDZnlBRklBSkJFSFpMQkVBZ0NpZ0NCQ0VMSUFrZ0NrRUlRUXdnQVNBRlNTSVJHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFLTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdCVUVCZENJRlFZQ0FBa2tOQUFzZ0JTRUJJQXNnQzBVZ0VSc01BUXNnQWlBRlFSQjBheUVDSUFGQmdJQUNjVVVFUUNBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFWSkloRWJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJTQUVMUUFBUWY4QlJnUkFJQVZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQVZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQkViREFFTElBb29BZ1FMUlEwQklBRWdGaUFOS0FJRVFScDJRUVJ4SUExQkJHc2lFU2dDQUVFY2RrRUJjU0FHUVJWMlFSQnhJQVpCR1haQndBQnhJQkpCcWdGeGNuSnljaUlMUVpDK0FXb3RBQUJCQW5ScUlna29BZ0FpQ2lnQ0FDSUZhd3NoQVFKL0lBVWdBa0VRZGtzRVFDQUtLQUlFSVJJZ0NTQUtRUWhCRENBQklBVkpJZzhiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhBU0FFTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBbzJBaEFnQVVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFGUVFGMElnVkJnSUFDU1EwQUN5QUZJUUVnRWlBU1JTQVBHd3dCQ3lBQ0lBVkJFSFJySVFJZ0FVR0FnQUp4UlFSQUlBb29BZ1FoRWlBSklBcEJERUVJSUFFZ0JVa2lEeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUZJQVF0QUFCQi93RkdCRUFnQlVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVEQUlMSUFNZ0NqWUNFQ0FGUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQ2pZQ0VFRUlJUVFnQlVFSWRDQUNhaUVDQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQUZCQVhRaUFVR0FnQUpKRFFBTElCSkZJQklnRHhzTUFRc2dDaWdDQkFzaEJTQVRJQTRnRENBRklBdEJrTUFCYWkwQUFDSUtSaHMyQW9BR0lCRWdFU2dDQUVHQWdBRnlOZ0lBSUEwZ0RTZ0NCRUdBSUhJMkFnUWdCU0FLY3lJRlFSeDBJQVp5SUEwZ0RTZ0NoQUpCQkhJMkFvUUNJQTBnRFNnQ2pBSkJBWEkyQW93Q0lBMGdEU2dDaUFJZ0JVRVNkSEpCQW5JMkFvZ0NRWURBQUhJaEJnc2dEU0FHUWYvLy83WjdjVFlDQUFzZ0RVRUVhaUVHSUJOQkJHb2hCU0FWUVFGcUloVkJ3QUJIRFFBTElBMUJER29oQmlBVFFZUUdhaUVGSUJSQlBFa2dGRUVFYWlFVURRQUxEQUlMUVFFZ0czUWlBVUVCZGlBQmNpRU9JQU1vQW5naUJ5QVdRUUowYWtFTWFpRUZJQU1vQW9BQklRWWdBeWdDQ0NFRUlBTW9BZ1FoQVNBREtBSUFJUUlnQXlnQ2FDRUpJQU1vQW5RaEV5QVhRUWh4QkVBQ1FDQUdRUVJKRFFBZ0ZnUkFJQU5CNUFCcUlRZ2dBMEhnQUdvaERTQVdRUXhzSVNRZ0ZrRURkQ0VjUVFBZ0Rtc2hGU0FEUVJ4cUlRd0RRRUVBSVJJRFFBSkFBa0FDZnlBRklnY29BZ0FpQlFSQUFrQWdCVUdRZ0lBQmNRMEFJQUVnRENBREtBSnNJQVZCN3dOeGFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUlnWnJJUUVDZnlBR0lBSkJFSFpOQkVBZ0FpQUdRUkIwYXlFQ0lBRkJnSUFDY1FSQUlBb29BZ1FNQWdzZ0NpZ0NCQ0VMSUFrZ0NrRU1RUWdnQVNBR1NTSVBHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRWWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFaQkNIUWdBbW9oQWd3QkN5QUdRWThCVFFSQUlBTWdDallDRUNBR1FRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdBVUVCZENJQlFZQ0FBa2tOQUFzZ0MwVWdDeUFQR3d3QkN5QUtLQUlFSVFzZ0NTQUtRUWhCRENBQklBWkpJZzhiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhBU0FFTFFBQVFmOEJSd1JBSUFNZ0NqWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0RBRUxJQUZCandGTkJFQWdBeUFLTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFHUVFGMElnWkJnSUFDU1EwQUN5QUdJUUVnQ3lBTFJTQVBHd3RGRFFBZ0FTQU1JQWNvQWdSQkVYWkJCSEVnQjBFRWF5SUxLQUlBUVJOMlFRRnhJQVZCRG5aQkVIRWdCVUVRZGtIQUFIRWdCVUdxQVhGeWNuSnlJaGxCa0w0QmFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUlnWnJJUUVDZnlBR0lBSkJFSFpOQkVBZ0FpQUdRUkIwYXlFQ0lBRkJnSUFDY1FSQUlBb29BZ1FNQWdzZ0NpZ0NCQ0VQSUFrZ0NrRU1RUWdnQVNBR1NTSWZHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRWWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFaQkNIUWdBbW9oQWd3QkN5QUdRWThCVFFSQUlBTWdDallDRUNBR1FRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdBVUVCZENJQlFZQ0FBa2tOQUFzZ0QwVWdEeUFmR3d3QkN5QUtLQUlFSVE4Z0NTQUtRUWhCRENBQklBWkpJaDhiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhBU0FFTFFBQVFmOEJSd1JBSUFNZ0NqWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0RBRUxJQUZCandGTkJFQWdBeUFLTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFHUVFGMElnWkJnSUFDU1EwQUN5QUdJUUVnRHlBUFJTQWZHd3NoQmlBVElBNGdGU0FHSUJsQmtNQUJhaTBBQUNJS1JoczJBZ0FnQ3lBTEtBSUFRU0J5TmdJQUlBY2dCeWdDQkVFSWNqWUNCQ0FGSUFZZ0NuTkJFM1J5UVJCeUlRVUxBa0FnQlVHQWdZQUljUTBBSUFFZ0RDQURLQUpzSUFWQkEzWWlEMEh2QTNGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFaSkloa2JhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQmtiREFFTElBb29BZ1FoQ3lBSklBcEJDRUVNSUFFZ0Jra2lHUnRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtF
20QmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FMSUF0RklCa2JDMFVOQUNBQklBd2dCeWdDQkVFVWRrRUVjU0FIUVFScklnc29BZ0JCRm5aQkFYRWdCVUVQZGtFUWNTQUZRUk4yUWNBQWNTQVBRYW9CY1hKeWNuSWlHVUdRdmdGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUThnQ1NBS1FReEJDQ0FCSUFaSkloOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBUFJTQVBJQjhiREFFTElBb29BZ1FoRHlBSklBcEJDRUVNSUFFZ0Jra2lIeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FQSUE5RklCOGJDeUVHSUJNZ0ZrRUNkR29nRGlBVklBWWdHVUdRd0FGcUxRQUFJZ3BHR3pZQ0FDQUxJQXNvQWdCQmdBSnlOZ0lBSUFjZ0J5Z0NCRUhBQUhJMkFnUWdCU0FHSUFwelFSWjBja0dBQVhJaEJRc0NRQ0FGUVlDSWdNQUFjUTBBSUFFZ0RDQURLQUpzSUFWQkJuWWlEMEh2QTNGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFaSkloa2JhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQmtiREFFTElBb29BZ1FoQ3lBSklBcEJDRUVNSUFFZ0Jra2lHUnRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FMSUF0RklCa2JDMFVOQUNBQklBd2dCeWdDQkVFWGRrRUVjU0FIUVFScklnc29BZ0JCR1haQkFYRWdCVUVTZGtFUWNTQUZRUloyUWNBQWNTQVBRYW9CY1hKeWNuSWlHVUdRdmdGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUThnQ1NBS1FReEJDQ0FCSUFaSkloOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBUFJTQVBJQjhiREFFTElBb29BZ1FoRHlBSklBcEJDRUVNSUFFZ0Jra2lIeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FQSUE5RklCOGJDeUVHSUJNZ0hHb2dEaUFWSUFZZ0dVR1F3QUZxTFFBQUlncEdHellDQUNBTElBc29BZ0JCZ0JCeU5nSUFJQWNnQnlnQ0JFR0FCSEkyQWdRZ0JTQUdJQXB6UVJsMGNrR0FDSEloQlFzZ0JVR0F3SUNBQkhFTkFpQUJJQXdnQXlnQ2JDQUZRUWwySWc5Qjd3TnhhaTBBQUVFQ2RHb2lDU2dDQUNJS0tBSUFJZ1pySVFFQ2Z5QUdJQUpCRUhaTkJFQWdBaUFHUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQW9vQWdRTUFnc2dDaWdDQkNFTElBa2dDa0VNUVFnZ0FTQUdTU0laRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnUkJBV29oQ2lBRUxRQUJJUVlnQkMwQUFFSC9BVWNFUUNBRElBbzJBaEJCQ0NFRUlBWkJDSFFnQW1vaEFnd0JDeUFHUVk4QlRRUkFJQU1nQ2pZQ0VDQUdRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDMFVnQ3lBWkd3d0JDeUFLS0FJRUlRc2dDU0FLUVFoQkRDQUJJQVpKSWhrYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQVNBRUxRQUFRZjhCUndSQUlBTWdDallDRUVFSUlRUWdBVUVJZENBQ2FpRUNEQUVMSUFGQmp3Rk5CRUFnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBR1FRRjBJZ1pCZ0lBQ1NRMEFDeUFHSVFFZ0N5QUxSU0FaR3d0RkRRSWdBU0FNSUFjb0FnUkJHblpCQkhFZ0IwRUVheUlMS0FJQVFSeDJRUUZ4SUFWQkZYWkJFSEVnQlVFWmRrSEFBSEVnRDBHcUFYRnljbkp5SWc5QmtMNEJhaTBBQUVFQ2RHb2lDU2dDQUNJS0tBSUFJZ1pyREFFTElBRWdEU2dDQUNJR0tBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTkJFQWdBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQVlvQWdRTUFnc2dCaWdDQkNFSklBMGdCa0VNUVFnZ0FTQU
20ZTU0lLRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnWkJBV29oQkNBR0xRQUJJUVVnQmkwQUFFSC9BVWNFUUNBRElBUTJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnd0JDeUFGUVk4QlRRUkFJQU1nQkRZQ0VDQUZRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDVVVnQ1NBS0d3d0JDeUFHS0FJRUlRa2dEU0FHUVFoQkRDQUJJQVZKSWdvYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCa0VCYWlFRUlBWXRBQUVoQVNBR0xRQUFRZjhCUndSQUlBTWdCRFlDRUVFSUlRUWdBVUVJZENBQ2FpRUNEQUVMSUFGQmp3Rk5CRUFnQXlBRU5nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFGSVFFZ0NTQUpSU0FLR3d0RkJFQWdEU0VKREFNTElBRWdDQ2dDQUNJR0tBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTkJFQWdBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQVlvQWdRTUFnc2dCaWdDQkNFSklBZ2dCa0VNUVFnZ0FTQUZTU0lMRzJvb0FnQWlCallDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQlNBRUxRQUFRZjhCUndSQUlBTWdDallDRUVFSUlRUWdCVUVJZENBQ2FpRUNEQUVMSUFWQmp3Rk5CRUFnQXlBS05nSVFJQVZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFKUlNBSklBc2JEQUVMSUFZb0FnUWhDU0FJSUFaQkNFRU1JQUVnQlVraUN4dHFLQUlBSWdZMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCVUVCZENJRlFZQ0FBa2tOQUFzZ0JTRUJJQWtnQ1VVZ0N4c0xJUW9nQVNBR0tBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTkJFQWdBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQVlvQWdRTUFnc2dCaWdDQkNFSklBZ2dCa0VNUVFnZ0FTQU
20ZTU0lMRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnWkJBV29oQkNBR0xRQUJJUVVnQmkwQUFFSC9BVWNFUUNBRElBUTJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnd0JDeUFGUVk4QlRRUkFJQU1nQkRZQ0VDQUZRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDVVVnQ1NBTEd3d0JDeUFHS0FJRUlRa2dDQ0FHUVFoQkRDQUJJQVZKSWdzYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCa0VCYWlFRUlBWXRBQUVoQVNBR0xRQUFRZjhCUndSQUlBTWdCRFlDRUVFSUlRUWdBVUVJZENBQ2FpRUNEQUVMSUFGQmp3Rk5CRUFnQXlBRU5nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFGSVFFZ0NTQUpSU0FMR3dzaEJrRUFJUVVnQ0NFSkFrQUNRQUpBQW44Q1FBSkFJQVlnQ2tFQmRISU9CQUFCQXdVSEN5QUJJQXdnQnlnQ0JFRVJka0VFY1NBSFFRUnJJZ2tvQWdCQkUzWkJBWEZ5SWc5QmtMNEJhaTBBQUVFQ2RHb2lDaWdDQUNJR0tBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTkJFQWdBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQVlvQWdRTUFnc2dCaWdDQkNFTElBb2dCa0VNUVFnZ0FTQUZTU0lLRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnWkJBV29oQkNBR0xRQUJJUVVnQmkwQUFFSC9BVWNFUUNBRElBUTJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnd0JDeUFGUVk4QlRRUkFJQU1nQkRZQ0VDQUZRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDMFVnQ3lBS0d3d0JDeUFHS0FJRUlRc2dDaUFHUVFoQkRDQUJJQVZKSWdvYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCa0VCYWlFRUlBWXRBQUVoQVNBR0xRQUFRZjhCUndSQUlBTWdCRFlDRUVFSUlRUWdBVUVJZENBQ2FpRUNEQUVMSUFGQmp3Rk5CRUFnQXlBRU5nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFGSVFFZ0N5QUxSU0FLR3dzaEJTQVRJQTRnRlNBRklBOUJrTUFCYWkwQUFDSUdSaHMyQWdBZ0NTQUpLQUlBUVNCeU5nSUFJQWNnQnlnQ0JFRUljallDQkNBRklBWnpRUk4wSUFFZ0RDQURLQUpzTFFBQ1FRSjBhaUlKS0FJQUlnWW9BZ0FpQldzaEFRSi9JQVVnQWtFUWRrMEVRQ0FDSUFWQkVIUnJJUUlnQVVHQWdBSnhCRUFnQmlnQ0JBd0NDeUFHS0FJRUlRb2dDU0FHUVF4QkNDQUJJQVZKSWc4YmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCa0VCYWlFSklBWXRBQUVoQlNBR0xRQUFRZjhCUndSQUlBTWdDVFlDRUVFSUlRUWdCVUVJZENBQ2FpRUNEQUVMSUFWQmp3Rk5CRUFnQXlBSk5nSVFJQVZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFLUlNBS0lBOGJEQUVMSUFZb0FnUWhDaUFKSUFaQkNFRU1JQUVnQlVraUR4dHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lHUVFGcUlRa2dCaTBBQVNFQklBWXRBQUJCL3dGSEJFQWdBeUFKTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlNQVFzZ0FVR1BBVTBFUUNBRElBazJBaEFnQVVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBVkJBWFFpQlVHQWdBSkpEUUFMSUFVaEFTQUtJQXBGSUE4YkN5RUdRUkJ5SWdVZ0JrVU5BUm9MSUFFZ0RDQUhLQUlFUVJSMlFRUnhJQWRCQkdzaUNpZ0NBRUVXZGtFQmNTQUZRUTkyUVJCeElBVkJFM1pCd0FCeElBVkJBM1pCcWdGeGNuSnljaUlaUVpDK0FXb3RBQUJCQW5ScUlnc29BZ0FpQ1NnQ0FDSUdheUVCQW44Z0JpQUNRUkIyVFFSQUlBSWdCa0VRZEdzaEFpQUJRWUNBQW5FRVFDQUpLQUlFREFJTElBa29BZ1FoRHlBTElBbEJERUVJSUFFZ0Jra2lDeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJSlFRRnFJUVFnQ1MwQUFTRUdJQWt0QUFCQi93RkhCRUFnQXlBRU5nSVFRUWdoQkNBR1FRaDBJQUpxSVFJTUFRc2dCa0dQQVUwRVFDQURJQVEyQWhBZ0JrRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQUZCQVhRaUFVR0FnQUpKRFFBTElBOUZJQThnQ3hzTUFRc2dDU2dDQkNFUElBc2dDVUVJUVF3Z0FTQUdTU0lMRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnbEJBV29oQkNBSkxRQUJJUUVnQ1MwQUFFSC9BVWNFUUNBRElBUTJBaEJCQ0NFRUlBRkJDSFFnQW1vaEFnd0JDeUFCUVk4QlRRUkFJQU1nQkRZQ0VDQUJRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQmtFQmRDSUdRWUNBQWtrTkFBc2dCaUVCSUE4Z0QwVWdDeHNMSVFZZ0V5QVdRUUowYWlBT0lCVWdCaUFaUVpEQUFXb3RBQUFpQ1VZYk5nSUFJQW9nQ2lnQ0FFR0FBbkkyQWdBZ0J5QUhLQUlFUWNBQWNqWUNCQ0FGSUFZZ0NYTkJGblJ5UVlBQmNnc2hCU0FCSUF3Z0F5Z0NiQ0FGUVFaMlFlOERjV290QUFCQkFuUnFJZ29vQWdBaUNTZ0NBQ0lHYXlFQkFuOGdCaUFDUVJCMlRRUkFJQUlnQmtFUWRHc2hBaUFCUVlDQUFuRUVRQ0FKS0FJRURBSUxJQWtvQWdRaEN5QUtJQWxCREVFSUlBRWdCa2tpQ2h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUpRUUZxSVFRZ0NTMEFBU0VHSUFrdEFBQkIvd0ZIQkVBZ0F5QUVOZ0lRUVFnaEJDQUdRUWgwSUFKcUlRSU1BUXNnQmtHUEFVMEVRQ0FESUFRMkFoQWdCa0VKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQXRGSUFzZ0Noc01BUXNnQ1NnQ0JDRUxJQW9nQ1VFSVFRd2dBU0FHU1NJS0cyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ2xCQVdvaEJDQUpMUUFCSVFFZ0NTMEFBRUgvQVVjRVFDQURJQVEyQWhCQkNDRUVJQUZCQ0hRZ0Ftb2hBZ3dCQ3lBQlFZOEJUUVJBSUFNZ0JEWUNFQ0FCUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JrRUJkQ0lHUVlDQUFra05BQXNnQmlFQklBc2dDMFVnQ2hzTFJRMEJDeUFCSUF3Z0J5Z0NCRUVYZGtFRWNTQUhRUVJySWdvb0FnQkJHWFpCQVhFZ0JVRVNka0VRY1NBRlFSWjJRY0FBY1NBRlFRWjJRYW9CY1hKeWNuSWlHVUdRdmdGcUxRQUFRUUowYWlJTEtBSUFJZ2tvQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NTZ0NC
20QXdDQ3lBSktBSUVJUThnQ3lBSlFReEJDQ0FCSUFaSklnc2JhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQ1VFQmFpRUVJQWt0QUFFaEJpQUpMUUFBUWY4QlJ3UkFJQU1nQkRZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUVOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBUFJTQVBJQXNiREFFTElBa29BZ1FoRHlBTElBbEJDRUVNSUFFZ0Jra2lDeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJSlFRRnFJUVFnQ1MwQUFTRUJJQWt0QUFCQi93RkhCRUFnQXlBRU5nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQVEyQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FQSUE5RklBc2JDeUVHSUJNZ0hHb2dEaUFWSUFZZ0dVR1F3QUZxTFFBQUlnbEdHellDQUNBS0lBb29BZ0JCZ0JCeU5nSUFJQWNnQnlnQ0JFR0FCSEkyQWdRZ0JTQUdJQWx6UVJsMGNrR0FDSEloQlFzZ0FTQU1JQU1vQW13Z0JVRUpka0h2QTNGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFaSklnOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQThiREFFTElBb29BZ1FoQ3lBSklBcEJDRUVNSUFFZ0Jra2lEeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FMSUF0RklBOGJDMFVOQWdzZ0FTQU1JQWNvQWdSQkduWkJCSEVnQjBFRWF5SUxLQUlBUVJ4MlFRRnhJQVZCRlhaQkVIRWdCVUVaZGtIQUFIRWdCVUVKZGtHcUFYRnljbkp5SWc5QmtMNEJhaTBBQUVFQ2RHb2lDU2dDQUNJS0tBSUFJZ1pyQ3lFQkFuOGdCaUFDUVJCMlRRUkFJQUlnQmtFUWRHc2hBaUFCUVlDQUFuRUVRQ0FLS0FJRURBSUxJQW9vQWdRaEdTQUpJQXBCREVFSUlBRWdCa2tpSHh0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VHSUFRdEFBQkIvd0ZIQkVBZ0F5QUtOZ0lRUVFnaEJDQUdRUWgwSUFKcUlRSU1BUXNnQmtHUEFVMEVRQ0FESUFvMkFoQWdCa0VKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQmxGSUJrZ0h4c01BUXNnQ2lnQ0JDRVpJQWtnQ2tFSVFRd2dBU0FHU1NJZkcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1JCQVdvaENpQUVMUUFCSVFFZ0JDMEFBRUgvQVVjRVFDQURJQW8yQWhCQkNDRUVJQUZCQ0hRZ0Ftb2hBZ3dCQ3lBQlFZOEJUUVJBSUFNZ0NqWUNFQ0FCUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JrRUJkQ0lHUVlDQUFra05BQXNnQmlFQklCa2dHVVVnSHhzTElRWWdFeUFrYWlBT0lCVWdCaUFQUVpEQUFXb3RBQUFpQ2tZYk5nSUFJQXNnQ3lnQ0FFR0FnQUZ5TmdJQUlBY2dCeWdDQkVHQUlISTJBZ1FnQmlBS2N5SUdRUngwSUFWeUlBTW9BbnhCQW5RZ0Iyb2lCU0FGS0FJRVF
20RUnlOZ0lFSUFVZ0JTZ0NERUVCY2pZQ0RDQUZJQVVvQWdnZ0JrRVNkSEpCQW5JMkFnaEJnTUFBY2lFRkN5QUhJQVZCLy8vL3RudHhOZ0lBQ3lBSFFRUnFJUVVnRTBFRWFpRVRJQkpCQVdvaUVpQVdSdzBBQ3lBSFFReHFJUVVnRXlBa2FpRVRJQlJCQkdvaUZDQURLQUtBQVNJR1FYeHhTUTBBQ3d3QkMwRUVJQVpCZkhFaUJTQUZRUVJORzBFQmF5SUZRWHh4UVFScUlSUWdCeUFGUVFGMFFYaHhha0VVYWlFRkN5QURJQVEyQWdnZ0F5QUJOZ0lFSUFNZ0FqWUNBQ0FESUFrMkFtZ2dGa1VOQXlBR0lCUk5EUU1EUUVFQUlRUWdGQ0FES0FLQUFVY0VRQU5BSUFNZ0JTQVRJQVFnRm14QkFuUnFJQTRnQkVFQkVHRWdCRUVCYWlJRUlBTW9Bb0FCSUJSclNRMEFDd3NnQlNBRktBSUFRZi8vLzdaN2NUWUNBQ0FUUVFScUlSTWdCVUVFYWlFRklCRkJBV29pRVNBV1J3MEFDd3dEQ3dKQUlBWkJCRWtOQUNBV0JFQWdBMEhrQUdvaENDQURRZUFBYWlFTklCWkJER3doSkNBV1FRTjBJUnhCQUNBT2F5RVZJQU5CSEdvaERBTkFRUUFoRWdOQUFrQUNRQUovSUFVaUJ5Z0NBQ0lGQkVBQ1FDQUZRWkNBZ0FGeERRQWdBU0FNSUFNb0Ftd2dCVUh2QTNGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFaSklnOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQThiREFFTElBb29BZ1FoQ3lBSklBcEJDRUVNSUFFZ0Jra2lEeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FMSUF0RklBOGJDMFVOQUNBQklBd2dCeWdDQkVFUmRrRUVjU0FIUVFScklnc29BZ0JCRTNaQkFYRWdCVUVPZGtFUWNTQUZRUkIyUWNBQWNTQUZRYW9CY1hKeWNuSWlHVUdRdmdGcUxRQUFRUUowYWlJSktBSUFJZ29vQWdBaUJtc2hBUUovSUFZZ0FrRVFkazBFUUNBQ0lBWkJFSFJySVFJZ0FVR0FnQUp4QkVBZ0NpZ0NCQXdDQ3lBS0tBSUVJUThnQ1NBS1FReEJDQ0FCSUFaSkloOGJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJpQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQmtFSWRDQUNhaUVDREFFTElBWkJqd0ZOQkVBZ0F5QUtOZ0lRSUFaQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBUFJTQVBJQjhiREFFTElBb29BZ1FoRHlBSklBcEJDRUVNSUFFZ0Jra2lIeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkhCRUFnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTUFRc2dBVUdQQVUwRVFDQURJQW8yQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVpCQVhRaUJrR0FnQUpKRFFBTElBWWhBU0FQSUE5RklCOGJDeUVLSUJNZ0RpQVZJQW9nR1VHUXdBRnFMUUFBSWc5R0d6WUNBQ0FMSUFzb0FnQkJJSEkyQWdBZ0J5QUhLQUlFUVFoeU5nSUVJQWRCZmlBREtBSjhhMEVDZEdvaUJpQUdLQUlFUVlDQUFuSTJBZ1FnQmlBR0tBSUFJQW9nRDNNaUNrRWZkSEpCZ0lBRWNqWUNBQ0FHUVFScklnWWdCaWdDQUVHQWdBaHlOZ0lBSUFVZ0NrRVRkSEpCRUhJaEJRc0NRQ0FGUVlDQmdBaHhEUUFnQVNBTUlBTW9BbXdnQlVFRGRpSVBRZThEY1dvdEFBQkJBblJxSWdrb0FnQWlDaWdDQUNJR2F5RUJBbjhnQmlBQ1FSQjJUUVJBSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkVFUUNBS0tBSUVEQUlMSUFvb0FnUWhDeUFKSUFwQkRFRUlJQUVnQmtraUdSdHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFR0lBUXRBQUJCL3dGSEJFQWdBeUFLTmdJUVFRZ2hCQ0FHUVFoMElBSnFJUUlNQVFzZ0JrR1BBVTBFUUNBRElBbzJBaEFnQmtFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUF0RklBc2dHUnNNQVFzZ0NpZ0NCQ0VMSUFrZ0NrRUlRUXdnQVNBR1NTSVpHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQXNnQzBVZ0dSc0xSUTBBSUFFZ0RDQUhLQUlFUVJSMlFRUnhJQWRCQkdzaUN5Z0NBRUVXZGtFQmNTQUZRUTkyUVJCeElBVkJFM1pCd0FCeElBOUJxZ0Z4Y25KeWNpSVpRWkMrQVdvdEFBQkJBblJxSWdrb0FnQWlDaWdDQUNJR2F5RUJBbjhnQmlBQ1FSQjJUUVJBSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkVFUUNBS0tBSUVEQUlMSUFvb0FnUWhEeUFKSUFwQkRFRUlJQUVnQmtraUh4dHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFR0lBUXRBQUJCL3dGSEJFQWdBeUFLTmdJUVFRZ2hCQ0FHUVFoMElBSnFJUUlNQVFzZ0JrR1BBVTBFUUNBRElBbzJBaEFnQmtFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUE5RklBOGdIeHNNQVFzZ0NpZ0NCQ0VQSUFrZ0NrRUlRUXdnQVNBR1NTSWZHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQThnRDBVZ0h4c0xJUVlnRXlBV1FRSjBhaUFPSUJVZ0JpQV
20pRWkRBQVdvdEFBQWlDa1liTmdJQUlBc2dDeWdDQUVHQUFuSTJBZ0FnQnlBSEtBSUVRY0FBY2pZQ0JDQUZJQVlnQ25OQkZuUnlRWUFCY2lFRkN3SkFJQVZCZ0lpQXdBQnhEUUFnQVNBTUlBTW9BbXdnQlVFR2RpSVBRZThEY1dvdEFBQkJBblJxSWdrb0FnQWlDaWdDQUNJR2F5RUJBbjhnQmlBQ1FSQjJUUVJBSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkVFUUNBS0tBSUVEQUlMSUFvb0FnUWhDeUFKSUFwQkRFRUlJQUVnQmtraUdSdHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFR0lBUXRBQUJCL3dGSEJFQWdBeUFLTmdJUVFRZ2hCQ0FHUVFoMElBSnFJUUlNQVFzZ0JrR1BBVTBFUUNBRElBbzJBaEFnQmtFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUF0RklBc2dHUnNNQVFzZ0NpZ0NCQ0VMSUFrZ0NrRUlRUXdnQVNBR1NTSVpHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQXNnQzBVZ0dSc0xSUTBBSUFFZ0RDQUhLQUlFUVJkMlFRUnhJQWRCQkdzaUN5Z0NBRUVaZGtFQmNTQUZRUkoyUVJCeElBVkJGblpCd0FCeElBOUJxZ0Z4Y25KeWNpSVpRWkMrQVdvdEFBQkJBblJxSWdrb0FnQWlDaWdDQUNJR2F5RUJBbjhnQmlBQ1FSQjJUUVJBSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkVFUUNBS0tBSUVEQUlMSUFvb0FnUWhEeUFKSUFwQkRFRUlJQUVnQmtraUh4dHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFR0lBUXRBQUJCL3dGSEJFQWdBeUFLTmdJUVFRZ2hCQ0FHUVFoMElBSnFJUUlNQVFzZ0JrR1BBVTBFUUNBRElBbzJBaEFnQmtFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUE5RklBOGdIeHNNQVFzZ0NpZ0NCQ0VQSUFrZ0NrRUlRUXdnQVNBR1NTSWZHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQThnRDBVZ0h4c0xJUVlnRXlBY2FpQU9JQlVnQmlBWlFaREFBV290QUFBaUNrWWJOZ0lBSUFzZ0N5Z0NBRUdBRUhJMkFnQWdCeUFIS0FJRVFZQUVjallDQkNBRklBWWdDbk5CR1hSeVFZQUljaUVGQ3lBRlFZREFnSUFFY1EwQ0lBRWdEQ0FES0FKc0lBVkJDWFlpRDBIdkEzRnFMUUFBUVFKMGFpSUpLQUlBSWdvb0FnQWlCbXNoQVFKL0lBWWdBa0VRZGswRVFDQUNJQVpCRUhScklRSWdBVUdBZ0FKeEJFQWdDaWdDQkF3Q0N5QUtLQUlFSVFzZ0NTQUtRUXhCQ0NBQklBWkpJaGtiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhCaUFFTFFBQVFmOEJSd1JBSUFNZ0NqWUNFRUVJSVFRZ0JrRUlkQ0FDYWlFQ0RBRUxJQVpCandGTkJFQWdBeUFLTmdJUUlBWkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUxSU0FMSUJrYkRBRUxJQW9vQWdRaEN5QUpJQXBCQ0VFTUlBRWdCa2tpR1J0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VCSUFRdEFBQkIvd0ZIQkVBZ0F5QUtOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSU1BUXNnQVVHUEFVMEVRQ0FESUFvMkFoQWdBVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFaQkFYUWlCa0dBZ0FKSkRRQUxJQVloQVNBTElBdEZJQmtiQzBVTkFpQUJJQXdnQnlnQ0JFRWFka0VFY1NBSFFRUnJJZ3NvQWdCQkhIWkJBWEVnQlVFVmRrRVFjU0FGUVJsMlFjQUFjU0FQUWFvQmNYSnljbklpRDBHUXZnRnFMUUFBUVFKMGFpSUpLQUlBSWdvb0FnQWlCbXNNQVFzZ0FTQU5LQUlBSWdZb0FnQWlCV3NoQVFKL0lBVWdBa0VRZGswRVFDQUNJQVZCRUhScklRSWdBVUdBZ0FKeEJFQWdCaWdDQkF3Q0N5QUdLQUlFSVFrZ0RTQUdRUXhCQ0NBQklBVkpJZ29iYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJrRUJhaUVFSUFZdEFBRWhCU0FHTFFBQVFmOEJSd1JBSUFNZ0JEWUNFRUVJSVFRZ0JVRUlkQ0FDYWlFQ0RBRUxJQVZCandGTkJFQWdBeUFFTmdJUUlBVkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUpSU0FKSUFvYkRBRUxJQVlvQWdRaENTQU5JQVpCQ0VFTUlBRWdCVWtpQ2h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUdRUUZxSVFRZ0JpMEFBU0VCSUFZdEFBQkIvd0ZIQkVBZ0F5QUVOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSU1BUXNnQVVHUEFVMEVRQ0FESUFRMkFoQWdBVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQVNBSklBbEZJQW9iQzBVRVFDQU5JUWtNQXdzZ0FTQUlLQUlBSWdZb0FnQWlCV3NoQVFKL0lBVWdBa0VRZGswRVFDQUNJQVZCRUhScklRSWdBVUdBZ0FKeEJFQWdCaWdDQkF3Q0N5QUdLQUlFSVFrZ0NDQUdRUXhCQ0NBQklBVkpJZ3NiYWlnQ0FDSUdOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VGSUFRdEFBQkIvd0ZIQkVBZ0F5QUtOZ0lRUVFnaEJDQUZRUWgwSUFKcUlRSU1BUXNnQlVHUEFVMEVRQ0FESUFvMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQWxGSUFrZ0N4c01BUXNnQmlnQ0JDRUpJQWdnQmtFSVFRd2dBU0FGU1NJTEcyb29BZ0FpQmpZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEFTQUVMUUFBUWY4QlJ3UkFJQU1nQ2pZQ0VFRUlJUVFnQVVFSWRDQUNhaUVDREFFTElBRkJqd0ZOQkVBZ0F5QUtOZ0lRSUFGQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXNnQkVFQmF5RUVJQUpCQVhRaEFpQUZRUUYwSWdWQmdJQUNTUTBBQ3lBRklRRWdDU0FKUlNBTEd3c2hDaUFCSUFZb0FnQWlCV3NoQVFKL0lBVWdBa0VRZGswRVFDQUNJQVZCRUhScklRSWdBVUdBZ0FKeEJFQWdCaWdDQkF3Q0N5QUdLQUlFSVFrZ0NDQUdRUXhCQ0NBQklBVkpJZ3NiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJrRUJhaUVFSUFZdEFBRWhCU0FHTFFBQVFmOEJSd1JBSUFNZ0JEWUNFRUVJSVFRZ0JVRUlkQ0FDYWlFQ0RBRUxJQVZCandGTkJFQWdBeUFFTmdJUUlBVkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUpSU0FKSUFzYkRBRUxJQVlvQWdRaENTQUlJQVpCQ0VFTUlBRWdCVWtpQ3h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUdRUUZxSVFRZ0JpMEFBU0VCSUFZdEFBQkIvd0ZIQkVBZ0F5QUVOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSU1BUXNnQVVHUEFVMEVRQ0FESUFRMkFoQWdBVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQVNBSklBbEZJQXNiQ3lFR1FRQWhCU0FJSVFrQ1FBSkFBa0FDZndKQUFrQWdCaUFLUVFGMGNnNEVBQUVEQlFjTElBRWdEQ0FIS0FJRVFSRjJRUVJ4SUFkQkJHc2lDU2dDQUVFVGRrRUJjWElpRDBHUXZnRnFMUUFBUVFKMGFpSUtLQUlBSWdZb0FnQWlCV3NoQVFKL0lBVWdBa0VRZGswRVFDQUNJQVZCRUhScklRSWdBVUdBZ0FKeEJFQWdCaWdDQkF3Q0N5QUdLQUlFSVFzZ0NpQUdRUXhCQ0NBQklBVkpJZ29iYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJrRUJhaUVFSUFZdEFBRWhCU0FHTFFBQVFmOEJSd1JBSUFNZ0JEWUNFRUVJSVFRZ0JVRUlkQ0FDYWlFQ0RBRUxJQVZCandGTkJFQWdBeUFFTmdJUUlBVkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUxSU0FMSUFvYkRBRUxJQVlvQWdRaEN5QUtJQVpCQ0VFTUlBRWdCVWtpQ2h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUdRUUZxSVFRZ0JpMEFBU0VCSUFZdEFBQkIvd0ZIQkVBZ0F5QUVOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSU1BUXNnQVVHUEFVMEVRQ0FESUFRMkFoQWdBVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQVNBTElBdEZJQW9iQ3lFR0lCTWdEaUFWSUFZZ0QwR1F3QUZxTFFBQUlncEdHellDQUNBSklBa29BZ0JCSU
20hJMkFnQWdCeUFIS0FJRVFRaHlOZ0lFSUFkQmZpQURLQUo4YTBFQ2RHb2lCU0FGS0FJRVFZQ0FBbkkyQWdRZ0JTQUZLQUlBSUFZZ0NuTWlCa0VmZEhKQmdJQUVjallDQUNBRlFRUnJJZ1VnQlNnQ0FFR0FnQWh5TmdJQUlBWkJFM1FnQVNBTUlBTW9BbXd0QUFKQkFuUnFJZ2tvQWdBaUJpZ0NBQ0lGYXlFQkFuOGdCU0FDUVJCMlRRUkFJQUlnQlVFUWRHc2hBaUFCUVlDQUFuRUVRQ0FHS0FJRURBSUxJQVlvQWdRaENpQUpJQVpCREVFSUlBRWdCVWtpRHh0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUdRUUZxSVFrZ0JpMEFBU0VGSUFZdEFBQkIvd0ZIQkVBZ0F5QUpOZ0lRUVFnaEJDQUZRUWgwSUFKcUlRSU1BUXNnQlVHUEFVMEVRQ0FESUFrMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRUN5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQXBGSUFvZ0R4c01BUXNnQmlnQ0JDRUtJQWtnQmtFSVFRd2dBU0FGU1NJUEcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1pCQVdvaENTQUdMUUFCSVFFZ0JpMEFBRUgvQVVjRVFDQURJQWsyQWhCQkNDRUVJQUZCQ0hRZ0Ftb2hBZ3dCQ3lBQlFZOEJUUVJBSUFNZ0NUWUNFQ0FCUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JVRUJkQ0lGUVlDQUFra05BQXNnQlNFQklBb2dDa1VnRHhzTElRWkJFSElpQlNBR1JRMEJHZ3NnQVNBTUlBY29BZ1JCRkhaQkJIRWdCMEVFYXlJS0tBSUFRUloyUVFGeElBVkJEM1pCRUhFZ0JVRVRka0hBQUhFZ0JVRURka0dxQVhGeWNuSnlJaGxCa0w0QmFpMEFBRUVDZEdvaUN5Z0NBQ0lKS0FJQUl
20nWnJJUUVDZnlBR0lBSkJFSFpOQkVBZ0FpQUdRUkIwYXlFQ0lBRkJnSUFDY1FSQUlBa29BZ1FNQWdzZ0NTZ0NCQ0VQSUFzZ0NVRU1RUWdnQVNBR1NTSUxHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdsQkFXb2hCQ0FKTFFBQklRWWdDUzBBQUVIL0FVY0VRQ0FESUFRMkFoQkJDQ0VFSUFaQkNIUWdBbW9oQWd3QkN5QUdRWThCVFFSQUlBTWdCRFlDRUNBR1FRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdBVUVCZENJQlFZQ0FBa2tOQUFzZ0QwVWdEeUFMR3d3QkN5QUpLQUlFSVE4Z0N5QUpRUWhCRENBQklBWkpJZ3NiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUNVRUJhaUVFSUFrdEFBRWhBU0FKTFFBQVFmOEJSd1JBSUFNZ0JEWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0RBRUxJQUZCandGTkJFQWdBeUFFTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkFzZ0JFRUJheUVFSUFKQkFYUWhBaUFHUVFGMElnWkJnSUFDU1EwQUN5QUdJUUVnRHlBUFJTQUxHd3NoQmlBVElCWkJBblJxSUE0Z0ZTQUdJQmxCa01BQmFpMEFBQ0lKUmhzMkFnQWdDaUFLS0FJQVFZQUNjallDQUNBSElBY29BZ1JCd0FCeU5nSUVJQVVnQmlBSmMwRVdkSEpCZ0FGeUN5RUZJQUVnRENBREtBSnNJQVZCQm5aQjd3TnhhaTBBQUVFQ2RHb2lDaWdDQUNJSktBSUFJZ1pySVFFQ2Z5QUdJQUpCRUhaTkJFQWdBaUFHUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQWtvQWdRTUFnc2dDU2dDQkNFTElBb2dDVUVNUVFnZ0FTQUdTU0lLRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnbEJBV29oQkNBSkxRQUJJUVlnQ1MwQUFFSC9BVWNFUUNBRElBUTJBaEJCQ0NFRUlBWkJDSFFnQW1vaEFnd0JDeUFHUVk4QlRRUkFJQU1nQkRZQ0VDQUdRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDMFVnQ3lBS0d3d0JDeUFKS0FJRUlRc2dDaUFKUVFoQkRDQUJJQVpKSWdvYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlDVUVCYWlFRUlBa3RBQUVoQVNBSkxRQUFRZjhCUndSQUlBTWdCRFlDRUVFSUlRUWdBVUVJZENBQ2FpRUNEQUVMSUFGQmp3Rk5CRUFnQXlBRU5nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBR1FRRjBJZ1pCZ0lBQ1NRMEFDeUFHSVFFZ0N5QUxSU0FLR3d0RkRRRUxJQUVnRENBSEtBSUVRUmQyUVFSeElBZEJCR3NpQ2lnQ0FFRVpka0VCY1NBRlFSSjJRUkJ4SUFWQkZuWkJ3QUJ4SUFWQkJuWkJxZ0Z4Y25KeWNpSVpRWkMrQVdvdEFBQkJBblJxSWdzb0FnQWlDU2dDQUNJR2F5RUJBbjhnQmlBQ1FSQjJUUVJBSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkVFUUNBSktBSUVEQUlMSUFrb0FnUWhEeUFMSUFsQkRFRUlJQUVnQmtraUN4dHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lKUVFGcUlRUWdDUzBBQVNFR0lBa3RBQUJCL3dGSEJFQWdBeUFFTmdJUVFRZ2hCQ0FHUVFoMElBSnFJUUlNQVFzZ0JrR1BBVTBFUUNBRElBUTJBaEFnQmtFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUE5RklBOGdDeHNNQVFzZ0NTZ0NCQ0VQSUFzZ0NVRUlRUXdnQVNBR1NTSUxHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdsQkFXb2hCQ0FKTFFBQklRRWdDUzBBQUVIL0FVY0VRQ0FESUFRMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdCRFlDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQThnRDBVZ0N4c0xJUVlnRXlBY2FpQU9JQlVnQmlBWlFaREFBV290QUFBaUNVWWJOZ0lBSUFvZ0NpZ0NBRUdBRUhJMkFnQWdCeUFIS0FJRVFZQUVjallDQkNBRklBWWdDWE5CR1hSeVFZQUljaUVGQ3lBQklBd2dBeWdDYkNBRlFRbDJRZThEY1dvdEFBQkJBblJxSWdrb0FnQWlDaWdDQUNJR2F5RUJBbjhnQmlBQ1FSQjJUUVJBSUFJZ0JrRVFkR3NoQWlBQlFZQ0FBbkVFUUNBS0tBSUVEQUlMSUFvb0FnUWhDeUFKSUFwQkRFRUlJQUVnQmtraUR4dHFLQUlBTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFR0lBUXRBQUJCL3dGSEJFQWdBeUFLTmdJUVFRZ2hCQ0FHUVFoMElBSnFJUUlNQVFzZ0JrR1BBVTBFUUNBRElBbzJBaEFnQmtFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUF0RklBc2dEeHNNQVFzZ0NpZ0NCQ0VMSUFrZ0NrRUlRUXdnQVNBR1NTSVBHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVY0VRQ0FESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWd3QkN5QUJRWThCVFFSQUlBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQXNnQzBVZ0R4c0xSUTBDQ3lBQklBd2dCeWdDQkVFYWRrRUVjU0FIUVFScklnc29BZ0JCSEhaQkFYRWdCVUVWZGtFUWNTQUZRUmwyUWNBQWNTQUZRUWwyUWFvQmNYSnljbklpRDBHUXZnRnFMUUFBUVFKMGFpSUpLQUlBSWdvb0FnQWlCbXNMSVFFQ2Z5QUdJQUpCRUhaTkJFQWdBaUFHUVJCMGF5RUNJQUZCZ0lBQ2NRUkFJQW9vQWdRTUFnc2dDaWdDQkNFWklBa2dDa0VNUVFnZ0FTQUdTU0lmRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnUkJBV29oQ2lBRUxRQUJJUVlnQkMwQUFFSC9BVWNFUUNBRElBbzJBaEJCQ0NFRUlBWkJDSFFnQW1vaEFnd0JDeUFHUVk4QlRRUkFJQU1nQ2pZQ0VDQUdRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dHVVVnR1NBZkd3d0JDeUFLS0FJRUlS
20a2dDU0FLUVFoQkRDQUJJQVpKSWg4YmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQVNBRUxRQUFRZjhCUndSQUlBTWdDallDRUVFSUlRUWdBVUVJZENBQ2FpRUNEQUVMSUFGQmp3Rk5CRUFnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBc2dCRUVCYXlFRUlBSkJBWFFoQWlBR1FRRjBJZ1pCZ0lBQ1NRMEFDeUFHSVFFZ0dTQVpSU0FmR3dzaEJpQVRJQ1JxSUE0Z0ZTQUdJQTlCa01BQmFpMEFBQ0lLUmhzMkFnQWdDeUFMS0FJQVFZQ0FBWEkyQWdBZ0J5QUhLQUlFUVlBZ2NqWUNCQ0FHSUFweklnWkJISFFnQlhJZ0F5Z0NmRUVDZENBSGFpSUZJQVVvQWdSQkJISTJBZ1FnQlNBRktBSU1RUUZ5TmdJTUlBVWdCU2dDQ0NBR1FSSjBja0VDY2pZQ0NFR0F3QUJ5SVFVTElBY2dCVUgvLy8rMmUzRTJBZ0FMSUFkQkJHb2hCU0FUUVFScUlSTWdFa0VCYWlJU0lCWkhEUUFMSUFkQkRHb2hCU0FUSUNScUlSTWdGRUVFYWlJVUlBTW9Bb0FCSWdaQmZIRkpEUUFMREFFTFFRUWdCa0Y4Y1NJRklBVkJCRTBiUVFGcklnVkJmSEZCQkdvaEZDQUhJQVZCQVhSQmVIRnFRUlJxSVFVTElBTWdCRFlDQ0NBRElBRTJBZ1FnQXlBQ05nSUFJQU1nQ1RZQ2FDQVdSUTBDSUFZZ0ZFME5BZ05BUVFBaEJDQVVJQU1vQW9BQlJ3UkFBMEFnQXlBRklCTWdCQ0FXYkVFQ2RHb2dEaUFFUVFBUVlTQUVRUUZxSWdRZ0F5Z0NnQUVnRkd0SkRRQUxDeUFGSUFVb0FnQkIvLy8vdG50eE5nSUFJQk5CQkdvaEV5QUZRUVJxSVFVZ0VVRUJhaUlSSUJaSERRQUxEQUlMQTBCQkFDRVZBMEFnQlNFVEFrQUNRQUovSUFZaURTZ0NBQ0lHUlFSQUlBRWdDQ2dDQUNJRktBSUFJZ1pySVFFQ2Z5QUdJQUpCRUhaTEJFQWdCU2dDQkNFSklBZ2dCVUVJUVF3Z0FTQUdTU0lLRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnVkJBV29oQkNBRkxRQUJJUUVnQlMwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUVOZ0lRSUFGQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBRU5nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQmtFQmRDSUdRWUNBQWtrTkFBc2dCaUVCSUFrZ0NVVWdDaHNNQVFzZ0FpQUdRUkIwYXlFQ0lBRkJnSUFDY1VVRVFDQUZLQUlFSVFrZ0NDQUZRUXhCQ0NBQklBWkpJZ29iYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJrRUJhaUVFSUFZdEFBRWhCU0FHTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBUTJBaEFnQlVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFRMkFoQkJDQ0VFSUFWQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUpSU0FKSUFvYkRBRUxJQVVvQWdRTFJRUkFJQWdoQ1F3RUN5QUJJQWNvQWdBaUJTZ0NBQ0lHYXlFQkFuOGdCaUFDUVJCMlN3UkFJQVVvQWdRaENTQUhJQVZCQ0VFTUlBRWdCa2tpQ3h0cUtBSUFJZ1UyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1JCQVdvaENpQUVMUUFCSVFFZ0JDMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFLTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUtOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JrRUJkQ0lHUVlDQUFra05BQXNnQmlFQklBa2dDVVVnQ3hzTUFRc2dBaUFHUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FGS0FJRUlRa2dCeUFGUVF4QkNDQUJJQVpKSWdzYmFpZ0NBQ0lGTmdJQUEwQUNRQ0FFRFFBZ0F5Z0NFQ0lFUVFGcUlRb2dCQzBBQVNFR0lBUXRBQUJCL3dGR0JFQWdCa0dRQVU4RVFDQURJQU1vQWd4QkFXbzJBZ3dnQWtHQS9nTnFJUUpCQ0NFRURBSUxJQU1nQ2pZQ0VDQUdRUWwwSUFKcUlRSkJCeUVFREFFTElBTWdDallDRUVFSUlRUWdCa0VJZENBQ2FpRUNDeUFFUVFGcklRUWdBa0VCZENFQ0lBRkJBWFFpQVVHQWdBSkpEUUFMSUFsRklBa2dDeHNNQVFzZ0JTZ0NCQXNoQ2lBQklBVW9BZ0FpQm1zaEFRSi9JQVlnQWtFUWRrc0VRQ0FGS0FJRUlRa2dCeUFGUVFoQkRDQUJJQVpKSWdzYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCVUVCYWlFRUlBVXRBQUVoQVNBRkxRQUFRZjhCUmdSQUlBRkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQVEyQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBUTJBaEJCQ0NFRUlBRkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBR1FRRjBJZ1pCZ0lBQ1NRMEFDeUFHSVFFZ0NTQUpSU0FMR3d3QkN5QUNJQVpCRUhScklRSWdBVUdBZ0FKeFJRUkFJQVVvQWdRaENTQUhJQVZCREVFSUlBRWdCa2tpQ3h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUdRUUZxSVFRZ0JpMEFBU0VGSUFZdEFBQkIvd0ZHQkVBZ0JVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdCRFlDRUNBRlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0JEWUNFRUVJSVFRZ0JVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQWxGSUFrZ0N4c01BUXNnQlNnQ0JBc2hCVUVBSVFZZ0J5RUpBa0FDUUFKQUFuOENRQUpBSUFVZ0NrRUJkSElPQkFBQkF3VUlDeUFCSUJZZ0RTZ0NCRUVSZGtFRWNTQU5RUVJySWdrb0FnQkJFM1pCQVhGeUloRkJrTDRCYWkwQUFFRUNkR29pQ2lnQ0FDSUZLQUlBSWdacklRRUNmeUFHSUFKQkVIWkxCRUFnQlNnQ0JDRUxJQW9nQlVFSVFRd2dBU0FHU1NJS0cyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1ZCQVdvaEJDQUZMUUFCSVFFZ0JTMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFFTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUVOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JrRUJkQ0lHUVlDQUFra05BQXNnQmlFQklBc2dDMFVnQ2hzTUFRc2dBaUFHUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FGS0FJRUlRc2dDaUFGUVF4QkNDQUJJQVpKSWdvYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCa0VCYWlFRUlBWXRBQUVoQlNBR0xRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQVEyQWhBZ0JVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBUTJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFMUlNBTElBb2JEQUVMSUFVb0FnUUxJUVVnRXlBT0lBd2dCU0FSUVpEQUFXb3RBQUFpQmtZYk5nSUFJQWtnQ1NnQ0FFRWdjallDQUNBTklBMG9BZ1JCQ0hJMkFnUWdCU0FHYzB
vendor: 6,611 bytes, line 20
20FVGRDQUJJQllnQXlnQ2JDMEFBa0VDZEdvaUNTZ0NBQ0lGS0FJQUlnWnJJUUVDZnlBR0lBSkJFSFpMQkVBZ0JTZ0NCQ0VLSUFrZ0JVRUlRUXdnQVNBR1NTSVJHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdWQkFXb2hDU0FGTFFBQklRRWdCUzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBSk5nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFKTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdCa0VCZENJR1FZQ0FBa2tOQUFzZ0JpRUJJQW9nQ2tVZ0VSc01BUXNnQWlBR1FSQjBheUVDSUFGQmdJQUNjVVVFUUNBRktBSUVJUW9nQ1NBRlFReEJDQ0FCSUFaSkloRWJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQmtFQmFpRUpJQVl0QUFFaEJTQUdMUUFBUWY4QlJnUkFJQVZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFrMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQWsyQWhCQkNDRUVJQVZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBS1JTQUtJQkViREFFTElBVW9BZ1FMSVFWQkVISWlCaUFGUlEwQkdnc2dBU0FXSUEwb0FnUkJGSFpCQkhFZ0RVRUVheUlLS0FJQVFSWjJRUUZ4SUFaQkQzWkJFSEVnQmtFVGRrSEFBSEVnQmtFRGRrR3FBWEZ5Y25KeUloSkJrTDRCYWkwQUFFRUNkR29pQ3lnQ0FDSUpLQUlBSWdWcklRRUNmeUFGSUFKQkVIWkxCRUFnQ1NnQ0JDRVJJQXNnQ1VFSVFRd2dBU0FGU1NJTEcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ2xCQVdvaEJDQUpMUUFCSVFFZ0NTMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFFTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUVOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JVRUJkQ0lGUVlDQUFra05BQXNnQlNFQklCRWdFVVVnQ3hzTUFRc2dBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FKS0FJRUlSRWdDeUFKUVF4QkNDQUJJQVZKSWdzYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlDVUVCYWlFRUlBa3RBQUVoQlNBSkxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQVEyQWhBZ0JVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBUTJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFSUlNBUklBc2JEQUVMSUFrb0FnUUxJUVVnRXlBT0lBd2dCU0FTUVpEQUFXb3RBQUFpQ1VZYk5nS0FBaUFLSUFvb0FnQkJnQUp5TmdJQUlBMGdEU2dDQkVIQUFISTJBZ1FnQmlBRklBbHpRUlowY2tHQUFYSUxJUVlnQVNBV0lBTW9BbXdnQmtFR2RrSHZBM0ZxTFFBQVFRSjBhaUlLS0FJQUlna29BZ0FpQldzaEFRSi9JQVVnQWtFUWRrc0VRQ0FKS0FJRUlRc2dDaUFKUVFoQkRDQUJJQVZKSWdvYmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlDVUVCYWlFRUlBa3RBQUVoQVNBSkxRQUFRZjhCUmdSQUlBRkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQVEyQWhBZ0FVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBUTJBaEJCQ0NFRUlBRkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBRlFRRjBJZ1ZCZ0lBQ1NRMEFDeUFGSVFFZ0N5QUxSU0FLR3d3QkN5QUNJQVZCRUhScklRSWdBVUdBZ0FKeFJRUkFJQWtvQWdRaEN5QUtJQWxCREVFSUlBRWdCVWtpQ2h0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUpRUUZxSVFRZ0NTMEFBU0VGSUFrdEFBQkIvd0ZHQkVBZ0JVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdCRFlDRUNBRlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0JEWUNFRUVJSVFRZ0JVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFGQkFYUWlBVUdBZ0FKSkRRQUxJQXRGSUFzZ0Noc01BUXNnQ1NnQ0JBdEZEUUVMSUFFZ0ZpQU5LQUlFUVJkMlFRUnhJQTFCQkdzaUNpZ0NBRUVaZGtFQmNTQUdRUkoyUVJCeElBWkJGblpCd0FCeElBWkJCblpCcWdGeGNuSnljaUlTUVpDK0FXb3RBQUJCQW5ScUlnc29BZ0FpQ1NnQ0FDSUZheUVCQW44Z0JTQUNRUkIyU3dSQUlBa29BZ1FoRVNBTElBbEJDRUVNSUFFZ0JVa2lDeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJSlFRRnFJUVFnQ1MwQUFTRUJJQWt0QUFCQi93RkdCRUFnQVVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVEQUlMSUFNZ0JEWUNFQ0FCUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQkRZQ0VFRUlJUVFnQVVFSWRDQUNhaUVDQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVZCQVhRaUJVR0FnQUpKRFFBTElBVWhBU0FSSUJGRklBc2JEQUVMSUFJZ0JVRVFkR3NoQWlBQlFZQ0FBbkZGQkVBZ0NTZ0NCQ0VSSUFzZ0NVRU1RUWdnQVNBRlNTSUxHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdsQkFXb2hCQ0FKTFFBQklRVWdDUzBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBRU5nSVFJQVZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFFTmdJUVFRZ2hCQ0FGUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdBVUVCZENJQlFZQ0FBa2tOQUFzZ0VVVWdFU0FMR3d3QkN5QUpLQUlFQ3lFRklCTWdEaUFNSUFVZ0VrR1F3QUZxTFFBQUlnbEdHellDZ0FRZ0NpQUtLQUlBUVlBUWNqWUNBQ0FOSUEwb0FnUkJnQVJ5TmdJRUlBWWdCU0FKYzBFWmRISkJnQWh5SVFZTElBRWdGaUFES0FKc0lBWkJDWFpCN3dOeGFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUlnVnJJUUVDZnlBRklBSkJFSFpMQkVBZ0NpZ0NCQ0VMSUFrZ0NrRUlRUXdnQVNBRlNTSVJHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFLTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdCVUVCZENJRlFZQ0FBa2tOQUFzZ0JTRUJJQXNnQzBVZ0VSc01BUXNnQWlBRlFSQjBheUVDSUFGQmdJQUNjVVVFUUNBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFWSkloRWJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJTQUVMUUFBUWY4QlJnUkFJQVZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQVZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQkViREFFTElBb29BZ1FMUlEwREN5QUJJQllnRFNnQ0JFRWFka0VFY1NBTlFRUnJJaEVvQWdCQkhIWkJBWEVnQmtFVmRrRVFjU0FHUVJsMlFjQUFjU0FHUVFsMlFhb0JjWEp5Y25JaUMwR1F2Z0ZxTFFBQVFRSjBhaUlKS0FJQUlnb29BZ0FpQldzTUFRc0NRQ0FHUVpDQWdBRnhEUUFnQVNBV0lBTW9BbXdnQmtIdkEzRnFMUUFBUVFKMGFpSUpLQUlBSWdvb0FnQWlCV3NoQVFKL0lBVWdBa0VRZGtzRVFDQUtLQUlFSVFzZ0NTQUtRUWhCRENBQklBVkpJaEViYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhBU0FFTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBbzJBaEFnQVVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFvMkFoQkJDQ0VFSUFGQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFGUVFGMElnVkJnSUFDU1EwQUN5QUZJUUVnQ3lBTFJTQVJHd3dCQ3lBQ0lBVkJFSFJySVFJZ0FVR0FnQUp4UlFSQUlBb29BZ1FoQ3lBSklBcEJERUVJSUFFZ0JVa2lFUnRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUZJQVF0QUFCQi93RkdCRUFnQlVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVEQUlMSUFNZ0NqWUNFQ0FGUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQ2pZQ0VFRUlJUVFnQlVFSWRDQUNhaUVDQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQUZCQVhRaUFVR0FnQUpKRFFBTElBdEZJQXNnRVJzTUFRc2dDaWdDQkF0RkRRQWdBU0FXSUEwb0FnUkJFWFpCQkhFZ0RVRUVheUlMS0FJQVFSTjJRUUZ4SUFaQkRuWkJFSEVnQmtFUWRrSEFBSEVnQmtHcUFYRnljbkp5SWhKQmtMNEJhaTBBQUVFQ2RHb2lDU2dDQUNJS0tBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTEJFQWdDaWdDQkNFUklBa2dDa0VJUVF3Z0FTQUZTU0lQRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnUkJBV29oQ2lBRUxRQUJJUUVnQkMwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUtOZ0lRSUFGQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQlVFQmRDSUZRWUNBQWtrTkFBc2dCU0VCSUJFZ0VVVWdEeHNNQVFzZ0FpQUZRUkIwYXlFQ0lBRkJnSUFDY1VVRVFDQUtLQUlFSVJFZ0NTQUtRUXhCQ0NBQklBVkpJZzhiYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhCU0FFTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBbzJBaEFnQlVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFvMkFoQkJDQ0VFSUFWQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QVJSU0FSSUE4YkRBRUxJQW9vQWdRTElRVWdFeUFPSUF3Z0JTQVNRWkRBQVdvdEFBQWlDa1liTmdJQUlBc2dDeWdDQUVFZ2NqWUNBQ0FOSUEwb0FnUkJDSEkyQWdRZ0
20JpQUZJQXB6UVJOMGNrRVFjaUVHQ3dKQUlBWkJnSUdBQ0hFTkFDQUJJQllnQXlnQ2JDQUdRUU4ySWhGQjd3TnhhaTBBQUVFQ2RHb2lDU2dDQUNJS0tBSUFJZ1ZySVFFQ2Z5QUZJQUpCRUhaTEJFQWdDaWdDQkNFTElBa2dDa0VJUVF3Z0FTQUZTU0lTRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnUkJBV29oQ2lBRUxRQUJJUUVnQkMwQUFFSC9BVVlFUUNBQlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUtOZ0lRSUFGQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBS05nSVFRUWdoQkNBQlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQlVFQmRDSUZRWUNBQWtrTkFBc2dCU0VCSUFzZ0MwVWdFaHNNQVFzZ0FpQUZRUkIwYXlFQ0lBRkJnSUFDY1VVRVFDQUtLQUlFSVFzZ0NTQUtRUXhCQ0NBQklBVkpJaEliYWlnQ0FEWUNBQU5BQWtBZ0JBMEFJQU1vQWhBaUJFRUJhaUVLSUFRdEFBRWhCU0FFTFFBQVFmOEJSZ1JBSUFWQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBSkJnUDREYWlFQ1FRZ2hCQXdDQ3lBRElBbzJBaEFnQlVFSmRDQUNhaUVDUVFjaEJBd0JDeUFESUFvMkFoQkJDQ0VFSUFWQkNIUWdBbW9oQWdzZ0JFRUJheUVFSUFKQkFYUWhBaUFCUVFGMElnRkJnSUFDU1EwQUN5QUxSU0FMSUJJYkRBRUxJQW9vQWdRTFJRMEFJQUVnRmlBTktBSUVRUlIyUVFSeElBMUJCR3NpQ3lnQ0FFRVdka0VCY1NBR1FROTJRUkJ4SUFaQkUzWkJ3QUJ4SUJGQnFnRnhjbkp5Y2lJU1FaQytBV290QUFCQkFuUnFJZ2tvQWdBaUNpZ0NBQ0lGYXlFQkFuOGdCU0FDUVJCMlN3UkFJQW9vQWdRaEVTQUpJQXBCQ0VFTUlBRWdCVWtpRHh0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VCSUFRdEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0NqWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQVNBUklCRkZJQThiREFFTElBSWdCVUVRZEdzaEFpQUJRWUNBQW5GRkJFQWdDaWdDQkNFUklBa2dDa0VNUVFnZ0FTQU
20ZTU0lQRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnUkJBV29oQ2lBRUxRQUJJUVVnQkMwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUtOZ0lRSUFWQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBS05nSVFRUWdoQkNBRlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dFVVVnRVNBUEd3d0JDeUFLS0FJRUN5RUZJQk1nRGlBTUlBVWdFa0dRd0FGcUxRQUFJZ3BHR3pZQ2dBSWdDeUFMS0FJQVFZQUNjallDQUNBTklBMG9BZ1JCd0FCeU5nSUVJQVlnQlNBS2MwRVdkSEpCZ0FGeUlRWUxBa0FnQmtHQWlJREFBSEVOQUNBQklCWWdBeWdDYkNBR1FRWjJJaEZCN3dOeGFpMEFBRUVDZEdvaUNTZ0NBQ0lLS0FJQUlnVnJJUUVDZnlBRklBSkJFSFpMQkVBZ0NpZ0NCQ0VMSUFrZ0NrRUlRUXdnQVNBRlNTSVNHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRRWdCQzBBQUVIL0FVWUVRQ0FCUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBS05nSVFJQUZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFLTmdJUVFRZ2hCQ0FCUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdCVUVCZENJRlFZQ0FBa2tOQUFzZ0JTRUJJQXNnQzBVZ0Voc01BUXNnQWlBRlFSQjBheUVDSUFGQmdJQUNjVVVFUUNBS0tBSUVJUXNnQ1NBS1FReEJDQ0FCSUFWSkloSWJhaWdDQURZQ0FBTkFBa0FnQkEwQUlBTW9BaEFpQkVFQmFpRUtJQVF0QUFFaEJTQUVMUUFBUWY4QlJnUkFJQVZCa0FGUEJFQWdBeUFES0FJTVFRRnFOZ0lNSUFKQmdQNERhaUVDUVFnaEJBd0NDeUFESUFvMkFoQWdCVUVKZENBQ2FpRUNRUWNoQkF3QkN5QURJQW8yQWhCQkNDRUVJQVZCQ0hRZ0Ftb2hBZ3NnQkVFQmF5RUVJQUpCQVhRaEFpQUJRUUYwSWdGQmdJQUNTUTBBQ3lBTFJTQUxJQkliREFFTElBb29BZ1FMUlEwQUlBRWdGaUFOS0FJRVFSZDJRUVJ4SUExQkJHc2lDeWdDQUVFWmRrRUJjU0FHUVJKMlFSQnhJQVpCRm5aQndBQnhJQkZCcWdGeGNuSnljaUlTUVpDK0FXb3RBQUJCQW5ScUlna29BZ0FpQ2lnQ0FDSUZheUVCQW44Z0JTQUNRUkIyU3dSQUlBb29BZ1FoRVNBSklBcEJDRUVNSUFFZ0JVa2lEeHRxS0FJQU5nSUFBMEFDUUNBRURRQWdBeWdDRUNJRVFRRnFJUW9nQkMwQUFTRUJJQVF0QUFCQi93RkdCRUFnQVVHUUFVOEVRQ0FESUFNb0FneEJBV28yQWd3Z0FrR0EvZ05xSVFKQkNDRUVEQUlMSUFNZ0NqWUNFQ0FCUVFsMElBSnFJUUpCQnlFRURBRUxJQU1nQ2pZQ0VFRUlJUVFnQVVFSWRDQUNhaUVDQ3lBRVFRRnJJUVFnQWtFQmRDRUNJQVZCQVhRaUJVR0FnQUpKRFFBTElBVWhBU0FSSUJGRklBOGJEQUVMSUFJZ0JVRVFkR3NoQWlBQlFZQ0FBbkZGQkVBZ0NpZ0NCQ0VSSUFrZ0NrRU1RUWdnQVNBRlNTSVBHMm9vQWdBMkFnQURRQUpBSUFRTkFDQURLQUlRSWdSQkFXb2hDaUFFTFFBQklRVWdCQzBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBQ1FZRCtBMm9oQWtFSUlRUU1BZ3NnQXlBS05nSVFJQVZCQ1hRZ0Ftb2hBa0VISVFRTUFRc2dBeUFLTmdJUVFRZ2hCQ0FGUVFoMElBSnFJUUlMSUFSQkFXc2hCQ0FDUVFGMElRSWdBVUVCZENJQlFZQ0FBa2tOQUFzZ0VVVWdFU0FQR3d3QkN5QUtLQUlFQ3lFRklCTWdEaUFNSUFVZ0VrR1F3QUZxTFFBQUlncEdHellDZ0FRZ0N5QUxLQUlBUVlBUWNqWUNBQ0FOSUEwb0FnUkJnQVJ5TmdJRUlBWWdCU0FLYzBFWmRISkJnQWh5SVFZTElBWkJnTUNBZ0FSeERRRWdBU0FXSUFNb0Ftd2dCa0VKZGlJU1FlOERjV290QUFCQkFuUnFJZ2tvQWdBaUNpZ0NBQ0lGYXlFQkFuOGdCU0FDUVJCMlN3UkFJQW9vQWdRaEN5QUpJQXBCQ0VFTUlBRWdCVWtpRVJ0cUtBSUFOZ0lBQTBBQ1FDQUVEUUFnQXlnQ0VDSUVRUUZxSVFvZ0JDMEFBU0VCSUFRdEFBQkIvd0ZHQkVBZ0FVR1FBVThFUUNBRElBTW9BZ3hCQVdvMkFnd2dBa0dBL2dOcUlRSkJDQ0VFREFJTElBTWdDallDRUNBQlFRbDBJQUpxSVFKQkJ5RUVEQUVMSUFNZ0NqWUNFRUVJSVFRZ0FVRUlkQ0FDYWlFQ0N5QUVRUUZySVFRZ0FrRUJkQ0VDSUFWQkFYUWlCVUdBZ0FKSkRRQUxJQVVoQVNBTElBdEZJQkViREFFTElBSWdCVUVRZEdzaEFpQUJRWUNBQW5GRkJFQWdDaWdDQkNFTElBa2dDa0VNUVFnZ0FTQU
20ZTU0lSRzJvb0FnQTJBZ0FEUUFKQUlBUU5BQ0FES0FJUUlnUkJBV29oQ2lBRUxRQUJJUVVnQkMwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUNRWUQrQTJvaEFrRUlJUVFNQWdzZ0F5QUtOZ0lRSUFWQkNYUWdBbW9oQWtFSElRUU1BUXNnQXlBS05nSVFRUWdoQkNBRlFRaDBJQUpxSVFJTElBUkJBV3NoQkNBQ1FRRjBJUUlnQVVFQmRDSUJRWUNBQWtrTkFBc2dDMFVnQ3lBUkd3d0JDeUFLS0FJRUMwVU5BU0FCSUJZZ0RTZ0NCRUVhZGtFRWNTQU5RUVJySWhFb0FnQkJISFpCQVhFZ0JrRVZka0VRY1NBR1FSbDJRY0FBY1NBU1Fhb0JjWEp5Y25JaUMwR1F2Z0ZxTFFBQVFRSjBhaUlKS0FJQUlnb29BZ0FpQldzTElRRUNmeUFGSUFKQkVIWkxCRUFnQ2lnQ0JDRVNJQWtnQ2tFSVFRd2dBU0FGU1NJUEcyb29BZ0EyQWdBRFFBSkFJQVFOQUNBREtBSVFJZ1JCQVdvaENpQUVMUUFCSVFFZ0JDMEFBRUgvQVVZRVFDQUJRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FDUVlEK0Eyb2hBa0VJSVFRTUFnc2dBeUFLTmdJUUlBRkJDWFFnQW1vaEFrRUhJUVFNQVFzZ0F5QUtOZ0lRUVFnaEJDQUJRUWgwSUFKcUlRSUxJQVJCQVdzaEJDQUNRUUYwSVFJZ0JVRUJkQ0lGUVlDQUFra05BQXNnQlNFQklCSWdFa1VnRHhzTUFRc2dBaUFGUVJCMGF5RUNJQUZCZ0lBQ2NVVUVRQ0FLS0FJRUlSSWdDU0FLUVF4QkNDQUJJQVZKSWc4YmFpZ0NBRFlDQUFOQUFrQWdCQTBBSUFNb0FoQWlCRUVCYWlFS0lBUXRBQUVoQlNBRUxRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQUpCZ1A0RGFpRUNRUWdoQkF3Q0N5QURJQW8yQWhBZ0JVRUpkQ0FDYWlFQ1FRY2hCQXdCQ3lBRElBbzJBaEJCQ0NFRUlBVkJDSFFnQW1vaEFnc2dCRUVCYXlFRUlBSkJBWFFoQWlBQlFRRjBJZ0ZCZ0lBQ1NRMEFDeUFTUlNBU0lBOGJEQUVMSUFvb0FnUUxJUVVnRXlBT0lBd2dCU0FMUVpEQUFXb3RBQUFpQ2tZYk5nS0FCaUFSSUJFb0FnQkJnSUFCY2pZQ0FDQU5JQTBvQWdSQmdDQnlOZ0lFSUFVZ0NuTWlCVUVjZENBR2NpQU5JQTBvQW9RQ1FRUnlOZ0tFQWlBTklBMG9Bb3dDUVFGeU5nS01BaUFOSUEwb0FvZ0NJQVZCRW5SeVFRSnlOZ0tJQWtHQXdBQnlJUVlMSUEwZ0JrSC8vLysyZTNFMkFnQUxJQTFCQkdvaEJpQVRRUVJxSVFVZ0ZVRUJhaUlWUWNBQVJ3MEFDeUFOUVF4cUlRWWdFMEdFQm1vaEJTQVVRVHhKSUJSQkJHb2hGQTBBQ3dzZ0F5QUVOZ0lJSUFNZ0FUWUNCQ0FESUFJMkFnQWdBeUFKTmdKb0N3SkFJQmRCSUhGRkRRQWdBeUFEUWVRQWFqWUNhQ0FESUFNb0FnUWdBeWdDWkNJR0tBSUFJZ0ZySWdJMkFnUUNRQ0FCSUFNb0FnQWlCRUVRZGtzRVFDQURJQUUyQWdRZ0F5QUdRUWhCRENBQklBSkxHMm9vQWdBaUJqWUNaQ0FES0FJSUlRSURRQUpBSUFJTkFDQURLQUlRSWdsQkFXb2hBaUFKTFFBQklRVWdDUzBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBRVFZRCtBMm9oQkVFSUlRSU1BZ3NnQXlBQ05nSVFJQVZCQ1hRZ0JHb2hCRUVISVFJTUFRc2dBeUFDTmdJUVFRZ2hBaUFGUVFoMElBUnFJUVFMSUFNZ0FrRUJheUlDTmdJSUlBTWdCRUVCZENJRU5nSUFJQU1nQVVFQmRDSUJOZ0lFSUFGQmdJQUNTUTBBQ3lBQklRSU1BUXNnQXlBRUlBRkJFSFJySWdRMkFnQWdBa0dBZ0FKeERRQWdBeUFHUVF4QkNDQUJJQUpMRzJvb0FnQWlCallDWkNBREtBSUlJUUVEUUFKQUlBRU5BQ0FES0FJUUlnRkJBV29oQ1NBQkxRQUJJUVVnQVMwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUVRWUQrQTJvaEJFRUlJUUVNQWdzZ0F5QUpOZ0lRSUFWQkNYUWdCR29oQkVFSElRRU1BUXNnQXlBSk5nSVFRUWdoQVNBRlFRaDBJQVJxSVFRTElBTWdBVUVCYXlJQk5nSUlJQU1nQkVFQmRDSUVOZ0lBSUFNZ0FrRUJkQ0lDTmdJRUlBSkJnSUFDU1EwQUN3c2dBeUFDSUFZb0FnQWlBV3NpQWpZQ0JBSkFJQUVnQkVFUWRrc0VRQ0FESUFFMkFnUWdBeUFHUVFoQkRDQUJJQUpMRzJvb0FnQWlCallDWkNBREtBSUlJUUlEUUFKQUlBSU5BQ0FES0FJUUlnbEJBV29oQWlBSkxRQUJJUVVnQ1MwQUFFSC9BVVlFUUNBRlFaQUJUd1JBSUFNZ0F5Z0NERUVCYWpZQ0RDQUVRWUQrQTJvaEJFRUlJUUlNQWdzZ0F5QUNOZ0lRSUFWQkNYUWdCR29oQkVFSElRSU1BUXNnQXlBQ05nSVFRUWdoQWlBRlFRaDBJQVJxSVFRTElBTWdBa0VCYXlJQ05nSUlJQU1nQkVFQmRDSUVOZ0lBSUFNZ0FVRUJkQ0lCTmdJRUlBRkJnSUFDU1EwQUN5QUJJUUlNQVFzZ0F5QUVJQUZCRUhScklnUTJBZ0FnQWtHQWdBSnhEUUFnQXlBR1FReEJDQ0FCSUFKTEcyb29BZ0FpQmpZQ1pDQURLQUlJSVFFRFFBSkFJQUVOQUNBREtBSVFJZ0ZCQVdvaENTQUJMUUFCSVFVZ0FTMEFBRUgvQVVZRVFDQUZRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FFUVlEK0Eyb2hCRUVJSVFFTUFnc2dBeUFKTmdJUUlBVkJDWFFnQkdvaEJFRUhJUUVNQVFzZ0F5QUpOZ0lRUVFnaEFTQUZRUWgwSUFScUlRUUxJQU1nQVVFQmF5SUJOZ0lJSUFNZ0JFRUJkQ0lFTmdJQUlBTWdBa0VCZENJQ05nSUVJQUpCZ0lBQ1NRMEFDd3NnQXlBQ0lBWW9BZ0FpQVdzaUFqWUNCQUpBSUFFZ0JFRVFka3NFUUNBRElBRTJBZ1FnQXlBR1FRaEJEQ0FCSUFKTEcyb29BZ0FpQmpZQ1pDQURLQUlJSVFJRFFBSkFJQUlOQUNBREtBSVFJZ2xCQVdvaEFpQUpMUUFCSVFVZ0NTMEFBRUgvQVVZRVFDQUZRWkFCVHdSQUlBTWdBeWdDREVFQmFqWUNEQ0FFUVlEK0Eyb2hCRUVJSVFJTUFnc2dBeUFDTmdJUUlBVkJDWFFnQkdvaEJFRUhJUUlNQVFzZ0F5QUNOZ0lRUVFnaEFpQUZRUWgwSUFScUlRUUxJQU1nQWtFQmF5SUNOZ0lJSUFNZ0JFRUJkQ0lFTmdJQUlBTWdBVUVCZENJQk5nSUVJQUZCZ0lBQ1NRMEFDeUFCSVFJTUFRc2dBeUFFSUFGQkVIUnJJZ1EyQWdBZ0FrR0FnQUp4RFFBZ0F5QUdRUXhCQ0NBQklBSkxHMm9vQWdBaUJqWUNaQ0FES0FJSUlRRURRQUpBSUFFTkFDQURLQUlRSWdGQkFXb2hDU0FCTFFBQklRVWdBUzBBQUVIL0FVWUVRQ0FGUVpBQlR3UkFJQU1nQXlnQ0RFRUJhallDRENBRVFZRCtBMm9oQkVFSUlRRU1BZ3NnQXlBSk5nSVFJQVZCQ1hRZ0JHb2hCRUVISVFFTUFRc2dBeUFKTmdJUVFRZ2hBU0FGUVFoMElBUnFJUVFMSUFNZ0FVRUJheUlCTmdJSUlBTWdCRUVCZENJRU5nSUFJQU1nQWtFQmRDSUNOZ0lFSUFKQmdJQUNTUTBBQ3dzZ0F5QUNJQVlvQWdBaUFXc2lBallDQkNBQklBUkJFSFpMQkVBZ0F5QUJOZ0lFSUFNZ0JrRUlRUXdnQVNBQ1N4dHFLQUlBTmdKa0lBTW9BZ2doQWdOQUFrQWdBZzBBSUFNb0FoQWlCa0VCYWlFSklBWXRBQUVoQlNBR0xRQUFRZjhCUmdSQUlBVkJrQUZQQkVBZ0F5QURLQUlNUVFGcU5nSU1JQVJCZ1A0RGFpRUVRUWdoQWd3Q0N5QURJQWsyQWhBZ0JVRUpkQ0FFYWlFRVFRY2hBZ3dCQ3lBRElBazJBaEJCQ0NFQ0lBVkJDSFFnQkdvaEJBc2dBeUFDUVFGcklnSTJBZ2dnQXlBRVFRRjBJZ1EyQWdBZ0F5QUJRUUYwSWdFMkFnUWdBVUdBZ0FKSkRRQUxEQUVMSUFNZ0JDQUJRUkIwYXlJRk5nSUFJQUpCZ0lBQ2NRME
20FJQU1nQmtFTVFRZ2dBU0FDU3h0cUtBSUFOZ0prSUFNb0FnZ2hCQU5BQWtBZ0JBMEFJQU1vQWhBaUJrRUJhaUVKSUFZdEFBRWhBU0FHTFFBQVFmOEJSZ1JBSUFGQmtBRlBCRUFnQXlBREtBSU1RUUZxTmdJTUlBVkJnUDREYWlFRlFRZ2hCQXdDQ3lBRElBazJBaEFnQVVFSmRDQUZhaUVGUVFjaEJBd0JDeUFESUFrMkFoQkJDQ0VFSUFGQkNIUWdCV29oQlFzZ0F5QUVRUUZySWdRMkFnZ2dBeUFGUVFGMElnVTJBZ0FnQXlBQ1FRRjBJZ0kyQWdRZ0FrR0FnQUpKRFFBTEN3c2dKMFVOQUNBREVHTWdBMEh3clFFMkFtUWdBMEdRb3dFMkFtQWdBMEd3b3dFMkFod0xRUUFnSVVFQmFpSUJJQUZCQTBZaUFSc2hJU0FiSUFGcklSc2dLVUVCYWlJcElDQW9BZ2hQRFFFZ0cwRUFTZzBBQ3dzZ0hpQXFhaUVlSUFNb0FoZ2dBeThCY0RzQUFDQW9RUUZxSWlnZ0dpZ0NMRWtOQUFzTEFrQWdLMFVOQUFKQUlBTW9BaGdpQVNBREtBSVFJZ1ZCQW1wTEJFQWdJa1VOQVNBbUlBRWdBeWdDRkNJR2F6WUNPQ0FtSUFVZ0JtczJBalFnSmlBQklBVnJRUUpyTmdJd0lCMUJBa0hlOWdBZ0prRXdhaEFUREFJTElBTW9BZ3dpQVVFRFNRMEJJQ0lFUUNBbUlBRTJBbEFnSFVFQ1FaNDNJQ1pCMEFCcUVCTU1BZ3NnSmlBQk5nSkFJQjFCQWtHZU55QW1RVUJyRUJNTUFRc2dKaUFCSUFNb0FoUWlCbXMyQWlnZ0ppQUZJQVpyTmdJa0lDWWdBU0FGYTBFQ2F6WUNJQ0FkUVFKQjN2WUFJQ1pCSUdvUUV3c2dHaWdDUEVVTkFDQURJQ3cyQW5RTElEQW9BZ1FoQVNBYUtBSU1JQm9vQWdnZ01DZ0NBR3NoRXlBd0tBSVFJZ1pCQVhFRVFDQXlLQUljSURoQm1BRnNhaUlKUVpBQmF5Z0NBQ0FUYWlBSlFaZ0JheWdDQUdzaEV3c2dBV3NoQlNBR1FRSnhCRUFnTWlnQ0hDQTRRWmdCYkdvaUFVR01BV3NvQWdBZ0JXb2dBVUdVQVdzb0FnQnJJUVVMSUJvb0Fqd2lCaUVDSUFaRkJFQWdBeWdDZENFQ0N5QURLQUtBQVNFTklBTW9BbndoQkFKQUlDOG9BcWdHSWdsRkRRQWdEVVVnQkVWeUlRRWdDVUVlVEFSQUlBRU5BVUVBSVFnRFFDQUVJQWhzSVFOQkFDRUJBMEFnQWlBQklBTnFRUUowYWlJWEtBSUFJZ2NnQjBFZmRTSUtjeUFLYXlJS0lBbDJCRUFnRjBFQUlBb2dMeWdDcUFaMkloZHJJQmNnQjBFQVNCczJBZ0FMSUFGQkFXb2lBU0FFUncwQUN5QUlRUUZxSWdnZ0RVY05BQXNNQVFzZ0FRMEFJQUpCQUNBRUlBMXNRUUowRUJrYUN5QUdCRUFnQkNBTmJDRUdJQzhvQWhSQkFVWUVRQ0FHUlEwRlFRQWhBU0FHUVFSUEJFQWdCa0Y4Y1NFQlFRQWhBd05BSUFJZ0EwRUNkR29pQlNBRi9RQUNBQ0pIL1JzQVFRSnQvUkVnUi8wYkFVRUNiZjBjQVNCSC9Sc0NRUUp0L1J3Q0lFZjlHd05CQW0zOUhBUDlDd0lBSUFOQkJHb2lBeUFCUncwQUN5QUJJQVpHRFFZTEEwQWdBaUFCUVFKMGFpSUZJQVVvQWdCQkFtMDJBZ0FnQVVFQmFpSUJJQVpIRFFBTERBVUxJQVpGRFFRZ01Db0NJRU1BQUFBL2xDRk5RUUFoQXdKQUlBWkJCRWtFUUNBQ0lRRU1BUXNnQWlBR1FYeHhJZ05CQW5ScUlRRWdUZjBUSVVkQkFDRUZBMEFnQWlBRlFRSjBhaUlKSUVjZ0NmMEFBZ0Q5K2dIOTVnSDlDd0lBSUFWQkJHb2lCU0FEUncwQUN5QURJQVpHRFFVTEEwQWdBU0JOSUFFb0FnQ3lsRGdDQUNBQlFRUnFJUUVnQTBFQmFpSURJQVpIRFFBTERBUUxJRGNnTm1zaEZ5QXZLQUlVUVFGSERRSWdEVVVOQXlBeUtBSWtJZ1lnQlNBWGJDSUZRUUowYWlBVFFRSjBhaUVISUFSQmZIRWlHMEVCYXlJQlFRUnhJUllnTnlBRUlEWnFhMEVDZENFVUlBRkJBblpCQVdwQi92Ly8vd2R4SVJvZ0JTQVRha0VDZENBR2FpQUNheUVkUVFBaEV5QUJRUU5ISVE0RFFFRUFJUUVDUUNBYlJRMEFJQVFnRTJ3aEJTQUhJQk1nRjJ4QkFuUnFJUVpCQUNFSklBNEVRQU5BSUFZZ0FVRUNkR29nQWlBQklBVnFRUUowYXYwQUFnQWlSLzBiQUVFQ2JmMFJJRWY5R3dGQkFtMzlIQUVnUi8wYkFrRUNiZjBjQWlCSC9Sc0RRUUp0L1J3RC9Rc0NBQ0FHSUFGQkJISWlDRUVDZEdvZ0FpQUZJQWhxUVFKMGF2MEFBZ0FpUi8wYkFFRUNiZjBSSUVmOUd3RkJBbTM5SEFFZ1IvMGJBa0VDYmYwY0FpQkgvUnNEUVFKdC9Sd0QvUXNDQUNBQlFRaHFJUUVnQ1VFQ2FpSUpJQnBIRFFBTEN5QVdEUUFnQmlBQlFRSjBhaUFDSUFFZ0JXcEJBblJxL1FBQ0FDSkgvUnNBUVFKdC9SRWdSLzBiQVVFQ2JmMGNBU0JIL1JzQ1FRSnQvUndDSUVmOUd3TkJBbTM5SEFQOUN3SUFJQUZCQkdvaEFRc0NRQ0FCSUFSUERRQWdCQ0FUYkNFRklBY2dFeUFYYkVFQ2RHb2hDUUpBQWtBZ0JDQUJheUlJUVFSUEJFQWdIU0FUSUJSc2FrRVBTdzBCQ3lBQklRWU1BUXNnQVNBRmFpRWlJQUVnQ0VGOGNTSUthaUVHUVFBaEF3TkFJQWtnQVNBRGFrRUNkR29nQWlBRElDSnFRUUowYXYwQUFnQWlSLzBiQUVFQ2JmMFJJRWY5R3dGQkFtMzlIQUVnUi8wYkFrRUNiZjBjQWlCSC9Sc0RRUUp0L1J3RC9Rc0NBQ0FEUVFScUlnTWdDa2NOQUFzZ0NDQUtSZzBCQ3lBR1FRRnFJUUVnQkNBR2EwRUJjUVJBSUFrZ0JrRUNkR29nQWlBRklBWnFRUUowYWlnQ0FFRUNiVFlDQUNBQklRWUxJQUVnQkVZTkFDQUZRUUZxSVFFRFFDQUpJQVpCQW5ScUlnZ2dBaUFGSUFacVFRSjBhaWdDQUVFQ2JUWUNBQ0FJSUFJZ0FTQUdha0VDZEdvb0FnQkJBbTAyQWdRZ0JrRUNhaUlHSUFSSERRQUxDeUFUUVFGcUloTWdEVWNOQUFzTUF3c2dKaUFiTmdJQUlCMUJBa0hud3dBZ0poQVRDeUFGS0FJQVFRQTJBZ0FNQVFzZ0RVVU5BQ0FFUlEwQUlESW9BaVFnQlNBWGJFRUNkR29nRTBFQ2RHb2hDU0FFUVh4eElnVkJBblFoQmlBd0tnSWdRd0FBQUQrVUlrMzlFeUZIUVFBaENDQUVRUVJKSVJNRFFBSkFBa0FnRXdSQUlBSWhCeUFKSVFGQkFDRUREQUVMSUFZZ0NXb2hBU0FDSUFacUlRZEJBQ0VEQTBBZ0NTQURRUUowSWdwcUlFY2dBaUFLYXYwQUFnRDkrZ0g5NWdIOUN3SUFJQU5CQkdvaUF5QUZSdzBBQ3lBSElRSWdCU0lESUFSR0RRRUxJQWNoQWdOQUlBRWdUU0FDS0FJQXNwUTRBZ0FnQVVFRWFpRUJJQUpCQkdvaEFpQURRUUZxSWdNZ0JFY05BQXNMSUFrZ0YwRUNkR29oQ1NBSVFRRnFJZ2dnRFVjTkFBc0xJQUFRRkNBbVFlQUFhaVFBQzlZRUFRbC9JQUFvQWl4QkNFOEVRQ0FBS0FJb0lRVkJDQ0VLQTBBZ0FDZ0NERUVGZENFSUlBQW9BZ0FoQkNBQUtBSWtJUU1DUUNBQUtBSVVJZ1lnQUNnQ0VDSUJUUTBBSUFRZ0NHb2hCeUFCUVFGcUlRSWdCaUFCYTBFQmNRUkFJQWNnQVVFR2RHb2lDU0FGSUFFZ0EyeEJBblJxSWdIOUFBSUEvUXNDQUNBSklBSDlBQUlRL1FzQ0VDQUNJUUVMSUFJZ0JrWU5BQU5BSUFjZ0FVRUdkR29pQWlBRklBRWdBMnhCQW5ScUlnbjlBQUlBL1FzQ0FDQUNJQW45QUFJUS9Rc0NFQ0FISUFGQkFXb2lBa0VHZEdvaUNTQUZJQUl
20nQTJ4QkFuUnFJZ0w5QUFJUS9Rc0NFQ0FKSUFMOUFBSUEvUXNDQUNBQlFRSnFJZ0VnQmtjTkFBc0xBa0FnQUNnQ0hDSUdJQUFvQWhnaUFVME5BQ0FFSUFoclFTQnFJUWNnQlNBQUtBSUlJQU5zUVFKMGFpRUlJQUZCQVdvaEFpQUdJQUZyUVFGeEJFQWdCeUFCUVFaMGFpSUVJQWdnQVNBRGJFRUNkR29pQWYwQUFnRDlDd0lBSUFRZ0FmMEFBaEQ5Q3dJUUlBSWhBUXNnQWlBR1JnMEFBMEFnQnlBQlFRWjBhaUlDSUFnZ0FTQURiRUVDZEdvaUJQMEFBZ0Q5Q3dJQUlBSWdCUDBBQWhEOUN3SVFJQWNnQVVFQmFpSUNRUVowYWlJRUlBZ2dBaUFEYkVFQ2RHb2lBdjBBQWhEOUN3SVFJQVFnQXYwQUFnRDlDd0lBSUFGQkFtb2lBU0FHUncwQUN3c2dBQkFtUVFBaEFTQUFLQUlnQkVBRFFDQUZJQUFvQWlRZ0FXeEJBblJxSWdJZ0FDZ0NBQ0FCUVFWMGFpSUQvUUFDQVAwTEFnQWdBaUFEL1FBQ0VQMExBaEFnQVVFQmFpSUJJQUFvQWlCSkRRQUxDeUFGUVNCcUlRVWdDa0VJYWlJS0lBQW9BaXhORFFBTEN5QUFLQUlBRUJRZ0FCQVVDNjBOQVNOL0lBQW9BaXhCQ0U4RVFDQUFLQUlrSWdwQkJYUWhGU0FLUVFkc0lSWWdDa0VHYkNFWElBcEJCV3doR0NBS1FRTnNJUmtnQ2tFQmRDRWFJQUFvQWlnaUFTQUtRUnhzYWlFZUlBRWdDa0VZYkdvaEh5QUJJQXBCRkd4cUlTQWdBU0FLUVFSMGFpRWhJQUVnQ2tFTWJHb2hJaUFCSUFwQkEzUnFJU01nQVNBS1FRSjBJaHRxSVNSQkNDRWNBMEFnQUNBQklBQW9BaVJCQ0JCRElBQVFKZ0pBSUFBb0FpQWlEVVVOQUNBVklCMXNJUWdnQUNnQ0FDRUdRUUFoQkFKQUFrQWdEVUhIQVUwTkFDQUJJQWdnSkdvaUF5QU5RUUowSWdWcUlndEpJQU1nQVNBRmFpSUhTWEVOQUNBQklBZ2dJMm9pQWlBRmFpSU1TU0FDSUFkSmNRMEFJQUVnQlNBSUlDSnFJZ2xxSWdWSklBY2dDVXR4RFFBZ0JpQUhTU0FCSUFZZ0RVRUZkR29pRGtFY2F5SVBTWEVOQUNBQklBNUJHR3NpRUVrZ0JrRUVhaUlSSUFkSmNRMEFJQUVnRGtFVWF5SVNTU0FHUVFocUloTWdCMGx4RFFBZ0J5QUdRUXhxSWhSTElBRWdEa0VRYXlJSFNYRU5BQ0FESUF4SklBSWdDMGx4RFFBZ0F5QUZTU0FKSUF0SmNRMEFJQU1nRDBrZ0JpQUxTWEVOQUNBRElCQkpJQXNnRVV0eERRQWdBeUFTU1NBTElCTkxjUTBBSUFNZ0Iwa2dDeUFVUzNFTkFDQUNJQVZKSUFrZ0RFbHhEUUFnQWlBUFNTQUdJQXhKY1EwQUlBSWdFRWtnRENBUlMzRU5BQ0FDSUJKSklBd2dFMHR4RFFBZ0FpQUhTU0FNSUJSTGNRMEFJQWtnRDBrZ0JTQUdTM0VOQUNBSklCQkpJQVVnRVV0eERRQWdDU0FTU1NBRklCTkxjUTBBSUFjZ0NVc2dCU0FVUzNFTkFDQU5RWHh4SVFSQkFDRURBMEFnQVNBRFFRSjBhaUFHSUFOQkJYUnFJZ0pCNEFCcUlBSkJRR3NnQWtFZ2FpQUMvVndDQVAxV0FnQUIvVllDQUFMOVZnSUFBLzBMQWdBZ0FTQURJQXBxUVFKMGFpQUNRZVFBYWlBQ1FjUUFhaUFDUVNScUlBTDlYQUlFL1ZZQ0FBSDlWZ0lBQXYxV0FnQUQvUXNDQUNBQklBTWdHbXBCQW5ScUlBSkI2QUJxSUFKQnlBQnFJQUpCS0dvZ0F2MWNBZ2o5VmdJQUFmMVdBZ0FDL1ZZQ0FBUDlDd0lBSUFFZ0F5QVpha0VDZEdvZ0FrSHNBR29nQWtITUFHb2dBa0VzYWlBQy9Wd0NEUDFXQWdBQi9WWUNBQUw5VmdJQUEvMExBZ0FnQTBFRWFpSURJQVJIRFFBTElBUWdEVVlOQVFzRFFDQUJJQVJCQW5ScUlBWWdCRUVGZEdvaUF5b0NBRGdDQUNBQklBUWdDbXBCQW5ScUlBTXFBZ1E0QWdBZ0FTQUVJQnBxUVFKMGFpQURLZ0lJT0FJQUlBRWdCQ0FaYWtFQ2RHb2dBeW9DRERnQ0FDQUVRUUZxSWdRZ0RVY05BQXNMSUFBb0FnQWhCa0VBSVFRQ1FDQU5RVE5ORFFBZ0NDQWhhaUlESUFnZ0lHb2lBaUFOUVFKMElnVnFJZ3RKSUFJZ0F5QUZhaUlIU1hFTkFDQURJQWdnSDJvaUNTQUZhaUlNU1NBSElBbExjUTBBSUFNZ0NDQWVhaUlJSUFWcUlnVkpJQWNnQ0V0eERRQWdBeUFHSUExQkJYUnFJZzVCREdzaUQwa2dCa0VRYWlJUUlBZEpjUTBBSUFNZ0RrRUlheUlSU1NBR1FSUnFJaElnQjBseERRQWdBeUFPUVFSckloTkpJQVpCR0dvaUZDQUhTWEVOQUNBRElBNUpJQVpCSEdvaUF5QUhTWEVOQUNBQ0lBeEpJQWtnQzBseERRQWdBaUFGU1NBSUlBdEpjUTBBSUFJZ0Qwa2dDeUFRUzNFTkFDQUNJQkZKSUFzZ0VrdHhEUUFnQWlBVFNTQUxJQlJMY1EwQUlBSWdEa2tnQXlBTFNYRU5BQ0FJSUF4SklBVWdDVXR4RFFBZ0NTQVBTU0FNSUJCTGNRMEFJQWtnRVVrZ0RDQVNTM0VOQUNBSklCTkpJQXdnRkV0eERRQWdDU0FPU1NBRElBeEpjUTBBSUFnZ0Qwa2dCU0FRUzNFTkFDQUlJQkZKSUFVZ0VrdHhEUUFnQ0NBVFNTQUZJQlJMY1EwQUlBZ2dEa2tnQXlBRlNYRU5BQ0FOUVh4eElRUkJBQ0VEQTBBZ0FTQURJQnRxUVFKMGFpQUdJQU5CQlhScUlnSkI4QUJxSUFKQjBBQnFJQUpCTUdvZ0F2MWNBaEQ5VmdJQUFmMVdBZ0FDL1ZZQ0FBUDlDd0lBSUFFZ0F5QVlha0VDZEdvZ0FrSDBBR29nQWtIVUFHb2dBa0UwYWlBQy9Wd0NGUDFXQWdBQi9WWUNBQUw5VmdJQUEvMExBZ0FnQVNBRElCZHFRUUowYWlBQ1FmZ0FhaUFDUWRnQWFpQUNRVGhxSUFMOVhBSVkvVllDQUFIOVZnSUFBdjFXQWdBRC9Rc0NBQ0FCSUFNZ0ZtcEJBblJxSUFKQi9BQnFJQUpCM0FCcUlBSkJQR29nQXYxY0FoejlWZ0lBQWYxV0FnQUMvVllDQUFQOUN3SUFJQU5CQkdvaUF5QUVSdzBBQ3lBRUlBMUdEUUVMQTBBZ0FTQUVJQnRxUVFKMGFpQUdJQVJCQlhScUlnTXFBaEE0QWdBZ0FTQUVJQmhxUVFKMGFpQURLZ0lVT0FJQUlBRWdCQ0FYYWtFQ2RHb2dBeW9DR0RnQ0FDQUJJQVFnRm1wQkFuUnFJQU1xQWh3NEFnQWdCRUVCYWlJRUlBMUhEUUFMQ3lBZFFRRnFJUjBnQVNBVmFpRUJJQnhCQ0dvaUhDQUFLQUlzVFEwQUN3c2dBQ2dDQUJBVUlBQVFGQXR6QVFKL0lBQW9BaHdpQVVFSWFpSURJQUFvQWlBaUFrMEVRQU5BSUFBZ0FDZ0NHQ0FCUVFKMGFpQUFLQUlVUVFnUU5pQURJZ0ZCQ0dvaUF5QUFLQUlnSWdKTkRRQUxDeUFCSUFKSkJFQWdBQ0FBS0FJWUlBRkJBblJxSUFBb0FoUWdBaUFCYXhBMkN5QUFLQUlBRUJRZ0FCQVVDMFFBSUFBb0Fod2lBU0FBS0FJZ1NRUkFBMEFnQUNBQUtBSVlJQUFvQWhRZ0FXeEJBblJxRUdZZ0FVRUJhaUlCSUFBb0FpQkpEUUFMQ3lBQUtBSUFFQlFnQUJBVUN3VUFFRzRBQ3dZQUVKa0JBQXNOQUJBTElBQkJnQUZxRUFvQUN3VUFFRzRBQzJ3QkFYOGdBRVFBQUFBQUFBQUFBQkFOR2dKQVFjamZBU2dDQUVFYlFScEJEaUFBUVFGR0d5QUFRUUpHR3lJQVF
20RRnJka0VCY1FSQVFjamdBVUhJNEFFb0FnQkJBU0FBUVFGcmRISTJBZ0FNQVFzZ0FFRUNkRUdneVFGcUtBSUFJZ0lFUUNBQUlBSVJBZ0FMQ3d1b0FRRUZmeUFBS0FKVUlnTW9BZ0FoQlNBREtBSUVJZ1FnQUNnQ0ZDQUFLQUljSWdkcklnWWdCQ0FHU1JzaUJnUkFJQVVnQnlBR0VCWWFJQU1nQXlnQ0FDQUdhaUlGTmdJQUlBTWdBeWdDQkNBR2F5SUVOZ0lFQ3lBRUlBSWdBaUFFU3hzaUJBUkFJQVVnQVNBRUVCWWFJQU1nQXlnQ0FDQUVhaUlGTmdJQUlBTWdBeWdDQkNBRWF6WUNCQXNnQlVFQU9nQUFJQUFnQUNnQ0xDSUJOZ0ljSUFBZ0FUWUNGQ0FDQzZZRkFnWitCSDhnQVNBQktBSUFRUWRxUVhoeElnRkJFR28yQWdBZ0FDQUJLUU1BSVFJZ0FTa0RDQ0VISXdCQklHc2lDQ1FBSUFkQy8vLy8vLy8vUDRNaEJBSitJQWRDTUloQy8vOEJneUlEcHlJS1FZSDRBR3RCL1E5TkJFQWdCRUlFaGlBQ1FqeUloQ0VESUFwQmdQZ0FhNjBoQkFKQUlBSkMvLy8vLy8vLy8vOFBneUlDUW9HQWdJQ0FnSUNBQ0ZvRVFDQURRZ0Y4SVFNTUFRc2dBa0tBZ0lDQWdJQ0FnQWhTRFFBZ0EwSUJneUFEZkNFREMwSUFJQU1nQTBMLy8vLy8vLy8vQjFZaUFCc2hBaUFBclNBRWZBd0JDd0pBSUFJZ0JJUlFEUUFnQTBMLy93RlNEUUFnQkVJRWhpQUNRanlJaEVLQWdJQ0FnSUNBQklRaEFrTC9Ed3dCQ3lBS1FmNkhBVXNFUUVJQUlRSkMvdzhNQVF0QmdQZ0FRWUg0QUNBRFVDSUJHeUlBSUFwcklnbEI4QUJLQkVCQ0FDRUNRZ0FNQVFzZ0FpRURJQVFnQkVLQWdJQ0FnSURBQUlRZ0FSc2lCU0VHQWtCQmdBRWdDV3NpQVVIQUFIRUVRQ0FDSUFGQlFHcXRoaUVHUWdBaEF3d0JDeUFCUlEwQUlBWWdBYTBpQklZZ0EwSEFBQ0FCYTYySWhDRUdJQU1nQklZaEF3c2dDQ0FETndNUUlBZ2dCamNER0FKQUlBbEJ3QUJ4QkVBZ0JTQUpRVUJxcllnaEFrSUFJUVVNQVFzZ0NVVU5BQ0FGUWNBQUlBbHJyWVlnQWlBSnJTSURpSVFoQWlBRklBT0lJUVVMSUFnZ0FqY0RBQ0FJSUFVM0F3Z2dDQ2tEQ0VJRWhpQUlLUU1BSWdOQ1BJaUVJUUlDUUNBQUlBcEhJQWdwQXhBZ0NDa0RHSVJDQUZKeHJTQURRdi8vLy8vLy8vLy9ENE9FSWdOQ2dZQ0FnSUNBZ0lBSVdnUkFJQUpDQVh3aEFnd0JDeUFEUW9DQWdJQ0FnSUNBQ0ZJTkFDQUNRZ0dESUFKOElRSUxJQUpDZ0lDQWdJQ0FnQWlGSUFJZ0FrTC8vLy8vLy8vL0IxWWlBQnNoQWlBQXJRc2hBeUFJUVNCcUpBQWdCMEtBZ0lDQWdJQ0FnSUIvZ3lBRFFqU0doQ0FDaEw4NUF3QUw5QmNERW44QmZBTitJd0JCc0FScklnd2tBQ0FNUVFBMkFpd0NRQ0FCdlNJWlFnQlRCRUJCQVNFUVFib0lJUlFnQVpvaUFiMGhHUXdCQ3lBRVFZQVFjUVJBUVFFaEVFRzlDQ0VVREFFTFFjQUlRYnNJSUFSQkFYRWlFQnNoRkNBUVJTRVhDd0pBSUJsQ2dJQ0FnSUNBZ1BqL0FJTkNnSUNBZ0lDQWdQai9BRkVFUUNBQVFTQWdBaUFRUVFOcUlnWWdCRUgvLzN0eEVDQWdBQ0FVSUJBUUhpQUFRWklKUWZZS0lBVkJJSEVpQXh0Qit3bEJud3NnQXhzZ0FTQUJZaHRCQXhBZUlBQkJJQ0FDSUFZZ0JFR0F3QUJ6RUNBZ0FpQUdJQUlnQmtvYklRME1BUXNnREVFUWFpRVJBa0FDUUFKQUlBRWdERUVzYWhCd0lnRWdBYUFpQVVRQUFBQUFBQUFBQUdJRVFDQU1JQXdvQWl3aUJrRUJhellDTENBRlFTQnlJaFZCNFFCSERRRU1Bd3NnQlVFZ2NpSVZRZUVBUmcwQ0lBd29BaXdoQ3d3QkN5QU1JQVpCSFdzaUN6WUNMQ0FCUkFBQUFBQUFBTEJCb2lFQkMwRUdJQU1nQTBFQVNCc2hDaUFNUVRCcVFhQUNRUUFnQzBFQVRodHFJZzRoQndOQUlBY0NmeUFCUkFBQUFBQUFBUEJCWXlBQlJBQUFBQUFBQUFBQVpuRUVRQ0FCcXd3QkMwRUFDeUlETmdJQUlBZEJCR29oQnlBQklBTzRvVVFBQUFBQVpjM05RYUlpQVVRQUFBQUFBQUFBQUdJTkFBc0NRQ0FMUVFCTUJFQWdDeUVKSUFjaEJpQU9JUWdNQVFzZ0RpRUlJQXNoQ1FOQVFSMGdDU0FKUVIxUEd5RURBa0FnQjBFRWF5SUdJQWhKRFFBZ0E2MGhHMElBSVJrRFFDQUdJQmxDLy8vLy93K0RJQVkxQWdBZ0c0WjhJaHBDZ0pUcjNBT0FJaGxDZ095VW93eCtJQnA4UGdJQUlBWkJCR3NpQmlBSVR3MEFDeUFhUW9DVTY5d0RWQTBBSUFoQkJHc2lDQ0FaUGdJQUN3TkFJQWdnQnlJR1NRUkFJQVpCQkdzaUJ5Z0NBRVVOQVFzTElBd2dEQ2dDTENBRGF5SUpOZ0lzSUFZaEJ5QUpRUUJLRFFBTEN5QUpRUUJJQkVBZ0NrRVpha0VKYmtFQmFpRVNJQlZCNWdCR0lSTURRRUVKUVFBZ0NXc2lBeUFEUVFsUEd5RU5Ba0FnQmlBSVRRUkFJQWdvQWdCRlFRSjBJUWNNQVF0QmdKVHIzQU1nRFhZaEZrRi9JQTEwUVg5eklROUJBQ0VKSUFnaEJ3TkFJQWNnQnlnQ0FDSURJQTEySUFscU5nSUFJQU1nRDNFZ0Ztd2hDU0FIUVFScUlnY2dCa2tOQUFzZ0NDZ0NBRVZCQW5RaEJ5QUpSUTBBSUFZZ0NUWUNBQ0FHUVFScUlRWUxJQXdnRENnQ0xDQU5haUlKTmdJc0lBNGdCeUFJYWlJSUlCTWJJZ01nRWtFQ2RHb2dCaUFHSUFOclFRSjFJQkpLR3lFR0lBbEJBRWdOQUFzTFFRQWhDUUpBSUFZZ0NFME5BQ0FPSUFoclFRSjFRUWxzSVFsQkNpRUhJQWdvQWdBaUEwRUtTUTBBQTBBZ0NVRUJhaUVKSUFNZ0IwRUtiQ0lIVHcwQUN3c2dDaUFKUVFBZ0ZVSG1BRWNiYXlBVlFlY0FSaUFLUVFCSGNXc2lBeUFHSUE1clFRSjFRUWxzUVFsclNBUkFJQXhCTUdwQmhHQkJwR0lnQzBFQVNCdHFJQU5CZ01nQWFpSUxRUWx0SWdOQkFuUnFJUTFCQ2lFSElBTkJkMndnQzJvaUEwRUhUQVJBQTBBZ0IwRUtiQ0VISUFOQkFXb2lBMEVJUncwQUN3c0NRQ0FOS0FJQUlnc2dDeUFIYmlJU0lBZHNJZzlHSUExQkJHb2lBeUFHUm5FTkFDQUxJQTlySVFzQ1FDQVNRUUZ4UlFSQVJBQUFBQUFBQUVCRElRRWdCMEdBbE92Y0EwY05BU0FJSUExUERRRWdEVUVFYXkwQUFFRUJjVVVOQVF0RUFRQUFBQUFBUUVNaEFRdEVBQUFBQUFBQTREOUVBQUFBQUFBQThEOUVBQUFBQUFBQStEOGdBeUFHUmh0RUFBQUFBQUFBK0Q4Z0N5QUhRUUYySWdOR0d5QURJQXRMR3lFWUFrQWdGdzBBSUJRdEFBQkJMVWNOQUNBWW1pRVlJQUdhSVFFTElBMGdEellDQUNBQklCaWdJQUZoRFFBZ0RTQUhJQTlxSWdNMkFnQWdBMEdBbE92Y0EwOEVRQU5BSUExQkFEWUNBQ0FJSUExQkJHc2lEVXNFUUNBSVFRUnJJZ2hCQURZQ0FBc2dEU0FOS0FJQVFRRnFJZ00yQWdBZ0EwSC9rK3ZjQTBzTkFBc0xJQTRnQ0d0QkFuVkJDV3doQ1VFS0lRY2dDQ2dDQUNJRFFRcEpEUUFEUUNBSlFRRnFJUWtnQXlBSFFRcHNJZ2RQRFFBTEN5QU5RUVJxSWdNZ0JpQURJQVpKR3lFR0N3TkFJQVlpQ3lBSVRTSUhSUVJBSUFaQkJHc2lCaWdDQUVVTkFRc0xBa0FnRlVIbkFFY0VRQ0FFUVFoeElSTU1BUXNnQ1VGL2MwRi9JQXBCQVNBS0d5SUdJQWxLSUFsQmUwcHhJZ01iSUFacUlRcEJmMEYrSUFNYklBVnFJUVVnQkVFSWNTSVREUUJCZHlFR0FrQWdCdzBBSUF0QkJHc29BZ0FpRDBVTkFFRUtJUU5CQUNFR0lBOUJDbkFOQUFOQUlBWWlCMEVCYWlFR0lBOGdBMEVLYkNJRGNFVU5BQXNnQjBGL2N5RUdDeUFMSUE1clFRSjFRUWxzSVFNZ0JVRmZjVUhHQUVZRVFFRUFJUk1nQ2lBRElBWnFRUWxySWdOQkFDQURRUUJLR3lJRElBTWdDa29iSVFvTUFRdEJBQ0VUSUFvZ0
20F5QUphaUFHYWtFSmF5SURRUUFnQTBFQVNoc2lBeUFESUFwS0d5RUtDMEYvSVEwZ0NrSDkvLy8vQjBIKy8vLy9CeUFLSUJOeUlnOGJTZzBCSUFvZ0QwRUFSMnBCQVdvaEZnSkFJQVZCWDNFaUIwSEdBRVlFUUNBSklCWkIvLy8vL3dkelNnMERJQWxCQUNBSlFRQktHeUVHREFFTElCRWdDU0FKUVI5MUlnTnpJQU5yclNBUkVDOGlCbXRCQVV3RVFBTkFJQVpCQVdzaUJrRXdPZ0FBSUJFZ0JtdEJBa2dOQUFzTElBWkJBbXNpRWlBRk9nQUFJQVpCQVd0QkxVRXJJQWxCQUVnYk9nQUFJQkVnRW1zaUJpQVdRZi8vLy84SGMwb05BZ3NnQmlBV2FpSURJQkJCLy8vLy93ZHpTZzBCSUFCQklDQUNJQU1nRUdvaUNTQUVFQ0FnQUNBVUlCQVFIaUFBUVRBZ0FpQUpJQVJCZ0lBRWN4QWdBa0FDUUFKQUlBZEJ4Z0JHQkVBZ0RFRVFha0VKY2lFRklBNGdDQ0FJSUE1TEd5SURJUWdEUUNBSU5RSUFJQVVRTHlFR0FrQWdBeUFJUndSQUlBWWdERUVRYWswTkFRTkFJQVpCQVdzaUJrRXdPZ0FBSUFZZ0RFRVFha3NOQUFzTUFRc2dCU0FHUncwQUlBWkJBV3NpQmtFd09nQUFDeUFBSUFZZ0JTQUdheEFlSUFoQkJHb2lDQ0FPVFEwQUN5QVBCRUFnQUVIdkRFRUJFQjRMSUFnZ0MwOE5BU0FLUVFCTURRRURRQ0FJTlFJQUlBVVFMeUlHSUF4QkVHcExCRUFEUUNBR1FRRnJJZ1pCTURvQUFDQUdJQXhCRUdwTERRQUxDeUFBSUFaQkNTQUtJQXBCQ1U0YkVCNGdDa0VKYXlFR0lBaEJCR29pQ0NBTFR3MERJQXBCQ1VvZ0JpRUtEUUFMREFJTEFrQWdDa0VBU0EwQUlBc2dDRUVFYWlBSUlBdEpHeUVESUF4QkVHcEJDWEloQ3lBSUlRY0RRQ0FMSUFjMUFnQWdDeEF2SWdaR0JFQWdCa0VCYXlJR1FUQTZBQUFMQWtBZ0J5QUlSd1JBSUFZZ0RFRVFhazBOQVFOQUlBWkJBV3NpQmtFd09nQUFJQVlnREVFUWFrc05BQXNNQVFzZ0FDQUdRUUVRSGlBR1FRRnFJUVlnQ2lBVGNrVU5BQ0FBUWU4TVFRRVFIZ3NnQUNBR0lBc2dCbXNpQlNBS0lBVWdDa2diRUI0Z0NpQUZheUVLSUFkQkJHb2lCeUFEVHcwQklBcEJBRTROQUFzTElBQkJNQ0FLUVJKcVFSSkJBQkFnSUFBZ0VpQVJJQkpyRUI0TUFnc2dDaUVHQ3lBQVFUQWdCa0VKYWtFSlFRQVFJQXNnQUVFZ0lBSWdDU0FFUVlEQUFITVFJQ0FDSUFrZ0FpQUpTaHNoRFF3QkN5QVVJQVZCR25SQkgzVkJDWEZxSVFrQ1FDQURRUXRMRFFCQkRDQURheUVHUkFBQUFBQUFBREJBSVJnRFFDQVlSQUFBQUFBQUFEQkFvaUVZSUFaQkFXc2lCZzBBQ3lBSkxRQUFRUzFHQkVBZ0dDQUJtaUFZb2FDYUlRRU1BUXNnQVNBWW9DQVlvU0VCQ3lBUklBd29BaXdpQnlBSFFSOTFJZ1p6SUFacnJTQVJFQzhpQmtZRVFDQUdRUUZySWdaQk1Eb0FBQXNnRUVFQ2NpRUtJQVZCSUhFaEN5QUdRUUpySWc0Z0JVRVBham9BQUNBR1FRRnJRUzFCS3lBSFFRQklHem9BQUNBRVFRaHhSU0FEUVFCTWNTRUlJQXhCRUdvaEJ3TkFJQWNpQlFKL0lBR1pSQUFBQUFBQUFPQkJZd1JBSUFHcURBRUxRWUNBZ0lCNEN5SUdRWkRKQVdvdEFBQWdDM0k2QUFBZ0FTQUd0NkZFQUFBQUFBQUFNRUNpSVFFQ1FDQUZRUUZxSWdjZ0RFRVFhbXRCQVVjTkFDQUJSQUFBQUFBQUFBQUFZU0FJY1EwQUlBVkJMam9BQVNBRlFRSnFJUWNMSUFGRUFBQUFBQUFBQUFCaURRQUxRWDhoRFNBRFFmMy8vLzhISUFvZ0VTQU9heUlJYWlJR2Ewb05BQ0FBUVNBZ0FpQUdJQU5CQW1vZ0J5QU1RUkJxSWdWcklnY2dCMEVDYXlBRFNCc2dCeUFER3lJRGFpSUdJQVFRSUNBQUlBa2dDaEFlSUFCQk1DQUNJQVlnQkVHQWdBUnpFQ0FnQUNBRklBY1FIaUFBUVRBZ0F5QUhhMEVBUVFBUUlDQUFJQTRnQ0JBZUlBQkJJQ0FDSUFZZ0JFR0F3QUJ6RUNBZ0FpQUdJQUlnQmtvYklRMExJQXhCc0FScUpBQWdEUXNFQUVJQUN3UUFRUUFMSEFBZ0FDZ0NQQkFSSWdBRWYwSFV6UUVnQURZQ0FFRi9CVUVBQ3d2S0FnRUhmeU1BUVNCcklnTWtBQ0FESUFBb0Fod2lCRFlDRUNBQUtBSVVJUVVnQXlBQ05nSWNJQU1nQVRZQ0dDQURJQVVnQkdzaUFUWUNGQ0FCSUFKcUlRVkJBaUVHSUFOQkVHb2hBUUovQTBBQ1FBSkFBa0FnQUNnQ1BDQUJJQVlnQTBFTWFoQUJJZ1FFZjBIVXpRRWdCRFlDQUVGL0JVRUFDMFVFUUNBRklBTW9BZ3dpQjBZTkFTQUhRUUJPRFFJTUF3c2dCVUYvUncwQ0N5QUFJQUFvQWl3aUFUWUNIQ0FBSUFFMkFoUWdBQ0FCSUFBb0FqQnFOZ0lRSUFJTUF3c2dBU0FISUFFb0FnUWlDRXNpQ1VFRGRHb2lCQ0FISUFoQkFDQUpHMnNpQ0NBRUtBSUFhallDQUNBQlFReEJCQ0FKRzJvaUFTQUJLQUlBSUFock5nSUFJQVVnQjJzaEJTQUdJQWxySVFZZ0JDRUJEQUVMQ3lBQVFRQTJBaHdnQUVJQU53TVFJQUFnQUNnQ0FFRWdjallDQUVFQUlBWkJBa1lOQUJvZ0FpQUJLQUlFYXdzZ0EwRWdhaVFBQzFJQkFYOGdBQ2dDUENNQVFSQnJJZ0FrQUNBQnB5QUJRaUNJcHlBQ1FmOEJjU0FBUVFocUVBa2lBZ1IvUWRUTkFTQUNOZ0lBUVg4RlFRQUxJUUlnQUNrRENDRUJJQUJCRUdva0FFSi9JQUVnQWhzTEJnQWdBQkFBQ3dZQUlBQVFBd3Z2Z1FFRkEzd3lmd2g3QTM0R2ZTTUFRZURBQUdzaUdpUUFJQnBCQURZQ0lFRUNJUTRDUUFKQUlBQW9BZ0FpQ0VHTmxKelVBRVlOQUNBSVFmK2YvWThGUndSQUFrQWdDRUdBZ0lEZ0FFY05BQ0FBS0FJRVFlcWdnWUVDUncwQUlBQW9BZ2hCalpTYzFBQkdEUUlMUWMwSUVBQkJBU0VPREFJTFFRQWhEZ3NDZjBFQVFRRkI0QUFRRnlJSVJRMEFHaUFJUVFFMkFrd0NRQUpBQWtBQ1FDQU9EZ01BQXdFREN5QUlRY1FBTmdKWUlBaEJ4UUEyQWxRZ0NFSEdBRFlDVUNBSVFjY0FOZ0lRSUFoQnlBQTJBZ1FnQ0VISkFEWUNIQ0FJUWNvQU5nSVlJQWhCeXdBMkFoUWdDRUhNQURZQ0FDQUlRYzBBTmdKY0lBaEJ6Z0EyQWl3Z0NFSFBBRFlDS0NBSVFkQUFOZ0lrSUFoQjBRQTJBaUFnQ0VIU0FEWUNEQ0FJUWRNQU5nSUlJQWdRVmlJTk5nSXdJQTBOQVF3Q0N5QUlRZFFBTmdKWUlBaEIxUUEyQWxRZ0NFSFdBRFlDVUNBSVFkY0FOZ0lRSUFoQjJBQTJBZ1FnQ0VIWkFEWUNYQ0FJUWRvQU5nSXNJQWhCMndBMkFpZ2dDRUhjQURZQ0pDQUlRZDBBTmdJZ0lBaEIzZ0EyQWh3Z0NFSGZBRFlDR0NBSVFlQUFOZ0lVSUFoQjRRQTJBZ3dnQ0VIaUFEWUNDQ0FJUWVNQU5nSUFJQWdDZjBFQlFZZ0JFQmNpRFFSQUlBMFFWaUlVTmdJQUFrQWdGRVVOQUNBTi9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQS9Rc0NiQ0FOUVFBNkFId2dEUkE1SWhRMkFnUWdGRVVOQUNBTkVEa2lGRFlDQ0NBVVJRMEFJQTBNQWdzZ0RSQjlDMEVBQ3lJTk5nSXdJQTFGRFFFTElBaEJBVFlDU0NBSVFRRTJBa0FnQ0VFQU5nSThJQWhDQURjQ05DQUlRUUUyQWtRZ0NBd0JDeUFJRUJSQkFBc2lEUVJBSUExQkFEWUNQQ0FOUWVRQU5nSklDeUFOQkVBZ0RVRUFOZ0k0SUExQjVRQTJBa1FMSUEwRVFDQU5RUUEyQWpRZ0RVSG1BRFlDUUFzZ0drRWthaUlJQkVBZ0NFRUFRYmpBQUJBWklnaEJBRFlDdUVBZ0NFSi9Od0tJUUFzZ0F3
20UkFJQm9nR2lnQzNFQkJBWEkyQXR4QUN5QWFJQUUyQWh3Z0dpQUFOZ0lZSUJvZ0FEWUNGRUVCSVE1QkFDRUJBa0FnR2tFVWFpSUlSUTBBUVFGQnlBQVFGeUlBQkg4Q2Z5QUFRWUNBd0FBMkFrQWdBRUdBZ01BQUVCZ2lGRFlDSUNBVVJRUkFJQUFRRkVFQURBRUxJQUFnRkRZQ0pDQUFRUUkyQWh3Z0FFRUROZ0lZSUFCQkJEWUNGQ0FBUVFVMkFoQWdBRUVHTmdJc0lBQkJDRFlDS0NBQUlBQW9Ba1JCQW5JMkFrUWdBQXNGUVFBTElnQkZEUUFnQUFSQUlBQkJBRFlDQkNBQUlBZzJBZ0FMSUFnMUFnZ2hRaUFBQkVBZ0FDQkNOd01JQ3dKQUlBQkZEUUFnQUMwQVJFRUNjVVVOQUNBQVFjQUFOZ0lRQ3lBQUJFQWdBRUhDQURZQ0dBc2dBQVJBSUFCQnd3QTJBaHdMSUFBaEFRc2dBU0VBQW44Z0drRWthaUVCQWtBZ0RVVU5BQ0FCUlEwQUlBMG9Ba3hGQkVBZ0RVRTBha0VCUVluTkFFRUFFQk5CQUF3Q0N5QU5LQUl3SUFFZ0RTZ0NHQkVEQUVFQklRa0xJQWtMUlFSQVFkd0lFQUFnQUJBOUlBMFFQZ3dCQ3dKL0lCcEJJR29oQVVFQUlRZ0NRQ0FBUlEwQUlBMUZEUUFnRFNnQ1RFVUVRQ0FOUVRScVFRRkIyczBBUVFBUUUwRUFEQUlMSUFBZ0RTZ0NNQ0FCSUExQk5Hb2dEU2dDQUJFQkFDRUlDeUFJQzBVRVFFSDRDQkFBSUFBUVBTQU5FRDRnR2lnQ0lCQWxEQUVMSUJvb0FpQWhBVUVBSVFnQ1FDQU5SUTBBSUFCRkRRQWdEU2dDVEVVTkFDQU5LQUl3SUFBZ0FTQU5RVFJxSUEwb0FnUVJBUUFoQ0FzQ1FDQUlCRUJCQUNFSUFrQWdEVVVOQUNBQVJRMEFJQTBvQWt4RkRRQWdEU2dDTUNBQUlBMUJOR29nRFNnQ0VCRUFBQ0VJQ3lBSURRRUxRZjhKRUFBZ0RSQStJQUFRUFNBYUtBSWdFQ1VNQVFzZ0FCQTlJQTBRUGlBYUtBSWdJaFFvQWh3aUFBUkFJQUFRRkNBYUtBSWdJaFJDQURjQ0hBc2dGQ2dDRUNFaEFrQUNRQ0FDUlFSQUFrQWdCRVVOQUNBaFFRUkhEUUJCQVNFWlFRUWhJUXdEQ3dKQUFrQWdGQ2dDRkNJQlFRTkdEUUFnSVVFRFJ3MEFJQlFvQWhnaUFDZ0NBQ0FBS0FJRVJ3MEJJQUFvQWpSQkFVWU5BU0FVUVFNMkFoUU1Bd3NnSVVFQ1N3MEFJQlJCQWpZQ0ZBd0RDd0pBQWtBZ0FVRURhdzREQXdFQUJBc2pBRUVRYXlJSkpBQUNRQUpBQWtBZ0ZDZ0NFRUVFU1EwQUlCUW9BaGdpQUNnQ0FDSUJJQUFvQWpSSERRQWdBU0FBS0FKb1J3MEFJQUVnQUNnQ25BRkhEUUFnQUNnQ0JDSUJJQUFvQWpoSERRQWdBU0FBS0FKc1J3MEFJQUVnQUNnQ29BRkdEUUVMSUFsQm5RZzJBZ1FnQ1VHNENqWUNBRUd3eXdGQnpqOGdDUkFhREFFTEFrQWdBQ2dDRENBQUtBSUliQ0lOUlFSQUlBQW9Bc2dCSVFFTUFRdERBQUNBUDBGL0lBQW9BclFCZEVGL2M3T1ZJVVZEQUFDQVAwRi9JQUFvQW9BQmRFRi9jN09WSVVkREFBQ0FQMEYvSUFBb0FreDBRWDl6czVVaFNFTUFBSUEvUVg4Z0FDZ0NHSFJCZjNPemxTRkdJQUFvQXNnQklRRWdBQ2dDbEFFaEFpQUFLQUpnSVFvZ0FDZ0NMQ0VJUVFBaEFBSkFJQTFCQ0VrTkFDQUlJQW9nRFVFQ2RDSUxhaUlQU1NBS0lBZ2dDMm9pRmtseERRQWdBaUFXU1NBSUlBSWdDMm9pREVseERRQWdBU0FXU1NBSUlBRWdDMm9pQzBseERRQWdDaUFNU1NBQ0lBOUpjUTBBSUFFZ0Qwa2dDaUFMU1hFTkFDQUJJQXhKSUFJZ0MwbHhEUUFnRFVGOGNTRUFJRVg5RXlFNklFZjlFeUU3SUVqOUV5RkFJRWI5RXlFOVFRQWhDd05BSUFJZ0MwRUNkQ0lQYWlJVy9RQUNBQ0UrSUFvZ0Qyb2lEUDBBQWdBaFB5QUlJQTlxSWhEOURBQUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4Z1BTQVEvUUFDQVAzNkFmM21BZjNsQWYwTUFBQi9Rd0FBZjBNQUFIOURBQUIvUS8zbUFmME1BQUNBUHdBQWdEOEFBSUEvQUFDQVB5QTZJQUVnRDJyOUFBSUEvZm9CL2VZQi9lVUJJano5NWdIOStBSDlDd0lBSUF6OURBQUFnRDhBQUlBL0FBQ0FQd0FBZ0Q4Z1FDQS8vZm9CL2VZQi9lVUIvUXdBQUg5REFBQi9Rd0FBZjBNQUFIOUQvZVlCSUR6OTVnSDkrQUg5Q3dJQUlCYjlEQUFBZ0Q4QUFJQS9BQUNBUHdBQWdEOGdPeUErL2ZvQi9lWUIvZVVCL1F3QUFIOURBQUIvUXdBQWYwTUFBSDlEL2VZQklEejk1Z0g5K0FIOUN3SUFJQXRCQkdvaUN5QUFSdzBBQ3lBQUlBMUdEUUVMQTBBQ2YwTUFBSUEvSUVZZ0NDQUFRUUowSWd0cUlnOG9BZ0N5bEpOREFBQi9RNVJEQUFDQVB5QkZJQUVnQzJvb0FnQ3lsSk1pU1pRaVNvdERBQUFBVDEwRVFDQktxQXdCQzBHQWdJQ0FlQXNoRmlBQ0lBdHFJZ3dvQWdBaEVDQUtJQXRxSWdzb0FnQWhEaUFQSUJZMkFnQWdDd0ovUXdBQWdEOGdTQ0FPc3BTVFF3QUFmME9VSUVtVUlrcUxRd0FBQUU5ZEJFQWdTcWdNQVF0QmdJQ0FnSGdMTmdJQUlBd0NmME1BQUlBL0lFY2dFTEtVazBNQUFIOURsQ0JKbENKSmkwTUFBQUJQWFFSQUlFbW9EQUVMUVlDQWdJQjRDellDQUNBQVFRRnFJZ0FnRFVjTkFBc0xJQUVRRkNBVUtBSVlJZ0JCQ0RZQ2dBRWdBRUVJTmdKTUlBQkJDRFlDR0NBQVFRQTJBc2dCSUJSQkFUWUNGQ0FVSUJRb0FoQkJBV3NpQURZQ0VDQUFRUVJKRFFCQkF5RUFBMEFnRkNnQ0dDQUFRVFJzYWlJQklBRW9BbVEyQWpBZ0FTQUIvUUFDVlAwTEFpQWdBU0FCL1FBQ1JQMExBaEFnQVNBQi9RQUNOUDBMQWdBZ0FFRUJhaUlBSUJRb0FoQkpEUUFMQ3lBSlFSQnFKQUFNQXdzakFFRVFheUlKSkFBQ1FBSkFBa0FnRkNnQ0VFRURTUTBBSUJRb0FoZ2lBQ2dDQUNJQklBQW9BalJIRFFBZ0FTQUFLQUpvUncwQUlBQW9BZ1FpQVNBQUtBSTRSdzBBSUFFZ0FDZ0NiRVlOQVFzZ0NVSGJDRFlDQkNBSlFiZ0tOZ0lBUWJETEFVSDRQeUFKRUJvTUFRc0NRQ0FBS0FJTUlBQW9BZ2hzSWdKRkRRQkJmeUFBS0FJWUlncDBRWDl6SVFGQkFFRUJJQXBCQVd0MElnb2dBQ2dDaUFFYklROUJBQ0FLSUFBb0FsUWJJUllnQUNnQ2xBRWhDaUFBS0FKZ0lRZ2dBQ2dDTENFTlFRQWhBQUpBSUFKQkJFa05BQ0FOSUFnZ0FrRUNkQ0lMYWlJTVNTQUlJQXNnRFdvaUVFbHhEUUFnQ2lBUVNTQU5JQW9nQzJvaUMwbHhEUUFnQ0NBTFNTQUtJQXhKY1EwQUlBSkJmSEVoQUNBQi9SRWhQQ0FQL1JFaFBTQVcvUkVoUGtFQUlRc0RRQ0FOSUF0QkFuUWlER29pRUNBOElBb2dER29pRHYwQUFnQWdQZjJ4QWYzNkFTSTYvUXhwZExNL2FYU3pQMmwwc3o5cGRMTS8vZVlCSUFnZ0RHb2lEUDBBQWdBZ1B2MnhBZjM2QVNJNy9ReXpXUnE0czFrYXVMTlpHcml6V1JxNC9lWUJJQkQ5QUFJQS9mb0JJa0Q5NUFIOTVBSDlEQUFBQUQ4QUFBQS9BQUFBUHdBQUFELzk1QUg5K0FFaVAvME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFQMjRBU0E4SUQvOU9mMVMvUXNDQUNBTUlEd2dPdjBNR2RBMnZ4blFOcjhaMERhL0dkQTJ2LzNtQVNCQS9RelZDWUEvMVFtQVA5VUpnRC9WQ1lBLy9lWUJJRHY5RENjeHNMNG5NYkMrSnpHd3ZpY3hzTDc5NWdIOTVBSDk1QUg5REFBQUFEOEFBQUEvQUFBQVB3QUFBRC85NUFIOStBRWlQLzBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDI0QVNBOElELzlPZjFTL1FzQ0FDQU9JRHdnT3YwTXZUY0d0NzAzQnJlOU53YTN2
20VGNHdC8zbUFTQkEvUXhtOUg4L1p2Ui9QMmIwZno5bTlIOC8vZVlCSUR2OUREWFM0ajgxMHVJL05kTGlQelhTNGovOTVnSDk1QUg5NUFIOURBQUFBRDhBQUFBL0FBQUFQd0FBQUQvOTVBSDkrQUVpT3YwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAyNEFTQThJRHI5T2YxUy9Rc0NBQ0FMUVFScUlnc2dBRWNOQUFzZ0FDQUNSZzBCQ3dOQUFuOGdDaUFBUVFKMElndHFJZ3dvQWdBZ0QydXlJa1ZEYVhTelA1UWdDQ0FMYWlJUUtBSUFJQlpyc2lKSFE3TlpHcmlVSUFzZ0RXb2lEaWdDQUxJaVNKS1NRd0FBQUQrU0lrYUxRd0FBQUU5ZEJFQWdScWdNQVF0QmdJQ0FnSGdMSVFzZ0RpQUJJQXRCQUNBTFFRQktHeUFCSUF0SUd6WUNBQ0FRSUFFQ2Z5QkZReG5RTnIrVUlFaEQxUW1BUDVRZ1IwTW5NYkMrbEpLU1F3QUFBRCtTSWthTFF3QUFBRTlkQkVBZ1JxZ01BUXRCZ0lDQWdIZ0xJZ3RCQUNBTFFRQktHeUFCSUF0SUd6WUNBQ0FNSUFFQ2Z5QkZRNzAzQnJlVUlFaERadlIvUDVRZ1IwTTEwdUkvbEpLU1F3QUFBRCtTSWtXTFF3QUFBRTlkQkVBZ1JhZ01BUXRCZ0lDQWdIZ0xJZ3RCQUNBTFFRQktHeUFCSUF0SUd6WUNBQ0FBUVFGcUlnQWdBa2NOQUFzTElCUkJBVFlDRkFzZ0NVRVFhaVFBREFJTElDRWdBaUFDSUNGTEd5RWhRUUVoR1F3QkN3SkFBa0FDZndKQUFrQWdGQ2dDR0NJQktBSUFRUUZIRFFBQ1FBSkFJQUVvQWpSQkFXc09BZ0VBQWdzZ0FTZ0NhRUVDUncwQkFrQWdBU2dDQkVFQlJ3MEFJQUVvQWpoQkFrY05BQ0FCS0FKc1FRSkhEUUFnRkNJV0tBSVlJZ0FvQWhnaEFTQUFLQUtVQVNFT0lBQW9BbUFoQ2lBQUtBSXNJUkFnQUNnQ1BDRWZJQUFvQWdnaUNTQUFLQUlNSWdKc1FRSjBJZ0FRSENFSUlBQVFIQ0VOSUFBUUhDRVVBa0FDUUFKQUFrQUNRQUpBSUFoRkRRQWdEVVVOQUNBVVJRMEFRWDhnQVhSQmYzTWhERUVCSUFGQkFXdDBJUkVnQWlBV0tBSUVRUUZ4SWdCcklTWWdGaWdDQUVFQmNTRWRJQUJGRFFNZ0NVVU5Bd0ovUVFBZ0VXdXl1eUlGUkdxOGRKTVlCTlkvb2lBRlJBd0NLNGNXMmVZL29xQWlCcGxFQUFBQUFBQUE0RUZqQkVBZ0Jxb01BUXRCZ0lDQWdIZ0xJUk1DZnlBRlJDY3hDS3djV3Z3L29pSUdtVVFBQUFBQUFBRGdRV01FUUNBR3Fnd0JDMEdBZ0lDQWVBc2hGU0FKUVFoSkFuOGdCVVE3MzArTmwyNzJQNklpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMSVJzTkFTQU5JQWhyUVJCSkRRRWdGQ0FJYTBFUVNRMEJJQWdnRUd0QkVFa05BU0FVSUExclFSQkpEUUVnRFNBUWEwRVFTUTBCSUJRZ0VHdEJFRWtOQVNBVUlBbEJmSEVpRDBFQ2RDSUNhaUVBSUFJZ0NHb2hBU0FWL1JFaE95QVQvUkVoUUNBTS9SRWhQQ0FiL1JFaFBRTkFJQWdnRjBFQ2RDSUxhdjBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FMSUJCcS9RQUNBQ0k2SUQzOXJnRWlQaUE4L2JZQklENzlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDlPZjFTL1FzQ0FDQUxJQTFxL1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBSURvZ1FQMnhBU0krSUR6OXRnRWdQdjBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDA1L1ZMOUN3SUFJQXNnRkdyOURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ09pQTcvYTRCSWpvZ1BQMjJBU0E2L1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1RuOVV2MExBZ0FnRjBFRWFpSVhJQTlIRFFBTElBSWdFR29oRUNBQ0lBMXFJUUlnQ1NBUFJnMEVEQUlMSUFnUUZDQU5FQlFnRkJBVURBUUxJQWdoQVNBTklRSWdGQ0VBQ3dOQUlBRWdFQ2dDQUNJTElCdHFJaGNnRENBTUlCZEtHMEVBSUJkQkFFNGJOZ0lBSUFJZ0N5QVRheUlYSUF3Z0RDQVhTaHRCQUNBWFFRQk9HellDQUNBQUlBc2dGV29pQ3lBTUlBc2dERWdiUVFBZ0MwRUFUaHMyQWdBZ0FFRUVhaUVBSUFKQkJHb2hBaUFCUVFScUlRRWdFRUVFYWlFUUlBOUJBV29pRHlBSlJ3MEFDd3dCQ3lBVUlRQWdEU0VDSUFnaEFRc2dDU0FkYXlFaUFrQWdKa0YrY1NJbkJIOENmMEVBSUJGcnNyc2lCVVJxdkhTVEdBVFdQNklnQlVRTUFpdUhGdG5tUDZLZ0lnYVpSQUFBQUFBQUFPQkJZd1JBSUFhcURBRUxRWUNBZ0lCNEN5RWVJQ0pCZm5FaUtFRUJhd0ovSUFWRUp6RUlyQnhhL0QraUlnYVpSQUFBQUFBQUFPQkJZd1JBSUFhcURBRUxRWUNBZ0lCNEN5RWdRWDV4QW44Z0JVUTczMCtObDI3MlA2SWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJU01nSjBFQmF5RXBRUUpxSVFzZ0NVRUNkQ0ViQTBBZ0FDQWJhaUVYSUFJZ0cyb2hGU0FCSUJ0cUlROGdFQ0FiYWlFVElCMEVRQ0FCSUJBb0FnQWlDU0FqYWlJU0lBd2dEQ0FTU2h0QkFDQVNRUUJPR3pZQ0FDQUNJQWtnSG1zaUVpQU1JQXdnRWtvYlFRQWdFa0VBVGhzMkFnQWdBQ0FKSUNCcUlna2dEQ0FKSUF4SUcwRUFJQWxCQUU0Yk5nSUFJQW9vQWdBaEdDQVBBbjhnRGlnQ0FDQVJhN0s3SWdWRU85OVBqWmR1OWoraUlnYVpSQUFBQUFBQUFPQkJZd1JBSUFhcURBRUxRWUNBZ0lCNEN5QVRLQUlBSWdscUloSWdEQ0FNSUJKS0cwRUFJQkpCQUU0Yk5nSUFJQlVnQ1FKL0lCZ2dFV3V5dXlJR1JHcThkSk1ZQk5ZL29pQUZSQXdDSzRjVzJlWS9vcUFpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMYXlJU0lBd2dEQ0FTU2h0QkFDQVNRUUJPR3pZQ0FDQVhBbjhnQmtRbk1RaXNIRnI4UDZJaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElBbHFJZ2tnRENBSklBeElHMEVBSUFsQkFFNGJOZ0lBSUJkQkJHb2hGeUFWUVFScUlSVWdEMEVFYWlFUElCTkJCR29oRXlBQ1FRUnFJUUlnRUVFRWFpRVFJQUZCQkdvaEFTQUFRUVJxSVFBTFFRQWhDU0FvQkVBRFFDQUtLQUlBSVJ3Z0FRSi9JQTRvQWdBZ0VXdXl1eUlGUkR2ZlQ0Mlhidlkvb2lJR21VUUFBQUFBQUFEZ1FXTUVRQ0FHcWd3QkMwR0FnSUNBZUFzZ0VDZ0NBQ0lTYWlJWUlBd2dEQ0FZU2h0QkFDQVlRUUJPR3pZQ0FDQUNJQklDZnlBY0lCRnJzcnNpQmtScXZIU1RHQVRXUDZJZ0JVUU1BaXVIRnRubVA2S2dJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDMnNpR0NBTUlBd2dHRW9iUVFBZ0dFRUFUaHMyQWdBZ0FBSi9JQVpFSnpFSXJCeGEvRCtpSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lBU2FpSVNJQXdnRENBU1NodEJBQ0FTUVFCT0d6WUNBQ0FLS0FJQUlSd2dBUUovSUE0b0FnQWdFV3V5dXlJRlJEdmZUNDJYYnZZL29pSUdtVVFBQUFBQUFBRGdRV01FUUNBR3Fnd0JDMEdBZ0lDQWVBc2dFQ2dDQkNJU2FpSVlJQXdnRENBWVNodEJBQ0FZUVFCT0d6WUNCQ0FDSUJJQ2Z5QWNJQkZyc3JzaUJrUnF2SFNUR0FUV1A2SWdCVV
20FNQWl1SEZ0bm1QNktnSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0QzJzaUdDQU1JQXdnR0VvYlFRQWdHRUVBVGhzMkFnUWdBQUovSUFaRUp6RUlyQnhhL0QraUlnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5QVNhaUlTSUF3Z0RDQVNTaHRCQUNBU1FRQk9HellDQkNBS0tBSUFJUndnRHdKL0lBNG9BZ0FnRVd1eXV5SUZSRHZmVDQyWGJ2WS9vaUlHbVVRQUFBQUFBQURnUVdNRVFDQUdxZ3dCQzBHQWdJQ0FlQXNnRXlnQ0FDSVNhaUlZSUF3Z0RDQVlTaHRCQUNBWVFRQk9HellDQUNBVklCSUNmeUFjSUJGcnNyc2lCa1JxdkhTVEdBVFdQNklnQlVRTUFpdUhGdG5tUDZLZ0lnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEMyc2lHQ0FNSUF3Z0dFb2JRUUFnR0VFQVRoczJBZ0FnRndKL0lBWkVKekVJckJ4YS9EK2lJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUFTYWlJU0lBd2dEQ0FTU2h0QkFDQVNRUUJPR3pZQ0FDQUtLQUlBSVJ3Z0R3Si9JQTRvQWdBZ0VXdXl1eUlGUkR2ZlQ0Mlhidlkvb2lJR21VUUFBQUFBQUFEZ1FXTUVRQ0FHcWd3QkMwR0FnSUNBZUFzZ0V5Z0NCQ0lTYWlJWUlBd2dEQ0FZU2h0QkFDQVlRUUJPR3pZQ0JDQVZJQklDZnlBY0lCRnJzcnNpQmtScXZIU1RHQVRXUDZJZ0JVUU1BaXVIRnRubVA2S2dJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDMnNpR0NBTUlBd2dHRW9iUVFBZ0dFRUFUaHMyQWdRZ0Z3Si9JQVpFSnpFSXJCeGEvRCtpSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lBU2FpSVNJQXdnRENBU1NodEJBQ0FTUVFCT0d6WUNCQ0FPUVFScUlRNGdDa0VFYWlFS0lCZEJDR29oRnlBVlFRaHFJUlVnRDBFSWFpRVBJQk5CQ0dvaEV5QUFRUWhxSVFBZ0FrRUlhaUVDSUFGQkNHb2hBU0FRUVFocUlSQWdDVUVDYWlJSklDaEpEUUFMSUFzaENRc0NRQ0FKSUNKUERRQWdFQ2dDQUNFU0lBOENmeUFmSUFsQkFYWWlHRVlFUUNBQklCSWdJMm9pQ1NBTUlBa2dERWdiUVFBZ0NVRUFUaHMyQWdBZ0FpQVNJQjVySWdrZ0RDQUpJQXhJRzBFQUlBbEJBRTRiTmdJQUlBQWdFaUFnYWlJSklBd2dDU0FNU0J0QkFDQUpRUUJPR3pZQ0FDQVRLQUlBSWdrZ0htc2lEeUFNSUF3Z0Qwb2JRUUFnRDBFQVRoc2hEeUFKSUNCcUlSTWdDU0FqYWlJSklBd2dDU0FNU0J0QkFDQUpRUUJPR3d3QkN5QUtLQUlBSVE4Z0FRSi9JQTRvQWdBZ0VXdXl1eUlGUkR2ZlQ0Mlhidlkvb2lJR21VUUFBQUFBQUFEZ1FXTUVRQ0FHcWd3QkMwR0FnSUNBZUFzZ0Vtb2lDU0FNSUFrZ0RFZ2JRUUFnQ1VFQVRoczJBZ0FnQWlBU0FuOGdEeUFSYTdLN0lnWkVhcngwa3hnRTFqK2lJQVZFREFJcmh4Ylo1aitpb0NJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUF0cklna2dEQ0FKSUF4SUcwRUFJQWxCQUU0Yk5nSUFJQUFDZnlBR1JDY3hDS3djV3Z3L29pSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2dFbW9pQ1NBTUlBa2dERWdiUVFBZ0NVRUFUaHMyQWdBZ0V5Z0NBQ0lKQW44Z0NpZ0NBQ0FSYTdLN0lnVkVhcngwa3hnRTFqK2lJQTRvQWdBZ0VXdXl1eUlHUkF3Q0s0Y1cyZVkvb3FBaUI1bEVBQUFBQUFBQTRFRmpCRUFnQjZvTUFRdEJnSUNBZ0hnTGF5SVBJQXhJSVJNZ0R5QU1JQk1iSVJNZ0QwRUFTQ0VTQW44Z0JrUTczMCtObDI3MlA2SWlCcGxFQUFBQUFBQUE0RUZqQkVBZ0Jxb01BUXRCZ0lDQWdIZ0xJQWxxSWc4Z0RDQU1JQTlLR3lFY0lBOUJBRWdoSkVFQUlCTWdFaHNoRHdKL0lBVkVKekVJckJ4YS9EK2lJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUFKYWlFVFFRQWdIQ0FrR3dzMkFnQWdGU0FQTmdJQUlCY2dFeUFNSUF3Z0Uwb2JRUUFnRTBFQVRoczJBZ0FnQUVFRWFpRUFJQUpCQkdvaEFpQUJRUVJxSVFFZ0VFRUVhaUVRSUJnZ0gwOE5BQ0FPUVFScUlRNGdDa0VFYWlFS0N5QUFJQnRxSVFBZ0FpQWJhaUVDSUFFZ0cyb2hBU0FRSUJ0cUlSQWdKVUVDYWlJbElDZEpEUUFMSUNsQmZuRkJBbW9GUVFBTElDWlBEUUFnSFFSQUlBRUNmMEVBSUJGcnNyc2lCVVE3MzArTmwyNzJQNklpQnBsRUFBQUFBQUFBNEVGakJFQWdCcW9NQVF0QmdJQ0FnSGdMSUJBb0FnQWlDV29pQ3lBTUlBc2dERWdiUVFBZ0MwRUFUaHMyQWdBZ0FpQUpBbjhnQlVScXZIU1RHQVRXUDZJZ0JVUU1BaXVIRnRubVA2S2dJZ2FaUkFBQUFBQUFBT0JCWXdSQUlBYXFEQUVMUVlDQWdJQjRDMnNpQ3lBTUlBc2dERWdiUVFBZ0MwRUFUaHMyQWdBZ0FBSi9JQVZFSnpFSXJCeGEvRCtpSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lBSmFpSUpJQXdnQ1NBTVNCdEJBQ0FKUVFCT0d6WUNBQ0FDUVFScUlRSWdFRUVFYWlFUUlBRkJCR29oQVNBQVFRUnFJUUFMSUNJZ0lrRitjU0liQkg4Z0cwRUJheUlKUVg1eEFrQUNmMEVBSUJ0QkQwa05BQnBCQUNBQklBSWdDVUVCZGlJVlFRTjBRUWhxSWhOcUlnbEpJQUlnQVNBVGFpSUxTWEVOQUJwQkFDQUFJQXRKSUFFZ0FDQVRhaUlQU1hFTkFCcEJBQ0FCSUJBZ0Uyb2lFMGtnQ3lBUVMzRU5BQnBCQUNBS0lBdEpJQUVnQ2lBVlFRSjBRUVJxSWhKcUloZEpjUTBBR2tFQUlBc2dEa3NnQVNBT0lCSnFJZ3RKY1EwQUdrRUFJQUlnRDBrZ0FDQUpTWEVOQUJwQkFDQUNJQk5KSUFrZ0VFdHhEUUFhUVFBZ0FpQVhTU0FKSUFwTGNRMEFHa0VBSUFJZ0Mwa2dDU0FPUzNFTkFCcEJBQ0FBSUJOSklBOGdFRXR4RFFBYVFRQWdBQ0FYU1NBS0lBOUpjUTBBR2tFQUlBQWdDMGtnRGlBUFNYRU5BQm9nQ2lBVlFRRnFJaVZCL1AvLy93ZHhJaGRCQW5RaUptb2hDU0FBSUJkQkEzUWlFbW9oQ3lBQklCSnFJUThnRFAwUklUd2dFZjBSSVVCQkFDRVZBMEFnRUNBVlFRTjBJaE5CR0hJaUhXb2lKeUFRSUJOQkVISWlIbW9pS0NBUUlCTkJDSElpSUdvaUdDQVFJQk5xSWluOVhBSUEvVllDQUFIOVZnSUFBdjFXQWdBRElUb0NmeUFPSUJWQkFuUWlIR3I5QUFJQUlFRDlzUUg5K2dFaU8vMWZJajM5RER2ZlQ0MlhidlkvTzk5UGpaZHU5ai85OGdFaVB2MGhBU0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNoSkNBS0lCeHEvUUFDQUNFL0lBRWdFMm9pSFAwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBNkFuOGdQdjBoQUNJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUF2OUVTQWsvUndCQW44Z095QTcvUTBJQ1FvTERBME9Ed0FCQWdNQUFRSUQvVjhpUHYwTU85OVBqWmR1OWo4NzMwK05sMjcyUC8zeUFTSTcvU0VBSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Qy8wY0FnSi9JRHY5SVFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTC9Sd0RJa0g5cmdFaU95QTgvYllCSUR2OURBQUFBQUFBQUFBQUFBQUFBQUFBQUFEOU9mMVNJanY5V2dJQUFDQUJJQ0JxSWlRZ08vMWFBZ0FCSUFFZ0htb2lMQ0E3L1ZvQ0FBSWdBU0FkYWlJdElE
20djlXZ0lBQXdKL0lEOGdRUDJ4QWYzNkFTSTcvVjhpUC8wTWFyeDBreGdFMWo5cXZIU1RHQVRXUC8zeUFTQTkvUXdNQWl1SEZ0bm1Qd3dDSzRjVzJlWS8vZklCL2ZBQklqMzlJUUVpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMSVNvZ0FpQVRhaUl1L1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBSURvQ2Z5QTkvU0VBSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Qy8wUklDcjlIQUVDZnlBNy9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQS9RMElDUW9MREEwT0R3QUJBZ01BQVFJRC9WOGlQZjBNYXJ4MGt4Z0UxajlxdkhTVEdBVFdQLzN5QVNBKy9Rd01BaXVIRnRubVB3d0NLNGNXMmVZLy9mSUIvZkFCSWp2OUlRQWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0wvUndDQW44Z08vMGhBU0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXY5SEFNaVB2MnhBU0k3SUR6OXRnRWdPLzBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDA1L1ZJaU8vMWFBZ0FBSUFJZ0lHb2lLaUE3L1ZvQ0FBRWdBaUFlYWlJdklEdjlXZ0lBQWlBQ0lCMXFJakFnTy8xYUFnQURBbjhnUC8wTUp6RUlyQnhhL0Q4bk1RaXNIRnI4UC8zeUFTSTcvU0VCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lFcklBQWdFMm9pRS8wTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBNkFuOGdPLzBoQUNJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUF2OUVTQXIvUndCQW44Z1BmME1KekVJckJ4YS9EOG5NUWlzSEZyOFAvM3lBU0k2L1NFQUlnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEMvMGNBZ0ovSURyOUlRRWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0wvUndESWozOXJnRWlPaUE4L2JZQklEcjlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDlPZjFTSWpyOVdnSUFBQ0FBSUNCcUlpQWdPdjFhQWdBQklBQWdIbW9pSGlBNi9Wb0NBQUlnQUNBZGFpSWRJRHI5V2dJQUF5QWMvUXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQ2RCQkdvZ0tFRUVhaUFZUVFScUlDbjlYQUlFL1ZZQ0FBSDlWZ0lBQXYxV0FnQURJanNnUWYydUFTSTZJRHo5dGdFZ092ME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFQMDUvVklpT3YxYUFnUUFJQ1FnT3YxYUFnUUJJQ3dnT3YxYUFnUUNJQzBnT3YxYUFnUURJQzc5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnT3lBKy9iRUJJam9nUFAyMkFTQTYvUXdBQUFBQUFBQUFBQUFBQUFBQUFBQUEvVG45VWlJNi9Wb0NCQUFnS2lBNi9Wb0NCQUVnTHlBNi9Wb0NCQUlnTUNBNi9Wb0NCQU1nRS8wTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBN0lEMzlyZ0VpT2lBOC9iWUJJRHI5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUQ5T2YxU0lqcjlXZ0lFQUNBZ0lEcjlXZ0lFQVNBZUlEcjlXZ0lFQWlBZElEcjlXZ0lFQXlBVlFRUnFJaFVnRjBjTkFBc2dEaUFtYWlFT0lCQWdFbW9oRUNBQ0lCSnFJUUlnRnlBbFJnUkFJQThoQVNBTElRQWdDU0VLREFJTElBOGhBU0FMSVFBZ0NTRUtJQmRCQVhRTElROERRQ0FLS0FJQUlSTWdBUUovSUE0b0FnQWdFV3V5dXlJRlJEdmZUNDJYYnZZL29pSUdtVVFBQUFBQUFBRGdRV01FUUNBR3Fnd0JDMEdBZ0lDQWVBc2dFQ2dDQUNJSmFpSUxJQXdnQ3lBTVNCdEJBQ0FMUVFCT0d6WUNBQ0FDSUFrQ2Z5QVRJQkZyc3JzaUJrUnF2SFNUR0FUV1A2SWdCVVFNQWl1SEZ0bm1QNktnSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0QzJzaUN5QU1JQXNnREVnYlFRQWdDMEVBVGhzMkFnQWdBQUovSUFaRUp6RUlyQnhhL0QraUlnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5QUphaUlKSUF3Z0NTQU1TQnRCQUNBSlFRQk9HellDQUNBS0tBSUFJUk1nQVFKL0lBNG9BZ0FnRVd1eXV5SUZSRHZmVDQyWGJ2WS9vaUlHbVVRQUFBQUFBQURnUVdNRVFDQUdxZ3dCQzBHQWdJQ0FlQXNnRUNnQ0JDSUphaUlMSUF3Z0N5QU1TQnRCQUNBTFFRQk9HellDQkNBQ0lBa0NmeUFUSUJGcnNyc2lCa1JxdkhTVEdBVFdQNklnQlVRTUFpdUhGdG5tUDZLZ0lnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEMyc2lDeUFNSUFzZ0RFZ2JRUUFnQzBFQVRoczJBZ1FnQUFKL0lBWkVKekVJckJ4YS9EK2lJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUFKYWlJSklBd2dDU0FNU0J0QkFDQUpRUUJPR3pZQ0JDQU9RUVJxSVE0Z0NrRUVhaUVLSUFCQkNHb2hBQ0FDUVFocUlRSWdBVUVJYWlFQklCQkJDR29oRUNBUFFRSnFJZzhnRzBrTkFBc0xRUUpxQlVFQUN5SUxUUTBBSUJBb0FnQWhDUUo4SUI4Z0MwRUJka1lFUUFKL1FRQWdFV3V5dXlJRlJEdmZUNDJYYnZZL29pSUdtVVFBQUFBQUFBRGdRV01FUUNBR3Fnd0JDMEdBZ0lDQWVBc2dDV29pQ2lBTUlBb2dERWdiUVFBZ0NrRUFUaHNoRGlBRkRBRUxBbjhnRGlnQ0FDQVJhN0s3SWdWRU85OVBqWmR1OWoraUlnYVpSQUFBQUFBQUFPQkJZd1JBSUFhcURBRUxRWUNBZ0lCNEN5QUphaUlMSUF3Z0N5QU1TQnRCQUNBTFFRQk9HeUVPSUFvb0FnQWdFV3V5dXdzaEJpQUJJQTQyQWdBZ0FpQUpBbjhnQmtScXZIU1RHQVRXUDZJZ0JVUU1BaXVIRnRubVA2S2dJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDMnNpQVNBTUlBRWdERWdiUVFBZ0FVRUFUaHMyQWdBZ0FBSi9JQVpFSnpFSXJCeGEvRCtpSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lBSmFpSUFJQXdnQUNBTVNCdEJBQ0FBUVFCT0d6WUNBQXNnRmlnQ0dDZ0NMQkFVSUJZb0FoZ2lBQ0FJTmdJc0lBQW9BbUFRRkNBV0tBSVlJZ0FnRFRZQ1lDQUFLQUtVQVJBVUlCWW9BaGdpQUNBVU5nS1VBU0FBSUFEOUFBSUFJano5Q3dKb0lBQWdQUDBMQWpRZ0ZrRUJOZ0lVQ3d3SEN5QUJLQUlFUVFGSERRRWdBU2dDT0VFQlJ3MEJJQUVvQW14QkFVY05BU0FCS0FJWUlRQWdBU2dDbEFFaEFpQUJLQUpnSVFzZ0FTZ0NMQ0VPSUFFb0Fqd2hJQ0FCS0FJSUlnb2dBU2dDRENJamJFRUNkQ0lCRUJ3aER5QUJFQndoRmlBQkVCd2hEQ0FQUlEwRklCWkZEUVVnREVVTkJTQWpCRUFnQ2lBVUtBSUFRUUZ4SWl4cklTVUNmMEVBUVFFZ0FFRUJhM1FpRTJ1eXV5SUZSR3E4ZEpNWUJOWS9vaUFGUkF3Q0s0Y1cyZVkvb3FBaUJwbEVBQUFBQUFBQTRFRmpCRUFnQnFvTUFRdEJnSUNBZ0hnTElTWkJmeUFBZENBbFFYNXhJaUpCQVdzaUNrRUJkaUlBUVFGcUlTY0NmeUFGUkNjeENLd2NXdncvb2lJR21VUUFBQUFBQUFEZ1FXTUVRQ0FHcWd3QkMwR0FnSUNBZUFzaEtDQUtRWDV4SVFvZ0FFRUNkQ0VJSUFCQkEzUWhBQ0FuUVh4eElSZEJmM01oRVFKL0lBVkVPOTlQalpkdTlqK2lJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVZSUFwQkFtb2hLU0FJUVFScUlSd2dBRUVJYWlFYklCZEJBblFoSkNBWFFRTjBJUklnRjBFQmRDRVFJQkg5RVNFOElCUDlFU0ZBSUNKQkIwa2hMU0FQSVFvZ0ZpRUFJQXdoQ0FOQUlDd0VRQ0FLSUE0b0FnQWlBU0FZYWlJTklCRWdEU0FSU0J0QkFDQU5RUUJPR3pZQ0FDQUFJQUVnSm1zaURTQVJJQTBnRVVnYlFRQWdEVUVBVGhzMkFnQWdDQ0FCSUNocUlnRWdFU0FCSUJGSUcwRUFJQUZCQUU0Yk5nSUFJQWhCQkdvaENDQUtRUVJxSVFvZ0RrRUVhaUVPSUFCQkJHb2hBQXNDZndKL0lDSkZCRUFnQ3lFSklBZ2hBU0FLSVExQkFBd0JDMEVBSVJrQ1FBSkFJQzBOQUNBS0lBQWdHMm9pQVVrZ0FDQUtJQnRxSWcxSmNRMEFJQWdnRFVrZ0NpQUlJQnRxSWdsSmNRMEFJQW9nRGlBYmFpSVZTU0FOSUE1TGNRMEFJQXNnRFVrZ0NpQUxJQnhxSWg5SmNRMEFJQUl
20nRFVrZ0NpQUNJQnhxSWcxSmNRMEFJQUFnQ1VrZ0FTQUlTM0VOQUNBQUlCVkpJQUVnRGt0eERRQWdBQ0FmU1NBQklBdExjUTBBSUFBZ0RVa2dBU0FDUzNFTkFDQUlJQlZKSUFrZ0RrdHhEUUFnQ0NBZlNTQUpJQXRMY1EwQUlBSWdDVWtnQ0NBTlNYRU5BQ0FMSUNScUlRa2dDQ0FTYWlFQklBb2dFbW9oRFFOQUlBNGdHVUVEZENJVlFSaHlJaDlxSWlvZ0RpQVZRUkJ5SWgxcUlpNGdEaUFWUVFoeUloNXFJaThnRGlBVmFpSXcvVndDQVAxV0FnQUIvVllDQUFMOVZnSUFBeUU2QW44Z0FpQVpRUUowSWl0cS9RQUNBQ0JBL2JFQi9mb0JJanY5WHlJOS9RdzczMCtObDI3MlB6dmZUNDJYYnZZLy9mSUJJajc5SVFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElURWdDeUFyYXYwQUFnQWhQeUFLSUJWcUlpdjlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdPZ0ovSUQ3OUlRQWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0wvUkVnTWYwY0FRSi9JRHNnTy8wTkNBa0tDd3dORGc4QUFRSURBQUVDQS8xZklqNzlERHZmVDQyWGJ2WS9POTlQalpkdTlqLzk4Z0VpTy8waEFDSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBdjlIQUlDZnlBNy9TRUJJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDLzBjQXlKQi9hNEJJanNnUFAyMkFTQTcvUXdBQUFBQUFBQUFBQUFBQUFBQUFBQUEvVG45VWlJNy9Wb0NBQUFnQ2lBZWFpSXhJRHY5V2dJQUFTQUtJQjFxSWpNZ08vMWFBZ0FDSUFvZ0gyb2lOQ0E3L1ZvQ0FBTUNmeUEvSUVEOXNRSDkrZ0VpTy8xZklqLzlER3E4ZEpNWUJOWS9hcngwa3hnRTFqLzk4Z0VnUGYwTURBSXJoeGJaNWo4TUFpdUhGdG5tUC8zeUFmM3dBU0k5L1NFQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RXlJQUFnRldvaU5mME1BQUFBQUFBQUFBQUFBQUFBQUFBQUFDQTZBbjhnUGYwaEFDSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBdjlFU0F5L1J3QkFuOGdPLzBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDBOQ0FrS0N3d05EZzhBQVFJREFBRUNBLzFmSWozOURHcThkSk1ZQk5ZL2FyeDBreGdFMWovOThnRWdQdjBNREFJcmh4Ylo1ajhNQWl1SEZ0bm1QLzN5QWYzd0FTSTcvU0VBSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Qy8wY0FnSi9JRHY5SVFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTC9Sd0RJajc5c1FFaU95QTgvYllCSUR2OURBQUFBQUFBQUFBQUFBQUFBQUFBQUFEOU9mMVNJanY5V2dJQUFDQUFJQjVxSWpJZ08vMWFBZ0FCSUFBZ0hXb2lOaUE3L1ZvQ0FBSWdBQ0FmYWlJM0lEdjlXZ0lBQXdKL0lELzlEQ2N4Q0t3Y1d2dy9KekVJckJ4YS9ELzk4Z0VpTy8waEFTSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2hPQ0FJSUJWcUloWDlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdPZ0ovSUR2OUlRQWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0wvUkVnT1AwY0FRSi9JRDM5RENjeENLd2NXdncvSnpFSXJCeGEvRC85OGdFaU92MGhBQ0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXY5SEFJQ2Z5QTYvU0VCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Qy8wY0F5STkvYTRCSWpvZ1BQMjJBU0E2L1F3QUFBQUFBQUFBQUFBQUFBQUFBQUFBL1RuOVVpSTYvVm9DQUFBZ0NDQWVhaUllSURyOVdnSUFBU0FJSUIxcUloMGdPdjFhQWdBQ0lBZ2dIMm9pSHlBNi9Wb0NBQU1nSy8wTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBcVFRUnFJQzVCQkdvZ0wwRUVhaUF3L1Z3Q0JQMVdBZ0FCL1ZZQ0FBTDlWZ0lBQXlJN0lFSDlyZ0VpT2lBOC9iWUJJRHI5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUQ5T2YxU0lqcjlXZ0lFQUNBeElEcjlXZ0lFQVNBeklEcjlXZ0lFQWlBMElEcjlXZ0lFQXlBMS9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUlEc2dQdjJ4QVNJNklEejl0Z0VnT3YwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAwNS9WSWlPdjFhQWdRQUlESWdPdjFhQWdRQklEWWdPdjFhQWdRQ0lEY2dPdjFhQWdRRElCWDlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdPeUE5L2E0Qklqb2dQUDIyQVNBNi9Rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQS9UbjlVaUk2L1ZvQ0JBQWdIaUE2L1ZvQ0JBRWdIU0E2L1ZvQ0JBSWdIeUE2L1ZvQ0JBTWdHVUVFYWlJWklCZEhEUUFMSUFJZ0pHb2hBaUFPSUJKcUlRNGdBQ0FTYWlFQUlCQWhHU0FwSUJjZ0owWU5BaG9NQVFzZ0NpRU5JQWdoQVNBTElRa0xBMEFnQ1NnQ0FDRUxJQTBDZnlBQ0tBSUFJQk5yc3JzaUJVUTczMCtObDI3MlA2SWlCcGxFQUFBQUFBQUE0RUZqQkVBZ0Jxb01BUXRCZ0lDQWdIZ0xJQTRvQWdBaUNtb2lDQ0FSSUFnZ0VVZ2JRUUFnQ0VFQVRoczJBZ0FnQUNBS0FuOGdDeUFUYTdLN0lnWkVhcngwa3hnRTFqK2lJQVZFREFJcmh4Ylo1aitpb0NJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUF0cklnZ2dFU0FJSUJGSUcwRUFJQWhCQUU0Yk5nSUFJQUVDZnlBR1JDY3hDS3djV3Z3L29pSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2dDbW9pQ2lBUklBb2dFVWdiUVFBZ0NrRUFUaHMyQWdBZ0NTZ0NBQ0VMSUEwQ2Z5QUNLQUlBSUJOcnNyc2lCVVE3MzArTmwyNzJQNklpQnBsRUFBQUFBQUFBNEVGakJFQWdCcW9NQVF0QmdJQ0FnSGdMSUE0b0FnUWlDbW9pQ0NBUklBZ2dFVWdiUVFBZ0NFRUFUaHMyQWdRZ0FDQUtBbjhnQ3lBVGE3SzdJZ1pFYXJ4MGt4Z0UxaitpSUFWRURBSXJoeGJaNWoraW9DSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBdHJJZ2dnRVNBSUlCRklHMEVBSUFoQkFFNGJOZ0lFSUFFQ2Z5QUdSQ2N4Q0t3Y1d2dy9vaUlGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNnQ21vaUNpQVJJQW9nRVVnYlFRQWdDa0VBVGhzMkFnUWdBa0VFYWlFQ0lBbEJCR29oQ1NBQlFRaHFJUUVnQUVFSWFpRUFJQTFCQ0dvaERTQU9RUWhxSVE0Z0dVRUNhaUlaSUNKSkRRQUxJQ2tMSWdnZ0pVOEVRQ0FCSVFnZ0RTRUtJQWtNQVFzZ0RpZ0NBQ0VLQW44Z0lDQUlRUUYySWhsR0JFQWdDaUFtYXlJSUlCRWdDQ0FSU0J0QkFDQUlRUUJPR3lFTElBb2dHR29pQ0NBUklBZ2dFVWdiUVFBZ0NFRUFUaHNoQ0NBb0RBRUxJQW9DZnlBSktBSUFJQk5yc3JzaUJVUnF2SFNUR0FUV1A2SWdBaWdDQUNBVGE3SzdJZ1pFREFJcmh4Ylo1aitpb0NJSG1VUUFBQUFBQUFEZ1FXTUVRQ0FIcWd3QkMwR0FnSUNBZUF0cklnZ2dFVWdoQ3lBSUlCRWdDeHRCQUNBSVFRQk9HeUVMQW44Z0JrUTczMCtObDI3MlA2SWlCcGxFQUFBQUFBQUE0RUZqQkVBZ0Jxb01BUXRCZ0lDQWdIZ0xJQXBxSWdnZ0VTQUlJQkZJRzBFQUlBaEJBRTRiSVFnQ2Z5QUZSQ2N4Q0t3Y1d2dy9vaUlGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNMSVJVZ0RTQUlOZ0lBSUFBZ0N6WUNBQ0FCSUFvZ0ZXb2lDaUFSSUFvZ0VVZ2JRUUFnQ2tFQVRoczJBZ0FnQVVFRWFpRUlJQUJCQkdvaEFDQU5RUVJxSVFvZ0RrRUVhaUVPSUFrZ0dTQWdUdzBBR2lBQ1FRUnFJUUlnQ1VFRWFnc2hDeUE1UVFGcUlqa2dJMGNOQUFzTElCUW9BaGdvQWl3UUZDQVVLQUlZSWdBZ0R6WUNMQ0FBS0FKZ0VCUWdGQ2dDR0NJQUlCWTJBbUFnQUNnQ2xBRVFGQ0FVS0FJWUlnQWdERFlDbEFFZ0FDQUEvUUFDQUNJOC9Rc0NhQ0FBSUR6OUN3STBJQlJCQVRZQ0ZFRUFJUmtNQmdzZ0FTZ0N
20hRUVCUncwQUlBRW9BZ1JCQVVjTkFDQUJLQUk0UVFGSERRQWdBU2dDYkVFQlJ3MEFJQUVvQWhnaEFpQUJLQUtVQVNFSklBRW9BbUFoRGlBQktBSXNJUUFnQVNnQ0RDQUJLQUlJYkNJTVFRSjBJZ0VRSENFSUlBRVFIQ0VQSUFFUUhDRUxBa0FnQ0VVTkFDQVBSUTBBSUF0RkRRQWdERVVOQkVGL0lBSjBRWDl6SVJsQkFTQUNRUUZyZENFVElBeEJDRWtOQWlBUElBaHJRUkJKRFFJZ0N5QUlhMEVRU1EwQ0lBZ2dBR3RCRUVrTkFpQUlJQTVyUVJCSkRRSWdDQ0FKYTBFUVNRMENJQXNnRDJ0QkVFa05BaUFQSUFCclFSQkpEUUlnRHlBT2EwRVFTUTBDSUE4Z0NXdEJFRWtOQWlBTElBQnJRUkJKRFFJZ0N5QU9hMEVRU1EwQ0lBc2dDV3RCRUVrTkFpQUpJQXhCZkhFaUNrRUNkQ0lRYWlFTklBc2dFR29oQVNBSUlCQnFJUUlnR2YwUklUd2dFLzBSSVRvRFFBSi9JQWtnRmtFQ2RDSVJhdjBBQWdBZ092MnhBZjM2QVNJNy9WOGlQZjBNTzk5UGpaZHU5ajg3MzArTmwyNzJQLzN5QVNJKy9TRUJJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVWSUE0Z0VXcjlBQUlBSVQ4Z0NDQVJhdjBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FBSUJGcS9RQUNBQ0pBQW44Z1B2MGhBQ0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXY5RVNBVi9Sd0JBbjhnT3lBNy9RMElDUW9MREEwT0R3QUJBZ01BQVFJRC9WOGlPLzBNTzk5UGpaZHU5ajg3MzArTmwyNzJQLzN5QVNJKy9TRUFJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDLzBjQWdKL0lENzlJUUVpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdML1J3RC9hNEJJajRnUFAyMkFTQSsvUXdBQUFBQUFBQUFBQUFBQUFBQUFBQUEvVG45VXYwTEFnQUNmeUEvSURyOXNRSDkrZ0VpUHYxZklqLzlER3E4ZEpNWUJOWS9hcngwa3hnRTFqLzk4Z0VnUGYwTURBSXJoeGJaNWo4TUFpdUhGdG5tUC8zeUFmM3dBU0k5L1NFQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RVZJQThnRVdyOURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ1FBSi9JRDM5SVFBaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTC9SRWdGZjBjQVFKL0lENzlEQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDlEUWdKQ2dzTURRNFBBQUVDQXdBQkFnUDlYeUk5L1F4cXZIU1RHQVRXUDJxOGRKTVlCTlkvL2ZJQklEdjlEQXdDSzRjVzJlWS9EQUlyaHhiWjVqLzk4Z0g5OEFFaU8vMGhBQ0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXY5SEFJQ2Z5QTcvU0VCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Qy8wY0EvMnhBU0k3SUR6OXRnRWdPLzBNQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDA1L1ZMOUN3SUFBbjhnUC8wTUp6RUlyQnhhL0Q4bk1RaXNIRnI4UC8zeUFTSTcvU0VCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lFVklBc2dFV3I5REFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnUUFKL0lEdjlJUUFpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdML1JFZ0ZmMGNBUUovSUQzOURDY3hDS3djV3Z3L0p6RUlyQnhhL0QvOThnRWlPLzBoQUNJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUF2OUhBSUNmeUE3L1NFQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEMvMGNBLzJ1QVNJN0lEejl0Z0VnTy8wTUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAwNS9WTDlDd0lBSUJaQkJHb2lGaUFLUncwQUN5QUtJQXhHRFFRZ0RpQVFhaUVPSUFBZ0VHb2hBQ0FQSUJCcURBTUxJQWdRRkNBUEVCUWdDeEFVREFVTElCcEJ6d00yQWdRZ0drRzRDallDQUVHd3l3RkJvOEFBSUJvUUdnd0VDeUFJSVFJZ0N5RUJJQWtoRFNBUEN5RUpBMEFnRGlnQ0FDRVJJQUlDZnlBTktBSUFJQk5yc3JzaUJVUTczMCtObDI3MlA2SWlCcGxFQUFBQUFBQUE0RUZqQkVBZ0Jxb01BUXRCZ0lDQWdIZ0xJQUFvQWdBaUZtb2lFQ0FaSUJBZ0dVZ2JRUUFnRUVFQVRoczJBZ0FnQ1NBV0FuOGdFU0FUYTdLN0lnWkVhcngwa3hnRTFqK2lJQVZFREFJcmh4Ylo1aitpb0NJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUF0ckloQWdHU0FRSUJsSUcwRUFJQkJCQUU0Yk5nSUFJQUVDZnlBR1JDY3hDS3djV3Z3L29pSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2dGbW9pRmlBWklCWWdHVWdiUVFBZ0ZrRUFUaHMyQWdBZ0FVRUVhaUVCSUFsQkJHb2hDU0FDUVFScUlRSWdEVUVFYWlFTklBNUJCR29oRGlBQVFRUnFJUUFnQ2tFQmFpSUtJQXhIRFFBTEN5QVVLQUlZS0FJc0VCUWdGQ2dDR0NJQUlBZzJBaXdnQUNnQ1lCQVVJQlFvQWhnaUFDQVBOZ0pnSUFBb0FwUUJFQlFnRkNnQ0dDQUxOZ0tVQVNBVVFRRTJBaFJCQUNFWkRBRUxJQThRRkNBV0VCUWdEQkFVQ3lBYUtBSWdJUUFDUUNBRERRQWdJVVVOQUNBQUtBSVlJUlJCQUNFV0EwQWdGQ0FXUVRSc2FpSURLQUlZSWdKQkNFY0VRQUpBSUFKQkIwMEVRQ0FES0FJTUlBTW9BZ2hzSVFFZ0F5Z0NMQ0VJSUFNb0FpQUVRQ0FCUlEwQ1FRRWdBa0VCYTNTdElVSkJBQ0VLSUFGQkJFOEVRQ0FCUVh4eElRb2dRdjBTSVR4QkFDRU9BMEFnQ0NBT1FRSjBhaUlDSUFMOUFBSUFJanI5eHdGQkIvM0xBU0k3L1IwQUlEejlIUUFpUTMvOUVpQTcvUjBCSUR6OUhRRWlSSC85SGdFZ09pQTgvUTBJQ1FvTERBME9Ed0FCQWdNQUFRSUQvY2NCUVFmOXl3RWlPdjBkQUNCRGYvMFNJRHI5SFFFZ1JILzlIZ0g5RFFBQkFnTUlDUW9MRUJFU0V4Z1pHaHY5Q3dJQUlBNUJCR29pRGlBS1J3MEFDeUFCSUFwR0RRTUxBMEFnQ0NBS1FRSjBhaUlDSUFJMEFnQkNCNFlnUW44K0FnQWdDa0VCYWlJS0lBRkhEUUFMREFJTElBRkZEUUZCZnlBQ2RFRi9jNjBoUWtFQUlRb2dBVUVFVHdSQUlBRkJmSEVoQ2lCQy9SSWhQRUVBSVE0RFFDQUlJQTVCQW5ScUlnSWdBdjBBQWdBaU92M0pBZjBNL3dBQUFBQUFBQUQvQUFBQUFBQUFBUDNWQVNJNy9SMEFJRHo5SFFBaVE0RDlFaUE3L1IwQklEejlIUUVpUklEOUhnRWdPaUE4L1EwSUNRb0xEQTBPRHdBQkFnTUFBUUlEL2NrQi9Rei9BQUFBQUFBQUFQOEFBQUFBQUFBQS9kVUJJanI5SFFBZ1E0RDlFaUE2L1IwQklFU0EvUjRCL1EwQUFRSURDQWtLQ3hBUkVoTVlHUm9iL1FzQ0FDQU9RUVJxSWc0Z0NrY05BQXNnQVNBS1JnMENDd05BSUFnZ0NrRUNkR29pQWlBQ05RSUFRdjhCZmlCQ2dENENBQ0FLUVFGcUlnb2dBVWNOQUFzTUFRc2dBa0VJYXlFSUlBTW9BZ3dnQXlnQ0NHd2hBU0FES0FJc0lRMGdBeWdDSUFSQUlBRkZEUUZCQUNFS0lBRkJCRThFUUNBQlFYeHhJUXBCQUNFQ0EwQWdEU0FDUVFKMGFpSUpJQW45QUFJQUlBajlyQUg5Q3dJQUlBSkJCR29pQWlBS1J3MEFDeUFCSUFwR0RRSUxBMEFnRFNBS1FRSjBhaUlDSUFJb0FnQWdDSFUyQWdBZ0NrRUJhaUlLSUFGSERRQUxEQUVMSUFGRkRRQkJBQ0VLSUFGQkJFOEVRQ0FCUVh4eElRcEJBQ0VDQTBBZ0RTQUNRUUowYWlJSklBbjlBQUlBSUFqOXJRSDlDd0lBSUFKQkJHb2lBaUFLUncwQUN5QUJJQXBHRFFFTEEwQWdEU0FLUVFKMGFpSUNJQUlvQWdBZ0NIWTJBZ0FnQ2tFQmFpSUtJQUZIRFFBTEN5QURRUWcyQWhnTElCWkJBV29pRmlBaFJ3MEFDd3NnQUNnQ0RDQUFLQUlJYkNFQkFrQWdHVVVFUUNBQUtBSVVRUU
20pHQkVBZ0FDZ0NFRUVCUmdSQUlBQW9BaGdvQWl3Z0FSQVNEQU1MSUFSRkRRSWdBQ2dDR0NJQUtBSXNJQUFvQW1BZ0FSQUlEQUlMSUFBb0FoZ2lBQ2dDTENBQUtBSmdJQUFvQXBRQklBRVFCd3dCQ3dKQUFrQUNRQ0FoUVFGckRnUUFBd0VDQXdzZ0FDZ0NHQ2dDTENBQkVBWU1BZ3NnQUNnQ0dDSUFLQUlzSUFBb0FtQWdBQ2dDbEFFZ0FSQUZEQUVMSUFBb0FoZ2lBQ2dDTENBQUtBSmdJQUFvQXBRQklBQW9Bc2dCSUFFUUJBc2dHaWdDSUJBbFFRQWhEZ3NnR2tIZ3dBQnFKQUFnRGdzSUFFRUlJQUFRS1F1ckFnSUNmZ0ovUW44aEF5QUFMUUJFUVFoeFJRUkFJQUFnQUNnQ0lDSUdOZ0lrQWtBQ1FBSkFJQUFnQUNnQ01DSUZCSDhEUUNBR0lBVWdBQ2dDQUNBQUtBSVVFUUFBSWdWQmYwWU5BaUFBSUFBb0FpUWdCV29pQmpZQ0pDQUFJQUFvQWpBZ0JXc2lCVFlDTUNBRkRRQUxJQUFvQWlBRklBWUxOZ0lrSUFGQ0FGVU5BVUlBSVFNTUFnc2dBQ0FBS0FKRVFRaHlOZ0pFSUFKQkJFSFArUUJCQUJBVElBQkJBRFlDTUNBQUlBQW9Ba1JCQ0hJMkFrUkNmdzhMUWdBaEF3TkFJQUVnQUNnQ0FDQUFLQUlZRVEwQUlnUkNmMUVFUUNBQ1FRUkJ3UGtBUVFBUUV5QUFJQUFvQWtSQkNISTJBa1FnQUNBQUtRTTRJQU44TndNNFFuOGdBeUFEVUJzUEN5QURJQVI4SVFNZ0FTQUVmU0lCUWdCVkRRQUxDeUFBSUFBcEF6Z2dBM3czQXpnTElBTUxJd0VCZnlBQklBRW9BZ0FnQVNnQ0NDSUJJQUNuSWdJZ0FTQUNTUnRxTmdJRVFRRUxQQUlDZndGK0lBRW9BZ0FnQVNnQ0NHb2lBeUFCS0FJRUlnSkdCRUJDZnc4TElBRWdBaUFBcDJvMkFnUWdBQ0FESUFKcnJDSUVJQUFnQkZNYkM1c0JBUVYvUVFFZ0FpZ0NDQ0lISUFkQkFVMGJJUVFnQWlnQ0JDSURJQUlvQWdCcklRWURRQ0FFSWdWQkFYUWhCQ0FGSUFacklBRkpEUUFMSUFVZ0IwY0VRQ0FGRUJnaUEwVUVRRUYvRHdzZ0FpZ0NBQ0lFQkVBZ0F5QUVJQVlRRmhvZ0FpZ0NBQkFVQ3lBQ0lBVTJBZ2dnQWlBRE5nSUFJQUlnQXlBR2FpSUROZ0lFQ3lBRElBQWdBUkFXR2lBQ0lBSW9BZ1FnQVdvMkFnUWdBUXVPQXdJQ2ZnSi9JQUFvQWpBaUJTQUJweUlHVHdSQUlBQWdCU0FHYXpZQ01DQUFJQUFvQWlRZ0JtbzJBaVFnQUNBQUtRTTRJQUY4TndNNElBRVBDeUFBTFFCRVFRUnhCRUFnQUVFQU5nSXdJQUFnQUNnQ0pDQUZhallDSkNBQUlBV3RJZ0VnQUNrRE9IdzNBemdnQVVKL0lBVWJEd3NDUUNBRlJRUkFEQUVMSUFCQkFEWUNNQ0FBSUFBb0FpQTJBaVFnQVNBRnJTSURmU0VCQ3lBQlFnQlZCRUFEUUNBQUtRTUlJQUFwQXpnZ0FTQURmSHhVQkVBZ0FrRUVRZW41QUVFQUVCTWdBRUVBTmdJd0lBQWdBQ2dDSURZQ0pDQUFJQUFwQXpnZ0Ezd2lBemNET0NBQUtRTUlJZ0VnQTMwaEJDQUJJQUFvQWdBZ0FDZ0NIQkVMQUNBQUtBSkVJUVVFUUNBQUlBRTNBemdMSUFBZ0JVRUVjallDUkVKL0lBUWdBU0FEVVJzUEN5QUJJQUFvQWdBZ0FDZ0NHQkVOQUNJRVFuOVJCRUFnQWtFRVFlbjVBRUVBRUJNZ0FDQUFLQUpFUVFSeU5nSkVJQUFnQUNrRE9DQURmRGNET0VKL0lBTWdBMUFiRHdzZ0F5QUVmQ0VESUFFZ0JIMGlBVUlBVlEwQUN3c2dBQ0FBS1FNNElBTjhOd000SUFNTFJnRUNmeUFDS0FJQUlBSW9BZ2hxSWdRZ0FpZ0NCQ0lEUmdSQVFYOFBDeUFBSUFNZ0JDQURheUlBSUFFZ0FDQUJTUnNpQUJBV0dpQUNJQUlvQWdRZ0FHbzJBZ1FnQUF1cUFnRUVmeU1BUVJCcklnUWtBQUpBSUFBb0FuUU5BQ0FDUVFGTkJFQWdBMEVCUVkzRkFFRUFFQk1NQVFzZ0FTQUVRUXhxUVFJUUZTQUVLQUlNSWdaQi8vOERjU0lIUlFSQUlBTkJBVUd1eFFCQkFCQVREQUVMSUFkQkJteEJBbW9nQWtzRVFDQURRUUZCamNVQVFRQVFFd3dCQ3lBR1FRWnNFQmdpQTBVTkFDQUFRUWdRR0NJQ05nSjBJQUpGQkVBZ0F4QVVEQUVMSUFJZ0F6WUNBQ0FDSUFRdkFRd2lBanNCQkNBQ1JRUkFRUUVoQlF3QkMwRUFJUUlEUUNBQlFRSnFJQVJCREdvaUJVRUNFQlVnQXlBQ1FRWnNhaUlHSUFRb0FndzdBUUFnQVVFRWFpQUZRUUlRRlNBR0lBUW9BZ3c3QVFJZ0FVRUdhaUlCSUFWQkFoQVZJQVlnQkNnQ0REc0JCRUVCSVFVZ0FrRUJhaUlDSUFBb0FuUXZBUVJKRFFBTEN5QUVRUkJxSkFBZ0JRdnNBUUVFZnlNQVFSQnJJZ1VrQUFKL0lBQW9BbmdpQkVVRVFDQURRUUZCMzhRQVFRQVFFMEVBREFFTElBUW9BZ3dFUUNBRFFRRkJxZG9BUVFBUUUwRUFEQUVMSUFJZ0JDMEFFaUlDUVFKMElnUkpCRUFnQTBFQlFiN0VBRUVBRUJOQkFBd0JDMEVBSUFRUUdDSUVSUTBBR2lBQ0JFQkJBQ0VEQTBBZ0FTQUZRUXhxSWdaQkFoQVZJQVFnQTBFQ2RHb2lCeUFGS0FJTU93RUFJQUZCQW1vZ0JrRUJFQlVnQnlBRktBSU1PZ0FDSUFGQkEyb2dCa0VCRUJVZ0J5QUZLQUlNT2dBRElBRkJCR29oQVNBRFFRRnFJZ01nQWtjTkFBc0xJQUFvQW5nZ0JEWUNERUVCQ3lBRlFSQnFKQUFMOEFNQkNYOGpBRUVRYXlJRkpBQUNRQ0FDUVFOSkRRQWdBQ2dDZUEwQUlBRWdCVUVNYWtFQ0VCVWdCUzhCRENJSlFZRUlhMEgvZDAwRVFDQUZJQWsyQWdBZ0EwRUJRYUViSUFVUUV3d0JDeUFCUVFKcUlBVkJER3BCQVJBVklBVXZBUXdpQ0VVRVFDQURRUUZCd1JoQkFCQVREQUVMSUFJZ0NFRURha2tOQUNBSUlBbHNRUUowRUJnaUIwVU5BQ0FJRUJnaUNrVUVRQ0FIRUJRTUFRc2dDQkFZSWd0RkJFQWdCeEFVSUFvUUZBd0JDMEVVRUJnaUJrVUVRQ0FIRUJRZ0NoQVVJQXNRRkF3QkN5QUJRUU5xSVFNZ0JpQUtOZ0lJSUFZZ0N6WUNCQ0FHSUFrN0FSQWdCaUFITmdJQUlBVW9BZ3doRENBR1FRQTJBZ3dnQmlBTU9nQVNJQUFnQmpZQ2VBTkFJQU1nQlVFTWFrRUJFQlVnQkNBS2FpQUZMUUFNUWY4QWNVRUJham9BQUNBRUlBdHFJQVVvQWd4QmdBRnhRUWQyT2dBQUlBTkJBV29oQXlBRVFRRnFJZ1FnQ0VjTkFBc2dDVVVFUUVFQklRUU1BUXRCQUNFR0EwQkJBQ0VFUVFBaEFBTkFRUVFnQkNBS2FpMEFBRUVIYWtFRGRpSUVJQVJCQkU4YklnUWdBeUFCYTJvZ0Frb0VRRUVBSVFRTUF3c2dBeUFGUVF4cUlBUVFGU0FISUFVb0FndzJBZ0FnQjBFRWFpRUhJQU1nQkdvaEF5QUFRUUZxSWdCQi8vOERjU0lFSUFoSkRRQUxRUUVoQkNBR1FRRnFJZ1pCLy84RGNTQUpTUTBBQ3dzZ0JVRVFhaVFBSUFRTG1BRUJBbjhqQUVFUWF5SUZKQUFnQUNnQ0dDSUVRZjhCUndSQUlBVWdCRFlDQUNBRFFRSkIwUlFnQlJBVEN3SkFBa0FnQUNnQ0ZDQUNSZ1JBSUFJTkFVRUJJUVFNQWd0QkFDRUVJQU5CQVVHSjhRQkJBQkFUREFFTFFRQWhBZ05BUVFFaEJDQUJJQUFvQWtnZ0FrRU1iR3BCQ0dwQkFSQVZJQU
20ZCQVdvaEFTQUNRUUZxSWdJZ0FDZ0NGRWtOQUFzTElBVkJFR29rQUNBRUM0NEdBUVovSXdCQjBBQnJJZ1FrQUFKQUlBSkJBazBFUUNBRFFRRkI2ZkFBUVFBUUV3d0JDeUFBTFFCOEJFQWdBMEVFUVpUWEFFRUFFQk5CQVNFR0RBRUxRUUVoQmlBQklBQkJLR3BCQVJBVklBRkJBV29nQUVFMGFrRUJFQlVnQVVFQ2FpQUFRU3hxUVFFUUZTQUJRUU5xSVFVQ1FBSkFBa0FDUUFKQUlBQW9BaWdpQjBFQmF3NENBQUVDQ3lBQ1FRWk5CRUFnQkNBQ05nSVFJQU5CQVVHTzlnQWdCRUVRYWhBVFFRQWhCZ3dGQ3dKQUlBSkJCMFlOQUNBQUtBSXdRUTVHRFFBZ0JDQUNOZ0l3SUFOQkFrR085Z0FnQkVFd2FoQVRDeUFGSUFCQk1HcEJCQkFWSUFBb0FqQkJEa2NOQTBFa0VCZ2lCVVVFUUVFQUlRWWdBMEVCUVpRK1FRQVFFd3dGQ3lBRlFRNDJBZ0FnQkVFQU5nSkFJQVJCQURZQ09DQUVRUUEyQWtnZ0JFRUFOZ0k4SUFSQkFEWUNSQ0FFUVFBMkFreEJzT3FRQWlFR0lBUkJzT3FRQWpZQ05DQUZRWUNNbGFJRU5nSUVBbjhnQWtFSFJ3UkFJQUpCSTBZRVFDQUJRUWRxSUFSQnpBQnFRUVFRRlNBQlFRdHFJQVJCeUFCcVFRUVFGU0FCUVE5cUlBUkJ4QUJxUVFRUUZTQUJRUk5xSUFSQlFHdEJCQkFWSUFGQkYyb2dCRUU4YWtFRUVCVWdBVUViYWlBRVFUaHFRUVFRRlNBQlFSOXFJQVJCTkdwQkJCQVZJQVZCQURZQ0JDQUVLQUkwSVFZZ0JDZ0NPQ0VDSUFRb0FrQWhBeUFFS0FJOElRY2dCQ2dDUkNFSUlBUW9Ba3doQ1NBRUtBSklEQUlMSUFRZ0FqWUNJQ0FEUVFKQnN2WUFJQVJCSUdvUUV3dEJBQ0VDUVFBaEEwRUFJUWRCQUFzaEFTQUZJQWMyQWhnZ0JTQUlOZ0lRSUFVZ0NUWUNDQ0FGSUFZMkFpQWdCU0FDTmdJY0lBVWdBellDRkNBRklBRTJBZ3dnQUVFQU5nSndJQUFnQlRZQ2JBd0RDeUFBSUFKQkEyc2lBVFlDY0NBQVFRRWdBUkFYSWdNMkFtd2dBMFVOQVNBQ1FRTk1EUUpCQUNFQ0EwQWdCU0FFUWN3QWFrRUJFQlVnQUNnQ2JDQUNhaUFFS0FKTU9nQUFJQVZCQVdvaEJTQUNRUUZxSWdJZ0FVY05BQXNNQWdzZ0IwRURTUTBDSUFRZ0J6WUNBQ0FEUVFSQnFmd0FJQVFRRXd3Q0MwRUFJUVlnQUVFQU5nSndEQUVMUVFFaEJpQUFRUUU2QUh3TElBUkIwQUJxSkFBZ0JndTBBd0VEZnlNQVFTQnJJZ1FrQUFKQUlBQW9Ba2dFUUNBRFFRSkJ3alpCQUJBVFFRRWhBZ3dCQ3lBQ1FRNUhCRUJCQUNFQ0lBTkJBVUhJOEFCQkFCQVREQUVMSUFFZ0FFRVFha0VFRUJVZ0FVRUVhaUFBUVF4cVFRUVFGU0FCUVFocUlBQkJGR3BCQWhBVklBQW9BZ3doQlFKQUlBUUNmeUFBS0FJUUlnWkZCRUFnQUNnQ0ZBd0JDeUFBS0FJVUlnSWdCVVVOQUJvZ0FnMEJRUUFMTmdJSUlBUWdCallDQkNBRUlBVTJBZ0FnQTBFQlFhenZBQ0FFRUJOQkFDRUNEQUVMSUFKQmdZQUJhMEgvLzM1TkJFQkJBQ0VDSUFOQkFVSFc3Z0JCQUJBVERBRUxJQUFnQWtFTUVCY2lBallDU0NBQ1JRUkFRUUFoQWlBRFFRRkIrKzRBUVFBUUV3d0JDMEVCSVFJZ0FVRUthaUFBUVJocVFRRVFGU0FCUVF0cUlBQkJIR3BCQVJBVklBQW9BaHdpQlVFSFJ3UkFJQVFnQlRZQ0VDQURRUVJCNi80QUlBUkJFR29RRXdzZ0FVRU1haUFBUVNCcVFRRVFGU0FCUVExcUlBQkJKR3BCQVJBVklBQW9BZ0FpQVNBQkxRRFVBVUg3QVhFZ0FDZ0NHRUgvQVVaQkFuUnlPZ0RVQVNBQUtBSUFJZ0VnQUNnQ0REWUM4QUVnQVNBQUtBSVFOZ0wwQVNBQVFRRTZBSVVCQ3lBRVFTQnFKQUFnQWd1M0JBRUZmeU1BUVJCcklnWWtBQUovSUFBdEFHUkJBbkZGQkVBZ0EwRUJRYmZZQUVFQUVCTkJBQXdCQ3lBQVFRQTJBbWdDUUFKQUFrQWdBZ1JBQTBBZ0FrRUhUUVJBSUFOQkFVR21Ha0VBRUJNTUJRc2dBU0FHUVF4cUlnVkJCQkFWSUFZb0Fnd2hCQ0FCUVFScUlBVkJCQkFWUVFnaEJ5QUdLQUlNSVFVQ1FBSkFBa0FDUUNBRURnSUJBQU1MSUFKQkVFa0VRRUhPR2lFRURBY0xJQUZCQ0dvZ0JrRUlha0VFRUJVZ0JpZ0NDQVJBUWR6QkFDRUVEQWNMSUFGQkRHb2dCa0VNYWtFRUVCVWdCaWdDRENJRURRRkJueGtoQkF3R0N5QURRUUZCbnhsQkFCQVREQVlMUVJBaEJ3c2dCQ0FIU1FSQUlBTkJBVUdYeHdCQkFCQVREQVVMSUFJZ0JFa0VRQ0FEUVFGQno4WUFRUUFRRTBFQURBWUxBa0FDUUNBQUlBRWdCMm9nQkNBSGF5QURBbjhDUUFKQUFrQWdCVUh4MkwyYkJrd0VRQ0FGUWVQR3daTUdSZzBCSUFWQjVzcVJtd1pHRFFNZ0JVSHd3cldiQmtjTkJVR2d4UUVNQkFzZ0JVSHkySTJEQjBZTkFVR0F4UUVnQlVIeXlLSExCa1lOQXhvZ0JVSHkyTDJiQmtjTkJFR0l4UUVNQXd0QmtNVUJEQUlMUVpqRkFRd0JDMEdveFFFTEtBSUVFUUVBRFFGQkFBd0hDeUFBSUFBb0FtaEIvLy8vL3dkeU5nSm9DMEVCSUFnZ0JVSHl5S0hMQmtZYklRZ2dBU0FFYWlFQklBSWdCR3NpQWcwQUN5QUlEUUVMSUFOQkFVSHJ4UUJCQUJBVFFRQU1Bd3NnQUVFQk9nQ0VBU0FBSUFBb0FtUkJCSEkyQW1SQkFRd0NDeUFEUVFFZ0JFRUFFQk1MSUFOQkFVR0xEMEVBRUJOQkFBc2dCa0VRYWlRQUMrSUJBUUYvSUFBb0FtUkJBVWNFUUNBRFFRRkI1TmdBUVFBUUUwRUFEd3NDUUNBQ1FRZE5CRUFNQVFzZ0FTQUFRVGhxUVFRUUZTQUJRUVJxSUFCQlBHcEJCQkFWSUFKQkEzRUVRQXdCQ3lBQUlBSkJDR3NpQWtFQ2RpSUVOZ0pBQWtBZ0FrVU5BQ0FBSUFSQkJCQVhJZ0kyQWtRZ0FrVUVRQ0FEUVFGQmxoRkJBQkFUUVFBUEN5QUFLQUpBUlEwQUlBRkJDR29oQTBFQUlRSURRQ0FESUFBb0FrUWdBa0VDZEdwQkJCQVZJQU5CQkdvaEF5QUNRUUZxSWdJZ0FDZ0NRRWtOQUFzTElBQWdBQ2dDWkVFQ2NqWUNaRUVCRHdzZ0EwRUJRWjR1UVFBUUUwRUFDMzRCQVg4akFFRVFheUlFSkFBQ2Z5QUFLQUprQkVBZ0EwRUJRWUhZQUVFQUVCTkJBQXdCQ3lBQ1FRUkhCRUFnQTBFQlFjSXVRUUFRRTBFQURBRUxJQUVnQkVFTWFrRUVFQlVnQkNnQ0RFR0tqcXJvQUVjRVFDQURRUUZCNmlaQkFCQVRRUUFNQVFzZ0FDQUFLQUprUVFGeU5nSmtRUUVMSUFSQkVHb2tBQXZFQVFFQ2Z5QUFJQUFvQWlBaUJEWUNKQUpBSUFBb0FqQWlBd1JBQTBBZ0JDQURJQUFvQWdBZ0FDZ0NGQkVBQUNJRFFYOUdEUUlnQUNBQUtBSWtJQU5xSWdRMkFpUWdBQ0FBS0FJd0lBTnJJZ00yQWpBZ0F3MEFDeUFBS0FJZ0lRUUxJQUJCQURZQ01DQUFJQVEyQWlRZ0FTQUFLQUlBSUFBb0Fod1JDd0JGQkVBZ0FDQUFLQUpFUVFoeU5nSkVRUUFQQ3lBQUlBRTNBemhCQVE4TElBQWdBQ2dDUkVFSWNqWUNSQ0FDUVFSQnova0FRUUFRRXlBQUlBQW9Ba1JCQ0hJMkFrUkJBQXNOQUNBQUtBSUFJQUVnQWhCT0N3a0FJQUFvQWdBUVV3c0pBQ0FBS0FJQUVGSUxEUUFnQUNnQ0FDQUJJQUlRVlF0QkFRRi9JQUlFZnlBRFFRSkJ5ODhBUVFBUUV5QUFLQUlBSUFFZ0FpQURJQVFRVDBVRVFDQURRUUZCblRCQkFCQVRRUUFQQ3lBQUlBSWdBeEIrQlVFQUN3c1ZBQ0FBS0FJQUlBRWdBaUFESUFRZ0JTQUdFRmNMRHdBZ0FDZ0NBQ0FCSUFJZ0F4QllDeE1BSUFBb0FnQWdBU0FDSUFNZ0JDQUZFREVMSFFBZ0FDZ0NBQ0FCSUFJZ0F5QUVJQVVnQmlBSElBZ2dDU0FLRUN3TDVRUUJCbjhnQVNnQ0NFRTJJQU1RS0VVRVFFRUFEd3NnQVNnQ0JDSUlLQUlBSVFjZ0NDZ0NDQ0VHQWtBZ0J3UkFRUUVoQlNBSFFRRnhJUWtnQjBFQlJnUi9RUUFGSUFkQmZuRWhCd05BQW45QkFDQUZSUTBBR2tFQUlBRWdBQ0FESUFZb0FnQVJBQUJGRFFBYUlBRWdBQ0FESUFZb0FnUVJBQUJCQUVjTElRVWdCa0VJYWlFR0lBUkJBbW9pQkNBSFJ3MEFDeUFGUlFzaEJFRUFJQVVnQ1JzaEJRSkFJQWxGRFFBZ0JBMEFJQUVnQUNBRElBWW9BZ0FSQUFCQkFFY2hCUXNnQ0VFQU5nSUFJQVVOQVVFQUR3c2dDRUVBTmdJQUN5QUJLQUlJSWdjb0FnQWhCQ0FIS0FJSUlRWUNRQ0FFQkVCQkFTRUZJQVJCQVhFaENDQUVRUUZHQkg5QkFBVWdCRUYrY1NFSlFRQWhCQU
205BQW45QkFDQUZSUTBBR2tFQUlBRWdBQ0FESUFZb0FnQVJBQUJGRFFBYUlBRWdBQ0FESUFZb0FnUVJBQUJCQUVjTElRVWdCa0VJYWlFR0lBUkJBbW9pQkNBSlJ3MEFDeUFGUlFzaEJFRUFJQVVnQ0JzaEJRSkFJQWhGRFFBZ0JBMEFJQUVnQUNBRElBWW9BZ0FSQUFCQkFFY2hCUXNnQjBFQU5nSUFJQVVOQVVFQUR3c2dCMEVBTmdJQUN5QUJMUUNFQVVVRVFDQURRUUZCaTlzQVFRQVFFMEVBRHdzZ0FTMEFoUUZGQkVBZ0EwRUJRZTdhQUVFQUVCTkJBQThMSUFBZ0FTZ0NBQ0FDSUFNUVdRSkFJQUpGRFFBZ0FpZ0NBQ0lBUlEwQVFRRWhCQUpBQWtBQ1FBSkFBa0FDUUNBQktBSXdRUXhyRGcwREJBUUVCUUFCQkFRRUJBUUNCQXRCQWlFRURBUUxRUU1oQkF3REMwRUVJUVFNQWd0QkJTRUVEQUVMUVg4aEJBc2dBQ0FFTmdJVUlBRW9BbXdpQlVVTkFDQUFJQVUyQWh3Z0FpZ0NBQ0FCS0FKd05nSWdJQUZCQURZQ2JBc0w0Z2tDQ1g4QmZpTUFRZkFBYXlJREpBQkJnQWdoQ0FKL0FrQkJBVUdBQ0JBWElnWUVRQ0FEUWR3QWFpRUxJQU5CN0FCcUlRa0RRQUpBQWtBQ1FDQUJJQU5CNkFCcUlnUkJDQ0FDRUIxQkNFY05BQ0FFSUFOQjJBQnFRUVFRRlNBSklBdEJCQkFWUVFnaEJRSkFBa0FDUUFKQUFrQWdBeWdDV0E0Q0FBRUVDeUFCS1FNSUlneFFCSDVDQUFVZ0RDQUJLUU00ZlFzaURFTDQvLy8vRDFNTkFTQUNRUUZCM01FQVFRQVFFd3dFQ3lBQklBTkI2QUJxSWdSQkNDQUNFQjFCQ0VjTkF5QUVJQU5CNUFCcVFRUVFGU0FES0FKa1JRMEJJQUpCQVVIY3dRQkJBQkFUREFNTElBTWdES2RCQ0dvMkFsZ01BUXNnQ1NBRFFkZ0Fha0VFRUJWQkVDRUZDeUFES0FKY0lnUkI0K1RBMHdaR0JFQWdBQ2dDWkNJQlFRUnhCRUFnQUNBQlFRaHlOZ0prREFJTElBSkJBVUdoTEVFQUVCTWdCaEFVUVFBTUJ3c2dBeWdDV0NJSFJRUkFJQUpCQVVHZkdVRUFFQk1nQmhBVVFRQU1Cd3NnQlNBSFN3UkFJQU1nQkRZQ0JDQURJQWMyQWdBZ0FrRUJRY2pzQUNBREVCTU1CZ3NDUUFKL0FuOENRQUovQWtBQ1FBSkFBa0FDUUNBRVFmSFl2WnNHVEFSQUlBUkI0OGJCa3daR0RRSWdCRUhteXBHYkJrWU5CQ0FFUWZEQ3Rac0dSdzBCUWFERkFRd0dDeUFFUVovQXdOSUdUQVJBSUFSQjh0aTltd1pHRFFWQmdNVUJJQVJCOHNpaHl3WkdEUVlhSUFSQjhQTFJzd1pIRFFGQjZNUUJEQWdMSUFSQjh0aU5nd2RHRFFJZ0JFR2d3TURTQmtZTkJrSHd4QUVnQkVIbzVNRFRCa1lOQnhvTElBQW9BbVFpQkVFQmNRMElJQUpCQVVIcEQwRUFFQk1nQmhBVVFRQU1Ed3RCa01VQkRBTUxRWmpGQVF3Q0MwR294UUVNQVF0QmlNVUJDeUVLSUFNZ0JFSC9BWEUyQWt3Z0F5QUVRUmgyTmdKQUlBTWdCRUVJZGtIL0FYRTJBa2dnQXlBRVFSQjJRZjhCY1RZQ1JDQUNRUUpCdGc4Z0EwRkFheEFUSUFjZ0JXc2lCU0FBTFFCa1FRUnhEUUlhSUFNZ0F5Z0NYQ0lFUVJoMk5nSXdJQU1nQkVIL0FYRTJBandnQXlBRVFSQjJRZjhCY1RZQ05DQURJQVJCQ0haQi93RnhOZ0k0SUFKQkFrSE9OQ0FEUVRCcUVCTWdBQ0FBS0FKa1FmLy8vLzhIY2pZQ1pDQUJJQVd0SWd3Z0FpQUJLQUlvRVFnQUlBeFJEUWNnQWtFQlFmOGNRUUFR
20RXlBR0VCUkJBQXdLQzBIZ3hBRUxJUW9nQnlBRmF3c2hCU0FCS1FNSUlneFFCSDVDQUFVZ0RDQUJLUU00ZlFzZ0JhMVRCRUFnQXlnQ1dDRUVJQU1vQWx3aEFDQURJQUVwQXdnaURGQUVma0lBQlNBTUlBRXBBemg5Q3o0Q0tDQURJQVUyQWlRZ0F5QUFRZjhCY1RZQ0lDQURJQUJCR0hZMkFoUWdBeUFFTmdJUUlBTWdBRUVJZGtIL0FYRTJBaHdnQXlBQVFSQjJRZjhCY1RZQ0dDQUNRUUZCbS9vQUlBTkJFR29RRXd3SEN5QUZJQWhOQkVBZ0JpRUVEQVFMSUFVaENDQUdJQVVRR3lJRURRTWdCaEFVSUFKQkFVSHNFRUVBRUJOQkFBd0hDeUFFUVFKeFJRUkFJQUpCQVVHdkVFRUFFQk1nQmhBVVFRQU1Cd3NnQUNBRVFmLy8vLzhIY2pZQ1pDQUJJQWNnQld1dElnd2dBaUFCS0FJb0VRZ0FJQXhSRFFNZ0FDMEFaRUVJY1VVTkFTQUNRUUpCL3h4QkFCQVRDeUFHRUJSQkFRd0ZDeUFDUVFGQi94eEJBQkFUSUFZUUZFRUFEQVFMSUFFZ0JDQUZJQUlRSFNBRlJ3UkFJQUpCQVVHeEhVRUFFQk1nQkJBVVFRQU1CQXNnQUNBRUlnWWdCU0FDSUFvb0FnUVJBUUFOQUFzZ0JCQVVRUUFNQWdzZ0FrRUJRWlltUVFBUUUwRUFEQUVMSUFZUUZFRUFDeUFEUWZBQWFpUUFDK0FCQVFaL0lBQW9BZ2hCTmlBQ0VDaEZCRUJCQUE4TElBQW9BZ2dpQmlnQ0FDRURJQVlvQWdnaEJRSkFJQU1FUUVFQklRUWdBMEVCY1NFSElBTkJBVVlFZjBFQUJTQURRWDV4SVFNRFFBSi9RUUFnQkVVTkFCcEJBQ0FBSUFFZ0FpQUZLQUlBRVFBQVJRMEFHaUFBSUFFZ0FpQUZLQUlFRVFBQVFRQkhDeUVFSUFWQkNHb2hCU0FJUVFKcUlnZ2dBMGNOQUFzZ0JFVUxJUU5CQUNBRUlBY2JJUVFDUUNBSFJRMEFJQU1OQUNBQUlBRWdBaUFGS0FJQUVRQUFRUUJISVFRTElBWkJBRFlDQUNBRURRRkJBQThMSUFaQkFEWUNBQXNnQUNnQ0FCcEJBUXNLQUNBQUtBSUFHa0VBQ3lrQUFrQWdBQ2dDQUNJQVJRMEFJQUFnQVRZQzBBRWdBVVVOQUNBQUlBQXRBRnhCQ0hJNkFGd0xDeUVBSUFBb0FnQWdBUkJjSUFCQkFEb0FmQ0FBSUFFb0FyaEFRUUZ4TmdLQUFRc3lBQ0FDUlFSQVFRQVBDeUFBS0FJQUlBRWdBaUFERUZGRkJFQWdBMEVCUVowd1FRQVFFMEVBRHdzZ0FDQUNJQU1RZmd0cEFnSi9BWHdqQUVFUWF5SURKQUFnQWdSQUEwQWdBQ0FEUVFocUVFMGdBUUovSUFNckF3Z2lCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xOZ0lBSUFGQkJHb2hBU0FBUVFocUlRQWdCRUVCYWlJRUlBSkhEUUFMQ3lBRFFSQnFKQUFMaEFFQ0FuOEJmU01BUVJCcklnTWtBQ0FDQkVBRFFDQURJQUF0QUFBNkFBOGdBeUFBTFFBQk9nQU9JQU1nQUMwQUFqb0FEU0FESUFBdEFBTTZBQXdnQVFKL0lBTXFBZ3dpQll0REFBQUFUMTBFUUNBRnFBd0JDMEdBZ0lDQWVBczJBZ0FnQVVFRWFpRUJJQUJCQkdvaEFDQUVRUUZxSWdRZ0FrY05BQXNMSUFOQkVHb2tBQXRMQVFKL0l3QkJFR3NpQXlRQUlBSUVRQU5BSUFBZ0EwRU1ha0VFRUJVZ0FTQURLQUlNTmdJQUlBRkJCR29oQVNBQVFRUnFJUUFnQkVFQmFpSUVJQUpIRFFBTEN5QURRUkJxSkFBTFN3RUNmeU1BUVJCcklnTWtBQ0FDQkVBRFFDQUFJQU5CREdwQkFoQVZJQUVnQXlnQ0REWUNBQ0FCUVFScUlRRWdBRUVDYWlFQUlBUkJBV29pQkNBQ1J3MEFDd3NnQTBFUWFpUUFDMG9CQW44akFFRVFheUlESkFBZ0FnUkFBMEFnQUNBRFFRaHFFRTBnQVNBREt3TUl0amdDQUNBQlFRUnFJUUVnQUVFSWFpRUFJQVJCQVdvaUJDQUNSdzBBQ3dzZ0EwRVFhaVFBQzJnQkFuOGpBRUVRYXlJREpBQWdBZ1JBQTBBZ0F5QUFMUUFBT2dBUElBTWdBQzBBQVRvQURpQURJQUF0QUFJNkFBMGdBeUFBTFFBRE9nQU1JQUVnQXlvQ0REZ0NBQ0FCUVFScUlRRWdBRUVFYWlFQUlBUkJBV29pQkNBQ1J3MEFDd3NnQTBFUWFpUUFDMHdCQW44akFFRVFheUlESkFBZ0FnUkFBMEFnQUNBRFFReHFRUVFRRlNBQklBTW9BZ3l6T0FJQUlBRkJCR29oQVNBQVFRUnFJUUFnQkVFQmFpSUVJQUpIRFFBTEN5QURRUkJxSkFBTFRBRUNmeU1BUVJCcklnTWtBQ0FDQkVBRFFDQUFJQU5CREdwQkFoQVZJQUVnQXlnQ0RMTTRBZ0FnQVVFRWFpRUJJQUJCQW1vaEFDQUVRUUZxSWdRZ0FrY05BQXNMSUFOQkVHb2tBQXVxQ0FJTmZ3RjdJd0JCRUdzaUNDUUFBbjhnQUNnQ0NFRVFSZ1JBSUFBb0FyUUJJQUFvQXVRQlFZd3NiR29NQVFzZ0FDZ0NEQXNoQ1FKQUlBSkZCRUFnQTBFQlFmNGdRUUFRRXd3QkN5QUFLQUpnSVFaQkFTRUVJQUVnQ0VFSWFrRUJFQlVnQ0NnQ0NDSUZRUUpQQkVBZ0EwRUNRWnZNQUVFQUVCTU1BUXNnQlVFQmFpQUNSd1JBUVFBaEJDQURRUUpCL2lCQkFCQVREQUVMQWtBZ0JpZ0NFQ0lEUlEwQUlBa29BdEFySVFRZ0EwRUlUd1JBSUFOQmVIRWhCa0VBSVFJRFFDQUVRUUEyQXJ4RElBUkJBRFlDaERzZ0JFRUFOZ0xNTWlBRVFRQTJBcFFxSUFSQkFEWUMzQ0VnQkVFQU5nS2tHU0FFUVFBMkF1d1FJQVJCQURZQ3RBZ2dCRUhBd3dCcUlRUWdBa0VJYWlJQ0lBWkhEUUFMQ3lBRFFRZHhJZ05GRFFCQkFDRUNBMEFnQkVFQU5nSzBDQ0FFUWJnSWFpRUVJQUpCQVdvaUFpQURSdzBBQ3dzZ0NTZ0M2Q3NpQWdSL0lBSVFGQ0FKUVFBMkF1Z3JJQWdvQWdnRklBVUxSUVJBUVFFaEJBd0JDd05BSUFGQkFXb2lBU0FJUVF4cVFRRVFGUUpBSUFrb0FvQXNSUTBBSUFrb0F2d3JJZ01vQWdBZ0NDZ0NERWNOQUNBREtBSUVJZ1VnQUNnQ1lDSUdLQUlRUncwQUlBTW9BZ2dpQWdSQVFRQWhCQ0FDS0FJUUlBVWdCV3dpQlNBQ0tBSUFRUUowUVpEQ0FXb29BZ0JzUncwRElBa2dCVUVDZEJBWUlnYzJBdWdySUFkRkRRTWdBaWdDRENBSElBVWdBaWdDQUVFQ2RFSEF4QUZxS0FJQUVRVUFDeUFES0FJTUlnSkZEUUJCQUNFRUlBSW9BaEFnQmlnQ0VDSURJQUlvQWdCQkFuUkJrTUlCYWlnQ0FHeEhEUUlnQTBFQ2RCQVlJZ1ZGRFFJZ0FpZ0NEQ0FGSUFNZ0FpZ0NBRUVDZEVIUXhBRnFLQUlBRVFVQUFrQWdCaWdDRUNJSFJRMEFJQWtvQXRBcklRUkJBQ0VMQWtBQ1FDQUhRUVJKRFFBZ0JFRzBDR29pRENBRklBZEJBblJxU1FSQUlBVWdCQ0FIUWJnSWJHcEpEUUVMSUFSQjNDRnFJUTBnQkVHa0dXb2hEaUFFUWV3UWFpRVBJQVVnQjBGOGNTSUdRUUowYWlFQ0lBUWdCa0c0Q0d4cUlRUkJBQ0VEQTBBZ0RDQURRYmdJYkNJS2FpQUZJQU5CQW5ScS9RQUNBQ0lSL1ZvQ0FBQWdDaUFQYWlBUi9Wb0NBQUVnQ2lBT2FpQVIvVm9DQUFJZ0NpQU5haUFSL1ZvQ0FBTWdBMEVFYWlJRElBWkhEUUFMSUFZZ0IwWU5BZ3dCQ3lBRklRSkJBQ0VHQ3lBSElBWWlBMnRCQjNFaUNnUkFBMEFnQkNBQ0tBSUFOZ0swQ0NBRFFRRnFJUU1nQkVHNEN
20Hb2hCQ0FDUVFScUlRSWdDMEVCYWlJTElBcEhEUUFMQ3lBR0lBZHJRWGhMRFFBRFFDQUVJQUlvQWdBMkFyUUlJQVFnQWlnQ0JEWUM3QkFnQkNBQ0tBSUlOZ0trR1NBRUlBSW9BZ3cyQXR3aElBUWdBaWdDRURZQ2xDb2dCQ0FDS0FJVU5nTE1NaUFFSUFJb0FoZzJBb1E3SUFRZ0FpZ0NIRFlDdkVNZ0JFSEF3d0JxSVFRZ0FrRWdhaUVDSUFOQkNHb2lBeUFIUncwQUN3c2dCUkFVQzBFQklRUWdFRUVCYWlJUUlBZ29BZ2hKRFFBTEN5QUlRUkJxSkFBZ0JBc0VBRUovQzdzSkFRcC9Jd0JCRUdzaUJTUUFBbjhnQUNnQ0NFRVFSZ1JBSUFBb0FyUUJJQUFvQXVRQlFZd3NiR29NQVFzZ0FDZ0NEQXNoQndKL0lBSkJBVTBFUUNBRFFRRkJ6Q1JCQUJBVFFRQU1BUXNnQVNBRlFReHFRUUlRRlNBRktBSU1CRUFnQTBFQ1FlUXRRUUFRRTBFQkRBRUxJQUpCQmswRVFDQURRUUZCekNSQkFCQVRRUUFNQVFzZ0FVRUNhaUFGUVFocVFRRVFGU0FIS0FMOEt5SUpJUUFDUUFKQUFrQWdCeWdDZ0N3aUJrVU5BQ0FGS0FJSUlRZ0RRQ0FBS0FJQUlBaEdEUUVnQUVFVWFpRUFJQVJCQVdvaUJDQUdSdzBBQ3d3QkN5QUVJQVpIRFFFTElBY29Bb1FzSUFaR0JIOGdCeUFHUVFwcUlnQTJBb1FzSUFrZ0FFRVViQkFiSWdCRkJFQWdCeWdDL0NzUUZDQUhRUUEyQW9Rc0lBZENBRGNDL0NzZ0EwRUJRZVlrUVFBUUUwRUFEQU1MSUFjZ0FEWUMvQ3NnQUNBSEtBS0FMQ0lFUVJSc2FrRUFJQWNvQW9Rc0lBUnJRUlJzRUJrYUlBY29BdndySVFrZ0J5Z0NnQ3dGSUFZTFFSUnNJQWxxSVFCQkFTRUxDeUFBSUFVb0FnZzJBZ0FnQVVFRGFpQUZRUXhxUVFJUUZTQU
20ZLQUlNQkVBZ0EwRUNRZVF0UVFBUUUwRUJEQUVMSUFGQkJXb2dCVUVFYWtFQ0VCVWdCU2dDQkNJRVFRSlBCRUFnQTBFQ1FaVVlRUUFRRTBFQkRBRUxJQUpCQjJzaEJpQUVCRUFnQVVFSGFpRUNRUUFoQ1FOQUlBWkJBazBFUUNBRFFRRkJ6Q1JCQUJBVFFRQU1Bd3NnQWlBRlFReHFRUUVRRlNBRktBSU1RUUZIQkVBZ0EwRUNRYVlyUVFBUUUwRUJEQU1MSUFKQkFXb2dCVUVDRUJVZ0FDQUZLQUlBSWdSQi8vOEJjU0lCTmdJRUlBWkJBMnNpQ0NBRVFROTJRUUZxSWdZZ0FXeEJBbW9pQ2trRVFDQURRUUZCekNSQkFCQVRRUUFNQXdzZ0FrRURhaUVDUVFBaEJDQUJCRUFEUUNBQ0lBVkJER29nQmhBVklBUWdCU2dDREVjRVFDQURRUUpCempCQkFCQVRRUUVNQlFzZ0FpQUdhaUVDSUFSQkFXb2lCQ0FBS0FJRVNRMEFDd3NnQWlBRlFRSVFGU0FGSUFVb0FnQWlCRUgvL3dGeElnRTJBZ0FnQUNnQ0JDQUJSd1JBSUFOQkFrSEZHVUVBRUJOQkFRd0RDeUFJSUFwcklnb2dCRUVQZGtFQmFpSUdJQUZzUVFOcUlneEpCRUFnQTBFQlFjd2tRUUFRRTBFQURBTUxJQUpCQW1vaEFrRUFJUVFnQVFSQUEwQWdBaUFGUVF4cUlBWVFGU0FFSUFVb0FneEhCRUFnQTBFQ1FjNHdRUUFRRTBFQkRBVUxJQUlnQm1vaEFpQUVRUUZxSWdRZ0FDZ0NCRWtOQUFzTElBSWdCVUVNYWtFREVCVWdCU2dDRENFR0lBQkNBRGNDQ0NBQUlBWkJnSUFFY1VVZ0FDMEFFRUgrQVhGeU9nQVFJQVVnQmtIL0FYRWlDRFlDQ0FKQUlBaEZEUUFnQnlnQzlDc2lEUVJBSUFjb0F2QXJJUVJCQUNFQkEwQWdDQ0FFS0FJSVJnUkFJQUFnQkRZQ0NBd0RDeUFFUVJScUlRUWdBVUVCYWlJQklBMUhEUUFMQ3lBRFFRRkJ6Q1JCQUJBVFFRQU1Bd3NnQlNBR1FRaDJRZjhCY1NJR05nSUlBa0FnQmtVTkFDQUhLQUwwS3lJSUJFQWdCeWdDOENzaEJFRUFJUUVEUUNBR0lBUW9BZ2hHQkVBZ0FDQUVOZ0lNREFNTElBUkJGR29oQkNBQlFRRnFJZ0VnQ0VjTkFBc0xJQU5CQVVITUpFRUFFQk5CQUF3REN5QUtJQXhySVFZZ0FrRURhaUVDSUFsQkFXb2lDU0FGS0FJRVNRMEFDd3NnQmdSQUlBTkJBVUhNSkVFQUVCTkJBQXdCQzBFQklBdEZEUUFhSUFjZ0J5Z0NnQ3hCQVdvMkFvQXNRUUVMSUFWQkVHb2tBQXYxQVFFRmZ5TUFRUkJySWdRa0FBSkFJQUFvQW1Bb0FoQWlCa0VDYWlBQ1J3UkFJQU5CQVVIa0kwRUFFQk1NQVFzZ0FTQUVRUXhxUVFJUUZTQUdJQVFvQWd4SEJFQWdBMEVCUWVRalFRQVFFd3dCQ3lBR1JRUkFRUUVoQlF3QkN5QUJRUUpxSVFJZ0FDZ0NZQ2dDR0NFQVFRQWhBUU5BSUFJZ0JFRUlha0VCRUJVZ0FDQUVLQUlJSWdWQi93QnhJZ2RCQVdvaUNEWUNHQ0FBSUFWQkIzWkJBWEUyQWlBZ0IwRWZUd1JBSUFRZ0NEWUNCQ0FFSUFFMkFnQWdBMEVCUVlYNEFDQUVFQk5CQUNFRkRBSUxJQUJCTkdvaEFFRUJJUVVnQWtFQmFpRUNJQUZCQVdvaUFTQUdSdzBBQ3dzZ0JFRVFhaVFBSUFVTGxBVUJDWDhqQUVFUWF5SUhKQUFDZnlBQUtBSUlRUkJHQkVBZ0FDZ0N0QUVnQUNnQzVBRkJqQ3hzYWd3QkN5QUFLQUlNQ3lFRkFuOGdBa0VCVFFSQUlBTkJBVUgvSDBFQUVCTkJBQXdCQ3lBQklBZEJER3BCQWhBVkFrQWdCeWdDREFSQUlBTkJBa0h6RzBFQUVCTU1BUXNnQWtFR1RRUkFJQU5CQVVIL0gwRUFFQk5CQUF3Q0N5QUJRUUpxSUFkQkRHcEJBaEFWSUFVb0F2QXJJUVFnQnkwQURDRUtBa0FDUUFKQUlBVW9BdlFySWdaRkJFQWdCQ0VBREFFTElBUWhBQU5BSUFBb0FnZ2dDa1lOQVNBQVFSUnFJUUFnQ0VFQmFpSUlJQVpIRFFBTERBRUxJQVlnQ0VjTkFRc2dCU2dDK0NzZ0JrWUVRQ0FGSUFaQkNtb2lBRFlDK0NzZ0JDQUFRUlJzRUJzaEFDQUZLQUx3S3lFRUlBQkZCRUFnQkJBVUlBVkJBRFlDK0NzZ0JVSUFOd0x3S3lBRFFRRkJtU0JCQUJBVFFRQU1CQXNDUUNBQUlBUkdEUUFnQlNnQ2dDd2lDMFVOQUNBRktBTDhLeUVNUVFBaENBTkFJQXdnQ0VFVWJHb2lCaWdDQ0NJSkJFQWdCaUFBSUFrZ0JHdHFOZ0lJQ3lBR0tBSU1JZ2tFUUNBR0lBQWdDU0FFYTJvMkFnd0xJQWhCQVdvaUNDQUxSdzBBQ3dzZ0JTQUFOZ0x3S3lBQUlBVW9BdlFySWdSQkZHeHFRUUFnQlNnQytDc2dCR3RCRkd3UUdSb2dCU2dDOUNzaEJpQUZLQUx3S3lFRUN5QUZJQVpCQVdvMkF2UXJJQVFnQmtFVWJHb2hBQXNnQUNnQ0RDSUVCRUFnQkJBVUlBQkNBRGNDREFzZ0FDQUtOZ0lJSUFBZ0J5Z0NEQ0lFUVFwMlFRTnhOZ0lBSUFBZ0JFRUlka0VEY1RZQ0JDQUJRUVJxSUFkQkRHcEJBaEFWSUFjb0Fnd0VRQ0FEUVFKQnFoZEJBQkFUREFFTElBQWdBa0VHYXlJQ0VCZ2lCRFlDRENBRVJRUkFJQU5CQVVIL0gwRUFFQk5CQUF3Q0N5QUVJQUZCQm1vZ0FoQVdHaUFBSUFJMkFoQUxRUUVMSUFkQkVHb2tBQXNuQUVFQklRRWdBQ2dDWUNnQ0VFRUNkQ0FDUndSL0lBTkJBVUhMSWtFQUVCTkJBQVZCQVFzTHB3TUJCSDhqQUVFUWF5SUdKQUFDZnlBQ1FRRk5CRUFnQTBFQlFlb2VRUUFRRTBFQURBRUxJQUF0QU5RQlFRRnhCRUFnQTBFQlFkZmlBRUVBRUJOQkFBd0JDeUFBS0FLMEFTQUFLQUxrQVVHTUxHeHFJZ0FnQUMwQWlDeEJBbkk2QUlnc0lBRWdCa0VNYWtFQkVCVUNRQ0FBS0FLc0tDSUVSUVJBSUFBZ0JpZ0NERUVCYWlJRlFRZ1FGeUlFTmdLc0tDQUVSUVJBSUFOQkFVR0VIMEVBRUJOQkFBd0RDeUFBSUFVMkFxZ29EQUVMSUFZb0Fnd2lCU0FBS0FLb0tFa05BQ0FFSUFWQkFXb2lCRUVEZEJBYklnVkZCRUFnQTBFQlFZUWZRUUFRRTBFQURBSUxJQUFnQlRZQ3JDZ2dCU0FBS0FLb0tDSUhRUU4wYWtFQUlBUWdCMnRCQTNRUUdSb2dBQ0FFTmdLb0tDQUFLQUtzS0NFRUN5QUVJQVlvQWd3aUJVRURkR29vQWdBRVFDQUdJQVUyQWdBZ0EwRUJRZkkySUFZUUUwRUFEQUVMSUFKQkFXc2lBaEFZSVFRZ0FDZ0NyQ2dpQUNBR0tBSU1JZ1ZCQTNScUlBUTJBZ0FnQkVVRVFDQURRUUZCaEI5QkFCQVRRUUFNQVFzZ0FDQUZRUU4wYWlBQ05nSUVJQUFnQmlnQ0RFRURkR29vQWdBZ0FVRUJhaUFDRUJZYVFRRUxJQVpCRUdva0FBdjZBZ0VFZnlNQVFSQnJJZ1lrQUFKL0lBSkJBVTBFUUNBRFFRRkJzaUZCQUJBVFFRQU1BUXNnQUNBQUxRRFVBVUVCY2pvQTFBRWdBU0FHUVF4cVFRRVFGUUpBSUFBb0Fvd0JJZ1JGQkVBZ0FDQUdLQUlNUVFGcUlnVkJDQkFYSWdRMkFvd0JJQVJGQkVBZ0EwRUJRY3doUVFBUUUwRUFEQU1MSUFBZ0JUWUNpQUVNQVFzZ0JpZ0NEQ0lGSUFBb0FvZ0JTUTBBSUFRZ0JVRUJhaUlFUVFOMEVCc2lCVVVFUUNBRFFRRkJ6Q0ZCQUJBVFFRQU1BZ3NnQUNBRk5nS01BU0FGSUFBb0FvZ0JJZ2RCQTNScVFRQWdCQ0FIYTBFRGRCQVpHaUFBSUFRMkFvZ0JJQUFvQW93QklRUUxJQVFnQmlnQ0RDSUZRUU4wYWlnQ0FBUkFJQVlnQlRZQ0FDQURRUUZCaURjZ0JoQVRRUUFNQVFzZ0FrRUJheUlDRUJnaEJDQUFLQUtNQVNJQUlBWW9BZ3dpQlVFRGRHb2dCRFlDQUNBRVJRUkFJQU5CQVVITUlVRUFFQk5CQUF3QkN5QUFJQVZCQTNScUlBSTJBZ1FnQUNBR0tBSU1RUU4wYWlnQ0FDQUJRUUZxSUFJUUZocEJBUXNnQmtFUWFpUUFDNXdCQVFOL0l3QkJFR3NpQkNRQUFuOGdBa1VFUUNBRFFRRkI1UjlCQUJBVFFRQU1BUXNnQVNBRVFReHFRUUVRRlVFQklBSkJBV3NpQlVVTkFCcEJBQ0VBUV
20FBaEFnTkFJQUZCQVdvaUFTQUVRUWhxUVFFUUZTQUVLQUlJSWdaQkdIUkJIM1VnQmtIL0FIRWdBbkpCQjNSeElRSWdBRUVCYWlJQUlBVkhEUUFMUVFFZ0FrVU5BQm9nQTBFQlFlVWZRUUFRRTBFQUN5QUVRUkJxSkFBTEd3QkJBU0VBSUFJRWYwRUJCU0FEUVFGQjhpRkJBQkFUUVFBTEM5b0VBUWQvSXdCQklHc2lCQ1FBUVFFaEJRSkFJQUpCQVUwRVFFRUFJUVVnQTBFQlFhbk9BRUVBRUJNTUFRc2dBQ2dDVEEwQUlBRWdCRUVjYWtFQkVCVWdBVUVCYWlBRVFSaHFRUUVRRlNBRUtBSVlJZ1pCQkhaQkEzRWlCMEVEUmdSQUlBQkJBVFlDVENBRFFRSkJnZG9BUVFBUUV3d0JDeUFDUVFKcklnSWdBaUFHUVFWMlFRSnhRUUpxSWdrZ0Iyb2lDRzRpQmlBSWJFY0VRQ0FBUVFFMkFrd2dBMEVDUWQ3V0FFRUFFQk1NQVFzZ0FpQUlTUTBBQWtBZ0FDZ0NSQ0lDSUFaQmYzTk5CRUFnQWlBR2FpSUNRWUNBZ0lBQ1NRMEJDeUFBUVFFMkFrd2dBMEVDUVpQSkFFRUFFQk1NQVFzZ0FDZ0NTQ0FDUVFOMEVCc2lDRVVFUUNBQVFRRTJBa3dnQTBFQ1FiN0pBRUVBRUJNTUFRc2dBVUVDYWlFQ0lBQWdDRFlDU0FKQUlBY0VRRUVCSUFZZ0JrRUJUUnNoQ2tFQUlRWURRQ0FDSUFSQkZHb2dCeEFWSUFRb0FoUWlBU0FBS0FLRUFTQUFLQUtBQVd4UERRSWdBaUFIYWlJQklBUkJFR29nQ1JBVklBZ2dBQ2dDUkNJQ1FRTjBhaUlGSUFRb0FoUTdBUUFnQlNBRUtBSVFOZ0lFUVFFaEJTQUFJQUpCQVdvMkFrUWdBU0FKYWlFQ0lBWkJBV29pQmlBS1J3MEFDd3dDQzBFQklBWWdCa0VCVFJzaEJ5QUFLQUpFSVFGQkFDRUdBMEFnQkNBQk5nSVVJQUVnQUNnQ2hBRWdBQ2dDZ0FGc1R3MEJJQUlnQkVFUWFpQUpFQlVnQ0NBQUtBSkVJZ3BCQTNScUlnVWdBVHNCQUNBRklBUW9BaEEyQWdSQkFTRUZJQUFnQ2tFQmFpSUJOZ0pFSUFJZ0NXb2hBaUFHUVFGcUlnWWdCMGNOQUFzTUFRc2dBRUVCTmdKTUlBUWdBVFlDQUNBRFFRSkIwandnQkJBVEN5QUVRU0JxSkFBZ0JRc0VBRUVBQ3d2THdRRWhBRUdBQ0F2Z21RRmpZVzV1YjNRZ1lXeHNiMk5oZEdVZ2IzQnFYM1JqWkY5elpXZGZaR0YwWVY5amFIVnVhMTkwS2lCaGNuSmhlUUF0S3lBZ0lEQllNSGdBTFRCWUt6QllJREJZTFRCNEt6QjRJREI0QUZWdWEyNXZkMjRnWm05eWJXRjBBRVpoYVd4bFpDQjBieUJ6WlhSMWNDQjBhR1VnWkdWamIyUmxjZ0JHWVdsc1pXUWdkRzhnY21WaFpDQjBhR1VnYUdWaFpHVnlBRzVoYmdBcWJGOTBhV3hsWDJ4bGJpQStJRlZKVGxSZlRVRllJQzBnVDFCS1gwTlBUVTFQVGw5RFFreExYMFJCVkVGZlJWaFVVa0VnTFNCd1gyb3lheTArYlY5emNHVmphV1pwWTE5d1lYSmhiUzV0WDJSbFkyOWtaWEl1YlY5emIzUmZiR1Z1WjNSb0FHbHVaZ0JHWVdsc1pXUWdkRzhnWkdWamIyUmxJSFJvWlNCcGJXRm5aUUJKYm5aaGJHbGtJR0ZqWTJWemN5QjBieUJ3YVMwK2FXNWpiSFZrWlFBdmRHMXdMMjl3Wlc1cWNHVm5MM055WXk5aWFXNHZZMjl0Ylc5dUwyTnZiRzl5TG1NQVFVeE1YME5RVlZNQVQxQktYMDVWVFY5VVNGSkZRVVJUQUU1QlRnQlBTbEJmUkU5ZlRrOVVYMFJKVTFCTVFWbGZWRWxNUlY5SlRrUkZXRjlKUmw5VVRFMEFTVTVHQUhCZmFqSnJMVDV0WDNOd1pXTnBabWxqWDNCaGNtRnRMbTFmWkdWamIyUmxjaTV0WDNOdmRGOXNaVzVuZEdnZ1BpQlZTVTVVWDAxQldDQXRJRTlRU2w5RFQwMU5UMDVmUTBKTVMxOUVRVlJCWDBWWVZGSkJBQWtKQ1NCd2NtVmpZMmx1ZEhOcGVtVWdLSGNzYUNrOUFBa0pDU0J6ZEdWd2MybDZaWE1nS0cwc1pTazlBRk5QVkNCdFlYSnJaWElnWm05eUlIUnBiR1VnSlhVZ1pHVmpiR0Z5WlhNZ2JXOXlaU0IwYVd4bExYQmhjblJ6SUhSb1lXNGdabTkxYm1RZ2FXNGdWRXhOSUcxaGNtdGxjaTRBS0c1MWJHd3BBQ2dsWkN3bFpDa2dBQ1Z6ZlFvQUNRa2dmUW9BVzBSRlZsMGdSSFZ0Y0NCaGJpQnBiV0ZuWlY5amIyMXdYMmhsWVdSbGNpQnpkSEoxWTNRZ2V3b0FXMFJGVmwwZ1JIVnRjQ0JoYmlCcGJXRm5aVjlvWldGa1pYSWdjM1J5ZFdOMElIc0tBRWx0WVdkbElHbHVabThnZXdvQUNTQmtaV1poZFd4MElIUnBiR1VnZXdvQUpYTUpJR052YlhCdmJtVnVkQ0FsWkNCN0NnQUpDU0JqYjIxd0lDVmtJSHNLQUFrZ1ZHbHNaU0JwYm1SbGVEb2dld29BQ1NCTllYSnJaWElnYkdsemREb2dld29BUTI5a1pYTjBjbVZoYlNCcGJtUmxlQ0JtY205dElHMWhhVzRnYUdWaFpHVnlPaUI3Q2dCRGIyUmxjM1J5WldGdElHbHVabThnWm5KdmJTQnRZV2x1SUdobFlXUmxjam9nZXdvQVUzUnlaV0Z0SUdWeWNtOXlJSGRvYVd4bElISmxZV1JwYm1jZ1NsQXlJRWhsWVdSbGNpQmliM2dLQUVadmRXNWtJR0VnYldsemNHeGhZMlZrSUNjbFl5VmpKV01sWXljZ1ltOTRJRzkxZEhOcFpHVWdhbkF5YUNCaWIzZ0tBRTFoYkdadmNtMWxaQ0JLVURJZ1ptbHNaU0JtYjNKdFlYUTZJR1pwY25OMElHSnZlQ0J0ZFhOMElHSmxJRXBRUlVjZ01qQXdNQ0J6YVdkdVlYUjFjbVVnWW05NENnQk5ZV3htYjNKdFpXUWdTbEF5SUdacGJHVWdabTl5YldGME9pQnpaV052Ym1RZ1ltOTRJRzExYzNRZ1ltVWdabWxzWlNCMGVYQmxJR0p2ZUFvQVRtOTBJR1Z1YjNWbmFDQnRaVzF2Y25rZ2RHOGdhR0Z1Wkd4bElHcHdaV2N5TURBd0lHSnZlQW9BVG05MElHVnViM1ZuYUNCdFpXMXZjbmtnZDJsMGFDQkdWRmxRSUVKdmVBb0FRU0J0WVhKclpYSWdTVVFnZDJGeklHVjRjR1ZqZEdWa0lDZ3dlR1ptTFMwcElHbHVjM1JsWVdRZ2IyWWdKUzQ0ZUFvQUNRa2diV04wUFNWNENnQUpDUWtnWTJKc2EzTjBlVDBsSTNnS0FBa0pDU0JqYzNSNVBTVWplQW9BQ1FrZ2NISm5QU1VqZUFvQVNXNTBaV2RsY2lCdmRtVnlabXh2ZHdvQUNTQjBaSGc5SlhVc0lIUmtlVDBsZFFvQUNTQjBkejBsZFN3Z2RHZzlKWFVLQUFrZ2RIZ3dQU1YxTENCMGVUQTlKWFVLQUVsdWRtRnNhV1FnWTI5dGNHOXVaVzUwSUdsdVpHVjRPaUFsZFFvQVUzUnlaV0Z0SUhSdmJ5QnphRzl5ZEFvQVRXRnlhMlZ5SUdoaGJtUnNaWElnWm5WdVkzUnBiMjRnWm1GcGJHVmtJSFJ2SUhKbFlXUWdkR2hsSUcxaGNtdGxjaUJ6WldkdFpXNTBDZ0JPYjNRZ1pXNXZkV2RvSUcxbGJXOXllU0JtYjNJZ1kzVnljbVZ1ZENCd2NtVmphVzVqZENCamIyUmxZbXh2WTJzZ1pXeGxiV1Z1ZEFvQVJYSnliM0lnY21WaFpHbHVaeUJUVUVOdlpDQlRVRU52WXlCbGJHVnRaVzUwQ2dCRmNuSnZjaUJ5WldGa2FXNW5JRk5SWTJRZ2IzSWdVMUZqWXlCbGJHVnRaVzUwQ2dCQklFSlFRME1nYUdWaFpHVnlJR0p2ZUNCcGN5QmhkbUZwYkdGaWJHVWdZV3gwYUc5MVoyZ2dRbEJESUdkcGRtVnVJR0o1SUhSb1pTQkpTRVJTSUdKdmVDQW9KV1FwSUdsdVpHbGpZWFJsSUdOdmJYQnZibVZ1ZEhNZ1ltbDBJR1JsY0hSb0lHbHpJR052Ym5OMFlXNTBDZ0JGY25KdmNpQjNhWFJvSUZOSldpQnRZWEpyWlhJNklHbHNiR1ZuWVd3Z2RHbHNaU0J2Wm1aelpYUUtBRWx1ZG1Gc2FXUWdjSEpsWTJsdVkzUUtBRTV2ZENCbGJtOTFaMmdnYldWdGIzSjVJSFJ2SUdoaGJtUnNaU0JpWVc1a0lIQnlaV05wYm5SekNnQkdZV2xzWldRZ2RHOGdaR1ZqYjJSbElHRnNiQ0IxYzJWa0lHTnZiWEJ2Ym1WdWRITUtBRk5wZW1VZ2IyWWdZMjlrWlNCaWJHOWpheUJrWVhSaElHVjRZMlZsW
20khNZ2MzbHpkR1Z0SUd4cGJXbDBjd29BVTJsNlpTQnZaaUIwYVd4bElHUmhkR0VnWlhoalpXVmtjeUJ6ZVhOMFpXMGdiR2x0YVhSekNnQkRZVzV1YjNRZ2RHRnJaU0JwYmlCamFHRnlaMlVnYlhWc2RHbHdiR1VnVFVOVUlHMWhjbXRsY25NS0FFTnZjbkoxY0hSbFpDQlFVRTBnYldGeWEyVnljd29BVG05MElHVnViM1ZuYUNCdFpXMXZjbmtnWm05eUlIUnBiR1VnY21WemIyeDFkR2x2Ym5NS0FFTmhibTV2ZENCMFlXdGxJR2x1SUdOb1lYSm5aU0J0ZFd4MGFYQnNaU0JqYjJ4c1pXTjBhVzl1Y3dvQVNXNTJZV3hwWkNCUVEweFNJR0p2ZUM0Z1VtVndiM0owY3lBd0lIQmhiR1YwZEdVZ1kyOXNkVzF1Y3dvQVYyVWdaRzhnYm05MElITjFjSEJ2Y25RZ1VrOUpJR2x1SUdSbFkyOWthVzVuSUVoVUlHTnZaR1ZpYkc5amEzTUtBRU5oYm01dmRDQm9ZVzVrYkdVZ1ltOTRJRzltSUhWdVpHVm1hVzVsWkNCemFYcGxjd29BUTJGdWJtOTBJSFJoYTJVZ2FXNGdZMmhoY21kbElHTnZiR3hsWTNScGIyNXpJSGRwZEdodmRYUWdjMkZ0WlNCdWRXMWlaWElnYjJZZ2FXNWthWGhsY3dvQVNXNTJZV3hwWkNCMGFXeGxZeTArZDJsdVgzaDRlQ0IyWVd4MVpYTUtBRU5oYm01dmRDQm9ZVzVrYkdVZ1ltOTRJRzltSUd4bGMzTWdkR2hoYmlBNElHSjVkR1Z6Q2dCRFlXNXViM1FnYUdGdVpHeGxJRmhNSUdKdmVDQnZaaUJzWlhOeklIUm9ZVzRnTVRZZ1lubDBaWE1LQUVOdmJYQnZibVZ1ZENCcGJtUmxlQ0FsZFNCMWMyVmtJSE5sZG1WeVlXd2dkR2x0WlhNS0FFbHVkbUZzYVdRZ1VFTk1VaUJpYjNndUlGSmxjRzl5ZEhNZ0pXUWdaVzUwY21sbGN3b0FUbTkwSUdWdWIzVm5hQ0J0WlcxdmNua2dkRzhnWTNKbFlYUmxJRlJoWnkxMGNtVmxJRzV2WkdWekNnQkRZVzV1YjNRZ2RHRnJaU0JwYmlCamFHRnlaMlVnYldOMElHUmhkR0VnZDJsMGFHbHVJRzExYkhScGNHeGxJRTFEVkNCeVpXTnZjbVJ6Q2dCRFlXNXViM1FnWkdWamIyUmxJSFJwYkdVc0lHMWxiVzl5ZVNCbGNuSnZjZ29BYjNCcVgyb3lhMTloY0hCc2VWOXVZbDkwYVd4bFgzQmhjblJ6WDJOdmNuSmxZM1JwYjI0Z1pYSnliM0lLQUZCeWIySnNaVzBnZDJsMGFDQnphMmx3Y0dsdVp5QktVRVZITWpBd01DQmliM2dzSUhOMGNtVmhiU0JsY25KdmNnb0FVSEp2WW14bGJTQjNhWFJvSUhKbFlXUnBibWNnU2xCRlJ6SXdNREFnWW05NExDQnpkSEpsWVcwZ1pYSnliM0lLQUZWdWEyNXZkMjRnYldGeWEyVnlDZ0JPYjNRZ1pXNXZkV2RvSUcxbGJXOXllU0IwYnlCaFpHUWdkR3dnYldGeWEyVnlDZ0JPYjNRZ1pXNXZkV2RvSUcxbGJXOXllU0IwYnlCaFpHUWdiV2dnYldGeWEyVnlDZ0JPYjNRZ1pXNXZkV2RvSUcxbGJXOXllU0IwYnlCMFlXdGxJR2x1SUdOb1lYSm5aU0JUU1ZvZ2JXRnlhMlZ5Q2dCRmNuSnZjaUJ5WldGa2FXNW5JRkJRVkNCdFlYSnJaWElLQUU1dmRDQmxibTkxWjJnZ2JXVnRiM0o1SUhSdklISmxZV1FnVUZCVUlHMWhjbXRsY2dvQVJYSnliM0lnY21WaFpHbHVaeUJUVDFRZ2JXRnlhMlZ5Q2dCRWFXUWdibTkwSUdkbGRDQmxlSEJsWTNSbFpDQlRUMVFnYldGeWEyVnlDZ0JGY25KdmNpQnlaV0ZrYVc1bklGQk1WQ0J0WVhKclpYSUtBRVZ5Y205eUlISmxZV1JwYm1jZ1RVTlVJRzFoY210bGNnb0FUbTkwSUdWdWIzVm5hQ0J0WlcxdmNua2dkRzhnY21WaFpDQk5RMVFnYldGeWEyVnlDZ0JPYjNRZ1pXNXZkV2RvSUhOd1lXTmxJR1p2Y2lCbGVIQmxZM1JsWkNCVFQxQWdiV0Z5YTJWeUNnQkZlSEJsWTNSbFpDQlRUMUFnYldGeWEyVnlDZ0JGY25KdmNpQnlaV0ZrYVc1bklFMURUeUJ0WVhKclpYSUtBRVZ5Y205eUlISmxZV1JwYm1jZ1VrZE9JRzFoY210bGNnb0FSWEp5YjNJZ2NtVmhaR2x1WnlCUVVFMGdiV0Z5YTJWeUNnQk9iM1FnWlc1dmRXZG9JRzFsYlc5eWVTQjBieUJ5WldGa0lGQlFUU0J0WVhKclpYSUtBRVZ5Y205eUlISmxZV1JwYm1jZ1VFeE5JRzFoY210bGNnb0FSWGh3WldOMFpXUWdSVkJJSUcxaGNtdGxjZ29BVG05MElHVnViM1ZuYUNCemNHRmpaU0JtYjNJZ2NtVnhkV2x5WldRZ1JWQklJRzFoY210bGNnb0FSWEp5YjNJZ2NtVmhaR2x1WnlCRFVrY2diV0Z5YTJWeUNnQlZibXR1YjNkdUlIQnliMmR5WlhOemFXOXVJRzl5WkdWeUlHbHVJRU5QUkNCdFlYSnJaWElLQUZWdWEyNXZkMjRnVTJOdlpDQjJZV3gxWlNCcGJpQkRUMFFnYldGeWEyVnlDZ0JGY25KdmNpQnlaV0ZrYVc1bklFTlBSQ0J0WVhKclpYSUtBRVZ5Y205eUlISmxZV1JwYm1jZ1VVTkVJRzFoY210bGNnb0FRM0p5YjNJZ2NtVmhaR2x1WnlCRFFrUWdiV0Z5YTJWeUNnQkZjbkp2Y2lCeVpXRmthVzVuSUZCUFF5QnRZWEpyWlhJS0FFVnljbTl5SUhKbFlXUnBibWNnUTA5RElHMWhjbXRsY2dvQVJYSnliM0lnY21WaFpHbHVaeUJSUTBNZ2JXRnlhMlZ5Q2dCRmNuSnZjaUJ5WldGa2FXNW5JRTFEUXlCdFlYSnJaWElLQUU1dmRDQmxibTkxWjJnZ2JXVnRiM0o1SUhSdklISmxZV1FnVFVORElHMWhjbXRsY2dvQWNtVnhkV2x5WldRZ1UwbGFJRzFoY210bGNpQnViM1FnWm05MWJtUWdhVzRnYldGcGJpQm9aV0ZrWlhJS0FISmxjWFZwY21Wa0lFTlBSQ0J0WVhKclpYSWdibTkwSUdadmRXNWtJR2x1SUcxaGFXNGdhR1ZoWkdWeUNnQnlaWEYxYVhKbFpDQlJRMFFnYldGeWEyVnlJRzV2ZENCbWIzVnVaQ0JwYmlCdFlXbHVJR2hsWVdSbGNnb0FUbTkwSUdWdWIzVm5hQ0J0WlcxdmNua2dkRzhnYUdGdVpHeGxJR3B3WldjeU1EQXdJR1pwYkdVZ2FHVmhaR1Z5Q2dCT2IzUWdaVzV2ZFdkb0lHMWxiVzl5ZVNCMGJ5QnlaV0ZrSUdobFlXUmxjZ29BUlhKeWIzSWdkMmwwYUNCS1VDQlRhV2R1WVhSMWNtVWdPaUJpWVdRZ2JXRm5hV01nYm5WdFltVnlDZ0JKYmlCVFQxUWdiV0Z5YTJWeUxDQlVVRk52ZENBb0pXUXBJR2x6SUc1dmRDQjJZV3hwWkNCeVpXZGhjbVJ6SUhSdklIUm9aU0JqZFhKeVpXNTBJRzUxYldKbGNpQnZaaUIwYVd4bExYQmhjblFnS0NWa0tTd2daMmwyYVc1bklIVndDZ0JKYmlCVFQxUWdiV0Z5YTJWeUxDQlVVRk52ZENBb0pXUXBJR2x6SUc1dmRDQjJZV3hwWkNCeVpXZGhjbVJ6SUhSdklIUm9aU0J3Y21WMmFXOTFjeUJ1ZFcxaVpYSWdiMllnZEdsc1pTMXdZWEowSUNnbFpDa3NJR2RwZG1sdVp5QjFjQW9BU1c0Z1UwOVVJRzFoY210bGNpd2dWRkJUYjNRZ0tDVmtLU0JwY3lCdWIzUWdkbUZzYVdRZ2NtVm5ZWEprY3lCMGJ5QjBhR1VnWTNWeWNtVnVkQ0J1ZFcxaVpYSWdiMllnZEdsc1pTMXdZWEowSUNob1pXRmtaWElwSUNnbFpDa3NJR2RwZG1sdVp5QjFjQW9BZEdsc1pYTWdjbVZ4ZFdseVpTQmhkQ0JzWldGemRDQnZibVVnY21WemIyeDFkR2x2YmdvQVRXRnlhMlZ5SUdseklHNXZkQ0JqYjIxd2JHbGhiblFnZDJsMGFDQnBkSE1nY0c5emFYUnBiMjRLQUZCeWIySnNaVzBnZDJsMGFDQnpaV1ZySUdaMWJtTjBhVzl1Q2dCRmNuSnZjaUJ5WldGa2FXNW5JRk5RUTI5a0lGTlFRMjlqSUdWc1pXMWxiblFzSUVsdWRtRnNhV1FnWTJKc2EzY3ZZMkpzYTJnZ1kyOX
20RZbWx1WVhScGIyNEtBRWx1ZG1Gc2FXUWdiWFZzZEdsd2JHVWdZMjl0Y0c5dVpXNTBJSFJ5WVc1elptOXliV0YwYVc5dUNnQkRZVzV1YjNRZ2RHRnJaU0JwYmlCamFHRnlaMlVnWTI5c2JHVmpkR2x2Ym5NZ2IzUm9aWElnZEdoaGJpQmhjbkpoZVNCa1pXTnZjbkpsYkdGMGFXOXVDZ0JVYjI4Z2JHRnlaMlVnZG1Gc2RXVWdabTl5SUU1d2NHMEtBRTV2ZENCbGJtOTFaMmdnWW5sMFpYTWdkRzhnY21WaFpDQk9jSEJ0Q2dCaVlXUWdjR3hoWTJWa0lHcHdaV2NnWTI5a1pYTjBjbVZoYlFvQUNTQk5ZV2x1SUdobFlXUmxjaUJ6ZEdGeWRDQndiM05wZEdsdmJqMGxiR3hwQ2drZ1RXRnBiaUJvWldGa1pYSWdaVzVrSUhCdmMybDBhVzl1UFNWc2JHa0tBRTFoY210bGNpQnphWHBsSUdsdVkyOXVjMmx6ZEdWdWRDQjNhWFJvSUhOMGNtVmhiU0JzWlc1bmRHZ0tBRlJwYkdVZ2NHRnlkQ0JzWlc1bmRHZ2djMmw2WlNCcGJtTnZibk5wYzNSbGJuUWdkMmwwYUNCemRISmxZVzBnYkdWdVozUm9DZ0JEWVc1dWIzUWdkR0ZyWlNCcGJpQmphR0Z5WjJVZ2JYVnNkR2x3YkdVZ1pHRjBZU0J6Y0dGdWJtbHVad29BVjNKdmJtY2dabXhoWndvQVJYSnliM0lnZDJsMGFDQkdWRmxRSUhOcFoyNWhkSFZ5WlNCQ2IzZ2djMmw2WlFvQVJYSnliM0lnZDJsMGFDQktVQ0J6YVdkdVlYUjFjbVVnUW05NElITnBlbVVLQUVsdWRtRnNhV1FnY0hKbFkybHVZM1FnYzJsNlpRb0FTVzVqYjI1emFYTjBaVzUwSUcxaGNtdGxjaUJ6YVhwbENnQkpiblpoYkdsa0lHMWhjbXRsY2lCemFYcGxDZ0JGY25KdmNpQjNhWFJvSUZOSldpQnRZWEpyWlhJZ2MybDZaUW9BVG05MElHVnViM1ZuYUNCdFpXMXZjbmtnZEc4Z1lXUmtJR0VnYm1WM0lIWmhiR2xrWVhScGIyNGdjSEp2WTJWa2RYSmxDZ0JPYjNRZ1pXNXZkV2RvSUcxbGJXOXllU0IwYnlCa1pXTnZaR1VnZEdsc1pRb0FSbUZwYkdWa0lIUnZJR1JsWTI5a1pTQjBhR1VnWTI5a1pYTjBjbVZoYlNCcGJpQjBhR1VnU2xBeUlHWnBiR1VLQUVOaGJtNXZkQ0IwWVd0bElHbHVJR05vWVhKblpTQmpiMnhzWldOMGFXOXVjeUIzYVhSb0lHbHVaR2w0SUhOb2RXWm1iR1VLQUVOaGJtNXZkQ0JoYkd4dlkyRjBaU0JVYVdWeUlERWdhR0Z1Wkd4bENnQk9ieUJrWldOdlpHVmtJR0Z5WldFZ2NHRnlZVzFsZEdWeWN5d2djMlYwSUhSb1pTQmtaV052WkdWa0lHRnlaV0VnZEc4Z2RHaGxJSGRvYjJ4bElHbHRZV2RsQ2dCT2IzUWdaVzV2ZFdkb0lHMWxiVzl5ZVNCMGJ5QmpjbVZoZEdVZ1ZHRm5MWFJ5WldVS0FFNXZkQ0JsYm05MVoyZ2diV1Z0YjNKNUlIUnZJSEpsYVc1cGRHbGhiR2w2WlNCMGFHVWdkR0ZuSUhSeVpXVUtBRVZ5Y205eUlISmxZV1JwYm1jZ1UxQkRiMlFnVTFCRGIyTWdaV3hsYldWdWRDd2dTVzUyWVd4cFpDQjBjbUZ1YzJadmNtMWhkR2x2YmlCbWIzVnVaQW9BUlhKeWIzSWdjbVZoWkdsdVp5QlRVRU52WkNCVFVFTnZZeUJsYkdWdFpXNTBMaUJWYm5OMWNIQnZjblJsWkNCTmFYaGxaQ0JJVkNCamIyUmxMV0pzYjJOcklITjBlV3hsSUdadmRXNWtDZ0JVYVd4bElGa2dZMjl2Y21ScGJtRjBaWE1nWVhKbElHNXZkQ0J6ZFhCd2IzSjBaV1FLQUZScGJHVWdXQ0JqYjI5eVpHbHVZWFJsY3lCaGNtVWdibTkwSUhOMWNIQnZjblJsWkFvQVNXMWhaMlVnWTI5dmNtUnBibUYwWlhNZ1lXSnZkbVVnU1U1VVgwMUJXQ0JoY21VZ2JtOTBJSE4xY0hCdmNuUmxaQW9BU2xCRlJ6SXdNREFnU0dWaFpHVnlJR0p2ZUNCdWIzUWdjbVZoWkNCNVpYUXNJQ2NsWXlWakpXTWxZeWNnWW05NElIZHBiR3dnWW1VZ2FXZHViM0psWkFvQWIzQnFYMm95YTE5dFpYSm5aVjl3Y0hRb0tTQm9ZWE1nWVd4eVpXRmtlU0JpWldWdUlHTmhiR3hsWkFvQWIzQnFYMm95YTE5aWRXbHNaRjkwY0Y5cGJtUmxlRjltY205dFgzUnNiU2dwT2lCMGFXeGxJR2x1WkdWNElHRnNiRzlqWVhScGIyNGdabUZwYkdWa0NnQk9iM1FnWlc1dmRXZG9JRzFsYlc5eWVTQjBieUJ5WldGa0lGTlBWQ0J0WVhKclpYSXVJRlJwYkdVZ2FXNWtaWGdnWVd4c2IyTmhkR2x2YmlCbVlXbHNaV1FLQUVsbmJtOXlhVzVuSUdsb1pISWdZbTk0TGlCR2FYSnpkQ0JwYUdSeUlHSnZlQ0JoYkhKbFlXUjVJSEpsWVdRS0FGcHdjSFFnSlhVZ1lXeHlaV0ZrZVNCeVpXRmtDZ0JhY0hCdElDVjFJR0ZzY21WaFpIa2djbVZoWkFvQVVGUkZVazBnWTJobFkyc2dabUZwYkhWeVpUb2dKV1FnYzNsdWRHaGxjMmw2WldRZ01IaEdSaUJ0WVhKclpYSnpJSEpsWVdRS0FB
20a0pDU0JqWW14cmR6MHlYaVZrQ2dBSkNRa2dZMkpzYTJnOU1sNGxaQW9BQ1FrSklIRnVkSE4wZVQwbFpBb0FKWE1nWkhnOUpXUXNJR1I1UFNWa0NnQUpDUWtnY205cGMyaHBablE5SldRS0FBa0pDU0J1ZFcxblltbDBjejBsWkFvQUNRa2diblZ0YkdGNVpYSnpQU1ZrQ2dBbGN5QnVkVzFqYjIxd2N6MGxaQW9BYjNCcVgycHdNbDloY0hCc2VWOWpaR1ZtT2lCaFkyNDlKV1FzSUc1MWJXTnZiWEJ6UFNWa0NnQnZjR3BmYW5BeVgyRndjR3g1WDJOa1pXWTZJR051UFNWa0xDQnVkVzFqYjIxd2N6MGxaQW9BQ1FrSklHNTFiWEpsYzI5c2RYUnBiMjV6UFNWa0NnQUpDU0IwZVhCbFBTVWplQ3dnY0c5elBTVnNiR2tzSUd4bGJqMGxaQW9BSlhNZ2MyZHVaRDBsWkFvQUNRa0pJSEZ0Wm1KcFpEMGxaQW9BSlhNZ2NISmxZejBsWkFvQUNRa2dibUlnYjJZZ2RHbHNaUzF3WVhKMElHbHVJSFJwYkdVZ1d5VmtYVDBsWkFvQUpYTWdlREU5SldRc0lIa3hQU1ZrQ2dBbGN5QjRNRDBsWkN3Z2VUQTlKV1FLQUVaaGFXeGxaQ0IwYnlCa1pXTnZaR1VnZEdsc1pTQWxaQzhsWkFvQVUyVjBkR2x1WnlCa1pXTnZaR2x1WnlCaGNtVmhJSFJ2SUNWa0xDVmtMQ1ZrTENWa0NnQkdZV2xzWldRZ2RHOGdaR1ZqYjJSbElHTnZiWEJ2Ym1WdWRDQWxaQW9BU1c1MllXeHBaQ0IyWVd4MVpTQm1iM0lnYm5WdGNtVnpiMngxZEdsdmJuTWdPaUFsWkN3Z2JXRjRJSFpoYkhWbElHbHpJSE5sZENCcGJpQnZjR1Z1YW5CbFp5NW9JR0YwSUNWa0NnQkpiblpoYkdsa0lHTnZiWEJ2Ym1WdWRDQnVkVzFpWlhJNklDVmtMQ0J5WldkaGNtUnBibWNnZEdobElHNTFiV0psY2lCdlppQmpiMjF3YjI1bGJuUnpJQ1ZrQ2dCVWIyOGdiV0Z1ZVNCUVQwTnpJQ1ZrQ2dCdmNHcGZhakpyWDNKbFlXUmZkR3h0S0NrNklHbHVkbUZzYVdRZ2RHbHNaU0J1ZFcxaVpYSWdKV1FLQUVsdWRtRnNhV1FnZEdsc1pTQnVkVzFpWlhJZ0pXUUtBRWx1ZG1Gc2FXUWdkR2xzWlNCd1lYSjBJR2x1WkdWNElHWnZjaUIwYVd4bElHNTFiV0psY2lBbFpDNGdSMjkwSUNWa0xDQmxlSEJsWTNSbFpDQWxaQW9BUlhKeWIzSWdkMmwwYUNCVFNWb2diV0Z5YTJWeU9pQnVkVzFpWlhJZ2IyWWdZMjl0Y0c5dVpXNTBJR2x6SUdsc2JHVm5ZV3dnTFQ0Z0pXUUtBRTV2ZENCbGJtOTFaMmdnYldWdGIzSjVJR1p2Y2lCamFXVnNZV0lLQUVOaGJtNXZkQ0JoYkd4dlkyRjBaU0JqWW14ckxUNWtaV052WkdWa1gyUmhkR0VLQUVaaGFXeGxaQ0IwYnlCdFpYSm5aU0JRVUZRZ1pHRjBZUW9BUm1GcGJHVmtJSFJ2SUcxbGNtZGxJRkJRVFNCa1lYUmhDZ0JKYm5aaGJHbGtJRzUxYldKbGNpQnZaaUJzWVhsbGNuTWdhVzRnUTA5RUlHMWhjbXRsY2lBNklDVmtJRzV2ZENCcGJpQnlZVzVuWlNCYk1TMDJOVFV6TlYwS0FDVnpPaVZrT21OdmJHOXlYMk50ZVd0ZmRHOWZjbWRpQ2dsRFFVNGdUazlVSUVOUFRsWkZVbFFLQUNWek9pVmtPbU52Ykc5eVgyVnplV05qWDNSdlgzSm5ZZ29KUTBGT0lFNVBWQ0JEVDA1V1JWSlVDZ0FsY3pvbFpEcGpiMnh2Y2w5emVXTmpYM1J2WDNKbllnb0pRMEZPSUU1UFZDQkRUMDVXUlZKVUNnQlRkSEpsWVcwZ2RHOXZJSE5vYjNKMExDQmxlSEJsWTNSbFpDQlRUMVFLQUZWdVlXSnNaU0IwYnlCelpYUWdkREVnYUdGdVpHeGxJR0Z6SUZSTVV3b0FVMjkwSUd4bGJtZDBhQ0JwY3lCc1pYTnpJSFJvWVc0Z2JXRnlhMlZ5SUhOcGVtVWdLeUJ0WVhKclpYSWdTVVFLQUZOMGNtVmhiU0JrYjJWeklHNXZkQ0JsYm1RZ2QybDBhQ0JGVDBNS0FFTmhibTV2ZENCb1lXNWtiR1VnWW05NElITnBlbVZ6SUdocFoyaGxjaUIwYUdGdUlESmVNeklLQUc5d2FsOXdhVjl1WlhoMFgyeHlZM0FvS1RvZ2FXNTJZV3hwWkNCamIyMXdibTh3TDJOdmJYQnViekVLQUc5d2FsOXdhVjl1WlhoMFgzSnNZM0FvS1RvZ2FXNTJZV3hwWkNCamIyMXdibTh3TDJOdmJYQnViekVLQUc5d2FsOXdhVjl1WlhoMFgyTndjbXdvS1RvZ2FXNTJZV3hwWkNCamIyMXdibTh3TDJOdmJYQnViekVLQUc5d2FsOXdhVjl1WlhoMFgzQmpjbXdvS1RvZ2FXNTJZV3hwWkNCamIyMXdibTh3TDJOdmJYQnViekVLQUc5d2FsOXdhVjl1WlhoMFgzSndZMndvS1RvZ2FXNTJZV3hwWkNCamIyMXdibTh3TDJOdmJYQnViekVLQUc5d2FsOTBNVjlrWldOdlpHVmZZMkpzYXlncE9pQjFibk4xY0hCdmNuUmxaQ0JpY0c1dlgzQnNkWE5mYjI1bElEMGdKV1FnUGowZ016RUtBRVpoYVd4bFpDQjBieUJrWldOdlpHVWdkR2xzWlNBeEx6RUtBRWx1YzNWbVptbGphV1Z1ZENCa1lYUmhJR1p2Y2lCRFRVRlFJR0p2ZUM0S0FFNWxaV1FnZEc4Z2NtVmhaQ0JoSUZCRFRGSWdZbTk0SUdKbFptOXlaU0IwYUdVZ1EwMUJVQ0JpYjNndUNnQkpibk4xWm1acFkybGxiblFnWkdGMFlTQm1iM0lnUTBSRlJpQmliM2d1Q2dCT2RXMWlaWElnYjJZZ1kyaGhibTVsYkNCa1pYTmpjbWx3ZEdsdmJpQnBjeUJsY1hWaGJDQjBieUI2WlhKdklHbHVJRU5FUlVZZ1ltOTRMZ29BVTNSeVpXRnRJR1Z5Y205eUlIZG9hV3hsSUhKbFlXUnBibWNnU2xBeUlFaGxZV1JsY2lCaWIzZzZJRzV2SUNkcGFHUnlKeUJpYjNndUNnQk9iMjRnWTI5dVptOXliV0Z1ZENCamIyUmxjM1J5WldGdElGUlFjMjkwUFQxVVRuTnZkQzRLQUZOMGNtVmhiU0JsY25KdmNpQjNhR2xzWlNCeVpXRmthVzVuSUVwUU1pQklaV0ZrWlhJZ1ltOTRPaUJpYjNnZ2JHVnVaM1JvSUdseklHbHVZMjl1YzJsemRHVnVkQzRLQUVKdmVDQnNaVzVuZEdnZ2FYTWdhVzVqYjI1emFYTjBaVzUwTGdvQVVtVnpiMngxZEdsdmJpQm1ZV04wYjNJZ2FYTWdaM0psWVhSbGNpQjBhR0Z1SUhSb1pTQnRZWGhwYlhWdElISmxjMjlzZFhScGIyNGdhVzRnZEdobElHTnZiWEJ2Ym1WdWRDNEtBRU52YlhCdmJtVnVkQ0J0WVhCd2FXNW5JSE5sWlcxeklIZHliMjVuTGlCVWNubHBibWNnZEc4Z1kyOXljbVZqZEM0S0FHOXdhbDlxTW10ZlluVnBiR1JmZEhCZmFXNWtaWGhmWm5KdmJWOTBiRzBvS1RvZ2RHbHNaU0FsWkNCb1lYTWdibThnY21WbmFYTjBaWEpsWkNCMGFXeGxMWEJoY25RZ2FXNGdWRXhOSUcxaGNtdGxjaUJ6WldkdFpXNTBjeTRLQUc5d2FsOXFNbXRmY21WaFpGOTBiRzBvS1RvZ2RHOXZJRzFoYm5rZ1ZFeE5JRzFoY210bGNuTXVDZ0J2Y0dwZmFqSnJYM0psWVdSZmRHeHRLQ2s2SUdOaGJtNXZkQ0JoYkd4dlkyRjBaU0J0WDNScGJHVmZjR0Z5ZEY5cGJtWnZjeTRLQUVsdVkyOXRjR3hsZEdVZ1kyaGhibTVsYkNCa1pXWnBibWwwYVc5dWN5NEtBRTFoYkdadmNtMWxaQ0JJVkNCamIyUmxZbXh2WTJzdUlFbHVkbUZzYVdRZ1kyOWtaV0pzYjJOcklHeGxibWQwYUNCMllXeDFaWE11Q2dCWFpTQmtieUJ1YjNRZ2MzVndjRzl5ZENCdGIzSmxJSFJvWVc0Z015QmpiMlJwYm1jZ2NHRnpjMlZ6SUdsdUlHRnVJRWhVSUdOdlpHVmliRzlqYXpzZ1ZHaHBjeUJqYjJSbFlteHZZMnR6SUdoaGN5QWxaQ0J3WVhOelpYTXVDZ0JOWVd4bWIzSnRaV1FnU0ZRZ1kyOWtaV0pzYjJOckxpQkVaV052WkdsdVp5QjBhR2x6SUdOdlpHVmliRzlqYXlCcGN5QnpkRzl3Y0dWa0xpQlVhR1
20Z5WlNCaGNtVWdKV1FnZW1WeWJ5QmlhWFJ3YkdGdVpYTWdhVzRnSldRZ1ltbDBjR3hoYm1Wekxnb0FRMkZ1Ym05MElIUmhhMlVnYVc0Z1kyaGhjbWRsSUcxMWJIUnBjR3hsSUhSeVlXNXpabTl5YldGMGFXOXVJSE4wWVdkbGN5NEtBRlZ1YTI1dmQyNGdiV0Z5YTJWeUlHaGhjeUJpWldWdUlHUmxkR1ZqZEdWa0lHRnVaQ0JuWlc1bGNtRjBaV1FnWlhKeWIzSXVDZ0JEYjJSbFl5QndjbTkyYVdSbFpDQjBieUIwYUdVZ2IzQnFYM05sZEhWd1gyUmxZMjlrWlhJZ1puVnVZM1JwYjI0Z2FYTWdibTkwSUdFZ1pHVmpiMjF3Y21WemMyOXlJR2hoYm1Sc1pYSXVDZ0JEYjJSbFl5QndjbTkyYVdSbFpDQjBieUIwYUdVZ2IzQnFYM0psWVdSZmFHVmhaR1Z5SUdaMWJtTjBhVzl1SUdseklHNXZkQ0JoSUdSbFkyOXRjSEpsYzNOdmNpQm9ZVzVrYkdWeUxnb0FSWEp5YjNJZ2NtVmhaR2x1WnlCVVRFMGdiV0Z5YTJWeUxnb0FWR2xzWlhNZ1pHOXVKM1FnWVd4c0lHaGhkbVVnZEdobElITmhiV1VnWkdsdFpXNXphVzl1TGlCVGEybHdJSFJvWlNCTlExUWdjM1JsY0M0S0FFNTFiV0psY2lCdlppQmpiMjF3YjI1bGJuUnpJQ2dsWkNrZ2FYTWdhVzVqYjI1emFYTjBaVzUwSUhkcGRHZ2dZU0JOUTFRdUlGTnJhWEFnZEdobElFMURWQ0J6ZEdWd0xnb0FTbEF5SUdKdmVDQjNhR2xqYUNCaGNtVWdZV1owWlhJZ2RHaGxJR052WkdWemRISmxZVzBnZDJsc2JDQnViM1FnWW1VZ2NtVmhaQ0JpZVNCMGFHbHpJR1oxYm1OMGFXOXVMZ29BVFdGc1ptOXliV1ZrSUVoVUlHTnZaR1ZpYkc5amF5NGdWMmhsYmlCMGFHVWdiblZ0WW1WeUlHOW1JSHBsY204Z2NHeGhibVZ6SUdKcGRIQnNZVzVsY3lCcGN5QmxjWFZoYkNCMGJ5QjBhR1VnYm5WdFltVnlJRzltSUdKcGRIQnNZVzVsY3l3Z2IyNXNlU0IwYUdVZ1kyeGxZVzUxY0NCd1lYTnpJRzFoYTJWeklITmxibk5sTENCaWRYUWdkMlVnYUdGMlpTQWxaQ0J3WVhOelpYTWdhVzRnZEdocGN5QmpiMlJsWW14dlkyc3VJRlJvWlhKbFptOXlaU3dnYjI1c2VTQjBhR1VnWTJ4bFlXNTFjQ0J3WVhOeklIZHBiR3dnWW1VZ1pHVmpiMlJsWkM0Z1ZHaHBjeUJ0WlhOellXZGxJSGRwYkd3Z2JtOTBJR0psSUdScGMzQnNZWGxsWkNCaFoyRnBiaTRLQUVsdFlXZGxJR2hoY3lCc1pYTnpJR052YlhCdmJtVnVkSE1nZEdoaGJpQmpiMlJsYzNSeVpXRnRMZ29BVG1WbFpDQjBieUJrWldOdlpHVWdkR2hsSUcxaGFXNGdhR1ZoWkdWeUlHSmxabTl5WlNCaVpXZHBiaUIwYnlCa1pXTnZaR1VnZEdobElISmxiV0ZwYm1sdVp5QmpiMlJsYzNSeVpXRnRMZ29BVUhOdmRDQjJZV3gxWlNCdlppQjBhR1VnWTNWeWNtVnVkQ0IwYVd4bExYQmhjblFnYVhNZ1pYRjFZV3dnZEc4Z2VtVnlieXdnZDJVZ1lYTnpkVzFwYm1jZ2FYUWdhWE1nZEdobElHeGhjM1FnZEdsc1pTMXdZWEowSUc5bUlIUm9aU0JqYjJSbGMzUnlaV0Z0TGdvQVFTQnRZV3htYjNKdFpXUWdZMjlrWldKc2IyTnJJSFJvWVhRZ2FHRnpJRzF2Y21VZ2RHaGhiaUJ2Ym1VZ1kyOWthVzVuSUhCaGMzTXNJR0oxZENCNlpYSnZJR3hsYm1kMGFDQm1iM0lnTW01a0lHRnVaQ0J3YjNSbGJuUnBZV3hzZVNCMGFHVWdNM0prSUhCaGMzTWdhVzRnWVc0Z1NGUWdZMjlrWldKc2IyTnJMZ29BQ1FrSklIUnBiR1V0Y0dGeWRGc2xaRjA2SUhOMFlYSmZjRzl6UFNWc2JHa3NJR1Z1WkY5b1pXRmtaWEk5Sld4c2FTd2daVzVrWDNCdmN6MGxiR3hwTGdvQVZHbHNaU0FsZFNCb1lYTWdWRkJ6YjNRZ1BUMGdNQ0JoYm1RZ1ZFNXpiM1FnUFQwZ01Dd2dZblYwSUc1dklHOTBhR1Z5SUhScGJHVXRjR0Z5ZEhNZ2QyVnlaU0JtYjNWdVpDNGdSVTlESUdseklHRnNjMjhnYldsemMybHVaeTRLQUVOdmJYQnZibVZ1ZENBbFpDQmtiMlZ6YmlkMElHaGhkbVVnWVNCdFlYQndhVzVuTGdvQWIzQnFYMm95YTE5eVpXRmtYM1JzYlNncE9pQlVURTBnYldGeWEyVnlJRzV2ZENCdlppQmxlSEJsWTNSbFpDQnphWHBsTGdvQVFTQmpiMjVtYjNKdGFXNW5JRXBRTWlCeVpXRmtaWElnYzJoaGJHd2dhV2R1YjNKbElHRnNiQ0JEYjJ4dmRYSWdVM0JsWTJsbWFXTmhkR2x2YmlCaWIzaGxjeUJoWm5SbGNpQjBhR1VnWm1seWMzUXNJSE52SUhkbElHbG5ibTl5WlNCMGFHbHpJRzl1WlM0S0FGUm9aU0J6YVdkdVlYUjFjbVVnWW05NElHMTFjM1FnWW1VZ2RHaGxJR1pwY25OMElHSnZlQ0JwYmlCMGFHVWdabWxzWlM0S0FGUm9aU0FnWW05NElHMTFjM1FnWW1VZ2RHaGxJR1pwY25OMElHSnZlQ0JwYmlCMGFHVWdabWxzWlM0S0FGUm9aU0JtZEhsd0lHSnZlQ0J0ZFhOMElHSmxJSFJvWlNCelpXTnZibVFnWW05NElHbHVJSFJvWlNCbWFXeGxMZ29BUm1GcGJHVmtJSFJ2SUdSbFkyOWtaUzRLQUUxaGJHWnZjbTFsWkNCSVZDQmpiMlJsWW14dlkyc3VJRWx1WTI5eWNtVmpkQ0JOUlV3Z2MyVm5iV1Z1ZENCelpYRjFaVzVqWlM0S0FFTnZiWEJ2Ym1WdWRDQWxaQ0JwY3lCdFlYQndaV1FnZEhkcFkyVXVDZ0J2Y0dwZmFqSnJYM0psWVdSZmRHeHRLQ2s2SUZOVUlEMGdNeUJwY3lCcGJuWmhiR2xrTGdvQVQyNXNlU0J2Ym1VZ1EwMUJVQ0JpYjNnZ2FYTWdZV3hzYjNkbFpDNEtBRmRsSUc1bFpXUWdZVzRnYVcxaFoyVWdjSEpsZG1sdmRYTnNlU0JqY21WaGRHVmtMZ29BU1VoRVVpQmliM2hmYldsemMybHVaeTRnVW1WeGRXbHlaV1F1Q2dCS1VESklJR0p2ZUNCdGFYTnphVzVuTGlCU1pYRjFhWEpsWkM0S0FFNXZkQ0J6ZFhKbElHaHZkeUIwYUdGMElHaGhjSEJsYm1Wa0xnb0FUV0ZwYmlCb1pXRmtaWElnYUdGeklHSmxaVzRnWTI5eWNtVmpkR3g1SUdSbFkyOWtaV1F1Q2dCVWFXeGxJQ1ZrTHlWa0lHaGhjeUJpWldWdUlHUmxZMjlrWldRdUNnQklaV0ZrWlhJZ2IyWWdkR2xzWlNBbFpDQXZJQ1ZrSUdoaGN5QmlaV1Z1SUhKbFlXUXVDZ0JGYlhCMGVTQlRUMVFnYldGeWEyVnlJR1JsZEdWamRHVmtPaUJRYzI5MFBTVmtMZ29BUkdseVpXTjBJSFZ6WlNCaGRDQWpKV1FnYUc5M1pYWmxjaUJ3WTI5c1BTVmtMZ29BU1cxd2JHVnRaVzUwWVhScGIyNGdiR2x0YVhSaGRHbHZiam9nWm05eUlIQmhiR1YwZEdVZ2JXRndjR2x1Wnl3Z2NHTnZiRnNsWkYwZ2MyaHZkV3hrSUdKbElHVnhkV0ZzSUhSdklDVmtMQ0JpZFhRZ2FYTWdaWEYxWVd3Z2RHOGdKV1F1Q2dCSmJuWmhiR2xrSUdOdmJYQnZibVZ1ZEM5d1lXeGxkSFJsSUdsdVpHVjRJR1p2Y2lCa2FYSmxZM1FnYldGd2NHbHVaeUFsWkM0S0FFbHVkbUZzYVdRZ2RtRnNkV1VnWm05eUlHTnRZWEJiSldSZExtMTBlWEFnUFNBbFpDNEtBRkJ6YjNRZ2RtRnNkV1VnYVhNZ2JtOTBJR052Y25KbFkzUWdjbVZuWVhKa2N5QjBieUIwYUdVZ1NsQkZSekl3TURBZ2JtOXliVG9nSldRdUNnQk5ZV3htYjNKdFpXUWdTRlFnWTI5a1pXSnNiMk5yTGlCV1RFTWdZMjlrWlNCd2NtOWtkV05sY3lCemFXZHVhV1pwWTJGdWRDQnpZVzF3YkdWeklHOTFkSE5wWkdVZ2RHaGxJR052WkdWaWJHOWpheUJoY21WaExnb0FWVzVsZUhCbFkzUmxaQ0JQVDAwdUNnQXpNaUJpYVhSeklHRnlaU0J1YjNRZ1pXNXZkV2RvSUhSdklHUmxZMjlrWlNCMGFHbHpJR0
2052WkdWaWJHOWpheXdnYzJsdVkyVWdkR2hsSUc1MWJXSmxjaUJ2WmlCaWFYUndiR0Z1WlN3Z0pXUXNJR2x6SUd4aGNtZGxjaUIwYUdGdUlETXdMZ29BUW05MGRHOXRJSEJ2YzJsMGFXOXVJRzltSUhSb1pTQmtaV052WkdWa0lHRnlaV0VnS0hKbFoybHZibDk1TVQwbFpDa2djMmh2ZFd4a0lHSmxJRDRnTUM0S0FGSnBaMmgwSUhCdmMybDBhVzl1SUc5bUlIUm9aU0JrWldOdlpHVmtJR0Z5WldFZ0tISmxaMmx2Ymw5NE1UMGxaQ2tnYzJodmRXeGtJR0psSUQ0Z01DNEtBRlZ3SUhCdmMybDBhVzl1SUc5bUlIUm9aU0JrWldOdlpHVmtJR0Z5WldFZ0tISmxaMmx2Ymw5NU1EMGxaQ2tnYzJodmRXeGtJR0psSUQ0OUlEQXVDZ0JNWldaMElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCa1pXTnZaR1ZrSUdGeVpXRWdLSEpsWjJsdmJsOTRNRDBsWkNrZ2MyaHZkV3hrSUdKbElENDlJREF1Q2dCRmNuSnZjaUJ5WldGa2FXNW5JRkJRVkNCdFlYSnJaWEk2SUhCaFkydGxkQ0JvWldGa1pYSWdhR0YyWlNCaVpXVnVJSEJ5WlhacGIzVnpiSGtnWm05MWJtUWdhVzRnZEdobElHMWhhVzRnYUdWaFpHVnlJQ2hRVUUwZ2JXRnlhMlZ5S1M0S0FGTjBZWEowSUhSdklISmxZV1FnYWpKcklHMWhhVzRnYUdWaFpHVnlJQ2dsYkd4a0tTNEtBRUp2ZEhSdmJTQndiM05wZEdsdmJpQnZaaUIwYUdVZ1pHVmpiMlJsWkNCaGNtVmhJQ2h5WldkcGIyNWZlVEU5SldRcElHbHpJRzkxZEhOcFpHVWdkR2hsSUdsdFlXZGxJR0Z5WldFZ0tGbHphWG85SldRcExnb0FWWEFnY0c5emFYUnBiMjRnYjJZZ2RHaGxJR1JsWTI5a1pXUWdZWEpsWVNBb2NtVm5hVzl1WDNrd1BTVmtLU0JwY3lCdmRYUnphV1JsSUhSb1pTQnBiV0ZuWlNCaGNtVmhJQ2haYzJsNlBTVmtLUzRLQUZKcFoyaDBJSEJ2YzJsMGFXOXVJRzltSUhSb1pTQmtaV052WkdWa0lHRnlaV0VnS0hKbFoybHZibDk0TVQwbFpDa2dhWE1nYjNWMGMybGtaU0IwYUdVZ2FXMWhaMlVnWVhKbFlTQW9XSE5wZWowbFpDa3VDZ0JNWldaMElIQnZjMmwwYVc5dUlHOW1JSFJvWlNCa1pXTnZaR1ZrSUdGeVpXRWdLSEpsWjJsdmJsOTRNRDBsWkNrZ2FYTWdiM1YwYzJsa1pTQjBhR1VnYVcxaFoyVWdZWEpsWVNBb1dITnBlajBsWkNrdUNnQkNiM1IwYjIwZ2NHOXphWFJwYjI0Z2IyWWdkR2hsSUdSbFkyOWtaV1FnWVhKbFlTQW9jbVZuYVc5dVgza3hQU1ZrS1NCcGN5QnZkWFJ6YVdSbElIUm9aU0JwYldGblpTQmhjbVZoSUNoWlQzTnBlajBsWkNrdUNnQlZjQ0J3YjNOcGRHbHZiaUJ2WmlCMGFHVWdaR1ZqYjJSbFpDQmhjbVZoSUNoeVpXZHBiMjVmZVRBOUpXUXBJR2x6SUc5MWRITnBaR1VnZEdobElHbHRZV2RsSUdGeVpXRWdLRmxQYzJsNlBTVmtLUzRLQUZKcFoyaDBJSEJ2YzJsMGFXOXVJRzltSUhSb1pTQmtaV052WkdWa0lHRnlaV0VnS0hKbFoybHZibDk0TVQwbFpDa2dhWE1nYjNWMGMybGtaU0IwYUdVZ2FXMWhaMlVnWVhKbFlTQW9XRTl6YVhvOUpXUXBMZ29BVEdWbWRDQndiM05wZEdsdmJpQnZaaUIwYUdVZ1pHVmpiMlJsWkNCaGNtVmhJQ2h5WldkcGIyNWZlREE5SldRcElHbHpJRzkxZEhOcFpHVWdkR2hsSUdsdFlXZGxJR0Z5WldFZ0tGaFBjMmw2UFNWa0tTNEtBRk5wZW1VZ2VDQnZaaUIwYUdVZ1pHVmpiMlJsWkNCamIyMXdiMjVsYm5RZ2FXMWhaMlVnYVhNZ2FXNWpiM0p5WldOMElDaGpiMjF3V3lWa1hTNTNQU1ZrS1M0S0FGTnBlbVVnZVNCdlppQjBhR1VnWkdWamIyUmxaQ0JqYjIxd2IyNWxiblFnYVcxaFoyVWdhWE1nYVc1amIzSnlaV04wSUNoamIyMXdXeVZrWFM1b1BTVmtLUzRLQUZScGJHVWdjbVZoWkN3Z1pHVmpiMlJsWkNCaGJtUWdkWEJrWVhSbFpDQnBjeUJ1YjNRZ2RHaGxJR1JsYzJseVpXUWdiMjVsSUNnbFpDQjJjeUFsWkNrdUNnQkpiblpoYkdsa0lHTnZiWEJ2Ym1WdWRDQnBibVJsZUNBbFpDQW9QajBnSldRcExnb0FiM0JxWDNKbFlXUmZhR1ZoWkdWeUtDa2djMmh2ZFd4a0lHSmxJR05oYkd4bFpDQmlaV1p2Y21VZ2IzQnFYM05sZEY5a1pXTnZaR1ZrWDJOdmJYQnZibVZ1ZEhNb0tTNEtBRTFsYlc5eWVTQmhiR3h2WTJGMGFXOXVJR1poYVd4MWNtVWdhVzRnYjNCcVgycHdNbDloY0hCc2VWOXdZMnh5S0NrdUNnQnBiV0ZuWlMwK1kyOXRjSE5iSldSZExtUmhkR0VnUFQwZ1RsVk1UQ0JwYmlCdmNHcGZhbkF5WDJGd2NHeDVYM0JqYkhJb0tTNEtBR2x1ZG1Gc2FXUWdZbTk0SUhOcGVtVWdKV1FnS0NWNEtRb0FSbUZwYkNCMGJ5QnlaV0ZrSUhSb1pTQmpkWEp5Wlc1MElHMWhjbXRsY2lCelpXZHRaVzUwSUNnbEkzZ3BDZ0JGY25KdmNpQjNhWFJvSUZOSldpQnRZWEpyWlhJNklFbElSRklnZHlnbGRTa2dhQ2dsZFNrZ2RuTXVJRk5KV2lCM0tDVjFLU0JvS0NWMUtRb0FSWEp5YjNJZ2NtVmhaR2x1WnlCRFQwTWdiV0Z5YTJWeUlDaGlZV1FnYm5WdFltVnlJRzltSUdOdmJYQnZibVZ1ZEhNcENnQkpiblpoYkdsa0lHNTFiV0psY2lCdlppQjBhV3hsY3lBNklDVjFJSGdnSlhVZ0tHMWhlR2x0ZFcwZ1ptbDRaV1FnWW5rZ2FuQmxaekl3TURBZ2JtOXliU0JwY3lBMk5UVXpOU0IwYVd4bGN5a0tBRWx1ZG1Gc2FXUWdiblZ0WW1WeUlHOW1JR052YlhCdmJtVnVkSE1nS0dsb1pISXBDZ0JPYjNRZ1pXNXZkV2RvSUcxbGJXOXllU0IwYnlCb1lXNWtiR1VnYVcxaFoyVWdhR1ZoWkdWeUlDaHBhR1J5S1FvQVYzSnZibWNnZG1Gc2RXVnpJR1p2Y2pvZ2R5Z2xaQ2tnYUNnbFpDa2diblZ0WTI5dGNITW9KV1FwSUNocGFHUnlLUW9BU1c1MllXeHBaQ0IyWVd4MVpYTWdabTl5SUdOdmJYQWdQU0FsWkNBNklHUjRQU1YxSUdSNVBTVjFJQ2h6YUc5MWJHUWdZbVVnWW1WMGQyVmxiaUF4SUdGdVpDQXlOVFVnWVdOamIzSmthVzVuSUhSdklIUm9aU0JLVUVWSE1qQXdNQ0J1YjNKdEtRb0FRbUZrSUdsdFlXZGxJR2hsWVdSbGNpQmliM2dnS0dKaFpDQnphWHBsS1FvQVFtRmtJRU5QVEZJZ2FHVmhaR1Z5SUdKdmVDQW9ZbUZrSUhOcGVtVXBDZ0JDWVdRZ1FsQkRReUJvWldGa1pYSWdZbTk0SUNoaVlXUWdjMmw2WlNrS0FFVnljbTl5SUhkcGRHZ2dVMGxhSUcxaGNtdGxjam9nYm1WbllYUnBkbVVnYjNJZ2VtVnlieUJwYldGblpTQnphWHBsSUNnbGJHeGtJSGdnSld4c1pDa0tBSE5yYVhBNklITmxaMjFsYm5RZ2RHOXZJR3h2Ym1jZ0tDVmtLU0IzYVhSb0lHMWhlQ0FvSldRcElHWnZjaUJqYjJSbFlteHZZMnNnSldRZ0tI
20QTlKV1FzSUdJOUpXUXNJSEk5SldRc0lHTTlKV1FwQ2dCeVpXRmtPaUJ6WldkdFpXNTBJSFJ2YnlCc2IyNW5JQ2dsWkNrZ2QybDBhQ0J0WVhnZ0tDVmtLU0JtYjNJZ1kyOWtaV0pzYjJOcklDVmtJQ2h3UFNWa0xDQmlQU1ZrTENCeVBTVmtMQ0JqUFNWa0tRb0FSR1Z6Y0dsMFpTQktVRElnUWxCRElUMHlOVFVzSUhCeVpXTnBjMmx2YmlCaGJtUXZiM0lnYzJkdVpDQjJZV3gxWlhNZ1ptOXlJR052YlhCYkpXUmRJR2x6SUdScFptWmxjbVZ1ZENCMGFHRnVJR052YlhCYk1GMDZDaUFnSUNBZ0lDQWdXekJkSUhCeVpXTW9KV1FwSUhObmJtUW9KV1FwSUZzbFpGMGdjSEpsWXlnbFpDa2djMmR1WkNnbFpDa0tBR0poWkNCamIyMXdiMjVsYm5RZ2JuVnRZbVZ5SUdsdUlGSkhUaUFvSldRZ2QyaGxiaUIwYUdWeVpTQmhjbVVnYjI1c2VTQWxaQ2tLQUVWeWNtOXlJSGRwZEdnZ1UwbGFJRzFoY210bGNqb2diblZ0WW1WeUlHOW1JR052YlhCdmJtVnVkQ0JwY3lCdWIzUWdZMjl0Y0dGMGFXSnNaU0IzYVhSb0lIUm9aU0J5WlcxaGFXNXBibWNnYm5WdFltVnlJRzltSUhCaGNtRnRaWFJsY25NZ0tDQWxaQ0IyY3lBbFpDa0tBRVZ5Y205eUlIZHBkR2dnVTBsYUlHMWhjbXRsY2pvZ2FXNTJZV3hwWkNCMGFXeGxJSE5wZW1VZ0tIUmtlRG9nSldRc0lIUmtlVG9nSldRcENnQkNZV1FnUTA5TVVpQm9aV0ZrWlhJZ1ltOTRJQ2hpWVdRZ2MybDZaVG9nSldRcENnQkNZV1FnUTA5TVVpQm9aV0ZrWlhJZ1ltOTRJQ2hEU1VWTVlXSXNJR0poWkNCemFYcGxPaUFsWkNrS0FGQlVSVkpOSUdOb1pXTnJJR1poYVd4MWNtVTZJQ1ZrSUhKbGJXRnBibWx1WnlCaWVYUmxjeUJwYmlCamIyUmxJR0pzYjJOcklDZ2xaQ0IxYzJWa0lDOGdKV1FwQ2dCTllXeG1iM0p0WldRZ1NGUWdZMjlrWldKc2IyTnJMaUJQYm1VZ2IyWWdkR2hsSUdadmJHeHZkMmx1WnlCamIyNWthWFJwYjI0Z2FYTWdibTkwSUcxbGREb2dNaUE4UFNCVFkzVndJRHc5SUcxcGJpaE1ZM1Z3TENBME1EYzVLUW9BU1c1MllXeHBaQ0IyWVd4MVpYTWdabTl5SUdOdmJYQWdQU0FsWkNBNklIQnlaV005SlhVZ0tITm9iM1ZzWkNCaVpTQmlaWFIzWldWdUlERWdZVzVrSURNNElHRmpZMjl5WkdsdVp5QjBieUIwYUdVZ1NsQkZSekl3TURBZ2JtOXliUzRnVDNCbGJrcHdaV2NnYjI1c2VTQnpkWEJ3YjNKMGN5QjFjQ0IwYnlBek1Ta0tBRWx1ZG1Gc2FXUWdZbWwwSUc1MWJXSmxjaUFsWkNCcGJpQnZjR3BmZERKZmNtVmhaRjl3WVdOclpYUmZhR1ZoWkdWeUtDa0tBRk4wY21WaGJTQmxjbkp2Y2lFS0FFVnljbTl5SUc5dUlIZHlhWFJwYm1jZ2MzUnlaV0Z0SVFvQVUzUnlaV0Z0SUhKbFlXTm9aV1FnYVhSeklHVnVaQ0FoQ2dCRmVIQmxZM1JsWkNCaElGTlBReUJ0WVhKclpYSWdDZ0JKYm5aaGJHbGtJR0p2ZUNCemFYcGxJQ1ZrSUdadmNpQmliM2dnSnlWakpXTWxZeVZqSnk0Z1RtVmxaQ0FsWkNCaWVYUmxjeXdnSldRZ1lubDBaWE1nY21WdFlXbHVhVzVuSUFvQVRXRnNabTl5YldWa0lFaFVJR052WkdWaWJHOWpheTRnUkdWamIyUnBibWNnZEdocGN5QmpiMlJsWW14dlkyc2dhWE1nYzNSdmNIQmxaQzRnVlY5eElHbHpJR3hoY21kbGNpQjBhR0Z1SUhwbGNtOGdZbWwwY0d4aGJtVnpJQ3NnTVNBS0FFMWhiR1p2Y20xbFpDQklWQ0JqYjJSbFlteHZZMnN1SUVSbFkyOWthVzVuSUhSb2FYTWdZMjlrWldKc2IyTnJJR2x6SUhOMGIzQndaV1F1SUZWZmNTQnBjMnhoY21kbGNpQjBhR0Z1SUdKcGRIQnNZVzVsY3lBcklERWdDZ0JEVDB4U0lFSlBXQ0J0WlhSb0lIWmhiSFZsSUdseklHNXZkQ0JoSUhKbFozVnNZWElnZG1Gc2RXVWdLQ1ZrS1N3Z2MyOGdkMlVnZDJsc2JDQnBaMjV2Y21VZ2RHaGxJR1Z1ZEdseVpTQkRiMnh2ZFhJZ1UzQmxZMmxtYVdOaGRHbHZiaUJpYjNndUlBb0FWMmhwYkdVZ2NtVmhaR2x1WnlCRFExQmZVVTVVVTFSWklHVnNaVzFsYm5RZ2FXNXphV1JsSUZGRFJDQnZjaUJSUTBNZ2JXRnlhMlZ5SUhObFoyMWxiblFzSUc1MWJXSmxjaUJ2WmlCemRXSmlZVzVrY3lBb0pXUXBJR2x6SUdkeVpXRjBaWElnZEc4Z1QxQktYMG95UzE5TlFWaENRVTVFVXlBb0pXUXBMaUJUYnlCM1pTQnNhVzFwZENCMGFHVWdiblZ0WW1WeUlHOW1JR1ZzWlcxbGJuUnpJSE4wYjNKbFpDQjBieUJQVUVwZlNqSkxYMDFCV0VKQlRrUlRJQ2dsWkNrZ1lXNWtJSE5yYVhBZ2RHaGxJSEpsYzNRdUlBb0FTbEF5SUVsSVJGSWdZbTk0T2lCamIyMXdjbVZ6YzJsdmJpQjBlWEJsSUdsdVpHbGpZWFJsSUhSb1lYUWdkR2hsSUdacGJHVWdhWE1nYm05MElHRWdZMjl1Wm05eWJXbHVaeUJLVURJZ1ptbHNaU0FvSldRcElBb0FWR2xzWlNCcGJtUmxlQ0J3Y205MmFXUmxaQ0JpZVNCMGFHVWdkWE5sY2lCcGN5QnBibU52Y25KbFkzUWdKV1FnS0cxaGVDQTlJQ1ZrS1NBS0FFVnljbTl5SUdSbFkyOWthVzVuSUdOdmJYQnZibVZ1ZENBbFpDNEtWR2hsSUc1MWJXSmxjaUJ2WmlCeVpYTnZiSFYwYVc5dWN5QjBieUJ5WlcxdmRtVWdLQ1ZrS1NCcGN5Qm5jbVZoZEdWeUlHOXlJR1Z4ZFdGc0lIUm9ZVzRnZEdobElHNTFiV0psY2lCdlppQnlaWE52YkhWMGFXOXVjeUJ2WmlCMGFHbHpJR052YlhCdmJtVnVkQ0FvSldRcENrMXZaR2xtZVNCMGFHVWdZM0JmY21Wa2RXTmxJSEJoY21GdFpYUmxjaTRLQ2dCSmJXRm5aU0JrWVhSaElHaGhjeUJpWldWdUlIVndaR0YwWldRZ2QybDBhQ0IwYVd4bElDVmtMZ29LQUNNQXBRQkRBR1lBZ3dEdXFCUUEzOWdqQUw0UVF3RC85WU1BZmlCVkFGOVJJd0ExQUVNQVRrU0RBTTdFRkFEUHpDTUEvdUpEQVArWmd3Q1dBTVVBUHpFakFLVUFRd0JlUklNQXpzZ1VBTjhSSXdEKzlFTUEvL3lEQUo0QVZRQjNBQ01BTlFCREFQL3hnd0N1aUJRQXR3QWpBUDc0UXdEdjVJTUFqb2pGQUI4Ukl3Q2xBRU1BWmdDREFPNm9GQURmVkNNQXZoQkRBTzhpZ3dCK0lGVUFmeUlqQURVQVF3Qk9SSU1BenNRVUFMOFJJd0QrNGtNQTl3Q0RBSllBeFFBL0lpTUFwUUJEQUY1RWd3RE95QlFBMXdBakFQNzBRd0QvdW9NQW5nQlZBRzhBSXdBMUFFTUEvK2FEQUs2SUZBQ3ZvaU1BL3ZoREFPY0Fnd0NPaU1VQUx5SUNBTVVBaEFCK0lBSUF6c1FrQVBjQUFnRCtva1FBVmdBQ0FKNEFGQURYQUFJQXZoQ0VBR1lBQWdDdWlDUUEzeEVDQU82b1JBQTJBQUlBam9nVUFCOFJBZ0RGQUlRQWJnQUNBTTZJSkFEL2lBSUEvcmhFQUU1RU
20FnQ1dBQlFBdHdBQ0FQN2toQUJlUkFJQXBnQWtBT2NBQWdEZVZFUUFMaUlDQUQ0QUZBQjNBQUlBeFFDRUFINGdBZ0RPeENRQS8vRUNBUDZpUkFCV0FBSUFuZ0FVQUw4UkFnQytFSVFBWmdBQ0FLNklKQUR2SWdJQTdxaEVBRFlBQWdDT2lCUUFmeUlDQU1VQWhBQnVBQUlBem9na0FPL2tBZ0QrdUVRQVRrUUNBSllBRkFDdm9nSUEvdVNFQUY1RUFnQ21BQ1FBMzlnQ0FONVVSQUF1SWdJQVBnQVVBRjlSQWdCVkFJUUFaZ0FDQU42SUpBRC9NZ0lBL2hGRUFFNUVBZ0N1QUJRQXR3QUNBSDR4aEFCZVVRSUF4Z0FrQU5jQUFnRHVJRVFBSGhFQ0FKNEFGQUIzQUFJQVZRQ0VBRjVVQWdET1JDUUE1d0FDQVA3eFJBQTJBQUlBcGdBVUFGOVZBZ0QrZElRQVBoRUNBTDRnSkFCL2RBSUEzc1JFQVAvNEFnQ1dBQlFBTHlJQ0FGVUFoQUJtQUFJQTNvZ2tBUGNBQWdEK0VVUUFUa1FDQUs0QUZBQ1BpQUlBZmpHRUFGNVJBZ0RHQUNRQXo4Z0NBTzRnUkFBZUVRSUFuZ0FVQUc4QUFnQlZBSVFBWGxRQ0FNNUVKQURmMFFJQS92RkVBRFlBQWdDbUFCUUFmeUlDQVA1MGhBQStFUUlBdmlBa0FMOGlBZ0RleEVRQTd5SUNBSllBRkFBL01nTUEzdFQ5OVAvOEZBQStFVlVBajRnREFMNHloUURuQUNVQVhsSCtxbjl5QXdET1JQMzQ3MFFVQUg1a1JRQ3ZvZ01BcGdCZFZkK1ovZkUyQVA3MWIySURBTjdSL2ZULzVoUUFmbkZWQUwreEF3Q3VpSVVBMzlVbEFFNUUvdkovWmdNQXhnRDkrTy9pRkFCZVZFVUFueEVEQUpZQVhWWFB5UDN4SGhIdXlHY0FBd0RlMVAzMC8vTVVBRDRSVlFDL0VRTUF2aktGQU4vWUpRQmVVZjZxTHlJREFNNUUvZmozQUJRQWZtUkZBSitZQXdDbUFGMVYxd0Q5OFRZQS92VnZSQU1BM3RIOTlQKzVGQUIrY1ZVQXR3QURBSzZJaFFEZjNDVUFUa1QrOG5jQUF3REdBUDM0NytRVUFGNVVSUUIvY3dNQWxnQmRWYis0L2ZFZUVlN0lQeklDQUtVQWhBQitRQUlBM2hBa0FOOFJBZ0QrY2tRQVZnQUNBSzZvRkFDL3NnSUFsZ0NFQUdZQUFnREdBQ1FBNXdBQ0FPN0lSQUF1SWdJQWpvZ1VBSGNBQWdDbEFJUUFiZ0FDQU02SUpBRDNBQUlBL3BGRUFEWUFBZ0N1b2hRQXI2b0NBUDY0aEFCZUFBSUF2Z0FrQU0vRUFnRHVSRVFBLy9RQ0FENGlGQUFmRVFJQXBRQ0VBSDVBQWdEZUVDUUEvNWtDQVA1eVJBQldBQUlBcnFnVUFMY0FBZ0NXQUlRQVpnQUNBTVlBSkFEWEFBSUE3c2hFQUM0aUFnQ09pQlFBVDBRQ0FLVUFoQUJ1QUFJQXpvZ2tBTy9pQWdEK2tVUUFOZ0FDQUs2aUZBQi9SQUlBL3JpRUFGNEFBZ0MrQUNRQW53QUNBTzVFUkFEL2RnSUFQaUlVQUQ4eEF3REdBSVVBLzluOThuNWsvdkcvbVFNQXJxSWxBTzltL2ZSV0FPN2lmM01EQUw2WVJRRDNBUDM0WmdEK2RwK0lBd0NPaUJVQTM5V2xBQzRpM3BoUFJBTUF2cktGQVAvOC9mSnVJcFlBdHdBREFLNnFKUURmMGYzME5nRGUxRzlrQXdDdXFFVUE3K3I5K0Y1RTd1aC9jUU1BUGpJVkFNL0VwUUQvK3M2SVB6RURBTVlBaFFEL2QvM3lmbVQrOGIrekF3Q3VvaVVBNXdEOTlGWUE3dUozQUFNQXZwaEZBTy9rL2ZobUFQNTJmMllEQUk2SUZRRFhBS1VBTGlMZW1EOHpBd0Mrc29VQS8zWDk4bTRpbGdDZmtRTUFycW9sQU4rWi9mUTJBTjdVWDFFREFLNm9SUUR2N1AzNFhrVHU2SDl5QXdBK01oVUF2N0dsQVAvenpvZ2ZFUU1BM2xUOThoNFJGQUIrWlA3NHo4d0RBTDZSUlFEdklpVUFMaUwrODQrSUF3REdBSVVBOXdBVUFGNFIvdnl2cUFNQXBnQTFBTi9JL2ZFK01mNW1iMlFEQU03SS9mTC85UlFBWmdEKzlMKzZBd0N1SWtVQTV3QWxBRDR5L3VwL2N3TUF2cktGQU45VkZBQldBSDV4bnhFREFKWUFOUURQeFAzeFBqUHU2RTlFQXdEZVZQM3lIaEVVQUg1ay92aS9tUU1BdnBGRkFPL2lKUUF1SXY3emYyWURBTVlBaFFEdjVCUUFYaEgrL0orWUF3Q21BRFVBMXdEOThUNHgvbVp2SWdNQXpzajk4dis1RkFCbUFQNzB0d0FEQUs0aVJRRGYwU1VBUGpMKzZuY0FBd0Mrc29VQTcrd1VBRllBZm5GL2NnTUFsZ0ExQUwrNC9mRStNKzdvWDFUODhkN1IvZnJYQVB6NEZnRDkvMzkwL1BSK2NmM3p2N1A4OHUvcTd1aFBSUHp4cmlJRkFMKzQvUGozQVA3OGR3RDg5RjRSL2ZWL2RmenkzOWp1NGo4ei9QRytzdjM2ejRqOCtQLzcvZjkvYy96MGJnRDk4N2NBL1BMdlp2NzVQekg4OFo0QUJRQy91dno0Ly8zKzltY0EvUFFtQVAzMWo0ajg4dC9jM3RRdkl2engzdEg5K3MvRS9QZ1dBUDMvZjNMODlINXgvZk8vbWZ6eTcrenU2RWNBL1BHdUlnVUFwd0Q4K1AvMy92eFhBUHowWGhIOTlaY0EvUExmMWU3aU53RDg4YjZ5L2ZySEFQejQvLzc5LzM5bS9QUnVBUDN6cjZqODh1Y0EvdmsvTXZ6eG5nQUZBTCt4L1BqdjVQNzJYMVQ4OUNZQS9mV0hBUHp5MzVuZTFCOFJFd0JsQUVNQTNnQ0RBSTJJSXdCT1JCTUFwUUJEQUs2SWd3QTFBQ01BMXdBVEFNVUFRd0NlQUlNQVZRQWpBQzRpRXdDVkFFTUFmZ0NEQVA0UUl3QjNBQk1BWlFCREFNNklnd0NOaUNNQUhoRVRBS1VBUXdCZUFJTUFOUUFqQU9jQUV3REZBRU1BdmdDREFGVUFJd0QvRVJNQWxRQkRBRDRBZ3dEdVFDTUFyNklUQUdVQVF3RGVBSU1BallnakFFNUVFd0NsQUVNQXJvaURBRFVBSXdEdlJCTUF4UUJEQUo0QWd3QlZBQ01BTGlJVEFKVUFRd0IrQUlNQS9oQWpBTGNBRXdCbEFFTUF6b2lEQUkySUl3QWVFUk1BcFFCREFGNEFnd0ExQUNNQXo4UVRBTVVBUXdDK0FJTUFWUUFqQVBjQUV3Q1ZBRU1BUGdDREFPNUFJd0J2QUFFQWhBQUJBRllBQVFBVUFBRUExd0FCQUNRQUFRQ1dBQUVBUlFBQkFIY0FBUUNFQUFFQXhnQUJBQlFBQVFDUGlBRUFKQUFCQVBjQUFRQTFBQUVBTHlJQkFJUUFBUUQrUUFFQUZBQUJBTGNBQVFBa0FBRUF2d0FCQUVVQUFRQm5BQUVBaEFBQkFLWUFBUUFVQUFFQVQwUUJBQ1FBQVFEbkFBRUFOUUFCQUQ4UkFRQ0VBQUVBVmdBQkFCUUFBUURQQUFFQUpBQUJBSllBQVFCRkFBRUFid0FCQUlRQUFRREdBQUVBRkFBQkFKOEFBUUFrQUFFQTd3QUJBRFVBQVFBL01nRUFoQUFCQVA1QUFRQVVBQUVBcndBQkFDUUFBUUQvUkFFQVJRQUJBRjhBQVFDRUFBRUFwZ0FCQUJRQUFRQi9BQUVBSkFBQkFOOEFBUUExQUFFQUh4RUJBQ1FBQVFCV0FBRUFoUUFCQUw4QUFRQVVBQUVBOXdBQkFNWUFBUUIzQUFFQUpBQUJBUC80QVFCRkFBRUFmd0FCQUJRQUFRRGZBQUVBcGdBQkFEOHhBUUFrQUFFQUxpSUJBSVVBQVFDM0FBRUFGQUFCQU85RU
20FRQ3VvZ0VBWndBQkFDUUFBUUQvVVFFQVJRQUJBSmNBQVFBVUFBRUF6d0FCQURZQUFRQS9JZ0VBSkFBQkFGWUFBUUNGQUFFQXY3SUJBQlFBQVFEdlFBRUF4Z0FCQUc4QUFRQWtBQUVBLzNJQkFFVUFBUUNmQUFFQUZBQUJBTmNBQVFDbUFBRUFUMFFCQUNRQUFRQXVJZ0VBaFFBQkFLK29BUUFVQUFFQTV3QUJBSzZpQVFCZkFBRUFKQUFCQVA5RUFRQkZBQUVBajRnQkFCUUFBUUN2cWdFQU5nQUJBQjhSQWdEKytDUUFWZ0FDQUxZQWhRRC9aZ0lBemdBVUFCNFJBZ0NXQURVQXI2Z0NBUFlBSkFBK01RSUFwZ0JGQUwrekFnQytzaFFBLy9VQ0FHWUFmbEZmVkFJQS92SWtBQzRpQWdDdUlvVUE3MFFDQU1ZQUZBRC85QUlBZGdBMUFIOUVBZ0RlUUNRQVBqSUNBSjRBUlFEWEFBSUF2b2dVQVAvNkFnQmVFZjd4VDBRQ0FQNzRKQUJXQUFJQXRnQ0ZBTy9JQWdET0FCUUFIaEVDQUpZQU5RQ1BpQUlBOWdBa0FENHhBZ0NtQUVVQTMwUUNBTDZ5RkFEL3FBSUFaZ0IrVVc4QUFnRCs4aVFBTGlJQ0FLNGloUURuQUFJQXhnQVVBTy9pQWdCMkFEVUFmM0lDQU41QUpBQStNZ0lBbmdCRkFMK3hBZ0MraUJRQS8zTUNBRjRSL3ZFL013RUFoQUFCQU80Z0FRREZBQUVBejhRQkFFUUFBUUQvTWdFQUZRQUJBSStJQVFDRUFBRUFaZ0FCQUNVQUFRQ3ZBQUVBUkFBQkFPOGlBUUNtQUFFQVh3QUJBSVFBQVFCT1JBRUF4UUFCQU0vTUFRQkVBQUVBOXdBQkFCVUFBUUJ2QUFFQWhBQUJBRllBQVFBbEFBRUFud0FCQUVRQUFRRGZBQUVBL2pBQkFDOGlBUUNFQUFFQTdpQUJBTVVBQVFEUHlBRUFSQUFCQVA4UkFRQVZBQUVBZHdBQkFJUUFBUUJtQUFFQUpRQUJBSDhBQVFCRUFBRUE1d0FCQUtZQUFRQTNBQUVBaEFBQkFFNUVBUURGQUFFQXR3QUJBRVFBQVFDL0FBRUFGUUFCQUQ4QUFRQ0VBQUVBVmdBQkFDVUFBUUNYQUFFQVJBQUJBTmNBQVFEK01BRUFIeEVDQU82b1JBQ09pQUlBMWdERkFQL3pBZ0QrL0NVQVBnQUNBTFlBVlFEZjJBSUEvdmhFQUdZQUFnQitJSVVBLzVrQ0FPWUE5UUEyQUFJQXBnQVZBSjhBQWdEKzhrUUFkZ0FDQU01RXhRRC9kZ0lBL3ZFbEFFNUVBZ0N1QUZVQXo4Z0NBUDcwUkFCZVJBSUF2aENGQU8va0FnRGVWUFVBSGhFQ0FKWUFGUUF2SWdJQTdxaEVBSTZJQWdEV0FNVUEvL29DQVA3OEpRQStBQUlBdGdCVkFMOFJBZ0QrK0VRQVpnQUNBSDRnaFFEdklnSUE1Z0QxQURZQUFnQ21BQlVBZnlJQ0FQN3lSQUIyQUFJQXprVEZBUC9WQWdEKzhTVUFUa1FDQUs0QVZRQnZBQUlBL3ZSRUFGNUVBZ0MrRUlVQTN4RUNBTjVVOVFBZUVRSUFsZ0FWQUY5UkF3RDJBQlFBSGhGRUFJNklwUURmMUFNQXJxSlZBUDkySkFBK0lyWUFyNm9EQU9ZQUZBRC85VVFBWmdDRkFNL01Bd0NlQU1VQTcwUWtBRFlBL3ZoL01RTUE3dWdVQVAveFJBQjJBS1VBejhRREFINGlWUURmMFNRQVRrVCs5RjlSQXdEV0FCUUE3K0pFQUY1RWhRQy9JZ01BbGdERkFOL0lKQUF1SXY3eWJ5SURBUFlBRkFBZUVVUUFqb2lsQUwreEF3Q3VvbFVBL3pNa0FENGl0Z0N2cUFNQTVnQVVBUCs1UkFCbUFJVUF2NmdEQUo0QXhRRHY1Q1FBTmdEKytHOWtBd0R1NkJRQS8veEVBSFlBcFFEUHlBTUFmaUpWQU8vcUpBQk9SUDcwZjNRREFOWUFGQUQvK2tRQVhrU0ZBTCt5QXdDV0FNVUEzMFFrQUM0aS92SS9NZk1BL3ZyOThUWUFCQUMrTW5VQTN4SHpBTjVVL2ZMdjVOVUFmbkgrL0g5ejh3RCs4LzM0SGhFRUFKWUFWUUMvc2ZNQXpnQzFBTi9ZL2ZSbUFQNjVYMVR6QVA1Mi9mRW1BQVFBcGdCMUFKOEE4d0N1QVAzeS8vZlZBRVlBL3ZWL2RQTUE1Z0Q5K0JZQUJBQ0dBRlVBajRqekFNWUF0UUR2NHYzMFhoSHVxRDhSOHdEKyt2M3hOZ0FFQUw0eWRRRGYwZk1BM2xUOTh2LzcxUUIrY2Y3OGYwVHpBUDd6L2ZnZUVRUUFsZ0JWQUg5eTh3RE9BTFVBN3lMOTlHWUEvcmxQUlBNQS9uYjk4U1lBQkFDbUFIVUF2eEh6QUs0QS9mTC8vOVVBUmdEKzlUOHk4d0RtQVAzNEZn
20QUVBSVlBVlFCdkFQTUF4Z0MxQUwrNC9mUmVFZTZvTHlJQVFleWhBUXVrSGdFQUFBQUJBQUFBQVFBQUFBSUFBQUFDQUFBQUFnQUFBQU1BQUFBREFBQUFCQUFBQUFVQUFBQzNJVUloWnlGQ0lSRVJFUkV6TXpNemQzZDNkd0FBQUFBQUFBQUFBVllBQUFBQUFBQlFVUUFBWUZFQUFBRldBQUFCQUFBQVlGRUFBRkJSQUFBQk5BQUFBQUFBQUhCUkFBRHdVUUFBQVRRQUFBRUFBQUNBVVFBQUFGSUFBQUVZQUFBQUFBQUFrRkVBQUZCU0FBQUJHQUFBQVFBQUFLQlJBQUJnVWdBQXdRb0FBQUFBQUFDd1VRQUFzRklBQU1FS0FBQUJBQUFBd0ZFQUFNQlNBQUFoQlFBQUFBQUFBTkJSQUFEUVZBQUFJUVVBQUFFQUFBRGdVUUFBNEZRQUFDRUNBQUFBQUFBQThGVUFBRkJWQUFBaEFnQUFBUUFBQUFCV0FBQmdWUUFBQVZZQUFBQUFBQUFRVWdBQUFGSUFBQUZXQUFBQkFBQUFJRklBQVBCUkFBQUJWQUFBQUFBQUFEQlNBQUR3VWdBQUFWUUFBQUVBQUFCQVVnQUFBRk1BQUFGSUFBQUFBQUFBVUZJQUFQQlNBQUFCU0FBQUFRQUFBR0JTQUFBQVV3QUFBVGdBQUFBQUFBQndVZ0FBOEZJQUFBRTRBQUFCQUFBQWdGSUFBQUJUQUFBQk1BQUFBQUFBQUpCU0FBQlFVd0FBQVRBQUFBRUFBQUNnVWdBQVlGTUFBQUVrQUFBQUFBQUFzRklBQUhCVEFBQUJKQUFBQVFBQUFNQlNBQUNBVXdBQUFSd0FBQUFBQUFEUVVnQUFzRk1BQUFFY0FBQUJBQUFBNEZJQUFNQlRBQUFCRmdBQUFBQUFBTkJVQUFEUVV3QUFBUllBQUFFQUFBRGdWQUFBNEZNQUFBRldBQUFBQUFBQUVGTUFBQUJUQUFBQlZnQUFBUUFBQUNCVEFBRHdVZ0FBQVZRQUFBQUFBQUF3VXdBQThGSUFBQUZVQUFBQkFBQUFRRk1BQUFCVEFBQUJVUUFBQUFBQUFGQlRBQUFRVXdBQUFWRUFBQUVBQU
20FCZ1V3QUFJRk1BQUFGSUFBQUFBQUFBY0ZNQUFEQlRBQUFCU0FBQUFRQUFBSUJUQUFCQVV3QUFBVGdBQUFBQUFBQ1FVd0FBVUZNQUFBRTRBQUFCQUFBQW9GTUFBR0JUQUFBQk5BQUFBQUFBQUxCVEFBQndVd0FBQVRRQUFBRUFBQURBVXdBQWdGTUFBQUV3QUFBQUFBQUEwRk1BQUpCVEFBQUJNQUFBQVFBQUFPQlRBQUNnVXdBQUFTZ0FBQUFBQUFEd1V3QUFrRk1BQUFFb0FBQUJBQUFBQUZRQUFLQlRBQUFCSkFBQUFBQUFBQkJVQUFDd1V3QUFBU1FBQUFFQUFBQWdWQUFBd0ZNQUFBRWlBQUFBQUFBQU1GUUFBTkJUQUFBQklnQUFBUUFBQUVCVUFBRGdVd0FBQVJ3QUFBQUFBQUJRVkFBQThGTUFBQUVjQUFBQkFBQUFZRlFBQUFCVUFBQUJHQUFBQUFBQUFIQlVBQUFRVkFBQUFSZ0FBQUVBQUFDQVZBQUFJRlFBQUFFV0FBQUFBQUFBa0ZRQUFEQlVBQUFCRmdBQUFRQUFBS0JVQUFCQVZBQUFBUlFBQUFBQUFBQ3dWQUFBVUZRQUFBRVVBQUFCQUFBQXdGUUFBR0JVQUFBQkVnQUFBQUFBQU5CVUFBQndWQUFBQVJJQUFBRUFBQURnVkFBQWdGUUFBQUVSQUFBQUFBQUE4RlFBQUpCVUFBQUJFUUFBQVFBQUFBQlZBQUNnVkFBQXdRb0FBQUFBQUFBUVZRQUFzRlFBQU1FS0FBQUJBQUFBSUZVQUFNQlVBQURCQ1FBQUFBQUFBREJWQUFEUVZBQUF3UWtBQUFFQUFBQkFWUUFBNEZRQUFLRUlBQUFBQUFBQVVGVUFBUEJVQUFDaENBQUFBUUFBQUdCVkFBQUFWUUFBSVFVQUFBQUFBQUJ3VlFBQUVGVUFBQ0VGQUFBQkFBQUFnRlVBQUNCVkFBQkJCQUFBQUFBQUFKQlZBQUF3VlFBQVFRUUFBQUVBQUFDZ1ZRQUFRRlVBQUtFQ0FBQUFBQUFBc0ZVQUFGQlZBQUNoQWdBQUFRQUFBTUJWQUFCZ1ZRQUFJUUlBQUFBQUFBRFFWUUFBY0ZVQUFDRUNBQUFCQUFBQTRGVUFBSUJWQUFCQkFRQUFBQUFBQVBCVkFBQ1FWUUFBUVFFQUFBRUFBQUFBVmdBQW9GVUFBQkVCQUFBQUFBQUFFRllBQUxCVkFBQVJBUUFBQVFBQUFDQldBQURBVlFBQWhRQUFBQUFBQUFBd1ZnQUEwRlVBQUlVQUFBQUJBQUFBUUZZQUFPQlZBQUJKQUFBQUFBQUFBRkJXQUFEd1ZRQUFTUUFBQUFFQUFBQmdWZ0FBQUZZQUFDVUFBQUFBQUFBQWNGWUFBQkJXQUFBbEFBQUFBUUFBQUlCV0FBQWdWZ0FBRlFBQUFBQUFBQUNRVmdBQU1GWUFBQlVBQUFBQkFBQUFvRllBQUVCV0FBQUpBQUFBQUFBQUFMQldBQUJRVmdBQUNRQUFBQUVBQUFEQVZnQUFZRllBQUFVQUFBQUFBQUFBMEZZQUFIQldBQUFGQUFBQUFRQUFBT0JXQUFDQVZnQUFBUUFBQUFBQUFBRFFWZ0FBa0ZZQUFBRUFBQUFCQUFBQTRGWUFBS0JXQUFBQlZnQUFBQUFBQVBCV0FBRHdWZ0FBQVZZQUFBRUFBQUFBVndBQUFGY0FBQUFCQXdNQkFnTURCUVlIQndZR0J3Y0FBUU1EQVFJREF3VUdCd2NHQmdjSEJRWUhCd1lHQndjSUNBZ0lDQWdJQ0FVR0J3Y0dCZ2NIQ0FnSUNBZ0lDQWdCQWdNREFnSURBd1lHQndjR0JnY0hBUUlEQXdJQ0F3TUdCZ2NIQmdZSEJ3WUdCd2NHQmdjSENBZ0lDQWdJQ0FnR0JnY0hCZ1lIQndnSUNBZ0lDQWdJQXdNRUJBTURCQVFIQndjSEJ3Y0hCd01EQkFRREF3UUVCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Z0lDQWdJQ0FnSUJ3Y0hCd2NIQndjSUNBZ0lDQWdJQ0FNREJBUURBd1FFQndjSEJ3Y0hCd2NEQXdRRUF3TUVCQWNIQndjSEJ3Y0hCd2NIQndjSEJ3Y0lDQWdJQ0FnSUNBY0hCd2NIQndjSENBZ0lDQWdJQ0FnQkFnTURBZ0lEQXdZR0J3Y0dCZ2NIQVFJREF3SUNBd01HQmdjSEJnWUhCd1lHQndjR0JnY0hDQWdJQ0FnSUNBZ0dCZ2NIQmdZSEJ3Z0lDQWdJQ0FnSUFnSURBd0lDQXdNR0JnY0hCZ1lIQndJQ0F3TUNBZ01EQmdZSEJ3WUdCd2NHQmdjSEJnWUhCd2dJQ0FnSUNBZ0lCZ1lIQndZR0J3Y0lDQWdJQ0FnSUNBTURCQVFEQXdRRUJ3Y0hCd2NIQndjREF3
20UUVBd01FQkFjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NJQ0FnSUNBZ0lDQWNIQndjSEJ3Y0hDQWdJQ0FnSUNBZ0RBd1FFQXdNRUJBY0hCd2NIQndjSEF3TUVCQU1EQkFRSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQ0FnSUNBZ0lDQWdIQndjSEJ3Y0hCd2dJQ0FnSUNBZ0lBQUVGQmdFQ0JnWURBd2NIQXdNSEJ3QUJCUVlCQWdZR0F3TUhCd01EQndjREF3Y0hBd01IQndRRUJ3Y0VCQWNIQXdNSEJ3TURCd2NFQkFjSEJBUUhCd0VDQmdZQ0FnWUdBd01IQndNREJ3Y0JBZ1lHQWdJR0JnTURCd2NEQXdjSEF3TUhCd01EQndjRUJBY0hCQVFIQndNREJ3Y0RBd2NIQkFRSEJ3UUVCd2NGQmdnSUJnWUlDQWNIQ0FnSEJ3Z0lCUVlJQ0FZR0NBZ0hCd2dJQndjSUNBY0hDQWdIQndnSUJ3Y0lDQWNIQ0FnSEJ3Z0lCd2NJQ0FjSENBZ0hCd2dJQmdZSUNBWUdDQWdIQndnSUJ3Y0lDQVlHQ0FnR0JnZ0lCd2NJQ0FjSENBZ0hCd2dJQndjSUNBY0hDQWdIQndnSUJ3Y0lDQWNIQ0FnSEJ3Z0lCd2NJQ0FFQ0JnWUNBZ1lHQXdNSEJ3TURCd2NCQWdZR0FnSUdCZ01EQndjREF3Y0hBd01IQndNREJ3Y0VCQWNIQkFRSEJ3TURCd2NEQXdjSEJBUUhCd1FFQndjQ0FnWUdBZ0lHQmdNREJ3Y0RBd2NIQWdJR0JnSUNCZ1lEQXdjSEF3TUhCd01EQndjREF3Y0hCQVFIQndRRUJ3Y0RBd2NIQXdNSEJ3UUVCd2NFQkFjSEJnWUlDQVlHQ0FnSEJ3Z0lCd2NJQ0FZR0NBZ0dCZ2dJQndjSUNBY0hDQWdIQndnSUJ3Y0lDQWNIQ0FnSEJ3Z0lCd2NJQ0FjSENBZ0hCd2dJQndjSUNBWUdDQWdHQmdnSUJ3Y0lDQWNIQ0FnR0JnZ0lCZ1lJQ0FjSENBZ0hCd2dJQndjSUNBY0hDQWdIQndnSUJ3Y0lDQWNIQ0FnSEJ3Z0lCd2NJQ0FjSENBZ0FBUU1EQVFJREF3VUdCd2NHQmdjSEFBRURBd0VDQXdNRkJnY0hCZ1lIQndVR0J3Y0dCZ2NIQ0FnSUNBZ0lDQWdGQmdjSEJnWUhCd2dJQ0FnSUNBZ0lBUUlEQXdJQ0F3TUdCZ2NIQmdZSEJ3RUNBd01DQWdNREJnWUhCd1lHQndjR0JnY0hCZ1lIQndnSUNBZ0lDQWdJQmdZSEJ3WUdCd2NJQ0FnSUNBZ0lDQU1EQkFRREF3UUVCd2NIQndjSEJ3Y0RBd1FFQXdNRUJBY0hCd2NIQndjSEJ3Y0hCd2NIQndjSUNBZ0lDQWdJQ0FjSEJ3Y0hCd2NIQ0FnSUNBZ0lDQWdEQXdRRUF3TUVCQWNIQndjSEJ3Y0hBd01FQkFNREJBUUhCd2NIQndjSEJ3Y0hCd2NIQndjSENBZ0lDQWdJQ0FnSEJ3Y0hCd2NIQndnSUNBZ0lDQWdJQVFJREF3SUNBd01HQmdjSEJnWUhCd0VDQXdNQ0FnTURCZ1lIQndZR0J3Y0dCZ2NIQmdZSEJ3Z0lDQWdJQ0FnSUJnWUhCd1lHQndjSUNBZ0lDQWdJQ0FJQ0F3TUNBZ01EQmdZSEJ3WUdCd2NDQWdNREFnSURBd1lHQndjR0JnY0hCZ1lIQndZR0J3Y0lDQWdJQ0FnSUNBWUdCd2NHQmdjSENBZ0lDQWdJQ0FnREF3UUVBd01FQkFjSEJ3Y0hCd2NIQXdNRUJBTURCQVFIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hDQWdJQ0FnSUNBZ0hCd2NIQndjSEJ3Z0lDQWdJQ0FnSUF3TUVCQU1EQkFRSEJ3Y0hCd2NIQndNREJBUURBd1FFQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2dJQ0FnSUNBZ0lCd2NIQndjSEJ3Y0lDQWdJQ0FnSUNBQURBUVFEQmdRSEFRUUNCUVFIQlFjQUF3RUVBd1lFQndFRUFnVUVCd1VIQVFRQ0JRUUhCUWNDQlFJRkJRY0ZCd0VFQWdVRUJ3VUhBZ1VDQlFVSEJRY0RCZ1FIQmdnSENBUUhCUWNIQ0FjSUF3WUVCd1lJQndnRUJ3VUhCd2dIQ0FRSEJRY0hDQWNJQlFjRkJ3Y0lCd2dFQndVSEJ3Z0hDQVVIQlFjSENBY0lBUVFDQlFRSEJRY0NCUUlGQlFjRkJ3RUVBZ1VFQndVSEFnVUNCUVVIQlFjQ0JRSUZCUWNGQndJRkFnVUZCd1VIQWdVQ0JRVUhCUWNDQlFJRkJRY0ZCd1FIQlFjSENBY0lCUWNGQndjSUJ3Z0VCd1VIQndnSENBVUhCUWNIQ0FjSUJRY0ZCd2NJQndnRkJ3VUhCd2dIQ0FVSEJRY0hDQWNJQlFjRkJ3Y0lCd2dEQmdRSEJnZ0hDQVFIQlFjSENBY0lBd1lFQndZSUJ3Z0VCd1VIQndnSENBUUhCUWNIQ0FjSUJRY0ZCd2NJQndnRUJ3VUhCd2dIQ0FVSEJRY0hDQWNJQmdnSENBZ0lDQWdIQ0FjSUNBZ0lDQVlJQndnSUNBZ0lCd2dIQ0FnSUNBZ0hDQWNJQ0FnSUNBY0lCd2dJQ0FnSUJ3Z0hDQWdJQ0FnSENBY0lDQWdJQ0FRSEJRY0hDQWNJQlFjRkJ3Y0lCd2dFQndVSEJ3Z0hDQVVIQlFjSENBY0lCUWNGQndjSUJ3Z0ZCd1VIQndnSENBVUhCUWNIQ0FjSUJRY0ZCd2NJQndnSENBY0lDQWdJQ0FjSUJ3Z0lDQWdJQndnSENBZ0lDQWdIQ0FjSUNBZ0lDQWNJQndnSUNBZ0lCd2dIQ0FnSUNBZ0hDQWNJQ0FnSUNBY0lCd2dJQ0FnSUNRa0tDZ2tKQ2dvTURBMExEQXdOQ3drSkNnb0pDUW9LREF3TERRd01DdzBNREEwTkRBd0xDd3dKRFFvSkRBb0xEQXdMQ3d3TURRME1DUXNLQ1F3S0RRa0pDZ29KQ1FvS0RBd05Dd3dNRFFzSkNRb0tDUWtLQ2d3TUN3ME1EQXNOREF3TkRRd01Dd3NNQ1EwS0NRd0tDd3dNQ3dzTURBME5EQWtMQ2drTUNnMEtDZ29LQ2dvS0NnMExEUXNOQ3cwTENnb0pDUW9LQ1FrTkN3d01EUXNNREEwTkRRMExDd3NMRFFvTkNnb0xDZ3NORFF3TUN3c01EQTBLREFrS0N3a01DZ29KQ1FvS0NRa0xEUXdNQ3cwTURBb0tDZ29LQ2dvS0N3MExEUXNOQ3cwTEN3d01EUTBNREFzS0RBa0tEUWt
20NQ3dzTEN3ME5EUTBMQ2dzS0NnMEtEUUJCbWNBQkN6Y0JBQUVBQVFBQkFBQUJBUUFBQVFFQUFRQUJBQUVBQVFBQUFBQUJBUUVCQUFBQUFBQUJBQUVBQUFBQUFRRUJBUUFBQUFFQUFRRUJBRUhad0FFTE53RUFBUUFCQUFFQUFBRUJBQUFCQVFBQkFBRUFBUUFCQUFBQUFBRUJBUUVBQUFBQUFBRUFBUUFBQUFBQkFRRUJBQUFBQVFBQkFRRUFRWm5CQVFzSEFRQUJBQUVBQVFCQnFjRUJDNVVDQVFBQkFBRUFBUUFBQUFBQkFRRUJBQUFBQUFBQkFBRUFBQUFBQVFFQkFRQUFBQUFBQVFBQkFRRUFBQUVCQUFBQUFRQUJBQUVBQVFFQkFRRUJBUUVCQUFFQUFRQUJBQUVBQUFBQUFRRUJBUUFCQUFBQkFRQUJBQUFBQUFFQkFRRUFBUUFCQVFFQkFRSUFBQUFFQUFBQUJBQUFBQWdBQUFDUS93QUFEQUFBQUJrQUFBQlMvd0FBRkFBQUFCb0FBQUJUL3dBQUZBQUFBQnNBQUFCZS93QUFGQUFBQUJ3QUFBQmMvd0FBRkFBQUFCMEFBQUJkL3dBQUZBQUFBQjRBQUFCZi93QUFGQUFBQUI4QUFBQlIvd0FBQWdBQUFDQUFBQUJWL3dBQUJBQUFBQ0VBQUFCWC93QUFCQUFBQUNJQUFBQlkvd0FBRUFBQUFDTUFBQUJnL3dBQUJBQUFBQ1FBQUFCaC93QUFFQUFBQUNVQUFBQ1Ivd0JCeU1NQkMyVmovd0FBQkFBQUFDWUFBQUJrL3dBQUZBQUFBQ2NBQUFCMC93QUFGQUFBQUNnQUFBQjQvd0FBQkFBQUFDa0FBQUJRL3dBQUJBQUFBQ29BQUFCWi93QUFCQUFBQUNzQUFBQjEvd0FBRkFBQUFDd0FBQUIzL3dBQUZBQUFBQzBBQUFBQUFBQUFGQUJCd01RQkN6VXVBQUFBTHdBQUFEQUFBQUF4QUFBQU1nQUFBRE1BQUFBMEFBQUFOUUFBQUNBZ1VHbzNBQUFBY0hsMFpqZ0FBQUJvTW5CcU9RQkJnTVVCQ3pKeVpHaHBPZ0FBQUhKc2IyTTdBQUFBWTJOd1lqd0FBQUJ5YkdOd1BRQUFBSEJoYldNK0FBQUFabVZrWXo4QUFBQkFaZ0JCd01VQkMwRVpBQXNBR1JrWkFBQUFBQVVBQUFBQUFBQUpBQUFBQUFzQUFBQUFBQUFBQUJrQUNnb1pHUmtEQ2djQUFRQUpDeGdBQUFrR0N3QUFDd0FHR1FBQUFCa1pHUUJCa2NZQkN5RU9BQUFBQUFBQUFBQVpBQXNOR1JrWkFBMEFBQUlBQ1E0QUFBQUpBQTRBQUE0QVFjdkdBUXNCREFCQjE4WUJDeFVUQUFBQUFCTUFBQUFBQ1F3QUFBQUFBQXdBQUF3QVFZWEhBUXNCRUFCQmtjY0JDeFVQQUFBQUJBOEFBQUFBQ1JBQUFBQUFBQkFBQUJBQVFiL0hBUXNCRWdCQnk4Y0JDeDRSQUFBQUFCRUFBQUFBQ1JJQUFBQUFBQklBQUJJQUFCb0FBQUFhR2hvQVFZTElBUXNPR2dBQUFCb2FHZ0FBQUFBQUFBa0FRYlBJQVFzQkZBQkJ2OGdCQ3hVWEFBQUFBQmNBQUFBQUNSUUFBQUFBQUJRQUFCUUFRZTNJQVFzQkZnQkIrY2dCQzJRVkFBQUFBQlVBQUFBQUNSWUFBQUFBQUJZQUFCWUFBREF4TWpNME5UWTNPRGxCUWtORVJVWUFBQUFBY0FBQUFIQUFBQUJ4QUFBQWNRQUFBSEVBQUFCeEFBQUFjUUFBQUhFQUFBQndBQUFBY0FBQUFIRUFBQUJ3QUFBQWNBQUFBSEFBQUFCd0FFR0F5Z0VMSFhFQUFBQnhBQUFBY0FBQUFIQUFBQUFBQUFBQWNBQUFBQUFBQUFCeEFFR295d0VMQ1ZCd0FRQUFBQUFBQlFCQnZNc0JDd0ZyQUVIVXl3RUxDbXdBQUFCdEFBQUF1R3NBUWV6TEFRc0JBZ0JCL01zQkN3ai8vLy8vLy8vLy93QkJ3TXdCQ3dFRkFFSE16QUVMQVc0QVFlVE1BUXNPYkFBQUFHOEFBQURJYXdBQUFBUUFRZnpNQVFzQkFRQkJqTTBCQ3dYLy8vLy9DZz09IjsKICAgICAgcmV0dXJuIGY7CiAgICB9CiAgICB2YXIgd2FzbUJpbmFyeUZpbGU7CiAgICBmdW5jdGlvbiBnZXRCaW5hcnlTeW5jKGZpbGUpIHsKICAgICAgaWYgKGZpbGUgPT0gd2FzbUJpbmFyeUZpbGUgJiYgd2FzbUJpbmFyeSkgewogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh3YXNtQmluYXJ5KTsKICAgICAgfQogICAgICB2YXIgYmluYXJ5ID0gdHJ5UGFyc2VBc0RhdGFVUkkoZmlsZSk7CiAgICAgIGlmIChiaW5hcnkpIHsKICAgICAgICByZXR1cm4gYmluYXJ5OwogICAgICB9CiAgICAgIGlmIChyZWFkQmluYXJ5KSB7CiAgICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoZmlsZSk7CiAgICAgIH0KICAgICAgdGhyb3cgJ3N5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkOiB5b3UgY2FuIHByZWxvYWQgaXQgdG8gTW9kdWxlWyJ3YXNtQmluYXJ5Il0gbWFudWFsbHksIG9yIGVtY2MucHkgd2lsbCBkbyB0aGF0IGZvciB5b3Ugd2hlbiBnZW5lcmF0aW5nIEhUTUwgKGJ1dCBub3QgSlMpJzsKICAgIH0KICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlU3luYyhmaWxlLCBpbmZvKSB7CiAgICAgIHZhciBtb2R1bGU7CiAgICAgIHZhciBiaW5hcnkgPSBnZXRCaW5hcnlTeW5jKGZpbGUpOwogICAgICBtb2R1bGUgPSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKGJpbmFyeSk7CiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGluZm8pOwogICAgICByZXR1cm4gW2luc3RhbmNlLCBtb2R1bGVdOwogICAgfQogICAgZnVuY3Rpb24gZ2V0V2FzbUltcG9ydHMoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgYTogd2FzbUltcG9ydHMKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVdhc20oKSB7CiAgICAgIGZ1bmN0aW9uIHJlY2VpdmVJbnN0YW5jZShpbnN0YW5jZSwgbW9kdWxlKSB7CiAgICAgICAgd2FzbUV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICAgIHdhc21NZW1vcnkgPSB3YXNtRXhwb3J0c1sidCJdOwogICAgICAgIHVwZGF0ZU1lbW9yeVZpZXdzKCk7CiAgICAgICAgYWRkT25Jbml0KHdhc21FeHBvcnRzWyJ1Il0pOwogICAgICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koIndhc20taW5zdGFudGlhdGUiKTsKICAgICAgICByZXR1cm4gd2FzbUV4cG9ydHM7CiAgICAgIH0KICAgICAgYWRkUnVuRGVwZW5kZW5jeSgid2FzbS1pbnN0YW50aWF0ZSIpOwogICAgICB2YXIgaW5mbyA9IGdldFdhc21JbXBvcnRzKCk7CiAgICAgIGlmIChNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBNb2R1bGVbImluc3RhbnRpYXRlV2FzbSJdKGluZm8sIHJlY2VpdmVJbnN0YW5jZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgZXJyKGBNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YCk7CiAgICAgICAgICByZWFkeVByb21pc2VSZWplY3QoZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgI
20Hdhc21CaW5hcnlGaWxlID8/PSBmaW5kV2FzbUJpbmFyeSgpOwogICAgICB2YXIgcmVzdWx0ID0gaW5zdGFudGlhdGVTeW5jKHdhc21CaW5hcnlGaWxlLCBpbmZvKTsKICAgICAgcmV0dXJuIHJlY2VpdmVJbnN0YW5jZShyZXN1bHRbMF0pOwogICAgfQogICAgY2xhc3MgRXhpdFN0YXR1cyB7CiAgICAgIG5hbWUgPSAiRXhpdFN0YXR1cyI7CiAgICAgIGNvbnN0cnVjdG9yKHN0YXR1cykgewogICAgICAgIHRoaXMubWVzc2FnZSA9IGBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCR7c3RhdHVzfSlgOwogICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICB9CiAgICB9CiAgICB2YXIgY2FsbFJ1bnRpbWVDYWxsYmFja3MgPSBjYWxsYmFja3MgPT4gewogICAgICB3aGlsZSAoY2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKICAgICAgICBjYWxsYmFja3Muc2hpZnQoKShNb2R1bGUpOwogICAgICB9CiAgICB9OwogICAgdmFyIG5vRXhpdFJ1bnRpbWUgPSBNb2R1bGVbIm5vRXhpdFJ1bnRpbWUiXSB8fCB0cnVlOwogICAgdmFyIF9fYWJvcnRfanMgPSAoKSA9PiBhYm9ydCgiIik7CiAgICB2YXIgX19lbXNjcmlwdGVuX21lbWNweV9qcyA9IChkZXN0LCBzcmMsIG51bSkgPT4gSEVBUFU4LmNvcHlXaXRoaW4oZGVzdCwgc3JjLCBzcmMgKyBudW0pOwogICAgdmFyIHJ1bnRpbWVLZWVwYWxpdmVDb3VudGVyID0gMDsKICAgIHZhciBfX2Vtc2NyaXB0ZW5fcnVudGltZV9rZWVwYWxpdmVfY2xlYXIgPSAoKSA9PiB7CiAgICAgIG5vRXhpdFJ1bnRpbWUgPSBmYWxzZTsKICAgICAgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPSAwOwogICAgfTsKICAgIHZhciB0aW1lcnMgPSB7fTsKICAgIHZhciBoYW5kbGVFeGNlcHRpb24gPSBlID0+IHsKICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFeGl0U3RhdHVzIHx8IGUgPT0gInVud2luZCIpIHsKICAgICAgICByZXR1cm4gRVhJVFNUQVRVUzsKICAgICAgfQogICAgICBxdWl0XygxLCBlKTsKICAgIH07CiAgICB2YXIga2VlcFJ1bnRpbWVBbGl2ZSA9ICgpID0+IG5vRXhpdFJ1bnRpbWUgfHwgcnVudGltZUtlZXBhbGl2ZUNvdW50ZXIgPiAwOwogICAgdmFyIF9wcm9jX2V4aXQgPSBjb2RlID0+IHsKICAgICAgRVhJVFNUQVRVUyA9IGNvZGU7CiAgICAgIGlmICgha2VlcFJ1bnRpbWVBbGl2ZSgpKSB7CiAgICAgICAgTW9kdWxlWyJvbkV4aXQiXT8uKGNvZGUpOwogICAgICAgIEFCT1JUID0gdHJ1ZTsKICAgICAgfQogICAgICBxdWl0Xyhjb2RlLCBuZXcgRXhpdFN0YXR1cyhjb2RlKSk7CiAgICB9OwogICAgdmFyIGV4aXRKUyA9IChzdGF0dXMsIGltcGxpY2l0KSA9PiB7CiAgICAgIEVYSVRTVEFUVVMgPSBzdGF0dXM7CiAgICAgIF9wcm9jX2V4aXQoc3RhdHVzKTsKICAgIH07CiAgICB2YXIgX2V4aXQgPSBleGl0SlM7CiAgICB2YXIgbWF5YmVFeGl0ID0gKCkgPT4gewogICAgICBpZiAoIWtlZXBSdW50aW1lQWxpdmUoKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBfZXhpdChFWElUU1RBVFVTKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIGNhbGxVc2VyQ2FsbGJhY2sgPSBmdW5jID0+IHsKICAgICAgaWYgKEFCT1JUKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZnVuYygpOwogICAgICAgIG1heWJlRXhpdCgpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOwogICAgICB9CiAgICB9OwogICAgdmFyIF9lbXNjcmlwdGVuX2dldF9ub3cgPSAoKSA9PiBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHZhciBfX3NldGl0aW1lcl9qcyA9ICh3aGljaCwgdGltZW91dF9tcykgPT4gewogICAgICBpZiAodGltZXJzW3doaWNoXSkgewogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcnNbd2hpY2hdLmlkKTsKICAgICAgICBkZWxldGUgdGltZXJzW3doaWNoXTsKICAgICAgfQogICAgICBpZiAoIXRpbWVvdXRfbXMpIHJldHVybiAwOwogICAgICB2YXIgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBkZWxldGUgdGltZXJzW3doaWNoXTsKICAgICAgICBjYWxsVXNlckNhbGxiYWNrKCgpID0+IF9fZW1zY3JpcHRlbl90aW1lb3V0KHdoaWNoLCBfZW1zY3JpcHRlbl9nZXRfbm93KCkpKTsKICAgICAgfSwgdGltZW91dF9tcyk7CiAgICAgIHRpbWVyc1t3aGljaF0gPSB7CiAgICAgICAgaWQsCiAgICAgICAgdGltZW91dF9tcwogICAgICB9OwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICBmdW5jdGlvbiBfY29weV9waXhlbHNfMShjb21wR19wdHIsIG5iX3BpeGVscykgewogICAgICBjb21wR19wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBHX3B0ciwgY29tcEdfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgaW1hZ2VEYXRhLnNldChjb21wRyk7CiAgICB9CiAgICBmdW5jdGlvbiBfY29weV9waXhlbHNfMyhjb21wUl9wdHIsIGNvbXBHX3B0ciwgY29tcEJfcHRyLCBuYl9waXhlbHMpIHsKICAgICAgY29tcFJfcHRyID4+PSAyOwogICAgICBjb21wR19wdHIgPj49IDI7CiAgICAgIGNvbXBCX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiAzKTsKICAgICAgY29uc3QgY29tcFIgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBHX3B0ciwgY29tcEdfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEIgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBCX3B0ciwgY29tcEJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYl9waXhlbHM7IGkrKykgewogICAgICAgIGltYWdlRGF0YVszICogaV0gPSBjb21wUltpXTsKICAgICAgICBpbWFnZURhdGFbMyAqIGkgKyAxXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVszICogaSArIDJdID0gY29tcEJbaV07CiAgICAgI
20H0KICAgIH0KICAgIGZ1bmN0aW9uIF9jb3B5X3BpeGVsc180KGNvbXBSX3B0ciwgY29tcEdfcHRyLCBjb21wQl9wdHIsIGNvbXBBX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbXBBX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcFIgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBSX3B0ciwgY29tcFJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEcgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBHX3B0ciwgY29tcEdfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEIgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBCX3B0ciwgY29tcEJfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgY29uc3QgY29tcEEgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBBX3B0ciwgY29tcEFfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYl9waXhlbHM7IGkrKykgewogICAgICAgIGltYWdlRGF0YVs0ICogaV0gPSBjb21wUltpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAxXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDJdID0gY29tcEJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgM10gPSBjb21wQVtpXTsKICAgICAgfQogICAgfQogICAgdmFyIGdldEhlYXBNYXggPSAoKSA9PiAyMTQ3NDgzNjQ4OwogICAgdmFyIGFsaWduTWVtb3J5ID0gKHNpemUsIGFsaWdubWVudCkgPT4gTWF0aC5jZWlsKHNpemUgLyBhbGlnbm1lbnQpICogYWxpZ25tZW50OwogICAgdmFyIGdyb3dNZW1vcnkgPSBzaXplID0+IHsKICAgICAgdmFyIGIgPSB3YXNtTWVtb3J5LmJ1ZmZlcjsKICAgICAgdmFyIHBhZ2VzID0gKHNpemUgLSBiLmJ5dGVMZW5ndGggKyA2NTUzNSkgLyA2NTUzNiB8IDA7CiAgICAgIHRyeSB7CiAgICAgICAgd2FzbU1lbW9yeS5ncm93KHBhZ2VzKTsKICAgICAgICB1cGRhdGVNZW1vcnlWaWV3cygpOwogICAgICAgIHJldHVybiAxOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfTsKICAgIHZhciBfZW1zY3JpcHRlbl9yZXNpemVfaGVhcCA9IHJlcXVlc3RlZFNpemUgPT4gewogICAgICB2YXIgb2xkU2l6ZSA9IEhFQVBVOC5sZW5ndGg7CiAgICAgIHJlcXVlc3RlZFNpemUgPj4+PSAwOwogICAgICB2YXIgbWF4SGVhcFNpemUgPSBnZXRIZWFwTWF4KCk7CiAgICAgIGlmIChyZXF1ZXN0ZWRTaXplID4gbWF4SGVhcFNpemUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZm9yICh2YXIgY3V0RG93biA9IDE7IGN1dERvd24gPD0gNDsgY3V0RG93biAqPSAyKSB7CiAgICAgICAgdmFyIG92ZXJHcm93bkhlYXBTaXplID0gb2xkU2l6ZSAqICgxICsgLjIgLyBjdXREb3duKTsKICAgICAgICBvdmVyR3Jvd25IZWFwU2l6ZSA9IE1hdGgubWluKG92ZXJHcm93bkhlYXBTaXplLCByZXF1ZXN0ZWRTaXplICsgMTAwNjYzMjk2KTsKICAgICAgICB2Y
20XIgbmV3U2l6ZSA9IE1hdGgubWluKG1heEhlYXBTaXplLCBhbGlnbk1lbW9yeShNYXRoLm1heChyZXF1ZXN0ZWRTaXplLCBvdmVyR3Jvd25IZWFwU2l6ZSksIDY1NTM2KSk7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZ3Jvd01lbW9yeShuZXdTaXplKTsKICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgdmFyIEVOViA9IHt9OwogICAgdmFyIGdldEV4ZWN1dGFibGVOYW1lID0gKCkgPT4gdGhpc1Byb2dyYW0gfHwgIi4vdGhpcy5wcm9ncmFtIjsKICAgIHZhciBnZXRFbnZTdHJpbmdzID0gKCkgPT4gewogICAgICBpZiAoIWdldEVudlN0cmluZ3Muc3RyaW5ncykgewogICAgICAgIHZhciBsYW5nID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT0gIm9iamVjdCIgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdIHx8ICJDIikucmVwbGFjZSgiLSIsICJfIikgKyAiLlVURi04IjsKICAgICAgICB2YXIgZW52ID0gewogICAgICAgICAgVVNFUjogIndlYl91c2VyIiwKICAgICAgICAgIExPR05BTUU6ICJ3ZWJfdXNlciIsCiAgICAgICAgICBQQVRIOiAiLyIsCiAgICAgICAgICBQV0Q6ICIvIiwKICAgICAgICAgIEhPTUU6ICIvaG9tZS93ZWJfdXNlciIsCiAgICAgICAgICBMQU5HOiBsYW5nLAogICAgICAgICAgXzogZ2V0RXhlY3V0YWJsZU5hbWUoKQogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgeCBpbiBFTlYpIHsKICAgICAgICAgIGlmIChFTlZbeF0gPT09IHVuZGVmaW5lZCkgZGVsZXRlIGVudlt4XTtlbHNlIGVudlt4XSA9IEVOVlt4XTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0cmluZ3MgPSBbXTsKICAgICAgICBmb3IgKHZhciB4IGluIGVudikgewogICAgICAgICAgc3RyaW5ncy5wdXNoKGAke3h9PSR7ZW52W3hdfWApOwogICAgICAgIH0KICAgICAgICBnZXRFbnZTdHJpbmdzLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgICB9CiAgICAgIHJldHVybiBnZXRFbnZTd
20HJpbmdzLnN0cmluZ3M7CiAgICB9OwogICAgdmFyIHN0cmluZ1RvQXNjaWkgPSAoc3RyLCBidWZmZXIpID0+IHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHsKICAgICAgICBIRUFQOFtidWZmZXIrK10gPSBzdHIuY2hhckNvZGVBdChpKTsKICAgICAgfQogICAgICBIRUFQOFtidWZmZXJdID0gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fZ2V0ID0gKF9fZW52aXJvbiwgZW52aXJvbl9idWYpID0+IHsKICAgICAgdmFyIGJ1ZlNpemUgPSAwOwogICAgICBnZXRFbnZTdHJpbmdzKCkuZm9yRWFjaCgoc3RyaW5nLCBpKSA9PiB7CiAgICAgICAgdmFyIHB0ciA9IGVudmlyb25fYnVmICsgYnVmU2l6ZTsKICAgICAgICBIRUFQVTMyW19fZW52aXJvbiArIGkgKiA0ID4+IDJdID0gcHRyOwogICAgICAgIHN0cmluZ1RvQXNjaWkoc3RyaW5nLCBwdHIpOwogICAgICAgIGJ1ZlNpemUgKz0gc3RyaW5nLmxlbmd0aCArIDE7CiAgICAgIH0pOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2Vudmlyb25fc2l6ZXNfZ2V0ID0gKHBlbnZpcm9uX2NvdW50LCBwZW52aXJvbl9idWZfc2l6ZSkgPT4gewogICAgICB2YXIgc3RyaW5ncyA9IGdldEVudlN0cmluZ3MoKTsKICAgICAgSEVBUFUzMltwZW52aXJvbl9jb3VudCA+PiAyXSA9IHN0cmluZ3MubGVuZ3RoOwogICAgICB2YXIgYnVmU2l6ZSA9IDA7CiAgICAgIHN0cmluZ3MuZm9yRWFjaChzdHJpbmcgPT4gYnVmU2l6ZSArPSBzdHJpbmcubGVuZ3RoICsgMSk7CiAgICAgIEhFQVBVMzJbcGVudmlyb25fYnVmX3NpemUgPj4gMl0gPSBidWZTaXplOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICB2YXIgX2ZkX2Nsb3NlID0gZmQgPT4gNTI7CiAgICB2YXIgY29udmVydEkzMlBhaXJUb0k1M0NoZWNrZWQgPSAobG8sIGhpKSA9PiBoaSArIDIwOTcxNTIgPj4+IDAgPCA0MTk0MzA1IC0gISFsbyA/IChsbyA+Pj4gMCkgKyBo
20aSAqIDQyOTQ5NjcyOTYgOiBOYU47CiAgICBmdW5jdGlvbiBfZmRfc2VlayhmZCwgb2Zmc2V0X2xvdywgb2Zmc2V0X2hpZ2gsIHdoZW5jZSwgbmV3T2Zmc2V0KSB7CiAgICAgIHZhciBvZmZzZXQgPSBjb252ZXJ0STMyUGFpclRvSTUzQ2hlY2tlZChvZmZzZXRfbG93LCBvZmZzZXRfaGlnaCk7CiAgICAgIHJldHVybiA3MDsKICAgIH0KICAgIHZhciBwcmludENoYXJCdWZmZXJzID0gW251bGwsIFtdLCBbXV07CiAgICB2YXIgVVRGOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgIT0gInVuZGVmaW5lZCIgPyBuZXcgVGV4dERlY29kZXIoKSA6IHVuZGVmaW5lZDsKICAgIHZhciBVVEY4QXJyYXlUb1N0cmluZyA9IChoZWFwT3JBcnJheSwgaWR4ID0gMCwgbWF4Qnl0ZXNUb1JlYWQgPSBOYU4pID0+IHsKICAgICAgdmFyIGVuZElkeCA9IGlkeCArIG1heEJ5dGVzVG9SZWFkOwogICAgICB2YXIgZW5kUHRyID0gaWR4OwogICAgICB3aGlsZSAoaGVhcE9yQXJyYXlbZW5kUHRyXSAmJiAhKGVuZFB0ciA+PSBlbmRJZHgpKSArK2VuZFB0cjsKICAgICAgaWYgKGVuZFB0ciAtIGlkeCA+IDE2ICYmIGhlYXBPckFycmF5LmJ1ZmZlciAmJiBVVEY4RGVjb2RlcikgewogICAgICAgIHJldHVybiBVVEY4RGVjb2Rlci5kZWNvZGUoaGVhcE9yQXJyYXkuc3ViYXJyYXkoaWR4LCBlbmRQdHIpKTsKICAgICAgfQogICAgICB2YXIgc3RyID0gIiI7CiAgICAgIHdoaWxlIChpZHggPCBlbmRQdHIpIHsKICAgICAgICB2YXIgdTAgPSBoZWFwT3JBcnJheVtpZHgrK107CiAgICAgICAgaWYgKCEodTAgJiAxMjgpKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdmFyIHUxID0gaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgaWYgKCh1MCAmIDIyNCkgPT0gMTkyKSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgodTAgJiAzMSkgPDwgNiB8IHUxKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB2Y
20XIgdTIgPSBoZWFwT3JBcnJheVtpZHgrK10gJiA2MzsKICAgICAgICBpZiAoKHUwICYgMjQwKSA9PSAyMjQpIHsKICAgICAgICAgIHUwID0gKHUwICYgMTUpIDw8IDEyIHwgdTEgPDwgNiB8IHUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1MCA9ICh1MCAmIDcpIDw8IDE4IHwgdTEgPDwgMTIgfCB1MiA8PCA2IHwgaGVhcE9yQXJyYXlbaWR4KytdICYgNjM7CiAgICAgICAgfQogICAgICAgIGlmICh1MCA8IDY1NTM2KSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBjaCA9IHUwIC0gNjU1MzY7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IGNoID4+IDEwLCA1NjMyMCB8IGNoICYgMTAyMyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHI7CiAgICB9OwogICAgdmFyIHByaW50Q2hhciA9IChzdHJlYW0sIGN1cnIpID0+IHsKICAgICAgdmFyIGJ1ZmZlciA9IHByaW50Q2hhckJ1ZmZlcnNbc3RyZWFtXTsKICAgICAgaWYgKGN1cnIgPT09IDAgfHwgY3VyciA9PT0gMTApIHsKICAgICAgICAoc3RyZWFtID09PSAxID8gb3V0IDogZXJyKShVVEY4QXJyYXlUb1N0cmluZyhidWZmZXIpKTsKICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIucHVzaChjdXJyKTsKICAgICAgfQogICAgfTsKICAgIHZhciBVVEY4VG9TdHJpbmcgPSAocHRyLCBtYXhCeXRlc1RvUmVhZCkgPT4gcHRyID8gVVRGOEFycmF5VG9TdHJpbmcoSEVBUFU4LCBwdHIsIG1heEJ5dGVzVG9SZWFkKSA6ICIiOwogICAgdmFyIF9mZF93cml0ZSA9IChmZCwgaW92LCBpb3ZjbnQsIHBudW0pID0+IHsKICAgICAgdmFyIG51bSA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKICAgICAgICB2Y
20XIgcHRyID0gSEVBUFUzMltpb3YgPj4gMl07CiAgICAgICAgdmFyIGxlbiA9IEhFQVBVMzJbaW92ICsgNCA+PiAyXTsKICAgICAgICBpb3YgKz0gODsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7CiAgICAgICAgICBwcmludENoYXIoZmQsIEhFQVBVOFtwdHIgKyBqXSk7CiAgICAgICAgfQogICAgICAgIG51bSArPSBsZW47CiAgICAgIH0KICAgICAgSEVBUFUzMltwbnVtID4+IDJdID0gbnVtOwogICAgICByZXR1cm4gMDsKICAgIH07CiAgICBmdW5jdGlvbiBfZ3JheV90b19yZ2JhKGNvbXBHX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBHX3B0ciA+Pj0gMjsKICAgICAgY29uc3QgaW1hZ2VEYXRhID0gTW9kdWxlLmltYWdlRGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShuYl9waXhlbHMgKiA0KTsKICAgICAgY29uc3QgY29tcEcgPSBNb2R1bGUuSEVBUDMyLnN1YmFycmF5KGNvbXBHX3B0ciwgY29tcEdfcHRyICsgbmJfcGl4ZWxzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYl9waXhlbHM7IGkrKykgewogICAgICAgIGltYWdlRGF0YVs0ICogaV0gPSBpbWFnZURhdGFbNCAqIGkgKyAxXSA9IGltYWdlRGF0YVs0ICogaSArIDJdID0gY29tcEdbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgM10gPSAyNTU7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9ncmF5YV90b19yZ2JhKGNvbXBHX3B0ciwgY29tcEFfcHRyLCBuYl9waXhlbHMpIHsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQV9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBHID0gTW9kdWxlLkhFQVAzMi5zdWJhcnJheShjb21wR19wdHIsIGNvbXBHX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGNvbnN0IGNvbXBBID0gTW9kdWxlLkhFQVAzMi5zdWJhcnJheShjb21wQV9wdHIsIGNvbXBBX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBHW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gY29tcEFbaV07CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIF9qc1ByaW50V2FybmluZyhtZXNzYWdlX3B0cikgewogICAgICBjb25zdCBtZXNzYWdlID0gVVRGOFRvU3RyaW5nKG1lc3NhZ2VfcHRyKTsKICAgICAgKE1vZHVsZS53YXJuIHx8IGNvbnNvbGUud2FybikoYE9wZW5KUEVHOiAke21lc3NhZ2V9YCk7CiAgICB9CiAgICBmdW5jdGlvbiBfcmdiX3RvX3JnYmEoY29tcFJfcHRyLCBjb21wR19wdHIsIGNvbXBCX3B0ciwgbmJfcGl4ZWxzKSB7CiAgICAgIGNvbXBSX3B0ciA+Pj0gMjsKICAgICAgY29tcEdfcHRyID4+PSAyOwogICAgICBjb21wQl9wdHIgPj49IDI7CiAgICAgIGNvbnN0IGltYWdlRGF0YSA9IE1vZHVsZS5pbWFnZURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobmJfcGl4ZWxzICogNCk7CiAgICAgIGNvbnN0IGNvbXBSID0gTW9kdWxlLkhFQVAzMi5zdWJhcnJheShjb21wUl9wdHIsIGNvbXBSX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGNvbnN0IGNvbXBHID0gTW9kdWxlLkhFQVAzMi5zdWJhcnJheShjb21wR19wdHIsIGNvbXBHX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGNvbnN0IGNvbXBCID0gTW9kdWxlLkhFQVAzMi5zdWJhcnJheShjb21wQl9wdHIsIGNvbXBCX3B0ciArIG5iX3BpeGVscyk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmJfcGl4ZWxzOyBpKyspIHsKICAgICAgICBpbWFnZURhdGFbNCAqIGldID0gY29tcFJbaV07CiAgICAgICAgaW1hZ2VEYXRhWzQgKiBpICsgMV0gPSBjb21wR1tpXTsKICAgICAgICBpbWFnZURhdGFbNCAqIGkgKyAyXSA9IGNvbXBCW2ldOwogICAgICAgIGltYWdlRGF0YVs0ICogaSArIDNdID0gMjU1OwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfc3RvcmVFcnJvck1lc3NhZ2UobWVzc2FnZV9wdHIpIHsKICAgICAgY29uc3QgbWVzc2FnZSA9IFVURjhUb1N0cmluZyhtZXNzYWdlX3B0cik7CiAgICAgIGlmICghTW9kdWxlLmVycm9yTWVzc2FnZXMpIHsKICAgICAgICBNb2R1bGUuZXJyb3JNZXNzYWdlcyA9IG1lc3NhZ2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgTW9kdWxlLmVycm9yTWVzc2FnZXMgKz0gIlxuIiArIG1lc3NhZ2U7CiAgICAgIH0KICAgIH0KICAgIHZhciB3YXNtSW1wb3J0cyA9IHsKICAgICAgbTogX19hYm9ydF9qcywKICAgICAgYzogX19lbXNjcmlwdGVuX21lbWNweV9qcywKICAgICAgbDogX19lbXNjcmlwdGVuX3J1bnRpbWVfa2VlcGFsaXZlX2NsZWFyLAogICAgICBuOiBfX3NldGl0aW1lcl9qcywKICAgICAgZzogX2NvcHlfcGl4ZWxzXzEsCiAgICAgIGY6IF9jb3B5X3BpeGVsc18zLAogICAgICBlOiBfY29weV9waXhlbHNfNCwKICAgICAgbzogX2Vtc2NyaXB0ZW5fcmVzaXplX2hlYXAsCiAgICAgIHA6IF9lbnZpcm9uX2dldCwKICAgICAgcTogX2Vudmlyb25fc2l6ZXNfZ2V0LAogICAgICByOiBfZmRfY2xvc2UsCiAgICAgIGo6IF9mZF9zZWVrLAogICAgICBiOiBfZmRfd3JpdGUsCiAgICAgIHM6IF9ncmF5X3RvX3JnYmEsCiAgICAgIGk6IF9ncmF5YV90b19yZ2JhLAogICAgICBkOiBfanNQcmludFdhcm5pbmcsCiAgICAgIGs6IF9wcm9jX2V4aXQsCiAgICAgIGg6IF9yZ2JfdG9fcmdiYSwKICAgICAgYTogX3N0b3JlRXJyb3JNZXNzYWdlCiAgICB9OwogICAgdmFyIHdhc21FeHBvcnRzID0gY3JlYXRlV2FzbSgpOwogICAgdmFyIF9fX3dhc21fY2FsbF9jdG9ycyA9IHdhc21FeHBvcnRzWyJ1Il07CiAgICB2YXIgX21hbGxvYyA9IE1vZHVsZVsiX21hbGxvYyJdID0gd2FzbUV4cG9ydHNbInYiXTsKICAgIHZhciBfZnJlZSA9IE1vZHVsZVsiX2ZyZWUiXSA9IHdhc21FeHBvcnRzWyJ3Il07CiAgICB2YXIgX2pwMl9kZWNvZGUgPSBNb2R1bGVbIl9qcDJfZGVjb2RlIl0gPSB3YXNtRXhwb3J0c1sieSJdOwogICAgdmFyIF9fZW1zY3JpcHRlbl90aW1lb3V0ID0gd2FzbUV4cG9ydHNbInoiXTsKICAgIHZhciBjYWxsZWRSdW47CiAgICBkZXBlbmRlbmNpZXNGdWxmaWxsZWQgPSBmdW5jdGlvbiBydW5DYWxsZXIoKSB7CiAgICAgIGlmICghY2FsbGVkUnVuKSBydW4oKTsKICAgICAgaWYgKCFjYWxsZWRSdW4pIGRlcGVuZGVuY2llc0Z1bGZpbGxlZCA9IHJ1bkNhbGxlcjsKICAgIH07CiAgICBmdW5jdGlvbiBydW4oKSB7CiAgICAgIGlmIChydW5EZXBlbmRlbmNpZXMgPiAwKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgI
20HByZVJ1bigpOwogICAgICBpZiAocnVuRGVwZW5kZW5jaWVzID4gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmdW5jdGlvbiBkb1J1bigpIHsKICAgICAgICBpZiAoY2FsbGVkUnVuKSByZXR1cm47CiAgICAgICAgY2FsbGVkUnVuID0gdHJ1ZTsKICAgICAgICBNb2R1bGVbImNhbGxlZFJ1biJdID0gdHJ1ZTsKICAgICAgICBpZiAoQUJPUlQpIHJldHVybjsKICAgICAgICBpbml0UnVudGltZSgpOwogICAgICAgIHJlYWR5UHJvbWlzZVJlc29sdmUoTW9kdWxlKTsKICAgICAgICBNb2R1bGVbIm9uUnVudGltZUluaXRpYWxpemVkIl0/LigpOwogICAgICAgIHBvc3RSdW4oKTsKICAgICAgfQogICAgICBpZiAoTW9kdWxlWyJzZXRTdGF0dXMiXSkgewogICAgICAgIE1vZHVsZVsic2V0U3RhdHVzIl0oIlJ1bm5pbmcuLi4iKTsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gTW9kdWxlWyJzZXRTdGF0dXMiXSgiIiksIDEpOwogICAgICAgICAgZG9SdW4oKTsKICAgICAgICB9LCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb1J1bigpOwogICAgICB9CiAgICB9CiAgICBpZiAoTW9kdWxlWyJwcmVJbml0Il0pIHsKICAgICAgaWYgKHR5cGVvZiBNb2R1bGVbInByZUluaXQiXSA9PSAiZnVuY3Rpb24iKSBNb2R1bGVbInByZUluaXQiXSA9IFtNb2R1bGVbInByZUluaXQiXV07CiAgICAgIHdoaWxlIChNb2R1bGVbInByZUluaXQiXS5sZW5ndGggPiAwKSB7CiAgICAgICAgTW9kdWxlWyJwcmVJbml0Il0ucG9wKCkoKTsKICAgICAgfQogICAgfQogICAgcnVuKCk7CiAgICBtb2R1bGVSdG4gPSBNb2R1bGU7CiAgICByZXR1cm4gbW9kdWxlUnRuOwogIH07Cn0pKCk7Ci8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gY29uc3Qgb3BlbmpwZWcgPSAoT3BlbkpQRUcpOwo7Ly8gLi9zcmMvY29yZS9qcHguanMKCgoKCgoKY2xhc3MgSnB4RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIkpweEVycm9yIik7CiAgfQp9CmNsYXNzIEpweEltYWdlIHsKICBzdGF0aWMgI21vZHVsZSA9IG51bGw7CiAgc3RhdGljIGRlY29kZShkYXRhLCBkZWNvZGVyT3B0aW9ucykgewogICAgZGVjb2Rlck9wdGlvbnMgfHw9IHt9OwogICAgdGhpcy4jbW9kdWxlIHx8PSBvcGVuanBlZyh7CiAgICAgIHdhcm46IHdhcm4KICAgIH0pOwogICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy4jbW9kdWxlLmRlY29kZShkYXRhLCBkZWNvZGVyT3B0aW9ucyk7CiAgICBpZiAodHlwZW9mIGltYWdlRGF0YSA9PT0gInN0cmluZyIpIHsKICAgICAgdGhyb3cgbmV3IEpweEVycm9yKGltYWdlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gaW1hZ2VEYXRhOwogIH0KICBzdGF0aWMgY2xlYW51cCgpIHsKICAgIHRoaXMuI21vZHVsZSA9IG51bGw7CiAgfQogIHN0YXRpYyBwYXJzZUltYWdlUHJvcGVydGllcyhzdHJlYW0pIHsKICAgIGxldCBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgIHdoaWxlIChuZXdCeXRlID49IDApIHsKICAgICAgY29uc3Qgb2xkQnl0ZSA9IG5ld0J5dGU7CiAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICBjb25zdCBjb2RlID0gb2xkQnl0ZSA8PCA4IHwgbmV3Qnl0ZTsKICAgICAgaWYgKGNvZGUgPT09IDB4ZmY1MSkgewogICAgICAgIHN0cmVhbS5za2lwKDQpOwogICAgICAgIGNvbnN0IFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBjb25zdCBZc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWE9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBjb25zdCBZT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIHN0cmVhbS5za2lwKDE2KTsKICAgICAgICBjb25zdCBDc2l6ID0gc3RyZWFtLmdldFVpbnQxNigpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICB3aWR0aDogWHNpeiAtIFhPc2l6LAogICAgICAgICAgaGVpZ2h0OiBZc2l6IC0gWU9zaXosCiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50OiA4LAogICAgICAgICAgY29tcG9uZW50c0NvdW50OiBDc2l6CiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEpweEVycm9yKCJObyBzaXplIG1hcmtlciBmb3VuZCBpbiBKUFggc3RyZWFtIik7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9qcHhfc3RyZWFtLmpzCgoKCmNsYXNzIEpweFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMuZGljdCA9IHN0cmVhbS5kaWN0OwogICAgdGhpcy5tYXliZUxlbmd0aCA9IG1heWJlTGVuZ3RoOwogICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgfQogIGdldCBieXRlcygpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOwogIH0KICBlbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7fQogIHJlYWRCbG9jayhkZWNvZGVyT3B0aW9ucykgewogICAgdGhpcy5kZWNvZGVJbWFnZShudWxsLCBkZWNvZGVyT3B0aW9ucyk7CiAgfQogIGRlY29kZUltYWdlKGJ5dGVzLCBkZWNvZGVyT3B0aW9ucykgewogICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjsKICAgIH0KICAgIGJ5dGVzIHx8PSB0aGlzLmJ5dGVzOwogICAgdGhpcy5idWZmZXIgPSBKcHhJbWFnZS5kZWNvZGUoYnl0ZXMsIGRlY29kZXJPcHRpb25zKTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXIubGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyOwogIH0KICBnZXQgY2FuQXN5bmNEZWNvZGVJbWFnZUZyb21CdWZmZXIoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW0uaXNBc3luYzsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2x6d19zdHJlYW0uanMKCgoKCgoKCmNsYXNzIExaV1N0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2Up
20IHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICB0aGlzLmNhY2hlZERhdGEgPSAwOwogICAgdGhpcy5iaXRzQ2FjaGVkID0gMDsKICAgIGNvbnN0IG1heEx6d0RpY3Rpb25hcnlTaXplID0gNDA5NjsKICAgIGNvbnN0IGx6d1N0YXRlID0gewogICAgICBlYXJseUNoYW5nZSwKICAgICAgY29kZUxlbmd0aDogOSwKICAgICAgbmV4dENvZGU6IDI1OCwKICAgICAgZGljdGlvbmFyeVZhbHVlczogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBkaWN0aW9uYXJ5TGVuZ3RoczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKICAgICAgZGljdGlvbmFyeVByZXZDb2RlczogbmV3IFVpbnQxNkFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKICAgICAgY3VycmVudFNlcXVlbmNlOiBuZXcgVWludDhBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCiAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDogMAogICAgfTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlc1tpXSA9IGk7CiAgICAgIGx6d1N0YXRlLmRpY3Rpb25hcnlMZW5ndGhzW2ldID0gMTsKICAgIH0KICAgIHRoaXMubHp3U3RhdGUgPSBsendTdGF0ZTsKICB9CiAgcmVhZEJpdHMobikgewogICAgbGV0IGJpdHNDYWNoZWQgPSB0aGlzLmJpdHNDYWNoZWQ7CiAgICBsZXQgY2FjaGVkRGF0YSA9IHRoaXMuY2FjaGVkRGF0YTsKICAgIHdoaWxlIChiaXRzQ2FjaGVkIDwgbikgewogICAgICBjb25zdCBjID0gdGhpcy5zdHIuZ2V0Qnl0ZSgpOwogICAgICBpZiAoYyA9PT0gLTEpIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY2FjaGVkRGF0YSA9IGNhY2hlZERhdGEgPDwgOCB8IGM7CiAgICAgIGJpdHNDYWNoZWQgKz0gODsKICAgIH0KICAgIHRoaXMuYml0c0NhY2hlZCA9IGJpdHNDYWNoZWQgLT0gbjsKICAgIHRoaXMuY2FjaGVkRGF0YSA9IGNhY2hlZERhdGE7CiAgICB0aGlzLmxhc3RDb2RlID0gbnVsbDsKICAgIHJldHVybiBjYWNoZWREYXRhID4+PiBiaXRzQ2FjaGVkICYgKDEgPDwgbikgLSAxOwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCBibG9ja1NpemUgPSA1MTIsCiAgICAgIGRlY29kZWRTaXplRGVsdGEgPSBibG9ja1NpemU7CiAgICBsZXQgZXN0aW1hdGVkRGVjb2RlZFNpemUgPSBibG9ja1NpemUgKiAyOwogICAgbGV0IGksIGosIHE7CiAgICBjb25zdCBsendTdGF0ZSA9IHRoaXMubHp3U3RhdGU7CiAgICBpZiAoIWx6d1N0YXRlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVhcmx5Q2hhbmdlID0gbHp3U3RhdGUuZWFybHlDaGFuZ2U7CiAgICBsZXQgbmV4dENvZGUgPSBsendTdGF0ZS5uZXh0Q29kZTsKICAgIGNvbnN0IGRpY3Rpb25hcnlWYWx1ZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5VmFsdWVzOwogICAgY29uc3QgZGljdGlvbmFyeUxlbmd0aHMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3RoczsKICAgIGNvbnN0IGRpY3Rpb25hcnlQcmV2Q29kZXMgPSBsendTdGF0ZS5kaWN0aW9uYXJ5UHJldkNvZGVzOwogICAgbGV0IGNvZGVMZW5ndGggPSBsendTdGF0ZS5jb2RlTGVuZ3RoOwogICAgbGV0IHByZXZDb2RlID0gbHp3U3RhdGUucHJldkNvZGU7CiAgICBjb25zdCBjdXJyZW50U2VxdWVuY2UgPSBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2U7CiAgICBsZXQgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlTGVuZ3RoOwogICAgbGV0IGRlY29kZWRMZW5ndGggPSAwOwogICAgbGV0IGN1cnJlbnRCdWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGxldCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTsKICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewogICAgICBjb25zdCBjb2RlID0gdGhpcy5yZWFkQml0cyhjb2RlTGVuZ3RoKTsKICAgICAgY29uc3QgaGFzUHJldiA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA+IDA7CiAgICAgIGlmIChjb2RlIDwgMjU2KSB7CiAgICAgICAgY3VycmVudFNlcXVlbmNlWzBdID0gY29kZTsKICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAxOwogICAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMjU4KSB7CiAgICAgICAgaWYgKGNvZGUgPCBuZXh0Q29kZSkgewogICAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gZGljdGlvbmFyeUxlbmd0aHNbY29kZV07CiAgICAgICAgICBmb3IgKGogPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggLSAxLCBxID0gY29kZTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICAgICAgY3VycmVudFNlcXVlbmNlW2pdID0gZGljdGlvbmFyeVZhbHVlc1txXTsKICAgICAgICAgICAgcSA9IGRpY3Rpb25hcnlQcmV2Q29kZXNbcV07CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtjdXJyZW50U2VxdWVuY2VMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2VbMF07CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDI1NikgewogICAgICAgIGNvZGVMZW5ndGggPSA5OwogICAgICAgIG5leHRDb2RlID0gMjU4OwogICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IDA7CiAgICAgICAgY29udGludWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIGRlbGV0ZSB0aGlzLmx6d1N0YXRlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChoYXNQcmV2KSB7CiAgICAgICAgZGljdGlvbmFyeVByZXZDb2Rlc1tuZXh0Q29kZV0gPSBwcmV2Q29kZTsKICAgICAgICBkaWN0aW9uYXJ5TGVuZ3Roc1tuZXh0Q29kZV0gPSBkaWN0aW9uYXJ5TGVuZ3Roc1twcmV2Q29kZV0gKyAxOwogICAgICAgIGRpY3Rpb25hcnlWYWx1ZXNbbmV4dENvZGVdID0gY3VycmVudFNlcXVlbmNlWzBdOwogICAgICAgIG5leHRDb2RlKys7CiAgICAgICAgY29kZUxlbmd0aCA9IG5leHRDb2RlICsgZWFybHlDaGFuZ2UgJiBuZXh0Q29kZSArIGVhcmx5Q2hhbmdlIC0gMSA/IGNvZGVMZW5ndGggOiBNYXRoLm1pbihNYXRoLmxvZyhuZXh0Q29kZSArIGVhcmx5Q2hhbmdlKSAvIDAuNjkzMTQ3MTgwNTU5OTQ1MyArIDEsIDEyKSB8IDA7CiAgICAgI
20H0KICAgICAgcHJldkNvZGUgPSBjb2RlOwogICAgICBkZWNvZGVkTGVuZ3RoICs9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsKICAgICAgaWYgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCkgewogICAgICAgIGRvIHsKICAgICAgICAgIGVzdGltYXRlZERlY29kZWRTaXplICs9IGRlY29kZWRTaXplRGVsdGE7CiAgICAgICAgfSB3aGlsZSAoZXN0aW1hdGVkRGVjb2RlZFNpemUgPCBkZWNvZGVkTGVuZ3RoKTsKICAgICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcih0aGlzLmJ1ZmZlckxlbmd0aCArIGVzdGltYXRlZERlY29kZWRTaXplKTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgY3VycmVudFNlcXVlbmNlTGVuZ3RoOyBqKyspIHsKICAgICAgICBidWZmZXJbY3VycmVudEJ1ZmZlckxlbmd0aCsrXSA9IGN1cnJlbnRTZXF1ZW5jZVtqXTsKICAgICAgfQogICAgfQogICAgbHp3U3RhdGUubmV4dENvZGUgPSBuZXh0Q29kZTsKICAgIGx6d1N0YXRlLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoOwogICAgbHp3U3RhdGUucHJldkNvZGUgPSBwcmV2Q29kZTsKICAgIGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gY3VycmVudEJ1ZmZlckxlbmd0aDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3ByZWRpY3Rvcl9zdHJlYW0uanMKCgoKCgoKCgoKY2xhc3MgUHJlZGljdG9yU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIGlmICghKHBhcmFtcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBzdHI7CiAgICB9CiAgICBjb25zdCBwcmVkaWN0b3IgPSB0aGlzLnByZWRpY3RvciA9IHBhcmFtcy5nZXQoIlByZWRpY3RvciIpIHx8IDE7CiAgICBpZiAocHJlZGljdG9yIDw9IDEpIHsKICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGlmIChwcmVkaWN0b3IgIT09IDIgJiYgKHByZWRpY3RvciA8IDEwIHx8IHByZWRpY3RvciA+IDE1KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CiAgICB9CiAgICB0aGlzLnJlYWRCbG9jayA9IHByZWRpY3RvciA9PT0gMiA/IHRoaXMucmVhZEJsb2NrVGlmZiA6IHRoaXMucmVhZEJsb2NrUG5nOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzID0gcGFyYW1zLmdldCgiQ29sb3JzIikgfHwgMTsKICAgIGNvbnN0IGJpdHMgPSB0aGlzLmJpdHMgPSBwYXJhbXMuZ2V0KCJCUEMiLCAiQml0c1BlckNvbXBvbmVudCIpIHx8IDg7CiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zID0gcGFyYW1zLmdldCgiQ29sdW1ucyIpIHx8IDE7CiAgICB0aGlzLnBpeEJ5dGVzID0gY29sb3JzICogYml0cyArIDcgPj4gMzsKICAgIHRoaXMucm93Qnl0ZXMgPSBjb2x1bW5zICogY29sb3JzICogYml0cyArIDcgPj4gMzsKICAgIHJldHVybiB0aGlzOwogIH0KICByZWFkQmxvY2tUaWZmKCkgewogICAgY29uc3Qgcm93Qnl0ZXMgPSB0aGlzLnJvd0J5dGVzOwogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyByb3dCeXRlcyk7CiAgICBjb25zdCBiaXRzID0gdGhpcy5iaXRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCByYXdCeXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKHJvd0J5dGVzKTsKICAgIHRoaXMuZW9mID0gIXJhd0J5dGVzLmxlbmd0aDsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgaW5idWYgPSAwLAogICAgICBvdXRidWYgPSAwOwogICAgbGV0IGluYml0cyA9IDAsCiAgICAgIG91
20dGJpdHMgPSAwOwogICAgbGV0IHBvcyA9IGJ1ZmZlckxlbmd0aDsKICAgIGxldCBpOwogICAgaWYgKGJpdHMgPT09IDEgJiYgY29sb3JzID09PSAxKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgbGV0IGMgPSByYXdCeXRlc1tpXSBeIGluYnVmOwogICAgICAgIGMgXj0gYyA+PiAxOwogICAgICAgIGMgXj0gYyA+PiAyOwogICAgICAgIGMgXj0gYyA+PiA0OwogICAgICAgIGluYnVmID0gKGMgJiAxKSA8PCA3OwogICAgICAgIGJ1ZmZlcltwb3MrK10gPSBjOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGJpdHMgPT09IDgpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgKytpKSB7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHJhd0J5dGVzW2ldOwogICAgICB9CiAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgIGJ1ZmZlcltwb3NdID0gYnVmZmVyW3BvcyAtIGNvbG9yc10gKyByYXdCeXRlc1tpXTsKICAgICAgICBwb3MrKzsKICAgICAgfQogICAgfSBlbHNlIGlmIChiaXRzID09PSAxNikgewogICAgICBjb25zdCBieXRlc1BlclBpeGVsID0gY29sb3JzICogMjsKICAgICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzUGVyUGl4ZWw7ICsraSkgewogICAgICAgIGJ1ZmZlcltwb3MrK10gPSByYXdCeXRlc1tpXTsKICAgICAgfQogICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyBpICs9IDIpIHsKICAgICAgICBjb25zdCBzdW0gPSAoKHJhd0J5dGVzW2ldICYgMHhmZikgPDwgOCkgKyAocmF3Qnl0ZXNbaSArIDFdICYgMHhmZikgKyAoKGJ1ZmZlcltwb3MgLSBieXRlc1BlclBpeGVsXSAmIDB4ZmYpIDw8IDgpICsgKGJ1ZmZlcltwb3MgLSBieXRlc1BlclBpeGVsICsgMV0gJiAweGZmKTsKICAgICAgICBidWZmZXJbcG9zKytdID0gc3VtID4+IDggJiAweGZmOwogICAgICAgIGJ1ZmZlcltwb3MrK10gPSBzdW0gJiAweGZmOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBjb21wQXJyYXkgPSBuZXcgVWludDhBcnJheShjb2xvcnMgKyAxKTsKICAgICAgY29uc3QgYml0TWFzayA9ICgxIDw8IGJpdHMpIC0gMTsKICAgICAgbGV0IGogPSAwLAogICAgICAgIGsgPSBidWZmZXJMZW5ndGg7CiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2x1bW5zOyArK2kpIHsKICAgICAgICBmb3IgKGxldCBrayA9IDA7IGtrIDwgY29sb3JzOyArK2trKSB7CiAgICAgICAgICBpZiAoaW5iaXRzIDwgYml0cykgewogICAgICAgICAgICBpbmJ1ZiA9IGluYnVmIDw8IDggfCByYXdCeXRlc1tqKytdICYgMHhmZjsKICAgICAgICAgICAgaW5iaXRzICs9IDg7CiAgICAgICAgICB9CiAgICAgICAgICBjb21wQXJyYXlba2tdID0gY29tcEFycmF
205W2trXSArIChpbmJ1ZiA+PiBpbmJpdHMgLSBiaXRzKSAmIGJpdE1hc2s7CiAgICAgICAgICBpbmJpdHMgLT0gYml0czsKICAgICAgICAgIG91dGJ1ZiA9IG91dGJ1ZiA8PCBiaXRzIHwgY29tcEFycmF5W2trXTsKICAgICAgICAgIG91dGJpdHMgKz0gYml0czsKICAgICAgICAgIGlmIChvdXRiaXRzID49IDgpIHsKICAgICAgICAgICAgYnVmZmVyW2srK10gPSBvdXRidWYgPj4gb3V0Yml0cyAtIDggJiAweGZmOwogICAgICAgICAgICBvdXRiaXRzIC09IDg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvdXRiaXRzID4gMCkgewogICAgICAgIGJ1ZmZlcltrKytdID0gKG91dGJ1ZiA8PCA4IC0gb3V0Yml0cykgKyAoaW5idWYgJiAoMSA8PCA4IC0gb3V0Yml0cykgLSAxKTsKICAgICAgfQogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggKz0gcm93Qnl0ZXM7CiAgfQogIHJlYWRCbG9ja1BuZygpIHsKICAgIGNvbnN0IHJvd0J5dGVzID0gdGhpcy5yb3dCeXRlczsKICAgIGNvbnN0IHBpeEJ5dGVzID0gdGhpcy5waXhCeXRlczsKICAgIGNvbnN0IHByZWRpY3RvciA9IHRoaXMuc3RyLmdldEJ5dGUoKTsKICAgIGNvbnN0IHJhd0J5dGVzID0gdGhpcy5zdHIuZ2V0Qnl0ZXMocm93Qnl0ZXMpOwogICAgdGhpcy5lb2YgPSAhcmF3Qnl0ZXMubGVuZ3RoOwogICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgY29uc3QgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgcm93Qnl0ZXMpOwogICAgbGV0IHByZXZSb3cgPSBidWZmZXIuc3ViYXJyYXkoYnVmZmVyTGVuZ3RoIC0gcm93Qnl0ZXMsIGJ1ZmZlckxlbmd0aCk7CiAgICBpZiAocHJldlJvdy5sZW5ndGggPT09IDApIHsKICAgICAgcHJldlJvdyA9IG5ldyBVaW50OEFycmF5KHJvd0J5dGVzKTsKICAgIH0KICAgIGxldCBpLAogICAgICBqID0gYnVmZmVyTGVuZ3RoLAogICAgICB1cCwKICAgICAgYzsKICAgIHN3aXRjaCAocHJlZGljdG9yKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgICAgYnVmZmVyW2orK10gPSByYXdCeXRlc1tpXTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkgewogICAgICAgICAgYnVmZmVyW2orK10gPSByYXdCeXRlc1tpXTsKICAgICAgICB9CiAgICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbal0gPSBidWZmZXJbaiAtIHBpeEJ5dGVzXSArIHJhd0J5dGVzW2ldICYgMHhmZjsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgICAgYnVmZmVyW2orK10gPSBwcmV2Um93W2ldICsgcmF3Qnl0ZXNbaV0gJiAweGZmOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAzOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhCeXRlczsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaisrXSA9IChwcmV2Um93W2ldID4+IDEpICsgcmF3Qnl0ZXNbaV07CiAgICAgICAgfQogICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgICAgYnVmZmVyW2pdID0gKHByZXZSb3dbaV0gKyBidWZmZXJbaiAtIHBpeEJ5dGVzXSA+PiAxKSArIHJhd0J5dGVzW2ldICYgMHhmZjsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkgewogICAgICAgICAgdXAgPSBwcmV2Um93W2ldOwogICAgICAgICAgYyA9IHJhd0J5dGVzW2ldOwogICAgICAgICAgYnVmZmVyW2orK10gPSB1cCArIGM7CiAgICAgICAgfQogICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgICAgdXAgPSBwcmV2Um93W2ldOwogICAgICAgICAgY29uc3QgdXBMZWZ0ID0gcHJldlJvd1tpIC0gcGl4Qnl0ZXNdOwogICAgICAgICAgY29uc3QgbGVmdCA9IGJ1ZmZlcltqIC0gcGl4Qnl0ZXNdOwogICAgICAgICAgY29uc3QgcCA9IGxlZnQgKyB1cCAtIHVwTGVmdDsKICAgICAgICAgIGxldCBwYSA9IHAgLSBsZWZ0OwogICAgICAgICAgaWYgKHBhIDwgMCkgewogICAgICAgICAgICBwYSA9IC1wYTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBwYiA9IHAgLSB1cDsKICAgICAgICAgIGlmIChwYiA8IDApIHsKICAgICAgICAgICAgcGIgPSAtcGI7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgcGMgPSBwIC0gdXBMZWZ0OwogICAgICAgICAgaWYgKHBjIDwgMCkgewogICAgICAgICAgICBwYyA9IC1wYzsKICAgICAgICAgIH0KICAgICAgICAgIGMgPSByYXdCeXRlc1tpXTsKICAgICAgICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykgewogICAgICAgICAgICBidWZmZXJbaisrXSA9IGxlZnQgKyBjOwogICAgICAgICAgfSBlbHNlIGlmIChwYiA8PSBwYykgewogICAgICAgICAgICBidWZmZXJbaisrXSA9IHVwICsgYzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXBMZWZ0ICsgYzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwcmVkaWN0b3I6ICR7cHJlZGljdG9yfWApOwogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggKz0gcm93Qnl0ZXM7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9ydW5fbGVuZ3RoX3N0cmVhbS5qcwoKY2xhc3MgUnVuTGVuZ3RoU3RyZWFtIGV4dGVuZHMgRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogIH0KICByZWFkQmxvY2soKSB7CiAgICBjb25zdCByZXBlYXRIZWFkZXIgPSB0aGlzLnN0ci5nZXRCeXRlcygyKTsKICAgIGlmICghcmVwZWF0SGVhZGVyIHx8IHJlcGVhdEhlYWRlci5sZW5ndGggPCAyIHx8IHJlcGVhdEhlYWRlclswXSA9PT0gMTI4KSB7CiAgICAgI
20HRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGJ1ZmZlcjsKICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGxldCBuID0gcmVwZWF0SGVhZGVyWzBdOwogICAgaWYgKG4gPCAxMjgpIHsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgbiArIDEpOwogICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gcmVwZWF0SGVhZGVyWzFdOwogICAgICBpZiAobiA+IDApIHsKICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnN0ci5nZXRCeXRlcyhuKTsKICAgICAgICBidWZmZXIuc2V0KHNvdXJjZSwgYnVmZmVyTGVuZ3RoKTsKICAgICAgICBidWZmZXJMZW5ndGggKz0gbjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbiA9IDI1NyAtIG47CiAgICAgIGNvbnN0IGIgPSByZXBlYXRIZWFkZXJbMV07CiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gYjsKICAgICAgfQogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wYXJzZXIuanMKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjb25zdCBNQVhfTEVOR1RIX1RPX0NBQ0hFID0gMTAwMDsKZnVuY3Rpb24gZ2V0SW5saW5lSW1hZ2VDYWNoZUtleShieXRlcykgewogIGNvbnN0IHN0ckJ1ZiA9IFtdLAogICAgaWkgPSBieXRlcy5sZW5ndGg7CiAgbGV0IGkgPSAwOwogIHdoaWxlIChpIDwgaWkgLSAxKSB7CiAgICBzdHJCdWYucHVzaChieXRlc1tpKytdIDw8IDggfCBieXRlc1tpKytdKTsKICB9CiAgaWYgKGkgPCBpaSkgewogICAgc3RyQnVmLnB1c2goYnl0ZXNbaV0pOwogIH0KICByZXR1cm4gaWkgKyAiXyIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHN0ckJ1Zik7Cn0KY2xhc3MgUGFyc2VyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBsZXhlciwKICAgIHhyZWYsCiAgICBhbGxvd1N0cmVhbXMgPSBmYWxzZSwKICAgIHJlY292ZXJ5TW9kZSA9IGZhbHNlCiAgfSkgewogICAgdGhpcy5sZXhlciA9IGxleGVyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuYWxsb3dTdHJlYW1zID0gYWxsb3dTdHJlYW1zOwogICAgdGhpcy5yZWNvdmVyeU1vZGUgPSByZWNvdmVyeU1vZGU7CiAgICB0aGlzLmltYWdlQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5faW1hZ2VJZCA9IDA7CiAgICB0aGlzLnJlZmlsbCgpOwogIH0KICByZWZpbGwoKSB7CiAgICB0aGlzLmJ1ZjEgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgdGhpcy5idWYyID0gdGhpcy5sZXhlci5nZXRPYmooKTsKICB9CiAgc2hpZnQoKSB7CiAgICBpZiAodGhpcy5idWYyIGluc3RhbmNlb2YgQ21kICYmIHRoaXMuYnVmMi5jbWQgPT09ICJJRCIpIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5idWYxID0gdGhpcy5idWYyOwogICAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOwogICAgfQogIH0KICB0cnlTaGlmdCgpIHsKICAgIHRyeSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSA9IG51bGwpIHsKICAgIGNvbnN0IGJ1ZjEgPSB0aGlzLmJ1ZjE7CiAgICB0aGlzLnNoaWZ0KCk7CiAgICBpZiAoYnVmMSBpbnN0YW5jZW9mIENtZCkgewogICAgICBzd2l0Y2ggKGJ1ZjEuY21kKSB7CiAgICAgICAgY2FzZSAiQkkiOgogICAgICAgICAgcmV0dXJuIHRoaXMubWFrZUlubGluZUltYWdlKGNpcGhlclRyYW5zZm9ybSk7CiAgICAgICAgY2FzZSAiWyI6CiAgICAgICAgICBjb25zdCBhcnJheSA9IFtdOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICJdIikgJiYgdGhpcy5idWYxICE9PSBFT0YpIHsKICAgICAgICAgICAgYXJyYXkucHVzaCh0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlckVPRkV4Y2VwdGlvbigiRW5kIG9mIGZpbGUgaW5zaWRlIGFycmF5LiIpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIGNhc2UgIjw8IjoKICAgICAgICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICAgICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICI+PiIpICYmIHRoaXMuYnVmMSAhPT0gRU9GKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuYnVmMSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgaW5mbygiTWFsZm9ybWVkIGRpY3Rpb25hcnk6IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKICAgICAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWYxLm5hbWU7CiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gRU9GKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGljdC5zZXQoa2V5LCB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IEVPRikgewogICAgICAgICAgICBpZiAodGhpcy5yZWNvdmVyeU1vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VyRU9GRXhjZXB0aW9uKCJFbmQgb2YgZmlsZSBpbnNpZGUgZGljdGlvbmFyeS4iKTsKICAgICAgICAgI
20H0KICAgICAgICAgIGlmIChpc0NtZCh0aGlzLmJ1ZjIsICJzdHJlYW0iKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd1N0cmVhbXMgPyB0aGlzLm1ha2VTdHJlYW0oZGljdCwgY2lwaGVyVHJhbnNmb3JtKSA6IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgICByZXR1cm4gZGljdDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIGJ1ZjE7CiAgICAgIH0KICAgIH0KICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGJ1ZjEpKSB7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHRoaXMuYnVmMSkgJiYgaXNDbWQodGhpcy5idWYyLCAiUiIpKSB7CiAgICAgICAgY29uc3QgcmVmID0gUmVmLmdldChidWYxLCB0aGlzLmJ1ZjEpOwogICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKICAgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBjaXBoZXJUcmFuc2Zvcm0uZGVjcnlwdFN0cmluZyhidWYxKTsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIHJldHVybiBidWYxOwogIH0KICBmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OSwKICAgICAgU1BBQ0UgPSAweDIwLAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIE5VTCA9IDB4MDsKICAgIGNvbnN0IHsKICAgICAgICBrbm93bkNvbW1hbmRzCiAgICAgIH0gPSB0aGlzLmxleGVyLAogICAgICBzdGFydFBvcyA9IHN0cmVhbS5wb3MsCiAgICAgIG4gPSAxNTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoLAogICAgICBtYXliZUVJUG9zOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoID09PSBTUEFDRSB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSKSB7CiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTsKICAgICAgICAgIGNvbnN0IGlpID0gZm9sbG93aW5nQnl0ZXMubGVuZ3RoOwogICAgICAgICAgaWYgKGlpID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGNoID0gZm9sbG93aW5nQnl0ZXNbaV07CiAgICAgICAgICAgIGlmIChjaCA9PT0gTlVMICYmIGZvbGxvd2luZ0J5dGVzW2kgKyAxXSAhPT0gTlVMKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgewogICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlICE9PSAyKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmRzKSB7CiAgICAgICAgICAgIHdhcm4oImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kIC0gYGxleGVyLmtub3duQ29tbWFuZHNgIGlzIHVuZGVmaW5lZC4iKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCB0bXBMZXhlciA9IG5ldyBMZXhlcihuZXcgU3RyZWFtKGZvbGxvd2luZ0J5dGVzLnNsaWNlKCkpLCBrbm93bkNvbW1hbmRzKTsKICAgICAgICAgIHRtcExleGVyLl9oZXhTdHJpbmdXYXJuID0gKCkgPT4ge307CiAgICAgICAgICBsZXQgbnVtQXJncyA9IDA7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBjb25zdCBuZXh0T2JqID0gdG1wTGV4ZXIuZ2V0T2JqKCk7CiAgICAgICAgICAgIGlmIChuZXh0T2JqID09PSBFT0YpIHsKICAgICAgICAgICAgICBzdGF0ZSA9IDA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5leHRPYmogaW5zdGFuY2VvZiBDbWQpIHsKICAgICAgICAgICAgICBjb25zdCBrbm93bkNvbW1hbmQgPSBrbm93bkNvbW1hbmRzW25leHRPYmouY21kXTsKICAgICAgICAgICAgICBpZiAoIWtub3duQ29tbWFuZCkgewogICAgICAgICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChrbm93bkNvbW1hbmQudmFyaWFibGVBcmdzID8gbnVtQXJncyA8PSBrbm93bkNvbW1hbmQubnVtQXJncyA6IG51bUFyZ3MgPT09IGtub3duQ29tbWFuZC5udW1BcmdzKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbnVtQXJncyA9IDA7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnVtQXJncysrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlID09PSAyKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZSA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgIHdhcm4oImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kOiAiICsgIlJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlciIpOwogICAgICBpZiAobWF5YmVFSVBvcykgewogICAgICAgIHdhcm4oJy4uLiB0cnlpbmcgdG8gcmVjb3ZlciBieSB1c2luZyB0aGUgbGFzdCAiRUkiIG9jY3VycmVuY2UuJyk7CiAgICAgICAgc3RyZWFtLnNraXAoLShzdHJlYW0ucG9zIC0gbWF5YmVFSVBvcykpOwogICAgICB9CiAgICB9CiAgICBsZXQgZW5kT2Zmc2V0ID0gNDsKICAgIHN0cmVhbS5za2lwKC1lbmRPZmZzZXQpOwogICAgY2ggPSBzdHJlYW0ucGVla0J5dGUoKTsKICAgIHN0cmVhbS5za2lwKGVuZE9mZnNldCk7CiAgICBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgZW5kT2Zmc2V0LS07CiAgICB9CiAgICByZXR1cm4gc3RyZWFtLnBvcyAtIGVuZE9mZnNldCAtIHN0YXJ0UG9zOwogIH0KICBmaW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgewogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGZvdW5kRU9JID0gZmFsc2UsCiAgICAgIGIsCiAgICAgIG1hcmtlckxlbmd0aDsKICAgIHdoaWxlICgoYiA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoYiAhPT0gMHhmZikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgI
20HN3aXRjaCAoc3RyZWFtLmdldEJ5dGUoKSkgewogICAgICAgIGNhc2UgMHgwMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZjoKICAgICAgICAgIHN0cmVhbS5za2lwKC0xKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhkOToKICAgICAgICAgIGZvdW5kRU9JID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhjMDoKICAgICAgICBjYXNlIDB4YzE6CiAgICAgICAgY2FzZSAweGMyOgogICAgICAgIGNhc2UgMHhjMzoKICAgICAgICBjYXNlIDB4YzU6CiAgICAgICAgY2FzZSAweGM2OgogICAgICAgIGNhc2UgMHhjNzoKICAgICAgICBjYXNlIDB4Yzk6CiAgICAgICAgY2FzZSAweGNhOgogICAgICAgIGNhc2UgMHhjYjoKICAgICAgICBjYXNlIDB4Y2Q6CiAgICAgICAgY2FzZSAweGNlOgogICAgICAgIGNhc2UgMHhjZjoKICAgICAgICBjYXNlIDB4YzQ6CiAgICAgICAgY2FzZSAweGNjOgogICAgICAgIGNhc2UgMHhkYToKICAgICAgICBjYXNlIDB4ZGI6CiAgICAgICAgY2FzZSAweGRjOgogICAgICAgIGNhc2UgMHhkZDoKICAgICAgICBjYXNlIDB4ZGU6CiAgICAgICAgY2FzZSAweGRmOgogICAgICAgIGNhc2UgMHhlMDoKICAgICAgICBjYXNlIDB4ZTE6CiAgICAgICAgY2FzZSAweGUyOgogICAgICAgIGNhc2UgMHhlMzoKICAgICAgICBjYXNlIDB4ZTQ6CiAgICAgICAgY2FzZSAweGU1OgogICAgICAgIGNhc2UgMHhlNjoKICAgICAgICBjYXNlIDB4ZTc6CiAgICAgICAgY2FzZSAweGU4OgogICAgICAgIGNhc2UgMHhlOToKICAgICAgICBjYXNlIDB4ZWE6CiAgICAgICAgY2FzZSAweGViOgogICAgICAgIGNhc2UgMHhlYzoKICAgICAgICBjYXNlIDB4ZWQ6CiAgICAgICAgY2FzZSAweGVlOgogICAgICAgIGNhc2UgMHhlZjoKICAgICAgICBjYXNlIDB4ZmU6CiAgICAgICAgICBtYXJrZXJMZW5ndGggPSBzdHJlYW0uZ2V0VWludDE2KCk7CiAgICAgICAgICBpZiAobWFya2VyTGVuZ3RoID4gMikgewogICAgICAgICAgICBzdHJlYW0uc2tpcChtYXJrZXJMZW5ndGggLSAyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwKC0yKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChmb3VuZEVPSSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoYiA9PT0gLTEpIHsKICAgICAgd2FybigiSW5saW5lIERDVERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9JIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOwogICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KICBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IFRJTERFID0gMHg3ZSwKICAgICAgR1QgPSAweDNlOwogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoY2ggPT09IFRJTERFKSB7CiAgICAgICAgY29uc3QgdGlsZGVQb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgd2hpbGUgKGlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICAgIHN0cmVhbS5za2lwKCk7CiAgICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT09IEdUKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ucG9zID4gdGlsZGVQb3MpIHsKICAgICAgICAgIGNvbnN0IG1heWJlRUkgPSBzdHJlYW0ucGVla0J5dGVzKDIpOwogICAgICAgICAgaWYgKG1heWJlRUlbMF0gPT09IDB4NDUgJiYgbWF5YmVFSVsxXSA9PT0gMHg0OSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdGFydFBvczsKICAgIGlmIChjaCA9PT0gLTEpIHsKICAgICAgd2FybigiSW5saW5lIEFTQ0lJODVEZWNvZGUgaW1hZ2Ugc3RyZWFtOiAiICsgIkVPRCBtYXJrZXIgbm90IGZvdW5kLCBzZWFyY2hpbmcgZm9yIC9FSS8gaW5zdGVhZC4iKTsKICAgICAgc3RyZWFtLnNraXAoLWxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICB9CiAgICB0aGlzLmlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pOwogICAgcmV0dXJuIGxlbmd0aDsKICB9CiAgZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSkgewogICAgY29uc3QgR1QgPSAweDNlOwogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoY2ggPT09IEdUKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5wb3MgLSBzdGFydFBvczsKICAgIGlmIChjaCA9PT0gLTEpIHsKICAgICAgd2FybigiSW5saW5lIEFTQ0lJSGV4RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CiAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgI
20H0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDIpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBtYWtlSW5saW5lSW1hZ2UoY2lwaGVyVHJhbnNmb3JtKSB7CiAgICBjb25zdCBsZXhlciA9IHRoaXMubGV4ZXI7CiAgICBjb25zdCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CiAgICBjb25zdCBkaWN0TWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGxldCBkaWN0TGVuZ3RoOwogICAgd2hpbGUgKCFpc0NtZCh0aGlzLmJ1ZjEsICJJRCIpICYmIHRoaXMuYnVmMSAhPT0gRU9GKSB7CiAgICAgIGlmICghKHRoaXMuYnVmMSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJEaWN0aW9uYXJ5IGtleSBtdXN0IGJlIGEgbmFtZSBvYmplY3QiKTsKICAgICAgfQogICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTsKICAgICAgdGhpcy5zaGlmdCgpOwogICAgICBpZiAodGhpcy5idWYxID09PSBFT0YpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkaWN0TWFwW2tleV0gPSB0aGlzLmdldE9iaihjaXBoZXJUcmFuc2Zvcm0pOwogICAgfQogICAgaWYgKGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3MgIT09IC0xKSB7CiAgICAgIGRpY3RMZW5ndGggPSBzdHJlYW0ucG9zIC0gbGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvczsKICAgIH0KICAgIGNvbnN0IGZpbHRlciA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGRpY3RNYXAuRiB8fCBkaWN0TWFwLkZpbHRlcik7CiAgICBsZXQgZmlsdGVyTmFtZTsKICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXIubmFtZTsKICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CiAgICAgIGNvbnN0IGZpbHRlclplcm8gPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJbMF0pOwogICAgICBpZiAoZmlsdGVyWmVybyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyWmVyby5uYW1lOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3M7CiAgICBsZXQgbGVuZ3RoOwogICAgc3dpdGNoIChmaWx0ZXJOYW1lKSB7CiAgICAgIGNhc2UgIkRDVCI6CiAgICAgIGNhc2UgIkRDVERlY29kZSI6CiAgICAgICAgbGVuZ3RoID0gdGhpcy5maW5kRENURGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkE4NSI6CiAgICAgIGNhc2UgIkFTQ0lJODVEZWNvZGUiOgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZEFTQ0lJODVEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQUh4IjoKICAgICAgY2FzZSAiQVNDSUlIZXhEZWNvZGUiOgogICAgICAgIGxlbmd0aCA9IHRoaXMuZmluZEFTQ0lJSGV4RGVjb2RlSW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgbGVuZ3RoID0gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgbGV0IGNhY2hlS2V5OwogICAgaWYgKGxlbmd0aCA8IE1BWF9MRU5HVEhfVE9fQ0FDSEUgJiYgZGljdExlbmd0aCA+IDApIHsKICAgICAgY29uc3QgaW5pdGlhbFN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIHN0cmVhbS5wb3MgPSBsZXhlci5iZWdpbklubGluZUltYWdlUG9zOwogICAgICBjYWNoZUtleSA9IGdldElubGluZUltYWdlQ2FjaGVLZXkoc3RyZWFtLmdldEJ5dGVzKGRpY3RMZW5ndGggKyBsZW5ndGgpKTsKICAgICAgc3RyZWFtLnBvcyA9IGluaXRpYWxTdHJlYW1Qb3M7CiAgICAgIGNvbnN0IGNhY2hlRW50cnkgPSB0aGlzLmltYWdlQ2FjaGVbY2FjaGVLZXldOwogICAgICBpZiAoY2FjaGVFbnRyeSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhpcy5idWYyID0gQ21kLmdldCgiRUkiKTsKICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgY2FjaGVFbnRyeS5yZXNldCgpOwogICAgICAgIHJldHVybiBjYWNoZUVudHJ5OwogICAgICB9CiAgICB9CiAgICBjb25zdCBkaWN0ID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGZvciAoY29uc3Qga2V5IGluIGRpY3RNYXApIHsKICAgICAgZGljdC5zZXQoa2V5LCBkaWN0TWFwW2tleV0pOwogICAgfQogICAgbGV0IGltYWdlU3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7CiAgICBpZiAoY2lwaGVyVHJhbnNmb3JtKSB7CiAgICAgIGltYWdlU3RyZWFtID0gY2lwaGVyVHJhbnNmb3JtLmNyZWF0ZVN0cmVhbShpbWFnZVN0cmVhbSwgbGVuZ3RoKTsKICAgIH0KICAgIGltYWdlU3RyZWFtID0gdGhpcy5maWx0ZXIoaW1hZ2VTdHJlYW0sIGRpY3QsIGxlbmd0aCk7CiAgICBpbWFnZVN0cmVhbS5kaWN0ID0gZGljdDsKICAgIGlmIChjYWNoZUtleSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGltYWdlU3RyZWFtLmNhY2hlS2V5ID0gYGlubGluZV9pbWdfJHsrK3RoaXMuX2ltYWdlSWR9YDsKICAgICAgdGhpcy5pbWFnZUNhY2hlW2NhY2hlS2V5XSA9IGltYWdlU3RyZWFtOwogICAgfQogICAgdGhpcy5idWYyID0gQ21kLmdldCgiRUkiKTsKICAgIHRoaXMuc2hpZnQoKTsKICAgIHJldHVybiBpbWFnZVN0cmVhbTsKICB9CiAgI2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MpIHsKICAgIGNvbnN0IHsKICAgICAgc3RyZWFtCiAgICB9ID0gdGhpcy5sZXhlcjsKICAgIHN0cmVhbS5wb3MgPSBzdGFydFBvczsKICAgIGNvbnN0IFNDQU5fQkxPQ0tfTEVOR1RIID0gMjA0ODsKICAgIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9ICJlbmRzdHJlYW0iLmxlbmd0aDsKICAgIGNvbnN0IEVORF9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg2NSwgMHg2ZSwgMHg2NF0pOwogICAgY29uc3QgZW5kTGVuZ3RoID0gRU5EX1NJR05BVFVSRS5sZW5ndGg7CiAgICBjb25zdCBQQVJUSUFMX1NJR05BVFVSRSA9IFtuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2ZF0pLCBuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg2NSwgMHg2MSwgMHg2ZF0pLCBuZXcgVWludDhBcnJheShbMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MV0pXTsKICAgIGNvbnN0IG5vcm1hbExlbmd0aCA9IHNpZ25hdHVyZUxlbmd0aCAtIGVuZExlbmd0aDsKICAgIHdoaWxlIChzdHJlYW0ucG9zIDwgc3RyZWFtLmVuZCkgewogICAgICBjb25zdCBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKFNDQU5fQkxPQ0tfTEVOR1RIKTsKICAgICAgY29uc3Qgc2Nhbkxlbmd0aCA9IHNjYW5CeXRlcy5sZW5ndGggLSBzaWduYXR1cmVMZW5ndGg7CiAgICAgIGlmIChzY2FuTGVuZ3RoIDw9IDApIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsZXQgcG9zID0gMDsKICAgICAgd2hpbGUgKHBvcyA8IHNjYW5MZW5ndGgpIHsKICAgICAgICBsZXQgaiA9IDA7CiAgICAgICAgd2hpbGUgKGogPCBlbmRMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyArIGpdID09PSBFTkRfU0lHTkFUVVJFW2pdKSB7CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGlmIChqID49IGVuZExlbmd0aCkgewogICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgUEFSVElBTF9TSUdOQVRVUkUpIHsKICAgICAgICAgICAgY29uc3QgcGFydExlbiA9IHBhcnQubGVuZ3RoOwogICAgICAgICAgICBsZXQgayA9IDA7CiAgICAgICAgICAgI
20HdoaWxlIChrIDwgcGFydExlbiAmJiBzY2FuQnl0ZXNbcG9zICsgaiArIGtdID09PSBwYXJ0W2tdKSB7CiAgICAgICAgICAgICAgaysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrID49IG5vcm1hbExlbmd0aCkgewogICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoayA+PSBwYXJ0TGVuKSB7CiAgICAgICAgICAgICAgY29uc3QgbGFzdEJ5dGUgPSBzY2FuQnl0ZXNbcG9zICsgaiArIGtdOwogICAgICAgICAgICAgIGlmIChpc1doaXRlU3BhY2UobGFzdEJ5dGUpKSB7CiAgICAgICAgICAgICAgICBpbmZvKGBGb3VuZCAiJHtieXRlc1RvU3RyaW5nKFsuLi5FTkRfU0lHTkFUVVJFLCAuLi5wYXJ0XSl9IiB3aGVuIGAgKyAic2VhcmNoaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC4iKTsKICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICBzdHJlYW0ucG9zICs9IHBvczsKICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBzdGFydFBvczsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zKys7CiAgICAgIH0KICAgICAgc3RyZWFtLnBvcyArPSBzY2FuTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBtYWtlU3RyZWFtKGRpY3QsIGNpcGhlclRyYW5zZm9ybSkgewogICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOwogICAgbGV0IHN0cmVhbSA9IGxleGVyLnN0cmVhbTsKICAgIGxleGVyLnNraXBUb05leHRMaW5lKCk7CiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3MgLSAxOwogICAgbGV0IGxlbmd0aCA9IGRpY3QuZ2V0KCJMZW5ndGgiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7CiAgICAgIGluZm8oYEJhZCBsZW5ndGggIiR7bGVuZ3RoICYmIGxlbmd0aC50b1N0cmluZygpfSIgaW4gc3RyZWFtLmApOwogICAgICBsZW5ndGggPSAwOwogICAgfQogICAgc3RyZWFtLnBvcyA9IHN0YXJ0UG9zICsgbGVuZ3RoOwogICAgbGV4ZXIubmV4dENoYXIoKTsKICAgIGlmICh0aGlzLnRyeVNoaWZ0KCkgJiYgaXNDbWQodGhpcy5idWYyLCAiZW5kc3RyZWFtIikpIHsKICAgICAgdGhpcy5zaGlmdCgpOwogICAgfSBlbHNlIHsKICAgICAgbGVuZ3RoID0gdGhpcy4jZmluZFN0cmVhbUxlbmd0aChzdGFydFBvcyk7CiAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJNaXNzaW5nIGVuZHN0cmVhbSBjb21tYW5kLiIpOwogICAgICB9CiAgICAgIGxleGVyLm5leHRDaGFyKCk7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgdGhpcy5zaGlmdCgpOwogICAgfQogICAgdGhpcy5zaGlmdCgpOwogICAgc3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7CiAgICBpZiAoY2lwaGVyVHJhbnNmb3JtKSB7CiAgICAgIHN0cmVhbSA9IGNpcGhlclRyYW5zZm9ybS5jcmVhdGVTdHJlYW0oc3RyZWFtLCBsZW5ndGgpOwogICAgfQogICAgc3RyZWFtID0gdGhpcy5maWx0ZXIoc3RyZWFtLCBkaWN0LCBsZW5ndGgpOwogICAgc3RyZWFtLmRpY3QgPSBkaWN0OwogICAgcmV0dXJuIHN0cmVhbTsKICB9CiAgZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKSB7CiAgICBsZXQgZmlsdGVyID0gZGljdC5nZXQoIkYiLCAiRmlsdGVyIik7CiAgICBsZXQgcGFyYW1zID0gZGljdC5nZXQoIkRQIiwgIkRlY29kZVBhcm1zIik7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7CiAgICAgICAgd2FybigiL0RlY29kZVBhcm1zIHNob3VsZCBub3QgYmUgYW4gQXJyYXksIHdoZW4gL0ZpbHRlciBpcyBhIE5hbWUuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMubWFrZUZpbHRlcihzdHJlYW0sIGZpbHRlci5uYW1lLCBsZW5ndGgsIHBhcmFtcyk7CiAgICB9CiAgICBsZXQgbWF5YmVMZW5ndGggPSBsZW5ndGg7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CiAgICAgIGNvbnN0IGZpbHRlckFycmF5ID0gZmlsdGVyOwogICAgICBjb25zdCBwYXJhbXNBcnJheSA9IHBhcmFtczsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZmlsdGVyQXJyYXkubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICAgIGZpbHRlciA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpbHRlckFycmF5W2ldKTsKICAgICAgICBpZiAoIShmaWx0ZXIgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBCYWQgZmlsdGVyIG5hbWUgIiR7ZmlsdGVyfSJgKTsKICAgICAgICB9CiAgICAgICAgcGFyYW1zID0gbnVsbDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXNBcnJheSkgJiYgaSBpbiBwYXJhbXNBcnJheSkgewogICAgICAgICAgcGFyYW1zID0gdGhpcy54cmVmLmZldGNoSWZSZWYocGFyYW1zQXJyYXlbaV0pOwogICAgICAgIH0KICAgICAgICBzdHJlYW0gPSB0aGlzLm1ha2VGaWx0ZXIoc3RyZWFtLCBmaWx0ZXIubmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgbWF5YmVMZW5ndGggPSBudWxsOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RyZWFtOwogIH0KICBtYWtlRmlsdGVyKHN0cmVhbSwgbmFtZSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgaWYgKG1heWJlTGVuZ3RoID09PSAwKSB7CiAgICAgIHdhcm4oYEVtcHR5ICIke25hbWV9IiBzdHJlYW0uYCk7CiAgICAgIHJldHVybiBuZXcgTnVsbFN0cmVhbSgpOwogICAgfQogICAgdHJ5IHsKICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgY2FzZSAiRmwiOgogICAgICAgIGNhc2UgIkZsYXRlRGVjb2RlIjoKICAgICAgICAgIGlmIChwYXJhbXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWN0b3JTdHJlYW0obmV3IEZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICAgI
20H0KICAgICAgICAgIHJldHVybiBuZXcgRmxhdGVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiTFpXIjoKICAgICAgICBjYXNlICJMWldEZWNvZGUiOgogICAgICAgICAgbGV0IGVhcmx5Q2hhbmdlID0gMTsKICAgICAgICAgIGlmIChwYXJhbXMpIHsKICAgICAgICAgICAgaWYgKHBhcmFtcy5oYXMoIkVhcmx5Q2hhbmdlIikpIHsKICAgICAgICAgICAgICBlYXJseUNoYW5nZSA9IHBhcmFtcy5nZXQoIkVhcmx5Q2hhbmdlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVkaWN0b3JTdHJlYW0obmV3IExaV1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBlYXJseUNoYW5nZSksIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBMWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpOwogICAgICAgIGNhc2UgIkRDVCI6CiAgICAgICAgY2FzZSAiRENURGVjb2RlIjoKICAgICAgICAgIHJldHVybiBuZXcgSnBlZ1N0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgIGNhc2UgIkpQWCI6CiAgICAgICAgY2FzZSAiSlBYRGVjb2RlIjoKICAgICAgICAgIHJldHVybiBuZXcgSnB4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgY2FzZSAiQTg1IjoKICAgICAgICBjYXNlICJBU0NJSTg1RGVjb2RlIjoKICAgICAgICAgIHJldHVybiBuZXcgQXNjaWk4NVN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTsKICAgICAgICBjYXNlICJBSHgiOgogICAgICAgIGNhc2UgIkFTQ0lJSGV4RGVjb2RlIjoKICAgICAgICAgIHJldHVybiBuZXcgQXNjaWlIZXhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiQ0NGIjoKICAgICAgICBjYXNlICJDQ0lUVEZheERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IENDSVRURmF4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgY2FzZSAiUkwiOgogICAgICAgIGNhc2UgIlJ1bkxlbmd0aERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IFJ1bkxlbmd0aFN0cmVhbShzdHJlYW0sIG1heWJlTGVuZ3RoKTsKICAgICAgICBjYXNlICJKQklHMkRlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IEpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgIH0KICAgICAgd2FybihgRmlsdGVyICIke25hbWV9IiBpcyBub3Qgc3VwcG9ydGVkLmApOwogICAgICByZXR1cm4gc3RyZWFtOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGBJbnZhbGlkIHN0cmVhbTogIiR7ZXh9ImApOwogICAgICByZXR1cm4gbmV3IE51bGxTdHJlYW0oKTsKICAgIH0KICB9Cn0KY29uc3Qgc3BlY2lhbENoYXJzID0gWzEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDIsIDIsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdOwpmdW5jdGlvbiB0b0hleERpZ2l0KGNoKSB7CiAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgewogICAgcmV0dXJuIGNoICYgMHgwZjsKICB9CiAgaWYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg0NiB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4NjYpIHsKICAgIHJldHVybiAoY2ggJiAweDBmKSArIDk7CiAgfQogIHJldHVybiAtMTsKfQpjbGFzcyBMZXhlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBrbm93bkNvbW1hbmRzID0gbnVsbCkgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLm5leHRDaGFyKCk7CiAgICB0aGlzLnN0ckJ1ZiA9IFtdOwogICAgdGhpcy5rbm93bkNvbW1hbmRzID0ga25vd25Db21tYW5kczsKICAgIHRoaXMuX2hleFN0cmluZ051bVdhcm4gPSAwOwogICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gLTE7CiAgfQogIG5leHRDaGFyKCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgfQogIHBlZWtDaGFyKCkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBlZWtCeXRlKCk7CiAgfQogIGdldE51bWJlcigpIHsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICBsZXQgZU5vdGF0aW9uID0gZmFsc2U7CiAgICBsZXQgZGl2aWRlQnkgPSAwOwogICAgbGV0IHNpZ24gPSAxOwogICAgaWYgKGNoID09PSAweDJkKSB7CiAgICAgIHNpZ24gPSAtMTsKICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgIGlmIChjaCA9PT0gMHgyZCkgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoID09PSAweDJiKSB7CiAgICAgIGNoID0gdGh
20pcy5uZXh0Q2hhcigpOwogICAgfQogICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CiAgICAgIGRvIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfSB3aGlsZSAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpOwogICAgfQogICAgaWYgKGNoID09PSAweDJlKSB7CiAgICAgIGRpdmlkZUJ5ID0gMTA7CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgfQogICAgaWYgKGNoIDwgMHgzMCB8fCBjaCA+IDB4MzkpIHsKICAgICAgY29uc3QgbXNnID0gYEludmFsaWQgbnVtYmVyOiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2gpfSAoY2hhckNvZGUgJHtjaH0pYDsKICAgICAgaWYgKGlzV2hpdGVTcGFjZShjaCkgfHwgY2ggPT09IC0xKSB7CiAgICAgICAgaW5mbyhgTGV4ZXIuZ2V0TnVtYmVyIC0gIiR7bXNnfSIuYCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKG1zZyk7CiAgICB9CiAgICBsZXQgYmFzZVZhbHVlID0gY2ggLSAweDMwOwogICAgbGV0IHBvd2VyVmFsdWUgPSAwOwogICAgbGV0IHBvd2VyVmFsdWVTaWduID0gMTsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDApIHsKICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgewogICAgICAgIGNvbnN0IGN1cnJlbnREaWdpdCA9IGNoIC0gMHgzMDsKICAgICAgICBpZiAoZU5vdGF0aW9uKSB7CiAgICAgICAgICBwb3dlclZhbHVlID0gcG93ZXJWYWx1ZSAqIDEwICsgY3VycmVudERpZ2l0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoZGl2aWRlQnkgIT09IDApIHsKICAgICAgICAgICAgZGl2aWRlQnkgKj0gMTA7CiAgICAgICAgICB9CiAgICAgICAgICBiYXNlVmFsdWUgPSBiYXNlVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MmUpIHsKICAgICAgICBpZiAoZGl2aWRlQnkgPT09IDApIHsKICAgICAgICAgIGRpdmlkZUJ5ID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJkKSB7CiAgICAgICAgd2FybigiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NDUgfHwgY2ggPT09IDB4NjUpIHsKICAgICAgICBjaCA9IHRoaXMucGVla0NoYXIoKTsKICAgICAgICBpZiAoY2ggPT09IDB4MmIgfHwgY2ggPT09IDB4MmQpIHsKICAgICAgICAgIHBvd2VyVmFsdWVTaWduID0gY2ggPT09IDB4MmQgPyAtMSA6IDE7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaCA8IDB4MzAgfHwgY2ggPiAweDM5KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZU5vdGF0aW9uID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CiAgICAgIGJhc2VWYWx1ZSAvPSBkaXZpZGVCeTsKICAgIH0KICAgIGlmIChlTm90YXRpb24pIHsKICAgICAgYmFzZVZhbHVlICo9IDEwICoqIChwb3dlclZhbHVlU2lnbiAqIHBvd2VyVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHNpZ24gKiBiYXNlVmFsdWU7CiAgfQogIGdldFN0cmluZygpIHsKICAgIGxldCBudW1QYXJlbiA9IDE7CiAgICBsZXQgZG9uZSA9IGZhbHNlOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIGxldCBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGxldCBjaGFyQnVmZmVyZWQgPSBmYWxzZTsKICAgICAgc3dpdGNoIChjaCB8IDApIHsKICAgICAgICBjYXNlIC0xOgogICAgICAgICAgd2FybigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOwogICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4Mjg6CiAgICAgICAgICArK251bVBhcmVuOwogICAgICAgICAgc3RyQnVmLnB1c2goIigiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyOToKICAgICAgICAgIGlmICgtLW51bVBhcmVuID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJCdWYucHVzaCgiKSIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDVjOgogICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgICAgd2FybigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOwogICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NmU6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxuIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg3MjoKICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXHIiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDc0OgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcdCIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NjI6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxiIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg2NjoKICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXGYiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDVjOgogICAgICAgICAgICBjYXNlIDB4Mjg6CiAgICAgICAgICAgIGNhc2UgMHgyOToKICAgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHgzMDoKICAgICAgICAgICAgY2FzZSAweDMxOgogICAgICAgICAgICBjYXNlIDB4MzI6CiAgICAgICAgICAgIGNhc2UgMHgzMzoKICAgICAgICAgICAgY2FzZSAweDM0OgogICAgICAgICAgICBjYXNlIDB4MzU6CiAgICAgICAgICAgIGNhc2UgMHgzNjoKICAgICAgICAgICAgY2FzZSAweDM3OgogICAgICAgICAgICAgIGxldCB4ID0gY2ggJiAweDBmOwogICAgICAgICAgICAgIGNoID0gdGh
20pcy5uZXh0Q2hhcigpOwogICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IHRydWU7CiAgICAgICAgICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzNykgewogICAgICAgICAgICAgICAgeCA9ICh4IDw8IDMpICsgKGNoICYgMHgwZik7CiAgICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKICAgICAgICAgICAgICAgICAgY2hhckJ1ZmZlcmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHgpKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDBkOgogICAgICAgICAgICAgIGlmICh0aGlzLnBlZWtDaGFyKCkgPT09IDB4MGEpIHsKICAgICAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHgwYToKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGRvbmUpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoIWNoYXJCdWZmZXJlZCkgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOwogIH0KICBnZXROYW1lKCkgewogICAgbGV0IGNoLCBwcmV2aW91c0NoOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgIXNwZWNpYWxDaGFyc1tjaF0pIHsKICAgICAgaWYgKGNoID09PSAweDIzKSB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKHNwZWNpYWxDaGFyc1tjaF0pIHsKICAgICAgICAgIHdhcm4oIkxleGVyX2dldE5hbWU6ICIgKyAiTlVNQkVSIFNJR04gKCMpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIG51bWJlci4iKTsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29uc3QgeCA9IHRvSGV4RGlnaXQoY2gpOwogICAgICAgIGlmICh4ICE9PSAtMSkgewogICAgICAgICAgcHJldmlvdXNDaCA9IGNoOwogICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICBjb25zdCB4MiA9IHRvSGV4RGlnaXQoY2gpOwogICAgICAgICAgaWYgKHgyID09PSAtMSkgewogICAgICAgICAgICB3YXJuKGBMZXhlcl9nZXROYW1lOiBJbGxlZ2FsIGRpZ2l0ICgke1N0cmluZy5mcm9tQ2hhckNvZGUoY2gpfSkgYCArICJpbiBoZXhhZGVjaW1hbCBudW1iZXIuIik7CiAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIiwgU3RyaW5nLmZyb21DaGFyQ29kZShwcmV2aW91c0NoKSk7CiAgICAgICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoeCA8PCA0IHwgeDIpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyQnVmLnB1c2goIiMiLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgfQogICAgfQogICAgaWYgKHN0ckJ1Zi5sZW5ndGggPiAxMjcpIHsKICAgICAgd2FybihgTmFtZSB0b2tlbiBpcyBsb25nZXIgdGhhbiBhbGxvd2VkIGJ5IHRoZSBzcGVjOiAke3N0ckJ1Zi5sZW5ndGh9YCk7CiAgICB9CiAgICByZXR1cm4gTmFtZS5nZXQoc3RyQnVmLmpvaW4oIiIpKTsKICB9CiAgX2hleFN0cmluZ1dhcm4oY2gpIHsKICAgIGNvbnN0IE1BWF9IRVhfU1RSSU5HX05VTV9XQVJOID0gNTsKICAgIGlmICh0aGlzLl9oZXhTdHJpbmdOdW1XYXJuKysgPT09IE1BWF9IRVhfU1RSSU5HX05VTV9XQVJOKSB7CiAgICAgIHdhcm4oImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGFkZGl0aW9uYWwgaW52YWxpZCBjaGFyYWN0ZXJzLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybiA+IE1BWF9IRVhfU1RSSU5HX05VTV9XQVJOKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHdhcm4oYGdldEhleFN0cmluZyAtIGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyOiAke2NofWApOwogIH0KICBnZXRIZXhTdHJpbmcoKSB7CiAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjsKICAgIHN0ckJ1Zi5sZW5ndGggPSAwOwogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIGxldCBmaXJzdERpZ2l0ID0gLTEsCiAgICAgIGRpZ2l0ID0gLTE7CiAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjaCA8IDApIHsKICAgICAgICB3YXJuKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gPT09IDEpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaWdpdCA9IHRvSGV4RGlnaXQoY2gpOwogICAgICAgIGlmIChkaWdpdCA9PT0gLTEpIHsKICAgICAgICAgI
20HRoaXMuX2hleFN0cmluZ1dhcm4oY2gpOwogICAgICAgIH0gZWxzZSBpZiAoZmlyc3REaWdpdCA9PT0gLTEpIHsKICAgICAgICAgIGZpcnN0RGlnaXQgPSBkaWdpdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShmaXJzdERpZ2l0IDw8IDQgfCBkaWdpdCkpOwogICAgICAgICAgZmlyc3REaWdpdCA9IC0xOwogICAgICAgIH0KICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfQogICAgaWYgKGZpcnN0RGlnaXQgIT09IC0xKSB7CiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZmlyc3REaWdpdCA8PCA0KSk7CiAgICB9CiAgICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOwogIH0KICBnZXRPYmooKSB7CiAgICBsZXQgY29tbWVudCA9IGZhbHNlOwogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjaCA8IDApIHsKICAgICAgICByZXR1cm4gRU9GOwogICAgICB9CiAgICAgIGlmIChjb21tZW50KSB7CiAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CiAgICAgICAgY29tbWVudCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoc3BlY2lhbENoYXJzW2NoXSAhPT0gMSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgfQogICAgc3dpdGNoIChjaCB8IDApIHsKICAgICAgY2FzZSAweDMwOgogICAgICBjYXNlIDB4MzE6CiAgICAgIGNhc2UgMHgzMjoKICAgICAgY2FzZSAweDMzOgogICAgICBjYXNlIDB4MzQ6CiAgICAgIGNhc2UgMHgzNToKICAgICAgY2FzZSAweDM2OgogICAgICBjYXNlIDB4Mzc6CiAgICAgIGNhc2UgMHgzODoKICAgICAgY2FzZSAweDM5OgogICAgICBjYXNlIDB4MmI6CiAgICAgIGNhc2UgMHgyZDoKICAgICAgY2FzZSAweDJlOgogICAgICAgIHJldHVybiB0aGlzLmdldE51bWJlcigpOwogICAgICBjYXNlIDB4Mjg6CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCk7CiAgICAgIGNhc2UgMHgyZjoKICAgICAgICByZXR1cm4gdGhpcy5nZXROYW1lKCk7CiAgICAgIGNhc2UgMHg1YjoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIlsiKTsKICAgICAgY2FzZSAweDVkOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gQ21kLmdldCgiXSIpOwogICAgICBjYXNlIDB4M2M6CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDNjKSB7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICByZXR1cm4gQ21kLmdldCgiPDwiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGV4U3RyaW5nKCk7CiAgICAgIGNhc2UgMHgzZToKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICBpZiAoY2ggPT09IDB4M2UpIHsKICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgIHJldHVybiBDbWQuZ2V0KCI+PiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQ21kLmdldCgiPiIpOwogICAgICBjYXNlIDB4N2I6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBDbWQuZ2V0KCJ7Iik7CiAgICAgIGNhc2UgMHg3ZDoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIENtZC5nZXQoIn0iKTsKICAgICAgY2FzZSAweDI5OgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYElsbGVnYWwgY2hhcmFjdGVyOiAke2NofWApOwogICAgfQogICAgbGV0IHN0ciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgaWYgKGNoIDwgMHgyMCB8fCBjaCA+IDB4N2YpIHsKICAgICAgY29uc3QgbmV4dENoID0gdGhpcy5wZWVrQ2hhcigpOwogICAgICBpZiAobmV4dENoID49IDB4MjAgJiYgbmV4dENoIDw9IDB4N2YpIHsKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIENtZC5nZXQoc3RyKTsKICAgICAgfQogICAgfQogICAgY29uc3Qga25vd25Db21tYW5kcyA9IHRoaXMua25vd25Db21tYW5kczsKICAgIGxldCBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHM/LltzdHJdICE9PSB1bmRlZmluZWQ7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgIGNvbnN0IHBvc3NpYmxlQ29tbWFuZCA9IHN0ciArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICBpZiAoa25vd25Db21tYW5kRm91bmQgJiYga25vd25Db21tYW5kc1twb3NzaWJsZUNvbW1hbmRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTI4KSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBDb21tYW5kIHRva2VuIHRvbyBsb25nOiAke3N0ci5sZW5ndGh9YCk7CiAgICAgIH0KICAgICAgc3RyID0gcG9zc2libGVDb21tYW5kOwogICAgICBrbm93bkNvbW1hbmRGb3VuZCA9IGtub3duQ29tbWFuZHM/LltzdHJdICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICBpZiAoc3RyID09PSAidHJ1ZSIpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoc3RyID09PSAiZmFsc2UiKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChzdHIgPT09ICJudWxsIikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChzdHIgPT09ICJCSSIpIHsKICAgICAgdGhpcy5iZWdpbklubGluZUltYWdlUG9zID0gdGhpcy5zdHJlYW0ucG9zOwogICAgfQogICAgcmV0dXJuIENtZC5nZXQoc3RyKTsKICB9CiAgc2tpcFRvTmV4dExpbmUoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKGNoID49IDApIHsKICAgICAgaWYgKGNoID09PSAweDBkKSB7CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDBhKSB7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDBhKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNoID0gdGh
20pcy5uZXh0Q2hhcigpOwogICAgfQogIH0KfQpjbGFzcyBMaW5lYXJpemF0aW9uIHsKICBzdGF0aWMgY3JlYXRlKHN0cmVhbSkgewogICAgZnVuY3Rpb24gZ2V0SW50KGxpbkRpY3QsIG5hbWUsIGFsbG93WmVyb1ZhbHVlID0gZmFsc2UpIHsKICAgICAgY29uc3Qgb2JqID0gbGluRGljdC5nZXQobmFtZSk7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgKGFsbG93WmVyb1ZhbHVlID8gb2JqID49IDAgOiBvYmogPiAwKSkgewogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgIiR7bmFtZX0iIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBgICsgImRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEhpbnRzKGxpbkRpY3QpIHsKICAgICAgY29uc3QgaGludHMgPSBsaW5EaWN0LmdldCgiSCIpOwogICAgICBsZXQgaGludHNMZW5ndGg7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGhpbnRzKSAmJiAoKGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoKSA9PT0gMiB8fCBoaW50c0xlbmd0aCA9PT0gNCkpIHsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGludHNMZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIGNvbnN0IGhpbnQgPSBoaW50c1tpbmRleF07CiAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKGhpbnQpICYmIGhpbnQgPiAwKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhpbnQgKCR7aW5kZXh9KSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBoaW50czsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoIkhpbnQgYXJyYXkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpOwogICAgfQogICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgeHJlZjogbnVsbAogICAgfSk7CiAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3Qgb2JqMiA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBsaW5EaWN0ID0gcGFyc2VyLmdldE9iaigpOwogICAgbGV0IG9iaiwgbGVuZ3RoOwogICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihvYmoxKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKG9iajIpICYmIGlzQ21kKG9iajMsICJvYmoiKSAmJiBsaW5EaWN0IGluc3RhbmNlb2YgRGljdCAmJiB0eXBlb2YgKG9iaiA9IGxpbkRpY3QuZ2V0KCJMaW5lYXJpemVkIikpID09PSAibnVtYmVyIiAmJiBvYmogPiAwKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoKGxlbmd0aCA9IGdldEludChsaW5EaWN0LCAiTCIpKSAhPT0gc3RyZWFtLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSAiTCIgcGFyYW1ldGVyIGluIHRoZSBsaW5lYXJpemF0aW9uIGRpY3Rpb25hcnkgJyArICJkb2VzIG5vdCBlcXVhbCB0aGUgc3RyZWFtIGxlbmd0aC4iKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGxlbmd0aCwKICAgICAgaGludHM6IGdldEhpbnRzKGxpbkRpY3QpLAogICAgICBvYmplY3ROdW1iZXJGaXJzdDogZ2V0SW50KGxpbkRpY3QsICJPIiksCiAgICAgIGVuZEZpcnN0OiBnZXRJbnQobGluRGljdCwgIkUiKSwKICAgICAgbnVtUGFnZXM6IGdldEludChsaW5EaWN0LCAiTiIpLAogICAgICBtYWluWFJlZkVudHJpZXNPZmZzZXQ6IGdldEludChsaW5EaWN0LCAiVCIpLAogICAgICBwYWdlRmlyc3Q6IGxpbkRpY3QuaGFzKCJQIikgPyBnZXRJbnQobGluRGljdCwgIlAiLCB0cnVlKSA6IDAKICAgIH07CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jbWFwLmpzCgoKCgoKCgoKCgpjb25zdCBCVUlMVF9JTl9DTUFQUyA9IFsiQWRvYmUtR0IxLVVDUzIiLCAiQWRvYmUtQ05TMS1VQ1MyIiwgIkFkb2JlLUphcGFuMS1VQ1MyIiwgIkFkb2JlLUtvcmVhMS1VQ1MyIiwgIjc4LUVVQy1IIiwgIjc4LUVVQy1WIiwgIjc4LUgiLCAiNzgtUktTSi1IIiwgIjc4LVJLU0otViIsICI3OC1WIiwgIjc4bXMtUktTSi1IIiwgIjc4bXMtUktTSi1WIiwgIjgzcHYtUktTSi1IIiwgIjkwbXMtUktTSi1IIiwgIjkwbXMtUktTSi1WIiwgIjkwbXNwLVJLU0otSCIsICI5MG1zcC1SS1NKLVYiLCAiOTBwdi1SS1NKLUgiLCAiOTBwdi1SS1NKLVYiLCAiQWRkLUgiLCAiQWRkLVJLU0otSCIsICJBZGQtUktTSi1WIiwgIkFkZC1WIiwgIkFkb2JlLUNOUzEtMCIsICJBZG9iZS1DTlMxLTEiLCAiQWRvYmUtQ05TMS0yIiwgIkFkb2JlLUNOUzEtMyIsICJBZG9iZS1DTlMxLTQiLCAiQWRvYmUtQ05TMS01IiwgIkFkb2JlLUNOUzEtNiIsICJBZG9iZS1HQjEtMCIsICJBZG9iZS1HQjEtMSIsICJBZG9iZS1HQjEtMiIsICJBZG9iZS1HQjEtMyIsICJBZG9iZS1HQjEtNCIsICJBZG9iZS1HQjEtNSIsICJBZG9iZS1KYXBhbjEtMCIsICJBZG9iZS1KYXBhbjEtMSIsICJBZG9iZS1KYXBhbjEtMiIsICJBZG9iZS1KYXBhbjEtMyIsICJBZG9iZS1KYXBhbjEtNCIsICJBZG9iZS1KYXBhbjEtNSIsICJBZG9iZS1KYXBhbjEtNiIsICJBZG9iZS1Lb3JlYTEtMCIsICJBZG9iZS1Lb3JlYTEtMSIsICJBZG9iZS1Lb3JlYTEtMiIsICJCNS1IIiwgIkI1LVYiLCAiQjVwYy1IIiwgIkI1cGMtViIsICJDTlMtRVVDLUgiLCAiQ05TLUVVQy1WIiwgIkNOUzEtSCIsICJDTlMxLVYiLCAiQ05TMi1IIiwgIkNOUzItViIsICJFVEhLLUI1LUgiLCAiRVRISy1CNS1WIiwgIkVUZW4tQjUtSCIsICJFVGVuLUI1LVYiLCAiRVRlbm1zLUI1LUgiLCAiRVRlbm1zLUI1LVYiLCAiRVVDLUgiLCAiRVVDLVYiLCAiRXh0LUgiLCAiRXh0LVJLU0otSCIsICJFeHQtUktTSi1WIiwgIkV4dC1WIiwgIkdCLUVVQy1IIiwgIkdCLUVVQy1WIiwgIkdCLUgiLCAiR0ItViIsICJHQkstRVVDLUgiLCAiR0JLLUVVQy1WIiwgIkdCSzJLLUgiLCAiR0JLMkstViIsICJHQktwLUVVQy1IIiwgIkdCS3AtRVVDLVYiLCAiR0JULUVVQy1IIiwgIkdCVC1FVUMtViIsICJHQlQtSCIsICJHQlQtViIsICJHQlRwYy1FVUMtSCIsICJHQlRwYy1FVUMtViIsICJHQnBjLUVVQy1IIiwgIkdCcGMtRVVDLVYiLCAiSCIsICJIS2RsYS1CNS1IIiwgIkhLZGxhLUI1LVYiLCAiSEtkbGItQjUtSCIsICJIS2RsYi1CNS1WIiwgIkhLZ2Njcy1CNS1IIiwgIkhLZ2Njcy1CNS1WIiwgIkhLbTMxNC1CNS1IIiwgIkhLbTMxNC1CNS1WIiwgIkhLbTQ3MS1CNS1IIiwgIkhLbTQ3MS1CNS1WIiwgIkhLc2NzLUI1LUgiLCAiSEtzY3MtQjUtViIsICJIYW5rYWt1IiwgIkhpcmFnYW5hIiwgIktTQy1FVUMtSCIsICJLU0MtRVVDLVYiLCAiS1NDLUgiLCAiS1NDLUpvaGFiLUgiLCAiS1NDLUpvaGFiLVYiLCAiS1NDLVYiLCAiS1NDbXMtVUhDLUgiLCAiS1NDbXMtVUhDLUhXLUgiLCAiS1NDbXMtVUhDLUhXLVYiLCAiS1NDbXMtVUhDLVYiLCAiS1NDcGMtRVVDLUgiLCAiS1NDcGMtRVVDLVYiLCAiS2F0YWthbmEiLCAiTldQLUgiLCAiTldQLVYiLCAiUktTSi1I
20IiwgIlJLU0otViIsICJSb21hbiIsICJVbmlDTlMtVUNTMi1IIiwgIlVuaUNOUy1VQ1MyLVYiLCAiVW5pQ05TLVVURjE2LUgiLCAiVW5pQ05TLVVURjE2LVYiLCAiVW5pQ05TLVVURjMyLUgiLCAiVW5pQ05TLVVURjMyLVYiLCAiVW5pQ05TLVVURjgtSCIsICJVbmlDTlMtVVRGOC1WIiwgIlVuaUdCLVVDUzItSCIsICJVbmlHQi1VQ1MyLVYiLCAiVW5pR0ItVVRGMTYtSCIsICJVbmlHQi1VVEYxNi1WIiwgIlVuaUdCLVVURjMyLUgiLCAiVW5pR0ItVVRGMzItViIsICJVbmlHQi1VVEY4LUgiLCAiVW5pR0ItVVRGOC1WIiwgIlVuaUpJUy1VQ1MyLUgiLCAiVW5pSklTLVVDUzItSFctSCIsICJVbmlKSVMtVUNTMi1IVy1WIiwgIlVuaUpJUy1VQ1MyLVYiLCAiVW5pSklTLVVURjE2LUgiLCAiVW5pSklTLVVURjE2LVYiLCAiVW5pSklTLVVURjMyLUgiLCAiVW5pSklTLVVURjMyLVYiLCAiVW5pSklTLVVURjgtSCIsICJVbmlKSVMtVVRGOC1WIiwgIlVuaUpJUzIwMDQtVVRGMTYtSCIsICJVbmlKSVMyMDA0LVVURjE2LVYiLCAiVW5pSklTMjAwNC1VVEYzMi1IIiwgIlVuaUpJUzIwMDQtVVRGMzItViIsICJVbmlKSVMyMDA0LVVURjgtSCIsICJVbmlKSVMyMDA0LVVURjgtViIsICJVbmlKSVNQcm8tVUNTMi1IVy1WIiwgIlVuaUpJU1Byby1VQ1MyLVYiLCAiVW5pSklTUHJvLVVURjgtViIsICJVbmlKSVNYMDIxMy1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzLVVURjMyLVYiLCAiVW5pSklTWDAyMTMyMDA0LVVURjMyLUgiLCAiVW5pSklTWDAyMTMyMDA0LVVURjMyLVYiLCAiVW5pS1MtVUNTMi1IIiwgIlVuaUtTLVVDUzItViIsICJVbmlLUy1VVEYxNi1IIiwgIlVuaUtTLVVURjE2LVYiLCAiVW5pS1MtVVRGMzItSCIsICJVbmlLUy1VVEYzMi1WIiwgIlVuaUtTLVVURjgtSCIsICJVbmlLUy1VVEY4LVYiLCAiViIsICJXUC1TeW1ib2wiXTsKY29uc3QgTUFYX01BUF9SQU5HRSA9IDIgKiogMjQgLSAxOwpjbGFzcyBDTWFwIHsKICBjb25zdHJ1Y3RvcihidWlsdEluQ01hcCA9IGZhbHNlKSB7CiAgICB0aGlzLmNvZGVzcGFjZVJhbmdlcyA9IFtbXSwgW10sIFtdLCBbXV07CiAgICB0aGlzLm51bUNvZGVzcGFjZVJhbmdlcyA9IDA7CiAgICB0aGlzLl9tYXAgPSBbXTsKICAgIHRoaXMubmFtZSA9ICIiOwogICAgdGhpcy52ZXJ0aWNhbCA9IGZhbHNlOwogICAgdGhpcy51c2VDTWFwID0gbnVsbDsKICAgIHRoaXMuYnVpbHRJbkNNYXAgPSBidWlsdEluQ01hcDsKICB9CiAgYWRkQ29kZXNwYWNlUmFuZ2UobiwgbG93LCBoaWdoKSB7CiAgICB0aGlzLmNvZGVzcGFjZVJhbmdlc1tuIC0gMV0ucHVzaChsb3csIGhpZ2gpOwogICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMrKzsKICB9CiAgbWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcENpZFJhbmdlIC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOwogICAgfQogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3crKzsKICAgIH0KICB9CiAgbWFwQmZSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgewogICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKICAgIH0KICAgIGNvbnN0IGxhc3RCeXRlID0gZHN0TG93Lmxlbmd0aCAtIDE7CiAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKICAgICAgdGhpcy5fbWFwW2xvdysrXSA9IGRzdExvdzsKICAgICAgY29uc3QgbmV4dENoYXJDb2RlID0gZHN0TG93LmNoYXJDb2RlQXQobGFzdEJ5dGUpICsgMTsKICAgICAgaWYgKG5leHRDaGFyQ29kZSA+IDB4ZmYpIHsKICAgICAgICBkc3RMb3cgPSBkc3RMb3cuc3Vic3RyaW5nKDAsIGxhc3RCeXRlIC0gMSkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlIC0gMSkgKyAxKSArICJceDAwIjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBkc3RMb3cgPSBkc3RMb3cuc3Vic3RyaW5nKDAsIGxhc3RCeXRlKSArIFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXJDb2RlKTsKICAgIH0KICB9CiAgbWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSkgewogICAgaWYgKGhpZ2ggLSBsb3cgPiBNQVhfTUFQX1JBTkdFKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigibWFwQmZSYW5nZVRvQXJyYXkgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7CiAgICB9CiAgICBjb25zdCBpaSA9IGFycmF5Lmxlbmd0aDsKICAgIGxldCBpID0gMDsKICAgIHdoaWxlIChsb3cgPD0gaGlnaCAmJiBpIDwgaWkpIHsKICAgICAgdGhpcy5fbWFwW2xvd10gPSBhcnJheVtpKytdOwogICAgICArK2xvdzsKICAgIH0KICB9CiAgbWFwT25lKHNyYywgZHN0KSB7CiAgICB0aGlzLl9tYXBbc3JjXSA9IGRzdDsKICB9CiAgbG9va3VwKGNvZGUpIHsKICAgIHJldHVybiB0aGlzLl9tYXBbY29kZV07CiAgfQogIGNvbnRhaW5zKGNvZGUpIHsKICAgIHJldHVybiB0aGlzLl9tYXBbY29kZV0gIT09IHVuZGVmaW5lZDsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOwogICAgY29uc3QgbGVuZ3RoID0gbWFwLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPD0gMHgxMDAwMCkgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKG1hcFtpXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBjYWxsYmFjayhpLCBtYXBbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBpIGluIG1hcCkgewogICAgICAgIGNhbGxiYWNrKGksIG1hcFtpXSk7CiAgICAgIH0KICAgIH0KICB9CiAgY2hhckNvZGVPZih2YWx1ZSkgewogICAgY29uc3QgbWFwID0gdGhpcy5fbWFwOwogICAgaWYgKG1hcC5sZW5ndGggPD0gMHgxMDAwMCkgewogICAgICByZXR1cm4gbWFwLmluZGV4T2YodmFsdWUpOwogICAgfQogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKICAgICAgaWYgKG1hcFtjaGFyQ29kZV0gPT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGNoYXJDb2RlIHwgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBnZXRNYXAoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwOwogIH0KICByZWFkQ2hhckNvZGUoc3RyLCBvZmZzZXQsIG91dCkgewogICAgbGV0IGMgPSAwOwogICAgY29uc3QgY29kZXNwYWNlUmFuZ2VzID0gdGhpcy5jb2Rlc3BhY2VSYW5nZXM7CiAgICBmb3IgKGxldCBuID0gMCwgbm4gPSBjb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBuIDwgbm47IG4rKykgewogICAgICBjID0gKGMgPDwgOCB8IHN0ci5jaGFyQ29kZUF0KG9mZnNldCArIG4pKSA+Pj4gMDsKICAgICAgY29uc3QgY29kZXNwYWNlUmFuZ2UgPSBjb2Rlc3BhY2VSYW5nZXNbbl07CiAgICAgIGZvciAobGV0IGsgPSAwLCBrayA9IGNvZGVzcGFj
20ZVJhbmdlLmxlbmd0aDsgayA8IGtrOykgewogICAgICAgIGNvbnN0IGxvdyA9IGNvZGVzcGFjZVJhbmdlW2srK107CiAgICAgICAgY29uc3QgaGlnaCA9IGNvZGVzcGFjZVJhbmdlW2srK107CiAgICAgICAgaWYgKGMgPj0gbG93ICYmIGMgPD0gaGlnaCkgewogICAgICAgICAgb3V0LmNoYXJjb2RlID0gYzsKICAgICAgICAgIG91dC5sZW5ndGggPSBuICsgMTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG91dC5jaGFyY29kZSA9IDA7CiAgICBvdXQubGVuZ3RoID0gMTsKICB9CiAgZ2V0Q2hhckNvZGVMZW5ndGgoY2hhckNvZGUpIHsKICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlcyA9IHRoaXMuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHsKICAgICAgY29uc3QgY29kZXNwYWNlUmFuZ2UgPSBjb2Rlc3BhY2VSYW5nZXNbbl07CiAgICAgIGZvciAobGV0IGsgPSAwLCBrayA9IGNvZGVzcGFjZVJhbmdlLmxlbmd0aDsgayA8IGtrOykgewogICAgICAgIGNvbnN0IGxvdyA9IGNvZGVzcGFjZVJhbmdlW2srK107CiAgICAgICAgY29uc3QgaGlnaCA9IGNvZGVzcGFjZVJhbmdlW2srK107CiAgICAgICAgaWYgKGNoYXJDb2RlID49IGxvdyAmJiBjaGFyQ29kZSA8PSBoaWdoKSB7CiAgICAgICAgICByZXR1cm4gbiArIDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLl9tYXAubGVuZ3RoOwogIH0KICBnZXQgaXNJZGVudGl0eUNNYXAoKSB7CiAgICBpZiAoISh0aGlzLm5hbWUgPT09ICJJZGVudGl0eS1IIiB8fCB0aGlzLm5hbWUgPT09ICJJZGVudGl0eS1WIikpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXMuX21hcC5sZW5ndGggIT09IDB4MTAwMDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAweDEwMDAwOyBpKyspIHsKICAgICAgaWYgKHRoaXMuX21hcFtpXSAhPT0gaSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9CmNsYXNzIElkZW50aXR5Q01hcCBleHRlbmRzIENNYXAgewogIGNvbnN0cnVjdG9yKHZlcnRpY2FsLCBuKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy52ZXJ0aWNhbCA9IHZlcnRpY2FsOwogICAgdGhpcy5hZGRDb2Rlc3BhY2VSYW5nZShuLCAwLCAweGZmZmYpOwogIH0KICBtYXBDaWRSYW5nZShsb3csIGhpZ2gsIGRzdExvdykgewogICAgdW5yZWFjaGFibGUoInNob3VsZCBub3QgY2FsbCBtYXBDaWRSYW5nZSIpOwogIH0KICBtYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CiAgICB1bnJlYWNoYWJsZSgic2hvdWxkIG5vdCBjYWxsIG1hcEJmUmFuZ2UiKTsKICB9CiAgbWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSkgewogICAgdW5yZWFjaGFibGUoInNob3VsZCBub3QgY2FsbCBtYXBCZlJhbmdlVG9BcnJheSIpOwogIH0KICBtYXBPbmUoc3JjLCBkc3QpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkT25lIik7CiAgfQogIGxvb2t1cChjb2RlKSB7CiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZiA/IGNvZGUgOiB1bmRlZmluZWQ7CiAgfQogIGNvbnRhaW5zKGNvZGUpIHsKICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpICYmIGNvZGUgPD0gMHhmZmZmOwogIH0KICBmb3JFYWNoKGNhbGxiYWNrKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAweGZmZmY7IGkrKykgewogICAgICBjYWxsYmFjayhpLCBpKTsKICAgIH0KICB9CiAgY2hhckNvZGVPZih2YWx1ZSkgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlIDw9IDB4ZmZmZiA/IHZhbHVlIDogLTE7CiAgfQogIGdldE1hcCgpIHsKICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheSgweDEwMDAwKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7CiAgICAgIG1hcFtpXSA9IGk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIDB4MTAwMDA7CiAgfQogIGdldCBpc0lkZW50aXR5Q01hcCgpIHsKICAgIHVucmVhY2hhYmxlKCJzaG91bGQgbm90IGFjY2VzcyAuaXNJZGVudGl0eUNNYXAiKTsKICB9Cn0KZnVuY3Rpb24gc3RyVG9JbnQoc3RyKSB7CiAgbGV0IGEgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICBhID0gYSA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSk7CiAgfQogIHJldHVybiBhID4+PiAwOwp9CmZ1bmN0aW9uIGV4cGVjdFN0cmluZyhvYmopIHsKICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIHN0cmluZy4iKTsKICB9Cn0KZnVuY3Rpb24gZXhwZWN0SW50KG9iaikgewogIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIik7CiAgfQp9CmZ1bmN0aW9uIHBhcnNlQmZDaGFyKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRiZmNoYXIiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IHNyYyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3QgZHN0ID0gb2JqOwogICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUJmUmFuZ2UoY01hcCwgbGV4ZXIpIHsKICB3aGlsZSAodHJ1ZSkgewogICAgbGV0IG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgaWYgKG9iaiA9PT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlzQ21kKG9iaiwgImVuZGJmcmFuZ2UiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGxvdyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3QgaGlnaCA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgfHwgdHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgZHN0TG93ID0gTnVtYmVyLmlzSW50ZWdlcihvYmopID8gU3RyaW5nLmZyb21DaGFyQ29kZShvYmopIDogb2JqOwogICAgICBjTWFwLm1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpOwogICAgfSBlbHNlIGlmIChpc0NtZChvYmosICJbIikpIHsKICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgI
20HdoaWxlICghaXNDbWQob2JqLCAiXSIpICYmIG9iaiAhPT0gRU9GKSB7CiAgICAgICAgYXJyYXkucHVzaChvYmopOwogICAgICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgICB9CiAgICAgIGNNYXAubWFwQmZSYW5nZVRvQXJyYXkobG93LCBoaWdoLCBhcnJheSk7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIGJmIHJhbmdlLiIpOwp9CmZ1bmN0aW9uIHBhcnNlQ2lkQ2hhcihjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBFT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaXNDbWQob2JqLCAiZW5kY2lkY2hhciIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3Qgc3JjID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0SW50KG9iaik7CiAgICBjb25zdCBkc3QgPSBvYmo7CiAgICBjTWFwLm1hcE9uZShzcmMsIGRzdCk7CiAgfQp9CmZ1bmN0aW9uIHBhcnNlQ2lkUmFuZ2UoY01hcCwgbGV4ZXIpIHsKICB3aGlsZSAodHJ1ZSkgewogICAgbGV0IG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgaWYgKG9iaiA9PT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlzQ21kKG9iaiwgImVuZGNpZHJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RJbnQob2JqKTsKICAgIGNvbnN0IGRzdExvdyA9IG9iajsKICAgIGNNYXAubWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNvZGVzcGFj
20ZVJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IEVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmIChpc0NtZChvYmosICJlbmRjb2Rlc3BhY2VyYW5nZSIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JqICE9PSAic3RyaW5nIikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IGxvdyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmICh0eXBlb2Ygb2JqICE9PSAic3RyaW5nIikgewogICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShvYmoubGVuZ3RoLCBsb3csIGhpZ2gpOwogIH0KICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgY29kZXNwYWNlIHJhbmdlLiIpOwp9CmZ1bmN0aW9uIHBhcnNlV01vZGUoY01hcCwgbGV4ZXIpIHsKICBjb25zdCBvYmogPSBsZXhlci5nZXRPYmooKTsKICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICBjTWFwLnZlcnRpY2FsID0gISFvYmo7CiAgfQp9CmZ1bmN0aW9uIHBhcnNlQ01hcE5hbWUoY01hcCwgbGV4ZXIpIHsKICBjb25zdCBvYmogPSBsZXhlci5nZXRPYmooKTsKICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgY01hcC5uYW1lID0gb2JqLm5hbWU7CiAgfQp9CmFzeW5jIGZ1bmN0aW9uIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkgewogIGxldCBwcmV2aW91cywgZW1iZWRkZWRVc2VDTWFwOwogIG9iakxvb3A6IHdoaWxlICh0cnVlKSB7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgICAgaWYgKG9iaiA9PT0gRU9GKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGlmIChvYmoubmFtZSA9PT0gIldNb2RlIikgewogICAgICAgICAgcGFyc2VXTW9kZShjTWFwLCBsZXhlcik7CiAgICAgICAgfSBlbHNlIGlmIChvYmoubmFtZSA9PT0gIkNNYXBOYW1lIikgewogICAgICAgICAgcGFyc2VDTWFwTmFtZShjTWFwLCBsZXhlcik7CiAgICAgICAgfQogICAgICAgIHByZXZpb3VzID0gb2JqOwogICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENtZCkgewogICAgICAgIHN3aXRjaCAob2JqLmNtZCkgewogICAgICAgICAgY2FzZSAiZW5kY21hcCI6CiAgICAgICAgICAgIGJyZWFrIG9iakxvb3A7CiAgICAgICAgICBjYXNlICJ1c2VjbWFwIjoKICAgICAgICAgICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgIGVtYmVkZGVkVXNlQ01hcCA9IHByZXZpb3VzLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmNvZGVzcGFjZXJhbmdlIjoKICAgICAgICAgICAgcGFyc2VDb2Rlc3BhY2VSYW5nZShjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5iZmNoYXIiOgogICAgICAgICAgICBwYXJzZUJmQ2hhcihjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5jaWRjaGFyIjoKICAgICAgICAgICAgcGFyc2VDaWRDaGFyKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmJmcmFuZ2UiOgogICAgICAgICAgICBwYXJzZUJmUmFuZ2UoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luY2lkcmFuZ2UiOgogICAgICAgICAgICBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIkludmFsaWQgY01hcCBkYXRhOiAiICsgZXgpOwogICAgICBjb250aW51ZTsKICAgIH0KICB9CiAgaWYgKCF1c2VDTWFwICYmIGVtYmVkZGVkVXNlQ01hcCkgewogICAgdXNlQ01hcCA9IGVtYmVkZGVkVXNlQ01hcDsKICB9CiAgaWYgKHVzZUNNYXApIHsKICAgIHJldHVybiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApOwogIH0KICByZXR1cm4gY01hcDsKfQphc3luYyBmdW5jdGlvbiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApIHsKICBjTWFwLnVzZUNNYXAgPSBhd2FpdCBjcmVhdGVCdWlsdEluQ01hcCh1c2VDTWFwLCBmZXRjaEJ1aWx0SW5DTWFwKTsKICBpZiAoY01hcC5udW1Db2Rlc3BhY2VSYW5nZXMgPT09IDApIHsKICAgIGNvbnN0IHVzZUNvZGVzcGFj
20ZVJhbmdlcyA9IGNNYXAudXNlQ01hcC5jb2Rlc3BhY2VSYW5nZXM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZUNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICBjTWFwLmNvZGVzcGFjZVJhbmdlc1tpXSA9IHVzZUNvZGVzcGFjZVJhbmdlc1tpXS5zbGljZSgpOwogICAgfQogICAgY01hcC5udW1Db2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzOwogIH0KICBjTWFwLnVzZUNNYXAuZm9yRWFjaChmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgaWYgKCFjTWFwLmNvbnRhaW5zKGtleSkpIHsKICAgICAgY01hcC5tYXBPbmUoa2V5LCB2YWx1ZSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIGNNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gY3JlYXRlQnVpbHRJbkNNYXAobmFtZSwgZmV0Y2hCdWlsdEluQ01hcCkgewogIGlmIChuYW1lID09PSAiSWRlbnRpdHktSCIpIHsKICAgIHJldHVybiBuZXcgSWRlbnRpdHlDTWFwKGZhbHNlLCAyKTsKICB9IGVsc2UgaWYgKG5hbWUgPT09ICJJZGVudGl0eS1WIikgewogICAgcmV0dXJuIG5ldyBJZGVudGl0eUNNYXAodHJ1ZSwgMik7CiAgfQogIGlmICghQlVJTFRfSU5fQ01BUFMuaW5jbHVkZXMobmFtZSkpIHsKICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBDTWFwIG5hbWU6ICIgKyBuYW1lKTsKICB9CiAgaWYgKCFmZXRjaEJ1aWx0SW5DTWFwKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkJ1aWx0LWluIENNYXAgcGFyYW1ldGVycyBhcmUgbm90IHByb3ZpZGVkLiIpOwogIH0KICBjb25zdCB7CiAgICBjTWFwRGF0YSwKICAgIGlzQ29tcHJlc3NlZAogIH0gPSBhd2FpdCBmZXRjaEJ1aWx0SW5DTWFwKG5hbWUpOwogIGNvbnN0IGNNYXAgPSBuZXcgQ01hcCh0cnVlKTsKICBpZiAoaXNDb21wcmVzc2VkKSB7CiAgICByZXR1cm4gbmV3IEJpbmFyeUNNYXBSZWFkZXIoKS5wcm9jZXNzKGNNYXBEYXRhLCBjTWFwLCB1c2VDTWFwID0+IGV4dGVuZENNYXAoY01hcCwgZmV0Y2hCdWlsdEluQ01hcCwgdXNlQ01hcCkpOwogIH0KICBjb25zdCBsZXhlciA9IG5ldyBMZXhlcihuZXcgU3RyZWFtKGNNYXBEYXRhKSk7CiAgcmV0dXJuIHBhcnNlQ01hcChjTWFwLCBsZXhlciwgZmV0Y2hCdWlsdEluQ01hcCwgbnVsbCk7Cn0KY2xhc3MgQ01hcEZhY3RvcnkgewogIHN0YXRpYyBhc3luYyBjcmVhdGUoewogICAgZW5jb2RpbmcsCiAgICBmZXRjaEJ1aWx0SW5DTWFwLAogICAgdXNlQ01hcAogIH0pIHsKICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKGVuY29kaW5nLm5hbWUsIGZldGNoQnVpbHRJbkNNYXApOwogICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgY29uc3QgcGFyc2VkQ01hcCA9IGF3YWl0IHBhcnNlQ01hcChuZXcgQ01hcCgpLCBuZXcgTGV4ZXIoZW5jb2RpbmcpLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKICAgICAgaWYgKHBhcnNlZENNYXAuaXNJZGVudGl0eUNNYXApIHsKICAgICAgICByZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAocGFyc2VkQ01hcC5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VkQ01hcDsKICAgIH0KICAgIHRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIik7CiAgfQp9CgovLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IudG8tYXJyYXkuanMKdmFyIGVzbmV4dF9pdGVyYXRvcl90b19hcnJheSA9IF9fd2VicGFja19yZXF1aXJlX18oMTc5NSk7CjsvLyAuL3NyYy9jb3JlL2NoYXJzZXRzLmpzCmNvbnN0IElTT0Fkb2JlQ2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVyaWdodCIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAicXVvdGVsZWZ0IiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicGFyYWdyYXBoIiwgImJ1bGxldCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicXVvdGVkYmxyaWdodCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJwZXJ0aG91c2FuZCIsICJxdWVzdGlvbmRvd24iLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICJBRSIsICJvcmRmZW1pbmluZSIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICJhZSIsICJkb3RsZXNzaSIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAib25lc3VwZXJpb3IiLCAibG9naWNhbG5vdCIsICJtdSIsICJ0cmFkZW1hcmsiLCAiRXRoIiwgIm9uZWhhbGYiLCAicGx1c21pbnVzIiwgIlRob3JuIiwgIm9uZXF1YXJ0ZXIiLCAiZGl2aWRlIiwgImJyb2tlbmJhciIsICJkZWdyZWUiLCAidGhvcm4iLCAi
20dGhyZWVxdWFydGVycyIsICJ0d29zdXBlcmlvciIsICJyZWdpc3RlcmVkIiwgIm1pbnVzIiwgImV0aCIsICJtdWx0aXBseSIsICJ0aHJlZXN1cGVyaW9yIiwgImNvcHlyaWdodCIsICJBYWN1dGUiLCAiQWNpcmN1bWZsZXgiLCAiQWRpZXJlc2lzIiwgIkFncmF2ZSIsICJBcmluZyIsICJBdGlsZGUiLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIkVjaXJjdW1mbGV4IiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiTnRpbGRlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPZGllcmVzaXMiLCAiT2dyYXZlIiwgIk90aWxkZSIsICJTY2Fyb24iLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJVZ3JhdmUiLCAiWWFjdXRlIiwgIllkaWVyZXNpcyIsICJaY2Fyb24iLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhZ3JhdmUiLCAiYXJpbmciLCAiYXRpbGRlIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiZWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiaWdyYXZlIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm9ncmF2ZSIsICJvdGlsZGUiLCAic2Nhcm9uIiwgInVhY3V0ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAidWdyYXZlIiwgInlhY3V0ZSIsICJ5ZGllcmVzaXMiLCAiemNhcm9uIl07CmNvbnN0IEV4cGVydENoYXJzZXQgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT0VzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiXTsKY29uc3QgRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgImlzdXBlcmlvciIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJ0c3VwZXJpb3IiLCAiZmYiLCAiZmkiLCAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiaHlwaGVuc3VwZXJpb3IiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgImNlbnRvbGRzdHlsZSIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIl07Cgo7Ly8gLi9zcmMvY29yZS9lbmNvZGluZ3MuanMKY29uc3QgRXhwZXJ0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwgIkFjdXRlc21hbGwiLCAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAiZnJhY3Rpb24iLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJjb21tYXN1cGVyaW9yIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAicGVyaW9kc3VwZXJpb3IiLCAicXVlc3Rpb25zbWFsbCIsICIiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICIiLCAiIiwgIiIsICJpc3VwZXJpb3IiLCAiIiwgIiIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAiIiwgIiIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICIiLCAiZmYiLCAiZmkiLCAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICIiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiIiwgIiIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICIiLCAiRG90YWNjZW50c21hbGwiLCAiIiwgIiIsICJNYWNyb25zbWFsbCIsICIiLCAiIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAiIiwgIiIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgIiIsICIiLCAiIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICIiLCAiIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJj
20dW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCJdOwpjb25zdCBNYWNFeHBlcnRFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW1zbWFsbCIsICJIdW5nYXJ1bWxhdXRzbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgIiIsICJ0aHJlZXF1YXJ0ZXJzZW1kYXNoIiwgIiIsICJxdWVzdGlvbnNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICJFdGhzbWFsbCIsICIiLCAiIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgIiIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbmluZmVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICIiLCAiIiwgImFzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIkFhY3V0ZXNtYWxsIiwgIkFncmF2ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQXJpbmdzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk90aWxkZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiIiwgImVpZ2h0c3VwZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgIlNjYXJvbnNtYWxsIiwgIiIsICJjZW50aW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAiIiwgIkRpZXJlc2lzc21hbGwiLCAiIiwgIkNhcm9uc21hbGwiLCAib3N1cGVyaW9yIiwgImZpdmVpbmZlcmlvciIsICIiLCAiY29tbWFpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJZYWN1dGVzbWFsbCIsICIiLCAiZG9sbGFyaW5mZXJpb3IiLCAiIiwgIiIsICJUaG9ybnNtYWxsIiwgIiIsICJuaW5laW5mZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIlpjYXJvbnNtYWxsIiwgIkFFc21hbGwiLCAiT3NsYXNoc21hbGwiLCAicXVlc3Rpb25kb3duc21hbGwiLCAib25laW5mZXJpb3IiLCAiTHNsYXNoc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQ2VkaWxsYXNtYWxsIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiT0VzbWFsbCIsICJmaWd1cmVkYXNoIiwgImh5cGhlbnN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duc21hbGwiLCAiIiwgIllkaWVyZXNpc3NtYWxsIiwgIiIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb3N1cGVyaW9yIiwgIiIsICJlc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInRzdXBlcmlvciIsICIiLCAiIiwgImlzdXBlcmlvciIsICJzc3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgIiIsICIiLCAiIiwgIiIsICIiLCAibHN1cGVyaW9yIiwgIk9nb25la3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiTWFjcm9uc21hbGwiLCAiYnN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJtc3VwZXJpb3IiLCAiY29tbWFzdXBlcmlvciIsICJwZXJpb2RzdXBlcmlvciIsICJEb3RhY2NlbnRzbWFsbCIsICJSaW5nc21hbGwiLCAiIiwgIiIsICIiLCAiIl07CmNvbnN0IE1hY1JvbWFuRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3Rlc2luZ2xlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImV
20xdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwgImFncmF2ZSIsICJhY2lyY3VtZmxleCIsICJhZGllcmVzaXMiLCAiYXRpbGRlIiwgImFyaW5nIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlZ3JhdmUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLCAiYnVsbGV0IiwgInBhcmFncmFwaCIsICJnZXJtYW5kYmxzIiwgInJlZ2lzdGVyZWQiLCAiY29weXJpZ2h0IiwgInRyYWRlbWFyayIsICJhY3V0ZSIsICJkaWVyZXNpcyIsICJub3RlcXVhbCIsICJBRSIsICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsICJwcm9kdWN0IiwgInBpIiwgImludGVncmFsIiwgIm9yZGZlbWluaW5lIiwgIm9yZG1hc2N1bGluZSIsICJPbWVnYSIsICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsICJyYWRpY2FsIiwgImZsb3JpbiIsICJhcHByb3hlcXVhbCIsICJEZWx0YSIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInNwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLCAiT3RpbGRlIiwgIk9FIiwgIm9lIiwgImVuZGFzaCIsICJlbWRhc2giLCAicXVvdGVkYmxsZWZ0IiwgInF1b3RlZGJscmlnaHQiLCAicXVvdGVsZWZ0IiwgInF1b3RlcmlnaHQiLCAiZGl2aWRlIiwgImxvemVuZ2UiLCAieWRpZXJlc2lzIiwgIllkaWVyZXNpcyIsICJmcmFjdGlvbiIsICJjdXJyZW5jeSIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicGVydGhvdXNhbmQiLCAiQWNpcmN1bWZsZXgiLCAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgImFwcGxlIiwgIk9ncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWdyYXZlIiwgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiJdOwpjb25zdCBTdGFuZGFyZEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiIiwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgIiIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vd
20HJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgIiIsICJxdWVzdGlvbmRvd24iLCAiIiwgImdyYXZlIiwgImFjdXRlIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJkaWVyZXNpcyIsICIiLCAicmluZyIsICJjZWRpbGxhIiwgIiIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiQUUiLCAiIiwgIm9yZGZlbWluaW5lIiwgIiIsICIiLCAiIiwgIiIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICIiLCAiIiwgIiIsICIiLCAiIiwgImFlIiwgIiIsICIiLCAiIiwgImRvdGxlc3NpIiwgIiIsICIiLCAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgIiIsICIiLCAiIiwgIiJdOwpjb25zdCBXaW5BbnNpRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3Rlc2luZ2xlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiYnVsbGV0IiwgIkV1cm8iLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgImZsb3JpbiIsICJxdW90ZWRibGJhc2UiLCAiZWxsaXBzaXMiLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJjaXJjdW1mbGV4IiwgInBlcnRob3VzYW5kIiwgIlNjYXJvbiIsICJndWlsc2luZ2xsZWZ0IiwgIk9FIiwgImJ1bGxldCIsICJaY2Fyb24iLCAiYnVsbGV0IiwgImJ1bGxldCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJidWxsZXQiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJ0aWxkZSIsICJ0cmFkZW1hcmsiLCAic2Nhcm9uIiwgImd1aWxzaW5nbHJpZ2h0IiwgIm9lIiwgImJ1bGxldCIsICJ6Y2Fyb24iLCAiWWRpZXJlc2lzIiwgInNwYWNlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJjdXJyZW5jeSIsICJ5ZW4iLCAiYnJva2VuYmFyIiwgInNlY3Rpb24iLCAiZGllcmVzaXMiLCAiY29weXJpZ2h0IiwgIm9yZGZlbWluaW5lIiwgImd1aWxsZW1vdGxlZnQiLCAibG9naWNhbG5vdCIsICJoeXBoZW4iLCAicmVnaXN0ZXJlZCIsICJtYWNyb24iLCAiZGVncmVlIiwgInBsdXNtaW51cyIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImFjdXRlIiwgIm11IiwgInBhcmFncmFwaCIsICJwZXJpb2RjZW50ZXJlZCIsICJjZWRpbGxhIiwgIm9uZXN1cGVyaW9yIiwgIm9yZG1hc2N1bGluZSIsICJndWlsbGVtb3RyaWdodCIsICJvbmVxdWFydGVyIiwgIm9uZWhhbGYiLCAidGhyZWVxdWFydGVycyIsICJxdWVzdGlvbmRvd24iLCAiQWdyYXZlIiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkFFIiwgIkNjZWRpbGxhIiwgIkVncmF2ZSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIklncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIkV0aCIsICJOdGlsZGUiLCAiT2dyYXZlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPdGlsZGUiLCAiT2RpZXJlc2lzIiwgIm11bHRpcGx5IiwgIk9zbGFzaCIsICJVZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJZYWN1dGUiLCAiVGhvcm4iLCAiZ2VybWFuZGJscyIsICJhZ3JhdmUiLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImF0aWxkZSIsICJhZGllcmVzaXMiLCAiYXJpbmciLCAiYWUiLCAiY2NlZGlsbGEiLCAiZWdyYXZlIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiZXRoIiwgIm50aWxkZSIsICJvZ3JhdmUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm90aWxkZSIsICJvZGllcmVzaXMiLCAiZGl2aWRlIiwgIm9zbGFzaCIsICJ1Z3JhdmUiLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ5YWN1dGUiLCAidGhvcm4iLCAieWRpZXJlc2lzIl07CmNvbnN0IFN5bWJvbFNldEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJ1bml2ZXJzYWwiLCAibnVtYmVyc2lnbiIsICJleGlzdGVudGlhbCIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJzdWNodGhhdCIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3Rlcmlza21hdGgiLCAicGx1cyIsICJjb21tYSIsICJtaW51cyIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImNvbmdydWVudCIsICJBbHBoYSIsICJCZXRhIiwgIkNoaSIsICJEZWx0YSIsICJFcHNpbG9uIiwgIlBoaSIsICJHYW1tYSIsICJFdGEiLCAiSW90YSIsICJ0aGV0YTEiLCAiS2FwcGEiLCAiTGFtYmRhIiwgIk11IiwgIk51IiwgIk9taWNyb24iLCAiUGkiLCAiVGhldGEiLCAiUmhvIiwgIlNpZ21hIiwgIlRhdSIsICJVcHNpbG9uIiwgInNpZ21hMSIsICJPbWVnYSIsICJYaSIsICJQc2kiLCAiWmV0YSIsICJicmFja2V0bGVmdCIsICJ0aGVyZWZvcmUiLCAiYnJhY2tldHJpZ2h0IiwgInBlcnBlbmRpY3VsYXIiLCAidW5kZXJzY29yZSIsICJyYWRpY2FsZXgiLCAiYWxwaGEiLCAiYmV0YSIsICJjaGkiLCAiZGVsdGEiLCAiZXBzaWxvbiIsICJwaGkiLCAiZ2FtbWEiLCAiZXRhIiwgImlvdGEiLCAicGhpMSIsICJrYXBwYSIsICJsYW1iZGEiLCAibXUiLCAibnUiLCAib21pY3JvbiIsICJwaSIsICJ0aGV0YSIsICJyaG8iLCAic2lnbWEiLCAidGF1IiwgInVwc2lsb24iLCAib21lZ2ExIiwgIm9tZWdhIiwgInhpIiwgInBzaSIsICJ6ZXRhIiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJzaW1pbGFyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkV1cm8iLCAiVXBzaWxvbjEiLCAibWludXRlIiwgImxlc3NlcXVhbCIsICJmcmFjdGlvbiIsICJpbmZpbml0eSIsICJmbG9yaW4iLCAiY2x1YiIsICJkaWFtb25kIiwgImhlYXJ0IiwgInNwYWRlIiwgImFycm93Ym90aCIsICJhcnJvd2xlZnQiLCAiYXJyb3d1cCIsICJhcnJvd3JpZ2h0IiwgImFycm93ZG93biIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInNlY29uZCIsICJncmVhdGVyZXF1YWwiLCAibXVsdGlwbHkiLCAicHJvcG9ydGlvbmFsIiwgInBhcnRpYWxkaWZmIiwgImJ1bGxldCIsICJkaXZpZGUiLCAibm90ZXF1YWwiLCAiZXF1aXZhbGVuY2UiLCAiYXBwcm94ZXF1YWwiLCAiZWxsaXBzaXMiLCAiYXJyb3d2ZXJ0ZXgiLCAiYXJyb3dob3JpemV4IiwgImNhcnJpYWdlcmV0dXJuIiwgImFsZXBoIiwgIklmcmFrdHVyIiwgIlJmcmFrdHVyIiwgIndlaWVyc3RyYXNzIiwgImNpcmNsZW11bHRpcGx5IiwgImNpcmNsZXBsdXMiLCAiZW1wdHlzZXQiLCAiaW50ZXJzZWN0aW9uIiwgInVuaW9uIiwgInByb3BlcnN1cGVyc2V0IiwgInJlZmxleHN1cGVyc2V0IiwgIm5vdHN1YnNldCIsICJwcm9wZXJzdWJzZXQiLCAicmVmbGV4c3Vic2V0IiwgImVsZW1lbnQiLCAibm90ZWxlbWVudCIsICJhbmdsZSIsICJncmFkaWVudCIsICJyZWdpc3RlcnNlcmlmIiwgImNvcHlyaWdodHNlcmlmIiwgInRyYWRlbWFya3NlcmlmIiwgInByb2R1Y3QiLCAicmFkaWNhbCIsICJkb3RtYXRoIiwgImxvZ2ljYWxub3QiLCAibG9naWNhbGFuZCIsICJsb2dpY2Fsb3IiLCAiYXJyb3dkYmxib3RoIiwgImFycm93ZGJsbGVmdCIsICJhcnJvd2RibHVwIiwgImFycm93ZGJscmlnaHQiLCAiYXJyb3dkYmxkb3duIiwgImxvemVuZ2UiLCAiYW5nbGVsZWZ0IiwgInJlZ2lzdGVyc2FucyIsICJjb3B5cmlnaHRzYW5zIiwgInRyYWRlbWFya3NhbnMiLCAic3VtbWF0aW9uIiwgInBhcmVubGVmdHRwIiwgInBhcmVubGVmdGV4IiwgInBhcmVubGVmdGJ0IiwgImJyYWNrZXRsZWZ0dHAiLCAiYnJhY2tldGxlZnRleCIsICJicmFja2V0bGVmdGJ0IiwgImJyYWNlbGVmdHRwIiwgImJyYWNlbGVmdG1pZCIsICJicmFjZWxlZnRidCIsICJicmFjZWV4IiwgIiIsICJhbmdsZXJpZ2h0IiwgImludGVncmFsIiwgImludGVncmFsdHAiLCAiaW50ZWdyYWxleCIsICJpbnRlZ3JhbGJ0IiwgInBhcmVucmlnaHR0cCIsICJwYXJlbnJpZ2h0ZXgiLCAicGFyZW5yaWdodGJ0IiwgImJyYWNrZXRyaWdodHRwIiwgImJyYWNrZXRyaWdodGV4IiwgImJyYWNrZXRyaWdodGJ0IiwgImJyYWNlcmlnaHR0cCIsICJicmFjZXJpZ2h0bWlkIiwgImJyYWNlcmlnaHRidCIsICIiXTsKY29uc3QgWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiYTEiLCAiYTIiLCAiYTIwMiIsICJhMyIsICJhNCIsICJhNSIsICJhMTE5IiwgImExMTgiLCAiYTExNyIsICJhMTEiLCAiYTEyIiwgImExMyIsICJhMTQiLCAiYTE1IiwgImExNiIsICJhMTA1IiwgImExNyIsICJhMTgiLCAiYTE5IiwgImEyMCIsICJhMjEiLCAiYTIyIiwgImEyMyIsICJhMjQiLCAiYTI1IiwgImEyNiIsICJhMjciLCAiYTI4IiwgImE2IiwgImE3IiwgImE4IiwgImE5IiwgImExMCIsICJhMjkiLCAiYTMwIiwgImEzMSIsICJhMzIiLCAiYTMzIiwgImEzNCIsICJhMzUiLCAiYTM2IiwgImEzNyIsICJhMzgiLCAiYTM5IiwgImE0MCIsICJhNDEiLCAiYTQyIiwgImE0MyIsICJhNDQiLCAiYTQ1IiwgImE0NiIsICJhNDciLCAiYTQ4IiwgImE0OSIsICJhNTAiLCAiYTUxIiwgImE1MiIsICJhNTMiLCAiYTU0IiwgImE1NSIsICJhNTYiLCAiYTU3IiwgImE1OCIsICJhNTkiLCAiYTYwIiwgImE2MSIsICJhNjIiLCAiYTYzIiwgImE2NCIsICJhNjUiLCAiYTY2IiwgImE2NyIsICJhNjgiLCAiYTY5IiwgImE3MCIsICJhNzEiLCAiYTcyIiwgImE3MyIsICJhNzQiLCAiYTIwMyIsICJhNzUiLCAiYTIwNCIsICJhNzYiLCAiYTc3IiwgImE3OCIsICJhNzkiLCAiYTgxIiwgImE4MiIsICJhODMiLCAiYTg0IiwgImE5NyIsICJhOTgiLCAiYTk5IiwgImExMDAiLCAiIiwgImE4OSIsICJhOTAiLCAiYTkzIiwgImE5NCIsICJhOTEiLCAiYTkyIiwgImEyMDUiLCAiYTg1IiwgImEyMDYiLCAiYTg2IiwgImE4NyIsICJhODgiLCAiYTk1IiwgImE5NiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYTEwMSIsICJhMTAyIiwgImExMDMiLCAiYTEwNCIsICJhMTA2IiwgImExMDciLCAiYTEwOCIsICJhMTEyIiwgImExMTEiLCAiYTExMCIsICJhMTA5IiwgImExMjAiLCAiYTEyMSIsICJhMTIyIiwgImExMjMiLCAiYTEyNCIsICJhMTI1IiwgImExMjYiLCAiYTEyNyIsICJhMTI4IiwgImExMjkiLCAiYTEzMCIsICJhMTMxIiwgImExMzIiLCAiYTEzMyIsICJhMTM0IiwgImExMzUiLCAiYTEzNiIsICJhMTM3IiwgImExMzgiLCAiYTEzOSIsICJhMTQwIiwgImExNDEiLCAiYTE0MiIsICJhMTQzIiwgImExNDQiLCAiYTE0NSIsICJhMTQ2IiwgImExNDciLCAiYTE0OCIsICJhMTQ5IiwgImExNTAiLCAiYTE1MSIsICJhMTUyIiwgImExNTMiLCAiYTE1NCIsICJhMTU1IiwgImExNTYiLCAiYTE1NyIsICJhMTU4IiwgImExNTkiLCAiYTE2MCIsICJhMTYxIiwgImExNjMiLCAiYTE2NCIsICJhMTk2IiwgImExNjUiLCAiYTE5MiIsICJhMTY2IiwgImExNjciLCAiYTE2OCIsICJhMTY5IiwgImExNzAiLCAiYTE3MSIsICJhMTcyIiwgImExNzMiLCAiYTE2MiIsICJhMTc0IiwgImExNzUiLCAiYTE3NiIsICJhMTc3IiwgImExNzgiLCAiYTE3OSIsICJhMTkzIiwgImExODAiLCAiYTE5OSIsICJhMTgxIiwgImEyMDAiLCAiYTE4MiIsICIiLCAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsICJhMTg2IiwgImExOTUiLCAiYTE4NyIsICJhMTg4IiwgImExODkiLCAiYTE5MCIsICJhMTkxIiwgIiJdOwpmdW5jdGlvbiBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpIHsKICBzd2l0Y2ggKGVuY29kaW5nTmFtZSkgewogICAgY2FzZSAiV2luQW5zaUVuY29
20kaW5nIjoKICAgICAgcmV0dXJuIFdpbkFuc2lFbmNvZGluZzsKICAgIGNhc2UgIlN0YW5kYXJkRW5jb2RpbmciOgogICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZzsKICAgIGNhc2UgIk1hY1JvbWFuRW5jb2RpbmciOgogICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZzsKICAgIGNhc2UgIlN5bWJvbFNldEVuY29kaW5nIjoKICAgICAgcmV0dXJuIFN5bWJvbFNldEVuY29kaW5nOwogICAgY2FzZSAiWmFwZkRpbmdiYXRzRW5jb2RpbmciOgogICAgICByZXR1cm4gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7CiAgICBjYXNlICJFeHBlcnRFbmNvZGluZyI6CiAgICAgIHJldHVybiBFeHBlcnRFbmNvZGluZzsKICAgIGNhc2UgIk1hY0V4cGVydEVuY29kaW5nIjoKICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIG51bGw7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9jZmZfcGFyc2VyLmpzCgoKCgoKCgoKCgpjb25zdCBNQVhfU1VCUl9ORVNUSU5HID0gMTA7CmNvbnN0IENGRlN0YW5kYXJkU3RyaW5ncyA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVyaWdodCIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwgIkoiLCAiSyIsICJMIiwgIk0iLCAiTiIsICJPIiwgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLCAicXVvdGVsZWZ0IiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwgImN1cnJlbmN5IiwgInF1b3Rlc2luZ2xlIiwgInF1b3RlZGJsbGVmdCIsICJndWlsbGVtb3RsZWZ0IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAicGFyYWdyYXBoIiwgImJ1bGxldCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicXVvdGVkYmxyaWdodCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJwZXJ0aG91c2FuZCIsICJxdWVzdGlvbmRvd24iLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIiwgImVtZGFzaCIsICJBRSIsICJvcmRmZW1pbmluZSIsICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsICJhZSIsICJkb3RsZXNzaSIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAib25lc3VwZXJpb3IiLCAibG9naWNhbG5vdCIsICJtdSIsICJ0cmFkZW1hcmsiLCAiRXRoIiwgIm9uZWhhbGYiLCAicGx1c21pbnVzIiwgIlRob3JuIiwgIm9uZXF1YXJ0ZXIiLCAiZGl2aWRlIiwgImJyb2tlbmJhciIsICJkZWdyZWUiLCAidGhvcm4iLCAidGhyZWVxdWFydGVycyIsICJ0d29zdXBlcmlvciIsICJyZWdpc3RlcmVkIiwgIm1pbnVzIiwgImV0aCIsICJtdWx0aXBseSIsICJ0aHJlZXN1cGVyaW9yIiwgImNvcHlyaWdodCIsICJBYWN1dGUiLCAiQWNpcmN1bWZsZXgiLCAiQWRpZXJlc2lzIiwgIkFncmF2ZSIsICJBcmluZyIsICJBdGlsZGUiLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIkVjaXJjdW1mbGV4IiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiTnRpbGRlIiwgIk9hY3V0ZSIsICJPY2lyY3VtZmxleCIsICJPZGllcmVzaXMiLCAiT2dyYXZlIiwgIk90aWxkZSIsICJTY2Fyb24iLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJVZ3JhdmUiLCAiWWFjdXRlIiwgIllkaWVyZXNpcyIsICJaY2Fyb24iLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhZ3JhdmUiLCAiYXJpbmciLCAiYXRpbGRlIiwgImNjZWRpbGxhIiwgImVhY3V0ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiZWdyYXZlIiwgImlhY3V0ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAiaWdyYXZlIiwgIm50aWxkZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm9ncmF2ZSIsICJvdGlsZGUiLCAic2Nhcm9uIiwgInVhY3V0ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLCAidWdyYXZlIiwgInlhY3V0ZSIsICJ5ZGllcmVzaXMiLCAiemNhcm9uIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwgIkFjdXRlc21hbGwiLCAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb21tYXN1cGVyaW9yIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAicGVyaW9kc3VwZXJpb3IiLCAicXVlc3Rpb25zbWFsbCIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgImlzdXBlcmlvciIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJ0c3VwZXJpb3IiLCAiZmYiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiQ2lyY3VtZmxleHNtYWxsIiwgImh5cGhlbnN1cGVyaW9yIiwgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwgIkhzbWFsbCIsICJJc21hbGwiLCAiSnNtYWxsIiwgIktzbWFsbCIsICJMc21hbGwiLCAiTXNtYWxsIiwgIk5zbWFsbCIsICJPc21hbGwiLCAiUHNtYWxsIiwgIlFzbWFsbCIsICJSc21hbGwiLCAiU3NtYWxsIiwgIlRzbWFsbCIsICJVc21hbGwiLCAiVnNtYWxsIiwgIldzbWFsbCIsICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsICJleGNsYW1kb3duc21hbGwiLCAiY2VudG9sZHN0eWxlIiwgIkxzbGFzaHNtYWxsIiwgIlNjYXJvbnNtYWxsIiwgIlpjYXJvbnNtYWxsIiwgIkRpZXJlc2lzc21hbGwiLCAiQnJldmVzbWFsbCIsICJDYXJvbnNtYWxsIiwgIkRvdGFjY2VudHNtYWxsIiwgIk1hY3JvbnNtYWxsIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAiT2dvbmVrc21hbGwiLCAiUmluZ3NtYWxsIiwgIkNlZGlsbGFzbWFsbCIsICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVlaWdodGgiLCAi
20dGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsICJ0d290aGlyZHMiLCAiemVyb3N1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCIsICIwMDEuMDAwIiwgIjAwMS4wMDEiLCAiMDAxLjAwMiIsICIwMDEuMDAzIiwgIkJsYWNrIiwgIkJvbGQiLCAiQm9vayIsICJMaWdodCIsICJNZWRpdW0iLCAiUmVndWxhciIsICJSb21hbiIsICJTZW1pYm9sZCJdOwpjb25zdCBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgPSAzOTE7CmNvbnN0IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YSA9IFtudWxsLCB7CiAgaWQ6ICJoc3RlbSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCBudWxsLCB7CiAgaWQ6ICJ2c3RlbSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCB7CiAgaWQ6ICJ2bW92ZXRvIiwKICBtaW46IDEsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJybGluZXRvIiwKICBtaW46IDIsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJobGluZXRvIiwKICBtaW46IDEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJ2bGluZXRvIiwKICBtaW46IDEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJycmN1cnZldG8iLAogIG1pbjogNiwKICByZXNldFN0YWNrOiB0cnVlCn0sIG51bGwsIHsKICBpZDogImNhbGxzdWJyIiwKICBtaW46IDEsCiAgdW5kZWZTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJyZXR1cm4iLAogIG1pbjogMCwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIG51bGwsIG51bGwsIHsKICBpZDogImVuZGNoYXIiLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIG51bGwsIG51bGwsIG51bGwsIHsKICBpZDogImhzdGVtaG0iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlLAogIHN0ZW06IHRydWUKfSwgewogIGlkOiAiaGludG1hc2siLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogImNudHJtYXNrIiwKICBtaW46IDAsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJybW92ZXRvIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJobW92ZXRvIiwKICBtaW46IDEsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJ2c3RlbWhtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIHsKICBpZDogInJjdXJ2ZWxpbmUiLAogIG1pbjogOCwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJsaW5lY3VydmUiLAogIG1pbjogOCwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZ2Y3VydmV0byIsCiAgbWluOiA0LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiaGhjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCBudWxsLCB7CiAgaWQ6ICJjYWxsZ3N1YnIiLAogIG1pbjogMSwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZoY3VydmV0byIsCiAgbWluOiA0LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiaHZjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9XTsKY29uc3QgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhMTIgPSBbbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiYW5kIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEKfSwgewogIGlkOiAib3IiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCB7CiAgaWQ6ICJub3QiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIG51bGwsIG51bGwsIG51bGwsIHsKICBpZDogImFicyIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDAKfSwgewogIGlkOiAiYWRkIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICsgc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIHsKICBpZDogInN1YiIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAtIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCB7CiAgaWQ6ICJkaXYiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMSwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gLyBzdGFja1tpbmRleCAtIDFdOwogIH0KfSwgbnVsbCwgewogIGlkOiAibmVnIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMCwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAxXSA9IC1zdGFja1tpbmRleCAtIDFdOwogIH0KfSwgewogIGlkOiAiZXEiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCBudWxsLCBudWxsLCB7CiAgaWQ6ICJkcm9wIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogLTEKfSwgbnVsbCwgewogIGlkOiAicHV0IiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTIKfSwgewogIGlkOiAiZ2V0IiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJpZmVsc2UiLAogIG1pbjogNCwKICBzdGFja0RlbHRhOiAtMwp9LCB7CiAgaWQ6ICJyYW5kb20iLAogIG1pbjogMCwKICBzdGFja0RlbHRhOiAxCn0sIHsKICBpZDogIm11bCIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAqIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCBudWxsLCB7CiAgaWQ6ICJzcXJ0IiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJkdXAiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAxCn0sIHsKICBpZDogImV4Y2giLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImluZGV4IiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJyb2xsIiwKICBtaW46IDMsCiAgc3RhY2tEZWx0YTogLTIKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiaGZsZXgiLAogIG1pbjogNywKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImZsZXgiLAogIG1pbjogMTMsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJoZmxleDEiLAogIG1pbjogOSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImZsZXgxIiwKICBtaW46IDExLAogIHJlc2V0U3RhY2s6IHRydWUKfV07CmNsYXNzIENGRlBhcnNlciB7CiAgY29uc3RydWN0b3IoZmlsZSwgcHJvcGVydGllcywgc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgdGhpcy5ieXRlcyA9IGZpbGUuZ2V0Qnl0ZXMoKTsKICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CiAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CiAgfQogIHBhcnNlKCkgewogICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKICAgIGNvbnN0IGNmZiA9IG5ldyBDRkYoKTsKICAgIHRoaXMuY2ZmID0gY2ZmOwogICAgY29uc3QgaGVhZGVyID0gdGhpcy5wYXJzZUhlYWRlcigpOwogICAgY29uc3QgbmFtZUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KGhlYWRlci5lbmRQb3MpOwogICAgY29uc3QgdG9wRGljdEluZGV4ID0gdGhpcy5wYXJzZUluZGV4KG5hbWVJbmRleC5lbmRQb3MpOwogICAgY29uc3Qgc3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdEluZGV4LmVuZFBvcyk7CiAgICBjb25zdCBnbG9iYWxTdWJySW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoc3RyaW5nSW5kZXguZW5kUG9zKTsKICAgIGNvbnN0IHRvcERpY3RQYXJzZWQgPSB0aGlzLnBhcnNlRGljdCh0b3BEaWN0SW5kZXgub2JqLmdldCgwKSk7CiAgICBjb25zdCB0b3BEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlRvcERpY3QsIHRvcERpY3RQYXJzZWQsIGNmZi5zdHJpbmdzKTsKICAgIGNmZi5oZWFkZXIgPSBoZWFkZXIub2JqOwogICAgY2ZmLm5hbWVzID0gdGhpcy5wYXJzZU5hbWVJbmRleChuYW1lSW5kZXgub2JqKTsKICAgIGNmZi5zdHJpbmdzID0gdGhpcy5wYXJzZVN0cmluZ0luZGV4KHN0cmluZ0luZGV4Lm9iaik7CiAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7CiAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gZ2xvYmFsU3VickluZGV4Lm9iajsKICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChjZmYudG9wRGljdCk7CiAgICBjZmYuaXNDSURGb250ID0gdG9wRGljdC5oYXNOYW1lKCJST1MiKTsKICAgIGNvbnN0IGNoYXJTdHJpbmdPZmZzZXQgPSB0b3BEaWN0LmdldEJ5TmFtZSgiQ2hhclN0cmluZ3MiKTsKICAgIGNvbnN0IGNoYXJTdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleChjaGFyU3RyaW5nT2Zmc2V0KS5vYmo7CiAgICBjb25zdCBmb250TWF0cml4ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgIGlmIChmb250TWF0cml4KSB7CiAgICAgI
20HByb3BlcnRpZXMuZm9udE1hdHJpeCA9IGZvbnRNYXRyaXg7CiAgICB9CiAgICBjb25zdCBmb250QkJveCA9IHRvcERpY3QuZ2V0QnlOYW1lKCJGb250QkJveCIpOwogICAgaWYgKGZvbnRCQm94KSB7CiAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTsKICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlOwogICAgfQogICAgbGV0IGNoYXJzZXQsIGVuY29kaW5nOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgY29uc3QgZmRBcnJheUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHRvcERpY3QuZ2V0QnlOYW1lKCJGREFycmF5IikpLm9iajsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZmRBcnJheUluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgewogICAgICAgIGNvbnN0IGRpY3RSYXcgPSBmZEFycmF5SW5kZXguZ2V0KGkpOwogICAgICAgIGNvbnN0IGZvbnREaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlRvcERpY3QsIHRoaXMucGFyc2VEaWN0KGRpY3RSYXcpLCBjZmYuc3RyaW5ncyk7CiAgICAgICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGZvbnREaWN0KTsKICAgICAgICBjZmYuZmRBcnJheS5wdXNoKGZvbnREaWN0KTsKICAgICAgfQogICAgICBlbmNvZGluZyA9IG51bGw7CiAgICAgIGNoYXJzZXQgPSB0aGlzLnBhcnNlQ2hhcnNldHModG9wRGljdC5nZXRCeU5hbWUoImNoYXJzZXQiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50LCBjZmYuc3RyaW5ncywgdHJ1ZSk7CiAgICAgIGNmZi5mZFNlbGVjdCA9IHRoaXMucGFyc2VGRFNlbGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiRkRTZWxlY3QiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGNoYXJzZXQgPSB0aGlzLnBhcnNlQ2hhcnNldHModG9wRGljdC5nZXRCeU5hbWUoImNoYXJzZXQiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50LCBjZmYuc3RyaW5ncywgZmFsc2UpOwogICAgICBlbmNvZGluZyA9IHRoaXMucGFyc2VFbmNvZGluZyh0b3BEaWN0LmdldEJ5TmFtZSgiRW5jb2RpbmciKSwgcHJvcGVydGllcywgY2ZmLnN0cmluZ3MsIGNoYXJzZXQuY2hhcnNldCk7CiAgICB9CiAgICBjZmYuY2hhcnNldCA9IGNoYXJzZXQ7CiAgICBjZmYuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgIGNvbnN0IGNoYXJTdHJpbmdzQW5kU2VhY3MgPSB0aGlzLnBhcnNlQ2hhclN0cmluZ3MoewogICAgICBjaGFyU3RyaW5nczogY2hhclN0cmluZ0luZGV4LAogICAgICBsb2NhbFN1YnJJbmRleDogdG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4LAogICAgICBnbG9iYWxTdWJySW5kZXg6IGdsb2JhbFN1YnJJbmRleC5vYmosCiAgICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCiAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LAogICAgICBwcml2YXRlRGljdDogdG9wRGljdC5wcml2YXRlRGljdAogICAgfSk7CiAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLmNoYXJTdHJpbmdzOwogICAgY2ZmLnNlYWNzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5zZWFjczsKICAgIGNmZi53aWR0aHMgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLndpZHRoczsKICAgIHJldHVybiBjZmY7CiAgfQogIHBhcnNlSGVhZGVyKCkgewogICAgbGV0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IGJ5dGVzTGVuZ3RoID0gYnl0ZXMubGVuZ3RoOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICB3aGlsZSAob2Zmc2V0IDwgYnl0ZXNMZW5ndGggJiYgYnl0ZXNbb2Zmc2V0XSAhPT0gMSkgewogICAgICArK29mZnNldDsKICAgIH0KICAgIGlmIChvZmZzZXQgPj0gYnl0ZXNMZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIENGRiBoZWFkZXIiKTsKICAgIH0KICAgIGlmIChvZmZzZXQgIT09IDApIHsKICAgICAgaW5mbygiY2ZmIGRhdGEgaXMgc2hpZnRlZCIpOwogICAgICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KG9mZnNldCk7CiAgICAgIHRoaXMuYnl0ZXMgPSBieXRlczsKICAgIH0KICAgIGNvbnN0IG1ham9yID0gYnl0ZXNbMF07CiAgICBjb25zdCBtaW5vciA9IGJ5dGVzWzFdOwogICAgY29uc3QgaGRyU2l6ZSA9IGJ5dGVzWzJdOwogICAgY29uc3Qgb2ZmU2l6ZSA9IGJ5dGVzWzNdOwogICAgY29uc3QgaGVhZGVyID0gbmV3IENGRkhlYWRlcihtYWpvciwgbWlub3IsIGhkclNpemUsIG9mZlNpemUpOwogICAgcmV0dXJuIHsKICAgICAgb2JqOiBoZWFkZXIsCiAgICAgIGVuZFBvczogaGRyU2l6ZQogICAgfTsKICB9CiAgcGFyc2VEaWN0KGRpY3QpIHsKICAgIGxldCBwb3MgPSAwOwogICAgZnVuY3Rpb24gcGFyc2VPcGVyYW5kKCkgewogICAgICBsZXQgdmFsdWUgPSBkaWN0W3BvcysrXTsKICAgICAgaWYgKHZhbHVlID09PSAzMCkgewogICAgICAgIHJldHVybiBwYXJzZUZsb2F0T3BlcmFuZCgpOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOCkgewogICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107CiAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgMjQgfCBkaWN0W3BvcysrXSA8PCAxNikgPj4gMTY7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyOSkgewogICAgICAgIHZhbHVlID0gZGljdFtwb3MrK107CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA4IHwgZGljdFtwb3MrK107CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDMyICYmIHZhbHVlIDw9IDI0NikgewogICAgICAgIHJldHVybiB2YWx1ZSAtIDEzOTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNDcgJiYgdmFsdWUgPD0gMjUwKSB7CiAgICAgICAgcmV0dXJuICh2YWx1ZSAtIDI0NykgKiAyNTYgKyBkaWN0W3BvcysrXSArIDEwODsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAyNTEgJiYgdmFsdWUgPD0gMjU0KSB7CiAgICAgICAgcmV0dXJuIC0oKHZhbHVlIC0gMjUxKSAqIDI1NikgLSBkaWN0W3BvcysrXSAtIDEwODsKICAgICAgfQogICAgICB3YXJuKCdDRkZQYXJzZXJfcGFyc2VEaWN0OiAiJyArIHZhbHVlICsgJyIgaXMgYSByZXNlcnZlZCBjb21tYW5kLicpOwogICAgICByZXR1cm4gTmFOOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VGbG9hdE9wZXJhbmQoKSB7CiAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgY29uc3QgZW9mID0gMTU7CiAgICAgIGNvbnN0IGxvb2t1cCA9IFsiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIuIiwgIkUiLCAiRS0iLCBudWxsLCAiLSJdOwogICAgICBjb25zdCBsZW5ndGggPSBkaWN0Lmxlbmd0aDsKICAgICAgd2hpbGUgKHBvcyA8IGxlbmd0aCkgewogICAgICAgIGNvbnN0IGIgPSBkaWN0W3BvcysrXTsKICAgICAgICBjb25zdCBiMSA9IGIgPj4gNDsKICAgICAgICBjb25zdCBiMiA9IGIgJiAxNTsKICAgICAgICBpZiAoYjEgPT09IGVvZikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgI
20HN0ciArPSBsb29rdXBbYjFdOwogICAgICAgIGlmIChiMiA9PT0gZW9mKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgc3RyICs9IGxvb2t1cFtiMl07CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyKTsKICAgIH0KICAgIGxldCBvcGVyYW5kcyA9IFtdOwogICAgY29uc3QgZW50cmllcyA9IFtdOwogICAgcG9zID0gMDsKICAgIGNvbnN0IGVuZCA9IGRpY3QubGVuZ3RoOwogICAgd2hpbGUgKHBvcyA8IGVuZCkgewogICAgICBsZXQgYiA9IGRpY3RbcG9zXTsKICAgICAgaWYgKGIgPD0gMjEpIHsKICAgICAgICBpZiAoYiA9PT0gMTIpIHsKICAgICAgICAgIGIgPSBiIDw8IDggfCBkaWN0WysrcG9zXTsKICAgICAgICB9CiAgICAgICAgZW50cmllcy5wdXNoKFtiLCBvcGVyYW5kc10pOwogICAgICAgIG9wZXJhbmRzID0gW107CiAgICAgICAgKytwb3M7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3BlcmFuZHMucHVzaChwYXJzZU9wZXJhbmQoKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBlbnRyaWVzOwogIH0KICBwYXJzZUluZGV4KHBvcykgewogICAgY29uc3QgY2ZmSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IGNvdW50ID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICBjb25zdCBvZmZzZXRzID0gW107CiAgICBsZXQgZW5kID0gcG9zOwogICAgbGV0IGksIGlpOwogICAgaWYgKGNvdW50ICE9PSAwKSB7CiAgICAgIGNvbnN0IG9mZnNldFNpemUgPSBieXRlc1twb3MrK107CiAgICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9zICsgKGNvdW50ICsgMSkgKiBvZmZzZXRTaXplIC0gMTsKICAgICAgZm9yIChpID0gMCwgaWkgPSBjb3VudCArIDE7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvZmZzZXRTaXplOyArK2opIHsKICAgICAgICAgIG9mZnNldCA8PD0gODsKICAgICAgICAgIG9mZnNldCArPSBieXRlc1twb3MrK107CiAgICAgICAgfQogICAgICAgIG9mZnNldHMucHVzaChzdGFydFBvcyArIG9mZnNldCk7CiAgICAgIH0KICAgICAgZW5kID0gb2Zmc2V0c1tjb3VudF07CiAgICB9CiAgICBmb3IgKGkgPSAwLCBpaSA9IG9mZnNldHMubGVuZ3RoIC0gMTsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3Qgb2Zmc2V0U3RhcnQgPSBvZmZzZXRzW2ldOwogICAgICBjb25zdCBvZmZzZXRFbmQgPSBvZmZzZXRzW2kgKyAxXTsKICAgICAgY2ZmSW5kZXguYWRkKGJ5dGVzLnN1YmFycmF5KG9mZnNldFN0YXJ0LCBvZmZzZXRFbmQpKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG9iajogY2ZmSW5kZXgsCiAgICAgIGVuZFBvczogZW5kCiAgICB9OwogIH0KICBwYXJzZU5hbWVJbmRleChpbmRleCkgewogICAgY29uc3QgbmFtZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBuYW1lID0gaW5kZXguZ2V0KGkpOwogICAgICBuYW1lcy5wdXNoKGJ5dGVzVG9TdHJpbmcobmFtZSkpOwogICAgfQogICAgcmV0dXJuIG5hbWVzOwogIH0KICBwYXJzZVN0cmluZ0luZGV4KGluZGV4KSB7CiAgICBjb25zdCBzdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBkYXRhID0gaW5kZXguZ2V0KGkpOwogICAgICBzdHJpbmdzLmFkZChieXRlc1RvU3RyaW5nKGRhdGEpKTsKICAgIH0KICAgIHJldHVybiBzdHJpbmdzOwogIH0KICBjcmVhdGVEaWN0KFR5cGUsIGRpY3QsIHN0cmluZ3MpIHsKICAgIGNvbnN0IGNmZkRpY3QgPSBuZXcgVHlwZShzdHJpbmdzKTsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGRpY3QpIHsKICAgICAgY2ZmRGljdC5zZXRCeUtleShrZXksIHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBjZmZEaWN0OwogIH0KICBwYXJzZUNoYXJTdHJpbmc
20oc3RhdGUsIGRhdGEsIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpIHsKICAgIGlmICghZGF0YSB8fCBzdGF0ZS5jYWxsRGVwdGggPiBNQVhfU1VCUl9ORVNUSU5HKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGxldCBzdGFja1NpemUgPSBzdGF0ZS5zdGFja1NpemU7CiAgICBjb25zdCBzdGFjayA9IHN0YXRlLnN0YWNrOwogICAgbGV0IGxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7KSB7CiAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtqKytdOwogICAgICBsZXQgdmFsaWRhdGlvbkNvbW1hbmQgPSBudWxsOwogICAgICBpZiAodmFsdWUgPT09IDEyKSB7CiAgICAgICAgY29uc3QgcSA9IGRhdGFbaisrXTsKICAgICAgICBpZiAocSA9PT0gMCkgewogICAgICAgICAgZGF0YVtqIC0gMl0gPSAxMzk7CiAgICAgICAgICBkYXRhW2ogLSAxXSA9IDIyOwogICAgICAgICAgc3RhY2tTaXplID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGExMltxXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CiAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IChkYXRhW2pdIDw8IDI0IHwgZGF0YVtqICsgMV0gPDwgMTYpID4+IDE2OwogICAgICAgIGogKz0gMjsKICAgICAgICBzdGFja1NpemUrKzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTQpIHsKICAgICAgICBpZiAoc3RhY2tTaXplID49IDQpIHsKICAgICAgICAgIHN0YWNrU2l6ZSAtPSA0OwogICAgICAgICAgaWYgKHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICBzdGF0ZS5zZWFjID0gc3RhY2suc2xpY2Uoc3RhY2tTaXplLCBzdGFja1NpemUgKyA0KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgc3RhY2tbc3RhY2tTaXplXSA9IHZhbHVlIC0gMTM5OwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgPCAyNTEgPyAodmFsdWUgLSAyNDcgPDwgOCkgKyBkYXRhW2pdICsgMTA4IDogLSh2YWx1ZSAtIDI1MSA8PCA4KSAtIGRhdGFbal0gLSAxMDg7CiAgICAgICAgaisrOwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAyNTUpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNiB8IGRhdGFbaiArIDJdIDw8IDggfCBkYXRhW2ogKyAzXSkgLyA2NTUzNjsKICAgICAgICBqICs9IDQ7CiAgICAgICAgc3RhY2tTaXplKys7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDE5IHx8IHZhbHVlID09PSAyMCkgewogICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOwogICAgICAgIGlmIChzdGF0ZS5oaW50cyA9PT0gMCkgewogICAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgICBqIC09IDE7CiAgICAgICAgICBsZW5ndGggLT0gMTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBqICs9IHN0YXRlLmhpbnRzICsgNyA+PiAzOwogICAgICAgIHN0YWNrU2l6ZSAlPSAyOwogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTAgfHwgdmFsdWUgPT09IDI5KSB7CiAgICAgICAgY29uc3Qgc3VicnNJbmRleCA9IHZhbHVlID09PSAxMCA/IGxvY2FsU3VickluZGV4IDogZ2xvYmFsU3VickluZGV4OwogICAgICAgIGlmICghc3VicnNJbmRleCkgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICAgICAgd2FybigiTWlzc2luZyBzdWJyc0luZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsZXQgYmlhcyA9IDMyNzY4OwogICAgICAgIGlmIChzdWJyc0luZGV4LmNvdW50IDwgMTI0MCkgewogICAgICAgICAgYmlhcyA9IDEwNzsKICAgICAgICB9IGVsc2UgaWYgKHN1YnJzSW5kZXguY291bnQgPCAzMzkwMCkgewogICAgICAgICAgYmlhcyA9IDExMzE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnJOdW1iZXIgPSBzdGFja1stLXN0YWNrU2l6ZV0gKyBiaWFzOwogICAgICAgIGlmIChzdWJyTnVtYmVyIDwgMCB8fCBzdWJyTnVtYmVyID49IHN1YnJzSW5kZXguY291bnQgfHwgaXNOYU4oc3Vick51bWJlcikpIHsKICAgICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgICAgIHdhcm4oIk91dCBvZiBib3VuZHMgc3VickluZGV4IGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CiAgICAgICAgc3RhdGUuY2FsbERlcHRoKys7CiAgICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgc3VicnNJbmRleC5nZXQoc3Vick51bWJlciksIGxvY2FsU3VickluZGV4LCBnbG9iYWxTdWJySW5kZXgpOwogICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuY2FsbERlcHRoLS07CiAgICAgICAgc3RhY2tTaXplID0gc3RhdGUuc3RhY2tTaXplOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMSkgewogICAgICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMCAmJiBqID09PSBkYXRhLmxlbmd0aCkgewogICAgICAgIGRhdGFbaiAtIDFdID0gMTQ7CiAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbMTRdOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSA5KSB7CiAgICAgICAgZGF0YS5jb3B5V2l0aGluKGogLSAxLCBqLCAtMSk7CiAgICAgICAgaiAtPSAxOwogICAgICAgIGxlbmd0aCAtPSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgI
20HZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfQogICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQpIHsKICAgICAgICBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgewogICAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CiAgICAgICAgICBpZiAodmFsdWUgPT09IDMgfHwgdmFsdWUgPT09IDIzKSB7CiAgICAgICAgICAgIHN0YXRlLmhhc1ZTdGVtcyA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhhc1ZTdGVtcyAmJiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDE4KSkgewogICAgICAgICAgICB3YXJuKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTsKICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJtaW4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CiAgICAgICAgICBpZiAoIXN0YXRlLnVuZGVmU3RhY2sgJiYgc3RhY2tTaXplIDwgdmFsaWRhdGlvbkNvbW1hbmQubWluKSB7CiAgICAgICAgICAgIHdhcm4oIk5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgIiArIHZhbGlkYXRpb25Db21tYW5kLmlkICsgIjsgYWN0dWFsOiAiICsgc3RhY2tTaXplICsgIiwgZXhwZWN0ZWQ6ICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5taW4pOwogICAgICAgICAgICBpZiAoc3RhY2tTaXplID09PSAwKSB7CiAgICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSAxNDsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgewogICAgICAgICAgc3RhdGUuZmlyc3RTdGFja0NsZWFyaW5nID0gZmFsc2U7CiAgICAgICAgICBzdGFja1NpemUgLT0gdmFsaWRhdGlvbkNvbW1hbmQubWluOwogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+PSAyICYmIHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHsKICAgICAgICAgICAgc3RhY2tTaXplICU9IDI7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrU2l6ZSA+IDEpIHsKICAgICAgICAgICAgd2FybigiRm91bmQgdG9vIG1hbnkgcGFyYW1ldGVycyBmb3Igc3RhY2stY2xlYXJpbmcgY29tbWFuZCIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YWNrU2l6ZSA+IDApIHsKICAgICAgICAgICAgc3RhdGUud2lkdGggPSBzdGFja1tzdGFja1NpemUgLSAxXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJzdGFja0RlbHRhIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgaWYgKCJzdGFja0ZuIiBpbiB2YWxpZGF0aW9uQ29tbWFuZCkgewogICAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0ZuKHN0YWNrLCBzdGFja1NpemUpOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2tTaXplICs9IHZhbGlkYXRpb25Db21tYW5kLnN0YWNrRGVsdGE7CiAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQucmVzZXRTdGFjaykgewogICAgICAgICAgc3RhY2tTaXplID0gMDsKICAgICAgICAgIHN0YXRlLnVuZGVmU3RhY2sgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnVuZGVmU3RhY2spIHsKICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CiAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGxlbmd0aCA8IGRhdGEubGVuZ3RoKSB7CiAgICAgIGRhdGEuZmlsbCgxNCwgbGVuZ3RoKTsKICAgIH0KICAgIHN0YXRlLnN0YWNrU2l6ZSA9IHN0YWNrU2l6ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBwYXJzZUNoYXJTdHJpbmdzKHsKICAgIGNoYXJTdHJpbmdzLAogICAgbG9jYWxTdWJySW5kZXgsCiAgICBnbG9iYWxTdWJySW5kZXgsCiAgICBmZFNlbGVjdCwKICAgIGZkQXJyYXksCiAgICBwcml2YXRlRGljdAogIH0pIHsKICAgIGNvbnN0IHNlYWNzID0gW107CiAgICBjb25zdCB3aWR0aHMgPSBbXTsKICAgIGNvbnN0IGNvdW50ID0gY2hhclN0cmluZ3MuY291bnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgY29uc3Qgc3RhdGUgPSB7CiAgICAgICAgY2FsbERlcHRoOiAwLAogICAgICAgIHN0YWNrU2l6ZTogMCwKICAgICAgICBzdGFjazogW10sCiAgICAgICAgdW5kZWZTdGFjazogdHJ1ZSwKICAgICAgICBoaW50czogMCwKICAgICAgICBmaXJzdFN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgICAgICAgc2VhYzogbnVsbCwKICAgICAgICB3aWR0aDogbnVsbCwKICAgICAgICBoYXNWU3RlbXM6IGZhbHNlCiAgICAgIH07CiAgICAgIGxldCB2YWxpZCA9IHRydWU7CiAgICAgIGxldCBsb2NhbFN1YnJUb1VzZSA9IG51bGw7CiAgICAgIGxldCBwcml2YXRlRGljdFRvVXNlID0gcHJpdmF0ZURpY3Q7CiAgICAgIGlmIChmZFNlbGVjdCAmJiBmZEFycmF5Lmxlbmd0aCkgewogICAgICAgIGNvbnN0IGZkSW5kZXggPSBmZFNlbGVjdC5nZXRGREluZGV4KGkpOwogICAgICAgIGlmIChmZEluZGV4ID09PSAtMSkgewogICAgICAgICAgd2FybigiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgcHJpdmF0ZURpY3RUb1VzZSA9IGZkQXJyYXlbZmRJbmRleF0ucHJpdmF0ZURpY3Q7CiAgICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IHByaXZhdGVEaWN0VG9Vc2Uuc3VicnNJbmRleDsKICAgICAgICB9CiAgICAgI
20H0gZWxzZSBpZiAobG9jYWxTdWJySW5kZXgpIHsKICAgICAgICBsb2NhbFN1YnJUb1VzZSA9IGxvY2FsU3VickluZGV4OwogICAgICB9CiAgICAgIGlmICh2YWxpZCkgewogICAgICAgIHZhbGlkID0gdGhpcy5wYXJzZUNoYXJTdHJpbmcoc3RhdGUsIGNoYXJzdHJpbmcsIGxvY2FsU3ViclRvVXNlLCBnbG9iYWxTdWJySW5kZXgpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS53aWR0aCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IG5vbWluYWxXaWR0aCA9IHByaXZhdGVEaWN0VG9Vc2UuZ2V0QnlOYW1lKCJub21pbmFsV2lkdGhYIik7CiAgICAgICAgd2lkdGhzW2ldID0gbm9taW5hbFdpZHRoICsgc3RhdGUud2lkdGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoImRlZmF1bHRXaWR0aFgiKTsKICAgICAgICB3aWR0aHNbaV0gPSBkZWZhdWx0V2lkdGg7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnNlYWMgIT09IG51bGwpIHsKICAgICAgICBzZWFjc1tpXSA9IHN0YXRlLnNlYWM7CiAgICAgIH0KICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgIGNoYXJTdHJpbmdzLnNldChpLCBuZXcgVWludDhBcnJheShbMTRdKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGNoYXJTdHJpbmdzLAogICAgICBzZWFjcywKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBlbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpIHsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBbXSwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3Quc2V0QnlLZXkoMTgsIFswLCAwXSk7CiAgICBwYXJlbnREaWN0LnByaXZhdGVEaWN0ID0gcHJpdmF0ZURpY3Q7CiAgfQogIHBhcnNlUHJpdmF0ZURpY3QocGFyZW50RGljdCkgewogICAgaWYgKCFwYXJlbnREaWN0Lmhhc05hbWUoIlByaXZhdGUiKSkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVPZmZzZXQgPSBwYXJlbnREaWN0LmdldEJ5TmFtZSgiUHJpdmF0ZSIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHByaXZhdGVPZmZzZXQpIHx8IHByaXZhdGVPZmZzZXQubGVuZ3RoICE9PSAyKSB7CiAgICAgIHBhcmVudERpY3QucmVtb3ZlQnlOYW1lKCJQcml2YXRlIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHNpemUgPSBwcml2YXRlT2Zmc2V0WzBdOwogICAgY29uc3Qgb2Zmc2V0ID0gcHJpdmF0ZU9mZnNldFsxXTsKICAgIGlmIChzaXplID09PSAwIHx8IG9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHByaXZhdGVEaWN0RW5kID0gb2Zmc2V0ICsgc2l6ZTsKICAgIGNvbnN0IGRpY3REYXRhID0gdGhpcy5ieXRlcy5zdWJhcnJheShvZmZzZXQsIHByaXZhdGVEaWN0RW5kKTsKICAgIGNvbnN0IGRpY3QgPSB0aGlzLnBhcnNlRGljdChkaWN0RGF0YSk7CiAgICBjb25zdCBwcml2YXRlRGljdCA9IHRoaXMuY3JlYXRlRGljdChDRkZQcml2YXRlRGljdCwgZGljdCwgcGFyZW50RGljdC5zdHJpbmdzKTsKICAgIHBhcmVudERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICAgIGlmIChwcml2YXRlRGljdC5nZXRCeU5hbWUoIkV4cGFuc2lvbkZhY3RvciIpID09PSAwKSB7CiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIiwgMC4wNik7CiAgICB9CiAgICBpZiAoIXByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc09mZnNldCA9IHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiU3VicnMiKTsKICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gb2Zmc2V0ICsgc3VicnNPZmZzZXQ7CiAgICBpZiAoc3VicnNPZmZzZXQgPT09IDAgfHwgcmVsYXRpdmVPZmZzZXQgPj0gdGhpcy5ieXRlcy5sZW5ndGgpIHsKICAgICAgdGhpcy5lbXB0eVByaXZhdGVEaWN0aW9uYXJ5KHBhcmVudERpY3QpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzdWJyc0luZGV4ID0gdGhpcy5wYXJzZUluZGV4KHJlbGF0aXZlT2Zmc2V0KTsKICAgIHByaXZhdGVEaWN0LnN1YnJzSW5kZXggPSBzdWJyc0luZGV4Lm9iajsKICB9CiAgcGFyc2VDaGFyc2V0cyhwb3MsIGxlbmd0aCwgc3RyaW5ncywgY2lkKSB7CiAgICBpZiAocG9zID09PSAwKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLklTT19BRE9CRSwgSVNPQWRvYmVDaGFyc2V0KTsKICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLkVYUEVSVCwgRXhwZXJ0Q2hhcnNldCk7CiAgICB9IGVsc2UgaWYgKHBvcyA9PT0gMikgewogICAgICByZXR1cm4gbmV3IENGRkNoYXJzZXQodHJ1ZSwgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcy5FWFBFUlRfU1VCU0VULCBFeHBlcnRTdWJzZXRDaGFyc2V0KTsKICAgIH0KICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHN0YXJ0ID0gcG9zOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgY2hhcnNldCA9IFtjaWQgPyAwIDogIi5ub3RkZWYiXTsKICAgIGxldCBpZCwgY291bnQsIGk7CiAgICBsZW5ndGggLT0gMTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQgOiBzdHJpbmdzLmdldChpZCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHsKICAgICAgICAgIGl
20kID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICB3aGlsZSAoY2hhcnNldC5sZW5ndGggPD0gbGVuZ3RoKSB7CiAgICAgICAgICBpZCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgICAgY291bnQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICAgICAgICBjaGFyc2V0LnB1c2goY2lkID8gaWQrKyA6IHN0cmluZ3MuZ2V0KGlkKyspKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNoYXJzZXQgZm9ybWF0Iik7CiAgICB9CiAgICBjb25zdCBlbmQgPSBwb3M7CiAgICBjb25zdCByYXcgPSBieXRlcy5zdWJhcnJheShzdGFydCwgZW5kKTsKICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldChmYWxzZSwgZm9ybWF0LCBjaGFyc2V0LCByYXcpOwogIH0KICBwYXJzZUVuY29kaW5nKHBvcywgcHJvcGVydGllcywgc3RyaW5ncywgY2hhcnNldCkgewogICAgY29uc3QgZW5jb2RpbmcgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgbGV0IHByZWRlZmluZWQgPSBmYWxzZTsKICAgIGxldCBmb3JtYXQsIGksIGlpOwogICAgbGV0IHJhdyA9IG51bGw7CiAgICBmdW5jdGlvbiByZWFkU3VwcGxlbWVudCgpIHsKICAgICAgY29uc3Qgc3VwcGxlbWVudHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgZm9yIChpID0gMDsgaSA8IHN1cHBsZW1lbnRzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IGNvZGUgPSBieXRlc1twb3MrK107CiAgICAgICAgY29uc3Qgc2lkID0gKGJ5dGVzW3BvcysrXSA8PCA4KSArIChieXRlc1twb3MrK10gJiAweGZmKTsKICAgICAgICBlbmNvZGluZ1tjb2RlXSA9IGNoYXJzZXQuaW5kZXhPZihzdHJpbmdzLmdldChzaWQpKTsKICAgICAgfQogICAgfQogICAgaWYgKHBvcyA9PT0gMCB8fCBwb3MgPT09IDEpIHsKICAgICAgcHJlZGVmaW5lZCA9IHRydWU7CiAgICAgIGZvcm1hdCA9IHBvczsKICAgICAgY29uc3QgYmFzZUVuY29kaW5nID0gcG9zID8gRXhwZXJ0RW5jb2RpbmcgOiBTdGFuZGFyZEVuY29kaW5nOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGluZGV4ID0gYmFzZUVuY29kaW5nLmluZGV4T2YoY2hhcnNldFtpXSk7CiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHBvczsKICAgICAgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjb25zdCBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgewogICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIGNvbnN0IHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgbGV0IGdpZCA9IDE7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBzdGFydCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgY29uc3QgbGVmdCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IHN0YXJ0ICsgbGVmdDsgaisrKSB7CiAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7Zm9ybWF0fSBpbiBDRkZgKTsKICAgICAgfQogICAgICBjb25zdCBkYXRhRW5kID0gcG9zOwogICAgICBpZiAoZm9ybWF0ICYgMHg4MCkgewogICAgICAgIGJ5dGVzW2RhdGFTdGFydF0gJj0gMHg3ZjsKICAgICAgICByZWFkU3VwcGxlbWVudCgpOwogICAgICB9CiAgICAgIHJhdyA9IGJ5dGVzLnN1YmFycmF5KGRhdGFTdGFydCwgZGF0YUVuZCk7CiAgICB9CiAgICBmb3JtYXQgJj0gMHg3ZjsKICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTsKICB9CiAgcGFyc2VGRFNlbGVjdChwb3MsIGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgZmRTZWxlY3QgPSBbXTsKICAgIGxldCBpOwogICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaWQgPSBieXRlc1twb3MrK107CiAgICAgICAgICBmZFNlbGVjdC5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBjb25zdCByYW5nZXNDb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgKytpKSB7CiAgICAgICAgICBsZXQgZmlyc3QgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGlmIChpID09PSAwICYmIGZpcnN0ICE9PSAwKSB7CiAgICAgICAgICAgIHdhcm4oInBhcnNlRkRTZWxlY3Q6IFRoZSBmaXJzdCByYW5nZSBtdXN0IGhh
20dmUgYSBmaXJzdCBHSUQgb2YgMCIgKyAiIC0tIHRyeWluZyB0byByZWNvdmVyLiIpOwogICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBmZEluZGV4ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgY29uc3QgbmV4dCA9IGJ5dGVzW3Bvc10gPDwgOCB8IGJ5dGVzW3BvcyArIDFdOwogICAgICAgICAgZm9yIChsZXQgaiA9IGZpcnN0OyBqIDwgbmV4dDsgKytqKSB7CiAgICAgICAgICAgIGZkU2VsZWN0LnB1c2goZmRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHBvcyArPSAyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgcGFyc2VGRFNlbGVjdDogVW5rbm93biBmb3JtYXQgIiR7Zm9ybWF0fSIuYCk7CiAgICB9CiAgICBpZiAoZmRTZWxlY3QubGVuZ3RoICE9PSBsZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJwYXJzZUZEU2VsZWN0OiBJbnZhbGlkIGZvbnQgZGF0YS4iKTsKICAgIH0KICAgIHJldHVybiBuZXcgQ0ZGRkRTZWxlY3QoZm9ybWF0LCBmZFNlbGVjdCk7CiAgfQp9CmNsYXNzIENGRiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmhlYWRlciA9IG51bGw7CiAgICB0aGlzLm5hbWVzID0gW107CiAgICB0aGlzLnRvcERpY3QgPSBudWxsOwogICAgdGhpcy5zdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIHRoaXMuZ2xvYmFsU3VickluZGV4ID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOwogICAgdGhpcy5jaGFyc2V0ID0gbnVsbDsKICAgIHRoaXMuY2hhclN0cmluZ3MgPSBudWxsOwogICAgdGhpcy5mZEFycmF5ID0gW107CiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDsKICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7CiAgfQogIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgewogICAgICB3YXJuKCJOb3QgZW5vdWdoIHNwYWNlIGluIGNoYXJzdHJpbmdzIHRvIGR1cGxpY2F0ZSBmaXJzdCBnbHlwaC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZ2x5cGhaZXJvID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoMCk7CiAgICB0aGlzLmNoYXJTdHJpbmdzLmFkZChnbHlwaFplcm8pOwogICAgaWYgKHRoaXMuaXNDSURGb250KSB7CiAgICAgIHRoaXMuZmRTZWxlY3QuZmRTZWxlY3QucHVzaCh0aGlzLmZkU2VsZWN0LmZkU2VsZWN0WzBdKTsKICAgIH0KICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLmNoYXJTdHJpbmdzLmNvdW50KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGdseXBoID0gdGhpcy5jaGFyU3RyaW5ncy5nZXQoaWQpOwogICAgcmV0dXJuIGdseXBoLmxlbmd0aCA+IDA7CiAgfQp9CmNsYXNzIENGRkhlYWRlciB7CiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7CiAgICB0aGlzLm1ham9yID0gbWFqb3I7CiAgICB0aGlzLm1pbm9yID0gbWlub3I7CiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplOwogICAgdGhpcy5vZmZTaXplID0gb2ZmU2l6ZTsKICB9Cn0KY2xhc3MgQ0ZGU3RyaW5ncyB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnN0cmluZ3MgPSBbXTsKICB9CiAgZ2V0KGluZGV4KSB7CiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgLSAxKSB7CiAgICAgIHJldHVybiBDRkZTdGFuZGFyZFN0cmluZ3NbaW5kZXhdOwogICAgfQogICAgaWYgKGluZGV4IC0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIDw9IHRoaXMuc3RyaW5ncy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nc1tpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HU107CiAgICB9CiAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzWzBdOwogIH0KICBnZXRTSUQoc3RyKSB7CiAgICBsZXQgaW5kZXggPSBDRkZTdGFuZGFyZFN0cmluZ3MuaW5kZXhPZihzdHIpOwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICBpbmRleCA9IHRoaXMuc3RyaW5ncy5pbmRleE9mKHN0cik7CiAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgIHJldHVybiBpbmRleCArIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUzsKICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgYWRkKHZhbHVlKSB7CiAgICB0aGlzLnN0cmluZ3MucHVzaCh2YWx1ZSk7CiAgfQogIGdldCBjb3VudCgpIHsKICAgIHJldHVybiB0aGlzLnN0cmluZ3MubGVuZ3RoOwogIH0KfQpjbGFzcyBDRkZJbmRleCB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLm9iamVjdHMgPSBbXTsKICAgIHRoaXMubGVuZ3RoID0gMDsKICB9CiAgYWRkKGRhdGEpIHsKICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5vYmplY3RzLnB1c2goZGF0YSk7CiAgfQogIHNldChpbmRleCwgZGF0YSkgewogICAgdGhpcy5sZW5ndGggKz0gZGF0YS5sZW5ndGggLSB0aGlzLm9iamVjdHNbaW5kZXhdLmxlbmd0aDsKICAgIHRoaXMub2JqZWN0c1tpbmRleF0gPSBkYXRhOwogIH0KICBnZXQoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLm9iamVjdHNbaW5kZXhdOwogIH0KICBnZXQgY291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RzLmxlbmd0aDsKICB9Cn0KY2xhc3MgQ0ZGRGljdCB7CiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7CiAgICB0aGlzLmtleVRvTmFtZU1hcCA9IHRhYmxlcy5rZXlUb05hbWVNYXA7CiAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzOwogICAgdGhpcy50eXBlcyA9IHRhYmxlcy50eXBlczsKICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOwogICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjsKICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgfQogIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGlmIChpc05hTih2YWwpKSB7CiAgICAgICAgd2FybihgSW52YWxpZCBDRkZEaWN0IHZhbHVlOiAiJHt2YWx1ZX0iIGZvciBrZXkgIiR7a2V5fSIuYCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgI
20H0KICAgIH0KICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVzW2tleV07CiAgICBpZiAodHlwZSA9PT0gIm51bSIgfHwgdHlwZSA9PT0gInNpZCIgfHwgdHlwZSA9PT0gIm9mZnNldCIpIHsKICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKICAgIH0KICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBzZXRCeU5hbWUobmFtZSwgdmFsdWUpIHsKICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgIiR7bmFtZX0iYCk7CiAgICB9CiAgICB0aGlzLnZhbHVlc1t0aGlzLm5hbWVUb0tleU1hcFtuYW1lXV0gPSB2YWx1ZTsKICB9CiAgaGFzTmFtZShuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV0gaW4gdGhpcy52YWx1ZXM7CiAgfQogIGdldEJ5TmFtZShuYW1lKSB7CiAgICBpZiAoIShuYW1lIGluIHRoaXMubmFtZVRvS2V5TWFwKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZGljdGlvbmFyeSBuYW1lICR7bmFtZX0iYCk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXTsKICAgIGlmICghKGtleSBpbiB0aGlzLnZhbHVlcykpIHsKICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdHNba2V5XTsKICAgIH0KICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXldOwogIH0KICByZW1vdmVCeU5hbWUobmFtZSkgewogICAgZGVsZXRlIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW25hbWVdXTsKICB9CiAgc3RhdGljIGNyZWF0ZVRhYmxlcyhsYXlvdXQpIHsKICAgIGNvbnN0IHRhYmxlcyA9IHsKICAgICAga2V5VG9OYW1lTWFwOiB7fSwKICAgICAgbmFtZVRvS2V5TWFwOiB7fSwKICAgICAgZGVmYXVsdHM6IHt9LAogICAgICB0eXBlczoge30sCiAgICAgIG9wY29kZXM6IHt9LAogICAgICBvcmRlcjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxheW91dCkgewogICAgICBjb25zdCBrZXkgPSBBcnJheS5pc0FycmF5KGVudHJ5WzBdKSA/IChlbnRyeVswXVswXSA8PCA4KSArIGVudHJ5WzBdWzFdID
20ogZW50cnlbMF07CiAgICAgIHRhYmxlcy5rZXlUb05hbWVNYXBba2V5XSA9IGVudHJ5WzFdOwogICAgICB0YWJsZXMubmFtZVRvS2V5TWFwW2VudHJ5WzFdXSA9IGtleTsKICAgICAgdGFibGVzLnR5cGVzW2tleV0gPSBlbnRyeVsyXTsKICAgICAgdGFibGVzLmRlZmF1bHRzW2tleV0gPSBlbnRyeVszXTsKICAgICAgdGFibGVzLm9wY29kZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gZW50cnlbMF0gOiBbZW50cnlbMF1dOwogICAgICB0YWJsZXMub3JkZXIucHVzaChrZXkpOwogICAgfQogICAgcmV0dXJuIHRhYmxlczsKICB9Cn0KY29uc3QgQ0ZGVG9wRGljdExheW91dCA9IFtbWzEyLCAzMF0sICJST1MiLCBbInNpZCIsICJzaWQiLCAibnVtIl0sIG51bGxdLCBbWzEyLCAyMF0sICJTeW50aGV0aWNCYXNlIiwgIm51bSIsIG51bGxdLCBbMCwgInZlcnNpb24iLCAic2lkIiwgbnVsbF0sIFsxLCAiTm90aWNlIiwgInNpZCIsIG51bGxdLCBbWzEyLCAwXSwgIkNvcHlyaWdodCIsICJzaWQiLCBudWxsXSwgWzIsICJGdWxsTmFtZSIsICJzaWQiLCBudWxsXSwgWzMsICJGYW1pbHlOYW1lIiwgInNpZCIsIG51bGxdLCBbNCwgIldlaWdodCIsICJzaWQiLCBudWxsXSwgW1sxMiwgMV0sICJpc0ZpeGVkUGl0Y2giLCAibnVtIiwgMF0sIFtbMTIsIDJdLCAiSXRhbGljQW5nbGUiLCAibnVtIiwgMF0sIFtbMTIsIDNdLCAiVW5kZXJsaW5lUG9zaXRpb24iLCAibnVtIiwgLTEwMF0sIFtbMTIsIDRdLCAiVW5kZXJsaW5lVGhpY2tuZXNzIiwgIm51bSIsIDUwXSwgW1sxMiwgNV0sICJQYWludFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDZdLCAiQ2hhcnN0cmluZ1R5cGUiLCAibnVtIiwgMl0sIFtbMTIsIDddLCAiRm9udE1hdHJpeCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIiwgIm51bSIsICJudW0iXSwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF1dLCBbMTMsICJVbmlxdWVJRCIsICJudW0iLCBudWxsXSwgWzUsICJGb250QkJveCIsIFsibnVtIiwgIm51bSIsICJudW0iLCAibnVtIl0sIFswLCAwLCAwLCAwXV0sIFtbMTIsIDhdLCAiU3Ryb2tlV2lkdGgiLCAibnVtIiwgMF0sIFsxNCwgIlhVSUQiLCAiYXJyYXkiLCBudWxsXSwgWzE1LCAiY2hhcnNldCIsICJvZmZzZXQiLCAwXSwgWzE2LCAiRW5jb2RpbmciLCAib2Zmc2V0IiwgMF0sIFsxNywgIkNoYXJTdHJpbmdzIiwgIm9mZnNldCIsIDBdLCBbMTgsICJQcml2YXRlIiwgWyJvZmZzZXQiLCAib2Zmc2V0Il0sIG51bGxdLCBbWzEyLCAyMV0sICJQb3N0U2NyaXB0IiwgInNpZCIsIG51bGxdLCBbWzEyLCAyMl0sICJCYXNlRm9udE5hbWUiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDIzXSwgIkJhc2VGb250QmxlbmQiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMzFdLCAiQ0lERm9udFZlcnNpb24iLCAibnVtIiwgMF0sIFtbMTIsIDMyXSwgIkNJREZvbnRSZXZpc2lvbiIsICJudW0iLCAwXSwgW1sxMiwgMzNdLCAiQ0lERm9udFR5cGUiLCAibnVtIiwgMF0sIFtbMTIsIDM0XSwgIkNJRENvdW50IiwgIm51bSIsIDg3MjBdLCBbWzEyLCAzNV0sICJVSURCYXNlIiwgIm51bSIsIG51bGxdLCBbWzEyLCAzN10sICJGRFNlbGVjdCIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzZdLCAiRkRBcnJheSIsICJvZmZzZXQiLCBudWxsXSwgW1sxMiwgMzhdLCAiRm9udE5hbWUiLCAic2lkIiwgbnVsbF1dOwpjbGFzcyBDRkZUb3BEaWN0IGV4dGVuZHMgQ0ZGRGljdCB7CiAgc3RhdGljIGdldCB0YWJsZXMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ0YWJsZXMiLCB0aGlzLmNyZWF0ZVRhYmxlcyhDRkZUb3BEaWN0TGF5b3V0KSk7CiAgfQogIGNvbnN0cnVjdG9yKHN0cmluZ3MpIHsKICAgIHN1cGVyKENGRlRvcERpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMucHJpdmF0ZURpY3QgPSBudWxsOwogIH0KfQpjb25zdCBDRkZQcml2YXRlRGljdExheW91dCA9IFtbNiwgIkJsdWVWYWx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzcsICJPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs4LCAiRmFtaWx5Qmx1ZXMiLCAiZGVsdGEiLCBudWxsXSwgWzksICJGYW1pbHlPdGhlckJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDldLCAiQmx1ZVNjYWxlIiwgIm51bSIsIDAuMDM5NjI1XSwgW1sxMiwgMTBdLCAiQmx1ZVNoaWZ0IiwgIm51bSIsIDddLCBbWzEyLCAxMV0sICJCbHVlRnV6eiIsICJudW0iLCAxXSwgWzEwLCAiU3RkSFciLCAibnVtIiwgbnVsbF0sIFsxMSwgIlN0ZFZXIiwgIm51bSIsIG51bGxdLCBbWzEyLCAxMl0sICJTdGVtU25hcEgiLCAiZGVsdGEiLCBudWxsXSwgW1sxMiwgMTNdLCAiU3RlbVNuYXBWIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDE0XSwgIkZvcmNlQm9sZCIsICJudW0iLCAwXSwgW1sxMiwgMTddLCAiTGFuZ3VhZ2VHcm91cCIsICJudW0iLCAwXSwgW1sxMiwgMThdLCAiRXhwYW5zaW9uRmFjdG9yIiwgIm51bSIsIDAuMDZdLCBbWzEyLCAxOV0sICJpbml0aWFsUmFuZG9tU2VlZCIsICJudW0iLCAwXSwgWzIwLCAiZGVmYXVsdFdpZHRoWCIsICJudW0iLCAwXSwgWzIxLCAibm9taW5hbFdpZHRoWCIsICJudW0iLCAwXSwgWzE5LCAiU3VicnMiLCAib2Zmc2V0IiwgbnVsbF1dOwpjbGFzcyBDRkZQcml2YXRlRGljdCBleHRlbmRzIENGRkRpY3QgewogIHN0YXRpYyBnZXQgdGFibGVzKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidGFibGVzIiwgdGhpcy5jcmVhdGVUYWJsZXMoQ0ZGUHJpdmF0ZURpY3RMYXlvdXQpKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5ncykgewogICAgc3VwZXIoQ0ZGUHJpdmF0ZURpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMuc3VicnNJbmRleCA9IG51bGw7CiAgfQp9CmNvbnN0IENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMgPSB7CiAgSVNPX0FET0JFOiAwLAogIEVYUEVSVDogMSwKICBFWFBFUlRfU1VCU0VUOiAyCn07CmNsYXNzIENGRkNoYXJzZXQgewogIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgY2hhcnNldCwgcmF3KSB7CiAgICB0aGlzLnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOwogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OwogICAgdGhpcy5yYXcgPSByYXc7CiAgfQp9CmNsYXNzIENGRkVuY29kaW5nIHsKICBjb25zdHJ1Y3RvcihwcmVkZWZpbmVkLCBmb3JtYXQsIGVuY29kaW5nLCByYXcpIHsKICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgIHRoaXMucmF3ID0gcmF3OwogIH0KfQpjbGFzcyBDRkZGRFNlbGVjdCB7CiAgY29uc3RydWN0b3IoZm9ybWF0LCBmZFNlbGVjdCkgewogICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gZmRTZWxlY3Q7CiAgfQogIGdldEZESW5kZXgoZ2x5cGhJbmRleCkgewogICAgaWYgKGdseXBoSW5kZXggPCAwIHx8IGdseXBoSW5kZXggPj0gdGhpcy5mZFNlbGVjdC5sZW5ndGgpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuZmRTZWxlY3RbZ2x5cGhJbmRleF07CiAgfQp9CmNsYXNzIENGRk9mZnNldFRyYWNrZXIgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5vZmZzZXRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgaXNUcmFja2luZyhrZXkpIHsKICAgIHJldHVybi
20BrZXkgaW4gdGhpcy5vZmZzZXRzOwogIH0KICB0cmFjayhrZXksIGxvY2F0aW9uKSB7CiAgICBpZiAoa2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEFscmVhZHkgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CiAgICB9CiAgICB0aGlzLm9mZnNldHNba2V5XSA9IGxvY2F0aW9uOwogIH0KICBvZmZzZXQodmFsdWUpIHsKICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMub2Zmc2V0cykgewogICAgICB0aGlzLm9mZnNldHNba2V5XSArPSB2YWx1ZTsKICAgIH0KICB9CiAgc2V0RW50cnlMb2NhdGlvbihrZXksIHZhbHVlcywgb3V0cHV0KSB7CiAgICBpZiAoIShrZXkgaW4gdGhpcy5vZmZzZXRzKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYE5vdCB0cmFja2luZyBsb2NhdGlvbiBvZiAke2tleX1gKTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBvdXRwdXQuZGF0YTsKICAgIGNvbnN0IGRhdGFPZmZzZXQgPSB0aGlzLm9mZnNldHNba2V5XTsKICAgIGNvbnN0IHNpemUgPSA1OwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3Qgb2Zmc2V0MCA9IGkgKiBzaXplICsgZGF0YU9mZnNldDsKICAgICAgY29uc3Qgb2Zmc2V0MSA9IG9mZnNldDAgKyAxOwogICAgICBjb25zdCBvZmZzZXQyID0gb2Zmc2V0MCArIDI7CiAgICAgIGNvbnN0IG9mZnNldDMgPSBvZmZzZXQwICsgMzsKICAgICAgY29uc3Qgb2Zmc2V0NCA9IG9mZnNldDAgKyA0OwogICAgICBpZiAoZGF0YVtvZmZzZXQwXSAhPT0gMHgxZCB8fCBkYXRhW29mZnNldDFdICE9PSAwIHx8IGRhdGFbb2Zmc2V0Ml0gIT09IDAgfHwgZGF0YVtvZmZzZXQzXSAhPT0gMCB8fCBkYXRhW29mZnNldDRdICE9PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ3cml0aW5nIHRvIGFuIG9mZnNldCB0aGF0IGlzIG5vdCBlbXB0eSIpOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldOwogICAgICBkYXRhW29mZnNldDBdID0gMHgxZDsKICAgICAgZGF0YVtvZmZzZXQxXSA9IHZhbHVlID4+IDI0ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQyXSA9IHZhbHVlID4+IDE2ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQzXSA9IHZhbHVlID4+IDggJiAweGZmOwogICAgICBkYXRhW29mZnNldDRdID0gdmFsdWUgJiAweGZmOwogICAgfQogIH0KfQpjbGFzcyBDRkZDb21waWxlciB7CiAgY29uc3RydWN0b3IoY2ZmKSB7CiAgICB0aGlzLmNmZiA9IGNmZjsKICB9CiAgY29tcGlsZSgpIHsKICAgIGNvbnN0IGNmZiA9IHRoaXMuY2ZmOwogICAgY29uc3Qgb3V0cHV0ID0gewogICAgICBkYXRhOiBbXSwKICAgICAgbGVuZ3RoOiAwLAogICAgICBhZGQoZGF0YSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmRhdGEucHVzaCguLi5kYXRhKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZGF0YSk7CiAgICAgICAgfQogICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuY29tcGlsZUhlYWRlcihjZmYuaGVhZGVyKTsKICAgIG91dHB1dC5hZGQoaGVhZGVyKTsKICAgIGNvbnN0IG5hbWVJbmRleCA9IHRoaXMuY29tcGlsZU5hbWVJbmRleChjZmYubmFtZXMpOwogICAgb3V0cHV0LmFkZChuYW1lSW5kZXgpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgaWYgKGNmZi50b3BEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgewogICAgICAgIGNvbnN0IGJhc2UgPSBjZmYudG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBjZmYudG9wRGljdC5yZW1vdmVCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgICAgICBmb3IgKGNvbnN0IHN1YkRpY3Qgb2YgY2ZmLmZkQXJyYXkpIHsKICAgICAgICAgIGxldCBtYXRyaXggPSBiYXNlLnNsaWNlKDApOwogICAgICAgICAgaWYgKHN1YkRpY3QuaGFzTmFtZSgiRm9udE1hdHJpeCIpKSB7CiAgICAgICAgICAgIG1hdHJpeCA9IFV0aWwudHJhbnNmb3JtKG1hdHJpeCwgc3ViRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSk7CiAgICAgICAgICB9CiAgICAgICAgICBzdWJEaWN0LnNldEJ5TmFtZSgiRm9udE1hdHJpeCIsIG1hdHJpeCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB4dWlkID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKCJYVUlEIik7CiAgICBpZiAoeHVpZD8ubGVuZ3RoID4gMTYpIHsKICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJYVUlEIik7CiAgICB9CiAgICBjZmYudG9wRGljdC5zZXRCeU5hbWUoImNoYXJzZXQiLCAwKTsKICAgIGxldCBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKFtjZmYudG9wRGljdF0sIG91dHB1dC5sZW5ndGgsIGNmZi5pc0NJREZvbnQpOwogICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOwogICAgY29uc3QgdG9wRGljdFRyYWNrZXIgPSBjb21waWxlZC50cmFja2Vyc1swXTsKICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gdGhpcy5jb21waWxlU3RyaW5nSW5kZXgoY2ZmLnN0cmluZ3Muc3RyaW5ncyk7CiAgICBvdXRwdXQuYWRkKHN0cmluZ0luZGV4KTsKICAgIGNvbnN0IGdsb2JhbFN1YnJJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGNmZi5nbG9iYWxTdWJySW5kZXgpOwogICAgb3V0cHV0LmFkZChnbG9iYWxTdWJySW5kZXgpOwogICAgaWYgKGNmZi5lbmNvZGluZyAmJiBjZmYudG9wRGljdC5oYXNOYW1lKCJFbmNvZGluZyIpKSB7CiAgICAgIGlmIChjZmYuZW5jb2RpbmcucHJlZGVmaW5lZCkgewogICAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkVuY29kaW5nIiwgW2NmZi5lbmNvZGluZy5mb3JtYXRdLCBvdXRwdXQpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuY29kaW5nID0gdGhpcy5jb21waWxlRW5jb2RpbmcoY2ZmLmVuY29kaW5nKTsKICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKGVuY29kaW5nKTsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hhcnNldCA9IHRoaXMuY29tcGlsZUNoYXJzZXQoY2ZmLmNoYXJzZXQsIGNmZi5jaGFyU3RyaW5ncy5jb3VudCwgY2ZmLnN0cmluZ3MsIGNmZi5pc0NJREZvbnQpOwogICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiY2hhcnNldCIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhcnNldCk7CiAgICBjb25zdCBjaGFyU3RyaW5ncyA9IHRoaXMuY29tcGlsZUNoYXJTdHJpbmdzKGNmZi5jaGFyU3RyaW5ncyk7CiAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJDaGFyU3RyaW5ncyIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgIG91dHB1dC5hZGQoY2hhclN0cmluZ3MpOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRTZWxlY3QiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICAgIGNvbnN0IGZkU2VsZWN0ID0gdGhpcy5jb21waWxlRkRTZWxlY3QoY2ZmLmZkU2VsZWN0KTsKICAgICAgb3V0cHV0LmFkZChmZFNlbGVjdCk7CiAgICAgIGNvbXBpbGVkID0gdGhpcy5jb21waWxlVG9wRGljdHMoY2ZmLmZkQXJyYXksIG91dHB1dC5sZW5ndGgsIHRydWUpOwogICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJGREFycmF5IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKGNvbXBpbGVkLm91dHB1dCk7CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBjb21waWxlZC50cmFja2VyczsKICAgICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKGNmZi5mZEFycmF5LCBmb250RGljdFRyYWNrZXJzLCBvdXRwdXQpOwogICAgfQogICAgdGhpcy5jb21waWxlUHJpdmF0ZURpY3RzKFtjZmYudG9wRGljdF0sIFt0b3BEaWN0VHJhY2tlcl0sIG91dHB1dCk7CiAgICBvdXRwdXQuYWRkKFswXSk7CiAgICByZXR1cm4gb3V0cHV0LmRhdGE7CiAgfQogIGVuY29kZU51bWJlcih2YWx1ZSkgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7CiAgICAgI
20HJldHVybiB0aGlzLmVuY29kZUludGVnZXIodmFsdWUpOwogICAgfQogICAgcmV0dXJuIHRoaXMuZW5jb2RlRmxvYXQodmFsdWUpOwogIH0KICBzdGF0aWMgZ2V0IEVuY29kZUZsb2F0UmVnRXhwKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRW5jb2RlRmxvYXRSZWdFeHAiLCAvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyk7CiAgfQogIGVuY29kZUZsb2F0KG51bSkgewogICAgbGV0IHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7CiAgICBjb25zdCBtID0gQ0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh2YWx1ZSk7CiAgICBpZiAobSkgewogICAgICBjb25zdCBlcHNpbG9uID0gcGFyc2VGbG9hdCgiMWUiICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7CiAgICAgIHZhbHVlID0gKE1hdGgucm91bmQobnVtICogZXBzaWxvbikgLyBlcHNpbG9uKS50b1N0cmluZygpOwogICAgfQogICAgbGV0IG5pYmJsZXMgPSAiIjsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBhID0gdmFsdWVbaV07CiAgICAgIGlmIChhID09PSAiZSIpIHsKICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKICAgICAgICBuaWJibGVzICs9ICJhIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKICAgICAgICBuaWJibGVzICs9ICJlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuaWJibGVzICs9IGE7CiAgICAgIH0KICAgIH0KICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gImYiIDogImZmIjsKICAgIGNvbnN0IG91dCA9IFszMF07CiAgICBmb3IgKGkgPSAwLCBpaSA9IG5pYmJsZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBvdXQucHVzaChwYXJzZUludChuaWJibGVzLnN1YnN0cmluZyhpLCBpICsgMiksIDE2KSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBlbmNvZGVJbnRlZ2VyKHZhbHVlKSB7CiAgICBsZXQgY29kZTsKICAgIGlmICh2YWx1ZSA+PSAtMTA3ICYmIHZhbHVlIDw9IDEwNykgewogICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKICAgICAgdmFsdWUgLT0gMTA4OwogICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gLTExMzEgJiYgdmFsdWUgPD0gLTEwOCkgewogICAgICB2YWx1ZSA9IC12YWx1ZSAtIDEwODsKICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07CiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0zMjc2OCAmJiB2YWx1ZSA8PSAzMjc2NykgewogICAgICBjb2RlID0gWzB4MWMsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOwogICAgfSBlbHNlIHsKICAgICAgY29kZSA9IFsweDFkLCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZl07CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CiAgY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKICAgIHJldHVybiBbaGVhZGVyLm1ham9yLCBoZWFkZXIubWlub3IsIDQsIGhlYWRlci5vZmZTaXplXTsKICB9CiAgY29tcGlsZU5hbWVJbmRleChuYW1lcykgewogICAgY29uc3QgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CiAgICAgIGxldCBzYW5pdGl6ZWROYW1lID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICBsZXQgY2hhciA9IG5hbWVbal07CiAgICAgICAgaWYgKGNoYXIgPCAiISIgfHwgY2hhciA+ICJ+IiB8fCBjaGFyID09PSAiWyIgfHwgY2hhciA9PT0gIl0iIHx8IGNoYXIgPT09ICIoIiB8fCBjaGFyID09PSAiKSIgfHwgY2hhciA9PT0gInsiIHx8IGNoYXIgPT09ICJ9IiB8fCBjaGFyID09PSAiPCIgfHwgY2hhciA9PT0gIj4iIHx8IGNoYXIgPT09ICIvIiB8fCBjaGFyID09PSAiJSIpIHsKICAgICAgICAgIGNoYXIgPSAiXyI7CiAgICAgICAgfQogICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyOwogICAgICB9CiAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWROYW1lLmpvaW4oIiIpOwogICAgICBpZiAoc2FuaXRpemVkTmFtZSA9PT0gIiIpIHsKICAgICAgICBzYW5pdGl6ZWROYW1lID0gIkJhZF9Gb250X05hbWUiOwogICAgICB9CiAgICAgIG5hbWVJbmRleC5hZGQoc3RyaW5nVG9CeXRlcyhzYW5pdGl6ZWROYW1lKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgobmFtZUluZGV4KTsKICB9CiAgY29tcGlsZVRvcERpY3RzKGRpY3RzLCBsZW5ndGgsIHJlbW92ZUNpZEtleXMpIHsKICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlcnMgPSBbXTsKICAgIGxldCBmZEFycmF5SW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3QgZm9udERpY3Qgb2YgZGljdHMpIHsKICAgICAgaWYgKHJlbW92ZUNpZEtleXMpIHsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRWZXJzaW9uIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURGb250UmV2aXNpb24iKTsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRUeXBlIik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJDSURDb3VudCIpOwogICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiVUlEQmFzZSIpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnREaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IGZvbnREaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QoZm9udERpY3QsIGZvbnREaWN0VHJhY2tlcik7CiAgICAgIGZvbnREaWN0VHJhY2tlcnMucHVzaChmb250RGljdFRyYWNrZXIpOwogICAgICBmZEFycmF5SW5kZXguYWRkKGZvbnREaWN0RGF0YSk7CiAgICAgIGZvbnREaWN0VHJhY2tlci5vZmZzZXQobGVuZ3RoKTsKICAgIH0KICAgIGZkQXJyYXlJbmRleCA9IHRoaXMuY29tcGlsZUluZGV4KGZkQXJyYXlJbmRleCwgZm9udERpY3RUcmFja2Vycyk7CiAgICByZXR1cm4gewogICAgICB0cmFja2VyczogZm9udERpY3RUcmFja2VycywKICAgICAgb3V0cHV0OiBmZEFycmF5SW5kZXgKICAgIH07CiAgfQogIGNvbXBpbGVQcml2YXRlRGljdHMoZGljdHMsIHRyYWNrZXJzLCBvdXRwdXQpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRpY3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3QgZm9udERpY3QgPSBkaWN0c1tpXTsKICAgICAgY29uc3QgcHJpdmF0ZURpY3QgPSBmb250RGljdC5wcml2YXRlRGljdDsKICAgICAgaWYgKCFwcml2YXRlRGljdCB8fCAhZm9udERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJUaGVyZSBtdXN0IGJlIGEgcHJpdmF0ZSBkaWN0aW9uYXJ5LiIpOwogICAgICB9CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0VHJhY2tlciA9IG5ldyBDRkZPZmZzZXRUcmFja2VyKCk7CiAgICAgIGNvbnN0IHByaXZhdGVEaWN0RGF0YSA9IHRoaXMuY29tcGlsZURpY3QocHJpdmF0ZURpY3QsIHByaXZhdGVEaWN0VHJhY2tlcik7CiAgICAgIGxldCBvdXRwdXRMZW5ndGggPSBvdXRwdXQubGVuZ3RoOwogICAgICBwcml2YXRlRGljdFRyYWNrZXIub2Zmc2V0KG91dHB1dExlbmd0aCk7CiAgICAgIGlmICghcHJpdmF0ZURpY3REYXRhLmxlbmd0aCkgewogICAgICAgIG91
20dHB1dExlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgdHJhY2tlcnNbaV0uc2V0RW50cnlMb2NhdGlvbigiUHJpdmF0ZSIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoLCBvdXRwdXRMZW5ndGhdLCBvdXRwdXQpOwogICAgICBvdXRwdXQuYWRkKHByaXZhdGVEaWN0RGF0YSk7CiAgICAgIGlmIChwcml2YXRlRGljdC5zdWJyc0luZGV4ICYmIHByaXZhdGVEaWN0Lmhhc05hbWUoIlN1YnJzIikpIHsKICAgICAgICBjb25zdCBzdWJycyA9IHRoaXMuY29tcGlsZUluZGV4KHByaXZhdGVEaWN0LnN1YnJzSW5kZXgpOwogICAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJTdWJycyIsIFtwcml2YXRlRGljdERhdGEubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgICBvdXRwdXQuYWRkKHN1YnJzKTsKICAgICAgfQogICAgfQogIH0KICBjb21waWxlRGljdChkaWN0LCBvZmZzZXRUcmFja2VyKSB7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGRpY3Qub3JkZXIpIHsKICAgICAgaWYgKCEoa2V5IGluIGRpY3QudmFsdWVzKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCB2YWx1ZXMgPSBkaWN0LnZhbHVlc1trZXldOwogICAgICBsZXQgdHlwZXMgPSBkaWN0LnR5cGVzW2tleV07CiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlcykpIHsKICAgICAgICB0eXBlcyA9IFt0eXBlc107CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTsKICAgICAgfQogICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHR5cGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbal07CiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbal07CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlICJudW0iOgogICAgICAgICAgY2FzZSAic2lkIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJvZmZzZXQiOgogICAgICAgICAgICBjb25zdCBuYW1lID0gZGljdC5rZXlUb05hbWVNYXBba2V5XTsKICAgICAgICAgICAgaWYgKCFvZmZzZXRUcmFja2VyLmlzVHJhY2tpbmcobmFtZSkpIHsKICAgICAgICAgICAgICBvZmZzZXRUcmFja2VyLnRyYWNrKG5hbWUsIG91dC5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5wdXNoKDB4MWQsIDAsIDAsIDAsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIGNhc2UgImRlbHRhIjoKICAgICAgICAgICAgb3V0LnB1c2goLi4udGhpcy5lbmNvZGVOdW1iZXIodmFsdWUpKTsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDEsIGtrID0gdmFsdWVzLmxlbmd0aDsgayA8IGtrOyArK2spIHsKICAgICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLmVuY29kZU51bWJlcih2YWx1ZXNba10pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgb2YgJHt0eXBlfWApOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXQucHVzaCguLi5kaWN0Lm9wY29kZXNba2V5XSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBjb21waWxlU3RyaW5nSW5kZXgoc3RyaW5ncykgewogICAgY29uc3Qgc3RyaW5nSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAoY29uc3Qgc3RyaW5nIG9mIHN0cmluZ3MpIHsKICAgICAgc3RyaW5nSW5kZXguYWRkKHN0cmluZ1RvQnl0ZXMoc3RyaW5nKSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoc3RyaW5nSW5kZXgpOwogIH0KICBjb21waWxlQ2hhclN0cmluZ3MoY2hhclN0cmluZ3MpIHsKICAgIGNvbnN0IGNoYXJTdHJpbmdzSW5kZXggPSBuZXcgQ0ZGSW5kZXgoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhclN0cmluZ3MuY291bnQ7IGkrKykgewogICAgICBjb25zdCBnbHlwaCA9IGNoYXJTdHJpbmdzLmdldChpKTsKICAgICAgaWYgKGdseXBoLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKG5ldyBVaW50OEFycmF5KFsweDhiLCAweDBlXSkpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNoYXJTdHJpbmdzSW5kZXguYWRkKGdseXBoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChjaGFyU3RyaW5nc0luZGV4KTsKICB9CiAgY29tcGlsZUNoYXJzZXQoY2hhcnNldCwgbnVtR2x5cGhzLCBzdHJpbmdzLCBpc0NJREZvbnQpIHsKICAgIGxldCBvdXQ7CiAgICBjb25zdCBudW1HbHlwaHNMZXNzTm90RGVmID0gbnVtR2x5cGhzIC0gMTsKICAgIGlmIChpc0NJREZvbnQpIHsKICAgICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoWzIsIDAsIDAsIG51bUdseXBoc0xlc3NOb3REZWYgPj4gOCAmIDB4ZmYsIG51bUdseXBoc0xlc3NOb3REZWYgJiAweGZmXSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBsZW5ndGggPSAxICsgbnVtR2x5cGhzTGVzc05vdERlZiAqIDI7CiAgICAgIG91
20dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgICAgIG91dFswXSA9IDA7CiAgICAgIGxldCBjaGFyc2V0SW5kZXggPSAwOwogICAgICBjb25zdCBudW1DaGFyc2V0cyA9IGNoYXJzZXQuY2hhcnNldC5sZW5ndGg7CiAgICAgIGxldCB3YXJuZWQgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBsZXQgc2lkID0gMDsKICAgICAgICBpZiAoY2hhcnNldEluZGV4IDwgbnVtQ2hhcnNldHMpIHsKICAgICAgICAgIGNvbnN0IG5hbWUgPSBjaGFyc2V0LmNoYXJzZXRbY2hhcnNldEluZGV4KytdOwogICAgICAgICAgc2lkID0gc3RyaW5ncy5nZXRTSUQobmFtZSk7CiAgICAgICAgICBpZiAoc2lkID09PSAtMSkgewogICAgICAgICAgICBzaWQgPSAwOwogICAgICAgICAgICBpZiAoIXdhcm5lZCkgewogICAgICAgICAgICAgIHdhcm5lZCA9IHRydWU7CiAgICAgICAgICAgICAgd2FybihgQ291bGRuJ3QgZmluZCAke25hbWV9IGluIENGRiBzdHJpbmdzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3V0W2ldID0gc2lkID4+IDggJiAweGZmOwogICAgICAgIG91dFtpICsgMV0gPSBzaWQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGVuY29kaW5nLnJhdyk7CiAgfQogIGNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCkgewogICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OwogICAgbGV0IG91dCwgaTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheSgxICsgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoKTsKICAgICAgICBvdXRbMF0gPSBmb3JtYXQ7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBvdXRbaSArIDFdID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY29uc3Qgc3RhcnQgPSAwOwogICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKICAgICAgICBjb25zdCByYW5nZXMgPSBbZm9ybWF0LCAwLCAwLCBzdGFydCA+PiA4ICYgMHhmZiwgc3RhcnQgJiAweGZmLCBsYXN0RkRdOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY3VycmVudEZEID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHsKICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CiAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CiAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOwogICAgICAgIHJhbmdlc1syXSA9IG51bVJhbmdlcyAmIDB4ZmY7CiAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOwogICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkYXRhKTsKICB9CiAgY29tcGlsZUluZGV4KGluZGV4LCB0cmFja2VycyA9IFtdKSB7CiAgICBjb25zdCBvYmplY3RzID0gaW5kZXgub2JqZWN0czsKICAgIGNvbnN0IGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7CiAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgcmV0dXJuIFswLCAwXTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CiAgICBsZXQgbGFzdE9mZnNldCA9IDEsCiAgICAgIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBsYXN0T2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOwogICAgfQogICAgbGV0IG9mZnNldFNpemU7CiAgICBpZiAobGFzdE9mZnNldCA8IDB4MTAwKSB7CiAgICAgIG9mZnNldFNpemUgPSAxOwogICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMjsKICAgIH0gZWxzZSBpZiAobGFzdE9mZnNldCA8IDB4MTAwMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMzsKICAgIH0gZWxzZSB7CiAgICAgIG9mZnNldFNpemUgPSA0OwogICAgfQogICAgZGF0YS5wdXNoKG9mZnNldFNpemUpOwogICAgbGV0IHJlbGF0aXZlT2Zmc2V0ID0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgewogICAgICBpZiAob2Zmc2V0U2l6ZSA9PT0gMSkgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9CiAgICAgIGlmIChvYmplY3RzW2ldKSB7CiAgICAgICAgcmVsYXRpdmVPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlmICh0cmFja2Vyc1tpXSkgewogICAgICAgI
20HRyYWNrZXJzW2ldLm9mZnNldChkYXRhLmxlbmd0aCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKC4uLm9iamVjdHNbaV0pOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9nbHlwaGxpc3QuanMKCmNvbnN0IGdldEdseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkEgPSAweDAwNDE7CiAgdC5BRSA9IDB4MDBjNjsKICB0LkFFYWN1dGUgPSAweDAxZmM7CiAgdC5BRW1hY3JvbiA9IDB4MDFlMjsKICB0LkFFc21hbGwgPSAweGY3ZTY7CiAgdC5BYWN1dGUgPSAweDAwYzE7CiAgdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKICB0LkFicmV2ZSA9IDB4MDEwMjsKICB0LkFicmV2ZWFjdXRlID0gMHgxZWFlOwogIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CiAgdC5BYnJldmVkb3RiZWxvdyA9IDB4MWViNjsKICB0LkFicmV2ZWdyYXZlID0gMHgxZWIwOwogIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOwogIHQuQWJyZXZldGlsZGUgPSAweDFlYjQ7CiAgdC5BY2Fyb24gPSAweDAxY2Q7CiAgdC5BY2lyY2xlID0gMHgyNGI2OwogIHQuQWNpcmN1bWZsZXggPSAweDAwYzI7CiAgdC5BY2lyY3VtZmxleGFjdXRlID0gMHgxZWE0OwogIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKICB0LkFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTY7CiAgdC5BY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVhODsKICB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CiAgdC5BY2lyY3VtZmxleHRpbGRlID0gMHgxZWFhOwogIHQuQWN1dGUgPSAweGY2Yzk7CiAgdC5BY3V0ZXNtYWxsID0gMHhmN2I0OwogIHQuQWN5cmlsbGljID0gMHgwNDEwOwogIHQuQWRibGdyYXZlID0gMHgwMjAwOwogIHQuQWRpZXJlc2lzID0gMHgwMGM0OwogIHQuQWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDI7CiAgdC5BZGllcmVzaXNtYWNyb24gPSAweDAxZGU7CiAgdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKICB0LkFkb3RiZWxvdyA9IDB4MWVhMDsKICB0LkFkb3RtYWNyb24gPSAweDAxZTA7CiAgdC5BZ3JhdmUgPSAweDAwYzA7CiAgdC5BZ3JhdmVzbWFsbCA9IDB4ZjdlMDsKICB0LkFob29rYWJvdmUgPSAweDFlYTI7CiAgdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKICB0LkFpbnZlcnRlZGJyZXZlID0gMHgwMjAyOwogIHQuQWxwaGEgPSAweDAzOTE7CiAgdC5BbHBoYXRvbm9zID0gMHgwMzg2OwogIHQuQW1hY3JvbiA9IDB4MDEwMDsKICB0LkFtb25vc3BhY2UgPSAweGZmMjE7CiAgdC5Bb2dvbmVrID0gMHgwMTA0OwogIHQuQXJpbmcgPSAweDAwYzU7CiAgdC5BcmluZ2FjdXRlID0gMHgwMWZhOwogIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKICB0LkFyaW5nc21hbGwgPSAweGY3ZTU7CiAgdC5Bc21hbGwgPSAweGY3NjE7CiAgdC5BdGlsZGUgPSAweDAwYzM7CiAgdC5BdGlsZGVzbWFsbCA9IDB4ZjdlMzsKICB0LkF5YmFybWVuaWFuID0gMHgwNTMxOwogIHQuQiA9IDB4MDA0MjsKICB0LkJjaXJjbGUgPSAweDI0Yjc7CiAgdC5CZG90YWNjZW50ID0gMHgxZTAyOwogIHQuQmRvdGJlbG93ID0gMHgxZTA0OwogIHQuQmVjeXJpbGxpYyA9IDB4MDQxMTsKICB0LkJlbmFybWVuaWFuID0gMHgwNTMyOwogIHQuQmV0YSA9IDB4MDM5MjsKICB0LkJob29rID0gMHgwMTgxOwogIHQuQmxpbmViZWxvdyA9IDB4MWUwNjsKICB0LkJtb25vc3BhY2UgPSAweGZmMjI7CiAgdC5CcmV2ZXNtYWxsID0gMHhmNmY0OwogIHQuQnNtYWxsID0gMHhmNzYyOwogIHQuQnRvcGJhciA9IDB4MDE4MjsKICB0LkMgPSAweDAwNDM7CiAgdC5DYWFybWVuaWFuID0gMHgwNTNlOwogIHQuQ2FjdXRlID0gMHgwMTA2OwogIHQuQ2Fyb24gPSAweGY2Y2E7CiAgdC5DYXJvbnNtYWxsID0gMHhmNmY1OwogIHQuQ2Nhcm9uID0gMHgwMTBjOwogIHQuQ2NlZGlsbGEgPSAweDAwYzc7CiAgdC5DY2VkaWxsYWFjdXRlID0gMHgxZTA4OwogIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKICB0LkNjaXJjbGUgPSAweDI0Yjg7CiAgdC5DY2lyY3
20VtZmxleCA9IDB4MDEwODsKICB0LkNkb3QgPSAweDAxMGE7CiAgdC5DZG90YWNjZW50ID0gMHgwMTBhOwogIHQuQ2VkaWxsYXNtYWxsID0gMHhmN2I4OwogIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CiAgdC5DaGVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiYzsKICB0LkNoZWN5cmlsbGljID0gMHgwNDI3OwogIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CiAgdC5DaGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiNjsKICB0LkNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjQ7CiAgdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CiAgdC5DaGVraGFrYXNzaWFuY3lyaWxsaWMgPSAweDA0Y2I7CiAgdC5DaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI4OwogIHQuQ2hpID0gMHgwM2E3OwogIHQuQ2hvb2sgPSAweDAxODc7CiAgdC5DaXJjdW1mbGV4c21hbGwgPSAweGY2ZjY7CiAgdC5DbW9ub3NwYWNlID0gMHhmZjIzOwogIHQuQ29hcm1lbmlhbiA9IDB4MDU1MTsKICB0LkNzbWFsbCA9IDB4Zjc2MzsKICB0LkQgPSAweDAwNDQ7CiAgdC5EWiA9IDB4MDFmMTsKICB0LkRaY2Fyb24gPSAweDAxYzQ7CiAgdC5EYWFybWVuaWFuID0gMHgwNTM0OwogIHQuRGFmcmljYW4gPSAweDAxODk7CiAgdC5EY2Fyb24gPSAweDAxMGU7CiAgdC5EY2VkaWxsYSA9IDB4MWUxMDsKICB0LkRjaXJjbGUgPSAweDI0Yjk7CiAgdC5EY2lyY3VtZmxleGJlbG93ID0gMHgxZTEyOwogIHQuRGNyb2F0ID0gMHgwMTEwOwogIHQuRGRvdGFjY2VudCA9IDB4MWUwYTsKICB0LkRkb3RiZWxvdyA9IDB4MWUwYzsKICB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CiAgdC5EZWljb3B0aWMgPSAweDAzZWU7CiAgdC5EZWx0YSA9IDB4MjIwNjsKICB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CiAgdC5EaG9vayA9IDB4MDE4YTsKICB0LkRpZXJlc2lzID0gMHhmNmNiOwogIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKICB0LkRpZXJlc2lzR3JhdmUgPSAweGY2Y2Q7CiAgdC5EaWVyZXNpc3NtYWxsID0gMHhmN2E4OwogIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOwogIHQuRGplY3lyaWxsaWMgPSAweDA0MDI7CiAgdC5EbGluZWJlbG93ID0gMHgxZTBlOwogIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKICB0LkRvdGFjY2VudHNtYWxsID0gMHhmNmY3OwogIHQuRHNsYXNoID0gMHgwMTEwOwogIHQuRHNtYWxsID0gMHhmNzY0OwogIHQuRHRvcGJhciA9IDB4MDE4YjsKICB0LkR6ID0gMHgwMWYyOwogIHQuRHpjYXJvbiA9IDB4MDFjNTsKICB0LkR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUwOwogIHQuRHplY3lyaWxsaWMgPSAweDA0MDU7CiAgdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CiAgdC5FID0gMHgwMDQ1OwogIHQuRWFjdXRlID0gMHgwMGM5OwogIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CiAgdC5FYnJldmUgPSAweDAxMTQ7CiAgdC5FY2Fyb24gPSAweDAxMWE7CiAgdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOwogIHQuRWNoYXJtZW5pYW4gPSAweDA1MzU7CiAgdC5FY2lyY2xlID0gMHgyNGJhOwogIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CiAgdC5FY2lyY3VtZmxleGFjdXRlID0gMHgxZWJlOwogIHQuRWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxODsKICB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CiAgdC5FY2lyY3VtZmxleGdyYXZlID0gMHgxZWMwOwogIHQuRWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzI7CiAgdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOwogIHQuRWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNDsKICB0LkVjeXJpbGxpYyA9IDB4MDQwNDsKICB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKICB0LkVkaWVyZXNpcyA9IDB4MDBjYjsKICB0LkVkaWVyZXNpc3NtYWxsID0gMHhmN2ViOwogIHQuRWRvdCA9IDB4MDExNjsKICB0LkVkb3RhY2NlbnQgPSAweDAxMTY7CiAgdC5FZG90YmVsb3cgPSAweDFlYjg7CiAgdC5FZmN5cmlsbGljID0gMHgwNDI0OwogIHQuRWdyYXZlID0gMHgwMGM4OwogIHQuRWdyYXZlc21hbGwgPSAweGY3ZTg7CiAgdC5FaGFybWVuaWFuID0gMHgwNTM3OwogIHQuRWhvb2thYm92ZSA9IDB4MWViYTsKICB0LkVpZ2h0cm9tYW4gPSAweDIxNjc7CiAgdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKICB0LkVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY0OwogIHQuRWxjeXJpbGxpYyA9IDB4MDQxYjsKICB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOwogIHQuRW1hY3JvbiA9IDB4MDExMjsKICB0LkVtYWNyb25hY3V0ZSA9IDB4MWUxNjsKICB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKICB0LkVtY3lyaWxsaWMgPSAweDA0MWM7CiAgdC5FbW9ub3NwYWNlID0gMHhmZjI1OwogIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKICB0LkVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTI7CiAgdC5FbmcgPSAweDAxNGE7CiAgdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OwogIHQuRW5ob29rY3lyaWxsaWMgPSAweDA0Yzc7CiAgdC5Fb2dvbmVrID0gMHgwMTE4OwogIHQuRW9wZW4gPSAweDAxOTA7CiAgdC5FcHNpbG9uID0gMHgwMzk1OwogIHQuRXBzaWxvbnRvbm9zID0gMHgwMzg4OwogIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKICB0LkVyZXZlcnNlZCA9IDB4MDE4ZTsKICB0LkVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDJkOwogIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKICB0LkVzZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWE7CiAgdC5Fc2ggPSAweDAxYTk7CiAgdC5Fc21hbGwgPSAweGY3NjU7CiAgdC5FdGEgPSAweDAzOTc7CiAgdC5FdGFybWVuaWFuID0gMHgwNTM4OwogIHQuRXRhdG9ub3MgPSAweDAzODk7CiAgdC5FdGggPSAweDAwZDA7CiAgdC5FdGhzbWFsbCA9IDB4ZjdmMDsKICB0LkV0aWxkZSA9IDB4MWViYzsKICB0LkV0aWxkZWJlbG93ID0gMHgxZTFhOwogIHQuRXVybyA9IDB4MjBhYzsKICB0LkV6aCA9IDB4MDFiNzsKICB0LkV6aGNhcm9uID0gMHgwMWVlOwogIHQuRXpocmV2ZXJzZWQgPSAweDAxYjg7CiAgdC5GID0gMHgwMDQ2OwogIHQuRmNpcmNsZSA9IDB4MjRiYjsKICB0LkZkb3RhY2NlbnQgPSAweDFlMWU7CiAgdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKICB0LkZlaWNvcHRpYyA9IDB4MDNlNDsKICB0LkZob29rID0gMHgwMTkxOwogIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOwogIHQuRml2ZXJvbWFuID0gMHgyMTY0OwogIHQuRm1vbm9zcGFjZSA9IDB4ZmYyNjsKICB0LkZvdXJyb21hbiA9IDB4MjE2MzsKICB0LkZzbWFsbCA9IDB4Zjc2NjsKICB0LkcgPSAweDAwNDc7CiAgdC5HQnNxdWFyZSA9IDB4MzM4NzsKICB0LkdhY3V0ZSA9IDB4MDFmNDsKICB0LkdhbW1hID0gMHgwMzkzOwogIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OwogIHQuR2FuZ2lhY29wdGljID0gMHgwM2VhOwogIHQuR2JyZXZlID0gMHgwMTFlOwogIHQuR2Nhcm9uID0gMHgwMWU2OwogIHQuR2NlZGlsbGEgPSAweDAxMjI7CiAgdC5HY2lyY2xlID0gMHgyNGJjOwogIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CiAgdC5HY29tbWFhY2NlbnQgPSAweDAxMjI7CiAgdC5HZG90ID0gMHgwMTIwOwogIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKICB0LkdlY3lyaWxsaWMgPSAweDA0MTM7CiAgdC5HaGFkYXJtZW5pYW4gPSAweDA1NDI7CiAgdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CiAgdC5HaGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MjsKICB0LkdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkwOwogIHQuR2hvb2sgPSAweDAxOTM7CiAgdC5HaW1hcm1lbmlhbiA9IDB4MDUzMzsKICB0LkdqZWN5cmlsbGljID0gMHgwNDAzOwogIHQuR21hY3JvbiA9IDB4MWUyMDsKICB0Lkdtb25vc3BhY2UgPSAweGZmMjc7CiAgdC5HcmF2ZSA9IDB4ZjZjZTsKICB0LkdyYXZlc21hbGwgPSAweGY3NjA7CiAgdC5Hc21hbGwgPSAweGY3Njc7CiAgdC5Hc21hbGxob29rID0gMHgwMjliOwogIHQuR3N0cm9rZSA9IDB4MDFlNDsKICB0LkggPSAweDAwNDg7CiAgdC5IMTg1MzMgPSAweDI1Y2Y7CiAgdC5IMTg1NDMgPSAweDI1YWE7CiAgdC5IMTg1NTEgPSAweDI1YWI7CiAgdC5IMjIwNzMgPSAweDI1YTE7CiAgdC5IUHNxdWFyZSA9IDB4MzNjYjsKICB0LkhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTg7CiAgdC5IYWRlc2NlbmRlcm
20N5cmlsbGljID0gMHgwNGIyOwogIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKICB0LkhiYXIgPSAweDAxMjY7CiAgdC5IYnJldmViZWxvdyA9IDB4MWUyYTsKICB0LkhjZWRpbGxhID0gMHgxZTI4OwogIHQuSGNpcmNsZSA9IDB4MjRiZDsKICB0LkhjaXJjdW1mbGV4ID0gMHgwMTI0OwogIHQuSGRpZXJlc2lzID0gMHgxZTI2OwogIHQuSGRvdGFjY2VudCA9IDB4MWUyMjsKICB0Lkhkb3RiZWxvdyA9IDB4MWUyNDsKICB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CiAgdC5Ib2FybWVuaWFuID0gMHgwNTQwOwogIHQuSG9yaWNvcHRpYyA9IDB4MDNlODsKICB0LkhzbWFsbCA9IDB4Zjc2ODsKICB0Lkh1bmdhcnVtbGF1dCA9IDB4ZjZjZjsKICB0Lkh1bmdhcnVtbGF1dHNtYWxsID0gMHhmNmY4OwogIHQuSHpzcXVhcmUgPSAweDMzOTA7CiAgdC5JID0gMHgwMDQ5OwogIHQuSUFjeXJpbGxpYyA9IDB4MDQyZjsKICB0LklKID0gMHgwMTMyOwogIHQuSVVjeXJpbGxpYyA9IDB4MDQyZTsKICB0LklhY3V0ZSA9IDB4MDBjZDsKICB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOwogIHQuSWJyZXZlID0gMHgwMTJjOwogIHQuSWNhcm9uID0gMHgwMWNmOwogIHQuSWNpcmNsZSA9IDB4MjRiZTsKICB0LkljaXJjdW1mbGV4ID0gMHgwMGNlOwogIHQuSWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdlZTsKICB0LkljeXJpbGxpYyA9IDB4MDQwNjsKICB0LklkYmxncmF2ZSA9IDB4MDIwODsKICB0LklkaWVyZXNpcyA9IDB4MDBjZjsKICB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOwogIHQuSWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTQ7CiAgdC5JZGllcmVzaXNzbWFsbCA9IDB4ZjdlZjsKICB0Lklkb3QgPSAweDAxMzA7CiAgdC5JZG90YWNjZW50ID0gMHgwMTMwOwogIHQuSWRvdGJlbG93ID0gMHgxZWNhOwogIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OwogIHQuSWVjeXJpbGxpYyA9IDB4MDQxNTsKICB0LklmcmFrdHVyID0gMHgyMTExOwogIHQuSWdyYXZlID0gMHgwMGNjOwogIHQuSWdyYXZlc21hbGwgPSAweGY3ZWM7CiAgdC5JaG9va2Fib3ZlID0gMHgxZWM4OwogIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKICB0LklpbnZlcnRlZGJyZXZlID0gMHgwMjBhOwogIHQuSWlzaG9ydGN5cmlsbGljID0gMHgwNDE5OwogIHQuSW1hY3JvbiA9IDB4MDEyYTsKICB0LkltYWNyb25jeXJpbGxpYyA9IDB4MDRlMjsKICB0Lkltb25vc3BhY2UgPSAweGZmMjk7CiAgdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKICB0LklvY3lyaWxsaWMgPSAweDA0MDE7CiAgdC5Jb2dvbmVrID0gMHgwMTJlOwogIHQuSW90YSA9IDB4MDM5OTsKICB0LklvdGFhZnJpY2FuID0gMHgwMTk2OwogIHQuSW90YWRpZXJlc2lzID0gMHgwM2FhOwogIHQuSW90YXRvbm9zID0gMHgwMzhhOwogIHQuSXNtYWxsID0gMHhmNzY5OwogIHQuSXN0cm9rZSA9IDB4MDE5NzsKICB0Lkl0aWxkZSA9IDB4MDEyODsKICB0Lkl0aWxkZWJlbG93ID0gMHgxZTJjOwogIHQuSXpoaXRzYWN5cmlsbGljID0gMHgwNDc0OwogIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CiAgdC5KID0gMHgwMDRhOwogIHQuSmFhcm1lbmlhbiA9IDB4MDU0MTsKICB0LkpjaXJjbGUgPSAweDI0YmY7CiAgdC5KY2lyY3VtZmxleCA9IDB4MDEzNDsKICB0LkplY3lyaWxsaWMgPSAweDA0MDg7CiAgdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CiAgdC5KbW9ub3NwYWNlID0gMHhmZjJhOwogIHQuSnNtYWxsID0gMHhmNzZhOwogIHQuSyA9IDB4MDA0YjsKICB0LktCc3F1YXJlID0gMHgzMzg1OwogIHQuS0tzcXVhcmUgPSAweDMzY2Q7CiAgdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKICB0LkthY3V0ZSA9IDB4MWUzMDsKICB0LkthY3lyaWxsaWMgPSAweDA0MWE7CiAgdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOwogIHQuS2Fob29rY3lyaWxsaWMgPSAweDA0YzM7CiAgdC5LYXBwYSA9IDB4MDM5YTsKICB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CiAgdC5LYXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWM7CiAgdC5LY2Fyb24gPSAweDAxZTg7CiAgdC5LY2VkaWxsYSA9IDB4MDEzNjsKICB0LktjaXJjbGUgPSAweDI0YzA7CiAgdC5LY29tbWFhY2NlbnQgPSAweDAxMzY7CiAgdC5LZG90YmVsb3cgPSAweDFlMzI7CiAgdC5LZWhhcm1lbmlhbiA9IDB4MDU1NDsKICB0LktlbmFybWVuaWFuID0gMHgwNTNmOwogIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CiAgdC5LaGVpY29wdGljID0gMHgwM2U2OwogIHQuS2hvb2sgPSAweDAxOTg7CiAgdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKICB0LktsaW5lYmVsb3cgPSAweDFlMzQ7CiAgdC5LbW9ub3NwYWNlID0gMHhmZjJiOwogIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKICB0LktvcHBhZ3JlZWsgPSAweDAzZGU7CiAgdC5Lc2ljeXJpbGxpYyA9IDB4MDQ2ZTsKICB0LktzbWFsbCA9IDB4Zjc2YjsKICB0LkwgPSAweDAwNGM7CiAgdC5MSiA9IDB4MDFjNzsKICB0LkxMID0gMHhmNmJmOwogIHQuTGFjdXRlID0gMHgwMTM5OwogIHQuTGFtYmRhID0gMHgwMzliOwogIHQuTGNhcm9uID0gMHgwMTNkOwogIHQuTGNlZGlsbGEgPSAweDAxM2I7CiAgdC5MY2lyY2xlID0gMHgyNGMxOwogIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKICB0Lkxjb21tYWFjY2VudCA9IDB4MDEzYjsKICB0Lkxkb3QgPSAweDAxM2Y7CiAgdC5MZG90YWNjZW50ID0gMHgwMTNmOwogIHQuTGRvdGJlbG93ID0gMHgxZTM2OwogIHQuTGRvdGJlbG93bWFjcm9uID0gMHgxZTM4OwogIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOwogIHQuTGogPSAweDAxYzg7CiAgdC5MamVjeXJpbGxpYyA9IDB4MDQwOTsKICB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CiAgdC5MbW9ub3NwYWNlID0gMHhmZjJjOwogIHQuTHNsYXNoID0gMHgwMTQxOwogIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CiAgdC5Mc21hbGwgPSAweGY3NmM7CiAgdC5NID0gMHgwMDRkOwogIHQuTUJzcXVhcmUgPSAweDMzODY7CiAgdC5NYWNyb24gPSAweGY2ZDA7CiAgdC5NYWNyb25zbWFsbCA9IDB4ZjdhZjsKICB0Lk1hY3V0ZSA9IDB4MWUzZTsKICB0Lk1jaXJjbGUgPSAweDI0YzI7CiAgdC5NZG90YWNjZW50ID0gMHgxZTQwOwogIHQuTWRvdGJlbG93ID0gMHgxZTQyOwogIHQuTWVuYXJtZW5pYW4gPSAweDA1NDQ7CiAgdC5NbW9ub3NwYWNlID0gMHhmZjJkOwogIHQuTXNtYWxsID0gMHhmNzZkOwogIHQuTXR1cm5lZCA9IDB4MDE5YzsKICB0Lk11ID0gMHgwMzljOwogIHQuTiA9IDB4MDA0ZTsKICB0Lk5KID0gMHgwMWNhOwogIHQuTmFjdXRlID0gMHgwMTQzOwogIHQuTmNhcm9uID0gMHgwMTQ3OwogIHQuTmNlZGlsbGEgPSAweDAxNDU7CiAgdC5OY2lyY2xlID0gMHgyNGMzOwogIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKICB0Lk5jb21tYWFjY2VudCA9IDB4MDE0NTsKICB0Lk5kb3RhY2NlbnQgPSAweDFlNDQ7CiAgdC5OZG90YmVsb3cgPSAweDFlNDY7CiAgdC5OaG9va2xlZnQgPSAweDAxOWQ7CiAgdC5OaW5lcm9tYW4gPSAweDIxNjg7CiAgdC5OaiA9IDB4MDFjYjsKICB0Lk5qZWN5cmlsbGljID0gMHgwNDBhOwogIHQuTmxpbmViZWxvdyA9IDB4MWU0ODsKICB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CiAgdC5Ob3dhcm1lbmlhbiA9IDB4MDU0NjsKICB0Lk5zbWFsbCA9IDB4Zjc2ZTsKICB0Lk50aWxkZSA9IDB4MDBkMTsKICB0Lk50aWxkZXNtYWxsID0gMHhmN2YxOwogIHQuTnUgPSAweDAzOWQ7CiAgdC5PID0gMHgwMDRmOwogIHQuT0UgPSAweDAxNTI7CiAgdC5PRXNtYWxsID0gMHhmNmZhOwogIHQuT2FjdXRlID0gMHgwMGQzOwogIHQuT2FjdXRlc21hbGwgPSAweGY3ZjM7CiAgdC5PYmFycmVkY3lyaWxsaWMgPSAweDA0ZTg7CiAgdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKICB0Lk9icmV2ZSA9IDB4MDE0ZTsKICB0Lk9jYXJvbiA9IDB4MDFkMTsKICB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOwogIHQuT2NpcmNsZSA9IDB4MjRjNDsKICB0Lk9jaXJjdW1mbGV4ID0gMHgwMGQ0OwogIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKICB0Lk9jaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlZDg7CiAgdC5PY2lyY3VtZmxleGdyYXZlID0gMHgxZWQyOwogIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CiAgdC5PY2lyY3VtZmxleHNtYWxsID0gMHhmN2Y0OwogIHQuT2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNjsKICB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKICB0Lk9kYmxhY3V0ZSA9IDB4MDE1MDsKICB0Lk9kYmxncmF2ZSA9IDB4MDIwYzsKICB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKICB0Lk9kaWVyZXNpc2N5cmlsbGljID0gMHgwNGU2OwogIHQuT2RpZXJlc2lzc21hbGwgPSAweGY3ZjY7CiAgdC5PZG90YmVsb3cgPSAweDFlY2M7CiAgdC5PZ29uZWtzbWFsbCA9IDB4ZjZmYjsKICB0Lk9ncmF2ZSA9IDB4MDBkMjsKICB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOwogIHQuT2hhcm1lbmlhbiA9IDB4MDU1NTsKICB0Lk9obSA9IDB4MjEyNjsKICB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CiAgdC5PaG9ybiA9IDB4MDFhMDsKICB0Lk9ob3JuYWN1dGUgPSAweDFlZGE7CiAgdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOwogIHQuT2hvcm5ncmF2ZSA9IDB4MWVkYzsKICB0Lk9ob3JuaG9va2Fib3ZlID0gMHgxZWRlOwogIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKICB0Lk9odW5nYXJ1bWxhdXQgPSAweDAxNTA7CiAgdC5PaSA9IDB4MDFhMjsKICB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOwogIHQuT21hY3JvbiA9IDB4MDE0YzsKICB0Lk9tYWNyb25hY3V0ZSA9IDB4MWU1MjsKICB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKICB0Lk9tZWdhID0gMHgyMTI2OwogIHQuT21lZ2FjeXJpbGxpYyA9IDB4MDQ2MDsKICB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CiAgdC5PbWVnYXJvdW5kY3lyaWxsaWMgPSAweDA0N2E7CiAgdC5PbWVnYXRpdGxvY3lyaWxsaWMgPSAweDA0N2M7CiAgdC5PbWVnYXRvbm9zID0gMHgwMzhmOwogIHQuT21pY3JvbiA9IDB4MDM5ZjsKICB0Lk9taWNyb250b25vcyA9IDB4MDM4YzsKICB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CiAgdC5PbmVyb21hbiA9IDB4MjE2MDsKICB0Lk9vZ29uZWsgPSAweDAxZWE7CiAgdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOwogIHQuT29wZW4gPSAweDAxODY7CiAgdC5Pc2xhc2ggPSAweDAwZDg7CiAgdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKICB0Lk9zbGFzaHNtYWxsID0gMHhmN2Y4OwogIHQuT3NtYWxsID0gMHhmNzZmOwogIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOwogIHQuT3RjeXJpbGxpYyA9IDB4MDQ3ZTsKICB0Lk90aWxkZSA9IDB4MDBkNTsKICB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOwogIHQuT3RpbGRlZGllcmVzaXMgPSAweDFlNGU7CiAgdC5PdGlsZGVzbWFsbCA9IDB4ZjdmNTsKICB0LlAgPSAweDAwNTA7CiAgdC5QYWN1dGUgPSAweDFlNTQ7CiAgdC5QY2lyY2xlID0gMHgyNGM1OwogIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKICB0LlBlY3lyaWxsaWMgPSAweDA0MWY7CiAgdC5QZWhhcm1lbmlhbiA9IDB4MDU0YTsKICB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OwogIHQuUGhpID0gMHgwM2E2OwogIHQuUGhvb2sgPSAweDAxYTQ7CiAgdC5QaSA9IDB4MDNhMDsKICB0LlBp
20d3Jhcm1lbmlhbiA9IDB4MDU1MzsKICB0LlBtb25vc3BhY2UgPSAweGZmMzA7CiAgdC5Qc2kgPSAweDAzYTg7CiAgdC5Qc2ljeXJpbGxpYyA9IDB4MDQ3MDsKICB0LlBzbWFsbCA9IDB4Zjc3MDsKICB0LlEgPSAweDAwNTE7CiAgdC5RY2lyY2xlID0gMHgyNGM2OwogIHQuUW1vbm9zcGFjZSA9IDB4ZmYzMTsKICB0LlFzbWFsbCA9IDB4Zjc3MTsKICB0LlIgPSAweDAwNTI7CiAgdC5SYWFybWVuaWFuID0gMHgwNTRjOwogIHQuUmFjdXRlID0gMHgwMTU0OwogIHQuUmNhcm9uID0gMHgwMTU4OwogIHQuUmNlZGlsbGEgPSAweDAxNTY7CiAgdC5SY2lyY2xlID0gMHgyNGM3OwogIHQuUmNvbW1hYWNjZW50ID0gMHgwMTU2OwogIHQuUmRibGdyYXZlID0gMHgwMjEwOwogIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKICB0LlJkb3RiZWxvdyA9IDB4MWU1YTsKICB0LlJkb3RiZWxvd21hY3JvbiA9IDB4MWU1YzsKICB0LlJlaGFybWVuaWFuID0gMHgwNTUwOwogIHQuUmZyYWt0dXIgPSAweDIxMWM7CiAgdC5SaG8gPSAweDAzYTE7CiAgdC5SaW5nc21hbGwgPSAweGY2ZmM7CiAgdC5SaW52ZXJ0ZWRicmV2ZSA9IDB4MDIxMjsKICB0LlJsaW5lYmVsb3cgPSAweDFlNWU7CiAgdC5SbW9ub3NwYWNlID0gMHhmZjMyOwogIHQuUnNtYWxsID0gMHhmNzcyOwogIHQuUnNtYWxsaW52ZXJ0ZWQgPSAweDAyODE7CiAgdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OwogIHQuUyA9IDB4MDA1MzsKICB0LlNGMDEwMDAwID0gMHgyNTBjOwogIHQuU0YwMjAwMDAgPSAweDI1MTQ7CiAgdC5TRjAzMDAwMCA9IDB4MjUxMDsKICB0LlNGMDQwMDAwID0gMHgyNTE4OwogIHQuU0YwNTAwMDAgPSAweDI1M2M7CiAgdC5TRjA2MDAwMCA9IDB4MjUyYzsKICB0LlNGMDcwMDAwID0gMHgyNTM0OwogIHQuU0YwODAwMDAgPSAweDI1MWM7CiAgdC5TRjA5MDAwMCA9IDB4MjUyNDsKICB0LlNGMTAwMDAwID0gMHgyNTAwOwogIHQuU0YxMTAwMDAgPSAweDI1MDI7CiAgdC5TRjE5MDAwMCA9IDB4MjU2MTsKICB0LlNGMjAwMDAwID0gMHgyNTYyOwogIHQuU0YyMTAwMDAgPSAweDI1NTY7CiAgdC5TRjIyMDAwMCA9IDB4MjU1NTsKICB0LlNGMjMwMDAwID0gMHgyNTYzOwogIHQuU0YyNDAwMDAgPSAweDI1NTE7CiAgdC5TRjI1MDAwMCA9IDB4MjU1NzsKICB0LlNGMjYwMDAwID0gMHgyNTVkOwogIHQuU0YyNzAwMDAgPSAweDI1NWM7CiAgdC5TRjI4MDAwMCA9IDB4MjU1YjsKICB0LlNGMzYwMDAwID0gMHgyNTVlOwogIHQuU0YzNzAwMDAgPSAweDI1NWY7CiAgdC5TRjM4MDAwMCA9IDB4MjU1YTsKICB0LlNGMzkwMDAwID0gMHgyNTU0OwogIHQuU0Y0MDAwMDAgPSAweDI1Njk7CiAgdC5TRjQxMDAwMCA9IDB4MjU2NjsKICB0LlNGNDIwMDAwID0gMHgyNTYwOwogIHQuU0Y0MzAwMDAgPSAweDI1NTA7CiAgdC5TRjQ0MDAwMCA9IDB4MjU2YzsKICB0LlNGNDUwMDAwID0gMHgyNTY3OwogIHQuU0Y0NjAwMDAgPSAweDI1Njg7CiAgdC5TRjQ3MDAwMCA9IDB4MjU2NDsKICB0LlNGNDgwMDAwID0gMHgyNTY1OwogIHQuU0Y0OTAwMDAgPSAweDI1NTk7CiAgdC5TRjUwMDAwMCA9IDB4MjU1ODsKICB0LlNGNTEwMDAwID0gMHgyNTUyOwogIHQuU0Y1MjAwMDAgPSAweDI1NTM7CiAgdC5TRjUzMDAwMCA9IDB4MjU2YjsKICB0LlNGNTQwMDAwID0gMHgyNTZhOwogIHQuU2FjdXRlID0gMHgwMTVhOwogIHQuU2FjdXRlZG90YWNjZW50ID0gMHgxZTY0OwogIHQuU2FtcGlncmVlayA9IDB4MDNlMDsKICB0LlNjYXJvbiA9IDB4MDE2MDsKICB0LlNjYXJvbmRvdGFjY2VudCA9IDB4MWU2NjsKICB0LlNjYXJvbnNtYWxsID0gMHhmNmZkOwogIHQuU2NlZGlsbGEgPSAweDAxNWU7CiAgdC5TY2h3YSA9IDB4MDE4ZjsKICB0LlNjaHdhY3lyaWxsaWMgPSAweDA0ZDg7CiAgdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CiAgdC5TY2lyY2xlID0gMHgyNGM4OwogIHQuU2NpcmN1bWZsZXggPSAweDAxNWM7CiAgdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CiAgdC5TZG90YWNjZW50ID0gMHgxZTYwOwogIHQuU2RvdGJlbG93ID0gMHgxZTYyOwogIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OwogIHQuU2VoYXJtZW5pYW4gPSAweDA1NGQ7CiAgdC5TZXZlbnJvbWFuID0gMHgyMTY2OwogIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CiAgdC5TaGFjeXJpbGxpYyA9IDB4MDQyODsKICB0LlNoY2hhY3lyaWxsaWMgPSAweDA0Mjk7CiAgdC5TaGVpY29wdGljID0gMHgwM2UyOwogIHQuU2hoYWN5cmlsbGljID0gMHgwNGJhOwogIHQuU2hpbWFjb3B0aWMgPSAweDAzZWM7CiAgdC5TaWdtYSA9IDB4MDNhMzsKICB0LlNpeHJvbWFuID0gMHgyMTY1OwogIHQuU21vbm9zcGFjZSA9IDB4ZmYzMzsKICB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CiAgdC5Tc21hbGwgPSAweGY3NzM7CiAgdC5TdGlnbWFncmVlayA9IDB4MDNkYTsKICB0LlQgPSAweDAwNTQ7CiAgdC5UYXUgPSAweDAzYTQ7CiAgdC5UYmFyID0gMHgwMTY2OwogIHQuVGNhcm9uID0gMHgwMTY0OwogIHQuVGNlZGlsbGEgPSAweDAxNjI7CiAgdC5UY2lyY2xlID0gMHgyNGM5OwogIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKICB0LlRjb21tYWFjY2VudCA9IDB4MDE2MjsKICB0LlRkb3RhY2NlbnQgPSAweDFlNmE7CiAgdC5UZG90YmVsb3cgPSAweDFlNmM7CiAgdC5UZWN5cmlsbGljID0gMHgwNDIyOwogIHQuVGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYzsKICB0LlRlbnJvbWFuID0gMHgyMTY5OwogIHQuVGV0c2VjeXJpbGxpYyA9IDB4MDRiNDsKICB0LlRoZXRhID0gMHgwMzk4OwogIHQuVGhvb2sgPSAweDAxYWM7CiAgdC5UaG9ybiA9IDB4MDBkZTsKICB0LlRob3Juc21hbGwgPSAweGY3ZmU7CiAgdC5UaHJlZXJvbWFuID0gMHgyMTYyOwogIHQuVGlsZGVzbWFsbCA9IDB4ZjZmZTsKICB0LlRpd25hcm1lbmlhbiA9IDB4MDU0ZjsKICB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CiAgdC5UbW9ub3NwYWNlID0gMHhmZjM0OwogIHQuVG9hcm1lbmlhbiA9IDB4MDUzOTsKICB0LlRvbmVmaXZlID0gMHgwMWJjOwogIHQuVG9uZXNpeCA9IDB4MDE4NDsKICB0LlRvbmV0d28gPSAweDAxYTc7CiAgdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKICB0LlRzZWN5cmlsbGljID0gMHgwNDI2OwogIHQuVHNoZWN5cmlsbGljID0gMHgwNDBiOwogIHQuVHNtYWxsID0gMHhmNzc0OwogIHQuVHdlbHZlcm9tYW4gPSAweDIxNmI7CiAgdC5Ud29yb21hbiA9IDB4MjE2MTsKICB0LlUgPSAweDAwNTU7CiAgdC5VYWN1dGUgPSAweDAwZGE7CiAgdC5VYWN1dGVzbWFsbCA9IDB4ZjdmYTsKICB0LlVicmV2ZSA9IDB4MDE2YzsKICB0LlVjYXJvbiA9IDB4MDFkMzsKICB0LlVjaXJjbGUgP
20SAweDI0Y2E7CiAgdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKICB0LlVjaXJjdW1mbGV4YmVsb3cgPSAweDFlNzY7CiAgdC5VY2lyY3VtZmxleHNtYWxsID0gMHhmN2ZiOwogIHQuVWN5cmlsbGljID0gMHgwNDIzOwogIHQuVWRibGFjdXRlID0gMHgwMTcwOwogIHQuVWRibGdyYXZlID0gMHgwMjE0OwogIHQuVWRpZXJlc2lzID0gMHgwMGRjOwogIHQuVWRpZXJlc2lzYWN1dGUgPSAweDAxZDc7CiAgdC5VZGllcmVzaXNiZWxvdyA9IDB4MWU3MjsKICB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OwogIHQuVWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjA7CiAgdC5VZGllcmVzaXNncmF2ZSA9IDB4MDFkYjsKICB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKICB0LlVkaWVyZXNpc3NtYWxsID0gMHhmN2ZjOwogIHQuVWRvdGJlbG93ID0gMHgxZWU0OwogIHQuVWdyYXZlID0gMHgwMGQ5OwogIHQuVWdyYXZlc21hbGwgPSAweGY3Zjk7CiAgdC5VaG9va2Fib3ZlID0gMHgxZWU2OwogIHQuVWhvcm4gPSAweDAxYWY7CiAgdC5VaG9ybmFjdXRlID0gMHgxZWU4OwogIHQuVWhvcm5kb3RiZWxvdyA9IDB4MWVmMDsKICB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CiAgdC5VaG9ybmhvb2thYm92ZSA9IDB4MWVlYzsKICB0LlVob3JudGlsZGUgPSAweDFlZWU7CiAgdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOwogIHQuVWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYyOwogIHQuVWludmVydGVkYnJldmUgPSAweDAyMTY7CiAgdC5Va2N5cmlsbGljID0gMHgwNDc4OwogIHQuVW1hY3JvbiA9IDB4MDE2YTsKICB0LlVtYWNyb25jeXJpbGxpYyA9IDB4MDRlZTsKICB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKICB0LlVtb25vc3BhY2UgPSAweGZmMzU7CiAgdC5Vb2dvbmVrID0gMHgwMTcyOwogIHQuVXBzaWxvbiA9IDB4MDNhNTsKICB0LlVwc2lsb24xID0gMHgwM2QyOwogIHQuVXBzaWxvbmFjdXRlaG9va3N5bWJvbGdyZWVrID0gMHgwM2QzOwogIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CiAgdC5VcHNpbG9uZGllcmVzaXMgPSAweDAzYWI7CiAgdC5VcHNpbG9uZGllcmVzaXNob29rc3ltYm9sZ3JlZWsgPSAweDAzZDQ7CiAgdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKICB0LlVwc2lsb250b25vcyA9IDB4MDM4ZTsKICB0LlVyaW5nID0gMHgwMTZlOwogIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CiAgdC5Vc21hbGwgPSAweGY3NzU7CiAgdC5Vc3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZTsKICB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOwogIHQuVXRpbGRlID0gMHgwMTY4OwogIHQuVXRpbGRlYWN1dGUgPSAweDFlNzg7CiAgdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKICB0LlYgPSAweDAwNTY7CiAgdC5WY2lyY2xlID0gMHgyNGNiOwogIHQuVmRvdGJlbG93ID0gMHgxZTdlOwogIHQuVmVjeXJpbGxpYyA9IDB4MDQxMjsKICB0LlZld2FybWVuaWFuID0gMHgwNTRlOwogIHQuVmhvb2sgPSAweDAxYjI7CiAgdC5WbW9ub3NwYWNlID0gMHhmZjM2OwogIHQuVm9hcm1lbmlhbiA9IDB4MDU0ODsKICB0LlZzbWFsbCA9IDB4Zjc3NjsKICB0LlZ0aWxkZSA9IDB4MWU3YzsKICB0LlcgPSAweDAwNTc7CiAgdC5XYWN1dGUgPSAweDFlODI7CiAgdC5XY2lyY2xlID0gMHgyNGNjOwogIHQuV2NpcmN1bWZsZXggPSAweDAxNzQ7CiAgdC5XZGllcmVzaXMgPSAweDFlODQ7CiAgdC5XZG90YWNjZW50ID0gMHgxZTg2OwogIHQuV2RvdGJlbG93ID0gMHgxZTg4OwogIHQuV2dyYXZlID0gMHgxZTgwOwogIHQuV21vbm9zcGFjZSA9IDB4ZmYzNzsKICB0LldzbWFsbCA9IDB4Zjc3NzsKICB0LlggPSAweDAwNTg7CiAgdC5YY2lyY2xlID0gMHgyNGNkOwogIHQuWGRpZXJlc2lzID0gMHgxZThjOwogIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKICB0LlhlaGFybWVuaWFuID0gMHgwNTNkOwogIHQuWGkgPSAweDAzOWU7CiAgdC5YbW9ub3NwYWNlID0gMHhmZjM4OwogIHQuWHNtYWxsID0gMHhmNzc4OwogIHQuWSA9IDB4MDA1OTsKICB0LllhY3V0ZSA9IDB4MDBkZDsKICB0LllhY3V0ZXNtYWxsID0gMHhmN2ZkOwogIHQuWWF0Y3lyaWxsaWMgPSAweDA0NjI7CiAgdC5ZY2lyY2xlID0gMHgyNGNlOwogIHQuWWNpcmN1bWZsZXggPSAweDAxNzY7CiAgdC5ZZGllcmVzaXMgPSAweDAxNzg7CiAgdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKICB0Lllkb3RhY2NlbnQgPSAweDFlOGU7CiAgdC5ZZG90YmVsb3cgPSAweDFlZjQ7CiAgdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CiAgdC5ZZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmODsKICB0LllncmF2ZSA9IDB4MWVmMjsKICB0Lllob29rID0gMHgwMWIzOwogIHQuWWhvb2thYm92ZSA9IDB4MWVmNjsKICB0LllpYXJtZW5pYW4gPSAweDA1NDU7CiAgdC5ZaWN5cmlsbGljID0gMHgwNDA3OwogIHQuWWl3bmFybWVuaWFuID0gMHgwNTUyOwogIHQuWW1vbm9zcGFjZSA9IDB4ZmYzOTsKICB0LllzbWFsbCA9IDB4Zjc3OTsKICB0Lll0aWxkZSA9IDB4MWVmODsKICB0Lll1c2JpZ2N5cmlsbGljID0gMHgwNDZhOwogIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKICB0Lll1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY2OwogIHQuWXVzbGl0dGxlaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2ODsKICB0LlogPSAweDAwNWE7CiAgdC5aYWFybWVuaWFuID0gMHgwNTM2OwogIHQuWmFjdXRlID0gMHgwMTc5OwogIHQuWmNhcm9uID0gMHgwMTdkOwogIHQuWmNhcm9uc21hbGwgPSAweGY2ZmY7CiAgdC5aY2lyY2xlID0gMHgyNGNmOwogIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CiAgdC5aZG90ID0gMHgwMTdiOwogIHQuWmRvdGFjY2VudCA9IDB4MDE3YjsKICB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKICB0LlplY3lyaWxsaWMgPSAweDA0MTc7CiAgdC5aZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk4OwogIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOwogIHQuWmV0YSA9IDB4MDM5NjsKICB0LlpoZWFybWVuaWFuID0gMHgwNTNhOwogIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKICB0LlpoZWN5cmlsbGljID0gMHgwNDE2OwogIHQuWmhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTY7CiAgdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOwogIHQuWmxpbmViZWxvdyA9IDB4MWU5NDsKICB0Llptb25vc3BhY2UgPSAweGZmM2E7CiAgdC5ac21hbGwgPSAweGY3N2E7CiAgdC5ac3Ryb2tlID0gMHgwMWI1OwogIHQuYSA9IDB4MDA2MTsKICB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKICB0LmFhY3V0ZSA9IDB4MDBlMTsKICB0LmFhZGV2YSA9IDB4MDkwNjsKICB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CiAgdC5hYWd1cm11a2hpID0gMHgwYTA2OwogIHQuYWFtYXRyYWd1cm11a2hpID0gMHgwYTNlOwogIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKICB0LmFhdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZTsKICB0LmFhdm93ZWxzaWduZGV2YSA9IDB4MDkzZTsKICB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CiAgdC5hYmJyZXZpYXRpb25tYXJrYXJtZW5pYW4gPSAweDA1NWY7CiAgdC5hYmJyZXZpYXRpb25zaWduZGV2YSA9IDB4MDk3MDsKICB0LmFiZW5nYWxpID0gMHgwOTg1OwogIHQuYWJvcG9tb2ZvID0gMHgzMTFhOwogIHQuYWJyZXZlID0gMHgwMTAzOwogIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CiAgdC5hYnJldmVjeXJpbGxpYyA9IDB4MDRkMTsKICB0LmFicmV2ZWRvdGJlbG93ID0gMHgxZWI3OwogIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CiAgdC5hYnJldmVob29rYWJvdmUgPSAweDFlYjM7CiAgdC5hYnJldmV0aWxkZSA9IDB4MWViNTsKICB0LmFjYXJvbiA9IDB4MDFjZTsKICB0LmFjaXJjbGUgP
20SAweDI0ZDA7CiAgdC5hY2lyY3VtZmxleCA9IDB4MDBlMjsKICB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CiAgdC5hY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWFkOwogIHQuYWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNzsKICB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OwogIHQuYWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVhYjsKICB0LmFjdXRlID0gMHgwMGI0OwogIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKICB0LmFjdXRlY21iID0gMHgwMzAxOwogIHQuYWN1dGVjb21iID0gMHgwMzAxOwogIHQuYWN1dGVkZXZhID0gMHgwOTU0OwogIHQuYWN1dGVsb3dtb2QgPSAweDAyY2Y7CiAgdC5hY3V0ZXRvbmVjbWIgPSAweDAzNDE7CiAgdC5hY3lyaWxsaWMgPSAweDA0MzA7CiAgdC5hZGJsZ3JhdmUgPSAweDAyMDE7CiAgdC5hZGRha2d1cm11a2hpID0gMHgwYTcxOwogIHQuYWRldmEgPSAweDA5MDU7CiAgdC5hZGllcmVzaXMgPSAweDAwZTQ7CiAgdC5hZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMzsKICB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKICB0LmFkb3RiZWxvdyA9IDB4MWVhMTsKICB0LmFkb3RtYWNyb24gPSAweDAxZTE7CiAgdC5hZSA9IDB4MDBlNjsKICB0LmFlYWN1dGUgPSAweDAxZmQ7CiAgdC5hZWtvcmVhbiA9IDB4MzE1MDsKICB0LmFlbWFjcm9uID0gMHgwMWUzOwogIHQuYWZpaTAwMjA4ID0gMHgyMDE1OwogIHQuYWZpaTA4OTQxID0gMHgyMGE0OwogIHQuYWZpaTEwMDE3ID0gMHgwNDEwOwogIHQuYWZpaTEwMDE4ID0gMHgwNDExOwogIHQuYWZpaTEwMDE5ID0gMHgwNDEyOwogIHQuYWZpaTEwMDIwID0gMHgwNDEzOwogIHQuYWZpaTEwMDIxID0gMHgwNDE0OwogIHQuYWZpaTEwMDIyID0gMHgwNDE1OwogIHQuYWZpaTEwMDIzID0gMHgwNDAxOwogIHQuYWZpaTEwMDI0ID0gMHgwNDE2OwogIHQuYWZpaTEwMDI1ID0gMHgwNDE3OwogIHQuYWZpaTEwMDI2ID0gMHgwNDE4OwogIHQuYWZpaTEwMDI3ID0gMHgwNDE5OwogIHQuYWZpaTEwMDI4ID0gMHgwNDFhOwogIHQuYWZpaTEwMDI5ID0gMHgwNDFiOwogIHQuYWZpaTEwMDMwID0gMHgwNDFjOwogIHQuYWZpaTEwMDMxID0gMHgwNDFkOwogIHQuYWZpaTEwMDMyID0gMHgwNDFlOwogIHQuYWZpaTEwMDMzID0gMHgwNDFmOwogIHQuYWZpaTEwMDM0ID0gMHgwNDIwOwogIHQuYWZpaTEwMDM1ID0gMHgwNDIxOwogIHQuYWZpaTEwMDM2ID0gMHgwNDIyOwogIHQuYWZpaTEwMDM3ID0gMHgwNDIzOwogIHQuYWZpaTEwMDM4ID0gMHgwNDI0OwogIHQuYWZpaTEwMDM5ID0gMHgwNDI1OwogIHQuYWZpaTEwMDQwID0gMHgwNDI2OwogIHQuYWZpaTEwMDQxID0gMHgwNDI3OwogIHQuYWZpaTEwMDQyID0gMHgwNDI4OwogIHQuYWZpaTEwMDQzID0gMHgwNDI5OwogIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOwogIHQuYWZpaTEwMDQ1ID0gMHgwNDJiOwogIHQuYWZpaTEwMDQ2ID0gMHgwNDJjOwogIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOwogIHQuYWZpaTEwMDQ4ID0gMHgwNDJlOwogIHQuYWZpaTEwMDQ5ID0gMHgwNDJmOwogIHQuYWZpaTEwMDUwID0gMHgwNDkwOwogIHQuYWZpaTEwMDUxID0gMHgwNDAyOwogIHQuYWZpaTEwMDUyID0gMHgwNDAzOwogIHQuYWZpaTEwMDUzID0gMHgwNDA0OwogIHQuYWZpaTEwMDU0ID0gMHgwNDA1OwogIHQuYWZpaTEwMDU1ID0gMHgwNDA2OwogIHQuYWZpaTEwMDU2ID0gMHgwNDA3OwogIHQuYWZpaTEwMDU3ID0gMHgwNDA4OwogIHQuYWZpaTEwMDU4ID0gMHgwNDA5OwogIHQuYWZpaTEwMDU5ID0gMHgwNDBhOwogIHQuYWZpaTEwMDY
20wID0gMHgwNDBiOwogIHQuYWZpaTEwMDYxID0gMHgwNDBjOwogIHQuYWZpaTEwMDYyID0gMHgwNDBlOwogIHQuYWZpaTEwMDYzID0gMHhmNmM0OwogIHQuYWZpaTEwMDY0ID0gMHhmNmM1OwogIHQuYWZpaTEwMDY1ID0gMHgwNDMwOwogIHQuYWZpaTEwMDY2ID0gMHgwNDMxOwogIHQuYWZpaTEwMDY3ID0gMHgwNDMyOwogIHQuYWZpaTEwMDY4ID0gMHgwNDMzOwogIHQuYWZpaTEwMDY5ID0gMHgwNDM0OwogIHQuYWZpaTEwMDcwID0gMHgwNDM1OwogIHQuYWZpaTEwMDcxID0gMHgwNDUxOwogIHQuYWZpaTEwMDcyID0gMHgwNDM2OwogIHQuYWZpaTEwMDczID0gMHgwNDM3OwogIHQuYWZpaTEwMDc0ID0gMHgwNDM4OwogIHQuYWZpaTEwMDc1ID0gMHgwNDM5OwogIHQuYWZpaTEwMDc2ID0gMHgwNDNhOwogIHQuYWZpaTEwMDc3ID0gMHgwNDNiOwogIHQuYWZpaTEwMDc4ID0gMHgwNDNjOwogIHQuYWZpaTEwMDc5ID0gMHgwNDNkOwogIHQuYWZpaTEwMDgwID0gMHgwNDNlOwogIHQuYWZpaTEwMDgxID0gMHgwNDNmOwogIHQuYWZpaTEwMDgyID0gMHgwNDQwOwogIHQuYWZpaTEwMDgzID0gMHgwNDQxOwogIHQuYWZpaTEwMDg0ID0gMHgwNDQyOwogIHQuYWZpaTEwMDg1ID0gMHgwNDQzOwogIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OwogIHQuYWZpaTEwMDg3ID0gMHgwNDQ1OwogIHQuYWZpaTEwMDg4ID0gMHgwNDQ2OwogIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OwogIHQuYWZpaTEwMDkwID0gMHgwNDQ4OwogIHQuYWZpaTEwMDkxID0gMHgwNDQ5OwogIHQuYWZpaTEwMDkyID0gMHgwNDRhOwogIHQuYWZpaTEwMDkzID0gMHgwNDRiOwogIHQuYWZpaTEwMDk0ID0gMHgwNDRjOwogIHQuYWZpaTEwMDk1ID0gMHgwNDRkOwogIHQuYWZpaTEwMDk2ID0gMHgwNDRlOwogIHQuYWZpaTEwMDk3ID0gMHgwNDRmOwogIHQuYWZpaTEwMDk4ID0gMHgwNDkxOwogIHQuYWZpaTEwMDk5ID0gMHgwNDUyOwogIHQuYWZpaTEwMTAwID0gMHgwNDUzOwogIHQuYWZpaTEwMTAxID0gMHgwNDU0OwogIHQuYWZpaTEwMTAyID0gMHgwNDU1OwogIHQuYWZpaTEwMTAzID0gMHgwNDU2OwogIHQuYWZpaTEwMTA0ID0gMHgwNDU3OwogIHQuYWZpaTEwMTA1ID0gMHgwNDU4OwogIHQuYWZpaTEwMTA2ID0gMHgwNDU5OwogIHQuYWZpaTEwMTA3ID0gMHgwNDVhOwogIHQuYWZpaTEwMTA4ID0gMHgwNDViOwogIHQuYWZpaTEwMTA5ID0gMHgwNDVjOwogIHQuYWZpaTEwMTEwID0gMHgwNDVlOwogIHQuYWZpaTEwMTQ1ID0gMHgwNDBmOwogIHQuYWZpaTEwMTQ2ID0gMHgwNDYyOwogIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOwogIHQuYWZpaTEwMTQ4ID0gMHgwNDc0OwogIHQuYWZpaTEwMTkyID0gMHhmNmM2OwogIHQuYWZpaTEwMTkzID0gMHgwNDVmOwogIHQuYWZpaTEwMTk0ID0gMHgwNDYzOwogIHQuYWZpaTEwMTk1ID0gMHgwNDczOwogIHQuYWZpaTEwMTk2ID0gMHgwNDc1OwogIHQuYWZpaTEwODMxID0gMHhmNmM3OwogIHQuYWZpaTEwODMyID0gMHhmNmM4OwogIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OwogIHQuYWZpaTI5OSA9IDB4MjAwZTsKICB0LmFmaWkzMDAgPSAweDIwMGY7CiAgdC5hZmlpMzAxID0gMHgyMDBkOwogIHQuYWZpaTU3MzgxID0gMHgwNjZhOwogIHQuYWZpaTU3Mzg4ID0gMHgwNjBjOwogIHQuYWZpaTU3MzkyID0gMHgwNjYwOwogIHQuYWZpaTU3MzkzID0gMHgwNjYxOwogIHQuYWZpaTU3Mzk0ID0gMHgwNjYyOwogIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOwogIHQuYWZpaTU3Mzk2ID0gMHgwNjY0OwogIHQuYWZpaTU3Mzk3ID0gMHgwNjY1OwogIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OwogIHQuYWZpaTU3Mzk5ID0gMHgwNjY3OwogIHQuYWZpaTU3NDAwID0gMHgwNjY4OwogIHQuYWZpaTU3NDAxID0gMHgwNjY5OwogIHQuYWZpaTU3NDAzID0gMHgwNjFiOwogIHQuYWZpaTU3NDA3ID0gMHgwNjFmOwogIHQuYWZpaTU3NDA5ID0gMHgwNjIxOwogIHQuYWZpaTU3NDEwID0gMHgwNjIyOwogIHQuYWZpaTU3NDExID0gMHgwNjIzOwogIHQuYWZpaTU3NDEyID0gMHgwNjI0OwogIHQuYWZpaTU3NDEzID0gMHgwNjI1OwogIHQuYWZpaTU3NDE0ID0gMHgwNjI2OwogIHQuYWZpaTU3NDE1ID0gMHgwNjI3OwogIHQuYWZpaTU3NDE2ID0gMHgwNjI4OwogIHQuYWZpaTU3NDE3ID0gMHgwNjI5OwogIHQuYWZpaTU3NDE4ID0gMHgwNjJhOwogIHQuYWZpaTU3NDE5ID0gMHgwNjJiOwogIHQuYWZpaTU3NDIwID0gMHgwNjJjOwogIHQuYWZpaTU3NDIxID0gMHgwNjJkOwogIHQuYWZpaTU3NDIyID0gMHgwNjJlOwogIHQuYWZpaTU3NDIzID0gMHgwNjJmOwogIHQuYWZpaTU3NDI0ID0gMHgwNjMwOwogIHQuYWZpaTU3NDI1ID0gMHgwNjMxOwogIHQuYWZpaTU3NDI2ID0gMHgwNjMyOwogIHQuYWZpaTU3NDI3ID0gMHgwNjMzOwogIHQuYWZpaTU3NDI4ID0gMHgwNjM0OwogIHQuYWZpaTU3NDI5ID0gMHgwNjM1OwogIHQuYWZpaTU3NDMwID0gMHgwNjM2OwogIHQuYWZpaTU3NDMxID0gMHgwNjM3OwogIHQuYWZpaTU3NDMyID0gMHgwNjM4OwogIHQuYWZpaTU3NDMzID0gMHgwNjM5OwogIHQuYWZpaTU3NDM0ID0gMHgwNjNhOwogIHQuYWZpaTU3NDQwID0gMHgwNjQwOwogIHQuYWZpaTU3NDQxID0gMHgwNjQxOwogIHQuYWZpaTU3NDQyID0gMHgwNjQyOwogIHQuYWZpaTU3NDQzID0gMHgwNjQzOwogIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OwogIHQuYWZpaTU3NDQ1ID0gMHgwNjQ1OwogIHQuYWZpaTU3NDQ2ID0gMHgwNjQ2OwogIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OwogIHQuYWZpaTU3NDQ5ID0gMHgwNjQ5OwogIHQuYWZpaTU3NDUwID0gMHgwNjRhOwogIHQuYWZpaTU3NDUxID0gMHgwNjRiOwogIHQuYWZpaTU3NDUyID0gMHgwNjRjOwogIHQuYWZpaTU3NDUzID0gMHgwNjRkOwogIHQuYWZpaTU3NDU0ID0gMHgwNjRlOwogIHQuYWZpaTU3NDU1ID0gMHgwNjRmOwogIHQuYWZpaTU3NDU2ID0gMHgwNjUwOwogIHQuYWZpaTU3NDU3ID0gMHgwNjUxOwogIHQuYWZpaTU3NDU4ID0gMHgwNjUyOwogIHQuYWZpaTU3NDcwID0gMHgwNjQ3OwogIHQuYWZpaTU3NTA1ID0gMHgwNmE0OwogIHQuYWZpaTU3NTA2ID0gMHgwNjdlOwogIHQuYWZpaTU3NTA3ID0gMHgwNjg2OwogIHQuYWZpaTU3NTA4ID0gMHgwNjk4OwogIHQuYWZpaTU3NTA5ID0gMHgwNmFmOwogIHQuYWZpaTU3NTExID0gMHgwNjc5OwogIHQuYWZpaTU3NTEyID0gMHgwNjg4OwogIHQuYWZpaTU3NTEzID0gMHgwNjkxOwogIHQuYWZpaTU3NTE0ID0gMHgwNmJhOwogIHQuYWZpaTU3NTE5ID0gMHgwNmQyOwogIHQuYWZpaTU3NTM0ID0gMHgwNmQ1OwogIHQuYWZpaTU3NjM2ID0gMHgyMGFhOwogIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOwogIHQuYWZpaTU3NjU4ID0gMHgwNWMzOwogIHQuYWZpaTU3NjY0ID0gMHgwNWQwOwogIHQuYWZpaTU3NjY1ID0gMHgwNWQxOwogIHQuYWZpaTU3NjY2ID0gMHgwNWQyOwogIHQuYWZpaTU3NjY3ID0gMHgwNWQzOwogIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OwogIHQuYWZpaTU3NjY5ID0gMHgwNWQ1OwogIHQuYWZpaTU3NjcwID0gMHgwNWQ2OwogIHQuYWZpaTU3NjcxID0gMHgwNWQ3OwogIHQuYWZpaTU3NjcyID0gMHgwNWQ4OwogIHQuYWZpaTU3NjczID0gMHgwNWQ5OwogIHQuYWZpaTU3Njc0ID0gMHgwNWRhOwogIHQuYWZpaTU3Njc1ID0gMHgwNWRiOwogIHQuYWZpaTU3Njc2ID0gMHgwNWRjOwogIHQuYWZpaTU3Njc3ID0gMHgwNWRkOwogIHQuYWZpaTU3Njc4ID0gMHgwNWRlOw
20ogIHQuYWZpaTU3Njc5ID0gMHgwNWRmOwogIHQuYWZpaTU3NjgwID0gMHgwNWUwOwogIHQuYWZpaTU3NjgxID0gMHgwNWUxOwogIHQuYWZpaTU3NjgyID0gMHgwNWUyOwogIHQuYWZpaTU3NjgzID0gMHgwNWUzOwogIHQuYWZpaTU3Njg0ID0gMHgwNWU0OwogIHQuYWZpaTU3Njg1ID0gMHgwNWU1OwogIHQuYWZpaTU3Njg2ID0gMHgwNWU2OwogIHQuYWZpaTU3Njg3ID0gMHgwNWU3OwogIHQuYWZpaTU3Njg4ID0gMHgwNWU4OwogIHQuYWZpaTU3Njg5ID0gMHgwNWU5OwogIHQuYWZpaTU3NjkwID0gMHgwNWVhOwogIHQuYWZpaTU3Njk0ID0gMHhmYjJhOwogIHQuYWZpaTU3Njk1ID0gMHhmYjJiOwogIHQuYWZpaTU3NzAwID0gMHhmYjRiOwogIHQuYWZpaTU3NzA1ID0gMHhmYjFmOwogIHQuYWZpaTU3NzE2ID0gMHgwNWYwOwogIHQuYWZpaTU3NzE3ID0gMHgwNWYxOwogIHQuYWZpaTU3NzE4ID0gMHgwNWYyOwogIHQuYWZpaTU3NzIzID0gMHhmYjM1OwogIHQuYWZpaTU3NzkzID0gMHgwNWI0OwogIHQuYWZpaTU3Nzk0ID0gMHgwNWI1OwogIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OwogIHQuYWZpaTU3Nzk2ID0gMHgwNWJiOwogIHQuYWZpaTU3Nzk3ID0gMHgwNWI4OwogIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OwogIHQuYWZpaTU3Nzk5ID0gMHgwNWIwOwogIHQuYWZpaTU3ODAwID0gMHgwNWIyOwogIHQuYWZpaTU3ODAxID0gMHgwNWIxOwogIHQuYWZpaTU3ODAyID0gMHgwNWIzOwogIHQuYWZpaTU3ODAzID0gMHgwNWMyOwogIHQuYWZpaTU3ODA0ID0gMHgwNWMxOwogIHQuYWZpaTU3ODA2ID0gMHgwNWI5OwogIHQuYWZpaTU3ODA3ID0gMHgwNWJjOwogIHQuYWZpaTU3ODM5ID0gMHgwNWJkOwogIHQuYWZpaTU3ODQxID0gMHgwNWJmOwogIHQuYWZpaTU3ODQyID0gMHgwNWMwOwogIHQuYWZpaTU3OTI5ID0gMHgwMmJjOwogIHQuYWZpaTYxMjQ4ID0gMHgyMTA1OwogIHQuYWZpaTYxMjg5ID0gMHgyMTEzOwogIHQuYWZpaTYxMzUyID0gMHgyMTE2OwogIHQuYWZpaTYxNTczID0gMHgyMDJjOwogIHQuYWZpaTYxNTc0ID0gMHgyMDJkOwogIHQuYWZpaTYxNTc1ID0gMHgyMDJlOwogIHQuYWZpaTYxNjY0ID0gMHgyMDBjOwogIHQuYWZpaTYzMTY3ID0gMHgwNjZkOwogIHQuYWZpaTY0OTM3ID0gMHgwMmJkOwogIHQuYWdyYXZlID0gMHgwMGUwOwogIHQuYWd1amFyYXRpID0gMHgwYTg1OwogIHQuYWd1cm11a2hpID0gMHgwYTA1OwogIHQuYWhpcmFnYW5hID0gMHgzMDQyOwogIHQuYWhvb2thYm92ZSA9IDB4MWVhMzsKICB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKICB0LmFpYm9wb21vZm8gPSAweDMxMWU7CiAgdC5haWRldmEgPSAweDA5MTA7CiAgdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKICB0LmFpZ3VqYXJhdGkgPSAweDBhOTA7CiAgdC5haWd1cm11a2hpID0gMHgwYTEwOwogIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OwogIHQuYWluYXJhYmljID0gMHgwNjM5OwogIHQuYWluZmluYWxhcmFiaWMgPSAweGZlY2E7CiAgdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOwogIHQuYWlubWVkaWFsYXJhYmljID0gMHhmZWNjOwogIHQuYWludmVydGVkYnJldmUgPSAweDAyMDM7CiAgdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CiAgdC5haXZvd2Vsc2lnbmRldmEgPSAweDA5NDg7CiAgdC5haXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM4OwogIHQuYWthdGFrYW5hID0gMHgzMGEyOwogIHQuYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcxOwogIHQuYWtvcmVhbiA9IDB4MzE0ZjsKICB0LmFsZWYgPSAweDA1ZDA7CiAgdC5hbGVmYXJhYmljID0gMHgwNjI3OwogIHQuYWxlZmRhZ2VzaGhlYnJldyA9IDB4ZmIzMDsKICB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKICB0LmFsZWZoYW16YWFib3ZlYXJhYmljID0gMHgwNjIzOwogIHQuYWxlZmhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4NDsKICB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OwogIHQuYWxlZmhhbXphYmVsb3dmaW5hbGFyYWJpYyA9IDB4ZmU4ODsKICB0LmFsZWZoZWJyZXcgPSAweDA1ZDA7CiAgdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CiAgdC5hbGVmbWFkZGFhYm92ZWFyYWJpYyA9IDB4MDYyMjsKICB0LmFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODI7CiAgdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKICB0LmFsZWZtYWtzdXJhZmluYWxhcmFiaWMgPSAweGZlZjA7CiAgdC5hbGVmbWFrc3VyYWluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKICB0LmFsZWZwYXRhaGhlYnJldyA9IDB4ZmIyZTsKICB0LmFsZWZxYW1hdHNoZWJyZXcgPSAweGZiMmY7CiAgdC5hbGVwaCA9IDB4MjEzNTsKICB0LmFsbGVxdWFsID0gMHgyMjRjOwogIHQuYWxwaGEgPSAweDAzYjE7CiAgdC5hbHBoYXRvbm9zID0gMHgwM2FjOwogIHQuYW1hY3JvbiA9IDB4MDEwMTsKICB0LmFtb25vc3BhY2UgPSAweGZmNDE7CiAgdC5hbXBlcnNhbmQgPSAweDAwMjY7CiAgdC5hbXBlcnNhbmRtb25vc3BhY2UgPSAweGZmMDY7CiAgdC5hbXBlcnNhbmRzbWFsbCA9IDB4ZjcyNjsKICB0LmFtc3F1YXJlID0gMHgzM2MyOwogIHQuYW5ib3BvbW9mbyA9IDB4MzEyMjsKICB0LmFuZ2JvcG9tb2ZvID0gMHgzMTI0OwogIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CiAgdC5hbmdicmFja2V0cmlnaHQgPSAweDMwMDk7CiAgdC5hbmdraGFua2h1dGhhaSA9IDB4MGU1YTsKICB0LmFuZ2xlID0gMHgyMjIwOwogIHQuYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwODsKICB0LmFuZ2xlYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzZjsKICB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OwogIHQuYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0MDsKICB0LmFuZ2xlbGVmdCA9IDB4MjMyOTsKICB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CiAgdC5hbmdzdHJvbSA9IDB4MjEyYjsKICB0LmFub3RlbGVpYSA9IDB4MDM4NzsKICB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKICB0LmFudXN2YXJhYmVuZ2FsaSA9IDB4MDk4MjsKICB0LmFudXN2YXJhZGV2YSA9IDB4MDkwMjsKICB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CiAgdC5hb2dvbmVrID0gMHgwMTA1OwogIHQuYXBhYXRvc3F1YXJlID0gMHgzMzAwOwogIHQuYXBhcmVuID0gMHgyNDljOwogIHQuYXBvc3Ryb3BoZWFybWVuaWFuID0gMHgwNTVhOwogIHQuYXBvc3Ryb3BoZW1vZCA9IDB4MDJiYzsKICB0LmFwcGxlID0gMHhmOGZmOwogIHQuYXBwcm9hY2hlcyA9IDB4MjI1MDsKICB0LmFwcHJveGVxdWFsID0gMHgyMjQ4OwogIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOwogIHQuYXBwcm94aW1hdGVseWVxdWFsID0gMHgyMjQ1OwogIHQuYXJhZWFla29yZWFuID0gMHgzMThlOwogIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CiAgdC5hcmMgPSAweDIzMTI7CiAgdC5hcmlnaHRoYWxmcmluZyA9IDB4MWU5YTsKICB0LmFyaW5nID0gMHgwMGU1OwogIHQuYXJpbmdhY3V0ZSA9IDB4MDFmYjsKICB0LmFyaW5nYmVsb3cgPSAweDFlMDE7CiAgdC5hcnJvd2JvdGggPSAweDIxOTQ7CiAgdC5hcnJvd2Rhc2hkb3duID0gMHgyMWUzOwogIHQuYXJyb3dkYXNobGVmdCA9IDB4MjFlMDsKICB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOwogIHQuYXJyb3dkYXNodXAgPSAweDIxZTE7CiAgdC5hcnJvd2RibGJvdGggPSAweDIxZDQ7CiAgdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CiAgdC5hcnJvd2RibGxlZnQgPSAweDIxZDA7CiAgdC5hcnJvd2RibHJpZ2h0ID0gMHgyMWQyOwogIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKICB0LmFycm93ZG93biA9IDB4MjE5MzsKICB0LmFycm93ZG93bmxlZnQgPSAweDIxOTk7CiAgdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKICB0LmFycm93ZG93bndoaXRlID0gMHgyMWU5OwogIHQuYXJyb3doZWFkZG93bm1vZCA9IDB4MDJjNTsKICB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CiAgdC5hcnJvd2hlYWRyaWdodG1vZCA9IDB4MDJjMzsKICB0LmFycm93aGVhZHVwbW9kID0gMHgwMmM0OwogIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OwogIHQuYXJyb3dsZWZ0ID0gMHgyMTkwOwogIHQuYXJyb3dsZWZ0ZGJsID0gMHgyMWQwOwogIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOwogIHQuYXJyb3dsZWZ0b3ZlcnJpZ2h0ID0gMHgyMWM2OwogIHQuYXJyb3dsZWZ0d2hpdGUgPSAweDIxZTY7CiAgdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOwogIHQuYXJyb3dyaWdodGRibHN0cm9rZSA9IDB4MjFjZjsKICB0LmFycm93cmlnaHRoZWF2eSA9IDB4Mjc5ZTsKICB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKICB0LmFycm93cmlnaHR3aGl0ZSA9IDB4MjFlODsKICB0LmFycm93dGFibGVmdCA9IDB4MjFlNDsKICB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CiAgdC5hcnJvd3VwID0gMHgyMTkxOwogIHQuYXJyb3d1cGRuID0gMHgyMTk1OwogIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGRvd25iYXNlID0gMHgyMWE4OwogIHQuYXJyb3d1cGxlZnQgPSAweDIxOTY7CiAgdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKICB0LmFycm93dXByaWdodCA9IDB4MjE5NzsKICB0LmFycm93dXB3aGl0ZSA9IDB4MjFlNzsKICB0LmFycm93dmVydGV4ID0gMHhmOGU2OwogIHQuYXNjaWljaXJjdW0gPSAweDAwNWU7CiAgdC5hc2NpaWNpcmN1bW1vbm9zcGFjZSA9IDB4ZmYzZTsKICB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CiAgdC5hc2NpaXRpbGRlbW9ub3NwYWNlID0gMHhmZjVlOw
20ogIHQuYXNjcmlwdCA9IDB4MDI1MTsKICB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CiAgdC5hc21hbGxoaXJhZ2FuYSA9IDB4MzA0MTsKICB0LmFzbWFsbGthdGFrYW5hID0gMHgzMGExOwogIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CiAgdC5hc3RlcmlzayA9IDB4MDAyYTsKICB0LmFzdGVyaXNrYWx0b25lYXJhYmljID0gMHgwNjZkOwogIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CiAgdC5hc3Rlcmlza21hdGggPSAweDIyMTc7CiAgdC5hc3Rlcmlza21vbm9zcGFjZSA9IDB4ZmYwYTsKICB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CiAgdC5hc3RlcmlzbSA9IDB4MjA0MjsKICB0LmFzdXBlcmlvciA9IDB4ZjZlOTsKICB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CiAgdC5hdCA9IDB4MDA0MDsKICB0LmF0aWxkZSA9IDB4MDBlMzsKICB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOwogIHQuYXRzbWFsbCA9IDB4ZmU2YjsKICB0LmF0dXJuZWQgPSAweDAyNTA7CiAgdC5hdWJlbmdhbGkgPSAweDA5OTQ7CiAgdC5hdWJvcG9tb2ZvID0gMHgzMTIwOwogIHQuYXVkZXZhID0gMHgwOTE0OwogIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKICB0LmF1Z3VybXVraGkgPSAweDBhMTQ7CiAgdC5hdWxlbmd0aG1hcmtiZW5nYWxpID0gMHgwOWQ3OwogIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOwogIHQuYXV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWNjOwogIHQuYXV2b3dlbHNpZ25kZXZhID0gMHgwOTRjOwogIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKICB0LmF2YWdyYWhhZGV2YSA9IDB4MDkzZDsKICB0LmF5YmFybWVuaWFuID0gMHgwNTYxOwogIHQuYXlpbiA9IDB4MDVlMjsKICB0LmF5aW5hbHRvbmVoZWJyZXcgPSAweGZiMjA7CiAgdC5heWluaGVicmV3ID0gMHgwNWUyOwogIHQuYiA9IDB4MDA2MjsKICB0LmJhYmVuZ2FsaSA9IDB4MDlhYzsKICB0LmJhY2tzbGFzaCA9IDB4MDA1YzsKICB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKICB0LmJhZGV2YSA9IDB4MDkyYzsKICB0LmJhZ3VqYXJhdGkgPSAweDBhYWM7CiAgdC5iYWd1cm11a2hpID0gMHgwYTJjOwogIHQuYmFoaXJhZ2FuYSA9IDB4MzA3MDsKICB0LmJhaHR0aGFpID0gMHgwZTNmOwogIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKICB0LmJhciA9IDB4MDA3YzsKICB0LmJhcm1vbm9zcGFjZSA9IDB4ZmY1YzsKICB0LmJib3BvbW9mbyA9IDB4MzEwNTsKICB0LmJjaXJjbGUgPSAweDI0ZDE7CiAgdC5iZG90YWNjZW50ID0gMHgxZTAzOwogIHQuYmRvdGJlbG93ID0gMHgxZTA1OwogIHQuYmVhbWVkc2l4dGVlbnRobm90ZXMgPSAweDI2NmM7CiAgdC5iZWNhdXNlID0gMHgyMjM1OwogIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKICB0LmJlaGFyYWJpYyA9IDB4MDYyODsKICB0LmJlaGZpbmFsYXJhYmljID0gMHhmZTkwOwogIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKICB0LmJlaGlyYWdhbmEgPSAweDMwNzk7CiAgdC5iZWhtZWRpYWxhcmFiaWMgPSAweGZlOTI7CiAgdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKICB0LmJlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwODsKICB0LmJlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM2ZDsKICB0LmJla2F0YWthbmEgPSAweDMwZDk7CiAgdC5iZW5hcm1lbmlhbiA9IDB4MDU2MjsKICB0LmJldCA9IDB4MDVkMTsKICB0LmJldGEgPSAweDAzYjI7CiAgdC5iZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDA7CiAgdC5iZXRkYWdlc2ggPSAweGZiMzE7CiAgdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CiAgdC5iZXRoZWJyZXcgPSAweDA1ZDE7CiAgdC5iZXRyYWZlaGVicmV3ID0gMHhmYjRjOwogIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKICB0LmJoYWRldmEgPSAweDA5MmQ7CiAgdC5iaGFndWphcmF0aSA9IDB4MGFhZDsKICB0LmJoYWd1cm11a2hpID0gMHgwYTJkOwogIHQuYmhvb2sgPSAweDAyNTM7CiAgdC5iaWhpcmFnYW5hID0gMHgzMDczOwogIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKICB0LmJpbGFiaWFsY2xpY2sgPSAweDAyOTg7CiAgdC5iaW5kaWd1cm11a2hpID0gMHgwYTAyOwogIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKICB0LmJsYWNrY2lyY2xlID0gMHgyNWNmOwogIHQuYmxhY2tkaWFtb25kID0gMHgyNWM2OwogIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKICB0LmJsYWNrbGVmdHBvaW50aW5ncG9pbnRlciA9IDB4MjVjNDsKICB0LmJsYWNrbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzA7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKICB0LmJsYWNrbGVudGljdWxhcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2I7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTE7CiAgdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKICB0LmJsYWNrbG93ZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTM7CiAgdC5ibGFja2xvd2VycmlnaHR0cmlhbmdsZSA9IDB4MjVlMjsKICB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOwogIHQuYmxhY2tyaWdodHBvaW50aW5ncG9pbnRlciA9IDB4MjViYTsKICB0LmJsYWNrcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI2OwogIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKICB0LmJsYWNrc21pbGluZ2ZhY2UgPSAweDI2M2I7CiAgdC5ibGFja3NxdWFyZSA9IDB4MjVhMDsKICB0LmJsYWNrc3RhciA9IDB4MjYwNTsKICB0LmJsYWNrdXBwZXJsZWZ0dHJpYW5nbGUgPSAweDI1ZTQ7CiAgdC5ibGFja3VwcGVycmlnaHR0cmlhbmdsZSA9IDB4MjVlNTsKICB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CiAgdC5ibGFja3VwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMjsKICB0LmJsYW5rID0gMHgyNDIzOwogIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKICB0LmJsb2NrID0gMHgyNTg4OwogIHQuYm1vbm9zcGFjZSA9IDB4ZmY0MjsKICB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKICB0LmJvaGlyYWdhbmEgPSAweDMwN2M7CiAgdC5ib2thdGFrYW5hID0gMHgzMGRjOwogIHQuYnBhcmVuID0gMHgyNDlkOwogIHQuYnFzcXVhcmUgPSAweDMzYzM7CiAgdC5icmFjZWV4ID0gMHhmOGY0OwogIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOwogIHQuYnJhY2VsZWZ0YnQgPSAweGY4ZjM7CiAgdC5icmFjZWxlZnRtaWQgPSAweGY4ZjI7CiAgdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CiAgdC5icmFjZWxlZnRzbWFsbCA9IDB4ZmU1YjsKICB0LmJyYWNlbGVmdHRwID0gMHhmOGYxOwogIHQuYnJhY2VsZWZ0dmVydGljYWwgP
20SAweGZlMzc7CiAgdC5icmFjZXJpZ2h0ID0gMHgwMDdkOwogIHQuYnJhY2VyaWdodGJ0ID0gMHhmOGZlOwogIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKICB0LmJyYWNlcmlnaHRtb25vc3BhY2UgPSAweGZmNWQ7CiAgdC5icmFjZXJpZ2h0c21hbGwgPSAweGZlNWM7CiAgdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CiAgdC5icmFjZXJpZ2h0dmVydGljYWwgPSAweGZlMzg7CiAgdC5icmFja2V0bGVmdCA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CiAgdC5icmFja2V0bGVmdGV4ID0gMHhmOGVmOwogIHQuYnJhY2tldGxlZnRtb25vc3BhY2UgPSAweGZmM2I7CiAgdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOwogIHQuYnJhY2tldHJpZ2h0ID0gMHgwMDVkOwogIHQuYnJhY2tldHJpZ2h0YnQgPSAweGY4ZmI7CiAgdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKICB0LmJyYWNrZXRyaWdodG1vbm9zcGFjZSA9IDB4ZmYzZDsKICB0LmJyYWNrZXRyaWdodHRwID0gMHhmOGY5OwogIHQuYnJldmUgPSAweDAyZDg7CiAgdC5icmV2ZWJlbG93Y21iID0gMHgwMzJlOwogIHQuYnJldmVjbWIgPSAweDAzMDY7CiAgdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CiAgdC5icmV2ZWludmVydGVkY21iID0gMHgwMzExOwogIHQuYnJldmVpbnZlcnRlZGRvdWJsZWNtYiA9IDB4MDM2MTsKICB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOwogIHQuYnJpZGdlaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMzYTsKICB0LmJyb2tlbmJhciA9IDB4MDBhNjsKICB0LmJzdHJva2UgPSAweDAxODA7CiAgdC5ic3VwZXJpb3IgPSAweGY2ZWE7CiAgdC5idG9wYmFyID0gMHgwMTgzOwogIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKICB0LmJ1a2F0YWthbmEgPSAweDMwZDY7CiAgdC5idWxsZXQgPSAweDIwMjI7CiAgdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OwogIHQuYnVsbGV0b3BlcmF0b3IgPSAweDIyMTk7CiAgdC5idWxsc2V5ZSA9IDB4MjVjZTsKICB0LmMgPSAweDAwNjM7CiAgdC5jYWFybWVuaWFuID0gMHgwNTZlOwogIHQuY2FiZW5nYWxpID0gMHgwOTlhOwogIHQuY2FjdXRlID0gMHgwMTA3OwogIHQuY2FkZXZhID0gMHgwOTFhOwogIHQuY2FndWphcmF0aSA9IDB4MGE5YTsKICB0LmNhZ3VybXVraGkgPSAweDBhMWE7CiAgdC5jYWxzcXVhcmUgPSAweDMzODg7CiAgdC5jYW5kcmFiaW5kdWJlbmdhbGkgPSAweDA5ODE7CiAgdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKICB0LmNhbmRyYWJpbmR1ZGV2YSA9IDB4MDkwMTsKICB0LmNhbmRyYWJpbmR1Z3VqYXJhdGkgPSAweDBhODE7CiAgdC5jYXBzbG9jayA9IDB4MjFlYTsKICB0LmNhcmVvZiA9IDB4MjEwNTsKICB0LmNhcm9uID0gMHgwMmM3OwogIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKICB0LmNhcm9uY21iID0gMHgwMzBjOwogIHQuY2FycmlhZ2VyZXR1cm4gPSAweDIxYjU7CiAgdC5jYm9wb21vZm8gPSAweDMxMTg7CiAgdC5jY2Fyb24gPSAweDAxMGQ7CiAgdC5jY2VkaWxsYSA9IDB4MDBlNzsKICB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CiAgdC5jY2lyY2xlID0gMHgyNGQyOwogIHQuY2NpcmN1bWZsZXggPSAweDAxMDk7CiAgdC5jY3VybCA9IDB4MDI1NTsKICB0LmNkb3QgPSAweDAxMGI7CiAgdC5jZG90YWNjZW50ID0gMHgwMTBiOwogIHQuY2RzcXVhcmUgPSAweDMzYzU7CiAgdC5jZWRpbGxhID0gMHgwMGI4OwogIHQuY2VkaWxsYWNtYiA9IDB4MDMyNzsKICB0LmNlbnQgPSAweDAwYTI7CiAgdC5jZW50aWdyYWRlID0gMHgyMTAzOwogIHQuY2VudGluZmVyaW9yID0gMHhmNmRmOwogIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKICB0LmNlbnRvbGRzdHlsZSA9IDB4ZjdhMjsKICB0LmNlbnRzdXBlcmlvciA9IDB4ZjZlMDsKICB0LmNoYWFybWVuaWFuID0gMHgwNTc5OwogIHQuY2hhYmVuZ2FsaSA9IDB4MDk5YjsKICB0LmNoYWRldmEgPSAweDA5MWI7CiAgdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKICB0LmNoYWd1cm11a2hpID0gMHgwYTFiOwogIHQuY2hib3BvbW9mbyA9IDB4MzExNDsKICB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOwogIHQuY2hlY2ttYXJrID0gMHgyNzEzOwogIHQuY2hlY3lyaWxsaWMgPSAweDA0NDc7CiAgdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKICB0LmNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI3OwogIHQuY2hlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmNTsKICB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKICB0LmNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYzsKICB0LmNoZXZlcnRpY2Fsc3Ryb2tlY3lyaWxsaWMgPSAweDA0Yjk7CiAgdC5jaGkgPSAweDAzYzc7CiAgdC5jaGlldWNoYWNpcmNsZWtvcmVhbiA9IDB4MzI3NzsKICB0LmNoaWV1Y2hhcGFyZW5rb3JlYW4gPSAweDMyMTc7CiAgdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OwogIHQuY2hpZXVjaGtvcmVhbiA9IDB4MzE0YTsKICB0LmNoaWV1Y2hwYXJlbmtvcmVhbiA9IDB4MzIwOTsKICB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKICB0LmNob2NoYW50aGFpID0gMHgwZTA4OwogIHQuY2hvY2hpbmd0aGFpID0gMHgwZTA5OwogIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CiAgdC5jaG9vayA9IDB4MDE4ODsKICB0LmNpZXVjYWNpcmNsZWtvcmVhbiA9IDB4MzI3NjsKICB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OwogIHQuY2lldWNjaXJjbGVrb3JlYW4gPSAweDMyNjg7CiAgdC5jaWV1Y2tvcmVhbiA9IDB4MzE0ODsKICB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CiAgdC5jaWV1Y3VwYXJlbmtvcmVhbiA9IDB4MzIxYzsKICB0LmNpcmNsZSA9IDB4MjVjYjsKICB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKICB0LmNpcmNsZW11bHRpcGx5ID0gMHgyMjk3OwogIHQuY2lyY2xlb3QgPSAweDIyOTk7CiAgdC5jaXJjbGVwbHVzID0gMHgyMjk1OwogIHQuY2lyY2xlcG9zdGFsbWFyayA9IDB4MzAzNjsKICB0LmNpcmNsZXdpdGhsZWZ0aGFsZmJsYWNrID0gMHgyNWQwOwogIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOwogIHQuY2lyY3VtZmxleCA9IDB4MDJjNjsKICB0LmNpcmN1bWZsZXhiZWxvd2NtYiA9IDB4MDMyZDsKICB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CiAgdC5jbGVhciA9IDB4MjMyNzsKICB0LmNsaWNrYWx2ZW9sYXIgPSAweDAxYzI7CiAgdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKICB0LmNsaWNrbGF0ZXJhbCA9IDB4MDFjMTsKICB0LmNsaWNrcmV0cm9mbGV4ID0gMHgwMWMzOwogIHQuY2x1YiA9IDB4MjY2MzsKICB0LmNsdWJzdWl0YmxhY2sgP
20SAweDI2NjM7CiAgdC5jbHVic3VpdHdoaXRlID0gMHgyNjY3OwogIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKICB0LmNtb25vc3BhY2UgPSAweGZmNDM7CiAgdC5jbXNxdWFyZWRzcXVhcmUgPSAweDMzYTA7CiAgdC5jb2FybWVuaWFuID0gMHgwNTgxOwogIHQuY29sb24gPSAweDAwM2E7CiAgdC5jb2xvbm1vbmV0YXJ5ID0gMHgyMGExOwogIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CiAgdC5jb2xvbnNpZ24gPSAweDIwYTE7CiAgdC5jb2xvbnNtYWxsID0gMHhmZTU1OwogIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKICB0LmNvbG9udHJpYW5ndWxhcm1vZCA9IDB4MDJkMDsKICB0LmNvbW1hID0gMHgwMDJjOwogIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKICB0LmNvbW1hYWJvdmVyaWdodGNtYiA9IDB4MDMxNTsKICB0LmNvbW1hYWNjZW50ID0gMHhmNmMzOwogIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CiAgdC5jb21tYWFybWVuaWFuID0gMHgwNTVkOwogIHQuY29tbWFpbmZlcmlvciA9IDB4ZjZlMTsKICB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOwogIHQuY29tbWFyZXZlcnNlZGFib3ZlY21iID0gMHgwMzE0OwogIHQuY29tbWFyZXZlcnNlZG1vZCA9IDB4MDJiZDsKICB0LmNvbW1hc21hbGwgPSAweGZlNTA7CiAgdC5jb21tYXN1cGVyaW9yID0gMHhmNmUyOwogIHQuY29tbWF0dXJuZWRhYm92ZWNtYiA9IDB4MDMxMjsKICB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOwogIHQuY29tcGFzcyA9IDB4MjYzYzsKICB0LmNvbmdydWVudCA9IDB4MjI0NTsKICB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKICB0LmNvbnRyb2wgPSAweDIzMDM7CiAgdC5jb250cm9sQUNLID0gMHgwMDA2OwogIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKICB0LmNvbnRyb2xCUyA9IDB4MDAwODsKICB0LmNvbnRyb2xDQU4gPSAweDAwMTg7CiAgdC5jb250cm9sQ1IgPSAweDAwMGQ7CiAgdC5jb250cm9sREMxID0gMHgwMDExOwogIHQuY29udHJvbERDMiA9IDB4MDAxMjsKICB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CiAgdC5jb250cm9sREM0ID0gMHgwMDE0OwogIHQuY29udHJvbERFTCA9IDB4MDA3ZjsKICB0LmNvbnRyb2xETEUgPSAweDAwMTA7CiAgdC5jb250cm9sRU0gPSAweDAwMTk7CiAgdC5jb250cm9sRU5RID0gMHgwMDA1OwogIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKICB0LmNvbnRyb2xFU0MgPSAweDAwMWI7CiAgdC5jb250cm9sRVRCID0gMHgwMDE3OwogIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKICB0LmNvbnRyb2xGRiA9IDB4MDAwYzsKICB0LmNvbnRyb2xGUyA9IDB4MDAxYzsKICB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKICB0LmNvbnRyb2xIVCA9IDB4MDAwOTsKICB0LmNvbnRyb2xMRiA9IDB4MDAwYTsKICB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CiAgdC5jb250cm9sTlVMTCA9IDB4MDAwMDsKICB0LmNvbnRyb2xSUyA9IDB4MDAxZTsKICB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKICB0LmNvbnRyb2xTTyA9IDB4MDAwZTsKICB0LmNvbnRyb2xTT1QgPSAweDAwMDI7CiAgdC5jb250cm9sU1RYID0gMHgwMDAxOwogIHQuY29udHJvbFNVQiA9IDB4MDAxYTsKICB0LmNvbnRyb2xTWU4gPSAweDAwMTY7CiAgdC5jb250cm9sVVMgPSAweDAwMWY7CiAgdC5jb250cm9sVlQgPSAweDAwMGI7CiAgdC5jb3B5cmlnaHQgPSAweDAwYTk7CiAgdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OwogIHQuY29weXJpZ2h0c2VyaWYgPSAweGY2ZDk7CiAgdC5jb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwYzsKICB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOwogIHQuY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MTsKICB0LmNvcm5lcmJyYWNrZXRyaWdodCA9IDB4MzAwZDsKICB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKICB0LmNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQyOwogIHQuY29ycG9yYXRpb25zcXVhcmUgPSAweDMzN2Y7CiAgdC5jb3NxdWFyZSA9IDB4MzNjNzsKICB0LmNvdmVya2dzcXVhcmUgPSAweDMzYzY7CiAgdC5jcGFyZW4gPSAweDI0OWU7CiAgdC5jcnV6ZWlybyA9IDB4MjBhMjsKICB0LmNzdHJldGNoZWQgPSAweDAyOTc7CiAgdC5jdXJseWFuZCA9IDB4MjJjZjsKICB0LmN1cmx5b3IgPSAweDIyY2U7CiAgdC5jdXJyZW5jeSA9IDB4MDBhNDsKICB0LmN5ckJyZXZlID0gMHhmNmQxOwogIHQuY3lyRmxleCA9IDB4ZjZkMjsKICB0LmN5cmJyZXZlID0gMHhmNmQ0OwogIHQuY3lyZmxleCA9IDB4ZjZkNTsKICB0LmQgPSAweDAwNjQ7CiAgdC5kYWFybWVuaWFuID0gMHgwNTY0OwogIHQuZGFiZW5nYWxpID0gMHgwOWE2OwogIHQuZGFkYXJhYmljID0gMHgwNjM2OwogIHQuZGFkZXZhID0gMHgwOTI2OwogIHQuZGFkZmluYWxhcmFiaWMgPSAweGZlYmU7CiAgdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOwogIHQuZGFkbWVkaWFsYXJhYmljID0gMHhmZWMwOwogIHQuZGFnZXNoID0gMHgwNWJjOwogIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOwogIHQuZGFnZ2VyID0gMHgyMDIwOwogIHQuZGFnZ2VyZGJsID0gMHgyMDIxOwogIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKICB0LmRhZ3VybXVraGkgPSAweDBhMjY7CiAgdC5kYWhpcmFnYW5hID0gMHgzMDYwOwogIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKICB0LmRhbGFyYWJpYyA9IDB4MDYyZjsKICB0LmRhbGV0ID0gMHgwNWQzOwogIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CiAgdC5kYWxldGRhZ2VzaGhlYnJldyA9IDB4ZmIzMzsKICB0LmRhbGV0aGVicmV3ID0gMHgwNWQzOwogIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CiAgdC5kYW1tYWFyYWJpYyA9IDB4MDY0ZjsKICB0LmRhbW1hbG93YXJhYmljID0gMHgwNjRmOwogIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CiAgdC5kYW1tYXRhbmFyYWJpYyA9IDB4MDY0YzsKICB0LmRhbmRhID0gMHgwOTY0OwogIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXJnYWxlZnRoZWJyZXcgPSAweDA1YTc7CiAgdC5kYXNpYXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODU7CiAgdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKICB0LmRibGFuZ2xlYnJhY2tldGxlZnQgPSAweDMwMGE7CiAgdC5kYmxhbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgP
20SAweGZlM2Q7CiAgdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKICB0LmRibGFuZ2xlYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2U7CiAgdC5kYmxhcmNoaW52ZXJ0ZWRiZWxvd2NtYiA9IDB4MDMyYjsKICB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKICB0LmRibGFycm93cmlnaHQgPSAweDIxZDI7CiAgdC5kYmxkYW5kYSA9IDB4MDk2NTsKICB0LmRibGdyYXZlID0gMHhmNmQ2OwogIHQuZGJsZ3JhdmVjbWIgPSAweDAzMGY7CiAgdC5kYmxpbnRlZ3JhbCA9IDB4MjIyYzsKICB0LmRibGxvd2xpbmUgPSAweDIwMTc7CiAgdC5kYmxsb3dsaW5lY21iID0gMHgwMzMzOwogIHQuZGJsb3ZlcmxpbmVjbWIgPSAweDAzM2Y7CiAgdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKICB0LmRibHZlcnRpY2FsYmFyID0gMHgyMDE2OwogIHQuZGJsdmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGU7CiAgdC5kYm9wb21vZm8gPSAweDMxMDk7CiAgdC5kYnNxdWFyZSA9IDB4MzNjODsKICB0LmRjYXJvbiA9IDB4MDEwZjsKICB0LmRjZWRpbGxhID0gMHgxZTExOwogIHQuZGNpcmNsZSA9IDB4MjRkMzsKICB0LmRjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTM7CiAgdC5kY3JvYXQgPSAweDAxMTE7CiAgdC5kZGFiZW5nYWxpID0gMHgwOWExOwogIHQuZGRhZGV2YSA9IDB4MDkyMTsKICB0LmRkYWd1amFyYXRpID0gMHgwYWExOwogIHQuZGRhZ3VybXVraGkgPSAweDBhMjE7CiAgdC5kZGFsYXJhYmljID0gMHgwNjg4OwogIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OwogIHQuZGRkaGFkZXZhID0gMHgwOTVjOwogIHQuZGRoYWJlbmdhbGkgPSAweDA5YTI7CiAgdC5kZGhhZGV2YSA9IDB4MDkyMjsKICB0LmRkaGFndWphcmF0aSA9IDB4MGFhMjsKICB0LmRkaGFndXJtdWtoaSA9IDB4MGEyMjsKICB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CiAgdC5kZG90YmVsb3cgPSAweDFlMGQ7CiAgdC5kZWNpbWFsc2VwYXJhdG9yYXJhYmljID0gMHgwNjZiOwogIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CiAgdC5kZWN5cmlsbGljID0gMHgwNDM0OwogIHQuZGVncmVlID0gMHgwMGIwOwogIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKICB0LmRlaGlyYWdhbmEgPSAweDMwNjc7CiAgdC5kZWljb3B0aWMgPSAweDAzZWY7CiAgdC5kZWthdGFrYW5hID0gMHgzMGM3OwogIHQuZGVsZXRlbGVmdCA9IDB4MjMyYjsKICB0LmRlbGV0ZXJpZ2h0ID0gMHgyMzI2OwogIHQuZGVsdGEgPSAweDAzYjQ7CiAgdC5kZWx0YXR1cm5lZCA9IDB4MDE4ZDsKICB0LmRlbm9taW5hdG9ybWludXNvbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY4OwogIHQuZGV6aCA9IDB4MDJhNDsKICB0LmRoYWJlbmdhbGkgPSAweDA5YTc7CiAgdC5kaGFkZXZhID0gMHgwOTI3OwogIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CiAgdC5kaGFndXJtdWtoaSA9IDB4MGEyNzsKICB0LmRob29rID0gMHgwMjU3OwogIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CiAgdC5kaWFseXRpa2F0b25vc2NtYiA9IDB4MDM0NDsKICB0LmRpYW1vbmQgPSAweDI2NjY7CiAgdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOwogIHQuZGllcmVzaXMgPSAweDAwYTg7CiAgdC5kaWVyZXNpc2FjdXRlID0gMHhmNmQ3OwogIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKICB0LmRpZXJlc2lzY21iID0gMHgwMzA4OwogIHQuZGllcmVzaXNncmF2ZSA9IDB4ZjZkODsKICB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CiAgdC5kaWhpcmFnYW5hID0gMHgzMDYyOwogIHQuZGlrYXRha2FuYSA9IDB4MzBjMjsKICB0LmRpdHRvbWFyayA9IDB4MzAwMzsKICB0LmRpdmlkZSA9IDB4MDBmNzsKICB0LmRpdmlkZXMgPSAweDIyMjM7CiAgdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OwogIHQuZGplY3lyaWxsaWMgPSAweDA0NTI7CiAgdC5ka3NoYWRlID0gMHgyNTkzOwogIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKICB0LmRsc3F1YXJlID0gMHgzMzk3OwogIHQuZG1hY3JvbiA9IDB4MDExMTsKICB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CiAgdC5kbmJsb2NrID0gMHgyNTg0OwogIHQuZG9jaGFkYXRoYWkgPSAweDBlMGU7CiAgdC5kb2Rla3RoYWkgPSAweDBlMTQ7CiAgdC5kb2hpcmFnYW5hID0gMHgzMDY5OwogIHQuZG9rYXRha2FuYSA9IDB4MzBjOTsKICB0LmRvbGxhciA9IDB4MDAyNDsKICB0LmRvbGxhcmluZmVyaW9yID0gMHhmNmUzOwogIHQuZG9sbGFybW9ub3NwYWNlID0gMHhmZjA0OwogIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CiAgdC5kb2xsYXJzbWFsbCA9IDB4ZmU2OTsKICB0LmRvbGxhcnN1cGVyaW9yID0gMHhmNmU0OwogIHQuZG9uZyA9IDB4MjBhYjsKICB0LmRvcnVzcXVhcmUgPSAweDMzMjY7CiAgdC5kb3RhY2NlbnQgPSAweDAyZDk7CiAgdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CiAgdC5kb3RiZWxvd2NtYiA9IDB4MDMyMzsKICB0LmRvdGJlbG93Y29tYiA9IDB4MDMyMzsKICB0LmRvdGthdGFrYW5hID0gMHgzMGZiOwogIHQuZG90bGVzc2kgPSAweDAxMzE7CiAgdC5kb3RsZXNzaiA9IDB4ZjZiZTsKICB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKICB0LmRvdG1hdGggPSAweDIyYzU7CiAgdC5kb3R0ZWRjaXJjbGUgPSAweDI1Y2M7CiAgdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKICB0LmRvdWJsZXlvZHBhdGFoaGVicmV3ID0gMHhmYjFmOwogIHQuZG93bnRhY2tiZWxvd2NtYiA9IDB4MDMxZTsKICB0LmRvd250YWNrbW9kID0gMHgwMmQ1OwogIHQuZHBhcmVuID0gMHgyNDlmOwogIHQuZHN1cGVyaW9yID0gMHhmNmViOwogIHQuZHRhaWwgPSAweDAyNTY7CiAgdC5kdG9wYmFyID0gMHgwMThjOwogIHQuZHVoaXJhZ2FuYSA9IDB4MzA2NTsKICB0LmR1a2F0YWthbmEgPSAweDMwYzU7CiAgdC5keiA9IDB4MDFmMzsKICB0LmR6YWx0b25lID0gMHgwMmEzOwogIHQuZHpjYXJvbiA9IDB4MDFjNjsKICB0LmR6Y3VybCA9IDB4MDJhNTsKICB0LmR6ZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGUxOwogIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CiAgdC5kemhlY3lyaWxsaWMgPSAweDA0NWY7CiAgdC5lID0gMHgwMDY1OwogIHQuZWFjdXRlID0gMHgwMGU5OwogIHQuZWFydGggPSAweDI2NDE7CiAgdC5lYmVuZ2FsaSA9IDB4MDk4ZjsKICB0LmVib3BvbW9mbyA9IDB4MzExYzsKICB0LmVicmV2ZSA9IDB4MDExNTsKICB0LmVjYW5kcmFkZXZhID0gMHgwOTBkOwogIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOwogIHQuZWNhbmRyYXZvd2Vsc2lnbmRldmEgPSAweDA5NDU7CiAgdC5lY2FuZHJhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzU7CiAgdC5lY2Fyb24gPSAweDAxMWI7CiAgdC5lY2VkaWxsYWJyZXZlID0gMHgxZTFkOwogIHQuZWNoYXJtZW5pYW4gPSAweDA1NjU7CiAgdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CiAgdC5lY2lyY2xlID0gMHgyNGQ0OwogIHQuZWNpcmN1bWZsZXggPSAweDAwZWE7CiAgdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOwogIHQuZWNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxOTsKICB0LmVjaXJj
20dW1mbGV4ZG90YmVsb3cgPSAweDFlYzc7CiAgdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOwogIHQuZWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYzM7CiAgdC5lY2lyY3VtZmxleHRpbGRlID0gMHgxZWM1OwogIHQuZWN5cmlsbGljID0gMHgwNDU0OwogIHQuZWRibGdyYXZlID0gMHgwMjA1OwogIHQuZWRldmEgPSAweDA5MGY7CiAgdC5lZGllcmVzaXMgPSAweDAwZWI7CiAgdC5lZG90ID0gMHgwMTE3OwogIHQuZWRvdGFjY2VudCA9IDB4MDExNzsKICB0LmVkb3RiZWxvdyA9IDB4MWViOTsKICB0LmVlZ3VybXVraGkgPSAweDBhMGY7CiAgdC5lZW1hdHJhZ3VybXVraGkgPSAweDBhNDc7CiAgdC5lZmN5cmlsbGljID0gMHgwNDQ0OwogIHQuZWdyYXZlID0gMHgwMGU4OwogIHQuZWd1amFyYXRpID0gMHgwYThmOwogIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKICB0LmVoYm9wb21vZm8gPSAweDMxMWQ7CiAgdC5laGlyYWdhbmEgPSAweDMwNDg7CiAgdC5laG9va2Fib3ZlID0gMHgxZWJiOwogIHQuZWlib3BvbW9mbyA9IDB4MzExZjsKICB0LmVpZ2h0ID0gMHgwMDM4OwogIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGJlbmdhbGkgPSAweDA5ZWU7CiAgdC5laWdodGNpcmNsZSA9IDB4MjQ2NzsKICB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKICB0LmVpZ2h0ZGV2YSA9IDB4MDk2ZTsKICB0LmVpZ2h0ZWVuY2lyY2xlID0gMHgyNDcxOwogIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKICB0LmVpZ2h0ZWVucGVyaW9kID0gMHgyNDk5OwogIHQuZWlnaHRndWphcmF0aSA9IDB4MGFlZTsKICB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CiAgdC5laWdodGhhY2thcmFiaWMgPSAweDA2Njg7CiAgdC5laWdodGhhbmd6aG91ID0gMHgzMDI4OwogIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKICB0LmVpZ2h0aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNzsKICB0LmVpZ2h0aW5mZXJpb3IgPSAweDIwODg7CiAgdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKICB0LmVpZ2h0b2xkc3R5bGUgPSAweGY3Mzg7CiAgdC5laWdodHBhcmVuID0gMHgyNDdiOwogIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CiAgdC5laWdodHBlcnNpYW4gPSAweDA2Zjg7CiAgdC5laWdodHJvbWFuID0gMHgyMTc3OwogIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKICB0LmVpZ2h0dGhhaSA9IDB4MGU1ODsKICB0LmVpbnZlcnRlZGJyZXZlID0gMHgwMjA3OwogIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CiAgdC5la2F0YWthbmEgPSAweDMwYTg7CiAgdC5la2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzQ7CiAgdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CiAgdC5la29yZWFuID0gMHgzMTU0OwogIHQuZWxjeXJpbGxpYyA9IDB4MDQzYjsKICB0LmVsZW1lbnQgPSAweDIyMDg7CiAgdC5lbGV2ZW5jaXJjbGUgPSAweDI0NmE7CiAgdC5lbGV2ZW5wYXJlbiA9IDB4MjQ3ZTsKICB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKICB0LmVsZXZlbnJvbWFuID0gMHgyMTdhOwogIHQuZWxsaXBzaXMgPSAweDIwMjY7CiAgdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOwogIHQuZW1hY3JvbiA9IDB4MDExMzsKICB0LmVtYWNyb25hY3V0ZSA9IDB4MWUxNzsKICB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKICB0LmVtY3lyaWxsaWMgPSAweDA0M2M7CiAgdC5lbWRhc2ggPSAweDIwMTQ7CiAgdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKICB0LmVtb25vc3BhY2UgPSAweGZmNDU7CiAgdC5lbXBoYXNpc21hcmthcm1lbmlhbiA9IDB4MDU1YjsKICB0LmVtcHR5c2V0ID0gMHgyMjA1OwogIHQuZW5ib3BvbW9mbyA9IDB4MzEyMzsKICB0LmVuY3lyaWxsaWMgPSAweDA0M2Q7CiAgdC5lbmRhc2ggPSAweDIwMTM7CiAgdC5lbmRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMjsKICB0LmVuZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YTM7CiAgdC5lbmcgPSAweDAxNGI7CiAgdC5lbmdib3BvbW9mbyA9IDB4MzEyNTsKICB0LmVuZ2hlY3lyaWxsaWMgPSAweDA0YTU7CiAgdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKICB0LmVuc3BhY2UgPSAweDIwMDI7CiAgdC5lb2dvbmVrID0gMHgwMTE5OwogIHQuZW9rb3JlYW4gPSAweDMxNTM7CiAgdC5lb3BlbiA9IDB4MDI1YjsKICB0LmVvcGVuY2xvc2VkID0gMHgwMjlhOwogIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKICB0LmVvcGVucmV2ZXJzZWRjbG9zZWQgPSAweDAyNWU7CiAgdC5lb3BlbnJldmVyc2VkaG9vayA9IDB4MDI1ZDsKICB0LmVwYXJlbiA9IDB4MjRhMDsKICB0LmVwc2lsb24gPSAweDAzYjU7CiAgdC5lcHNpbG9udG9ub3MgPSAweDAzYWQ7CiAgdC5lcXVhbCA9IDB4MDAzZDsKICB0LmVxdWFsbW9ub3NwYWNlID0gMHhmZjFkOwogIHQuZXF1YWxzbWFsbCA9IDB4ZmU2NjsKICB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CiAgdC5lcXVpdmFsZW5jZSA9IDB4MjI2MTsKICB0LmVyYm9wb21vZm8gPSAweDMxMjY7CiAgdC5lcmN5cmlsbGljID0gMHgwNDQwOwogIHQuZXJldmVyc2VkID0gMHgwMjU4OwogIHQuZXJldmVyc2VkY3lyaWxsaWMgPSAweDA0NGQ7CiAgdC5lc2N5cmlsbGljID0gMHgwNDQxOwogIHQuZXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYjsKICB0LmVzaCA9IDB4MDI4MzsKICB0LmVzaGN1cmwgPSAweDAyODY7CiAgdC5lc2hvcnRkZXZhID0gMHgwOTBlOwogIHQuZXNob3J0dm93ZWxzaWduZGV2YSA9IDB4MDk0NjsKICB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKICB0LmVzaHNxdWF0cmV2ZXJzZWQgPSAweDAyODU7CiAgdC5lc21hbGxoaXJhZ2FuYSA9IDB4MzA0NzsKICB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OwogIHQuZXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmE7CiAgdC5lc3RpbWF0ZWQgPSAweDIxMmU7CiAgdC5lc3VwZXJpb3IgPSAweGY2ZWM7CiAgdC5ldGEgPSAweDAzYjc7CiAgdC5ldGFybWVuaWFuID0gMHgwNTY4OwogIHQuZXRhdG9ub3MgPSAweDAzYWU7CiAgdC5ldGggPSAweDAwZjA7CiAgdC5ldGlsZGUgPSAweDFlYmQ7CiAgdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKICB0LmV0bmFodGFmb3VraGhlYnJldyA9IDB4MDU5MTsKICB0LmV0bmFodGFmb3VraGxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOwogIHQuZXRuYWh0YWxlZnRoZWJyZXcgPSAweDA1OTE7CiAgdC5ld
20HVybmVkID0gMHgwMWRkOwogIHQuZXVrb3JlYW4gPSAweDMxNjE7CiAgdC5ldXJvID0gMHgyMGFjOwogIHQuZXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzc7CiAgdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKICB0LmV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjNzsKICB0LmV4Y2xhbSA9IDB4MDAyMTsKICB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOwogIHQuZXhjbGFtZGJsID0gMHgyMDNjOwogIHQuZXhjbGFtZG93biA9IDB4MDBhMTsKICB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKICB0LmV4Y2xhbW1vbm9zcGFjZSA9IDB4ZmYwMTsKICB0LmV4Y2xhbXNtYWxsID0gMHhmNzIxOwogIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CiAgdC5lemggPSAweDAyOTI7CiAgdC5lemhjYXJvbiA9IDB4MDFlZjsKICB0LmV6aGN1cmwgPSAweDAyOTM7CiAgdC5lemhyZXZlcnNlZCA9IDB4MDFiOTsKICB0LmV6aHRhaWwgPSAweDAxYmE7CiAgdC5mID0gMHgwMDY2OwogIHQuZmFkZXZhID0gMHgwOTVlOwogIHQuZmFndXJtdWtoaSA9IDB4MGE1ZTsKICB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CiAgdC5mYXRoYWFyYWJpYyA9IDB4MDY0ZTsKICB0LmZhdGhhbG93YXJhYmljID0gMHgwNjRlOwogIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CiAgdC5mYm9wb21vZm8gPSAweDMxMDg7CiAgdC5mY2lyY2xlID0gMHgyNGQ1OwogIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKICB0LmZlaGFyYWJpYyA9IDB4MDY0MTsKICB0LmZlaGFybWVuaWFuID0gMHgwNTg2OwogIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CiAgdC5mZWhpbml0aWFsYXJhYmljID0gMHhmZWQzOwogIHQuZmVobWVkaWFsYXJhYmljID0gMHhmZWQ0OwogIHQuZmVpY29wdGljID0gMHgwM2U1OwogIHQuZmVtYWxlID0gMHgyNjQwOwogIHQuZmYgPSAweGZiMDA7CiAgdC5mX2YgPSAweGZiMDA7CiAgdC5mZmkgPSAweGZiMDM7CiAgdC5mX2ZfaSA9IDB4ZmIwMzsKICB0LmZmbCA9IDB4ZmIwNDsKICB0LmZfZl9sID0gMHhmYjA0OwogIHQuZmkgPSAweGZiMDE7CiAgdC5mX2kgPSAweGZiMDE7CiAgdC5maWZ0ZWVuY2lyY2xlID0gMHgyNDZlOwogIHQuZmlmdGVlbnBhcmVuID0gMHgyNDgyOwogIHQuZmlmdGVlbnBlcmlvZCA9IDB4MjQ5NjsKICB0LmZpZ3VyZWRhc2ggPSAweDIwMTI7CiAgdC5maWxsZWRib3ggPSAweDI1YTA7CiAgdC5maWxsZWRyZWN0ID0gMHgyNWFjOwogIHQuZmluYWxrYWYgPSAweDA1ZGE7CiAgdC5maW5hbGthZmRhZ2VzaCA9IDB4ZmIzYTsKICB0LmZpbmFsa2FmZGFnZXNoaGVicmV3ID0gMHhmYjNhOwogIHQuZmluYWxrYWZoZWJyZXcgPSAweDA1ZGE7CiAgdC5maW5hbG1lbSA9IDB4MDVkZDsKICB0LmZpbmFsbWVtaGVicmV3ID0gMHgwNWRkOwogIHQuZmluYWxudW4gPSAweDA1ZGY7CiAgdC5maW5hbG51bmhlYnJldyA9IDB4MDVkZjsKICB0LmZpbmFscGUgPSAweDA1ZTM7CiAgdC5maW5hbHBlaGVicmV3ID0gMHgwNWUzOwogIHQuZmluYWx0c2FkaSA9IDB4MDVlNTsKICB0LmZpbmFsdHNhZGloZWJyZXcgPSAweDA1ZTU7CiAgdC5maXJzdHRvbmVjaGluZXNlID0gMHgwMmM5OwogIHQuZmlzaGV5ZSA9IDB4MjVjOTsKICB0LmZpdGFjeXJpbGxpYyA9IDB4MDQ3MzsKICB0LmZpdmUgPSAweDAwMzU7CiAgdC5maXZlYXJhYmljID0gMHgwNjY1OwogIHQuZml2ZWJlbmdhbGkgPSAweDA5ZWI7CiAgdC5maXZlY2lyY2xlID0gMHgyNDY0OwogIHQuZml2ZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGU7CiAgdC5maXZlZGV2YSA9IDB4MDk2YjsKICB0LmZpdmVlaWdodGhzID0gMHgyMTVkOwogIHQuZml2ZWd1amFyYXRpID0gMHgwYWViOwogIHQuZml2ZWd1cm11a2hpID0gMHgwYTZiOwogIHQuZml2ZWhhY2thcmFiaWMgPSAweDA2NjU7CiAgdC5maXZlaGFuZ3pob3UgPSAweDMwMjU7CiAgdC5maXZlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNDsKICB0LmZpdmVpbmZlcmlvciA9IDB4MjA4NTsKICB0LmZpdmVtb25vc3BhY2UgPSAweGZmMTU7CiAgdC5maXZlb2xkc3R5bGUgPSAweGY3MzU7CiAgdC5maXZlcGFyZW4gPSAweDI0Nzg7CiAgdC5maXZlcGVyaW9kID0gMHgyNDhjOwogIHQuZml2ZXBlcnNpYW4gPSAweDA2ZjU7CiAgdC5maXZlcm9tYW4gPSAweDIxNzQ7CiAgdC5maXZlc3VwZXJpb3IgPSAweDIwNzU7CiAgdC5maXZldGhhaSA9IDB4MGU1NTsKICB0LmZsID0gMHhmYjAyOwogIHQuZl9sID0gMHhmYjAyOwogIHQuZmxvcmluID0gMHgwMTkyOwogIHQuZm1vbm9zcGFjZSA9IDB4ZmY0NjsKICB0LmZtc3F1YXJlID0gMHgzMzk5OwogIHQuZm9mYW50aGFpID0gMHgwZTFmOwogIHQuZm9mYXRoYWkgPSAweDBlMWQ7CiAgdC5mb25nbWFudGhhaSA9IDB4MGU0ZjsKICB0LmZvcmFsbCA9IDB4MjIwMDsKICB0LmZvdXIgPSAweDAwMzQ7CiAgdC5mb3VyYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmJlbmdhbGkgPSAweDA5ZWE7CiAgdC5mb3VyY2lyY2xlID0gMHgyNDYzOwogIHQuZm91cmNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGQ7CiAgdC5mb3VyZGV2YSA9IDB4MDk2YTsKICB0LmZvdXJndWphcmF0aSA9IDB4MGFlYTsKICB0LmZvdXJndXJtdWtoaSA9IDB4MGE2YTsKICB0LmZvdXJoYWNrYXJhYmljID0gMHgwNjY0OwogIHQuZm91cmhhbmd6aG91ID0gMHgzMDI0OwogIHQuZm91cmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjM7CiAgdC5mb3VyaW5mZXJpb3IgPSAweDIwODQ7CiAgdC5mb3VybW9ub3NwYWNlID0gMHhmZjE0OwogIHQuZm91cm51bWVyYXRvcmJlbmdhbGkgPSAweDA5Zjc7CiAgdC5mb3Vyb2xkc3R5bGUgPSAweGY3MzQ7CiAgdC5mb3VycGFyZW4gPSAweDI0Nzc7CiAgdC5mb3VycGVyaW9kID0gMHgyNDhiOwogIHQuZm91cnBlcnNpYW4gPSAweDA2ZjQ7CiAgdC5mb3Vycm9tYW4gPSAweDIxNzM7CiAgdC5mb3Vyc3VwZXJpb3IgPSAweDIwNzQ7CiAgdC5mb3VydGVlbmNpcmNsZSA9IDB4MjQ2ZDsKICB0LmZvdXJ0ZWVucGFyZW4gPSAweDI0ODE7CiAgdC5mb3VydGVlbnBlcmlvZCA9IDB4MjQ5NTsKICB0LmZvdXJ0aGFpID0gMHgwZTU0OwogIHQuZm91cnRodG9uZWNoaW5lc2UgPSAweDAyY2I7CiAgdC5mcGFyZW4gPSAweDI0YTE7CiAgdC5mcmFjdGlvbiA9IDB4MjA0NDsKICB0LmZyYW5jID0gMHgyMGEzOwogIHQuZyA9IDB4MDA2NzsKICB0LmdhYmVuZ2FsaSA9IDB4MDk5NzsKICB0LmdhY3V0ZSA9IDB4MDFmNTsKICB0LmdhZGV2YSA9IDB4MDkxNzsKICB0LmdhZmFyYWJpYyA9IDB4MDZhZjsKICB0LmdhZmZpbmFsYXJhYmljID0gMHhmYjkzOwogIHQuZ2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmI5NDsKICB0LmdhZm1lZGlhbGFyYWJpYyA9IDB4ZmI5NTsKICB0LmdhZ3VqYXJhdGkgPSAweDBhOTc7CiAgdC5nYWd1cm11a2hpID0gMHgwYTE3OwogIHQuZ2FoaXJhZ2FuYSA9IDB4MzA0YzsKICB0Lmdha2F0YWthbmEgPSAweDMwYWM7CiAgdC5nYW1tYSA9IDB4MDNiMzsKICB0LmdhbW1hbGF0aW5zbWFsbCA9IDB4MDI2MzsKICB0LmdhbW1hc3VwZXJpb3IgPSAweDAyZTA7CiAgdC5nYW5naWFjb3B0aWMgPSAweDAzZWI7CiAgdC5nYm9wb21vZm8gPSAweDMxMGQ7CiAgdC5nYnJldmUgPSAweDAxMWY7CiAgdC5nY2Fyb24gPSAweDAxZTc7CiAgdC5nY2VkaWxsYSA9IDB4MDEyMzsKICB0LmdjaXJjbGUgP
20SAweDI0ZDY7CiAgdC5nY2lyY3VtZmxleCA9IDB4MDExZDsKICB0Lmdjb21tYWFjY2VudCA9IDB4MDEyMzsKICB0Lmdkb3QgPSAweDAxMjE7CiAgdC5nZG90YWNjZW50ID0gMHgwMTIxOwogIHQuZ2VjeXJpbGxpYyA9IDB4MDQzMzsKICB0LmdlaGlyYWdhbmEgPSAweDMwNTI7CiAgdC5nZWthdGFrYW5hID0gMHgzMGIyOwogIHQuZ2VvbWV0cmljYWxseWVxdWFsID0gMHgyMjUxOwogIHQuZ2VyZXNoYWNjZW50aGVicmV3ID0gMHgwNTljOwogIHQuZ2VyZXNoaGVicmV3ID0gMHgwNWYzOwogIHQuZ2VyZXNobXVxZGFtaGVicmV3ID0gMHgwNTlkOwogIHQuZ2VybWFuZGJscyA9IDB4MDBkZjsKICB0LmdlcnNoYXlpbWFjY2VudGhlYnJldyA9IDB4MDU5ZTsKICB0LmdlcnNoYXlpbWhlYnJldyA9IDB4MDVmNDsKICB0LmdldGFtYXJrID0gMHgzMDEzOwogIHQuZ2hhYmVuZ2FsaSA9IDB4MDk5ODsKICB0LmdoYWRhcm1lbmlhbiA9IDB4MDU3MjsKICB0LmdoYWRldmEgPSAweDA5MTg7CiAgdC5naGFndWphcmF0aSA9IDB4MGE5ODsKICB0LmdoYWd1cm11a2hpID0gMHgwYTE4OwogIHQuZ2hhaW5hcmFiaWMgPSAweDA2M2E7CiAgdC5naGFpbmZpbmFsYXJhYmljID0gMHhmZWNlOwogIHQuZ2hhaW5pbml0aWFsYXJhYmljID0gMHhmZWNmOwogIHQuZ2hhaW5tZWRpYWxhcmFiaWMgPSAweGZlZDA7CiAgdC5naGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTU7CiAgdC5naGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MzsKICB0LmdoZXVwdHVybmN5cmlsbGljID0gMHgwNDkxOwogIHQuZ2hoYWRldmEgPSAweDA5NWE7CiAgdC5naGhhZ3VybXVraGkgPSAweDBhNWE7CiAgdC5naG9vayA9IDB4MDI2MDsKICB0LmdoenNxdWFyZSA9IDB4MzM5MzsKICB0LmdpaGlyYWdhbmEgPSAweDMwNGU7CiAgdC5naWthdGFrYW5hID0gMHgzMGFlOwogIHQuZ2ltYXJtZW5pYW4gPSAweDA1NjM7CiAgdC5naW1lbCA9IDB4MDVkMjsKICB0LmdpbWVsZGFnZXNoID0gMHhmYjMyOwogIHQuZ2ltZWxkYWdlc2hoZWJyZXcgPSAweGZiMzI7CiAgdC5naW1lbGhlYnJldyA9IDB4MDVkMjsKICB0LmdqZWN5cmlsbGljID0gMHgwNDUzOwogIHQuZ2xvdHRhbGludmVydGVkc3Ryb2tlID0gMHgwMWJlOwogIHQuZ2xvdHRhbHN0b3AgPSAweDAyOTQ7CiAgdC5nbG90dGFsc3RvcGludmVydGVkID0gMHgwMjk2OwogIHQuZ2xvdHRhbHN0b3Btb2QgPSAweDAyYzA7CiAgdC5nbG90dGFsc3RvcHJldmVyc2VkID0gMHgwMjk1OwogIHQuZ2xvdHRhbHN0b3ByZXZlcnNlZG1vZCA9IDB4MDJjMTsKICB0Lmdsb3R0YWxzdG9wcmV2ZXJzZWRzdXBlcmlvciA9IDB4MDJlNDsKICB0Lmdsb3R0YWxzdG9wc3Ryb2tlID0gMHgwMmExOwogIHQuZ2xvdHRhbHN0b3BzdHJva2VyZXZlcnNlZCA9IDB4MDJhMjsKICB0LmdtYWNyb24gPSAweDFlMjE7CiAgdC5nbW9ub3NwYWNlID0gMHhmZjQ3OwogIHQuZ29oaXJhZ2FuYSA9IDB4MzA1NDsKICB0Lmdva2F0YWthbmEgPSAweDMwYjQ7CiAgdC5ncGFyZW4gPSAweDI0YTI7CiAgdC5ncGFzcXVhcmUgPSAweDMzYWM7CiAgdC5ncmFkaWVudCA9IDB4MjIwNzsKICB0LmdyYXZlID0gMHgwMDYwOwogIHQuZ3JhdmViZWxvd2NtYiA9IDB4MDMxNjsKICB0LmdyYXZlY21iID0gMHgwMzAwOwogIHQuZ3JhdmVjb21iID0gMHgwMzAwOwogIHQuZ3JhdmVkZXZhID0gMHgwOTUzOwogIHQuZ3JhdmVsb3dtb2QgPSAweDAyY2U7CiAgdC5ncmF2ZW1vbm9zcGFjZSA9IDB4ZmY0MDsKICB0LmdyYXZldG9uZWNtYiA9IDB4MDM0MDsKICB0LmdyZWF0ZXIgPSAweDAwM2U7CiAgdC5ncmVhdGVyZXF1YWwgPSAweDIyNjU7CiAgdC5ncmVhdGVyZXF1YWxvcmxlc3MgPSAweDIyZGI7CiAgdC5ncmVhdGVybW9ub3NwYWNlID0gMHhmZjFlOwogIHQuZ3JlYXRlcm9yZXF1aXZhbGVudCA9IDB4MjI3MzsKICB0LmdyZWF0ZXJvcmxlc3MgPSAweDIyNzc7CiAgdC5ncmVhdGVyb3ZlcmVxdWFsID0gMHgyMjY3OwogIHQuZ3JlYXRlcnNtYWxsID0gMHhmZTY1OwogIHQuZ3NjcmlwdCA9IDB4MDI2MTsKICB0LmdzdHJva2UgPSAweDAxZTU7CiAgdC5ndWhpcmFnYW5hID0gMHgzMDUwOwogIHQuZ3VpbGxlbW90bGVmdCA9IDB4MDBhYjsKICB0Lmd1aWxsZW1vdHJpZ2h0ID0gMHgwMGJiOwogIHQuZ3VpbHNpbmdsbGVmdCA9IDB4MjAzOTsKICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMHgyMDNhOwogIHQuZ3VrYXRha2FuYSA9IDB4MzBiMDsKICB0Lmd1cmFtdXNxdWFyZSA9IDB4MzMxODsKICB0Lmd5c3F1YXJlID0gMHgzM2M5OwogIHQuaCA9IDB4MDA2ODsKICB0LmhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTk7CiAgdC5oYWFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhhYmVuZ2FsaSA9IDB4MDliOTsKICB0LmhhZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YjM7CiAgdC5oYWRldmEgPSAweDA5Mzk7CiAgdC5oYWd1amFyYXRpID0gMHgwYWI5OwogIHQuaGFndXJtdWtoaSA9IDB4MGEzOTsKICB0LmhhaGFyYWJpYyA9IDB4MDYyZDsKICB0LmhhaGZpbmFsYXJhYmljID0gMHhmZWEyOwogIHQuaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhMzsKICB0LmhhaGlyYWdhbmEgPSAweDMwNmY7CiAgdC5oYWhtZWRpYWxhcmFiaWMgPSAweGZlYTQ7CiAgdC5oYWl0dXNxdWFyZSA9IDB4MzMyYTsKICB0Lmhha2F0YWthbmEgPSAweDMwY2Y7CiAgdC5oYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhhOwogIHQuaGFsYW50Z3VybXVraGkgPSAweDBhNGQ7CiAgdC5oYW16YWFyYWJpYyA9IDB4MDYyMTsKICB0LmhhbXphbG93YXJhYmljID0gMHgwNjIxOwogIHQuaGFuZ3VsZmlsbGVyID0gMHgzMTY0OwogIHQuaGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQ0YTsKICB0LmhhcnBvb25sZWZ0YmFyYnVwID0gMHgyMWJjOwogIHQuaGFycG9vbnJpZ2h0YmFyYnVwID0gMHgyMWMwOwogIHQuaGFzcXVhcmUgPSAweDMzY2E7CiAgdC5oYXRhZnBhdGFoID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDE2ID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDIzID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaDJmID0gMHgwNWIyOwogIHQuaGF0YWZwYXRhaGhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWhuYXJyb3doZWJyZXcgPSAweDA1YjI7CiAgdC5oYXRhZnBhdGFocXVhcnRlcmhlYnJldyA9IDB4MDViMjsKICB0LmhhdGFmcGF0YWh3aWRlaGVicmV3ID0gMHgwNWIyOwogIHQuaGF0YWZxYW1hdHMgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0czFiID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHMyOCA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzMzQgPSAweDA1YjM7CiAgdC5oYXRhZnFhbWF0c2hlYnJldyA9IDB4MDViMzsKICB0LmhhdGFmcWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHNxdWFydGVyaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZxYW1hdHN3aWRlaGVicmV3ID0gMHgwNWIzOwogIHQuaGF0YWZzZWdvbCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wxNyA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wyNCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2wzMCA9IDB4MDViMTsKICB0LmhhdGFmc2Vnb2xoZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWIxOwogIHQuaGF0YWZzZWdvbHF1YXJ0ZXJo
20ZWJyZXcgPSAweDA1YjE7CiAgdC5oYXRhZnNlZ29sd2lkZWhlYnJldyA9IDB4MDViMTsKICB0LmhiYXIgPSAweDAxMjc7CiAgdC5oYm9wb21vZm8gPSAweDMxMGY7CiAgdC5oYnJldmViZWxvdyA9IDB4MWUyYjsKICB0LmhjZWRpbGxhID0gMHgxZTI5OwogIHQuaGNpcmNsZSA9IDB4MjRkNzsKICB0LmhjaXJjdW1mbGV4ID0gMHgwMTI1OwogIHQuaGRpZXJlc2lzID0gMHgxZTI3OwogIHQuaGRvdGFjY2VudCA9IDB4MWUyMzsKICB0Lmhkb3RiZWxvdyA9IDB4MWUyNTsKICB0LmhlID0gMHgwNWQ0OwogIHQuaGVhcnQgPSAweDI2NjU7CiAgdC5oZWFydHN1aXRibGFjayA9IDB4MjY2NTsKICB0LmhlYXJ0c3VpdHdoaXRlID0gMHgyNjYxOwogIHQuaGVkYWdlc2ggPSAweGZiMzQ7CiAgdC5oZWRhZ2VzaGhlYnJldyA9IDB4ZmIzNDsKICB0LmhlaGFsdG9uZWFyYWJpYyA9IDB4MDZjMTsKICB0LmhlaGFyYWJpYyA9IDB4MDY0NzsKICB0LmhlaGVicmV3ID0gMHgwNWQ0OwogIHQuaGVoZmluYWxhbHRvbmVhcmFiaWMgPSAweGZiYTc7CiAgdC5oZWhmaW5hbGFsdHR3b2FyYWJpYyA9IDB4ZmVlYTsKICB0LmhlaGZpbmFsYXJhYmljID0gMHhmZWVhOwogIHQuaGVoaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmYmE1OwogIHQuaGVoaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmYmE0OwogIHQuaGVoaW5pdGlhbGFsdG9uZWFyYWJpYyA9IDB4ZmJhODsKICB0LmhlaGluaXRpYWxhcmFiaWMgPSAweGZlZWI7CiAgdC5oZWhpcmFnYW5hID0gMHgzMDc4OwogIHQuaGVobWVkaWFsYWx0b25lYXJhYmljID0gMHhmYmE5OwogIHQuaGVobWVkaWFsYXJhYmljID0gMHhmZWVjOwogIHQuaGVpc2VpZXJhc3F1YXJlID0gMHgzMzdiOwogIHQuaGVrYXRha2FuYSA9IDB4MzBkODsKICB0Lmhla2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGQ7CiAgdC5oZWt1dGFhcnVzcXVhcmUgPSAweDMzMzY7CiAgdC5oZW5naG9vayA9IDB4MDI2NzsKICB0LmhlcnV0dXNxdWFyZSA9IDB4MzMzOTsKICB0LmhldCA9IDB4MDVkNzsKICB0LmhldGhlYnJldyA9IDB4MDVkNzsKICB0Lmhob29rID0gMHgwMjY2OwogIHQuaGhvb2tzdXBlcmlvciA9IDB4MDJiMTsKICB0LmhpZXVoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YjsKICB0LmhpZXVoYXBhcmVua29yZWFuID0gMHgzMjFiOwogIHQuaGlldWhjaXJjbGVrb3JlYW4gPSAweDMyNmQ7CiAgdC5oaWV1aGtvcmVhbiA9IDB4MzE0ZTsKICB0LmhpZXVocGFyZW5rb3JlYW4gPSAweDMyMGQ7CiAgdC5oaWhpcmFnYW5hID0gMHgzMDcyOwogIHQuaGlrYXRha2FuYSA9IDB4MzBkMjsKICB0Lmhpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGI7CiAgdC5oaXJpcSA9IDB4MDViNDsKICB0LmhpcmlxMTQgPSAweDA1YjQ7CiAgdC5oaXJpcTIxID0gMHgwNWI0OwogIHQuaGlyaXEyZCA9IDB4MDViNDsKICB0LmhpcmlxaGVicmV3ID0gMHgwNWI0OwogIHQuaGlyaXFuYXJyb3doZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjQ7CiAgdC5oaXJpcXdpZGVoZWJyZXcgPSAweDA1YjQ7CiAgdC5obGluZWJlbG93ID0gMHgxZTk2OwogIHQuaG1vbm9zcGFjZSA9IDB4ZmY0ODsKICB0LmhvYXJtZW5pYW4gPSAweDA1NzA7CiAgdC5ob2hpcHRoYWkgPSAweDBlMmI7CiAgdC5ob2hpcmFnYW5hID0gMHgzMDdiOwogIHQuaG9rYXRha2FuYSA9IDB4MzBkYjsKICB0Lmhva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGU7CiAgdC5ob2xhbSA9IDB4MDViOTsKICB0LmhvbGFtMTkgPSAweDA1Yjk7CiAgdC5ob2xhbTI2ID0gMHgwNWI5OwogIHQuaG9sYW0zMiA9IDB4MDViOTsKICB0LmhvbGFtaGVicmV3ID0gMHgwNWI5OwogIHQuaG9sYW1uYXJyb3doZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob2xhbXdpZGVoZWJyZXcgPSAweDA1Yjk7CiAgdC5ob25va2h1a3RoYWkgPSAweDBlMmU7CiAgdC5ob29rYWJvdmVjb21iID0gMHgwMzA5OwogIHQuaG9va2NtYiA9IDB4MDMwOTsKICB0Lmhvb2twYWxhdGFsaXplZGJlbG93Y21iID0gMHgwMzIxOwogIHQuaG9va3JldHJvZmxleGJlbG93Y21iID0gMHgwMzIyOwogIHQuaG9vbnNxdWFyZSA9IDB4MzM0MjsKICB0Lmhvcmljb3B0aWMgPSAweDAzZTk7CiAgdC5ob3Jpem9udGFsYmFyID0gMHgyMDE1OwogIHQuaG9ybmNtYiA9IDB4MDMxYjsKICB0LmhvdHNwcmluZ3MgPSAweDI2Njg7CiAgdC5ob3VzZSA9IDB4MjMwMjsKICB0LmhwYXJlbiA9IDB4MjRhMzsKICB0LmhzdXBlcmlvciA9IDB4MDJiMDsKICB0Lmh0dXJuZWQgPSAweDAyNjU7CiAgdC5odWhpcmFnYW5hID0gMHgzMDc1OwogIHQuaHVpaXRvc3F1YXJlID0gMHgzMzMzOwogIHQuaHVrYXRha2FuYSA9IDB4MzBkNTsKICB0Lmh1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmOGM7CiAgdC5odW5nYXJ1bWxhdXQgPSAweDAyZGQ7CiAgdC5odW5nYXJ1bWxhdXRjbWIgPSAweDAzMGI7CiAgdC5odiA9IDB4MDE5NTsKICB0Lmh5cGhlbiA9IDB4MDAyZDsKICB0Lmh5cGhlbmluZmVyaW9yID0gMHhmNmU1OwogIHQuaHlwaGVubW9ub3NwYWNlID0gMHhmZjBkOwogIHQuaHlwaGVuc21hbGwgPSAweGZlNjM7CiAgdC5oeXBoZW5zdXBlcmlvciA9IDB4ZjZlNjsKICB0Lmh5cGhlbnR3byA9IDB4MjAxMDsKICB0LmkgPSAweDAwNjk7CiAgdC5pYWN1dGUgPSAweDAwZWQ7CiAgdC5pYWN5cmlsbGljID0gMHgwNDRmOwogIHQuaWJlbmdhbGkgPSAweDA5ODc7CiAgdC5pYm9wb21vZm8gPSAweDMxMjc7CiAgdC5pYnJldmUgPSAweDAxMmQ7CiAgdC5pY2Fyb24gPSAweDAxZDA7CiAgdC5pY2lyY2xlID0gMHgyNGQ4OwogIHQuaWNpcmN1bWZsZXggPSAweDAwZWU7CiAgdC5pY3lyaWxsaWMgPSAweDA0NTY7CiAgdC5pZGJsZ3JhdmUgPSAweDAyMDk7CiAgdC5pZGVvZ3JhcGhlYXJ0aGNpcmNsZSA9IDB4MzI4ZjsKICB0LmlkZW9ncmFwaGZpcmVjaXJjbGUgPSAweDMyOGI7CiAgdC5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW4gPSAweDMyM2Y7CiAgdC5pZGVvZ3JhcGhpY2NhbGxwYXJlbiA9IDB4MzIzYTsKICB0LmlkZW9ncmFwaGljY2VudHJlY2lyY2xlID0gMHgzMmE1OwogIHQuaWRlb2dyYXBoaWNjbG9zZSA9IDB4MzAwNjsKICB0LmlkZW9ncmFwaGljY29tbWEgP
20SAweDMwMDE7CiAgdC5pZGVvZ3JhcGhpY2NvbW1hbGVmdCA9IDB4ZmY2NDsKICB0LmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbiA9IDB4MzIzNzsKICB0LmlkZW9ncmFwaGljY29ycmVjdGNpcmNsZSA9IDB4MzJhMzsKICB0LmlkZW9ncmFwaGljZWFydGhwYXJlbiA9IDB4MzIyZjsKICB0LmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuID0gMHgzMjNkOwogIHQuaWRlb2dyYXBoaWNleGNlbGxlbnRjaXJjbGUgPSAweDMyOWQ7CiAgdC5pZGVvZ3JhcGhpY2Zlc3RpdmFscGFyZW4gPSAweDMyNDA7CiAgdC5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZSA9IDB4MzI5NjsKICB0LmlkZW9ncmFwaGljZmluYW5jaWFscGFyZW4gPSAweDMyMzY7CiAgdC5pZGVvZ3JhcGhpY2ZpcmVwYXJlbiA9IDB4MzIyYjsKICB0LmlkZW9ncmFwaGljaGF2ZXBhcmVuID0gMHgzMjMyOwogIHQuaWRlb2dyYXBoaWNoaWdoY2lyY2xlID0gMHgzMmE0OwogIHQuaWRlb2dyYXBoaWNpdGVyYXRpb25tYXJrID0gMHgzMDA1OwogIHQuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZSA9IDB4MzI5ODsKICB0LmlkZW9ncmFwaGljbGFib3JwYXJlbiA9IDB4MzIzODsKICB0LmlkZW9ncmFwaGljbGVmdGNpcmNsZSA9IDB4MzJhNzsKICB0LmlkZW9ncmFwaGljbG93Y2lyY2xlID0gMHgzMmE2OwogIHQuaWRlb2dyYXBoaWNtZWRpY2luZWNpcmNsZSA9IDB4MzJhOTsKICB0LmlkZW9ncmFwaGljbWV0YWxwYXJlbiA9IDB4MzIyZTsKICB0LmlkZW9ncmFwaGljbW9vbnBhcmVuID0gMHgzMjJhOwogIHQuaWRlb2dyYXBoaWNuYW1lcGFyZW4gPSAweDMyMzQ7CiAgdC5pZGVvZ3JhcGhpY3BlcmlvZCA9IDB4MzAwMjsKICB0LmlkZW9ncmFwaGljcHJpbnRjaXJjbGUgPSAweDMyOWU7CiAgdC5pZGVvZ3JhcGhpY3JlYWNocGFyZW4gPSAweDMyNDM7CiAgdC5pZGVvZ3JhcGhpY3JlcHJlc2VudHBhcmVuID0gMHgzMjM5OwogIHQuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuID0gMHgzMjNlOwogIHQuaWRlb2dyYXBoaWNyaWdodGNpcmNsZSA9IDB4MzJhODsKICB0LmlkZW9ncmFwaGljc2VjcmV0Y2lyY2xlID0gMHgzMjk5OwogIHQuaWRlb2dyYXBoaWNzZWxmcGFyZW4gPSAweDMyNDI7CiAgdC5pZGVvZ3JhcGhpY3NvY2lldHlwYXJlbiA9IDB4MzIzMzsKICB0LmlkZW9ncmFwaGljc3BhY2UgPSAweDMwMDA7CiAgdC5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbiA9IDB4MzIzNTsKICB0LmlkZW9ncmFwaGljc3RvY2twYXJlbiA9IDB4MzIzMTsKICB0LmlkZW9ncmFwaGljc3R1ZHlwYXJlbiA9IDB4MzIzYjsKICB0LmlkZW9ncmFwaGljc3VucGFyZW4gPSAweDMyMzA7CiAgdC5pZGVvZ3JhcGhpY3N1cGVydmlzZXBhcmVuID0gMHgzMjNjOwogIHQuaWRlb2dyYXBoaWN3YXRlcnBhcmVuID0gMHgzMjJjOwogIHQuaWRlb2dyYXBoaWN3b29kcGFyZW4gPSAweDMyMmQ7CiAgdC5pZGVvZ3JhcGhpY3plcm8gPSAweDMwMDc7CiAgdC5pZGVvZ3JhcGhtZXRhbGNpcmNsZSA9IDB4MzI4ZTsKICB0LmlkZW9ncmFwaG1vb25jaXJjbGUgPSAweDMyOGE7CiAgdC5pZGVvZ3JhcGhuYW1lY2lyY2xlID0gMHgzMjk0OwogIHQuaWRlb2dyYXBoc3VuY2lyY2xlID0gMHgzMjkwOwogIHQuaWRlb2dyYXBod2F0ZXJjaXJjbGUgPSAweDMyOGM7CiAgdC5pZGVvZ3JhcGh3b29kY2lyY2xlID0gMHgzMjhkOwogIHQuaWRldmEgPSAweDA5MDc7CiAgdC5pZGllcmVzaXMgPSAweDAwZWY7CiAgdC5pZGllcmVzaXNhY3V0ZSA9IDB4MWUyZjsKICB0LmlkaWVyZXNpc2N5cmlsbGljID0gMHgwNGU1OwogIHQuaWRvdGJlbG93ID0gMHgxZWNiOwogIHQuaWVicmV2ZWN5cmlsbGljID0gMHgwNGQ3OwogIHQuaWVjeXJpbGxpYyA9IDB4MDQzNTsKICB0LmlldW5nYWNpcmNsZWtvcmVhbiA9IDB4MzI3NTsKICB0LmlldW5nYXBhcmVua29yZWFuID0gMHgzMjE1OwogIHQuaWV1bmdjaXJjbGVrb3JlYW4gPSAweDMyNjc7CiAgdC5pZXVuZ2tvcmVhbiA9IDB4MzE0NzsKICB0LmlldW5ncGFyZW5rb3JlYW4gPSAweDMyMDc7CiAgdC5pZ3JhdmUgPSAweDAwZWM7CiAgdC5pZ3VqYXJhdGkgPSAweDBhODc7CiAgdC5pZ3VybXVraGkgPSAweDBhMDc7CiAgdC5paGlyYWdhbmEgPSAweDMwNDQ7CiAgdC5paG9va2Fib3ZlID0gMHgxZWM5OwogIHQuaWliZW5nYWxpID0gMHgwOTg4OwogIHQuaWljeXJpbGxpYyA9IDB4MDQzODsKICB0LmlpZGV2YSA9IDB4MDkwODsKICB0LmlpZ3VqYXJhdGkgPSAweDBhODg7CiAgdC5paWd1cm11a2hpID0gMHgwYTA4OwogIHQuaWltYXRyYWd1cm11a2hpID0gMHgwYTQwOwogIHQuaWludmVydGVkYnJldmUgPSAweDAyMGI7CiAgdC5paXNob3J0Y3lyaWxsaWMgPSAweDA0Mzk7CiAgdC5paXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzA7CiAgdC5paXZvd2Vsc2lnbmRldmEgPSAweDA5NDA7CiAgdC5paXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMwOwogIHQuaWogPSAweDAxMzM7CiAgdC5pa2F0YWthbmEgPSAweDMwYTQ7CiAgdC5pa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzI7CiAgdC5pa29yZWFuID0gMHgzMTYzOwogIHQuaWxkZSA9IDB4MDJkYzsKICB0LmlsdXloZWJyZXcgPSAweDA1YWM7CiAgdC5pbWFjcm9uID0gMHgwMTJiOwogIHQuaW1hY3JvbmN5cmlsbGljID0gMHgwNGUzOwogIHQuaW1hZ2VvcmFwcHJveGltYXRlbHllcXVhbCA9IDB4MjI1MzsKICB0LmltYXRyYWd1cm11a2hpID0gMHgwYTNmOwogIHQuaW1vbm9zcGFjZSA9IDB4ZmY0OTsKICB0LmluY3JlbWVudCA9IDB4MjIwNjsKICB0LmluZmluaXR5ID0gMHgyMjFlOwogIHQuaW5pYXJtZW5pYW4gPSAweDA1NmI7CiAgdC5pbnRlZ3JhbCA9IDB4MjIyYjsKICB0LmludGVncmFsYm90dG9tID0gMHgyMzIxOwogIHQuaW50ZWdyYWxidCA9IDB4MjMyMTsKICB0LmludGVncmFsZXggPSAweGY4ZjU7CiAgdC5pbnRlZ3JhbHRvcCA9IDB4MjMyMDsKICB0LmludGVncmFsdHAgPSAweDIzMjA7CiAgdC5pbnRlcnNlY3Rpb24gPSAweDIyMjk7CiAgdC5pbnRpc3F1YXJlID0gMHgzMzA1OwogIHQuaW52YnVsbGV0ID0gMHgyNWQ4OwogIHQuaW52Y2lyY2xlID0gMHgyNWQ5OwogIHQuaW52c21pbGVmYWNlID0gMHgyNjNiOwogIHQuaW9jeXJpbGxpYyA9IDB4MDQ1MTsKICB0LmlvZ29uZWsgPSAweDAxMmY7CiAgdC5pb3RhID0gMHgwM2I5OwogIHQuaW90YWRpZXJlc2lzID0gMHgwM2NhOwogIHQuaW90YWRpZXJlc2lzdG9ub3MgPSAweDAzOTA7CiAgdC5pb3RhbGF0aW4gPSAweDAyNjk7CiAgdC5pb3RhdG9ub3MgPSAweDAzYWY7CiAgdC5pcGFyZW4gPSAweDI0YTQ7CiAgdC5pcmlndXJtdWtoaSA9IDB4MGE3MjsKICB0LmlzbWFsbGhpcmFnYW5hID0gMHgzMDQzOwogIHQuaXNtYWxsa2F0YWthbmEgPSAweDMwYTM7CiAgdC5pc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ODsKICB0Lmlzc2hhcmJlbmdhbGkgPSAweDA5ZmE7CiAgdC5pc3Ryb2tlID0gMHgwMjY4OwogIHQuaXN1cGVyaW9yID0gMHhmNmVkOwogIHQuaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWQ7CiAgdC5pdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZDsKICB0Lml0aWxkZSA9IDB4MDEyOTsKICB0Lml0aWxkZWJlbG93ID0gMHgxZTJkOwogIHQuaXVib3BvbW9mbyA9IDB4MzEyOTsKICB0Lml1Y3lyaWxsaWMgPSAweDA0NGU7CiAgdC5pdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDliZjsKICB0Lml2b3dlbHNpZ25kZX
20ZhID0gMHgwOTNmOwogIHQuaXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWJmOwogIHQuaXpoaXRzYWN5cmlsbGljID0gMHgwNDc1OwogIHQuaXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0Nzc7CiAgdC5qID0gMHgwMDZhOwogIHQuamFhcm1lbmlhbiA9IDB4MDU3MTsKICB0LmphYmVuZ2FsaSA9IDB4MDk5YzsKICB0LmphZGV2YSA9IDB4MDkxYzsKICB0LmphZ3VqYXJhdGkgPSAweDBhOWM7CiAgdC5qYWd1cm11a2hpID0gMHgwYTFjOwogIHQuamJvcG9tb2ZvID0gMHgzMTEwOwogIHQuamNhcm9uID0gMHgwMWYwOwogIHQuamNpcmNsZSA9IDB4MjRkOTsKICB0LmpjaXJjdW1mbGV4ID0gMHgwMTM1OwogIHQuamNyb3NzZWR0YWlsID0gMHgwMjlkOwogIHQuamRvdGxlc3NzdHJva2UgPSAweDAyNWY7CiAgdC5qZWN5cmlsbGljID0gMHgwNDU4OwogIHQuamVlbWFyYWJpYyA9IDB4MDYyYzsKICB0LmplZW1maW5hbGFyYWJpYyA9IDB4ZmU5ZTsKICB0LmplZW1pbml0aWFsYXJhYmljID0gMHhmZTlmOwogIHQuamVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVhMDsKICB0LmplaGFyYWJpYyA9IDB4MDY5ODsKICB0LmplaGZpbmFsYXJhYmljID0gMHhmYjhiOwogIHQuamhhYmVuZ2FsaSA9IDB4MDk5ZDsKICB0LmpoYWRldmEgPSAweDA5MWQ7CiAgdC5qaGFndWphcmF0aSA9IDB4MGE5ZDsKICB0LmpoYWd1cm11a2hpID0gMHgwYTFkOwogIHQuamhlaGFybWVuaWFuID0gMHgwNTdiOwogIHQuamlzID0gMHgzMDA0OwogIHQuam1vbm9zcGFjZSA9IDB4ZmY0YTsKICB0LmpwYXJlbiA9IDB4MjRhNTsKICB0LmpzdXBlcmlvciA9IDB4MDJiMjsKICB0LmsgPSAweDAwNmI7CiAgdC5rYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMTsKICB0LmthYmVuZ2FsaSA9IDB4MDk5NTsKICB0LmthY3V0ZSA9IDB4MWUzMTsKICB0LmthY3lyaWxsaWMgPSAweDA0M2E7CiAgdC5rYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDliOwogIHQua2FkZXZhID0gMHgwOTE1OwogIHQua2FmID0gMHgwNWRiOwogIHQua2FmYXJhYmljID0gMHgwNjQzOwogIHQua2FmZGFnZXNoID0gMHhmYjNiOwogIHQua2FmZGFnZXNoaGVicmV3ID0gMHhmYjNiOwogIHQua2FmZmluYWxhcmFiaWMgPSAweGZlZGE7CiAgdC5rYWZoZWJyZXcgPSAweDA1ZGI7CiAgdC5rYWZpbml0aWFsYXJhYmljID0gMHhmZWRiOwogIHQua2FmbWVkaWFsYXJhYmljID0gMHhmZWRjOwogIHQua2FmcmFmZWhlYnJldyA9IDB4ZmI0ZDsKICB0LmthZ3VqYXJhdGkgPSAweDBhOTU7CiAgdC5rYWd1cm11a2hpID0gMHgwYTE1OwogIHQua2FoaXJhZ2FuYSA9IDB4MzA0YjsKICB0LmthaG9va2N5cmlsbGljID0gMHgwNGM0OwogIHQua2FrYXRha2FuYSA9IDB4MzBhYjsKICB0Lmtha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzY7CiAgdC5rYXBwYSA9IDB4MDNiYTsKICB0LmthcHBhc3ltYm9sZ3JlZWsgPSAweDAzZjA7CiAgdC5rYXB5ZW91bm1pZXVta29yZWFuID0gMHgzMTcxOwogIHQua2FweWVvdW5waGlldXBoa29yZWFuID0gMHgzMTg0OwogIHQua2FweWVvdW5waWV1cGtvcmVhbiA9IDB4MzE3ODsKICB0LmthcHllb3Vuc3NhbmdwaWV1cGtvcmVhbiA9IDB4MzE3OTsKICB0Lmthcm9yaWlzcXVhcmUgPSAweDMzMGQ7CiAgdC5rYXNoaWRhYXV0b2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc2hpZGFhdXRvbm9zaWRlYmVhcmluZ2FyYWJpYyA9IDB4MDY0MDsKICB0Lmthc21hbGxrYXRha2FuYSA9IDB4MzBmNTsKICB0Lmthc3F1YXJlID0gMHgzMzg0OwogIHQua2FzcmFhcmFiaWMgPSAweDA2NTA7CiAgdC5rYXNyYXRhbmFyYWJpYyA9IDB4MDY0ZDsKICB0Lmthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWY7CiAgdC5rYXRhaGlyYXByb2xvbmdtYXJraGFsZndpZHRoID0gMHhmZjcwOwogIHQua2F2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNDlkOwogIHQua2JvcG9tb2ZvID0gMHgzMTBlOwogIHQua2NhbHNxdWFyZSA9IDB4MzM4OTsKICB0LmtjYXJvbiA9IDB4MDFlOTsKICB0LmtjZWRpbGxhID0gMHgwMTM3OwogIHQua2NpcmNsZSA9IDB4MjRkYTsKICB0Lmtjb21tYWFjY2VudCA9IDB4MDEzNzsKICB0Lmtkb3RiZWxvdyA9IDB4MWUzMzsKICB0LmtlaGFybWVuaWFuID0gMHgwNTg0OwogIHQua2VoaXJhZ2FuYSA9IDB4MzA1MTsKICB0Lmtla2F0YWthbmEgPSAweDMwYjE7CiAgdC5rZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc5OwogIHQua2VuYXJtZW5pYW4gPSAweDA1NmY7CiAgdC5rZXNtYWxsa2F0YWthbmEgPSAweDMwZjY7CiAgdC5rZ3JlZW5sYW5kaWMgPSAweDAxMzg7CiAgdC5raGFiZW5nYWxpID0gMHgwOTk2OwogIHQua2hhY3lyaWxsaWMgPSAweDA0NDU7CiAgdC5raGFkZXZhID0gMHgwOTE2OwogIHQua2hhZ3VqYXJhdGkgPSAweDBhOTY7CiAgdC5raGFndXJtdWtoaSA9IDB4MGExNjsKICB0LmtoYWhhcmFiaWMgPSAweDA2MmU7CiAgdC5raGFoZmluYWxhcmFiaWMgPSAweGZlYTY7CiAgdC5raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhNzsKICB0LmtoYWhtZWRpYWxhcmFiaWMgPSAweGZlYTg7CiAgdC5raGVpY29wdGljID0gMHgwM2U3OwogIHQua2hoYWRldmEgPSAweDA5NTk7CiAgdC5raGhhZ3VybXVraGkgPSAweDBhNTk7CiAgdC5raGlldWtoYWNpcmNsZWtvcmVhbiA9IDB4MzI3ODsKICB0LmtoaWV1a2hhcGFyZW5rb3JlYW4gPSAweDMyMTg7CiAgdC5raGlldWtoY2lyY2xla29yZWFuID0gMHgzMjZhOwogIHQua2hpZXVraGtvcmVhbiA9IDB4MzE0YjsKICB0LmtoaWV1a2hwYXJlbmtvcmVhbiA9IDB4MzIwYTsKICB0Lmtob2toYWl0aGFpID0gMHgwZTAyOwogIHQua2hva2hvbnRoYWkgPSAweDBlMDU7CiAgdC5raG9raHVhdHRoYWkgPSAweDBlMDM7CiAgdC5raG9raHdhaXRoYWkgPSAweDBlMDQ7CiAgdC5raG9tdXR0aGFpID0gMHgwZTViOwogIHQua2hvb2sgPSAweDAxOTk7CiAgdC5raG9yYWtoYW5ndGhhaSA9IDB4MGUwNjsKICB0LmtoenNxdWFyZSA9IDB4MzM5MTsKICB0LmtpaGlyYWdhbmEgPSAweDMwNGQ7CiAgdC5raWthdGFrYW5hID0gMHgzMGFkOwogIHQua2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NzsKICB0Lmtpcm9ndXJhbXVzcXVhcmUgPSAweDMzMTU7CiAgdC5raXJvbWVldG9ydXNxdWFyZSA9IDB4MzMxNjsKICB0Lmtpcm9zcXVhcmUgPSAweDMzMTQ7CiAgdC5raXllb2thY2lyY2xla29yZWFuID0gMHgzMjZlOwogIHQua2l5ZW9rYXBhcmVua29yZWFuID0gMHgzMjBlOwogIHQua2l5ZW9rY2lyY2xla29yZWFuID0gMHgzMjYwOwogIHQua2l5ZW9ra29yZWFuID0gMHgzMTMxOwogIHQua2l5ZW9rcGFyZW5rb3JlYW4gPSAweDMyMDA7CiAgdC5raXllb2tzaW9za29yZWFuID0gMHgzMTMzOwogIHQua2plY3lyaWxsaWMgPSAweDA0NWM7CiAgdC5rbGluZWJlbG93ID0gMHgxZTM1OwogIHQua2xzcXVhcmUgPSAweDMzOTg7CiAgdC5rbWN1YmVkc3F1YXJlID0gMHgzM2E2OwogIHQua21vbm9zcGFjZSA9IDB4ZmY0YjsKICB0Lmttc3F1YXJlZHNxdWFyZSA9IDB4MzNhMjsKICB0LmtvaGlyYWdhbmEgPSAweDMwNTM7CiAgdC5rb2htc3F1YXJlID0gMHgzM2MwOwogIHQua29rYWl0aGFpID0gMHgwZTAxOwogIHQua29rYXRha2FuYSA9IDB4MzBiMzsKICB0Lmtva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2E7CiAgdC5rb29wb3NxdWFyZSA9IDB4MzMxZTsKICB0LmtvcHBhY3lyaWxsaWMgPSAweDA0ODE7CiAgdC5rb3JlYW5zdGFuZGFyZHN5bWJvbCA9IDB4MzI3ZjsKICB0Lmtvcm9uaXNjbWIgPSAweDAzNDM7CiAgdC5rcGFyZW4gPSAweDI0YTY7CiAgdC5rcGFzcXVhcmUgPSAweDMzYWE7CiAgdC5rc2ljeXJpbGxpYyA9IDB4MDQ2ZjsKICB0Lmt0c3F1YXJlID0gMHgzM2NmOwogIHQua3R1cm5lZCA9IDB4MDI5ZTsKICB0Lmt1aGlyYWdhbmEgPSAweDMwNGY7CiAgdC5rdWthdGFrYW5hID0gMHgzMGFmOwogIHQua3VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ODsKICB0Lmt2c3F1YXJlID0gMHgzM2I4OwogIHQua3dzcXVhcmUgPSAweDMzYmU7CiAgdC5sID0gMHgwMDZjOwogIHQubGFiZW5nYWxpID0gMHgwOWIyOwogIHQubGFjdXRlID0gMHgwMTNhOwogIHQubGFkZXZhID0gMHgwOTMyOwogIHQubGFndWphcmF0aSA9IDB4MGFiMjsKICB0LmxhZ3VybXVraGkgPSAweDBhMzI7CiAgdC5sYWtraGFuZ3lhb3RoYWkgPSAweDBlNDU7CiAgdC5sYW1hbGVmZmluYWxhcmFiaWMgPSAweGZlZmM7CiAgdC5sYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY4OwogIHQubGFtYWxlZmhhbXphYWJvdmVpc29sYXRlZGFyYWJpYyA9IDB4ZmVmNzsKICB0LmxhbWFsZWZoYW16YWJlbG93ZmluYWxhcmFiaWMgPSAweGZlZmE7CiAgdC5sYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljID0gMHhmZWY5OwogIHQubGFtYWxlZmlzb2xhdGVkYXJhYmljID0gMHhmZWZiOwogIHQubGFtYWxlZm1hZGRhYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmVmNjsKICB0LmxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZlZjU7CiAgdC5sYW1hcmFiaWMgPSAweDA2NDQ7CiAgdC5sYW1iZGEgPSAweDAzYmI7CiAgdC5sYW1iZGFzdHJva2UgPSAweDAxOWI7CiAgdC5sYW1lZCA9IDB4MDVkYzsKICB0LmxhbWVkZGFnZXNoID0gMHhmYjNjOwogIHQubGFtZWRkYWdlc2hoZWJyZXcgPSAweGZiM2M7CiAgdC5sYW1lZGhlYnJldyA9IDB4MDVkYzsKICB0LmxhbWZpbmFsYXJhYmljID0gMHhmZWRlOwogIHQubGFtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYTsKICB0LmxhbWluaXRpYWxhcmFiaWMgPSAweGZlZGY7CiAgdC5sYW1qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNjOTsKICB0LmxhbWtoYWhpbml0aWFsYXJhYmljID0gMHhmY2NiOwogIHQubGFtbGFtaGVoaXNvbGF0ZWRhcmFiaWMgPSAweGZkZjI7CiAgdC5sYW1tZWRpYWxhcmFiaWMgPSAweGZlZTA7CiAgdC5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmQ4ODsKICB0LmxhbW1lZW1pbml0aWFsYXJhYmljID0gMHhmY2NjOwogIHQubGFy
20Z2VjaXJjbGUgPSAweDI1ZWY7CiAgdC5sYmFyID0gMHgwMTlhOwogIHQubGJlbHQgPSAweDAyNmM7CiAgdC5sYm9wb21vZm8gPSAweDMxMGM7CiAgdC5sY2Fyb24gPSAweDAxM2U7CiAgdC5sY2VkaWxsYSA9IDB4MDEzYzsKICB0LmxjaXJjbGUgPSAweDI0ZGI7CiAgdC5sY2lyY3VtZmxleGJlbG93ID0gMHgxZTNkOwogIHQubGNvbW1hYWNjZW50ID0gMHgwMTNjOwogIHQubGRvdCA9IDB4MDE0MDsKICB0Lmxkb3RhY2NlbnQgPSAweDAxNDA7CiAgdC5sZG90YmVsb3cgPSAweDFlMzc7CiAgdC5sZG90YmVsb3dtYWNyb24gPSAweDFlMzk7CiAgdC5sZWZ0YW5nbGVhYm92ZWNtYiA9IDB4MDMxYTsKICB0LmxlZnR0YWNrYmVsb3djbWIgPSAweDAzMTg7CiAgdC5sZXNzID0gMHgwMDNjOwogIHQubGVzc2VxdWFsID0gMHgyMjY0OwogIHQubGVzc2VxdWFsb3JncmVhdGVyID0gMHgyMmRhOwogIHQubGVzc21vbm9zcGFjZSA9IDB4ZmYxYzsKICB0Lmxlc3NvcmVxdWl2YWxlbnQgPSAweDIyNzI7CiAgdC5sZXNzb3JncmVhdGVyID0gMHgyMjc2OwogIHQubGVzc292ZXJlcXVhbCA9IDB4MjI2NjsKICB0Lmxlc3NzbWFsbCA9IDB4ZmU2NDsKICB0LmxlemggPSAweDAyNmU7CiAgdC5sZmJsb2NrID0gMHgyNThjOwogIHQubGhvb2tyZXRyb2ZsZXggPSAweDAyNmQ7CiAgdC5saXJhID0gMHgyMGE0OwogIHQubGl3bmFybWVuaWFuID0gMHgwNTZjOwogIHQubGogPSAweDAxYzk7CiAgdC5samVjeXJpbGxpYyA9IDB4MDQ1OTsKICB0LmxsID0gMHhmNmMwOwogIHQubGxhZGV2YSA9IDB4MDkzMzsKICB0LmxsYWd1amFyYXRpID0gMHgwYWIzOwogIHQubGxpbmViZWxvdyA9IDB4MWUzYjsKICB0LmxsbGFkZXZhID0gMHgwOTM0OwogIHQubGx2b2NhbGljYmVuZ2FsaSA9IDB4MDllMTsKICB0Lmxsdm9jYWxpY2RldmEgPSAweDA5NjE7CiAgdC5sbHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUzOwogIHQubGx2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk2MzsKICB0LmxtaWRkbGV0aWxkZSA9IDB4MDI2YjsKICB0Lmxtb25vc3BhY2UgPSAweGZmNGM7CiAgdC5sbXNxdWFyZSA9IDB4MzNkMDsKICB0LmxvY2h1bGF0aGFpID0gMHgwZTJjOwogIHQubG9naWNhbGFuZCA9IDB4MjIyNzsKICB0LmxvZ2ljYWxub3QgPSAweDAwYWM7CiAgdC5sb2dpY2Fsbm90cmV2ZXJzZWQgPSAweDIzMTA7CiAgdC5sb2dpY2Fsb3IgPSAweDIyMjg7CiAgdC5sb2xpbmd0aGFpID0gMHgwZTI1OwogIHQubG9uZ3MgPSAweDAxN2Y7CiAgdC5sb3dsaW5lY2VudGVybGluZSA9IDB4ZmU0ZTsKICB0Lmxvd2xpbmVjbWIgPSAweDAzMzI7CiAgdC5sb3dsaW5lZGFzaGVkID0gMHhmZTRkOwogIHQubG96ZW5nZSA9IDB4MjVjYTsKICB0LmxwYXJlbiA9IDB4MjRhNzsKICB0LmxzbGFzaCA9IDB4MDE0MjsKICB0LmxzcXVhcmUgPSAweDIxMTM7CiAgdC5sc3VwZXJpb3IgPSAweGY2ZWU7CiAgdC5sdHNoYWRlID0gMHgyNTkxOwogIHQubHV0aGFpID0gMHgwZTI2OwogIHQubHZvY2FsaWNiZW5nYWxpID0gMHgwOThjOwogIHQubHZvY2FsaWNkZXZhID0gMHgwOTBjOwogIHQubHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUyOwogIHQubHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYyOwogIHQubHhzcXVhcmUgPSAweDMzZDM7CiAgdC5tID0gMHgwMDZkOwogIHQubWFiZW5nYWxpID0gMHgwOWFlOwogIHQubWFjcm9uID0gMHgwMGFmOwogIHQubWFjcm9uYmVsb3djbWIgPSAweDAzMzE7CiAgdC5tYWNyb25jbWIgPSAweDAzMDQ7CiAgdC5tYWNyb25sb3dtb2QgPSAweDAyY2Q7CiAgdC5tYWNyb25tb25vc3BhY2UgPSAweGZmZTM7CiAgdC5tYWN1dGUgPSAweDFlM2Y7CiAgdC5tYWRldmEgPSAweDA5MmU7CiAgdC5tYWd1amFyYXRpID0gMHgwYWFlOwogIHQubWFndXJtdWtoaSA9IDB4MGEyZTsKICB0Lm1haGFwYWtoaGVicmV3ID0gMHgwNWE0OwogIHQubWFoYXBha2hsZWZ0aGVicmV3ID0gMHgwNWE0OwogIHQubWFoaXJhZ2FuYSA9IDB4MzA3ZTsKICB0Lm1haWNoYXR0YXdhbG93bGVmdHRoYWkgPSAweGY4OTU7CiAgdC5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaSA9IDB4Zjg5NDsKICB0Lm1haWNoYXR0YXdhdGhhaSA9IDB4MGU0YjsKICB0Lm1haWNoYXR0YXdhdXBwZXJsZWZ0dGhhaSA9IDB4Zjg5MzsKICB0Lm1haWVrbG93bGVmdHRoYWkgPSAweGY4OGM7CiAgdC5tYWlla2xvd3JpZ2h0dGhhaSA9IDB4Zjg4YjsKICB0Lm1haWVrdGhhaSA9IDB4MGU0ODsKICB0Lm1haWVrdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4YTsKICB0Lm1haWhhbmFrYXRsZWZ0dGhhaSA9IDB4Zjg4NDsKICB0Lm1haWhhbmFrYXR0aGFpID0gMHgwZTMxOwogIHQubWFpdGFpa2h1bGVmdHRoYWkgPSAweGY4ODk7CiAgdC5tYWl0YWlraHV0aGFpID0gMHgwZTQ3OwogIHQubWFpdGhvbG93bGVmdHRoYWkgPSAweGY4OGY7CiAgdC5tYWl0aG9sb3dyaWdodHRoYWkgPSAweGY4OGU7CiAgdC5tYWl0aG90aGFpID0gMHgwZTQ5OwogIHQubWFpdGhvdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4ZDsKICB0Lm1haXRyaWxvd2xlZnR0aGFpID0gMHhmODkyOwogIHQubWFpdHJpbG93cmlnaHR0aGFpID0gMHhmODkxOwogIHQubWFpdHJpdGhhaSA9IDB4MGU0YTsKICB0Lm1haXRyaXVwcGVybGVmdHRoYWkgPSAweGY4OTA7CiAgdC5tYWl5YW1va3RoYWkgPSAweDBlNDY7CiAgdC5tYWthdGFrYW5hID0gMHgzMGRlOwogIHQubWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZjsKICB0Lm1hbGUgPSAweDI2NDI7CiAgdC5tYW5zeW9uc3F1YXJlID0gMHgzMzQ3OwogIHQubWFxYWZoZWJyZXcgPSAweDA1YmU7CiAgdC5tYXJzID0gMHgyNjQyOwogIHQubWFzb3JhY2lyY2xlaGVicmV3ID0gMHgwNWFmOwogIHQubWFzcXVhcmUgPSAweDMzODM7CiAgdC5tYm9wb21vZm8gPSAweDMxMDc7CiAgdC5tYnNxdWFyZSA9IDB4MzNkNDsKICB0Lm1jaXJjbGUgPSAweDI0ZGM7CiAgdC5tY3ViZWRzcXVhcmUgPSAweDMzYTU7CiAgdC5tZG90YWNjZW50ID0gMHgxZTQxOwogIHQubWRvdGJlbG93ID0gMHgxZTQzOwogIHQubWVlbWFyYWJpYyA9IDB4MDY0NTsKICB0Lm1lZW1maW5hbGFyYWJpYyA9IDB4ZmVlMjsKICB0Lm1lZW1pbml0aWFsYXJhYmljID0gMHhmZWUzO
20wogIHQubWVlbW1lZGlhbGFyYWJpYyA9IDB4ZmVlNDsKICB0Lm1lZW1tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMTsKICB0Lm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNDg7CiAgdC5tZWV0b3J1c3F1YXJlID0gMHgzMzRkOwogIHQubWVoaXJhZ2FuYSA9IDB4MzA4MTsKICB0Lm1laXppZXJhc3F1YXJlID0gMHgzMzdlOwogIHQubWVrYXRha2FuYSA9IDB4MzBlMTsKICB0Lm1la2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTI7CiAgdC5tZW0gPSAweDA1ZGU7CiAgdC5tZW1kYWdlc2ggPSAweGZiM2U7CiAgdC5tZW1kYWdlc2hoZWJyZXcgPSAweGZiM2U7CiAgdC5tZW1oZWJyZXcgPSAweDA1ZGU7CiAgdC5tZW5hcm1lbmlhbiA9IDB4MDU3NDsKICB0Lm1lcmtoYWhlYnJldyA9IDB4MDVhNTsKICB0Lm1lcmtoYWtlZnVsYWhlYnJldyA9IDB4MDVhNjsKICB0Lm1lcmtoYWtlZnVsYWxlZnRoZWJyZXcgPSAweDA1YTY7CiAgdC5tZXJraGFsZWZ0aGVicmV3ID0gMHgwNWE1OwogIHQubWhvb2sgPSAweDAyNzE7CiAgdC5taHpzcXVhcmUgPSAweDMzOTI7CiAgdC5taWRkbGVkb3RrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2NTsKICB0Lm1pZGRvdCA9IDB4MDBiNzsKICB0Lm1pZXVtYWNpcmNsZWtvcmVhbiA9IDB4MzI3MjsKICB0Lm1pZXVtYXBhcmVua29yZWFuID0gMHgzMjEyOwogIHQubWlldW1jaXJjbGVrb3JlYW4gPSAweDMyNjQ7CiAgdC5taWV1bWtvcmVhbiA9IDB4MzE0MTsKICB0Lm1pZXVtcGFuc2lvc2tvcmVhbiA9IDB4MzE3MDsKICB0Lm1pZXVtcGFyZW5rb3JlYW4gPSAweDMyMDQ7CiAgdC5taWV1bXBpZXVwa29yZWFuID0gMHgzMTZlOwogIHQubWlldW1zaW9za29yZWFuID0gMHgzMTZmOwogIHQubWloaXJhZ2FuYSA9IDB4MzA3ZjsKICB0Lm1pa2F0YWthbmEgPSAweDMwZGY7CiAgdC5taWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkwOwogIHQubWludXMgPSAweDIyMTI7CiAgdC5taW51c2JlbG93Y21iID0gMHgwMzIwOwogIHQubWludXNjaXJjbGUgPSAweDIyOTY7CiAgdC5taW51c21vZCA9IDB4MDJkNzsKICB0Lm1pbnVzcGx1cyA9IDB4MjIxMzsKICB0Lm1pbnV0ZSA9IDB4MjAzMjsKICB0Lm1pcmliYWFydXNxdWFyZSA9IDB4MzM0YTsKICB0Lm1pcmlzcXVhcmUgPSAweDMzNDk7CiAgdC5tbG9uZ2xlZ3R1cm5lZCA9IDB4MDI3MDsKICB0Lm1sc3F1YXJlID0gMHgzMzk2OwogIHQubW1jdWJlZHNxdWFyZSA9IDB4MzNhMzsKICB0Lm1tb25vc3BhY2UgPSAweGZmNGQ7CiAgdC5tbXNxdWFyZWRzcXVhcmUgPSAweDMzOWY7CiAgdC5tb2hpcmFnYW5hID0gMHgzMDgyOwogIHQubW9obXNxdWFyZSA9IDB4MzNjMTsKICB0Lm1va2F0YWthbmEgPSAweDMwZTI7CiAgdC5tb2thdGFrYW5haGFsZndpZHRoID0gMHhmZjkzOwogIHQubW9sc3F1YXJlID0gMHgzM2Q2OwogIHQubW9tYXRoYWkgPSAweDBlMjE7CiAgdC5tb3ZlcnNzcXVhcmUgPSAweDMzYTc7CiAgdC5tb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2E4OwogIHQubXBhcmVuID0gMHgyNGE4OwogIHQubXBhc3F1YXJlID0gMHgzM2FiOwogIHQubXNzcXVhcmUgPSAweDMzYjM7CiAgdC5tc3VwZXJpb3IgPSAweGY2ZWY7CiAgdC5tdHVybmVkID0gMHgwMjZmOwogIHQubXUgPSAweDAwYjU7CiAgdC5tdTEgPSAweDAwYjU7CiAgdC5tdWFzcXVhcmUgPSAweDMzODI7CiAgdC5tdWNoZ3JlYXRlciA9IDB4MjI2YjsKICB0Lm11Y2hsZXNzID0gMHgyMjZhOwogIHQubXVmc3F1YXJlID0gMHgzMzhjOwogIHQubXVncmVlayA9IDB4MDNiYzsKICB0Lm11Z3NxdWFyZSA9IDB4MzM4ZDsKICB0Lm11aGlyYWdhbmEgPSAweDMwODA7CiAgdC5tdWthdGFrYW5hID0gMHgzMGUwOwogIHQubXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MTsKICB0Lm11bHNxdWFyZSA9IDB4MzM5NTsKICB0Lm11bHRpcGx5ID0gMHgwMGQ3OwogIHQubXVtc3F1YXJlID0gMHgzMzliOwogIHQubXVuYWhoZWJyZXcgPSAweDA1YTM7CiAgdC5tdW5haGxlZnRoZWJyZXcgPSAweDA1YTM7CiAgdC5tdXNpY2Fsbm90ZSA9IDB4MjY2YTsKICB0Lm11c2ljYWxub3RlZGJsID0gMHgyNjZiOwogIHQubXVzaWNmbGF0c2lnbiA9IDB4MjY2ZDsKICB0Lm11c2ljc2hhcnBzaWduID0gMHgyNjZmOwogIHQubXVzc3F1YXJlID0gMHgzM2IyOwogIHQubXV2c3F1YXJlID0gMHgzM2I2OwogIHQubXV3c3F1YXJlID0gMHgzM2JjOwogIHQubXZtZWdhc3F1YXJlID0gMHgzM2I5OwogIHQubXZzcXVhcmUgPSAweDMzYjc7CiAgdC5td21lZ2FzcXVhcmUgPSAweDMzYmY7CiAgdC5td3NxdWFyZSA9IDB4MzNiZDsKICB0Lm4gPSAweDAwNmU7CiAgdC5uYWJlbmdhbGkgPSAweDA5YTg7CiAgdC5uYWJsYSA9IDB4MjIwNzsKICB0Lm5hY3V0ZSA9IDB4MDE0NDsKICB0Lm5hZGV2YSA9IDB4MDkyODsKICB0Lm5hZ3VqYXJhdGkgPSAweDBhYTg7CiAgdC5uYWd1cm11a2hpID0gMHgwYTI4OwogIHQubmFoaXJhZ2FuYSA9IDB4MzA2YTsKICB0Lm5ha2F0YWthbmEgPSAweDMwY2E7CiAgdC5uYWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg1OwogIHQubmFwb3N0cm9waGUgPSAweDAxNDk7CiAgdC5uYXNxdWFyZSA9IDB4MzM4MTsKICB0Lm5ib3BvbW9mbyA9IDB4MzEwYjsKICB0Lm5ic3BhY2UgPSAweDAwYTA7CiAgdC5uY2Fyb24gPSAweDAxNDg7CiAgdC5uY2VkaWxsYSA9IDB4MDE0NjsKICB0Lm5jaXJjbGUgPSAweDI0ZGQ7CiAgdC5uY2lyY3VtZmxleGJlbG93ID0gMHgxZTRiOwogIHQubmNvbW1hYWNjZW50ID0gMHgwMTQ2OwogIHQubmRvdGFjY2VudCA9IDB4MWU0NTsKICB0Lm5kb3RiZWxvdyA9IDB4MWU0NzsKICB0Lm5laGlyYWdhbmEgPSAweDMwNmQ7CiAgdC5uZWthdGFrYW5hID0gMHgzMGNkOwogIHQubmVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ODsKICB0Lm5ld3NoZXFlbHNpZ24gPSAweDIwYWE7CiAgdC5uZnNxdWFyZSA9IDB4MzM4YjsKICB0Lm5nYWJlbmdhbGkgPSAweDA5OTk7CiAgdC5uZ2FkZXZhID0gMHgwOTE5OwogIHQubmdhZ3VqYXJhdGkgPSAweDBhOTk7CiAgdC5uZ2FndXJtdWtoaSA9IDB4MGExOTsKICB0Lm5nb25ndXRoYWkgPSAweDBlMDc7CiAgdC5uaGlyYWdhbmEgPSAweDMwOTM7CiAgdC5uaG9va2xlZnQgPSAweDAyNzI7CiAgdC5uaG9va3JldHJvZmxleCA9IDB4MDI3MzsKICB0Lm5pZXVuYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZjsKICB0Lm5pZXVuYXBhcmVua29yZWFuID0gMHgzMjBmOwogIHQubmlldW5jaWV1Y2tvcmVhbiA9IDB4MzEzNTsKICB0Lm5pZXVuY2lyY2xla29yZWFuID0gMHgzMjYxOwogIHQubmlldW5oaWV1aGtvcmVhbiA9IDB4MzEzNjsKICB0Lm5pZXVua29yZWFuID0gMHgzMTM0OwogIHQubmlldW5wYW5zaW9za29yZWFuID0gMHgzMTY4OwogIHQubmlldW5wYXJlbmtvcmVhbiA9IDB4MzIwMTsKICB0Lm5pZXVuc2lvc2tvcmVhbiA9IDB4MzE2NzsKICB0Lm5pZXVudGlrZXV0a29yZWFuID0gMHgzMTY2OwogIHQubmloaXJhZ2FuYSA9IDB4MzA2YjsKICB0Lm5pa2F0YWthbmEgPSAweDMwY2I7CiAgdC5uaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg2OwogIHQubmlraGFoaXRsZWZ0dGhhaSA9IDB4Zjg5OTsKICB0Lm5pa2hhaGl0dGhhaSA9IDB4MGU0ZDsKICB0Lm5pbmUgPSAweDAwMzk7CiAgdC5uaW5lYXJhYmljID0gMHgwNjY5OwogIHQubmluZWJlbmdhbGkgPSAweDA5ZWY7CiAgdC5uaW5lY2lyY2xlID0gMHgyNDY4OwogIHQubmluZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OTI7CiAgdC5uaW5lZGV2YSA9IDB4MDk2ZjsKICB0Lm5pbmVndWphcmF0aSA9IDB4MGFlZjsKICB0Lm5pbmVndXJtdWtoaSA9IDB4MGE2ZjsKICB0Lm5pbmVoYWNrYXJhYmljID0gMHgwNjY5OwogIHQubmluZWhhbmd6aG91ID0gMHgzMDI5OwogIHQubmluZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjg7CiAgdC5uaW5laW5mZXJpb3IgPSAweDIwODk7CiAgdC5uaW5lbW9ub3NwYWNlID0gMHhmZjE5OwogIHQubmluZW9sZHN0eWxlID0gMHhmNzM5OwogIHQubmluZXBhcmVuID0gMHgyNDdjOwogIHQubmluZXBlcmlvZCA9IDB4MjQ5MDsKICB0Lm5pbmVwZXJzaWFuID0gMHgwNmY5OwogIHQubmluZXJvbWFuID0gMHgyMTc4OwogIHQubmluZXN1cGVyaW9yID0gMHgyMDc5OwogIHQubmluZXRlZW5jaXJjbGUgP
20SAweDI0NzI7CiAgdC5uaW5ldGVlbnBhcmVuID0gMHgyNDg2OwogIHQubmluZXRlZW5wZXJpb2QgPSAweDI0OWE7CiAgdC5uaW5ldGhhaSA9IDB4MGU1OTsKICB0Lm5qID0gMHgwMWNjOwogIHQubmplY3lyaWxsaWMgPSAweDA0NWE7CiAgdC5ua2F0YWthbmEgPSAweDMwZjM7CiAgdC5ua2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWQ7CiAgdC5ubGVncmlnaHRsb25nID0gMHgwMTllOwogIHQubmxpbmViZWxvdyA9IDB4MWU0OTsKICB0Lm5tb25vc3BhY2UgPSAweGZmNGU7CiAgdC5ubXNxdWFyZSA9IDB4MzM5YTsKICB0Lm5uYWJlbmdhbGkgPSAweDA5YTM7CiAgdC5ubmFkZXZhID0gMHgwOTIzOwogIHQubm5hZ3VqYXJhdGkgPSAweDBhYTM7CiAgdC5ubmFndXJtdWtoaSA9IDB4MGEyMzsKICB0Lm5ubmFkZXZhID0gMHgwOTI5OwogIHQubm9oaXJhZ2FuYSA9IDB4MzA2ZTsKICB0Lm5va2F0YWthbmEgPSAweDMwY2U7CiAgdC5ub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjg5OwogIHQubm9uYnJlYWtpbmdzcGFjZSA9IDB4MDBhMDsKICB0Lm5vbmVudGhhaSA9IDB4MGUxMzsKICB0Lm5vbnV0aGFpID0gMHgwZTE5OwogIHQubm9vbmFyYWJpYyA9IDB4MDY0NjsKICB0Lm5vb25maW5hbGFyYWJpYyA9IDB4ZmVlNjsKICB0Lm5vb25naHVubmFhcmFiaWMgPSAweDA2YmE7CiAgdC5ub29uZ2h1bm5hZmluYWxhcmFiaWMgPSAweGZiOWY7CiAgdC5ub29uaW5pdGlhbGFyYWJpYyA9IDB4ZmVlNzsKICB0Lm5vb25qZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkMjsKICB0Lm5vb25qZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGI7CiAgdC5ub29ubWVkaWFsYXJhYmljID0gMHhmZWU4OwogIHQubm9vbm1lZW1pbml0aWFsYXJhYmljID0gMHhmY2Q1OwogIHQubm9vbm1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ZTsKICB0Lm5vb25ub29uZmluYWxhcmFiaWMgPSAweGZjOGQ7CiAgdC5ub3Rjb250YWlucyA9IDB4MjIwYzsKICB0Lm5vdGVsZW1lbnQgPSAweDIyMDk7CiAgdC5ub3RlbGVtZW50b2YgPSAweDIyMDk7CiAgdC5ub3RlcXVhbCA9IDB4MjI2MDsKICB0Lm5vdGdyZWF0ZXIgPSAweDIyNmY7CiAgdC5ub3RncmVhdGVybm9yZXF1YWwgPSAweDIyNzE7CiAgdC5ub3RncmVhdGVybm9ybGVzcyA9IDB4MjI3OTsKICB0Lm5vdGlkZW50aWNhbCA9IDB4MjI2MjsKICB0Lm5vdGxlc3MgPSAweDIyNmU7CiAgdC5ub3RsZXNzbm9yZXF1YWwgPSAweDIyNzA7CiAgdC5ub3RwYXJhbGxlbCA9IDB4MjIyNjsKICB0Lm5vdHByZWNlZGVzID0gMHgyMjgwOwogIHQubm90c3Vic2V0ID0gMHgyMjg0OwogIHQubm90c3VjY2VlZHMgPSAweDIyODE7CiAgdC5ub3RzdXBlcnNldCA9IDB4MjI4NTsKICB0Lm5vd2FybWVuaWFuID0gMHgwNTc2OwogIHQubnBhcmVuID0gMHgyNGE5OwogIHQubnNzcXVhcmUgPSAweDMzYjE7CiAgdC5uc3VwZXJpb3IgPSAweDIwN2Y7CiAgdC5udGlsZGUgPSAweDAwZjE7CiAgdC5udSA9IDB4MDNiZDsKICB0Lm51aGlyYWdhbmEgPSAweDMwNmM7CiAgdC5udWthdGFrYW5hID0gMHgzMGNjOwogIHQubnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NzsKICB0Lm51a3RhYmVuZ2FsaSA9IDB4MDliYzsKICB0Lm51a3RhZGV2YSA9IDB4MDkzYzsKICB0Lm51a3RhZ3VqYXJhdGkgPSAweDBhYmM7CiAgdC5udWt0YWd1cm11a2hpID0gMHgwYTNjOwogIHQubnVtYmVyc2lnbiA9IDB4MDAyMzsKICB0Lm51bWJlcnNpZ25tb25vc3BhY2UgPSAweGZmMDM7CiAgdC5udW1iZXJzaWduc21hbGwgPSAweGZlNWY7CiAgdC5udW1lcmFsc2lnbmdyZWVrID0gMHgwMzc0OwogIHQubnVtZXJhbHNpZ25sb3dlcmdyZWVrID0gMHgwMzc1OwogIHQubnVtZXJvID0gMHgyMTE2OwogIHQubnVuID0gMHgwNWUwOwogIHQubnVuZGFnZXNoID0gMHhmYjQwOwogIHQubnVuZGFnZXNoaGVicmV3ID0gMHhmYjQwOwogIHQubnVuaGVicmV3ID0gMHgwNWUwOwogIHQubnZzcXVhcmUgPSAweDMzYjU7CiAgdC5ud3NxdWFyZSA9IDB4MzNiYjsKICB0Lm55YWJlbmdhbGkgPSAweDA5OWU7CiAgdC5ueWFkZXZhID0gMHgwOTFlOwogIHQubnlhZ3VqYXJhdGkgPSAweDBhOWU7CiAgdC5ueWFndXJtdWtoaSA9IDB4MGExZTsKICB0Lm8gPSAweDAwNmY7CiAgdC5vYWN1dGUgPSAweDAwZjM7CiAgdC5vYW5ndGhhaSA9IDB4MGUyZDsKICB0Lm9iYXJyZWQgPSAweDAyNzU7CiAgdC5vYmFycmVkY3lyaWxsaWMgPSAweDA0ZTk7CiAgdC5vYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYjsKICB0Lm9iZW5nYWxpID0gMHgwOTkzOwogIHQub2JvcG9tb2ZvID0gMHgzMTFiOwogIHQub2JyZXZlID0gMHgwMTRmOwogIHQub2NhbmRyYWRldmEgPSAweDA5MTE7CiAgdC5vY2FuZHJhZ3VqYXJhdGkgPSAweDBhOTE7CiAgdC5vY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0OTsKICB0Lm9jYW5kcmF2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjOTsKICB0Lm9jYXJvbiA9IDB4MDFkMjsKICB0Lm9jaXJjbGUgPSAweDI0ZGU7CiAgdC5vY2lyY3VtZmxleCA9IDB4MDBmNDsKICB0Lm9jaXJjdW1mbGV4YWN1dGUgPSAweDFlZDE7CiAgdC5vY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWQ5OwogIHQub2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMzsKICB0Lm9jaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWQ1OwogIHQub2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNzsKICB0Lm9jeXJpbGxpYyA9IDB4MDQzZTsKICB0Lm9kYmxhY3V0ZSA9IDB4MDE1MTsKICB0Lm9kYmxncmF2ZSA9IDB4MDIwZDsKICB0Lm9kZXZhID0gMHgwOTEzOwogIHQub2RpZXJlc2lzID0gMHgwMGY2OwogIHQub2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTc7CiAgdC5vZG90YmVsb3cgPSAweDFlY2Q7CiAgdC5vZSA9IDB4MDE1MzsKICB0Lm9la29yZWFuID0gMHgzMTVhOwogIHQub2dvbmVrID0gMHgwMmRiOwogIHQub2dvbmVrY21iID0gMHgwMzI4OwogIHQub2dyYXZlID0gMHgwMGYyOwogIHQub2d1amFyYXRpID0gMHgwYTkzOwogIHQub2hhcm1lbmlhbiA9IDB4MDU4NTsKICB0Lm9oaXJhZ2FuYSA9IDB4MzA0YTsKICB0Lm9ob29rYWJvdmUgPSAweDFlY2Y7CiAgdC5vaG9ybiA9IDB4MDFhMTsKICB0Lm9ob3JuYWN1dGUgPSAweDFlZGI7CiAgdC5vaG9ybmRvdGJlbG93ID0gMHgxZWUzOwogIHQub2hvcm5ncmF2ZSA9IDB4MWVkZDsKICB0Lm9ob3JuaG9va2Fib3ZlID0gMHgxZWRmOwogIHQub2hvcm50aWxkZSA9IDB4MWVlMTsKICB0Lm9odW5nYXJ1bWxhdXQgPSAweDAxNTE7CiAgdC5vaSA9IDB4MDFhMzsKICB0Lm9pbnZlcnRlZGJyZXZlID0gMHgwMjBmOwogIHQub2thdGFrYW5hID0gMHgzMGFhOwogIHQub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjc1OwogIHQub2tvcmVhbiA9IDB4MzE1NzsKICB0Lm9sZWhlYnJldyA9IDB4MDVhYjsKICB0Lm9tYWNyb24gPSAweDAxNGQ7CiAgdC5vbWFjcm9uYWN1dGUgPSAweDFlNTM7CiAgdC5vbWFjcm9uZ3JhdmUgPSAweDFlNTE7CiAgdC5vbWRldmEgPSAweDA5NTA7CiAgdC5vbWVnYSA9IDB4MDNjOTsKICB0Lm9tZWdhMSA9IDB4MDNkNjsKICB0Lm9tZWdhY3lyaWxsaWMgPSAweDA0NjE7CiAgdC5vbWVnYWxhdGluY2xvc2VkID0gMHgwMjc3OwogIHQub21lZ2Fyb3VuZGN5cmlsbGljID0gMHgwNDdiOwogIHQub21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdkOwogIHQub21lZ2F0b25vcyA9IDB4MDNjZTsKICB0Lm9tZ3VqYXJhdGkgPSAweDBhZDA7CiAgdC5vbWljcm9uID0gMHgwM2JmOwogIHQub21pY3JvbnRvbm9zID0gMHgwM2NjOwogIHQub21vbm9zcGFjZSA9IDB4ZmY0ZjsKICB0Lm9uZSA9IDB4MDAzMTsKICB0Lm9uZWFyYWJpYyA9IDB4MDY2MTsKICB0Lm9uZWJlbmdhbGkgPSAweDA5ZTc7CiAgdC5vbmVjaXJjbGUgP
20SAweDI0NjA7CiAgdC5vbmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhhOwogIHQub25lZGV2YSA9IDB4MDk2NzsKICB0Lm9uZWRvdGVubGVhZGVyID0gMHgyMDI0OwogIHQub25lZWlnaHRoID0gMHgyMTViOwogIHQub25lZml0dGVkID0gMHhmNmRjOwogIHQub25lZ3VqYXJhdGkgPSAweDBhZTc7CiAgdC5vbmVndXJtdWtoaSA9IDB4MGE2NzsKICB0Lm9uZWhhY2thcmFiaWMgPSAweDA2NjE7CiAgdC5vbmVoYWxmID0gMHgwMGJkOwogIHQub25laGFuZ3pob3UgPSAweDMwMjE7CiAgdC5vbmVpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIwOwogIHQub25laW5mZXJpb3IgPSAweDIwODE7CiAgdC5vbmVtb25vc3BhY2UgPSAweGZmMTE7CiAgdC5vbmVudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY0OwogIHQub25lb2xkc3R5bGUgPSAweGY3MzE7CiAgdC5vbmVwYXJlbiA9IDB4MjQ3NDsKICB0Lm9uZXBlcmlvZCA9IDB4MjQ4ODsKICB0Lm9uZXBlcnNpYW4gPSAweDA2ZjE7CiAgdC5vbmVxdWFydGVyID0gMHgwMGJjOwogIHQub25lcm9tYW4gPSAweDIxNzA7CiAgdC5vbmVzdXBlcmlvciA9IDB4MDBiOTsKICB0Lm9uZXRoYWkgPSAweDBlNTE7CiAgdC5vbmV0aGlyZCA9IDB4MjE1MzsKICB0Lm9vZ29uZWsgPSAweDAxZWI7CiAgdC5vb2dvbmVrbWFjcm9uID0gMHgwMWVkOwogIHQub29ndXJtdWtoaSA9IDB4MGExMzsKICB0Lm9vbWF0cmFndXJtdWtoaSA9IDB4MGE0YjsKICB0Lm9vcGVuID0gMHgwMjU0OwogIHQub3BhcmVuID0gMHgyNGFhOwogIHQub3BlbmJ1bGxldCA9IDB4MjVlNjsKICB0Lm9wdGlvbiA9IDB4MjMyNTsKICB0Lm9yZGZlbWluaW5lID0gMHgwMGFhOwogIHQub3JkbWFzY3VsaW5lID0gMHgwMGJhOwogIHQub3J0aG9nb25hbCA9IDB4MjIxZjsKICB0Lm9zaG9ydGRldmEgPSAweDA5MTI7CiAgdC5vc2hvcnR2b3dlbHNpZ25kZXZhID0gMHgwOTRhOwogIHQub3NsYXNoID0gMHgwMGY4OwogIHQub3NsYXNoYWN1dGUgPSAweDAxZmY7CiAgdC5vc21hbGxoaXJhZ2FuYSA9IDB4MzA0OTsKICB0Lm9zbWFsbGthdGFrYW5hID0gMHgzMGE5OwogIHQub3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmI7CiAgdC5vc3Ryb2tlYWN1dGUgPSAweDAxZmY7CiAgdC5vc3VwZXJpb3IgPSAweGY2ZjA7CiAgdC5vdGN5cmlsbGljID0gMHgwNDdmOwogIHQub3RpbGRlID0gMHgwMGY1OwogIHQub3RpbGRlYWN1dGUgPSAweDFlNGQ7CiAgdC5vdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZjsKICB0Lm91Ym9wb21vZm8gPSAweDMxMjE7CiAgdC5vdmVybGluZSA9IDB4MjAzZTsKICB0Lm92ZXJsaW5lY2VudGVybGluZSA9IDB4ZmU0YTsKICB0Lm92ZXJsaW5lY21iID0gMHgwMzA1OwogIHQub3ZlcmxpbmVkYXNoZWQgPSAweGZlNDk7CiAgdC5vdmVybGluZWRibHdhdnkgPSAweGZlNGM7CiAgdC5vdmVybGluZXdhdnkgPSAweGZlNGI7CiAgdC5vdmVyc2NvcmUgPSAweDAwYWY7CiAgdC5vdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljYjsKICB0Lm92b3dlbHNpZ25kZXZhID0gMHgwOTRiOwogIHQub3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWNiOwogIHQucCA9IDB4MDA3MDsKICB0LnBhYW1wc3NxdWFyZSA9IDB4MzM4MDsKICB0LnBhYXNlbnRvc3F1YXJlID0gMHgzMzJiOwogIHQucGFiZW5nYWxpID0gMHgwOWFhOwogIHQucGFjdXRlID0gMHgxZTU1OwogIHQucGFkZXZhID0gMHgwOTJhOwogIHQucGFnZWRvd24gPSAweDIxZGY7CiAgdC5wYWdldXAgPSAweDIxZGU7CiAgdC5wYWd1amFyYXRpID0gMHgwYWFhOwogIHQucGFndXJtdWtoaSA9IDB4MGEyYTsKICB0LnBhaGlyYWdhbmEgPSAweDMwNzE7CiAgdC5wYWl5YW5ub2l0aGFpID0gMHgwZTJmOwogIHQucGFrYXRha2FuYSA9IDB4MzBkMTsKICB0LnBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWIgPSAweDA0ODQ7CiAgdC5wYWxvY2hrYWN5cmlsbGljID0gMHgwNGMwOwogIHQucGFuc2lvc2tvcmVhbiA9IDB4MzE3ZjsKICB0LnBhcmFncmFwaCA9IDB4MDBiNjsKICB0LnBhcmFsbGVsID0gMHgyMjI1OwogIHQucGFyZW5sZWZ0ID0gMHgwMDI4OwogIHQucGFyZW5sZWZ0YWx0b25lYXJhYmljID0gMHhmZDNlOwogIHQucGFyZW5sZWZ0YnQgPSAweGY4ZWQ7CiAgdC5wYXJlbmxlZnRleCA9IDB4ZjhlYzsKICB0LnBhcmVubGVmdGluZmVyaW9yID0gMHgyMDhkOwogIHQucGFyZW5sZWZ0bW9ub3NwYWNlID0gMHhmZjA4OwogIHQucGFyZW5sZWZ0c21hbGwgPSAweGZlNTk7CiAgdC5wYXJlbmxlZnRzdXBlcmlvciA9IDB4MjA3ZDsKICB0LnBhcmVubGVmdHRwID0gMHhmOGViOwogIHQucGFyZW5sZWZ0dmVydGljYWwgPSAweGZlMzU7CiAgdC5wYXJlbnJpZ2h0ID0gMHgwMDI5OwogIHQucGFyZW5yaWdodGFsdG9uZWFyYWJpYyA9IDB4ZmQzZjsKICB0LnBhcmVucmlnaHRidCA9IDB4ZjhmODsKICB0LnBhcmVucmlnaHRleCA9IDB4ZjhmNzsKICB0LnBhcmVucmlnaHRpbmZlcmlvciA9IDB4MjA4ZTsKICB0LnBhcmVucmlnaHRtb25vc3BhY2UgPSAweGZmMDk7CiAgdC5wYXJlbnJpZ2h0c21hbGwgPSAweGZlNWE7CiAgdC5wYXJlbnJpZ2h0c3VwZXJpb3IgPSAweDIwN2U7CiAgdC5wYXJlbnJpZ2h0dHAgPSAweGY4ZjY7CiAgdC5wYXJlbnJpZ2h0dmVydGljYWwgPSAweGZlMzY7CiAgdC5wYXJ0aWFsZGlmZiA9IDB4MjIwMjsKICB0LnBhc2VxaGVicmV3ID0gMHgwNWMwOwogIHQucGFzaHRhaGVicmV3ID0gMHgwNTk5OwogIHQucGFzcXVhcmUgPSAweDMzYTk7CiAgdC5wYXRhaCA9IDB4MDViNzsKICB0LnBhdGFoMTEgPSAweDA1Yjc7CiAgdC5wYXRhaDFkID0gMHgwNWI3OwogIHQucGF0YWgyYSA9IDB4MDViNzsKICB0LnBhdGFoaGVicmV3ID0gMHgwNWI3OwogIHQucGF0YWhuYXJyb3doZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXRhaHdpZGVoZWJyZXcgPSAweDA1Yjc7CiAgdC5wYXplcmhlYnJldyA9IDB4MDVhMTsKICB0LnBib3BvbW9mbyA9IDB4MzEwNjsKICB0LnBjaXJjbGUgPSAweDI0ZGY7CiAgdC5wZG90YWNjZW50ID0gMHgxZTU3OwogIHQucGUgPSAweDA1ZTQ7CiAgdC5wZWN5cmlsbGljID0gMHgwNDNmOwogIHQucGVkYWdlc2ggPSAweGZiNDQ7CiAgdC5wZWRhZ2VzaGhlYnJldyA9IDB4ZmI0NDsKICB0LnBlZXppc3F1YXJlID0gMHgzMzNiOwogIHQucGVmaW5hbGRhZ2VzaGhlYnJldyA9IDB4ZmI0MzsKICB0LnBlaGFyYWJpYyA9IDB4MDY3ZTsKICB0LnBlaGFybWVuaWFuID0gMHgwNTdhOwogIHQucGVoZWJyZXcgPSAweDA1ZTQ7CiAgdC5wZWhmaW5hbGFyYWJpYyA9IDB4ZmI1NzsKICB0LnBlaGluaXRpYWxhcmFiaWMgPSAweGZiNTg7CiAgdC5wZWhpcmFnYW5hID0gMHgzMDdhOwogIHQucGVobWVkaWFsYXJhYmljID0gMHhmYjU5OwogIHQucGVrYX
20Rha2FuYSA9IDB4MzBkYTsKICB0LnBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE3OwogIHQucGVyYWZlaGVicmV3ID0gMHhmYjRlOwogIHQucGVyY2VudCA9IDB4MDAyNTsKICB0LnBlcmNlbnRhcmFiaWMgPSAweDA2NmE7CiAgdC5wZXJjZW50bW9ub3NwYWNlID0gMHhmZjA1OwogIHQucGVyY2VudHNtYWxsID0gMHhmZTZhOwogIHQucGVyaW9kID0gMHgwMDJlOwogIHQucGVyaW9kYXJtZW5pYW4gPSAweDA1ODk7CiAgdC5wZXJpb2RjZW50ZXJlZCA9IDB4MDBiNzsKICB0LnBlcmlvZGhhbGZ3aWR0aCA9IDB4ZmY2MTsKICB0LnBlcmlvZGluZmVyaW9yID0gMHhmNmU3OwogIHQucGVyaW9kbW9ub3NwYWNlID0gMHhmZjBlOwogIHQucGVyaW9kc21hbGwgPSAweGZlNTI7CiAgdC5wZXJpb2RzdXBlcmlvciA9IDB4ZjZlODsKICB0LnBlcmlzcG9tZW5pZ3JlZWtjbWIgPSAweDAzNDI7CiAgdC5wZXJwZW5kaWN1bGFyID0gMHgyMmE1OwogIHQucGVydGhvdXNhbmQgPSAweDIwMzA7CiAgdC5wZXNldGEgPSAweDIwYTc7CiAgdC5wZnNxdWFyZSA9IDB4MzM4YTsKICB0LnBoYWJlbmdhbGkgPSAweDA5YWI7CiAgdC5waGFkZXZhID0gMHgwOTJiOwogIHQucGhhZ3VqYXJhdGkgPSAweDBhYWI7CiAgdC5waGFndXJtdWtoaSA9IDB4MGEyYjsKICB0LnBoaSA9IDB4MDNjNjsKICB0LnBoaTEgPSAweDAzZDU7CiAgdC5waGlldXBoYWNpcmNsZWtvcmVhbiA9IDB4MzI3YTsKICB0LnBoaWV1cGhhcGFyZW5rb3JlYW4gPSAweDMyMWE7CiAgdC5waGlldXBoY2lyY2xla29yZWFuID0gMHgzMjZjOwogIHQucGhpZXVwaGtvcmVhbiA9IDB4MzE0ZDsKICB0LnBoaWV1cGhwYXJlbmtvcmVhbiA9IDB4MzIwYzsKICB0LnBoaWxhdGluID0gMHgwMjc4OwogIHQucGhpbnRodXRoYWkgPSAweDBlM2E7CiAgdC5waGlzeW1ib2xncmVlayA9IDB4MDNkNTsKICB0LnBob29rID0gMHgwMWE1OwogIHQucGhvcGhhbnRoYWkgPSAweDBlMWU7CiAgdC5waG9waHVuZ3RoYWkgPSAweDBlMWM7CiAgdC5waG9zYW1waGFvdGhhaSA9IDB4MGUyMDsKICB0LnBpID0gMHgwM2MwOwogIHQucGlldXBhY2lyY2xla29yZWFuID0gMHgzMjczOwogIHQucGlldXBhcGFyZW5rb3JlYW4gPSAweDMyMTM7CiAgdC5waWV1cGNpZXVja29yZWFuID0gMHgzMTc2OwogIHQucGlldXBjaXJjbGVrb3JlYW4gPSAweDMyNjU7CiAgdC5waWV1cGtpeWVva2tvcmVhbiA9IDB4MzE3MjsKICB0LnBpZXVwa29yZWFuID0gMHgzMTQyOwogIHQucGlldXBwYXJlbmtvcmVhbiA9IDB4MzIwNTsKICB0LnBpZXVwc2lvc2tpeWVva2tvcmVhbiA9IDB4MzE3NDsKICB0LnBpZXVwc2lvc2tvcmVhbiA9IDB4MzE0NDsKICB0LnBpZXVwc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3NTsKICB0LnBpZXVwdGhpZXV0aGtvcmVhbiA9IDB4MzE3NzsKICB0LnBpZXVwdGlrZXV0a29yZWFuID0gMHgzMTczOwogIHQucGloaXJhZ2FuYSA9IDB4MzA3NDsKICB0LnBpa2F0YWthbmEgPSAweDMwZDQ7CiAgdC5waXN5bWJvbGdyZWVrID0gMHgwM2Q2OwogIHQucGl3cmFybWVuaWFuID0gMHgwNTgzOwogIHQucGxhbmNrb3ZlcjJwaSA9IDB4MjEwZjsKICB0LnBsYW5ja292ZXIycGkxID0gMHgyMTBmOwogIHQucGx1cyA9IDB4MDAyYjsKICB0LnBsdXNiZWxvd2NtYiA9IDB4MDMxZjsKICB0LnBsdXNjaXJjbGUgPSAweDIyOTU7CiAgdC5wbHVzbWludXMgPSAweDAwYjE7CiAgdC5wbHVzbW9kID0gMHgwMmQ2OwogIHQucGx1c21vbm9zcGFjZSA9IDB4ZmYwYjsKICB0LnBsdXNzbWFsbCA9IDB4ZmU2MjsKICB0LnBsdXNzdXBlcmlvciA9IDB4MjA3YTsKICB0LnBtb25vc3BhY2UgPSAweGZmNTA7CiAgdC5wbXNxdWFyZSA9IDB4MzNkODsKICB0LnBvaGlyYWdhbmEgPSAweDMwN2Q7CiAgdC5wb2ludGluZ2luZGV4ZG93bndoaXRlID0gMHgyNjFmOwogIHQucG9pbnRpbmdpbmRleGxlZnR3aGl0ZSA9IDB4MjYxYzsKICB0LnBvaW50aW5naW5kZXhyaWdodHdoaXRlID0gMHgyNjFlOwogIHQucG9pbnRpbmdpbmRleHVwd2hpdGUgPSAweDI2MWQ7CiAgdC5wb2thdGFrYW5hID0gMHgzMGRkOwogIHQucG9wbGF0aGFpID0gMHgwZTFiOwogIHQucG9zdGFsbWFyayA9IDB4MzAxMjsKICB0LnBvc3RhbG1hcmtmYWNlID0gMHgzMDIwOwogIHQucHBhcmVuID0gMHgyNGFiOwogIHQucHJlY2VkZXMgPSAweDIyN2E7CiAgdC5wcmVzY3JpcHRpb24gPSAweDIxMWU7CiAgdC5wcmltZW1vZCA9IDB4MDJiOTsKICB0LnByaW1lcmV2ZXJzZWQgPSAweDIwMzU7CiAgdC5wcm9kdWN0ID0gMHgyMjBmOwogIHQucHJvamVjdGl2ZSA9IDB4MjMwNTsKICB0LnByb2xvbmdlZGthbmEgPSAweDMwZmM7CiAgdC5wcm9wZWxsb3IgPSAweDIzMTg7CiAgdC5wcm9wZXJzdWJzZXQgPSAweDIyODI7CiAgdC5wcm9wZXJzdXBlcnNldCA9IDB4MjI4MzsKICB0LnByb3BvcnRpb24gPSAweDIyMzc7CiAgdC5wcm9wb3J0aW9uYWwgPSAweDIyMWQ7CiAgdC5wc2kgPSAweDAzYzg7CiAgdC5wc2ljeXJpbGxpYyA9IDB4MDQ3MTsKICB0LnBzaWxpcG5ldW1hdGFjeXJpbGxpY2NtYiA9IDB4MDQ4NjsKICB0LnBzc3F1YXJlID0gMHgzM2IwOwogIHQucHVoaXJhZ2FuYSA9IDB4MzA3NzsKICB0LnB1a2F0YWthbmEgPSAweDMwZDc7CiAgdC5wdnNxdWFyZSA9IDB4MzNiNDsKICB0LnB3c3F1YXJlID0gMHgzM2JhOwogIHQucSA9IDB4MDA3MTsKICB0LnFhZGV2YSA9IDB4MDk1ODsKICB0LnFhZG1haGVicmV3ID0gMHgwNWE4OwogIHQucWFmYXJhYmljID0gMHgwNjQyOwogIHQucWFmZmluYWxhcmFiaWMgPSAweGZlZDY7CiAgdC5xYWZpbml0aWFsYXJhYmljID0gMHhmZWQ3OwogIHQucWFmbWVkaWFsYXJhYmljID0gMHhmZWQ4OwogIHQucWFtYXRzID0gMHgwNWI4OwogIHQucWFtYXRzMTAgPSAweDA1Yjg7CiAgdC5xYW1hdHMxYSA9IDB4MDViODsKICB0LnFhbWF0czFjID0gMHgwNWI4OwogIHQucWFtYXRzMjcgPSAweDA1Yjg7CiAgdC5xYW1hdHMyOSA9IDB4MDViODsKICB0LnFhbWF0czMzID0gMHgwNWI4OwogIHQucWFtYXRzZGUgPSAweDA1Yjg7CiAgdC5xYW1hdHNoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1Yjg7CiAgdC5xYW1hdHNxYXRhbmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3FhdGFubmFycm93aGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcWF0YW53aWRlaGVicmV3ID0gMHgwNWI4OwogIHQucWFtYXRzcXVhcnRlcmhlYnJldyA9IDB4MDViODsKICB0LnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1Yjg7CiAgdC5xYXJuZXlwYXJhaGVicmV3ID0gMHgwNTlmOwogIHQucWJvcG9tb2ZvID0gMHgzMTExOwogIHQucWNpcmNsZSA9IDB4MjRlMDsKICB0LnFob29rID0gMHgwMmEwOwogIHQucW1vbm9zcGFjZSA9IDB4ZmY1MTsKICB0LnFvZiA9IDB4MDVlNzsKICB0LnFvZmRhZ2VzaCA9IDB4ZmI0NzsKICB0LnFvZmRhZ2VzaGhlYnJldyA9IDB4ZmI0NzsKICB0LnFvZmhlYnJldyA9IDB4MDVlNzsKICB0LnFwYXJlbiA9IDB4MjRhYzsKICB0LnF1YXJ0ZXJub3RlID0gMHgyNjY5OwogIHQucXVidXRzID0gMHgwNWJiOwogIHQucXVidXRzMTggPSAweDA1YmI7CiAgdC5xdWJ1dHMyNSA9IDB4MDViYjsKICB0LnF1YnV0czMxID0gMHgwNWJiOwogIHQucXVidXRzaGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzbmFycm93aGVicmV3ID0gMHgwNWJiOwogIHQucXVidXRzcXVhcnRlcmhlYnJldyA9IDB4MDViYjsKICB0LnF1YnV0c3dpZGVoZWJyZXcgPSAweDA1YmI7CiAgdC5xdWVzdGlvbiA9IDB4MDAzZjsKICB0LnF1ZXN0aW9uYXJhYmljID0gMHgwNjFmOwogIHQucXVlc3Rpb25hcm1lbmlhbiA9IDB4MDU1ZTsKICB0LnF1ZXN0aW9uZG93biA9IDB4MDBiZjsKICB0LnF1ZXN0aW9uZG93bnNtYWxsID0gMHhmN2JmOwogIHQucXVlc3Rpb25ncmVlayA9IDB4MDM3ZTsKICB0LnF1ZXN0aW9ubW9ub3NwYWNlID0gMHhmZjFmOwogIHQucXVlc3Rpb25zbWFsbCA9IDB4ZjczZjsKICB0LnF1b3RlZGJsID0gMHgwMDIyOwogIHQucXVvdGVkYmxiYXNlID0gMHgyMDFlOwogIHQucXVvdGVkYmxsZWZ0ID0gMHgyMDFjOwogIHQucXVvdGVkYmxtb25vc3BhY2UgPSAweGZmMDI7CiAgdC5xdW90ZWRibHByaW1lID0gMHgzMDFlOwogIHQucXVvdGVkYmxwcmltZXJldmVyc2VkI
20D0gMHgzMDFkOwogIHQucXVvdGVkYmxyaWdodCA9IDB4MjAxZDsKICB0LnF1b3RlbGVmdCA9IDB4MjAxODsKICB0LnF1b3RlbGVmdHJldmVyc2VkID0gMHgyMDFiOwogIHQucXVvdGVyZXZlcnNlZCA9IDB4MjAxYjsKICB0LnF1b3RlcmlnaHQgPSAweDIwMTk7CiAgdC5xdW90ZXJpZ2h0biA9IDB4MDE0OTsKICB0LnF1b3Rlc2luZ2xiYXNlID0gMHgyMDFhOwogIHQucXVvdGVzaW5nbGUgPSAweDAwMjc7CiAgdC5xdW90ZXNpbmdsZW1vbm9zcGFjZSA9IDB4ZmYwNzsKICB0LnIgPSAweDAwNzI7CiAgdC5yYWFybWVuaWFuID0gMHgwNTdjOwogIHQucmFiZW5nYWxpID0gMHgwOWIwOwogIHQucmFjdXRlID0gMHgwMTU1OwogIHQucmFkZXZhID0gMHgwOTMwOwogIHQucmFkaWNhbCA9IDB4MjIxYTsKICB0LnJhZGljYWxleCA9IDB4ZjhlNTsKICB0LnJhZG92ZXJzc3F1YXJlID0gMHgzM2FlOwogIHQucmFkb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2FmOwogIHQucmFkc3F1YXJlID0gMHgzM2FkOwogIHQucmFmZSA9IDB4MDViZjsKICB0LnJhZmVoZWJyZXcgPSAweDA1YmY7CiAgdC5yYWd1amFyYXRpID0gMHgwYWIwOwogIHQucmFndXJtdWtoaSA9IDB4MGEzMDsKICB0LnJhaGlyYWdhbmEgPSAweDMwODk7CiAgdC5yYWthdGFrYW5hID0gMHgzMGU5OwogIHQucmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NzsKICB0LnJhbG93ZXJkaWFnb25hbGJlbmdhbGkgPSAweDA5ZjE7CiAgdC5yYW1pZGRsZWRpYWdvbmFsYmVuZ2FsaSA9IDB4MDlmMDsKICB0LnJhbXNob3JuID0gMHgwMjY0OwogIHQucmF0aW8gPSAweDIyMzY7CiAgdC5yYm9wb21vZm8gPSAweDMxMTY7CiAgdC5yY2Fyb24gPSAweDAxNTk7CiAgdC5yY2VkaWxsYSA9IDB4MDE1NzsKICB0LnJjaXJjbGUgPSAweDI0ZTE7CiAgdC5yY29tbWFhY2NlbnQgPSAweDAxNTc7CiAgdC5yZGJsZ3JhdmUgPSAweDAyMTE7CiAgdC5yZG90YWNjZW50ID0gMHgxZTU5OwogIHQucmRvdGJlbG93ID0gMHgxZTViOwogIHQucmRvdGJlbG93bWFjcm9uID0gMHgxZTVkOwogIHQucmVmZXJlbmNlbWFyayA9IDB4MjAzYjsKICB0LnJlZmxleHN1YnNldCA9IDB4MjI4NjsKICB0LnJlZmxleHN1cGVyc2V0ID0gMHgyMjg3OwogIHQucmVnaXN0ZXJlZCA9IDB4MDBhZTsKICB0LnJlZ2lzdGVyc2FucyA9IDB4ZjhlODsKICB0LnJlZ2lzdGVyc2VyaWYgPSAweGY2ZGE7CiAgdC5yZWhhcmFiaWMgPSAweDA2MzE7CiAgdC5yZWhhcm1lbmlhbiA9IDB4MDU4MDsKICB0LnJlaGZpbmFsYXJhYmljID0gMHhmZWFlOwogIHQucmVoaXJhZ2FuYSA9IDB4MzA4YzsKICB0LnJla2F0YWthbmEgPSAweDMwZWM7CiAgdC5yZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjlhOwogIHQucmVzaCA9IDB4MDVlODsKICB0LnJlc2hkYWdlc2hoZWJyZXcgPSAweGZiNDg7CiAgdC5yZXNoaGVicmV3ID0gMHgwNWU4OwogIHQucmV2ZXJzZWR0aWxkZSA9IDB4MjIzZDsKICB0LnJldmlhaGVicmV3ID0gMHgwNTk3OwogIHQucmV2aWFtdWdyYXNoaGVicmV3ID0gMHgwNTk3OwogIHQucmV2bG9naWNhbG5vdCA9IDB4MjMxMDsKICB0LnJmaXNoaG9vayA9IDB4MDI3ZTsKICB0LnJmaXNoaG9va3JldmVyc2VkID0gMHgwMjdmOwogIHQucmhhYmVuZ2FsaSA9IDB4MDlkZDsKICB0LnJoYWRldmEgPSAweDA5NWQ7CiAgdC5yaG8gPSAweDAzYzE7CiAgdC5yaG9vayA9IDB4MDI3ZDsKICB0LnJob29rdHVybmVkID0gMHgwMjdiOwogIHQucmhvb2t0dXJuZWRzdXBlcmlvciA9IDB4MDJiNTsKICB0LnJob3N5bWJvbGdyZWVrID0gMHgwM2YxOwogIHQucmhvdGljaG9va21vZCA9IDB4MDJkZTsKICB0LnJpZXVsYWNpcmNsZWtvcmVhbiA9IDB4MzI3MTsKICB0LnJpZXVsYXBhcmVua29yZWFuID0gMHgzMjExOwogIHQucmlldWxjaXJjbGVrb3JlYW4gPSAweDMyNjM7CiAgdC5yaWV1bGhpZXVoa29yZWFuID0gMHgzMTQwOwogIHQucmlldWxraXllb2trb3JlYW4gPSAweDMxM2E7CiAgdC5yaWV1bGtpeWVva3Npb3Nrb3JlYW4gPSAweDMxNjk7CiAgdC5yaWV1bGtvcmVhbiA9IDB4MzEzOTsKICB0LnJpZXVsbWlldW1rb3JlYW4gPSAweDMxM2I7CiAgdC5yaWV1bHBhbnNpb3Nrb3JlYW4gPSAweDMxNmM7CiAgdC5yaWV1bHBhcmVua29yZWFuID0gMHgzMjAzOwogIHQucmlldWxwaGlldXBoa29yZWFuID0gMHgzMTNmOwogIHQucmlldWxwaWV1cGtvcmVhbiA9IDB4MzEzYzsKICB0LnJpZXVscGlldXBzaW9za29yZWFuID0gMHgzMTZiOwogIHQucmlldWxzaW9za29yZWFuID0gMHgzMTNkOwogIHQucmlldWx0aGlldXRoa29yZWFuID0gMHgzMTNlOwogIHQucmlldWx0aWtldXRrb3JlYW4gPSAweDMxNmE7CiAgdC5yaWV1bHllb3JpbmhpZXVoa29yZWFuID0gMHgzMTZkOwogIHQucmlnaHRhbmdsZSA9IDB4MjIxZjsKICB0LnJpZ2h0dGFja2JlbG93Y21iID0gMHgwMzE5OwogIHQucmlnaHR0cmlhbmdsZSA9IDB4MjJiZjsKICB0LnJpaGlyYWdhbmEgPSAweDMwOGE7CiAgdC5yaWthdGFrYW5hID0gMHgzMGVhOwogIHQucmlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ODsKICB0LnJpbmcgPSAweDAyZGE7CiAgdC5yaW5nYmVsb3djbWIgPSAweDAzMjU7CiAgdC5yaW5nY21iID0gMHgwMzBhOwogIHQucmluZ2hhbGZsZWZ0ID0gMHgwMmJmOwogIHQucmluZ2hhbGZsZWZ0YXJtZW5pYW4gPSAweDA1NTk7CiAgdC5yaW5naGFsZmxlZnRiZWxvd2NtYiA9IDB4MDMxYzsKICB0LnJpbmdoYWxmbGVmdGNlbnRlcmVkID0gMHgwMmQzOwogIHQucmluZ2hhbGZyaWdodCA9IDB4MDJiZTsKICB0LnJpbmdoYWxmcmlnaHRiZWxvd2NtYiA9IDB4MDMzOTsKICB0LnJpbmdoYWxmcmlnaHRjZW50ZXJlZCA9IDB4MDJkMjsKICB0LnJpbnZlcnRlZGJyZXZlID0gMHgwMjEzOwogIHQucml0dG9ydXNxdWFyZSA9IDB4MzM1MTsKICB0LnJsaW5lYmVsb3cgPSAweDFlNWY7CiAgdC5ybG9uZ2xlZyA9IDB4MDI3YzsKICB0LnJsb25nbGVndHVybmVkID0gMHgwMjdhOwogIHQucm1vbm9zcGFjZSA9IDB4ZmY1MjsKICB0LnJvaGlyYWdhbmEgPSAweDMwOGQ7CiAgdC5yb2thdGFrYW5hID0gMHgzMGVkOwogIHQucm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YjsKICB0LnJvcnVhdGhhaSA9IDB4MGUyMzsKICB0LnJwYXJlbiA9IDB4MjRhZDsKICB0LnJyYWJlbmdhbGkgPSAweDA5ZGM7CiAgdC5ycmFkZXZhID0gMHgwOTMxOwogIHQucnJhZ3VybXVraGkgPSAweDBhNWM7CiAgdC5ycmVoYXJhYmljID0gMHgwNjkxOwogIHQucnJlaGZpbmFsYXJhYmljID0gMHhmYjhkOwogIHQucnJ2b2NhbGljYmVuZ2FsaSA9IDB4MDllMDsKICB0LnJydm9jYWxpY2RldmEgPSAweDA5NjA7CiAgdC5ycnZvY2FsaWNndWphcmF0aSA9IDB4MGFlMDsKICB0LnJydm9jYWxpY3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzQ7CiAgdC5ycnZvY2FsaWN2b3dlbHNpZ25kZX
20ZhID0gMHgwOTQ0OwogIHQucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzQ7CiAgdC5yc3VwZXJpb3IgPSAweGY2ZjE7CiAgdC5ydGJsb2NrID0gMHgyNTkwOwogIHQucnR1cm5lZCA9IDB4MDI3OTsKICB0LnJ0dXJuZWRzdXBlcmlvciA9IDB4MDJiNDsKICB0LnJ1aGlyYWdhbmEgPSAweDMwOGI7CiAgdC5ydWthdGFrYW5hID0gMHgzMGViOwogIHQucnVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5OTsKICB0LnJ1cGVlbWFya2JlbmdhbGkgPSAweDA5ZjI7CiAgdC5ydXBlZXNpZ25iZW5nYWxpID0gMHgwOWYzOwogIHQucnVwaWFoID0gMHhmNmRkOwogIHQucnV0aGFpID0gMHgwZTI0OwogIHQucnZvY2FsaWNiZW5nYWxpID0gMHgwOThiOwogIHQucnZvY2FsaWNkZXZhID0gMHgwOTBiOwogIHQucnZvY2FsaWNndWphcmF0aSA9IDB4MGE4YjsKICB0LnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0MzsKICB0LnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzM7CiAgdC5zID0gMHgwMDczOwogIHQuc2FiZW5nYWxpID0gMHgwOWI4OwogIHQuc2FjdXRlID0gMHgwMTViOwogIHQuc2FjdXRlZG90YWNjZW50ID0gMHgxZTY1OwogIHQuc2FkYXJhYmljID0gMHgwNjM1OwogIHQuc2FkZXZhID0gMHgwOTM4OwogIHQuc2FkZmluYWxhcmFiaWMgPSAweGZlYmE7CiAgdC5zYWRpbml0aWFsYXJhYmljID0gMHhmZWJiOwogIHQuc2FkbWVkaWFsYXJhYmljID0gMHhmZWJjOwogIHQuc2FndWphcmF0aSA9IDB4MGFiODsKICB0LnNhZ3VybXVraGkgPSAweDBhMzg7CiAgdC5zYWhpcmFnYW5hID0gMHgzMDU1OwogIHQuc2FrYXRha2FuYSA9IDB4MzBiNTsKICB0LnNha2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2I7CiAgdC5zYWxsYWxsYWhvdWFsYXloZXdhc2FsbGFtYXJhYmljID0gMHhmZGZhOwogIHQuc2FtZWtoID0gMHgwNWUxOwogIHQuc2FtZWtoZGFnZXNoID0gMHhmYjQxOwogIHQuc2FtZWtoZGFnZXNoaGVicmV3ID0gMHhmYjQxOwogIHQuc2FtZWtoaGVicmV3ID0gMHgwNWUxOwogIHQuc2FyYWFhdGhhaSA9IDB4MGUzMjsKICB0LnNhcmFhZXRoYWkgPSAweDBlNDE7CiAgdC5zYXJhYWltYWltYWxhaXRoYWkgPSAweDBlNDQ7CiAgdC5zYXJhYWltYWltdWFudGhhaSA9IDB4MGU0MzsKICB0LnNhcmFhbXRoYWkgPSAweDBlMzM7CiAgdC5zYXJhYXRoYWkgPSAweDBlMzA7CiAgdC5zYXJhZXRoYWkgPSAweDBlNDA7CiAgdC5zYXJhaWlsZWZ0dGhhaSA9IDB4Zjg4NjsKICB0LnNhcmFpaXRoYWkgPSAweDBlMzU7CiAgdC5zYXJhaWxlZnR0aGFpID0gMHhmODg1OwogIHQuc2FyYWl0aGFpID0gMHgwZTM0OwogIHQuc2FyYW90aGFpID0gMHgwZTQyOwogIHQuc2FyYXVlZWxlZnR0aGFpID0gMHhmODg4OwogIHQuc2FyYXVlZXRoYWkgPSAweDBlMzc7CiAgdC5zYXJhdWVsZWZ0dGhhaSA9IDB4Zjg4NzsKICB0LnNhcmF1ZXRoYWkgPSAweDBlMzY7CiAgdC5zYXJhdXRoYWkgPSAweDBlMzg7CiAgdC5zYXJhdXV0aGFpID0gMHgwZTM5OwogIHQuc2JvcG9tb2ZvID0gMHgzMTE5OwogIHQuc2Nhcm9uID0gMHgwMTYxOwogIHQuc2Nhcm9uZG90YWNjZW50ID0gMHgxZTY3OwogIHQuc2NlZGlsbGEgPSAweDAxNWY7CiAgdC5zY2h3YSA9IDB4MDI1OTsKICB0LnNjaHdhY3lyaWxsaWMgPSAweDA0ZDk7CiAgdC5zY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGI7CiAgdC5zY2h3YWhvb2sgPSAweDAyNWE7CiAgdC5zY2lyY2xlID0gMHgyNGUyOwogIHQuc2NpcmN1bWZsZXggPSAweDAxNWQ7CiAgdC5zY29tbWFhY2NlbnQgPSAweDAyMTk7CiAgdC5zZG90YWNjZW50ID0gMHgxZTYxOwogIHQuc2RvdGJlbG93ID0gMHgxZTYzOwogIHQuc2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY5OwogIHQuc2VhZ3VsbGJlbG93Y21iID0gMHgwMzNjOwogIHQuc2Vjb25kID0gMHgyMDMzOwogIHQuc2Vjb25kdG9uZWNoaW5lc2UgPSAweDAyY2E7CiAgdC5zZWN0aW9uID0gMHgwMGE3OwogIHQuc2VlbmFyYWJpYyA9IDB4MDYzMzsKICB0LnNlZW5maW5hbGFyYWJpYyA9IDB4ZmViMjsKICB0LnNlZW5pbml0aWFsYXJhYmljID0gMHhmZWIzOwogIHQuc2Vlbm1lZGlhbGFyYWJpYyA9IDB4ZmViNDsKICB0LnNlZ29sID0gMHgwNWI2OwogIHQuc2Vnb2wxMyA9IDB4MDViNjsKICB0LnNlZ29sMWYgPSAweDA1YjY7CiAgdC5zZWdvbDJjID0gMHgwNWI2OwogIHQuc2Vnb2xoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViNjsKICB0LnNlZ29scXVhcnRlcmhlYnJldyA9IDB4MDViNjsKICB0LnNlZ29sdGFoZWJyZXcgPSAweDA1OTI7CiAgdC5zZWdvbHdpZGVoZWJyZXcgPSAweDA1YjY7CiAgdC5zZWhhcm1lbmlhbiA9IDB4MDU3ZDsKICB0LnNlaGlyYWdhbmEgPSAweDMwNWI7CiAgdC5zZWthdGFrYW5hID0gMHgzMGJiOwogIHQuc2VrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZTsKICB0LnNlbWljb2xvbiA9IDB4MDAzYjsKICB0LnNlbWljb2xvbmFyYWJpYyA9IDB4MDYxYjsKICB0LnNlbWljb2xvbm1vbm9zcGFjZSA9IDB4ZmYxYjsKICB0LnNlbWljb2xvbnNtYWxsID0gMHhmZTU0OwogIHQuc2VtaXZvaWNlZG1hcmtrYW5hID0gMHgzMDljOwogIHQuc2VtaXZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjlmOwogIHQuc2VudGlzcXVhcmUgPSAweDMzMjI7CiAgdC5zZW50b3NxdWFyZSA9IDB4MzMyMzsKICB0LnNldmVuID0gMHgwMDM3OwogIHQuc2V2ZW5hcmFiaWMgPSAweDA2Njc7CiAgdC5zZXZlbmJlbmdhbGkgPSAweDA5ZWQ7CiAgdC5zZXZlbmNpcmNsZSA9IDB4MjQ2NjsKICB0LnNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MDsKICB0LnNldmVuZGV2YSA9IDB4MDk2ZDsKICB0LnNldmVuZWlnaHRocyA9IDB4MjE1ZTsKICB0LnNldmVuZ3VqYXJhdGkgPSAweDBhZWQ7CiAgdC5zZXZlbmd1cm11a2hpID0gMHgwYTZkOwogIHQuc2V2ZW5oYWNrYXJhYmljID0gMHgwNjY3OwogIHQuc2V2ZW5oYW5nemhvdSA9IDB4MzAyNzsKICB0LnNldmVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNjsKICB0LnNldmVuaW5mZXJpb3IgPSAweDIwODc7CiAgdC5zZXZlbm1vbm9zcGFjZSA9IDB4ZmYxNzsKICB0LnNldmVub2xkc3R5bGUgPSAweGY3Mzc7CiAgdC5zZXZlbnBhcmVuID0gMHgyNDdhOwogIHQuc2V2ZW5wZXJpb2QgPSAweDI0OGU7CiAgdC5zZXZlbnBlcnNpYW4gPSAweDA2Zjc7CiAgdC5zZXZlbnJvbWFuID0gMHgyMTc2OwogIHQuc2V2ZW5zdXBlcmlvciA9IDB4MjA3NzsKICB0LnNldmVudGVlbmNpcmNsZSA9IDB4MjQ3MDsKICB0LnNldmVudGVlbnBhcmVuID0gMHgyNDg0OwogIHQuc2V2ZW50ZWVucGVyaW9kID0gMHgyNDk4OwogIHQuc2V2ZW50aGFpID0gMHgwZTU3OwogIHQuc2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc2hhYXJtZW5pYW4gPSAweDA1Nzc7CiAgdC5zaGFiZW5nYWxpID0gMHgwOWI2OwogIHQuc2hhY3lyaWxsaWMgPSAweDA0NDg7CiAgdC5zaGFkZGFhcmFiaWMgPSAweDA2NTE7CiAgdC5zaGFkZGFkYW1tYWFyYWJpYyA9IDB4ZmM2MTsKICB0LnNoYWRkYWRhbW1hdGFuYXJhYmljID0gMHhmYzVlOwogIHQuc2hhZGRhZmF0aGFhcmFiaWMgPSAweGZjNjA7CiAgdC5zaGFkZGFrYXNyYWFyYWJpYyA9IDB4ZmM2MjsKICB0LnNoYWRkYWthc3JhdGFuYXJhYmljID0gMHhmYzVmOwogIHQuc2hhZGUgPSAweDI1OTI7CiAgdC5zaGFkZWRhcmsgPSAweDI1OTM7CiAgdC5zaGFkZWxpZ2h0ID0gMHgyNTkxOwogIHQuc2hhZGVtZWRpdW0gP
20SAweDI1OTI7CiAgdC5zaGFkZXZhID0gMHgwOTM2OwogIHQuc2hhZ3VqYXJhdGkgPSAweDBhYjY7CiAgdC5zaGFndXJtdWtoaSA9IDB4MGEzNjsKICB0LnNoYWxzaGVsZXRoZWJyZXcgPSAweDA1OTM7CiAgdC5zaGJvcG9tb2ZvID0gMHgzMTE1OwogIHQuc2hjaGFjeXJpbGxpYyA9IDB4MDQ0OTsKICB0LnNoZWVuYXJhYmljID0gMHgwNjM0OwogIHQuc2hlZW5maW5hbGFyYWJpYyA9IDB4ZmViNjsKICB0LnNoZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViNzsKICB0LnNoZWVubWVkaWFsYXJhYmljID0gMHhmZWI4OwogIHQuc2hlaWNvcHRpYyA9IDB4MDNlMzsKICB0LnNoZXFlbCA9IDB4MjBhYTsKICB0LnNoZXFlbGhlYnJldyA9IDB4MjBhYTsKICB0LnNoZXZhID0gMHgwNWIwOwogIHQuc2hldmExMTUgPSAweDA1YjA7CiAgdC5zaGV2YTE1ID0gMHgwNWIwOwogIHQuc2hldmEyMiA9IDB4MDViMDsKICB0LnNoZXZhMmUgPSAweDA1YjA7CiAgdC5zaGV2YWhlYnJldyA9IDB4MDViMDsKICB0LnNoZXZhbmFycm93aGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmFxdWFydGVyaGVicmV3ID0gMHgwNWIwOwogIHQuc2hldmF3aWRlaGVicmV3ID0gMHgwNWIwOwogIHQuc2hoYWN5cmlsbGljID0gMHgwNGJiOwogIHQuc2hpbWFjb3B0aWMgPSAweDAzZWQ7CiAgdC5zaGluID0gMHgwNWU5OwogIHQuc2hpbmRhZ2VzaCA9IDB4ZmI0OTsKICB0LnNoaW5kYWdlc2hoZWJyZXcgPSAweGZiNDk7CiAgdC5zaGluZGFnZXNoc2hpbmRvdCA9IDB4ZmIyYzsKICB0LnNoaW5kYWdlc2hzaGluZG90aGVicmV3ID0gMHhmYjJjOwogIHQuc2hpbmRhZ2VzaHNpbmRvdCA9IDB4ZmIyZDsKICB0LnNoaW5kYWdlc2hzaW5kb3RoZWJyZXcgPSAweGZiMmQ7CiAgdC5zaGluZG90aGVicmV3ID0gMHgwNWMxOwogIHQuc2hpbmhlYnJldyA9IDB4MDVlOTsKICB0LnNoaW5zaGluZG90ID0gMHhmYjJhOwogIHQuc2hpbnNoaW5kb3RoZWJyZXcgPSAweGZiMmE7CiAgdC5zaGluc2luZG90ID0gMHhmYjJiOwogIHQuc2hpbnNpbmRvdGhlYnJldyA9IDB4ZmIyYjsKICB0LnNob29rID0gMHgwMjgyOwogIHQuc2lnbWEgPSAweDAzYzM7CiAgdC5zaWdtYTEgPSAweDAzYzI7CiAgdC5zaWdtYWZpbmFsID0gMHgwM2MyOwogIHQuc2lnbWFsdW5hdGVzeW1ib2xncmVlayA9IDB4MDNmMjsKICB0LnNpaGlyYWdhbmEgPSAweDMwNTc7CiAgdC5zaWthdGFrYW5hID0gMHgzMGI3OwogIHQuc2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YzsKICB0LnNpbHVxaGVicmV3ID0gMHgwNWJkOwogIHQuc2lsdXFsZWZ0aGVicmV3ID0gMHgwNWJkOwogIHQuc2ltaWxhciA9IDB4MjIzYzsKICB0LnNpbmRvdGhlYnJldyA9IDB4MDVjMjsKICB0LnNpb3NhY2lyY2xla29yZWFuID0gMHgzMjc0OwogIHQuc2lvc2FwYXJlbmtvcmVhbiA9IDB4MzIxNDsKICB0LnNpb3NjaWV1Y2tvcmVhbiA9IDB4MzE3ZTsKICB0LnNpb3NjaXJjbGVrb3JlYW4gPSAweDMyNjY7CiAgdC5zaW9za2l5ZW9ra29yZWFuID0gMHgzMTdhOwogIHQuc2lvc2tvcmVhbiA9IDB4MzE0NTsKICB0LnNpb3NuaWV1bmtvcmVhbiA9IDB4MzE3YjsKICB0LnNpb3NwYXJlbmtvcmVhbiA9IDB4MzIwNjsKICB0LnNpb3NwaWV1cGtvcmVhbiA9IDB4MzE3ZDsKICB0LnNpb3N0aWtldXRrb3JlYW4gPSAweDMxN2M7CiAgdC5zaXggPSAweDAwMzY7CiAgdC5zaXhhcmFiaWMgPSAweDA2NjY7CiAgdC5zaXhiZW5nYWxpID0gMHgwOWVjOwogIHQuc2l4Y2lyY2xlID0gMHgyNDY1OwogIHQuc2l4Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4ZjsKICB0LnNpeGRldmEgPSAweDA5NmM7CiAgdC5zaXhndWphcmF0aSA9IDB4MGFlYzsKICB0LnNpeGd1cm11a2hpID0gMHgwYTZjOwogIHQuc2l4aGFja2FyYWJpYyA9IDB4MDY2NjsKICB0LnNpeGhhbmd6aG91ID0gMHgzMDI2OwogIHQuc2l4aWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNTsKICB0LnNpeGluZmVyaW9yID0gMHgyMDg2OwogIHQuc2l4bW9ub3NwYWNlID0gMHhmZjE2OwogIHQuc2l4b2xkc3R5bGUgPSAweGY3MzY7CiAgdC5zaXhwYXJlbiA9IDB4MjQ3OTsKICB0LnNpeHBlcmlvZCA9IDB4MjQ4ZDsKICB0LnNpeHBlcnNpYW4gPSAweDA2ZjY7CiAgdC5zaXhyb21hbiA9IDB4MjE3NTsKICB0LnNpeHN1cGVyaW9yID0gMHgyMDc2OwogIHQuc2l4dGVlbmNpcmNsZSA9IDB4MjQ2ZjsKICB0LnNpeHRlZW5jdXJyZW5jeWRlbm9taW5hdG9yYmVuZ2FsaSA9IDB4MDlmOTsKICB0LnNpeHRlZW5wYXJlbiA9IDB4MjQ4MzsKICB0LnNpeHRlZW5wZXJpb2QgPSAweDI0OTc7CiAgdC5zaXh0aGFpID0gMHgwZTU2OwogIHQuc2xhc2ggPSAweDAwMmY7CiAgdC5zbGFzaG1vbm9zcGFjZSA9IDB4ZmYwZjsKICB0LnNsb25nID0gMHgwMTdmOwogIHQuc2xvbmdkb3RhY2NlbnQgPSAweDFlOWI7CiAgdC5zbWlsZWZhY2UgPSAweDI2M2E7CiAgdC5zbW9ub3NwYWNlID0gMHhmZjUzOwogIHQuc29mcGFzdXFoZWJyZXcgPSAweDA1YzM7CiAgdC5zb2Z0aHlwaGVuID0gMHgwMGFkOwogIHQuc29mdHNpZ25jeXJpbGxpYyA9IDB4MDQ0YzsKICB0LnNvaGlyYWdhbmEgPSAweDMwNWQ7CiAgdC5zb2thdGFrYW5hID0gMHgzMGJkOwogIHQuc29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3ZjsKICB0LnNvbGlkdXNsb25nb3ZlcmxheWNtYiA9IDB4MDMzODsKICB0LnNvbGlkdXNzaG9ydG92ZXJsYXljbWIgPSAweDAzMzc7CiAgdC5zb3J1c2l0aGFpID0gMHgwZTI5OwogIHQuc29zYWxhdGhhaSA9IDB4MGUyODsKICB0LnNvc290aGFpID0gMHgwZTBiOwogIHQuc29zdWF0aGFpID0gMHgwZTJhOwogIHQuc3BhY2UgPSAweDAwMjA7CiAgdC5zcGFjZWhhY2thcmFiaWMgPSAweDAwMjA7CiAgdC5zcGFkZSA9IDB4MjY2MDsKICB0LnNwYWRlc3VpdGJsYWNrID0gMHgyNjYwOwogIHQuc3BhZGVzdWl0d2hpdGUgPSAweDI2NjQ7CiAgdC5zcGFyZW4gPSAweDI0YWU7CiAgdC5zcXVhcmViZWxvd2NtYiA9IDB4MDMzYjsKICB0LnNxdWFyZWNjID0gMHgzM2M0OwogIHQuc3F1YXJlY20gPSAweDMzOWQ7CiAgdC5zcXVhcmVkaWFnb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE5OwogIHQuc3F1YXJlaG9yaXpvbnRhbGZpbGwgPSAweDI1YTQ7CiAgdC5zcXVhcmVrZyA9IDB4MzM4ZjsKICB0LnNxdWFyZWttID0gMHgzMzllOwogIHQuc3F1YXJla21jYXBpdGFsID0gMHgzM2NlOwogIHQuc3F1YXJlbG4gPSAweDMzZDE7CiAgdC5zcXVhcmVsb2cgPSAweDMzZDI7CiAgdC5zcXVhcmVtZyA9IDB4MzM4ZTsKICB0LnNxdWFyZW1pbCA9IDB4MzNkNTsKICB0LnNxdWFyZW1tID0gMHgzMzljOwogIHQuc3F1YXJlbXNxdWFyZWQgPSAweDMzYTE7CiAgdC5zcXVhcmVvcnRob2dvbmFsY3Jvc3NoYXRjaGZpbGwgPSAweDI1YTY7CiAgdC5zcXVhcmV1cHBlcmxlZnR0b2xvd2VycmlnaHRmaWxsID0gMHgyNWE3OwogIHQuc3F1YXJldXBwZXJyaWdodHRvbG93ZXJsZWZ0ZmlsbCA9IDB4MjVhODsKICB0LnNxdWFyZXZlcnRpY2FsZmlsbCA9IDB4MjVhNTsKICB0LnNxdWFyZXdoaXRld2l0aHNtYWxsYmxhY2sgP
20SAweDI1YTM7CiAgdC5zcnNxdWFyZSA9IDB4MzNkYjsKICB0LnNzYWJlbmdhbGkgPSAweDA5Yjc7CiAgdC5zc2FkZXZhID0gMHgwOTM3OwogIHQuc3NhZ3VqYXJhdGkgPSAweDBhYjc7CiAgdC5zc2FuZ2NpZXVja29yZWFuID0gMHgzMTQ5OwogIHQuc3NhbmdoaWV1aGtvcmVhbiA9IDB4MzE4NTsKICB0LnNzYW5naWV1bmdrb3JlYW4gPSAweDMxODA7CiAgdC5zc2FuZ2tpeWVva2tvcmVhbiA9IDB4MzEzMjsKICB0LnNzYW5nbmlldW5rb3JlYW4gPSAweDMxNjU7CiAgdC5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTQzOwogIHQuc3NhbmdzaW9za29yZWFuID0gMHgzMTQ2OwogIHQuc3Nhbmd0aWtldXRrb3JlYW4gPSAweDMxMzg7CiAgdC5zc3VwZXJpb3IgPSAweGY2ZjI7CiAgdC5zdGVybGluZyA9IDB4MDBhMzsKICB0LnN0ZXJsaW5nbW9ub3NwYWNlID0gMHhmZmUxOwogIHQuc3Ryb2tlbG9uZ292ZXJsYXljbWIgPSAweDAzMzY7CiAgdC5zdHJva2VzaG9ydG92ZXJsYXljbWIgPSAweDAzMzU7CiAgdC5zdWJzZXQgPSAweDIyODI7CiAgdC5zdWJzZXRub3RlcXVhbCA9IDB4MjI4YTsKICB0LnN1YnNldG9yZXF1YWwgPSAweDIyODY7CiAgdC5zdWNjZWVkcyA9IDB4MjI3YjsKICB0LnN1Y2h0aGF0ID0gMHgyMjBiOwogIHQuc3VoaXJhZ2FuYSA9IDB4MzA1OTsKICB0LnN1a2F0YWthbmEgPSAweDMwYjk7CiAgdC5zdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjdkOwogIHQuc3VrdW5hcmFiaWMgPSAweDA2NTI7CiAgdC5zdW1tYXRpb24gPSAweDIyMTE7CiAgdC5zdW4gPSAweDI2M2M7CiAgdC5zdXBlcnNldCA9IDB4MjI4MzsKICB0LnN1cGVyc2V0bm90ZXF1YWwgPSAweDIyOGI7CiAgdC5zdXBlcnNldG9yZXF1YWwgPSAweDIyODc7CiAgdC5zdnNxdWFyZSA9IDB4MzNkYzsKICB0LnN5b3V3YWVyYXNxdWFyZSA9IDB4MzM3YzsKICB0LnQgPSAweDAwNzQ7CiAgdC50YWJlbmdhbGkgPSAweDA5YTQ7CiAgdC50YWNrZG93biA9IDB4MjJhNDsKICB0LnRhY2tsZWZ0ID0gMHgyMmEzOwogIHQudGFkZXZhID0gMHgwOTI0OwogIHQudGFndWphcmF0aSA9IDB4MGFhNDsKICB0LnRhZ3VybXVraGkgPSAweDBhMjQ7CiAgdC50YWhhcmFiaWMgPSAweDA2Mzc7CiAgdC50YWhmaW5hbGFyYWJpYyA9IDB4ZmVjMjsKICB0LnRhaGluaXRpYWxhcmFiaWMgPSAweGZlYzM7CiAgdC50YWhpcmFnYW5hID0gMHgzMDVmOwogIHQudGFobWVkaWFsYXJhYmljID0gMHhmZWM0OwogIHQudGFpc3lvdWVyYXNxdWFyZSA9IDB4MzM3ZDsKICB0LnRha2F0YWthbmEgPSAweDMwYmY7CiAgdC50YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgwOwogIHQudGF0d2VlbGFyYWJpYyA9IDB4MDY0MDsKICB0LnRhdSA9IDB4MDNjNDsKICB0LnRhdiA9IDB4MDVlYTsKICB0LnRhdmRhZ2VzID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoID0gMHhmYjRhOwogIHQudGF2ZGFnZXNoaGVicmV3ID0gMHhmYjRhOwogIHQudGF2aGVicmV3ID0gMHgwNWVhOwogIHQudGJhciA9IDB4MDE2NzsKICB0LnRib3BvbW9mbyA9IDB4MzEwYTsKICB0LnRjYXJvbiA9IDB4MDE2NTsKICB0LnRjY3VybCA9IDB4MDJhODsKICB0LnRjZWRpbGxhID0gMHgwMTYzOwogIHQudGNoZWhhcmFiaWMgPSAweDA2ODY7CiAgdC50Y2hlaGZpbmFsYXJhYmljID0gMHhmYjdiOwogIHQudGNoZWhpbml0aWFsYXJhYmljID0gMHhmYjdjOwogIHQudGNoZWhtZWRpYWxhcmFiaWMgPSAweGZiN2Q7CiAgdC50Y2lyY2xlID0gMHgyNGUzOwogIHQudGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MTsKICB0LnRjb21tYWFjY2VudCA9IDB4MDE2MzsKICB0LnRkaWVyZXNpcyA9IDB4MWU5NzsKICB0LnRkb3RhY2NlbnQgPSAweDFlNmI7CiAgdC50ZG90YmVsb3cgPSAweDFlNmQ7CiAgdC50ZWN5cmlsbGljID0gMHgwNDQyOwogIHQudGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhZDsKICB0LnRlaGFyYWJpYyA9IDB4MDYyYTsKICB0LnRlaGZpbmFsYXJhYmljID0gMHhmZTk2OwogIHQudGVoaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMjsKICB0LnRlaGhhaGlzb2xhdGVkYXJhYmljID0gMHhmYzBjOwogIHQudGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5NzsKICB0LnRlaGlyYWdhbmEgPSAweDMwNjY7CiAgdC50ZWhqZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMTsKICB0LnRlaGplZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwYjsKICB0LnRlaG1hcmJ1dGFhcmFiaWMgPSAweDA2Mjk7CiAgdC50ZWhtYXJidXRhZmluYWxhcmFiaWMgPSAweGZlOTQ7CiAgdC50ZWhtZWRpYWxhcmFiaWMgPSAweGZlOTg7CiAgdC50ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhNDsKICB0LnRlaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmMwZTsKICB0LnRlaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM3MzsKICB0LnRla2F0YWthbmEgPSAweDMwYzY7CiAgdC50ZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgzOwogIHQudGVsZXBob25lID0gMHgyMTIxOwogIHQudGVsZXBob25lYmxhY2sgP
20SAweDI2MGU7CiAgdC50ZWxpc2hhZ2Vkb2xhaGVicmV3ID0gMHgwNWEwOwogIHQudGVsaXNoYXFldGFuYWhlYnJldyA9IDB4MDVhOTsKICB0LnRlbmNpcmNsZSA9IDB4MjQ2OTsKICB0LnRlbmlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjk7CiAgdC50ZW5wYXJlbiA9IDB4MjQ3ZDsKICB0LnRlbnBlcmlvZCA9IDB4MjQ5MTsKICB0LnRlbnJvbWFuID0gMHgyMTc5OwogIHQudGVzaCA9IDB4MDJhNzsKICB0LnRldCA9IDB4MDVkODsKICB0LnRldGRhZ2VzaCA9IDB4ZmIzODsKICB0LnRldGRhZ2VzaGhlYnJldyA9IDB4ZmIzODsKICB0LnRldGhlYnJldyA9IDB4MDVkODsKICB0LnRldHNlY3lyaWxsaWMgPSAweDA0YjU7CiAgdC50ZXZpcmhlYnJldyA9IDB4MDU5YjsKICB0LnRldmlybGVmdGhlYnJldyA9IDB4MDU5YjsKICB0LnRoYWJlbmdhbGkgPSAweDA5YTU7CiAgdC50aGFkZXZhID0gMHgwOTI1OwogIHQudGhhZ3VqYXJhdGkgPSAweDBhYTU7CiAgdC50aGFndXJtdWtoaSA9IDB4MGEyNTsKICB0LnRoYWxhcmFiaWMgPSAweDA2MzA7CiAgdC50aGFsZmluYWxhcmFiaWMgPSAweGZlYWM7CiAgdC50aGFudGhha2hhdGxvd2xlZnR0aGFpID0gMHhmODk4OwogIHQudGhhbnRoYWtoYXRsb3dyaWdodHRoYWkgPSAweGY4OTc7CiAgdC50aGFudGhha2hhdHRoYWkgPSAweDBlNGM7CiAgdC50aGFudGhha2hhdHVwcGVybGVmdHRoYWkgPSAweGY4OTY7CiAgdC50aGVoYXJhYmljID0gMHgwNjJiOwogIHQudGhlaGZpbmFsYXJhYmljID0gMHhmZTlhOwogIHQudGhlaGluaXRpYWxhcmFiaWMgPSAweGZlOWI7CiAgdC50aGVobWVkaWFsYXJhYmljID0gMHhmZTljOwogIHQudGhlcmVleGlzdHMgPSAweDIyMDM7CiAgdC50aGVyZWZvcmUgPSAweDIyMzQ7CiAgdC50aGV0YSA9IDB4MDNiODsKICB0LnRoZXRhMSA9IDB4MDNkMTsKICB0LnRoZXRhc3ltYm9sZ3JlZWsgPSAweDAzZDE7CiAgdC50aGlldXRoYWNpcmNsZWtvcmVhbiA9IDB4MzI3OTsKICB0LnRoaWV1dGhhcGFyZW5rb3JlYW4gPSAweDMyMTk7CiAgdC50aGlldXRoY2lyY2xla29yZWFuID0gMHgzMjZiOwogIHQudGhpZXV0aGtvcmVhbiA9IDB4MzE0YzsKICB0LnRoaWV1dGhwYXJlbmtvcmVhbiA9IDB4MzIwYjsKICB0LnRoaXJ0ZWVuY2lyY2xlID0gMHgyNDZjOwogIHQudGhpcnRlZW5wYXJlbiA9IDB4MjQ4MDsKICB0LnRoaXJ0ZWVucGVyaW9kID0gMHgyNDk0OwogIHQudGhvbmFuZ21vbnRob3RoYWkgPSAweDBlMTE7CiAgdC50aG9vayA9IDB4MDFhZDsKICB0LnRob3BodXRoYW90aGFpID0gMHgwZTEyOwogIHQudGhvcm4gPSAweDAwZmU7CiAgdC50aG90aGFoYW50aGFpID0gMHgwZTE3OwogIHQudGhvdGhhbnRoYWkgPSAweDBlMTA7CiAgdC50aG90aG9uZ3RoYWkgPSAweDBlMTg7CiAgdC50aG90aHVuZ3RoYWkgPSAweDBlMTY7CiAgdC50aG91c2FuZGN5cmlsbGljID0gMHgwNDgyOwogIHQudGhvdXNhbmRzc2VwYXJhdG9yYXJhYmljID0gMHgwNjZjOwogIHQudGhvdXNhbmRzc2VwYXJhdG9ycGVyc2lhbiA9IDB4MDY2YzsKICB0LnRocmVlID0gMHgwMDMzOwogIHQudGhyZWVhcmFiaWMgPSAweDA2NjM7CiAgdC50aHJlZWJlbmdhbGkgPSAweDA5ZTk7CiAgdC50aHJlZWNpcmNsZSA9IDB4MjQ2MjsKICB0LnRocmVlY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YzsKICB0LnRocmVlZGV2YSA9IDB4MDk2OTsKICB0LnRocmVlZWlnaHRocyA9IDB4MjE1YzsKICB0LnRocmVlZ3VqYXJhdGkgPSAweDBhZTk7CiAgdC50aHJlZWd1cm11a2hpID0gMHgwYTY5OwogIHQudGhyZWVoYWNrYXJhYmljID0gMHgwNjYzOwogIHQudGhyZWVoYW5nemhvdSA9IDB4MzAyMzsKICB0LnRocmVlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMjsKICB0LnRocmVlaW5mZXJpb3IgPSAweDIwODM7CiAgdC50aHJlZW1vbm9zcGFjZSA9IDB4ZmYxMzsKICB0LnRocmVlbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNjsKICB0LnRocmVlb2xkc3R5bGUgPSAweGY3MzM7CiAgdC50aHJlZXBhcmVuID0gMHgyNDc2OwogIHQudGhyZWVwZXJpb2QgPSAweDI0OGE7CiAgdC50aHJlZXBlcnNpYW4gPSAweDA2ZjM7CiAgdC50aHJlZXF1YXJ0ZXJzID0gMHgwMGJlOwogIHQudGhyZWVxdWFydGVyc2VtZGFzaCA9IDB4ZjZkZTsKICB0LnRocmVlcm9tYW4gPSAweDIxNzI7CiAgdC50aHJlZXN1cGVyaW9yID0gMHgwMGIzOwogIHQudGhyZWV0aGFpID0gMHgwZTUzOwogIHQudGh6c3F1YXJlID0gMHgzMzk0OwogIHQudGloaXJhZ2FuYSA9IDB4MzA2MTsKICB0LnRpa2F0YWthbmEgPSAweDMwYzE7CiAgdC50aWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgxOwogIHQudGlrZXV0YWNpcmNsZWtvcmVhbiA9IDB4MzI3MDsKICB0LnRpa2V1dGFwYXJlbmtvcmVhbiA9IDB4MzIxMDsKICB0LnRpa2V1dGNpcmNsZWtvcmVhbiA9IDB4MzI2MjsKICB0LnRpa2V1dGtvcmVhbiA9IDB4MzEzNzsKICB0LnRpa2V1dHBhcmVua29yZWFuID0gMHgzMjAyOwogIHQudGlsZGUgPSAweDAyZGM7CiAgdC50aWxkZWJlbG93Y21iID0gMHgwMzMwOwogIHQudGlsZGVjbWIgPSAweDAzMDM7CiAgdC50aWxkZWNvbWIgPSAweDAzMDM7CiAgdC50aWxkZWRvdWJsZWNtYiA9IDB4MDM2MDsKICB0LnRpbGRlb3BlcmF0b3IgPSAweDIyM2M7CiAgdC50aWxkZW92ZXJsYXljbWIgPSAweDAzMzQ7CiAgdC50aWxkZXZlcnRpY2FsY21iID0gMHgwMzNlOwogIHQudGltZXNjaXJjbGUgPSAweDIyOTc7CiAgdC50aXBlaGFoZWJyZXcgPSAweDA1OTY7CiAgdC50aXBlaGFsZWZ0aGVicmV3ID0gMHgwNTk2OwogIHQudGlwcGlndXJtdWtoaSA9IDB4MGE3MDsKICB0LnRpdGxvY3lyaWxsaWNjbWIgPSAweDA0ODM7CiAgdC50aXduYXJtZW5pYW4gPSAweDA1N2Y7CiAgdC50bGluZWJlbG93ID0gMHgxZTZmOwogIHQudG1vbm9zcGFjZSA9IDB4ZmY1NDsKICB0LnRvYXJtZW5pYW4gPSAweDA1Njk7CiAgdC50b2hpcmFnYW5hID0gMHgzMDY4OwogIHQudG9rYXRha2FuYSA9IDB4MzBjODsKICB0LnRva2F0YWthbmFoYWxmd2lkdGggPSAweGZmODQ7CiAgdC50b25lYmFyZXh0cmFoaWdobW9kID0gMHgwMmU1OwogIHQudG9uZWJhcmV4dHJhbG93bW9kID0gMHgwMmU5OwogIHQudG9uZWJhcmhpZ2htb2QgPSAweDAyZTY7CiAgdC50b25lYmFybG93bW9kID0gMHgwMmU4OwogIHQudG9uZWJhcm1pZG1vZCA9IDB4MDJlNzsKICB0LnRvbmVmaXZlID0gMHgwMWJkOwogIHQudG9uZXNpeCA9IDB4MDE4NTsKICB0LnRvbmV0d28gPSAweDAxYTg7CiAgdC50b25vcyA9IDB4MDM4NDsKICB0LnRvbnNxdWFyZSA9IDB4MzMyNzsKICB0LnRvcGF0YWt0aGFpID0gMHgwZTBmOw
20ogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0ID0gMHgzMDE0OwogIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRsZWZ0c21hbGwgPSAweGZlNWQ7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzOTsKICB0LnRvcnRvaXNlc2hlbGxicmFja2V0cmlnaHQgPSAweDMwMTU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0c21hbGwgPSAweGZlNWU7CiAgdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2E7CiAgdC50b3Rhb3RoYWkgPSAweDBlMTU7CiAgdC50cGFsYXRhbGhvb2sgPSAweDAxYWI7CiAgdC50cGFyZW4gPSAweDI0YWY7CiAgdC50cmFkZW1hcmsgPSAweDIxMjI7CiAgdC50cmFkZW1hcmtzYW5zID0gMHhmOGVhOwogIHQudHJhZGVtYXJrc2VyaWYgPSAweGY2ZGI7CiAgdC50cmV0cm9mbGV4aG9vayA9IDB4MDI4ODsKICB0LnRyaWFnZG4gPSAweDI1YmM7CiAgdC50cmlhZ2xmID0gMHgyNWM0OwogIHQudHJpYWdydCA9IDB4MjViYTsKICB0LnRyaWFndXAgPSAweDI1YjI7CiAgdC50cyA9IDB4MDJhNjsKICB0LnRzYWRpID0gMHgwNWU2OwogIHQudHNhZGlkYWdlc2ggPSAweGZiNDY7CiAgdC50c2FkaWRhZ2VzaGhlYnJldyA9IDB4ZmI0NjsKICB0LnRzYWRpaGVicmV3ID0gMHgwNWU2OwogIHQudHNlY3lyaWxsaWMgPSAweDA0NDY7CiAgdC50c2VyZSA9IDB4MDViNTsKICB0LnRzZXJlMTIgPSAweDA1YjU7CiAgdC50c2VyZTFlID0gMHgwNWI1OwogIHQudHNlcmUyYiA9IDB4MDViNTsKICB0LnRzZXJlaGVicmV3ID0gMHgwNWI1OwogIHQudHNlcmVuYXJyb3doZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjU7CiAgdC50c2VyZXdpZGVoZWJyZXcgPSAweDA1YjU7CiAgdC50c2hlY3lyaWxsaWMgPSAweDA0NWI7CiAgdC50c3VwZXJpb3IgPSAweGY2ZjM7CiAgdC50dGFiZW5nYWxpID0gMHgwOTlmOwogIHQudHRhZGV2YSA9IDB4MDkxZjsKICB0LnR0YWd1amFyYXRpID0gMHgwYTlmOwogIHQudHRhZ3VybXVraGkgPSAweDBhMWY7CiAgdC50dGVoYXJhYmljID0gMHgwNjc5OwogIHQudHRlaGZpbmFsYXJhYmljID0gMHhmYjY3OwogIHQudHRlaGluaXRpYWxhcmFiaWMgPSAweGZiNjg7CiAgdC50dGVobWVkaWFsYXJhYmljID0gMHhmYjY5OwogIHQudHRoYWJlbmdhbGkgPSAweDA5YTA7CiAgdC50dGhhZGV2YSA9IDB4MDkyMDsKICB0LnR0aGFndWphcmF0aSA9IDB4MGFhMDsKICB0LnR0aGFndXJtdWtoaSA9IDB4MGEyMDsKICB0LnR0dXJuZWQgPSAweDAyODc7CiAgdC50dWhpcmFnYW5hID0gMHgzMDY0OwogIHQudHVrYXRha2FuYSA9IDB4MzBjNDsKICB0LnR1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmODI7CiAgdC50dXNtYWxsaGlyYWdhbmEgPSAweDMwNjM7CiAgdC50dXNtYWxsa2F0YWthbmEgPSAweDMwYzM7CiAgdC50dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmY7CiAgdC50d2VsdmVjaXJjbGUgPSAweDI0NmI7CiAgdC50d2VsdmVwYXJlbiA9IDB4MjQ3ZjsKICB0LnR3ZWx2ZXBlcmlvZCA9IDB4MjQ5MzsKICB0LnR3ZWx2ZXJvbWFuID0gMHgyMTdiOwogIHQudHdlbnR5Y2lyY2xlID0gMHgyNDczOwogIHQudHdlbnR5aGFuZ3pob3UgPSAweDUzNDQ7CiAgdC50d2VudHlwYXJlbiA9IDB4MjQ4NzsKICB0LnR3ZW50eXBlcmlvZCA9IDB4MjQ5YjsKICB0LnR3byA9IDB4MDAzMjsKICB0LnR3b2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2JlbmdhbGkgPSAweDA5ZTg7CiAgdC50d29jaXJjbGUgPSAweDI0NjE7CiAgdC50d29jaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhiOwogIHQudHdvZGV2YSA9IDB4MDk2ODsKICB0LnR3b2RvdGVubGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVyID0gMHgyMDI1OwogIHQudHdvZG90bGVhZGVydmVydGljYWwgPSAweGZlMzA7CiAgdC50d29ndWphcmF0aSA9IDB4MGFlODsKICB0LnR3b2d1cm11a2hpID0gMHgwYTY4OwogIHQudHdvaGFja2FyYWJpYyA9IDB4MDY2MjsKICB0LnR3b2hhbmd6aG91ID0gMHgzMDIyOwogIHQudHdvaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMTsKICB0LnR3b2luZmVyaW9yID0gMHgyMDgyOwogIHQudHdvbW9ub3NwYWNlID0gMHhmZjEyOwogIHQudHdvbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNTsKICB0LnR3b29sZHN0eWxlID0gMHhmNzMyOwogIHQudHdvcGFyZW4gPSAweDI0NzU7CiAgdC50d29wZXJpb2QgPSAweDI0ODk7CiAgdC50d29wZXJzaWFuID0gMHgwNmYyOwogIHQudHdvcm9tYW4gPSAweDIxNzE7CiAgdC50d29zdHJva2UgPSAweDAxYmI7CiAgdC50d29zdXBlcmlvciA9IDB4MDBiMjsKICB0LnR3b3RoYWkgPSAweDBlNTI7CiAgdC50d290aGlyZHMgPSAweDIxNTQ7CiAgdC51ID0gMHgwMDc1OwogIHQudWFjdXRlID0gMHgwMGZhOwogIHQudWJhciA9IDB4MDI4OTsKICB0LnViZW5nYWxpID0gMHgwOTg5OwogIHQudWJvcG9tb2ZvID0gMHgzMTI4OwogIHQudWJyZXZlID0gMHgwMTZkOwogIHQudWNhcm9uID0gMHgwMWQ0OwogIHQudWNpcmNsZSA9IDB4MjRlNDsKICB0LnVjaXJjdW1mbGV4ID0gMHgwMGZiOwogIHQudWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NzsKICB0LnVjeXJpbGxpYyA9IDB4MDQ0MzsKICB0LnVkYXR0YWRldmEgPSAweDA5NTE7CiAgdC51ZGJsYWN1dGUgPSAweDAxNzE7CiAgdC51ZGJsZ3JhdmUgPSAweDAyMTU7CiAgdC51ZGV2YSA9IDB4MDkwOTsKICB0LnVkaWVyZXNpcyA9IDB4MDBmYzsKICB0LnVkaWVyZXNpc2FjdXRlID0gMHgwMWQ4OwogIHQudWRpZXJlc2lzYmVsb3cgPSAweDFlNzM7CiAgdC51ZGllcmVzaXNjYXJvbiA9IDB4MDFkYTsKICB0LnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGYxOwogIHQudWRpZXJlc2lzZ3JhdmUgPSAweDAxZGM7CiAgdC51ZGllcmVzaXNtYWNyb24gPSAweDAxZDY7CiAgdC51ZG90YmVsb3cgPSAweDFlZTU7CiAgdC51Z3JhdmUgPSAweDAwZjk7CiAgdC51Z3VqYXJhdGkgPSAweDBhODk7CiAgdC51Z3VybXVraGkgPSAweDBhMDk7CiAgdC51aGlyYWdhbmEgPSAweDMwNDY7CiAgdC51aG9va2Fib3ZlID0gMHgxZWU3OwogIHQudWhvcm4gPSAweDAxYjA7CiAgdC51aG9ybmFjdXRlID0gMHgxZWU5OwogIHQudWhvcm5kb3RiZWxvdyA9IDB4MWVmMTsKICB0LnVob3JuZ3JhdmUgPSAweDFlZWI7CiAgdC51aG9ybmhvb2thYm92ZSA9IDB4MWVlZDsKICB0LnVob3JudGlsZGUgPSAweDFlZWY7CiAgdC51aHVuZ2FydW1sYXV0ID0gMHgwMTcxOwogIHQudWh1bmdhcnVtbGF1dGN5cmlsbGljID0gMHgwNGYzOwogIHQudWludmVydGVkYnJldmUgPSAweDAyMTc7CiAgdC51a2F0YWthbmEgPSAweDMwYTY7CiAgdC51a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzM7CiAgdC51a2N5cmlsbGljID0gMHgwNDc5OwogIHQudWtvcmVhbiA9IDB4MzE1YzsKICB0LnVtYWNyb24gPSAweDAxNmI7CiAgdC51bWFjcm9uY3lyaWxsaWMgPSAweDA0ZWY7CiAgdC51bWFjcm9uZGllcmVzaXMgPSAweDFlN2I7CiAgdC51bWF0cmFndXJtdWtoaSA9IDB4MGE0MTsKICB0LnVtb25vc3BhY2UgPSAweGZmNTU7CiAgdC51bmRlcnNjb3JlID0gMHgwMDVmOw
20ogIHQudW5kZXJzY29yZWRibCA9IDB4MjAxNzsKICB0LnVuZGVyc2NvcmVtb25vc3BhY2UgPSAweGZmM2Y7CiAgdC51bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzM7CiAgdC51bmRlcnNjb3Jld2F2eSA9IDB4ZmU0ZjsKICB0LnVuaW9uID0gMHgyMjJhOwogIHQudW5pdmVyc2FsID0gMHgyMjAwOwogIHQudW9nb25layA9IDB4MDE3MzsKICB0LnVwYXJlbiA9IDB4MjRiMDsKICB0LnVwYmxvY2sgPSAweDI1ODA7CiAgdC51cHBlcmRvdGhlYnJldyA9IDB4MDVjNDsKICB0LnVwc2lsb24gPSAweDAzYzU7CiAgdC51cHNpbG9uZGllcmVzaXMgPSAweDAzY2I7CiAgdC51cHNpbG9uZGllcmVzaXN0b25vcyA9IDB4MDNiMDsKICB0LnVwc2lsb25sYXRpbiA9IDB4MDI4YTsKICB0LnVwc2lsb250b25vcyA9IDB4MDNjZDsKICB0LnVwdGFja2JlbG93Y21iID0gMHgwMzFkOwogIHQudXB0YWNrbW9kID0gMHgwMmQ0OwogIHQudXJhZ3VybXVraGkgPSAweDBhNzM7CiAgdC51cmluZyA9IDB4MDE2ZjsKICB0LnVzaG9ydGN5cmlsbGljID0gMHgwNDVlOwogIHQudXNtYWxsaGlyYWdhbmEgPSAweDMwNDU7CiAgdC51c21hbGxrYXRha2FuYSA9IDB4MzBhNTsKICB0LnVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY5OwogIHQudXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWY7CiAgdC51c3RyYWlnaHRzdHJva2VjeXJpbGxpYyA9IDB4MDRiMTsKICB0LnV0aWxkZSA9IDB4MDE2OTsKICB0LnV0aWxkZWFjdXRlID0gMHgxZTc5OwogIHQudXRpbGRlYmVsb3cgPSAweDFlNzU7CiAgdC51dWJlbmdhbGkgPSAweDA5OGE7CiAgdC51dWRldmEgPSAweDA5MGE7CiAgdC51dWd1amFyYXRpID0gMHgwYThhOwogIHQudXVndXJtdWtoaSA9IDB4MGEwYTsKICB0LnV1bWF0cmFndXJtdWtoaSA9IDB4MGE0MjsKICB0LnV1dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMjsKICB0LnV1dm93ZWxzaWduZGV2YSA9IDB4MDk0MjsKICB0LnV1dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzI7CiAgdC51dm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMTsKICB0LnV2b3dlbHNpZ25kZXZhID0gMHgwOTQxOwogIHQudXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMxOwogIHQudiA9IDB4MDA3NjsKICB0LnZhZGV2YSA9IDB4MDkzNTsKICB0LnZhZ3VqYXJhdGkgPSAweDBhYjU7CiAgdC52YWd1cm11a2hpID0gMHgwYTM1OwogIHQudmFrYXRha2FuYSA9IDB4MzBmNzsKICB0LnZhdiA9IDB4MDVkNTsKICB0LnZhdmRhZ2VzaCA9IDB4ZmIzNTsKICB0LnZhdmRhZ2VzaDY1ID0gMHhmYjM1OwogIHQudmF2ZGFnZXNoaGVicmV3ID0gMHhmYjM1OwogIHQudmF2aGVicmV3ID0gMHgwNWQ1OwogIHQudmF2aG9sYW0gPSAweGZiNGI7CiAgdC52YXZob2xhbWhlYnJldyA9IDB4ZmI0YjsKICB0LnZhdnZhdmhlYnJldyA9IDB4MDVmMDsKICB0LnZhdnlvZGhlYnJldyA9IDB4MDVmMTsKICB0LnZjaXJjbGUgPSAweDI0ZTU7CiAgdC52ZG90YmVsb3cgPSAweDFlN2Y7CiAgdC52ZWN5cmlsbGljID0gMHgwNDMyOwogIHQudmVoYXJhYmljID0gMHgwNmE0OwogIHQudmVoZmluYWxhcmFiaWMgPSAweGZiNmI7CiAgdC52ZWhpbml0aWFsYXJhYmljID0gMHhmYjZjOwogIHQudmVobWVkaWFsYXJhYmljID0gMHhmYjZkOwogIHQudmVrYXRha2FuYSA9IDB4MzBmOTsKICB0LnZlbnVzID0gMHgyNjQwOwogIHQudmVydGljYWxiYXIgPSAweDAwN2M7CiAgdC52ZXJ0aWNhbGxpbmVhYm92ZWNtYiA9IDB4MDMwZDsKICB0LnZlcnRpY2FsbGluZWJlbG93Y21iID0gMHgwMzI5OwogIHQudmVydGljYWxsaW5lbG93bW9kID0gMHgwMmNjOwogIHQudmVydGljYWxsaW5lbW9kID0gMHgwMmM4OwogIHQudmV3YXJtZW5pYW4gPSAweDA1N2U7CiAgdC52aG9vayA9IDB4MDI4YjsKICB0LnZpa2F0YWthbmEgPSAweDMwZjg7CiAgdC52aXJhbWFiZW5nYWxpID0gMHgwOWNkOwogIHQudmlyYW1hZGV2YSA9IDB4MDk0ZDsKICB0LnZpcmFtYWd1amFyYXRpID0gMHgwYWNkOwogIHQudmlzYXJnYWJlbmdhbGkgPSAweDA5ODM7CiAgdC52aXNhcmdhZGV2YSA9IDB4MDkwMzsKICB0LnZpc2FyZ2FndWphcmF0aSA9IDB4MGE4MzsKICB0LnZtb25vc3BhY2UgPSAweGZmNTY7CiAgdC52b2FybWVuaWFuID0gMHgwNTc4OwogIHQudm9pY2VkaXRlcmF0aW9uaGlyYWdhbmEgPSAweDMwOWU7CiAgdC52b2ljZWRpdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZTsKICB0LnZvaWNlZG1hcmtrYW5hID0gMHgzMDliOwogIHQudm9pY2VkbWFya2thbmFoYWxmd2lkdGggPSAweGZmOWU7CiAgdC52b2thdGFrYW5hID0gMHgzMGZhOwogIHQudnBhcmVuID0gMHgyNGIxOwogIHQudnRpbGRlID0gMHgxZTdkOwogIHQudnR1cm5lZCA9IDB4MDI4YzsKICB0LnZ1aGlyYWdhbmEgPSAweDMwOTQ7CiAgdC52dWthdGFrYW5hID0gMHgzMGY0OwogIHQudyA9IDB4MDA3NzsKICB0LndhY3V0ZSA9IDB4MWU4MzsKICB0LndhZWtvcmVhbiA9IDB4MzE1OTsKICB0LndhaGlyYWdhbmEgPSAweDMwOGY7CiAgdC53YWthdGFrYW5hID0gMHgzMGVmOwogIHQud2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5YzsKICB0Lndha29yZWFuID0gMHgzMTU4OwogIHQud2FzbWFsbGhpcmFnYW5hID0gMHgzMDhlOwogIHQud2FzbWFsbGthdGFrYW5hID0gMHgzMGVlOwogIHQud2F0dG9zcXVhcmUgPSAweDMzNTc7CiAgdC53YXZlZGFzaCA9IDB4MzAxYzsKICB0Lndhdnl1bmRlcnNjb3JldmVydGljYWwgPSAweGZlMzQ7CiAgdC53YXdhcmFiaWMgPSAweDA2NDg7CiAgdC53YXdmaW5hbGFyYWJpYyA9IDB4ZmVlZTsKICB0Lndhd2hhbXphYWJvdmVhcmFiaWMgPSAweDA2MjQ7CiAgdC53YXdoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODY7CiAgdC53YnNxdWFyZSA9IDB4MzNkZDsKICB0LndjaXJjbGUgPSAweDI0ZTY7CiAgdC53Y2lyY3VtZmxleCA9IDB4MDE3NTsKICB0LndkaWVyZXNpcyA9IDB4MWU4NTsKICB0Lndkb3RhY2NlbnQgPSAweDFlODc7CiAgdC53ZG90YmVsb3cgPSAweDFlODk7CiAgdC53ZWhpcmFnYW5hID0gMHgzMDkxOwogIHQud2VpZXJzdHJhc3MgPSAweDIxMTg7CiAgdC53ZWthdGFrYW5hID0gMHgzMGYxOwogIHQud2Vrb3JlYW4gPSAweDMxNWU7CiAgdC53ZW9rb3JlYW4gPSAweDMxNWQ7CiAgdC53Z3JhdmUgPSAweDFlODE7CiAgdC53aGl0ZWJ1bGxldCA9IDB4MjVlNjsKICB0LndoaXRlY2lyY2xlID0gMHgyNWNiOwogIHQud2hpdGVjaXJjbGVpbnZlcnNlID0gMHgyNWQ5OwogIHQud2hpdGVjb3JuZXJicmFja2V0bGVmdCA9IDB4MzAwZTsKICB0LndoaXRlY29ybmVyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmU0MzsKICB0LndoaXRlY29ybmVyYnJhY2tldHJpZ2h0ID0gMHgzMDBmOwogIHQud2hpdGVjb3JuZXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmU0NDsKICB0LndoaXRlZGlhbW9uZCA9IDB4MjVjNzsKICB0LndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZCA9IDB4MjVjODsKICB0LndoaXRlZG93bnBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViZjsKICB0LndoaXRlZG93bnBvaW50aW5ndHJpYW5nbGUgPSAweDI1YmQ7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YzM7CiAgdC53aGl0ZWxlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMxOwogIHQud2hpdGVsZW50aWN1bGFyYnJhY2tldGxlZnQgPSAweDMwMTY7CiAgdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTc7CiAgdC53aGl0ZXJpZ2h0cG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWI5OwogIHQud2hpdGVyaWdodHBvaW50aW5ndHJpYW5nbGUgPSAweDI1Yjc
207CiAgdC53aGl0ZXNtYWxsc3F1YXJlID0gMHgyNWFiOwogIHQud2hpdGVzbWlsaW5nZmFjZSA9IDB4MjYzYTsKICB0LndoaXRlc3F1YXJlID0gMHgyNWExOwogIHQud2hpdGVzdGFyID0gMHgyNjA2OwogIHQud2hpdGV0ZWxlcGhvbmUgPSAweDI2MGY7CiAgdC53aGl0ZXRvcnRvaXNlc2hlbGxicmFja2V0bGVmdCA9IDB4MzAxODsKICB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxOTsKICB0LndoaXRldXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjU7CiAgdC53aGl0ZXVwcG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViMzsKICB0LndpaGlyYWdhbmEgPSAweDMwOTA7CiAgdC53aWthdGFrYW5hID0gMHgzMGYwOwogIHQud2lrb3JlYW4gPSAweDMxNWY7CiAgdC53bW9ub3NwYWNlID0gMHhmZjU3OwogIHQud29oaXJhZ2FuYSA9IDB4MzA5MjsKICB0Lndva2F0YWthbmEgPSAweDMwZjI7CiAgdC53b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjY2OwogIHQud29uID0gMHgyMGE5OwogIHQud29ubW9ub3NwYWNlID0gMHhmZmU2OwogIHQud293YWVudGhhaSA9IDB4MGUyNzsKICB0LndwYXJlbiA9IDB4MjRiMjsKICB0LndyaW5nID0gMHgxZTk4OwogIHQud3N1cGVyaW9yID0gMHgwMmI3OwogIHQud3R1cm5lZCA9IDB4MDI4ZDsKICB0Lnd5bm4gPSAweDAxYmY7CiAgdC54ID0gMHgwMDc4OwogIHQueGFib3ZlY21iID0gMHgwMzNkOwogIHQueGJvcG9tb2ZvID0gMHgzMTEyOwogIHQueGNpcmNsZSA9IDB4MjRlNzsKICB0LnhkaWVyZXNpcyA9IDB4MWU4ZDsKICB0Lnhkb3RhY2NlbnQgPSAweDFlOGI7CiAgdC54ZWhhcm1lbmlhbiA9IDB4MDU2ZDsKICB0LnhpID0gMHgwM2JlOwogIHQueG1vbm9zcGFjZSA9IDB4ZmY1ODsKICB0LnhwYXJlbiA9IDB4MjRiMzsKICB0LnhzdXBlcmlvciA9IDB4MDJlMzsKICB0LnkgPSAweDAwNzk7CiAgdC55YWFkb3NxdWFyZSA9IDB4MzM0ZTsKICB0LnlhYmVuZ2FsaSA9IDB4MDlhZjsKICB0LnlhY3V0ZSA9IDB4MDBmZDsKICB0LnlhZGV2YSA9IDB4MDkyZjsKICB0LnlhZWtvcmVhbiA9IDB4MzE1MjsKICB0LnlhZ3VqYXJhdGkgPSAweDBhYWY7CiAgdC55YWd1cm11a2hpID0gMHgwYTJmOwogIHQueWFoaXJhZ2FuYSA9IDB4MzA4NDsKICB0Lnlha2F0YWthbmEgPSAweDMwZTQ7CiAgdC55YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk0OwogIHQueWFrb3JlYW4gPSAweDMxNTE7CiAgdC55YW1ha2thbnRoYWkgPSAweDBlNGU7CiAgdC55YXNtYWxsaGlyYWdhbmEgPSAweDMwODM7CiAgdC55YXNtYWxsa2F0YWthbmEgPSAweDMwZTM7CiAgdC55YXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmM7CiAgdC55YXRjeXJpbGxpYyA9IDB4MDQ2MzsKICB0LnljaXJjbGUgPSAweDI0ZTg7CiAgdC55Y2lyY3VtZmxleCA9IDB4MDE3NzsKICB0LnlkaWVyZXNpcyA9IDB4MDBmZjsKICB0Lnlkb3RhY2NlbnQgPSAweDFlOGY7CiAgdC55ZG90YmVsb3cgPSAweDFlZjU7CiAgdC55ZWhhcmFiaWMgPSAweDA2NGE7CiAgdC55ZWhiYXJyZWVhcmFiaWMgPSAweDA2ZDI7CiAgdC55ZWhiYXJyZWVmaW5hbGFyYWJpYyA9IDB4ZmJhZjsKICB0LnllaGZpbmFsYXJhYmljID0gMHhmZWYyOwogIHQueWVoaGFtemFhYm92ZWFyYWJpYyA9IDB4MDYyNjsKICB0LnllaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmU4YTsKICB0LnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljID0gMHhmZThiOwogIHQueWVoaGFtemFhYm92ZW1lZGlhbGFyYWJpYyA9IDB4ZmU4YzsKICB0LnllaGluaXRpYWxhcmFiaWMgPSAweGZlZjM7CiAgdC55ZWhtZWRpYWxhcmFiaWMgPSAweGZlZjQ7CiAgdC55ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkZDsKICB0LnllaG1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM1ODsKICB0LnllaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM5NDsKICB0LnllaHRocmVlZG90c2JlbG93YXJhYmljID0gMHgwNmQxOwogIHQueWVrb3JlYW4gPSAweDMxNTY7CiAgdC55ZW4gPSAweDAwYTU7CiAgdC55ZW5tb25vc3BhY2UgPSAweGZmZTU7CiAgdC55ZW9rb3JlYW4gPSAweDMxNTU7CiAgdC55ZW9yaW5oaWV1aGtvcmVhbiA9IDB4MzE4NjsKICB0LnllcmFoYmVueW9tb2hlYnJldyA9IDB4MDVhYTsKICB0LnllcmFoYmVueW9tb2xlZnRoZWJyZXcgPSAweDA1YWE7CiAgdC55ZXJpY3lyaWxsaWMgPSAweDA0NGI7CiAgdC55ZXJ1ZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmOTsKICB0Lnllc2lldW5na29yZWFuID0gMHgzMTgxOwogIHQueWVzaWV1bmdwYW5zaW9za29yZWFuID0gMHgzMTgzOwogIHQueWVzaWV1bmdzaW9za29yZWFuID0gMHgzMTgyOwogIHQueWV0aXZoZWJyZXcgPSAweDA1OWE7CiAgdC55Z3JhdmUgPSAweDFlZjM7CiAgdC55aG9vayA9IDB4MDFiNDsKICB0Lnlob29rYWJvdmUgPSAweDFlZjc7CiAgdC55aWFybWVuaWFuID0gMHgwNTc1OwogIHQueWljeXJpbGxpYyA9IDB4MDQ1NzsKICB0Lnlpa29yZWFuID0gMHgzMTYyOwogIHQueWlueWFuZyA9IDB4MjYyZjsKICB0Lnlpd25hcm1lbmlhbiA9IDB4MDU4MjsKICB0Lnltb25vc3BhY2UgPSAweGZmNTk7CiAgdC55b2QgPSAweDA1ZDk7CiAgdC55b2RkYWdlc2ggPSAweGZiMzk7CiAgdC55b2RkYWdlc2hoZWJyZXcgPSAweGZiMzk7CiAgdC55b2RoZWJyZXcgPSAweDA1ZDk7CiAgdC55b2R5b2RoZWJyZXcgPSAweDA1ZjI7CiAgdC55b2R5b2RwYXRhaGhlYnJldyA9IDB4ZmIxZjsKICB0LnlvaGlyYWdhbmEgPSAweDMwODg7CiAgdC55b2lrb3JlYW4gPSAweDMxODk7CiAgdC55b2thdGFrYW5hID0gMHgzMGU4OwogIHQueW9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NjsKICB0Lnlva29yZWFuID0gMHgzMTViOwogIHQueW9zbWFsbGhpcmFnYW5hID0gMHgzMDg3OwogIHQueW9zbWFsbGthdGFrYW5hID0gMHgzMGU3OwogIHQueW9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZlOwogIHQueW90Z3JlZWsgPSAweDAzZjM7CiAgdC55b3lhZWtvcmVhbiA9IDB4MzE4ODsKICB0LnlveWFrb3JlYW4gPSAweDMxODc7CiAgdC55b3lha3RoYWkgPSAweDBlMjI7CiAgdC55b3lpbmd0aGFpID0gMHgwZTBkOwogIHQueXBhcmVuID0gMHgyNGI0OwogIHQueXBvZ2VncmFtbWVuaSA9IDB4MDM3YTsKICB0Lnlwb2dlZ3JhbW1lbmlncmVla2NtYiA9IDB4MDM0NTsKICB0LnlyID0gMHgwMWE2OwogIHQueXJpbmcgPSAweDFlOTk7CiAgdC55c3VwZXJpb3IgPSAweDAyYjg7CiAgdC55dGlsZGUgPSAweDFlZjk7CiAgdC55dHVybmVkID0gMHgwMjhlOwogIHQueXVoaXJhZ2FuYSA9IDB4MzA4NjsKICB0Lnl1aWtvcmVhbiA9IDB4MzE4YzsKICB0Lnl1a2F0YWthbmEgPSAweDMwZTY7CiAgdC55dWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk1OwogIHQueXVrb3JlYW4gPSAweDMxNjA7CiAgdC55dXNiaWdjeXJpbGxpYyA9IDB4MDQ2YjsKICB0Lnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWMgPSAweDA0NmQ7CiAgdC55dXNsaXR0bGVjeXJpbGxpYyA9IDB4MDQ2NzsKICB0Lnl1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njk7CiAgdC55dXNtYWxsaGlyYWdhbmEgPSAweDMwODU7CiAgdC55dXNtYWxsa2F0YWthbmEgPSAweDMwZTU7CiAgdC55dXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmQ7CiAgdC55dXlla29yZWFuID0gMHgzMThiOwogIHQueXV5ZW9rb3JlYW4gPSAweDMxOGE7CiAgdC55eWFiZW5nYWxpID0gMHgwOWRmOwogIHQueXlhZGV2YSA9IDB4MDk1ZjsKICB0LnogPSAweDAwN2E7CiAgdC56YWFybWVuaWFuID0gMHgwNTY2OwogIHQuemFjdXRlID0gMHgwMTdhOwogIHQuemFkZXZhID0gMHgwOTViOwogIHQuemFndXJtdWtoaSA9IDB4MGE1YjsKICB0LnphaGFyYWJpYyA9IDB4MDYzODsKICB0LnphaGZpbmFsYXJhYmljID0gMHhmZWM2OwogIHQuemFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjNzsKICB0LnphaGlyYWdhbmEgPSAweDMwNTY7CiAgdC56YWhtZWRpYWxhcmFiaWMgPSAweGZlYzg7CiAgdC56YWluYXJhYmljID0gMHgwNjMyOwogIHQuemFpbmZpbmFsYXJhYmljID0gMHhmZWIwOwogIHQuemFrYXRha2FuYSA9IDB4MzBiNjsKICB0LnphcWVmZ2Fkb2xoZWJyZXcgPSAweDA1OTU7CiAgdC56YXFlZnFhdGFuaGVicmV3ID0gMHgwNTk0OwogIHQuemFycWFoZWJyZXcgPSAweDA1OTg7CiAgdC56YXlpbiA9IDB4MDVkNjsKICB0LnpheWluZGFnZXNoID0gMHhmYjM2OwogIHQuemF5aW5kYWdlc2hoZWJyZXcgPSAweGZiMzY7CiAgdC56YXlpbmhlYnJldyA9IDB4MDVkNjsKICB0Lnpib3BvbW9mbyA9IDB4MzExNzsKICB0LnpjYXJvbiA9IDB4MDE3ZTsKICB0LnpjaXJjbGUgP
20SAweDI0ZTk7CiAgdC56Y2lyY3VtZmxleCA9IDB4MWU5MTsKICB0LnpjdXJsID0gMHgwMjkxOwogIHQuemRvdCA9IDB4MDE3YzsKICB0Lnpkb3RhY2NlbnQgPSAweDAxN2M7CiAgdC56ZG90YmVsb3cgPSAweDFlOTM7CiAgdC56ZWN5cmlsbGljID0gMHgwNDM3OwogIHQuemVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5OTsKICB0LnplZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZjsKICB0LnplaGlyYWdhbmEgPSAweDMwNWM7CiAgdC56ZWthdGFrYW5hID0gMHgzMGJjOwogIHQuemVybyA9IDB4MDAzMDsKICB0Lnplcm9hcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvYmVuZ2FsaSA9IDB4MDllNjsKICB0Lnplcm9kZXZhID0gMHgwOTY2OwogIHQuemVyb2d1amFyYXRpID0gMHgwYWU2OwogIHQuemVyb2d1cm11a2hpID0gMHgwYTY2OwogIHQuemVyb2hhY2thcmFiaWMgPSAweDA2NjA7CiAgdC56ZXJvaW5mZXJpb3IgPSAweDIwODA7CiAgdC56ZXJvbW9ub3NwYWNlID0gMHhmZjEwOwogIHQuemVyb29sZHN0eWxlID0gMHhmNzMwOwogIHQuemVyb3BlcnNpYW4gPSAweDA2ZjA7CiAgdC56ZXJvc3VwZXJpb3IgPSAweDIwNzA7CiAgdC56ZXJvdGhhaSA9IDB4MGU1MDsKICB0Lnplcm93aWR0aGpvaW5lciA9IDB4ZmVmZjsKICB0Lnplcm93aWR0aG5vbmpvaW5lciA9IDB4MjAwYzsKICB0Lnplcm93aWR0aHNwYWNlID0gMHgyMDBiOwogIHQuemV0YSA9IDB4MDNiNjsKICB0LnpoYm9wb21vZm8gPSAweDMxMTM7CiAgdC56aGVhcm1lbmlhbiA9IDB4MDU2YTsKICB0LnpoZWJyZXZlY3lyaWxsaWMgPSAweDA0YzI7CiAgdC56aGVjeXJpbGxpYyA9IDB4MDQzNjsKICB0LnpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk3OwogIHQuemhlZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkZDsKICB0LnppaGlyYWdhbmEgPSAweDMwNTg7CiAgdC56aWthdGFrYW5hID0gMHgzMGI4OwogIHQuemlub3JoZWJyZXcgPSAweDA1YWU7CiAgdC56bGluZWJlbG93ID0gMHgxZTk1OwogIHQuem1vbm9zcGFjZSA9IDB4ZmY1YTsKICB0LnpvaGlyYWdhbmEgPSAweDMwNWU7CiAgdC56b2thdGFrYW5hID0gMHgzMGJlOwogIHQuenBhcmVuID0gMHgyNGI1OwogIHQuenJldHJvZmxleGhvb2sgPSAweDAyOTA7CiAgdC56c3Ryb2tlID0gMHgwMWI2OwogIHQuenVoaXJhZ2FuYSA9IDB4MzA1YTsKICB0Lnp1a2F0YWthbmEgPSAweDMwYmE7CiAgdFsiLm5vdGRlZiJdID0gMHgwMDAwOwogIHQuYW5nYnJhY2tldGxlZnRiaWcgPSAweDIzMjk7CiAgdC5hbmdicmFja2V0bGVmdEJpZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0YmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRsZWZ0QmlnZyA9IDB4MjMyOTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodGJpZyA9IDB4MjMyYTsKICB0LmFuZ2JyYWNrZXRyaWdodEJpZ2cgPSAweDIzMmE7CiAgdC5hbmdicmFja2V0cmlnaHRiaWdnID0gMHgyMzJhOwogIHQuYXJyb3dob29rbGVmdCA9IDB4MjFhYTsKICB0LmFycm93aG9va3JpZ2h0ID0gMHgyMWE5OwogIHQuYXJyb3dsZWZ0dG9waGFsZiA9IDB4MjFiYzsKICB0LmFycm93bGVmdGJvdGhhbGYgPSAweDIxYmQ7CiAgdC5hcnJvd25vcnRoZWFzdCA9IDB4MjE5NzsKICB0LmFycm93bm9ydGh3ZXN0ID0gMHgyMTk2OwogIHQuYXJyb3dyaWdodHRvcGhhbGYgPSAweDIxYzA7CiAgdC5hcnJvd3JpZ2h0Ym90aGFsZiA9IDB4MjFjMTsKICB0LmFycm93c291dGhlYXN0ID0gMHgyMTk4OwogIHQuYXJyb3dzb3V0aHdlc3QgPSAweDIxOTk7CiAgdC5iYWNrc2xhc2hiaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWcgPSAweDIyMTY7CiAgdC5iYWNrc2xhc2hCaWdnID0gMHgyMjE2OwogIHQuYmFja3NsYXNoYmlnZyA9IDB4MjIxNjsKICB0LmJhcmRibCA9IDB4MjAxNjsKICB0LmJyYWNlaHRpcGRvd25sZWZ0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwZG93bnJpZ2h0ID0gMHhmZTM3OwogIHQuYnJhY2VodGlwdXBsZWZ0ID0gMHhmZTM4OwogIHQuYnJhY2VodGlwdXByaWdodCA9IDB4ZmUzODsKICB0LmJyYWNlbGVmdEJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZyA9IDB4MDA3YjsKICB0LmJyYWNlbGVmdGJpZ2cgPSAweDAwN2I7CiAgdC5icmFjZWxlZnRCaWdnID0gMHgwMDdiOwogIHQuYnJhY2VyaWdodEJpZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRiaWcgPSAweDAwN2Q7CiAgdC5icmFjZXJpZ2h0YmlnZyA9IDB4MDA3ZDsKICB0LmJyYWNlcmlnaHRCaWdnID0gMHgwMDdkOwogIHQuYnJhY2tldGxlZnRiaWcgPSAweDAwNWI7CiAgdC5icmFja2V0bGVmdEJpZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0YmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRsZWZ0QmlnZyA9IDB4MDA1YjsKICB0LmJyYWNrZXRyaWdodEJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZyA9IDB4MDA1ZDsKICB0LmJyYWNrZXRyaWdodGJpZ2cgPSAweDAwNWQ7CiAgdC5icmFja2V0cmlnaHRCaWdnID0gMHgwMDVkOwogIHQuY2VpbGluZ2xlZnRiaWcgPSAweDIzMDg7CiAgdC5jZWlsaW5nbGVmdEJpZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0QmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdsZWZ0YmlnZyA9IDB4MjMwODsKICB0LmNlaWxpbmdyaWdodGJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodEJpZyA9IDB4MjMwOTsKICB0LmNlaWxpbmdyaWdodGJpZ2cgPSAweDIzMDk7CiAgdC5jZWlsaW5ncmlnaHRCaWdnID0gMHgyMzA5OwogIHQuY2lyY2xlZG90ZGlzcGxheSA9IDB4MjI5OTsKICB0LmNpcmNsZWRvdHRleHQgPSAweDIyOTk7CiAgdC5jaXJjbGVtdWx0aXBseWRpc3BsYXkgPSAweDIyOTc7CiAgdC5jaXJjbGVtdWx0aXBseXRleHQgPSAweDIyOTc7CiAgdC5jaXJjbGVwbHVzZGlzcGxheSA9IDB4MjI5NTsKICB0LmNpcmNsZXBsdXN0ZXh0ID0gMHgyMjk1OwogIHQuY29udGludGVncmFsZGlzcGxheSA9IDB4MjIyZTsKICB0LmNvbnRpbnRlZ3JhbHRleHQgPSAweDIyMmU7CiAgdC5jb3Byb2R1Y3RkaXNwbGF5ID0gMHgyMjEwOwogIHQuY29wcm9kdWN0dGV4dCA9IDB4MjIxMDsKICB0LmZsb29ybGVmdEJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZyA9IDB4MjMwYTsKICB0LmZsb29ybGVmdGJpZ2cgPSAweDIzMGE7CiAgdC5mbG9vcmxlZnRCaWdnID0gMHgyMzBhOwogIHQuZmxvb3JyaWdodGJpZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRCaWcgPSAweDIzMGI7CiAgdC5mbG9vcnJpZ2h0QmlnZyA9IDB4MjMwYjsKICB0LmZsb29ycmlnaHRiaWdnID0gMHgyMzBiOwogIHQuaGF0d2lkZSA9IDB4MDMwMjsKICB0LmhhdHdpZGVyID0gMHgwMzAyOwogIHQuaGF0d2lkZXN0ID0gMHgwMzAyOwogIHQuaW50ZXJjYWwgPSAweDFkNDA7CiAgdC5pbnRlZ3JhbGRpc3BsYXkgPSAweDIyMmI7CiAgdC5pbnRlZ3JhbHRleHQgPSAweDIyMmI7CiAgdC5pbnRlcnNlY3Rpb25kaXNwbGF5ID0gMHgyMmMyOwogIHQuaW50ZXJzZWN0aW9udGV4dCA9IDB4MjJjMjsKICB0LmxvZ2ljYWxhbmRkaXNwbGF5ID0gMHgyMjI3OwogIHQubG9naWNhbGFuZHRleHQgPSAweDIyMjc7CiAgdC5sb2dpY2Fsb3JkaXNwbGF5ID0gMHgyMjI4OwogIHQubG9naWNhbG9ydGV4dCA9IDB4MjIyODsKICB0LnBhcmVubGVmdEJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdGJpZyA9IDB4MDAyODsKICB0LnBhcmVubGVmdEJpZ2cgPSAweDAwMjg7CiAgdC5wYXJlbmxlZnRiaWdnID0gMHgwMDI4OwogIHQucGFyZW5yaWdodEJpZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWcgPSAweDAwMjk7CiAgdC5wYXJlbnJpZ2h0QmlnZyA9IDB4MDAyOTsKICB0LnBhcmVucmlnaHRiaWdnID0gMHgwMDI5OwogIHQucHJpbWUgP
20SAweDIwMzI7CiAgdC5wcm9kdWN0ZGlzcGxheSA9IDB4MjIwZjsKICB0LnByb2R1Y3R0ZXh0ID0gMHgyMjBmOwogIHQucmFkaWNhbGJpZyA9IDB4MjIxYTsKICB0LnJhZGljYWxCaWcgPSAweDIyMWE7CiAgdC5yYWRpY2FsQmlnZyA9IDB4MjIxYTsKICB0LnJhZGljYWxiaWdnID0gMHgyMjFhOwogIHQucmFkaWNhbGJ0ID0gMHgyMjFhOwogIHQucmFkaWNhbHRwID0gMHgyMjFhOwogIHQucmFkaWNhbHZlcnRleCA9IDB4MjIxYTsKICB0LnNsYXNoYmlnID0gMHgwMDJmOwogIHQuc2xhc2hCaWcgPSAweDAwMmY7CiAgdC5zbGFzaEJpZ2cgPSAweDAwMmY7CiAgdC5zbGFzaGJpZ2cgPSAweDAwMmY7CiAgdC5zdW1tYXRpb25kaXNwbGF5ID0gMHgyMjExOwogIHQuc3VtbWF0aW9udGV4dCA9IDB4MjIxMTsKICB0LnRpbGRld2lkZSA9IDB4MDJkYzsKICB0LnRpbGRld2lkZXIgPSAweDAyZGM7CiAgdC50aWxkZXdpZGVzdCA9IDB4MDJkYzsKICB0LnVuaW9uZGlzcGxheSA9IDB4MjJjMzsKICB0LnVuaW9ubXVsdGlkaXNwbGF5ID0gMHgyMjhlOwogIHQudW5pb25tdWx0aXRleHQgPSAweDIyOGU7CiAgdC51bmlvbnNxZGlzcGxheSA9IDB4MjI5NDsKICB0LnVuaW9uc3F0ZXh0ID0gMHgyMjk0OwogIHQudW5pb250ZXh0ID0gMHgyMmMzOwogIHQudmV4dGVuZGRvdWJsZSA9IDB4MjIyNTsKICB0LnZleHRlbmRzaW5nbGUgPSAweDIyMjM7Cn0pOwpjb25zdCBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LnNwYWNlID0gMHgwMDIwOwogIHQuYTEgPSAweDI3MDE7CiAgdC5hMiA9IDB4MjcwMjsKICB0LmEyMDIgPSAweDI3MDM7CiAgdC5hMyA9IDB4MjcwNDsKICB0LmE0ID0gMHgyNjBlOwogIHQuYTUgPSAweDI3MDY7CiAgdC5hMTE5ID0gMHgyNzA3OwogIHQuYTExOCA9IDB4MjcwODsKICB0LmExMTcgPSAweDI3MDk7CiAgdC5hMTEgPSAweDI2MWI7CiAgdC5hMTIgPSAweDI2MWU7CiAgdC5hMTMgPSAweDI3MGM7CiAgdC5hMTQgPSAweDI3MGQ7CiAgdC5hMTUgPSAweDI3MGU7CiAgdC5hMTYgPSAweDI3MGY7CiAgdC5hMTA1ID0gMHgyNzEwOwogIHQuYTE3ID0gMHgyNzExOwogIHQuYTE4ID0gMHgyNzEyOwogIHQuYTE5ID0gMHgyNzEzOwogIHQuYTIwID0gMHgyNzE0OwogIHQuYTIxID0gMHgyNzE1OwogIHQuYTIyID0gMHgyNzE2OwogIHQuYTIzID0gMHgyNzE3OwogIHQuYTI0ID0gMHgyNzE4OwogIHQuYTI1ID0gMHgyNzE5OwogIHQuYTI2ID0gMHgyNzFhOwogIHQuYTI3ID0gMHgyNzFiOwogIHQuYTI4ID0gMHgyNzFjOwogIHQuYTYgPSAweDI3MWQ7CiAgdC5hNyA9IDB4MjcxZTsKICB0LmE4ID0gMHgyNzFmOwogIHQuYTkgPSAweDI3MjA7CiAgdC5hMTAgPSAweDI3MjE7CiAgdC5hMjkgPSAweDI3MjI7CiAgdC5hMzAgPSAweDI3MjM7CiAgdC5hMzEgPSAweDI3MjQ7CiAgdC5hMzIgPSAweDI3MjU7CiAgdC5hMzMgPSAweDI3MjY7CiAgdC5hMzQgPSAweDI3Mjc7CiAgdC5hMzUgPSAweDI2MDU7CiAgdC5hMzYgPSAweDI3Mjk7CiAgdC5hMzcgPSAweDI3MmE7CiAgdC5hMzggPSAweDI3MmI7CiAgdC5hMzkgPSAweDI3MmM7CiAgdC5hNDAgPSAweDI3MmQ7CiAgdC5hNDEgPSAweDI3MmU7CiAgdC5hNDIgPSAweDI3MmY7CiAgdC5hNDMgPSAweDI3MzA7CiAgdC5hNDQgPSAweDI3MzE7CiAgdC5hNDUgPSAweDI3MzI7CiAgdC5hNDYgPSAweDI3MzM7CiAgdC5hNDcgPSAweDI3MzQ7CiAgdC5hNDggPSAweDI3MzU7CiAgdC5hNDkgPSAweDI3MzY7CiAgdC5hNTAgPSAweDI3Mzc7CiAgdC5hNTEgP
20SAweDI3Mzg7CiAgdC5hNTIgPSAweDI3Mzk7CiAgdC5hNTMgPSAweDI3M2E7CiAgdC5hNTQgPSAweDI3M2I7CiAgdC5hNTUgPSAweDI3M2M7CiAgdC5hNTYgPSAweDI3M2Q7CiAgdC5hNTcgPSAweDI3M2U7CiAgdC5hNTggPSAweDI3M2Y7CiAgdC5hNTkgPSAweDI3NDA7CiAgdC5hNjAgPSAweDI3NDE7CiAgdC5hNjEgPSAweDI3NDI7CiAgdC5hNjIgPSAweDI3NDM7CiAgdC5hNjMgPSAweDI3NDQ7CiAgdC5hNjQgPSAweDI3NDU7CiAgdC5hNjUgPSAweDI3NDY7CiAgdC5hNjYgPSAweDI3NDc7CiAgdC5hNjcgPSAweDI3NDg7CiAgdC5hNjggPSAweDI3NDk7CiAgdC5hNjkgPSAweDI3NGE7CiAgdC5hNzAgPSAweDI3NGI7CiAgdC5hNzEgPSAweDI1Y2Y7CiAgdC5hNzIgPSAweDI3NGQ7CiAgdC5hNzMgPSAweDI1YTA7CiAgdC5hNzQgPSAweDI3NGY7CiAgdC5hMjAzID0gMHgyNzUwOwogIHQuYTc1ID0gMHgyNzUxOwogIHQuYTIwNCA9IDB4Mjc1MjsKICB0LmE3NiA9IDB4MjViMjsKICB0LmE3NyA9IDB4MjViYzsKICB0LmE3OCA9IDB4MjVjNjsKICB0LmE3OSA9IDB4Mjc1NjsKICB0LmE4MSA9IDB4MjVkNzsKICB0LmE4MiA9IDB4Mjc1ODsKICB0LmE4MyA9IDB4Mjc1OTsKICB0LmE4NCA9IDB4Mjc1YTsKICB0LmE5NyA9IDB4Mjc1YjsKICB0LmE5OCA9IDB4Mjc1YzsKICB0LmE5OSA9IDB4Mjc1ZDsKICB0LmExMDAgPSAweDI3NWU7CiAgdC5hMTAxID0gMHgyNzYxOwogIHQuYTEwMiA9IDB4Mjc2MjsKICB0LmExMDMgPSAweDI3NjM7CiAgdC5hMTA0ID0gMHgyNzY0OwogIHQuYTEwNiA9IDB4Mjc2NTsKICB0LmExMDcgPSAweDI3NjY7CiAgdC5hMTA4ID0gMHgyNzY3OwogIHQuYTExMiA9IDB4MjY2MzsKICB0LmExMTEgPSAweDI2NjY7CiAgdC5hMTEwID0gMHgyNjY1OwogIHQuYTEwOSA9IDB4MjY2MDsKICB0LmExMjAgPSAweDI0NjA7CiAgdC5hMTIxID0gMHgyNDYxOwogIHQuYTEyMiA9IDB4MjQ2MjsKICB0LmExMjMgPSAweDI0NjM7CiAgdC5hMTI0ID0gMHgyNDY0OwogIHQuYTEyNSA9IDB4MjQ2NTsKICB0LmExMjYgPSAweDI0NjY7CiAgdC5hMTI3ID0gMHgyNDY3OwogIHQuYTEyOCA9IDB4MjQ2ODsKICB0LmExMjkgPSAweDI0Njk7CiAgdC5hMTMwID0gMHgyNzc2OwogIHQuYTEzMSA9IDB4Mjc3NzsKICB0LmExMzIgPSAweDI3Nzg7CiAgdC5hMTMzID0gMHgyNzc5OwogIHQuYTEzNCA9IDB4Mjc3YTsKICB0LmExMzUgPSAweDI3N2I7CiAgdC5hMTM2ID0gMHgyNzdjOwogIHQuYTEzNyA9IDB4Mjc3ZDsKICB0LmExMzggPSAweDI3N2U7CiAgdC5hMTM5ID0gMHgyNzdmOwogIHQuYTE0MCA9IDB4Mjc4MDsKICB0LmExNDEgPSAweDI3ODE7CiAgdC5hMTQyID0gMHgyNzgyOwogIHQuYTE0MyA9IDB4Mjc4MzsKICB0LmExNDQgPSAweDI3ODQ7CiAgdC5hMTQ1ID0gMHgyNzg1OwogIHQuYTE0NiA9IDB4Mjc4NjsKICB0LmExNDcgPSAweDI3ODc7CiAgdC5hMTQ4ID0gMHgyNzg4OwogIHQuYTE0OSA9IDB4Mjc4OTsKICB0LmExNTAgPSAweDI3OGE7CiAgdC5hMTUxID0gMHgyNzhiOwogIHQuYTE1MiA9IDB4Mjc4YzsKICB0LmExNTMgPSAweDI3OGQ7CiAgdC5hMTU0ID0gMHgyNzhlOwogIHQuYTE1NSA9IDB4Mjc4ZjsKICB0LmExNTYgPSAweDI3OTA7CiAgdC5hMTU3ID0gMHgyNzkxOwogIHQuYTE1OCA9IDB4Mjc5MjsKICB0LmExNTkgPSAweDI3OTM7CiAgdC5hMTYwID0gMHgyNzk0OwogIHQuYTE2MSA9IDB4MjE5MjsKICB0LmExNjMgPSAweDIxOTQ7CiAgdC5hMTY0ID0gMHgyMTk1OwogIHQuYTE5NiA9IDB4Mjc5ODsKICB0LmExNjUgPSAweDI3OTk7CiAgdC5hMTkyID0gMHgyNzlhOwogIHQuYTE2NiA9IDB4Mjc5YjsKICB0LmExNjcgPSAweDI3OWM7CiAgdC5hMTY4ID0gMHgyNzlkOwogIHQuYTE2OSA9IDB4Mjc5ZTsKICB0LmExNzAgPSAweDI3OWY7CiAgdC5hMTcxID0gMHgyN2EwOwogIHQuYTE3MiA9IDB4MjdhMTsKICB0LmExNzMgPSAweDI3YTI7CiAgdC5hMTYyID0gMHgyN2EzOwogIHQuYTE3NCA9IDB4MjdhNDsKICB0LmExNzUgPSAweDI3YTU7CiAgdC5hMTc2ID0gMHgyN2E2OwogIHQuYTE3NyA9IDB4MjdhNzsKICB0LmExNzggPSAweDI3YTg7CiAgdC5hMTc5ID0gMHgyN2E5OwogIHQuYTE5MyA9IDB4MjdhYTsKICB0LmExODAgPSAweDI3YWI7CiAgdC5hMTk5ID0gMHgyN2FjOwogIHQuYTE4MSA9IDB4MjdhZDsKICB0LmEyMDAgPSAweDI3YWU7CiAgdC5hMTgyID0gMHgyN2FmOwogIHQuYTIwMSA9IDB4MjdiMTsKICB0LmExODMgPSAweDI3YjI7CiAgdC5hMTg0ID0gMHgyN2IzOwogIHQuYTE5NyA9IDB4MjdiNDsKICB0LmExODUgPSAweDI3YjU7CiAgdC5hMTk0ID0gMHgyN2I2OwogIHQuYTE5OCA9IDB4MjdiNzsKICB0LmExODYgPSAweDI3Yjg7CiAgdC5hMTk1ID0gMHgyN2I5OwogIHQuYTE4NyA9IDB4MjdiYTsKICB0LmExODggPSAweDI3YmI7CiAgdC5hMTg5ID0gMHgyN2JjOwogIHQuYTE5MCA9IDB4MjdiZDsKICB0LmExOTEgPSAweDI3YmU7CiAgdC5hODkgPSAweDI3Njg7CiAgdC5hOTAgPSAweDI3Njk7CiAgdC5hOTMgPSAweDI3NmE7CiAgdC5hOTQgPSAweDI3NmI7CiAgdC5hOTEgPSAweDI3NmM7CiAgdC5hOTIgPSAweDI3NmQ7CiAgdC5hMjA1ID0gMHgyNzZlOwogIHQuYTg1ID0gMHgyNzZmOwogIHQuYTIwNiA9IDB4Mjc3MDsKICB0LmE4NiA9IDB4Mjc3MTsKICB0LmE4NyA9IDB4Mjc3MjsKICB0LmE4OCA9IDB4Mjc3MzsKICB0LmE5NSA9IDB4Mjc3NDsKICB0LmE5NiA9IDB4Mjc3NTsKICB0WyIubm90ZGVmIl0gPSAweDAwMDA7Cn0pOwoKOy8vIC4vc3JjL2NvcmUvdW5pY29kZS5qcwoKY29uc3QgZ2V0U3BlY2lhbFBVQVN5bWJvbHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WzYzNzIxXSA9IDB4MDBhOTsKICB0WzYzMTkzXSA9IDB4MDBhOTsKICB0WzYzNzIwXSA9IDB4MDBhZTsKICB0WzYzMTk0XSA9IDB4MDBhZTsKICB0WzYzNzIyXSA9IDB4MjEyMjsKICB0WzYzMTk1XSA9IDB4MjEyMjsKICB0WzYzNzI5XSA9IDB4MjNhNzsKICB0WzYzNzMwXSA9IDB4MjNhODsKICB0WzYzNzMxXSA9IDB4MjNhOTsKICB0WzYzNzQwXSA9IDB4MjNhYjsKICB0WzYzNzQxXSA9IDB4MjNhYzsKICB0WzYzNzQyXSA9IDB4MjNhZDsKICB0WzYzNzI2XSA9IDB4MjNhMTsKICB0WzYzNzI3XSA9IDB4MjNhMjsKICB0WzYzNzI4XSA9IDB4MjNhMzsKICB0WzYzNzM3XSA9IDB4MjNhNDsKICB0WzYzNzM4XSA9IDB4MjNhNTsKICB0WzYzNzM5XSA9IDB4MjNhNjsKICB0WzYzNzIzXSA9IDB4MjM5YjsKICB0WzYzNzI0XSA9IDB4MjM5YzsKICB0WzYzNzI1XSA9IDB4MjM5ZDsKICB0WzYzNzM0XSA9IDB4MjM5ZTsKICB0WzYzNzM1XSA9IDB4MjM5ZjsKICB0WzYzNzM2XSA9IDB4MjNhMDsKfSk7CmZ1bmN0aW9uIG1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKGNvZGUp
20IHsKICBpZiAoY29kZSA+PSAweGZmZjAgJiYgY29kZSA8PSAweGZmZmYpIHsKICAgIHJldHVybiAwOwogIH0gZWxzZSBpZiAoY29kZSA+PSAweGY2MDAgJiYgY29kZSA8PSAweGY4ZmYpIHsKICAgIHJldHVybiBnZXRTcGVjaWFsUFVBU3ltYm9scygpW2NvZGVdIHx8IGNvZGU7CiAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwYWQpIHsKICAgIHJldHVybiAweDAwMmQ7CiAgfQogIHJldHVybiBjb2RlOwp9CmZ1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CiAgbGV0IHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW25hbWVdOwogIGlmICh1bmljb2RlICE9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybiB1bmljb2RlOwogIH0KICBpZiAoIW5hbWUpIHsKICAgIHJldHVybiAtMTsKICB9CiAgaWYgKG5hbWVbMF0gPT09ICJ1IikgewogICAgY29uc3QgbmFtZUxlbiA9IG5hbWUubGVuZ3RoOwogICAgbGV0IGhleFN0cjsKICAgIGlmIChuYW1lTGVuID09PSA3ICYmIG5hbWVbMV0gPT09ICJuIiAmJiBuYW1lWzJdID09PSAiaSIpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMyk7CiAgICB9IGVsc2UgaWYgKG5hbWVMZW4gPj0gNSAmJiBuYW1lTGVuIDw9IDcpIHsKICAgICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkgewogICAgICB1bmljb2RlID0gcGFyc2VJbnQoaGV4U3RyLCAxNik7CiAgICAgIGlmICh1bmljb2RlID49IDApIHsKICAgICAgICByZXR1cm4gdW5pY29kZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gLTE7Cn0KY29uc3QgVW5pY29kZVJhbmdlcyA9IFtbMHgwMDAwLCAweDAwN2ZdLCBbMHgwMDgwLCAweDAwZmZdLCBbMHgwMTAwLCAweDAxN2ZdLCBbMHgwMTgwLCAweDAyNGZdLCBbMHgwMjUwLCAweDAyYWYsIDB4MWQwMCwgMHgxZDdmLCAweDFkODAsIDB4MWRiZl0sIFsweDAyYjAsIDB4MDJmZiwgMHhhNzAwLCAweGE3MWZdLCBbMHgwMzAwLCAweDAzNmYsIDB4MWRjMCwgMHgxZGZmXSwgWzB4MDM3MCwgMHgwM2ZmXSwgWzB4MmM4MCwgMHgyY2ZmXSwgWzB4MDQwMCwgMHgwNGZmLCAweDA1MDAsIDB4MDUyZiwgMHgyZGUwLCAweDJkZmYsIDB4YTY0MCwgMHhhNjlmXSwgWzB4MDUzMCwgMHgwNThmXSwgWzB4MDU5MCwgMHgwNWZmXSwgWzB4YTUwMCwgMHhhNjNmXSwgWzB4MDYwMCwgMHgwNmZmLCAweDA3NTAsIDB4MDc3Zl0sIFsweDA3YzAsIDB4MDdmZl0sIFsweDA5MDAsIDB4MDk3Zl0sIFsweDA5ODAsIDB4MDlmZl0sIFsweDBhMDAsIDB4MGE3Zl0sIFsweDBhODAsIDB4MGFmZl0sIFsweDBiMDAsIDB4MGI3Zl0sIFsweDBiODAsIDB4MGJmZl0sIFsweDBjMDAsIDB4MGM3Zl0sIFsweDBjODAsIDB4MGNmZl0sIFsweDBkMDAsIDB4MGQ3Zl0sIFsweDBlMDAsIDB4MGU3Zl0sIFsweDBlODAsIDB4MGVmZl0sIFsweDEwYTAsIDB4MTBmZiwgMHgyZDAwLCAweDJkMmZdLCBbMHgxYjAwLCAweDFiN2ZdLCBbMHgxMTAwLCAweDExZmZdLCBbMHgxZTAwLCAweDFlZmYsIDB4MmM2MCwgMHgyYzdmLCAweGE3MjAsIDB4YTdmZl0sIFsweDFmMDAsIDB4MWZmZl0sIFsweDIwMDAsIDB4MjA2ZiwgMHgyZTAwLCAweDJlN2ZdLCBbMHgyMDcwLCAweDIwOWZdLCBbMHgyMGEwLCAweDIwY2ZdLCBbMHgyMGQwLCAweDIwZmZdLCBbMHgyMTAwLCAweDIxNGZdLCBbMHgyMTUwLCAweDIxOGZdLCBbMHgyMTkwLCAweDIxZmYsIDB4MjdmMCwgMHgyN2ZmLCAweDI5MDAsIDB4Mjk3ZiwgMHgyYjAwLCAweDJiZmZdLCBbMHgyMjAwLCAweDIyZmYsIDB4MmEwMCwgMHgyYWZmLCAweDI3YzAsIDB4MjdlZiwgMHgyOTgwLCAweDI5ZmZdLCBbMHgyMzAwLCAweDIzZmZdLCBbMHgyNDAwLCAweDI0M2ZdLCBbMHgyNDQwLCAweDI0NWZdLCBbMHgyNDYwLCAweDI0ZmZdLCBbMHgyNTAwLCAweDI1N2ZdLCBbMHgyNTgwLCAweDI1OWZdLCBbMHgyNWEwLCAweDI1ZmZdLCBbMHgyNjAwLCAweDI2ZmZdLCBbMHgyNzAwLCAweDI3YmZdLCBbMHgzMDAwLCAweDMwM2ZdLCBbMHgzMDQwLCAweDMwOWZdLCBbMHgzMGEwLCAweDMwZmYsIDB4MzFmMCwgMHgzMWZmXSwgWzB4MzEwMCwgMHgzMTJmLCAweDMxYTAsIDB4MzFiZl0sIFsweDMxMzAsIDB4MzE4Zl0sIFsweGE4NDAsIDB4YTg3Zl0sIFsweDMyMDAsIDB4MzJmZl0sIFsweDMzMDAsIDB4MzNmZl0sIFsweGFjMDAsIDB4ZDdhZl0sIFsweGQ4MDAsIDB4ZGZmZl0sIFsweDEwOTAwLCAweDEwOTFmXSwgWzB4NGUwMCwgMHg5ZmZmLCAweDJlODAsIDB4MmVmZiwgMHgyZjAwLCAweDJmZGYsIDB4MmZmMCwgMHgyZmZmLCAweDM0MDAsIDB4NGRiZiwgMHgyMDAwMCwgMHgyYTZkZiwgMHgzMTkwLCAweDMxOWZdLCBbMHhlMDAwLCAweGY4ZmZdLCBbMHgzMWMwLCAweDMxZWYsIDB4ZjkwMCwgMHhmYWZmLCAweDJmODAwLCAweDJmYTFmXSwgWzB4ZmIwMCwgMHhmYjRmXSwgWzB4ZmI1MCwgMHhmZGZmXSwgWzB4ZmUyMCwgMHhmZTJmXSwgWzB4ZmUxMCwgMHhmZTFmXSwgWzB4ZmU1MCwgMHhmZTZmXSwgWzB4ZmU3MCwgMHhmZWZmXSwgWzB4ZmYwMCwgMHhmZmVmXSwgWzB4ZmZmMCwgMHhmZmZmXSwgWzB4MGYwMCwgMHgwZmZmXSwgWzB4MDcwMCwgMHgwNzRmXSwgWzB4MDc4MCwgMHgwN2JmXSwgWzB4MGQ4MCwgMHgwZGZmXSwgWzB4MTAwMCwgMHgxMDlmXSwgWzB4MTIwMCwgMHgxMzdmLCAweDEzODAsIDB4MTM5ZiwgMHgyZDgwLCAweDJkZGZdLCBbMHgxM2EwLCAweDEzZmZdLCBbMHgxNDAwLCAweDE2N2ZdLCBbMHgxNjgwLCAweDE2OWZdLCBbMHgxNmEwLCAweDE2ZmZdLCBbMHgxNzgwLCAweDE3ZmZdLCBbMHgxODAwLCAweDE4YWZdLCBbMHgyODAwLCAweDI4ZmZdLCBbMHhhMDAwLCAweGE0OGZdLCBbMHgxNzAwLCAweDE3MWYsIDB4MTcyMCwgMHgxNzNmLCAweDE3NDAsIDB4MTc1ZiwgMHgxNzYwLCAweDE3N2ZdLCBbMHgxMDMwMCwgMHgxMDMyZl0sIFsweDEwMzMwLCAweDEwMzRmXSwgWzB4MTA0MDAsIDB4MTA0NGZdLCBbMHgxZDAwMCwgMHgxZDBmZiwgMHgxZDEwMCwgMHgxZDFmZiwgMHgxZDIwMCwgMHgxZDI0Zl0sIFsweDFkNDAwLCAweDFkN2ZmXSwgWzB4ZmYwMDAsIDB4ZmZmZmRdLCBbMHhmZTAwLCAweGZlMGYsIDB4ZTAxMDAsIDB4ZTAxZWZdLCBbMHhlMDAwMCwgMHhlMDA3Zl0sIFsweDE5MDAsIDB4MTk0Zl0sIFsweDE5NTAsIDB4MTk3Zl0sIFsweDE5ODAsIDB4MTlkZl0sIFsweDFhMDAsIDB4MWExZl0sIFsweDJjMDAsIDB4MmM1Zl0sIFsweDJkMzAsIDB4MmQ3Zl0sIFsweDRkYzAsIDB4NGRmZl0sIFsweGE4MDAsIDB4YTgyZl0sIFsweDEwMDAwLCAweDEwMDdmLCAweDEwMDgwLCAweDEwMGZmLCAweDEwMTAwLCAweDEwMTNmXSwgWzB4MTAxNDAsIDB4MTAxOGZdLCBbMHgxMDM4MCwgMHgxMDM5Zl0sIFsweDEwM2EwLCAweDEwM2RmXSwgWzB4MTA0NTAsIDB4MTA0N2ZdLCBbMHgxMDQ4MCwgMHgxMDRhZl0sIFsweDEwODAwLCAweDEwODNmXSwgWzB4MTBhMDAsIDB4MTBhNWZdLCBbMHgxZDMwMCwgMHgxZDM1Zl0sIFsweDEyMDAwLCAweDEyM2ZmLCAweDEyNDAwLCAweDEyNDdmXSwgWzB4MWQzNjA
20sIDB4MWQzN2ZdLCBbMHgxYjgwLCAweDFiYmZdLCBbMHgxYzAwLCAweDFjNGZdLCBbMHgxYzUwLCAweDFjN2ZdLCBbMHhhODgwLCAweGE4ZGZdLCBbMHhhOTAwLCAweGE5MmZdLCBbMHhhOTMwLCAweGE5NWZdLCBbMHhhYTAwLCAweGFhNWZdLCBbMHgxMDE5MCwgMHgxMDFjZl0sIFsweDEwMWQwLCAweDEwMWZmXSwgWzB4MTAyYTAsIDB4MTAyZGYsIDB4MTAyODAsIDB4MTAyOWYsIDB4MTA5MjAsIDB4MTA5M2ZdLCBbMHgxZjAzMCwgMHgxZjA5ZiwgMHgxZjAwMCwgMHgxZjAyZl1dOwpmdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUsIGxhc3RQb3NpdGlvbiA9IC0xKSB7CiAgaWYgKGxhc3RQb3NpdGlvbiAhPT0gLTEpIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tsYXN0UG9zaXRpb25dOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmFuZ2UubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBpZiAodmFsdWUgPj0gcmFuZ2VbaV0gJiYgdmFsdWUgPD0gcmFuZ2VbaSArIDFdKSB7CiAgICAgICAgcmV0dXJuIGxhc3RQb3NpdGlvbjsKICAgICAgfQogICAgfQogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBVbmljb2RlUmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTsKICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhbmdlLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgaWYgKHZhbHVlID49IHJhbmdlW2pdICYmIHZhbHVlIDw9IHJhbmdlW2ogKyAxXSkgewogICAgICAgIHJldHVybiBpOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiAtMTsKfQpjb25zdCBTcGVjaWFsQ2hhclJlZ0V4cCA9IG5ldyBSZWdFeHAoIl4oXFxzKXwoXFxwe01ufSl8KFxccHtDZn0pJCIsICJ1Iik7CmNvbnN0IENhdGVnb3J5Q2FjaGUgPSBuZXcgTWFwKCk7CmZ1bmN0aW9uIGdldENoYXJVbmljb2RlQ2F0ZWdvcnkoY2hhcikgewogIGNvbnN0IGNhY2hlZENhdGVnb3J5ID0gQ2F0ZWdvcnlDYWNoZS5nZXQoY2hhcik7CiAgaWYgKGNhY2hlZENhdGVnb3J5KSB7CiAgICByZXR1cm4gY2FjaGVkQ2F0ZWdvcnk7CiAgfQogIGNvbnN0IGdyb3VwcyA9IGNoYXIubWF0Y2goU3BlY2lhbENoYXJSZWdFeHApOwogIGNvbnN0IGNhdGVnb3J5ID0gewogICAgaXNXaGl0ZXNwYWNlOiAhIWdyb3Vwcz8uWzFdLAogICAgaXNaZXJvV2lkdGhEaWFjcml0aWM6ICEhZ3JvdXBzPy5bMl0sCiAgICBpc0ludmlzaWJsZUZvcm1hdE1hcms6ICEhZ3JvdXBzPy5bM10KICB9OwogIENhdGVnb3J5Q2FjaGUuc2V0KGNoYXIsIGNhdGVnb3J5KTsKICByZXR1cm4gY2F0ZWdvcnk7Cn0KZnVuY3Rpb24gY2xlYXJVbmljb2RlQ2FjaGVzKCkgewogIENhdGVnb3J5Q2FjaGUuY2xlYXIoKTsKfQoKOy8vIC4vc3JjL2NvcmUvZm9udHNfdXRpbHMuanMKCgoKCgoKY29uc3QgU0VBQ19BTkFMWVNJU19FTkFCTEVEID0gdHJ1ZTsKY29uc3QgRm9udEZsYWdzID0gewogIEZpeGVkUGl0Y2g6IDEsCiAgU2VyaWY6IDIsCiAgU3ltYm9saWM6IDQsCiAgU2NyaXB0OiA4LAogIE5vbnN5bWJvbGljOiAzMiwKICBJdGFsaWM6IDY0LAogIEFsbENhcDogNjU1MzYsCiAgU21hbGxDYXA6IDEzMTA3MiwKICBGb3JjZUJvbGQ6IDI2MjE0NAp9Owpjb25zdCBNYWNTdGFuZGFyZEdseXBoT3JkZXJpbmcgPSBbIi5ub3RkZWYiLCAiLm51bGwiLCAibm9ubWFya2luZ3JldHVybiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwgImFhY3V0ZSIsICJhZ3JhdmUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImF0aWxkZSIsICJhcmluZyIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWdyYXZlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpYWN1dGUiLCAiaWdyYXZlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJudGlsZGUiLCAib2FjdXRlIiwgIm9ncmF2ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgImRhZ2dlciIsICJkZWdyZWUiLCAiY2VudCIsICJzdGVybGluZyIsICJzZWN0aW9uIiwgImJ1bGxldCIsICJwYXJhZ3JhcGgiLCAiZ2VybWFuZGJscyIsICJyZWdpc3RlcmVkIiwgImNvcHlyaWdodCIsICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLCAiT3NsYXNoIiwgImluZmluaXR5IiwgInBsdXNtaW51cyIsICJsZXNzZXF1YWwiLCAiZ3JlYXRlcmVxdWFsIiwgInllbiIsICJtdSIsICJwYXJ0aWFsZGlmZiIsICJzdW1tYXRpb24iLCAicHJvZHVjdCIsICJwaSIsICJpbnRlZ3JhbCIsICJvcmRmZW1pbmluZSIsICJvcmRtYXNjdWxpbmUiLCAiT21lZ2EiLCAiYWUiLCAib3NsYXNoIiwgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLCAicmFkaWNhbCIsICJmbG9yaW4iLCAiYXBwcm94ZXF1YWwiLCAiRGVsdGEiLCAiZ3VpbGxlbW90bGVmdCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJub25icmVha2luZ3NwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLCAiT3RpbGRlIiwgIk9FIiwgIm9lIiwgImVuZGFzaCIsICJlbWRhc2giLCAicXVvdGVkYmxsZWZ0IiwgInF1b3RlZGJscmlnaHQiLCAicXVvdGVsZWZ0IiwgInF1b3RlcmlnaHQiLCAiZGl2aWRlIiwgImxvemVuZ2UiLCAieWRpZXJlc2lzIiwgIllkaWVyZXNpcyIsICJmcmFjdGlvbiIsICJjdXJyZW5jeSIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicGVydGhvdXNhbmQiLCAiQWNpcmN1bWZsZXgiLCAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgImFwcGxlIiwgIk9ncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWdyYXZlIiwgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiIsICJMc2xhc2giLCAibHNsYXNoIiwgIlNjYXJvbiIsICJzY2Fyb24iLCAiWmNhcm9uIiwgInpjYXJvbiIsICJicm9rZW5iYXIiLCAiRXRoIiwgImV0aCIsICJZYWN1dGUiLCAieWFjdXRlIiwgIlRob3JuIiwgInRob3JuIiwgIm1pbnVzIiwgIm11bHRpcGx5IiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAib25laGFsZiIsICJvbmVxdWFydGVyIiwgInRocmVlcXVhcnRlcnMiLCAiZnJhbmMiLCAiR2JyZXZlIiwgImdicmV2ZSIsICJJZG90YWNjZW50IiwgIlNjZWRpbGxhIiwgInNjZWRpbGxhIiwgIkNhY3V0ZSIsICJjYWN1dGUiLCAiQ2Nhcm9uIiwgImNjYXJvbiIsICJkY3JvYXQiXTsKZnVuY3Rpb24gcmVjb3ZlckdseXBoTmFtZShuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CiAgaWYgKGdseXBoc1VuaWNvZGVNYXBbbmFtZV0gIT09IHVuZGVmaW5lZCkgewogICAgcmV0dXJuIG5hbWU7CiAgfQogIGNvbnN0IHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgobmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBnbHlwaHNVbmljb2RlTWFwKSB7CiAgICAgIGlmIChnbHlwaHNVbmljb2RlTWFwW2tleV0gPT09IHVuaWNvZGUpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgICB9CiAgICB9CiAgfQogIGluZm8oIlVuYWJsZSB0byByZWNvdmVyIGEgc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3I6ICIgKyBuYW1lKTsKICByZXR1cm4gbmFtZTsKfQpmdW5jdGlvbiB0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgYnVpbHRJbkVuY29kaW5nLCBnbHlwaE5hbWVzKSB7CiAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGxldCBnbHlwaElkLCBjaGFyQ29kZSwgYmFzZUVuY29kaW5nOwogIGNvbnN0IGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgaWYgKHByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQpIHsKICAgIGJhc2VFbmNvZGluZyA9IGJ1aWx0SW5FbmNvZGluZzsKICAgIGZvciAoY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IGJhc2VFbmNvZGluZy5sZW5ndGg7IGNoYXJDb2RlKyspIHsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihiYXNlRW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpIHsKICAgIGJhc2VFbmNvZGluZyA9IGdldEVuY29
20kaW5nKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSk7CiAgICBmb3IgKGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCBiYXNlRW5jb2RpbmcubGVuZ3RoOyBjaGFyQ29kZSsrKSB7CiAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoYmFzZUVuY29kaW5nW2NoYXJDb2RlXSk7CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQgPj0gMCA/IGdseXBoSWQgOiAwOwogICAgfQogIH0gZWxzZSBpZiAoaXNTeW1ib2xpY0ZvbnQpIHsKICAgIGZvciAoY2hhckNvZGUgaW4gYnVpbHRJbkVuY29kaW5nKSB7CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV07CiAgICB9CiAgfSBlbHNlIHsKICAgIGJhc2VFbmNvZGluZyA9IFN0YW5kYXJkRW5jb2Rpbmc7CiAgICBmb3IgKGNoYXJDb2RlID0gMDsgY2hhckNvZGUgPCBiYXNlRW5jb2RpbmcubGVuZ3RoOyBjaGFyQ29kZSsrKSB7CiAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoYmFzZUVuY29kaW5nW2NoYXJDb2RlXSk7CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQgPj0gMCA/IGdseXBoSWQgOiAwOwogICAgfQogIH0KICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgbGV0IGdseXBoc1VuaWNvZGVNYXA7CiAgaWYgKGRpZmZlcmVuY2VzKSB7CiAgICBmb3IgKGNoYXJDb2RlIGluIGRpZmZlcmVuY2VzKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJDb2RlXTsKICAgICAgZ2x5cGhJZCA9IGdseXBoTmFtZXMuaW5kZXhPZihnbHlwaE5hbWUpOwogICAgICBpZiAoZ2x5cGhJZCA9PT0gLTEpIHsKICAgICAgICBpZiAoIWdseXBoc1VuaWNvZGVNYXApIHsKICAgICAgICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgIGlmIChzdGFuZGFyZEdseXBoTmFtZSAhPT0gZ2x5cGhOYW1lKSB7CiAgICAgICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCA+PSAwID8gZ2x5cGhJZCA6IDA7CiAgICB9CiAgfQogIHJldHVybiBjaGFyQ29kZVRvR2x5cGhJZDsKfQpmdW5jdGlvbiBub3JtYWxpemVGb250TmFtZShuYW1lKSB7CiAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgvWyxfXS9nLCAiLSIpLnJlcGxhY2VBbGwoL1xzL2csICIiKTsKfQpjb25zdCBnZXRWZXJ0aWNhbFByZXNlbnRhdGlvbkZvcm0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkodCA9PiB7CiAgdFsweDIwMTNdID0gMHhmZTMyOwogIHRbMHgyMDE0XSA9IDB4ZmUzMTsKICB0WzB4MjAyNV0gPSAweGZlMzA7CiAgdFsweDIwMjZdID0gMHhmZTE5OwogIHRbMHgzMDAxXSA9IDB4ZmUxMTsKICB0WzB4MzAwMl0gPSAweGZlMTI7CiAgdFsweDMwMDhdID0gMHhmZTNmOwogIHRbMHgzMDA5XSA9IDB4ZmU0MDsKICB0WzB4MzAwYV0gPSAweGZlM2Q7CiAgdFsweDMwMGJdID0gMHhmZTNlOwogIHRbMHgzMDBjXSA9IDB4ZmU0MTsKICB0WzB4MzAwZF0gPSAweGZlNDI7CiAgdFsweDMwMGVdID0gMHhmZTQzOwogIHRbMHgzMDBmXSA9IDB4ZmU0NDsKICB0WzB4MzAxMF0gPSAweGZlM2I7CiAgdFsweDMwMTFdID0gMHhmZTNjOwogIHRbMHgzMDE0XSA9IDB4ZmUzOTsKICB0WzB4MzAxNV0gPSAweGZlM2E7CiAgdFsweDMwMTZdID0gMHhmZTE3OwogIHRbMHgzMDE3XSA9IDB4ZmUxODsKICB0WzB4ZmU0Zl0gPSAweGZlMzQ7CiAgdFsweGZmMDFdID0gMHhmZTE1OwogIHRbMHhmZjA4XSA9IDB4ZmUzNTsKICB0WzB4ZmYwOV0gPSAweGZlMzY7CiAgdFsweGZmMGNdID0gMHhmZTEwOwogIHRbMHhmZjFhXSA9IDB4ZmUxMzsKICB0WzB4ZmYxYl0gPSAweGZlMTQ7CiAgdFsweGZmMWZdID0gMHhmZTE2OwogIHRbMHhmZjNiXSA9IDB4ZmU0NzsKICB0WzB4ZmYzZF0gPSAweGZlNDg7CiAgdFsweGZmM2ZdID0gMHhmZTMzOwogIHRbMHhmZjViXSA9IDB4ZmUzNzsKICB0WzB4ZmY1ZF0gPSAweGZlMzg7Cn0pOwoKOy8vIC4vc3JjL2NvcmUvc3RhbmRhcmRfZm9udHMuanMKCgpjb25zdCBnZXRTdGRGb250TWFwID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdFsiVGltZXMtUm9tYW4iXSA9ICJUaW1lcy1Sb21hbiI7CiAgdC5IZWx2ZXRpY2EgPSAiSGVsdmV0aWNhIjsKICB0LkNvdXJpZXIgPSAiQ291cmllciI7CiAgdC5TeW1ib2wgPSAiU3ltYm9sIjsKICB0WyJ
20UaW1lcy1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQ291cmllci1Cb2xkIl0gPSAiQ291cmllci1Cb2xkIjsKICB0LlphcGZEaW5nYmF0cyA9ICJaYXBmRGluZ2JhdHMiOwogIHRbIlRpbWVzLUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7CiAgdFsiSGVsdmV0aWNhLU9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQ291cmllci1PYmxpcXVlIl0gPSAiQ291cmllci1PYmxpcXVlIjsKICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSAiVGltZXMtQm9sZEl0YWxpYyI7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyLUJvbGRPYmxpcXVlIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdC5BcmlhbE5hcnJvdyA9ICJIZWx2ZXRpY2EiOwogIHRbIkFyaWFsTmFycm93LUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWxOYXJyb3ctQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWxOYXJyb3ctSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWxCbGFjayA9ICJIZWx2ZXRpY2EiOwogIHRbIkFyaWFsQmxhY2stQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsQmxhY2stSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHRbIkFyaWFsLUJsYWNrIl0gPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1CbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsLUJsYWNrLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUJsYWNrLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkFyaWFsID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWwtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbC1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdC5BcmlhbE1UID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWwtQm9sZEl0YWxpY01UIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbC1Cb2xkTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQm9sZEl0YWxpY01ULUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUJvbGRNVC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsLUl0YWxpY01ULUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkFyaWFsVW5pY29kZU1TID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxVbmljb2RlTVMtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbFVuaWNvZGVNUy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbFVuaWNvZGVNUy1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQ291cmllci1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdFsiQ291cmllci1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHQuQ291cmllck5ldyA9ICJDb3VyaWVyIjsKICB0WyJDb3VyaWVyTmV3LUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHRbIkNvdXJpZXJOZXctQm9sZEl0YWxpYyJdID0gIkNvdXJpZXItQm9sZE9ibGlxdWUiOwogIHRbIkNvdXJpZXJOZXctSXRhbGljIl0gPSAiQ291cmllci1PYmxpcXVlIjsKICB0WyJDb3VyaWVyTmV3UFMtQm9sZEl0YWxpY01UIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdFsiQ291cmllck5ld1BTLUJvbGRNVCJdID0gIkNvdXJpZXItQm9sZCI7CiAgdFsiQ291cmllck5ld1BTLUl0YWxpY01UIl0gPSAiQ291cmllci1PYmxpcXVlIjsKICB0LkNvdXJpZXJOZXdQU01UID0gIkNvdXJpZXIiOwogIHRbIkhlbHZldGljYS1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHRbIkhlbHZldGljYUxUU3RkLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiU3ltYm9sLUJvbGQiXSA9ICJTeW1ib2wiOwogIHRbIlN5bWJvbC1Cb2xkSXRhbGljIl0gPSAiU3ltYm9sIjsKICB0WyJTeW1ib2wtSXRhbGljIl0gPSAiU3ltYm9sIjsKICB0LlRpbWVzTmV3Um9tYW4gPSAiVGltZXMtUm9tYW4iOwogIHRbIlRpbWVzTmV3Um9tYW4tQm9sZCJdID0gIlRpbWVzLUJvbGQiOwogIHRbIlRpbWVzTmV3Um9tYW4tQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW4tSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0LlRpbWVzTmV3Um9tYW5QUyA9ICJUaW1lcy1Sb21hbiI7CiAgdFsiVGltZXNOZXdSb21hblBTLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKICB0WyJ
20UaW1lc05ld1JvbWFuUFMtQm9sZE1UIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIl0gPSAiVGltZXMtSXRhbGljIjsKICB0LlRpbWVzTmV3Um9tYW5QU01UID0gIlRpbWVzLVJvbWFuIjsKICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hblBTTVQtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QU01ULUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7Cn0pOwpjb25zdCBnZXRGb250TmFtZVRvRmlsZU1hcCA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogIHQuQ291cmllciA9ICJGb3hpdEZpeGVkLnBmYiI7CiAgdFsiQ291cmllci1Cb2xkIl0gPSAiRm94aXRGaXhlZEJvbGQucGZiIjsKICB0WyJDb3VyaWVyLUJvbGRPYmxpcXVlIl0gPSAiRm94aXRGaXhlZEJvbGRJdGFsaWMucGZiIjsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9ICJGb3hpdEZpeGVkSXRhbGljLnBmYiI7CiAgdC5IZWx2ZXRpY2EgPSAiTGliZXJhdGlvblNhbnMtUmVndWxhci50dGYiOwogIHRbIkhlbHZldGljYS1Cb2xkIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZC50dGYiOwogIHRbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdID0gIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMudHRmIjsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkxpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYiOwogIHRbIlRpbWVzLVJvbWFuIl0gPSAiRm94aXRTZXJpZi5wZmIiOwogIHRbIlRpbWVzLUJvbGQiXSA9ICJGb3hpdFNlcmlmQm9sZC5wZmIiOwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICJGb3hpdFNlcmlmQm9sZEl0YWxpYy5wZmIiOwogIHRbIlRpbWVzLUl0YWxpYyJdID0gIkZveGl0U2VyaWZJdGFsaWMucGZiIjsKICB0LlN5bWJvbCA9ICJGb3hpdFN5bWJvbC5wZmIiOwogIHQuWmFwZkRpbmdiYXRzID0gIkZveGl0RGluZ2JhdHMucGZiIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIl0gPSAiTGliZXJhdGlvblNhbnMtUmVndWxhci50dGYiOwogIHRbIkxpYmVyYXRpb25TYW5zLUJvbGQiXSA9ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiI7CiAgdFsiTGliZXJhdGlvblNhbnMtSXRhbGljIl0gPSAiTGliZXJhdGlvblNhbnMtSXRhbGljLnR0ZiI7CiAgdFsiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyJdID0gIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMudHRmIjsKfSk7CmNvbnN0IGdldE5vblN0ZEZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkNhbGlicmkgPSAiSGVsdmV0aWNhIjsKICB0WyJDYWxpYnJpLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJDYWxpYnJpLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkNlbnR1cnlHb3RoaWMgPSAiSGVsdmV0aWNhIjsKICB0WyJDZW50dXJ5R290aGljLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQ2VudHVyeUdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJDZW50dXJ5R290aGljLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkNvbWljU2Fuc01TID0gIkNvbWljIFNhbnMgTVMiOwogIHRbIkNvbWljU2Fuc01TLUJvbGQiXSA9ICJDb21pYyBTYW5zIE1TLUJvbGQiOwogIHRbIkNvbWljU2Fuc01TLUJvbGRJdGFsaWMiXSA9ICJDb21pYyBTYW5zIE1TLUJvbGRJdGFsaWMiOwogIHRbIkNvbWljU2Fuc01TLUl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtSXRhbGljIjsKICB0LkdpbGxTYW5zTVQgPSAiSGVsdmV0aWNhIjsKICB0WyJHaWxsU2Fuc01ULUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiR2lsbFNhbnNNVC1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJHaWxsU2Fuc01ULUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkltcGFjdCA9ICJIZWx2ZXRpY2EiOwogIHRbIkl0Y1N5bWJvbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkl0Y1N5bWJvbC1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJJdGNTeW1ib2wtQm9vayJdID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLUJvb2tJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiSXRjU3ltYm9sLU1lZGl1bSJdID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLU1lZGl1bUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0Lkx1Y2lkYUNvbnNvbGUgPSAiQ291cmllciI7CiAgdFsiTHVjaWRhQ29uc29sZS1Cb2xkIl0gPSAiQ291cmllci1Cb2xkIjsKICB0WyJMdWNpZGFDb25zb2xlLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJMdWNpZGFDb25zb2xlLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CiAgdFsiTHVjaWRhU2Fucy1EZW1pIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIk1TLUdvdGhpYyJdID0gIk1TIEdvdGhpYyI7CiAgdFsiTVMtR290aGljLUJvbGQiXSA9ICJNUyBHb3RoaWMtQm9sZCI7CiAgdFsiTVMtR290aGljLUJvbGRJdGFsaWMiXSA9ICJNUyBHb3RoaWMtQm9sZEl0YWxpYyI7CiAgdFsiTVMtR290aGljLUl0YWxpYyJdID0gIk1TIEdvdGhpYy1JdGFsaWMiOwogIHRbIk1TLU1pbmNobyJdID0gIk1TIE1pbmNobyI7CiAgdFsiTVMtTWluY2hvLUJvbGQiXSA9ICJNUyBNaW5jaG8tQm9sZCI7CiAgdFsiTVMtTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBNaW5jaG8tQm9sZEl0YWxpYyI7CiAgdFsiTVMtTWluY2hvLUl0YWxpYyJdID0gIk1TIE1pbmNoby1JdGFsaWMiOwogIHRbIk1TLVBHb3RoaWMiXSA9ICJNUyBQR290aGljIjsKICB0WyJNUy1QR290aGljLUJvbGQiXSA9ICJNUyBQR290aGljLUJvbGQiOwogIHRbIk1TLVBHb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIFBHb3RoaWMtQm9sZEl0YWxpYyI7CiAgdFsiTVMtUEdvdGhpYy1JdGFsaWMiXSA9ICJNUyBQR290aGljLUl0YWxpYyI7CiAgdFsiTVMtUE1pbmNobyJdID0gIk1TIFBNaW5jaG8iOwogIHRbIk1TLVBNaW5jaG8tQm9sZCJdID0gIk1TIFBNaW5jaG8tQm9sZCI7CiAgdFsiTVMtUE1pbmNoby1Cb2xkSXRhbGljIl0gPSAiTVMgUE1pbmNoby1Cb2xkSXRhbGljIjsKICB0WyJNUy1QTWluY2hvLUl0YWxpYyJdID0gIk1TIFBNaW5jaG8tSXRhbGljIjsKICB0Lk51cHRpYWxTY3JpcHQgPSAiVGltZXMtSXRhbGljIjsKICB0LlNlZ29lVUlTeW1ib2wgPSAiSGVsdmV0aWNhIjsKfSk7CmNvbnN0IGdldFNlcmlmRm9udHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJBZG9iZSBKZW5zb24iXSA9IHRydWU7CiAgdFsiQWRvYmUgVGV4dCJdID0gdHJ1ZTsKICB0LkFsYmVydHVzID0gdHJ1ZTsKICB0LkFsZHVzID0gdHJ1ZTsKICB0LkFsZXhhbmRyaWEgPSB0cnVlOw
20ogIHQuQWxnZXJpYW4gPSB0cnVlOwogIHRbIkFtZXJpY2FuIFR5cGV3cml0ZXIiXSA9IHRydWU7CiAgdC5BbnRpcXVhID0gdHJ1ZTsKICB0LkFwZXggPSB0cnVlOwogIHQuQXJubyA9IHRydWU7CiAgdC5Bc3RlciA9IHRydWU7CiAgdC5BdXJvcmEgPSB0cnVlOwogIHQuQmFza2VydmlsbGUgPSB0cnVlOwogIHQuQmVsbCA9IHRydWU7CiAgdC5CZW1ibyA9IHRydWU7CiAgdFsiQmVtYm8gU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LkJlbmd1aWF0ID0gdHJ1ZTsKICB0WyJCZXJrZWxleSBPbGQgU3R5bGUiXSA9IHRydWU7CiAgdFsiQmVybmhhcmQgTW9kZXJuIl0gPSB0cnVlOwogIHRbIkJlcnRob2xkIENpdHkiXSA9IHRydWU7CiAgdC5Cb2RvbmkgPSB0cnVlOwogIHRbIkJhdWVyIEJvZG9uaSJdID0gdHJ1ZTsKICB0WyJCb29rIEFudGlxdWEiXSA9IHRydWU7CiAgdC5Cb29rbWFuID0gdHJ1ZTsKICB0WyJCb3JkZWF1eCBSb21hbiJdID0gdHJ1ZTsKICB0WyJDYWxpZm9ybmlhbiBGQiJdID0gdHJ1ZTsKICB0LkNhbGlzdG8gPSB0cnVlOwogIHQuQ2FsdmVydCA9IHRydWU7CiAgdC5DYXBpdGFscyA9IHRydWU7CiAgdC5DYW1icmlhID0gdHJ1ZTsKICB0LkNhcnRpZXIgPSB0cnVlOwogIHQuQ2FzbG9uID0gdHJ1ZTsKICB0LkNhdHVsbCA9IHRydWU7CiAgdC5DZW50YXVyID0gdHJ1ZTsKICB0WyJDZW50dXJ5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKICB0WyJDZW50dXJ5IFNjaG9vbGJvb2siXSA9IHRydWU7CiAgdC5DaGFwYXJyYWwgPSB0cnVlOwogIHRbIkNoYXJpcyBTSUwiXSA9IHRydWU7CiAgdC5DaGVsdGVuaGFtID0gdHJ1ZTsKICB0WyJDaG9sbGEgU2xhYiJdID0gdHJ1ZTsKICB0LkNsYXJlbmRvbiA9IHRydWU7CiAgdC5DbGVhcmZhY2UgPSB0cnVlOwogIHQuQ29jaGluID0gdHJ1ZTsKICB0LkNvbG9ubmEgPSB0cnVlOwogIHRbIkNvbXB1dGVyIE1vZGVybiJdID0gdHJ1ZTsKICB0WyJDb25jcmV0ZSBSb21hbiJdID0gdHJ1ZTsKICB0LkNvbnN0YW50aWEgPSB0cnVlOwogIHRbIkNvb3BlciBCbGFjayJdID0gdHJ1ZTsKICB0LkNvcm9uYSA9IHRydWU7CiAgdC5FY290eXBlID0gdHJ1ZTsKICB0LkVneXB0aWVubmUgPSB0cnVlOwogIHQuRWxlcGhhbnQgPSB0cnVlOwogIHQuRXhjZWxzaW9yID0gdHJ1ZTsKICB0LkZhaXJmaWVsZCA9IHRydWU7CiAgdFsiRkYgU2NhbGEiXSA9IHRydWU7CiAgdC5Gb2xrYXJkID0gdHJ1ZTsKICB0LkZvb3RsaWdodCA9IHRydWU7CiAgdC5GcmVlU2VyaWYgPSB0cnVlOwogIHRbIkZyaXogUXVhZHJhdGEiXSA9IHRydWU7CiAgdC5HYXJhbW9uZCA9IHRydWU7CiAgdC5HZW50aXVtID0gdHJ1ZTsKICB0Lkdlb3JnaWEgPSB0cnVlOwogIHQuR2xvdWNlc3RlciA9IHRydWU7CiAgdFsiR291ZHkgT2xkIFN0eWxlIl0gPSB0cnVlOwogIHRbIkdvdWR5IFNjaG9vbGJvb2siXSA9IHRydWU7CiAgdFsiR291ZHkgUHJvIEZvbnQiXSA9IHRydWU7CiAgdC5HcmFuam9uID0gdHJ1ZTsKICB0WyJHdWFyZGlhbiBFZ3lwdGlhbiJdID0gdHJ1ZTsKICB0LkhlYXRoZXIgPSB0cnVlOwogIHQuSGVyY3VsZXMgPSB0cnVlOwogIHRbIkhpZ2ggVG93ZXIgVGV4dCJdID0gdHJ1ZTsKICB0Lkhpcm9zaGlnZSA9IHRydWU7CiAgdFsiSG9lZmxlciBUZXh0Il0gPSB0cnVlOwogIHRbIkh1bWFuYSBTZXJpZiJdID0gdHJ1ZTsKICB0LkltcHJpbnQgPSB0cnVlOwogIHRbIklvbmljIE5vLiA1Il0gPSB0cnVlOwogIHQuSmFuc29uID0gdHJ1ZTsKICB0LkpvYW5uYSA9IHRydWU7CiAgdC5Lb3Jpbm5hID0gdHJ1ZTsKICB0LkxleGljb24gPSB0cnVlOwogIHQuTGliZXJhdGlvblNlcmlmID0gdHJ1ZTsKICB0WyJMaWJlcmF0aW9uIFNlcmlmIl0gPSB0cnVlOwogIHRbIkxpbnV4IExpYmVydGluZSJdID0gdHJ1ZTsKICB0LkxpdGVyYXR1cm5heWEgPSB0cnVlOwogIHQuTHVjaWRhID0gdHJ1ZTsKICB0WyJMdWNpZGEgQnJpZ2h0Il0gPSB0cnVlOwogIHQuTWVsaW9yID0gdHJ1ZTsKICB0Lk1lbXBoaXMgPSB0cnVlOwogIHQuTWlsbGVyID0gdHJ1ZTsKICB0Lk1pbmlvbiA9IHRydWU7CiAgdC5Nb2Rlcm4gPSB0cnVlOwogIHRbIk1vbmEgTGlzYSJdID0gdHJ1ZTsKICB0WyJNcnMgRWF2ZXMiXSA9IHRydWU7CiAgdFsiTVMgU2VyaWYiXSA9IHRydWU7CiAgdFsiTXVzZW8gU2xhYiJdID0gdHJ1ZTsKICB0WyJOZXcgWW9yayJdID0gdHJ1ZTsKICB0WyJOaW1idXMgUm9tYW4iXSA9IHRydWU7CiAgdFsiTlBTIFJhd2xpbnNvbiBSb2Fkd2F5Il0gPSB0cnVlOwogIHQuTnVwdGlhbFNjcmlwdCA9IHRydWU7CiAgdC5QYWxhdGlubyA9IHRydWU7CiAgdC5QZXJwZXR1YSA9IHRydWU7CiAgdC5QbGFudGluID0gdHJ1ZTsKICB0WyJQbGFudGluIFNjaG9vbGJvb2siXSA9IHRydWU7CiAgdC5QbGF5YmlsbCA9IHRydWU7CiAgdFsiUG9vciBSaWNoYXJkIl0gPSB0cnVlOwogIHRbIlJhd2xpbnNvbiBSb2Fkd2F5Il0gPSB0cnVlOwogIHQuUmVuYXVsdCA9IHRydWU7CiAgdC5SZXF1aWVtID0gdHJ1ZTsKICB0LlJvY2t3ZWxsID0gdHJ1ZTsKICB0LlJvbWFuID0gdHJ1ZTsKICB0WyJSb3RpcyBTZXJpZiJdID0gdHJ1ZTsKICB0LlNhYm9uID0gdHJ1ZTsKICB0LlNjYWxhID0gdHJ1ZTsKICB0LlNlYWd1bGwgPSB0cnVlOwogIHQuU2lzdGluYSA9IHRydWU7CiAgdC5Tb3V2ZW5pciA9IHRydWU7CiAgdC5TVElYID0gdHJ1ZTsKICB0WyJTdG9uZSBJbmZvcm1hbCJdID0gdHJ1ZTsKICB0WyJTdG9uZSBTZXJpZiJdID0gdHJ1ZTsKICB0LlN5bGZhZW4gPSB0cnVlOwogIHQuVGltZXMgPSB0cnVlOwogIHQuVHJhamFuID0gdHJ1ZTsKICB0WyJUcmluaXTDqSJdID0gdHJ1ZTsKICB0WyJUcnVtcCBNZWRpYWV2YWwiXSA9IHRydWU7CiAgdC5VdG9waWEgPSB0cnVlOwogIHRbIlZhbGUgVHlwZSJdID0gdHJ1ZTsKICB0WyJCaXRzdHJlYW0gVmVyYSJdID0gdHJ1ZTsKICB0WyJWZXJhIFNlcmlmIl0gPSB0cnVlOwogIHQuVmVyc2FpbGxlcyA9IHRydWU7CiAgdC5XYW50ZWQgPSB0cnVlOwogIHQuV2Vpc3MgPSB0cnVlOwogIHRbIldpZGUgTGF0aW4iXSA9IHRydWU7CiAgdC5XaW5kc29yID0gdHJ1ZTsKICB0LlhJVFMgPSB0cnVlOwp9KTsKY29uc3QgZ2V0U3ltYm9sc0ZvbnRzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5EaW5nYmF0cyA9IHRydWU7CiAgdC5TeW1ib2wgPSB0cnVlOw
20ogIHQuWmFwZkRpbmdiYXRzID0gdHJ1ZTsKICB0LldpbmdkaW5ncyA9IHRydWU7CiAgdFsiV2luZ2RpbmdzLUJvbGQiXSA9IHRydWU7CiAgdFsiV2luZ2RpbmdzLVJlZ3VsYXIiXSA9IHRydWU7Cn0pOwpjb25zdCBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WzJdID0gMTA7CiAgdFszXSA9IDMyOwogIHRbNF0gPSAzMzsKICB0WzVdID0gMzQ7CiAgdFs2XSA9IDM1OwogIHRbN10gPSAzNjsKICB0WzhdID0gMzc7CiAgdFs5XSA9IDM4OwogIHRbMTBdID0gMzk7CiAgdFsxMV0gPSA0MDsKICB0WzEyXSA9IDQxOwogIHRbMTNdID0gNDI7CiAgdFsxNF0gPSA0MzsKICB0WzE1XSA9IDQ0OwogIHRbMTZdID0gNDU7CiAgdFsxN10gPSA0NjsKICB0WzE4XSA9IDQ3OwogIHRbMTldID0gNDg7CiAgdFsyMF0gPSA0OTsKICB0WzIxXSA9IDUwOwogIHRbMjJdID0gNTE7CiAgdFsyM10gPSA1MjsKICB0WzI0XSA9IDUzOwogIHRbMjVdID0gNTQ7CiAgdFsyNl0gPSA1NTsKICB0WzI3XSA9IDU2OwogIHRbMjhdID0gNTc7CiAgdFsyOV0gPSA1ODsKICB0WzMwXSA9IDg5NDsKICB0WzMxXSA9IDYwOwogIHRbMzJdID0gNjE7CiAgdFszM10gPSA2MjsKICB0WzM0XSA9IDYzOwogIHRbMzVdID0gNjQ7CiAgdFszNl0gPSA2NTsKICB0WzM3XSA9IDY2OwogIHRbMzhdID0gNjc7CiAgdFszOV0gPSA2ODsKICB0WzQwXSA9IDY5OwogIHRbNDFdID0gNzA7CiAgdFs0Ml0gPSA3MTsKICB0WzQzXSA9IDcyOwogIHRbNDRdID0gNzM7CiAgdFs0NV0gPSA3NDsKICB0WzQ2XSA9IDc1OwogIHRbNDddID0gNzY7CiAgdFs0OF0gPSA3NzsKICB0WzQ5XSA9IDc4OwogIHRbNTBdID0gNzk7CiAgdFs1MV0gPSA4MDsKICB0WzUyXSA9IDgxOwogIHRbNTNdID0gODI7CiAgdFs1NF0gPSA4MzsKICB0WzU1XSA9IDg0OwogIHRbNTZdID0gODU7CiAgdFs1N10gPSA4NjsKICB0WzU4XSA9IDg3OwogIHRbNTldID0gODg7CiAgdFs2MF0gPSA4OTsKICB0WzYxXSA9IDkwOwogIHRbNjJdID0gOTE7CiAgdFs2M10gPSA5MjsKICB0WzY0XSA9IDkzOwogIHRbNjVdID0gOTQ7CiAgdFs2Nl0gPSA5NTsKICB0WzY3XSA9IDk2OwogIHRbNjhdID0gOTc7CiAgdFs2OV0gPSA5ODsKICB0WzcwXSA9IDk5OwogIHRbNzFdID0gMTAwOwogIHRbNzJdID0gMTAxOwogIHRbNzNdID0gMTAyOwogIHRbNzRdID0gMTAzOwogIHRbNzVdID0gMTA0OwogIHRbNzZdID0gMTA1OwogIHRbNzddID0gMTA2OwogIHRbNzhdID0gMTA3OwogIHRbNzldID0gMTA4OwogIHRbODBdID0gMTA5OwogIHRbODFdID0gMTEwOwogIHRbODJdID0gMTExOwogIHRbODNdID0gMTEyOwogIHRbODRdID0gMTEzOwogIHRbODVdID0gMTE0OwogIHRbODZdID0gMTE1OwogIHRbODddID0gMTE2OwogIHRbODhdID0gMTE3OwogIHRbODldID0gMTE4OwogIHRbOTBdID0gMTE5OwogIHRbOTFdID0gMTIwOwogIHRbOTJdID0gMTIxOwogIHRbOTNdID0gMTIyOwogIHRbOTRdID0gMTIzOwogIHRbOTVdID0gMTI0OwogIHRbOTZdID0gMTI1OwogIHRbOTddID0gMTI2OwogIHRbOThdID0gMTk2OwogIHRbOTldID0gMTk3OwogIHRbMTAwXSA9IDE5OTsKICB0WzEwMV0gPSAyMDE7CiAgdFsxMDJdID0gMjA5OwogIHRbMTAzXSA9IDIxNDsKICB0WzEwNF0gPSAyMjA7CiAgdFsxMDVdID0gMjI1OwogIHRbMTA2XSA9IDIyNDsKICB0WzEwN10gPSAyMjY7CiAgdFsxMDhdID0gMjI4OwogIHRbMTA5XSA9IDIyNzsKICB0WzExMF0gPSAyMjk7CiAgdFsxMTFdID0gMjMxOwogIHRbMTEyXSA9IDIzMzsKICB0WzExM10gPSAyMzI7CiAgdFsxMTRdID0gMjM0OwogIHRbMTE1XSA9IDIzNTsKICB0WzExNl0gPSAyMzc7CiAgdFsxMTddID0gMjM2OwogIHRbMTE4XSA9IDIzODsKICB0WzExOV0gPSAyMzk7CiAgdFsxMjBdID0gMjQxOwogIHRbMTIxXSA9IDI0MzsKICB0WzEyMl0gPSAyNDI7CiAgdFsxMjNdID0gMjQ0OwogIHRbMTI0XSA9IDI0NjsKICB0WzEyNV0gPSAyNDU7CiAgdFsxMjZdID0gMjUwOwogIHRbMTI3XSA9IDI0OTsKICB0WzEyOF0gPSAyNTE7CiAgdFsxMjldID0gMjUyOwogIHRbMTMwXSA9IDgyMjQ7CiAgdFsxMzFdID0gMTc2OwogIHRbMTMyXSA9IDE2MjsKICB0WzEzM10gPSAxNjM7CiAgdFsxMzRdID0gMTY3OwogIHRbMTM1XSA9IDgyMjY7CiAgdFsxMzZdID0gMTgyOwogIHRbMTM3XSA9IDIyMzsKICB0WzEzOF0gPSAxNzQ7CiAgdFsxMzldID0gMTY5OwogIHRbMTQwXSA9IDg0ODI7CiAgdFsxNDFdID0gMTgwOwogIHRbMTQyXSA9IDE2ODsKICB0WzE0M10gPSA4ODAwOwogIHRbMTQ0XSA9IDE5ODsKICB0WzE0NV0gPSAyMTY7CiAgdFsxNDZdID0gODczNDsKICB0WzE0N10gPSAxNzc7CiAgdFsxNDhdID0gODgwNDsKICB0WzE0OV0gPSA4ODA1OwogIHRbMTUwXSA9IDE2NTsKICB0WzE1MV0gPSAxODE7CiAgdFsxNTJdID0gODcwNjsKICB0WzE1M10gPSA4NzIxOwogIHRbMTU0XSA9IDg3MTk7CiAgdFsxNTZdID0gODc0NzsKICB0WzE1N10gPSAxNzA7CiAgdFsxNThdID0gMTg2OwogIHRbMTU5XSA9IDg0ODY7CiAgdFsxNjBdID0gMjMwOwogIHRbMTYxXSA9IDI0ODsKICB0WzE2Ml0gPSAxOTE7CiAgdFsxNjNdID0gMTYxOwogIHRbMTY0XSA9IDE3MjsKICB0WzE2NV0gPSA4NzMwOwogIHRbMTY2XSA9IDQwMjsKICB0WzE2N10gPSA4Nzc2OwogIHRbMTY4XSA9IDg3MTA7CiAgdFsxNjldID0gMTcxOwogIHRbMTcwXSA9IDE4NzsKICB0WzE3MV0gPSA4MjMwOwogIHRbMTc5XSA9IDgyMjA7CiAgdFsxODBdID0gODIyMTsKICB0WzE4MV0gPSA4MjE2OwogIHRbMTgyXSA9IDgyMTc7CiAgdFsyMDBdID0gMTkzOwogIHRbMjAzXSA9IDIwNTsKICB0WzIwN10gPSAyMTE7CiAgdFsyMTBdID0gMjE4OwogIHRbMjIzXSA9IDcxMTsKICB0WzIyNF0gPSAzMjE7CiAgdFsyMjVdID0gMzIyOwogIHRbMjI2XSA9IDM1MjsKICB0WzIyN10gPSAzNTM7CiAgdFsyMjhdID0gMzgxOwogIHRbMjI5XSA9IDM4MjsKICB0WzIzM10gPSAyMjE7CiAgdFsyMzRdID0gMjUzOwogIHRbMjUyXSA9IDI2MzsKICB0WzI1M10gPSAyNjg7CiAgdFsyNTRdID0gMjY5OwogIHRbMjU4XSA9IDI1ODsKICB0WzI2MF0gPSAyNjA7CiAgdFsyNjFdID0gMjYxOwogIHRbMjY1XSA9IDI4MDsKICB0WzI2Nl0gPSAyODE7CiAgdFsyNjddID0gMjgyOwogIHRbMjY4XSA9IDI4MzsKICB0WzI2OV0gPSAzMTM7CiAgdFsyNzVdID0gMzIzOwogIHRbMjc2XSA9IDMyNDsKICB0WzI3OF0gPSAzMjg7CiAgdFsyODNdID0gMzQ0OwogIHRbMjg0XSA9IDM0NTsKICB0WzI4NV0gPSAzNDY7CiAgdFsyODZdID0gMzQ3OwogIHRbMjkyXSA9IDM2NzsKICB0WzI5NV0gPSAzNzc7CiAgdFsyOTZdID0gMzc4OwogIHRbMjk4XSA9IDM4MDsKICB0WzMwNV0gPSA5NjM7CiAgdFszMDZdID0gOTY0OwogIHRbMzA3XSA9IDk2NjsKICB0WzMwOF0gPSA4MjE1OwogIHRbMzA5XSA9IDgyNTI7CiAgdFszMTBd
20ID0gODMxOTsKICB0WzMxMV0gPSA4MzU5OwogIHRbMzEyXSA9IDg1OTI7CiAgdFszMTNdID0gODU5MzsKICB0WzMzN10gPSA5NTUyOwogIHRbNDkzXSA9IDEwMzk7CiAgdFs0OTRdID0gMTA0MDsKICB0WzY3Ml0gPSAxNDg4OwogIHRbNjczXSA9IDE0ODk7CiAgdFs2NzRdID0gMTQ5MDsKICB0WzY3NV0gPSAxNDkxOwogIHRbNjc2XSA9IDE0OTI7CiAgdFs2NzddID0gMTQ5MzsKICB0WzY3OF0gPSAxNDk0OwogIHRbNjc5XSA9IDE0OTU7CiAgdFs2ODBdID0gMTQ5NjsKICB0WzY4MV0gPSAxNDk3OwogIHRbNjgyXSA9IDE0OTg7CiAgdFs2ODNdID0gMTQ5OTsKICB0WzY4NF0gPSAxNTAwOwogIHRbNjg1XSA9IDE1MDE7CiAgdFs2ODZdID0gMTUwMjsKICB0WzY4N10gPSAxNTAzOwogIHRbNjg4XSA9IDE1MDQ7CiAgdFs2ODldID0gMTUwNTsKICB0WzY5MF0gPSAxNTA2OwogIHRbNjkxXSA9IDE1MDc7CiAgdFs2OTJdID0gMTUwODsKICB0WzY5M10gPSAxNTA5OwogIHRbNjk0XSA9IDE1MTA7CiAgdFs2OTVdID0gMTUxMTsKICB0WzY5Nl0gPSAxNTEyOwogIHRbNjk3XSA9IDE1MTM7CiAgdFs2OThdID0gMTUxNDsKICB0WzcwNV0gPSAxNTI0OwogIHRbNzA2XSA9IDgzNjI7CiAgdFs3MTBdID0gNjQyODg7CiAgdFs3MTFdID0gNjQyOTg7CiAgdFs3NTldID0gMTYxNzsKICB0Wzc2MV0gPSAxNzc2OwogIHRbNzYzXSA9IDE3Nzg7CiAgdFs3NzVdID0gMTY1MjsKICB0Wzc3N10gPSAxNzY0OwogIHRbNzc4XSA9IDE3ODA7CiAgdFs3NzldID0gMTc4MTsKICB0Wzc4MF0gPSAxNzgyOwogIHRbNzgyXSA9IDc3MTsKICB0Wzc4M10gPSA2NDcyNjsKICB0Wzc4Nl0gPSA4MzYzOwogIHRbNzg4XSA9IDg1MzI7CiAgdFs3OTBdID0gNzY4OwogIHRbNzkxXSA9IDc2OTsKICB0Wzc5Ml0gPSA3Njg7CiAgdFs3OTVdID0gODAzOwogIHRbNzk3XSA9IDY0MzM2OwogIHRbNzk4XSA9IDY0MzM3OwogIHRbNzk5XSA9IDY0MzQyOwogIHRbODAwXSA9IDY0MzQzOwogIHRbODAxXSA9IDY0MzQ0OwogIHRbODAyXSA9IDY0MzQ1OwogIHRbODAzXSA9IDY0MzYyOwogIHRbODA0XSA9IDY0MzYzOwogIHRbODA1XSA9IDY0MzY0OwogIHRbMjQyNF0gPSA3ODIxOwogIHRbMjQyNV0gPSA3ODIyOwogIHRbMjQyNl0gPSA3ODIzOwogIHRbMjQyN10gPSA3ODI0OwogIHRbMjQyOF0gPSA3ODI1OwogIHRbMjQyOV0gPSA3ODI2OwogIHRbMjQzMF0gPSA3ODI3OwogIHRbMjQzM10gPSA3NjgyOwogIHRbMjY3OF0gPSA4MDQ1OwogIHRbMjY3OV0gPSA4MDQ2OwogIHRbMjgzMF0gPSAxNTUyOwogIHRbMjgzOF0gPSA2ODY7CiAgdFsyODQwXSA9IDc1MTsKICB0WzI4NDJdID0gNzUzOwogIHRbMjg0M10gPSA3NTQ7CiAgdFsyODQ0XSA9IDc1NTsKICB0WzI4NDZdID0gNzU3OwogIHRbMjg1Nl0gPSA3Njc7CiAgdFsyODU3XSA9IDg0ODsKICB0WzI4NThdID0gODQ5OwogIHRbMjg2Ml0gPSA4NTM7CiAgdFsyODYzXSA9IDg1NDsKICB0WzI4NjRdID0gODU1OwogIHRbMjg2NV0gPSA4NjE7CiAgdFsyODY2XSA9IDg2MjsKICB0WzI5MDZdID0gNzQ2MDsKICB0WzI5MDhdID0gNzQ2MjsKICB0WzI5MDldID0gNzQ2MzsKICB0WzI5MTBdID0gNzQ2NDsKICB0WzI5MTJdID0gNzQ2NjsKICB0WzI5MTNdID0gNzQ2NzsKICB0WzI5MTRdID0gNzQ2ODsKICB0WzI5MTZdID0gNzQ3MDsKICB0WzI5MTddID0gNzQ3MTsKICB0WzI5MThdID0gNzQ3MjsKICB0WzI5MjBdID0gNzQ3NDsKICB0WzI5MjFdID0gNzQ3NTsKICB0WzI5MjJdID0gNzQ3NjsKICB0WzI5MjRdID0gNzQ3ODsKICB0WzI5MjVdID0gNzQ3OTsKICB0WzI5MjZdID0gNzQ4MDsKICB0WzI5MjhdID0gNzQ4MjsKICB0WzI5MjldID0gNzQ4MzsKICB0WzI5MzBdID0gNzQ4NDsKICB0WzI5MzJdID0gNzQ4NjsKICB0WzI5MzNdID0gNzQ4NzsKICB0WzI5MzRdID0gNzQ4ODsKICB0WzI5MzZdID0gNzQ5MDsKICB0WzI5MzddID0gNzQ5MTsKICB0WzI5MzhdID0gNzQ5MjsKICB0WzI5NDBdID0gNzQ5NDsKICB0WzI5NDFdID0gNzQ5NTsKICB0WzI5NDJdID0gNzQ5NjsKICB0WzI5NDRdID0gNzQ5ODsKICB0WzI5NDZdID0gNzUwMDsKICB0WzI5NDhdID0gNzUwMjsKICB0WzI5NTBdID0gNzUwNDsKICB0WzI5NTFdID0gNzUwNTsKICB0WzI5NTJdID0gNzUwNjsKICB0WzI5NTRdID0gNzUwODsKICB0WzI5NTVdID0gNzUwOTsKICB0WzI5NTZdID0gNzUxMDsKICB0WzI5NThdID0gNzUxMjsKICB0WzI5NTldID0gNzUxMzsKICB0WzI5NjBdID0gNzUxNDsKICB0WzI5NjJdID0gNzUxNjsKICB0WzI5NjNdID0gNzUxNzsKICB0WzI5NjRdID0gNzUxODsKICB0WzI5NjZdID0gNzUyMDsKICB0WzI5NjddID0gNzUyMTsKICB0WzI5NjhdID0gNzUyMjsKICB0WzI5NzBdID0gNzUyNDsKICB0WzI5NzFdID0gNzUyNTsKICB0WzI5NzJdID0gNzUyNjsKICB0WzI5NzRdID0gNzUyODsKICB0WzI5NzVdID0gNzUyOTsKICB0WzI5NzZdID0gNzUzMDsKICB0WzI5NzhdID0gMTUzNzsKICB0WzI5NzldID0gMTUzODsKICB0WzI5ODBdID0gMTUzOTsKICB0WzI5ODJdID0gMTU0OTsKICB0WzI5ODNdID0gMTU1MTsKICB0WzI5ODRdID0gMTU1MjsKICB0WzI5ODZdID0gMTU1NDsKICB0WzI5ODddID0gMTU1NTsKICB0WzI5ODhdID0gMTU1NjsKICB0WzI5OTBdID0gMTYyMzsKICB0WzI5OTFdID0gMTYyNDsKICB0WzI5OTVdID0gMTc3NTsKICB0WzI5OTldID0gMTc5MTsKICB0WzMwMDJdID0gNjQyOTA7CiAgdFszMDAzXSA9IDY0MjkxOwogIHRbMzAwNF0gPSA2NDI5MjsKICB0WzMwMDZdID0gNjQyOTQ7CiAgdFszMDA3XSA9IDY0Mjk1OwogIHRbMzAwOF0gPSA2NDI5NjsKICB0WzMwMTFdID0gMTkwMDsKICB0WzMwMTRdID0gODIyMzsKICB0WzMwMTVdID0gODI0NDsKICB0WzMwMTddID0gNzUzMjsKICB0WzMwMThdID0gNzUzMzsKICB0WzMwMTldID0gNzUzNDsKICB0WzMwNzVdID0gNzU5MDsKICB0WzMwNzZdID0gNzU5MTsKICB0WzMwNzldID0gNzU5NDsKICB0WzMwODBdID0gNzU5NTsKICB0WzMwODNdID0gNzU5ODsKICB0WzMwODRdID0gNzU5OTsKICB0WzMwODddID0gNzYwMjsKICB0WzMwODhdID0gNzYwMzsKICB0WzMwOTFdID0gNzYwNjsKICB0WzMwOTJdID0gNzYwNzsKICB0WzMwOTVdID0gNzYxMDsKICB0WzMwOTZdID0gNzYxMTsKICB0WzMwOTldID0gNzYxNDsKICB0WzMxMDBdID0gNzYxNTsKICB0WzMxMDNdID0gNzYxODsKICB0WzMxMDRdID0gNzYxOTsKICB0WzMxMDd
20dID0gODMzNzsKICB0WzMxMDhdID0gODMzODsKICB0WzMxMTZdID0gMTg4NDsKICB0WzMxMTldID0gMTg4NTsKICB0WzMxMjBdID0gMTg4NTsKICB0WzMxMjNdID0gMTg4NjsKICB0WzMxMjRdID0gMTg4NjsKICB0WzMxMjddID0gMTg4NzsKICB0WzMxMjhdID0gMTg4NzsKICB0WzMxMzFdID0gMTg4ODsKICB0WzMxMzJdID0gMTg4ODsKICB0WzMxMzVdID0gMTg4OTsKICB0WzMxMzZdID0gMTg4OTsKICB0WzMxMzldID0gMTg5MDsKICB0WzMxNDBdID0gMTg5MDsKICB0WzMxNDNdID0gMTg5MTsKICB0WzMxNDRdID0gMTg5MTsKICB0WzMxNDddID0gMTg5MjsKICB0WzMxNDhdID0gMTg5MjsKICB0WzMxNTNdID0gNTgwOwogIHRbMzE1NF0gPSA1ODE7CiAgdFszMTU3XSA9IDU4NDsKICB0WzMxNThdID0gNTg1OwogIHRbMzE2MV0gPSA1ODg7CiAgdFszMTYyXSA9IDU4OTsKICB0WzMxNjVdID0gODkxOwogIHRbMzE2Nl0gPSA4OTI7CiAgdFszMTY5XSA9IDEyNzQ7CiAgdFszMTcwXSA9IDEyNzU7CiAgdFszMTczXSA9IDEyNzg7CiAgdFszMTc0XSA9IDEyNzk7CiAgdFszMTgxXSA9IDc2MjI7CiAgdFszMTgyXSA9IDc2MjM7CiAgdFszMjgyXSA9IDExNzk5OwogIHRbMzMxNl0gPSA1Nzg7CiAgdFszMzc5XSA9IDQyNzg1OwogIHRbMzM5M10gPSAxMTU5OwogIHRbMzQxNl0gPSA4Mzc3Owp9KTsKY29uc3QgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdFsyMjddID0gMzIyOwogIHRbMjY0XSA9IDI2MTsKICB0WzI5MV0gPSAzNDY7Cn0pOwpjb25zdCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WzFdID0gMzI7CiAgdFs0XSA9IDY1OwogIHRbNV0gPSAxOTI7CiAgdFs2XSA9IDE5MzsKICB0WzldID0gMTk2OwogIHRbMTddID0gNjY7CiAgdFsxOF0gPSA2NzsKICB0WzIxXSA9IDI2ODsKICB0WzI0XSA9IDY4OwogIHRbMjhdID0gNjk7CiAgdFsyOV0gPSAyMDA7CiAgdFszMF0gPSAyMDE7CiAgdFszMl0gPSAyODI7CiAgdFszOF0gPSA3MDsKICB0WzM5XSA9IDcxOwogIHRbNDRdID0gNzI7CiAgdFs0N10gPSA3MzsKICB0WzQ4XSA9IDIwNDsKICB0WzQ5XSA9IDIwNTsKICB0WzU4XSA9IDc0OwogIHRbNjBdID0gNzU7CiAgdFs2Ml0gPSA3NjsKICB0WzY4XSA9IDc3OwogIHRbNjldID0gNzg7CiAgdFs3NV0gPSA3OTsKICB0Wzc2XSA9IDIxMDsKICB0WzgwXSA9IDIxNDsKICB0Wzg3XSA9IDgwOwogIHRbODldID0gODE7CiAgdFs5MF0gPSA4MjsKICB0WzkyXSA9IDM0NDsKICB0Wzk0XSA9IDgzOwogIHRbOTddID0gMzUyOwogIHRbMTAwXSA9IDg0OwogIHRbMTA0XSA9IDg1OwogIHRbMTA5XSA9IDIyMDsKICB0WzExNV0gPSA4NjsKICB0WzExNl0gPSA4NzsKICB0WzEyMV0gPSA4ODsKICB0WzEyMl0gPSA4OTsKICB0WzEyNF0gPSAyMjE7CiAgdFsxMjddID0gOTA7CiAgdFsxMjldID0gMzgxOwogIHRbMjU4XSA9IDk3OwogIHRbMjU5XSA9IDIyNDsKICB0WzI2MF0gPSAyMjU7CiAgdFsyNjNdID0gMjI4OwogIHRbMjY4XSA9IDI2MTsKICB0WzI3MV0gPSA5ODsKICB0WzI3Ml0gPSA5OTsKICB0WzI3M10gPSAyNjM7CiAgdFsyNzVdID0gMjY5OwogIHRbMjgyXSA9IDEwMDsKICB0WzI4Nl0gPSAxMDE7CiAgdFsyODddID0gMjMyOwogIHRbMjg4XSA9IDIzMzsKICB0WzI5MF0gPSAyODM7CiAgdFsyOTVdID0gMjgxOwogIHRbMjk2XSA9IDEwMjsKICB0WzMzNl0gPSAxMDM7CiAgdFszNDZdID0gMTA0OwogIHRbMzQ5XSA9IDEwNTsKICB0WzM1MF0gPSAyMzY7CiAgdFszNTFdID0gMjM3OwogIHRbMzYxXSA9IDEwNjsKICB0WzM2NF0gPSAxMDc7CiAgdFszNjddID0gMTA4OwogIHRbMzcxXSA9IDMyMjsKICB0WzM3M10gPSAxMDk7CiAgdFszNzRdID0gMTEwOwogIHRbMzgxXSA9IDExMTsKICB0WzM4Ml0gPSAyNDI7CiAgdFszODNdID0gMjQzOwogIHRbMzg2XSA9IDI0NjsKICB0WzM5M10gPSAxMTI7CiAgdFszOTVdID0gMTEzOwogIHRbMzk2XSA9IDExNDsKICB0WzM5OF0gPSAzNDU7CiAgdFs0MDBdID0gMTE1OwogIHRbNDAxXSA9IDM0NzsKICB0WzQwM10gPSAzNTM7CiAgdFs0MTBdID0gMTE2OwogIHRbNDM3XSA9IDExNzsKICB0WzQ0Ml0gPSAyNTI7CiAgdFs0NDhdID0gMTE4OwogIHRbNDQ5XSA9IDExOTsKICB0WzQ1NF0gPSAxMjA7CiAgdFs0NTVdID0gMTIxOwogIHRbNDU3XSA9IDI1MzsKICB0WzQ2MF0gPSAxMjI7CiAgdFs0NjJdID0gMzgyOwogIHRbNDYzXSA9IDM4MDsKICB0Wzg1M10gPSA0NDsKICB0Wzg1NV0gPSA1ODsKICB0Wzg1Nl0gPSA0NjsKICB0Wzg3Nl0gPSA0NzsKICB0Wzg3OF0gPSA0NTsKICB0Wzg4Ml0gPSA0NTsKICB0Wzg5NF0gPSA0MDsKICB0Wzg5NV0gPSA0MTsKICB0Wzg5Nl0gPSA5MTsKICB0Wzg5N10gPSA5MzsKICB0WzkyM10gPSA2NDsKICB0WzEwMDRdID0gNDg7CiAgdFsxMDA1XSA9IDQ5OwogIHRbMTAwNl0gPSA1MDsKICB0WzEwMDddID0gNTE7CiAgdFsxMDA4XSA9IDUyOwogIHRbMTAwOV0gPSA1MzsKICB0WzEwMTBdID0gNTQ7CiAgdFsxMDExXSA9IDU1OwogIHRbMTAxMl0gPSA1NjsKICB0WzEwMTNdID0gNTc7CiAgdFsxMDgxXSA9IDM3OwogIHRbMTA4NV0gPSA0MzsKICB0WzEwODZdID0gN
20DU7Cn0pOwpmdW5jdGlvbiBnZXRTdGFuZGFyZEZvbnROYW1lKG5hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIGNvbnN0IHN0ZEZvbnRNYXAgPSBnZXRTdGRGb250TWFwKCk7CiAgcmV0dXJuIHN0ZEZvbnRNYXBbZm9udE5hbWVdOwp9CmZ1bmN0aW9uIGlzS25vd25Gb250TmFtZShuYW1lKSB7CiAgY29uc3QgZm9udE5hbWUgPSBub3JtYWxpemVGb250TmFtZShuYW1lKTsKICByZXR1cm4gISEoZ2V0U3RkRm9udE1hcCgpW2ZvbnROYW1lXSB8fCBnZXROb25TdGRGb250TWFwKClbZm9udE5hbWVdIHx8IGdldFNlcmlmRm9udHMoKVtmb250TmFtZV0gfHwgZ2V0U3ltYm9sc0ZvbnRzKClbZm9udE5hbWVdKTsKfQoKOy8vIC4vc3JjL2NvcmUvdG9fdW5pY29kZV9tYXAuanMKCmNsYXNzIFRvVW5pY29kZU1hcCB7CiAgY29uc3RydWN0b3IoY21hcCA9IFtdKSB7CiAgICB0aGlzLl9tYXAgPSBjbWFwOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuX21hcC5sZW5ndGg7CiAgfQogIGZvckVhY2goY2FsbGJhY2spIHsKICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gdGhpcy5fbWFwKSB7CiAgICAgIGNhbGxiYWNrKGNoYXJDb2RlLCB0aGlzLl9tYXBbY2hhckNvZGVdLmNvZGVQb2ludEF0KDApKTsKICAgIH0KICB9CiAgaGFzKGkpIHsKICAgIHJldHVybiB0aGlzLl9tYXBbaV0gIT09IHVuZGVmaW5lZDsKICB9CiAgZ2V0KGkpIHsKICAgIHJldHVybiB0aGlzLl9tYXBbaV07CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgcmV0dXJuIG1hcC5pbmRleE9mKHZhbHVlKTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIGlmIChtYXBbY2hhckNvZGVdID09PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgYW1lbmQobWFwKSB7CiAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgewogICAgICB0aGlzLl9tYXBbY2hhckNvZGVdID0gbWFwW2NoYXJDb2RlXTsKICAgIH0KICB9Cn0KY2xhc3MgSWRlbnRpdHlUb1VuaWNvZGVNYXAgewogIGNvbnN0cnVjdG9yKGZpcnN0Q2hhciwgbGFzdENoYXIpIHsKICAgIHRoaXMuZmlyc3RDaGFyID0gZmlyc3RDaGFyOwogICAgdGhpcy5sYXN0Q2hhciA9IGxhc3RDaGFyOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMubGFzdENoYXIgKyAxIC0gdGhpcy5maXJzdENoYXI7CiAgfQogIGZvckVhY2goY2FsbGJhY2spIHsKICAgIGZvciAobGV0IGkgPSB0aGlzLmZpcnN0Q2hhciwgaWkgPSB0aGlzLmxhc3RDaGFyOyBpIDw9IGlpOyBpKyspIHsKICAgICAgY2FsbGJhY2soaSwgaSk7CiAgICB9CiAgfQogIGhhcyhpKSB7CiAgICByZXR1cm4gdGhpcy5maXJzdENoYXIgPD0gaSAmJiBpIDw9IHRoaXMubGFzdENoYXI7CiAgfQogIGdldChpKSB7CiAgICBpZiAodGhpcy5maXJzdENoYXIgPD0gaSAmJiBpIDw9IHRoaXMubGFzdENoYXIpIHsKICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBjaGFyQ29kZU9mKHYpIHsKICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHYpICYmIHYgPj0gdGhpcy5maXJzdENoYXIgJiYgdiA8PSB0aGlzLmxhc3RDaGFyID8gdiA6IC0xOwogIH0KICBhbWVuZChtYXApIHsKICAgIHVucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgYW1lbmQoKSIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2ZmX2ZvbnQuanMKCgoKY2xhc3MgQ0ZGRm9udCB7CiAgY29uc3RydWN0b3IoZmlsZSwgcHJvcGVydGllcykgewogICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBDRkZQYXJzZXIoZmlsZSwgcHJvcGVydGllcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIHRoaXMuY2ZmID0gcGFyc2VyLnBhcnNlKCk7CiAgICB0aGlzLmNmZi5kdXBsaWNhdGVGaXJzdEdseXBoKCk7CiAgICBjb25zdCBjb21waWxlciA9IG5ldyBDRkZDb21waWxlcih0aGlzLmNmZik7CiAgICB0aGlzLnNlYWNzID0gdGhpcy5jZmYuc2VhY3M7CiAgICB0cnkgewogICAgICB0aGlzLmRhdGEgPSBjb21waWxlci5jb21waWxlKCk7CiAgICB9IGNhdGNoIHsKICAgICAgd2FybigiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiICsgcHJvcGVydGllcy5sb2FkZWROYW1lKTsKICAgICAgdGhpcy5kYXRhID0gZmlsZTsKICAgIH0KICAgIHRoaXMuX2NyZWF0ZUJ1aWx0SW5FbmNvZGluZygpOwogIH0KICBnZXQgbnVtR2x5cGhzKCkgewogICAgcmV0dXJuIHRoaXMuY2ZmLmNoYXJTdHJpbmdzLmNvdW50OwogIH0KICBnZXRDaGFyc2V0KCkgewogICAgcmV0dXJuIHRoaXMuY2ZmLmNoYXJzZXQuY2hhcnNldDsKICB9CiAgZ2V0R2x5cGhNYXBwaW5nKCkgewogICAgY29uc3QgY2ZmID0gdGhpcy5jZmY7CiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzOwogICAgY29uc3QgewogICAgICBjaWRUb0dpZE1hcCwKICAgICAgY01hcAogICAgfSA9IHByb3BlcnRpZXM7CiAgICBjb25zdCBjaGFyc2V0cyA9IGNmZi5jaGFyc2V0LmNoYXJzZXQ7CiAgICBsZXQgY2hhckNvZGVUb0dseXBoSWQ7CiAgICBsZXQgZ2x5cGhJZDsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBsZXQgaW52Q2lkVG9HaWRNYXA7CiAgICAgIGlmIChjaWRUb0dpZE1hcD8ubGVuZ3RoID4gMCkgewogICAgICAgIGludkNpZFRvR2lkTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaWRUb0dpZE1hcC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICBjb25zdCBnaWQgPSBjaWRUb0dpZE1hcFtpXTsKICAgICAgICAgIGlmIChnaWQgIT09I
20HVuZGVmaW5lZCkgewogICAgICAgICAgICBpbnZDaWRUb0dpZE1hcFtnaWRdID0gaTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBsZXQgY2hhckNvZGU7CiAgICAgIGlmIChjZmYuaXNDSURGb250KSB7CiAgICAgICAgZm9yIChnbHlwaElkID0gMDsgZ2x5cGhJZCA8IGNoYXJzZXRzLmxlbmd0aDsgZ2x5cGhJZCsrKSB7CiAgICAgICAgICBjb25zdCBjaWQgPSBjaGFyc2V0c1tnbHlwaElkXTsKICAgICAgICAgIGNoYXJDb2RlID0gY01hcC5jaGFyQ29kZU9mKGNpZCk7CiAgICAgICAgICBpZiAoaW52Q2lkVG9HaWRNYXA/LltjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjaGFyQ29kZSA9IGludkNpZFRvR2lkTWFwW2NoYXJDb2RlXTsKICAgICAgICAgIH0KICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoZ2x5cGhJZCA9IDA7IGdseXBoSWQgPCBjZmYuY2hhclN0cmluZ3MuY291bnQ7IGdseXBoSWQrKykgewogICAgICAgICAgY2hhckNvZGUgPSBjTWFwLmNoYXJDb2RlT2YoZ2x5cGhJZCk7CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CiAgICB9CiAgICBsZXQgZW5jb2RpbmcgPSBjZmYuZW5jb2RpbmcgPyBjZmYuZW5jb2RpbmcuZW5jb2RpbmcgOiBudWxsOwogICAgaWYgKHByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQpIHsKICAgICAgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKICAgIH0KICAgIGNoYXJDb2RlVG9HbHlwaElkID0gdHlwZTFGb250R2x5cGhNYXBwaW5nKHByb3BlcnRpZXMsIGVuY29kaW5nLCBjaGFyc2V0cyk7CiAgICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7CiAgfQogIGhhc0dseXBoSWQoaWQpIHsKICAgIHJldHVybiB0aGlzLmNmZi5oYXNHbHlwaElkKGlkKTsKICB9CiAgX2NyZWF0ZUJ1aWx0SW5FbmNvZGluZygpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhcnNldCwKICAgICAgZW5jb2RpbmcKICAgIH0gPSB0aGlzLmNmZjsKICAgIGlmICghY2hhcnNldCB8fCAhZW5jb2RpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY2hhcnNldHMgPSBjaGFyc2V0LmNoYXJzZXQsCiAgICAgIGVuY29kaW5ncyA9IGVuY29kaW5nLmVuY29kaW5nOwogICAgY29uc3QgbWFwID0gW107CiAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGVuY29kaW5ncykgewogICAgICBjb25zdCBnbHlwaElkID0gZW5jb2RpbmdzW2NoYXJDb2RlXTsKICAgICAgaWYgKGdseXBoSWQgPj0gMCkgewogICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGNoYXJzZXRzW2dseXBoSWRdOwogICAgICAgIGlmIChnbHlwaE5hbWUpIHsKICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBnbHlwaE5hbWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWFwLmxlbmd0aCA+IDApIHsKICAgICAgdGhpcy5wcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZyA9IG1hcDsKICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2ZvbnRfcmVuZGVyZXIuanMKCgoKCgoKCgoKCgoKCgpmdW5jdGlvbiBnZXRVaW50MzIoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXSkgPj4+IDA7Cn0KZnVuY3Rpb24gZ2V0VWludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07Cn0KZnVuY3Rpb24gZ2V0SW50MTYoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2KSA+PiAxNjsKfQpmdW5jdGlvbiBnZXRJbnQ4KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgPj4gMjQ7Cn0KZnVuY3Rpb24gZ2V0RmxvYXQyMTQoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIGdldEludDE2KGRhdGEsIG9mZnNldCkgLyAxNjM4NDsKfQpmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgewogIGNvbnN0IG51bVN1YnJzID0gc3VicnMubGVuZ3RoOwogIGxldCBiaWFzID0gMzI3Njg7CiAgaWYgKG51bVN1YnJzIDwgMTI0MCkgewogICAgYmlhcyA9IDEwNzsKICB9IGVsc2UgaWYgKG51bVN1YnJzIDwgMzM5MDApIHsKICAgIGJpYXMgPSAxMTMxOwogIH0KICByZXR1cm4gYmlhczsKfQpmdW5jdGlvbiBwYXJzZUNtYXAoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IG9mZnNldCA9IGdldFVpbnQxNihkYXRhLCBzdGFydCArIDIpID09PSAxID8gZ2V0VWludDMyKGRhdGEsIHN0YXJ0ICsgOCkgOiBnZXRVaW50MzIoZGF0YSwgc3RhcnQgKyAxNik7CiAgY29uc3QgZm9ybWF0ID0gZ2V0VWludDE2KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0KTsKICBsZXQgcmFuZ2VzLCBwLCBpOwogIGlmIChmb3JtYXQgPT09IDQpIHsKICAgIGdldFVpbnQxNihkYXRhLCBzdGFydCArIG9mZnNldCArIDIpOwogICAgY29uc3Qgc2VnQ291bnQgPSBnZXRVaW50MTYoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA2KSA+PiAxOwogICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTQ7CiAgICByYW5nZXMgPSBbXTsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldID0gewogICAgICAgIGVuZDogZ2V0VWludDE2KGRhdGEsIHApCiAgICAgIH07CiAgICB9CiAgICBwICs9IDI7CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIHJhbmdlc1tpXS5zdGFydCA9IGdldFVpbnQxNihkYXRhLCBwKTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldLmlkRGVsdGEgPSBnZXRVaW50MTYoZGF0YSwgcCk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIGxldCBpZE9mZnNldCA9IGdldFVpbnQxNihkYXRhLCBwKTsKICAgICAgaWYgKGlkT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgI
20H0KICAgICAgcmFuZ2VzW2ldLmlkcyA9IFtdOwogICAgICBmb3IgKGxldCBqID0gMCwgamogPSByYW5nZXNbaV0uZW5kIC0gcmFuZ2VzW2ldLnN0YXJ0ICsgMTsgaiA8IGpqOyBqKyspIHsKICAgICAgICByYW5nZXNbaV0uaWRzW2pdID0gZ2V0VWludDE2KGRhdGEsIHAgKyBpZE9mZnNldCk7CiAgICAgICAgaWRPZmZzZXQgKz0gMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMTIpIHsKICAgIGNvbnN0IGdyb3VwcyA9IGdldFVpbnQzMihkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTsKICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2OwogICAgcmFuZ2VzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHsKICAgICAgc3RhcnQgPSBnZXRVaW50MzIoZGF0YSwgcCk7CiAgICAgIHJhbmdlcy5wdXNoKHsKICAgICAgICBzdGFydCwKICAgICAgICBlbmQ6IGdldFVpbnQzMihkYXRhLCBwICsgNCksCiAgICAgICAgaWREZWx0YTogZ2V0VWludDMyKGRhdGEsIHAgKyA4KSAtIHN0YXJ0CiAgICAgIH0pOwogICAgICBwICs9IDEyOwogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9CiAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bnN1cHBvcnRlZCBjbWFwOiAke2Zvcm1hdH1gKTsKfQpmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogIGNvbnN0IHBhcnNlciA9IG5ldyBDRkZQYXJzZXIobmV3IFN0cmVhbShkYXRhLCBzdGFydCwgZW5kIC0gc3RhcnQpLCBwcm9wZXJ0aWVzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICBjb25zdCBjZmYgPSBwYXJzZXIucGFyc2UoKTsKICByZXR1cm4gewogICAgZ2x5cGhzOiBjZmYuY2hhclN0cmluZ3Mub2JqZWN0cywKICAgIHN1YnJzOiBjZmYudG9wRGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleD8ub2JqZWN0cywKICAgIGdzdWJyczogY2ZmLmdsb2JhbFN1YnJJbmRleD8ub2JqZWN0cywKICAgIGlzQ0ZGQ0lERm9udDogY2ZmLmlzQ0lERm9udCwKICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCiAgICBmZEFycmF5OiBjZmYuZmRBcnJheQogIH07Cn0KZnVuY3Rpb24gcGFyc2VHbHlmVGFibGUoZ2x5ZiwgbG9jYSwgaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICBsZXQgaXRlbVNpemUsIGl0ZW1EZWNvZGU7CiAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CiAgICBpdGVtU2l6ZSA9IDQ7CiAgICBpdGVtRGVjb2RlID0gZ2V0VWludDMyOwogIH0gZWxzZSB7CiAgICBpdGVtU2l6ZSA9IDI7CiAgICBpdGVtRGVjb2RlID0gKGRhdGEsIG9mZnNldCkgPT4gMiAqIGdldFVpbnQxNihkYXRhLCBvZmZzZXQpOwogIH0KICBjb25zdCBnbHlwaHMgPSBbXTsKICBsZXQgc3RhcnRPZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2EsIDApOwogIGZvciAobGV0IGogPSBpdGVtU2l6ZTsgaiA8IGxvY2EubGVuZ3RoOyBqICs9IGl0ZW1TaXplKSB7CiAgICBjb25zdCBlbmRPZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2EsIGopOwogICAgZ2x5cGhzLnB1c2goZ2x5Zi5zdWJhcnJheShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KSk7CiAgICBzdGFydE9mZnNldCA9IGVuZE9mZnNldDsKICB9CiAgcmV0dXJuIGdseXBoczsKfQpmdW5jdGlvbiBsb29rdXBDbWFwKHJhbmdlcywgdW5pY29kZSkgewogIGNvbnN0IGNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApOwogIGxldCBnaWQgPSAwLAogICAgbCA9IDAsCiAgICByID0gcmFuZ2VzLmxlbmd0aCAtIDE7CiAgd2hpbGUgKGwgPCByKSB7CiAgICBjb25zdCBjID0gbCArIHIgKyAxID4+IDE7CiAgICBpZiAoY29kZSA8IHJhbmdlc1tjXS5zdGFydCkgewogICAgICByID0gYyAtIDE7CiAgICB9IGVsc2UgewogICAgICBsID0gYzsKICAgIH0KICB9CiAgaWYgKHJhbmdlc1tsXS5zdGFydCA8PSBjb2RlICYmIGNvZGUgPD0gcmFuZ2VzW2xdLmVuZCkgewogICAgZ2lkID0gcmFuZ2VzW2xdLmlkRGVsdGEgKyAocmFuZ2VzW2xdLmlkcyA/IHJhbmdlc1tsXS5pZHNbY29kZSAtIHJhbmdlc1tsXS5zdGFydF0gOiBjb2RlKSAmIDB4ZmZmZjsKICB9CiAgcmV0dXJuIHsKICAgIGNoYXJDb2RlOiBjb2RlLAogICAgZ2x5cGhJZDogZ2lkCiAgfTsKfQpmdW5jdGlvbiBjb21waWxlR2x5Zihjb2RlLCBjbWRzLCBmb250KSB7CiAgZnVuY3Rpb24gbW92ZVRvKHgsIHkpIHsKICAgIGNtZHMuYWRkKCJNIiwgW3gsIHldKTsKICB9CiAgZnVuY3Rpb24gbGluZVRvKHgsIHkpIHsKICAgIGNtZHMuYWRkKCJMIiwgW3gsIHldKTsKICB9CiAgZnVuY3Rpb24gcXVhZHJhdGljQ3VydmVUbyh4YSwgeWEsIHgsIHkpIHsKICAgIGNtZHMuYWRkKCJRIiwgW3hhLCB5YSwgeCwgeV0pOwogIH0KICBsZXQgaSA9IDA7CiAgY29uc3QgbnVtYmVyT2ZDb250b3VycyA9IGdldEludDE2KGNvZGUsIGkpOwogIGxldCBmbGFnczsKICBsZXQgeCA9IDAsCiAgICB5ID0gMDsKICBpICs9IDEwOwogIGlmIChudW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgZG8gewogICAgICBmbGFncyA9IGdldFVpbnQxNihjb2RlLCBpKTsKICAgICAgY29uc3QgZ2x5cGhJbmRleCA9IGdldFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgIGkgKz0gNDsKICAgICAgbGV0IGFyZzEsIGFyZzI7CiAgICAgIGlmIChmbGFncyAmIDB4MDEpIHsKICAgICAgICBpZiAoZmxhZ3MgJiAweDAyKSB7CiAgICAgICAgICBhcmcxID0gZ2V0SW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gZ2V0SW50MTYoY29kZSwgaSArIDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcmcxID0gZ2V0VWludDE2KGNvZGUsIGkpOwogICAgICAgICAgYXJnMiA9IGdldFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgICAgfQogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICBhcmcxID0gZ2V0SW50OChjb2RlLCBpKyspOwogICAgICAgIGFyZzIgPSBnZXRJbnQ4KGNvZGUsIGkrKyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXJnMSA9IGNvZGVbaSsrXTsKICAgICAgICBhcmcyID0gY29kZVtpKytdOwogICAgICB9CiAgICAgIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICB4ID0gYXJnMTsKICAgICAgICB5ID0gYXJnMjsKICAgICAgfSBlbHNlIHsKICAgICAgICB4ID0gMDsKICAgICAgICB5ID0gMDsKICAgICAgfQogICAgICBsZXQgc2NhbGVYID0gMSwKICAgICAgICBzY2FsZVkgPSAxLAogICAgICAgI
20HNjYWxlMDEgPSAwLAogICAgICAgIHNjYWxlMTAgPSAwOwogICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CiAgICAgICAgc2NhbGVYID0gc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgaSArPSAyOwogICAgICB9IGVsc2UgaWYgKGZsYWdzICYgMHg0MCkgewogICAgICAgIHNjYWxlWCA9IGdldEZsb2F0MjE0KGNvZGUsIGkpOwogICAgICAgIHNjYWxlWSA9IGdldEZsb2F0MjE0KGNvZGUsIGkgKyAyKTsKICAgICAgICBpICs9IDQ7CiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDgwKSB7CiAgICAgICAgc2NhbGVYID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgc2NhbGUwMSA9IGdldEZsb2F0MjE0KGNvZGUsIGkgKyAyKTsKICAgICAgICBzY2FsZTEwID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDQpOwogICAgICAgIHNjYWxlWSA9IGdldEZsb2F0MjE0KGNvZGUsIGkgKyA2KTsKICAgICAgICBpICs9IDg7CiAgICAgIH0KICAgICAgY29uc3Qgc3ViZ2x5cGggPSBmb250LmdseXBoc1tnbHlwaEluZGV4XTsKICAgICAgaWYgKHN1YmdseXBoKSB7CiAgICAgICAgY21kcy5zYXZlKCk7CiAgICAgICAgY21kcy50cmFuc2Zvcm0oW3NjYWxlWCwgc2NhbGUwMSwgc2NhbGUxMCwgc2NhbGVZLCB4LCB5XSk7CiAgICAgICAgaWYgKCEoZmxhZ3MgJiAweDAyKSkge30KICAgICAgICBjb21waWxlR2x5ZihzdWJnbHlwaCwgY21kcywgZm9udCk7CiAgICAgICAgY21kcy5yZXN0b3JlKCk7CiAgICAgIH0KICAgIH0gd2hpbGUgKGZsYWdzICYgMHgyMCk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGVuZFB0c09mQ29udG91cnMgPSBbXTsKICAgIGxldCBqLCBqajsKICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZkNvbnRvdXJzOyBqKyspIHsKICAgICAgZW5kUHRzT2ZDb250b3Vycy5wdXNoKGdldFVpbnQxNihjb2RlLCBpKSk7CiAgICAgIGkgKz0gMjsKICAgIH0KICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gZ2V0VWludDE2KGNvZGUsIGkpOwogICAgaSArPSAyICsgaW5zdHJ1Y3Rpb25MZW5ndGg7CiAgICBjb25zdCBudW1iZXJPZlBvaW50cyA9IGVuZFB0c09mQ29udG91cnMuYXQoLTEpICsgMTsKICAgIGNvbnN0IHBvaW50cyA9IFtdOwogICAgd2hpbGUgKHBvaW50cy5sZW5ndGggPCBudW1iZXJPZlBvaW50cykgewogICAgICBmbGFncyA9IGNvZGVbaSsrXTsKICAgICAgbGV0IHJlcGVhdCA9IDE7CiAgICAgIGlmIChmbGFncyAmIDB4MDgpIHsKICAgICAgICByZXBlYXQgKz0gY29kZVtpKytdOwogICAgICB9CiAgICAgIHdoaWxlIChyZXBlYXQtLSA+IDApIHsKICAgICAgICBwb2ludHMucHVzaCh7CiAgICAgICAgICBmbGFncwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZQb2ludHM7IGorKykgewogICAgICBzd2l0Y2ggKHBvaW50c1tqXS5mbGFncyAmIDB4MTIpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICB4ICs9IGdldEludDE2KGNvZGUsIGkpOwogICAgICAgICAgaSArPSAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAyOgogICAgICAgICAgeCAtPSBjb2RlW2krK107CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTI6CiAgICAgICAgICB4ICs9IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBvaW50c1tqXS54ID0geDsKICAgIH0KICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlBvaW50czsgaisrKSB7CiAgICAgIHN3aXRjaCAocG9pbnRzW2pdLmZsYWdzICYgMHgyNCkgewogICAgICAgIGNhc2UgMHgwMDoKICAgICAgICAgIHkgKz0gZ2V0SW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDQ6CiAgICAgICAgICB5IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyNDoKICAgICAgICAgIHkgKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnkgPSB5OwogICAgfQogICAgbGV0IHN0YXJ0UG9pbnQgPSAwOwogICAgZm9yIChpID0gMDsgaSA8IG51bWJlck9mQ29udG91cnM7IGkrKykgewogICAgICBjb25zdCBlbmRQb2ludCA9IGVuZFB0c09mQ29udG91cnNbaV07CiAgICAgIGNvbnN0IGNvbnRvdXIgPSBwb2ludHMuc2xpY2Uoc3RhcnRQb2ludCwgZW5kUG9pbnQgKyAxKTsKICAgICAgaWYgKGNvbnRvdXJbMF0uZmxhZ3MgJiAxKSB7CiAgICAgICAgY29udG91ci5wdXNoKGNvbnRvdXJbMF0pOwogICAgICB9IGVsc2UgaWYgKGNvbnRvdXIuYXQoLTEpLmZsYWdzICYgMSkgewogICAgICAgIGNvbnRvdXIudW5zaGlmdChjb250b3VyLmF0KC0xKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgcCA9IHsKICAgICAgICAgIGZsYWdzOiAxLAogICAgICAgICAgeDogKGNvbnRvdXJbMF0ueCArIGNvbnRvdXIuYXQoLTEpLngpIC8gMiwKICAgICAgICAgIHk6IChjb250b3VyWzBdLnkgKyBjb250b3VyLmF0KC0xKS55KSAvIDIKICAgICAgICB9OwogICAgICAgIGNvbnRvdXIudW5zaGlmdChwKTsKICAgICAgICBjb250b3VyLnB1c2gocCk7CiAgICAgIH0KICAgICAgbW92ZVRvKGNvbnRvdXJbMF0ueCwgY29udG91clswXS55KTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb250b3VyLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBpZiAoY29udG91cltqXS5mbGFncyAmIDEpIHsKICAgICAgICAgIGxpbmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSk7CiAgICAgICAgfSBlbHNlIGlmIChjb250b3VyW2ogKyAxXS5mbGFncyAmIDEpIHsKICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnksIGNvbnRvdXJbaiArIDFdLngsIGNvbnRvdXJbaiArIDFdLnkpOwogICAgICAgICAgaisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBxdWFkcmF0aWNDdXJ2ZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55LCAoY29udG91cltqXS54ICsgY29udG91cltqICsgMV0ueCkgLyAyLCAoY29udG91cltqXS55ICsgY29udG91cltqICsgMV0ueSkgLyAyKTsKICAgICAgICB9CiAgICAgI
20H0KICAgICAgc3RhcnRQb2ludCA9IGVuZFBvaW50ICsgMTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gY29tcGlsZUNoYXJTdHJpbmcoY2hhclN0cmluZ0NvZGUsIGNtZHMsIGZvbnQsIGdseXBoSWQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgY21kcy5hZGQoIk0iLCBbeCwgeV0pOwogIH0KICBmdW5jdGlvbiBsaW5lVG8oeCwgeSkgewogICAgY21kcy5hZGQoIkwiLCBbeCwgeV0pOwogIH0KICBmdW5jdGlvbiBiZXppZXJDdXJ2ZVRvKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7CiAgICBjbWRzLmFkZCgiQyIsIFt4MSwgeTEsIHgyLCB5MiwgeCwgeV0pOwogIH0KICBjb25zdCBzdGFjayA9IFtdOwogIGxldCB4ID0gMCwKICAgIHkgPSAwOwogIGxldCBzdGVtcyA9IDA7CiAgZnVuY3Rpb24gcGFyc2UoY29kZSkgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBjb2RlLmxlbmd0aCkgewogICAgICBsZXQgc3RhY2tDbGVhbiA9IGZhbHNlOwogICAgICBsZXQgdiA9IGNvZGVbaSsrXTsKICAgICAgbGV0IHhhLCB4YiwgeWEsIHliLCB5MSwgeTIsIHkzLCBuLCBzdWJyQ29kZTsKICAgICAgc3dpdGNoICh2KSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKICAgICAgICAgIGlmIChmb250LmlzQ0ZGQ0lERm9udCkgewogICAgICAgICAgICBjb25zdCBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOwogICAgICAgICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCBmb250LmZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgY29uc3QgZm9udERpY3QgPSBmb250LmZkQXJyYXlbZmRJbmRleF07CiAgICAgICAgICAgICAgbGV0IHN1YnJzOwogICAgICAgICAgICAgIGlmIChmb250RGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleCkgewogICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdWJycykgewogICAgICAgICAgICAgICAgbiArPSBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycyk7CiAgICAgICAgICAgICAgICBzdWJyQ29kZSA9IHN1YnJzW25dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VickNvZGUgPSBmb250LnN1YnJzW24gKyBmb250LnN1YnJzQmlhc107CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VickNvZGUpIHsKICAgICAgICAgICAgcGFyc2Uoc3VickNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMToKICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIDEyOgogICAgICAgICAgdiA9IGNvZGVbaSsrXTsKICAgICAgICAgIHN3aXRjaCAodikgewogICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHksIHhiLCB5MSwgeCwgeTEpOwogICAgICAgICAgICAgI
20HhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHksIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkxID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTIgPSB5MSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5MSwgeGIsIHkyLCB4LCB5Mik7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5MyA9IHkyICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkyLCB4YiwgeTMsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgIGNvbnN0IHgwID0geCwKICAgICAgICAgICAgICAgIHkwID0geTsKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGI7CiAgICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICAgIGlmIChNYXRoLmFicyh4IC0geDApID4gTWF0aC5hYnMoeSAtIHkwKSkgewogICAgICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogMTIgJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPj0gNCkgewogICAgICAgICAgICBjb25zdCBhY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBjb25zdCBiY2hhciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICB5ID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHggPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgY21kcy5zYXZlKCk7CiAgICAgICAgICAgIGNtZHMudHJhbnNsYXRlKHgsIHkpOwogICAgICAgICAgICBsZXQgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgICBjbWRzLnJlc3RvcmUoKTsKICAgICAgICAgICAgY21hcCA9IGxvb2t1cENtYXAoZm9udC5jbWFwLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGZvbnQuZ2x5cGhOYW1lTWFwW1N0YW5kYXJkRW5jb2RpbmdbYmNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgMTg6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOToKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgI
20HN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMDoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgaSArPSBzdGVtcyArIDcgPj4gMzsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMToKICAgICAgICAgIHkgKz0gc3RhY2sucG9wKCk7CiAgICAgICAgICB4ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDIyOgogICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG1vdmVUbyh4LCB5KTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI0OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIHggKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gNikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjY6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHg7CiAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjc6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoICUgMikgewogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjg6CiAgICAgICAgICBzdGFjay5wdXNoKChjb2RlW2ldIDw8IDI0IHwgY29kZVtpICsgMV0gPDwgMTYpID4+IDE2KTsKICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjk6CiAgICAgICAgICBuID0gc3RhY2sucG9wKCkgKyBmb250LmdzdWJyc0JpYXM7CiAgICAgICAgICBzdWJyQ29kZSA9IGZvbnQuZ3N1YnJzW25dOwogICAgICAgICAgaWYgKHN1YnJDb2RlKSB7CiAgICAgICAgICAgIHBhcnNlKHN1YnJDb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzA6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHg7CiAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTsKICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgKHN0YWNrLmxlbmd0aCA9PT0gMSA/IHN0YWNrLnNoaWZ0KCkgOiAwKTsKICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMxOgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5OwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgI
20HkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGEgPSB4OwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmICh2IDwgMzIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAke3Z9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodiA8IDI0NykgewogICAgICAgICAgICBzdGFjay5wdXNoKHYgLSAxMzkpOwogICAgICAgICAgfSBlbHNlIGlmICh2IDwgMjUxKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goKHYgLSAyNDcpICogMjU2ICsgY29kZVtpKytdICsgMTA4KTsKICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1NSkgewogICAgICAgICAgICBzdGFjay5wdXNoKC0odiAtIDI1MSkgKiAyNTYgLSBjb2RlW2krK10gLSAxMDgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaCgoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2IHwgY29kZVtpICsgMl0gPDwgOCB8IGNvZGVbaSArIDNdKSAvIDY1NTM2KTsKICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHN0YWNrQ2xlYW4pIHsKICAgICAgICBzdGFjay5sZW5ndGggPSAwOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlKGNoYXJTdHJpbmdDb2RlKTsKfQpjb25zdCBOT09QID0gIiI7CmNsYXNzIENvbW1hbmRzIHsKICBjbWRzID0gW107CiAgdHJhbnNmb3JtU3RhY2sgPSBbXTsKICBjdXJyZW50VHJhbnNmb3JtID0gWzEsIDAsIDAsIDEsIDAsIDBdOwogIGFkZChjbWQsIGFyZ3MpIHsKICAgIGlmIChhcmdzKSB7CiAgICAgIGNvbnN0IFthLCBiLCBjLCBkLCBlLCBmXSA9IHRoaXMuY3VycmVudFRyYW5zZm9ybTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgY29uc3QgeCA9IGFyZ3NbaV07CiAgICAgICAgY29uc3QgeSA9IGFyZ3NbaSArIDFdOwogICAgICAgIGFyZ3NbaV0gPSBhICogeCArIGMgKiB5ICsgZTsKICAgICAgICBhcmdzW2kgKyAxXSA9IGIgKiB4ICsgZCAqIHkgKyBmOwogICAgICB9CiAgICAgIHRoaXMuY21kcy5wdXNoKGAke2NtZH0ke2FyZ3Muam9pbigiICIpfWApOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5jbWRzLnB1c2goY21kKTsKICAgIH0KICB9CiAgdHJhbnNmb3JtKHRyYW5zZikgewogICAgdGhpcy5jdXJyZW50VHJhbnNmb3JtID0gVXRpbC50cmFuc2Zvcm0odGhpcy5jdXJyZW50VHJhbnNmb3JtLCB0cmFuc2YpOwogIH0KICB0cmFuc2xhdGUoeCwgeSkgewogICAgdGhpcy50cmFuc2Zvcm0oWzEsIDAsIDAsIDEsIHgsIHldKTsKICB9CiAgc2F2ZSgpIHsKICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmN1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoKSk7CiAgfQogIHJlc3RvcmUoKSB7CiAgICB0aGlzLmN1cnJlbnRUcmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybVN0YWNrLnBvcCgpIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTsKICB9CiAgZ2V0U1ZHKCkgewogICAgcmV0dXJuIHRoaXMuY21kcy5qb2luKCIiKTsKICB9Cn0KY2xhc3MgQ29tcGlsZWRGb250IHsKICBjb25zdHJ1Y3Rvcihmb250TWF0cml4KSB7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBmb250TWF0cml4OwogICAgdGhpcy5jb21waWxlZEdseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0KICBnZXRQYXRoSnModW5pY29kZSkgewogICAgY29uc3QgewogICAgICBjaGFyQ29kZSwKICAgICAgZ2x5cGhJZAogICAgfSA9IGxvb2t1cENtYXAodGhpcy5jbWFwLCB1bmljb2RlKTsKICAgIGxldCBmbiA9IHRoaXMuY29tcGlsZWRHbHlwaHNbZ2x5cGhJZF0sCiAgICAgIGNvbXBpbGVFeDsKICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRyeSB7CiAgICAgICAgZm4gPSB0aGlzLmNvbXBpbGVHbHlwaCh0aGlzLmdseXBoc1tnbHlwaElkXSwgZ2x5cGhJZCk7CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgZm4gPSBOT09QOwogICAgICAgIGNvbXBpbGVFeCA9IGV4OwogICAgICB9CiAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHNbZ2x5cGhJZF0gPSBmbjsKICAgIH0KICAgIHRoaXMuY29tcGlsZWRDaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPz89IGdseXBoSWQ7CiAgICBpZiAoY29tcGlsZUV4KSB7CiAgICAgIHRocm93IGNvbXBpbGVFeDsKICAgIH0KICAgIHJldHVybiBmbjsKICB9CiAgY29tcGlsZUdseXBoKGNvZGUsIGdseXBoSWQpIHsKICAgIGlmICghY29kZT8ubGVuZ3RoIHx8IGNvZGVbMF0gPT09IDE0KSB7CiAgICAgIHJldHVybiBOT09QOwogICAgfQogICAgbGV0IGZvbnRNYXRyaXggPSB0aGlzLmZvbnRNYXRyaXg7CiAgICBpZiAodGhpcy5pc0NGRkNJREZvbnQpIHsKICAgICAgY29uc3QgZmRJbmRleCA9IHRoaXMuZmRTZWxlY3QuZ2V0RkRJbmRleChnbHlwaElkKTsKICAgICAgaWYgKGZkSW5kZXggPj0gMCAmJiBmZEluZGV4IDwgdGhpcy5mZEFycmF5Lmxlbmd0aCkgewogICAgICAgIGNvbnN0IGZvbnREaWN0ID0gdGhpcy5mZEFycmF5W2ZkSW5kZXhdOwogICAgICAgIGZvbnRNYXRyaXggPSBmb250RGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKSB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJJbnZhbGlkIGZkIGluZGV4IGZvciBnbHlwaCBpbmRleC4iKTsKICAgICAgfQogICAgfQogICAgYXNzZXJ0KGlzTnVtYmVyQXJyYXkoZm9udE1hdHJpeCwgNiksICJFeHBlY3RlZCBhIHZhbGlkIGZvbnRNYXRyaXguIik7CiAgICBjb25zdCBjbWRzID0gbmV3IENvbW1hbmRzKCk7CiAgICBjbWRzLnRyYW5zZm9ybShmb250TWF0cml4LnNsaWNlKCkpOwogICAgdGhpcy5jb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMsIGdseXBoSWQpOwogICAgY21kcy5hZGQoIloiKTsKICAgIHJldHVybi
20BjbWRzLmdldFNWRygpOwogIH0KICBjb21waWxlR2x5cGhJbXBsKCkgewogICAgdW5yZWFjaGFibGUoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpOwogIH0KICBoYXNCdWlsdFBhdGgodW5pY29kZSkgewogICAgY29uc3QgewogICAgICBjaGFyQ29kZSwKICAgICAgZ2x5cGhJZAogICAgfSA9IGxvb2t1cENtYXAodGhpcy5jbWFwLCB1bmljb2RlKTsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkOwogIH0KfQpjbGFzcyBUcnVlVHlwZUNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHsKICBjb25zdHJ1Y3RvcihnbHlwaHMsIGNtYXAsIGZvbnRNYXRyaXgpIHsKICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAwNDg4LCAwLCAwLCAwLjAwMDQ4OCwgMCwgMF0pOwogICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7CiAgICB0aGlzLmNtYXAgPSBjbWFwOwogIH0KICBjb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMpIHsKICAgIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIHRoaXMpOwogIH0KfQpjbGFzcyBUeXBlMkNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHsKICBjb25zdHJ1Y3RvcihjZmZJbmZvLCBjbWFwLCBmb250TWF0cml4KSB7CiAgICBzdXBlcihmb250TWF0cml4IHx8IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdKTsKICAgIHRoaXMuZ2x5cGhzID0gY2ZmSW5mby5nbHlwaHM7CiAgICB0aGlzLmdzdWJycyA9IGNmZkluZm8uZ3N1YnJzIHx8IFtdOwogICAgdGhpcy5zdWJycyA9IGNmZkluZm8uc3VicnMgfHwgW107CiAgICB0aGlzLmNtYXAgPSBjbWFwOwogICAgdGhpcy5nbHlwaE5hbWVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgICB0aGlzLmdzdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLmdzdWJycyk7CiAgICB0aGlzLnN1YnJzQmlhcyA9IGdldFN1YnJvdXRpbmVCaWFzKHRoaXMuc3VicnMpOwogICAgdGhpcy5pc0NGRkNJREZvbnQgPSBjZmZJbmZvLmlzQ0ZGQ0lERm9udDsKICAgIHRoaXMuZmRTZWxlY3QgPSBjZmZJbmZvLmZkU2VsZWN0OwogICAgdGhpcy5mZEFycmF5ID0gY2ZmSW5mby5mZEFycmF5OwogIH0KICBjb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMsIGdseXBoSWQpIHsKICAgIGNvbXBpbGVDaGFyU3RyaW5nKGNvZGUsIGNtZHMsIHRoaXMsIGdseXBoSWQpOwogIH0KfQpjbGFzcyBGb250UmVuZGVyZXJGYWN0b3J5IHsKICBzdGF0aWMgY3JlYXRlKGZvbnQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShmb250LmRhdGEpOwogICAgbGV0IGNtYXAsIGdseWYsIGxvY2EsIGNmZiwgaW5kZXhUb0xvY0Zvcm1hdCwgdW5pdHNQZXJFbTsKICAgIGNvbnN0IG51bVRhYmxlcyA9IGdldFVpbnQxNihkYXRhLCA0KTsKICAgIGZvciAobGV0IGkgPSAwLCBwID0gMTI7IGkgPCBudW1UYWJsZXM7IGkrKywgcCArPSAxNikgewogICAgICBjb25zdCB0YWcgPSBieXRlc1RvU3RyaW5nKGRhdGEuc3ViYXJyYXkocCwgcCArIDQpKTsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0VWludDMyKGRhdGEsIHAgKyA4KTsKICAgICAgY29uc3QgbGVuZ3RoID0gZ2V0VWludDMyKGRhdGEsIHAgKyAxMik7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSAiY21hcCI6CiAgICAgICAgICBjbWFwID0gcGFyc2VDbWFwKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImdseWYiOgogICAgICAgICAgZ2x5ZiA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibG9jYSI6CiAgICAgICAgICBsb2NhID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJoZWFkIjoKICAgICAgICAgIHVuaXRzUGVyRW0gPSBnZXRVaW50MTYoZGF0YSwgb2Zmc2V0ICsgMTgpOwogICAgICAgICAgaW5kZXhUb0xvY0Zvcm1hdCA9IGdldFVpbnQxNihkYXRhLCBvZmZzZXQgKyA1MCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDRkYgIjoKICAgICAgICAgIGNmZiA9IHBhcnNlQ2ZmKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoZ2x5ZikgewogICAgICBjb25zdCBmb250TWF0cml4ID0gIXVuaXRzUGVyRW0gPyBmb250LmZvbnRNYXRyaXggOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTsKICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLCBjbWFwLCBmb250TWF0cml4KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9tZXRyaWNzLmpzCgpjb25zdCBnZXRNZXRyaWNzID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZCJdID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IDYwMDsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKICB0LkhlbHZldGljYSA9IGdldExvb2t1cFRhYmxlRmFjdG9yeShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI3ODsKICAgIHQuZXhjbGFtID0gMjc4OwogICAgdC5xdW90ZWRibCA9IDM1NTsKICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKICAgIHQuZG9sbGFyID0gNTU2OwogICAgdC5wZXJjZW50ID0gODg5OwogICAgdC5hbXBlcnNhbmQgPSA2Njc7CiAgICB0LnF1b3RlcmlnaHQgPSAyMjI7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSAzODk7CiAgICB0LnBsdXMgPSA1ODQ7CiAgICB0LmNvbW1hID0gMjc4OwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI3ODsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1NTY7CiAgICB0Lm9uZSA9IDU1NjsKICAgIHQudHdvID0gNTU2OwogICAgdC50aHJlZSA9IDU1NjsKICAgIHQuZm91ciA9IDU1NjsKICAgIHQuZml2ZSA9IDU1NjsKICAgIHQuc2l4ID0gNTU2OwogICAgdC5zZXZlbiA9IDU1NjsKICAgIHQuZWlnaHQgPSA1NTY7CiAgICB0Lm5pbmUgPSA1NTY7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1ODQ7CiAgICB0LmVxdWFsID0gNTg0OwogICAgdC5ncmVhdGVyID0gNTg0OwogICAgdC5xdWVzdGlvbiA9IDU1NjsKICAgIHQuYXQgPSAxMDE1OwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDI3ODsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAyNzg7CiAgICB0LmFzY2lpY2lyY3VtID0gNDY5OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyMjI7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA1MDA7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1NTY7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyMjI7CiAgICB0LmogPSAyMjI7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyMjI7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1NTY7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSAzMzM7CiAgICB0LnMgPSA1MDA7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDMzNDsKICAgIHQuYmFyID0gMjYwOwogICAgdC5icmFjZXJpZ2h0ID0gMzM0OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAxOTE7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDUzNzsKICAgIHQuYnVsbGV0I
20D0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDIyMjsKICAgIHQucXVvdGVkYmxiYXNlID0gMzMzOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjIyOwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDUwMDsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjIyOwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDUwMDsKICAgIHQuc2NlZGlsbGEgPSA1MDA7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ3MTsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDY2NzsKICAgIHQucmNhcm9uID0gMzMzOwogICAgdC5jY2VkaWxsYSA9IDUwMDsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA2NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDY2NzsKICAgIHQuQWJyZXZlID0gNjY3OwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDc2OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTAwOwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI2MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzMzOwogICAgdC5vbWFjcm9uID0gNTU2OwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyMjI7CiAgICB0LnRjYXJvbiA9IDMxNzsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNjY3OwogICAgdC5BZGllcmVzaXMgPSA2Njc7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjIyOwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDU1NjsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTAwOwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gMjk5OwogICAgdC5LY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkxhY3V0ZSA9IDU1NjsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA1NTY7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1NTY7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA1NTY7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDU1NjsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgP
20SA0NTM7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDU1NjsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LkF0aWxkZSA9IDY2NzsKICAgIHQuQW9nb25layA9IDY2NzsKICAgIHQuQXJpbmcgPSA2Njc7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDU1NjsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5ldGggPSA1NTY7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDc0OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDcyMjsKICAgIHQucXVvdGVyaWdodCA9IDI3ODsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAzMzM7CiAgICB0LnNlbWljb2xvbiA9IDMzMzsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNjExOwogICAgdC5hdCA9IDk3NTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDcyMjsKICAgIHQuQyA9IDcyMjsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDYxMTsKICAgIHQuRyA9IDc3ODsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDI3ODsKICAgIHQuSiA9IDU1NjsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDgzMzsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDc3ODsKICAgIHQuUCA9IDY2NzsKICAgIHQuUSA9IDc3ODsKICAgIHQuUiA9IDcyMjsKICAgIHQuUyA9IDY2NzsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDY2NzsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDY2NzsKICAgIHQuWSA9IDY2NzsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDU4NDsKICAgIHQudW5kZXJzY29yZSA9IDU1NjsKICAgIHQucXVvdGVsZWZ0ID0gMjc4OwogICAgdC5hID0gNTU2OwogICAgdC5iID0gNjExOwogICAgdC5jID0gNTU2OwogICAgdC5kID0gNjExOwogICAgdC5lID0gNTU2OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNjExOwogICAgdC5oID0gNjExOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTU2OwogICAgdC5sID0gMjc4OwogICAgdC5tID0gODg5OwogICAgdC5uID0gNjExOwogICAgdC5vID0gNjExOwogICAgdC5wID0gNjExOwogICAgdC5xID0gNjExOwogICAgdC5yID0gMzg5OwogICAgdC5zID0gNTU2OwogICAgdC50ID0gMzMzOwogICAgdC51ID0gNjExOwogICAgdC52ID0gNTU2OwogICAgdC53ID0gNzc4OwogICAgdC54ID0gNTU2OwogICAgdC55ID0gNTU2OwogICAgdC56ID0gNTAwOwogICAgdC5icmFjZWxlZnQgPSAzODk7CiAgICB0LmJhciA9IDI4MDsKICAgIHQuYnJhY2VyaWdodCA9IDM4OTsKICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDU1NjsKICAgIHQuc3RlcmxpbmcgPSA1NTY7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1NTY7CiAgICB0LmZsb3JpbiA9IDU1NjsKICAgIHQuc2VjdGlvbiA9IDU1NjsKICAgIHQuY3VycmVuY3kgPSA1NTY7CiAgICB0LnF1b3Rlc2luZ2xlID0gMjM4OwogICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDYxMTsKICAgIHQuZmwgPSA2MTE7CiAgICB0LmVuZGFzaCA9IDU1NjsKICAgIHQuZGFnZ2VyID0gNTU2OwogICAgdC5kYWdnZXJkYmwgPSA1NTY7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OwogICAgdC5wYXJhZ3JhcGggPSA1NTY7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyNzg7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDUwM
20DsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSAxMDAwOwogICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKICAgIHQuTHNsYXNoID0gNjExOwogICAgdC5Pc2xhc2ggPSA3Nzg7CiAgICB0Lk9FID0gMTAwMDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OwogICAgdC5hZSA9IDg4OTsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNjExOwogICAgdC5vZSA9IDk0NDsKICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKICAgIHQuSWRpZXJlc2lzID0gMjc4OwogICAgdC5lYWN1dGUgPSA1NTY7CiAgICB0LmFicmV2ZSA9IDU1NjsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuZWNhcm9uID0gNTU2OwogICAgdC5ZZGllcmVzaXMgPSA2Njc7CiAgICB0LmRpdmlkZSA9IDU4NDsKICAgIHQuWWFjdXRlID0gNjY3OwogICAgdC5BY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuYWFjdXRlID0gNTU2OwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNTU2OwogICAgdC5zY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTU2OwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA2MTE7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzM3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA1NTY7CiAgICB0LmFyaW5nID0gNTU2OwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTU2OwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDcyMjsKICAgIHQuYXRpbGRlID0gNTU2OwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSA1NTY7CiAgICB0LnNjZWRpbGxhID0gNTU2OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDcyMjsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OwogICAgdC51Y2lyY3VtZmxleCA9IDYxMTsKICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LkFtYWNyb24gPSA3MjI7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA1NTY7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjY3OwogICAgdC5PbWFjcm9uID0gNzc4OwogICAgdC5SYWN1dGUgPSA3MjI7CiAgICB0LlNhY3V0ZSA9IDY2NzsKICAgIHQuZGNhcm9uID0gNzQzOwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDYxMTsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKICAgIHQuT2dyYXZlID0gNzc4OwogICAgdC5BZ3JhdmUgPSA3MjI7CiAgICB0LkFicmV2ZSA9IDcyMjsKICAgIHQubXVsdGlwbHkgPSA1ODQ7CiAgICB0LnVhY3V0ZSA9IDYxMTsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNTU2OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTU2OwogICAgdC5lZGllcmVzaXMgPSA1NTY7CiAgICB0LmNhY3V0ZSA9IDU1NjsKICAgIHQubmFjdXRlID0gNjExOwogICAgdC51bWFjcm9uID0gNjExOwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDI3ODsKICAgIHQucGx1c21pbnVzID0gNTg0OwogICAgdC5icm9rZW5iYXIgPSAyODA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CiAgICB0LkdicmV2ZSA9IDc3ODsKICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDYxMTsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDcyMjsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzODk7CiAgICB0LmVvZ29uZWsgPSA1NTY7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDcyMjsKICAgIHQuQWRpZXJlc2lzID0gNzIyOwogICAgdC5lZ3JhdmUgPSA1NTY7CiAgICB0LnphY3V0ZSA9IDUwMDsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzc4OwogICAgdC5vYWN1dGUgPSA2MTE7CiAgICB0LmFtYWNyb24gPSA1NTY7CiAgICB0LnNhY3V0ZSA9IDU1NjsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA2MTE7CiAgICB0LnR3b3N1cGVyaW9yID0gMzMzOwogICAgdC5PZGllcmVzaXMgPSA3Nzg7CiAgICB0Lm11ID0gNjExOwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA2MTE7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDYxMTsKICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKICAgIHQuU2NlZGlsbGEgPSA2Njc7CiAgICB0LmxjYXJvbiA9IDQwMDsKICAgIHQuS2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CiAgICB0LklncmF2ZSA9IDI3ODsKICAgIHQuSW1hY3JvbiA9IDI3ODsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gODM0OwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNjExOwogICAgdC5udGlsZGUgPSA2MTE7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDU1NjsKICAgIHQuZ2JyZXZlID0gNjExOwogICAgdC5vbmVxdWFydGVyID0gODM0OwogICAgdC5TY2Fyb24gPSA2Njc7CiAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA2MTE7CiAgICB0LkNjYXJvbiA9IDcyMjsKICAgIHQudWdyYXZlID0gNjExOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA2MTE7CiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3Nzg7CiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDI3ODsKICAgIHQua2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5taW51cyA9IDU4NDsKICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CiAgICB0Lm5jYXJvbiA9IDYxMTsKICAgIHQudGNvbW1hYWNjZW50ID0gMzMzOwogICAgdC5sb2dpY2Fsbm90ID0gNTg0OwogICAgdC5vZGllcmVzaXMgPSA2MTE7CiAgICB0LnVkaWVyZXNpcyA9IDYxMTsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuZXRoID0gNjExOwogICAgdC56Y2Fyb24gPSA1MDA7CiAgICB0Lm5jb21tYWFjY2VudCA9IDYxMTsKICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1NTY7CiAgfSk7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0NzQ7CiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CiAgICB0LmRvbGxhciA9IDU1NjsKICAgIHQucGVyY2VudCA9IDg4OTsKICAgIHQuYW1wZXJzYW5kID0gNzIyOwogICAgdC5xdW90ZXJpZ2h0ID0gMjc4OwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gMzg5OwogICAgdC5wbHVzID0gNTg0OwogICAgdC5jb21tYSA9IDI3ODsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNzg7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTU2OwogICAgdC5vbmUgPSA1NTY7CiAgICB0LnR3byA9IDU1NjsKICAgIHQudGhyZWUgPSA1NTY7CiAgICB0LmZvdXIgPSA1NTY7CiAgICB0LmZpdmUgPSA1NTY7CiAgICB0LnNpeCA9IDU1NjsKICAgIHQuc2V2ZW4gPSA1NTY7CiAgICB0LmVpZ2h0ID0gNTU2OwogICAgdC5uaW5lID0gNTU2OwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTg0OwogICAgdC5lcXVhbCA9IDU4NDsKICAgIHQuZ3JlYXRlciA9IDU4NDsKICAgIHQucXVlc3Rpb24gPSA2MTE7CiAgICB0LmF0ID0gOTc1OwogICAgdC5BID0gNzIyOwogICAgdC5CID0gNzIyOwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTU2OwogICAgdC5LID0gNzIyOwogICAgdC5MID0gNjExOwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTg0OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyNzg7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA2MTE7CiAgICB0LmMgPSA1NTY7CiAgICB0LmQgPSA2MTE7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA2MTE7CiAgICB0LmggPSA2MTE7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4ODk7CiAgICB0Lm4gPSA2MTE7CiAgICB0Lm8gPSA2MTE7CiAgICB0LnAgPSA2MTE7CiAgICB0LnEgPSA2MTE7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSA1NTY7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA2MTE7CiAgICB0LnYgPSA1NTY7CiAgICB0LncgPSA3Nzg7CiAgICB0LnggPSA1NTY7CiAgICB0LnkgPSA1NTY7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDM4OTsKICAgIHQuYmFyID0gMjgwOwogICAgdC5icmFjZXJpZ2h0ID0gMzg5OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwM
20DsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNjExOwogICAgdC5mbCA9IDYxMTsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDU1NjsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNjExOwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1NTY7CiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDYxMTsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDU1NjsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDU1NjsKICAgIHQuc2NlZGlsbGEgPSA1NTY7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNjExOwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gMzg5OwogICAgdC5jY2VkaWxsYSA9IDU1NjsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA3NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNjExOwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNjExOwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1NTY7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTU2OwogICAgdC5uYWN1dGUgPSA2MTE7CiAgICB0LnVtYWNyb24gPSA2MTE7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI4MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzg5OwogICAgdC5vbWFjcm9uID0gNjExOwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDM4OTsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDYxMTsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTU2OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDYxMTsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA2MTE7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNjExOwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gNDAwOwogICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LkxhY3V0ZSA9IDYxMTsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA2MTE7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CiAgICB0Lm50aWxkZSA9IDYxMTsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA2MTE7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDYxMTsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA2MTE7CiAgICB0LnJhZGljYWwgP
20SA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDYxMTsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNjExOwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDYxMTsKICAgIHQudWRpZXJlc2lzID0gNjExOwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExOwogICAgdC5ldGggPSA2MTE7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNjExOwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAyNzg7CiAgICB0LnF1b3RlZGJsID0gMzU1OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDY2NzsKICAgIHQucXVvdGVyaWdodCA9IDIyMjsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNTU2OwogICAgdC5hdCA9IDEwMTU7CiAgICB0LkEgPSA2Njc7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3MjI7CiAgICB0LkkgPSAyNzg7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA2Njc7CiAgICB0LkwgPSA1NTY7CiAgICB0Lk0gPSA4MzM7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2Njc7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA2Njc7CiAgICB0LlQgPSA2MTE7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA2Njc7CiAgICB0LlcgPSA5NDQ7CiAgICB0LlggPSA2Njc7CiAgICB0LlkgPSA2Njc7CiAgICB0LlogPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CiAgICB0LnF1b3RlbGVmdCA9IDIyMjsKICAgIHQuYSA9IDU1NjsKICAgIHQuYiA9IDU1NjsKICAgIHQuYyA9IDUwMDsKICAgIHQuZCA9IDU1NjsKICAgIHQuZSA9IDU1NjsKICAgIHQuZiA9IDI3ODsKICAgIHQuZyA9IDU1NjsKICAgIHQuaCA9IDU1NjsKICAgIHQuaSA9IDIyMjsKICAgIHQuaiA9IDIyMjsKICAgIHQuayA9IDUwMDsKICAgIHQubCA9IDIyMjsKICAgIHQubSA9IDgzMzsKICAgIHQubiA9IDU1NjsKICAgIHQubyA9IDU1NjsKICAgIHQucCA9IDU1NjsKICAgIHQucSA9IDU1NjsKICAgIHQuciA9IDMzMzsKICAgIHQucyA9IDUwMDsKICAgIHQudCA9IDI3ODsKICAgIHQudSA9IDU1NjsKICAgIHQudiA9IDUwMDsKICAgIHQudyA9IDcyMjsKICAgIHQueCA9IDUwMDsKICAgIHQueSA9IDUwMDsKICAgIHQueiA9IDUwMDsKICAgIHQuYnJhY2VsZWZ0ID0gMzM0OwogICAgdC5iYXIgPSAyNjA7CiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7CiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1NTY7CiAgICB0LnN0ZXJsaW5nID0gNTU2OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTU2OwogICAgdC5mbG9yaW4gPSA1NTY7CiAgICB0LnNlY3Rpb24gPSA1NTY7CiAgICB0LmN1cnJlbmN5ID0gNTU2OwogICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA1MDA7CiAgICB0LmZsID0gNTAwOwogICAgdC5lbmRhc2ggPSA1NTY7CiAgICB0LmRhZ2dlciA9IDU1NjsKICAgIHQuZGFnZ2VyZGJsID0gNTU2OwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKICAgIHQucGFyYWdyYXBoID0gNTM3OwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOwogICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNjExOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CiAgICB0LkxzbGFzaCA9IDU1NjsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKICAgIHQuYWUgPSA4ODk7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyMjI7CiAgICB0Lm9zbGFzaCA9IDYxMTsKICAgIHQub2UgPSA5NDQ7CiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CiAgICB0LklkaWVyZXNpcyA9IDI3ODsKICAgIHQuZWFjdXRlID0gNTU2OwogICAgdC5hYnJldmUgPSA1NTY7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDU1NjsKICAgIHQuWWR
20pZXJlc2lzID0gNjY3OwogICAgdC5kaXZpZGUgPSA1ODQ7CiAgICB0LllhY3V0ZSA9IDY2NzsKICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFhY3V0ZSA9IDU1NjsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDU1NjsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDczNzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNTAwOwogICAgdC5hcmluZyA9IDU1NjsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyMjI7CiAgICB0LmFncmF2ZSA9IDU1NjsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDU1NjsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gNTAwOwogICAgdC5zY2VkaWxsYSA9IDUwMDsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5BbWFjcm9uID0gNjY3OwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNTAwOwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDY2NzsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA2Njc7CiAgICB0LmRjYXJvbiA9IDY0MzsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNjY3OwogICAgdC5BYnJldmUgPSA2Njc7CiAgICB0Lm11bHRpcGx5ID0gNTg0OwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwM
20DsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDU1NjsKICAgIHQuZWRpZXJlc2lzID0gNTU2OwogICAgdC5jYWN1dGUgPSA1MDA7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAyNzg7CiAgICB0LnBsdXNtaW51cyA9IDU4NDsKICAgIHQuYnJva2VuYmFyID0gMjYwOwogICAgdC5yZWdpc3RlcmVkID0gNzM3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1NTY7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjsKICAgIHQudGNhcm9uID0gMzE3OwogICAgdC5lb2dvbmVrID0gNTU2OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2Njc7CiAgICB0LkFkaWVyZXNpcyA9IDY2NzsKICAgIHQuZWdyYXZlID0gNTU2OwogICAgdC56YWN1dGUgPSA1MDA7CiAgICB0LmlvZ29uZWsgPSAyMjI7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNTU2OwogICAgdC5hbWFjcm9uID0gNTU2OwogICAgdC5zYWN1dGUgPSA1MDA7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTU2OwogICAgdC50d29zdXBlcmlvciA9IDMzMzsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDU1NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1NTY7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CiAgICB0LlNjZWRpbGxhID0gNjY3OwogICAgdC5sY2Fyb24gPSAyOTk7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNTU2OwogICAgdC5JZ3JhdmUgPSAyNzg7CiAgICB0LkltYWNyb24gPSAyNzg7CiAgICB0LkxjYXJvbiA9IDU1NjsKICAgIHQub25laGFsZiA9IDgzNDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA1NTY7CiAgICB0LmdicmV2ZSA9IDU1NjsKICAgIHQub25lcXVhcnRlciA9IDgzNDsKICAgIHQuU2Nhcm9uID0gNjY3OwogICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTU2OwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDQ1MzsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTU2OwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuQXRpbGRlID0gNjY3OwogICAgdC5Bb2dvbmVrID0gNjY3OwogICAgdC5BcmluZyA9IDY2NzsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNTAwOwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAyNzg7CiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKICAgIHQubWludXMgPSA1ODQ7CiAgICB0LkljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKICAgIHQubG9naWNhbG5vdCA9IDU4NDsKICAgIHQub2RpZXJlc2lzID0gNTU2OwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmV0aCA9IDU1NjsKICAgIHQuemNhcm9uID0gNTAwOwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTU2OwogIH0pOwogIHQuU3ltYm9sID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnVuaXZlcnNhbCA9IDcxMzsKICAgIHQubnVtYmVyc2lnbiA9IDUwMDsKICAgIHQuZXhpc3RlbnRpYWwgPSA1NDk7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQuc3VjaHRoYXQgPSA0Mzk7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2ttYXRoID0gNTAwOwogICAgdC5wbHVzID0gNTQ5OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQubWludXMgPSA1NDk7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwM
20DsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMjc4OwogICAgdC5zZW1pY29sb24gPSAyNzg7CiAgICB0Lmxlc3MgPSA1NDk7CiAgICB0LmVxdWFsID0gNTQ5OwogICAgdC5ncmVhdGVyID0gNTQ5OwogICAgdC5xdWVzdGlvbiA9IDQ0NDsKICAgIHQuY29uZ3J1ZW50ID0gNTQ5OwogICAgdC5BbHBoYSA9IDcyMjsKICAgIHQuQmV0YSA9IDY2NzsKICAgIHQuQ2hpID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQuRXBzaWxvbiA9IDYxMTsKICAgIHQuUGhpID0gNzYzOwogICAgdC5HYW1tYSA9IDYwMzsKICAgIHQuRXRhID0gNzIyOwogICAgdC5Jb3RhID0gMzMzOwogICAgdC50aGV0YTEgPSA2MzE7CiAgICB0LkthcHBhID0gNzIyOwogICAgdC5MYW1iZGEgPSA2ODY7CiAgICB0Lk11ID0gODg5OwogICAgdC5OdSA9IDcyMjsKICAgIHQuT21pY3JvbiA9IDcyMjsKICAgIHQuUGkgPSA3Njg7CiAgICB0LlRoZXRhID0gNzQxOwogICAgdC5SaG8gPSA1NTY7CiAgICB0LlNpZ21hID0gNTkyOwogICAgdC5UYXUgPSA2MTE7CiAgICB0LlVwc2lsb24gPSA2OTA7CiAgICB0LnNpZ21hMSA9IDQzOTsKICAgIHQuT21lZ2EgPSA3Njg7CiAgICB0LlhpID0gNjQ1OwogICAgdC5Qc2kgPSA3OTU7CiAgICB0LlpldGEgPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOwogICAgdC50aGVyZWZvcmUgPSA4NjM7CiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKICAgIHQucGVycGVuZGljdWxhciA9IDY1ODsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucmFkaWNhbGV4ID0gNTAwOwogICAgdC5hbHBoYSA9IDYzMTsKICAgIHQuYmV0YSA9IDU0OTsKICAgIHQuY2hpID0gNTQ5OwogICAgdC5kZWx0YSA9IDQ5NDsKICAgIHQuZXBzaWxvbiA9IDQzOTsKICAgIHQucGhpID0gNTIxOwogICAgdC5nYW1tYSA9IDQxMTsKICAgIHQuZXRhID0gNjAzOwogICAgdC5pb3RhID0gMzI5OwogICAgdC5waGkxID0gNjAzOwogICAgdC5rYXBwYSA9IDU0OTsKICAgIHQubGFtYmRhID0gNTQ5OwogICAgdC5tdSA9IDU3NjsKICAgIHQubnUgPSA1MjE7CiAgICB0Lm9taWNyb24gPSA1NDk7CiAgICB0LnBpID0gNTQ5OwogICAgdC50aGV0YSA9IDUyMTsKICAgIHQucmhvID0gNTQ5OwogICAgdC5zaWdtYSA9IDYwMzsKICAgIHQudGF1ID0gNDM5OwogICAgdC51cHNpbG9uID0gNTc2OwogICAgdC5vbWVnYTEgPSA3MTM7CiAgICB0Lm9tZWdhID0gNjg2OwogICAgdC54aSA9IDQ5MzsKICAgIHQucHNpID0gNjg2OwogICAgdC56ZXRhID0gNDk0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuc2ltaWxhciA9IDU0OTsKICAgIHQuRXVybyA9IDc1MDsKICAgIHQuVXBzaWxvbjEgPSA2MjA7CiAgICB0Lm1pbnV0ZSA9IDI0NzsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQuaW5maW5pdHkgPSA3MTM7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuY2x1YiA9IDc1MzsKICAgIHQuZGlhbW9uZCA9IDc1MzsKICAgIHQuaGVhcnQgPSA3NTM7CiAgICB0LnNwYWRlID0gNzUzOwogICAgdC5hcnJvd2JvdGggPSAxMDQyOwogICAgdC5hcnJvd2xlZnQgPSA5ODc7CiAgICB0LmFycm93dXAgPSA2MDM7CiAgICB0LmFycm93cmlnaHQgPSA5ODc7CiAgICB0LmFycm93ZG93biA9IDYwMzsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5wbHVzbWludXMgPSA1NDk7CiAgICB0LnNlY29uZCA9IDQxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5tdWx0aXBseSA9IDU0OTsKICAgIHQucHJvcG9ydGlvbmFsID0gNzEzOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQuYnVsbGV0ID0gNDYwOwogICAgdC5kaXZpZGUgPSA1NDk7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5lcXVpdmFsZW5jZSA9IDU0OTsKICAgIHQuYXBwcm94ZXF1YWwgPSA1NDk7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQuYXJyb3d2ZXJ0ZXggPSA2MDM7CiAgICB0LmFycm93aG9yaXpleCA9IDEwMDA7CiAgICB0LmNhcnJpYWdlcmV0dXJuID0gNjU4OwogICAgdC5hbGVwaCA9IDgyMzsKICAgIHQuSWZyYWt0dXIgPSA2ODY7CiAgICB0LlJmcmFrdHVyID0gNzk1OwogICAgdC53ZWllcnN0cmFzcyA9IDk4NzsKICAgIHQuY2lyY2xlbXVsdGlwbHkgPSA3Njg7CiAgICB0LmNpcmNsZXBsdXMgPSA3Njg7CiAgICB0LmVtcHR5c2V0ID0gODIzOwogICAgdC5pbnRlcnNlY3Rpb24gPSA3Njg7CiAgICB0LnVuaW9uID0gNzY4OwogICAgdC5wcm9wZXJzdXBlcnNldCA9IDcxMzsKICAgIHQucmVmbGV4c3VwZXJzZXQgPSA3MTM7CiAgICB0Lm5vdHN1YnNldCA9IDcxMzsKICAgIHQucHJvcGVyc3Vic2V0ID0gNzEzOwogICAgdC5yZWZsZXhzdWJzZXQgPSA3MTM7CiAgICB0LmVsZW1lbnQgPSA3MTM7CiAgICB0Lm5vdGVsZW1lbnQgPSA3MTM7CiAgICB0LmFuZ2xlID0gNzY4OwogICAgdC5ncmFkaWVudCA9IDcxMzsKICAgIHQucmVnaXN0ZXJzZXJpZiA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2VyaWYgPSA3OTA7CiAgICB0LnRyYWRlbWFya3NlcmlmID0gODkwOwogICAgdC5wcm9kdWN0ID0gODIzOwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5kb3RtYXRoID0gMjUwOwogICAgdC5sb2dpY2Fsbm90ID0gNzEzOwogICAgdC5sb2dpY2FsYW5kID0gNjAzOwogICAgdC5sb2dpY2Fsb3IgPSA2MDM7CiAgICB0LmFycm93ZGJsYm90aCA9IDEwNDI7CiAgICB0LmFycm93ZGJsbGVmdCA9IDk4NzsKICAgIHQuYXJyb3dkYmx1cCA9IDYwMzsKICAgIHQuYXJyb3dkYmxyaWdodCA9IDk4NzsKICAgIHQuYXJyb3dkYmxkb3duID0gNjAzOwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5hbmdsZWxlZnQgPSAzMjk7CiAgICB0LnJlZ2lzdGVyc2FucyA9IDc5MDsKICAgIHQuY29weXJpZ2h0c2FucyA9IDc5MDsKICAgIHQudHJhZGVtYXJrc2FucyA9IDc4NjsKICAgIHQuc3VtbWF0aW9uID0gNzEzOwogICAgdC5wYXJlbmxlZnR0cCA9IDM4NDsKICAgIHQucGFyZW5sZWZ0ZXggPSAzODQ7CiAgICB0LnBhcmVubGVmdGJ0ID0gMzg0OwogICAgdC5icmFja2V0bGVmdHRwID0gMzg0OwogICAgdC5icmFja2V0bGVmdGV4ID0gMzg0OwogICAgdC5icmFja2V0bGVmdGJ0ID0gMzg0OwogICAgdC5icmFjZWxlZnR0cCA9IDQ5NDsKICAgIHQuYnJhY2VsZWZ0bWlkID0gNDk0OwogICAgdC5icmFjZWxlZnRidCA9IDQ5NDsKICAgIHQuYnJhY2VleCA9IDQ5NDsKICAgIHQuYW5nbGVyaWdodCA9IDMyOTsKICAgIHQuaW50ZWdyYWwgPSAyNzQ7CiAgICB0LmludGVncmFsdHAgPSA2ODY7CiAgICB0LmludGVncmFsZXggPSA2ODY7CiAgICB0LmludGVncmFsYnQgPSA2ODY7CiAgICB0LnBhcmVucmlnaHR0cCA9IDM4NDsKICAgIHQucGFyZW5yaWdodGV4ID0gMzg0OwogICAgdC5wYXJlbnJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNrZXRyaWdodHRwID0gMzg0OwogICAgdC5icmFja2V0cmlnaHRleCA9IDM4NDsKICAgIHQuYnJhY2tldHJpZ2h0YnQgPSAzODQ7CiAgICB0LmJyYWNlcmlnaHR0cCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodG1pZCA9IDQ5NDsKICAgIHQuYnJhY2VyaWdodGJ0ID0gNDk0OwogICAgdC5hcHBsZSA9IDc5MDsKICB9KTsKICB0WyJ
20UaW1lcy1Sb21hbiJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDA4OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU2NDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU2NDsKICAgIHQuZXF1YWwgPSA1NjQ7CiAgICB0LmdyZWF0ZXIgPSA1NjQ7CiAgICB0LnF1ZXN0aW9uID0gNDQ0OwogICAgdC5hdCA9IDkyMTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDY2NzsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDYxMTsKICAgIHQuRiA9IDU1NjsKICAgIHQuRyA9IDcyMjsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDMzMzsKICAgIHQuSiA9IDM4OTsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDg4OTsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDcyMjsKICAgIHQuUCA9IDU1NjsKICAgIHQuUSA9IDcyMjsKICAgIHQuUiA9IDY2NzsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDcyMjsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDcyMjsKICAgIHQuWSA9IDcyMjsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucXVvdGVsZWZ0ID0gMzMzOwogICAgdC5hID0gNDQ0OwogICAgdC5iID0gNTAwOwogICAgdC5jID0gNDQ0OwogICAgdC5kID0gNTAwOwogICAgdC5lID0gNDQ0OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNTAwOwogICAgdC5oID0gNTAwOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjc4OwogICAgdC5tID0gNzc4OwogICAgdC5uID0gNTAwOwogICAgdC5vID0gNTAwOwogICAgdC5wID0gNTAwOwogICAgdC5xID0gNTAwOwogICAgdC5yID0gMzMzOwogICAgdC5zID0gMzg5OwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTAwOwogICAgdC52ID0gNTAwOwogICAgdC53ID0gNzIyOwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNTAwOwogICAgdC56ID0gNDQ0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuYXNjaWl0aWxkZSA9IDU0MTsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDUwMDsKICAgIHQuc3RlcmxpbmcgPSA1MDA7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1MDA7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuc2VjdGlvbiA9IDUwMDsKICAgIHQuY3VycmVuY3kgPSA1MDA7CiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwOwogICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDU1NjsKICAgIHQuZmwgPSA1NTY7CiAgICB0LmVuZGFzaCA9IDUwMDsKICAgIHQuZGFnZ2VyID0gNTAwOwogICAgdC5kYWdnZXJkYmwgPSA1MDA7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOwogICAgdC5wYXJhZ3JhcGggPSA0NTM7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDQ0NDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA4ODk7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA0NDQ7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNzIyOwogICAgdC5kaXZpZGUgPSA1NjQ7CiAgICB0LllhY3V0ZSA9IDcyMjsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDQ0NDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwM
20DsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDQ0NDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDQ0NDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDQ0NDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDQ0NDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2Njc7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDU1NjsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjY3OwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDU4ODsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTY0OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwM
20DsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDQ0NDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDU2NDsKICAgIHQuYnJva2VuYmFyID0gMjAwOwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzI2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSA0NDQ7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNDQ0OwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzNDQ7CiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDU2NDsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNTY0OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwM
20DsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSA0NDQ7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtQm9sZCJdID0gZ2V0TG9va3VwVGFibGVGYWN0b3J5KGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNTU1OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSAxMDAwOwogICAgdC5hbXBlcnNhbmQgPSA4MzM7CiAgICB0LnF1b3RlcmlnaHQgPSAzMzM7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSA1MDA7CiAgICB0LnBsdXMgPSA1NzA7CiAgICB0LmNvbW1hID0gMjUwOwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI1MDsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1MDA7CiAgICB0Lm9uZSA9IDUwMDsKICAgIHQudHdvID0gNTAwOwogICAgdC50aHJlZSA9IDUwMDsKICAgIHQuZm91ciA9IDUwMDsKICAgIHQuZml2ZSA9IDUwMDsKICAgIHQuc2l4ID0gNTAwOwogICAgdC5zZXZlbiA9IDUwMDsKICAgIHQuZWlnaHQgPSA1MDA7CiAgICB0Lm5pbmUgPSA1MDA7CiAgICB0LmNvbG9uID0gMzMzOwogICAgdC5zZW1pY29sb24gPSAzMzM7CiAgICB0Lmxlc3MgPSA1NzA7CiAgICB0LmVxdWFsID0gNTcwOwogICAgdC5ncmVhdGVyID0gNTcwOwogICAgdC5xdWVzdGlvbiA9IDUwMDsKICAgIHQuYXQgPSA5MzA7CiAgICB0LkEgPSA3MjI7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3Nzg7CiAgICB0LkkgPSAzODk7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA3Nzg7CiAgICB0LkwgPSA2Njc7CiAgICB0Lk0gPSA5NDQ7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2MTE7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA1NTY7CiAgICB0LlQgPSA2Njc7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA3MjI7CiAgICB0LlcgPSAxMDAwOwogICAgdC5YID0gNzIyOwogICAgdC5ZID0gNzIyOwogICAgdC5aID0gNjY3OwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTgxOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1NTY7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1NTY7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAzMzM7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4MzM7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1NTY7CiAgICB0LnEgPSA1NTY7CiAgICB0LnIgPSA0NDQ7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA1MDA7CiAgICB0LncgPSA3MjI7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA1MDA7CiAgICB0LnogPSA0NDQ7CiAgICB0LmJyYWNlbGVmdCA9IDM5NDsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzk0OwogICAgdC5hc2NpaXRpbGRlID0gNTIwOwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDU0MDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwM
20DsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzAwOwogICAgdC5Mc2xhc2ggPSA2Njc7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzMzA7CiAgICB0LmFlID0gNzIyOwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA1MDA7CiAgICB0Lm9lID0gNzIyOwogICAgdC5nZXJtYW5kYmxzID0gNTU2OwogICAgdC5JZGllcmVzaXMgPSAzODk7CiAgICB0LmVhY3V0ZSA9IDQ0NDsKICAgIHQuYWJyZXZlID0gNTAwOwogICAgdC51aHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5lY2Fyb24gPSA0NDQ7CiAgICB0LllkaWVyZXNpcyA9IDcyMjsKICAgIHQuZGl2aWRlID0gNTcwOwogICAgdC5ZYWN1dGUgPSA3MjI7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1MDA7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1MDA7CiAgICB0LnNjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuZWNpcmN1bWZsZXggPSA0NDQ7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1MDA7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDU1NjsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3NDc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDQ0NDsKICAgIHQuYXJpbmcgPSA1MDA7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1MDA7CiAgICB0LlRjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1MDA7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDM4OTsKICAgIHQuc2NlZGlsbGEgPSAzODk7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5hY2lyY3VtZmxleCA9IDUwMDsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gNDQ0OwogICAgdC5jY2VkaWxsYSA9IDQ0NDsKICAgIHQuWmRvdGFjY2VudCA9IDY2NzsKICAgIHQuVGhvcm4gPSA2MTE7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNTU2OwogICAgdC5kY2Fyb24gPSA2NzI7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNTU2OwogICAgdC50aHJlZXN1cGVyaW9yID0gMzAwOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU3MDsKICAgIHQudWFjdXRlID0gNTU2OwogICAgdC5UY2Fyb24gPSA2Njc7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1MDA7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1MDA7CiAgICB0LmVkaWVyZXNpcyA9IDQ0NDsKICAgIHQuY2FjdXRlID0gNDQ0OwogICAgdC5uYWN1dGUgPSA1NTY7CiAgICB0LnVtYWNyb24gPSA1NTY7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMzg5OwogICAgdC5wbHVzbWludXMgPSA1NzA7CiAgICB0LmJyb2tlbmJhciA9IDIyMDsKICAgIHQucmVnaXN0ZXJlZCA9IDc0NzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMzg5OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gNDQ0OwogICAgdC5vbWFjcm9uID0gNTAwOwogICAgdC5aYWN1dGUgPSA2Njc7CiAgICB0LlpjYXJvbiA9IDY2NzsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDQxNjsKICAgIHQuZW9nb25layA9IDQ0NDsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDQ0NDsKICAgIHQuemFjdXRlID0gNDQ0OwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDUwMDsKICAgIHQuYW1hY3JvbiA9IDUwMDsKICAgIHQuc2FjdXRlID0gMzg5OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDU1NjsKICAgIHQudHdvc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA1NTY7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDUwMDsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNTU2OwogICAgdC50aHJlZXF1YXJ0ZXJzID0gNzUwOwogICAgdC5TY2VkaWxsYSA9IDU1NjsKICAgIHQubGNhcm9uID0gMzk0OwogICAgdC5LY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LkxhY3V0ZSA9IDY2NzsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDQ0NDsKICAgIHQuSWdyYXZlID0gMzg5OwogICAgdC5JbWFjcm9uID0gMzg5OwogICAgdC5MY2Fyb24gPSA2Njc7CiAgICB0Lm9uZWhhbGYgPSA3NTA7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA1MDA7CiAgICB0Lm50aWxkZSA9IDU1NjsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNDQ0OwogICAgdC5nYnJldmUgPSA1MDA7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA3NTA7CiAgICB0LlNjYXJvbiA9IDU1NjsKICAgIHQuU2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDUwM
20DsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA1NTY7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDUwMDsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDQ0NDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMzg5OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTcwOwogICAgdC5JY2lyY3VtZmxleCA9IDM4OTsKICAgIHQubmNhcm9uID0gNTU2OwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1NzA7CiAgICB0Lm9kaWVyZXNpcyA9IDUwMDsKICAgIHQudWRpZXJlc2lzID0gNTU2OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5ldGggPSA1MDA7CiAgICB0LnpjYXJvbiA9IDQ0NDsKICAgIHQubmNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5vbmVzdXBlcmlvciA9IDMwMDsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDUwMDsKICB9KTsKICB0WyJUaW1lcy1Cb2xkSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDM4OTsKICAgIHQucXVvdGVkYmwgPSA1NTU7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNTcwOwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTcwOwogICAgdC5lcXVhbCA9IDU3MDsKICAgIHQuZ3JlYXRlciA9IDU3MDsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gODMyOwogICAgdC5BID0gNjY3OwogICAgdC5CID0gNjY3OwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjY3OwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzc4OwogICAgdC5JID0gMzg5OwogICAgdC5KID0gNTAwOwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNjExOwogICAgdC5NID0gODg5OwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjY3OwogICAgdC5TID0gNTU2OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gODg5OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjExOwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTcwOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1NTY7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1MDA7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3Nzg7CiAgICB0Lm4gPSA1NTY7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1NTY7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA1MDA7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDM0ODsKICAgIHQuYmFyID0gMjIwOwogICAgdC5icmFjZXJpZ2h0ID0gMzQ4OwogICAgdC5hc2NpaXRpbGRlID0gNTcwOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyNzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTU2OwogICAgdC5mbCA9IDU1NjsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUwMDsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwM
20DsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDUwMDsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDk0NDsKICAgIHQub3JkZmVtaW5pbmUgPSAyNjY7CiAgICB0LkxzbGFzaCA9IDYxMTsKICAgIHQuT3NsYXNoID0gNzIyOwogICAgdC5PRSA9IDk0NDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzAwOwogICAgdC5hZSA9IDcyMjsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDI3ODsKICAgIHQub3NsYXNoID0gNTAwOwogICAgdC5vZSA9IDcyMjsKICAgIHQuZ2VybWFuZGJscyA9IDUwMDsKICAgIHQuSWRpZXJlc2lzID0gMzg5OwogICAgdC5lYWN1dGUgPSA0NDQ7CiAgICB0LmFicmV2ZSA9IDUwMDsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuZWNhcm9uID0gNDQ0OwogICAgdC5ZZGllcmVzaXMgPSA2MTE7CiAgICB0LmRpdmlkZSA9IDU3MDsKICAgIHQuWWFjdXRlID0gNjExOwogICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWFjdXRlID0gNTAwOwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNDQ0OwogICAgdC5zY29tbWFhY2NlbnQgPSAzODk7CiAgICB0LmVjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTAwOwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA1NTY7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzQ3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA0NDQ7CiAgICB0LmFyaW5nID0gNTAwOwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDI3ODsKICAgIHQuYWdyYXZlID0gNTAwOwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDY2NzsKICAgIHQuYXRpbGRlID0gNTAwOwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSAzODk7CiAgICB0LnNjZWRpbGxhID0gMzg5OwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0OTQ7CiAgICB0LlJjYXJvbiA9IDY2NzsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzIyOwogICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKICAgIHQuYWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LkFtYWNyb24gPSA2Njc7CiAgICB0LnJjYXJvbiA9IDM4OTsKICAgIHQuY2NlZGlsbGEgPSA0NDQ7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjExOwogICAgdC5PbWFjcm9uID0gNzIyOwogICAgdC5SYWN1dGUgPSA2Njc7CiAgICB0LlNhY3V0ZSA9IDU1NjsKICAgIHQuZGNhcm9uID0gNjA4OwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDU1NjsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMwMDsKICAgIHQuT2dyYXZlID0gNzIyOwogICAgdC5BZ3JhdmUgPSA2Njc7CiAgICB0LkFicmV2ZSA9IDY2NzsKICAgIHQubXVsdGlwbHkgPSA1NzA7CiAgICB0LnVhY3V0ZSA9IDU1NjsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ5NDsKICAgIHQueWRpZXJlc2lzID0gNDQ0OwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTAwOwogICAgdC5lZGllcmVzaXMgPSA0NDQ7CiAgICB0LmNhY3V0ZSA9IDQ0NDsKICAgIHQubmFjdXRlID0gNTU2OwogICAgdC51bWFjcm9uID0gNTU2OwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDM4OTsKICAgIHQucGx1c21pbnVzID0gNTcwOwogICAgdC5icm9rZW5iYXIgPSAyMjA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3NDc7CiAgICB0LkdicmV2ZSA9IDcyMjsKICAgIHQuSWRvdGFjY2VudCA9IDM4OTsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDM4OTsKICAgIHQub21hY3JvbiA9IDUwMDsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDY2NzsKICAgIHQubGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC50Y2Fyb24gPSAzNjY7CiAgICB0LmVvZ29uZWsgPSA0NDQ7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDY2NzsKICAgIHQuQWRpZXJlc2lzID0gNjY3OwogICAgdC5lZ3JhdmUgPSA0NDQ7CiAgICB0LnphY3V0ZSA9IDM4OTsKICAgIHQuaW9nb25layA9IDI3ODsKICAgIHQuT2FjdXRlID0gNzIyOwogICAgdC5vYWN1dGUgPSA1MDA7CiAgICB0LmFtYWNyb24gPSA1MDA7CiAgICB0LnNhY3V0ZSA9IDM4OTsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDcyMjsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA1MDA7CiAgICB0LnR3b3N1cGVyaW9yID0gMzAwOwogICAgdC5PZGllcmVzaXMgPSA3MjI7CiAgICB0Lm11ID0gNTc2OwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDUwMDsKICAgIHQudGhyZWVxdWFydGVycyA9IDc1MDsKICAgIHQuU2NlZGlsbGEgPSA1NTY7CiAgICB0LmxjYXJvbiA9IDM4MjsKICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5MYWN1dGUgPSA2MTE7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDM4OTsKICAgIHQuSW1hY3JvbiA9IDM4OTsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1NTY7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTU2OwogICAgdC5yYWRpY2FsID0gNTQ5OwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA2Njc7CiAgICB0LkFvZ29uZWsgPSA2Njc7CiAgICB0LkFyaW5nID0gNjY3OwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDM4OTsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDYwNjsKICAgIHQuSWNpcmN1bWZsZXggPSAzODk7CiAgICB0Lm5jYXJvbiA9IDU1NjsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjA2OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDU1NjsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwM
20DsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtSXRhbGljIl0gPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0MjA7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNjc1OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNjc1OwogICAgdC5lcXVhbCA9IDY3NTsKICAgIHQuZ3JlYXRlciA9IDY3NTsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gOTIwOwogICAgdC5BID0gNjExOwogICAgdC5CID0gNjExOwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjExOwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMzMzOwogICAgdC5KID0gNDQ0OwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNjY3OwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjExOwogICAgdC5TID0gNTAwOwogICAgdC5UID0gNTU2OwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjExOwogICAgdC5XID0gODMzOwogICAgdC5YID0gNjExOwogICAgdC5ZID0gNTU2OwogICAgdC5aID0gNTU2OwogICAgdC5icmFja2V0bGVmdCA9IDM4OTsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzODk7CiAgICB0LmFzY2lpY2lyY3VtID0gNDIyOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1MDA7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA0NDQ7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3MjI7CiAgICB0Lm4gPSA1MDA7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1MDA7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA0NDQ7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDQwMDsKICAgIHQuYmFyID0gMjc1OwogICAgdC5icmFjZXJpZ2h0ID0gNDAwOwogICAgdC5hc2NpaXRpbGRlID0gNTQxOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUyMzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTU2OwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2OwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwM
20DsKICAgIHQuZWxsaXBzaXMgPSA4ODk7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNTAwOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDg4OTsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA5NDQ7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA2Njc7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNTU2OwogICAgdC5kaXZpZGUgPSA2NzU7CiAgICB0LllhY3V0ZSA9IDU1NjsKICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDQ0NDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3OwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2MTE7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNjExOwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNTU2OwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjExOwogICAgdC5TYWN1dGUgPSA1MDA7CiAgICB0LmRjYXJvbiA9IDU0NDsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNjExOwogICAgdC5BYnJldmUgPSA2MTE7CiAgICB0Lm11bHRpcGx5ID0gNjc1OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDU1NjsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKICAgIHQuTmFjdXRlID0gNjY3OwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDUwM
20DsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNjY3OwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDY3NTsKICAgIHQuYnJva2VuYmFyID0gMjc1OwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDU1NjsKICAgIHQuWmNhcm9uID0gNTU2OwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzAwOwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2MTE7CiAgICB0LkFkaWVyZXNpcyA9IDYxMTsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSAzODk7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTAwOwogICAgdC5sY2Fyb24gPSAzMDA7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1MDA7CiAgICB0LlNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNjY3OwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5BdGlsZGUgPSA2MTE7CiAgICB0LkFvZ29uZWsgPSA2MTE7CiAgICB0LkFyaW5nID0gNjExOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5taW51cyA9IDY3NTsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjc1OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwM
20DsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdC5aYXBmRGluZ2JhdHMgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmExID0gOTc0OwogICAgdC5hMiA9IDk2MTsKICAgIHQuYTIwMiA9IDk3NDsKICAgIHQuYTMgPSA5ODA7CiAgICB0LmE0ID0gNzE5OwogICAgdC5hNSA9IDc4OTsKICAgIHQuYTExOSA9IDc5MDsKICAgIHQuYTExOCA9IDc5MTsKICAgIHQuYTExNyA9IDY5MDsKICAgIHQuYTExID0gOTYwOwogICAgdC5hMTIgPSA5Mzk7CiAgICB0LmExMyA9IDU0OTsKICAgIHQuYTE0ID0gODU1OwogICAgdC5hMTUgPSA5MTE7CiAgICB0LmExNiA9IDkzMzsKICAgIHQuYTEwNSA9IDkxMTsKICAgIHQuYTE3ID0gOTQ1OwogICAgdC5hMTggPSA5NzQ7CiAgICB0LmExOSA9IDc1NTsKICAgIHQuYTIwID0gODQ2OwogICAgdC5hMjEgPSA3NjI7CiAgICB0LmEyMiA9IDc2MTsKICAgIHQuYTIzID0gNTcxOwogICAgdC5hMjQgPSA2Nzc7CiAgICB0LmEyNSA9IDc2MzsKICAgIHQuYTI2ID0gNzYwOwogICAgdC5hMjcgPSA3NTk7CiAgICB0LmEyOCA9IDc1NDsKICAgIHQuYTYgPSA0OTQ7CiAgICB0LmE3ID0gNTUyOwogICAgdC5hOCA9IDUzNzsKICAgIHQuYTkgPSA1Nzc7CiAgICB0LmExMCA9IDY5MjsKICAgIHQuYTI5ID0gNzg2OwogICAgdC5hMzAgPSA3ODg7CiAgICB0LmEzMSA9IDc4ODsKICAgIHQuYTMyID0gNzkwOwogICAgdC5hMzMgPSA3OTM7CiAgICB0LmEzNCA9IDc5NDsKICAgIHQuYTM1ID0gODE2OwogICAgdC5hMzYgPSA4MjM7CiAgICB0LmEzNyA9IDc4OTsKICAgIHQuYTM4ID0gODQxOwogICAgdC5hMzkgPSA4MjM7CiAgICB0LmE0MCA9IDgzMzsKICAgIHQuYTQxID0gODE2OwogICAgdC5hNDIgPSA4MzE7CiAgICB0LmE0MyA9IDkyMzsKICAgIHQuYTQ0ID0gNzQ0OwogICAgdC5hNDUgPSA3MjM7CiAgICB0LmE0NiA9IDc0OTsKICAgIHQuYTQ3ID0gNzkwOwogICAgdC5hNDggPSA3OTI7CiAgICB0LmE0OSA9IDY5NTsKICAgIHQuYTUwID0gNzc2OwogICAgdC5hNTEgP
20SA3Njg7CiAgICB0LmE1MiA9IDc5MjsKICAgIHQuYTUzID0gNzU5OwogICAgdC5hNTQgPSA3MDc7CiAgICB0LmE1NSA9IDcwODsKICAgIHQuYTU2ID0gNjgyOwogICAgdC5hNTcgPSA3MDE7CiAgICB0LmE1OCA9IDgyNjsKICAgIHQuYTU5ID0gODE1OwogICAgdC5hNjAgPSA3ODk7CiAgICB0LmE2MSA9IDc4OTsKICAgIHQuYTYyID0gNzA3OwogICAgdC5hNjMgPSA2ODc7CiAgICB0LmE2NCA9IDY5NjsKICAgIHQuYTY1ID0gNjg5OwogICAgdC5hNjYgPSA3ODY7CiAgICB0LmE2NyA9IDc4NzsKICAgIHQuYTY4ID0gNzEzOwogICAgdC5hNjkgPSA3OTE7CiAgICB0LmE3MCA9IDc4NTsKICAgIHQuYTcxID0gNzkxOwogICAgdC5hNzIgPSA4NzM7CiAgICB0LmE3MyA9IDc2MTsKICAgIHQuYTc0ID0gNzYyOwogICAgdC5hMjAzID0gNzYyOwogICAgdC5hNzUgPSA3NTk7CiAgICB0LmEyMDQgPSA3NTk7CiAgICB0LmE3NiA9IDg5MjsKICAgIHQuYTc3ID0gODkyOwogICAgdC5hNzggPSA3ODg7CiAgICB0LmE3OSA9IDc4NDsKICAgIHQuYTgxID0gNDM4OwogICAgdC5hODIgPSAxMzg7CiAgICB0LmE4MyA9IDI3NzsKICAgIHQuYTg0ID0gNDE1OwogICAgdC5hOTcgPSAzOTI7CiAgICB0LmE5OCA9IDM5MjsKICAgIHQuYTk5ID0gNjY4OwogICAgdC5hMTAwID0gNjY4OwogICAgdC5hODkgPSAzOTA7CiAgICB0LmE5MCA9IDM5MDsKICAgIHQuYTkzID0gMzE3OwogICAgdC5hOTQgPSAzMTc7CiAgICB0LmE5MSA9IDI3NjsKICAgIHQuYTkyID0gMjc2OwogICAgdC5hMjA1ID0gNTA5OwogICAgdC5hODUgPSA1MDk7CiAgICB0LmEyMDYgPSA0MTA7CiAgICB0LmE4NiA9IDQxMDsKICAgIHQuYTg3ID0gMjM0OwogICAgdC5hODggPSAyMzQ7CiAgICB0LmE5NSA9IDMzNDsKICAgIHQuYTk2ID0gMzM0OwogICAgdC5hMTAxID0gNzMyOwogICAgdC5hMTAyID0gNTQ0OwogICAgdC5hMTAzID0gNTQ0OwogICAgdC5hMTA0ID0gOTEwOwogICAgdC5hMTA2ID0gNjY3OwogICAgdC5hMTA3ID0gNzYwOwogICAgdC5hMTA4ID0gNzYwOwogICAgdC5hMTEyID0gNzc2OwogICAgdC5hMTExID0gNTk1OwogICAgdC5hMTEwID0gNjk0OwogICAgdC5hMTA5ID0gNjI2OwogICAgdC5hMTIwID0gNzg4OwogICAgdC5hMTIxID0gNzg4OwogICAgdC5hMTIyID0gNzg4OwogICAgdC5hMTIzID0gNzg4OwogICAgdC5hMTI0ID0gNzg4OwogICAgdC5hMTI1ID0gNzg4OwogICAgdC5hMTI2ID0gNzg4OwogICAgdC5hMTI3ID0gNzg4OwogICAgdC5hMTI4ID0gNzg4OwogICAgdC5hMTI5ID0gNzg4OwogICAgdC5hMTMwID0gNzg4OwogICAgdC5hMTMxID0gNzg4OwogICAgdC5hMTMyID0gNzg4OwogICAgdC5hMTMzID0gNzg4OwogICAgdC5hMTM0ID0gNzg4OwogICAgdC5hMTM1ID0gNzg4OwogICAgdC5hMTM2ID0gNzg4OwogICAgdC5hMTM3ID0gNzg4OwogICAgdC5hMTM4ID0gNzg4OwogICAgdC5hMTM5ID0gNzg4OwogICAgdC5hMTQwID0gNzg4OwogICAgdC5hMTQxID0gNzg4OwogICAgdC5hMTQyID0gNzg4OwogICAgdC5hMTQzID0gNzg4OwogICAgdC5hMTQ0ID0gNzg4OwogICAgdC5hMTQ1ID0gNzg4OwogICAgdC5hMTQ2ID0gNzg4OwogICAgdC5hMTQ3ID0gNzg4OwogICAgdC5hMTQ4ID0gNzg4OwogICAgdC5hMTQ5ID0gNzg4OwogICAgdC5hMTUwID0gNzg4OwogICAgdC5hMTUxID0gNzg4OwogICAgdC5hMTUyID0gNzg4OwogICAgdC5hMTUzID0gNzg4OwogICAgdC5hMTU0ID0gNzg4OwogICAgdC5hMTU1ID0gNzg4OwogICAgdC5hMTU2ID0gNzg4OwogICAgdC5hMTU3ID0gNzg4OwogICAgdC5hMTU4ID0gNzg4OwogICAgdC5hMTU5ID0gNzg4OwogICAgdC5hMTYwID0gODk0OwogICAgdC5hMTYxID0gODM4OwogICAgdC5hMTYzID0gMTAxNjsKICAgIHQuYTE2NCA9IDQ1ODsKICAgIHQuYTE5NiA9IDc0ODsKICAgIHQuYTE2NSA9IDkyNDsKICAgIHQuYTE5MiA9IDc0ODsKICAgIHQuYTE2NiA9IDkxODsKICAgIHQuYTE2NyA9IDkyNzsKICAgIHQuYTE2OCA9IDkyODsKICAgIHQuYTE2OSA9IDkyODsKICAgIHQuYTE3MCA9IDgzNDsKICAgIHQuYTE3MSA9IDg3MzsKICAgIHQuYTE3MiA9IDgyODsKICAgIHQuYTE3MyA9IDkyNDsKICAgIHQuYTE2MiA9IDkyNDsKICAgIHQuYTE3NCA9IDkxNzsKICAgIHQuYTE3NSA9IDkzMDsKICAgIHQuYTE3NiA9IDkzMTsKICAgIHQuYTE3NyA9IDQ2MzsKICAgIHQuYTE3OCA9IDg4MzsKICAgIHQuYTE3OSA9IDgzNjsKICAgIHQuYTE5MyA9IDgzNjsKICAgIHQuYTE4MCA9IDg2NzsKICAgIHQuYTE5OSA9IDg2NzsKICAgIHQuYTE4MSA9IDY5NjsKICAgIHQuYTIwMCA9IDY5NjsKICAgIHQuYTE4MiA9IDg3NDsKICAgIHQuYTIwMSA9IDg3NDsKICAgIHQuYTE4MyA9IDc2MDsKICAgIHQuYTE4NCA9IDk0NjsKICAgIHQuYTE5NyA9IDc3MTsKICAgIHQuYTE4NSA9IDg2NTsKICAgIHQuYTE5NCA9IDc3MTsKICAgIHQuYTE5OCA9IDg4ODsKICAgIHQuYTE4NiA9IDk2NzsKICAgIHQuYTE5NSA9IDg4ODsKICAgIHQuYTE4NyA9IDgzMTsKICAgIHQuYTE4OCA9IDg3MzsKICAgIHQuYTE4OSA9IDkyNzsKICAgIHQuYTE5MCA9IDk3MDsKICAgIHQuYTE5MSA9IDkxODsKICB9KTsKfSk7CmNvbnN0IGdldEZvbnRCYXNpY01ldHJpY3MgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0LkNvdXJpZXIgPSB7CiAgICBhc2NlbnQ6IDYyOSwKICAgIGRlc2NlbnQ6IC0xNTcsCiAgICBjYXBIZWlnaHQ6IDU2MiwKICAgIHhIZWlnaHQ6IC00MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZCJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MzkKICB9OwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiA0MjYKICB9OwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IHsKICAgIGFzY2VudDogNjI5LAogICAgZGVzY2VudDogLTE1NywKICAgIGNhcEhlaWdodDogNTYyLAogICAgeEhlaWdodDogNDI2CiAgfTsKICB0LkhlbHZldGljYSA9IHsKICAgIGFzY2VudDogNzE4LAogICAgZGVzY2VudDogLTIwNywKICAgIGNhcEhlaWdodDogNzE4LAogICAgeEhlaWdodDogNTIzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgYXNjZW50OiA3MTgsCiAgICBkZXNjZW50OiAtMjA3LAogICAgY2FwSGVpZ2h0OiA3MTgsCiAgICB4SGVpZ2h0OiA1MzIKICB9OwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6I
20DcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUyMwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUzMgogIH07CiAgdFsiVGltZXMtUm9tYW4iXSA9IHsKICAgIGFzY2VudDogNjgzLAogICAgZGVzY2VudDogLTIxNywKICAgIGNhcEhlaWdodDogNjYyLAogICAgeEhlaWdodDogNDUwCiAgfTsKICB0WyJUaW1lcy1Cb2xkIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY3NiwKICAgIHhIZWlnaHQ6IDQ2MQogIH07CiAgdFsiVGltZXMtSXRhbGljIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY1MywKICAgIHhIZWlnaHQ6IDQ0MQogIH07CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gewogICAgYXNjZW50OiA2ODMsCiAgICBkZXNjZW50OiAtMjE3LAogICAgY2FwSGVpZ2h0OiA2NjksCiAgICB4SGVpZ2h0OiA0NjIKICB9OwogIHQuU3ltYm9sID0gewogICAgYXNjZW50OiBNYXRoLk5hTiwKICAgIGRlc2NlbnQ6IE1hdGguTmFOLAogICAgY2FwSGVpZ2h0OiBNYXRoLk5hTiwKICAgIHhIZWlnaHQ6IE1hdGguTmFOCiAgfTsKICB0LlphcGZEaW5nYmF0cyA9IHsKICAgIGFzY2VudDogTWF0aC5OYU4sCiAgICBkZXNjZW50OiBNYXRoLk5hTiwKICAgIGNhcEhlaWdodDogTWF0aC5OYU4sCiAgICB4SGVpZ2h0OiBNYXRoLk5hTgogIH07Cn0pOwoKOy8vIC4vc3JjL2NvcmUvZ2x5Zi5qcwoKCgoKCgoKCgoKY29uc3QgT05fQ1VSVkVfUE9JTlQgPSAxIDw8IDA7CmNvbnN0IFhfU0hPUlRfVkVDVE9SID0gMSA8PCAxOwpjb25zdCBZX1NIT1JUX1ZFQ1RPUiA9IDEgPDwgMjsKY29uc3QgUkVQRUFUX0ZMQUcgPSAxIDw8IDM7CmNvbnN0IFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUiA9IDEgPDwgNDsKY29uc3QgWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SID0gMSA8PCA1Owpjb25zdCBPVkVSTEFQX1NJTVBMRSA9IDEgPDwgNjsKY29uc3QgQVJHXzFfQU5EXzJfQVJFX1dPUkRTID0gMSA8PCAwOwpjb25zdCBBUkdTX0FSRV9YWV9WQUxVRVMgPSAxIDw8IDE7CmNvbnN0IFdFX0hBVkVfQV9TQ0FMRSA9IDEgPDwgMzsKY29uc3QgTU9SRV9DT01QT05FTlRTID0gMSA8PCA1Owpjb25zdCBXRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUgPSAxIDw8IDY7CmNvbnN0IFdFX0hBVkVfQV9UV09fQllfVFdPID0gMSA8PCA3Owpjb25zdCBXRV9IQVZFX0lOU1RSVUNUSU9OUyA9IDEgPDwgODsKY2xhc3MgR2x5ZlRhYmxlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBnbHlmVGFibGUsCiAgICBpc0dseXBoTG9jYXRpb25zTG9uZywKICAgIGxvY2FUYWJsZSwKICAgIG51bUdseXBocwogIH0pIHsKICAgIHRoaXMuZ2x5cGhzID0gW107CiAgICBjb25zdCBsb2NhID0gbmV3IERhdGFWaWV3KGxvY2FUYWJsZS5idWZmZXIsIGxvY2FUYWJsZS5ieXRlT2Zmc2V0LCBsb2NhVGFibGUuYnl0ZUxlbmd0aCk7CiAgICBjb25zdCBnbHlmID0gbmV3IERhdGFWaWV3KGdseWZUYWJsZS5idWZmZXIsIGdseWZUYWJsZS5ieXRlT2Zmc2V0LCBnbHlmVGFibGUuYnl0ZUxlbmd0aCk7CiAgICBjb25zdCBvZmZzZXRTaXplID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyA0IDogMjsKICAgIGxldCBwcmV2ID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyBsb2NhLmdldFVpbnQzMigwKSA6IDIgKiBsb2NhLmdldFVpbnQxNigwKTsKICAgIGxldCBwb3MgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICBwb3MgKz0gb2Zmc2V0U2l6ZTsKICAgICAgY29uc3QgbmV4dCA9IGlzR2x5cGhMb2NhdGlvbnNMb25nID8gbG9jYS5nZXRVaW50MzIocG9zKSA6IDIgKiBsb2NhLmdldFVpbnQxNihwb3MpOwogICAgICBpZiAobmV4dCA9PT0gcHJldikgewogICAgICAgIHRoaXMuZ2x5cGhzLnB1c2gobmV3IEdseXBoKHt9KSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgZ2x5cGggPSBHbHlwaC5wYXJzZShwcmV2LCBnbHlmKTsKICAgICAgdGhpcy5nbHlwaHMucHVzaChnbHlwaCk7CiAgICAgIHByZXYgPSBuZXh0OwogICAgfQogIH0KICBnZXRTaXplKCkgewogICAgcmV0dXJuIHRoaXMuZ2x5cGhzLnJlZHVjZSgoYSwgZykgPT4gewogICAgICBjb25zdCBzaXplID0gZy5nZXRTaXplKCk7CiAgICAgIHJldHVybiBhICsgKHNpemUgKyAzICYgfjMpOwogICAgfSwgMCk7CiAgfQogIHdyaXRlKCkgewogICAgY29uc3QgdG90YWxTaXplID0gdGhpcy5nZXRTaXplKCk7CiAgICBjb25zdCBnbHlmVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpOwogICAgY29uc3QgaXNMb2NhdGlvbkxvbmcgPSB0b3RhbFNpemUgPiAweDFmZmZlOwogICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGlzTG9jYXRpb25Mb25nID8gNCA6IDI7CiAgICBjb25zdCBsb2NhVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCh0aGlzLmdseXBocy5sZW5ndGggKyAxKSAqIG9mZnNldFNpemUpKTsKICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICBsb2NhVGFibGUuc2V0VWludDMyKDAsIDApOwogICAgfSBlbHNlIHsKICAgICAgbG9jYVRhYmxlLnNldFVpbnQxNigwLCAwKTsKICAgIH0KICAgIGxldCBwb3MgPSAwOwogICAgbGV0IGxvY2FJbmRleCA9IDA7CiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIHRoaXMuZ2x5cGhzKSB7CiAgICAgIHBvcyArPSBnbHlwaC53cml0ZShwb3MsIGdseWZUYWJsZSk7CiAgICAgIHBvcyA9IHBvcyArIDMgJiB+MzsKICAgICAgbG9jYUluZGV4ICs9IG9mZnNldFNpemU7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MzIobG9jYUluZGV4LCBwb3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MTYobG9jYUluZGV4LCBwb3MgPj4gMSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybi
20B7CiAgICAgIGlzTG9jYXRpb25Mb25nLAogICAgICBsb2NhOiBuZXcgVWludDhBcnJheShsb2NhVGFibGUuYnVmZmVyKSwKICAgICAgZ2x5ZjogbmV3IFVpbnQ4QXJyYXkoZ2x5ZlRhYmxlLmJ1ZmZlcikKICAgIH07CiAgfQogIHNjYWxlKGZhY3RvcnMpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5nbHlwaHNbaV0uc2NhbGUoZmFjdG9yc1tpXSk7CiAgICB9CiAgfQp9CmNsYXNzIEdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBoZWFkZXIgPSBudWxsLAogICAgc2ltcGxlID0gbnVsbCwKICAgIGNvbXBvc2l0ZXMgPSBudWxsCiAgfSkgewogICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CiAgICB0aGlzLnNpbXBsZSA9IHNpbXBsZTsKICAgIHRoaXMuY29tcG9zaXRlcyA9IGNvbXBvc2l0ZXM7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIGNvbnN0IFtyZWFkLCBoZWFkZXJdID0gR2x5cGhIZWFkZXIucGFyc2UocG9zLCBnbHlmKTsKICAgIHBvcyArPSByZWFkOwogICAgaWYgKGhlYWRlci5udW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgICBjb25zdCBjb21wb3NpdGVzID0gW107CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgY29uc3QgW24sIGNvbXBvc2l0ZV0gPSBDb21wb3NpdGVHbHlwaC5wYXJzZShwb3MsIGdseWYpOwogICAgICAgIHBvcyArPSBuOwogICAgICAgIGNvbXBvc2l0ZXMucHVzaChjb21wb3NpdGUpOwogICAgICAgIGlmICghKGNvbXBvc2l0ZS5mbGFncyAmIE1PUkVfQ09NUE9ORU5UUykpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IEdseXBoKHsKICAgICAgICBoZWFkZXIsCiAgICAgICAgY29tcG9zaXRlcwogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHNpbXBsZSA9IFNpbXBsZUdseXBoLnBhcnNlKHBvcywgZ2x5ZiwgaGVhZGVyLm51bWJlck9mQ29udG91cnMpOwogICAgcmV0dXJuIG5ldyBHbHlwaCh7CiAgICAgIGhlYWRlciwKICAgICAgc2ltcGxlCiAgICB9KTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGlmICghdGhpcy5oZWFkZXIpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjb25zdCBzaXplID0gdGhpcy5zaW1wbGUgPyB0aGlzLnNpbXBsZS5nZXRTaXplKCkgOiB0aGlzLmNvbXBvc2l0ZXMucmVkdWNlKChhLCBjKSA9PiBhICsgYy5nZXRTaXplKCksIDApOwogICAgcmV0dXJuIHRoaXMuaGVhZGVyLmdldFNpemUoKSArIHNpemU7CiAgfQogIHdyaXRlKHBvcywgYnVmKSB7CiAgICBpZiAoIXRoaXMuaGVhZGVyKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIHBvcyArPSB0aGlzLmhlYWRlci53cml0ZShwb3MsIGJ1Zik7CiAgICBpZiAodGhpcy5zaW1wbGUpIHsKICAgICAgcG9zICs9IHRoaXMuc2ltcGxlLndyaXRlKHBvcywgYnVmKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgY29tcG9zaXRlIG9mIHRoaXMuY29tcG9zaXRlcykgewogICAgICAgIHBvcyArPSBjb21wb3NpdGUud3JpdGUocG9zLCBidWYpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcG9zIC0gc3BvczsKICB9CiAgc2NhbGUoZmFjdG9yKSB7CiAgICBpZiAoIXRoaXMuaGVhZGVyKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHhNaWRkbGUgPSAodGhpcy5oZWFkZXIueE1pbiArIHRoaXMuaGVhZGVyLnhNYXgpIC8gMjsKICAgIHRoaXMuaGVhZGVyLnNjYWxlKHhNaWRkbGUsIGZhY3Rvcik7CiAgICBpZiAodGhpcy5zaW1wbGUpIHsKICAgICAgdGhpcy5zaW1wbGUuc2NhbGUoeE1pZGRsZSwgZmFjdG9yKTsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgY29tcG9zaXRlIG9mIHRoaXMuY29tcG9zaXRlcykgewogICAgICAgIGNvbXBvc2l0ZS5zY2FsZSh4TWlkZGxlLCBmYWN0b3IpOwogICAgICB9CiAgICB9CiAgfQp9CmNsYXNzIEdseXBoSGVhZGVyIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBudW1iZXJPZkNvbnRvdXJzLAogICAgeE1pbiwKICAgIHlNaW4sCiAgICB4TWF4LAogICAgeU1heAogIH0pIHsKICAgIHRoaXMubnVtYmVyT2ZDb250b3VycyA9IG51bWJlck9mQ29udG91cnM7CiAgICB0aGlzLnhNaW4gPSB4TWluOwogICAgdGhpcy55TWluID0geU1pbjsKICAgIHRoaXMueE1heCA9IHhNYXg7CiAgICB0aGlzLnlNYXggPSB5TWF4OwogIH0KICBzdGF0aWMgcGFyc2UocG9zLCBnbHlmKSB7CiAgICByZXR1cm4gWzEwLCBuZXcgR2x5cGhIZWFkZXIoewogICAgICBudW1iZXJPZkNvbnRvdXJzOiBnbHlmLmdldEludDE2KHBvcyksCiAgICAgIHhNaW46IGdseWYuZ2V0SW50MTYocG9zICsgMiksCiAgICAgIHlNaW46IGdseWYuZ2V0SW50MTYocG9zICsgNCksCiAgICAgIHhNYXg6IGdseWYuZ2V0SW50MTYocG9zICsgNiksCiAgICAgIHlNYXg6IGdseWYuZ2V0SW50MTYocG9zICsgOCkKICAgIH0pXTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIHJldHVybiAxMDsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGJ1Zi5zZXRJbnQxNihwb3MsIHRoaXMubnVtYmVyT2ZDb250b3Vycyk7CiAgICBidWYuc2V0SW50MTYocG9zICsgMiwgdGhpcy54TWluKTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyA0LCB0aGlzLnlNaW4pOwogICAgYnVmLnNldEludDE2KHBvcyArIDYsIHRoaXMueE1heCk7CiAgICBidWYuc2V0SW50MTYocG9zICsgOCwgdGhpcy55TWF4KTsKICAgIHJldHVybiAxMDsKICB9CiAgc2NhbGUoeCwgZmFjdG9yKSB7CiAgICB0aGlzLnhNaW4gPSBNYXRoLnJvdW5kKHggKyAodGhpcy54TWluIC0geCkgKiBmYWN0b3IpOwogICAgdGhpcy54TWF4ID0gTWF0aC5yb3VuZCh4ICsgKHRoaXMueE1heCAtIHgpICogZmFjdG9yKTsKICB9Cn0KY2xhc3MgQ29udG91ciB7CiAgY29uc3RydWN0b3IoewogICAgZmxhZ3MsCiAgICB4Q29vcmRpbmF0ZXMsCiAgICB5Q29vcmRpbmF0ZXMKICB9KSB7CiAgICB0aGlzLnhDb29yZGluYXRlcyA9IHhDb29yZGluYXRlczsKICAgIHRoaXMueUNvb3JkaW5hdGVzID0geUNvb3JkaW5hdGVzOwogICAgdGhpcy5mbGFncyA9IGZsYWdzOwogIH0KfQpjbGFzcyBTaW1wbGVHbHlwaCB7CiAgY29uc3RydWN0b3IoewogICAgY29udG91cnMsCiAgICBpbnN0cnVjdGlvbnMKICB9KSB7CiAgICB0aGlzLmNvbnRvdXJzID0gY29udG91cnM7CiAgICB0aGlzLmluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uczsKICB9CiAgc3RhdGljIHBhcnNlKHBvcywgZ2x5ZiwgbnVtYmVyT2ZDb250b3VycykgewogICAgY29uc3QgZW5kUHRzT2ZDb250b3VycyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZkNvbnRvdXJzOyBpKyspIHsKICAgICAgY29uc3QgZW5kUHQgPSBnbHlmLmdldFVpbnQxNihwb3MpOwogICAgICBwb3MgKz0gMjsKICAgICAgZW5kUHRzT2ZDb250b3Vycy5wdXNoKGVuZFB0KTsKICAgIH0KICAgIGNvbnN0IG51bWJlck9mUHQgPSBlbmRQdHNPZkNvbnRvdXJzW251bWJlck9mQ29udG91cnMgLSAxXSArIDE7CiAgICBjb25zdCBpbnN0cnVjdGlvbkxlbmd0aCA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICBwb3MgKz0gMjsKICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IG5ldyBVaW50OEFycmF5KGdseWYpLnNsaWNlKHBvcywgcG9zICsgaW5zdHJ1Y3Rpb25MZW5ndGgpOwogICAgcG9zICs9IGluc3RydWN0aW9uTGVuZ3RoOwogICAgY29uc3QgZmxhZ3MgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZQdDsgcG9zKyssIGkrKykgewogICAgICBsZXQgZmxhZyA9IGdseWYuZ2V0VWludDgocG9zKTsKICAgICAgZmxhZ3MucHVzaChmbGFnKTsKICAgICAgaWYgKGZsYWcgJiBSRVBFQVRfRkxBRykgewogICAgICAgIGNvbnN0IGNvdW50ID0gZ2x5Zi5nZXRVaW50OCgrK3Bvcyk7CiAgICAgICAgZmxhZyBePSBSRVBFQVRfRkxBRzsKICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IGNvdW50OyBtKyspIHsKICAgICAgICAgIGZsYWdzLnB1c2goZmxhZyk7CiAgICAgICAgfQogICAgICAgIGkgKz0gY291bnQ7CiAgICAgI
20H0KICAgIH0KICAgIGNvbnN0IGFsbFhDb29yZGluYXRlcyA9IFtdOwogICAgbGV0IHhDb29yZGluYXRlcyA9IFtdOwogICAgbGV0IHlDb29yZGluYXRlcyA9IFtdOwogICAgbGV0IHBvaW50RmxhZ3MgPSBbXTsKICAgIGNvbnN0IGNvbnRvdXJzID0gW107CiAgICBsZXQgZW5kUHRzT2ZDb250b3Vyc0luZGV4ID0gMDsKICAgIGxldCBsYXN0Q29vcmRpbmF0ZSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mUHQ7IGkrKykgewogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWF9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBjb25zdCB4ID0gZ2x5Zi5nZXRVaW50OChwb3MrKyk7CiAgICAgICAgbGFzdENvb3JkaW5hdGUgKz0gZmxhZyAmIFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUiA/IHggOiAteDsKICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBnbHlmLmdldEludDE2KHBvcyk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgICAgeENvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9CiAgICAgIGlmIChlbmRQdHNPZkNvbnRvdXJzW2VuZFB0c09mQ29udG91cnNJbmRleF0gPT09IGkpIHsKICAgICAgICBlbmRQdHNPZkNvbnRvdXJzSW5kZXgrKzsKICAgICAgICBhbGxYQ29vcmRpbmF0ZXMucHVzaCh4Q29vcmRpbmF0ZXMpOwogICAgICAgIHhDb29yZGluYXRlcyA9IFtdOwogICAgICB9CiAgICB9CiAgICBsYXN0Q29vcmRpbmF0ZSA9IDA7CiAgICBlbmRQdHNPZkNvbnRvdXJzSW5kZXggPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlB0OyBpKyspIHsKICAgICAgY29uc3QgZmxhZyA9IGZsYWdzW2ldOwogICAgICBpZiAoZmxhZyAmIFlfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgY29uc3QgeSA9IGdseWYuZ2V0VWludDgocG9zKyspOwogICAgICAgIGxhc3RDb29yZGluYXRlICs9IGZsYWcgJiBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IgPyB5IDogLXk7CiAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9IGVsc2UgaWYgKGZsYWcgJiBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IpIHsKICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGFzdENvb3JkaW5hdGUgKz0gZ2x5Zi5nZXRJbnQxNihwb3MpOwogICAgICAgIHBvcyArPSAyOwogICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfQogICAgICBwb2ludEZsYWdzLnB1c2goZmxhZyAmIE9OX0NVUlZFX1BPSU5UIHwgZmxhZyAmIE9WRVJMQVBfU0lNUExFKTsKICAgICAgaWYgKGVuZFB0c09mQ29udG91cnNbZW5kUHRzT2ZDb250b3Vyc0luZGV4XSA9PT0gaSkgewogICAgICAgIHhDb29yZGluYXRlcyA9IGFsbFhDb29yZGluYXRlc1tlbmRQdHNPZkNvbnRvdXJzSW5kZXhdOwogICAgICAgIGVuZFB0c09mQ29udG91cnNJbmRleCsrOwogICAgICAgIGNvbnRvdXJzLnB1c2gobmV3IENvbnRvdXIoewogICAgICAgICAgZmxhZ3M6IHBvaW50RmxhZ3MsCiAgICAgICAgICB4Q29vcmRpbmF0ZXMsCiAgICAgICAgICB5Q29vcmRpbmF0ZXMKICAgICAgICB9KSk7CiAgICAgICAgeUNvb3JkaW5hdGVzID0gW107CiAgICAgICAgcG9pbnRGbGFncyA9IFtdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNpbXBsZUdseXBoKHsKICAgICAgY29udG91cnMsCiAgICAgIGluc3RydWN0aW9ucwogICAgfSk7CiAgfQogIGdldFNpemUoKSB7CiAgICBsZXQgc2l6ZSA9IHRoaXMuY29udG91cnMubGVuZ3RoICogMiArIDIgKyB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGg7CiAgICBsZXQgbGFzdFggPSAwOwogICAgbGV0IGxhc3RZID0gMDsKICAgIGZvciAoY29uc3QgY29udG91ciBvZiB0aGlzLmNvbnRvdXJzKSB7CiAgICAgIHNpemUgKz0gY29udG91ci5mbGFncy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbnRvdXIueENvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCB4ID0gY29udG91ci54Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgY29uc3QgeSA9IGNvbnRvdXIueUNvb3JkaW5hdGVzW2ldOwogICAgICAgIGxldCBhYnMgPSBNYXRoLmFicyh4IC0gbGFzdFgpOwogICAgICAgIGlmIChhYnMgPiAyNTUpIHsKICAgICAgICAgIHNpemUgKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKGFicyA+IDApIHsKICAgICAgICAgIHNpemUgKz0gMTsKICAgICAgICB9CiAgICAgICAgbGFzdFggPSB4OwogICAgICAgIGFicyA9IE1hdGguYWJzKHkgLSBsYXN0WSk7CiAgICAgICAgaWYgKGFicyA+IDI1NSkgewogICAgICAgICAgc2l6ZSArPSAyOwogICAgICAgIH0gZWxzZSBpZiAoYWJzID4gMCkgewogICAgICAgICAgc2l6ZSArPSAxOwogICAgICAgIH0KICAgICAgICBsYXN0WSA9IHk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaXplOwogIH0KICB3cml0ZShwb3MsIGJ1ZikgewogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIGNvbnN0IHhDb29yZGluYXRlcyA9IFtdOwogICAgY29uc3QgeUNvb3JkaW5hdGVzID0gW107CiAgICBjb25zdCBmbGFncyA9IFtdOwogICAgbGV0IGxhc3RYID0gMDsKICAgIGxldCBsYXN0WSA9IDA7CiAgICBmb3IgKGNvbnN0IGNvbnRvdXIgb2YgdGhpcy5jb250b3VycykgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgbGV0IGZsYWcgPSBjb250b3VyLmZsYWdzW2ldOwogICAgICAgIGNvbnN0IHggPSBjb250b3VyLnhDb29yZGluYXRlc1tpXTsKICAgICAgICBsZXQgZGVsdGEgPSB4IC0gbGFzdFg7CiAgICAgICAgaWYgKGRlbHRhID09PSAwKSB7CiAgICAgICAgICBmbGFnIHw9IFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUjsKICAgICAgICAgI
20HhDb29yZGluYXRlcy5wdXNoKDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBhYnMgPSBNYXRoLmFicyhkZWx0YSk7CiAgICAgICAgICBpZiAoYWJzIDw9IDI1NSkgewogICAgICAgICAgICBmbGFnIHw9IGRlbHRhID49IDAgPyBYX1NIT1JUX1ZFQ1RPUiB8IFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUiA6IFhfU0hPUlRfVkVDVE9SOwogICAgICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChhYnMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeENvb3JkaW5hdGVzLnB1c2goZGVsdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXN0WCA9IHg7CiAgICAgICAgY29uc3QgeSA9IGNvbnRvdXIueUNvb3JkaW5hdGVzW2ldOwogICAgICAgIGRlbHRhID0geSAtIGxhc3RZOwogICAgICAgIGlmIChkZWx0YSA9PT0gMCkgewogICAgICAgICAgZmxhZyB8PSBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1I7CiAgICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaCgwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnMoZGVsdGEpOwogICAgICAgICAgaWYgKGFicyA8PSAyNTUpIHsKICAgICAgICAgICAgZmxhZyB8PSBkZWx0YSA+PSAwID8gWV9TSE9SVF9WRUNUT1IgfCBZX0lTX1NBTUVfT1JfUE9TSVRJVkVfWV9TSE9SVF9WRUNUT1IgOiBZX1NIT1JUX1ZFQ1RPUjsKICAgICAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2goYWJzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGRlbHRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGFzdFkgPSB5OwogICAgICAgIGZsYWdzLnB1c2goZmxhZyk7CiAgICAgIH0KICAgICAgYnVmLnNldFVpbnQxNihwb3MsIHhDb29yZGluYXRlcy5sZW5ndGggLSAxKTsKICAgICAgcG9zICs9IDI7CiAgICB9CiAgICBidWYuc2V0VWludDE2KHBvcywgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKTsKICAgIHBvcyArPSAyOwogICAgaWYgKHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCkgewogICAgICBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCAwLCBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpLnNldCh0aGlzLmluc3RydWN0aW9ucywgcG9zKTsKICAgICAgcG9zICs9IHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgIH0KICAgIGZvciAoY29uc3QgZmxhZyBvZiBmbGFncykgewogICAgICBidWYuc2V0VWludDgocG9zKyssIGZsYWcpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0geENvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeCA9IHhDb29yZGluYXRlc1tpXTsKICAgICAgY29uc3QgZmxhZyA9IGZsYWdzW2ldOwogICAgICBpZiAoZmxhZyAmIFhfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgYnVmLnNldFVpbnQ4KHBvcysrLCB4KTsKICAgICAgfSBlbHNlIGlmICghKGZsYWcgJiBYX0lTX1NBTUVfT1JfUE9TSVRJVkVfWF9TSE9SVF9WRUNUT1IpKSB7CiAgICAgICAgYnVmLnNldEludDE2KHBvcywgeCk7CiAgICAgICAgcG9zICs9IDI7CiAgICAgIH0KICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHlDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IHkgPSB5Q29vcmRpbmF0ZXNbaV07CiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnc1tpXTsKICAgICAgaWYgKGZsYWcgJiBZX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIGJ1Zi5zZXRVaW50OChwb3MrKywgeSk7CiAgICAgIH0gZWxzZSBpZiAoIShmbGFnICYgWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SKSkgewogICAgICAgIGJ1Zi5zZXRJbnQxNihwb3MsIHkpOwogICAgICAgIHBvcyArPSAyOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcG9zIC0gc3BvczsKICB9CiAgc2NhbGUoeCwgZmFjdG9yKSB7CiAgICBmb3IgKGNvbnN0IGNvbnRvdXIgb2YgdGhpcy5jb250b3VycykgewogICAgICBpZiAoY29udG91ci54Q29vcmRpbmF0ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29udG91ci54Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnRvdXIueENvb3JkaW5hdGVzW2ldID0gTWF0aC5yb3VuZCh4ICsgKGNvbnRvdXIueENvb3JkaW5hdGVzW2ldIC0geCkgKiBmYWN0b3IpOwogICAgICB9CiAgICB9CiAgfQp9CmNsYXNzIENvbXBvc2l0ZUdseXBoIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBmbGFncywKICAgIGdseXBoSW5kZXgsCiAgICBhcmd1bWVudDEsCiAgICBhcmd1bWVudDIsCiAgICB0cmFuc2YsCiAgICBpbnN0cnVjdGlvbnMKICB9KSB7CiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgICB0aGlzLmdseXBoSW5kZXggPSBnbHlwaEluZGV4OwogICAgdGhpcy5hcmd1bWVudDEgPSBhcmd1bWVudDE7CiAgICB0aGlzLmFyZ3VtZW50MiA9IGFyZ3VtZW50MjsKICAgIHRoaXMudHJhbnNmID0gdHJhbnNmOwogICAgdGhpcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYpIHsKICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBjb25zdCB0cmFuc2YgPSBbXTsKICAgIGxldCBmbGFncyA9IGdseWYuZ2V0VWludDE2KHBvcyk7CiAgICBjb25zdCBnbHlwaEluZGV4ID0gZ2x5Zi5nZXRVaW50MTYocG9zICsgMik7CiAgICBwb3MgKz0gNDsKICAgIGxldCBhcmd1bWVudDEsIGFyZ3VtZW50MjsKICAgIGlmIChmbGFncyAmIEFSR18xX0FORF8yX0FSRV9XT1JEUykgewogICAgICBpZiAoZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMpIHsKICAgICAgICBhcmd1bWVudDEgPSBnbHlmLmdldEludDE2KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRJbnQxNihwb3MgKyAyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcmd1bWVudDEgPSBnbHlmLmdldFVpbnQxNihwb3MpOwogICAgICAgIGFyZ3VtZW50MiA9IGdseWYuZ2V0VWludDE2KHBvcyArIDIpOwogICAgICB9CiAgICAgIHBvcyArPSA0OwogICAgICBmbGFncyBePSBBUkdfMV9BTkRfMl9BUkVfV09SRFM7CiAgICB9IGVsc2UgewogICAgICBpZiAoZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMpIHsKICAgICAgICBhcmd1bWVudDEgPSBnbHlmLmdldEludDgocG9zKTsKICAgICAgICBhcmd1bWVudDIgPSBnbHlmLmdldEludDgocG9zICsgMSk7CiAgICAgI
20H0gZWxzZSB7CiAgICAgICAgYXJndW1lbnQxID0gZ2x5Zi5nZXRVaW50OChwb3MpOwogICAgICAgIGFyZ3VtZW50MiA9IGdseWYuZ2V0VWludDgocG9zICsgMSk7CiAgICAgIH0KICAgICAgcG9zICs9IDI7CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBXRV9IQVZFX0FfU0NBTEUpIHsKICAgICAgdHJhbnNmLnB1c2goZ2x5Zi5nZXRVaW50MTYocG9zKSk7CiAgICAgIHBvcyArPSAyOwogICAgfSBlbHNlIGlmIChmbGFncyAmIFdFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSkgewogICAgICB0cmFuc2YucHVzaChnbHlmLmdldFVpbnQxNihwb3MpLCBnbHlmLmdldFVpbnQxNihwb3MgKyAyKSk7CiAgICAgIHBvcyArPSA0OwogICAgfSBlbHNlIGlmIChmbGFncyAmIFdFX0hBVkVfQV9UV09fQllfVFdPKSB7CiAgICAgIHRyYW5zZi5wdXNoKGdseWYuZ2V0VWludDE2KHBvcyksIGdseWYuZ2V0VWludDE2KHBvcyArIDIpLCBnbHlmLmdldFVpbnQxNihwb3MgKyA0KSwgZ2x5Zi5nZXRVaW50MTYocG9zICsgNikpOwogICAgICBwb3MgKz0gODsKICAgIH0KICAgIGxldCBpbnN0cnVjdGlvbnMgPSBudWxsOwogICAgaWYgKGZsYWdzICYgV0VfSEFWRV9JTlNUUlVDVElPTlMpIHsKICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25MZW5ndGggPSBnbHlmLmdldFVpbnQxNihwb3MpOwogICAgICBwb3MgKz0gMjsKICAgICAgaW5zdHJ1Y3Rpb25zID0gbmV3IFVpbnQ4QXJyYXkoZ2x5Zikuc2xpY2UocG9zLCBwb3MgKyBpbnN0cnVjdGlvbkxlbmd0aCk7CiAgICAgIHBvcyArPSBpbnN0cnVjdGlvbkxlbmd0aDsKICAgIH0KICAgIHJldHVybiBbcG9zIC0gc3BvcywgbmV3IENvbXBvc2l0ZUdseXBoKHsKICAgICAgZmxhZ3MsCiAgICAgIGdseXBoSW5kZXgsCiAgICAgIGFyZ3VtZW50MSwKICAgICAgYXJndW1lbnQyLAogICAgICB0cmFuc2YsCiAgICAgIGluc3RydWN0aW9ucwogICAgfSldOwogIH0KICBnZXRTaXplKCkgewogICAgbGV0IHNpemUgPSAyICsgMiArIHRoaXMudHJhbnNmLmxlbmd0aCAqIDI7CiAgICBpZiAodGhpcy5mbGFncyAmIFdFX0hBVkVfSU5TVFJVQ1RJT05TKSB7CiAgICAgIHNpemUgKz0gMiArIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aDsKICAgIH0KICAgIHNpemUgKz0gMjsKICAgIGlmICh0aGlzLmZsYWdzICYgMikgewogICAgICBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQxIDw9IDEyNyAmJiB0aGlzLmFyZ3VtZW50MiA+PSAtMTI4ICYmIHRoaXMuYXJndW1lbnQyIDw9IDEyNykpIHsKICAgICAgICBzaXplICs9IDI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAwICYmIHRoaXMuYXJndW1lbnQxIDw9IDI1NSAmJiB0aGlzLmFyZ3VtZW50MiA+PSAwICYmIHRoaXMuYXJndW1lbnQyIDw9IDI1NSkpIHsKICAgICAgc2l6ZSArPSAyOwogICAgfQogICAgcmV0dXJuIHNpemU7CiAgfQogIHdyaXRlKHBvcywgYnVmKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgaWYgKHRoaXMuZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMpIHsKICAgICAgaWYgKCEodGhpcy5hcmd1bWVudDEgPj0gLTEyOCAmJiB0aGlzLmFyZ3VtZW50MSA8PSAxMjcgJiYgdGhpcy5hcmd1bWVudDIgPj0gLTEyOCAmJiB0aGlzLmFyZ3VtZW50MiA8PSAxMjcpKSB7CiAgICAgICAgdGhpcy5mbGFncyB8PSBBUkdfMV9BTkRfMl9BUkVfV09SRFM7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAwICYmIHRoaXMuYXJndW1lbnQxIDw9IDI1NSAmJiB0aGlzLmFyZ3VtZW50MiA+PSAwICYmIHRoaXMuYXJndW1lbnQyIDw9IDI1NSkpIHsKICAgICAgdGhpcy5mbGFncyB8PSBBUkdfMV9BTkRfMl9BUkVfV09SRFM7CiAgICB9CiAgICBidWYuc2V0VWludDE2KHBvcywgdGhpcy5mbGFncyk7CiAgICBidWYuc2V0VWludDE2KHBvcyArIDIsIHRoaXMuZ2x5cGhJbmRleCk7CiAgICBwb3MgKz0gNDsKICAgIGlmICh0aGlzLmZsYWdzICYgQVJHXzFfQU5EXzJfQVJFX1dPUkRTKSB7CiAgICAgIGlmICh0aGlzLmZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTKSB7CiAgICAgICAgYnVmLnNldEludDE2KHBvcywgdGhpcy5hcmd1bWVudDEpOwogICAgICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyAyLCB0aGlzLmFyZ3VtZW50Mik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVmLnNldFVpbnQxNihwb3MsIHRoaXMuYXJndW1lbnQxKTsKICAgICAgICBidWYuc2V0VWludDE2KHBvcyArIDIsIHRoaXMuYXJndW1lbnQyKTsKICAgICAgfQogICAgICBwb3MgKz0gNDsKICAgIH0gZWxzZSB7CiAgICAgIGJ1Zi5zZXRVaW50OChwb3MsIHRoaXMuYXJndW1lbnQxKTsKICAgICAgYnVmLnNldFVpbnQ4KHBvcyArIDEsIHRoaXMuYXJndW1lbnQyKTsKICAgICAgcG9zICs9IDI7CiAgICB9CiAgICBpZiAodGhpcy5mbGFncyAmIFdFX0hBVkVfSU5TVFJVQ1RJT05TKSB7CiAgICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpOwogICAgICBwb3MgKz0gMjsKICAgICAgaWYgKHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCkgewogICAgICAgIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIDAsIGJ1Zi5idWZmZXIuYnl0ZUxlbmd0aCkuc2V0KHRoaXMuaW5zdHJ1Y3Rpb25zLCBwb3MpOwogICAgICAgIHBvcyArPSB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3MgLSBzcG9zOwogIH0KICBzY2FsZSh4LCBmYWN0b3IpIHt9Cn0KCjsvLyAuL3NyYy9jb3JlL29wZW50eXBlX2ZpbGVfYnVpbGRlci5qcwoKCgoKCgoKCgpmdW5jdGlvbiB3cml0ZUludDE2KGRlc3QsIG9mZnNldCwgbnVtKSB7CiAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDggJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gJiAweGZmOwp9CmZ1bmN0aW9uIHdyaXRlSW50MzIoZGVzdCwgb2Zmc2V0LCBudW0pIHsKICBkZXN0W29mZnNldF0gPSBudW0gPj4gMjQgJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gPj4gMTYgJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgMl0gPSBudW0gPj4gOCAmIDB4ZmY7CiAgZGVzdFtvZmZzZXQgKyAzXSA9IG51bSAmIDB4ZmY7Cn0KZnVuY3Rpb24gd3JpdGVEYXRhKGRlc3QsIG9mZnNldCwgZGF0YSkgewogIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgZGVzdC5zZXQoZGF0YSwgb2Zmc2V0KTsKICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGRlc3Rbb2Zmc2V0KytdID0gZGF0YS5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChjb25zdCBudW0gb2YgZGF0YSkgewogICAgICBkZXN0W29mZnNldCsrXSA9IG51bSAmIDB4ZmY7CiAgICB9CiAgfQp9CmNvbnN0IE9URl9IRUFERVJfU0laRSA9IDEyOwpjb25zdCBPVEZfVEFCTEVfRU5UUllfU0laRSA9IDE2OwpjbGFzcyBPcGVuVHlwZUZpbGVCdWlsZGVyIHsKICBjb25zdHJ1Y3RvcihzZm50KSB7CiAgICB0aGlzLnNmbnQgPSBzZm50OwogICAgdGhpcy50YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0KICBzdGF0aWMgZ2V0U2VhcmNoUGFyYW1zKGVudHJpZXNDb3VudCwgZW50cnlTaXplKSB7CiAgICBsZXQgbWF4UG93ZXIyID0gMSwKICAgICAgbG9nMiA9IDA7CiAgICB3aGlsZSAoKG1heFBvd2VyMiBeIGVudHJpZXNDb3VudCkgPiBtYXhQb3dlcjIpIHsKICAgICAgbWF4UG93ZXIyIDw8PSAxOwogICAgICBsb2cyKys7CiAgICB9CiAgICBjb25zdCBzZWFyY2hSYW5nZSA9IG1heFBvd2VyMiAqIGVudHJ5U2l6ZTsKICAgIHJldHVybi
20B7CiAgICAgIHJhbmdlOiBzZWFyY2hSYW5nZSwKICAgICAgZW50cnk6IGxvZzIsCiAgICAgIHJhbmdlU2hpZnQ6IGVudHJ5U2l6ZSAqIGVudHJpZXNDb3VudCAtIHNlYXJjaFJhbmdlCiAgICB9OwogIH0KICB0b0FycmF5KCkgewogICAgbGV0IHNmbnQgPSB0aGlzLnNmbnQ7CiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLnRhYmxlczsKICAgIGNvbnN0IHRhYmxlc05hbWVzID0gT2JqZWN0LmtleXModGFibGVzKTsKICAgIHRhYmxlc05hbWVzLnNvcnQoKTsKICAgIGNvbnN0IG51bVRhYmxlcyA9IHRhYmxlc05hbWVzLmxlbmd0aDsKICAgIGxldCBpLCBqLCBqaiwgdGFibGUsIHRhYmxlTmFtZTsKICAgIGxldCBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkUgKyBudW1UYWJsZXMgKiBPVEZfVEFCTEVfRU5UUllfU0laRTsKICAgIGNvbnN0IHRhYmxlT2Zmc2V0cyA9IFtvZmZzZXRdOwogICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CiAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTsKICAgICAgY29uc3QgcGFkZGVkTGVuZ3RoID0gKHRhYmxlLmxlbmd0aCArIDMgJiB+MykgPj4+IDA7CiAgICAgIG9mZnNldCArPSBwYWRkZWRMZW5ndGg7CiAgICAgIHRhYmxlT2Zmc2V0cy5wdXNoKG9mZnNldCk7CiAgICB9CiAgICBjb25zdCBmaWxlID0gbmV3IFVpbnQ4QXJyYXkob2Zmc2V0KTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CiAgICAgIHdyaXRlRGF0YShmaWxlLCB0YWJsZU9mZnNldHNbaV0sIHRhYmxlKTsKICAgIH0KICAgIGlmIChzZm50ID09PSAidHJ1ZSIpIHsKICAgICAgc2ZudCA9IHN0cmluZzMyKDB4MDAwMTAwMDApOwogICAgfQogICAgZmlsZVswXSA9IHNmbnQuY2hhckNvZGVBdCgwKSAmIDB4ZmY7CiAgICBmaWxlWzFdID0gc2ZudC5jaGFyQ29kZUF0KDEpICYgMHhmZjsKICAgIGZpbGVbMl0gPSBzZm50LmNoYXJDb2RlQXQoMikgJiAweGZmOwogICAgZmlsZVszXSA9IHNmbnQuY2hhckNvZGVBdCgzKSAmIDB4ZmY7CiAgICB3cml0ZUludDE2KGZpbGUsIDQsIG51bVRhYmxlcyk7CiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBPcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhudW1UYWJsZXMsIDE2KTsKICAgIHdyaXRlSW50MTYoZmlsZSwgNiwgc2VhcmNoUGFyYW1zLnJhbmdlKTsKICAgIHdyaXRlSW50MTYoZmlsZSwgOCwgc2VhcmNoUGFyYW1zLmVudHJ5KTsKICAgIHdyaXRlSW50MTYoZmlsZSwgMTAsIHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KTsKICAgIG9mZnNldCA9IE9URl9IRUFERVJfU0laRTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICB0YWJsZU5hbWUgPSB0YWJsZXNOYW1lc1tpXTsKICAgICAgZmlsZVtvZmZzZXRdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMCkgJiAweGZmOwogICAgICBmaWxlW29mZnNldCArIDFdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMSkgJiAweGZmOwogICAgICBmaWxlW29mZnNldCArIDJdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMikgJiAweGZmOwogICAgICBmaWxlW29mZnNldCArIDNdID0gdGFibGVOYW1lLmNoYXJDb2RlQXQoMykgJiAweGZmOwogICAgICBsZXQgY2hlY2tzdW0gPSAwOwogICAgICBmb3IgKGogPSB0YWJsZU9mZnNldHNbaV0sIGpqID0gdGFibGVPZmZzZXRzW2kgKyAxXTsgaiA8IGpqOyBqICs9IDQpIHsKICAgICAgICBjb25zdCBxdWFkID0gcmVhZFVpbnQzMihmaWxlLCBqKTsKICAgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtICsgcXVhZCA+Pj4gMDsKICAgICAgfQogICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDQsIGNoZWNrc3VtKTsKICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyA4LCB0YWJsZU9mZnNldHNbaV0pOwogICAgICB3cml0ZUludDMyKGZpbGUsIG9mZnNldCArIDEyLCB0YWJsZXNbdGFibGVOYW1lXS5sZW5ndGgpOwogICAgICBvZmZzZXQgKz0gT1RGX1RBQkxFX0VOVFJZX1NJWkU7CiAgICB9CiAgICByZXR1cm4gZmlsZTsKICB9CiAgYWRkVGFibGUodGFnLCBkYXRhKSB7CiAgICBpZiAodGFnIGluIHRoaXMudGFibGVzKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVGFibGUgIiArIHRhZyArICIgYWxyZWFkeSBleGlzdHMiKTsKICAgIH0KICAgIHRoaXMudGFibGVzW3RhZ10gPSBkYXRhOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvdHlwZTFfcGFyc2VyLmpzCgoKCgoKCgoKCgoKY29uc3QgSElOVElOR19FTkFCTEVEID0gZmFsc2U7CmNvbnN0IENPTU1BTkRfTUFQID0gewogIGhzdGVtOiBbMV0sCiAgdnN0ZW06IFszXSwKICB2bW92ZXRvOiBbNF0sCiAgcmxpbmV0bzogWzVdLAogIGhsaW5ldG86IFs2XSwKICB2bGluZXRvOiBbN10sCiAgcnJjdXJ2ZXRvOiBbOF0sCiAgY2FsbHN1YnI6IFsxMF0sCiAgZmxleDogWzEyLCAzNV0sCiAgZHJvcDogWzEyLCAxOF0sCiAgZW5kY2hhcjogWzE0XSwKICBybW92ZXRvOiBbMjFdLAogIGhtb3ZldG86IFsyMl0sCiAgdmhjdXJ2ZXRvOiBbMzBdLAogIGh2Y3VydmV0bzogWzMxXQp9OwpjbGFzcyBUeXBlMUNoYXJTdHJpbmcgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDA7CiAgICB0aGlzLmxzYiA9IDA7CiAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgIHRoaXMub3V0cHV0ID0gW107CiAgICB0aGlzLnN0YWNrID0gW107CiAgfQogIGNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGNvbnN0IGNvdW50ID0gZW5jb2RlZC5sZW5ndGg7CiAgICBsZXQgZXJyb3IgPSBmYWxzZTsKICAgIGxldCB3eCwgc2J4LCBzdWJyTnVtYmVyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGxldCB2YWx1ZSA9IGVuY29kZWRbaV07CiAgICAgIGlmICh2YWx1ZSA8IDMyKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSAxMikgewogICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgKyBlbmNvZGVkWysraV07CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgI
20H0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGR5ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCwgZHkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bW92ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC5obGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC52bGluZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg2LCBDT01NQU5EX01BUC5ycmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghc3VicnNbc3Vick51bWJlcl0pIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmNvbnZlcnQoc3VicnNbc3Vick51bWJlcl0sIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHd4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgc2J4ID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgdGhpcy5sc2IgPSBzYng7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB3eDsKICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHd4LCBzYngpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaG1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgdGhpcy5vdXRwdXQucHVzaChDT01NQU5EX01BUC5lbmRjaGFyWzBdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnJtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgIGlmICh0aGlzLmZsZXhpbmcpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goMCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEsIENPTU1BTkRfTUFQLmhtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC52aGN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5odmN1cnZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMDoKICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMToKICAgICAgICAgICAgaWYgKCFISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLnZzdGVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDI6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyA2OgogICAgICAgICAgICBpZiAoc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgICAgICAgICAgIGNvbnN0IGFzYiA9IHRoaXMuc3RhY2suYXQoLTUpOwogICAgICAgICAgICAgI
20HRoaXMuc2VhYyA9IHRoaXMuc3RhY2suc3BsaWNlKC00LCA0KTsKICAgICAgICAgICAgICB0aGlzLnNlYWNbMF0gKz0gdGhpcy5sc2IgLSBhc2I7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDAsIENPTU1BTkRfTUFQLmVuZGNoYXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCg0LCBDT01NQU5EX01BUC5lbmRjaGFyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgNzoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgNCkgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IHNieSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OwogICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4LCBzYnkpOwogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMywgQ09NTUFORF9NQVAucm1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxMjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBudW0yID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtMSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChudW0xIC8gbnVtMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNjoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyTnVtYmVyID0gdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgY29uc3QgbnVtQXJncyA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmIChzdWJyTnVtYmVyID09PSAwICYmIG51bUFyZ3MgPT09IDMpIHsKICAgICAgICAgICAgICBjb25zdCBmbGV4QXJncyA9IHRoaXMuc3RhY2suc3BsaWNlKC0xNywgMTcpOwogICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmbGV4QXJnc1syXSArIGZsZXhBcmdzWzBdLCBmbGV4QXJnc1szXSArIGZsZXhBcmdzWzFdLCBmbGV4QXJnc1s0XSwgZmxleEFyZ3NbNV0sIGZsZXhBcmdzWzZdLCBmbGV4QXJnc1s3XSwgZmxleEFyZ3NbOF0sIGZsZXhBcmdzWzldLCBmbGV4QXJnc1sxMF0sIGZsZXhBcmdzWzExXSwgZmxleEFyZ3NbMTJdLCBmbGV4QXJnc1sxM10sIGZsZXhBcmdzWzE0XSk7CiAgICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDEzLCBDT01NQU5EX01BUC5mbGV4LCB0cnVlKTsKICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMTVdLCBmbGV4QXJnc1sxNl0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN1YnJOdW1iZXIgPT09IDEgJiYgbnVtQXJncyA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuZmxleGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE3OgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMzM6CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3YXJuKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicgKyB2YWx1ZSArICciJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNDYpIHsKICAgICAgICB2YWx1ZSAtPSAxMzk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7CiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkgewogICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAyNCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAxNiB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCA4IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDA7CiAgICAgIH0KICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBlcnJvcjsKICB9CiAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgewogICAgY29uc3Qgc3RhY2tMZW5ndGggPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3Qgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOwogICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhY2tMZW5ndGg7IGkrKykgewogICAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrW2ldOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI4LCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IDY1NTM2ICogdmFsdWUgfCAwOwogICAgICAgI
20HRoaXMub3V0cHV0LnB1c2goMjU1LCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMub3V0cHV0LnB1c2goLi4uY29tbWFuZCk7CiAgICBpZiAoa2VlcFN0YWNrKSB7CiAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNvbnN0IEVFWEVDX0VOQ1JZUFRfS0VZID0gNTU2NjU7CmNvbnN0IENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7CmZ1bmN0aW9uIGlzSGV4RGlnaXQoY29kZSkgewogIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcgfHwgY29kZSA+PSA2NSAmJiBjb2RlIDw9IDcwIHx8IGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDI7Cn0KZnVuY3Rpb24gZGVjcnlwdChkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKICBpZiAoZGlzY2FyZE51bWJlciA+PSBkYXRhLmxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICBjb25zdCBjMSA9IDUyODQ1LAogICAgYzIgPSAyMjcxOTsKICBsZXQgciA9IGtleSB8IDAsCiAgICBpLAogICAgajsKICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7CiAgICByID0gKGRhdGFbaV0gKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOwogIH0KICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoIC0gZGlzY2FyZE51bWJlcjsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7CiAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHsKICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpXTsKICAgIGRlY3J5cHRlZFtqXSA9IHZhbHVlIF4gciA+PiA4OwogICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgfQogIHJldHVybiBkZWNyeXB0ZWQ7Cn0KZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgewogIGNvbnN0IGMxID0gNTI4NDUsCiAgICBjMiA9IDIyNzE5OwogIGxldCByID0ga2V5IHwgMDsKICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoLAogICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShtYXliZUxlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBjb25zdCBkaWdpdDEgPSBkYXRhW2ldOwogICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0MSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpKys7CiAgICBsZXQgZGlnaXQyOwogICAgd2hpbGUgKGkgPCBjb3VudCAmJiAhaXNIZXhEaWdpdChkaWdpdDIgPSBkYXRhW2ldKSkgewogICAgICBpKys7CiAgICB9CiAgICBpZiAoaSA8IGNvdW50KSB7CiAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShkaWdpdDEsIGRpZ2l0MiksIDE2KTsKICAgICAgZGVjcnlwdGVkW2orK10gPSB2YWx1ZSBeIHIgPj4gODsKICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgICB9CiAgfQogIHJldHVybiBkZWNyeXB0ZWQuc2xpY2UoZGlzY2FyZE51bWJlciwgaik7Cn0KZnVuY3Rpb24gaXNTcGVjaWFsKGMpIHsKICByZXR1cm4gYyA9PT0gMHgyZiB8fCBjID09PSAweDViIHx8IGMgPT09IDB4NWQgfHwgYyA9PT0gMHg3YiB8fCBjID09PSAweDdkIHx8IGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOTsKfQpjbGFzcyBUeXBlMVBhcnNlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBlbmNyeXB0ZWQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgY29uc3QgZGF0YSA9IHN0cmVhbS5nZXRCeXRlcygpOwogICAgICBjb25zdCBpc0JpbmFyeSA9ICEoKGlzSGV4RGlnaXQoZGF0YVswXSkgfHwgaXNXaGl0ZVNwYWNlKGRhdGFbMF0pKSAmJiBpc0hleERpZ2l0KGRhdGFbMV0pICYmIGlzSGV4RGlnaXQoZGF0YVsyXSkgJiYgaXNIZXhEaWdpdChkYXRhWzNdKSAmJiBpc0hleERpZ2l0KGRhdGFbNF0pICYmIGlzSGV4RGlnaXQoZGF0YVs1XSkgJiYgaXNIZXhEaWdpdChkYXRhWzZdKSAmJiBpc0hleERpZ2l0KGRhdGFbN10pKTsKICAgICAgc3RyZWFtID0gbmV3IFN0cmVhbShpc0JpbmFyeSA/IGRlY3J5cHQoZGF0YSwgRUVYRUNfRU5DUllQVF9LRVksIDQpIDogZGVjcnlwdEFzY2lpKGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSk7CiAgICB9CiAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMubmV4dENoYXIoKTsKICB9CiAgcmVhZE51bWJlckFycmF5KCkgewogICAgdGhpcy5nZXRUb2tlbigpOwogICAgY29uc3QgYXJyYXkgPSBbXTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJdIiB8fCB0b2tlbiA9PT0gIn0iKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYXJyYXkucHVzaChwYXJzZUZsb2F0KHRva2VuIHx8IDApKTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CiAgcmVhZE51bWJlcigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHBhcnNlRmxvYXQodG9rZW4gfHwgMCk7CiAgfQogIHJlYWRJbnQoKSB7CiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgIHJldHVybiBwYXJzZUludCh0b2tlbiB8fCAwLCAxMCkgfCAwOwogIH0KICByZWFkQm9vbGVhbigpIHsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgcmV0dXJuIHRva2VuID09PSAidHJ1ZSIgPyAxIDogMDsKICB9CiAgbmV4dENoYXIoKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICB9CiAgcHJldkNoYX
20IoKSB7CiAgICB0aGlzLnN0cmVhbS5za2lwKC0yKTsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBnZXRUb2tlbigpIHsKICAgIGxldCBjb21tZW50ID0gZmFsc2U7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGNoID09PSAtMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChjb21tZW50KSB7CiAgICAgICAgaWYgKGNoID09PSAweDBhIHx8IGNoID09PSAweDBkKSB7CiAgICAgICAgICBjb21tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDI1KSB7CiAgICAgICAgY29tbWVudCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoIWlzV2hpdGVTcGFjZShjaCkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChpc1NwZWNpYWwoY2gpKSB7CiAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgbGV0IHRva2VuID0gIiI7CiAgICBkbyB7CiAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0gd2hpbGUgKGNoID49IDAgJiYgIWlzV2hpdGVTcGFjZShjaCkgJiYgIWlzU3BlY2lhbChjaCkpOwogICAgcmV0dXJuIHRva2VuOwogIH0KICByZWFkQ2hhclN0cmluZ3MoYnl0ZXMsIGxlbklWKSB7CiAgICBpZiAobGVuSVYgPT09IC0xKSB7CiAgICAgIHJldHVybiBieXRlczsKICAgIH0KICAgIHJldHVybiBkZWNyeXB0KGJ5dGVzLCBDSEFSX1NUUlNfRU5DUllQVF9LRVksIGxlbklWKTsKICB9CiAgZXh0cmFjdEZvbnRQcm9ncmFtKHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgY29uc3Qgc3VicnMgPSBbXSwKICAgICAgY2hhcnN0cmluZ3MgPSBbXTsKICAgIGNvbnN0IHByaXZhdGVEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHByaXZhdGVEYXRhLmxlbklWID0gNDsKICAgIGNvbnN0IHByb2dyYW0gPSB7CiAgICAgIHN1YnJzOiBbXSwKICAgICAgY2hhcnN0cmluZ3M6IFtdLAogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgcHJpdmF0ZURhdGEKICAgICAgfQogICAgfTsKICAgIGxldCB0b2tlbiwgbGVuZ3RoLCBkYXRhLCBsZW5JVjsKICAgIHdoaWxlICgodG9rZW4gPSB0aGlzLmdldFRva2VuKCkpICE9PSBudWxsKSB7CiAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICBjYXNlICJDaGFyU3RyaW5ncyI6CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSAiZW5kIikgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b2tlbiAhPT0gIi8iKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gIi8iKSB7CiAgICAgICAgICAgICAgdGhpcy5wcmV2Q2hhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoYXJzdHJpbmdzLnB1c2goewogICAgICAgICAgICAgIGdseXBoLAogICAgICAgICAgICAgIGVuY29kZWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdWJycyI6CiAgICAgICAgICB0aGlzLnJlYWRJbnQoKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHdoaWxlICh0aGlzLmdldFRva2VuKCkgPT09ICJkdXAiKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgIGxlbmd0aCA9IHRoaXMucmVhZEludCgpOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGRhdGEgPSBsZW5ndGggPiAwID8gc3RyZWFtLmdldEJ5dGVzKGxlbmd0aCkgOiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgICAgICAgbGVuSVYgPSBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGEubGVuSVY7CiAgICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSB0aGlzLnJlYWRDaGFyU3RyaW5ncyhkYXRhLCBsZW5JVik7CiAgICAgICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gIm5vYWNjZXNzIikgewogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJyc1tpbmRleF0gPSBlbmNvZGVkOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVZhbHVlcyI6CiAgICAgICAgY2FzZSAiT3RoZXJCbHVlcyI6CiAgICAgICAgY2FzZSAiRmFtaWx5Qmx1ZXMiOgogICAgICAgIGNhc2UgIkZhbWlseU90aGVyQmx1ZXMiOgogICAgICAgICAgY29uc3QgYmx1ZUFycmF
205ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIGlmIChibHVlQXJyYXkubGVuZ3RoID4gMCAmJiBibHVlQXJyYXkubGVuZ3RoICUgMiA9PT0gMCAmJiBISU5USU5HX0VOQUJMRUQpIHsKICAgICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IGJsdWVBcnJheTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN0ZW1TbmFwSCI6CiAgICAgICAgY2FzZSAiU3RlbVNuYXBWIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3RkSFciOgogICAgICAgIGNhc2UgIlN0ZFZXIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpWzBdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQmx1ZVNoaWZ0IjoKICAgICAgICBjYXNlICJsZW5JViI6CiAgICAgICAgY2FzZSAiQmx1ZUZ1enoiOgogICAgICAgIGNhc2UgIkJsdWVTY2FsZSI6CiAgICAgICAgY2FzZSAiTGFuZ3VhZ2VHcm91cCI6CiAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJFeHBhbnNpb25GYWN0b3IiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlcigpIHx8IDAuMDY7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb3JjZUJvbGQiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZEJvb2xlYW4oKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZW5jb2RlZCwKICAgICAgZ2x5cGgKICAgIH0gb2YgY2hhcnN0cmluZ3MpIHsKICAgICAgY29uc3QgY2hhclN0cmluZyA9IG5ldyBUeXBlMUNoYXJTdHJpbmc
20oKTsKICAgICAgY29uc3QgZXJyb3IgPSBjaGFyU3RyaW5nLmNvbnZlcnQoZW5jb2RlZCwgc3VicnMsIHRoaXMuc2VhY0FuYWx5c2lzRW5hYmxlZCk7CiAgICAgIGxldCBvdXRwdXQgPSBjaGFyU3RyaW5nLm91dHB1dDsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgb3V0cHV0ID0gWzE0XTsKICAgICAgfQogICAgICBjb25zdCBjaGFyU3RyaW5nT2JqZWN0ID0gewogICAgICAgIGdseXBoTmFtZTogZ2x5cGgsCiAgICAgICAgY2hhcnN0cmluZzogb3V0cHV0LAogICAgICAgIHdpZHRoOiBjaGFyU3RyaW5nLndpZHRoLAogICAgICAgIGxzYjogY2hhclN0cmluZy5sc2IsCiAgICAgICAgc2VhYzogY2hhclN0cmluZy5zZWFjCiAgICAgIH07CiAgICAgIGlmIChnbHlwaCA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgcHJvZ3JhbS5jaGFyc3RyaW5ncy51bnNoaWZ0KGNoYXJTdHJpbmdPYmplY3QpOwogICAgICB9IGVsc2UgewogICAgICAgIHByb2dyYW0uY2hhcnN0cmluZ3MucHVzaChjaGFyU3RyaW5nT2JqZWN0KTsKICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgICBjb25zdCBpbmRleCA9IHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nLmluZGV4T2YoZ2x5cGgpOwogICAgICAgIGlmIChpbmRleCA+IC0xICYmIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9PT0gdW5kZWZpbmVkICYmIGluZGV4ID49IHByb3BlcnRpZXMuZmlyc3RDaGFyICYmIGluZGV4IDw9IHByb3BlcnRpZXMubGFzdENoYXIpIHsKICAgICAgICAgIHByb3BlcnRpZXMud2lkdGhzW2luZGV4XSA9IGNoYXJTdHJpbmcud2lkdGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gcHJvZ3JhbTsKICB9CiAgZXh0cmFjdEZvbnRIZWFkZXIocHJvcGVydGllcykgewogICAgbGV0IHRva2VuOwogICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgIGNhc2UgIkZvbnRNYXRyaXgiOgogICAgICAgICAgY29uc3QgbWF0cml4ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IG1hdHJpeDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkVuY29kaW5nIjoKICAgICAgICAgIGNvbnN0IGVuY29kaW5nQXJnID0gdGh
20pcy5nZXRUb2tlbigpOwogICAgICAgICAgbGV0IGVuY29kaW5nOwogICAgICAgICAgaWYgKCEvXlxkKyQvLnRlc3QoZW5jb2RpbmdBcmcpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0RW5jb2RpbmcoZW5jb2RpbmdBcmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTsKICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSAiZHVwIiAmJiB0b2tlbiAhPT0gImRlZiIpIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAiZGVmIikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOwogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkZvbnRCQm94IjoKICAgICAgICAgIGNvbnN0IGZvbnRCQm94ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQoKOy8vIC4vc3JjL2NvcmUvdHlwZTFfZm9udC5qcwoKCgoKCgoKZnVuY3Rpb24gZmluZEJsb2NrKHN0cmVhbUJ5dGVzLCBzaWduYXR1cmUsIHN0YXJ0SW5kZXgpIHsKICBjb25zdCBzdHJlYW1CeXRlc0xlbmd0aCA9IHN0cmVhbUJ5dGVzLmxlbmd0aDsKICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOwogIGNvbnN0IHNjYW5MZW5ndGggPSBzdHJlYW1CeXRlc0xlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDsKICBsZXQgaSA9IHN0YXJ0SW5kZXgsCiAgICBmb3VuZCA9IGZhbHNlOwogIHdoaWxlIChpIDwgc2Nhbkxlbmd0aCkgewogICAgbGV0IGogPSAwOwogICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc3RyZWFtQnl0ZXNbaSArIGpdID09PSBzaWduYXR1cmVbal0pIHsKICAgICAgaisrOwogICAgfQogICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7CiAgICAgIGkgKz0gajsKICAgICAgd2hpbGUgKGkgPCBzdHJlYW1CeXRlc0xlbmd0aCAmJiBpc1doaXRlU3BhY2Uoc3RyZWFtQnl0ZXNbaV0pKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpKys7CiAgfQogIHJldHVybiB7CiAgICBmb3VuZCwKICAgIGxlbmd0aDogaQogIH07Cn0KZnVuY3Rpb24gZ2V0SGVhZGVyQmxvY2soc3RyZWFtLCBzdWdnZXN0ZWRMZW5ndGgpIHsKICBjb25zdCBFRVhFQ19TSUdOQVRVUkUgPSBbMHg2NSwgMHg2NSwgMHg3OCwgMHg2NSwgMHg2M107CiAgY29uc3Qgc3RyZWFtU3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogIGxldCBoZWFkZXJCeXRlcywgaGVhZGVyQnl0ZXNMZW5ndGgsIGJsb2NrOwogIHRyeSB7CiAgICBoZWFkZXJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcyhzdWdnZXN0ZWRMZW5ndGgpOwogICAgaGVhZGVyQnl0ZXNMZW5ndGggPSBoZWFkZXJCeXRlcy5sZW5ndGg7CiAgfSBjYXRjaCB7fQogIGlmIChoZWFkZXJCeXRlc0xlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7CiAgICBibG9jayA9IGZpbmRCbG9jayhoZWFkZXJCeXRlcywgRUVYRUNfU0lHTkFUVVJFLCBzdWdnZXN0ZWRMZW5ndGggLSAyICogRUVYRUNfU0lHTkFUVVJFLmxlbmd0aCk7CiAgICBpZiAoYmxvY2suZm91bmQgJiYgYmxvY2subGVuZ3RoID09PSBzdWdnZXN0ZWRMZW5ndGgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzdHJlYW06IG5ldyBTdHJlYW0oaGVhZGVyQnl0ZXMpLAogICAgICAgIGxlbmd0aDogc3VnZ2VzdGVkTGVuZ3RoCiAgICAgIH07CiAgICB9CiAgfQogIHdhcm4oJ0ludmFsaWQgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7CiAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXJ0UG9zOwogIGNvbnN0IFNDQU5fQkxPQ0tfTEVOR1RIID0gMjA0ODsKICBsZXQgYWN0dWFsTGVuZ3RoOwogIHdoaWxlICh0cnVlKSB7CiAgICBjb25zdCBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKFNDQU5fQkxPQ0tfTEVOR1RIKTsKICAgIGJsb2NrID0gZmluZEJsb2NrKHNjYW5CeXRlcywgRUVYRUNfU0lHTkFUVVJFLCAwKTsKICAgIGlmIChibG9jay5sZW5ndGggPT09IDApIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBzdHJlYW0ucG9zICs9IGJsb2NrLmxlbmd0aDsKICAgIGlmIChibG9jay5mb3VuZCkgewogICAgICBhY3R1YWxMZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RyZWFtU3RhcnRQb3M7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhcnRQb3M7CiAgaWYgKGFjdHVhbExlbmd0aCkgewogICAgcmV0dXJuIHsKICAgICAgc3RyZWFtOiBuZXcgU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhhY3R1YWxMZW5ndGgpKSwKICAgICAgbGVuZ3RoOiBhY3R1YWxMZW5ndGgKICAgIH07CiAgfQogIHdhcm4oJ1VuYWJsZSB0byByZWNvdmVyICJMZW5ndGgxIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHVzaW5nIGFzIGlzLicpOwogIHJldHVybi
20B7CiAgICBzdHJlYW06IG5ldyBTdHJlYW0oc3RyZWFtLmdldEJ5dGVzKHN1Z2dlc3RlZExlbmd0aCkpLAogICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKICB9Owp9CmZ1bmN0aW9uIGdldEVleGVjQmxvY2soc3RyZWFtLCBzdWdnZXN0ZWRMZW5ndGgpIHsKICBjb25zdCBlZXhlY0J5dGVzID0gc3RyZWFtLmdldEJ5dGVzKCk7CiAgaWYgKGVleGVjQnl0ZXMubGVuZ3RoID09PSAwKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImdldEVleGVjQmxvY2sgLSBubyBmb250IHByb2dyYW0gZm91bmQuIik7CiAgfQogIHJldHVybiB7CiAgICBzdHJlYW06IG5ldyBTdHJlYW0oZWV4ZWNCeXRlcyksCiAgICBsZW5ndGg6IGVleGVjQnl0ZXMubGVuZ3RoCiAgfTsKfQpjbGFzcyBUeXBlMUZvbnQgewogIGNvbnN0cnVjdG9yKG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IFBGQl9IRUFERVJfU0laRSA9IDY7CiAgICBsZXQgaGVhZGVyQmxvY2tMZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDE7CiAgICBsZXQgZWV4ZWNCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMjsKICAgIGxldCBwZmJIZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyhQRkJfSEVBREVSX1NJWkUpOwogICAgY29uc3QgcGZiSGVhZGVyUHJlc2VudCA9IHBmYkhlYWRlclswXSA9PT0gMHg4MCAmJiBwZmJIZWFkZXJbMV0gPT09IDB4MDE7CiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgewogICAgICBmaWxlLnNraXAoUEZCX0hFQURFUl9TSVpFKTsKICAgICAgaGVhZGVyQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKICAgIH0KICAgIGNvbnN0IGhlYWRlckJsb2NrID0gZ2V0SGVhZGVyQmxvY2soZmlsZSwgaGVhZGVyQmxvY2tMZW5ndGgpOwogICAgY29uc3QgaGVhZGVyQmxvY2tQYXJzZXIgPSBuZXcgVHlwZTFQYXJzZXIoaGVhZGVyQmxvY2suc3RyZWFtLCBmYWxzZSwgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIGhlYWRlckJsb2NrUGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpOwogICAgaWYgKHBmYkhlYWRlclByZXNlbnQpIHsKICAgICAgcGZiSGVhZGVyID0gZmlsZS5nZXRCeXRlcyhQRkJfSEVBREVSX1NJWkUpOwogICAgICBlZXhlY0Jsb2NrTGVuZ3RoID0gcGZiSGVhZGVyWzVdIDw8IDI0IHwgcGZiSGVhZGVyWzRdIDw8IDE2IHwgcGZiSGVhZGVyWzNdIDw8IDggfCBwZmJIZWFkZXJbMl07CiAgICB9CiAgICBjb25zdCBlZXhlY0Jsb2NrID0gZ2V0RWV4ZWNCbG9jayhmaWxlLCBlZXhlY0Jsb2NrTGVuZ3RoKTsKICAgIGNvbnN0IGVleGVjQmxvY2tQYXJzZXIgPSBuZXcgVHlwZTFQYXJzZXIoZWV4ZWNCbG9jay5zdHJlYW0sIHRydWUsIFNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CiAgICBjb25zdCBkYXRhID0gZWV4ZWNCbG9ja1BhcnNlci5leHRyYWN0Rm9udFByb2dyYW0ocHJvcGVydGllcyk7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhLnByb3BlcnRpZXMpIHsKICAgICAgcHJvcGVydGllc1trZXldID0gZGF0YS5wcm9wZXJ0aWVzW2tleV07CiAgICB9CiAgICBjb25zdCBjaGFyc3RyaW5ncyA9IGRhdGEuY2hhcnN0cmluZ3M7CiAgICBjb25zdCB0eXBlMkNoYXJzdHJpbmdzID0gdGhpcy5nZXRUeXBlMkNoYXJzdHJpbmdzKGNoYXJzdHJpbmdzKTsKICAgIGNvbnN0IHN1YnJzID0gdGhpcy5nZXRUeXBlMlN1YnJzKGRhdGEuc3VicnMpOwogICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzOwogICAgdGhpcy5kYXRhID0gdGhpcy53cmFwKG5hbWUsIHR5cGUyQ2hhcnN0cmluZ3MsIHRoaXMuY2hhcnN0cmluZ3MsIHN1YnJzLCBwcm9wZXJ0aWVzKTsKICAgIHRoaXMuc2VhY3MgPSB0aGlzLmdldFNlYWNzKGRhdGEuY2hhcnN0cmluZ3MpOwogIH0KICBnZXQgbnVtR2x5cGhzKCkgewogICAgcmV0dXJuIHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoICsgMTsKICB9CiAgZ2V0Q2hhcnNldCgpIHsKICAgIGNvbnN0IGNoYXJzZXQgPSBbIi5ub3RkZWYiXTsKICAgIGZvciAoY29uc3QgewogICAgICBnbHlwaE5hbWUKICAgIH0gb2YgdGhpcy5jaGFyc3RyaW5ncykgewogICAgICBjaGFyc2V0LnB1c2goZ2x5cGhOYW1lKTsKICAgIH0KICAgIHJldHVybiBjaGFyc2V0OwogIH0KICBnZXRHbHlwaE1hcHBpbmcocHJvcGVydGllcykgewogICAgY29uc3QgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOwogICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgIGNvbnN0IGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChsZXQgZ2x5cGhJZCA9IDAsIGNoYXJzdHJpbmdzTGVuID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBnbHlwaElkIDwgY2hhcnN0cmluZ3NMZW47IGdseXBoSWQrKykgewogICAgICAgIGNvbnN0IGNoYXJDb2RlID0gcHJvcGVydGllcy5jTWFwLmNoYXJDb2RlT2YoZ2x5cGhJZCk7CiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCArIDE7CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwogICAgfQogICAgY29uc3QgZ2x5cGhOYW1lcyA9IFsiLm5vdGRlZiJdOwogICAgbGV0IGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhJZDsKICAgIGZvciAoZ2x5cGhJZCA9IDA7IGdseXBoSWQgPCBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQrKykgewogICAgICBnbHlwaE5hbWVzLnB1c2goY2hhcnN0cmluZ3NbZ2x5cGhJZF0uZ2x5cGhOYW1lKTsKICAgIH0KICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc7CiAgICBpZiAoZW5jb2RpbmcpIHsKICAgICAgYnVpbHRJbkVuY29kaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBlbmNvZGluZykgewogICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgICBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybi
20B0eXBlMUZvbnRHbHlwaE1hcHBpbmcocHJvcGVydGllcywgYnVpbHRJbkVuY29kaW5nLCBnbHlwaE5hbWVzKTsKICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLm51bUdseXBocykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoaWQgPT09IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBnbHlwaCA9IHRoaXMuY2hhcnN0cmluZ3NbaWQgLSAxXTsKICAgIHJldHVybiBnbHlwaC5jaGFyc3RyaW5nLmxlbmd0aCA+IDA7CiAgfQogIGdldFNlYWNzKGNoYXJzdHJpbmdzKSB7CiAgICBjb25zdCBzZWFjTWFwID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFyc3RyaW5ncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmcgPSBjaGFyc3RyaW5nc1tpXTsKICAgICAgaWYgKGNoYXJzdHJpbmcuc2VhYykgewogICAgICAgIHNlYWNNYXBbaSArIDFdID0gY2hhcnN0cmluZy5zZWFjOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VhY01hcDsKICB9CiAgZ2V0VHlwZTJDaGFyc3RyaW5ncyh0eXBlMUNoYXJzdHJpbmdzKSB7CiAgICBjb25zdCB0eXBlMkNoYXJzdHJpbmdzID0gW107CiAgICBmb3IgKGNvbnN0IHR5cGUxQ2hhcnN0cmluZyBvZiB0eXBlMUNoYXJzdHJpbmdzKSB7CiAgICAgIHR5cGUyQ2hhcnN0cmluZ3MucHVzaCh0eXBlMUNoYXJzdHJpbmcuY2hhcnN0cmluZyk7CiAgICB9CiAgICByZXR1cm4gdHlwZTJDaGFyc3RyaW5nczsKICB9CiAgZ2V0VHlwZTJTdWJycyh0eXBlMVN1YnJzKSB7CiAgICBsZXQgYmlhcyA9IDA7CiAgICBjb25zdCBjb3VudCA9IHR5cGUxU3VicnMubGVuZ3RoOwogICAgaWYgKGNvdW50IDwgMTEzMykgewogICAgICBiaWFzID0gMTA3OwogICAgfSBlbHNlIGlmIChjb3VudCA8IDMzNzY5KSB7CiAgICAgIGJpYXMgPSAxMTMxOwogICAgfSBlbHNlIHsKICAgICAgYmlhcyA9IDMyNzY4OwogICAgfQogICAgY29uc3QgdHlwZTJTdWJycyA9IFtdOwogICAgbGV0IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYmlhczsgaSsrKSB7CiAgICAgIHR5cGUyU3VicnMucHVzaChbMHgwYl0pOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgdHlwZTJTdWJycy5wdXNoKHR5cGUxU3VicnNbaV0pOwogICAgfQogICAgcmV0dXJuIHR5cGUyU3VicnM7CiAgfQogIHdyYXAobmFtZSwgZ2x5cGhzLCBjaGFyc3RyaW5ncywgc3VicnMsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IGNmZiA9IG5ldyBDRkYoKTsKICAgIGNmZi5oZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKDEsIDAsIDQsIDQpOwogICAgY2ZmLm5hbWVzID0gW25hbWVdOwogICAgY29uc3QgdG9wRGljdCA9IG5ldyBDRkZUb3BEaWN0KCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgidmVyc2lvbiIsIDM5MSk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiTm90aWNlIiwgMzkyKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGdWxsTmFtZSIsIDM5Myk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRmFtaWx5TmFtZSIsIDM5NCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiV2VpZ2h0IiwgMzk1KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJFbmNvZGluZyIsIG51bGwpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLCBwcm9wZXJ0aWVzLmZvbnRNYXRyaXgpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZvbnRCQm94IiwgcHJvcGVydGllcy5iYm94KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJjaGFyc2V0IiwgbnVsbCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiQ2hhclN0cmluZ3MiLCBudWxsKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJQcml2YXRlIiwgbnVsbCk7CiAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7CiAgICBjb25zdCBzdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIHN0cmluZ3MuYWRkKCJWZXJzaW9uIDAuMTEiKTsKICAgIHN0cmluZ3MuYWRkKCJTZWUgb3Jp
20Z2luYWwgbm90aWNlIik7CiAgICBzdHJpbmdzLmFkZChuYW1lKTsKICAgIHN0cmluZ3MuYWRkKG5hbWUpOwogICAgc3RyaW5ncy5hZGQoIk1lZGl1bSIpOwogICAgY2ZmLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgY2ZmLmdsb2JhbFN1YnJJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgY29uc3QgY291bnQgPSBnbHlwaHMubGVuZ3RoOwogICAgY29uc3QgY2hhcnNldEFycmF5ID0gWyIubm90ZGVmIl07CiAgICBsZXQgaSwgaWk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSBjaGFyc3RyaW5nc1tpXS5nbHlwaE5hbWU7CiAgICAgIGNvbnN0IGluZGV4ID0gQ0ZGU3RhbmRhcmRTdHJpbmdzLmluZGV4T2YoZ2x5cGhOYW1lKTsKICAgICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgIHN0cmluZ3MuYWRkKGdseXBoTmFtZSk7CiAgICAgIH0KICAgICAgY2hhcnNldEFycmF5LnB1c2goZ2x5cGhOYW1lKTsKICAgIH0KICAgIGNmZi5jaGFyc2V0ID0gbmV3IENGRkNoYXJzZXQoZmFsc2UsIDAsIGNoYXJzZXRBcnJheSk7CiAgICBjb25zdCBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChbMHg4YiwgMHgwZV0pOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgY2hhclN0cmluZ3NJbmRleC5hZGQoZ2x5cGhzW2ldKTsKICAgIH0KICAgIGNmZi5jaGFyU3RyaW5ncyA9IGNoYXJTdHJpbmdzSW5kZXg7CiAgICBjb25zdCBwcml2YXRlRGljdCA9IG5ldyBDRkZQcml2YXRlRGljdCgpOwogICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKCJTdWJycyIsIG51bGwpOwogICAgY29uc3QgZmllbGRzID0gWyJCbHVlVmFsdWVzIiwgIk90aGVyQmx1ZXMiLCAiRmFtaWx5Qmx1ZXMiLCAiRmFtaWx5T3RoZXJCbHVlcyIsICJTdGVtU25hcEgiLCAiU3RlbVNuYXBWIiwgIkJsdWVTaGlmdCIsICJCbHVlRnV6eiIsICJCbHVlU2NhbGUiLCAiTGFuZ3VhZ2VHcm91cCIsICJFeHBhbnNpb25GYWN0b3IiLCAiRm9yY2VCb2xkIiwgIlN0ZEhXIiwgIlN0ZFZXIl07CiAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZWxkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldOwogICAgICBpZiAoIShmaWVsZCBpbiBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllcy5wcml2YXRlRGF0YVtmaWVsZF07CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIGZvciAobGV0IGogPSB2YWx1ZS5sZW5ndGggLSAxOyBqID4gMDsgai0tKSB7CiAgICAgICAgICB2YWx1ZVtqXSAtPSB2YWx1ZVtqIC0gMV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShmaWVsZCwgdmFsdWUpOwogICAgfQogICAgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICAgIGNvbnN0IHN1YnJJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgZm9yIChpID0gMCwgaWkgPSBzdWJycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIHN1YnJJbmRleC5hZGQoc3VicnNbaV0pOwogICAgfQogICAgcHJpdmF0ZURpY3Quc3VicnNJbmRleCA9IHN1YnJJbmRleDsKICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKGNmZik7CiAgICByZXR1cm4gY29tcGlsZXIuY29tcGlsZSgpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZm9udHMuanMKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY29uc3QgUFJJVkFURV9VU0VfQVJFQVMgPSBbWzB4ZTAwMCwgMHhmOGZmXSwgWzB4MTAwMDAwLCAweDEwZmZmZF1dOwpjb25zdCBQREZfR0xZUEhfU1BBQ0VfVU5JVFMgPSAxMDAwOwpjb25zdCBFWFBPUlRfREFUQV9QUk9QRVJUSUVTID0gWyJhc2NlbnQiLCAiYmJveCIsICJibGFjayIsICJib2xkIiwgImNoYXJQcm9jT3BlcmF0b3JMaXN0IiwgImNvbXBvc2l0ZSIsICJjc3NGb250SW5mbyIsICJkYXRhIiwgImRlZmF1bHRWTWV0cmljcyIsICJkZWZhdWx0V2lkdGgiLCAiZGVzY2VudCIsICJmYWxsYmFja05hbWUiLCAiZm9udE1hdHJpeCIsICJpc0ludmFsaWRQREZqc0ZvbnQiLCAiaXNUeXBlM0ZvbnQiLCAiaXRhbGljIiwgImxvYWRlZE5hbWUiLCAibWltZXR5cGUiLCAibWlzc2luZ0ZpbGUiLCAibmFtZSIsICJyZW1lYXN1cmUiLCAic3VidHlwZSIsICJzeXN0ZW1Gb250SW5mbyIsICJ0eXBlIiwgInZlcnRpY2FsIl07CmNvbnN0IEVYUE9SVF9EQVRBX0VYVFJBX1BST1BFUlRJRVMgPSBbImNNYXAiLCAiZGVmYXVsdEVuY29kaW5nIiwgImRpZmZlcmVuY2VzIiwgImlzTW9ub3NwYWNlIiwgImlzU2VyaWZGb250IiwgImlzU3ltYm9saWNGb250IiwgInNlYWNNYXAiLCAidG9Gb250Q2hhciIsICJ0b1VuaWNvZGUiLCAidm1ldHJpY3MiLCAid2lkdGhzIl07CmZ1bmN0aW9uIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKSB7CiAgaWYgKCFwcm9wZXJ0aWVzLmZvbnRNYXRyaXgpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKHByb3BlcnRpZXMuZm9udE1hdHJpeFswXSA9PT0gRk9OVF9JREVOVElUWV9NQVRSSVhbMF0pIHsKICAgIHJldHVybjsKICB9CiAgY29uc3Qgc2NhbGUgPSAwLjAwMSAvIHByb3BlcnRpZXMuZm9udE1hdHJpeFswXTsKICBjb25zdCBnbHlwaHNXaWR0aHMgPSBwcm9wZXJ0aWVzLndpZHRoczsKICBmb3IgKGNvbnN0IGdseXBoIGluIGdseXBoc1dpZHRocykgewogICAgZ2x5cGhzV2lkdGhzW2dseXBoXSAqPSBzY2FsZTsKICB9CiAgcHJvcGVydGllcy5kZWZhdWx0V2lkdGggKj0gc2NhbGU7Cn0KZnVuY3Rpb24gYWRqdXN0VHJ1ZVR5cGVUb1VuaWNvZGUocHJvcGVydGllcywgaXNTeW1ib2xpY0ZvbnQsIG5hbWVSZWNvcmRzKSB7CiAgaWYgKHByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHsKICAgIHJldHVybjsKICB9CiAgaWYgKHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFpc1N5bWJvbGljRm9udCkgewogICAgcmV0dXJuOwogIH0KICBpZiAobmFtZVJlY29yZHMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9PT0gV2luQW5zaUVuY29
20kaW5nKSB7CiAgICByZXR1cm47CiAgfQogIGZvciAoY29uc3QgciBvZiBuYW1lUmVjb3JkcykgewogICAgaWYgKCFpc1dpbk5hbWVSZWNvcmQocikpIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KICBjb25zdCBlbmNvZGluZyA9IFdpbkFuc2lFbmNvZGluZzsKICBjb25zdCB0b1VuaWNvZGUgPSBbXSwKICAgIGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBlbmNvZGluZykgewogICAgY29uc3QgZ2x5cGhOYW1lID0gZW5jb2RpbmdbY2hhckNvZGVdOwogICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCB1bmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtnbHlwaE5hbWVdOwogICAgaWYgKHVuaWNvZGUgPT09IHVuZGVmaW5lZCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIHRvVW5pY29kZVtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmZ1bmN0aW9uIGFkanVzdFR5cGUxVG9Vbmljb2RlKHByb3BlcnRpZXMsIGJ1aWx0SW5FbmNvZGluZykgewogIGlmIChwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250KSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChidWlsdEluRW5jb2RpbmcgPT09IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGJ1aWx0SW5FbmNvZGluZykgewogICAgaWYgKHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpIHsKICAgICAgaWYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSB8fCBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGdseXBoTmFtZSA9IGJ1aWx0SW5FbmNvZGluZ1tjaGFyQ29kZV07CiAgICBjb25zdCB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CiAgICB9CiAgfQogIGlmICh0b1VuaWNvZGUubGVuZ3RoID4gMCkgewogICAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTsKICB9Cn0KZnVuY3Rpb24gYW1lbmRGYWxsYmFja1RvVW5pY29kZShwcm9wZXJ0aWVzKSB7CiAgaWYgKCFwcm9wZXJ0aWVzLmZhbGxiYWNrVG9Vbmljb2RlKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHRvVW5pY29kZSA9IFtdOwogIGZvciAoY29uc3QgY2hhckNvZGUgaW4gcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZSkgewogICAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlLmhhcyhjaGFyQ29kZSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICB0b1VuaWNvZGVbY2hhckNvZGVdID0gcHJvcGVydGllcy5mYWxsYmFja1RvVW5pY29kZVtjaGFyQ29kZV07CiAgfQogIGlmICh0b1VuaWNvZGUubGVuZ3RoID4gMCkgewogICAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTsKICB9Cn0KY2xhc3MgZm9udHNfR2x5cGggewogIGNvbnN0cnVjdG9yKG9yaWdpbmFsQ2hhckNvZGUsIGZvbnRDaGFyLCB1bmljb2RlLCBhY2NlbnQsIHdpZHRoLCB2bWV0cmljLCBvcGVyYXRvckxpc3RJZCwgaXNTcGFjZSwgaXNJbkZvbnQpIHsKICAgIHRoaXMub3JpZ2luYWxDaGFyQ29kZSA9IG9yaWdpbmFsQ2hhckNvZGU7CiAgICB0aGlzLmZvbnRDaGFyID0gZm9udENoYXI7CiAgICB0aGlzLnVuaWNvZGUgPSB1bmljb2RlOwogICAgdGhpcy5hY2NlbnQgPSBhY2NlbnQ7CiAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICB0aGlzLnZtZXRyaWMgPSB2bWV0cmljOwogICAgdGhpcy5vcGVyYXRvckxpc3RJZCA9IG9wZXJhdG9yTGlzdElkOwogICAgdGhpcy5pc1NwYWNlID0gaXNTcGFjZTsKICAgIHRoaXMuaXNJbkZvbnQgPSBpc0luRm9udDsKICB9CiAgZ2V0IGNhdGVnb3J5KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiY2F0ZWdvcnkiLCBnZXRDaGFyVW5pY29kZUNhdGVnb3J5KHRoaXMudW5pY29kZSksIHRydWUpOwogIH0KfQpmdW5jdGlvbiBpbnQxNihiMCwgYjEpIHsKICByZXR1cm4gKGIwIDw8IDgpICsgYjE7Cn0KZnVuY3Rpb24gd3JpdGVTaWduZWRJbnQxNihieXRlcywgaW5kZXgsIHZhbHVlKSB7CiAgYnl0ZXNbaW5kZXggKyAxXSA9IHZhbHVlOwogIGJ5dGVzW2luZGV4XSA9IHZhbHVlID4+PiA4Owp9CmZ1bmN0aW9uIHNpZ25lZEludDE2KGIwLCBiMSkgewogIGNvbnN0IHZhbHVlID0gKGIwIDw8IDgpICsgYjE7CiAgcmV0dXJuIHZhbHVlICYgMSA8PCAxNSA/IHZhbHVlIC0gMHgxMDAwMCA6IHZhbHVlOwp9CmZ1bmN0aW9uIHdyaXRlVWludDMyKGJ5dGVzLCBpbmRleCwgdmFsdWUpIHsKICBieXRlc1tpbmRleCArIDNdID0gdmFsdWUgJiAweGZmOwogIGJ5dGVzW2luZGV4ICsgMl0gPSB2YWx1ZSA+Pj4gODsKICBieXRlc1tpbmRleCArIDFdID0gdmFsdWUgPj4+IDE2OwogIGJ5dGVzW2luZGV4XSA9IHZhbHVlID4+PiAyNDsKfQpmdW5jdGlvbiBpbnQzMihiMCwgYjEsIGIyLCBiMykgewogIHJldHVybiAoYjAgPDwgMjQpICsgKGIxIDw8IDE2KSArIChiMiA8PCA4KSArIGIzOwp9CmZ1bmN0aW9uIHN0cmluZzE2KHZhbHVlKSB7CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7Cn0KZnVuY3Rpb24gc2FmZVN0cmluZzE2KHZhbHVlKSB7CiAgaWYgKHZhbHVlID4gMHg3ZmZmKSB7CiAgICB2YWx1ZSA9IDB4N2ZmZjsKICB9IGVsc2UgaWYgKHZhbHVlIDwgLTB4ODAwMCkgewogICAgdmFsdWUgPSAtMHg4MDAwOwogIH0KICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKfQpmdW5jdGlvbiBpc1RydWVUeXBlRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CiAgcmV0dXJuIHJlYWRVaW50MzIoaGVhZGVyLCAwKSA9PT0gMHgwMDAxMDAwMCB8fCBieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09ICJ0cnVlIjsKfQpmdW5jdGlvbiBpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybi
20BieXRlc1RvU3RyaW5nKGhlYWRlcikgPT09ICJ0dGNmIjsKfQpmdW5jdGlvbiBpc09wZW5UeXBlRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CiAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoaGVhZGVyKSA9PT0gIk9UVE8iOwp9CmZ1bmN0aW9uIGlzVHlwZTFGaWxlKGZpbGUpIHsKICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcygyKTsKICBpZiAoaGVhZGVyWzBdID09PSAweDI1ICYmIGhlYWRlclsxXSA9PT0gMHgyMSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmIChoZWFkZXJbMF0gPT09IDB4ODAgJiYgaGVhZGVyWzFdID09PSAweDAxKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGlzQ0ZGRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CiAgaWYgKGhlYWRlclswXSA+PSAxICYmIGhlYWRlclszXSA+PSAxICYmIGhlYWRlclszXSA8PSA0KSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGdldEZvbnRGaWxlVHlwZShmaWxlLCB7CiAgdHlwZSwKICBzdWJ0eXBlLAogIGNvbXBvc2l0ZQp9KSB7CiAgbGV0IGZpbGVUeXBlLCBmaWxlU3VidHlwZTsKICBpZiAoaXNUcnVlVHlwZUZpbGUoZmlsZSkgfHwgaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpKSB7CiAgICBmaWxlVHlwZSA9IGNvbXBvc2l0ZSA/ICJDSURGb250VHlwZTIiIDogIlRydWVUeXBlIjsKICB9IGVsc2UgaWYgKGlzT3BlblR5cGVGaWxlKGZpbGUpKSB7CiAgICBmaWxlVHlwZSA9IGNvbXBvc2l0ZSA/ICJDSURGb250VHlwZTIiIDogIk9wZW5UeXBlIjsKICB9IGVsc2UgaWYgKGlzVHlwZTFGaWxlKGZpbGUpKSB7CiAgICBpZiAoY29tcG9zaXRlKSB7CiAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMCI7CiAgICB9IGVsc2UgewogICAgICBmaWxlVHlwZSA9IHR5cGUgPT09ICJNTVR5cGUxIiA/ICJNTVR5cGUxIiA6ICJUeXBlMSI7CiAgICB9CiAgfSBlbHNlIGlmIChpc0NGRkZpbGUoZmlsZSkpIHsKICAgIGlmIChjb21wb3NpdGUpIHsKICAgICAgZmlsZVR5cGUgPSAiQ0lERm9udFR5cGUwIjsKICAgICAgZmlsZVN1YnR5cGUgPSAiQ0lERm9udFR5cGUwQyI7CiAgICB9IGVsc2UgewogICAgICBmaWxlVHlwZSA9IHR5cGUgPT09ICJNTVR5cGUxIiA/ICJNTVR5cGUxIiA6ICJUeXBlMSI7CiAgICAgIGZpbGVTdWJ0eXBlID0gIlR5cGUxQyI7CiAgICB9CiAgfSBlbHNlIHsKICAgIHdhcm4oImdldEZvbnRGaWxlVHlwZTogVW5hYmxlIHRvIGRldGVjdCBjb3JyZWN0IGZvbnQgZmlsZSBUeXBlL1N1YnR5cGUuIik7CiAgICBmaWxlVHlwZSA9IHR5cGU7CiAgICBmaWxlU3VidHlwZSA9IHN1YnR5cGU7CiAgfQogIHJldHVybiBbZmlsZVR5cGUsIGZpbGVTdWJ0eXBlXTsKfQpmdW5jdGlvbiBhcHBseVN0YW5kYXJkRm9udEdseXBoTWFwKG1hcCwgZ2x5cGhNYXApIHsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGdseXBoTWFwKSB7CiAgICBtYXBbK2NoYXJDb2RlXSA9IGdseXBoTWFwW2NoYXJDb2RlXTsKICB9Cn0KZnVuY3Rpb24gYnVpbGRUb0ZvbnRDaGFyKGVuY29kaW5nLCBnbHlwaHNVbmljb2RlTWFwLCBkaWZmZXJlbmNlcykgewogIGNvbnN0IHRvRm9udENoYXIgPSBbXTsKICBsZXQgdW5pY29kZTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbmNvZGluZy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGVuY29kaW5nW2ldLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICB0b0ZvbnRDaGFyW2ldID0gdW5pY29kZTsKICAgIH0KICB9CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcykgewogICAgdW5pY29kZSA9IGdldFVuaWNvZGVGb3JHbHlwaChkaWZmZXJlbmNlc1tjaGFyQ29kZV0sIGdseXBoc1VuaWNvZGVNYXApOwogICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgIHRvRm9udENoYXJbK2NoYXJDb2RlXSA9IHVuaWNvZGU7CiAgICB9CiAgfQogIHJldHVybiB0b0ZvbnRDaGFyOwp9CmZ1bmN0aW9uIGlzTWFjTmFtZVJlY29yZChyKSB7CiAgcmV0dXJuIHIucGxhdGZvcm0gPT09IDEgJiYgci5lbmNvZGluZyA9PT0gMCAmJiByLmxhbmd1YWdlID09PSAwOwp9CmZ1bmN0aW9uIGlzV2luTmFtZVJlY29yZChyKSB7CiAgcmV0dXJuIHIucGxhdGZvcm0gPT09IDMgJiYgci5lbmNvZGluZyA9PT0gMSAmJiByLmxhbmd1YWdlID09PSAweDQwOTsKfQpmdW5jdGlvbiBjb252ZXJ0Q2lkU3RyaW5nKGNoYXJDb2RlLCBjaWQsIHNob3VsZFRocm93ID0gZmFsc2UpIHsKICBzd2l0Y2ggKGNpZC5sZW5ndGgpIHsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIGNpZC5jaGFyQ29kZUF0KDApOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gY2lkLmNoYXJDb2RlQXQoMCkgPDwgOCB8IGNpZC5jaGFyQ29kZUF0KDEpOwogIH0KICBjb25zdCBtc2cgPSBgVW5zdXBwb3J0ZWQgQ0lEIHN0cmluZyAoY2hhckNvZGUgJHtjaGFyQ29kZX0pOiAiJHtjaWR9Ii5gOwogIGlmIChzaG91bGRUaHJvdykgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKG1zZyk7CiAgfQogIHdhcm4obXNnKTsKICByZXR1cm4gY2lkOwp9CmZ1bmN0aW9uIGFkanVzdE1hcHBpbmcoY2hhckNvZGVUb0dseXBoSWQsIGhhc0dseXBoLCBuZXdHbHlwaFplcm9JZCwgdG9Vbmljb2RlKSB7CiAgY29uc3QgbmV3TWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICBjb25zdCB0b1VuaWNvZGVFeHRyYU1hcCA9IG5ldyBNYXAoKTsKICBjb25zdCB0b0ZvbnRDaGFyID0gW107CiAgY29uc3QgdXNlZEdseXBoSWRzID0gbmV3IFNldCgpOwogIGxldCBwcml2YXRlVXNlQXJlYUluZGV4ID0gMDsKICBjb25zdCBwcml2YXRlVXNlT2ZmZXRTdGFydCA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzBdOwogIGxldCBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlID0gcHJpdmF0ZVVzZU9mZmV0U3RhcnQ7CiAgbGV0IHByaXZhdGVVc2VPZmZldEVuZCA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzFdOwogIGNvbnN0IGlzSW5Qcml2YXRlQXJlYSA9IGNvZGUgPT4gUFJJVkFURV9VU0VfQVJFQVNbMF1bMF0gPD0gY29kZSAmJiBjb2RlIDw9IFBSSVZBVEVfVVNFX0FSRUFTWzBdWzFdIHx8IFBSSVZBVEVfVVNFX0FSRUFTWzFdWzBdIDw9IGNvZGUgJiYgY29
20kZSA8PSBQUklWQVRFX1VTRV9BUkVBU1sxXVsxXTsKICBmb3IgKGNvbnN0IG9yaWdpbmFsQ2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKICAgIGxldCBnbHlwaElkID0gY2hhckNvZGVUb0dseXBoSWRbb3JpZ2luYWxDaGFyQ29kZV07CiAgICBpZiAoIWhhc0dseXBoKGdseXBoSWQpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUgPiBwcml2YXRlVXNlT2ZmZXRFbmQpIHsKICAgICAgcHJpdmF0ZVVzZUFyZWFJbmRleCsrOwogICAgICBpZiAocHJpdmF0ZVVzZUFyZWFJbmRleCA+PSBQUklWQVRFX1VTRV9BUkVBUy5sZW5ndGgpIHsKICAgICAgICB3YXJuKCJSYW4gb3V0IG9mIHNwYWNlIGluIGZvbnQgcHJpdmF0ZSB1c2UgYXJlYS4iKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlID0gUFJJVkFURV9VU0VfQVJFQVNbcHJpdmF0ZVVzZUFyZWFJbmRleF1bMF07CiAgICAgIHByaXZhdGVVc2VPZmZldEVuZCA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzFdOwogICAgfQogICAgY29uc3QgZm9udENoYXJDb2RlID0gbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSsrOwogICAgaWYgKGdseXBoSWQgPT09IDApIHsKICAgICAgZ2x5cGhJZCA9IG5ld0dseXBoWmVyb0lkOwogICAgfQogICAgbGV0IHVuaWNvZGUgPSB0b1VuaWNvZGUuZ2V0KG9yaWdpbmFsQ2hhckNvZGUpOwogICAgaWYgKHR5cGVvZiB1bmljb2RlID09PSAic3RyaW5nIikgewogICAgICB1bmljb2RlID0gdW5pY29kZS5jb2RlUG9pbnRBdCgwKTsKICAgIH0KICAgIGlmICh1bmljb2RlICYmICFpc0luUHJpdmF0ZUFyZWEodW5pY29kZSkgJiYgIXVzZWRHbHlwaElkcy5oYXMoZ2x5cGhJZCkpIHsKICAgICAgdG9Vbmljb2RlRXh0cmFNYXAuc2V0KHVuaWNvZGUsIGdseXBoSWQpOwogICAgICB1c2VkR2x5cGhJZHMuYWRkKGdseXBoSWQpOwogICAgfQogICAgbmV3TWFwW2ZvbnRDaGFyQ29kZV0gPSBnbHlwaElkOwogICAgdG9Gb250Q2hhcltvcmlnaW5hbENoYXJDb2RlXSA9IGZvbnRDaGFyQ29kZTsKICB9CiAgcmV0dXJuIHsKICAgIHRvRm9udENoYXIsCiAgICBjaGFyQ29kZVRvR2x5cGhJZDogbmV3TWFwLAogICAgdG9Vbmljb2RlRXh0cmFNYXAsCiAgICBuZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlCiAgfTsKfQpmdW5jdGlvbiBnZXRSYW5nZXMoZ2x5cGhzLCB0b1VuaWNvZGVFeHRyYU1hcCwgbnVtR2x5cGhzKSB7CiAgY29uc3QgY29kZXMgPSBbXTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGdseXBocykgewogICAgaWYgKGdseXBoc1tjaGFyQ29kZV0gPj0gbnVtR2x5cGhzKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29kZXMucHVzaCh7CiAgICAgIGZvbnRDaGFyQ29kZTogY2hhckNvZGUgfCAwLAogICAgICBnbHlwaElkOiBnbHlwaHNbY2hhckNvZGVdCiAgICB9KTsKICB9CiAgaWYgKHRvVW5pY29kZUV4dHJhTWFwKSB7CiAgICBmb3IgKGNvbnN0IFt1bmljb2RlLCBnbHlwaElkXSBvZiB0b1VuaWNvZGVFeHRyYU1hcCkgewogICAgICBpZiAoZ2x5cGhJZCA+PSBudW1HbHlwaHMpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb2Rlcy5wdXNoKHsKICAgICAgICBmb250Q2hhckNvZGU6IHVuaWNvZGUsCiAgICAgICAgZ2x5cGhJZAogICAgICB9KTsKICAgIH0KICB9CiAgaWYgKGNvZGVzLmxlbmd0aCA9PT0gMCkgewogICAgY29kZXMucHVzaCh7CiAgICAgIGZvbnRDaGFyQ29kZTogMCwKICAgICAgZ2x5cGhJZDogMAogICAgfSk7CiAgfQogIGNvZGVzLnNvcnQoZnVuY3Rpb24gZm9udEdldFJhbmdlc1NvcnQoYSwgYikgewogICAgcmV0dXJuIGEuZm9udENoYXJDb2RlIC0gYi5mb250Q2hhckNvZGU7CiAgfSk7CiAgY29uc3QgcmFuZ2VzID0gW107CiAgY29uc3QgbGVuZ3RoID0gY29kZXMubGVuZ3RoOwogIGZvciAobGV0IG4gPSAwOyBuIDwgbGVuZ3RoOykgewogICAgY29uc3Qgc3RhcnQgPSBjb2Rlc1tuXS5mb250Q2hhckNvZGU7CiAgICBjb25zdCBjb2RlSW5kaWNlcyA9IFtjb2Rlc1tuXS5nbHlwaElkXTsKICAgICsrbjsKICAgIGxldCBlbmQgPSBzdGFydDsKICAgIHdoaWxlIChuIDwgbGVuZ3RoICYmIGVuZCArIDEgPT09IGNvZGVzW25dLmZvbnRDaGFyQ29kZSkgewogICAgICBjb2RlSW5kaWNlcy5wdXNoKGNvZGVzW25dLmdseXBoSWQpOwogICAgICArK2VuZDsKICAgICAgKytuOwogICAgICBpZiAoZW5kID09PSAweGZmZmYpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmFuZ2VzLnB1c2goW3N0YXJ0LCBlbmQsIGNvZGVJbmRpY2VzXSk7CiAgfQogIHJldHVybiByYW5nZXM7Cn0KZnVuY3Rpb24gY3JlYXRlQ21hcFRhYmxlKGdseX
20BocywgdG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBocykgewogIGNvbnN0IHJhbmdlcyA9IGdldFJhbmdlcyhnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpOwogIGNvbnN0IG51bVRhYmxlcyA9IHJhbmdlcy5hdCgtMSlbMV0gPiAweGZmZmYgPyAyIDogMTsKICBsZXQgY21hcCA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihudW1UYWJsZXMpICsgIlx4MDBceDAzIiArICJceDAwXHgwMSIgKyBzdHJpbmczMig0ICsgbnVtVGFibGVzICogOCk7CiAgbGV0IGksIGlpLCBqLCBqajsKICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBjb25zdCBibXBMZW5ndGggPSBpICsgMTsKICBpZiAocmFuZ2VzW2ldWzBdIDwgMHhmZmZmICYmIHJhbmdlc1tpXVsxXSA9PT0gMHhmZmZmKSB7CiAgICByYW5nZXNbaV1bMV0gPSAweGZmZmU7CiAgfQogIGNvbnN0IHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDsKICBjb25zdCBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gT3BlblR5cGVGaWxlQnVpbGRlci5nZXRTZWFyY2hQYXJhbXMoc2VnQ291bnQsIDIpOwogIGxldCBzdGFydENvdW50ID0gIiI7CiAgbGV0IGVuZENvdW50ID0gIiI7CiAgbGV0IGlkRGVsdGFzID0gIiI7CiAgbGV0IGlkUmFuZ2VPZmZzZXRzID0gIiI7CiAgbGV0IGdseXBoc0lkcyA9ICIiOwogIGxldCBiaWFzID0gMDsKICBsZXQgcmFuZ2UsIHN0YXJ0LCBlbmQsIGNvZGVzOwogIGZvciAoaSA9IDAsIGlpID0gYm1wTGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgcmFuZ2UgPSByYW5nZXNbaV07CiAgICBzdGFydCA9IHJhbmdlWzBdOwogICAgZW5kID0gcmFuZ2VbMV07CiAgICBzdGFydENvdW50ICs9IHN0cmluZzE2KHN0YXJ0KTsKICAgIGVuZENvdW50ICs9IHN0cmluZzE2KGVuZCk7CiAgICBjb2RlcyA9IHJhbmdlWzJdOwogICAgbGV0IGNvbnRpZ3VvdXMgPSB0cnVlOwogICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkgewogICAgICAgIGNvbnRpZ3VvdXMgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFjb250aWd1b3VzKSB7CiAgICAgIGNvbnN0IG9mZnNldCA9IChzZWdDb3VudCAtIGkpICogMiArIGJpYXMgKiAyOwogICAgICBiaWFzICs9IGVuZCAtIHN0YXJ0ICsgMTsKICAgICAgaWREZWx0YXMgKz0gc3RyaW5nMTYoMCk7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KG9mZnNldCk7CiAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgICAgIGdseXBoc0lkcyArPSBzdHJpbmcxNihjb2Rlc1tqXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0YXJ0Q29kZSA9IGNvZGVzWzBdOwogICAgICBpZERlbHRhcyArPSBzdHJpbmcxNihzdGFydENvZGUgLSBzdGFydCAmIDB4ZmZmZik7CiAgICAgIGlkUmFuZ2VPZmZzZXRzICs9IHN0cmluZzE2KDApOwogICAgfQogIH0KICBpZiAodHJhaWxpbmdSYW5nZXNDb3VudCA+IDApIHsKICAgIGVuZENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBzdGFydENvdW50ICs9ICJceEZGXHhGRiI7CiAgICBpZERlbHRhcyArPSAiXHgwMFx4MDEiOwogICAgaWRSYW5nZU9mZnNldHMgKz0gIlx4MDBceDAwIjsKICB9CiAgY29uc3QgZm9ybWF0MzE0ID0gIlx4MDBceDAwIiArIHN0cmluZzE2KDIgKiBzZWdDb3VudCkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMucmFuZ2UpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLmVudHJ5KSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5yYW5nZVNoaWZ0KSArIGVuZENvdW50ICsgIlx4MDBceDAwIiArIHN0YXJ0Q291bnQgKyBpZERlbHRhcyArIGlkUmFuZ2VPZmZzZXRzICsgZ2x5cGhzSWRzOwogIGxldCBmb3JtYXQzMTAxMiA9ICIiOwogIGxldCBoZWFkZXIzMTAxMiA9ICIiOwogIGlmIChudW1UYWJsZXMgPiAxKSB7CiAgICBjbWFwICs9ICJceDAwXHgwMyIgKyAiXHgwMFx4MEEiICsgc3RyaW5nMzIoNCArIG51bVRhYmxlcyAqIDggKyA0ICsgZm9ybWF0MzE0Lmxlbmd0aCk7CiAgICBmb3JtYXQzMTAxMiA9ICIiOwogICAgZm9yIChpID0gMCwgaWkgPSByYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICByYW5nZSA9IHJhbmdlc1tpXTsKICAgICAgc3RhcnQgPSByYW5nZVswXTsKICAgICAgY29kZXMgPSByYW5nZVsyXTsKICAgICAgbGV0IGNvZGUgPSBjb2Rlc1swXTsKICAgICAgZm9yIChqID0gMSwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CiAgICAgICAgICBlbmQgPSByYW5nZVswXSArIGogLSAxOwogICAgICAgICAgZm9ybWF0MzEwMTIgKz0gc3RyaW5nMzIoc3RhcnQpICsgc3RyaW5nMzIoZW5kKSArIHN0cmluZzMyKGNvZGUpOwogICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwogICAgICAgICAgY29kZSA9IGNvZGVzW2pdOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3JtYXQzMTAxMiArPSBzdHJpbmczMihzdGFydCkgKyBzdHJpbmczMihyYW5nZVsxXSkgKyBzdHJpbmczMihjb2RlKTsKICAgIH0KICAgIGhlYWRlcjMxMDEyID0gIlx4MDBceDBDIiArICJceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmczMihmb3JtYXQzMTAxMi5sZW5ndGggLyAxMik7CiAgfQogIHJldHVybiBjbWFwICsgIlx4MDBceDA0IiArIHN0cmluZzE2KGZvcm1hdDMxNC5sZW5ndGggKyA0KSArIGZvcm1hdDMxNCArIGhlYWRlcjMxMDEyICsgZm9ybWF0MzEwMTI7Cn0KZnVuY3Rpb24gdmFsaWRhdGVPUzJUYWJsZShvczIsIGZpbGUpIHsKICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgb3MyLm9mZnNldDsKICBjb25zdCB2ZXJzaW9uID0gZmlsZS5nZXRVaW50MTYoKTsKICBmaWxlLnNraXAoNjApOwogIGNvbnN0IHNlbGVjdGlvbiA9IGZpbGUuZ2V0VWludDE2KCk7CiAgaWYgKHZlcnNpb24gPCA0ICYmIHNlbGVjdGlvbiAmIDB4MDMwMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBmaXJzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOwogIGNvbnN0IGxhc3RDaGFyID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAoZmlyc3RDaGFyID4gbGFzdENoYXIpIHsKICAgIHJldHVybi
20BmYWxzZTsKICB9CiAgZmlsZS5za2lwKDYpOwogIGNvbnN0IHVzV2luQXNjZW50ID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAodXNXaW5Bc2NlbnQgPT09IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgb3MyLmRhdGFbOF0gPSBvczIuZGF0YVs5XSA9IDA7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgY2hhcnN0cmluZ3MsIG92ZXJyaWRlKSB7CiAgb3ZlcnJpZGUgfHw9IHsKICAgIHVuaXRzUGVyRW06IDAsCiAgICB5TWF4OiAwLAogICAgeU1pbjogMCwKICAgIGFzY2VudDogMCwKICAgIGRlc2NlbnQ6IDAKICB9OwogIGxldCB1bFVuaWNvZGVSYW5nZTEgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTIgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTMgPSAwOwogIGxldCB1bFVuaWNvZGVSYW5nZTQgPSAwOwogIGxldCBmaXJzdENoYXJJbmRleCA9IG51bGw7CiAgbGV0IGxhc3RDaGFySW5kZXggPSAwOwogIGxldCBwb3NpdGlvbiA9IC0xOwogIGlmIChjaGFyc3RyaW5ncykgewogICAgZm9yIChsZXQgY29kZSBpbiBjaGFyc3RyaW5ncykgewogICAgICBjb2RlIHw9IDA7CiAgICAgIGlmIChmaXJzdENoYXJJbmRleCA+IGNvZGUgfHwgIWZpcnN0Q2hhckluZGV4KSB7CiAgICAgICAgZmlyc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIGlmIChsYXN0Q2hhckluZGV4IDwgY29kZSkgewogICAgICAgIGxhc3RDaGFySW5kZXggPSBjb2RlOwogICAgICB9CiAgICAgIHBvc2l0aW9uID0gZ2V0VW5pY29kZVJhbmdlRm9yKGNvZGUsIHBvc2l0aW9uKTsKICAgICAgaWYgKHBvc2l0aW9uIDwgMzIpIHsKICAgICAgICB1bFVuaWNvZGVSYW5nZTEgfD0gMSA8PCBwb3NpdGlvbjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDY0KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UyIHw9IDEgPDwgcG9zaXRpb24gLSAzMjsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDk2KSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UzIHw9IDEgPDwgcG9zaXRpb24gLSA2NDsKICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8IDEyMykgewogICAgICAgIHVsVW5pY29kZVJhbmdlNCB8PSAxIDw8IHBvc2l0aW9uIC0gOTY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmljb2RlIHJhbmdlcyBCaXRzID4gMTIzIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UiKTsKICAgICAgfQogICAgfQogICAgaWYgKGxhc3RDaGFySW5kZXggPiAweGZmZmYpIHsKICAgICAgbGFzdENoYXJJbmRleCA9IDB4ZmZmZjsKICAgIH0KICB9IGVsc2UgewogICAgZmlyc3RDaGFySW5kZXggPSAwOwogICAgbGFzdENoYXJJbmRleCA9IDI1NTsKICB9CiAgY29uc3QgYmJveCA9IHByb3BlcnRpZXMuYmJveCB8fCBbMCwgMCwgMCwgMF07CiAgY29uc3QgdW5pdHNQZXJFbSA9IG92ZXJyaWRlLnVuaXRzUGVyRW0gfHwgKHByb3BlcnRpZXMuZm9udE1hdHJpeCA/IDEgLyBNYXRoLm1heCguLi5wcm9wZXJ0aWVzLmZvbnRNYXRyaXguc2xpY2UoMCwgNCkubWFwKE1hdGguYWJzKSkgOiAxMDAwKTsKICBjb25zdCBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID8gMS4wIDogdW5pdHNQZXJFbSAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICBjb25zdCB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOwogIGxldCB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOwogIGlmICh0eXBvRGVzY2VudCA+IDAgJiYgcHJvcGVydGllcy5kZXNjZW50ID4gMCAmJiBiYm94WzFdIDwgMCkgewogICAgdHlwb0Rlc2NlbnQgPSAtdHlwb0Rlc2NlbnQ7CiAgfQogIGNvbnN0IHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDsKICBjb25zdCB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OwogIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2UxKSArIHN0cmluZzMyKHVsVW5pY29kZVJhbmdlMikgKyBzdHJpbmczMih1bFVuaWNvZGVSYW5nZTMpICsgc3RyaW5nMzIodWxVbmljb2RlUmFuZ2U0KSArICJceDJBXHgzMlx4MzFceDJBIiArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAxIDogMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyBzdHJpbmcxNihsYXN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMubGFzdENoYXIpICsgc3RyaW5nMTYodHlwb0FzY2VudCkgKyBzdHJpbmcxNih0eXBvRGVzY2VudCkgKyAiXHgwMFx4NjQiICsgc3RyaW5nMTYod2luQXNjZW50KSArIHN0cmluZzE2KHdpbkRlc2NlbnQpICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgc3RyaW5nMTYocHJvcGVydGllcy54SGVpZ2h0KSArIHN0cmluZzE2KHByb3BlcnRpZXMuY2FwSGVpZ2h0KSArIHN0cmluZzE2KDApICsgc3RyaW5nMTYoZmlyc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5maXJzdENoYXIpICsgIlx4MDBceDAzIjsKfQpmdW5jdGlvbiBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykgewogIGNvbnN0IGFuZ2xlID0gTWF0aC5mbG9vcihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlICogMiAqKiAxNik7CiAgcmV0dXJuICJceDAwXHgwM1x4MDBceDAwIiArIHN0cmluZzMyKGFuZ2xlKSArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMzIocHJvcGVydGllcy5maXhlZFBpdGNoID8gMSA6IDApICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiOwp9CmZ1bmN0aW9uIGNyZWF0ZVBvc3RzY3JpcHROYW1lKG5
20hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bXlx4MjEtXHg3RV18W1tcXSgpe308Pi8lXS9nLCAiIikuc2xpY2UoMCwgNjMpOwp9CmZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgewogIGlmICghcHJvdG8pIHsKICAgIHByb3RvID0gW1tdLCBbXV07CiAgfQogIGNvbnN0IHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCBjcmVhdGVQb3N0c2NyaXB0TmFtZShuYW1lKSwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CiAgY29uc3Qgc3RyaW5nc1VuaWNvZGUgPSBbXTsKICBsZXQgaSwgaWksIGosIGpqLCBzdHI7CiAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CiAgICBjb25zdCBzdHJCdWZVbmljb2RlID0gW107CiAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOwogICAgfQogICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oIiIpKTsKICB9CiAgY29uc3QgbmFtZXMgPSBbc3RyaW5ncywgc3RyaW5nc1VuaWNvZGVdOwogIGNvbnN0IHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKICBjb25zdCBlbmNvZGluZ3MgPSBbIlx4MDBceDAwIiwgIlx4MDBceDAxIl07CiAgY29uc3QgbGFuZ3VhZ2VzID0gWyJceDAwXHgwMCIsICJceDA0XHgwOSJdOwogIGNvbnN0IG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CiAgbGV0IG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOwogIGxldCBzdHJPZmZzZXQgPSAwOwogIGZvciAoaSA9IDAsIGlpID0gcGxhdGZvcm1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHN0cnMgPSBuYW1lc1tpXTsKICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ciA9IHN0cnNbal07CiAgICAgIGNvbnN0IG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CiAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOwogICAgfQogIH0KICBuYW1lVGFibGUgKz0gc3RyaW5ncy5qb2luKCIiKSArIHN0cmluZ3NVbmljb2RlLmpvaW4oIiIpOwogIHJldHVybiBuYW1lVGFibGU7Cn0KY2xhc3MgRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMucHNOYW1lID0gbnVsbDsKICAgIHRoaXMubWltZXR5cGUgPSBudWxsOwogICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBmYWxzZTsKICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTsKICAgIHRoaXMuaXNUeXBlM0ZvbnQgPSBwcm9wZXJ0aWVzLmlzVHlwZTNGb250OwogICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOwogICAgdGhpcy5jc3NGb250SW5mbyA9IHByb3BlcnRpZXMuY3NzRm9udEluZm87CiAgICB0aGlzLl9jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuX2dseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IGlzU2VyaWZGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TZXJpZik7CiAgICBpZiAoIWlzU2VyaWZGb250ICYmICFwcm9wZXJ0aWVzLmlzU2ltdWxhdGVkRmxhZ3MpIHsKICAgICAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoL1ssX10vZywgIi0iKS5zcGxpdCgiLSIsIDEpWzBdLAogICAgICAgIHNlcmlmRm9udHMgPSBnZXRTZXJpZkZvbnRzKCk7CiAgICAgIGZvciAoY29uc3QgbmFtZVBhcnQgb2YgYmFzZU5hbWUuc3BsaXQoIisiKSkgewogICAgICAgIGlmIChzZXJpZkZvbnRzW25hbWVQYXJ0XSkgewogICAgICAgICAgaXNTZXJpZkZvbnQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmlzU2VyaWZGb250ID0gaXNTZXJpZkZvbnQ7CiAgICB0aGlzLmlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICB0aGlzLmlzTW9ub3NwYWNlID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5GaXhlZFBpdGNoKTsKICAgIGxldCB7CiAgICAgIHR5cGUsCiAgICAgIHN1YnR5cGUKICAgIH0gPSBwcm9wZXJ0aWVzOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLnN5c3RlbUZvbnRJbmZvID0gcHJvcGVydGllcy5zeXN0ZW1Gb250SW5mbzsKICAgIGNvbnN0IG1hdGNoZXMgPSBuYW1lLm1hdGNoKC9eSW52YWxpZFBERmpzRm9udF8oLiopX1xkKyQvKTsKICAgIHRoaXMuaXNJbnZhbGlkUERGanNGb250ID0gISFtYXRjaGVzOwogICAgaWYgKHRoaXMuaXNJbnZhbGlkUERGanNGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gbWF0Y2hlc1sxXTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc01vbm9zcGFjZSkgewogICAgICB0aGlzLmZhbGxiYWNrTmFtZSA9ICJtb25vc3BhY2UiOwogICAgfSBlbHNlIGlmICh0aGlzLmlzU2VyaWZGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNlcmlmIjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNhbnMtc2VyaWYiOwogICAgfQogICAgaWYgKHRoaXMuc3lzdGVtRm9udEluZm8/Lmd1ZXNzRmFsbGJhY2spIHsKICAgICAgdGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrID0gZmFsc2U7CiAgICAgI
20HRoaXMuc3lzdGVtRm9udEluZm8uY3NzICs9IGAsJHt0aGlzLmZhbGxiYWNrTmFtZX1gOwogICAgfQogICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CiAgICB0aGlzLmNhcEhlaWdodCA9IHByb3BlcnRpZXMuY2FwSGVpZ2h0IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMuZGVzY2VudCA9IHByb3BlcnRpZXMuZGVzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuYXNjZW50IC0gdGhpcy5kZXNjZW50OwogICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4OwogICAgdGhpcy5iYm94ID0gcHJvcGVydGllcy5iYm94OwogICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSB8fCBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgfHwgIiI7CiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsOwogICAgaWYgKHRoaXMudmVydGljYWwpIHsKICAgICAgdGhpcy52bWV0cmljcyA9IHByb3BlcnRpZXMudm1ldHJpY3M7CiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CiAgICB9CiAgICBpZiAoIWZpbGUgfHwgZmlsZS5pc0VtcHR5KSB7CiAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgd2FybignRm9udCBmaWxlIGlzIGVtcHR5IGluICInICsgbmFtZSArICciICgnICsgdGhpcy5sb2FkZWROYW1lICsgIikiKTsKICAgICAgfQogICAgICB0aGlzLmZhbGxiYWNrVG9TeXN0ZW1Gb250KHByb3BlcnRpZXMpOwogICAgICByZXR1cm47CiAgICB9CiAgICBbdHlwZSwgc3VidHlwZV0gPSBnZXRGb250RmlsZVR5cGUoZmlsZSwgcHJvcGVydGllcyk7CiAgICBpZiAodHlwZSAhPT0gdGhpcy50eXBlIHx8IHN1YnR5cGUgIT09IHRoaXMuc3VidHlwZSkgewogICAgICBpbmZvKCJJbmNvbnNpc3RlbnQgZm9udCBmaWxlIFR5cGUvU3ViVHlwZSwgZXhwZWN0ZWQ6ICIgKyBgJHt0aGlzLnR5cGV9LyR7dGhpcy5zdWJ0eXBlfSBidXQgZm91bmQ6ICR7dHlwZX0vJHtzdWJ0eXBlfS5gKTsKICAgIH0KICAgIGxldCBkYXRhOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAiTU1UeXBlMSI6CiAgICAgICAgICBpbmZvKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKICAgICAgICBjYXNlICJUeXBlMSI6CiAgICAgICAgY2FzZSAiQ0lERm9udFR5cGUwIjoKICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CiAgICAgICAgICBjb25zdCBjZmYgPSBzdWJ0eXBlID09PSAiVHlwZTFDIiB8fCBzdWJ0eXBlID09PSAiQ0lERm9udFR5cGUwQyIgPyBuZXcgQ0ZGRm9udChmaWxlLCBwcm9wZXJ0aWVzKSA6IG5ldyBUeXBlMUZvbnQobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CiAgICAgICAgICBkYXRhID0gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPcGVuVHlwZSI6CiAgICAgICAgY2FzZSAiVHJ1ZVR5cGUiOgogICAgICAgIGNhc2UgIkNJREZvbnRUeXBlMiI6CiAgICAgICAgICB0aGlzLm1pbWV0eXBlID0gImZvbnQvb3BlbnR5cGUiOwogICAgICAgICAgZGF0YSA9IHRoaXMuY2hlY2tBbmRSZXBhaXIobmFtZSwgZmlsZSwgcHJvcGVydGllcyk7CiAgICAgICAgICBpZiAodGhpcy5pc09wZW5UeXBlKSB7CiAgICAgICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKICAgICAgICAgICAgdHlwZSA9ICJPcGVuVHlwZSI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBGb250ICR7dHlwZX0gaXMgbm90IHN1cHBvcnRlZGApOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oZSk7CiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7CiAgfQogIGdldCByZW5kZXJlcigpIHsKICAgIGNvbnN0IHJlbmRlcmVyID0gRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgInJlbmRlcmVyIiwgcmVuZGVyZXIpOwogIH0KICBleHBvcnREYXRhKGV4dHJhUHJvcGVydGllcyA9IGZhbHNlKSB7CiAgICBjb25zdCBleHBvcnREYXRhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllcyA/IFsuLi5FWFBPUlRfREFUQV9QUk9QRVJUSUVTLCAuLi
205FWFBPUlRfREFUQV9FWFRSQV9QUk9QRVJUSUVTXSA6IEVYUE9SVF9EQVRBX1BST1BFUlRJRVM7CiAgICBjb25zdCBkYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGxldCBwcm9wZXJ0eSwgdmFsdWU7CiAgICBmb3IgKHByb3BlcnR5IG9mIGV4cG9ydERhdGFQcm9wZXJ0aWVzKSB7CiAgICAgIHZhbHVlID0gdGhpc1twcm9wZXJ0eV07CiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGZhbGxiYWNrVG9TeXN0ZW1Gb250KHByb3BlcnRpZXMpIHsKICAgIHRoaXMubWlzc2luZ0ZpbGUgPSB0cnVlOwogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICB0eXBlCiAgICB9ID0gdGhpczsKICAgIGxldCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogICAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKSwKICAgICAgbm9uU3RkRm9udE1hcCA9IGdldE5vblN0ZEZvbnRNYXAoKTsKICAgIGNvbnN0IGlzU3RhbmRhcmRGb250ID0gISFzdGRGb250TWFwW2ZvbnROYW1lXTsKICAgIGNvbnN0IGlzTWFwcGVkVG9TdGFuZGFyZEZvbnQgPSAhIShub25TdGRGb250TWFwW2ZvbnROYW1lXSAmJiBzdGRGb250TWFwW25vblN0ZEZvbnRNYXBbZm9udE5hbWVdXSk7CiAgICBmb250TmFtZSA9IHN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8IG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8IGZvbnROYW1lOwogICAgY29uc3QgZm9udEJhc2ljTWV0cmljc01hcCA9IGdldEZvbnRCYXNpY01ldHJpY3MoKTsKICAgIGNvbnN0IG1ldHJpY3MgPSBmb250QmFzaWNNZXRyaWNzTWFwW2ZvbnROYW1lXTsKICAgIGlmIChtZXRyaWNzKSB7CiAgICAgIGlmIChpc05hTih0aGlzLmFzY2VudCkpIHsKICAgICAgICB0aGlzLmFzY2VudCA9IG1ldHJpY3MuYXNjZW50IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgICB9CiAgICAgIGlmIChpc05hTih0aGlzLmRlc2NlbnQpKSB7CiAgICAgICAgdGhpcy5kZXNjZW50ID0gbWV0cmljcy5kZXNjZW50IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgICB9CiAgICAgIGlmIChpc05hTih0aGlzLmNhcEhlaWdodCkpIHsKICAgICAgICB0aGlzLmNhcEhlaWdodCA9IG1ldHJpY3MuY2FwSGVpZ2h0IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgICB9CiAgICB9CiAgICB0aGlzLmJvbGQgPSAvYm9sZC9naS50ZXN0KGZvbnROYW1lKTsKICAgIHRoaXMuaXRhbGljID0gL29ibGlxdWV8aXRhbGljL2dpLnRlc3QoZm9udE5hbWUpOwogICAgdGhpcy5ibGFjayA9IC9CbGFjay9nLnRlc3QobmFtZSk7CiAgICBjb25zdCBpc05hcnJvdyA9IC9OYXJyb3cvZy50ZXN0KG5hbWUpOwogICAgdGhpcy5yZW1lYXN1cmUgPSAoIWlzU3RhbmRhcmRGb250IHx8IGlzTmFycm93KSAmJiBPYmplY3Qua2V5cyh0aGlzLndpZHRocykubGVuZ3RoID4gMDsKICAgIGlmICgoaXNTdGFuZGFyZEZvbnQgfHwgaXNNYXBwZWRUb1N0YW5kYXJkRm9udCkgJiYgdHlwZSA9PT0gIkNJREZvbnRUeXBlMiIgJiYgdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKSkgewogICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXA7CiAgICAgIGNvbnN0IG1hcCA9IFtdOwogICAgICBhcHBseVN0YW5kYXJkRm9udEdseXBoTWFwKG1hcCwgZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzKCkpOwogICAgICBpZiAoL0FyaWFsLT9CbGFjay9pLnRlc3QobmFtZSkpIHsKICAgICAgICBhcHBseVN0YW5kYXJkRm9udEdseXBoTWFwKG1hcCwgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JBcmlhbEJsYWNrKCkpOwogICAgICB9IGVsc2UgaWYgKC9DYWxpYnJpL2kudGVzdChuYW1lKSkgewogICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkoKSk7CiAgICAgIH0KICAgICAgaWYgKGNpZFRvR2lkTWFwKSB7CiAgICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKICAgICAgICAgIGNvbnN0IGNpZCA9IG1hcFtjaGFyQ29kZV07CiAgICAgICAgICBpZiAoY2lkVG9HaWRNYXBbY2lkXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gY2lkVG9HaWRNYXBbY2lkXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGNpZFRvR2lkTWFwLmxlbmd0aCAhPT0gdGhpcy50b1VuaWNvZGUubGVuZ3RoICYmIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgJiYgdGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgewogICAgICAgICAgICBjb25zdCBjaWQgPSBtYXBbY2hhckNvZGVdOwogICAgICAgICAgICBpZiAoY2lkVG9HaWRNYXBbY2lkXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpIHsKICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgICAgdGhpcy50b1VuaWNvZGUgPSBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7CiAgICB9IGVsc2UgaWYgKC9TeW1ib2wvaS50ZXN0KGZvbnROYW1lKSkgewogICAgICB0aGlzLnRvRm9udENoYXIgPSBidWlsZFRvRm9udENoYXIoU3ltYm9sU2V0RW5jb2RpbmcsIGdldEdseXBoc1VuaWNvZGUoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CiAgICB9IGVsc2UgaWYgKC9EaW5nYmF0cy9pLnRlc3QoZm9udE5hbWUpKSB7CiAgICAgI
20HRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihaYXBmRGluZ2JhdHNFbmNvZGluZywgZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlKCksIHRoaXMuZGlmZmVyZW5jZXMpOwogICAgfSBlbHNlIGlmIChpc1N0YW5kYXJkRm9udCB8fCBpc01hcHBlZFRvU3RhbmRhcmRGb250KSB7CiAgICAgIGNvbnN0IG1hcCA9IGJ1aWxkVG9Gb250Q2hhcih0aGlzLmRlZmF1bHRFbmNvZGluZywgZ2V0R2x5cGhzVW5pY29kZSgpLCB0aGlzLmRpZmZlcmVuY2VzKTsKICAgICAgaWYgKHR5cGUgPT09ICJDSURGb250VHlwZTIiICYmICF0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpICYmICEodGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkpIHsKICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7CiAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gZ2V0R2x5cGhzVW5pY29kZSgpOwogICAgICBjb25zdCBtYXAgPSBbXTsKICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaCgoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgPT4gewogICAgICAgIGlmICghdGhpcy5jb21wb3NpdGUpIHsKICAgICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHRoaXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTsKICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSBnZXRVbmljb2RlRm9yR2x5cGgoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgICAgICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICAgICAgICB1bmljb2RlQ2hhckNvZGUgPSB1bmljb2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKICAgICAgfSk7CiAgICAgIGlmICh0aGlzLmNvbXBvc2l0ZSAmJiB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIElkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICAgICAgaWYgKC9UYWhvbWF8VmVyZGFuYS9pLnRlc3QobmFtZSkpIHsKICAgICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmxvYWRlZE5hbWUgPSBmb250TmFtZS5zcGxpdCgiLSIsIDEpWzBdOwogIH0KICBjaGVja0FuZFJlcGFpcihuYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBWQUxJRF9UQUJMRVMgPSBbIk9TLzIiLCAiY21hcCIsICJoZWFkIiwgImhoZWEiLCAiaG10eCIsICJtYXhwIiwgIm5hbWUiLCAicG9zdCIsICJsb2NhIiwgImdseWYiLCAiZnBnbSIsICJwcmVwIiwgImN2dCAiLCAiQ0ZGICJdOwogICAgZnVuY3Rpb24gcmVhZFRhYmxlcyhmaWxlLCBudW1UYWJsZXMpIHsKICAgICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGFibGVzWyJPUy8yIl0gPSBudWxsOwogICAgICB0YWJsZXMuY21hcCA9IG51bGw7CiAgICAgIHRhYmxlcy5oZWFkID0gbnVsbDsKICAgICAgdGFibGVzLmhoZWEgPSBudWxsOwogICAgICB0YWJsZXMuaG10eCA9IG51bGw7CiAgICAgIHRhYmxlcy5tYXhwID0gbnVsbDsKICAgICAgdGFibGVzLm5hbWUgPSBudWxsOwogICAgICB0YWJsZXMucG9zdCA9IG51bGw7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgICBjb25zdCB0YWJsZSA9IHJlYWRUYWJsZUVudHJ5KGZpbGUpOwogICAgICAgIGlmICghVkFMSURfVEFCTEVTLmluY2x1ZGVzKHRhYmxlLnRhZykpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGFibGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTsKICAgICAgfQogICAgICByZXR1cm4gdGFibGVzOwogICAgfQogICAgZnVuY3Rpb24gcmVhZFRhYmxlRW50cnkoZmlsZSkgewogICAgICBjb25zdCB0YWcgPSBmaWxlLmdldFN0cmluZyg0KTsKICAgICAgY29uc3QgY2hlY2tzdW0gPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IG9mZnNldCA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgY29uc3QgbGVuZ3RoID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gZmlsZS5wb3M7CiAgICAgIGZpbGUucG9zID0gZmlsZS5zdGFydCB8fCAwOwogICAgICBmaWxlLnNraXAob2Zmc2V0KTsKICAgICAgY29uc3QgZGF0YSA9IGZpbGUuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgICAgZmlsZS5wb3MgPSBwcmV2aW91c1Bvc2l0aW9uOwogICAgICBpZiAodGFnID09PSAiaGVhZCIpIHsKICAgICAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPSAwOwogICAgICAgIGRhdGFbMTddIHw9IDB4MjA7CiAgICAgI
20H0KICAgICAgcmV0dXJuIHsKICAgICAgICB0YWcsCiAgICAgICAgY2hlY2tzdW0sCiAgICAgICAgbGVuZ3RoLAogICAgICAgIG9mZnNldCwKICAgICAgICBkYXRhCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkT3BlblR5cGVIZWFkZXIodHRmKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVyc2lvbjogdHRmLmdldFN0cmluZyg0KSwKICAgICAgICBudW1UYWJsZXM6IHR0Zi5nZXRVaW50MTYoKSwKICAgICAgICBzZWFyY2hSYW5nZTogdHRmLmdldFVpbnQxNigpLAogICAgICAgIGVudHJ5U2VsZWN0b3I6IHR0Zi5nZXRVaW50MTYoKSwKICAgICAgICByYW5nZVNoaWZ0OiB0dGYuZ2V0VWludDE2KCkKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25IZWFkZXIodHRjKSB7CiAgICAgIGNvbnN0IHR0Y1RhZyA9IHR0Yy5nZXRTdHJpbmcoNCk7CiAgICAgIGFzc2VydCh0dGNUYWcgPT09ICJ0dGNmIiwgIk11c3QgYmUgYSBUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQuIik7CiAgICAgIGNvbnN0IG1ham9yVmVyc2lvbiA9IHR0Yy5nZXRVaW50MTYoKTsKICAgICAgY29uc3QgbWlub3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOwogICAgICBjb25zdCBudW1Gb250cyA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOwogICAgICBjb25zdCBvZmZzZXRUYWJsZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHsKICAgICAgICBvZmZzZXRUYWJsZS5wdXNoKHR0Yy5nZXRJbnQzMigpID4+PiAwKTsKICAgICAgfQogICAgICBjb25zdCBoZWFkZXIgPSB7CiAgICAgICAgdHRjVGFnLAogICAgICAgIG1ham9yVmVyc2lvbiwKICAgICAgICBtaW5vclZlcnNpb24sCiAgICAgICAgbnVtRm9udHMsCiAgICAgICAgb2Zmc2V0VGFibGUKICAgICAgfTsKICAgICAgc3dpdGNoIChtYWpvclZlcnNpb24pIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICByZXR1cm4gaGVhZGVyOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIGhlYWRlci5kc2lnVGFnID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBoZWFkZXIuZHNpZ0xlbmd0aCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgaGVhZGVyLmRzaWdPZmZzZXQgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIHJldHVybiBoZWFkZXI7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIFRydWVUeXBlIENvbGxlY3Rpb24gbWFqb3JWZXJzaW9uOiAke21ham9yVmVyc2lvbn0uYCk7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YSh0dGMsIGZvbnROYW1lKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBudW1Gb250cywKICAgICAgICBvZmZzZXRUYWJsZQogICAgICB9ID0gcmVhZFRydWVUeXBlQ29sbGVjdGlvbkhlYWRlcih0dGMpOwogICAgICBjb25zdCBmb250TmFtZVBhcnRzID0gZm9udE5hbWUuc3BsaXQoIisiKTsKICAgICAgbGV0IGZhbGxiYWNrRGF0YTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Gb250czsgaSsrKSB7CiAgICAgICAgdHRjLnBvcyA9ICh0dGMuc3RhcnQgfHwgMCkgKyBvZmZzZXRUYWJsZVtpXTsKICAgICAgICBjb25zdCBwb3RlbnRpYWxIZWFkZXIgPSByZWFkT3BlblR5cGVIZWFkZXIodHRjKTsKICAgICAgICBjb25zdCBwb3RlbnRpYWxUYWJsZXMgPSByZWFkVGFibGVzKHR0YywgcG90ZW50aWFsSGVhZGVyLm51bVRhYmxlcyk7CiAgICAgICAgaWYgKCFwb3RlbnRpYWxUYWJsZXMubmFtZSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdUcnVlVHlwZSBDb2xsZWN0aW9uIGZvbnQgbXVzdCBjb250YWluIGEgIm5hbWUiIHRhYmxlLicpOwogICAgICAgIH0KICAgICAgICBjb25zdCBbbmFtZVRhYmxlXSA9IHJlYWROYW1lVGFibGUocG90ZW50aWFsVGFibGVzLm5hbWUpOwogICAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IG5hbWVUYWJsZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBuYW1lVGFibGVbal0ubGVuZ3RoOyBrIDwga2s7IGsrKykgewogICAgICAgICAgICBjb25zdCBuYW1lRW50cnkgPSBuYW1lVGFibGVbal1ba10/LnJlcGxhY2VBbGwoL1xzL2csICIiKTsKICAgICAgICAgICAgaWYgKCFuYW1lRW50cnkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmFtZUVudHJ5ID09PSBmb250TmFtZSkgewogICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBoZWFkZXI6IHBvdGVudGlhbEhlYWRlciwKICAgICAgICAgICAgICAgIHRhYmxlczogcG90ZW50aWFsVGFibGVzCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZm9udE5hbWVQYXJ0cy5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGZvbnROYW1lUGFydHMpIHsKICAgICAgICAgICAgICBpZiAobmFtZUVudHJ5ID09PSBwYXJ0KSB7CiAgICAgICAgICAgICAgICBmYWxsYmFja0RhdGEgPSB7CiAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcnQsCiAgICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLAogICAgICAgICAgICAgICAgICB0YWJsZXM6IHBvdGVudGlhbFRhYmxlcwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGZhbGxiYWNrRGF0YSkgewogICAgICAgIHdhcm4oYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJHtmb250TmFtZX0iIGZvbnQsIGAgKyBgZmFsbGluZyBiYWNrIHRvICIke2ZhbGxiYWNrRGF0YS5uYW1lfSIgZm9udCBpbnN0ZWFkLmApOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBoZWFkZXI6IGZhbGxiYWNrRGF0YS5oZWFkZXIsCiAgICAgICAgICB0YWJsZXM6IGZhbGxiYWNrRGF0YS50YWJsZXMKICAgICAgICB9OwogICAgICB9CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluICIke2ZvbnROYW1lfSIgZm9udC5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRDbWFwVGFibGUoY21hcCwgZmlsZSwgaXNTeW1ib2xpY0ZvbnQsIGhhc0VuY29kaW5nKSB7CiAgICAgIGlmICghY21hcCkgewogICAgICAgI
20Hdhcm4oIk5vIGNtYXAgdGFibGUgYXZhaWxhYmxlLiIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgbGV0IHNlZ21lbnQ7CiAgICAgIGxldCBzdGFydCA9IChmaWxlLnN0YXJ0IHx8IDApICsgY21hcC5vZmZzZXQ7CiAgICAgIGZpbGUucG9zID0gc3RhcnQ7CiAgICAgIGZpbGUuc2tpcCgyKTsKICAgICAgY29uc3QgbnVtVGFibGVzID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgbGV0IHBvdGVudGlhbFRhYmxlOwogICAgICBsZXQgY2FuQnJlYWsgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICAgIGNvbnN0IHBsYXRmb3JtSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIGNvbnN0IGVuY29kaW5nSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIGNvbnN0IG9mZnNldCA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBsZXQgdXNlVGFibGUgPSBmYWxzZTsKICAgICAgICBpZiAocG90ZW50aWFsVGFibGU/LnBsYXRmb3JtSWQgPT09IHBsYXRmb3JtSWQgJiYgcG90ZW50aWFsVGFibGU/LmVuY29kaW5nSWQgPT09IGVuY29kaW5nSWQpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocGxhdGZvcm1JZCA9PT0gMCAmJiAoZW5jb2RpbmdJZCA9PT0gMCB8fCBlbmNvZGluZ0lkID09PSAxIHx8IGVuY29kaW5nSWQgPT09IDMpKSB7CiAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUlkID09PSAxICYmIGVuY29kaW5nSWQgPT09IDApIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMSAmJiAoaGFzRW5jb2RpbmcgfHwgIXBvdGVudGlhbFRhYmxlKSkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgICAgaWYgKCFpc1N5bWJvbGljRm9udCkgewogICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCAmJiBwbGF0Zm9ybUlkID09PSAzICYmIGVuY29kaW5nSWQgPT09IDApIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICAgIGxldCBjb3JyZWN0bHlTb3J0ZWQgPSB0cnVlOwogICAgICAgICAgaWYgKGkgPCBudW1UYWJsZXMgLSAxKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHRCeXRlcyA9IGZpbGUucGVla0J5dGVzKDIpLAogICAgICAgICAgICAgIG5leHRQbGF0Zm9ybUlkID0gaW50MTYobmV4dEJ5dGVzWzBdLCBuZXh0Qnl0ZXNbMV0pOwogICAgICAgICAgICBpZiAobmV4dFBsYXRmb3JtSWQgPCBwbGF0Zm9ybUlkKSB7CiAgICAgICAgICAgICAgY29ycmVjdGx5U29ydGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb3JyZWN0bHlTb3J0ZWQpIHsKICAgICAgICAgICAgY2FuQnJlYWsgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXNlVGFibGUpIHsKICAgICAgICAgIHBvdGVudGlhbFRhYmxlID0gewogICAgICAgICAgICBwbGF0Zm9ybUlkLAogICAgICAgICAgICBlbmNvZGluZ0lkLAogICAgICAgICAgICBvZmZzZXQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChjYW5CcmVhaykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkgewogICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7CiAgICAgIH0KICAgICAgaWYgKCFwb3RlbnRpYWxUYWJsZSB8fCBmaWxlLnBlZWtCeXRlKCkgPT09IC0xKSB7CiAgICAgICAgd2FybigiQ291bGQgbm90IGZpbmQgYSBwcmVmZXJyZWQgY21hcCB0YWJsZS4iKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcGxhdGZvcm1JZDogLTEsCiAgICAgICAgICBlbmNvZGluZ0lkOiAtMSwKICAgICAgICAgIG1hcHBpbmdzOiBbXSwKICAgICAgICAgIGhhc1Nob3J0Q21hcDogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IGZvcm1hdCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgIGxldCBoYXNTaG9ydENtYXAgPSBmYWxzZTsKICAgICAgY29uc3QgbWFwcGluZ3MgPSBbXTsKICAgICAgbGV0IGosIGdseXBoSWQ7CiAgICAgIGlmIChmb3JtYXQgPT09IDApIHsKICAgICAgICBmaWxlLnNraXAoMiArIDIpOwogICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgewogICAgICAgICAgY29uc3QgaW5kZXggPSBmaWxlLmdldEJ5dGUoKTsKICAgICAgICAgIGlmICghaW5kZXgpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgY2hhckNvZGU6IGosCiAgICAgICAgICAgIGdseXBoSWQ6IGluZGV4CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaGFzU2hvcnRDbWFwID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDIpIHsKICAgICAgICBmaWxlLnNraXAoMiArIDIpOwogICAgICAgIGNvbnN0IHN1YkhlYWRlcktleXMgPSBbXTsKICAgICAgICBsZXQgbWF4U3ViSGVhZGVyS2V5ID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgICBjb25zdCBzdWJIZWFkZXJLZXkgPSBmaWxlLmdldFVpbnQxNigpID4+IDM7CiAgICAgICAgICBzdWJIZWFkZXJLZXlzLnB1c2goc3ViSGVhZGVyS2V5KTsKICAgICAgICAgIG1heFN1YkhlYWRlcktleSA9IE1hdGgubWF4KHN1YkhlYWRlcktleSwgbWF4U3ViSGVhZGVyS2V5KTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3ViSGVhZGVycyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heFN1YkhlYWRlcktleTsgaSsrKSB7CiAgICAgICAgICBzdWJIZWFkZXJzLnB1c2goewogICAgICAgICAgICBmaXJzdENvZGU6IGZpbGUuZ2V0VWludDE2KCksCiAgICAgICAgICAgIGVudHJ5Q291bnQ6IGZpbGUuZ2V0VWludDE2KCksCiAgICAgICAgICAgIGl
20kRGVsdGE6IHNpZ25lZEludDE2KGZpbGUuZ2V0Qnl0ZSgpLCBmaWxlLmdldEJ5dGUoKSksCiAgICAgICAgICAgIGlkUmFuZ2VQb3M6IGZpbGUucG9zICsgZmlsZS5nZXRVaW50MTYoKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgIGlmIChzdWJIZWFkZXJLZXlzW2ldID09PSAwKSB7CiAgICAgICAgICAgIGZpbGUucG9zID0gc3ViSGVhZGVyc1swXS5pZFJhbmdlUG9zICsgMiAqIGk7CiAgICAgICAgICAgIGdseXBoSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZTogaSwKICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgcyA9IHN1YkhlYWRlcnNbc3ViSGVhZGVyS2V5c1tpXV07CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLmVudHJ5Q291bnQ7IGorKykgewogICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gKGkgPDwgOCkgKyBqICsgcy5maXJzdENvZGU7CiAgICAgICAgICAgICAgZmlsZS5wb3MgPSBzLmlkUmFuZ2VQb3MgKyAyICogajsKICAgICAgICAgICAgICBnbHlwaElkID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgICAgICAgICBpZiAoZ2x5cGhJZCAhPT0gMCkgewogICAgICAgICAgICAgICAgZ2x5cGhJZCA9IChnbHlwaElkICsgcy5pZERlbHRhKSAlIDY1NTM2OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICAgIGNoYXJDb2RlLAogICAgICAgICAgICAgICAgZ2x5cGhJZAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gNCkgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgY29uc3Qgc2VnQ291bnQgPSBmaWxlLmdldFVpbnQxNigpID4+IDE7CiAgICAgICAgZmlsZS5za2lwKDYpOwogICAgICAgIGNvbnN0IHNlZ21lbnRzID0gW107CiAgICAgICAgbGV0IHNlZ0luZGV4OwogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50cy5wdXNoKHsKICAgICAgICAgICAgZW5kOiBmaWxlLmdldFVpbnQxNigpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZmlsZS5za2lwKDIpOwogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50c1tzZWdJbmRleF0uc3RhcnQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIH0KICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgewogICAgICAgICAgc2VnbWVudHNbc2VnSW5kZXhdLmRlbHRhID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgICB9CiAgICAgICAgbGV0IG9mZnNldHNDb3VudCA9IDAsCiAgICAgICAgICBvZmZzZXRJbmRleDsKICAgICAgICBmb3IgKHNlZ0luZGV4ID0gMDsgc2VnSW5kZXggPCBzZWdDb3VudDsgc2VnSW5kZXgrKykgewogICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnRzW3NlZ0luZGV4XTsKICAgICAgICAgIGNvbnN0IHJhbmdlT2Zmc2V0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgICAgIGlmICghcmFuZ2VPZmZzZXQpIHsKICAgICAgICAgICAgc2VnbWVudC5vZmZzZXRJbmRleCA9IC0xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldEluZGV4ID0gKHJhbmdlT2Zmc2V0ID4+IDEpIC0gKHNlZ0NvdW50IC0gc2VnSW5kZXgpOwogICAgICAgICAgc2VnbWVudC5vZmZzZXRJbmRleCA9IG9mZnNldEluZGV4OwogICAgICAgICAgb2Zmc2V0c0NvdW50ID0gTWF0aC5tYXgob2Zmc2V0c0NvdW50LCBvZmZzZXRJbmRleCArIHNlZ21lbnQuZW5kIC0gc2VnbWVudC5zdGFydCArIDEpOwogICAgICAgIH0KICAgICAgICBjb25zdCBvZmZzZXRzID0gW107CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG9mZnNldHNDb3VudDsgaisrKSB7CiAgICAgICAgICBvZmZzZXRzLnB1c2goZmlsZS5nZXRVaW50MTYoKSk7CiAgICAgICAgfQogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOwogICAgICAgICAgc3RhcnQgPSBzZWdtZW50LnN0YXJ0OwogICAgICAgICAgY29uc3QgZW5kID0gc2VnbWVudC5lbmQ7CiAgICAgICAgICBjb25zdCBkZWx0YSA9IHNlZ21lbnQuZGVsdGE7CiAgICAgICAgICBvZmZzZXRJbmRleCA9IHNlZ21lbnQub2Zmc2V0SW5kZXg7CiAgICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8PSBlbmQ7IGorKykgewogICAgICAgICAgICBpZiAoaiA9PT0gMHhmZmZmKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2x5cGhJZCA9IG9mZnNldEluZGV4IDwgMCA/IGogOiBvZmZzZXRzW29mZnNldEluZGV4ICsgaiAtIHN0YXJ0XTsKICAgICAgICAgICAgZ2x5cGhJZCA9IGdseXBoSWQgKyBkZWx0YSAmIDB4ZmZmZjsKICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CiAgICAgICAgICAgICAgY2hhckNvZGU6IGosCiAgICAgICAgICAgICAgZ2x5cGhJZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA2KSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyAyKTsKICAgICAgICBjb25zdCBmaXJzdENvZGUgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIGNvbnN0IGVudHJ5Q291bnQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBlbnRyeUNvdW50OyBqKyspIHsKICAgICAgICAgIGdseXBoSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgY29uc3QgY2hhckNvZGUgPSBmaXJzdENvZGUgKyBqOwogICAgICAgICAgbWFwcGluZ3MucHVzaCh7CiAgICAgICAgICAgIGNoYXJDb2RlLAogICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgI
20H0gZWxzZSBpZiAoZm9ybWF0ID09PSAxMikgewogICAgICAgIGZpbGUuc2tpcCgyICsgNCArIDQpOwogICAgICAgIGNvbnN0IG5Hcm91cHMgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IG5Hcm91cHM7IGorKykgewogICAgICAgICAgY29uc3Qgc3RhcnRDaGFyQ29kZSA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIGNvbnN0IGVuZENoYXJDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgbGV0IGdseXBoQ29kZSA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIGZvciAobGV0IGNoYXJDb2RlID0gc3RhcnRDaGFyQ29kZTsgY2hhckNvZGUgPD0gZW5kQ2hhckNvZGU7IGNoYXJDb2RlKyspIHsKICAgICAgICAgICAgbWFwcGluZ3MucHVzaCh7CiAgICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgICAgZ2x5cGhJZDogZ2x5cGhDb2RlKysKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oImNtYXAgdGFibGUgaGFzIHVuc3VwcG9ydGVkIGZvcm1hdDogIiArIGZvcm1hdCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHBsYXRmb3JtSWQ6IC0xLAogICAgICAgICAgZW5jb2RpbmdJZDogLTEsCiAgICAgICAgICBtYXBwaW5nczogW10sCiAgICAgICAgICBoYXNTaG9ydENtYXA6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBtYXBwaW5ncy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEuY2hhckNvZGUgLSBiLmNoYXJDb2RlOwogICAgICB9KTsKICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtYXBwaW5nc1tpIC0gMV0uY2hhckNvZGUgPT09IG1hcHBpbmdzW2ldLmNoYXJDb2RlKSB7CiAgICAgICAgICBtYXBwaW5ncy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICBpLS07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgcGxhdGZvcm1JZDogcG90ZW50aWFsVGFibGUucGxhdGZvcm1JZCwKICAgICAgICBlbmNvZGluZ0lkOiBwb3RlbnRpYWxUYWJsZS5lbmNvZGluZ0lkLAogICAgICAgIG1hcHBpbmdzLAogICAgICAgIGhhc1Nob3J0Q21hcAogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc2FuaXRpemVNZXRyaWNzKGZpbGUsIGhlYWRlciwgbWV0cmljcywgaGVhZFRhYmxlLCBudW1HbHlwaHMsIGR1cEZpcnN0RW50cnkpIHsKICAgICAgaWYgKCFoZWFkZXIpIHsKICAgICAgICBpZiAobWV0cmljcykgewogICAgICAgICAgbWV0cmljcy5kYXRhID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZpbGUucG9zID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBoZWFkZXIub2Zmc2V0OwogICAgICBmaWxlLnBvcyArPSA0OwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBjb25zdCBjYXJldE9mZnNldCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgIGZpbGUucG9zICs9IDg7CiAgICAgIGZpbGUucG9zICs9IDI7CiAgICAgIGxldCBudW1PZk1ldHJpY3MgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICBpZiAoY2FyZXRPZmZzZXQgIT09IDApIHsKICAgICAgICBjb25zdCBtYWNTdHlsZSA9IGludDE2KGhlYWRUYWJsZS5kYXRhWzQ0XSwgaGVhZFRhYmxlLmRhdGFbNDVdKTsKICAgICAgICBpZiAoIShtYWNTdHlsZSAmIDIpKSB7CiAgICAgICAgICBoZWFkZXIuZGF0YVsyMl0gPSAwOwogICAgICAgICAgaGVhZGVyLmRhdGFbMjNdID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG51bU9mTWV0cmljcyA+IG51bUdseXBocykgewogICAgICAgIGluZm8oYFRoZSBudW1PZk1ldHJpY3MgKCR7bnVtT2ZNZXRyaWNzfSkgc2hvdWxkIG5vdCBiZSBgICsgYGdyZWF0ZXIgdGhhbiB0aGUgbnVtR2x5cGhzICgke251bUdseXBoc30pLmApOwogICAgICAgIG51bU9mTWV0cmljcyA9IG51bUdseXBoczsKICAgICAgICBoZWFkZXIuZGF0YVszNF0gPSAobnVtT2ZNZXRyaWNzICYgMHhmZjAwKSA+PiA4OwogICAgICAgIGhlYWRlci5kYXRhWzM1XSA9IG51bU9mTWV0cmljcyAmIDB4MDBmZjsKICAgICAgfQogICAgICBjb25zdCBudW1PZlNpZGViZWFyaW5ncyA9IG51bUdseXBocyAtIG51bU9mTWV0cmljczsKICAgICAgY29uc3QgbnVtTWlzc2luZyA9IG51bU9mU2lkZWJlYXJpbmdzIC0gKG1ldHJpY3MubGVuZ3RoIC0gbnVtT2ZNZXRyaWNzICogNCA+PiAxKTsKICAgICAgaWYgKG51bU1pc3NpbmcgPiAwKSB7CiAgICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBVaW50OEFycmF5KG1ldHJpY3MubGVuZ3RoICsgbnVtTWlzc2luZyAqIDIpOwogICAgICAgIGVudHJpZXMuc2V0KG1ldHJpY3MuZGF0YSk7CiAgICAgICAgaWYgKGR1cEZpcnN0RW50cnkpIHsKICAgICAgICAgIGVudHJpZXNbbWV0cmljcy5sZW5ndGhdID0gbWV0cmljcy5kYXRhWzJdOwogICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aCArIDFdID0gbWV0cmljcy5kYXRhWzNdOwogICAgICAgIH0KICAgICAgICBtZXRyaWNzLmRhdGEgPSBlbnRyaWVzOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgZGVzdCwgZGVzdFN0YXJ0LCBoaW50c1ZhbGlkKSB7CiAgICAgIGNvbnN0IGdseXBoUHJvZmlsZSA9IHsKICAgICAgICBsZW5ndGg6IDAsCiAgICAgICAgc2l6ZU9mSW5zdHJ1Y3Rpb25zOiAwCiAgICAgIH07CiAgICAgIGlmIChzb3VyY2VTdGFydCA8IDAgfHwgc291cmNlU3RhcnQgPj0gc291cmNlLmxlbmd0aCB8fCBzb3VyY2VFbmQgPiBzb3VyY2UubGVuZ3RoIHx8IHNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0IDw9IDEyKSB7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBjb25zdCBnbHlmID0gc291cmNlLnN1YmFycmF5KHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwogICAgICBjb25zdCB4TWluID0gc2lnbmVkSW50MTYoZ2x5ZlsyXSwgZ2x5ZlszXSk7CiAgICAgIGNvbnN0IHlNaW4gPSBzaWduZWRJbnQxNihnbHlmWzRdLCBnbHlmWzVdKTsKICAgICAgY29uc3QgeE1heCA9IHNpZ25lZEludDE2KGdseWZbNl0sIGdseWZbN10pOwogICAgICBjb25zdCB5TWF4ID0gc2lnbmVkSW50MTYoZ2x5Zls4XSwgZ2x5Zls5XSk7CiAgICAgIGlmICh4TWluID4geE1heCkgewogICAgICAgI
20HdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgMiwgeE1heCk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCA2LCB4TWluKTsKICAgICAgfQogICAgICBpZiAoeU1pbiA+IHlNYXgpIHsKICAgICAgICB3cml0ZVNpZ25lZEludDE2KGdseWYsIDQsIHlNYXgpOwogICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgOCwgeU1pbik7CiAgICAgIH0KICAgICAgY29uc3QgY29udG91cnNDb3VudCA9IHNpZ25lZEludDE2KGdseWZbMF0sIGdseWZbMV0pOwogICAgICBpZiAoY29udG91cnNDb3VudCA8IDApIHsKICAgICAgICBpZiAoY29udG91cnNDb3VudCA8IC0xKSB7CiAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICAgIH0KICAgICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOwogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlmLmxlbmd0aDsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGxldCBpLAogICAgICAgIGogPSAxMCwKICAgICAgICBmbGFnc0NvdW50ID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRvdXJzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IGVuZFBvaW50ID0gZ2x5ZltqXSA8PCA4IHwgZ2x5ZltqICsgMV07CiAgICAgICAgZmxhZ3NDb3VudCA9IGVuZFBvaW50ICsgMTsKICAgICAgICBqICs9IDI7CiAgICAgIH0KICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zU3RhcnQgPSBqOwogICAgICBjb25zdCBpbnN0cnVjdGlvbnNMZW5ndGggPSBnbHlmW2pdIDw8IDggfCBnbHlmW2ogKyAxXTsKICAgICAgZ2x5cGhQcm9maWxlLnNpemVPZkluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0xlbmd0aDsKICAgICAgaiArPSAyICsgaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICBjb25zdCBpbnN0cnVjdGlvbnNFbmQgPSBqOwogICAgICBsZXQgY29vcmRpbmF0ZXNMZW5ndGggPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgZmxhZ3NDb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgZmxhZyA9IGdseWZbaisrXTsKICAgICAgICBpZiAoZmxhZyAmIDB4YzApIHsKICAgICAgICAgIGdseWZbaiAtIDFdID0gZmxhZyAmIDB4M2Y7CiAgICAgICAgfQogICAgICAgIGxldCB4TGVuZ3RoID0gMjsKICAgICAgICBpZiAoZmxhZyAmIDIpIHsKICAgICAgICAgIHhMZW5ndGggPSAxOwogICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIDE2KSB7CiAgICAgICAgICB4TGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgbGV0IHlMZW5ndGggPSAyOwogICAgICAgIGlmIChmbGFnICYgNCkgewogICAgICAgICAgeUxlbmd0aCA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMzIpIHsKICAgICAgICAgIHlMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCB4eUxlbmd0aCA9IHhMZW5ndGggKyB5TGVuZ3RoOwogICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHh5TGVuZ3RoOwogICAgICAgIGlmIChmbGFnICYgOCkgewogICAgICAgICAgY29uc3QgcmVwZWF0ID0gZ2x5ZltqKytdOwogICAgICAgICAgaWYgKHJlcGVhdCA9PT0gMCkgewogICAgICAgICAgICBnbHlmW2ogLSAxXSBePSA4OwogICAgICAgICAgfQogICAgICAgICAgaSArPSByZXBlYXQ7CiAgICAgICAgICBjb29yZGluYXRlc0xlbmd0aCArPSByZXBlYXQgKiB4eUxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNvb3JkaW5hdGVzTGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBsZXQgZ2x5cGhEYXRhTGVuZ3RoID0gaiArIGNvb3JkaW5hdGVzTGVuZ3RoOwogICAgICBpZiAoZ2x5cGhEYXRhTGVuZ3RoID4gZ2x5Zi5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGlmICghaGludHNWYWxpZCAmJiBpbnN0cnVjdGlvbnNMZW5ndGggPiAwKSB7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBpbnN0cnVjdGlvbnNTdGFydCksIGRlc3RTdGFydCk7CiAgICAgICAgZGVzdC5zZXQoWzAsIDBdLCBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCk7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheShpbnN0cnVjdGlvbnNFbmQsIGdseXBoRGF0YUxlbmd0aCksIGRlc3RTdGFydCArIGluc3RydWN0aW9uc1N0YXJ0ICsgMik7CiAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoIC09IGluc3RydWN0aW9uc0xlbmd0aDsKICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CiAgICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CiAgICAgICAgfQogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CiAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoICsgMyAmIH4zOwogICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgZ2x5cGhEYXRhTGVuZ3RoKSwgZGVzdFN0YXJ0KTsKICAgICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoOwogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTsKICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOwogICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgfQogICAgZnVuY3Rpb24gc2FuaXRpemVIZWFkKGhlYWQsIG51bUdseXBocywgbG9jYUxlbmd0aCkgewogICAgICBjb25zdCBkYXRhID0gaGVhZC5kYXRhOwogICAgICBjb25zdCB2ZXJzaW9uID0gaW50MzIoZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CiAgICAgIGlmICh2ZXJzaW9uID4+IDE2ICE9PSAxKSB7CiAgICAgICAgaW5mbygiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCB2ZXJzaW9uIGluIGhlYWQgdGFibGU6ICIgKyB2ZXJzaW9uKTsKICAgICAgICBkYXRhWzBdID0gMDsKICAgICAgICBkYXRhWzFdID0gMTsKICAgICAgICBkYXRhWzJdID0gMDsKICAgICAgICBkYXRhWzNdID0gMDsKICAgICAgfQogICAgICBjb25zdCBpbmRleFRvTG9jRm9ybWF0ID0gaW50MTYoZGF0YVs1MF0sIGRhdGFbNTFdKTsKICAgICAgaWYgKGluZGV4VG9Mb2NGb3JtYXQgPCAwIHx8IGluZGV4VG9Mb2NGb3JtYXQgPiAxKSB7CiAgICAgICAgaW5mbygiQXR0ZW1wdGluZyB0byBmaXggaW52YWxpZCBpbmRleFRvTG9jRm9ybWF0IGluIGhlYWQgdGFibGU6ICIgKyBpbmRleFRvTG9jRm9ybWF0KTsKICAgICAgICBjb25zdCBudW1HbHlwaHNQbHVzT25lID0gbnVtR2x5cGhzICsgMTsKICAgICAgICBpZiAobG9jYUxlbmd0aCA9PT0gbnVtR2x5cGhzUGx1c09uZSA8PCAxKSB7CiAgICAgICAgICBkYXRhWzUwXSA9IDA7CiAgICAgICAgICBkYXRhWzUxXSA9IDA7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhTGVuZ3RoID09PSBudW1HbHlwaHNQbHVzT25lIDw8IDIpIHsKICAgICAgICAgIGRhdGFbNTBdID0gMDsKICAgICAgICAgIGRhdGFbNTFdID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJDb3VsZCBub3QgZml4IGluZGV4VG9Mb2NGb3JtYXQ6ICIgKyBpbmRleFRvTG9jRm9ybWF0KTsKICAgICAgICB9CiAgICAgI
20H0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplR2x5cGhMb2NhdGlvbnMobG9jYSwgZ2x5ZiwgbnVtR2x5cGhzLCBpc0dseXBoTG9jYXRpb25zTG9uZywgaGludHNWYWxpZCwgZHVwRmlyc3RFbnRyeSwgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7CiAgICAgIGxldCBpdGVtU2l6ZSwgaXRlbURlY29kZSwgaXRlbUVuY29kZTsKICAgICAgaWYgKGlzR2x5cGhMb2NhdGlvbnNMb25nKSB7CiAgICAgICAgaXRlbVNpemUgPSA0OwogICAgICAgIGl0ZW1EZWNvZGUgPSBmdW5jdGlvbiBmb250SXRlbURlY29kZUxvbmcoZGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDI0IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxNiB8IGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgM107CiAgICAgICAgfTsKICAgICAgICBpdGVtRW5jb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGVMb25nKGRhdGEsIG9mZnNldCwgdmFsdWUpIHsKICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IHZhbHVlID4+PiAyNCAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDFdID0gdmFsdWUgPj4gMTYgJiAweGZmOwogICAgICAgICAgZGF0YVtvZmZzZXQgKyAyXSA9IHZhbHVlID4+IDggJiAweGZmOwogICAgICAgICAgZGF0YVtvZmZzZXQgKyAzXSA9IHZhbHVlICYgMHhmZjsKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIGl0ZW1TaXplID0gMjsKICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGUoZGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICByZXR1cm4gZGF0YVtvZmZzZXRdIDw8IDkgfCBkYXRhW29mZnNldCArIDFdIDw8IDE7CiAgICAgICAgfTsKICAgICAgICBpdGVtRW5jb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1FbmNvZGUoZGF0YSwgb2Zmc2V0LCB2YWx1ZSkgewogICAgICAgICAgZGF0YVtvZmZzZXRdID0gdmFsdWUgPj4gOSAmIDB4ZmY7CiAgICAgICAgICBkYXRhW29mZnNldCArIDFdID0gdmFsdWUgPj4gMSAmIDB4ZmY7CiAgICAgICAgfTsKICAgICAgfQogICAgICBjb25zdCBudW1HbHlwaHNPdXQgPSBkdXBGaXJzdEVudHJ5ID8gbnVtR2x5cGhzICsgMSA6IG51bUdseXBoczsKICAgICAgY29uc3QgbG9jYURhdGFTaXplID0gaXRlbVNpemUgKiAoMSArIG51bUdseXBoc091dCk7CiAgICAgIGNvbnN0IGxvY2FEYXRhID0gbmV3IFVpbnQ4QXJyYXkobG9jYURhdGFTaXplKTsKICAgICAgbG9jYURhdGEuc2V0KGxvY2EuZGF0YS5zdWJhcnJheSgwLCBsb2NhRGF0YVNpemUpKTsKICAgICAgbG9jYS5kYXRhID0gbG9jYURhdGE7CiAgICAgIGNvbnN0IG9sZEdseWZEYXRhID0gZ2x5Zi5kYXRhOwogICAgICBjb25zdCBvbGRHbHlmRGF0YUxlbmd0aCA9IG9sZEdseWZEYXRhLmxlbmd0aDsKICAgICAgY29uc3QgbmV3R2x5ZkRhdGEgPSBuZXcgVWludDhBcnJheShvbGRHbHlmRGF0YUxlbmd0aCk7CiAgICAgIGxldCBpLCBqOwogICAgICBjb25zdCBsb2NhRW50cmllcyA9IFtdOwogICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bUdseXBocyArIDE7IGkrKywgaiArPSBpdGVtU2l6ZSkgewogICAgICAgIGxldCBvZmZzZXQgPSBpdGVtRGVjb2RlKGxvY2FEYXRhLCBqKTsKICAgICAgICBpZiAob2Zmc2V0ID4gb2xkR2x5ZkRhdGFMZW5ndGgpIHsKICAgICAgICAgIG9mZnNldCA9IG9sZEdseWZEYXRhTGVuZ3RoOwogICAgICAgIH0KICAgICAgICBsb2NhRW50cmllcy5wdXNoKHsKICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgb2Zmc2V0LAogICAgICAgICAgZW5kT2Zmc2V0OiAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbG9jYUVudHJpZXMuc29ydCgoYSwgYikgPT4gYS5vZmZzZXQgLSBiLm9mZnNldCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICAgIGxvY2FFbnRyaWVzW2ldLmVuZE9mZnNldCA9IGxvY2FFbnRyaWVzW2kgKyAxXS5vZmZzZXQ7CiAgICAgIH0KICAgICAgbG9jYUVudHJpZXMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKICAgICAgICBjb25zdCB7CiAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICBlbmRPZmZzZXQKICAgICAgICB9ID0gbG9jYUVudHJpZXNbaV07CiAgICAgICAgaWYgKG9mZnNldCAhPT0gMCB8fCBlbmRPZmZzZXQgIT09IDApIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXh0T2Zmc2V0ID0gbG9jYUVudHJpZXNbaSArIDFdLm9mZnNldDsKICAgICAgICBpZiAobmV4dE9mZnNldCA9PT0gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxvY2FFbnRyaWVzW2ldLmVuZE9mZnNldCA9IG5leHRPZmZzZXQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY29uc3QgbGFzdCA9IGxvY2FFbnRyaWVzLmF0KC0yKTsKICAgICAgaWYgKGxhc3Qub2Zmc2V0ICE9PSAwICYmIGxhc3QuZW5kT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgbGFzdC5lbmRPZmZzZXQgPSBvbGRHbHlmRGF0YUxlbmd0aDsKICAgICAgfQogICAgICBjb25zdCBtaXNzaW5nR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGV0IHdyaXRlT2Zmc2V0ID0gMDsKICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgMCwgd3JpdGVPZmZzZXQpOwogICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHM7IGkrKywgaiArPSBpdGVtU2l6ZSkgewogICAgICAgIGNvbnN0IGdseXBoUHJvZmlsZSA9IHNhbml0aXplR2x5cGgob2xkR2x5ZkRhdGEsIGxvY2FFbnRyaWVzW2ldLm9mZnNldCwgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0LCBuZXdHbHlmRGF0YSwgd3JpdGVPZmZzZXQsIGhpbnRzVmFsaWQpOwogICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IGdseXBoUHJvZmlsZS5sZW5ndGg7CiAgICAgICAgaWYgKG5ld0xlbmd0aCA9PT0gMCkgewogICAgICAgICAgbWlzc2luZ0dseXBoc1tpXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID4gbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zOwogICAgICAgI
20H0KICAgICAgICB3cml0ZU9mZnNldCArPSBuZXdMZW5ndGg7CiAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgd3JpdGVPZmZzZXQpOwogICAgICB9CiAgICAgIGlmICh3cml0ZU9mZnNldCA9PT0gMCkgewogICAgICAgIGNvbnN0IHNpbXBsZUdseXBoID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQ5LCAwXSk7CiAgICAgICAgZm9yIChpID0gMCwgaiA9IGl0ZW1TaXplOyBpIDwgbnVtR2x5cGhzT3V0OyBpKyssIGogKz0gaXRlbVNpemUpIHsKICAgICAgICAgIGl0ZW1FbmNvZGUobG9jYURhdGEsIGosIHNpbXBsZUdseXBoLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGdseWYuZGF0YSA9IHNpbXBsZUdseXBoOwogICAgICB9IGVsc2UgaWYgKGR1cEZpcnN0RW50cnkpIHsKICAgICAgICBjb25zdCBmaXJzdEVudHJ5TGVuZ3RoID0gaXRlbURlY29kZShsb2NhRGF0YSwgaXRlbVNpemUpOwogICAgICAgIGlmIChuZXdHbHlmRGF0YS5sZW5ndGggPiBmaXJzdEVudHJ5TGVuZ3RoICsgd3JpdGVPZmZzZXQpIHsKICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdseWYuZGF0YSA9IG5ldyBVaW50OEFycmF5KGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CiAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KSk7CiAgICAgICAgfQogICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCksIHdyaXRlT2Zmc2V0KTsKICAgICAgICBpdGVtRW5jb2RlKGxvY2EuZGF0YSwgbG9jYURhdGEubGVuZ3RoIC0gaXRlbVNpemUsIHdyaXRlT2Zmc2V0ICsgZmlyc3RFbnRyeUxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2x5Zi5kYXRhID0gbmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgd3JpdGVPZmZzZXQpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgbWlzc2luZ0dseXBocywKICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUocG9zdCwgcHJvcGVydGllc09iaiwgbWF4cE51bUdseXBocykgewogICAgICBjb25zdCBzdGFydCA9IChmb250LnN0YXJ0IHx8IDApICsgcG9zdC5vZmZzZXQ7CiAgICAgIGZvbnQucG9zID0gc3RhcnQ7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc3QubGVuZ3RoLAogICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICBjb25zdCB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpOwogICAgICBmb250LnNraXAoMjgpOwogICAgICBsZXQgZ2x5cGhOYW1lczsKICAgICAgbGV0IHZhbGlkID0gdHJ1ZTsKICAgICAgbGV0IGk7CiAgICAgIHN3aXRjaCAodmVyc2lvbikgewogICAgICAgIGNhc2UgMHgwMDAxMDAwMDoKICAgICAgICAgIGdseXBoTmFtZXMgPSBNYWNTdGFuZGFyZEdseXBoT3JkZXJpbmc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMjAwMDA6CiAgICAgICAgICBjb25zdCBudW1HbHlwaHMgPSBmb250LmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKG51bUdseXBocyAhPT0gbWF4cE51bUdseXBocykgewogICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGdseXBoTmFtZUluZGV4ZXMgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgewogICAgICAgICAgICBjb25zdCBpbmRleCA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSAzMjc2OCkgewogICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2x5cGhOYW1lSW5kZXhlcy5wdXNoKGluZGV4KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjdXN0b21OYW1lcyA9IFtdLAogICAgICAgICAgICBzdHJCdWYgPSBbXTsKICAgICAgICAgIHdoaWxlIChmb250LnBvcyA8IGVuZCkgewogICAgICAgICAgICBjb25zdCBzdHJpbmdMZW5ndGggPSBmb250LmdldEJ5dGUoKTsKICAgICAgICAgICAgc3RyQnVmLmxlbmd0aCA9IHN0cmluZ0xlbmd0aDsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ0xlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgc3RyQnVmW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdldEJ5dGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VzdG9tTmFtZXMucHVzaChzdHJCdWYuam9pbigiIikpOwogICAgICAgICAgfQogICAgICAgICAgZ2x5cGhOYW1lcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUdseXBoczsgKytpKSB7CiAgICAgICAgICAgIGNvbnN0IGogPSBnbHlwaE5hbWVJbmRleGVzW2ldOwogICAgICAgICAgICBpZiAoaiA8IDI1OCkgewogICAgICAgICAgICAgIGdseXBoTmFtZXMucHVzaChNYWNTdGFuZGFyZEdseXBoT3JkZXJpbmdbal0pOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdseXBoTmFtZXMucHVzaChjdXN0b21OYW1lc1tqIC0gMjU4XSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDAwMzAwMDA6CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgd2FybigiVW5rbm93bi91bnN1cHBvcnRlZCBwb3N0IHRhYmxlIHZlcnNpb24gIiArIHZlcnNpb24pOwogICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgIGlmIChwcm9wZXJ0aWVzT2JqLmRlZmF1bHRFbmNvZGluZykgewogICAgICAgICAgICBnbHlwaE5hbWVzID0gcHJvcGVydGllc09iai5kZWZhdWx0RW5jb2Rpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwcm9wZXJ0aWVzT2JqLmdseXBoTmFtZXMgPSBnbHlwaE5hbWVzO
20wogICAgICByZXR1cm4gdmFsaWQ7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkTmFtZVRhYmxlKG5hbWVUYWJsZSkgewogICAgICBjb25zdCBzdGFydCA9IChmb250LnN0YXJ0IHx8IDApICsgbmFtZVRhYmxlLm9mZnNldDsKICAgICAgZm9udC5wb3MgPSBzdGFydDsKICAgICAgY29uc3QgbmFtZXMgPSBbW10sIFtdXSwKICAgICAgICByZWNvcmRzID0gW107CiAgICAgIGNvbnN0IGxlbmd0aCA9IG5hbWVUYWJsZS5sZW5ndGgsCiAgICAgICAgZW5kID0gc3RhcnQgKyBsZW5ndGg7CiAgICAgIGNvbnN0IGZvcm1hdCA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IEZPUk1BVF8wX0hFQURFUl9MRU5HVEggPSA2OwogICAgICBpZiAoZm9ybWF0ICE9PSAwIHx8IGxlbmd0aCA8IEZPUk1BVF8wX0hFQURFUl9MRU5HVEgpIHsKICAgICAgICByZXR1cm4gW25hbWVzLCByZWNvcmRzXTsKICAgICAgfQogICAgICBjb25zdCBudW1SZWNvcmRzID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgY29uc3Qgc3RyaW5nc1N0YXJ0ID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgY29uc3QgTkFNRV9SRUNPUkRfTEVOR1RIID0gMTI7CiAgICAgIGxldCBpLCBpaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bVJlY29yZHMgJiYgZm9udC5wb3MgKyBOQU1FX1JFQ09SRF9MRU5HVEggPD0gZW5kOyBpKyspIHsKICAgICAgICBjb25zdCByID0gewogICAgICAgICAgcGxhdGZvcm06IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBlbmNvZGluZzogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIGxhbmd1YWdlOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgbmFtZTogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIGxlbmd0aDogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIG9mZnNldDogZm9udC5nZXRVaW50MTYoKQogICAgICAgIH07CiAgICAgICAgaWYgKGlzTWFjTmFtZVJlY29yZChyKSB8fCBpc1dpbk5hbWVSZWNvcmQocikpIHsKICAgICAgICAgIHJlY29yZHMucHVzaChyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChpID0gMCwgaWkgPSByZWNvcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCByZWNvcmQgPSByZWNvcmRzW2ldOwogICAgICAgIGlmIChyZWNvcmQubGVuZ3RoIDw9IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwb3MgPSBzdGFydCArIHN0cmluZ3NTdGFydCArIHJlY29yZC5vZmZzZXQ7CiAgICAgICAgaWYgKHBvcyArIHJlY29yZC5sZW5ndGggPiBlbmQpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBmb250LnBvcyA9IHBvczsKICAgICAgICBjb25zdCBuYW1lSW5kZXggPSByZWNvcmQubmFtZTsKICAgICAgICBpZiAocmVjb3JkLmVuY29kaW5nKSB7CiAgICAgICAgICBsZXQgc3RyID0gIiI7CiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSByZWNvcmQubGVuZ3RoOyBqIDwgamo7IGogKz0gMikgewogICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdldFVpbnQxNigpKTsKICAgICAgICAgIH0KICAgICAgICAgIG5hbWVzWzFdW25hbWVJbmRleF0gPSBzdHI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5hbWVzWzBdW25hbWVJbmRleF0gPSBmb250LmdldFN0cmluZyhyZWNvcmQubGVuZ3RoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIFtuYW1lcywgcmVjb3Jkc107CiAgICB9CiAgICBjb25zdCBUVE9wc1N0YWNrRGVsdGFzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0yLCAtMiwgLTIsIC0yLCAwLCAwLCAtMiwgLTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMSwgLTk5OSwgMCwgMSwgMCwgLTEsIC0yLCAwLCAtMSwgLTIsIC0xLCAtMSwgMCwgLTEsIC0xLCAwLCAwLCAtOTk5LCAtOTk5LCAtMSwgLTEsIC0xLCAtMSwgLTIsIC05OTksIC0yLCAtMiwgLTk5OSwgMCwgLTIsIC0yLCAwLCAwLCAtMiwgMCwgLTIsIDAsIDAsIDAsIC0yLCAtMSwgLTEsIDEsIDEsIDAsIDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAtMSwgMCwgLTEsIC0xLCAwLCAtOTk5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMiwgLTk5OSwgLTk5OSwgLTk5OSwgLTk5OSwgLTk5OSwgLTEsIC0xLCAtMiwgLTIsIDAsIDAsIDAsIDAsIC0xLCAtMSwgLTk5OSwgLTIsIC0yLCAwLCAwLCAtMSwgLTIsIC0yLCAwLCAwLCAwLCAtMSwgLTEsIC0xLCAtMl07CiAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbSh0YWJsZSwgdHRDb250ZXh0KSB7CiAgICAgIGxldCBkYXRhID0gdGFibGUuZGF0YTsKICAgICAgbGV0IGkgPSAwLAogICAgICAgIGosCiAgICAgICAgbiwKICAgICAgICBiLAogICAgICAgIGZ1bmNJZCwKICAgICAgICBwYywKICAgICAgICBsYXN0RW5kZiA9IDAsCiAgICAgICAgbGFzdERlZmYgPSAwOwogICAgICBjb25zdCBzdGFjayA9IFtdOwogICAgICBjb25zdCBjYWxsc3RhY2sgPSBbXTsKICAgICAgY29uc3QgZnVuY3Rpb25zQ2FsbGVkID0gW107CiAgICAgIGxldCB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zOwogICAgICBsZXQgaW5GREVGID0gZmFsc2UsCiAgICAgICAgaWZMZXZlbCA9IDAsCiAgICAgICAgaW5FTFNFID0gMDsKICAgICAgZm9yIChsZXQgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOykgewogICAgICAgIGNvbnN0IG9wID0gZGF0YVtpKytdOwogICAgICAgIGlmIChvcCA9PT0gMHg0MCkgewogICAgICAgICAgbiA9IGRhdGFbaSsrXTsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIGkgKz0gbjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDQxKSB7CiAgICAgICAgICBuID0gZGF0YVtpKytdOwogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgaSArPSBuICogMjsKICAgICAgICAgI
20H0gZWxzZSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICBiID0gZGF0YVtpKytdOwogICAgICAgICAgICAgIHN0YWNrLnB1c2goYiA8PCA4IHwgZGF0YVtpKytdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmOCkgPT09IDB4YjApIHsKICAgICAgICAgIG4gPSBvcCAtIDB4YjAgKyAxOwogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgaSArPSBuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgIHN0YWNrLnB1c2goZGF0YVtpKytdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhmOCkgPT09IDB4YjgpIHsKICAgICAgICAgIG4gPSBvcCAtIDB4YjggKyAxOwogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgaSArPSBuICogMjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICBiID0gZGF0YVtpKytdOwogICAgICAgICAgICAgIHN0YWNrLnB1c2goc2lnbmVkSW50MTYoYiwgZGF0YVtpKytdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJiICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKICAgICAgICAgICAgZnVuY0lkID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgICBpZiAoaXNOYU4oZnVuY0lkKSkgewogICAgICAgICAgICAgIGluZm8oIlRUOiBDQUxMIGVtcHR5IHN0YWNrIChvciBpbnZhbGlkIGVudHJ5KS4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0dENvbnRleHQuZnVuY3Rpb25zVXNlZFtmdW5jSWRdID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAoZnVuY0lkIGluIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhcykgewogICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhY2tMZW5ndGggPSBzdGFjay5sZW5ndGggKyB0dENvbnRleHQuZnVuY3Rpb25zU3RhY2tEZWx0YXNbZnVuY0lkXTsKICAgICAgICAgICAgICAgIGlmIChuZXdTdGFja0xlbmd0aCA8IDApIHsKICAgICAgICAgICAgICAgICAgd2FybigiVFQ6IENBTEwgaW52YWxpZCBmdW5jdGlvbnMgc3RhY2sgZGVsdGEuIik7CiAgICAgICAgICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IG5ld1N0YWNrTGVuZ3RoOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnVuY0lkIGluIHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkICYmICFmdW5jdGlvbnNDYWxsZWQuaW5jbHVkZXMoZnVuY0lkKSkgewogICAgICAgICAgICAgICAgY2FsbHN0YWNrLnB1c2goewogICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICBzdGFja1RvcDogc3RhY2subGVuZ3RoIC0gMQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbnNDYWxsZWQucHVzaChmdW5jSWQpOwogICAgICAgICAgICAgICAgcGMgPSB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZFtmdW5jSWRdOwogICAgICAgICAgICAgICAgaWYgKCFwYykgewogICAgICAgICAgICAgICAgICB3YXJuKCJUVDogQ0FMTCBub24tZXhpc3RlbnQgZnVuY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CiAgICAgICAgICAgICAgICBpID0gcGMuaTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJjICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIHdhcm4oIlRUOiBuZXN0ZWQgRkRFRnMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGluRkRFRiA9IHRydWU7CiAgICAgICAgICBsYXN0RGVmZiA9IGk7CiAgICAgICAgICBmdW5jSWQgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNEZWZpbmVkW2Z1bmNJZF0gPSB7CiAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgIGkKICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHgyZCkgewogICAgICAgICAgaWYgKGluRkRFRikgewogICAgICAgICAgICBpbkZERUYgPSBmYWxzZTsKICAgICAgICAgICAgbGFzdEVuZGYgPSBpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGMgPSBjYWxsc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGlmICghcGMpIHsKICAgICAgICAgICAgICB3YXJuKCJUVDogRU5ERiBiYWQgc3RhY2siKTsKICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jSWQgPSBmdW5jdGlvbnNDYWxsZWQucG9wKCk7CiAgICAgICAgICAgIGRhdGEgPSBwYy5kYXRhOwogICAgICAgICAgICBpID0gcGMuaTsKICAgICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzW2Z1bmNJZF0gPSBzdGFjay5sZW5ndGggLSBwYy5zdGFja1RvcDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDg5KSB7CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICB3YXJuKCJUVDogbmVzdGVkIElERUZzIG5vdCBhbGxvd2VkIik7CiAgICAgICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpbkZERUYgPSB0cnVlOw
20ogICAgICAgICAgbGFzdERlZmYgPSBpOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTgpIHsKICAgICAgICAgICsraWZMZXZlbDsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDFiKSB7CiAgICAgICAgICBpbkVMU0UgPSBpZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTkpIHsKICAgICAgICAgIGlmIChpbkVMU0UgPT09IGlmTGV2ZWwpIHsKICAgICAgICAgICAgaW5FTFNFID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIC0taWZMZXZlbDsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDFjKSB7CiAgICAgICAgICBpZiAoIWluRkRFRiAmJiAhaW5FTFNFKSB7CiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YWNrLmF0KC0xKTsKICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKICAgICAgICAgICAgICBpICs9IG9mZnNldCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgewogICAgICAgICAgbGV0IHN0YWNrRGVsdGEgPSAwOwogICAgICAgICAgaWYgKG9wIDw9IDB4OGUpIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IFRUT3BzU3RhY2tEZWx0YXNbb3BdOwogICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGMwICYmIG9wIDw9IDB4ZGYpIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0xOwogICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGUwKSB7CiAgICAgICAgICAgIHN0YWNrRGVsdGEgPSAtMjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcCA+PSAweDcxICYmIG9wIDw9IDB4NzUpIHsKICAgICAgICAgICAgbiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBpZiAoIWlzTmFOKG4pKSB7CiAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC1uICogMjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPCAwICYmIHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHN0YWNrRGVsdGErKzsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChzdGFja0RlbHRhID4gMCkgewogICAgICAgICAgICBzdGFjay5wdXNoKE5hTik7CiAgICAgICAgICAgIHN0YWNrRGVsdGEtLTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKICAgICAgY29uc3QgY29udGVudCA9IFtkYXRhXTsKICAgICAgaWYgKGkgPiBkYXRhLmxlbmd0aCkgewogICAgICAgIGNvbnRlbnQucHVzaChuZXcgVWludDhBcnJheShpIC0gZGF0YS5sZW5ndGgpKTsKICAgICAgfQogICAgICBpZiAobGFzdERlZmYgPiBsYXN0RW5kZikgewogICAgICAgIHdhcm4oIlRUOiBjb21wbGVtZW50aW5nIGEgbWlzc2luZyBmdW5jdGlvbiB0YWlsIik7CiAgICAgICAgY29udGVudC5wdXNoKG5ldyBVaW50OEFycmF5KFsweDIyLCAweDJkXSkpOwogICAgICB9CiAgICAgIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoZWNrSW52YWxpZEZ1bmN0aW9ucyh0dENvbnRleHQsIG1heEZ1bmN0aW9uRGVmcykgewogICAgICBpZiAodHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWQubGVuZ3RoID4gbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgICAgd2FybigiVFQ6IG1vcmUgZnVuY3Rpb25zIGRlZmluZWQgdGhhbiBleHBlY3RlZCIpOwogICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBpZiAoaiA+IG1heEZ1bmN0aW9uRGVmcykgewogICAgICAgICAgd2FybigiVFQ6IGludmFsaWQgZnVuY3Rpb24gaWQ6ICIgKyBqKTsKICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zVXNlZFtqXSAmJiAhdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbal0pIHsKICAgICAgICAgIHdhcm4oIlRUOiB1bmRlZmluZWQgZnVuY3Rpb246ICIgKyBqKTsKICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBmb2xkVFRUYWJsZSh0YWJsZSwgY29udGVudCkgewogICAgICBpZiAoY29udGVudC5sZW5ndGggPiAxKSB7CiAgICAgICAgbGV0IG5ld0xlbmd0aCA9IDA7CiAgICAgICAgbGV0IGosIGpqOwogICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29udGVudC5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICBuZXdMZW5ndGggKz0gY29udGVudFtqXS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIG5ld0xlbmd0aCA9IG5ld0xlbmd0aCArIDMgJiB+MzsKICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShuZXdMZW5ndGgpOwogICAgICAgIGxldCBwb3MgPSAwOwogICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29udGVudC5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICByZXN1bHQuc2V0KGNvbnRlbnRbal0sIHBvcyk7CiAgICAgICAgICBwb3MgKz0gY29udGVudFtqXS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHRhYmxlLmRhdGEgPSByZXN1bHQ7CiAgICAgICAgdGFibGUubGVuZ3RoID0gbmV3TGVuZ3RoOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZVRUUHJvZ3JhbXMoZnBnbSwgcHJlcCwgY3Z0LCBtYXhGdW5jdGlvbkRlZnMpIHsKICAgICAgY29uc3QgdHRDb250ZXh0ID0gewogICAgICAgIGZ1bmN0aW9uc0RlZmluZWQ6IFtdLAogICAgICAgIGZ1bmN0aW9uc1VzZWQ6IFtdLAogICAgICAgIGZ1bmN0aW9uc1N0YWNrRGVsdGFzOiBbXSwKICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnM6IGZhbHNlLAogICAgICAgIGhpbnRzVmFsaWQ6IHRydWUKICAgICAgfTsKICAgICAgaWYgKGZwZ20pIHsKICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShmcGdtLCB0dENvbnRleHQpOwogICAgICB9CiAgICAgIGlmIChwcmVwKSB7CiAgICAgICAgc2FuaXRpemVUVFByb2dyYW0ocHJlcCwgdHRDb250ZXh0KTsKICAgICAgfQogICAgICBpZiAoZnBnbSkgewogICAgICAgIGNoZWNrSW52YWxpZEZ1bmN0aW9ucyh0dENvbnRleHQsIG1heEZ1bmN0aW9uRGVmcyk7CiAgICAgI
20H0KICAgICAgaWYgKGN2dCAmJiBjdnQubGVuZ3RoICYgMSkgewogICAgICAgIGNvbnN0IGN2dERhdGEgPSBuZXcgVWludDhBcnJheShjdnQubGVuZ3RoICsgMSk7CiAgICAgICAgY3Z0RGF0YS5zZXQoY3Z0LmRhdGEpOwogICAgICAgIGN2dC5kYXRhID0gY3Z0RGF0YTsKICAgICAgfQogICAgICByZXR1cm4gdHRDb250ZXh0LmhpbnRzVmFsaWQ7CiAgICB9CiAgICBmb250ID0gbmV3IFN0cmVhbShuZXcgVWludDhBcnJheShmb250LmdldEJ5dGVzKCkpKTsKICAgIGxldCBoZWFkZXIsIHRhYmxlczsKICAgIGlmIChpc1RydWVUeXBlQ29sbGVjdGlvbkZpbGUoZm9udCkpIHsKICAgICAgY29uc3QgdHRjRGF0YSA9IHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKGZvbnQsIHRoaXMubmFtZSk7CiAgICAgIGhlYWRlciA9IHR0Y0RhdGEuaGVhZGVyOwogICAgICB0YWJsZXMgPSB0dGNEYXRhLnRhYmxlczsKICAgIH0gZWxzZSB7CiAgICAgIGhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcihmb250KTsKICAgICAgdGFibGVzID0gcmVhZFRhYmxlcyhmb250LCBoZWFkZXIubnVtVGFibGVzKTsKICAgIH0KICAgIGxldCBjZmYsIGNmZkZpbGU7CiAgICBjb25zdCBpc1RydWVUeXBlID0gIXRhYmxlc1siQ0ZGICJdOwogICAgaWYgKCFpc1RydWVUeXBlKSB7CiAgICAgIGNvbnN0IGlzQ29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGUgJiYgKHByb3BlcnRpZXMuY2lkVG9HaWRNYXA/Lmxlbmd0aCA+IDAgfHwgIShwcm9wZXJ0aWVzLmNNYXAgaW5zdGFuY2VvZiBJZGVudGl0eUNNYXApKTsKICAgICAgaWYgKGhlYWRlci52ZXJzaW9uID09PSAiT1RUTyIgJiYgIWlzQ29tcG9zaXRlIHx8ICF0YWJsZXMuaGVhZCB8fCAhdGFibGVzLmhoZWEgfHwgIXRhYmxlcy5tYXhwIHx8ICF0YWJsZXMucG9zdCkgewogICAgICAgIGNmZkZpbGUgPSBuZXcgU3RyZWFtKHRhYmxlc1siQ0ZGICJdLmRhdGEpOwogICAgICAgIGNmZiA9IG5ldyBDRkZGb250KGNmZkZpbGUsIHByb3BlcnRpZXMpOwogICAgICAgIGFkanVzdFdpZHRocyhwcm9wZXJ0aWVzKTsKICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0KG5hbWUsIGNmZiwgcHJvcGVydGllcyk7CiAgICAgIH0KICAgICAgZGVsZXRlIHRhYmxlcy5nbHlmOwogICAgICBkZWxldGUgdGFibGVzLmxvY2E7CiAgICAgIGRlbGV0ZSB0YWJsZXMuZnBnbTsKICAgICAgZGVsZXRlIHRhYmxlcy5wcmVwOwogICAgICBkZWxldGUgdGFibGVzWyJjdnQgIl07CiAgICAgIHRoaXMuaXNPcGVuVHlwZSA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICBpZiAoIXRhYmxlcy5sb2NhKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAibG9jYSIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICAgIH0KICAgICAgaWYgKCF0YWJsZXMuZ2x5ZikgewogICAgICAgIHdhcm4oJ1JlcXVpcmVkICJnbHlmIiB0YWJsZSBpcyBub3QgZm91bmQgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7CiAgICAgICAgdGFibGVzLmdseWYgPSB7CiAgICAgICAgICB0YWc6ICJnbHlmIiwKICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDApCiAgICAgICAgfTsKICAgICAgfQogICAgICB0aGlzLmlzT3BlblR5cGUgPSBmYWxzZTsKICAgIH0KICAgIGlmICghdGFibGVzLm1heHApIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCdSZXF1aXJlZCAibWF4cCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBmb250LnBvcyA9IChmb250LnN0YXJ0IHx8IDApICsgdGFibGVzLm1heHAub2Zmc2V0OwogICAgbGV0IHZlcnNpb24gPSBmb250LmdldEludDMyKCk7CiAgICBjb25zdCBudW1HbHlwaHMgPSBmb250LmdldFVpbnQxNigpOwogICAgaWYgKHZlcnNpb24gIT09IDB4MDAwMTAwMDAgJiYgdmVyc2lvbiAhPT0gMHgwMDAwNTAwMCkgewogICAgICBpZiAodGFibGVzLm1heHAubGVuZ3RoID09PSA2KSB7CiAgICAgICAgdmVyc2lvbiA9IDB4MDAwNTAwMDsKICAgICAgfSBlbHNlIGlmICh0YWJsZXMubWF4cC5sZW5ndGggPj0gMzIpIHsKICAgICAgICB2ZXJzaW9uID0gMHgwMDAxMDAwMDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYCJtYXhwIiB0YWJsZSBoYXMgYSB3cm9uZyB2ZXJzaW9uIG51bWJlcmApOwogICAgICB9CiAgICAgIHdyaXRlVWludDMyKHRhYmxlcy5tYXhwLmRhdGEsIDAsIHZlcnNpb24pOwogICAgfQogICAgaWYgKHByb3BlcnRpZXMuc2NhbGVGYWN0b3JzPy5sZW5ndGggPT09IG51bUdseXBocyAmJiBpc1RydWVUeXBlKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBzY2FsZUZhY3RvcnMKICAgICAgfSA9IHByb3BlcnRpZXM7CiAgICAgIGNvbnN0IGlzR2x5cGhMb2NhdGlvbnNMb25nID0gaW50MTYodGFibGVzLmhlYWQuZGF0YVs1MF0sIHRhYmxlcy5oZWFkLmRhdGFbNTFdKTsKICAgICAgY29uc3QgZ2x5cGhzID0gbmV3IEdseWZUYWJsZSh7CiAgICAgICAgZ2x5ZlRhYmxlOiB0YWJsZXMuZ2x5Zi5kYXRhLAogICAgICAgIGlzR2x5cGhMb2NhdGlvbnNMb25nLAogICAgICAgIGxvY2FUYWJsZTogdGFibGVzLmxvY2EuZGF0YSwKICAgICAgICBudW1HbHlwaHMKICAgICAgfSk7CiAgICAgIGdseXBocy5zY2FsZShzY2FsZUZhY3RvcnMpOwogICAgICBjb25zdCB7CiAgICAgICAgZ2x5ZiwKICAgICAgICBsb2NhLAogICAgICAgIGlzTG9jYXRpb25Mb25nCiAgICAgIH0gPSBnbHlwaHMud3JpdGUoKTsKICAgICAgdGFibGVzLmdseWYuZGF0YSA9IGdseWY7CiAgICAgIHRhYmxlcy5sb2NhLmRhdGEgPSBsb2NhOwogICAgICBpZiAoaXNMb2NhdGlvbkxvbmcgIT09ICEhaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICAgICAgICB0YWJsZXMuaGVhZC5kYXRhWzUwXSA9IDA7CiAgICAgICAgdGFibGVzLmhlYWQuZGF0YVs1MV0gPSBpc0xvY2F0aW9uTG9uZyA/IDEgOiAwOwogICAgICB9CiAgICAgIGNvbnN0IG1ldHJpY3MgPSB0YWJsZXMuaG10eC5kYXRhOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUdseXBoczsgaSsrKSB7CiAgICAgICAgY29uc3QgaiA9IDQgKiBpOwogICAgICAgIGNvbnN0IGFkdmFuY2VXaWR0aCA9IE1hdGgucm91bmQoc2NhbGVGYWN0b3JzW2ldICogaW50MTYobWV0cmljc1tqXSwgbWV0cmljc1tqICsgMV0pKTsKICAgICAgICBtZXRyaWNzW2pdID0gYWR2YW5jZVdpZHR
20oID4+IDggJiAweGZmOwogICAgICAgIG1ldHJpY3NbaiArIDFdID0gYWR2YW5jZVdpZHRoICYgMHhmZjsKICAgICAgICBjb25zdCBsc2IgPSBNYXRoLnJvdW5kKHNjYWxlRmFjdG9yc1tpXSAqIHNpZ25lZEludDE2KG1ldHJpY3NbaiArIDJdLCBtZXRyaWNzW2ogKyAzXSkpOwogICAgICAgIHdyaXRlU2lnbmVkSW50MTYobWV0cmljcywgaiArIDIsIGxzYik7CiAgICAgIH0KICAgIH0KICAgIGxldCBudW1HbHlwaHNPdXQgPSBudW1HbHlwaHMgKyAxOwogICAgbGV0IGR1cEZpcnN0RW50cnkgPSB0cnVlOwogICAgaWYgKG51bUdseXBoc091dCA+IDB4ZmZmZikgewogICAgICBkdXBGaXJzdEVudHJ5ID0gZmFsc2U7CiAgICAgIG51bUdseXBoc091dCA9IG51bUdseXBoczsKICAgICAgd2FybigiTm90IGVub3VnaCBzcGFjZSBpbiBnbHlmcyB0byBkdXBsaWNhdGUgZmlyc3QgZ2x5cGguIik7CiAgICB9CiAgICBsZXQgbWF4RnVuY3Rpb25EZWZzID0gMDsKICAgIGxldCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwOwogICAgaWYgKHZlcnNpb24gPj0gMHgwMDAxMDAwMCAmJiB0YWJsZXMubWF4cC5sZW5ndGggPj0gMzIpIHsKICAgICAgZm9udC5wb3MgKz0gODsKICAgICAgY29uc3QgbWF4Wm9uZXMgPSBmb250LmdldFVpbnQxNigpOwogICAgICBpZiAobWF4Wm9uZXMgPiAyKSB7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsxNF0gPSAwOwogICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMTVdID0gMjsKICAgICAgfQogICAgICBmb250LnBvcyArPSA0OwogICAgICBtYXhGdW5jdGlvbkRlZnMgPSBmb250LmdldFVpbnQxNigpOwogICAgICBmb250LnBvcyArPSA0OwogICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBmb250LmdldFVpbnQxNigpOwogICAgfQogICAgdGFibGVzLm1heHAuZGF0YVs0XSA9IG51bUdseXBoc091dCA+PiA4OwogICAgdGFibGVzLm1heHAuZGF0YVs1XSA9IG51bUdseXBoc091dCAmIDI1NTsKICAgIGNvbnN0IGhpbnRzVmFsaWQgPSBzYW5pdGl6ZVRUUHJvZ3JhbXModGFibGVzLmZwZ20sIHRhYmxlcy5wcmVwLCB0YWJsZXNbImN2dCAiXSwgbWF4RnVuY3Rpb25EZWZzKTsKICAgIGlmICghaGludHNWYWxpZCkgewogICAgICBkZWxldGUgdGFibGVzLmZwZ207CiAgICAgIGRlbGV0ZSB0YWJsZXMucHJlcDsKICAgICAgZGVsZXRlIHRhYmxlc1siY3Z0ICJdOwogICAgfQogICAgc2FuaXRpemVNZXRyaWNzKGZvbnQsIHRhYmxlcy5oaGVhLCB0YWJsZXMuaG10eCwgdGFibGVzLmhlYWQsIG51bUdseXBoc091dCwgZHVwRmlyc3RFbnRyeSk7CiAgICBpZiAoIXRhYmxlcy5oZWFkKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcignUmVxdWlyZWQgImhlYWQiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOwogICAgfQogICAgc2FuaXRpemVIZWFkKHRhYmxlcy5oZWFkLCBudW1HbHlwaHMsIGlzVHJ1ZVR5cGUgPyB0YWJsZXMubG9jYS5sZW5ndGggOiAwKTsKICAgIGxldCBtaXNzaW5nR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmIChpc1RydWVUeXBlKSB7CiAgICAgIGNvbnN0IGlzR2x5cGhMb2NhdGlvbnNMb25nID0gaW50MTYodGFibGVzLmhlYWQuZGF0YVs1MF0sIHRhYmxlcy5oZWFkLmRhdGFbNTFdKTsKICAgICAgY29uc3QgZ2x5cGhzSW5mbyA9IHNhbml0aXplR2x5cGhMb2NhdGlvbnModGFibGVzLmxvY2EsIHRhYmxlcy5nbHlmLCBudW1HbHlwaHMsIGlzR2x5cGhMb2NhdGlvbnNMb25nLCBoaW50c1ZhbGlkLCBkdXBGaXJzdEVudHJ5LCBtYXhTaXplT2ZJbnN0cnVjdGlvbnMpOwogICAgICBtaXNzaW5nR2x5cGhzID0gZ2x5cGhzSW5mby5taXNzaW5nR2x5cGhzOwogICAgICBpZiAodmVyc2lvbiA+PSAweDAwMDEwMDAwICYmIHRhYmxlcy5tYXhwLmxlbmd0aCA+PSAzMikgewogICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMjZdID0gZ2x5cGhzSW5mby5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgPj4gODsKICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzI3XSA9IGdseXBoc0luZm8ubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zICYgMjU1OwogICAgICB9CiAgICB9CiAgICBpZiAoIXRhYmxlcy5oaGVhKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcignUmVxdWlyZWQgImhoZWEiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOwogICAgfQogICAgaWYgKHRhYmxlcy5oaGVhLmRhdGFbMTBdID09PSAwICYmIHRhYmxlcy5oaGVhLmRhdGFbMTFdID09PSAwKSB7CiAgICAgIHRhYmxlcy5oaGVhLmRhdGFbMTBdID0gMHhmZjsKICAgICAgdGFibGVzLmhoZWEuZGF0YVsxMV0gPSAweGZmOwogICAgfQogICAgY29uc3QgbWV0cmljc092ZXJyaWRlID0gewogICAgICB1bml0c1BlckVtOiBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzE4XSwgdGFibGVzLmhlYWQuZGF0YVsxOV0pLAogICAgICB5TWF4OiBzaWduZWRJbnQxNih0YWJsZXMuaGVhZC5kYXRhWzQyXSwgdGFibGVzLmhlYWQuZGF0YVs0M10pLAogICAgICB5TWluOiBzaWduZWRJbnQxNih0YWJsZXMuaGVhZC5kYXRhWzM4XSwgdGFibGVzLmhlYWQuZGF0YVszOV0pLAogICAgICBhc2NlbnQ6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbNF0sIHRhYmxlcy5oaGVhLmRhdGFbNV0pLAogICAgICBkZXNjZW50OiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzZdLCB0YWJsZXMuaGhlYS5kYXRhWzddKSwKICAgICAgbGluZUdhcDogc2lnbmVkSW50MTYodGFibGVzLmhoZWEuZGF0YVs4XSwgdGFibGVzLmhoZWEuZGF0YVs5XSkKICAgIH07CiAgICB0aGlzLmFzY2VudCA9IG1ldHJpY3NPdmVycmlkZS5hc2NlbnQgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKICAgIHRoaXMuZGVzY2VudCA9IG1ldHJpY3NPdmVycmlkZS5kZXNjZW50IC8gbWV0cmljc092ZXJyaWRlLnVuaXRzUGVyRW07CiAgICB0aGlzLmxpbmVHYXAgPSBtZXRyaWNzT3ZlcnJpZGUubGluZUdhcCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOwogICAgaWYgKHRoaXMuY3NzRm9udEluZm8/LmxpbmVIZWlnaHQpIHsKICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gdGhpcy5jc3NGb250SW5mby5tZXRyaWNzLmxpbmVIZWlnaHQ7CiAgICAgIHRoaXMubGluZUdhcCA9IHRoaXMuY3NzRm9udEluZm8ubWV0cmljcy5saW5lR2FwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5saW5lSGVpZ2h0ID0gdGhpcy5hc2NlbnQgLSB0aGlzLmRlc2NlbnQgKyB0aGlzLmxpbmVHYXA7CiAgICB9CiAgICBpZiAodGFibGVzLnBvc3QpIHsKICAgICAgcmVhZFBvc3RTY3JpcHRUYWJsZSh0YWJsZXMucG9zdCwgcHJvcGVydGllcywgbnVtR2x5cGhzKTsKICAgIH0KICAgIHRhYmxlcy5wb3N0ID0gewogICAgICB0YWc6ICJwb3N0IiwKICAgICAgZGF0YTogY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpCiAgICB9OwogICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZnVuY3Rpb24gaGFzR2x5cGgoZ2x5cGhJZCkgewogICAgICByZXR1cm4gIW1pc3NpbmdHbHlwaHNbZ2x5cGhJZF07CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgY2lkVG9HaWRNYXAgPSBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwIHx8IFtdOwogICAgICBjb25zdCBpc0NpZFRvR2lkTWFwRW1wdHkgPSBjaWRUb0dpZE1hcC5sZW5ndGggPT09IDA7CiAgICAgI
20HByb3BlcnRpZXMuY01hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgY2lkKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjaWQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBjaWQgPSBjb252ZXJ0Q2lkU3RyaW5nKGNoYXJDb2RlLCBjaWQsIHRydWUpOwogICAgICAgIH0KICAgICAgICBpZiAoY2lkID4gMHhmZmZmKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1heCBzaXplIG9mIENJRCBpcyA2NSw1MzUiKTsKICAgICAgICB9CiAgICAgICAgbGV0IGdseXBoSWQgPSAtMTsKICAgICAgICBpZiAoaXNDaWRUb0dpZE1hcEVtcHR5KSB7CiAgICAgICAgICBnbHlwaElkID0gY2lkOwogICAgICAgIH0gZWxzZSBpZiAoY2lkVG9HaWRNYXBbY2lkXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBnbHlwaElkID0gY2lkVG9HaWRNYXBbY2lkXTsKICAgICAgICB9CiAgICAgICAgaWYgKGdseXBoSWQgPj0gMCAmJiBnbHlwaElkIDwgbnVtR2x5cGhzICYmIGhhc0dseXBoKGdseXBoSWQpKSB7CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBjbWFwVGFibGUgPSByZWFkQ21hcFRhYmxlKHRhYmxlcy5jbWFwLCBmb250LCB0aGlzLmlzU3ltYm9saWNGb250LCBwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKTsKICAgICAgY29uc3QgY21hcFBsYXRmb3JtSWQgPSBjbWFwVGFibGUucGxhdGZvcm1JZDsKICAgICAgY29uc3QgY21hcEVuY29kaW5nSWQgPSBjbWFwVGFibGUuZW5jb2RpbmdJZDsKICAgICAgY29uc3QgY21hcE1hcHBpbmdzID0gY21hcFRhYmxlLm1hcHBpbmdzOwogICAgICBsZXQgYmFzZUVuY29kaW5nID0gW10sCiAgICAgICAgZm9yY2VQb3N0VGFibGUgPSBmYWxzZTsKICAgICAgaWYgKHByb3BlcnRpZXMuaGFzRW5jb2RpbmcgJiYgKHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9PT0gIk1hY1JvbWFuRW5jb2RpbmciIHx8IHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZSA9PT0gIldpbkFuc2lFbmNvZGluZyIpKSB7CiAgICAgICAgYmFzZUVuY29kaW5nID0gZ2V0RW5jb2RpbmcocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZyAmJiAhdGhpcy5pc1N5bWJvbGljRm9udCAmJiAoY21hcFBsYXRmb3JtSWQgPT09IDMgJiYgY21hcEVuY29kaW5nSWQgPT09IDEgfHwgY21hcFBsYXRmb3JtSWQgPT09IDEgJiYgY21hcEVuY29kaW5nSWQgPT09IDApKSB7CiAgICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgICAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7CiAgICAgICAgICBsZXQgZ2x5cGhOYW1lOwogICAgICAgICAgaWYgKHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV07CiAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VFbmNvZGluZy5sZW5ndGggJiYgYmFzZUVuY29kaW5nW2NoYXJDb2RlXSAhPT0gIiIpIHsKICAgICAgICAgICAgZ2x5cGhOYW1lID0gYmFzZUVuY29kaW5nW2NoYXJDb2RlXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdseXBoTmFtZSA9IFN0YW5kYXJkRW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdGFuZGFyZEdseXBoTmFtZSA9IHJlY292ZXJHbHlwaE5hbWUoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgICAgICAgIGxldCB1bmljb2RlT3JDaGFyQ29kZTsKICAgICAgICAgIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSkgewogICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IGdseXBoc1VuaWNvZGVNYXBbc3RhbmRhcmRHbHlwaE5hbWVdOwogICAgICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IE1hY1JvbWFuRW5jb2RpbmcuaW5kZXhPZihzdGFuZGFyZEdseXBoTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodW5pY29kZU9yQ2hhckNvZGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuZ2x5cGhOYW1lcyAmJiBwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwICYmICEodGhpcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBJZGVudGl0eVRvVW5pY29kZU1hcCkpIHsKICAgICAgICAgICAgICBjb25zdCB1bmljb2RlID0gdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJDb2RlKTsKICAgICAgICAgICAgICBpZiAodW5pY29kZSkgewogICAgICAgICAgICAgICAgdW5pY29kZU9yQ2hhckNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodW5pY29kZU9yQ2hhckNvZGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICAgIGlmIChtYXBwaW5nLmNoYXJDb2RlICE9PSB1bmljb2RlT3JDaGFyQ29kZSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAwKSB7CiAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIGNtYXBNYXBwaW5ncykgewogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbbWFwcGluZy5jaGFyQ29kZV0gPSBtYXBwaW5nLmdseXBoSWQ7CiAgICAgICAgfQogICAgICAgIGZvcmNlUG9zdFRhYmxlID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJi
20BjbWFwRW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjbWFwTWFwcGluZ3MpIHsKICAgICAgICAgIGxldCBjaGFyQ29kZSA9IG1hcHBpbmcuY2hhckNvZGU7CiAgICAgICAgICBpZiAoY2hhckNvZGUgPj0gMHhmMDAwICYmIGNoYXJDb2RlIDw9IDB4ZjBmZikgewogICAgICAgICAgICBjaGFyQ29kZSAmPSAweGZmOwogICAgICAgICAgfQogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gbWFwcGluZy5nbHlwaElkOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFttYXBwaW5nLmNoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHByb3BlcnRpZXMuZ2x5cGhOYW1lcyAmJiAoYmFzZUVuY29kaW5nLmxlbmd0aCB8fCB0aGlzLmRpZmZlcmVuY2VzLmxlbmd0aCkpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAgICAgICAgICBpZiAoIWZvcmNlUG9zdFRhYmxlICYmIGNoYXJDb2RlVG9HbHlwaElkW2ldICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2ldIHx8IGJhc2VFbmNvZGluZ1tpXTsKICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2x5cGhJZCA9IHByb3BlcnRpZXMuZ2x5cGhOYW1lcy5pbmRleE9mKGdseXBoTmFtZSk7CiAgICAgICAgICBpZiAoZ2x5cGhJZCA+IDAgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbaV0gPSBnbHlwaElkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoYXJDb2RlVG9HbHlwaElkLmxlbmd0aCA9PT0gMCkgewogICAgICBjaGFyQ29kZVRvR2x5cGhJZFswXSA9IDA7CiAgICB9CiAgICBsZXQgZ2x5cGhaZXJvSWQgPSBudW1HbHlwaHNPdXQgLSAxOwogICAgaWYgKCFkdXBGaXJzdEVudHJ5KSB7CiAgICAgIGdseXBoWmVyb0lkID0gMDsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jc3NGb250SW5mbykgewogICAgICBjb25zdCBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhjaGFyQ29kZVRvR2x5cGhJZCwgaGFzR2x5cGgsIGdseXBoWmVyb0lkLCB0aGlzLnRvVW5pY29kZSk7CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG5ld01hcHBpbmcudG9Gb250Q2hhcjsKICAgICAgdGFibGVzLmNtYXAgPSB7CiAgICAgICAgdGFnOiAiY21hcCIsCiAgICAgICAgZGF0YTogY3JlYXRlQ21hcFRhYmxlKG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQsIG5ld01hcHBpbmcudG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBoc091dCkKICAgICAgfTsKICAgICAgaWYgKCF0YWJsZXNbIk9TLzIiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbIk9TLzIiXSwgZm9udCkpIHsKICAgICAgICB0YWJsZXNbIk9TLzIiXSA9IHsKICAgICAgICAgIHRhZzogIk9TLzIiLAogICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbWV0cmljc092ZXJyaWRlKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGlmICghaXNUcnVlVHlwZSkgewogICAgICB0cnkgewogICAgICAgIGNmZkZpbGUgPSBuZXcgU3RyZWFtKHRhYmxlc1siQ0ZGICJdLmRhdGEpOwogICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBDRkZQYXJzZXIoY2ZmRmlsZSwgcHJvcGVydGllcywgU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgICAgICBjZmYgPSBwYXJzZXIucGFyc2UoKTsKICAgICAgICBjZmYuZHVwbGljYXRlRmlyc3RHbHlwaCgpOwogICAgICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IENGRkNvbXBpbGVyKGNmZik7CiAgICAgICAgdGFibGVzWyJDRkYgIl0uZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgd2FybigiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiICsgcHJvcGVydGllcy5sb2FkZWROYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0YWJsZXMubmFtZSkgewogICAgICB0YWJsZXMubmFtZSA9IHsKICAgICAgICB0YWc6ICJuYW1lIiwKICAgICAgICBkYXRhOiBjcmVhdGVOYW1lVGFibGUodGhpcy5uYW1lKQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgW25hbWVQcm90b3R5cGUsIG5hbWVSZWNvcmRzXSA9IHJlYWROYW1lVGFibGUodGFibGVzLm5hbWUpOwogICAgICB0YWJsZXMubmFtZS5kYXRhID0gY3JlYXRlTmFtZVRhYmxlKG5hbWUsIG5hbWVQcm90b3R5cGUpOwogICAgICB0aGlzLnBzTmFtZSA9IG5hbWVQcm90b3R5cGVbMF1bNl0gfHwgbnVsbDsKICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICAgIGFkanVzdFRydWVUeXBlVG9Vbmljb2RlKHByb3BlcnRpZXMsIHRoaXMuaXNTeW1ib2xpY0ZvbnQsIG5hbWVSZWNvcmRzKTsKICAgICAgfQogICAgfQogICAgY29uc3QgYnVpbGRlciA9IG5ldyBPcGVuVHlwZUZpbGVCdWlsZGVyKGhlYWRlci52ZXJzaW9uKTsKICAgIGZvciAoY29uc3QgdGFibGVUYWcgaW4gdGFibGVzKSB7CiAgICAgIGJ1aWxkZXIuYWRkVGFibGUodGFibGVUYWcsIHRhYmxlc1t0YWJsZVRhZ10uZGF0YSk7CiAgICB9CiAgICByZXR1cm4gYnVpbGRlci50b0FycmF5KCk7CiAgfQogIGNvbnZlcnQoZm9udE5hbWUsIGZvbnQsIHByb3BlcnRpZXMpIHsKICAgIHByb3BlcnRpZXMuZml4ZWRQaXRjaCA9IGZhbHNlOwogICAgaWYgKHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKSB7CiAgICAgIGFkanVzdFR5cGUxVG9Vbmljb2RlKHByb3BlcnRpZXMsIHByb3BlcnRpZXMuYnVpbHRJbkVuY29kaW5nKTsKICAgIH0KICAgIGxldCBnbHlwaFplcm9JZCA9IDE7CiAgICBpZiAoZm9udCBpbnN0YW5jZW9mIENGRkZvbnQpIHsKICAgICAgZ2x5cGhaZXJvSWQgPSBmb250Lm51bUdseXBocyAtIDE7CiAgICB9CiAgICBjb25zdCBtYXBwaW5nID0gZm9udC5nZXRHbHlwaE1hcHBpbmcocHJvcGVydGllcyk7CiAgICBsZXQgbm
20V3TWFwcGluZyA9IG51bGw7CiAgICBsZXQgbmV3Q2hhckNvZGVUb0dseXBoSWQgPSBtYXBwaW5nOwogICAgbGV0IHRvVW5pY29kZUV4dHJhTWFwID0gbnVsbDsKICAgIGlmICghcHJvcGVydGllcy5jc3NGb250SW5mbykgewogICAgICBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhtYXBwaW5nLCBmb250Lmhhc0dseXBoSWQuYmluZChmb250KSwgZ2x5cGhaZXJvSWQsIHRoaXMudG9Vbmljb2RlKTsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOwogICAgICBuZXdDaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7CiAgICAgIHRvVW5pY29kZUV4dHJhTWFwID0gbmV3TWFwcGluZy50b1VuaWNvZGVFeHRyYU1hcDsKICAgIH0KICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQubnVtR2x5cGhzOwogICAgZnVuY3Rpb24gZ2V0Q2hhckNvZGVzKGNoYXJDb2RlVG9HbHlwaElkLCBnbHlwaElkKSB7CiAgICAgIGxldCBjaGFyQ29kZXMgPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGNoYXJDb2RlVG9HbHlwaElkKSB7CiAgICAgICAgaWYgKGdseXBoSWQgPT09IGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSkgewogICAgICAgICAgKGNoYXJDb2RlcyB8fD0gW10pLnB1c2goY2hhckNvZGUgfCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJDb2RlczsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBnbHlwaElkKSB7CiAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CiAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOwogICAgICAgIH0KICAgICAgfQogICAgICBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkW25ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICByZXR1cm4gbmV3TWFwcGluZy5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKys7CiAgICB9CiAgICBjb25zdCBzZWFjcyA9IGZvbnQuc2VhY3M7CiAgICBpZiAobmV3TWFwcGluZyAmJiBTRUFDX0FOQUxZU0lTX0VOQUJMRUQgJiYgc2VhY3M/Lmxlbmd0aCkgewogICAgICBjb25zdCBtYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXggfHwgRk9OVF9JREVOVElUWV9NQVRSSVg7CiAgICAgIGNvbnN0IGNoYXJzZXQgPSBmb250LmdldENoYXJzZXQoKTsKICAgICAgY29uc3Qgc2VhY01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGZvciAobGV0IGdseXBoSWQgaW4gc2VhY3MpIHsKICAgICAgICBnbHlwaElkIHw9IDA7CiAgICAgICAgY29uc3Qgc2VhYyA9IHNlYWNzW2dseXBoSWRdOwogICAgICAgIGNvbnN0IGJhc2VHbHlwaE5hbWUgPSBTdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dOwogICAgICAgIGNvbnN0IGFjY2VudEdseXBoTmFtZSA9IFN0YW5kYXJkRW5jb2Rpbmdbc2VhY1szXV07CiAgICAgICAgY29uc3QgYmFzZUdseXBoSWQgPSBjaGFyc2V0LmluZGV4T2YoYmFzZUdseXBoTmFtZSk7CiAgICAgICAgY29uc3QgYWNjZW50R2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihhY2NlbnRHbHlwaE5hbWUpOwogICAgICAgIGlmIChiYXNlR2x5cGhJZCA8IDAgfHwgYWNjZW50R2x5cGhJZCA8IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBhY2NlbnRPZmZzZXQgPSB7CiAgICAgICAgICB4OiBzZWFjWzBdICogbWF0cml4WzBdICsgc2VhY1sxXSAqIG1hdHJpeFsyXSArIG1hdHJpeFs0XSwKICAgICAgICAgIHk6IHNlYWNbMF0gKiBtYXRyaXhbMV0gKyBzZWFjWzFdICogbWF0cml4WzNdICsgbWF0cml4WzVdCiAgICAgICAgfTsKICAgICAgICBjb25zdCBjaGFyQ29kZXMgPSBnZXRDaGFyQ29kZXMobWFwcGluZywgZ2x5cGhJZCk7CiAgICAgICAgaWYgKCFjaGFyQ29kZXMpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIG9mIGNoYXJDb2RlcykgewogICAgICAgICAgY29uc3QgY2hhckNvZGVUb0dseXBoSWQgPSBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkOwogICAgICAgICAgY29uc3QgYmFzZUZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBiYXNlR2x5cGhJZCk7CiAgICAgICAgICBjb25zdCBhY2NlbnRGb250Q2hhckNvZGUgPSBjcmVhdGVDaGFyQ29kZShjaGFyQ29kZVRvR2x5cGhJZCwgYWNjZW50R2x5cGhJZCk7CiAgICAgICAgICBzZWFjTWFwW2NoYXJDb2RlXSA9IHsKICAgICAgICAgICAgYmFzZUZvbnRDaGFyQ29kZSwKICAgICAgICAgICAgYWNjZW50Rm9udENoYXJDb2RlLAogICAgICAgICAgICBhY2NlbnRPZmZzZXQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb3BlcnRpZXMuc2VhY01hcCA9IHNlYWNNYXA7CiAgICB9CiAgICBjb25zdCB1bml0c1BlckVtID0gcHJvcGVydGllcy5mb250TWF0cml4ID8gMSAvIE1hdGgubWF4KC4uLnByb3BlcnRpZXMuZm9udE1hdHJpeC5zbGljZSgwLCA0KS5tYXAoTWF0aC5hYnMpKSA6IDEwMDA7CiAgICBjb25zdCBidWlsZGVyID0gbmV3IE9wZW5UeXBlRmlsZUJ1aWxkZXIoIlx4NEZceDU0XHg1NFx4NEYiKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIkNGRiAiLCBmb250LmRhdGEpOwogICAgYnVpbGRlci5hZGRUYWJsZSgiT1MvMiIsIGNyZWF0ZU9TMlRhYmxlKHByb3BlcnRpZXMsIG5ld0NoYXJDb2RlVG9HbHlwaElkKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJjbWFwIiwgY3JlYXRlQ21hcFRhYmxlKG5ld0NoYXJDb2RlVG9HbHlwaElkLCB0b1VuaWNvZGVFeHRyYU1hcCwgbnVtR2x5cGhzKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJoZWFkIiwgIlx4MDBceDAxXHgwMFx4MDAiICsgIlx4MDBceDAwXHgxMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4NUZceDBGXHgzQ1x4RjUiICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNih1bml0c1BlckVtKSArICJceDAwXHgwMFx4MDBceDAwXHg5ZVx4MGJceDdlXHgyNyIgKyAiXHgwMFx4MDBceDAwXHgwMFx4OWVceDBiXHg3ZVx4MjciICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmRlc2NlbnQpICsgIlx4MEZceEZGIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmFzY2VudCkgKyBzdHJpbmcxNihwcm9wZXJ0aWVzLml0YWxpY0FuZ2xlID8gMiA6IDApICsgIlx4MDBceDExIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIik7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJoaGVhIiwgIlx4MDBceDAxXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmRlc2NlbnQpICsgIlx4MDBceDAwIiArICJceEZGXHhGRiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5jYXBIZWlnaHQpICsgc2FmZVN0cmluZzE2KE1hdGgudGFuKHByb3BlcnRpZXMuaXRhbGljQW5nbGUpICogcHJv
20cGVydGllcy54SGVpZ2h0KSArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArIHN0cmluZzE2KG51bUdseXBocykpOwogICAgYnVpbGRlci5hZGRUYWJsZSgiaG10eCIsIGZ1bmN0aW9uIGZvbnRGaWVsZHNIbXR4KCkgewogICAgICBjb25zdCBjaGFyc3RyaW5ncyA9IGZvbnQuY2hhcnN0cmluZ3M7CiAgICAgIGNvbnN0IGNmZldpZHRocyA9IGZvbnQuY2ZmID8gZm9udC5jZmYud2lkdGhzIDogbnVsbDsKICAgICAgbGV0IGhtdHggPSAiXHgwMFx4MDBceDAwXHgwMCI7CiAgICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IG51bUdseXBoczsgaSA8IGlpOyBpKyspIHsKICAgICAgICBsZXQgd2lkdGggPSAwOwogICAgICAgIGlmIChjaGFyc3RyaW5ncykgewogICAgICAgICAgY29uc3QgY2hhcnN0cmluZyA9IGNoYXJzdHJpbmdzW2kgLSAxXTsKICAgICAgICAgIHdpZHRoID0gIndpZHRoIiBpbiBjaGFyc3RyaW5nID8gY2hhcnN0cmluZy53aWR0aCA6IDA7CiAgICAgICAgfSBlbHNlIGlmIChjZmZXaWR0aHMpIHsKICAgICAgICAgIHdpZHRoID0gTWF0aC5jZWlsKGNmZldpZHRoc1tpXSB8fCAwKTsKICAgICAgICB9CiAgICAgICAgaG10eCArPSBzdHJpbmcxNih3aWR0aCkgKyBzdHJpbmcxNigwKTsKICAgICAgfQogICAgICByZXR1cm4gaG10eDsKICAgIH0oKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJtYXhwIiwgIlx4MDBceDAwXHg1MFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJuYW1lIiwgY3JlYXRlTmFtZVRhYmxlKGZvbnROYW1lKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJwb3N0IiwgY3JlYXRlUG9zdFRhYmxlKHByb3BlcnRpZXMpKTsKICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKICB9CiAgZ2V0IF9zcGFjZVdpZHRoKCkgewogICAgY29uc3QgcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cyA9IFsic3BhY2UiLCAibWludXMiLCAib25lIiwgImkiLCAiSSJdOwogICAgbGV0IHdpZHRoOwogICAgZm9yIChjb25zdCBnbHlwaE5hbWUgb2YgcG9zc2libGVTcGFjZVJlcGxhY2VtZW50cykgewogICAgICBpZiAoZ2x5cGhOYW1lIGluIHRoaXMud2lkdGhzKSB7CiAgICAgICAgd2lkdGggPSB0aGlzLndpZHRoc1tnbHlwaE5hbWVdOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IGdseXBoc1VuaWNvZGVNYXAgPSBnZXRHbHlwaHNVbmljb2RlKCk7CiAgICAgIGNvbnN0IGdseXBoVW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgICAgbGV0IGNoYXJjb2RlID0gMDsKICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMuY01hcC5jb250YWlucyhnbHlwaFVuaWNvZGUpKSB7CiAgICAgICAgY2hhcmNvZGUgPSB0aGlzLmNNYXAubG9va3VwKGdseXBoVW5pY29kZSk7CiAgICAgICAgaWYgKHR5cGVvZiBjaGFyY29kZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNoYXJjb2RlID0gY29udmVydENpZFN0cmluZyhnbHlwaFVuaWNvZGUsIGNoYXJjb2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjaGFyY29kZSAmJiB0aGlzLnRvVW5pY29kZSkgewogICAgICAgIGNoYXJjb2RlID0gdGhpcy50b1VuaWNvZGUuY2hhckNvZGVPZihnbHlwaFVuaWNvZGUpOwogICAgICB9CiAgICAgIGlmIChjaGFyY29kZSA8PSAwKSB7CiAgICAgICAgY2hhcmNvZGUgPSBnbHlwaFVuaWNvZGU7CiAgICAgIH0KICAgICAgd2lkdGggPSB0aGlzLndpZHRoc1tjaGFyY29kZV07CiAgICAgIGlmICh3aWR0aCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfc3BhY2VXaWR0aCIsIHdpZHRoIHx8IHRoaXMuZGVmYXVsdFdpZHRoKTsKICB9CiAgX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBpc1NwYWNlID0gZmFsc2UpIHsKICAgIGxldCBnbHlwaCA9IHRoaXMuX2dseXBoQ2FjaGVbY2hhcmNvZGVdOwogICAgaWYgKGdseXBoPy5pc1NwYWNlID09PSBpc1NwYWNlKSB7CiAgICAgIHJldHVybiBnbHlwaDsKICAgIH0KICAgIGxldCBmb250Q2hhckNvZGUsIHdpZHRoLCBvcGVyYXRvckxpc3RJZDsKICAgIGxldCB3aWR0aENvZGUgPSBjaGFyY29kZTsKICAgIGlmICh0aGlzLmNNYXA/LmNvbnRhaW5zKGNoYXJjb2RlKSkgewogICAgICB3aWR0aENvZGUgPSB0aGlzLmNNYXAubG9va3VwKGNoYXJjb2RlKTsKICAgICAgaWYgKHR5cGVvZiB3aWR0aENvZGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgd2lkdGhDb2RlID0gY29udmVydENpZFN0cmluZyhjaGFyY29kZSwgd2lkdGhDb2RlKTsKICAgICAgfQogICAgfQogICAgd2lkdGggPSB0aGlzLndpZHRoc1t3aWR0aENvZGVdOwogICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gIm51bWJlciIpIHsKICAgICAgd2lkdGggPSB0aGlzLmRlZmF1bHRXaWR0aDsKICAgIH0KICAgIGNvbnN0IHZtZXRyaWMgPSB0aGlzLnZtZXRyaWNzPy5bd2lkdGhDb2RlXTsKICAgIGxldCB1bmljb2RlID0gdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJjb2RlKSB8fCBjaGFyY29kZTsKICAgIGlmICh0eXBlb2YgdW5pY29kZSA9PT0gIm51bWJlciIpIHsKICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CiAgICB9CiAgICBsZXQgaXNJbkZvbnQgPSB0aGlzLnRvRm9udENoYXJbY2hhcmNvZGVdICE9PSB1bmRlZmluZWQ7CiAgICBmb250Q2hhckNvZGUgPSB0aGlzLnRvRm9udENoYXJbY2hhcmNvZGVdIHx8IGNoYXJjb2RlOwogICAgaWYgKHRoaXMubWlzc2luZ0ZpbGUpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyY29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhcmNvZGVdOwogICAgICBpZiAoKGdseXBoTmFtZSA9PT0gIi5ub3RkZWYiIHx8IGdseXBoTmFtZSA9PT0gIiIpICYmIHRoaXMudHlwZSA9PT0gIlR5cGUxIikgewogICAgICAgIGZvbnRDaGFyQ29kZSA9IDB4MjA7CiAgICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgICAgIHdpZHRoIHx8PSB0aGlzLl9zcGFjZVdpZHRoOwogICAgICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udENoYXJDb2RlKTsKICAgICAgICB9CiAgICAgI
20H0KICAgICAgZm9udENoYXJDb2RlID0gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXMoZm9udENoYXJDb2RlKTsKICAgIH0KICAgIGlmICh0aGlzLmlzVHlwZTNGb250KSB7CiAgICAgIG9wZXJhdG9yTGlzdElkID0gZm9udENoYXJDb2RlOwogICAgfQogICAgbGV0IGFjY2VudCA9IG51bGw7CiAgICBpZiAodGhpcy5zZWFjTWFwPy5bY2hhcmNvZGVdKSB7CiAgICAgIGlzSW5Gb250ID0gdHJ1ZTsKICAgICAgY29uc3Qgc2VhYyA9IHRoaXMuc2VhY01hcFtjaGFyY29kZV07CiAgICAgIGZvbnRDaGFyQ29kZSA9IHNlYWMuYmFzZUZvbnRDaGFyQ29kZTsKICAgICAgYWNjZW50ID0gewogICAgICAgIGZvbnRDaGFyOiBTdHJpbmcuZnJvbUNvZGVQb2ludChzZWFjLmFjY2VudEZvbnRDaGFyQ29kZSksCiAgICAgICAgb2Zmc2V0OiBzZWFjLmFjY2VudE9mZnNldAogICAgICB9OwogICAgfQogICAgbGV0IGZvbnRDaGFyID0gIiI7CiAgICBpZiAodHlwZW9mIGZvbnRDaGFyQ29kZSA9PT0gIm51bWJlciIpIHsKICAgICAgaWYgKGZvbnRDaGFyQ29kZSA8PSAweDEwZmZmZikgewogICAgICAgIGZvbnRDaGFyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoZm9udENoYXJDb2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKGBjaGFyVG9HbHlwaCAtIGludmFsaWQgZm9udENoYXJDb2RlOiAke2ZvbnRDaGFyQ29kZX1gKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMubWlzc2luZ0ZpbGUgJiYgdGhpcy52ZXJ0aWNhbCAmJiBmb250Q2hhci5sZW5ndGggPT09IDEpIHsKICAgICAgY29uc3QgdmVydGljYWwgPSBnZXRWZXJ0aWNhbFByZXNlbnRhdGlvbkZvcm0oKVtmb250Q2hhci5jaGFyQ29kZUF0KDApXTsKICAgICAgaWYgKHZlcnRpY2FsKSB7CiAgICAgICAgZm9udENoYXIgPSB1bmljb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2ZXJ0aWNhbCk7CiAgICAgIH0KICAgIH0KICAgIGdseXBoID0gbmV3IGZvbnRzX0dseXBoKGNoYXJjb2RlLCBmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KTsKICAgIHJldHVybiB0aGlzLl9nbHlwaENhY2hlW2NoYXJjb2RlXSA9IGdseXBoOwogIH0KICBjaGFyc1RvR2x5cGhzKGNoYXJzKSB7CiAgICBsZXQgZ2x5cGhzID0gdGhpcy5fY2hhcnNDYWNoZVtjaGFyc107CiAgICBpZiAoZ2x5cGhzKSB7CiAgICAgIHJldHVybiBnbHlwaHM7CiAgICB9CiAgICBnbHlwaHMgPSBbXTsKICAgIGlmICh0aGlzLmNNYXApIHsKICAgICAgY29uc3QgYyA9IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgaWkgPSBjaGFycy5sZW5ndGg7CiAgICAgIGxldCBpID0gMDsKICAgICAgd2hpbGUgKGkgPCBpaSkgewogICAgICAgIHRoaXMuY01hcC5yZWFkQ2hhckNvZGUoY2hhcnMsIGksIGMpOwogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGNoYXJjb2RlLAogICAgICAgICAgbGVuZ3RoCiAgICAgICAgfSA9IGM7CiAgICAgICAgaSArPSBsZW5ndGg7CiAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLl9jaGFyVG9HbHlwaChjaGFyY29kZSwgbGVuZ3RoID09PSAxICYmIGNoYXJzLmNoYXJDb2RlQXQoaSAtIDEpID09PSAweDIwKTsKICAgICAgICBnbHlwaHMucHVzaChnbHlwaCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBjb25zdCBjaGFyY29kZSA9IGNoYXJzLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLl9jaGFyVG9HbHlwaChjaGFyY29kZSwgY2hhcmNvZGUgPT09IDB4MjApOwogICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMuX2NoYXJzQ2FjaGVbY2hhcnNdID0gZ2x5cGhzOwogIH0KICBnZXRDaGFyUG9zaXRpb25zKGNoYXJzKSB7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBbXTsKICAgIGlmICh0aGlzLmNNYXApIHsKICAgICAgY29uc3QgYyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGxldCBpID0gMDsKICAgICAgd2hpbGUgKGkgPCBjaGFycy5sZW5ndGgpIHsKICAgICAgICB0aGlzLmNNYXAucmVhZENoYXJDb2RlKGNoYXJzLCBpLCBjKTsKICAgICAgICBjb25zdCBsZW5ndGggPSBjLmxlbmd0aDsKICAgICAgICBwb3NpdGlvbnMucHVzaChbaSwgaSArIGxlbmd0aF0pOwogICAgICAgIGkgKz0gbGVuZ3RoOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgcG9zaXRpb25zLnB1c2goW2ksIGkgKyAxXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3NpdGlvbnM7CiAgfQogIGdldCBnbHlwaENhY2hlVmFsdWVzKCkgewogICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fZ2x5cGhDYWNoZSk7CiAgfQogIGVuY29kZVN0cmluZyhzdHIpIHsKICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTsKICAgIGNvbnN0IGN1cnJlbnRCdWYgPSBbXTsKICAgIGNvbnN0IGhhc0N1cnJlbnRCdWZFcnJvcnMgPSAoKSA9PiBidWZmZXJzLmxlbmd0aCAlIDIgPT09IDE7CiAgICBjb25zdCBnZXRDaGFyQ29kZSA9IHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgSWRlbnRpdHlUb1VuaWNvZGVNYXAgPyB1bmljb2RlID0+IHRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YodW5pY29kZSkgOiB1bmljb2RlID0+IHRoaXMudG9Vbmljb2RlLmNoYXJDb2RlT2YoU3RyaW5nLmZyb21Db2RlUG9pbnQodW5pY29kZSkpOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgdW5pY29kZSA9IHN0ci5jb2RlUG9pbnRBdChpKTsKICAgICAgaWYgKHVuaWNvZGUgPiAweGQ3ZmYgJiYgKHVuaWNvZGUgPCAweGUwMDAgfHwgdW5pY29kZSA+IDB4ZmZmZCkpIHsKICAgICAgICBpKys7CiAgICAgIH0KICAgICAgaWYgKHRoaXMudG9Vbmljb2RlKSB7CiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBnZXRDaGFyQ29kZSh1bmljb2RlKTsKICAgICAgICBpZiAoY2hhckNvZGUgIT09IC0xKSB7CiAgICAgICAgICBpZiAoaGFzQ3VycmVudEJ1ZkVycm9ycygpKSB7CiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChjdXJyZW50QnVmLmpvaW4oIiIpKTsKICAgICAgICAgICAgY3VycmVudEJ1Zi5sZW5ndGggPSAwOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY2hhckNvZGVMZW5ndGggPSB0aGlzLmNNYXAgPyB0aGlzLmNNYXAuZ2V0Q2hhckNvZGVMZW5ndGgoY2hhckNvZGUpIDogMTsKICAgICAgICAgIGZvciAobGV0IGogPSBjaGFyQ29kZUxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICAgIGN1cnJlbnRCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlID4+IDggKiBqICYgMHhmZikpOwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghaGFzQ3VycmVudEJ1ZkVycm9ycygpKSB7CiAgICAgICAgYnVmZmVycy5wdXNoKGN1cnJlbnRCdWYuam9pbigiIikpOwogICAgICAgIGN1cnJlbnRCdWYubGVuZ3RoID0gMDsKICAgICAgfQogICAgICBjdXJyZW50QnVmLnB1c2goU3RyaW5nLmZyb21Db2RlUG9pbnQodW5pY29kZSkpOwogICAgfQogICAgYnVmZmVycy5wdXNoKGN1cnJlbnRCdWYuam9pbigiIikpOwogICAgcmV0dXJuIGJ1ZmZlcnM7CiAgfQp9CmNsYXNzIEVycm9yRm9udCB7CiAgY29uc3RydWN0b3IoZXJyb3IpIHsKICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKICAgIHRoaXMubG9hZGVkTmFtZSA9ICJnX2ZvbnRfZXJyb3IiOwogICAgdGhpcy5taXNzaW5nRmlsZSA9IHRydWU7CiAgfQogIGNoYXJzVG9HbHlwaHMoKSB7CiAgICByZXR1cm4gW107CiAgfQogIGVuY29kZVN0cmluZyhjaGFycykgewogICAgcmV0dXJuIFtjaGFyc107CiAgfQogIGV4cG9ydERhdGEoZXh0cmFQcm9wZXJ0aWVzID0gZmFsc2UpIHsKICAgIHJldHVybi
20B7CiAgICAgIGVycm9yOiB0aGlzLmVycm9yCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvcGF0dGVybi5qcwoKCgoKCgoKCgoKCmNvbnN0IFNoYWRpbmdUeXBlID0gewogIEZVTkNUSU9OX0JBU0VEOiAxLAogIEFYSUFMOiAyLAogIFJBRElBTDogMywKICBGUkVFX0ZPUk1fTUVTSDogNCwKICBMQVRUSUNFX0ZPUk1fTUVTSDogNSwKICBDT09OU19QQVRDSF9NRVNIOiA2LAogIFRFTlNPUl9QQVRDSF9NRVNIOiA3Cn07CmNsYXNzIFBhdHRlcm4gewogIGNvbnN0cnVjdG9yKCkgewogICAgdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIFBhdHRlcm4uIik7CiAgfQogIHN0YXRpYyBwYXJzZVNoYWRpbmcoc2hhZGluZywgeHJlZiwgcmVzLCBwZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBjb25zdCBkaWN0ID0gc2hhZGluZyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gPyBzaGFkaW5nLmRpY3QgOiBzaGFkaW5nOwogICAgY29uc3QgdHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5BWElBTDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlJBRElBTDoKICAgICAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nKGRpY3QsIHhyZWYsIHJlcywgcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5GUkVFX0ZPUk1fTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkxBVFRJQ0VfRk9STV9NRVNIOgogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQ09PTlNfUEFUQ0hfTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLlRFTlNPUl9QQVRDSF9NRVNIOgogICAgICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZyhzaGFkaW5nLCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVuc3VwcG9ydGVkIFNoYWRpbmdUeXBlOiAiICsgdHlwZSk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihleCk7CiAgICAgIHJldHVybiBuZXcgRHVtbXlTaGFkaW5nKCk7CiAgICB9CiAgfQp9CmNsYXNzIEJhc2VTaGFkaW5nIHsKICBzdGF0aWMgU01BTExfTlVNQkVSID0gMWUtNjsKICBnZXRJUigpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGdldElSYCBjYWxsZWQuIik7CiAgfQp9CmNsYXNzIFJhZGlhbEF4aWFsU2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBjb25zdHJ1Y3RvcihkaWN0LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CiAgICBsZXQgY29vcmRzTGVuID0gMDsKICAgIGlmICh0aGlzLnNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5BWElBTCkgewogICAgICBjb29yZHNMZW4gPSA0OwogICAgfSBlbHNlIGlmICh0aGlzLnNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwpIHsKICAgICAgY29vcmRzTGVuID0gNjsKICAgIH0KICAgIHRoaXMuY29vcmRzQXJyID0gZGljdC5nZXRBcnJheSgiQ29vcmRzIik7CiAgICBpZiAoIWlzTnVtYmVyQXJyYXkodGhpcy5jb29yZHNBcnIsIGNvb3Jkc0xlbikpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJSYWRpYWxBeGlhbFNoYWRpbmc6IEludmFsaWQgL0Nvb3JkcyBhcnJheS4iKTsKICAgIH0KICAgIGNvbnN0IGNzID0gQ29sb3JTcGFjZS5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0pOwogICAgdGhpcy5iYm94ID0gbG9va3VwTm9ybWFsUmVjdChkaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgbGV0IHQwID0gMC4wLAogICAgICB0MSA9IDEuMDsKICAgIGNvbnN0IGRvbWFpbkFyciA9IGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpOwogICAgaWYgKGlzTnVtYmVyQXJyYXkoZG9tYWluQXJyLCAyKSkgewogICAgICBbdDAsIHQxXSA9IGRvbWFpbkFycjsKICAgIH0KICAgIGxldCBleHRlbmRTdGFydCA9IGZhbHNlLAogICAgICBleHRlbmRFbmQgPSBmYWxzZTsKICAgIGNvbnN0IGV4dGVuZEFyciA9IGRpY3QuZ2V0QXJyYXkoIkV4dGVuZCIpOwogICAgaWYgKGlzQm9vbGVhbkFycmF5KGV4dGVuZEFyciwgMikpIHsKICAgICAgW2V4dGVuZFN0YXJ0LCBleHRlbmRFbmRdID0gZXh0ZW5kQXJyOwogICAgfQogICAgaWYgKHRoaXMuc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCAmJiAoIWV4dGVuZFN0YXJ0IHx8ICFleHRlbmRFbmQpKSB7CiAgICAgIGNvbnN0IFt4MSwgeTEsIHIxLCB4MiwgeTIsIHIyXSA9IHRoaXMuY29vcmRzQXJyOwogICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguaHlwb3QoeDEgLSB4MiwgeTEgLSB5Mik7CiAgICAgIGlmIChyMSA8PSByMiArIGRpc3RhbmNlICYmIHIyIDw9IHIxICsgZGlzdGFuY2UpIHsKICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCByYWRpYWwgZ3JhZGllbnQuIik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZXh0ZW5kU3RhcnQgPSBleHRlbmRTdGFydDsKICAgIHRoaXMuZXh0ZW5kRW5kID0gZXh0ZW5kRW5kOwogICAgY29uc3QgZm5PYmogPSBkaWN0LmdldFJhdygiRnVuY3Rpb24iKTsKICAgIGNvbnN0IGZuID0gcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZUZyb21BcnJheShmbk9iaik7CiAgICBjb25zdCBOVU1CRVJfT0ZfU0FNUExFUyA9IDg0MDsKICAgIGNvbnN0IHN0ZXAgPSAodDEgLSB0MCkgLyBOVU1CRVJfT0ZfU0FNUExFUzsKICAgIGNvbnN0IGNvbG9yU3RvcHMgPSB0aGlzLmNvbG9yU3RvcHMgPSBbXTsKICAgIGlmICh0MCA+PSB0MSB8fCBzdGVwIDw9IDApIHsKICAgICAgaW5mbygiQmFkIHNoYWRpbmcgZG9tYWluLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjb2xvciA9IG5ldyBGbG9hdDMyQXJyYXkoY3MubnVtQ29tcHMpLAogICAgICByYXRpbyA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CiAgICBsZXQgcmdiQ29sb3I7CiAgICBsZXQgaUJhc2UgPSAwOwogICAgcmF0aW9bMF0gPSB0MDsKICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CiAgICBsZXQgcmdiQmFzZSA9IGNzLmdldFJnYihjb2xvciwgMCk7CiAgICBjb25zdCBjc3NDb2xvckJhc2UgPSBVdGlsLm1ha2VIZXhDb2xvcihyZ2JCYXNlWzBdLCByZ2JCYXNlWzFdLCByZ2JCYXNlWzJdKTsKICAgIGNvbG9yU3RvcHMucHVzaChbMCwgY3NzQ29sb3JCYXNlXSk7CiAgICBsZXQgaVByZXYgPSAxOwogICAgcmF0aW9bMF0gPSB0MCArIHN0ZXA7CiAgICBmbihyYXRpbywgMCwgY29sb3IsIDApOwogICAgbGV0IHJnYlByZXYgPSBjcy5nZXRSZ2IoY29sb3IsIDApOwogICAgbGV0IG1heFNsb3BlUiA9IHJnYlByZXZbMF0gLSByZ2JCYXNlWzBdICsgMTsKICAgIGxldCBtYXhTbG9wZUcgPSByZ2JQcmV2WzFdIC0gcmdiQmFzZVsxXSArIDE7CiAgICBsZXQgbWF4U2xvcGVCID0gcmdiUHJldlsyXSAtIHJnYkJhc2VbMl0gKyAxOwogICAgbGV0IG1pblNsb3BlUiA9IHJnYlByZXZbMF0gLSByZ2JCYXNlWzBdIC0gMTsKICAgIGxldCBtaW5TbG9wZUcgPSByZ2JQcmV2WzFdIC0gcmdiQmFzZVsxXSAtIDE7CiAgICBsZXQgbWluU2xvcGVCID0gcmdiUHJldlsyXSAtIHJnYkJhc2VbMl0gLSAxOwogICAgZm9yIChsZXQgaSA9IDI7IGkgPCBOVU1CRVJfT0ZfU0FNUExFUzsgaSsrKSB7CiAgICAgI
20HJhdGlvWzBdID0gdDAgKyBpICogc3RlcDsKICAgICAgZm4ocmF0aW8sIDAsIGNvbG9yLCAwKTsKICAgICAgcmdiQ29sb3IgPSBjcy5nZXRSZ2IoY29sb3IsIDApOwogICAgICBjb25zdCBydW4gPSBpIC0gaUJhc2U7CiAgICAgIG1heFNsb3BlUiA9IE1hdGgubWluKG1heFNsb3BlUiwgKHJnYkNvbG9yWzBdIC0gcmdiQmFzZVswXSArIDEpIC8gcnVuKTsKICAgICAgbWF4U2xvcGVHID0gTWF0aC5taW4obWF4U2xvcGVHLCAocmdiQ29sb3JbMV0gLSByZ2JCYXNlWzFdICsgMSkgLyBydW4pOwogICAgICBtYXhTbG9wZUIgPSBNYXRoLm1pbihtYXhTbG9wZUIsIChyZ2JDb2xvclsyXSAtIHJnYkJhc2VbMl0gKyAxKSAvIHJ1bik7CiAgICAgIG1pblNsb3BlUiA9IE1hdGgubWF4KG1pblNsb3BlUiwgKHJnYkNvbG9yWzBdIC0gcmdiQmFzZVswXSAtIDEpIC8gcnVuKTsKICAgICAgbWluU2xvcGVHID0gTWF0aC5tYXgobWluU2xvcGVHLCAocmdiQ29sb3JbMV0gLSByZ2JCYXNlWzFdIC0gMSkgLyBydW4pOwogICAgICBtaW5TbG9wZUIgPSBNYXRoLm1heChtaW5TbG9wZUIsIChyZ2JDb2xvclsyXSAtIHJnYkJhc2VbMl0gLSAxKSAvIHJ1bik7CiAgICAgIGNvbnN0IHNsb3Blc0V4aXN0ID0gbWluU2xvcGVSIDw9IG1heFNsb3BlUiAmJiBtaW5TbG9wZUcgPD0gbWF4U2xvcGVHICYmIG1pblNsb3BlQiA8PSBtYXhTbG9wZUI7CiAgICAgIGlmICghc2xvcGVzRXhpc3QpIHsKICAgICAgICBjb25zdCBjc3NDb2xvciA9IFV0aWwubWFrZUhleENvbG9yKHJnYlByZXZbMF0sIHJnYlByZXZbMV0sIHJnYlByZXZbMl0pOwogICAgICAgIGNvbG9yU3RvcHMucHVzaChbaVByZXYgLyBOVU1CRVJfT0ZfU0FNUExFUywgY3NzQ29sb3JdKTsKICAgICAgICBtYXhTbG9wZVIgPSByZ2JDb2xvclswXSAtIHJnYlByZXZbMF0gKyAxOwogICAgICAgIG1heFNsb3BlRyA9IHJnYkNvbG9yWzFdIC0gcmdiUHJldlsxXSArIDE7CiAgICAgICAgbWF4U2xvcGVCID0gcmdiQ29sb3JbMl0gLSByZ2JQcmV2WzJdICsgMTsKICAgICAgICBtaW5TbG9wZVIgPSByZ2JDb2xvclswXSAtIHJnYlByZXZbMF0gLSAxOwogICAgICAgIG1pblNsb3BlRyA9IHJnYkNvbG9yWzFdIC0gcmdiUHJldlsxXSAtIDE7CiAgICAgICAgbWluU2xvcGVCID0gcmdiQ29sb3JbMl0gLSByZ2JQcmV2WzJdIC0gMTsKICAgICAgICBpQmFzZSA9IGlQcmV2OwogICAgICAgIHJnYkJhc2UgPSByZ2JQcmV2OwogICAgICB9CiAgICAgIGlQcmV2ID0gaTsKICAgICAgcmdiUHJldiA9IHJnYkNvbG9yOwogICAgfQogICAgY29uc3QgY3NzQ29sb3IgPSBVdGlsLm1ha2VIZXhDb2xvcihyZ2JQcmV2WzBdLCByZ2JQcmV2WzFdLCByZ2JQcmV2WzJdKTsKICAgIGNvbG9yU3RvcHMucHVzaChbMSwgY3NzQ29sb3JdKTsKICAgIGxldCBiYWNrZ3JvdW5kID0gInRyYW5zcGFyZW50IjsKICAgIGlmIChkaWN0LmhhcygiQmFja2dyb3VuZCIpKSB7CiAgICAgIHJnYkNvbG9yID0gY3MuZ2V0UmdiKGRpY3QuZ2V0KCJCYWNrZ3JvdW5kIiksIDApOwogICAgICBiYWNrZ3JvdW5kID0gVXRpbC5tYWtlSGV4Q29sb3IocmdiQ29sb3JbMF0sIHJnYkNvbG9yWzFdLCByZ2JDb2xvclsyXSk7CiAgICB9CiAgICBpZiAoIWV4dGVuZFN0YXJ0KSB7CiAgICAgIGNvbG9yU3RvcHMudW5zaGlmdChbMCwgYmFja2dyb3VuZF0pOwogICAgICBjb2xvclN0b3BzWzFdWzBdICs9IEJhc2VTaGFkaW5nLlNNQUxMX05VTUJFUjsKICAgIH0KICAgIGlmICghZXh0ZW5kRW5kKSB7CiAgICAgIGNvbG9yU3RvcHMuYXQoLTEpWzBdIC09IEJhc2VTaGFkaW5nLlNNQUxMX05VTUJFUjsKICAgICAgY29sb3JTdG9wcy5wdXNoKFsxLCBiYWNrZ3JvdW5kXSk7CiAgICB9CiAgICB0aGlzLmNvbG9yU3RvcHMgPSBjb2xvclN0b3BzOwogIH0KICBnZXRJUigpIHsKICAgIGNvbnN0IHsKICAgICAgY29vcmRzQXJyLAogICAgICBzaGFkaW5nVHlwZQogICAgfSA9IHRoaXM7CiAgICBsZXQgdHlwZSwgcDAsIHAxLCByMCwgcjE7CiAgICBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLkFYSUFMKSB7CiAgICAgIHAwID0gW2Nvb3Jkc0FyclswXSwgY29vcmRzQXJyWzFdXTsKICAgICAgcDEgPSBbY29vcmRzQXJyWzJdLCBjb29yZHNBcnJbM11dOwogICAgICByMCA9IG51bGw7CiAgICAgIHIxID0gbnVsbDsKICAgICAgdHlwZSA9ICJheGlhbCI7CiAgICB9IGVsc2UgaWYgKHNoYWRpbmdUeXBlID09PSBTaGFkaW5nVHlwZS5SQURJQUwpIHsKICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOwogICAgICBwMSA9IFtjb29yZHNBcnJbM10sIGNvb3Jkc0Fycls0XV07CiAgICAgIHIwID0gY29vcmRzQXJyWzJdOwogICAgICByMSA9IGNvb3Jkc0Fycls1XTsKICAgICAgdHlwZSA9ICJyYWRpYWwiOwogICAgfSBlbHNlIHsKICAgICAgdW5yZWFjaGFibGUoYGdldFBhdHRlcm4gdHlwZSB1bmtub3duOiAke3NoYWRpbmdUeXBlfWApOwogICAgfQogICAgcmV0dXJuIFsiUmFkaWFsQXhpYWwiLCB0eXBlLCB0aGlzLmJib3gsIHRoaXMuY29sb3JTdG9wcywgcDAsIHAxLCByMCwgcjFdOwogIH0KfQpjbGFzcyBNZXNoU3RyZWFtUmVhZGVyIHsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIGNvbnRleHQpIHsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKICAgIHRoaXMuYnVmZmVyID0gMDsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKICAgIGNvbnN0IG51bUNvbXBzID0gY29udGV4dC5udW1Db21wczsKICAgIHRoaXMudG1wQ29tcHNCdWYgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTsKICAgIGNvbnN0IGNzTnVtQ29tcHMgPSBjb250ZXh0LmNvbG9yU3BhY2UubnVtQ29tcHM7CiAgICB0aGlzLnRtcENzQ29tcHNCdWYgPSBjb250ZXh0LmNvbG9yRm4gPyBuZXcgRmxvYXQzMkFycmF5KGNzTnVtQ29tcHMpIDogdGhpcy50bXBDb21wc0J1ZjsKICB9CiAgZ2V0IGhhc0RhdGEoKSB7CiAgICBpZiAodGhpcy5zdHJlYW0uZW5kKSB7CiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5wb3MgPCB0aGlzLnN0cmVhbS5lbmQ7CiAgICB9CiAgICBpZiAodGhpcy5idWZmZXJMZW5ndGggPiAwKSB7CiAgICAgIHJldHVybi
20B0cnVlOwogICAgfQogICAgY29uc3QgbmV4dEJ5dGUgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgICBpZiAobmV4dEJ5dGUgPCAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gbmV4dEJ5dGU7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDg7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmVhZEJpdHMobikgewogICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgaWYgKG4gPT09IDMyKSB7CiAgICAgIGlmIChidWZmZXJMZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAyNCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCAxNiB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpKSA+Pj4gMDsKICAgICAgfQogICAgICBidWZmZXIgPSBidWZmZXIgPDwgMjQgfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMTYgfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgOCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgY29uc3QgbmV4dEJ5dGUgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgICAgIHRoaXMuYnVmZmVyID0gbmV4dEJ5dGUgJiAoMSA8PCBidWZmZXJMZW5ndGgpIC0gMTsKICAgICAgcmV0dXJuIChidWZmZXIgPDwgOCAtIGJ1ZmZlckxlbmd0aCB8IChuZXh0Qnl0ZSAmIDB4ZmYpID4+IGJ1ZmZlckxlbmd0aCkgPj4+IDA7CiAgICB9CiAgICBpZiAobiA9PT0gOCAmJiBidWZmZXJMZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICAgIH0KICAgIHdoaWxlIChidWZmZXJMZW5ndGggPCBuKSB7CiAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA4IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICBidWZmZXJMZW5ndGggKz0gODsKICAgIH0KICAgIGJ1ZmZlckxlbmd0aCAtPSBuOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlciAmICgxIDw8IGJ1ZmZlckxlbmd0aCkgLSAxOwogICAgcmV0dXJuIGJ1ZmZlciA+PiBidWZmZXJMZW5ndGg7CiAgfQogIGFsaWduKCkgewogICAgdGhpcy5idWZmZXIgPSAwOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSAwOwogIH0KICByZWFkRmxhZygpIHsKICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKHRoaXMuY29udGV4dC5iaXRzUGVyRmxhZyk7CiAgfQogIHJlYWRDb29yZGluYXRlKCkgewogICAgY29uc3QgYml0c1BlckNvb3JkaW5hdGUgPSB0aGlzLmNvbnRleHQuYml0c1BlckNvb3JkaW5hdGU7CiAgICBjb25zdCB4aSA9IHRoaXMucmVhZEJpdHMoYml0c1BlckNvb3JkaW5hdGUpOwogICAgY29uc3QgeWkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKICAgIGNvbnN0IGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7CiAgICBjb25zdCBzY2FsZSA9IGJpdHNQZXJDb29yZGluYXRlIDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb29yZGluYXRlKSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIHJldHVybiBbeGkgKiBzY2FsZSAqIChkZWNvZGVbMV0gLSBkZWNvZGVbMF0pICsgZGVjb2RlWzBdLCB5aSAqIHNjYWxlICogKGRlY29kZVszXSAtIGRlY29kZVsyXSkgKyBkZWNvZGVbMl1dOwogIH0KICByZWFkQ29tcG9uZW50cygpIHsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5jb250ZXh0Lm51bUNvbXBzOwogICAgY29uc3QgYml0c1BlckNvbXBvbmVudCA9IHRoaXMuY29udGV4dC5iaXRzUGVyQ29tcG9uZW50OwogICAgY29uc3Qgc2NhbGUgPSBiaXRzUGVyQ29tcG9uZW50IDwgMzIgPyAxIC8gKCgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMSkgOiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOwogICAgY29uc3QgZGVjb2RlID0gdGhpcy5jb250ZXh0LmRlY29kZTsKICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLnRtcENvbXBzQnVmOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSA0OyBpIDwgbnVtQ29tcHM7IGkrKywgaiArPSAyKSB7CiAgICAgIGNvbnN0IGNpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29tcG9uZW50KTsKICAgICAgY29tcG9uZW50c1tpXSA9IGNpICogc2NhbGUgKiAoZGVjb2RlW2ogKyAxXSAtIGRlY29kZVtqXSkgKyBkZWNvZGVbal07CiAgICB9CiAgICBjb25zdCBjb2xvciA9IHRoaXMudG1wQ3NDb21wc0J1ZjsKICAgIGlmICh0aGlzLmNvbnRleHQuY29sb3JGbikgewogICAgICB0aGlzLmNvbnRleHQuY29sb3JGbihjb21wb25lbnRzLCAwLCBjb2xvciwgMCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbG9yU3BhY2UuZ2V0UmdiKGNvbG9yLCAwKTsKICB9Cn0KbGV0IGJDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CmZ1bmN0aW9uIGJ1aWxkQihjb3VudCkgewogIGNvbnN0IGx1dCA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDw9IGNvdW50OyBpKyspIHsKICAgIGNvbnN0IHQgPSBpIC8gY291bnQsCiAgICAgIHRfID0gMSAtIHQ7CiAgICBsdXQucHVzaChuZXcgRmxvYXQzMkFycmF5KFt0XyAqKiAzLCAzICogdCAqIHRfICoqIDIsIDMgKiB0ICoqIDIgKiB0XywgdCAqKiAzXSkpOwogIH0KICByZXR1cm4gbHV0Owp9CmZ1bmN0aW9uIGdldEIoY291bnQpIHsKICByZXR1cm4gYkNhY2hlW2NvdW50XSB8fD0gYnVpbGRCKGNvdW50KTsKfQpmdW5jdGlvbiBjbGVhclBhdHRlcm5DYWNoZXMoKSB7CiAgYkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKfQpjbGFzcyBNZXNoU2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBzdGF0aWMgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAzOwogIHN0YXRpYyBNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDIwOwogIHN0YXRpYyBUUklBTkdMRV9ERU5TSVRZID0gMjA7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHN1cGVyKCk7CiAgICBpZiAoIShzdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk1lc2ggZGF0YSBpcyBub3QgYSBzdHJlYW0iKTsKICAgIH0KICAgIGNvbnN0IGRpY3QgPSBzdHJlYW0uZGljdDsKICAgIHRoaXMuc2hhZGluZ1R5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKICAgIHRoaXMuYmJveCA9IGxvb2t1cE5vcm1hbFJlY3QoZGljdC5nZXRBcnJheSgiQkJveCIpLCBudWxsKTsKICAgIGNvbnN0IGNzID0gQ29sb3JTcGFjZS5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgI
20HBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0pOwogICAgdGhpcy5iYWNrZ3JvdW5kID0gZGljdC5oYXMoIkJhY2tncm91bmQiKSA/IGNzLmdldFJnYihkaWN0LmdldCgiQmFja2dyb3VuZCIpLCAwKSA6IG51bGw7CiAgICBjb25zdCBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOwogICAgY29uc3QgZm4gPSBmbk9iaiA/IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkoZm5PYmopIDogbnVsbDsKICAgIHRoaXMuY29vcmRzID0gW107CiAgICB0aGlzLmNvbG9ycyA9IFtdOwogICAgdGhpcy5maWd1cmVzID0gW107CiAgICBjb25zdCBkZWNvZGVDb250ZXh0ID0gewogICAgICBiaXRzUGVyQ29vcmRpbmF0ZTogZGljdC5nZXQoIkJpdHNQZXJDb29yZGluYXRlIiksCiAgICAgIGJpdHNQZXJDb21wb25lbnQ6IGRpY3QuZ2V0KCJCaXRzUGVyQ29tcG9uZW50IiksCiAgICAgIGJpdHNQZXJGbGFnOiBkaWN0LmdldCgiQml0c1BlckZsYWciKSwKICAgICAgZGVjb2RlOiBkaWN0LmdldEFycmF5KCJEZWNvZGUiKSwKICAgICAgY29sb3JGbjogZm4sCiAgICAgIGNvbG9yU3BhY2U6IGNzLAogICAgICBudW1Db21wczogZm4gPyAxIDogY3MubnVtQ29tcHMKICAgIH07CiAgICBjb25zdCByZWFkZXIgPSBuZXcgTWVzaFN0cmVhbVJlYWRlcihzdHJlYW0sIGRlY29kZUNvbnRleHQpOwogICAgbGV0IHBhdGNoTWVzaCA9IGZhbHNlOwogICAgc3dpdGNoICh0aGlzLnNoYWRpbmdUeXBlKSB7CiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTRTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6CiAgICAgICAgY29uc3QgdmVydGljZXNQZXJSb3cgPSBkaWN0LmdldCgiVmVydGljZXNQZXJSb3ciKSB8IDA7CiAgICAgICAgaWYgKHZlcnRpY2VzUGVyUm93IDwgMikgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFZlcnRpY2VzUGVyUm93Iik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2RlY29kZVR5cGU1U2hhZGluZyhyZWFkZXIsIHZlcnRpY2VzUGVyUm93KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5DT09OU19QQVRDSF9NRVNIOgogICAgICAgIHRoaXMuX2RlY29kZVR5cGU2U2hhZGluZyhyZWFkZXIpOwogICAgICAgIHBhdGNoTWVzaCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuVEVOU09SX1BBVENIX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTdTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB1bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgbWVzaCB0eXBlLiIpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhdGNoTWVzaCkgewogICAgICB0aGlzLl91cGRhdGVCb3VuZHMoKTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy5maWd1cmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICB0aGlzLl9idWlsZEZpZ3VyZUZyb21QYXRjaChpKTsKICAgICAgfQogICAgfQogICAgdGhpcy5fdXBkYXRlQm91bmRzKCk7CiAgICB0aGlzLl9wYWNrRGF0YSgpOwogIH0KICBfZGVjb2RlVHlwZTRTaGFkaW5nKHJlYWRlcikgewogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IG9wZXJhdG9ycyA9IFtdOwogICAgY29uc3QgcHMgPSBbXTsKICAgIGxldCB2ZXJ0aWNlc0xlZnQgPSAwOwogICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CiAgICAgIGNvbnN0IGYgPSByZWFkZXIucmVhZEZsYWcoKTsKICAgICAgY29uc3QgY29vcmQgPSByZWFkZXIucmVhZENvb3JkaW5hdGUoKTsKICAgICAgY29uc3QgY29sb3IgPSByZWFkZXIucmVhZENvbXBvbmVudHMoKTsKICAgICAgaWYgKHZlcnRpY2VzTGVmdCA9PT0gMCkgewogICAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTQgZmxhZyIpOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGYpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHBzLnB1c2gocHMuYXQoLTIpLCBwcy5hdCgtMSkpOwogICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcHMucHVzaChwcy5hdCgtMyksIHBzLmF0KC0xKSk7CiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBvcGVyYXRvcnMucHVzaChmKTsKICAgICAgfQogICAgICBwcy5wdXNoKGNvb3Jkcy5sZW5ndGgpOwogICAgICBjb29yZHMucHVzaChjb29yZCk7CiAgICAgIGNvbG9ycy5wdXNoKGNvbG9yKTsKICAgICAgdmVydGljZXNMZWZ0LS07CiAgICAgIHJlYWRlci5hbGlnbigpOwogICAgfQogICAgdGhpcy5maWd1cmVzLnB1c2goewogICAgICB0eX
20BlOiAidHJpYW5nbGVzIiwKICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksCiAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkocHMpCiAgICB9KTsKICB9CiAgX2RlY29kZVR5cGU1U2hhZGluZyhyZWFkZXIsIHZlcnRpY2VzUGVyUm93KSB7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3QgcHMgPSBbXTsKICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgewogICAgICBjb25zdCBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOwogICAgICBjb25zdCBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpOwogICAgICBwcy5wdXNoKGNvb3Jkcy5sZW5ndGgpOwogICAgICBjb29yZHMucHVzaChjb29yZCk7CiAgICAgIGNvbG9ycy5wdXNoKGNvbG9yKTsKICAgIH0KICAgIHRoaXMuZmlndXJlcy5wdXNoKHsKICAgICAgdHlwZTogImxhdHRpY2UiLAogICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcyksCiAgICAgIHZlcnRpY2VzUGVyUm93CiAgICB9KTsKICB9CiAgX2RlY29kZVR5cGU2U2hhZGluZyhyZWFkZXIpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKICAgIGNvbnN0IGNzID0gbmV3IEludDMyQXJyYXkoNCk7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAzKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNiBmbGFnIik7CiAgICAgIH0KICAgICAgY29uc3QgcGkgPSBjb29yZHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gOCA6IDEyOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvb3Jkcy5wdXNoKHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpKTsKICAgICAgfQogICAgICBjb25zdCBjaSA9IGNvbG9ycy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGYgIT09IDAgPyAyIDogNDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb2xvcnMucHVzaChyZWFkZXIucmVhZENvbXBvbmVudHMoKSk7CiAgICAgIH0KICAgICAgbGV0IHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQ7CiAgICAgIHN3aXRjaCAoZikgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHBzWzEyXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgNDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgNTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgNjsKICAgICAgICAgIHBzWzhdID0gcGkgKyAyOwogICAgICAgICAgcHNbMTFdID0gcGkgKyA3OwogICAgICAgICAgcHNbNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgODsKICAgICAgICAgIHBzWzBdID0gcGk7CiAgICAgICAgICBwc1sxXSA9IHBpICsgMTE7CiAgICAgICAgICBwc1syXSA9IHBpICsgMTA7CiAgICAgICAgICBwc1szXSA9IHBpICsgOTsKICAgICAgICAgIGNzWzJdID0gY2kgKyAxOwogICAgICAgICAgY3NbM10gPSBjaSArIDI7CiAgICAgICAgICBjc1swXSA9IGNpOwogICAgICAgICAgY3NbMV0gPSBjaSArIDM7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICB0bXAxID0gcHNbMTJdOwogICAgICAgICAgdG1wMiA9IHBzWzEzXTsKICAgICAgICAgIHRtcDMgPSBwc1sxNF07CiAgICAgICAgICB0bXA0ID0gcHNbMTVdOwogICAgICAgICAgcHNbMTJdID0gdG1wNDsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gdG1wMzsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzddID0gcGkgKyA0OwogICAgICAgICAgcHNbMF0gPSB0bXAxOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgIHBzWzNdID0gcGkgKyA1OwogICAgICAgICAgdG1wMSA9IGNzWzJdOwogICAgICAgICAgdG1wMiA9IGNzWzNdOwogICAgICAgICAgY3NbMl0gPSB0bXAyOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gdG1wMTsKICAgICAgICAgIGNzWzFdID0gY2kgKyAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgdG1wMSA9IHBzWzE1XTsKICAgICAgICAgIHRtcDIgPSBwc1sxMV07CiAgICAgICAgICBwc1sxMl0gPSBwc1szXTsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gcHNbN107CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CiAgICAgICAgICBwc1s0XSA9IHRtcDI7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gY3NbMV07CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gcHNbMV07CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CiAgICAgICAgICBwc1s0XSA9IHBzWzJdOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHBzWzNdOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgI
20HBzWzNdID0gcGkgKyA1OwogICAgICAgICAgY3NbMl0gPSBjc1swXTsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IGNzWzFdOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwc1s1XSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMF1dWzBdIC0gY29vcmRzW3BzWzE1XV1bMF0gKyA2ICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMV1dWzBdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMF0gKyBjb29yZHNbcHNbM11dWzBdKSArIDMgKiAoY29vcmRzW3BzWzEzXV1bMF0gKyBjb29yZHNbcHNbN11dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMF1dWzFdIC0gY29vcmRzW3BzWzE1XV1bMV0gKyA2ICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMV1dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMV0gKyBjb29yZHNbcHNbM11dWzFdKSArIDMgKiAoY29vcmRzW3BzWzEzXV1bMV0gKyBjb29yZHNbcHNbN11dWzFdKSkgLyA5XSk7CiAgICAgIHBzWzZdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1szXV1bMF0gLSBjb29yZHNbcHNbMTJdXVswXSArIDYgKiAoY29vcmRzW3BzWzJdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzBdICsgY29vcmRzW3BzWzE1XV1bMF0pICsgMyAqIChjb29yZHNbcHNbNF1dWzBdICsgY29vcmRzW3BzWzE0XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1szXV1bMV0gLSBjb29yZHNbcHNbMTJdXVsxXSArIDYgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s3XV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbNF1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pKSAvIDldKTsKICAgICAgcHNbOV0gPSBjb29yZHMubGVuZ3RoOwogICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzEyXV1bMF0gLSBjb29yZHNbcHNbM11dWzBdICsgNiAqIChjb29yZHNbcHNbOF1dWzBdICsgY29vcmRzW3BzWzEzXV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzBdICsgY29vcmRzW3BzWzE1XV1bMF0pICsgMyAqIChjb29yZHNbcHNbMTFdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1sxMl1dWzFdIC0gY29vcmRzW3BzWzNdXVsxXSArIDYgKiAoY29vcmRzW3BzWzhdXVsxXSArIGNvb3Jkc1twc1sxM11dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzBdXVsxXSArIGNvb3Jkc1twc1sxNV1dWzFdKSArIDMgKiAoY29vcmRzW3BzWzExXV1bMV0gKyBjb29yZHNbcHNbMV1dWzFdKSkgLyA5XSk7CiAgICAgIHBzWzEwXSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTVdXVswXSAtIGNvb3Jkc1twc1swXV1bMF0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzE0XV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzhdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzE1XV1bMV0gLSBjb29yZHNbcHNbMF1dWzFdICsgNiAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxNF1dWzFdKSAtIDIgKiAoY29vcmRzW3BzWzEyXV1bMV0gKyBjb29yZHNbcHNbM11dWzFdKSArIDMgKiAoY29vcmRzW3BzWzJdXVsxXSArIGNvb3Jkc1twc1s4XV1bMV0pKSAvIDldKTsKICAgICAgdGhpcy5maWd1cmVzLnB1c2goewogICAgICAgIHR5cGU6ICJwYXRjaCIsCiAgICAgICAgY29vcmRzOiBuZXcgSW50MzJBcnJheShwcyksCiAgICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShjcykKICAgICAgfSk7CiAgICB9CiAgfQogIF9kZWNvZGVUeXBlN1NoYWRpbmcocmVhZGVyKSB7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3QgcHMgPSBuZXcgSW50MzJBcnJheSgxNik7CiAgICBjb25zdCBjcyA9IG5ldyBJbnQzMkFycmF5KDQpOwogICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CiAgICAgIGNvbnN0IGYgPSByZWFkZXIucmVhZEZsYWcoKTsKICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMykpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVua25vd24gdHlwZTcgZmxhZyIpOwogICAgICB9CiAgICAgIGNvbnN0IHBpID0gY29vcmRzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZiAhPT0gMCA/IDEyIDogMTY7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpOwogICAgICB9CiAgICAgIGNvbnN0IGNpID0gY29sb3JzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKICAgICAgfQogICAgICBsZXQgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKICAgICAgc3dpdGNoIChmKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcHNbMTJdID0gcGkgKyAzOwogICAgICAgICAgcHNbMTNdID0gcGkgKyA0OwogICAgICAgICAgcHNbMTRdID0gcGkgKyA1OwogICAgICAgICAgcHNbMTVdID0gcGkgKyA2OwogICAgICAgICAgcHNbOF0gPSBwaSArIDI7CiAgICAgICAgICBwc1s5XSA9IHBpICsgMTM7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDE0OwogICAgICAgICAgcHNbMTFdID0gcGkgKyA3OwogICAgICAgICAgcHNbNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1s1XSA9IHBpICsgMTI7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTU7CiAgICAgICAgICBwc1s3XSA9IHBpICsgODsKICAgICAgICAgIHBzWzBdID0gcGk7CiAgICAgICAgICBwc1sxXSA9IHBpICsgMTE7CiAgICAgICAgICBwc1syXSA9IHBpICsgMTA7CiAgICAgICAgICBwc1szXSA9IHBpICsgOTsKICAgICAgICAgIGNzWzJdID0gY2kgKyAxOwogICAgICAgICAgY3NbM10gPSBjaSArIDI7CiAgICAgICAgICBjc1swXSA9IGNpOwogICAgICAgICAgY3NbMV0gPSBjaSArIDM7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICB0bXAxID0gcHNbMTJdOwogICAgICAgICAgdG1wMiA9IHBzWzEzXTsKICAgICAgICAgI
20HRtcDMgPSBwc1sxNF07CiAgICAgICAgICB0bXA0ID0gcHNbMTVdOwogICAgICAgICAgcHNbMTJdID0gdG1wNDsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gdG1wMzsKICAgICAgICAgIHBzWzldID0gcGkgKyA5OwogICAgICAgICAgcHNbMTBdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzVdID0gcGkgKyA4OwogICAgICAgICAgcHNbNl0gPSBwaSArIDExOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHRtcDE7CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICB0bXAxID0gY3NbMl07CiAgICAgICAgICB0bXAyID0gY3NbM107CiAgICAgICAgICBjc1syXSA9IHRtcDI7CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0bXAxID0gcHNbMTVdOwogICAgICAgICAgdG1wMiA9IHBzWzExXTsKICAgICAgICAgIHBzWzEyXSA9IHBzWzNdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1s3XTsKICAgICAgICAgIHBzWzldID0gcGkgKyA5OwogICAgICAgICAgcHNbMTBdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzVdID0gcGkgKyA4OwogICAgICAgICAgcHNbNl0gPSBwaSArIDExOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHRtcDE7CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICB0bXAxID0gY3NbM107CiAgICAgICAgICBjc1syXSA9IGNzWzFdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gdG1wMTsKICAgICAgICAgIGNzWzFdID0gY2kgKyAxOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgcHNbMTJdID0gcHNbMF07CiAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CiAgICAgICAgICBwc1s4XSA9IHBzWzFdOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSBwc1syXTsKICAgICAgICAgIHBzWzVdID0gcGkgKyA4OwogICAgICAgICAgcHNbNl0gPSBwaSArIDExOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHBzWzNdOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgIHBzWzNdID0gcGkgKyA1OwogICAgICAgICAgY3NbMl0gPSBjc1swXTsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IGNzWzFdOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgICAgdHlwZTogInBhdGNoIiwKICAgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQogICAgICB9KTsKICAgIH0KICB9CiAgX2J1aWxkRmlndXJlRnJvbVBhdGNoKGluZGV4KSB7CiAgICBjb25zdCBmaWd1cmUgPSB0aGlzLmZpZ3VyZXNbaW5kZXhdOwogICAgYXNzZXJ0KGZpZ3VyZS50eXBlID09PSAicGF0Y2giLCAiVW5leHBlY3RlZCBwYXRjaCBtZXNoIGZpZ3VyZSIpOwogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMsCiAgICAgIGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3QgcGkgPSBmaWd1cmUuY29vcmRzOwogICAgY29uc3QgY2kgPSBmaWd1cmUuY29sb3JzOwogICAgY29uc3QgZmlndXJlTWluWCA9IE1hdGgubWluKGNvb3Jkc1twaVswXV1bMF0sIGNvb3Jkc1twaVszXV1bMF0sIGNvb3Jkc1twaVsxMl1dWzBdLCBjb29yZHNbcGlbMTVdXVswXSk7CiAgICBjb25zdCBmaWd1cmVNaW5ZID0gTWF0aC5taW4oY29vcmRzW3BpWzBdXVsxXSwgY29vcmRzW3BpWzNdXVsxXSwgY29vcmRzW3BpWzEyXV1bMV0sIGNvb3Jkc1twaVsxNV1dWzFdKTsKICAgIGNvbnN0IGZpZ3VyZU1heFggPSBNYXRoLm1heChjb29yZHNbcGlbMF1dWzBdLCBjb29yZHNbcGlbM11dWzBdLCBjb29yZHNbcGlbMTJdXVswXSwgY29vcmRzW3BpWzE1XV1bMF0pOwogICAgY29uc3QgZmlndXJlTWF4WSA9IE1hdGgubWF4KGNvb3Jkc1twaVswXV1bMV0sIGNvb3Jkc1twaVszXV1bMV0sIGNvb3Jkc1twaVsxMl1dWzFdLCBjb29yZHNbcGlbMTVdXVsxXSk7CiAgICBsZXQgc3BsaXRYQnkgPSBNYXRoLmNlaWwoKGZpZ3VyZU1heFggLSBmaWd1cmVNaW5YKSAqIE1lc2hTaGFkaW5nLlRSSUFOR0xFX0RFTlNJVFkgLyAodGhpcy5ib3VuZHNbMl0gLSB0aGlzLmJvdW5kc1swXSkpOwogICAgc3BsaXRYQnkgPSBNYXRoLm1heChNZXNoU2hhZGluZy5NSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgTWF0aC5taW4oTWVzaFNoYWRpbmcuTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIHNwbGl0WEJ5KSk7CiAgICBsZXQgc3BsaXRZQnkgPSBNYXRoLmNlaWwoKGZpZ3VyZU1heFkgLSBmaWd1cmVNaW5ZKSAqIE1lc2hTaGFkaW5nLlRSSUFOR0xFX0RFTlNJVFkgLyAodGhpcy5ib3VuZHNbM10gLSB0aGlzLmJvdW5kc1sxXSkpOwogICAgc3BsaXRZQnkgPSBNYXRoLm1heChNZXNoU2hhZGluZy5NSU5fU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCwgTWF0aC5taW4oTWVzaFNoYWRpbmcuTUFYX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIHNwbGl0WUJ5KSk7CiAgICBjb25zdCB2ZXJ0aWNlc1BlclJvdyA9IHNwbGl0WEJ5ICsgMTsKICAgIGNvbnN0IGZpZ3VyZUNvb3JkcyA9IG5ldyBJbnQzMkFycmF
205KChzcGxpdFlCeSArIDEpICogdmVydGljZXNQZXJSb3cpOwogICAgY29uc3QgZmlndXJlQ29sb3JzID0gbmV3IEludDMyQXJyYXkoKHNwbGl0WUJ5ICsgMSkgKiB2ZXJ0aWNlc1BlclJvdyk7CiAgICBsZXQgayA9IDA7CiAgICBjb25zdCBjbCA9IG5ldyBVaW50OEFycmF5KDMpLAogICAgICBjciA9IG5ldyBVaW50OEFycmF5KDMpOwogICAgY29uc3QgYzAgPSBjb2xvcnNbY2lbMF1dLAogICAgICBjMSA9IGNvbG9yc1tjaVsxXV0sCiAgICAgIGMyID0gY29sb3JzW2NpWzJdXSwKICAgICAgYzMgPSBjb2xvcnNbY2lbM11dOwogICAgY29uc3QgYlJvdyA9IGdldEIoc3BsaXRZQnkpLAogICAgICBiQ29sID0gZ2V0QihzcGxpdFhCeSk7CiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gc3BsaXRZQnk7IHJvdysrKSB7CiAgICAgIGNsWzBdID0gKGMwWzBdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzBdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY2xbMV0gPSAoYzBbMV0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMV0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjbFsyXSA9IChjMFsyXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlsyXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNyWzBdID0gKGMxWzBdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzBdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY3JbMV0gPSAoYzFbMV0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMV0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjclsyXSA9IChjMVsyXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1syXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSBzcGxpdFhCeTsgY29sKyssIGsrKykgewogICAgICAgIGlmICgocm93ID09PSAwIHx8IHJvdyA9PT0gc3BsaXRZQnkpICYmIChjb2wgPT09IDAgfHwgY29sID09PSBzcGxpdFhCeSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBsZXQgeCA9IDAsCiAgICAgICAgICB5ID0gMDsKICAgICAgICBsZXQgcSA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMzsgaSsrKSB7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSAzOyBqKyssIHErKykgewogICAgICAgICAgICBjb25zdCBtID0gYlJvd1tyb3ddW2ldICogYkNvbFtjb2xdW2pdOwogICAgICAgICAgICB4ICs9IGNvb3Jkc1twaVtxXV1bMF0gKiBtOwogICAgICAgICAgICB5ICs9IGNvb3Jkc1twaVtxXV1bMV0gKiBtOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaWd1cmVDb29yZHNba10gPSBjb29yZHMubGVuZ3RoOwogICAgICAgIGNvb3Jkcy5wdXNoKFt4LCB5XSk7CiAgICAgICAgZmlndXJlQ29sb3JzW2tdID0gY29sb3JzLmxlbmd0aDsKICAgICAgICBjb25zdCBuZXdDb2xvciA9IG5ldyBVaW50OEFycmF5KDMpOwogICAgICAgIG5ld0NvbG9yWzBdID0gKGNsWzBdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzBdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKICAgICAgICBuZXdDb2xvclsxXSA9IChjbFsxXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclsxXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CiAgICAgICAgbmV3Q29sb3JbMl0gPSAoY2xbMl0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMl0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOwogICAgICAgIGNvbG9ycy5wdXNoKG5ld0NvbG9yKTsKICAgICAgfQogICAgfQogICAgZmlndXJlQ29vcmRzWzBdID0gcGlbMF07CiAgICBmaWd1cmVDb2xvcnNbMF0gPSBjaVswXTsKICAgIGZpZ3VyZUNvb3Jkc1tzcGxpdFhCeV0gPSBwaVszXTsKICAgIGZpZ3VyZUNvbG9yc1tzcGxpdFhCeV0gPSBjaVsxXTsKICAgIGZpZ3VyZUNvb3Jkc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5XSA9IHBpWzEyXTsKICAgIGZpZ3VyZUNvbG9yc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5XSA9IGNpWzJdOwogICAgZmlndXJlQ29vcmRzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBwaVsxNV07CiAgICBmaWd1cmVDb2xvcnNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeSArIHNwbGl0WEJ5XSA9IGNpWzNdOwogICAgdGhpcy5maWd1cmVzW2luZGV4XSA9IHsKICAgICAgdHlwZTogImxhdHRpY2UiLAogICAgICBjb29yZHM6IGZpZ3VyZUNvb3JkcywKICAgICAgY29sb3JzOiBmaWd1cmVDb2xvcnMsCiAgICAgIHZlcnRpY2VzUGVyUm93CiAgICB9OwogIH0KICBfdXBkYXRlQm91bmRzKCkgewogICAgbGV0IG1pblggPSB0aGlzLmNvb3Jkc1swXVswXSwKICAgICAgbWluWSA9IHRoaXMuY29vcmRzWzBdWzFdLAogICAgICBtYXhYID0gbWluWCwKICAgICAgbWF4WSA9IG1pblk7CiAgICBmb3IgKGxldCBpID0gMSwgaWkgPSB0aGlzLmNvb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IHggPSB0aGlzLmNvb3Jkc1tpXVswXSwKICAgICAgICB5ID0gdGhpcy5jb29yZHNbaV1bMV07CiAgICAgIG1pblggPSBtaW5YID4geCA/IHggOiBtaW5YOwogICAgICBtaW5ZID0gbWluWSA+IHkgPyB5IDogbWluWTsKICAgICAgbWF4WCA9IG1heFggPCB4ID8geCA6IG1heFg7CiAgICAgIG1heFkgPSBtYXhZIDwgeSA/IHkgOiBtYXhZOwogICAgfQogICAgdGhpcy5ib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07CiAgfQogIF9wYWNrRGF0YSgpIHsKICAgIGxldCBpLCBpaSwgaiwgamo7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvb3Jkc1BhY2tlZCA9IG5ldyBGbG9hdDMyQXJyYXkoY29vcmRzLmxlbmd0aCAqIDIpOwogICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29vcmRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgeHkgPSBjb29yZHNbaV07CiAgICAgIGNvb3Jkc1BhY2tlZFtqKytdID0geHlbMF07CiAgICAgIGNvb3Jkc1BhY2tlZFtqKytdID0geHlbMV07CiAgICB9CiAgICB0aGlzLmNvb3JkcyA9IGNvb3Jkc1BhY2tlZDsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3QgY29sb3JzUGFja2VkID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzLmxlbmd0aCAqIDMpOwogICAgZm9yIChpID0gMCwgaiA9IDAsIGlpID0gY29sb3JzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgYyA9IGNvbG9yc1tpXTsKICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzBdOwogICAgICBjb2xvcnNQYWNrZWRbaisrXSA9IGNbMV07CiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1syXTsKICAgIH0KICAgIHRoaXMuY29sb3JzID0gY29sb3JzUGFja2VkOwogICAgY29uc3QgZmlndXJlcyA9IHRoaXMuZmlndXJlczsKICAgIGZvciAoaSA9IDAsIGlpID0gZmlndXJlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGZpZ3VyZSA9IGZpZ3VyZXNbaV0sCiAgICAgICAgcHMgPSBmaWd1cmUuY29vcmRzLAogICAgICAgIGNzID0gZmlndXJlLmNvbG9yczsKICAgICAgZm9yIChqID0gMCwgamogPSBwcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgcHNbal0gKj0gMjsKICAgICAgICBjc1tqXSAqPSAzOw
20ogICAgICB9CiAgICB9CiAgfQogIGdldElSKCkgewogICAgY29uc3QgewogICAgICBib3VuZHMKICAgIH0gPSB0aGlzOwogICAgaWYgKGJvdW5kc1syXSAtIGJvdW5kc1swXSA9PT0gMCB8fCBib3VuZHNbM10gLSBib3VuZHNbMV0gPT09IDApIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIE1lc2hTaGFkaW5nIGJvdW5kczogWyR7Ym91bmRzfV0uYCk7CiAgICB9CiAgICByZXR1cm4gWyJNZXNoIiwgdGhpcy5zaGFkaW5nVHlwZSwgdGhpcy5jb29yZHMsIHRoaXMuY29sb3JzLCB0aGlzLmZpZ3VyZXMsIGJvdW5kcywgdGhpcy5iYm94LCB0aGlzLmJhY2tncm91bmRdOwogIH0KfQpjbGFzcyBEdW1teVNoYWRpbmcgZXh0ZW5kcyBCYXNlU2hhZGluZyB7CiAgZ2V0SVIoKSB7CiAgICByZXR1cm4gWyJEdW1teSJdOwogIH0KfQpmdW5jdGlvbiBnZXRUaWxpbmdQYXR0ZXJuSVIob3BlcmF0b3JMaXN0LCBkaWN0LCBjb2xvcikgewogIGNvbnN0IG1hdHJpeCA9IGxvb2t1cE1hdHJpeChkaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgSURFTlRJVFlfTUFUUklYKTsKICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChkaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogIGlmICghYmJveCB8fCBiYm94WzJdIC0gYmJveFswXSA9PT0gMCB8fCBiYm94WzNdIC0gYmJveFsxXSA9PT0gMCkgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvQkJveCBhcnJheS5gKTsKICB9CiAgY29uc3QgeHN0ZXAgPSBkaWN0LmdldCgiWFN0ZXAiKTsKICBpZiAodHlwZW9mIHhzdGVwICE9PSAibnVtYmVyIikgewogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGdldFRpbGluZ1BhdHRlcm5JUiAvWFN0ZXAgdmFsdWUuYCk7CiAgfQogIGNvbnN0IHlzdGVwID0gZGljdC5nZXQoIllTdGVwIik7CiAgaWYgKHR5cGVvZiB5c3RlcCAhPT0gIm51bWJlciIpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL1lTdGVwIHZhbHVlLmApOwogIH0KICBjb25zdCBwYWludFR5cGUgPSBkaWN0LmdldCgiUGFpbnRUeXBlIik7CiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhaW50VHlwZSkpIHsKICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL1BhaW50VHlwZSB2YWx1ZS5gKTsKICB9CiAgY29uc3QgdGlsaW5nVHlwZSA9IGRpY3QuZ2V0KCJUaWxpbmdUeXBlIik7CiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHRpbGluZ1R5cGUpKSB7CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZ2V0VGlsaW5nUGF0dGVybklSIC9UaWxpbmdUeXBlIHZhbHVlLmApOwogIH0KICByZXR1cm4gWyJUaWxpbmdQYXR0ZXJuIiwgY29sb3IsIG9wZXJhdG9yTGlzdCwgbWF0cml4LCBiYm94LCB4c3RlcCwgeXN0ZXAsIHBhaW50VHlwZSwgdGlsaW5nVHlwZV07Cn0KCjsvLyAuL3NyYy9jb3JlL2NhbGlicmlfZmFjdG9ycy5qcwpjb25zdCBDYWxpYnJpQm9sZEZhY3RvcnMgPSBbMS4zODc3LCAxLCAxLCAxLCAwLjk3ODAxLCAwLjkyNDgyLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjgxOTg4LCAwLjk3NTY2LCAwLjk4MTUyLCAwLjkzNTQ4LCAwLjkzNTQ4LCAxLjI3OTgsIDAuODUyODQsIDAuOTI3OTQsIDEsIDAuOTYxMzQsIDEuNTQ2NTcsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuODI4NDUsIDAuODI4NDUsIDAuODUyODQsIDAuODUyODQsIDAuODUyODQsIDAuNzU4NTksIDAuOTIxMzgsIDAuODM5MDgsIDAuNzc2MiwgMC43MzI5MywgMC44NzI4OSwgMC43MzEzMywgMC43NTE0LCAwLjgxOTIxLCAwLjg3MzU2LCAwLjk1OTU4LCAwLjU5NTI2LCAwLjc1NzI3LCAwLjY5MjI1LCAxLjA0OTI0LCAwLjkxMjEsIDAuODY5NDMsIDAuNzk3OTUsIDAuODgxOTgsIDAuNzc5NTgsIDAuNzA4NjQsIDAuODEwNTUsIDAuOTAzOTksIDAuODg2NTMsIDAuOTYwMTcsIDAuODI1NzcsIDAuNzc4OTIsIDAuNzgyNTcsIDAuOTc1MDcsIDEuNTQ2NTcsIDAuOTc1MDcsIDAuODUyODQsIDAuODk1NTIsIDAuOTAxNzYsIDAuODg3NjIsIDAuODc4NSwgMC43NTI0MSwgMC44Nzg1LCAwLjkwNTE4LCAwLjk1MDE1LCAwLjc3NjE4LCAwLjg3ODUsIDAuODg0MDEsIDAuOTE5MTYsIDAuODYzMDQsIDAuODg0MDEsIDAuOTE0ODgsIDAuODc4NSwgMC44ODAxLCAwLjg3ODUsIDAuODc4NSwgMC45MTM0MywgMC43MTczLCAxLjA0MTA2LCAwLjg3ODUsIDAuODUwNzUsIDAuOTU3OTQsIDAuODI2MTYsIDAuODUxNjIsIDAuNzk0OTIsIDAuODgzMzEsIDEuNjk4MDgsIDAuODgzMzEsIDAuODUyODQsIDAuOTc4MDEsIDAuODk1NTIsIDAuOTExMzMsIDAuODk1NTIsIDAuOTExMzMsIDEuNzgwMSwgMC44OTU1MiwgMS4yNDQ4NywgMS4xMzI1NCwgMS4xMjQwMSwgMC45NjgzOSwgMC44NTI4NCwgMC42ODc4NywgMC43MDY0NSwgMC44NTU5MiwgMC45MDc0NywgMS4wMTQ2NiwgMS4wMDg4LCAwLjkwMzIzLCAxLCAxLjA3NDYzLCAxLCAwLjkxMDU2LCAwLjc1ODA2LCAxLjE5MTE4LCAwLjk2ODM5LCAwLjc4ODY0LCAwLjgyODQ1LCAwLjg0MTMzLCAwLjc1ODU5LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjgzOTA4LCAwLjc3NTM5LCAwLjczMjkzLCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjczMTMzLCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjk1OTU4LCAwLjg4NTA2LCAwLjkxMjEsIDAuODY5NDMsIDAuODY5NDMsIDAuODY5NDMsIDAuODY5NDMsIDAuODY5NDMsIDAuODUyODQsIDAuODc1MDgsIDAuOTAzOTksIDAuOTAzOTksIDAuOTAzOTksIDAuOTAzOTksIDAuNzc4OTIsIDAuNzk3OTUsIDAuOTA4MDcsIDAuODg3NjIsIDAuODg3NjIsIDAuODg3NjIsIDAuODg3NjIsIDAuODg3NjIsIDAuODg3NjIsIDAuODcxNSwgMC43NTI0MSwgMC45MDUxOCwgMC45MDUxOCwgMC45MDUxOCwgMC45MDUxOCwgMC44ODQwMSwgMC44ODQwMSwgMC44ODQwMSwgMC44ODQwMSwgMC44Nzg1LCAwLjg3ODUsIDAuODgwMSwgMC44ODAxLCAwLjg4MDEsIDAuODgwMSwgMC44ODAxLCAwLjkwNzQ3LCAwLjg5MDQ5LCAwLjg3ODUsIDAuODc4NSwgMC44Nzg1LCAwLjg3ODUsIDAuODUxNjIsIDAuODc4NSwgMC44NTE2MiwgMC44MzkwOCwgMC44ODc2MiwgMC44MzkwOCwgMC44ODc2MiwgMC44MzkwOCwgMC44ODc2MiwgMC43MzI5MywgMC43NTI0MSwgMC43MzI5MywgMC43NTI0MSwgMC43MzI5MywgMC43NTI0MSwgMC43MzI5MywgMC43NTI0MSwgMC44NzI4OSwgMC44MzAxNiwgMC44ODUwNiwgMC45MzEyNSwgMC43MzEzMywgMC45MDUxOCwgMC43MzEzMywgMC45MDUxOCwgMC43MzEzMywgMC45MDUxOCwgMC43MzEzMywgMC45MDUxOCwgMC43MzEzMywgMC45MDUxOCwgMC44MTkyMSwgMC43NzYxOCwgMC44MTkyMSwgMC43NzYxOCwgMC44MTkyMSwgMC43NzYxOCwgMSwgMSwgMC44NzM1NiwgMC44Nzg1LCAwLjkxMDc1LCAwLjg5NjA4LCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjc2MjI5LCAwLjkwMTY3LCAwLjU5NTI2LCAwLjkxOTE2LCAxLCAxLCAwLjg2MzA0LCAwLjY5MjI1LCAwLjg4NDAxLCAxLCAxLCAwLjcwNDI0LCAwLjc5NDY4LCAwLjkxOTI2LCAwLjg4MTc1LCAwLjcwODIzLCAwLjk0OTAzLCAwLjkxMjEsIDAuODc4NSwgMSwgMSwgMC45MTIxLCAwLjg3ODUsIDAuODc4MDIsIDAuODg2NTYsIDAuODc4NSwgMC44Njk0MywgMC44ODAxLCAwLjg2OTQzLCAwLjg4MDEsIDAuODY5NDMsIDAuODgwMSwgMC44NzQwMiwgMC44OTI5MSwgMC43Nzk1OCwgMC45MTM0MywgMSwgMSwgMC43Nzk1OCwgMC45MTM0MywgMC43MDg2NCwgMC43MTczLCAwLjcwODY0LCAwLjcxNzMsIDAuNzA4NjQsIDAuNzE3MywgMC43MDg2NCwgMC43MTczLCAxLCAxLCAwLjgxMDU1LCAwLjc1ODQxLCAwLjgxMDU1LCAxLjA2NDUyLCAwLjkwMzk5LCAwLjg3ODUsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjk2MDE3LCAwLjk1Nzk0LCAwLjc3ODkyLCAwLjg1MTYyLCAwLjc3ODkyLCAwLjc4MjU3LCAwLjc5NDkyLCAwLjc4MjU3LCAwLjc5NDkyLCAwLjc4MjU3LCAwLjc5NDkyLCAwLjkyOTcsIDAuNTY4OTIsIDAuODM5MDgsIDAuODg3NjIsIDAuNzc1MzksIDAuODcxNSwgMC44NzUwOCwgMC44OTA0OSwgMSwgMSwgMC44MTA1NSwgMS4wNDEwNiwgMS4yMDUyOCwgMS4yMDUyOCwgMSwgMS4xNTU0MywgMC43MDY3NCwgMC45ODM4NywgMC45NDcyMSwgMS4zMzQzMSwgMS40NTg5NCwgMC45NTE2MSwgMS4wNjMwMywgMC44MzkwOCwgMC44MDM1MiwgMC41NzE4NCwgMC42OTY1LCAwLjU2Mjg5LCAwLjgyMDAxLCAwLjU2MDI5LCAwLjgxMjM1LCAxLjAyOTg4LCAwLjgzOTA4LCAwLjc3NjIsIDAuNjgxNTYsIDAuODAzNjcsIDAuNzMxMzMsIDAuNzgyNTcsIDAuODczNTYsIDAuODY5NDMsIDAuOTU5NTgsIDAuNzU3MjcsIDAuODkwMTksIDEuMDQ5MjQsIDAuOTEyMSwgMC43NjQ4LCAwLjg2OTQzLCAwLjg3MzU2LCAwLjc5Nzk1LCAwLjc4Mjc1LCAwLjgxMDU1LCAwLjc3ODkyLCAwLjk3NjIsIDAuODI1NzcsIDAuOTk4MTksIDAuODQ4OTYsIDAuOTU5NTgsIDAuNzc4OTIsIDAuOTYxMDgsIDEuMDE0MDcsIDAuODkwNDksIDEuMDI5ODgsIDAuOTQyMTEsIDAuOTYxMDgsIDAuODkzNiwgMC44NDAyMSwgMC44Nzg0MiwgMC45NjM5OSwgMC43OTEwOSwgMC44OTA0OSwgMS4wMDgxMywgMS4wMjk4OCwgMC44NjA3NywgMC44NzQ0NSwgMC45MjA5OSwgMC44NDcyMywgMC44NjUxMywgMC44ODAxLCAwLjc1NjM4LCAwLjg1NzE0LCAwLjc4MjE2LCAwLjc5NTg2LCAwLjg3OTY1LCAwLjk0MjExLCAwLjk3NzQ3LCAwLjc4Mjg3LCAwLjk3OTI2LCAwLjg0OTcxLCAxLjAyOTg4LCAwLjk0MjExLCAwLjg4MDEsIDAuOTQyMTEsIDAuODQ5NzEsIDAuNzMxMzMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTAyNjQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA1MTgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA1NDgsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTYwMTcsIDAuOTU3OTQsIDAuOTYwMTcsIDAuOTU3OTQsIDAuOTYwMTcsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODUxNjIsIDEsIDEsIDAuODk1NTIsIDAuOTA1MjcsIDEsIDAuOTAzNjMsIDAuOTI3OTQsIDAuOTI3OTQsIDAuOTI3OTQsIDAuOTI3OTQsIDAuODcwMTIsIDAuODcwMTIsIDAuODcwMTIsIDAuODk1NTIsIDAuODk1NTIsIDEuNDIyNTksIDAuNzExND
20MsIDEuMDYxNTIsIDEsIDEsIDEuMDMzNzIsIDEuMDMzNzIsIDAuOTcxNzEsIDEuNDk1NiwgMi4yODA3LCAwLjkzODM1LCAwLjgzNDA2LCAwLjkxMTMzLCAwLjg0MTA3LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcyMDIxLCAxLCAxLjIzMTA4LCAwLjgzNDg5LCAwLjg4NTI1LCAwLjg4NTI1LCAwLjgxNDk5LCAwLjkwNTI3LCAxLjgxMDU1LCAwLjkwNTI3LCAxLjgxMDU1LCAxLjMxMDA2LCAxLjUzNzExLCAwLjk0NDM0LCAxLjA4Njk2LCAxLCAwLjk1MDE4LCAwLjc3MTkyLCAwLjg1Mjg0LCAwLjkwNzQ3LCAxLjE3NTM0LCAwLjY5ODI1LCAwLjk3MTYsIDEuMzcwNzcsIDAuOTA3NDcsIDAuOTA3NDcsIDAuODUzNTYsIDAuOTA3NDcsIDAuOTA3NDcsIDEuNDQ5NDcsIDAuODUyODQsIDAuODk0MSwgMC44OTQxLCAwLjcwNTcyLCAwLjgsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMDgwMDQsIDAuOTEwMjcsIDEsIDEsIDEsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA3MjcsIDAuOTA3MjcsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBDYWxpYnJpQm9sZE1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9Owpjb25zdCBDYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnMgPSBbMS4zODc3LCAxLCAxLCAxLCAwLjk3ODAxLCAwLjkyNDgyLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjgxOTg4LCAwLjk3NTY2LCAwLjk4MTUyLCAwLjkzNTQ4LCAwLjkzNTQ4LCAxLjI3OTgsIDAuODUyODQsIDAuOTI3OTQsIDEsIDAuOTYxMzQsIDEuNTYyMzksIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuODI4NDUsIDAuODI4NDUsIDAuODUyODQsIDAuODUyODQsIDAuODUyODQsIDAuNzU4NTksIDAuOTIxMzgsIDAuODM5MDgsIDAuNzc2MiwgMC43MTgwNSwgMC44NzI4OSwgMC43MzEzMywgMC43NTE0LCAwLjgxOTIxLCAwLjg3MzU2LCAwLjk1OTU4LCAwLjU5NTI2LCAwLjc1NzI3LCAwLjY5MjI1LCAxLjA0OTI0LCAwLjkwODcyLCAwLjg1OTM4LCAwLjc5Nzk1LCAwLjg3MDY4LCAwLjc3OTU4LCAwLjY5NzY2LCAwLjgxMDU1LCAwLjkwMzk5LCAwLjg4NjUzLCAwLjk2MDY4LCAwLjgyNTc3LCAwLjc3ODkyLCAwLjc4MjU3LCAwLjk3NTA3LCAxLjUyOSwgMC45NzUwNywgMC44NTI4NCwgMC44OTU1MiwgMC45MDE3NiwgMC45NDkwOCwgMC44NjQxMSwgMC43NDAxMiwgMC44NjQxMSwgMC44ODMyMywgMC45NTAxNSwgMC44NjQxMSwgMC44NjMzMSwgMC44ODQwMSwgMC45MTkxNiwgMC44NjMwNCwgMC44ODQwMSwgMC45MDM5LCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2NDExLCAwLjg2NDExLCAwLjkwNDY0LCAwLjcwODUyLCAxLjA0MTA2LCAwLjg2MzMxLCAwLjg0MzcyLCAwLjk1Nzk0LCAwLjgyNjE2LCAwLjg0NTQ4LCAwLjc5NDkyLCAwLjg4MzMxLCAxLjY5ODA4LCAwLjg4MzMxLCAwLjg1Mjg0LCAwLjk3ODAxLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjg5NTUyLCAwLjkxMTMzLCAxLjc4MDEsIDAuODk1NTIsIDEuMjQ0ODcsIDEuMTMyNTQsIDEuMTkxMjksIDAuOTY4MzksIDAuODUyODQsIDAuNjg3ODcsIDAuNzA2NDUsI
20DAuODU1OTIsIDAuOTA3NDcsIDEuMDE0NjYsIDEuMDA4OCwgMC45MDMyMywgMSwgMS4wNzQ2MywgMSwgMC45MTA1NiwgMC43NTgwNiwgMS4xOTExOCwgMC45NjgzOSwgMC43ODg2NCwgMC44Mjg0NSwgMC44NDEzMywgMC43NTg1OSwgMC44MzkwOCwgMC44MzkwOCwgMC44MzkwOCwgMC44MzkwOCwgMC44MzkwOCwgMC44MzkwOCwgMC43NzUzOSwgMC43MTgwNSwgMC43MzEzMywgMC43MzEzMywgMC43MzEzMywgMC43MzEzMywgMC45NTk1OCwgMC45NTk1OCwgMC45NTk1OCwgMC45NTk1OCwgMC44ODUwNiwgMC45MDg3MiwgMC44NTkzOCwgMC44NTkzOCwgMC44NTkzOCwgMC44NTkzOCwgMC44NTkzOCwgMC44NTI4NCwgMC44NzA2OCwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC43Nzg5MiwgMC43OTc5NSwgMC45MDgwNywgMC45NDkwOCwgMC45NDkwOCwgMC45NDkwOCwgMC45NDkwOCwgMC45NDkwOCwgMC45NDkwOCwgMC44NTg4NywgMC43NDAxMiwgMC44ODMyMywgMC44ODMyMywgMC44ODMyMywgMC44ODMyMywgMC44ODQwMSwgMC44ODQwMSwgMC44ODQwMSwgMC44ODQwMSwgMC44Nzg1LCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2MzMxLCAwLjkwNzQ3LCAwLjg5MDQ5LCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg2MzMxLCAwLjg0NTQ4LCAwLjg2NDExLCAwLjg0NTQ4LCAwLjgzOTA4LCAwLjk0OTA4LCAwLjgzOTA4LCAwLjk0OTA4LCAwLjgzOTA4LCAwLjk0OTA4LCAwLjcxODA1LCAwLjc0MDEyLCAwLjcxODA1LCAwLjc0MDEyLCAwLjcxODA1LCAwLjc0MDEyLCAwLjcxODA1LCAwLjc0MDEyLCAwLjg3Mjg5LCAwLjc5NTM4LCAwLjg4NTA2LCAwLjkyNzI2LCAwLjczMTMzLCAwLjg4MzIzLCAwLjczMTMzLCAwLjg4MzIzLCAwLjczMTMzLCAwLjg4MzIzLCAwLjczMTMzLCAwLjg4MzIzLCAwLjczMTMzLCAwLjg4MzIzLCAwLjgxOTIxLCAwLjg2NDExLCAwLjgxOTIxLCAwLjg2NDExLCAwLjgxOTIxLCAwLjg2NDExLCAxLCAxLCAwLjg3MzU2LCAwLjg2MzMxLCAwLjkxMDc1LCAwLjg3NzcsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuNzY0NjcsIDAuOTAxNjcsIDAuNTk1MjYsIDAuOTE5MTYsIDEsIDEsIDAuODYzMDQsIDAuNjkyMjUsIDAuODg0MDEsIDEsIDEsIDAuNzA0MjQsIDAuNzczMTIsIDAuOTE5MjYsIDAuODgxNzUsIDAuNzA4MjMsIDAuOTQ5MDMsIDAuOTA4NzIsIDAuODYzMzEsIDEsIDEsIDAuOTA4NzIsIDAuODYzMzEsIDAuODY5MDYsIDAuODgxMTYsIDAuODYzMzEsIDAuODU5MzgsIDAuODYzMzEsIDAuODU5MzgsIDAuODYzMzEsIDAuODU5MzgsIDAuODYzMzEsIDAuODc0MDIsIDAuODY1NDksIDAuNzc5NTgsIDAuOTA0NjQsIDEsIDEsIDAuNzc5NTgsIDAuOTA0NjQsIDAuNjk3NjYsIDAuNzA4NTIsIDAuNjk3NjYsIDAuNzA4NTIsIDAuNjk3NjYsIDAuNzA4NTIsIDAuNjk3NjYsIDAuNzA4NTIsIDEsIDEsIDAuODEwNTUsIDAuNzU4NDEsIDAuODEwNTUsIDEuMDY0NTIsIDAuOTAzOTksIDAuODYzMzEsIDAuOTAzOTksIDAuODYzMzEsIDAuOTAzOTksIDAuODYzMzEsIDAuOTAzOTksIDAuODYzMzEsIDAuOTAzOTksIDAuODYzMzEsIDAuOTAzOTksIDAuODYzMzEsIDAuOTYwNjgsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODQ1NDgsIDAuNzc4OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuOTI5NywgMC41Njg5MiwgMC44MzkwOCwgMC45NDkwOCwgMC43NzUzOSwgMC44NTg4NywgMC44NzA2OCwgMC44OTA0OSwgMSwgMSwgMC44MTA1NSwgMS4wNDEwNiwgMS4yMDUyOCwgMS4yMDUyOCwgMSwgMS4xNTU0MywgMC43MDA4OCwgMC45ODM4NywgMC45NDcyMSwgMS4zMzQzMSwgMS40NTg5NCwgMC45NTE2MSwgMS40ODM4NywgMC44MzkwOCwgMC44MDM1MiwgMC41NzExOCwgMC42OTY1LCAwLjU2MzQ3LCAwLjc5MTc5LCAwLjU1ODUzLCAwLjgwMzQ2LCAxLjAyOTg4LCAwLjgzOTA4LCAwLjc3NjIsIDAuNjcxNzQsIDAuODYwMzYsIDAuNzMxMzMsIDAuNzgyNTcsIDAuODczNTYsIDAuODY0NDEsIDAuOTU5NTgsIDAuNzU3MjcsIDAuODkwMTksIDEuMDQ5MjQsIDAuOTA4NzIsIDAuNzQ4ODksIDAuODU5MzgsIDAuODc4OTEsIDAuNzk3OTUsIDAuNzk1NywgMC44MTA1NSwgMC43Nzg5MiwgMC45NzQ0NywgMC44MjU3NywgMC45NzQ2NiwgMC44NzE3OSwgMC45NTk1OCwgMC43Nzg5MiwgMC45NDI1MiwgMC45NTYxMiwgMC44NzUzLCAxLjAyOTg4LCAwLjkyNzMzLCAwLjk0MjUyLCAwLjg3NDExLCAwLjg0MDIxLCAwLjg3MjgsIDAuOTU2MTIsIDAuNzQwODEsIDAuODc1MywgMS4wMjE4OSwgMS4wMjk4OCwgMC44NDgxNCwgMC44NzQ0NSwgMC45MTgyMiwgMC44NDcyMywgMC44NTY2OCwgMC44NjMzMSwgMC44MTM0NCwgMC44NzU4MSwgMC43NjQyMiwgMC44MjA0NiwgMC45NjA1NywgMC45MjczMywgMC45OTM3NSwgMC43ODAyMiwgMC45NTQ1MiwgMC44NjAxNSwgMS4wMjk4OCwgMC45MjczMywgMC44NjMzMSwgMC45MjczMywgMC44NjAxNSwgMC43MzEzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDYzMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44ODMyMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NTE3NCwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjA2OCwgMC45NTc5NCwgMC45NjA2OCwgMC45NTc5NCwgMC45NjA2OCwgMC45NTc5NCwgMC43Nzg5MiwgMC44NDU0OCwgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDM2MywgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC44OTgwNywgMC44NzAxMiwgMC44NzAxMiwgMC44NzAxMiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC43MTA5NCwgMS4wNjE1MiwgMSwgMSwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NzE3MSwgMS40OTU2LCAyLjI4MDcsIDAuOTI5NzIsIDAuODM0MDYsIDAuOTExMzMsIDAuODMzMjYsIDAuOTExMzMsIDEsIDEsIDEsIDAuNzIwMjEsIDEsIDEuMjMxMDgsIDAuODM0ODksIDAuODg1MjUsIDAuODg1MjUsIDAuODE0OTksIDAuOTA2MTYsIDEuODEwNTUsIDAuOTA1MjcsIDEuODEwNTUsIDEuMzEwNywgMS41MzcxMSwgMC45NDQzNCwgMS4wODY5NiwgMSwgMC45NTAxOCwgMC43NzE5MiwgMC44NTI4NCwgMC45MDc0NywgMS4xNzUzNCwgMC42OTgyNSwgMC45NzE2LCAxLjM3MDc3LCAwLjkwNzQ3LCAwLjkwNzQ3LCAwLjg1MzU2LCAwLjkwNzQ3LCAwLjkwNzQ3LCAxLjQ0OTQ3LCAwLjg1Mjg0LCAwLjg5NDEsIDAuODk0MSwgMC43MDU3MiwgMC44LCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAwLjcwNTcyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjA4MDA0LCAwLjkxMDI3LCAxLCAxLCAxLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjkwNzI3LCAwLjkwNzI3LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgQ2FsaWJyaUJvbGRJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMjIwNywKICBsaW5lR2FwOiAwLjIyMDcKfTsKY29uc3QgQ2FsaWJyaUl0YWxpY0ZhY3RvcnMgPSBbMS4zODc3LCAxLCAxLCAxLCAxLjE3MjIzLCAxLjEyOTMsIDAuODk1NTIsIDAuOTExMzMsIDAuODAzOTUsIDEuMDIyNjksIDEuMTU2MDEsIDAuOTEwNTYsIDAuOTEwNTYsIDEuMjc5OCwgMC44NTI4NCwgMC44OTgwNywgMSwgMC45MDg2MSwgMS4zOTU0MywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45NjMwOSwgMC45NjMwOSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC44MzMxOSwgMC44ODA3MSwgMC44Njc1LCAwLjgxNTUyLCAwLjcyMzQ2LCAwLjg1MTkzLCAwLjczMjA2LCAwLjc1MjIsIDAuODExMDUsIDAuODYyNzUsIDAuOTA2ODUsIDAuNjM3NywgMC43Nzg5MiwgMC43NTU5MywgMS4wMjYzOCwgMC44OTI0OSwgMC44NDExOCwgMC43NzQ1MiwgMC44NTM3NCwgMC43NTE4NiwgMC42Nzc4OSwgMC43OTc3NiwgMC44ODg0NCwgMC44NTA2NiwgMC45NDMwOSwgMC43NzgxOCwgMC43MzA2LCAwLjc2NjU5LCAxLjEwMzY5LCAxLjM4MzEzLCAxLjEwMzY5LCAxLjA2MTM5LCAwLjg5NTUyLCAwLjg3MzksIDAuOTI0NSwgMC45MjQ1LCAwLjgzMjAzLCAwLjkyNDUsIDAuODU4NjUsIDEuMDk4NDIsIDAuOTI0NSwgMC45MjQ1LCAxLjAzMjk3LCAxLjA3NjkyLCAwLjkwOTE4LCAxLjAzMjk3LCAwLjk0OTU5LCAwLjkyNDUsIDAuOTIyNzQsIDAuOTI0NSwgMC45MjQ1LCAxLjAyOTMzLCAwLjc3ODMyLCAxLjIwNTYyLCAwLjkyNDUsIDAuODkxNiwgMC45ODk4NiwgMC44NjYyMSwgMC44OTQ1MywgMC43OTAwNCwgMC45NDE1MiwgMS43NzI1NiwgMC45NDE1MiwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS45MTcyOSwgMC44OTU1MiwgMS4xNzg4OSwgMS4xMzI1NCwgMS4xNjM1OSwgMC45MjA5OCwgMC44NTI4NCwgMC42ODc4NywgMC43MTM1MywgMC44NDczNywgMC45MDc0NywgMS4wMDg4LCAxLjAwNDQsIDAuODc2ODMsIDEsIDEuMDkwOTEsIDEsIDAuOTIyMjksIDAuNzM5LCAxLjE1NjQyLCAwLjkyMDk4LCAwLjc2Mjg4LCAwLjgwNTA0LCAwLjgwOTcyLCAwLjc1ODU5LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjc2MzE4LCAwLjcyMzQ2LCAwLjczMjA2LCAwLjczMjA2LCAwLjczMjA2LCAwLjczMjA2LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjg2NDc3LCAwLjg5MjQ5LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg1Mjg0LCAwLjg0NTU3LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjczMDYsIDAuNzc0NTIsIDAuODYzMzEsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuODQ4N
20DMsIDAuODMyMDMsIDAuODU4NjUsIDAuODU4NjUsIDAuODU4NjUsIDAuODU4NjUsIDAuODI2MDEsIDAuODI2MDEsIDAuODI2MDEsIDAuODI2MDEsIDAuOTQ0NjksIDAuOTI0NSwgMC45MjI3NCwgMC45MjI3NCwgMC45MjI3NCwgMC45MjI3NCwgMC45MjI3NCwgMC45MDc0NywgMC44NjY1MSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjg5NDUzLCAwLjkyNDUsIDAuODk0NTMsIDAuODY3NSwgMC45MjQ1LCAwLjg2NzUsIDAuOTI0NSwgMC44Njc1LCAwLjkyNDUsIDAuNzIzNDYsIDAuODMyMDMsIDAuNzIzNDYsIDAuODMyMDMsIDAuNzIzNDYsIDAuODMyMDMsIDAuNzIzNDYsIDAuODMyMDMsIDAuODUxOTMsIDAuODg3NSwgMC44NjQ3NywgMC45OTAzNCwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC44MTEwNSwgMC45MjQ1LCAwLjgxMTA1LCAwLjkyNDUsIDAuODExMDUsIDAuOTI0NSwgMSwgMSwgMC44NjI3NSwgMC45MjQ1LCAwLjkwODcyLCAwLjkzNTkxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAxLjAzMjk3LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjc3ODk2LCAxLjA1NjExLCAwLjYzNzcsIDEuMDc2OTIsIDEsIDEsIDAuOTA5MTgsIDAuNzU1OTMsIDEuMDMyOTcsIDEsIDEsIDAuNzYwMzIsIDAuOTM3NSwgMC45ODE1NiwgMC45MzQwNywgMC43NzI2MSwgMS4xMTQyOSwgMC44OTI0OSwgMC45MjQ1LCAxLCAxLCAwLjg5MjQ5LCAwLjkyNDUsIDAuOTI1MzQsIDAuODY2OTgsIDAuOTI0NSwgMC44NDExOCwgMC45MjI3NCwgMC44NDExOCwgMC45MjI3NCwgMC44NDExOCwgMC45MjI3NCwgMC44NjY3LCAwLjg2MjkxLCAwLjc1MTg2LCAxLjAyOTMzLCAxLCAxLCAwLjc1MTg2LCAxLjAyOTMzLCAwLjY3Nzg5LCAwLjc3ODMyLCAwLjY3Nzg5LCAwLjc3ODMyLCAwLjY3Nzg5LCAwLjc3ODMyLCAwLjY3Nzg5LCAwLjc3ODMyLCAxLCAxLCAwLjc5Nzc2LCAwLjk3NjU1LCAwLjc5Nzc2LCAxLjIzMDIzLCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjk0MzA5LCAwLjk4OTg2LCAwLjczMDYsIDAuODk0NTMsIDAuNzMwNiwgMC43NjY1OSwgMC43OTAwNCwgMC43NjY1OSwgMC43OTAwNCwgMC43NjY1OSwgMC43OTAwNCwgMS4wOTIzMSwgMC41NDg3MywgMC44Njc1LCAwLjkyNDUsIDAuNzYzMTgsIDAuODQ4NDMsIDAuODQ1NTcsIDAuODY2NTEsIDEsIDEsIDAuNzk3NzYsIDEuMjA1NjIsIDEuMTg2MjIsIDEuMTg2MjIsIDEsIDEuMTQzNywgMC42NzAwOSwgMC45NjMzNCwgMC45MzY5NSwgMS4zNTE5MSwgMS40MDkwOSwgMC45NTE2MSwgMS40ODM4NywgMC44Njc1LCAwLjkwODYxLCAwLjYxOTIsIDAuNzM2MywgMC42NDgyNCwgMC44MjQxMSwgMC41NjMyMSwgMC44NTY5NiwgMS4yMzUxNiwgMC44Njc1LCAwLjgxNTUyLCAwLjcyODYsIDAuODQxMzQsIDAuNzMyMDYsIDAuNzY2NTksIDAuODYyNzUsIDAuODQzNjksIDAuOTA2ODUsIDAuNzc4OTIsIDAuODU4NzEsIDEuMDI2MzgsIDAuODkyNDksIDAuNzU4MjgsIDAuODQxMTgsIDAuODU5ODQsIDAuNzc0NTIsIDAuNzY0NjYsIDAuNzk3NzYsIDAuNzMwNiwgMC45MDc4MiwgMC43NzgxOCwgMC45MDMsIDAuODcyOTEsIDAuOTA2ODUsIDAuNzMwNiwgMC45OTA1OCwgMS4wMzY2NywgMC45NDYzNSwgMS4yMzUxNiwgMC45ODQ5LCAwLjk5MDU4LCAwLjkyMzkzLCAwLjg5MTYsIDAuOTQyLCAxLjAzNjY3LCAwLjc1MDI2LCAwLjk0NjM1LCAxLjAyOTcsIDEuMjM1MTYsIDAuOTA5MTgsIDAuOTQwNDgsIDAuOTgyMTcsIDAuODk3NDYsIDAuODQxNTMsIDAuOTIyNzQsIDAuODI1MDcsIDAuODg4MzIsIDAuODQ0MzgsIDAuODgxNzgsIDEuMDM1MjUsIDAuOTg0OSwgMS4wMDIyNSwgMC43ODA4NiwgMC45NzI0OCwgMC44OTQwNCwgMS4yMzUxNiwgMC45ODQ5LCAwLjkyMjc0LCAwLjk4NDksIDAuODk0MDQsIDAuNzMyMDYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODk2OTMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODU4NjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA5MzMsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQzMDksIDAuOTg5ODYsIDAuOTQzMDksIDAuOTg5ODYsIDAuOTQzMDksIDAuOTg5ODYsIDAuNzMwNiwgMC44OTQ1MywgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDE4NiwgMS4xMjMwOCwgMS4xMjMwOCwgMS4xMjMwOCwgMS4xMjMwOCwgMS4yNTY2LCAxLjI1NjYsIDEuMjU2NiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC42ODk5NCwgMS4wMzgwOSwgMSwgMSwgMS4wMTc2LCAxLjAxNzYsIDEuMTE1MjMsIDEuNDk1NiwgMi4wMTQ2MiwgMC45Nzg1OCwgMC44MjYxNiwgMC45MTEzMywgMC44MzQzNywgMC45MTEzMywgMSwgMSwgMSwgMC43MDUwOCwgMSwgMS4yMzEwOCwgMC43OTgwMSwgMC44NDQyNiwgMC44NDQyNiwgMC43NzQsIDAuOTA1NzIsIDEuODEwNTUsIDAuOTA3NDksIDEuODEwNTUsIDEuMjg4MDksIDEuNTU0NjksIDAuOTQ0MzQsIDEuMDc4MDYsIDEsIDAuOTcwOTQsIDAuNzU4OSwgMC44NTI4NCwgMC45MDc0NywgMS4xOTY1OCwgMC42OTgyNSwgMC45NzYyMiwgMS4zMzUxMiwgMC45MDc0NywgMC45MDc0NywgMC44NTI4NCwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wMzM2LCAwLjkxMDI3LCAxLCAxLCAxLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1ODU5LCAxLjA1ODU5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgQ2FsaWJyaUl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9Owpjb25zdCBDYWxpYnJpUmVndWxhckZhY3RvcnMgPSBbMS4zODc3LCAxLCAxLCAxLCAxLjE3MjIzLCAxLjEyOTMsIDAuODk1NTIsIDAuOTExMzMsIDAuODAzOTUsIDEuMDIyNjksIDEuMTU2MDEsIDAuOTEwNTYsIDAuOTEwNTYsIDEuMjc5OCwgMC44NTI4NCwgMC44OTgwNywgMSwgMC45MDg2MSwgMS4zOTAxNiwgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45NjMwOSwgMC45NjMwOSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC44MzMxOSwgMC44ODA3MSwgMC44Njc1LCAwLjgxNTUyLCAwLjczODM0LCAwLjg1MTkzLCAwLjczMjA2LCAwLjc1MjIsIDAuODExMDUsIDAuODYyNzUsIDAuOTA2ODUsIDAuNjM3NywgMC43Nzg5MiwgMC43NTU5MywgMS4wMjYzOCwgMC44OTM4NSwgMC44NTEyMiwgMC43NzQ1MiwgMC44NjUwMywgMC43NTE4NiwgMC42ODg4NywgMC43OTc3NiwgMC44ODg0NCwgMC44NTA2NiwgMC45NDI1OCwgMC43NzgxOCwgMC43MzA2LCAwLjc2NjU5LCAxLjEwMzY5LCAxLjM5MDE2LCAxLjEwMzY5LCAxLjA2MTM5LCAwLjg5NTUyLCAwLjg3MzksIDAuODYxMjgsIDAuOTQ0NjksIDAuODQ1NywgMC45NDQ2OSwgMC44OTQ2NCwgMS4wOTg0MiwgMC44NDYzNiwgMC45NDQ2OSwgMS4wMzI5NywgMS4wNzY5MiwgMC45MDkxOCwgMS4wMzI5NywgMC45NTg5NywgMC45NDQ2OSwgMC45NDgyLCAwLjk0NDY5LCAwLjk0NDY5LCAxLjA0NjkyLCAwLjc4MjIzLCAxLjIwNTYyLCAwLjk0NDY5LCAwLjkwMzMyLCAwLjk4OTg2LCAwLjg2NjIxLCAwLjkwNTI3LCAwLjc5MDA0LCAwLjk0MTUyLCAxLjc3MjU2LCAwLjk0MTUyLCAwLjg1Mjg0LCAwLjk3ODAxLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjg5NTUyLCAwLjkxMTMzLCAxLjkxNzI5LCAwLjg5NTUyLCAxLjE3ODg5LCAxLjEzMjU0LCAxLjA4NzA3LCAwLjkyMDk4LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcxMzUzLCAwLjg0NzM3LCAwLjkwNzQ3LCAxLjAwODgsIDEuMDA0NCwgMC44NzY4MywgMSwgMS4wOTA5MSwgMSwgMC45MjIyOSwgMC43MzksIDEuMTU2NDIsIDAuOTIwOTgsIDAuNzYyODgsIDAuODA1MDQsIDAuODA5NzIsIDAuNzU4NTksIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuNzYzMTgsIDAuNzM4MzQsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuNzMyMDYsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuOTA2ODUsIDAuODY0NzcsIDAuODkzODUsIDAuODUxMjIsIDAuODUxMjIsIDAuODUxMjIsIDAuODUxMjIsIDAuODUxMjIsIDAuODUyODQsIDAuODUzMTEsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuODg4NDQsIDAuNzMwNiwgMC43NzQ1MiwgMC44NjMzMSwgMC44NjEyOCwgMC44NjEyOCwgMC44NjEyOCwgMC44NjEyOCwgMC44NjEyOCwgMC44NjEyOCwgMC44NjkzLCAwLjg0NTcsIDAuODk0NjQsIDAuODk0NjQsIDAuODk0NjQsIDAuODk0NjQsIDAuODI2MDEsIDAuODI2MDEsIDAuODI2MDEsIDAuODI2MDEsIDAuOTQ0NjksIDAuOTQ0NjksIDAuOTQ4MiwgMC45NDgyLCAwLjk0ODIsIDAuOTQ4MiwgMC45NDgyLCAwLjkwNzQ3LCAwLjg2NjUxLCAwLjk0NDY5LCAwLjk0NDY5LCAwLjk0NDY5LCAwLjk0NDY5LCAwLjkwNTI3LCAwLjk0NDY5LCAwLjkwNTI3LCAwLjg2NzUsIDAuODYxMjgsIDAuODY3NSwgMC44NjEyOCwgMC44Njc1LCAwLjg2MTI4LCAwLjczODM0LCAwLjg0NTcsIDAuNzM4MzQsIDAuODQ1NywgMC43MzgzNCwgMC44NDU3LCAwLjczODM0LCAwLjg0NTcsIDAuODUxOTMsIDAuOTI0NTQsIDAuODY0NzcsIDAuOTkyMSwgMC43MzIwNiwgMC44OTQ2NCwgMC43MzIwNiwgMC44OTQ2NCwgMC43MzIwNiwgMC44OTQ2NCwgMC43MzIwNiwgMC44OTQ2NCwgMC43MzIwNiwgMC44OTQ2NCwgMC44MTEwNSwgMC44NDYzNiwgMC44MTEwNSwgMC44NDYzNiwgMC44MTEwNSwgMC44NDYzNiwgMSwgMSwgMC44NjI3NSwgMC45NDQ2OSwgMC45MDg3MiwgMC45NTc4NiwgMC45MDY4NSwgMC44MjYwMSwgMC45MDY4NSwgMC44MjYwMSwgMC45MDY4NSwgMC44MjYwMSwgMC45MDY4NSwgMS4wMzI5NywgMC45MDY4NSwgMC44MjYwMSwgMC43Nz
20c0MSwgMS4wNTYxMSwgMC42Mzc3LCAxLjA3NjkyLCAxLCAxLCAwLjkwOTE4LCAwLjc1NTkzLCAxLjAzMjk3LCAxLCAxLCAwLjc2MDMyLCAwLjkwNDUyLCAwLjk4MTU2LCAxLjExODQyLCAwLjc3MjYxLCAxLjExNDI5LCAwLjg5Mzg1LCAwLjk0NDY5LCAxLCAxLCAwLjg5Mzg1LCAwLjk0NDY5LCAwLjk1ODc3LCAwLjg2OTAxLCAwLjk0NDY5LCAwLjg1MTIyLCAwLjk0ODIsIDAuODUxMjIsIDAuOTQ4MiwgMC44NTEyMiwgMC45NDgyLCAwLjg2NjcsIDAuOTAwMTYsIDAuNzUxODYsIDEuMDQ2OTIsIDEsIDEsIDAuNzUxODYsIDEuMDQ2OTIsIDAuNjg4ODcsIDAuNzgyMjMsIDAuNjg4ODcsIDAuNzgyMjMsIDAuNjg4ODcsIDAuNzgyMjMsIDAuNjg4ODcsIDAuNzgyMjMsIDEsIDEsIDAuNzk3NzYsIDAuOTIxODgsIDAuNzk3NzYsIDEuMjMwMjMsIDAuODg4NDQsIDAuOTQ0NjksIDAuODg4NDQsIDAuOTQ0NjksIDAuODg4NDQsIDAuOTQ0NjksIDAuODg4NDQsIDAuOTQ0NjksIDAuODg4NDQsIDAuOTQ0NjksIDAuODg4NDQsIDAuOTQ0NjksIDAuOTQyNTgsIDAuOTg5ODYsIDAuNzMwNiwgMC45MDUyNywgMC43MzA2LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAwLjc2NjU5LCAwLjc5MDA0LCAxLjA5MjMxLCAwLjU0ODczLCAwLjg2NzUsIDAuODYxMjgsIDAuNzYzMTgsIDAuODY5MywgMC44NTMxMSwgMC44NjY1MSwgMSwgMSwgMC43OTc3NiwgMS4yMDU2MiwgMS4xODYyMiwgMS4xODYyMiwgMSwgMS4xNDM3LCAwLjY3NzQyLCAwLjk2MzM0LCAwLjkzNjk1LCAxLjM1MTkxLCAxLjQwOTA5LCAwLjk1MTYxLCAxLjQ4Mzg3LCAwLjg2Njg2LCAwLjkwODYxLCAwLjYyMjY3LCAwLjc0MzU5LCAwLjY1NjQ5LCAwLjg1NDk4LCAwLjU2OTYzLCAwLjg4MjU0LCAxLjIzNTE2LCAwLjg2NzUsIDAuODE1NTIsIDAuNzU0NDMsIDAuODQ1MDMsIDAuNzMyMDYsIDAuNzY2NTksIDAuODYyNzUsIDAuODUxMjIsIDAuOTA2ODUsIDAuNzc4OTIsIDAuODU3NDYsIDEuMDI2MzgsIDAuODkzODUsIDAuNzU2NTcsIDAuODUxMjIsIDAuODYyNzUsIDAuNzc0NTIsIDAuNzQxNzEsIDAuNzk3NzYsIDAuNzMwNiwgMC45NTE2NSwgMC43NzgxOCwgMC44OTc3MiwgMC44ODgzMSwgMC45MDY4NSwgMC43MzA2LCAwLjk4MTQyLCAxLjAyMTkxLCAwLjk2NTc2LCAxLjIzNTE2LCAwLjk5MDE4LCAwLjk4MTQyLCAwLjkyMzYsIDAuODkyNTgsIDAuOTQwMzUsIDEuMDIxOTEsIDAuNzg4NDgsIDAuOTY1NzYsIDAuOTU2MSwgMS4yMzUxNiwgMC45MDkxOCwgMC45MjU3OCwgMC45NTQyNCwgMC44OTc0NiwgMC44Mzk2OSwgMC45NDgyLCAwLjgwMTEzLCAwLjg5NDQyLCAwLjg1MjA4LCAwLjg2MTU1LCAwLjk4MDIyLCAwLjk5MDE4LCAxLjAwNDUyLCAwLjgxMjA5LCAwLjk5MjQ3LCAwLjg5MTgxLCAxLjIzNTE2LCAwLjk5MDE4LCAwLjk0ODIsIDAuOTkwMTgsIDAuODkxODEsIDAuNzMyMDYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODg4NDQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODk0NjQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTY3NjYsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQyNTgsIDAuOTg5ODYsIDAuOTQyNTgsIDAuOTg5ODYsIDAuOTQyNTgsIDAuOTg5ODYsIDAuNzMwNiwgMC45MDUyNywgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDE4NiwgMS4xMjMwOCwgMS4xMjMwOCwgMS4xMjMwOCwgMS4xMjMwOCwgMS4yNTY2LCAxLjI1NjYsIDEuMjU2NiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC42OTA0MywgMS4wMzgwOSwgMSwgMSwgMS4wMTc2LCAxLjAxNzYsIDEuMTE1MjMsIDEuNDk1NiwgMi4wMTQ2MiwgMC45OTMzMSwgMC44MjYxNiwgMC45MTEzMywgMC44NDI4NiwgMC45MTEzMywgMSwgMSwgMSwgMC43MDUwOCwgMSwgMS4yMzEwOCwgMC43OTgwMSwgMC44NDQyNiwgMC44NDQyNiwgMC43NzQsIDAuOTA1MjcsIDEuODEwNTUsIDAuOTA1MjcsIDEuODEwNTUsIDEuMjg4MDksIDEuNTU0NjksIDAuOTQ0MzQsIDEuMDc4MDYsIDEsIDAuOTcwOTQsIDAuNzU4OSwgMC44NTI4NCwgMC45MDc0NywgMS4xOTY1OCwgMC42OTgyNSwgMC45NzYyMiwgMS4zMzUxMiwgMC45MDc0NywgMC45MDc0NywgMC44NTM1NiwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wMzM2LCAwLjkxMDI3LCAxLCAxLCAxLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1ODU5LCAxLjA1ODU5LCAxLCAxLCAxLCAxLjA3MTg1LCAwLjk5NDEzLCAwLjk2MzM0LCAxLjA4MDY1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgQ2FsaWJyaVJlZ3VsYXJNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMjIwNywKICBsaW5lR2FwOiAwLjIyMDcKfTsKCjsvLyAuL3NyYy9jb3JlL2hlbHZldGljYV9mYWN0b3JzLmpzCmNvbnN0IEhlbHZldGljYUJvbGRGYWN0b3JzID0gWzAuNzYxMTYsIDEsIDEsIDEuMDAwNiwgMC45OTk5OCwgMC45OTk3NCwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3NywgMS4wMDA4NywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAyNiwgMC45OTk5LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDAwMywgMC45OTk3MywgMC45OTk5OCwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk4MiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk1OSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk1OSwgMS4wMDA3NywgMC45OTk1OSwgMS4wMDAwMywgMC45OTk5OCwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA3NywgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wNjQwOSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMS4wMzM3NCwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDQyLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAzODI4LCAxLjAwMDI2LCAwLjk5OTk5LCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5MywgMC45OTk4LCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLCAxLjAwMDE2LCAwLjk5OTc3LCAwLjk5OTU5LCAwLjk5OTc3LCAwLjk5OTU5LCAwLjk5OTc3LCAwLjk5OTU5LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAxLjAwMDI2LCAwLjgxMjEsIDEuMDAwMjYsIDAuOTk5OTgsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDEuMDAwMjYsIDEsIDEuMDAwMjYsIDEsIDEuMDAwMjYsIDEsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMSwgMC45OTk4MiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMS4wMDAzNCwgMC45OTk3NywgMSwgMC45OTk5NywgMS4wMDAyNiwgMS4wMDA3OCwgMS4wMDAzNiwgMC45OTk3MywgMS4wMDAxMywgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTg4LCAwLjg1MTQ4LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwNjksIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5ODQsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMjQsIDEuMDAwMDEsIDAuOTk5OSwgMSwgMS4wMDA2LCAxLjAwMDAxLCAxLjAwMDQxLCAwLjk5OTYyLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTUsIDEuMDAwNDEsIDAuOTk5NDIsIDAuOTk5NzMsIDAuOTk5MjcsIDEuMDAwODIsIDAuOTk5MDIsIDEuMDAwMjYsIDEuMDAwODcsIDEuMDAwNiwgMS4wMDA2OSwgMC45OTk3MywgMC45OTg2NywgMC45OTk3MywgMC45OTkzLCAxLjAwMDI2LCAxLjAwMDQ5LCAxLjAwMDU2LCAxLCAwLjk5OTg4LCAwLjk5OTM1LCAwLjk5OTk1LCAwLjk5OTU0LCAxLjAwMDU1LCAwLjk5OTQ1LCAxLjAwMDMyLCAxLjAwMDYsIDAuOTk5OTUsIDEuMDAwMjYsIDAuOTk5OTUsIDEuMDAwMzIsIDEuMDAwMDEsIDEuMDAwMDgsIDAuOTk5NzEsIDEuMDAwMTksIDAuOTk5NCwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDQ0LCAwLjk5OTczLCAxLjAwMDIzLCAxLjAwMDQ3LCAxLCAwLjk5OTQyLCAwLjk5NTYxLCAwLjk5OTg5LCAxLjAwMDM1LCAwLjk5OTc3LCAxLjAwMDM1LCAwLjk5OTc3LCAxLjAwMDE5LCAwLjk5OTQ0LCAxLjAwMDAxLCAxLjAwMDIxLCAwLjk5OTI2LCAxLjAwMDM1LCAxLjAwMDM1LCAwLjk5OTQyLCAxLjAwMDQ4LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTg5LCAxLjAwMDU3LCAxLjAwMDAxLCAwLjk5OTM2LCAxLjAwMDUyLCAxLjAwMDEyLCAwLjk5OTk2LCAxLjAwMDQzLCAxLCAxLjAwMDM1LCAwLjk5OTQsIDAuOTk5NzYsIDEuMDAwMzUsIDAuOTk5NzMsIDEuMDAwNTIsIDEuMDAwNDEsIDEuMDAxMTksIDEuMDAwMzcsIDAuOTk5NzMsIDEuMDAwMDIsIDAuOTk5ODYsIDEuMDAwNDEsIDEuMDAwNDEsIDAuOTk5MDIsIDAuOTk5NiwgMS4wMDAzNCwgMC45OTk5OSwgMS4wMDAyNiwgMC45OTk5OSwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDA1MiwgMC45OTk3MywgMSwgMC45OTk3MywgMS4wMDA0MSwgMS4wMDA3NSwgMC45OTk0LCAxLjAwMDMsIDAuOTk5OTksIDEsIDEuMDAwNDEsIDAuOTk5NTUsIDEsIDAuOTk5MTUsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjYsIDEuMDAxMTksIDAuOTk5NTUsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTkxMSwgMS4wMDA2LCAxLjAwMDI2LCAwLjk5OTcyLCAxLjAwMDI2LCAwLjk5OTAyLCAxLjAwMDQxLCAwLjk5OTczLCAwLjk5OTk5LCAxLCAxLCAxLjAwMDM4LCAxLjAwMDUsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMSwgMSwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MiwgMSwgMSwgMS4wMDEwNiwgMC45OTk5OSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OSwgMC45OTk5OCwgMS42NjQ3NSwgMSwgMC45OTk3MywgMC45OTk3MywgMS4wMDAyMywgMC45OTk3MywgMC45OTk3MSwgMS4wMDA0NywgMS4wMDAyMywgMSwgMC45OTk5MSwgMC45OTk4NCwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk3MiwgMSwgMS4yMDk4NSwgMS4zOTcxMywgMS4wMDAwMywgMS4wMDAzMSwgMS4wMDAxNSwgMSwgMC45OTU2MSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTcyLCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBIZWx2ZXRpY2FCb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmNvbnN0IEhlbHZldGljYUJvbGRJdGFsaWNGYWN0b3JzID0gWzAuNzYxMTYsIDEsIDEsIDEuMDAwNiwgMC45OTk5OCwgMC45OTk3NCwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3NywgMS4wMDA4NywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAyNiwgMC45OTk5LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDAwMywgMC45OTk3MywgMC45OTk5OCwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk4MiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk1OSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk1OSwgMS4wMDA3NywgMC45OTk1OSwgMS4wMDAwMywgMC45OTk5OCwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA3NywgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wNjQwOSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMS4wMDQ0LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3MywgMC45OTk3MywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDEwMTEsIDEuMDAwMjYsIDAuOTk5OTksIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTkzLCAwLjk5OTgsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEuMDAwMjIsIDEuMDAwMjYsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDAuOTk5NzcsIDAuOTk5NTksIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwMjYsIDAuODEyMSwgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAxNiwgMS4wMDAyMiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTc3LCAxLCAxLCAxLjAwMDI2LCAwLjk5OTY5LCAwLjk5OTcyLCAwLjk5OTgxLCAwLjk5OTgsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMC45MTE1NSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDA2LCAwLjk5OTc3LCAxLjAwMDAxLCAwLjk5OTk5LCAwLjk5OTc3LCAwLjk5OTY2LCAxLjAwMDIyLCAxLjAwMDMyLCAxLjAwMDAxLCAwLjk5OTQ0LCAxLjAwMDI2LCAxLjAwMDAxLCAwLjk5OTY4LCAxLjAwMDAxLCAxLjAwMDQ3LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5ODEsIDEuMDAxMDEsIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk0OCwgMC45OTk4MSwgMS4wMDA2NCwgMC45OTk3MywgMC45OTk0MiwgMS4wMDEwMSwgMS4wMDA2MSwgMS4wMDAyNiwgMS4wMDA2OSwgMS4wMDA2LCAxLjAwMDE0LCAwLjk5OTczLCAxLjAxMzIyLCAwLjk5OTczLCAxLjAwMDY1LCAxLjAwMDI2LCAxLjAwMDEyLCAwLjk5OTIzLCAxLCAxLjAwMDY0LCAxLjAwMDc2LCAwLjk5OTQ4LCAxLjAwMDU1LCAxLjAwMDYzLCAxLjAwMDA3LCAwLjk5OTQzLCAxLjAwMDYsIDAuOTk5NDgsIDEuMDAwMjYsIDAuOTk5NDgsIDAuOTk5NDMsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjksIDEuMDAwMzgsIDEuMDAwMzUsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTc4LCAxLjAwMDAxLC
20AxLjAwMDU3LCAwLjk5OTg5LCAwLjk5OTY3LCAwLjk5OTY0LCAwLjk5OTY3LCAwLjk5OTc3LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDM4LCAwLjk5OTc3LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDY2LCAwLjk5OTY3LCAwLjk5OTY3LCAxLjAwMDQxLCAwLjk5OTk4LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAwLjk5OTY3LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTY0LCAxLjAwMDMxLCAxLjAwMDAxLCAwLjk5OTk5LCAwLjk5OTk5LCAxLCAxLjAwMDIzLCAxLCAxLCAwLjk5OTk5LCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTk5LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTk5LCAxLjAwMDU4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTU1LCAwLjk5OTUsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMzIsIDAuOTk5ODksIDEuMDAwMzQsIDAuOTk5OTksIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzMsIDAuNDU5OTgsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5ODIsIDAuOTk5OTQsIDAuOTk5OTYsIDEsIDEuMDAwNDIsIDEuMDAwNDQsIDEuMDAwMjksIDEuMDAwMjMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5NDksIDEuMDAwMDIsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzUsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMzIsIDAuOTg2ODUsIDAuOTk5NzMsIDEuMDAwMjYsIDEsIDEsIDAuOTk5NjYsIDEuMDAwNDQsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMSwgMSwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MiwgMSwgMSwgMS4wMDEwNiwgMC45OTk5OSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OSwgMC45OTk5OCwgMS42NjQ3NSwgMSwgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMC45OTk3MSwgMC45OTk3OCwgMSwgMSwgMC45OTk5MSwgMC45OTk4NCwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDA5OCwgMSwgMSwgMSwgMS4wMDA0OSwgMSwgMSwgMC45OTk3MiwgMSwgMS4yMDk4NSwgMS4zOTcxMywgMS4wMDAwMywgMS4wMDAzMSwgMS4wMDAxNSwgMSwgMC45OTU2MSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTcyLCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBIZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjM1LAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBIZWx2ZXRpY2FJdGFsaWNGYWN0b3JzID0gWzAuNzYxMTYsIDEsIDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAxLjAwMDAxLCAxLjAwMDQzLCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTU5LCAxLjAwMDAzLCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDEsIDEuMDAwMDMsIDEuMDAwMDMsIDEuMDAwMDMsIDAuOTk5NzMsIDAuOTk5ODcsIDEuMDAwMDEsIDEuMDAwMDEsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwNiwgMSwgMS4wMDAwMSwgMC45OTk3MywgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAwMSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAxNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk0OSwgMC45OTk3MywgMC45OTk5OCwgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTI0LCAxLCAwLjk5OTI0LCAwLjk5OTk5LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTk4LCAxLCAxLjAwMDYsIDAuOTk5NzMsIDEsIDAuOTk5NzcsIDEsIDEsIDEsIDEuMDAwMDUsIDEuMDAwOSwgMS4wMDAwNSwgMS4wMDAwMywgMC45OTk5OCwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA5LCAwLjk5OTczLCAwLjk5OTk4LCAxLjAwMDI1LCAwLjk5OTY4LCAwLjk5OTczLCAxLjAwMDAzLCAxLjAwMDI1LCAwLjYwMjk5LCAxLjAwMDI0LCAxLjA2NDA5LCAxLCAxLCAwLjk5OTk4LCAxLCAwLjk5OTgsIDEuMDAwNiwgMC45OTk5OCwgMSwgMC45OTkzNiwgMC45OTk3MywgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMSwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDAzLCAxLjAwMDIyLCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAxLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDY0
20MDksIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NzMsIDEsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDAuOTk5NzMsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEsIDAuOTk5NzcsIDEuMDI4OCwgMC45OTk3NywgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTI0LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk0NiwgMS4wMDAzNCwgMSwgMC45OTkyNCwgMS4wMDAwMSwgMSwgMSwgMC45OTk3MywgMC45OTkyNCwgMC45OTk3MywgMC45OTkyNCwgMC45OTk3MywgMS4wNjMxMSwgMC45OTk3MywgMS4wMDAyNCwgMC45OTk3MywgMC45OTkyNCwgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMS4wMDA0MSwgMC45OTk4LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLCAxLjAwMDE2LCAwLjk5OTc3LCAwLjk5OTk4LCAwLjk5OTc3LCAwLjk5OTk4LCAwLjk5OTc3LCAwLjk5OTk4LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDAuODk1NDcsIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMS4wMDAxNiwgMC45OTk3NywgMS4wMDAwMSwgMSwgMS4wMDAwMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMC45OTkyNCwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMSwgMC45OTk4MiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAwMSwgMSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLjAwMDAxLCAxLCAxLjAwMDU0LCAwLjk5OTc3LCAxLjAwMDg0LCAxLjAwMDA3LCAwLjk5OTczLCAxLjAwMDEzLCAwLjk5OTI0LCAxLjAwMDAxLCAxLjAwMDAxLCAwLjk5OTQ1LCAwLjkxMjIxLCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDYsIDEuMDAwMDEsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzcsIDAuOTk5MzMsIDEuMDAwMjIsIDEuMDAwNTQsIDEuMDAwMDEsIDEuMDAwNjUsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMSwgMS4wMDAwMSwgMS4wMDA1MiwgMSwgMS4wMDA2LCAxLjAwMDAxLCAwLjk5OTQ1LCAwLjk5ODk3LCAwLjk5OTY4LCAwLjk5OTI0LCAxLjAwMDM2LCAwLjk5OTQ1LCAwLjk5OTQ5LCAxLCAxLjAwMDYsIDAuOTk4OTcsIDAuOTk5MTgsIDAuOTk5NjgsIDAuOTk5MTEsIDAuOTk5MjQsIDEsIDAuOTk5NjIsIDEuMDE0ODcsIDEsIDEuMDAwNSwgMC45OTk3MywgMS4wMDAxMiwgMS4wMDA0MywgMSwgMC45OTk5NSwgMC45OTk5NCwgMS4wMDAzNiwgMC45OTk0NywgMS4wMDAxOSwgMS4wMDA2MywgMS4wMDAyNSwgMC45OTkyNCwgMS4wMDAzNiwgMC45OTk3MywgMS4wMDAzNiwgMS4wMDAyNSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNywgMS4wMDAxLCAxLjAwMDY4LCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMSwgMS4wMDAwOCwgMC45OTk1NywgMC45OTk3MiwgMC45OTk0LCAwLjk5OTU0LCAwLjk5OTc1LCAxLjAwMDUxLCAxLjAwMDAxLCAxLjAwMDE5LCAxLjAwMDAxLCAxLjAwMDEsIDAuOTk5ODYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMzgsIDAuOTk5NTQsIDAuOTk5NTQsIDAuOTk5NCwgMS4wMDA2NiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDA1NCwgMS4wMDAwMSwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NSwgMS4wMDAxLCAxLjAwMDAxLCAwLjk5OTkzLCAwLjk5OTUsIDAuOTk5NTUsIDEuMDAwMTYsIDAuOTk5NzgsIDAuOTk5NzQsIDEuMDAwMTksIDEuMDAwMjIsIDAuOTk5NTUsIDEuMDAwNTMsIDAuOTk5NzMsIDEuMDAwODksIDEuMDAwMDUsIDAuOTk5NjcsIDEuMDAwNDgsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMzQsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NjQsIDEuMDAwMDYsIDEuMDAwNjYsIDAuOTk5NDcsIDAuOTk5NzMsIDAuOTg4OTQsIDAuOTk5NzMsIDEsIDAuNDQ4OTgsIDEsIDAuOTk5NDYsIDEsIDEuMDAwMzksIDEuMDAwODIsIDAuOTk5OTEsIDAuOTk5OTEsIDAuOTk5ODUsIDEuMDAwMjIsIDEuMDAwMjMsIDEuMDAwNjEsIDEuMDAwMDYsIDAuOTk5NjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMTksIDEuMDAwOCwgMSwgMC45OTkyNCwgMC45OTkyNCwgMC45OTkyNCwgMC45OTk4MywgMS4wMDA0NCwgMC45OTk3MywgMC45OTk2NCwgMC45ODMzMiwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk2MiwgMC45OTg5NSwgMS4wMDAxNiwgMC45OTk3NywgMS4wMDAxNiwgMC45OTk3NywgMS4wMDAxNiwgMC45OTk3NywgMS4wMDAwMSwgMSwgMSwgMSwgMC45OTk3MywgMSwgMSwgMC45OTk1NSwgMC45OTkyNCwgMC45OTkyNCwgMC45OTkyNCwgMC45OTkyNCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MiwgMSwgMSwgMS4wMDI2NywgMC45OTk5OSwgMC45OTk5OCwgMC45OTk5OCwgMSwgMC45OTk5OCwgMS42NjQ3NSwgMSwgMC45OTk3MywgMC45OTk3MywgMS4wMDAyMywgMC45OTk3MywgMS4wMDQyMywgMC45OTkyNSwgMC45OTk5OSwgMSwgMC45OTk5MSwgMC45OTk4NCwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDA0OSwgMSwgMS4wMDI0NSwgMSwgMSwgMSwgMSwgMC45NjMyOSwgMSwgMS4yMDk4NSwgMS4zOTcxMywgMS4wMDAwMywgMC44MjU0LCAxLjAwMDE1LCAxLCAxLjAwMDM1LCAxLjAwMDI3LCAxLjAwMDMxLCAxLjAwMDMxLCAxLjAwMDAzLCAxLjAwMDMxLCAxLjAwMDMxLCAwLjk5OTk5LCAxLjAwMDAzLCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQxMTQ0LCAxLjYsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDExNDQsIDEuNDA1NzksIDEuNDA1NzksIDEuMzY2MjUsIDAuOTk5OTksIDEsIDAuOTk4NjEsIDAuOTk4NjEsIDEsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTUzMTcsIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDAuOTk5OTksIDEuNDA0ODMsIDEsIDAuOTk5NzcsIDEuMDAwNTQsIDEsIDEsIDAuOTk5NTMsIDAuOTk5NjIsIDEuMDAwND
20IsIDAuOTk5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IEhlbHZldGljYUl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zNSwKICBsaW5lR2FwOiAwLjIKfTsKY29uc3QgSGVsdmV0aWNhUmVndWxhckZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEuMDAwMDEsIDEuMDAwNDMsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NTksIDEuMDAwMDMsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMC45OTk3MywgMC45OTk4NywgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDA2LCAxLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDAxLCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDE2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ5LCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDAuOTk5MjQsIDEsIDAuOTk5MjQsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5OTgsIDEsIDEuMDAwNiwgMC45OTk3MywgMSwgMC45OTk3NywgMSwgMSwgMSwgMS4wMDAwNSwgMS4wMDA5LCAxLjAwMDA1LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDksIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjUsIDAuOTk5NjgsIDAuOTk5NzMsIDEuMDAwMDMsIDEuMDAwMjUsIDAuNjAyOTksIDEuMDAwMjQsIDEuMDY0MDksIDEsIDEsIDAuOTk5OTgsIDEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wNjQwOSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMS4wNDU5NiwgMC45OTk3NywgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTI0LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAxOSwgMS4wMDAzNCwgMSwgMC45OTkyNCwgMS4wMDAwMSwgMSwgMSwgMC45OTk3MywgMC45OTkyNCwgMC45OTk3MywgMC45OTkyNCwgMC45OTk3MywgMS4wMjU3MiwgMC45OTk3MywgMS4wMDAwNSwgMC45OTk3MywgMC45OTkyNCwgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk5OSwgMC45OTk4LCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLCAxLjAwMDE2LCAwLjk5OTc3LCAwLjk5OTk4LCAwLjk5OTc3LCAwLjk5OTk4LCAwLjk5OTc3LCAwLjk5OTk4LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwMjYsIDAuODQ1MzMsIDEuMDAwMjYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMS4wMDAxNiwgMC45OTk3NywgMS4wMDAwMSwgMSwgMS4wMDAwMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMS4wMDAyNiwgMSwgMC45OTkyNCwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMSwgMC45OTk4MiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAwMSwgMSwgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTI4LCAxLCAwLjk5OTc3LCAxLjAwMDEzLCAxLjAwMDU1LCAwLjk5OTQ3LCAwLjk5OTQ1LCAwLjk5OTQxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDQsIDAuOTE2MjEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMS4wMDAwMSwgMS4wMDAwNSwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAxNSwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAxOSwgMS4wMDAwMSwgMC45OTk0NiwgMSwgMS4wMDA2LCAxLjAwMDAxLCAwLjk5OTc4LCAxLjAwMDQ1LCAwLjk5OTczLCAwLjk5OTI0LCAxLjAwMDIzLCAwLjk5OTc4LCAwLjk5OTY2LCAxLCAxLjAwMDY1LCAxLjAwMDQ1LCAxLjAwMDE5LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTI0LCAxLCAxLCAwLjk2NDk5LCAxLCAxLjAwMDU1LCAwLjk5OTczLCAxLjAwMDA4LCAxLjAwMDI3LCAxLCAwLjk5OTcsIDAuOTk5OTUsIDEuMDAwMjMsIDAuOTk5MzMsIDEuMDAwMTksIDEuMDAwMTUsIDEuMDAwMzEsIDAuOTk5MjQsIDEuMDAwMjMsIDAuOTk5NzMsIDEuMDAwMjMsIDEuMDAwMzEsIDEuMDAwMDEsIDAuOTk5MjgsIDEuMDAwMjksIDEuMDAwOTIsIDEuMDAwMzUsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLCAwLjk5OTg4LCAwLjk5OTc1LCAxLCAxLjAwMDgyLCAwLjk5NTYxLCAwLjk5OTYsIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5NjIsIDEuMDAwMDEsIDEuMDAwOTIsIDAuOTk5NjQsIDEuMDAwMDEsIDAuOTk5NjMsIDAuOTk5OTksIDEuMDAwMzUsIDEuMDAwMzUsIDEuMDAwODIsIDAuOTk5NjIsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMzUsIDEuMDAwMDEsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NiwgMC45OTk2NywgMS4wMDAwMSwgMS4wMDAzNCwgMS4wMDA3NCwgMS4wMDA1NCwgMS4wMDA1MywgMS4wMDA2MywgMC45OTk3MSwgMC45OTk2MiwgMS4wMDAzNSwgMC45OTk3NSwgMC45OTk3NywgMC45OTk3MywgMS4wMDA0MywgMC45OTk1MywgMS4wMDA3LCAwLjk5OTE1LCAwLjk5OTczLCAxLjAwMDA4LCAwLjk5ODkyLCAxLjAwMDczLCAxLjAwMDczLCAxLjAwMTE0LCAwLjk5OTE1LCAxLjAwMDczLCAwLjk5OTU1LCAwLjk5OTczLCAxLjAwMDkyLCAwLjk5OTczLCAxLCAwLjk5OTk4LCAxLCAxLjAwMDMsIDEsIDEuMDAwNDMsIDEuMDAwMDEsIDAuOTk5NjksIDEuMDAwMywgMSwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk1LCAxLCAxLjAwMDkyLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDcsIDAuOTk5NSwgMSwgMC45OTkyNCwgMS4wMDA2LCAwLjk5OTI0LCAwLjk5OTcyLCAxLjAwMDYyLCAwLjk5OTczLCAxLjAwMTE0LCAxLjAwMDczLCAxLCAwLjk5OTU1LCAxLCAxLCAxLjAwMDQ3LCAwLjk5OTY4LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTU1LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMjY3LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAwLjk5OTcxLCAwLjk5OTI1LCAxLjAwMDIzLCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk2MzI5LCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAwLjgyNTQsIDEuMDAwMTUsIDEsIDEuMDAwMzUsIDEuMDAwMjcsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5MTUsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5OTksIDEuMDAwMDMsIDAuOTk5OTksIDAuOTk5OTksIDEuNDExNDQsIDEuNiwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MDU3OSwgMS40MDU3OSwgMS4zNjYyNSwgMC45OTk5OSwgMSwgMC45OTg2MSwgMC45OTg2MSwgMSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45NTMxNywgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMS40MDQ4MywgMSwgMC45OTk3NywgMS4wMDA1NCwgMSwgMSwgMC45OTk1MywgMC45OTk2MiwgMS4wMDA0MiwgMC45OTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgSGVsdmV0aWNhUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9OwoKOy8vIC4vc3JjL2NvcmUvbGliZXJhdGlvbnNhbnNfd2lkdGhzLmpzCmNvbnN0IExpYmVyYXRpb25TYW5zQm9sZFdpZHRocyA9IFszNjUsIDAsIDMzMywgMjc4LCAzMzMsIDQ3NCwgNTU2LCA1NTYsIDg4OSwgNzIyLCAyMzgsIDMzMywgMzMzLCAzODksIDU4NCwgMjc4LCAzMzMsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDMzMywgMzMzLCA1ODQsIDU4NCwgNTg0LCA2MTEsIDk3NSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDYxMSwgNzc4LCA3MjIsIDI3OCwgNTU2LCA3MjIsIDYxMSwgODMzLCA3MjIsIDc3OCwgNjY3LCA3NzgsIDcyMiwgNjY3LCA2MTEsIDcyMiwgNjY3LCA5NDQsIDY2NywgNjY3LCA2MTEsIDMzMywgMjc4LCAzMzMsIDU4NCwgNTU2LCAzMzMsIDU1NiwgNjExLCA1NTYsIDYxMSwgNTU2LCAzMzMsIDYxMSwgNjExLCAyNzgsIDI3OCwgNTU2LCAyNzgsIDg4OSwgNjExLCA2MTEsIDYxMSwgNjExLCAzODksIDU1NiwgMzMzLCA2MTEsIDU1NiwgNzc4LCA1NTYsIDU1NiwgNTAwLCAzODksIDI4MCwgMzg5LCA1ODQsIDMzMywgNTU2LCA1NTYsIDU1NiwgNTU2LCAyODAsIDU1NiwgMzMzLCA3MzcsIDM3MCwgNTU2LCA1ODQsIDczNywgNTUyLCA0MDAsIDU0OSwgMzMzLCAzMzMsIDMzMywgNTc2LCA1NTYsIDI3OCwgMzMzLCAzMzMsIDM2NSwgNTU2LCA4MzQsIDgzNCwgODM0LCA2MTEsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDEwMDAsIDcyMiwgNjY3LCA2NjcsIDY2NywgNjY3LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDcyMiwgNzIyLCA3NzgsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNTg0LCA3NzgsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNjY3LCA2NjcsIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgODg5LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDU0OSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDU1NiwgNjExLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDcxOSwgNzIyLCA2MTEsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCA3ODUsIDU1NiwgNTU2LCAyNzgsIDcyMiwgNTU2LCA1NTYsIDYxMSwgMjc4LCA2MTEsIDI3OCwgNjExLCAzODUsIDYxMSwgNDc5LCA2MTEsIDI3OCwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzA4LCA3MjMsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgMTAwMCwgOTQ0LCA3MjIsIDM4OSwgNzIyLCAzODksIDcyMiwgMzg5LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjExLCAzMzMsIDYxMSwgNDc5LCA2MTEsIDMzMywgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgOTQ0LCA3NzgsIDY2NywgNTU2LCA2NjcsIDYxMSwgNTAwLCA2MTEsIDUwMCwgNjExLCA1MDAsIDI3OCwgNTU2LCA3MjIsIDU1NiwgMTAwMCwgODg5LCA3NzgsIDYxMSwgNjY3LCA1NTYsIDYxMSwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDQ2NSwgNzIyLCAzMzMsIDg1MywgOTA2LCA0NzQsIDgyNSwgOTI3LCA4MzgsIDI3OCwgNzIyLCA3MjIsIDYwMSwgNzE5LCA2NjcsIDYxMSwgNzIyLCA3NzgsIDI3OCwgNzIyLCA2NjcsIDgzMywgNzIyLCA2NDQsIDc3OCwgNzIyLCA2NjcsIDYwMCwgNjExLCA2NjcsIDgyMSwgNjY3LCA4MDksIDgwMiwgMjc4LCA2NjcsIDYxNSwgNDUxLCA2MTEsIDI3OCwgNTgyLCA2MTUsIDYxMCwgNTU2LCA2MDYsIDQ3NSwgNDYwLCA2MTEsIDU0MSwgMjc4LCA1NTgsIDU1NiwgNjEyLCA1NTYsIDQ0NSwgNjExLCA3NjYsIDYxOSwgNTIwLCA2ODQsIDQ0NiwgNTgyLCA3MTUsIDU3NiwgNzUzLCA4NDUsIDI3OCwgNTgyLCA2MTEsIDU4MiwgODQ1LCA2NjcsIDY2OSwgODg1LCA1NjcsIDcxMSwgNjY3LCAyNzgsIDI3NiwgNTU2LCAxMDk0LCAxMDYyLCA4NzUsIDYxMCwgNzIyLCA2MjIsIDcxOSwgNzIyLCA3MTksIDcyMiwgNTY3LCA3MTIsIDY2NywgOTA0LCA2MjYsIDcxOSwgNzE5LCA2MTAsIDcwMiwgODMzLCA3MjIsIDc3OCwgNzE5LCA2NjcsIDcyMiwgNjExLCA2MjIsIDg1NCwgNjY3LCA3MzAsIDcwMywgMTAwNSwgMTAxOSwgODcwLCA5NzksIDcxOSwgNzExLCAxMDMxLCA3MTksIDU1NiwgNjE4LCA2MTUsIDQxNywgNjM1LCA1NTYsIDcwOSwgNDk3LCA2MTUsIDYxNSwgNTAwLCA2MzUsIDc0MCwgNjA0LCA2MTEsIDY
20wNCwgNjExLCA1NTYsIDQ5MCwgNTU2LCA4NzUsIDU1NiwgNjE1LCA1ODEsIDgzMywgODQ0LCA3MjksIDg1NCwgNjE1LCA1NTIsIDg1NCwgNTgzLCA1NTYsIDU1NiwgNjExLCA0MTcsIDU1MiwgNTU2LCAyNzgsIDI4MSwgMjc4LCA5NjksIDkwNiwgNjExLCA1MDAsIDYxNSwgNTU2LCA2MDQsIDc3OCwgNjExLCA0ODcsIDQ0NywgOTQ0LCA3NzgsIDk0NCwgNzc4LCA5NDQsIDc3OCwgNjY3LCA1NTYsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA1MDAsIDUwMCwgNTAwLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAyNDAsIDQ3OSwgMzMzLCAzMzMsIDYwNCwgMzMzLCAxNjcsIDM5NiwgNTU2LCA1NTYsIDEwOTQsIDU1NiwgODg1LCA0ODksIDExMTUsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDEwMDAsIDUwMCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcyMiwgMjc0LCA1NDksIDU0OSwgNTgzLCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA2MTEsIDYxMSwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzM107CmNvbnN0IExpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA
201MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDMzMywgNDc0LCA1NTYsIDU1NiwgODg5LCA3MjIsIDIzOCwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCAzMzMsIDU4NCwgNTg0LCA1ODQsIDYxMSwgOTc1LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1NTYsIDcyMiwgNjExLCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMzMzLCAyNzgsIDMzMywgNTg0LCA1NTYsIDMzMywgNTU2LCA2MTEsIDU1NiwgNjExLCA1NTYsIDMzMywgNjExLCA2MTEsIDI3OCwgMjc4LCA1NTYsIDI3OCwgODg5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDM4OSwgNTU2LCAzMzMsIDYxMSwgNTU2LCA3NzgsIDU1NiwgNTU2LCA1MDAsIDM4OSwgMjgwLCAzODksIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI4MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDU1NiwgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTQ5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTU2LCA2MTEsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNzQwLCA3MjIsIDYxMSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDc4MiwgNTU2LCA1NTYsIDI3OCwgNzIyLCA1NTYsIDU1NiwgNjExLCAyNzgsIDYxMSwgMjc4LCA2MTEsIDM5NiwgNjExLCA0NzksIDYxMSwgMjc4LCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MDgsIDcyMywgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCAxMDAwLCA5NDQsIDcyMiwgMzg5LCA3MjIsIDM4OSwgNzIyLCAzODksIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2MTEsIDMzMywgNjExLCA0NzksIDYxMSwgMzMzLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA5NDQsIDc3OCwgNjY3LCA1NTYsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjc4LCA1NTYsIDcyMiwgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDU1NiwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCA3MjIsIDMzMywgODU0LCA5MDYsIDQ3MywgODQ0LCA5MzAsIDg0NywgMjc4LCA3MjIsIDcyMiwgNjEwLCA2NzEsIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA3MjIsIDY2NywgODMzLCA3MjIsIDY1NywgNzc4LCA3MTgsIDY2NywgNTkwLCA2MTEsIDY2NywgODIyLCA2NjcsIDgyOSwgNzgxLCAyNzgsIDY2NywgNjIwLCA0NzksIDYxMSwgMjc4LCA1OTEsIDYyMCwgNjIxLCA1NTYsIDYxMCwgNDc5LCA0OTIsIDYxMSwgNTU4LCAyNzgsIDU2NiwgNTU2LCA2MDMsIDU1NiwgNDUwLCA2MTEsIDcxMiwgNjA1LCA1MzIsI
20DY2NCwgNDA5LCA1OTEsIDcwNCwgNTc4LCA3NzMsIDgzNCwgMjc4LCA1OTEsIDYxMSwgNTkxLCA4MzQsIDY2NywgNjY3LCA4ODYsIDYxNCwgNzE5LCA2NjcsIDI3OCwgMjc4LCA1NTYsIDEwOTQsIDEwNDIsIDg1NCwgNjIyLCA3MTksIDY3NywgNzE5LCA3MjIsIDcwOCwgNzIyLCA2MTQsIDcyMiwgNjY3LCA5MjcsIDY0MywgNzE5LCA3MTksIDYxNSwgNjg3LCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDY3NywgNzgxLCA2NjcsIDcyOSwgNzA4LCA5NzksIDk4OSwgODU0LCAxMDAwLCA3MDgsIDcxOSwgMTA0MiwgNzI5LCA1NTYsIDYxOSwgNjA0LCA1MzQsIDYxOCwgNTU2LCA3MzYsIDUxMCwgNjExLCA2MTEsIDUwNywgNjIyLCA3NDAsIDYwNCwgNjExLCA2MTEsIDYxMSwgNTU2LCA4ODksIDU1NiwgODg1LCA1NTYsIDY0NiwgNTgzLCA4ODksIDkzNSwgNzA3LCA4NTQsIDU5NCwgNTUyLCA4NjUsIDU4OSwgNTU2LCA1NTYsIDYxMSwgNDY5LCA1NjMsIDU1NiwgMjc4LCAyNzgsIDI3OCwgOTY5LCA5MDYsIDYxMSwgNTA3LCA2MTksIDU1NiwgNjExLCA3NzgsIDYxMSwgNTc1LCA0NjcsIDk0NCwgNzc4LCA5NDQsIDc3OCwgOTQ0LCA3NzgsIDY2NywgNTU2LCAzMzMsIDMzMywgNTU2LCAxMDAwLCAxMDAwLCA1NTIsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNTAwLCA1MDAsIDUwMCwgNTU2LCA1NTYsIDM1MCwgMTAwMCwgMTAwMCwgMjQwLCA0NzksIDMzMywgMzMzLCA2MDQsIDMzMywgMTY3LCAzOTYsIDU1NiwgNTU2LCAxMTA0LCA1NTYsIDg4NSwgNTE2LCAxMTQ2LCAxMDAwLCA3NjgsIDYwMCwgODM0LCA4MzQsIDgzNCwgODM0LCA5OTksIDUwMCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcyMiwgMjc0LCA1NDksIDU0OSwgNTgzLCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA2MTEsIDYxMSwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzM107CmNvbnN0IExpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsI
20Dk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKY29uc3QgTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMgPSBbMzY1LCAwLCAzMzMsIDI3OCwgMjc4LCAzNTUsIDU1NiwgNTU2LCA4ODksIDY2NywgMTkxLCAzMzMsIDMzMywgMzg5LCA1ODQsIDI3OCwgMzMzLCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgNTg0LCA1ODQsIDU4NCwgNTU2LCAxMDE1LCA2NjcsIDY2NywgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1MDAsIDY2NywgNTU2LCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMjc4LCAyNzgsIDI3OCwgNDY5LCA1NTYsIDMzMywgNTU2LCA1NTYsIDUwMCwgNTU2LCA1NTYsIDI3OCwgNTU2LCA1NTYsIDIyMiwgMjIyLCA1MDAsIDIyMiwgODMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDMzMywgNTAwLCAyNzgsIDU1NiwgNTAwLCA3MjIsIDUwMCwgNTAwLCA1MDAsIDMzNCwgMjYwLCAzMzQsIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI2MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDUzNywgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNjY3LCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDUwMCwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTQ5LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTAwLCA1NTYsIDUwMCwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNjI1LCA3MjIsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDIyMiwgMjc4LCAyNzgsIDczMywgNDQ0LCA1MDAsIDIyMiwgNjY3LCA1MDAsIDUwMCwgNTU2LCAyMjIsIDU1NiwgMjIyLCA1NTYsIDI4MSwgNTU2LCA0MDAsIDU1NiwgMjIyLCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA2MTUsIDcyMywgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCAxMDAwLCA5NDQsIDcyMiwgMzMzLCA3MjIsIDMzMywgNzIyLCAzMzMsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDY2NywgNTAwLCA2MTEsIDI3OCwgNjExLCAzNTQsIDYxMSwgMjc4LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA5NDQsIDcyMiwgNjY3LCA1MDAsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjIyLCA1NTYsIDY2NywgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDUwMCwgNjExLCAyNzgsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCA2NjcsIDI3OCwgNzg5LCA4NDYsIDM4OSwgNzk0LCA4NjUsIDc3NSwgMjIyLCA2NjcsIDY2NywgNTcwLCA2NzEsIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA2NjcsIDY2NywgODMzLCA3MjIsIDY0OCwgNzc4LCA3MjUsIDY2NywgNjAwLCA2MTEsIDY2NywgODM3LCA2NjcsIDgzMSwgNzYxLCAyNzgsIDY2NywgNTcwLCA0MzksIDU1NSwgMjIyLCA1NTAsIDU3MCwgNTcxLCA1MDAsIDU1NiwgNDM5LCA0NjMsIDU1NSwgNTQyLCAyMjIsIDUwMCwgNDkyLCA1NDgsIDUwMCwgNDQ3LCA1NTYsIDY3MCwgNTczLCA0ODYsIDYwMywgMzc0LCA1NTAsIDY1MiwgNTQ2LCA3MjgsIDc3OSwgMjIyLCA1NTAsIDU1NiwgNTUwLCA3NzksIDY2NywgNjY3LCA4NDMsIDU0NCwgNzA4LCA2NjcsIDI3OCwgMjc4LCA1MDAsIDEwNjYsIDk4MiwgODQ0LCA1ODksIDcxNSwgNjM5LCA3MjQsIDY2NywgNjUxLCA2NjcsIDU0NCwgNzA0LCA2NjcsIDkxNywgNjE0LCA3MTUsIDcxNSwgNTg5LCA2ODYsIDgzMywgNzIyLCA3NzgsIDcyNSwgNjY3LCA3MjIsIDYxMSwgNjM5LCA3OTUsIDY2NywgNzI3LCA2NzMsIDkyMCwgOTIzLCA4MDUsIDg4NiwgNjUxLCA2OTQsIDEwMjIsIDY4MiwgNTU2LCA1NjIsIDUyMiwgNDkzLCA1NTMsIDU1NiwgNjg4LCA0NjUsIDU1NiwgNTU2LCA0NzIsIDU2NCwgNjg2LCA1NTAsIDU1NiwgNTU2LCA1NTYsIDUwMCwgODMzLCA1MDAsIDgzNSwgNTAwLCA1NzIsIDUxOCwgODMwLCA4NTEsIDYyMSwgNzM2LCA1MjYsIDQ5MiwgNzUyLCA1MzQsIDU1NiwgNTU2LCA1NTYsIDM3OCwgNDk2LCA1MDAsIDIyMiwgMjIyLCAyMjIsIDkxMCwgODI4LCA1NTYsIDQ3MiwgNTY1LCA1MDAsIDU1NiwgNzc4LCA1NTYsIDQ5MiwgMzM5LCA5NDQsIDcyMiwgOTQ0LCA3MjIsIDk0NCwgNzIyLCA2NjcsIDUwMCwgMzMzLCAzMzMsIDU1NiwgMTAwMCwgMTAwMCwgNTUyLCAyMjIsIDIyMiwgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDU1NiwgNTU2LCAzNTAsIDEwMDAsIDEwMDAsIDE4OCwgMzU0LCAzMzMsIDMzMywgNTAwLCAzMzMsIDE2NywgMzY1LCA1NTYsIDU1NiwgMTA5NCwgNTU2LCA4ODUsIDMyMywgMTA4MywgMTAwMCwgNzY4LCA2MDAsIDgzNCwgODM0LCA4MzQsIDgzNCwgMTAwMCwgNTAwLCA5OTgsIDUwMCwgMTAwMCwgNTAwLCA1MDAsIDQ5NCwgNjEyLCA4MjMsIDcxMywgNTg0LCA1NDksIDcxMywgOTc5LCA3MTksIDI3NCwgNTQ5LCA1NDksIDU4NCwgNTQ5LCA1NDksIDYwNCwgNTg0LCA2MDQsIDYwNCwgNzA4LCA2MjUsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcyOSwgNjA0LCA2MDQsIDM1NCwgMzU0LCAxMDAwLCA5OTAsIDk5MCwgOTkwLCA5OTAsIDQ5NCwgNjA0LCA2MDQsIDYwNCwgNjA0LCAzNTQsIDEwMjEsIDEwNTIsIDkxNywgNzUwLCA3NTAsIDUzMSwgNjU2LCA1OTQsIDUxMCwgNTAwLCA3NTAsIDc1MCwgNTAwLCA1MDAsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAyMjIsIDIyMiwgMjk0LCAyOTQsIDMyNCwgMzI0LCAzMTYsIDMyOCwgMzk4LCAyODVdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDY
20sIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKY29uc3QgTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDI3OCwgMzU1LCA1NTYsIDU1NiwgODg5LCA2NjcsIDE5MSwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjc4LCAyNzgsIDU4NCwgNTg0LCA1ODQsIDU1NiwgMTAxNSwgNjY3LCA2NjcsIDcyMiwgNzIyLCA2NjcsIDYxMSwgNzc4LCA3MjIsIDI3OCwgNTAwLCA2NjcsIDU1NiwgODMzLCA3MjIsIDc3OCwgNjY3LCA3NzgsIDcyMiwgNjY3LCA2MTEsIDcyMiwgNjY3LCA5NDQsIDY2NywgNjY3LCA2MTEsIDI3OCwgMjc4LCAyNzgsIDQ2OSwgNTU2LCAzMzMsIDU1NiwgNTU2LCA1MDAsIDU1NiwgNTU2LCAyNzgsIDU1NiwgNTU2LCAyMjIsIDIyMiwgNTAwLCAyMjIsIDgzMywgNTU2LCA1NTYsIDU1NiwgNTU2LCAzMzMsIDUwMCwgMjc4LCA1NTYsIDUwMCwgNzIyLCA1MDAsIDUwMCwgNTAwLCAzMzQsIDI2MCwgMzM0LCA1ODQsIDMzMywgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNjAsIDU1NiwgMzMzLCA3MzcsIDM3MCwgNTU2LCA1ODQsIDczNywgNTUyLCA0MDAsIDU0OSwgMzMzLCAzMzMsIDMzMywgNTc2LCA1MzcsIDI3OCwgMzMzLCAzMzMsIDM2NSwgNTU2LCA4MzQsIDgzNCwgODM0LCA2MTEsIDY2NywgNjY3LCA2NjcsIDY2NywgNjY3LCA2NjcsIDEwMDAsIDcyMiwgNjY3LCA2NjcsIDY2NywgNjY3LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDcyMiwgNzIyLCA3NzgsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNTg0LCA3NzgsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNjY3LCA2NjcsIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgODg5LCA1MDAsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU0OSwgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDUwMCwgNTU2LCA1MDAsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDYxNSwgNzIyLCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyMjIsIDI3OCwgMjc4LCA3MzUsIDQ0NCwgNTAwLCAyMjIsIDY2NywgNTAwLCA1MDAsIDU1NiwgMjIyLCA1NTYsIDIyMiwgNTU2LCAyOTIsIDU1NiwgMzM0LCA1NTYsIDIyMiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNjA0LCA3MjMsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgMTAwMCwgOTQ0LCA3MjIsIDMzMywgNzIyLCAzMzMsIDcyMiwgMzMzLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjExLCAyNzgsIDYxMSwgMzc1LCA2MTEsIDI3OCwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgOTQ0LCA3MjIsIDY2NywgNTAwLCA2NjcsIDYxMSwgNTAwLCA2MTEsIDUwMCwgNjExLCA1MDAsIDIyMiwgNTU2LCA2NjcsIDU1NiwgMTAwMCwgODg5LCA3NzgsIDYxMSwgNjY3LCA1MDAsIDYxMSwgMjc4LCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgNjY3LCAyNzgsIDc4NCwgODM4LCAzODQsIDc3NCwgODU1LCA3NTIsIDIyMiwgNjY3LCA2NjcsIDU1MSwgNjY4LCA2NjcsIDYxMSwgNzIyLCA3NzgsIDI3OCwgNjY3LCA2NjgsIDgzMywgNzIyLCA2NTAsIDc3OCwgNzIyLCA2NjcsIDYxOCwgNjExLCA2NjcsIDc5OCwgNjY3LCA4MzUsIDc0OCwgMjc4LCA2NjcsIDU3OCwgNDQ2LCA1NTYsIDIyMiwgNTQ3LCA1NzgsIDU3NSwgNTAwLCA1NTcsIDQ0NiwgNDQxLCA1NTYsIDU1NiwgMjIyLCA1MDAsIDUwMCwgNTc2LCA1MDAsIDQ0OCwgNTU2LCA2OTAsIDU2OSwgNDgyLCA2MTcsIDM5NSwgNTQ3LCA2NDgsIDUyNSwgNzEzLCA3ODEsIDIyMiwgNTQ3LCA1NTYsIDU0NywgNzgxLCA2NjcsIDY2NywgODY1LCA1NDIsIDcxOSwgNjY3LCAyNzgsIDI3OCwgNTAwLCAxMDU3LCAxM
20DEwLCA4NTQsIDU4MywgNzIyLCA2MzUsIDcxOSwgNjY3LCA2NTYsIDY2NywgNTQyLCA2NzcsIDY2NywgOTIzLCA2MDQsIDcxOSwgNzE5LCA1ODMsIDY1NiwgODMzLCA3MjIsIDc3OCwgNzE5LCA2NjcsIDcyMiwgNjExLCA2MzUsIDc2MCwgNjY3LCA3NDAsIDY2NywgOTE3LCA5MzgsIDc5MiwgODg1LCA2NTYsIDcxOSwgMTAxMCwgNzIyLCA1NTYsIDU3MywgNTMxLCAzNjUsIDU4MywgNTU2LCA2NjksIDQ1OCwgNTU5LCA1NTksIDQzOCwgNTgzLCA2ODgsIDU1MiwgNTU2LCA1NDIsIDU1NiwgNTAwLCA0NTgsIDUwMCwgODIzLCA1MDAsIDU3MywgNTIxLCA4MDIsIDgyMywgNjI1LCA3MTksIDUyMSwgNTEwLCA3NTAsIDU0MiwgNTU2LCA1NTYsIDU1NiwgMzY1LCA1MTAsIDUwMCwgMjIyLCAyNzgsIDIyMiwgOTA2LCA4MTIsIDU1NiwgNDM4LCA1NTksIDUwMCwgNTUyLCA3NzgsIDU1NiwgNDg5LCA0MTEsIDk0NCwgNzIyLCA5NDQsIDcyMiwgOTQ0LCA3MjIsIDY2NywgNTAwLCAzMzMsIDMzMywgNTU2LCAxMDAwLCAxMDAwLCA1NTIsIDIyMiwgMjIyLCAyMjIsIDIyMiwgMzMzLCAzMzMsIDMzMywgNTU2LCA1NTYsIDM1MCwgMTAwMCwgMTAwMCwgMTg4LCAzNTQsIDMzMywgMzMzLCA1MDAsIDMzMywgMTY3LCAzNjUsIDU1NiwgNTU2LCAxMDk0LCA1NTYsIDg4NSwgMzIzLCAxMDczLCAxMDAwLCA3NjgsIDYwMCwgODM0LCA4MzQsIDgzNCwgODM0LCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgMTAwMCwgNTAwLCA1MDAsIDQ5NCwgNjEyLCA4MjMsIDcxMywgNTg0LCA1NDksIDcxMywgOTc5LCA3MTksIDI3NCwgNTQ5LCA1NDksIDU4MywgNTQ5LCA1NDksIDYwNCwgNTg0LCA2MDQsIDYwNCwgNzA4LCA2MjUsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcyOSwgNjA0LCA2MDQsIDM1NCwgMzU0LCAxMDAwLCA5OTAsIDk5MCwgOTkwLCA5OTAsIDQ5NCwgNjA0LCA2MDQsIDYwNCwgNjA0LCAzNTQsIDEwMjEsIDEwNTIsIDkxNywgNzUwLCA3NTAsIDUzMSwgNjU2LCA1OTQsIDUxMCwgNTAwLCA3NTAsIDc1MCwgNTAwLCA1MDAsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAyMjIsIDIyMiwgMjk0LCAyOTQsIDMyNCwgMzI0LCAzMTYsIDMyOCwgMzk4LCAyODVdOwpjb25zdCBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nID0gWy0xLCAtMSwgLTEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywgMjU4LCAyNTksIDI2MCwgMjYxLCAyNjIsIDI2MywgMjY0LCAyNjUsIDI2NiwgMjY3LCAyNjgsIDI2OSwgMjcwLCAyNzEsIDI3MiwgMjczLCAyNzQsIDI3NSwgMjc2LCAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsIDI4NywgMjg4LCAyODksIDI5MCwgMjkxLCAyOTIsIDI5MywgMjk0LCAyOTUsIDI5NiwgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAzMDQsIDMwNSwgMzA2LCAzMDcsIDMwOCwgMzA5LCAzMTAsIDMxMSwgMzEyLCAzMTMsIDMxNCwgMzE1LCAzMTYsIDMxNywgMzE4LCAzMTksIDMyMCwgMzIxLCAzMjIsIDMyMywgMzI0LCAzMjUsIDMyNiwgMzI3LCAzMjgsIDMyOSwgMzMwLCAzMzEsIDMzMiwgMzMzLCAzMzQsIDMzNSwgMzM2LCAzMzcsIDMzOCwgMzM5LCAzNDAsIDM0MSwgMzQyLCAzNDMsIDM0NCwgMzQ1LCAzNDYsIDM0NywgMzQ4LCAzNDksIDM1MCwgMzUxLCAzNTIsIDM1MywgMzU0LCAzNTUsIDM1NiwgMzU3LCAzNTgsIDM1OSwgMzYwLCAzNjEsIDM2MiwgMzYzLCAzNjQsIDM2NSwgMzY2LCAzNjcsIDM2OCwgMzY5LCAzNzAsIDM3MSwgMzcyLCAzNzMsIDM3NCwgMzc1LCAzNzYsIDM3NywgMzc4LCAzNzksIDM4MCwgMzgxLCAzODIsIDM4MywgNDAyLCA1MDYsIDUwNywgNTA4LCA1MDksIDUxMCwgNTExLCA1MzYsIDUzNywgNTM4LCA1MzksIDcxMCwgNzExLCA3MTMsIDcyOCwgNzI5LCA3MzAsIDczMSwgNzMyLCA3MzMsIDkwMCwgOTAxLCA5MDIsIDkwMywgOTA0LCA5MDUsIDkwNiwgOTA4LCA5MTAsIDkxMSwgOTEyLCA5MTMsIDkxNCwgOTE1LCA5MTYsIDkxNywgOTE4LCA5MTksIDkyMCwgOTIxLCA5MjIsIDkyMywgOTI0LCA5MjUsIDkyNiwgOTI3LCA5MjgsIDkyOSwgOTMxLCA5MzIsIDkzMywgOTM0LCA5MzUsIDkzNiwgOTM3LCA5MzgsIDkzOSwgOTQwLCA5NDEsIDk0MiwgOTQzLCA5NDQsIDk0NSwgOTQ2LCA5NDcsIDk0OCwgOTQ5LCA5NTAsIDk1MSwgOTUyLCA5NTMsIDk1NCwgOTU1LCA5NTYsIDk1NywgOTU4LCA5NTksIDk2MCwgOTYxLCA5NjIsIDk2MywgOTY0LCA5NjUsIDk2NiwgOTY3LCA5NjgsIDk2OSwgOTcwLCA5NzEsIDk3MiwgOT
20czLCA5NzQsIDEwMjQsIDEwMjUsIDEwMjYsIDEwMjcsIDEwMjgsIDEwMjksIDEwMzAsIDEwMzEsIDEwMzIsIDEwMzMsIDEwMzQsIDEwMzUsIDEwMzYsIDEwMzcsIDEwMzgsIDEwMzksIDEwNDAsIDEwNDEsIDEwNDIsIDEwNDMsIDEwNDQsIDEwNDUsIDEwNDYsIDEwNDcsIDEwNDgsIDEwNDksIDEwNTAsIDEwNTEsIDEwNTIsIDEwNTMsIDEwNTQsIDEwNTUsIDEwNTYsIDEwNTcsIDEwNTgsIDEwNTksIDEwNjAsIDEwNjEsIDEwNjIsIDEwNjMsIDEwNjQsIDEwNjUsIDEwNjYsIDEwNjcsIDEwNjgsIDEwNjksIDEwNzAsIDEwNzEsIDEwNzIsIDEwNzMsIDEwNzQsIDEwNzUsIDEwNzYsIDEwNzcsIDEwNzgsIDEwNzksIDEwODAsIDEwODEsIDEwODIsIDEwODMsIDEwODQsIDEwODUsIDEwODYsIDEwODcsIDEwODgsIDEwODksIDEwOTAsIDEwOTEsIDEwOTIsIDEwOTMsIDEwOTQsIDEwOTUsIDEwOTYsIDEwOTcsIDEwOTgsIDEwOTksIDExMDAsIDExMDEsIDExMDIsIDExMDMsIDExMDQsIDExMDUsIDExMDYsIDExMDcsIDExMDgsIDExMDksIDExMTAsIDExMTEsIDExMTIsIDExMTMsIDExMTQsIDExMTUsIDExMTYsIDExMTcsIDExMTgsIDExMTksIDExMzgsIDExMzksIDExNjgsIDExNjksIDc4MDgsIDc4MDksIDc4MTAsIDc4MTEsIDc4MTIsIDc4MTMsIDc5MjIsIDc5MjMsIDgyMDgsIDgyMDksIDgyMTEsIDgyMTIsIDgyMTMsIDgyMTUsIDgyMTYsIDgyMTcsIDgyMTgsIDgyMTksIDgyMjAsIDgyMjEsIDgyMjIsIDgyMjQsIDgyMjUsIDgyMjYsIDgyMzAsIDgyNDAsIDgyNDIsIDgyNDMsIDgyNDksIDgyNTAsIDgyNTIsIDgyNTQsIDgyNjAsIDgzMTksIDgzNTUsIDgzNTYsIDgzNTksIDgzNjQsIDg0NTMsIDg0NjcsIDg0NzAsIDg0ODIsIDg0ODYsIDg0OTQsIDg1MzksIDg1NDAsIDg1NDEsIDg1NDIsIDg1OTIsIDg1OTMsIDg1OTQsIDg1OTUsIDg1OTYsIDg1OTcsIDg2MTYsIDg3MDYsIDg3MTAsIDg3MTksIDg3MjEsIDg3MjIsIDg3MzAsIDg3MzQsIDg3MzUsIDg3NDUsIDg3NDcsIDg3NzYsIDg4MDAsIDg4MDEsIDg4MDQsIDg4MDUsIDg5NjIsIDg5NzYsIDg5OTIsIDg5OTMsIDk0NzIsIDk0NzQsIDk0ODQsIDk0ODgsIDk0OTIsIDk0OTYsIDk1MDAsIDk1MDgsIDk1MTYsIDk1MjQsIDk1MzIsIDk1NTIsIDk1NTMsIDk1NTQsIDk1NTUsIDk1NTYsIDk1NTcsIDk1NTgsIDk1NTksIDk1NjAsIDk1NjEsIDk1NjIsIDk1NjMsIDk1NjQsIDk1NjUsIDk1NjYsIDk1NjcsIDk1NjgsIDk1NjksIDk1NzAsIDk1NzEsIDk1NzIsIDk1NzMsIDk1NzQsIDk1NzUsIDk1NzYsIDk1NzcsIDk1NzgsIDk1NzksIDk1ODAsIDk2MDAsIDk2MDQsIDk2MDgsIDk2MTIsIDk2MTYsIDk2MTcsIDk2MTgsIDk2MTksIDk2MzIsIDk2MzMsIDk2NDIsIDk2NDMsIDk2NDQsIDk2NTAsIDk2NTgsIDk2NjAsIDk2NjgsIDk2NzQsIDk2NzUsIDk2NzksIDk2ODgsIDk2ODksIDk3MDIsIDk3ODYsIDk3ODcsIDk3ODgsIDk3OTIsIDk3OTQsIDk4MjQsIDk4MjcsIDk4MjksIDk4MzAsIDk4MzQsIDk4MzUsIDk4MzYsIDYxNDQxLCA2MTQ0MiwgNjE0NDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMV07Cgo7Ly8gLi9zcmMvY29yZS9teXJpYWRwcm9fZmFjdG9ycy5qcwpjb25zdCBNeXJpYWRQcm9Cb2xkRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjcyNzA2LCAwLjgwNDc5LCAwLjgzNzM0LCAwLjk4ODk0LCAwLjk5NzkzLCAwLjk4OTcsIDAuOTM4ODQsIDAuODYyMDksIDAuOTQyOTIsIDAuOTQyOTIsIDEuMTY2NjEsIDEuMDIwNTgsIDAuOTM1ODIsIDAuOTY2OTQsIDAuOTM1ODIsIDEuMTkxMzcsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuNzgwNzYsIDAuNzgwNzYsIDEuMDIwNTgsIDEuMDIwNTgsIDEuMDIwNTgsIDAuNzI4NTEsIDAuNzg5NjYsIDAuOTA4MzgsIDAuODM2MzcsIDAuODIzOTEsIDAuOTYzNzYsIDAuODAwNjEsIDAuODYyNzUsIDAuODc2OCwgMC45NTQwNywgMS4wMjU4LCAwLjczOTAxLCAwLjg1MDIyLCAwLjgzNjU1LCAxLjAxNTYsIDAuOTU1NDYsIDAuOTIxNzksIDAuODcxMDcsIDAuOTIxNzksIDAuODIxMTQsIDAuODA5NiwgMC44OTcxMywgMC45NDQzOCwgMC45NTM1MywgMC45NDA4MywgMC45MTkwNSwgMC45MDQwNiwgMC45NDQ2LCAwLjk0MjkyLCAxLjE4Nzc3LCAwLjk0MjkyLCAxLjAyMDU4LCAwLjg5OTAzLCAwLjkwMDg4LCAwLjk0OTM4LCAwLjk3ODk4LCAwLjgxMDkzLCAwLjk3NTcxLCAwLjk0OTM4LCAxLjAyNCwgMC45NTc3LCAwLjk1OTMzLCAwLjk4NjIxLCAxLjA0NzQsIDAuOTc0NTUsIDAuOTg5ODEsIDAuOTY3MiwgMC45NTkzMywgMC45NDQ2LCAwLjk3ODk4LCAwLjk3NDA3LCAwLjk3NjQ2LCAwLjc4MDM2LCAxLjEwMjA4LCAwLjk1NDQyLCAwLjk1Mjk4LCAwLjk3NTc5LCAwLjkzMzIsIDAuOTQwMzksIDAuOTM4LCAwLjgwNjg3LCAxLjAxMTQ5LCAwLjgwNjg3LCAxLjAyMDU4LCAwLjgwNDc5LCAwLjk5NzkzLCAwLjk5NzkzLCAwLjk5NzkzLCAwLjk5NzkzLCAxLjAxMTQ5LCAxLjAwODcyLCAwLjkwMDg4LCAwLjkxODgyLCAxLjAyMTMsIDAuODM2MSwgMS4wMjA1OCwgMC42MjI5NSwgMC41NDMyNCwgMC44OTAyMiwgMS4wODU5NSwgMSwgMSwgMC45MDA4OCwgMSwgMC45NzQ1NSwgMC45MzU4MiwgMC45MDA4OCwgMSwgMS4wNTY4NiwgMC44MzYxLCAwLjk5NjQyLCAwLjk5NjQyLCAwLjk5NjQyLCAwLjcyODUxLCAwLjkwODM4LCAwLjkwODM4LCAwLjkwODM4LCAwLjkwODM4LCAwLjkwODM4LCAwLjkwODM4LCAwLjg2OCwgMC44MjM5MSwgMC44MDA2MSwgMC44MDA2MSwgMC44MDA2MSwgMC44MDA2MSwgMS4wMjU4LCAxLjAyNTgsIDEuMDI1OCwgMS4wMjU4LCAwLjk3NDg0LCAwLjk1NTQ2LCAwLjkyMTc5LCAwLjkyMTc5LCAwLjkyMTc5LCAwLjkyMTc5LCAwLjkyMTc5LCAxLjAyMDU4LCAwLjkyMTc5LCAwLjk0NDM4LCAwLjk0NDM4LCAwLjk0NDM4LCAwLjk0NDM4LCAwLjkwNDA2LCAwLjg2OTU4LCAwLjk4MjI1LCAwLjk0OTM4LCAwLjk0OTM4LCAwLjk0OTM4LCAwLjk0OTM4LCAwLjk0OTM4LCAwLjk0OTM4LCAwLjkwMzEsIDAuODEwOTMsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTg2MjEsIDAuOTg2MjEsIDAuOTg2MjEsIDAuOTg2MjEsIDAuOTM5NjksIDAuOTU5MzMsI
20DAuOTQ0NiwgMC45NDQ2LCAwLjk0NDYsIDAuOTQ0NiwgMC45NDQ2LCAxLjA4NTk1LCAwLjk0NDYsIDAuOTU0NDIsIDAuOTU0NDIsIDAuOTU0NDIsIDAuOTU0NDIsIDAuOTQwMzksIDAuOTc4OTgsIDAuOTQwMzksIDAuOTA4MzgsIDAuOTQ5MzgsIDAuOTA4MzgsIDAuOTQ5MzgsIDAuOTA4MzgsIDAuOTQ5MzgsIDAuODIzOTEsIDAuODEwOTMsIDAuODIzOTEsIDAuODEwOTMsIDAuODIzOTEsIDAuODEwOTMsIDAuODIzOTEsIDAuODEwOTMsIDAuOTYzNzYsIDAuODQzMTMsIDAuOTc0ODQsIDAuOTc1NzEsIDAuODAwNjEsIDAuOTQ5MzgsIDAuODAwNjEsIDAuOTQ5MzgsIDAuODAwNjEsIDAuOTQ5MzgsIDAuODAwNjEsIDAuOTQ5MzgsIDAuODAwNjEsIDAuOTQ5MzgsIDAuODc2OCwgMC45NTc3LCAwLjg3NjgsIDAuOTU3NywgMC44NzY4LCAwLjk1NzcsIDEsIDEsIDAuOTU0MDcsIDAuOTU5MzMsIDAuOTcwNjksIDAuOTU5MzMsIDEuMDI1OCwgMC45ODYyMSwgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDEuMDI1OCwgMC45ODYyMSwgMS4wMjU4LCAwLjk4NjIxLCAwLjg4NywgMS4wMTU5MSwgMC43MzkwMSwgMS4wNDc0LCAxLCAxLCAwLjk3NDU1LCAwLjgzNjU1LCAwLjk4OTgxLCAxLCAxLCAwLjgzNjU1LCAwLjczOTc3LCAwLjgzNjU1LCAwLjczOTAzLCAwLjg0NjM4LCAxLjAzMywgMC45NTU0NiwgMC45NTkzMywgMSwgMSwgMC45NTU0NiwgMC45NTkzMywgMC44MjcxLCAwLjk1NDE3LCAwLjk1OTMzLCAwLjkyMTc5LCAwLjk0NDYsIDAuOTIxNzksIDAuOTQ0NiwgMC45MjE3OSwgMC45NDQ2LCAwLjkzNiwgMC45MTk2NCwgMC44MjExNCwgMC45NzY0NiwgMSwgMSwgMC44MjExNCwgMC45NzY0NiwgMC44MDk2LCAwLjc4MDM2LCAwLjgwOTYsIDAuNzgwMzYsIDEsIDEsIDAuODA5NiwgMC43ODAzNiwgMSwgMSwgMC44OTcxMywgMC43NzQ1MiwgMC44OTcxMywgMS4xMDIwOCwgMC45NDQzOCwgMC45NTQ0MiwgMC45NDQzOCwgMC45NTQ0MiwgMC45NDQzOCwgMC45NTQ0MiwgMC45NDQzOCwgMC45NTQ0MiwgMC45NDQzOCwgMC45NTQ0MiwgMC45NDQzOCwgMC45NTQ0MiwgMC45NDA4MywgMC45NzU3OSwgMC45MDQwNiwgMC45NDAzOSwgMC45MDQwNiwgMC45NDQ2LCAwLjkzOCwgMC45NDQ2LCAwLjkzOCwgMC45NDQ2LCAwLjkzOCwgMSwgMC45OTc5MywgMC45MDgzOCwgMC45NDkzOCwgMC44NjgsIDAuOTAzMSwgMC45MjE3OSwgMC45NDQ2LCAxLCAxLCAwLjg5NzEzLCAxLjEwMjA4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwMDg4LCAwLjkwOTg5LCAwLjkzNTgsIDAuOTE5NDUsIDAuODMxODEsIDAuNzUyNjEsIDAuODc5OTIsIDAuODI5NzYsIDAuOTYwMzQsIDAuODM2ODksIDAuOTcyNjgsIDEuMDA3OCwgMC45MDgzOCwgMC44MzYzNywgMC44MDE5LCAwLjkwMTU3LCAwLjgwMDYxLCAwLjk0NDYsIDAuOTU0MDcsIDAuOTI0MzYsIDEuMDI1OCwgMC44NTAyMiwgMC45NzE1MywgMS4wMTU2LCAwLjk1NTQ2LCAwLjg5MTkyLCAwLjkyMTc5LCAwLjkyMzYxLCAwLjg3MTA3LCAwLjk2MzE4LCAwLjg5NzEzLCAwLjkzNzA0LCAwLjk1NjM4LCAwLjkxOTA1LCAwLjkxNzA5LCAwLjkyNzk2LCAxLjAyNTgsIDAuOTM3MDQsIDAuOTQ4MzYsIDEuMDM3MywgMC45NTkzMywgMS4wMDc4LCAwLjk1ODcxLCAwLjk0ODM2LCAwLjk2MTc0LCAwLjkyNjAxLCAwLjk0OTgsIDAuOTg2MDcsIDAuOTU3NzYsIDAuOTU5MzMsIDEuMDU0NTMsIDEuMDA3OCwgMC45ODI3NSwgMC45MzE0LCAwLjk1NjE3LCAwLjkxNzAxLCAxLjA1OTkzLCAwLjk0NDYsIDAuNzgzNjcsIDAuOTU1MywgMSwgMC44NjgzMiwgMS4wMTI4LCAwLjk1ODcxLCAwLjk5Mzk0LCAwLjg3NTQ4LCAwLjk2MzYxLCAwLjg2Nzc0LCAxLjAwNzgsIDAuOTU4NzEsIDAuOTQ0NiwgMC45NTg3MSwgMC44Njc3NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NDA4MywgMC45NzU3OSwgMC45NDA4MywgMC45NzU3OSwgMC45NDA4MywgMC45NzU3OSwgMC45MDQwNiwgMC45NDAzOSwgMC45NjY5NCwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC45MzU4MiwgMC45MzU4MiwgMC45MzU4MiwgMSwgMC45MDgsIDAuOTA4LCAwLjkxOCwgMC45NDIxOSwgMC45NDIxOSwgMC45NjU0NCwgMSwgMS4yODUsIDEsIDEsIDAuODEwNzksIDAuODEwNzksIDEsIDEsIDAuNzQ4NTQsIDEsIDEsIDEsIDEsIDAuOTk3OTMsIDEsIDEsIDEsIDAuNjUsIDEsIDEuMzYxNDUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMTcxNzMsIDEsIDAuODA1MzUsIDAuNzYxNjksIDEuMDIwNTgsIDEuMDczMiwgMS4wNTQ4NiwgMSwgMSwgMS4zMDY5MiwgMS4wODU5NSwgMS4wODU5NSwgMSwgMS4wODU5NSwgMS4wODU5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4xNjE2MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IE15cmlhZFByb0JvbGRNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKY29uc3QgTXlyaWFkUHJvQm9sZEl0YWxpY0ZhY3RvcnMgPSBbMS4zNjg5OCwgMSwgMSwgMC42NjIyNywgMC44MDc3OSwgMC44MTYyNSwgMC45NzI3NiwgMC45NzI3NiwgMC45NzczMywgMC45MjIyMiwgMC44MzI2NiwgMC45NDI5MiwgMC45NDI5MiwgMS4xNjE0OCwgMS4wMjA1OCwgMC45MzU4MiwgMC45NjY5NCwgMC45MzU4MiwgMS4xNzMzNywgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC43ODA3NiwgMC43ODA3NiwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43MTU0MSwgMC43NjgxMywgMC44NTU3NiwgMC44MDU5MSwgMC44MDcyOSwgMC45NDI5OSwgMC43NzUxMiwgMC44MzY1NSwgMC44NjUyMywgMC45MjIyMiwgMC45ODYyMSwgMC43MTc0MywgMC44MTY5OCwgMC43OTcyNiwgMC45ODU1OCwgMC45MjIyMiwgMC45MDYzNywgMC44MzgwOSwgMC45MDYzNywgMC44MDcyOSwgMC43NjQ2MywgMC44NjI3NSwgMC45MDY5OSwgMC45MTYwNSwgMC45MTU0LCAwLjg1MzA4LCAwLjg1NDU4LCAwLjkwNTMxLCAwLjk0MjkyLCAxLjIxMjk2LCAwLjk0MjkyLCAxLjAyMDU4LCAwLjg5OTAzLCAxLjE4NjE2LCAwLjk5NjEzLCAwLjkxNjc3LCA
20wLjc4MjE2LCAwLjkxNjc3LCAwLjkwMDgzLCAwLjk4Nzk2LCAwLjkxMzUsIDAuOTIxNjgsIDAuOTUzODEsIDAuOTg5ODEsIDAuOTUyOTgsIDAuOTUzODEsIDAuOTM0NTksIDAuOTIxNjgsIDAuOTE1MTMsIDAuOTIwMDQsIDAuOTE2NzcsIDAuOTUwNzcsIDAuNzQ4LCAxLjA0NTAyLCAwLjkxNjc3LCAwLjkyMDYxLCAwLjk0MjM2LCAwLjg5NTQ0LCAwLjg5MzY0LCAwLjksIDAuODA2ODcsIDAuODU3OCwgMC44MDY4NywgMS4wMjA1OCwgMC44MDc3OSwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC44NTc4LCAwLjk5OTczLCAxLjE4NjE2LCAwLjkxMzM5LCAxLjA4MDc0LCAwLjgyODkxLCAxLjAyMDU4LCAwLjU1NTA5LCAwLjcxNTI2LCAwLjg5MDIyLCAxLjA4NTk1LCAxLCAxLCAxLjE4NjE2LCAxLCAwLjk2NzM2LCAwLjkzNTgyLCAxLjE4NjE2LCAxLCAxLjA0ODY0LCAwLjgyNzExLCAwLjk5MDQzLCAwLjk5MDQzLCAwLjk5MDQzLCAwLjcxNTQxLCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg0NSwgMC44MDcyOSwgMC43NzUxMiwgMC43NzUxMiwgMC43NzUxMiwgMC43NzUxMiwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45NTk2MSwgMC45MjIyMiwgMC45MDYzNywgMC45MDYzNywgMC45MDYzNywgMC45MDYzNywgMC45MDYzNywgMS4wMjA1OCwgMC45MDI1MSwgMC45MDY5OSwgMC45MDY5OSwgMC45MDY5OSwgMC45MDY5OSwgMC44NTQ1OCwgMC44MzY1OSwgMC45NDk1MSwgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC44NTgxMSwgMC43ODIxNiwgMC45MDA4MywgMC45MDA4MywgMC45MDA4MywgMC45MDA4MywgMC45NTM4MSwgMC45NTM4MSwgMC45NTM4MSwgMC45NTM4MSwgMC45MTM1LCAwLjkyMTY4LCAwLjkxNTEzLCAwLjkxNTEzLCAwLjkxNTEzLCAwLjkxNTEzLCAwLjkxNTEzLCAxLjA4NTk1LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjg5MzY0LCAwLjkyMzMyLCAwLjg5MzY0LCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg1NTc2LCAwLjk5NjEzLCAwLjgwNzI5LCAwLjc4MjE2LCAwLjgwNzI5LCAwLjc4MjE2LCAwLjgwNzI5LCAwLjc4MjE2LCAwLjgwNzI5LCAwLjc4MjE2LCAwLjk0Mjk5LCAwLjc2NzgzLCAwLjk1OTYxLCAwLjkxNjc3LCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjg2NTIzLCAwLjkxMzUsIDAuODY1MjMsIDAuOTEzNSwgMC44NjUyMywgMC45MTM1LCAxLCAxLCAwLjkyMjIyLCAwLjkyMTY4LCAwLjkyMjIyLCAwLjkyMTY4LCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjg2MDM2LCAwLjk3MDk2LCAwLjcxNzQzLCAwLjk4OTgxLCAxLCAxLCAwLjk1Mjk4LCAwLjc5NzI2LCAwLjk1MzgxLCAxLCAxLCAwLjc5NzI2LCAwLjY4OTQsIDAuNzk3MjYsIDAuNzQzMjEsIDAuODE2OTEsIDEuMDAwNiwgMC45MjIyMiwgMC45MjE2OCwgMSwgMSwgMC45MjIyMiwgMC45MjE2OCwgMC43OTQ2NCwgMC45MjA5OCwgMC45MjE2OCwgMC45MDYzNywgMC45MTUxMywgMC45MDYzNywgMC45MTUxMywgMC45MDYzNywgMC45MTUxMywgMC45MDksIDAuODc1MTQsIDAuODA3MjksIDAuOTUwNzcsIDEsIDEsIDAuODA3MjksIDAuOTUwNzcsIDAuNzY0NjMsIDAuNzQ4LCAwLjc2NDYzLCAwLjc0OCwgMSwgMSwgMC43NjQ2MywgMC43NDgsIDEsIDEsIDAuODYyNzUsIDAuNzI2NTEsIDAuODYyNzUsIDEuMDQ1MDIsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTE1NCwgMC45NDIzNiwgMC44NTQ1OCwgMC44OTM2NCwgMC44NTQ1OCwgMC45MDUzMSwgMC45LCAwLjkwNTMxLCAwLjksIDAuOTA1MzEsIDAuOSwgMSwgMC45NzI3NiwgMC44NTU3NiwgMC45OTYxMywgMC44NDUsIDAuODU4MTEsIDAuOTAyNTEsIDAuOTE2NzcsIDEsIDEsIDAuODYyNzUsIDEuMDQ1MDIsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMDA4OTksIDEuMzA2MjgsIDAuODU1NzYsIDAuODAxNzgsIDAuNjY4NjIsIDAuNzkyNywgMC42OTMyMywgMC44ODEyNywgMC43MjQ1OSwgMC44OTcxMSwgMC45NTM4MSwgMC44NTU3NiwgMC44MDU5MSwgMC43ODA1LCAwLjk0NzI5LCAwLjc3NTEyLCAwLjkwNTMxLCAwLjkyMjIyLCAwLjkwNjM3LCAwLjk4NjIxLCAwLjgxNjk4LCAwLjkyNjU1LCAwLjk4NTU4LCAwLjkyMjIyLCAwLjg1MzU5LCAwLjkwNjM3LCAwLjkwOTc2LCAwLjgzODA5LCAwLjk0NTIzLCAwLjg2Mjc1LCAwLjgzNTA5LCAwLjkzMTU3LCAwLjg1MzA4LCAwLjgzMzkyLCAwLjkyMzQ2LCAwLjk4NjIxLCAwLjgzNTA5LCAwLjkyODg2LCAwLjkxMzI0LCAwLjkyMTY4LCAwLjk1MzgxLCAwLjkwNjQ2LCAwLjkyODg2LCAwLjkwNTU3LCAwLjg2ODQ3LCAwLjkwMjc2LCAwLjkxMzI0LCAwLjg2ODQyLCAwLjkyMTY4LCAwLjk5NTMxLCAwLjk1MzgxLCAwLjkyMjQsIDAuODU0MDgsIDAuOTI2OTksIDAuODY4NDcsIDEuMDA1MSwgMC45MTUxMywgMC44MDQ4NywgMC45MzQ4MSwgMSwgMC44ODE1OSwgMS4wNTIxNCwgMC45MDY0NiwgMC45NzM1NSwgMC44MTUzOSwgMC44OTM5OCwgMC44NTkyMywgMC45NTM4MSwgMC45MDY0NiwgMC45MTUxMywgMC45MDY0NiwgMC44NTkyMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MTU0LCAwLjk0MjM2LCAwLjkxNTQsIDAuOTQyMzYsIDAuOTE1NCwgMC45NDIzNiwgMC44NTQ1OCwgMC44OTM2NCwgMC45NjY5NCwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC45MTc4MiwgMC45MTc4MiwgMC45MTc4MiwgMSwgMC44OTYsIDAuODk2LCAwLjg5NiwgMC45MzMyLCAwLjkzMzIsIDAuOTU5NzMsIDEsIDEuMjYsIDEsIDEsIDAuODA0NzksIDAuODAxNzgsIDEsIDEsIDAuODU2MzMsIDEsIDEsIDEsIDEsIDAuOTcyNzYsIDEsIDEsIDEsIDAuNjk4LCAxLCAxLjM2MTQ1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjE0NTQyLCAxLCAwLjc5MTk5LCAwLjc4Njk0LCAxLjAyMDU4LCAxLjAzNDkzLCAxLjA1NDg2LCAxLCAxLCAxLjIzMDI2LCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjIwMDA2LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgTXlyaWFkUHJvQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yLAogIGxpbmVHYXA6IDAuMgp9Owpjb25zdCBNeXJpYWRQcm9JdGFsaWNGYWN0b3JzID0gWzEuMzY4OTgsIDEsIDEsIDAuNjU1MDcsIDAuODQ5NDMsIDAuODU2MzksIDAuODg0NjUsIDAuODg0NjUsIDAuODY5MzYsIDAuODgzMDcsIDAuODY5NDgsIDAuODUyODMsIDAuODUyODMsIDEuMDYzODMsIDEuMDIwNTgsIDAuNzU5NDUsIDAuOTIxOSwgMC43NTk0NSwgMS4xNzMzNywgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC44ODQ2NSwgMC43NTk0NSwgMC43NTk0NSwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC42OTA0NiwgMC43MDkyNiwgMC44NTE1OCwgMC43NzgxMiwgMC43Njg1MiwgMC44OTU5MSwgMC43MDQ2NiwgMC43NjEyNSwgMC44MDA5NCwgMC44NjgyMiwgMC44Mzg2NCwgMC43MjgsIDAuNzcyMTIsIDAuNzk0NzUsIDAuOTM2MzcsIDAuODc1MTQsIDAuODU4OCwgMC43NjAxMywgMC44NTg4LCAwLjcyNDIxLCAwLjY5ODY2LCAwLjc3NTk4LCAwLjg1OTkxLCAwLjgwODExLCAwLjg3ODMyLCAwLjc4MTEyLCAwLjc3NTEyLCAwLjg1NjIsIDEuMDIyMiwgMS4xODQxNywgMS4wMjIyLCAxLjI3MDE0LCAwLjg5OTAzLCAxLjE1MDEyLCAwLjkzODU5LCAwLjk0Mzk5LCAwLjg0NiwgMC45NDM5OSwgMC44MTQ1MywgMS4wMTg2LCAwLjk0MjE5LCAwLjk2MDE3LCAxLjAzMDc1LCAxLjAyMTc1LCAwLjkxMiwgMS4wMzA3NSwgMC45Njk5OCwgMC45NjAxNywgMC45Mzg1OSwgMC45NDM5OSwgMC45NDM5OSwgMC45NTQ5MywgMC43NDYsIDEuMTI2NTgsIDAuOTQ1NzgsIDAuOTEsIDAuOTc5LCAwLjg4MiwgMC44ODIsIDAuODMsIDAuODUwMzQsIDAuODM1MzcsIDAuODUwMzQsIDEuMDIwNTgsIDAuNzA4NjksIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODM1MzcsIDAuOTAwODMsIDEuMTUwMTIsIDAuOTE2MSwgMC45NDU2NSwgMC43MzU0MSwgMS4wMjA1OCwgMC41MzYwOSwgMC42OTM1MywgMC43OTUxOSwgMS4wODU5NSwgMSwgMSwgMS4xNTAxMiwgMSwgMC45MTk3NCwgMC43NTk0NSwgMS4xNTAxMiwgMSwgMC45NDQ2LCAwLjczMzYxLCAwLjkwMDUsIDAuOTAwNSwgMC45MDA1LCAwLjYyODY0LCAwLjg1MTU4LCAwLjg1MTU4LCAwLjg1MTU4LCAwLjg1MTU4LCAwLjg1MTU4LCAwLjg1MTU4LCAwLjc3MywgMC43Njg1MiwgMC43MDQ2NiwgMC43MDQ2NiwgMC43MDQ2NiwgMC43MDQ2NiwgMC44Mzg2NCwgMC44Mzg2NCwgMC44Mzg2NCwgMC44Mzg2NCwgMC45MDU2MSwgMC44NzUxNCwgMC44NTg4LCAwLjg1ODgsIDAuODU4OCwgMC44NTg4LCAwLjg1ODgsIDEuMDIwNTgsIDAuODU3NTEsIDAuODU5OTEsIDAuODU5OTEsIDAuODU5OTEsIDAuODU5OTEsIDAuNzc1MTIsIDAuNzYwMTMsIDAuODgwNzUsIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDAuODA3NSwgMC44NDYsIDAuODE0NTMsIDAuODE0NTMsIDAuODE0NTMsIDAuODE0NTMsIDAuODI0MjQsIDAuODI0MjQsIDAuODI0MjQsIDAuODI0MjQsIDAuOTI3OCwgMC45NjAxNywgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMC45Mzg1OSwgMS4wODU5NSwgMC44NTYyLCAwLjk0NTc4LCAwLjk0NTc4LCAwLjk0NTc4LCAwLjk0NTc4LCAwLjg4MiwgMC45NDU3OCwgMC44ODIsIDAuODUxNTgsIDAuOTM4NTksIDAuODUxNTgsIDAuOTM4NTksIDAuODUxNTgsIDAuOTM4NTksIDAuNzY4NTIsIDAuODQ2LCAwLjc2ODUyLCAwLjg0NiwgMC43Njg1MiwgMC44NDYsIDAuNzY4NTIsIDAuODQ2LCAwLjg5NTkxLCAwLjg1NDQsIDAuOTA1NjEsIDAuOTQzOTksIDAuNzA0NjYsIDAuODE0NTMsIDAuNzA0NjYsIDAuODE0NTMsIDAuNzA0NjYsIDAuODE0NTMsIDAuNzA0NjYsIDAuODE0NTMsIDAuNzA0NjYsIDAuODE0NTMsIDAuODAwOTQsIDAuOTQyMTksIDAuODAwOTQsIDAuOTQyMTksIDAuODAwOTQsIDAuOTQyMTksIDEsIDEsIDAuODY4MjIsIDAuOTYwMTcsIDAuODY4MjIsIDAuOTYwMTcsIDAuODM4NjQsIDAuODI0MjQsIDAuODM4NjQsIDAuODI0MjQsIDAuODM4NjQsIDAuODI0MjQsIDAuODM4NjQsIDEuMDMwNzUsIDAuODM4NjQsIDAuODI0MjQsIDAuODE0MDIsIDEuMDI3MzgsIDAuNzI4LCAxLjAyMTc1LCAxLCAxLCAwLjkxMiwgMC43OTQ3NSwgMS4wMzA3NSwgMSwgMSwgMC43OTQ3NSwgMC44MzkxMSwgMC43OTQ3NSwgMC42NjI2NiwgMC44MDU1MywgMS4wNjY3NiwgMC44NzUxNCwgMC45NjAxNywgMSwgMSwgMC44NzUxNCwgMC45NjAxNywgMC44Njg2NSwgMC44NzM5NiwgMC45NjAxNywgMC44NTg4LCAwLjkzODU5LCAwLjg1ODgsIDAuOTM4NTksIDAuODU4OCwgMC45Mzg1OSwgMC44NjcsIDAuODQ3NTksIDAuNzI0MjEsIDAuOTU0OTMsIDEsIDEsIDAuNzI0MjEsIDAuOTU0OTMsIDAuNjk4NjYsIDAuNzQ2LCAwLjY5ODY2LCAwLjc0NiwgMSwgMSwgMC42OTg2NiwgMC43NDYsIDEsIDEsIDAuNzc1OTgsIDAuODg0MTcsIDAuNzc1OTgsIDEuMTI2NTgsIDAuODU5OTEsIDAuOTQ1NzgsIDAuODU5OTEsIDAuOTQ1NzgsIDAuODU5OTEsIDAuOTQ1NzgsIDAuODU5OTEsIDAuOTQ1NzgsIDAuODU5OTEsIDAuOTQ1NzgsIDAuODU5OTEsIDAuOTQ1NzgsIDAuODc4MzIsIDAuOTc5LCAwLjc3NTEyLCAwLjg4MiwgMC43NzUxMiwgMC44NTYyLCAwLjgzLCAwLjg1NjIsIDAuODMsIDAuODU2MiwgMC44MywgMSwgMC44ODQ2NSwgMC44NTE1OCwgMC45Mzg1OSwgMC43NzMsIDAuODA3NSwgMC44NTc1MSwgMC44NTYyLCAxLCAxLCAwLjc3NTk4LCAxLjEyNjU4LCAxLjE1MDEyLCAxLjE1MDEyLCAxLjE1MDEyLCAxLjE1MDEyLCAxLjE1MDEyLCAxLjE1MzEzLCAxLjE1MDEyLCAxLjE1MDEyLCAxLjE1MDEyLCAxLjA4MTA2LCAxLjAzOTAxLCAwLjg1MTU4LCAwLjc3MDI1LCAwLjYyMjY0LCAwLjc2NDYsIDAuNjUzNTEsIDAuODYwMjYsIDAuNjk0NjEsIDAuODk5NDcsIDEuMDMwNzUsIDAuODUxNTgsIDAuNzc4MTIsIDAuNzY0NDksIDAuODg4MzYsIDAuNzA0NjYsIDAuODU2MiwgMC44NjgyMiwgMC44NTg4LCAwLjgzODY0LCAwLjc3MjEyLCAwLjg1MzA4LCAwLjkzNjM3LCAwLjg3NTE0LCAwLjgyMzUyLCAwLjg1ODgsIDAuODU3MDEsIDAuNzYwMTMsIDAuODkwNTgsIDAuNzc1OTgsIDAuODE1NiwgMC44MjU2NSwgMC43ODExMiwgMC43Nzg5OSwgMC44OTM4NiwgMC44Mzg2NCwgMC44MTU2LCAwLjk0ODYsIDAuOTIzODgsIDAuOTYxODYsIDEuMDMwNzUsIDAuOTExMjMsIDAuOTQ4NiwgMC45MzI
205OCwgMC44NzgsIDAuOTM5NDIsIDAuOTIzODgsIDAuODQ1OTYsIDAuOTYxODYsIDAuOTUxMTksIDEuMDMwNzUsIDAuOTIyLCAwLjg4Nzg3LCAwLjk1ODI5LCAwLjg4LCAwLjkzNTU5LCAwLjkzODU5LCAwLjc4ODE1LCAwLjkzNzU4LCAxLCAwLjg5MjE3LCAxLjAzNzM3LCAwLjkxMTIzLCAwLjkzOTY5LCAwLjc3NDg3LCAwLjg1NzY5LCAwLjg2Nzk5LCAxLjAzMDc1LCAwLjkxMTIzLCAwLjkzODU5LCAwLjkxMTIzLCAwLjg2Nzk5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg3ODMyLCAwLjk3OSwgMC44NzgzMiwgMC45NzksIDAuODc4MzIsIDAuOTc5LCAwLjc3NTEyLCAwLjg4MiwgMC45MjE5LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjg3MzIxLCAwLjg3MzIxLCAwLjg3MzIxLCAxLCAxLjAyNywgMS4wMjcsIDEuMDI3LCAwLjg2ODQ3LCAwLjg2ODQ3LCAwLjc5MTIxLCAxLCAxLjEyNCwgMSwgMSwgMC43MzU3MiwgMC43MzU3MiwgMSwgMSwgMC44NTAzNCwgMSwgMSwgMSwgMSwgMC44ODQ2NSwgMSwgMSwgMSwgMC42NjksIDEsIDEuMzYxNDUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDQ4MjgsIDEsIDAuNzQ5NDgsIDAuNzUxODcsIDEuMDIwNTgsIDAuOTgzOTEsIDEuMDIxMTksIDEsIDEsIDEuMDYyMzMsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDUyMzMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBNeXJpYWRQcm9JdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKY29uc3QgTXlyaWFkUHJvUmVndWxhckZhY3RvcnMgPSBbMS4zNjg5OCwgMSwgMSwgMC43NjMwNSwgMC44Mjc4NCwgMC45NDkzNSwgMC44OTM2NCwgMC45MjI0MSwgMC44OTA3MywgMC45MDcwNiwgMC45ODQ3MiwgMC44NTI4MywgMC44NTI4MywgMS4wNjY0LCAxLjAyMDU4LCAwLjc0NTA1LCAwLjkyMTksIDAuNzQ1MDUsIDEuMjM0NTYsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuOTIyNDEsIDAuNzQ1MDUsIDAuNzQ1MDUsIDEuMDIwNTgsIDEuMDIwNTgsIDEuMDIwNTgsIDAuNzMwMDIsIDAuNzI2MDEsIDAuOTE3NTUsIDAuODEyNiwgMC44MDMxNCwgMC45MjIyMiwgMC43Mzc2NCwgMC43OTcyNiwgMC44MzA1MSwgMC45MDI4NCwgMC44NjAyMywgMC43NCwgMC44MTI2LCAwLjg0ODY5LCAwLjk2NTE4LCAwLjkxMTE1LCAwLjg4NTgsIDAuNzk3NjEsIDAuODg1OCwgMC43NDQ5OCwgMC43MzkxNCwgMC44MTM2MywgMC44OTU5MSwgMC44MzY1OSwgMC44OTYzMywgMC44NTYwOCwgMC44MTExLCAwLjkwNTMxLCAxLjAyMjIsIDEuMjI3MzYsIDEuMDIyMiwgMS4yNzAxNCwgMC44OTkwMywgMC45MDA4OCwgMC44NjY2NywgMS4wMjMxLCAwLjg5NiwgMS4wMTQxMSwgMC45MDA4MywgMS4wNTA5OSwgMS4wMDUxMiwgMC45OTc5MywgMS4wNTMyNiwgMS4wOTM3NywgMC45MzgsIDEuMDYyMjYsIDEuMDAxMTksIDAuOTk3OTMsIDAuOTg3MTQsIDEuMDIzMSwgMS4wMTIzMSwgMC45ODE5NiwgMC43OTIsIDEuMTkxMzcsIDAuOTkwNzQsIDAuOTYyLCAxLjAxOTE1LCAwLjkyNiwgMC45NDIsIDAuODU2LCAwLjg1MDM0LCAwLjkyMDA2LCAwLjg1MDM0LCAxLjAyMDU4LCAwLjY5MDY3LCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMDA2LCAwLjkzMzIsIDAuOTAwODgsIDAuOTE4ODIsIDAuOTM0ODQsIDAuNzUzMzksIDEuMDIwNTgsIDAuNTY4NjYsIDAuNTQzMjQsIDAuNzk1MTksIDEuMDg1OTUsIDEsIDEsIDAuOTAwODgsIDEsIDAuOTUzMjUsIDAuNzQ1MDUsIDAuOTAwODgsIDEsIDAuOTcxOTgsIDAuNzUzMzksIDAuOTEwMDksIDAuOTEwMDksIDAuOTEwMDksIDAuNjY0NjYsIDAuOTE3NTUsIDAuOTE3NTUsIDAuOTE3NTUsIDAuOTE3NTUsIDAuOTE3NTUsIDAuOTE3NTUsIDAuNzg4LCAwLjgwMzE0LCAwLjczNzY0LCAwLjczNzY0LCAwLjczNzY0LCAwLjczNzY0LCAwLjg2MDIzLCAwLjg2MDIzLCAwLjg2MDIzLCAwLjg2MDIzLCAwLjkyOTE1LCAwLjkxMTE1LCAwLjg4NTgsIDAuODg1OCwgMC44ODU4LCAwLjg4NTgsIDAuODg1OCwgMS4wMjA1OCwgMC44ODU4LCAwLjg5NTkxLCAwLjg5NTkxLCAwLjg5NTkxLCAwLjg5NTkxLCAwLjgxMTEsIDAuNzk2MTEsIDAuODk3MTMsIDAuODY2NjcsIDAuODY2NjcsIDAuODY2NjcsIDAuODY2NjcsIDAuODY2NjcsIDAuODY2NjcsIDAuODY5MzYsIDAuODk2LCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjkwMDgzLCAwLjg0MjI0LCAwLjg0MjI0LCAwLjg0MjI0LCAwLjg0MjI0LCAwLjk3Mjc2LCAwLjk5NzkzLCAwLjk4NzE0LCAwLjk4NzE0LCAwLjk4NzE0LCAwLjk4NzE0LCAwLjk4NzE0LCAxLjA4NTk1LCAwLjg5ODc2LCAwLjk5MDc0LCAwLjk5MDc0LCAwLjk5MDc0LCAwLjk5MDc0LCAwLjk0MiwgMS4wMjMxLCAwLjk0MiwgMC45MTc1NSwgMC44NjY2NywgMC45MTc1NSwgMC44NjY2NywgMC45MTc1NSwgMC44NjY2NywgMC44MDMxNCwgMC44OTYsIDAuODAzMTQsIDAuODk2LCAwLjgwMzE0LCAwLjg5NiwgMC44MDMxNCwgMC44OTYsIDAuOTIyMjIsIDAuOTMzNzIsIDAuOTI5MTUsIDEuMDE0MTEsIDAuNzM3NjQsIDAuOTAwODMsIDAuNzM3NjQsIDAuOTAwODMsIDAuNzM3NjQsIDAuOTAwODMsIDAuNzM3NjQsIDAuOTAwODMsIDAuNzM3NjQsIDAuOTAwODMsIDAuODMwNTEsIDEuMDA1MTIsIDAuODMwNTEsIDEuMDA1MTIsIDAuODMwNTEsIDEuMDA1MTIsIDEsIDEsIDAuOTAyODQsIDAuOTk3OTMsI
20DAuOTA5NzYsIDAuOTk3OTMsIDAuODYwMjMsIDAuODQyMjQsIDAuODYwMjMsIDAuODQyMjQsIDAuODYwMjMsIDAuODQyMjQsIDAuODYwMjMsIDEuMDUzMjYsIDAuODYwMjMsIDAuODQyMjQsIDAuODI4NzMsIDEuMDc0NjksIDAuNzQsIDEuMDkzNzcsIDEsIDEsIDAuOTM4LCAwLjg0ODY5LCAxLjA2MjI2LCAxLCAxLCAwLjg0ODY5LCAwLjgzNzA0LCAwLjg0ODY5LCAwLjgxNDQxLCAwLjg1NTg4LCAxLjA4OTI3LCAwLjkxMTE1LCAwLjk5NzkzLCAxLCAxLCAwLjkxMTE1LCAwLjk5NzkzLCAwLjkxODg3LCAwLjkwOTkxLCAwLjk5NzkzLCAwLjg4NTgsIDAuOTg3MTQsIDAuODg1OCwgMC45ODcxNCwgMC44ODU4LCAwLjk4NzE0LCAwLjg5NCwgMC45MTQzNCwgMC43NDQ5OCwgMC45ODE5NiwgMSwgMSwgMC43NDQ5OCwgMC45ODE5NiwgMC43MzkxNCwgMC43OTIsIDAuNzM5MTQsIDAuNzkyLCAxLCAxLCAwLjczOTE0LCAwLjc5MiwgMSwgMSwgMC44MTM2MywgMC45MDQsIDAuODEzNjMsIDEuMTkxMzcsIDAuODk1OTEsIDAuOTkwNzQsIDAuODk1OTEsIDAuOTkwNzQsIDAuODk1OTEsIDAuOTkwNzQsIDAuODk1OTEsIDAuOTkwNzQsIDAuODk1OTEsIDAuOTkwNzQsIDAuODk1OTEsIDAuOTkwNzQsIDAuODk2MzMsIDEuMDE5MTUsIDAuODExMSwgMC45NDIsIDAuODExMSwgMC45MDUzMSwgMC44NTYsIDAuOTA1MzEsIDAuODU2LCAwLjkwNTMxLCAwLjg1NiwgMSwgMC45MjI0MSwgMC45MTc1NSwgMC44NjY2NywgMC43ODgsIDAuODY5MzYsIDAuODg1OCwgMC44OTg3NiwgMSwgMSwgMC44MTM2MywgMS4xOTEzNywgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDA4OCwgMC45MDM4OCwgMS4wMzkwMSwgMC45MjEzOCwgMC43ODEwNSwgMC43MTU0LCAwLjg2MTY5LCAwLjgwNTEzLCAwLjk0MDA3LCAwLjgyNTI4LCAwLjk4NjEyLCAxLjA2MjI2LCAwLjkxNzU1LCAwLjgxMjYsIDAuODE4ODQsIDAuOTI4MTksIDAuNzM3NjQsIDAuOTA1MzEsIDAuOTAyODQsIDAuODg1OCwgMC44NjAyMywgMC44MTI2LCAwLjkxMTcyLCAwLjk2NTE4LCAwLjkxMTE1LCAwLjgzMDg5LCAwLjg4NTgsIDAuODc3OTEsIDAuNzk3NjEsIDAuODkyOTcsIDAuODEzNjMsIDAuODgxNTcsIDAuODk5OTIsIDAuODU2MDgsIDAuODE5OTIsIDAuOTQzMDcsIDAuODYwMjMsIDAuODgxNTcsIDAuOTUzMDgsIDAuOTg2OTksIDAuOTk3OTMsIDEuMDYyMjYsIDAuOTU4MTcsIDAuOTUzMDgsIDAuOTczNTgsIDAuOTI4LCAwLjk4MDg4LCAwLjk4Njk5LCAwLjkyNzYxLCAwLjk5NzkzLCAwLjk2MDE3LCAxLjA2MjI2LCAwLjk4NiwgMC45NDQsIDAuOTU5NzgsIDAuOTM4LCAwLjk2NzA1LCAwLjk4NzE0LCAwLjgwNDQyLCAwLjk4OTcyLCAxLCAwLjg5NzYyLCAxLjA0NTUyLCAwLjk1ODE3LCAwLjk5MDA3LCAwLjg3MDY0LCAwLjkxODc5LCAwLjg4ODg4LCAxLjA2MjI2LCAwLjk1ODE3LCAwLjk4NzE0LCAwLjk1ODE3LCAwLjg4ODg4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg5NjMzLCAxLjAxOTE1LCAwLjg5NjMzLCAxLjAxOTE1LCAwLjg5NjMzLCAxLjAxOTE1LCAwLjgxMTEsIDAuOTQyLCAwLjkyMTksIDEsIDAuODk5MDMsIDEsIDEsIDEsIDAuOTMxNzMsIDAuOTMxNzMsIDAuOTMxNzMsIDEsIDEuMDYzMDQsIDEuMDYzMDQsIDEuMDY5MDQsIDAuODk5MDMsIDAuODk5MDMsIDAuODA1NDksIDEsIDEuMTU2LCAxLCAxLCAwLjc2NTc1LCAwLjc2NTc1LCAxLCAxLCAwLjcyNDU4LCAxLCAxLCAxLCAxLCAwLjkyMjQxLCAxLCAxLCAxLCAwLjYxOSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNzI1NywgMSwgMC43NDcwNSwgMC43MTExOSwgMS4wMjA1OCwgMS4wMjQsIDEuMDIxMTksIDEsIDEsIDEuMTUzNiwgMS4wODU5NSwgMS4wODU5NSwgMSwgMS4wODU5NSwgMS4wODU5NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNTYzOCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKCjsvLyAuL3NyYy9jb3JlL3NlZ29ldWlfZmFjdG9ycy5qcwpjb25zdCBTZWdvZXVpQm9sZEZhY3RvcnMgPSBbMS43NjczOCwgMSwgMSwgMC45OTI5NywgMC45ODI0LCAxLjA0MDE2LCAxLjA2NDk3LCAxLjAzNDI0LCAwLjk3NTI5LCAxLjE3NjQ3LCAxLjIzMjAzLCAxLjEwODUsIDEuMTA4NSwgMS4xNjkzOSwgMS4yMTA3LCAwLjk3NTQsIDEuMjE0MDgsIDAuOTc1NCwgMS41OTU3OCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMC44MTM3OCwgMC44MTM3OCwgMS4yMTA3LCAxLjIxMDcsIDEuMjEwNywgMC43MTcwMywgMC45Nzg0NywgMC45NzM2MywgMC44ODc3NiwgMC44NjQxLCAxLjAyMDk2LCAwLjc5Nzk1LCAwLjg1MTMyLCAwLjkxNCwgMS4wNjA4NSwgMS4xNDA2LCAwLjgwMDcsIDAuODk4NTgsIDAuODM2OTMsIDEuMTQ4ODksIDEuMDkzOTgsIDAuOTc0ODksIDAuOTIwOTQsIDAuOTc0ODksIDAuOTAzOTksIDAuODQwNDEsIDAuOTU5MjMsIDEuMDAxMzUsIDEsIDEuMDY0NjcsIDAuOTgyNDMsIDAuOTA5OTYsIDAuOTkzNjEsIDEuMTA4NSwgMS41Njk0MiwgMS4xMDg1LCAxLjIxMDcsIDAuNzQ2MjcsIDAuOTQyODIsIDAuOTY3NTIsIDEuMDE1MTksIDAuODYzMDQsIDEuMDEzNTksIDAuOTcyNzgsIDEuMTUxMDMsIDEuMDEzNTksIDAuOTg1NjEsIDEuMDIyODUsIDEuMDIyODUsIDEuMDA1MjcsIDEuMDIyODUsIDEuMDMwMiwgMC45OTA0MSwgMS4wMDA4LCAxLjAxNTE5LCAxLjAxMzU5LCAxLjAyMjU4LCAwLjc5MTA0LCAxLjE2ODYyLCAwLjk5MDQxLCAwLjk3NDU0LCAxLjAyNTExLCAwLjk5Mjk4LCAwLjk2NzUyLCAwLjk1ODAxLCAwLjk0ODU2LCAxLjE2NTc5LCAwLjk0ODU2LCAxLjIxMDcsIDAuOTgyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMSwgMS4wMzQyNCwgMS4xNjU3OSwgMC44NzI3LCAxLjM4NzEsIDEuMTg2MjIsIDEuMTA4MTgsIDEuMDQ0NzgsIDEuMjEwNywgMS4xODYyMiwgMC43NTE1NSwgMC45NDk5NCwgMS4yODgyNiwgMS4yMTQwOCwgMS4yMTQwOCwgMC45MTA1NiwgMSwgMC45MTU3MiwgMC45NzU0LCAwLjY0NjYzLCAxLjE4MzI4LCAxLjI0ODY2LCAxLjA0NDc4LCAxLjE0MTY5LCAxLjE1NzQ5LCAxLjE3Mzg5LCAwLjcxNzAzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjkzNTA2LCAwLjg2NDEsIDAuNzk3OTUsIDAuNzk3OTUsIDAuNzk3OTUsIDAuNzk3OTUsIDEuMTQwNiwgMS4xNDA2LCAxLjE0MDYsIDEuMTQwNiwgMS4wMjA5NiwgMS4wOTM5OCwgMC45NzQyNiwgMC45NzQyNiwgMC45NzQyNiwgMC45NzQyNiwgMC45NzQyNiwgMS4yMTA3LCAwLjk3NDg5LCAxLjAwMTM1LCAxLjAwMTM1LCAxLjAwMTM1LCAxLjAwMTM1LCAwLjkwOTk2LCAwLjkyMDk0LCAxLjAyNzk4LCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjkzMTM2LCAwLjg2MzA0LCAwLjk3Mjc4LCAwLjk3Mjc4LCAwLjk3Mjc4LCAwLjk3Mjc4LCAxLjAyMjg1LCAxLjAyMjg1LCAxLjAyMjg1LCAxLjAyMjg1LCAwLjk3MTIyLCAwLjk5MDQxLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODI2LCAxLjAwMDgsIDAuOTkwNDEsIDAuOTkwNDEsIDAuOTkwNDEsIDAuOTkwNDEsIDAuOTY3NTIsIDEuMDE1MTksIDAuOTY3NTIsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTczNjMsIDAuOTY3NTIsIDAuODY0MSwgMC44NjMwNCwgMC44NjQxLCAwLjg2MzA0LCAwLjg2NDEsIDAuODYzMDQsIDAuODY0MSwgMC44NjMwNCwgMS4wMjA5NiwgMS4wMzA1NywgMS4wMjA5NiwgMS4wMzUxNywgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC45MTQsIDEuMDEzNTksIDAuOTE0LCAxLjAxMzU5LCAwLjkxNCwgMS4wMTM1OSwgMSwgMSwgMS4wNjA4NSwgMC45ODU2MSwgMS4wNjA4NSwgMS4wMDg3OSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDAuOTcxMzgsIDEuMDg2OTIsI
20DAuODAwNywgMS4wMjI4NSwgMSwgMSwgMS4wMDUyNywgMC44MzY5MywgMS4wMjI4NSwgMSwgMSwgMC44MzY5MywgMC45NDU1LCAwLjgzNjkzLCAwLjkwNDE4LCAwLjgzNjkzLCAxLjEzMDA1LCAxLjA5Mzk4LCAwLjk5MDQxLCAxLCAxLCAxLjA5Mzk4LCAwLjk5MDQxLCAwLjk2NjkyLCAxLjA5MjUxLCAwLjk5MDQxLCAwLjk3NDg5LCAxLjAwMDgsIDAuOTc0ODksIDEuMDAwOCwgMC45NzQ4OSwgMS4wMDA4LCAwLjkzOTk0LCAwLjk3OTMxLCAwLjkwMzk5LCAxLjAyMjU4LCAxLCAxLCAwLjkwMzk5LCAxLjAyMjU4LCAwLjg0MDQxLCAwLjc5MTA0LCAwLjg0MDQxLCAwLjc5MTA0LCAwLjg0MDQxLCAwLjc5MTA0LCAwLjg0MDQxLCAwLjc5MTA0LCAxLCAxLCAwLjk1OTIzLCAxLjA3MDM0LCAwLjk1OTIzLCAxLjE2ODYyLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjA2NDY3LCAxLjAyNTExLCAwLjkwOTk2LCAwLjk2NzUyLCAwLjkwOTk2LCAwLjk5MzYxLCAwLjk1ODAxLCAwLjk5MzYxLCAwLjk1ODAxLCAwLjk5MzYxLCAwLjk1ODAxLCAxLjA3NzMzLCAxLjAzNDI0LCAwLjk3MzYzLCAwLjk2NzUyLCAwLjkzNTA2LCAwLjkzMTM2LCAwLjk3NDg5LCAxLjAwMDgsIDEsIDEsIDAuOTU5MjMsIDEuMTY4NjIsIDEuMTUxMDMsIDEuMTUxMDMsIDEuMDExNzMsIDEuMDM5NTksIDAuNzU5NTMsIDAuODEzNzgsIDAuNzk5MTIsIDEuMTUxMDMsIDEuMjE5OTQsIDAuOTUxNjEsIDAuODc4MTUsIDEuMDExNDksIDAuODE1MjUsIDAuNzY3NiwgMC45ODE2NywgMS4wMTEzNCwgMS4wMjU0NiwgMC44NDA5NywgMS4wMzA4OSwgMS4xODEwMiwgMC45NzM2MywgMC44ODc3NiwgMC44NTEzNCwgMC45NzgyNiwgMC43OTc5NSwgMC45OTM2MSwgMS4wNjA4NSwgMC45NzQ4OSwgMS4xNDA2LCAwLjg5ODU4LCAxLjAzODgsIDEuMTQ4ODksIDEuMDkzOTgsIDAuODYwMzksIDAuOTc0ODksIDEuMDU5NSwgMC45MjA5NCwgMC45NDc5MywgMC45NTkyMywgMC45MDk5NiwgMC45OTM0NiwgMC45ODI0MywgMS4wMjExMiwgMC45NTQ5MywgMS4xNDA2LCAwLjkwOTk2LCAxLjAzNTc0LCAxLjAyNTk3LCAxLjAwMDgsIDEuMTgxMDIsIDEuMDY2MjgsIDEuMDM1NzQsIDEuMDE5MiwgMS4wMTkzMiwgMS4wMDg4NiwgMC45NzUzMSwgMS4wMTA2LCAxLjAwMDgsIDEuMTMxODksIDEuMTgxMDIsIDEuMDIyNzcsIDAuOTg2ODMsIDEuMDAxNiwgMC45OTU2MSwgMS4wNzIzNywgMS4wMDA4LCAwLjkwNDM0LCAwLjk5OTIxLCAwLjkzODAzLCAwLjg5NjUsIDEuMjMwODUsIDEuMDY2MjgsIDEuMDQ5ODMsIDAuOTYyNjgsIDEuMDQ5OSwgMC45ODQzOSwgMS4xODEwMiwgMS4wNjYyOCwgMS4wMDA4LCAxLjA2NjI4LCAwLjk4NDM5LCAwLjc5Nzk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA5NDY2LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk3Mjc4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjAyMDY1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA2NDY3LCAxLjAyNTExLCAxLjA2NDY3LCAxLjAyNTExLCAxLjA2NDY3LCAxLjAyNTExLCAwLjkwOTk2LCAwLjk2NzUyLCAxLCAxLjIxNDA4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAxLjA0Mzk0LCAxLjA0Mzk0LCAxLjA0Mzk0LCAxLjA0Mzk0LCAwLjk4NjMzLCAwLjk4NjMzLCAwLjk4NjMzLCAwLjczMDQ3LCAwLjczMDQ3LCAxLjIwNjQyLCAwLjkxMjExLCAxLjI1NjM1LCAxLjIyMiwgMS4wMjk1NiwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NjAzOSwgMS4yNDYzMywgMSwgMS4xMjQ1NCwgMC45MzUwMywgMS4wMzQyNCwgMS4xOTY4NywgMS4wMzQyNCwgMSwgMSwgMSwgMC43NzEsIDEsIDEsIDEuMTU3NDksIDEuMTU3NDksIDEuMTU3NDksIDEuMTA5NDgsIDAuODYyNzksIDAuOTQ0MzQsIDAuODYyNzksIDAuOTQ0MzQsIDAuODYxODIsIDEsIDEsIDEuMTY4OTcsIDEsIDAuOTYwODUsIDAuOTAxMzcsIDEuMjEwNywgMS4xODQxNiwgMS4xMzk3MywgMC42OTgyNSwgMC45NzE2LCAyLjEwMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLjIxMTcyLCAxLjI5MDA0LCAxLjI5MDA0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4ODc0LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMDkxOTMsIDEuMDkxOTMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBTZWdvZXVpQm9sZE1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmNvbnN0IFNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk4OTQ2LCAxLjAzOTU5LCAxLjA0MDE2LCAxLjAyODA5LCAxLjAzNiwgMC45NzYzOSwgMS4xMDk1MywgMS4yMzIwMywgMS4xMTE0NCwgMS4xMTE0NCwgMS4xNjkzOSwgMS4yMTIzNywgMC45NzU0LCAxLjIxMjYxLCAwLjk3NTQsIDEuNTk3NTQsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAwLjgxMzc4LCAwLjgxMzc4LCAxLjIxMjM3LCAxLjIxMjM3LCAxLjIxMjM3LCAwLjczNTQxLCAwLjk3ODQ3LCAwLjk3MzYzLCAwLjg5NzIzLCAwLjg3ODk3LCAxLjA0MjYsIDAuNzk0MjksIDAuODUyOTIsIDAuOTExNDksIDEuMDU4MTUsIDEuMTQwNiwgMC43OTYzMSwgMC45MDEyOCwgMC44Mzg1MywgMS4wNDM5NiwgMS4xMDYxNSwgMC45NzU1MiwgMC45NDQzNiwgMC45NzU1MiwgMC44ODY0MSwgMC44MDUyNywgMC45NjA4MywgMS4wMDEzNSwgMSwgMS4wNjc3NywgMC45ODE3LCAwLjkxMTQyLCAwLjk5MzYxLCAxLjExMTQ0LCAxLjU3MjkzLCAxLjExMTQ0LCAxLjIxMjM3LCAwLjc0NjI3LCAxLjMxODE4LCAxLjA2NTg1LCAwLjk3MDQyLCAwLjgzMDU1LCAwLjk3MDQyLCAwLjkzNTAzLCAxLjEyNjEsIDAuOTcwNDIsIDAuOTc5MjIsIDEuMTQyMzYsIDAuOTQ1NTIsIDEuMDEwNTQsIDEuMTQyMzYsIDEuMDI0NzEsIDAuOTc5MjIsIDAuOTQxNjUsIDAuOTcwNDIsIDAuOTcwNDIsIDEuMDI3NiwgMC43ODkyOSwgMS4xMjYxLCAwLjk3OTIyLCAwLjk1ODc0LCAxLjAyMTk3LCAwLjk4NTA3LCAwLjk2NzUyLCAwLjk3MTY4LCA
20wLjk1MTA3LCAxLjE2NTc5LCAwLjk1MTA3LCAxLjIxMjM3LCAxLjAzOTU5LCAxLjAzNiwgMS4wMzYsIDEsIDEuMDM2LCAxLjE2NTc5LCAwLjg3MzU3LCAxLjMxODE4LCAxLjE4NzU0LCAxLjI2NzgxLCAxLjA1MzU2LCAxLjIxMjM3LCAxLjE4NjIyLCAwLjc5NDg3LCAwLjk0OTk0LCAxLjI5MDA0LCAxLjI0MDQ3LCAxLjI0MDQ3LCAxLjMxODE4LCAxLCAwLjkxNDg0LCAwLjk3NTQsIDEuMzE4MTgsIDEuMTM0OSwgMS4yNDg2NiwgMS4wNTM1NiwgMS4xMzkzNCwgMS4xNTU3NCwgMS4xNzM4OSwgMC43MzU0MSwgMC45NzM2MywgMC45NzM2MywgMC45NzM2MywgMC45NzM2MywgMC45NzM2MywgMC45NzM2MywgMC45NDM4NSwgMC44Nzg5NywgMC43OTQyOSwgMC43OTQyOSwgMC43OTQyOSwgMC43OTQyOSwgMS4xNDA2LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjA0MjYsIDEuMTA2MTUsIDAuOTc1NTIsIDAuOTc1NTIsIDAuOTc1NTIsIDAuOTc1NTIsIDAuOTc1NTIsIDEuMjEyMzcsIDAuOTc1NTIsIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDEuMDAxMzUsIDAuOTExNDIsIDAuOTQ0MzYsIDAuOTg3MjEsIDEuMDY1ODUsIDEuMDY1ODUsIDEuMDY1ODUsIDEuMDY1ODUsIDEuMDY1ODUsIDEuMDY1ODUsIDAuOTY3MDUsIDAuODMwNTUsIDAuOTM1MDMsIDAuOTM1MDMsIDAuOTM1MDMsIDAuOTM1MDMsIDEuMTQyMzYsIDEuMTQyMzYsIDEuMTQyMzYsIDEuMTQyMzYsIDAuOTMxMjUsIDAuOTc5MjIsIDAuOTQxNjUsIDAuOTQxNjUsIDAuOTQxNjUsIDAuOTQxNjUsIDAuOTQxNjUsIDEuMjkwMDQsIDAuOTQxNjUsIDAuOTc5MjIsIDAuOTc5MjIsIDAuOTc5MjIsIDAuOTc5MjIsIDAuOTY3NTIsIDAuOTcwNDIsIDAuOTY3NTIsIDAuOTczNjMsIDEuMDY1ODUsIDAuOTczNjMsIDEuMDY1ODUsIDAuOTczNjMsIDEuMDY1ODUsIDAuODc4OTcsIDAuODMwNTUsIDAuODc4OTcsIDAuODMwNTUsIDAuODc4OTcsIDAuODMwNTUsIDAuODc4OTcsIDAuODMwNTUsIDEuMDQyNiwgMS4wMDMzLCAxLjA0MjYsIDAuOTcwNDIsIDAuNzk0MjksIDAuOTM1MDMsIDAuNzk0MjksIDAuOTM1MDMsIDAuNzk0MjksIDAuOTM1MDMsIDAuNzk0MjksIDAuOTM1MDMsIDAuNzk0MjksIDAuOTM1MDMsIDAuOTExNDksIDAuOTcwNDIsIDAuOTExNDksIDAuOTcwNDIsIDAuOTExNDksIDAuOTcwNDIsIDEsIDEsIDEuMDU4MTUsIDAuOTc5MjIsIDEuMDU4MTUsIDAuOTc5MjIsIDEuMTQwNiwgMS4xNDIzNiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDEuMTQwNiwgMS4xNDIzNiwgMS4xNDA2LCAxLjE0MjM2LCAwLjk3NDQxLCAxLjA0MzAyLCAwLjc5NjMxLCAxLjAxNTgyLCAxLCAxLCAxLjAxMDU0LCAwLjgzODUzLCAxLjE0MjM2LCAxLCAxLCAwLjgzODUzLCAxLjA5MTI1LCAwLjgzODUzLCAwLjkwNDE4LCAwLjgzODUzLCAxLjE5NTA4LCAxLjEwNjE1LCAwLjk3OTIyLCAxLCAxLCAxLjEwNjE1LCAwLjk3OTIyLCAxLjAxMDM0LCAxLjEwNDY2LCAwLjk3OTIyLCAwLjk3NTUyLCAwLjk0MTY1LCAwLjk3NTUyLCAwLjk0MTY1LCAwLjk3NTUyLCAwLjk0MTY1LCAwLjkxNjAyLCAwLjkxOTgxLCAwLjg4NjQxLCAxLjAyNzYsIDEsIDEsIDAuODg2NDEsIDEuMDI3NiwgMC44MDUyNywgMC43ODkyOSwgMC44MDUyNywgMC43ODkyOSwgMC44MDUyNywgMC43ODkyOSwgMC44MDUyNywgMC43ODkyOSwgMSwgMSwgMC45NjA4MywgMS4wNTQwMywgMC45NTkyMywgMS4xNjg2MiwgMS4wMDEzNSwgMC45NzkyMiwgMS4wMDEzNSwgMC45NzkyMiwgMS4wMDEzNSwgMC45NzkyMiwgMS4wMDEzNSwgMC45NzkyMiwgMS4wMDEzNSwgMC45NzkyMiwgMS4wMDEzNSwgMC45NzkyMiwgMS4wNjc3NywgMS4wMjE5NywgMC45MTE0MiwgMC45Njc1MiwgMC45MTE0MiwgMC45OTM2MSwgMC45NzE2OCwgMC45OTM2MSwgMC45NzE2OCwgMC45OTM2MSwgMC45NzE2OCwgMS4yMzE5OSwgMS4wMzYsIDAuOTczNjMsIDEuMDY1ODUsIDAuOTQzODUsIDAuOTY3MDUsIDAuOTc1NTIsIDAuOTQxNjUsIDEsIDEsIDAuOTYwODMsIDEuMTI2MSwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMS4zMTgxOCwgMC45NTE2MSwgMS4yNzEyNiwgMS4wMDgxMSwgMC44MzI4NCwgMC43NzcwMiwgMC45OTEzNywgMC45NTI1MywgMS4wMzQ3LCAwLjg2MTQyLCAxLjA3MjA1LCAxLjE0MjM2LCAwLjk3MzYzLCAwLjg5NzIzLCAwLjg2ODY5LCAxLjA5ODE4LCAwLjc5NDI5LCAwLjk5MzYxLCAxLjA1ODE1LCAwLjk3NTUyLCAxLjE0MDYsIDAuOTAxMjgsIDEuMDY2NjIsIDEuMDQzOTYsIDEuMTA2MTUsIDAuODQ5MTgsIDAuOTc1NTIsIDEuMDQ2OTQsIDAuOTQ0MzYsIDAuOTgwMTUsIDAuOTYwODMsIDAuOTExNDIsIDEuMDAzNTYsIDAuOTgxNywgMS4wMTk0NSwgMC45ODk5OSwgMS4xNDA2LCAwLjkxMTQyLCAxLjA0OTYxLCAwLjk4OTgsIDEuMDA2MzksIDEuMTQyMzYsIDEuMDc1MTQsIDEuMDQ5NjEsIDAuOTk2MDcsIDEuMDI4OTcsIDEuMDA4LCAwLjk4OTgsIDAuOTUxMzQsIDEuMDA2MzksIDEuMTExMjEsIDEuMTQyMzYsIDEuMDA1MTgsIDAuOTc5ODEsIDEuMDIxODYsIDEsIDEuMDg1NzgsIDAuOTQxNjUsIDAuOTkzMTQsIDAuOTgzODcsIDAuOTMwMjgsIDAuOTMzNzcsIDEuMzUxMjUsIDEuMDc1MTQsIDEuMTA2ODcsIDAuOTM0OTEsIDEuMDQyMzIsIDEuMDAzNTEsIDEuMTQyMzYsIDEuMDc1MTQsIDAuOTQxNjUsIDEuMDc1MTQsIDEuMDAzNTEsIDAuNzk0MjksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDkwOTcsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTM1MDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTY2MDksIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDY3NzcsIDEuMDIxOTcsIDEuMDY3NzcsIDEuMDIxOTcsIDEuMDY3NzcsIDEuMDIxOTcsIDAuOTExNDIsIDAuOTY3NTIsIDEsIDEuMjEyNjEsIDAuODk5MDMsIDEsIDEsIDAuNzUxNTUsIDEuMDQ3NDUsIDEuMDQ3NDUsIDEuMDQ3NDUsIDEuMDQzOTQsIDAuOTg2MzMsIDAuOTg2MzMsIDAuOTg2MzMsIDAuNzI5NTksIDAuNzI5NTksIDEuMjA1MDIsIDAuOTE0MDYsIDEuMjY1MTQsIDEuMjIyLCAxLjAyOTU2LCAxLjAzMzcyLCAxLjAzMzcyLCAwLjk2MDM5LCAxLjI0NjMzLCAxLCAxLjA5MTI1LCAwLjkzMzI3LCAxLjAzMzM2LCAxLjE2NTQxLCAxLjAzNiwgMSwgMSwgMSwgMC43NzEsIDEsIDEsIDEuMTU1NzQsIDEuMTU1NzQsIDEuMTU1NzQsIDEuMTU1NzQsIDAuODYzNjQsIDAuOTQ0MzQsIDAuODYyNzksIDAuOTQ0MzQsIDAuODYyMj
20QsIDEsIDEsIDEuMTY3OTgsIDEsIDAuOTYwODUsIDAuOTAwNjgsIDEuMjEyMzcsIDEuMTg0MTYsIDEuMTM5MDQsIDAuNjk4MjUsIDAuOTcxNiwgMi4xMDMzOSwgMS4yOTAwNCwgMS4yOTAwNCwgMS4yMTMzOSwgMS4yOTAwNCwgMS4yOTAwNCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS40MjYwMywgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMC44NzAyNSwgMS4xODc3NSwgMS40MjYwMywgMSwgMS40MjYwMywgMS40MjYwMywgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4yODg2LCAxLjA0MzE1LCAxLjE1Mjk2LCAxLjM0MTYzLCAxLCAxLCAxLCAxLjEzMjY5LCAxLjEzMjY5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKY29uc3QgU2Vnb2V1aUJvbGRJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzMwMDgsCiAgbGluZUdhcDogMAp9Owpjb25zdCBTZWdvZXVpSXRhbGljRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk4OTQ2LCAxLjE0NzYzLCAxLjA1MzY1LCAxLjA2MjM0LCAwLjk2OTI3LCAwLjkyNTg2LCAxLjE1MzczLCAxLjE4NDE0LCAwLjkxMzQ5LCAwLjkxMzQ5LCAxLjA3NDAzLCAxLjE3MzA4LCAwLjc4MzgzLCAxLjIwMDg4LCAwLjc4MzgzLCAxLjQyNTMxLCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjc4MzgzLCAwLjc4MzgzLCAxLjE3MzA4LCAxLjE3MzA4LCAxLjE3MzA4LCAwLjc3MzQ5LCAwLjk0NTY1LCAwLjk0NzI5LCAwLjg1OTQ0LCAwLjg4NTA2LCAwLjk4NTgsIDAuNzQ4MTcsIDAuODAwMTYsIDAuODg0NDksIDAuOTgwMzksIDAuOTU3ODIsIDAuNjkyMzgsIDAuODk4OTgsIDAuODMyMzEsIDAuOTgxODMsIDEuMDM5ODksIDAuOTY5MjQsIDAuODYyMzcsIDAuOTY5MjQsIDAuODA1OTUsIDAuNzQ1MjQsIDAuODYwOTEsIDAuOTU0MDIsIDAuOTQxNDMsIDAuOTg0NDgsIDAuODg1OCwgMC44MzA4OSwgMC45MzI4NSwgMS4wOTQ5LCAxLjM5MDE2LCAxLjA5NDksIDEuNDU5OTQsIDAuNzQ2MjcsIDEuMDQ4MzksIDAuOTc0NTQsIDAuOTc0NTQsIDAuODcyMDcsIDAuOTc0NTQsIDAuODc1MzMsIDEuMDYxNTEsIDAuOTc0NTQsIDEuMDAxNzYsIDEuMTY0ODQsIDEuMDgxMzIsIDAuOTgwNDcsIDEuMTY0ODQsIDEuMDI5ODksIDEuMDEwNTQsIDAuOTYyMjUsIDAuOTc0NTQsIDAuOTc0NTQsIDEuMDY1OTgsIDAuNzkwMDQsIDEuMTYzNDQsIDEuMDAzNTEsIDAuOTQ2MjksIDAuOTk3MywgMC45MTAxNiwgMC45Njc3NywgMC45MDQzLCAwLjkxMDgyLCAwLjkyNDgxLCAwLjkxMDgyLCAxLjE3MzA4LCAwLjk1NzQ4LCAwLjk2OTI3LCAwLjk2OTI3LCAxLCAwLjk2OTI3LCAwLjkyNDgxLCAwLjgwNTk3LCAxLjA0ODM5LCAxLjIzMzkzLCAxLjE3ODEsIDAuOTI0NSwgMS4xNzMwOCwgMS4yMDgwOCwgMC42MzIxOCwgMC45NDI2MSwgMS4yNDgyMiwgMS4wOTk3MSwgMS4wOTk3MSwgMS4wNDgzOSwgMSwgMC44NTI3MywgMC43ODAzMiwgMS4wNDgzOSwgMS4wOTk3MSwgMS4yMjMyNiwgMC45MjQ1LCAxLjA5ODM2LCAxLjEzNTI1LCAxLjE1MjIyLCAwLjcwNDI0LCAwLjk0NzI5LCAwLjk0NzI5LCAwLjk0NzI5LCAwLjk0NzI5LCAwLjk0NzI5LCAwLjk0NzI5LCAwLjg1NDk4LCAwLjg4NTA2LCAwLjc0ODE3LCAwLjc0ODE3LCAwLjc0ODE3LCAwLjc0ODE3LCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk4NTgsIDEuMDM5ODksIDAuOTY5MjQsIDAuOTY5MjQsIDAuOTY5MjQsIDAuOTY5MjQsIDAuOTY5MjQsIDEuMTczMDgsIDAuOTY5MjQsIDAuOTU0MDIsIDAuOTU0MDIsIDAuOTU0MDIsIDAuOTU0MDIsIDAuODMwODksIDAuODYyMzcsIDAuODg0MDksIDAuOTc0NTQsIDAuOTc0NTQsIDAuOTc0NTQsIDAuOTc0NTQsIDAuOTc0NTQsIDAuOTc0NTQsIDAuOTI5MTYsIDAuODcyMDcsIDAuODc1MzMsIDAuODc1MzMsIDAuODc1MzMsIDAuODc1MzMsIDAuOTMxNDYsIDAuOTMxNDYsIDAuOTMxNDYsIDAuOTMxNDYsIDAuOTM4NTQsIDEuMDEwNTQsIDAuOTYyMjUsIDAuOTYyMjUsIDAuOTYyMjUsIDAuOTYyMjUsIDAuOTYyMjUsIDEuMjQ4MjIsIDAuODc2MSwgMS4wMDM1MSwgMS4wMDM1MSwgMS4wMDM1MSwgMS4wMDM1MSwgMC45Njc3NywgMC45NzQ1NCwgMC45Njc3NywgMC45NDcyOSwgMC45NzQ1NCwgMC45NDcyOSwgMC45NzQ1NCwgMC45NDcyOSwgMC45NzQ1NCwgMC44ODUwNiwgMC44NzIwNywgMC44ODUwNiwgMC44NzIwNywgMC44ODUwNiwgMC44NzIwNywgMC44ODUwNiwgMC44NzIwNywgMC45ODU4LCAwLjk1MzkxLCAwLjk4NTgsIDAuOTc0NTQsIDAuNzQ4MTcsIDAuODc1MzMsIDAuNzQ4MTcsIDAuODc1MzMsIDAuNzQ4MTcsIDAuODc1MzMsIDAuNzQ4MTcsIDAuODc1MzMsIDAuNzQ4MTcsIDAuODc1MzMsIDAuODg0NDksIDAuOTc0NTQsIDAuODg0NDksIDAuOTc0NTQsIDAuODg0NDksIDAuOTc0NTQsIDEsIDEsIDAuOTgwMzksIDEuMDAxNzYsIDAuOTgwMzksIDEuMDAxNzYsIDAuOTU3ODIsIDAuOTMxNDYsIDAuOTU3ODIsIDAuOTMxNDYsIDAuOTU3ODIsIDAuOTMxNDYsIDAuOTU3ODIsIDEuMTY0ODQsIDAuOTU3ODIsIDAuOTMxNDYsIDAuODQ0MjEsIDEuMTI3NjEsIDAuNjkyMzgsIDEuMDgxMzIsIDEsIDEsIDAuOTgwNDcsIDAuODMyMzEsIDEuMTY0ODQsIDEsIDEsIDAuODQ3MjMsIDEuMDQ4NjEsIDAuODQ3MjMsIDAuNzg3NTUsIDAuODMyMzEsIDEuMjM3MzYsIDEuMDM5ODksIDEuMDEwNTQsIDEsIDEsIDEuMDM5ODksIDEuMDEwNTQsIDAuOTg1NywgMS4wMzg0OSwgMS4wMTA1NCwgMC45NjkyNCwgMC45NjIyNSwgMC45NjkyNCwgMC45NjIyNSwgMC45NjkyNCwgMC45NjIyNSwgMC45MjM4MywgMC45MDE3MSwgMC44MDU5NSwgMS4wNjU5OCwgMSwgMSwgMC44MDU5NSwgMS4wNjU5OCwgMC43NDUyNCwgMC43OTAwNCwgMC43NDUyNCwgMC43OTAwNCwgMC43NDUyNCwgMC43OTAwNCwgMC43NDUyNCwgMC43OTAwNCwgMSwgMSwgMC44NjA5MSwgMS4wMjc1OSwgMC44NTc3MSwgMS4xNjM0NCwgMC45NTQwMiwgMS4wMDM1MSwgMC45NTQwMiwgMS4wMDM1MSwgMC45NTQwMiwgMS4wMDM1MSwgMC45NTQwMiwgMS4wMDM1MSwgMC45NTQwMiwgMS4wMDM1MSwgMC45NTQwMiwgMS4wMDM1MSwgMC45ODQ0OCwgMC45OTczLCAwLjgzMDg5LCAwLjk2Nzc3LCAwLjgzMDg5LCAwLjkzMjg1LCAwLjkwNDMsIDAuOTMyODUsIDAuOTA0MywgMC45MzI4NSwgMC45MDQzLCAxLjMxODY4LCAwLjk2OTI3LCA
20wLjk0NzI5LCAwLjk3NDU0LCAwLjg1NDk4LCAwLjkyOTE2LCAwLjk2OTI0LCAwLjg3NjEsIDEsIDEsIDAuODYwOTEsIDEuMTYzNDQsIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDEuMDQ4MzksIDAuODE5NjUsIDAuODE5NjUsIDAuOTQ3MjksIDAuNzgwMzIsIDAuNzEwMjIsIDAuOTA4ODMsIDAuODQxNzEsIDAuOTk4NzcsIDAuNzc1OTYsIDEuMDU3MzQsIDEuMiwgMC45NDcyOSwgMC44NTk0NCwgMC44Mjc5MSwgMC45NjA3LCAwLjc0ODE3LCAwLjkzMjg1LCAwLjk4MDM5LCAwLjk2OTI0LCAwLjk1NzgyLCAwLjg5ODk4LCAwLjk4MzE2LCAwLjk4MTgzLCAxLjAzOTg5LCAwLjc4NjE0LCAwLjk2OTI0LCAwLjk3NjQyLCAwLjg2MjM3LCAwLjg2MDc1LCAwLjg2MDkxLCAwLjgzMDg5LCAwLjkwMDgyLCAwLjg4NTgsIDAuOTcyOTYsIDEuMDEyODQsIDAuOTU3ODIsIDAuODMwODksIDEuMDk3NiwgMS4wNCwgMS4wMzM0MiwgMS4yLCAxLjA2NzUsIDEuMDk3NiwgMC45ODIwNSwgMS4wMzgwOSwgMS4wNTA5NywgMS4wNCwgMC45NTM2NCwgMS4wMzM0MiwgMS4wNTQwMSwgMS4yLCAxLjAyMTQ4LCAxLjAxMTksIDEuMDQ3MjQsIDEuMDEyNywgMS4wMjczMiwgMC45NjIyNSwgMC44OTY1LCAwLjk3NzgzLCAwLjkzNTc0LCAwLjk0ODE4LCAxLjMwNjc5LCAxLjA2NzUsIDEuMTE4MjYsIDAuOTk4MjEsIDEuMDU1NywgMS4wMzI2LCAxLjIsIDEuMDY3NSwgMC45NjIyNSwgMS4wNjc1LCAxLjAzMjYsIDAuNzQ4MTcsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDM3NTQsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODc1MzMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTg3MDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTg0NDgsIDAuOTk3MywgMC45ODQ0OCwgMC45OTczLCAwLjk4NDQ4LCAwLjk5NzMsIDAuODMwODksIDAuOTY3NzcsIDEsIDEuMjAwODgsIDAuODk5MDMsIDEsIDEsIDAuNzUxNTUsIDAuOTQ5NDUsIDAuOTQ5NDUsIDAuOTQ5NDUsIDAuOTQ5NDUsIDEuMTIzMTcsIDEuMTIzMTcsIDEuMTIzMTcsIDAuNjc2MDMsIDAuNjc2MDMsIDEuMTU2MjEsIDAuNzM1ODQsIDEuMjExOTEsIDEuMjIxMzUsIDEuMDY0ODMsIDAuOTQ4NjgsIDAuOTQ4NjgsIDAuOTU5OTYsIDEuMjQ2MzMsIDEsIDEuMDc0OTcsIDAuODc3MDksIDAuOTY5MjcsIDEuMDE0NzMsIDAuOTY5MjcsIDEsIDEsIDEsIDAuNzcyOTUsIDEsIDEsIDEuMDk4MzYsIDEuMDk4MzYsIDEuMDk4MzYsIDEuMDE1MjIsIDAuODYzMjEsIDAuOTQ0MzQsIDAuODY0OSwgMC45NDQzNCwgMC44NjE4MiwgMSwgMSwgMS4wODMsIDEsIDAuOTE1NzgsIDAuODY0MzgsIDEuMTczMDgsIDEuMTg0MTYsIDEuMTQ1ODksIDAuNjk4MjUsIDAuOTc2MjIsIDEuOTY3OTEsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEuMTczMDgsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTc5ODQsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4xMDc0MiwgMS4xMDc0MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmNvbnN0IFNlZ29ldWlJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzMwMDgsCiAgbGluZUdhcDogMAp9Owpjb25zdCBTZWdvZXVpUmVndWxhckZhY3RvcnMgPSBbMS43NjczOCwgMSwgMSwgMC45ODU5NCwgMS4wMjI4NSwgMS4xMDQ1NCwgMS4wNjIzNCwgMC45NjkyNywgMC45MjAzNywgMS4xOTk4NSwgMS4yMDQ2LCAwLjkwNjE2LCAwLjkwNjE2LCAxLjA3MTUyLCAxLjE3MTQsIDAuNzgwMzIsIDEuMjAwODgsIDAuNzgwMzIsIDEuNDAyNDYsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuNzgwMzIsIDAuNzgwMzIsIDEuMTcxNCwgMS4xNzE0LCAxLjE3MTQsIDAuODA1OTcsIDAuOTQwODQsIDAuOTY3MDYsIDAuODU5NDQsIDAuODU3MzQsIDAuOTcwOTMsIDAuNzU4NDIsIDAuNzk5MzYsIDAuODgxOTgsIDAuOTgzMSwgMC45NTc4MiwgMC43MTM4NywgMC44Njk2OSwgMC44NDYzNiwgMS4wNzc5NiwgMS4wMzU4NCwgMC45NjkyNCwgMC44Mzk2OCwgMC45NjkyNCwgMC44MjgyNiwgMC43OTY0OSwgMC44NTc3MSwgMC45NTEzMiwgMC45MzExOSwgMC45ODk2NSwgMC44ODQzMywgMC44Mjg3LCAwLjkzMzY1LCAxLjA4NjEyLCAxLjM2MzgsIDEuMDg2MTIsIDEuNDU3ODYsIDAuNzQ2MjcsIDAuODA0OTksIDAuOTE0ODQsIDEuMDU3MDcsIDAuOTIzODMsIDEuMDU4ODIsIDAuOTQwMywgMS4xMjY1NCwgMS4wNTg4MiwgMS4wMTc1NiwgMS4wOTAxMSwgMS4wOTAxMSwgMC45OTQxNCwgMS4wOTAxMSwgMS4wMzQsIDEuMDE3NTYsIDEuMDUzNTYsIDEuMDU3MDcsIDEuMDU4ODIsIDEuMDQzOTksIDAuODQ4NjMsIDEuMjE5NjgsIDEuMDE3NTYsIDAuOTU4MDEsIDEuMDAwNjgsIDAuOTE3OTcsIDAuOTY3NzcsIDAuOTA0MywgMC45MDM1MSwgMC45MjEwNSwgMC45MDM1MSwgMS4xNzE0LCAwLjg1MzM3LCAwLjk2OTI3LCAwLjk2OTI3LCAwLjk5OTEyLCAwLjk2OTI3LCAwLjkyMTA1LCAwLjgwNTk3LCAxLjI0MzQsIDEuMjA4MDgsIDEuMDU5MzcsIDAuOTA5NTcsIDEuMTcxNCwgMS4yMDgwOCwgMC43NTE1NSwgMC45NDI2MSwgMS4yNDY0NCwgMS4wOTk3MSwgMS4wOTk3MSwgMC44NDc1MSwgMSwgMC44NTI3MywgMC43ODAzMiwgMC42MTU4NCwgMS4wNTQyNSwgMS4xNzkxNCwgMC45MDk1NywgMS4wODY2NSwgMS4xMTU5MywgMS4xNDE2OSwgMC43MzM4MSwgMC45NjcwNiwgMC45NjcwNiwgMC45NjcwNiwgMC45NjcwNiwgMC45NjcwNiwgMC45NjcwNiwgMC44NjAzNSwgMC44NTczNCwgMC43NTg0MiwgMC43NTg0MiwgMC43NTg0MiwgMC43NTg0MiwgMC45NTc4MiwgMC45NTc4MiwgMC45NTc4MiwgMC45NTc4MiwgMC45NzA5MywgMS4wMzU4NCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMC45NjkyNCwgMS4xNzE0LCAwLjk2OTI0LCAwLjk1MTMyLCAwLjk1MTMyLCAwLjk1MTMyLCAwLjk1MTMyLCAwLjgyODcsIDAuODM5NjgsIDAuODkwNDksIDAuOTE0ODQsIDAuOTE0ODQsIDAuOTE0ODQsIDAuOTE0ODQsIDAuOTE0ODQsIDAuOTE0ODQsIDAuOTM1NzUsIDAuOTIzODMsIDAuOTQwMywgMC45NDAzLCAwLjk0MDMsIDAuOTQwMywgMC44NzE3LCAwLjg3MTcsIDAuODcxNywgMC44NzE3LCAxLjAwNTI3LCAxLjAxNzU2LCAxLjA1MzU2LCAxLjA1MzU2LCAxLjA1MzU2LCAxLjA1MzU2LCAxLjA1MzU2LCAxLjI0NjQ0LCAwLjk1OTIzLCAxLjAxNzU2LCAxLjAxNzU2LCAxLjAxNzU2LCAxLjAxNzU2LCAwLjk2Nzc3LCAxLjA1NzA3LCAwLjk2Nzc3LCAwLjk2NzA2LCAwLjkxNDg0LCAwLjk2NzA2LCAwLjkxNDg0LCAwLjk2NzA2LCAwLjkxNDg0LCAwLjg1NzM0LCAwLjkyMzgzLCAwLjg1NzM0LCAwLjkyMzgzLCAwLjg1NzM0LCAwLjkyMzgzLCAwLjg1NzM0LCAwLjkyMzgzLCAwLjk3MDkzLCAxLjA5NjksIDAuOTcwOTMsIDEuMDU4ODIsIDAuNzU4NDIsIDAuOTQwMywgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuNzU4NDIsIDAuOTQwMywgMC43NTg0MiwgMC45NDAzLCAwLjg4MTk4LCAxLjA1ODgyLCAwLjg4MTk4LCAxLjA1ODgyLCAwLjg4MTk4LCAxLjA1ODgyLCAxLCAxLCAwLjk4MzEsIDEuMDE3NTYsIDAuOTgzMSwgMS4wMTc1NiwgMC45NTc4MiwgMC44NzE3LCAwLjk1NzgyLCAwLjg3MTcsIDAuOTU3ODIsIDAuODcxNywgMC45NTc4MiwgMS4wOTAxMSwgMC45NTc4MiwgMC44NzE3LCAwLjg0Nzg0LCAxLjExNTUxLCAwLjcxMzg3LCAxLjA5MDExLCAxLCAxLCAwLjk5NDE0LCAwLjg0NjM2LCAxLjA5MDExLCAxLCAxLCAwLjg0NjM2LCAxLjA1MzYsIDAuODQ2MzYsIDAuOTQyOTgsIDAuODQ2MzYsIDEuMjMyOTcsIDEuMDM1ODQsIDEuMDE3NTYsIDEsIDEsIDEuMDM1ODQsIDEuMDE3NTYsIDEuMDAzMjMsIDEuMDM0NDQsIDEuMDE3NTYsIDAuOTY5MjQsIDEuMDUzNTYsIDAuOTY5MjQsIDEuMDUzNTYsIDAuOTY5MjQsIDEuMDUzNTYsIDAuOTMwNjYsIDAuOTgyOTMsIDAuODI4MjYsIDEuMDQzOTksIDEsIDEsIDAuODI4MjYsIDEuMDQzOTksIDAuNzk2NDksIDAuODQ4NjMsIDAuNzk2NDksIDAuODQ4NjMsIDAuNzk2NDksIDAuODQ4NjMsIDAuNzk2NDksIDAuODQ4NjMsIDEsIDEsIDAuODU3NzEsIDEuMTczMTgsIDAuODU3NzEsIDEuMjE5NjgsIDAuOTUxMzIsIDEuMDE3NTYsIDAuOTUxMzIsIDEuMDE3NTYsIDAuOTUxMzIsIDEuMDE3NTYsIDAuOTUxMzIsIDEuMDE3NTYsIDAuOTUxMzIsIDEuMDE3NTYsIDAuOTUxMzIsIDEuMDE3NTYsIDAuOTg5NjUsIDEuMDAwNjgsIDAuODI4NywgMC45Njc3NywgMC44Mjg3LCAwLjkzMzY1LCAwLjkwNDMsIDAuOTMzNjUsIDAuOTA0MywgMC45MzM2NSwgMC45MDQzLCAxLjA4NTcxLCAwLjk2OTI3LCA
20wLjk2NzA2LCAwLjkxNDg0LCAwLjg2MDM1LCAwLjkzNTc1LCAwLjk2OTI0LCAwLjk1OTIzLCAxLCAxLCAwLjg1NzcxLCAxLjIxOTY4LCAxLjExNDM3LCAxLjExNDM3LCAwLjkzMTA5LCAwLjkxMjAyLCAwLjYwNDExLCAwLjg0MTY0LCAwLjU1NTcyLCAxLjAxMTczLCAwLjk3MzYxLCAwLjgxODE4LCAwLjgxODE4LCAwLjk2NjM1LCAwLjc4MDMyLCAwLjcyNzI3LCAwLjkyMzY2LCAwLjk4NjAxLCAxLjAzNDA1LCAwLjc3OTY4LCAxLjA5Nzk5LCAxLjIsIDAuOTY3MDYsIDAuODU5NDQsIDAuODU2MzgsIDAuOTY0OTEsIDAuNzU4NDIsIDAuOTMzNjUsIDAuOTgzMSwgMC45NjkyNCwgMC45NTc4MiwgMC44Njk2OSwgMC45NDE1MiwgMS4wNzc5NiwgMS4wMzU4NCwgMC43ODQzNywgMC45NjkyNCwgMC45ODcxNSwgMC44Mzk2OCwgMC44MzQ5MSwgMC44NTc3MSwgMC44Mjg3LCAwLjk0NDkyLCAwLjg4NDMzLCAwLjkyODcsIDEuMDA5OCwgMC45NTc4MiwgMC44Mjg3LCAxLjA2MjUsIDAuOTgyNDgsIDEuMDM0MjQsIDEuMiwgMS4wMTA3MSwgMS4wNjI1LCAwLjk1MjQ2LCAxLjAzODA5LCAxLjA0OTEyLCAwLjk4MjQ4LCAxLjAwMjIxLCAxLjAzNDI0LCAxLjA1NDQzLCAxLjIsIDEuMDQ3ODUsIDAuOTk2MDksIDEuMDAxNjksIDEuMDUxNzYsIDAuOTkzNDYsIDEuMDUzNTYsIDAuOTA4NywgMS4wMzAwNCwgMC45NTU0MiwgMC45MzExNywgMS4yMzM2MiwgMS4wMTA3MSwgMS4wNzgzMSwgMS4wMjUxMiwgMS4wNTIwNSwgMS4wMzUwMiwgMS4yLCAxLjAxMDcxLCAxLjA1MzU2LCAxLjAxMDcxLCAxLjAzNTAyLCAwLjc1ODQyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjAzNzE5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk0MDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDQwMjEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTg5NjUsIDEuMDAwNjgsIDAuOTg5NjUsIDEuMDAwNjgsIDAuOTg5NjUsIDEuMDAwNjgsIDAuODI4NywgMC45Njc3NywgMSwgMS4yMDA4OCwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMS4wMzA3NywgMS4wMzA3NywgMS4wMzA3NywgMS4wMzA3NywgMS4xMzE5NiwgMS4xMzE5NiwgMS4xMzE5NiwgMC42NzQyOCwgMC42NzQyOCwgMS4xNjAzOSwgMC43MzI5MSwgMS4yMDk5NiwgMS4yMjEzNSwgMS4wNjQ4MywgMC45NDg2OCwgMC45NDg2OCwgMC45NTk5NiwgMS4yNDYzMywgMSwgMS4wNzQ5NywgMC44Nzc5NiwgMC45NjkyNywgMS4wMTUxOCwgMC45NjkyNywgMSwgMSwgMSwgMC43NzI5NSwgMSwgMSwgMS4xMDUzOSwgMS4xMDUzOSwgMS4xMTM1OCwgMS4wNjk2NywgMC44NjI3OSwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjE4MiwgMSwgMSwgMS4wODMsIDEsIDAuOTE1NzgsIDAuODY1MDcsIDEuMTcxNCwgMS4xODQxNiwgMS4xNDU4OSwgMC42OTgyNSwgMC45NzYyMiwgMS45Njk3LCAxLjI0ODIyLCAxLjI0ODIyLCAxLjE3MjM4LCAxLjI0ODIyLCAxLjI0ODIyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4MDgzLCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMTA5MzgsIDEuMTA5MzgsIDEsIDEsIDEsIDEuMDU0MjUsIDEuMDk5NzEsIDEuMDk5NzEsIDEuMDk5NzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpjb25zdCBTZWdvZXVpUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07Cgo7Ly8gLi9zcmMvY29yZS94ZmFfZm9udHMuanMKCgoKCgoKCgoKCmNvbnN0IGdldFhGQUZvbnRNYXAgPSBnZXRMb29rdXBUYWJsZUZhY3RvcnkoZnVuY3Rpb24gKHQpIHsKICB0WyJNeXJpYWRQcm8tUmVndWxhciJdID0gdFsiUGRmSlMtRmFsbGJhY2stUmVndWxhciJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogTXlyaWFkUHJvUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tQm9sZCJdID0gdFsiUGRmSlMtRmFsbGJhY2stQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogTXlyaWFkUHJvQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IE15cmlhZFByb0JvbGRNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tSXQiXSA9IHRbIk15cmlhZFByby1JdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsCiAgICBmYWN0b3JzOiBNeXJpYWRQcm9JdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogTXlyaWFkUHJvSXRhbGljTWV0cmljcwogIH07CiAgdFsiTXlyaWFkUHJvLUJvbGRJdCJdID0gdFsiTXlyaWFkUHJvLUJvbGRJdGFsaWMiXSA9IHRbIlBkZkpTLUZhbGxiYWNrLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGZhY3RvcnM6IE15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcwogIH07CiAgdC5BcmlhbE1UID0gdC5BcmlhbCA9IHRbIkFyaWFsLVJlZ3VsYXIiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1Cb2xkTVQiXSA9IHRbIkFyaWFsLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zQm9sZFdpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gdFsiQXJpYWwtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGJhc2VXaWR0aHM6IExpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IExpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZwogIH07CiAgdFsiQXJpYWwtQm9sZEl0YWxpY01UIl0gPSB0WyJBcmlhbC1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZwogIH07CiAgdFsiQ2FsaWJyaS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBDYWxpYnJpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogQ2FsaWJyaUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBDYWxpYnJpSXRhbGljTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBDYWxpYnJpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IENhbGlicmlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBTZWdvZXVpUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogU2Vnb2V1aUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBTZWdvZXVpSXRhbGljTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBTZWdvZXVpQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IFNlZ29ldWlCb2xkSXRhbGljTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLVJlZ3VsYXIiXSA9IHQuSGVsdmV0aWNhID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgZmFjdG9yczogSGVsdmV0aWNhUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYVJlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGZhY3RvcnM6IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBIZWx2ZXRpY2FJdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJIZWx2ZXRpY2EtQm9sZEl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLAogICAgZmFjdG9yczogSGVsdmV0aWNhQm9sZEl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IEhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzCiAgfTsKfSk7CmZ1bmN0aW9uIGdldFhmYUZvbnROYW1lKG5
20hbWUpIHsKICBjb25zdCBmb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKG5hbWUpOwogIGNvbnN0IGZvbnRNYXAgPSBnZXRYRkFGb250TWFwKCk7CiAgcmV0dXJuIGZvbnRNYXBbZm9udE5hbWVdOwp9CmZ1bmN0aW9uIGdldFhmYUZvbnRXaWR0aHMobmFtZSkgewogIGNvbnN0IGluZm8gPSBnZXRYZmFGb250TmFtZShuYW1lKTsKICBpZiAoIWluZm8pIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCB7CiAgICBiYXNlV2lkdGhzLAogICAgYmFzZU1hcHBpbmcsCiAgICBmYWN0b3JzCiAgfSA9IGluZm87CiAgY29uc3QgcmVzY2FsZWRCYXNlV2lkdGhzID0gIWZhY3RvcnMgPyBiYXNlV2lkdGhzIDogYmFzZVdpZHRocy5tYXAoKHcsIGkpID0+IHcgKiBmYWN0b3JzW2ldKTsKICBsZXQgY3VycmVudENvZGUgPSAtMjsKICBsZXQgY3VycmVudEFycmF5OwogIGNvbnN0IG5ld1dpZHRocyA9IFtdOwogIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSW5kZXhdIG9mIGJhc2VNYXBwaW5nLm1hcCgoY2hhclVuaWNvZGUsIGluZGV4KSA9PiBbY2hhclVuaWNvZGUsIGluZGV4XSkuc29ydCgoW3VuaWNvZGUxXSwgW3VuaWNvZGUyXSkgPT4gdW5pY29kZTEgLSB1bmljb2RlMikpIHsKICAgIGlmICh1bmljb2RlID09PSAtMSkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICh1bmljb2RlID09PSBjdXJyZW50Q29kZSArIDEpIHsKICAgICAgY3VycmVudEFycmF5LnB1c2gocmVzY2FsZWRCYXNlV2lkdGhzW2dseXBoSW5kZXhdKTsKICAgICAgY3VycmVudENvZGUgKz0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRDb2RlID0gdW5pY29kZTsKICAgICAgY3VycmVudEFycmF5ID0gW3Jlc2NhbGVkQmFzZVdpZHRoc1tnbHlwaEluZGV4XV07CiAgICAgIG5ld1dpZHRocy5wdXNoKHVuaWNvZGUsIGN1cnJlbnRBcnJheSk7CiAgICB9CiAgfQogIHJldHVybiBuZXdXaWR0aHM7Cn0KZnVuY3Rpb24gZ2V0WGZhRm9udERpY3QobmFtZSkgewogIGNvbnN0IHdpZHRocyA9IGdldFhmYUZvbnRXaWR0aHMobmFtZSk7CiAgY29uc3QgZGljdCA9IG5ldyBEaWN0KG51bGwpOwogIGRpY3Quc2V0KCJCYXNlRm9udCIsIE5hbWUuZ2V0KG5hbWUpKTsKICBkaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250IikpOwogIGRpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkNJREZvbnRUeXBlMiIpKTsKICBkaWN0LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICBkaWN0LnNldCgiQ0lEVG9HSURNYXAiLCBOYW1lLmdldCgiSWRlbnRpdHkiKSk7CiAgZGljdC5zZXQoIlciLCB3aWR0aHMpOwogIGRpY3Quc2V0KCJGaXJzdENoYXIiLCB3aWR0aHNbMF0pOwogIGRpY3Quc2V0KCJMYXN0Q2hhciIsIHdpZHRocy5hdCgtMikgKyB3aWR0aHMuYXQoLTEpLmxlbmd0aCAtIDEpOwogIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgRGljdChudWxsKTsKICBkaWN0LnNldCgiRm9udERlc2NyaXB0b3IiLCBkZXNjcmlwdG9yKTsKICBjb25zdCBzeXN0ZW1JbmZvID0gbmV3IERpY3QobnVsbCk7CiAgc3lzdGVtSW5mby5zZXQoIk9yZGVyaW5nIiwgIklkZW50aXR5Iik7CiAgc3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgc3lzdGVtSW5mby5zZXQoIlN1cHBsZW1lbnQiLCAwKTsKICBkaWN0LnNldCgiQ0lEU3lzdGVtSW5mbyIsIHN5c3RlbUluZm8pOwogIHJldHVybiBkaWN0Owp9Cgo7Ly8gLi9zcmMvY29yZS9wc19wYXJzZXIuanMKCgoKCmNsYXNzIFBvc3RTY3JpcHRQYXJzZXIgewogIGNvbnN0cnVjdG9yKGxleGVyKSB7CiAgICB0aGlzLmxleGVyID0gbGV4ZXI7CiAgICB0aGlzLm9wZXJhdG9ycyA9IFtdOwogICAgdGhpcy50b2tlbiA9IG51bGw7CiAgICB0aGlzLnByZXYgPSBudWxsOwogIH0KICBuZXh0VG9rZW4oKSB7CiAgICB0aGlzLnByZXYgPSB0aGlzLnRva2VuOwogICAgdGhpcy50b2tlbiA9IHRoaXMubGV4ZXIuZ2V0VG9rZW4oKTsKICB9CiAgYWNjZXB0KHR5cGUpIHsKICAgIGlmICh0aGlzLnRva2VuLnR5cGUgPT09IHR5cGUpIHsKICAgICAgdGhpcy5uZXh0VG9rZW4oKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGV4cGVjdCh0eXBlKSB7CiAgICBpZiAodGhpcy5hY2NlcHQodHlwZSkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuZXhwZWN0ZWQgc3ltYm9sOiBmb3VuZCAke3RoaXMudG9rZW4udHlwZX0gZXhwZWN0ZWQgJHt0eXBlfS5gKTsKICB9CiAgcGFyc2UoKSB7CiAgICB0aGlzLm5leHRUb2tlbigpOwogICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFKTsKICAgIHRoaXMucGFyc2VCbG9jaygpOwogICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKICAgIHJldHVybiB0aGlzLm9wZXJhdG9yczsKICB9CiAgcGFyc2VCbG9jaygpIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5OVU1CRVIpKSB7CiAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SKSkgewogICAgICAgIHRoaXMub3BlcmF0b3JzLnB1c2godGhpcy5wcmV2LnZhbHVlKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CiAgICAgICAgdGhpcy5wYXJzZUNvbmRpdGlvbigpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogIH0KICBwYXJzZUNvbmRpdGlvbigpIHsKICAgIGNvbnN0IGNvbmRpdGlvbkxvY2F0aW9uID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOwogICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKICAgIHRoaXMucGFyc2VCbG9jaygpOwogICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKICAgIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRikpIHsKICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb25dID0gdGh
20pcy5vcGVyYXRvcnMubGVuZ3RoOwogICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbiArIDFdID0gImp6IjsKICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuTEJSQUNFKSkgewogICAgICBjb25zdCBqdW1wTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICAgIHRoaXMub3BlcmF0b3JzLnB1c2gobnVsbCwgbnVsbCk7CiAgICAgIGNvbnN0IGVuZE9mVHJ1ZSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLlJCUkFDRSk7CiAgICAgIHRoaXMuZXhwZWN0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGRUxTRSk7CiAgICAgIHRoaXMub3BlcmF0b3JzW2p1bXBMb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICAgIHRoaXMub3BlcmF0b3JzW2p1bXBMb2NhdGlvbiArIDFdID0gImoiOwogICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSBlbmRPZlRydWU7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQUyBGdW5jdGlvbjogZXJyb3IgcGFyc2luZyBjb25kaXRpb25hbC4iKTsKICAgIH0KICB9Cn0KY29uc3QgUG9zdFNjcmlwdFRva2VuVHlwZXMgPSB7CiAgTEJSQUNFOiAwLAogIFJCUkFDRTogMSwKICBOVU1CRVI6IDIsCiAgT1BFUkFUT1I6IDMsCiAgSUY6IDQsCiAgSUZFTFNFOiA1Cn07CmNsYXNzIFBvc3RTY3JpcHRUb2tlbiB7CiAgc3RhdGljIGdldCBvcENhY2hlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3BDYWNoZSIsIE9iamVjdC5jcmVhdGUobnVsbCkpOwogIH0KICBjb25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkgewogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICB9CiAgc3RhdGljIGdldE9wZXJhdG9yKG9wKSB7CiAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLm9wQ2FjaGVbb3BdIHx8PSBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLk9QRVJBVE9SLCBvcCk7CiAgfQogIHN0YXRpYyBnZXQgTEJSQUNFKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiTEJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UsICJ7IikpOwogIH0KICBzdGF0aWMgZ2V0IFJCUkFDRSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIlJCUkFDRSIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFLCAifSIpKTsKICB9CiAgc3RhdGljIGdldCBJRigpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIklGIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5JRiwgIklGIikpOwogIH0KICBzdGF0aWMgZ2V0IElGRUxTRSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIklGRUxTRSIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFLCAiSUZFTFNFIikpOwogIH0KfQpjbGFzcyBQb3N0U2NyaXB0TGV4ZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSkgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLm5leHRDaGFyKCk7CiAgICB0aGlzLnN0ckJ1ZiA9IFtdOwogIH0KICBuZXh0Q2hhcigpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBnZXRUb2tlbigpIHsKICAgIGxldCBjb21tZW50ID0gZmFsc2U7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGNoIDwgMCkgewogICAgICAgIHJldHVybiBFT0Y7CiAgICAgI
20H0KICAgICAgaWYgKGNvbW1lbnQpIHsKICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKICAgICAgICAgIGNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjUpIHsKICAgICAgICBjb21tZW50ID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICghaXNXaGl0ZVNwYWNlKGNoKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgfQogICAgc3dpdGNoIChjaCB8IDApIHsKICAgICAgY2FzZSAweDMwOgogICAgICBjYXNlIDB4MzE6CiAgICAgIGNhc2UgMHgzMjoKICAgICAgY2FzZSAweDMzOgogICAgICBjYXNlIDB4MzQ6CiAgICAgIGNhc2UgMHgzNToKICAgICAgY2FzZSAweDM2OgogICAgICBjYXNlIDB4Mzc6CiAgICAgIGNhc2UgMHgzODoKICAgICAgY2FzZSAweDM5OgogICAgICBjYXNlIDB4MmI6CiAgICAgIGNhc2UgMHgyZDoKICAgICAgY2FzZSAweDJlOgogICAgICAgIHJldHVybiBuZXcgUG9zdFNjcmlwdFRva2VuKFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUiwgdGhpcy5nZXROdW1iZXIoKSk7CiAgICAgIGNhc2UgMHg3YjoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5MQlJBQ0U7CiAgICAgIGNhc2UgMHg3ZDoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5SQlJBQ0U7CiAgICB9CiAgICBjb25zdCBzdHJCdWYgPSB0aGlzLnN0ckJ1ZjsKICAgIHN0ckJ1Zi5sZW5ndGggPSAwOwogICAgc3RyQnVmWzBdID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NWEgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdhKSkgewogICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICB9CiAgICBjb25zdCBzdHIgPSBzdHJCdWYuam9pbigiIik7CiAgICBzd2l0Y2ggKHN0ci50b0xvd2VyQ2FzZSgpKSB7CiAgICAgIGNhc2UgImlmIjoKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLklGOwogICAgICBjYXNlICJpZmVsc2UiOgogICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUZFTFNFOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uZ2V0T3BlcmF0b3Ioc3RyKTsKICAgIH0KICB9CiAgZ2V0TnVtYmVyKCkgewogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDApIHsKICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSB8fCBjaCA9PT0gMHgyZCB8fCBjaCA9PT0gMHgyZSkgewogICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHN0ckJ1Zi5qb2luKCIiKSk7CiAgICBpZiAoaXNOYU4odmFsdWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXI6ICR7dmFsdWV9YCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9pbWFnZV91dGlscy5qcwoKCgoKCgoKCgpjbGFzcyBCYXNlTG9jYWxDYWNoZSB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgdGhpcy5fb25seVJlZnMgPSBvcHRpb25zPy5vbmx5UmVmcyA9PT0gdHJ1ZTsKICAgIGlmICghdGhpcy5fb25seVJlZnMpIHsKICAgICAgdGhpcy5fbmFtZVJlZk1hcCA9IG5ldyBNYXAoKTsKICAgICAgdGhpcy5faW1hZ2VNYXAgPSBuZXcgTWFwKCk7CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgfQogIGdldEJ5TmFtZShuYW1lKSB7CiAgICBpZiAodGhpcy5fb25seVJlZnMpIHsKICAgICAgdW5yZWFjaGFibGUoIlNob3VsZCBub3QgY2FsbCBgZ2V0QnlOYW1lYCBtZXRob2QuIik7CiAgICB9CiAgICBjb25zdCByZWYgPSB0aGlzLl9uYW1lUmVmTWFwLmdldChuYW1lKTsKICAgIGlmIChyZWYpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlSZWYocmVmKTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9pbWFnZU1hcC5nZXQobmFtZSkgfHwgbnVsbDsKICB9CiAgZ2V0QnlSZWYocmVmKSB7CiAgICByZXR1cm4gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKSB8fCBudWxsOwogIH0KICBzZXQobmFtZSwgcmVmLCBkYXRhKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBzZXRgIGNhbGxlZC4iKTsKICB9Cn0KY2xhc3MgTG9jYWxJbWFnZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lLCByZWYgPSBudWxsLCBkYXRhKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxJbWFnZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmIChyZWYpIHsKICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7CiAgfQp9CmNsYXNzIExvY2FsQ29sb3JTcGFjZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lID0gbnVsbCwgcmVmID0gbnVsbCwgZGF0YSkgewogICAgaWYgKHR5cGVvZiBuYW1lICE9PSAic3RyaW5nIiAmJiAhcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgIm5hbWUiIGFuZC9vciAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmIChyZWYpIHsKICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgICByZXR1cm47CiAgICAgI
20H0KICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHsKICAgICAgICB0aGlzLl9uYW1lUmVmTWFwLnNldChuYW1lLCByZWYpOwogICAgICB9CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpjbGFzcyBMb2NhbEZ1bmN0aW9uQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoewogICAgICBvbmx5UmVmczogdHJ1ZQogICAgfSk7CiAgfQogIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CiAgICBpZiAoIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsRnVuY3Rpb25DYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQp9CmNsYXNzIExvY2FsR1N0YXRlQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CiAgc2V0KG5hbWUsIHJlZiA9IG51bGwsIGRhdGEpIHsKICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbEdTdGF0ZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmIChyZWYpIHsKICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7CiAgfQp9CmNsYXNzIExvY2FsVGlsaW5nUGF0dGVybkNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKHsKICAgICAgb25seVJlZnM6IHRydWUKICAgIH0pOwogIH0KICBzZXQobmFtZSA9IG51bGwsIHJlZiwgZGF0YSkgewogICAgaWYgKCFyZWYpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbFRpbGluZ1BhdHRlcm5DYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQp9CmNsYXNzIFJlZ2lvbmFsSW1hZ2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignUmVnaW9uYWxJbWFnZUNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9Cn0KY2xhc3MgR2xvYmFsSW1hZ2VDYWNoZSB7CiAgc3RhdGljIE5VTV9QQUdFU19USFJFU0hPTEQgPSAyOwogIHN0YXRpYyBNSU5fSU1BR0VTX1RPX0NBQ0hFID0gMTA7CiAgc3RhdGljIE1BWF9CWVRFX1NJWkUgPSA1ICogTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEU7CiAgI2RlY29kZUZhaWxlZFNldCA9IG5ldyBSZWZTZXQoKTsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuX3JlZkNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICB0aGlzLl9pbWFnZUNhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgfQogIGdldCAjYnl0ZVNpemUoKSB7CiAgICBsZXQgYnl0ZVNpemUgPSAwOwogICAgZm9yIChjb25zdCBpbWFnZURhdGEgb2YgdGhpcy5faW1hZ2VDYWNoZSkgewogICAgICBieXRlU2l6ZSArPSBpbWFnZURhdGEuYnl0ZVNpemU7CiAgICB9CiAgICByZXR1cm4gYnl0ZVNpemU7CiAgfQogIGdldCAjY2FjaGVMaW1pdFJlYWNoZWQoKSB7CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5NSU5fSU1BR0VTX1RPX0NBQ0hFKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLiNieXRlU2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTUFYX0JZVEVfU0laRSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgc2hvdWxkQ2FjaGUocmVmLCBwYWdlSW5kZXgpIHsKICAgIGxldCBwYWdlSW5kZXhTZXQgPSB0aGlzLl9yZWZDYWNoZS5nZXQocmVmKTsKICAgIGlmICghcGFnZUluZGV4U2V0KSB7CiAgICAgIHBhZ2VJbmRleFNldCA9IG5ldyBTZXQoKTsKICAgICAgdGhpcy5fcmVmQ2FjaGUucHV0KHJlZiwgcGFnZUluZGV4U2V0KTsKICAgIH0KICAgIHBhZ2VJbmRleFNldC5hZGQocGFnZUluZGV4KTsKICAgIGlmIChwYWdlSW5kZXhTZXQuc2l6ZSA8IEdsb2JhbEltYWdlQ2FjaGUuTlVNX1BBR0VTX1RIUkVTSE9MRCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikgJiYgdGhpcy4jY2FjaGVMaW1pdFJlYWNoZWQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGFkZERlY29kZUZhaWxlZChyZWYpIHsKICAgIHRoaXMuI2RlY29kZUZhaWxlZFNldC5wdXQocmVmKTsKICB9CiAgaGFzRGVjb2RlRmFpbGVkKHJlZikgewogICAgcmV0dXJuIHRoaXMuI2RlY29kZUZhaWxlZFNldC5oYXMocmVmKTsKICB9CiAgYWRkQnl0ZVNpemUocmVmLCBieXRlU2l6ZSkgewogICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVm
20KTsKICAgIGlmICghaW1hZ2VEYXRhKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbWFnZURhdGEuYnl0ZVNpemUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW1hZ2VEYXRhLmJ5dGVTaXplID0gYnl0ZVNpemU7CiAgfQogIGdldERhdGEocmVmLCBwYWdlSW5kZXgpIHsKICAgIGNvbnN0IHBhZ2VJbmRleFNldCA9IHRoaXMuX3JlZkNhY2hlLmdldChyZWYpOwogICAgaWYgKCFwYWdlSW5kZXhTZXQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocGFnZUluZGV4U2V0LnNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBpbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChyZWYpOwogICAgaWYgKCFpbWFnZURhdGEpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CiAgICByZXR1cm4gaW1hZ2VEYXRhOwogIH0KICBzZXREYXRhKHJlZiwgZGF0YSkgewogICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGV4cGVjdGVkICJzaG91bGRDYWNoZSIgdG8gaGF2ZSBiZWVuIGNhbGxlZC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLiNjYWNoZUxpbWl0UmVhY2hlZCkgewogICAgICB3YXJuKCJHbG9iYWxJbWFnZUNhY2hlLnNldERhdGEgLSBjYWNoZSBsaW1pdCByZWFjaGVkLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KICBjbGVhcihvbmx5RGF0YSA9IGZ
20hbHNlKSB7CiAgICBpZiAoIW9ubHlEYXRhKSB7CiAgICAgIHRoaXMuI2RlY29kZUZhaWxlZFNldC5jbGVhcigpOwogICAgICB0aGlzLl9yZWZDYWNoZS5jbGVhcigpOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5jbGVhcigpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZnVuY3Rpb24uanMKCgoKCgoKCgoKCgoKCgpjbGFzcyBQREZGdW5jdGlvbkZhY3RvcnkgewogIGNvbnN0cnVjdG9yKHsKICAgIHhyZWYsCiAgICBpc0V2YWxTdXBwb3J0ZWQgPSB0cnVlCiAgfSkgewogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuaXNFdmFsU3VwcG9ydGVkID0gaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTsKICB9CiAgY3JlYXRlKGZuKSB7CiAgICBjb25zdCBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuKTsKICAgIGlmIChjYWNoZWRGdW5jdGlvbikgewogICAgICByZXR1cm4gY2FjaGVkRnVuY3Rpb247CiAgICB9CiAgICBjb25zdCBwYXJzZWRGdW5jdGlvbiA9IFBERkZ1bmN0aW9uLnBhcnNlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMuaXNFdmFsU3VwcG9ydGVkLAogICAgICBmbjogZm4gaW5zdGFuY2VvZiBSZWYgPyB0aGlzLnhyZWYuZmV0Y2goZm4pIDogZm4KICAgIH0pOwogICAgdGhpcy5fY2FjaGUoZm4sIHBhcnNlZEZ1bmN0aW9uKTsKICAgIHJldHVybiBwYXJzZWRGdW5jdGlvbjsKICB9CiAgY3JlYXRlRnJvbUFycmF5KGZuT2JqKSB7CiAgICBjb25zdCBjYWNoZWRGdW5jdGlvbiA9IHRoaXMuZ2V0Q2FjaGVkKGZuT2JqKTsKICAgIGlmIChjYWNoZWRGdW5jdGlvbikgewogICAgICByZXR1cm4gY2FjaGVkRnVuY3Rpb247CiAgICB9CiAgICBjb25zdCBwYXJzZWRGdW5jdGlvbiA9IFBERkZ1bmN0aW9uLnBhcnNlQXJyYXkoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsCiAgICAgIGZuT2JqOiBmbk9iaiBpbnN0YW5jZW9mIFJlZiA/IHRoaXMueHJlZi5mZXRjaChmbk9iaikgOiBmbk9iagogICAgfSk7CiAgICB0aGlzLl9jYWNoZShmbk9iaiwgcGFyc2VkRnVuY3Rpb24pOwogICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uOwogIH0KICBnZXRDYWNoZWQoY2FjaGVLZXkpIHsKICAgIGxldCBmblJlZjsKICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIFJlZikgewogICAgICBmblJlZiA9IGNhY2hlS2V5OwogICAgfSBlbHNlIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgZm5SZWYgPSBjYWNoZUtleS5vYmpJZDsKICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdD8ub2JqSWQ7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgY29uc3QgbG9jYWxGdW5jdGlvbiA9IHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihmblJlZik7CiAgICAgIGlmIChsb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsRnVuY3Rpb247CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfY2FjaGUoY2FjaGVLZXksIHBhcnNlZEZ1bmN0aW9uKSB7CiAgICBpZiAoIXBhcnNlZEZ1bmN0aW9uKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5Ll9jYWNoZSAtIGV4cGVjdGVkICJwYXJzZWRGdW5jdGlvbiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBsZXQgZm5SZWY7CiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgZm5SZWYgPSBjYWNoZUtleTsKICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGZuUmVmID0gY2FjaGVLZXkub2JqSWQ7CiAgICB9IGVsc2UgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICBmblJlZiA9IGNhY2hlS2V5LmRpY3Q/Lm9iaklkOwogICAgfQogICAgaWYgKGZuUmVmKSB7CiAgICAgIHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5zZXQobnVsbCwgZm5SZWYsIHBhcnNlZEZ1bmN0aW9uKTsKICAgIH0KICB9CiAgZ2V0IF9sb2NhbEZ1bmN0aW9uQ2FjaGUoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfbG9jYWxGdW5jdGlvbkNhY2hlIiwgbmV3IExvY2FsRnVuY3Rpb25DYWNoZSgpKTsKICB9Cn0KZnVuY3Rpb24gdG9OdW1iZXJBcnJheShhcnIpIHsKICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmICghaXNOdW1iZXJBcnJheShhcnIsIG51bGwpKSB7CiAgICByZXR1cm4gYXJyLm1hcCh4ID0+ICt4KTsKICB9CiAgcmV0dXJuIGFycjsKfQpjbGFzcyBQREZGdW5jdGlvbiB7CiAgc3RhdGljIGdldFNhbXBsZUFycmF5KHNpemUsIG91dHB1dFNpemUsIGJwcywgc3RyZWFtKSB7CiAgICBsZXQgaSwgaWk7CiAgICBsZXQgbGVuZ3RoID0gMTsKICAgIGZvciAoaSA9IDAsIGlpID0gc2l6ZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGxlbmd0aCAqPSBzaXplW2ldOwogICAgfQogICAgbGVuZ3RoICo9IG91dHB1dFNpemU7CiAgICBjb25zdCBhcnJheSA9IG5ldyBBcnJheShsZW5ndGgpOwogICAgbGV0IGNvZGVTaXplID0gMDsKICAgIGxldCBjb2RlQnVmID0gMDsKICAgIGNvbnN0IHNhbXBsZU11bCA9IDEuMCAvICgyLjAgKiogYnBzIC0gMSk7CiAgICBjb25zdCBzdHJCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcygobGVuZ3RoICogYnBzICsgNykgLyA4KTsKICAgIGxldCBzdHJJZHggPSAwOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJwcykgewogICAgICAgIGNvZGVCdWYgPDw9IDg7CiAgICAgICAgY29kZUJ1ZiB8PSBzdHJCeXRlc1tzdHJJZHgrK107CiAgICAgICAgY29kZVNpemUgKz0gODsKICAgICAgfQogICAgICBjb2RlU2l6ZSAtPSBicHM7CiAgICAgIGFycmF5W2ldID0gKGNvZGVCdWYgPj4gY29kZVNpemUpICogc2FtcGxlTXVsOwogICAgICBjb2RlQnVmICY9ICgxIDw8IGNvZGVTaXplKSAtIDE7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIHN0YXRpYyBwYXJzZSh7CiAgICB4cmVmLAogICAgaXNFdmFsU3VwcG9ydGVkLAogICAgZm4KICB9KSB7CiAgICBjb25zdCBkaWN0ID0gZm4uZGljdCB8fCBmbjsKICAgIGNvbnN0IHR5cGVOdW0gPSBkaWN0LmdldCgiRnVuY3Rpb25UeXBlIik7CiAgICBzd2l0Y2ggKHR5cGVOdW0pIHsKICAgICAgY2FzZSAwOgogICAgICAgI
20HJldHVybiB0aGlzLmNvbnN0cnVjdFNhbXBsZWQoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgICAgICAgIGZuLAogICAgICAgICAgZGljdAogICAgICAgIH0pOwogICAgICBjYXNlIDE6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgICAgICAgIGRpY3QKICAgICAgICB9KTsKICAgICAgY2FzZSAzOgogICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFN0aWNoZWQoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgICAgICAgIGRpY3QKICAgICAgICB9KTsKICAgICAgY2FzZSA0OgogICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdFBvc3RTY3JpcHQoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgICAgICAgIGZuLAogICAgICAgICAgZGljdAogICAgICAgIH0pOwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIHR5cGUgb2YgZnVuY3Rpb24iKTsKICB9CiAgc3RhdGljIHBhcnNlQXJyYXkoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgIGZuT2JqCiAgfSkgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGZuT2JqKSkgewogICAgICByZXR1cm4gdGhpcy5wYXJzZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICAgICAgZm46IGZuT2JqCiAgICAgIH0pOwogICAgfQogICAgY29uc3QgZm5BcnJheSA9IFtdOwogICAgZm9yIChjb25zdCBmbiBvZiBmbk9iaikgewogICAgICBmbkFycmF5LnB1c2godGhpcy5wYXJzZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICAgICAgZm46IHhyZWYuZmV0Y2hJZlJlZihmbikKICAgICAgfSkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIChzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBmbkFycmF5W2ldKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0ICsgaSk7CiAgICAgIH0KICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RTYW1wbGVkKHsKICAgIHhyZWYsCiAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICBmbiwKICAgIGRpY3QKICB9KSB7CiAgICBmdW5jdGlvbiB0b011bHRpQXJyYXkoYXJyKSB7CiAgICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gYXJyLmxlbmd0aDsKICAgICAgY29uc3Qgb3V0ID0gW107CiAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkgKz0gMikgewogICAgICAgIG91dFtpbmRleCsrXSA9IFthcnJbaV0sIGFycltpICsgMV1dOwogICAgICB9CiAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSh4LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KSB7CiAgICAgIHJldHVybiB5bWluICsgKHggLSB4bWluKSAqICgoeW1heCAtIHltaW4pIC8gKHhtYXggLSB4bWluKSk7CiAgICB9CiAgICBsZXQgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBsZXQgcmFuZ2UgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIlJhbmdlIikpOwogICAgaWYgKCFkb21haW4gfHwgIXJhbmdlKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gZG9tYWluIG9yIHJhbmdlIik7CiAgICB9CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoIC8gMjsKICAgIGNvbnN0IG91dHB1dFNpemUgPSByYW5nZS5sZW5ndGggLyAyOwogICAgZG9tYWluID0gdG9NdWx0aUFycmF5KGRvbWFpbik7CiAgICByYW5nZSA9IHRvTXVsdGlBcnJheShyYW5nZSk7CiAgICBjb25zdCBzaXplID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJTaXplIikpOwogICAgY29uc3QgYnBzID0gZGljdC5nZXQoIkJpdHNQZXJTYW1wbGUiKTsKICAgIGNvbnN0IG9yZGVyID0gZGljdC5nZXQoIk9yZGVyIikgfHwgMTsKICAgIGlmIChvcmRlciAhPT0gMSkgewogICAgICBpbmZvKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIiArIG9yZGVyKTsKICAgIH0KICAgIGxldCBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKICAgIGlmICghZW5jb2RlKSB7CiAgICAgIGVuY29kZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7CiAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpOwogICAgfQogICAgbGV0IGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOwogICAgZGVjb2RlID0gIWRlY29kZSA/IHJhbmdlIDogdG9NdWx0aUFycmF5KGRlY29kZSk7CiAgICBjb25zdCBzYW1wbGVzID0gdGhpcy5nZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIGZuKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTYW1wbGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgY3ViZVZlcnRpY2VzID0gMSA8PCBpbnB1dFNpemU7CiAgICAgIGNvbnN0IGN1YmVOID0gbmV3IEZsb2F0NjRBcnJheShjdWJlVmVydGljZXMpOwogICAgICBjb25zdCBjdWJlVmVydGV4ID0gbmV3IFVpbnQzMkFycmF5KGN1YmVWZXJ0aWNlcyk7CiAgICAgIGxldCBpLCBqOwogICAgICBmb3IgKGogPSAwOyBqIDwgY3ViZVZlcnRpY2VzOyBqKyspIHsKICAgICAgICBjdWJlTltqXSA9IDE7CiAgICAgIH0KICAgICAgbGV0IGsgPSBvdXRwdXRTaXplLAogICAgICAgIHBvcyA9IDE7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnB1dFNpemU7ICsraSkgewogICAgICAgIGNvbnN0IGRvbWFpbl8yaSA9IGRvbWFpbltpXVswXTsKICAgICAgICBjb25zdCBkb21haW5fMmlfMSA9IGRvbWFpbltpXVsxXTsKICAgICAgICBjb25zdCB4aSA9IE1hdGgubWluKE1hdGgubWF4KHNyY1tzcmNPZmZzZXQgKyBpXSwgZG9tYWluXzJpKSwgZG9tYWluXzJpXzEpOwogICAgICAgIGxldCBlID0gaW50ZXJwb2xhdGUoeGksIGRvbWFpbl8yaSwgZG9tYWluXzJpXzEsIGVuY29kZVtpXVswXSwgZW5jb2RlW2ldWzFdKTsKICAgICAgICBjb25zdCBzaXplX2kgPSBzaXplW2ldOwogICAgICAgIGUgPSBNYXRoLm1pbihNYXRoLm1heChlLCAwKSwgc2l6ZV9pIC0gMSk7CiAgICAgICAgY29uc3QgZTAgPSBlIDwgc2l6ZV9pIC0gMSA/IE1hdGguZmxvb3IoZSkgOiBlIC0gMTsKICAgICAgICBjb25zdCBuMCA9IGUwICsgMSAtIGU7CiAgICAgICAgY29uc3QgbjEgPSBlIC0gZTA7CiAgICAgICAgY29uc3Qgb2Zmc2V0MCA9IGUwICogazsKICAgICAgICBjb25zdCBvZmZzZXQxID0gb2Zmc2V0MCArIGs7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGN1YmVWZXJ0aWNlczsgaisrKSB7CiAgICAgICAgICBpZiAoaiAmIHBvcykgewogICAgICAgICAgICBjdWJlTltqXSAqPSBuMTsKICAgICAgICAgICAgY3ViZVZlcnRleFtqXSArPSBvZmZzZXQxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3ViZU5bal0gKj0gbjA7CiAgICAgICAgICAgIGN1YmVWZXJ0ZXhbal0gKz0gb2Zmc2V0MDsKICAgICAgICAgI
20H0KICAgICAgICB9CiAgICAgICAgayAqPSBzaXplX2k7CiAgICAgICAgcG9zIDw8PSAxOwogICAgICB9CiAgICAgIGZvciAoaiA9IDA7IGogPCBvdXRwdXRTaXplOyArK2opIHsKICAgICAgICBsZXQgcmogPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdWJlVmVydGljZXM7IGkrKykgewogICAgICAgICAgcmogKz0gc2FtcGxlc1tjdWJlVmVydGV4W2ldICsgal0gKiBjdWJlTltpXTsKICAgICAgICB9CiAgICAgICAgcmogPSBpbnRlcnBvbGF0ZShyaiwgMCwgMSwgZGVjb2RlW2pdWzBdLCBkZWNvZGVbal1bMV0pOwogICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gTWF0aC5taW4oTWF0aC5tYXgocmosIHJhbmdlW2pdWzBdKSwgcmFuZ2Vbal1bMV0pOwogICAgICB9CiAgICB9OwogIH0KICBzdGF0aWMgY29uc3RydWN0SW50ZXJwb2xhdGVkKHsKICAgIHhyZWYsCiAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICBkaWN0CiAgfSkgewogICAgY29uc3QgYzAgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkMwIikpIHx8IFswXTsKICAgIGNvbnN0IGMxID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJDMSIpKSB8fCBbMV07CiAgICBjb25zdCBuID0gZGljdC5nZXQoIk4iKTsKICAgIGNvbnN0IGRpZmYgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGMwLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgZGlmZi5wdXNoKGMxW2ldIC0gYzBbaV0pOwogICAgfQogICAgY29uc3QgbGVuZ3RoID0gZGlmZi5sZW5ndGg7CiAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0SW50ZXJwb2xhdGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgeCA9IG4gPT09IDEgPyBzcmNbc3JjT2Zmc2V0XSA6IHNyY1tzcmNPZmZzZXRdICoqIG47CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyArK2opIHsKICAgICAgICBkZXN0W2Rlc3RPZmZzZXQgKyBqXSA9IGMwW2pdICsgeCAqIGRpZmZbal07CiAgICAgIH0KICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RTdGljaGVkKHsKICAgIHhyZWYsCiAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICBkaWN0CiAgfSkgewogICAgY29uc3QgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBpZiAoIWRvbWFpbikgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiIpOwogICAgfQogICAgY29uc3QgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7CiAgICBpZiAoaW5wdXRTaXplICE9PSAxKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFkIGRvbWFpbiBmb3Igc3RpY2hlZCBmdW5jdGlvbiIpOwogICAgfQogICAgY29uc3QgZm5zID0gW107CiAgICBmb3IgKGNvbnN0IGZuIG9mIGRpY3QuZ2V0KCJGdW5jdGlvbnMiKSkgewogICAgICBmbnMucHVzaCh0aGlzLnBhcnNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgICAgICBmbjogeHJlZi5mZXRjaElmUmVmKGZuKQogICAgICB9KSk7CiAgICB9CiAgICBjb25zdCBib3VuZHMgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkJvdW5kcyIpKTsKICAgIGNvbnN0IGVuY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRW5jb2RlIikpOwogICAgY29uc3QgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RTdGljaGVkRm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29uc3QgY2xpcCA9IGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGcm9tSVJDbGlwKHYsIG1pbiwgbWF4KSB7CiAgICAgICAgaWYgKHYgPiBtYXgpIHsKICAgICAgICAgIHYgPSBtYXg7CiAgICAgICAgfSBlbHNlIGlmICh2IDwgbWluKSB7CiAgICAgICAgICB2ID0gbWluOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdjsKICAgICAgfTsKICAgICAgY29uc3QgdiA9IGNsaXAoc3JjW3NyY09mZnNldF0sIGRvbWFpblswXSwgZG9tYWluWzFdKTsKICAgICAgY29uc3QgbGVuZ3RoID0gYm91bmRzLmxlbmd0aDsKICAgICAgbGV0IGk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIGlmICh2IDwgYm91bmRzW2ldKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGRtaW4gPSBkb21haW5bMF07CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIGRtaW4gPSBib3VuZHNbaSAtIDFdOwogICAgICB9CiAgICAgIGxldCBkbWF4ID0gZG9tYWluWzFdOwogICAgICBpZiAoaSA8IGJvdW5kcy5sZW5ndGgpIHsKICAgICAgICBkbWF4ID0gYm91bmRzW2ldOwogICAgICB9CiAgICAgIGNvbnN0IHJtaW4gPSBlbmNvZGVbMiAqIGldOwogICAgICBjb25zdCBybWF4ID0gZW5jb2RlWzIgKiBpICsgMV07CiAgICAgIHRtcEJ1ZlswXSA9IGRtaW4gPT09IGRtYXggPyBybWluIDogcm1pbiArICh2IC0gZG1pbikgKiAocm1heCAtIHJtaW4pIC8gKGRtYXggLSBkbWluKTsKICAgICAgZm5zW2ldKHRtcEJ1ZiwgMCwgZGVzdCwgZGVzdE9mZnNldCk7CiAgICB9OwogIH0KICBzdGF0aWMgY29uc3RydWN0UG9zdFNjcmlwdCh7CiAgICB4cmVmLAogICAgaXNFdmFsU3VwcG9ydGVkLAogICAgZm4sCiAgICBkaWN0CiAgfSkgewogICAgY29uc3QgZG9tYWluID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJEb21haW4iKSk7CiAgICBjb25zdCByYW5nZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiUmFuZ2UiKSk7CiAgICBpZiAoIWRvbWFpbikgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIk5vIGRvbWFpbi4iKTsKICAgIH0KICAgIGlmICghcmFuZ2UpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJObyByYW5nZS4iKTsKICAgIH0KICAgIGNvbnN0IGxleGVyID0gbmV3IFBvc3RTY3JpcHRMZXhlcihmbik7CiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUG9zdFNjcmlwdFBhcnNlcihsZXhlcik7CiAgICBjb25zdCBjb2RlID0gcGFyc2VyLnBhcnNlKCk7CiAgICBpZiAoaXNFdmFsU3VwcG9ydGVkICYmIEZlYXR1cmVUZXN0LmlzRXZhbFN1cHBvcnRlZCkgewogICAgICBjb25zdCBjb21waWxlZCA9IG5ldyBQb3N0U2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpOwogICAgICBpZiAoY29tcGlsZWQpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJzcmMiLCAic3JjT2Zmc2V0IiwgImRlc3QiLCAiZGVzdE9mZnNldCIsIGNvbXBpbGVkKTsKICAgICAgfQogICAgfQogICAgaW5mbygiVW5hYmxlIHRvIGNvbXBpbGUgUFMgZnVuY3Rpb24iKTsKICAgIGNvbnN0IG51bU91dHB1dHMgPSByYW5nZS5sZW5ndGggPj4gMTsKICAgIGNvbnN0IG51bUlucHV0cyA9IGRvbWFpbi5sZW5ndGggPj4gMTsKICAgIGNvbnN0IGV2YWx1YXRvciA9IG5ldyBQb3N0U2NyaXB0RXZhbHVhdG9yKGNvZGUpOwogICAgY29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgTUFYX0NBQ0hFX1NJWkUgPSAyMDQ4ICogNDsKICAgIGxldCBjYWNoZV9hdmFpbGFibGUgPSBNQVhfQ0FDSEVfU0laRTsKICAgIGNvbnN0IHRtcEJ1ZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtSW5wdXRzKTsKICAgIHJldHVybi
20BmdW5jdGlvbiBjb25zdHJ1Y3RQb3N0U2NyaXB0Rm4oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgbGV0IGksIHZhbHVlOwogICAgICBsZXQga2V5ID0gIiI7CiAgICAgIGNvbnN0IGlucHV0ID0gdG1wQnVmOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtSW5wdXRzOyBpKyspIHsKICAgICAgICB2YWx1ZSA9IHNyY1tzcmNPZmZzZXQgKyBpXTsKICAgICAgICBpbnB1dFtpXSA9IHZhbHVlOwogICAgICAgIGtleSArPSB2YWx1ZSArICJfIjsKICAgICAgfQogICAgICBjb25zdCBjYWNoZWRWYWx1ZSA9IGNhY2hlW2tleV07CiAgICAgIGlmIChjYWNoZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGVzdC5zZXQoY2FjaGVkVmFsdWUsIGRlc3RPZmZzZXQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBvdXRwdXQgPSBuZXcgRmxvYXQzMkFycmF5KG51bU91dHB1dHMpOwogICAgICBjb25zdCBzdGFjayA9IGV2YWx1YXRvci5leGVjdXRlKGlucHV0KTsKICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHN0YWNrLmxlbmd0aCAtIG51bU91dHB1dHM7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1PdXRwdXRzOyBpKyspIHsKICAgICAgICB2YWx1ZSA9IHN0YWNrW3N0YWNrSW5kZXggKyBpXTsKICAgICAgICBsZXQgYm91bmQgPSByYW5nZVtpICogMl07CiAgICAgICAgaWYgKHZhbHVlIDwgYm91bmQpIHsKICAgICAgICAgIHZhbHVlID0gYm91bmQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJvdW5kID0gcmFuZ2VbaSAqIDIgKyAxXTsKICAgICAgICAgIGlmICh2YWx1ZSA+IGJvdW5kKSB7CiAgICAgICAgICAgIHZhbHVlID0gYm91bmQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG91dHB1dFtpXSA9IHZhbHVlOwogICAgICB9CiAgICAgIGlmIChjYWNoZV9hdmFpbGFibGUgPiAwKSB7CiAgICAgICAgY2FjaGVfYXZhaWxhYmxlLS07CiAgICAgICAgY2FjaGVba2V5XSA9IG91dHB1dDsKICAgICAgfQogICAgICBkZXN0LnNldChvdXRwdXQsIGRlc3RPZmZzZXQpOwogICAgfTsKICB9Cn0KZnVuY3Rpb24gaXNQREZGdW5jdGlvbih2KSB7CiAgbGV0IGZuRGljdDsKICBpZiAodiBpbnN0YW5jZW9mIERpY3QpIHsKICAgIGZuRGljdCA9IHY7CiAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgZm5EaWN0ID0gdi5kaWN0OwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBmbkRpY3QuaGFzKCJGdW5jdGlvblR5cGUiKTsKfQpjbGFzcyBQb3N0U2NyaXB0U3RhY2sgewogIHN0YXRpYyBNQVhfU1RBQ0tfU0laRSA9IDEwMDsKICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhY2spIHsKICAgIHRoaXMuc3RhY2sgPSBpbml0aWFsU3RhY2sgPyBBcnJheS5mcm9tKGluaXRpYWxTdGFjaykgOiBbXTsKICB9CiAgcHVzaCh2YWx1ZSkgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IFBvc3RTY3JpcHRTdGFjay5NQVhfU1RBQ0tfU0laRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpOwogIH0KICBwb3AoKSB7CiAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPD0gMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgdW5kZXJmbG93LiIpOwogICAgfQogICAgcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7CiAgfQogIGNvcHkobikgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICsgbiA+PSBQb3N0U2NyaXB0U3RhY2suTUFYX1NUQUNLX1NJWkUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnN0YWNrOwogICAgZm9yIChsZXQgaSA9IHN0YWNrLmxlbmd0aCAtIG4sIGogPSBuIC0gMTsgaiA+PSAwOyBqLS0sIGkrKykgewogICAgICBzdGFjay5wdXNoKHN0YWNrW2ldKTsKICAgIH0KICB9CiAgaW5kZXgobikgewogICAgdGhpcy5wdXNoKHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSBuIC0gMV0pOwogIH0KICByb2xsKG4sIHApIHsKICAgIGNvbnN0IHN0YWNrID0gdGhpcy5zdGFjazsKICAgIGNvbnN0IGwgPSBzdGFjay5sZW5ndGggLSBuOwogICAgY29uc3QgciA9IHN0YWNrLmxlbmd0aCAtIDE7CiAgICBjb25zdCBjID0gbCArIChwIC0gTWF0aC5mbG9vcihwIC8gbikgKiBuKTsKICAgIGZvciAobGV0IGkgPSBsLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogICAgZm9yIChsZXQgaSA9IGwsIGogPSBjIC0gMTsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogICAgZm9yIChsZXQgaSA9IGMsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHsKICAgICAgY29uc3QgdCA9IHN0YWNrW2ldOwogICAgICBzdGFja1tpXSA9IHN0YWNrW2pdOwogICAgICBzdGFja1tqXSA9IHQ7CiAgICB9CiAgfQp9CmNsYXNzIFBvc3RTY3JpcHRFdmFsdWF0b3IgewogIGNvbnN0cnVjdG9yKG9wZXJhdG9ycykgewogICAgdGhpcy5vcGVyYXRvcnMgPSBvcGVyYXRvcnM7CiAgfQogIGV4ZWN1dGUoaW5pdGlhbFN0YWNrKSB7CiAgICBjb25zdCBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTsKICAgIGxldCBjb3VudGVyID0gMDsKICAgIGNvbnN0IG9wZXJhdG9ycyA9IHRoaXMub3BlcmF0b3JzOwogICAgY29uc3QgbGVuZ3RoID0gb3BlcmF0b3JzLmxlbmd0aDsKICAgIGxldCBvcGVyYXRvciwgYSwgYjsKICAgIHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7CiAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzW2NvdW50ZXIrK107CiAgICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgPT09ICJudW1iZXIiKSB7CiAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7CiAgICAgICAgY29udGludWU7CiAgICAgI
20H0KICAgICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICAgIGNhc2UgImp6IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICBjb3VudGVyID0gYjsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImoiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY291bnRlciA9IGE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhYnMiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmFicyhhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhZGQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICsgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhbmQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBhID09PSAiYm9vbGVhbiIgJiYgdHlwZW9mIGIgPT09ICJib29sZWFuIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgJiYgYik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgJiBiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImF0YW4iOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IE1hdGguYXRhbjIoYSwgYikgLyBNYXRoLlBJICogMTgwOwogICAgICAgICAgaWYgKGEgPCAwKSB7CiAgICAgICAgICAgIGEgKz0gMzYwOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2sucHVzaChhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImJpdHNoaWZ0IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmIChhID4gMCkgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgPDwgYik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgPj4gYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjZWlsaW5nIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5jZWlsKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImNvcHkiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2suY29weShhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImNvcyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY29zKGEgJSAzNjAgLyAxODAgKiBNYXRoLlBJKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdmkiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpIHwgMDsKICAgICAgICAgIHN0YWNrLnB1c2goYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdnIiOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGl2IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZHVwIjoKICAgICAgICAgIHN0YWNrLmNvcHkoMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlcSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPT09IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhjaCI6CiAgICAgICAgICBzdGFjay5yb2xsKDIsIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhwIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSAqKiBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZhbHNlIjoKICAgICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZmxvb3IiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmZsb29yKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImdlIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSA+PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImd0IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSA+IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaWRpdiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiIHwgMCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJpbmRleCI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5pbmRleChhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxlIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSA8PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxuIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2coYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibG9nIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2cxMChhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJsdCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPC
20BiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1vZCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgJSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm11bCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgKiBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm5lIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSAhPT0gYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJuZWciOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaCgtYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJub3QiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBhID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCghYSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGFjay5wdXNoKH5hKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm9yIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhIHx8IGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhIHwgYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJwb3AiOgogICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyb2xsIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnJvbGwoYSwgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyb3VuZCI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGgucm91bmQoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAic2luIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5zaW4oYSAlIDM2MCAvIDE4MCAqIE1hdGguUEkpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNxcnQiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLnNxcnQoYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAic3ViIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSAtIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidHJ1ZSI6CiAgICAgICAgICBzdGFjay5wdXNoKHRydWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidHJ1bmNhdGUiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IGEgPCAwID8gTWF0aC5jZWlsKGEpIDogTWF0aC5mbG9vcihhKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ4b3IiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBhID09PSAiYm9vbGVhbiIgJiYgdHlwZW9mIGIgPT09ICJib29sZWFuIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhIF4gYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBVbmtub3duIG9wZXJhdG9yICR7b3BlcmF0b3J9YCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdGFjay5zdGFjazsKICB9Cn0KY2xhc3MgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IodHlwZSkgewogICAgdGhpcy50eXBlID0gdHlwZTsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdW5yZWFjaGFibGUoImFic3RyYWN0IG1ldGhvZCIpOwogIH0KfQpjbGFzcyBBc3RBcmd1bWVudCBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKGluZGV4LCBtaW4sIG1heCkgewogICAgc3VwZXIoImFyZ3MiKTsKICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgIHRoaXMubWluID0gbWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRBcmd1bWVudCh0aGlzKTsKICB9Cn0KY2xhc3MgQXN0TGl0ZXJhbCBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKG51bWJlcikgewogICAgc3VwZXIoImxpdGVyYWwiKTsKICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOwogICAgdGhpcy5taW4gPSBudW1iZXI7CiAgICB0aGlzLm1heCA9IG51bWJlcjsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdExpdGVyYWwodGhpcyk7CiAgfQp9CmNsYXNzIEFzdEJpbmFyeU9wZXJhdGlvbiBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKG9wLCBhcmcxLCBhcmcyLCBtaW4sIG1heCkgewogICAgc3VwZXIoImJpbmFyeSIpOwogICAgdGhpcy5vcCA9IG9wOwogICAgdGhpcy5hcmcxID0gYXJnMTsKICAgIHRoaXMuYXJnMiA9IGFyZzI7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpOwogIH0KfQpjbGFzcyBBc3RNaW4gZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihhcmcsIG1heCkgewogICAgc3VwZXIoIm1heCIpOwogICAgdGhpcy5hcmcgPSBhcmc7CiAgICB0aGlzLm1pbiA9IGFyZy5taW47CiAgICB0aGlzLm1heCA9IG1heDsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdE1pbih0aGlzKTsKICB9Cn0KY2xhc3MgQXN0VmFyaWFibGUgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihpbmRleCwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJ2YXIiKTsKICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgIHRoaXMubWluID0gbWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzKTsKICB9Cn0KY2xhc3MgQXN0VmFyaWFibGVEZWZpbml0aW9uIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IodmFyaWFibGUsIGFyZykgewogICAgc3VwZXIoImRlZmluaXRpb24iKTsKICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKICAgIHRoaXMuYXJnID0gYXJnOwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGVEZWZpbml0aW9uKHRoaXMpOwogIH0KfQpjbGFzcyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5wYXJ0cyA9IFtdOwogIH0KICB2aXNpdEFyZ3VtZW50KGFyZykgewogICAgdGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1heCgiLCBhcmcubWluLCAiLCBNYXRoLm1pbigiLCBhcmcubWF4LCAiLCBzcmNbc3JjT2Zmc2V0ICsgIiwgYXJnLmluZGV4LCAiXSkpIik7CiAgfQogIHZpc2l0VmFyaWFibGUodmFyaWFibGUpIHsKICAgIHRoaXMucGFydHMucHVzaCgidiIsIHZhcmlhYmxlLmluZGV4KTsKICB9CiAgdmlzaXRMaXRlcmFsKGxpdGVyYWwpIHsKICAgIHRoaXMucGFydHMucHVzaChsaXRlcmFsLm51bWJlcik7CiAgfQogIHZpc2l0QmluYXJ5T3BlcmF0aW9uKG9wZXJhdGlvbikgewogICAgdGhpcy5wYXJ0cy5wdXNoKCIoIik7CiAgICBvcGVyYXRpb24uYXJnMS52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiICIsIG9wZXJhdGlvbi5vcCwgIiAiKTsKICAgIG9wZXJhdGlvbi5hcmcyLnZpc2l0KHRoaXMpOwogICAgdGhpcy5wYXJ0cy5wdXNoKCIpIik7CiAgfQogIHZpc2l0VmFyaWFibGVEZWZpbml0aW9uKGRlZmluaXRpb24pIHsKICAgIHRoaXMucGFydHMucHVzaCgidmFyICIpOwogICAgZGVmaW5pdGlvbi52YXJpYWJsZS52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiID0gIik7CiAgICBkZWZpbml0aW9uLmFyZy52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiOyIpOwogIH0KICB2aXNpdE1pbihtYXgpIHsKICAgIHRoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIik7CiAgICBtYXguYXJnLnZpc2l0KHRoaXMpOwogICAgdGhpcy5wYXJ0cy5wdXNoKCIsICIsIG1heC5tYXgsICIpIik7CiAgfQogIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMucGFydHMuam9pbigiIik7CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpIHsKICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIgJiYgb
20nVtMi5udW1iZXIgPT09IDApIHsKICAgIHJldHVybiBudW0xOwogIH0KICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS5udW1iZXIgPT09IDApIHsKICAgIHJldHVybiBudW0yOwogIH0KICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciArIG51bTIubnVtYmVyKTsKICB9CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIisiLCBudW0xLCBudW0yLCBudW0xLm1pbiArIG51bTIubWluLCBudW0xLm1heCArIG51bTIubWF4KTsKfQpmdW5jdGlvbiBidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOwogICAgfSBlbHNlIGlmIChudW0yLm51bWJlciA9PT0gMSkgewogICAgICByZXR1cm4gbnVtMTsKICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpOwogICAgfQogIH0KICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKICAgIGlmIChudW0xLm51bWJlciA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7CiAgICB9IGVsc2UgaWYgKG51bTEubnVtYmVyID09PSAxKSB7CiAgICAgIHJldHVybiBudW0yOwogICAgfQogIH0KICBjb25zdCBtaW4gPSBNYXRoLm1pbihudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKICBjb25zdCBtYXggPSBNYXRoLm1heChudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKICByZXR1cm4gbmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKiIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTsKfQpmdW5jdGlvbiBidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG51bTE7CiAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAtIG51bTIubnVtYmVyKTsKICAgIH0KICB9CiAgaWYgKG51bTIudHlwZSA9PT0gImJpbmFyeSIgJiYgbnVtMi5vcCA9PT0gIi0iICYmIG51bTEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEubnVtYmVyID09PSAxICYmIG51bTIuYXJnMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMi5hcmcxLm51bWJlciA9PT0gMSkgewogICAgcmV0dXJuIG51bTIuYXJnMjsKICB9CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIi0iLCBudW0xLCBudW0yLCBudW0xLm1pbiAtIG51bTIubWF4LCBudW0xLm1heCAtIG51bTIubWluKTsKfQpmdW5jdGlvbiBidWlsZE1pbk9wZXJhdGlvbihudW0xLCBtYXgpIHsKICBpZiAobnVtMS5taW4gPj0gbWF4KSB7CiAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobWF4KTsKICB9IGVsc2UgaWYgKG51bTEubWF4IDw9IG1heCkgewogICAgcmV0dXJuIG51bTE7CiAgfQogIHJldHVybiBuZXcgQXN0TWluKG51bTEsIG1heCk7Cn0KY2xhc3MgUG9zdFNjcmlwdENvbXBpbGVyIHsKICBjb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpIHsKICAgIGNvbnN0IHN0YWNrID0gW107CiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBbXTsKICAgIGNvbnN0IGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggPj4gMSwKICAgICAgb3V0cHV0U2l6ZSA9IHJhbmdlLmxlbmd0aCA+PiAxOwogICAgbGV0IGxhc3RSZWdpc3RlciA9IDA7CiAgICBsZXQgbiwgajsKICAgIGxldCBudW0xLCBudW0yLCBhc3QxLCBhc3QyLCB0bXBWYXIsIGl0ZW07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgaSsrKSB7CiAgICAgIHN0YWNrLnB1c2gobmV3IEFzdEFyZ3VtZW50KGksIGRvbWFpbltpICogMl0sIGRvbWFpbltpICogMiArIDFdKSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaXRlbSA9IGNvZGVbaV07CiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gIm51bWJlciIpIHsKICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RMaXRlcmFsKGl0ZW0pKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKGl0ZW0pIHsKICAgICAgICBjYXNlICJhZGQiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImN2ciI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm11bCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAic3ViIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJleG
20NoIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgYXN0MSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYXN0MiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhc3QxLCBhc3QyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInBvcCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaW5kZXgiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAobnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBuID0gbnVtMS5udW1iZXI7CiAgICAgICAgICBpZiAobiA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIobikgfHwgc3RhY2subGVuZ3RoIDwgbikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV07CiAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSAibGl0ZXJhbCIgfHwgYXN0MS50eXBlID09PSAidmFyIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXSA9IHRtcFZhcjsKICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJkdXAiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZW9mIGNvZGVbaSArIDFdID09PSAibnVtYmVyIiAmJiBjb2RlW2kgKyAyXSA9PT0gImd0IiAmJiBjb2RlW2kgKyAzXSA9PT0gaSArIDcgJiYgY29kZVtpICsgNF0gPT09ICJqeiIgJiYgY29kZVtpICsgNV0gPT09ICJwb3AiICYmIGNvZGVbaSArIDZdID09PSBjb2RlW2kgKyAxXSkgewogICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgY29kZVtpICsgMV0pKTsKICAgICAgICAgICAgaSArPSA2OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFjay5hdCgtMSk7CiAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSAibGl0ZXJhbCIgfHwgYXN0MS50eXBlID09PSAidmFyIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID0gdG1wVmFyOwogICAgICAgICAgc3RhY2sucHVzaCh0bXBWYXIpOwogICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2gobmV3IEFzdFZhcmlhYmxlRGVmaW5pdGlvbih0bXBWYXIsIGFzdDEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInJvbGwiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAobnVtMi50eXBlICE9PSAibGl0ZXJhbCIgfHwgbnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBqID0gbnVtMi5udW1iZXI7CiAgICAgICAgICBuID0gbnVtMS5udW1iZXI7CiAgICAgICAgICBpZiAobiA8PSAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGopIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBqID0gKGogJSBuICsgbikgJSBuOwogICAgICAgICAgaWYgKGogPT09IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFjay5wdXNoKC4uLnN0YWNrLnNwbGljZShzdGFjay5sZW5ndGggLSBuLCBuIC0gaikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RhY2subGVuZ3RoICE9PSBvdXRwdXRTaXplKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykgewogICAgICBjb25zdCBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOwogICAgICBpbnN0cnVjdGlvbi52aXNpdChzdGF0ZW1lbnRCdWlsZGVyKTsKICAgICAgcmVzdWx0LnB1c2goc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpKTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0YWNrLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZXhwciA9IHN0YWNrW2ldLAogICAgICAgIHN0YXRlbWVudEJ1aWxkZXIgPSBuZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCk7CiAgICAgIGV4cHIudmlzaXQoc3RhdGVtZW50QnVpbGRlcik7CiAgICAgIGNvbnN0IG1pbiA9IHJhbmdlW2kgKiAyXSwKICAgICAgICBtYXggPSByYW5nZVtpICogMiArIDFdOwogICAgICBjb25zdCBvdXQgP
20SBbc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpXTsKICAgICAgaWYgKG1pbiA+IGV4cHIubWluKSB7CiAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWF4KCIsIG1pbiwgIiwgIik7CiAgICAgICAgb3V0LnB1c2goIikiKTsKICAgICAgfQogICAgICBpZiAobWF4IDwgZXhwci5tYXgpIHsKICAgICAgICBvdXQudW5zaGlmdCgiTWF0aC5taW4oIiwgbWF4LCAiLCAiKTsKICAgICAgICBvdXQucHVzaCgiKSIpOwogICAgICB9CiAgICAgIG91dC51bnNoaWZ0KCJkZXN0W2Rlc3RPZmZzZXQgKyAiLCBpLCAiXSA9ICIpOwogICAgICBvdXQucHVzaCgiOyIpOwogICAgICByZXN1bHQucHVzaChvdXQuam9pbigiIikpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdC5qb2luKCJcbiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYmlkaS5qcwoKY29uc3QgYmFzZVR5cGVzID0gWyJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJTIiwgIkIiLCAiUyIsICJXUyIsICJCIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkIiLCAiQiIsICJCIiwgIlMiLCAiV1MiLCAiT04iLCAiT04iLCAiRVQiLCAiRVQiLCAiRVQiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiRVMiLCAiQ1MiLCAiRVMiLCAiQ1MiLCAiQ1MiLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiRU4iLCAiQ1MiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCTiIsICJCIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkNTIiwgIk9OIiwgIkVUIiwgIkVUIiwgIkVUIiwgIkVUIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiT04iLCAiT04iLCAiQk4iLCAiT04iLCAiT04iLCAiRVQiLCAiRVQiLCAiRU4iLCAiRU4iLCAiT04iLCAiTCIsICJPTiIsICJPTiIsICJPTiIsICJFTiIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCJdOwpjb25zdCBhcmFiaWNUeXBlcyA9IFsiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiT04iLCAiT04iLCAiQUwiLCAiRVQiLCAiRVQiLCAiQUwiLCAiQ1MiLCAiQUwiLCAiT04iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTCIsICJBTCIsICIiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiQU4iLCAiRVQiLCAiQU4iLCAiQU4iLCAiQUwiLCAiQUwiLCAiQUwiLCAiTlNNIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTiIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTCIsICJBTCIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCJdOwpmdW5jdGlvbiBpc09kZChpKSB7CiAgcmV0dXJuIChpICYgMSkgIT09IDA7Cn0KZnVuY3Rpb24gaXNFdmVuKGkpIHsKICByZXR1cm4gKGkgJiAxKSA9PT0gMDsKfQpmdW5jdGlvbiBmaW5kVW5lcXVhbChhcnIsIHN0YXJ0LCB2YWx1ZSkgewogIGxldCBqLCBqajsKICBmb3IgKGogPSBzdGFydCwgamogPSBhcnIubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgaWYgKGFycltqXSAhPT0gdmFsdWUpIHsKICAgICAgcmV0dXJuIGo7CiAgICB9CiAgfQogIHJldHVybi
20BqOwp9CmZ1bmN0aW9uIHNldFZhbHVlcyhhcnIsIHN0YXJ0LCBlbmQsIHZhbHVlKSB7CiAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgZW5kOyArK2opIHsKICAgIGFycltqXSA9IHZhbHVlOwogIH0KfQpmdW5jdGlvbiByZXZlcnNlVmFsdWVzKGFyciwgc3RhcnQsIGVuZCkgewogIGZvciAobGV0IGkgPSBzdGFydCwgaiA9IGVuZCAtIDE7IGkgPCBqOyArK2ksIC0taikgewogICAgY29uc3QgdGVtcCA9IGFycltpXTsKICAgIGFycltpXSA9IGFycltqXTsKICAgIGFycltqXSA9IHRlbXA7CiAgfQp9CmZ1bmN0aW9uIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgZGlyID0gImx0ciI7CiAgaWYgKHZlcnRpY2FsKSB7CiAgICBkaXIgPSAidHRiIjsKICB9IGVsc2UgaWYgKCFpc0xUUikgewogICAgZGlyID0gInJ0bCI7CiAgfQogIHJldHVybiB7CiAgICBzdHIsCiAgICBkaXIKICB9Owp9CmNvbnN0IGNoYXJzID0gW107CmNvbnN0IHR5cGVzID0gW107CmZ1bmN0aW9uIGJpZGkoc3RyLCBzdGFydExldmVsID0gLTEsIHZlcnRpY2FsID0gZmFsc2UpIHsKICBsZXQgaXNMVFIgPSB0cnVlOwogIGNvbnN0IHN0ckxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgaWYgKHN0ckxlbmd0aCA9PT0gMCB8fCB2ZXJ0aWNhbCkgewogICAgcmV0dXJuIGNyZWF0ZUJpZGlUZXh0KHN0ciwgaXNMVFIsIHZlcnRpY2FsKTsKICB9CiAgY2hhcnMubGVuZ3RoID0gc3RyTGVuZ3RoOwogIHR5cGVzLmxlbmd0aCA9IHN0ckxlbmd0aDsKICBsZXQgbnVtQmlkaSA9IDA7CiAgbGV0IGksIGlpOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgY2hhcnNbaV0gPSBzdHIuY2hhckF0KGkpOwogICAgY29uc3QgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKICAgIGxldCBjaGFyVHlwZSA9ICJMIjsKICAgIGlmIChjaGFyQ29kZSA8PSAweDAwZmYpIHsKICAgICAgY2hhclR5cGUgPSBiYXNlVHlwZXNbY2hhckNvZGVdOwogICAgfSBlbHNlIGlmICgweDA1OTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNWY0KSB7CiAgICAgIGNoYXJUeXBlID0gIlIiOwogICAgfSBlbHNlIGlmICgweDA2MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHgwNmZmKSB7CiAgICAgIGNoYXJUeXBlID0gYXJhYmljVHlwZXNbY2hhckNvZGUgJiAweGZmXTsKICAgICAgaWYgKCFjaGFyVHlwZSkgewogICAgICAgIHdhcm4oIkJpZGk6IGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgIiArIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoMHgwNzAwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4MDhhYyB8fCAweGZiNTAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhmZGZmIHx8IDB4ZmU3MCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweGZlZmYpIHsKICAgICAgY2hhclR5cGUgPSAiQUwiOwogICAgfQogICAgaWYgKGNoYXJUeXBlID09PSAiUiIgfHwgY2hhclR5cGUgPT09ICJBTCIgfHwgY2hhclR5cGUgPT09ICJBTiIpIHsKICAgICAgbnVtQmlkaSsrOwogICAgfQogICAgdHlwZXNbaV0gPSBjaGFyVHlwZTsKICB9CiAgaWYgKG51bUJpZGkgPT09IDApIHsKICAgIGlzTFRSID0gdHJ1ZTsKICAgIHJldHVybiBjcmVhdGVCaWRpVGV4dChzdHIsIGlzTFRSKTsKICB9CiAgaWYgKHN0YXJ0TGV2ZWwgPT09IC0xKSB7CiAgICBpZiAobnVtQmlkaSAvIHN0ckxlbmd0aCA8IDAuMyAmJiBzdHJMZW5ndGggPiA0KSB7CiAgICAgIGlzTFRSID0gdHJ1ZTsKICAgICAgc3RhcnRMZXZlbCA9IDA7CiAgICB9IGVsc2UgewogICAgICBpc0xUUiA9IGZhbHNlOwogICAgICBzdGFydExldmVsID0gMTsKICAgIH0KICB9CiAgY29uc3QgbGV2ZWxzID0gW107CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICBsZXZlbHNbaV0gPSBzdGFydExldmVsOwogIH0KICBjb25zdCBlID0gaXNPZGQoc3RhcnRMZXZlbCkgPyAiUiIgOiAiTCI7CiAgY29uc3Qgc29yID0gZTsKICBjb25zdCBlb3IgPSBzb3I7CiAgbGV0IGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiTlNNIikgewogICAgICB0eX
20Blc1tpXSA9IGxhc3RUeXBlOwogICAgfSBlbHNlIHsKICAgICAgbGFzdFR5cGUgPSB0eXBlc1tpXTsKICAgIH0KICB9CiAgbGFzdFR5cGUgPSBzb3I7CiAgbGV0IHQ7CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIkVOIikgewogICAgICB0eXBlc1tpXSA9IGxhc3RUeXBlID09PSAiQUwiID8gIkFOIiA6ICJFTiI7CiAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIgfHwgdCA9PT0gIkFMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJBTCIpIHsKICAgICAgdHlwZXNbaV0gPSAiUiI7CiAgICB9CiAgfQogIGZvciAoaSA9IDE7IGkgPCBzdHJMZW5ndGggLSAxOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIkVTIiAmJiB0eXBlc1tpIC0gMV0gPT09ICJFTiIgJiYgdHlwZXNbaSArIDFdID09PSAiRU4iKSB7CiAgICAgIHR5cGVzW2ldID0gIkVOIjsKICAgIH0KICAgIGlmICh0eXBlc1tpXSA9PT0gIkNTIiAmJiAodHlwZXNbaSAtIDFdID09PSAiRU4iIHx8IHR5cGVzW2kgLSAxXSA9PT0gIkFOIikgJiYgdHlwZXNbaSArIDFdID09PSB0eXBlc1tpIC0gMV0pIHsKICAgICAgdHlwZXNbaV0gPSB0eXBlc1tpIC0gMV07CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiRU4iKSB7CiAgICAgIGZvciAobGV0IGogPSBpIC0gMTsgaiA+PSAwOyAtLWopIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgc3RyTGVuZ3RoOyArK2opIHsKICAgICAgICBpZiAodHlwZXNbal0gIT09ICJFVCIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlc1tqXSA9ICJFTiI7CiAgICAgIH0KICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICB0ID0gdHlwZXNbaV07CiAgICBpZiAodCA9PT0gIldTIiB8fCB0ID09PSAiRVMiIHx8IHQgPT09ICJFVCIgfHwgdCA9PT0gIkNTIikgewogICAgICB0eX
20Blc1tpXSA9ICJPTiI7CiAgICB9CiAgfQogIGxhc3RUeXBlID0gc29yOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJFTiIpIHsKICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkwiID8gIkwiIDogIkVOIjsKICAgIH0gZWxzZSBpZiAodCA9PT0gIlIiIHx8IHQgPT09ICJMIikgewogICAgICBsYXN0VHlwZSA9IHQ7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgaWYgKHR5cGVzW2ldID09PSAiT04iKSB7CiAgICAgIGNvbnN0IGVuZCA9IGZpbmRVbmVxdWFsKHR5cGVzLCBpICsgMSwgIk9OIik7CiAgICAgIGxldCBiZWZvcmUgPSBzb3I7CiAgICAgIGlmIChpID4gMCkgewogICAgICAgIGJlZm9yZSA9IHR5cGVzW2kgLSAxXTsKICAgICAgfQogICAgICBsZXQgYWZ0ZXIgPSBlb3I7CiAgICAgIGlmIChlbmQgKyAxIDwgc3RyTGVuZ3RoKSB7CiAgICAgICAgYWZ0ZXIgPSB0eXBlc1tlbmQgKyAxXTsKICAgICAgfQogICAgICBpZiAoYmVmb3JlICE9PSAiTCIpIHsKICAgICAgICBiZWZvcmUgPSAiUiI7CiAgICAgIH0KICAgICAgaWYgKGFmdGVyICE9PSAiTCIpIHsKICAgICAgICBhZnRlciA9ICJSIjsKICAgICAgfQogICAgICBpZiAoYmVmb3JlID09PSBhZnRlcikgewogICAgICAgIHNldFZhbHVlcyh0eXBlcywgaSwgZW5kLCBiZWZvcmUpOwogICAgICB9CiAgICAgIGkgPSBlbmQgLSAxOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgewogICAgICB0eX
20Blc1tpXSA9IGU7CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKGlzRXZlbihsZXZlbHNbaV0pKSB7CiAgICAgIGlmICh0ID09PSAiUiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMTsKICAgICAgfSBlbHNlIGlmICh0ID09PSAiQU4iIHx8IHQgPT09ICJFTiIpIHsKICAgICAgICBsZXZlbHNbaV0gKz0gMjsKICAgICAgfQogICAgfSBlbHNlIGlmICh0ID09PSAiTCIgfHwgdCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CiAgICAgIGxldmVsc1tpXSArPSAxOwogICAgfQogIH0KICBsZXQgaGlnaGVzdExldmVsID0gLTE7CiAgbGV0IGxvd2VzdE9kZExldmVsID0gOTk7CiAgbGV0IGxldmVsOwogIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGxldmVsID0gbGV2ZWxzW2ldOwogICAgaWYgKGhpZ2hlc3RMZXZlbCA8IGxldmVsKSB7CiAgICAgIGhpZ2hlc3RMZXZlbCA9IGxldmVsOwogICAgfQogICAgaWYgKGxvd2VzdE9kZExldmVsID4gbGV2ZWwgJiYgaXNPZGQobGV2ZWwpKSB7CiAgICAgIGxvd2VzdE9kZExldmVsID0gbGV2ZWw7CiAgICB9CiAgfQogIGZvciAobGV2ZWwgPSBoaWdoZXN0TGV2ZWw7IGxldmVsID49IGxvd2VzdE9kZExldmVsOyAtLWxldmVsKSB7CiAgICBsZXQgc3RhcnQgPSAtMTsKICAgIGZvciAoaSA9IDAsIGlpID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgaWYgKGxldmVsc1tpXSA8IGxldmVsKSB7CiAgICAgICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBpKTsKICAgICAgICAgIHN0YXJ0ID0gLTE7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgIHN0YXJ0ID0gaTsKICAgICAgfQogICAgfQogICAgaWYgKHN0YXJ0ID49IDApIHsKICAgICAgcmV2ZXJzZVZhbHVlcyhjaGFycywgc3RhcnQsIGxldmVscy5sZW5ndGgpOwogICAgfQogIH0KICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGNvbnN0IGNoID0gY2hhcnNbaV07CiAgICBpZiAoY2ggPT09ICI8IiB8fCBjaCA9PT0gIj4iKSB7CiAgICAgIGNoYXJzW2ldID0gIiI7CiAgICB9CiAgfQogIHJldHVybiBjcmVhdGVCaWRpVGV4dChjaGFycy5qb2luKCIiKSwgaXNMVFIpOwp9Cgo7Ly8gLi9zcmMvY29yZS9mb250X3N1YnN0aXR1dGlvbnMuanMKCgoKCgoKCgoKCgoKCmNvbnN0IE5PUk1BTCA9IHsKICBzdHlsZTogIm5vcm1hbCIsCiAgd2VpZ2h0OiAibm9ybWFsIgp9Owpjb25zdCBCT0xEID0gewogIHN0eWxlOiAibm9ybWFsIiwKICB3ZWlnaHQ6ICJib2xkIgp9Owpjb25zdCBJVEFMSUMgPSB7CiAgc3R5bGU6ICJpdGFsaWMiLAogIHdlaWdodDogIm5vcm1hbCIKfTsKY29uc3QgQk9MRElUQUxJQyA9IHsKICBzdHlsZTogIml0YWxpYyIsCiAgd2VpZ2h0OiAiYm9sZCIKfTsKY29uc3Qgc3Vic3RpdHV0aW9uTWFwID0gbmV3IE1hcChbWyJUaW1lcy1Sb21hbiIsIHsKICBsb2NhbDogWyJUaW1lcyBOZXcgUm9tYW4iLCAiVGltZXMtUm9tYW4iLCAiVGltZXMiLCAiTGliZXJhdGlvbiBTZXJpZiIsICJOaW1idXMgUm9tYW4iLCAiTmltYnVzIFJvbWFuIEwiLCAiVGlub3MiLCAiVGhvcm5kYWxlIiwgIlRlWCBHeXJlIFRlcm1lcyIsICJGcmVlU2VyaWYiLCAiTGludXggTGliZXJ0aW5lIE8iLCAiTGliZXJ0aW51cyBTZXJpZiIsICJEZWphVnUgU2VyaWYiLCAiQml0c3RyZWFtIFZlcmEgU2VyaWYiLCAiVWJ1bnR1Il0sCiAgc3R5bGU6IE5PUk1BTCwKICB1bHRpbWF0ZTogInNlcmlmIgp9XSwgWyJUaW1lcy1Cb2xkIiwgewogIGFsaWFzOiAiVGltZXMtUm9tYW4iLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUl0YWxpYyIsIHsKICBhbGlhczogIlRpbWVzLVJvbWFuIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUJvbGRJdGFsaWMiLCB7CiAgYWxpYXM6ICJUaW1lcy1Sb21hbiIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiSGVsdmV0aWNhIiwgewogIGxvY2FsOiBbIkhlbHZldGljYSIsICJIZWx2ZXRpY2EgTmV1ZSIsICJBcmlhbCIsICJBcmlhbCBOb3ZhIiwgIkxpYmVyYXRpb24gU2FucyIsICJBcmltbyIsICJOaW1idXMgU2FucyIsICJOaW1idXMgU2FucyBMIiwgIkEwMzAiLCAiVGVYIEd5cmUgSGVyb3MiLCAiRnJlZVNhbnMiLCAiRGVqYVZ1IFNhbnMiLCAiQWxiYW55IiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCAiQXJpYWwgVW5pY29kZSBNUyIsICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsICJBcHBsZSBTeW1ib2xzIiwgIkNhbnRhcmVsbCJdLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsCiAgc3R5bGU6IE5PUk1BTCwKICB1bHRpbWF0ZTogInNhbnMtc2VyaWYiCn1dLCBbIkhlbHZldGljYS1Cb2xkIiwgewogIGFsaWFzOiAiSGVsdmV0aWNhIiwKICBwYXRoOiAiTGliZXJhdGlvblNhbnMtQm9sZC50dGYiLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLU9ibGlxdWUiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwgewogIGFsaWFzOiAiSGVsdmV0aWNhIiwKICBwYXRoOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiLAogIHN0eWxlOiBCT0xESVRBTElDLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiQ291cmllciIsIHsKICBsb2NhbDogWyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgIkxpYmVyYXRpb24gTW9ubyIsICJOaW1idXMgTW9ubyIsICJOaW1idXMgTW9ubyBMIiwgIkNvdXNpbmUiLCAiQ3VtYmVybGFuZCIsICJUZVggR3lyZSBDdXJzb3IiLCAiRnJlZU1vbm8iLCAiTGludXggTGliZXJ0aW5lIE1vbm8gTyIsICJMaWJlcnRpbnVzIE1vbm8iXSwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLUJvbGQiLCB7CiAgYWxpYXM6ICJDb3VyaWVyIiwKICBzdHlsZTogQk9MRCwKICB1bHRpbWF0ZTogIm1vbm9zcGFjZSIKfV0sIFsiQ291cmllci1PYmxpcXVlIiwgewogIGFsaWFzOiAiQ291cmllciIsCiAgc3R5bGU6IElUQUxJQywKICB1bHRpbWF0ZTogIm1vbm9zcGFjZSIKfV0sIFsiQ291cmllci1Cb2xkT2JsaXF1
20ZSIsIHsKICBhbGlhczogIkNvdXJpZXIiLAogIHN0eWxlOiBCT0xESVRBTElDLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJBcmlhbEJsYWNrIiwgewogIGxvY2FsOiBbIkFyaWFsIEJsYWNrIl0sCiAgc3R5bGU6IHsKICAgIHN0eWxlOiAibm9ybWFsIiwKICAgIHdlaWdodDogIjkwMCIKICB9LAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGQiCn1dLCBbIkFyaWFsQmxhY2stQm9sZCIsIHsKICBhbGlhczogIkFyaWFsQmxhY2siCn1dLCBbIkFyaWFsQmxhY2stSXRhbGljIiwgewogIGFsaWFzOiAiQXJpYWxCbGFjayIsCiAgc3R5bGU6IHsKICAgIHN0eWxlOiAiaXRhbGljIiwKICAgIHdlaWdodDogIjkwMCIKICB9LAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIgp9XSwgWyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbEJsYWNrLUl0YWxpYyIKfV0sIFsiQXJpYWxOYXJyb3ciLCB7CiAgbG9jYWw6IFsiQXJpYWwgTmFycm93IiwgIkxpYmVyYXRpb24gU2FucyBOYXJyb3ciLCAiSGVsdmV0aWNhIENvbmRlbnNlZCIsICJOaW1idXMgU2FucyBOYXJyb3ciLCAiVGVYIEd5cmUgSGVyb3MgQ24iXSwKICBzdHlsZTogTk9STUFMLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhIgp9XSwgWyJBcmlhbE5hcnJvdy1Cb2xkIiwgewogIGFsaWFzOiAiQXJpYWxOYXJyb3ciLAogIHN0eWxlOiBCT0xELAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGQiCn1dLCBbIkFyaWFsTmFycm93LUl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsTmFycm93IiwKICBzdHlsZTogSVRBTElDLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLU9ibGlxdWUiCn1dLCBbIkFyaWFsTmFycm93LUJvbGRJdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbE5hcnJvdyIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIkNhbGlicmkiLCB7CiAgbG9jYWw6IFsiQ2FsaWJyaSIsICJDYXJsaXRvIl0sCiAgc3R5bGU6IE5PUk1BTCwKICBmYWxsYmFjazogIkhlbHZldGljYSIKfV0sIFsiQ2FsaWJyaS1Cb2xkIiwgewogIGFsaWFzOiAiQ2FsaWJyaSIsCiAgc3R5bGU6IEJPTEQsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQ2FsaWJyaS1JdGFsaWMiLCB7CiAgYWxpYXM6ICJDYWxpYnJpIiwKICBzdHlsZTogSVRBTElDLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLU9ibGlxdWUiCn1dLCBbIkNhbGlicmktQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkNhbGlicmkiLAogIHN0eWxlOiBCT0xESVRBTElDLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIgp9XSwgWyJXaW5nZGluZ3MiLCB7CiAgbG9jYWw6IFsiV2luZ2RpbmdzIiwgIlVSVyBEaW5nYmF0cyJdLAogIHN0eWxlOiBOT1JNQUwKfV0sIFsiV2luZ2RpbmdzLVJlZ3VsYXIiLCB7CiAgYWxpYXM6ICJXaW5nZGluZ3MiCn1dLCBbIldpbmdkaW5ncy1Cb2xkIiwgewogIGFsaWFzOiAiV2luZ2RpbmdzIgp9XV0pOwpjb25zdCBmb250QWxpYXNlcyA9IG5ldyBNYXAoW1siQXJpYWwtQmxhY2siLCAiQXJpYWxCbGFjayJdXSk7CmZ1bmN0aW9uIGdldFN0eWxlVG9BcHBlbmQoc3R5bGUpIHsKICBzd2l0Y2ggKHN0eWxlKSB7CiAgICBjYXNlIEJPTEQ6CiAgICAgIHJldHVybiAiQm9sZCI7CiAgICBjYXNlIElUQUxJQzoKICAgICAgcmV0dXJuICJJdGFsaWMiOwogICAgY2FzZSBCT0xESVRBTElDOgogICAgICByZXR1cm4gIkJvbGQgSXRhbGljIjsKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChzdHlsZT8ud2VpZ2h0ID09PSAiYm9sZCIpIHsKICAgICAgICByZXR1cm4gIkJvbGQiOwogICAgICB9CiAgICAgIGlmIChzdHlsZT8uc3R5bGUgPT09ICJpdGFsaWMiKSB7CiAgICAgICAgcmV0dXJuICJJdGFsaWMiOwogICAgICB9CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBnZXRGYW1pbHlOYW1lKHN0cikgewogIGNvbnN0IGtleXdvcmRzID0gbmV3IFNldChbInRoaW4iLCAiZXh0cmFsaWdodCIsICJ1bHRyYWxpZ2h0IiwgImRlbWlsaWdodCIsICJzZW1pbGlnaHQiLCAibGlnaHQiLCAiYm9vayIsICJyZWd1bGFyIiwgIm5vcm1hbCIsICJtZWRpdW0iLCAiZGVtaWJvbGQiLCAic2VtaWJvbGQiLCAiYm9sZCIsICJleHRyYWJvbGQiLCAidWx0cmFib2xkIiwgImJsYWNrIiwgImhlYXZ5IiwgImV4dHJhYmxhY2siLCAidWx0cmFibGFjayIsICJyb21hbiIsICJpdGFsaWMiLCAib2JsaXF1ZSIsICJ1bHRyYWNvbmRlbnNlZCIsICJleHRyYWNvbmRlbnNlZCIsICJjb25kZW5zZWQiLCAic2VtaWNvbmRlbnNlZCIsICJub3JtYWwiLCAic2VtaWV4cGFuZGVkIiwgImV4cGFuZGVkIiwgImV4dHJhZXhwYW5kZWQiLCAidWx0cmFleHBhbmRlZCIsICJib2xkaXRhbGljIl0pOwogIHJldHVybiBzdHIuc3BsaXQoL1stICwrXSsvZykuZmlsdGVyKH
20RvayA9PiAha2V5d29yZHMuaGFzKHRvay50b0xvd2VyQ2FzZSgpKSkuam9pbigiICIpOwp9CmZ1bmN0aW9uIGdlbmVyYXRlRm9udCh7CiAgYWxpYXMsCiAgbG9jYWwsCiAgcGF0aCwKICBmYWxsYmFjaywKICBzdHlsZSwKICB1bHRpbWF0ZQp9LCBzcmMsIGxvY2FsRm9udFBhdGgsIHVzZUZhbGxiYWNrID0gdHJ1ZSwgdXNlUGF0aCA9IHRydWUsIGFwcGVuZCA9ICIiKSB7CiAgY29uc3QgcmVzdWx0ID0gewogICAgc3R5bGU6IG51bGwsCiAgICB1bHRpbWF0ZTogbnVsbAogIH07CiAgaWYgKGxvY2FsKSB7CiAgICBjb25zdCBleHRyYSA9IGFwcGVuZCA/IGAgJHthcHBlbmR9YCA6ICIiOwogICAgZm9yIChjb25zdCBuYW1lIG9mIGxvY2FsKSB7CiAgICAgIHNyYy5wdXNoKGBsb2NhbCgke25hbWV9JHtleHRyYX0pYCk7CiAgICB9CiAgfQogIGlmIChhbGlhcykgewogICAgY29uc3Qgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uTWFwLmdldChhbGlhcyk7CiAgICBjb25zdCBhbGlhc0FwcGVuZCA9IGFwcGVuZCB8fCBnZXRTdHlsZVRvQXBwZW5kKHN0eWxlKTsKICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBnZW5lcmF0ZUZvbnQoc3Vic3RpdHV0aW9uLCBzcmMsIGxvY2FsRm9udFBhdGgsIHVzZUZhbGxiYWNrICYmICFmYWxsYmFjaywgdXNlUGF0aCAmJiAhcGF0aCwgYWxpYXNBcHBlbmQpKTsKICB9CiAgaWYgKHN0eWxlKSB7CiAgICByZXN1bHQuc3R5bGUgPSBzdHlsZTsKICB9CiAgaWYgKHVsdGltYXRlKSB7CiAgICByZXN1bHQudWx0aW1hdGUgPSB1bHRpbWF0ZTsKICB9CiAgaWYgKHVzZUZhbGxiYWNrICYmIGZhbGxiYWNrKSB7CiAgICBjb25zdCBmYWxsYmFja0luZm8gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KGZhbGxiYWNrKTsKICAgIGNvbnN0IHsKICAgICAgdWx0aW1hdGU6IGZhbGxiYWNrVWx0aW1hdGUKICAgIH0gPSBnZW5lcmF0ZUZvbnQoZmFsbGJhY2tJbmZvLCBzcmMsIGxvY2FsRm9udFBhdGgsIHVzZUZhbGxiYWNrLCB1c2VQYXRoICYmICFwYXRoLCBhcHBlbmQpOwogICAgcmVzdWx0LnVsdGltYXRlIHx8PSBmYWxsYmFja1VsdGltYXRlOwogIH0KICBpZiAodXNlUGF0aCAmJiBwYXRoICYmIGxvY2FsRm9udFBhdGgpIHsKICAgIHNyYy5wdXNoKGB1cmwoJHtsb2NhbEZvbnRQYXRofSR7cGF0aH0pYCk7CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gZ2V0Rm9udFN1YnN0aXR1dGlvbihzeXN0ZW1Gb250Q2FjaGUsIGlkRmFjdG9yeSwgbG9jYWxGb250UGF0aCwgYmFzZUZvbnROYW1lLCBzdGFuZGFyZEZvbnROYW1lLCB0eXBlKSB7CiAgaWYgKGJhc2VGb250TmFtZS5zdGFydHNXaXRoKCJJbnZhbGlkUERGanNGb250XyIpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKCh0eXBlID09PSAiVHJ1ZVR5cGUiIHx8IHR5cGUgPT09ICJUeXBlMSIpICYmIC9eW0EtWl17Nn1cKy8udGVzdChiYXNlRm9udE5hbWUpKSB7CiAgICBiYXNlRm9udE5hbWUgPSBiYXNlRm9udE5hbWUuc2xpY2UoNyk7CiAgfQogIGJhc2VGb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lKGJhc2VGb250TmFtZSk7CiAgY29uc3Qga2V5ID0gYmFzZUZvbnROYW1lOwogIGxldCBzdWJzdGl0dXRpb25JbmZvID0gc3lzdGVtRm9udENhY2hlLmdldChrZXkpOwogIGlmIChzdWJzdGl0dXRpb25JbmZvKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uSW5mbzsKICB9CiAgbGV0IHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoYmFzZUZvbnROYW1lKTsKICBpZiAoIXN1YnN0aXR1dGlvbikgewogICAgZm9yIChjb25zdCBbYWxpYXMsIHN1YnN0XSBvZiBmb250QWxpYXNlcykgewogICAgICBpZiAoYmFzZUZvbnROYW1lLnN0YXJ0c1dpdGgoYWxpYXMpKSB7CiAgICAgICAgYmFzZUZvbnROYW1lID0gYCR7c3Vic3R9JHtiYXNlRm9udE5hbWUuc3Vic3RyaW5nKGFsaWFzLmxlbmd0aCl9YDsKICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KGJhc2VGb250TmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IG11c3RBZGRCYXNlRm9udCA9IGZhbHNlOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KHN0YW5kYXJkRm9udE5hbWUpOwogICAgbXVzdEFkZEJhc2VGb250ID0gdHJ1ZTsKICB9CiAgY29uc3QgbG9hZGVkTmFtZSA9IGAke2lkRmFjdG9yeS5nZXREb2NJZCgpfV9zJHtpZEZhY3RvcnkuY3JlYXRlRm9udElkKCl9YDsKICBpZiAoIXN1YnN0aXR1dGlvbikgewogICAgaWYgKCF2YWxpZGF0ZUZvbnROYW1lKGJhc2VGb250TmFtZSkpIHsKICAgICAgd2FybihgQ2Fubm90IHN1YnN0aXR1dGUgdGhlIGZvbnQgYmVjYXVzZSBvZiBpdHMgbmFtZTogJHtiYXNlRm9udE5hbWV9YCk7CiAgICAgIHN5c3RlbUZvbnRDYWNoZS5zZXQoa2V5LCBudWxsKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBib2xkID0gL2JvbGQvZ2kudGVzdChiYXNlRm9udE5hbWUpOwogICAgY29uc3QgaXRhbGljID0gL29ibGlxdWV8aXRhbGljL2dpLnRlc3QoYmFzZUZvbnROYW1lKTsKICAgIGNvbnN0IHN0eWxlID0gYm9sZCAmJiBpdGFsaWMgJiYgQk9MRElUQUxJQyB8fCBib2xkICYmIEJPTEQgfHwgaXRhbGljICYmIElUQUxJQyB8fCBOT1JNQUw7CiAgICBzdWJzdGl0dXRpb25JbmZvID0gewogICAgICBjc3M6IGAiJHtnZXRGYW1pbHlOYW1lKGJhc2VGb250TmFtZSl9Iiwke2xvYWRlZE5hbWV9YCwKICAgICAgZ3Vlc3NGYWxsYmFjazogdHJ1ZSwKICAgICAgbG9hZGVkTmFtZSwKICAgICAgYmFzZUZvbnROYW1lLAogICAgICBzcmM6IGBsb2NhbCgke2Jhc2VGb250TmFtZX0pYCwKICAgICAgc3R5bGUKICAgIH07CiAgICBzeXN0ZW1Gb250Q2FjaGUuc2V0KGtleSwgc3Vic3RpdHV0aW9uSW5mbyk7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uSW5mbzsKICB9CiAgY29uc3Qgc3JjID0gW107CiAgaWYgKG11c3RBZGRCYXNlRm9udCAmJiB2YWxpZGF0ZUZvbnROYW1lKGJhc2VGb250TmFtZSkpIHsKICAgIHNyYy5wdXNoKGBsb2NhbCgke2Jhc2VGb250TmFtZX0pYCk7CiAgfQogIGNvbnN0IHsKICAgIHN0eWxlLAogICAgdWx0aW1hdGUKICB9ID0gZ2VuZXJhdGVGb250KHN1YnN0aXR1dGlvbiwgc3JjLCBsb2NhbEZvbnRQYXR
20oKTsKICBjb25zdCBndWVzc0ZhbGxiYWNrID0gdWx0aW1hdGUgPT09IG51bGw7CiAgY29uc3QgZmFsbGJhY2sgPSBndWVzc0ZhbGxiYWNrID8gIiIgOiBgLCR7dWx0aW1hdGV9YDsKICBzdWJzdGl0dXRpb25JbmZvID0gewogICAgY3NzOiBgIiR7Z2V0RmFtaWx5TmFtZShiYXNlRm9udE5hbWUpfSIsJHtsb2FkZWROYW1lfSR7ZmFsbGJhY2t9YCwKICAgIGd1ZXNzRmFsbGJhY2ssCiAgICBsb2FkZWROYW1lLAogICAgYmFzZUZvbnROYW1lLAogICAgc3JjOiBzcmMuam9pbigiLCIpLAogICAgc3R5bGUKICB9OwogIHN5c3RlbUZvbnRDYWNoZS5zZXQoa2V5LCBzdWJzdGl0dXRpb25JbmZvKTsKICByZXR1cm4gc3Vic3RpdHV0aW9uSW5mbzsKfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2VfcmVzaXplci5qcwoKCgoKCgoKCgpjb25zdCBNSU5fSU1BR0VfRElNID0gMjA0ODsKY29uc3QgTUFYX0lNQUdFX0RJTSA9IDY1NTM3Owpjb25zdCBNQVhfRVJST1IgPSAxMjg7CmNsYXNzIEltYWdlUmVzaXplciB7CiAgc3RhdGljICNnb29kU3F1YXJlTGVuZ3RoID0gTUlOX0lNQUdFX0RJTTsKICBzdGF0aWMgI2lzSW1hZ2VEZWNvZGVyU3VwcG9ydGVkID0gRmVhdHVyZVRlc3QuaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgY29uc3RydWN0b3IoaW1nRGF0YSwgaXNNYXNrKSB7CiAgICB0aGlzLl9pbWdEYXRhID0gaW1nRGF0YTsKICAgIHRoaXMuX2lzTWFzayA9IGlzTWFzazsKICB9CiAgc3RhdGljIGdldCBjYW5Vc2VJbWFnZURlY29kZXIoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYW5Vc2VJbWFnZURlY29kZXIiLCB0aGlzLiNpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA/IEltYWdlRGVjb2Rlci5pc1R5cGVTdXBwb3J0ZWQoImltYWdlL2JtcCIpIDogUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSk7CiAgfQogIHN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKHdpZHRoLCBoZWlnaHQpIHsKICAgIGlmICh3aWR0aCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoICYmIGhlaWdodCA8PSB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgTUFYX0RJTQogICAgfSA9IHRoaXM7CiAgICBpZiAod2lkdGggPiBNQVhfRElNIHx8IGhlaWdodCA+IE1BWF9ESU0pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CiAgICBpZiAodGhpcy5faGFzTWF4QXJlYSkgewogICAgICByZXR1cm4gYXJlYSA+IHRoaXMuTUFYX0FSRUE7CiAgICB9CiAgICBpZiAoYXJlYSA8IHRoaXMuI2dvb2RTcXVhcmVMZW5ndGggKiogMikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5fYXJlR29vZERpbXMod2lkdGgsIGhlaWdodCkpIHsKICAgICAgdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIE1hdGguZmxvb3IoTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0KSkpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLiNnb29kU3F1YXJlTGVuZ3RoID0gdGhpcy5fZ3Vlc3NNYXgodGhpcy4jZ29vZFNxdWFyZUxlbmd0aCwgTUFYX0RJTSwgTUFYX0VSUk9SLCAwKTsKICAgIGNvbnN0IG1heEFyZWEgPSB0aGlzLk1BWF9BUkVBID0gdGhpcy4jZ29vZFNxdWFyZUxlbmd0aCAqKiAyOwogICAgcmV0dXJuIGFyZWEgPiBtYXhBcmVhOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9ESU0oKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfRElNIiwgdGhpcy5fZ3Vlc3NNYXgoTUlOX0lNQUdFX0RJTSwgTUFYX0lNQUdFX0RJTSwgMCwgMSkpOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9BUkVBKCkgewogICAgdGhpcy5faGFzTWF4QXJlYSA9IHRydWU7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJNQVhfQVJFQSIsIHRoaXMuX2d1ZXNzTWF4KHRoaXMuI2dvb2RTcXVhcmVMZW5ndGgsIHRoaXMuTUFYX0RJTSwgTUFYX0VSUk9SLCAwKSAqKiAyKTsKICB9CiAgc3RhdGljIHNldCBNQVhfQVJFQShhcmVhKSB7CiAgICBpZiAoYXJlYSA+PSAwKSB7CiAgICAgIHRoaXMuX2hhc01heEFyZWEgPSB0cnVlOwogICAgICBzaGFkb3codGhpcywgIk1BWF9BUkVBIiwgYXJlYSk7CiAgICB9CiAgfQogIHN0YXRpYyBzZXRPcHRpb25zKHsKICAgIGNhbnZhc01heEFyZWFJbkJ5dGVzID0gLTEsCiAgICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCA9IGZhbHNlCiAgfSkgewogICAgaWYgKCF0aGlzLl9oYXNNYXhBcmVhKSB7CiAgICAgIHRoaXMuTUFYX0FSRUEgPSBjYW52YXNNYXhBcmVhSW5CeXRlcyA+PiAyOwogICAgfQogICAgdGhpcy4jaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQgPSBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDsKICB9CiAgc3RhdGljIF9hcmVHb29kRGltcyh3aWR0aCwgaGVpZ2h0KSB7CiAgICB0cnkgewogICAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpOwogICAgICBjb25zdCBvcGFjaXR5ID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhWzNdOwogICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTsKICAgICAgcmV0dXJuIG9wYWNpdHkgIT09IDA7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBzdGF0aWMgX2d1ZXNzTWF4KHN0YXJ0LCBlbmQsIHRvbGVyYW5jZSwgZGVmYXVsdEhlaWdodCkgewogICAgd2hpbGUgKHN0YXJ0ICsgdG9sZXJhbmNlICsgMSA8IGVuZCkgewogICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChzdGFydCArIGVuZCkgLyAyKTsKICAgICAgY29uc3QgaGVpZ2h0ID0gZGVmYXVsdEhlaWdodCB8fCBtaWRkbGU7CiAgICAgIGlmICh0aGlzLl9hcmVHb29kRGltcyhtaWRkbGUsIGhlaWdodCkpIHsKICAgICAgICBzdGFydCA9IG1pZGRsZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdGFydDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZUltYWdlKGltZ0RhdGEsIGlzTWFzayA9IGZhbHNlKSB7CiAgICByZXR1cm4gbmV3IEltYWdlUmVzaXplcihpbWdEYXRhLCBpc01hc2spLl9jcmVhdGVJbWFnZSgpOwogIH0KICBhc3luYyBfY3JlYXRlSW1hZ2UoKSB7CiAgICBjb25zdCB7CiAgICAgIF9pbWdEYXRhOiBpbWdEYXRhCiAgICB9ID0gdGhpczsKICAgIGNvbnN0IHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IGltZ0RhdGE7CiAgICBpZiAod2lkdGggKiBoZWlnaHQgKiA0ID4gTUFYX0lOVF8zMikgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNyZXNjYWxlSW1hZ2VEYXRhKCk7CiAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICB9CiAgICBjb25zdCBkYXRhID0gdGh
20pcy5fZW5jb2RlQk1QKCk7CiAgICBsZXQgZGVjb2RlciwgaW1hZ2VQcm9taXNlOwogICAgaWYgKGF3YWl0IEltYWdlUmVzaXplci5jYW5Vc2VJbWFnZURlY29kZXIpIHsKICAgICAgZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoewogICAgICAgIGRhdGEsCiAgICAgICAgdHlwZTogImltYWdlL2JtcCIsCiAgICAgICAgcHJlZmVyQW5pbWF0aW9uOiBmYWxzZSwKICAgICAgICB0cmFuc2ZlcjogW2RhdGEuYnVmZmVyXQogICAgICB9KTsKICAgICAgaW1hZ2VQcm9taXNlID0gZGVjb2Rlci5kZWNvZGUoKS5jYXRjaChyZWFzb24gPT4gewogICAgICAgIHdhcm4oYEJNUCBpbWFnZSBkZWNvZGluZyBmYWlsZWQ6ICR7cmVhc29ufWApOwogICAgICAgIHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbdGhpcy5fZW5jb2RlQk1QKCkuYnVmZmVyXSwgewogICAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgICB9KSk7CiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gewogICAgICAgIGRlY29kZXIuY2xvc2UoKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBpbWFnZVByb21pc2UgPSBjcmVhdGVJbWFnZUJpdG1hcChuZXcgQmxvYihbZGF0YS5idWZmZXJdLCB7CiAgICAgICAgdHlwZTogImltYWdlL2JtcCIKICAgICAgfSkpOwogICAgfQogICAgY29uc3QgewogICAgICBNQVhfQVJFQSwKICAgICAgTUFYX0RJTQogICAgfSA9IEltYWdlUmVzaXplcjsKICAgIGNvbnN0IG1pbkZhY3RvciA9IE1hdGgubWF4KHdpZHRoIC8gTUFYX0RJTSwgaGVpZ2h0IC8gTUFYX0RJTSwgTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0IC8gTUFYX0FSRUEpKTsKICAgIGNvbnN0IGZpcnN0RmFjdG9yID0gTWF0aC5tYXgobWluRmFjdG9yLCAyKT
20sKICAgIGNvbnN0IGZhY3RvciA9IE1hdGgucm91bmQoMTAgKiAobWluRmFjdG9yICsgMS4yNSkpIC8gMTAgLyBmaXJzdEZhY3RvcjsKICAgIGNvbnN0IE4gPSBNYXRoLmZsb29yKE1hdGgubG9nMihmYWN0b3IpKTsKICAgIGNvbnN0IHN0ZXBzID0gbmV3IEFycmF5KE4gKyAyKS5maWxsKDIpOwogICAgc3RlcHNbMF0gPSBmaXJzdEZhY3RvcjsKICAgIHN0ZXBzLnNwbGljZSgtMSwgMSwgZmFjdG9yIC8gKDEgPDwgTikpOwogICAgbGV0IG5ld1dpZHRoID0gd2lkdGg7CiAgICBsZXQgbmV3SGVpZ2h0ID0gaGVpZ2h0OwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW1hZ2VQcm9taXNlOwogICAgbGV0IGJpdG1hcCA9IHJlc3VsdC5pbWFnZSB8fCByZXN1bHQ7CiAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHsKICAgICAgY29uc3QgcHJldldpZHRoID0gbmV3V2lkdGg7CiAgICAgIGNvbnN0IHByZXZIZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIG5ld1dpZHRoID0gTWF0aC5mbG9vcihuZXdXaWR0aCAvIHN0ZXApIC0gMTsKICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5mbG9vcihuZXdIZWlnaHQgLyBzdGVwKSAtIDE7CiAgICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCwgcHJldldpZHRoLCBwcmV2SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IG51bGw7CiAgICBpbWdEYXRhLmJpdG1hcCA9IGJpdG1hcDsKICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgIGltZ0RhdGEuaGVpZ2h0ID0gbmV3SGVpZ2h0OwogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogICNyZXNjYWxlSW1hZ2VEYXRhKCkgewogICAgY29uc3QgewogICAgICBfaW1nRGF0YTogaW1nRGF0YQogICAgfSA9IHRoaXM7CiAgICBjb25zdCB7CiAgICAgIGRhdGEsCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGtpbmQKICAgIH0gPSBpbWdEYXRhOwogICAgY29uc3QgcmdiYVNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDQ7CiAgICBjb25zdCBLID0gTWF0aC5jZWlsKE1hdGgubG9nMihyZ2JhU2l6ZSAvIE1BWF9JTlRfMzIpKTsKICAgIGNvbnN0IG5ld1dpZHRoID0gd2lkdGggPj4gSzsKICAgIGNvbnN0IG5ld0hlaWdodCA9IGhlaWdodCA+PiBLOwogICAgbGV0IHJnYmFEYXRhOwogICAgbGV0IG1heEhlaWdodCA9IGhlaWdodDsKICAgIHRyeSB7CiAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkocmdiYVNpemUpOwogICAgfSBjYXRjaCB7CiAgICAgIGxldCBuID0gTWF0aC5mbG9vcihNYXRoLmxvZzIocmdiYVNpemUgKyAxKSk7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJnYmFEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMiAqKiBuIC0gMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIG4gLT0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcigoMiAqKiBuIC0gMSkgLyAod2lkdGggKiA0KSk7CiAgICAgIGNvbnN0IG5ld1NpemUgPSB3aWR0aCAqIG1heEhlaWdodCAqIDQ7CiAgICAgIGlmIChuZXdTaXplIDwgcmdiYURhdGEubGVuZ3RoKSB7CiAgICAgICAgcmdiYURhdGEgPSBuZXcgVWludDhBcnJheShuZXdTaXplKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkocmdiYURhdGEuYnVmZmVyKTsKICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShuZXdXaWR0aCAqIG5ld0hlaWdodCk7CiAgICBsZXQgc3JjUG9zID0gMDsKICAgIGxldCBuZXdJbmRleCA9IDA7CiAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKGhlaWdodCAvIG1heEhlaWdodCk7CiAgICBjb25zdCByZW1haW5kZXIgPSBoZWlnaHQgJSBtYXhIZWlnaHQgPT09IDAgPyBoZWlnaHQgOiBoZWlnaHQgJSBtYXhIZWlnaHQ7CiAgICBmb3IgKGxldCBrID0gMDsgayA8IHN0ZXA7IGsrKykgewogICAgICBjb25zdCBoID0gayA8IHN0ZXAgLSAxID8gbWF4SGVpZ2h0IDogcmVtYWluZGVyOwogICAgICAoewogICAgICAgIHNyY1BvcwogICAgICB9ID0gY29udmVydFRvUkdCQSh7CiAgICAgICAga2luZCwKICAgICAgICBzcmM6IGRhdGEsCiAgICAgICAgZGVzdDogc3JjMzIsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGludmVyc2VEZWNvZGU6IHRoaXMuX2lzTWFzaywKICAgICAgICBzcmNQb3MKICAgICAgfSkpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoID4+IEs7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgYnVmID0gc3JjMzIuc3ViYXJyYXkoKGkgPDwgSykgKiB3aWR0aCk7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdXaWR0aDsgaisrKSB7CiAgICAgICAgICBkZXN0MzJbbmV3SW5kZXgrK10gPSBidWZbaiA8PCBLXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChJbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZChuZXdXaWR0aCwgbmV3SGVpZ2h0KSkgewogICAgICBpbWdEYXRhLmRhdGEgPSBkZXN0MzI7CiAgICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgICAgaW1nRGF0YS5oZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMobmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZQogICAgfSk7CiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRlc3QzMi5idWZmZXIpLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KSwgMCwgMCk7CiAgICBpbWdEYXRhLmRhdGEgPSBudWxsOwogICAgaW1nRGF0YS5iaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICBpbWdEYXRhLndpZHRoID0gbmV3V2lkdGg7CiAgICBpbWdEYXRhLmhlaWdodCA9IG5ld0hlaWdodDsKICAgIHJldHVybi
20BpbWdEYXRhOwogIH0KICBfZW5jb2RlQk1QKCkgewogICAgY29uc3QgewogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBraW5kCiAgICB9ID0gdGhpcy5faW1nRGF0YTsKICAgIGxldCBkYXRhID0gdGhpcy5faW1nRGF0YS5kYXRhOwogICAgbGV0IGJpdFBlclBpeGVsOwogICAgbGV0IGNvbG9yVGFibGUgPSBuZXcgVWludDhBcnJheSgwKTsKICAgIGxldCBtYXNrVGFibGUgPSBjb2xvclRhYmxlOwogICAgbGV0IGNvbXByZXNzaW9uID0gMDsKICAgIHN3aXRjaCAoa2luZCkgewogICAgICBjYXNlIEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgICB7CiAgICAgICAgICBiaXRQZXJQaXhlbCA9IDE7CiAgICAgICAgICBjb2xvclRhYmxlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5faXNNYXNrID8gWzI1NSwgMjU1LCAyNTUsIDI1NSwgMCwgMCwgMCwgMF0gOiBbMCwgMCwgMCwgMCwgMjU1LCAyNTUsIDI1NSwgMjU1XSk7CiAgICAgICAgICBjb25zdCByb3dMZW4gPSB3aWR0aCArIDcgPj4gMzsKICAgICAgICAgIGNvbnN0IHJvd1NpemUgPSByb3dMZW4gKyAzICYgLTQ7CiAgICAgICAgICBpZiAocm93TGVuICE9PSByb3dTaXplKSB7CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4sIGsgKz0gcm93U2l6ZSkgewogICAgICAgICAgICAgIG5ld0RhdGEuc2V0KGRhdGEuc3ViYXJyYXkoaSwgaSArIHJvd0xlbiksIGspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIEltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgICAgewogICAgICAgICAgYml0UGVyUGl4ZWwgPSAyNDsKICAgICAgICAgIGlmICh3aWR0aCAmIDMpIHsKICAgICAgICAgICAgY29uc3Qgcm93TGVuID0gMyAqIHdpZHRoOwogICAgICAgICAgICBjb25zdCByb3dTaXplID0gcm93TGVuICsgMyAmIC00OwogICAgICAgICAgICBjb25zdCBleHRyYUxlbiA9IHJvd1NpemUgLSByb3dMZW47CiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSBuZXcgVWludDhBcnJheShyb3dTaXplICogaGVpZ2h0KTsKICAgICAgICAgICAgbGV0IGsgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBoZWlnaHQgKiByb3dMZW47IGkgPCBpaTsgaSArPSByb3dMZW4pIHsKICAgICAgICAgICAgICBjb25zdCByb3cgPSBkYXRhLnN1YmFycmF5KGksIGkgKyByb3dMZW4pOwogICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93TGVuOyBqICs9IDMpIHsKICAgICAgICAgICAgICAgIG5ld0RhdGFbaysrXSA9IHJvd1tqICsgMl07CiAgICAgICAgICAgICAgICBuZXdEYXRhW2srK10gPSByb3dbaiArIDFdOwogICAgICAgICAgICAgICAgbmV3RGF0YVtrKytdID0gcm93W2pdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBrICs9IGV4dHJhTGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7CiAgICAgICAgICAgICAgY29uc3QgdG1wID0gZGF0YVtpXTsKICAgICAgICAgICAgICBkYXRhW2ldID0gZGF0YVtpICsgMl07CiAgICAgICAgICAgICAgZGF0YVtpICsgMl0gPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgY2FzZSBJbWFnZUtpbmQuUkdCQV8zMkJQUDoKICAgICAgICBiaXRQZXJQaXhlbCA9IDMyOwogICAgICAgIGNvbXByZXNzaW9uID0gMzsKICAgICAgICBtYXNrVGFibGUgPSBuZXcgVWludDhBcnJheSg0ICsgNCArIDQgKyA0ICsgNTIpOwogICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobWFza1RhYmxlLmJ1ZmZlcik7CiAgICAgICAgaWYgKEZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigwLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDQsIDB4MDAwMGZmMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoOCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMigxMiwgMHhmZjAwMDAwMCwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDAsIDB4ZmYwMDAwMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoNCwgMHgwMGZmMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMig4LCAweDAwMDBmZjAwLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDEyLCAweDAwMDAwMGZmLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdCIpOwogICAgfQogICAgbGV0IGkgPSAwOwogICAgY29uc3QgaGVhZGVyTGVuZ3RoID0gNDAgKyBtYXNrVGFibGUubGVuZ3RoOwogICAgY29uc3QgZmlsZUxlbmd0aCA9IDE0ICsgaGVhZGVyTGVuZ3RoICsgY29sb3JUYWJsZS5sZW5ndGggKyBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IGJtcERhdGEgPSBuZXcgVWludDhBcnJheShmaWxlTGVuZ3RoKTsKICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYm1wRGF0YS5idWZmZXIpOwogICAgdmlldy5zZXRVaW50MTYoaSwgMHg0ZDQyLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGZpbGVMZW5ndGgsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCAxNCArIGhlYWRlckxlbmd0aCArIGNvbG9yVGFibGUubGVuZ3RoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIGhlYWRlckxlbmd0aCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldEludDMyKGksIHdpZHRoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgLWhlaWdodCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQxNihpLCAxLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDE2KGksIGJpdFBlclBpeGVsLCB0cnVlKTsKICAgIGkgKz0gMjsKICAgIHZpZXcuc2V0VWludDMyKGksIGNvbXByZXNzaW9uLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIDAsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRJbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCBjb2xvclRhYmxlLmxlbmd0aCAvIDQsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICBibXBEYXRhLnNldChtYXNrVGFibGUsIGkpOwogICAgaSArPSBtYXNrVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoY29sb3JUYWJsZSwgaSk7CiAgICBpICs9IGNvbG9yVGFibGUubGVuZ3RoOwogICAgYm1wRGF0YS5zZXQoZGF0YSwgaSk7CiAgICByZXR1cm4gYm1wRGF0YTsKICB9Cn0KCjsvLyAuL3NyYy9zaGFyZWQvbXVybXVyaGFzaDMuanMKCgoKCgoKY29uc3QgU0VFRCA9IDB4YzNkMmUxZjA7CmNvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7CmNvbnN0IE1BU0tfTE9XID0gMHhmZmZmOwpjbGFzcyBNdXJtdXJIYXNoM182NCB7CiAgY29uc3RydWN0b3Ioc2VlZCkgewogICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7CiAgICB0aGlzLmgyID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDsKICB9CiAgdXBkYXRlKGlucHV0KSB7CiAgICBsZXQgZGF0YSwgbGVuZ3RoOwogICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gInN0cmluZyIpIHsKICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGlucHV0Lmxlbmd0aCAqIDIpOwogICAgICBsZW5ndGggPSAwOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgP
20SBpbnB1dC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSk7CiAgICAgICAgaWYgKGNvZGUgPD0gMHhmZikgewogICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgPj4+IDg7CiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGUgJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoaW5wdXQpKSB7CiAgICAgIGRhdGEgPSBpbnB1dC5zbGljZSgpOwogICAgICBsZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGg7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YSBmb3JtYXQsIG11c3QgYmUgYSBzdHJpbmcgb3IgVHlwZWRBcnJheS4iKTsKICAgIH0KICAgIGNvbnN0IGJsb2NrQ291bnRzID0gbGVuZ3RoID4+IDI7CiAgICBjb25zdCB0YWlsTGVuZ3RoID0gbGVuZ3RoIC0gYmxvY2tDb3VudHMgKiA0OwogICAgY29uc3QgZGF0YVVpbnQzMiA9IG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlciwgMCwgYmxvY2tDb3VudHMpOwogICAgbGV0IGsxID0gMCwKICAgICAgazIgPSAwOwogICAgbGV0IGgxID0gdGhpcy5oMSwKICAgICAgaDIgPSB0aGlzLmgyOwogICAgY29uc3QgQzEgPSAweGNjOWUyZDUxLAogICAgICBDMiA9IDB4MWI4NzM1OTM7CiAgICBjb25zdCBDMV9MT1cgPSBDMSAmIE1BU0tfTE9XLAogICAgICBDMl9MT1cgPSBDMiAmIE1BU0tfTE9XOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja0NvdW50czsgaSsrKSB7CiAgICAgIGlmIChpICYgMSkgewogICAgICAgIGsxID0gZGF0YVVpbnQzMltpXTsKICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XOwogICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7CiAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBoMSBePSBrMTsKICAgICAgICBoMSA9IGgxIDw8IDEzIHwgaDEgPj4+IDE5OwogICAgICAgIGgxID0gaDEgKiA1ICsgMHhlNjU0NmI2NDsKICAgICAgfSBlbHNlIHsKICAgICAgICBrMiA9IGRhdGFVaW50MzJbaV07CiAgICAgICAgazIgPSBrMiAqIEMxICYgTUFTS19ISUdIIHwgazIgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMiA9IGsyIDw8IDE1IHwgazIgPj4+IDE3OwogICAgICAgIGsyID0gazIgKiBDMiAmIE1BU0tfSElHSCB8IGsyICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaDIgXj0gazI7CiAgICAgICAgaDIgPSBoMiA8PCAxMyB8IGgyID4+PiAxOTsKICAgICAgICBoMiA9IGgyICogNSArIDB4ZTY1NDZiNjQ7CiAgICAgIH0KICAgIH0KICAgIGsxID0gMDsKICAgIHN3aXRjaCAodGFpbExlbmd0aCkgewogICAgICBjYXNlIDM6CiAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAyXSA8PCAxNjsKICAgICAgY2FzZSAyOgogICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMV0gPDwgODsKICAgICAgY2FzZSAxOgogICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0XTsKICAgICAgICBrMSA9IGsxICogQzEgJiBNQVNLX0hJR0ggfCBrMSAqIEMxX0xPVyAmIE1BU0tfTE9XOwogICAgICAgIGsxID0gazEgPDwgMTUgfCBrMSA+Pj4gMTc7CiAgICAgICAgazEgPSBrMSAqIEMyICYgTUFTS19ISUdIIHwgazEgKiBDMl9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBpZiAoYmxvY2tDb3VudHMgJiAxKSB7CiAgICAgICAgICBoMSBePSBrMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaDIgXj0gazE7CiAgICAgICAgfQogICAgfQogICAgdGhpcy5oMSA9IGgxOwogICAgdGhpcy5oMiA9IGgyOwogIH0KICBoZXhkaWdlc3QoKSB7CiAgICBsZXQgaDEgPSB0aGlzLmgxLAogICAgICBoMiA9IHRoaXMuaDI7CiAgICBoMSBePSBoMiA+Pj4gMTsKICAgIGgxID0gaDEgKiAweGVkNTU4Y2NkICYgTUFTS19ISUdIIHwgaDEgKiAweDhjY2QgJiBNQVNLX0xPVzsKICAgIGgyID0gaDIgKiAweGZmNTFhZmQ3ICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGFmZDdlZDU1ICYgTUFTS19ISUdIKSA+Pj4gMTY7CiAgICBoMSBePSBoMiA+Pj4gMTsKICAgIGgxID0gaDEgKiAweDFhODVlYzUzICYgTUFTS19ISUdIIHwgaDEgKiAweGVjNTMgJiBNQVNLX0xPVzsKICAgIGgyID0gaDIgKiAweGM0Y2ViOWZlICYgTUFTS19ISUdIIHwgKChoMiA8PCAxNiB8IGgxID4+PiAxNikgKiAweGI5ZmUxYTg1ICYgTUFTS19ISUdIKSA+Pj4gMTY7CiAgICBoMSBePSBoMiA+Pj4gMTsKICAgIHJldHVybiAoaDEgPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAiMCIpICsgKGgyID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgIjAiKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL29wZXJhdG9yX2xpc3QuanMKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gYWRkU3RhdGUocGFyZW50U3RhdGUsIHBhdHRlcm4sIGNoZWNrRm4sIGl0ZXJhdGVGbiwgcHJvY2Vzc0ZuKSB7CiAgbGV0IHN0YXRlID0gcGFyZW50U3RhdGU7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gcGF0dGVybi5sZW5ndGggLSAxOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgaXRlbSA9IHBhdHRlcm5baV07CiAgICBzdGF0ZSA9IHN0YXRlW2l0ZW1dIHx8PSBbXTsKICB9CiAgc3RhdGVbcGF0dGVybi5hdCgtMSldID0gewogICAgY2hlY2tGbiwKICAgIGl0ZXJhdGVGbiwKICAgIHByb2Nlc3NGbgogIH07Cn0KY29uc3QgSW5pdGlhbFN0YXRlID0gW107CmFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW09QUy5zYXZlLCBPUFMudHJhbnNmb3JtLCBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIE9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUlubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgI
20HJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2F2ZTsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy50cmFuc2Zvcm07CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucmVzdG9yZTsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW5saW5lSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gZm91bmRJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAxMDsKICBjb25zdCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAyMDA7CiAgY29uc3QgTUFYX1dJRFRIID0gMTAwMDsKICBjb25zdCBJTUFHRV9QQURESU5HID0gMTsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgY3VyciA9IGNvbnRleHQuaUN1cnI7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFBJSVhPID0gY3VyciAtIDE7CiAgY29uc3QgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KSwgTUFYX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLKTsKICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgfQogIGxldCBtYXhYID0gMDsKICBjb25zdCBtYXAgPSBbXTsKICBsZXQgbWF4TGluZUhlaWdodCA9IDA7CiAgbGV0IGN1cnJlbnRYID0gSU1BR0VfUEFERElORywKICAgIGN1cnJlbnRZID0gSU1BR0VfUEFERElORzsKICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CiAgICBjb25zdCBpbWcgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF07CiAgICBpZiAoY3VycmVudFggKyBpbWcud2lkdGggPiBNQVhfV0lEVEgpIHsKICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGN1cnJlbnRYKTsKICAgICAgY3VycmVudFkgKz0gbWF4TGluZUhlaWdodCArIDIgKiBJTUFHRV9QQURESU5HOwogICAgICBjdXJyZW50WCA9IDA7CiAgICAgIG1heExpbmVIZWlnaHQgPSAwOwogICAgfQogICAgbWFwLnB1c2goewogICAgICB0cmFuc2Zvcm0sCiAgICAgIHg6IGN1cnJlbnRYLAogICAgICB5OiBjdXJyZW50WSwKICAgICAgdzogaW1nLndpZHRoLAogICAgICBoOiBpbWcuaGVpZ2h0CiAgICB9KTsKICAgIGN1cnJlbnRYICs9IGltZy53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HOwogICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGltZy5oZWlnaHQpOwogIH0KICBjb25zdCBpbWdXaWR0aCA9IE1hdGgubWF4KG1heFgsIGN1cnJlbnRYKSArIElNQUdFX1BBRERJTkc7CiAgY29uc3QgaW1nSGVpZ2h0ID0gY3VycmVudFkgKyBtYXhMaW5lSGVpZ2h0ICsgSU1BR0VfUEFERElORzsKICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW1nV2lkdGggKiBpbWdIZWlnaHQgKiA0KTsKICBjb25zdCBpbWdSb3dTaXplID0gaW1nV2lkdGggPDwgMjsKICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgIGNvbnN0IGRhdGEgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF0uZGF0YTsKICAgIGNvbnN0IHJvd1NpemUgPSBtYXBbcV0udyA8PCAyOwogICAgbGV0IGRhdGFPZmZzZXQgPSAwOwogICAgbGV0IG9mZnNldCA9IG1hcFtxXS54ICsgbWFwW3FdLnkgKiBpbWdXaWR0aCA8PCAyOwogICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheSgwLCByb3dTaXplKSwgb2Zmc2V0IC0gaW1nUm93U2l6ZSk7CiAgICBmb3IgKGxldCBrID0gMCwga2sgPSBtYXBbcV0uaDsgayA8IGtrOyBrKyspIHsKICAgICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheShkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgcm93U2l6ZSksIG9mZnNldCk7CiAgICAgIGRhdGFPZmZzZXQgKz0gcm93U2l6ZTsKICAgICAgb2Zmc2V0ICs9IGltZ1Jvd1NpemU7CiAgICB9CiAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQgLSByb3dTaXplLCBkYXRhT2Zmc2V0KSwgb2Zmc2V0KTsKICAgIHdoaWxlIChvZmZzZXQgPj0gMCkgewogICAgICBkYXRhW29mZnNldCAtIDRdID0gZGF0YVtvZmZzZXRdOwogICAgICBkYXRhW29mZnNldCAtIDNdID0gZGF0YVtvZmZzZXQgKyAxXTsKICAgICAgZGF0YVtvZmZzZXQgLSAyXSA9IGRhdGFbb2Zmc2V0ICsgMl07CiAgICAgIGRhdGFbb2Zmc2V0IC0gMV0gPSBkYXRhW29mZnNldCArIDNdOwogICAgICBkYXRhW29mZnNldCArIHJvd1NpemVdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gNF07CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDFdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gM107CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDJdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gMl07CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDNdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gMV07CiAgICAgIG9mZnNldCAtPSBpbWdSb3dTaXplOwogICAgfQogIH0KICBjb25zdCBpbWcgPSB7CiAgICB3aWR0aDogaW1nV2lkdGgsCiAgICBoZWlnaHQ6IGltZ0hlaWdodAogIH07CiAgaWYgKGNvbnRleHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoaW1nV2lkdGgsIGltZ0hlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGN0eC5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nRGF0YS5idWZmZXIpLCBpbWdXaWR0aCwgaW1nSGVpZ2h0KSwgMCwgMCk7CiAgICBpbWcuYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgaW1nLmRhdGEgPSBudWxsOwogIH0gZWxzZSB7CiAgICBpbWcua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgaW1nLmRhdGEgPSBpbWdEYXRhOwogIH0KICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTsKICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltZywgbWFwXSk7CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3R
20hdGUoSW5pdGlhbFN0YXRlLCBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludEltYWdlTWFza1hPYmplY3QsIE9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5OwogIGNvbnN0IGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMzsKICBjb25zdCBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICBzd2l0Y2ggKHBvcykgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNhdmU7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMudHJhbnNmb3JtOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZU1hc2tHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gZm91bmRJbWFnZU1hc2tHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDA7CiAgY29uc3QgTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTAwMDsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgY3VyciA9IGNvbnRleHQuaUN1cnI7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFBJTVhPID0gY3VyciAtIDE7CiAgbGV0IGNvdW50ID0gTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCk7CiAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgbGV0IGlzU2FtZUltYWdlID0gZmFsc2U7CiAgbGV0IGlUcmFuc2Zvcm0sIHRyYW5zZm9ybUFyZ3M7CiAgY29uc3QgZmlyc3RQSU1YT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE9dWzBdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdLAogICAgZmlyc3RUcmFuc2Zvcm1BcmcxID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMV0sCiAgICBmaXJzdFRyYW5zZm9ybUFyZzIgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSwKICAgIGZpcnN0VHJhbnNmb3JtQXJnMyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzNdOwogIGlmIChmaXJzdFRyYW5zZm9ybUFyZzEgPT09IGZpcnN0VHJhbnNmb3JtQXJnMikgewogICAgaXNTYW1lSW1hZ2UgPSB0cnVlOwogICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybSArIDQ7CiAgICBsZXQgaVBJTVhPID0gaUZpcnN0UElNWE8gKyA0OwogICAgZm9yIChsZXQgcSA9IDE7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQsIGlQSU1YTyArPSA0KSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07CiAgICAgIGlmIChhcmdzQXJyYXlbaVBJTVhPXVswXSAhPT0gZmlyc3RQSU1YT0FyZzAgfHwgdHJhbnNmb3JtQXJnc1swXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcwIHx8IHRyYW5zZm9ybUFyZ3NbMV0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMSB8fCB0cmFuc2Zvcm1BcmdzWzJdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzIgfHwgdHJhbnNmb3JtQXJnc1szXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmczKSB7CiAgICAgICAgaWYgKHEgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CiAgICAgICAgICBpc1NhbWVJbWFnZSA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3VudCA9IHE7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIGlmIChpc1NhbWVJbWFnZSkgewogICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTsKICAgIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm07CiAgICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkgewogICAgICB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOwogICAgICBwb3NpdGlvbnNbcSA8PCAxXSA9IHRyYW5zZm9ybUFyZ3NbNF07CiAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTsKICAgIH0KICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCk7CiAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ZpcnN0UElNWE9BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMSwgZmlyc3RUcmFuc2Zvcm1BcmcyLCBmaXJzdFRyYW5zZm9ybUFyZzMsIHBvc2l0aW9uc10pOwogIH0gZWxzZSB7CiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTsKICAgIGNvbnN0IGltYWdlcyA9IFtdOwogICAgZm9yIChsZXQgcSA9IDA7IHEgPCBjb3VudDsgcSsrKSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtICsgKHEgPDwgMildOwogICAgICBjb25zdCBtYXNrUGFyYW1zID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgKHEgPDwgMildWzBdOwogICAgICBpbWFnZXMucHVzaCh7CiAgICAgICAgZGF0YTogbWFza1BhcmFtcy5kYXRhLAogICAgICAgIHdpZHRoOiBtYXNrUGFyYW1zLndpZHRoLAogICAgICAgIGhlaWdodDogbWFza1BhcmFtcy5oZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGU6IG1hc2tQYXJhbXMuaW50ZXJwb2xhdGUsCiAgICAgICAgY291bnQ6IG1hc2tQYXJhbXMuY291bnQsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1BcmdzCiAgICAgI
20H0pOwogICAgfQogICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXApOwogICAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIFtpbWFnZXNdKTsKICB9CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbT1BTLnNhdmUsIE9QUy50cmFuc2Zvcm0sIE9QUy5wYWludEltYWdlWE9iamVjdCwgT1BTLnJlc3RvcmVdLCBmdW5jdGlvbiAoY29udGV4dCkgewogIGNvbnN0IGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOwogIHJldHVybiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSA9PT0gMCAmJiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSA9PT0gMDsKfSwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IE9QUy5zYXZlOwogICAgY2FzZSAxOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gT1BTLnRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBpRmlyc3RUcmFuc2Zvcm0gPSBjb250ZXh0LmlDdXJyIC0gMjsKICAgICAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07CiAgICAgIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzNdOwogICAgICBpZiAoYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHwgYXJnc0FycmF5W2ldWzFdICE9PSAwIHx8IGFyZ3NBcnJheVtpXVsyXSAhPT0gMCB8fCBhcmdzQXJyYXlbaV1bM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnMykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2UgMjoKICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy5wYWludEltYWdlWE9iamVjdCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBpRmlyc3RQSVhPID0gY29udGV4dC5pQ3VyciAtIDE7CiAgICAgIGNvbnN0IGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0UElYT0FyZzApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMucmVzdG9yZTsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX0JMT0NLID0gMzsKICBjb25zdCBNQVhfSU1BR0VTX0lOX0JMT0NLID0gMTAwMDsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgY3VyciA9IGNvbnRleHQuaUN1cnI7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFBJWE8gPSBjdXJyIC0gMTsKICBjb25zdCBmaXJzdFBJWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJWE9dWzBdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzNdOwogIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksIE1BWF9JTUFHRVNfSU5fQkxPQ0spOwogIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgfQogIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTsKICBsZXQgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTsKICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkgewogICAgY29uc3QgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKICAgIHBvc2l0aW9uc1txIDw8IDFdID0gdHJhbnNmb3JtQXJnc1s0XTsKICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTsKICB9CiAgY29uc3QgYXJncyA9IFtmaXJzdFBJWE9BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMywgcG9zaXRpb25zXTsKICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIE9QUy5wYWludEltYWdlWE9iamVjdFJlcGVhdCk7CiAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIGFyZ3MpOwogIHJldHVybiBpRmlyc3RTYXZlICsgMTsKfSk7CmFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW09QUy5iZWdpblRleHQsIE9QUy5zZXRGb250LCBPUFMuc2V0VGV4dE1hdHJpeCwgT1BTLnNob3dUZXh0LCBPUFMuZW5kVGV4dF0sIG51bGwsIGZ1bmN0aW9uIGl0ZXJhdGVTaG93VGV4dEdyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSA0OwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA1OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBPUFMuYmVnaW5UZXh0OwogICAgY2FzZSAxOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLnNldEZvbnQ7CiAgICBjYXNlIDI6CiAgICAgI
20HJldHVybiBmbkFycmF5W2ldID09PSBPUFMuc2V0VGV4dE1hdHJpeDsKICAgIGNhc2UgMzoKICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IE9QUy5zaG93VGV4dCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBpRmlyc3RTZXRGb250ID0gY29udGV4dC5pQ3VyciAtIDM7CiAgICAgIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMF07CiAgICAgIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0U2V0Rm9udEFyZzAgfHwgYXJnc0FycmF5W2ldWzFdICE9PSBmaXJzdFNldEZvbnRBcmcxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gT1BTLmVuZFRleHQ7CiAgfQogIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7Cn0sIGZ1bmN0aW9uIChjb250ZXh0LCBpKSB7CiAgY29uc3QgTUlOX0NIQVJTX0lOX0JMT0NLID0gMzsKICBjb25zdCBNQVhfQ0hBUlNfSU5fQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RCZWdpblRleHQgPSBjdXJyIC0gNDsKICBjb25zdCBpRmlyc3RTZXRGb250ID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0U2V0VGV4dE1hdHJpeCA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFNob3dUZXh0ID0gY3VyciAtIDE7CiAgY29uc3QgaUZpcnN0RW5kVGV4dCA9IGN1cnI7CiAgY29uc3QgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTsKICBjb25zdCBmaXJzdFNldEZvbnRBcmcxID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzFdOwogIGxldCBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RCZWdpblRleHQpIC8gNSksIE1BWF9DSEFSU19JTl9CTE9DSyk7CiAgaWYgKGNvdW50IDwgTUlOX0NIQVJTX0lOX0JMT0NLKSB7CiAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0QmVnaW5UZXh0KSAlIDU7CiAgfQogIGxldCBpRmlyc3QgPSBpRmlyc3RCZWdpblRleHQ7CiAgaWYgKGlGaXJzdEJlZ2luVGV4dCA+PSA0ICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gNF0gPT09IGZuQXJyYXlbaUZpcnN0U2V0Rm9udF0gJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSAzXSA9PT0gZm5BcnJheVtpRmlyc3RTZXRUZXh0TWF0cml4XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDJdID09PSBmbkFycmF5W2lGaXJzdFNob3dUZXh0XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDFdID09PSBmbkFycmF5W2lGaXJzdEVuZFRleHRdICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVswXSA9PT0gZmlyc3RTZXRGb250QXJnMCAmJiBhcmdzQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gNF1bMV0gPT09IGZpcnN0U2V0Rm9udEFyZzEpIHsKICAgIGNvdW50Kys7CiAgICBpRmlyc3QgLT0gNTsKICB9CiAgbGV0IGlFbmRUZXh0ID0gaUZpcnN0ICsgN
20DsKICBmb3IgKGxldCBxID0gMTsgcSA8IGNvdW50OyBxKyspIHsKICAgIGZuQXJyYXkuc3BsaWNlKGlFbmRUZXh0LCAzKTsKICAgIGFyZ3NBcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOwogICAgaUVuZFRleHQgKz0gMjsKICB9CiAgcmV0dXJuIGlFbmRUZXh0ICsgMTsKfSk7CmNsYXNzIE51bGxPcHRpbWl6ZXIgewogIGNvbnN0cnVjdG9yKHF1ZXVlKSB7CiAgICB0aGlzLnF1ZXVlID0gcXVldWU7CiAgfQogIF9vcHRpbWl6ZSgpIHt9CiAgcHVzaChmbiwgYXJncykgewogICAgdGhpcy5xdWV1ZS5mbkFycmF5LnB1c2goZm4pOwogICAgdGhpcy5xdWV1ZS5hcmdzQXJyYXkucHVzaChhcmdzKTsKICAgIHRoaXMuX29wdGltaXplKCk7CiAgfQogIGZsdXNoKCkge30KICByZXNldCgpIHt9Cn0KY2xhc3MgUXVldWVPcHRpbWl6ZXIgZXh0ZW5kcyBOdWxsT3B0aW1pemVyIHsKICBjb25zdHJ1Y3RvcihxdWV1ZSkgewogICAgc3VwZXIocXVldWUpOwogICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICB0aGlzLmNvbnRleHQgPSB7CiAgICAgIGlDdXJyOiAwLAogICAgICBmbkFycmF5OiBxdWV1ZS5mbkFycmF5LAogICAgICBhcmdzQXJyYXk6IHF1ZXVlLmFyZ3NBcnJheSwKICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IGZhbHNlCiAgICB9OwogICAgdGhpcy5tYXRjaCA9IG51bGw7CiAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAwOwogIH0KICBzZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQodmFsdWUpIHsKICAgIHRoaXMuY29udGV4dC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHZhbHVlOwogIH0KICBfb3B0aW1pemUoKSB7CiAgICBjb25zdCBmbkFycmF5ID0gdGhpcy5xdWV1ZS5mbkFycmF5OwogICAgbGV0IGkgPSB0aGlzLmxhc3RQcm9jZXNzZWQsCiAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7CiAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOwogICAgbGV0IG1hdGNoID0gdGhpcy5tYXRjaDsKICAgIGlmICghc3RhdGUgJiYgIW1hdGNoICYmIGkgKyAxID09PSBpaSAmJiAhSW5pdGlhbFN0YXRlW2ZuQXJyYXlbaV1dKSB7CiAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGlpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0OwogICAgd2hpbGUgKGkgPCBpaSkgewogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICBjb25zdCBpdGVyYXRlID0gKDAsIG1hdGNoLml0ZXJhdGVGbikoY29udGV4dCwgaSk7CiAgICAgICAgaWYgKGl0ZXJhdGUpIHsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpID0gKDAsIG1hdGNoLnByb2Nlc3NGbikoY29udGV4dCwgaSArIDEpOwogICAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7CiAgICAgICAgbWF0Y2ggPSBudWxsOwogICAgICAgIHN0YXRlID0gbnVsbDsKICAgICAgICBpZiAoaSA+PSBpaSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRlID0gKHN0YXRlIHx8IEluaXRpYWxTdGF0ZSlbZm5BcnJheVtpXV07CiAgICAgIGlmICghc3RhdGUgfHwgQXJyYXkuaXNBcnJheShzdGF0ZSkpIHsKICAgICAgICBpKys7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29udGV4dC5pQ3VyciA9IGk7CiAgICAgIGkrKzsKICAgICAgaWYgKHN0YXRlLmNoZWNrRm4gJiYgISgwLCBzdGF0ZS5jaGVja0ZuKShjb250ZXh0KSkgewogICAgICAgIHN0YXRlID0gbnVsbDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBtYXRjaCA9IHN0YXRlOwogICAgICBzdGF0ZSA9IG51bGw7CiAgICB9CiAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICB0aGlzLm1hdGNoID0gbWF0Y2g7CiAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSBpOwogIH0KICBmbHVzaCgpIHsKICAgIHdoaWxlICh0aGlzLm1hdGNoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucXVldWUuZm5BcnJheS5sZW5ndGg7CiAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9ICgwLCB0aGlzLm1hdGNoLnByb2Nlc3NGbikodGhpcy5jb250ZXh0LCBsZW5ndGgpOwogICAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuX29wdGltaXplKCk7CiAgICB9CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CiAgfQp9CmNsYXNzIE9wZXJhdG9yTGlzdCB7CiAgc3RhdGljIENIVU5LX1NJWkUgPSAxMDAwOwogIHN0YXRpYyBDSFVOS19TSVpFX0FCT1VUID0gdGhpcy5DSFVOS19TSVpFIC0gNTsKICBjb25zdHJ1Y3RvcihpbnRlbnQgPSAwLCBzdHJlYW1TaW5rKSB7CiAgICB0aGlzLl9zdHJlYW1TaW5rID0gc3RyZWFtU2luazsKICAgIHRoaXMuZm5BcnJheSA9IFtdOwogICAgdGhpcy5hcmdzQXJyYXkgPSBbXTsKICAgIHRoaXMub3B0aW1pemVyID0gc3RyZWFtU2luayAmJiAhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuT1BMSVNUKSA/IG5ldyBRdWV1ZU9wdGltaXplcih0aGlzKSA6IG5ldyBOdWxsT3B0aW1pemVyKHRoaXMpOwogICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBuZXcgU2V0KCk7CiAgICB0aGlzLl90b3RhbExlbmd0aCA9IDA7CiAgICB0aGlzLndlaWdodCA9IDA7CiAgICB0aGlzLl9yZXNvbHZlZCA9IHN0cmVhbVNpbmsgPyBudWxsIDogUHJvbWlzZS5yZXNvbHZlKCk7CiAgfQogIHNldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCh2YWx1ZSkgewogICAgdGhpcy5vcHRpbWl6ZXIuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSB2YWx1ZTsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmFyZ3NBcnJheS5sZW5ndGg7CiAgfQogIGdldCByZWFkeSgpIHsKICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZCB8fCB0aGlzLl9zdHJlYW1TaW5rLnJlYWR5OwogIH0KICBnZXQgdG90YWxMZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGggKyB0aGlzLmxlbmd0aDsKICB9CiAgYWRkT3AoZm4sIGFyZ3MpIHsKICAgIHRoaXMub3B0aW1pemVyLnB1c2goZm4sIGFyZ3MpOwogICAgdGhpcy53ZWlnaHQrKzsKICAgIGlmICh0aGlzLl9zdHJlYW1TaW5rKSB7CiAgICAgIGlmICh0aGlzLndlaWdodCA+PSBPcGVyYXRvckxpc3QuQ0hVTktfU0laRSkgewogICAgICAgI
20HRoaXMuZmx1c2goKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLndlaWdodCA+PSBPcGVyYXRvckxpc3QuQ0hVTktfU0laRV9BQk9VVCAmJiAoZm4gPT09IE9QUy5yZXN0b3JlIHx8IGZuID09PSBPUFMuZW5kVGV4dCkpIHsKICAgICAgICB0aGlzLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9CiAgYWRkSW1hZ2VPcHMoZm4sIGFyZ3MsIG9wdGlvbmFsQ29udGVudCwgaGFzTWFzayA9IGZhbHNlKSB7CiAgICBpZiAoaGFzTWFzaykgewogICAgICB0aGlzLmFkZE9wKE9QUy5zYXZlKTsKICAgICAgdGhpcy5hZGRPcChPUFMuc2V0R1N0YXRlLCBbW1siU01hc2siLCBmYWxzZV1dXSk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKICAgIH0KICAgIHRoaXMuYWRkT3AoZm4sIGFyZ3MpOwogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHRoaXMuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIGlmIChoYXNNYXNrKSB7CiAgICAgIHRoaXMuYWRkT3AoT1BTLnJlc3RvcmUpOwogICAgfQogIH0KICBhZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpIHsKICAgIGlmICh0aGlzLmRlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgdGhpcy5hZGRPcChPUFMuZGVwZW5kZW5jeSwgW2RlcGVuZGVuY3ldKTsKICB9CiAgYWRkRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcykgewogICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGRlcGVuZGVuY2llcykgewogICAgICB0aGlzLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CiAgICB9CiAgfQogIGFkZE9wTGlzdChvcExpc3QpIHsKICAgIGlmICghKG9wTGlzdCBpbnN0YW5jZW9mIE9wZXJhdG9yTGlzdCkpIHsKICAgICAgd2FybignYWRkT3BMaXN0IC0gaWdub3JpbmcgaW52YWxpZCAib3BMaXN0IiBwYXJhbWV0ZXIuJyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcExpc3QuZGVwZW5kZW5jaWVzKSB7CiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wTGlzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIHRoaXMuYWRkT3Aob3BMaXN0LmZuQXJyYXlbaV0sIG9wTGlzdC5hcmdzQXJyYXlbaV0pOwogICAgfQogIH0KICBnZXRJUigpIHsKICAgIHJldHVybiB7CiAgICAgIGZuQXJyYXk6IHRoaXMuZm5BcnJheSwKICAgICAgYXJnc0FycmF5OiB0aGlzLmFyZ3NBcnJheSwKICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aAogICAgfTsKICB9CiAgZ2V0IF90cmFuc2ZlcnMoKSB7CiAgICBjb25zdCB0cmFuc2ZlcnMgPSBbXTsKICAgIGNvbnN0IHsKICAgICAgZm5BcnJheSwKICAgICAgYXJnc0FycmF5LAogICAgICBsZW5ndGgKICAgIH0gPSB0aGlzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2ggKGZuQXJyYXlbaV0pIHsKICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdDoKICAgICAgICBjYXNlIE9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOgogICAgICAgIGNhc2UgT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDoKICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NBcnJheVtpXVswXTsKICAgICAgICAgIGlmICghYXJnLmNhY2hlZCAmJiBhcmcuZGF0YT8uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsKICAgICAgICAgICAgdHJhbnNmZXJzLnB1c2goYXJnLmRhdGEuYnVmZmVyKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJhbnNmZXJzOwogIH0KICBmbHVzaChsYXN0Q2h1bmsgPSBmYWxzZSwgc2VwYXJhdGVBbm5vdHMgPSBudWxsKSB7CiAgICB0aGlzLm9wdGltaXplci5mbHVzaCgpOwogICAgY29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CiAgICB0aGlzLl90b3RhbExlbmd0aCArPSBsZW5ndGg7CiAgICB0aGlzLl9zdHJlYW1TaW5rLmVucXVldWUoewogICAgICBmbkFycmF5OiB0aGlzLmZuQXJyYXksCiAgICAgIGFyZ3NBcnJheTogdGhpcy5hcmdzQXJyYXksCiAgICAgIGxhc3RDaHVuaywKICAgICAgc2VwYXJhdGVBbm5vdHMsCiAgICAgIGxlbmd0aAogICAgfSwgMSwgdGhpcy5fdHJhbnNmZXJzKTsKICAgIHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7CiAgICB0aGlzLmZuQXJyYXkubGVuZ3RoID0gMDsKICAgIHRoaXMuYXJnc0FycmF5Lmxlbmd0aCA9IDA7CiAgICB0aGlzLndlaWdodCA9IDA7CiAgICB0aGlzLm9wdGltaXplci5yZXNldCgpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvaW1hZ2UuanMKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gZGVjb2RlQW5kQ2xhbXAodmFsdWUsIGFkZGVuZCwgY29lZmZpY2llbnQsIG1heCkgewogIHZhbHVlID0gYWRkZW5kICsgdmFsdWUgKiBjb2VmZmljaWVudDsKICBpZiAodmFsdWUgPCAwKSB7CiAgICB2YWx1ZSA9IDA7CiAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgewogICAgdmFsdWUgPSBtYXg7CiAgfQogIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiByZXNpemVJbWFnZU1hc2soc3JjLCBicGMsIHcxLCBoMSwgdzIsIGgyKSB7CiAgY29uc3QgbGVuZ3RoID0gdzIgKiBoMjsKICBsZXQgZGVzdDsKICBpZiAoYnBjIDw9IDgpIHsKICAgIGRlc3QgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CiAgICBkZXN0ID0gbmV3IFVpbnQxNkFycmF
205KGxlbmd0aCk7CiAgfSBlbHNlIHsKICAgIGRlc3QgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKICB9CiAgY29uc3QgeFJhdGlvID0gdzEgLyB3MjsKICBjb25zdCB5UmF0aW8gPSBoMSAvIGgyOwogIGxldCBpLAogICAgaiwKICAgIHB5LAogICAgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxOwogIGZvciAoaSA9IDA7IGkgPCB3MjsgaSsrKSB7CiAgICB4U2NhbGVkW2ldID0gTWF0aC5mbG9vcihpICogeFJhdGlvKTsKICB9CiAgZm9yIChpID0gMDsgaSA8IGgyOyBpKyspIHsKICAgIHB5ID0gTWF0aC5mbG9vcihpICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7CiAgICBmb3IgKGogPSAwOyBqIDwgdzI7IGorKykgewogICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTsKICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleF07CiAgICB9CiAgfQogIHJldHVybiBkZXN0Owp9CmNsYXNzIFBERkltYWdlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgcmVzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgc21hc2sgPSBudWxsLAogICAgbWFzayA9IG51bGwsCiAgICBpc01hc2sgPSBmYWxzZSwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgfSkgewogICAgdGhpcy5pbWFnZSA9IGltYWdlOwogICAgY29uc3QgZGljdCA9IGltYWdlLmRpY3Q7CiAgICBjb25zdCBmaWx0ZXIgPSBkaWN0LmdldCgiRiIsICJGaWx0ZXIiKTsKICAgIGxldCBmaWx0ZXJOYW1lOwogICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHsKICAgICAgY29uc3QgZmlsdGVyWmVybyA9IHhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJbMF0pOwogICAgICBpZiAoZmlsdGVyWmVybyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyWmVyby5uYW1lOwogICAgICB9CiAgICB9CiAgICBzd2l0Y2ggKGZpbHRlck5hbWUpIHsKICAgICAgY2FzZSAiSlBYRGVjb2RlIjoKICAgICAgICAoewogICAgICAgICAgd2lkdGg6IGltYWdlLndpZHRoLAogICAgICAgICAgaGVpZ2h0OiBpbWFnZS5oZWlnaHQsCiAgICAgICAgICBjb21wb25lbnRzQ291bnQ6IGltYWdlLm51bUNvbXBzLAogICAgICAgICAgYml0c1BlckNvbXBvbmVudDogaW1hZ2UuYml0c1BlckNvbXBvbmVudAogICAgICAgIH0gPSBKcHhJbWFnZS5wYXJzZUltYWdlUHJvcGVydGllcyhpbWFnZS5zdHJlYW0pKTsKICAgICAgICBpbWFnZS5zdHJlYW0ucmVzZXQoKTsKICAgICAgICB0aGlzLmpweERlY29kZXJPcHRpb25zID0gewogICAgICAgICAgbnVtQ29tcG9uZW50czogMCwKICAgICAgICAgIGlzSW5kZXhlZENvbG9ybWFwOiBmYWxzZSwKICAgICAgICAgIHNtYXNrSW5EYXRhOiBkaWN0LmhhcygiU01hc2tJbkRhdGEiKQogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkpCSUcyRGVjb2RlIjoKICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0gMTsKICAgICAgICBpbWFnZS5udW1Db21wcyA9IDE7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBsZXQgd2lkdGggPSBkaWN0LmdldCgiVyIsICJXaWR0aCIpOwogICAgbGV0IGhlaWdodCA9IGRpY3QuZ2V0KCJIIiwgIkhlaWdodCIpOwogICAgaWYgKE51bWJlci5pc0ludGVnZXIoaW1hZ2Uud2lkdGgpICYmIGltYWdlLndpZHRoID4gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGltYWdlLmhlaWdodCkgJiYgaW1hZ2UuaGVpZ2h0ID4gMCAmJiAoaW1hZ2Uud2lkdGggIT09IHdpZHRoIHx8IGltYWdlLmhlaWdodCAhPT0gaGVpZ2h0KSkgewogICAgICB3YXJuKCJQREZJbWFnZSAtIHVzaW5nIHRoZSBXaWR0aC9IZWlnaHQgb2YgdGhlIGltYWdlIGRhdGEsICIgKyAicmF0aGVyIHRoYW4gdGhlIGltYWdlIGRpY3Rpb25hcnkuIik7CiAgICAgIHdpZHRoID0gaW1hZ2Uud2lkdGg7CiAgICAgIGhlaWdodCA9IGltYWdlLmhlaWdodDsKICAgIH0KICAgIGlmICh3aWR0aCA8IDEgfHwgaGVpZ2h0IDwgMSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgaW1hZ2Ugd2lkdGg6ICR7d2lkdGh9IG9yIGhlaWdodDogJHtoZWlnaHR9YCk7CiAgICB9CiAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIHRoaXMuaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgdGhpcy5pbWFnZU1hc2sgPSBkaWN0LmdldCgiSU0iLCAiSW1hZ2VNYXNrIikgfHwgZmFsc2U7CiAgICB0aGlzLm1hdHRlID0gZGljdC5nZXQoIk1hdHRlIikgfHwgZmFsc2U7CiAgICBsZXQgYml0c1BlckNvbXBvbmVudCA9IGltYWdlLmJpdHNQZXJDb21wb25lbnQ7CiAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgYml0c1BlckNvbXBvbmVudCA9IGRpY3QuZ2V0KCJCUEMiLCAiQml0c1BlckNvbXBvbmVudCIpOwogICAgICBpZiAoIWJpdHNQZXJDb21wb25lbnQpIHsKICAgICAgICBpZiAodGhpcy5pbWFnZU1hc2spIHsKICAgICAgICAgIGJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEJpdHMgcGVyIGNvbXBvbmVudCBtaXNzaW5nIGluIGltYWdlOiAke3RoaXMuaW1hZ2VNYXNrfWApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5icGMgPSBiaXRzUGVyQ29tcG9uZW50OwogICAgaWYgKCF0aGlzLmltYWdlTWFzaykgewogICAgICBsZXQgY29sb3JTcGFjZSA9IGRpY3QuZ2V0UmF3KCJDUyIpIHx8IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIik7CiAgICAgIGNvbnN0IGhhc0NvbG9yU3BhY2UgPSAhIWNvbG9yU3BhY2U7CiAgICAgIGlmICghaGFzQ29sb3JTcGFjZSkgewogICAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQkEiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3dpdGNoIChpbWFnZS5udW1Db21wcykgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VHcmF5Iik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBjb2xvclNwYWNlID0gTmFtZS5nZXQoIkRldmljZVJHQiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VDTVlLIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbWFnZXMgd2l0aCAke2ltYWdlLm51bUNvbXBzfSBjb2xvciBjb21wb25lbnRzIG5vdCBzdXBwb3J0ZWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuanB4RGVjb2Rlck9wdGlvbnM/LnNtYXNrSW5EYXRhKSB7CiAgICAgICAgY29sb3JTcGFjZSA9IE5hbWUuZ2V0KCJEZXZpY2VSR0JBIik7CiAgICAgI
20H0KICAgICAgdGhpcy5jb2xvclNwYWNlID0gQ29sb3JTcGFjZS5wYXJzZSh7CiAgICAgICAgY3M6IGNvbG9yU3BhY2UsCiAgICAgICAgeHJlZiwKICAgICAgICByZXNvdXJjZXM6IGlzSW5saW5lID8gcmVzIDogbnVsbCwKICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgfSk7CiAgICAgIHRoaXMubnVtQ29tcHMgPSB0aGlzLmNvbG9yU3BhY2UubnVtQ29tcHM7CiAgICAgIGlmICh0aGlzLmpweERlY29kZXJPcHRpb25zKSB7CiAgICAgICAgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucy5udW1Db21wb25lbnRzID0gaGFzQ29sb3JTcGFjZSA/IHRoaXMubnVtQ29tcCA6IDA7CiAgICAgICAgdGhpcy5qcHhEZWNvZGVyT3B0aW9ucy5pc0luZGV4ZWRDb2xvcm1hcCA9IHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiSW5kZXhlZCI7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGVjb2RlID0gZGljdC5nZXRBcnJheSgiRCIsICJEZWNvZGUiKTsKICAgIHRoaXMubmVlZHNEZWNvZGUgPSBmYWxzZTsKICAgIGlmICh0aGlzLmRlY29kZSAmJiAodGhpcy5jb2xvclNwYWNlICYmICF0aGlzLmNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLCBiaXRzUGVyQ29tcG9uZW50KSB8fCBpc01hc2sgJiYgIUNvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKHRoaXMuZGVjb2RlLCAxKSkpIHsKICAgICAgdGhpcy5uZWVkc0RlY29kZSA9IHRydWU7CiAgICAgIGNvbnN0IG1heCA9ICgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMTsKICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHMgPSBbXTsKICAgICAgdGhpcy5kZWNvZGVBZGRlbmRzID0gW107CiAgICAgIGNvbnN0IGlzSW5kZXhlZCA9IHRoaXMuY29sb3JTcGFjZT8ubmFtZSA9PT0gIkluZGV4ZWQiOwogICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB0aGlzLmRlY29kZS5sZW5ndGg7IGkgKz0gMiwgKytqKSB7CiAgICAgICAgY29uc3QgZG1pbiA9IHRoaXMuZGVjb2RlW2ldOwogICAgICAgIGNvbnN0IGRtYXggPSB0aGlzLmRlY29kZVtpICsgMV07CiAgICAgICAgdGhpcy5kZWNvZGVDb2VmZmljaWVudHNbal0gPSBpc0luZGV4ZWQgPyAoZG1heCAtIGRtaW4pIC8gbWF4IDogZG1heCAtIGRtaW47CiAgICAgICAgdGhpcy5kZWNvZGVBZGRlbmRzW2pdID0gaXNJbmRleGVkID8gZG1pbiA6IG1heCAqIGRtaW47CiAgICAgI
20H0KICAgIH0KICAgIGlmIChzbWFzaykgewogICAgICB0aGlzLnNtYXNrID0gbmV3IFBERkltYWdlKHsKICAgICAgICB4cmVmLAogICAgICAgIHJlcywKICAgICAgICBpbWFnZTogc21hc2ssCiAgICAgICAgaXNJbmxpbmUsCiAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnN0IG1hc2tEaWN0ID0gbWFzay5kaWN0LAogICAgICAgICAgaW1hZ2VNYXNrID0gbWFza0RpY3QuZ2V0KCJJTSIsICJJbWFnZU1hc2siKTsKICAgICAgICBpZiAoIWltYWdlTWFzaykgewogICAgICAgICAgd2FybigiSWdub3JpbmcgL01hc2sgaW4gaW1hZ2Ugd2l0aG91dCAvSW1hZ2VNYXNrLiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm1hc2sgPSBuZXcgUERGSW1hZ2UoewogICAgICAgICAgICB4cmVmLAogICAgICAgICAgICByZXMsCiAgICAgICAgICAgIGltYWdlOiBtYXNrLAogICAgICAgICAgICBpc0lubGluZSwKICAgICAgICAgICAgaXNNYXNrOiB0cnVlLAogICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5tYXNrID0gbWFzazsKICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgYnVpbGRJbWFnZSh7CiAgICB4cmVmLAogICAgcmVzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZTsKICAgIGxldCBzbWFza0RhdGEgPSBudWxsOwogICAgbGV0IG1hc2tEYXRhID0gbnVsbDsKICAgIGNvbnN0IHNtYXNrID0gaW1hZ2UuZGljdC5nZXQoIlNNYXNrIik7CiAgICBjb25zdCBtYXNrID0gaW1hZ2UuZGljdC5nZXQoIk1hc2siKTsKICAgIGlmIChzbWFzaykgewogICAgICBpZiAoc21hc2sgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgc21hc2tEYXRhID0gc21hc2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2FybigiVW5zdXBwb3J0ZWQgL1NNYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgQmFzZVN0cmVhbSB8fCBBcnJheS5pc0FycmF5KG1hc2spKSB7CiAgICAgICAgbWFza0RhdGEgPSBtYXNrOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIlVuc3VwcG9ydGVkIC9NYXNrIGZvcm1hdC4iKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBQREZJbWFnZSh7CiAgICAgIHhyZWYsCiAgICAgIHJlcywKICAgICAgaW1hZ2U6IGltYWdlRGF0YSwKICAgICAgaXNJbmxpbmUsCiAgICAgIHNtYXNrOiBzbWFza0RhdGEsCiAgICAgIG1hc2s6IG1hc2tEYXRhLAogICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KTsKICB9CiAgc3RhdGljIGNyZWF0ZVJhd01hc2soewogICAgaW1nQXJyYXksCiAgICB3aWR0aCwKICAgIGhlaWdodCwKICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtLAogICAgaW52ZXJzZURlY29kZSwKICAgIGludGVycG9sYXRlCiAgfSkgewogICAgY29uc3QgY29tcHV0ZWRMZW5ndGggPSAod2lkdGggKyA3ID4+IDMpICogaGVpZ2h0OwogICAgY29uc3QgYWN0dWFsTGVuZ3RoID0gaW1nQXJyYXkuYnl0ZUxlbmd0aDsKICAgIGNvbnN0IGhhdmVGdWxsRGF0YSA9IGNvbXB1dGVkTGVuZ3RoID09PSBhY3R1YWxMZW5ndGg7CiAgICBsZXQgZGF0YSwgaTsKICAgIGlmIChpbWFnZUlzRnJvbURlY29kZVN0cmVhbSAmJiAoIWludmVyc2VEZWNvZGUgfHwgaGF2ZUZ1bGxEYXRhKSkgewogICAgICBkYXRhID0gaW1nQXJyYXk7CiAgICB9IGVsc2UgaWYgKCFpbnZlcnNlRGVjb2RlKSB7CiAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbWdBcnJheSk7CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoY29tcHV0ZWRMZW5ndGgpOwogICAgICBkYXRhLnNldChpbWdBcnJheSk7CiAgICAgIGRhdGEuZmlsbCgweGZmLCBhY3R1YWxMZW5ndGgpOwogICAgfQogICAgaWYgKGludmVyc2VEZWNvZGUpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbExlbmd0aDsgaSsrKSB7CiAgICAgICAgZGF0YVtpXSBePSAweGZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gewogICAgICBkYXRhLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBpbnRlcnBvbGF0ZQogICAgfTsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU1hc2soewogICAgaW1nQXJyYXksCiAgICB3aWR0aCwKICAgIGhlaWdodCwKICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtLAogICAgaW52ZXJzZURlY29kZSwKICAgIGludGVycG9sYXRlLAogICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBmYWxzZQogIH0pIHsKICAgIGNvbnN0IGlzU2luZ2xlT3BhcXVlUGl4ZWwgPSB3aWR0aCA9PT0gMSAmJiBoZWlnaHQgPT09IDEgJiYgaW52ZXJzZURlY29kZSA9PT0gKGltZ0FycmF5Lmxlbmd0aCA9PT0gMCB8fCAhIShpbWdBcnJheVswXSAmIDEyOCkpOwogICAgaWYgKGlzU2luZ2xlT3BhcXVlUGl4ZWwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBpc1NpbmdsZU9wYXF1ZVBpeGVsCiAgICAgIH07CiAgICB9CiAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKEltYWdlUmVzaXplci5uZWVkc1RvQmVSZXNpemVkKHdpZHRoLCBoZWlnaHQpKSB7CiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpOwogICAgICAgIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHsKICAgICAgICAgIHNyYzogaW1nQXJyYXksCiAgICAgICAgICBkZXN0OiBkYXRhLAogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICBub25CbGFja0NvbG9yOiAwLAogICAgICAgICAgaW52ZXJzZURlY29kZQogICAgICAgI
20H0pOwogICAgICAgIHJldHVybiBJbWFnZVJlc2l6ZXIuY3JlYXRlSW1hZ2UoewogICAgICAgICAga2luZDogSW1hZ2VLaW5kLlJHQkFfMzJCUFAsCiAgICAgICAgICBkYXRhLAogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBoZWlnaHQsCiAgICAgICAgICBpbnRlcnBvbGF0ZQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjb25zdCBpbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoewogICAgICAgIHNyYzogaW1nQXJyYXksCiAgICAgICAgZGVzdDogaW1nRGF0YS5kYXRhLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBub25CbGFja0NvbG9yOiAwLAogICAgICAgIGludmVyc2VEZWNvZGUKICAgICAgfSk7CiAgICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7CiAgICAgIGNvbnN0IGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBkYXRhOiBudWxsLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBpbnRlcnBvbGF0ZSwKICAgICAgICBiaXRtYXAKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB0aGlzLmNyZWF0ZVJhd01hc2soewogICAgICBpbWdBcnJheSwKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodCwKICAgICAgaW52ZXJzZURlY29kZSwKICAgICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0sCiAgICAgIGludGVycG9sYXRlCiAgICB9KTsKICB9CiAgZ2V0IGRyYXdXaWR0aCgpIHsKICAgIHJldHVybiBNYXRoLm1heCh0aGlzLndpZHRoLCB0aGlzLnNtYXNrPy53aWR0aCB8fCAwLCB0aGlzLm1hc2s/LndpZHRoIHx8IDApOwogIH0KICBnZXQgZHJhd0hlaWdodCgpIHsKICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmhlaWdodCwgdGh
20pcy5zbWFzaz8uaGVpZ2h0IHx8IDAsIHRoaXMubWFzaz8uaGVpZ2h0IHx8IDApOwogIH0KICBkZWNvZGVCdWZmZXIoYnVmZmVyKSB7CiAgICBjb25zdCBicGMgPSB0aGlzLmJwYzsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGNvbnN0IGRlY29kZUFkZGVuZHMgPSB0aGlzLmRlY29kZUFkZGVuZHM7CiAgICBjb25zdCBkZWNvZGVDb2VmZmljaWVudHMgPSB0aGlzLmRlY29kZUNvZWZmaWNpZW50czsKICAgIGNvbnN0IG1heCA9ICgxIDw8IGJwYykgLSAxOwogICAgbGV0IGksIGlpOwogICAgaWYgKGJwYyA9PT0gMSkgewogICAgICBmb3IgKGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgYnVmZmVyW2ldID0gKyFidWZmZXJbaV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGluZGV4ID0gMDsKICAgIGZvciAoaSA9IDAsIGlpID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0OyBpIDwgaWk7IGkrKykgewogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbXBzOyBqKyspIHsKICAgICAgICBidWZmZXJbaW5kZXhdID0gZGVjb2RlQW5kQ2xhbXAoYnVmZmVyW2luZGV4XSwgZGVjb2RlQWRkZW5kc1tqXSwgZGVjb2RlQ29lZmZpY2llbnRzW2pdLCBtYXgpOwogICAgICAgIGluZGV4Kys7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0Q29tcG9uZW50cyhidWZmZXIpIHsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgaWYgKGJwYyA9PT0gOCkgewogICAgICByZXR1cm4gYnVmZmVyOwogICAgfQogICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoOwogICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CiAgICBjb25zdCBsZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBzOwogICAgbGV0IGJ1ZmZlclBvcyA9IDA7CiAgICBsZXQgb3V0cHV0OwogICAgaWYgKGJwYyA8PSA4KSB7CiAgICAgIG91
20dHB1dCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7CiAgICB9IGVsc2UgaWYgKGJwYyA8PSAxNikgewogICAgICBvdXRwdXQgPSBuZXcgVWludDE2QXJyYXkobGVuZ3RoKTsKICAgIH0gZWxzZSB7CiAgICAgIG91dHB1dCA9IG5ldyBVaW50MzJBcnJheShsZW5ndGgpOwogICAgfQogICAgY29uc3Qgcm93Q29tcHMgPSB3aWR0aCAqIG51bUNvbXBzOwogICAgY29uc3QgbWF4ID0gKDEgPDwgYnBjKSAtIDE7CiAgICBsZXQgaSA9IDAsCiAgICAgIGlpLAogICAgICBidWY7CiAgICBpZiAoYnBjID09PSAxKSB7CiAgICAgIGxldCBtYXNrLCBsb29wMUVuZCwgbG9vcDJFbmQ7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKICAgICAgICBsb29wMUVuZCA9IGkgKyAocm93Q29tcHMgJiB+Nyk7CiAgICAgICAgbG9vcDJFbmQgPSBpICsgcm93Q29tcHM7CiAgICAgICAgd2hpbGUgKGkgPCBsb29wMUVuZCkgewogICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTsKICAgICAgICAgIG91dHB1dFtpXSA9IGJ1ZiA+PiA3ICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgMV0gPSBidWYgPj4gNiAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDJdID0gYnVmID4+IDUgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyAzXSA9IGJ1ZiA+PiA0ICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgNF0gPSBidWYgPj4gMyAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDVdID0gYnVmID4+IDIgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA2XSA9IGJ1ZiA+PiAxICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgN10gPSBidWYgJiAxOwogICAgICAgICAgaSArPSA4OwogICAgICAgIH0KICAgICAgICBpZiAoaSA8IGxvb3AyRW5kKSB7CiAgICAgICAgICBidWYgPSBidWZmZXJbYnVmZmVyUG9zKytdOwogICAgICAgICAgbWFzayA9IDEyODsKICAgICAgICAgIHdoaWxlIChpIDwgbG9vcDJFbmQpIHsKICAgICAgICAgICAgb3V0cHV0W2krK10gPSArISEoYnVmICYgbWFzayk7CiAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsZXQgYml0cyA9IDA7CiAgICAgIGJ1ZiA9IDA7CiAgICAgIGZvciAoaSA9IDAsIGlpID0gbGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICAgIGlmIChpICUgcm93Q29tcHMgPT09IDApIHsKICAgICAgICAgIGJ1ZiA9IDA7CiAgICAgICAgICBiaXRzID0gMDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGJpdHMgPCBicGMpIHsKICAgICAgICAgIGJ1ZiA9IGJ1ZiA8PCA4IHwgYnVmZmVyW2J1ZmZlclBvcysrXTsKICAgICAgICAgIGJpdHMgKz0gODsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVtYWluaW5nQml0cyA9IGJpdHMgLSBicGM7CiAgICAgICAgbGV0IHZhbHVlID0gYnVmID4+IHJlbWFpbmluZ0JpdHM7CiAgICAgICAgaWYgKHZhbHVlIDwgMCkgewogICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiBtYXgpIHsKICAgICAgICAgIHZhbHVlID0gbWF4OwogICAgICAgIH0KICAgICAgICBvdXRwdXRbaV0gPSB2YWx1ZTsKICAgICAgICBidWYgJj0gKDEgPDwgcmVtYWluaW5nQml0cykgLSAxOwogICAgICAgIGJpdHMgPSByZW1haW5pbmdCaXRzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KICBhc3luYyBmaWxsT3BhY2l0eShyZ2JhQnVmLCB3aWR0aCwgaGVpZ2h0LCBhY3R1YWxIZWlnaHQsIGltYWdlKSB7CiAgICBjb25zdCBzbWFzayA9IHRoaXMuc21hc2s7CiAgICBjb25zdCBtYXNrID0gdGhpcy5tYXNrOwogICAgbGV0IGFscGhhQnVmLCBzdywgc2gsIGksIGlpLCBqOwogICAgaWYgKHNtYXNrKSB7CiAgICAgIHN3ID0gc21hc2sud2lkdGg7CiAgICAgIHNoID0gc21hc2suaGVpZ2h0OwogICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTsKICAgICAgYXdhaXQgc21hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpOwogICAgICBpZiAoc3cgIT09IHdpZHRoIHx8IHNoICE9PSBoZWlnaHQpIHsKICAgICAgICBhbHBoYUJ1ZiA9IHJlc2l6ZUltYWdlTWFzayhhbHBoYUJ1Ziwgc21hc2suYnBjLCBzdywgc2gsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1hc2spIHsKICAgICAgaWYgKG1hc2sgaW5zdGFuY2VvZiBQREZJbWFnZSkgewogICAgICAgIHN3ID0gbWFzay53aWR0aDsKICAgICAgICBzaCA9IG1hc2suaGVpZ2h0OwogICAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHN3ICogc2gpOwogICAgICAgIG1hc2subnVtQ29tcHMgPSAxOwogICAgICAgIGF3YWl0IG1hc2suZmlsbEdyYXlCdWZmZXIoYWxwaGFCdWYpOwogICAgICAgIGZvciAoaSA9IDAsIGlpID0gc3cgKiBzaDsgaSA8IGlpOyArK2kpIHsKICAgICAgICAgIGFscGhhQnVmW2ldID0gMjU1IC0gYWxwaGFCdWZbaV07CiAgICAgICAgfQogICAgICAgIGlmIChzdyAhPT0gd2lkdGggfHwgc2ggIT09IGhlaWdodCkgewogICAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIG1hc2suYnBjLCBzdywgc2gsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7CiAgICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQpOwogICAgICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHdpZHRoICogaGVpZ2h0OyBpIDwgaWk7ICsraSkgewogICAgICAgICAgbGV0IG9wYWNpdHkgPSAwOwogICAgICAgICAgY29uc3QgaW1hZ2VPZmZzZXQgPSBpICogbnVtQ29tcHM7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtQ29tcHM7ICsraikgewogICAgICAgICAgICBjb25zdCBjb2xvciA9IGltYWdlW2ltYWdlT2Zmc2V0ICsgal07CiAgICAgICAgICAgIGNvbnN0IG1hc2tPZmZzZXQgPSBqICogMjsKICAgICAgICAgICAgaWYgKGNvbG9yIDwgbWFza1ttYXNrT2Zmc2V0XSB8fCBjb2xvciA+IG1hc2tbbWFza09mZnNldCArIDFdKSB7CiAgICAgICAgICAgICAgb3BhY2l0eSA9IDI1NTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYWxwaGFCdWZbaV0gPSBvcGFjaXR5OwogICAgICAgI
20H0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlVua25vd24gbWFzayBmb3JtYXQuIik7CiAgICAgIH0KICAgIH0KICAgIGlmIChhbHBoYUJ1ZikgewogICAgICBmb3IgKGkgPSAwLCBqID0gMywgaWkgPSB3aWR0aCAqIGFjdHVhbEhlaWdodDsgaSA8IGlpOyArK2ksIGogKz0gNCkgewogICAgICAgIHJnYmFCdWZbal0gPSBhbHBoYUJ1ZltpXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChpID0gMCwgaiA9IDMsIGlpID0gd2lkdGggKiBhY3R1YWxIZWlnaHQ7IGkgPCBpaTsgKytpLCBqICs9IDQpIHsKICAgICAgICByZ2JhQnVmW2pdID0gMjU1OwogICAgICB9CiAgICB9CiAgfQogIHVuZG9QcmVibGVuZChidWZmZXIsIHdpZHRoLCBoZWlnaHQpIHsKICAgIGNvbnN0IG1hdHRlID0gdGhpcy5zbWFzaz8ubWF0dGU7CiAgICBpZiAoIW1hdHRlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG1hdHRlUmdiID0gdGhpcy5jb2xvclNwYWNlLmdldFJnYihtYXR0ZSwgMCk7CiAgICBjb25zdCBtYXR0ZVIgPSBtYXR0ZVJnYlswXTsKICAgIGNvbnN0IG1hdHRlRyA9IG1hdHRlUmdiWzFdOwogICAgY29uc3QgbWF0dGVCID0gbWF0dGVSZ2JbMl07CiAgICBjb25zdCBsZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIDQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CiAgICAgIGNvbnN0IGFscGhhID0gYnVmZmVyW2kgKyAzXTsKICAgICAgaWYgKGFscGhhID09PSAwKSB7CiAgICAgICAgYnVmZmVyW2ldID0gMjU1OwogICAgICAgIGJ1ZmZlcltpICsgMV0gPSAyNTU7CiAgICAgICAgYnVmZmVyW2kgKyAyXSA9IDI1NTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBrID0gMjU1IC8gYWxwaGE7CiAgICAgIGJ1ZmZlcltpXSA9IChidWZmZXJbaV0gLSBtYXR0ZVIpICogayArIG1hdHRlUjsKICAgICAgYnVmZmVyW2kgKyAxXSA9IChidWZmZXJbaSArIDFdIC0gbWF0dGVHKSAqIGsgKyBtYXR0ZUc7CiAgICAgIGJ1ZmZlcltpICsgMl0gPSAoYnVmZmVyW2kgKyAyXSAtIG1hdHRlQikgKiBrICsgbWF0dGVCOwogICAgfQogIH0KICBhc3luYyBjcmVhdGVJbWFnZURhdGEoZm9yY2VSR0JBID0gZmFsc2UsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gZmFsc2UpIHsKICAgIGNvbnN0IGRyYXdXaWR0aCA9IHRoaXMuZHJhd1dpZHRoOwogICAgY29uc3QgZHJhd0hlaWdodCA9IHRoaXMuZHJhd0hlaWdodDsKICAgIGNvbnN0IGltZ0RhdGEgPSB7CiAgICAgIHdpZHRoOiBkcmF3V2lkdGgsCiAgICAgIGhlaWdodDogZHJhd0hlaWdodCwKICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUsCiAgICAgIGtpbmQ6IDAsCiAgICAgIGRhdGE6IG51bGwKICAgIH07CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CiAgICBjb25zdCBvcmlnaW5hbFdpZHRoID0gdGhpcy53aWR0aDsKICAgIGNvbnN0IG9yaWdpbmFsSGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CiAgICBjb25zdCBicGMgPSB0aGlzLmJwYzsKICAgIGNvbnN0IHJvd0J5dGVzID0gb3JpZ2luYWxXaWR0aCAqIG51bUNvbXBzICogYnBjICsgNyA+PiAzOwogICAgY29uc3QgbXVzdEJlUmVzaXplZCA9IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmIEltYWdlUmVzaXplci5uZWVkc1RvQmVSZXNpemVkKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICBpZiAoIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzayAmJi
20B0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkRldmljZVJHQkEiKSB7CiAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgICBjb25zdCBpbWdBcnJheSA9IGltZ0RhdGEuZGF0YSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhvcmlnaW5hbEhlaWdodCAqIG9yaWdpbmFsV2lkdGggKiA0LCB7fSk7CiAgICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICAgIGlmICghbXVzdEJlUmVzaXplZCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQml0bWFwKEltYWdlS2luZC5SR0JBXzMyQlBQLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGltZ0FycmF5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEltYWdlUmVzaXplci5jcmVhdGVJbWFnZShpbWdEYXRhLCBmYWxzZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGltZ0RhdGE7CiAgICB9CiAgICBpZiAoIWZvcmNlUkdCQSkgewogICAgICBsZXQga2luZDsKICAgICAgaWYgKHRoaXMuY29sb3JTcGFjZS5uYW1lID09PSAiRGV2aWNlR3JheSIgJiYgYnBjID09PSAxKSB7CiAgICAgICAga2luZCA9IEltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDsKICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkRldmljZVJHQiIgJiYgYnBjID09PSA4ICYmICF0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgICAga2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7CiAgICAgIH0KICAgICAgaWYgKGtpbmQgJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzayAmJi
20BkcmF3V2lkdGggPT09IG9yaWdpbmFsV2lkdGggJiYgZHJhd0hlaWdodCA9PT0gb3JpZ2luYWxIZWlnaHQpIHsKICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuI2dldEltYWdlKG9yaWdpbmFsV2lkdGgsIG9yaWdpbmFsSGVpZ2h0KTsKICAgICAgICBpZiAoaW1hZ2UpIHsKICAgICAgICAgIHJldHVybiBpbWFnZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzLCB7fSk7CiAgICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICAgICAgICByZXR1cm4gSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHsKICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgICAgICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgICAgICAgICAgfSwgdGhpcy5uZWVkc0RlY29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoa2luZCwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIGRhdGEpOwogICAgICAgIH0KICAgICAgICBpbWdEYXRhLmtpbmQgPSBraW5kOwogICAgICAgIGltZ0RhdGEuZGF0YSA9IGRhdGE7CiAgICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICAgIGFzc2VydChraW5kID09PSBJbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAsICJQREZJbWFnZS5jcmVhdGVJbWFnZURhdGE6IFRoZSBpbWFnZSBtdXN0IGJlIGdyYXlzY2FsZS4iKTsKICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGltZ0RhdGEuZGF0YTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJ1ZmZlci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGJ1ZmZlcltpXSBePSAweGZmOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaW1nRGF0YTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbWFnZSBpbnN0YW5jZW9mIEpwZWdTdHJlYW0gJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzayAmJiAhdGhpcy5uZWVkc0RlY29kZSkgewogICAgICAgIGxldCBpbWFnZUxlbmd0aCA9IG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXM7CiAgICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmICFtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICBsZXQgaXNIYW5kbGVkID0gZmFsc2U7CiAgICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoICo9IDQ7CiAgICAgICAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgICAgICBpbWFnZUxlbmd0aCA9IGltYWdlTGVuZ3RoIC8gMyAqIDQ7CiAgICAgICAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CiAgICAgICAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0hhbmRsZWQpIHsKICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLiNnZXRJbWFnZShkcmF3V2lkdGgsIGRyYXdIZWlnaHQpOwogICAgICAgICAgICBpZiAoaW1hZ2UpIHsKICAgICAgICAgICAgICByZXR1cm4gaW1hZ2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmdiYSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhpbWFnZUxlbmd0aCwgewogICAgICAgICAgICAgIGRyYXdXaWR0aCwKICAgICAgICAgICAgICBkcmF3SGVpZ2h0LAogICAgICAgICAgICAgIGZvcmNlUkdCQTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQml0bWFwKEltYWdlS2luZC5SR0JBXzMyQlBQLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIHJnYmEpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoICo9IDM7CiAgICAgICAgICAgIGNhc2UgIkRldmljZVJHQiI6CiAgICAgICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7CiAgICAgICAgICAgICAgaW1nRGF0YS5kYXRhID0gYXdhaXQgdGhpcy5nZXRJbWFnZUJ5dGVzKGltYWdlTGVuZ3RoLCB7CiAgICAgICAgICAgICAgICBkcmF3V2lkdGgsCiAgICAgICAgICAgICAgICBkcmF3SGVpZ2h0LAogICAgICAgICAgICAgICAgZm9yY2VSR0I6IHRydWUKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEltYWdlUmVzaXplci5jcmVhdGVJbWFnZShpbWdEYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGltZ0RhdGE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBpbWdBcnJheSA9IGF3YWl0IHRoaXMuZ2V0SW1hZ2VCeXRlcyhvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzLCB7CiAgICAgIGludGVybmFsOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IDAgfCBpbWdBcnJheS5sZW5ndGggLyByb3dCeXRlcyAqIGRyYXdIZWlnaHQgLyBvcmlnaW5hbEhlaWdodDsKICAgIGNvbnN0IGNvbXBzID0gdGhpcy5nZXRDb21wb25lbnRzKGltZ0FycmF5KTsKICAgIGxldCBhbHBoYTAxLCBtYXliZVVuZG9QcmVibGVuZDsKICAgIGxldCBjYW52YXMsIGN0eCwgY2FudmFzSW1nRGF0YSwgZGF0YTsKICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiAhbXVzdEJlUmVzaXplZCkgewogICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjYW52YXNJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YShkcmF3V2lkdGgsIGRyYXdIZWlnaHQpOwogICAgICBkYXRhID0gY2FudmFzSW1nRGF0YS5kYXRhOwogICAgfQogICAgaW1nRGF0YS5raW5kID0gSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICBpZiAoIWZvcmNlUkdCQSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrKSB7CiAgICAgIGlmICghaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgfHwgbXVzdEJlUmVzaXplZCkgewogICAgICAgIGltZ0RhdGEua2luZCA9IEltYWdlS2luZC5SR0JfMjRCUFA7CiAgICAgICAgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogMyk7CiAgICAgICAgYWxwaGEwMSA9IDA7CiAgICAgI
20H0gZWxzZSB7CiAgICAgICAgY29uc3QgYXJyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyKTsKICAgICAgICBhcnIuZmlsbChGZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmKTsKICAgICAgICBhbHBoYTAxID0gMTsKICAgICAgfQogICAgICBtYXliZVVuZG9QcmVibGVuZCA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCB8fCBtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogNCk7CiAgICAgIH0KICAgICAgYWxwaGEwMSA9IDE7CiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gdHJ1ZTsKICAgICAgYXdhaXQgdGhpcy5maWxsT3BhY2l0eShkYXRhLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGFjdHVhbEhlaWdodCwgY29tcHMpOwogICAgfQogICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgdGhpcy5kZWNvZGVCdWZmZXIoY29tcHMpOwogICAgfQogICAgdGhpcy5jb2xvclNwYWNlLmZpbGxSZ2IoZGF0YSwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKTsKICAgIGlmIChtYXliZVVuZG9QcmVibGVuZCkgewogICAgICB0aGlzLnVuZG9QcmVibGVuZChkYXRhLCBkcmF3V2lkdGgsIGFjdHVhbEhlaWdodCk7CiAgICB9CiAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgIW11c3RCZVJlc2l6ZWQpIHsKICAgICAgY3R4LnB1dEltYWdlRGF0YShjYW52YXNJbWdEYXRhLCAwLCAwKTsKICAgICAgY29uc3QgYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IG51bGwsCiAgICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsCiAgICAgICAgYml0bWFwLAogICAgICAgIGludGVycG9sYXRlOiB0aGlzLmludGVycG9sYXRlCiAgICAgIH07CiAgICB9CiAgICBpbWdEYXRhLmRhdGEgPSBkYXRhOwogICAgaWYgKG11c3RCZVJlc2l6ZWQpIHsKICAgICAgcmV0dXJuIEltYWdlUmVzaXplci5jcmVhdGVJbWFnZShpbWdEYXRhKTsKICAgIH0KICAgIHJldHVybiBpbWdEYXRhOwogIH0KICBhc3luYyBmaWxsR3JheUJ1ZmZlcihidWZmZXIpIHsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGlmIChudW1Db21wcyAhPT0gMSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICR7bnVtQ29tcHN9YCk7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGg7CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3Qgcm93Qnl0ZXMgPSB3aWR0aCAqIG51bUNvbXBzICogYnBjICsgNyA+PiAzOwogICAgY29uc3QgaW1nQXJyYXkgPSBhd2FpdCB0aGlzLmdldEltYWdlQnl0ZXMoaGVpZ2h0ICogcm93Qnl0ZXMsIHsKICAgICAgaW50ZXJuYWw6IHRydWUKICAgIH0pOwogICAgY29uc3QgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOwogICAgbGV0IGksIGxlbmd0aDsKICAgIGlmIChicGMgPT09IDEpIHsKICAgICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7CiAgICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBjb21wc1tpXSAtIDEgJiAyNTU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgYnVmZmVyW2ldID0gLWNvbXBzW2ldICYgMjU1OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CiAgICB9CiAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJwYykgLSAxKTsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBidWZmZXJbaV0gPSBzY2FsZSAqIGNvbXBzW2ldOwogICAgfQogIH0KICBjcmVhdGVCaXRtYXAoa2luZCwgd2lkdGgsIGhlaWdodCwgc3JjKSB7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBsZXQgaW1nRGF0YTsKICAgIGlmIChraW5kID09PSBJbWFnZUtpbmQuUkdCQV8zMkJQUCkgewogICAgICBpbWdEYXRhID0gbmV3IEltYWdlRGF0YShzcmMsIHdpZHRoLCBoZWlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgaW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7CiAgICAgIGNvbnZlcnRUb1JHQkEoewogICAgICAgIGtpbmQsCiAgICAgICAgc3JjLAogICAgICAgIGRlc3Q6IG5ldyBVaW50MzJBcnJheShpbWdEYXRhLmRhdGEuYnVmZmVyKSwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgaW52ZXJzZURlY29kZTogdGhpcy5uZWVkc0RlY29kZQogICAgICB9KTsKICAgIH0KICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7CiAgICBjb25zdCBiaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICByZXR1cm4gewogICAgICBkYXRhOiBudWxsLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBiaXRtYXAsCiAgICAgIGludGVycG9sYXRlOiB0aGlzLmludGVycG9sYXRlCiAgICB9OwogIH0KICBhc3luYyAjZ2V0SW1hZ2Uod2lkdGgsIGhlaWdodCkgewogICAgY29uc3QgYml0bWFwID0gYXdhaXQgdGhpcy5pbWFnZS5nZXRUcmFuc2ZlcmFibGVJbWFnZSgpOwogICAgaWYgKCFiaXRtYXApIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gewogICAgICBkYXRhOiBudWxsLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBiaXRtYXAsCiAgICAgIGludGVycG9sYXRlOiB0aGlzLmludGVycG9sYXRlCiAgICB9OwogIH0KICBhc3luYyBnZXRJbWFnZUJ5dGVzKGxlbmd0aCwgewogICAgZHJhd1dpZHRoLAogICAgZHJhd0hlaWdodCwKICAgIGZvcmNlUkdCQSA9IGZhbHNlLAogICAgZm9yY2VSR0IgPSBmYWxzZSwKICAgIGludGVybmFsID0gZmFsc2UKICB9KSB7CiAgICB0aGlzLmltYWdlLnJlc2V0KCk7CiAgICB0aGlzLmltYWdlLmRyYXdXaWR0aCA9IGRyYXdXaWR0aCB8fCB0aGlzLndpZHRoOwogICAgdGhpcy5pbWFnZS5kcmF3SGVpZ2h0ID0gZHJhd0hlaWdodCB8fCB0aGlzLmhlaWdodDsKICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0JBID0gISFmb3JjZVJHQkE7CiAgICB0aGlzLmltYWdlLmZvcmNlUkdCID0gISFmb3JjZVJHQjsKICAgIGNvbnN0IGltYWdlQnl0ZXMgPSBhd2FpdCB0aGlzLmltYWdlLmdldEltYWdlRGF0YShsZW5ndGgsIHRoaXMuanB4RGVjb2Rlck9wdGlvbnMpOwogICAgaWYgKGludGVybmFsIHx8IHRoaXMuaW1hZ2UgaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0p
20IHsKICAgICAgcmV0dXJuIGltYWdlQnl0ZXM7CiAgICB9CiAgICBhc3NlcnQoaW1hZ2VCeXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksICdQREZJbWFnZS5nZXRJbWFnZUJ5dGVzOiBVbnN1cHBvcnRlZCAiaW1hZ2VCeXRlcyIgdHlwZS4nKTsKICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbWFnZUJ5dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2V2YWx1YXRvci5qcwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY29uc3QgRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7CiAgbWF4SW1hZ2VTaXplOiAtMSwKICBkaXNhYmxlRm9udEZhY2U6IGZhbHNlLAogIGlnbm9yZUVycm9yczogZmFsc2UsCiAgaXNFdmFsU3VwcG9ydGVkOiB0cnVlLAogIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBmYWxzZSwKICBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZDogZmFsc2UsCiAgY2FudmFzTWF4QXJlYUluQnl0ZXM6IC0xLAogIGZvbnRFeHRyYVByb3BlcnRpZXM6IGZhbHNlLAogIHVzZVN5c3RlbUZvbnRzOiB0cnVlLAogIGNNYXBVcmw6IG51bGwsCiAgc3RhbmRhcmRGb250RGF0YVVybDogbnVsbAp9KTsKY29uc3QgUGF0dGVyblR5cGUgPSB7CiAgVElMSU5HOiAxLAogIFNIQURJTkc6IDIKfTsKY29uc3QgVEVYVF9DSFVOS19CQVRDSF9TSVpFID0gMTA7CmNvbnN0IGRlZmVycmVkID0gUHJvbWlzZS5yZXNvbHZlKCk7CmZ1bmN0aW9uIG5vcm1hbGl6ZUJsZW5kTW9kZSh2YWx1ZSwgcGFyc2luZ0FycmF5ID0gZmFsc2UpIHsKICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGNvbnN0IG1heWJlQk0gPSBub3JtYWxpemVCbGVuZE1vZGUodmFsLCB0cnVlKTsKICAgICAgaWYgKG1heWJlQk0pIHsKICAgICAgICByZXR1cm4gbWF5YmVCTTsKICAgICAgfQogICAgfQogICAgd2FybihgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogJHt2YWx1ZX1gKTsKICAgIHJldHVybiAic291cmNlLW92ZXIiOwogIH0KICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICBpZiAocGFyc2luZ0FycmF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CiAgfQogIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgY2FzZSAiTm9ybWFsIjoKICAgIGNhc2UgIkNvbXBhdGlibGUiOgogICAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKICAgIGNhc2UgIk11bHRpcGx5IjoKICAgICAgcmV0dXJuICJtdWx0aXBseSI7CiAgICBjYXNlICJTY3JlZW4iOgogICAgICByZXR1cm4gInNjcmVlbiI7CiAgICBjYXNlICJPdmVybGF5IjoKICAgICAgcmV0dXJuICJvdmVybGF5IjsKICAgIGNhc2UgIkRhcmtlbiI6CiAgICAgIHJldHVybiAiZGFya2VuIjsKICAgIGNhc2UgIkxpZ2h0ZW4iOgogICAgICByZXR1cm4gImxpZ2h0ZW4iOwogICAgY2FzZSAiQ29sb3JEb2RnZSI6CiAgICAgIHJldHVybiAiY29sb3ItZG9kZ2UiOwogICAgY2FzZSAiQ29sb3JCdXJuIjoKICAgICAgcmV0dXJuICJjb2xvci1idXJuIjsKICAgIGNhc2UgIkhhcmRMaWdodCI6CiAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CiAgICBjYXNlICJTb2Z0TGlnaHQiOgogICAgICByZXR1cm4gInNvZnQtbGlnaHQiOwogICAgY2FzZSAiRGlmZmVyZW5jZSI6CiAgICAgIHJldHVybiAiZGlmZmVyZW5jZSI7CiAgICBjYXNlICJFeGNsdXNpb24iOgogICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CiAgICBjYXNlICJIdWUiOgogICAgICByZXR1cm4gImh1ZSI7CiAgICBjYXNlICJTYXR1cmF0aW9uIjoKICAgICAgcmV0dXJuICJzYXR1cmF0aW9uIjsKICAgIGNhc2UgIkNvbG9yIjoKICAgICAgcmV0dXJuICJjb2xvciI7CiAgICBjYXNlICJMdW1pbm9zaXR5IjoKICAgICAgcmV0dXJuICJsdW1pbm9zaXR5IjsKICB9CiAgaWYgKHBhcnNpbmdBcnJheSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHdhcm4oYFVuc3VwcG9ydGVkIGJsZW5kIG1vZGU6ICR7dmFsdWUubmFtZX1gKTsKICByZXR1cm4gInNvdXJjZS1vdmVyIjsKfQpmdW5jdGlvbiBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BMaXN0LCBkYXRhKSB7CiAgaWYgKGRhdGEub2JqSWQpIHsKICAgIG9wTGlzdC5hZGREZXBlbmRlbmN5KGRhdGEub2JqSWQpOwogIH0KICBvcExpc3QuYWRkSW1hZ2VPcHMoZGF0YS5mbiwgZGF0YS5hcmdzLCBkYXRhLm9wdGlvbmFsQ29udGVudCwgZGF0YS5oYXNNYXNrKTsKICBpZiAoZGF0YS5mbiA9PT0gT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCAmJiBkYXRhLmFyZ3NbMF0/LmNvdW50ID4gMCkgewogICAgZGF0YS5hcmdzWzBdLmNvdW50Kys7CiAgfQp9CmNsYXNzIFRpbWVTbG90TWFuYWdlciB7CiAgc3RhdGljIFRJTUVfU0xPVF9EVVJBVElPTl9NUyA9IDIwOwogIHN0YXRpYyBDSEVDS19USU1FX0VWRVJZID0gMTAwOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXNldCgpOwogIH0KICBjaGVjaygpIHsKICAgIGlmICgrK3RoaXMuY2hlY2tlZCA8IFRpbWVTbG90TWFuYWdlci5DSEVDS19USU1FX0VWRVJZKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuY2hlY2tlZCA9IDA7CiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5lbmRUaW1lID0gRGF0ZS5ub3coKSArIFRpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7CiAgICB0aGlzLmNoZWNrZWQgPSAwOwogIH0KfQpjbGFzcyBQYXJ0aWFsRXZhbHVhdG9yIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgaGFuZGxlciwKICAgIHBhZ2VJbmRleCwKICAgIGlkRmFjdG9yeSwKICAgIGZvbnRDYWNoZSwKICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCiAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICBnbG9iYWxJbWFnZUNhY2hlLAogICAgc3lzdGVtRm9udENhY2hlLAogICAgb3B0aW9ucyA9IG51bGwKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwogICAgdGhpcy5pZEZhY3RvcnkgPSBpZEZhY3Rvcnk7CiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSA9IHN0YW5kYXJkRm9udERhdGFDYWNoZTsKICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7CiAgICB0aGlzLnN5c3RlbUZvbnRDYWNoZSA9IHN5c3RlbUZvbnRDYWNoZTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy50eXBlM0ZvbnRSZWZzID0gbnVsbDsKICAgIHRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZSA9IG5ldyBSZWdpb25hbEltYWdlQ2FjaGUoKT
20sKICAgIHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCA9IHRoaXMuZmV0Y2hCdWlsdEluQ01hcC5iaW5kKHRoaXMpOwogICAgSW1hZ2VSZXNpemVyLnNldE9wdGlvbnModGhpcy5vcHRpb25zKTsKICAgIEpwZWdTdHJlYW0uc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpOwogIH0KICBnZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpIHsKICAgIGNvbnN0IHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBQREZGdW5jdGlvbkZhY3RvcnkoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5vcHRpb25zLmlzRXZhbFN1cHBvcnRlZAogICAgfSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfcGRmRnVuY3Rpb25GYWN0b3J5IiwgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICB9CiAgZ2V0IHBhcnNpbmdUeXBlM0ZvbnQoKSB7CiAgICByZXR1cm4gISF0aGlzLnR5cGUzRm9udFJlZnM7CiAgfQogIGNsb25lKG5ld09wdGlvbnMgPSBudWxsKSB7CiAgICBjb25zdCBuZXdFdmFsdWF0b3IgPSBPYmplY3QuY3JlYXRlKHRoaXMpOwogICAgbmV3RXZhbHVhdG9yLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMub3B0aW9ucywgbmV3T3B0aW9ucyk7CiAgICByZXR1cm4gbmV3RXZhbHVhdG9yOwogIH0KICBoYXNCbGVuZE1vZGVzKHJlc291cmNlcywgbm9uQmxlbmRNb2Rlc1NldCkgewogICAgaWYgKCEocmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHJlc291cmNlcy5vYmpJZCAmJiBub25CbGVuZE1vZGVzU2V0LmhhcyhyZXNvdXJjZXMub2JqSWQpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHByb2Nlc3NlZCA9IG5ldyBSZWZTZXQobm9uQmxlbmRNb2Rlc1NldCk7CiAgICBpZiAocmVzb3VyY2VzLm9iaklkKSB7CiAgICAgIHByb2Nlc3NlZC5wdXQocmVzb3VyY2VzLm9iaklkKTsKICAgIH0KICAgIGNvbnN0IG5vZGVzID0gW3Jlc291cmNlc10sCiAgICAgIHhyZWYgPSB0aGlzLnhyZWY7CiAgICB3aGlsZSAobm9kZXMubGVuZ3RoKSB7CiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5zaGlmdCgpOwogICAgICBjb25zdCBncmFwaGljU3RhdGVzID0gbm9kZS5nZXQoIkV4dEdTdGF0ZSIpOwogICAgICBpZiAoZ3JhcGhpY1N0YXRlcyBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBmb3IgKGxldCBncmFwaGljU3RhdGUgb2YgZ3JhcGhpY1N0YXRlcy5nZXRSYXdWYWx1ZXMoKSkgewogICAgICAgICAgaWYgKGdyYXBoaWNTdGF0ZSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyhncmFwaGljU3RhdGUpKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBncmFwaGljU3RhdGUgPSB4cmVmLmZldGNoKGdyYXBoaWNTdGF0ZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUpOwogICAgICAgICAgICAgIGluZm8oYGhhc0JsZW5kTW9kZXMgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke2V4fSIuYCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghKGdyYXBoaWNTdGF0ZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGdyYXBoaWNTdGF0ZS5vYmpJZCkgewogICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZS5vYmpJZCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBibSA9IGdyYXBoaWNTdGF0ZS5nZXQoIkJNIik7CiAgICAgICAgICBpZiAoYm0gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIGlmIChibS5uYW1lICE9PSAiTm9ybWFsIikgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJtICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShibSkpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGJtKSB7CiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lICYmIGVsZW1lbnQubmFtZSAhPT0gIk5vcm1hbCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB4T2JqZWN0cyA9IG5vZGUuZ2V0KCJYT2JqZWN0Iik7CiAgICAgIGlmICghKHhPYmplY3RzIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCB4T2JqZWN0IG9mIHhPYmplY3RzLmdldFJhd1ZhbHVlcygpKSB7CiAgICAgICAgaWYgKHhPYmplY3QgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKHhPYmplY3QpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgeE9iamVjdCA9IHhyZWYuZmV0Y2goeE9iamVjdCk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICBwcm9jZXNzZWQucHV0KHhPYmplY3QpOwogICAgICAgICAgICBpbmZvKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghKHhPYmplY3QgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh4T2JqZWN0LmRpY3Qub2JqSWQpIHsKICAgICAgICAgIHByb2Nlc3NlZC5wdXQoeE9iamVjdC5kaWN0Lm9iaklkKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeFJlc291cmNlcyA9IHhPYmplY3QuZGljdC5nZXQoIlJlc291cmNlcyIpOwogICAgICAgIGlmICghKHhSZXNvdXJjZXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkICYmIHByb2Nlc3NlZC5oYXMoeFJlc291cmNlcy5vYmpJZCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgI
20H0KICAgICAgICBub2Rlcy5wdXNoKHhSZXNvdXJjZXMpOwogICAgICAgIGlmICh4UmVzb3VyY2VzLm9iaklkKSB7CiAgICAgICAgICBwcm9jZXNzZWQucHV0KHhSZXNvdXJjZXMub2JqSWQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCByZWYgb2YgcHJvY2Vzc2VkKSB7CiAgICAgIG5vbkJsZW5kTW9kZXNTZXQucHV0KHJlZik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGFzeW5jICNmZXRjaERhdGEodXJsKSB7CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGZpbGUgIiR7dXJsfSIgd2l0aCAiJHtyZXNwb25zZS5zdGF0dXNUZXh0fSIuYCk7CiAgICB9CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7CiAgfQogIGFzeW5jIGZldGNoQnVpbHRJbkNNYXAobmFtZSkgewogICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuYnVpbHRJbkNNYXBDYWNoZS5nZXQobmFtZSk7CiAgICBpZiAoY2FjaGVkRGF0YSkgewogICAgICByZXR1cm4gY2FjaGVkRGF0YTsKICAgIH0KICAgIGxldCBkYXRhOwogICAgaWYgKHRoaXMub3B0aW9ucy5jTWFwVXJsICE9PSBudWxsKSB7CiAgICAgIGNvbnN0IGNNYXBEYXRhID0gYXdhaXQgdGhpcy4jZmV0Y2hEYXRhKGAke3RoaXMub3B0aW9ucy5jTWFwVXJsfSR7bmFtZX0uYmNtYXBgKTsKICAgICAgZGF0YSA9IHsKICAgICAgICBjTWFwRGF0YSwKICAgICAgICBpc0NvbXByZXNzZWQ6IHRydWUKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLmhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJGZXRjaEJ1aWx0SW5DTWFwIiwgewogICAgICAgIG5hbWUKICAgICAgfSk7CiAgICB9CiAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuc2V0KG5hbWUsIGRhdGEpOwogICAgcmV0dXJuIGRhdGE7CiAgfQogIGFzeW5jIGZldGNoU3RhbmRhcmRGb250RGF0YShuYW1lKSB7CiAgICBjb25zdCBjYWNoZWREYXRhID0gdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUuZ2V0KG5hbWUpOwogICAgaWYgKGNhY2hlZERhdGEpIHsKICAgICAgcmV0dXJuIG5ldyBTdHJlYW0oY2FjaGVkRGF0YSk7CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzICYmIG5hbWUgIT09ICJTeW1ib2wiICYmIG5hbWUgIT09ICJaYXBmRGluZ2JhdHMiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZVRvRmlsZU5hbWUgPSBnZXRGb250TmFtZVRvRmlsZU1hcCgpLAogICAgICBmaWxlbmFtZSA9IHN0YW5kYXJkRm9udE5hbWVUb0ZpbGVOYW1lW25hbWVdOwogICAgbGV0IGRhdGE7CiAgICB0cnkgewogICAgICBpZiAodGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmwgIT09IG51bGwpIHsKICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy4jZmV0Y2hEYXRhKGAke3RoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsfSR7ZmlsZW5hbWV9YCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoU3RhbmRhcmRGb250RGF0YSIsIHsKICAgICAgICAgIGZpbGVuYW1lCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIHdhcm4oZXgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLnNldChuYW1lLCBkYXRhKTsKICAgIHJldHVybiBuZXcgU3RyZWFtKGRhdGEpOwogIH0KICBhc3luYyBidWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgc21hc2ssIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgY29uc3QgZGljdCA9IHhvYmouZGljdDsKICAgIGNvbnN0IG1hdHJpeCA9IGxvb2t1cE1hdHJpeChkaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwTm9ybWFsUmVjdChkaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgbGV0IG9wdGlvbmFsQ29udGVudCwgZ3JvdXBPcHRpb25zOwogICAgaWYgKGRpY3QuaGFzKCJPQyIpKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IHRoaXMucGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZGljdC5nZXQoIk9DIiksIHJlc291cmNlcyk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgY29uc3QgZ3JvdXAgPSBkaWN0LmdldCgiR3JvdXAiKTsKICAgIGlmIChncm91cCkgewogICAgICBncm91cE9wdGlvbnMgPSB7CiAgICAgICAgbWF0cml4LAogICAgICAgIGJib3gsCiAgICAgICAgc21hc2ssCiAgICAgICAgaXNvbGF0ZWQ6IGZhbHNlLAogICAgICAgIGtub2Nrb3V0OiBmYWxzZQogICAgICB9OwogICAgICBjb25zdCBncm91cFN1YnR5cGUgPSBncm91cC5nZXQoIlMiKTsKICAgICAgbGV0IGNvbG9yU3BhY2UgPSBudWxsOwogICAgICBpZiAoaXNOYW1lKGdyb3VwU3VidHlwZSwgIlRyYW5zcGFyZW5jeSIpKSB7CiAgICAgICAgZ3JvdXBPcHRpb25zLmlzb2xhdGVkID0gZ3JvdXAuZ2V0KCJJIikgfHwgZmFsc2U7CiAgICAgICAgZ3JvdXBPcHRpb25zLmtub2Nrb3V0ID0gZ3JvdXAuZ2V0KCJLIikgfHwgZmFsc2U7CiAgICAgICAgaWYgKGdyb3VwLmhhcygiQ1MiKSkgewogICAgICAgICAgY29uc3QgY3MgPSBncm91cC5nZXRSYXcoIkNTIik7CiAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5nZXRDYWNoZWQoY3MsIHRoaXMueHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKICAgICAgICAgICAgY29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb2xvclNwYWNlID0gYXdhaXQgdGhpcy5wYXJzZUNvbG9yU3BhY2UoewogICAgICAgICAgICAgIGNzLAogICAgICAgICAgICAgI
20HJlc291cmNlcywKICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNtYXNrPy5iYWNrZHJvcCkgewogICAgICAgIGNvbG9yU3BhY2UgfHw9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7CiAgICAgICAgc21hc2suYmFja2Ryb3AgPSBjb2xvclNwYWNlLmdldFJnYihzbWFzay5iYWNrZHJvcCwgMCk7CiAgICAgIH0KICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbkdyb3VwLCBbZ3JvdXBPcHRpb25zXSk7CiAgICB9CiAgICBjb25zdCBhcmdzID0gZ3JvdXAgPyBbbWF0cml4LCBudWxsXSA6IFttYXRyaXgsIGJib3hdOwogICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW4sIGFyZ3MpOwogICAgYXdhaXQgdGhpcy5nZXRPcGVyYXRvckxpc3QoewogICAgICBzdHJlYW06IHhvYmosCiAgICAgIHRhc2ssCiAgICAgIHJlc291cmNlczogZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlcywKICAgICAgb3BlcmF0b3JMaXN0LAogICAgICBpbml0aWFsU3RhdGUKICAgIH0pOwogICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5wYWludEZvcm1YT2JqZWN0RW5kLCBbXSk7CiAgICBpZiAoZ3JvdXApIHsKICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5lbmRHcm91cCwgW2dyb3VwT3B0aW9uc10pOwogICAgfQogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogIH0KICBfc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEsIGNhY2hlR2xvYmFsbHkgPSBmYWxzZSkgewogICAgY29uc3QgdHJhbnNmZXJzID0gaW1nRGF0YSA/IFtpbWdEYXRhLmJpdG1hcCB8fCBpbWdEYXRhLmRhdGEuYnVmZmVyXSA6IG51bGw7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250IHx8IGNhY2hlR2xvYmFsbHkpIHsKICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbb2JqSWQsICJJbWFnZSIsIGltZ0RhdGFdLCB0cmFuc2ZlcnMpOwogICAgfQogICAgcmV0dXJuIHRoaXMuaGFuZGxlci5zZW5kKCJvYmoiLCBbb2JqSWQsIHRoaXMucGFnZUluZGV4LCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKICB9CiAgYXN5bmMgYnVpbGRQYWludEltYWdlWE9iamVjdCh7CiAgICByZXNvdXJjZXMsCiAgICBpbWFnZSwKICAgIGlzSW5saW5lID0gZmFsc2UsCiAgICBvcGVyYXRvckxpc3QsCiAgICBjYWNoZUtleSwKICAgIGxvY2FsSW1hZ2VDYWNoZSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgfSkgewogICAgY29uc3QgZGljdCA9IGltYWdlLmRpY3Q7CiAgICBjb25zdCBpbWFnZVJlZiA9IGRpY3Qub2JqSWQ7CiAgICBjb25zdCB3ID0gZGljdC5nZXQoIlciLCAiV2lkdGgiKTsKICAgIGNvbnN0IGggPSBkaWN0LmdldCgiSCIsICJIZWlnaHQiKTsKICAgIGlmICghKHcgJiYgdHlwZW9mIHcgPT09ICJudW1iZXIiKSB8fCAhKGggJiYgdHlwZW9mIGggPT09ICJudW1iZXIiKSkgewogICAgICB3YXJuKCJJbWFnZSBkaW1lbnNpb25zIGFyZSBtaXNzaW5nLCBvciBub3QgbnVtYmVycy4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF4SW1hZ2VTaXplID0gdGhpcy5vcHRpb25zLm1heEltYWdlU2l6ZTsKICAgIGlmIChtYXhJbWFnZVNpemUgIT09IC0xICYmIHcgKiBoID4gbWF4SW1hZ2VTaXplKSB7CiAgICAgIGNvbnN0IG1zZyA9ICJJbWFnZSBleGNlZWRlZCBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBhbmQgd2FzIHJlbW92ZWQuIjsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKG1zZyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgfQogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmIChkaWN0LmhhcygiT0MiKSkgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBhd2FpdCB0aGlzLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGRpY3QuZ2V0KCJPQyIpLCByZXNvdXJjZXMpOwogICAgfQogICAgY29uc3QgaW1hZ2VNYXNrID0gZGljdC5nZXQoIklNIiwgIkltYWdlTWFzayIpIHx8IGZhbHNlOwogICAgbGV0IGltZ0RhdGEsIGFyZ3M7CiAgICBpZiAoaW1hZ2VNYXNrKSB7CiAgICAgIGNvbnN0IGludGVycG9sYXRlID0gZGljdC5nZXQoIkkiLCAiSW50ZXJwb2xhdGUiKTsKICAgICAgY29uc3QgYml0U3RyaWRlTGVuZ3RoID0gdyArIDcgPj4gMzsKICAgICAgY29uc3QgaW1nQXJyYXkgPSBpbWFnZS5nZXRCeXRlcyhiaXRTdHJpZGVMZW5ndGggKiBoKTsKICAgICAgY29uc3QgZGVjb2RlID0gZGljdC5nZXRBcnJheSgiRCIsICJEZWNvZGUiKTsKICAgICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkgewogICAgICAgIGltZ0RhdGEgPSBQREZJbWFnZS5jcmVhdGVSYXdNYXNrKHsKICAgICAgICAgIGltZ0FycmF5LAogICAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgICBoZWlnaHQ6IGgsCiAgICAgICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbTogaW1hZ2UgaW5zdGFuY2VvZiBEZWNvZGVTdHJlYW0sCiAgICAgICAgICBpbnZlcnNlRGVjb2RlOiBkZWNvZGU/LlswXSA+IDAsCiAgICAgICAgICBpbnRlcnBvbGF0ZQogICAgICAgIH0pOwogICAgICAgIGltZ0RhdGEuY2FjaGVkID0gISFjYWNoZUtleTsKICAgICAgICBhcmdzID0gW2ltZ0RhdGFdOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhPUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgICBmbjogT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwKICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgICAgICB9OwogICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICAgI
20H0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGltZ0RhdGEgPSBhd2FpdCBQREZJbWFnZS5jcmVhdGVNYXNrKHsKICAgICAgICBpbWdBcnJheSwKICAgICAgICB3aWR0aDogdywKICAgICAgICBoZWlnaHQ6IGgsCiAgICAgICAgaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW06IGltYWdlIGluc3RhbmNlb2YgRGVjb2RlU3RyZWFtLAogICAgICAgIGludmVyc2VEZWNvZGU6IGRlY29kZT8uWzBdID4gMCwKICAgICAgICBpbnRlcnBvbGF0ZSwKICAgICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICAgIH0pOwogICAgICBpZiAoaW1nRGF0YS5pc1NpbmdsZU9wYXF1ZVBpeGVsKSB7CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKE9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2ssIFtdLCBvcHRpb25hbENvbnRlbnQpOwogICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgICBmbjogT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzaywKICAgICAgICAgICAgYXJnczogW10sCiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudAogICAgICAgICAgfTsKICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgICAgaWYgKGltYWdlUmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBvYmpJZCA9IGBtYXNrXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOwogICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShvYmpJZCk7CiAgICAgIGltZ0RhdGEuZGF0YUxlbiA9IGltZ0RhdGEuYml0bWFwID8gaW1nRGF0YS53aWR0aCAqIGltZ0RhdGEuaGVpZ2h0ICogNCA6IGltZ0RhdGEuZGF0YS5sZW5ndGg7CiAgICAgIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhKTsKICAgICAgYXJncyA9IFt7CiAgICAgICAgZGF0YTogb2JqSWQsCiAgICAgICAgd2lkdGg6IGltZ0RhdGEud2lkdGgsCiAgICAgICAgaGVpZ2h0OiBpbWdEYXRhLmhlaWdodCwKICAgICAgICBpbnRlcnBvbGF0ZTogaW1nRGF0YS5pbnRlcnBvbGF0ZSwKICAgICAgICBjb3VudDogMQogICAgICB9XTsKICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKE9QUy5wYWludEltYWdlTWFza1hPYmplY3QsIGFyZ3MsIG9wdGlvbmFsQ29udGVudCk7CiAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHsKICAgICAgICAgIG9iaklkLAogICAgICAgICAgZm46IE9QUy5wYWludEltYWdlTWFza1hPYmplY3QsCiAgICAgICAgICBhcmdzLAogICAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgICAgfTsKICAgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lvbmFsSW1hZ2VDYWNoZS5zZXQobnVsbCwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IFNNQUxMX0lNQUdFX0RJTUVOU0lPTlMgPSAyMDA7CiAgICBjb25zdCBoYXNNYXNrID0gZGljdC5oYXMoIlNNYXNrIikgfHwgZGljdC5oYXMoIk1hc2siKTsKICAgIGlmIChpc0lubGluZSAmJiB3ICsgaCA8IFNNQUxMX0lNQUdFX0RJTUVOU0lPTlMgJiYgIWhhc01hc2spIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBpbWFnZU9iaiA9IG5ldyBQREZJbWFnZSh7CiAgICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgICByZXM6IHJlc291cmNlcywKICAgICAgICAgIGltYWdlLAogICAgICAgICAgaXNJbmxpbmUsCiAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgfSk7CiAgICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YSh0cnVlLCBmYWxzZSk7CiAgICAgICAgb3BlcmF0b3JMaXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhPUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIFtpbWdEYXRhXSwgb3B0aW9uYWxDb250ZW50KTsKICAgICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICAgY29uc3QgbXNnID0gYFVuYWJsZSB0byBkZWNvZGUgaW5saW5lIGltYWdlOiAiJHtyZWFzb259Ii5gOwogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICAgICAgfQogICAgICAgIHdhcm4obXNnKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgb2JqSWQgPSBgaW1nXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gLAogICAgICBjYWNoZUdsb2JhbGx5ID0gZmFsc2U7CiAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgIG9iaklkID0gYCR7dGhpcy5pZEZhY3RvcnkuZ2V0RG9jSWQoKX1fdHlwZTNfJHtvYmpJZH1gOwogICAgfSBlbHNlIGlmIChjYWNoZUtleSAmJiBpbWFnZVJlZikgewogICAgICBjYWNoZUdsb2JhbGx5ID0gdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNob3VsZENhY2hlKGltYWdlUmVmLCB0aGlzLnBhZ2VJbmRleCk7CiAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgICAgYXNzZXJ0KCFpc0lubGluZSwgIkNhbm5vdCBjYWNoZSBhbiBpbmxpbmUgaW1hZ2UgZ2xvYmFsbHkuIik7CiAgICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke29iaklkfWA7CiAgICAgIH0KICAgIH0KICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KG9iaklkKTsKICAgIGFyZ3MgPSBbb2JqSWQsIHcsIGhdOwogICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKE9QUy5wYWludEltYWdlWE9iamVjdCwgYXJncywgb3B0aW9uYWxDb250ZW50LCBoYXNNYXNrKTsKICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgIGlmICh0aGlzLmdsb2JhbEltYWdlQ2FjaGUuaGFzRGVjb2RlRmFpbGVkKGltYWdlUmVmKSkgewogICAgICAgI
20HRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhKGltYWdlUmVmLCB7CiAgICAgICAgICBvYmpJZCwKICAgICAgICAgIGZuOiBPUFMucGFpbnRJbWFnZVhPYmplY3QsCiAgICAgICAgICBhcmdzLAogICAgICAgICAgb3B0aW9uYWxDb250ZW50LAogICAgICAgICAgaGFzTWFzaywKICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fc2VuZEltZ0RhdGEob2JqSWQsIG51bGwsIGNhY2hlR2xvYmFsbHkpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodyAqIGggPiAyNTAwMDAgfHwgaGFzTWFzaykgewogICAgICAgIGNvbnN0IGxvY2FsTGVuZ3RoID0gYXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiY29tbW9ub2JqIiwgW29iaklkLCAiQ29weUxvY2FsSW1hZ2UiLCB7CiAgICAgICAgICBpbWFnZVJlZgogICAgICAgIH1dKTsKICAgICAgICBpZiAobG9jYWxMZW5ndGgpIHsKICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5zZXREYXRhKGltYWdlUmVmLCB7CiAgICAgICAgICAgIG9iaklkLAogICAgICAgICAgICBmbjogT1BTLnBhaW50SW1hZ2VYT2JqZWN0LAogICAgICAgICAgICBhcmdzLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQsCiAgICAgICAgICAgIGhhc01hc2ssCiAgICAgICAgICAgIGJ5dGVTaXplOiAwCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRCeXRlU2l6ZShpbWFnZVJlZiwgbG9jYWxMZW5ndGgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgUERGSW1hZ2UuYnVpbGRJbWFnZSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgcmVzOiByZXNvdXJjZXMsCiAgICAgIGltYWdlLAogICAgICBpc0lubGluZSwKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KS50aGVuKGFzeW5jIGltYWdlT2JqID0+IHsKICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YShmYWxzZSwgdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgaW1nRGF0YS5kYXRhTGVuID0gaW1nRGF0YS5iaXRtYXAgPyBpbWdEYXRhLndpZHRoICogaW1nRGF0YS5oZWlnaHQgKiA0IDogaW1nRGF0YS5kYXRhLmxlbmd0aDsKICAgICAgaW1nRGF0YS5yZWYgPSBpbWFnZVJlZjsKICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuYWRkQnl0ZVNpemUoaW1hZ2VSZWYsIGltZ0RhdGEuZGF0YUxlbik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5KTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYFVuYWJsZSB0byBkZWNvZGUgaW1hZ2UgIiR7b2JqSWR9IjogIiR7cmVhc29ufSIuYCk7CiAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGREZWNvZGVGYWlsZWQoaW1hZ2VSZWYpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgbnVsbCwgY2FjaGVHbG9iYWxseSk7CiAgICB9KTsKICAgIGlmIChjYWNoZUtleSkgewogICAgICBjb25zdCBjYWNoZURhdGEgPSB7CiAgICAgICAgb2JqSWQsCiAgICAgICAgZm46IE9QUy5wYWludEltYWdlWE9iamVjdCwKICAgICAgICBhcmdzLAogICAgICAgIG9wdGlvbmFsQ29udGVudCwKICAgICAgICBoYXNNYXNrCiAgICAgIH07CiAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICB0aGlzLl9yZWdpb25hbEltYWdlQ2FjaGUuc2V0KG51bGwsIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgICAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YShpbWFnZVJlZiwgewogICAgICAgICAgICBvYmpJZCwKICAgICAgICAgICAgZm46IE9QUy5wYWludEltYWdlWE9iamVjdCwKICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50LAogICAgICAgICAgICBoYXNNYXNrLAogICAgICAgICAgICBieXRlU2l6ZTogMAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGhhbmRsZVNNYXNrKHNtYXNrLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgY29uc3Qgc21hc2tDb250ZW50ID0gc21hc2suZ2V0KCJHIik7CiAgICBjb25zdCBzbWFza09wdGlvbnMgPSB7CiAgICAgIHN1YnR5cGU6IHNtYXNrLmdldCgiUyIpLm5hbWUsCiAgICAgIGJhY2tkcm9wOiBzbWFzay5nZXQoIkJDIikKICAgIH07CiAgICBjb25zdCB0cmFuc2Zlck9iaiA9IHNtYXNrLmdldCgiVFIiKTsKICAgIGlmIChpc1BERkZ1bmN0aW9uKHRyYW5zZmVyT2JqKSkgewogICAgICBjb25zdCB0cmFuc2ZlckZuID0gdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LmNyZWF0ZSh0cmFuc2Zlck9iaik7CiAgICAgIGNvbnN0IHRyYW5zZmVyTWFwID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICAgICAgY29uc3QgdG1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgIHRtcFswXSA9IGkgLyAyNTU7CiAgICAgICAgdHJhbnNmZXJGbih0bXAsIDAsIHRtcCwgMCk7CiAgICAgICAgdHJhbnNmZXJNYXBbaV0gPSB0bXBbMF0gKiAyNTUgfCAwOwogICAgICB9CiAgICAgIHNtYXNrT3B0aW9ucy50cmFuc2Zlck1hcCA9IHRyYW5zZmVyTWFwOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVpbGRGb3JtWE9iamVjdChyZXNvdXJjZXMsIHNtYXNrQ29udGVudCwgc21hc2tPcHRpb25zLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZS5jbG9uZSgpLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgfQogIGhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odHIpIHsKICAgIGxldCB0cmFuc2ZlckFycmF5OwogICAgaWYgKEFycmF5LmlzQXJyYXkodHIpKSB7CiAgICAgI
20HRyYW5zZmVyQXJyYXkgPSB0cjsKICAgIH0gZWxzZSBpZiAoaXNQREZGdW5jdGlvbih0cikpIHsKICAgICAgdHJhbnNmZXJBcnJheSA9IFt0cl07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHRyYW5zZmVyTWFwcyA9IFtdOwogICAgbGV0IG51bUZucyA9IDAsCiAgICAgIG51bUVmZmVjdGZ1bEZucyA9IDA7CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRyYW5zZmVyQXJyYXkpIHsKICAgICAgY29uc3QgdHJhbnNmZXJPYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihlbnRyeSk7CiAgICAgIG51bUZucysrOwogICAgICBpZiAoaXNOYW1lKHRyYW5zZmVyT2JqLCAiSWRlbnRpdHkiKSkgewogICAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKG51bGwpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCFpc1BERkZ1bmN0aW9uKHRyYW5zZmVyT2JqKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTsKICAgICAgY29uc3QgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpLAogICAgICAgIHRtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMjU2OyBqKyspIHsKICAgICAgICB0bXBbMF0gPSBqIC8gMjU1OwogICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApOwogICAgICAgIHRyYW5zZmVyTWFwW2pdID0gdG1wWzBdICogMjU1IHwgMDsKICAgICAgfQogICAgICB0cmFuc2Zlck1hcHMucHVzaCh0cmFuc2Zlck1hcCk7CiAgICAgIG51bUVmZmVjdGZ1bEZucysrOwogICAgfQogICAgaWYgKCEobnVtRm5zID09PSAxIHx8IG51bUZucyA9PT0gNCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAobnVtRWZmZWN0ZnVsRm5zID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHRyYW5zZmVyTWFwczsKICB9CiAgaGFuZGxlVGlsaW5nVHlwZShmbiwgY29sb3IsIHJlc291cmNlcywgcGF0dGVybiwgcGF0dGVybkRpY3QsIG9wZXJhdG9yTGlzdCwgdGFzaywgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUpIHsKICAgIGNvbnN0IHRpbGluZ09wTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IHBhdHRlcm5SZXNvdXJjZXMgPSBEaWN0Lm1lcmdlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBkaWN0QXJyYXk6IFtwYXR0ZXJuRGljdC5nZXQoIlJlc291cmNlcyIpLCByZXNvdXJjZXNdCiAgICB9KTsKICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogcGF0dGVybiwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzOiBwYXR0ZXJuUmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IHRpbGluZ09wTGlzdAogICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdElSID0gdGlsaW5nT3BMaXN0LmdldElSKCk7CiAgICAgIGNvbnN0IHRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUihvcGVyYXRvckxpc3RJUiwgcGF0dGVybkRpY3QsIGNvbG9yKTsKICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY2llcyh0aWxpbmdPcExpc3QuZGVwZW5kZW5jaWVzKTsKICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCB0aWxpbmdQYXR0ZXJuSVIpOwogICAgICBpZiAocGF0dGVybkRpY3Qub2JqSWQpIHsKICAgICAgICBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZS5zZXQobnVsbCwgcGF0dGVybkRpY3Qub2JqSWQsIHsKICAgICAgICAgIG9wZXJhdG9yTGlzdElSLAogICAgICAgICAgZGljdDogcGF0dGVybkRpY3QKICAgICAgICB9KTsKICAgICAgfQogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgaGFuZGxlVGlsaW5nVHlwZSAtIGlnbm9yaW5nIHBhdHRlcm46ICIke3JlYXNvbn0iLmApOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9KTsKICB9CiAgYXN5bmMgaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGZvbnRBcmdzLCBmb250UmVmLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlLCBmYWxsYmFja0ZvbnREaWN0ID0gbnVsbCwgY3NzRm9udEluZm8gPSBudWxsKSB7CiAgICBjb25zdCBmb250TmFtZSA9IGZvbnRBcmdzPy5bMF0gaW5zdGFuY2VvZiBOYW1lID8gZm9udEFyZ3NbMF0ubmFtZSA6IG51bGw7CiAgICBsZXQgdHJhbnNsYXRlZCA9IGF3YWl0IHRoaXMubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcywgZmFsbGJhY2tGb250RGljdCwgY3NzRm9udEluZm8pOwogICAgaWYgKHRyYW5zbGF0ZWQuZm9udC5pc1R5cGUzRm9udCkgewogICAgICB0cnkgewogICAgICAgIGF3YWl0IHRyYW5zbGF0ZWQubG9hZFR5cGUzRGF0YSh0aGlzLCByZXNvdXJjZXMsIHRhc2spOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmNpZXModHJhbnNsYXRlZC50eXBlM0RlcGVuZGVuY2llcyk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIHRyYW5zbGF0ZWQgPSBuZXcgVHJhbnNsYXRlZEZvbnQoewogICAgICAgICAgbG9hZGVkTmFtZTogImdfZm9udF9lcnJvciIsCiAgICAgICAgICBmb250OiBuZXcgRXJyb3JGb250KGBUeXBlMyBmb250IGxvYWQgZXJyb3I6ICR7cmVhc29ufWApLAogICAgICAgICAgZGljdDogdHJhbnNsYXRlZC5mb250LAogICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHN0YXRlLmZvbnQgPSB0cmFuc2xhdGVkLmZvbnQ7CiAgICB0cmFuc2xhdGVkLnNlbmQodGhpcy5oYW5kbGVyKTsKICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7CiAgfQogIGhhbmRsZVRleHQoY2hhcnMsIHN0YXRlKSB7CiAgICBjb25zdCBmb250ID0gc3RhdGUuZm9udDsKICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICBpZiAoZm9udC5kYXRhKSB7CiAgICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEoc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgJi
20BUZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTsKICAgICAgaWYgKGlzQWRkVG9QYXRoU2V0IHx8IHN0YXRlLmZpbGxDb2xvclNwYWNlLm5hbWUgPT09ICJQYXR0ZXJuIiB8fCBmb250LmRpc2FibGVGb250RmFjZSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZUZvbnRGYWNlKSB7CiAgICAgICAgUGFydGlhbEV2YWx1YXRvci5idWlsZEZvbnRQYXRocyhmb250LCBnbHlwaHMsIHRoaXMuaGFuZGxlciwgdGhpcy5vcHRpb25zKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGdseXBoczsKICB9CiAgZW5zdXJlU3RhdGVGb250KHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuZm9udCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCByZWFzb24gPSBuZXcgRm9ybWF0RXJyb3IoIk1pc3Npbmcgc2V0Rm9udCAoVGYpIG9wZXJhdG9yIGJlZm9yZSB0ZXh0IHJlbmRlcmluZyBvcGVyYXRvci4iKTsKICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgIHdhcm4oYGVuc3VyZVN0YXRlRm9udDogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IHJlYXNvbjsKICB9CiAgYXN5bmMgc2V0R1N0YXRlKHsKICAgIHJlc291cmNlcywKICAgIGdTdGF0ZSwKICAgIG9wZXJhdG9yTGlzdCwKICAgIGNhY2hlS2V5LAogICAgdGFzaywKICAgIHN0YXRlTWFuYWdlciwKICAgIGxvY2FsR1N0YXRlQ2FjaGUsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IGdTdGF0ZVJlZiA9IGdTdGF0ZS5vYmpJZDsKICAgIGxldCBpc1NpbXBsZUdTdGF0ZSA9IHRydWU7CiAgICBjb25zdCBnU3RhdGVPYmogPSBbXTsKICAgIGxldCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBnU3RhdGUuZ2V0S2V5cygpKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gZ1N0YXRlLmdldChrZXkpOwogICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgIGNhc2UgIlR5cGUiOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTFciOgogICAgICAgIGNhc2UgIkxDIjoKICAgICAgICBjYXNlICJMSiI6CiAgICAgICAgY2FzZSAiTUwiOgogICAgICAgIGNhc2UgIkQiOgogICAgICAgIGNhc2UgIlJJIjoKICAgICAgICBjYXNlICJGTCI6CiAgICAgICAgY2FzZSAiQ0EiOgogICAgICAgIGNhc2UgImNhIjoKICAgICAgICAgIGdTdGF0ZU9iai5wdXNoKFtrZXksIHZhbHVlXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJGb250IjoKICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CiAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKCgpID0+IHRoaXMuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIG51bGwsIHZhbHVlWzBdLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgewogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgW2xvYWRlZE5hbWUsIHZhbHVlWzFdXV0pOwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQk0iOgogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgbm9ybWFsaXplQmxlbmRNb2RlKHZhbHVlKV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU01hc2siOgogICAgICAgICAgaWYgKGlzTmFtZSh2YWx1ZSwgIk5vbmUiKSkgewogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBmYWxzZV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgaXNTaW1wbGVHU3RhdGUgPSBmYWxzZTsKICAgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB0aGlzLmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkpOwogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBTTWFzayB0eXBlIik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUUiI6CiAgICAgICAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSB0aGlzLmhhbmRsZVRyYW5zZmVyRnVuY3Rpb24odmFsdWUpOwogICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgdHJhbnNmZXJNYXBzXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJPUCI6CiAgICAgICAgY2FzZSAib3AiOgogICAgICAgIGNhc2UgIk9QTSI6CiAgICAgICAgY2FzZSAiQkciOgogICAgICAgIGNhc2UgIkJHMiI6CiAgICAgICAgY2FzZSAiVUNSIjoKICAgICAgICBjYXNlICJVQ1IyIjoKICAgICAgICBjYXNlICJUUjIiOgogICAgICAgIGNhc2UgIkhUIjoKICAgICAgICBjYXNlICJTTSI6CiAgICAgICAgY2FzZSAiU0EiOgogICAgICAgIGNhc2UgIkFJUyI6CiAgICAgICAgY2FzZSAiVEsiOgogICAgICAgICAgaW5mbygiZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAiICsga2V5KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpbmZvKCJVbmtub3duIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgYXdhaXQgcHJvbWlzZTsKICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldEdTdGF0ZSwgW2dTdGF0ZU9ial0pOwogICAgfQogICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7CiAgICAgIGxvY2FsR1N0YXRlQ2FjaGUuc2V0KGNhY2hlS2V5LCBnU3RhdGVSZWYsIGdTdGF0ZU9iaik7CiAgICB9CiAgfQogIGxvYWRGb250KGZvbnROYW1lLCBmb250LCByZXNvdXJjZXMsIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGVycm9yRm9udCA9IGFzeW5jICgpID0+IHsKICAgICAgcmV0dXJuIG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgICAgbG9hZGVkTmFtZTogImdfZm9udF9lcnJvciIsCiAgICAgICAgZm9udDogbmV3IEVycm9yRm9udChgRm9udCAiJHtmb250TmFtZX0iIGlzIG5vdCBhdmFpbGFibGUuYCksCiAgICAgICAgZGljdDogZm9udCwKICAgICAgICBldmFsdWF0b3JPcHRpb25zOiB0aGlzLm9wdGlvbnMKICAgICAgfSk7CiAgICB9OwogICAgbGV0IGZvbnRSZWY7CiAgICBpZiAoZm9udCkgewogICAgICBpZiAoZm9udCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGZvbnRSZWYgPSBmb250OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBmb250UmVzID0gcmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgICBpZiAoZm9udFJlcykgewogICAgICAgIGZvbnRSZWYgPSBmb250UmVzLmdldFJhdyhmb250TmFtZSk7CiAgICAgI
20H0KICAgIH0KICAgIGlmIChmb250UmVmKSB7CiAgICAgIGlmICh0aGlzLnR5cGUzRm9udFJlZnM/Lmhhcyhmb250UmVmKSkgewogICAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKICAgICAgfQogICAgICBpZiAodGhpcy5mb250Q2FjaGUuaGFzKGZvbnRSZWYpKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGZvbnQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmb250UmVmKTsKICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB3YXJuKGBsb2FkRm9udCAtIGxvb2t1cCBmYWlsZWQ6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghKGZvbnQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMgJiYgIXRoaXMucGFyc2luZ1R5cGUzRm9udCkgewogICAgICAgIHdhcm4oYEZvbnQgIiR7Zm9udE5hbWV9IiBpcyBub3QgYXZhaWxhYmxlLmApOwogICAgICAgIHJldHVybiBlcnJvckZvbnQoKTsKICAgICAgfQogICAgICB3YXJuKGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZSAtLSBhdHRlbXB0aW5nIHRvIGZhbGxiYWNrIHRvIGEgZGVmYXVsdCBmb250LmApOwogICAgICBmb250ID0gZmFsbGJhY2tGb250RGljdCB8fCBQYXJ0aWFsRXZhbHVhdG9yLmZhbGxiYWNrRm9udERpY3Q7CiAgICB9CiAgICBpZiAoZm9udC5jYWNoZUtleSAmJiB0aGlzLmZvbnRDYWNoZS5oYXMoZm9udC5jYWNoZUtleSkpIHsKICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250LmNhY2hlS2V5KTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgcHJvbWlzZSwKICAgICAgcmVzb2x2ZQogICAgfSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgbGV0IHByZUV2YWx1YXRlZEZvbnQ7CiAgICB0cnkgewogICAgICBwcmVFdmFsdWF0ZWRGb250ID0gdGhpcy5wcmVFdmFsdWF0ZUZvbnQoZm9udCk7CiAgICAgIHByZUV2YWx1YXRlZEZvbnQuY3NzRm9udEluZm8gPSBjc3NGb250SW5mbzsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICB3YXJuKGBsb2FkRm9udCAtIHByZUV2YWx1YXRlRm9udCBmYWlsZWQ6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm4gZXJyb3JGb250KCk7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIGRlc2NyaXB0b3IsCiAgICAgIGhhc2gKICAgIH0gPSBwcmVFdmFsdWF0ZWRGb250OwogICAgY29uc3QgZm9udFJlZklzUmVmID0gZm9udFJlZiBpbnN0YW5jZW9mIFJlZjsKICAgIGxldCBmb250SUQ7CiAgICBpZiAoaGFzaCAmJiBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBmb250QWxpYXNlcyA9IGRlc2NyaXB0b3IuZm9udEFsaWFzZXMgfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGlmIChmb250QWxpYXNlc1toYXNoXSkgewogICAgICAgIGNvbnN0IGFsaWFzRm9udFJlZiA9IGZvbnRBbGlhc2VzW2hhc2hdLmFsaWFzUmVmOwogICAgICAgIGlmIChmb250UmVmSXNSZWYgJiYgYWxpYXNGb250UmVmICYmIHRoaXMuZm9udENhY2hlLmhhcyhhbGlhc0ZvbnRSZWYpKSB7CiAgICAgICAgICB0aGlzLmZvbnRDYWNoZS5wdXRBbGlhcyhmb250UmVmLCBhbGlhc0ZvbnRSZWYpOwogICAgICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250UmVmKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9udEFsaWFzZXNbaGFzaF0gPSB7CiAgICAgICAgICBmb250SUQ6IHRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpCiAgICAgICAgfTsKICAgICAgfQogICAgICBpZiAoZm9udFJlZklzUmVmKSB7CiAgICAgICAgZm9udEFsaWFzZXNbaGFzaF0uYWxpYXNSZWYgPSBmb250UmVmOwogICAgICB9CiAgICAgIGZvbnRJRCA9IGZvbnRBbGlhc2VzW2hhc2hdLmZvbnRJRDsKICAgIH0gZWxzZSB7CiAgICAgIGZvbnRJRCA9IHRoaXMuaWRGYWN0b3J5LmNyZWF0ZUZvbnRJZCgpOwogICAgfQogICAgYXNzZXJ0KGZvbnRJRD8uc3RhcnRzV2l0aCgiZiIpLCAnVGhlICJmb250SUQiIG11c3QgYmUgKGNvcnJlY3RseSkgZGVmaW5lZC4nKTsKICAgIGlmIChmb250UmVmSXNSZWYpIHsKICAgICAgdGhpcy5mb250Q2FjaGUucHV0KGZvbnRSZWYsIHByb21pc2UpOwogICAgfSBlbHNlIHsKICAgICAgZm9udC5jYWNoZUtleSA9IGBjYWNoZUtleV8ke2ZvbnRJRH1gOwogICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udC5jYWNoZUtleSwgcHJvbWlzZSk7CiAgICB9CiAgICBmb250LmxvYWRlZE5hbWUgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke2ZvbnRJRH1gOwogICAgdGhpcy50cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpLnRoZW4odHJhbnNsYXRlZEZvbnQgPT4gewogICAgICByZXNvbHZlKG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgICAgbG9hZGVkTmFtZTogZm9udC5sb2FkZWROYW1lLAogICAgICAgIGZvbnQ6IHRyYW5zbGF0ZWRGb250LAogICAgICAgIGRpY3Q6IGZvbnQsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgIH0pKTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIHdhcm4oYGxvYWRGb250IC0gdHJhbnNsYXRlRm9udCBmYWlsZWQ6ICIke3JlYXNvbn0iLmApOwogICAgICByZXNvbHZlKG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgICAgbG9hZGVkTmFtZTogZm9udC5sb2FkZWROYW1lLAogICAgICAgIGZvbnQ6IG5ldyBFcnJvckZvbnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24ubWVzc2FnZSA6IHJlYXNvbiksCiAgICAgICAgZGljdDogZm9udCwKICAgICAgICBldmFsdWF0b3JPcHRpb25zOiB0aGlzLm9wdGlvbnMKICAgICAgfSkpOwogICAgfSk7CiAgICByZXR1cm4gcHJvbWlzZTsKICB9CiAgYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIHBhcnNpbmdUZXh0ID0gZmFsc2UpIHsKICAgIGNvbnN0IGxhc3RJbmRleCA9IG9wZXJhdG9yTGlzdC5sZW5ndGggLSAxOwogICAgaWYgKCFhcmdzKSB7CiAgICAgIGFyZ3MgPSBbXTsKICAgIH0KICAgIGlmIChsYXN0SW5kZXggPCAwIHx8IG9wZXJhdG9yTGlzdC5mbkFycmF5W2xhc3RJbmRleF0gIT09IE9QUy5jb25zdHJ1Y3RQYXRoKSB7CiAgICAgIGlmIChwYXJzaW5nVGV4dCkgewogICAgICAgI
20Hdhcm4oYEVuY291bnRlcmVkIHBhdGggb3BlcmF0b3IgIiR7Zm59IiBpbnNpZGUgb2YgYSB0ZXh0IG9iamVjdC5gKTsKICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNhdmUsIG51bGwpOwogICAgICB9CiAgICAgIGxldCBtaW5NYXg7CiAgICAgIHN3aXRjaCAoZm4pIHsKICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6CiAgICAgICAgICBjb25zdCB4ID0gYXJnc1swXSArIGFyZ3NbMl07CiAgICAgICAgICBjb25zdCB5ID0gYXJnc1sxXSArIGFyZ3NbM107CiAgICAgICAgICBtaW5NYXggPSBbTWF0aC5taW4oYXJnc1swXSwgeCksIE1hdGgubWluKGFyZ3NbMV0sIHkpLCBNYXRoLm1heChhcmdzWzBdLCB4KSwgTWF0aC5tYXgoYXJnc1sxXSwgeSldOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPUFMubW92ZVRvOgogICAgICAgIGNhc2UgT1BTLmxpbmVUbzoKICAgICAgICAgIG1pbk1heCA9IFthcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzBdLCBhcmdzWzFdXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBtaW5NYXggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLmNvbnN0cnVjdFBhdGgsIFtbZm5dLCBhcmdzLCBtaW5NYXhdKTsKICAgICAgaWYgKHBhcnNpbmdUZXh0KSB7CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5yZXN0b3JlLCBudWxsKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgb3BBcmdzID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheVtsYXN0SW5kZXhdOwogICAgICBvcEFyZ3NbMF0ucHVzaChmbik7CiAgICAgIG9wQXJnc1sxXS5wdXNoKC4uLmFyZ3MpOwogICAgICBjb25zdCBtaW5NYXggPSBvcEFyZ3NbMl07CiAgICAgIHN3aXRjaCAoZm4pIHsKICAgICAgICBjYXNlIE9QUy5yZWN0YW5nbGU6CiAgICAgICAgICBjb25zdCB4ID0gYXJnc1swXSArIGFyZ3NbMl07CiAgICAgICAgICBjb25zdCB5ID0gYXJnc1sxXSArIGFyZ3NbM107CiAgICAgICAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIGFyZ3NbMF0sIHgpOwogICAgICAgICAgbWluTWF4WzFdID0gTWF0aC5taW4obWluTWF4WzFdLCBhcmdzWzFdLCB5KTsKICAgICAgICAgIG1pbk1heFsyXSA9IE1hdGgubWF4KG1pbk1heFsyXSwgYXJnc1swXSwgeCk7CiAgICAgICAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIGFyZ3NbMV0sIHkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPUFMubW92ZVRvOgogICAgICAgIGNhc2UgT1BTLmxpbmVUbzoKICAgICAgICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgYXJnc1swXSk7CiAgICAgICAgICBtaW5NYXhbMV0gPSBNYXRoLm1pbihtaW5NYXhbMV0sIGFyZ3NbMV0pOwogICAgICAgICAgbWluTWF4WzJdID0gTWF0aC5tYXgobWluTWF4WzJdLCBhcmdzWzBdKTsKICAgICAgICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgYXJnc1sxXSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBwYXJzZUNvbG9yU3BhY2UoewogICAgY3MsCiAgICByZXNvdXJjZXMsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIHJldHVybiBDb2xvclNwYWNlLnBhcnNlQXN5bmMoewogICAgICBjcywKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICB3YXJuKGBwYXJzZUNvbG9yU3BhY2UgLSBpZ25vcmluZyBDb2xvclNwYWNlOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9KTsKICB9CiAgcGFyc2VTaGFkaW5nKHsKICAgIHNoYWRpbmcsCiAgICByZXNvdXJjZXMsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSwKICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZQogIH0pIHsKICAgIGxldCBpZCA9IGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZS5nZXQoc2hhZGluZyk7CiAgICBpZiAoaWQpIHsKICAgICAgcmV0dXJuIGlkOwogICAgfQogICAgbGV0IHBhdHRlcm5JUjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHNoYWRpbmdGaWxsID0gUGF0dGVybi5wYXJzZVNoYWRpbmcoc2hhZGluZywgdGhpcy54cmVmLCByZXNvdXJjZXMsIHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICBwYXR0ZXJuSVIgPSBzaGFkaW5nRmlsbC5nZXRJUigpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgcGFyc2VTaGFkaW5nIC0gaWdub3Jpbmcgc2hhZGluZzogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlLnNldChzaGFkaW5nLCBudWxsKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9CiAgICBpZCA9IGBwYXR0ZXJuXyR7dGhpcy5pZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOwogICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkgewogICAgICBpZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9X3R5cGUzXyR7aWR9YDsKICAgIH0KICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZS5zZXQoc2hhZGluZywgaWQpOwogICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkgewogICAgICB0aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW2lkLCAiUGF0dGVybiIsIHBhdHRlcm5JUl0pOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIm9iaiIsIFtpZCwgdGh
20pcy5wYWdlSW5kZXgsICJQYXR0ZXJuIiwgcGF0dGVybklSXSk7CiAgICB9CiAgICByZXR1cm4gaWQ7CiAgfQogIGhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIGZuLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLCBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUpIHsKICAgIGNvbnN0IHBhdHRlcm5OYW1lID0gYXJncy5wb3AoKTsKICAgIGlmIChwYXR0ZXJuTmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgY29uc3QgcmF3UGF0dGVybiA9IHBhdHRlcm5zLmdldFJhdyhwYXR0ZXJuTmFtZS5uYW1lKTsKICAgICAgY29uc3QgbG9jYWxUaWxpbmdQYXR0ZXJuID0gcmF3UGF0dGVybiBpbnN0YW5jZW9mIFJlZiAmJiBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZS5nZXRCeVJlZihyYXdQYXR0ZXJuKTsKICAgICAgaWYgKGxvY2FsVGlsaW5nUGF0dGVybikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCBjb2xvciA9IGNzLmJhc2UgPyBjcy5iYXNlLmdldFJnYihhcmdzLCAwKSA6IG51bGw7CiAgICAgICAgICBjb25zdCB0aWxpbmdQYXR0ZXJuSVIgPSBnZXRUaWxpbmdQYXR0ZXJuSVIobG9jYWxUaWxpbmdQYXR0ZXJuLm9wZXJhdG9yTGlzdElSLCBsb2NhbFRpbGluZ1BhdHRlcm4uZGljdCwgY29sb3IpOwogICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCB0aWxpbmdQYXR0ZXJuSVIpOwogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9IGNhdGNoIHt9CiAgICAgIH0KICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHJhd1BhdHRlcm4pOwogICAgICBpZiAocGF0dGVybikgewogICAgICAgIGNvbnN0IGRpY3QgPSBwYXR0ZXJuIGluc3RhbmNlb2YgQmFzZVN0cmVhbSA/IHBhdHRlcm4uZGljdCA6IHBhdHRlcm47CiAgICAgICAgY29uc3QgdHlwZU51bSA9IGRpY3QuZ2V0KCJQYXR0ZXJuVHlwZSIpOwogICAgICAgIGlmICh0eXBlTnVtID09PSBQYXR0ZXJuVHlwZS5USUxJTkcpIHsKICAgICAgICAgIGNvbnN0IGNvbG9yID0gY3MuYmFzZSA/IGNzLmJhc2UuZ2V0UmdiKGFyZ3MsIDApIDogbnVsbDsKICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVRpbGluZ1R5cGUoZm4sIGNvbG9yLCByZXNvdXJjZXMsIHBhdHRlcm4sIGRpY3QsIG9wZXJhdG9yTGlzdCwgdGFzaywgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZU51bSA9PT0gUGF0dGVyblR5cGUuU0hBRElORykgewogICAgICAgICAgY29uc3Qgc2hhZGluZyA9IGRpY3QuZ2V0KCJTaGFkaW5nIik7CiAgICAgICAgICBjb25zdCBvYmpJZCA9IHRoaXMucGFyc2VTaGFkaW5nKHsKICAgICAgICAgICAgc2hhZGluZywKICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgICAgICAgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlCiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChvYmpJZCkgewogICAgICAgICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoZGljdC5nZXRBcnJheSgiTWF0cml4IiksIG51bGwpOwogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIFsiU2hhZGluZyIsIG9iaklkLCBtYXRyaXhdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuVHlwZTogJHt0eXBlTnVtfWApOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVua25vd24gUGF0dGVybk5hbWU6ICR7cGF0dGVybk5hbWV9YCk7CiAgfQogIF9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKGFycmF5LCBuZXN0aW5nQ291bnRlciwgY3VycmVudFJlc3VsdCkgewogICAgY29uc3QgTUFYX05FU1RJTkcgPSAxMDsKICAgIGlmICgrK25lc3RpbmdDb3VudGVyID4gTUFYX05FU1RJTkcpIHsKICAgICAgd2FybigiVmlzaWJpbGl0eSBleHByZXNzaW9uIGlzIHRvbyBkZWVwbHkgbmVzdGVkIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgIGNvbnN0IG9wZXJhdG9yID0gdGhpcy54cmVmLmZldGNoSWZSZWYoYXJyYXlbMF0pOwogICAgaWYgKGxlbmd0aCA8IDIgfHwgIShvcGVyYXRvciBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIHdhcm4oIkludmFsaWQgdmlzaWJpbGl0eSBleHByZXNzaW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN3aXRjaCAob3BlcmF0b3IubmFtZSkgewogICAgICBjYXNlICJBbmQiOgogICAgICBjYXNlICJPciI6CiAgICAgIGNhc2UgIk5vdCI6CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKG9wZXJhdG9yLm5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHdhcm4oYEludmFsaWQgb3BlcmF0b3IgJHtvcGVyYXRvci5uYW1lfSBpbiB2aXNpYmlsaXR5IGV4cHJlc3Npb25gKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHJhdyA9IGFycmF5W2ldOwogICAgICBjb25zdCBvYmplY3QgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihyYXcpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7CiAgICAgICAgY29uc3QgbmVzdGVkUmVzdWx0ID0gW107CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKG5lc3RlZFJlc3VsdCk7CiAgICAgICAgdGhpcy5fcGFyc2VWaXNpYmlsaXR5RXhwcmVzc2lvbihvYmplY3QsIG5lc3RpbmdDb3VudGVyLCBuZXN0ZWRSZXN1bHQpOwogICAgICB9IGVsc2UgaWYgKHJhdyBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGN1cnJlbnRSZXN1bHQucHVzaChyYXcudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgcGFyc2VNYXJrZWRDb250ZW50UHJvcHMoY29udGVudFByb3BlcnRpZXMsIHJlc291cmNlcykgewogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmIChjb250ZW50UHJvcGVydGllcyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgY29uc3QgcHJvcGVydGllcyA9IHJlc291cmNlcy5nZXQoIlByb3BlcnRpZXMiKTsKICAgICAgb3B0aW9uYWxDb250ZW50ID0gcHJvcGVydGllcy5nZXQoY29udGVudFByb3BlcnRpZXMubmFtZSk7CiAgICB9IGVsc2UgaWYgKGNvbnRlbn
20RQcm9wZXJ0aWVzIGluc3RhbmNlb2YgRGljdCkgewogICAgICBvcHRpb25hbENvbnRlbnQgPSBjb250ZW50UHJvcGVydGllczsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiT3B0aW9uYWwgY29udGVudCBwcm9wZXJ0aWVzIG1hbGZvcm1lZC4iKTsKICAgIH0KICAgIGNvbnN0IG9wdGlvbmFsQ29udGVudFR5cGUgPSBvcHRpb25hbENvbnRlbnQuZ2V0KCJUeXBlIik/Lm5hbWU7CiAgICBpZiAob3B0aW9uYWxDb250ZW50VHlwZSA9PT0gIk9DRyIpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiBvcHRpb25hbENvbnRlbnRUeXBlLAogICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnQub2JqSWQKICAgICAgfTsKICAgIH0gZWxzZSBpZiAob3B0aW9uYWxDb250ZW50VHlwZSA9PT0gIk9DTUQiKSB7CiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBvcHRpb25hbENvbnRlbnQuZ2V0KCJWRSIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgIHRoaXMuX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgMCwgcmVzdWx0KTsKICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6ICJPQ01EIiwKICAgICAgICAgICAgZXhwcmVzc2lvbjogcmVzdWx0CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBvcHRpb25hbENvbnRlbnRHcm91cHMgPSBvcHRpb25hbENvbnRlbnQuZ2V0KCJPQ0dzIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbmFsQ29udGVudEdyb3VwcykgfHwgb3B0aW9uYWxDb250ZW50R3JvdXBzIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IGdyb3VwSWRzID0gW107CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9uYWxDb250ZW50R3JvdXBzKSkgewogICAgICAgICAgZm9yIChjb25zdCBvY2cgb2Ygb3B0aW9uYWxDb250ZW50R3JvdXBzKSB7CiAgICAgICAgICAgIGdyb3VwSWRzLnB1c2gob2NnLnRvU3RyaW5nKCkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBncm91cElkcy5wdXNoKG9wdGlvbmFsQ29udGVudEdyb3Vwcy5vYmpJZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiBvcHRpb25hbENvbnRlbnRUeXBlLAogICAgICAgICAgaWRzOiBncm91cElkcywKICAgICAgICAgIHBvbGljeTogb3B0aW9uYWxDb250ZW50LmdldCgiUCIpIGluc3RhbmNlb2YgTmFtZSA/IG9wdGlvbmFsQ29udGVudC5nZXQoIlAiKS5uYW1lIDogbnVsbCwKICAgICAgICAgIGV4cHJlc3Npb246IG51bGwKICAgICAgICB9OwogICAgICB9IGVsc2UgaWYgKG9wdGlvbmFsQ29udGVudEdyb3VwcyBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiBvcHRpb25hbENvbnRlbnRUeXBlLAogICAgICAgICAgaWQ6IG9wdGlvbmFsQ29udGVudEdyb3Vwcy50b1N0cmluZygpCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldE9wZXJhdG9yTGlzdCh7CiAgICBzdHJlYW0sCiAgICB0YXNrLAogICAgcmVzb3VyY2VzLAogICAgb3BlcmF0b3JMaXN0LAogICAgaW5pdGlhbFN0YXRlID0gbnVsbCwKICAgIGZhbGxiYWNrRm9udERpY3QgPSBudWxsCiAgfSkgewogICAgcmVzb3VyY2VzIHx8PSBEaWN0LmVtcHR5OwogICAgaW5pdGlhbFN0YXRlIHx8PSBuZXcgRXZhbFN0YXRlKCk7CiAgICBpZiAoIW9wZXJhdG9yTGlzdCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldE9wZXJhdG9yTGlzdDogbWlzc2luZyAib3BlcmF0b3JMaXN0IiBwYXJhbWV0ZXInKTsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBwYXJzaW5nVGV4dCA9IGZhbHNlOwogICAgY29uc3QgbG9jYWxJbWFnZUNhY2hlID0gbmV3IExvY2FsSW1hZ2VDYWNoZSgpOwogICAgY29uc3QgbG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBuZXcgTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsR1N0YXRlQ2FjaGUgPSBuZXcgTG9jYWxHU3RhdGVDYWNoZSgpOwogICAgY29uc3QgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUgPSBuZXcgTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSA9IG5ldyBNYXAoKTsKICAgIGNvbnN0IHhvYmpzID0gcmVzb3VyY2VzLmdldCgiWE9iamVjdCIpIHx8IERpY3QuZW1wdHk7CiAgICBjb25zdCBwYXR0ZXJucyA9IHJlc291cmNlcy5nZXQoIlBhdHRlcm4iKSB8fCBEaWN0LmVtcHR5OwogICAgY29uc3Qgc3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihpbml0aWFsU3RhdGUpOwogICAgY29uc3QgcHJlcHJvY2Vzc29yID0gbmV3IEV2YWx1YXRvclByZXByb2Nlc3NvcihzdHJlYW0sIHhyZWYsIHN0YXRlTWFuYWdlcik7CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICBmdW5jdGlvbiBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKGFyZ3VtZW50KSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHByZXByb2Nlc3Nvci5zYXZlZFN0YXRlc0RlcHRoOyBpIDwgaWk7IGkrKykgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMucmVzdG9yZSwgW10pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBvcGVyYXRvckxpc3QucmVhZHldKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHByb21pc2VCb2R5KHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICByZWplY3QoZXgpOwogICAgICAgICAgfQogICAgICAgIH0sIHJlamVjdCk7CiAgICAgIH07CiAgICAgIHRhc2suZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICB0aW1l
20U2xvdE1hbmFnZXIucmVzZXQoKTsKICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge307CiAgICAgIGxldCBzdG9wLCBpLCBpaSwgY3MsIG5hbWUsIGlzVmFsaWROYW1lOwogICAgICB3aGlsZSAoIShzdG9wID0gdGltZVNsb3RNYW5hZ2VyLmNoZWNrKCkpKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBudWxsOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGxldCBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CiAgICAgICAgbGV0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5wYWludFhPYmplY3Q6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKG5hbWUpOwogICAgICAgICAgICAgIGlmIChsb2NhbEltYWdlKSB7CiAgICAgICAgICAgICAgICBhZGRMb2NhbGx5Q2FjaGVkSW1hZ2VPcHMob3BlcmF0b3JMaXN0LCBsb2NhbEltYWdlKTsKICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CiAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlSZWYoeG9iaikgfHwgc2VsZi5fcmVnaW9uYWxJbWFnZUNhY2hlLmdldEJ5UmVmKHhvYmopOwogICAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgYWRkTG9jYWxseUNhY2hlZEltYWdlT3BzKG9wZXJhdG9yTGlzdCwgbG9jYWxJbWFnZSk7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGdsb2JhbEltYWdlLm9iaklkKTsKICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZEltYWdlT3BzKGdsb2JhbEltYWdlLmZuLCBnbG9iYWxJbWFnZS5hcmdzLCBnbG9iYWxJbWFnZS5vcHRpb25hbENvbnRlbnQsIGdsb2JhbEltYWdlLmhhc01hc2spOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCEoeG9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGJlIGEgc3RyZWFtIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4b2JqLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3Qgc2hvdWxkIGhhdmUgYSBOYW1lIHN1YnR5cGUiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHR5cGUubmFtZSA9PT0gIkZvcm0iKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc2F2ZSgpOwogICAgICAgICAgICAgICAgc2VsZi5idWlsZEZvcm1YT2JqZWN0KHJlc291cmNlcywgeG9iaiwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09ICJJbWFnZSIpIHsKICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CiAgICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgICAgaW1hZ2U6IHhvYmosCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgICAgY2FjaGVLZXk6IG5hbWUsCiAgICAgICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5uYW1lID09PSAiUFMiKSB7CiAgICAgICAgICAgICAgICBpbmZvKCJJZ25vcmVkIFhPYmplY3Qgc3VidHlwZSBQUyIpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYFVuaGFuZGxlZCBYT2JqZWN0IHN1YnR5cGUgJHt0eXBlLm5hbWV9YCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgI
20HJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBhcmdzWzFdOwogICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIGFyZ3MsIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLnN0YXRlLCBmYWxsYmFja0ZvbnREaWN0KS50aGVuKGZ1bmN0aW9uIChsb2FkZWROYW1lKSB7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kobG9hZGVkTmFtZSk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5zZXRGb250LCBbbG9hZGVkTmFtZSwgZm9udFNpemVdKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5iZWdpblRleHQ6CiAgICAgICAgICAgIHBhcnNpbmdUZXh0ID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5lbmRUZXh0OgogICAgICAgICAgICBwYXJzaW5nVGV4dCA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmVuZElubGluZUltYWdlOgogICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGFyZ3NbMF0uY2FjaGVLZXk7CiAgICAgICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgICAgIGNvbnN0IGxvY2FsSW1hZ2UgPSBsb2NhbEltYWdlQ2FjaGUuZ2V0QnlOYW1lKGNhY2hlS2V5KTsKICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkgewogICAgICAgICAgICAgICAgYWRkTG9jYWxseUNhY2hlZEltYWdlT3BzKG9wZXJhdG9yTGlzdCwgbG9jYWxJbWFnZSk7CiAgICAgICAgICAgICAgICBhcmdzID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0KHNlbGYuYnVpbGRQYWludEltYWdlWE9iamVjdCh7CiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGltYWdlOiBhcmdzWzBdLAogICAgICAgICAgICAgIGlzSW5saW5lOiB0cnVlLAogICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICBjYWNoZUtleSwKICAgICAgICAgICAgICBsb2NhbEltYWdlQ2FjaGUsCiAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5zaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNob3dTcGFjZWRUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjb21iaW5lZEdseXBocyA9IFtdLAogICAgICAgICAgICAgIHN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOwogICAgICAgICAgICBmb3IgKGNvbnN0IGFyckl0ZW0gb2YgYXJnc1swXSkgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJySXRlbSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGNvbWJpbmVkR2x5cGhzLnB1c2goLi4uc2VsZi5oYW5kbGVUZXh0KGFyckl0ZW0sIHN0YXRlKSk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJySXRlbSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIGNvbWJpbmVkR2x5cGhzLnB1c2goYXJySXRlbSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3NbMF0gPSBjb21iaW5lZEdseXBoczsKICAgICAgICAgICAgZm4gPSBPUFMuc2hvd1RleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5uZXh0TGluZSk7CiAgICAgICAgICAgIGFyZ3NbMF0gPSBzZWxmLmhhbmRsZVRleHQoYXJnc1swXSwgc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2hvd1RleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMubmV4dExpbmUpOwogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoT1BTLnNldFdvcmRTcGFjaW5nLCBbYXJncy5zaGlmdCgpXSk7CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0Q2hhclNwYWNpbmcsIFthcmdzLnNoaWZ0KCldKTsKICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICBmbiA9IE9QUy5zaG93VGV4dDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRUZX
20h0UmVuZGVyaW5nTW9kZToKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnRleHRSZW5kZXJpbmdNb2RlID0gYXJnc1swXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3JTcGFjZToKICAgICAgICAgICAgewogICAgICAgICAgICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSBDb2xvclNwYWNlLmdldENhY2hlZChhcmdzWzBdLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgICAgICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlQ29sb3JTcGFjZSh7CiAgICAgICAgICAgICAgICBjczogYXJnc1swXSwKICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29sb3JTcGFjZSkgewogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvclNwYWNlOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgY29uc3QgY2FjaGVkQ29sb3JTcGFjZSA9IENvbG9yU3BhY2UuZ2V0Q2FjaGVkKGFyZ3NbMF0sIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkgewogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBjYWNoZWRDb2xvclNwYWNlOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5leHQoc2VsZi5wYXJzZUNvbG9yU3BhY2UoewogICAgICAgICAgICAgICAgY3M6IGFyZ3NbMF0sCiAgICAgICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbG9yU3BhY2UpIHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZSB8fCBDb2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3I6CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxHcmF5OgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTsKICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUdyYXk6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7CiAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjoKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiOwogICAgICAgICAgICBhcmdzID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVybkZpbGxDb2xvclNwYWNlOwogICAgICAgICAgICBpZiAoIWNzKSB7CiAgICAgICAgICAgICAgaWYgKGlzTnVtYmVyQXJyYXkoYXJncywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBDb2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheS5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYXJncyA9IFtdOwogICAgICAgICAgICAgIGZuID0gT1BTLnNldEZpbGxUcmFuc3B
20hcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRGaWxsQ29sb3JOLCBhcmdzLCBjcywgcGF0dGVybnMsIHJlc291cmNlcywgdGFzaywgbG9jYWxDb2xvclNwYWNlQ2FjaGUsIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLCBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBPUFMuc2V0RmlsbFJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFN0cm9rZUNvbG9yTjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUucGF0dGVyblN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGlmICghY3MpIHsKICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJBcnJheShhcmdzLCBudWxsKSkgewogICAgICAgICAgICAgICAgYXJncyA9IENvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgICAgIGZuID0gT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFyZ3MgPSBbXTsKICAgICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VUcmFuc3BhcmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3MubmFtZSA9PT0gIlBhdHRlcm4iKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZUNvbG9yTihvcGVyYXRvckxpc3QsIE9QUy5zZXRTdHJva2VDb2xvck4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gY3MuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IE9QUy5zZXRTdHJva2VSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zaGFkaW5nRmlsbDoKICAgICAgICAgICAgbGV0IHNoYWRpbmc7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3Qgc2hhZGluZ1JlcyA9IHJlc291cmNlcy5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmdSZXMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyByZXNvdXJjZSBmb3VuZCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzaGFkaW5nID0gc2hhZGluZ1Jlcy5nZXQoYXJnc1swXS5uYW1lKTsKICAgICAgICAgICAgICBpZiAoIXNoYWRpbmcpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm8gc2hhZGluZyBvYmplY3QgZm91bmQiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBTaGFkaW5nOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGF0dGVybklkID0gc2VsZi5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICAgIHNoYWRpbmcsCiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFwYXR0ZXJuSWQpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzID0gW3BhdHRlcm5JZF07CiAgICAgICAgICAgIGZuID0gT1BTLnNoYWRpbmdGaWxsOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEdTdGF0ZToKICAgICAgICAgICAgaXNWYWxpZE5hbWUgPSBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZTsKICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKGlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgY29uc3QgbG9jYWxHU3RhdGVPYmogPSBsb2NhbEdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKTsKICAgICAgICAgICAgICBpZiAobG9jYWxHU3RhdGVPYmopIHsKICAgICAgICAgICAgICAgIGlmIChsb2NhbEdTdGF0ZU9iai5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuc2V0R1N0YXRlLCBbbG9jYWxHU3RhdGVPYmpdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgI
20HRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNlbGYuc2V0R1N0YXRlKHsKICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgIGdTdGF0ZSwKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdCwKICAgICAgICAgICAgICAgIGNhY2hlS2V5OiBuYW1lLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlciwKICAgICAgICAgICAgICAgIGxvY2FsR1N0YXRlQ2FjaGUsCiAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgT1BTLm1vdmVUbzoKICAgICAgICAgIGNhc2UgT1BTLmxpbmVUbzoKICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG86CiAgICAgICAgICBjYXNlIE9QUy5jdXJ2ZVRvMjoKICAgICAgICAgIGNhc2UgT1BTLmN1cnZlVG8zOgogICAgICAgICAgY2FzZSBPUFMuY2xvc2VQYXRoOgogICAgICAgICAgY2FzZSBPUFMucmVjdGFuZ2xlOgogICAgICAgICAgICBzZWxmLmJ1aWxkUGF0aChvcGVyYXRvckxpc3QsIGZuLCBhcmdzLCBwYXJzaW5nVGV4dCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50OgogICAgICAgICAgY2FzZSBPUFMubWFya1BvaW50UHJvcHM6CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbkNvbXBhdDoKICAgICAgICAgIGNhc2UgT1BTLmVuZENvbXBhdDoKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKICAgICAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgICAgICAgd2FybihgRXhwZWN0ZWQgbmFtZSBmb3IgYmVnaW5NYXJrZWRDb250ZW50UHJvcHMgYXJnMD0ke2FyZ3NbMF19YCk7CiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG51bGxdKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJnc1swXS5uYW1lID09PSAiT0MiKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihkYXRhID0+IHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBkYXRhXSk7CiAgICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgICB3YXJuKGBnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBudWxsXSk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1swXS5uYW1lLCBhcmdzWzFdIGluc3RhbmNlb2YgRGljdCA/IGFyZ3NbMV0uZ2V0KCJNQ0lEIikgOiBudWxsXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5iZWdpbk1hcmtlZENvbnRlbnQ6CiAgICAgICAgICBjYXNlIE9QUy5lbmRNYXJrZWRDb250ZW50OgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaWYgKGFyZ3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IGFyZ3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaSA8IGlpKSB7CiAgICAgICAgICAgICAgICB3YXJuKCJnZXRPcGVyYXRvckxpc3QgLSBpZ25vcmluZyBvcGVyYXRvcjogIiArIGZuKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIGFyZ3MpOwogICAgICB9CiAgICAgIGlmIChzdG9wKSB7CiAgICAgICAgbmV4dChkZWZlcnJlZCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgICByZXR1cm47CiAgICAgI
20H0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFRleHRDb250ZW50KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBzdGF0ZU1hbmFnZXIgPSBudWxsLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSwKICAgIHNpbmssCiAgICBzZWVuU3R5bGVzID0gbmV3IFNldCgpLAogICAgdmlld0JveCwKICAgIGxhbmcgPSBudWxsLAogICAgbWFya2VkQ29udGVudERhdGEgPSBudWxsLAogICAgZGlzYWJsZU5vcm1hbGl6YXRpb24gPSBmYWxzZSwKICAgIGtlZXBXaGl0ZVNwYWNlID0gZmFsc2UKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IERpY3QuZW1wdHk7CiAgICBzdGF0ZU1hbmFnZXIgfHw9IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICBtYXJrZWRDb250ZW50RGF0YSB8fD0gewogICAgICAgIGxldmVsOiAwCiAgICAgIH07CiAgICB9CiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHsKICAgICAgaXRlbXM6IFtdLAogICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgIGxhbmcKICAgIH07CiAgICBjb25zdCB0ZXh0Q29udGVudEl0ZW0gPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgc3RyOiBbXSwKICAgICAgdG90YWxXaWR0aDogMCwKICAgICAgdG90YWxIZWlnaHQ6IDAsCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHZlcnRpY2FsOiBmYWxzZSwKICAgICAgcHJldlRyYW5zZm9ybTogbnVsbCwKICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCwKICAgICAgc3BhY2VJbkZsb3dNaW46IDAsCiAgICAgIHNwYWNlSW5GbG93TWF4OiAwLAogICAgICB0cmFja2luZ1NwYWNlTWluOiBJbmZpbml0eSwKICAgICAgbmVnYXRpdmVTcGFjZU1heDogLUluZmluaXR5LAogICAgICBub3RBU3BhY2U6IC1JbmZpbml0eSwKICAgICAgdHJhbnNmb3JtOiBudWxsLAogICAgICBmb250TmFtZTogbnVsbCwKICAgICAgaGFzRU9MOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IHR3b0xhc3RDaGFycyA9IFsiICIsICIgIl07CiAgICBsZXQgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIGZ1bmN0aW9uIHNhdmVMYXN0Q2hhcihjaGFyKSB7CiAgICAgIGNvbnN0IG5leHRQb3MgPSAodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyOwogICAgICBjb25zdCByZXQgPSB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1tuZXh0UG9zXSA9PT0gIiAiOwogICAgICB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSA9IGNoYXI7CiAgICAgIHR3b0xhc3RDaGFyc1BvcyA9IG5leHRQb3M7CiAgICAgIHJldHVybiAha2VlcFdoaXRlU3BhY2UgJiYgcmV0OwogICAgfQogICAgZnVuY3Rpb24gc2hvdWxkQWRkV2hpdGVwc2FjZSgpIHsKICAgICAgcmV0dXJuICFrZWVwV2hpdGVTcGFjZSAmJiB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1sodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyXSA9PT0gIiAiOwogICAgfQogICAgZnVuY3Rpb24gcmVzZXRMYXN0Q2hhcnMoKSB7CiAgICAgIHR3b0xhc3RDaGFyc1swXSA9IHR3b0xhc3RDaGFyc1sxXSA9ICIgIjsKICAgICAgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIH0KICAgIGNvbnN0IFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUiA9IDAuMTAyOwogICAgY29uc3QgTk9UX0FfU1BBQ0VfRkFDVE9SID0gMC4wMzsKICAgIGNvbnN0IE5FR0FUSVZFX1NQQUNFX0ZBQ1RPUiA9IC0wLjI7CiAgICBjb25zdCBTUEFDRV9JTl9GTE9XX01JTl9GQUNUT1IgPSAwLjEwMjsKICAgIGNvbnN0IFNQQUNFX0lOX0ZMT1dfTUFYX0ZBQ1RPUiA9IDAuNjsKICAgIGNvbnN0IFZFUlRJQ0FMX1NISUZUX1JBVElPID0gMC4yNTsKICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGNvbnN0IHNob3dTcGFjZWRUZXh0QnVmZmVyID0gW107CiAgICBsZXQgeG9ianMgPSBudWxsOwogICAgY29uc3QgZW1wdHlYT2JqZWN0Q2FjaGUgPSBuZXcgTG9jYWxJbWFnZUNhY2hlKCk7CiAgICBjb25zdCBlbXB0eUdTdGF0ZUNhY2hlID0gbmV3IExvY2FsR1N0YXRlQ2FjaGUoKTsKICAgIGNvbnN0IHByZXByb2Nlc3NvciA9IG5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpOwogICAgbGV0IHRleHRTdGF0ZTsKICAgIGZ1bmN0aW9uIHB1c2hXaGl0ZXNwYWNlKHsKICAgICAgd2lkdGggPSAwLAogICAgICBoZWlnaHQgPSAwLAogICAgICB0cmFuc2Zvcm0gPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybSwKICAgICAgZm9udE5hbWUgPSB0ZXh0Q29udGVudEl0ZW0uZm9udE5hbWUKICAgIH0pIHsKICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgc3RyOiAiICIsCiAgICAgICAgZGlyOiAibHRyIiwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgdHJhbnNmb3JtLAogICAgICAgIGZvbnROYW1lLAogICAgICAgIGhhc0VPTDogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpIHsKICAgICAgY29uc3QgZm9udCA9IHRleHRTdGF0ZS5mb250OwogICAgICBjb25zdCB0c20gPSBbdGV4dFN0YXRlLmZvbnRTaXplICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDAsIDAsIHRleHRTdGF0ZS5mb250U2l6ZSwgMCwgdGV4dFN0YXRlLnRleHRSaXNlXTsKICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQgJiYgKHRleHRTdGF0ZS5mb250U2l6ZSA8PSAxIHx8IGZvbnQuaXNDaGFyQkJveCkgJiYgIWlzQXJyYXlFcXVhbCh0ZXh0U3RhdGUuZm9udE1hdHJpeCwgRk9OVF9JREVOVElUWV9NQVRSSVgpKSB7CiAgICAgICAgY29uc3QgZ2x5cGhIZWlnaHQgPSBmb250LmJib3hbM10gLSBmb250LmJib3hbMV07CiAgICAgICAgaWYgKGdseXBoSGVpZ2h0ID4gMCkgewogICAgICAgICAgdHNtWzNdICo9IGdseXBoSGVpZ2h0ICogdGV4dFN0YXRlLmZvbnRNYXRyaXhbM107CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybi
20BVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUuY3RtLCBVdGlsLnRyYW5zZm9ybSh0ZXh0U3RhdGUudGV4dE1hdHJpeCwgdHNtKSk7CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm4gdGV4dENvbnRlbnRJdGVtOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBmb250LAogICAgICAgIGxvYWRlZE5hbWUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgaWYgKCFzZWVuU3R5bGVzLmhhcyhsb2FkZWROYW1lKSkgewogICAgICAgIHNlZW5TdHlsZXMuYWRkKGxvYWRlZE5hbWUpOwogICAgICAgIHRleHRDb250ZW50LnN0eWxlc1tsb2FkZWROYW1lXSA9IHsKICAgICAgICAgIGZvbnRGYW1pbHk6IGZvbnQuZmFsbGJhY2tOYW1lLAogICAgICAgICAgYXNjZW50OiBmb250LmFzY2VudCwKICAgICAgICAgIGRlc2NlbnQ6IGZvbnQuZGVzY2VudCwKICAgICAgICAgIHZlcnRpY2FsOiBmb250LnZlcnRpY2FsCiAgICAgICAgfTsKICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMgJiYgZm9udC5zeXN0ZW1Gb250SW5mbykgewogICAgICAgICAgY29uc3Qgc3R5bGUgPSB0ZXh0Q29udGVudC5zdHlsZXNbbG9hZGVkTmFtZV07CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uID0gZm9udC5zeXN0ZW1Gb250SW5mby5jc3M7CiAgICAgICAgICBzdHlsZS5mb250U3Vic3RpdHV0aW9uTG9hZGVkTmFtZSA9IGZvbnQuc3lzdGVtRm9udEluZm8ubG9hZGVkTmFtZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lID0gbG9hZGVkTmFtZTsKICAgICAgY29uc3QgdHJtID0gdGV4dENvbnRlbnRJdGVtLnRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgewogICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IHRleHRDb250ZW50SXRlbS50b3RhbFdpZHRoID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gTWF0aC5oeXBvdCh0cm1bMl0sIHRybVszXSk7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggPSBNYXRoLmh5cG90KHRybVswXSwgdHJtWzFdKTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ID0gdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ID0gMDsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udmVydGljYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IHNjYWxlTGluZVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXSwgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzFdKTsKICAgICAgY29uc3Qgc2NhbGVDdG1YID0gTWF0aC5oeXBvdCh0ZXh0U3RhdGUuY3RtWzBdLCB0ZXh0U3RhdGUuY3RtWzFdKTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYOwogICAgICBjb25zdCB7CiAgICAgICAgZm9udFNpemUKICAgICAgfSA9IHRleHRTdGF0ZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLnRyYWNraW5nU3BhY2VNaW4gPSBmb250U2l6ZSAqIFRSQUNLSU5HX1NQQUNFX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLm5vdEFTcGFjZSA9IGZvbnRTaXplICogTk9UX0FfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0ubmVnYXRpdmVTcGFjZU1heCA9IGZvbnRTaXplICogTkVHQVRJVkVfU1BBQ0VfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNaW4gPSBmb250U2l6ZSAqIFNQQUNFX0lOX0ZMT1dfTUlOX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlSW5GbG93TWF4ID0gZm9udFNpemUgKiBTUEFDRV9JTl9GTE9XX01BWF9GQUNUT1I7CiAgICAgIHRleHRDb250ZW50SXRlbS5oYXNFT0wgPSBmYWxzZTsKICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRleHRDb250ZW50SXRlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVwZGF0ZUFkdmFuY2VTY2FsZSgpIHsKICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgc2NhbGVMaW5lWCA9IE1hdGguaHlwb3QodGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzBdLCB0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMV0pOwogICAgICBjb25zdCBzY2FsZUN0bVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS5jdG1bMF0sIHRleHRTdGF0ZS5jdG1bMV0pOwogICAgICBjb25zdCBzY2FsZUZhY3RvciA9IHNjYWxlQ3RtWCAqIHNjYWxlTGluZVg7CiAgICAgIGlmIChzY2FsZUZhY3RvciA9PT0gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxXaWR0aCArPSB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHRDb250ZW50SXRlbS50b3RhbEhlaWdodCArPSB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IDA7CiAgICAgIH0KICAgICAgdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGUgPSBzY2FsZUZhY3RvcjsKICAgIH0KICAgIGZ1bmN0aW9uIHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENodW5rKSB7CiAgICAgIGxldCB0ZXh0ID0gdGV4dENodW5rLnN0ci5qb2luKCIiKTsKICAgICAgaWYgKCFkaXNhYmxlTm9ybWFsaXphdGlvbikgewogICAgICAgIHRleHQgPSBub3JtYWxpem
20VVbmljb2RlKHRleHQpOwogICAgICB9CiAgICAgIGNvbnN0IGJpZGlSZXN1bHQgPSBiaWRpKHRleHQsIC0xLCB0ZXh0Q2h1bmsudmVydGljYWwpOwogICAgICByZXR1cm4gewogICAgICAgIHN0cjogYmlkaVJlc3VsdC5zdHIsCiAgICAgICAgZGlyOiBiaWRpUmVzdWx0LmRpciwKICAgICAgICB3aWR0aDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsV2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5hYnModGV4dENodW5rLnRvdGFsSGVpZ2h0KSwKICAgICAgICB0cmFuc2Zvcm06IHRleHRDaHVuay50cmFuc2Zvcm0sCiAgICAgICAgZm9udE5hbWU6IHRleHRDaHVuay5mb250TmFtZSwKICAgICAgICBoYXNFT0w6IHRleHRDaHVuay5oYXNFT0wKICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVNldEZvbnQoZm9udE5hbWUsIGZvbnRSZWYpIHsKICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IGF3YWl0IHNlbGYubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcyk7CiAgICAgIGlmICh0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKHNlbGYsIHJlc291cmNlcywgdGFzayk7CiAgICAgICAgfSBjYXRjaCB7fQogICAgICB9CiAgICAgIHRleHRTdGF0ZS5sb2FkZWROYW1lID0gdHJhbnNsYXRlZC5sb2FkZWROYW1lOwogICAgICB0ZXh0U3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKICAgICAgdGV4dFN0YXRlLmZvbnRNYXRyaXggPSB0cmFuc2xhdGVkLmZvbnQuZm9udE1hdHJpeCB8fCBGT05UX0lERU5USVRZX01BVFJJWDsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5SW52ZXJzZVJvdGF0aW9uKHgsIHksIG1hdHJpeCkgewogICAgICBjb25zdCBzY2FsZSA9IE1hdGguaHlwb3QobWF0cml4WzBdLCBtYXRyaXhbMV0pOwogICAgICByZXR1cm4gWyhtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzFdICogeSkgLyBzY2FsZSwgKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbM10gKiB5KSAvIHNjYWxlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVXaXRoTGFzdFBvc2l0aW9uKGdseXBoV2lkdGgpIHsKICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGxldCBwb3NYID0gY3VycmVudFRyYW5zZm9ybVs0XTsKICAgICAgbGV0IHBvc1kgPSBjdXJyZW50VHJhbnNmb3JtWzVdOwogICAgICBpZiAodGV4dFN0YXRlLmZvbnQ/LnZlcnRpY2FsKSB7CiAgICAgICAgaWYgKHBvc1ggPCB2aWV3Qm94WzBdIHx8IHBvc1ggPiB2aWV3Qm94WzJdIHx8IHBvc1kgKyBnbHlwaFdpZHRoIDwgdmlld0JveFsxXSB8fCBwb3NZID4gdmlld0JveFszXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwb3NYICsgZ2x5cGhXaWR0aCA8IHZpZXdCb3hbMF0gfHwgcG9zWCA+IHZpZXdCb3hbMl0gfHwgcG9zWSA8IHZpZXdCb3hbMV0gfHwgcG9zWSA+IHZpZXdCb3hbM10pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0U3RhdGUuZm9udCB8fCAhdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbGFzdFBvc1ggPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybVs0XTsKICAgICAgbGV0IGxhc3RQb3NZID0gdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm1bNV07CiAgICAgIGlmIChsYXN0UG9zWCA9PT0gcG9zWCAmJiBsYXN0UG9zWSA9PT0gcG9zWSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCByb3RhdGUgPSAtMTsKICAgICAgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMF0gJiYgY3VycmVudFRyYW5zZm9ybVsxXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzJdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVswXSA+IDAgPyAwIDogMTgwOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMV0gJiYgY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVsxXSA+IDAgPyA5MCA6IDI3MDsKICAgICAgfQogICAgICBzd2l0Y2ggKHJvdGF0ZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTA6CiAgICAgICAgICBbcG9zWCwgcG9zWV0gPSBbcG9zWSwgcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFtsYXN0UG9zWSwgbGFzdFBvc1hdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICBbcG9zWCwgcG9zWSwgbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstcG9zWCwgLXBvc1ksIC1sYXN0UG9zWCwgLWxhc3RQb3NZXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjcwOgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gWy1wb3NZLCAtcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstbGFzdFBvc1ksIC1sYXN0UG9zWF07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gYXBwbHlJbnZlcnNlUm90YXRpb24ocG9zWCwgcG9zWSwgY3VycmVudFRyYW5zZm9ybSk7CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IGFwcGx5SW52ZXJzZVJvdGF0aW9uKGxhc3RQb3NYLCBsYXN0UG9zWSwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkgewogICAgICAgIGNvbnN0IGFkdmFuY2VZID0gKGxhc3RQb3NZIC0gcG9zWSkgLyB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICBjb25zdCBhZHZhbmNlWCA9IHBvc1ggLSBsYXN0UG9zWDsKICAgICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLmhlaWdodCk7CiAgICAgICAgaWYgKGFkdmFuY2VZIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWCkgPiAwLjUgKiB0ZXh0Q29udGVudEl0ZW0ud2lkdGgpIHsKICAgICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICAgI
20HJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGFkdmFuY2VZIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgfQogICAgICAgIGlmIChhZHZhbmNlWSA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgICAgaWYgKHNob3VsZEFkZFdoaXRlcHNhY2UoKSkgewogICAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhhZHZhbmNlWSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICs9IGFkdmFuY2VZOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWFkZEZha2VTcGFjZXMoYWR2YW5jZVksIHRleHRDb250ZW50SXRlbS5wcmV2VHJhbnNmb3JtLCB0ZXh0T3JpZW50YXRpb24pKSB7CiAgICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICAgIGhlaWdodDogTWF0aC5hYnMoYWR2YW5jZVkpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhZHZhbmNlWTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCAqIFZFUlRJQ0FMX1NISUZUX1JBVElPKSB7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBhZHZhbmNlWCA9IChwb3NYIC0gbGFzdFBvc1gpIC8gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIGNvbnN0IGFkdmFuY2VZID0gcG9zWSAtIGxhc3RQb3NZOwogICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLndpZHRoKTsKICAgICAgaWYgKGFkdmFuY2VYIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoYWR2YW5jZVkpID4gMC41ICogdGV4dENvbnRlbnRJdGVtLmhlaWdodCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0KSB7CiAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGFkdmFuY2VYIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICB9CiAgICAgIGlmIChhZHZhbmNlWCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgIGlmIChzaG91bGRBZGRXaGl0ZXBzYWNlKCkpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICB3aWR0aDogTWF0aC5hYnMoYWR2YW5jZVgpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFkdmFuY2VYOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWRkRmFrZVNwYWNlcyhhZHZhbmNlWCwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0sIHRleHRPcmllbnRhdGlvbikpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmFicyhhZHZhbmNlWCkKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYWR2YW5jZVg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogVkVSVElDQUxfU0hJRlRfUkFUSU8pIHsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICBjaGFycywKICAgICAgZXh0cmFTcGFjaW5nCiAgICB9KSB7CiAgICAgIGNvbnN0IGZvbnQgPSB0ZXh0U3RhdGUuZm9udDsKICAgICAgaWYgKCFjaGFycykgewogICAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nICsgZXh0cmFTcGFjaW5nOwogICAgICAgIGlmIChjaGFyU3BhY2luZykgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KGNoYXJTcGFjaW5nICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgLWNoYXJTcGFjaW5nKTsKICAgICAgICAgI
20H0KICAgICAgICB9CiAgICAgICAgaWYgKGtlZXBXaGl0ZVNwYWNlKSB7CiAgICAgICAgICBjb21wYXJlV2l0aExhc3RQb3NpdGlvbigwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICAgIGNvbnN0IHNjYWxlID0gdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF0gKiB0ZXh0U3RhdGUuZm9udFNpemU7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGdseXBocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2F0ZWdvcnkKICAgICAgICB9ID0gZ2x5cGg7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzSW52aXNpYmxlRm9ybWF0TWFyaykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBjaGFyU3BhY2luZyA9IHRleHRTdGF0ZS5jaGFyU3BhY2luZyArIChpICsgMSA9PT0gaWkgPyBleHRyYVNwYWNpbmcgOiAwKTsKICAgICAgICBsZXQgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoOwogICAgICAgIGlmIChmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpYyA/IGdseXBoLnZtZXRyaWNbMF0gOiAtZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgICAgbGV0IHNjYWxlZERpbSA9IGdseXBoV2lkdGggKiBzY2FsZTsKICAgICAgICBpZiAoIWtlZXBXaGl0ZVNwYWNlICYmIGNhdGVnb3J5LmlzV2hpdGVzcGFjZSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIGNoYXJTcGFjaW5nICs9IHNjYWxlZERpbSArIHRleHRTdGF0ZS53b3JkU3BhY2luZzsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjaGFyU3BhY2luZyArPSAtc2NhbGVkRGltICsgdGV4dFN0YXRlLndvcmRTcGFjaW5nOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgICAgc2F2ZUxhc3RDaGFyKCIgIik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjYXRlZ29yeS5pc1plcm9XaWR0aERpYWNyaXRpYyAmJiAhY29tcGFyZVdpdGhMYXN0UG9zaXRpb24oc2NhbGVkRGltKSkgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIHNjYWxlZERpbSk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGV4dENodW5rID0gZW5zdXJlVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzWmVyb1dpZHRoRGlhY3JpdGljKSB7CiAgICAgICAgICBzY2FsZWREaW0gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgIHNjYWxlZERpbSAqPSB0ZXh0U3RhdGUudGV4dEhTY2FsZTsKICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KHNjYWxlZERpbSwgMCk7CiAgICAgICAgICB0ZXh0Q2h1bmsud2lkdGggKz0gc2NhbGVkRGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCBzY2FsZWREaW0pOwogICAgICAgICAgc2NhbGVkRGltID0gTWF0aC5hYnMoc2NhbGVkRGltKTsKICAgICAgICAgIHRleHRDaHVuay5oZWlnaHQgKz0gc2NhbGVkRGltOwogICAgICAgIH0KICAgICAgICBpZiAoc2NhbGVkRGltKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsucHJldlRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGdseXBoVW5pY29kZSA9IGdseXBoLnVuaWNvZGU7CiAgICAgICAgaWYgKHNhdmVMYXN0Q2hhcihnbHlwaFVuaWNvZGUpKSB7CiAgICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goIiAiKTsKICAgICAgICB9CiAgICAgICAgdGV4dENodW5rLnN0ci5wdXNoKGdseXBoVW5pY29kZSk7CiAgICAgICAgaWYgKGNoYXJTcGFjaW5nKSB7CiAgICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoY2hhclNwYWNpbmcgKiB0ZXh0U3RhdGUudGV4dEhTY2FsZSwgMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeCgwLCAtY2hhclNwYWNpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXBwZW5kRU9MKCkgewogICAgICByZXNldExhc3RDaGFycygpOwogICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhhc0VPTCA9IHRydWU7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHsKICAgICAgICAgIHN0cjogIiIsCiAgICAgICAgICBkaXI6ICJsdHIiLAogICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICB0cmFuc2Zvcm06IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgICBmb250TmFtZTogdGV4dFN0YXRlLmxvYWRlZE5hbWUsCiAgICAgICAgICBoYXNFT0w6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkRmFrZVNwYWNlcyh3aWR0aCwgdHJhbnNmLCB0ZXh0T3JpZW50YXRpb24pIHsKICAgICAgaWYgKHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5zcGFjZUluRmxvd01pbiA8PSB3aWR0aCAmJi
20B3aWR0aCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0uc3BhY2VJbkZsb3dNYXgpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLnN0ci5wdXNoKCIgIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBmb250TmFtZSA9IHRleHRDb250ZW50SXRlbS5mb250TmFtZTsKICAgICAgbGV0IGhlaWdodCA9IDA7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICBoZWlnaHQgPSB3aWR0aDsKICAgICAgICB3aWR0aCA9IDA7CiAgICAgIH0KICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgIHdpZHRoOiBNYXRoLmFicyh3aWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhoZWlnaHQpLAogICAgICAgIHRyYW5zZm9ybTogdHJhbnNmIHx8IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCksCiAgICAgICAgZm9udE5hbWUKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gZmx1c2hUZXh0Q29udGVudEl0ZW0oKSB7CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkIHx8ICF0ZXh0Q29udGVudEl0ZW0uc3RyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggKz0gdGV4dENvbnRlbnRJdGVtLndpZHRoICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsSGVpZ2h0ICs9IHRleHRDb250ZW50SXRlbS5oZWlnaHQgKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgfQogICAgICB0ZXh0Q29udGVudC5pdGVtcy5wdXNoKHJ1bkJpZGlUcmFuc2Zvcm0odGV4dENvbnRlbnRJdGVtKSk7CiAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLmxlbmd0aCA9IDA7CiAgICB9CiAgICBmdW5jdGlvbiBlbnF1ZXVlQ2h1bmsoYmF0Y2ggPSBmYWxzZSkgewogICAgICBjb25zdCBsZW5ndGggPSB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGJhdGNoICYmIGxlbmd0aCA8IFRFWFRfQ0hVTktfQkFUQ0hfU0laRSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBzaW5rLmVucXVldWUodGV4dENvbnRlbnQsIGxlbmd0aCk7CiAgICAgIHRleHRDb250ZW50Lml0ZW1zID0gW107CiAgICAgIHRleHRDb250ZW50LnN0eWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB9CiAgICBjb25zdCB0aW1lU2xvdE1hbmFnZXIgPSBuZXcgVGltZVNsb3RNYW5hZ2VyKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGNvbnN0IG5leHQgPSBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgIGVucXVldWVDaHVuayh0cnVlKTsKICAgICAgICBQcm9taXNlLmFsbChbcHJvbWlzZSwgc2luay5yZWFkeV0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHJlamVjdChleCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgfTsKICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOwogICAgICBjb25zdCBvcGVyYXRpb24gPSB7fTsKICAgICAgbGV0IHN0b3AsCiAgICAgICAgbmFtZSwKICAgICAgICBpc1ZhbGlkTmFtZSwKICAgICAgICBhcmdzID0gW107CiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0ZXh0U3RhdGU7CiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOwogICAgICAgIGNvbnN0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKICAgICAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgZm9udE5hbWVBcmcgPSBhcmdzWzBdLm5hbWUsCiAgICAgICAgICAgICAgZm9udFNpemVBcmcgPSBhcmdzWzFdOwogICAgICAgICAgICBpZiAodGV4dFN0YXRlLmZvbnQgJiYgZm9udE5hbWVBcmcgPT09IHRleHRTdGF0ZS5mb250TmFtZSAmJiBmb250U2l6ZUFyZyA9PT0gdGV4dFN0YXRlLmZvbnRTaXplKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnROYW1lID0gZm9udE5hbWVBcmc7CiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGZvbnRTaXplQXJnOwogICAgICAgICAgICBuZXh0KGhhbmRsZVNldEZvbnQoZm9udE5hbWVBcmcsIG51bGwpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dFJpc2U6CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0UmlzZSA9IGFyZ3NbMF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0SFNjYWxlOgogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dEhTY2FsZSA9IGFyZ3NbMF0gLyAxMDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZzoKICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLm1vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgI
20HRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0TGVhZGluZ01vdmVUZXh0OgogICAgICAgICAgICB0ZXh0U3RhdGUubGVhZGluZyA9IC1hcmdzWzFdOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmU6CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFRleHRNYXRyaXg6CiAgICAgICAgICAgIHRleHRTdGF0ZS5zZXRUZXh0TWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOwogICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dExpbmVNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7CiAgICAgICAgICAgIHVwZGF0ZUFkdmFuY2VTY2FsZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldENoYXJTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUuY2hhclNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldFdvcmRTcGFjaW5nOgogICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmJlZ2luVGV4dDoKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVguc2xpY2UoKTsKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4ID0gSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1NwYWNlZFRleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNwYWNlRmFjdG9yID0gKHRleHRTdGF0ZS5mb250LnZlcnRpY2FsID8gMSA6IC0xKSAqIHRleHRTdGF0ZS5mb250U2l6ZSAvIDEwMDA7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXJnc1swXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50c1tpXTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICBzaG93U3BhY2VkVGV4dEJ1ZmZlci5wdXNoKGl0ZW0pOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICJudW1iZXIiICYmIGl0ZW0gIT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgICAgc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiBpdGVtICogc3BhY2VGYWN0b3IKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2hvd1NwYWNlZFRleHRCdWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbnN0IHN0ciA9IHNob3dTcGFjZWRUZXh0QnVmZmVyLmpvaW4oIiIpOwogICAgICAgICAgICAgIHNob3dTcGFjZWRUZXh0QnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICAgICAgICAgICAgY2hhcnM6IHN0ciwKICAgICAgICAgICAgICAgIGV4dHJhU3BhY2luZzogMAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGV4dFN0YXRlLmNhcnJpYWdlUmV0dXJuKCk7CiAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICBjaGFyczogYXJnc1swXSwKICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRleHRTdGF0ZS53b3JkU3BhY2luZyA9IGFyZ3NbMF07CiAgICAgICAgICAgI
20HRleHRTdGF0ZS5jaGFyU3BhY2luZyA9IGFyZ3NbMV07CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgY2hhcnM6IGFyZ3NbMl0sCiAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiAwCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnBhaW50WE9iamVjdDoKICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgeG9ianMgPz89IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBEaWN0LmVtcHR5OwogICAgICAgICAgICBpc1ZhbGlkTmFtZSA9IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lOwogICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOwogICAgICAgICAgICBpZiAoaXNWYWxpZE5hbWUgJiYgZW1wdHlYT2JqZWN0Q2FjaGUuZ2V0QnlOYW1lKG5hbWUpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgaWYgKGVtcHR5WE9iamVjdENhY2hlLmdldEJ5UmVmKHhvYmopKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGdsb2JhbEltYWdlID0gc2VsZi5nbG9iYWxJbWFnZUNhY2hlLmdldERhdGEoeG9iaiwgc2VsZi5wYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGdsb2JhbEltYWdlKSB7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHhvYmogPSB4cmVmLmZldGNoKHhvYmopOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoISh4b2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICAgICAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lICE9PSAiRm9ybSIpIHsKICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlLmNsb25lKCk7CiAgICAgICAgICAgICAgY29uc3QgeE9ialN0YXRlTWFuYWdlciA9IG5ldyBTdGF0ZU1hbmFnZXIoY3VycmVudFN0YXRlKTsKICAgICAgICAgICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoeG9iai5kaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgbnVsbCk7CiAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgewogICAgICAgICAgICAgICAgeE9ialN0YXRlTWFuYWdlci50cmFuc2Zvcm0obWF0cml4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZW5xdWV1ZUNodW5rKCk7CiAgICAgICAgICAgICAgY29uc3Qgc2lua1dyYXBwZXIgPSB7CiAgICAgICAgICAgICAgICBlbnF1ZXVlSW52b2tlZDogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuZW5xdWV1ZUludm9rZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICBzaW5rLmVucXVldWUoY2h1bmssIHNpemUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldCBkZXNpcmVkU2l6ZSgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmsuZGVzaXJlZFNpemU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IHJlYWR5KCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5yZWFkeTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHNlbGYuZ2V0VGV4dENvbnRlbnQoewogICAgICAgICAgICAgICAgc3RyZWFtOiB4b2JqLAogICAgICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgICAgIHJlc291cmNlczogeG9iai5kaWN0LmdldCgiUmVzb3VyY2VzIikgfHwgcmVzb3VyY2VzLAogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyOiB4T2JqU3RhdGVNYW5hZ2VyLAogICAgICAgICAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgICAgICAgICBzaW5rOiBzaW5rV3JhcHBlciwKICAgICAgICAgICAgICAgIHNlZW5TdHlsZXMsCiAgICAgICAgICAgICAgICB2aWV3Qm94LAogICAgICAgICAgICAgICAgbGFuZywKICAgICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLAogICAgICAgICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24sCiAgICAgICAgICAgICAgICBrZWVwV2hpdGVTcGFjZQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFzaW5rV3JhcHBlci5lbnF1ZXVlSW52b2tlZCkgewogICAgICAgICAgICAgICAgICBlbXB0eVhPYmplY3RDYWNoZS5zZXQobmFtZSwgeG9iai5kaWN0Lm9iaklkLCB0cnVlKTsKICAgICAgICAgICAgICAgI
20H0KICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgfSwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgIHdhcm4oYGdldFRleHRDb250ZW50IC0gaWdub3JpbmcgWE9iamVjdDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICBjYXNlIE9QUy5zZXRHU3RhdGU6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIE5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSAmJiBlbXB0eUdTdGF0ZUNhY2hlLmdldEJ5TmFtZShuYW1lKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSkgewogICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgZXh0R1N0YXRlID0gcmVzb3VyY2VzLmdldCgiRXh0R1N0YXRlIik7CiAgICAgICAgICAgICAgaWYgKCEoZXh0R1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRXh0R1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZSA9IGV4dEdTdGF0ZS5nZXQobmFtZSk7CiAgICAgICAgICAgICAgaWYgKCEoZ1N0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiR1N0YXRlIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdTdGF0ZUZvbnQgPSBnU3RhdGUuZ2V0KCJGb250Iik7CiAgICAgICAgICAgICAgaWYgKCFnU3RhdGVGb250KSB7CiAgICAgICAgICAgICAgICBlbXB0eUdTdGF0ZUNhY2hlLnNldChuYW1lLCBnU3RhdGUub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgcmVzb2x2ZUdTdGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IG51bGw7CiAgICAgICAgICAgICAgdGV4dFN0YXRlLmZvbnRTaXplID0gZ1N0YXRlRm9udFsxXTsKICAgICAgICAgICAgICBoYW5kbGVTZXRGb250KG51bGwsIGdTdGF0ZUZvbnRbMF0pLnRoZW4ocmVzb2x2ZUdTdGF0ZSwgcmVqZWN0R1N0YXRlKTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50OgogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBpZiAoaW5jbHVkZU1hcmtlZENvbnRlbnQpIHsKICAgICAgICAgICAgICBtYXJrZWRDb250ZW50RGF0YS5sZXZlbCsrOwogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudCIsCiAgICAgICAgICAgICAgICB0YWc6IGFyZ3NbMF0gaW5zdGFuY2VvZiBOYW1lID8gYXJnc1swXS5uYW1lIDogbnVsbAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsKys7CiAgICAgICAgICAgICAgbGV0IG1jaWQgPSBudWxsOwogICAgICAgICAgICAgIGlmIChhcmdzWzFdIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICAgICAgbWNpZCA9IGFyZ3NbMV0uZ2V0KCJNQ0lEIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudFByb3BzIiwKICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIuaXNJbnRlZ2VyKG1jaWQpID8gYCR7c2VsZi5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCl9X21jJHttY2lkfWAgOiBudWxsLAogICAgICAgICAgICAgICAgdGFnOiBhcmdzWzBdIGluc3RhbmNlb2YgTmFtZSA/IGFyZ3NbMF0ubmFtZSA6IG51bGwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLmVuZE1hcmtlZENvbnRlbnQ6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIGlmIChtYXJrZWRDb250ZW50RGF0YS5sZXZlbCA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsLS07CiAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eX
20BlOiAiZW5kTWFya2VkQ29udGVudCIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnJlc3RvcmU6CiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICYmIChwcmV2aW91c1N0YXRlLmZvbnQgIT09IHRleHRTdGF0ZS5mb250IHx8IHByZXZpb3VzU3RhdGUuZm9udFNpemUgIT09IHRleHRTdGF0ZS5mb250U2l6ZSB8fCBwcmV2aW91c1N0YXRlLmZvbnROYW1lICE9PSB0ZXh0U3RhdGUuZm9udE5hbWUpKSB7CiAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aCA+PSBzaW5rLmRlc2lyZWRTaXplKSB7CiAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RvcCkgewogICAgICAgIG5leHQoZGVmZXJyZWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgd2FybihgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBlcnJvcnMgZHVyaW5nICIke3Rhc2submFtZX0iIGAgKyBgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGFzeW5jIGV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGNpZFRvR2lkQnl0ZXM7CiAgICBjb25zdCB0b1VuaWNvZGVQcm9taXNlID0gdGhpcy5yZWFkVG9Vbmljb2RlKHByb3BlcnRpZXMudG9Vbmljb2RlKTsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKICAgICAgaWYgKGNpZFN5c3RlbUluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0gewogICAgICAgICAgcmVnaXN0cnk6IHN0cmluZ1RvUERGU3RyaW5nKGNpZFN5c3RlbUluZm8uZ2V0KCJSZWdpc3RyeSIpKSwKICAgICAgICAgIG9yZGVyaW5nOiBzdHJpbmdUb1BERlN0cmluZyhjaWRTeXN0ZW1JbmZvLmdldCgiT3JkZXJpbmciKSksCiAgICAgICAgICBzdXBwbGVtZW50OiBjaWRTeXN0ZW1JbmZvLmdldCgiU3VwcGxlbWVudCIpCiAgICAgICAgfTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gZGljdC5nZXQoIkNJRFRvR0lETWFwIik7CiAgICAgICAgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgY2lkVG9HaWRCeXRlcyA9IGNpZFRvR2lkTWFwLmdldEJ5dGVzKCk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICAgIHdhcm4oYGV4dHJhY3REYXRhU3RydWN0dXJlcyAtIGlnbm9yaW5nIENJRFRvR0lETWFwIGRhdGE6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gW107CiAgICBsZXQgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICBsZXQgZW5jb2Rpbmc7CiAgICBpZiAoZGljdC5oYXMoIkVuY29kaW5nIikpIHsKICAgICAgZW5jb2RpbmcgPSBkaWN0LmdldCgiRW5jb2RpbmciKTsKICAgICAgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBlbmNvZGluZy5nZXQoIkJhc2VFbmNvZGluZyIpOwogICAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lIGluc3RhbmNlb2YgTmFtZSA/IGJhc2VFbmNvZGluZ05hbWUubmFtZSA6IG51bGw7CiAgICAgICAgaWYgKGVuY29kaW5nLmhhcygiRGlmZmVyZW5jZXMiKSkgewogICAgICAgICAgY29uc3QgZGlmZkVuY29kaW5nID0gZW5jb2RpbmcuZ2V0KCJEaWZmZXJlbmNlcyIpOwogICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGlmZkVuY29kaW5nKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB4cmVmLmZldGNoSWZSZWYoZW50cnkpOwogICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBkYXRhOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgZGlmZmVyZW5jZXNbaW5kZXgrK10gPSBkYXRhLm5hbWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIGVudHJ5IGluICdEaWZmZXJlbmNlcycgYXJyYXk6ICR7ZGF0YX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcubmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBtc2cgPSAiRW5jb2RpbmcgaXMgbm90IGEgTmFtZSBub3IgYSBEaWN0IjsKICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihtc2cpOwogICAgICAgIH0KICAgICAgICB3YXJuKG1zZyk7CiAgICAgIH0KICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICAgI
20H0KICAgIH0KICAgIGNvbnN0IG5vbkVtYmVkZGVkRm9udCA9ICFwcm9wZXJ0aWVzLmZpbGUgfHwgcHJvcGVydGllcy5pc0ludGVybmFsRm9udCwKICAgICAgaXNTeW1ib2xzRm9udE5hbWUgPSBnZXRTeW1ib2xzRm9udHMoKVtwcm9wZXJ0aWVzLm5hbWVdOwogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgbm9uRW1iZWRkZWRGb250ICYmIGlzU3ltYm9sc0ZvbnROYW1lKSB7CiAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOwogICAgfQogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUpIHsKICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGlzU3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5TeW1ib2xpYyk7CiAgICAgIGNvbnN0IGlzTm9uc3ltYm9saWNGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIEZvbnRGbGFncy5Ob25zeW1ib2xpYyk7CiAgICAgIGVuY29kaW5nID0gU3RhbmRhcmRFbmNvZGluZzsKICAgICAgaWYgKHByb3BlcnRpZXMudHlwZSA9PT0gIlRydWVUeXBlIiAmJiAhaXNOb25zeW1ib2xpY0ZvbnQpIHsKICAgICAgICBlbmNvZGluZyA9IFdpbkFuc2lFbmNvZGluZzsKICAgICAgfQogICAgICBpZiAoaXNTeW1ib2xpY0ZvbnQgfHwgaXNTeW1ib2xzRm9udE5hbWUpIHsKICAgICAgICBlbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7CiAgICAgICAgaWYgKG5vbkVtYmVkZGVkRm9udCkgewogICAgICAgICAgaWYgKC9TeW1ib2wvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBTeW1ib2xTZXRFbmNvZGluZzsKICAgICAgICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gWmFwZkRpbmdiYXRzRW5jb2Rpbmc7CiAgICAgICAgICB9IGVsc2UgaWYgKC9XaW5nZGluZ3MvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CiAgICB9CiAgICBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzID0gZGlmZmVyZW5jZXM7CiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lOwogICAgcHJvcGVydGllcy5oYXNFbmNvZGluZyA9ICEhYmFzZUVuY29kaW5nTmFtZSB8fCBkaWZmZXJlbmNlcy5sZW5ndGggPiAwOwogICAgcHJvcGVydGllcy5kaWN0ID0gZGljdDsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYXdhaXQgdG9Vbmljb2RlUHJvbWlzZTsKICAgIGNvbnN0IGJ1aWx0VG9Vbmljb2RlID0gYXdhaXQgdGhpcy5idWlsZFRvVW5pY29kZShwcm9wZXJ0aWVzKTsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gYnVpbHRUb1VuaWNvZGU7CiAgICBpZiAoY2lkVG9HaWRCeXRlcykgewogICAgICBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwID0gdGhpcy5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOwogICAgfQogICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgfQogIF9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHsKICAgIGFzc2VydCghcHJvcGVydGllcy5jb21wb3NpdGUsICJNdXN0IGJlIGEgc2ltcGxlIGZvbnQuIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmcuc2xpY2UoKTsKICAgIGNvbnN0IGJhc2VFbmNvZGluZ05hbWUgPSBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWU7CiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICBmb3IgKGNvbnN0IGNoYXJjb2RlIGluIGRpZmZlcmVuY2VzKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGRpZmZlcmVuY2VzW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIi5ub3RkZWYiKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZW5jb2RpbmdbY2hhcmNvZGVdID0gZ2x5cGhOYW1lOwogICAgfQogICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9IGdldEdseXBoc1VuaWNvZGUoKTsKICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKICAgICAgbGV0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgICAgaWYgKHVuaWNvZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBjb2RlID0gMDsKICAgICAgc3dpdGNoIChnbHlwaE5hbWVbMF0pIHsKICAgICAgICBjYXNlICJHIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSAzKSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSA1KSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDIjoKICAgICAgICBjYXNlICJjIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID49IDMgJiYgZ2x5cGhOYW1lLmxlbmd0aCA8PSA0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvZGVTdHIgPSBnbHlwaE5hbWUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHsKICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihjb2RlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidSI6CiAgICAgICAgICB1bmljb2RlID0gZ2V0VW5pY29kZUZvckdseXBoKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICAgICAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgICAgICAgY29
20kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3dpdGNoIChnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY2FzZSAiZl9oIjoKICAgICAgICAgICAgY2FzZSAiZl90IjoKICAgICAgICAgICAgY2FzZSAiVF9oIjoKICAgICAgICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gZ2x5cGhOYW1lLnJlcGxhY2VBbGwoIl8iLCAiIik7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY29kZSA+IDAgJiYgY29kZSA8PSAweDEwZmZmZiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgJiYgY29kZSA9PT0gK2NoYXJjb2RlKSB7CiAgICAgICAgICBjb25zdCBiYXNlRW5jb2RpbmcgPSBnZXRFbmNvZGluZyhiYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgJiYgKGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyY29kZV0pKSB7CiAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b1VuaWNvZGU7CiAgfQogIGFzeW5jIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZT8ubGVuZ3RoID4gMDsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgewogICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzKSk7CiAgICB9CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUgJiYgKHByb3BlcnRpZXMuY01hcC5idWlsdEluQ01hcCAmJiAhKHByb3BlcnRpZXMuY01hcCBpbnN0YW5jZW9mIElkZW50aXR5Q01hcCkgfHwgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvPy5yZWdpc3RyeSA9PT0gIkFkb2JlIiAmJiAocHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiR0IxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJDTlMxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJKYXBhbjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIktvcmVhMSIpKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVnaXN0cnksCiAgICAgICAgb3JkZXJpbmcKICAgICAgfSA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mbzsKICAgICAgY29uc3QgdWNzMkNNYXBOYW1lID0gTmFtZS5nZXQoYCR7cmVnaXN0cnl9LSR7b3JkZXJpbmd9LVVDUzJgKTsKICAgICAgY29uc3QgdWNzMkNNYXAgPSBhd2FpdCBDTWFwRmFjdG9yeS5jcmVhdGUoewogICAgICAgIGVuY29kaW5nOiB1Y3MyQ01hcE5hbWUsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgICAgIGJ1ZiA9IFtdOwogICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkgewogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCB1Y3MyID0gdWNzMkNNYXAubG9va3VwKGNpZCk7CiAgICAgICAgaWYgKHVjczIpIHsKICAgICAgICAgIGJ1Zi5sZW5ndGggPSAwOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdWNzMi5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgIGJ1Zi5wdXNoKCh1Y3MyLmNoYXJDb2RlQXQoaSkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoaSArIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAodG9Vbmljb2RlKTsKICAgIH0KICAgIHJldHVybiBuZXcgSWRlbnRpdHlUb1VuaWNvZGVNYXAocHJvcGVydGllcy5maXJzdENoYXIsIHByb3BlcnRpZXMubGFzdENoYXIpOwogIH0KICBhc3luYyByZWFkVG9Vbmljb2RlKGNtYXBPYmopIHsKICAgIGlmICghY21hcE9iaikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjbWFwT2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICBlbmNvZGluZzogY21hcE9iaiwKICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCiAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICB9KTsKICAgICAgaWYgKGNtYXAgaW5zdGFuY2VvZiBJZGVudGl0eUNNYXApIHsKICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBUb1VuaWNvZGVNYXAoY21hcC5nZXRNYXAoKSk7CiAgICB9CiAgICBpZiAoY21hcE9iaiBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjbWFwID0gYXdhaXQgQ01hcEZhY3RvcnkuY3JlYXRlKHsKICAgICAgICAgIGVuY29kaW5nOiBjbWFwT2JqLAogICAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICAgI
20H0pOwogICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VG9Vbmljb2RlTWFwKDAsIDB4ZmZmZik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheShjbWFwLmxlbmd0aCk7CiAgICAgICAgY21hcC5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdG9rZW4pIHsKICAgICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCh0b2tlbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0b2tlbi5sZW5ndGggJSAyICE9PSAwKSB7CiAgICAgICAgICAgIHRva2VuID0gIlx1MDAwMCIgKyB0b2tlbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0ciA9IFtdOwogICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCB0b2tlbi5sZW5ndGg7IGsgKz0gMikgewogICAgICAgICAgICBjb25zdCB3MSA9IHRva2VuLmNoYXJDb2RlQXQoaykgPDwgOCB8IHRva2VuLmNoYXJDb2RlQXQoayArIDEpOwogICAgICAgICAgICBpZiAoKHcxICYgMHhmODAwKSAhPT0gMHhkODAwKSB7CiAgICAgICAgICAgICAgc3RyLnB1c2godzEpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGsgKz0gMjsKICAgICAgICAgICAgY29uc3QgdzIgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKICAgICAgICAgICAgc3RyLnB1c2goKCh3MSAmIDB4M2ZmKSA8PCAxMCkgKyAodzIgJiAweDNmZikgKyAweDEwMDAwKTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcFtjaGFyQ29kZV0gPSBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5zdHIpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXcgVG9Vbmljb2RlTWFwKG1hcCk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBBYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB3YXJuKGByZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlYWRDaWRUb0dpZE1hcChnbHlwaHNEYXRhLCB0b1VuaWNvZGUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChsZXQgaiA9IDAsIGpqID0gZ2x5cGhzRGF0YS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIGNvbnN0IGdseXBoSUQgPSBnbHlwaHNEYXRhW2orK10gPDwgOCB8IGdseXBoc0RhdGFbal07CiAgICAgIGNvbnN0IGNvZGUgPSBqID4+IDE7CiAgICAgIGlmIChnbHlwaElEID09PSAwICYmICF0b1VuaWNvZGUuaGFzKGNvZGUpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmVzdWx0W2NvZGVdID0gZ2x5cGhJRDsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGV4dHJhY3RXaWR0aHMoZGljdCwgZGVzY3JpcHRvciwgcHJvcGVydGllcykgewogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBnbHlwaHNXaWR0aHMgPSBbXTsKICAgIGxldCBkZWZhdWx0V2lkdGggPSAwOwogICAgY29uc3QgZ2x5cGhzVk1ldHJpY3MgPSBbXTsKICAgIGxldCBkZWZhdWx0Vk1ldHJpY3M7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgY29uc3QgZHcgPSBkaWN0LmdldCgiRFciKTsKICAgICAgZGVmYXVsdFdpZHRoID0gdHlwZW9mIGR3ID09PSAibnVtYmVyIiA/IE1hdGguY2VpbChkdykgOiAxMDAwOwogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiVyIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aWR0aHMpKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGxldCBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaSsrXSk7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbaV0pOwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29kZSkpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvZGUpIHsKICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHhyZWYuZmV0Y2hJZlJlZihjKTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0XSA9IHdpZHRoOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIoY29kZSkpIHsKICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzWysraV0pOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoICE9PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGogPSBzdGFydDsgaiA8PSBjb2RlOyBqKyspIHsKICAgICAgICAgICAgICBnbHlwaHNXaWR0aHNbal0gPSB3aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLnZlcnRpY2FsKSB7CiAgICAgICAgY29uc3QgZHcyID0gZGljdC5nZXRBcnJheSgiRFcyIik7CiAgICAgICAgbGV0IHZtZXRyaWNzID0gaXNOdW1iZXJBcnJheShkdzIsIDIpID8gZHcyIDogWzg4MCwgLTEwMDBdOwogICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldCgiVzIiKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2bWV0cmljcykpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZtZXRyaWNzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgbGV0IHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzW2krK10pOwogICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3RhcnQpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgI
20H0KICAgICAgICAgICAgY29uc3QgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgICBjb25zdCB2bWV0cmljID0gW3hyZWYuZmV0Y2hJZlJlZihjb2RlW2orK10pLCB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbal0pXTsKICAgICAgICAgICAgICAgIGlmIChpc051bWJlckFycmF5KHZtZXRyaWMsIG51bGwpKSB7CiAgICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0XSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGFydCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpKSB7CiAgICAgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IFt4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pXTsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyQXJyYXkodm1ldHJpYywgbnVsbCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gY29kZTsgaisrKSB7CiAgICAgICAgICAgICAgICBnbHlwaHNWTWV0cmljc1tqXSA9IHZtZXRyaWM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIik7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdpZHRocykpIHsKICAgICAgICBsZXQgaiA9IHByb3BlcnRpZXMuZmlyc3RDaGFyOwogICAgICAgIGZvciAoY29uc3QgdyBvZiB3aWR0aHMpIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0geHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgaWYgKHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICB9CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG1pc3NpbmdXaWR0aCA9IGRlc2NyaXB0b3IuZ2V0KCJNaXNzaW5nV2lkdGgiKTsKICAgICAgICBkZWZhdWx0V2lkdGggPSB0eXBlb2YgbWlzc2luZ1dpZHRoID09PSAibnVtYmVyIiA/IG1pc3NpbmdXaWR0aCA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKGJhc2VGb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUubmFtZSk7CiAgICAgICAgICBnbHlwaHNXaWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBwcm9wZXJ0aWVzKTsKICAgICAgICAgIGRlZmF1bHRXaWR0aCA9IG1ldHJpY3MuZGVmYXVsdFdpZHRoOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGV0IGlzTW9ub3NwYWNlID0gdHJ1ZTsKICAgIGxldCBmaXJzdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgZm9yIChjb25zdCBnbHlwaCBpbiBnbHlwaHNXaWR0aHMpIHsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoc1dpZHRoc1tnbHlwaF07CiAgICAgIGlmICghZ2x5cGhXaWR0aCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghZmlyc3RXaWR0aCkgewogICAgICAgIGZpcnN0V2lkdGggPSBnbHlwaFdpZHRoOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChmaXJzdFdpZHRoICE9PSBnbHlwaFdpZHRoKSB7CiAgICAgICAgaXNNb25vc3BhY2UgPSBmYWxzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGlzTW9ub3NwYWNlKSB7CiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgfD0gRm9udEZsYWdzLk
20ZpeGVkUGl0Y2g7CiAgICB9IGVsc2UgewogICAgICBwcm9wZXJ0aWVzLmZsYWdzICY9IH5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKICAgIH0KICAgIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7CiAgICBwcm9wZXJ0aWVzLmRlZmF1bHRWTWV0cmljcyA9IGRlZmF1bHRWTWV0cmljczsKICAgIHByb3BlcnRpZXMudm1ldHJpY3MgPSBnbHlwaHNWTWV0cmljczsKICB9CiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7CiAgICBjb25zdCBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iLCAxKVswXTsKICAgIHJldHVybiBmb250TmFtZVdvU3R5bGUgaW4gZ2V0U2VyaWZGb250cygpIHx8IC9zZXJpZi9naS50ZXN0KGZvbnROYW1lV29TdHlsZSk7CiAgfQogIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7CiAgICBsZXQgZGVmYXVsdFdpZHRoID0gMDsKICAgIGxldCB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IG1vbm9zcGFjZSA9IGZhbHNlOwogICAgY29uc3Qgc3RkRm9udE1hcCA9IGdldFN0ZEZvbnRNYXAoKTsKICAgIGxldCBsb29rdXBOYW1lID0gc3RkRm9udE1hcFtuYW1lXSB8fCBuYW1lOwogICAgY29uc3QgTWV0cmljcyA9IGdldE1ldHJpY3MoKTsKICAgIGlmICghKGxvb2t1cE5hbWUgaW4gTWV0cmljcykpIHsKICAgICAgbG9va3VwTmFtZSA9IHRoaXMuaXNTZXJpZkZvbnQobmFtZSkgPyAiVGltZXMtUm9tYW4iIDogIkhlbHZldGljYSI7CiAgICB9CiAgICBjb25zdCBnbHlwaFdpZHRocyA9IE1ldHJpY3NbbG9va3VwTmFtZV07CiAgICBpZiAodHlwZW9mIGdseXBoV2lkdGhzID09PSAibnVtYmVyIikgewogICAgICBkZWZhdWx0V2lkdGggPSBnbHlwaFdpZHRoczsKICAgICAgbW9ub3NwYWNlID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHdpZHRocyA9IGdseXBoV2lkdGhzKCk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBkZWZhdWx0V2lkdGgsCiAgICAgIG1vbm9zcGFjZSwKICAgICAgd2lkdGhzCiAgICB9OwogIH0KICBidWlsZENoYXJDb2RlVG9XaWR0aCh3aWR0aHNCeUdseXBoTmFtZSwgcHJvcGVydGllcykgewogICAgY29uc3Qgd2lkdGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CiAgICBmb3IgKGxldCBjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgMjU2OyBjaGFyQ29kZSsrKSB7CiAgICAgIGlmIChjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcyAmJiB3aWR0aHNCeUdseXBoTmFtZVtkaWZmZXJlbmNlc1tjaGFyQ29kZV1dKSB7CiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2RpZmZlcmVuY2VzW2NoYXJDb2RlXV07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlIGluIGVuY29kaW5nICYmIHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV0pIHsKICAgICAgICB3aWR0aHNbY2hhckNvZGVdID0gd2lkdGhzQnlHbHlwaE5hbWVbZW5jb2RpbmdbY2hhckNvZGVdXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHdpZHRoczsKICB9CiAgcHJlRXZhbHVhdGVGb250KGRpY3QpIHsKICAgIGNvbnN0IGJhc2VEaWN0ID0gZGljdDsKICAgIGxldCB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQgZm9udCBTdWJ0eXBlIik7CiAgICB9CiAgICBsZXQgY29tcG9zaXRlID0gZmFsc2U7CiAgICBsZXQgaGFzaDsKICAgIGlmICh0eXBlLm5hbWUgPT09ICJUeXBlMCIpIHsKICAgICAgY29uc3QgZGYgPSBkaWN0LmdldCgiRGVzY2VuZGFudEZvbnRzIik7CiAgICAgIGlmICghZGYpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgfQogICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjsKICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnQgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgICAgfQogICAgICB0eX
20BlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOwogICAgICB9CiAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICB9CiAgICBsZXQgZmlyc3RDaGFyID0gZGljdC5nZXQoIkZpcnN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0Q2hhcikpIHsKICAgICAgZmlyc3RDaGFyID0gMDsKICAgIH0KICAgIGxldCBsYXN0Q2hhciA9IGRpY3QuZ2V0KCJMYXN0Q2hhciIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxhc3RDaGFyKSkgewogICAgICBsYXN0Q2hhciA9IGNvbXBvc2l0ZSA/IDB4ZmZmZiA6IDB4ZmY7CiAgICB9CiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGljdC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CiAgICBjb25zdCB0b1VuaWNvZGUgPSBkaWN0LmdldCgiVG9Vbmljb2RlIikgfHwgYmFzZURpY3QuZ2V0KCJUb1VuaWNvZGUiKTsKICAgIGlmIChkZXNjcmlwdG9yKSB7CiAgICAgIGhhc2ggPSBuZXcgTXVybXVySGFzaDNfNjQoKTsKICAgICAgY29uc3QgZW5jb2RpbmcgPSBiYXNlRGljdC5nZXRSYXcoIkVuY29kaW5nIik7CiAgICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy5uYW1lKTsKICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGhhc2gudXBkYXRlKGVuY29kaW5nLnRvU3RyaW5nKCkpOwogICAgICB9IGVsc2UgaWYgKGVuY29kaW5nIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW5jb2RpbmcuZ2V0UmF3VmFsdWVzKCkpIHsKICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgaGFzaC51cGRhdGUoZW50cnkubmFtZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5LnRvU3RyaW5nKCkpOwogICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkgewogICAgICAgICAgICBjb25zdCBkaWZmTGVuZ3RoID0gZW50cnkubGVuZ3RoLAogICAgICAgICAgICAgIGRpZmZCdWYgPSBuZXcgQXJyYXkoZGlmZkxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGlmZkxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgZGlmZkVudHJ5ID0gZW50cnlbal07CiAgICAgICAgICAgICAgaWYgKGRpZmZFbnRyeSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkubmFtZTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkaWZmRW50cnkgPT09ICJudW1iZXIiIHx8IGRpZmZFbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgZGlmZkJ1ZltqXSA9IGRpZmZFbnRyeS50b1N0cmluZygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoYXNoLnVwZGF0ZShkaWZmQnVmLmpvaW4oKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhc2gudXBkYXRlKGAke2ZpcnN0Q2hhcn0tJHtsYXN0Q2hhcn1gKTsKICAgICAgaWYgKHRvVW5pY29kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKICAgICAgICBjb25zdCB1aW50OGFycmF5ID0gc3RyZWFtLmJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KHN0cmVhbS5ieXRlcy5idWZmZXIsIHN0cmVhbS5zdGFydCwgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CiAgICAgIH0gZWxzZSBpZiAodG9Vbmljb2RlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTsKICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgIGNvbnN0IHdpZHRoc0J1ZiA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygd2lkdGhzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAibnVtYmVyIiB8fCBlbnRyeSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICB3aWR0aHNCdWYucHVzaChlbnRyeS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFzaC51cGRhdGUod2lkdGhzQnVmLmpvaW4oKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICAgIGhhc2gudXBkYXRlKCJjb21wb3NpdGVGb250Iik7CiAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGhzID0gZGljdC5nZXQoIlciKSB8fCBiYXNlRGljdC5nZXQoIlciKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21wb3NpdGVXaWR0aHMpKSB7CiAgICAgICAgICBjb25zdCB3aWR0aHNCdWYgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29tcG9zaXRlV2lkdGhzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICJudW1iZXIiIHx8IGVudHJ5IGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgd2lkdGhzQnVmLnB1c2goZW50cnkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgICAgICAgICAgICBjb25zdCBzdWJXaWR0aHNCdWYgPSBbXTsKICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gIm51bWJlciIgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgICAgICBzdWJXaWR0aHNCdWYucHVzaChlbGVtZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgI
20H0KICAgICAgICAgICAgICB3aWR0aHNCdWYucHVzaChgWyR7c3ViV2lkdGhzQnVmLmpvaW4oKX1dYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGhhc2gudXBkYXRlKHdpZHRoc0J1Zi5qb2luKCkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0UmF3KCJDSURUb0dJRE1hcCIpIHx8IGJhc2VEaWN0LmdldFJhdygiQ0lEVG9HSURNYXAiKTsKICAgICAgICBpZiAoY2lkVG9HaWRNYXAgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC5uYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC50b1N0cmluZygpKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgaGFzaC51cGRhdGUoY2lkVG9HaWRNYXAucGVla0J5dGVzKCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgZGVzY3JpcHRvciwKICAgICAgZGljdCwKICAgICAgYmFzZURpY3QsCiAgICAgIGNvbXBvc2l0ZSwKICAgICAgdHlwZTogdHlwZS5uYW1lLAogICAgICBmaXJzdENoYXIsCiAgICAgIGxhc3RDaGFyLAogICAgICB0b1VuaWNvZGUsCiAgICAgIGhhc2g6IGhhc2ggPyBoYXNoLmhleGRpZ2VzdCgpIDogIiIKICAgIH07CiAgfQogIGFzeW5jIHRyYW5zbGF0ZUZvbnQoewogICAgZGVzY3JpcHRvciwKICAgIGRpY3QsCiAgICBiYXNlRGljdCwKICAgIGNvbXBvc2l0ZSwKICAgIHR5cGUsCiAgICBmaXJzdENoYXIsCiAgICBsYXN0Q2hhciwKICAgIHRvVW5pY29kZSwKICAgIGNzc0ZvbnRJbmZvCiAgfSkgewogICAgY29uc3QgaXNUeXBlM0ZvbnQgPSB0eXBlID09PSAiVHlwZTMiOwogICAgaWYgKCFkZXNjcmlwdG9yKSB7CiAgICAgIGlmIChpc1R5cGUzRm9udCkgewogICAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGRpY3QuZ2V0QXJyYXkoIkZvbnRCQm94IiksIFswLCAwLCAwLCAwXSk7CiAgICAgICAgZGVzY3JpcHRvciA9IG5ldyBEaWN0KG51bGwpOwogICAgICAgIGRlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIE5hbWUuZ2V0KHR5cGUpKTsKICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udEJCb3giLCBiYm94KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgYmFzZUZvbnROYW1lID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICAgICAgaWYgKCEoYmFzZUZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiQmFzZSBmb250IGlzIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICB9CiAgICAgICAgYmFzZUZvbnROYW1lID0gYmFzZUZvbnROYW1lLm5hbWUucmVwbGFjZUFsbCgvWyxfXS9nLCAiLSIpOwogICAgICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLmdldEJhc2VGb250TWV0cmljcyhiYXNlRm9udE5hbWUpOwogICAgICAgIGNvbnN0IGZvbnROYW1lV29TdHlsZSA9IGJhc2VGb250TmFtZS5zcGxpdCgiLSIsIDEpWzBdOwogICAgICAgIGNvbnN0IGZsYWdzID0gKHRoaXMuaXNTZXJpZkZvbnQoZm9udE5hbWVXb1N0eWxlKSA/IEZvbnRGbGFncy5TZXJpZiA6IDApIHwgKG1ldHJpY3MubW9ub3NwYWNlID8gRm9udEZsYWdzLk
20ZpeGVkUGl0Y2ggOiAwKSB8IChnZXRTeW1ib2xzRm9udHMoKVtmb250TmFtZVdvU3R5bGVdID8gRm9udEZsYWdzLlN5bWJvbGljIDogRm9udEZsYWdzLk5vbnN5bWJvbGljKTsKICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gewogICAgICAgICAgdHlwZSwKICAgICAgICAgIG5hbWU6IGJhc2VGb250TmFtZSwKICAgICAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgICAgICBzeXN0ZW1Gb250SW5mbzogbnVsbCwKICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsCiAgICAgICAgICBkZWZhdWx0V2lkdGg6IG1ldHJpY3MuZGVmYXVsdFdpZHRoLAogICAgICAgICAgaXNTaW11bGF0ZWRGbGFnczogdHJ1ZSwKICAgICAgICAgIGZsYWdzLAogICAgICAgICAgZmlyc3RDaGFyLAogICAgICAgICAgbGFzdENoYXIsCiAgICAgICAgICB0b1VuaWNvZGUsCiAgICAgICAgICB4SGVpZ2h0OiAwLAogICAgICAgICAgY2FwSGVpZ2h0OiAwLAogICAgICAgICAgaXRhbGljQW5nbGU6IDAsCiAgICAgICAgICBpc1R5cGUzRm9udAogICAgICAgIH07CiAgICAgICAgY29uc3Qgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpOwogICAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSBnZXRTdGFuZGFyZEZvbnROYW1lKGJhc2VGb250TmFtZSk7CiAgICAgICAgbGV0IGZpbGUgPSBudWxsOwogICAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgICBmaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250ID0gISFmaWxlOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLnN5c3RlbUZvbnRJbmZvID0gZ2V0Rm9udFN1YnN0aXR1dGlvbih0aGlzLnN5c3RlbUZvbnRDYWNoZSwgdGhpcy5pZEZhY3RvcnksIHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLCBiYXNlRm9udE5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5leHRyYWN0RGF0YVN0cnVjdHVyZXMoZGljdCwgcHJvcGVydGllcyk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBbXTsKICAgICAgICAgIGxldCBqID0gZmlyc3RDaGFyOwogICAgICAgICAgZm9yIChjb25zdCB3IG9mIHdpZHRocykgewogICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHcpOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGdseXBoV2lkdGhzW2pdID0gd2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaisrOwogICAgICAgICAgfQogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRoczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSB0aGlzLmJ1aWxkQ2hhckNvZGVUb1dpZHRoKG1ldHJpY3Mud2lkdGhzLCBuZXdQcm9wZXJ0aWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBGb250KGJhc2VGb250TmFtZSwgZmlsZSwgbmV3UHJvcGVydGllcyk7CiAgICAgIH0KICAgIH0KICAgIGxldCBmb250TmFtZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250TmFtZSIpOwogICAgbGV0IGJhc2VGb250ID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICBpZiAodHlwZW9mIGZvbnROYW1lID09PSAic3RyaW5nIikgewogICAgICBmb250TmFtZSA9IE5hbWUuZ2V0KGZvbnROYW1lKTsKICAgIH0KICAgIGlmICh0eXBlb2YgYmFzZUZvbnQgPT09ICJzdHJpbmciKSB7CiAgICAgIGJhc2VGb250ID0gTmFtZS5nZXQoYmFzZUZvbnQpOwogICAgfQogICAgY29uc3QgZm9udE5hbWVTdHIgPSBmb250TmFtZT8ubmFtZTsKICAgIGNvbnN0IGJhc2VGb250U3RyID0gYmFzZUZvbnQ/Lm5hbWU7CiAgICBpZiAoIWlzVHlwZTNGb250ICYmIGZvbnROYW1lU3RyICE9PSBiYXNlRm9udFN0cikgewogICAgICBpbmZvKGBUaGUgRm9udERlc2NyaXB0b3IncyBGb250TmFtZSBpcyAiJHtmb250TmFtZVN0cn0iIGJ1dCBgICsgYHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRm9udCdzIEJhc2VGb250ICIke2Jhc2VGb250U3RyfSIuYCk7CiAgICAgIGlmIChmb250TmFtZVN0ciAmJiBiYXNlRm9udFN0ciAmJiAoYmFzZUZvbnRTdHIuc3RhcnRzV2l0aChmb250TmFtZVN0cikgfHwgIWlzS25vd25Gb250TmFtZShmb250TmFtZVN0cikgJiYgaXNLbm93bkZvbnROYW1lKGJhc2VGb250U3RyKSkpIHsKICAgICAgICBmb250TmFtZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGZvbnROYW1lIHx8PSBiYXNlRm9udDsKICAgIGlmICghKGZvbnROYW1lIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgbmFtZSIpOwogICAgfQogICAgbGV0IGZvbnRGaWxlLCBzdWJ0eXBlLCBsZW5ndGgxLCBsZW5ndGgyLCBsZW5ndGgzOwogICAgdHJ5IHsKICAgICAgZm9udEZpbGUgPSBkZXNjcmlwdG9yLmdldCgiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpOwogICAgICBpZiAoZm9udEZpbGUpIHsKICAgICAgICBpZiAoIShmb250RmlsZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkZvbnRGaWxlIHNob3VsZCBiZSBhIHN0cmVhbSIpOwogICAgICAgIH0gZWxzZSBpZiAoZm9udEZpbGUuaXNFbXB0eSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJGb250RmlsZSBpcyBlbXB0eSIpOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgd2FybihgdHJhbnNsYXRlRm9udCAtIGZldGNoaW5nICIke2ZvbnROYW1lLm5hbWV9IiBmb250IGZpbGU6ICIke2V4fSIuYCk7CiAgICAgIGZvbnRGaWxlID0gbnVsbDsKICAgIH0KICAgIGxldCBpc0ludGVybmFsRm9udCA9IGZhbHNlOwogICAgbGV0IGdseXBoU2NhbGVGYWN0b3JzID0gbnVsbDsKICAgIGxldCBzeXN0ZW1Gb250SW5mbyA9IG51bGw7CiAgICBpZiAoZm9udEZpbGUpIHsKICAgICAgaWYgKGZvbnRGaWxlLmRpY3Q
20pIHsKICAgICAgICBjb25zdCBzdWJ0eXBlRW50cnkgPSBmb250RmlsZS5kaWN0LmdldCgiU3VidHlwZSIpOwogICAgICAgIGlmIChzdWJ0eXBlRW50cnkgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICBzdWJ0eXBlID0gc3VidHlwZUVudHJ5Lm5hbWU7CiAgICAgICAgfQogICAgICAgIGxlbmd0aDEgPSBmb250RmlsZS5kaWN0LmdldCgiTGVuZ3RoMSIpOwogICAgICAgIGxlbmd0aDIgPSBmb250RmlsZS5kaWN0LmdldCgiTGVuZ3RoMiIpOwogICAgICAgIGxlbmd0aDMgPSBmb250RmlsZS5kaWN0LmdldCgiTGVuZ3RoMyIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNzc0ZvbnRJbmZvKSB7CiAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSBnZXRYZmFGb250TmFtZShmb250TmFtZS5uYW1lKTsKICAgICAgaWYgKHN0YW5kYXJkRm9udE5hbWUpIHsKICAgICAgICBjc3NGb250SW5mby5mb250RmFtaWx5ID0gYCR7Y3NzRm9udEluZm8uZm9udEZhbWlseX0tUGRmSlMtWEZBYDsKICAgICAgICBjc3NGb250SW5mby5tZXRyaWNzID0gc3RhbmRhcmRGb250TmFtZS5tZXRyaWNzIHx8IG51bGw7CiAgICAgICAgZ2x5cGhTY2FsZUZhY3RvcnMgPSBzdGFuZGFyZEZvbnROYW1lLmZhY3RvcnMgfHwgbnVsbDsKICAgICAgICBmb250RmlsZSA9IGF3YWl0IHRoaXMuZmV0Y2hTdGFuZGFyZEZvbnREYXRhKHN0YW5kYXJkRm9udE5hbWUubmFtZSk7CiAgICAgICAgaXNJbnRlcm5hbEZvbnQgPSAhIWZvbnRGaWxlOwogICAgICAgIGJhc2VEaWN0ID0gZGljdCA9IGdldFhmYUZvbnREaWN0KGZvbnROYW1lLm5hbWUpOwogICAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIWlzVHlwZTNGb250KSB7CiAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSBnZXRTdGFuZGFyZEZvbnROYW1lKGZvbnROYW1lLm5hbWUpOwogICAgICBpZiAoc3RhbmRhcmRGb250TmFtZSkgewogICAgICAgIGZvbnRGaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgaXNJbnRlcm5hbEZvbnQgPSAhIWZvbnRGaWxlOwogICAgICB9CiAgICAgIGlmICghaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgc3lzdGVtRm9udEluZm8gPSBnZXRGb250U3Vic3RpdHV0aW9uKHRoaXMuc3lzdGVtRm9udENhY2hlLCB0aGlzLmlkRmFjdG9yeSwgdGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmwsIGZvbnROYW1lLm5hbWUsIHN0YW5kYXJkRm9udE5hbWUsIHR5cGUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBmb250TWF0cml4ID0gbG9va3VwTWF0cml4KGRpY3QuZ2V0QXJyYXkoIkZvbnRNYXRyaXgiKSwgRk9OVF9JREVOVElUWV9NQVRSSVgpOwogICAgY29uc3QgYmJveCA9IGxvb2t1cE5vcm1hbFJlY3QoZGVzY3JpcHRvci
205nZXRBcnJheSgiRm9udEJCb3giKSB8fCBkaWN0LmdldEFycmF5KCJGb250QkJveCIpLCB1bmRlZmluZWQpOwogICAgbGV0IGFzY2VudCA9IGRlc2NyaXB0b3IuZ2V0KCJBc2NlbnQiKTsKICAgIGlmICh0eXBlb2YgYXNjZW50ICE9PSAibnVtYmVyIikgewogICAgICBhc2NlbnQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBsZXQgZGVzY2VudCA9IGRlc2NyaXB0b3IuZ2V0KCJEZXNjZW50Iik7CiAgICBpZiAodHlwZW9mIGRlc2NlbnQgIT09ICJudW1iZXIiKSB7CiAgICAgIGRlc2NlbnQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBsZXQgeEhlaWdodCA9IGRlc2NyaXB0b3IuZ2V0KCJYSGVpZ2h0Iik7CiAgICBpZiAodHlwZW9mIHhIZWlnaHQgIT09ICJudW1iZXIiKSB7CiAgICAgIHhIZWlnaHQgPSAwOwogICAgfQogICAgbGV0IGNhcEhlaWdodCA9IGRlc2NyaXB0b3IuZ2V0KCJDYXBIZWlnaHQiKTsKICAgIGlmICh0eXBlb2YgY2FwSGVpZ2h0ICE9PSAibnVtYmVyIikgewogICAgICBjYXBIZWlnaHQgPSAwOwogICAgfQogICAgbGV0IGZsYWdzID0gZGVzY3JpcHRvci5nZXQoIkZsYWdzIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmxhZ3MpKSB7CiAgICAgIGZsYWdzID0gMDsKICAgIH0KICAgIGxldCBpdGFsaWNBbmdsZSA9IGRlc2NyaXB0b3IuZ2V0KCJJdGFsaWNBbmdsZSIpOwogICAgaWYgKHR5cGVvZiBpdGFsaWNBbmdsZSAhPT0gIm51bWJlciIpIHsKICAgICAgaXRhbGljQW5nbGUgPSAwOwogICAgfQogICAgY29uc3QgcHJvcGVydGllcyA9IHsKICAgICAgdHlwZSwKICAgICAgbmFtZTogZm9udE5hbWUubmFtZSwKICAgICAgc3VidHlwZSwKICAgICAgZmlsZTogZm9udEZpbGUsCiAgICAgIGxlbmd0aDEsCiAgICAgIGxlbmd0aDIsCiAgICAgIGxlbmd0aDMsCiAgICAgIGlzSW50ZXJuYWxGb250LAogICAgICBsb2FkZWROYW1lOiBiYXNlRGljdC5sb2FkZWROYW1lLAogICAgICBjb21wb3NpdGUsCiAgICAgIGZpeGVkUGl0Y2g6IGZhbHNlLAogICAgICBmb250TWF0cml4LAogICAgICBmaXJzdENoYXIsCiAgICAgIGxhc3RDaGFyLAogICAgICB0b1VuaWNvZGUsCiAgICAgIGJib3gsCiAgICAgIGFzY2VudCwKICAgICAgZGVzY2VudCwKICAgICAgeEhlaWdodCwKICAgICAgY2FwSGVpZ2h0LAogICAgICBmbGFncywKICAgICAgaXRhbGljQW5nbGUsCiAgICAgIGlzVHlwZTNGb250LAogICAgICBjc3NGb250SW5mbywKICAgICAgc2NhbGVGYWN0b3JzOiBnbHlwaFNjYWxlRmFjdG9ycywKICAgICAgc3lzdGVtRm9udEluZm8KICAgIH07CiAgICBpZiAoY29tcG9zaXRlKSB7CiAgICAgIGNvbnN0IGNpZEVuY29kaW5nID0gYmFzZURpY3QuZ2V0KCJFbmNvZGluZyIpOwogICAgICBpZiAoY2lkRW5jb2RpbmcgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgcHJvcGVydGllcy5jaWRFbmNvZGluZyA9IGNpZEVuY29kaW5nLm5hbWU7CiAgICAgIH0KICAgICAgY29uc3QgY01hcCA9IGF3YWl0IENNYXBGYWN0b3J5LmNyZWF0ZSh7CiAgICAgICAgZW5jb2Rpbmc6IGNpZEVuY29kaW5nLAogICAgICAgIGZldGNoQnVpbHRJbkNNYXA6IHRoaXMuX2ZldGNoQnVpbHRJbkNNYXBCb3VuZCwKICAgICAgICB1c2VDTWFwOiBudWxsCiAgICAgIH0pOwogICAgICBwcm9wZXJ0aWVzLmNNYXAgPSBjTWFwOwogICAgICBwcm9wZXJ0aWVzLnZlcnRpY2FsID0gcHJvcGVydGllcy5jTWFwLnZlcnRpY2FsOwogICAgfQogICAgY29uc3QgbmV3UHJvcGVydGllcyA9IGF3YWl0IHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIHByb3BlcnRpZXMpOwogICAgdGhpcy5leHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIG5ld1Byb3BlcnRpZXMpOwogICAgcmV0dXJuIG5ldyBGb250KGZvbnROYW1lLm5hbWUsIGZvbnRGaWxlLCBuZXdQcm9wZXJ0aWVzKTsKICB9CiAgc3RhdGljIGJ1aWxkRm9udFBhdGhzKGZvbnQsIGdseXBocywgaGFuZGxlciwgZXZhbHVhdG9yT3B0aW9ucykgewogICAgZnVuY3Rpb24gYnVpbGRQYXRoKGZvbnRDaGFyKSB7CiAgICAgIGNvbnN0IGdseXBoTmFtZSA9IGAke2ZvbnQubG9hZGVkTmFtZX1fcGF0aF8ke2ZvbnRDaGFyfWA7CiAgICAgIHRyeSB7CiAgICAgICAgaWYgKGZvbnQucmVuZGVyZXIuaGFzQnVpbHRQYXRoKGZvbnRDaGFyKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBoYW5kbGVyLnNlbmQoImNvbW1vbm9iaiIsIFtnbHlwaE5hbWUsICJGb250UGF0aCIsIGZvbnQucmVuZGVyZXIuZ2V0UGF0aEpzKGZvbnRDaGFyKV0pOwogICAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgICBpZiAoZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgIHdhcm4oYGJ1aWxkRm9udFBhdGhzIC0gaWdub3JpbmcgJHtnbHlwaE5hbWV9IGdseXBoOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgewogICAgICBidWlsZFBhdGgoZ2x5cGguZm9udENoYXIpOwogICAgICBjb25zdCBhY2NlbnQgPSBnbHlwaC5hY2NlbnQ7CiAgICAgIGlmIChhY2NlbnQ/LmZvbnRDaGFyKSB7CiAgICAgICAgYnVpbGRQYXRoKGFjY2VudC5mb250Q2hhcik7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGdldCBmYWxsYmFja0ZvbnREaWN0KCkgewogICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KCk7CiAgICBkaWN0LnNldCgiQmFzZUZvbnQiLCBOYW1lLmdldCgiSGVsdmV0aWNhIikpOwogICAgZGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOwogICAgZGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOwogICAgZGljdC5zZXQoIkVuY29kaW5nIiwgTmFtZS5nZXQoIldpbkFuc2lFbmNvZGluZyIpKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImZhbGxiYWNrRm9udERpY3QiLCBkaWN0KTsKICB9Cn0KY2xhc3MgVHJhbnNsYXRlZEZvbnQgewogIGNvbnN0cnVjdG9yKHsKICAgIGxvYWRlZE5hbWUsCiAgICBmb250LAogICAgZGljdCwKICAgIGV2YWx1YXRvck9wdGlvbnMKICB9KSB7CiAgICB0aGlzLmxvYWRlZE5hbWUgPSBsb2FkZWROYW1lOwogICAgdGhpcy5mb250ID0gZm9udDsKICAgIHRoaXMuZGljdCA9IGRpY3Q7CiAgICB0aGlzLl9ldmFsdWF0b3JPcHRpb25zID0gZXZhbHVhdG9yT3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7CiAgICB0aGlzLnR5cGUzTG9hZGVkID0gbnVsbDsKICAgIHRoaXMudHlwZTNEZXBlbmRlbmNpZXMgPSBmb250LmlzVHlwZTNGb250ID8gbmV3IFNldCgpIDogbnVsbDsKICAgIHRoaXMuc2VudCA9IGZhbHNlOwogIH0KICBzZW5kKGhhbmRsZXIpIHsKICAgIGlmICh0aGlzLnNlbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5zZW50ID0gdHJ1ZTsKICAgIGhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW3RoaXMubG9hZGVkTmFtZSwgIkZvbnQiLCB0aGlzLmZvbnQuZXhwb3J0RGF0YSh0aGlzLl9ldmFsdWF0b3JPcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMpXSk7CiAgfQogIGZhbGxiYWNrKGhhbmRsZXIpIHsKICAgIGlmICghdGhpcy5mb250LmRhdGEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5mb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CiAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKHRoaXMuZm9udCwgdGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXMsIGhhbmRsZXIsIHR
20oaXMuX2V2YWx1YXRvck9wdGlvbnMpOwogIH0KICBsb2FkVHlwZTNEYXRhKGV2YWx1YXRvciwgcmVzb3VyY2VzLCB0YXNrKSB7CiAgICBpZiAodGhpcy50eXBlM0xvYWRlZCkgewogICAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDsKICAgIH0KICAgIGlmICghdGhpcy5mb250LmlzVHlwZTNGb250KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CiAgICB9CiAgICBjb25zdCB0eXBlM0V2YWx1YXRvciA9IGV2YWx1YXRvci5jbG9uZSh7CiAgICAgIGlnbm9yZUVycm9yczogZmFsc2UKICAgIH0pOwogICAgY29uc3QgdHlwZTNGb250UmVmcyA9IG5ldyBSZWZTZXQoZXZhbHVhdG9yLnR5cGUzRm9udFJlZnMpOwogICAgaWYgKHRoaXMuZGljdC5vYmpJZCAmJiAhdHlwZTNGb250UmVmcy5oYXModGhpcy5kaWN0Lm9iaklkKSkgewogICAgICB0eXBlM0ZvbnRSZWZzLnB1dCh0aGlzLmRpY3Qub2JqSWQpOwogICAgfQogICAgdHlwZTNFdmFsdWF0b3IudHlwZTNGb250UmVmcyA9IHR5cGUzRm9udFJlZnM7CiAgICBjb25zdCB0cmFuc2xhdGVkRm9udCA9IHRoaXMuZm9udCwKICAgICAgdHlwZTNEZXBlbmRlbmNpZXMgPSB0aGlzLnR5cGUzRGVwZW5kZW5jaWVzOwogICAgbGV0IGxvYWRDaGFyUHJvY3NQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICBjb25zdCBjaGFyUHJvY3MgPSB0aGlzLmRpY3QuZ2V0KCJDaGFyUHJvY3MiKTsKICAgIGNvbnN0IGZvbnRSZXNvdXJjZXMgPSB0aGlzLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXM7CiAgICBjb25zdCBjaGFyUHJvY09wZXJhdG9yTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCBmb250QkJveCA9IFV0aWwubm9ybWFsaXplUmVjdCh0cmFuc2xhdGVkRm9udC5iYm94IHx8IFswLCAwLCAwLCAwXSksCiAgICAgIHdpZHRoID0gZm9udEJCb3hbMl0gLSBmb250QkJveFswXSwKICAgICAgaGVpZ2h0ID0gZm9udEJCb3hbM10gLSBmb250QkJveFsxXTsKICAgIGNvbnN0IGZvbnRCQm94U2l6ZSA9IE1hdGguaHlwb3Qod2lkdGgsIGhlaWdodCk7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBjaGFyUHJvY3MuZ2V0S2V5cygpKSB7CiAgICAgIGxvYWRDaGFyUHJvY3NQcm9taXNlID0gbG9hZENoYXJQcm9jc1Byb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgY29uc3QgZ2x5cGhTdHJlYW0gPSBjaGFyUHJvY3MuZ2V0KGtleSk7CiAgICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgICAgIHJldHVybiB0eXBlM0V2YWx1YXRvci5nZXRPcGVyYXRvckxpc3QoewogICAgICAgICAgc3RyZWFtOiBnbHlwaFN0cmVhbSwKICAgICAgICAgIHRhc2ssCiAgICAgICAgICByZXNvdXJjZXM6IGZvbnRSZXNvdXJjZXMsCiAgICAgICAgICBvcGVyYXRvckxpc3QKICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgIGlmIChvcGVyYXRvckxpc3QuZm5BcnJheVswXSA9PT0gT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcykgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVUeXBlM0NvbG9yT3BlcmF0b3JzKG9wZXJhdG9yTGlzdCwgZm9udEJCb3hTaXplKTsKICAgICAgICAgIH0KICAgICAgICAgIGNoYXJQcm9jT3BlcmF0b3JMaXN0W2tleV0gPSBvcGVyYXRvckxpc3QuZ2V0SVIoKTsKICAgICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvcGVyYXRvckxpc3QuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICAgIHR5cGUzRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKICAgICAgICAgIH0KICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKGBUeXBlMyBmb250IHJlc291cmNlICIke2tleX0iIGlzIG5vdCBhdmFpbGFibGUuYCk7CiAgICAgICAgICBjb25zdCBkdW1teU9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgICAgICAgIGNoYXJQcm9jT3BlcmF0b3JMaXN0W2tleV0gPSBkdW1teU9wZXJhdG9yTGlzdC5nZXRJUigpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIHRoaXMudHlwZTNMb2FkZWQgPSBsb2FkQ2hhclByb2NzUHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgdHJhbnNsYXRlZEZvbnQuY2hhclByb2NPcGVyYXRvckxpc3QgPSBjaGFyUHJvY09wZXJhdG9yTGlzdDsKICAgICAgaWYgKHRoaXMuX2Jib3gpIHsKICAgICAgICB0cmFuc2xhdGVkRm9udC5pc0NoYXJCQm94ID0gdHJ1ZTsKICAgICAgICB0cmFuc2xhdGVkRm9udC5iYm94ID0gdGhpcy5fYmJveDsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDsKICB9CiAgX3JlbW92ZVR5cGUzQ29sb3JPcGVyYXRvcnMob3BlcmF0b3JMaXN0LCBmb250QkJveFNpemUgPSBOYU4pIHsKICAgIGNvbnN0IGNoYXJCQm94ID0gVXRpbC5ub3JtYWxpemVSZWN0KG9wZXJhdG9yTGlzdC5hcmdzQXJyYXlbMF0uc2xpY2UoMikpLAogICAgICB3aWR0aCA9IGNoYXJCQm94WzJdIC0gY2hhckJCb3hbMF0sCiAgICAgIGhlaWdodCA9IGNoYXJCQm94WzNdIC0gY2hhckJCb3hbMV07CiAgICBjb25zdCBjaGFyQkJveFNpemUgPSBNYXRoLmh5cG90KHdpZHRoLCBoZWlnaHQpOwogICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkgewogICAgICBvcGVyYXRvckxpc3QuZm5BcnJheS5zcGxpY2UoMCwgMSk7CiAgICAgIG9wZXJhdG9yTGlzdC5hcmdzQXJyYXkuc3BsaWNlKDAsIDEpOwogICAgfSBlbHNlIGlmIChmb250QkJveFNpemUgPT09IDAgfHwgTWF0aC5yb3VuZChjaGFyQkJveFNpemUgLyBmb250QkJveFNpemUpID49IDEwKSB7CiAgICAgIGlmICghdGhpcy5fYmJveCkgewogICAgICAgIHRoaXMuX2Jib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIH0KICAgICAgdGhpcy5fYmJveFswXSA9IE1hdGgubWluKHRoaXMuX2Jib3hbMF0sIGNoYXJCQm94WzBdKTsKICAgICAgdGhpcy5fYmJveFsxXSA9IE1hdGgubWluKHRoaXMuX2Jib3hbMV0sIGNoYXJCQm94WzFdKTsKICAgICAgdGhpcy5fYmJveFsyXSA9IE1hdGgubWF4KHRoaXMuX2Jib3hbMl0sIGNoYXJCQm94WzJdKTsKICAgICAgdGhpcy5fYmJveFszXSA9IE1hdGgubWF4KHRoaXMuX2Jib3hbM10sIGNoYXJCQm94WzNdKTsKICAgIH0KICAgIGxldCBpID0gMCwKICAgICAgaWkgPSBvcGVyYXRvckxpc3QubGVuZ3RoOwogICAgd2hpbGUgKGkgPCBpaSkgewogICAgICBzd2l0Y2ggKG9wZXJhdG9yTGlzdC5mbkFycmF5W2ldKSB7CiAgICAgICAgY2FzZSBPUFMuc2V0Q2hhcldpZHRoQW5kQm91bmRzOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ29sb3JTcGFjZToKICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ29sb3JTcGFjZToKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VDb2xvck46CiAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvck46CiAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlR3JheToKICAgICAgICBjYXNlIE9QUy5zZXRGaWxsR3JheToKICAgICAgICBjYXNlIE9QUy5zZXRTdHJva2VSR0JDb2xvcjoKICAgICAgICBjYXNlIE9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yOgogICAgICAgIGNhc2UgT1BTLnNldEZpbGxDTVlLQ29sb3I6CiAgICAgICAgY2FzZSBPUFMuc2hhZGluZ0ZpbGw6CiAgICAgICAgY2FzZSBPUFMuc2V0UmVuZGVyaW5nSW50ZW50OgogICAgICAgICAgb3BlcmF0b3JMaXN0LmZuQXJyYXkuc3BsaWNlKGksIDEpOwogICAgICAgICAgb3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICBpaS0tOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgY2FzZSBPUFMuc2V0R1N0YXRlOgogICAgICAgICAgY29uc3QgW2dTdGF0ZU9ial0gPSBvcGVyYXRvckxpc3QuYXJnc0FycmF
205W2ldOwogICAgICAgICAgbGV0IGogPSAwLAogICAgICAgICAgICBqaiA9IGdTdGF0ZU9iai5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoaiA8IGpqKSB7CiAgICAgICAgICAgIGNvbnN0IFtnU3RhdGVLZXldID0gZ1N0YXRlT2JqW2pdOwogICAgICAgICAgICBzd2l0Y2ggKGdTdGF0ZUtleSkgewogICAgICAgICAgICAgIGNhc2UgIlRSIjoKICAgICAgICAgICAgICBjYXNlICJUUjIiOgogICAgICAgICAgICAgIGNhc2UgIkhUIjoKICAgICAgICAgICAgICBjYXNlICJCRyI6CiAgICAgICAgICAgICAgY2FzZSAiQkcyIjoKICAgICAgICAgICAgICBjYXNlICJVQ1IiOgogICAgICAgICAgICAgIGNhc2UgIlVDUjIiOgogICAgICAgICAgICAgICAgZ1N0YXRlT2JqLnNwbGljZShqLCAxKTsKICAgICAgICAgICAgICAgIGpqLS07CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBqKys7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgfQp9CmNsYXNzIFN0YXRlTWFuYWdlciB7CiAgY29uc3RydWN0b3IoaW5pdGlhbFN0YXRlID0gbmV3IEV2YWxTdGF0ZSgpKSB7CiAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlOwogICAgdGhpcy5zdGF0ZVN0YWNrID0gW107CiAgfQogIHNhdmUoKSB7CiAgICBjb25zdCBvbGQgPSB0aGlzLnN0YXRlOwogICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2godGhpcy5zdGF0ZSk7CiAgICB0aGlzLnN0YXRlID0gb2xkLmNsb25lKCk7CiAgfQogIHJlc3RvcmUoKSB7CiAgICBjb25zdCBwcmV2ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpOwogICAgaWYgKHByZXYpIHsKICAgICAgdGhpcy5zdGF0ZSA9IHByZXY7CiAgICB9CiAgfQogIHRyYW5zZm9ybShhcmdzKSB7CiAgICB0aGlzLnN0YXRlLmN0bSA9IFV0aWwudHJhbnNmb3JtKHRoaXMuc3RhdGUuY3RtLCBhcmdzKTsKICB9Cn0KY2xhc3MgVGV4dFN0YXRlIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMuY3RtID0gbmV3IEZsb2F0MzJBcnJheShJREVOVElUWV9NQVRSSVgpOwogICAgdGhpcy5mb250TmFtZSA9IG51bGw7CiAgICB0aGlzLmZvbnRTaXplID0gMDsKICAgIHRoaXMubG9hZGVkTmFtZSA9IG51bGw7CiAgICB0aGlzLmZvbnQgPSBudWxsOwogICAgdGhpcy5mb250TWF0cml4ID0gRk9OVF9JREVOVElUWV9NQVRSSVg7CiAgICB0aGlzLnRleHRNYXRyaXggPSBJREVOVElUWV9NQVRSSVguc2xpY2UoKTsKICAgIHRoaXMudGV4dExpbmVNYXRyaXggPSBJREVOVElUWV9NQVRSSVguc2xpY2UoKTsKICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwOwogICAgdGhpcy53b3JkU3BhY2luZyA9IDA7CiAgICB0aGlzLmxlYWRpbmcgPSAwOwogICAgdGhpcy50ZXh0SFNjYWxlID0gMTsKICAgIHRoaXMudGV4dFJpc2UgPSAwOwogIH0KICBzZXRUZX
20h0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgIGNvbnN0IG0gPSB0aGlzLnRleHRNYXRyaXg7CiAgICBtWzBdID0gYTsKICAgIG1bMV0gPSBiOwogICAgbVsyXSA9IGM7CiAgICBtWzNdID0gZDsKICAgIG1bNF0gPSBlOwogICAgbVs1XSA9IGY7CiAgfQogIHNldFRleHRMaW5lTWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgIGNvbnN0IG0gPSB0aGlzLnRleHRMaW5lTWF0cml4OwogICAgbVswXSA9IGE7CiAgICBtWzFdID0gYjsKICAgIG1bMl0gPSBjOwogICAgbVszXSA9IGQ7CiAgICBtWzRdID0gZTsKICAgIG1bNV0gPSBmOwogIH0KICB0cmFuc2xhdGVUZXh0TWF0cml4KHgsIHkpIHsKICAgIGNvbnN0IG0gPSB0aGlzLnRleHRNYXRyaXg7CiAgICBtWzRdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07CiAgICBtWzVdID0gbVsxXSAqIHggKyBtWzNdICogeSArIG1bNV07CiAgfQogIHRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KHgsIHkpIHsKICAgIGNvbnN0IG0gPSB0aGlzLnRleHRMaW5lTWF0cml4OwogICAgbVs0XSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdOwogICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdOwogIH0KICBjYXJyaWFnZVJldHVybigpIHsKICAgIHRoaXMudHJhbnNsYXRlVGV4dExpbmVNYXRyaXgoMCwgLXRoaXMubGVhZGluZyk7CiAgICB0aGlzLnRleHRNYXRyaXggPSB0aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgfQogIGNsb25lKCkgewogICAgY29uc3QgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHRoaXMpOwogICAgY2xvbmUudGV4dE1hdHJpeCA9IHRoaXMudGV4dE1hdHJpeC5zbGljZSgpOwogICAgY2xvbmUudGV4dExpbmVNYXRyaXggPSB0aGlzLnRleHRMaW5lTWF0cml4LnNsaWNlKCk7CiAgICBjbG9uZS5mb250TWF0cml4ID0gdGhpcy5mb250TWF0cml4LnNsaWNlKCk7CiAgICByZXR1cm4gY2xvbmU7CiAgfQp9CmNsYXNzIEV2YWxTdGF0ZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmN0bSA9IG5ldyBGbG9hdDMyQXJyYXkoSURFTlRJVFlfTUFUUklYKTsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGUuRklMTDsKICAgIHRoaXMuX2ZpbGxDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CiAgICB0aGlzLl9zdHJva2VDb2xvclNwYWNlID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CiAgICB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IG51bGw7CiAgICB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gbnVsbDsKICB9CiAgZ2V0IGZpbGxDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX2ZpbGxDb2xvclNwYWNlOwogIH0KICBzZXQgZmlsbENvbG9yU3BhY2UoY29sb3JTcGFjZSkgewogICAgdGhpcy5fZmlsbENvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5GaWxsQ29sb3JTcGFjZSA9IGNvbG9yU3BhY2U7CiAgfQogIGdldCBzdHJva2VDb2xvclNwYWNlKCkgewogICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2U7CiAgfQogIHNldCBzdHJva2VDb2xvclNwYWNlKGNvbG9yU3BhY2UpIHsKICAgIHRoaXMuX3N0cm9rZUNvbG9yU3BhY2UgPSB0aGlzLnBhdHRlcm5TdHJva2VDb2xvclNwYWNlID0gY29sb3JTcGFjZTsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKICB9Cn0KY2xhc3MgRXZhbHVhdG9yUHJlcHJvY2Vzc29yIHsKICBzdGF0aWMgZ2V0IG9wTWFwKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3BNYXAiLCBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsKICAgICAgdzogewogICAgICAgIGlkOiBPUFMuc2V0TGluZVdpZHRoLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBKOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRMaW5lQ2FwLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBqOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRMaW5lSm9pbiwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgTTogewogICAgICAgIGlkOiBPUFMuc2V0TWl0ZXJMaW1pdCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgZDogewogICAgICAgIGlkOiBPUFMuc2V0RGFzaCwKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgcmk6IHsKICAgICAgICBpZDogT1BTLnNldFJlbmRlcmluZ0ludGVudCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgaTogewogICAgICAgIGlkOiBPUFMuc2V0RmxhdG5lc3MsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGdzOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRHU3RhdGUsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIHE6IHsKICAgICAgICBpZDogT1BTLnNhdmUsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFE6IHsKICAgICAgICBpZDogT1BTLnJlc3RvcmUsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGNtOiB7CiAgICAgICAgaWQ6IE9QUy50cmFuc2Zvcm0sCiAgICAgICAgbnVtQXJnczogNiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIG06IHsKICAgICAgICBpZDogT1BTLm1vdmVUbywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgbDogewogICAgICAgIGlkOiBPUFMubGluZVRvLAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBjOiB7CiAgICAgICAgaWQ6IE9QUy5jdXJ2ZVRvLAogICAgICAgIG51bUFyZ3M6IDYsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICB2OiB7CiAgICAgICAgaWQ6IE9QUy5jdXJ2ZVRvMiwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgeTogewogICAgICAgIGlkOiBPUFMuY3VydmVUbzMsCiAgICAgICAgbnVtQXJnczogNCwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGg6IHsKICAgICAgICBpZDogT1BTLmNsb3NlUGF0aCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgcmU6IHsKICAgICAgICBpZDogT1BTLnJlY3RhbmdsZSwKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgUzogewogICAgICAgIGlkOiBPUFMuc3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBzOiB7CiAgICAgICAgaWQ6IE9QUy5jbG9zZVN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgZjogewogICAgICAgIGlkOiBPUFMuZmlsbCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgRjogewogICAgICAgIGlkOiBPUFMuZmlsbCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgImYqIjogewogICAgICAgIGlkOiBPUFMuZW9GaWxsLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCOiB7CiAgICAgICAgaWQ6IE9QUy5maWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiQioiOiB7CiAgICAgICAgaWQ6IE9QUy5lb0ZpbGxTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGI6IHsKICAgICAgICBpZDogT1BTLmNsb3NlRmlsbFN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgImIqIjogewogICAgICAgIGlkOiBPUFMuY2xvc2VFT0ZpbGxTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIG46IHsKICAgICAgICBpZDogT1BTLmVuZFBhdGgsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFc6IHsKICAgICAgICBpZDogT1BTLmNsaXAsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICJXKiI6IHsKICAgICAgICBpZDogT1BTLmVvQ2xpcCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQlQ6IHsKICAgICAgICBpZDogT1BTLmJlZ2luVGV4dCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgRVQ6IHsKICAgICAgICBpZDogT1BTLmVuZFRleHQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRjOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRDaGFyU3BhY2luZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVHc6IHsKICAgICAgICBpZDogT1BTLnNldFdvcmRTcGFjaW5nLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUejogewogICAgICAgIGlkOiBPUFMuc2V0SFNjYWxlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUTDogewogICAgICAgIGlkOiBPUFMuc2V0TGVhZGluZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVGY6IHsKICAgICAgICBpZDogT1BTLnNldEZvbnQsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRyOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVHM6IHsKICAgICAgICBpZDogT1BTLnNldFRleHRSaXNlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUZDogewogICAgICAgIGlkOiBPUFMubW92ZVRleHQsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFREOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRMZWFkaW5nTW92ZVRleHQsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFRtOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRUZXh0TWF0cml4LAogICAgICAgIG51bUFyZ3M6IDYsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICAiVCoiOiB7CiAgICAgICAgaWQ6IE9QUy5uZXh0TGluZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgVGo6IHsKICAgICAgICBpZDogT1BTLnNob3dUZXh0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBUSjogewogICAgICAgIGlkOiBPUFMuc2hvd1NwYWNlZFRleHQsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgICInIjogewogICAgICAgIGlkOiBPUFMubmV4dExpbmVTaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgJyInOiB7CiAgICAgICAgaWQ6IE9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAzLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgZDA6IHsKICAgICAgICBpZDogT1BTLnNldENoYXJXaWR0aCwKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgZDE6IHsKICAgICAgICBpZDogT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcywKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQ1M6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNvbG9yU3BhY2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIGNzOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGaWxsQ29sb3JTcGFjZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgU0M6IHsKICAgICAgICBpZDogT1BTLnNldFN0cm9rZUNvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH0sCiAgICAgIFNDTjogewogICAgICAgIGlkOiBPUFMuc2V0U3Ryb2tlQ29sb3JOLAogICAgICAgIG51bUFyZ3M6IDMzLAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9LAogICAgICBzYzogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH0sCiAgICAgIHNjbjogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbENvbG9yTiwKICAgICAgICBudW1BcmdzOiAzMywKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IHRydWUKICAgICAgfSwKICAgICAgRzogewogICAgICAgIGlkOiBPUFMuc2V0U3Ryb2tlR3JheSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgZzogewogICAgICAgIGlkOiBPUFMuc2V0RmlsbEdyYXksCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIFJHOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRTdHJva2VSR0JDb2xvciwKICAgICAgICBudW1BcmdzOiAzLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgcmc6IHsKICAgICAgICBpZDogT1BTLnNldEZpbGxSR0JDb2xvciwKICAgICAgICBudW1BcmdzOiAzLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgSzogewogICAgICAgIGlkOiBPUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBrOiB7CiAgICAgICAgaWQ6IE9QUy5zZXRGaWxsQ01ZS0NvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBzaDogewogICAgICAgIGlkOiBPUFMuc2hhZGluZ0ZpbGwsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJJOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpbklubGluZUltYWdlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBJRDogewogICAgICAgIGlkOiBPUFMuYmVnaW5JbWFnZURhdGEsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVJOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRJbmxpbmVJbWFnZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgRG86IHsKICAgICAgICBpZDogT1BTLnBhaW50WE9iamVjdCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgTVA6IHsKICAgICAgICBpZDogT1BTLm1hcmtQb2ludCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgRFA6IHsKICAgICAgICBpZDogT1BTLm1hcmtQb2ludFByb3BzLAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCTUM6IHsKICAgICAgICBpZDogT1BTLmJlZ2luTWFya2VkQ29udGVudCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgQkRDOiB7CiAgICAgICAgaWQ6IE9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfSwKICAgICAgRU1DOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRNYXJrZWRDb250ZW50LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9LAogICAgICBCWDogewogICAgICAgIGlkOiBPUFMuYmVnaW5Db21wYXQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2Y
20XJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEVYOiB7CiAgICAgICAgaWQ6IE9QUy5lbmRDb21wYXQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH0sCiAgICAgIEJNOiBudWxsLAogICAgICBCRDogbnVsbCwKICAgICAgdHJ1ZTogbnVsbCwKICAgICAgZmE6IG51bGwsCiAgICAgIGZhbDogbnVsbCwKICAgICAgZmFsczogbnVsbCwKICAgICAgZmFsc2U6IG51bGwsCiAgICAgIG51OiBudWxsLAogICAgICBudWw6IG51bGwsCiAgICAgIG51bGw6IG51bGwKICAgIH0pKTsKICB9CiAgc3RhdGljIE1BWF9JTlZBTElEX1BBVEhfT1BTID0gMTA7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIgPSBuZXcgU3RhdGVNYW5hZ2VyKCkpIHsKICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtLCBFdmFsdWF0b3JQcmVwcm9jZXNzb3Iub3BNYXApLAogICAgICB4cmVmCiAgICB9KTsKICAgIHRoaXMuc3RhdGVNYW5hZ2VyID0gc3RhdGVNYW5hZ2VyOwogICAgdGhpcy5ub25Qcm9jZXNzZWRBcmdzID0gW107CiAgICB0aGlzLl9pc1BhdGhPcCA9IGZhbHNlOwogICAgdGhpcy5fbnVtSW52YWxpZFBhdGhPUFMgPSAwOwogIH0KICBnZXQgc2F2ZWRTdGF0ZXNEZXB0aCgpIHsKICAgIHJldHVybiB0aGlzLnN0YXRlTWFuYWdlci5zdGF0ZVN0YWNrLmxlbmd0aDsKICB9CiAgcmVhZChvcGVyYXRpb24pIHsKICAgIGxldCBhcmdzID0gb3BlcmF0aW9uLmFyZ3M7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb25zdCBvYmogPSB0aGlzLnBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENtZCkgewogICAgICAgIGNvbnN0IGNtZCA9IG9iai5jbWQ7CiAgICAgICAgY29uc3Qgb3BTcGVjID0gRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwW2NtZF07CiAgICAgICAgaWYgKCFvcFNwZWMpIHsKICAgICAgICAgIHdhcm4oYFVua25vd24gY29tbWFuZCAiJHtjbWR9Ii5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBmbiA9IG9wU3BlYy5pZDsKICAgICAgICBjb25zdCBudW1BcmdzID0gb3BTcGVjLm51bUFyZ3M7CiAgICAgICAgbGV0IGFyZ3NMZW5ndGggPSBhcmdzICE9PSBudWxsID8gYXJncy5sZW5ndGggOiAwOwogICAgICAgIGlmICghdGhpcy5faXNQYXRoT3ApIHsKICAgICAgICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5faXNQYXRoT3AgPSBmbiA+PSBPUFMubW92ZVRvICYmIGZuIDw9IE9QUy5lbmRQYXRoOwogICAgICAgIGlmICghb3BTcGVjLnZhcmlhYmxlQXJncykgewogICAgICAgICAgaWYgKGFyZ3NMZW5ndGggIT09IG51bUFyZ3MpIHsKICAgICAgICAgICAgY29uc3Qgbm9uUHJvY2Vzc2VkQXJncyA9IHRoaXMubm9uUHJvY2Vzc2VkQXJnczsKICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGggPiBudW1BcmdzKSB7CiAgICAgICAgICAgICAgbm9uUHJvY2Vzc2VkQXJncy5wdXNoKGFyZ3Muc2hpZnQoKSk7CiAgICAgICAgICAgICAgYXJnc0xlbmd0aC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoIDwgbnVtQXJncyAmJiBub25Qcm9jZXNzZWRBcmdzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFyZ3MudW5zaGlmdChub25Qcm9jZXNzZWRBcmdzLnBvcCgpKTsKICAgICAgICAgICAgICBhcmdzTGVuZ3RoKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhcmdzTGVuZ3RoIDwgbnVtQXJncykgewogICAgICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gYGNvbW1hbmQgJHtjbWR9OiBleHBlY3RlZCAke251bUFyZ3N9IGFyZ3MsIGAgKyBgYnV0IHJlY2VpdmVkICR7YXJnc0xlbmd0aH0gYXJncy5gOwogICAgICAgICAgICBpZiAodGhpcy5faXNQYXRoT3AgJiYgKyt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA+IEV2YWx1YXRvclByZXByb2Nlc3Nvci5NQVhfSU5WQUxJRF9QQVRIX09QUykgewogICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCAke3BhcnRpYWxNc2d9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2FybihgU2tpcHBpbmcgJHtwYXJ0aWFsTXNnfWApOwogICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGFyZ3MubGVuZ3RoID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGFyZ3NMZW5ndGggPiBudW1BcmdzKSB7CiAgICAgICAgICBpbmZvKGBDb21tYW5kICR7Y21kfTogZXhwZWN0ZWQgWzAsICR7bnVtQXJnc31dIGFyZ3MsIGAgKyBgYnV0IHJlY2VpdmVkICR7YXJnc0xlbmd0aH0gYXJncy5gKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5wcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncyk7CiAgICAgICAgb3BlcmF0aW9uLmZuID0gZm47CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChvYmogPT09IEVPRikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAob2JqICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGFyZ3MgPT09IG51bGwpIHsKICAgICAgICAgIGFyZ3MgPSBbXTsKICAgICAgICB9CiAgICAgICAgYXJncy5wdXNoKG9iaik7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMzMpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHByZXByb2Nlc3NDb21tYW5kKGZuLCBhcmdzKSB7CiAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICBjYXNlIE9QUy5zYXZlOgogICAgICAgIHRoaXMuc3RhdGVNYW5hZ2VyLnNhdmUoKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBPUFMucmVzdG9yZToKICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5yZXN0b3JlKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgT1BTLnRyYW5zZm9ybToKICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci50cmFuc2Zvcm0oYXJncyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9kZWZhdWx0X2FwcGVhcmFuY2UuanMKCgoKCgoKCgoKCgoKCgoKY2xhc3MgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIobmV3IFN0cmluZ1N0cmVhbShzdHIpKTsKICB9CiAgcGFyc2UoKSB7CiAgICBjb25zdCBvcGVyYXRpb24gPSB7CiAgICAgIGZuOiAwLAogICAgICBhcmdzOiBbXQogICAgfTsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgZm9udFNpemU6I
20DAsCiAgICAgIGZvbnROYW1lOiAiIiwKICAgICAgZm9udENvbG9yOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMykKICAgIH07CiAgICB0cnkgewogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG9wZXJhdGlvbi5hcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgaWYgKCF0aGlzLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNhdmVkU3RhdGVzRGVwdGggIT09IDApIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB7CiAgICAgICAgICBmbiwKICAgICAgICAgIGFyZ3MKICAgICAgICB9ID0gb3BlcmF0aW9uOwogICAgICAgIHN3aXRjaCAoZm4gfCAwKSB7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGb250OgogICAgICAgICAgICBjb25zdCBbZm9udE5hbWUsIGZvbnRTaXplXSA9IGFyZ3M7CiAgICAgICAgICAgIGlmIChmb250TmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgICByZXN1bHQuZm9udE5hbWUgPSBmb250TmFtZS5uYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZm9udFNpemUgPT09ICJudW1iZXIiICYmIGZvbnRTaXplID4gMCkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250U2l6ZSA9IGZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbFJHQkNvbG9yOgogICAgICAgICAgICBDb2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbEdyYXk6CiAgICAgICAgICAgIENvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYkl0ZW0oYXJncywgMCwgcmVzdWx0LmZvbnRDb2xvciwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICAgICAgQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSAtIGlnbm9yaW5nIGVycm9yczogIiR7cmVhc29ufSIuYCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpmdW5jdGlvbiBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHN0cikgewogIHJldHVybiBuZXcgRGVmYXVsdEFwcGVhcmFuY2VFdmFsdWF0b3Ioc3RyKS5wYXJzZSgpOwp9CmNsYXNzIEFwcGVhcmFuY2VTdHJlYW1FdmFsdWF0b3IgZXh0ZW5kcyBFdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZikgewogICAgc3VwZXIoc3RyZWFtKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gZXZhbHVhdG9yT3B0aW9uczsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLnJlc291cmNlcyA9IHN0cmVhbS5kaWN0Py5nZXQoIlJlc291cmNlcyIpOwogIH0KICBwYXJzZSgpIHsKICAgIGNvbnN0IG9wZXJhdGlvbiA9IHsKICAgICAgZm46IDAsCiAgICAgIGFyZ3M6IFtdCiAgICB9OwogICAgbGV0IHJlc3VsdCA9IHsKICAgICAgc2NhbGVGYWN0b3I6IDEsCiAgICAgIGZvbnRTaXplOiAwLAogICAgICBmb250TmFtZTogIiIsCiAgICAgIGZvbnRDb2xvcjogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpLAogICAgICBmaWxsQ29sb3JTcGFjZTogQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkKICAgIH07CiAgICBsZXQgYnJlYWtMb29wID0gZmFsc2U7CiAgICBjb25zdCBzdGFjayA9IFtdOwogICAgdHJ5IHsKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBvcGVyYXRpb24uYXJncy5sZW5ndGggPSAwOwogICAgICAgIGlmIChicmVha0xvb3AgfHwgIXRoaXMucmVhZChvcGVyYXRpb24pKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29uc3QgewogICAgICAgICAgZm4sCiAgICAgICAgICBhcmdzCiAgICAgICAgfSA9IG9wZXJhdGlvbjsKICAgICAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICAgICAgY2FzZSBPUFMuc2F2ZToKICAgICAgICAgICAgc3RhY2sucHVzaCh7CiAgICAgICAgICAgICAgc2NhbGVGYWN0b3I6IHJlc3VsdC5zY2FsZUZhY3RvciwKICAgICAgICAgICAgICBmb250U2l6ZTogcmVzdWx0LmZvbnRTaXplLAogICAgICAgICAgICAgIGZvbnROYW1lOiByZXN1bHQuZm9udE5hbWUsCiAgICAgICAgICAgICAgZm9udENvbG9yOiByZXN1bHQuZm9udENvbG9yLnNsaWNlKCksCiAgICAgICAgICAgICAgZmlsbENvbG9yU3BhY2U6IHJlc3VsdC5maWxsQ29sb3JTcGFjZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5yZXN0b3JlOgogICAgICAgICAgICByZXN1bHQgPSBzdGFjay5wb3AoKSB8fCByZXN1bHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0VGV4dE1hdHJpeDoKICAgICAgICAgICAgcmVzdWx0LnNjYWxlRmFjdG9yICo9IE1hdGguaHlwb3QoYXJnc1swXSwgYXJnc1sxXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0Rm9udDoKICAgICAgICAgICAgY29uc3QgW2ZvbnROYW1lLCBmb250U2l6ZV0gPSBhcmdzOwogICAgICAgICAgICBpZiAoZm9udE5hbWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgcmVzdWx0LmZvbnROYW1lID0gZm9udE5hbWUubmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGZvbnRTaXplID09PSAibnVtYmVyIiAmJiBmb250U2l6ZSA+IDApIHsKICAgICAgICAgICAgICByZXN1bHQuZm9udFNpemUgPSBmb250U2l6ZSAqIHJlc3VsdC5zY2FsZUZhY3RvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNldEZpbGxDb2xvclNwYWNlOgogICAgICAgICAgICByZXN1bHQuZmlsbENvbG9yU3BhY2UgPSBDb2xvclNwYWNlLnBhcnNlKHsKICAgICAgICAgICAgICBjczogYXJnc1swXSwKICAgICAgICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICAgICAgICBwZGZGdW5jdGlvbkZhY3Rvcnk6IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZTogdGhpcy5fbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBPUFMuc2V0RmlsbENvbG9yOgogICAgICAgICAgICBjb25zdCBjcyA9IHJlc3VsdC5maWxsQ29sb3JTcGFjZTsKICAgICAgICAgICAgY3MuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgICAgIENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsR3JheToKICAgICAgICAgICAgQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIE9QUy5zZXRGaWxsQ01ZS0NvbG9yOgogICAgICAgICAgICBDb2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2JJdGVtKGFyZ3MsIDAsIHJlc3VsdC5mb250Q29sb3IsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgT1BTLnNob3dUZXh0OgogICAgICAgICAgY2FzZSBPUFMuc2hvd1NwYWNlZF
20RleHQ6CiAgICAgICAgICBjYXNlIE9QUy5uZXh0TGluZVNob3dUZXh0OgogICAgICAgICAgY2FzZSBPUFMubmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6CiAgICAgICAgICAgIGJyZWFrTG9vcCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHdhcm4oYHBhcnNlQXBwZWFyYW5jZVN0cmVhbSAtIGlnbm9yaW5nIGVycm9yczogIiR7cmVhc29ufSIuYCk7CiAgICB9CiAgICB0aGlzLnN0cmVhbS5yZXNldCgpOwogICAgZGVsZXRlIHJlc3VsdC5zY2FsZUZhY3RvcjsKICAgIGRlbGV0ZSByZXN1bHQuZmlsbENvbG9yU3BhY2U7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBnZXQgX2xvY2FsQ29sb3JTcGFjZUNhY2hlKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiX2xvY2FsQ29sb3JTcGFjZUNhY2hlIiwgbmV3IExvY2FsQ29sb3JTcGFjZUNhY2hlKCkpOwogIH0KICBnZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpIHsKICAgIGNvbnN0IHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBQREZGdW5jdGlvbkZhY3RvcnkoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5ldmFsdWF0b3JPcHRpb25zLmlzRXZhbFN1cHBvcnRlZAogICAgfSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJfcGRmRnVuY3Rpb25GYWN0b3J5IiwgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VBcHBlYXJhbmNlU3RyZWFtKHN0cmVhbSwgZXZhbHVhdG9yT3B0aW9ucywgeHJlZikgewogIHJldHVybiBuZXcgQXBwZWFyYW5jZVN0cmVhbUV2YWx1YXRvcihzdHJlYW0sIGV2YWx1YXRvck9wdGlvbnMsIHhyZWYpLnBhcnNlKCk7Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3IoY29sb3IsIGlzRmlsbCkgewogIGlmIChjb2xvclswXSA9PT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT09IGNvbG9yWzJdKSB7CiAgICBjb25zdCBncmF5ID0gY29sb3JbMF0gLyAyNTU7CiAgICByZXR1cm4gYCR7bnVtYmVyVG9TdHJpbmcoZ3JheSl9ICR7aXNGaWxsID8gImciIDogIkcifWA7CiAgfQogIHJldHVybiBBcnJheS5mcm9tKGNvbG9yLCBjID0+IG51bWJlclRvU3RyaW5nKGMgLyAyNTUpKS5qb2luKCIgIikgKyBgICR7aXNGaWxsID8gInJnIiA6ICJSRyJ9YDsKfQpmdW5jdGlvbiBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSh7CiAgZm9udFNpemUsCiAgZm9udE5hbWUsCiAgZm9udENvbG9yCn0pIHsKICByZXR1cm4gYC8ke2VzY2FwZVBERk5hbWUoZm9udE5hbWUpfSAke2ZvbnRTaXplfSBUZiAke2dldFBkZkNvbG9yKGZvbnRDb2xvciwgdHJ1ZSl9YDsKfQpjbGFzcyBGYWtlVW5pY29kZUZvbnQgewogIGNvbnN0cnVjdG9yKHhyZWYsIGZvbnRGYW1pbHkpIHsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLndpZHRocyA9IG51bGw7CiAgICB0aGlzLmZpcnN0Q2hhciA9IEluZmluaXR5OwogICAgdGhpcy5sYXN0Q2hhciA9IC1JbmZpbml0eTsKICAgIHRoaXMuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpOwogICAgdGhpcy5jdHhNZWFzdXJlID0gY2FudmFzLmdldENvbnRleHQoIjJkIiwgewogICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUKICAgIH0pOwogICAgaWYgKCFGYWtlVW5pY29kZUZvbnQuX2ZvbnROYW1lSWQpIHsKICAgICAgRmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkID0gMTsKICAgIH0KICAgIHRoaXMuZm9udE5hbWUgPSBOYW1lLmdldChgSW52YWxpZFBERmpzRm9udF8ke2ZvbnRGYW1pbHl9XyR7RmFrZVVuaWNvZGVGb250Ll9mb250TmFtZUlkKyt9YCk7CiAgfQogIGdldCBmb250RGVzY3JpcHRvclJlZigpIHsKICAgIGlmICghRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZikgewogICAgICBjb25zdCBmb250RGVzY3JpcHRvciA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJGb250RGVzY3JpcHRvciIpKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250TmFtZSIsIHRoaXMuZm9udE5hbWUpOwogICAgICBmb250RGVzY3JpcHRvci
205zZXQoIkZvbnRGYW1pbHkiLCAiTXlyaWFkUHJvIFJlZ3VsYXIiKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250QkJveCIsIFswLCAwLCAwLCAwXSk7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiRm9udFN0cmV0Y2giLCBOYW1lLmdldCgiTm9ybWFsIikpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRXZWlnaHQiLCA0MDApOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkl0YWxpY0FuZ2xlIiwgMCk7CiAgICAgIEZha2VVbmljb2RlRm9udC5fZm9udERlc2NyaXB0b3JSZWYgPSB0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihmb250RGVzY3JpcHRvcik7CiAgICB9CiAgICByZXR1cm4gRmFrZVVuaWNvZGVGb250Ll9mb250RGVzY3JpcHRvclJlZjsKICB9CiAgZ2V0IGRlc2NlbmRhbnRGb250UmVmKCkgewogICAgY29uc3QgZGVzY2VuZGFudEZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJCYXNlRm9udCIsIHRoaXMuZm9udE5hbWUpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZvbnQiKSk7CiAgICBkZXNjZW5kYW50Rm9udC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiQ0lERm9udFR5cGUwIikpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURUb0dJRE1hcCIsIE5hbWUuZ2V0KCJJZGVudGl0eSIpKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiRmlyc3RDaGFyIiwgdGhpcy5maXJzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJMYXN0Q2hhciIsIHRoaXMubGFzdENoYXIpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJGb250RGVzY3JpcHRvciIsIHRoaXMuZm9udERlc2NyaXB0b3JSZWYpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJEVyIsIDEwMDApOwogICAgY29uc3Qgd2lkdGhzID0gW107CiAgICBjb25zdCBjaGFycyA9IFsuLi50aGlzLndpZHRocy5lbnRyaWVzKCldLnNvcnQoKTsKICAgIGxldCBjdXJyZW50Q2hhciA9IG51bGw7CiAgICBsZXQgY3VycmVudFdpZHRocyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IFtjaGFyLCB3aWR0aF0gb2YgY2hhcnMpIHsKICAgICAgaWYgKCFjdXJyZW50Q2hhcikgewogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoY2hhciA9PT0gY3VycmVudENoYXIgKyBjdXJyZW50V2lkdGhzLmxlbmd0aCkgewogICAgICAgIGN1cnJlbnRXaWR0aHMucHVzaCh3aWR0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgd2lkdGhzLnB1c2goY3VycmVudENoYXIsIGN1cnJlbnRXaWR0aHMpOwogICAgICAgIGN1cnJlbnRDaGFyID0gY2hhcjsKICAgICAgICBjdXJyZW50V2lkdGhzID0gW3dpZHRoXTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRDaGFyKSB7CiAgICAgIHdpZHRocy5wdXNoKGN1cnJlbnRDaGFyLCBjdXJyZW50V2lkdGhzKTsKICAgIH0KICAgIGRlc2NlbmRhbnRGb250LnNldCgiVyIsIHdpZHRocyk7CiAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNpZFN5c3RlbUluZm8uc2V0KCJPcmRlcmluZyIsICJJZGVudGl0eSIpOwogICAgY2lkU3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgICBjaWRTeXN0ZW1JbmZvLnNldCgiU3VwcGxlbWVudCIsIDApOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJDSURTeXN0ZW1JbmZvIiwgY2lkU3lzdGVtSW5mbyk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoZGVzY2VuZGFudEZvbnQpOwogIH0KICBnZXQgYmFzZUZvbnRSZWYoKSB7CiAgICBjb25zdCBiYXNlRm9udCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICBiYXNlRm9udC5zZXQoIkJhc2VGb250IiwgdGhpcy5mb250TmFtZSk7CiAgICBiYXNlRm9udC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRm9udCIpKTsKICAgIGJhc2VGb250LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJUeXBlMCIpKTsKICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBOYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICAgIGJhc2VGb250LnNldCgiRGVzY2VuZGFudEZvbnRzIiwgW3RoaXMuZGVzY2VuZGFudEZvbnRSZWZdKTsKICAgIGJhc2VGb250LnNldCgiVG9Vbmljb2RlIiwgTmFtZS5nZXQoIklkZW50aXR5LUgiKSk7CiAgICByZXR1cm4gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoYmFzZUZvbnQpOwogIH0KICBnZXQgcmVzb3VyY2VzKCkgewogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgZm9udC5zZXQodGhpcy5mb250TmFtZS5uYW1lLCB0aGlzLmJhc2VGb250UmVmKTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIHJldHVybiByZXNvdXJjZXM7CiAgfQogIF9jcmVhdGVDb250ZXh0KCkgewogICAgdGhpcy53aWR0aHMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLmN0eE1lYXN1cmUuZm9udCA9IGAxMDAwcHggJHt0aGlzLmZvbnRGYW1pbHl9YDsKICAgIHJldHVybiB0aGlzLmN0eE1lYXN1cmU7CiAgfQogIGNyZWF0ZUZvbnRSZXNvdXJjZXModGV4dCkgewogICAgY29uc3QgY3R4ID0gdGhpcy5fY3JlYXRlQ29udGV4dCgpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTsKICAgICAgICBpZiAodGhpcy53aWR0aHMuaGFzKGNvZGUpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChjaGFyKTsKICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICB0aGlzLndpZHRocy5zZXQoY29kZSwgd2lkdGgpOwogICAgICAgIHRoaXMuZmlyc3RDaGFyID0gTWF0aC5taW4oY29kZSwgdGhpcy5maXJzdENoYXIpOwogICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzOwogIH0KICBzdGF0aWMgZ2V0Rmlyc3RQb3NpdGlvbkluZm8ocmVjdCwgcm90YXRpb24sIGZvbnRTaXplKSB7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDsKICAgIGxldCB3ID0geDIgLSB4MTsKICAgIGxldCBoID0geTIgLSB5MTsKICAgIGlmIChyb3RhdGlvbiAlIDE4MCAhPT0gMCkgewogICAgICBbdywgaF0gPSBbaCwgd107CiAgICB9CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTElORV9GQUNUT1IgKiBmb250U2l6ZTsKICAgIGNvbnN0IGxpbmVEZXNjZW50ID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAqIGZvb
20nRTaXplOwogICAgcmV0dXJuIHsKICAgICAgY29vcmRzOiBbMCwgaCArIGxpbmVEZXNjZW50IC0gbGluZUhlaWdodF0sCiAgICAgIGJib3g6IFswLCAwLCB3LCBoXSwKICAgICAgbWF0cml4OiByb3RhdGlvbiAhPT0gMCA/IGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCBoLCBsaW5lSGVpZ2h0KSA6IHVuZGVmaW5lZAogICAgfTsKICB9CiAgY3JlYXRlQXBwZWFyYW5jZSh0ZXh0LCByZWN0LCByb3RhdGlvbiwgZm9udFNpemUsIGJnQ29sb3IsIHN0cm9rZUFscGhhKSB7CiAgICBjb25zdCBjdHggPSB0aGlzLl9jcmVhdGVDb250ZXh0KCk7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgbGV0IG1heFdpZHRoID0gLUluZmluaXR5OwogICAgZm9yIChjb25zdCBsaW5lIG9mIHRleHQuc3BsaXQoL1xyXG4/fFxuLykpIHsKICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgY29uc3QgbGluZVdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxpbmUpLndpZHRoOwogICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBsaW5lV2lkdGgpOwogICAgICBmb3IgKGNvbnN0IGNvZGUgb2YgY29kZVBvaW50SXRlcihsaW5lKSkgewogICAgICAgIGNvbnN0IGNoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlKTsKICAgICAgICBsZXQgd2lkdGggPSB0aGlzLndpZHRocy5nZXQoY29kZSk7CiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoY2hhcik7CiAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICAgIHRoaXMud2lkdGhzLnNldChjb2RlLCB3aWR0aCk7CiAgICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IE1hdGgubWluKGNvZGUsIHRoaXMuZmlyc3RDaGFyKTsKICAgICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1heFdpZHRoICo9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKG1heFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gbWF4V2lkdGg7CiAgICB9CiAgICBsZXQgdnNjYWxlID0gMTsKICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBMSU5FX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgY29uc3QgbGluZURlc2NlbnQgPSBMSU5FX0RFU0NFTlRfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBtYXhIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKG1heEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIG1heEhlaWdodDsKICAgIH0KICAgIGNvbnN0IGZzY2FsZSA9IE1hdGgubWluKGhzY2FsZSwgdnNjYWxlKTsKICAgIGNvbnN0IG5ld0ZvbnRTaXplID0gZm9udFNpemUgKiBmc2NhbGU7CiAgICBjb25zdCBidWZmZXIgPSBbInEiLCBgMCAwICR7bnVtYmVyVG9TdHJpbmcodyl9ICR7bnVtYmVyVG9TdHJpbmcoaCl9IHJlIFcgbmAsIGBCVGAsIGAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoICsgbGluZURlc2NlbnQpfSBUbSAwIFRjICR7Z2V0UGRmQ29sb3IoYmdDb2xvciwgdHJ1ZSl9YCwgYC8ke3RoaXMuZm9udE5hbWUubmFtZX0gJHtudW1iZXJUb1N0cmluZyhuZXdGb250U2l6ZSl9IFRmYF07CiAgICBjb25zdCB7CiAgICAgIHJlc291cmNlcwogICAgfSA9IHRoaXM7CiAgICBzdHJva2VBbHBoYSA9IHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIgJiYgc3Ryb2tlQWxwaGEgPj0gMCAmJiBzdHJva2VBbHBoYSA8PSAxID8gc3Ryb2tlQWxwaGEgOiAxOwogICAgaWYgKHN0cm9rZUFscGhhICE9PSAxKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCIvUjAgZ3MiKTsKICAgICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgY29uc3QgcjAgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgICByMC5zZXQoImNhIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIkNBIiwgc3Ryb2tlQWxwaGEpOwogICAgICByMC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgICBleHRHU3RhdGUuc2V0KCJSMCIsIHIwKTsKICAgICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgZXh0R1N0YXRlKTsKICAgIH0KICAgIGNvbnN0IHZTaGlmdCA9IG51bWJlclRvU3RyaW5nKGxpbmVIZWlnaHQpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwIC0ke3ZTaGlmdH0gVGQgPCR7c3RyaW5nVG9VVEYxNkhleFN0cmluZyhsaW5lKX0+IFRqYCk7CiAgICB9CiAgICBidWZmZXIucHVzaCgiRVQiLCAiUSIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh0aGlzLnhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIFswLCAwLCB3LCBoXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSBnZXRSb3RhdGlvbk1hdHJpeChyb3RhdGlvbiwgdywgaCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL25hbWVfbnVtYmVyX3RyZWUuanMKCgoKY2xhc3MgTmFtZU9yTnVtYmVyVHJlZSB7CiAgY29uc3RydWN0b3Iocm9vdCwgeHJlZiwgdHlwZSkgewogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLl90eXBlID0gdHlwZTsKICB9CiAgZ2V0QWxsKCkgewogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgaWYgKCF0aGlzLnJvb3QpIHsKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgUmVmU2V0KCk7CiAgICBwcm9jZXNzZWQucHV0KHRoaXMucm9vdCk7CiAgICBjb25zdCB
20xdWV1ZSA9IFt0aGlzLnJvb3RdOwogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3Qgb2JqID0geHJlZi5mZXRjaElmUmVmKHF1ZXVlLnNoaWZ0KCkpOwogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChvYmouaGFzKCJLaWRzIikpIHsKICAgICAgICBjb25zdCBraWRzID0gb2JqLmdldCgiS2lkcyIpOwogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGtpZCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBEdXBsaWNhdGUgZW50cnkgaW4gIiR7dGhpcy5fdHlwZX0iIHRyZWUuYCk7CiAgICAgICAgICB9CiAgICAgICAgICBxdWV1ZS5wdXNoKGtpZCk7CiAgICAgICAgICBwcm9jZXNzZWQucHV0KGtpZCk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGVudHJpZXMgPSBvYmouZ2V0KHRoaXMuX3R5cGUpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBtYXAuc2V0KHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW2ldKSwgeHJlZi5mZXRjaElmUmVmKGVudHJpZXNbaSArIDFdKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQogIGdldFJhdyhrZXkpIHsKICAgIGlmICghdGhpcy5yb290KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBraWRzT3JFbnRyaWVzID0geHJlZi5mZXRjaElmUmVmKHRoaXMucm9vdCk7CiAgICBsZXQgbG9vcENvdW50ID0gMDsKICAgIGNvbnN0IE1BWF9MRVZFTFMgPSAxMDsKICAgIHdoaWxlIChraWRzT3JFbnRyaWVzLmhhcygiS2lkcyIpKSB7CiAgICAgIGlmICgrK2xvb3BDb3VudCA+IE1BWF9MRVZFTFMpIHsKICAgICAgICB3YXJuKGBTZWFyY2ggZGVwdGggbGltaXQgcmVhY2hlZCBmb3IgIiR7dGhpcy5fdHlwZX0iIHRyZWUuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3Qga2lkcyA9IGtpZHNPckVudHJpZXMuZ2V0KCJLaWRzIik7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxldCBsID0gMCwKICAgICAgICByID0ga2lkcy5sZW5ndGggLSAxOwogICAgICB3aGlsZSAobCA8PSByKSB7CiAgICAgICAgY29uc3QgbSA9IGwgKyByID4+IDE7CiAgICAgICAgY29uc3Qga2lkID0geHJlZi5mZXRjaElmUmVmKGtpZHNbbV0pOwogICAgICAgIGNvbnN0IGxpbWl0cyA9IGtpZC5nZXQoIkxpbWl0cyIpOwogICAgICAgIGlmIChrZXkgPCB4cmVmLmZldGNoSWZSZWYobGltaXRzWzBdKSkgewogICAgICAgICAgciA9IG0gLSAxOwogICAgICAgIH0gZWxzZSBpZiAoa2V5ID4geHJlZi5mZXRjaElmUmVmKGxpbWl0c1sxXSkpIHsKICAgICAgICAgIGwgPSBtICsgMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAga2lkc09yRW50cmllcyA9IGtpZDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobCA+IHIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgY29uc3QgZW50cmllcyA9IGtpZHNPckVudHJpZXMuZ2V0KHRoaXMuX3R5cGUpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cmllcykpIHsKICAgICAgbGV0IGwgPSAwLAogICAgICAgIHIgPSBlbnRyaWVzLmxlbmd0aCAtIDI7CiAgICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICBjb25zdCB0bXAgPSBsICsgciA+PiAxLAogICAgICAgICAgbSA9IHRtcCArICh0bXAgJiAxKTsKICAgICAgICBjb25zdCBjdXJyZW50S2V5ID0geHJlZi5mZXRjaElmUmVmKGVudHJpZXNbbV0pOwogICAgICAgIGlmIChrZXkgPCBjdXJyZW50S2V5KSB7CiAgICAgICAgICByID0gbSAtIDI7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPiBjdXJyZW50S2V5KSB7CiAgICAgICAgICBsID0gbSArIDI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBlbnRyaWVzW20gKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBnZXQoa2V5KSB7CiAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoSWZSZWYodGhpcy5nZXRSYXcoa2V5KSk7CiAgfQp9CmNsYXNzIE5hbWVUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZSB7CiAgY29uc3RydWN0b3Iocm9vdCwgeHJlZikgewogICAgc3VwZXIocm9vdCwgeHJlZiwgIk5hbWVzIik7CiAgfQp9CmNsYXNzIE51bWJlclRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CiAgICBzdXBlcihyb290LCB4cmVmLCAiTnVtcyIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2xlYW51cF9oZWxwZXIuanMKCgoKCmZ1bmN0aW9uIGNsZWFyR2xvYmFsQ2FjaGVzKCkgewogIGNsZWFyUGF0dGVybkNhY2hlcygpOwogIGNsZWFyUHJpbWl0aXZlQ2FjaGVzKCk7CiAgY2xlYXJVbmljb2RlQ2FjaGVzKCk7CiAgSnB4SW1hZ2UuY2xlYW51cCgpOwp9Cgo7Ly8gLi9zcmMvY29yZS9maWxlX3NwZWMuanMKCgoKZnVuY3Rpb24gcGlja1BsYXRmb3JtSXRlbShkaWN0KSB7CiAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKGRpY3QuaGFzKCJVRiIpKSB7CiAgICByZXR1cm4gZGljdC5nZXQoIlVGIik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiRiIpKSB7CiAgICByZXR1cm4gZGljdC5nZXQoIkYiKTsKICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJVbml4IikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiVW5peCIpOwogIH0gZWxzZSBpZiAoZGljdC5oYXMoIk1hYyIpKSB7CiAgICByZXR1cm4gZGljdC5nZXQoIk1hYyIpOwogIH0gZWxzZSBpZiAoZGljdC5oYXMoIkRPUyIpKSB7CiAgICByZXR1cm4gZGljdC5nZXQoIkRPUyIpOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBzdHJpcFBhdGgoc3RyKSB7CiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxhc3RJbmRleE9mKCIvIikgKyAxKTsKfQpjbGFzcyBGaWxlU3BlYyB7CiAgI2NvbnRlbn
20RBdmFpbGFibGUgPSBmYWxzZTsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmLCBza2lwQ29udGVudCA9IGZhbHNlKSB7CiAgICBpZiAoIShyb290IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICBpZiAocm9vdC5oYXMoIkZTIikpIHsKICAgICAgdGhpcy5mcyA9IHJvb3QuZ2V0KCJGUyIpOwogICAgfQogICAgaWYgKHJvb3QuaGFzKCJSRiIpKSB7CiAgICAgIHdhcm4oIlJlbGF0ZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgfQogICAgaWYgKCFza2lwQ29udGVudCkgewogICAgICBpZiAocm9vdC5oYXMoIkVGIikpIHsKICAgICAgICB0aGlzLiNjb250ZW50QXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJOb24tZW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICB9CiAgICB9CiAgfQogIGdldCBmaWxlbmFtZSgpIHsKICAgIGxldCBmaWxlbmFtZSA9ICIiOwogICAgY29uc3QgaXRlbSA9IHBpY2tQbGF0Zm9ybUl0ZW0odGhpcy5yb290KTsKICAgIGlmIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikgewogICAgICBmaWxlbmFtZSA9IHN0cmluZ1RvUERGU3RyaW5nKGl0ZW0pLnJlcGxhY2VBbGwoIlxcXFwiLCAiXFwiKS5yZXBsYWNlQWxsKCJcXC8iLCAiLyIpLnJlcGxhY2VBbGwoIlxcIiwgIi8iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImZpbGVuYW1lIiwgZmlsZW5hbWUgfHwgInVubmFtZWQiKTsKICB9CiAgZ2V0IGNvbnRlbnQoKSB7CiAgICBpZiAoIXRoaXMuI2NvbnRlbnRBdmFpbGFibGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0aGlzLl9jb250ZW50UmVmIHx8PSBwaWNrUGxhdGZvcm1JdGVtKHRoaXMucm9vdD8uZ2V0KCJFRiIpKTsKICAgIGxldCBjb250ZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLl9jb250ZW50UmVmKSB7CiAgICAgIGNvbnN0IGZpbGVPYmogPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZih0aGlzLl9jb250ZW50UmVmKTsKICAgICAgaWYgKGZpbGVPYmogaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29udGVudCA9IGZpbGVPYmouZ2V0Qnl0ZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKCJFbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb24gcG9pbnRzIHRvIG5vbi1leGlzdGluZy9pbnZhbGlkIGNvbnRlbnQiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgd2FybigiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbnRlbnQiKTsKICAgIH0KICAgIHJldHVybiBjb250ZW50OwogIH0KICBnZXQgZGVzY3JpcHRpb24oKSB7CiAgICBsZXQgZGVzY3JpcHRpb24gPSAiIjsKICAgIGNvbnN0IGRlc2MgPSB0aGlzLnJvb3Q/LmdldCgiRGVzYyIpOwogICAgaWYgKGRlc2MgJiYgdHlwZW9mIGRlc2MgPT09ICJzdHJpbmciKSB7CiAgICAgIGRlc2NyaXB0aW9uID0gc3RyaW5nVG9QREZTdHJpbmcoZGVzYyk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKICB9CiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIHJhd0ZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLAogICAgICBmaWxlbmFtZTogc3RyaXBQYXRoKHRoaXMuZmlsZW5hbWUpLAogICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQsCiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveG1sX3BhcnNlci5qcwoKCgpjb25zdCBYTUxQYXJzZXJFcnJvckNvZGUgPSB7CiAgTm9FcnJvcjogMCwKICBFbmRPZkRvY3VtZW50OiAtMSwKICBVbnRlcm1pbmF0ZWRDZGF0OiAtMiwKICBVbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbjogLTMsCiAgVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uOiAtNCwKICBVbnRlcm1pbmF0ZWRDb21tZW50OiAtNSwKICBNYWxmb3JtZWRFbGVtZW50OiAtNiwKICBPdXRPZk1lbW9yeTogLTcsCiAgVW50ZXJtaW5hdGVkQXR0cmlidXRlVmFsdWU6IC04LAogIFVudGVybWluYXRlZEVsZW1lbnQ6IC05LAogIEVsZW1lbnROZXZlckJlZ3VuOiAtMTAKfTsKZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7CiAgY29uc3QgY2ggPSBzW2luZGV4XTsKICByZXR1cm4gY2ggPT09ICIgIiB8fCBjaCA9PT0gIlxuIiB8fCBjaCA9PT0gIlxyIiB8fCBjaCA9PT0gIlx0IjsKfQpmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKCFpc1doaXRlc3BhY2UocywgaSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpjbGFzcyBYTUxQYXJzZXJCYXNlIHsKICBfcmVzb2x2ZUVudGl0aW
20VzKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2VBbGwoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHsKICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09ICIjeCIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSAiIyIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygxKSwgMTApKTsKICAgICAgfQogICAgICBzd2l0Y2ggKGVudGl0eSkgewogICAgICAgIGNhc2UgImx0IjoKICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgcmV0dXJuICI+IjsKICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICByZXR1cm4gIiciOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm9uUmVzb2x2ZUVudGl0eShlbnRpdHkpOwogICAgfSk7CiAgfQogIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTsKICAgIGxldCBwb3MgPSBzdGFydDsKICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKICAgICAgKytwb3M7CiAgICB9CiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICBza2lwV3MoKTsKICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIiAmJiBzW3Bvc10gIT09ICI/IikgewogICAgICBza2lwV3MoKTsKICAgICAgbGV0IGF0dHJOYW1lID0gIiIsCiAgICAgICAgYXR0clZhbHVlID0gIiI7CiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPSIpIHsKICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgc2tpcFdzKCk7CiAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgICsrcG9zOwogICAgICBza2lwV3MoKTsKICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107CiAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJyInICYmIGF0dHJFbmRDaGFyICE9PSAiJyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTsKICAgICAgaWYgKGF0dHJFbmRJbmRleCA8IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBhdHRyVmFsdWUgPSBzLnN1YnN0cmluZyhwb3MsIGF0dHJFbmRJbmRleCk7CiAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgbmFtZTogYXR0ck5hbWUsCiAgICAgICAgdmFsdWU6IHRoaXMuX3Jlc29sdmVFbnRpdGllcyhhdHRyVmFsdWUpCiAgICAgIH0pOwogICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOwogICAgICBza2lwV3MoKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKICAgIH07CiAgfQogIF9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzLCBzdGFydCkgewogICAgbGV0IHBvcyA9IHN0YXJ0OwogICAgZnVuY3Rpb24gc2tpcFdzKCkgewogICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICI/IiAmJiBzW3Bvc10gIT09ICIvIikgewogICAgICArK3BvczsKICAgIH0KICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgIHNraXBXcygpOwogICAgY29uc3QgYXR0clN0YXJ0ID0gcG9zOwogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIChzW3Bvc10gIT09ICI/IiB8fCBzW3BvcyArIDFdICE9PSAiPiIpKSB7CiAgICAgICsrcG9zOwogICAgfQogICAgY29uc3QgdmFsdWUgPSBzLnN1YnN0cmluZyhhdHRyU3RhcnQsIHBvcyk7CiAgICByZXR1cm4gewogICAgICBuYW1lLAogICAgICB2YWx1ZSwKICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAogICAgfTsKICB9CiAgcGFyc2VYbWwocykgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgewogICAgICBjb25zdCBjaCA9IHNbaV07CiAgICAgIGxldCBqID0gaTsKICAgICAgaWYgKGNoID09PSAiPCIpIHsKICAgICAgICArK2o7CiAgICAgICAgY29uc3QgY2gyID0gc1tqXTsKICAgICAgICBsZXQgcTsKICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOwogICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRW5kRWxlbWVudChzLnN1YnN0cmluZyhqLCBxKSk7CiAgICAgICAgICAgIGogPSBxICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICI/IjoKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSAiPz4iKSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgI
20HRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7CiAgICAgICAgICAgIGogKz0gcGkucGFyc2VkICsgMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICIhIjoKICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCItLT4iLCBqICsgMyk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENvbW1lbnQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ29tbWVudChzLnN1YnN0cmluZyhqICsgMywgcSkpOwogICAgICAgICAgICAgIGogPSBxICsgMzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiW0NEQVRBWyIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdXT4iLCBqICsgOCk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ2RhdGEocy5zdWJzdHJpbmcoaiArIDgsIHEpKTsKICAgICAgICAgICAgICBqID0gcSArIDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIkRPQ1RZUEUiKSB7CiAgICAgICAgICAgICAgY29uc3QgcTIgPSBzLmluZGV4T2YoIlsiLCBqICsgOCk7CiAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKICAgICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHsKICAgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIl0+IiwgaiArIDgpOwogICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcGxleERvY3R5cGUgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKGogKyA4LCBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApKTsKICAgICAgICAgICAgICB0aGlzLm9uRG9jdHlwZShkb2N0eXBlQ29udGVudCk7CiAgICAgICAgICAgICAgaiA9IHEgKyAoY29tcGxleERvY3R5cGUgPyAyIDogMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopOwogICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAyKSA9PT0gIi8+IikgewogICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSAiPiIpIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CiAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09ICI8IikgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CiAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aW
20VzKHRleHQpKTsKICAgICAgfQogICAgICBpID0gajsKICAgIH0KICB9CiAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHsKICAgIHJldHVybiBgJiR7bmFtZX07YDsKICB9CiAgb25QaShuYW1lLCB2YWx1ZSkge30KICBvbkNvbW1lbnQodGV4dCkge30KICBvbkNkYXRhKHRleHQpIHt9CiAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQogIG9uVGV4dCh0ZXh0KSB7fQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CiAgb25FbmRFbGVtZW50KG5hbWUpIHt9CiAgb25FcnJvcihjb2RlKSB7fQp9CmNsYXNzIFNpbXBsZURPTU5vZGUgewogIGNvbnN0cnVjdG9yKG5vZGVOYW1lLCBub2RlVmFsdWUpIHsKICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKICAgIHRoaXMubm9kZVZhbHVlID0gbm9kZVZhbHVlOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJwYXJlbnROb2RlIiwgewogICAgICB2YWx1ZTogbnVsbCwKICAgICAgd3JpdGFibGU6IHRydWUKICAgIH0pOwogIH0KICBnZXQgZmlyc3RDaGlsZCgpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/LlswXTsKICB9CiAgZ2V0IG5leHRTaWJsaW5nKCkgewogICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgaWYgKCFjaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBjaGlsZE5vZGVzW2luZGV4ICsgMV07CiAgfQogIGdldCB0ZXh0Q29udGVudCgpIHsKICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKICAgIH0KICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCkgewogICAgICByZXR1cm4gY2hpbGQudGV4dENvbnRlbnQ7CiAgICB9KS5qb2luKCIiKTsKICB9CiAgZ2V0IGNoaWxkcmVuKCkgewogICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyB8fCBbXTsKICB9CiAgaGFzQ2hpbGROb2RlcygpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDA7CiAgfQogIHNlYXJjaE5vZGUocGF0aHMsIHBvcykgewogICAgaWYgKHBvcyA+PSBwYXRocy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoc1twb3NdOwogICAgaWYgKGNvbXBvbmVudC5uYW1lLnN0YXJ0c1dpdGgoIiMiKSAmJiBwb3MgPCBwYXRocy5sZW5ndGggLSAxKSB7CiAgICAgIHJldHVybiB0aGlzLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjb21wb25lbnQubmFtZSA9PT0gbm9kZS5ub2RlTmFtZSkgewogICAgICAgIGlmIChjb21wb25lbnQucG9zID09PSAwKSB7CiAgICAgICAgICBjb25zdCByZXMgPSBub2RlLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW3BhcmVudF0gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGxldCBzaWJsaW5nUG9zID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFyZW50LmNoaWxkTm9kZXMpIHsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSBjaGlsZC5ub2RlTmFtZSkgewogICAgICAgICAgICAgIGlmIChzaWJsaW5nUG9zID09PSBjb21wb25lbnQucG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmdQb3MrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vZGUuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDApIHsKICAgICAgICBzdGFjay5wdXNoKFtub2RlLCAwXSk7CiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1swXTsKICAgICAgfSBlbHNlIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBbcGFyZW50LCBjdXJyZW50UG9zXSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY29uc3QgbmV3UG9zID0gY3VycmVudFBvcyArIDE7CiAgICAgICAgICBpZiAobmV3UG9zIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goW3BhcmVudCwgbmV3UG9zXSk7CiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tuZXdQb3NdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGR1bXAoYnVmZmVyKSB7CiAgICBpZiAodGhpcy5ub2RlTmFtZSA9PT0gIiN0ZXh0IikgewogICAgICBidWZmZXIucHVzaChlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSkpOwogICAgICByZXR1cm47CiAgICB9CiAgICBidWZmZXIucHVzaChgPCR7dGhpcy5ub2RlTmFtZX1gKTsKICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMpIHsKICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgdGhpcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgYnVmZmVyLnB1c2goYCAke2F0dHJpYnV0ZS5uYW1lfT0iJHtlbmNvZGVUb1htbFN0cmluZyhhdHRyaWJ1dGUudmFsdWUpfSJgKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuaGFzQ2hpbGROb2RlcygpKSB7CiAgICAgIGJ1ZmZlci5wdXNoKCI+Iik7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgICAgY2hpbGQuZHVtcChidWZmZXIpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGA8LyR7dGhpcy5ub2RlTmFtZX0+YCk7CiAgICB9IGVsc2UgaWYgKHRoaXMubm9kZVZhbHVlKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGA+JHtlbmNvZGVUb1htbFN0cmluZyh0aGlzLm5vZGVWYWx1ZSl9PC8ke3RoaXMubm9kZU5hbWV9PmApOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLnB1c2goIi8+Iik7CiAgICB9CiAgfQp9CmNsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2UgewogIGNvbnN0cnVjdG9yKHsKICAgIGhhc0F0dHJpYnV0ZXMgPSBmYWxzZSwKICAgIGxvd2VyQ2FzZU5hbWUgPSBmYWxzZQogIH0pIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBudWxsOwogICAgdGhpcy5fc3RhY2sgPSBudWxsOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLl9oYXNBdHRyaWJ1dGVzID0gaGFzQXR0cmlidXRlczsKICAgIHRoaXMuX2xvd2VyQ2FzZU5hbWUgPSBsb3dlckNhc2VOYW1lOwogIH0KICBwYXJzZU
20Zyb21TdHJpbmcoZGF0YSkgewogICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLnBhcnNlWG1sKGRhdGEpOwogICAgaWYgKHRoaXMuX2Vycm9yQ29kZSAhPT0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IFtkb2N1bWVudEVsZW1lbnRdID0gdGhpcy5fY3VycmVudEZyYWdtZW50OwogICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRvY3VtZW50RWxlbWVudAogICAgfTsKICB9CiAgb25UZXh0KHRleHQpIHsKICAgIGlmIChpc1doaXRlc3BhY2VTdHJpbmcodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHsKICAgIGlmICh0aGlzLl9sb3dlckNhc2VOYW1lKSB7CiAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUobmFtZSk7CiAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTsKICAgIGlmICh0aGlzLl9oYXNBdHRyaWJ1dGVzKSB7CiAgICAgIG5vZGUuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICB9CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdOwogICAgY29uc3QgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpOwogICAgaWYgKCFsYXN0RWxlbWVudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGxhc3RFbGVtZW50LmNoaWxkTm9kZXMpIHsKICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSBsYXN0RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBsYXN0RWxlbWVudDsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvbWV0YWRhdGFfcGFyc2VyLmpzCgoKCgoKY2xhc3MgTWV0YWRhdGFQYXJzZXIgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIGRhdGEgPSB0aGlzLl9yZXBhaXIoZGF0YSk7CiAgICBjb25zdCBwYXJzZXIgPSBuZXcgU2ltcGxlWE1MUGFyc2VyKHsKICAgICAgbG93ZXJDYXNlTmFtZTogdHJ1ZQogICAgfSk7CiAgICBjb25zdCB4bWxEb2N1bWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YSk7CiAgICB0aGlzLl9tZXRhZGF0YU1hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX2RhdGEgPSBkYXRhOwogICAgaWYgKHhtbERvY3VtZW50KSB7CiAgICAgIHRoaXMuX3BhcnNlKHhtbERvY3VtZW50KTsKICAgIH0KICB9CiAgX3JlcGFpcihkYXRhKSB7CiAgICByZXR1cm4gZGF0YS5yZXBsYWNlKC9eW148XSsvLCAiIikucmVwbGFjZUFsbCgvPlxcMzc2XFwzNzcoW148XSspL2csIGZ1bmN0aW9uIChhbGwsIGNvZGVzKSB7CiAgICAgIGNvbnN0IGJ5dGVzID0gY29kZXMucmVwbGFjZUFsbCgvXFwoWzAtM10pKFswLTddKShbMC03XSkvZywgZnVuY3Rpb24gKGNvZGUsIGQxLCBkMiwgZDMpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShkMSAqIDY0ICsgZDIgKiA4ICsgZDMgKiAxKTsKICAgICAgfSkucmVwbGFjZUFsbCgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywgZnVuY3Rpb24gKHN0ciwgbmFtZSkgewogICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgY2FzZSAiYW1wIjoKICAgICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICAgIGNhc2UgImFwb3MiOgogICAgICAgICAgICByZXR1cm4gIiciOwogICAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgICByZXR1cm4gIj4iOwogICAgICAgICAgY2FzZSAibHQiOgogICAgICAgICAgICByZXR1cm4gIjwiOwogICAgICAgICAgY2FzZSAicXVvdCI6CiAgICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgX3JlcGFpcjogJHtuYW1lfSBpc24ndCBkZWZpbmVkLmApOwogICAgICB9KTsKICAgICAgY29uc3QgY2hhckJ1ZiA9IFsiPiJdOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSkgKiAyNTYgKyBieXRlcy5jaGFyQ29kZUF0KGkgKyAxKTsKICAgICAgICBpZiAoY29kZSA+PSAzMiAmJiBjb2RlIDwgMTI3ICYmIGNvZGUgIT09IDYwICYmIGNvZGUgIT09IDYyICYmIGNvZGUgIT09IDM4KSB7CiAgICAgICAgICBjaGFyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoYXJCdWYucHVzaCgiJiN4IiArICgweDEwMDAwICsgY29kZSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKSArICI7Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjaGFyQnVmLmpvaW4oIiIpOwogICAgfSk7CiAgfQogIF9nZXRTZXF1ZW5jZShlbnRyeSkgewogICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5vZGVOYW1lOwogICAgaWYgKG5hbWUgIT09ICJyZGY6YmFnIiAmJiBuYW1lICE9PSAicmRmOnNlcSIgJiYgbmFtZSAhPT0gInJkZjphbHQiKSB7CiAgICAgI
20HJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGVudHJ5LmNoaWxkTm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlTmFtZSA9PT0gInJkZjpsaSIpOwogIH0KICBfcGFyc2VBcnJheShlbnRyeSkgewogICAgaWYgKCFlbnRyeS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgW3NlcU5vZGVdID0gZW50cnkuY2hpbGROb2RlczsKICAgIGNvbnN0IHNlcXVlbmNlID0gdGhpcy5fZ2V0U2VxdWVuY2Uoc2VxTm9kZSkgfHwgW107CiAgICB0aGlzLl9tZXRhZGF0YU1hcC5zZXQoZW50cnkubm9kZU5hbWUsIHNlcXVlbmNlLm1hcChub2RlID0+IG5vZGUudGV4dENvbnRlbnQudHJpbSgpKSk7CiAgfQogIF9wYXJzZSh4bWxEb2N1bWVudCkgewogICAgbGV0IHJkZiA9IHhtbERvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgIGlmIChyZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIikgewogICAgICByZGYgPSByZGYuZmlyc3RDaGlsZDsKICAgICAgd2hpbGUgKHJkZiAmJiByZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIikgewogICAgICAgIHJkZiA9IHJkZi5uZXh0U2libGluZzsKICAgICAgfQogICAgfQogICAgaWYgKCFyZGYgfHwgcmRmLm5vZGVOYW1lICE9PSAicmRmOnJkZiIgfHwgIXJkZi5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBkZXNjIG9mIHJkZi5jaGlsZE5vZGVzKSB7CiAgICAgIGlmIChkZXNjLm5vZGVOYW1lICE9PSAicmRmOmRlc2NyaXB0aW9uIikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGVzYy5jaGlsZE5vZGVzKSB7CiAgICAgICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5vZGVOYW1lOwogICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgY2FzZSAiI3RleHQiOgogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgImRjOmNyZWF0b3IiOgogICAgICAgICAgY2FzZSAiZGM6c3ViamVjdCI6CiAgICAgICAgICAgIHRoaXMuX3BhcnNlQXJyYXkoZW50cnkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbWV0YWRhdGFNYXAuc2V0KG5hbWUsIGVudHJ5LnRleHRDb250ZW50LnRyaW0oKSk7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIHBhcnNlZERhdGE6IHRoaXMuX21ldGFkYXRhTWFwLAogICAgICByYXdEYXRhOiB0aGlzLl9kYXRhCiAgICB9OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvc3RydWN0X3RyZWUuanMKCgoKCgpjb25zdCBNQVhfREVQVEggPSA0MDsKY29uc3QgU3RydWN0RWxlbWVudFR5cGUgPSB7CiAgUEFHRV9DT05URU5UOiAxLAogIFNUUkVBTV9DT05URU5UOiAyLAogIE9CSkVDVDogMywKICBBTk5PVEFUSU9OOiA0LAogIEVMRU1FTlQ6IDUKfTsKY2xhc3MgU3RydWN0VHJlZVJvb3QgewogIGNvbnN0cnVjdG9yKHJvb3REaWN0LCByb290UmVmKSB7CiAgICB0aGlzLmRpY3QgPSByb290RGljdDsKICAgIHRoaXMucmVmID0gcm9vdFJlZiBpbnN0YW5jZW9mIFJlZiA/IHJvb3RSZWYgOiBudWxsOwogICAgdGhpcy5yb2xlTWFwID0gbmV3IE1hcCgpOwogICAgdGhpcy5zdHJ1Y3RQYXJlbnRJZHMgPSBudWxsOwogIH0KICBpbml0KCkgewogICAgdGhpcy5yZWFkUm9sZU1hcCgpOwogIH0KICAjYWRkSWRUb1BhZ2UocGFnZVJlZiwgaWQsIHR5cGUpIHsKICAgIGlmICghKHBhZ2VSZWYgaW5zdGFuY2VvZiBSZWYpIHx8IGlkIDwgMCkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLnN0cnVjdFBhcmVudElkcyB8fD0gbmV3IFJlZlNldENhY2hlKCk7CiAgICBsZXQgaWRzID0gdGhpcy5zdHJ1Y3RQYXJlbnRJZHMuZ2V0KHBhZ2VSZWYpOwogICAgaWYgKCFpZHMpIHsKICAgICAgaWRzID0gW107CiAgICAgIHRoaXMuc3RydWN0UGFyZW50SWRzLnB1dChwYWdlUmVmLCBpZHMpOwogICAgfQogICAgaWRzLnB1c2goW2lkLCB0eXBlXSk7CiAgfQogIGFkZEFubm90YXRpb25JZFRvUGFnZShwYWdlUmVmLCBpZCkgewogICAgdGhpcy4jYWRkSWRUb1BhZ2UocGFnZVJlZiwgaWQsIFN0cnVjdEVsZW1lbnRUeXBlLkFOTk9UQVRJT04pOwogIH0KICByZWFkUm9sZU1hcCgpIHsKICAgIGNvbnN0IHJvbGVNYXBEaWN0ID0gdGhpcy5kaWN0LmdldCgiUm9sZU1hcCIpOwogICAgaWYgKCEocm9sZU1hcERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByb2xlTWFwRGljdCkgewogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgdGhpcy5yb2xlTWFwLnNldChrZXksIHZhbHVlLm5hbWUpOwogICAgICB9CiAgICB9CiAgfQogIHN0YXRpYyBhc3luYyBjYW5DcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgIGNhdGFsb2dSZWYsCiAgICBwZGZNYW5hZ2VyLAogICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICB9KSB7CiAgICBpZiAoIShjYXRhbG9nUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICB3YXJuKCJDYW5ub3Qgc2F2ZSB0aGUgc3RydWN0IHRyZWU6IG5vIGNhdGFsb2cgcmVmZXJlbmNlLiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBsZXQgbmV4dEtleSA9IDA7CiAgICBsZXQgaGFzTm90aGluZ1RvVXBkYXRlID0gdHJ1ZTsKICAgIGZvciAoY29uc3QgW3BhZ2VJbmRleCwgZWxlbWVudHNdIG9mIG5ld0Fubm90YXRpb25zQnlQYWdlKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICByZWY6IHBhZ2VSZWYKICAgICAgfSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBpZiAoIShwYWdlUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICAgIHdhcm4oYENhbm5vdCBzYXZlIHRoZSBzdHJ1Y3QgdHJlZTogcGFnZSAke3BhZ2VJbmRleH0gaGFzIG5vIHJlZi5gKTsKICAgICAgICBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykgewogICAgICAgIGlmIChlbGVtZW50LmFjY2Vzc2liaWxpdHlEYXRhPy50eXBlKSB7CiAgICAgICAgICBlbGVtZW50LnBhcmVudFRyZWVJZCA9IG5leHRLZXkrKzsKICAgICAgICAgIGhhc05vdGhpbmdUb1VwZGF0ZSA9IGZhbHNlOwogICAgICAgI
20H0KICAgICAgfQogICAgfQogICAgaWYgKGhhc05vdGhpbmdUb1VwZGF0ZSkgewogICAgICBmb3IgKGNvbnN0IGVsZW1lbnRzIG9mIG5ld0Fubm90YXRpb25zQnlQYWdlLnZhbHVlcygpKSB7CiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgICBkZWxldGUgZWxlbWVudC5wYXJlbnRUcmVlSWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlU3RydWN0dXJlVHJlZSh7CiAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgIHhyZWYsCiAgICBjYXRhbG9nUmVmLAogICAgcGRmTWFuYWdlciwKICAgIGNoYW5nZXMKICB9KSB7CiAgICBjb25zdCByb290ID0gcGRmTWFuYWdlci5jYXRhbG9nLmNsb25lRGljdCgpOwogICAgY29uc3QgY2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIGNhY2hlLnB1dChjYXRhbG9nUmVmLCByb290KTsKICAgIGNvbnN0IHN0cnVjdFRyZWVSb290UmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgIHJvb3Quc2V0KCJTdHJ1Y3RUcmVlUm9vdCIsIHN0cnVjdFRyZWVSb290UmVmKTsKICAgIGNvbnN0IHN0cnVjdFRyZWVSb290ID0gbmV3IERpY3QoeHJlZik7CiAgICBzdHJ1Y3RUcmVlUm9vdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiU3RydWN0VHJlZVJvb3QiKSk7CiAgICBjb25zdCBwYXJlbnRUcmVlUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgIHN0cnVjdFRyZWVSb290LnNldCgiUGFyZW50VHJlZSIsIHBhcmVudFRyZWVSZWYpOwogICAgY29uc3Qga2lkcyA9IFtdOwogICAgc3RydWN0VHJlZVJvb3Quc2V0KCJLIiwga2lkcyk7CiAgICBjYWNoZS5wdXQoc3RydWN0VHJlZVJvb3RSZWYsIHN0cnVjdFRyZWVSb290KTsKICAgIGNvbnN0IHBhcmVudFRyZWUgPSBuZXcgRGljdCh4cmVmKTsKICAgIGNvbnN0IG51bXMgPSBbXTsKICAgIHBhcmVudFRyZWUuc2V0KCJOdW1zIiwgbnVtcyk7CiAgICBjb25zdCBuZXh0S2V5ID0gYXdhaXQgdGhpcy4jd3JpdGVLaWRzKHsKICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICAgIHN0cnVjdFRyZWVSb290UmVmLAogICAgICBzdHJ1Y3RUcmVlUm9vdDogbnVsbCwKICAgICAga2lkcywKICAgICAgbnVtcywKICAgICAgeHJlZiwKICAgICAgcGRmTWFuYWdlciwKICAgICAgY2hhbmdlcywKICAgICAgY2FjaGUKICAgIH0pOwogICAgc3RydWN0VHJlZVJvb3Quc2V0KCJQYXJlbnRUcmVlTmV4dEtleSIsIG5leHRLZXkpOwogICAgY2FjaGUucHV0KHBhcmVudFRyZWVSZWYsIHBhcmVudFRyZWUpOwogICAgZm9yIChjb25zdCBbcmVmLCBvYmpdIG9mIGNhY2hlLml0ZW1zKCkpIHsKICAgICAgY2hhbmdlcy5wdXQocmVmLCB7CiAgICAgICAgZGF0YTogb2JqCiAgICAgIH0pOwogICAgfQogIH0KICBhc3luYyBjYW5VcGRhdGVTdHJ1Y3RUcmVlKHsKICAgIHBkZk1hbmFnZXIsCiAgICB4cmVmLAogICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICB9KSB7CiAgICBpZiAoIXRoaXMucmVmKSB7CiAgICAgIHdhcm4oIkNhbm5vdCB1cGRhdGUgdGhlIHN0cnVjdCB0cmVlOiBubyByb290IHJlZmVyZW5jZS4iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbGV0IG5leHRLZXkgPSB0aGlzLmRpY3QuZ2V0KCJQYXJlbnRUcmVlTmV4dEtleSIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG5leHRLZXkpIHx8IG5leHRLZXkgPCAwKSB7CiAgICAgIHdhcm4oIkNhbm5vdCB1cGRhdGUgdGhlIHN0cnVjdCB0cmVlOiBpbnZhbGlkIG5leHQga2V5LiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBwYXJlbnRUcmVlID0gdGhpcy5kaWN0LmdldCgiUGFyZW50VHJlZSIpOwogICAgaWYgKCEocGFyZW50VHJlZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHdhcm4oIkNhbm5vdCB1cGRhdGUgdGhlIHN0cnVjdCB0cmVlOiBQYXJlbnRUcmVlIGlzbid0IGEgZGljdC4iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgbnVtcyA9IHBhcmVudFRyZWUuZ2V0KCJOdW1zIik7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkobnVtcykpIHsKICAgICAgd2FybigiQ2Fubm90IHVwZGF0ZSB0aGUgc3RydWN0IHRyZWU6IG51bXMgaXNuJ3QgYW4gYXJyYXkuIik7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IG51bWJlclRyZWUgPSBuZXcgTnVtYmVyVHJlZShwYXJlbnRUcmVlLCB4cmVmKTsKICAgIGZvciAoY29uc3QgcGFnZUluZGV4IG9mIG5ld0Fubm90YXRpb25zQnlQYWdlLmtleXMoKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcGFnZURpY3QKICAgICAgfSA9IGF3YWl0IHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpOwogICAgICBpZiAoIXBhZ2VEaWN0LmhhcygiU3RydWN0UGFyZW50cyIpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaWQgPSBwYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSB8fCAhQXJyYXkuaXNBcnJheShudW1iZXJUcmVlLmdldChpZCkpKSB7CiAgICAgICAgd2FybihgQ2Fubm90IHNhdmUgdGhlIHN0cnVjdCB0cmVlOiBwYWdlICR7cGFnZUluZGV4fSBoYXMgYSB3cm9uZyBpZC5gKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGxldCBoYXNOb3RoaW5nVG9VcGRhdGUgPSB0cnVlOwogICAgZm9yIChjb25zdCBbcGFnZUluZGV4LCBlbGVtZW50c10gb2YgbmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgewogICAgICAgIHBhZ2VEaWN0CiAgICAgIH0gPSBhd2FpdCBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KTsKICAgICAgU3RydWN0VHJlZVJvb3QuI2NvbGxlY3RQYXJlbnRzKHsKICAgICAgICBlbGVtZW50cywKICAgICAgICB4cmVmOiB0aGlzLmRpY3QueHJlZiwKICAgICAgICBwYWdlRGljdCwKICAgICAgICBudW1iZXJUcmVlCiAgICAgIH0pOwogICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgICBpZiAoZWxlbWVudC5hY2Nlc3NpYmlsaXR5RGF0YT8udHlwZSkgewogICAgICAgICAgaWYgKCEoZWxlbWVudC5hY2Nlc3NpYmlsaXR5RGF0YS5zdHJ1Y3RQYXJlbnQgPj0gMCkpIHsKICAgICAgICAgICAgZWxlbWVudC5wYXJlbnRUcmVlSWQgPSBuZXh0S2V5Kys7CiAgICAgICAgICB9CiAgICAgICAgICBoYXNOb3RoaW5nVG9VcGRhdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgI
20H0KICAgIH0KICAgIGlmIChoYXNOb3RoaW5nVG9VcGRhdGUpIHsKICAgICAgZm9yIChjb25zdCBlbGVtZW50cyBvZiBuZXdBbm5vdGF0aW9uc0J5UGFnZS52YWx1ZXMoKSkgewogICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykgewogICAgICAgICAgZGVsZXRlIGVsZW1lbnQucGFyZW50VHJlZUlkOwogICAgICAgICAgZGVsZXRlIGVsZW1lbnQuc3RydWN0VHJlZVBhcmVudDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGFzeW5jIHVwZGF0ZVN0cnVjdHVyZVRyZWUoewogICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICBwZGZNYW5hZ2VyLAogICAgY2hhbmdlcwogIH0pIHsKICAgIGNvbnN0IHhyZWYgPSB0aGlzLmRpY3QueHJlZjsKICAgIGNvbnN0IHN0cnVjdFRyZWVSb290ID0gdGhpcy5kaWN0LmNsb25lKCk7CiAgICBjb25zdCBzdHJ1Y3RUcmVlUm9vdFJlZiA9IHRoaXMucmVmOwogICAgY29uc3QgY2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIGNhY2hlLnB1dChzdHJ1Y3RUcmVlUm9vdFJlZiwgc3RydWN0VHJlZVJvb3QpOwogICAgbGV0IHBhcmVudFRyZWVSZWYgPSBzdHJ1Y3RUcmVlUm9vdC5nZXRSYXcoIlBhcmVudFRyZWUiKTsKICAgIGxldCBwYXJlbnRUcmVlOwogICAgaWYgKHBhcmVudFRyZWVSZWYgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgcGFyZW50VHJlZSA9IHhyZWYuZmV0Y2gocGFyZW50VHJlZVJlZik7CiAgICB9IGVsc2UgewogICAgICBwYXJlbnRUcmVlID0gcGFyZW50VHJlZVJlZjsKICAgICAgcGFyZW50VHJlZVJlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIHN0cnVjdFRyZWVSb290LnNldCgiUGFyZW50VHJlZSIsIHBhcmVudFRyZWVSZWYpOwogICAgfQogICAgcGFyZW50VHJlZSA9IHBhcmVudFRyZWUuY2xvbmUoKTsKICAgIGNhY2hlLnB1dChwYXJlbnRUcmVlUmVmLCBwYXJlbnRUcmVlKTsKICAgIGxldCBudW1zID0gcGFyZW50VHJlZS5nZXRSYXcoIk51bXMiKTsKICAgIGxldCBudW1zUmVmID0gbnVsbDsKICAgIGlmIChudW1zIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIG51bXNSZWYgPSBudW1zOwogICAgICBudW1zID0geHJlZi5mZXRjaChudW1zUmVmKTsKICAgIH0KICAgIG51bXMgPSBudW1zLnNsaWNlKCk7CiAgICBpZiAoIW51bXNSZWYpIHsKICAgICAgcGFyZW50VHJlZS5zZXQoIk51bXMiLCBudW1zKTsKICAgIH0KICAgIGNvbnN0IG5ld05leHRLZXkgPSBhd2FpdCBTdHJ1Y3RUcmVlUm9vdC4jd3JpdGVLaWRzKHsKICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICAgIHN0cnVjdFRyZWVSb290UmVmLAogICAgICBzdHJ1Y3RUcmVlUm9vdDogdGhpcywKICAgICAga2lkczogbnVsbCwKICAgICAgbnVtcywKICAgICAgeHJlZiwKICAgICAgcGRmTWFuYWdlciwKICAgICAgY2hhbmdlcywKICAgICAgY2FjaGUKICAgIH0pOwogICAgaWYgKG5ld05leHRLZXkgPT09IC0xKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN0cnVjdFRyZWVSb290LnNldCgiUGFyZW50VHJlZU5leHRLZXkiLCBuZXdOZXh0S2V5KTsKICAgIGlmIChudW1zUmVmKSB7CiAgICAgIGNhY2hlLnB1dChudW1zUmVmLCBudW1zKTsKICAgIH0KICAgIGZvciAoY29uc3QgW3JlZiwgb2JqXSBvZiBjYWNoZS5pdGVtcygpKSB7CiAgICAgIGNoYW5nZXMucHV0KHJlZiwgewogICAgICAgIGRhdGE6IG9iagogICAgICB9KTsKICAgIH0KICB9CiAgc3RhdGljIGFzeW5jICN3cml0ZUtpZHMoewogICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICBzdHJ1Y3RUcmVlUm9vdFJlZiwKICAgIHN0cnVjdFRyZWVSb290LAogICAga2lkcywKICAgIG51bXMsCiAgICB4cmVmLAogICAgcGRmTWFuYWdlciwKICAgIGNoYW5nZXMsCiAgICBjYWNoZQogIH0pIHsKICAgIGNvbnN0IG9ianIgPSBOYW1lLmdldCgiT0JKUiIpOwogICAgbGV0IG5leHRLZXkgPSAtMTsKICAgIGxldCBzdHJ1Y3RUcmVlUGFnZU9ianM7CiAgICBmb3IgKGNvbnN0IFtwYWdlSW5kZXgsIGVsZW1lbnRzXSBvZiBuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICBjb25zdCBwYWdlID0gYXdhaXQgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgICAgIGNvbnN0IHsKICAgICAgICByZWY6IHBhZ2VSZWYKICAgICAgfSA9IHBhZ2U7CiAgICAgIGNvbnN0IGlzUGFnZVJlZiA9IHBhZ2VSZWYgaW5zdGFuY2VvZiBSZWY7CiAgICAgIGZvciAoY29uc3QgewogICAgICAgIGFjY2Vzc2liaWxpdHlEYXRhLAogICAgICAgIHJlZiwKICAgICAgICBwYXJlbnRUcmVlSWQsCiAgICAgICAgc3RydWN0VHJlZVBhcmVudAogICAgICB9IG9mIGVsZW1lbnRzKSB7CiAgICAgICAgaWYgKCFhY2Nlc3NpYmlsaXR5RGF0YT8udHlwZSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHN0cnVjdFBhcmVudAogICAgICAgIH0gPSBhY2Nlc3NpYmlsaXR5RGF0YTsKICAgICAgICBpZiAoc3RydWN0VHJlZVJvb3QgJiYgTnVtYmVyLmlzSW50ZWdlcihzdHJ1Y3RQYXJlbnQpICYmIHN0cnVjdFBhcmVudCA+PSAwKSB7CiAgICAgICAgICBsZXQgb2JqcyA9IChzdHJ1Y3RUcmVlUGFnZU9ianMgfHw9IG5ldyBNYXAoKSkuZ2V0KHBhZ2VJbmRleCk7CiAgICAgICAgICBpZiAob2JqcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNvbnN0IHN0cnVjdFRyZWVQYWdlID0gbmV3IFN0cnVjdFRyZWVQYWdlKHN0cnVjdFRyZWVSb290LCBwYWdlLnBhZ2VEaWN0KTsKICAgICAgICAgICAgb2JqcyA9IHN0cnVjdFRyZWVQYWdlLmNvbGxlY3RPYmplY3RzKHBhZ2VSZWYpOwogICAgICAgICAgICBzdHJ1Y3RUcmVlUGFnZU9ianMuc2V0KHBhZ2VJbmRleCwgb2Jqcyk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBvYmpSZWYgPSBvYmpzPy5nZXQoc3RydWN0UGFyZW50KTsKICAgICAgICAgIGlmIChvYmpSZWYpIHsKICAgICAgICAgICAgY29uc3QgdGFnRGljdCA9IHhyZWYuZmV0Y2gob2JqUmVmKS5jbG9uZSgpOwogICAgICAgICAgICBTdHJ1Y3RUcmVlUm9vdC4jd3JpdGVQcm9wZXJ0aWVzKHRhZ0RpY3QsIGFjY2Vzc2liaWxpdHlEYXRhKTsKICAgICAgICAgICAgY2hhbmdlcy5wdXQob2JqUmVmLCB7CiAgICAgICAgICAgICAgZGF0YTogdGFnRGljdAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5leHRLZXkgPSBNYXRoLm1heChuZXh0S2V5LCBwYXJlbnRUcmVlSWQpOwogICAgICAgIGNvbnN0IHRhZ1JlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgICAgY29uc3QgdGFnRGljdCA9IG5ldyBEaWN0K
20HhyZWYpOwogICAgICAgIFN0cnVjdFRyZWVSb290LiN3cml0ZVByb3BlcnRpZXModGFnRGljdCwgYWNjZXNzaWJpbGl0eURhdGEpOwogICAgICAgIGF3YWl0IHRoaXMuI3VwZGF0ZVBhcmVudFRhZyh7CiAgICAgICAgICBzdHJ1Y3RUcmVlUGFyZW50LAogICAgICAgICAgdGFnRGljdCwKICAgICAgICAgIG5ld1RhZ1JlZjogdGFnUmVmLAogICAgICAgICAgc3RydWN0VHJlZVJvb3RSZWYsCiAgICAgICAgICBmYWxsYmFja0tpZHM6IGtpZHMsCiAgICAgICAgICB4cmVmLAogICAgICAgICAgY2FjaGUKICAgICAgICB9KTsKICAgICAgICBjb25zdCBvYmpEaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICAgICAgdGFnRGljdC5zZXQoIksiLCBvYmpEaWN0KTsKICAgICAgICBvYmpEaWN0LnNldCgiVHlwZSIsIG9ianIpOwogICAgICAgIGlmIChpc1BhZ2VSZWYpIHsKICAgICAgICAgIG9iakRpY3Quc2V0KCJQZyIsIHBhZ2VSZWYpOwogICAgICAgIH0KICAgICAgICBvYmpEaWN0LnNldCgiT2JqIiwgcmVmKTsKICAgICAgICBjYWNoZS5wdXQodGFnUmVmLCB0YWdEaWN0KTsKICAgICAgICBudW1zLnB1c2gocGFyZW50VHJlZUlkLCB0YWdSZWYpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV4dEtleSArIDE7CiAgfQogIHN0YXRpYyAjd3JpdGVQcm9wZXJ0aWVzKHRhZ0RpY3QsIHsKICAgIHR5cGUsCiAgICB0aXRsZSwKICAgIGxhbmcsCiAgICBhbHQsCiAgICBleHBhbmRlZCwKICAgIGFjdHVhbFRleHQKICB9KSB7CiAgICB0YWdEaWN0LnNldCgiUyIsIE5hbWUuZ2V0KHR5cGUpKTsKICAgIGlmICh0aXRsZSkgewogICAgICB0YWdEaWN0LnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodGl0bGUpKTsKICAgIH0KICAgIGlmIChsYW5nKSB7CiAgICAgIHRhZ0RpY3Quc2V0KCJMYW5nIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShsYW5nKSk7CiAgICB9CiAgICBpZiAoYWx0KSB7CiAgICAgIHRhZ0RpY3Quc2V0KCJBbHQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKGFsdCkpOwogICAgfQogICAgaWYgKGV4cGFuZGVkKSB7CiAgICAgIHRhZ0RpY3Quc2V0KCJFIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShleHBhbmRlZCkpOwogICAgfQogICAgaWYgKGFjdHVhbFRleHQpIHsKICAgICAgdGFnRGljdC5zZXQoIkFjdHVhbFRleHQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKGFjdHVhbFRleHQpKTsKICAgIH0KICB9CiAgc3RhdGljICNjb2xsZWN0UGFyZW50cyh7CiAgICBlbGVtZW50cywKICAgIHhyZWYsCiAgICBwYWdlRGljdCwKICAgIG51bWJlclRyZWUKICB9KSB7CiAgICBjb25zdCBpZFRvRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHsKICAgICAgaWYgKGVsZW1lbnQuc3RydWN0VHJlZVBhcmVudElkKSB7CiAgICAgICAgY29uc3QgaWQgPSBwYXJzZUludChlbGVtZW50LnN0cnVjdFRyZWVQYXJlbnRJZC5zcGxpdCgiX21jIilbMV0sIDEwKTsKICAgICAgICBsZXQgZWxlbXMgPSBpZFRvRWxlbWVudHMuZ2V0KGlkKTsKICAgICAgICBpZiAoIWVsZW1zKSB7CiAgICAgICAgICBlbGVtcyA9IFtdOwogICAgICAgICAgaWRUb0VsZW1lbnRzLnNldChpZCwgZWxlbXMpOwogICAgICAgIH0KICAgICAgICBlbGVtcy5wdXNoKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBpZCA9IHBhZ2VEaWN0LmdldCgiU3RydWN0UGFyZW50cyIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBwYXJlbnRBcnJheSA9IG51bWJlclRyZWUuZ2V0KGlkKTsKICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSAoa2lkLCBwYWdlS2lkLCBraWRSZWYpID0+IHsKICAgICAgY29uc3QgZWxlbXMgPSBpZFRvRWxlbWVudHMuZ2V0KGtpZCk7CiAgICAgIGlmIChlbGVtcykgewogICAgICAgIGNvbnN0IHBhcmVudFJlZiA9IHBhZ2VLaWQuZ2V0UmF3KCJQIik7CiAgICAgICAgY29uc3QgcGFyZW50RGljdCA9IHhyZWYuZmV0Y2hJZlJlZihwYXJlbnRSZWYpOwogICAgICAgIGlmIChwYXJlbnRSZWYgaW5zdGFuY2VvZiBSZWYgJiYgcGFyZW50RGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICAgICAgcmVmOiBraWRSZWYsCiAgICAgICAgICAgIGRpY3Q6IHBhZ2VLaWQKICAgICAgICAgIH07CiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbXMpIHsKICAgICAgICAgICAgZWxlbWVudC5zdHJ1Y3RUcmVlUGFyZW50ID0gcGFyYW1zOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgZm9yIChjb25zdCBraWRSZWYgb2YgcGFyZW50QXJyYXkpIHsKICAgICAgaWYgKCEoa2lkUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHBhZ2VLaWQgPSB4cmVmLmZldGNoKGtpZFJlZik7CiAgICAgIGNvbnN0IGsgPSBwYWdlS2lkLmdldCgiSyIpOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihrKSkgewogICAgICAgIHVwZGF0ZUVsZW1lbnQoaywgcGFnZUtpZCwga2lkUmVmKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBraWQgb2YgaykgewogICAgICAgIGtpZCA9IHhyZWYuZmV0Y2hJZlJlZihraWQpOwogICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGtpZCkgJiYgdXBkYXRlRWxlbWVudChraWQsIHBhZ2VLaWQsIGtpZFJlZikpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIShraWQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICghaXNOYW1lKGtpZC5nZXQoIlR5cGUiKSwgIk1DUiIpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWNpZCA9IGtpZC5nZXQoIk1DSUQiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihtY2lkKSAmJiB1cGRhdGVFbGVtZW50KG1jaWQsIHBhZ2VLaWQsIGtpZFJlZikpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgI
20H0KICAgICAgfQogICAgfQogIH0KICBzdGF0aWMgYXN5bmMgI3VwZGF0ZVBhcmVudFRhZyh7CiAgICBzdHJ1Y3RUcmVlUGFyZW50LAogICAgdGFnRGljdCwKICAgIG5ld1RhZ1JlZiwKICAgIHN0cnVjdFRyZWVSb290UmVmLAogICAgZmFsbGJhY2tLaWRzLAogICAgeHJlZiwKICAgIGNhY2hlCiAgfSkgewogICAgbGV0IHJlZiA9IG51bGw7CiAgICBsZXQgcGFyZW50UmVmOwogICAgaWYgKHN0cnVjdFRyZWVQYXJlbnQpIHsKICAgICAgKHsKICAgICAgICByZWYKICAgICAgfSA9IHN0cnVjdFRyZWVQYXJlbnQpOwogICAgICBwYXJlbnRSZWYgPSBzdHJ1Y3RUcmVlUGFyZW50LmRpY3QuZ2V0UmF3KCJQIikgfHwgc3RydWN0VHJlZVJvb3RSZWY7CiAgICB9IGVsc2UgewogICAgICBwYXJlbnRSZWYgPSBzdHJ1Y3RUcmVlUm9vdFJlZjsKICAgIH0KICAgIHRhZ0RpY3Quc2V0KCJQIiwgcGFyZW50UmVmKTsKICAgIGNvbnN0IHBhcmVudERpY3QgPSB4cmVmLmZldGNoSWZSZWYocGFyZW50UmVmKTsKICAgIGlmICghcGFyZW50RGljdCkgewogICAgICBmYWxsYmFja0tpZHMucHVzaChuZXdUYWdSZWYpOwogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgY2FjaGVkUGFyZW50RGljdCA9IGNhY2hlLmdldChwYXJlbnRSZWYpOwogICAgaWYgKCFjYWNoZWRQYXJlbnREaWN0KSB7CiAgICAgIGNhY2hlZFBhcmVudERpY3QgPSBwYXJlbnREaWN0LmNsb25lKCk7CiAgICAgIGNhY2hlLnB1dChwYXJlbnRSZWYsIGNhY2hlZFBhcmVudERpY3QpOwogICAgfQogICAgY29uc3QgcGFyZW50S2lkc1JhdyA9IGNhY2hlZFBhcmVudERpY3QuZ2V0UmF3KCJLIik7CiAgICBsZXQgY2FjaGVkUGFyZW50S2lkcyA9IHBhcmVudEtpZHNSYXcgaW5zdGFuY2VvZiBSZWYgPyBjYWNoZS5nZXQocGFyZW50S2lkc1JhdykgOiBudWxsOwogICAgaWYgKCFjYWNoZWRQYXJlbnRLaWRzKSB7CiAgICAgIGNhY2hlZFBhcmVudEtpZHMgPSB4cmVmLmZldGNoSWZSZWYocGFyZW50S2lkc1Jhdyk7CiAgICAgIGNhY2hlZFBhcmVudEtpZHMgPSBBcnJheS5pc0FycmF5KGNhY2hlZFBhcmVudEtpZHMpID8gY2FjaGVkUGFyZW50S2lkcy5zbGljZSgpIDogW3BhcmVudEtpZHNSYXddOwogICAgICBjb25zdCBwYXJlbnRLaWRzUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgY2FjaGVkUGFyZW50RGljdC5zZXQoIksiLCBwYXJlbnRLaWRzUmVmKTsKICAgICAgY2FjaGUucHV0KHBhcmVudEtpZHNSZWYsIGNhY2hlZFBhcmVudEtpZHMpOwogICAgfQogICAgY29uc3QgaW5kZXggPSBjYWNoZWRQYXJlbnRLaWRzLmluZGV4T2YocmVmKTsKICAgIGNhY2hlZFBhcmVudEtpZHMuc3BsaWNlKGluZGV4ID49IDAgPyBpbmRleCArIDEgOiBjYWNoZWRQYXJlbnRLaWRzLmxlbmd0aCwgMCwgbmV3VGFnUmVmKTsKICB9Cn0KY2xhc3MgU3RydWN0RWxlbWVudE5vZGUgewogIGNvbnN0cnVjdG9yKHRyZWUsIGRpY3QpIHsKICAgIHRoaXMudHJlZSA9IHRyZWU7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5raWRzID0gW107CiAgICB0aGlzLnBhcnNlS2lkcygpOwogIH0KICBnZXQgcm9sZSgpIHsKICAgIGNvbnN0IG5hbWVPYmogPSB0aGlzLmRpY3QuZ2V0KCJTIik7CiAgICBjb25zdCBuYW1lID0gbmFtZU9iaiBpbnN0YW5jZW9mIE5hbWUgPyBuYW1lT2JqLm5hbWUgOiAiIjsKICAgIGNvbnN0IHsKICAgICAgcm9vdAogICAgfSA9IHRoaXMudHJlZTsKICAgIGlmIChyb290LnJvbGVNYXAuaGFzKG5hbWUpKSB7CiAgICAgIHJldHVybiByb290LnJvbGVNYXAuZ2V0KG5hbWUpOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQogIHBhcnNlS2lkcygpIHsKICAgIGxldCBwYWdlT2JqSWQgPSBudWxsOwogICAgY29uc3Qgb2JqUmVmID0gdGhpcy5kaWN0LmdldFJhdygiUGciKTsKICAgIGlmIChvYmpSZWYgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgcGFnZU9iaklkID0gb2JqUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCBraWRzID0gdGhpcy5kaWN0LmdldCgiSyIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkKTsKICAgICAgICBpZiAoZWxlbWVudCkgewogICAgICAgICAgdGhpcy5raWRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUtpZChwYWdlT2JqSWQsIGtpZHMpOwogICAgICBpZiAoZWxlbWVudCkgewogICAgICAgIHRoaXMua2lkcy5wdXNoKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkKSB7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihraWQpKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09IHBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgICAgdHlwZTogU3RydWN0RWxlbWVudFR5cGUuUEFHRV9DT05URU5ULAogICAgICAgIG1jaWQ6IGtpZCwKICAgICAgICBwYWdlT2JqSWQKICAgICAgfSk7CiAgICB9CiAgICBsZXQga2lkRGljdCA9IG51bGw7CiAgICBpZiAoa2lkIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIGtpZERpY3QgPSB0aGlzLmRpY3QueHJlZi5mZXRjaChraWQpOwogICAgfSBlbHNlIGlmIChraWQgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGtpZERpY3QgPSBraWQ7CiAgICB9CiAgICBpZiAoIWtpZERpY3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYWdlUmVmID0ga2lkRGljdC5nZXRSYXcoIlBnIik7CiAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIFJlZikgewogICAgICBwYWdlT2JqSWQgPSBwYWdlUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCB0eXBlID0ga2lkRGljdC5nZXQoIlR5cGUiKSBpbnN0YW5jZW9mIE5hbWUgPyBraWREaWN0LmdldCgiVHlwZSIpLm5hbWUgOiBudWxsOwogICAgaWYgKHR5cGUgPT09ICJNQ1IiKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09I
20HBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGtpZFJlZiA9IGtpZERpY3QuZ2V0UmF3KCJTdG0iKTsKICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5TVFJFQU1fQ09OVEVOVCwKICAgICAgICByZWZPYmpJZDoga2lkUmVmIGluc3RhbmNlb2YgUmVmID8ga2lkUmVmLnRvU3RyaW5nKCkgOiBudWxsLAogICAgICAgIHBhZ2VPYmpJZCwKICAgICAgICBtY2lkOiBraWREaWN0LmdldCgiTUNJRCIpCiAgICAgIH0pOwogICAgfQogICAgaWYgKHR5cGUgPT09ICJPQkpSIikgewogICAgICBpZiAodGhpcy50cmVlLnBhZ2VEaWN0Lm9iaklkICE9PSBwYWdlT2JqSWQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRSZWYgPSBraWREaWN0LmdldFJhdygiT2JqIik7CiAgICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgICAgdHlwZTogU3RydWN0RWxlbWVudFR5cGUuT0JKRUNULAogICAgICAgIHJlZk9iaklkOiBraWRSZWYgaW5zdGFuY2VvZiBSZWYgPyBraWRSZWYudG9TdHJpbmcoKSA6IG51bGwsCiAgICAgICAgcGFnZU9iaklkCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgdHlwZTogU3RydWN0RWxlbWVudFR5cGUuRUxFTUVOVCwKICAgICAgZGljdDoga2lkRGljdAogICAgfSk7CiAgfQp9CmNsYXNzIFN0cnVjdEVsZW1lbnQgewogIGNvbnN0cnVjdG9yKHsKICAgIHR5cGUsCiAgICBkaWN0ID0gbnVsbCwKICAgIG1jaWQgPSBudWxsLAogICAgcGFnZU9iaklkID0gbnVsbCwKICAgIHJlZk9iaklkID0gbnVsbAogIH0pIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5tY2lkID0gbWNpZDsKICAgIHRoaXMucGFnZU9iaklkID0gcGFnZU9iaklkOwogICAgdGhpcy5yZWZPYmpJZCA9IHJlZk9iaklkOwogICAgdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKICB9Cn0KY2xhc3MgU3RydWN0VHJlZVBhZ2UgewogIGNvbnN0cnVjdG9yKHN0cnVjdFRyZWVSb290LCBwYWdlRGljdCkgewogICAgdGhpcy5yb290ID0gc3RydWN0VHJlZVJvb3Q7CiAgICB0aGlzLnJvb3REaWN0ID0gc3RydWN0VHJlZVJvb3QgPyBzdHJ1Y3RUcmVlUm9vdC5kaWN0IDogbnVsbDsKICAgIHRoaXMucGFnZURpY3QgPSBwYWdlRGljdDsKICAgIHRoaXMubm9kZXMgPSBbXTsKICB9CiAgY29sbGVjdE9iamVjdHMocGFnZVJlZikgewogICAgaWYgKCF0aGlzLnJvb3QgfHwgIXRoaXMucm9vdERpY3QgfHwgIShwYWdlUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHBhcmVudFRyZWUgPSB0aGlzLnJvb3REaWN0LmdldCgiUGFyZW50VHJlZSIpOwogICAgaWYgKCFwYXJlbnRUcmVlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgaWRzID0gdGhpcy5yb290LnN0cnVjdFBhcmVudElkcz8uZ2V0KHBhZ2VSZWYpOwogICAgaWYgKCFpZHMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IE51bWJlclRyZWUocGFyZW50VHJlZSwgdGhpcy5yb290RGljdC54cmVmKTsKICAgIGZvciAoY29uc3QgW2VsZW1JZF0gb2YgaWRzKSB7CiAgICAgIGNvbnN0IG9iaiA9IG51bWJlclRyZWUuZ2V0UmF3KGVsZW1JZCk7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBtYXAuc2V0KGVsZW1JZCwgb2JqKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgcGFyc2UocGFnZVJlZikgewogICAgaWYgKCF0aGlzLnJvb3QgfHwgIXRoaXMucm9vdERpY3QgfHwgIShwYWdlUmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBwYXJlbnRUcmVlID0gdGhpcy5yb290RGljdC5nZXQoIlBhcmVudFRyZWUiKTsKICAgIGlmICghcGFyZW50VHJlZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBpZCA9IHRoaXMucGFnZURpY3QuZ2V0KCJTdHJ1Y3RQYXJlbnRzIik7CiAgICBjb25zdCBpZHMgPSB0aGlzLnJvb3Quc3RydWN0UGFyZW50SWRzPy5nZXQocGFnZVJlZik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaWQpICYmICFpZHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBOdW1iZXJUcmVlKHBhcmVudFRyZWUsIHRoaXMucm9vdERpY3QueHJlZik7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpZCkpIHsKICAgICAgY29uc3QgcGFyZW50QXJyYXkgPSBudW1iZXJUcmVlLmdldChpZCk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudEFycmF5KSkgewogICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHBhcmVudEFycmF5KSB7CiAgICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIHRoaXMuYWRkTm9kZSh0aGlzLnJvb3REaWN0LnhyZWYuZmV0Y2gocmVmKSwgbWFwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmICghaWRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgW2VsZW1JZCwgdHlwZV0gb2YgaWRzKSB7CiAgICAgIGNvbnN0IG9iaiA9IG51bWJlclRyZWUuZ2V0KGVsZW1JZCk7CiAgICAgIGlmIChvYmopIHsKICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5hZGROb2RlKHRoaXMucm9vdERpY3QueHJlZi5mZXRjaElmUmVmKG9iaiksIG1hcCk7CiAgICAgICAgaWYgKGVsZW0/LmtpZHM/Lmxlbmd0aCA9PT0gMSAmJiBlbGVtLmtpZHNbMF0udHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuT0JKRUNUKSB7CiAgICAgICAgICBlbGVtLmtpZHNbMF0udHlwZSA9IHR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGFkZE5vZGUoZGljdCwgbWFwLCBsZXZlbCA9IDApIHsKICAgIGlmIChsZXZlbCA+IE1BWF9ERVBUSCkgewogICAgICB3YXJuKCJTdHJ1Y3RUcmVlIE1BWF9ERVBUSCByZWFjaGVkLiIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChtYXAuaGFzKGRpY3QpKSB7CiAgICAgI
20HJldHVybiBtYXAuZ2V0KGRpY3QpOwogICAgfQogICAgY29uc3QgZWxlbWVudCA9IG5ldyBTdHJ1Y3RFbGVtZW50Tm9kZSh0aGlzLCBkaWN0KTsKICAgIG1hcC5zZXQoZGljdCwgZWxlbWVudCk7CiAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiUCIpOwogICAgaWYgKCFwYXJlbnQgfHwgaXNOYW1lKHBhcmVudC5nZXQoIlR5cGUiKSwgIlN0cnVjdFRyZWVSb290IikpIHsKICAgICAgaWYgKCF0aGlzLmFkZFRvcExldmVsTm9kZShkaWN0LCBlbGVtZW50KSkgewogICAgICAgIG1hcC5kZWxldGUoZGljdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5hZGROb2RlKHBhcmVudCwgbWFwLCBsZXZlbCArIDEpOwogICAgaWYgKCFwYXJlbnROb2RlKSB7CiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogICAgbGV0IHNhdmUgPSBmYWxzZTsKICAgIGZvciAoY29uc3Qga2lkIG9mIHBhcmVudE5vZGUua2lkcykgewogICAgICBpZiAoa2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLkVMRU1FTlQgJiYga2lkLmRpY3QgPT09IGRpY3QpIHsKICAgICAgICBraWQucGFyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgc2F2ZSA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGlmICghc2F2ZSkgewogICAgICBtYXAuZGVsZXRlKGRpY3QpOwogICAgfQogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfQogIGFkZFRvcExldmVsTm9kZShkaWN0LCBlbGVtZW50KSB7CiAgICBjb25zdCBvYmogPSB0aGlzLnJvb3REaWN0LmdldCgiSyIpOwogICAgaWYgKCFvYmopIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgaWYgKG9iai5vYmpJZCAhPT0gZGljdC5vYmpJZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB0aGlzLm5vZGVzWzBdID0gZWxlbWVudDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGxldCBzYXZlID0gZmFsc2U7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBraWRSZWYgPSBvYmpbaV07CiAgICAgIGlmIChraWRSZWY/LnRvU3RyaW5nKCkgPT09IGRpY3Qub2JqSWQpIHsKICAgICAgICB0aGlzLm5vZGVzW2ldID0gZWxlbWVudDsKICAgICAgICBzYXZlID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNhdmU7CiAgfQogIGdldCBzZXJpYWxpemFibGUoKSB7CiAgICBmdW5jdGlvbiBub2RlVG9TZXJpYWxpemFibGUobm9kZSwgcGFyZW50LCBsZXZlbCA9IDApIHsKICAgICAgaWYgKGxldmVsID4gTUFYX0RFUFRIKSB7CiAgICAgICAgd2FybigiU3RydWN0VHJlZSB0b28gZGVlcCB0byBiZSBmdWxseSBzZXJpYWxpemVkLiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBvYmoucm9sZSA9IG5vZGUucm9sZTsKICAgICAgb2JqLmNoaWxkcmVuID0gW107CiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG9iaik7CiAgICAgIGxldCBhbHQgPSBub2RlLmRpY3QuZ2V0KCJBbHQiKTsKICAgICAgaWYgKHR5cGVvZiBhbHQgIT09ICJzdHJpbmciKSB7CiAgICAgICAgYWx0ID0gbm9kZS5kaWN0LmdldCgiQWN0dWFsVGV4dCIpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgYWx0ID09PSAic3RyaW5nIikgewogICAgICAgIG9iai5hbHQgPSBzdHJpbmdUb1BERlN0cmluZyhhbHQpOwogICAgICB9CiAgICAgIGNvbnN0IGEgPSBub2RlLmRpY3QuZ2V0KCJBIik7CiAgICAgIGlmIChhIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBOb3JtYWxSZWN0KGEuZ2V0QXJyYXkoIkJCb3giKSwgbnVsbCk7CiAgICAgICAgaWYgKGJib3gpIHsKICAgICAgICAgIG9iai5iYm94ID0gYmJveDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgd2lkdGggPSBhLmdldCgiV2lkdGgiKTsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGEuZ2V0KCJIZWlnaHQiKTsKICAgICAgICAgIGlmICh0eXBlb2Ygd2lkdGggPT09ICJudW1iZXIiICYmIHdpZHRoID4gMCAmJiB0eXBlb2YgaGVpZ2h0ID09PSAibnVtYmVyIiAmJiBoZWlnaHQgPiAwKSB7CiAgICAgICAgICAgIG9iai5iYm94ID0gWzAsIDAsIHdpZHRoLCBoZWlnaHRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBsYW5nID0gbm9kZS5kaWN0LmdldCgiTGFuZyIpOwogICAgICBpZiAodHlwZW9mIGxhbmcgPT09ICJzdHJpbmciKSB7CiAgICAgICAgb2JqLmxhbmcgPSBzdHJpbmdUb1BERlN0cmluZyhsYW5nKTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGtpZCBvZiBub2RlLmtpZHMpIHsKICAgICAgICBjb25zdCBraWRFbGVtZW50ID0ga2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLkVMRU1FTlQgPyBraWQucGFyZW50Tm9kZSA6IG51bGw7CiAgICAgICAgaWYgKGtpZEVsZW1lbnQpIHsKICAgICAgICAgIG5vZGVUb1NlcmlhbGl6YWJsZShraWRFbGVtZW50LCBvYmosIGxldmVsICsgMSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgaWYgKGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5QQUdFX0NPTlRFTlQgfHwga2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLlNUUkVBTV9DT05URU5UKSB7CiAgICAgICAgICBvYmouY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6ICJjb250ZW50IiwKICAgICAgICAgICAgaWQ6IGBwJHtraWQucGFnZU9iaklkfV9tYyR7a2lkLm1jaWR9YAogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuT0JKRUNUKSB7CiAgICAgICAgICBvYmouY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIHR5cGU6ICJvYmplY3QiLAogICAgICAgICAgICBpZDoga2lkLnJlZk9iaklkCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5BTk5PVEFUSU9OKSB7CiAgICAgICAgICBvYmouY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgI
20HR5cGU6ICJhbm5vdGF0aW9uIiwKICAgICAgICAgICAgaWQ6IGAke0Fubm90YXRpb25QcmVmaXh9JHtraWQucmVmT2JqSWR9YAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCByb290ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHJvb3QuY2hpbGRyZW4gPSBbXTsKICAgIHJvb3Qucm9sZSA9ICJSb290IjsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5ub2RlcykgewogICAgICBpZiAoIWNoaWxkKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbm9kZVRvU2VyaWFsaXphYmxlKGNoaWxkLCByb290KTsKICAgIH0KICAgIHJldHVybiByb290OwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY2F0YWxvZy5qcwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gaXNWYWxpZEV4cGxpY2l0RGVzdChkZXN0KSB7CiAgaWYgKCFBcnJheS5pc0FycmF5KGRlc3QpIHx8IGRlc3QubGVuZ3RoIDwgMikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBbcGFnZSwgem9vbSwgLi4uYXJnc10gPSBkZXN0OwogIGlmICghKHBhZ2UgaW5zdGFuY2VvZiBSZWYpICYmICFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmICghKHpvb20gaW5zdGFuY2VvZiBOYW1lKSkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjb25zdCBhcmdzTGVuID0gYXJncy5sZW5ndGg7CiAgbGV0IGFsbG93TnVsbCA9IHRydWU7CiAgc3dpdGNoICh6b29tLm5hbWUpIHsKICAgIGNhc2UgIlhZWiI6CiAgICAgIGlmIChhcmdzTGVuIDwgMiB8fCBhcmdzTGVuID4gMykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgIkZpdCI6CiAgICBjYXNlICJGaXRCIjoKICAgICAgcmV0dXJuIGFyZ3NMZW4gPT09IDA7CiAgICBjYXNlICJGaXRIIjoKICAgIGNhc2UgIkZpdEJIIjoKICAgIGNhc2UgIkZpdFYiOgogICAgY2FzZSAiRml0QlYiOgogICAgICBpZiAoYXJnc0xlbiA+IDEpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJGaXRSIjoKICAgICAgaWYgKGFyZ3NMZW4gIT09IDQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgYWxsb3dOdWxsID0gZmFsc2U7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7CiAgICBpZiAoISh0eXBlb2YgYXJnID09PSAibnVtYmVyIiB8fCBhbGxvd051bGwgJiYgYXJnID09PSBudWxsKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGZldGNoRGVzdChkZXN0KSB7CiAgaWYgKGRlc3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBkZXN0ID0gZGVzdC5nZXQoIkQiKTsKICB9CiAgcmV0dXJuIGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkgPyBkZXN0IDogbnVsbDsKfQpmdW5jdGlvbiBmZXRjaFJlbW90ZURlc3QoYWN0aW9uKSB7CiAgbGV0IGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgaWYgKGRlc3QpIHsKICAgIGlmIChkZXN0IGluc3RhbmNlb2YgTmFtZSkgewogICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgfQogICAgaWYgKHR5cGVvZiBkZXN0ID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGVzdCk7CiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRlc3QpOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBDYXRhbG9nIHsKICBjb25zdHJ1Y3RvcihwZGZNYW5hZ2VyLCB4cmVmKSB7CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMuX2NhdERpY3QgPSB4cmVmLmdldENhdGFsb2dPYmooKTsKICAgIGlmICghKHRoaXMuX2NhdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkNhdGFsb2cgb2JqZWN0IGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICB9CiAgICB0aGlzLnRvcGxldmVsUGFnZXNEaWN0OwogICAgdGhpcy5fYWN0dWFsTnVtUGFnZXMgPSBudWxsOwogICAgdGhpcy5mb250Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlID0gbmV3IE1hcCgpOwogICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlID0gbmV3IEdsb2JhbEltYWdlQ2FjaGUoKTsKICAgIHRoaXMucGFnZUtpZHNDb3VudENhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICB0aGlzLnBhZ2VJbmRleENhY2hlID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICB0aGlzLnBhZ2VEaWN0Q2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMubm9uQmxlbmRNb2Rlc1NldCA9IG5ldyBSZWZTZXQoKTsKICAgIHRoaXMuc3lzdGVtRm9udENhY2hlID0gbmV3IE1hcCgpOwogIH0KICBjbG9uZURpY3QoKSB7CiAgICByZXR1cm4gdGhpcy5fY2F0RGljdC5jbG9uZSgpOwogIH0KICBnZXQgdmVyc2lvbigpIHsKICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9jYXREaWN0LmdldCgiVmVyc2lvbiIpOwogICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIGlmIChQREZfVkVSU0lPTl9SRUdFWFAudGVzdCh2ZXJzaW9uLm5hbWUpKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmVyc2lvbiIsIHZlcnNpb24ubmFtZSk7CiAgICAgIH0KICAgICAgd2FybihgSW52YWxpZCBQREYgY2F0YWxvZyB2ZXJzaW9uOiAke3ZlcnNpb24ubmFtZX1gKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInZlcnNpb24iLCBudWxsKTsKICB9CiAgZ2V0IGxhbmcoKSB7CiAgICBjb25zdCBsYW5nID0gdGhpcy5fY2F0RGljdC5nZXQoIkxhbmciKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImxhbmciLCBsYW5nICYmIHR5cGVvZiBsYW5nID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKGxhbmcpIDogbnVsbCk7CiAgfQogIGdldCBuZWVkc1JlbmRlcmluZygpIHsKICAgIGNvbnN0IG5lZWRzUmVuZGVyaW5nID0gdGhpcy5fY2F0RGljdC5nZXQoIk5lZWRzUmVuZGVyaW5nIik7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJuZWVkc1JlbmRlcmluZyIsIHR5cGVvZiBuZWVkc1JlbmRlcmluZyA9PT0gImJvb2xlYW4iID8gbmVlZHNSZW5kZXJpbmcgOiBmYWxzZSk7CiAgfQogIGdldCBjb2xsZWN0aW9uKCkgewogICAgbGV0IGNvbGxlY3Rpb24gPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIkNvbGxlY3Rpb24iKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QgJiYgb2JqLnNpemUgPiAwKSB7CiAgICAgICAgY29sbGVjdGlvbiA9IG9iajsKICAgICAgfQogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICBpbmZvKCJDYW5ub3QgZmV0Y2ggQ29sbGVjdGlvbiBlbnRyeTsgYXNzdW1pbmcgbm8gY29sbGVjdGlvbiBpcyBwcmVzZW50LiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCA
20iY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24pOwogIH0KICBnZXQgYWNyb0Zvcm0oKSB7CiAgICBsZXQgYWNyb0Zvcm0gPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIkFjcm9Gb3JtIik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0ICYmIG9iai5zaXplID4gMCkgewogICAgICAgIGFjcm9Gb3JtID0gb2JqOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGluZm8oIkNhbm5vdCBmZXRjaCBBY3JvRm9ybSBlbnRyeTsgYXNzdW1pbmcgbm8gZm9ybXMgYXJlIHByZXNlbnQuIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhY3JvRm9ybSIsIGFjcm9Gb3JtKTsKICB9CiAgZ2V0IGFjcm9Gb3JtUmVmKCkgewogICAgY29uc3QgdmFsdWUgPSB0aGlzLl9jYXREaWN0LmdldFJhdygiQWNyb0Zvcm0iKTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImFjcm9Gb3JtUmVmIiwgdmFsdWUgaW5zdGFuY2VvZiBSZWYgPyB2YWx1ZSA6IG51bGwpOwogIH0KICBnZXQgbWV0YWRhdGEoKSB7CiAgICBjb25zdCBzdHJlYW1SZWYgPSB0aGlzLl9jYXREaWN0LmdldFJhdygiTWV0YWRhdGEiKTsKICAgIGlmICghKHN0cmVhbVJlZiBpbnN0YW5jZW9mIFJlZikpIHsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWV0YWRhdGEiLCBudWxsKTsKICAgIH0KICAgIGxldCBtZXRhZGF0YSA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnhyZWYuZmV0Y2goc3RyZWFtUmVmLCAhdGhpcy54cmVmLmVuY3J5cHQ/LmVuY3J5cHRNZXRhZGF0YSk7CiAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtICYmIHN0cmVhbS5kaWN0IGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0uZGljdC5nZXQoIlR5cGUiKTsKICAgICAgICBjb25zdCBzdWJ0eXBlID0gc3RyZWFtLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgaWYgKGlzTmFtZSh0eXBlLCAiTWV0YWRhdGEiKSAmJiBpc05hbWUoc3VidHlwZSwgIlhNTCIpKSB7CiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cmVhbS5nZXRTdHJpbmcoKSk7CiAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YVBhcnNlcihkYXRhKS5zZXJpYWxpemFibGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGluZm8oYFNraXBwaW5nIGludmFsaWQgTWV0YWRhdGE6ICIke2V4fSIuYCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJtZXRhZGF0YSIsIG1ldGFkYXRhKTsKICB9CiAgZ2V0IG1hcmtJbmZvKCkgewogICAgbGV0IG1hcmtJbmZvID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG1hcmtJbmZvID0gdGhpcy5fcmVhZE1hcmtJbmZvKCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIlVuYWJsZSB0byByZWFkIG1hcmsgaW5mby4iKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm1hcmtJbmZvIiwgbWFya0luZm8pOwogIH0KICBfcmVhZE1hcmtJbmZvKCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk1hcmtJbmZvIik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IG1hcmtJbmZvID0gewogICAgICBNYXJrZWQ6IGZhbHNlLAogICAgICBVc2VyUHJvcGVydGllczogZmFsc2UsCiAgICAgIFN1c3BlY3RzOiBmYWxzZQogICAgfTsKICAgIGZvciAoY29uc3Qga2V5IGluIG1hcmtJbmZvKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gb2JqLmdldChrZXkpOwogICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICBtYXJrSW5mb1trZXldID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXJrSW5mbzsKICB9CiAgZ2V0IHN0cnVjdFRyZWVSb290KCkgewogICAgbGV0IHN0cnVjdFRyZWUgPSBudWxsOwogICAgdHJ5IHsKICAgICAgc3RydWN0VHJlZSA9IHRoaXMuX3JlYWRTdHJ1Y3RUcmVlUm9vdCgpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgcmVhZCB0byBzdHJ1Y3RUcmVlUm9vdCBpbmZvLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAic3RydWN0VHJlZVJvb3QiLCBzdHJ1Y3RUcmVlKTsKICB9CiAgX3JlYWRTdHJ1Y3RUcmVlUm9vdCgpIHsKICAgIGNvbnN0IHJhd09iaiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJTdHJ1Y3RUcmVlUm9vdCIpOwogICAgY29uc3Qgb2JqID0gdGhpcy54cmVmLmZldGNoSWZSZWYocmF3T2JqKTsKICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgcm9vdCA9IG5ldyBTdHJ1Y3RUcmVlUm9vdChvYmosIHJhd09iaik7CiAgICByb290LmluaXQoKTsKICAgIHJldHVybiByb290OwogIH0KICBnZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKSB7CiAgICBjb25zdCBwYWdlc09iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpOwogICAgaWYgKCEocGFnZXNPYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkuIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ0b3BsZXZlbFBhZ2VzRGljdCIsIHBhZ2VzT2JqKTsKICB9CiAgZ2V0IGRvY3VtZW50T3V0bGluZSgpIHsKICAgIGxldCBvYmogPSBudWxsOwogICAgdHJ5IHsKICAgICAgb2JqID0gdGhpcy5fcmVhZERvY3VtZW50T3V0bGluZSgpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKCJVbmFibGUgdG8gcmVhZCBkb2N1bWVudCBvdXRsaW5lLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCA
20iZG9jdW1lbnRPdXRsaW5lIiwgb2JqKTsKICB9CiAgX3JlYWREb2N1bWVudE91dGxpbmUoKSB7CiAgICBsZXQgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIG9iaiA9IG9iai5nZXRSYXcoIkZpcnN0Iik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBSZWYpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgcm9vdCA9IHsKICAgICAgaXRlbXM6IFtdCiAgICB9OwogICAgY29uc3QgcXVldWUgPSBbewogICAgICBvYmosCiAgICAgIHBhcmVudDogcm9vdAogICAgfV07CiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgUmVmU2V0KCk7CiAgICBwcm9jZXNzZWQucHV0KG9iaik7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmLAogICAgICBibGFja0NvbG9yID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpOwogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgaSA9IHF1ZXVlLnNoaWZ0KCk7CiAgICAgIGNvbnN0IG91dGxpbmVEaWN0ID0geHJlZi5mZXRjaElmUmVmKGkub2JqKTsKICAgICAgaWYgKG91dGxpbmVEaWN0ID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFvdXRsaW5lRGljdC5oYXMoIlRpdGxlIikpIHsKICAgICAgICB3YXJuKCJJbnZhbGlkIG91dGxpbmUgaXRlbSBlbmNvdW50ZXJlZC4iKTsKICAgICAgfQogICAgICBjb25zdCBkYXRhID0gewogICAgICAgIHVybDogbnVsbCwKICAgICAgICBkZXN0OiBudWxsLAogICAgICAgIGFjdGlvbjogbnVsbAogICAgICB9OwogICAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgICAgIGRlc3REaWN0OiBvdXRsaW5lRGljdCwKICAgICAgICByZXN1bHRPYmo6IGRhdGEsCiAgICAgICAgZG9jQmFzZVVybDogdGhpcy5iYXNlVXJsLAogICAgICAgIGRvY0F0dGFjaG1lbnRzOiB0aGlzLmF0dGFjaG1lbnRzCiAgICAgIH0pOwogICAgICBjb25zdCB0aXRsZSA9IG91dGxpbmVEaWN0LmdldCgiVGl0bGUiKTsKICAgICAgY29uc3QgZmxhZ3MgPSBvdXRsaW5lRGljdC5nZXQoIkYiKSB8fCAwOwogICAgICBjb25zdCBjb2xvciA9IG91dGxpbmVEaWN0LmdldEFycmF5KCJDIik7CiAgICAgIGNvbnN0IGNvdW50ID0gb3V0bGluZURpY3QuZ2V0KCJDb3VudCIpOwogICAgICBsZXQgcmdiQ29sb3IgPSBibGFja0NvbG9yOwogICAgICBpZiAoaXNOdW1iZXJBcnJheShjb2xvciwgMykgJiYgKGNvbG9yWzBdICE9PSAwIHx8IGNvbG9yWzFdICE9PSAwIHx8IGNvbG9yWzJdICE9PSAwKSkgewogICAgICAgIHJnYkNvbG9yID0gQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYi5nZXRSZ2IoY29sb3IsIDApOwogICAgICB9CiAgICAgIGNvbnN0IG91dGxpbmVJdGVtID0gewogICAgICAgIGFjdGlvbjogZGF0YS5hY3Rpb24sCiAgICAgICAgYXR0YWNobWVudDogZGF0YS5hdHRhY2htZW50LAogICAgICAgIGRlc3Q6IGRhdGEuZGVzdCwKICAgICAgICB1cmw6IGRhdGEudXJsLAogICAgICAgIHVuc2FmZVVybDogZGF0YS51bnNhZmVVcmwsCiAgICAgICAgbmV3V2luZG93OiBkYXRhLm5ld1dpbmRvdywKICAgICAgICBzZXRPQ0dTdGF0ZTogZGF0YS5zZXRPQ0dTdGF0ZSwKICAgICAgICB0aXRsZTogdHlwZW9mIHRpdGxlID09PSAic3RyaW5nIiA/IHN0cmluZ1RvUERGU3RyaW5nKHRpdGxlKSA6ICIiLAogICAgICAgIGNvbG9yOiByZ2JDb2xvciwKICAgICAgICBjb3VudDogTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgPyBjb3VudCA6IHVuZGVmaW5lZCwKICAgICAgICBib2xkOiAhIShmbGFncyAmIDIpLAogICAgICAgIGl0YWxpYzogISEoZmxhZ3MgJiAxKSwKICAgICAgICBpdGVtczogW10KICAgICAgfTsKICAgICAgaS5wYXJlbnQuaXRlbXMucHVzaChvdXRsaW5lSXRlbSk7CiAgICAgIG9iaiA9IG91dGxpbmVEaWN0LmdldFJhdygiRmlyc3QiKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZiAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBvYmosCiAgICAgICAgICBwYXJlbnQ6IG91dGxpbmVJdGVtCiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgICB9CiAgICAgIG9iaiA9IG91dGxpbmVEaWN0LmdldFJhdygiTmV4dCIpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVmICYmICFwcm9jZXNzZWQuaGFzKG9iaikpIHsKICAgICAgICBxdWV1ZS5wdXNoKHsKICAgICAgICAgIG9iaiwKICAgICAgICAgIHBhcmVudDogaS5wYXJlbnQKICAgICAgICB9KTsKICAgICAgICBwcm9jZXNzZWQucHV0KG9iaik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByb290Lml0ZW1zLmxlbmd0aCA+IDAgPyByb290Lml0ZW1zIDogbnVsbDsKICB9CiAgZ2V0IHBlcm1pc3Npb25zKCkgewogICAgbGV0IHBlcm1pc3Npb25zID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIHBlcm1pc3Npb25zID0gdGhpcy5fcmVhZFBlcm1pc3Npb25zKCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIlVuYWJsZSB0byByZWFkIHBlcm1pc3Npb25zLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGVybWlzc2lvbnMiLCBwZXJtaXNzaW9ucyk7CiAgfQogIF9yZWFkUGVybWlzc2lvbnMoKSB7CiAgICBjb25zdCBlbmNyeXB0ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJFbmNyeXB0Iik7CiAgICBpZiAoIShlbmNyeXB0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgZmxhZ3MgPSBlbmNyeXB0LmdldCgiUCIpOwogICAgaWYgKHR5cGVvZiBmbGFncyAhPT0gIm51bWJlciIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmbGFncyArPSAyICoqIDMyOwogICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTsKICAgIGZvciAoY29uc3Qga2V5IGluIFBlcm1pc3Npb25GbGFnKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gUGVybWlzc2lvbkZsYWdba2V5XTsKICAgICAgaWYgKGZsYWdzICYgdmFsdWUpIHsKICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBlcm1pc3Npb25zOwogIH0KICBnZXQgb3B0aW9uYWxDb250ZW50Q29uZmlnKCkgewogICAgbGV0IGNvbmZpZyA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fY2F0RGljdC5nZXQoIk9DUHJvcGVydGllcyIpOwogICAgICBpZiAoIXByb3BlcnRpZXMpIHsKICAgICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJvcHRpb25hbENvbnRlbnRDb25maWciLCBudWxsKTsKICAgICAgfQogICAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gcHJvcGVydGllcy5nZXQoIkQiKTsKICAgICAgaWYgKCFkZWZh
20dWx0Q29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZ3JvdXBzRGF0YSA9IHByb3BlcnRpZXMuZ2V0KCJPQ0dzIik7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncm91cHNEYXRhKSkgewogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIG51bGwpOwogICAgICB9CiAgICAgIGNvbnN0IGdyb3VwUmVmQ2FjaGUgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgICAgZm9yIChjb25zdCBncm91cFJlZiBvZiBncm91cHNEYXRhKSB7CiAgICAgICAgaWYgKCEoZ3JvdXBSZWYgaW5zdGFuY2VvZiBSZWYpIHx8IGdyb3VwUmVmQ2FjaGUuaGFzKGdyb3VwUmVmKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGdyb3VwUmVmQ2FjaGUucHV0KGdyb3VwUmVmLCB0aGlzLiNyZWFkT3B0aW9uYWxDb250ZW50R3JvdXAoZ3JvdXBSZWYpKTsKICAgICAgfQogICAgICBjb25maWcgPSB0aGlzLiNyZWFkT3B0aW9uYWxDb250ZW50Q29uZmlnKGRlZmF1bHRDb25maWcsIGdyb3VwUmVmQ2FjaGUpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGBVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogJHtleH1gKTsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wdGlvbmFsQ29udGVudENvbmZpZyIsIGNvbmZpZyk7CiAgfQogICNyZWFkT3B0aW9uYWxDb250ZW50R3JvdXAoZ3JvdXBSZWYpIHsKICAgIGNvbnN0IGdyb3VwID0gdGhpcy54cmVmLmZldGNoKGdyb3VwUmVmKTsKICAgIGNvbnN0IG9iaiA9IHsKICAgICAgaWQ6IGdyb3VwUmVmLnRvU3RyaW5nKCksCiAgICAgIG5hbWU6IG51bGwsCiAgICAgIGludGVudDogbnVsbCwKICAgICAgdXNhZ2U6IHsKICAgICAgICBwcmludDogbnVsbCwKICAgICAgICB2aWV3OiBudWxsCiAgICAgIH0sCiAgICAgIHJiR3JvdXBzOiBbXQogICAgfTsKICAgIGNvbnN0IG5hbWUgPSBncm91cC5nZXQoIk5hbWUiKTsKICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgb2JqLm5hbWUgPSBzdHJpbmdUb1BERlN0cmluZyhuYW1lKTsKICAgIH0KICAgIGxldCBpbnRlbnQgPSBncm91cC5nZXRBcnJheSgiSW50ZW50Iik7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW50ZW50KSkgewogICAgICBpbnRlbnQgPSBbaW50ZW50XTsKICAgIH0KICAgIGlmIChpbnRlbnQuZXZlcnkoaSA9PiBpIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgb2JqLmludGVudCA9IGludGVudC5tYXAoaSA9PiBpLm5hbWUpOwogICAgfQogICAgY29uc3QgdXNhZ2UgPSBncm91cC5nZXQoIlVzYWdlIik7CiAgICBpZiAoISh1c2FnZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiBvYmo7CiAgICB9CiAgICBjb25zdCB1c2FnZU9iaiA9IG9iai51c2FnZTsKICAgIGNvbnN0IHByaW50ID0gdXNhZ2UuZ2V0KCJQcmludCIpOwogICAgaWYgKHByaW50IGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBwcmludFN0YXRlID0gcHJpbnQuZ2V0KCJQcmludFN0YXRlIik7CiAgICAgIGlmIChwcmludFN0YXRlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIHN3aXRjaCAocHJpbnRTdGF0ZS5uYW1lKSB7CiAgICAgICAgICBjYXNlICJPTiI6CiAgICAgICAgICBjYXNlICJPRkYiOgogICAgICAgICAgICB1c2FnZU9iai5wcmludCA9IHsKICAgICAgICAgICAgICBwcmludFN0YXRlOiBwcmludFN0YXRlLm5hbWUKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHZpZXcgPSB1c2FnZS5nZXQoIlZpZXciKTsKICAgIGlmICh2aWV3IGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCB2aWV3U3RhdGUgPSB2aWV3LmdldCgiVmlld1N0YXRlIik7CiAgICAgIGlmICh2aWV3U3RhdGUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgc3dpdGNoICh2aWV3U3RhdGUubmFtZSkgewogICAgICAgICAgY2FzZSAiT04iOgogICAgICAgICAgY2FzZSAiT0ZGIjoKICAgICAgICAgICAgdXNhZ2VPYmoudmlldyA9IHsKICAgICAgICAgICAgICB2aWV3U3RhdGU6IHZpZXdTdGF0ZS5uYW1lCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICAjcmVhZE9wdGlvbmFsQ29udGVudENvbmZpZyhjb25maWcsIGdyb3VwUmVmQ2FjaGUpIHsKICAgIGZ1bmN0aW9uIHBhcnNlT25PZmYocmVmcykgewogICAgICBjb25zdCBvblBhcnNlZCA9IFtdOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZzKSkgewogICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVmcykgewogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIGdyb3VwUmVmQ2FjaGUuaGFzKHZhbHVlKSkgewogICAgICAgICAgICBvblBhcnNlZC5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb25QYXJzZWQ7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU9yZGVyKHJlZnMsIG5lc3RlZExldmVscyA9IDApIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3Qgb3JkZXIgPSBbXTsKICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWZzKSB7CiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIGdyb3VwUmVmQ2FjaGUuaGFzKHZhbHVlKSkgewogICAgICAgICAgcGFyc2VkT3JkZXJSZWZzLnB1dCh2YWx1ZSk7CiAgICAgICAgICBvcmRlci5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5lc3RlZE9yZGVyID0gcGFyc2VOZXN0ZWRPcmRlcih2YWx1ZSwgbmVzdGVkTGV2ZWxzKTsKICAgICAgICBpZiAobmVzdGVkT3JkZXIpIHsKICAgICAgICAgIG9yZGVyLnB1c2gobmVzdGVkT3JkZXIpOwogICAgICAgI
20H0KICAgICAgfQogICAgICBpZiAobmVzdGVkTGV2ZWxzID4gMCkgewogICAgICAgIHJldHVybiBvcmRlcjsKICAgICAgfQogICAgICBjb25zdCBoaWRkZW5Hcm91cHMgPSBbXTsKICAgICAgZm9yIChjb25zdCBbZ3JvdXBSZWZdIG9mIGdyb3VwUmVmQ2FjaGUuaXRlbXMoKSkgewogICAgICAgIGlmIChwYXJzZWRPcmRlclJlZnMuaGFzKGdyb3VwUmVmKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGhpZGRlbkdyb3Vwcy5wdXNoKGdyb3VwUmVmLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICAgIGlmIChoaWRkZW5Hcm91cHMubGVuZ3RoKSB7CiAgICAgICAgb3JkZXIucHVzaCh7CiAgICAgICAgICBuYW1lOiBudWxsLAogICAgICAgICAgb3JkZXI6IGhpZGRlbkdyb3VwcwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBvcmRlcjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTmVzdGVkT3JkZXIocmVmLCBuZXN0ZWRMZXZlbHMpIHsKICAgICAgaWYgKCsrbmVzdGVkTGV2ZWxzID4gTUFYX05FU1RFRF9MRVZFTFMpIHsKICAgICAgICB3YXJuKCJwYXJzZU5lc3RlZE9yZGVyIC0gcmVhY2hlZCBNQVhfTkVTVEVEX0xFVkVMUy4iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZSA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgbmVzdGVkTmFtZSA9IHhyZWYuZmV0Y2hJZlJlZih2YWx1ZVswXSk7CiAgICAgIGlmICh0eXBlb2YgbmVzdGVkTmFtZSAhPT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBuZXN0ZWRPcmRlciA9IHBhcnNlT3JkZXIodmFsdWUuc2xpY2UoMSksIG5lc3RlZExldmVscyk7CiAgICAgIGlmICghbmVzdGVkT3JkZXI/Lmxlbmd0aCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogc3RyaW5nVG9QREZTdHJpbmcobmVzdGVkTmFtZSksCiAgICAgICAgb3JkZXI6IG5lc3RlZE9yZGVyCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVJCR3JvdXBzKHJiR3JvdXBzKSB7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyYkdyb3VwcykpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiByYkdyb3VwcykgewogICAgICAgIGNvbnN0IHJiR3JvdXAgPSB4cmVmLmZldGNoSWZSZWYodmFsdWUpOwogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyYkdyb3VwKSB8fCAhcmJHcm91cC5sZW5ndGgpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYXJzZWRSYkdyb3VwID0gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJiR3JvdXApIHsKICAgICAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBSZWYgJiYgZ3JvdXBSZWZDYWNoZS5oYXMocmVmKSAmJiAhcGFyc2VkUmJHcm91cC5oYXMocmVmLnRvU3RyaW5nKCkpKSB7CiAgICAgICAgICAgIHBhcnNlZFJiR3JvdXAuYWRkKHJlZi50b1N0cmluZygpKTsKICAgICAgICAgICAgZ3JvdXBSZWZDYWNoZS5nZXQocmVmKS5yYkdyb3Vwcy5wdXNoKHBhcnNlZFJiR3JvdXApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgcGFyc2VkT3JkZXJSZWZzID0gbmV3IFJlZlNldCgpLAogICAgICBNQVhfTkVTVEVEX0xFVkVMUyA9IDEwOwogICAgcGFyc2VSQkdyb3Vwcyhjb25maWcuZ2V0KCJSQkdyb3VwcyIpKTsKICAgIHJldHVybiB7CiAgICAgIG5hbWU6IHR5cGVvZiBjb25maWcuZ2V0KCJOYW1lIikgPT09ICJzdHJpbmciID8gc3RyaW5nVG9QREZTdHJpbmcoY29uZmlnLmdldCgiTmFtZSIpKSA6IG51bGwsCiAgICAgIGNyZWF0b3I6IHR5cGVvZiBjb25maWcuZ2V0KCJDcmVhdG9yIikgPT09ICJzdHJpbmciID8gc3RyaW5nVG9QREZTdHJpbmcoY29uZmlnLmdldCgiQ3JlYXRvciIpKSA6IG51bGwsCiAgICAgIGJhc2VTdGF0ZTogY29uZmlnLmdldCgiQmFzZVN0YXRlIikgaW5zdGFuY2VvZiBOYW1lID8gY29uZmlnLmdldCgiQmFzZVN0YXRlIikubmFtZSA6IG51bGwsCiAgICAgIG9uOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9OIikpLAogICAgICBvZmY6IHBhcnNlT25PZmYoY29uZmlnLmdldCgiT0ZGIikpLAogICAgICBvcmRlcjogcGFyc2VPcmRlcihjb25maWcuZ2V0KCJPcmRlciIpKSwKICAgICAgZ3JvdXBzOiBbLi4uZ3JvdXBSZWZDYWNoZV0KICAgIH07CiAgfQogIHNldEFjdHVhbE51bVBhZ2VzKG51bSA9IG51bGwpIHsKICAgIHRoaXMuX2FjdHVhbE51bVBhZ2VzID0gbnVtOwogIH0KICBnZXQgaGFzQWN0dWFsTnVtUGFnZXMoKSB7CiAgICByZXR1cm4gdGhpcy5fYWN0dWFsTnVtUGFnZXMgIT09IG51bGw7CiAgfQogIGdldCBfcGFnZXNDb3VudCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QuZ2V0KCJDb3VudCIpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGNvdW50IGluIHRvcC1sZXZlbCBwYWdlcyBkaWN0aW9uYXJ5IGlzIG5vdCBhbiBpbnRlZ2VyLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiX3BhZ2VzQ291bnQiLCBvYmopOwogIH0KICBnZXQgbnVtUGFnZXMoKSB7CiAgICByZXR1cm4gdGhpcy5oYXNBY3R1YWxOdW1QYWdlcyA/IHRoaXMuX2FjdHVhbE51bVBhZ2VzIDogdGhpcy5fcGFnZXNDb3VudDsKICB9CiAgZ2V0IGRlc3RpbmF0aW9ucygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpLAogICAgICBkZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZVRyZWUpIHsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqLmdldEFsbCgpKSB7CiAgICAgICAgY29uc3QgZGVzdCA9IGZldGNoRGVzdCh2YWx1ZSk7CiAgICAgICAgaWYgKGRlc3QpIHsKICAgICAgICAgIGRlc3RzW3N0cmluZ1RvUERGU3RyaW5nKGtleSldID0gZGVzdDsKICAgICAgICB9CiAgICAgI
20H0KICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGljdCkgewogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmopIHsKICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KHZhbHVlKTsKICAgICAgICBpZiAoZGVzdCkgewogICAgICAgICAgZGVzdHNba2V5XSA9IGRlc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkZXN0aW5hdGlvbnMiLCBkZXN0cyk7CiAgfQogIGdldERlc3RpbmF0aW9uKGlkKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9yZWFkRGVzdHMoKTsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lVHJlZSkgewogICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0KG9iai5nZXQoaWQpKTsKICAgICAgaWYgKGRlc3QpIHsKICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgfQogICAgICBjb25zdCBhbGxEZXN0ID0gdGhpcy5kZXN0aW5hdGlvbnNbaWRdOwogICAgICBpZiAoYWxsRGVzdCkgewogICAgICAgIHdhcm4oYEZvdW5kICIke2lkfSIgYXQgYW4gaW5jb3JyZWN0IHBvc2l0aW9uIGluIHRoZSBOYW1lVHJlZS5gKTsKICAgICAgICByZXR1cm4gYWxsRGVzdDsKICAgICAgfQogICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIGNvbnN0IGRlc3QgPSBmZXRjaERlc3Qob2JqLmdldChpZCkpOwogICAgICBpZiAoZGVzdCkgewogICAgICAgIHJldHVybiBkZXN0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgX3JlYWREZXN0cygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOwogICAgaWYgKG9iaj8uaGFzKCJEZXN0cyIpKSB7CiAgICAgIHJldHVybiBuZXcgTmFtZVRyZWUob2JqLmdldFJhdygiRGVzdHMiKSwgdGhpcy54cmVmKTsKICAgIH0gZWxzZSBpZiAodGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIikpIHsKICAgICAgcmV0dXJuIHRoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgZ2V0IHBhZ2VMYWJlbHMoKSB7CiAgICBsZXQgb2JqID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG9iaiA9IHRoaXMuX3JlYWRQYWdlTGFiZWxzKCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oIlVuYWJsZSB0byByZWFkIHBhZ2UgbGFiZWxzLiIpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicGFnZUxhYmVscyIsIG9iaik7CiAgfQogIF9yZWFkUGFnZUxhYmVscygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlTGFiZWxzIik7CiAgICBpZiAoIW9iaikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHBhZ2VMYWJlbHMgPSBuZXcgQXJyYXkodGhpcy5udW1QYWdlcyk7CiAgICBsZXQgc3R5bGUgPSBudWxsLAogICAgICBwcmVmaXggPSAiIjsKICAgIGNvbnN0IG51bWJlclRyZWUgPSBuZXcgTnVtYmVyVHJlZShvYmosIHRoaXMueHJlZik7CiAgICBjb25zdCBudW1zID0gbnVtYmVyVHJlZS5nZXRBbGwoKTsKICAgIGxldCBjdXJyZW50TGFiZWwgPSAiIiwKICAgICAgY3VycmVudEluZGV4ID0gMTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMubnVtUGFnZXM7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxhYmVsRGljdCA9IG51bXMuZ2V0KGkpOwogICAgICBpZiAobGFiZWxEaWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAoIShsYWJlbERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlTGFiZWwgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlR5cGUiKSAmJiAhaXNOYW1lKGxhYmVsRGljdC5nZXQoIlR5cGUiKSwgIlBhZ2VMYWJlbCIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgdHlwZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlMiKSkgewogICAgICAgICAgY29uc3QgcyA9IGxhYmVsRGljdC5nZXQoIlMiKTsKICAgICAgICAgIGlmICghKHMgaW5zdGFuY2VvZiBOYW1lKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgc3R5bGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZSA9IHMubmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3R5bGUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiUCIpKSB7CiAgICAgICAgICBjb25zdCBwID0gbGFiZWxEaWN0LmdldCgiUCIpOwogICAgICAgICAgaWYgKHR5cGVvZiBwICE9PSAic3RyaW5nIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgcHJlZml4IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgcHJlZml4ID0gc3RyaW5nVG9QREZTdHJpbmcocCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByZWZpeCA9ICIiOwogICAgICAgIH0KICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiU3QiKSkgewogICAgICAgICAgY29uc3Qgc3QgPSBsYWJlbERpY3QuZ2V0KCJTdCIpOwogICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihzdCkgJiYgc3QgPj0gMSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIHN0YXJ0IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudEluZGV4ID0gc3Q7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRJbmRleCA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN3aXRjaCAoc3R5bGUpIHsKICAgICAgICBjYXNlICJEIjoKICAgICAgICAgIGN1cnJlbnRMYWJlbCA9IGN1cnJlbnRJbmRleDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlIiOgogICAgICAgIGNhc2UgInIiOgogICAgICAgICAgY3VycmVudExhYmVsID0gdG9Sb21hbk51bWVyYWxzKGN1cnJlbnRJbmRleCwgc3R5bGUgPT09ICJyIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJBIjoKICAgICAgICBjYXNlICJhIjoKICAgICAgICAgIGNvbnN0IExJTUlUID0gMjY7CiAgICAgICAgICBjb25zdCBBX1VQUEVSX0NBU0UgPSAweDQxLAogICAgICAgICAgICB
20BX0xPV0VSX0NBU0UgPSAweDYxOwogICAgICAgICAgY29uc3QgYmFzZUNoYXJDb2RlID0gc3R5bGUgPT09ICJhIiA/IEFfTE9XRVJfQ0FTRSA6IEFfVVBQRVJfQ0FTRTsKICAgICAgICAgIGNvbnN0IGxldHRlckluZGV4ID0gY3VycmVudEluZGV4IC0gMTsKICAgICAgICAgIGNvbnN0IGNoYXJhY3RlciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYmFzZUNoYXJDb2RlICsgbGV0dGVySW5kZXggJSBMSU1JVCk7CiAgICAgICAgICBjdXJyZW50TGFiZWwgPSBjaGFyYWN0ZXIucmVwZWF0KE1hdGguZmxvb3IobGV0dGVySW5kZXggLyBMSU1JVCkgKyAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAoc3R5bGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBJbnZhbGlkIHN0eWxlICIke3N0eWxlfSIgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuYCk7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50TGFiZWwgPSAiIjsKICAgICAgfQogICAgICBwYWdlTGFiZWxzW2ldID0gcHJlZml4ICsgY3VycmVudExhYmVsOwogICAgICBjdXJyZW50SW5kZXgrKzsKICAgIH0KICAgIHJldHVybiBwYWdlTGFiZWxzOwogIH0KICBnZXQgcGFnZUxheW91dCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlTGF5b3V0Iik7CiAgICBsZXQgcGFnZUxheW91dCA9ICIiOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgc3dpdGNoIChvYmoubmFtZSkgewogICAgICAgIGNhc2UgIlNpbmdsZVBhZ2UiOgogICAgICAgIGNhc2UgIk9uZUNvbHVtbiI6CiAgICAgICAgY2FzZSAiVHdvQ29sdW1uTGVmdCI6CiAgICAgICAgY2FzZSAiVHdvQ29sdW1uUmlnaHQiOgogICAgICAgIGNhc2UgIlR3b1BhZ2VMZWZ0IjoKICAgICAgICBjYXNlICJUd29QYWdlUmlnaHQiOgogICAgICAgICAgcGFnZUxheW91dCA9IG9iai5uYW1lOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJwYWdlTGF5b3V0IiwgcGFnZUxheW91dCk7CiAgfQogIGdldCBwYWdlTW9kZSgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlTW9kZSIpOwogICAgbGV0IHBhZ2VNb2RlID0gIlVzZU5vbmUiOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgc3dpdGNoIChvYmoubmFtZSkgewogICAgICAgIGNhc2UgIlVzZU5vbmUiOgogICAgICAgIGNhc2UgIlVzZU91dGxpbmVzIjoKICAgICAgICBjYXNlICJVc2VUaHVtYnMiOgogICAgICAgIGNhc2UgIkZ1bGxTY3JlZW4iOgogICAgICAgIGNhc2UgIlVzZU9DIjoKICAgICAgICBjYXNlICJVc2VBdHRhY2htZW50cyI6CiAgICAgICAgICBwYWdlTW9kZSA9IG9iai5uYW1lOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJwYWdlTW9kZSIsIHBhZ2VNb2RlKTsKICB9CiAgZ2V0IHZpZXdlclByZWZlcmVuY2VzKCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIlZpZXdlclByZWZlcmVuY2VzIik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2aWV3ZXJQcmVmZXJlbmNlcyIsIG51bGwpOwogICAgfQogICAgbGV0IHByZWZzID0gbnVsbDsKICAgIGZvciAoY29uc3Qga2V5IG9mIG9iai5nZXRLZXlzKCkpIHsKICAgICAgY29uc3QgdmFsdWUgPSBvYmouZ2V0KGtleSk7CiAgICAgIGxldCBwcmVmVmFsdWU7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiSGlkZVRvb2xiYXIiOgogICAgICAgIGNhc2UgIkhpZGVNZW51YmFyIjoKICAgICAgICBjYXNlICJIaWRlV2luZG93VUkiOgogICAgICAgIGNhc2UgIkZpdFdpbmRvdyI6CiAgICAgICAgY2FzZSAiQ2VudGVyV2luZG93IjoKICAgICAgICBjYXNlICJEaXNwbGF5RG9jVGl0bGUiOgogICAgICAgIGNhc2UgIlBpY2tUcmF5QnlQREZTaXplIjoKICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJib29sZWFuIikgewogICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk5vbkZ1bGxTY3JlZW5QYWdlTW9kZSI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIlVzZU5vbmUiOgogICAgICAgICAgICAgIGNhc2UgIlVzZU91dGxpbmVzIjoKICAgICAgICAgICAgICBjYXNlICJVc2VUaHVtYnMiOgogICAgICAgICAgICAgIGNhc2UgIlVzZU9DIjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIlVzZU5vbmUiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJEaXJlY3Rpb24iOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJMMlIiOgogICAgICAgICAgICAgIGNhc2UgIlIyTCI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJMMlIiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJWaWV3QXJlYSI6CiAgICAgICAgY2FzZSAiVmlld0NsaXAiOgogICAgICAgIGNhc2UgIlByaW50QXJlYSI6CiAgICAgICAgY2FzZSAiUHJpbnRDbGlwIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS
205uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiTWVkaWFCb3giOgogICAgICAgICAgICAgIGNhc2UgIkNyb3BCb3giOgogICAgICAgICAgICAgIGNhc2UgIkJsZWVkQm94IjoKICAgICAgICAgICAgICBjYXNlICJUcmltQm94IjoKICAgICAgICAgICAgICBjYXNlICJBcnRCb3giOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiQ3JvcEJveCI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlByaW50U2NhbGluZyI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIk5vbmUiOgogICAgICAgICAgICAgIGNhc2UgIkFwcERlZmF1bHQiOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiQXBwRGVmYXVsdCI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkR1cGxleCI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIlNpbXBsZXgiOgogICAgICAgICAgICAgIGNhc2UgIkR1cGxleEZsaXBTaG9ydEVkZ2UiOgogICAgICAgICAgICAgIGNhc2UgIkR1cGxleEZsaXBMb25nRWRnZSI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJOb25lIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUHJpbnRQYWdlUmFuZ2UiOgogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCAlIDIgPT09IDApIHsKICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbHVlLmV2ZXJ5KChwYWdlLCBpLCBhcnIpID0+IE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+IDAgJiYgKGkgPT09IDAgfHwgcGFnZSA+PSBhcnJbaSAtIDFdKSAmJiBwYWdlIDw9IHRoaXMubnVtUGFnZXMpOwogICAgICAgICAgICBpZiAoaXNWYWxpZCkgewogICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJOdW1Db3BpZXMiOgogICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID4gMCkgewogICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB3YXJuKGBJZ25vcmluZyBub24tc3RhbmRhcmQga2V5IGluIFZpZXdlclByZWZlcmVuY2VzOiAke2tleX0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocHJlZlZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3YXJuKGBCYWQgdmFsdWUsIGZvciBrZXkgIiR7a2V5fSIsIGluIFZpZXdlclByZWZlcmVuY2VzOiAke3ZhbHVlfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoIXByZWZzKSB7CiAgICAgICAgcHJlZnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICB9CiAgICAgIHByZWZzW2tleV0gPSBwcmVmVmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2aWV3ZXJQcmVmZXJlbmNlcyIsIHByZWZzKTsKICB9CiAgZ2V0IG9wZW5BY3Rpb24oKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiT3BlbkFjdGlvbiIpOwogICAgY29uc3Qgb3BlbkFjdGlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBkZXN0RGljdCA9IG5ldyBEaWN0KHRoaXMueHJlZik7CiAgICAgIGRlc3REaWN0LnNldCgiQSIsIG9iaik7CiAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHsKICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgZGVzdDogbnVsbCwKICAgICAgICBhY3Rpb246IG51bGwKICAgICAgfTsKICAgICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgICBkZXN0RGljdCwKICAgICAgICByZXN1bHRPYmoKICAgICAgfSk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdE9iai5kZXN0KSkgewogICAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IHJlc3VsdE9iai5kZXN0OwogICAgICB9IGVsc2UgaWYgKHJlc3VsdE9iai5hY3Rpb24pIHsKICAgICAgICBvcGVuQWN0aW9uLmFjdGlvbiA9IHJlc3VsdE9iai5hY3Rpb247CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CiAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IG9iajsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm9wZW5BY3Rpb24iLCBvYmplY3RTaXplKG9wZW5BY3Rpb24pID4gMCA/IG9wZW5BY3Rpb24gOiBudWxsKTsKICB9CiAgZ2V0IGF0dGFjaG1lbnRzKCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgYXR0YWNobWVudHMgPSBudWxsOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QgJiYgb2JqLmhhcygiRW1iZWRkZWRGaWxlcyIpKSB7CiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkVtYmVkZGVkRmlsZXMiKSwgdGhpcy54cmVmKTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmFtZVRyZWUuZ2V0QWxsKCkpIHsKICAgICAgICBjb25zdCBmcyA9IG5ldyBGaWxlU3BlYyh2YWx1ZSwgdGhpcy54cmVmKTsKICAgICAgICBpZiAoIWF0dGFjaG1lbnRzKSB7CiAgICAgICAgICBhdHRhY2htZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGF0dGFjaG1lbnRzW3N0cmluZ1RvUERGU3RyaW5nKGtleSldID0gZnMuc2VyaWFsaXphYmxlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhdHRhY2htZW50cyIsIGF0dGFjaG1lbnRzKTsKICB9CiAgZ2V0IHhmYUltYWdlcygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOwogICAgbGV0IHhmYUltYWdlcyA9IG51bGw7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCAmJiBvYmouaGFzKCJYRkFJbWFnZXMiKSkgewogICAgICBjb25zdCBuYW1lVHJlZSA9IG5ldyBOYW1lVHJlZShvYmouZ2V0UmF3KCJYRkFJbWFnZXMiKSwgdGh
20pcy54cmVmKTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmFtZVRyZWUuZ2V0QWxsKCkpIHsKICAgICAgICBpZiAoIXhmYUltYWdlcykgewogICAgICAgICAgeGZhSW1hZ2VzID0gbmV3IERpY3QodGhpcy54cmVmKTsKICAgICAgICB9CiAgICAgICAgeGZhSW1hZ2VzLnNldChzdHJpbmdUb1BERlN0cmluZyhrZXkpLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYUltYWdlcyIsIHhmYUltYWdlcyk7CiAgfQogIF9jb2xsZWN0SmF2YVNjcmlwdCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOwogICAgbGV0IGphdmFTY3JpcHQgPSBudWxsOwogICAgZnVuY3Rpb24gYXBwZW5kSWZKYXZhU2NyaXB0RGljdChuYW1lLCBqc0RpY3QpIHsKICAgICAgaWYgKCEoanNEaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFpc05hbWUoanNEaWN0LmdldCgiUyIpLCAiSmF2YVNjcmlwdCIpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBqcyA9IGpzRGljdC5nZXQoIkpTIik7CiAgICAgIGlmIChqcyBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgICBqcyA9IGpzLmdldFN0cmluZygpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBqcyAhPT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAganMgPSBzdHJpbmdUb1BERlN0cmluZyhqcykucmVwbGFjZUFsbCgiXHgwMCIsICIiKTsKICAgICAgaWYgKGpzKSB7CiAgICAgICAgKGphdmFTY3JpcHQgfHw9IG5ldyBNYXAoKSkuc2V0KG5hbWUsIGpzKTsKICAgICAgfQogICAgfQogICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QgJiYgb2JqLmhhcygiSmF2YVNjcmlwdCIpKSB7CiAgICAgIGNvbnN0IG5hbWVUcmVlID0gbmV3IE5hbWVUcmVlKG9iai5nZXRSYXcoIkphdmFTY3JpcHQiKSwgdGhpcy54cmVmKTsKICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmFtZVRyZWUuZ2V0QWxsKCkpIHsKICAgICAgICBhcHBlbmRJZkphdmFTY3JpcHREaWN0KHN0cmluZ1RvUERGU3RyaW5nKGtleSksIHZhbHVlKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgb3BlbkFjdGlvbiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJPcGVuQWN0aW9uIik7CiAgICBpZiAob3BlbkFjdGlvbikgewogICAgICBhcHBlbmRJZkphdmFTY3JpcHREaWN0KCJPcGVuQWN0aW9uIiwgb3BlbkFjdGlvbik7CiAgICB9CiAgICByZXR1cm4gamF2YVNjcmlwdDsKICB9CiAgZ2V0IGpzQWN0aW9ucygpIHsKICAgIGNvbnN0IGphdmFTY3JpcHQgPSB0aGlzLl9jb2xsZWN0SmF2YVNjcmlwdCgpOwogICAgbGV0IGFjdGlvbnMgPSBjb2xsZWN0QWN0aW9ucyh0aGlzLnhyZWYsIHRoaXMuX2NhdERpY3QsIERvY3VtZW50QWN0aW9uRXZlbnRUeXBlKTsKICAgIGlmIChqYXZhU2NyaXB0KSB7CiAgICAgIGFjdGlvbnMgfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBqYXZhU2NyaXB0KSB7CiAgICAgICAgaWYgKGtleSBpbiBhY3Rpb25zKSB7CiAgICAgICAgICBhY3Rpb25zW2tleV0ucHVzaCh2YWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhY3Rpb25zW2tleV0gPSBbdmFsXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgImpzQWN0aW9ucyIsIGFjdGlvbnMpOwogIH0KICBhc3luYyBmb250RmFsbGJhY2soaWQsIGhhbmRsZXIpIHsKICAgIGNvbnN0IHRyYW5zbGF0ZWRGb250cyA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZm9udENhY2hlKTsKICAgIGZvciAoY29uc3QgdHJhbnNsYXRlZEZvbnQgb2YgdHJhbnNsYXRlZEZvbnRzKSB7CiAgICAgIGlmICh0cmFuc2xhdGVkRm9udC5sb2FkZWROYW1lID09PSBpZCkgewogICAgICAgIHRyYW5zbGF0ZWRGb250LmZhbGxiYWNrKGhhbmRsZXIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBjbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkID0gZmFsc2UpIHsKICAgIGNsZWFyR2xvYmFsQ2FjaGVzKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuY2xlYXIobWFudWFsbHlUcmlnZ2VyZWQpOwogICAgdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZUluZGV4Q2FjaGUuY2xlYXIoKTsKICAgIHRoaXMucGFnZURpY3RDYWNoZS5jbGVhcigpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0LmNsZWFyKCk7CiAgICBjb25zdCB0cmFuc2xhdGVkRm9udHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZvbnRDYWNoZSk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZGljdAogICAgfSBvZiB0cmFuc2xhdGVkRm9udHMpIHsKICAgICAgZGVsZXRlIGRpY3QuY2FjaGVLZXk7CiAgICB9CiAgICB0aGlzLmZvbnRDYWNoZS5jbGVhcigpOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlLmNsZWFyKCk7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUuY2xlYXIoKTsKICB9CiAgYXN5bmMgZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CiAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbdGhpcy50b3BsZXZlbFBhZ2VzRGljdF07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgcGFnZUtpZHNDb3VudENhY2hlID0gdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsCiAgICAgIHBhZ2VJbmRleENhY2hlID0gdGhpcy5wYWdlSW5kZXhDYWNoZSwKICAgICAgcGFnZURpY3RDYWNoZSA9IHRoaXMucGFnZURpY3RDYWNoZTsKICAgIGxldCBjdXJyZW50UGFnZUluZGV4ID0gMDsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBjb25zdCBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWN
20oZS5nZXQoY3VycmVudE5vZGUpOwogICAgICAgIGlmIChjb3VudCA+PSAwICYmIGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICBjb25zdCBvYmogPSBhd2FpdCAocGFnZURpY3RDYWNoZS5nZXQoY3VycmVudE5vZGUpIHx8IHhyZWYuZmV0Y2hBc3luYyhjdXJyZW50Tm9kZSkpOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgICAgICBpZiAoIXBhZ2VLaWRzQ291bnRDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChjdXJyZW50Tm9kZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwYWdlSW5kZXhDYWNoZS5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgcGFnZUluZGV4Q2FjaGUucHV0KGN1cnJlbnROb2RlLCBjdXJyZW50UGFnZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtvYmosIGN1cnJlbnROb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2Rlc1RvVmlzaXQucHVzaChvYmopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC4iKTsKICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgb2JqSWQKICAgICAgfSA9IGN1cnJlbnROb2RlOwogICAgICBsZXQgY291bnQgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIkNvdW50Iik7CiAgICAgIGlmIChjb3VudCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGNvdW50ID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGNvdW50KTsKICAgICAgfQogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihjb3VudCkgJiYgY291bnQgPj0gMCkgewogICAgICAgIGlmIChvYmpJZCAmJiAhcGFnZUtpZHNDb3VudENhY2hlLmhhcyhvYmpJZCkpIHsKICAgICAgICAgIHBhZ2VLaWRzQ291bnRDYWNoZS5wdXQob2JqSWQsIGNvdW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICBraWRzID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZHMpOwogICAgICB9CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgIGxldCB0eXBlID0gY3VycmVudE5vZGUuZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc05hbWUodHlwZSwgIlBhZ2UiKSB8fCAhY3VycmVudE5vZGUuaGFzKCJLaWRzIikpIHsKICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIFtjdXJyZW50Tm9kZSwgbnVsbF07CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50UGFnZUluZGV4Kys7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpOwogICAgICB9CiAgICAgIGZvciAobGV0IGxhc3QgPSBraWRzLmxlbmd0aCAtIDE7IGxhc3QgPj0gMDsgbGFzdC0tKSB7CiAgICAgICAgY29uc3QgbGFzdEtpZCA9IGtpZHNbbGFzdF07CiAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gobGFzdEtpZCk7CiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09PSB0aGlzLnRvcGxldmVsUGFnZXNEaWN0ICYmIGxhc3RLaWQgaW5zdGFuY2VvZiBSZWYgJiYgIXBhZ2VEaWN0Q2FjaGUuaGFzKGxhc3RLaWQpKSB7CiAgICAgICAgICBwYWdlRGljdENhY2hlLnB1dChsYXN0S2lkLCB4cmVmLmZldGNoQXN5bmMobGFzdEtpZCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBQYWdlIGluZGV4ICR7cGFnZUluZGV4fSBub3QgZm91bmQuYCk7CiAgfQogIGFzeW5jIGdldEFsbFBhZ2VEaWN0cyhyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3QgewogICAgICBpZ25vcmVFcnJvcnMKICAgIH0gPSB0aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9uczsKICAgIGNvbnN0IHF1ZXVlID0gW3sKICAgICAgY3VycmVudE5vZGU6IHRoaXMudG9wbGV2ZWxQYWdlc0RpY3QsCiAgICAgIHBvc0luS2lkczogMAogICAgfV07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgI
20HZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpLAogICAgICB4cmVmID0gdGhpcy54cmVmLAogICAgICBwYWdlSW5kZXhDYWNoZSA9IHRoaXMucGFnZUluZGV4Q2FjaGU7CiAgICBsZXQgcGFnZUluZGV4ID0gMDsKICAgIGZ1bmN0aW9uIGFkZFBhZ2VEaWN0KHBhZ2VEaWN0LCBwYWdlUmVmKSB7CiAgICAgIGlmIChwYWdlUmVmICYmICFwYWdlSW5kZXhDYWNoZS5oYXMocGFnZVJlZikpIHsKICAgICAgICBwYWdlSW5kZXhDYWNoZS5wdXQocGFnZVJlZiwgcGFnZUluZGV4KTsKICAgICAgfQogICAgICBtYXAuc2V0KHBhZ2VJbmRleCsrLCBbcGFnZURpY3QsIHBhZ2VSZWZdKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFBhZ2VFcnJvcihlcnJvcikgewogICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9CiAgICAgIGlmIChyZWNvdmVyeU1vZGUgJiYgaWdub3JlRXJyb3JzICYmIHBhZ2VJbmRleCA9PT0gMCkgewogICAgICAgIHdhcm4oYGdldEFsbFBhZ2VEaWN0cyAtIFNraXBwaW5nIGludmFsaWQgZmlyc3QgcGFnZTogIiR7ZXJyb3J9Ii5gKTsKICAgICAgICBlcnJvciA9IERpY3QuZW1wdHk7CiAgICAgIH0KICAgICAgbWFwLnNldChwYWdlSW5kZXgrKywgW2Vycm9yLCBudWxsXSk7CiAgICB9CiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBxdWV1ZS5hdCgtMSk7CiAgICAgIGNvbnN0IHsKICAgICAgICBjdXJyZW50Tm9kZSwKICAgICAgICBwb3NJbktpZHMKICAgICAgfSA9IHF1ZXVlSXRlbTsKICAgICAgbGV0IGtpZHMgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIktpZHMiKTsKICAgICAgaWYgKGtpZHMgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAga2lkcyA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhraWRzKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBhZGRQYWdlRXJyb3IobmV3IEZvcm1hdEVycm9yKCJQYWdlIGRpY3Rpb25hcnkga2lkcyBvYmplY3QgaXMgbm90IGFuIGFycmF5LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocG9zSW5LaWRzID49IGtpZHMubGVuZ3RoKSB7CiAgICAgICAgcXVldWUucG9wKCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qga2lkT2JqID0ga2lkc1twb3NJbktpZHNdOwogICAgICBsZXQgb2JqOwogICAgICBpZiAoa2lkT2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoa2lkT2JqKSkgewogICAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZXMgdHJlZSBjb250YWlucyBjaXJjdWxhciByZWZlcmVuY2UuIikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHZpc2l0ZWROb2Rlcy5wdXQoa2lkT2JqKTsKICAgICAgICB0cnkgewogICAgICAgICAgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKGtpZE9iaik7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqID0ga2lkT2JqOwogICAgICB9CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBGb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAgdHlwZSA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyh0eXBlKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgYWRkUGFnZUVycm9yKGV4KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNOYW1lKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGFkZFBhZ2VEaWN0KG9iaiwga2lkT2JqIGluc3RhbmNlb2YgUmVmID8ga2lkT2JqIDogbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBjdXJyZW50Tm9kZTogb2JqLAogICAgICAgICAgcG9zSW5LaWRzOiAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcXVldWVJdGVtLnBvc0luS2lkcysrOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHsKICAgIGNvbnN0IGNhY2hlZFBhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KHBhZ2VSZWYpOwogICAgaWYgKGNhY2hlZFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUGFnZUluZGV4KTsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZi
20hraWRSZWYpIHsKICAgICAgbGV0IHRvdGFsID0gMCwKICAgICAgICBwYXJlbnRSZWY7CiAgICAgIHJldHVybiB4cmVmLmZldGNoQXN5bmMoa2lkUmVmKS50aGVuKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZFJlZiwgcGFnZVJlZikgJiYgIWlzRGljdChub2RlLCAiUGFnZSIpICYmICEobm9kZSBpbnN0YW5jZW9mIERpY3QgJiYgIW5vZGUuaGFzKCJUeXBlIikgJiYgbm9kZS5oYXMoIkNvbnRlbnRzIikpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIlRoZSByZWZlcmVuY2UgZG9lcyBub3QgcG9pbnQgdG8gYSAvUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiTm9kZSBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgcGFyZW50UmVmID0gbm9kZS5nZXRSYXcoIlBhcmVudCIpOwogICAgICAgIHJldHVybiBub2RlLmdldEFzeW5jKCJQYXJlbnQiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAocGFyZW50KSB7CiAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJQYXJlbnQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QXN5bmMoIktpZHMiKTsKICAgICAgfSkudGhlbihmdW5jdGlvbiAoa2lkcykgewogICAgICAgIGlmICgha2lkcykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGtpZFByb21pc2VzID0gW107CiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgICAgaWYgKCEoa2lkIGluc3RhbmNlb2YgUmVmKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBtdXN0IGJlIGEgcmVmZXJlbmNlLiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzUmVmc0VxdWFsKGtpZCwga2lkUmVmKSkgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAga2lkUHJvbWlzZXMucHVzaCh4cmVmLmZldGNoQXN5bmMoa2lkKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmouaGFzKCJDb3VudCIpKSB7CiAgICAgICAgICAgICAgdG90YWwgKz0gb2JqLmdldCgiQ291bnQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiS2lkIHJlZmVyZW5jZSBub3QgZm91bmQgaW4gcGFyZW50J3Mga2lkcy4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBbdG90YWwsIHBhcmVudFJlZl07CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgbGV0IHRvdGFsID0gMDsKICAgIGNvbnN0IG5leHQgPSByZWYgPT4gcGFnZXNCZWZvcmVSZWYocmVmKS50aGVuKGFyZ3MgPT4gewogICAgICBpZiAoIWFyZ3MpIHsKICAgICAgICB0aGlzLnBhZ2VJbmRleENhY2hlLnB1dChwYWdlUmVmLCB0b3RhbCk7CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgICB9CiAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7CiAgICAgIHRvdGFsICs9IGNvdW50OwogICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOwogICAgfSk7CiAgICByZXR1cm4gbmV4dChwYWdlUmVmKTsKICB9CiAgZ2V0IGJhc2VVcmwoKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLl9jYXREaWN0LmdldCgiVVJJIik7CiAgICBpZiAodXJpIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBiYXNlID0gdXJpLmdldCgiQmFzZSIpOwogICAgICBpZiAodHlwZW9mIGJhc2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKGJhc2UsIG51bGwsIHsKICAgICAgICAgIHRyeUNvbnZlcnRFbmNvZGluZzogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIGFic29sdXRlVXJsLmhyZWYpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYmFzZVVybCIsIHRoaXMucGRmTWFuYWdlci5kb2NCYXNlVXJsKTsKICB9CiAgc3RhdGljIHBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgZGVzdERpY3QsCiAgICByZXN1bHRPYmosCiAgICBkb2NCYXNlVXJsID0gbnVsbCwKICAgIGRvY0F0dGFjaG1lbnRzID0gbnVsbAogIH0pIHsKICAgIGlmICghKGRlc3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogYGRlc3REaWN0YCBtdXN0IGJlIGEgZGljdGlvbmFyeS4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldCgiQSIpLAogICAgICB1cmwsCiAgICAgIGRlc3Q7CiAgICBpZiAoIShhY3Rpb24gaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkFBIik7CiAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgIGlmIChhY3Rpb24uaGFzKCJEIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiRCIpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaGFzKCJVIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiVSIpOwogICAgICAgICAgfQogICAgICAgI
20H0KICAgICAgfQogICAgfQogICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbi5nZXQoIlMiKTsKICAgICAgaWYgKCEoYWN0aW9uVHlwZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgICAgd2FybigicGFyc2VEZXN0RGljdGlvbmFyeTogSW52YWxpZCB0eXBlIGluIEFjdGlvbiBkaWN0aW9uYXJ5LiIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZS5uYW1lOwogICAgICBzd2l0Y2ggKGFjdGlvbk5hbWUpIHsKICAgICAgICBjYXNlICJSZXNldEZvcm0iOgogICAgICAgICAgY29uc3QgZmxhZ3MgPSBhY3Rpb24uZ2V0KCJGbGFncyIpOwogICAgICAgICAgY29uc3QgaW5jbHVkZSA9ICgodHlwZW9mIGZsYWdzID09PSAibnVtYmVyIiA/IGZsYWdzIDogMCkgJiAxKSA9PT0gMDsKICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IFtdOwogICAgICAgICAgY29uc3QgcmVmcyA9IFtdOwogICAgICAgICAgZm9yIChjb25zdCBvYmogb2YgYWN0aW9uLmdldCgiRmllbGRzIikgfHwgW10pIHsKICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgICAgIHJlZnMucHVzaChvYmoudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBmaWVsZHMucHVzaChzdHJpbmdUb1BERlN0cmluZyhvYmopKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0T2JqLnJlc2V0Rm9ybSA9IHsKICAgICAgICAgICAgZmllbGRzLAogICAgICAgICAgICByZWZzLAogICAgICAgICAgICBpbmNsdWRlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVVJJIjoKICAgICAgICAgIHVybCA9IGFjdGlvbi5nZXQoIlVSSSIpOwogICAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgdXJsID0gIi8iICsgdXJsLm5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJHb1RvIjoKICAgICAgICAgIGRlc3QgPSBhY3Rpb24uZ2V0KCJEIik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJMYXVuY2giOgogICAgICAgIGNhc2UgIkdvVG9SIjoKICAgICAgICAgIGNvbnN0IHVybERpY3QgPSBhY3Rpb24uZ2V0KCJGIik7CiAgICAgICAgICBpZiAodXJsRGljdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgZnMgPSBuZXcgRmlsZVNwZWModXJsRGljdCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICByYXdGaWxlbmFtZQogICAgICAgICAgICB9ID0gZnMuc2VyaWFsaXphYmxlOwogICAgICAgICAgICB1cmwgPSByYXdGaWxlbmFtZTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybERpY3QgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHVybCA9IHVybERpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZW1vdGVEZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICBpZiAocmVtb3RlRGVzdCAmJiB0eXBlb2YgdXJsID09PSAic3RyaW5nIikgewogICAgICAgICAgICB1cmwgPSB1cmwuc3BsaXQoIiMiLCAxKVswXSArICIjIiArIHJlbW90ZURlc3Q7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBuZXdXaW5kb3cgPSBhY3Rpb24uZ2V0KCJOZXdXaW5kb3ciKTsKICAgICAgICAgIGlmICh0eXBlb2YgbmV3V2luZG93ID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcmVzdWx0T2JqLm5ld1dpbmRvdyA9IG5ld1dpbmRvdzsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkdvVG9FIjoKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGFjdGlvbi5nZXQoIlQiKTsKICAgICAgICAgIGxldCBhdHRhY2htZW50OwogICAgICAgICAgaWYgKGRvY0F0dGFjaG1lbnRzICYmIHRhcmdldCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gdGFyZ2V0LmdldCgiUiIpOwogICAgICAgICAgICBjb25zdCBuYW1lID0gdGFyZ2V0LmdldCgiTiIpOwogICAgICAgICAgICBpZiAoaXNOYW1lKHJlbGF0aW9uc2hpcCwgIkMiKSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBhdHRhY2htZW50ID0gZG9jQXR0YWNobWVudHNbc3RyaW5nVG9QREZTdHJpbmcobmFtZSldOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYXR0YWNobWVudCkgewogICAgICAgICAgICByZXN1bHRPYmouYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7CiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnREZXN0ID0gZmV0Y2hSZW1vdGVEZXN0KGFjdGlvbik7CiAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzdCkgewogICAgICAgICAgICAgIHJlc3VsdE9iai5hdHRhY2htZW50RGVzdCA9IGF0dGFjaG1lbnREZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5pbXBsZW1lbnRlZCAiR29Ub0UiIGFjdGlvbi5gKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk5hbWVkIjoKICAgICAgICAgIGNvbnN0IG5hbWVkQWN0aW9uID0gYWN0aW9uLmdldCgiTiIpOwogICAgICAgICAgaWYgKG5hbWVkQWN0aW9uIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICByZXN1bHRPYmouYWN0aW9uID0gbmFtZWRBY3Rpb24ubmFtZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlNldE9DR1N0YXRlIjoKICAgICAgICAgIGNvbnN0IHN0YXRlID0gYWN0aW9uLmdldCgiU3RhdGUiKTsKICAgICAgICAgIGNvbnN0IHByZXNlcnZlUkIgPSBhY3Rpb24uZ2V0KCJQcmVzZXJ2ZVJCIik7CiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGUpIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHN0YXRlQXJyID0gW107CiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2Ygc3RhdGUpIHsKICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtLm5hbWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgIk9OIjoKICAgICAgICAgICAgICAgIGNhc2UgIk9GRiI6CiAgICAgICAgICAgICAgICBjYXNlICJUb2dnbGUiOgogICAgICAgICAgICAgICAgICBzdGF0ZUFyci5wdXNoKGVsZW0ubmFtZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgI
20H0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICAgICAgc3RhdGVBcnIucHVzaChlbGVtLnRvU3RyaW5nKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGVBcnIubGVuZ3RoICE9PSBzdGF0ZS5sZW5ndGgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHRPYmouc2V0T0NHU3RhdGUgPSB7CiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZUFyciwKICAgICAgICAgICAgcHJlc2VydmVSQjogdHlwZW9mIHByZXNlcnZlUkIgPT09ICJib29sZWFuIiA/IHByZXNlcnZlUkIgOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiSmF2YVNjcmlwdCI6CiAgICAgICAgICBjb25zdCBqc0FjdGlvbiA9IGFjdGlvbi5nZXQoIkpTIik7CiAgICAgICAgICBsZXQganM7CiAgICAgICAgICBpZiAoanNBY3Rpb24gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgICAgIGpzID0ganNBY3Rpb24uZ2V0U3RyaW5nKCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBqc0FjdGlvbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAganMgPSBqc0FjdGlvbjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGpzVVJMID0ganMgJiYgcmVjb3ZlckpzVVJMKHN0cmluZ1RvUERGU3RyaW5nKGpzKSk7CiAgICAgICAgICBpZiAoanNVUkwpIHsKICAgICAgICAgICAgdXJsID0ganNVUkwudXJsOwogICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0ganNVUkwubmV3V2luZG93OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICJKYXZhU2NyaXB0IiB8fCBhY3Rpb25OYW1lID09PSAiU3VibWl0Rm9ybSIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB3YXJuKGBwYXJzZURlc3REaWN0aW9uYXJ5IC0gdW5zdXBwb3J0ZWQgYWN0aW9uOiAiJHthY3Rpb25OYW1lfSIuYCk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBlbHNlIGlmIChkZXN0RGljdC5oYXMoIkRlc3QiKSkgewogICAgICBkZXN0ID0gZGVzdERpY3QuZ2V0KCJEZXN0Iik7CiAgICB9CiAgICBpZiAodHlwZW9mIHVybCA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgZG9jQmFzZVVybCwgewogICAgICAgIGFkZERlZmF1bHRQcm90b2NvbDogdHJ1ZSwKICAgICAgICB0cnlDb252ZXJ0RW5jb2Rpbmc6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICAgIHJlc3VsdE9iai51cmwgPSBhYnNvbHV0ZVVybC5ocmVmOwogICAgICB9CiAgICAgIHJlc3VsdE9iai51bnNhZmVVcmwgPSB1cmw7CiAgICB9CiAgICBpZiAoZGVzdCkgewogICAgICBpZiAoZGVzdCBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICBkZXN0ID0gZGVzdC5uYW1lOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IHN0cmluZ1RvUERGU3RyaW5nKGRlc3QpOwogICAgICB9IGVsc2UgaWYgKGlzVmFsaWRFeHBsaWNpdERlc3QoZGVzdCkpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IGRlc3Q7CiAgICAgIH0KICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL29iamVjdF9sb2FkZXIuanMKCgoKCgpmdW5jdGlvbiBtYXlIYXZlQ2hpbGRyZW4odmFsdWUpIHsKICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBSZWYgfHwgdmFsdWUgaW5zdGFuY2VvZiBEaWN0IHx8IHZhbHVlIGluc3RhbmNlb2YgQmFzZVN0cmVhbSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKTsKfQpmdW5jdGlvbiBhZGRDaGlsZHJlbihub2RlLCBub2Rlc1RvVmlzaXQpIHsKICBpZiAobm9kZSBpbnN0YW5jZW9mIERpY3QpIHsKICAgIG5vZGUgPSBub2RlLmdldFJhd1ZhbHVlcygpOwogIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIG5vZGUgPSBub2RlLmRpY3QuZ2V0UmF3VmFsdWVzKCk7CiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShub2RlKSkgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGNvbnN0IHJhd1ZhbHVlIG9mIG5vZGUpIHsKICAgIGlmIChtYXlIYXZlQ2hpbGRyZW4ocmF3VmFsdWUpKSB7CiAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTsKICAgIH0KICB9Cn0KY2xhc3MgT2JqZWN0TG9hZGVyIHsKICBjb25zdHJ1Y3RvcihkaWN0LCBrZXlzLCB4cmVmKSB7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5rZXlzID0ga2V5czsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLnJlZlNldCA9IG51bGw7CiAgfQogIGFzeW5jIGxvYWQoKSB7CiAgICBpZiAodGhpcy54cmVmLnN0cmVhbS5pc0RhdGFMb2FkZWQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAga2V5cywKICAgICAgZGljdAogICAgfSA9IHRoaXM7CiAgICB0aGlzLnJlZlNldCA9IG5ldyBSZWZTZXQoKTsKICAgIGNvbnN0IG5vZGVzVG9WaXNpdCA9IFtdOwogICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICBjb25zdCByYXdWYWx1ZSA9IGRpY3QuZ2V0UmF3KGtleSk7CiAgICAgIGlmIChyYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gocmF3VmFsdWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5fd2Fsayhub2Rlc1RvVmlzaXQpOwogIH0KICBhc3luYyBfd2Fsayhub2Rlc1RvVmlzaXQpIHsKICAgIGNvbnN0IG5vZGVzVG9SZXZpc2l0ID0gW107CiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSBbXTsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9WaXNpdC5wb3AoKTsKICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgaWYgKHRoaXMucmVmU2V0LmhhcyhjdXJyZW50Tm9kZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgI
20H0KICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5yZWZTZXQucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICAgIGN1cnJlbnROb2RlID0gdGhpcy54cmVmLmZldGNoKGN1cnJlbnROb2RlKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKICAgICAgICAgICAgd2FybihgT2JqZWN0TG9hZGVyLl93YWxrIC0gcmVxdWVzdGluZyBhbGwgZGF0YTogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgdGhpcy5yZWZTZXQgPSBudWxsOwogICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgbWFuYWdlcgogICAgICAgICAgICB9ID0gdGhpcy54cmVmLnN0cmVhbTsKICAgICAgICAgICAgcmV0dXJuIG1hbmFnZXIucmVxdWVzdEFsbENodW5rcygpOwogICAgICAgICAgfQogICAgICAgICAgbm9kZXNUb1JldmlzaXQucHVzaChjdXJyZW50Tm9kZSk7CiAgICAgICAgICBwZW5kaW5nUmVxdWVzdHMucHVzaCh7CiAgICAgICAgICAgIGJlZ2luOiBleC5iZWdpbiwKICAgICAgICAgICAgZW5kOiBleC5lbmQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgYmFzZVN0cmVhbXMgPSBjdXJyZW50Tm9kZS5nZXRCYXNlU3RyZWFtcygpOwogICAgICAgIGlmIChiYXNlU3RyZWFtcykgewogICAgICAgICAgbGV0IGZvdW5kTWlzc2luZ0RhdGEgPSBmYWxzZTsKICAgICAgICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIGJhc2VTdHJlYW1zKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW0uaXNEYXRhTG9hZGVkKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm91bmRNaXNzaW5nRGF0YSA9IHRydWU7CiAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKICAgICAgICAgICAgICBiZWdpbjogc3RyZWFtLnN0YXJ0LAogICAgICAgICAgICAgIGVuZDogc3RyZWFtLmVuZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmb3VuZE1pc3NpbmdEYXRhKSB7CiAgICAgICAgICAgIG5vZGVzVG9SZXZpc2l0LnB1c2goY3VycmVudE5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhZGRDaGlsZHJlbihjdXJyZW50Tm9kZSwgbm9kZXNUb1Zpc2l0KTsKICAgIH0KICAgIGlmIChwZW5kaW5nUmVxdWVzdHMubGVuZ3RoKSB7CiAgICAgIGF3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHBlbmRpbmdSZXF1ZXN0cyk7CiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlc1RvUmV2aXNpdCkgewogICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICB0aGlzLnJlZlNldC5yZW1vdmUobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9SZXZpc2l0KTsKICAgIH0KICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvc3ltYm9sX3V0aWxzLmpzCmNvbnN0ICRhY2NlcHRXaGl0ZXNwYWNlID0gU3ltYm9sKCk7CmNvbnN0ICRhZGRIVE1MID0gU3ltYm9sKCk7CmNvbnN0ICRhcHBlbmRDaGlsZCA9IFN5bWJvbCgpOwpjb25zdCAkY2hpbGRyZW5Ub0hUTUwgPSBTeW1ib2woKTsKY29uc3QgJGNsZWFuID0gU3ltYm9sKCk7CmNvbnN0ICRjbGVhblBhZ2UgPSBTeW1ib2woKTsKY29uc3QgJGNsZWFudXAgPSBTeW1ib2woKTsKY29uc3QgJGNsb25lID0gU3ltYm9sKCk7CmNvbnN0ICRjb25zdW1lZCA9IFN5bWJvbCgpOwpjb25zdCAkY29udGVudCA9IFN5bWJvbCgiY29udGVudCIpOwpjb25zdCAkZGF0YSA9IFN5bWJvbCgiZGF0YSIpOwpjb25zdCAkZHVtcCA9IFN5bWJvbCgpOwpjb25zdCAkZXh0cmEgPSBTeW1ib2woImV4dHJhIik7CmNvbnN0ICRmaW5hbGl6ZSA9IFN5bWJvbCgpOwpjb25zdCAkZmx1c2hIVE1MID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRBdHRyaWJ1dGVJdCA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0QXZhaWxhYmxlU3BhY2UgPSBTeW1ib2woKTsKY29uc3QgJGdldENoaWxkcmVuQnlDbGFzcyA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeU5hbWUgPSBTeW1ib2woKTsKY29uc3QgJGdldENoaWxkcmVuQnlOYW1lSXQgPSBTeW1ib2woKTsKY29uc3QgJGdldERhdGFWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0RXh0cmEgPSBTeW1ib2woKTsKY29uc3QgJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0ID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRDaGlsZHJlbiA9IFN5bWJvbCgpOwpjb25zdCAkZ2V0Q29udGFpbmVkQ2hpbGRyZW4gPSBTeW1ib2woKTsKY29uc3QgJGdldE5leHRQYWdlID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRTdWJmb3JtUGFyZW50ID0gU3ltYm9sKCk7CmNvbnN0ICRnZXRQYXJlbnQgPSBTeW1ib2woKTsKY29uc3QgJGdldFRlbXBsYXRlUm9vdCA9IFN5bWJvbCgpOwpjb25zdCAkZ2xvYmFsRGF0YSA9IFN5bWJvbCgpOwpjb25zdCAkaGFzU2V0dGFibGVWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCAkaWRzID0gU3ltYm9sKCk7CmNvbnN0ICRpbmRleE9mID0gU3ltYm9sKCk7CmNvbnN0ICRpbnNlcnRBdCA9IFN5bWJvbCgpOwpjb25zdCAkaXNDREFUQVhtbCA9IFN5bWJvbCgpOwpjb25zdCAkaXNCaW5kYWJsZSA9IFN5bWJvbCgpOwpjb25zdCAkaXNEYXRhVmFsdWUgPSBTeW1ib2woKTsKY29uc3QgJGlzRGVzY2VuZGVudCA9IFN5bWJvbCgpOwpjb25zdCAkaXNOc0Fnbm9zdGljID0gU3ltYm9sKCk7CmNvbnN0ICRpc1NwbGl0dGFibGUgPSBTeW1ib2woKTsKY29uc3QgJGlzVGhlcmVNb3JlV2lkdGggPSBTeW1ib2woKTsKY29uc3QgJGlzVHJhbnNwYXJlbnQgPSBTeW1ib2woKTsKY29uc3QgJGlzVXNhYmxlID0gU3ltYm9sKCk7CmNvbnN0ICRsYXN0QXR0cmlidXRlID0gU3ltYm9sKCk7CmNvbnN0ICRuYW1lc3BhY2VJZCA9IFN5bWJvbCgibmFtZXNwYWNlSWQiKTsKY29uc3QgJG5vZGVOYW1lID0gU3ltYm9sKCJub2RlTmFtZSIpOwpjb25zdCAkbnNBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0ICRvbkNoaWxkID0gU3ltYm9sKCk7CmNvbnN0ICRvbkNoaWxkQ2hlY2sgPSBTeW1ib2woKTsKY29uc3QgJG9uVGV4dCA9IFN5bWJvbCgpOwpjb25zdCAkcHVzaEdseXBocyA9IFN5bWJvbCgpOwpjb25zdCAkcG9wUGFyYSA9IFN5bWJvbCgpOwpjb25zdCAkcHVzaFBhcmEgPSBTeW1ib2woKTsKY29uc3QgJHJlbW92ZUNoaWxkID0gU3ltYm9sKCk7CmNvbnN0ICRyb290ID0gU3ltYm9sKCJyb290Iik7CmNvbnN0ICRyZXNvbHZlUHJvdG90eXBlcyA9IFN5bWJvbCgpOwpjb25zdCAkc2VhcmNoTm9kZSA9IFN5bWJvbCgpOwpjb25zdCAkc2V0SWQgPSBTeW1ib2woKTsKY29uc3QgJHNldFNldEF0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgJHNldFZhbHVlID0gU3ltYm9sKCk7CmNvbnN0ICR0YWJJbmRleCA9IFN5bWJvbCgpOwpjb25zdCAkdGV4dCA9IFN5bWJvbCgpOwpjb25zdCAkdG9QYWdlcyA9IFN5bWJvbCgpOwpjb25zdCAkdG9IVE1MID0gU3ltYm9sKCk7CmNvbnN0ICR0b1N0cmluZyA9IFN5bWJvbCgpOwpjb25zdCAkdG9TdHlsZSA9IFN5bWJvbCgpOwpjb25zdCAkdWlkID0gU3ltYm9sKCJ1aWQiKTsKCjsvLyAuL3NyYy9jb3JlL3hmYS9uYW1lc3BhY2VzLmpzCmNvbnN0ICRidWlsZFhGQU9iamVjdCA9IFN5bWJvbCgpOwpjb25zdCBOYW1lc3BhY2VJZHMgPSB7CiAgY29uZmlnOiB7CiAgICBpZDogMCwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hjaS8iKQogIH0sCiAgY29ubmVjdGlvblNldDogewogICAgaWQ6IDEsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtY29ubmVjdGlvbi1zZXQvIikKICB9LAogIGRhdGFzZXRzOiB7CiAgICBpZDogMiwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIpCiAgfSwKICBmb3JtOiB7CiAgICBpZDogMywKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLyIpCiAgfSwKICBsb2NhbGVTZXQ6IHsKICAgIGlkOiA0LAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWxvY2FsZS1zZXQvIikKICB9LAogIHBkZjogewogICAgaWQ6IDUsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvIgogIH0sCiAgc2lnbmF0dXJlOiB7CiAgICBpZDogNiwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCiAgfSwKICBzb3VyY2VTZXQ6IHsKICAgIGlkOiA3LAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXNvdXJjZS1zZXQvIikKICB9LAogIHN0eWxlc2hlZXQ6IHsKICAgIGlkOiA4LAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgogIH0sCiAgdGVtcGxhdGU6IHsKICAgIGlkOiA5LAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXRlbXBsYXRlLyIpCiAgfSwKICB4ZGM6IHsKICAgIGlkOiAxMCwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hkYy8iKQogIH0sCiAgeGRwOiB7CiAgICBpZDogMTEsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iCiAgfSwKICB4ZmRmOiB7CiAgICBpZDogMTIsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3hmZGYvIgogIH0sCiAgeGh0bWw6IHsKICAgIGlkOiAxMywKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCiAgfSwKICB4bXBtZXRhOiB7CiAgICBpZDogMTQsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3htcG1ldGEvIgogIH0KfTsKCjsvLyAuL3NyYy9jb3JlL3hmYS91dGlscy5qcwoKCgoKCmNvbnN0IGRpbUNvbnZlcnRlcnMgPSB7CiAgcHQ6IHggPT4geCwKICBjbTogeCA9PiB4IC8gMi41NCAqIDcyLAogIG1tOiB4ID0+IHggLyAoMTAgKiAyLjU0KSAqIDcyLAogIGluOiB4ID0+IHggKiA3MiwKICBweDogeCA9PiB4Cn07CmNvbnN0IG1lYXN1cmVtZW50UGF0dGVybiA9IC8oWystXT9cZCtcLj9cZCopKC4qKS87CmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHN0cikgewogIGlmIChzdHIuc3RhcnRzV2l0aCgiJyIpIHx8IHN0ci5zdGFydHNXaXRoKCciJykpIHsKICAgIHJldHVybi
20BzdHIuc2xpY2UoMSwgLTEpOwogIH0KICByZXR1cm4gc3RyOwp9CmZ1bmN0aW9uIGdldEludGVnZXIoewogIGRhdGEsCiAgZGVmYXVsdFZhbHVlLAogIHZhbGlkYXRlCn0pIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgfQogIGRhdGEgPSBkYXRhLnRyaW0oKTsKICBjb25zdCBuID0gcGFyc2VJbnQoZGF0YSwgMTApOwogIGlmICghaXNOYU4obikgJiYgdmFsaWRhdGUobikpIHsKICAgIHJldHVybiBuOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldEZsb2F0KHsKICBkYXRhLAogIGRlZmF1bHRWYWx1ZSwKICB2YWxpZGF0ZQp9KSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogIH0KICBkYXRhID0gZGF0YS50cmltKCk7CiAgY29uc3QgbiA9IHBhcnNlRmxvYXQoZGF0YSk7CiAgaWYgKCFpc05hTihuKSAmJiB2YWxpZGF0ZShuKSkgewogICAgcmV0dXJuIG47CiAgfQogIHJldHVybiBkZWZhdWx0VmFsdWU7Cn0KZnVuY3Rpb24gZ2V0S2V5d29yZCh7CiAgZGF0YSwKICBkZWZhdWx0VmFsdWUsCiAgdmFsaWRhdGUKfSkgewogIGlmICghZGF0YSkgewogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICB9CiAgZGF0YSA9IGRhdGEudHJpbSgpOwogIGlmICh2YWxpZGF0ZShkYXRhKSkgewogICAgcmV0dXJuIGRhdGE7CiAgfQogIHJldHVybiBkZWZhdWx0VmFsdWU7Cn0KZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uKGRhdGEsIG9wdGlvbnMpIHsKICByZXR1cm4gZ2V0S2V5d29yZCh7CiAgICBkYXRhLAogICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zWzBdLAogICAgdmFsaWRhdGU6IGsgPT4gb3B0aW9ucy5pbmNsdWRlcyhrKQogIH0pOwp9CmZ1bmN0aW9uIGdldE1lYXN1cmVtZW50KHN0ciwgZGVmID0gIjAiKSB7CiAgZGVmIHx8PSAiMCI7CiAgaWYgKCFzdHIpIHsKICAgIHJldHVybiBnZXRNZWFzdXJlbWVudChkZWYpOwogIH0KICBjb25zdCBtYXRjaCA9IHN0ci50cmltKCkubWF0Y2gobWVhc3VyZW1lbnRQYXR0ZXJuKTsKICBpZiAoIW1hdGNoKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgY29uc3QgWywgdmFsdWVTdHIsIHVuaXRdID0gbWF0Y2g7CiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlU3RyKTsKICBpZiAoaXNOYU4odmFsdWUpKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgaWYgKHZhbHVlID09PSAwKSB7CiAgICByZXR1cm4gMDsKICB9CiAgY29uc3QgY29udiA9IGRpbUNvbnZlcnRlcnNbdW5pdF07CiAgaWYgKGNvbnYpIHsKICAgIHJldHVybiBjb252KHZhbHVlKTsKICB9CiAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIGdldFJhdGlvKGRhdGEpIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIG51bTogMSwKICAgICAgZGVuOiAxCiAgICB9OwogIH0KICBjb25zdCByYXRpbyA9IGRhdGEudHJpbSgpLnNwbGl0KC9ccyo6XHMqLykubWFwKHggPT4gcGFyc2VGbG9hdCh4KSkuZmlsdGVyKHggPT4gIWlzTmFOKHgpKTsKICBpZiAocmF0aW8ubGVuZ3RoID09PSAxKSB7CiAgICByYXRpby5wdXNoKDEpOwogIH0KICBpZiAocmF0aW8ubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gewogICAgICBudW06IDEsCiAgICAgIGRlbjogMQogICAgfTsKICB9CiAgY29uc3QgW251bSwgZGVuXSA9IHJhdGlvOwogIHJldHVybiB7CiAgICBudW0sCiAgICBkZW4KICB9Owp9CmZ1bmN0aW9uIGdldFJlbGV2YW50KGRhdGEpIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBbXTsKICB9CiAgcmV0dXJuIGRhdGEudHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoZSA9PiAoewogICAgZXhjbHVkZWQ6IGVbMF0gPT09ICItIiwKICAgIHZpZXduYW1lOiBlLnN1YnN0cmluZygxKQogIH0pKTsKfQpmdW5jdGlvbiBnZXRDb2xvcihkYXRhLCBkZWYgPSBbMCwgMCwgMF0pIHsKICBsZXQgW3IsIGcsIGJdID0gZGVmOwogIGlmICghZGF0YSkgewogICAgcmV0dXJuIHsKICAgICAgciwKICAgICAgZywKICAgICAgYgogICAgfTsKICB9CiAgY29uc3QgY29sb3IgPSBkYXRhLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8pLm1hcChjID0+IE1hdGgubWluKE1hdGgubWF4KDAsIHBhcnNlSW50KGMudHJpbSgpLCAxMCkpLCAyNTUpKS5tYXAoYyA9PiBpc05hTihjKSA/IDAgOiBjKTsKICBpZiAoY29sb3IubGVuZ3RoIDwgMykgewogICAgcmV0dXJuIHsKICAgICAgciwKICAgICAgZywKICAgICAgYgogICAgfTsKICB9CiAgW3IsIGcsIGJdID0gY29sb3I7CiAgcmV0dXJuIHsKICAgIHIsCiAgICBnLAogICAgYgogIH07Cn0KZnVuY3Rpb24gZ2V0QkJveChkYXRhKSB7CiAgY29uc3QgZGVmID0gLTE7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IGJib3ggPSBkYXRhLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8pLm1hcChtID0+IGdldE1lYXN1cmVtZW50KG0sICItMSIpKTsKICBpZiAoYmJveC5sZW5ndGggPCA0IHx8IGJib3hbMl0gPCAwIHx8IGJib3hbM10gPCAwKSB7CiAgICByZXR1cm4gewogICAgICB4OiBkZWYsCiAgICAgIHk6IGRlZiwKICAgICAgd2lkdGg6IGRlZiwKICAgICAgaGVpZ2h0OiBkZWYKICAgIH07CiAgfQogIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGJib3g7CiAgcmV0dXJuIHsKICAgIHgsCiAgICB5LAogICAgd2lkdGgsCiAgICBoZWlnaHQKICB9Owp9CmNsYXNzIEhUTUxSZXN1bHQgewogIHN0YXRpYyBnZXQgRkFJTFVSRSgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgIkZBSUxVUkUiLCBuZXcgSFRNTFJlc3VsdChmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwogIH0KICBzdGF0aWMgZ2V0IEVNUFRZKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiRU1QVFkiLCBuZXcgSFRNTFJlc3VsdCh0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7CiAgfQogIGNvbnN0cnVjdG9yKHN1Y2Nlc3MsIGh0bWwsIGJib3gsIGJyZWFrTm9kZSkgewogICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKICAgIHRoaXMuaHRtbCA9IGh0bWw7CiAgICB0aGlzLmJib3ggPSBiYm94OwogICAgdGhpcy5icmVha05vZGUgPSBicmVha05vZGU7CiAgfQogIGlzQnJlYWsoKSB7CiAgICByZXR1cm4gISF0aGlzLmJyZWFrTm9kZTsKICB9CiAgc3RhdGljIGJyZWFrTm9kZShub2RlKSB7CiAgICByZXR1cm4gbmV3IEhUTUxSZXN1bHQoZmFsc2UsIG51bGwsIG51bGwsIG5vZGUpOwogIH0KICBzdGF0aWMgc3VjY2VzcyhodG1sLCBiYm94ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBIVE1MUmVzdWx0KHRydWUsIGh0bWwsIGJib3gsIG51bGwpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZvbnRzLmpzCgoKCgoKCgoKCgoKCgpjbGFzcyBGb250RmluZGVyIHsKICBjb25zdHJ1Y3RvcihwZGZGb250cykgewogICAgdGhpcy5mb250cyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7CiAgICB0aGlzLndhcm5lZCA9IG5ldyBTZXQoKTsKICAgIHRoaXMuZGVmYXVsdEZvbnQgPSBudWxsOwogICAgdGhpcy5hZGQocGRmRm9udHMpOwogIH0KICBhZGQocGRmRm9udHMsIHJlYWxseU1pc3NpbmdGb250cyA9IG51bGwpIHsKICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiBwZGZGb250cykgewogICAgICB0aGlzLmFkZFBkZkZvbnQocGRmRm9udCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IHBkZkZvbnQgb2YgdGhpcy5mb250cy52YWx1ZXMoKSkgewogICAgICBpZiAoIXBkZkZvbnQucmVndWxhcikgewogICAgICAgI
20HBkZkZvbnQucmVndWxhciA9IHBkZkZvbnQuaXRhbGljIHx8IHBkZkZvbnQuYm9sZCB8fCBwZGZGb250LmJvbGRpdGFsaWM7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmVhbGx5TWlzc2luZ0ZvbnRzIHx8IHJlYWxseU1pc3NpbmdGb250cy5zaXplID09PSAwKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG15cmlhZCA9IHRoaXMuZm9udHMuZ2V0KCJQZGZKUy1GYWxsYmFjay1QZGZKUy1YRkEiKTsKICAgIGZvciAoY29uc3QgbWlzc2luZyBvZiByZWFsbHlNaXNzaW5nRm9udHMpIHsKICAgICAgdGhpcy5mb250cy5zZXQobWlzc2luZywgbXlyaWFkKTsKICAgIH0KICB9CiAgYWRkUGRmRm9udChwZGZGb250KSB7CiAgICBjb25zdCBjc3NGb250SW5mbyA9IHBkZkZvbnQuY3NzRm9udEluZm87CiAgICBjb25zdCBuYW1lID0gY3NzRm9udEluZm8uZm9udEZhbWlseTsKICAgIGxldCBmb250ID0gdGhpcy5mb250cy5nZXQobmFtZSk7CiAgICBpZiAoIWZvbnQpIHsKICAgICAgZm9udCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIHRoaXMuZm9udHMuc2V0KG5hbWUsIGZvbnQpOwogICAgICBpZiAoIXRoaXMuZGVmYXVsdEZvbnQpIHsKICAgICAgICB0aGlzLmRlZmF1bHRGb250ID0gZm9udDsKICAgICAgfQogICAgfQogICAgbGV0IHByb3BlcnR5ID0gIiI7CiAgICBjb25zdCBmb250V2VpZ2h0ID0gcGFyc2VGbG9hdChjc3NGb250SW5mby5mb250V2VpZ2h0KTsKICAgIGlmIChwYXJzZUZsb2F0KGNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlKSAhPT0gMCkgewogICAgICBwcm9wZXJ0eSA9IGZvbnRXZWlnaHQgPj0gNzAwID8gImJvbGRpdGFsaWMiIDogIml0YWxpYyI7CiAgICB9IGVsc2UgaWYgKGZvbnRXZWlnaHQgPj0gNzAwKSB7CiAgICAgIHByb3BlcnR5ID0gImJvbGQiOwogICAgfQogICAgaWYgKCFwcm9wZXJ0eSkgewogICAgICBpZiAocGRmRm9udC5uYW1lLmluY2x1ZGVzKCJCb2xkIikgfHwgcGRmRm9udC5wc05hbWU/LmluY2x1ZGVzKCJCb2xkIikpIHsKICAgICAgICBwcm9wZXJ0eSA9ICJib2xkIjsKICAgICAgfQogICAgICBpZiAocGRmRm9udC5uYW1lLmluY2x1ZGVzKCJJdGFsaWMiKSB8fCBwZGZGb250Lm5hbWUuZW5kc1dpdGgoIkl0IikgfHwgcGRmRm9udC5wc05hbWU/LmluY2x1ZGVzKCJJdGFsaWMiKSB8fCBwZGZGb250LnBzTmFtZT8uZW5kc1dpdGgoIkl0IikpIHsKICAgICAgICBwcm9wZXJ0eSArPSAiaXRhbGljIjsKICAgICAgfQogICAgfQogICAgaWYgKCFwcm9wZXJ0eSkgewogICAgICBwcm9wZXJ0eSA9ICJyZWd1bGFyIjsKICAgIH0KICAgIGZvbnRbcHJvcGVydHldID0gcGRmRm9udDsKICB9CiAgZ2V0RGVmYXVsdCgpIHsKICAgIHJldHVybiB0aGlzLmRlZmF1bHRGb250OwogIH0KICBmaW5kKGZvbnROYW1lLCBtdXN0V2FybiA9IHRydWUpIHsKICAgIGxldCBmb250ID0gdGhpcy5mb250cy5nZXQoZm9udE5hbWUpIHx8IHRoaXMuY2FjaGUuZ2V0KGZvbnROYW1lKTsKICAgIGlmIChmb250KSB7CiAgICAgIHJldHVybiBmb250OwogICAgfQogICAgY29uc3QgcGF0dGVybiA9IC8sfC18X3wgfGJvbGRpdGFsaWN8Ym9sZHxpdGFsaWN8cmVndWxhcnxpdC9naTsKICAgIGxldCBuYW1lID0gZm9udE5hbWUucmVwbGFjZUFsbChwYXR0ZXJuLCAiIik7CiAgICBmb250ID0gdGhpcy5mb250cy5nZXQobmFtZSk7CiAgICBpZiAoZm9udCkgewogICAgICB0aGlzLmNhY2hlLnNldChmb250TmFtZSwgZm9udCk7CiAgICAgIHJldHVybiBmb250OwogICAgfQogICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IG1heWJlID0gW107CiAgICBmb3IgKGNvbnN0IFtmYW1pbHksIHBkZkZvbnRdIG9mIHRoaXMuZm9udHMuZW50cmllcygpKSB7CiAgICAgIGlmIChmYW1pbHkucmVwbGFjZUFsbChwYXR0ZXJuLCAiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG5hbWUpKSB7CiAgICAgICAgbWF5YmUucHVzaChwZGZGb250KTsKICAgICAgfQogICAgfQogICAgaWYgKG1heWJlLmxlbmd0aCA9PT0gMCkgewogICAgICBmb3IgKGNvbnN0IFssIHBkZkZvbnRdIG9mIHRoaXMuZm9udHMuZW50cmllcygpKSB7CiAgICAgICAgaWYgKHBkZkZvbnQucmVndWxhci5uYW1lPy5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoL3BzbXR8bXQvZ2ksICIiKTsKICAgICAgZm9yIChjb25zdCBbZmFtaWx5LCBwZGZGb250XSBvZiB0aGlzLmZvbnRzLmVudHJpZXMoKSkgewogICAgICAgIGlmIChmYW1pbHkucmVwbGFjZUFsbChwYXR0ZXJuLCAiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG5hbWUpKSB7CiAgICAgICAgICBtYXliZS5wdXNoKHBkZkZvbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG1heWJlLmxlbmd0aCA9PT0gMCkgewogICAgICBmb3IgKGNvbnN0IHBkZkZvbnQgb2YgdGhpcy5mb250cy52YWx1ZXMoKSkgewogICAgICAgIGlmIChwZGZGb250LnJlZ3VsYXIubmFtZT8ucmVwbGFjZUFsbChwYXR0ZXJuLCAiIikudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG5hbWUpKSB7CiAgICAgICAgICBtYXliZS5wdXNoKHBkZkZvbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG1heWJlLmxlbmd0aCA+PSAxKSB7CiAgICAgIGlmIChtYXliZS5sZW5ndGggIT09IDEgJiYgbXVzdFdhcm4pIHsKICAgICAgICB3YXJuKGBYRkEgLSBUb28gbWFueSBjaG9pY2VzIHRvIGd1ZXNzIHRoZSBjb3JyZWN0IGZvbnQ6ICR7Zm9udE5hbWV9YCk7CiAgICAgIH0KICAgICAgdGhpcy5jYWNoZS5zZXQoZm9udE5hbWUsIG1heWJlWzBdKTsKICAgICAgcmV0dXJuIG1heWJlWzBdOwogICAgfQogICAgaWYgKG11c3RXYXJuICYmICF0aGlzLndhcm5lZC5oYXMoZm9udE5hbWUpKSB7CiAgICAgIHRoaXMud2FybmVkLmFkZChmb250TmFtZSk7CiAgICAgIHdhcm4oYFhGQSAtIENhbm5vdCBmaW5kIHRoZSBmb250OiAke2ZvbnROYW1lfWApOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CmZ1bmN0aW9uIHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpIHsKICBpZiAoeGZhRm9udC5wb3N0dXJlID09PSAiaXRhbGljIikgewogICAgaWYgKHhmYUZvbnQud2VpZ2h0ID09PSAiYm9sZCIpIHsKICAgICAgcmV0dXJuIHR5cGVmYWNlLmJvbGRpdGFsaWM7CiAgICB9CiAgICByZXR1cm4gdHlwZWZhY2UuaXRhbGljOwogIH0gZWxzZSBpZiAoeGZhRm9udC53ZWlnaHQgPT09ICJib2xkIikgewogICAgcmV0dXJuIHR5cGVmYWNlLmJvbGQ7CiAgfQogIHJldHVybi
20B0eXBlZmFjZS5yZWd1bGFyOwp9CmZ1bmN0aW9uIGZvbnRzX2dldE1ldHJpY3MoeGZhRm9udCwgcmVhbCA9IGZhbHNlKSB7CiAgbGV0IHBkZkZvbnQgPSBudWxsOwogIGlmICh4ZmFGb250KSB7CiAgICBjb25zdCBuYW1lID0gc3RyaXBRdW90ZXMoeGZhRm9udC50eXBlZmFjZSk7CiAgICBjb25zdCB0eXBlZmFjZSA9IHhmYUZvbnRbJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZChuYW1lKTsKICAgIHBkZkZvbnQgPSBzZWxlY3RGb250KHhmYUZvbnQsIHR5cGVmYWNlKTsKICB9CiAgaWYgKCFwZGZGb250KSB7CiAgICByZXR1cm4gewogICAgICBsaW5lSGVpZ2h0OiAxMiwKICAgICAgbGluZUdhcDogMiwKICAgICAgbGluZU5vR2FwOiAxMAogICAgfTsKICB9CiAgY29uc3Qgc2l6ZSA9IHhmYUZvbnQuc2l6ZSB8fCAxMDsKICBjb25zdCBsaW5lSGVpZ2h0ID0gcGRmRm9udC5saW5lSGVpZ2h0ID8gTWF0aC5tYXgocmVhbCA/IDAgOiAxLjIsIHBkZkZvbnQubGluZUhlaWdodCkgOiAxLjI7CiAgY29uc3QgbGluZUdhcCA9IHBkZkZvbnQubGluZUdhcCA9PT0gdW5kZWZpbmVkID8gMC4yIDogcGRmRm9udC5saW5lR2FwOwogIHJldHVybiB7CiAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0ICogc2l6ZSwKICAgIGxpbmVHYXA6IGxpbmVHYXAgKiBzaXplLAogICAgbGluZU5vR2FwOiBNYXRoLm1heCgxLCBsaW5lSGVpZ2h0IC0gbGluZUdhcCkgKiBzaXplCiAgfTsKfQoKOy8vIC4vc3JjL2NvcmUveGZhL3RleHQuanMKCgoKCmNvbnN0IFdJRFRIX0ZBQ1RPUiA9IDEuMDI7CmNsYXNzIEZvbnRJbmZvIHsKICBjb25zdHJ1Y3Rvcih4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQsIGZvbnRGaW5kZXIpIHsKICAgIHRoaXMubGluZUhlaWdodCA9IGxpbmVIZWlnaHQ7CiAgICB0aGlzLnBhcmFNYXJnaW4gPSBtYXJnaW4gfHwgewogICAgICB0b3A6IDAsCiAgICAgIGJvdHRvbTogMCwKICAgICAgbGVmdDogMCwKICAgICAgcmlnaHQ6IDAKICAgIH07CiAgICBpZiAoIXhmYUZvbnQpIHsKICAgICAgW3RoaXMucGRmRm9udCwgdGhpcy54ZmFGb250XSA9IHRoaXMuZGVmYXVsdEZvbnQoZm9udEZpbmRlcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMueGZhRm9udCA9IHsKICAgICAgdHlwZWZhY2U6IHhmYUZvbnQudHlwZWZhY2UsCiAgICAgI
20HBvc3R1cmU6IHhmYUZvbnQucG9zdHVyZSwKICAgICAgd2VpZ2h0OiB4ZmFGb250LndlaWdodCwKICAgICAgc2l6ZTogeGZhRm9udC5zaXplLAogICAgICBsZXR0ZXJTcGFjaW5nOiB4ZmFGb250LmxldHRlclNwYWNpbmcKICAgIH07CiAgICBjb25zdCB0eXBlZmFjZSA9IGZvbnRGaW5kZXIuZmluZCh4ZmFGb250LnR5cGVmYWNlKTsKICAgIGlmICghdHlwZWZhY2UpIHsKICAgICAgW3RoaXMucGRmRm9udCwgdGhpcy54ZmFGb250XSA9IHRoaXMuZGVmYXVsdEZvbnQoZm9udEZpbmRlcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMucGRmRm9udCA9IHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpOwogICAgaWYgKCF0aGlzLnBkZkZvbnQpIHsKICAgICAgW3RoaXMucGRmRm9udCwgdGhpcy54ZmFGb250XSA9IHRoaXMuZGVmYXVsdEZvbnQoZm9udEZpbmRlcik7CiAgICB9CiAgfQogIGRlZmF1bHRGb250KGZvbnRGaW5kZXIpIHsKICAgIGNvbnN0IGZvbnQgPSBmb250RmluZGVyLmZpbmQoIkhlbHZldGljYSIsIGZhbHNlKSB8fCBmb250RmluZGVyLmZpbmQoIk15cmlhZCBQcm8iLCBmYWxzZSkgfHwgZm9udEZpbmRlci5maW5kKCJBcmlhbCIsIGZhbHNlKSB8fCBmb250RmluZGVyLmdldERlZmF1bHQoKTsKICAgIGlmIChmb250Py5yZWd1bGFyKSB7CiAgICAgIGNvbnN0IHBkZkZvbnQgPSBmb250LnJlZ3VsYXI7CiAgICAgIGNvbnN0IGluZm8gPSBwZGZGb250LmNzc0ZvbnRJbmZvOwogICAgICBjb25zdCB4ZmFGb250ID0gewogICAgICAgIHR5cGVmYWNlOiBpbmZvLmZvbnRGYW1pbHksCiAgICAgICAgcG9zdHVyZTogIm5vcm1hbCIsCiAgICAgICAgd2VpZ2h0OiAibm9ybWFsIiwKICAgICAgICBzaXplOiAxMCwKICAgICAgICBsZXR0ZXJTcGFjaW5nOiAwCiAgICAgIH07CiAgICAgIHJldHVybiBbcGRmRm9udCwgeGZhRm9udF07CiAgICB9CiAgICBjb25zdCB4ZmFGb250ID0gewogICAgICB0eX
20BlZmFjZTogIkNvdXJpZXIiLAogICAgICBwb3N0dXJlOiAibm9ybWFsIiwKICAgICAgd2VpZ2h0OiAibm9ybWFsIiwKICAgICAgc2l6ZTogMTAsCiAgICAgIGxldHRlclNwYWNpbmc6IDAKICAgIH07CiAgICByZXR1cm4gW251bGwsIHhmYUZvbnRdOwogIH0KfQpjbGFzcyBGb250U2VsZWN0b3IgewogIGNvbnN0cnVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRGaW5kZXIpIHsKICAgIHRoaXMuZm9udEZpbmRlciA9IGZvbnRGaW5kZXI7CiAgICB0aGlzLnN0YWNrID0gW25ldyBGb250SW5mbyhkZWZhdWx0WGZhRm9udCwgZGVmYXVsdFBhcmFNYXJnaW4sIGRlZmF1bHRMaW5lSGVpZ2h0LCBmb250RmluZGVyKV07CiAgfQogIHB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCkgewogICAgY29uc3QgbGFzdEZvbnQgPSB0aGlzLnN0YWNrLmF0KC0xKTsKICAgIGZvciAoY29uc3QgbmFtZSBvZiBbInR5cGVmYWNlIiwgInBvc3R1cmUiLCAid2VpZ2h0IiwgInNpemUiLCAibGV0dGVyU3BhY2luZyJdKSB7CiAgICAgIGlmICgheGZhRm9udFtuYW1lXSkgewogICAgICAgIHhmYUZvbnRbbmFtZV0gPSBsYXN0Rm9udC54ZmFGb250W25hbWVdOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgWyJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiXSkgewogICAgICBpZiAoaXNOYU4obWFyZ2luW25hbWVdKSkgewogICAgICAgIG1hcmdpbltuYW1lXSA9IGxhc3RGb250LnBhcmFNYXJnaW5bbmFtZV07CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGZvbnRJbmZvID0gbmV3IEZvbnRJbmZvKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCB8fCBsYXN0Rm9udC5saW5lSGVpZ2h0LCB0aGlzLmZvbnRGaW5kZXIpOwogICAgaWYgKCFmb250SW5mby5wZGZGb250KSB7CiAgICAgIGZvbnRJbmZvLnBkZkZvbnQgPSBsYXN0Rm9udC5wZGZGb250OwogICAgfQogICAgdGhpcy5zdGFjay5wdXNoKGZvbnRJbmZvKTsKICB9CiAgcG9wRm9udCgpIHsKICAgIHRoaXMuc3RhY2sucG9wKCk7CiAgfQogIHRvcEZvbnQoKSB7CiAgICByZXR1cm4gdGhpcy5zdGFjay5hdCgtMSk7CiAgfQp9CmNsYXNzIFRleHRNZWFzdXJlIHsKICBjb25zdHJ1Y3RvcihkZWZhdWx0WGZhRm9udCwgZGVmYXVsdFBhcmFNYXJnaW4sIGRlZmF1bHRMaW5lSGVpZ2h0LCBmb250cykgewogICAgdGhpcy5nbHlwaHMgPSBbXTsKICAgIHRoaXMuZm9udFNlbGVjdG9yID0gbmV3IEZvbnRTZWxlY3RvcihkZWZhdWx0WGZhRm9udCwgZGVmYXVsdFBhcmFNYXJnaW4sIGRlZmF1bHRMaW5lSGVpZ2h0LCBmb250cyk7CiAgICB0aGlzLmV4dHJhSGVpZ2h0ID0gMDsKICB9CiAgcHVzaERhdGEoeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0KSB7CiAgICB0aGlzLmZvbnRTZWxlY3Rvci5wdXNoRGF0YSh4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQpOwogIH0KICBwb3BGb250KHhmYUZvbnQpIHsKICAgIHJldHVybiB0aGlzLmZvbnRTZWxlY3Rvci5wb3BGb250KCk7CiAgfQogIGFkZFBhcmEoKSB7CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuZm9udFNlbGVjdG9yLnRvcEZvbnQoKTsKICAgIHRoaXMuZXh0cmFIZWlnaHQgKz0gbGFzdEZvbnQucGFyYU1hcmdpbi50b3AgKyBsYXN0Rm9udC5wYXJhTWFyZ2luLmJvdHRvbTsKICB9CiAgYWRkU3RyaW5nKHN0cikgewogICAgaWYgKCFzdHIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbGFzdEZvbnQgPSB0aGlzLmZvbnRTZWxlY3Rvci50b3BGb250KCk7CiAgICBjb25zdCBmb250U2l6ZSA9IGxhc3RGb250LnhmYUZvbnQuc2l6ZTsKICAgIGlmIChsYXN0Rm9udC5wZGZGb250KSB7CiAgICAgIGNvbnN0IGxldHRlclNwYWNpbmcgPSBsYXN0Rm9udC54ZmFGb250LmxldHRlclNwYWNpbmc7CiAgICAgIGNvbnN0IHBkZkZvbnQgPSBsYXN0Rm9udC5wZGZGb250OwogICAgICBjb25zdCBmb250TGluZUhlaWdodCA9IHBkZkZvbnQubGluZUhlaWdodCB8fCAxLjI7CiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBsYXN0Rm9udC5saW5lSGVpZ2h0IHx8IE1hdGgubWF4KDEuMiwgZm9udExpbmVIZWlnaHQpICogZm9udFNpemU7CiAgICAgIGNvbnN0IGxpbmVHYXAgPSBwZGZGb250LmxpbmVHYXAgPT09IHVuZGVmaW5lZCA/IDAuMiA6IHBkZkZvbnQubGluZUdhcDsKICAgICAgY29uc3Qgbm9HYXAgPSBmb250TGluZUhlaWdodCAtIGxpbmVHYXA7CiAgICAgIGNvbnN0IGZpcnN0TGluZUhlaWdodCA9IE1hdGgubWF4KDEsIG5vR2FwKSAqIGZvbnRTaXplOwogICAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgICAgY29uc3QgZmFsbGJhY2tXaWR0aCA9IHBkZkZvbnQuZGVmYXVsdFdpZHRoIHx8IHBkZkZvbnQuY2hhcnNUb0dseXBocygiICIpWzBdLndpZHRoOwogICAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyLnNwbGl0KC9bXHUyMDI5XG5dLykpIHsKICAgICAgICBjb25zdCBlbmNvZGVkTGluZSA9IHBkZkZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpLmpvaW4oIiIpOwogICAgICAgIGNvbnN0IGdseXBocyA9IHBkZkZvbnQuY2hhcnNUb0dseXBocyhlbmNvZGVkTGluZSk7CiAgICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgICAgIGNvbnN0IHdpZHRoID0gZ2x5cGgud2lkdGggfHwgZmFsbGJhY2tXaWR0aDsKICAgICAgICAgIHRoaXMuZ2x5cGhzLnB1c2goW3dpZHRoICogc2NhbGUgKyBsZXR0ZXJTcGFjaW5nLCBsaW5lSGVpZ2h0LCBmaXJzdExpbmVIZWlnaHQsIGdseXBoLnVuaWNvZGUsIGZhbHNlXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2x5cGhzLnB1c2goWzAsIDAsIDAsICJcbiIsIHRydWVdKTsKICAgICAgfQogICAgICB0aGlzLmdseXBocy5wb3AoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBsaW5lIG9mIHN0ci5zcGxpdCgvW1x1MjAyOVxuXS8pKSB7CiAgICAgIGZvciAoY29uc3QgY2hhciBvZiBsaW5lLnNwbGl0KCIiKSkgewogICAgICAgIHRoaXMuZ2x5cGhzLnB1c2goW2ZvbnRTaXplLCAxLjIgKiBmb250U2l6ZSwgZm9udFNpemUsIGNoYXIsIGZhbHNlXSk7CiAgICAgI
20H0KICAgICAgdGhpcy5nbHlwaHMucHVzaChbMCwgMCwgMCwgIlxuIiwgdHJ1ZV0pOwogICAgfQogICAgdGhpcy5nbHlwaHMucG9wKCk7CiAgfQogIGNvbXB1dGUobWF4V2lkdGgpIHsKICAgIGxldCBsYXN0U3BhY2VQb3MgPSAtMSwKICAgICAgbGFzdFNwYWNlV2lkdGggPSAwLAogICAgICB3aWR0aCA9IDAsCiAgICAgIGhlaWdodCA9IDAsCiAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwLAogICAgICBjdXJyZW50TGluZUhlaWdodCA9IDA7CiAgICBsZXQgaXNCcm9rZW4gPSBmYWxzZTsKICAgIGxldCBpc0ZpcnN0TGluZSA9IHRydWU7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLmdseXBocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IFtnbHlwaFdpZHRoLCBsaW5lSGVpZ2h0LCBmaXJzdExpbmVIZWlnaHQsIGNoYXIsIGlzRU9MXSA9IHRoaXMuZ2x5cGhzW2ldOwogICAgICBjb25zdCBpc1NwYWNlID0gY2hhciA9PT0gIiAiOwogICAgICBjb25zdCBnbHlwaEhlaWdodCA9IGlzRmlyc3RMaW5lID8gZmlyc3RMaW5lSGVpZ2h0IDogbGluZUhlaWdodDsKICAgICAgaWYgKGlzRU9MKSB7CiAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3VycmVudExpbmVXaWR0aCk7CiAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IDA7CiAgICAgICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0OwogICAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gZ2x5cGhIZWlnaHQ7CiAgICAgICAgbGFzdFNwYWNlUG9zID0gLTE7CiAgICAgICAgbGFzdFNwYWNlV2lkdGggPSAwOwogICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGlzU3BhY2UpIHsKICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aCArIGdseXBoV2lkdGggPiBtYXhXaWR0aCkgewogICAgICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3VycmVudExpbmVXaWR0aCk7CiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoID0gMDsKICAgICAgICAgIGhlaWdodCArPSBjdXJyZW50TGluZUhlaWdodDsKICAgICAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gZ2x5cGhIZWlnaHQ7CiAgICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKICAgICAgICAgIGxhc3RTcGFjZVdpZHRoID0gMDsKICAgICAgICAgIGlzQnJva2VuID0gdHJ1ZTsKICAgICAgICAgIGlzRmlyc3RMaW5lID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoZ2x5cGhIZWlnaHQsIGN1cnJlbnRMaW5lSGVpZ2h0KTsKICAgICAgICAgIGxhc3RTcGFjZVdpZHRoID0gY3VycmVudExpbmVXaWR0aDsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IGk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoICsgZ2x5cGhXaWR0aCA+IG1heFdpZHRoKSB7CiAgICAgICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0OwogICAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gZ2x5cGhIZWlnaHQ7CiAgICAgICAgaWYgKGxhc3RTcGFjZVBvcyAhPT0gLTEpIHsKICAgICAgICAgIGkgPSBsYXN0U3BhY2VQb3M7CiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBsYXN0U3BhY2VXaWR0aCk7CiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoID0gMDsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSBnbHlwaFdpZHRoOwogICAgICAgIH0KICAgICAgICBpc0Jyb2tlbiA9IHRydWU7CiAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjdXJyZW50TGluZVdpZHRoICs9IGdseXBoV2lkdGg7CiAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoZ2x5cGhIZWlnaHQsIGN1cnJlbnRMaW5lSGVpZ2h0KTsKICAgIH0KICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN1cnJlbnRMaW5lV2lkdGgpOwogICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0ICsgdGh
20pcy5leHRyYUhlaWdodDsKICAgIHJldHVybiB7CiAgICAgIHdpZHRoOiBXSURUSF9GQUNUT1IgKiB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBpc0Jyb2tlbgogICAgfTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zb20uanMKCgoKCgoKY29uc3QgbmFtZVBhdHRlcm4gPSAvXlteLltdKy87CmNvbnN0IGluZGV4UGF0dGVybiA9IC9eW15cXV0rLzsKY29uc3Qgb3BlcmF0b3JzID0gewogIGRvdDogMCwKICBkb3REb3Q6IDEsCiAgZG90SGFzaDogMiwKICBkb3RCcmFja2V0OiAzLAogIGRvdFBhcmVuOiA0Cn07CmNvbnN0IHNob3J0Y3V0cyA9IG5ldyBNYXAoW1siJGRhdGEiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5kYXRhc2V0cyA/IHJvb3QuZGF0YXNldHMuZGF0YSA6IHJvb3RdLCBbIiRyZWNvcmQiLCAocm9vdCwgY3VycmVudCkgPT4gKHJvb3QuZGF0YXNldHMgPyByb290LmRhdGFzZXRzLmRhdGEgOiByb290KVskZ2V0Q2hpbGRyZW5dKClbMF1dLCBbIiR0ZW1wbGF0ZSIsIChyb290LCBjdXJyZW50KSA9PiByb290LnRlbXBsYXRlXSwgWyIkY29ubmVjdGlvblNldCIsIChyb290LCBjdXJyZW50KSA9PiByb290LmNvbm5lY3Rpb25TZXRdLCBbIiRmb3JtIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuZm9ybV0sIFsiJGxheW91dCIsIChyb290LCBjdXJyZW50KSA9PiByb290LmxheW91dF0sIFsiJGhvc3QiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5ob3N0XSwgWyIkZGF0YVdpbmRvdyIsIChyb290LCBjdXJyZW50KSA9PiByb290LmRhdGFXaW5kb3ddLCBbIiRldmVudCIsIChyb290LCBjdXJyZW50KSA9PiByb290LmV2ZW50XSwgWyIhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuZGF0YXNldHNdLCBbIiR4ZmEiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdF0sIFsieGZhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3RdLCBbIiQiLCAocm9vdCwgY3VycmVudCkgPT4gY3VycmVudF1dKTsKY29uc3Qgc29tQ2FjaGUgPSBuZXcgV2Vha01hcCgpOwpmdW5jdGlvbiBwYXJzZUluZGV4KGluZGV4KSB7CiAgaW5kZXggPSBpbmRleC50cmltKCk7CiAgaWYgKGluZGV4ID09PSAiKiIpIHsKICAgIHJldHVybiBJbmZpbml0eTsKICB9CiAgcmV0dXJuIHBhcnNlSW50KGluZGV4LCAxMCkgfHwgMDsKfQpmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwciwgZG90RG90QWxsb3dlZCwgbm9FeHByID0gdHJ1ZSkgewogIGxldCBtYXRjaCA9IGV4cHIubWF0Y2gobmFtZVBhdHRlcm4pOwogIGlmICghbWF0Y2gpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBsZXQgW25hbWVdID0gbWF0Y2g7CiAgY29uc3QgcGFyc2VkID0gW3sKICAgIG5hbWUsCiAgICBjYWNoZU5hbWU6ICIuIiArIG5hbWUsCiAgICBpbmRleDogMCwKICAgIGpzOiBudWxsLAogICAgZm9ybUNhbGM6IG51bGwsCiAgICBvcGVyYXRvcjogb3BlcmF0b3JzLmRvdAogIH1dOwogIGxldCBwb3MgPSBuYW1lLmxlbmd0aDsKICB3aGlsZSAocG9zIDwgZXhwci5sZW5ndGgpIHsKICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBjb25zdCBjaGFyID0gZXhwci5jaGFyQXQocG9zKyspOwogICAgaWYgKGNoYXIgPT09ICJbIikgewogICAgICBtYXRjaCA9IGV4cHIuc2xpY2UocG9zKS5tYXRjaChpbmRleFBhdHRlcm4pOwogICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgd2FybigiWEZBIC0gSW52YWxpZCBpbmRleCBpbiBTT00gZXhwcmVzc2lvbiIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHBhcnNlZC5hdCgtMSkuaW5kZXggPSBwYXJzZUluZGV4KG1hdGNoWzBdKTsKICAgICAgcG9zICs9IG1hdGNoWzBdLmxlbmd0aCArIDE7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgbGV0IG9wZXJhdG9yOwogICAgc3dpdGNoIChleHByLmNoYXJBdChwb3MpKSB7CiAgICAgIGNhc2UgIi4iOgogICAgICAgIGlmICghZG90RG90QWxsb3dlZCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHBvcysrOwogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdERvdDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiIyI6CiAgICAgICAgcG9zKys7CiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnMuZG90SGFzaDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiWyI6CiAgICAgICAgaWYgKG5vRXhwcikgewogICAgICAgICAgd2FybigiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBGb3JtQ2FsYyBzdWJleHByZXNzaW9uIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdy4iKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3RCcmFja2V0OwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICIoIjoKICAgICAgICBpZiAobm9FeHByKSB7CiAgICAgICAgICB3YXJuKCJYRkEgLSBTT00gZXhwcmVzc2lvbiBjb250YWlucyBhIEphdmFTY3JpcHQgc3ViZXhwcmVzc2lvbiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGZvciBub3cuIik7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnMuZG90UGFyZW47CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgb3BlcmF0b3IgPSBvcGVyYXRvcnMuZG90OwogICAgICAgIGJyZWFrOwogICAgfQogICAgbWF0Y2ggPSBleHByLnNsaWNlKHBvcykubWF0Y2gobmFtZVBhdHRlcm4pOwogICAgaWYgKCFtYXRjaCkgewogICAgICBicmVhazsKICAgIH0KICAgIFtuYW1lXSA9IG1hdGNoOwogICAgcG9zICs9IG5hbWUubGVuZ3RoOwogICAgcGFyc2VkLnB1c2goewogICAgICBuYW1lLAogICAgICBjYWNoZU5hbWU6IGV4cHIuc2xpY2Uoc3BvcywgcG9zKSwKICAgICAgb3BlcmF0b3IsCiAgICAgIGluZGV4OiAwLAogICAgICBqczogbnVsbCwKICAgICAgZm9ybUNhbGM6IG51bGwKICAgIH0pOwogIH0KICByZXR1cm4gcGFyc2VkOwp9CmZ1bmN0aW9uIHNlYXJjaE5vZGUocm9vdCwgY29udGFpbmVyLCBleHByLCBkb3REb3RBbGxvd2VkID0gdHJ1ZSwgdXNlQ2FjaGUgPSB0cnVlKSB7CiAgY29uc3QgcGFyc2VkID0gcGFyc2VFeHByZXNzaW9uKGV4cHIsIGRvdERvdEFsbG93ZWQpOwogIGlmICghcGFyc2VkKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgZm4gPSBzaG9ydGN1dHMuZ2V0KHBhcnNlZFswXS5uYW1lKTsKICBsZXQgaSA9IDA7CiAgbGV0IGlzUXVhbGlmaWVkOwogIGlmIChmbikgewogICAgaXNRdWFsaWZpZWQgPSB0cnVlOw
20ogICAgcm9vdCA9IFtmbihyb290LCBjb250YWluZXIpXTsKICAgIGkgPSAxOwogIH0gZWxzZSB7CiAgICBpc1F1YWxpZmllZCA9IGNvbnRhaW5lciA9PT0gbnVsbDsKICAgIHJvb3QgPSBbY29udGFpbmVyIHx8IHJvb3RdOwogIH0KICBmb3IgKGxldCBpaSA9IHBhcnNlZC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIGNhY2hlTmFtZSwKICAgICAgb3BlcmF0b3IsCiAgICAgIGluZGV4CiAgICB9ID0gcGFyc2VkW2ldOwogICAgY29uc3Qgbm9kZXMgPSBbXTsKICAgIGZvciAoY29uc3Qgbm9kZSBvZiByb290KSB7CiAgICAgIGlmICghbm9kZS5pc1hGQU9iamVjdCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBjaGlsZHJlbiwgY2FjaGVkOwogICAgICBpZiAodXNlQ2FjaGUpIHsKICAgICAgICBjYWNoZWQgPSBzb21DYWNoZS5nZXQobm9kZSk7CiAgICAgICAgaWYgKCFjYWNoZWQpIHsKICAgICAgICAgIGNhY2hlZCA9IG5ldyBNYXAoKTsKICAgICAgICAgIHNvbUNhY2hlLnNldChub2RlLCBjYWNoZWQpOwogICAgICAgIH0KICAgICAgICBjaGlsZHJlbiA9IGNhY2hlZC5nZXQoY2FjaGVOYW1lKTsKICAgICAgfQogICAgICBpZiAoIWNoaWxkcmVuKSB7CiAgICAgICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICAgICAgY2FzZSBvcGVyYXRvcnMuZG90OgogICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGVbJGdldENoaWxkcmVuQnlOYW1lXShuYW1lLCBmYWxzZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBvcGVyYXRvcnMuZG90RG90OgogICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGVbJGdldENoaWxkcmVuQnlOYW1lXShuYW1lLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIG9wZXJhdG9ycy5kb3RIYXNoOgogICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGVbJGdldENoaWxkcmVuQnlDbGFzc10obmFtZSk7CiAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uaXNYRkFPYmplY3RBcnJheSA/IGNoaWxkcmVuLmNoaWxkcmVuIDogW2NoaWxkcmVuXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHVzZUNhY2hlKSB7CiAgICAgICAgICBjYWNoZWQuc2V0KGNhY2hlTmFtZSwgY2hpbGRyZW4pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgIG5vZGVzLnB1c2goY2hpbGRyZW4pOwogICAgICB9CiAgICB9CiAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwICYmICFpc1F1YWxpZmllZCAmJiBpID09PSAwKSB7CiAgICAgIGNvbnN0IHBhcmVudCA9IGNvbnRhaW5lclskZ2V0UGFyZW50XSgpOwogICAgICBjb250YWluZXIgPSBwYXJlbnQ7CiAgICAgIGlmICghY29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaSA9IC0xOwogICAgICByb290ID0gW2NvbnRhaW5lcl07CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgcm9vdCA9IGlzRmluaXRlKGluZGV4KSA/IG5vZGVzLmZpbHRlcihub2RlID0+IGluZGV4IDwgbm9kZS5sZW5ndGgpLm1hcChub2RlID0+IG5vZGVbaW5kZXhdKSA6IG5vZGVzLmZsYXQoKTsKICB9CiAgaWYgKHJvb3QubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgcmV0dXJuIHJvb3Q7Cn0KZnVuY3Rpb24gY3JlYXRlRGF0YU5vZGUocm9vdCwgY29udGFpbmVyLCBleHByKSB7CiAgY29uc3QgcGFyc2VkID0gcGFyc2VFeHByZXNzaW9uKGV4cHIpOwogIGlmICghcGFyc2VkKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaWYgKHBhcnNlZC5zb21lKHggPT4geC5vcGVyYXRvciA9PT0gb3BlcmF0b3JzLmRvdERvdCkpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBmbiA9IHNob3J0Y3V0cy5nZXQocGFyc2VkWzBdLm5hbWUpOwogIGxldCBpID0gMDsKICBpZiAoZm4pIHsKICAgIHJvb3QgPSBmbihyb290LCBjb250YWluZXIpOwogICAgaSA9IDE7CiAgfSBlbHNlIHsKICAgIHJvb3QgPSBjb250YWluZXIgfHwgcm9vdDsKICB9CiAgZm9yIChsZXQgaWkgPSBwYXJzZWQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICBvcGVyYXRvciwKICAgICAgaW5kZXgKICAgIH0gPSBwYXJzZWRbaV07CiAgICBpZiAoIWlzRmluaXRlKGluZGV4KSkgewogICAgICBwYXJzZWRbaV0uaW5kZXggPSAwOwogICAgICByZXR1cm4gcm9vdC5jcmVhdGVOb2RlcyhwYXJzZWQuc2xpY2UoaSkpOwogICAgfQogICAgbGV0IGNoaWxkcmVuOwogICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICBjYXNlIG9wZXJhdG9ycy5kb3Q6CiAgICAgICAgY2hpbGRyZW4gPSByb290WyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgZmFsc2UpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIG9wZXJhdG9ycy5kb3REb3Q6CiAgICAgICAgY2hpbGRyZW4gPSByb290WyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgdHJ1ZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdEhhc2g6CiAgICAgICAgY2hpbGRyZW4gPSByb290WyRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpOwogICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uaXNYRkFPYmplY3RBcnJheSA/IGNoaWxkcmVuLmNoaWxkcmVuIDogW2NoaWxkcmVuXTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHJvb3QuY3JlYXRlTm9kZXMocGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICAgIGlmIChpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2luZGV4XTsKICAgICAgaWYgKCFjaGlsZC5pc1hGQU9iamVjdCkgewogICAgICAgIHdhcm4oYFhGQSAtIENhbm5vdCBjcmVhdGUgYSBub2RlLmApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJvb3QgPSBjaGlsZDsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlZFtpXS5pbmRleCA9IGluZGV4IC0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICByZXR1cm4gcm9vdC5jcmVhdGVOb2RlcyhwYXJzZWQuc2xpY2UoaSkpOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfQoKOy8vIC4vc3JjL2NvcmUveGZhL3hmYV9vYmplY3QuanMKCgoKCgoKCgoKCgoKCgoKCgpjb25zdCBfYXBwbHlQcm90b3R5cGUgPSBTeW1ib2woKTsKY29uc3QgX2F0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgX2F0dHJpYnV0ZU5hbWVzID0gU3ltYm9sKCk7CmNvbnN0IF9jaGlsZHJlbiA9IFN5bWJvbCgiX2NoaWxkcmVuIik7CmNvbnN0IF9jbG9uZUF0dHJpYnV0ZSA9IFN5bWJvbCgpOwpjb25zdCBfZGF0YVZhbHVlID0gU3ltYm9sKCk7CmNvbnN0IF9kZWZhdWx0VmFsdWUgPSBTeW1ib2woKTsKY29uc3QgX2ZpbHRlcmVkQ2hpbGRyZW5HZW5lcmF0b3IgPSBTeW1ib2woKTsKY29uc3QgX2dldFByb3RvdHlwZSA9IFN5bWJvbCgpOwpjb25zdCBfZ2V0VW5zZXRBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0IF9oYXNDaGlsZHJlbiA9IFN5bWJvbCgpOwpjb25zdCBfbWF4ID0gU3ltYm9sKCk7CmNvbnN0IF9vcHRpb25zID0gU3ltYm9sKCk7CmNvbnN0IF9wYXJlbnQgPSBTeW1ib2woInBhcmVudCIpOwpjb25zdCBfcmVzb2x2ZVByb3RvdHlwZXNIZWxwZXIgPSBTeW1ib2woKTsKY29uc3QgX3NldEF0dHJpYnV0ZXMgPSBTeW1ib2woKTsKY29uc3QgX3ZhbGlkYXRvciA9IFN5bWJvbCgpOwpsZXQgdWlkID0gMDsKY29uc3QgTlNfREFUQVNFVFMgPSBOYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7CmNsYXNzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSwgaGFzQ2hpbGRyZW4gPSBmYWxzZSkgewogICAgdGhpc1skbmFtZXNwYWNlSWRdID0gbnNJZDsKICAgIHRoaXNbJG5vZGVOYW1lXSA9IG5hbWU7CiAgICB0aGlzW19oYXNDaGlsZHJlbl0gPSBoYXNDaGlsZHJlbjsKICAgIHRoaXNbX3BhcmVudF0gPSBudWxsOwogICAgdGhpc1tfY2hpbGRyZW5dID0gW107CiAgICB0aGlzWyR1aWRdID0gYCR7bmFtZX0ke3VpZCsrfWA7CiAgICB0aGlzWyRnbG9iYWxEYXRhXSA9IG51bGw7CiAgfQogIGdldCBpc1hGQU9iamVjdCgpIHsKICAgIHJldHVybi
20B0cnVlOwogIH0KICBnZXQgaXNYRkFPYmplY3RBcnJheSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgY3JlYXRlTm9kZXMocGF0aCkgewogICAgbGV0IHJvb3QgPSB0aGlzLAogICAgICBub2RlID0gbnVsbDsKICAgIGZvciAoY29uc3QgewogICAgICBuYW1lLAogICAgICBpbmRleAogICAgfSBvZiBwYXRoKSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlzRmluaXRlKGluZGV4KSA/IGluZGV4IDogMDsgaSA8PSBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgbnNJZCA9IHJvb3RbJG5hbWVzcGFjZUlkXSA9PT0gTlNfREFUQVNFVFMgPyAtMSA6IHJvb3RbJG5hbWVzcGFjZUlkXTsKICAgICAgICBub2RlID0gbmV3IFhtbE9iamVjdChuc0lkLCBuYW1lKTsKICAgICAgICByb290WyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgIH0KICAgICAgcm9vdCA9IG5vZGU7CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgaWYgKCF0aGlzW19oYXNDaGlsZHJlbl0gfHwgIXRoaXNbJG9uQ2hpbGRDaGVja10oY2hpbGQpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IG5hbWUgPSBjaGlsZFskbm9kZU5hbWVdOwogICAgY29uc3Qgbm9kZSA9IHRoaXNbbmFtZV07CiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFhGQU9iamVjdEFycmF5KSB7CiAgICAgIGlmIChub2RlLnB1c2goY2hpbGQpKSB7CiAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKGNoaWxkKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKG5vZGUgIT09IG51bGwpIHsKICAgICAgICB0aGlzWyRyZW1vdmVDaGlsZF0obm9kZSk7CiAgICAgIH0KICAgICAgdGhpc1tuYW1lXSA9IGNoaWxkOwogICAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGxldCBpZCA9ICIiOwogICAgaWYgKHRoaXMuaWQpIHsKICAgICAgaWQgPSBgIChpZDogJHt0aGlzLmlkfSlgOwogICAgfSBlbHNlIGlmICh0aGlzLm5hbWUpIHsKICAgICAgaWQgPSBgIChuYW1lOiAke3RoaXMubmFtZX0gJHt0aGlzLmgudmFsdWV9KWA7CiAgICB9CiAgICB3YXJuKGBYRkEgLSBub2RlICIke3RoaXNbJG5vZGVOYW1lXX0iJHtpZH0gaGFzIGFscmVhZHkgZW5vdWdoICIke25hbWV9IiFgKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRvbkNoaWxkQ2hlY2tdKGNoaWxkKSB7CiAgICByZXR1cm4gdGhpcy5oYXNPd25Qcm9wZXJ0eShjaGlsZFskbm9kZU5hbWVdKSAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSB0aGlzWyRuYW1lc3BhY2VJZF07CiAgfQogIFskaXNOc0Fnbm9zdGljXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRhY2NlcHRXaGl0ZXNwYWNlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRpc0NEQVRBWG1sXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRpc0JpbmRhYmxlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyRwb3BQYXJhXSgpIHsKICAgIGlmICh0aGlzLnBhcmEpIHsKICAgICAgdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ucGFyYVN0YWNrLnBvcCgpOwogICAgfQogIH0KICBbJHB1c2hQYXJhXSgpIHsKICAgIHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLnBhcmFTdGFjay5wdXNoKHRoaXMucGFyYSk7CiAgfQogIFskc2V0SWRdKGlkcykgewogICAgaWYgKHRoaXMuaWQgJiYgdGhpc1skbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQpIHsKICAgICAgaWRzLnNldCh0aGlzLmlkLCB0aGlzKTsKICAgIH0KICB9CiAgWyRnZXRUZW1wbGF0ZVJvb3RdKCkgewogICAgcmV0dXJuIHRoaXNbJGdsb2JhbERhdGFdLnRlbXBsYXRlOwogIH0KICBbJGlzU3BsaXR0YWJsZV0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskaXNUaGVyZU1vcmVXaWR0aF0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskYXBwZW5kQ2hpbGRdKGNoaWxkKSB7CiAgICBjaGlsZFtfcGFyZW50XSA9IHRoaXM7CiAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICBpZiAoIWNoaWxkWyRnbG9iYWxEYXRhXSAmJiB0aGlzWyRnbG9iYWxEYXRhXSkgewogICAgICBjaGlsZFskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgIH0KICB9CiAgWyRyZW1vdmVDaGlsZF0oY2hpbGQpIHsKICAgIGNvbnN0IGkgPSB0aGlzW19jaGlsZHJlbl0uaW5kZXhPZihjaGlsZCk7CiAgICB0aGlzW19jaGlsZHJlbl0uc3BsaWNlKGksIDEpOwogIH0KICBbJGhhc1NldHRhYmxlVmFsdWVdKCkgewogICAgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoInZhbHVlIik7CiAgfQogIFskc2V0VmFsdWVdKF8pIHt9CiAgWyRvblRleHRdKF8pIHt9CiAgWyRmaW5hbGl6ZV0oKSB7fQogIFskY2xlYW5dKGJ1aWxkZXIpIHsKICAgIGRlbGV0ZSB0aGlzW19oYXNDaGlsZHJlbl07CiAgICBpZiAodGhpc1skY2xlYW51cF0pIHsKICAgICAgYnVpbGRlci5jbGVhbih0aGlzWyRjbGVhbnVwXSk7CiAgICAgIGRlbGV0ZSB0aGlzWyRjbGVhbnVwXTsKICAgIH0KICB9CiAgWyRpbmRleE9mXShjaGlsZCkgewogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5pbmRleE9mKGNoaWxkKTsKICB9CiAgWyRpbnNlcnRBdF0oaSwgY2hpbGQpIHsKICAgIGNoaWxkW19wYXJlbnRdID0gdGhpczsKICAgIHRoaXNbX2NoaWxkcmVuXS5zcGxpY2UoaSwgMCwgY2hpbGQpOwogICAgaWYgKCFjaGlsZFskZ2xvYmFsRGF0YV0gJiYgdGhpc1skZ2xvYmFsRGF0YV0pIHsKICAgICAgY2hpbGRbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICB9CiAgfQogIFskaXNUcmFuc3BhcmVudF0oKSB7CiAgICByZXR1cm4gIXRoaXMubmFtZTsKICB9CiAgWyRsYXN0QXR0cmlidXRlXSgpIHsKICAgIHJldHVybiAiIjsKICB9CiAgWyR0ZXh0XSgpIHsKICAgIGlmICh0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiB0aGlzWyRjb250ZW50XTsKICAgIH0KICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0ubWFwKGMgPT4gY1skdGV4dF0oKSkuam9pbigiIik7CiAgfQogIGdldCBbX2F0dHJpYnV0ZU5hbWVzXSgpIHsKICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpOwogICAgaWYgKCFwcm90by5fYXR0cmlidXRlcykgewogICAgICBjb25zdCBhdHRyaWJ1dGVzID0gcHJvdG8uX2F0dHJpYnV0ZXMgPSBuZXcgU2V0KCk7CiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICAgIGlmICh0aGlzW25hbWVdID09PSBudWxsIHx8IHRoaXNbbmFtZV0gaW5zdGFuY2VvZiBYRkFPYmplY3QgfHwgdGhpc1tuYW1lXSBpbnN0YW5jZW9mIFhGQU9iamVjdEFycmF
205KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgYXR0cmlidXRlcy5hZGQobmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgX2F0dHJpYnV0ZU5hbWVzLCBwcm90by5fYXR0cmlidXRlcyk7CiAgfQogIFskaXNEZXNjZW5kZW50XShwYXJlbnQpIHsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlIChub2RlKSB7CiAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBub2RlID0gbm9kZVskZ2V0UGFyZW50XSgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGdldFBhcmVudF0oKSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XTsKICB9CiAgWyRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIHJldHVybiB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgfQogIFskZ2V0Q2hpbGRyZW5dKG5hbWUgPSBudWxsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXTsKICAgIH0KICAgIHJldHVybiB0aGlzW25hbWVdOwogIH0KICBbJGR1bXBdKCkgewogICAgY29uc3QgZHVtcGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBkdW1wZWQuJGNvbnRlbnQgPSB0aGlzWyRjb250ZW50XTsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV07CiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhGQU9iamVjdCkgewogICAgICAgIGR1bXBlZFtuYW1lXSA9IHZhbHVlWyRkdW1wXSgpOwogICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICBpZiAoIXZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgZHVtcGVkW25hbWVdID0gdmFsdWUuZHVtcCgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBkdW1wZWRbbmFtZV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGR1bXBlZDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9CiAgKlskZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkgewogICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXNbJGdldENoaWxkcmVuXSgpKSB7CiAgICAgIHlpZWxkIG5vZGU7CiAgICB9CiAgfQogICpbX2ZpbHRlcmVkQ2hpbGRyZW5HZW5lcmF0b3JdKGZpbHRlciwgaW5jbHVkZSkgewogICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXNbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpKSB7CiAgICAgIGlmICghZmlsdGVyIHx8IGluY2x1ZGUgPT09IGZpbHRlci5oYXMobm9kZVskbm9kZU5hbWVdKSkgewogICAgICAgIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gdGhpc1skZ2V0QXZhaWxhYmxlU3BhY2VdKCk7CiAgICAgICAgY29uc3QgcmVzID0gbm9kZVskdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgICAgICAgaWYgKCFyZXMuc3VjY2VzcykgewogICAgICAgICAgdGhpc1skZXh0cmFdLmZhaWxpbmdOb2RlID0gbm9kZTsKICAgICAgICB9CiAgICAgICAgeWllbGQgcmVzOwogICAgICB9CiAgICB9CiAgfQogIFskZmx1c2hIVE1MXSgpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBbJGFkZEhUTUxdKGh0bWwsIGJib3gpIHsKICAgIHRoaXNbJGV4dHJhXS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHt9CiAgWyRjaGlsZHJlblRvSFRNTF0oewogICAgZmlsdGVyID0gbnVsbCwKICAgIGluY2x1ZGUgPSB0cnVlCiAgfSkgewogICAgaWYgKCF0aGlzWyRleHRyYV0uZ2VuZXJhdG9yKSB7CiAgICAgIHRoaXNbJGV4dHJhXS5nZW5lcmF0b3IgPSB0aGlzW19maWx0ZXJlZENoaWxkcmVuR2VuZXJhdG9yXShmaWx0ZXIsIGluY2x1ZGUpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgYXZhaWxhYmxlU3BhY2UgPSB0aGlzWyRnZXRBdmFpbGFibGVTcGFjZV0oKTsKICAgICAgY29uc3QgcmVzID0gdGhpc1skZXh0cmFdLmZhaWxpbmdOb2RlWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgICAgaWYgKCFyZXMuc3VjY2VzcykgewogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0KICAgICAgaWYgKHJlcy5odG1sKSB7CiAgICAgICAgdGhpc1skYWRkSFRNTF0ocmVzLmh0bWwsIHJlcy5iYm94KTsKICAgICAgfQogICAgICBkZWxldGUgdGhpc1skZXh0cmFdLmZhaWxpbmdOb2RlOwogICAgfQogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3QgZ2VuID0gdGhpc1skZXh0cmFdLmdlbmVyYXRvci5uZXh0KCk7CiAgICAgIGlmIChnZW4uZG9uZSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IHJlcyA9IGdlbi52YWx1ZTsKICAgICAgaWYgKCFyZXMuc3VjY2VzcykgewogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0KICAgICAgaWYgKHJlcy5odG1sKSB7CiAgICAgICAgdGhpc1skYWRkSFRNTF0ocmVzLmh0bWwsIHJlcy5iYm94KTsKICAgICAgfQogICAgfQogICAgdGhpc1skZXh0cmFdLmdlbmVyYXRvciA9IG51bGw7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICB9CiAgWyRzZXRTZXRBdHRyaWJ1dGVzXShhdHRyaWJ1dGVzKSB7CiAgICB0aGlzW19zZXRBdHRyaWJ1dGVzXSA9IG5ldyBTZXQoT2JqZWN0LmtleXMoYXR0cmlidXRlcykpOwogIH0KICBbX2dldFVuc2V0QXR0cmlidXRlc10ocHJvdG9BdHRyaWJ1dGVzKSB7CiAgICBjb25zdCBhbGxBdHRyID0gdGhpc1tfYXR0cmlidXRlTmFtZXNdOwogICAgY29uc3Qgc2V0QXR0ciA9IHRoaXNbX3NldEF0dHJpYnV0ZXNdOwogICAgcmV0dXJuIFsuLi5wcm90b0F0dHJpYnV0ZXNdLmZpbHRlcih4ID0+IGFsbEF0dHIuaGFzKHgpICYmICFzZXRBdHRyLmhhcyh4KSk7CiAgfQogIFskcmVzb2x2ZVByb3RvdHlwZXNdKGlkcywgYW5jZXN0b3JzID0gbmV3IFNldCgpKSB7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBjaGlsZFtfcmVzb2x2ZVByb3RvdHlwZXNIZWxwZXJdKGlkcywgYW5jZXN0b3JzKTsKICAgIH0KICB9CiAgW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpIHsKICAgIGNvbnN0IHByb3RvID0gdGhpc1tfZ2V0UHJvdG90eXBlXShpZHMsIGFuY2VzdG9ycyk7CiAgICBpZiAocHJvdG8pIHsKICAgICAgdGhpc1tfYXBwbHlQcm90b3R5cGVdKHByb3RvLCBpZHMsIGFuY2VzdG9ycyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzWyRyZXNvbHZlUHJvdG90eXBlc10oaWRzLCBhbmNlc3RvcnMpOwogICAgfQogIH0KICBbX2dldFByb3RvdHlwZV0oaWRzLCBhbmNlc3RvcnMpIHsKICAgIGNvbnN0IHsKICAgICAgdXNlLAogICAgICB1c2VocmVmCiAgICB9ID0gdGhpczsKICAgIGlmICghdXNlICYmICF1c2VocmVm
20KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IHByb3RvID0gbnVsbDsKICAgIGxldCBzb21FeHByZXNzaW9uID0gbnVsbDsKICAgIGxldCBpZCA9IG51bGw7CiAgICBsZXQgcmVmID0gdXNlOwogICAgaWYgKHVzZWhyZWYpIHsKICAgICAgcmVmID0gdXNlaHJlZjsKICAgICAgaWYgKHVzZWhyZWYuc3RhcnRzV2l0aCgiI3NvbSgiKSAmJiB1c2VocmVmLmVuZHNXaXRoKCIpIikpIHsKICAgICAgICBzb21FeHByZXNzaW9uID0gdXNlaHJlZi5zbGljZSgiI3NvbSgiLmxlbmd0aCwgLTEpOwogICAgICB9IGVsc2UgaWYgKHVzZWhyZWYuc3RhcnRzV2l0aCgiLiNzb20oIikgJiYgdXNlaHJlZi5lbmRzV2l0aCgiKSIpKSB7CiAgICAgICAgc29tRXhwcmVzc2lvbiA9IHVzZWhyZWYuc2xpY2UoIi4jc29tKCIubGVuZ3RoLCAtMSk7CiAgICAgIH0gZWxzZSBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgICBpZCA9IHVzZWhyZWYuc2xpY2UoMSk7CiAgICAgIH0gZWxzZSBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIuIyIpKSB7CiAgICAgICAgaWQgPSB1c2VocmVmLnNsaWNlKDIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHVzZS5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgaWQgPSB1c2Uuc2xpY2UoMSk7CiAgICB9IGVsc2UgewogICAgICBzb21FeHByZXNzaW9uID0gdXNlOwogICAgfQogICAgdGhpcy51c2UgPSB0aGlzLnVzZWhyZWYgPSAiIjsKICAgIGlmIChpZCkgewogICAgICBwcm90byA9IGlkcy5nZXQoaWQpOwogICAgfSBlbHNlIHsKICAgICAgcHJvdG8gPSBzZWFyY2hOb2RlKGlkcy5nZXQoJHJvb3QpLCB0aGlzLCBzb21FeHByZXNzaW9uLCB0cnVlLCBmYWxzZSk7CiAgICAgIGlmIChwcm90bykgewogICAgICAgIHByb3RvID0gcHJvdG9bMF07CiAgICAgIH0KICAgIH0KICAgIGlmICghcHJvdG8pIHsKICAgICAgd2FybihgWEZBIC0gSW52YWxpZCBwcm90b3R5cGUgcmVmZXJlbmNlOiAke3JlZn0uYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHByb3RvWyRub2RlTmFtZV0gIT09IHRoaXNbJG5vZGVOYW1lXSkgewogICAgICB3YXJuKGBYRkEgLSBJbmNvbXBhdGlibGUgcHJvdG90eXBlOiAke3Byb3RvWyRub2RlTmFtZV19ICE9PSAke3RoaXNbJG5vZGVOYW1lXX0uYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGFuY2VzdG9ycy5oYXMocHJvdG8pKSB7CiAgICAgIHdhcm4oYFhGQSAtIEN5Y2xlIGRldGVjdGVkIGluIHByb3RvdHlwZXMgdXNlLmApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGFuY2VzdG9ycy5hZGQocHJvdG8pOwogICAgY29uc3QgcHJvdG9Qcm90byA9IHByb3RvW19nZXRQcm90b3R5cGVdKGlkcywgYW5jZXN0b3JzKTsKICAgIGlmIChwcm90b1Byb3RvKSB7CiAgICAgIHByb3RvW19hcHBseVByb3RvdHlwZV0ocHJvdG9Qcm90bywgaWRzLCBhbmNlc3RvcnMpOwogICAgfQogICAgcHJvdG9bJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICBhbmNlc3RvcnMuZGVsZXRlKHByb3RvKTsKICAgIHJldHVybiBwcm90bzsKICB9CiAgW19hcHBseVByb3RvdHlwZV0ocHJvdG8sIGlkcywgYW5jZXN0b3JzKSB7CiAgICBpZiAoYW5jZXN0b3JzLmhhcyhwcm90bykpIHsKICAgICAgd2FybihgWEZBIC0gQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvdG90eXBlcyB1c2UuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghdGhpc1skY29udGVudF0gJiYgcHJvdG9bJGNvbnRlbnRdKSB7CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gcHJvdG9bJGNvbnRlbnRdOwogICAgfQogICAgY29uc3QgbmV3QW5jZXN0b3JzID0gbmV3IFNldChhbmNlc3RvcnMpOwogICAgbmV3QW5jZXN0b3JzLmFkZChwcm90byk7CiAgICBmb3IgKGNvbnN0IHVuc2V0QXR0ck5hbWUgb2YgdGhpc1tfZ2V0VW5zZXRBdHRyaWJ1dGVzXShwcm90b1tfc2V0QXR0cmlidXRlc10pKSB7CiAgICAgIHRoaXNbdW5zZXRBdHRyTmFtZV0gPSBwcm90b1t1bnNldEF0dHJOYW1lXTsKICAgICAgaWYgKHRoaXNbX3NldEF0dHJpYnV0ZXNdKSB7CiAgICAgICAgdGhpc1tfc2V0QXR0cmlidXRlc10uYWRkKHVuc2V0QXR0ck5hbWUpOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKHRoaXNbX2F0dHJpYnV0ZU5hbWVzXS5oYXMobmFtZSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV07CiAgICAgIGNvbnN0IHByb3RvVmFsdWUgPSBwcm90b1tuYW1lXTsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHZhbHVlW19jaGlsZHJlbl0pIHsKICAgICAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gdmFsdWVbX2NoaWxkcmVuXS5sZW5ndGgsIGlpID0gcHJvdG9WYWx1ZVtfY2hpbGRyZW5dLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGNoaWxkID0gcHJvdG9bX2NoaWxkcmVuXVtpXVskY2xvbmVdKCk7CiAgICAgICAgICBpZiAodmFsdWUucHVzaChjaGlsZCkpIHsKICAgICAgICAgICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgICAgICAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICAgICAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkgewogICAgICAgIHZhbHVlWyRyZXNvbHZlUHJvdG90eXBlc10oaWRzLCBhbmNlc3RvcnMpOwogICAgICAgIGlmIChwcm90b1ZhbHVlKSB7CiAgICAgICAgICB2YWx1ZVtfYXBwbHlQcm90b3R5cGVdKHByb3RvVmFsdWUsIGlkcywgYW5jZXN0b3JzKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgI
20H0KICAgICAgaWYgKHByb3RvVmFsdWUgIT09IG51bGwpIHsKICAgICAgICBjb25zdCBjaGlsZCA9IHByb3RvVmFsdWVbJGNsb25lXSgpOwogICAgICAgIGNoaWxkW19wYXJlbnRdID0gdGhpczsKICAgICAgICB0aGlzW25hbWVdID0gY2hpbGQ7CiAgICAgICAgdGhpc1tfY2hpbGRyZW5dLnB1c2goY2hpbGQpOwogICAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgICB9CiAgICB9CiAgfQogIHN0YXRpYyBbX2Nsb25lQXR0cmlidXRlXShvYmopIHsKICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgcmV0dXJuIG9iai5tYXAoeCA9PiBYRkFPYmplY3RbX2Nsb25lQXR0cmlidXRlXSh4KSk7CiAgICB9CiAgICBpZiAodHlwZW9mIG9iaiA9PT0gIm9iamVjdCIgJiYgb2JqICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBvYmopOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgWyRjbG9uZV0oKSB7CiAgICBjb25zdCBjbG9uZSA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpKTsKICAgIGZvciAoY29uc3QgJHN5bWJvbCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRoaXMpKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY2xvbmVbJHN5bWJvbF0gPSB0aGlzWyRzeW1ib2xdOwogICAgICB9IGNhdGNoIHsKICAgICAgICBzaGFkb3coY2xvbmUsICRzeW1ib2wsIHRoaXNbJHN5bWJvbF0pOwogICAgICB9CiAgICB9CiAgICBjbG9uZVskdWlkXSA9IGAke2Nsb25lWyRub2RlTmFtZV19JHt1aWQrK31gOwogICAgY2xvbmVbX2NoaWxkcmVuXSA9IFtdOwogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGlmICh0aGlzW19hdHRyaWJ1dGVOYW1lc10uaGFzKG5hbWUpKSB7CiAgICAgICAgY2xvbmVbbmFtZV0gPSBYRkFPYmplY3RbX2Nsb25lQXR0cmlidXRlXSh0aGlzW25hbWVdKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV07CiAgICAgIGNsb25lW25hbWVdID0gdmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSA/IG5ldyBYRkFPYmplY3RBcnJheSh2YWx1ZVtfbWF4XSkgOiBudWxsOwogICAgfQogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICAgIGNvbnN0IGNsb25lZENoaWxkID0gY2hpbGRbJGNsb25lXSgpOwogICAgICBjbG9uZVtfY2hpbGRyZW5dLnB1c2goY2xvbmVkQ2hpbGQpOwogICAgICBjbG9uZWRDaGlsZFtfcGFyZW50XSA9IGNsb25lOwogICAgICBpZiAoY2xvbmVbbmFtZV0gPT09IG51bGwpIHsKICAgICAgICBjbG9uZVtuYW1lXSA9IGNsb25lZENoaWxkOwogICAgICB9IGVsc2UgewogICAgICAgIGNsb25lW25hbWVdW19jaGlsZHJlbl0ucHVzaChjbG9uZWRDaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjbG9uZTsKICB9CiAgWyRnZXRDaGlsZHJlbl0obmFtZSA9IG51bGwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5maWx0ZXIoYyA9PiBjWyRub2RlTmFtZV0gPT09IG5hbWUpOwogIH0KICBbJGdldENoaWxkcmVuQnlDbGFzc10obmFtZSkgewogICAgcmV0dXJuIHRoaXNbbmFtZV07CiAgfQogIFskZ2V0Q2hpbGRyZW5CeU5hbWVdKG5hbWUsIGFsbFRyYW5zcGFyZW50LCBmaXJzdCA9IHRydWUpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXNbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50LCBmaXJzdCkpOwogIH0KICAqWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgZmlyc3QgPSB0cnVlKSB7CiAgICBpZiAobmFtZSA9PT0gInBhcmVudCIpIHsKICAgICAgeWllbGQgdGhpc1tfcGFyZW50XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgaWYgKGNoaWxkWyRub2RlTmFtZV0gPT09IG5hbWUpIHsKICAgICAgICB5aWVsZCBjaGlsZDsKICAgICAgfQogICAgICBpZiAoY2hpbGQubmFtZSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChhbGxUcmFuc3BhcmVudCB8fCBjaGlsZFskaXNUcmFuc3BhcmVudF0oKSkgewogICAgICAgIHlpZWxkKiBjaGlsZFskZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZhbHNlKTsKICAgICAgfQogICAgfQogICAgaWYgKGZpcnN0ICYmIHRoaXNbX2F0dHJpYnV0ZU5hbWVzXS5oYXMobmFtZSkpIHsKICAgICAgeWllbGQgbmV3IFhGQUF0dHJpYnV0ZSh0aGlzLCBuYW1lLCB0aGlzW25hbWVdKTsKICAgIH0KICB9Cn0KY2xhc3MgWEZBT2JqZWN0QXJyYXkgewogIGNvbnN0cnVjdG9yKG1heCA9IEluZmluaXR5KSB7CiAgICB0aGlzW19tYXhdID0gbWF4OwogICAgdGhpc1tfY2hpbGRyZW5dID0gW107CiAgfQogIGdldCBpc1hGQU9iamVjdCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZ2V0IGlzWEZBT2JqZWN0QXJyYXkoKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcHVzaChjaGlsZCkgewogICAgY29uc3QgbGVuID0gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aDsKICAgIGlmIChsZW4gPD0gdGhpc1tfbWF4XSkgewogICAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgd2FybihgWEZBIC0gbm9kZSAiJHtjaGlsZFskbm9kZU5hbWVdfSIgYWNjZXB0cyBubyBtb3JlIHRoYW4gJHt0aGlzW19tYXhdfSBjaGlsZHJlbmApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDA7CiAgfQogIGR1bXAoKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMSA/IHRoaXNbX2NoaWxkcmVuXVswXVskZHVtcF0oKSA6IHRoaXNbX2NoaWxkcmVuXS5tYXAoeCA9PiB4WyRkdW1wXSgpKTsKICB9CiAgWyRjbG9uZV0oKSB7CiAgICBjb25zdCBjbG9uZSA9IG5ldyBYRkFPYmplY3RBcnJheSh0aGlzW19tYXhdKTsKICAgIGNsb25lW19jaGlsZHJlbl0gPSB0aGlzW19jaGlsZHJlbl0ubWFwKGMgPT4gY1skY2xvbmVdKCkpOwogICAgcmV0dXJuIGNsb25lOwogIH0KICBnZXQgY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogIH0KICBjbGVhcigpIHsKICAgIHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPSAwOwogIH0KfQpjbGFzcyBYRkFBdHRyaWJ1dGUgewogIGNvbnN0cnVjdG9yKG5vZGUsIG5hbW
20UsIHZhbHVlKSB7CiAgICB0aGlzW19wYXJlbnRdID0gbm9kZTsKICAgIHRoaXNbJG5vZGVOYW1lXSA9IG5hbWU7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlOwogICAgdGhpc1skY29uc3VtZWRdID0gZmFsc2U7CiAgICB0aGlzWyR1aWRdID0gYGF0dHJpYnV0ZSR7dWlkKyt9YDsKICB9CiAgWyRnZXRQYXJlbnRdKCkgewogICAgcmV0dXJuIHRoaXNbX3BhcmVudF07CiAgfQogIFskaXNEYXRhVmFsdWVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskZ2V0RGF0YVZhbHVlXSgpIHsKICAgIHJldHVybiB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlIHx8ICIiOwogICAgdGhpc1skY29udGVudF0gPSB2YWx1ZS50b1N0cmluZygpOwogIH0KICBbJHRleHRdKCkgewogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdOwogIH0KICBbJGlzRGVzY2VuZGVudF0ocGFyZW50KSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XSA9PT0gcGFyZW50IHx8IHRoaXNbX3BhcmVudF1bJGlzRGVzY2VuZGVudF0ocGFyZW50KTsKICB9Cn0KY2xhc3MgWG1sT2JqZWN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBhdHRyaWJ1dGVzID0ge30pIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1skY29udGVudF0gPSAiIjsKICAgIHRoaXNbX2RhdGFWYWx1ZV0gPSBudWxsOwogICAgaWYgKG5hbWUgIT09ICIjdGV4dCIpIHsKICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgICB0aGlzW19hdHRyaWJ1dGVzXSA9IG1hcDsKICAgICAgZm9yIChjb25zdCBbYXR0ck5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkgewogICAgICAgIG1hcC5zZXQoYXR0ck5hbWUsIG5ldyBYRkFBdHRyaWJ1dGUodGhpcywgYXR0ck5hbWUsIHZhbHVlKSk7CiAgICAgIH0KICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoJG5zQXR0cmlidXRlcykpIHsKICAgICAgICBjb25zdCBkYXRhTm9kZSA9IGF0dHJpYnV0ZXNbJG5zQXR0cmlidXRlc10ueGZhLmRhdGFOb2RlOwogICAgICAgIGlmIChkYXRhTm9kZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpZiAoZGF0YU5vZGUgPT09ICJkYXRhR3JvdXAiKSB7CiAgICAgICAgICAgIHRoaXNbX2RhdGFWYWx1ZV0gPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YU5vZGUgPT09ICJkYXRhVmFsdWUiKSB7CiAgICAgICAgICAgIHRoaXNbX2RhdGFWYWx1ZV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpc1skY29uc3VtZWRdID0gZmFsc2U7CiAgfQogIFskdG9TdHJpbmddKGJ1ZikgewogICAgY29uc3QgdGFnTmFtZSA9IHRoaXNbJG5vZGVOYW1lXTsKICAgIGlmICh0YWdOYW1lID09PSAiI3RleHQiKSB7CiAgICAgIGJ1Zi5wdXNoKGVuY29kZVRvWG1sU3RyaW5nKHRoaXNbJGNvbnRlbnRdKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHV0ZjhUYWdOYW1lID0gdXRmOFN0cmluZ1RvU3RyaW5nKHRhZ05hbWUpOwogICAgY29uc3QgcHJlZml4ID0gdGhpc1skbmFtZXNwYWNlSWRdID09PSBOU19EQVRBU0VUUyA/ICJ4ZmE6IiA6ICIiOwogICAgYnVmLnB1c2goYDwke3ByZWZpeH0ke3V0ZjhUYWdOYW1lfWApOwogICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRoaXNbX2F0dHJpYnV0ZXNdLmVudHJpZXMoKSkgewogICAgICBjb25zdCB1dGY4TmFtZSA9IHV0ZjhTdHJpbmdUb1N0cmluZyhuYW1lKTsKICAgICAgYnVmLnB1c2goYCAke3V0ZjhOYW1lfT0iJHtlbmNvZGVUb1htbFN0cmluZyh2YWx1ZVskY29udGVudF0pfSJgKTsKICAgIH0KICAgIGlmICh0aGlzW19kYXRhVmFsdWVdICE9PSBudWxsKSB7CiAgICAgIGlmICh0aGlzW19kYXRhVmFsdWVdKSB7CiAgICAgICAgYnVmLnB1c2goYCB4ZmE6ZGF0YU5vZGU9ImRhdGFWYWx1ZSJgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWYucHVzaChgIHhmYTpkYXRhTm9kZT0iZGF0YUdyb3VwImApOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXNbJGNvbnRlbnRdICYmIHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDApIHsKICAgICAgYnVmLnB1c2goIi8+Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGJ1Zi5wdXNoKCI+Iik7CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgICBidWYucHVzaChlbmNvZGVUb1htbFN0cmluZyh0aGlzWyRjb250ZW50XSkpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXNbJGNvbnRlbnRdWyR0b1N0cmluZ10oYnVmKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgICBjaGlsZFskdG9TdHJpbmddKGJ1Zik7CiAgICAgIH0KICAgIH0KICAgIGJ1Zi5wdXNoKGA8LyR7cHJlZml4fSR7dXRmOFRhZ05hbWV9PmApOwogIH0KICBbJG9uQ2hpbGRdKGNoaWxkKSB7CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgY29uc3Qgbm9kZSA9IG5ldyBYbWxPYmplY3QodGhpc1skbmFtZXNwYWNlSWRdLCAiI3RleHQiKTsKICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICBub2RlWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdOwogICAgICB0aGlzWyRjb250ZW50XSA9ICIiOwogICAgfQogICAgdGhpc1skYXBwZW5kQ2hpbGRdKGNoaWxkKTsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJG9uVGV4dF0oc3RyKSB7CiAgICB0aGlzWyRjb250ZW50XSArPSBzdHI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgaWYgKHRoaXNbJGNvbnRlbnRdICYmIHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IG5vZGUgPSBuZXcgWG1sT2JqZWN0KHRoaXNbJG5hbWVzcGFjZUlkXSwgIiN0ZXh0Iik7CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgbm9kZVskY29udGVudF0gPSB0aGlzWyRjb250ZW50XTsKICAgICAgZGVsZXRlIHRoaXNbJGNvbnRlbnRdOwogICAgfQogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBpZiAodGhpc1skbm9kZU5hbWVdID09PSAiI3RleHQiKSB7CiAgICAgI
20HJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICIjdGV4dCIsCiAgICAgICAgdmFsdWU6IHRoaXNbJGNvbnRlbnRdCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgfQogIFskZ2V0Q2hpbGRyZW5dKG5hbWUgPSBudWxsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXTsKICAgIH0KICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0uZmlsdGVyKGMgPT4gY1skbm9kZU5hbWVdID09PSBuYW1lKTsKICB9CiAgWyRnZXRBdHRyaWJ1dGVzXSgpIHsKICAgIHJldHVybiB0aGlzW19hdHRyaWJ1dGVzXTsKICB9CiAgWyRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGdldENoaWxkcmVuXShuYW1lKTsKICB9CiAgKlskZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIHlpZWxkIHZhbHVlOwogICAgfQogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgaWYgKGNoaWxkWyRub2RlTmFtZV0gPT09IG5hbWUpIHsKICAgICAgICB5aWVsZCBjaGlsZDsKICAgICAgfQogICAgICBpZiAoYWxsVHJhbnNwYXJlbnQpIHsKICAgICAgICB5aWVsZCogY2hpbGRbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50KTsKICAgICAgfQogICAgfQogIH0KICAqWyRnZXRBdHRyaWJ1dGVJdF0obmFtZSwgc2tpcENvbnN1bWVkKSB7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXNbX2F0dHJpYnV0ZXNdLmdldChuYW1lKTsKICAgIGlmICh2YWx1ZSAmJiAoIXNraXBDb25zdW1lZCB8fCAhdmFsdWVbJGNvbnN1bWVkXSkpIHsKICAgICAgeWllbGQgdmFsdWU7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICB5aWVsZCogY2hpbGRbJGdldEF0dHJpYnV0ZUl0XShuYW1lLCBza2lwQ29uc3VtZWQpOwogICAgfQogIH0KICAqWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIHNraXBDb25zdW1lZCkgewogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgaWYgKGNoaWxkWyRub2RlTmFtZV0gPT09IG5hbWUgJiYgKCFza2lwQ29uc3VtZWQgfHwgIWNoaWxkWyRjb25zdW1lZF0pKSB7CiAgICAgICAgeWllbGQgY2hpbGQ7CiAgICAgIH0KICAgICAgaWYgKGFsbFRyYW5zcGFyZW50KSB7CiAgICAgICAgeWllbGQqIGNoaWxkWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIHNraXBDb25zdW1lZCk7CiAgICAgIH0KICAgIH0KICB9CiAgWyRpc0RhdGFWYWx1ZV0oKSB7CiAgICBpZiAodGhpc1tfZGF0YVZhbHVlXSA9PT0gbnVsbCkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCB8fCB0aGlzW19jaGlsZHJlbl1bMF1bJG5hbWVzcGFjZUlkXSA9PT0gTmFtZXNwYWNlSWRzLnhodG1sLmlkOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2RhdGFWYWx1ZV07CiAgfQogIFskZ2V0RGF0YVZhbHVlXSgpIHsKICAgIGlmICh0aGlzW19kYXRhVmFsdWVdID09PSBudWxsKSB7CiAgICAgIGlmICh0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1tfY2hpbGRyZW5dWzBdWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy54aHRtbC5pZCkgewogICAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl1bMF1bJHRleHRdKCkudHJpbSgpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIHZhbHVlID0gdmFsdWUudmFsdWUgfHwgIiI7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgfQogIFskZHVtcF0oaGFzTlMgPSBmYWxzZSkgewogICAgY29uc3QgZHVtcGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmIChoYXNOUykgewogICAgICBkdW1wZWQuJG5zID0gdGhpc1skbmFtZXNwYWNlSWRdOwogICAgfQogICAgaWYgKHRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIGR1bXBlZC4kY29udGVudCA9IHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgZHVtcGVkLiRuYW1lID0gdGhpc1skbm9kZU5hbWVdOwogICAgZHVtcGVkLmNoaWxkcmVuID0gW107CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBkdW1wZWQuY2hpbGRyZW4ucHVzaChjaGlsZFskZHVtcF0oaGFzTlMpKTsKICAgIH0KICAgIGR1bXBlZC5hdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB0aGlzW19hdHRyaWJ1dGVzXSkgewogICAgICBkdW1wZWQuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlWyRjb250ZW50XTsKICAgIH0KICAgIHJldHVybiBkdW1wZWQ7CiAgfQp9CmNsYXNzIENvbnRlbnRPYmplY3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1skY29udGVudF0gPSAiIjsKICB9CiAgWyRvblRleHRdKHRleHQpIHsKICAgIHRoaXNbJGNvbnRlbnRdICs9IHRleHQ7CiAgfQogIFskZmluYWxpemVdKCkge30KfQpjbGFzcyBPcHRpb25PYmplY3QgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBvcHRpb25zKSB7CiAgICBzdXBlcihuc0lkLCBuYW1lKTsKICAgIHRoaXNbX29wdGlvbnNdID0gb3B0aW9uczsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IGdldEtleXdvcmQoewogICAgICBkYXRhOiB0aGlzWyRjb250ZW50XSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzW19vcHRpb25zXVswXSwKICAgICAgdmFsaWRhdGU6IGsgPT4gdGhpc1tfb3B0aW9uc10uaW5jbHVkZXMoaykKICAgIH0pOwogIH0KICBbJGNsZWFuXShidWlsZGVyKSB7CiAgICBzdXBlclskY2xlYW5dKGJ1aWxkZXIpOwogICAgZGVsZXRlIHRoaXNbX29wdGlvbnNdOwogIH0KfQpjbGFzcyBTdHJpbmdPYmplY3QgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbn
20RlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpOwogIH0KfQpjbGFzcyBJbnRlZ2VyT2JqZWN0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSwgZGVmYXVsdFZhbHVlLCB2YWxpZGF0b3IpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1tfZGVmYXVsdFZhbHVlXSA9IGRlZmF1bHRWYWx1ZTsKICAgIHRoaXNbX3ZhbGlkYXRvcl0gPSB2YWxpZGF0b3I7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogdGhpc1skY29udGVudF0sCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpc1tfZGVmYXVsdFZhbHVlXSwKICAgICAgdmFsaWRhdGU6IHRoaXNbX3ZhbGlkYXRvcl0KICAgIH0pOwogIH0KICBbJGNsZWFuXShidWlsZGVyKSB7CiAgICBzdXBlclskY2xlYW5dKGJ1aWxkZXIpOwogICAgZGVsZXRlIHRoaXNbX2RlZmF1bHRWYWx1ZV07CiAgICBkZWxldGUgdGhpc1tfdmFsaWRhdG9yXTsKICB9Cn0KY2xhc3MgT3B0aW9uMDEgZXh0ZW5kcyBJbnRlZ2VyT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lKSB7CiAgICBzdXBlcihuc0lkLCBuYW1lLCAwLCBuID0+IG4gPT09IDEpOwogIH0KfQpjbGFzcyBPcHRpb24xMCBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUsIDEsIG4gPT4gbiA9PT0gMCk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvaHRtbF91dGlscy5qcwoKCgoKCgoKCgoKZnVuY3Rpb24gbWVhc3VyZVRvU3RyaW5nKG0pIHsKICBpZiAodHlwZW9mIG0gPT09ICJzdHJpbmciKSB7CiAgICByZXR1cm4gIjBweCI7CiAgfQogIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG0pID8gYCR7bX1weGAgOiBgJHttLnRvRml4ZWQoMil9cHhgOwp9CmNvbnN0IGNvbnZlcnRlcnMgPSB7CiAgYW5jaG9yVHlwZShub2RlLCBzdHlsZSkgewogICAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5sYXlvdXQgJiYgcGFyZW50LmxheW91dCAhPT0gInBvc2l0aW9uIikgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoISgidHJhbnNmb3JtIiBpbiBzdHlsZSkpIHsKICAgICAgc3R5bGUudHJhbnNmb3JtID0gIiI7CiAgICB9CiAgICBzd2l0Y2ggKG5vZGUuYW5jaG9yVHlwZSkgewogICAgICBjYXNlICJib3R0b21DZW50ZXIiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC01MCUsIC0xMDAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbUxlZnQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKDAsLTEwMCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiYm90dG9tUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLC0xMDAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIm1pZGRsZUNlbnRlciI6CiAgICAgICAgc3R5bGUudHJhbnNmb3JtICs9ICJ0cmFuc2xhdGUoLTUwJSwtNTAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIm1pZGRsZUxlZnQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKDAsLTUwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVSaWdodCI6CiAgICAgICAgc3R5bGUudHJhbnNmb3JtICs9ICJ0cmFuc2xhdGUoLTEwMCUsLTUwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ0b3BDZW50ZXIiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC01MCUsMCkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ0b3BSaWdodCI6CiAgICAgICAgc3R5bGUudHJhbnNmb3JtICs9ICJ0cmFuc2xhdGUoLTEwMCUsMCkiOwogICAgICAgIGJyZWFrOwogICAgfQogIH0sCiAgZGltZW5zaW9ucyhub2RlLCBzdHlsZSkgewogICAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGxldCB3aWR0aCA9IG5vZGUudzsKICAgIGNvbnN0IGhlaWdodCA9IG5vZGUuaDsKICAgIGlmIChwYXJlbnQubGF5b3V0Py5pbmNsdWRlcygicm93IikpIHsKICAgICAgY29uc3QgZXh0cmEgP
20SBwYXJlbnRbJGV4dHJhXTsKICAgICAgY29uc3QgY29sU3BhbiA9IG5vZGUuY29sU3BhbjsKICAgICAgbGV0IHc7CiAgICAgIGlmIChjb2xTcGFuID09PSAtMSkgewogICAgICAgIHcgPSBleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbikucmVkdWNlKChhLCB4KSA9PiBhICsgeCwgMCk7CiAgICAgICAgZXh0cmEuY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdyA9IGV4dHJhLmNvbHVtbldpZHRocy5zbGljZShleHRyYS5jdXJyZW50Q29sdW1uLCBleHRyYS5jdXJyZW50Q29sdW1uICsgY29sU3BhbikucmVkdWNlKChhLCB4KSA9PiBhICsgeCwgMCk7CiAgICAgICAgZXh0cmEuY3VycmVudENvbHVtbiA9IChleHRyYS5jdXJyZW50Q29sdW1uICsgbm9kZS5jb2xTcGFuKSAlIGV4dHJhLmNvbHVtbldpZHRocy5sZW5ndGg7CiAgICAgIH0KICAgICAgaWYgKCFpc05hTih3KSkgewogICAgICAgIHdpZHRoID0gbm9kZS53ID0gdzsKICAgICAgfQogICAgfQogICAgc3R5bGUud2lkdGggPSB3aWR0aCAhPT0gIiIgPyBtZWFzdXJlVG9TdHJpbmcod2lkdGgpIDogImF1dG8iOwogICAgc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICE9PSAiIiA/IG1lYXN1cmVUb1N0cmluZyhoZWlnaHQpIDogImF1dG8iOwogIH0sCiAgcG9zaXRpb24obm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAocGFyZW50Py5sYXlvdXQgJiYgcGFyZW50LmxheW91dCAhPT0gInBvc2l0aW9uIikgewogICAgICByZXR1cm47CiAgICB9CiAgICBzdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICBzdHlsZS5sZWZ0ID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUueCk7CiAgICBzdHlsZS50b3AgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS55KTsKICB9LAogIHJvdGF0ZShub2RlLCBzdHlsZSkgewogICAgaWYgKG5vZGUucm90YXRlKSB7CiAgICAgIGlmICghKCJ0cmFuc2Zvcm0iIGluIHN0eWxlKSkgewogICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9ICIiOwogICAgICB9CiAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSBgcm90YXRlKC0ke25vZGUucm90YXRlfWRlZylgOwogICAgICBzdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAidG9wIGxlZnQiOwogICAgfQogIH0sCiAgcHJlc2VuY2Uobm9kZSwgc3R5bGUpIHsKICAgIHN3aXRjaCAobm9kZS5wcmVzZW5jZSkgewogICAgICBjYXNlICJpbnZpc2libGUiOgogICAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaGlkZGVuIjoKICAgICAgY2FzZSAiaW5hY3RpdmUiOgogICAgICAgIHN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfSwKICBoQWxpZ24obm9kZSwgc3R5bGUpIHsKICAgIGlmIChub2RlWyRub2RlTmFtZV0gPT09ICJwYXJhIikgewogICAgICBzd2l0Y2ggKG5vZGUuaEFsaWduKSB7CiAgICAgICAgY2FzZSAianVzdGlmeUFsbCI6CiAgICAgICAgICBzdHlsZS50ZXh0QWxpZ24gPSAianVzdGlmeS1hbGwiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmFkaXgiOgogICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gImxlZnQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9IG5vZGUuaEFsaWduOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKG5vZGUuaEFsaWduKSB7CiAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICBzdHlsZS5hbGlnblNlbGYgPSAic3RhcnQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiY2VudGVyIjoKICAgICAgICAgIHN0eWxlLmFsaWduU2VsZiA9ICJjZW50ZXIiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgc3R5bGUuYWxpZ25TZWxmID0gImVuZCI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCiAgbWFyZ2luKG5vZGUsIHN0eWxlKSB7CiAgICBpZiAobm9kZS5tYXJnaW4pIHsKICAgICAgc3R5bGUubWFyZ2luID0gbm9kZS5tYXJnaW5bJHRvU3R5bGVdKCkubWFyZ2luOwogICAgfQogIH0KfTsKZnVuY3Rpb24gc2V0TWluTWF4RGltZW5zaW9ucyhub2RlLCBzdHlsZSkgewogIGNvbnN0IHBhcmVudCA9IG5vZGVbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgaWYgKHBhcmVudC5sYXlvdXQgPT09ICJwb3NpdGlvbiIpIHsKICAgIGlmIChub2RlLm1pblcgPiAwKSB7CiAgICAgIHN0eWxlLm1pbldpZHRoID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUubWluVyk7CiAgICB9CiAgICBpZiAobm9kZS5tYXhXID4gMCkgewogICAgICBzdHlsZS5tYXhXaWR0aCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLm1heFcpOwogICAgfQogICAgaWYgKG5vZGUubWluSCA+IDApIHsKICAgICAgc3R5bGUubWluSGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUubWluSCk7CiAgICB9CiAgICBpZiAobm9kZS5tYXhIID4gMCkgewogICAgICBzdHlsZS5tYXhIZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5tYXhIKTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gbGF5b3V0VGV4dCh0ZXh0LCB4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQsIGZvbnRGaW5kZXIsIHdpZHRoKSB7CiAgY29uc3QgbWVhc3VyZSA9IG5ldyBUZXh0TWVhc3VyZSh4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQsIGZvbnRGaW5kZXIpOwogIGlmICh0eXBlb2YgdGV4dCA9PT0gInN0cmluZyIpIHsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKHRleHQpOwogIH0gZWxzZSB7CiAgICB0ZXh0WyRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICB9CiAgcmV0dXJuIG1lYXN1cmUuY29tcHV0ZSh3aWR0aCk7Cn0KZnVuY3Rpb24gbGF5b3V0Tm9kZShub2RlLCBhdmFpbGFibGVTcGFjZSkgewogIGxldCBoZWlnaHQgPSBudWxsOwogIGxldCB3aWR0aCA9IG51bGw7CiAgbGV0IGlzQnJva2VuID0gZmFsc2U7CiAgaWYgKCghbm9kZS53IHx8ICFub2RlLmgpICYmIG5vZGUudmFsdWUpIHsKICAgIGxldCBtYXJnaW5IID0gMDsKICAgIGxldCBtYXJnaW5WID0gMDsKICAgIGlmIChub2RlLm1hcmdpbikgewogICAgICBtYXJnaW5IID0gbm9kZS5tYXJnaW4ubGVmdEluc2V0ICsgbm9kZS5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgbWFyZ2luViA9IG5vZGUubWFyZ2luLnRvcEluc2V0ICsgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICB9CiAgICBsZXQgbGluZUhlaWdodCA9IG51bGw7CiAgICBsZXQgbWFyZ2luID0gbnVsbDsKICAgIGlmIChub2RlLnBhcmEpIHsKICAgICAgbWFyZ2luID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGluZUhlaWdodCA9IG5vZGUucGFyYS5saW5lSGVpZ2h0ID09PSAiIiA/IG51bGwgOiBub2RlLnBhcmEubGluZUhlaWdodDsKICAgICAgbWFyZ2luLnRvcCA9IG5vZGUucGFyYS5zcGFjZUFib3ZlID09PSAiIiA/IDAgOiBub2RlLnBhcmEuc3BhY2VBYm92ZTsKICAgICAgbWFyZ2luLmJvdHRvbSA9IG5vZGUucGFyYS5zcGFjZUJlbG93ID09PSAiIiA/IDAgOiBub2RlLnBhcmEuc3BhY2VCZWxvdzsKICAgICAgbWFyZ2luLmxlZnQgPSBub2RlLnBhcmEubWFyZ2luTGVmdCA9PT0gIiIgPyAwIDogbm9kZS5wYXJhLm1hcmdpbkxlZnQ7CiAgICAgIG1hcmdpbi5yaWdodCA9IG5vZGUucGFyYS5tYXJnaW5SaWdodCA9PT0gIiIgPyAwIDogbm9kZS5wYXJhLm1hcmdpblJpZ2h0OwogICAgfQogICAgbGV0IGZvbnQgPSBub2RlLmZvbnQ7CiAgICBpZiAoIWZvbnQpIHsKICAgICAgY29uc3Qgcm9vdCA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgICAgbGV0IHBhcmVudCA9IG5vZGVbJGdldFBhcmVudF0oKTsKICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IHJvb3QpIHsKICAgICAgICBpZiAocGFyZW50LmZvbnQpIHsKICAgICAgICAgIGZvbnQgPSBwYXJlbnQuZm9udDsKICAgICAgICAgIGJyZWFrOwogICAgICAgI
20H0KICAgICAgICBwYXJlbnQgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgICAgfQogICAgfQogICAgY29uc3QgbWF4V2lkdGggPSAobm9kZS53IHx8IGF2YWlsYWJsZVNwYWNlLndpZHRoKSAtIG1hcmdpbkg7CiAgICBjb25zdCBmb250RmluZGVyID0gbm9kZVskZ2xvYmFsRGF0YV0uZm9udEZpbmRlcjsKICAgIGlmIChub2RlLnZhbHVlLmV4RGF0YSAmJiBub2RlLnZhbHVlLmV4RGF0YVskY29udGVudF0gJiYgbm9kZS52YWx1ZS5leERhdGEuY29udGVudFR5cGUgPT09ICJ0ZXh0L2h0bWwiKSB7CiAgICAgIGNvbnN0IHJlcyA9IGxheW91dFRleHQobm9kZS52YWx1ZS5leERhdGFbJGNvbnRlbnRdLCBmb250LCBtYXJnaW4sIGxpbmVIZWlnaHQsIGZvbnRGaW5kZXIsIG1heFdpZHRoKTsKICAgICAgd2lkdGggPSByZXMud2lkdGg7CiAgICAgIGhlaWdodCA9IHJlcy5oZWlnaHQ7CiAgICAgIGlzQnJva2VuID0gcmVzLmlzQnJva2VuOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgdGV4dCA9IG5vZGUudmFsdWVbJHRleHRdKCk7CiAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgY29uc3QgcmVzID0gbGF5b3V0VGV4dCh0ZXh0LCBmb250LCBtYXJnaW4sIGxpbmVIZWlnaHQsIGZvbnRGaW5kZXIsIG1heFdpZHRoKTsKICAgICAgICB3aWR0aCA9IHJlcy53aWR0aDsKICAgICAgICBoZWlnaHQgPSByZXMuaGVpZ2h0OwogICAgICAgIGlzQnJva2VuID0gcmVzLmlzQnJva2VuOwogICAgICB9CiAgICB9CiAgICBpZiAod2lkdGggIT09IG51bGwgJiYgIW5vZGUudykgewogICAgICB3aWR0aCArPSBtYXJnaW5IOwogICAgfQogICAgaWYgKGhlaWdodCAhPT0gbnVsbCAmJiAhbm9kZS5oKSB7CiAgICAgIGhlaWdodCArPSBtYXJnaW5WOwogICAgfQogIH0KICByZXR1cm4gewogICAgdzogd2lkdGgsCiAgICBoOiBoZWlnaHQsCiAgICBpc0Jyb2tlbgogIH07Cn0KZnVuY3Rpb24gY29tcHV0ZUJib3gobm9kZSwgaHRtbCwgYXZhaWxhYmxlU3BhY2UpIHsKICBsZXQgYmJveDsKICBpZiAobm9kZS53ICE9PSAiIiAmJiBub2RlLmggIT09ICIiKSB7CiAgICBiYm94ID0gW25vZGUueCwgbm9kZS55LCBub2RlLncsIG5vZGUuaF07CiAgfSBlbHNlIHsKICAgIGlmICghYXZhaWxhYmxlU3BhY2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgd2lkdGggPSBub2RlLnc7CiAgICBpZiAod2lkdGggPT09ICIiKSB7CiAgICAgIGlmIChub2RlLm1heFcgPT09IDApIHsKICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgICAgIHdpZHRoID0gcGFyZW50LmxheW91dCA9PT0gInBvc2l0aW9uIiAmJiBwYXJlbnQudyAhPT0gIiIgPyAwIDogbm9kZS5taW5XOwogICAgICB9IGVsc2UgewogICAgICAgIHdpZHRoID0gTWF0aC5taW4obm9kZS5tYXhXLCBhdmFpbGFibGVTcGFjZS53aWR0aCk7CiAgICAgIH0KICAgICAgaHRtbC5hdHRyaWJ1dGVzLnN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHdpZHRoKTsKICAgIH0KICAgIGxldCBoZWlnaHQgPSBub2RlLmg7CiAgICBpZiAoaGVpZ2h0ID09PSAiIikgewogICAgICBpZiAobm9kZS5tYXhIID09PSAwKSB7CiAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZVskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgICAgICBoZWlnaHQgPSBwYXJlbnQubGF5b3V0ID09PSAicG9zaXRpb24iICYmIHBhcmVudC5oICE9PSAiIiA/IDAgOiBub2RlLm1pbkg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4obm9kZS5tYXhILCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpOwogICAgICB9CiAgICAgIGh0bWwuYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0KICAgIGJib3ggPSBbbm9kZS54LCBub2RlLnksIHdpZHRoLCBoZWlnaHRdOwogIH0KICByZXR1cm4gYmJveDsKfQpmdW5jdGlvbiBmaXhEaW1lbnNpb25zKG5vZGUpIHsKICBjb25zdCBwYXJlbnQgPSBub2RlWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogIGlmIChwYXJlbnQubGF5b3V0Py5pbmNsdWRlcygicm93IikpIHsKICAgIGNvbnN0IGV4dHJhID0gcGFyZW50WyRleHRyYV07CiAgICBjb25zdCBjb2xTcGFuID0gbm9kZS5jb2xTcGFuOwogICAgbGV0IHdpZHRoOwogICAgaWYgKGNvbFNwYW4gPT09IC0xKSB7CiAgICAgIHdpZHRoID0gZXh0cmEuY29sdW1uV2lkdGhzLnNsaWNlKGV4dHJhLmN1cnJlbnRDb2x1bW4pLnJlZHVjZSgoYSwgdykgPT4gYSArIHcsIDApOwogICAgfSBlbHNlIHsKICAgICAgd2lkdGggPSBleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbiwgZXh0cmEuY3VycmVudENvbHVtbiArIGNvbFNwYW4pLnJlZHVjZSgoYSwgdykgPT4gYSArIHcsIDApOwogICAgfQogICAgaWYgKCFpc05hTih3aWR0aCkpIHsKICAgICAgbm9kZS53ID0gd2lkdGg7CiAgICB9CiAgfQogIGlmIChwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgIG5vZGUueCA9IG5vZGUueSA9IDA7CiAgfQogIGlmIChub2RlLmxheW91dCA9PT0gInRhYmxlIikgewogICAgaWYgKG5vZGUudyA9PT0gIiIgJiYgQXJyYXkuaXNBcnJheShub2RlLmNvbHVtbldpZHRocykpIHsKICAgICAgbm9kZS53ID0gbm9kZS5jb2x1bW5XaWR0aHMucmVkdWNlKChhLCB4KSA9PiBhICsgeCwgMCk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGxheW91dENsYXNzKG5vZGUpIHsKICBzd2l0Y2ggKG5vZGUubGF5b3V0KSB7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIHJldHVybiAieGZhUG9zaXRpb24iOwogICAgY2FzZSAibHItdGIiOgogICAgICByZXR1cm4gInhmYUxyVGIiOwogICAgY2FzZSAicmwtcm93IjoKICAgICAgcmV0dXJuICJ4ZmFSbFJvdyI7CiAgICBjYXNlICJybC10YiI6CiAgICAgIHJldHVybiAieGZhUmxUYiI7CiAgICBjYXNlICJyb3ciOgogICAgICByZXR1cm4gInhmYVJvdyI7CiAgICBjYXNlICJ0YWJsZSI6CiAgICAgIHJldHVybiAieGZhVGFibGUiOwogICAgY2FzZSAidGIiOgogICAgICByZXR1cm4gInhmYVRiIjsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAieGZhUG9zaXRpb24iOwogIH0KfQpmdW5jdGlvbiB0b1N0eWxlKG5vZGUsIC4uLm5hbWVzKSB7CiAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykgewogICAgY29uc3QgdmFsdWUgPSBub2RlW25hbWVdOwogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGNvbnZlcnRlcnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgY29udmVydGVyc1tuYW1lXShub2RlLCBzdHlsZSk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgIGNvbnN0IG5ld1N0eWxlID0gdmFsdWVbJHRvU3R5bGVdKCk7CiAgICAgIGlmIChuZXdTdHlsZSkgewogICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIG5ld1N0eWxlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3YXJuKGAoREVCVUcpIC0gWEZBIC0gc3R5bGUgZm9yICR7bmFtZX0gbm90IGltcGxlbWVudGVkIHlldGApOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybi
20BzdHlsZTsKfQpmdW5jdGlvbiBjcmVhdGVXcmFwcGVyKG5vZGUsIGh0bWwpIHsKICBjb25zdCB7CiAgICBhdHRyaWJ1dGVzCiAgfSA9IGh0bWw7CiAgY29uc3QgewogICAgc3R5bGUKICB9ID0gYXR0cmlidXRlczsKICBjb25zdCB3cmFwcGVyID0gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzOiB7CiAgICAgIGNsYXNzOiBbInhmYVdyYXBwZXIiXSwKICAgICAgc3R5bGU6IE9iamVjdC5jcmVhdGUobnVsbCkKICAgIH0sCiAgICBjaGlsZHJlbjogW10KICB9OwogIGF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhV3JhcHBlZCIpOwogIGlmIChub2RlLmJvcmRlcikgewogICAgY29uc3QgewogICAgICB3aWR0aHMsCiAgICAgIGluc2V0cwogICAgfSA9IG5vZGUuYm9yZGVyWyRleHRyYV07CiAgICBsZXQgd2lkdGgsIGhlaWdodDsKICAgIGxldCB0b3AgPSBpbnNldHNbMF07CiAgICBsZXQgbGVmdCA9IGluc2V0c1szXTsKICAgIGNvbnN0IGluc2V0c0ggPSBpbnNldHNbMF0gKyBpbnNldHNbMl07CiAgICBjb25zdCBpbnNldHNXID0gaW5zZXRzWzFdICsgaW5zZXRzWzNdOwogICAgc3dpdGNoIChub2RlLmJvcmRlci5oYW5kKSB7CiAgICAgIGNhc2UgImV2ZW4iOgogICAgICAgIHRvcCAtPSB3aWR0aHNbMF0gLyAyOwogICAgICAgIGxlZnQgLT0gd2lkdGhzWzNdIC8gMjsKICAgICAgICB3aWR0aCA9IGBjYWxjKDEwMCUgKyAkeyh3aWR0aHNbMV0gKyB3aWR0aHNbM10pIC8gMiAtIGluc2V0c1d9cHgpYDsKICAgICAgICBoZWlnaHQgPSBgY2FsYygxMDAlICsgJHsod2lkdGhzWzBdICsgd2lkdGhzWzJdKSAvIDIgLSBpbnNldHNIfXB4KWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImxlZnQiOgogICAgICAgIHRvcCAtPSB3aWR0aHNbMF07CiAgICAgICAgbGVmdCAtPSB3aWR0aHNbM107CiAgICAgICAgd2lkdGggPSBgY2FsYygxMDAlICsgJHt3aWR0aHNbMV0gKyB3aWR0aHNbM10gLSBpbnNldHNXfXB4KWA7CiAgICAgICAgaGVpZ2h0ID0gYGNhbGMoMTAwJSArICR7d2lkdGhzWzBdICsgd2lkdGhzWzJdIC0gaW5zZXRzSH1weClgOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgd2lkdGggPSBpbnNldHNXID8gYGNhbGMoMTAwJSAtICR7aW5zZXRzV31weClgIDogIjEwMCUiOwogICAgICAgIGhlaWdodCA9IGluc2V0c0ggPyBgY2FsYygxMDAlIC0gJHtpbnNldHNIfXB4KWAgOiAiMTAwJSI7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFCb3JkZXIiXTsKICAgIGlmIChpc1ByaW50T25seShub2RlLmJvcmRlcikpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGNvbnN0IGJvcmRlciA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogY2xhc3NOYW1lcywKICAgICAgICBzdHlsZTogewogICAgICAgICAgdG9wOiBgJHt0b3B9cHhgLAogICAgICAgICAgbGVmdDogYCR7bGVmdH1weGAsCiAgICAgICAgICB3aWR0aCwKICAgICAgICAgIGhlaWdodAogICAgICAgIH0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogICAgZm9yIChjb25zdCBrZXkgb2YgWyJib3JkZXIiLCAiYm9yZGVyV2lkdGgiLCAiYm9yZGVyQ29sb3IiLCAiYm9yZGVyUmFkaXVzIiwgImJvcmRlclN0eWxlIl0pIHsKICAgICAgaWYgKHN0eWxlW2tleV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGJvcmRlci5hdHRyaWJ1dGVzLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldOwogICAgICAgIGRlbGV0ZSBzdHlsZVtrZXldOwogICAgICB9CiAgICB9CiAgICB3cmFwcGVyLmNoaWxkcmVuLnB1c2goYm9yZGVyLCBodG1sKTsKICB9IGVsc2UgewogICAgd3JhcHBlci5jaGlsZHJlbi5wdXNoKGh0bWwpOwogIH0KICBmb3IgKGNvbnN0IGtleSBvZiBbImJhY2tncm91bmQiLCAiYmFja2dyb3VuZENsaXAiLCAidG9wIiwgImxlZnQiLCAid2lkdGgiLCAiaGVpZ2h0IiwgIm1pbldpZHRoIiwgIm1pbkhlaWdodCIsICJtYXhXaWR0aCIsICJtYXhIZWlnaHQiLCAidHJhbnNmb3JtIiwgInRyYW5zZm9ybU9yaWdpbiIsICJ2aXNpYmlsaXR5Il0pIHsKICAgIGlmIChzdHlsZVtrZXldICE9PSB1bmRlZmluZWQpIHsKICAgICAgd3JhcHBlci5hdHRyaWJ1dGVzLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldOwogICAgICBkZWxldGUgc3R5bGVba2V5XTsKICAgIH0KICB9CiAgd3JhcHBlci5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gc3R5bGUucG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgPyAiYWJzb2x1dGUiIDogInJlbGF0aXZlIjsKICBkZWxldGUgc3R5bGUucG9zaXRpb247CiAgaWYgKHN0eWxlLmFsaWduU2VsZikgewogICAgd3JhcHBlci5hdHRyaWJ1dGVzLnN0eWxlLmFsaWduU2VsZiA9IHN0eWxlLmFsaWduU2VsZjsKICAgIGRlbGV0ZSBzdHlsZS5hbGlnblNlbGY7CiAgfQogIHJldHVybiB3cmFwcGVyOwp9CmZ1bmN0aW9uIGZpeFRleHRJbmRlbnQoc3R5bGVzKSB7CiAgY29uc3QgaW5kZW50ID0gZ2V0TWVhc3VyZW1lbnQoc3R5bGVzLnRleHRJbmRlbnQsICIwcHgiKTsKICBpZiAoaW5kZW50ID49IDApIHsKICAgIHJldHVybjsKICB9CiAgY29uc3QgYWxpZ24gPSBzdHlsZXMudGV4dEFsaWduID09PSAicmlnaHQiID8gInJpZ2h0IiA6ICJsZWZ0IjsKICBjb25zdCBuYW1lID0gInBhZGRpbmciICsgKGFsaWduID09PSAibGVmdCIgPyAiTGVmdCIgOiAiUmlnaHQiKTsKICBjb25zdCBwYWRkaW5nID0gZ2V0TWVhc3VyZW1lbnQoc3R5bGVzW25hbWVdLCAiMHB4Iik7CiAgc3R5bGVzW25hbWVdID0gYCR7cGFkZGluZyAtIGluZGVudH1weGA7Cn0KZnVuY3Rpb24gc2V0QWNjZXNzKG5vZGUsIGNsYXNzTmFtZXMpIHsKICBzd2l0Y2ggKG5vZGUuYWNjZXNzKSB7CiAgICBjYXNlICJub25JbnRlcmFjdGl2ZSI6CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhTm9uSW50ZXJhY3RpdmUiKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJyZWFkT25seSI6CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUmVhZE9ubHkiKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJwcm90ZWN0ZWQiOgogICAgICBjbGFzc05hbWVzLnB1c2goInhmYURpc2FibGVkIik7CiAgICAgIGJyZWFrOwogIH0KfQpmdW5jdGlvbiBpc1ByaW50T25seShub2RlKSB7CiAgcmV0dXJuIG5vZGUucmVsZXZhbnQubGVuZ3RoID4gMCAmJiAhbm9kZS5yZWxldmFudFswXS5leGNsdWRlZCAmJiBub2RlLnJlbGV2YW50WzBdLnZpZXduYW1lID09PSAicHJpbnQiOwp9CmZ1bmN0aW9uIGdldEN1cnJlbnRQYXJhKG5vZGUpIHsKICBjb25zdCBzdGFjayA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLnBhcmFTdGFjazsKICByZXR1cm4gc3RhY2subGVuZ3RoID8gc3RhY2suYXQoLTEpID
20ogbnVsbDsKfQpmdW5jdGlvbiBzZXRQYXJhKG5vZGUsIG5vZGVTdHlsZSwgdmFsdWUpIHsKICBpZiAodmFsdWUuYXR0cmlidXRlcy5jbGFzcz8uaW5jbHVkZXMoInhmYVJpY2giKSkgewogICAgaWYgKG5vZGVTdHlsZSkgewogICAgICBpZiAobm9kZS5oID09PSAiIikgewogICAgICAgIG5vZGVTdHlsZS5oZWlnaHQgPSAiYXV0byI7CiAgICAgIH0KICAgICAgaWYgKG5vZGUudyA9PT0gIiIpIHsKICAgICAgICBub2RlU3R5bGUud2lkdGggPSAiYXV0byI7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHBhcmEgPSBnZXRDdXJyZW50UGFyYShub2RlKTsKICAgIGlmIChwYXJhKSB7CiAgICAgIGNvbnN0IHZhbHVlU3R5bGUgPSB2YWx1ZS5hdHRyaWJ1dGVzLnN0eWxlOwogICAgICB2YWx1ZVN0eWxlLmRpc3BsYXkgPSAiZmxleCI7CiAgICAgIHZhbHVlU3R5bGUuZmxleERpcmVjdGlvbiA9ICJjb2x1bW4iOwogICAgICBzd2l0Y2ggKHBhcmEudkFsaWduKSB7CiAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgIHZhbHVlU3R5bGUuanVzdGlmeUNvbnRlbnQgPSAic3RhcnQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgIHZhbHVlU3R5bGUuanVzdGlmeUNvbnRlbnQgPSAiZW5kIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1pZGRsZSI6CiAgICAgICAgICB2YWx1ZVN0eWxlLmp1c3RpZnlDb250ZW50ID0gImNlbnRlciI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCBwYXJhU3R5bGUgPSBwYXJhWyR0b1N0eWxlXSgpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVud
20HJpZXMocGFyYVN0eWxlKSkgewogICAgICAgIGlmICghKGtleSBpbiB2YWx1ZVN0eWxlKSkgewogICAgICAgICAgdmFsdWVTdHlsZVtrZXldID0gdmFsOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpmdW5jdGlvbiBzZXRGb250RmFtaWx5KHhmYUZvbnQsIG5vZGUsIGZvbnRGaW5kZXIsIHN0eWxlKSB7CiAgaWYgKCFmb250RmluZGVyKSB7CiAgICBkZWxldGUgc3R5bGUuZm9udEZhbWlseTsKICAgIHJldHVybjsKICB9CiAgY29uc3QgbmFtZSA9IHN0cmlwUXVvdGVzKHhmYUZvbnQudHlwZWZhY2UpOwogIHN0eWxlLmZvbnRGYW1pbHkgPSBgIiR7bmFtZX0iYDsKICBjb25zdCB0eXBlZmFjZSA9IGZvbnRGaW5kZXIuZmluZChuYW1lKTsKICBpZiAodHlwZWZhY2UpIHsKICAgIGNvbnN0IHsKICAgICAgZm9udEZhbWlseQogICAgfSA9IHR5cGVmYWNlLnJlZ3VsYXIuY3NzRm9udEluZm87CiAgICBpZiAoZm9udEZhbWlseSAhPT0gbmFtZSkgewogICAgICBzdHlsZS5mb250RmFtaWx5ID0gYCIke2ZvbnRGYW1pbHl9ImA7CiAgICB9CiAgICBjb25zdCBwYXJhID0gZ2V0Q3VycmVudFBhcmEobm9kZSk7CiAgICBpZiAocGFyYSAmJiBwYXJhLmxpbmVIZWlnaHQgIT09ICIiKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChzdHlsZS5saW5lSGVpZ2h0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBkZkZvbnQgPSBzZWxlY3RGb250KHhmYUZvbnQsIHR5cGVmYWNlKTsKICAgIGlmIChwZGZGb250KSB7CiAgICAgIHN0eWxlLmxpbmVIZWlnaHQgPSBNYXRoLm1heCgxLjIsIHBkZkZvbnQubGluZUhlaWdodCk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGZpeFVSTChzdHIpIHsKICBjb25zdCBhYnNvbHV0ZVVybCA9IGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwoc3RyLCBudWxsLCB7CiAgICBhZGREZWZhdWx0UHJvdG9jb2w6IHRydWUsCiAgICB0cnlDb252ZXJ0RW5jb2Rpbmc6IHRydWUKICB9KTsKICByZXR1cm4gYWJzb2x1dGVVcmwgPyBhYnNvbHV0ZVVybC5ocmVmIDogbnVsbDsKfQoKOy8vIC4vc3JjL2NvcmUveGZhL2xheW91dC5qcwoKCgoKCmZ1bmN0aW9uIGNyZWF0ZUxpbmUobm9kZSwgY2hpbGRyZW4pIHsKICByZXR1cm4gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzOiB7CiAgICAgIGNsYXNzOiBbbm9kZS5sYXlvdXQgPT09ICJsci10YiIgPyAieGZhTHIiIDogInhmYVJsIl0KICAgIH0sCiAgICBjaGlsZHJlbgogIH07Cn0KZnVuY3Rpb24gZmx1c2hIVE1MKG5vZGUpIHsKICBpZiAoIW5vZGVbJGV4dHJhXSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGF0dHJpYnV0ZXMgPSBub2RlWyRleHRyYV0uYXR0cmlidXRlczsKICBjb25zdCBodG1sID0gewogICAgbmFtZTogImRpdiIsCiAgICBhdHRyaWJ1dGVzLAogICAgY2hpbGRyZW46IG5vZGVbJGV4dHJhXS5jaGlsZHJlbgogIH07CiAgaWYgKG5vZGVbJGV4dHJhXS5mYWlsaW5nTm9kZSkgewogICAgY29uc3QgaHRtbEZyb21GYWlsaW5nID0gbm9kZVskZXh0cmFdLmZhaWxpbmdOb2RlWyRmbHVzaEhUTUxdKCk7CiAgICBpZiAoaHRtbEZyb21GYWlsaW5nKSB7CiAgICAgIGlmIChub2RlLmxheW91dC5lbmRzV2l0aCgiLXRiIikpIHsKICAgICAgICBodG1sLmNoaWxkcmVuLnB1c2goY3JlYXRlTGluZShub2RlLCBbaHRtbEZyb21GYWlsaW5nXSkpOwogICAgICB9IGVsc2UgewogICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaChodG1sRnJvbUZhaWxpbmcpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChodG1sLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiBodG1sOwp9CmZ1bmN0aW9uIGFkZEhUTUwobm9kZSwgaHRtbCwgYmJveCkgewogIGNvbnN0IGV4dHJhID0gbm9kZVskZXh0cmFdOwogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gZXh0cmEuYXZhaWxhYmxlU3BhY2U7CiAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICBzd2l0Y2ggKG5vZGUubGF5b3V0KSB7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGgubWF4KGV4dHJhLndpZHRoLCB4ICsgdyk7CiAgICAgICAgZXh0cmEuaGVpZ2h0ID0gTWF0aC5tYXgoZXh0cmEuaGVpZ2h0LCB5ICsgaCk7CiAgICAgICAgZXh0cmEuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAibHItdGIiOgogICAgY2FzZSAicmwtdGIiOgogICAgICBpZiAoIWV4dHJhLmxpbmUgfHwgZXh0cmEuYXR0ZW1wdCA9PT0gMSkgewogICAgICAgIGV4dHJhLmxpbmUgPSBjcmVhdGVMaW5lKG5vZGUsIFtdKTsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGV4dHJhLmxpbmUpOwogICAgICAgIGV4dHJhLm51bWJlckluTGluZSA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEubnVtYmVySW5MaW5lICs9IDE7CiAgICAgIGV4dHJhLmxpbmUuY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgaWYgKGV4dHJhLmF0dGVtcHQgPT09IDApIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGV4dHJhLnByZXZIZWlnaHQgKyBoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHRyYS5jdXJyZW50V2lkdGggPSB3OwogICAgICAgIGV4dHJhLnByZXZIZWlnaHQgPSBleHRyYS5oZWlnaHQ7CiAgICAgICAgZXh0cmEuaGVpZ2h0ICs9IGg7CiAgICAgICAgZXh0cmEuYXR0ZW1wdCA9IDA7CiAgICAgIH0KICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1heChleHRyYS53aWR0aCwgZXh0cmEuY3VycmVudFdpZHRoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgewogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgZXh0cmEud2lkdGggKz0gdzsKICAgICAgICBleHRyYS5oZWlnaHQgPSBNYXRoLm1heChleHRyYS5oZWlnaHQsIGgpOwogICAgICAgIGNvbnN0IGhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhleHRyYS5oZWlnaHQpOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZXh0cmEuY2hpbGRyZW4pIHsKICAgICAgICAgIGNoaWxkLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgI
20H0KICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAidGFibGUiOgogICAgICB7CiAgICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1pbihhdmFpbGFibGVTcGFjZS53aWR0aCwgTWF0aC5tYXgoZXh0cmEud2lkdGgsIHcpKTsKICAgICAgICBleHRyYS5oZWlnaHQgKz0gaDsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJ0YiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGgubWluKGF2YWlsYWJsZVNwYWNlLndpZHRoLCBNYXRoLm1heChleHRyYS53aWR0aCwgdykpOwogICAgICAgIGV4dHJhLmhlaWdodCArPSBoOwogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICB9Cn0KZnVuY3Rpb24gZ2V0QXZhaWxhYmxlU3BhY2Uobm9kZSkgewogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gbm9kZVskZXh0cmFdLmF2YWlsYWJsZVNwYWNlOwogIGNvbnN0IG1hcmdpblYgPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLnRvcEluc2V0ICsgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQgOiAwOwogIGNvbnN0IG1hcmdpbkggPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLmxlZnRJbnNldCArIG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQgOiAwOwogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgImxyLXRiIjoKICAgIGNhc2UgInJsLXRiIjoKICAgICAgaWYgKG5vZGVbJGV4dHJhXS5hdHRlbXB0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkggLSBub2RlWyRleHRyYV0uY3VycmVudFdpZHRoLAogICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVskZXh0cmFdLnByZXZIZWlnaHQKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVNwYWNlLndpZHRoIC0gbWFyZ2luSCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpblYgLSBub2RlWyRleHRyYV0uaGVpZ2h0CiAgICAgIH07CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgY29uc3Qgd2lkdGggPSBub2RlWyRleHRyYV0uY29sdW1uV2lkdGhzLnNsaWNlKG5vZGVbJGV4dHJhXS5jdXJyZW50Q29sdW1uKS5yZWR1Y2UoKGEsIHgpID0+IGEgKyB4KTsKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpbkgKICAgICAgfTsKICAgIGNhc2UgInRhYmxlIjoKICAgIGNhc2UgInRiIjoKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aDogYXZhaWxhYmxlU3BhY2Uud2lkdGggLSBtYXJnaW5ILAogICAgICAgIGhlaWdodDogYXZhaWxhYmxlU3BhY2UuaGVpZ2h0IC0gbWFyZ2luViAtIG5vZGVbJGV4dHJhXS5oZWlnaHQKICAgICAgfTsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBhdmFpbGFibGVTcGFjZTsKICB9Cn0KZnVuY3Rpb24gZ2V0VHJhbnNmb3JtZWRCQm94KG5vZGUpIHsKICBsZXQgdyA9IG5vZGUudyA9PT0gIiIgPyBOYU4gOiBub2RlLnc7CiAgbGV0IGggPSBub2RlLmggPT09ICIiID8gTmFOIDogbm9kZS5oOwogIGxldCBbY2VudGVyWCwgY2VudGVyWV0gPSBbMCwgMF07CiAgc3dpdGNoIChub2RlLmFuY2hvclR5cGUgfHwgIiIpIHsKICAgIGNhc2UgImJvdHRvbUNlbnRlciI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3IC8gMiwgaF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAiYm90dG9tTGVmdCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFswLCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJib3R0b21SaWdodCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3LCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtaWRkbGVDZW50ZXIiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbdyAvIDIsIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtaWRkbGVMZWZ0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gWzAsIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtaWRkbGVSaWdodCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3LCBoIC8gMl07CiAgICAgIGJyZWFrOwogICAgY2FzZSAidG9wQ2VudGVyIjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3cgLyAyLCAwXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ0b3BSaWdodCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3LCAwXTsKICAgICAgYnJlYWs7CiAgfQogIGxldCB4LCB5OwogIHN3aXRjaCAobm9kZS5yb3RhdGUgfHwgMCkgewogICAgY2FzZSAwOgogICAgICBbeCwgeV0gPSBbLWNlbnRlclgsIC1jZW50ZXJZXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDkwOgogICAgICBbeCwgeV0gPSBbLWNlbnRlclksIGNlbnRlclhdOwogICAgICBbdywgaF0gPSBbaCwgLXddOwogICAgICBicmVhazsKICAgIGNhc2UgMTgwOgogICAgICBbeCwgeV0gPSBbY2VudGVyWCwgY2VudGVyWV07CiAgICAgIFt3LCBoXSA9IFstdywgLWhdOwogICAgICBicmVhazsKICAgIGNhc2UgMjcwOgogICAgICBbeCwgeV0gPSBbY2VudGVyWSwgLWNlbnRlclhdOwogICAgICBbdywgaF0gPSBbLWgsIHddOwogICAgICBicmVhazsKICB9CiAgcmV0dXJuIFtub2RlLnggKyB4ICsgTWF0aC5taW4oMCwgdyksIG5vZGUueSArIHkgKyBNYXRoLm1pbigwLCBoKSwgTWF0aC5hYnModyksIE1hdGguYWJzKGgpXTsKfQpmdW5jdGlvbiBjaGVja0RpbWVuc2lvbnMobm9kZSwgc3BhY2UpIHsKICBpZiAobm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPT09IG51bGwpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAobm9kZS53ID09PSAwIHx8IG5vZGUuaCA9PT0gMCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGNvbnN0IEVSUk9SID0gMjsKICBjb25zdCBwYXJlbnQgPSBub2RlWyRnZXRTdWJmb3JtUGFyZW50XSgpOwogIGNvbnN0IGF0dGVtcHQgPSBwYXJlbnRbJGV4dHJhXT8uYXR0ZW1wdCB8fCAwOwogIGNvbnN0IFssIHksIHcsIGhdID0gZ2V0VHJhbnNmb3JtZWRCQm94KG5vZGUpOwogIHN3aXRjaCAocGFyZW50LmxheW91dCkgewogICAgY2FzZSAibHItdGIiOgogICAgY2FzZSAicmwtdGIiOgogICAgICBpZiAoYXR0ZW1wdCA9PT0gMCkgewogICAgICAgIGlmICghbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgICBpZiAobm9kZS5oICE9PSAiIiAmJiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpID4gRVJST1IpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudyAhPT0gIiIpIHsKICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgICAgICAgI
20HJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJlbnRbJGV4dHJhXS5udW1iZXJJbkxpbmUgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gc3BhY2UuaGVpZ2h0ID4gRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHNwYWNlLndpZHRoID4gRVJST1I7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLncgIT09ICIiKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3BhY2Uud2lkdGggPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAobm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIgJiYgTWF0aC5yb3VuZChoIC0gc3BhY2UuaGVpZ2h0KSA+IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChub2RlLncgPT09ICIiIHx8IE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAocGFyZW50WyRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgIGNhc2UgInRhYmxlIjoKICAgIGNhc2UgInRiIjoKICAgICAgaWYgKG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChub2RlLmggIT09ICIiICYmICFub2RlWyRpc1NwbGl0dGFibGVdKCkpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoIC0gc3BhY2UuaGVpZ2h0KSA8PSBFUlJPUjsKICAgICAgfQogICAgICBpZiAobm9kZS53ID09PSAiIiB8fCBNYXRoLnJvdW5kKHcgLSBzcGFjZS53aWR0aCkgPD0gRVJST1IpIHsKICAgICAgICByZXR1cm4gc3BhY2UuaGVpZ2h0ID4gRVJST1I7CiAgICAgIH0KICAgICAgaWYgKHBhcmVudFskaXNUaGVyZU1vcmVXaWR0aF0oKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gc3BhY2UuaGVpZ2h0ID4gRVJST1I7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIGlmIChub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oID09PSAiIiB8fCBNYXRoLnJvdW5kKGggKyB5IC0gc3BhY2UuaGVpZ2h0KSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IGFyZWEgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWE7CiAgICAgIHJldHVybiBoICsgeSA+IGFyZWEuaDsKICAgIGNhc2UgInJsLXJvdyI6CiAgICBjYXNlICJyb3ciOgogICAgICBpZiAobm9kZVskZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoIC0gc3BhY2UuaGVpZ2h0KSA8PSBFUlJPUjsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB0cnVlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3RlbXBsYXRlLmpzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY29uc3QgVEVNUExBVEVfTlNfSUQgPSBOYW1lc3BhY2VJZHMudGVtcGxhdGUuaWQ7CmNvbnN0IFNWR19OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CmNvbnN0IE1BWF9BVFRFTVBUU19GT1JfTFJUQl9MQVlPVVQgPSAyOwpjb25zdCBNQVhfRU1QVFlfUEFHRVMgPSAzOwpjb25zdCBERUZBVUxUX1RBQl9JTkRFWCA9IDUwMDA7CmNvbnN0IEhFQURJTkdfUEFUVEVSTiA9IC9eSChcZCspJC87CmNvbnN0IE1JTUVTID0gbmV3IFNldChbImltYWdlL2dpZiIsICJpbWFnZS9qcGVnIiwgImltYWdlL2pwZyIsICJpbWFnZS9wanBlZyIsICJpbWFnZS9wbmciLCAiaW1hZ2UvYXBuZyIsICJpbWFnZS94LXBuZyIsICJpbWFnZS9ibXAiLCAiaW1hZ2UveC1tcy1ibXAiLCAiaW1hZ2UvdGlmZiIsICJpbWFnZS90aWYiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIl0pOwpjb25zdCBJTUFHRVNfSEVBREVSUyA9IFtbWzB4NDIsIDB4NGRdLCAiaW1hZ2UvYm1wIl0sIFtbMHhmZiwgMHhkOCwgMHhmZl0sICJpbWFnZS9qcGVnIl0sIFtbMHg0OSwgMHg0OSwgMHgyYSwgMHgwMF0sICJpbWFnZS90aWZmIl0sIFtbMHg0ZCwgMHg0ZCwgMHgwMCwgMHgyYV0sICJpbWFnZS90aWZmIl0sIFtbMHg0NywgMHg0OSwgMHg0NiwgMHgzOCwgMHgzOSwgMHg2MV0sICJpbWFnZS9naWYiXSwgW1sweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXSwgImltYWdlL3BuZyJdXTsKZnVuY3Rpb24gZ2V0Qm9yZGVyRGltcyhub2RlKSB7CiAgaWYgKCFub2RlIHx8ICFub2RlLmJvcmRlcikgewogICAgcmV0dXJuIHsKICAgICAgdzogMCwKICAgICAgaDogMAogICAgfTsKICB9CiAgY29uc3QgYm9yZGVyRXh0cmEgPSBub2RlLmJvcmRlclskZ2V0RXh0cmFdKCk7CiAgaWYgKCFib3JkZXJFeHRyYSkgewogICAgcmV0dXJuIHsKICAgICAgdzogMCwKICAgICAgaDogMAogICAgfTsKICB9CiAgcmV0dXJuIHsKICAgIHc6IGJvcmRlckV4dHJhLndpZHRoc1swXSArIGJvcmRlckV4dHJhLndpZHRoc1syXSArIGJvcmRlckV4dHJhLmluc2V0c1swXSArIGJvcmRlckV4dHJhLmluc2V0c1syXSwKICAgIGg6IGJvcmRlckV4dHJhLndpZHRoc1sxXSArIGJvcmRlckV4dHJhLndpZHRoc1szXSArIGJvcmRlckV4dHJhLmluc2V0c1sxXSArIGJvcmRlckV4dHJhLmluc2V0c1szXQogIH07Cn0KZnVuY3Rpb24gaGFzTWFyZ2luKG5vZGUpIHsKICByZXR1cm4gbm9kZS5tYXJnaW4gJiYgKG5vZGUubWFyZ2luLnRvcEluc2V0IHx8IG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQgfHwgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQgfHwgbm9kZS5tYXJnaW4ubGVmdEluc2V0KTsKfQpmdW5jdGlvbiBfc2V0VmFsdWUodGVtcGxhdGVOb2RlLCB2YWx1ZSkgewogIGlmICghdGVtcGxhdGVOb2RlLnZhbHVlKSB7CiAgICBjb25zdCBub2RlVmFsdWUgPSBuZXcgVmFsdWUoe30pOwogICAgdGVtcGxhdGVOb2RlWyRhcHBlbmRDaGlsZF0obm9kZVZhbHVlKTsKICAgIHRlbXBsYXRlTm9kZS52YWx1ZSA9IG5vZGVWYWx1ZTsKICB9CiAgdGVtcGxhdGVOb2RlLnZhbHVlWyRzZXRWYWx1ZV0odmFsdWUpOwp9CmZ1bmN0aW9uKiBnZXRDb250YWluZWRDaGlsZHJlbihub2RlKSB7CiAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlWyRnZXRDaGlsZHJlbl0oKSkgewogICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU3ViZm9ybVNldCkgewogICAgICB5aWVsZCogY2hpbGRbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHlpZWxkIGNoaWxkOwogIH0KfQpmdW5jdGlvbiBpc1JlcXVpcmVkKG5vZGUpIHsKICByZXR1cm4gbm9kZS52YWxpZGF0ZT8ubnVsbFRlc3QgPT09ICJlcnJvciI7Cn0KZnVuY3Rpb24gc2V0VGFiSW5kZXgobm9kZSkgewogIHdoaWxlIChub2RlKSB7CiAgICBpZiAoIW5vZGUudHJhdmVyc2FsKSB7CiAgICAgIG5vZGVbJHRhYkluZGV4XSA9IG5vZGVbJGdldFBhcmVudF0oKVskdGFiSW5kZXhdOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAobm9kZVskdGFiSW5kZXhdKSB7CiAgICAgI
20HJldHVybjsKICAgIH0KICAgIGxldCBuZXh0ID0gbnVsbDsKICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS50cmF2ZXJzYWxbJGdldENoaWxkcmVuXSgpKSB7CiAgICAgIGlmIChjaGlsZC5vcGVyYXRpb24gPT09ICJuZXh0IikgewogICAgICAgIG5leHQgPSBjaGlsZDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKCFuZXh0IHx8ICFuZXh0LnJlZikgewogICAgICBub2RlWyR0YWJJbmRleF0gPSBub2RlWyRnZXRQYXJlbnRdKClbJHRhYkluZGV4XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgcm9vdCA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKTsKICAgIG5vZGVbJHRhYkluZGV4XSA9ICsrcm9vdFskdGFiSW5kZXhdOwogICAgY29uc3QgcmVmID0gcm9vdFskc2VhcmNoTm9kZV0obmV4dC5yZWYsIG5vZGUpOwogICAgaWYgKCFyZWYpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbm9kZSA9IHJlZlswXTsKICB9Cn0KZnVuY3Rpb24gYXBwbHlBc3Npc3Qob2JqLCBhdHRyaWJ1dGVzKSB7CiAgY29uc3QgYXNzaXN0ID0gb2JqLmFzc2lzdDsKICBpZiAoYXNzaXN0KSB7CiAgICBjb25zdCBhc3Npc3RUaXRsZSA9IGFzc2lzdFskdG9IVE1MXSgpOwogICAgaWYgKGFzc2lzdFRpdGxlKSB7CiAgICAgIGF0dHJpYnV0ZXMudGl0bGUgPSBhc3Npc3RUaXRsZTsKICAgIH0KICAgIGNvbnN0IHJvbGUgPSBhc3Npc3Qucm9sZTsKICAgIGNvbnN0IG1hdGNoID0gcm9sZS5tYXRjaChIRUFESU5HX1BBVFRFUk4pOwogICAgaWYgKG1hdGNoKSB7CiAgICAgIGNvbnN0IGFyaWFSb2xlID0gImhlYWRpbmciOwogICAgICBjb25zdCBhcmlhTGV2ZWwgPSBtYXRjaFsxXTsKICAgICAgYXR0cmlidXRlcy5yb2xlID0gYXJpYVJvbGU7CiAgICAgIGF0dHJpYnV0ZXNbImFyaWEtbGV2ZWwiXSA9IGFyaWFMZXZlbDsKICAgIH0KICB9CiAgaWYgKG9iai5sYXlvdXQgPT09ICJ0YWJsZSIpIHsKICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJ0YWJsZSI7CiAgfSBlbHNlIGlmIChvYmoubGF5b3V0ID09PSAicm93IikgewogICAgYXR0cmlidXRlcy5yb2xlID0gInJvdyI7CiAgfSBlbHNlIHsKICAgIGNvbnN0IHBhcmVudCA9IG9ialskZ2V0UGFyZW50XSgpOwogICAgaWYgKHBhcmVudC5sYXlvdXQgPT09ICJyb3ciKSB7CiAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IHBhcmVudC5hc3Npc3Q/LnJvbGUgPT09ICJUSCIgPyAiY29sdW1uaGVhZGVyIiA6ICJjZWxsIjsKICAgIH0KICB9Cn0KZnVuY3Rpb24gYXJpYUxhYmVsKG9iaikgewogIGlmICghb2JqLmFzc2lzdCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGFzc2lzdCA9IG9iai5hc3Npc3Q7CiAgaWYgKGFzc2lzdC5zcGVhayAmJiBhc3Npc3Quc3BlYWtbJGNvbnRlbnRdICE9PSAiIikgewogICAgcmV0dXJuIGFzc2lzdC5zcGVha1skY29udGVudF07CiAgfQogIGlmIChhc3Npc3QudG9vbFRpcCkgewogICAgcmV0dXJuIGFzc2lzdC50b29sVGlwWyRjb250ZW50XTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gdmFsdWVUb0h0bWwodmFsdWUpIHsKICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgIG5hbWU6ICJkaXYiLAogICAgYXR0cmlidXRlczogewogICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgIHN0eWxlOiBPYmplY3QuY3JlYXRlKG51bGwpCiAgICB9LAogICAgY2hpbGRyZW46IFt7CiAgICAgIG5hbWU6ICJzcGFuIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlOiBPYmplY3QuY3JlYXRlKG51bGwpCiAgICAgIH0sCiAgICAgIHZhbHVlCiAgICB9XQogIH0pOwp9CmZ1bmN0aW9uIHNldEZpcnN0VW5zcGxpdHRhYmxlKG5vZGUpIHsKICBjb25zdCByb290ID0gbm9kZVskZ2V0VGVtcGxhdGVSb290XSgpOwogIGlmIChyb290WyRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPT09IG51bGwpIHsKICAgIHJvb3RbJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9IG5vZGU7CiAgICByb290WyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gdHJ1ZTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRGaXJzdFVuc3BsaXR0YWJsZShub2RlKSB7CiAgY29uc3Qgcm9vdCA9IG5vZGVbJGdldFRlbXBsYXRlUm9vdF0oKTsKICBpZiAocm9vdFskZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID09PSBub2RlKSB7CiAgICByb290WyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gZmFsc2U7CiAgfQp9CmZ1bmN0aW9uIGhhbmRsZUJyZWFrKG5vZGUpIHsKICBpZiAobm9kZVskZXh0cmFdKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIG5vZGVbJGV4dHJhXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gImF1dG8iKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgbGV0IHRhcmdldCA9IG51bGw7CiAgaWYgKG5vZGUudGFyZ2V0KSB7CiAgICB0YXJnZXQgPSByb290WyRzZWFyY2hOb2RlXShub2RlLnRhcmdldCwgbm9kZVskZ2V0UGFyZW50XSgpKTsKICAgIGlmICghdGFyZ2V0KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRhcmdldCA9IHRhcmdldFswXTsKICB9CiAgY29uc3QgewogICAgY3VycmVudFBhZ2VBcmVhLAogICAgY3VycmVudENvbnRlbnRBcmVhCiAgfSA9IHJvb3RbJGV4dHJhXTsKICBpZiAobm9kZS50YXJnZXRUeXBlID09PSAicGFnZUFyZWEiKSB7CiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkpIHsKICAgICAgdGFyZ2V0ID0gbnVsbDsKICAgIH0KICAgIGlmIChub2RlLnN0YXJ0TmV3KSB7CiAgICAgIG5vZGVbJGV4dHJhXS50YXJnZXQgPSB0YXJnZXQgfHwgY3VycmVudFBhZ2VBcmVhOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gY3VycmVudFBhZ2VBcmVhKSB7CiAgICAgIG5vZGVbJGV4dHJhXS50YXJnZXQgPSB0YXJnZXQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDb250ZW50QXJlYSkpIHsKICAgIHRhcmdldCA9IG51bGw7CiAgfQogIGNvbnN0IHBhZ2VBcmVhID0gdGFyZ2V0ICYmIHRhcmdldFskZ2V0UGFyZW50XSgpOwogIGxldCBpbmRleDsKICBsZXQgbm
20V4dFBhZ2VBcmVhID0gcGFnZUFyZWE7CiAgaWYgKG5vZGUuc3RhcnROZXcpIHsKICAgIGlmICh0YXJnZXQpIHsKICAgICAgY29uc3QgY29udGVudEFyZWFzID0gcGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW47CiAgICAgIGNvbnN0IGluZGV4Rm9yQ3VycmVudCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKGN1cnJlbnRDb250ZW50QXJlYSk7CiAgICAgIGNvbnN0IGluZGV4Rm9yVGFyZ2V0ID0gY29udGVudEFyZWFzLmluZGV4T2YodGFyZ2V0KTsKICAgICAgaWYgKGluZGV4Rm9yQ3VycmVudCAhPT0gLTEgJiYgaW5kZXhGb3JDdXJyZW50IDwgaW5kZXhGb3JUYXJnZXQpIHsKICAgICAgICBuZXh0UGFnZUFyZWEgPSBudWxsOwogICAgICB9CiAgICAgIGluZGV4ID0gaW5kZXhGb3JUYXJnZXQgLSAxOwogICAgfSBlbHNlIHsKICAgICAgaW5kZXggPSBjdXJyZW50UGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW4uaW5kZXhPZihjdXJyZW50Q29udGVudEFyZWEpOwogICAgfQogIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gY3VycmVudENvbnRlbnRBcmVhKSB7CiAgICBjb25zdCBjb250ZW50QXJlYXMgPSBwYWdlQXJlYS5jb250ZW50QXJlYS5jaGlsZHJlbjsKICAgIGluZGV4ID0gY29udGVudEFyZWFzLmluZGV4T2YodGFyZ2V0KSAtIDE7CiAgICBuZXh0UGFnZUFyZWEgPSBwYWdlQXJlYSA9PT0gY3VycmVudFBhZ2VBcmVhID8gbnVsbCA6IHBhZ2VBcmVhOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIG5vZGVbJGV4dHJhXS50YXJnZXQgPSBuZXh0UGFnZUFyZWE7CiAgbm9kZVskZXh0cmFdLmluZGV4ID0gaW5kZXg7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gaGFuZGxlT3ZlcmZsb3cobm9kZSwgZXh0cmFOb2RlLCBzcGFjZSkgewogIGNvbnN0IHJvb3QgPSBub2RlWyRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgY29uc3Qgc2F2ZWQgPSByb290WyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlOwogIGNvbnN0IHNhdmVkTWV0aG9kID0gZXh0cmFOb2RlWyRnZXRTdWJmb3JtUGFyZW50XTsKICBleHRyYU5vZGVbJGdldFN1YmZvcm1QYXJlbnRdID0gKCkgPT4gbm9kZTsKICByb290WyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gdHJ1ZTsKICBjb25zdCByZXMgPSBleHRyYU5vZGVbJHRvSFRNTF0oc3BhY2UpOwogIG5vZGVbJGFkZEhUTUxdKHJlcy5odG1sLCByZXMuYmJveCk7CiAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHNhdmVkOwogIGV4dHJhTm9kZVskZ2V0U3ViZm9ybVBhcmVudF0gPSBzYXZlZE1ldGhvZDsKfQpjbGFzcyBBcHBlYXJhbmNlRmlsdGVyIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImFwcGVhcmFuY2VGaWx0ZXIiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEFyYyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhcmMiLCB0cnVlKTsKICAgIHRoaXMuY2lyY3VsYXIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jaXJjdWxhciwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaGFuZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnN0YXJ0QW5nbGUgPSBnZXRGbG9hdCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnRBbmdsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMuc3dlZXBBbmdsZSA9IGdldEZsb2F0KHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zd2VlcEFuZ2xlLAogICAgICBkZWZhdWx0VmFsdWU6IDM2MCwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lZGdlID0gbnVsbDsKICAgIHRoaXMuZmlsbCA9IG51bGw7CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmVkZ2UgfHwgbmV3IEVkZ2Uoe30pOwogICAgY29uc3QgZWRnZVN0eWxlID0gZWRnZVskdG9TdHlsZV0oKTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLmZpbGw/LnByZXNlbmNlID09PSAidmlzaWJsZSIpIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdGhpcy5maWxsWyR0b1N0eWxlXSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlLmZpbGwgPSAidHJhbnNwYXJlbnQiOwogICAgfQogICAgc3R5bGUuc3Ryb2tlV2lkdGggPSBtZWFzdXJlVG9TdHJpbmcoZWRnZS5wcmVzZW5jZSA9PT0gInZpc2libGUiID8gZWRnZS50aGlja25lc3MgOiAwKTsKICAgIHN0eWxlLnN0cm9rZSA9IGVkZ2VTdHlsZS5jb2xvcjsKICAgIGxldCBhcmM7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICB4bWxuczogU1ZHX05TLAogICAgICBzdHlsZTogewogICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgaGVpZ2h0OiAiMTAwJSIsCiAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIgogICAgICB9CiAgICB9OwogICAgaWYgKHRoaXMuc3dlZXBBbmdsZSA9PT0gMzYwKSB7CiAgICAgIGFyYyA9IHsKICAgICAgICBuYW1lOiAiZWxsaXBzZSIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICAgIGN4OiAiNTAlIiwKICAgICAgICAgIGN5OiAiNTAlIiwKICAgICAgICAgIHJ4OiAiNTAlIiwKICAgICAgICAgI
20HJ5OiAiNTAlIiwKICAgICAgICAgIHN0eWxlCiAgICAgICAgfQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgc3RhcnRBbmdsZSA9IHRoaXMuc3RhcnRBbmdsZSAqIE1hdGguUEkgLyAxODA7CiAgICAgIGNvbnN0IHN3ZWVwQW5nbGUgPSB0aGlzLnN3ZWVwQW5nbGUgKiBNYXRoLlBJIC8gMTgwOwogICAgICBjb25zdCBsYXJnZUFyYyA9IHRoaXMuc3dlZXBBbmdsZSA+IDE4MCA/IDEgOiAwOwogICAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gWzUwICogKDEgKyBNYXRoLmNvcyhzdGFydEFuZ2xlKSksIDUwICogKDEgLSBNYXRoLnNpbihzdGFydEFuZ2xlKSksIDUwICogKDEgKyBNYXRoLmNvcyhzdGFydEFuZ2xlICsgc3dlZXBBbmdsZSkpLCA1MCAqICgxIC0gTWF0aC5zaW4oc3RhcnRBbmdsZSArIHN3ZWVwQW5nbGUpKV07CiAgICAgIGFyYyA9IHsKICAgICAgICBuYW1lOiAicGF0aCIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICAgIGQ6IGBNICR7eDF9ICR7eTF9IEEgNTAgNTAgMCAke2xhcmdlQXJjfSAwICR7eDJ9ICR7eTJ9YCwKICAgICAgICAgIHZlY3RvckVmZmVjdDogIm5vbi1zY2FsaW5nLXN0cm9rZSIsCiAgICAgICAgICBzdHlsZQogICAgICAgIH0KICAgICAgfTsKICAgICAgT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCB7CiAgICAgICAgdmlld0JveDogIjAgMCAxMDAgMTAwIiwKICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAibm9uZSIKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBzdmcgPSB7CiAgICAgIG5hbWU6ICJzdmciLAogICAgICBjaGlsZHJlbjogW2FyY10sCiAgICAgIGF0dHJpYnV0ZXMKICAgIH07CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3Moc3ZnKTsKICB9Cn0KY2xhc3MgQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhcmVhIiwgdHJ1ZSk7CiAgICB0aGlzLmNvbFNwYW4gPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jb2xTcGFuLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSB8fCBuID09PSAtMQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuYXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4Y2xHcm91cCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm1TZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgKlskZ2V0Q29udGFpbmVkQ2hpbGRyZW5dKCkgewogICAgeWllbGQqIGdldENvbnRhaW5lZENoaWxkcmVuKHRoaXMpOwogIH0KICBbJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRhZGRIVE1MXShodG1sLCBiYm94KSB7CiAgICBjb25zdCBbeCwgeSwgdywgaF0gPSBiYm94OwogICAgdGhpc1skZXh0cmFdLndpZHRoID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLndpZHRoLCB4ICsgdyk7CiAgICB0aGlzWyRleHRyYV0uaGVpZ2h0ID0gTWF0aC5tYXgodGhpc1skZXh0cmFdLmhlaWdodCwgeSArIGgpOwogICAgdGhpc1skZXh0cmFdLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkgewogICAgcmV0dXJuIHRoaXNbJGV4dHJhXS5hdmFpbGFibGVTcGFjZTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgInBvc2l0aW9uIik7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBzdHlsZSwKICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgIGNsYXNzOiBbInhmYUFyZWEiXQogICAgfTsKICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBhdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1skZXh0cmFdID0gewogICAgICBjaGlsZHJlbiwKICAgICAgd2lkdGg6IDAsCiAgICAgIGhlaWdodDogMCwKICAgICAgYXZhaWxhYmxlU3BhY2UKICAgIH07CiAgICBjb25zdCByZXN1bHQgPSB0aGlzWyRjaGlsZHJlblRvSFRNTF0oewogICAgICBmaWx0ZXI6IG5ldyBTZXQoWyJhcmVhIiwgImRyYXciLCAiZmllbGQiLCAiZXhjbEdyb3VwIiwgInN1YmZvcm0iLCAic3ViZm9ybVNldCJdKSwKICAgICAgaW5jbHVkZTogdHJ1ZQogICAgfSk7CiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7CiAgICAgIGlmIChyZXN1bHQuaXNCcmVhaygpKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBkZWxldGUgdGhpc1skZXh0cmFdOwogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcodGhpc1skZXh0cmFdLndpZHRoKTsKICAgIHN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzWyRleHRyYV0uaGVpZ2h0KTsKICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGNvbnN0IGJib3ggPSBbdGhpcy54LCB0aGlzLnksIHRoaXNbJGV4dHJhXS53aWR0aCwgdGhpc1skZXh0cmFdLmhlaWdodF07CiAgICBkZWxldGUgdGhpc1skZXh0cmFdOwogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhodG1sLCBiYm94KTsKICB9Cn0KY2xhc3MgQXNzaXN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImFzc2lzdCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJvbGUgPSBhdHRyaWJ1dGVzLnJvbGUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5zcGVhayA9IG51bGw7CiAgICB0aGlzLnRvb2xUaXAgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICByZXR1cm4gdGhpcy50b29sVGlwPy5bJGNvbnRlbnRdIHx8IG51bGw7CiAgfQp9CmNsYXNzIEJhcmNvZGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYmFyY29kZSIsIHRydWUpOwogICAgdGhpcy5jaGFyRW5jb2RpbmcgPSBnZXRLZXl3b3JkKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jaGFyRW5jb2RpbmcgPyBhdHRyaWJ1dGVzLmNoYXJFbmNvZGluZy50b0xvd2VyQ2FzZSgpIDogIiIsCiAgICAgIGRlZmF1bHRWYWx1ZTogIiIsCiAgICAgIHZhbGlkYXRlOiBrID0+IFsidXRmLTgiLCAiYmlnLWZpdmUiLCAiZm9udHNwZWNpZmljIiwgImdiayIsICJnYi0xODAzMCIsICJnYi0yMzEyIiwgImtzYy01NjAxIiwgIm5vbmUiLCAic2hpZnQtamlzIiwgInVjcy0yIiwgInV0Zi0xNiJdLmluY2x1ZGVzKGspIHx8IGsubWF0Y2goL2lzby04ODU5LVxkezJ9LykKICAgIH0pOwogICAgdGhpcy5jaGVja3N1bSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmNoZWNrc3VtLCBbIm5vbmUiLCAiMW1vZDEwIiwgIjFtb2QxMF8xbW9kMTEiLCAiMm1vZDEwIiwgImF1dG8iXSk7CiAgICB0aGlzLmRhdGFDb2x1bW5Db3VudCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmRhdGFDb2x1bW5Db3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMuZGF0YUxlbmd0aCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmRhdGFMZW5ndGgsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgI
20HZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmRhdGFQcmVwID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZGF0YVByZXAsIFsibm9uZSIsICJmbGF0ZUNvbXByZXNzIl0pOwogICAgdGhpcy5kYXRhUm93Q291bnQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kYXRhUm93Q291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmVuZENoYXIgPSBhdHRyaWJ1dGVzLmVuZENoYXIgfHwgIiI7CiAgICB0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMCAmJiB4IDw9IDgKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm1vZHVsZUhlaWdodCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubW9kdWxlSGVpZ2h0LCAiNW1tIik7CiAgICB0aGlzLm1vZHVsZVdpZHRoID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tb2R1bGVXaWR0aCwgIjAuMjVtbSIpOwogICAgdGhpcy5wcmludENoZWNrRGlnaXQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5wcmludENoZWNrRGlnaXQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnJvd0NvbHVtblJhdGlvID0gZ2V0UmF0aW8oYXR0cmlidXRlcy5yb3dDb2x1bW5SYXRpbyk7CiAgICB0aGlzLnN0YXJ0Q2hhciA9IGF0dHJpYnV0ZXMuc3RhcnRDaGFyIHx8ICIiOwogICAgdGhpcy50ZXh0TG9jYXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50ZXh0TG9jYXRpb24sIFsiYmVsb3ciLCAiYWJvdmUiLCAiYWJvdmVFbWJlZGRlZCIsICJiZWxvd0VtYmVkZGVkIiwgIm5vbmUiXSk7CiAgICB0aGlzLnRydW5jYXRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMudHJ1bmNhdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlID8gYXR0cmlidXRlcy50eXBlLnRvTG93ZXJDYXNlKCkgOiAiIiwgWyJhenRlYyIsICJjb2RhYmFyIiwgImNvZGUyb2Y1aW5kdXN0cmlhbCIsICJjb2RlMm9mNWludGVybGVhdmVkIiwgImNvZGUyb2Y1bWF0cml4IiwgImNvZGUyb2Y1c3RhbmRhcmQiLCAiY29kZTNvZjkiLCAiY29kZTNvZjlleHRlbmRlZCIsICJjb2RlMTEiLCAiY29kZTQ5IiwgImNvZGU5MyIsICJjb2RlMTI4IiwgImNvZGUxMjhhIiwgImNvZGUxMjhiIiwgImNvZGUxMjhjIiwgImNvZGUxMjhzc2NjIiwgImRhdGFtYXRyaXgiLCAiZWFuOCIsICJlYW44YWRkMiIsICJlYW44YWRkNSIsICJlYW4xMyIsICJlYW4xM2FkZDIiLCAiZWFuMTNhZGQ1IiwgImVhbjEzcHdjZCIsICJmaW0iLCAibG9nbWFycyIsICJtYXhpY29kZSIsICJtc2kiLCAicGRmNDE3IiwgInBkZjQxN21hY3JvIiwgInBsZXNzZXkiLCAicG9zdGF1c2N1c3QyIiwgInBvc3RhdXNjdXN0MyIsICJwb3N0YXVzcmVwbHlwYWlkIiwgInBvc3RhdXNzdGFuZGFyZCIsICJwb3N0dWtybTRzY2MiLCAicG9zdHVzZHBiYyIsICJwb3N0dXNpbWIiLCAicG9zdHVzc3RhbmRhcmQiLCAicG9zdHVzNXppcCIsICJxcmNvZGUiLCAicmZpZCIsICJyc3MxNCIsICJyc3MxNGV4cGFuZGVkIiwgInJzczE0bGltaXRlZCIsICJyc3MxNHN0YWNrZWQiLCAicnNzMTRzdGFja2Vkb21uaSIsICJyc3MxNHRydW5jYXRlZCIsICJ0ZWxlcGVuIiwgInVjYzEyOCIsICJ1Y2MxMjhyYW5kb20iLCAidWNjMTI4c3NjYyIsICJ1cGNhIiwgInVwY2FhZGQyIiwgInVwY2FhZGQ1IiwgInVwY2Fwd2NkIiwgInVwY2UiLCAidXBjZWFkZDIiLCAidXBjZWFkZDUiLCAidXBjZWFuMiIsICJ1cGNlYW41IiwgInVwc21heGljb2RlIl0pOwogICAgdGhpcy51cHNNb2RlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudXBzTW9kZSwgWyJ1c0NhcnJpZXIiLCAiaW50ZXJuYXRpb25hbENhcnJpZXIiLCAic2VjdXJlU3ltYm9sIiwgInN0YW5kYXJkU3ltYm9sIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMud2lkZU5hcnJvd1JhdGlvID0gZ2V0UmF0aW8oYXR0cmlidXRlcy53aWRlTmFycm93UmF0aW8pOwogICAgdGhpcy5lbmNyeXB0ID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgQmluZCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJiaW5kIiwgdHJ1ZSk7CiAgICB0aGlzLm1hdGNoID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubWF0Y2gsIFsib25jZSIsICJkYXRhUmVmIiwgImdsb2JhbCIsICJub25lIl0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMucGljdHVyZSA9IG51bGw7CiAgfQp9CmNsYXNzIEJpbmRJdGVtcyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJiaW5kSXRlbXMiKTsKICAgIHRoaXMuY29ubmVjdGlvbiA9IGF0dHJpYnV0ZXMuY29ubmVjdGlvbiB8fCAiIjsKICAgIHRoaXMubGFiZWxSZWYgPSBhdHRyaWJ1dGVzLmxhYmVsUmVmIHx8ICIiOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudmFsdWVSZWYgPSBhdHRyaWJ1dGVzLnZhbHVlUmVmIHx8ICIiOwogIH0KfQpjbGFzcyBCb29rZW5kIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJvb2tlbmQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMudHJhaWxlciA9IGF0dHJpYnV0ZXMudHJhaWxlciB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEJvb2xlYW5
20FbGVtZW50IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYm9vbGVhbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSA9PT0gMSA/ICIxIiA6ICIwIik7CiAgfQp9CmNsYXNzIEJvcmRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJib3JkZXIiLCB0cnVlKTsKICAgIHRoaXMuYnJlYWsgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5icmVhaywgWyJjbG9zZSIsICJvcGVuIl0pOwogICAgdGhpcy5oYW5kID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaGFuZCwgWyJldmVuIiwgImxlZnQiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb3JuZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgICB0aGlzLmVkZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIGNvbnN0IGVkZ2VzID0gdGhpcy5lZGdlLmNoaWxkcmVuLnNsaWNlKCk7CiAgICAgIGlmIChlZGdlcy5sZW5ndGggPCA0KSB7CiAgICAgICAgY29uc3QgZGVmYXVsdEVkZ2UgPSBlZGdlcy5hdCgtMSkgfHwgbmV3IEVkZ2Uoe30pOwogICAgICAgIGZvciAobGV0IGkgPSBlZGdlcy5sZW5ndGg7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGVkZ2VzLnB1c2goZGVmYXVsdEVkZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBlZGdlcy5tYXAoZWRnZSA9PiBlZGdlLnRoaWNrbmVzcyk7CiAgICAgIGNvbnN0IGluc2V0cyA9IFswLCAwLCAwLCAwXTsKICAgICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgICAgaW5zZXRzWzBdID0gdGhpcy5tYXJnaW4udG9wSW5zZXQ7CiAgICAgICAgaW5zZXRzWzFdID0gdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgICBpbnNldHNbMl0gPSB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgICAgICBpbnNldHNbM10gPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQ7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdID0gewogICAgICAgIHdpZHRocywKICAgICAgICBpbnNldHMsCiAgICAgICAgZWRnZXMKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCB7CiAgICAgIGVkZ2VzCiAgICB9ID0gdGhpc1skZ2V0RXh0cmFdKCk7CiAgICBjb25zdCBlZGdlU3R5bGVzID0gZWRnZXMubWFwKG5vZGUgPT4gewogICAgICBjb25zdCBzdHlsZSA9IG5vZGVbJHRvU3R5bGVdKCk7CiAgICAgIHN0eWxlLmNvbG9yIHx8PSAiIzAwMDAwMCI7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0pOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMubWFyZ2luWyR0b1N0eWxlXSgpKTsKICAgIH0KICAgIGlmICh0aGlzLmZpbGw/LnByZXNlbmNlID09PSAidmlzaWJsZSIpIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdGhpcy5maWxsWyR0b1N0eWxlXSgpKTsKICAgIH0KICAgIGlmICh0aGlzLmNvcm5lci5jaGlsZHJlbi5zb21lKG5vZGUgPT4gbm9kZS5yYWRpdXMgIT09IDApKSB7CiAgICAgIGNvbnN0IGNvcm5lclN0eWxlcyA9IHRoaXMuY29ybmVyLmNoaWxkcmVuLm1hcChub2RlID0+IG5vZGVbJHRvU3R5bGVdKCkpOwogICAgICBpZiAoY29ybmVyU3R5bGVzLmxlbmd0aCA9PT0gMiB8fCBjb3JuZXJTdHlsZXMubGVuZ3RoID09PSAzKSB7CiAgICAgICAgY29uc3QgbGFzdCA9IGNvcm5lclN0eWxlcy5hdCgtMSk7CiAgICAgICAgZm9yIChsZXQgaSA9IGNvcm5lclN0eWxlcy5sZW5ndGg7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGNvcm5lclN0eWxlcy5wdXNoKGxhc3QpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHlsZS5ib3JkZXJSYWRpdXMgPSBjb3JuZXJTdHlsZXMubWFwKHMgPT4gcy5yYWRpdXMpLmpvaW4oIiAiKTsKICAgIH0KICAgIHN3aXRjaCAodGhpcy5wcmVzZW5jZSkgewogICAgICBjYXNlICJpbnZpc2libGUiOgogICAgICBjYXNlICJoaWRkZW4iOgogICAgICAgIHN0eWxlLmJvcmRlclN0eWxlID0gIiI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImluYWN0aXZlIjoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9ICJub25lIjsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9IGVkZ2VTdHlsZXMubWFwKHMgPT4gcy5zdHlsZSkuam9pbigiICIpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgc3R5bGUuYm9yZGVyV2lkdGggPSBlZGdlU3R5bGVzLm1hcChzID0+IHMud2lkdGgpLmpvaW4oIiAiKTsKICAgIHN0eWxlLmJvcmRlckNvbG9yID0gZWRnZVN0eWxlcy5tYXAocyA9PiBzLmNvbG9yKS5qb2luKCIgIik7CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEJyZWFrIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJyZWFrIiwgdHJ1ZSk7CiAgICB0aGlzLmFmdGVyID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWZ0ZXIsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSIsICJwYWdlRXZlbiIsICJwYWdlT2RkIl0pOwogICAgdGhpcy5hZnRlclRhcmdldCA9IGF0dHJpYnV0ZXMuYWZ0ZXJUYXJnZXQgfHwgIiI7CiAgICB0aGlzLmJlZm9yZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmJlZm9yZSwgWyJhdXRvIiwgImNvbnRlbn
20RBcmVhIiwgInBhZ2VBcmVhIiwgInBhZ2VFdmVuIiwgInBhZ2VPZGQiXSk7CiAgICB0aGlzLmJlZm9yZVRhcmdldCA9IGF0dHJpYnV0ZXMuYmVmb3JlVGFyZ2V0IHx8ICIiOwogICAgdGhpcy5ib29rZW5kTGVhZGVyID0gYXR0cmlidXRlcy5ib29rZW5kTGVhZGVyIHx8ICIiOwogICAgdGhpcy5ib29rZW5kVHJhaWxlciA9IGF0dHJpYnV0ZXMuYm9va2VuZFRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3ZlcmZsb3dMZWFkZXIgPSBhdHRyaWJ1dGVzLm92ZXJmbG93TGVhZGVyIHx8ICIiOwogICAgdGhpcy5vdmVyZmxvd1RhcmdldCA9IGF0dHJpYnV0ZXMub3ZlcmZsb3dUYXJnZXQgfHwgIiI7CiAgICB0aGlzLm92ZXJmbG93VHJhaWxlciA9IGF0dHJpYnV0ZXMub3ZlcmZsb3dUcmFpbGVyIHx8ICIiOwogICAgdGhpcy5zdGFydE5ldyA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0TmV3LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgQnJlYWtBZnRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJicmVha0FmdGVyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnN0YXJ0TmV3ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnROZXcsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy50YXJnZXRUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudGFyZ2V0VHlwZSwgWyJhdXRvIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIl0pOwogICAgdGhpcy50cmFpbGVyID0gYXR0cmlidXRlcy50cmFpbGVyIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9Cn0KY2xhc3MgQnJlYWtCZWZvcmUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYnJlYWtCZWZvcmUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMuc3RhcnROZXcgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zdGFydE5ldywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRhcmdldFR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50YXJnZXRUeXBlLCBbImF1dG8iLCAiY29udGVudEFyZWEiLCAicGFnZUFyZWEiXSk7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHRoaXNbJGV4dHJhXSA9IHt9OwogICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICB9Cn0KY2xhc3MgQnV0dG9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJ1dHRvbiIsIHRydWUpOwogICAgdGhpcy5oaWdobGlnaHQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oaWdobGlnaHQsIFsiaW52ZXJ0ZWQiLCAibm9uZSIsICJvdXRsaW5lIiwgInB1c2giXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgY29uc3QgZ3JhbmRwYSA9IHBhcmVudFskZ2V0UGFyZW50XSgpOwogICAgY29uc3QgaHRtbEJ1dHRvbiA9IHsKICAgICAgbmFtZTogImJ1dHRvbiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBpZDogdGhpc1skdWlkXSwKICAgICAgICBjbGFzczogWyJ4ZmFCdXR0b24iXSwKICAgICAgICBzdHlsZToge30KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogICAgZm9yIChjb25zdCBldmVudCBvZiBncmFuZHBhLmV2ZW50LmNoaWxkcmVuKSB7CiAgICAgIGlmIChldmVudC5hY3Rpdml0eSAhPT0gImNsaWNrIiB8fCAhZXZlbnQuc2NyaXB0KSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QganNVUkwgPSByZWNvdmVySnNVUkwoZXZlbnQuc2NyaXB0WyRjb250ZW50XSk7CiAgICAgIGlmICghanNVUkwpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBocmVmID0gZml4VVJMKGpzVVJMLnVybCk7CiAgICAgIGlmICghaHJlZikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGh0bWxCdXR0b24uY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgbmFtZTogImEiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIGlkOiAibGluayIgKyB0aGlzWyR1aWRdLAogICAgICAgICAgaHJlZiwKICAgICAgICAgIG5ld1dpbmRvdzoganNVUkwubmV3V2luZG93LAogICAgICAgICAgY2xhc3M6IFsieGZhTGluayJdLAogICAgICAgICAgc3R5bGU6IHt9CiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW10KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWxCdXR0b24pOwogIH0KfQpjbGFzcyBDYWxjdWxhdGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2FsY3VsYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3ZlcnJpZGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vdmVycmlkZSwgWyJkaXNhYmxlZCIsICJlcnJvciIsICJpZ25vcmUiLCAid2FybmluZyJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KfQpjbGFzcyBDYXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNhcHRpb24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wbGFjZW1lbnQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wbGFjZW1lbnQsIFsibGVmdCIsICJib3R0b20iLCAiaW5saW5lIiwgInJpZ2h0IiwgInRvcCJdKTsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlc2VydmUgPSBNYXRoLmNlaWwoZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5yZXNlcnZlKSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnZhbHVlID0gbnVsbDsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIF9zZXRWYWx1ZSh0aGlzLCB2YWx1ZSk7CiAgfQogIFskZ2V0RXh0cmFdKGF2YWlsYWJsZVNwYWNl
20KSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICBsZXQgewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodAogICAgICB9ID0gYXZhaWxhYmxlU3BhY2U7CiAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgIHdpZHRoID0gdGhpcy5yZXNlcnZlIDw9IDAgPyB3aWR0aCA6IHRoaXMucmVzZXJ2ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgIGhlaWdodCA9IHRoaXMucmVzZXJ2ZSA8PSAwID8gaGVpZ2h0IDogdGhpcy5yZXNlcnZlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdID0gbGF5b3V0Tm9kZSh0aGlzLCB7CiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0CiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGV4dHJhXTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAoIXRoaXMudmFsdWUpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICB0aGlzWyRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZVskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkuaHRtbDsKICAgIGlmICghdmFsdWUpIHsKICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBjb25zdCBzYXZlZFJlc2VydmUgPSB0aGlzLnJlc2VydmU7CiAgICBpZiAodGhpcy5yZXNlcnZlIDw9IDApIHsKICAgICAgY29uc3QgewogICAgICAgIHcsCiAgICAgICAgaAogICAgICB9ID0gdGhpc1skZ2V0RXh0cmFdKGF2YWlsYWJsZVNwYWNlKTsKICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkgewogICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICBjYXNlICJpbmxpbmUiOgogICAgICAgICAgdGhpcy5yZXNlcnZlID0gdzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgIHRoaXMucmVzZXJ2ZSA9IGg7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIGNoaWxkcmVuLnB1c2goewogICAgICAgIG5hbWU6ICIjdGV4dCIsCiAgICAgICAgdmFsdWUKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBjaGlsZHJlbi5wdXNoKHZhbHVlKTsKICAgIH0KICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiZm9udCIsICJtYXJnaW4iLCAidmlzaWJpbGl0eSIpOwogICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkgewogICAgICBjYXNlICJsZWZ0IjoKICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgIGlmICh0aGlzLnJlc2VydmUgPiAwKSB7CiAgICAgICAgICBzdHlsZS53aWR0aCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnJlc2VydmUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wIjoKICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICBpZiAodGhpcy5yZXNlcnZlID4gMCkgewogICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMucmVzZXJ2ZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogICAgc2V0UGFyYSh0aGlzLCBudWxsLCB2YWx1ZSk7CiAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgdGhpcy5yZXNlcnZlID0gc2F2ZWRSZXNlcnZlOwogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgc3R5bGUsCiAgICAgICAgY2xhc3M6IFsieGZhQ2FwdGlvbiJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuCiAgICB9KTsKICB9Cn0KY2xhc3MgQ2VydGlmaWNhdGUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2VydGlmaWNhdGUiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgQ2VydGlmaWNhdGVzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNlcnRpZmljYXRlcyIsIHRydWUpOwogICAgdGhpcy5jcmVkZW50aWFsU2VydmVyUG9saWN5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY3JlZGVudGlhbFNlcnZlclBvbGljeSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51cmwgPSBhdHRyaWJ1dGVzLnVybCB8fCAiIjsKICAgIHRoaXMudXJsUG9saWN5ID0gYXR0cmlidXRlcy51cmxQb2xpY3kgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNyeXB0aW9uID0gbnVsbDsKICAgIHRoaXMuaXNzdWVycyA9IG51bGw7CiAgICB0aGlzLmtleVVzYWdlID0gbnVsbDsKICAgIHRoaXMub2lkcyA9IG51bGw7CiAgICB0aGlzLnNpZ25pbmcgPSBudWxsOwogICAgdGhpcy5zdWJqZWN0RE5zID0gbnVsbDsKICB9Cn0KY2xhc3MgQ2hlY2tCdXR0b24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2hlY2tCdXR0b24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tYXJrID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubWFyaywgWyJkZWZhdWx0IiwgImNoZWNrIiwgImNpcmNsZSIsICJjcm9zcyIsICJkaWFtb25kIiwgInNxdWFyZSIsICJzdGFyIl0pOwogICAgdGhpcy5zaGFwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNoYXBlLCBbInNxdWFyZSIsICJyb3VuZCJdKTsKICAgIHRoaXMuc2l6ZSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuc2l6ZSwgIjEwcHQiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKCJtYXJnaW4iKTsKICAgIGNvbnN0IHNpemUgPSBtZWFzdXJlVG9TdHJpbmc
20odGhpcy5zaXplKTsKICAgIHN0eWxlLndpZHRoID0gc3R5bGUuaGVpZ2h0ID0gc2l6ZTsKICAgIGxldCB0eXBlOwogICAgbGV0IGNsYXNzTmFtZTsKICAgIGxldCBncm91cElkOwogICAgY29uc3QgZmllbGQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGl0ZW1zID0gZmllbGQuaXRlbXMuY2hpbGRyZW4ubGVuZ3RoICYmIGZpZWxkLml0ZW1zLmNoaWxkcmVuWzBdWyR0b0hUTUxdKCkuaHRtbCB8fCBbXTsKICAgIGNvbnN0IGV4cG9ydGVkVmFsdWUgPSB7CiAgICAgIG9uOiAoaXRlbXNbMF0gIT09IHVuZGVmaW5lZCA/IGl0ZW1zWzBdIDogIm9uIikudG9TdHJpbmcoKSwKICAgICAgb2ZmOiAoaXRlbXNbMV0gIT09IHVuZGVmaW5lZCA/IGl0ZW1zWzFdIDogIm9mZiIpLnRvU3RyaW5nKCkKICAgIH07CiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLnZhbHVlPy5bJHRleHRdKCkgfHwgIm9mZiI7CiAgICBjb25zdCBjaGVja2VkID0gdmFsdWUgPT09IGV4cG9ydGVkVmFsdWUub24gfHwgdW5kZWZpbmVkOwogICAgY29uc3QgY29udGFpbmVyID0gZmllbGRbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBjb25zdCBmaWVsZElkID0gZmllbGRbJHVpZF07CiAgICBsZXQgZGF0YUlkOwogICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIEV4Y2xHcm91cCkgewogICAgICBncm91cElkID0gY29udGFpbmVyWyR1aWRdOwogICAgICB0eXBlID0gInJhZGlvIjsKICAgICAgY2xhc3NOYW1lID0gInhmYVJhZGlvIjsKICAgICAgZGF0YUlkID0gY29udGFpbmVyWyRkYXRhXT8uWyR1aWRdIHx8IGNvbnRhaW5lclskdWlkXTsKICAgIH0gZWxzZSB7CiAgICAgIHR5cGUgPSAiY2hlY2tib3giOwogICAgICBjbGFzc05hbWUgPSAieGZhQ2hlY2tib3giOwogICAgICBkYXRhSWQgPSBmaWVsZFskZGF0YV0/LlskdWlkXSB8fCBmaWVsZFskdWlkXTsKICAgIH0KICAgIGNvbnN0IGlucHV0ID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFtjbGFzc05hbWVdLAogICAgICAgIHN0eWxlLAogICAgICAgIGZpZWxkSWQsCiAgICAgICAgZGF0YUlkLAogICAgICAgIHR5cGUsCiAgICAgICAgY2hlY2tlZCwKICAgICAgICB4ZmFPbjogZXhwb3J0ZWRWYWx1ZS5vbiwKICAgICAgICB4ZmFPZmY6IGV4cG9ydGVkVmFsdWUub2ZmLAogICAgICAgICJhcmlhLWxhYmVsIjogYXJpYUxhYmVsKGZpZWxkKSwKICAgICAgICAiYXJpYS1yZXF1aXJlZCI6IGZhbHNlCiAgICAgIH0KICAgIH07CiAgICBpZiAoZ3JvdXBJZCkgewogICAgICBpbnB1dC5hdHRyaWJ1dGVzLm5hbWUgPSBncm91cElkOwogICAgfQogICAgaWYgKGlzUmVxdWlyZWQoZmllbGQpKSB7CiAgICAgIGlucHV0LmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGlucHV0LmF0dHJpYnV0ZXMucmVxdWlyZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJsYWJlbCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFMYWJlbCJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbaW5wdXRdCiAgICB9KTsKICB9Cn0KY2xhc3MgQ2hvaWNlTGlzdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjaG9pY2VMaXN0IiwgdHJ1ZSk7CiAgICB0aGlzLmNvbW1pdE9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY29tbWl0T24sIFsic2VsZWN0IiwgImV4aXQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3BlbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZW4sIFsidXNlckNvbnRyb2wiLCAiYWx3YXlzIiwgIm11bHRpU2VsZWN0IiwgIm9uRW50cnkiXSk7CiAgICB0aGlzLnRleHRFbnRyeSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRleHRFbnRyeSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJib3JkZXIiLCAibWFyZ2luIik7CiAgICBjb25zdCB1aSA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGZpZWxkID0gdWlbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGZvbnRTaXplID0gZmllbGQuZm9udD8uc2l6ZSB8fCAxMDsKICAgIGNvbnN0IG9wdGlvblN0eWxlID0gewogICAgICBmb250U2l6ZTogYGNhbGMoJHtmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYAogICAgfTsKICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBpZiAoZmllbGQuaXRlbXMuY2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBpdGVtcyA9IGZpZWxkLml0ZW1zOwogICAgICBsZXQgZGlzcGxheWVkSW5kZXggPSAwOwogICAgICBsZXQgc2F2ZUluZGV4ID0gMDsKICAgICAgaWYgKGl0ZW1zLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikgewogICAgICAgIGRpc3BsYXllZEluZGV4ID0gaXRlbXMuY2hpbGRyZW5bMF0uc2F2ZTsKICAgICAgICBzYXZlSW5kZXggPSAxIC0gZGlzcGxheWVkSW5kZXg7CiAgICAgIH0KICAgICAgY29uc3QgZGlzcGxheWVkID0gaXRlbXMuY2hpbGRyZW5bZGlzcGxheWVkSW5kZXhdWyR0b0hUTUxdKCkuaHRtbDsKICAgICAgY29uc3QgdmFsdWVzID0gaXRlbXMuY2hpbGRyZW5bc2F2ZUluZGV4XVskdG9IVE1MXSgpLmh0bWw7CiAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlOwogICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLnZhbHVlPy5bJHRleHRdKCkgfHwgIiI7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRpc3BsYXllZC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3Qgb3B0aW9uID0gewogICAgICAgICAgbmFtZTogIm9wdGlvbiIsCiAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgI
20HZhbHVlOiB2YWx1ZXNbaV0gfHwgZGlzcGxheWVkW2ldLAogICAgICAgICAgICBzdHlsZTogb3B0aW9uU3R5bGUKICAgICAgICAgIH0sCiAgICAgICAgICB2YWx1ZTogZGlzcGxheWVkW2ldCiAgICAgICAgfTsKICAgICAgICBpZiAodmFsdWVzW2ldID09PSB2YWx1ZSkgewogICAgICAgICAgb3B0aW9uLmF0dHJpYnV0ZXMuc2VsZWN0ZWQgPSBzZWxlY3RlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNoaWxkcmVuLnB1c2gob3B0aW9uKTsKICAgICAgfQogICAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKDAsIDAsIHsKICAgICAgICAgIG5hbWU6ICJvcHRpb24iLAogICAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgICBoaWRkZW46IHRydWUsCiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlCiAgICAgICAgICB9LAogICAgICAgICAgdmFsdWU6ICIgIgogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzZWxlY3RBdHRyaWJ1dGVzID0gewogICAgICBjbGFzczogWyJ4ZmFTZWxlY3QiXSwKICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgIGRhdGFJZDogZmllbGRbJGRhdGFdPy5bJHVpZF0gfHwgZmllbGRbJHVpZF0sCiAgICAgIHN0eWxlLAogICAgICAiYXJpYS1sYWJlbCI6IGFyaWFMYWJlbChmaWVsZCksCiAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgIH07CiAgICBpZiAoaXNSZXF1aXJlZChmaWVsZCkpIHsKICAgICAgc2VsZWN0QXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdID0gdHJ1ZTsKICAgICAgc2VsZWN0QXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5vcGVuID09PSAibXVsdGlTZWxlY3QiKSB7CiAgICAgIHNlbGVjdEF0dHJpYnV0ZXMubXVsdGlwbGUgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJsYWJlbCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFMYWJlbCJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbewogICAgICAgIG5hbWU6ICJzZWxlY3QiLAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIGF0dHJpYnV0ZXM6IHNlbGVjdEF0dHJpYnV0ZXMKICAgICAgfV0KICAgIH0pOwogIH0KfQpjbGFzcyBDb2xvciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb2xvciIsIHRydWUpOwogICAgdGhpcy5jU3BhY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5jU3BhY2UsIFsiU1JHQiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudmFsdWUgPSBhdHRyaWJ1dGVzLnZhbHVlID8gZ2V0Q29sb3IoYXR0cmlidXRlcy52YWx1ZSkgOiAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyRoYXNTZXR0YWJsZVZhbHVlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIHJldHVybiB0aGlzLnZhbHVlID8gVXRpbC5tYWtlSGV4Q29sb3IodGhpcy52YWx1ZS5yLCB0aGlzLnZhbHVlLmcsIHRoaXMudmFsdWUuYikgOiBudWxsOwogIH0KfQpjbGFzcyBDb21iIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNvbWIiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5udW1iZXJPZkNlbGxzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubnVtYmVyT2ZDZWxscywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgQ29ubmVjdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb25uZWN0IiwgdHJ1ZSk7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzYWdlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudXNhZ2UsIFsiZXhwb3J0QW5kSW1wb3J0IiwgImV4cG9ydE9ubHkiLCAiaW1wb3J0T25seSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogIH0KfQpjbGFzcyBDb250ZW50QXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb250ZW50QXJlYSIsIHRydWUpOwogICAgdGhpcy5oID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudyk7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBsZWZ0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMueCk7CiAgICBjb25zdCB0b3AgPSBtZWFzdXJlVG9TdHJpbmc
20odGhpcy55KTsKICAgIGNvbnN0IHN0eWxlID0gewogICAgICBsZWZ0LAogICAgICB0b3AsCiAgICAgIHdpZHRoOiBtZWFzdXJlVG9TdHJpbmcodGhpcy53KSwKICAgICAgaGVpZ2h0OiBtZWFzdXJlVG9TdHJpbmcodGhpcy5oKQogICAgfTsKICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUNvbnRlbnRhcmVhIl07CiAgICBpZiAoaXNQcmludE9ubHkodGhpcykpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgY2hpbGRyZW46IFtdLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgc3R5bGUsCiAgICAgICAgY2xhc3M6IGNsYXNzTmFtZXMsCiAgICAgICAgaWQ6IHRoaXNbJHVpZF0KICAgICAgfQogICAgfSk7CiAgfQp9CmNsYXNzIENvcm5lciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb3JuZXIiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbnZlcnRlZCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmludmVydGVkLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5qb2luID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuam9pbiwgWyJzcXVhcmUiLCAicm91bmQiXSk7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yYWRpdXMgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnJhZGl1cyk7CiAgICB0aGlzLnN0cm9rZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnN0cm9rZSwgWyJzb2xpZCIsICJkYXNoRG90IiwgImRhc2hEb3REb3QiLCAiZGFzaGVkIiwgImRvdHRlZCIsICJlbWJvc3NlZCIsICJldGNoZWQiLCAibG93ZXJlZCIsICJyYWlzZWQiXSk7CiAgICB0aGlzLnRoaWNrbmVzcyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudGhpY2tuZXNzLCAiMC41cHQiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAidmlzaWJpbGl0eSIpOwogICAgc3R5bGUucmFkaXVzID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMuam9pbiA9PT0gInNxdWFyZSIgPyAwIDogdGhpcy5yYWRpdXMpOwogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBEYXRlRWxlbWVudCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGF0ZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGF0ZVRpbWUgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGVUaW1lIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgY29uc3QgZGF0ZSA9IHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICAgIHRoaXNbJGNvbnRlbnRdID0gZGF0ZSA/IG5ldyBEYXRlKGRhdGUpIDogbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gPyB0aGlzWyRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyBEYXRlVGltZUVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGF0ZVRpbWVFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBpY2tlciA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnBpY2tlciwgWyJob3N0IiwgIm5vbmUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgY29uc3QgZmllbGQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJpbnB1dCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB0eX
20BlOiAidGV4dCIsCiAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgZGF0YUlkOiBmaWVsZFskZGF0YV0/LlskdWlkXSB8fCBmaWVsZFskdWlkXSwKICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICBzdHlsZSwKICAgICAgICAiYXJpYS1sYWJlbCI6IGFyaWFMYWJlbChmaWVsZCksCiAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICB9CiAgICB9OwogICAgaWYgKGlzUmVxdWlyZWQoZmllbGQpKSB7CiAgICAgIGh0bWwuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdID0gdHJ1ZTsKICAgICAgaHRtbC5hdHRyaWJ1dGVzLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW2h0bWxdCiAgICB9KTsKICB9Cn0KY2xhc3MgRGVjaW1hbCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGVjaW1hbCIpOwogICAgdGhpcy5mcmFjRGlnaXRzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZnJhY0RpZ2l0cywKICAgICAgZGVmYXVsdFZhbHVlOiAyLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkRGlnaXRzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubGVhZERpZ2l0cywKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQodGhpc1skY29udGVudF0udHJpbSgpKTsKICAgIHRoaXNbJGNvbnRlbnRdID0gaXNOYU4obnVtYmVyKSA/IG51bGwgOiBudW1iZXI7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbnRlbnRdICE9PSBudWxsID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGVmYXVsdFVpIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlZmF1bHRVaSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KfQpjbGFzcyBEZXNjIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlc2MiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIERpZ2VzdE1ldGhvZCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkaWdlc3RNZXRob2QiLCBbIiIsICJTSEExIiwgIlNIQTI1NiIsICJTSEE1MTIiLCAiUklQRU1EMTYwIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBEaWdlc3RNZXRob2RzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRpZ2VzdE1ldGhvZHMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBEcmF3IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRyYXciLCB0cnVlKTsKICAgIHRoaXMuYW5jaG9yVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFuY2hvclR5cGUsIFsidG9wTGVmdCIsICJib3R0b21DZW50ZXIiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJtaWRkbGVDZW50ZXIiLCAibWlkZGxlTGVmdCIsICJtaWRkbGVSaWdodCIsICJ0b3BDZW50ZXIiLCAidG9wUmlnaHQiXSk7CiAgICB0aGlzLmNvbFNwYW4gPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jb2xTcGFuLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSB8fCBuID09PSAtMQogICAgfSk7CiAgICB0aGlzLmggPSBhdHRyaWJ1dGVzLmggPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmgpIDogIiI7CiAgICB0aGlzLmhBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubG9jYWxlID0gYXR0cmlidXRlcy5sb2NhbGUgfHwgIiI7CiAgICB0aGlzLm1heEggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heEgsICIwcHQiKTsKICAgIHRoaXMubWF4VyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4VywgIjBwdCIpOwogICAgdGhpcy5taW5IID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnJvdGF0ZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnJvdGF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ICUgOTAgPT09IDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNhcHRpb24gPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmtlZXAgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudWkgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgfQogIFskc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBfc2V0VmFsdWUodGhpcywgdmFsdWUpOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBmaXhEaW1lbnNpb25zKHRoaXMpOwogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCBzYXZlZFcgPSB0aGlzLnc7CiAgICBjb25zdCBzYXZlZEggPSB0aGlzLmg7CiAgICBjb25zdCB7CiAgICAgIHcsCiAgICAgIGgsCiAgICAgIGlzQnJva2VuCiAgICB9ID0gbGF5b3V0Tm9kZSh0aGlzLCBhdmFpbGFibGVTcGFjZSk7CiAgICBpZiAodyAmJiB0aGlzLncgPT09ICIiKSB7CiAgICAgIGlmIChpc0Jyb2tlbiAmJiB0aGlzWyRnZXRTdWJmb3JtUGFyZW50XSgpWyRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgICB9CiAgICAgIHRoaXMudyA9IHc7CiAgICB9CiAgICBpZiAoaCAmJiB0aGlzLmggPT09ICIiKSB7CiAgICAgIHRoaXMuaCA9IGg7CiAgICB9CiAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIGlmICghY2hlY2tEaW1lbnNpb25zKHRoaXMsIGF2YWlsYWJsZVNwYWNlKSkgewogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImZvbnQiLCAiaEFsaWduIiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicHJlc2VuY2UiLCAicm90YXRlIiwgImFuY2hvclR5cGUiLCAiYm9yZGVyIiwgIm1hcmdpbiIpOwogICAgc2V0TWluTWF4RGltZW5zaW9ucyh0aGlzLCBzdHlsZSk7CiAgICBpZiAoc3R5bGUubWFyZ2luKSB7CiAgICAgIHN0eWxlLnBhZGRpbmcgPSBzdHlsZS5tYXJnaW47CiAgICAgIGRlbGV0ZSBzdHlsZS5tYXJnaW47CiAgICB9CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFEcmF3Il07CiAgICBpZiAodGhpcy5mb250KSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRm9udCIpOwogICAgfQogICAgaWYgKGlzUHJpbnRPbmx5KHRoaXMpKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBzdHlsZSwKICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgIGNsYXNzOiBjbGFzc05hbWVzCiAgICB9OwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogICAgYXBwbHlBc3Npc3QodGhpcywgYXR0cmlidXRlcyk7CiAgICBjb25zdCBiYm94ID0gY29tcHV0ZUJib3godGhpcywgaHRtbCwgYXZhaWxhYmxlU3BhY2UpOwogICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZVskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkuaHRtbCA6IG51bGw7CiAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgICB9CiAgICBodG1sLmNoaWxkcmVuLnB1c2godmFsdWUpOwogICAgc2V0UGFyYSh0aGlzLCBzdHlsZSwgdmFsdWUpOwogICAgdGhpcy53ID0gc2F2ZWRXOwogICAgdGhpcy5oID0gc2F2ZWRIOwogICAgdGhpc1skcG9wUGFyYV0oKTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgfQp9CmNsYXNzIEVkZ2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZWRnZSIsIHRydWUpOwogICAgdGhpcy5jYXAgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5jYXAsIFsic3F1YXJlIiwgImJ1dHQiLCAicm91bmQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnN0cm9rZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnN0cm9rZSwgWyJzb2xpZCIsICJkYXNoRG90IiwgImRhc2hEb3REb3QiLCAiZGFzaGVkIiwgImRvdHRlZCIsICJlbWJvc3NlZCIsICJldGNoZWQiLCAibG93ZXJlZCIsICJyYWlzZWQiXSk7CiAgICB0aGlzLnRoaWNrbmVzcyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMudGhpY2tuZXNzLCAiMC41cHQiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAidmlzaWJpbGl0eSIpOwogICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgewogICAgICBsaW5lY2FwOiB0aGlzLmNhcCwKICAgICAgd2lkdGg6IG1lYXN1cmVUb1N0cmluZyh0aGlzLnRoaWNrbmVzcyksCiAgICAgIGNvbG9yOiB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIiwKICAgICAgc3R5bGU6ICIiCiAgICB9KTsKICAgIGlmICh0aGlzLnByZXNlbmNlICE9PSAidmlzaWJsZSIpIHsKICAgICAgc3R5bGUuc3R5bGUgPSAibm9uZSI7CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKHRoaXMuc3Ryb2tlKSB7CiAgICAgICAgY2FzZSAic29saWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAic29saWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFzaERvdCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJkYXNoZWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFzaERvdERvdCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJkYXNoZWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGFzaGVkIjoKICAgICAgICAgI
20HN0eWxlLnN0eWxlID0gImRhc2hlZCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJkb3R0ZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZG90dGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImVtYm9zc2VkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gInJpZGdlIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImV0Y2hlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJncm9vdmUiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibG93ZXJlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJpbnNldCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJyYWlzZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAib3V0c2V0IjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEVuY29kaW5nIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY29kaW5nIiwgWyJhZGJlLng1MDkucnNhX3NoYTEiLCAiYWRiZS5wa2NzNy5kZXRhY2hlZCIsICJhZGJlLnBrY3M3LnNoYTEiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEVuY29kaW5ncyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNvZGluZ3MiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmVuY29kaW5nID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgfQp9CmNsYXNzIEVuY3J5cHQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IG51bGw7CiAgfQp9CmNsYXNzIEVuY3J5cHREYXRhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHREYXRhIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3BlcmF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3BlcmF0aW9uLCBbImVuY3J5cHQiLCAiZGVjcnlwdCJdKTsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5maWx0ZXIgPSBudWxsOwogICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb24gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdGlvbiIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRW5jcnlwdGlvbk1ldGhvZCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNyeXB0aW9uTWV0aG9kIiwgWyIiLCAiQUVTMjU2LUNCQyIsICJUUklQTEVERVMtQ0JDIiwgIkFFUzEyOC1DQkMiLCAiQUVTMTkyLUNCQyJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRW5jcnlwdGlvbk1ldGhvZHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdGlvbk1ldGhvZHMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmVuY3J5cHRpb25NZXRob2QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRXZlbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXZlbnQiLCB0cnVlKTsKICAgIHRoaXMuYWN0aXZpdHkgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hY3Rpdml0eSwgWyJjbGljayIsICJjaGFuZ2UiLCAiZG9jQ2xvc2UiLCAiZG9jUmVhZHkiLCAiZW50ZXIiLCAiZXhpdCIsICJmdWxsIiwgImluZGV4Q2hhbmdlIiwgImluaXRpYWxpemUiLCAibW91c2VEb3duIiwgIm1vdXNlRW50ZXIiLCAibW91c2VFeGl0IiwgIm1vdXNlVXAiLCAicG9zdEV4ZWN1dGUiLCAicG9zdE9wZW4iLCAicG9zdFByaW50IiwgInBvc3RTYXZlIiwgInBvc3RTaWduIiwgInBvc3RTdWJtaXQiLCAicHJlRXhlY3V0ZSIsICJwcmVPcGVuIiwgInByZVByaW50IiwgInByZVNhdmUiLCAicHJlU2lnbiIsICJwcmVTdWJtaXQiLCAicmVhZHkiLCAidmFsaWRhdGlvblN0YXRlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxpc3RlbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxpc3RlbiwgWyJyZWZPbmx5IiwgInJlZkFuZERlc2NlbmRlbnRzIl0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmVuY3J5cHREYXRhID0gbnVsbDsKICAgIHRoaXMuZXhlY3V0ZSA9IG51bGw7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgICB0aGlzLnNpZ25EYXRhID0gbnVsbDsKICAgIHRoaXMuc3VibWl0ID0gbnVsbDsKICB9Cn0KY2xhc3MgRXhEYXRhIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleERhdGEiKTsKICAgIHRoaXMuY29udGVudFR5cGUgPSBhdHRyaWJ1dGVzLmNvbnRlbnRUeXBlIHx8ICIiOwogICAgdGhpcy5ocmVmID0gYXR0cmlidXRlcy5ocmVmIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm1heExlbmd0aCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm1heExlbmd0aCwKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAtMQogICAgfSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJpZCA9IGF0dHJpYnV0ZXMucmlkIHx8ICIiOwogICAgdGhpcy50cmFuc2ZlckVuY29
20kaW5nID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHJhbnNmZXJFbmNvZGluZywgWyJub25lIiwgImJhc2U2NCIsICJwYWNrYWdlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRpc0NEQVRBWG1sXSgpIHsKICAgIHJldHVybiB0aGlzLmNvbnRlbnRUeXBlID09PSAidGV4dC9odG1sIjsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgaWYgKHRoaXMuY29udGVudFR5cGUgPT09ICJ0ZXh0L2h0bWwiICYmIGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy54aHRtbC5pZCkgewogICAgICB0aGlzWyRjb250ZW50XSA9IGNoaWxkOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlID09PSAidGV4dC94bWwiKSB7CiAgICAgIHRoaXNbJGNvbnRlbnRdID0gY2hpbGQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlICE9PSAidGV4dC9odG1sIiB8fCAhdGhpc1skY29udGVudF0pIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICByZXR1cm4gdGhpc1skY29udGVudF1bJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogIH0KfQpjbGFzcyBFeE9iamVjdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleE9iamVjdCIsIHRydWUpOwogICAgdGhpcy5hcmNoaXZlID0gYXR0cmlidXRlcy5hcmNoaXZlIHx8ICIiOwogICAgdGhpcy5jbGFzc0lkID0gYXR0cmlidXRlcy5jbGFzc0lkIHx8ICIiOwogICAgdGhpcy5jb2RlQmFzZSA9IGF0dHJpYnV0ZXMuY29kZUJhc2UgfHwgIiI7CiAgICB0aGlzLmNvZGVUeXBlID0gYXR0cmlidXRlcy5jb2RlVHlwZSB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4T2JqZWN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEV4Y2xHcm91cCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleGNsR3JvdXAiLCB0cnVlKTsKICAgIHRoaXMuYWNjZXNzID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWNjZXNzLCBbIm9wZW4iLCAibm9uSW50ZXJhY3RpdmUiLCAicHJvdGVjdGVkIiwgInJlYWRPbmx5Il0pOwogICAgdGhpcy5hY2Nlc3NLZXkgPSBhdHRyaWJ1dGVzLmFjY2Vzc0tleSB8fCAiIjsKICAgIHRoaXMuYW5jaG9yVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFuY2hvclR5cGUsIFsidG9wTGVmdCIsICJib3R0b21DZW50ZXIiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJtaWRkbGVDZW50ZXIiLCAibWlkZGxlTGVmdCIsICJtaWRkbGVSaWdodCIsICJ0b3BDZW50ZXIiLCAidG9wUmlnaHQiXSk7CiAgICB0aGlzLmNvbFNwYW4gPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jb2xTcGFuLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSB8fCBuID09PSAtMQogICAgfSk7CiAgICB0aGlzLmggPSBhdHRyaWJ1dGVzLmggPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmgpIDogIiI7CiAgICB0aGlzLmhBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGF5b3V0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubGF5b3V0LCBbInBvc2l0aW9uIiwgImxyLXRiIiwgInJsLXJvdyIsICJybC10YiIsICJyb3ciLCAidGFibGUiLCAidGIiXSk7CiAgICB0aGlzLm1heEggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heEgsICIwcHQiKTsKICAgIHRoaXMubWF4VyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWF4VywgIjBwdCIpOwogICAgdGhpcy5taW5IID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ID0gYXR0cmlidXRlcy53ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy53KSA6ICIiOwogICAgdGhpcy54ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuYXNzaXN0ID0gbnVsbDsKICAgIHRoaXMuYmluZCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG51bGw7CiAgICB0aGlzLmNhcHRpb24gPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMuY29ubmVjdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ldmVudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWVsZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskaGFzU2V0dGFibGVWYWx1ZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZC5jaGlsZHJlbikgewogICAgICBpZiAoIWZpZWxkLnZhbHVlKSB7CiAgICAgICAgY29uc3Qgbm9kZVZhbHVlID0gbmV3IFZhbHVlKHt9KTsKICAgICAgICBmaWVsZFskYXBwZW5kQ2hpbGRdKG5vZGVWYWx1ZSk7CiAgICAgICAgZmllbGQudmFsdWUgPSBub2RlVmFsdWU7CiAgICAgIH0KICAgICAgZmllbGQudmFsdWVbJHNldFZhbHVlXSh2YWx1ZSk7CiAgICB9CiAgfQogIFskaXNUaGVyZU1vcmVXaWR0aF0oKSB7CiAgICByZXR1cm4gdGhpcy5sYXlvdXQuZW5kc1dpdGgoIi10YiIpICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPiAwIHx8IHRoaXNbJGdldFBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKTsKICB9CiAgWyRpc1NwbGl0dGFibGVdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGlmICghcGFyZW50WyRpc1NwbGl0dGFibGVdKCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXNbJGV4dHJhXS5faXNTcGxpdHRhYmxlOwogICAgfQogICAgaWYgKHRoaXMubGF5b3V0ID09PSAicG9zaXRpb24iIHx8IHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSkgewogICAgICB0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZSA9IGZhbHNlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocGFyZW50LmxheW91dD8uZW5kc1dpdGgoIi10YiIpICYmIHBhcmVudFskZXh0cmFdLm51bWJlckluTGluZSAhPT0gMCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZSA9IHRydWU7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRmbHVzaEhUTUxdKCkgewogICAgcmV0dXJuIGZsdXNoSFRNTCh0aGlzKTsKICB9CiAgWyRhZGRIVE1MXShodG1sLCBiYm94KSB7CiAgICBhZGRIVE1MKHRoaXMsIGh0bWwsIGJib3gpOwogIH0KICBbJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybi
20BnZXRBdmFpbGFibGVTcGFjZSh0aGlzKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBzZXRUYWJJbmRleCh0aGlzKTsKICAgIGlmICh0aGlzLnByZXNlbmNlID09PSAiaGlkZGVuIiB8fCB0aGlzLnByZXNlbmNlID09PSAiaW5hY3RpdmUiIHx8IHRoaXMuaCA9PT0gMCB8fCB0aGlzLncgPT09IDApIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBmaXhEaW1lbnNpb25zKHRoaXMpOwogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7CiAgICAgIGlkOiB0aGlzWyR1aWRdLAogICAgICBjbGFzczogW10KICAgIH07CiAgICBzZXRBY2Nlc3ModGhpcywgYXR0cmlidXRlcy5jbGFzcyk7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgfQogICAgT2JqZWN0LmFzc2lnbih0aGlzWyRleHRyYV0sIHsKICAgICAgY2hpbGRyZW4sCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGF0dGVtcHQ6IDAsCiAgICAgIGxpbmU6IG51bGwsCiAgICAgIG51bWJlckluTGluZTogMCwKICAgICAgYXZhaWxhYmxlU3BhY2U6IHsKICAgICAgICB3aWR0aDogTWF0aC5taW4odGhpcy53IHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS53aWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbih0aGlzLmggfHwgSW5maW5pdHksIGF2YWlsYWJsZVNwYWNlLmhlaWdodCkKICAgICAgfSwKICAgICAgd2lkdGg6IDAsCiAgICAgIGhlaWdodDogMCwKICAgICAgcHJldkhlaWdodDogMCwKICAgICAgY3VycmVudFdpZHRoOiAwCiAgICB9KTsKICAgIGNvbnN0IGlzU3BsaXR0YWJsZSA9IHRoaXNbJGlzU3BsaXR0YWJsZV0oKTsKICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgIHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgaWYgKCFjaGVja0RpbWVuc2lvbnModGhpcywgYXZhaWxhYmxlU3BhY2UpKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgU2V0KFsiZmllbGQiXSk7CiAgICBpZiAodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5XaWR0aHMpICYmIGNvbHVtbldpZHRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRoczsKICAgICAgICB0aGlzWyRleHRyYV0uY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0eWxlID0gdG9TdHlsZSh0aGlzLCAiYW5jaG9yVHlwZSIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgImJvcmRlciIsICJtYXJnaW4iLCAiaEFsaWduIik7CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFFeGNsZ3JvdXAiXTsKICAgIGNvbnN0IGNsID0gbGF5b3V0Q2xhc3ModGhpcyk7CiAgICBpZiAoY2wpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKGNsKTsKICAgIH0KICAgIGlmIChpc1ByaW50T25seSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgYXR0cmlidXRlcy5zdHlsZSA9IHN0eWxlOwogICAgYXR0cmlidXRlcy5jbGFzcyA9IGNsYXNzTmFtZXM7CiAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgIGF0dHJpYnV0ZXMueGZhTmFtZSA9IHRoaXMubmFtZTsKICAgIH0KICAgIHRoaXNbJHB1c2hQYXJhXSgpOwogICAgY29uc3QgaXNMclRiID0gdGhpcy5sYXlvdXQgPT09ICJsci10YiIgfHwgdGhpcy5sYXlvdXQgPT09ICJybC10YiI7CiAgICBjb25zdCBtYXhSdW4gPSBpc0xyVGIgPyBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIDogMTsKICAgIGZvciAoOyB0aGlzWyRleHRyYV0uYXR0ZW1wdCA8IG1heFJ1bjsgdGhpc1skZXh0cmFdLmF0dGVtcHQrKykgewogICAgICBpZiAoaXNMclRiICYmIHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIC0gMSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5udW1iZXJJbkxpbmUgPSAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgICAgZmlsdGVyLAogICAgICAgIGluY2x1ZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQuaXNCcmVhaygpKSB7CiAgICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChpc0xyVGIgJiYgdGhpc1skZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1skZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCAmJiAhdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLmF0dGVtcHQgPSBtYXhSdW47CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgaWYgKHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSBtYXhSdW4pIHsKICAgICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgICBkZWxldGUgdGhpc1skZXh0cmFdOwogICAgICB9CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBsZXQgbWFyZ2luSCA9IDA7CiAgICBsZXQgbWFyZ2luViA9IDA7CiAgICBpZiAodGhpcy5tYXJnaW4pIHsKICAgICAgbWFyZ2luSCA9IHRoaXMubWFyZ2luLmxlZnRJbnNldCArIHRoaXMubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgIG1hcmdpblYgPSB0aGlzLm1hcmdpbi50b3BJbnNldCArIHRoaXMubWFyZ2luLmJvdHRvbUluc2V0OwogICAgfQogICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCh0aGlzWyRleHRyYV0ud2lkdGggKyBtYXJnaW5ILCB0aGlzLncgfHwgMCk7CiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCh0aGlzWyRleHRyYV0uaGVpZ2h0ICsgbWFy
20Z2luViwgdGhpcy5oIHx8IDApOwogICAgY29uc3QgYmJveCA9IFt0aGlzLngsIHRoaXMueSwgd2lkdGgsIGhlaWdodF07CiAgICBpZiAodGhpcy53ID09PSAiIikgewogICAgICBzdHlsZS53aWR0aCA9IG1lYXN1cmVUb1N0cmluZyh3aWR0aCk7CiAgICB9CiAgICBpZiAodGhpcy5oID09PSAiIikgewogICAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0KICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbgogICAgfTsKICAgIGFwcGx5QXNzaXN0KHRoaXMsIGF0dHJpYnV0ZXMpOwogICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgfQp9CmNsYXNzIEV4ZWN1dGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhlY3V0ZSIpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5leGVjdXRlVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmV4ZWN1dGVUeXBlLCBbImltcG9ydCIsICJyZW1lcmdlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJ1bkF0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucnVuQXQsIFsiY2xpZW50IiwgImJvdGgiLCAic2VydmVyIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRXh0cmFzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV4dHJhcyIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib29sZWFuID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmRhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZVRpbWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVjaW1hbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leERhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXh0cmFzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEZpZWxkIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZpZWxkIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2VzcyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFjY2VzcywgWyJvcGVuIiwgIm5vbkludGVyYWN0aXZlIiwgInByb3RlY3RlZCIsICJyZWFkT25seSJdKTsKICAgIHRoaXMuYWNjZXNzS2V5ID0gYXR0cmlidXRlcy5hY2Nlc3NLZXkgfHwgIiI7CiAgICB0aGlzLmFuY2hvclR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5hbmNob3JUeXBlLCBbInRvcExlZnQiLCAiYm90dG9tQ2VudGVyIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAibWlkZGxlQ2VudGVyIiwgIm1pZGRsZUxlZnQiLCAibWlkZGxlUmlnaHQiLCAidG9wQ2VudGVyIiwgInRvcFJpZ2h0Il0pOwogICAgdGhpcy5jb2xTcGFuID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5oID0gYXR0cmlidXRlcy5oID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5oKSA6ICIiOwogICAgdGhpcy5oQWxpZ24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oQWxpZ24sIFsibGVmdCIsICJjZW50ZXIiLCAianVzdGlmeSIsICJqdXN0aWZ5QWxsIiwgInJhZGl4IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxvY2FsZSA9IGF0dHJpYnV0ZXMubG9jYWxlIHx8ICIiOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWluSCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9IGdldFJlbGV2YW50KGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy5yb3RhdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5yb3RhdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCAlIDkwID09PSAwCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBhdHRyaWJ1dGVzLncgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpIDogIiI7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5hc3Npc3QgPSBudWxsOwogICAgdGhpcy5iaW5kID0gbnVsbDsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY2FsY3VsYXRlID0gbnVsbDsKICAgIHRoaXMuY2FwdGlvbiA9IG51bGw7CiAgICB0aGlzLmRlc2MgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMuZm9ybWF0ID0gbnVsbDsKICAgIHRoaXMuaXRlbXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgICB0aGlzLmtlZXAgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudWkgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgIHRoaXMuYmluZEl0ZW1zID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmNvbm5lY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc0JpbmRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbJHNldFZhbHVlXSh2YWx1ZSkgewogICAgX3NldFZhbHVlKHRoaXMsIHZhbHVlKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBzZXRUYWJJbmRleCh0aGlzKTsKICAgIGlmICghdGhpcy51aSkgewogICAgICB0aGlzLnVpID0gbmV3IFVpKHt9KTsKICAgICAgdGhpcy51aVskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKHRoaXMudWkpOwogICAgICBsZXQgbm9kZTsKICAgICAgc3dpdGNoICh0aGlzLml0ZW1zLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIG5vZGUgPSBuZXcgVGV4dEVkaXQoe30pOwogICAgICAgICAgdGhpcy51aS50ZXh0RWRpdCA9IG5vZGU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBub2RlID0gbmV3IENoZWNrQnV0dG9uKHt9KTsKICAgICAgICAgIHRoaXMudWkuY2hlY2tCdXR0b24gPSBub2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgbm9kZSA9IG5ldyBDaG9pY2VMaXN0KHt9KTsKICAgICAgICAgIHRoaXMudWkuY2hvaWNlTGlzdCA9IG5vZGU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICB0aGlzLnVpWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICB9CiAgICBpZiAoIXRoaXMudWkgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImhpZGRlbiIgfHwgdGhpcy5wcmVzZW5jZSA9PT0gImluYWN0aXZlIiB8fCB0aGlzLmggPT09IDAgfHwgdGhpcy53ID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgaWYgKHRoaXMuY2FwdGlvbikgewogICAgICBkZWxldGUgdGhpcy5jYXB0aW9uWyRleHRyYV07CiAgICB9CiAgICB0aGlzWyRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLmNhcHRpb24gPyB0aGlzLmNhcHRpb25bJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWwgOiBudWxsOwogICAgY29uc3Qgc2F2ZWRXID0gdGhpcy53OwogICAgY29uc3Qgc2F2ZWRIID0gdGhpcy5oOwogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQgKyB0aGlzLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gdGhpcy5tYXJnaW4udG9wSW5zZXQgKyB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGxldCBib3JkZXJEaW1zID0gbnVsbDsKICAgIGlmICh0aGlzLncgPT09ICIiIHx8IHRoaXMuaCA9PT0gIiIpIHsKICAgICAgbGV0IHdpZHRoID0gbnVsbDsKICAgICAgbGV0IGhlaWdodCA9IG51bGw7CiAgICAgIGxldCB1aVcgPSAwOwogICAgICBsZXQgdWlIID0gMDsKICAgICAgaWYgKHRoaXMudWkuY2hlY2tCdXR0b24pIHsKICAgICAgICB1aVcgPSB1aUggPSB0aGlzLnVpLmNoZWNrQnV0dG9uLnNpemU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgdywKICAgICAgICAgIGgKICAgICAgICB9ID0gbGF5b3V0Tm9kZSh0aGlzLCBhdmFpbGFibGVTcGFjZSk7CiAgICAgICAgaWYgKHcgIT09IG51bGwpIHsKICAgICAgICAgIHV
20pVyA9IHc7CiAgICAgICAgICB1aUggPSBoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1aUggPSBmb250c19nZXRNZXRyaWNzKHRoaXMuZm9udCwgdHJ1ZSkubGluZU5vR2FwOwogICAgICAgIH0KICAgICAgfQogICAgICBib3JkZXJEaW1zID0gZ2V0Qm9yZGVyRGltcyh0aGlzLnVpWyRnZXRFeHRyYV0oKSk7CiAgICAgIHVpVyArPSBib3JkZXJEaW1zLnc7CiAgICAgIHVpSCArPSBib3JkZXJEaW1zLmg7CiAgICAgIGlmICh0aGlzLmNhcHRpb24pIHsKICAgICAgICBjb25zdCB7CiAgICAgICAgICB3LAogICAgICAgICAgaCwKICAgICAgICAgIGlzQnJva2VuCiAgICAgICAgfSA9IHRoaXMuY2FwdGlvblskZ2V0RXh0cmFdKGF2YWlsYWJsZVNwYWNlKTsKICAgICAgICBpZiAoaXNCcm9rZW4gJiYgdGhpc1skZ2V0U3ViZm9ybVBhcmVudF0oKVskaXNUaGVyZU1vcmVXaWR0aF0oKSkgewogICAgICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgICAgIHJldHVybiBIVE1MUmVzdWx0LkZBSUxVUkU7CiAgICAgICAgfQogICAgICAgIHdpZHRoID0gdzsKICAgICAgICBoZWlnaHQgPSBoOwogICAgICAgIHN3aXRjaCAodGhpcy5jYXB0aW9uLnBsYWNlbWVudCkgewogICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICBjYXNlICJpbmxpbmUiOgogICAgICAgICAgICB3aWR0aCArPSB1aVc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICAgIGhlaWdodCArPSB1aUg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aWR0aCA9IHVpVzsKICAgICAgICBoZWlnaHQgPSB1aUg7CiAgICAgIH0KICAgICAgaWYgKHdpZHRoICYmIHRoaXMudyA9PT0gIiIpIHsKICAgICAgICB3aWR0aCArPSBtYXJnaW5IOwogICAgICAgIHRoaXMudyA9IE1hdGgubWluKHRoaXMubWF4VyA8PSAwID8gSW5maW5pdHkgOiB0aGlzLm1heFcsIHRoaXMubWluVyArIDEgPCB3aWR0aCA/IHdpZHRoIDogdGhpcy5taW5XKTsKICAgICAgfQogICAgICBpZiAoaGVpZ2h0ICYmIHRoaXMuaCA9PT0gIiIpIHsKICAgICAgICBoZWlnaHQgKz0gbWFyZ2luVjsKICAgICAgICB0aGlzLmggPSBNYXRoLm1pbih0aGlzLm1heEggPD0gMCA/IEluZmluaXR5IDogdGhpcy5tYXhILCB0aGlzLm1pbkggKyAxIDwgaGVpZ2h0ID8gaGVpZ2h0IDogdGhpcy5taW5IKTsKICAgICAgfQogICAgfQogICAgdGhpc1skcG9wUGFyYV0oKTsKICAgIGZpeERpbWVuc2lvbnModGhpcyk7CiAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIGlmICghY2hlY2tEaW1lbnNpb25zKHRoaXMsIGF2YWlsYWJsZVNwYWNlKSkgewogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgdGhpc1skcG9wUGFyYV0oKTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImZvbnQiLCAiZGltZW5zaW9ucyIsICJwb3NpdGlvbiIsICJyb3RhdGUiLCAiYW5jaG9yVHlwZSIsICJwcmVzZW5jZSIsICJtYXJnaW4iLCAiaEFsaWduIik7CiAgICBzZXRNaW5NYXhEaW1lbnNpb25zKHRoaXMsIHN0eWxlKTsKICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUZpZWxkIl07CiAgICBpZiAodGhpcy5mb250KSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRm9udCIpOwogICAgfQogICAgaWYgKGlzUHJpbnRPbmx5KHRoaXMpKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBzdHlsZSwKICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgIGNsYXNzOiBjbGFzc05hbWVzCiAgICB9OwogICAgaWYgKHN0eWxlLm1hcmdpbikgewogICAgICBzdHlsZS5wYWRkaW5nID0gc3R5bGUubWFyZ2luOwogICAgICBkZWxldGUgc3R5bGUubWFyZ2luOwogICAgfQogICAgc2V0QWNjZXNzKHRoaXMsIGNsYXNzTmFtZXMpOwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuCiAgICB9OwogICAgYXBwbHlBc3Npc3QodGhpcywgYXR0cmlidXRlcyk7CiAgICBjb25zdCBib3JkZXJTdHlsZSA9IHRoaXMuYm9yZGVyID8gdGhpcy5ib3JkZXJbJHRvU3R5bGVdKCkgOiBudWxsOwogICAgY29uc3QgYmJveCA9IGNvbXB1dGVCYm94KHRoaXMsIGh0bWwsIGF2YWlsYWJsZVNwYWNlKTsKICAgIGNvbnN0IHVpID0gdGh
20pcy51aVskdG9IVE1MXSgpLmh0bWw7CiAgICBpZiAoIXVpKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIGJvcmRlclN0eWxlKTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhjcmVhdGVXcmFwcGVyKHRoaXMsIGh0bWwpLCBiYm94KTsKICAgIH0KICAgIGlmICh0aGlzWyR0YWJJbmRleF0pIHsKICAgICAgaWYgKHVpLmNoaWxkcmVuPy5bMF0pIHsKICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnRhYmluZGV4ID0gdGhpc1skdGFiSW5kZXhdOwogICAgICB9IGVsc2UgewogICAgICAgIHVpLmF0dHJpYnV0ZXMudGFiaW5kZXggPSB0aGlzWyR0YWJJbmRleF07CiAgICAgIH0KICAgIH0KICAgIGlmICghdWkuYXR0cmlidXRlcy5zdHlsZSkgewogICAgICB1aS5hdHRyaWJ1dGVzLnN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIGxldCBhRWxlbWVudCA9IG51bGw7CiAgICBpZiAodGhpcy51aS5idXR0b24pIHsKICAgICAgaWYgKHVpLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkgewogICAgICAgIFthRWxlbWVudF0gPSB1aS5jaGlsZHJlbi5zcGxpY2UoMCwgMSk7CiAgICAgIH0KICAgICAgT2JqZWN0LmFzc2lnbih1aS5hdHRyaWJ1dGVzLnN0eWxlLCBib3JkZXJTdHlsZSk7CiAgICB9IGVsc2UgewogICAgICBPYmplY3QuYXNzaWduKHN0eWxlLCBib3JkZXJTdHlsZSk7CiAgICB9CiAgICBjaGlsZHJlbi5wdXNoKHVpKTsKICAgIGlmICh0aGlzLnZhbHVlKSB7CiAgICAgIGlmICh0aGlzLnVpLmltYWdlRWRpdCkgewogICAgICAgIHVpLmNoaWxkcmVuLnB1c2godGhpcy52YWx1ZVskdG9IVE1MXSgpLmh0bWwpOwogICAgICB9IGVsc2UgaWYgKCF0aGlzLnVpLmJ1dHRvbikgewogICAgICAgIGxldCB2YWx1ZSA9ICIiOwogICAgICAgIGlmICh0aGlzLnZhbHVlLmV4RGF0YSkgewogICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlLmV4RGF0YVskdGV4dF0oKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUudGV4dCkgewogICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlLnRleHRbJGdldEV4dHJhXSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBodG1sVmFsdWUgPSB0aGlzLnZhbHVlWyR0b0hUTUxdKCkuaHRtbDsKICAgICAgICAgIGlmIChodG1sVmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgdmFsdWUgPSBodG1sVmFsdWUuY2hpbGRyZW5bMF0udmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnVpLnRleHRFZGl0ICYmIHRoaXMudmFsdWUudGV4dD8ubWF4Q2hhcnMpIHsKICAgICAgICAgIHV
20pLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMubWF4TGVuZ3RoID0gdGhpcy52YWx1ZS50ZXh0Lm1heENoYXJzOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgIGlmICh0aGlzLnVpLm51bWVyaWNFZGl0KSB7CiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CiAgICAgICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHVpLmNoaWxkcmVuWzBdLm5hbWUgPT09ICJ0ZXh0YXJlYSIpIHsKICAgICAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLnVpLmltYWdlRWRpdCAmJiB1aS5jaGlsZHJlbj8uWzBdICYmIHRoaXMuaCkgewogICAgICBib3JkZXJEaW1zID0gYm9yZGVyRGltcyB8fCBnZXRCb3JkZXJEaW1zKHRoaXMudWlbJGdldEV4dHJhXSgpKTsKICAgICAgbGV0IGNhcHRpb25IZWlnaHQgPSAwOwogICAgICBpZiAodGhpcy5jYXB0aW9uICYmIFsidG9wIiwgImJvdHRvbSJdLmluY2x1ZGVzKHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpKSB7CiAgICAgICAgY2FwdGlvbkhlaWdodCA9IHRoaXMuY2FwdGlvbi5yZXNlcnZlOwogICAgICAgIGlmIChjYXB0aW9uSGVpZ2h0IDw9IDApIHsKICAgICAgICAgIGNhcHRpb25IZWlnaHQgPSB0aGlzLmNhcHRpb25bJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSkuaDsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5wdXRIZWlnaHQgPSB0aGlzLmggLSBjYXB0aW9uSGVpZ2h0IC0gbWFyZ2luViAtIGJvcmRlckRpbXMuaDsKICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhpbnB1dEhlaWdodCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIH0KICAgIH0KICAgIGlmIChhRWxlbWVudCkgewogICAgICB1aS5jaGlsZHJlbi5wdXNoKGFFbGVtZW50KTsKICAgIH0KICAgIGlmICghY2FwdGlvbikgewogICAgICBpZiAodWkuYXR0cmlidXRlcy5jbGFzcykgewogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhTGVmdCIpOwogICAgICB9CiAgICAgIHRoaXMudyA9IHNhdmVkVzsKICAgICAgdGhpcy5oID0gc2F2ZWRIOwogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGNyZWF0ZVdyYXBwZXIodGhpcywgaHRtbCksIGJib3gpOwogICAgfQogICAgaWYgKHRoaXMudWkuYnV0dG9uKSB7CiAgICAgIGlmIChzdHlsZS5wYWRkaW5nKSB7CiAgICAgICAgZGVsZXRlIHN0eWxlLnBhZGRpbmc7CiAgICAgIH0KICAgICAgaWYgKGNhcHRpb24ubmFtZSA9PT0gImRpdiIpIHsKICAgICAgICBjYXB0aW9uLm5hbWUgPSAic3BhbiI7CiAgICAgIH0KICAgICAgdWkuY2hpbGRyZW4ucHVzaChjYXB0aW9uKTsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhodG1sLCBiYm94KTsKICAgIH0gZWxzZSBpZiAodGhpcy51aS5jaGVja0J1dHRvbikgewogICAgICBjYXB0aW9uLmF0dHJpYnV0ZXMuY2xhc3NbMF0gPSAieGZhQ2FwdGlvbkZvckNoZWNrQnV0dG9uIjsKICAgIH0KICAgIGlmICghdWkuYXR0cmlidXRlcy5jbGFzcykgewogICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzID0gW107CiAgICB9CiAgICB1aS5jaGlsZHJlbi5zcGxpY2UoMCwgMCwgY2FwdGlvbik7CiAgICBzd2l0Y2ggKHRoaXMuY2FwdGlvbi5wbGFjZW1lbnQpIHsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFMZWZ0Iik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYVJpZ2h0Iik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFUb3AiKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUJvdHRvbSIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJpbmxpbmUiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhTGVmdCIpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgdGhpcy53ID0gc2F2ZWRXOwogICAgdGhpcy5oID0gc2F2ZWRIOwogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhjcmVhdGVXcmFwcGVyKHRoaXMsIGh0bWwpLCBiYm94KTsKICB9Cn0KY2xhc3MgRmlsbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWxsIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmxpbmVhciA9IG51bGw7CiAgICB0aGlzLnBhdHRlcm4gPSBudWxsOwogICAgdGhpcy5yYWRpYWwgPSBudWxsOwogICAgdGhpcy5zb2xpZCA9IG51bGw7CiAgICB0aGlzLnN0aXBwbGUgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgY29uc3QgZ3JhbmRwYSA9IHBhcmVudFskZ2V0UGFyZW50XSgpOwogICAgY29uc3QgZ2dyYW5kcGEgPSBncmFuZHBhWyRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBsZXQgcHJvcE5hbWUgPSAiY29sb3IiOwogICAgbGV0IGFsdFByb3BOYW1lID0gcHJvcE5hbWU7CiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQm9yZGVyKSB7CiAgICAgI
20HByb3BOYW1lID0gImJhY2tncm91bmQtY29sb3IiOwogICAgICBhbHRQcm9wTmFtZSA9ICJiYWNrZ3JvdW5kIjsKICAgICAgaWYgKGdncmFuZHBhIGluc3RhbmNlb2YgVWkpIHsKICAgICAgICBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAid2hpdGUiOwogICAgICB9CiAgICB9CiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgUmVjdGFuZ2xlIHx8IHBhcmVudCBpbnN0YW5jZW9mIEFyYykgewogICAgICBwcm9wTmFtZSA9IGFsdFByb3BOYW1lID0gImZpbGwiOwogICAgICBzdHlsZS5maWxsID0gIndoaXRlIjsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBpZiAobmFtZSA9PT0gImV4dHJhcyIgfHwgbmFtZSA9PT0gImNvbG9yIikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhGQU9iamVjdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBjb2xvciA9IG9ialskdG9TdHlsZV0odGhpcy5jb2xvcik7CiAgICAgIGlmIChjb2xvcikgewogICAgICAgIHN0eWxlW2NvbG9yLnN0YXJ0c1dpdGgoIiMiKSA/IHByb3BOYW1lIDogYWx0UHJvcE5hbWVdID0gY29sb3I7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQogICAgaWYgKHRoaXMuY29sb3I/LnZhbHVlKSB7CiAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvclskdG9TdHlsZV0oKTsKICAgICAgc3R5bGVbY29sb3Iuc3RhcnRzV2l0aCgiIyIpID8gcHJvcE5hbWUgOiBhbHRQcm9wTmFtZV0gPSBjb2xvcjsKICAgIH0KICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgRmlsdGVyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZpbHRlciIsIHRydWUpOwogICAgdGhpcy5hZGRSZXZvY2F0aW9uSW5mbyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFkZFJldm9jYXRpb25JbmZvLCBbIiIsICJyZXF1aXJlZCIsICJvcHRpb25hbCIsICJub25lIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy52ZXJzaW9uID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IHRoaXMudmVyc2lvbiwKICAgICAgZGVmYXVsdFZhbHVlOiA1LAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDEgJiYgeCA8PSA1CiAgICB9KTsKICAgIHRoaXMuYXBwZWFyYW5jZUZpbHRlciA9IG51bGw7CiAgICB0aGlzLmNlcnRpZmljYXRlcyA9IG51bGw7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZHMgPSBudWxsOwogICAgdGhpcy5lbmNvZGluZ3MgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kcyA9IG51bGw7CiAgICB0aGlzLmhhbmRsZXIgPSBudWxsOwogICAgdGhpcy5sb2NrRG9jdW1lbnQgPSBudWxsOwogICAgdGhpcy5tZHAgPSBudWxsOwogICAgdGhpcy5yZWFzb25zID0gbnVsbDsKICAgIHRoaXMudGltZVN0YW1wID0gbnVsbDsKICB9Cn0KY2xhc3MgRmxvYXQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZsb2F0Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgY29uc3QgbnVtYmVyID0gcGFyc2VGbG9hdCh0aGlzWyRjb250ZW50XS50cmltKCkpOwogICAgdGhpc1skY29udGVudF0gPSBpc05hTihudW1iZXIpID8gbnVsbCA6IG51bWJlcjsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1skY29udGVudF0gIT09IG51bGwgPyB0aGlzWyRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyB0ZW1wbGF0ZV9Gb250IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImZvbnQiLCB0cnVlKTsKICAgIHRoaXMuYmFzZWxpbmVTaGlmdCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuYmFzZWxpbmVTaGlmdCk7CiAgICB0aGlzLmZvbnRIb3Jpem9udGFsU2NhbGUgPSBnZXRGbG9hdCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZm9udEhvcml6b250YWxTY2FsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxMDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmZvbnRWZXJ0aWNhbFNjYWxlID0gZ2V0RmxvYXQoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZvbnRWZXJ0aWNhbFNjYWxlLAogICAgICBkZWZhdWx0VmFsdWU6IDEwMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5rZXJuaW5nTW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmtlcm5pbmdNb2RlLCBbIm5vbmUiLCAicGFpciJdKTsKICAgIHRoaXMubGV0dGVyU3BhY2luZyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubGV0dGVyU3BhY2luZywgIjAiKTsKICAgIHRoaXMubGluZVRocm91Z2ggPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5saW5lVGhyb3VnaCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDIKICAgIH0pOwogICAgdGhpcy5saW5lVGhyb3VnaFBlcmlvZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmxpbmVUaHJvdWdoUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy5vdmVybGluZSA9IGdldEludGVnZXIoew
20ogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm92ZXJsaW5lLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEgfHwgeCA9PT0gMgogICAgfSk7CiAgICB0aGlzLm92ZXJsaW5lUGVyaW9kID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3ZlcmxpbmVQZXJpb2QsIFsiYWxsIiwgIndvcmQiXSk7CiAgICB0aGlzLnBvc3R1cmUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wb3N0dXJlLCBbIm5vcm1hbCIsICJpdGFsaWMiXSk7CiAgICB0aGlzLnNpemUgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnNpemUsICIxMHB0Iik7CiAgICB0aGlzLnR5cGVmYWNlID0gYXR0cmlidXRlcy50eXBlZmFjZSB8fCAiQ291cmllciI7CiAgICB0aGlzLnVuZGVybGluZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnVuZGVybGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDIKICAgIH0pOwogICAgdGhpcy51bmRlcmxpbmVQZXJpb2QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy51bmRlcmxpbmVQZXJpb2QsIFsiYWxsIiwgIndvcmQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53ZWlnaHQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy53ZWlnaHQsIFsibm9ybWFsIiwgImJvbGQiXSk7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogIH0KICBbJGNsZWFuXShidWlsZGVyKSB7CiAgICBzdXBlclskY2xlYW5dKGJ1aWxkZXIpOwogICAgdGhpc1skZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQodGhpcy50eXBlZmFjZSk7CiAgfQogIFskdG9TdHlsZV0oKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImZpbGwiKTsKICAgIGNvbnN0IGNvbG9yID0gc3R5bGUuY29sb3I7CiAgICBpZiAoY29sb3IpIHsKICAgICAgaWYgKGNvbG9yID09PSAiIzAwMDAwMCIpIHsKICAgICAgICBkZWxldGUgc3R5bGUuY29sb3I7CiAgICAgIH0gZWxzZSBpZiAoIWNvbG9yLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgIHN0eWxlLmJhY2tncm91bmQgPSBjb2xvcjsKICAgICAgICBzdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJ0ZXh0IjsKICAgICAgICBzdHlsZS5jb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmJhc2VsaW5lU2hpZnQpIHsKICAgICAgc3R5bGUudmVydGljYWxBbGlnbiA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLmJhc2VsaW5lU2hpZnQpOwogICAgfQogICAgc3R5bGUuZm9udEtlcm5pbmcgPSB0aGlzLmtlcm5pbmdNb2RlID09PSAibm9uZSIgPyAibm9uZSIgOiAibm9ybWFsIjsKICAgIHN0eWxlLmxldHRlclNwYWNpbmcgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5sZXR0ZXJTcGFjaW5nKTsKICAgIGlmICh0aGlzLmxpbmVUaHJvdWdoICE9PSAwKSB7CiAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uID0gImxpbmUtdGhyb3VnaCI7CiAgICAgIGlmICh0aGlzLmxpbmVUaHJvdWdoID09PSAyKSB7CiAgICAgICAgc3R5bGUudGV4dERlY29yYXRpb25TdHlsZSA9ICJkb3VibGUiOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5vdmVybGluZSAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJvdmVybGluZSI7CiAgICAgIGlmICh0aGlzLm92ZXJsaW5lID09PSAyKSB7CiAgICAgICAgc3R5bGUudGV4dERlY29yYXRpb25TdHlsZSA9ICJkb3VibGUiOwogICAgICB9CiAgICB9CiAgICBzdHlsZS5mb250U3R5bGUgPSB0aGlzLnBvc3R1cmU7CiAgICBzdHlsZS5mb250U2l6ZSA9IG1lYXN1cmVUb1N0cmluZygwLjk5ICogdGhpcy5zaXplKTsKICAgIHNldEZvbnRGYW1pbHkodGhpcywgdGh
20pcywgdGhpc1skZ2xvYmFsRGF0YV0uZm9udEZpbmRlciwgc3R5bGUpOwogICAgaWYgKHRoaXMudW5kZXJsaW5lICE9PSAwKSB7CiAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uID0gInVuZGVybGluZSI7CiAgICAgIGlmICh0aGlzLnVuZGVybGluZSA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgc3R5bGUuZm9udFdlaWdodCA9IHRoaXMud2VpZ2h0OwogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBGb3JtYXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZm9ybWF0IiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogIH0KfQpjbGFzcyBIYW5kbGVyIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImhhbmRsZXIiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEh5cGhlbmF0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImh5cGhlbmF0aW9uIik7CiAgICB0aGlzLmV4Y2x1ZGVBbGxDYXBzID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZXhjbHVkZUFsbENhcHMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmV4Y2x1ZGVJbml0aWFsQ2FwID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZXhjbHVkZUluaXRpYWxDYXAsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmh5cGhlbmF0ZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmh5cGhlbmF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wdXNoQ2hhcmFjdGVyQ291bnQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5wdXNoQ2hhcmFjdGVyQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMywKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMucmVtYWluQ2hhcmFjdGVyQ291bnQgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5yZW1haW5DaGFyYWN0ZXJDb3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiAzLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMud29yZENoYXJhY3RlckNvdW50ID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMud29yZENoYXJhY3RlckNvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IDcsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgfQp9CmNsYXNzIEltYWdlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImltYWdlIik7CiAgICB0aGlzLmFzcGVjdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFzcGVjdCwgWyJmaXQiLCAiYWN0dWFsIiwgImhlaWdodCIsICJub25lIiwgIndpZHRoIl0pOwogICAgdGhpcy5jb250ZW50VHlwZSA9IGF0dHJpYnV0ZXMuY29udGVudFR5cGUgfHwgIiI7CiAgICB0aGlzLmhyZWYgPSBhdHRyaWJ1dGVzLmhyZWYgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRyYW5zZmVyRW5jb2RpbmcsIFsiYmFzZTY0IiwgIm5vbmUiLCAicGFja2FnZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlICYmICFNSU1FUy5oYXModGhpcy5jb250ZW50VHlwZS50b0xvd2VyQ2FzZSgpKSkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGxldCBidWZmZXIgPSB0aGlzWyRnbG9iYWxEYXRhXS5pbWFnZXMgJiYgdGhpc1skZ2xvYmFsRGF0YV0uaW1hZ2VzLmdldCh0aGlzLmhyZWYpOwogICAgaWYgKCFidWZmZXIgJiYgKHRoaXMuaHJlZiB8fCAhdGhpc1skY29udGVudF0pKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgaWYgKCFidWZmZXIgJiYgdGhpcy50cmFuc2ZlckVuY29kaW5nID09PSAiYmFzZTY0IikgewogICAgICBidWZmZXIgPSBmcm9tQmFzZTY0VXRpbCh0aGlzWyRjb250ZW50XSk7CiAgICB9CiAgICBpZiAoIWJ1ZmZlcikgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICghdGhpcy5jb250ZW50VHlwZSkgewogICAgICBmb3IgKGNvbnN0IFtoZWFkZXIsIHR5cGVdIG9mIElNQUdFU19IRUFERVJTKSB7CiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiBoZWFkZXIubGVuZ3RoICYmIGhlYWRlci5ldmVyeSgoeCwgaSkgPT4geCA9PT0gYnVmZmVyW2ldKSkgewogICAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IHR5cGU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgI
20H0KICAgICAgaWYgKCF0aGlzLmNvbnRlbnRUeXBlKSB7CiAgICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwgewogICAgICB0eXBlOiB0aGlzLmNvbnRlbnRUeXBlCiAgICB9KTsKICAgIGxldCBzdHlsZTsKICAgIHN3aXRjaCAodGhpcy5hc3BlY3QpIHsKICAgICAgY2FzZSAiZml0IjoKICAgICAgY2FzZSAiYWN0dWFsIjoKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaGVpZ2h0IjoKICAgICAgICBzdHlsZSA9IHsKICAgICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgICAgb2JqZWN0Rml0OiAiZmlsbCIKICAgICAgICB9OwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJub25lIjoKICAgICAgICBzdHlsZSA9IHsKICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICBoZWlnaHQ6ICIxMDAlIiwKICAgICAgICAgIG9iamVjdEZpdDogImZpbGwiCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAid2lkdGgiOgogICAgICAgIHN0eWxlID0gewogICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgIG9iamVjdEZpdDogImZpbGwiCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiaW1nIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUltYWdlIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgc3JjOiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpLAogICAgICAgIGFsdDogcGFyZW50ID8gYXJpYUxhYmVsKHBhcmVudFskZ2V0UGFyZW50XSgpKSA6IG51bGwKICAgICAgfQogICAgfSk7CiAgfQp9CmNsYXNzIEltYWdlRWRpdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJpbWFnZUVkaXQiLCB0cnVlKTsKICAgIHRoaXMuZGF0YSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRhdGEsIFsibGluayIsICJlbWJlZCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAodGhpcy5kYXRhID09PSAiZW1iZWQiKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgICBhdHRyaWJ1dGVzOiB7fQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KfQpjbGFzcyBJbnRlZ2VyIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJpbnRlZ2VyIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgY29uc3QgbnVtYmVyID0gcGFyc2VJbnQodGhpc1skY29udGVudF0udHJpbSgpLCAxMCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGlzTmFOKG51bWJlcikgPyBudWxsIDogbnVtYmVyOwogIH0KICBbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzWyRjb250ZW50XSAhPT0gbnVsbCA/IHRoaXNbJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIElzc3VlcnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaXNzdWVycyIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgSXRlbXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaXRlbXMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnNhdmUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zYXZlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGNvbnN0IG91dHB1dCA9IFtdOwogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICBvdXRwdXQucHVzaChjaGlsZFskdGV4dF0oKSk7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKG91dHB1dCk7CiAgfQp9CmNsYXNzIEtlZXAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAia2VlcCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICBjb25zdCBvcHRpb25zID0gWyJub25lIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIl07CiAgICB0aGlzLmludGFjdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmludGFjdCwgb3B0aW9ucyk7CiAgICB0aGlzLm5leHQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uZXh0LCBvcHRpb25zKTsKICAgIHRoaXMucHJldmlvdXMgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5wcmV2aW91cywgb3B0aW9ucyk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KfQpjbGFzcyBLZXlVc2FnZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJrZXlVc2FnZSIpOwogICAgY29uc3Qgb3B0aW9ucyA9IFsiIiwgInllcyIsICJubyJdOwogICAgdGhpcy5jcmxTaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuY3JsU2lnbiwgb3B0aW9ucyk7CiAgICB0aGlzLmRhdGFFbmNpcGhlcm1lbnQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5kYXRhRW5jaXBoZXJtZW50LCBvcHRpb25zKTsKICAgIHRoaXMuZGVjaXBoZXJPbmx5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZGVjaXBoZXJPbmx5LCBvcHRpb25zKTsKICAgIHRoaXMuZGlnaXRhbFNpZ25hdHVyZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmRpZ2l0YWxTaWduYXR1cmUsIG9wdGlvbnMpOwogICAgdGhpcy5lbmNpcGhlck9ubHkgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5lbmNpcGhlck9ubHksIG9wdGlvbnMpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmtleUFncmVlbWVudCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmtleUFncmVlbWVudCwgb3B0aW9ucyk7CiAgICB0aGlzLmtleUNlcnRTaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMua2V5Q2VydFNpZ24sIG9wdGlvbnMpOwogICAgdGhpcy5rZXlFbmNpcGhlcm1lbnQgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5rZXlFbmNpcGhlcm1lbnQsIG9wdGlvbnMpOwogICAgdGhpcy5ub25SZXB1ZGlhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5vblJlcHVkaWF0aW9uLCBvcHRpb25zKTsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBMaW5lIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImxpbmUiLCB0cnVlKTsKICAgIHRoaXMuaGFuZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnNsb3BlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2xvcGUsIFsiXFwiLCAiLyJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmVkZ2UgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmVkZ2UgfHwgbmV3IEVkZ2Uoe30pOwogICAgY29uc3QgZWRnZVN0eWxlID0gZWRnZVskdG9TdHlsZV0oKTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IHRoaWNrbmVzcyA9IGVkZ2UucHJlc2VuY2UgPT09ICJ2aXNpYmxlIiA/IGVkZ2UudGhpY2tuZXNzIDogMDsKICAgIHN0eWxlLnN0cm9rZVdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHRoaWNrbmVzcyk7CiAgICBzdHlsZS5zdHJva2UgPSBlZGdlU3R5bGUuY29sb3I7CiAgICBsZXQgeDEsIHkxLCB4MiwgeTI7CiAgICBsZXQgd2lkdGggPSAiMTAwJSI7CiAgICBsZXQgaGVpZ2h0ID0gIjEwMCUiOwogICAgaWYgKHBhcmVudC53IDw9IHRoaWNrbmVzcykgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWyI1MCUiLCAwLCAiNTAlIiwgIjEwMCUiXTsKICAgICAgd2lkdGggPSBzdHlsZS5zdHJva2VXaWR0aDsKICAgIH0gZWxzZSBpZiAocGFyZW50LmggPD0gdGhpY2tuZXNzKSB7CiAgICAgIFt4MSwgeTEsIHgyLCB5Ml0gPSBbMCwgIjUwJSIsICIxMDAlIiwgIjUwJSJdOwogICAgICBoZWlnaHQgPSBzdHlsZS5zdHJva2VXaWR0aDsKICAgIH0gZWxzZSBpZiAodGhpcy5zbG9wZSA9PT0gIlxcIikgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWzAsIDAsICIxMDAlIiwgIjEwMCUiXTsKICAgIH0gZWxzZSB7CiAgICAgIFt4MSwgeTEsIHgyLCB5Ml0gPSBbMCwgIjEwMCUiLCAiMTAwJSIsIDBdOwogICAgfQogICAgY29uc3QgbGluZSA9IHsKICAgICAgbmFtZTogImxpbmUiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICB4MSwKICAgICAgICB5MSwKICAgICAgICB4MiwKICAgICAgICB5MiwKICAgICAgICBzdHlsZQogICAgICB9CiAgICB9OwogICAgY29uc3Qgc3ZnID0gewogICAgICBuYW1lOiAic3ZnIiwKICAgICAgY2hpbGRyZW46IFtsaW5lXSwKICAgICAgYXR0cmlidXRlczogewogICAgICAgI
20HhtbG5zOiBTVkdfTlMsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICBvdmVyZmxvdzogInZpc2libGUiCiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgaWYgKGhhc01hcmdpbihwYXJlbnQpKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgIGRpc3BsYXk6ICJpbmxpbmUiLAogICAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgICBoZWlnaHQ6ICIxMDAlIgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2hpbGRyZW46IFtzdmddCiAgICAgIH0pOwogICAgfQogICAgc3ZnLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhzdmcpOwogIH0KfQpjbGFzcyBMaW5lYXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibGluZWFyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsidG9SaWdodCIsICJ0b0JvdHRvbSIsICJ0b0xlZnQiLCAidG9Ub3AiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgc3RhcnRDb2xvciA9IHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogICAgY29uc3QgdHJhbnNmID0gdGhpcy50eXBlLnJlcGxhY2UoLyhbUkJMVF0pLywgIiAkMSIpLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBlbmRDb2xvciA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yWyR0b1N0eWxlXSgpIDogIiMwMDAwMDAiOwogICAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQoJHt0cmFuc2Z9LCAke3N0YXJ0Q29sb3J9LCAke2VuZENvbG9yfSlgOwogIH0KfQpjbGFzcyBMb2NrRG9jdW1lbnQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImxvY2tEb2N1bWVudCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IGdldFN0cmluZ09wdGlvbih0aGlzWyRjb250ZW50XSwgWyJhdXRvIiwgIjAiLCAiMSJdKTsKICB9Cn0KY2xhc3MgTWFuaWZlc3QgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWFuaWZlc3QiLCB0cnVlKTsKICAgIHRoaXMuYWN0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWN0aW9uLCBbImluY2x1ZGUiLCAiYWxsIiwgImV4Y2x1ZGUiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnJlZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNYXJnaW4gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWFyZ2luIiwgdHJ1ZSk7CiAgICB0aGlzLmJvdHRvbUluc2V0ID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5ib3R0b21JbnNldCwgIjAiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWZ0SW5zZXQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmxlZnRJbnNldCwgIjAiKTsKICAgIHRoaXMucmlnaHRJbnNldCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMucmlnaHRJbnNldCwgIjAiKTsKICAgIHRoaXMudG9wSW5zZXQgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRvcEluc2V0LCAiMCIpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIHJldHVybiB7CiAgICAgIG1hcmdpbjogbWVhc3VyZVRvU3RyaW5nKHRoaXMudG9wSW5zZXQpICsgIiAiICsgbWVhc3VyZVRvU3RyaW5nKHRoaXMucmlnaHRJbnNldCkgKyAiICIgKyBtZWFzdXJlVG9TdHJpbmcodGhpcy5ib3R0b21JbnNldCkgKyAiICIgKyBtZWFzdXJlVG9TdHJpbmcodGhpcy5sZWZ0SW5zZXQpCiAgICB9OwogIH0KfQpjbGFzcyBNZHAgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWRwIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucGVybWlzc2lvbnMgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5wZXJtaXNzaW9ucywKICAgICAgZGVmYXVsdFZhbHVlOiAyLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDMKICAgIH0pOwogICAgdGhpcy5zaWduYXR1cmVUeXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2lnbmF0dXJlVHlwZSwgWyJmaWxsZXIiLCAiYXV0aG9yIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgTWVkaXVtIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm1lZGl1bSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmltYWdpbmdCQm94ID0gZ2V0QkJveChhdHRyaWJ1dGVzLmltYWdpbmdCQm94KTsKICAgIHRoaXMubG9uZyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubG9uZyk7CiAgICB0aGlzLm9yaWVudGF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3JpZW50YXRpb24sIFsicG9ydHJhaXQiLCAibGFuZHNjYXBlIl0pOwogICAgdGhpcy5zaG9ydCA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuc2hvcnQpOwogICAgdGhpcy5zdG9jayA9IGF0dHJpYnV0ZXMuc3RvY2sgfHwgIiI7CiAgICB0aGlzLnRyYXlJbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRyYXlJbiwgWyJhdXRvIiwgImRlbGVnYXRlIiwgInBhZ2VGcm9udCJdKTsKICAgIHRoaXMudHJheU91dCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnRyYXlPdXQsIFsiYXV0byIsICJkZWxlZ2F0ZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE1lc3NhZ2UgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWVzc2FnZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy50ZXh0ID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgfQp9CmNsYXNzIE51bWVyaWNFZGl0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm51bWVyaWNFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgY29uc3QgZmllbGQgPSB0aGlzWyRnZXRQYXJlbnRdKClbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJpbnB1dCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgZGF0YUlkOiBmaWVsZFskZGF0YV0/LlskdWlkXSB8fCBmaWVsZFskdWlkXSwKICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICBzdHlsZSwKICAgICAgICAiYXJpYS1sYWJlbCI6IGFyaWFMYWJlbChmaWVsZCksCiAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICB9CiAgICB9OwogICAgaWYgKGlzUmVxdWlyZWQoZmllbGQpKSB7CiAgICAgIGh0bWwuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdID0gdHJ1ZTsKICAgICAgaHRtbC5hdHRyaWJ1dGVzLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW2h0bWxdCiAgICB9KTsKICB9Cn0KY2xhc3MgT2NjdXIgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAib2NjdXIiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbml0aWFsID0gYXR0cmlidXRlcy5pbml0aWFsICE9PSAiIiA/IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmluaXRpYWwsCiAgICAgIGRlZmF1bHRWYWx1ZTogIiIsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pIDogIiI7CiAgICB0aGlzLm1heCA9IGF0dHJpYnV0ZXMubWF4ICE9PSAiIiA/IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm1heCwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KSA6ICIiOwogICAgdGhpcy5taW4gPSBhdHRyaWJ1dGVzLm1pbiAhPT0gIiIgPyBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5taW4sCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSkgOiAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskY2xlYW5dKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgY29uc3Qgb3JpZ2luYWxNaW4gPSB0aGlzLm1pbjsKICAgIGlmICh0aGlzLm1pbiA9PT0gIiIpIHsKICAgICAgdGhpcy5taW4gPSBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlQXJlYSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBQYWdlU2V0ID8gMCA6IDE7CiAgICB9CiAgICBpZiAodGhpcy5tYXggPT09ICIiKSB7CiAgICAgIGlmIChvcmlnaW5hbE1pbiA9PT0gIiIpIHsKICAgICAgICB0aGlzLm1heCA9IHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VBcmVhIHx8IHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VTZXQgPyAtMSA6IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1pbjsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMubWF4ICE9PSAtMSAmJiB0aGlzLm1heCA8IHRoaXMubWluKSB7CiAgICAgIHRoaXMubWF4ID0gdGhpcy5taW47CiAgICB9CiAgICBpZiAodGhpcy5pbml0aWFsID09PSAiIikgewogICAgICB0aGlzLmluaXRpYWwgPSBwYXJlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZSA/IDEgOiB0aGlzLm1pbjsKICAgIH0KICB9Cn0KY2xhc3MgT2lkIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm9pZCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBPaWRzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm9pZHMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLm9pZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBPdmVyZmxvdyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvdmVyZmxvdyIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmxlYWRlciA9IGF0dHJpYnV0ZXMubGVhZGVyIHx8ICIiOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudHJhaWxlciA9IGF0dHJpYnV0ZXMudHJhaWxlciB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskZ2V0RXh0cmFdKCkgewogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgICBjb25zdCByb290ID0gdGh
20pc1skZ2V0VGVtcGxhdGVSb290XSgpOwogICAgICBjb25zdCB0YXJnZXQgPSByb290WyRzZWFyY2hOb2RlXSh0aGlzLnRhcmdldCwgcGFyZW50KTsKICAgICAgY29uc3QgbGVhZGVyID0gcm9vdFskc2VhcmNoTm9kZV0odGhpcy5sZWFkZXIsIHBhcmVudCk7CiAgICAgIGNvbnN0IHRyYWlsZXIgPSByb290WyRzZWFyY2hOb2RlXSh0aGlzLnRyYWlsZXIsIHBhcmVudCk7CiAgICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgICB0YXJnZXQ6IHRhcmdldD8uWzBdIHx8IG51bGwsCiAgICAgICAgbGVhZGVyOiBsZWFkZXI/LlswXSB8fCBudWxsLAogICAgICAgIHRyYWlsZXI6IHRyYWlsZXI/LlswXSB8fCBudWxsLAogICAgICAgIGFkZExlYWRlcjogZmFsc2UsCiAgICAgICAgYWRkVHJhaWxlcjogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQp9CmNsYXNzIFBhZ2VBcmVhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhZ2VBcmVhIiwgdHJ1ZSk7CiAgICB0aGlzLmJsYW5rT3JOb3RCbGFuayA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmJsYW5rT3JOb3RCbGFuaywgWyJhbnkiLCAiYmxhbmsiLCAibm90QmxhbmsiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW5pdGlhbE51bWJlciA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmluaXRpYWxOdW1iZXIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLm51bWJlcmVkID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubnVtYmVyZWQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLm9kZE9yRXZlbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9kZE9yRXZlbiwgWyJhbnkiLCAiZXZlbiIsICJvZGQiXSk7CiAgICB0aGlzLnBhZ2VQb3NpdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnBhZ2VQb3NpdGlvbiwgWyJhbnkiLCAiZmlyc3QiLCAibGFzdCIsICJvbmx5IiwgInJlc3QiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWVkaXVtID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5hcmVhID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmNvbnRlbnRBcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRyYXcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhjbEdyb3VwID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpZWxkID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc1VzYWJsZV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDAKICAgICAgfTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gIXRoaXMub2NjdXIgfHwgdGhpcy5vY2N1ci5tYXggPT09IC0xIHx8IHRoaXNbJGV4dHJhXS5udW1iZXJPZlVzZSA8IHRoaXMub2NjdXIubWF4OwogIH0KICBbJGNsZWFuUGFnZV0oKSB7CiAgICBkZWxldGUgdGhpc1skZXh0cmFdOwogIH0KICBbJGdldE5leHRQYWdlXSgpIHsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgICBudW1iZXJPZlVzZTogMAogICAgICB9OwogICAgfQogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgaWYgKHBhcmVudC5yZWxhdGlvbiA9PT0gIm9yZGVyZWRPY2N1cnJlbmNlIikgewogICAgICBpZiAodGhpc1skaXNVc2FibGVdKCkpIHsKICAgICAgICB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgKz0gMTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhcmVudFskZ2V0TmV4dFBhZ2VdKCk7CiAgfQogIFskZ2V0QXZhaWxhYmxlU3BhY2VdKCkgewogICAgcmV0dXJuIHRoaXNbJGV4dHJhXS5zcGFjZSB8fCB7CiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAKICAgIH07CiAgfQogIFskdG9IVE1MXSgpIHsKICAgIGlmICghdGhpc1skZXh0cmFdKSB7CiAgICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgICBudW1iZXJPZlVzZTogMQogICAgICB9OwogICAgfQogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXS5jaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMubWVkaXVtICYmIHRoaXMubWVkaXVtLnNob3J0ICYmIHRoaXMubWVkaXVtLmxvbmcpIHsKICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5tZWRpdW0uc2hvcnQpOwogICAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5tZWRpdW0ubG9uZyk7CiAgICAgIHRoaXNbJGV4dHJhXS5zcGFjZSA9IHsKICAgICAgICB3aWR0aDogdGhpcy5tZWRpdW0uc2hvcnQsCiAgICAgICAgaGVpZ2h0OiB0aGlzLm1lZGl1bS5sb25nCiAgICAgIH07CiAgICAgIGlmICh0aGlzLm1lZGl1bS5vcmllbnRhdGlvbiA9PT0gImxhbmRzY2FwZSIpIHsKICAgICAgICBjb25zdCB4ID0gc3R5bGUud2lkdGg7CiAgICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQ7CiAgICAgICAgc3R5bGUuaGVpZ2h0ID0geDsKICAgICAgICB0aGlzWyRleHRyYV0uc3BhY2UgPSB7CiAgICAgICAgICB3aWR0aDogdGhpcy5tZWRpdW0ubG9uZywKICAgICAgICAgIGhlaWdodDogdGhpcy5tZWRpdW0uc2hvcnQKICAgICAgICB9OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJYRkEgLSBObyBtZWRpdW0gc3BlY2lmaWVkIGluIHBhZ2VBcmVhOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTsKICAgIH0KICAgIHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgIGZpbHRlcjogbmV3IFNldChbImFyZWEiLCAiZHJhdyIsICJmaWVsZCIsICJzdWJmb3JtIl0pLAogICAgICBpbmNsdWRlOiB0cnVlCiAgICB9KTsKICAgIHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgIGZpbHRlcjogbmV3IFNldChbImNvbnRlbnRBcmVhIl0pLAogICAgICBpbmNsdWRlOiB0cnVlCiAgICB9KTsKICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgY2hpbGRyZW4sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFQYWdlIl0sCiAgICAgICAgaWQ6IHRoaXNbJHVpZF0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgeGZhTmFtZTogdGhpcy5uYW1lCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBQYWdlU2V0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhZ2VTZXQiLCB0cnVlKTsKICAgIHRoaXMuZHVwbGV4SW1wb3NpdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmR1cGxleEltcG9zaXRpb24sIFsibG9uZ0VkZ2UiLCAic2hvcnRFZGdlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGF0aW9uID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucmVsYXRpb24sIFsib3JkZXJlZE9jY3VycmVuY2UiLCAiZHVwbGV4UGFnaW5hdGVkIiwgInNpbXBsZXhQYWdpbmF0ZWQiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5vY2N1ciA9IG51bGw7CiAgICB0aGlzLnBhZ2VBcmVhID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLnBhZ2VTZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRjbGVhblBhZ2VdKCkgewogICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZUFyZWEuY2hpbGRyZW4pIHsKICAgICAgcGFnZVskY2xlYW5QYWdlXSgpOwogICAgfQogICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZVNldC5jaGlsZHJlbikgewogICAgICBwYWdlWyRjbGVhblBhZ2VdKCk7CiAgICB9CiAgfQogIFskaXNVc2FibGVdKCkgewogICAgcmV0dXJuICF0aGlzLm9jY3VyIHx8IHRoaXMub2NjdXIubWF4ID09PSAtMSB8fCB0aGlzWyRleHRyYV0ubnVtYmVyT2ZVc2UgPCB0aGlzLm9jY3VyLm1heDsKICB9CiAgWyRnZXROZXh0UGFnZV0oKSB7CiAgICBpZiAoIXRoaXNbJGV4dHJhXSkgewogICAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDEsCiAgICAgICAgcGFnZUluZGV4OiAtMSwKICAgICAgICBwYWdlU2V0SW5kZXg6IC0xCiAgICAgIH07CiAgICB9CiAgICBpZiAodGhpcy5yZWxhdGlvbiA9PT0gIm9yZGVyZWRPY2N1cnJlbmNlIikgewogICAgICBpZiAodGhpc1skZXh0cmFdLnBhZ2VJbmRleCArIDEgPCB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHRoaXNbJGV4dHJhXS5wYWdlSW5kZXggKz0gMTsKICAgICAgICBjb25zdCBwYWdlQXJlYSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW5bdGhpc1skZXh0cmFdLnBhZ2VJbmRleF07CiAgICAgICAgcmV0dXJuIHBhZ2VBcmVhWyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1skZXh0cmFdLnBhZ2VTZXRJbmRleCArIDEgPCB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLnBhZ2VTZXRJbmRleCArPSAxOwogICAgICAgIHJldHVybiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW5bdGhpc1skZXh0cmFdLnBhZ2VTZXRJbmRleF1bJGdldE5leHRQYWdlXSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzWyRpc1VzYWJsZV0oKSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5udW1iZXJPZlVzZSArPSAxOwogICAgICAgIHRoaXNbJGV4dHJhXS5wYWdlSW5kZXggPSAtMTsKICAgICAgICB0aGlzWyRleHRyYV0ucGFnZVNldEluZGV4ID0gLTE7CiAgICAgICAgcmV0dXJuIHRoaXNbJGdldE5leHRQYWdlXSgpOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VTZXQpIHsKICAgICAgICByZXR1cm4gcGFyZW50WyRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICB0aGlzWyRjbGVhblBhZ2VdKCk7CiAgICAgIHJldHVybiB0aGlzWyRnZXROZXh0UGFnZV0oKTsKICAgIH0KICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5wYWdlTnVtYmVyOwogICAgY29uc3QgcGFyaXR5ID0gcGFnZU51bWJlciAlIDIgPT09IDAgPyAiZXZlbiIgOiAib2RkIjsKICAgIGNvbnN0IHBvc2l0aW9uID0gcGFnZU51bWJlciA9PT0gMCA/ICJmaXJzdCIgOiAicmVzdCI7CiAgICBsZXQgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSBwYXJpdHkgJiYgcC5wYWdlUG9zaXRpb24gPT09IHBvc2l0aW9uKTsKICAgIGlmIChwYWdlKSB7CiAgICAgIHJldHVybiBwYWdlOwogICAgfQogICAgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSAiYW55IiAmJiBwLnBhZ2VQb3NpdGlvbiA9PT0gcG9zaXRpb24pOwogICAgaWYgKHBhZ2UpIHsKICAgICAgcmV0dXJuIHBhZ2U7CiAgICB9CiAgICBwYWdlID0gdGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5maW5kKHAgPT4gcC5vZGRPckV2ZW4gPT09ICJhbnkiICYmIHAucGFnZVBvc2l0aW9uID09PSAiYW55Iik7CiAgICBpZiAocGFnZSkgewogICAgICByZXR1cm4gcGFnZTsKICAgIH0KICAgIHJldHVybiB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuWzBdOwogIH0KfQpjbGFzcyBQYXJhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhcmEiLCB0cnVlKTsKICAgIHRoaXMuaEFsaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5saW5lSGVpZ2h0ID0gYXR0cmlidXRlcy5saW5lSGVpZ2h0ID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5saW5lSGVpZ2h0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMubWFyZ2luTGVmdCA9IGF0dHJpYnV0ZXMubWFyZ2luTGVmdCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWFyZ2luTGVmdCwgIjBwdCIpIDogIiI7CiAgICB0aGlzLm1hcmdpblJpZ2h0ID0gYXR0cmlidXRlcy5tYXJnaW5SaWdodCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWFyZ2luUmlnaHQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5vcnBoYW5zID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMub3JwaGFucywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5wcmVzZXJ2ZSA9IGF0dHJpYnV0ZXMucHJlc2VydmUgfHwgIiI7CiAgICB0aGlzLnJhZGl4T2Zmc2V0ID0gYXR0cmlidXRlcy5yYWRpeE9mZnNldCA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMucmFkaXhPZmZzZXQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5zcGFjZUFib3ZlID0gYXR0cmlidXRlcy5zcGFjZUFib3ZlID8gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5zcGFjZUFib3ZlLCAiMHB0IikgOiAiIjsKICAgIHRoaXMuc3BhY2VCZWxvdyA9IGF0dHJpYnV0ZXMuc3BhY2VCZWxvdyA/IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMuc3BhY2VCZWxvdywgIjBwdCIpIDogIiI7CiAgICB0aGlzLnRhYkRlZmF1bHQgPSBhdHRyaWJ1dGVzLnRhYkRlZmF1bHQgPyBnZXRNZWFzdXJlbWVudCh0aGlzLnRhYkRlZmF1bHQpIDogIiI7CiAgICB0aGlzLnRhYlN0b3BzID0gKGF0dHJpYnV0ZXMudGFiU3RvcHMgfHwgIiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKCh4LCBpKSA9PiBpICUgMiA9PT0gMSA/IGdldE1lYXN1cmVtZW50KHgpIDogeCk7CiAgICB0aGlzLnRleHRJbmRlbnQgPSBhdHRyaWJ1dGVzLnRleHRJbmRlbnQgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLnRleHRJbmRlbnQsICIwcHQiKSA6ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudkFsaWduID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudkFsaWduLCBbInRvcCIsICJib3R0b20iLCAibWlkZGxlIl0pOwogICAgdGhpcy53aWRvd3MgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy53aWRvd3MsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMuaHlwaGVuYXRpb24gPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJoQWxpZ24iKTsKICAgIGlmICh0aGlzLm1hcmdpbkxlZnQgIT09ICIiKSB7CiAgICAgI
20HN0eWxlLnBhZGRpbmdMZWZ0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWFyZ2luTGVmdCk7CiAgICB9CiAgICBpZiAodGhpcy5tYXJnaW5SaWdodCAhPT0gIiIpIHsKICAgICAgc3R5bGUucGFkZGluZ1JpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKHRoaXMubWFyZ2luUmlnaHQpOwogICAgfQogICAgaWYgKHRoaXMuc3BhY2VBYm92ZSAhPT0gIiIpIHsKICAgICAgc3R5bGUucGFkZGluZ1RvcCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnNwYWNlQWJvdmUpOwogICAgfQogICAgaWYgKHRoaXMuc3BhY2VCZWxvdyAhPT0gIiIpIHsKICAgICAgc3R5bGUucGFkZGluZ0JvdHRvbSA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnNwYWNlQmVsb3cpOwogICAgfQogICAgaWYgKHRoaXMudGV4dEluZGVudCAhPT0gIiIpIHsKICAgICAgc3R5bGUudGV4dEluZGVudCA9IG1lYXN1cmVUb1N0cmluZyh0aGlzLnRleHRJbmRlbnQpOwogICAgICBmaXhUZXh0SW5kZW50KHN0eWxlKTsKICAgIH0KICAgIGlmICh0aGlzLmxpbmVIZWlnaHQgPiAwKSB7CiAgICAgIHN0eWxlLmxpbmVIZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy5saW5lSGVpZ2h0KTsKICAgIH0KICAgIGlmICh0aGlzLnRhYkRlZmF1bHQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnRhYlNpemUgPSBtZWFzdXJlVG9TdHJpbmcodGhpcy50YWJEZWZhdWx0KTsKICAgIH0KICAgIGlmICh0aGlzLnRhYlN0b3BzLmxlbmd0aCA+IDApIHt9CiAgICBpZiAodGhpcy5oeXBoZW5hdGF0aW9uKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuaHlwaGVuYXRhdGlvblskdG9TdHlsZV0oKSk7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIFBhc3N3b3JkRWRpdCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYXNzd29yZEVkaXQiLCB0cnVlKTsKICAgIHRoaXMuaFNjcm9sbFBvbGljeSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhTY3JvbGxQb2xpY3ksIFsiYXV0byIsICJvZmYiLCAib24iXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucGFzc3dvcmRDaGFyID0gYXR0cmlidXRlcy5wYXNzd29yZENoYXIgfHwgIioiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9Cn0KY2xhc3MgdGVtcGxhdGVfUGF0dGVybiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwYXR0ZXJuIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnR5cGUsIFsiY3Jvc3NIYXRjaCIsICJjcm9zc0RpYWdvbmFsIiwgImRpYWdvbmFsTGVmdCIsICJkaWFnb25hbFJpZ2h0IiwgImhvcml6b250YWwiLCAidmVydGljYWwiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFskdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgc3RhcnRDb2xvciA9IHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yWyR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogICAgY29uc3QgZW5kQ29sb3IgPSB0aGlzLmNvbG9yID8gdGhpcy5jb2xvclskdG9TdHlsZV0oKSA6ICIjMDAwMDAwIjsKICAgIGNvbnN0IHdpZHRoID0gNTsKICAgIGNvbnN0IGNtZCA9ICJyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50IjsKICAgIGNvbnN0IGNvbG9ycyA9IGAke3N0YXJ0Q29sb3J9LCR7c3RhcnRDb2xvcn0gJHt3aWR0aH1weCwke2VuZENvbG9yfSAke3dpZHRofXB4LCR7ZW5kQ29sb3J9ICR7MiAqIHdpZHRofXB4YDsKICAgIHN3aXRjaCAodGhpcy50eXBlKSB7CiAgICAgIGNhc2UgImNyb3NzSGF0Y2giOgogICAgICAgIHJldHVybiBgJHtjbWR9KHRvIHRvcCwke2NvbG9yc30pICR7Y21kfSh0byByaWdodCwke2NvbG9yc30pYDsKICAgICAgY2FzZSAiY3Jvc3NEaWFnb25hbCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0oNDVkZWcsJHtjb2xvcnN9KSAke2NtZH0oLTQ1ZGVnLCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJkaWFnb25hbExlZnQiOgogICAgICAgIHJldHVybiBgJHtjbWR9KDQ1ZGVnLCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJkaWFnb25hbFJpZ2h0IjoKICAgICAgICByZXR1cm4gYCR7Y21kfSgtNDVkZWcsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgImhvcml6b250YWwiOgogICAgICAgIHJldHVybiBgJHtjbWR9KHRvIHRvcCwke2NvbG9yc30pYDsKICAgICAgY2FzZSAidmVydGljYWwiOgogICAgICAgIHJldHVybiBgJHtjbWR9KHRvIHJpZ2h0LCR7Y29sb3JzfSlgOwogICAgfQogICAgcmV0dXJuICIiOwogIH0KfQpjbGFzcyBQaWN0dXJlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBpY3R1cmUiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgUHJvdG8gZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicHJvdG8iLCB0cnVlKTsKICAgIHRoaXMuYXBwZWFyYW5jZUZpbHRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5hcmMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYXJlYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5hc3Npc3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYmFyY29kZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5iaW5kSXRlbXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYm9va2VuZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ib29sZWFuID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmJvcmRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVhayA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVha0FmdGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQmVmb3JlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJ1dHRvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jYWxjdWxhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2FwdGlvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2hlY2tCdXR0b24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY2hvaWNlTGlzdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb2xvciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb21iID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbm5lY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29udGVudEFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29ybmVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZVRpbWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZVRpbWVFZGl0ID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVmYXVsdFVpID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlc2MgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGlnZXN0TWV0aG9kID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZHMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lZGdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY29kaW5nID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY29kaW5ncyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHREYXRhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHRpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ldmVudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leERhdGEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhPYmplY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhjbEdyb3VwID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4ZWN1dGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXh0cmFzID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmZpZWxkID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpbGwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmlsdGVyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZvbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZm9ybWF0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmhhbmRsZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaHlwaGVuYXRpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW1hZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW1hZ2VFZGl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaXNzdWVycyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pdGVtcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5rZWVwID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmtleVVzYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmxpbmUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubGluZWFyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmxvY2tEb2N1bWVudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tYW5pZmVzdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tYXJnaW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWRwID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLm1lZGl1bSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tZXNzYWdlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm51bWVyaWNFZGl0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm9jY3VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm9pZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5vaWRzID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm92ZXJmbG93ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhZ2VBcmVhID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhZ2VTZXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGFyYSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYXNzd29yZEVkaXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGF0dGVybiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5waWN0dXJlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJhZGlhbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yZWFzb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVhc29ucyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yZWN0YW5nbGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmVmID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNjcmlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zaWduRGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zaWduYXR1cmUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2lnbmluZyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zb2xpZCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zcGVhayA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdGlwcGxlID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybVNldCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJqZWN0RE4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViamVjdEROcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJtaXQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0RWRpdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWVTdGFtcCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50b29sVGlwID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmF2ZXJzZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy51aSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy52YWxpZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy52YWx1ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy52YXJpYWJsZXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgUmFkaWFsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJhZGlhbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbInRvRWRnZSIsICJ0b0NlbnRlciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXShzdGFydENvbG9yKSB7CiAgICBzdGFydENvbG9yID0gc3RhcnRDb2xvciA/IHN0YXJ0Q29sb3JbJHRvU3R5bGVdKCkgOiAiI0ZGRkZGRiI7CiAgICBjb25zdCBlbmRDb2xvciA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yWyR0b1N0eWxlXSgpIDogIiMwMDAwMDAiOwogICAgY29uc3QgY29sb3JzID0gdGhpcy50eXBlID09PSAidG9FZGdlIiA/IGAke3N0YXJ0Q29sb3J9LCR7ZW5kQ29sb3J9YCA6IGAke2VuZENvbG9yfSwke3N0YXJ0Q29sb3J9YDsKICAgIHJldHVybiBgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCBjZW50ZXIsICR7Y29sb3JzfSlgOwogIH0KfQpjbGFzcyBSZWFzb24gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicmVhc29uIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFJlYXNvbnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicmVhc29ucyIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMucmVhc29uID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgfQp9CmNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyZWN0YW5nbGUiLCB0cnVlKTsKICAgIHRoaXMuaGFuZCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb3JuZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgICB0aGlzLmVkZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNCk7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlLmNoaWxkcmVuLmxlbmd0aCA/IHRoaXMuZWRnZS5jaGlsZHJlblswXSA6IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAodGhpcy5maWxsPy5wcmVzZW5jZSA9PT0gInZpc2libGUiKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMuZmlsbFskdG9TdHlsZV0oKSk7CiAgICB9IGVsc2UgewogICAgICBzdHlsZS5maWxsID0gInRyYW5zcGFyZW50IjsKICAgIH0KICAgIHN0eWxlLnN0cm9rZVdpZHRoID0gbWVhc3VyZVRvU3RyaW5nKGVkZ2UucHJlc2VuY2UgPT09ICJ2aXNpYmxlIiA/IGVkZ2UudGhpY2tuZXNzIDogMCk7CiAgICBzdHlsZS5zdHJva2UgPSBlZGdlU3R5bGUuY29sb3I7CiAgICBjb25zdCBjb3JuZXIgPSB0aGlzLmNvcm5lci5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmNvcm5lci5jaGlsZHJlblswXSA6IG5ldyBDb3JuZXIoe30pOwogICAgY29uc3QgY29ybmVyU3R5bGUgPSBjb3JuZXJbJHRvU3R5bGVdKCk7CiAgICBjb25zdCByZWN0ID0gewogICAgICBuYW1lOiAicmVjdCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgaGVpZ2h0OiAiMTAwJSIsCiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHJ4OiBjb3JuZXJTdHlsZS5yYWRpdXMsCiAgICAgICAgcnk6IGNvcm5lclN0eWxlLnJhZGl1cywKICAgICAgICBzdHlsZQogICAgICB9CiAgICB9OwogICAgY29uc3Qgc3ZnID0gewogICAgICBuYW1lOiAic3ZnIiwKICAgICAgY2hpbGRyZW46IFtyZWN0XSwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIG92ZXJmbG93OiAidmlzaWJsZSIKICAgICAgICB9LAogICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKVskZ2V0UGFyZW50XSgpOwogICAgaWYgKGhhc01hcmdpbihwYXJlbnQpKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgIGRpc3BsYXk6ICJpbmxpbmUiLAogICAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgICBoZWlnaHQ6ICIxMDAlIgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgY2hpbGRyZW46IFtzdmddCiAgICAgIH0pOwogICAgfQogICAgc3ZnLmF0dHJpYnV0ZXMuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgcmV0dXJuIEhUTUxSZXN1bHQuc3VjY2VzcyhzdmcpOwogIH0KfQpjbGFzcyBSZWZFbGVtZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlZiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTY3JpcHQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic2NyaXB0Iik7CiAgICB0aGlzLmJpbmRpbmcgPSBhdHRyaWJ1dGVzLmJpbmRpbmcgfHwgIiI7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5ydW5BdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnJ1bkF0LCBbImNsaWVudCIsICJib3RoIiwgInNlcnZlciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNldFByb3BlcnR5IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNldFByb3BlcnR5Iik7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICB9Cn0KY2xhc3MgU2lnbkRhdGEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic2lnbkRhdGEiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5vcGVyYXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5vcGVyYXRpb24sIFsic2lnbiIsICJjbGVhciIsICJ2ZXJpZnkiXSk7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmZpbHRlciA9IG51bGw7CiAgICB0aGlzLm1hbmlmZXN0ID0gbnVsbDsKICB9Cn0KY2xhc3MgU2lnbmF0dXJlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNpZ25hdHVyZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIlBERjEuMyIsICJQREYxLjYiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWx0ZXIgPSBudWxsOwogICAgdGhpcy5tYW5pZmVzdCA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQp9CmNsYXNzIFNpZ25pbmcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic2lnbmluZyIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgU29saWQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic29saWQiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgWyR0b1N0eWxlXShzdGFydENvbG9yKSB7CiAgICByZXR1cm4gc3RhcnRDb2xvciA/IHN0YXJ0Q29sb3JbJHRvU3R5bGVdKCkgOiAiI0ZGRkZGRiI7CiAgfQp9CmNsYXNzIFNwZWFrIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNwZWFrIik7CiAgICB0aGlzLmRpc2FibGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5kaXNhYmxlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgI
20HZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByaW9yaXR5ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucHJpb3JpdHksIFsiY3VzdG9tIiwgImNhcHRpb24iLCAibmFtZSIsICJ0b29sVGlwIl0pOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFN0aXBwbGUgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3RpcHBsZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJhdGUgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5yYXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDUwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAgJiYgeCA8PSAxMDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbJHRvU3R5bGVdKGJnQ29sb3IpIHsKICAgIGNvbnN0IGFscGhhID0gdGhpcy5yYXRlIC8gMTAwOwogICAgcmV0dXJuIFV0aWwubWFrZUhleENvbG9yKE1hdGgucm91bmQoYmdDb2xvci52YWx1ZS5yICogKDEgLSBhbHBoYSkgKyB0aGlzLnZhbHVlLnIgKiBhbHBoYSksIE1hdGgucm91bmQoYmdDb2xvci52YWx1ZS5nICogKDEgLSBhbHBoYSkgKyB0aGlzLnZhbHVlLmcgKiBhbHBoYSksIE1hdGgucm91bmQoYmdDb2xvci52YWx1ZS5iICogKDEgLSBhbHBoYSkgKyB0aGlzLnZhbHVlLmIgKiBhbHBoYSkpOwogIH0KfQpjbGFzcyBTdWJmb3JtIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN1YmZvcm0iLCB0cnVlKTsKICAgIHRoaXMuYWNjZXNzID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuYWNjZXNzLCBbIm9wZW4iLCAibm9uSW50ZXJhY3RpdmUiLCAicHJvdGVjdGVkIiwgInJlYWRPbmx5Il0pOwogICAgdGhpcy5hbGxvd01hY3JvID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuYWxsb3dNYWNybywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuYW5jaG9yVHlwZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmFuY2hvclR5cGUsIFsidG9wTGVmdCIsICJib3R0b21DZW50ZXIiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJtaWRkbGVDZW50ZXIiLCAibWlkZGxlTGVmdCIsICJtaWRkbGVSaWdodCIsICJ0b3BDZW50ZXIiLCAidG9wUmlnaHQiXSk7CiAgICB0aGlzLmNvbFNwYW4gPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jb2xTcGFuLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSB8fCBuID09PSAtMQogICAgfSk7CiAgICB0aGlzLmNvbHVtbldpZHRocyA9IChhdHRyaWJ1dGVzLmNvbHVtbldpZHRocyB8fCAiIikudHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoeCA9PiB4ID09PSAiLTEiID8gLTEgOiBnZXRNZWFzdXJlbWVudCh4KSk7CiAgICB0aGlzLmggPSBhdHRyaWJ1dGVzLmggPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLmgpIDogIiI7CiAgICB0aGlzLmhBbGlnbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGF5b3V0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubGF5b3V0LCBbInBvc2l0aW9uIiwgImxyLXRiIiwgInJsLXJvdyIsICJybC10YiIsICJyb3ciLCAidGFibGUiLCAidGIiXSk7CiAgICB0aGlzLmxvY2FsZSA9IGF0dHJpYnV0ZXMubG9jYWxlIHx8ICIiOwogICAgdGhpcy5tYXhIID0gZ2V0TWVhc3VyZW1lbnQoYXR0cmlidXRlcy5tYXhILCAiMHB0Iik7CiAgICB0aGlzLm1heFcgPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1heFcsICIwcHQiKTsKICAgIHRoaXMubWVyZ2VNb2RlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubWVyZ2VNb2RlLCBbImNvbnN1bWVEYXRhIiwgIm1hdGNoVGVtcGxhdGUiXSk7CiAgICB0aGlzLm1pbkggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLm1pbkgsICIwcHQiKTsKICAgIHRoaXMubWluVyA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMubWluVywgIjBwdCIpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5wcmVzZW5jZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmVsZXZhbnQgPSBnZXRSZWxldmFudChhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMucmVzdG9yZVN0YXRlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMucmVzdG9yZVN0YXRlLCBbIm1hbnVhbCIsICJhdXRvIl0pOwogICAgdGhpcy5zY29wZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLnNjb3BlLCBbIm5hbWUiLCAibm9uZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBhdHRyaWJ1dGVzLncgPyBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLncpIDogIiI7CiAgICB0aGlzLnggPSBnZXRNZWFzdXJlbWVudChhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9IGdldE1lYXN1cmVtZW50KGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5hc3Npc3QgPSBudWxsOwogICAgdGhpcy5iaW5kID0gbnVsbDsKICAgIHRoaXMuYm9va2VuZCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmJyZWFrID0gbnVsbDsKICAgIHRoaXMuY2FsY3VsYXRlID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmtlZXAgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogICAgdGhpcy5vY2N1ciA9IG51bGw7CiAgICB0aGlzLm92ZXJmbG93ID0gbnVsbDsKICAgIHRoaXMucGFnZVNldCA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzYWwgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLnZhcmlhYmxlcyA9IG51bGw7CiAgICB0aGlzLmFyZWEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtBZnRlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVha0JlZm9yZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmRyYXcgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXZlbnQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhPYmplY3QgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhjbEdyb3VwID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpZWxkID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnByb3RvID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmZvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybVNldCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJGdldFN1YmZvcm1QYXJlbnRdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1skZ2V0UGFyZW50XSgpOwogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFN1YmZvcm1TZXQpIHsKICAgICAgcmV0dXJuIHBhcmVudFskZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIH0KICAgIHJldHVybiBwYXJlbnQ7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRpc1RoZXJlTW9yZVdpZHRoXSgpIHsKICAgIHJldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikgJiYgdGhpc1skZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1skZXh0cmFdLm51bWJlckluTGluZSA+IDAgfHwgdGhpc1skZ2V0UGFyZW50XSgpWyRpc1RoZXJlTW9yZVdpZHRoXSgpOwogIH0KICAqWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSB7CiAgICB5aWVsZCogZ2V0Q29udGFpbmVkQ2hpbGRyZW4odGhpcyk7CiAgfQogIFskZmx1c2hIVE1MXSgpIHsKICAgIHJldHVybiBmbHVzaEhUTUwodGhpcyk7CiAgfQogIFskYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgYWRkSFRNTCh0aGlzLCBodG1sLCBiYm94KTsKICB9CiAgWyRnZXRBdmFpbGFibGVTcGFjZV0oKSB7CiAgICByZXR1cm4gZ2V0QXZhaWxhYmxlU3BhY2UodGhpcyk7CiAgfQogIFskaXNTcGxpdHRhYmxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudFskaXNTcGxpdHRhYmxlXSgpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiB0aGlzWyRleHRyYV0uX2lzU3BsaXR0YWJsZTsKICAgIH0KICAgIGlmICh0aGlzLmxheW91dCA9PT0gInBvc2l0aW9uIiB8fCB0aGlzLmxheW91dC5pbmNsdWRlcygicm93IikpIHsKICAgICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXMua2VlcCAmJiB0aGlzLmtlZXAuaW50YWN0ICE9PSAibm9uZSIpIHsKICAgICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHBhcmVudC5sYXlvdXQ/LmVuZHNXaXRoKCItdGIiKSAmJiBwYXJlbnRbJGV4dHJhXS5udW1iZXJJbkxpbmUgIT09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpc1skZXh0cmFdLl9pc1NwbGl0dGFibGUgPSB0cnVlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgc2V0VGFiSW5kZXgodGhpcyk7CiAgICBpZiAodGhpcy5icmVhaykgewogICAgICBpZiAodGhpcy5icmVhay5hZnRlciAhPT0gImF1dG8iIHx8IHRoaXMuYnJlYWsuYWZ0ZXJUYXJnZXQgIT09ICIiKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBCcmVha0FmdGVyKHsKICAgICAgICAgIHRhcmdldFR5cGU6IHRoaXMuYnJlYWsuYWZ0ZXIsCiAgICAgICAgICB0YXJnZXQ6IHRoaXMuYnJlYWsuYWZ0ZXJUYXJnZXQsCiAgICAgICAgICBzdGFydE5ldzogdGhpcy5icmVhay5zdGFydE5ldy50b1N0cmluZygpCiAgICAgICAgfSk7CiAgICAgICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgICAgdGhpcy5icmVha0FmdGVyLnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYnJlYWsuYmVmb3JlICE9PSAiYXV0byIgfHwgdGhpcy5icmVhay5iZWZvcmVUYXJnZXQgIT09ICIiKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBCcmVha0JlZm9yZSh7CiAgICAgICAgICB0YXJnZXRUeXBlOiB0aGlzLmJyZWFrLmJlZm9yZSwKICAgICAgICAgIHRhcmdldDogdGhpcy5icmVhay5iZWZvcmVUYXJnZXQsCiAgICAgICAgICBzdGFydE5ldzogdGhpcy5icmVhay5zdGFydE5ldy50b1N0cmluZygpCiAgICAgICAgfSk7CiAgICAgICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzWyRnbG9iYWxEYXRhXTsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgICAgdGhpcy5icmVha0JlZm9yZS5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmJyZWFrLm92ZXJmbG93VGFyZ2V0ICE9PSAiIikgewogICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgT3ZlcmZsb3coewogICAgICAgICAgdGFyZ2V0OiB0aGlzLmJyZWFrLm92ZXJmbG93VGFyZ2V0LAogICAgICAgICAgbGVhZGVyOiB0aGlzLmJyZWFrLm92ZXJmbG93TGVhZGVyLAogICAgICAgICAgdHJhaWxlcjogdGhpcy5icmVhay5vdmVyZmxvd1RyYWlsZXIKICAgICAgICB9KTsKICAgICAgICBub2RlWyRnbG9iYWxEYXRhXSA9IHRoaXNbJGdsb2JhbERhdGFdOwogICAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgICB0aGlzLm92ZXJmbG93LnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgdGhpc1skcmVtb3ZlQ2hpbGRdKHRoaXMuYnJlYWspOwogICAgICB0aGlzLmJyZWFrID0gbnVsbDsKICAgIH0KICAgIGlmICh0aGlzLnByZXNlbmNlID09PSAiaGlkZGVuIiB8fCB0aGlzLnByZXNlbmNlID09PSAiaW5hY3RpdmUiKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgaWYgKHRoaXMuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID4gMSB8fCB0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoID4gMSkgewogICAgICB3YXJuKCJYRkEgLSBTZXZlcmFsIGJyZWFrQmVmb3JlIG9yIGJyZWFrQWZ0ZXIgaW4gc3ViZm9ybXM6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgfQogICAgaWYgKHRoaXMuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgY29uc3QgYnJlYWtCZWZvcmUgPSB0aGlzLmJyZWFrQmVmb3JlLmNoaWxkcmVuWzBdOwogICAgICBpZiAoaGFuZGxlQnJlYWsoYnJlYWtCZWZvcmUpKSB7CiAgICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuYnJlYWtOb2RlKGJyZWFrQmVmb3JlKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXNbJGV4dHJhXT8uYWZ0ZXJCcmVha0FmdGVyKSB7CiAgICAgI
20HJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgZml4RGltZW5zaW9ucyh0aGlzKTsKICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBpZDogdGhpc1skdWlkXSwKICAgICAgY2xhc3M6IFtdCiAgICB9OwogICAgc2V0QWNjZXNzKHRoaXMsIGF0dHJpYnV0ZXMuY2xhc3MpOwogICAgaWYgKCF0aGlzWyRleHRyYV0pIHsKICAgICAgdGhpc1skZXh0cmFdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIE9iamVjdC5hc3NpZ24odGhpc1skZXh0cmFdLCB7CiAgICAgIGNoaWxkcmVuLAogICAgICBsaW5lOiBudWxsLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBhdHRlbXB0OiAwLAogICAgICBudW1iZXJJbkxpbmU6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlOiB7CiAgICAgICAgd2lkdGg6IE1hdGgubWluKHRoaXMudyB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5taW4odGhpcy5oIHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpCiAgICAgIH0sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHByZXZIZWlnaHQ6IDAsCiAgICAgIGN1cnJlbnRXaWR0aDogMAogICAgfSk7CiAgICBjb25zdCByb290ID0gdGhpc1skZ2V0VGVtcGxhdGVSb290XSgpOwogICAgY29uc3Qgc2F2ZWROb0xheW91dEZhaWx1cmUgPSByb290WyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlOwogICAgY29uc3QgaXNTcGxpdHRhYmxlID0gdGhpc1skaXNTcGxpdHRhYmxlXSgpOwogICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICB9CiAgICBpZiAoIWNoZWNrRGltZW5zaW9ucyh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRkFJTFVSRTsKICAgIH0KICAgIGNvbnN0IGZpbHRlciA9IG5ldyBTZXQoWyJhcmVhIiwgImRyYXciLCAiZXhjbEdyb3VwIiwgImZpZWxkIiwgInN1YmZvcm0iLCAic3ViZm9ybVNldCJdKTsKICAgIGlmICh0aGlzLmxheW91dC5pbmNsdWRlcygicm93IikpIHsKICAgICAgY29uc3QgY29sdW1uV2lkdGhzID0gdGhpc1skZ2V0U3ViZm9ybVBhcmVudF0oKS5jb2x1bW5XaWR0aHM7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbHVtbldpZHRocykgJiYgY29sdW1uV2lkdGhzLmxlbmd0aCA+IDApIHsKICAgICAgICB0aGlzWyRleHRyYV0uY29sdW1uV2lkdGhzID0gY29sdW1uV2lkdGhzOwogICAgICAgIHRoaXNbJGV4dHJhXS5jdXJyZW50Q29sdW1uID0gMDsKICAgICAgfQogICAgfQogICAgY29uc3Qgc3R5bGUgPSB0b1N0eWxlKHRoaXMsICJhbmNob3JUeXBlIiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicHJlc2VuY2UiLCAiYm9yZGVyIiwgIm1hcmdpbiIsICJoQWxpZ24iKTsKICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYVN1YmZvcm0iXTsKICAgIGNvbnN0IGNsID0gbGF5b3V0Q2xhc3ModGhpcyk7CiAgICBpZiAoY2wpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKGNsKTsKICAgIH0KICAgIGF0dHJpYnV0ZXMuc3R5bGUgPSBzdHlsZTsKICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBjbGFzc05hbWVzOwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICBpZiAodGhpcy5vdmVyZmxvdykgewogICAgICBjb25zdCBvdmVyZmxvd0V4dHJhID0gdGhpcy5vdmVyZmxvd1skZ2V0RXh0cmFdKCk7CiAgICAgIGlmIChvdmVyZmxvd0V4dHJhLmFkZExlYWRlcikgewogICAgICAgIG92ZXJmbG93RXh0cmEuYWRkTGVhZGVyID0gZmFsc2U7CiAgICAgICAgaGFuZGxlT3ZlcmZsb3codGhpcywgb3ZlcmZsb3dFeHRyYS5sZWFkZXIsIGF2YWlsYWJsZVNwYWNlKTsKICAgICAgfQogICAgfQogICAgdGhpc1skcHVzaFBhcmFdKCk7CiAgICBjb25zdCBpc0xyVGIgPSB0aGlzLmxheW91dCA9PT0gImxyLXRiIiB8fCB0aGlzLmxheW91dCA9PT0gInJsLXRiIjsKICAgIGNvbnN0IG1heFJ1biA9IGlzTHJUYiA/IE1BWF9BVFRFTVBUU19GT1JfTFJUQl9MQVlPVVQgOiAxOwogICAgZm9yICg7IHRoaXNbJGV4dHJhXS5hdHRlbXB0IDwgbWF4UnVuOyB0aGlzWyRleHRyYV0uYXR0ZW1wdCsrKSB7CiAgICAgIGlmIChpc0xyVGIgJiYgdGhpc1skZXh0cmFdLmF0dGVtcHQgPT09IE1BWF9BVFRFTVBUU19GT1JfTFJUQl9MQVlPVVQgLSAxKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLm51bWJlckluTGluZSA9IDA7CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gdGhpc1skY2hpbGRyZW5Ub0hUTUxdKHsKICAgICAgICBmaWx0ZXIsCiAgICAgICAgaW5jbHVkZTogdHJ1ZQogICAgICB9KTsKICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdC5pc0JyZWFrKCkpIHsKICAgICAgICB0aGlzWyRwb3BQYXJhXSgpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgaWYgKGlzTHJUYiAmJiB0aGlzWyRleHRyYV0uYXR0ZW1wdCA9PT0gMCAmJiB0aGlzWyRleHRyYV0ubnVtYmVySW5MaW5lID09PSAwICYmICFyb290WyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLmF0dGVtcHQgPSBtYXhSdW47CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJHBvcFBhcmFdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgcm9vdFskZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHNhdmVkTm9MYXlvdXRGYWlsdXJlOwogICAgaWYgKHRoaXNbJGV4dHJhXS5hdHRlbXB0ID09PSBtYXhSdW4pIHsKICAgICAgaWYgKHRoaXMub3ZlcmZsb3cpIHsKICAgICAgICB0aGlzWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5vdmVyZmxvd05vZGUgPSB0aGlzLm92ZXJmbG93OwogICAgICB9CiAgICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgaWYgKHRoaXMub3ZlcmZsb3cpIHsKICAgICAgY29uc3Qgb3ZlcmZsb3dFeHRyYSA9IHRoaXMub3ZlcmZsb3dbJGdldEV4dHJhXSgpOwogICAgICBpZiAob3ZlcmZsb3dFeHRyYS5hZGRUcmFpbGVyKSB7CiAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRUcmFpbGVyID0gZmFsc2U7CiAgICAgICAgaGFuZGxlT3ZlcmZsb3codGhpcywgb3ZlcmZsb3dFeHRyYS50cmFpbGVyLCBhdmFpbGFibGVTcGFjZSk7CiAgICAgI
20H0KICAgIH0KICAgIGxldCBtYXJnaW5IID0gMDsKICAgIGxldCBtYXJnaW5WID0gMDsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBtYXJnaW5IID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0ICsgdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgbWFyZ2luViA9IHRoaXMubWFyZ2luLnRvcEluc2V0ICsgdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS53aWR0aCArIG1hcmdpbkgsIHRoaXMudyB8fCAwKTsKICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KHRoaXNbJGV4dHJhXS5oZWlnaHQgKyBtYXJnaW5WLCB0aGlzLmggfHwgMCk7CiAgICBjb25zdCBiYm94ID0gW3RoaXMueCwgdGhpcy55LCB3aWR0aCwgaGVpZ2h0XTsKICAgIGlmICh0aGlzLncgPT09ICIiKSB7CiAgICAgIHN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHdpZHRoKTsKICAgIH0KICAgIGlmICh0aGlzLmggPT09ICIiKSB7CiAgICAgIHN0eWxlLmhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhoZWlnaHQpOwogICAgfQogICAgaWYgKChzdHlsZS53aWR0aCA9PT0gIjBweCIgfHwgc3R5bGUuaGVpZ2h0ID09PSAiMHB4IikgJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuCiAgICB9OwogICAgYXBwbHlBc3Npc3QodGhpcywgYXR0cmlidXRlcyk7CiAgICBjb25zdCByZXN1bHQgPSBIVE1MUmVzdWx0LnN1Y2Nlc3MoY3JlYXRlV3JhcHBlcih0aGlzLCBodG1sKSwgYmJveCk7CiAgICBpZiAodGhpcy5icmVha0FmdGVyLmNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7CiAgICAgIGNvbnN0IGJyZWFrQWZ0ZXIgPSB0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW5bMF07CiAgICAgIGlmIChoYW5kbGVCcmVhayhicmVha0FmdGVyKSkgewogICAgICAgIHRoaXNbJGV4dHJhXS5hZnRlckJyZWFrQWZ0ZXIgPSByZXN1bHQ7CiAgICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuYnJlYWtOb2RlKGJyZWFrQWZ0ZXIpOwogICAgICB9CiAgICB9CiAgICBkZWxldGUgdGhpc1skZXh0cmFdOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KY2xhc3MgU3ViZm9ybVNldCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJmb3JtU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVsYXRpb24gPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5yZWxhdGlvbiwgWyJvcmRlcmVkIiwgImNob2ljZSIsICJ1bm9yZGVyZWQiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib29rZW5kID0gbnVsbDsKICAgIHRoaXMuYnJlYWsgPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5vdmVyZmxvdyA9IG51bGw7CiAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtCZWZvcmUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgfQogICpbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgWyRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIGxldCBwYXJlbnQgPSB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgICB3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBTdWJmb3JtKSkgewogICAgICBwYXJlbnQgPSBwYXJlbnRbJGdldFBhcmVudF0oKTsKICAgIH0KICAgIHJldHVybiBwYXJlbnQ7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KY2xhc3MgU3ViamVjdEROIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJqZWN0RE4iKTsKICAgIHRoaXMuZGVsaW1pdGVyID0gYXR0cmlidXRlcy5kZWxpbWl0ZXIgfHwgIiwiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gbmV3IE1hcCh0aGlzWyRjb250ZW50XS5zcGxpdCh0aGlzLmRlbGltaXRlcikubWFwKGt2ID0+IHsKICAgICAga3YgPSBrdi5zcGxpdCgiPSIsIDIpOwogICAgICBrdlswXSA9IGt2WzBdLnRyaW0oKTsKICAgICAgcmV0dXJuIGt2OwogICAgfSkpOwogIH0KfQpjbGFzcyBTdWJqZWN0RE5zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN1YmplY3RETnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnN1YmplY3RETiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBTdWJtaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3VibWl0IiwgdHJ1ZSk7CiAgICB0aGlzLmVtYmVkUERGID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZW1iZWRQREYsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmZvcm1hdCA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmZvcm1hdCwgWyJ4ZHAiLCAiZm9ybWRhdGEiLCAicGRmIiwgInVybGVuY29kZWQiLCAieGZkIiwgInhtbCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudGV4dEVuY29kaW5nID0gZ2V0S2V5d29yZCh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMudGV4dEVuY29kaW5nID8gYXR0cmlidXRlcy50ZXh0RW5jb2RpbmcudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogayA9PiBbInV0Zi04IiwgImJpZy1maXZlIiwgImZvbnRzcGVjaWZpYyIsICJnYmsiLCAiZ2ItMTgwMzAiLCAiZ2ItMjMxMiIsICJrc2MtNTYwMSIsICJub25lIiwgInNoaWZ0LWppcyIsICJ1Y3MtMiIsICJ1dGYtMTYiXS5pbmNsdWRlcyhrKSB8fCBrLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnhkcENvbnRlbnQgPSBhdHRyaWJ1dGVzLnhkcENvbnRlbnQgfHwgIiI7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zaWduRGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUZW1wbGF0ZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0ZW1wbGF0ZSIsIHRydWUpOwogICAgdGhpcy5iYXNlUHJvZmlsZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLmJhc2VQcm9maWxlLCBbImZ1bGwiLCAiaW50ZXJhY3RpdmVGb3JtcyJdKTsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHdhcm4oIlhGQSAtIE5vIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGUuIik7CiAgICB9CiAgICBpZiAodGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA+PSAyKSB7CiAgICAgIHdhcm4oIlhGQSAtIFNldmVyYWwgc3ViZm9ybXMgaW4gdGVtcGxhdGUgbm9kZTogcGxlYXNlIGZpbGUgYSBidWcuIik7CiAgICB9CiAgICB0aGlzWyR0YWJJbmRleF0gPSBERUZBVUxUX1RBQl9JTkRFWDsKICB9CiAgWyRpc1NwbGl0dGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFskc2VhcmNoTm9kZV0oZXhwciwgY29udGFpbmVyKSB7CiAgICBpZiAoZXhwci5zdGFydHNXaXRoKCIjIikpIHsKICAgICAgcmV0dXJuIFt0aGlzWyRpZHNdLmdldChleHByLnNsaWNlKDEpKV07CiAgICB9CiAgICByZXR1cm4gc2VhcmNoTm9kZSh0aGlzLCBjb250YWluZXIsIGV4cHIsIHRydWUsIHRydWUpOwogIH0KICAqWyR0b1BhZ2VzXSgpIHsKICAgIGlmICghdGhpcy5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBjaGlsZHJlbjogW10KICAgICAgfSk7CiAgICB9CiAgICB0aGlzWyRleHRyYV0gPSB7CiAgICAgIG92ZXJmbG93Tm9kZTogbnVsbCwKICAgICAgZmlyc3RVbnNwbGl0dGFibGU6IG51bGwsCiAgICAgIGN1cnJlbnRDb250ZW50QXJlYTogbnVsbCwKICAgICAgY3VycmVudFBhZ2VBcmVhOiBudWxsLAogICAgICBub0xheW91dEZhaWx1cmU6IGZhbHNlLAogICAgICBwYWdlTnVtYmVyOiAxLAogICAgICBwYWdlUG9zaXRpb246ICJmaXJzdCIsCiAgICAgIG9kZE9yRXZlbjogIm9kZCIsCiAgICAgIGJsYW5rT3JOb3RCbGFuazogIm5vbkJsYW5rIiwKICAgICAgcGFyYVN0YWNrOiBbXQogICAgfTsKICAgIGNvbnN0IHJvb3QgPSB0aGlzLnN1YmZvcm0uY2hpbGRyZW5bMF07CiAgICByb290LnBhZ2VTZXRbJGNsZWFuUGFnZV0oKTsKICAgIGNvbnN0IHBhZ2VBcmVhcyA9IHJvb3QucGFnZVNldC5wYWdlQXJlYS5jaGlsZHJlbjsKICAgIGNvbnN0IG1haW5IdG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogICAgbGV0IHBhZ2VBcmVhID0gbnVsbDsKICAgIGxldCBicmVha0JlZm9yZSA9IG51bGw7CiAgICBsZXQgYnJlYWtCZWZvcmVUYXJnZXQgPSBudWxsOwogICAgaWYgKHJvb3QuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LmJyZWFrQmVmb3JlLmNoaWxkcmVuWzBdOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLnRhcmdldDsKICAgIH0gZWxzZSBpZiAocm9vdC5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA+PSAxICYmIHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICBicmVha0JlZm9yZSA9IHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgYnJlYWtCZWZvcmVUYXJnZXQgPSBicmVha0JlZm9yZS50YXJnZXQ7CiAgICB9IGVsc2UgaWYgKHJvb3QuYnJlYWs/LmJlZm9yZVRhcmdldCkgewogICAgICBicmVha0JlZm9yZSA9IHJvb3QuYnJlYWs7CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUuYmVmb3JlVGFyZ2V0OwogICAgfSBlbHNlIGlmIChyb290LnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoID49IDEgJiYgcm9vdC5zdWJmb3JtLmNoaWxkcmVuWzBdLmJyZWFrP
20y5iZWZvcmVUYXJnZXQpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWs7CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUuYmVmb3JlVGFyZ2V0OwogICAgfQogICAgaWYgKGJyZWFrQmVmb3JlKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXNbJHNlYXJjaE5vZGVdKGJyZWFrQmVmb3JlVGFyZ2V0LCBicmVha0JlZm9yZVskZ2V0UGFyZW50XSgpKTsKICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhZ2VBcmVhKSB7CiAgICAgICAgcGFnZUFyZWEgPSB0YXJnZXQ7CiAgICAgICAgYnJlYWtCZWZvcmVbJGV4dHJhXSA9IHt9OwogICAgICB9CiAgICB9CiAgICBpZiAoIXBhZ2VBcmVhKSB7CiAgICAgIHBhZ2VBcmVhID0gcGFnZUFyZWFzWzBdOwogICAgfQogICAgcGFnZUFyZWFbJGV4dHJhXSA9IHsKICAgICAgbnVtYmVyT2ZVc2U6IDEKICAgIH07CiAgICBjb25zdCBwYWdlQXJlYVBhcmVudCA9IHBhZ2VBcmVhWyRnZXRQYXJlbnRdKCk7CiAgICBwYWdlQXJlYVBhcmVudFskZXh0cmFdID0gewogICAgICBudW1iZXJPZlVzZTogMSwKICAgICAgcGFnZUluZGV4OiBwYWdlQXJlYVBhcmVudC5wYWdlQXJlYS5jaGlsZHJlbi5pbmRleE9mKHBhZ2VBcmVhKSwKICAgICAgcGFnZVNldEluZGV4OiAwCiAgICB9OwogICAgbGV0IHRhcmdldFBhZ2VBcmVhOwogICAgbGV0IGxlYWRlciA9IG51bGw7CiAgICBsZXQgdHJhaWxlciA9IG51bGw7CiAgICBsZXQgaGFzU29tZXRoaW5nID0gdHJ1ZTsKICAgIGxldCBoYXNTb21ldGhpbmdDb3VudGVyID0gMDsKICAgIGxldCBzdGFydEluZGV4ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICghaGFzU29tZXRoaW5nKSB7CiAgICAgICAgbWFpbkh0bWwuY2hpbGRyZW4ucG9wKCk7CiAgICAgICAgaWYgKCsraGFzU29tZXRoaW5nQ291bnRlciA9PT0gTUFYX0VNUFRZX1BBR0VTKSB7CiAgICAgICAgICB3YXJuKCJYRkEgLSBTb21ldGhpbmcgZ29lcyB3cm9uZzogcGxlYXNlIGZpbGUgYSBidWcuIik7CiAgICAgICAgICByZXR1cm4gbWFpbkh0bWw7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGhhc1NvbWV0aGluZ0NvdW50ZXIgPSAwOwogICAgICB9CiAgICAgIHRhcmdldFBhZ2VBcmVhID0gbnVsbDsKICAgICAgdGhpc1skZXh0cmFdLmN1cnJlbnRQYWdlQXJlYSA9IHBhZ2VBcmVhOwogICAgICBjb25zdCBwYWdlID0gcGFnZUFyZWFbJHRvSFRNTF0oKS5odG1sOwogICAgICBtYWluSHRtbC5jaGlsZHJlbi5wdXNoKHBhZ2UpOwogICAgICBpZiAobGVhZGVyKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgICAgICAgcGFnZS5jaGlsZHJlbi5wdXNoKGxlYWRlclskdG9IVE1MXShwYWdlQXJlYVskZXh0cmFdLnNwYWNlKS5odG1sKTsKICAgICAgICBsZWFkZXIgPSBudWxsOwogICAgICB9CiAgICAgIGlmICh0cmFpbGVyKSB7CiAgICAgICAgdGhpc1skZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHRydWU7CiAgICAgICAgcGFnZS5jaGlsZHJlbi5wdXNoKHRyYWlsZXJbJHRvSFRNTF0ocGFnZUFyZWFbJGV4dHJhXS5zcGFjZSkuaHRtbCk7CiAgICAgICAgdHJhaWxlciA9IG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgY29udGVudEFyZWFzID0gcGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW47CiAgICAgIGNvbnN0IGh0bWxDb250ZW50QXJlYXMgPSBwYWdlLmNoaWxkcmVuLmZpbHRlcihub2RlID0+IG5vZGUuYXR0cmlidXRlcy5jbGFzcy5pbmNsdWRlcygieGZhQ29udGVudGFyZWEiKSk7CiAgICAgIGhhc1NvbWV0aGluZyA9IGZhbHNlOwogICAgICB0aGlzWyRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPSBudWxsOwogICAgICB0aGlzWyRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gZmFsc2U7CiAgICAgIGNvbnN0IGZsdXNoID0gaW5kZXggPT4gewogICAgICAgIGNvbnN0IGh0bWwgPSByb290WyRmbHVzaEhUTUxdKCk7CiAgICAgICAgaWYgKGh0bWwpIHsKICAgICAgICAgIGhhc1NvbWV0aGluZyB8fD0gaHRtbC5jaGlsZHJlbj8ubGVuZ3RoID4gMDsKICAgICAgICAgIGh0bWxDb250ZW50QXJlYXNbaW5kZXhdLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleCwgaWkgPSBjb250ZW50QXJlYXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGNvbnRlbnRBcmVhID0gdGhpc1skZXh0cmFdLmN1cnJlbnRDb250ZW50QXJlYSA9IGNvbnRlbnRBcmVhc1tpXTsKICAgICAgICBjb25zdCBzcGFjZSA9IHsKICAgICAgICAgIHdpZHRoOiBjb250ZW50QXJlYS53LAogICAgICAgICAgaGVpZ2h0OiBjb250ZW50QXJlYS5oCiAgICAgICAgfTsKICAgICAgICBzdGFydEluZGV4ID0gMDsKICAgICAgICBpZiAobGVhZGVyKSB7CiAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2ldLmNoaWxkcmVuLnB1c2gobGVhZGVyWyR0b0hUTUxdKHNwYWNlKS5odG1sKTsKICAgICAgICAgIGxlYWRlciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICh0cmFpbGVyKSB7CiAgICAgICAgICBodG1sQ29udGVudEFyZWFzW2ldLmNoaWxkcmVuLnB1c2godHJhaWxlclskdG9IVE1MXShzcGFjZSkuaHRtbCk7CiAgICAgICAgICB0cmFpbGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgaHRtbCA9IHJvb3RbJHRvSFRNTF0oc3BhY2UpOwogICAgICAgIGlmIChodG1sLnN1Y2Nlc3MpIHsKICAgICAgICAgIGlmIChodG1sLmh0bWwpIHsKICAgICAgICAgICAgaGFzU29tZXRoaW5nIHx8PSBodG1sLmh0bWwuY2hpbGRyZW4/Lmxlbmd0aCA+IDA7CiAgICAgICAgICAgIGh0bWxDb250ZW50QXJlYXNbaV0uY2hpbGRyZW4ucHVzaChodG1sLmh0bWwpOwogICAgICAgICAgfSBlbHNlIGlmICghaGFzU29tZXRoaW5nICYmIG1haW5IdG1sLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgbWFpbkh0bWwuY2hpbGRyZW4ucG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbWFpbkh0bWw7CiAgICAgICAgfQogICAgICAgIGlmIChodG1sLmlzQnJlYWsoKSkgewogICAgICAgICAgY29uc3Qgbm9kZSA9IGh0bWwuYnJlYWtOb2RlOwogICAgICAgICAgZmx1c2goaSk7CiAgICAgICAgICBpZiAobm9kZS50YXJnZXRUeXBlID09PSAiYXV0byIpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS5sZWFkZXIpIHsKICAgICAgICAgICAgbGVhZGVyID0gdGhpc1skc2VhcmNoTm9kZV0obm9kZS5sZWFkZXIsIG5vZGVbJGdldFBhcmVudF0oKSk7CiAgICAgICAgICAgIGxlYWRlciA9IGxlYWRlciA/IGxlYWRlclswXSA6IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS50cmFpbGVyKSB7CiAgICAgICAgICAgI
20HRyYWlsZXIgPSB0aGlzWyRzZWFyY2hOb2RlXShub2RlLnRyYWlsZXIsIG5vZGVbJGdldFBhcmVudF0oKSk7CiAgICAgICAgICAgIHRyYWlsZXIgPSB0cmFpbGVyID8gdHJhaWxlclswXSA6IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZS50YXJnZXRUeXBlID09PSAicGFnZUFyZWEiKSB7CiAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gbm9kZVskZXh0cmFdLnRhcmdldDsKICAgICAgICAgICAgaSA9IEluZmluaXR5OwogICAgICAgICAgfSBlbHNlIGlmICghbm9kZVskZXh0cmFdLnRhcmdldCkgewogICAgICAgICAgICBpID0gbm9kZVskZXh0cmFdLmluZGV4OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSBub2RlWyRleHRyYV0udGFyZ2V0OwogICAgICAgICAgICBzdGFydEluZGV4ID0gbm9kZVskZXh0cmFdLmluZGV4ICsgMTsKICAgICAgICAgICAgaSA9IEluZmluaXR5OwogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzWyRleHRyYV0ub3ZlcmZsb3dOb2RlKSB7CiAgICAgICAgICBjb25zdCBub2RlID0gdGhpc1skZXh0cmFdLm92ZXJmbG93Tm9kZTsKICAgICAgICAgIHRoaXNbJGV4dHJhXS5vdmVyZmxvd05vZGUgPSBudWxsOwogICAgICAgICAgY29uc3Qgb3ZlcmZsb3dFeHRyYSA9IG5vZGVbJGdldEV4dHJhXSgpOwogICAgICAgICAgY29uc3QgdGFyZ2V0ID0gb3ZlcmZsb3dFeHRyYS50YXJnZXQ7CiAgICAgICAgICBvdmVyZmxvd0V4dHJhLmFkZExlYWRlciA9IG92ZXJmbG93RXh0cmEubGVhZGVyICE9PSBudWxsOwogICAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRUcmFpbGVyID0gb3ZlcmZsb3dFeHRyYS50cmFpbGVyICE9PSBudWxsOwogICAgICAgICAgZmx1c2goaSk7CiAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBpOwogICAgICAgICAgaSA9IEluZmluaXR5OwogICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhZ2VBcmVhKSB7CiAgICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gdGFyZ2V0OwogICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb250ZW50QXJlYSkgewogICAgICAgICAgICBjb25zdCBpbmRleCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKHRhcmdldCk7CiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPiBjdXJyZW50SW5kZXgpIHsKICAgICAgICAgICAgICAgIGkgPSBpbmRleCAtIDE7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSB0YXJnZXRbJGdldFBhcmVudF0oKTsKICAgICAgICAgICAgICBzdGFydEluZGV4ID0gdGFyZ2V0UGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZmx1c2goaSk7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdLnBhZ2VOdW1iZXIgKz0gMTsKICAgICAgaWYgKHRhcmdldFBhZ2VBcmVhKSB7CiAgICAgICAgaWYgKHRhcmdldFBhZ2VBcmVhWyRpc1VzYWJsZV0oKSkgewogICAgICAgICAgdGFyZ2V0UGFnZUFyZWFbJGV4dHJhXS5udW1iZXJPZlVzZSArPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHBhZ2VBcmVhID0gdGFyZ2V0UGFnZUFyZWEgfHwgcGFnZUFyZWFbJGdldE5leHRQYWdlXSgpOwogICAgICB5aWVsZCBudWxsOwogICAgfQogIH0KfQpjbGFzcyBUZXh0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0ZXh0Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubWF4Q2hhcnMgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXhDaGFycywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFskYWNjZXB0V2hpdGVzcGFjZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgaWYgKGNoaWxkWyRuYW1lc3BhY2VJZF0gPT09IE5hbWVzcGFjZUlkcy54aHRtbC5pZCkgewogICAgICB0aGlzWyRjb250ZW50XSA9IGNoaWxkOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHdhcm4oYFhGQSAtIEludmFsaWQgY29udGVudCBpbiBUZXh0OiAke2NoaWxkWyRub2RlTmFtZV19LmApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJG9uVGV4dF0oc3RyKSB7CiAgICBpZiAodGhpc1skY29udGVudF0gaW5zdGFuY2VvZiBYRkFPYmplY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3VwZXJbJG9uVGV4dF0oc3RyKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodHlwZW9mIHRoaXNbJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnJlcGxhY2VBbGwoIlxyXG4iLCAiXG4iKTsKICAgIH0KICB9CiAgWyRnZXRFeHRyYV0oKSB7CiAgICBpZiAodHlwZW9mIHRoaXNbJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gdGhpc1skY29udGVudF0uc3BsaXQoL1tcdTIwMjlcdTIwMjhcbl0vKS5yZWR1Y2UoKGFjYywgbGluZSkgPT4gewogICAgICAgIGlmIChsaW5lKSB7CiAgICAgICAgICBhY2MucHVzaChsaW5lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgW10pLmpvaW4oIlxuIik7CiAgICB9CiAgICByZXR1cm4gdGhpc1skY29udGVudF1bJHRleHRdKCk7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKHR5cGVvZiB0aGlzWyRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgaHRtbCA9IHZhbHVlVG9IdG1sKHRoaXNbJGNvbn
20RlbnRdKS5odG1sOwogICAgICBpZiAodGhpc1skY29udGVudF0uaW5jbHVkZXMoIlx1MjAyOSIpKSB7CiAgICAgICAgaHRtbC5uYW1lID0gImRpdiI7CiAgICAgICAgaHRtbC5jaGlsZHJlbiA9IFtdOwogICAgICAgIHRoaXNbJGNvbnRlbnRdLnNwbGl0KCJcdTIwMjkiKS5tYXAocGFyYSA9PiBwYXJhLnNwbGl0KC9bXHUyMDI4XG5dLykucmVkdWNlKChhY2MsIGxpbmUpID0+IHsKICAgICAgICAgIGFjYy5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgfSwgW10pKS5mb3JFYWNoKGxpbmVzID0+IHsKICAgICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIG5hbWU6ICJwIiwKICAgICAgICAgICAgY2hpbGRyZW46IGxpbmVzCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgvW1x1MjAyOFxuXS8udGVzdCh0aGlzWyRjb250ZW50XSkpIHsKICAgICAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgICAgICBodG1sLmNoaWxkcmVuID0gW107CiAgICAgICAgdGhpc1skY29udGVudF0uc3BsaXQoL1tcdTIwMjhcbl0vKS5mb3JFYWNoKGxpbmUgPT4gewogICAgICAgICAgaHRtbC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWwpOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICB9Cn0KY2xhc3MgVGV4dEVkaXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dEVkaXQiLCB0cnVlKTsKICAgIHRoaXMuYWxsb3dSaWNoVGV4dCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFsbG93UmljaFRleHQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm11bHRpTGluZSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm11bHRpTGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMCB8fCB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnZTY3JvbGxQb2xpY3kgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy52U2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9IHRvU3R5bGUodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgbGV0IGh0bWw7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbJGdldFBhcmVudF0oKVskZ2V0UGFyZW50XSgpOwogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAiIikgewogICAgICB0aGlzLm11bHRpTGluZSA9IGZpZWxkIGluc3RhbmNlb2YgRHJhdyA/IDEgOiAwOwogICAgfQogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAxKSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogInRleHRhcmVhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogImlucHV0IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICBkYXRhSWQ6IGZpZWxkWyRkYXRhXT8uWyR1aWRdIHx8IGZpZWxkWyR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImxhYmVsIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBbInhmYUxhYmVsIl0KICAgICAgfSwKICAgICAgY2hpbGRyZW46IFtodG1sXQogICAgfSk7CiAgfQp9CmNsYXNzIFRpbWUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGltZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgICB0aGlzWyRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbJGNvbn
20RlbnRdID8gdGhpc1skY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgVGltZVN0YW1wIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRpbWVTdGFtcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnNlcnZlciA9IGF0dHJpYnV0ZXMuc2VydmVyIHx8ICIiOwogICAgdGhpcy50eXBlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFRvb2xUaXAgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidG9vbFRpcCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnJpZCA9IGF0dHJpYnV0ZXMucmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgVHJhdmVyc2FsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRyYXZlcnNhbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUcmF2ZXJzZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0cmF2ZXJzZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJuZXh0IiwgImJhY2siLCAiZG93biIsICJmaXJzdCIsICJsZWZ0IiwgInJpZ2h0IiwgInVwIl0pOwogICAgdGhpcy5yZWYgPSBhdHRyaWJ1dGVzLnJlZiB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQogIGdldCBuYW1lKCkgewogICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uOwogIH0KICBbJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQpjbGFzcyBVaSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ1aSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICAgIHRoaXMuYmFyY29kZSA9IG51bGw7CiAgICB0aGlzLmJ1dHRvbiA9IG51bGw7CiAgICB0aGlzLmNoZWNrQnV0dG9uID0gbnVsbDsKICAgIHRoaXMuY2hvaWNlTGlzdCA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lRWRpdCA9IG51bGw7CiAgICB0aGlzLmRlZmF1bHRVaSA9IG51bGw7CiAgICB0aGlzLmltYWdlRWRpdCA9IG51bGw7CiAgICB0aGlzLm51bWVyaWNFZGl0ID0gbnVsbDsKICAgIHRoaXMucGFzc3dvcmRFZGl0ID0gbnVsbDsKICAgIHRoaXMuc2lnbmF0dXJlID0gbnVsbDsKICAgIHRoaXMudGV4dEVkaXQgPSBudWxsOwogIH0KICBbJGdldEV4dHJhXSgpIHsKICAgIGlmICh0aGlzWyRleHRyYV0gPT09IHVuZGVmaW5lZCkgewogICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgICBpZiAobmFtZSA9PT0gImV4dHJhcyIgfHwgbmFtZSA9PT0gInBpY3R1cmUiKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2JqID0gdGhpc1tuYW1lXTsKICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBYRkFPYmplY3QpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhpc1skZXh0cmFdID0gb2JqOwogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgdGhpc1skZXh0cmFdID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzWyRleHRyYV07CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgb2JqID0gdGhpc1skZ2V0RXh0cmFdKCk7CiAgICBpZiAob2JqKSB7CiAgICAgIHJldHVybiBvYmpbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgfQogICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgfQp9CmNsYXNzIFZhbGlkYXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInZhbGlkYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmZvcm1hdFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5mb3JtYXRUZXN0LCBbIndhcm5pbmciLCAiZGlzYWJsZWQiLCAiZXJyb3IiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubnVsbFRlc3QgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5udWxsVGVzdCwgWyJkaXNhYmxlZCIsICJlcnJvciIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy5zY3JpcHRUZXN0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NyaXB0VGVzdCwgWyJlcnJvciIsICJkaXNhYmxlZCIsICJ3YXJuaW5nIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KfQpjbGFzcyBWYWx1ZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ2YWx1ZSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm92ZXJyaWRlID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMub3ZlcnJpZGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnJlbGV2YW50ID0gZ2V0UmVsZXZhbnQoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5hcmMgPSBudWxsOwogICAgdGhpcy5ib29sZWFuID0gbnVsbDsKICAgIHRoaXMuZGF0ZSA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lID0gbnVsbDsKICAgIHRoaXMuZGVjaW1hbCA9IG51bGw7CiAgICB0aGlzLmV4RGF0YSA9IG51bGw7CiAgICB0aGlzLmZsb2F0ID0gbnVsbDsKICAgIHRoaXMuaW1hZ2UgPSBudWxsOwogICAgdGhpcy5pbnRlZ2VyID0gbnVsbDsKICAgIHRoaXMubGluZSA9IG51bGw7CiAgICB0aGlzLnJlY3RhbmdsZSA9IG51bGw7CiAgICB0aGlzLnRleHQgPSBudWxsOwogICAgdGhpcy50aW1lID0gbnVsbDsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGaWVsZCkgewogICAgICBpZiAocGFyZW50LnVpPy5pbWFnZUVkaXQpIHsKICAgICAgICBpZiAoIXRoaXMuaW1hZ2UpIHsKICAgICAgICAgI
20HRoaXMuaW1hZ2UgPSBuZXcgSW1hZ2Uoe30pOwogICAgICAgICAgdGhpc1skYXBwZW5kQ2hpbGRdKHRoaXMuaW1hZ2UpOwogICAgICAgIH0KICAgICAgICB0aGlzLmltYWdlWyRjb250ZW50XSA9IHZhbHVlWyRjb250ZW50XTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHZhbHVlTmFtZSA9IHZhbHVlWyRub2RlTmFtZV07CiAgICBpZiAodGhpc1t2YWx1ZU5hbWVdICE9PSBudWxsKSB7CiAgICAgIHRoaXNbdmFsdWVOYW1lXVskY29udGVudF0gPSB2YWx1ZVskY29udGVudF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IG51bGw7CiAgICAgICAgdGhpc1skcmVtb3ZlQ2hpbGRdKG9iaik7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbdmFsdWVbJG5vZGVOYW1lXV0gPSB2YWx1ZTsKICAgIHRoaXNbJGFwcGVuZENoaWxkXSh2YWx1ZSk7CiAgfQogIFskdGV4dF0oKSB7CiAgICBpZiAodGhpcy5leERhdGEpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4RGF0YVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XS50cmltKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZXhEYXRhWyRjb250ZW50XVskdGV4dF0oKS50cmltKCk7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJpbWFnZSIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgWEZBT2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIChvYmpbJGNvbnRlbnRdIHx8ICIiKS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFhGQU9iamVjdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICByZXR1cm4gb2JqWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LkVNUFRZOwogIH0KfQpjbGFzcyBWYXJpYWJsZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidmFyaWFibGVzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1hbmlmZXN0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNjcmlwdCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgWyRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBUZW1wbGF0ZU5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChUZW1wbGF0ZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICBjb25zdCBub2RlID0gVGVtcGxhdGVOYW1lc3BhY2VbbmFtZV0oYXR0cmlidXRlcyk7CiAgICAgIG5vZGVbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBhcHBlYXJhbmNlRmlsdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFwcGVhcmFuY2VGaWx0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYXJjKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyYyhhdHRycyk7CiAgfQogIHN0YXRpYyBhcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFyZWEoYXR0cnMpOwogIH0KICBzdGF0aWMgYXNzaXN0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFzc2lzdChhdHRycyk7CiAgfQogIHN0YXRpYyBiYXJjb2RlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhcmNvZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgYmluZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJpbmRJdGVtcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBCaW5kSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9va2VuZChhdHRycykgewogICAgcmV0dXJuIG5ldyBCb29rZW5kKGF0dHJzKTsKICB9CiAgc3RhdGljIGJvb2xlYW4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQm9vbGVhbkVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9yZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJvcmRlcihhdHRycyk7CiAgfQogIHN0YXRpYyBicmVhayhhdHRycykgewogICAgcmV0dXJuIG5ldyBCcmVhayhhdHRycyk7CiAgfQogIHN0YXRpYyBicmVha0FmdGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrQWZ0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgYnJlYWtCZWZvcmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQnJlYWtCZWZvcmUoYXR0cnMpOwogIH0KICBzdGF0aWMgYnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJ1dHRvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjYWxjdWxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhcHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDZXJ0aWZpY2F0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBjZXJ0aWZpY2F0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2VydGlmaWNhdGVzKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoZWNrQnV0dG9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENoZWNrQnV0dG9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNob2ljZUxpc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2hvaWNlTGlzdChhdHRycyk7CiAgfQogIHN0YXRpYyBjb2xvcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb2xvcihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21iKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbWIoYXR0cnMpOwogIH0KICBzdGF0aWMgY29ubmVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25uZWN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbnRlbnRBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbnRlbnRBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvcm5lcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb3JuZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWVFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGRlY2ltYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVjaW1hbChhdHRycyk7CiAgfQogIHN0YXRpYyBkZWZhdWx0VWkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVmYXVsdFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlc2MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzYyhhdHRycyk7CiAgfQogIHN0YXRpYyBkaWdlc3RNZXRob2QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kKGF0dHJzKTsKICB9CiAgc3RhdGljIGRpZ2VzdE1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGlnZXN0TWV0aG9kcyhhdHRycyk7CiAgfQogIHN0YXRpYyBkcmF3KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERyYXcoYXR0cnMpOwogIH0KICBzdGF0aWMgZWRnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZGdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY29
20kaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY29kaW5ncyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNvZGluZ3MoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHREYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHREYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHRpb25NZXRob2QoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbk1ldGhvZHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZXZlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXZlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhEYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEV4RGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBleE9iamVjdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFeE9iamVjdChhdHRycyk7CiAgfQogIHN0YXRpYyBleGNsR3JvdXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbEdyb3VwKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4ZWN1dGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhlY3V0ZShhdHRycyk7CiAgfQogIHN0YXRpYyBleHRyYXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXh0cmFzKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpZWxkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZpZWxkKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpbGwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsbChhdHRycyk7CiAgfQogIHN0YXRpYyBmaWx0ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmlsdGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGZsb2F0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEZsb2F0KGF0dHJzKTsKICB9CiAgc3RhdGljIGZvbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgdGVtcGxhdGVfRm9udChhdHRycyk7CiAgfQogIHN0YXRpYyBmb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIGhhbmRsZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSGFuZGxlcihhdHRycyk7CiAgfQogIHN0YXRpYyBoeXBoZW5hdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBIeXBoZW5hdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbWFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbWFnZUVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW1hZ2VFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIGludGVnZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW50ZWdlcihhdHRycyk7CiAgfQogIHN0YXRpYyBpc3N1ZXJzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IElzc3VlcnMoYXR0cnMpOwogIH0KICBzdGF0aWMgaXRlbXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSXRlbXMoYXR0cnMpOwogIH0KICBzdGF0aWMga2VlcChhdHRycykgewogICAgcmV0dXJuIG5ldyBLZWVwKGF0dHJzKTsKICB9CiAgc3RhdGljIGtleVVzYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEtleVVzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGxpbmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZShhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGluZWFyKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2tEb2N1bWVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2NrRG9jdW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFuaWZlc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWFuaWZlc3QoYXR0cnMpOwogIH0KICBzdGF0aWMgbWFyZ2luKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcmdpbihhdHRycyk7CiAgfQogIHN0YXRpYyBtZHAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWRwKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lZGl1bShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVzc2FnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXNzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWVyaWNFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWVyaWNFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIG9jY3VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9jY3VyKGF0dHJzKTsKICB9CiAgc3RhdGljIG9pZChhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWQoYXR0cnMpOwogIH0KICBzdGF0aWMgb2lkcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBPaWRzKGF0dHJzKTsKICB9CiAgc3RhdGljIG92ZXJmbG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE92ZXJmbG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VBcmVhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2VBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZVNldChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXJhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhcmEoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFzc3dvcmRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhc3N3b3JkRWRpdChhdHRycyk7CiAgfQogIHN0YXRpYyBwYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IHRlbXBsYXRlX1BhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgcGljdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQaWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIHByb3RvKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByb3RvKGF0dHJzKTsKICB9CiAgc3RhdGljIHJhZGlhbChhdHRycykgewogICAgcmV0dXJuIG5ldyBSYWRpYWwoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVhc29uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbihhdHRycyk7CiAgfQogIHN0YXRpYyByZWFzb25zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlYXNvbnMoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVjdGFuZ2xlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShhdHRycyk7CiAgfQogIHN0YXRpYyByZWYoYXR0cnMpIHsKICAgIHJldHVybi
20BuZXcgUmVmRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2NyaXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIHNldFByb3BlcnR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNldFByb3BlcnR5KGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25EYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25EYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduYXR1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lnbmluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWduaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIHNvbGlkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvbGlkKGF0dHJzKTsKICB9CiAgc3RhdGljIHNwZWFrKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNwZWFrKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0aXBwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RpcHBsZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJmb3JtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmZvcm0oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViZm9ybVNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJmb3JtU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1YmplY3RETihhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE4oYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViamVjdEROcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJqZWN0RE5zKGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGV4dChhdHRycykgewogICAgcmV0dXJuIG5ldyBUZXh0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRleHRFZGl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRleHRFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZShhdHRycyk7CiAgfQogIHN0YXRpYyB0aW1lU3RhbXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVN0YW1wKGF0dHJzKTsKICB9CiAgc3RhdGljIHRvb2xUaXAoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVG9vbFRpcChhdHRycyk7CiAgfQogIHN0YXRpYyB0cmF2ZXJzYWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhdmVyc2FsKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYXZlcnNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYXZlcnNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHVpKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFVpKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbHVlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbHVlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhcmlhYmxlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBWYXJpYWJsZXMoYXR0cnMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2JpbmQuanMKCgoKCgoKCgoKCgpjb25zdCBiaW5kX05TX0RBVEFTRVRTID0gTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkOwpmdW5jdGlvbiBjcmVhdGVUZXh0KGNvbnRlbnQpIHsKICBjb25zdCBub2RlID0gbmV3IFRleHQoe30pOwogIG5vZGVbJGNvbnRlbnRdID0gY29udGVudDsKICByZXR1cm4gbm9kZTsKfQpjbGFzcyBCaW5kZXIgewogIGNvbnN0cnVjdG9yKHJvb3QpIHsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICB0aGlzLmRhdGFzZXRzID0gcm9vdC5kYXRhc2V0czsKICAgIHRoaXMuZGF0YSA9IHJvb3QuZGF0YXNldHM/LmRhdGEgfHwgbmV3IFhtbE9iamVjdChOYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQsICJkYXRhIik7CiAgICB0aGlzLmVtcHR5TWVyZ2UgPSB0aGlzLmRhdGFbJGdldENoaWxkcmVuXSgpLmxlbmd0aCA9PT0gMDsKICAgIHRoaXMucm9vdC5mb3JtID0gdGhpcy5mb3JtID0gcm9vdC50ZW1wbGF0ZVskY2xvbmVdKCk7CiAgfQogIF9pc0NvbnN1bWVEYXRhKCkgewogICAgcmV0dXJuICF0aGlzLmVtcHR5TWVyZ2UgJiYgdGhpcy5fbWVyZ2VNb2RlOwogIH0KICBfaXNNYXRjaFRlbXBsYXRlKCkgewogICAgcmV0dXJuICF0aGlzLl9pc0NvbnN1bWVEYXRhKCk7CiAgfQogIGJpbmQoKSB7CiAgICB0aGlzLl9iaW5kRWxlbWVudCh0aGlzLmZvcm0sIHRoaXMuZGF0YSk7CiAgICByZXR1cm4gdGhpcy5mb3JtOwogIH0KICBnZXREYXRhKCkgewogICAgcmV0dXJuIHRoaXMuZGF0YTsKICB9CiAgX2JpbmRWYWx1ZShmb3JtTm9kZSwgZGF0YSwgcGljdHVyZSkgewogICAgZm9ybU5vZGVbJGRhdGFdID0gZGF0YTsKICAgIGlmIChmb3JtTm9kZVskaGFzU2V0dGFibGVWYWx1ZV0oKSkgewogICAgICBpZiAoZGF0YVskaXNEYXRhVmFsdWVdKCkpIHsKICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbJGdldERhdGFWYWx1ZV0oKTsKICAgICAgICBmb3JtTm9kZVskc2V0VmFsdWVdKGNyZWF0ZVRleHQodmFsdWUpKTsKICAgICAgfSBlbHNlIGlmIChmb3JtTm9kZSBpbnN0YW5jZW9mIEZpZWxkICYmIGZvcm1Ob2RlLnVpPy5jaG9pY2VMaXN0Py5vcGVuID09PSAibXVsdGlTZWxlY3QiKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhWyRnZXRDaGlsZHJlbl0oKS5tYXAoY2hpbGQgPT4gY2hpbGRbJGNvbnRlbnRdLnRyaW0oKSkuam9pbigiXG4iKTsKICAgICAgICBmb3JtTm9kZVskc2V0VmFsdWVdKGNyZWF0ZVRleHQodmFsdWUpKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICB3YXJuKGBYRkEgLSBOb2RlcyBoYXZlbid0IHRoZSBzYW1lIHR5cGUuYCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIWRhdGFbJGlzRGF0YVZhbHVlXSgpIHx8IHRoaXMuX2lzTWF0Y2hUZW1wbGF0ZSgpKSB7CiAgICAgIHRoaXMuX2JpbmRFbGVtZW50KGZvcm1Ob2RlLCBkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4oYFhGQSAtIE5vZGVzIGhhdmVuJ3QgdGhlIHNhbWUgdHlwZS5gKTsKICAgIH0KICB9CiAgX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKG5hbWUsIGlzVmFsdWUsIGRhdGFOb2RlLCBnbG9iYWwpIHsKICAgIGlmICghbmFtZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCBnZW5lcmF0b3IsIG1hdGNoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgZ2VuZXJhdG9yID0gZGF0YU5vZGVbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBmYWxzZSwgdHJ1ZSk7CiAgICAgI
20HdoaWxlICh0cnVlKSB7CiAgICAgICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaXNWYWx1ZSA9PT0gbWF0Y2hbJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkYXRhTm9kZVskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQgJiYgZGF0YU5vZGVbJG5vZGVOYW1lXSA9PT0gImRhdGEiKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGF0YU5vZGUgPSBkYXRhTm9kZVskZ2V0UGFyZW50XSgpOwogICAgfQogICAgaWYgKCFnbG9iYWwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBnZW5lcmF0b3IgPSB0aGlzLmRhdGFbJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCB0cnVlLCBmYWxzZSk7CiAgICBtYXRjaCA9IGdlbmVyYXRvci5uZXh0KCkudmFsdWU7CiAgICBpZiAobWF0Y2gpIHsKICAgICAgcmV0dXJuIG1hdGNoOwogICAgfQogICAgZ2VuZXJhdG9yID0gdGhpcy5kYXRhWyRnZXRBdHRyaWJ1dGVJdF0obmFtZSwgdHJ1ZSk7CiAgICBtYXRjaCA9IGdlbmVyYXRvci5uZXh0KCkudmFsdWU7CiAgICBpZiAobWF0Y2g/LlskaXNEYXRhVmFsdWVdKCkpIHsKICAgICAgcmV0dXJuIG1hdGNoOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIF9zZXRQcm9wZXJ0aWVzKGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgaWYgKCFmb3JtTm9kZS5oYXNPd25Qcm9wZXJ0eSgic2V0UHJvcGVydHkiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IHsKICAgICAgcmVmLAogICAgICB0YXJnZXQsCiAgICAgIGNvbm5lY3Rpb24KICAgIH0gb2YgZm9ybU5vZGUuc2V0UHJvcGVydHkuY2hpbGRyZW4pIHsKICAgICAgaWYgKGNvbm5lY3Rpb24pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoIXJlZikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG5vZGVzID0gc2VhcmNoTm9kZSh0aGlzLnJvb3QsIGRhdGFOb2RlLCByZWYsIGZhbHNlLCBmYWxzZSk7CiAgICAgIGlmICghbm9kZXMpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHJlZmVyZW5jZTogJHtyZWZ9LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IFtub2RlXSA9IG5vZGVzOwogICAgICBpZiAoIW5vZGVbJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhKSkgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgbm9kZTogbXVzdCBiZSBhIGRhdGEgbm9kZS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCB0YXJnZXROb2RlcyA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBmb3JtTm9kZSwgdGFyZ2V0LCBmYWxzZSwgZmFsc2UpOwogICAgICBpZiAoIXRhcmdldE5vZGVzKSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB0YXJnZXQ6ICR7dGFyZ2V0fS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBbdGFyZ2V0Tm9kZV0gPSB0YXJnZXROb2RlczsKICAgICAgaWYgKCF0YXJnZXROb2RlWyRpc0Rlc2NlbmRlbnRdKGZvcm1Ob2RlKSkgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdGFyZ2V0OiBtdXN0IGJlIGEgcHJvcGVydHkgb3Igc3VicHJvcGVydHkuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0Tm9kZVskZ2V0UGFyZW50XSgpOwogICAgICBpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIFNldFByb3BlcnR5IHx8IHRhcmdldFBhcmVudCBpbnN0YW5jZW9mIFNldFByb3BlcnR5KSB7CiAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIHNldFByb3BlcnR5IG9yIG9uZSBvZiBpdHMgcHJvcGVydGllcy5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEJpbmRJdGVtcyB8fCB0YXJnZXRQYXJlbnQgaW5zdGFuY2VvZiBCaW5kSXRlbXMpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHRhcmdldDogY2Fubm90IGJlIGEgYmluZEl0ZW1zIG9yIG9uZSBvZiBpdHMgcHJvcGVydGllcy5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBjb250ZW50ID0gbm9kZVskdGV4dF0oKTsKICAgICAgY29uc3QgbmFtZSA9IHRhcmdldE5vZGVbJG5vZGVOYW1lXTsKICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBYRkFBdHRyaWJ1dGUpIHsKICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgYXR0cnNbbmFtZV0gPSBjb250ZW50OwogICAgICAgIGNvbnN0IG9iaiA9IFJlZmxlY3QuY29uc3RydWN0KE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXRQYXJlbnQpLmNvbnN0cnVjdG9yLCBbYXR0cnNdKTsKICAgICAgICB0YXJnZXRQYXJlbnRbbmFtZV0gPSBvYmpbbmFtZV07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCF0YXJnZXROb2RlLmhhc093blByb3BlcnR5KCRjb250ZW50KSkgewogICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgbm9kZSB0byB1c2UgaW4gc2V0UHJvcGVydHlgKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0YXJnZXROb2RlWyRkYXRhXSA9IG5vZGU7CiAgICAgIHRhcmdldE5vZGVbJGNvbnRlbnRdID0gY29udGVudDsKICAgICAgdGFyZ2V0Tm9kZVskZmluYWxpemVdKCk7CiAgICB9CiAgfQogIF9iaW5kSXRlbXMoZm9ybU5vZGUsIGRhdGFOb2RlKSB7CiAgICBpZiAoIWZvcm1Ob2RlLmhhc093blByb3BlcnR5KCJpdGVtcyIpIHx8ICFmb3JtTm9kZS5oYXNPd25Qcm9wZXJ0eSgiYmluZEl0ZW1zIikgfHwgZm9ybU5vZGUuYmluZEl0ZW1zLmlzRW1wdHkoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZm9ybU5vZGUuaXRlbXMuY2hpbGRyZW4pIHsKICAgICAgZm9ybU5vZGVbJHJlbW92ZUNoaWxkXShpdGVtKTsKICAgIH0KICAgIGZvcm1Ob2RlLml0ZW1zLmNsZWFyKCk7CiAgICBjb25zdCBsYWJlbHMgPSBuZXcgSXRlbXMoe30pOwogICAgY29uc3QgdmFsdWVzID0gbmV3IEl0ZW1zKHt9KTsKICAgIGZvcm1Ob2RlWyRhcHBlbmRDaGlsZF0obGFiZWxzKTsKICAgIGZvcm1Ob2RlLml0ZW1zLnB1c2gobGFiZWxzKTsKICAgIGZvcm1Ob2RlWyRhcHBlbmRDaGlsZF0odmFsdWVzKTsKICAgIGZvcm1Ob2RlLml0ZW1zLnB1c2godmFsdWVzKTsKICAgIGZvciAoY29uc3QgewogICAgICByZWYsCiAgICAgIGxhYmVsUmVmLAogICAgICB2YWx1ZVJlZiwKICAgICAgY29ubmVjdGlvbgogICAgfSBvZiBmb3JtTm9kZS5iaW5kSXRlbXMuY2hpbGRyZW4pIHsKICAgICAgaWYgKGNvbm5lY3Rpb24pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoIXJlZikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG5vZGVzID0gc2VhcmNoTm9kZSh0aGlzLnJvb3QsIGRhdGFOb2RlLCByZWYsIGZhbHNlLCBmYWxzZSk7CiAgICAgIGlmICghbm9kZXMpIHsKICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHJlZmVyZW5jZTogJHtyZWZ9LmApOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2RlcykgewogICAgICAgIGlmICghbm9kZVskaXNEZXNjZW5kZW50XSh0aGlzLmRhdGFzZXRzKSkgewogICAgICAgICAgd2FybihgWEZBIC0gSW52YWxpZCByZWYg
20KCR7cmVmfSk6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBsYWJlbE5vZGVzID0gc2VhcmNoTm9kZSh0aGlzLnJvb3QsIG5vZGUsIGxhYmVsUmVmLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgaWYgKCFsYWJlbE5vZGVzKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIGxhYmVsOiAke2xhYmVsUmVmfS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBbbGFiZWxOb2RlXSA9IGxhYmVsTm9kZXM7CiAgICAgICAgaWYgKCFsYWJlbE5vZGVbJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpIHsKICAgICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgbGFiZWw6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWx1ZU5vZGVzID0gc2VhcmNoTm9kZSh0aGlzLnJvb3QsIG5vZGUsIHZhbHVlUmVmLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgaWYgKCF2YWx1ZU5vZGVzKSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBJbnZhbGlkIHZhbHVlOiAke3ZhbHVlUmVmfS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBbdmFsdWVOb2RlXSA9IHZhbHVlTm9kZXM7CiAgICAgICAgaWYgKCF2YWx1ZU5vZGVbJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpIHsKICAgICAgICAgIHdhcm4oYFhGQSAtIEludmFsaWQgdmFsdWU6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBsYWJlbCA9IGNyZWF0ZVRleHQobGFiZWxOb2RlWyR0ZXh0XSgpKTsKICAgICAgICBjb25zdCB2YWx1ZSA9IGNyZWF0ZVRleHQodmFsdWVOb2RlWyR0ZXh0XSgpKTsKICAgICAgICBsYWJlbHNbJGFwcGVuZENoaWxkXShsYWJlbCk7CiAgICAgICAgbGFiZWxzLnRleHQucHVzaChsYWJlbCk7CiAgICAgICAgdmFsdWVzWyRhcHBlbmRDaGlsZF0odmFsdWUpOwogICAgICAgIHZhbHVlcy50ZXh0LnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgfQogIF9iaW5kT2NjdXJyZW5jZXMoZm9ybU5vZGUsIG1hdGNoZXMsIHBpY3R1cmUpIHsKICAgIGxldCBiYXNlQ2xvbmU7CiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAxKSB7CiAgICAgIGJhc2VDbG9uZSA9IGZvcm1Ob2RlWyRjbG9uZV0oKTsKICAgICAgYmFzZUNsb25lWyRyZW1vdmVDaGlsZF0oYmFzZUNsb25lLm9jY3VyKTsKICAgICAgYmFzZUNsb25lLm9jY3VyID0gbnVsbDsKICAgIH0KICAgIHRoaXMuX2JpbmRWYWx1ZShmb3JtTm9kZSwgbWF0Y2hlc1swXSwgcGljdHVyZSk7CiAgICB0aGlzLl9zZXRQcm9wZXJ0aWVzKGZvcm1Ob2RlLCBtYXRjaGVzWzBdKTsKICAgIHRoaXMuX2JpbmRJdGVtcyhmb3JtTm9kZSwgbWF0Y2hlc1swXSk7CiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50ID0gZm9ybU5vZGVbJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IG5hbWUgPSBmb3JtTm9kZVskbm9kZU5hbWVdOwogICAgY29uc3QgcG9zID0gcGFyZW50WyRpbmRleE9mXShmb3JtTm9kZSk7CiAgICBmb3IgKGxldCBpID0gMSwgaWkgPSBtYXRjaGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVzW2ldOwogICAgICBjb25zdCBjbG9uZSA9IGJhc2VDbG9uZVskY2xvbmVdKCk7CiAgICAgIHBhcmVudFtuYW1lXS5wdXNoKGNsb25lKTsKICAgICAgcGFyZW50WyRpbnNlcnRBdF0ocG9zICsgaSwgY2xvbmUpOwogICAgICB0aGlzLl9iaW5kVmFsdWUoY2xvbmUsIG1hdGNoLCBwaWN0dXJlKTsKICAgICAgdGhpcy5fc2V0UHJvcGVydGllcyhjbG9uZSwgbWF0Y2gpOwogICAgICB0aGlzLl9iaW5kSXRlbXMoY2xvbmUsIG1hdGNoKTsKICAgIH0KICB9CiAgX2NyZWF0ZU9jY3VycmVuY2VzKGZvcm1Ob2RlKSB7CiAgICBpZiAoIXRoaXMuZW1wdHlNZXJnZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB7CiAgICAgIG9jY3VyCiAgICB9ID0gZm9ybU5vZGU7CiAgICBpZiAoIW9jY3VyIHx8IG9jY3VyLmluaXRpYWwgPD0gMSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSBmb3JtTm9kZVskZ2V0UGFyZW50XSgpOwogICAgY29uc3QgbmFtZSA9IGZvcm1Ob2RlWyRub2RlTmFtZV07CiAgICBpZiAoIShwYXJlbnRbbmFtZV0gaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGN1cnJlbnROdW1iZXI7CiAgICBpZiAoZm9ybU5vZGUubmFtZSkgewogICAgICBjdXJyZW50TnVtYmVyID0gcGFyZW50W25hbWVdLmNoaWxkcmVuLmZpbHRlcihlID0+IGUubmFtZSA9PT0gZm9ybU5vZGUubmFtZSkubGVuZ3RoOwogICAgfSBlbHNlIHsKICAgICAgY3VycmVudE51bWJlciA9IHBhcmVudFtuYW1lXS5jaGlsZHJlbi5sZW5ndGg7CiAgICB9CiAgICBjb25zdCBwb3MgPSBwYXJlbnRbJGluZGV4T2ZdKGZvcm1Ob2RlKSArIDE7CiAgICBjb25zdCBpaSA9IG9jY3VyLmluaXRpYWwgLSBjdXJyZW50TnVtYmVyOwogICAgaWYgKGlpKSB7CiAgICAgIGNvbnN0IG5vZGVDbG9uZSA9IGZvcm1Ob2RlWyRjbG9uZV0oKTsKICAgICAgbm9kZUNsb25lWyRyZW1vdmVDaGlsZF0obm9kZUNsb25lLm9jY3VyKTsKICAgICAgbm9kZUNsb25lLm9jY3VyID0gbnVsbDsKICAgICAgcGFyZW50W25hbWVdLnB1c2gobm9kZUNsb25lKTsKICAgICAgcGFyZW50WyRpbnNlcnRBdF0ocG9zLCBub2RlQ2xvbmUpOwogICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBjbG9uZSA9IG5vZGVDbG9uZVskY2xvbmVdKCk7CiAgICAgICAgcGFyZW50W25hbWVdLnB1c2goY2xvbmUpOwogICAgICAgIHBhcmVudFskaW5zZXJ0QXRdKHBvcyArIGksIGNsb25lKTsKICAgICAgfQogICAgfQogIH0KICBfZ2V0T2NjdXJJbmZvKGZvcm1Ob2RlKSB7CiAgICBjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIG9jY3VyCiAgICB9ID0gZm9ybU5vZGU7CiAgICBpZiAoIW9jY3VyIHx8ICFuYW1lKSB7CiAgICAgI
20HJldHVybiBbMSwgMV07CiAgICB9CiAgICBjb25zdCBtYXggPSBvY2N1ci5tYXggPT09IC0xID8gSW5maW5pdHkgOiBvY2N1ci5tYXg7CiAgICByZXR1cm4gW29jY3VyLm1pbiwgbWF4XTsKICB9CiAgX3NldEFuZEJpbmQoZm9ybU5vZGUsIGRhdGFOb2RlKSB7CiAgICB0aGlzLl9zZXRQcm9wZXJ0aWVzKGZvcm1Ob2RlLCBkYXRhTm9kZSk7CiAgICB0aGlzLl9iaW5kSXRlbXMoZm9ybU5vZGUsIGRhdGFOb2RlKTsKICAgIHRoaXMuX2JpbmRFbGVtZW50KGZvcm1Ob2RlLCBkYXRhTm9kZSk7CiAgfQogIF9iaW5kRWxlbWVudChmb3JtTm9kZSwgZGF0YU5vZGUpIHsKICAgIGNvbnN0IHVzZWxlc3NOb2RlcyA9IFtdOwogICAgdGhpcy5fY3JlYXRlT2NjdXJyZW5jZXMoZm9ybU5vZGUpOwogICAgZm9yIChjb25zdCBjaGlsZCBvZiBmb3JtTm9kZVskZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgaWYgKGNoaWxkWyRkYXRhXSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh0aGlzLl9tZXJnZU1vZGUgPT09IHVuZGVmaW5lZCAmJiBjaGlsZFskbm9kZU5hbWVdID09PSAic3ViZm9ybSIpIHsKICAgICAgICB0aGlzLl9tZXJnZU1vZGUgPSBjaGlsZC5tZXJnZU1vZGUgPT09ICJjb25zdW1lRGF0YSI7CiAgICAgICAgY29uc3QgZGF0YUNoaWxkcmVuID0gZGF0YU5vZGVbJGdldENoaWxkcmVuXSgpOwogICAgICAgIGlmIChkYXRhQ2hpbGRyZW4ubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5fYmluZE9jY3VycmVuY2VzKGNoaWxkLCBbZGF0YUNoaWxkcmVuWzBdXSwgbnVsbCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVtcHR5TWVyZ2UpIHsKICAgICAgICAgIGNvbnN0IG5zSWQgPSBkYXRhTm9kZVskbmFtZXNwYWNlSWRdID09PSBiaW5kX05TX0RBVEFTRVRTID8gLTEgOiBkYXRhTm9kZVskbmFtZXNwYWNlSWRdOwogICAgICAgICAgY29uc3QgZGF0YUNoaWxkID0gY2hpbGRbJGRhdGFdID0gbmV3IFhtbE9iamVjdChuc0lkLCBjaGlsZC5uYW1lIHx8ICJyb290Iik7CiAgICAgICAgICBkYXRhTm9kZVskYXBwZW5kQ2hpbGRdKGRhdGFDaGlsZCk7CiAgICAgICAgICB0aGlzLl9iaW5kRWxlbWVudChjaGlsZCwgZGF0YUNoaWxkKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFjaGlsZFskaXNCaW5kYWJsZV0oKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBnbG9iYWwgPSBmYWxzZTsKICAgICAgbGV0IHBpY3R1cmUgPSBudWxsOwogICAgICBsZXQgcmVmID0gbnVsbDsKICAgICAgbGV0IG1hdGNoID0gbnVsbDsKICAgICAgaWYgKGNoaWxkLmJpbmQpIHsKICAgICAgICBzd2l0Y2ggKGNoaWxkLmJpbmQubWF0Y2gpIHsKICAgICAgICAgIGNhc2UgIm5vbmUiOgogICAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBkYXRhTm9kZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSAiZ2xvYmFsIjoKICAgICAgICAgICAgZ2xvYmFsID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJkYXRhUmVmIjoKICAgICAgICAgICAgaWYgKCFjaGlsZC5iaW5kLnJlZikgewogICAgICAgICAgICAgIHdhcm4oYFhGQSAtIHJlZiBpcyBlbXB0eSBpbiBub2RlICR7Y2hpbGRbJG5vZGVOYW1lXX0uYCk7CiAgICAgICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZiA9IGNoaWxkLmJpbmQucmVmOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoY2hpbGQuYmluZC5waWN0dXJlKSB7CiAgICAgICAgICBwaWN0dXJlID0gY2hpbGQuYmluZC5waWN0dXJlWyRjb250ZW50XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgW21pbiwgbWF4XSA9IHRoaXMuX2dldE9jY3VySW5mbyhjaGlsZCk7CiAgICAgIGlmIChyZWYpIHsKICAgICAgICBtYXRjaCA9IHNlYXJjaE5vZGUodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7CiAgICAgICAgICBtYXRjaCA9IGNyZWF0ZURhdGFOb2RlKHRoaXMuZGF0YSwgZGF0YU5vZGUsIHJlZik7CiAgICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuX2lzQ29uc3VtZURhdGEoKSkgewogICAgICAgICAgICBtYXRjaFskY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIG1hdGNoKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2guZmlsdGVyKG5vZGUgPT4gIW5vZGVbJGNvbnN1bWVkXSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gbWF4KSB7CiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2guc2xpY2UoMCwgbWF4KTsKICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2gubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIG1hdGNoID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtYXRjaCAmJiB0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgICAgbWF0Y2guZm9yRWFjaChub2RlID0+IHsKICAgICAgICAgICAgICBub2RlWyRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFjaGlsZC5uYW1lKSB7CiAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBkYXRhTm9kZSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzQ29uc3VtZURhdGEoKSkgewogICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdOwogICAgICAgICAgd2hpbGUgKG1hdGNoZXMubGVuZ3RoIDwgbWF4KSB7CiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fZmluZERhdGFCeU5hbWVUb0NvbnN1bWUoY2hpbGQubmFtZSwgY2hpbGRbJGhhc1NldHRhYmxlVmFsdWVdKCksIGRhdGFOb2RlLCBnbG9iYWwpOwogICAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgI
20H0KICAgICAgICAgICAgZm91bmRbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICAgIG1hdGNoZXMucHVzaChmb3VuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBtYXRjaCA9IG1hdGNoZXMubGVuZ3RoID4gMCA/IG1hdGNoZXMgOiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtYXRjaCA9IGRhdGFOb2RlWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0oY2hpbGQubmFtZSwgZmFsc2UsIHRoaXMuZW1wdHlNZXJnZSkubmV4dCgpLnZhbHVlOwogICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICBpZiAobWluID09PSAwKSB7CiAgICAgICAgICAgICAgdXNlbGVzc05vZGVzLnB1c2goY2hpbGQpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG5zSWQgPSBkYXRhTm9kZVskbmFtZXNwYWNlSWRdID09PSBiaW5kX05TX0RBVEFTRVRTID8gLTEgOiBkYXRhTm9kZVskbmFtZXNwYWNlSWRdOwogICAgICAgICAgICBtYXRjaCA9IGNoaWxkWyRkYXRhXSA9IG5ldyBYbWxPYmplY3QobnNJZCwgY2hpbGQubmFtZSk7CiAgICAgICAgICAgIGlmICh0aGlzLmVtcHR5TWVyZ2UpIHsKICAgICAgICAgICAgICBtYXRjaFskY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkYXRhTm9kZVskYXBwZW5kQ2hpbGRdKG1hdGNoKTsKICAgICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgbWF0Y2gpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmVtcHR5TWVyZ2UpIHsKICAgICAgICAgICAgbWF0Y2hbJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBtYXRjaCA9IFttYXRjaF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIHRoaXMuX2JpbmRPY2N1cnJlbmNlcyhjaGlsZCwgbWF0Y2gsIHBpY3R1cmUpOwogICAgICB9IGVsc2UgaWYgKG1pbiA+IDApIHsKICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBkYXRhTm9kZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdXNlbGVzc05vZGVzLnB1c2goY2hpbGQpOwogICAgICB9CiAgICB9CiAgICB1c2VsZXNzTm9kZXMuZm9yRWFjaChub2RlID0+IG5vZGVbJGdldFBhcmVudF0oKVskcmVtb3ZlQ2hpbGRdKG5vZGUpKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9kYXRhLmpzCgoKY2xhc3MgRGF0YUhhbmRsZXIgewogIGNvbnN0cnVjdG9yKHJvb3QsIGRhdGEpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLmRhdGFzZXQgPSByb290LmRhdGFzZXRzIHx8IG51bGw7CiAgfQogIHNlcmlhbGl6ZShzdG9yYWdlKSB7CiAgICBjb25zdCBzdGFjayA9IFtbLTEsIHRoaXMuZGF0YVskZ2V0Q2hpbGRyZW5dKCldXTsKICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGxhc3QgPSBzdGFjay5hdCgtMSk7CiAgICAgIGNvbnN0IFtpLCBjaGlsZHJlbl0gPSBsYXN0OwogICAgICBpZiAoaSArIDEgPT09IGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bKytsYXN0WzBdXTsKICAgICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gc3RvcmFnZS5nZXQoY2hpbGRbJHVpZF0pOwogICAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgICAgY2hpbGRbJHNldFZhbHVlXShzdG9yYWdlRW50cnkpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjaGlsZFskZ2V0QXR0cmlidXRlc10oKTsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGF0dHJpYnV0ZXMudmFsdWVzKCkpIHsKICAgICAgICAgIGNvbnN0IGVudHJ5ID0gc3RvcmFnZS5nZXQodmFsdWVbJHVpZF0pOwogICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgIHZhbHVlWyRzZXRWYWx1ZV0oZW50cnkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZXMgPSBjaGlsZFskZ2V0Q2hpbGRyZW5dKCk7CiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgc3RhY2sucHVzaChbLTEsIG5vZGVzXSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGJ1ZiA9IFtgPHhmYTpkYXRhc2V0cyB4bWxuczp4ZmE9Imh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyI+YF07CiAgICBpZiAodGhpcy5kYXRhc2V0KSB7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5kYXRhc2V0WyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdICE9PSAiZGF0YSIpIHsKICAgICAgICAgIGNoaWxkWyR0b1N0cmluZ10oYnVmKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGF0YVskdG9TdHJpbmddKGJ1Zik7CiAgICBidWYucHVzaCgiPC94ZmE6ZGF0YXNldHM+Iik7CiAgICByZXR1cm4gYnVmLmpvaW4oIiIpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2NvbmZpZy5qcwoKCgoKCgoKCgoKCmNvbnN0IENPTkZJR19OU19JRCA9IE5hbWVzcGFjZUlkcy5jb25maWcuaWQ7CmNsYXNzIEFjcm9iYXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQiLCB0cnVlKTsKICAgIHRoaXMuYWNyb2JhdDcgPSBudWxsOwogICAgdGhpcy5hdXRvU2F2ZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMgPSBudWxsOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWNyb2JhdDcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFjcm9iYXQ3IiwgdHJ1ZSk7CiAgICB0aGlzLmR5bmFtaWNSZW5kZXIgPSBudWxsOwogIH0KfQpjbGFzcyBBREJFX0pTQ29uc29sZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiQURCRV9KU0Nvb
20nNvbGUiLCBbImRlbGVnYXRlIiwgIkVuYWJsZSIsICJEaXNhYmxlIl0pOwogIH0KfQpjbGFzcyBBREJFX0pTRGVidWdnZXIgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIkFEQkVfSlNEZWJ1Z2dlciIsIFsiZGVsZWdhdGUiLCAiRW5hYmxlIiwgIkRpc2FibGUiXSk7CiAgfQp9CmNsYXNzIEFkZFNpbGVudFByaW50IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFNpbGVudFByaW50Iik7CiAgfQp9CmNsYXNzIEFkZFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFkZFZpZXdlclByZWZlcmVuY2VzIik7CiAgfQp9CmNsYXNzIEFkanVzdERhdGEgZXh0ZW5kcyBPcHRpb24xMCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRqdXN0RGF0YSIpOwogIH0KfQpjbGFzcyBBZG9iZUV4dGVuc2lvbkxldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRvYmVFeHRlbnNpb25MZXZlbCIsIDAsIG4gPT4gbiA+PSAxICYmIG4gPD0gOCk7CiAgfQp9CmNsYXNzIEFnZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhZ2VudCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5jb21tb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQWx3YXlzRW1iZWQgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhbHdheXNFbWJlZCIpOwogIH0KfQpjbGFzcyBBbWQgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFtZCIpOwogIH0KfQpjbGFzcyBjb25maWdfQXJlYSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYXJlYSIpOwogICAgdGhpcy5sZXZlbCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmxldmVsLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSAmJiBuIDw9IDMKICAgIH0pOwogICAgdGhpcy5uYW1lID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMubmFtZSwgWyIiLCAiYmFyY29kZSIsICJjb3JlaW5pdCIsICJkZXZpY2VEcml2ZXIiLCAiZm9udCIsICJnZW5lcmFsIiwgImxheW91dCIsICJtZXJnZSIsICJzY3JpcHQiLCAic2lnbmF0dXJlIiwgInNvdXJjZVNldCIsICJ0ZW1wbGF0ZUNhY2hlIl0pOwogIH0KfQpjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdHRyaWJ1dGVzIiwgWyJwcmVzZXJ2ZSIsICJkZWxlZ2F0ZSIsICJpZ25vcmUiXSk7CiAgfQp9CmNsYXNzIEF1dG9TYXZlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhdXRvU2F2ZSIsIFsiZGlzYWJsZWQiLCAiZW5hYmxlZCJdKTsKICB9Cn0KY2xhc3MgQmFzZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmFzZSIpOwogIH0KfQpjbGFzcyBCYXRjaE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYmF0Y2hPdXRwdXQiKTsKICAgIHRoaXMuZm9ybWF0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuZm9ybWF0LCBbIm5vbmUiLCAiY29uY2F0IiwgInppcCIsICJ6aXBDb21wcmVzcyJdKTsKICB9Cn0KY2xhc3MgQmVoYXZpb3JPdmVycmlkZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImJlaGF2aW9yT3ZlcnJpZGUiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IG5ldyBNYXAodGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4LmluY2x1ZGVzKCI6IikpLm1hcCh4ID0+IHguc3BsaXQoIjoiLCAyKSkpOwogIH0KfQpjbGFzcyBDYWNoZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY2FjaGUiLCB0cnVlKTsKICAgIHRoaXMudGVtcGxhdGVDYWNoZSA9IG51bGw7CiAgfQp9CmNsYXNzIENoYW5nZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjaGFuZ2UiKTsKICB9Cn0KY2xhc3MgQ29tbW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21tb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZSA9IG51bGw7CiAgICB0aGlzLmxvY2FsZVNldCA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2luZyA9IG51bGw7CiAgICB0aGlzLnN1cHByZXNzQmFubmVyID0gbnVsbDsKICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnaW5nID0gbnVsbDsKICAgIHRoaXMudmVyc2lvbkNvbnRyb2wgPSBudWxsOwogICAgdGhpcy5sb2cgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQ29tcHJlc3MgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzIik7CiAgICB0aGlzLnNjb3BlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc2NvcGUsIFsiaW1hZ2VPbmx5IiwgImRvY3VtZW50Il0pOwogIH0KfQpjbGFzcyBDb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIik7CiAgfQp9CmNsYXNzIENvbXByZXNzT2JqZWN0U3RyZWFtIGV4dGVuZHMgT3B0aW9uMTAgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzT2JqZWN0U3RyZWFtIik7CiAgfQp9CmNsYXNzIENvbXByZXNzaW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21wcmVzc2lvbiIsIHRydWUpOwogICAgdGhpcy5jb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgPSBudWxsOwogICAgdGhpcy5jb21wcmVzc09iamVjdFN0cmVhbSA9IG51bGw7CiAgICB0aGlzLmxldmVsID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgfQp9CmNsYXNzIENvbmZpZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZmlnIiwgdHJ1ZSk7CiAgICB0aGlzLmFjcm9iYXQgPSBudWxsOwogICAgdGhpcy5wcmVzZW50ID0gbnVsbDsKICAgIHRoaXMudHJhY2UgPSBudWxsOwogICAgdGhpcy5hZ2VudCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBDb25mb3JtYW5jZSBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29uZm9ybWFuY2UiLCBbIkEiLCAiQiJdKTsKICB9Cn0KY2xhc3MgQ29udGVudENvcHkgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29udGVudENvcHkiKTsKICB9Cn0KY2xhc3MgQ29waWVzIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29waWVzIiwgMSwgbiA9PiBuID49IDEpOwogIH0KfQpjbGFzcyBDcmVhdG9yIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjcmVhdG9yIik7CiAgfQp9CmNsYXNzIEN1cnJlbnRQYWdlIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY3VycmVudFBhZ2UiLCAwLCBuID0+IG4gPj0gMCk7CiAgfQp9CmNsYXNzIERhdGEgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRhdGEiLCB0cnVlKTsKICAgIHRoaXMuYWRqdXN0RGF0YSA9IG51bGw7CiAgICB0aGlzLmF0dHJpYnV0ZXMgPSBudWxsOwogICAgdGhpcy5pbmNyZW1lbnRhbExvYWQgPSBudWxsOwogICAgdGhpcy5vdXRwdXRYU0wgPSBudWxsOwogICAgdGhpcy5yYW5nZSA9IG51bGw7CiAgICB0aGlzLnJlY29yZCA9IG51bGw7CiAgICB0aGlzLnN0YXJ0Tm9kZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgICB0aGlzLndpbmRvdyA9IG51bGw7CiAgICB0aGlzLnhzbCA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGVOUyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRGVidWcgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlYnVnIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIERlZmF1bHRUeXBlZmFjZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRlZmF1bHRUeXBlZmFjZSIpOwogICAgdGhpcy53cml0aW5nU2NyaXB0ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMud3JpdGluZ1NjcmlwdCwgWyIqIiwgIkFyYWJpYyIsICJDeXJpbGxpYyIsICJFYXN0RXVyb3BlYW5Sb21hbiIsICJHcmVlayIsICJIZWJyZXciLCAiSmFwYW5lc2UiLCAiS29yZWFuIiwgIlJvbWFuIiwgIlNpbXBsaWZpZWRDaGluZXNlIiwgIlRoYWkiLCAiVHJhZGl0aW9uYWxDaGluZXNlIiwgIlZpZXRuYW1lc2UiXSk7CiAgfQp9CmNsYXNzIERlc3RpbmF0aW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkZXN0aW5hdGlvbiIsIFsicGRmIiwgInBjbCIsICJwcyIsICJ3ZWJDbGllbnQiLCAienBsIl0pOwogIH0KfQpjbGFzcyBEb2N1bWVudEFzc2VtYmx5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImRvY3VtZW50QXNzZW1ibHkiKTsKICB9Cn0KY2xhc3MgRHJpdmVyIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkcml2ZXIiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSA/IGF0dHJpYnV0ZXMubmFtZS50cmltKCkgOiAiIjsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBEdXBsZXhPcHRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImR1cGxleE9wdGlvbiIsIFsic2ltcGxleCIsICJkdXBsZXhGbGlwTG9uZ0VkZ2UiLCAiZHVwbGV4RmxpcFNob3J0RWRnZSJdKTsKICB9Cn0KY2xhc3MgRHluYW1pY1JlbmRlciBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZHluYW1pY1JlbmRlciIsIFsiZm9yYmlkZGVuIiwgInJlcXVpcmVkIl0pOwogIH0KfQpjbGFzcyBFbWJlZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbWJlZCIpOwogIH0KfQpjbGFzcyBjb25maWdfRW5jcnlwdCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0Iik7CiAgfQp9CmNsYXNzIGNvbmZpZ19FbmNyeXB0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0aW9uTGV2ZWwgPSBudWxsOwogICAgdGhpcy5wZXJtaXNzaW9ucyA9IG51bGw7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25MZXZlbCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZW5jcnlwdGlvbkxldmVsIiwgWyI0MGJpdCIsICIxMjhiaXQiXSk7CiAgfQp9CmNsYXNzIEVuZm9yY2UgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImVuZm9yY2UiKTsKICB9Cn0KY2xhc3MgRXF1YXRlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlcXVhdGUiKTsKICAgIHRoaXMuZm9yY2UgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb3JjZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID09PSAwCiAgICB9KTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogIH0KfQpjbGFzcyBFcXVhdGVSYW5nZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXF1YXRlUmFuZ2UiKTsKICAgIHRoaXMuZnJvbSA9IGF0dHJpYnV0ZXMuZnJvbSB8fCAiIjsKICAgIHRoaXMudG8gPSBhdHRyaWJ1dGVzLnRvIHx8ICIiOwogICAgdGhpcy5fdW5pY29kZVJhbmdlID0gYXR0cmlidXRlcy51bmljb2RlUmFuZ2UgfHwgIiI7CiAgfQogIGdldCB1bmljb2RlUmFuZ2UoKSB7CiAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgIGNvbnN0IHVuaWNvZGVSZWdleCA9IC9VXCsoWzAtOWEtZkEtRl0rKS87CiAgICBjb25zdCB1bmljb2RlUmFuZ2UgPSB0aGlzLl91bmljb2RlUmFuZ2U7CiAgICBmb3IgKGxldCByYW5nZSBvZiB1bmljb2RlUmFuZ2Uuc3BsaXQoIiwiKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKHggPT4gISF4KSkgewogICAgICByYW5nZSA9IHJhbmdlLnNwbGl0KCItIiwgMikubWFwKHggPT4gewogICAgICAgIGNvbnN0IGZvdW5kID0geC5tYXRjaCh1bmljb2RlUmVnZXgpOwogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgI
20HJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyc2VJbnQoZm91bmRbMV0sIDE2KTsKICAgICAgfSk7CiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDEpIHsKICAgICAgICByYW5nZS5wdXNoKHJhbmdlWzBdKTsKICAgICAgfQogICAgICByYW5nZXMucHVzaChyYW5nZSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ1bmljb2RlUmFuZ2UiLCByYW5nZXMpOwogIH0KfQpjbGFzcyBFeGNsdWRlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXhjbHVkZSIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiB4ICYmIFsiY2FsY3VsYXRlIiwgImNsb3NlIiwgImVudGVyIiwgImV4aXQiLCAiaW5pdGlhbGl6ZSIsICJyZWFkeSIsICJ2YWxpZGF0ZSJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgRXhjbHVkZU5TIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJleGNsdWRlTlMiKTsKICB9Cn0KY2xhc3MgRmxpcExhYmVsIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmbGlwTGFiZWwiLCBbInVzZVByaW50ZXJTZXR0aW5nIiwgIm9uIiwgIm9mZiJdKTsKICB9Cn0KY2xhc3MgY29uZmlnX0ZvbnRJbmZvIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb250SW5mbyIsIHRydWUpOwogICAgdGhpcy5lbWJlZCA9IG51bGw7CiAgICB0aGlzLm1hcCA9IG51bGw7CiAgICB0aGlzLnN1YnNldEJlbG93ID0gbnVsbDsKICAgIHRoaXMuYWx3YXlzRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVmYXVsdFR5cGVmYWNlID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLm5ldmVyRW1iZWQgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRm9ybUZpZWxkRmlsbGluZyBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb3JtRmllbGRGaWxsaW5nIik7CiAgfQp9CmNsYXNzIEdyb3VwUGFyZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJncm91cFBhcmVudCIpOwogIH0KfQpjbGFzcyBJZkVtcHR5IGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpZkVtcHR5IiwgWyJkYXRhVmFsdWUiLCAiZGF0YUdyb3VwIiwgImlnbm9yZSIsICJyZW1vdmUiXSk7CiAgfQp9CmNsYXNzIEluY2x1ZGVYRFBDb250ZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNsdWRlWERQQ29udGVudCIpOwogIH0KfQpjbGFzcyBJbmNyZW1lbnRhbExvYWQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImluY3JlbWVudGFsTG9hZCIsIFsibm9uZSIsICJmb3J3YXJkT25seSJdKTsKICB9Cn0KY2xhc3MgSW5jcmVtZW50YWxNZXJnZSBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNyZW1lbnRhbE1lcmdlIik7CiAgfQp9CmNsYXNzIEludGVyYWN0aXZlIGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImludGVyYWN0aXZlIik7CiAgfQp9CmNsYXNzIEpvZyBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiam9nIiwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJub25lIiwgInBhZ2VTZXQiXSk7CiAgfQp9CmNsYXNzIExhYmVsUHJpbnRlciBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGFiZWxQcmludGVyIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbInpwbCIsICJkcGwiLCAiaXBsIiwgInRjcGwiXSk7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuZmxpcExhYmVsID0gbnVsbDsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBMYXlvdXQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImxheW91dCIsIFsicGFnaW5hdGUiLCAicGFuZWwiXSk7CiAgfQp9CmNsYXNzIExldmVsIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGV2ZWwiLCAwLCBuID0+IG4gPiAwKTsKICB9Cn0KY2xhc3MgTGluZWFyaXplZCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJsaW5lYXJpemVkIik7CiAgfQp9CmNsYXNzIExvY2FsZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlIik7CiAgfQp9CmNsYXNzIExvY2FsZVNldCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlU2V0Iik7CiAgfQp9CmNsYXNzIExvZyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9nIiwgdHJ1ZSk7CiAgICB0aGlzLm1vZGUgPSBudWxsOwogICAgdGhpcy50aHJlc2hvbGQgPSBudWxsOwogICAgdGhpcy50byA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE1hcEVsZW1lbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1hcCIsIHRydWUpOwogICAgdGhpcy5lcXVhdGUgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXF1YXRlUmFuZ2UgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWVkaXVtSW5mbyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVkaXVtSW5mbyIsIHRydWUpOwogICAgdGhpcy5tYXAgPSBudWxsOwogIH0KfQpjbGFzcyBjb25maWdfTWVzc2FnZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVzc2FnZSIsIHRydWUpOwogICAgdGhpcy5tc2dJZCA9IG51bGw7CiAgICB0aGlzLnNldmVyaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgTWVzc2FnaW5nIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtZXNzYWdpbmciLCB0cnVlKTsKICAgIHRoaXMubWVzc2FnZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNb2RlIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtb2RlIiwgWyJhcHBlbmQiLCAib3ZlcndyaXRlIl0pOwogIH0KfQpjbGFzcyBNb2RpZnlBbm5vdHMgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibW9kaWZ5QW5ub3RzIik7CiAgfQp9CmNsYXNzIE1zZ0lkIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibXNnSWQiLCAxLCBuID0+IG4gPj0gMSk7CiAgfQp9CmNsYXNzIE5hbWVBdHRyIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJuYW1lQXR0ciIpOwogIH0KfQpjbGFzcyBOZXZlckVtYmVkIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibmV2ZXJFbWJlZCIpOwogIH0KfQpjbGFzcyBOdW1iZXJPZkNvcGllcyBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm51bWJlck9mQ29waWVzIiwgbnVsbCwgbiA9PiBuID49IDIgJiYgbiA8PSA1KTsKICB9Cn0KY2xhc3MgT3BlbkFjdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3BlbkFjdGlvbiIsIHRydWUpOwogICAgdGhpcy5kZXN0aW5
20hdGlvbiA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0IiwgdHJ1ZSk7CiAgICB0aGlzLnRvID0gbnVsbDsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE91dHB1dEJpbiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0QmluIik7CiAgfQp9CmNsYXNzIE91dHB1dFhTTCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3V0cHV0WFNMIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE92ZXJwcmludCBleHRlbmRzIE9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAib3ZlcnByaW50IiwgWyJub25lIiwgImJvdGgiLCAiZHJhdyIsICJmaWVsZCJdKTsKICB9Cn0KY2xhc3MgUGFja2V0cyBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFja2V0cyIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSA9PT0gIioiKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5maWx0ZXIoeCA9PiBbImNvbmZpZyIsICJkYXRhc2V0cyIsICJ0ZW1wbGF0ZSIsICJ4ZmRmIiwgInhzbHQiXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIFBhZ2VPZmZzZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2VPZmZzZXQiKTsKICAgIHRoaXMueCA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLngsCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMueSA9IGdldEludGVnZXIoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnksCiAgICAgIGRlZmF1bHRWYWx1ZTogInVzZVhEQ1NldHRpbmciLAogICAgICB2YWxpZGF0ZTogbiA9PiB0cnVlCiAgICB9KTsKICB9Cn0KY2xhc3MgUGFnZVJhbmdlIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwYWdlUmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBudW1iZXJzID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoeCA9PiBwYXJzZUludCh4LCAxMCkpOwogICAgY29uc3QgcmFuZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBudW1iZXJzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgcmFuZ2VzLnB1c2gobnVtYmVycy5zbGljZShpLCBpICsgMikpOwogICAgfQogICAgdGhpc1skY29udGVudF0gPSByYW5nZXM7CiAgfQp9CmNsYXNzIFBhZ2luYXRpb24gZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb24iLCBbInNpbXBsZXgiLCAiZHVwbGV4U2hvcnRFZGdlIiwgImR1cGxleExvbmdFZGdlIl0pOwogIH0KfQpjbGFzcyBQYWdpbmF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2luYXRpb25PdmVycmlkZSIsIFsibm9uZSIsICJmb3JjZUR1cGxleCIsICJmb3JjZUR1cGxleExvbmdFZGdlIiwgImZvcmNlRHVwbGV4U2hvcnRFZGdlIiwgImZvcmNlU2ltcGxleCJdKTsKICB9Cn0KY2xhc3MgUGFydCBleHRlbmRzIEludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhcnQiLCAxLCBuID0+IGZhbHNlKTsKICB9Cn0KY2xhc3MgUGNsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwY2wiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLmpvZyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bUluZm8gPSBudWxsOwogICAgdGhpcy5vdXRwdXRCaW4gPSBudWxsOwogICAgdGhpcy5wYWdlT2Zmc2V0ID0gbnVsbDsKICAgIHRoaXMuc3RhcGxlID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgUGRmIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGYiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYWRvYmVFeHRlbnNpb25MZXZlbCA9IG51bGw7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuY29tcHJlc3Npb24gPSBudWxsOwogICAgdGhpcy5jcmVhdG9yID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuaW50ZXJhY3RpdmUgPSBudWxsOwogICAgdGhpcy5saW5lYXJpemVkID0gbnVsbDsKICAgIHRoaXMub3BlbkFjdGlvbiA9IG51bGw7CiAgICB0aGlzLnBkZmEgPSBudWxsOwogICAgdGhpcy5wcm9kdWNlciA9IG51bGw7CiAgICB0aGlzLnJlbmRlclBvbGljeSA9IG51bGw7CiAgICB0aGlzLnNjcmlwdE1vZGVsID0gbnVsbDsKICAgIHRoaXMuc2lsZW50UHJpbnQgPSBudWxsOwogICAgdGhpcy5zdWJtaXRGb3JtYXQgPSBudWxsOwogICAgdGhpcy50YWdnZWQgPSBudWxsOwogICAgdGhpcy52ZXJzaW9uID0gbnVsbDsKICAgIHRoaXMudmlld2VyUHJlZmVyZW5jZXMgPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBQZGZhIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwZGZhIiwgdHJ1ZSk7CiAgICB0aGlzLmFtZCA9IG51bGw7CiAgICB0aGlzLmNvbmZvcm1hbmNlID0gbnVsbDsKICAgIHRoaXMuaW5jbHVkZVhEUENvbnRlbnQgPSBudWxsOwogICAgdGhpcy5wYXJ0ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGVybWlzc2lvbnMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBlcm1pc3Npb25zIiwgdHJ1ZSk7CiAgICB0aGlzLmFjY2Vzc2libGVDb250ZW50ID0gbnVsbDsKICAgIHRoaXMuY2hhbmdlID0gbnVsbDsKICAgIHRoaXMuY29udGVudENvcHkgPSBudWxsOwogICAgdGhpcy5kb2N1bWVudEFzc2VtYmx5ID0gbnVsbDsKICAgIHRoaXMuZm9ybUZpZWxkRmlsbGluZyA9IG51bGw7CiAgICB0aGlzLm1vZGlmeUFubm90cyA9IG51bGw7CiAgICB0aGlzLnBsYWludGV4dE1ldGFkYXRhID0gbnVsbDsKICAgIHRoaXMucHJpbnQgPSBudWxsOwogICAgdGhpcy5wcmludEhpZ2hRdWFsaXR5ID0gbnVsbDsKICB9Cn0KY2xhc3MgUGlja1RyYXlCeVBERlNpemUgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGlja1RyYXlCeVBERlNpemUiKTsKICB9Cn0KY2xhc3MgY29uZmlnX1BpY3R1cmUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBpY3R1cmUiKTsKICB9Cn0KY2xhc3MgUGxhaW50ZXh0TWV0YWRhdGEgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGxhaW50ZXh0TWV0YWRhdGEiKTsKICB9Cn0KY2xhc3MgUHJlc2VuY2UgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByZXNlbmNlIiwgWyJwcmVzZXJ2ZSIsICJkaXNzb2x2ZSIsICJkaXNzb2x2ZVN0cnVjdHVyZSIsICJpZ25vcmUiLCAicmVtb3ZlIl0pOwogIH0KfQpjbGFzcyBQcmVzZW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmVzZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmJlaGF2aW9yT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5jYWNoZSA9IG51bGw7CiAgICB0aGlzLmNvbW1vbiA9IG51bGw7CiAgICB0aGlzLmNvcGllcyA9IG51bGw7CiAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICAgIHRoaXMuaW5jcmVtZW50YWxNZXJnZSA9IG51bGw7CiAgICB0aGlzLmxheW91dCA9IG51bGw7CiAgICB0aGlzLm91dHB1dCA9IG51bGw7CiAgICB0aGlzLm92ZXJwcmludCA9IG51bGw7CiAgICB0aGlzLnBhZ2luYXRpb24gPSBudWxsOwogICAgdGhpcy5wYWdpbmF0aW9uT3ZlcnJpZGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZSA9IG51bGw7CiAgICB0aGlzLnhkcCA9IG51bGw7CiAgICB0aGlzLmRyaXZlciA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5sYWJlbFByaW50ZXIgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGNsID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLnBkZiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wcyA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJtaXRVcmwgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMud2ViQ2xpZW50ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnpwbCA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBQcmludCBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludCIpOwogIH0KfQpjbGFzcyBQcmludEhpZ2hRdWFsaXR5IGV4dGVuZHMgT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByaW50SGlnaFF1YWxpdHkiKTsKICB9Cn0KY2xhc3MgUHJpbnRTY2FsaW5nIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludFNjYWxpbmciLCBbImFwcGRlZmF1bHQiLCAibm9TY2FsaW5nIl0pOwogIH0KfQpjbGFzcyBQcmludGVyTmFtZSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJpbnRlck5hbWUiKTsKICB9Cn0KY2xhc3MgUHJvZHVjZXIgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByb2R1Y2VyIik7CiAgfQp9CmNsYXNzIFBzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcyIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuam9nID0gbnVsbDsKICAgIHRoaXMubWVkaXVtSW5mbyA9IG51bGw7CiAgICB0aGlzLm91dHB1dEJpbiA9IG51bGw7CiAgICB0aGlzLnN0YXBsZSA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFJhbmdlIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmFuZ2UiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMqLFxzKi8sIDIpLm1hcChyYW5nZSA9PiByYW5nZS5zcGxpdCgiLSIpLm1hcCh4ID0+IHBhcnNlSW50KHgudHJpbSgpLCAxMCkpKS5maWx0ZXIocmFuZ2UgPT4gcmFuZ2UuZXZlcnkoeCA9PiAhaXNOYU4oeCkpKS5tYXAocmFuZ2UgPT4gewogICAgICBpZiAocmFuZ2UubGVuZ3RoID09PSAxKSB7CiAgICAgICAgcmFuZ2UucHVzaChyYW5nZVswXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJhbmdlOwogICAgfSk7CiAgfQp9CmNsYXNzIFJlY29yZCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJlY29yZCIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgY29uc3QgbiA9IHBhcnNlSW50KHRoaXNbJGNvbnRlbnRdLCAxMCk7CiAgICBpZiAoIWlzTmFOKG4pICYmIG4gPj0gMCkgewogICAgICB0aGlzWyRjb250ZW50XSA9IG47CiAgICB9CiAgfQp9CmNsYXNzIFJlbGV2YW50IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicmVsZXZhbnQiKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzWyRjb250ZW50XSA9IHRoaXNbJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgfQp9CmNsYXNzIFJlbmFtZSBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJlbmFtZSIpOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF0udHJpbSgpOwogICAgaWYgKHRoaXNbJGNvbnRlbnRdLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgieG1sIikgfHwgbmV3IFJlZ0V4cCgiW1xccHtMfV9dW1xccHtMfVxcZC5fXFxwe019LV0qIiwgInUiKS50ZXN0KHRoaXNbJGNvbnRlbnRdKSkgewogICAgICB3YXJuKCJYRkEgLSBSZW5hbWU6IGludmFsaWQgWEZBIG5hbWUiKTsKICAgIH0KICB9Cn0KY2xhc3MgUmVuZGVyUG9saWN5IGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZW5kZXJQb2xpY3kiLCBbInNlcnZlciIsICJjbGllbnQiXSk7CiAgfQp9CmNsYXNzIFJ1blNjcmlwdHMgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJ1blNjcmlwdHMiLCBbImJvdGgiLCAiY2xpZW50IiwgIm5vbmUiLCAic2VydmVyIl0pOwogIH0KfQpjbGFzcyBjb25maWdfU2NyaXB0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzY3JpcHQiLCB0cnVlKTsKICAgIHRoaXMuY3VycmVudFBhZ2UgPSBudWxsOwogICAgdGhpcy5leGNsdWRlID0gbnVsbDsKICAgIHRoaXMucnVuU2NyaXB0cyA9IG51bGw7CiAgfQp9CmNsYXNzIFNjcmlwdE1vZGVsIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzY3JpcHRNb2RlbCIsIFsiWEZBIiwgIm5vbmUiXSk7CiAgfQp9CmNsYXNzIFNldmVyaXR5IGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzZXZlcml0eSIsIFsiaWdub3JlIiwgImVycm9yIiwgImluZm9ybWF0aW9uIiwgInRyYWNlIiwgIndhcm5pbmciXSk7CiAgfQp9CmNsYXNzIFNpbGVudFByaW50IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzaWxlbnRQcmludCIsIHRydWUpOwogICAgdGhpcy5hZGRTaWxlbnRQcmludCA9IG51bGw7CiAgICB0aGlzLnByaW50ZXJOYW1lID0gbnVsbDsKICB9Cn0KY2xhc3MgU3RhcGxlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzdGFwbGUiKTsKICAgIHRoaXMubW9kZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm1vZGUsIFsidXNlUHJpbnRlclNldHRpbmciLCAib24iLCAib2ZmIl0pOwogIH0KfQpjbGFzcyBTdGFydE5vZGUgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXJ0Tm9kZSIpOwogIH0KfQpjbGFzcyBTdGFydFBhZ2UgZXh0ZW5kcyBJbn
20RlZ2VyT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzdGFydFBhZ2UiLCAwLCBuID0+IHRydWUpOwogIH0KfQpjbGFzcyBTdWJtaXRGb3JtYXQgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1Ym1pdEZvcm1hdCIsIFsiaHRtbCIsICJkZWxlZ2F0ZSIsICJmZGYiLCAieG1sIiwgInBkZiJdKTsKICB9Cn0KY2xhc3MgU3VibWl0VXJsIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzdWJtaXRVcmwiKTsKICB9Cn0KY2xhc3MgU3Vic2V0QmVsb3cgZXh0ZW5kcyBJbnRlZ2VyT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzdWJzZXRCZWxvdyIsIDEwMCwgbiA9PiBuID49IDAgJiYgbiA8PSAxMDApOwogIH0KfQpjbGFzcyBTdXBwcmVzc0Jhbm5lciBleHRlbmRzIE9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJzdXBwcmVzc0Jhbm5lciIpOwogIH0KfQpjbGFzcyBUYWdnZWQgZXh0ZW5kcyBPcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidGFnZ2VkIik7CiAgfQp9CmNsYXNzIGNvbmZpZ19UZW1wbGF0ZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidGVtcGxhdGUiLCB0cnVlKTsKICAgIHRoaXMuYmFzZSA9IG51bGw7CiAgICB0aGlzLnJlbGV2YW50ID0gbnVsbDsKICAgIHRoaXMuc3RhcnRQYWdlID0gbnVsbDsKICAgIHRoaXMudXJpID0gbnVsbDsKICAgIHRoaXMueHNsID0gbnVsbDsKICB9Cn0KY2xhc3MgVGhyZXNob2xkIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0aHJlc2hvbGQiLCBbInRyYWNlIiwgImVycm9yIiwgImluZm9ybWF0aW9uIiwgIndhcm5pbmciXSk7CiAgfQp9CmNsYXNzIFRvIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0byIsIFsibnVsbCIsICJtZW1vcnkiLCAic3RkZXJyIiwgInN0ZG91dCIsICJzeXN0ZW0iLCAidXJpIl0pOwogIH0KfQpjbGFzcyBUZW1wbGF0ZUNhY2hlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0ZW1wbGF0ZUNhY2hlIik7CiAgICB0aGlzLm1heEVudHJpZXMgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXhFbnRyaWVzLAogICAgICBkZWZhdWx0VmFsdWU6IDUsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMAogICAgfSk7CiAgfQp9CmNsYXNzIFRyYWNlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0cmFjZSIsIHRydWUpOwogICAgdGhpcy5hcmVhID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgfQp9CmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidHJhbnNmb3JtIiwgdHJ1ZSk7CiAgICB0aGlzLmdyb3VwUGFyZW50ID0gbnVsbDsKICAgIHRoaXMuaWZFbXB0eSA9IG51bGw7CiAgICB0aGlzLm5hbWVBdHRyID0gbnVsbDsKICAgIHRoaXMucGljdHVyZSA9IG51bGw7CiAgICB0aGlzLnByZXNlbmNlID0gbnVsbDsKICAgIHRoaXMucmVuYW1lID0gbnVsbDsKICAgIHRoaXMud2hpdGVzcGFjZSA9IG51bGw7CiAgfQp9CmNsYXNzIFR5cGUgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInR5cGUiLCBbIm5vbmUiLCAiYXNjaWk4NSIsICJhc2NpaUhleCIsICJjY2l0dGZheCIsICJmbGF0ZSIsICJsenciLCAicnVuTGVuZ3RoIiwgIm5hdGl2ZSIsICJ4ZHAiLCAibWVyZ2VkWERQIl0pOwogIH0KfQpjbGFzcyBVcmkgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInVyaSIpOwogIH0KfQpjbGFzcyBjb25maWdfVmFsaWRhdGUgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZhbGlkYXRlIiwgWyJwcmVTdWJtaXQiLCAicHJlUHJpbnQiLCAicHJlRXhlY3V0ZSIsICJwcmVTYXZlIl0pOwogIH0KfQpjbGFzcyBWYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIik7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcih4ID0+IFsiZG9jUmVhZHkiLCAicG9zdFNpZ24iXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIFZhbGlkYXRpb25NZXNzYWdpbmcgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZhbGlkYXRpb25NZXNzYWdpbmciLCBbImFsbE1lc3NhZ2VzSW5kaXZpZHVhbGx5IiwgImFsbE1lc3NhZ2VzVG9nZXRoZXIiLCAiZmlyc3RNZXNzYWdlT25seSIsICJub01lc3NhZ2VzIl0pOwogIH0KfQpjbGFzcyBWZXJzaW9uIGV4dGVuZHMgT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ2ZXJzaW9uIiwgWyIxLjciLCAiMS42IiwgIjEuNSIsICIxLjQiLCAiMS4zIiwgIjEuMiJdKTsKICB9Cn0KY2xhc3MgVmVyc2lvbkNvbnRyb2wgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIlZlcnNpb25Db250cm9sIik7CiAgICB0aGlzLm91dHB1dEJlbG93ID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMub3V0cHV0QmVsb3csIFsid2FybiIsICJlcnJvciIsICJ1cGRhdGUiXSk7CiAgICB0aGlzLnNvdXJjZUFib3ZlID0gZ2V0U3RyaW5nT3B0aW9uKGF0dHJpYnV0ZXMuc291cmNlQWJvdmUsIFsid2FybiIsICJlcnJvciJdKTsKICAgIHRoaXMuc291cmNlQmVsb3cgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5zb3VyY2VCZWxvdywgWyJ1cGRhdGUiLCAibWFpbnRhaW4iXSk7CiAgfQp9CmNsYXNzIFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ2aWV3ZXJQcmVmZXJlbmNlcyIsIHRydWUpOwogICAgdGhpcy5BREJFX0pTQ29uc29sZSA9IG51bGw7CiAgICB0aGlzLkFEQkVfSlNEZWJ1Z2dlciA9IG51bGw7CiAgICB0aGlzLmFkZFZpZXdlclByZWZlcmVuY2VzID0gbnVsbDsKICAgIHRoaXMuZHVwbGV4T3B0aW9uID0gbnVsbDsKICAgIHRoaXMuZW5mb3JjZSA9IG51bGw7CiAgICB0aGlzLm51bWJlck9mQ29waWVzID0gbnVsbDsKICAgIHRoaXMucGFnZVJhbmdlID0gbnVsbDsKICAgIHRoaXMucGlja1RyYXlCeVBERlNpemUgPSBudWxsOwogICAgdGhpcy5wcmludFNjYWxpbmcgPSBudWxsOwogIH0KfQpjbGFzcyBXZWJDbGllbnQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndlYkNsaWVudCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFdoaXRlc3BhY2UgZXh0ZW5kcyBPcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndoaXRlc3BhY2UiLCBbInByZXNlcnZlIiwgImx0cmltIiwgIm5vcm1hbGl6ZSIsICJydHJpbSIsICJ0cmltIl0pOwogIH0KfQpjbGFzcyBXaW5kb3cgZXh0ZW5kcyBDb250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ3aW5kb3ciKTsKICB9CiAgWyRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBwYWlyID0gdGhpc1skY29udGVudF0udHJpbSgpLnNwbGl0KC9ccyosXHMqLywgMikubWFwKHggPT4gcGFyc2VJbnQoeCwgMTApKTsKICAgIGlmIChwYWlyLnNvbWUoeCA9PiBpc05hTih4KSkpIHsKICAgICAgdGhpc1skY29udGVudF0gPSBbMCwgMF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChwYWlyLmxlbmd0aCA9PT0gMSkgewogICAgICBwYWlyLnB1c2gocGFpclswXSk7CiAgICB9CiAgICB0aGlzWyRjb250ZW50XSA9IHBhaXI7CiAgfQp9CmNsYXNzIFhkYyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAieGRjIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy54c2wgPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgWGRwIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4ZHAiLCB0cnVlKTsKICAgIHRoaXMucGFja2V0cyA9IG51bGw7CiAgfQp9CmNsYXNzIFhzbCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAieHNsIiwgdHJ1ZSk7CiAgICB0aGlzLmRlYnVnID0gbnVsbDsKICAgIHRoaXMudXJpID0gbnVsbDsKICB9Cn0KY2xhc3MgWnBsIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ6cGwiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSA/IGF0dHJpYnV0ZXMubmFtZS50cmltKCkgOiAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mbGlwTGFiZWwgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIENvbmZpZ05hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChDb25maWdOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIENvbmZpZ05hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybi
20B1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBhY3JvYmF0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFjcm9iYXQoYXR0cnMpOwogIH0KICBzdGF0aWMgYWNyb2JhdDcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWNyb2JhdDcoYXR0cnMpOwogIH0KICBzdGF0aWMgQURCRV9KU0NvbnNvbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQURCRV9KU0NvbnNvbGUoYXR0cnMpOwogIH0KICBzdGF0aWMgQURCRV9KU0RlYnVnZ2VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFEQkVfSlNEZWJ1Z2dlcihhdHRycyk7CiAgfQogIHN0YXRpYyBhZGRTaWxlbnRQcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBBZGRTaWxlbnRQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBhZGRWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBBZGRWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycyk7CiAgfQogIHN0YXRpYyBhZGp1c3REYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkanVzdERhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgYWRvYmVFeHRlbnNpb25MZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBBZG9iZUV4dGVuc2lvbkxldmVsKGF0dHJzKTsKICB9CiAgc3RhdGljIGFnZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFnZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGFsd2F5c0VtYmVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFsd2F5c0VtYmVkKGF0dHJzKTsKICB9CiAgc3RhdGljIGFtZChhdHRycykgewogICAgcmV0dXJuIG5ldyBBbWQoYXR0cnMpOwogIH0KICBzdGF0aWMgYXJlYShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfQXJlYShhdHRycyk7CiAgfQogIHN0YXRpYyBhdHRyaWJ1dGVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgYXV0b1NhdmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXV0b1NhdmUoYXR0cnMpOwogIH0KICBzdGF0aWMgYmFzZShhdHRycykgewogICAgcmV0dXJuIG5ldyBCYXNlKGF0dHJzKTsKICB9CiAgc3RhdGljIGJhdGNoT3V0cHV0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhdGNoT3V0cHV0KGF0dHJzKTsKICB9CiAgc3RhdGljIGJlaGF2aW9yT3ZlcnJpZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQmVoYXZpb3JPdmVycmlkZShhdHRycyk7CiAgfQogIHN0YXRpYyBjYWNoZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDYWNoZShhdHRycyk7CiAgfQogIHN0YXRpYyBjaGFuZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2hhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbW1vbihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21tb24oYXR0cnMpOwogIH0KICBzdGF0aWMgY29tcHJlc3MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29tcHJlc3MoYXR0cnMpOwogIH0KICBzdGF0aWMgY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzTG9naWNhbFN0cnVjdHVyZShhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzc09iamVjdFN0cmVhbShhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21wcmVzc09iamVjdFN0cmVhbShhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzc2lvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbihhdHRycyk7CiAgfQogIHN0YXRpYyBjb25maWcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29uZmlnKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbmZvcm1hbmNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbmZvcm1hbmNlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbnRlbnRDb3B5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbnRlbnRDb3B5KGF0dHJzKTsKICB9CiAgc3RhdGljIGNvcGllcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb3BpZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgY3JlYXRvcihhdHRycykgewogICAgcmV0dXJuIG5ldyBDcmVhdG9yKGF0dHJzKTsKICB9CiAgc3RhdGljIGN1cnJlbnRQYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEN1cnJlbnRQYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGRhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0YShhdHRycyk7CiAgfQogIHN0YXRpYyBkZWJ1ZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWJ1ZyhhdHRycyk7CiAgfQogIHN0YXRpYyBkZWZhdWx0VHlwZWZhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVmYXVsdFR5cGVmYWNlKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlc3RpbmF0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERlc3RpbmF0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGRvY3VtZW50QXNzZW1ibHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRG9jdW1lbnRBc3NlbWJseShhdHRycyk7CiAgfQogIHN0YXRpYyBkcml2ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRHJpdmVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGR1cGxleE9wdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBEdXBsZXhPcHRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgZHluYW1pY1JlbmRlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBEeW5hbWljUmVuZGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGVtYmVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVtYmVkKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX0VuY3J5cHQoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25maWdfRW5jcnlwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTGV2ZWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbkxldmVsKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuZm9yY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5mb3JjZShhdHRycyk7CiAgfQogIHN0YXRpYyBlcXVhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXF1YXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVxdWF0ZVJhbmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVxdWF0ZVJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4Y2x1ZGUoYXR0cnMpIHsKICAgIHJldHVybi
20BuZXcgRXhjbHVkZShhdHRycyk7CiAgfQogIHN0YXRpYyBleGNsdWRlTlMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbHVkZU5TKGF0dHJzKTsKICB9CiAgc3RhdGljIGZsaXBMYWJlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBGbGlwTGFiZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgZm9udEluZm8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX0ZvbnRJbmZvKGF0dHJzKTsKICB9CiAgc3RhdGljIGZvcm1GaWVsZEZpbGxpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRm9ybUZpZWxkRmlsbGluZyhhdHRycyk7CiAgfQogIHN0YXRpYyBncm91cFBhcmVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBHcm91cFBhcmVudChhdHRycyk7CiAgfQogIHN0YXRpYyBpZkVtcHR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IElmRW1wdHkoYXR0cnMpOwogIH0KICBzdGF0aWMgaW5jbHVkZVhEUENvbnRlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jbHVkZVhEUENvbnRlbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgaW5jcmVtZW50YWxMb2FkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEluY3JlbWVudGFsTG9hZChhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNyZW1lbnRhbE1lcmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEluY3JlbWVudGFsTWVyZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgaW50ZXJhY3RpdmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW50ZXJhY3RpdmUoYXR0cnMpOwogIH0KICBzdGF0aWMgam9nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEpvZyhhdHRycyk7CiAgfQogIHN0YXRpYyBsYWJlbFByaW50ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGFiZWxQcmludGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGxheW91dChhdHRycykgewogICAgcmV0dXJuIG5ldyBMYXlvdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgbGV2ZWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTGV2ZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgbGluZWFyaXplZChhdHRycykgewogICAgcmV0dXJuIG5ldyBMaW5lYXJpemVkKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2FsZShhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2NhbGUoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9jYWxlU2V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExvY2FsZVNldChhdHRycyk7CiAgfQogIHN0YXRpYyBsb2coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTG9nKGF0dHJzKTsKICB9CiAgc3RhdGljIG1hcChhdHRycykgewogICAgcmV0dXJuIG5ldyBNYXBFbGVtZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIG1lZGl1bUluZm8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVkaXVtSW5mbyhhdHRycyk7CiAgfQogIHN0YXRpYyBtZXNzYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19NZXNzYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lc3NhZ2luZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXNzYWdpbmcoYXR0cnMpOwogIH0KICBzdGF0aWMgbW9kZShhdHRycykgewogICAgcmV0dXJuIG5ldyBNb2RlKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vZGlmeUFubm90cyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNb2RpZnlBbm5vdHMoYXR0cnMpOwogIH0KICBzdGF0aWMgbXNnSWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTXNnSWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbmFtZUF0dHIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTmFtZUF0dHIoYXR0cnMpOwogIH0KICBzdGF0aWMgbmV2ZXJFbWJlZChhdHRycykgewogICAgcmV0dXJuIG5ldyBOZXZlckVtYmVkKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWJlck9mQ29waWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlck9mQ29waWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIG9wZW5BY3Rpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3BlbkFjdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBvdXRwdXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3V0cHV0KGF0dHJzKTsKICB9CiAgc3RhdGljIG91dHB1dEJpbihhdHRycykgewogICAgcmV0dXJuIG5ldyBPdXRwdXRCaW4oYXR0cnMpOwogIH0KICBzdGF0aWMgb3V0cHV0WFNMKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE91dHB1dFhTTChhdHRycyk7CiAgfQogIHN0YXRpYyBvdmVycHJpbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3ZlcnByaW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhY2tldHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFja2V0cyhhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdlT2Zmc2V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2VPZmZzZXQoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFnZVJhbmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2VSYW5nZShhdHRycyk7CiAgfQogIHN0YXRpYyBwYWdpbmF0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2luYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgcGFnaW5hdGlvbk92ZXJyaWRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhZ2luYXRpb25PdmVycmlkZShhdHRycyk7CiAgfQogIHN0YXRpYyBwYXJ0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhcnQoYXR0cnMpOwogIH0KICBzdGF0aWMgcGNsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBjbChhdHRycyk7CiAgfQogIHN0YXRpYyBwZGYoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGRmKGF0dHJzKTsKICB9CiAgc3RhdGljIHBkZmEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGRmYShhdHRycyk7CiAgfQogIHN0YXRpYyBwZXJtaXNzaW9ucyhhdHRycykgewogICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9ucyhhdHRycyk7CiAgfQogIHN0YXRpYyBwaWNrVHJheUJ5UERGU2l6ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQaWNrVHJheUJ5UERGU2l6ZShhdHRycyk7CiAgfQogIHN0YXRpYyBwaWN0dXJlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19QaWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBsYWludGV4dE1ldGFkYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBsYWludGV4dE1ldGFkYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIHByZXNlbmNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByZXNlbmNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHByZXNlbnQoYXR0cnMpIHsKICAgIHJldHVybi
20BuZXcgUHJlc2VudChhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludEhpZ2hRdWFsaXR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50SGlnaFF1YWxpdHkoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJpbnRTY2FsaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50U2NhbGluZyhhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludGVyTmFtZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmludGVyTmFtZShhdHRycyk7CiAgfQogIHN0YXRpYyBwcm9kdWNlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBQcm9kdWNlcihhdHRycyk7CiAgfQogIHN0YXRpYyBwcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBQcyhhdHRycyk7CiAgfQogIHN0YXRpYyByYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBSYW5nZShhdHRycyk7CiAgfQogIHN0YXRpYyByZWNvcmQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVjb3JkKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlbGV2YW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbGV2YW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHJlbmFtZShhdHRycykgewogICAgcmV0dXJuIG5ldyBSZW5hbWUoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVuZGVyUG9saWN5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbmRlclBvbGljeShhdHRycyk7CiAgfQogIHN0YXRpYyBydW5TY3JpcHRzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJ1blNjcmlwdHMoYXR0cnMpOwogIH0KICBzdGF0aWMgc2NyaXB0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGNvbmZpZ19TY3JpcHQoYXR0cnMpOwogIH0KICBzdGF0aWMgc2NyaXB0TW9kZWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2NyaXB0TW9kZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgc2V2ZXJpdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2V2ZXJpdHkoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lsZW50UHJpbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2lsZW50UHJpbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgc3RhcGxlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN0YXBsZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdGFydE5vZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RhcnROb2RlKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0YXJ0UGFnZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTdGFydFBhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgc3VibWl0Rm9ybWF0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1Ym1pdEZvcm1hdChhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJtaXRVcmwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VibWl0VXJsKGF0dHJzKTsKICB9CiAgc3RhdGljIHN1YnNldEJlbG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YnNldEJlbG93KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1cHByZXNzQmFubmVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1cHByZXNzQmFubmVyKGF0dHJzKTsKICB9CiAgc3RhdGljIHRhZ2dlZChhdHRycykgewogICAgcmV0dXJuIG5ldyBUYWdnZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGVtcGxhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1RlbXBsYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHRlbXBsYXRlQ2FjaGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGVtcGxhdGVDYWNoZShhdHRycyk7CiAgfQogIHN0YXRpYyB0aHJlc2hvbGQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGhyZXNob2xkKGF0dHJzKTsKICB9CiAgc3RhdGljIHRvKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRvKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYWNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRyYWNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYW5zZm9ybShhdHRycykgewogICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm0oYXR0cnMpOwogIH0KICBzdGF0aWMgdHlwZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUeXBlKGF0dHJzKTsKICB9CiAgc3RhdGljIHVyaShhdHRycykgewogICAgcmV0dXJuIG5ldyBVcmkoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgY29uZmlnX1ZhbGlkYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRpb25NZXNzYWdpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2luZyhhdHRycyk7CiAgfQogIHN0YXRpYyB2ZXJzaW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZlcnNpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgdmVyc2lvbkNvbnRyb2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmVyc2lvbkNvbnRyb2woYXR0cnMpOwogIH0KICBzdGF0aWMgdmlld2VyUHJlZmVyZW5jZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmlld2VyUHJlZmVyZW5jZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgd2ViQ2xpZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFdlYkNsaWVudChhdHRycyk7CiAgfQogIHN0YXRpYyB3aGl0ZXNwYWNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFdoaXRlc3BhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgd2luZG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFdpbmRvdyhhdHRycyk7CiAgfQogIHN0YXRpYyB4ZGMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWGRjKGF0dHJzKTsKICB9CiAgc3RhdGljIHhkcChhdHRycykgewogICAgcmV0dXJuIG5ldyBYZHAoYXR0cnMpOwogIH0KICBzdGF0aWMgeHNsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhzbChhdHRycyk7CiAgfQogIHN0YXRpYyB6cGwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWnBsKGF0dHJzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9jb25uZWN0aW9uX3NldC5qcwoKCmNvbnN0IENPTk5FQ1RJT05fU0VUX05TX0lEID0gTmFtZXNwYWNlSWRzLmNvbm5lY3Rpb25TZXQuaWQ7CmNsYXNzIENvbm5lY3Rpb25TZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiY29ubmVjdGlvblNldCIsIHRydWUpOwogICAgdGhpcy53c2RsQ29ubmVjdGlvbiA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy54bWxDb25uZWN0aW9uID0gbmV3IFhGQU9iamVjdEFycmF
205KCk7CiAgICB0aGlzLnhzZENvbm5lY3Rpb24gPSBuZXcgWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRWZmZWN0aXZlSW5wdXRQb2xpY3kgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiZWZmZWN0aXZlSW5wdXRQb2xpY3kiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRWZmZWN0aXZlT3V0cHV0UG9saWN5IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgImVmZmVjdGl2ZU91dHB1dFBvbGljeSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBPcGVyYXRpb24gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAib3BlcmF0aW9uIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW5wdXQgPSBhdHRyaWJ1dGVzLmlucHV0IHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5vdXRwdXQgPSBhdHRyaWJ1dGVzLm91dHB1dCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFJvb3RFbGVtZW50IGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInJvb3RFbGVtZW50Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNvYXBBY3Rpb24gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAic29hcEFjdGlvbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTb2FwQWRkcmVzcyBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJzb2FwQWRkcmVzcyIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBjb25uZWN0aW9uX3NldF9VcmkgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAidXJpIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFdzZGxBZGRyZXNzIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgIndzZGxBZGRyZXNzIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFdzZGxDb25uZWN0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgIndzZGxDb25uZWN0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGFEZXNjcmlwdGlvbiA9IGF0dHJpYnV0ZXMuZGF0YURlc2NyaXB0aW9uIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5lZmZlY3RpdmVJbnB1dFBvbGljeSA9IG51bGw7CiAgICB0aGlzLmVmZmVjdGl2ZU91dHB1dFBvbGljeSA9IG51bGw7CiAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7CiAgICB0aGlzLnNvYXBBY3Rpb24gPSBudWxsOwogICAgdGhpcy5zb2FwQWRkcmVzcyA9IG51bGw7CiAgICB0aGlzLndzZGxBZGRyZXNzID0gbnVsbDsKICB9Cn0KY2xhc3MgWG1sQ29ubmVjdGlvbiBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJ4bWxDb25uZWN0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGFEZXNjcmlwdGlvbiA9IGF0dHJpYnV0ZXMuZGF0YURlc2NyaXB0aW9uIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBYc2RDb25uZWN0aW9uIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInhzZENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJvb3RFbGVtZW50ID0gbnVsbDsKICAgIHRoaXMudXJpID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29ubmVjdGlvblNldE5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChDb25uZWN0aW9uU2V0TmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgI
20HJldHVybiBDb25uZWN0aW9uU2V0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGNvbm5lY3Rpb25TZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblNldChhdHRycyk7CiAgfQogIHN0YXRpYyBlZmZlY3RpdmVJbnB1dFBvbGljeShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZmZlY3RpdmVJbnB1dFBvbGljeShhdHRycyk7CiAgfQogIHN0YXRpYyBlZmZlY3RpdmVPdXRwdXRQb2xpY3koYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRWZmZWN0aXZlT3V0cHV0UG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIG9wZXJhdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBPcGVyYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgcm9vdEVsZW1lbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUm9vdEVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgc29hcEFjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBTb2FwQWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIHNvYXBBZGRyZXNzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvYXBBZGRyZXNzKGF0dHJzKTsKICB9CiAgc3RhdGljIHVyaShhdHRycykgewogICAgcmV0dXJuIG5ldyBjb25uZWN0aW9uX3NldF9VcmkoYXR0cnMpOwogIH0KICBzdGF0aWMgd3NkbEFkZHJlc3MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV3NkbEFkZHJlc3MoYXR0cnMpOwogIH0KICBzdGF0aWMgd3NkbENvbm5lY3Rpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV3NkbENvbm5lY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgeG1sQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBYbWxDb25uZWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIHhzZENvbm5lY3Rpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWHNkQ29ubmVjdGlvbihhdHRycyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvZGF0YXNldHMuanMKCgoKY29uc3QgREFUQVNFVFNfTlNfSUQgPSBOYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7CmNsYXNzIGRhdGFzZXRzX0RhdGEgZXh0ZW5kcyBYbWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKERBVEFTRVRTX05TX0lELCAiZGF0YSIsIGF0dHJpYnV0ZXMpOwogIH0KICBbJGlzTnNBZ25vc3RpY10oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KY2xhc3MgRGF0YXNldHMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKERBVEFTRVRTX05TX0lELCAiZGF0YXNldHMiLCB0cnVlKTsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgICB0aGlzLlNpZ25hdHVyZSA9IG51bGw7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIGNvbnN0IG5hbWUgPSBjaGlsZFskbm9kZU5hbWVdOwogICAgaWYgKG5hbWUgPT09ICJkYXRhIiAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSBEQVRBU0VUU19OU19JRCB8fCBuYW1lID09PSAiU2lnbmF0dXJlIiAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSBOYW1lc3BhY2VJZHMuc2lnbmF0dXJlLmlkKSB7CiAgICAgIHRoaXNbbmFtZV0gPSBjaGlsZDsKICAgIH0KICAgIHRoaXNbJGFwcGVuZENoaWxkXShjaGlsZCk7CiAgfQp9CmNsYXNzIERhdGFzZXRzTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKERhdGFzZXRzTmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBEYXRhc2V0c05hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBkYXRhc2V0cyhhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IERhdGFzZXRzKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgZGF0YShhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IGRhdGFzZXRzX0RhdGEoYXR0cmlidXRlcyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvbG9jYWxlX3NldC5qcwoKCgpjb25zdCBMT0NBTEVfU0VUX05TX0lEID0gTmFtZXNwYWNlSWRzLmxvY2FsZVNldC5pZDsKY2xhc3MgQ2FsZW5kYXJTeW1ib2xzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiY2FsZW5kYXJTeW1ib2xzIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSAiZ3JlZ29yaWFuIjsKICAgIHRoaXMuZGF5TmFtZXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgICB0aGlzLmVyYU5hbWVzID0gbnVsbDsKICAgIHRoaXMubWVyaWRpZW1OYW1lcyA9IG51bGw7CiAgICB0aGlzLm1vbnRoTmFtZXMgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgfQp9CmNsYXNzIEN1cnJlbmN5U3ltYm9sIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiY3VycmVuY3lTeW1ib2wiKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsic3ltYm9sIiwgImlzb25hbWUiLCAiZGVjaW1hbCJdKTsKICB9Cn0KY2xhc3MgQ3VycmVuY3lTeW1ib2xzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiY3VycmVuY3lTeW1ib2xzIiwgdHJ1ZSk7CiAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID0gbmV3IFhGQU9iamVjdEFycmF
205KDMpOwogIH0KfQpjbGFzcyBEYXRlUGF0dGVybiBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRhdGVQYXR0ZXJuIik7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbImZ1bGwiLCAibG9uZyIsICJtZWQiLCAic2hvcnQiXSk7CiAgfQp9CmNsYXNzIERhdGVQYXR0ZXJucyBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRhdGVQYXR0ZXJucyIsIHRydWUpOwogICAgdGhpcy5kYXRlUGF0dGVybiA9IG5ldyBYRkFPYmplY3RBcnJheSg0KTsKICB9Cn0KY2xhc3MgRGF0ZVRpbWVTeW1ib2xzIGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImRhdGVUaW1lU3ltYm9scyIpOwogIH0KfQpjbGFzcyBEYXkgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJkYXkiKTsKICB9Cn0KY2xhc3MgRGF5TmFtZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJkYXlOYW1lcyIsIHRydWUpOwogICAgdGhpcy5hYmJyID0gZ2V0SW50ZWdlcih7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuYWJiciwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuZGF5ID0gbmV3IFhGQU9iamVjdEFycmF
205KDcpOwogIH0KfQpjbGFzcyBFcmEgZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJlcmEiKTsKICB9Cn0KY2xhc3MgRXJhTmFtZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJlcmFOYW1lcyIsIHRydWUpOwogICAgdGhpcy5lcmEgPSBuZXcgWEZBT2JqZWN0QXJyYXkoMik7CiAgfQp9CmNsYXNzIGxvY2FsZV9zZXRfTG9jYWxlIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibG9jYWxlIiwgdHJ1ZSk7CiAgICB0aGlzLmRlc2MgPSBhdHRyaWJ1dGVzLmRlc2MgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSAiaXNvbmFtZSI7CiAgICB0aGlzLmNhbGVuZGFyU3ltYm9scyA9IG51bGw7CiAgICB0aGlzLmN1cnJlbmN5U3ltYm9scyA9IG51bGw7CiAgICB0aGlzLmRhdGVQYXR0ZXJucyA9IG51bGw7CiAgICB0aGlzLmRhdGVUaW1lU3ltYm9scyA9IG51bGw7CiAgICB0aGlzLm51bWJlclBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMubnVtYmVyU3ltYm9scyA9IG51bGw7CiAgICB0aGlzLnRpbWVQYXR0ZXJucyA9IG51bGw7CiAgICB0aGlzLnR5cGVGYWNlcyA9IG51bGw7CiAgfQp9CmNsYXNzIGxvY2FsZV9zZXRfTG9jYWxlU2V0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibG9jYWxlU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmxvY2FsZSA9IG5ldyBYRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNZXJpZGllbSBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1lcmlkaWVtIik7CiAgfQp9CmNsYXNzIE1lcmlkaWVtTmFtZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJtZXJpZGllbU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLm1lcmlkaWVtID0gbmV3IFhGQU9iamVjdEFycmF
205KDIpOwogIH0KfQpjbGFzcyBNb250aCBleHRlbmRzIFN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1vbnRoIik7CiAgfQp9CmNsYXNzIE1vbnRoTmFtZXMgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJtb250aE5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmFiYnIgPSBnZXRJbnRlZ2VyKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hYmJyLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5tb250aCA9IG5ldyBYRkFPYmplY3RBcnJheSgxMik7CiAgfQp9CmNsYXNzIE51bWJlclBhdHRlcm4gZXh0ZW5kcyBTdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJQYXR0ZXJuIik7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbImZ1bGwiLCAibG9uZyIsICJtZWQiLCAic2hvcnQiXSk7CiAgfQp9CmNsYXNzIE51bWJlclBhdHRlcm5zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibnVtYmVyUGF0dGVybnMiLCB0cnVlKTsKICAgIHRoaXMubnVtYmVyUGF0dGVybiA9IG5ldyBYRkFPYmplY3RBcnJheSg0KTsKICB9Cn0KY2xhc3MgTnVtYmVyU3ltYm9sIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibnVtYmVyU3ltYm9sIik7CiAgICB0aGlzLm5hbWUgPSBnZXRTdHJpbmdPcHRpb24oYXR0cmlidXRlcy5uYW1lLCBbImRlY2ltYWwiLCAiZ3JvdXBpbmciLCAicGVyY2VudCIsICJtaW51cyIsICJ6ZXJvIl0pOwogIH0KfQpjbGFzcyBOdW1iZXJTeW1ib2xzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibnVtYmVyU3ltYm9scyIsIHRydWUpOwogICAgdGhpcy5udW1iZXJTeW1ib2wgPSBuZXcgWEZBT2JqZWN0QXJyYXkoNSk7CiAgfQp9CmNsYXNzIFRpbWVQYXR0ZXJuIGV4dGVuZHMgU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidGltZVBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9IGdldFN0cmluZ09wdGlvbihhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgVGltZVBhdHRlcm5zIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidGltZVBhdHRlcm5zIiwgdHJ1ZSk7CiAgICB0aGlzLnRpbWVQYXR0ZXJuID0gbmV3IFhGQU9iamVjdEFycmF
205KDQpOwogIH0KfQpjbGFzcyBUeXBlRmFjZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgInR5cGVGYWNlIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfCAiIjsKICB9Cn0KY2xhc3MgVHlwZUZhY2VzIGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidHlwZUZhY2VzIiwgdHJ1ZSk7CiAgICB0aGlzLnR5cGVGYWNlID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIExvY2FsZVNldE5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChMb2NhbGVTZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIExvY2FsZVNldE5hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBjYWxlbmRhclN5bWJvbHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FsZW5kYXJTeW1ib2xzKGF0dHJzKTsKICB9CiAgc3RhdGljIGN1cnJlbmN5U3ltYm9sKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEN1cnJlbmN5U3ltYm9sKGF0dHJzKTsKICB9CiAgc3RhdGljIGN1cnJlbmN5U3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDdXJyZW5jeVN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZVBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZVBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERhdGVQYXR0ZXJucyhhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZVN5bWJvbHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWVTeW1ib2xzKGF0dHJzKTsKICB9CiAgc3RhdGljIGRheShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXkoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF5TmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF5TmFtZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgZXJhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVyYShhdHRycyk7CiAgfQogIHN0YXRpYyBlcmFOYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFcmFOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgbG9jYWxlX3NldF9Mb2NhbGUoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9jYWxlU2V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IGxvY2FsZV9zZXRfTG9jYWxlU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIG1lcmlkaWVtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1lcmlkaWVtKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lcmlkaWVtTmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVyaWRpZW1OYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBtb250aChhdHRycykgewogICAgcmV0dXJuIG5ldyBNb250aChhdHRycyk7CiAgfQogIHN0YXRpYyBtb250aE5hbWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vbnRoTmFtZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyUGF0dGVybihhdHRycykgewogICAgcmV0dXJuIG5ldyBOdW1iZXJQYXR0ZXJuKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWJlclBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclBhdHRlcm5zKGF0dHJzKTsKICB9CiAgc3RhdGljIG51bWJlclN5bWJvbChhdHRycykgewogICAgcmV0dXJuIG5ldyBOdW1iZXJTeW1ib2woYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyU3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBOdW1iZXJTeW1ib2xzKGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWVQYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRpbWVQYXR0ZXJuKGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWVQYXR0ZXJucyhhdHRycykgewogICAgcmV0dXJuIG5ldyBUaW1lUGF0dGVybnMoYXR0cnMpOwogIH0KICBzdGF0aWMgdHlwZUZhY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHlwZUZhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgdHlwZUZhY2VzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFR5cGVGYWNlcyhhdHRycyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEvc2lnbmF0dXJlLmpzCgoKY29uc3QgU0lHTkFUVVJFX05TX0lEID0gTmFtZXNwYWNlSWRzLnNpZ25hdHVyZS5pZDsKY2xhc3Mgc2lnbmF0dXJlX1NpZ25hdHVyZSBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoU0lHTkFUVVJFX05TX0lELCAic2lnbmF0dXJlIiwgdHJ1ZSk7CiAgfQp9CmNsYXNzIFNpZ25hdHVyZU5hbWVzcGFjZSB7CiAgc3RhdGljIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChTaWduYXR1cmVOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIFNpZ25hdHVyZU5hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBzaWduYXR1cmUoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBzaWduYXR1cmVfU2lnbmF0dXJlKGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL3N0eWxlc2hlZXQuanMKCgpjb25zdCBTVFlMRVNIRUVUX05TX0lEID0gTmFtZXNwYWNlSWRzLnN0eWxlc2hlZXQuaWQ7CmNsYXNzIFN0eWxlc2hlZXQgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFNUWUxFU0hFRVRfTlNfSUQsICJzdHlsZXNoZWV0IiwgdHJ1ZSk7CiAgfQp9CmNsYXNzIFN0eWxlc2hlZXROYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoU3R5bGVzaGVldE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gU3R5bGVzaGVldE5hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybi
20B1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBzdHlsZXNoZWV0KGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3R5bGVzaGVldChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS94ZHAuanMKCgoKY29uc3QgWERQX05TX0lEID0gTmFtZXNwYWNlSWRzLnhkcC5pZDsKY2xhc3MgeGRwX1hkcCBleHRlbmRzIFhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoWERQX05TX0lELCAieGRwIiwgdHJ1ZSk7CiAgICB0aGlzLnV1aWQgPSBhdHRyaWJ1dGVzLnV1aWQgfHwgIiI7CiAgICB0aGlzLnRpbWVTdGFtcCA9IGF0dHJpYnV0ZXMudGltZVN0YW1wIHx8ICIiOwogICAgdGhpcy5jb25maWcgPSBudWxsOwogICAgdGhpcy5jb25uZWN0aW9uU2V0ID0gbnVsbDsKICAgIHRoaXMuZGF0YXNldHMgPSBudWxsOwogICAgdGhpcy5sb2NhbGVTZXQgPSBudWxsOwogICAgdGhpcy5zdHlsZXNoZWV0ID0gbmV3IFhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRlbXBsYXRlID0gbnVsbDsKICB9CiAgWyRvbkNoaWxkQ2hlY2tdKGNoaWxkKSB7CiAgICBjb25zdCBucyA9IE5hbWVzcGFjZUlkc1tjaGlsZFskbm9kZU5hbWVdXTsKICAgIHJldHVybiBucyAmJiBjaGlsZFskbmFtZXNwYWNlSWRdID09PSBucy5pZDsKICB9Cn0KY2xhc3MgWGRwTmFtZXNwYWNlIHsKICBzdGF0aWMgWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFhkcE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gWGRwTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHhkcChhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IHhkcF9YZHAoYXR0cmlidXRlcyk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS94ZmEveGh0bWwuanMKCgoKCgoKCgoKCgoKCgoKY29uc3QgWEhUTUxfTlNfSUQgPSBOYW1lc3BhY2VJZHMueGh0bWwuaWQ7CmNvbnN0ICRyaWNoVGV4dCA9IFN5bWJvbCgpOwpjb25zdCBWQUxJRF9TVFlMRVMgPSBuZXcgU2V0KFsiY29sb3IiLCAiZm9udCIsICJmb250LWZhbWlseSIsICJmb250LXNpemUiLCAiZm9udC1zdHJldGNoIiwgImZvbnQtc3R5bGUiLCAiZm9udC13ZWlnaHQiLCAibWFyZ2luIiwgIm1hcmdpbi1ib3R0b20iLCAibWFyZ2luLWxlZnQiLCAibWFyZ2luLXJpZ2h0IiwgIm1hcmdpbi10b3AiLCAibGV0dGVyLXNwYWNpbmciLCAibGluZS1oZWlnaHQiLCAib3JwaGFucyIsICJwYWdlLWJyZWFrLWFmdGVyIiwgInBhZ2UtYnJlYWstYmVmb3JlIiwgInBhZ2UtYnJlYWstaW5zaWRlIiwgInRhYi1pbnRlcnZhbCIsICJ0YWItc3RvcCIsICJ0ZXh0LWFsaWduIiwgInRleHQtZGVjb3JhdGlvbiIsICJ0ZXh0LWluZGVudCIsICJ2ZXJ0aWNhbC1hbGlnbiIsICJ3aWRvd3MiLCAia2VybmluZy1tb2RlIiwgInhmYS1mb250LWhvcml6b250YWwtc2NhbGUiLCAieGZhLWZvbnQtdmVydGljYWwtc2NhbGUiLCAieGZhLXNwYWNlcnVuIiwgInhmYS10YWItc3RvcHMiXSk7CmNvbnN0IFN0eWxlTWFwcGluZyA9IG5ldyBNYXAoW1sicGFnZS1icmVhay1hZnRlciIsICJicmVha0FmdGVyIl0sIFsicGFnZS1icmVhay1iZWZvcmUiLCAiYnJlYWtCZWZvcmUiXSwgWyJwYWdlLWJyZWFrLWluc2lkZSIsICJicmVha0luc2lkZSJdLCBbImtlcm5pbmctbW9kZSIsIHZhbHVlID0+IHZhbHVlID09PSAibm9uZSIgPyAibm9uZSIgOiAibm9ybWFsIl0sIFsieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIsIHZhbHVlID0+IGBzY2FsZVgoJHtNYXRoLm1heCgwLCBNYXRoLm1pbihwYXJzZUludCh2YWx1ZSkgLyAxMDApKS50b0ZpeGVkKDIpfSlgXSwgWyJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsIHZhbHVlID0+IGBzY2FsZVkoJHtNYXRoLm1heCgwLCBNYXRoLm1pbihwYXJzZUludCh2YWx1ZSkgLyAxMDApKS50b0ZpeGVkKDIpfSlgXSwgWyJ4ZmEtc3BhY2VydW4iLCAiIl0sIFsieGZhLXRhYi1zdG9wcyIsICIiXSwgWyJmb250LXNpemUiLCAodmFsdWUsIG9yaWdpbmFsKSA9PiB7CiAgdmFsdWUgPSBvcmlnaW5hbC5mb250U2l6ZSA9IE1hdGguYWJzKGdldE1lYXN1cmVtZW50KHZhbHVlKSk7CiAgcmV0dXJuIG1lYXN1cmVUb1N0cmluZygwLjk5ICogdmFsdWUpOwp9XSwgWyJsZXR0ZXItc3BhY2luZyIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJsaW5lLWhlaWdodCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4iLCB2YWx1ZSA9PiBtZWFzdXJlVG9TdHJpbmcoZ2V0TWVhc3VyZW1lbnQodmFsdWUpKV0sIFsibWFyZ2luLWJvdHRvbSIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tbGVmdCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJtYXJnaW4tcmlnaHQiLCB2YWx1ZSA9PiBtZWFzdXJlVG9TdHJpbmcoZ2V0TWVhc3VyZW1lbnQodmFsdWUpKV0sIFsibWFyZ2luLXRvcCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJ0ZXh0LWluZGVudCIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXSwgWyJmb250LWZhbWlseSIsIHZhbHVlID0+IHZhbHVlXSwgWyJ2ZXJ0aWNhbC1hbGlnbiIsIHZhbHVlID0+IG1lYXN1cmVUb1N0cmluZyhnZXRNZWFzdXJlbWVudCh2YWx1ZSkpXV0pOwpjb25zdCBzcGFjZXNSZWdFeHAgPSAvXHMrL2c7CmNvbnN0IGNybGZSZWdFeHAgPSAvW1xyXG5dKy9nOwpjb25zdCBjcmxmRm9yUmljaFRleHRSZWdFeHAgPSAvXHJcbj8vZzsKZnVuY3Rpb24gbWFwU3R5bGUoc3R5bGVTdHIsIG5vZGUsIHJpY2hUZXh0KSB7CiAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmICghc3R5bGVTdHIpIHsKICAgIHJldHVybiBzdHlsZTsKICB9CiAgY29uc3Qgb3JpZ2luYWwgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0eWxlU3RyLnNwbGl0KCI7IikubWFwKHMgPT4gcy5zcGxpdCgiOiIsIDIpKSkgewogICAgY29uc3QgbWFwcGluZyA9IFN0eWxlTWFwcGluZy5nZXQoa2V5KTsKICAgIGlmIChtYXBwaW5nID09PSAiIikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlOwogICAgaWYgKG1hcHBpbmcpIHsKICAgICAgbmV3VmFsdWUgPSB0eXBlb2YgbWFwcGluZyA9PT0gInN0cmluZyIgPyBtYXBwaW5nIDogbWFwcGluZyh2YWx1ZSwgb3JpZ2luYWwpOwogICAgfQogICAgaWYgKGtleS5lbmRzV2l0aCgic2NhbGUiKSkgewogICAgICBzdHlsZS50cmFuc2Zvcm0gPSBzdHlsZS50cmFuc2Zvcm0gPyBgJHtzdHlsZVtrZXldfSAke25ld1ZhbHVlfWAgOiBuZXdWYWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgI
20HN0eWxlW2tleS5yZXBsYWNlQWxsKC8tKFthLXpBLVpdKS9nLCAoXywgeCkgPT4geC50b1VwcGVyQ2FzZSgpKV0gPSBuZXdWYWx1ZTsKICAgIH0KICB9CiAgaWYgKHN0eWxlLmZvbnRGYW1pbHkpIHsKICAgIHNldEZvbnRGYW1pbHkoewogICAgICB0eXBlZmFjZTogc3R5bGUuZm9udEZhbWlseSwKICAgICAgd2VpZ2h0OiBzdHlsZS5mb250V2VpZ2h0IHx8ICJub3JtYWwiLAogICAgICBwb3N0dXJlOiBzdHlsZS5mb250U3R5bGUgfHwgIm5vcm1hbCIsCiAgICAgIHNpemU6IG9yaWdpbmFsLmZvbnRTaXplIHx8IDAKICAgIH0sIG5vZGUsIG5vZGVbJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIsIHN0eWxlKTsKICB9CiAgaWYgKHJpY2hUZXh0ICYmIHN0eWxlLnZlcnRpY2FsQWxpZ24gJiYgc3R5bGUudmVydGljYWxBbGlnbiAhPT0gIjBweCIgJiYgc3R5bGUuZm9udFNpemUpIHsKICAgIGNvbnN0IFNVQl9TVVBFUl9TQ1JJUFRfRkFDVE9SID0gMC41ODM7CiAgICBjb25zdCBWRVJUSUNBTF9GQUNUT1IgPSAwLjMzMzsKICAgIGNvbnN0IGZvbnRTaXplID0gZ2V0TWVhc3VyZW1lbnQoc3R5bGUuZm9udFNpemUpOwogICAgc3R5bGUuZm9udFNpemUgPSBtZWFzdXJlVG9TdHJpbmcoZm9udFNpemUgKiBTVUJfU1VQRVJfU0NSSVBUX0ZBQ1RPUik7CiAgICBzdHlsZS52ZXJ0aWNhbEFsaWduID0gbWVhc3VyZVRvU3RyaW5nKE1hdGguc2lnbihnZXRNZWFzdXJlbWVudChzdHlsZS52ZXJ0aWNhbEFsaWduKSkgKiBmb250U2l6ZSAqIFZFUlRJQ0FMX0ZBQ1RPUik7CiAgfQogIGlmIChyaWNoVGV4dCAmJiBzdHlsZS5mb250U2l6ZSkgewogICAgc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3N0eWxlLmZvbnRTaXplfSAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDsKICB9CiAgZml4VGV4dEluZGVudChzdHlsZSk7CiAgcmV0dXJuIHN0eWxlOwp9CmZ1bmN0aW9uIGNoZWNrU3R5bGUobm9kZSkgewogIGlmICghbm9kZS5zdHlsZSkgewogICAgcmV0dXJuICIiOwogIH0KICByZXR1cm4gbm9kZS5zdHlsZS50cmltKCkuc3BsaXQoL1xzKjtccyovKS5maWx0ZXIocyA9PiAhIXMpLm1hcChzID0+IHMuc3BsaXQoL1xzKjpccyovLCAyKSkuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHsKICAgIGlmIChrZXkgPT09ICJmb250LWZhbWlseSIpIHsKICAgICAgbm9kZVskZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIFZBTElEX1NUWUxFUy5oYXMoa2V5KTsKICB9KS5tYXAoa3YgPT4ga3Yuam9pbigiOiIpKS5qb2luKCI7Iik7Cn0KY29uc3QgTm9XaGl0ZXMgPSBuZXcgU2V0KFsiYm9keSIsICJodG1sIl0pOwpjbGFzcyBYaHRtbE9iamVjdCBleHRlbmRzIFhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcywgbmFtZSkgewogICAgc3VwZXIoWEhUTUxfTlNfSUQsIG5hbWUpOwogICAgdGhpc1skcmljaFRleHRdID0gZmFsc2U7CiAgICB0aGlzLnN0eWxlID0gYXR0cmlidXRlcy5zdHlsZSB8fCAiIjsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXMuc3R5bGUgPSBjaGVja1N0eWxlKHRoaXMpOwogIH0KICBbJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuICFOb1doaXRlcy5oYXModGhpc1skbm9kZU5hbWVdKTsKICB9CiAgWyRvblRleHRdKHN0ciwgcmljaFRleHQgPSBmYWxzZSkgewogICAgaWYgKCFyaWNoVGV4dCkgewogICAgICBzdHIgPSBzdHIucmVwbGFjZUFsbChjcmxmUmVnRXhwLCAiIik7CiAgICAgIGlmICghdGhpcy5zdHlsZS5pbmNsdWRlcygieGZhLXNwYWNlcnVuOnllcyIpKSB7CiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoc3BhY2VzUmVnRXhwLCAiICIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzWyRyaWNoVGV4dF0gPSB0cnVlOwogICAgfQogICAgaWYgKHN0cikgewogICAgICB0aGlzWyRjb250ZW50XSArPSBzdHI7CiAgICB9CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSwgbXVzdFBvcCA9IHRydWUpIHsKICAgIGNvbnN0IHhmYUZvbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgbWFyZ2luID0gewogICAgICB0b3A6IE5hTiwKICAgICAgYm90dG9tOiBOYU4sCiAgICAgIGxlZnQ6IE5hTiwKICAgICAgcmlnaHQ6IE5hTgogICAgfTsKICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiZm9udC1mYW1pbHkiOgogICAgICAgICAgeGZhRm9udC50eXBlZmFjZSA9IHN0cmlwUXVvdGVzKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZvbnQtc2l6ZSI6CiAgICAgICAgICB4ZmFGb250LnNpemUgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmb250LXdlaWdodCI6CiAgICAgICAgICB4ZmFGb250LndlaWdodCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZm9udC1zdHlsZSI6CiAgICAgICAgICB4ZmFGb250LnBvc3R1cmUgPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxldHRlci1zcGFjaW5nIjoKICAgICAgICAgIHhmYUZvbnQubGV0dGVyU3BhY2luZyA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1hcmdpbiI6CiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgvIFx0LykubWFwKHggPT4gZ2V0TWVhc3VyZW1lbnQoeCkpOwogICAgICAgICAgc3dpdGNoICh2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gbWFyZ2luLmJvdHRvbSA9IG1hcmdpbi5sZWZ0ID0gbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgbWFyZ2luLnRvcCA9IG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMF07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5sZWZ0ID0gdmFsdWVzWzFdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzNdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLXRvcCI6CiAgICAgICAgICBtYXJnaW4udG9wID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWJvdHRvbSI6CiAgICAgICAgICBtYXJnaW4uYm90dG9tID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWxlZnQiOgogICAgICAgICAgbWFyZ2luLmxlZnQgPSBnZXRNZWFzdXJlbWVudCh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtYXJnaW4tcmlnaHQiOgogICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gZ2V0TWVhc3VyZW1lbnQodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibGluZS1oZWlnaHQiOgogICAgICAgICAgbGluZUhlaWdodCA9IGdldE1lYXN1cmVtZW50KHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBtZWFzdXJlLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgICBpZiAodGhpc1skY29udGVudF0pIHsKICAgICAgbWVhc3VyZS5hZGRTdHJpbmcodGhpc1skY29udGVudF0pOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFskbm9kZU5hbWVdID09PSAiI3RleHQiKSB7CiAgICAgICAgICBtZWFzdXJlLmFkZFN0cmluZyhjaGlsZFskY29udGVudF0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNoaWxkWyRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICAgICAgfQogICAgfQogICAgaWYgKG11c3RQb3ApIHsKICAgICAgbWVhc3VyZS5wb3BGb250KCk7CiAgICB9CiAgfQogIFskdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICB0aGlzWyRjaGlsZHJlblRvSFRNTF0oe30pOwogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpc1skY29udGVudF0pIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBsZXQgdmFsdWU7CiAgICBpZiAodGhpc1skcmljaFRleHRdKSB7CiAgICAgI
20HZhbHVlID0gdGhpc1skY29udGVudF0gPyB0aGlzWyRjb250ZW50XS5yZXBsYWNlQWxsKGNybGZGb3JSaWNoVGV4dFJlZ0V4cCwgIlxuIikgOiB1bmRlZmluZWQ7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IHRoaXNbJGNvbnRlbnRdIHx8IHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiB0aGlzWyRub2RlTmFtZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBocmVmOiB0aGlzLmhyZWYsCiAgICAgICAgc3R5bGU6IG1hcFN0eWxlKHRoaXMuc3R5bGUsIHRoaXMsIHRoaXNbJHJpY2hUZXh0XSkKICAgICAgfSwKICAgICAgY2hpbGRyZW4sCiAgICAgIHZhbHVlCiAgICB9KTsKICB9Cn0KY2xhc3MgQSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiYSIpOwogICAgdGhpcy5ocmVmID0gZml4VVJMKGF0dHJpYnV0ZXMuaHJlZikgfHwgIiI7CiAgfQp9CmNsYXNzIEIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImIiKTsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLnB1c2hGb250KHsKICAgICAgd2VpZ2h0OiAiYm9sZCIKICAgIH0pOwogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUpOwogICAgbWVhc3VyZS5wb3BGb250KCk7CiAgfQp9CmNsYXNzIEJvZHkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJvZHkiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCByZXMgPSBzdXBlclskdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgICBjb25zdCB7CiAgICAgIGh0bWwKICAgIH0gPSByZXM7CiAgICBpZiAoIWh0bWwpIHsKICAgICAgcmV0dXJuIEhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgIGh0bWwuYXR0cmlidXRlcy5jbGFzcyA9IFsieGZhUmljaCJdOwogICAgcmV0dXJuIHJlczsKICB9Cn0KY2xhc3MgQnIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImJyIik7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gIlxuIjsKICB9CiAgWyRwdXNoR2x5cGhzXShtZWFzdXJlKSB7CiAgICBtZWFzdXJlLmFkZFN0cmluZygiXG4iKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImJyIgogICAgfSk7CiAgfQp9CmNsYXNzIEh0bWwgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImh0bWwiKTsKICB9CiAgWyR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1skZXh0cmFdID0gewogICAgICBjaGlsZHJlbgogICAgfTsKICAgIHRoaXNbJGNoaWxkcmVuVG9IVE1MXSh7fSk7CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIGNsYXNzOiBbInhmYVJpY2giXSwKICAgICAgICAgIHN0eWxlOiB7fQogICAgICAgIH0sCiAgICAgICAgdmFsdWU6IHRoaXNbJGNvbnRlbnRdIHx8ICIiCiAgICAgIH0pOwogICAgfQogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkgewogICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWzBdOwogICAgICBpZiAoY2hpbGQuYXR0cmlidXRlcz8uY2xhc3MuaW5jbHVkZXMoInhmYVJpY2giKSkgewogICAgICAgIHJldHVybiBIVE1MUmVzdWx0LnN1Y2Nlc3MoY2hpbGQpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuCiAgICB9KTsKICB9Cn0KY2xhc3MgSSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiaSIpOwogIH0KICBbJHB1c2hHbHlwaHNdKG1lYXN1cmUpIHsKICAgIG1lYXN1cmUucHVzaEZvbnQoewogICAgICBwb3N0dXJlOiAiaXRhbGljIgogICAgfSk7CiAgICBzdXBlclskcHVzaEdseXBoc10obWVhc3VyZSk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9Cn0KY2xhc3MgTGkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImxpIik7CiAgfQp9CmNsYXNzIE9sIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJvbCIpOwogIH0KfQpjbGFzcyBQIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJwIik7CiAgfQogIFskcHVzaEdseXBoc10obWVhc3VyZSkgewogICAgc3VwZXJbJHB1c2hHbHlwaHNdKG1lYXN1cmUsIGZhbHNlKTsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKCJcbiIpOwogICAgbWVhc3VyZS5hZGRQYXJhKCk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9CiAgWyR0ZXh0XSgpIHsKICAgIGNvbnN0IHNpYmxpbmdzID0gdGhpc1skZ2V0UGFyZW50XSgpWyRnZXRDaGlsZHJlbl0oKTsKICAgIGlmIChzaWJsaW5ncy5hdCgtMSkgPT09IHRoaXMpIHsKICAgICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpOwogICAgfQogICAgcmV0dXJuIHN1cGVyWyR0ZXh0XSgpICsgIlxuIjsKICB9Cn0KY2xhc3MgU3BhbiBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAic3BhbiIpOwogIH0KfQpjbGFzcyBTdWIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1YiIpOwogIH0KfQpjbGFzcyBTdXAgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1cCIpOwogIH0KfQpjbGFzcyBVbCBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAidWwiKTsKICB9Cn0KY2xhc3MgWGh0bWxOYW1lc3BhY2UgewogIHN0YXRpYyBbJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGh0bWxOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIFhodG1sTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGEoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBBKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgYihhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IEIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBib2R5KGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybi
20BuZXcgQm9keShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGJyKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQnIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBodG1sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgSHRtbChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBJKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgbGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBMaShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIG9sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgT2woYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgUChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIHNwYW4oYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTcGFuKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3ViKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3ViKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3VwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3VwKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgdWwoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBVbChhdHRyaWJ1dGVzKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9zZXR1cC5qcwoKCgoKCgoKCgpjb25zdCBOYW1lc3BhY2VTZXRVcCA9IHsKICBjb25maWc6IENvbmZpZ05hbWVzcGFjZSwKICBjb25uZWN0aW9uOiBDb25uZWN0aW9uU2V0TmFtZXNwYWNlLAogIGRhdGFzZXRzOiBEYXRhc2V0c05hbWVzcGFjZSwKICBsb2NhbGVTZXQ6IExvY2FsZVNldE5hbWVzcGFjZSwKICBzaWduYXR1cmU6IFNpZ25hdHVyZU5hbWVzcGFjZSwKICBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0TmFtZXNwYWNlLAogIHRlbXBsYXRlOiBUZW1wbGF0ZU5hbWVzcGFjZSwKICB4ZHA6IFhkcE5hbWVzcGFjZSwKICB4aHRtbDogWGh0bWxOYW1lc3BhY2UKfTsKCjsvLyAuL3NyYy9jb3JlL3hmYS91bmtub3duLmpzCgoKY2xhc3MgVW5rbm93bk5hbWVzcGFjZSB7CiAgY29uc3RydWN0b3IobnNJZCkgewogICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5zSWQ7CiAgfQogIFskYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgWG1sT2JqZWN0KHRoaXMubmFtZXNwYWNlSWQsIG5hbWUsIGF0dHJpYnV0ZXMpOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2J1aWxkZXIuanMKCgoKCgoKCgoKCgpjbGFzcyBSb290IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihpZHMpIHsKICAgIHN1cGVyKC0xLCAicm9vdCIsIE9iamVjdC5jcmVhdGUobnVsbCkpOwogICAgdGhpcy5lbGVtZW50ID0gbnVsbDsKICAgIHRoaXNbJGlkc10gPSBpZHM7CiAgfQogIFskb25DaGlsZF0oY2hpbGQpIHsKICAgIHRoaXMuZWxlbWVudCA9IGNoaWxkOwogICAgcmV0dXJuIHRydWU7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgc3VwZXJbJGZpbmFsaXplXSgpOwogICAgaWYgKHRoaXMuZWxlbWVudC50ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7CiAgICAgIHRoaXNbJGlkc10uc2V0KCRyb290LCB0aGlzLmVsZW1lbnQpOwogICAgICB0aGlzLmVsZW1lbnQudGVtcGxhdGVbJHJlc29sdmVQcm90b3R5cGVzXSh0aGlzWyRpZHNdKTsKICAgICAgdGhpcy5lbGVtZW50LnRlbXBsYXRlWyRpZHNdID0gdGhpc1skaWRzXTsKICAgIH0KICB9Cn0KY2xhc3MgRW1wdHkgZXh0ZW5kcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLTEsICIiLCBPYmplY3QuY3JlYXRlKG51bGwpKTsKICB9CiAgWyRvbkNoaWxkXShfKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNsYXNzIEJ1aWxkZXIgewogIGNvbnN0cnVjdG9yKHJvb3ROYW1lU3BhY2UgPSBudWxsKSB7CiAgICB0aGlzLl9uYW1lc3BhY2VTdGFjayA9IFtdOwogICAgdGhpcy5fbnNBZ25vc3RpY0xldmVsID0gMDsKICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fbmFtZXNwYWNlcyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX25leHROc0lkID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhOYW1lc3BhY2VJZHMpLm1hcCgoewogICAgICBpZAogICAgfSkgPT4gaWQpKTsKICAgIHRoaXMuX2N1cnJlbnROYW1lc3BhY2UgPSByb290TmFtZVNwYWNlIHx8IG5ldyBVbmtub3duTmFtZXNwYWNlKCsrdGhpcy5fbmV4dE5zSWQpOwogIH0KICBidWlsZFJvb3QoaWRzKSB7CiAgICByZXR1cm4gbmV3IFJvb3QoaWRzKTsKICB9CiAgYnVpbGQoewogICAgbnNQcmVmaXgsCiAgICBuYW1lLAogICAgYXR0cmlidXRlcywKICAgIG5hbWVzcGFjZSwKICAgIHByZWZpeGVzCiAgfSkgewogICAgY29uc3QgaGFzTmFtZXNwYWNlRGVmID0gbmFtZXNwYWNlICE9PSBudWxsOwogICAgaWYgKGhhc05hbWVzcGFjZURlZikgewogICAgICB0aGlzLl9uYW1lc3BhY2VTdGFjay5wdXNoKHRoaXMuX2N1cnJlbnROYW1lc3BhY2UpOwogICAgICB0aGlzLl9jdXJyZW50TmFtZXNwYWNlID0gdGhpcy5fc2VhcmNoTmFtZXNwYWNlKG5hbWVzcGFjZSk7CiAgICB9CiAgICBpZiAocHJlZml4ZXMpIHsKICAgICAgdGhpcy5fYWRkTmFtZXNwYWNlUHJlZml4KHByZWZpeGVzKTsKICAgIH0KICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KCRuc0F0dHJpYnV0ZXMpKSB7CiAgICAgIGNvbnN0IGRhdGFUZW1wbGF0ZSA9IE5hbWVzcGFjZVNldFVwLmRhdGFzZXRzOwogICAgICBjb25zdCBuc0F0dHJzID0gYXR0cmlidXRlc1skbnNBdHRyaWJ1dGVzXTsKICAgICAgbGV0IHhmYUF0dHJzID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBbbnMsIGF0dHJzXSBvZiBPYmplY3QuZW50cmllcyhuc0F0dHJzKSkgewogICAgICAgIGNvbnN0IG5zVG9Vc2UgPSB0aGlzLl9nZXROYW1lc3BhY2VUb1VzZShucyk7CiAgICAgICAgaWYgKG5zVG9Vc2UgPT09IGRhdGFUZW1wbGF0ZSkgewogICAgICAgICAgeGZhQXR0cnMgPSB7CiAgICAgICAgICAgIHhmYTogYXR0cnMKICAgICAgICAgIH07CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHhmYUF0dHJzKSB7CiAgICAgICAgYXR0cmlidXRlc1skbnNBdHRyaWJ1dGVzXSA9IHhmYUF0dHJzOwogICAgICB9IGVsc2UgewogICAgICAgIGRlbGV0ZSBhdHRyaWJ1dGVzWyRuc0F0dHJpYnV0ZXNdOwogICAgICB9CiAgICB9CiAgICBjb25zdCBuYW1lc3BhY2VUb1VzZSA9IHRoaXMuX2dldE5hbWVzcGFjZVRvVXNlKG5zUHJlZml4KTsKICAgIGNvbnN0IG5vZGUgPSBuYW1lc3BhY2VUb1VzZT8uWyRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgfHwgbmV3IEVtcHR5KCk7CiAgICBpZiAobm9kZVskaXNOc0Fnbm9zdGljXSgpKSB7CiAgICAgI
20HRoaXMuX25zQWdub3N0aWNMZXZlbCsrOwogICAgfQogICAgaWYgKGhhc05hbWVzcGFjZURlZiB8fCBwcmVmaXhlcyB8fCBub2RlWyRpc05zQWdub3N0aWNdKCkpIHsKICAgICAgbm9kZVskY2xlYW51cF0gPSB7CiAgICAgICAgaGFzTmFtZXNwYWNlOiBoYXNOYW1lc3BhY2VEZWYsCiAgICAgICAgcHJlZml4ZXMsCiAgICAgICAgbnNBZ25vc3RpYzogbm9kZVskaXNOc0Fnbm9zdGljXSgpCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gbm9kZTsKICB9CiAgaXNOc0Fnbm9zdGljKCkgewogICAgcmV0dXJuIHRoaXMuX25zQWdub3N0aWNMZXZlbCA+IDA7CiAgfQogIF9zZWFyY2hOYW1lc3BhY2UobnNOYW1lKSB7CiAgICBsZXQgbnMgPSB0aGlzLl9uYW1lc3BhY2VzLmdldChuc05hbWUpOwogICAgaWYgKG5zKSB7CiAgICAgIHJldHVybiBuczsKICAgIH0KICAgIGZvciAoY29uc3QgW25hbWUsIHsKICAgICAgY2hlY2sKICAgIH1dIG9mIE9iamVjdC5lbnRyaWVzKE5hbWVzcGFjZUlkcykpIHsKICAgICAgaWYgKGNoZWNrKG5zTmFtZSkpIHsKICAgICAgICBucyA9IE5hbWVzcGFjZVNldFVwW25hbWVdOwogICAgICAgIGlmIChucykgewogICAgICAgICAgdGhpcy5fbmFtZXNwYWNlcy5zZXQobnNOYW1lLCBucyk7CiAgICAgICAgICByZXR1cm4gbnM7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBucyA9IG5ldyBVbmtub3duTmFtZXNwYWNlKCsrdGhpcy5fbmV4dE5zSWQpOwogICAgdGhpcy5fbmFtZXNwYWNlcy5zZXQobnNOYW1lLCBucyk7CiAgICByZXR1cm4gbnM7CiAgfQogIF9hZGROYW1lc3BhY2VQcmVmaXgocHJlZml4ZXMpIHsKICAgIGZvciAoY29uc3QgewogICAgICBwcmVmaXgsCiAgICAgIHZhbHVlCiAgICB9IG9mIHByZWZpeGVzKSB7CiAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMuX3NlYXJjaE5hbWVzcGFjZSh2YWx1ZSk7CiAgICAgIGxldCBwcmVmaXhTdGFjayA9IHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLmdldChwcmVmaXgpOwogICAgICBpZiAoIXByZWZpeFN0YWNrKSB7CiAgICAgICAgcHJlZml4U3RhY2sgPSBbXTsKICAgICAgICB0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5zZXQocHJlZml4LCBwcmVmaXhTdGFjayk7CiAgICAgIH0KICAgICAgcHJlZml4U3RhY2sucHVzaChuYW1lc3BhY2UpOwogICAgfQogIH0KICBfZ2V0TmFtZXNwYWNlVG9Vc2UocHJlZml4KSB7CiAgICBpZiAoIXByZWZpeCkgewogICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hbWVzcGFjZTsKICAgIH0KICAgIGNvbnN0IHByZWZpeFN0YWNrID0gdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuZ2V0KHByZWZpeCk7CiAgICBpZiAocHJlZml4U3RhY2s/Lmxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIHByZWZpeFN0YWNrLmF0KC0xKTsKICAgIH0KICAgIHdhcm4oYFVua25vd24gbmFtZXNwYWNlIHByZWZpeDogJHtwcmVmaXh9LmApOwogICAgcmV0dXJuIG51bGw7CiAgfQogIGNsZWFuKGRhdGEpIHsKICAgIGNvbnN0IHsKICAgICAgaGFzTmFtZXNwYWNlLAogICAgICBwcmVmaXhlcywKICAgICAgbnNBZ25vc3RpYwogICAgfSA9IGRhdGE7CiAgICBpZiAoaGFzTmFtZXNwYWNlKSB7CiAgICAgIHRoaXMuX2N1cnJlbnROYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2VTdGFjay5wb3AoKTsKICAgIH0KICAgIGlmIChwcmVmaXhlcykgewogICAgICBwcmVmaXhlcy5mb3JFYWNoKCh7CiAgICAgICAgcHJlZml4CiAgICAgIH0pID0+IHsKICAgICAgICB0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQocHJlZml4KS5wb3AoKTsKICAgICAgfSk7CiAgICB9CiAgICBpZiAobnNBZ25vc3RpYykgewogICAgICB0aGlzLl9uc0Fnbm9zdGljTGV2ZWwtLTsKICAgIH0KICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hmYS9wYXJzZXIuanMKCgoKCgoKCgoKCgoKY2xhc3MgWEZBUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyQmFzZSB7CiAgY29uc3RydWN0b3Iocm9vdE5hbWVTcGFjZSA9IG51bGwsIHJpY2hUZXh0ID0gZmFsc2UpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9idWlsZGVyID0gbmV3IEJ1aWxkZXIocm9vdE5hbWVTcGFjZSk7CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZ2xvYmFsRGF0YSA9IHsKICAgICAgdXNlZFR5cGVmYWNlczogbmV3IFNldCgpCiAgICB9OwogICAgdGhpcy5faWRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fY3VycmVudCA9IHRoaXMuX2J1aWxkZXIuYnVpbGRSb290KHRoaXMuX2lkcyk7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcjsKICAgIHRoaXMuX3doaXRlUmVnZXggPSAvXlxzKyQvOwogICAgdGhpcy5fbmJzcHMgPSAvXHhhMCsvZzsKICAgIHRoaXMuX3JpY2hUZXh0ID0gcmljaFRleHQ7CiAgfQogIHBhcnNlKGRhdGEpIHsKICAgIHRoaXMucGFyc2VYbWwoZGF0YSk7CiAgICBpZiAodGhpcy5fZXJyb3JDb2RlICE9PSBYTUxQYXJzZXJFcnJvckNvZGUuTm9FcnJvcikgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhpcy5fY3VycmVudFskZmluYWxpemVdKCk7CiAgICByZXR1cm4gdGhpcy5fY3VycmVudC5lbGVtZW50OwogIH0KICBvblRleHQodGV4dCkgewogICAgdGV4dCA9IHRleHQucmVwbGFjZSh0aGlzLl9uYnNwcywgbWF0Y2ggPT4gbWF0Y2guc2xpY2UoMSkgKyAiICIpOwogICAgaWYgKHRoaXMuX3JpY2hUZXh0IHx8IHRoaXMuX2N1cnJlbnRbJGFjY2VwdFdoaXRlc3BhY2VdKCkpIHsKICAgICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LCB0aGlzLl9yaWNoVGV4dCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl93aGl0ZVJlZ2V4LnRlc3QodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0LnRyaW0oKSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgdGhpcy5fY3VycmVudFskb25UZXh0XSh0ZXh0KTsKICB9CiAgX21rQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCB0YWdOYW1lKSB7CiAgICBsZXQgbmFtZXNwYWNlID0gbnVsbDsKICAgIGxldCBwcmVmaXhlcyA9IG51bGw7CiAgICBjb25zdCBhdHRyaWJ1dGVPYmogPSBPYmplY3QuY3JlYXRlKHt9KTsKICAgIGZvciAoY29uc3QgewogICAgICBuYW1lLAogICAgICB2YWx1ZQogICAgfSBvZiBhdHRyaWJ1dGVzKSB7CiAgICAgIGlmIChuYW1lID09PSAieG1sbnMiKSB7CiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHsKICAgICAgICAgIG5hbWVzcGFjZSA9IHZhbHVlOwogICAgICAgI
20H0gZWxzZSB7CiAgICAgICAgICB3YXJuKGBYRkEgLSBtdWx0aXBsZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBpbiA8JHt0YWdOYW1lfT5gKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgewogICAgICAgIGNvbnN0IHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKCJ4bWxuczoiLmxlbmd0aCk7CiAgICAgICAgaWYgKCFwcmVmaXhlcykgewogICAgICAgICAgcHJlZml4ZXMgPSBbXTsKICAgICAgICB9CiAgICAgICAgcHJlZml4ZXMucHVzaCh7CiAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICB2YWx1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGkgPSBuYW1lLmluZGV4T2YoIjoiKTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHsKICAgICAgICAgIGF0dHJpYnV0ZU9ialtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgbnNBdHRycyA9IGF0dHJpYnV0ZU9ialskbnNBdHRyaWJ1dGVzXTsKICAgICAgICAgIGlmICghbnNBdHRycykgewogICAgICAgICAgICBuc0F0dHJzID0gYXR0cmlidXRlT2JqWyRuc0F0dHJpYnV0ZXNdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IFtucywgYXR0ck5hbWVdID0gW25hbWUuc2xpY2UoMCwgaSksIG5hbWUuc2xpY2UoaSArIDEpXTsKICAgICAgICAgIGNvbnN0IGF0dHJzID0gbnNBdHRyc1tuc10gfHw9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICBhdHRyc1thdHRyTmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlT2JqXTsKICB9CiAgX2dldE5hbWVBbmRQcmVmaXgobmFtZSwgbnNBZ25vc3RpYykgewogICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPT09IC0xKSB7CiAgICAgIHJldHVybiBbbmFtZSwgbnVsbF07CiAgICB9CiAgICByZXR1cm4gW25hbWUuc3Vic3RyaW5nKGkgKyAxKSwgbnNBZ25vc3RpYyA/ICIiIDogbmFtZS5zdWJzdHJpbmcoMCwgaSldOwogIH0KICBvbkJlZ2luRWxlbWVudCh0YWdOYW1lLCBhdHRyaWJ1dGVzLCBpc0VtcHR5KSB7CiAgICBjb25zdCBbbmFtZXNwYWNlLCBwcmVmaXhlcywgYXR0cmlidXRlc09ial0gPSB0aGlzLl9ta0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgdGFnTmFtZSk7CiAgICBjb25zdCBbbmFtZSwgbnNQcmVmaXhdID0gdGhpcy5fZ2V0TmFtZUFuZFByZWZpeCh0YWdOYW1lLCB0aGlzLl9idWlsZGVyLmlzTnNBZ25vc3RpYygpKTsKICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9idWlsZGVyLmJ1aWxkKHsKICAgICAgbnNQcmVmaXgsCiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNPYmosCiAgICAgIG5hbWVzcGFjZSwKICAgICAgcHJlZml4ZXMKICAgIH0pOwogICAgbm9kZVskZ2xvYmFsRGF0YV0gPSB0aGlzLl9nbG9iYWxEYXRhOwogICAgaWYgKGlzRW1wdHkpIHsKICAgICAgbm9kZVskZmluYWxpemVdKCk7CiAgICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICAgIG5vZGVbJHNldElkXSh0aGlzLl9pZHMpOwogICAgICB9CiAgICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fc3RhY2sucHVzaCh0aGlzLl9jdXJyZW50KTsKICAgIHRoaXMuX2N1cnJlbnQgPSBub2RlOwogIH0KICBvbkVuZEVsZW1lbnQobmFtZSkgewogICAgY29uc3Qgbm9kZSA9IHRoaXMuX2N1cnJlbnQ7CiAgICBpZiAobm9kZVskaXNDREFUQVhtbF0oKSAmJiB0eXBlb2Ygbm9kZVskY29udGVudF0gPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYRkFQYXJzZXIoKTsKICAgICAgcGFyc2VyLl9nbG9iYWxEYXRhID0gdGhpcy5fZ2xvYmFsRGF0YTsKICAgICAgY29uc3Qgcm9vdCA9IHBhcnNlci5wYXJzZShub2RlWyRjb250ZW50XSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gbnVsbDsKICAgICAgbm9kZVskb25DaGlsZF0ocm9vdCk7CiAgICB9CiAgICBub2RlWyRmaW5hbGl6ZV0oKTsKICAgIHRoaXMuX2N1cnJlbnQgPSB0aGlzLl9zdGFjay5wb3AoKTsKICAgIGlmICh0aGlzLl9jdXJyZW50WyRvbkNoaWxkXShub2RlKSkgewogICAgICBub2RlWyRzZXRJZF0odGhpcy5faWRzKTsKICAgIH0KICAgIG5vZGVbJGNsZWFuXSh0aGlzLl9idWlsZGVyKTsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUveGZhL2ZhY3RvcnkuanMKCgoKCgoKCgoKCgoKCmNsYXNzIFhGQUZhY3RvcnkgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHRyeSB7CiAgICAgIHRoaXMucm9vdCA9IG5ldyBYRkFQYXJzZXIoKS5wYXJzZShYRkFGYWN0b3J5Ll9jcmVhdGVEb2N1bWVudChkYXRhKSk7CiAgICAgIGNvbnN0IGJpbmRlciA9IG5ldyBCaW5kZXIodGhpcy5yb290KTsKICAgICAgdGhpcy5mb3JtID0gYmluZGVyLmJpbmQoKTsKICAgICAgdGhpcy5kYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcih0aGlzLnJvb3QsIGJpbmRlci5nZXREYXRhKCkpOwogICAgICB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLnRlbXBsYXRlID0gdGhpcy5mb3JtOwogICAgfSBjYXRjaCAoZSkgewogICAgICB3YXJuKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBhbmQgYmluZGluZzogJHtlfWApOwogICAgfQogIH0KICBpc1ZhbGlkKCkgewogICAgcmV0dXJuIHRoaXMucm9vdCAmJiB0aGlzLmZvcm07CiAgfQogIF9jcmVhdGVQYWdlc0hlbHBlcigpIHsKICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5mb3JtWyR0b1BhZ2VzXSgpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgbmV4dEl0ZXJhdGlvbiA9ICgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICBpZiAodmFsdWUuZG9uZSkgewogICAgICAgICAgICByZXNvbHZlKHZhbHVlLnZhbHVlKTsKICAgICAgICAgI
20H0gZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQobmV4dEl0ZXJhdGlvbiwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgc2V0VGltZW91dChuZXh0SXRlcmF0aW9uLCAwKTsKICAgIH0pOwogIH0KICBhc3luYyBfY3JlYXRlUGFnZXMoKSB7CiAgICB0cnkgewogICAgICB0aGlzLnBhZ2VzID0gYXdhaXQgdGhpcy5fY3JlYXRlUGFnZXNIZWxwZXIoKTsKICAgICAgdGhpcy5kaW1zID0gdGhpcy5wYWdlcy5jaGlsZHJlbi5tYXAoYyA9PiB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBoZWlnaHQKICAgICAgICB9ID0gYy5hdHRyaWJ1dGVzLnN0eWxlOwogICAgICAgIHJldHVybiBbMCwgMCwgcGFyc2VJbnQod2lkdGgpLCBwYXJzZUludChoZWlnaHQpXTsKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHdhcm4oYFhGQSAtIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBsYXlvdXQ6ICR7ZX1gKTsKICAgIH0KICB9CiAgZ2V0Qm91bmRpbmdCb3gocGFnZUluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5kaW1zW3BhZ2VJbmRleF07CiAgfQogIGFzeW5jIGdldE51bVBhZ2VzKCkgewogICAgaWYgKCF0aGlzLnBhZ2VzKSB7CiAgICAgIGF3YWl0IHRoaXMuX2NyZWF0ZVBhZ2VzKCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5kaW1zLmxlbmd0aDsKICB9CiAgc2V0SW1hZ2VzKGltYWdlcykgewogICAgdGhpcy5mb3JtWyRnbG9iYWxEYXRhXS5pbWFnZXMgPSBpbWFnZXM7CiAgfQogIHNldEZvbnRzKGZvbnRzKSB7CiAgICB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIgPSBuZXcgRm9udEZpbmRlcihmb250cyk7CiAgICBjb25zdCBtaXNzaW5nRm9udHMgPSBbXTsKICAgIGZvciAobGV0IHR5cGVmYWNlIG9mIHRoaXMuZm9ybVskZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcykgewogICAgICB0eX
20BlZmFjZSA9IHN0cmlwUXVvdGVzKHR5cGVmYWNlKTsKICAgICAgY29uc3QgZm9udCA9IHRoaXMuZm9ybVskZ2xvYmFsRGF0YV0uZm9udEZpbmRlci5maW5kKHR5cGVmYWNlKTsKICAgICAgaWYgKCFmb250KSB7CiAgICAgICAgbWlzc2luZ0ZvbnRzLnB1c2godHlwZWZhY2UpOwogICAgICB9CiAgICB9CiAgICBpZiAobWlzc2luZ0ZvbnRzLmxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIG1pc3NpbmdGb250czsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBhcHBlbmRGb250cyhmb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzKSB7CiAgICB0aGlzLmZvcm1bJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuYWRkKGZvbnRzLCByZWFsbHlNaXNzaW5nRm9udHMpOwogIH0KICBhc3luYyBnZXRQYWdlcygpIHsKICAgIGlmICghdGhpcy5wYWdlcykgewogICAgICBhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpOwogICAgfQogICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzOwogICAgdGhpcy5wYWdlcyA9IG51bGw7CiAgICByZXR1cm4gcGFnZXM7CiAgfQogIHNlcmlhbGl6ZURhdGEoc3RvcmFnZSkgewogICAgcmV0dXJuIHRoaXMuZGF0YUhhbmRsZXIuc2VyaWFsaXplKHN0b3JhZ2UpOwogIH0KICBzdGF0aWMgX2NyZWF0ZURvY3VtZW50KGRhdGEpIHsKICAgIGlmICghZGF0YVsiL3hkcDp4ZHAiXSkgewogICAgICByZXR1cm4gZGF0YVsieGRwOnhkcCJdOwogICAgfQogICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZGF0YSkuam9pbigiIik7CiAgfQogIHN0YXRpYyBnZXRSaWNoVGV4dEFzSHRtbChyYykgewogICAgaWYgKCFyYyB8fCB0eXBlb2YgcmMgIT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdHJ5IHsKICAgICAgbGV0IHJvb3QgPSBuZXcgWEZBUGFyc2VyKFhodG1sTmFtZXNwYWNlLCB0cnVlKS5wYXJzZShyYyk7CiAgICAgIGlmICghWyJib2R5IiwgInhodG1sIl0uaW5jbHVkZXMocm9vdFskbm9kZU5hbWVdKSkgewogICAgICAgIGNvbnN0IG5ld1Jvb3QgPSBYaHRtbE5hbWVzcGFjZS5ib2R5KHt9KTsKICAgICAgICBuZXdSb290WyRhcHBlbmRDaGlsZF0ocm9vdCk7CiAgICAgICAgcm9vdCA9IG5ld1Jvb3Q7CiAgICAgIH0KICAgICAgY29uc3QgcmVzdWx0ID0gcm9vdFskdG9IVE1MXSgpOwogICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGh0bWwKICAgICAgfSA9IHJlc3VsdDsKICAgICAgY29uc3QgewogICAgICAgIGF0dHJpYnV0ZXMKICAgICAgfSA9IGh0bWw7CiAgICAgIGlmIChhdHRyaWJ1dGVzKSB7CiAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICAgIGF0dHJpYnV0ZXMuY2xhc3MgPSBhdHRyaWJ1dGVzLmNsYXNzLmZpbHRlcihhdHRyID0+ICFhdHRyLnN0YXJ0c1dpdGgoInhmYSIpKTsKICAgICAgICB9CiAgICAgICAgYXR0cmlidXRlcy5kaXIgPSAiYXV0byI7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBodG1sLAogICAgICAgIHN0cjogcm9vdFskdGV4dF0oKQogICAgICB9OwogICAgfSBjYXRjaCAoZSkgewogICAgICB3YXJuKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBvZiByaWNoIHRleHQ6ICR7ZX1gKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvYW5ub3RhdGlvbi5qcwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgQW5ub3RhdGlvbkZhY3RvcnkgewogIHN0YXRpYyBjcmVhdGVHbG9iYWxzKHBkZk1hbmFnZXIpIHsKICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybSIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygieGZhRGF0YXNldHMiKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJzdHJ1Y3RUcmVlUm9vdCIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImJhc2VVcmwiKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhdHRhY2htZW50cyIpXSkudGhlbigoW2Fjcm9Gb3JtLCB4ZmFEYXRhc2V0cywgc3RydWN0VHJlZVJvb3QsIGJhc2VVcmwsIGF0dGFjaG1lbnRzXSkgPT4gewogICAgICByZXR1cm4gewogICAgICAgIHBkZk1hbmFnZXIsCiAgICAgICAgYWNyb0Zvcm06IGFjcm9Gb3JtIGluc3RhbmNlb2YgRGljdCA/IGFjcm9Gb3JtIDogRGljdC5lbXB0eSwKICAgICAgICB4ZmFEYXRhc2V0cywKICAgICAgICBzdHJ1Y3RUcmVlUm9vdCwKICAgICAgICBiYXNlVXJsLAogICAgICAgIGF0dGFjaG1lbnRzCiAgICAgIH07CiAgICB9LCByZWFzb24gPT4gewogICAgICB3YXJuKGBjcmVhdGVHbG9iYWxzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KTsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZSh4cmVmLCByZWYsIGFubm90YXRpb25HbG9iYWxzLCBpZEZhY3RvcnksIGNvbGxlY3RGaWVsZHMsIG9ycGhhbkZpZWxkcywgcGFnZVJlZikgewogICAgY29uc3QgcGFnZUluZGV4ID0gY29sbGVjdEZpZWxkcyA/IGF3YWl0IHRoaXMuX2dldFBhZ2VJbmRleCh4cmVmLCByZWYsIGFubm90YXRpb25HbG9iYWxzLnBkZk1hbmFnZXIpIDogbnVsbDsKICAgIHJldHVybiBhbm5vdGF0aW9uR2xvYmFscy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiX2NyZWF0ZSIsIFt4cmVmLCByZWYsIGFubm90YXRpb25HbG9iYWxzLCBpZEZhY3RvcnksIGNvbGxlY3RGaWVsZHMsIG9ycGhhbkZpZWxkcywgcGFnZUluZGV4LCBwYWdlUmVmXSk7CiAgfQogIHN0YXRpYyBfY3JlYXRlKHhyZWYsIHJlZiwgYW5ub3RhdGlvbkdsb2JhbHMsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcyA9IGZhbHNlLCBvcnBoYW5GaWVsZHMgPSBudWxsLCBwYWdlSW5kZXggPSBudWxsLCBwYWdlUmVmID0gbnVsbCkgewogICAgY29uc3QgZGljdCA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpOwogICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIGFjcm9Gb3JtLAogICAgICBwZGZNYW5hZ2VyCiAgICB9ID0gYW5ub3RhdGlvbkdsb2JhbHM7CiAgICBjb25zdCBpZCA9IHJlZiBpbnN0YW5jZW9mIFJlZiA/IHJlZi50b1N0cmluZygpIDogYGFubm90XyR7aWRGYWN0b3J5LmNyZWF0ZU9iaklkKCl9YDsKICAgIGxldCBzdWJ0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgIHN1YnR5cGUgPSBzdWJ0eXBlIGluc3RhbmNlb2YgTmFtZSA/IHN1YnR5cGUubmFtZSA6IG51bGw7CiAgICBjb25zdCBwYXJhbWV0ZXJzID0gewogICAgICB4cmVmLAogICAgICByZWYsCiAgICAgIGRpY3QsCiAgICAgI
20HN1YnR5cGUsCiAgICAgIGlkLAogICAgICBhbm5vdGF0aW9uR2xvYmFscywKICAgICAgY29sbGVjdEZpZWxkcywKICAgICAgb3JwaGFuRmllbGRzLAogICAgICBuZWVkQXBwZWFyYW5jZXM6ICFjb2xsZWN0RmllbGRzICYmIGFjcm9Gb3JtLmdldCgiTmVlZEFwcGVhcmFuY2VzIikgPT09IHRydWUsCiAgICAgIHBhZ2VJbmRleCwKICAgICAgZXZhbHVhdG9yT3B0aW9uczogcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLAogICAgICBwYWdlUmVmCiAgICB9OwogICAgc3dpdGNoIChzdWJ0eXBlKSB7CiAgICAgIGNhc2UgIkxpbmsiOgogICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlRleHQiOgogICAgICAgIHJldHVybiBuZXcgVGV4dEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIldpZGdldCI6CiAgICAgICAgbGV0IGZpZWxkVHlwZSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICAgICAgZGljdCwKICAgICAgICAgIGtleTogIkZUIgogICAgICAgIH0pOwogICAgICAgIGZpZWxkVHlwZSA9IGZpZWxkVHlwZSBpbnN0YW5jZW9mIE5hbWUgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7CiAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKICAgICAgICAgIGNhc2UgIlR4IjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgICAgIGNhc2UgIkJ0biI6CiAgICAgICAgICAgIHJldHVybiBuZXcgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgICAgIGNhc2UgIkNoIjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiU2lnIjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgIH0KICAgICAgICB3YXJuKGBVbmltcGxlbWVudGVkIHdpZGdldCBmaWVsZCB0eXBlICIke2ZpZWxkVHlwZX0iLCBgICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGZpZWxkIHR5cGUuIik7CiAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJQb3B1cCI6CiAgICAgICAgcmV0dXJuIG5ldyBQb3B1cEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkZyZWVUZXh0IjoKICAgICAgICByZXR1cm4gbmV3IEZyZWVUZXh0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiTGluZSI6CiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiU3F1YXJlIjoKICAgICAgICByZXR1cm4gbmV3IFNxdWFyZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkNpcmNsZSI6CiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJQb2x5TGluZSI6CiAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlBvbHlnb24iOgogICAgICAgIHJldHVybiBuZXcgUG9seWdvbkFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkNhcmV0IjoKICAgICAgICByZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiSW5rIjoKICAgICAgICByZXR1cm4gbmV3IElua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkhpZ2hsaWdodCI6CiAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJVbmRlcmxpbmUiOgogICAgICAgIHJldHVybiBuZXcgVW5kZXJsaW5lQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiU3F1aWdnbHkiOgogICAgICAgIHJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJTdHJpa2VPdXQiOgogICAgICAgIHJldHVybiBuZXcgU3RyaWtlT3V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiU3RhbXAiOgogICAgICAgIHJldHVybiBuZXcgU3RhbXBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJGaWxlQXR0YWNobWVudCI6CiAgICAgICAgcmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKCFjb2xsZWN0RmllbGRzKSB7CiAgICAgICAgICBpZiAoIXN1YnR5cGUpIHsKICAgICAgICAgICAgd2FybigiQW5ub3RhdGlvbiBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCAvU3VidHlwZS4iKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHdhcm4oYFVuaW1wbGVtZW50ZWQgYW5ub3RhdGlvbiB0eXBlICIke3N1YnR5cGV9IiwgYCArICJmYWxsaW5nIGJhY2sgdG8gYmFzZSBhbm5vdGF0aW9uLiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICB9CiAgfQogIHN0YXRpYyBhc3luYyBfZ2V0UGFnZUluZGV4KHhyZWYsIHJlZiwgcGRmTWFuYWdlcikgewogICAgdHJ5IHsKICAgICAgY29uc3QgYW5ub3REaWN0ID0gYXdhaXQgeHJlZi5mZXRjaElmUmVmQXN5bmMocmVmKTsKICAgICAgaWYgKCEoYW5ub3REaWN0IGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgY29uc3QgcGFnZVJlZiA9IGFubm90RGljdC5nZXRSYXcoIlAiKTsKICAgICAgaWYgKHBhZ2VSZWYgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJnZXRQYWdlSW5kZXgiLCBbcGFnZVJlZl0pOwogICAgICAgICAgcmV0dXJuIHBhZ2VJbmRleDsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgaW5mbyhgX2dldFBhZ2VJbmRleCAtLSBub3QgYSB2YWxpZCBwYWdlIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGFubm90RGljdC5oYXMoIktpZHMiKSkgewogICAgICAgI
20HJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCBudW1QYWdlcyA9IGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJudW1QYWdlcyIpOwogICAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBudW1QYWdlczsgcGFnZUluZGV4KyspIHsKICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbnMgPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAiYW5ub3RhdGlvbnMiKTsKICAgICAgICBmb3IgKGNvbnN0IGFubm90UmVmIG9mIGFubm90YXRpb25zKSB7CiAgICAgICAgICBpZiAoYW5ub3RSZWYgaW5zdGFuY2VvZiBSZWYgJiYgaXNSZWZzRXF1YWwoYW5ub3RSZWYsIHJlZikpIHsKICAgICAgICAgICAgcmV0dXJuIHBhZ2VJbmRleDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIHdhcm4oYF9nZXRQYWdlSW5kZXg6ICIke2V4fSIuYCk7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQogIHN0YXRpYyBnZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9ucywgeHJlZiwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgIGlmICghaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgd2FybigiZ2VuZXJhdGVJbWFnZXM6IE9mZnNjcmVlbkNhbnZhcyBpcyBub3Qgc3VwcG9ydGVkLCBjYW5ub3Qgc2F2ZSBvciBwcmludCBzb21lIGFubm90YXRpb25zIHdpdGggaW1hZ2VzLiIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCBpbWFnZVByb21pc2VzOwogICAgZm9yIChjb25zdCB7CiAgICAgIGJpdG1hcElkLAogICAgICBiaXRtYXAKICAgIH0gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgaWYgKCFiaXRtYXApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpbWFnZVByb21pc2VzIHx8PSBuZXcgTWFwKCk7CiAgICAgIGltYWdlUHJvbWlzZXMuc2V0KGJpdG1hcElkLCBTdGFtcEFubm90YXRpb24uY3JlYXRlSW1hZ2UoYml0bWFwLCB4cmVmKSk7CiAgICB9CiAgICByZXR1cm4gaW1hZ2VQcm9taXNlczsKICB9CiAgc3RhdGljIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25zLCBpbWFnZVByb21pc2VzLCBjaGFuZ2VzKSB7CiAgICBjb25zdCB4cmVmID0gZXZhbHVhdG9yLnhyZWY7CiAgICBsZXQgYmFzZUZvbnRSZWY7CiAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgY29uc3QgewogICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZAogICAgfSA9IGV2YWx1YXRvci5vcHRpb25zOwogICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgIGlmIChhbm5vdGF0aW9uLmRlbGV0ZWQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUpIHsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOgogICAgICAgICAgaWYgKCFiYXNlRm9udFJlZikgewogICAgICAgICAgICBjb25zdCBiYXNlRm9udCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIkJhc2VGb250IiwgTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKICAgICAgICAgICAgYmFzZUZvbnQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZvbnQiKSk7CiAgICAgICAgICAgIGJhc2VGb250LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJUeXBlMSIpKTsKICAgICAgICAgICAgYmFzZUZvbnQuc2V0KCJFbmNvZGluZyIsIE5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7CiAgICAgICAgICAgIGJhc2VGb250UmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgICAgICAgY2hhbmdlcy5wdXQoYmFzZUZvbnRSZWYsIHsKICAgICAgICAgICAgICBkYXRhOiBiYXNlRm9udAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHByb21pc2VzLnB1c2goRnJlZVRleHRBbm5vdGF0aW9uLmNyZWF0ZU5ld0Fubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgY2hhbmdlcywgewogICAgICAgICAgICBldmFsdWF0b3IsCiAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgIGJhc2VGb250UmVmCiAgICAgICAgICB9KSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLkhJR0hMSUdIVDoKICAgICAgICAgIGlmIChhbm5vdGF0aW9uLnF1YWRQb2ludHMpIHsKICAgICAgICAgICAgcHJvbWlzZXMucHVzaChIaWdobGlnaHRBbm5vdGF0aW9uLmNyZWF0ZU5ld0Fubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgY2hhbmdlcykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJvbWlzZXMucHVzaChJbmtBbm5vdGF0aW9uLmNyZWF0ZU5ld0Fubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgY2hhbmdlcykpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6CiAgICAgICAgICBwcm9taXNlcy5wdXNoKElua0Fubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOgogICAgICAgICAgY29uc3QgaW1hZ2UgPSBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA/IGF3YWl0IGltYWdlUHJvbWlzZXM/LmdldChhbm5vdGF0aW9uLmJpdG1hcElkKSA6IG51bGw7CiAgICAgICAgICBpZiAoaW1hZ2U/LmltYWdlU3RyZWFtKSB7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBpbWFnZVN0cmVhbSwKICAgICAgICAgICAgICBzbWFza1N0cmVhbQogICAgICAgICAgICB9ID0gaW1hZ2U7CiAgICAgICAgICAgIGlmIChzbWFza1N0cmVhbSkgewogICAgICAgICAgICAgIGNvbnN0IHNtYXNrUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgICAgICAgICBjaGFuZ2VzLnB1dChzbWFza1JlZiwgewogICAgICAgICAgICAgICAgZGF0YTogc21hc2tTdHJlYW0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBpbWFnZVN0cmVhbS5kaWN0LnNldCgiU01hc2siLCBzbWFza1JlZik7CiAgICAgICAgICAgI
20H0KICAgICAgICAgICAgY29uc3QgaW1hZ2VSZWYgPSBpbWFnZS5pbWFnZVJlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgICAgICAgIGNoYW5nZXMucHV0KGltYWdlUmVmLCB7CiAgICAgICAgICAgICAgZGF0YTogaW1hZ2VTdHJlYW0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGltYWdlLmltYWdlU3RyZWFtID0gaW1hZ2Uuc21hc2tTdHJlYW0gPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgcHJvbWlzZXMucHVzaChTdGFtcEFubm90YXRpb24uY3JlYXRlTmV3QW5ub3RhdGlvbih4cmVmLCBhbm5vdGF0aW9uLCBjaGFuZ2VzLCB7CiAgICAgICAgICAgIGltYWdlCiAgICAgICAgICB9KSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgYW5ub3RhdGlvbnM6IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKQogICAgfTsKICB9CiAgc3RhdGljIGFzeW5jIHByaW50TmV3QW5ub3RhdGlvbnMoYW5ub3RhdGlvbkdsb2JhbHMsIGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMpIHsKICAgIGlmICghYW5ub3RhdGlvbnMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIG9wdGlvbnMsCiAgICAgIHhyZWYKICAgIH0gPSBldmFsdWF0b3I7CiAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgIGlmIChhbm5vdGF0aW9uLmRlbGV0ZWQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUpIHsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOgogICAgICAgICAgcHJvbWlzZXMucHVzaChGcmVlVGV4dEFubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgIGV2YWx1YXRvciwKICAgICAgICAgICAgdGFzaywKICAgICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogb3B0aW9ucwogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBbm5vdGF0aW9uRWRpdG9yVHlwZS5ISUdITElHSFQ6CiAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5xdWFkUG9pbnRzKSB7CiAgICAgICAgICAgIHByb21pc2VzLnB1c2goSGlnaGxpZ2h0QW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgICBldmFsdWF0b3JPcHRpb25zOiBvcHRpb25zCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHsKICAgICAgICAgICAgICBldmFsdWF0b3JPcHRpb25zOiBvcHRpb25zCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQW5ub3RhdGlvbkVkaXRvclR5cGUuSU5LOgogICAgICAgICAgcHJvbWlzZXMucHVzaChJbmtBbm5vdGF0aW9uLmNyZWF0ZU5ld1ByaW50QW5ub3RhdGlvbihhbm5vdGF0aW9uR2xvYmFscywgeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBldmFsdWF0b3JPcHRpb25zOiBvcHRpb25zCiAgICAgICAgICB9KSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFubm90YXRpb25FZGl0b3JUeXBlLlNUQU1QOgogICAgICAgICAgY29uc3QgaW1hZ2UgPSBvcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID8gYXdhaXQgaW1hZ2VQcm9taXNlcz8uZ2V0KGFubm90YXRpb24uYml0bWFwSWQpIDogbnVsbDsKICAgICAgICAgIGlmIChpbWFnZT8uaW1hZ2VTdHJlYW0pIHsKICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgIGltYWdlU3RyZWFtLAogICAgICAgICAgICAgIHNtYXNrU3RyZWFtCiAgICAgICAgICAgIH0gPSBpbWFnZTsKICAgICAgICAgICAgaWYgKHNtYXNrU3RyZWFtKSB7CiAgICAgICAgICAgICAgaW1hZ2VTdHJlYW0uZGljdC5zZXQoIlNNYXNrIiwgc21hc2tTdHJlYW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGltYWdlLmltYWdlUmVmID0gbmV3IEpwZWdTdHJlYW0oaW1hZ2VTdHJlYW0sIGltYWdlU3RyZWFtLmxlbmd0aCk7CiAgICAgICAgICAgIGltYWdlLmltYWdlU3RyZWFtID0gaW1hZ2Uuc21hc2tTdHJlYW0gPSBudWxsOwogICAgICAgICAgfQogICAgICAgICAgcHJvbWlzZXMucHVzaChTdGFtcEFubm90YXRpb24uY3JlYXRlTmV3UHJpbnRBbm5vdGF0aW9uKGFubm90YXRpb25HbG9iYWxzLCB4cmVmLCBhbm5vdGF0aW9uLCB7CiAgICAgICAgICAgIGltYWdlLAogICAgICAgICAgICBldmFsdWF0b3JPcHRpb25zOiBvcHRpb25zCiAgICAgICAgICB9KSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTsKICB9Cn0KZnVuY3Rpb24gZ2V0UmdiQ29sb3IoY29sb3IsIGRlZmF1bHRDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKSkgewogIGlmICghQXJyYXkuaXNBcnJheShjb2xvcikpIHsKICAgIHJldHVybiBkZWZhdWx0Q29sb3I7CiAgfQogIGNvbnN0IHJnYkNvbG9yID0gZGVmYXVsdENvbG9yIHx8IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICBzd2l0Y2ggKGNvbG9yLmxlbmd0aCkgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gbnVsbDsKICAgIGNhc2UgMToKICAgICAgQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOwogICAgICByZXR1cm4gcmdiQ29sb3I7CiAgICBjYXNlIDM6CiAgICAgIENvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOwogICAgICByZXR1cm4gcmdiQ29sb3I7CiAgICBjYXNlIDQ6CiAgICAgIENvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvcjsKICB9Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3JBcnJheShjb2xvcikgewogIHJldHVybi
20BBcnJheS5mcm9tKGNvbG9yLCBjID0+IGMgLyAyNTUpOwp9CmZ1bmN0aW9uIGdldFF1YWRQb2ludHMoZGljdCwgcmVjdCkgewogIGNvbnN0IHF1YWRQb2ludHMgPSBkaWN0LmdldEFycmF5KCJRdWFkUG9pbnRzIik7CiAgaWYgKCFpc051bWJlckFycmF5KHF1YWRQb2ludHMsIG51bGwpIHx8IHF1YWRQb2ludHMubGVuZ3RoID09PSAwIHx8IHF1YWRQb2ludHMubGVuZ3RoICUgOCA+IDApIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBuZXdRdWFkUG9pbnRzID0gbmV3IEZsb2F0MzJBcnJheShxdWFkUG9pbnRzLmxlbmd0aCk7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gcXVhZFBvaW50cy5sZW5ndGg7IGkgPCBpaTsgaSArPSA4KSB7CiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0XSA9IHF1YWRQb2ludHMuc2xpY2UoaSwgaSArIDgpOwogICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxLCB4MiwgeDMsIHg0KTsKICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4MSwgeDIsIHgzLCB4NCk7CiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTEsIHkyLCB5MywgeTQpOwogICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxLCB5MiwgeTMsIHk0KTsKICAgIGlmIChyZWN0ICE9PSBudWxsICYmIChtaW5YIDwgcmVjdFswXSB8fCBtYXhYID4gcmVjdFsyXSB8fCBtaW5ZIDwgcmVjdFsxXSB8fCBtYXhZID4gcmVjdFszXSkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBuZXdRdWFkUG9pbnRzLnNldChbbWluWCwgbWF4WSwgbWF4WCwgbWF4WSwgbWluWCwgbWluWSwgbWF4WCwgbWluWV0sIGkpOwogIH0KICByZXR1cm4gbmV3UXVhZFBvaW50czsKfQpmdW5jdGlvbiBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KSB7CiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChiYm94LCBtYXRyaXgpOwogIGlmIChtaW5YID09PSBtYXhYIHx8IG1pblkgPT09IG1heFkpIHsKICAgIHJldHVybiBbMSwgMCwgMCwgMSwgcmVjdFswXSwgcmVjdFsxXV07CiAgfQogIGNvbnN0IHhSYXRpbyA9IChyZWN0WzJdIC0gcmVjdFswXSkgLyAobWF4WCAtIG1pblgpOwogIGNvbnN0IHlSYXRpbyA9IChyZWN0WzNdIC0gcmVjdFsxXSkgLyAobWF4WSAtIG1pblkpOwogIHJldHVybiBbeFJhdGlvLCAwLCAwLCB5UmF0aW8sIHJlY3RbMF0gLSBtaW5YICogeFJhdGlvLCByZWN0WzFdIC0gbWluWSAqIHlSYXRpb107Cn0KY2xhc3MgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYsCiAgICAgIGFubm90YXRpb25HbG9iYWxzLAogICAgICByZWYsCiAgICAgIG9ycGhhbkZpZWxkcwogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IHBhcmVudFJlZiA9IG9ycGhhbkZpZWxkcz8uZ2V0KHJlZik7CiAgICBpZiAocGFyZW50UmVmKSB7CiAgICAgIGRpY3Quc2V0KCJQYXJlbnQiLCBwYXJlbnRSZWYpOwogICAgfQogICAgdGhpcy5zZXRUaXRsZShkaWN0LmdldCgiVCIpKTsKICAgIHRoaXMuc2V0Q29udGVudHMoZGljdC5nZXQoIkNvbnRlbnRzIikpOwogICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKGRpY3QuZ2V0KCJNIikpOwogICAgdGhpcy5zZXRGbGFncyhkaWN0LmdldCgiRiIpKTsKICAgIHRoaXMuc2V0UmVjdGFuZ2xlKGRpY3QuZ2V0QXJyYXkoIlJlY3QiKSk7CiAgICB0aGlzLnNldENvbG9yKGRpY3QuZ2V0QXJyYXkoIkMiKSk7CiAgICB0aGlzLnNldEJvcmRlclN0eWxlKGRpY3QpOwogICAgdGhpcy5zZXRBcHBlYXJhbmNlKGRpY3QpOwogICAgdGhpcy5zZXRPcHRpb25hbENvbnRlbnQoZGljdCk7CiAgICBjb25zdCBNSyA9IGRpY3QuZ2V0KCJNSyIpOwogICAgdGhpcy5zZXRCb3JkZXJBbmRCYWNrZ3JvdW5kQ29sb3JzKE1LKTsKICAgIHRoaXMuc2V0Um90YXRpb24oTUssIGRpY3QpOwogICAgdGhpcy5yZWYgPSBwYXJhbXMucmVmIGluc3RhbmNlb2YgUmVmID8gcGFyYW1zLnJlZiA6IG51bGw7CiAgICB0aGlzLl9zdHJlYW1zID0gW107CiAgICBpZiAodGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UpOwogICAgfQogICAgY29uc3QgaXNMb2NrZWQgPSAhISh0aGlzLmZsYWdzICYgQW5ub3RhdGlvbkZsYWcuTE9DS0VEKTsKICAgIGNvbnN0IGlzQ29udGVudExvY2tlZCA9ICEhKHRoaXMuZmxhZ3MgJiBBbm5vdGF0aW9uRmxhZy5MT0NLRURDT05URU5UUyk7CiAgICB0aGlzLmRhdGEgPSB7CiAgICAgIGFubm90YXRpb25GbGFnczogdGhpcy5mbGFncywKICAgICAgYm9yZGVyU3R5bGU6IHRoaXMuYm9yZGVyU3R5bGUsCiAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLAogICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZENvbG9yLAogICAgICBib3JkZXJDb2xvcjogdGhpcy5ib3JkZXJDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIGNvbnRlbnRzT2JqOiB0aGlzLl9jb250ZW50cywKICAgICAgaGFzQXBwZWFyYW5jZTogISF0aGlzLmFwcGVhcmFuY2UsCiAgICAgIGlkOiBwYXJhbXMuaWQsCiAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMubW9kaWZpY2F0aW9uRGF0ZSwKICAgICAgcmVjdDogdGhpcy5yZWN0YW5nbGUsCiAgICAgI
20HN1YnR5cGU6IHBhcmFtcy5zdWJ0eXBlLAogICAgICBoYXNPd25DYW52YXM6IGZhbHNlLAogICAgICBub1JvdGF0ZTogISEodGhpcy5mbGFncyAmIEFubm90YXRpb25GbGFnLk5PUk9UQVRFKSwKICAgICAgbm9IVE1MOiBpc0xvY2tlZCAmJiBpc0NvbnRlbnRMb2NrZWQsCiAgICAgIGlzRWRpdGFibGU6IGZhbHNlLAogICAgICBzdHJ1Y3RQYXJlbnQ6IC0xCiAgICB9OwogICAgaWYgKGFubm90YXRpb25HbG9iYWxzLnN0cnVjdFRyZWVSb290KSB7CiAgICAgIGxldCBzdHJ1Y3RQYXJlbnQgPSBkaWN0LmdldCgiU3RydWN0UGFyZW50Iik7CiAgICAgIHRoaXMuZGF0YS5zdHJ1Y3RQYXJlbnQgPSBzdHJ1Y3RQYXJlbnQgPSBOdW1iZXIuaXNJbnRlZ2VyKHN0cnVjdFBhcmVudCkgJiYgc3RydWN0UGFyZW50ID49IDAgPyBzdHJ1Y3RQYXJlbnQgOiAtMTsKICAgICAgYW5ub3RhdGlvbkdsb2JhbHMuc3RydWN0VHJlZVJvb3QuYWRkQW5ub3RhdGlvbklkVG9QYWdlKHBhcmFtcy5wYWdlUmVmLCBzdHJ1Y3RQYXJlbnQpOwogICAgfQogICAgaWYgKHBhcmFtcy5jb2xsZWN0RmllbGRzKSB7CiAgICAgIGNvbnN0IGtpZHMgPSBkaWN0LmdldCgiS2lkcyIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgIGNvbnN0IGtpZElkcyA9IFtdOwogICAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICAgIGlmIChraWQgaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgICAga2lkSWRzLnB1c2goa2lkLnRvU3RyaW5nKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoa2lkSWRzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgdGhpcy5kYXRhLmtpZElkcyA9IGtpZElkczsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5kYXRhLmFjdGlvbnMgPSBjb2xsZWN0QWN0aW9ucyh4cmVmLCBkaWN0LCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKTsKICAgICAgdGhpcy5kYXRhLmZpZWxkTmFtZSA9IHRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTsKICAgICAgdGhpcy5kYXRhLnBhZ2VJbmRleCA9IHBhcmFtcy5wYWdlSW5kZXg7CiAgICB9CiAgICBjb25zdCBpdCA9IGRpY3QuZ2V0KCJJVCIpOwogICAgaWYgKGl0IGluc3RhbmNlb2YgTmFtZSkgewogICAgICB0aGlzLmRhdGEuaXQgPSBpdC5uYW1lOwogICAgfQogICAgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBwYXJhbXMuZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDsKICAgIHRoaXMuX2ZhbGxiYWNrRm9udERpY3QgPSBudWxsOwogICAgdGhpcy5fbmVlZEFwcGVhcmFuY2VzID0gZmFsc2U7CiAgfQogIF9oYXNGbGFnKGZsYWdzLCBmbGFnKSB7CiAgICByZXR1cm4gISEoZmxhZ3MgJiBmbGFnKTsKICB9CiAgX2J1aWxkRmxhZ3Mobm9WaWV3LCBub1ByaW50KSB7CiAgICBsZXQgewogICAgICBmbGFncwogICAgfSA9IHRoaXM7CiAgICBpZiAobm9WaWV3ID09PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKG5vUHJpbnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgaWYgKG5vUHJpbnQpIHsKICAgICAgICByZXR1cm4gZmxhZ3MgJiB+QW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGZsYWdzICYgfkFubm90YXRpb25GbGFnLkhJRERFTiB8IEFubm90YXRpb25GbGFnLlBSSU5UOwogICAgfQogICAgaWYgKG5vVmlldykgewogICAgICBmbGFncyB8PSBBbm5vdGF0aW9uRmxhZy5QUklOVDsKICAgICAgaWYgKG5vUHJpbnQpIHsKICAgICAgICByZXR1cm4gZmxhZ3MgJiB+QW5ub3RhdGlvbkZsYWcuTk9WSUVXIHwgQW5ub3RhdGlvbkZsYWcuSElEREVOOwogICAgICB9CiAgICAgIHJldHVybiBmbGFncyAmIH5Bbm5vdGF0aW9uRmxhZy5ISURERU4gfCBBbm5vdGF0aW9uRmxhZy5OT1ZJRVc7CiAgICB9CiAgICBmbGFncyAmPSB+KEFubm90YXRpb25GbGFnLkhJRERFTiB8IEFubm90YXRpb25GbGFnLk5PVklFVyk7CiAgICBpZiAobm9QcmludCkgewogICAgICByZXR1cm4gZmxhZ3MgJiB+QW5ub3RhdGlvbkZsYWcuUFJJTlQ7CiAgICB9CiAgICByZXR1cm4gZmxhZ3MgfCBBbm5vdGF0aW9uRmxhZy5QUklOVDsKICB9CiAgX2lzVmlld2FibGUoZmxhZ3MpIHsKICAgIHJldHVybiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKTsKICB9CiAgX2lzUHJpbnRhYmxlKGZsYWdzKSB7CiAgICByZXR1cm4gdGhpcy5faGFzRmxhZyhmbGFncywgQW5ub3RhdGlvbkZsYWcuUFJJTlQpICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5ISURERU4pICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBBbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpOwogIH0KICBtdXN0QmVWaWV3ZWQoYW5ub3RhdGlvblN0b3JhZ2UsIF9yZW5kZXJGb3JtcykgewogICAgY29uc3Qgbm9WaWV3ID0gYW5ub3RhdGlvblN0b3JhZ2U/LmdldCh0aGlzLmRhdGEuaWQpPy5ub1ZpZXc7CiAgICBpZiAobm9WaWV3ICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuICFub1ZpZXc7CiAgICB9CiAgICByZXR1cm4gdGhpcy52aWV3YWJsZSAmJiAhdGhpcy5faGFzRmxhZyh0aGlzLmZsYWdzLCBBbm5vdGF0aW9uRmxhZy5ISURERU4pOwogIH0KICBtdXN0QmVQcmludGVkKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBub1ByaW50ID0gYW5ub3RhdGlvblN0b3JhZ2U/LmdldCh0aGlzLmRhdGEuaWQpPy5ub1ByaW50OwogICAgaWYgKG5vUHJpbnQgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gIW5vUHJpbnQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5wcmludGFibGU7CiAgfQogIG11c3RCZVZpZXdlZFdoZW5FZGl0aW5nKGlzRWRpdGluZywgbW9kaWZpZWRJZHMgPSBudWxsKSB7CiAgICByZXR1cm4gaXNFZGl0aW5nID8gIXRoaXMuZGF0YS5pc0VkaXRhYmxlIDogIW1vZGlmaWVkSWRzPy5oYXModGhpcy5kYXRhLmlkKTsKICB9CiAgZ2V0IHZpZXdhYmxlKCkgewogICAgaWYgKHRoaXMuZGF0YS5xdWFkUG9pbnRzID09PSBudWxsKSB7CiAgICAgI
20HJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLmZsYWdzID09PSAwKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuX2lzVmlld2FibGUodGhpcy5mbGFncyk7CiAgfQogIGdldCBwcmludGFibGUoKSB7CiAgICBpZiAodGhpcy5kYXRhLnF1YWRQb2ludHMgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRoaXMuX2lzUHJpbnRhYmxlKHRoaXMuZmxhZ3MpOwogIH0KICBfcGFyc2VTdHJpbmdIZWxwZXIoZGF0YSkgewogICAgY29uc3Qgc3RyID0gdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciID8gc3RyaW5nVG9QREZTdHJpbmcoZGF0YSkgOiAiIjsKICAgIGNvbnN0IGRpciA9IHN0ciAmJiBiaWRpKHN0cikuZGlyID09PSAicnRsIiA/ICJydGwiIDogImx0ciI7CiAgICByZXR1cm4gewogICAgICBzdHIsCiAgICAgIGRpcgogICAgfTsKICB9CiAgc2V0RGVmYXVsdEFwcGVhcmFuY2UocGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIGFubm90YXRpb25HbG9iYWxzCiAgICB9ID0gcGFyYW1zOwogICAgY29uc3QgZGVmYXVsdEFwcGVhcmFuY2UgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiREEiCiAgICB9KSB8fCBhbm5vdGF0aW9uR2xvYmFscy5hY3JvRm9ybS5nZXQoIkRBIik7CiAgICB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9IHR5cGVvZiBkZWZhdWx0QXBwZWFyYW5jZSA9PT0gInN0cmluZyIgPyBkZWZhdWx0QXBwZWFyYW5jZSA6ICIiOwogICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSA9IHBhcnNlRGVmYXVsdEFwcGVhcmFuY2UodGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UpOwogIH0KICBzZXRUaXRsZSh0aXRsZSkgewogICAgdGhpcy5fdGl0bGUgPSB0aGlzLl9wYXJzZVN0cmluZ0hlbHBlcih0aXRsZSk7CiAgfQogIHNldENvbnRlbnRzKGNvbnRlbnRzKSB7CiAgICB0aGlzLl9jb250ZW50cyA9IHRoaXMuX3BhcnNlU3RyaW5nSGVscGVyKGNvbnRlbnRzKTsKICB9CiAgc2V0TW9kaWZpY2F0aW9uRGF0ZShtb2RpZmljYXRpb25EYXRlKSB7CiAgICB0aGlzLm1vZGlmaWNhdGlvbkRhdGUgPSB0eXBlb2YgbW9kaWZpY2F0aW9uRGF0ZSA9PT0gInN0cmluZyIgPyBtb2RpZmljYXRpb25EYXRlIDogbnVsbDsKICB9CiAgc2V0RmxhZ3MoZmxhZ3MpIHsKICAgIHRoaXMuZmxhZ3MgPSBOdW1iZXIuaXNJbnRlZ2VyKGZsYWdzKSAmJiBmbGFncyA+IDAgPyBmbGFncyA6IDA7CiAgICBpZiAodGhpcy5mbGFncyAmIEFubm90YXRpb25GbGFnLklOVklTSUJMRSAmJiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgIT09ICJBbm5vdGF0aW9uIikgewogICAgICB0aGlzLmZsYWdzIF49IEFubm90YXRpb25GbGFnLklOVklTSUJMRTsKICAgIH0KICB9CiAgaGFzRmxhZyhmbGFnKSB7CiAgICByZXR1cm4gdGhpcy5faGFzRmxhZyh0aGlzLmZsYWdzLCBmbGFnKTsKICB9CiAgc2V0UmVjdGFuZ2xlKHJlY3RhbmdsZSkgewogICAgdGhpcy5yZWN0YW5nbGUgPSBsb29rdXBOb3JtYWxSZWN0KHJlY3RhbmdsZSwgWzAsIDAsIDAsIDBdKTsKICB9CiAgc2V0Q29sb3IoY29sb3IpIHsKICAgIHRoaXMuY29sb3IgPSBnZXRSZ2JDb2xvcihjb2xvcik7CiAgfQogIHNldExpbmVFbmRpbmdzKGxpbmVFbmRpbmdzKSB7CiAgICB0aGlzLmxpbmVFbmRpbmdzID0gWyJOb25lIiwgIk5vbmUiXTsKICAgIGlmIChBcnJheS5pc0FycmF5KGxpbmVFbmRpbmdzKSAmJiBsaW5lRW5kaW5ncy5sZW5ndGggPT09IDIpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICBjb25zdCBvYmogPSBsaW5lRW5kaW5nc1tpXTsKICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgc3dpdGNoIChvYmoubmFtZSkgewogICAgICAgICAgICBjYXNlICJOb25lIjoKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgY2FzZSAiU3F1YXJlIjoKICAgICAgICAgICAgY2FzZSAiQ2lyY2xlIjoKICAgICAgICAgICAgY2FzZSAiRGlhbW9uZCI6CiAgICAgICAgICAgIGNhc2UgIk9wZW5BcnJvdyI6CiAgICAgICAgICAgIGNhc2UgIkNsb3NlZEFycm93IjoKICAgICAgICAgICAgY2FzZSAiQnV0dCI6CiAgICAgICAgICAgIGNhc2UgIlJPcGVuQXJyb3ciOgogICAgICAgICAgICBjYXNlICJSQ2xvc2VkQXJyb3ciOgogICAgICAgICAgICBjYXNlICJTbGFzaCI6CiAgICAgICAgICAgICAgdGhpcy5saW5lRW5kaW5nc1tpXSA9IG9iai5uYW1lOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3YXJuKGBJZ25vcmluZyBpbnZhbGlkIGxpbmVFbmRpbmc6ICR7b2JqfWApOwogICAgICB9CiAgICB9CiAgfQogIHNldFJvdGF0aW9uKG1rLCBkaWN0KSB7CiAgICB0aGlzLnJvdGF0aW9uID0gMDsKICAgIGxldCBhbmdsZSA9IG1rIGluc3RhbmNlb2YgRGljdCA/IG1rLmdldCgiUiIpIHx8IDAgOiBkaWN0LmdldCgiUm90YXRlIikgfHwgMDsKICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGFuZ2xlKSAmJiBhbmdsZSAhPT0gMCkgewogICAgICBhbmdsZSAlPSAzNjA7CiAgICAgIGlmIChhbmdsZSA8IDApIHsKICAgICAgICBhbmdsZSArPSAzNjA7CiAgICAgI
20H0KICAgICAgaWYgKGFuZ2xlICUgOTAgPT09IDApIHsKICAgICAgICB0aGlzLnJvdGF0aW9uID0gYW5nbGU7CiAgICAgIH0KICAgIH0KICB9CiAgc2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhtaykgewogICAgaWYgKG1rIGluc3RhbmNlb2YgRGljdCkgewogICAgICB0aGlzLmJvcmRlckNvbG9yID0gZ2V0UmdiQ29sb3IobWsuZ2V0QXJyYXkoIkJDIiksIG51bGwpOwogICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGdldFJnYkNvbG9yKG1rLmdldEFycmF5KCJCRyIpLCBudWxsKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuYm9yZGVyQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvciA9IG51bGw7CiAgICB9CiAgfQogIHNldEJvcmRlclN0eWxlKGJvcmRlclN0eWxlKSB7CiAgICB0aGlzLmJvcmRlclN0eWxlID0gbmV3IEFubm90YXRpb25Cb3JkZXJTdHlsZSgpOwogICAgaWYgKCEoYm9yZGVyU3R5bGUgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoYm9yZGVyU3R5bGUuaGFzKCJCUyIpKSB7CiAgICAgIGNvbnN0IGRpY3QgPSBib3JkZXJTdHlsZS5nZXQoIkJTIik7CiAgICAgIGlmIChkaWN0IGluc3RhbmNlb2YgRGljdCkgewogICAgICAgIGNvbnN0IGRpY3RUeXBlID0gZGljdC5nZXQoIlR5cGUiKTsKICAgICAgICBpZiAoIWRpY3RUeXBlIHx8IGlzTmFtZShkaWN0VHlwZSwgIkJvcmRlciIpKSB7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKGRpY3QuZ2V0KCJXIiksIHRoaXMucmVjdGFuZ2xlKTsKICAgICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUoZGljdC5nZXQoIlMiKSk7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldERhc2hBcnJheShkaWN0LmdldEFycmF5KCJEIikpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmIChib3JkZXJTdHlsZS5oYXMoIkJvcmRlciIpKSB7CiAgICAgIGNvbnN0IGFycmF5ID0gYm9yZGVyU3R5bGUuZ2V0QXJyYXkoIkJvcmRlciIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkgJiYgYXJyYXkubGVuZ3RoID49IDMpIHsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldEhvcml6b250YWxDb3JuZXJSYWRpdXMoYXJyYXlbMF0pOwogICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXMoYXJyYXlbMV0pOwogICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoYXJyYXlbMl0sIHRoaXMucmVjdGFuZ2xlKTsKICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSA0KSB7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldERhc2hBcnJheShhcnJheVszXSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApOwogICAgfQogIH0KICBzZXRBcHBlYXJhbmNlKGRpY3QpIHsKICAgIHRoaXMuYXBwZWFyYW5jZSA9IG51bGw7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gZGljdC5nZXQoIkFQIik7CiAgICBpZiAoIShhcHBlYXJhbmNlU3RhdGVzIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZVN0YXRlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoIk4iKTsKICAgIGlmIChub3JtYWxBcHBlYXJhbmNlU3RhdGUgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEobm9ybWFsQXBwZWFyYW5jZVN0YXRlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYXMgPSBkaWN0LmdldCgiQVMiKTsKICAgIGlmICghKGFzIGluc3RhbmNlb2YgTmFtZSkgfHwgIW5vcm1hbEFwcGVhcmFuY2VTdGF0ZS5oYXMoYXMubmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2VTdGF0ZS5nZXQoYXMubmFtZSk7CiAgICBpZiAoYXBwZWFyYW5jZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgICAgdGhpcy5hcHBlYXJhbmNlID0gYXBwZWFyYW5jZTsKICAgIH0KICB9CiAgc2V0T3B0aW9uYWxDb250ZW50KGRpY3QpIHsKICAgIHRoaXMub2MgPSBudWxsOwogICAgY29uc3Qgb2MgPSBkaWN0LmdldCgiT0MiKTsKICAgIGlmIChvYyBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgd2Fybigic2V0T3B0aW9uYWxDb250ZW50OiBTdXBwb3J0IGZvciAvTmFtZS1lbnRyeSBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICB9IGVsc2UgaWYgKG9jIGluc3RhbmNlb2YgRGljdCkgewogICAgICB0aGlzLm9jID0gb2M7CiAgICB9CiAgfQogIGxvYWRSZXNvdXJjZXMoa2V5cywgYXBwZWFyYW5jZSkgewogICAgcmV0dXJuIGFwcGVhcmFuY2UuZGljdC5nZXRBc3luYygiUmVzb3VyY2VzIikudGhlbihyZXNvdXJjZXMgPT4gewogICAgICBpZiAoIXJlc291cmNlcykgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IE9iamVjdExvYWRlcihyZXNvdXJjZXMsIGtleXMsIHJlc291cmNlcy54cmVmKTsKICAgICAgcmV0dXJuIG9iamVjdExvYWRlci5sb2FkKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHJlc291cmNlczsKICAgICAgfSk7CiAgICB9KTsKICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgewogICAgICBoYXNPd25DYW52YXMsCiAgICAgIGlkLAogICAgICByZWN0CiAgICB9ID0gdGhpcy5kYXRhOwogICAgbGV0IGFwcGVhcmFuY2UgPSB0aGlzLmFwcGVhcmFuY2U7CiAgICBjb25zdCBpc1VzaW5nT3duQ2FudmFzID0gISEoaGFzT3duQ2FudmFzICYmIGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7CiAgICBpZiAoaXNVc2luZ093bkNhbnZhcyAmJiAocmVjdFswXSA9PT0gcmVjdFsyXSB8fCByZWN0WzFdID09PSByZWN0WzNdKSkgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gZmFsc2U7CiAgICAgI
20HJldHVybiB7CiAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGlmICghYXBwZWFyYW5jZSkgewogICAgICBpZiAoIWlzVXNpbmdPd25DYW52YXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgb3BMaXN0OiBuZXcgT3BlcmF0b3JMaXN0KCksCiAgICAgICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgICAgfTsKICAgICAgfQogICAgICBhcHBlYXJhbmNlID0gbmV3IFN0cmluZ1N0cmVhbSgiIik7CiAgICAgIGFwcGVhcmFuY2UuZGljdCA9IG5ldyBEaWN0KCk7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IGFwcGVhcmFuY2UuZGljdDsKICAgIGNvbnN0IHJlc291cmNlcyA9IGF3YWl0IHRoaXMubG9hZFJlc291cmNlcyhbIkV4dEdTdGF0ZSIsICJDb2xvclNwYWNlIiwgIlBhdHRlcm4iLCAiU2hhZGluZyIsICJYT2JqZWN0IiwgIkZvbnQiXSwgYXBwZWFyYW5jZSk7CiAgICBjb25zdCBiYm94ID0gbG9va3VwUmVjdChhcHBlYXJhbmNlRGljdC5nZXRBcnJheSgiQkJveCIpLCBbMCwgMCwgMSwgMV0pOwogICAgY29uc3QgbWF0cml4ID0gbG9va3VwTWF0cml4KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgSURFTlRJVFlfTUFUUklYKTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeChyZWN0LCBiYm94LCBtYXRyaXgpOwogICAgY29uc3Qgb3BMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmICh0aGlzLm9jKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IGV2YWx1YXRvci5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyh0aGlzLm9jLCBudWxsKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgb3B0aW9uYWxDb250ZW50XSk7CiAgICB9CiAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luQW5ub3RhdGlvbiwgW2lkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaXNVc2luZ093bkNhbnZhc10pOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCwKICAgICAgZmFsbGJhY2tGb250RGljdDogdGhpcy5fZmFsbGJhY2tGb250RGljdAogICAgfSk7CiAgICBvcExpc3QuYWRkT3AoT1BTLmVuZEFubm90YXRpb24sIFtdKTsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIHRoaXMucmVzZXQoKTsKICAgIHJldHVybiB7CiAgICAgIG9wTGlzdCwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGlzVXNpbmdPd25DYW52YXMKICAgIH07CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KGV2YWx1YXRvciwgdGFzaywgdmlld0JveCkgewogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0sIHRoaXMuYXBwZWFyYW5jZSk7CiAgICBjb25zdCB0ZXh0ID0gW107CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGxldCBmaXJzdFBvc2l0aW9uID0gbnVsbDsKICAgIGNvbnN0IHNpbmsgPSB7CiAgICAgIGRlc2lyZWRTaXplOiBNYXRoLkluZmluaXR5LAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSkgewogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjaHVuay5pdGVtcykgewogICAgICAgICAgaWYgKGl0ZW0uc3RyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBmaXJzdFBvc2l0aW9uIHx8PSBpdGVtLnRyYW5zZm9ybS5zbGljZSgtMik7CiAgICAgICAgICBidWZmZXIucHVzaChpdGVtLnN0cik7CiAgICAgICAgICBpZiAoaXRlbS5oYXNFT0wpIHsKICAgICAgICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhd2FpdCBldmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IHRoaXMuYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdHJ1ZSwKICAgICAga2VlcFdoaXRlU3BhY2U6IHRydWUsCiAgICAgIHNpbmssCiAgICAgIHZpZXdCb3gKICAgIH0pOwogICAgdGhpcy5yZXNldCgpOwogICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHsKICAgICAgdGV4dC5wdXNoKGJ1ZmZlci5qb2luKCIiKS50cmltRW5kKCkpOwogICAgfQogICAgaWYgKHRleHQubGVuZ3RoID4gMSB8fCB0ZXh0WzBdKSB7CiAgICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gdGhpcy5hcHBlYXJhbmNlLmRpY3Q7CiAgICAgIGNvbnN0IGJib3ggPSBsb29rdXBSZWN0KGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJCQm94IiksIG51bGwpOwogICAgICBjb25zdCBtYXRyaXggPSBsb29rdXBNYXRyaXgoYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpLCBudWxsKTsKICAgICAgdGhpcy5kYXRhLnRleHRQb3NpdGlvbiA9IHRoaXMuX3RyYW5zZm9ybVBvaW50KGZpcnN0UG9zaXRpb24sIGJib3gsIG1hdHJpeCk7CiAgICAgI
20HRoaXMuZGF0YS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CiAgfQogIF90cmFuc2Zvcm1Qb2ludChjb29yZHMsIGJib3gsIG1hdHJpeCkgewogICAgY29uc3QgewogICAgICByZWN0CiAgICB9ID0gdGhpcy5kYXRhOwogICAgYmJveCB8fD0gWzAsIDAsIDEsIDFdOwogICAgbWF0cml4IHx8PSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgocmVjdCwgYmJveCwgbWF0cml4KTsKICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdOwogICAgdHJhbnNmb3JtWzVdIC09IHJlY3RbMV07CiAgICBjb29yZHMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgdHJhbnNmb3JtKTsKICAgIHJldHVybiBVdGlsLmFwcGx5VHJhbnNmb3JtKGNvb3JkcywgbWF0cml4KTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBpZiAodGhpcy5kYXRhLmtpZElkcykgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgICB0eXBlOiAiIiwKICAgICAgICBraWRJZHM6IHRoaXMuZGF0YS5raWRJZHMsCiAgICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbgogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlc2V0KCkgewogICAgZm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5fc3RyZWFtcykgewogICAgICBzdHJlYW0ucmVzZXQoKTsKICAgIH0KICB9CiAgX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KSB7CiAgICBpZiAoIWRpY3QuaGFzKCJUIikgJiYgIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICB3YXJuKCJVbmtub3duIGZpZWxkIG5hbWUsIGZhbGxpbmcgYmFjayB0byBlbXB0eSBmaWVsZCBuYW1lLiIpOwogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoIlQiKSk7CiAgICB9CiAgICBjb25zdCBmaWVsZE5hbWUgPSBbXTsKICAgIGlmIChkaWN0LmhhcygiVCIpKSB7CiAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGRpY3QuZ2V0KCJUIikpKTsKICAgIH0KICAgIGxldCBsb29wRGljdCA9IGRpY3Q7CiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFJlZlNldCgpOwogICAgaWYgKGRpY3Qub2JqSWQpIHsKICAgICAgdmlzaXRlZC5wdXQoZGljdC5vYmpJZCk7CiAgICB9CiAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICBsb29wRGljdCA9IGxvb3BEaWN0LmdldCgiUGFyZW50Iik7CiAgICAgIGlmICghKGxvb3BEaWN0IGluc3RhbmNlb2YgRGljdCkgfHwgbG9vcERpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMobG9vcERpY3Qub2JqSWQpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGxvb3BEaWN0Lm9iaklkKSB7CiAgICAgICAgdmlzaXRlZC5wdXQobG9vcERpY3Qub2JqSWQpOwogICAgICB9CiAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgewogICAgICAgIGZpZWxkTmFtZS51bnNoaWZ0KHN0cmluZ1RvUERGU3RyaW5nKGxvb3BEaWN0LmdldCgiVCIpKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWVsZE5hbWUuam9pbigiLiIpOwogIH0KfQpjbGFzcyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDE7CiAgICB0aGlzLnJhd1dpZHRoID0gMTsKICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgdGhpcy5kYXNoQXJyYXkgPSBbM107CiAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSAwOwogICAgdGhpcy52ZXJ0aWNhbENvcm5lclJhZGl1cyA9IDA7CiAgfQogIHNldFdpZHRoKHdpZHRoLCByZWN0ID0gWzAsIDAsIDAsIDBdKSB7CiAgICBpZiAod2lkdGggaW5zdGFuY2VvZiBOYW1lKSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIHdpZHRoID09PSAibnVtYmVyIikgewogICAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgICAgdGhpcy5yYXdXaWR0aCA9IHdpZHRoOwogICAgICAgIGNvbnN0IG1heFdpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIDI7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CiAgICAgICAgaWYgKG1heFdpZHRoID4gMCAmJiBtYXhIZWlnaHQgPiAwICYmICh3aWR0aCA+IG1heFdpZHRoIHx8IHdpZHRoID4gbWF4SGVpZ2h0KSkgewogICAgICAgICAgd2FybihgQW5ub3RhdGlvbkJvcmRlclN0eWxlLnNldFdpZHRoIC0gaWdub3Jpbmcgd2lkdGg6ICR7d2lkdGh9YCk7CiAgICAgICAgICB3aWR0aCA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKICAgIH0KICB9CiAgc2V0U3R5bGUoc3R5bGUpIHsKICAgIGlmICghKHN0eWxlIGluc3RhbmNlb2YgTmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3dpdGNoIChzdHlsZS5uYW1lKSB7CiAgICAgIGNhc2UgIlMiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlNPTElEOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJEIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkIiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkkiOgogICAgICAgIHRoaXMuc3R5bGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLklOU0VUOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJVIjoKICAgICAgICB0aGlzLnN0eWxlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHNldERhc2hBcnJheShkYXNoQXJyYXksIGZvcmNlU3R5bGUgPSBmYWxzZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkoZGFzaEFycmF5KSkgewogICAgICBsZXQgaXNWYWxpZCA9IHRydWU7CiAgICAgIGxldCBhbGxaZXJvcyA9IHRydWU7CiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBkYXNoQXJyYXkpIHsKICAgICAgICBjb25zdCB2YWxpZE
2051bWJlciA9ICtlbGVtZW50ID49IDA7CiAgICAgICAgaWYgKCF2YWxpZE51bWJlcikgewogICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID4gMCkgewogICAgICAgICAgYWxsWmVyb3MgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRhc2hBcnJheS5sZW5ndGggPT09IDAgfHwgaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKICAgICAgICBpZiAoZm9yY2VTdHlsZSkgewogICAgICAgICAgdGhpcy5zZXRTdHlsZShOYW1lLmdldCgiRCIpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy53aWR0aCA9IDA7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGFzaEFycmF5KSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgfQogIH0KICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSByYWRpdXM7CiAgICB9CiAgfQogIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOwogICAgfQogIH0KfQpjbGFzcyBNYXJrdXBBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgaWYgKGRpY3QuaGFzKCJJUlQiKSkgewogICAgICBjb25zdCByYXdJUlQgPSBkaWN0LmdldFJhdygiSVJUIik7CiAgICAgIHRoaXMuZGF0YS5pblJlcGx5VG8gPSByYXdJUlQgaW5zdGFuY2VvZiBSZWYgPyByYXdJUlQudG9TdHJpbmcoKSA6IG51bGw7CiAgICAgIGNvbnN0IHJ0ID0gZGljdC5nZXQoIlJUIik7CiAgICAgIHRoaXMuZGF0YS5yZXBseVR5cGUgPSBydCBpbnN0YW5jZW9mIE5hbWUgPyBydC5uYW1lIDogQW5ub3RhdGlvblJlcGx5VHlwZS5SRVBMWTsKICAgIH0KICAgIGxldCBwb3B1cFJlZiA9IG51bGw7CiAgICBpZiAodGhpcy5kYXRhLnJlcGx5VHlwZSA9PT0gQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkgewogICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CiAgICAgIHRoaXMuc2V0VGl0bGUocGFyZW50LmdldCgiVCIpKTsKICAgICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldCgiQ29udGVudHMiKSk7CiAgICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgICBpZiAoIXBhcmVudC5oYXMoIkNyZWF0aW9uRGF0ZSIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUocGFyZW50LmdldCgiQ3JlYXRpb25EYXRlIikpOwogICAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKICAgICAgfQogICAgICBpZiAoIXBhcmVudC5oYXMoIk0iKSkgewogICAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50LmdldCgiTSIpKTsKICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKICAgICAgfQogICAgICBwb3B1cFJlZiA9IHBhcmVudC5nZXRSYXcoIlBvcHVwIik7CiAgICAgIGlmICghcGFyZW50LmhhcygiQyIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldENvbG9yKHBhcmVudC5nZXRBcnJheSgiQyIpKTsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEudGl0bGVPYmogPSB0aGlzLl90aXRsZTsKICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUoZGljdC5nZXQoIkNyZWF0aW9uRGF0ZSIpKTsKICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IHRoaXMuY3JlYXRpb25EYXRlOwogICAgICBwb3B1cFJlZiA9IGRpY3QuZ2V0UmF3KCJQb3B1cCIpOwogICAgICBpZiAoIWRpY3QuaGFzKCJDIikpIHsKICAgICAgICB0aGlzLmRhdGEuY29sb3IgPSBudWxsOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBwb3B1cFJlZiBpbnN0YW5jZW9mIFJlZiA/IHBvcHVwUmVmLnRvU3RyaW5nKCkgOiBudWxsOwogICAgaWYgKGRpY3QuaGFzKCJSQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5yaWNoVGV4dCA9IFhGQUZhY3RvcnkuZ2V0UmljaFRleHRBc0h0bWwoZGljdC5nZXQoIlJDIikpOwogICAgfQogIH0KICBzZXRDcmVhdGlvbkRhdGUoY3JlYXRpb25EYXRlKSB7CiAgICB0aGlzLmNyZWF0aW9uRGF0ZSA9IHR5cGVvZiBjcmVhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gY3JlYXRpb25EYXRlIDogbnVsbDsKICB9CiAgX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgIHhyZWYsCiAgICBleHRyYSwKICAgIHN0cm9rZUNvbG9yLAogICAgZmlsbENvbG9yLAogICAgYmxlbmRNb2RlLAogICAgc3Ryb2tlQWxwaGEsCiAgICBmaWxsQWxwaGEsCiAgICBwb2ludHNDYWxsYmFjawogIH0pIHsKICAgIGxldCBtaW5YID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgIGxldCBtaW5ZID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgIGxldCBtYXhYID0gTnVtYmVyLk1JTl9WQUxVRTsKICAgIGxldCBtYXhZID0gTnVtYmVyLk1JTl9WQUxVRTsKICAgIGNvbnN0IGJ1ZmZlciA9IFsicSJdOwogICAgaWYgKGV4dHJhKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGV4dHJhKTsKICAgIH0KICAgIGlmIChzdHJva2VDb2xvcikgewogICAgICBidWZmZXIucHVzaChgJHtzdHJva2VDb2xvclswXX0gJHtzdHJva2VDb2xvclsxXX0gJHtzdHJva2VDb2xvclsyXX0gUkdgKTsKICAgIH0KICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgYnVmZmVyLnB1c2goYCR7ZmlsbENvbG9yWzBdfSAke2ZpbGxDb2xvclsxXX0gJHtmaWxsQ29sb3JbMl19I
20HJnYCk7CiAgICB9CiAgICBjb25zdCBwb2ludHNBcnJheSA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzIHx8IEZsb2F0MzJBcnJheS5mcm9tKFt0aGlzLnJlY3RhbmdsZVswXSwgdGhpcy5yZWN0YW5nbGVbM10sIHRoaXMucmVjdGFuZ2xlWzJdLCB0aGlzLnJlY3RhbmdsZVszXSwgdGhpcy5yZWN0YW5nbGVbMF0sIHRoaXMucmVjdGFuZ2xlWzFdLCB0aGlzLnJlY3RhbmdsZVsyXSwgdGhpcy5yZWN0YW5nbGVbMV1dKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvaW50c0FycmF5Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDgpIHsKICAgICAgY29uc3QgW21YLCBNWCwgbVksIE1ZXSA9IHBvaW50c0NhbGxiYWNrKGJ1ZmZlciwgcG9pbnRzQXJyYXkuc3ViYXJyYXkoaSwgaSArIDgpKTsKICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIG1YKTsKICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIE1YKTsKICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIG1ZKTsKICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIE1ZKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKCJRIik7CiAgICBjb25zdCBmb3JtRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0oYnVmZmVyLmpvaW4oIiAiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIGZvcm1EaWN0LnNldCgiRm0wIiwgYXBwZWFyYW5jZVN0cmVhbSk7CiAgICBjb25zdCBnc0RpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGlmIChibGVuZE1vZGUpIHsKICAgICAgZ3NEaWN0LnNldCgiQk0iLCBOYW1lLmdldChibGVuZE1vZGUpKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygc3Ryb2tlQWxwaGEgPT09ICJudW1iZXIiKSB7CiAgICAgIGdzRGljdC5zZXQoIkNBIiwgc3Ryb2tlQWxwaGEpOwogICAgfQogICAgaWYgKHR5cGVvZiBmaWxsQWxwaGEgPT09ICJudW1iZXIiKSB7CiAgICAgIGdzRGljdC5zZXQoImNhIiwgZmlsbEFscGhhKTsKICAgIH0KICAgIGNvbnN0IHN0YXRlRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgc3RhdGVEaWN0LnNldCgiR1MwIiwgZ3NEaWN0KTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgc3RhdGVEaWN0KTsKICAgIHJlc291cmNlcy5zZXQoIlhPYmplY3QiLCBmb3JtRGljdCk7CiAgICBjb25zdCBhcHBlYXJhbmNlRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgY29uc3QgYmJveCA9IHRoaXMuZGF0YS5yZWN0ID0gW21pblgsIG1pblksIG1heFgsIG1heFldOwogICAgYXBwZWFyYW5jZURpY3Quc2V0KCJCQm94IiwgYmJveCk7CiAgICB0aGlzLmFwcGVhcmFuY2UgPSBuZXcgU3RyaW5nU3RyZWFtKCIvR1MwIGdzIC9GbTAgRG8iKTsKICAgIHRoaXMuYXBwZWFyYW5jZS5kaWN0ID0gYXBwZWFyYW5jZURpY3Q7CiAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy5hcHBlYXJhbmNlLCBhcHBlYXJhbmNlU3RyZWFtKTsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld0Fubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgY2hhbmdlcywgcGFyYW1zKSB7CiAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0gYW5ub3RhdGlvbi5yZWYgfHw9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICBjb25zdCBhcCA9IGF3YWl0IHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgbGV0IGFubm90YXRpb25EaWN0OwogICAgaWYgKGFwKSB7CiAgICAgIGNvbnN0IGFwUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgYW5ub3RhdGlvbkRpY3QgPSB0aGlzLmNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgICAgIGFwUmVmCiAgICAgIH0pOwogICAgICBjaGFuZ2VzLnB1dChhcFJlZiwgewogICAgICAgIGRhdGE6IGFwCiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgYW5ub3RhdGlvbkRpY3QgPSB0aGlzLmNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwge30pOwogICAgfQogICAgaWYgKE51bWJlci5pc0ludGVnZXIoYW5ub3RhdGlvbi5wYXJlbnRUcmVlSWQpKSB7CiAgICAgIGFubm90YXRpb25EaWN0LnNldCgiU3RydWN0UGFyZW50IiwgYW5ub3RhdGlvbi5wYXJlbnRUcmVlSWQpOwogICAgfQogICAgY2hhbmdlcy5wdXQoYW5ub3RhdGlvblJlZiwgewogICAgICBkYXRhOiBhbm5vdGF0aW9uRGljdAogICAgfSk7CiAgICByZXR1cm4gewogICAgICByZWY6IGFubm90YXRpb25SZWYKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdQcmludEFubm90YXRpb24oYW5ub3RhdGlvbkdsb2JhbHMsIHhyZWYsIGFubm90YXRpb24sIHBhcmFtcykgewogICAgY29uc3QgYXAgPSBhd2FpdCB0aGlzLmNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oYW5ub3RhdGlvbiwgeHJlZiwgcGFyYW1zKTsKICAgIGNvbnN0IGFubm90YXRpb25EaWN0ID0gdGhpcy5jcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIGFwID8gewogICAgICBhcAogICAgfSA6IHt9KTsKICAgIGNvbnN0IG5ld0Fubm90YXRpb24gPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3IoewogICAgICBkaWN0OiBhbm5vdGF0aW9uRGljdCwKICAgICAgeHJlZiwKICAgICAgYW5ub3RhdGlvbkdsb2JhbHMsCiAgICAgIGV2YWx1YXRvck9wdGlvbnM6IHBhcmFtcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGlmIChhbm5vdGF0aW9uLnJlZikgewogICAgICBuZXdBbm5vdGF0aW9uLnJlZiA9IG5ld0Fubm90YXRpb24ucmVmVG9SZXBsYWNlID0gYW5ub3RhdGlvbi5yZWY7CiAgICB9CiAgICByZXR1cm4gbmV3QW5ub3RhdGlvbjsKICB9Cn0KY2xhc3MgV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZiwKICAgICAgYW5ub3RhdGlvbkdsb2JhbHMKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCBkYXRhID0gdGh
20pcy5kYXRhOwogICAgdGhpcy5fbmVlZEFwcGVhcmFuY2VzID0gcGFyYW1zLm5lZWRBcHBlYXJhbmNlczsKICAgIGRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5XSURHRVQ7CiAgICBpZiAoZGF0YS5maWVsZE5hbWUgPT09IHVuZGVmaW5lZCkgewogICAgICBkYXRhLmZpZWxkTmFtZSA9IHRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTsKICAgIH0KICAgIGlmIChkYXRhLmFjdGlvbnMgPT09IHVuZGVmaW5lZCkgewogICAgICBkYXRhLmFjdGlvbnMgPSBjb2xsZWN0QWN0aW9ucyh4cmVmLCBkaWN0LCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKTsKICAgIH0KICAgIGxldCBmaWVsZFZhbHVlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIlYiLAogICAgICBnZXRBcnJheTogdHJ1ZQogICAgfSk7CiAgICBkYXRhLmZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZmllbGRWYWx1ZSk7CiAgICBjb25zdCBkZWZhdWx0RmllbGRWYWx1ZSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJEViIsCiAgICAgIGdldEFycmF5OiB0cnVlCiAgICB9KTsKICAgIGRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPSB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoZGVmYXVsdEZpZWxkVmFsdWUpOwogICAgaWYgKGZpZWxkVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBhbm5vdGF0aW9uR2xvYmFscy54ZmFEYXRhc2V0cykgewogICAgICBjb25zdCBwYXRoID0gdGhpcy5fdGl0bGUuc3RyOwogICAgICBpZiAocGF0aCkgewogICAgICAgIHRoaXMuX2hhc1ZhbHVlRnJvbVhGQSA9IHRydWU7CiAgICAgICAgZGF0YS5maWVsZFZhbHVlID0gZmllbGRWYWx1ZSA9IGFubm90YXRpb25HbG9iYWxzLnhmYURhdGFzZXRzLmdldFZhbHVlKHBhdGgpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgIT09IG51bGwpIHsKICAgICAgZGF0YS5maWVsZFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTsKICAgIH0KICAgIGRhdGEuYWx0ZXJuYXRpdmVUZXh0ID0gc3RyaW5nVG9QREZTdHJpbmcoZGljdC5nZXQoIlRVIikgfHwgIiIpOwogICAgdGhpcy5zZXREZWZhdWx0QXBwZWFyYW5jZShwYXJhbXMpOwogICAgZGF0YS5oYXNBcHBlYXJhbmNlIHx8PSB0aGlzLl9uZWVkQXBwZWFyYW5jZXMgJiYgZGF0YS5maWVsZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZGF0YS5maWVsZFZhbHVlICE9PSBudWxsOwogICAgY29uc3QgZmllbGRUeXBlID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkZUIgogICAgfSk7CiAgICBkYXRhLmZpZWxkVHlwZSA9IGZpZWxkVHlwZSBpbnN0YW5jZW9mIE5hbWUgPyBmaWVsZFR5cGUubmFtZSA6IG51bGw7CiAgICBjb25zdCBsb2NhbFJlc291cmNlcyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJEUiIKICAgIH0pOwogICAgY29uc3QgYWNyb0Zvcm1SZXNvdXJjZXMgPSBhbm5vdGF0aW9uR2xvYmFscy5hY3JvRm9ybS5nZXQoIkRSIik7CiAgICBjb25zdCBhcHBlYXJhbmNlUmVzb3VyY2VzID0gdGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICB0aGlzLl9maWVsZFJlc291cmNlcyA9IHsKICAgICAgbG9jYWxSZXNvdXJjZXMsCiAgICAgIGFjcm9Gb3JtUmVzb3VyY2VzLAogICAgICBhcHBlYXJhbmNlUmVzb3VyY2VzLAogICAgICBtZXJnZWRSZXNvdXJjZXM6IERpY3QubWVyZ2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZGljdEFycmF5OiBbbG9jYWxSZXNvdXJjZXMsIGFwcGVhcmFuY2VSZXNvdXJjZXMsIGFjcm9Gb3JtUmVzb3VyY2VzXSwKICAgICAgICBtZXJnZVN1YkRpY3RzOiB0cnVlCiAgICAgIH0pCiAgICB9OwogICAgZGF0YS5maWVsZEZsYWdzID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkZmIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0YS5maWVsZEZsYWdzKSB8fCBkYXRhLmZpZWxkRmxhZ3MgPCAwKSB7CiAgICAgIGRhdGEuZmllbGRGbGFncyA9IDA7CiAgICB9CiAgICBkYXRhLnJlYWRPbmx5ID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5SRUFET05MWSk7CiAgICBkYXRhLnJlcXVpcmVkID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5SRVFVSVJFRCk7CiAgICBkYXRhLmhpZGRlbiA9IHRoaXMuX2hhc0ZsYWcoZGF0YS5hbm5vdGF0aW9uRmxhZ3MsIEFubm90YXRpb25GbGFnLkhJRERFTikgfHwgdGhpcy5faGFzRmxhZyhkYXRhLmFubm90YXRpb25GbGFncywgQW5ub3RhdGlvbkZsYWcuTk9WSUVXKTsKICB9CiAgX2RlY29kZUZvcm1WYWx1ZShmb3JtVmFsdWUpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGZvcm1WYWx1ZSkpIHsKICAgICAgcmV0dXJuIGZvcm1WYWx1ZS5maWx0ZXIoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gInN0cmluZyIpLm1hcChpdGVtID0+IHN0cmluZ1RvUERGU3RyaW5nKGl0ZW0pKTsKICAgIH0gZWxzZSBpZiAoZm9ybVZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZm9ybVZhbHVlLm5hbWUpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZm9ybVZhbHVlID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gc3RyaW5nVG9QREZTdHJpbmcoZm9ybVZhbHVlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBoYXNGaWVsZEZsYWcoZmxhZykgewogICAgcmV0dXJuICEhKHRoaXMuZGF0YS5maWVsZEZsYWdzICYgZmxhZyk7CiAgfQogIF9pc1ZpZXdhYmxlKGZsYWdzKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgbXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgewogICAgaWYgKHJlbmRlckZvcm1zKSB7CiAgICAgIHJldHVybiB0aGlzLnZpZXdhYmxlOwogICAgfQogICAgcmV0dXJuIHN1cGVyLm11c3RCZVZpZXdlZChhbm5vdGF0aW9uU3RvcmFnZSwgcmVuZGVyRm9ybXMpICYmICF0aGlzLl9oYXNGbGFnKHRoaXMuZmxhZ3MsIEFubm90YXRpb25GbGFnLk5PVklFVyk7CiAgfQogIGdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBsZXQgcm90YXRpb24gPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnJvdGF0aW9uOwogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSAwKSB7CiAgICAgI
20HJldHVybiBJREVOVElUWV9NQVRSSVg7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogICAgcmV0dXJuIGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKICB9CiAgZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBsZXQgcm90YXRpb24gPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnJvdGF0aW9uOwogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgaWYgKCF0aGlzLmJhY2tncm91bmRDb2xvciAmJiAhdGhpcy5ib3JkZXJDb2xvcikgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogICAgY29uc3QgcmVjdCA9IHJvdGF0aW9uID09PSAwIHx8IHJvdGF0aW9uID09PSAxODAgPyBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fSByZWAgOiBgMCAwICR7aGVpZ2h0fSAke3dpZHRofSByZWA7CiAgICBsZXQgc3RyID0gIiI7CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgc3RyID0gYCR7Z2V0UGRmQ29sb3IodGhpcy5iYWNrZ3JvdW5kQ29sb3IsIHRydWUpfSAke3JlY3R9IGYgYDsKICAgIH0KICAgIGlmICh0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCB8fCAxOwogICAgICBzdHIgKz0gYCR7Ym9yZGVyV2lkdGh9IHcgJHtnZXRQZGZDb2xvcih0aGlzLmJvcmRlckNvbG9yLCBmYWxzZSl9ICR7cmVjdH0gUyBgOwogICAgfQogICAgcmV0dXJuIHN0cjsKICB9CiAgYXN5bmMgZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVMgJiYgISh0aGlzIGluc3RhbmNlb2YgU2lnbmF0dXJlV2lkZ2V0QW5ub3RhdGlvbikgJiYgIXRoaXMuZGF0YS5ub0hUTUwgJiYgIXRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3Q6IG5ldyBPcGVyYXRvckxpc3QoKSwKICAgICAgICBzZXBhcmF0ZUZvcm06IHRydWUsCiAgICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgICBpZiAoIXRoaXMuX2hhc1RleHQpIHsKICAgICAgcmV0dXJuIHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgfQogICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIGlmICh0aGlzLmFwcGVhcmFuY2UgJiYgY29udGVudCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBjb25zdCBvcExpc3QgPSBuZXcgT3BlcmF0b3JMaXN0KCk7CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlIHx8IGNvbnRlbnQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3QsCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGlzVXNpbmdPd25DYW52YXMgPSAhISh0aGlzLmRhdGEuaGFzT3duQ2FudmFzICYmIGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSk7CiAgICBjb25zdCBtYXRyaXggPSBbMSwgMCwgMCwgMSwgMCwgMF07CiAgICBjb25zdCBiYm94ID0gWzAsIDAsIHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF0sIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV1dOwogICAgY29uc3QgdHJhbnNmb3JtID0gZ2V0VHJhbnNmb3JtTWF0cml4KHRoaXMuZGF0YS5yZWN0LCBiYm94LCBtYXRyaXgpOwogICAgbGV0IG9wdGlvbmFsQ29udGVudDsKICAgIGlmICh0aGlzLm9jKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IGV2YWx1YXRvci5wYXJzZU1hcmtlZENvbnRlbnRQcm9wcyh0aGlzLm9jLCBudWxsKTsKICAgIH0KICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luTWFya2VkQ29udGVudFByb3BzLCBbIk9DIiwgb3B0aW9uYWxDb250ZW50XSk7CiAgICB9CiAgICBvcExpc3QuYWRkT3AoT1BTLmJlZ2luQW5ub3RhdGlvbiwgW3RoaXMuZGF0YS5pZCwgdGhpcy5kYXRhLnJlY3QsIHRyYW5zZm9ybSwgdGhpcy5nZXRSb3RhdGlvbk1hdHJpeChhbm5vdGF0aW9uU3RvcmFnZSksIGlzVXNpbmdPd25DYW52YXNdKTsKICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0oY29udGVudCk7CiAgICBhd2FpdCBldmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgc3RyZWFtLAogICAgICB0YXNrLAogICAgICByZXNvdXJjZXM6IHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcywKICAgICAgb3BlcmF0b3JMaXN0OiBvcExpc3QKICAgIH0pOwogICAgb3BMaXN0LmFkZE9wKE9QUy5lbmRBbm5vdGF0aW9uLCBbXSk7CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgb3BMaXN0LmFkZE9wKE9QUy5lbmRNYXJrZWRDb250ZW50LCBbXSk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBvcExpc3QsCiAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgIHNlcGFyYXRlQ2FudmFzOiBpc1VzaW5nT3duQ2FudmFzCiAgICB9OwogIH0KICBfZ2V0TUtEaWN0KHJvdGF0aW9uKSB7CiAgICBjb25zdCBtayA9IG5ldyBEaWN0KG51bGwpOwogICAgaWYgKHJvdGF0aW9uKSB7CiAgICAgIG1rLnNldCgiUiIsIHJvdGF0aW9uKTsKICAgIH0KICAgIGlmICh0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIG1rLnNldCgiQkMiLCBnZXRQZGZDb2xvckFycmF5KHRoaXMuYm9yZGVyQ29sb3IpKTsKICAgIH0KICAgIGlmICh0aGlzLmJhY2tncm91bmRDb2xvcikgewogICAgICBtay5zZXQoIkJHIiwgZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmJhY2tncm91bmRDb2xvcikpOwogICAgfQogICAgcmV0dXJuIG1rLnNpemUgPiAwID8gbWsgOiBudWxsOwogIH0KICBhbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgZGljdCkge30KICBzZXRWYWx1ZShkaWN0LCB2YWx1ZSwgeHJlZiwgY2hhbmdlcykgewogICAgY29uc3QgewogICAgICBkaWN0OiBwYXJlbnREaWN0LAogICAgICByZWY6IHBhcmVudFJlZgogICAgfSA9IGdldFBhcmVudFRvVXBkYXRlKGRpY3QsIHRoaXMucmVmLCB4cmVmKTsKICAgIGlmICghcGFyZW50RGljdCkgewogICAgICBkaWN0LnNldCgiViIsIHZhbHVlKTsKICAgIH0gZWxzZSBpZiAoIWNoYW5nZXMuaGFzKHBhcmVudFJlZikpIHsKICAgICAgY29uc3QgbmV3UGFyZW50RGljdCA9IHBhcmVudERpY3QuY2xvbmUoKTsKICAgICAgbmV3
20UGFyZW50RGljdC5zZXQoIlYiLCB2YWx1ZSk7CiAgICAgIGNoYW5nZXMucHV0KHBhcmVudFJlZiwgewogICAgICAgIGRhdGE6IG5ld1BhcmVudERpY3QKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdQYXJlbnREaWN0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gYW5ub3RhdGlvblN0b3JhZ2U/LmdldCh0aGlzLmRhdGEuaWQpOwogICAgY29uc3QgZmxhZ3MgPSB0aGlzLl9idWlsZEZsYWdzKHN0b3JhZ2VFbnRyeT8ubm9WaWV3LCBzdG9yYWdlRW50cnk/Lm5vUHJpbnQpOwogICAgbGV0IHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZSwKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnk/LnJvdGF0aW9uOwogICAgaWYgKHZhbHVlID09PSB0aGlzLmRhdGEuZmllbGRWYWx1ZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICghdGhpcy5faGFzVmFsdWVGcm9tWEZBICYmIHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgZmxhZ3MgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YWx1ZSB8fD0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5faGFzVmFsdWVGcm9tWEZBICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLmZpZWxkVmFsdWUpICYmIGlzQXJyYXlFcXVhbCh2YWx1ZSwgdGhpcy5kYXRhLmZpZWxkVmFsdWUpICYmIGZsYWdzID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgbGV0IGFwcGVhcmFuY2UgPSBudWxsOwogICAgaWYgKCF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpIHsKICAgICAgYXBwZWFyYW5jZSA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBSZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUsIGFubm90YXRpb25TdG9yYWdlKTsKICAgICAgaWYgKGFwcGVhcmFuY2UgPT09IG51bGwgJiYgZmxhZ3MgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfSBlbHNlIHt9CiAgICBsZXQgbmVlZEFwcGVhcmFuY2VzID0gZmFsc2U7CiAgICBpZiAoYXBwZWFyYW5jZT8ubmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIG5lZWRBcHBlYXJhbmNlcyA9IHRydWU7CiAgICAgIGFwcGVhcmFuY2UgPSBudWxsOwogICAgfQogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZXZhbHVhdG9yOwogICAgY29uc3Qgb3JpZ2luYWxEaWN0ID0geHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTsKICAgIGlmICghKG9yaWdpbmFsRGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIG9yaWdpbmFsRGljdC5nZXRLZXlzKCkpIHsKICAgICAgaWYgKGtleSAhPT0gIkFQIikgewogICAgICAgIGRpY3Quc2V0KGtleSwgb3JpZ2luYWxEaWN0LmdldFJhdyhrZXkpKTsKICAgICAgfQogICAgfQogICAgaWYgKGZsYWdzICE9PSB1bmRlZmluZWQpIHsKICAgICAgZGljdC5zZXQoIkYiLCBmbGFncyk7CiAgICAgIGlmIChhcHBlYXJhbmNlID09PSBudWxsICYmICFuZWVkQXBwZWFyYW5jZXMpIHsKICAgICAgICBjb25zdCBhcCA9IG9yaWdpbmFsRGljdC5nZXRSYXcoIkFQIik7CiAgICAgICAgaWYgKGFwKSB7CiAgICAgICAgICBkaWN0LnNldCgiQVAiLCBhcCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCB4ZmEgPSB7CiAgICAgIHBhdGg6IHRoaXMuZGF0YS5maWVsZE5hbWUsCiAgICAgI
20HZhbHVlCiAgICB9OwogICAgY29uc3QgbmV3UGFyZW50RGljdCA9IHRoaXMuc2V0VmFsdWUoZGljdCwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSkgOiBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHZhbHVlKSwgeHJlZiwgY2hhbmdlcyk7CiAgICB0aGlzLmFtZW5kU2F2ZWREaWN0KGFubm90YXRpb25TdG9yYWdlLCBuZXdQYXJlbnREaWN0IHx8IGRpY3QpOwogICAgY29uc3QgbWF5YmVNSyA9IHRoaXMuX2dldE1LRGljdChyb3RhdGlvbik7CiAgICBpZiAobWF5YmVNSykgewogICAgICBkaWN0LnNldCgiTUsiLCBtYXliZU1LKTsKICAgIH0KICAgIGNoYW5nZXMucHV0KHRoaXMucmVmLCB7CiAgICAgIGRhdGE6IGRpY3QsCiAgICAgIHhmYSwKICAgICAgbmVlZEFwcGVhcmFuY2VzCiAgICB9KTsKICAgIGlmIChhcHBlYXJhbmNlICE9PSBudWxsKSB7CiAgICAgIGNvbnN0IG5ld1JlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIGNvbnN0IEFQID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGRpY3Quc2V0KCJBUCIsIEFQKTsKICAgICAgQVAuc2V0KCJOIiwgbmV3UmVmKTsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5fZ2V0U2F2ZUZpZWxkUmVzb3VyY2VzKHhyZWYpOwogICAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgICAgY29uc3QgYXBwZWFyYW5jZURpY3QgPSBhcHBlYXJhbmNlU3RyZWFtLmRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KCJCQm94IiwgWzAsIDAsIHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF0sIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV1dKTsKICAgICAgY29uc3Qgcm90YXRpb25NYXRyaXggPSB0aGlzLmdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKTsKICAgICAgaWYgKHJvdGF0aW9uTWF0cml4ICE9PSBJREVOVElUWV9NQVRSSVgpIHsKICAgICAgICBhcHBlYXJhbmNlRGljdC5zZXQoIk1hdHJpeCIsIHJvdGF0aW9uTWF0cml4KTsKICAgICAgfQogICAgICBjaGFuZ2VzLnB1dChuZXdSZWYsIHsKICAgICAgICBkYXRhOiBhcHBlYXJhbmNlU3RyZWFtLAogICAgICAgIHhmYTogbnVsbCwKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IGZhbHNlCiAgICAgIH0pOwogICAgfQogICAgZGljdC5zZXQoIk0iLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICB9CiAgYXN5bmMgX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBpc1Bhc3N3b3JkID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCk7CiAgICBpZiAoaXNQYXNzd29yZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGxldCB2YWx1ZSwgcm90YXRpb247CiAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5LmZvcm1hdHRlZFZhbHVlIHx8IHN0b3JhZ2VFbnRyeS52YWx1ZTsKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnkucm90YXRpb247CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpIHsKICAgICAgaWYgKCF0aGlzLl9oYXNWYWx1ZUZyb21YRkEgfHwgdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31RIEVNQ2A7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKICAgIH0KICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciLCAiRXhwZWN0ZWQgYHZhbHVlYCB0byBiZSBhIHN0cmluZy4iKTsKICAgIHZhbHVlID0gdmFsdWUudHJpbUVuZCgpOwogICAgaWYgKHRoaXMuZGF0YS5jb21ibykgewogICAgICBjb25zdCBvcHRpb24gPSB0aGlzLmRhdGEub3B0aW9ucy5maW5kKCh7CiAgICAgICAgZXhwb3J0VmFsdWUKICAgICAgfSkgPT4gdmFsdWUgPT09IGV4cG9ydFZhbHVlKTsKICAgICAgdmFsdWUgPSBvcHRpb24/LmRpc3BsYXlWYWx1ZSB8fCB2YWx1ZTsKICAgIH0KICAgIGlmICh2YWx1ZSA9PT0gIiIpIHsKICAgICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9USBFTUNgOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgbGV0IGxpbmVDb3VudCA9IC0xOwogICAgbGV0IGxpbmVzOwogICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKICAgICAgbGluZXMgPSB2YWx1ZS5zcGxpdCgvXHJcbj98XG4vKS5tYXAobGluZSA9PiBsaW5lLm5vcm1hbGl6ZSgiTkZDIikpOwogICAgICBsaW5lQ291bnQgPSBsaW5lcy5sZW5ndGg7CiAgICB9IGVsc2UgewogICAgICBsaW5lcyA9IFt2YWx1ZS5yZXBsYWNlKC9cclxuP3xcbi8sICIiKS5ub3JtYWxpemUoIk5GQyIpXTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0gMTsKICAgIGNvbnN0IGRlZmF1bHRIUGFkZGluZyA9IDI7CiAgICBsZXQgdG90YWxIZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogICAgbGV0IHRvdGFsV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdOwogICAgaWYgKHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwKSB7CiAgICAgIFt0b3RhbFdpZHR
20oLCB0b3RhbEhlaWdodF0gPSBbdG90YWxIZWlnaHQsIHRvdGFsV2lkdGhdOwogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gcGFyc2VEZWZhdWx0QXBwZWFyYW5jZSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBsZXQgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSwgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTsKICAgIGxldCBkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHQ7CiAgICBjb25zdCBlbmNvZGVkTGluZXMgPSBbXTsKICAgIGxldCBlbmNvZGluZ0Vycm9yID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpOwogICAgICBpZiAoZW5jb2RlZFN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgICAgZW5jb2RpbmdFcnJvciA9IHRydWU7CiAgICAgIH0KICAgICAgZW5jb2RlZExpbmVzLnB1c2goZW5jb2RlZFN0cmluZy5qb2luKCIiKSk7CiAgICB9CiAgICBpZiAoZW5jb2RpbmdFcnJvciAmJiBpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IHRydWUKICAgICAgfTsKICAgIH0KICAgIGlmIChlbmNvZGluZ0Vycm9yICYmIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmRhdGEuY29tYiA/ICJtb25vc3BhY2UiIDogInNhbnMtc2VyaWYiOwogICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgRmFrZVVuaWNvZGVGb250KGV2YWx1YXRvci54cmVmLCBmb250RmFtaWx5KTsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gZmFrZVVuaWNvZGVGb250LmNyZWF0ZUZvbnRSZXNvdXJjZXMobGluZXMuam9pbigiIikpOwogICAgICBjb25zdCBuZXdGb250ID0gcmVzb3VyY2VzLmdldFJhdygiRm9udCIpOwogICAgICBpZiAodGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLmhhcygiRm9udCIpKSB7CiAgICAgICAgY29uc3Qgb2xkRm9udCA9IHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBuZXdGb250LmdldEtleXMoKSkgewogICAgICAgICAgb2xkRm9udC5zZXQoa2V5LCBuZXdGb250LmdldFJhdyhrZXkpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLnNldCgiRm9udCIsIG5ld0ZvbnQpOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnROYW1lID0gZmFrZVVuaWNvZGVGb250LmZvbnROYW1lLm5hbWU7CiAgICAgIGZvbnQgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgICBmb250TmFtZSwKICAgICAgICBmb250U2l6ZTogMAogICAgICB9LCByZXNvdXJjZXMpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbmNvZGVkTGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGVuY29kZWRMaW5lc1tpXSA9IHN0cmluZ1RvVVRGMTZTdHJpbmcobGluZXNbaV0pOwogICAgICB9CiAgICAgIGNvbnN0IHNhdmVkRGVmYXVsdEFwcGVhcmFuY2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplID0gMDsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250TmFtZSA9IGZvbnROYW1lOwogICAgICBbZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnRTaXplLCBsaW5lSGVpZ2h0XSA9IHRoaXMuX2NvbXB1dGVGb250U2l6ZSh0b3RhbEhlaWdodCAtIDIgKiBkZWZhdWx0UGFkZGluZywgdG90YWxXaWR0aCAtIDIgKiBkZWZhdWx0SFBhZGRpbmcsIHZhbHVlLCBmb250LCBsaW5lQ291bnQpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gc2F2ZWREZWZhdWx0QXBwZWFyYW5jZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICB3YXJuKCJfZ2V0QXBwZWFyYW5jZTogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgICB9CiAgICAgIFtkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHRdID0gdGh
20pcy5fY29tcHV0ZUZvbnRTaXplKHRvdGFsSGVpZ2h0IC0gMiAqIGRlZmF1bHRQYWRkaW5nLCB0b3RhbFdpZHRoIC0gMiAqIGRlZmF1bHRIUGFkZGluZywgdmFsdWUsIGZvbnQsIGxpbmVDb3VudCk7CiAgICB9CiAgICBsZXQgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKICAgIGlmIChpc05hTihkZXNjZW50KSkgewogICAgICBkZXNjZW50ID0gQkFTRUxJTkVfRkFDVE9SICogbGluZUhlaWdodDsKICAgIH0gZWxzZSB7CiAgICAgIGRlc2NlbnQgPSBNYXRoLm1heChCQVNFTElORV9GQUNUT1IgKiBsaW5lSGVpZ2h0LCBNYXRoLmFicyhkZXNjZW50KSAqIGZvbnRTaXplKTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRWUGFkZGluZyA9IE1hdGgubWluKE1hdGguZmxvb3IoKHRvdGFsSGVpZ2h0IC0gZm9udFNpemUpIC8gMiksIGRlZmF1bHRQYWRkaW5nKTsKICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50OwogICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGVuY29kZWRMaW5lcywgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0LCBhbGlnbm1lbnQsIGRlZmF1bHRIUGFkZGluZywgZGVmYXVsdFZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBmb250LCBlbmNvZGVkTGluZXNbMF0sIGZvbnRTaXplLCB0b3RhbFdpZHRoLCB0b3RhbEhlaWdodCwgZGVmYXVsdEhQYWRkaW5nLCBkZWZhdWx0VlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBkZWZhdWx0VlBhZGRpbmcgKyBkZXNjZW50OwogICAgaWYgKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGRlZmF1bHRIUGFkZGluZyl9ICR7bnVtYmVyVG9TdHJpbmcoYm90dG9tUGFkZGluZyl9IFRtICgke2VzY2FwZVN0cmluZyhlbmNvZGVkTGluZXNbMF0pfSkgVGpgICsgIiBFVCBRIEVNQyI7CiAgICB9CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBjb25zdCByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KGVuY29kZWRMaW5lc1swXSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgcHJldkluZm8sIGRlZmF1bHRIUGFkZGluZywgYm90dG9tUGFkZGluZyk7CiAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31CVCBgICsgZGVmYXVsdEFwcGVhcmFuY2UgKyBgIDEgMCAwIDEgMCAwIFRtICR7cmVuZGVyZWRUZXh0fWAgKyAiIEVUIFEgRU1DIjsKICB9CiAgc3RhdGljIGFzeW5jIF9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIGFwcGVhcmFuY2VEYXRhLCByZXNvdXJjZXMpIHsKICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKICAgICAgZm9udDogbnVsbCwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7CiAgICAgIGZvbnROYW1lLAogICAgICBmb250U2l6ZQogICAgfSA9IGFwcGVhcmFuY2VEYXRhOwogICAgYXdhaXQgZXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbZm9udE5hbWUgJiYgTmFtZS5nZXQoZm9udE5hbWUpLCBmb250U2l6ZV0sIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBudWxsKTsKICAgIHJldHVybiBpbml0aWFsU3RhdGUuZm9udDsKICB9CiAgX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSB7CiAgICByZXR1cm4gZm9udC5jaGFyc1RvR2x5cGhzKHRleHQpLnJlZHVjZSgod2lkdGgsIGdseXBoKSA9PiB3aWR0aCArIGdseXBoLndpZHRoLCAwKSAvIDEwMDA7CiAgfQogIF9jb21wdXRlRm9udFNpemUoaGVpZ2h0LCB3aWR0aCwgdGV4dCwgZm9udCwgbGluZUNvdW50KSB7CiAgICBsZXQgewogICAgICBmb250U2l6ZQogICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7CiAgICBsZXQgbGluZUhlaWdodCA9IChmb250U2l6ZSB8fCAxMikgKiBMSU5FX0ZBQ1RPUiwKICAgICAgbnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQoaGVpZ2h0IC8gbGluZUhlaWdodCk7CiAgICBpZiAoIWZvbnRTaXplKSB7CiAgICAgIGNvbnN0IHJvdW5kV2l0aFR3b0RpZ2l0cyA9IHggPT4gTWF0aC5mbG9vcih4ICogMTAwKSAvIDEwMDsKICAgICAgaWYgKGxpbmVDb3VudCA9PT0gLTEpIHsKICAgICAgICBjb25zdCB0ZXh0V2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7CiAgICAgICAgZm9udFNpemUgPSByb3VuZFdpdGhUd29EaWdpdHMoTWF0aC5taW4oaGVpZ2h0IC8gTElORV9GQUNUT1IsIHdpZHRoIC8gdGV4dFdpZHRoKSk7CiAgICAgICAgbnVtYmVyT2ZMaW5lcyA9IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KC9cclxuP3xcbi8pOwogICAgICAgIGNvbnN0IGNhY2hlZExpbmVzID0gW107CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICBjb25zdCBlbmNvZGVkI
20D0gZm9udC5lbmNvZGVTdHJpbmcobGluZSkuam9pbigiIik7CiAgICAgICAgICBjb25zdCBnbHlwaHMgPSBmb250LmNoYXJzVG9HbHlwaHMoZW5jb2RlZCk7CiAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBmb250LmdldENoYXJQb3NpdGlvbnMoZW5jb2RlZCk7CiAgICAgICAgICBjYWNoZWRMaW5lcy5wdXNoKHsKICAgICAgICAgICAgbGluZTogZW5jb2RlZCwKICAgICAgICAgICAgZ2x5cGhzLAogICAgICAgICAgICBwb3NpdGlvbnMKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zdCBpc1Rvb0JpZyA9IGZzaXplID0+IHsKICAgICAgICAgIGxldCB0b3RhbEhlaWdodCA9IDA7CiAgICAgICAgICBmb3IgKGNvbnN0IGNhY2hlIG9mIGNhY2hlZExpbmVzKSB7CiAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuX3NwbGl0TGluZShudWxsLCBmb250LCBmc2l6ZSwgd2lkdGgsIGNhY2hlKTsKICAgICAgICAgICAgdG90YWxIZWlnaHQgKz0gY2h1bmtzLmxlbmd0aCAqIGZzaXplOwogICAgICAgICAgICBpZiAodG90YWxIZWlnaHQgPiBoZWlnaHQpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgICAgbnVtYmVyT2ZMaW5lcyA9IE1hdGgubWF4KG51bWJlck9mTGluZXMsIGxpbmVDb3VudCk7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGxpbmVIZWlnaHQgPSBoZWlnaHQgLyBudW1iZXJPZkxpbmVzOwogICAgICAgICAgZm9udFNpemUgPSByb3VuZFdpdGhUd29EaWdpdHMobGluZUhlaWdodCAvIExJTkVfRkFDVE9SKTsKICAgICAgICAgIGlmIChpc1Rvb0JpZyhmb250U2l6ZSkpIHsKICAgICAgICAgICAgbnVtYmVyT2ZMaW5lcysrOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB7CiAgICAgICAgZm9udE5hbWUsCiAgICAgICAgZm9udENvbG9yCiAgICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgICB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9IGNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICBmb250U2l6ZSwKICAgICAgICBmb250TmFtZSwKICAgICAgICBmb250Q29sb3IKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gW3RoaXMuX2RlZmF1bHRBcHBlYXJhbmNlLCBmb250U2l6ZSwgaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lc107CiAgfQogIF9yZW5kZXJUZXh0KHRleHQsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoLCBhbGlnbm1lbnQsIHByZXZJbmZvLCBoUGFkZGluZywgdlBhZGRpbmcpIHsKICAgIGxldCBzaGlmdDsKICAgIGlmIChhbGlnbm1lbnQgPT09IDEpIHsKICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgodGV4dCwgZm9udCkgKiBmb250U2l6ZTsKICAgICAgc2hpZnQgPSAodG90YWxXaWR0aCAtIHdpZHRoKSAvIDI7CiAgICB9IGVsc2UgaWYgKGFsaWdubWVudCA9PT0gMikgewogICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSAqIGZvbnRTaXplOwogICAgICBzaGlmdCA9IHRvdGFsV2lkdGggLSB3aWR0aCAtIGhQYWRkaW5nOwogICAgfSBlbHNlIHsKICAgICAgc2hpZnQgPSBoUGFkZGluZzsKICAgIH0KICAgIGNvbnN0IHNoaWZ0U3RyID0gbnVtYmVyVG9TdHJpbmcoc2hpZnQgLSBwcmV2SW5mby5zaGlmdCk7CiAgICBwcmV2SW5mby5zaGlmdCA9IHNoaWZ0OwogICAgdlBhZGRpbmcgPSBudW1iZXJUb1N0cmluZyh2UGFkZGluZyk7CiAgICByZXR1cm4gYCR7c2hpZnRTdHJ9ICR7dlBhZGRpbmd9IFRkICgke2VzY2FwZVN0cmluZyh0ZXh0KX0pIFRqYDsKICB9CiAgX2dldFNhdmVGaWVsZFJlc291cmNlcyh4cmVmKSB7CiAgICBjb25zdCB7CiAgICAgIGxvY2FsUmVzb3VyY2VzLAogICAgICBhcHBlYXJhbmNlUmVzb3VyY2VzLAogICAgICBhY3JvRm9ybVJlc291cmNlcwogICAgfSA9IHRoaXMuX2ZpZWxkUmVzb3VyY2VzOwogICAgY29uc3QgZm9udE5hbWUgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhPy5mb250TmFtZTsKICAgIGlmICghZm9udE5hbWUpIHsKICAgICAgcmV0dXJuIGxvY2FsUmVzb3VyY2VzIHx8IERpY3QuZW1wdHk7CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlc291cmNlcyBvZiBbbG9jYWxSZXNvdXJjZXMsIGFwcGVhcmFuY2VSZXNvdXJjZXNdKSB7CiAgICAgIGlmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgY29uc3QgbG9jYWxGb250ID0gcmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgICAgIGlmIChsb2NhbEZvbnQgaW5zdGFuY2VvZiBEaWN0ICYmIGxvY2FsRm9udC5oYXMoZm9udE5hbWUpKSB7CiAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFjcm9Gb3JtUmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCkgewogICAgICBjb25zdCBhY3JvRm9ybUZvbnQgPSBhY3JvRm9ybVJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgaWYgKGFjcm9Gb3JtRm9udCBpbnN0YW5jZW9mIERpY3QgJiYgYWNyb0Zvcm1Gb250Lmhhcyhmb250TmFtZSkpIHsKICAgICAgICBjb25zdCBzdWJGb250RGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICAgIHN1YkZvbnREaWN0LnNldChmb250TmFtZSwgYWNyb0Zvcm1Gb250LmdldFJhdyhmb250TmFtZSkpOwogICAgICAgIGNvbnN0IHN1YlJlc291cmNlc0RpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgICAgICBzdWJSZXNvdXJjZXNEaWN0LnNldCgiRm9udCIsIHN1YkZvbnREaWN0KTsKICAgICAgICByZXR1cm4gRGljdC5tZXJnZSh7CiAgICAgICAgICB4cmVmLAogICAgICAgICAgZGljdEFycmF5OiBbc3ViUmVzb3VyY2VzRGljdCwgbG9jYWxSZXNvdXJjZXNdLAogICAgICAgICAgbWVyZ2VTdWJEaWN0czogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbG9jYWxSZXNvdXJjZXMgfHwgRGljdC5lbXB0eTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KY2xhc3MgVGV4dFdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QKICAgIH0gPSBwYXJhbXM7CiAgICBpZiAoZGljdC5oYXMoIlBNRCIpKSB7CiAgICAgI
20HRoaXMuZmxhZ3MgfD0gQW5ub3RhdGlvbkZsYWcuSElEREVOOwogICAgICB0aGlzLmRhdGEuaGlkZGVuID0gdHJ1ZTsKICAgICAgd2FybigiQmFyY29kZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0KICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEucmVhZE9ubHkgJiYgIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLl9oYXNUZXh0ID0gdHJ1ZTsKICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gIiI7CiAgICB9CiAgICBsZXQgYWxpZ25tZW50ID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIlEiCiAgICB9KTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhbGlnbm1lbnQpIHx8IGFsaWdubWVudCA8IDAgfHwgYWxpZ25tZW50ID4gMikgewogICAgICBhbGlnbm1lbnQgPSBudWxsOwogICAgfQogICAgdGhpcy5kYXRhLnRleHRBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CiAgICBsZXQgbWF4aW11bUxlbmd0aCA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJNYXhMZW4iCiAgICB9KTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhpbXVtTGVuZ3RoKSB8fCBtYXhpbXVtTGVuZ3RoIDwgMCkgewogICAgICBtYXhpbXVtTGVuZ3RoID0gMDsKICAgIH0KICAgIHRoaXMuZGF0YS5tYXhMZW4gPSBtYXhpbXVtTGVuZ3RoOwogICAgdGhpcy5kYXRhLm11bHRpTGluZSA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuTVVMVElMSU5FKTsKICAgIHRoaXMuZGF0YS5jb21iID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CKSAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSUxJTkUpICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBBU1NXT1JEKSAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5GSUxFU0VMRUNUKSAmJiB0aGlzLmRhdGEubWF4TGVuICE9PSAwOwogICAgdGhpcy5kYXRhLmRvTm90U2Nyb2xsID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5ET05PVFNDUk9MTCk7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiAhIXRoaXMuYXBwZWFyYW5jZSAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzOwogIH0KICBfZ2V0Q29tYkFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnQsIHRleHQsIGZvbnRTaXplLCB3aWR0aCwgaGVpZ2h0LCBoUGFkZGluZywgdlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBjb21iV2lkdGggPSB3aWR0aCAvIHRoaXMuZGF0YS5tYXhMZW47CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBjb25zdCBidWYgPSBbXTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IGZvbnQuZ2V0Q2hhclBvc2l0aW9ucyh0ZXh0KTsKICAgIGZvciAoY29uc3QgW3N0YXJ0LCBlbmRdIG9mIHBvc2l0aW9ucykgewogICAgICBidWYucHVzaChgKCR7ZXNjYXBlU3RyaW5nKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKX0pIFRqYCk7CiAgICB9CiAgICBjb25zdCByZW5kZXJlZENvbWIgPSBidWYuam9pbihgICR7bnVtYmVyVG9TdHJpbmcoY29tYldpZHRoKX0gMCBUZCBgKTsKICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAke251bWJlclRvU3RyaW5nKGhQYWRkaW5nKX0gJHtudW1iZXJUb1N0cmluZyh2UGFkZGluZyArIGRlc2NlbnQpfSBUbSAke3JlbmRlcmVkQ29tYn1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9nZXRNdWx0aWxpbmVBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBsaW5lcywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgaFBhZGRpbmcsIHZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgYnVmID0gW107CiAgICBjb25zdCB0b3RhbFdpZHRoID0gd2lkdGggLSAyICogaFBhZGRpbmc7CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgY29uc3QgY2h1bmtzID0gdGhpcy5fc3BsaXRMaW5lKGxpbmUsIGZvbnQsIGZvbnRTaXplLCB0b3RhbFdpZHRoKTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY2h1bmtzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICBjb25zdCBjaHVuayA9IGNodW5rc1tqXTsKICAgICAgICBjb25zdCB2U2hpZnQgPSBpID09PSAwICYmIGogPT09IDAgPyAtdlBhZGRpbmcgLSAobGluZUhlaWdodCAtIGRlc2NlbnQpIDogLWxpbmVIZWlnaHQ7CiAgICAgICAgYnVmLnB1c2godGhpcy5fcmVuZGVyVGV4dChjaHVuaywgZm9udCwgZm9udFNpemUsIHdpZHRoLCBhbGlnbm1lbnQsIHByZXZJbmZvLCBoUGFkZGluZywgdlNoaWZ0KSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGNvbnN0IHJlbmRlcmVkVGV4dCA9IGJ1Zi5qb2luKCJcbiIpOwogICAgcmV0dXJuIGAvVHggQk1DIHEgJHtjb2xvcnN9QlQgYCArIGRlZmF1bHRBcHBlYXJhbmNlICsgYCAxIDAgMCAxIDAgJHtudW1iZXJUb1N0cmluZyhoZWlnaHQpfSBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBjYWNoZSA9IHt9KSB7CiAgICBsaW5lID0gY2FjaGUubGluZSB8fCBsaW5lOwogICAgY29uc3QgZ2x5cGhzID0gY2FjaGUuZ2x5cGhzIHx8IGZvbnQuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgIGlmIChnbHlwaHMubGVuZ3RoIDw9IDEpIHsKICAgICAgcmV0dXJuIFtsaW5lXTsKICAgIH0KICAgIGNvbnN0IHBvc2l0aW9ucyA9IGNhY2hlLnBvc2l0aW9ucyB8fCBmb250LmdldENoYXJQb3NpdGlvbnMobGluZSk7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgbGV0IGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zSW5TdHJpbmdFbmQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zID0gLTEsCiAgICAgI
20HN0YXJ0Q2h1bmsgPSAwLAogICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcG9zaXRpb25zW2ldOwogICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIGlmIChnbHlwaC51bmljb2RlID09PSAiICIpIHsKICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMTsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSBzdGFydDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kID0gZW5kOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgaWYgKGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgIT09IC0xKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBsYXN0U3BhY2VQb3NJblN0cmluZ0VuZCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kOwogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvcyArIDE7CiAgICAgICAgICBsYXN0U3BhY2VQb3NJblN0cmluZ1N0YXJ0ID0gLTE7CiAgICAgICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFdpZHRoICs9IGdseXBoV2lkdGg7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydENodW5rIDwgbGluZS5sZW5ndGgpIHsKICAgICAgY2h1bmtzLnB1c2gobGluZS5zdWJzdHJpbmcoc3RhcnRDaHVuaywgbGluZS5sZW5ndGgpKTsKICAgIH0KICAgIHJldHVybiBjaHVua3M7CiAgfQogIGFzeW5jIGV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpIHsKICAgIGF3YWl0IHN1cGVyLmV4dHJhY3RUZXh0Q29udGVudChldmFsdWF0b3IsIHRhc2ssIHZpZXdCb3gpOwogICAgY29uc3QgdGV4dCA9IHRoaXMuZGF0YS50ZXh0Q29udGVudDsKICAgIGlmICghdGV4dCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhbGxUZXh0ID0gdGV4dC5qb2luKCJcbiIpOwogICAgaWYgKGFsbFRleHQgPT09IHRoaXMuZGF0YS5maWVsZFZhbHVlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlZ2V4ID0gYWxsVGV4dC5yZXBsYWNlQWxsKC8oWy4qKz9eJHt9KCl8W1xdXFxdKXwoXHMrKS9nLCAoX20sIHAxKSA9PiBwMSA/IGBcXCR7cDF9YCA6ICJcXHMrIik7CiAgICBpZiAobmV3IFJlZ0V4cChgXlxccyoke3JlZ2V4fVxccyokYCkudGVzdCh0aGlzLmRhdGEuZmllbGRWYWx1ZSkpIHsKICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUuc3BsaXQoIlxuIik7CiAgICB9CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSB8fCAiIiwKICAgICAgbXVsdGlsaW5lOiB0aGlzLmRhdGEubXVsdGlMaW5lLAogICAgICBwYXNzd29yZDogdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCksCiAgICAgIGNoYXJMaW1pdDogdGhpcy5kYXRhLm1heExlbiwKICAgICAgY29tYjogdGhpcy5kYXRhLmNvbWIsCiAgICAgIGVkaXRhYmxlOiAhdGhpcy5kYXRhLnJlYWRPbmx5LAogICAgICBoaWRkZW46IHRoaXMuZGF0YS5o
20aWRkZW4sCiAgICAgIG5hbWU6IHRoaXMuZGF0YS5maWVsZE5hbWUsCiAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LAogICAgICBhY3Rpb25zOiB0aGlzLmRhdGEuYWN0aW9ucywKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZGF0YS5ib3JkZXJDb2xvciwKICAgICAgZmlsbENvbG9yOiB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLAogICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiwKICAgICAgdHlwZTogInRleHQiCiAgICB9OwogIH0KfQpjbGFzcyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA9IG51bGw7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSBudWxsOwogICAgdGhpcy5kYXRhLmNoZWNrQm94ID0gIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOwogICAgdGhpcy5kYXRhLnJhZGlvQnV0dG9uID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5SQURJTykgJiYgIXRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7CiAgICB0aGlzLmRhdGEucHVzaEJ1dHRvbiA9IHRoaXMuaGFzRmllbGRGbGFnKEFubm90YXRpb25GaWVsZEZsYWcuUFVTSEJVVFRPTik7CiAgICB0aGlzLmRhdGEuaXNUb29sdGlwT25seSA9IGZhbHNlOwogICAgaWYgKHRoaXMuZGF0YS5jaGVja0JveCkgewogICAgICB0aGlzLl9wcm9jZXNzQ2hlY2tCb3gocGFyYW1zKTsKICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnJhZGlvQnV0dG9uKSB7CiAgICAgIHRoaXMuX3Byb2Nlc3NSYWRpb0J1dHRvbihwYXJhbXMpOwogICAgfSBlbHNlIGlmICh0aGlzLmRhdGEucHVzaEJ1dHRvbikgewogICAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdHJ1ZTsKICAgICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgICB0aGlzLl9wcm9jZXNzUHVzaEJ1dHRvbihwYXJhbXMpOwogICAgfSBlbHNlIHsKICAgICAgd2FybigiSW52YWxpZCBmaWVsZCBmbGFncyBmb3IgYnV0dG9uIHdpZGdldCBhbm5vdGF0aW9uIik7CiAgICB9CiAgfQogIGFzeW5jIGdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICh0aGlzLmRhdGEucHVzaEJ1dHRvbikgewogICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBmYWxzZSwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgfQogICAgbGV0IHZhbHVlID0gbnVsbDsKICAgIGxldCByb3RhdGlvbiA9IG51bGw7CiAgICBpZiAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gYW5ub3RhdGlvblN0b3JhZ2UuZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5ID8gc3RvcmFnZUVudHJ5LnZhbHVlIDogbnVsbDsKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnkgPyBzdG9yYWdlRW50cnkucm90YXRpb24gOiBudWxsOwogICAgfQogICAgaWYgKHZhbHVlID09PSBudWxsICYmIHRoaXMuYXBwZWFyYW5jZSkgewogICAgICByZXR1cm4gc3VwZXIuZ2V0T3BlcmF0b3JMaXN0KGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuZGF0YS5jaGVja0JveCA/IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9PT0gdGhpcy5kYXRhLmJ1dHRvblZhbHVlOwogICAgfQogICAgY29uc3QgYXBwZWFyYW5jZSA9IHZhbHVlID8gdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA6IHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTsKICAgIGlmIChhcHBlYXJhbmNlKSB7CiAgICAgIGNvbnN0IHNhdmVkQXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKICAgICAgY29uc3Qgc2F2ZWRNYXRyaXggPSBsb29rdXBNYXRyaXgoYXBwZWFyYW5jZS5kaWN0LmdldEFycmF5KCJNYXRyaXgiKSwgSURFTlRJVFlfTUFUUklYKTsKICAgICAgaWYgKHJvdGF0aW9uKSB7CiAgICAgICAgYXBwZWFyYW5jZS5kaWN0LnNldCgiTWF0cml4IiwgdGhpcy5nZXRSb3RhdGlvbk1hdHJpeChhbm5vdGF0aW9uU3RvcmFnZSkpOwogICAgICB9CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7CiAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBzYXZlZEFwcGVhcmFuY2U7CiAgICAgIGFwcGVhcmFuY2UuZGljdC5zZXQoIk1hdHJpeCIsIHNhdmVkTWF0cml4KTsKICAgICAgcmV0dXJuIG9wZXJhdG9yTGlzdDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG9wTGlzdDogbmV3IE9wZXJhdG9yTGlzdCgpLAogICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgIH07CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykgewogICAgaWYgKHRoaXMuZGF0YS5jaGVja0JveCkgewogICAgICB0aGlzLl9zYXZlQ2hlY2tib3goZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHsKICAgICAgdGhpcy5fc2F2ZVJhZGlvQnV0dG9uKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpOwogICAgfQogIH0KICBhc3luYyBfc2F2ZUNoZWNrYm94KGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGlmICghYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gYW5ub3RhdGlvblN0b3JhZ2UuZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICBjb25zdCBmbGFncyA9IHRoaXMuX2J1
20aWxkRmxhZ3Moc3RvcmFnZUVudHJ5Py5ub1ZpZXcsIHN0b3JhZ2VFbnRyeT8ubm9QcmludCk7CiAgICBsZXQgcm90YXRpb24gPSBzdG9yYWdlRW50cnk/LnJvdGF0aW9uLAogICAgICB2YWx1ZSA9IHN0b3JhZ2VFbnRyeT8udmFsdWU7CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiBmbGFncyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuZXhwb3J0VmFsdWU7CiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBsZXQgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpOwogICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGRpY3QgPSBkaWN0LmNsb25lKCk7CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuZXhwb3J0VmFsdWU7CiAgICB9CiAgICBjb25zdCB4ZmEgPSB7CiAgICAgIHBhdGg6IHRoaXMuZGF0YS5maWVsZE5hbWUsCiAgICAgIHZhbHVlOiB2YWx1ZSA/IHRoaXMuZGF0YS5leHBvcnRWYWx1ZSA6ICIiCiAgICB9OwogICAgY29uc3QgbmFtZSA9IE5hbWUuZ2V0KHZhbHVlID8gdGhpcy5kYXRhLmV4cG9ydFZhbHVlIDogIk9mZiIpOwogICAgdGhpcy5zZXRWYWx1ZShkaWN0LCBuYW1lLCBldmFsdWF0b3IueHJlZiwgY2hhbmdlcyk7CiAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBpZiAoZmxhZ3MgIT09IHVuZGVmaW5lZCkgewogICAgICBkaWN0LnNldCgiRiIsIGZsYWdzKTsKICAgIH0KICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0LAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlczogZmFsc2UKICAgIH0pOwogIH0KICBhc3luYyBfc2F2ZVJhZGlvQnV0dG9uKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGlmICghYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gYW5ub3RhdGlvblN0b3JhZ2UuZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICBjb25zdCBmbGFncyA9IHRoaXMuX2J1aWxkRmxhZ3Moc3RvcmFnZUVudHJ5Py5ub1ZpZXcsIHN0b3JhZ2VFbnRyeT8ubm9QcmludCk7CiAgICBsZXQgcm90YXRpb24gPSBzdG9yYWdlRW50cnk/LnJvdGF0aW9uLAogICAgICB2YWx1ZSA9IHN0b3JhZ2VFbnRyeT8udmFsdWU7CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiBmbGFncyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBsZXQgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpOwogICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGRpY3QgPSBkaWN0LmNsb25lKCk7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSB0aGlzLmRhdGEuYnV0dG9uVmFsdWU7CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICBjb25zdCB4ZmEgPSB7CiAgICAgIHBhdGg6IHRoaXMuZGF0YS5maWVsZE5hbWUsCiAgICAgI
20HZhbHVlOiB2YWx1ZSA/IHRoaXMuZGF0YS5idXR0b25WYWx1ZSA6ICIiCiAgICB9OwogICAgY29uc3QgbmFtZSA9IE5hbWUuZ2V0KHZhbHVlID8gdGhpcy5kYXRhLmJ1dHRvblZhbHVlIDogIk9mZiIpOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIHRoaXMuc2V0VmFsdWUoZGljdCwgbmFtZSwgZXZhbHVhdG9yLnhyZWYsIGNoYW5nZXMpOwogICAgfQogICAgZGljdC5zZXQoIkFTIiwgbmFtZSk7CiAgICBkaWN0LnNldCgiTSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgaWYgKGZsYWdzICE9PSB1bmRlZmluZWQpIHsKICAgICAgZGljdC5zZXQoIkYiLCBmbGFncyk7CiAgICB9CiAgICBjb25zdCBtYXliZU1LID0gdGhpcy5fZ2V0TUtEaWN0KHJvdGF0aW9uKTsKICAgIGlmIChtYXliZU1LKSB7CiAgICAgIGRpY3Quc2V0KCJNSyIsIG1heWJlTUspOwogICAgfQogICAgY2hhbmdlcy5wdXQodGhpcy5yZWYsIHsKICAgICAgZGF0YTogZGljdCwKICAgICAgeGZhLAogICAgICBuZWVkQXBwZWFyYW5jZXM6IGZhbHNlCiAgICB9KTsKICB9CiAgX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZShwYXJhbXMsIHR5cGUpIHsKICAgIGNvbnN0IHdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV07CiAgICBjb25zdCBiYm94ID0gWzAsIDAsIHdpZHRoLCBoZWlnaHRdOwogICAgY29uc3QgRk9OVF9SQVRJTyA9IDAuODsKICAgIGNvbnN0IGZvbnRTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCkgKiBGT05UX1JBVElPOwogICAgbGV0IG1ldHJpY3MsIGNoYXI7CiAgICBpZiAodHlwZSA9PT0gImNoZWNrIikgewogICAgICBtZXRyaWNzID0gewogICAgICAgIHdpZHRoOiAwLjc1NSAqIGZvbnRTaXplLAogICAgICAgIGhlaWdodDogMC43MDUgKiBmb250U2l6ZQogICAgICB9OwogICAgICBjaGFyID0gIlx4MzMiOwogICAgfSBlbHNlIGlmICh0eXBlID09PSAiZGlzYyIpIHsKICAgICAgbWV0cmljcyA9IHsKICAgICAgICB3aWR0aDogMC43OTEgKiBmb250U2l6ZSwKICAgICAgICBoZWlnaHQ6IDAuNzA1ICogZm9udFNpemUKICAgICAgfTsKICAgICAgY2hhciA9ICJceDZDIjsKICAgIH0gZWxzZSB7CiAgICAgIHVucmVhY2hhYmxlKGBfZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlIC0gdW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlfWApOwogICAgfQogICAgY29uc3QgeFNoaWZ0ID0gbnVtYmVyVG9TdHJpbmcoKHdpZHRoIC0gbWV0cmljcy53aWR0aCkgLyAyKTsKICAgIGNvbnN0IHlTaGlmdCA9IG51bWJlclRvU3RyaW5nKChoZWlnaHQgLSBtZXRyaWNzLmhlaWdodCkgLyAyKTsKICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBgcSBCVCAvUGRmSnNaYURiICR7Zm9udFNpemV9IFRmIDAgZyAke3hTaGlmdH0gJHt5U2hpZnR9IFRkICgke2NoYXJ9KSBUaiBFVCBRYDsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QocGFyYW1zLnhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIGJib3gpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJNYXRyaXgiLCBbMSwgMCwgMCwgMSwgMCwgMF0pOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJMZW5ndGgiLCBhcHBlYXJhbmNlLmxlbmd0aCk7CiAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgRGljdChwYXJhbXMueHJlZik7CiAgICBjb25zdCBmb250ID0gbmV3IERpY3QocGFyYW1zLnhyZWYpOwogICAgZm9udC5zZXQoIlBkZkpzWmFEYiIsIHRoaXMuZmFsbGJhY2tGb250RGljdCk7CiAgICByZXNvdXJjZXMuc2V0KCJGb250IiwgZm9udCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UpOwogIH0KICBfcHJvY2Vzc0NoZWNrQm94KHBhcmFtcykgewogICAgY29uc3QgY3VzdG9tQXBwZWFyYW5jZSA9IHBhcmFtcy5kaWN0LmdldCgiQVAiKTsKICAgIGlmICghKGN1c3RvbUFwcGVhcmFuY2UgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZS5nZXQoIk4iKTsKICAgIGlmICghKG5vcm1hbEFwcGVhcmFuY2UgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBhc1ZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKHBhcmFtcy5kaWN0LmdldCgiQVMiKSk7CiAgICBpZiAodHlwZW9mIGFzVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gYXNWYWx1ZTsKICAgIH0KICAgIGNvbnN0IHllcyA9IHRoaXMuZGF0YS5maWVsZFZhbHVlICE9PSBudWxsICYmIHRoaXMuZGF0YS5maWVsZFZhbHVlICE9PSAiT2ZmIiA/IHRoaXMuZGF0YS5maWVsZFZhbHVlIDogIlllcyI7CiAgICBjb25zdCBleHBvcnRWYWx1ZXMgPSBub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKTsKICAgIGlmIChleHBvcnRWYWx1ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgIGV4cG9ydFZhbHVlcy5wdXNoKCJPZmYiLCB5ZXMpOwogICAgfSBlbHNlIGlmIChleHBvcnRWYWx1ZXMubGVuZ3RoID09PSAxKSB7CiAgICAgIGlmIChleHBvcnRWYWx1ZXNbMF0gPT09ICJPZmYiKSB7CiAgICAgICAgZXhwb3J0VmFsdWVzLnB1c2goeWVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBleHBvcnRWYWx1ZXMudW5zaGlmdCgiT2ZmIik7CiAgICAgI
20H0KICAgIH0gZWxzZSBpZiAoZXhwb3J0VmFsdWVzLmluY2x1ZGVzKHllcykpIHsKICAgICAgZXhwb3J0VmFsdWVzLmxlbmd0aCA9IDA7CiAgICAgIGV4cG9ydFZhbHVlcy5wdXNoKCJPZmYiLCB5ZXMpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgb3RoZXJZZXMgPSBleHBvcnRWYWx1ZXMuZmluZCh2ID0+IHYgIT09ICJPZmYiKTsKICAgICAgZXhwb3J0VmFsdWVzLmxlbmd0aCA9IDA7CiAgICAgIGV4cG9ydFZhbHVlcy5wdXNoKCJPZmYiLCBvdGhlclllcyk7CiAgICB9CiAgICBpZiAoIWV4cG9ydFZhbHVlcy5pbmNsdWRlcyh0aGlzLmRhdGEuZmllbGRWYWx1ZSkpIHsKICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSAiT2ZmIjsKICAgIH0KICAgIHRoaXMuZGF0YS5leHBvcnRWYWx1ZSA9IGV4cG9ydFZhbHVlc1sxXTsKICAgIGNvbnN0IGNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQodGhpcy5kYXRhLmV4cG9ydFZhbHVlKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBjaGVja2VkQXBwZWFyYW5jZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gPyBjaGVja2VkQXBwZWFyYW5jZSA6IG51bGw7CiAgICBjb25zdCB1bmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQoIk9mZiIpOwogICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gdW5jaGVja2VkQXBwZWFyYW5jZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gPyB1bmNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGlmICh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZShwYXJhbXMsICJjaGVjayIpOwogICAgfQogICAgaWYgKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSkgewogICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKTsKICAgIH0KICAgIHRoaXMuX2ZhbGxiYWNrRm9udERpY3QgPSB0aGlzLmZhbGxiYWNrRm9udERpY3Q7CiAgICBpZiAodGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID09PSBudWxsKSB7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA9ICJPZmYiOwogICAgfQogIH0KICBfcHJvY2Vzc1JhZGlvQnV0dG9uKHBhcmFtcykgewogICAgdGhpcy5kYXRhLmJ1dHRvblZhbHVlID0gbnVsbDsKICAgIGNvbnN0IGZpZWxkUGFyZW50ID0gcGFyYW1zLmRpY3QuZ2V0KCJQYXJlbnQiKTsKICAgIGlmIChmaWVsZFBhcmVudCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMuZGljdC5nZXRSYXcoIlBhcmVudCIpOwogICAgICBjb25zdCBmaWVsZFBhcmVudFZhbHVlID0gZmllbGRQYXJlbnQuZ2V0KCJWIik7CiAgICAgIGlmIChmaWVsZFBhcmVudFZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGZpZWxkUGFyZW50VmFsdWUpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gcGFyYW1zLmRpY3QuZ2V0KCJBUCIpOwogICAgaWYgKCEoYXBwZWFyYW5jZVN0YXRlcyBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IG5vcm1hbEFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlU3RhdGVzLmdldCgiTiIpOwogICAgaWYgKCEobm9ybWFsQXBwZWFyYW5jZSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAoY29uc3Qga2V5IG9mIG5vcm1hbEFwcGVhcmFuY2UuZ2V0S2V5cygpKSB7CiAgICAgIGlmIChrZXkgIT09ICJPZmYiKSB7CiAgICAgICAgdGhpcy5kYXRhLmJ1dHRvblZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGtleSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQodGhpcy5kYXRhLmJ1dHRvblZhbHVlKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBjaGVja2VkQXBwZWFyYW5jZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gPyBjaGVja2VkQXBwZWFyYW5jZSA6IG51bGw7CiAgICBjb25zdCB1bmNoZWNrZWRBcHBlYXJhbmNlID0gbm9ybWFsQXBwZWFyYW5jZS5nZXQoIk9mZiIpOwogICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gdW5jaGVja2VkQXBwZWFyYW5jZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gPyB1bmNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGlmICh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZShwYXJhbXMsICJkaXNjIik7CiAgICB9CiAgICBpZiAodGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfQogICAgdGhpcy5fZmFsbGJhY2tGb250RGljdCA9IHRoaXMuZmFsbGJhY2tGb250RGljdDsKICAgIGlmICh0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgPT09IG51bGwpIHsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID0gIk9mZiI7CiAgICB9CiAgfQogIF9wcm9jZXNzUHVzaEJ1dHRvbihwYXJhbXMpIHsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgYW5ub3RhdGlvbkdsb2JhbHMKICAgIH0gPSBwYXJhbXM7CiAgICBpZiAoIWRpY3QuaGFzKCJBIikgJiYgIWRpY3QuaGFzKCJBQSIpICYmICF0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KSB7CiAgICAgIHdhcm4oIlB1c2ggYnV0dG9ucyB3aXRob3V0IGFjdGlvbiBkaWN0aW9uYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5kYXRhLmlzVG9vbHRpcE9ubHkgPSAhZGljdC5oYXMoIkEiKSAmJiAhZGljdC5oYXMoIkFBIik7CiAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgICBkZXN0RGljdDogZGljdCwKICAgICAgcmVzdWx0T2JqOiB0aGlzLmRhdGEsCiAgICAgIGRvY0Jhc2VVcmw6IGFubm90YXRpb25HbG9iYWxzLmJhc2VVcmwsCiAgICAgIGRvY0F0dGFjaG1lbnRzOiBhbm5vdGF0aW9uR2xvYmFscy5hdHRhY2htZW50cwogICAgfSk7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgbGV0IHR5cGUgPSAiYnV0dG9uIjsKICAgIGxldCBleHBvcnRWYWx1ZXM7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgI
20HR5cGUgPSAiY2hlY2tib3giOwogICAgICBleHBvcnRWYWx1ZXMgPSB0aGlzLmRhdGEuZXhwb3J0VmFsdWU7CiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgewogICAgICB0eXBlID0gInJhZGlvYnV0dG9uIjsKICAgICAgZXhwb3J0VmFsdWVzID0gdGhpcy5kYXRhLmJ1dHRvblZhbHVlOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlIHx8ICJPZmYiLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSwKICAgICAgZXhwb3J0VmFsdWVzLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgcmVjdDogdGhpcy5kYXRhLnJlY3QsCiAgICAgIGhpZGRlbjogdGhpcy5kYXRhLmhpZGRlbiwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGUKICAgIH07CiAgfQogIGdldCBmYWxsYmFja0ZvbnREaWN0KCkgewogICAgY29uc3QgZGljdCA9IG5ldyBEaWN0KCk7CiAgICBkaWN0LnNldCgiQmFzZUZvbnQiLCBOYW1lLmdldCgiWmFwZkRpbmdiYXRzIikpOwogICAgZGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOwogICAgZGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOwogICAgZGljdC5zZXQoIkVuY29kaW5nIiwgTmFtZS5nZXQoIlphcGZEaW5nYmF0c0VuY29kaW5nIikpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZmFsbGJhY2tGb250RGljdCIsIGRpY3QpOwogIH0KfQpjbGFzcyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5pbmRpY2VzID0gZGljdC5nZXRBcnJheSgiSSIpOwogICAgdGhpcy5oYXNJbmRpY2VzID0gQXJyYXkuaXNBcnJheSh0aGlzLmluZGljZXMpICYmIHRoaXMuaW5kaWNlcy5sZW5ndGggPiAwOwogICAgdGhpcy5kYXRhLm9wdGlvbnMgPSBbXTsKICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHsKICAgICAgZGljdCwKICAgICAga2V5OiAiT3B0IgogICAgfSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcHRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBvcHRpb24gPSB4cmVmLmZldGNoSWZSZWYob3B0aW9uc1tpXSk7CiAgICAgICAgY29uc3QgaXNPcHRpb25BcnJheSA9IEFycmF5LmlzQXJyYXkob3B0aW9uKTsKICAgICAgICB0aGlzLmRhdGEub3B0aW9uc1tpXSA9IHsKICAgICAgICAgIGV4cG9ydFZhbHVlOiB0aGlzLl9kZWNvZGVGb3JtVmFsdWUoaXNPcHRpb25BcnJheSA/IHhyZWYuZmV0Y2hJZlJlZihvcHRpb25bMF0pIDogb3B0aW9uKSwKICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGlzT3B0aW9uQXJyYXkgPyB4cmVmLmZldGNoSWZSZWYob3B0aW9uWzFdKSA6IG9wdGlvbikKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuaGFzSW5kaWNlcykgewogICAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5maWVsZFZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gW3RoaXMuZGF0YS5maWVsZFZhbHVlXTsKICAgICAgfSBlbHNlIGlmICghdGhpcy5kYXRhLmZpZWxkVmFsdWUpIHsKICAgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFtdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFtdOwogICAgICBjb25zdCBpaSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDsKICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kaWNlcykgewogICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGkpICYmIGkgPj0gMCAmJiBpIDwgaWkpIHsKICAgICAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlLnB1c2godGhpcy5kYXRhLm9wdGlvbnNbaV0uZXhwb3J0VmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgIHRoaXMuZGF0YS5vcHRpb25zID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUubWFwKHZhbHVlID0+ICh7CiAgICAgICAgZXhwb3J0VmFsdWU6IHZhbHVlLAogICAgICAgIGRpc3BsYXlWYWx1ZTogdmFsdWUKICAgICAgfSkpOwogICAgfQogICAgdGhpcy5kYXRhLmNvbWJvID0gdGhpcy5oYXNGaWVsZEZsYWcoQW5ub3RhdGlvbkZpZWxkRmxhZy5DT01CTyk7CiAgICB0aGlzLmRhdGEubXVsdGlTZWxlY3QgPSB0aGlzLmhhc0ZpZWxkRmxhZyhBbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJU0VMRUNUKTsKICAgIHRoaXMuX2hhc1RleHQgPSB0cnVlOwogIH0KICBnZXRGaWVsZE9iamVjdCgpIHsKICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRhdGEuY29tYm8gPyAiY29tYm9ib3giIDogImxpc3Rib3giOwogICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGggPiAwID8gdGhpcy5kYXRhLmZpZWxkVmFsdWVbMF0gOiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWUsCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgbmFtZTogdGh
20pcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgcmVjdDogdGhpcy5kYXRhLnJlY3QsCiAgICAgIG51bUl0ZW1zOiB0aGlzLmRhdGEuZmllbGRWYWx1ZS5sZW5ndGgsCiAgICAgIG11bHRpcGxlU2VsZWN0aW9uOiB0aGlzLmRhdGEubXVsdGlTZWxlY3QsCiAgICAgIGhpZGRlbjogdGhpcy5kYXRhLmhpZGRlbiwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIGl0ZW1zOiB0aGlzLmRhdGEub3B0aW9ucywKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZGF0YS5ib3JkZXJDb2xvciwKICAgICAgZmlsbENvbG9yOiB0aGlzLmRhdGEuYmFja2dyb3VuZENvbG9yLAogICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiwKICAgICAgdHlwZQogICAgfTsKICB9CiAgYW1lbmRTYXZlZERpY3QoYW5ub3RhdGlvblN0b3JhZ2UsIGRpY3QpIHsKICAgIGlmICghdGhpcy5oYXNJbmRpY2VzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCB2YWx1ZXMgPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnZhbHVlOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHsKICAgICAgdmFsdWVzID0gW3ZhbHVlc107CiAgICB9CiAgICBjb25zdCBpbmRpY2VzID0gW107CiAgICBjb25zdCB7CiAgICAgIG9wdGlvbnMKICAgIH0gPSB0aGlzLmRhdGE7CiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlpID0gb3B0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGlmIChvcHRpb25zW2ldLmV4cG9ydFZhbHVlID09PSB2YWx1ZXNbal0pIHsKICAgICAgICBpbmRpY2VzLnB1c2goaSk7CiAgICAgICAgaiArPSAxOwogICAgICB9CiAgICB9CiAgICBkaWN0LnNldCgiSSIsIGluZGljZXMpOwogIH0KICBhc3luYyBfZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICh0aGlzLmRhdGEuY29tYm8pIHsKICAgICAgcmV0dXJuIHN1cGVyLl9nZXRBcHBlYXJhbmNlKGV2YWx1YXRvciwgdGFzaywgaW50ZW50LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBsZXQgZXhwb3J0ZWRWYWx1ZSwgcm90YXRpb247CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk7CiAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5LnJvdGF0aW9uOwogICAgICBleHBvcnRlZFZhbHVlID0gc3RvcmFnZUVudHJ5LnZhbHVlOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgZXhwb3J0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmICF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoZXhwb3J0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGV4cG9ydGVkVmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTsKICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoZXhwb3J0ZWRWYWx1ZSkpIHsKICAgICAgZXhwb3J0ZWRWYWx1ZSA9IFtleHBvcnRlZFZhbHVlXTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRQYWRkaW5nID0gMTsKICAgIGNvbnN0IGRlZmF1bHRIUGFkZGluZyA9IDI7CiAgICBsZXQgdG90YWxIZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogICAgbGV0IHRvdGFsV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdOwogICAgaWYgKHJvdGF0aW9uID09PSA5MCB8fCByb3RhdGlvbiA9PT0gMjcwKSB7CiAgICAgIFt0b3RhbFdpZHRoLCB0b3RhbEhlaWdodF0gPSBbdG90YWxIZWlnaHQsIHRvdGFsV2lkdGhdOwogICAgfQogICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoOwogICAgY29uc3QgdmFsdWVJbmRpY2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBleHBvcnRWYWx1ZQogICAgICB9ID0gdGhpcy5kYXRhLm9wdGlvbnNbaV07CiAgICAgIGlmIChleHBvcnRlZFZhbHVlLmluY2x1ZGVzKGV4cG9ydFZhbHVlKSkgewogICAgICAgIHZhbHVlSW5kaWNlcy5wdXNoKGkpOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEgPSBwYXJzZURlZmF1bHRBcHBlYXJhbmNlKHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlID0gIi9IZWx2ZXRpY2EgMCBUZiAwIGciKTsKICAgIH0KICAgIGNvbnN0IGZvbnQgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEsIHRoaXMuX2ZpZWxkUmVzb3VyY2VzLm1lcmdlZFJlc291cmNlcyk7CiAgICBsZXQgZGVmYXVsdEFwcGVhcmFuY2U7CiAgICBsZXQgewogICAgICBmb250U2l6ZQogICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7CiAgICBpZiAoIWZvbnRTaXplKSB7CiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAodG90YWxIZWlnaHQgLSBkZWZhdWx0UGFkZGluZykgLyBsaW5lQ291bnQ7CiAgICAgIGxldCBsaW5lV2lkdGggPSAtMTsKICAgICAgbGV0IHZhbHVlOwogICAgICBmb3IgKGNvbnN0IHsKICAgICAgICBkaXNwbGF5VmFsdWUKICAgICAgfSBvZiB0aGlzLmRhdGEub3B0aW9ucykgewogICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKGRpc3BsYXlWYWx1ZSwgZm9udCk7CiAgICAgICAgaWYgKHdpZHRoID4gbGluZVdpZHRoKSB7CiAgICAgICAgICBsaW5lV2lkdGggPSB3aWR0aDsKICAgICAgICAgIHZhbHVlID0gZGlzcGxheVZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICBbZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnRTaXplXSA9IHRoaXMuX2NvbXB1dGVGb250U2l6ZShsaW5lSGVpZ2h0LCB0b3RhbFdpZHRoIC0gMiAqIGRlZmF1bHRIUGFkZGluZywgdmFsdWUsIGZvbnQsIC0xKTsKICAgIH0gZWxzZSB7CiAgICAgIGRlZmF1bHRBcHBlYXJhbmNlID0gdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U7CiAgICB9CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZm9udFNpemUgKiBMSU5FX0ZBQ1RPUjsKICAgIGNvbnN0IHZQYWRkaW5nID0gKGxpbmVIZWlnaHQgLSBmb250U2l6ZSkgLyAyOwogICAgY29uc3QgbnVtYmVyT2ZWaXNpYmxlTGluZXMgPSBNYXRoLmZsb29yKHRvdGFsSGVpZ2h0IC8gbGluZUhlaWdodCk7CiAgICBsZXQgZmlyc3RJbmRleCA9IDA7CiAgICBpZiAodmFsdWVJbmRpY2VzLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgbWluSW5kZXggPSBNYXRoLm1pbiguLi52YWx1ZUluZGljZXMpOwogICAgICBjb25zdCBtYXhJbmRleCA9IE1hdGgubWF4KC4uLnZhbHVlSW5kaWNlcyk7CiAgICAgIGZpcnN0SW5kZXggPSBNYXRoLm1heCgwLCBtYXhJbmRleCAtIG51bWJlck9mVmlzaWJsZUxpbmVzICsgMSk7CiAgICAgIGlmIChmaXJzdEluZGV4ID4gbWluSW5kZXgpIHsKICAgICAgICBmaXJzdEluZGV4ID0gbWluSW5kZXg7CiAgICAgI
20H0KICAgIH0KICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKGZpcnN0SW5kZXggKyBudW1iZXJPZlZpc2libGVMaW5lcyArIDEsIGxpbmVDb3VudCk7CiAgICBjb25zdCBidWYgPSBbIi9UeCBCTUMgcSIsIGAxIDEgJHt0b3RhbFdpZHRofSAke3RvdGFsSGVpZ2h0fSByZSBXIG5gXTsKICAgIGlmICh2YWx1ZUluZGljZXMubGVuZ3RoKSB7CiAgICAgIGJ1Zi5wdXNoKCIwLjYwMDAwNiAwLjc1Njg2NiAwLjg1NDkwNCByZyIpOwogICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHZhbHVlSW5kaWNlcykgewogICAgICAgIGlmIChmaXJzdEluZGV4IDw9IGluZGV4ICYmIGluZGV4IDwgZW5kKSB7CiAgICAgICAgICBidWYucHVzaChgMSAke3RvdGFsSGVpZ2h0IC0gKGluZGV4IC0gZmlyc3RJbmRleCArIDEpICogbGluZUhlaWdodH0gJHt0b3RhbFdpZHRofSAke2xpbmVIZWlnaHR9IHJlIGZgKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGJ1Zi5wdXNoKCJCVCIsIGRlZmF1bHRBcHBlYXJhbmNlLCBgMSAwIDAgMSAwICR7dG90YWxIZWlnaHR9IFRtYCk7CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBmb3IgKGxldCBpID0gZmlyc3RJbmRleDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkaXNwbGF5VmFsdWUKICAgICAgfSA9IHRoaXMuZGF0YS5vcHRpb25zW2ldOwogICAgICBjb25zdCB2cGFkZGluZyA9IGkgPT09IGZpcnN0SW5kZXggPyB2UGFkZGluZyA6IDA7CiAgICAgIGJ1Zi5wdXNoKHRoaXMuX3JlbmRlclRleHQoZGlzcGxheVZhbHVlLCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCwgMCwgcHJldkluZm8sIGRlZmF1bHRIUGFkZGluZywgLWxpbmVIZWlnaHQgKyB2cGFkZGluZykpOwogICAgfQogICAgYnVmLnB1c2goIkVUIFEgRU1DIik7CiAgICByZXR1cm4gYnVmLmpvaW4oIlxuIik7CiAgfQp9CmNsYXNzIFNpZ25hdHVyZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IG51bGw7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9ICF0aGlzLmRhdGEuaGFzT3duQ2FudmFzOwogIH0KICBnZXRGaWVsZE9iamVjdCgpIHsKICAgIHJldHVybiB7CiAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgIHZhbHVlOiBudWxsLAogICAgICBwYWdlOiB0aGlzLmRhdGEucGFnZUluZGV4LAogICAgICB0eXBlOiAic2lnbmF0dXJlIgogICAgfTsKICB9Cn0KY2xhc3MgVGV4dEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIGNvbnN0IERFRkFVTFRfSUNPTl9TSVpFID0gMjI7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLm5vUm90YXRlID0gdHJ1ZTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCB7CiAgICAgIGRpY3QKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5URVhUOwogICAgaWYgKHRoaXMuZGF0YS5oYXNBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuZGF0YS5uYW1lID0gIk5vSWNvbiI7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEucmVjdFsxXSA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gREVGQVVMVF9JQ09OX1NJWkU7CiAgICAgIHRoaXMuZGF0YS5yZWN0WzJdID0gdGhpcy5kYXRhLnJlY3RbMF0gKyBERUZBVUxUX0lDT05fU0laRTsKICAgICAgdGhpcy5kYXRhLm5hbWUgPSBkaWN0LmhhcygiTmFtZSIpID8gZGljdC5nZXQoIk5hbWUiKS5uYW1lIDogIk5vdGUiOwogICAgfQogICAgaWYgKGRpY3QuaGFzKCJTdGF0ZSIpKSB7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IGRpY3QuZ2V0KCJTdGF0ZSIpIHx8IG51bGw7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gZGljdC5nZXQoIlN0YXRlTW9kZWwiKSB8fCBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnN0YXRlID0gbnVsbDsKICAgICAgdGhpcy5kYXRhLnN0YXRlTW9kZWwgPSBudWxsOwogICAgfQogIH0KfQpjbGFzcyBMaW5rQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgYW5ub3RhdGlvbkdsb2JhbHMKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5MSU5LOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMoZGljdCwgdGhpcy5yZWN0YW5nbGUpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBxdWFkUG9pbnRzOwogICAgfQogICAgdGhpcy5kYXRhLmJvcmRlckNvbG9yIHx8PSB0aGlzLmRhdGEuY29sb3I7CiAgICBDYXRhbG9nLnBhcnNlRGVzdERpY3Rpb25hcnkoewogICAgICBkZXN0RGljdDogZGljdCwKICAgICAgcmVzdWx0T2JqOiB0aGlzLmRhdGEsCiAgICAgIGRvY0Jhc2VVcmw6IGFubm90YXRpb25HbG9iYWxzLmJhc2VVcmwsCiAgICAgIGRvY0F0dGFjaG1lbnRzOiBhbm5vdGF0aW9uR2xvYmFscy5hdHRhY2htZW50cwogICAgfSk7CiAgfQp9CmNsYXNzIFBvcHVwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdAogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlBPUFVQOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogICAgaWYgKHRoaXMuZGF0YS5yZWN0WzBdID09PSB0aGlzLmRhdGEucmVjdFsyXSB8fCB0aGlzLmRhdGEucmVjdFsxXSA9PT0gdGhpcy5kYXRhLnJlY3RbM10pIHsKICAgICAgdGhpcy5kYXRhLnJlY3QgPSBudWxsOwogICAgfQogICAgbGV0IHBhcmVudEl0ZW0gPSBkaWN0LmdldCgiUGFyZW50Iik7CiAgICBpZiAoIXBhcmVudEl0ZW0pIHsKICAgICAgd2FybigiUG9wdXAgYW5ub3RhdGlvbiB
20oYXMgYSBtaXNzaW5nIG9yIGludmFsaWQgcGFyZW50IGFubm90YXRpb24uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuZGF0YS5wYXJlbnRSZWN0ID0gbG9va3VwTm9ybWFsUmVjdChwYXJlbnRJdGVtLmdldEFycmF5KCJSZWN0IiksIG51bGwpOwogICAgY29uc3QgcnQgPSBwYXJlbnRJdGVtLmdldCgiUlQiKTsKICAgIGlmIChpc05hbWUocnQsIEFubm90YXRpb25SZXBseVR5cGUuR1JPVVApKSB7CiAgICAgIHBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtLmdldCgiSVJUIik7CiAgICB9CiAgICBpZiAoIXBhcmVudEl0ZW0uaGFzKCJNIikpIHsKICAgICAgdGhpcy5kYXRhLm1vZGlmaWNhdGlvbkRhdGUgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXRNb2RpZmljYXRpb25EYXRlKHBhcmVudEl0ZW0uZ2V0KCJNIikpOwogICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKICAgIH0KICAgIGlmICghcGFyZW50SXRlbS5oYXMoIkMiKSkgewogICAgICB0aGlzLmRhdGEuY29sb3IgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXRDb2xvcihwYXJlbnRJdGVtLmdldEFycmF5KCJDIikpOwogICAgICB0aGlzLmRhdGEuY29sb3IgPSB0aGlzLmNvbG9yOwogICAgfQogICAgaWYgKCF0aGlzLnZpZXdhYmxlKSB7CiAgICAgIGNvbnN0IHBhcmVudEZsYWdzID0gcGFyZW50SXRlbS5nZXQoIkYiKTsKICAgICAgaWYgKHRoaXMuX2lzVmlld2FibGUocGFyZW50RmxhZ3MpKSB7CiAgICAgICAgdGhpcy5zZXRGbGFncyhwYXJlbnRGbGFncyk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuc2V0VGl0bGUocGFyZW50SXRlbS5nZXQoIlQiKSk7CiAgICB0aGlzLmRhdGEudGl0bGVPYmogPSB0aGlzLl90aXRsZTsKICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50SXRlbS5nZXQoIkNvbnRlbnRzIikpOwogICAgdGhpcy5kYXRhLmNvbnRlbnRzT2JqID0gdGhpcy5fY29udGVudHM7CiAgICBpZiAocGFyZW50SXRlbS5oYXMoIlJDIikpIHsKICAgICAgdGhpcy5kYXRhLnJpY2hUZXh0ID0gWEZBRmFjdG9yeS5nZXRSaWNoVGV4dEFzSHRtbChwYXJlbnRJdGVtLmdldCgiUkMiKSk7CiAgICB9CiAgICB0aGlzLmRhdGEub3BlbiA9ICEhZGljdC5nZXQoIk9wZW4iKTsKICB9Cn0KY2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCB7CiAgICAgIGV2YWx1YXRvck9wdGlvbnMsCiAgICAgI
20HhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDsKICAgIHRoaXMuc2V0RGVmYXVsdEFwcGVhcmFuY2UocGFyYW1zKTsKICAgIHRoaXMuX2hhc0FwcGVhcmFuY2UgPSAhIXRoaXMuYXBwZWFyYW5jZTsKICAgIGlmICh0aGlzLl9oYXNBcHBlYXJhbmNlKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBmb250Q29sb3IsCiAgICAgICAgZm9udFNpemUKICAgICAgfSA9IHBhcnNlQXBwZWFyYW5jZVN0cmVhbSh0aGlzLmFwcGVhcmFuY2UsIGV2YWx1YXRvck9wdGlvbnMsIHhyZWYpOwogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRDb2xvciA9IGZvbnRDb2xvcjsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZSA9IGZvbnRTaXplIHx8IDEwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZSB8fD0gMTA7CiAgICAgIGNvbnN0IHsKICAgICAgICBmb250Q29sb3IsCiAgICAgICAgZm9udFNpemUKICAgICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7CiAgICAgIGlmICh0aGlzLl9jb250ZW50cy5zdHIpIHsKICAgICAgICB0aGlzLmRhdGEudGV4dENvbnRlbnQgPSB0aGlzLl9jb250ZW50cy5zdHIuc3BsaXQoL1xyXG4/fFxuLykubWFwKGxpbmUgPT4gbGluZS50cmltRW5kKCkpOwogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGNvb3JkcywKICAgICAgICAgIGJib3gsCiAgICAgICAgICBtYXRyaXgKICAgICAgICB9ID0gRmFrZVVuaWNvZGVGb250LmdldEZpcnN0UG9zaXRpb25JbmZvKHRoaXMucmVjdGFuZ2xlLCB0aGlzLnJvdGF0aW9uLCBmb250U2l6ZSk7CiAgICAgICAgdGhpcy5kYXRhLnRleHRQb3NpdGlvbiA9IHRoaXMuX3RyYW5zZm9ybVBvaW50KGNvb3JkcywgYmJveCwgbWF0cml4KTsKICAgICAgfQogICAgICBpZiAodGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IHBhcmFtcy5kaWN0LmdldCgiQ0EiKTsKICAgICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgRmFrZVVuaWNvZGVGb250KHhyZWYsICJzYW5zLXNlcmlmIik7CiAgICAgICAgdGhpcy5hcHBlYXJhbmNlID0gZmFrZVVuaWNvZGVGb250LmNyZWF0ZUFwcGVhcmFuY2UodGhpcy5fY29udGVudHMuc3RyLCB0aGlzLnJlY3RhbmdsZSwgdGhpcy5yb3RhdGlvbiwgZm9udFNpemUsIGZvbnRDb2xvciwgc3Ryb2tlQWxwaGEpOwogICAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oIkZyZWVUZXh0QW5ub3RhdGlvbjogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgICB9CiAgICB9CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiB0aGlzLl9oYXNBcHBlYXJhbmNlOwogIH0KICBzdGF0aWMgY3JlYXRlTmV3RGljdChhbm5vdGF0aW9uLCB4cmVmLCB7CiAgICBhcFJlZiwKICAgIGFwCiAgfSkgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgZm9udFNpemUsCiAgICAgIG9sZEFubm90YXRpb24sCiAgICAgIHJlY3QsCiAgICAgIHJvdGF0aW9uLAogICAgICB1c2VyLAogICAgICB2YWx1ZQogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBmcmVldGV4dCA9IG9sZEFubm90YXRpb24gfHwgbmV3IERpY3QoeHJlZik7CiAgICBmcmVldGV4dC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiQW5ub3QiKSk7CiAgICBmcmVldGV4dC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRnJlZVRleHQiKSk7CiAgICBpZiAob2xkQW5ub3RhdGlvbikgewogICAgICBmcmVldGV4dC5zZXQoIk0iLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgICAgZnJlZXRleHQuZGVsZXRlKCJSQyIpOwogICAgfSBlbHNlIHsKICAgICAgZnJlZXRleHQuc2V0KCJDcmVhdGlvbkRhdGUiLCBgRDoke2dldE1vZGlmaWNhdGlvbkRhdGUoKX1gKTsKICAgIH0KICAgIGZyZWV0ZXh0LnNldCgiUmVjdCIsIHJlY3QpOwogICAgY29uc3QgZGEgPSBgL0hlbHYgJHtmb250U2l6ZX0gVGYgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YDsKICAgIGZyZWV0ZXh0LnNldCgiREEiLCBkYSk7CiAgICBmcmVldGV4dC5zZXQoIkNvbnRlbnRzIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh2YWx1ZSkpOwogICAgZnJlZXRleHQuc2V0KCJGIiwgNCk7CiAgICBmcmVldGV4dC5zZXQoIkJvcmRlciIsIFswLCAwLCAwXSk7CiAgICBmcmVldGV4dC5zZXQoIlJvdGF0ZSIsIHJvdGF0aW9uKTsKICAgIGlmICh1c2VyKSB7CiAgICAgIGZyZWV0ZXh0LnNldCgiVCIsIHN0cmluZ1RvQXNjaWlPclVURjE2QkUodXNlcikpOwogICAgfQogICAgaWYgKGFwUmVmIHx8IGFwKSB7CiAgICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgICAgZnJlZXRleHQuc2V0KCJBUCIsIG4pOwogICAgICBpZiAoYXBSZWYpIHsKICAgICAgICBuLnNldCgiTiIsIGFwUmVmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuLnNldCgiTiIsIGFwKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZyZWV0ZXh0OwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpIHsKICAgIGNvbnN0IHsKICAgICAgYmFzZUZvbnRSZWYsCiAgICAgIGV2YWx1YXRvciwKICAgICAgdGFzawogICAgfSA9IHBhcmFtczsKICAgIGNvbnN0IHsKICAgICAgY29sb3IsCiAgICAgIGZvbnRTaXplLAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdmFsdWUKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICBjb25zdCBmb250ID0gbmV3IERpY3QoeHJlZik7CiAgICBpZiAoYmFzZUZvbnRSZWYpIHsKICAgICAgZm9udC5zZXQoIkhlbHYiLCBiYXNlRm9udFJlZik7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBiYXNlRm9udCA9IG5ldyBEaWN0K
20HhyZWYpOwogICAgICBiYXNlRm9udC5zZXQoIkJhc2VGb250IiwgTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKICAgICAgYmFzZUZvbnQuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkZvbnQiKSk7CiAgICAgIGJhc2VGb250LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJUeXBlMSIpKTsKICAgICAgYmFzZUZvbnQuc2V0KCJFbmNvZGluZyIsIE5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7CiAgICAgIGZvbnQuc2V0KCJIZWx2IiwgYmFzZUZvbnQpOwogICAgfQogICAgcmVzb3VyY2VzLnNldCgiRm9udCIsIGZvbnQpOwogICAgY29uc3QgaGVsdiA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgewogICAgICBmb250TmFtZTogIkhlbHYiLAogICAgICBmb250U2l6ZQogICAgfSwgcmVzb3VyY2VzKTsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGNvbnN0IGxpbmVzID0gdmFsdWUuc3BsaXQoIlxuIik7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGxldCB0b3RhbFdpZHRoID0gLUluZmluaXR5OwogICAgY29uc3QgZW5jb2RlZExpbmVzID0gW107CiAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGNvbnN0IGVuY29kZWQgPSBoZWx2LmVuY29kZVN0cmluZyhsaW5lKTsKICAgICAgaWYgKGVuY29kZWQubGVuZ3RoID4gMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxpbmUgPSBlbmNvZGVkLmpvaW4oIiIpOwogICAgICBlbmNvZGVkTGluZXMucHVzaChsaW5lKTsKICAgICAgbGV0IGxpbmVXaWR0aCA9IDA7CiAgICAgIGNvbnN0IGdseXBocyA9IGhlbHYuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgICBsaW5lV2lkdGggKz0gZ2x5cGgud2lkdGggKiBzY2FsZTsKICAgICAgfQogICAgICB0b3RhbFdpZHRoID0gTWF0aC5tYXgodG90YWxXaWR0aCwgbGluZVdpZHRoKTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKHRvdGFsV2lkdGggPiB3KSB7CiAgICAgIGhzY2FsZSA9IHcgLyB0b3RhbFdpZHRoOwogICAgfQogICAgbGV0IHZzY2FsZSA9IDE7CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gTElORV9GQUNUT1IgKiBmb250U2l6ZTsKICAgIGNvbnN0IGxpbmVBc2NlbnQgPSAoTElORV9GQUNUT1IgLSBMSU5FX0RFU0NFTlRfRkFDVE9SKSAqIGZvbnRTaXplOwogICAgY29uc3QgdG90YWxIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKHRvdGFsSGVpZ2h0ID4gaCkgewogICAgICB2c2NhbGUgPSBoIC8gdG90YWxIZWlnaHQ7CiAgICB9CiAgICBjb25zdCBmc2NhbGUgPSBNYXRoLm1pbihoc2NhbGUsIHZzY2FsZSk7CiAgICBjb25zdCBuZXdGb250U2l6ZSA9IGZvbnRTaXplICogZnNjYWxlOwogICAgbGV0IGZpcnN0UG9pbnQsIGNsaXBCb3gsIG1hdHJpeDsKICAgIHN3aXRjaCAocm90YXRpb24pIHsKICAgICAgY2FzZSAwOgogICAgICAgIG1hdHJpeCA9IFsxLCAwLCAwLCAxXTsKICAgICAgICBjbGlwQm94ID0gW3JlY3RbMF0sIHJlY3RbMV0sIHcsIGhdOwogICAgICAgIGZpcnN0UG9pbnQgPSBbcmVjdFswXSwgcmVjdFszXSAtIGxpbmVBc2NlbnRdOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDkwOgogICAgICAgIG1hdHJpeCA9IFswLCAxLCAtMSwgMF07CiAgICAgICAgY2xpcEJveCA9IFtyZWN0WzFdLCAtcmVjdFsyXSwgdywgaF07CiAgICAgICAgZmlyc3RQb2ludCA9IFtyZWN0WzFdLCAtcmVjdFswXSAtIGxpbmVBc2NlbnRdOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE4MDoKICAgICAgICBtYXRyaXggPSBbLTEsIDAsIDAsIC0xXTsKICAgICAgICBjbGlwQm94ID0gWy1yZWN0WzJdLCAtcmVjdFszXSwgdywgaF07CiAgICAgICAgZmlyc3RQb2ludCA9IFstcmVjdFsyXSwgLXJlY3RbMV0gLSBsaW5lQXNjZW50XTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAyNzA6CiAgICAgICAgbWF0cml4ID0gWzAsIC0xLCAxLCAwXTsKICAgICAgICBjbGlwQm94ID0gWy1yZWN0WzNdLCByZWN0WzBdLCB3LCBoXTsKICAgICAgICBmaXJzdFBvaW50ID0gWy1yZWN0WzNdLCByZWN0WzJdIC0gbGluZUFzY2VudF07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBidWZmZXIgPSBbInEiLCBgJHttYXRyaXguam9pbigiICIpfSAwIDAgY21gLCBgJHtjbGlwQm94LmpvaW4oIiAiKX0gcmUgVyBuYCwgYEJUYCwgYCR7Z2V0UGRmQ29sb3IoY29sb3IsIHRydWUpfWAsIGAwIFRjIC9IZWx2ICR7bnVtYmVyVG9TdHJpbmcobmV3Rm9udFNpemUpfSBUZmBdOwogICAgYnVmZmVyLnB1c2goYCR7Zmlyc3RQb2ludC5qb2luKCIgIil9IFRkICgke2VzY2FwZVN0cmluZyhlbmNvZGVkTGluZXNbMF0pfSkgVGpgKTsKICAgIGNvbnN0IHZTaGlmdCA9IG51bWJlclRvU3RyaW5nKGxpbmVIZWlnaHQpOwogICAgZm9yIChsZXQgaSA9IDEsIGlpID0gZW5jb2RlZExpbmVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgbGluZSA9IGVuY29kZWRMaW5lc1tpXTsKICAgICAgYnVmZmVyLnB1c2goYDAgLSR7dlNoaWZ0fSBUZCAoJHtlc2NhcGVTdHJpbmcobGluZSl9KSBUamApOwogICAgfQogICAgYnVmZmVyLnB1c2goIkVUIiwgIlEiKTsKICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBidWZmZXIuam9pbigiXG4iKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgcmVjdCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAxLCAtcmVjdFswXSwgLXJlY3RbMV1dKTsKICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybi
20BhcDsKICB9Cn0KY2xhc3MgTGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5MSU5FOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGNvbnN0IGxpbmVDb29yZGluYXRlcyA9IGxvb2t1cFJlY3QoZGljdC5nZXRBcnJheSgiTCIpLCBbMCwgMCwgMCwgMF0pOwogICAgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlcyA9IFV0aWwubm9ybWFsaXplUmVjdChsaW5lQ29vcmRpbmF0ZXMpOwogICAgdGhpcy5zZXRMaW5lRW5kaW5ncyhkaWN0LmdldEFycmF5KCJMRSIpKTsKICAgIHRoaXMuZGF0YS5saW5lRW5kaW5ncyA9IHRoaXMubGluZUVuZGluZ3M7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBpbnRlcmlvckNvbG9yID0gZ2V0UmdiQ29sb3IoZGljdC5nZXRBcnJheSgiSUMiKSwgbnVsbCk7CiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGludGVyaW9yQ29sb3IgPyBnZXRQZGZDb2xvckFycmF5KGludGVyaW9yQ29sb3IpIDogbnVsbDsKICAgICAgY29uc3QgZmlsbEFscGhhID0gZmlsbENvbG9yID8gc3Ryb2tlQWxwaGEgOiBudWxsOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1swXSAtIGJvcmRlckFkanVzdCwgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1sxXSAtIGJvcmRlckFkanVzdCwgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1syXSArIGJvcmRlckFkanVzdCwgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1szXSArIGJvcmRlckFkanVzdF07CiAgICAgIGlmICghVXRpbC5pbnRlcnNlY3QodGhpcy5yZWN0YW5nbGUsIGJib3gpKSB7CiAgICAgICAgdGhpcy5yZWN0YW5nbGUgPSBiYm94OwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHtib3JkZXJXaWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgZmlsbENvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIGZpbGxBbHBoYSwKICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICBidWZmZXIucHVzaChgJHtsaW5lQ29vcmRpbmF0ZXNbMF19ICR7bGluZUNvb3JkaW5hdGVzWzFdfSBtYCwgYCR7bGluZUNvb3JkaW5hdGVzWzJdfSAke2xpbmVDb29yZGluYXRlc1szXX0gbGAsICJTIik7CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSAtIGJvcmRlcldpZHRoLCBwb2ludHNbMl0gKyBib3JkZXJXaWR0aCwgcG9pbnRzWzddIC0gYm9yZGVyV2lkdGgsIHBvaW50c1szXSArIGJvcmRlcldpZHRoXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQpjbGFzcyBTcXVhcmVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuU1FVQVJFOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgIGNvbnN0IGludGVyaW9yQ29sb3IgPSBnZXRSZ2JDb2xvcihkaWN0LmdldEFycmF5KCJJQyIpLCBudWxsKTsKICAgICAgY29uc3QgZmlsbENvbG9yID0gaW50ZXJpb3JDb2xvciA/IGdldFBkZkNvbG9yQXJyYXkoaW50ZXJpb3JDb2xvcikgOiBudWxsOwogICAgICBjb25zdCBmaWxsQWxwaGEgPSBmaWxsQ29sb3IgPyBzdHJva2VBbHBoYSA6IG51bGw7CiAgICAgIGlmICh0aGlzLmJvcmRlclN0eWxlLndpZHRoID09PSAwICYmICFmaWxsQ29sb3IpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgY29uc3QgeCA9IHBvaW50c1s0XSArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeSA9IHBvaW50c1s1XSArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3Qgd2lkdGggPSBwb2ludHNbNl0gLSBwb2ludHNbNF0gLSB0aGlzLmJvcmRlclN0eWxlLndpZHRoOwogICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcG9pbnRzWzNdIC0gcG9pbnRzWzddIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aDsKICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3h9ICR7eX0gJHt3aWR0aH0gJHtoZWlnaHR9IHJlYCk7CiAgICAgICAgICBpZiAoZmlsbENvbG9yKSB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJCIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1syXSwgcG9pbnRzWzddLCBwb2ludHNbM11dOwogICAgICAgI
20H0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIENpcmNsZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DSVJDTEU7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBpbnRlcmlvckNvbG9yID0gZ2V0UmdiQ29sb3IoZGljdC5nZXRBcnJheSgiSUMiKSwgbnVsbCk7CiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGludGVyaW9yQ29sb3IgPyBnZXRQZGZDb2xvckFycmF5KGludGVyaW9yQ29sb3IpIDogbnVsbDsKICAgICAgY29uc3QgZmlsbEFscGhhID0gZmlsbENvbG9yID8gc3Ryb2tlQWxwaGEgOiBudWxsOwogICAgICBpZiAodGhpcy5ib3JkZXJTdHlsZS53aWR0aCA9PT0gMCAmJiAhZmlsbENvbG9yKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGNvbnRyb2xQb2ludHNEaXN0YW5jZSA9IDQgLyAzICogTWF0aC50YW4oTWF0aC5QSSAvICgyICogNCkpOwogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7dGhpcy5ib3JkZXJTdHlsZS53aWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgZmlsbENvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIGZpbGxBbHBoYSwKICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICBjb25zdCB4MCA9IHBvaW50c1swXSArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeTAgPSBwb2ludHNbMV0gLSB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHgxID0gcG9pbnRzWzZdIC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCAvIDI7CiAgICAgICAgICBjb25zdCB5MSA9IHBvaW50c1s3XSArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeE1pZCA9IHgwICsgKHgxIC0geDApIC8gMjsKICAgICAgICAgIGNvbnN0IHlNaWQgPSB5MCArICh5MSAtIHkwKSAvIDI7CiAgICAgICAgICBjb25zdCB4T2Zmc2V0ID0gKHgxIC0geDApIC8gMiAqIGNvbnRyb2xQb2ludHNEaXN0YW5jZTsKICAgICAgICAgIGNvbnN0IHlPZmZzZXQgPSAoeTEgLSB5MCkgLyAyICogY29udHJvbFBvaW50c0Rpc3RhbmNlOwogICAgICAgICAgYnVmZmVyLnB1c2goYCR7eE1pZH0gJHt5MX0gbWAsIGAke3hNaWQgKyB4T2Zmc2V0fSAke3kxfSAke3gxfSAke3lNaWQgKyB5T2Zmc2V0fSAke3gxfSAke3lNaWR9IGNgLCBgJHt4MX0gJHt5TWlkIC0geU9mZnNldH0gJHt4TWlkICsgeE9mZnNldH0gJHt5MH0gJHt4TWlkfSAke3kwfSBjYCwgYCR7eE1pZCAtIHhPZmZzZXR9ICR7eTB9ICR7eDB9ICR7eU1pZCAtIHlPZmZzZXR9ICR7eDB9ICR7eU1pZH0gY2AsIGAke3gwfSAke3lNaWQgKyB5T2Zmc2V0fSAke3hNaWQgLSB4T2Zmc2V0fSAke3kxfSAke3hNaWR9ICR7eTF9IGNgLCAiaCIpOwogICAgICAgICAgaWYgKGZpbGxDb2xvcikgewogICAgICAgICAgICBidWZmZXIucHVzaCgiQiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbMl0sIHBvaW50c1s3XSwgcG9pbnRzWzNdXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQpjbGFzcyBQb2x5bGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT0xZTElORTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEudmVydGljZXMgPSBudWxsOwogICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBvbHlnb25Bbm5vdGF0aW9uKSkgewogICAgICB0aGlzLnNldExpbmVFbmRpbmdzKGRpY3QuZ2V0QXJyYXkoIkxFIikpOwogICAgICB0aGlzLmRhdGEubGluZUVuZGluZ3MgPSB0aGlzLmxpbmVFbmRpbmdzOwogICAgfQogICAgY29uc3QgcmF3VmVydGljZXMgPSBkaWN0LmdldEFycmF5KCJWZXJ0aWNlcyIpOwogICAgaWYgKCFpc051bWJlckFycmF5KHJhd1ZlcnRpY2VzLCBudWxsKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMuZGF0YS52ZXJ0aWNlcyA9IEZsb2F0MzJBcnJheS5mcm9tKHJhd1ZlcnRpY2VzKTsKICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCB8fCAxLAogICAgICAgIGJvcmRlckFkanVzdCA9IDIgKiBib3JkZXJXaWR0aDsKICAgICAgY29uc3QgYmJveCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCB2ZXJ0aWNlc1tpXSAtIGJvcmRlckFkanVzdCk7CiAgICAgICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIHZlcnRpY2VzW2kgKyAxXSAtIGJvcmRlckFkanVzdCk7CiAgICAgICAgYmJveFsyXSA9IE1hdGgubWF4KGJib3hbMl0sIHZlcnRpY2VzW2ldICsgYm9yZGVyQWRqdXN0KTsKICAgICAgICBiYm94WzNdID0gTWF0aC5tYXgoYmJveFszXSwgdmVydGljZXNbaSArIDFdICsgYm9yZGVyQWRqdXN0KTsKICAgICAgfQogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgI
20HRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7dmVydGljZXNbaV19ICR7dmVydGljZXNbaSArIDFdfSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1syXSwgcG9pbnRzWzddLCBwb2ludHNbM11dOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uIGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5QT0xZR09OOwogIH0KfQpjbGFzcyBDYXJldEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5DQVJFVDsKICB9Cn0KY2xhc3MgSW5rQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5JTks7CiAgICB0aGlzLmRhdGEuaW5rTGlzdHMgPSBbXTsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCByYXdJbmtMaXN0cyA9IGRpY3QuZ2V0QXJyYXkoIklua0xpc3QiKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShyYXdJbmtMaXN0cykpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcmF3SW5rTGlzdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3SW5rTGlzdHNbaV0pKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgaW5rTGlzdCA9IG5ldyBGbG9hdDMyQXJyYXkocmF3SW5rTGlzdHNbaV0ubGVuZ3RoKTsKICAgICAgdGhpcy5kYXRhLmlua0xpc3RzLnB1c2goaW5rTGlzdCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IHJhd0lua0xpc3RzW2ldLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgICBjb25zdCB4ID0geHJlZi5mZXRjaElmUmVmKHJhd0lua0xpc3RzW2ldW2pdKSwKICAgICAgICAgIHkgPSB4cmVmLmZldGNoSWZSZWYocmF3SW5rTGlzdHNbaV1baiArIDFdKTsKICAgICAgICBpZiAodHlwZW9mIHggPT09ICJudW1iZXIiICYmIHR5cGVvZiB5ID09PSAibnVtYmVyIikgewogICAgICAgICAgaW5rTGlzdFtqXSA9IHg7CiAgICAgICAgICBpbmtMaXN0W2ogKyAxXSA9IHk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmtMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBpbmtMaXN0W2ldIC0gYm9yZGVyQWRqdXN0KTsKICAgICAgICAgIGJib3hbMV0gPSBNYXRoLm1pbihiYm94WzFdLCBpbmtMaXN0W2kgKyAxXSAtIGJvcmRlckFkanVzdCk7CiAgICAgICAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgaW5rTGlzdFtpXSArIGJvcmRlckFkanVzdCk7CiAgICAgICAgICBiYm94WzNdID0gTWF0aC5tYXgoYmJveFszXSwgaW5rTGlzdFtpICsgMV0gKyBib3JkZXJBZGp1c3QpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIVV0aWwuaW50ZXJzZWN0KHRoaXMucmVjdGFuZ2xlLCBiYm94KSkgewogICAgICAgIHRoaXMucmVjdGFuZ2xlID0gYmJveDsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7Ym9yZGVyV2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5rTGlzdC5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7aW5rTGlzdFtpXX0gJHtpbmtMaXN0W2kgKyAxXX0gJHtpID09PSAwID8gIm0iIDogImwifWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzJdLCBwb2ludHNbN10sIHBvaW50c1szXV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgc3RhdGljIGNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgYXBSZWYsCiAgICBhcAogIH0pIHsKICAgIGNvbnN0IHsKICAgICAgb2xkQW5ub3RhdGlvbiwKICAgICAgY29sb3IsCiAgICAgIG9wYWNpdHksCiAgICAgI
20HBhdGhzLAogICAgICBvdXRsaW5lcywKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHRoaWNrbmVzcywKICAgICAgdXNlcgogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBpbmsgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgaW5rLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIGluay5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiSW5rIikpOwogICAgaW5rLnNldChvbGRBbm5vdGF0aW9uID8gIk0iIDogIkNyZWF0aW9uRGF0ZSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgaW5rLnNldCgiUmVjdCIsIHJlY3QpOwogICAgaW5rLnNldCgiSW5rTGlzdCIsIG91dGxpbmVzPy5wb2ludHMgfHwgcGF0aHMucG9pbnRzKTsKICAgIGluay5zZXQoIkYiLCA0KTsKICAgIGluay5zZXQoIlJvdGF0ZSIsIHJvdGF0aW9uKTsKICAgIGlmICh1c2VyKSB7CiAgICAgIGluay5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHVzZXIpKTsKICAgIH0KICAgIGlmIChvdXRsaW5lcykgewogICAgICBpbmsuc2V0KCJJVCIsIE5hbWUuZ2V0KCJJbmtIaWdobGlnaHQiKSk7CiAgICB9CiAgICBjb25zdCBicyA9IG5ldyBEaWN0KHhyZWYpOwogICAgaW5rLnNldCgiQlMiLCBicyk7CiAgICBicy5zZXQoIlciLCB0aGlja25lc3MpOwogICAgaW5rLnNldCgiQyIsIEFycmF5LmZyb20oY29sb3IsIGMgPT4gYyAvIDI1NSkpOwogICAgaW5rLnNldCgiQ0EiLCBvcGFjaXR5KTsKICAgIGNvbnN0IG4gPSBuZXcgRGljdCh4cmVmKTsKICAgIGluay5zZXQoIkFQIiwgbik7CiAgICBpZiAoYXBSZWYpIHsKICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICB9IGVsc2UgewogICAgICBuLnNldCgiTiIsIGFwKTsKICAgIH0KICAgIHJldHVybiBpbms7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgaWYgKGFubm90YXRpb24ub3V0bGluZXMpIHsKICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbUZvckhpZ2hsaWdodChhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgfQogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgcGF0aHMsCiAgICAgI
20HRoaWNrbmVzcywKICAgICAgb3BhY2l0eQogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBhcHBlYXJhbmNlQnVmZmVyID0gW2Ake3RoaWNrbmVzc30gdyAxIEogMSBqYCwgYCR7Z2V0UGRmQ29sb3IoY29sb3IsIGZhbHNlKX1gXTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaCgiL1IwIGdzIik7CiAgICB9CiAgICBmb3IgKGNvbnN0IG91dGxpbmUgb2YgcGF0aHMubGluZXMpIHsKICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICAgIGZvciAobGV0IGkgPSA2LCBpaSA9IG91dGxpbmUubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikgewogICAgICAgIGlmIChpc05hTihvdXRsaW5lW2ldKSkgewogICAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW2MxeCwgYzF5LCBjMngsIGMyeSwgeCwgeV0gPSBvdXRsaW5lLnNsaWNlKGksIGkgKyA2KTsKICAgICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3V0bGluZS5sZW5ndGggPT09IDYpIHsKICAgICAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goYCR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs0XSl9ICR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVs1XSl9IGxgKTsKICAgICAgfQogICAgfQogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKCJTIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCByZWN0KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTGVuZ3RoIiwgYXBwZWFyYW5jZS5sZW5ndGgpOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBjb25zdCByMCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICByMC5zZXQoIkNBIiwgb3BhY2l0eSk7CiAgICAgIHIwLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJFeHRHU3RhdGUiKSk7CiAgICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICB9CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtRm9ySGlnaGxpZ2h0KGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgb3V0bGluZXM6IHsKICAgICAgICBvdXRsaW5lCiAgICAgIH0sCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHtnZXRQZGZDb2xvcihjb2xvciwgdHJ1ZSl9YCwgIi9SMCBncyJdOwogICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNF0pfSAke251bWJlclRvU3RyaW5nKG91dGxpbmVbNV0pfSBtYCk7CiAgICBmb3IgKGxldCBpID0gNiwgaWkgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHsKICAgICAgaWYgKGlzTmFOKG91dGxpbmVbaV0pKSB7CiAgICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGAke251bWJlclRvU3RyaW5nKG91dGxpbmVbaSArIDRdKX0gJHtudW1iZXJUb1N0cmluZyhvdXRsaW5lW2kgKyA1XSl9IGxgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XSA9IG91dGxpbmUuc2xpY2UoaSwgaSArIDYpOwogICAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChbYzF4LCBjMXksIGMyeCwgYzJ5LCB4LCB5XS5tYXAobnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKSArICIgYyIpOwogICAgICB9CiAgICB9CiAgICBhcHBlYXJhbmNlQnVmZmVyLnB1c2goImggZiIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2VCdWZmZXIuam9pbigiXG4iKTsKICAgIGNvbnN0IGFwcGVhcmFuY2VTdHJlYW1EaWN0ID0gbmV3IERpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgcmVjdCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgZXh0R1N0YXRlID0gbmV3IERpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgY29uc3QgcjAgPSBuZXcgRGljdCh4cmVmKTsKICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgcjAuc2V0KCJCTSIsIE5hbWUuZ2V0KCJNdWx0aXBseSIpKTsKICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgI
20HIwLnNldCgiY2EiLCBvcGFjaXR5KTsKICAgICAgcjAuc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkV4dEdTdGF0ZSIpKTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IFN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgIGFwLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHJldHVybiBhcDsKICB9Cn0KY2xhc3MgSGlnaGxpZ2h0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkhJR0hMSUdIVDsKICAgIHRoaXMuZGF0YS5pc0VkaXRhYmxlID0gIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLmRhdGEubm9IVE1MID0gZmFsc2U7CiAgICB0aGlzLmRhdGEub3BhY2l0eSA9IGRpY3QuZ2V0KCJDQSIpIHx8IDE7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlIHx8ICFyZXNvdXJjZXM/LmhhcygiRXh0R1N0YXRlIikpIHsKICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgICB3YXJuKCJIaWdobGlnaHRBbm5vdGF0aW9uIC0gaWdub3JpbmcgYnVpbHQtaW4gYXBwZWFyYW5jZSBzdHJlYW0uIik7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzEsIDEsIDBdOwogICAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBmaWxsQ29sb3IsCiAgICAgICAgICBibGVuZE1vZGU6ICJNdWx0aXBseSIsCiAgICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3BvaW50c1swXX0gJHtwb2ludHNbMV19IG1gLCBgJHtwb2ludHNbMl19ICR7cG9pbnRzWzNdfSBsYCwgYCR7cG9pbnRzWzZdfSAke3BvaW50c1s3XX0gbGAsIGAke3BvaW50c1s0XX0gJHtwb2ludHNbNV19IGxgLCAiZiIpOwogICAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzJdLCBwb2ludHNbN10sIHBvaW50c1szXV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiA9IG51bGw7CiAgICB9CiAgfQogIHN0YXRpYyBjcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgIGFwUmVmLAogICAgYXAKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBvbGRBbm5vdGF0aW9uLAogICAgICBvcGFjaXR5LAogICAgICByZWN0LAogICAgICByb3RhdGlvbiwKICAgICAgdXNlciwKICAgICAgcXVhZFBvaW50cwogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBoaWdobGlnaHQgPSBvbGRBbm5vdGF0aW9uIHx8IG5ldyBEaWN0KHhyZWYpOwogICAgaGlnaGxpZ2h0LnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIGhpZ2hsaWdodC5zZXQoIlN1YnR5cGUiLCBOYW1lLmdldCgiSGlnaGxpZ2h0IikpOwogICAgaGlnaGxpZ2h0LnNldChvbGRBbm5vdGF0aW9uID8gIk0iIDogIkNyZWF0aW9uRGF0ZSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgaGlnaGxpZ2h0LnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHtnZXRNb2RpZmljYXRpb25EYXRlKCl9YCk7CiAgICBoaWdobGlnaHQuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBoaWdobGlnaHQuc2V0KCJGIiwgNCk7CiAgICBoaWdobGlnaHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgaGlnaGxpZ2h0LnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaGlnaGxpZ2h0LnNldCgiUXVhZFBvaW50cyIsIHF1YWRQb2ludHMpOwogICAgaGlnaGxpZ2h0LnNldCgiQyIsIEFycmF5LmZyb20oY29sb3IsIGMgPT4gYyAvIDI1NSkpOwogICAgaGlnaGxpZ2h0LnNldCgiQ0EiLCBvcGFjaXR5KTsKICAgIGlmICh1c2VyKSB7CiAgICAgIGhpZ2hsaWdodC5zZXQoIlQiLCBzdHJpbmdUb0FzY2lpT3JVVEYxNkJFKHVzZXIpKTsKICAgIH0KICAgIGlmIChhcFJlZiB8fCBhcCkgewogICAgICBjb25zdCBuID0gbmV3IERpY3QoeHJlZik7CiAgICAgIGhpZ2hsaWdodC5zZXQoIkFQIiwgbik7CiAgICAgIG4uc2V0KCJOIiwgYXBSZWYgfHwgYXApOwogICAgfQogICAgcmV0dXJuIGhpZ2hsaWdodDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oYW5ub3RhdGlvbiwgeHJlZiwgcGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICByZWN0LAogICAgICBvdXRsaW5lcywKICAgICAgb3BhY2l0eQogICAgfSA9IGFubm90YXRpb247CiAgICBjb25zdCBhcHBlYXJhbmNlQnVmZmVyID0gW2Ake2dldFBkZkNvbG9yKGNvbG9yLCB0cnVlKX1gLCAiL1IwIGdzIl07CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGZvciAoY29uc3Qgb3V0bGluZSBvZiBvdXRsaW5lcykgewogICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgYnVmZmVyLnB1c2goYCR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVswXSl9ICR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVsxXSl9IG1gKTsKICAgICAgZm9yIChsZXQgaSA9IDIsIGlpID0gb3V0bGluZS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgYnVmZmVyLnB1c2goYCR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVtpXSl9ICR7bnVtYmVyVG9TdHJpbmcob3V0bGluZVtpICsgMV0pfSBsYCk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goImgiKTsKICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKGJ1ZmZlci5qb2luKCJcbiIpKTsKICAgIH0KICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaCgiZioiKTsKICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlQnVmZmVyLmpvaW4oIlxuIik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBEaWN0K
20HhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIHJlY3QpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJMZW5ndGgiLCBhcHBlYXJhbmNlLmxlbmd0aCk7CiAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgRGljdCh4cmVmKTsKICAgIGNvbnN0IGV4dEdTdGF0ZSA9IG5ldyBEaWN0KHhyZWYpOwogICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgZXh0R1N0YXRlKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGNvbnN0IHIwID0gbmV3IERpY3QoeHJlZik7CiAgICBleHRHU3RhdGUuc2V0KCJSMCIsIHIwKTsKICAgIHIwLnNldCgiQk0iLCBOYW1lLmdldCgiTXVsdGlwbHkiKSk7CiAgICBpZiAob3BhY2l0eSAhPT0gMSkgewogICAgICByMC5zZXQoImNhIiwgb3BhY2l0eSk7CiAgICAgIHIwLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJFeHRHU3RhdGUiKSk7CiAgICB9CiAgICBjb25zdCBhcCA9IG5ldyBTdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQp9CmNsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBBbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGV4dHJhOiAiW10gMCBkIDAuNTcxIHciLAogICAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7cG9pbnRzWzRdfSAke3BvaW50c1s1XSArIDEuM30gbWAsIGAke3BvaW50c1s2XX0gJHtwb2ludHNbN10gKyAxLjN9IGxgLCAiUyIpOwogICAgICAgICAgICByZXR1cm4gW3BvaW50c1swXSwgcG9pbnRzWzJdLCBwb2ludHNbN10sIHBvaW50c1szXV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5wb3B1cFJlZiA9IG51bGw7CiAgICB9CiAgfQp9CmNsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLlNRVUlHR0xZOwogICAgY29uc3QgcXVhZFBvaW50cyA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhkaWN0LCBudWxsKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBleHRyYTogIltdIDAgZCAxIHciLAogICAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgICAgY29uc3QgZHkgPSAocG9pbnRzWzFdIC0gcG9pbnRzWzVdKSAvIDY7CiAgICAgICAgICAgIGxldCBzaGlmdCA9IGR5OwogICAgICAgICAgICBsZXQgeCA9IHBvaW50c1s0XTsKICAgICAgICAgICAgY29uc3QgeSA9IHBvaW50c1s1XTsKICAgICAgICAgICAgY29uc3QgeEVuZCA9IHBvaW50c1s2XTsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7eH0gJHt5ICsgc2hpZnR9IG1gKTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIHggKz0gMjsKICAgICAgICAgICAgICBzaGlmdCA9IHNoaWZ0ID09PSAwID8gZHkgOiAwOwogICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3h9ICR7eSArIHNoaWZ0fSBsYCk7CiAgICAgICAgICAgIH0gd2hpbGUgKHggPCB4RW5kKTsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgICAgcmV0dXJuIFtwb2ludHNbNF0sIHhFbmQsIHkgLSAyICogZHksIHkgKyAyICogZHldOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBudWxsOwogICAgfQogIH0KfQpjbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOwogICAgY29uc3QgcXVhZFBvaW50cyA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhkaWN0LCBudWxsKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6
20IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBleHRyYTogIltdIDAgZCAxIHciLAogICAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7KHBvaW50c1swXSArIHBvaW50c1s0XSkgLyAyfSBgICsgYCR7KHBvaW50c1sxXSArIHBvaW50c1s1XSkgLyAyfSBtYCwgYCR7KHBvaW50c1syXSArIHBvaW50c1s2XSkgLyAyfSBgICsgYCR7KHBvaW50c1szXSArIHBvaW50c1s3XSkgLyAyfSBsYCwgIlMiKTsKICAgICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0sIHBvaW50c1syXSwgcG9pbnRzWzddLCBwb2ludHNbM11dOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEucG9wdXBSZWYgPSBudWxsOwogICAgfQogIH0KfQpjbGFzcyBTdGFtcEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICAjc2F2ZWRIYXNPd25DYW52YXM7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGUuU1RBTVA7CiAgICB0aGlzLiNzYXZlZEhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICB0aGlzLmRhdGEuaXNFZGl0YWJsZSA9ICF0aGlzLmRhdGEubm9IVE1MOwogICAgdGhpcy5kYXRhLm5vSFRNTCA9IGZhbHNlOwogIH0KICBtdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzID0gbnVsbCkgewogICAgaWYgKGlzRWRpdGluZykgewogICAgICBpZiAoIXRoaXMuZGF0YS5pc0VkaXRhYmxlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHRoaXMuI3NhdmVkSGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLmhhc093bkNhbnZhczsKICAgICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRydWU7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuI3NhdmVkSGFzT3duQ2FudmFzOwogICAgcmV0dXJuICFtb2RpZmllZElkcz8uaGFzKHRoaXMuZGF0YS5pZCk7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVJbWFnZShiaXRtYXAsIHhyZWYpIHsKICAgIGNvbnN0IHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IGJpdG1hcDsKICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIGhlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiLCB7CiAgICAgIGFscGhhOiB0cnVlCiAgICB9KTsKICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTsKICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7CiAgICBjb25zdCBidWYzMiA9IG5ldyBVaW50MzJBcnJheShkYXRhLmJ1ZmZlcik7CiAgICBjb25zdCBoYXNBbHBoYSA9IGJ1ZjMyLnNvbWUoRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyB4ID0+IHggPj4+IDI0ICE9PSAweGZmIDogeCA9PiAoeCAmIDB4ZmYpICE9PSAweGZmKTsKICAgIGlmIChoYXNBbHBoYSkgewogICAgICBjdHguZmlsbFN0eWxlID0gIndoaXRlIjsKICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7CiAgICB9CiAgICBjb25zdCBqcGVnQnVmZmVyUHJvbWlzZSA9IGNhbnZhcy5jb252ZXJ0VG9CbG9iKHsKICAgICAgdHlwZTogImltYWdlL2pwZWciLAogICAgICBxdWFsaXR5OiAxCiAgICB9KS50aGVuKGJsb2IgPT4gYmxvYi5hcnJheUJ1ZmZlcigpKTsKICAgIGNvbnN0IHhvYmplY3ROYW1lID0gTmFtZS5nZXQoIlhPYmplY3QiKTsKICAgIGNvbnN0IGltYWdlTmFtZSA9IE5hbWUuZ2V0KCJJbWFnZSIpOwogICAgY29uc3QgaW1hZ2UgPSBuZXcgRGljdCh4cmVmKTsKICAgIGltYWdlLnNldCgiVHlwZSIsIHhvYmplY3ROYW1lKTsKICAgIGltYWdlLnNldCgiU3VidHlwZSIsIGltYWdlTmFtZSk7CiAgICBpbWFnZS5zZXQoIkJpdHNQZXJDb21wb25lbnQiLCA4KTsKICAgIGltYWdlLnNldCgiQ29sb3JTcGFjZSIsIE5hbWUuZ2V0KCJEZXZpY2VSR0IiKSk7CiAgICBpbWFnZS5zZXQoIkZpbHRlciIsIE5hbWUuZ2V0KCJEQ1REZWNvZGUiKSk7CiAgICBpbWFnZS5zZXQoIkJCb3giLCBbMCwgMCwgd2lkdGgsIGhlaWdodF0pOwogICAgaW1hZ2Uuc2V0KCJXaWR0aCIsIHdpZHRoKTsKICAgIGltYWdlLnNldCgiSGVpZ2h0IiwgaGVpZ2h0KTsKICAgIGxldCBzbWFza1N0cmVhbSA9IG51bGw7CiAgICBpZiAoaGFzQWxwaGEpIHsKICAgICAgY29uc3QgYWxwaGFCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWYzMi5sZW5ndGgpOwogICAgICBpZiAoRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBidWYzMi5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICBhbHBoYUJ1ZmZlcltpXSA9IGJ1ZjMyW2ldID4+PiAyNDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmMzIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgYWxwaGFCdWZmZXJbaV0gPSBidWYzMltpXSAmIDB4ZmY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHNtYXNrID0gbmV3IERpY3QoeHJlZik7CiAgICAgIHNtYXNrLnNldCgiVHlwZSIsIHhvYmplY3ROYW1lKTsKICAgICAgc21hc2suc2V0KCJTdWJ0eXBlIiwgaW1hZ2VOYW1lKTsKICAgICAgc21hc2suc2V0KCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CiAgICAgIHNtYXNrLnNldCgiQ29sb3JTcGFjZSIsIE5hbWUuZ2V0KCJEZXZpY2VHcmF5IikpOwogICAgICBzbWFzay5zZXQoIldpZHRoIiwgd2lkdGgpOwogICAgICBzbWFzay5zZXQoIkhlaWdodCIsIGhlaWdodCk7CiAgICAgI
20HNtYXNrU3RyZWFtID0gbmV3IFN0cmVhbShhbHBoYUJ1ZmZlciwgMCwgMCwgc21hc2spOwogICAgfQogICAgY29uc3QgaW1hZ2VTdHJlYW0gPSBuZXcgU3RyZWFtKGF3YWl0IGpwZWdCdWZmZXJQcm9taXNlLCAwLCAwLCBpbWFnZSk7CiAgICByZXR1cm4gewogICAgICBpbWFnZVN0cmVhbSwKICAgICAgc21hc2tTdHJlYW0sCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQKICAgIH07CiAgfQogIHN0YXRpYyBjcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgIGFwUmVmLAogICAgYXAKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIG9sZEFubm90YXRpb24sCiAgICAgIHJlY3QsCiAgICAgIHJvdGF0aW9uLAogICAgICB1c2VyCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHN0YW1wID0gb2xkQW5ub3RhdGlvbiB8fCBuZXcgRGljdCh4cmVmKTsKICAgIHN0YW1wLnNldCgiVHlwZSIsIE5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIHN0YW1wLnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJTdGFtcCIpKTsKICAgIHN0YW1wLnNldChvbGRBbm5vdGF0aW9uID8gIk0iIDogIkNyZWF0aW9uRGF0ZSIsIGBEOiR7Z2V0TW9kaWZpY2F0aW9uRGF0ZSgpfWApOwogICAgc3RhbXAuc2V0KCJSZWN0IiwgcmVjdCk7CiAgICBzdGFtcC5zZXQoIkYiLCA0KTsKICAgIHN0YW1wLnNldCgiQm9yZGVyIiwgWzAsIDAsIDBdKTsKICAgIHN0YW1wLnNldCgiUm90YXRlIiwgcm90YXRpb24pOwogICAgaWYgKHVzZXIpIHsKICAgICAgc3RhbXAuc2V0KCJUIiwgc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRSh1c2VyKSk7CiAgICB9CiAgICBpZiAoYXBSZWYgfHwgYXApIHsKICAgICAgY29uc3QgbiA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBzdGFtcC5zZXQoIkFQIiwgbik7CiAgICAgIGlmIChhcFJlZikgewogICAgICAgIG4uc2V0KCJOIiwgYXBSZWYpOwogICAgICB9IGVsc2UgewogICAgICAgIG4uc2V0KCJOIiwgYXApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RhbXA7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgaWYgKGFubm90YXRpb24ub2xkQW5ub3RhdGlvbikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgcm90YXRpb24KICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgewogICAgICBpbWFnZVJlZiwKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IHBhcmFtcy5pbWFnZTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBEaWN0KHhyZWYpOwogICAgY29uc3QgeG9iamVjdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgcmVzb3VyY2VzLnNldCgiWE9iamVjdCIsIHhvYmplY3QpOwogICAgeG9iamVjdC5zZXQoIkltMCIsIGltYWdlUmVmKTsKICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBgcSAke3dpZHRofSAwIDAgJHtoZWlnaHR9IDAgMCBjbSAvSW0wIERvIFFgOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIE5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCBbMCwgMCwgd2lkdGgsIGhlaWdodF0pOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgaWYgKHJvdGF0aW9uKSB7CiAgICAgIGNvbnN0IG1hdHJpeCA9IGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJNYXRyaXgiLCBtYXRyaXgpOwogICAgfQogICAgY29uc3QgYXAgPSBuZXcgU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KfQpjbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCBmaWxlID0gbmV3IEZpbGVTcGVjKGRpY3QuZ2V0KCJGUyIpLCB4cmVmKTsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS5ub0hUTUwgPSBmYWxzZTsKICAgIHRoaXMuZGF0YS5maWxlID0gZmlsZS5zZXJpYWxpemFibGU7CiAgICBjb25zdCBuYW1lID0gZGljdC5nZXQoIk5hbWUiKTsKICAgIHRoaXMuZGF0YS5uYW1lID0gbmFtZSBpbnN0YW5jZW9mIE5hbWUgPyBzdHJpbmdUb1BERlN0cmluZyhuYW1lLm5hbWUpIDogIlB1c2hQaW4iOwogICAgY29uc3QgZmlsbEFscGhhID0gZGljdC5nZXQoImNhIik7CiAgICB0aGlzLmRhdGEuZmlsbEFscGhhID0gdHlwZW9mIGZpbGxBbHBoYSA9PT0gIm51bWJlciIgJiYgZmlsbEFscGhhID49IDAgJiYgZmlsbEFscGhhIDw9IDEgPyBmaWxsQWxwaGEgOiBudWxsOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvZGVjcnlwdF9zdHJlYW0uanMKCmNvbnN0IGNodW5rU2l6ZSA9IDUxMjsKY2xhc3MgRGVjcnlwdFN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgZGVjcnlwdCkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuZGVjcnlwdCA9IGRlY3J5cHQ7CiAgICB0aGlzLm5leHRDaHVuayA9IG51bGw7CiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBjaHVuazsKICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7CiAgICAgIGNodW5rID0gdGhpcy5uZXh0Q2h1bms7CiAgICB9IGVsc2UgewogICAgICBjaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CiAgICAgI
20HRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQogICAgaWYgKCFjaHVuaz8ubGVuZ3RoKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5uZXh0Q2h1bmsgPSB0aGlzLnN0ci5nZXRCeXRlcyhjaHVua1NpemUpOwogICAgY29uc3QgaGFzTW9yZURhdGEgPSB0aGlzLm5leHRDaHVuaz8ubGVuZ3RoID4gMDsKICAgIGNvbnN0IGRlY3J5cHQgPSB0aGlzLmRlY3J5cHQ7CiAgICBjaHVuayA9IGRlY3J5cHQoY2h1bmssICFoYXNNb3JlRGF0YSk7CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aCwKICAgICAgbmV3TGVuZ3RoID0gYnVmZmVyTGVuZ3RoICsgY2h1bmsubGVuZ3RoLAogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihuZXdMZW5ndGgpOwogICAgYnVmZmVyLnNldChjaHVuaywgYnVmZmVyTGVuZ3RoKTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gbmV3TGVuZ3RoOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvY3J5cHRvLmpzCgoKCgoKCgoKCgoKCmNsYXNzIEFSQ0ZvdXJDaXBoZXIgewogIGNvbnN0cnVjdG9yKGtleSkgewogICAgdGhpcy5hID0gMDsKICAgIHRoaXMuYiA9IDA7CiAgICBjb25zdCBzID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICAgIGNvbnN0IGtleUxlbmd0aCA9IGtleS5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAgICAgIHNbaV0gPSBpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgY29uc3QgdG1wID0gc1tpXTsKICAgICAgaiA9IGogKyB0bXAgKyBrZXlbaSAlIGtleUxlbmd0aF0gJiAweGZmOwogICAgICBzW2ldID0gc1tqXTsKICAgICAgc1tqXSA9IHRtcDsKICAgIH0KICAgIHRoaXMucyA9IHM7CiAgfQogIGVuY3J5cHRCbG9jayhkYXRhKSB7CiAgICBsZXQgYSA9IHRoaXMuYSwKICAgICAgYiA9IHRoaXMuYjsKICAgIGNvbnN0IHMgPSB0aGlzLnM7CiAgICBjb25zdCBuID0gZGF0YS5sZW5ndGg7CiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVWludDhBcnJheShuKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGEgPSBhICsgMSAmIDB4ZmY7CiAgICAgIGNvbnN0IHRtcCA9IHNbYV07CiAgICAgIGIgPSBiICsgdG1wICYgMHhmZjsKICAgICAgY29uc3QgdG1wMiA9IHNbYl07CiAgICAgIHNbYV0gPSB0bXAyOwogICAgICBzW2JdID0gdG1wOwogICAgICBvdXRwdXRbaV0gPSBkYXRhW2ldIF4gc1t0bXAgKyB0bXAyICYgMHhmZl07CiAgICB9CiAgICB0aGlzLmEgPSBhOwogICAgdGhpcy5iID0gYjsKICAgIHJldHVybiBvdXRwdXQ7CiAgfQogIGRlY3J5cHRCbG9jayhkYXRhKSB7CiAgICByZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZGF0YSk7CiAgfQogIGVuY3J5cHQoZGF0YSkgewogICAgcmV0dXJuIHRoaXMuZW5jcnlwdEJsb2NrKGRhdGEpOwogIH0KfQpjb25zdCBjYWxjdWxhdGVNR
20DUgPSBmdW5jdGlvbiBjYWxjdWxhdGVNRDVDbG9zdXJlKCkgewogIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheShbNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNywgMTIsIDE3LCAyMiwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA0LCAxMSwgMTYsIDIzLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxLCA2LCAxMCwgMTUsIDIxXSk7CiAgY29uc3QgayA9IG5ldyBJbnQzMkFycmF5KFstNjgwODc2OTM2LCAtMzg5NTY0NTg2LCA2MDYxMDU4MTksIC0xMDQ0NTI1MzMwLCAtMTc2NDE4ODk3LCAxMjAwMDgwNDI2LCAtMTQ3MzIzMTM0MSwgLTQ1NzA1OTgzLCAxNzcwMDM1NDE2LCAtMTk1ODQxNDQxNywgLTQyMDYzLCAtMTk5MDQwNDE2MiwgMTgwNDYwMzY4MiwgLTQwMzQxMTAxLCAtMTUwMjAwMjI5MCwgMTIzNjUzNTMyOSwgLTE2NTc5NjUxMCwgLTEwNjk1MDE2MzIsIDY0MzcxNzcxMywgLTM3Mzg5NzMwMiwgLTcwMTU1ODY5MSwgMzgwMTYwODMsIC02NjA0NzgzMzUsIC00MDU1Mzc4NDgsIDU2ODQ0NjQzOCwgLTEwMTk4MDM2OTAsIC0xODczNjM5NjEsIDExNjM1MzE1MDEsIC0xNDQ0NjgxNDY3LCAtNTE0MDM3ODQsIDE3MzUzMjg0NzMsIC0xOTI2NjA3NzM0LCAtMzc4NTU4LCAtMjAyMjU3NDQ2MywgMTgzOTAzMDU2MiwgLTM1MzA5NTU2LCAtMTUzMDk5MjA2MCwgMTI3Mjg5MzM1MywgLTE1NTQ5NzYzMiwgLTEwOTQ3MzA2NDAsIDY4MTI3OTE3NCwgLTM1ODUzNzIyMiwgLTcyMjUyMTk3OSwgNzYwMjkxODksIC02NDAzNjQ0ODcsIC00MjE4MTU4MzUsIDUzMDc0MjUyMCwgLTk5NTMzODY1MSwgLTE5ODYzMDg0NCwgMTEyNjg5MTQxNSwgLTE0MTYzNTQ5MDUsIC01NzQzNDA1NSwgMTcwMDQ4NTU3MSwgLTE4OTQ5ODY2MDYsIC0xMDUxNTIzLCAtMjA1NDkyMjc5OSwgMTg3MzMxMzM1OSwgLTMwNjExNzQ0LCAtMTU2MDE5ODM4MCwgMTMwOTE1MTY0OSwgLTE0NTUyMzA3MCwgLTExMjAyMTAzNzksIDcxODc4NzI1OSwgLTM0MzQ4NTU1MV0pOwogIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgpIHsKICAgIGxldCBoMCA9IDE3MzI1ODQxOTMsCiAgICAgIGgxID0gLTI3MTczMzg3OSwKICAgICAgaDIgPSAtMTczMjU4NDE5NCwKICAgICAgaDMgPSAyNzE3MzM4Nzg7CiAgICBjb25zdCBwYWRkZWRMZW5ndGggPSBsZW5ndGggKyA3MiAmIH42MzsKICAgIGNvbnN0IHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KHBhZGRlZExlbmd0aCk7CiAgICBsZXQgaSwgajsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBwYWRkZWRbaV0gPSBkYXRhW29mZnNldCsrXTsKICAgIH0KICAgIHBhZGRlZFtpKytdID0gMHg4MDsKICAgIGNvbnN0IG4gPSBwYWRkZWRMZW5ndGggLSA4OwogICAgd2hpbGUgKGkgPCBuKSB7CiAgICAgIHBhZGRlZFtpKytdID0gMDsKICAgIH0KICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgY29uc3QgdyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqLCBpICs9IDQpIHsKICAgICAgICB3W2pdID0gcGFkZGVkW2ldIHwgcGFkZGVkW2kgKyAxXSA8PCA4IHwgcGFkZGVkW2kgKyAyXSA8PCAxNiB8IHBhZGRlZFtpICsgM10gPDwgMjQ7CiAgICAgIH0KICAgICAgbGV0IGEgPSBoMCwKICAgICAgICBiID0gaDEsCiAgICAgICAgYyA9IGgyLAogICAgICAgIGQgPSBoMywKICAgICAgICBmLAogICAgICAgIGc7CiAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CiAgICAgICAgaWYgKGogPCAxNikgewogICAgICAgICAgZiA9IGIgJiBjIHwgfmIgJiBkOwogICAgICAgICAgZyA9IGo7CiAgICAgICAgfSBlbHNlIGlmIChqIDwgMzIpIHsKICAgICAgICAgIGYgPSBkICYgYiB8IH5kICYgYzsKICAgICAgICAgIGcgPSA1ICogaiArIDEgJiAxNTsKICAgICAgICB9IGVsc2UgaWYgKGogPCA0OCkgewogICAgICAgICAgZiA9IGIgXiBjIF4gZDsKICAgICAgICAgIGcgPSAzICogaiArIDUgJiAxNTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZiA9IGMgXiAoYiB8IH5kKTsKICAgICAgICAgIGcgPSA3ICogaiAmIDE1OwogICAgICAgIH0KICAgICAgICBjb25zdCB0bXAgPSBkLAogICAgICAgICAgcm90YXRlQXJnID0gYSArIGYgKyBrW2pdICsgd1tnXSB8IDAsCiAgICAgICAgICByb3RhdGUgPSByW2pdOwogICAgICAgIGQgPSBjOwogICAgICAgIGMgPSBiOwogICAgICAgIGIgPSBiICsgKHJvdGF0ZUFyZyA8PCByb3RhdGUgfCByb3RhdGVBcmcgPj4+IDMyIC0gcm90YXRlKSB8IDA7CiAgICAgICAgYSA9IHRtcDsKICAgICAgfQogICAgICBoMCA9IGgwICsgYSB8IDA7CiAgICAgIGgxID0gaDEgKyBiIHwgMDsKICAgICAgaDIgPSBoMiArIGMgfCAwOwogICAgICBoMyA9IGgzICsgZCB8IDA7CiAgICB9CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwICYgMHhGRiwgaDAgPj4gOCAmIDB4RkYsIGgwID4+IDE2ICYgMHhGRiwgaDAgPj4+IDI0ICYgMHhGRiwgaDEgJiAweEZGLCBoMSA+PiA4ICYgMHhGRiwgaDEgPj4gMTYgJiAweEZGLCBoMSA+Pj4gMjQgJiAweEZGLCBoMiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+PiAyNCAmIDB4RkYsIGgzICYgMHhGRiwgaDMgPj4gOCAmIDB4RkYsIGgzID4+IDE2ICYgMHhGRiwgaDMgPj4+IDI0ICYgMHhGRl0pOwogIH0KICByZXR1cm4gaGFzaDsKfSgpOwpjbGFzcyBXb3JkNjQgewogIGNvbnN0cnVjdG9yKGhpZ2hJbnRlZ2VyLCBsb3dJbnRlZ2VyKSB7CiAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwOwogIH0KICBhbmQod29yZCkgewogICAgdGhpcy5oaWdoICY9IHdvcmQuaGlnaDsKICAgIHRoaXMubG93ICY9IHdvcmQubG93OwogIH0KICB4b3Iod29yZCkgewogICAgdGhpcy5oaWdoIF49IHdvcmQuaGlnaDsKICAgIHRoaXMubG93IF49IHdvcmQubG93OwogIH0KICBvcih3b3JkKSB7CiAgICB0aGlzLmhpZ2ggfD0gd29yZC5oaWdoOwogICAgdGhpcy5sb3cgfD0gd29yZC5sb3c7CiAgfQogIHNoaWZ0UmlnaHQocGxhY2VzKSB7CiAgICBpZiAocGxhY2VzID49IDMyKSB7CiAgICAgI
20HRoaXMubG93ID0gdGhpcy5oaWdoID4+PiBwbGFjZXMgLSAzMiB8IDA7CiAgICAgIHRoaXMuaGlnaCA9IDA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxvdyA9IHRoaXMubG93ID4+PiBwbGFjZXMgfCB0aGlzLmhpZ2ggPDwgMzIgLSBwbGFjZXM7CiAgICAgIHRoaXMuaGlnaCA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIHwgMDsKICAgIH0KICB9CiAgc2hpZnRMZWZ0KHBsYWNlcykgewogICAgaWYgKHBsYWNlcyA+PSAzMikgewogICAgICB0aGlzLmhpZ2ggPSB0aGlzLmxvdyA8PCBwbGFjZXMgLSAzMjsKICAgICAgdGhpcy5sb3cgPSAwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oaWdoID0gdGhpcy5oaWdoIDw8IHBsYWNlcyB8IHRoaXMubG93ID4+PiAzMiAtIHBsYWNlczsKICAgICAgdGhpcy5sb3cgPDw9IHBsYWNlczsKICAgIH0KICB9CiAgcm90YXRlUmlnaHQocGxhY2VzKSB7CiAgICBsZXQgbG93LCBoaWdoOwogICAgaWYgKHBsYWNlcyAmIDMyKSB7CiAgICAgIGhpZ2ggPSB0aGlzLmxvdzsKICAgICAgbG93ID0gdGhpcy5oaWdoOwogICAgfSBlbHNlIHsKICAgICAgbG93ID0gdGhpcy5sb3c7CiAgICAgIGhpZ2ggPSB0aGlzLmhpZ2g7CiAgICB9CiAgICBwbGFjZXMgJj0gMzE7CiAgICB0aGlzLmxvdyA9IGxvdyA+Pj4gcGxhY2VzIHwgaGlnaCA8PCAzMiAtIHBsYWNlczsKICAgIHRoaXMuaGlnaCA9IGhpZ2ggPj4+IHBsYWNlcyB8IGxvdyA8PCAzMiAtIHBsYWNlczsKICB9CiAgbm90KCkgewogICAgdGhpcy5oaWdoID0gfnRoaXMuaGlnaDsKICAgIHRoaXMubG93ID0gfnRoaXMubG93OwogIH0KICBhZGQod29yZCkgewogICAgY29uc3QgbG93QWRkID0gKHRoaXMubG93ID4+PiAwKSArICh3b3JkLmxvdyA+Pj4gMCk7CiAgICBsZXQgaGlnaEFkZCA9ICh0aGlzLmhpZ2ggPj4+IDApICsgKHdvcmQuaGlnaCA+Pj4gMCk7CiAgICBpZiAobG93QWRkID4gMHhmZmZmZmZmZikgewogICAgICBoaWdoQWRkICs9IDE7CiAgICB9CiAgICB0aGlzLmxvdyA9IGxvd0FkZCB8IDA7CiAgICB0aGlzLmhpZ2ggPSBoaWdoQWRkIHwgMDsKICB9CiAgY29weVRvKGJ5dGVzLCBvZmZzZXQpIHsKICAgIGJ5dGVzW29mZnNldF0gPSB0aGlzLmhpZ2ggPj4+IDI0ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDFdID0gdGhpcy5oaWdoID4+IDE2ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDJdID0gdGhpcy5oaWdoID4+IDggJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgM10gPSB0aGlzLmhpZ2ggJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNF0gPSB0aGlzLmxvdyA+Pj4gMjQgJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNV0gPSB0aGlzLmxvdyA+PiAxNiAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyA2XSA9IHRoaXMubG93ID4+IDggJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgN10gPSB0aGlzLmxvdyAmIDB4ZmY7CiAgfQogIGFzc2lnbih3b3JkKSB7CiAgICB0aGlzLmhpZ2ggPSB3b3JkLmhpZ2g7CiAgICB0aGlzLmxvdyA9IHdvcmQubG93OwogIH0KfQpjb25zdCBjYWxjdWxhdGVTSEEyNTYgPSBmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTZDbG9zdXJlKCkgewogIGZ1bmN0aW9uIHJvdHIoeCwgbikgewogICAgcmV0dXJuIHggPj4+IG4gfCB4IDw8IDMyIC0gbjsKICB9CiAgZnVuY3Rpb24gY2goeCwgeSwgeikgewogICAgcmV0dXJuIHggJiB5IF4gfnggJiB6OwogIH0KICBmdW5jdGlvbiBtYWooeCwgeSwgeikgewogICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejsKICB9CiAgZnVuY3Rpb24gc2lnbWEoeCkgewogICAgcmV0dXJuIHJvdHIoeCwgMikgXiByb3RyKHgsIDEzKSBeIHJvdHIoeCwgMjIpOwogIH0KICBmdW5jdGlvbiBzaWdtYVByaW1lKHgpIHsKICAgIHJldHVybiByb3RyKHgsIDYpIF4gcm90cih4LCAxMSkgXiByb3RyKHgsIDI1KTsKICB9CiAgZnVuY3Rpb24gbGl0dGxlU2lnbWEoeCkgewogICAgcmV0dXJuIHJvdHIoeCwgNykgXiByb3RyKHgsIDE4KSBeIHggPj4+IDM7CiAgfQogIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUoeCkgewogICAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiB4ID4+PiAxMDsKICB9CiAgY29uc3QgayA9IFsweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LCAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLCAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LCAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLCAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLCAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLCAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LCAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLCAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLCAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LCAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXTsKICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CiAgICBsZXQgaDAgPSAweDZhMDllNjY3LAogICAgICBoMSA9IDB4YmI2N2FlODUsCiAgICAgIGgyID0gMHgzYzZlZjM3MiwKICAgICAgaDMgPSAweGE1NGZmNTNhLAogICAgICBoNCA9IDB4NTEwZTUyN2YsCiAgICAgIGg1ID0gMHg5YjA1Njg4YywKICAgICAgaDYgPSAweDFmODNkOWFiLAogICAgICBoNyA9IDB4NWJlMGNkMTk7CiAgICBjb25zdCBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDkpIC8gNjQpICogNjQ7CiAgICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogICAgbGV0IGksIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgICB9CiAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CiAgICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICAgIHdoaWxlIChpIDwgbikgewogICAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICB9CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMTMgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICAgIGNvbnN0IHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOwogICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICB3W2pdID0gcGFkZGVkW2ldIDw8IDI0IHwgcGFkZGVkW2kgKyAxXSA8PCAxNiB8IHBhZGRlZFtpICsgMl0gPDwgOCB8IHBhZGRlZFtpICsgM107CiAgICAgICAgaSArPSA0OwogICAgICB9CiAgICAgIGZvciAoaiA9IDE2OyBqIDwgNjQ7ICsraikgewogICAgICAgI
20Hdbal0gPSBsaXR0bGVTaWdtYVByaW1lKHdbaiAtIDJdKSArIHdbaiAtIDddICsgbGl0dGxlU2lnbWEod1tqIC0gMTVdKSArIHdbaiAtIDE2XSB8IDA7CiAgICAgIH0KICAgICAgbGV0IGEgPSBoMCwKICAgICAgICBiID0gaDEsCiAgICAgICAgYyA9IGgyLAogICAgICAgIGQgPSBoMywKICAgICAgICBlID0gaDQsCiAgICAgICAgZiA9IGg1LAogICAgICAgIGcgPSBoNiwKICAgICAgICBoID0gaDcsCiAgICAgICAgdDEsCiAgICAgICAgdDI7CiAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CiAgICAgICAgdDEgPSBoICsgc2lnbWFQcmltZShlKSArIGNoKGUsIGYsIGcpICsga1tqXSArIHdbal07CiAgICAgICAgdDIgPSBzaWdtYShhKSArIG1haihhLCBiLCBjKTsKICAgICAgICBoID0gZzsKICAgICAgICBnID0gZjsKICAgICAgICBmID0gZTsKICAgICAgICBlID0gZCArIHQxIHwgMDsKICAgICAgICBkID0gYzsKICAgICAgICBjID0gYjsKICAgICAgICBiID0gYTsKICAgICAgICBhID0gdDEgKyB0MiB8IDA7CiAgICAgIH0KICAgICAgaDAgPSBoMCArIGEgfCAwOwogICAgICBoMSA9IGgxICsgYiB8IDA7CiAgICAgIGgyID0gaDIgKyBjIHwgMDsKICAgICAgaDMgPSBoMyArIGQgfCAwOwogICAgICBoNCA9IGg0ICsgZSB8IDA7CiAgICAgIGg1ID0gaDUgKyBmIHwgMDsKICAgICAgaDYgPSBoNiArIGcgfCAwOwogICAgICBoNyA9IGg3ICsgaCB8IDA7CiAgICB9CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwID4+IDI0ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgJiAweEZGLCBoNCA+PiAyNCAmIDB4RkYsIGg0ID4+IDE2ICYgMHhGRiwgaDQgPj4gOCAmIDB4RkYsIGg0ICYgMHhGRiwgaDUgPj4gMjQgJiAweEZGLCBoNSA+PiAxNiAmIDB4RkYsIGg1ID4+IDggJiAweEZGLCBoNSAmIDB4RkYsIGg2ID4+IDI0ICYgMHhGRiwgaDYgPj4gMTYgJiAweEZGLCBoNiA+PiA4ICYgMHhGRiwgaDYgJiAweEZGLCBoNyA+PiAyNCAmIDB4RkYsIGg3ID4+IDE2ICYgMHhGRiwgaDcgPj4gOCAmIDB4RkYsIGg3ICYgMHhGRl0pOwogIH0KICByZXR1cm4gaGFzaDsKfSgpOwpjb25zdCBjYWxjdWxhdGVTSEE1MTIgPSBmdW5jdGlvbiBjYWxjdWxhdGVTSEE1MTJDbG9zdXJlKCkgewogIGZ1bmN0aW9uIGNoKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CiAgICByZXN1bHQuYXNzaWduKHgpOwogICAgcmVzdWx0LmFuZCh5KTsKICAgIHRtcC5hc3NpZ24oeCk7CiAgICB0bXAubm90KCk7CiAgICB0bXAuYW5kKHopOwogICAgcmVzdWx0Lnhvcih0bXApOwogIH0KICBmdW5jdGlvbiBtYWoocmVzdWx0LCB4LCB5LCB6LCB0bXApIHsKICAgIHJlc3VsdC5hc3NpZ24oeCk7CiAgICByZXN1bHQuYW5kKHkpOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5hbmQoeik7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgICB0bXAuYXNzaWduKHkpOwogICAgdG1wLmFuZCh6KTsKICAgIHJlc3VsdC54b3IodG1wKTsKICB9CiAgZnVuY3Rpb24gc2lnbWEocmVzdWx0LCB4LCB0bXApIHsKICAgIHJlc3VsdC5hc3NpZ24oeCk7CiAgICByZXN1bHQucm90YXRlUmlnaHQoMjgpOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5yb3RhdGVSaWdodCgzNCk7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLnJvdGF0ZVJpZ2h0KDM5KTsKICAgIHJlc3VsdC54b3IodG1wKTsKICB9CiAgZnVuY3Rpb24gc2lnbWFQcmltZShyZXN1bHQsIHgsIHRtcCkgewogICAgcmVzdWx0LmFzc2lnbih4KTsKICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxNCk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLnJvdGF0ZVJpZ2h0KDE4KTsKICAgIHJlc3VsdC54b3IodG1wKTsKICAgIHRtcC5hc3NpZ24oeCk7CiAgICB0bXAucm90YXRlUmlnaHQoNDEpOwogICAgcmVzdWx0Lnhvcih0bXApOwogIH0KICBmdW5jdGlvbiBsaXR0bGVTaWdtYShyZXN1bHQsIHgsIHRtcCkgewogICAgcmVzdWx0LmFzc2lnbih4KTsKICAgIHJlc3VsdC5yb3RhdGVSaWdodCgxKTsKICAgIHRtcC5hc3NpZ24oeCk7CiAgICB0bXAucm90YXRlUmlnaHQoOCk7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLnNoaWZ0UmlnaHQoNyk7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgfQogIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICAgIHJlc3VsdC5hc3NpZ24oeCk7CiAgICByZXN1bHQucm90YXRlUmlnaHQoMTkpOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5yb3RhdGVSaWdodCg2MSk7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLnNoaWZ0UmlnaHQoNik7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgfQogIGNvbnN0IGsgPSBbbmV3IFdvcmQ2NCgweDQyOGEyZjk4LCAweGQ3MjhhZTIyKSwgbmV3IFdvcmQ2NCgweDcxMzc0NDkxLCAweDIzZWY2NWNkKSwgbmV3IFdvcmQ2NCgweGI1YzBmYmNmLCAweGVjNGQzYjJmKSwgbmV3IFdvcmQ2NCgweGU5YjVkYmE1LCAweDgxODlkYmJjKSwgbmV3IFdvcmQ2NCgweDM5NTZjMjViLCAweGYzNDhiNTM4KSwgbmV3IFdvcmQ2NCgweDU5ZjExMWYxLCAweGI2MDVkMDE5KSwgbmV3IFdvcmQ2NCgweDkyM2Y4MmE0LCAweGFmMTk0ZjliKSwgbmV3IFdvcmQ2NCgweGFiMWM1ZWQ1LCAweGRhNmQ4MTE4KSwgbmV3IFdvcmQ2NCgweGQ4MDdhYTk4LCAweGEzMDMwMjQyKSwgbmV3IFdvcmQ2NCgweDEyODM1YjAxLCAweDQ1NzA2ZmJlKSwgbmV3IFdvcmQ2NCgweDI0MzE4NWJlLCAweDRlZTRiMjhjKSwgbmV3IFdvcmQ2NCgweDU1MGM3ZGMzLCAweGQ1ZmZiNGUyKSwgbmV3IFdvcmQ2NCgweDcyYmU1ZDc0LCAweGYyN2I4OTZmKSwgbmV3IFdvcmQ2NCgweDgwZGViMWZlLCAweDNiMTY5NmIxKSwgbmV3IFdvcmQ2NCgweDliZGMwNmE3LCAweDI1YzcxMjM1KSwgbmV3IFdvcmQ2NCgweGMxOWJmMTc0LCAweGNmNjkyNjk0KSwgbmV3IFdvcmQ2NCgweGU0OWI2OWMxLCAweDllZjE0YWQyKSwgbmV3IFdvcmQ2NCgweGVmYmU0Nzg2LCAweDM4NGYyNWUzKSwgbmV3IFdvcmQ2NCgweDBmYzE5ZGM2LCAweD
20hiOGNkNWI1KSwgbmV3IFdvcmQ2NCgweDI0MGNhMWNjLCAweDc3YWM5YzY1KSwgbmV3IFdvcmQ2NCgweDJkZTkyYzZmLCAweDU5MmIwMjc1KSwgbmV3IFdvcmQ2NCgweDRhNzQ4NGFhLCAweDZlYTZlNDgzKSwgbmV3IFdvcmQ2NCgweDVjYjBhOWRjLCAweGJkNDFmYmQ0KSwgbmV3IFdvcmQ2NCgweDc2Zjk4OGRhLCAweDgzMTE1M2I1KSwgbmV3IFdvcmQ2NCgweDk4M2U1MTUyLCAweGVlNjZkZmFiKSwgbmV3IFdvcmQ2NCgweGE4MzFjNjZkLCAweDJkYjQzMjEwKSwgbmV3IFdvcmQ2NCgweGIwMDMyN2M4LCAweDk4ZmIyMTNmKSwgbmV3IFdvcmQ2NCgweGJmNTk3ZmM3LCAweGJlZWYwZWU0KSwgbmV3IFdvcmQ2NCgweGM2ZTAwYmYzLCAweDNkYTg4ZmMyKSwgbmV3IFdvcmQ2NCgweGQ1YTc5MTQ3LCAweDkzMGFhNzI1KSwgbmV3IFdvcmQ2NCgweDA2Y2E2MzUxLCAweGUwMDM4MjZmKSwgbmV3IFdvcmQ2NCgweDE0MjkyOTY3LCAweDBhMGU2ZTcwKSwgbmV3IFdvcmQ2NCgweDI3YjcwYTg1LCAweDQ2ZDIyZmZjKSwgbmV3IFdvcmQ2NCgweDJlMWIyMTM4LCAweDVjMjZjOTI2KSwgbmV3IFdvcmQ2NCgweDRkMmM2ZGZjLCAweDVhYzQyYWVkKSwgbmV3IFdvcmQ2NCgweDUzMzgwZDEzLCAweDlkOTViM2RmKSwgbmV3IFdvcmQ2NCgweDY1MGE3MzU0LCAweDhiYWY2M2RlKSwgbmV3IFdvcmQ2NCgweDc2NmEwYWJiLCAweDNjNzdiMmE4KSwgbmV3IFdvcmQ2NCgweDgxYzJjOTJlLCAweDQ3ZWRhZWU2KSwgbmV3IFdvcmQ2NCgweDkyNzIyYzg1LCAweDE0ODIzNTNiKSwgbmV3IFdvcmQ2NCgweGEyYmZlOGExLCAweDRjZjEwMzY0KSwgbmV3IFdvcmQ2NCgweGE4MWE2NjRiLCAweGJjNDIzMDAxKSwgbmV3IFdvcmQ2NCgweGMyNGI4YjcwLCAweGQwZjg5NzkxKSwgbmV3IFdvcmQ2NCgweGM3NmM1MWEzLCAweDA2NTRiZTMwKSwgbmV3IFdvcmQ2NCgweGQxOTJlODE5LCAweGQ2ZWY1MjE4KSwgbmV3IFdvcmQ2NCgweGQ2OTkwNjI0LCAweDU1NjVhOTEwKSwgbmV3IFdvcmQ2NCgweGY0MGUzNTg1LCAweDU3NzEyMDJhKSwgbmV3IFdvcmQ2NCgweDEwNmFhMDcwLCAweDMyYmJkMWI4KSwgbmV3IFdvcmQ2NCgweDE5YTRjMTE2LCAweGI4ZDJkMGM4KSwgbmV3IFdvcmQ2NCgweDFlMzc2YzA4LCAweDUxNDFhYjUzKSwgbmV3IFdvcmQ2NCgweDI3NDg3NzRjLCAweGRmOGVlYjk5KSwgbmV3IFdvcmQ2NCgweDM0YjBiY2I1LCAweGUxOWI0OGE4KSwgbmV3IFdvcmQ2NCgweDM5MWMwY2IzLCAweGM1Yzk1YTYzKSwgbmV3IFdvcmQ2NCgweDRlZDhhYTRhLCAweGUzNDE4YWNiKSwgbmV3IFdvcmQ2NCgweDViOWNjYTRmLCAweDc3NjNlMzczKSwgbmV3IFdvcmQ2NCgweDY4MmU2ZmYzLCAweGQ2YjJiOGEzKSwgbmV3IFdvcmQ2NCgweDc0OGY4MmVlLCAweDVkZWZiMmZjKSwgbmV3IFdvcmQ2NCgweDc4YTU2MzZmLCAweDQzMTcyZjYwKSwgbmV3IFdvcmQ2NCgweDg0Yzg3ODE0LCAweGExZjBhYjcyKSwgbmV3IFdvcmQ2NCgweDhjYzcwMjA4LCAweDFhNjQzOWVjKSwgbmV3IFdvcmQ2NCgweDkwYmVmZmZhLCAweDIzNjMxZTI4KSwgbmV3IFdvcmQ2NCgweGE0NTA2Y2ViLCAweGRlODJiZGU5KSwgbmV3IFdvcmQ2NCgweGJlZjlhM2Y3LCAweGIyYzY3OTE1KSwgbmV3IFdvcmQ2NCgweGM2NzE3OGYyLCAweGUzNzI1MzJiKSwgbmV3IFdvcmQ2NCgweGNhMjczZWNlLCAweGVhMjY2MTljKSwgbmV3IFdvcmQ2NCgweGQxODZiOGM3LCAweDIxYzBjMjA3KSwgbmV3IFdvcmQ2NCgweGVhZGE3ZGQ2LCAweGNkZTBlYjFlKSwgbmV3IFdvcmQ2NCgweGY1N2Q0ZjdmLCAweGVlNmVkMTc4KSwgbmV3IFdvcmQ2NCgweDA2ZjA2N2FhLCAweDcyMTc2ZmJhKSwgbmV3IFdvcmQ2NCgweDBhNjM3ZGM1LCAweGEyYzg5OGE2KSwgbmV3IFdvcmQ2NCgweDExM2Y5ODA0LCAweGJlZjkwZGFlKSwgbmV3IFdvcmQ2NCgweDFiNzEwYjM1LCAweDEzMWM0NzFiKSwgbmV3IFdvcmQ2NCgweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0KSwgbmV3IFdvcmQ2NCgweDMyY2FhYjdiLCAweDQwYzcyNDkzKSwgbmV3IFdvcmQ2NCgweDNjOWViZTBhLCAweDE1YzliZWJjKSwgbmV3IFdvcmQ2NCgweDQzMWQ2N2M0LCAweDljMTAwZDRjKSwgbmV3IFdvcmQ2NCgweDRjYzVkNGJlLCAweGNiM2U0MmI2KSwgbmV3IFdvcmQ2NCgweDU5N2YyOTljLCAweGZjNjU3ZTJhKSwgbmV3IFdvcmQ2NCgweDVmY2I2ZmFiLCAweDNhZDZmYWVjKSwgbmV3IFdvcmQ2NCgweDZjNDQxOThjLCAweDRhNDc1ODE3KV07CiAgZnVuY3Rpb24gaGFzaChkYXRhLCBvZmZzZXQsIGxlbmd0aCwgbW9kZTM4NCA9IGZhbHNlKSB7CiAgICBsZXQgaDAsIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIGg3OwogICAgaWYgKCFtb2RlMzg0KSB7CiAgICAgIGgwID0gbmV3IFdvcmQ2NCgweDZhMDllNjY3LCAweGYzYmNjOTA4KTsKICAgICAgaDEgPSBuZXcgV29yZDY0KDB4YmI2N2FlODUsIDB4ODRjYWE3M2IpOwogICAgICBoMiA9IG5ldyBXb3JkNjQoMHgzYzZlZjM3MiwgMHhmZTk0ZjgyYik7CiAgICAgIGgzID0gbmV3IFdvcmQ2NCgweGE1NGZmNTNhLCAweDVmMWQzNmYxKTsKICAgICAgaDQgPSBuZXcgV29yZDY0KDB4NTEwZTUyN2YsIDB4YWRlNjgyZDEpOwogICAgICBoNSA9IG5ldyBXb3JkNjQoMHg5YjA1Njg4YywgMHgyYjNlNmMxZik7CiAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweDFmODNkOWFiLCAweGZiNDFiZDZiKTsKICAgICAgaDcgPSBuZXcgV29yZDY0KDB4NWJlMGNkMTksIDB4MTM3ZTIxNzkpOwogICAgfSBlbHNlIHsKICAgICAgaDAgPSBuZXcgV29yZDY0KDB4Y2JiYjlkNWQsIDB4YzEwNTllZDgpOwogICAgICBoMSA9IG5ldyBXb3JkNjQoMHg2MjlhMjkyYSwgMHgzNjdjZDUwNyk7CiAgICAgIGgyID0gbmV3IFdvcmQ2NCgweDkxNTkwMTVhLCAweDMwNzBkZDE3KTsKICAgICAgaDMgPSBuZXcgV29yZDY0KDB4MTUyZmVjZDgsIDB4ZjcwZTU5MzkpOwogICAgICBoNCA9IG5ldyBXb3JkNjQoMHg2NzMzMjY2NywgMHhmZmMwMGIzMSk7CiAgICAgIGg1ID0gbmV3IFdvcmQ2NCgweDhlYjQ0YTg3LCAweDY4NTgxNTExKTsKICAgICAgaDYgPSBuZXcgV29yZDY0KDB4ZGIwYzJlMGQsIDB4NjRmOThmYTcpOwogICAgICBoNyA9IG5ldyBXb3JkNjQoMHg0N2I1NDgxZCwgMHhiZWZhNGZhNCk7CiAgICB9CiAgICBjb25zdCBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDE3KSAvIDEyOCkgKiAxMjg7CiAgICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogICAgbGV0IGksIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgICB9CiAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CiAgICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gMTY7CiAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgcGFkZGVkW2krK10gPSAwOwogICAgfQogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSAwOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4+IDI5ICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDUgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CiAgICBjb25zdCB3ID0gbmV3IEFycmF5KDgwKTsKICAgIGZvciAoaSA9IDA7IGkgPCA4MDsgaSsrKSB7CiAgICAgI
20HdbaV0gPSBuZXcgV29yZDY0KDAsIDApOwogICAgfQogICAgbGV0IGEgPSBuZXcgV29yZDY0KDAsIDApLAogICAgICBiID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgICAgYyA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgICBsZXQgZCA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICAgIGUgPSBuZXcgV29yZDY0KDAsIDApLAogICAgICBmID0gbmV3IFdvcmQ2NCgwLCAwKTsKICAgIGxldCBnID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgICAgaCA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgICBjb25zdCB0MSA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICAgIHQyID0gbmV3IFdvcmQ2NCgwLCAwKTsKICAgIGNvbnN0IHRtcDEgPSBuZXcgV29yZDY0KDAsIDApLAogICAgICB0bXAyID0gbmV3IFdvcmQ2NCgwLCAwKTsKICAgIGxldCB0bXAzOwogICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICB3W2pdLmhpZ2ggPSBwYWRkZWRbaV0gPDwgMjQgfCBwYWRkZWRbaSArIDFdIDw8IDE2IHwgcGFkZGVkW2kgKyAyXSA8PCA4IHwgcGFkZGVkW2kgKyAzXTsKICAgICAgICB3W2pdLmxvdyA9IHBhZGRlZFtpICsgNF0gPDwgMjQgfCBwYWRkZWRbaSArIDVdIDw8IDE2IHwgcGFkZGVkW2kgKyA2XSA8PCA4IHwgcGFkZGVkW2kgKyA3XTsKICAgICAgICBpICs9IDg7CiAgICAgIH0KICAgICAgZm9yIChqID0gMTY7IGogPCA4MDsgKytqKSB7CiAgICAgICAgdG1wMyA9IHdbal07CiAgICAgICAgbGl0dGxlU2lnbWFQcmltZSh0bXAzLCB3W2ogLSAyXSwgdG1wMik7CiAgICAgICAgdG1wMy5hZGQod1tqIC0gN10pOwogICAgICAgIGxpdHRsZVNpZ21hKHRtcDEsIHdbaiAtIDE1XSwgdG1wMik7CiAgICAgICAgdG1wMy5hZGQodG1wMSk7CiAgICAgICAgdG1wMy5hZGQod1tqIC0gMTZdKTsKICAgICAgfQogICAgICBhLmFzc2lnbihoMCk7CiAgICAgIGIuYXNzaWduKGgxKTsKICAgICAgYy5hc3NpZ24oaDIpOwogICAgICBkLmFzc2lnbihoMyk7CiAgICAgIGUuYXNzaWduKGg0KTsKICAgICAgZi5hc3NpZ24oaDUpOwogICAgICBnLmFzc2lnbihoNik7CiAgICAgIGguYXNzaWduKGg3KTsKICAgICAgZm9yIChqID0gMDsgaiA8IDgwOyArK2opIHsKICAgICAgICB0MS5hc3NpZ24oaCk7CiAgICAgICAgc2lnbWFQcmltZSh0bXAxLCBlLCB0bXAyKTsKICAgICAgICB0MS5hZGQodG1wMSk7CiAgICAgICAgY2godG1wMSwgZSwgZiwgZywgdG1wMik7CiAgICAgICAgdDEuYWRkKHRtcDEpOwogICAgICAgIHQxLmFkZChrW2pdKTsKICAgICAgICB0MS5hZGQod1tqXSk7CiAgICAgICAgc2lnbWEodDIsIGEsIHRtcDIpOwogICAgICAgIG1haih0bXAxLCBhLCBiLCBjLCB0bXAyKTsKICAgICAgICB0Mi5hZGQodG1wMSk7CiAgICAgICAgdG1wMyA9IGg7CiAgICAgICAgaCA9IGc7CiAgICAgICAgZyA9IGY7CiAgICAgICAgZiA9IGU7CiAgICAgICAgZC5hZGQodDEpOwogICAgICAgIGUgPSBkOwogICAgICAgIGQgPSBjOwogICAgICAgIGMgPSBiOwogICAgICAgIGIgPSBhOwogICAgICAgIHRtcDMuYXNzaWduKHQxKTsKICAgICAgICB0bXAzLmFkZCh0Mik7CiAgICAgICAgYSA9IHRtcDM7CiAgICAgIH0KICAgICAgaDAuYWRkKGEpOwogICAgICBoMS5hZGQoYik7CiAgICAgIGgyLmFkZChjKTsKICAgICAgaDMuYWRkKGQpOwogICAgICBoNC5hZGQoZSk7CiAgICAgIGg1LmFkZChmKTsKICAgICAgaDYuYWRkKGcpOwogICAgICBoNy5hZGQoaCk7CiAgICB9CiAgICBsZXQgcmVzdWx0OwogICAgaWYgKCFtb2RlMzg0KSB7CiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDY0KTsKICAgICAgaDAuY29weVRvKHJlc3VsdCwgMCk7CiAgICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgICBoMi5jb3B5VG8ocmVzdWx0LCAxNik7CiAgICAgIGgzLmNvcHlUbyhyZXN1bHQsIDI0KTsKICAgICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgICBoNS5jb3B5VG8ocmVzdWx0LCA0MCk7CiAgICAgIGg2LmNvcHlUbyhyZXN1bHQsIDQ4KTsKICAgICAgaDcuY29weVRvKHJlc3VsdCwgNTYpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoNDgpOwogICAgICBoMC5jb3B5VG8ocmVzdWx0LCAwKTsKICAgICAgaDEuY29weVRvKHJlc3VsdCwgOCk7CiAgICAgIGgyLmNvcHlUbyhyZXN1bHQsIDE2KTsKICAgICAgaDMuY29weVRvKHJlc3VsdCwgMjQpOwogICAgICBoNC5jb3B5VG8ocmVzdWx0LCAzMik7CiAgICAgIGg1LmNvcHlUbyhyZXN1bHQsIDQwKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIHJldHVybiBoYXNoOwp9KCk7CmZ1bmN0aW9uIGNhbGN1bGF0ZVNIQTM4NChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgewogIHJldHVybiBjYWxjdWxhdGVTSEE1MTIoZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIHRydWUpOwp9CmNsYXNzIE51bGxDaXBoZXIgewogIGRlY3J5cHRCbG9jayhkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gZGF0YTsKICB9Cn0KY2xhc3MgQUVTQmFzZUNpcGhlciB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsIDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsIDB4NTEsIDB4YTMsIDB4N
20DAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksIDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTZdKTsKICAgIHRoaXMuX2ludl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsIDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IsIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QsIDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUsIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYsIDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIsIDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsIDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIsIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMsIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksIDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIsIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAsIDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQsIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQsIDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYsIDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2RdKTsKICAgIHRoaXMuX21peCA9IG5ldyBVaW50MzJBcnJheShbMHgwMDAwMDAwMCwgMHgwZTA5MGQwYiwgMHgxYzEyMWExNiwgMHgxMjFiMTcxZCwgMHgzODI0MzQyYywgMHgzNjJkMzkyNywgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSwgMHg0ODZjNWM3NCwgMHg0NjY1NTE3ZiwgMHg1NDdlNDY2MiwgMHg1YTc3NGI2OSwgMHhlMDkwZDBiMCwgMHhlZTk5ZGRiYiwgMHhmYzgyY2FhNiwgMHhmMjhiYzdhZCwgMHhkOGI0ZTQ5YywgMHhkNmJkZTk5NywgMHhjNGE2ZmU4YSwgMHhjYWFmZjM4MSwgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZiwgMHhiNGVlOTZkMiwgMHhiYWU3OWJkOSwgMHhkYjNiYmI3YiwgMHhkNTMyYjY3MCwgMHhjNzI5YTE2ZCwgMHhjOTIwYWM2NiwgMHhlMzFmOGY1NywgMHhlZDE2ODI1YywgMHhmZjBkOTU0MSwgMHhmMTA0OTg0YSwgMHhhYjczZDMyMywgMHhhNTdhZGUyOCwgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMiwgMHgzYmFiNmJjYiwgMHgzNWEyNjZjMCwgMHgyN2I5NzFkZCwgMHgyOWIwN2NkNiwgMHgwMzhmNWZlNywgMHgwZDg2NTJlYywgMHgxZjlkNDVmMSwgMHgxMTk0NDhmYSwgMHg0YmUzMDM5MywgMHg0NWVhMGU5OCwgMHg1N2YxMTk4NSwgMHg1OWY4MTQ4ZSwgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCwgMHhiMTY0NzdlMCwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwgMHg5YjViNTRkMSwgMHg4OTQwNDNjYywgMHg4NzQ5NGVjNywgMHhkZDNlMDVhZSwgMHhkMzM3MDhhNSwgMHhjMTJjMWZiOCwgMHhjZjI1MTJiMywgMHhlNTFhMzE4MiwgMHhlYjEzM2M4OSwgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YiwgMHg3NWMyODk2YSwgMHg3YmNiODQ2MSwgMHg2OWQwOTM3YywgMHg2N2Q5OWU3NywgMHgzZGFlZDUxZSwgMHgzM2E3ZDgxNSwgMHgyMWJjY2YwOCwgMHgyZmI1YzIwMywgMHgwNThhZTEzMiwgMHgwYjgzZWMzOSwgMHgxOTk4ZmIyNCwgMHgxNzkxZjYyZiwgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSwgMHg1MjdiZjhiNywgMHg1YzcyZjViYywgMHgwNjA1YmVkNSwgMHgwODBjYjNkZSwgMHgxYTE3YTRjMywgMHgxNDFlYTljOCwgMHgzZTIxOGFmOSwgMHgzMDI4ODdmMiwgMHgyMjMzOTBlZiwgMHgyYzNhOWRlNCwgMHg5NmRkMDYzZCwgMHg5OGQ0MGIzNiwgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYywgMHhlNjk1NmU2NSwgMHhlODljNjM2ZSwgMHhmYTg3NzQ3MywgMHhmNDhlNzk3OCwgMHhkZWIxNWE0OSwgMHhkMGI4NTc0MiwgMHhjMmEzNDA1ZiwgMHhjY2FhNGQ1NCwgMHg0MWVjZGFmNywgMHg0ZmU1ZDdmYywgMHg1ZGZlYzBlMSwgMHg1M2Y3Y2RlYSwgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCwgMHgyZGI2YThiOSwgMHgyM2JmYTViMiwgMHgwOTgwODY4MywgMHgwNzg5OGI4OCwgMHgxNTkyOWM5NSwgMHgxYjliOTE5ZSwgMHhhMTdjMGE0NywgMHhhZjc1MDc0YywgMHhiZDZlMTA1MSwgMHhiMzY3MWQ1YSwgMHg5OTU4M2U2YiwgMHg5NzUxMzM2MCwgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMiwgMHhlOTEwNTYzMywgMHhlNzE5NWIzOCwgMHhmNTAyNGMyNSwgMHhmYjBiNDEyZSwgMHg5YWQ3NjE4YywgMHg5NGRlNmM4NywgMHg4NmM1N2I5YSwgMHg4OGNjNzY5MSwgMHhhMmYzNTVhMCwgMHhhY2ZhNThhYiwgMHhiZWUxNGZiNiwgMHhiMGU4NDJiZCwgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMywgMHhjZWE5MjdlZSwgMHhjMGEwMmFlNSwgMHg3YTQ3YjEzYywgMHg3NDRlYmMzNywgMHg2NjU1YWIyYSwgMHg2ODVjYTYyMSwgMHg0MjYzODUxMCwgMHg0YzZhODgxYiwgMHg1ZTcxOWYwNiwgMHg1MDc4OTIwZCwgMHgwYTBmZDk2NCwgMHgwNDA2ZDQ2ZiwgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSwgMHhlYzlhYjcwMSwgMHhlMjkzYmEwYSwgMHhmMDg4YWQxNywgMHhmZTgxYTAxYywgMHhkNGJlODMyZCwgMHhkYWI3OGUyNiwgMHhjOGFjOTkzYiwgMHhjNmE1OTQzMCwgMHg5Y2QyZGY1OSwgMHg5MmRiZDI1MiwgMHg4MGMwYzU0ZiwgMHg4ZWM5Yzg0NCwgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSwgMHgxMDE4N2RhNywgMHgxZTExNzBhYywgMHgzNDJlNTM5ZCwgMHgzYTI3NWU5NiwgMHgyODNjNDk4YiwgMHgyNjM1NDQ4MCwgMHg3YzQyMGZlOSwgMHg3MjRiMDJlMiwgMHg2MDUwMTVmZiwgMHg2ZTU5MThmNCwgMHg0NDY2M2JjNSwgMHg0YTZmMzZjZSwgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NywgMHgwZjg1Mzg1NiwgMHgwMThjMzU1ZCwgMHgxMzk3MjI0MCwgMHgxZDllMmY0YiwgMHg0N2U5NjQyMiwgMHg0OWUwNjkyOSwgMHg1YmZiN2UzNCwgMHg1NWYyNzMzZiwgMHg3ZmNkNTAwZSwgMHg3MWM0NWQwNSwgMHg2M2RmNGExOCwgMHg2ZGQ2NDcxMywgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCwgMHhmMzA3ZjJmMCwgMHhmZDBlZmZmYiwgMHhhNzc5YjQ5MiwgMHhhOTcwYjk5OSwgMHhiYjZiYWU4NCwgMHhiNTYyYTM4ZiwgMHg5ZjVkODBiZSwgMHg5MTU0OGRiNSwgMHg4MzRmOWFhOCwgMHg4ZDQ2OTdhM10pOwogICAgdGhpcy5fbWl4Q29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgdGhpcy5fbWl4Q29sW2ldID0gaSA8IDEyOCA/IGkgPDwgMSA6IGkgPDwgMSBeIDB4MWI7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHRoaXMuYnVmZmVyUG9zaXRpb24gPSAwOwogIH0KICBfZXhwYW5kS2V5KGNpcGhlcktleSkgewogICAgdW5yZWFjaGFibGUoIkNhbm5vdCBjYWxsIGBfZXhwYW5kS2V5YCBvbiB0aGUgYmFzZSBjbGFzcyIpOwogIH0KICBfZGVjcnlwdChpbnB1dCwga2V5KSB7CiAgICBsZXQgdCwgdSwgdjsKICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgc3RhdGUuc2V0KGlucHV0KTsKICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykgewogICAgICBzdGF0ZVtqXSBePSBrZXlba107CiAgICB9CiAgICBmb3IgKGxldCBpID0gdGh
20pcy5fY3ljbGVzT2ZSZXBldGl0aW9uIC0gMTsgaSA+PSAxOyAtLWkpIHsKICAgICAgdCA9IHN0YXRlWzEzXTsKICAgICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CiAgICAgIHN0YXRlWzldID0gc3RhdGVbNV07CiAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07CiAgICAgIHN0YXRlWzFdID0gdDsKICAgICAgdCA9IHN0YXRlWzE0XTsKICAgICAgdSA9IHN0YXRlWzEwXTsKICAgICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CiAgICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdOwogICAgICBzdGF0ZVs2XSA9IHQ7CiAgICAgIHN0YXRlWzJdID0gdTsKICAgICAgdCA9IHN0YXRlWzE1XTsKICAgICAgdSA9IHN0YXRlWzExXTsKICAgICAgdiA9IHN0YXRlWzddOwogICAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTsKICAgICAgc3RhdGVbMTFdID0gdDsKICAgICAgc3RhdGVbN10gPSB1OwogICAgICBzdGF0ZVszXSA9IHY7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHN0YXRlW2pdID0gdGhpcy5faW52X3Nbc3RhdGVbal1dOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBrID0gaSAqIDE2OyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkgewogICAgICAgIGNvbnN0IHMwID0gdGhpcy5fbWl4W3N0YXRlW2pdXTsKICAgICAgICBjb25zdCBzMSA9IHRoaXMuX21peFtzdGF0ZVtqICsgMV1dOwogICAgICAgIGNvbnN0IHMyID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAyXV07CiAgICAgICAgY29uc3QgczMgPSB0aGlzLl9taXhbc3RhdGVbaiArIDNdXTsKICAgICAgICB0ID0gczAgXiBzMSA+Pj4gOCBeIHMxIDw8IDI0IF4gczIgPj4+IDE2IF4gczIgPDwgMTYgXiBzMyA+Pj4gMjQgXiBzMyA8PCA4OwogICAgICAgIHN0YXRlW2pdID0gdCA+Pj4gMjQgJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAxXSA9IHQgPj4gMTYgJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAyXSA9IHQgPj4gOCAmIDB4ZmY7CiAgICAgICAgc3RhdGVbaiArIDNdID0gdCAmIDB4ZmY7CiAgICAgIH0KICAgIH0KICAgIHQgPSBzdGF0ZVsxM107CiAgICBzdGF0ZVsxM10gPSBzdGF0ZVs5XTsKICAgIHN0YXRlWzldID0gc3RhdGVbNV07CiAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOwogICAgc3RhdGVbMV0gPSB0OwogICAgdCA9IHN0YXRlWzE0XTsKICAgIHUgPSBzdGF0ZVsxMF07CiAgICBzdGF0ZVsxNF0gPSBzdGF0ZVs2XTsKICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdOwogICAgc3RhdGVbNl0gPSB0OwogICAgc3RhdGVbMl0gPSB1OwogICAgdCA9IHN0YXRlWzE1XTsKICAgIHUgPSBzdGF0ZVsxMV07CiAgICB2ID0gc3RhdGVbN107CiAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTsKICAgIHN0YXRlWzExXSA9IHQ7CiAgICBzdGF0ZVs3XSA9IHU7CiAgICBzdGF0ZVszXSA9IHY7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07CiAgICAgIHN0YXRlW2pdIF49IGtleVtqXTsKICAgIH0KICAgIHJldHVybiBzdGF0ZTsKICB9CiAgX2VuY3J5cHQoaW5wdXQsIGtleSkgewogICAgY29uc3QgcyA9IHRoaXMuX3M7CiAgICBsZXQgdCwgdSwgdjsKICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgc3RhdGUuc2V0KGlucHV0KTsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICBzdGF0ZVtqXSBePSBrZXlbal07CiAgICB9CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbjsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07CiAgICAgIH0KICAgICAgdiA9IHN0YXRlWzFdOwogICAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOwogICAgICBzdGF0ZVs1XSA9IHN0YXRlWzldOwogICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTsKICAgICAgc3RhdGVbMTNdID0gdjsKICAgICAgdiA9IHN0YXRlWzJdOwogICAgICB1ID0gc3RhdGVbNl07CiAgICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOwogICAgICBzdGF0ZVs2XSA9IHN0YXRlWzE0XTsKICAgICAgc3RhdGVbMTBdID0gdjsKICAgICAgc3RhdGVbMTRdID0gdTsKICAgICAgdiA9IHN0YXRlWzNdOwogICAgICB1ID0gc3RhdGVbN107CiAgICAgIHQgPSBzdGF0ZVsxMV07CiAgICAgIHN0YXRlWzNdID0gc3RhdGVbMTVdOwogICAgICBzdGF0ZVs3XSA9IHY7CiAgICAgI
20HN0YXRlWzExXSA9IHU7CiAgICAgIHN0YXRlWzE1XSA9IHQ7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkgewogICAgICAgIGNvbnN0IHMwID0gc3RhdGVbaiArIDBdOwogICAgICAgIGNvbnN0IHMxID0gc3RhdGVbaiArIDFdOwogICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdOwogICAgICAgIGNvbnN0IHMzID0gc3RhdGVbaiArIDNdOwogICAgICAgIHQgPSBzMCBeIHMxIF4gczIgXiBzMzsKICAgICAgICBzdGF0ZVtqICsgMF0gXj0gdCBeIHRoaXMuX21peENvbFtzMCBeIHMxXTsKICAgICAgICBzdGF0ZVtqICsgMV0gXj0gdCBeIHRoaXMuX21peENvbFtzMSBeIHMyXTsKICAgICAgICBzdGF0ZVtqICsgMl0gXj0gdCBeIHRoaXMuX21peENvbFtzMiBeIHMzXTsKICAgICAgICBzdGF0ZVtqICsgM10gXj0gdCBeIHRoaXMuX21peENvbFtzMyBeIHMwXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgewogICAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07CiAgICB9CiAgICB2ID0gc3RhdGVbMV07CiAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOwogICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKICAgIHN0YXRlWzldID0gc3RhdGVbMTNdOwogICAgc3RhdGVbMTNdID0gdjsKICAgIHYgPSBzdGF0ZVsyXTsKICAgIHUgPSBzdGF0ZVs2XTsKICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOwogICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CiAgICBzdGF0ZVsxMF0gPSB2OwogICAgc3RhdGVbMTRdID0gdTsKICAgIHYgPSBzdGF0ZVszXTsKICAgIHUgPSBzdGF0ZVs3XTsKICAgIHQgPSBzdGF0ZVsxMV07CiAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKICAgIHN0YXRlWzddID0gdjsKICAgIHN0YXRlWzExXSA9IHU7CiAgICBzdGF0ZVsxNV0gPSB0OwogICAgZm9yIChsZXQgaiA9IDAsIGsgPSB0aGlzLl9rZXlTaXplOyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgIH0KICAgIHJldHVybiBzdGF0ZTsKICB9CiAgX2RlY3J5cHRCbG9jazIoZGF0YSwgZmluYWxpemUpIHsKICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAogICAgICBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBsZXQgaXYgPSB0aGlzLml2OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkgewogICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgICsrYnVmZmVyTGVuZ3RoOwogICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBwbGFpbiA9IHRoaXMuX2RlY3J5cHQoYnVmZmVyLCB0aGlzLl9rZXkpOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBwbGFpbltqXSBePSBpdltqXTsKICAgICAgfQogICAgICBpdiA9IGJ1ZmZlcjsKICAgICAgcmVzdWx0LnB1c2gocGxhaW4pOwogICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgdGhpcy5pdiA9IGl2OwogICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgfQogICAgbGV0IG91dHB1dExlbmd0aCA9IDE2ICogcmVzdWx0Lmxlbmd0aDsKICAgIGlmIChmaW5hbGl6ZSkgewogICAgICBjb25zdCBsYXN0QmxvY2sgPSByZXN1bHQuYXQoLTEpOwogICAgICBsZXQgcHNMZW4gPSBsYXN0QmxvY2tbMTVdOwogICAgICBpZiAocHNMZW4gPD0gMTYpIHsKICAgICAgICBmb3IgKGxldCBpID0gMTUsIGlpID0gMTYgLSBwc0xlbjsgaSA+PSBpaTsgLS1pKSB7CiAgICAgICAgICBpZiAobGFzdEJsb2NrW2ldICE9PSBwc0xlbikgewogICAgICAgICAgICBwc0xlbiA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXRwdXRMZW5ndGggLT0gcHNMZW47CiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGxhc3RCbG9jay5zdWJhcnJheSgwLCAxNiAtIHBzTGVuKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7ICsraSwgaiArPSAxNikgewogICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KICBkZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUsIGl2ID0gbnVsbCkgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogICAgaWYgKGl2KSB7CiAgICAgIHRoaXMuaXYgPSBpdjsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBidWZmZXJMZW5ndGggPCAxNiAmJiBpIDwgc291cmNlTGVuZ3RoOyArK2ksICsrYnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aF0gPSBkYXRhW2ldOwogICAgICB9CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgfQogICAgICB0aGlzLml2ID0gYnVmZmVyOwogICAgICBkYXRhID0gZGF0YS5zdWJhcnJheSgxNik7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKICAgIHRoaXMuZGVjcnlwdEJsb2NrID0gdGhpcy5fZGVjcnlwdEJsb2NrMjsKICAgIHJldHVybi
20B0aGlzLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgfQogIGVuY3J5cHQoZGF0YSwgaXYpIHsKICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAogICAgICBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBpZiAoIWl2KSB7CiAgICAgIGl2ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkgewogICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgICsrYnVmZmVyTGVuZ3RoOwogICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBidWZmZXJbal0gXj0gaXZbal07CiAgICAgIH0KICAgICAgY29uc3QgY2lwaGVyID0gdGhpcy5fZW5jcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CiAgICAgIGl2ID0gY2lwaGVyOwogICAgICByZXN1bHQucHVzaChjaXBoZXIpOwogICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgdGhpcy5pdiA9IGl2OwogICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgfQogICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOwogICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7ICsraSwgaiArPSAxNikgewogICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KfQpjbGFzcyBBRVMxMjhDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxMDsKICAgIHRoaXMuX2tleVNpemUgPSAxNjA7CiAgICB0aGlzLl9yY29uID0gbmV3IFVpbnQ4QXJyYXkoWzB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGRdKTsKICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpOwogIH0KICBfZXhwYW5kS2V5KGNpcGhlcktleSkgewogICAgY29uc3QgYiA9IDE3NjsKICAgIGNvbnN0IHMgPSB0aGlzLl9zOwogICAgY29uc3QgcmNvbiA9IHRoaXMuX3Jjb247CiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShiKTsKICAgIHJlc3VsdC5zZXQoY2lwaGVyS2V5KTsKICAgIGZvciAobGV0IGogPSAxNiwgaSA9IDE7IGogPCBiOyArK2kpIHsKICAgICAgbGV0IHQxID0gcmVzdWx0W2ogLSAzXTsKICAgICAgbGV0IHQyID0gcmVzdWx0W2ogLSAyXTsKICAgICAgbGV0IHQzID0gcmVzdWx0W2ogLSAxXTsKICAgICAgbGV0IHQ0ID0gcmVzdWx0W2ogLSA0XTsKICAgICAgdDEgPSBzW3QxXTsKICAgICAgdDIgP
20SBzW3QyXTsKICAgICAgdDMgPSBzW3QzXTsKICAgICAgdDQgPSBzW3Q0XTsKICAgICAgdDEgXj0gcmNvbltpXTsKICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHsKICAgICAgICByZXN1bHRbal0gPSB0MSBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQzIF49IHJlc3VsdFtqIC0gMTZdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0NCBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CmNsYXNzIEFFUzI1NkNpcGhlciBleHRlbmRzIEFFU0Jhc2VDaXBoZXIgewogIGNvbnN0cnVjdG9yKGtleSkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbiA9IDE0OwogICAgdGhpcy5fa2V5U2l6ZSA9IDIyNDsKICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpOwogIH0KICBfZXhwYW5kS2V5KGNpcGhlcktleSkgewogICAgY29uc3QgYiA9IDI0MDsKICAgIGNvbnN0IHMgPSB0aGlzLl9zOwogICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoYik7CiAgICByZXN1bHQuc2V0KGNpcGhlcktleSk7CiAgICBsZXQgciA9IDE7CiAgICBsZXQgdDEsIHQyLCB0MywgdDQ7CiAgICBmb3IgKGxldCBqID0gMzIsIGkgPSAxOyBqIDwgYjsgKytpKSB7CiAgICAgIGlmIChqICUgMzIgPT09IDE2KSB7CiAgICAgICAgdDEgPSBzW3QxXTsKICAgICAgICB0MiA9IHNbdDJdOwogICAgICAgIHQzID0gc1t0M107CiAgICAgICAgdDQgPSBzW3Q0XTsKICAgICAgfSBlbHNlIGlmIChqICUgMzIgPT09IDApIHsKICAgICAgICB0MSA9IHJlc3VsdFtqIC0gM107CiAgICAgICAgdDIgPSByZXN1bHRbaiAtIDJdOwogICAgICAgIHQzID0gcmVzdWx0W2ogLSAxXTsKICAgICAgICB0NCA9IHJlc3VsdFtqIC0gNF07CiAgICAgICAgdDEgPSBzW3QxXTsKICAgICAgICB0MiA9IHNbdDJdOwogICAgICAgIHQzID0gc1t0M107CiAgICAgICAgdDQgPSBzW3Q0XTsKICAgICAgICB0MSBePSByOwogICAgICAgIGlmICgociA8PD0gMSkgPj0gMjU2KSB7CiAgICAgICAgICByID0gKHIgXiAweDFiKSAmIDB4ZmY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgKytuKSB7CiAgICAgICAgcmVzdWx0W2pdID0gdDEgXj0gcmVzdWx0W2ogLSAzMl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQyIF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MyBePSByZXN1bHRbaiAtIDMyXTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDQgXj0gcmVzdWx0W2ogLSAzMl07CiAgICAgICAgaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KfQpjbGFzcyBQREYxNyB7CiAgY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOwogICAgcmV0dXJuIGlzQXJyYXlFcXVhbChyZXN1bHQsIG93bmVyUGFzc3dvcmQpOwogIH0KICBjaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KHVzZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKICAgIHJldHVybiBpc0FycmF5RXF1YWwocmVzdWx0LCB1c2VyUGFzc3dvcmQpOwogIH0KICBnZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOwogICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9CiAgZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGNvbnN0IGtleSA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKICAgIGNvbnN0IGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9Cn0KY2xhc3MgUERGMjAgewogIF9oYXNoKHBhc3N3b3JkLCBpbnB1dCwgdXNlckJ5dGVzKSB7CiAgICBsZXQgayA9IGNhbGN1bGF0ZVNIQTI1NihpbnB1dCwgMCwgaW5wdXQubGVuZ3RoKS5zdWJhcnJheSgwLCAzMik7CiAgICBsZXQgZSA9IFswXTsKICAgIGxldCBpID0gMDsKICAgIHdoaWxlIChpIDwgNjQgfHwgZS5hdCgtMSkgPiBpIC0gMzIpIHsKICAgICAgY29uc3QgY29tYmluZWRMZW5ndGggPSBwYXNzd29yZC5sZW5ndGggKyBrLmxlbmd0aCArIHVzZXJCeXRlcy5sZW5ndGgsCiAgICAgICAgY29tYmluZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KGNvbWJpbmVkTGVuZ3RoKTsKICAgICAgbGV0IHdyaXRlT2Zmc2V0ID0gMDsKICAgICAgY29tYmluZWRBcnJheS5zZXQocGFzc3dvcmQsIHdyaXRlT2Zmc2V0KTsKICAgICAgd3JpdGVPZmZzZXQgKz0gcGFzc3dvcmQubGVuZ3RoOwogICAgICBjb21iaW5lZEFycmF5LnNldChrLCB3cml0ZU9mZnNldCk7CiAgICAgI
20HdyaXRlT2Zmc2V0ICs9IGsubGVuZ3RoOwogICAgICBjb21iaW5lZEFycmF5LnNldCh1c2VyQnl0ZXMsIHdyaXRlT2Zmc2V0KTsKICAgICAgY29uc3QgazEgPSBuZXcgVWludDhBcnJheShjb21iaW5lZExlbmd0aCAqIDY0KTsKICAgICAgZm9yIChsZXQgaiA9IDAsIHBvcyA9IDA7IGogPCA2NDsgaisrLCBwb3MgKz0gY29tYmluZWRMZW5ndGgpIHsKICAgICAgICBrMS5zZXQoY29tYmluZWRBcnJheSwgcG9zKTsKICAgICAgfQogICAgICBjb25zdCBjaXBoZXIgPSBuZXcgQUVTMTI4Q2lwaGVyKGsuc3ViYXJyYXkoMCwgMTYpKTsKICAgICAgZSA9IGNpcGhlci5lbmNyeXB0KGsxLCBrLnN1YmFycmF5KDE2LCAzMikpOwogICAgICBjb25zdCByZW1haW5kZXIgPSBlLnNsaWNlKDAsIDE2KS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAlIDM7CiAgICAgIGlmIChyZW1haW5kZXIgPT09IDApIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMjU2KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDEpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBMzg0KGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfSBlbHNlIGlmIChyZW1haW5kZXIgPT09IDIpIHsKICAgICAgICBrID0gY2FsY3VsYXRlU0hBNTEyKGUsIDAsIGUubGVuZ3RoKTsKICAgICAgfQogICAgICBpKys7CiAgICB9CiAgICByZXR1cm4gay5zdWJhcnJheSgwLCAzMik7CiAgfQogIGNoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgdXNlckJ5dGVzLCBvd25lclBhc3N3b3JkKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDU2KTsKICAgIGhhc2hEYXRhLnNldChwYXNzd29yZCwgMCk7CiAgICBoYXNoRGF0YS5zZXQob3duZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyVmFsaWRhdGlvblNhbHQubGVuZ3RoKTsKICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2hhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCB1c2VyQnl0ZXMpOwogICAgcmV0dXJuIGlzQXJyYXlFcXVhbChyZXN1bHQsIG93bmVyUGFzc3dvcmQpOwogIH0KICBjaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgOCk7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KHVzZXJWYWxpZGF0aW9uU2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2hhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7CiAgICByZXR1cm4gaXNBcnJheUVxdWFsKHJlc3VsdCwgdXNlclBhc3N3b3JkKTsKICB9CiAgZ2V0T3duZXJLZXkocGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgdXNlckJ5dGVzLCBvd25lckVuY3J5cHRpb24pIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lcktleVNhbHQubGVuZ3RoKTsKICAgIGNvbnN0IGtleSA9IHRoaXMuX2hhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCB1c2VyQnl0ZXMpOwogICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9CiAgZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGNvbnN0IGtleSA9IHRoaXMuX2hhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CiAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayh1c2VyRW5jcnlwdGlvbiwgZmFsc2UsIG5ldyBVaW50OEFycmF5KDE2KSk7CiAgfQp9CmNsYXNzIENpcGhlclRyYW5zZm9ybSB7CiAgY29uc3RydWN0b3Ioc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IsIHN0cmVhbUNpcGhlckNvbnN0cnVjdG9yKSB7CiAgICB0aGlzLlN0cmluZ0NpcGhlckNvbnN0cnVjdG9yID0gc3RyaW5nQ2lwaGVyQ29uc3RydWN0b3I7CiAgICB0aGlzLlN0cmVhbUNpcGhlckNvbnN0cnVjdG9yID0gc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3I7CiAgfQogIGNyZWF0ZVN0cmVhbShzdHJlYW0sIGxlbmd0aCkgewogICAgY29uc3QgY2lwaGVyID0gbmV3IHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IoKTsKICAgIHJldHVybiBuZXcgRGVjcnlwdFN0cmVhbShzdHJlYW0sIGxlbmd0aCwgZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShkYXRhLCBmaW5hbGl6ZSkgewogICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgICB9KTsKICB9CiAgZGVjcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgbGV0IGRhdGEgPSBzdHJpbmdUb0J5dGVzKHMpOwogICAgZGF0YSA9IGNpcGhlci5kZWNyeXB0QmxvY2soZGF0YSwgdHJ1ZSk7CiAgICByZXR1cm4gYnl0ZXNUb1N0cmluZyhkYXRhKTsKICB9CiAgZW5jcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgaWYgKGNpcGhlciBpbnN0YW5jZW9mIEFFU0Jhc2VDaXBoZXIpIHsKICAgICAgY29uc3Qgc3RyTGVuID0gcy5sZW5ndGg7CiAgICAgIGNvbnN0IHBhZCA9IDE2IC0gc3RyTGVuICUgMTY7CiAgICAgI
20HMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYWQpLnJlcGVhdChwYWQpOwogICAgICBjb25zdCBpdiA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhpdik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgICAgICBpdltpXSA9IE1hdGguZmxvb3IoMjU2ICogTWF0aC5yYW5kb20oKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgICAgZGF0YSA9IGNpcGhlci5lbmNyeXB0KGRhdGEsIGl2KTsKICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7CiAgICAgIGJ1Zi5zZXQoaXYpOwogICAgICBidWYuc2V0KGRhdGEsIDE2KTsKICAgICAgcmV0dXJuIGJ5dGVzVG9TdHJpbmcoYnVmKTsKICAgIH0KICAgIGxldCBkYXRhID0gc3RyaW5nVG9CeXRlcyhzKTsKICAgIGRhdGEgPSBjaXBoZXIuZW5jcnlwdChkYXRhKTsKICAgIHJldHVybiBieXRlc1RvU3RyaW5nKGRhdGEpOwogIH0KfQpjbGFzcyBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5IHsKICBzdGF0aWMgI2RlZmF1bHRQYXNzd29yZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjgsIDB4YmYsIDB4NGUsIDB4NWUsIDB4NGUsIDB4NzUsIDB4OGEsIDB4NDEsIDB4NjQsIDB4MDAsIDB4NGUsIDB4NTYsIDB4ZmYsIDB4ZmEsIDB4MDEsIDB4MDgsIDB4MmUsIDB4MmUsIDB4MDAsIDB4YjYsIDB4ZDAsIDB4NjgsIDB4M2UsIDB4ODAsIDB4MmYsIDB4MGMsIDB4YTksIDB4ZmUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N2FdKTsKICAjY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgb3duZXJWYWxpZGF0aW9uU2FsdCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIHVzZXJQYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyS2V5U2FsdCwgb3duZXJFbmNyeXB0aW9uLCB1c2VyRW5jcnlwdGlvbiwgcGVybXMpIHsKICAgIGlmIChwYXNzd29yZCkgewogICAgICBjb25zdCBwYXNzd29yZExlbmd0aCA9IE1hdGgubWluKDEyNywgcGFzc3dvcmQubGVuZ3RoKTsKICAgICAgcGFzc3dvcmQgPSBwYXNzd29yZC5zdWJhcnJheSgwLCBwYXNzd29yZExlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBwYXNzd29yZCA9IFtdOwogICAgfQogICAgY29uc3QgcGRmQWxnb3JpdGhtID0gcmV2aXNpb24gPT09IDYgPyBuZXcgUERGMjAoKSA6IG5ldyBQREYxNygpOwogICAgaWYgKHBkZkFsZ29yaXRobS5jaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgdXNlclZhbGlkYXRpb25TYWx0LCB1c2VyUGFzc3dvcmQpKSB7CiAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKTsKICAgIH0gZWxzZSBpZiAocGFzc3dvcmQubGVuZ3RoICYmIHBkZkFsZ29yaXRobS5jaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVCeXRlcywgb3duZXJQYXNzd29yZCkpIHsKICAgICAgcmV0dXJuIHBkZkFsZ29yaXRobS5nZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1Qnl0ZXMsIG93bmVyRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgI3ByZXBhcmVLZXlEYXRhKGZpbGVJZCwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSkgewogICAgY29uc3QgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KGhhc2hEYXRhU2l6ZSk7CiAgICBsZXQgaSA9IDAsCiAgICAgIGosCiAgICAgIG47CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CiAgICAgIH0KICAgIH0KICAgIGogPSAwOwogICAgd2hpbGUgKGkgPCAzMikgewogICAgICBoYXNoRGF0YVtpKytdID0gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeS4jZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKICAgIH0KICAgIGZvciAoaiA9IDAsIG4gPSBvd25lclBhc3N3b3JkLmxlbmd0aDsgaiA8IG47ICsraikgewogICAgICBoYXNoRGF0YVtpKytdID0gb3duZXJQYXNzd29yZFtqXTsKICAgIH0KICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyAmIDB4ZmY7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4gOCAmIDB4ZmY7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4gMTYgJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+PiAyNCAmIDB4ZmY7CiAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikgewogICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdOwogICAgfQogICAgaWYgKHJldmlzaW9uID49IDQgJiYgIWVuY3J5cHRNZXRhZGF0YSkgewogICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7CiAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmOwogICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKICAgIH0KICAgIGxldCBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTsKICAgIGNvbnN0IGtleUxlbmd0aEluQnl0ZXMgPSBrZXlMZW5ndGggPj4gMzsKICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCA1MDsgKytqKSB7CiAgICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoLCAwLCBrZXlMZW5ndGhJbkJ5dGVzKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGhhc2guc3ViYXJyYXkoMCwga2V5TGVuZ3RoSW5CeXRlcyk7CiAgICBsZXQgY2lwaGVyLCBjaGVja0RhdGE7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeS4jZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaV07CiAgICAgI
20H0KICAgICAgZm9yIChqID0gMCwgbiA9IGZpbGVJZC5sZW5ndGg7IGogPCBuOyArK2opIHsKICAgICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdOwogICAgICB9CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpOwogICAgICBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CiAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKTsKICAgICAgZm9yIChqID0gMTsgaiA8PSAxOTsgKytqKSB7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHsKICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBlbmNyeXB0aW9uS2V5W2tdIF4gajsKICAgICAgICB9CiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CiAgICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjaGVja0RhdGEpOwogICAgICB9CiAgICAgIGZvciAoaiA9IDAsIG4gPSBjaGVja0RhdGEubGVuZ3RoOyBqIDwgbjsgKytqKSB7CiAgICAgICAgaWYgKHVzZXJQYXNzd29yZFtqXSAhPT0gY2hlY2tEYXRhW2pdKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKENpcGhlclRyYW5zZm9ybUZhY3RvcnkuI2RlZmF1bHRQYXNzd29yZEJ5dGVzKTsKICAgICAgZm9yIChqID0gMCwgbiA9IGNoZWNrRGF0YS5sZW5ndGg7IGogPCBuOyArK2opIHsKICAgICAgICBpZiAodXNlclBhc3N3b3JkW2pdICE9PSBjaGVja0RhdGFbal0pIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7CiAgfQogICNkZWNvZGVVc2VyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMzIpOwogICAgbGV0IGkgPSAwOwogICAgY29uc3QgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgZm9yICg7IGkgPCBuOyArK2kpIHsKICAgICAgaGFzaERhdGFbaV0gPSBwYXNzd29yZFtpXTsKICAgIH0KICAgIGxldCBqID0gMDsKICAgIHdoaWxlIChpIDwgMzIpIHsKICAgICAgaGFzaERhdGFbaSsrXSA9IENpcGhlclRyYW5zZm9ybUZhY3RvcnkuI2RlZmF1bHRQYXNzd29yZEJ5dGVzW2orK107CiAgICB9CiAgICBsZXQgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSk7CiAgICBjb25zdCBrZXlMZW5ndGhJbkJ5dGVzID0ga2V5TGVuZ3RoID4+IDM7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGogPSAwOyBqIDwgNTA7ICsraikgewogICAgICAgIGhhc2ggPSBjYWxjdWxhdGVNR
20DUoaGFzaCwgMCwgaGFzaC5sZW5ndGgpOwogICAgICB9CiAgICB9CiAgICBsZXQgY2lwaGVyLCB1c2VyUGFzc3dvcmQ7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICB1c2VyUGFzc3dvcmQgPSBvd25lclBhc3N3b3JkOwogICAgICBjb25zdCBkZXJpdmVkS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5TGVuZ3RoSW5CeXRlcyk7CiAgICAgIGZvciAoaiA9IDE5OyBqID49IDA7IGotLSkgewogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwga2V5TGVuZ3RoSW5CeXRlczsgKytrKSB7CiAgICAgICAgICBkZXJpdmVkS2V5W2tdID0gaGFzaFtrXSBeIGo7CiAgICAgICAgfQogICAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGRlcml2ZWRLZXkpOwogICAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sodXNlclBhc3N3b3JkKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoaGFzaC5zdWJhcnJheSgwLCBrZXlMZW5ndGhJbkJ5dGVzKSk7CiAgICAgIHVzZXJQYXNzd29yZCA9IGNpcGhlci5lbmNyeXB0QmxvY2sob3duZXJQYXNzd29yZCk7CiAgICB9CiAgICByZXR1cm4gdXNlclBhc3N3b3JkOwogIH0KICAjYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGVuY3J5cHRpb25LZXksIGlzQWVzID0gZmFsc2UpIHsKICAgIGNvbnN0IGtleSA9IG5ldyBVaW50OEFycmF5KGVuY3J5cHRpb25LZXkubGVuZ3RoICsgOSk7CiAgICBjb25zdCBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CiAgICBsZXQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAga2V5W2ldID0gZW5jcnlwdGlvbktleVtpXTsKICAgIH0KICAgIGtleVtpKytdID0gbnVtICYgMHhmZjsKICAgIGtleVtpKytdID0gbnVtID4+IDggJiAweGZmOwogICAga2V5W2krK10gPSBudW0gPj4gMTYgJiAweGZmOwogICAga2V5W2krK10gPSBnZW4gJiAweGZmOwogICAga2V5W2krK10gPSBnZW4gPj4gOCAmIDB4ZmY7CiAgICBpZiAoaXNBZXMpIHsKICAgICAga2V5W2krK10gPSAweDczOwogICAgICBrZXlbaSsrXSA9IDB4NDE7CiAgICAgIGtleVtpKytdID0gMHg2YzsKICAgICAga2V5W2krK10gPSAweDU0OwogICAgfQogICAgY29uc3QgaGFzaCA9IGNhbGN1bGF0ZU1ENShrZXksIDAsIGkpOwogICAgcmV0dXJuIGhhc2guc3ViYXJyYXkoMCwgTWF0aC5taW4oZW5jcnlwdGlvbktleS5sZW5ndGggKyA1LCAxNikpOwogIH0KICAjYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihjZiwgbmFtZSwgbnVtLCBnZW4sIGtleSkgewogICAgaWYgKCEobmFtZSBpbnN0YW5jZW9mIE5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTsKICAgIH0KICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgY29uc3QgY3J5cHRGaWx0ZXIgPSBjZi5nZXQobmFtZS5uYW1lKTsKICAgIGNvbnN0IGNmbSA9IGNyeXB0RmlsdGVyPy5nZXQoIkNGTSIpOwogICAgaWYgKCFjZm0gfHwgY2ZtLm5hbWUgPT09ICJOb25lIikgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBuZXcgTnVsbENpcGhlcigpOwogICAgICB9OwogICAgfQogICAgaWYgKGNmbS5uYW1lID09PSAiVjIiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKHNlbGYuI2J1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBrZXksIGZhbHNlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMiIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzEyOENpcGhlcihzZWxmLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCB0cnVlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMyIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgICB9OwogICAgfQogICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJVbmtub3duIGNyeXB0byBtZXRob2QiKTsKICB9CiAgY29uc3RydWN0b3IoZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgewogICAgY29uc3QgZmlsdGVyID0gZGljdC5nZXQoIkZpbHRlciIpOwogICAgaWYgKCFpc05hbWUoZmlsdGVyLCAiU3RhbmRhcmQiKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoInVua25vd24gZW5jcnlwdGlvbiBtZXRob2QiKTsKICAgIH0KICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICAgIGNvbnN0IGFsZ29yaXRobSA9IGRpY3QuZ2V0KCJWIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0gIT09IDEgJiYgYWxnb3JpdGhtICE9PSAyICYmIGFsZ29yaXRobSAhPT0gNCAmJiBhbGdvcml0aG0gIT09IDUpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJ1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIGFsZ29yaXRobSIpOwogICAgfQogICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CiAgICBsZXQga2V5TGVuZ3RoID0gZGljdC5nZXQoIkxlbmd0aCIpOwogICAgaWYgKCFrZXlMZW5ndGgpIHsKICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7CiAgICAgICAga2V5TGVuZ3RoID0gNDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgY2ZEaWN0ID0gZGljdC5nZXQoIkNGIik7CiAgICAgICAgY29uc3Qgc3RyZWFtQ3J5cHRvTmFtZSA9IGRpY3QuZ2V0KCJTdG1GIik7CiAgICAgICAgaWYgKGNmRGljdCBpbnN0YW5jZW9mIERpY3QgJiYgc3RyZWFtQ3J5cHRvTmFtZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgY29uc3QgaGFuZGxlckRpY3QgPSBjZkRpY3QuZ2V0KHN0cmVhbUNyeXB0b05hbWUubmFtZSk7CiAgICAgICAgICBrZXlMZW5ndGggPSBoYW5kbGVyRGljdD8uZ2V0KCJMZW5ndGgiKSB8fCAxMjg7CiAgICAgICAgICBpZiAoa2V5TGVuZ3RoIDwgNDApIHsKICAgICAgICAgICAga2V5TGVuZ3RoIDw8PSAzOwogICAgICAgICAgfQogICAgICAgI
20H0KICAgICAgfQogICAgfQogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoImludmFsaWQga2V5IGxlbmd0aCIpOwogICAgfQogICAgY29uc3Qgb3duZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk8iKSksCiAgICAgIHVzZXJCeXRlcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlUiKSk7CiAgICBjb25zdCBvd25lclBhc3N3b3JkID0gb3duZXJCeXRlcy5zdWJhcnJheSgwLCAzMik7CiAgICBjb25zdCB1c2VyUGFzc3dvcmQgPSB1c2VyQnl0ZXMuc3ViYXJyYXkoMCwgMzIpOwogICAgY29uc3QgZmxhZ3MgPSBkaWN0LmdldCgiUCIpOwogICAgY29uc3QgcmV2aXNpb24gPSBkaWN0LmdldCgiUiIpOwogICAgY29uc3QgZW5jcnlwdE1ldGFkYXRhID0gKGFsZ29yaXRobSA9PT0gNCB8fCBhbGdvcml0aG0gPT09IDUpICYmIGRpY3QuZ2V0KCJFbmNyeXB0TWV0YWRhdGEiKSAhPT0gZmFsc2U7CiAgICB0aGlzLmVuY3J5cHRNZXRhZGF0YSA9IGVuY3J5cHRNZXRhZGF0YTsKICAgIGNvbnN0IGZpbGVJZEJ5dGVzID0gc3RyaW5nVG9CeXRlcyhmaWxlSWQpOwogICAgbGV0IHBhc3N3b3JkQnl0ZXM7CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgaWYgKHJldmlzaW9uID09PSA2KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHBhc3N3b3JkID0gdXRmOFN0cmluZ1RvU3RyaW5nKHBhc3N3b3JkKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIHdhcm4oIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6IFVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFzc3dvcmRCeXRlcyA9IHN0cmluZ1RvQnl0ZXMocGFzc3dvcmQpOwogICAgfQogICAgbGV0IGVuY3J5cHRpb25LZXk7CiAgICBpZiAoYWxnb3JpdGhtICE9PSA1KSB7CiAgICAgIGVuY3J5cHRpb25LZXkgPSB0aGlzLiNwcmVwYXJlS2V5RGF0YShmaWxlSWRCeXRlcywgcGFzc3dvcmRCeXRlcywgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG93bmVyVmFsaWRhdGlvblNhbHQgPSBvd25lckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IG93bmVyS2V5U2FsdCA9IG93bmVyQnl0ZXMuc3ViYXJyYXkoNDAsIDQ4KTsKICAgICAgY29uc3QgdUJ5dGVzID0gdXNlckJ5dGVzLnN1YmFycmF5KDAsIDQ4KTsKICAgICAgY29uc3QgdXNlclZhbGlkYXRpb25TYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDMyLCA0MCk7CiAgICAgIGNvbnN0IHVzZXJLZXlTYWx0ID0gdXNlckJ5dGVzLnN1YmFycmF5KDQwLCA0OCk7CiAgICAgIGNvbnN0IG93bmVyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIk9FIikpOwogICAgICBjb25zdCB1c2VyRW5jcnlwdGlvbiA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlVFIikpOwogICAgICBjb25zdCBwZXJtcyA9IHN0cmluZ1RvQnl0ZXMoZGljdC5nZXQoIlBlcm1zIikpOwogICAgICBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcyk7CiAgICB9CiAgICBpZiAoIWVuY3J5cHRpb25LZXkgJiYgIXBhc3N3b3JkKSB7CiAgICAgIHRocm93IG5ldyBQYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLCBQYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKICAgIH0gZWxzZSBpZiAoIWVuY3J5cHRpb25LZXkgJiYgcGFzc3dvcmQpIHsKICAgICAgY29uc3QgZGVjb2RlZFBhc3N3b3JkID0gdGhpcy4jZGVjb2RlVXNlclBhc3N3b3JkKHBhc3N3b3JkQnl0ZXMsIG93bmVyUGFzc3dvcmQsIHJldmlzaW9uLCBrZXlMZW5ndGgpOwogICAgICBlbmNyeXB0aW9uS2V5ID0gdGhpcy4jcHJlcGFyZUtleURhdGEoZmlsZUlkQnl0ZXMsIGRlY29kZWRQYXNzd29yZCwgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKICAgIH0KICAgIGlmICghZW5jcnlwdGlvbktleSkgewogICAgICB0aHJvdyBuZXcgUGFzc3dvcmRFeGNlcHRpb24oIkluY29ycmVjdCBQYXNzd29yZCIsIFBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7CiAgICB9CiAgICB0aGlzLmVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5OwogICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7CiAgICAgIGNvbnN0IGNmID0gZGljdC5nZXQoIkNGIik7CiAgICAgIGlmIChjZiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBjZi5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICB9CiAgICAgIHRoaXMuY2YgPSBjZjsKICAgICAgdGhpcy5zdG1mID0gZGljdC5nZXQoIlN0bUYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5zdHJmID0gZGljdC5nZXQoIlN0ckYiKSB8fCBOYW1lLmdldCgiSWRlbnRpdHkiKTsKICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldCgiRUZGIikgfHwgdGhpcy5zdG1mOwogICAgfQogIH0KICBjcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pIHsKICAgIGlmICh0aGlzLmFsZ29yaXRobSA9PT0gNCB8fCB0aGlzLmFsZ29yaXRobSA9PT0gNSkgewogICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybSh0aGlzLiNidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RyZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSksIHRoaXMuI2J1aWxkQ2lwaGVyQ29uc3RydWN0b3IodGhpcy5jZiwgdGhpcy5zdG1mLCBudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5KSk7CiAgICB9CiAgICBjb25zdCBrZXkgPSB0aGlzLiNidWlsZE9iamVjdEtleShudW0sIGdlbiwgdGhpcy5lbmNyeXB0aW9uS2V5LCBmYWxzZSk7CiAgICBjb25zdCBjaXBoZXJDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIG5ldyBBUkNGb3VyQ2lwaGVyKGtleSk7CiAgICB9OwogICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oY2lwaGVyQ29uc3RydWN0b3IsIGNpcGhlckNvbnN0cnVjdG9yKTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2RhdGFzZXRfcmVhZGVyLmpzCgoKCgpmdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKSB7CiAgdHJ5IHsKICAgIHJldHVybi
20BzdHJpbmdUb1VURjhTdHJpbmcoc3RyKTsKICB9IGNhdGNoIChleCkgewogICAgd2FybihgVVRGLTggZGVjb2RpbmcgZmFpbGVkOiAiJHtleH0iLmApOwogICAgcmV0dXJuIHN0cjsKICB9Cn0KY2xhc3MgRGF0YXNldFhNTFBhcnNlciBleHRlbmRzIFNpbXBsZVhNTFBhcnNlciB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIob3B0aW9ucyk7CiAgICB0aGlzLm5vZGUgPSBudWxsOwogIH0KICBvbkVuZEVsZW1lbnQobmFtZSkgewogICAgY29uc3Qgbm9kZSA9IHN1cGVyLm9uRW5kRWxlbWVudChuYW1lKTsKICAgIGlmIChub2RlICYmIG5hbWUgPT09ICJ4ZmE6ZGF0YXNldHMiKSB7CiAgICAgIHRoaXMubm9kZSA9IG5vZGU7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQWJvcnRpbmcgRGF0YXNldFhNTFBhcnNlci4iKTsKICAgIH0KICB9Cn0KY2xhc3MgRGF0YXNldFJlYWRlciB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgaWYgKGRhdGEuZGF0YXNldHMpIHsKICAgICAgdGhpcy5ub2RlID0gbmV3IFNpbXBsZVhNTFBhcnNlcih7CiAgICAgICAgaGFzQXR0cmlidXRlczogdHJ1ZQogICAgICB9KS5wYXJzZUZyb21TdHJpbmcoZGF0YS5kYXRhc2V0cykuZG9jdW1lbnRFbGVtZW50OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERhdGFzZXRYTUxQYXJzZXIoewogICAgICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICAgICAgfSk7CiAgICAgIHRyeSB7CiAgICAgICAgcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhWyJ4ZHA6eGRwIl0pOwogICAgICB9IGNhdGNoIHt9CiAgICAgIHRoaXMubm9kZSA9IHBhcnNlci5ub2RlOwogICAgfQogIH0KICBnZXRWYWx1ZShwYXRoKSB7CiAgICBpZiAoIXRoaXMubm9kZSB8fCAhcGF0aCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlLnNlYXJjaE5vZGUocGFyc2VYRkFQYXRoKHBhdGgpLCAwKTsKICAgIGlmICghbm9kZSkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBjb25zdCBmaXJzdCA9IG5vZGUuZmlyc3RDaGlsZDsKICAgIGlmIChmaXJzdD8ubm9kZU5hbWUgPT09ICJ2YWx1ZSIpIHsKICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGRlY29kZVN0cmluZyhjaGlsZC50ZXh0Q29udGVudCkpOwogICAgfQogICAgcmV0dXJuIGRlY29kZVN0cmluZyhub2RlLnRleHRDb250ZW50KTsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL3hyZWYuanMKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBYUmVmIHsKICAjZmlyc3RYUmVmU3RtUG9zID0gbnVsbDsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIHBkZk1hbmFnZXIpIHsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKICAgIHRoaXMuZW50cmllcyA9IFtdOwogICAgdGhpcy5feHJlZlN0bXMgPSBuZXcgU2V0KCk7CiAgICB0aGlzLl9jYWNoZU1hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3BlbmRpbmdSZWZzID0gbmV3IFJlZlNldCgpOwogICAgdGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSA9IG51bGw7CiAgICB0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0gPSBudWxsOwogICAgdGhpcy5fcGVyc2lzdGVudFJlZnNDYWNoZSA9IG51bGw7CiAgfQogIGdldE5ld1BlcnNpc3RlbnRSZWYob2JqKSB7CiAgICBpZiAodGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSA9PT0gbnVsbCkgewogICAgICB0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtID0gdGhpcy5lbnRyaWVzLmxlbmd0aCB8fCAxOwogICAgfQogICAgY29uc3QgbnVtID0gdGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSsrOwogICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgIHJldHVybiBSZWYuZ2V0KG51bSwgMCk7CiAgfQogIGdldE5ld1RlbXBvcmFyeVJlZigpIHsKICAgIGlmICh0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0gPT09IG51bGwpIHsKICAgICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gdGhpcy5lbnRyaWVzLmxlbmd0aCB8fCAxOwogICAgICBpZiAodGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSkgewogICAgICAgIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bTsgaSA8IHRoaXMuX25ld1BlcnNpc3RlbnRSZWZOdW07IGkrKykgewogICAgICAgICAgdGhpcy5fcGVyc2lzdGVudFJlZnNDYWNoZS5zZXQoaSwgdGhpcy5fY2FjaGVNYXAuZ2V0KGkpKTsKICAgICAgICAgIHRoaXMuX2NhY2hlTWFwLmRlbGV0ZShpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBSZWYuZ2V0KHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSsrLCAwKTsKICB9CiAgcmVzZXROZXdUZW1wb3JhcnlSZWYoKSB7CiAgICB0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0gPSBudWxsOwogICAgaWYgKHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUpIHsKICAgICAgZm9yIChjb25zdCBbbnVtLCBvYmpdIG9mIHRoaXMuX3BlcnNpc3RlbnRSZWZzQ2FjaGUpIHsKICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCBvYmopOwogICAgICB9CiAgICB9CiAgICB0aGlzLl9wZXJzaXN0ZW50UmVmc0NhY2hlID0gbnVsbDsKICB9CiAgc2V0U3RhcnRYUmVmKHN0YXJ0WFJlZikgewogICAgdGhpcy5zdGFydFhSZWZRdWV1ZSA9IFtzdGFydFhSZWZdOwogIH0KICBwYXJzZShyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgbGV0IHRyYWlsZXJEaWN0OwogICAgaWYgKCFyZWNvdmVyeU1vZGUpIHsKICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLnJlYWRYUmVmKCk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKCJJbmRleGluZyBhbGwgUERGIG9iamVjdHMiKTsKICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLmluZGV4T2JqZWN0cygpOwogICAgfQogICAgdHJhaWxlckRpY3QuYXNzaWduWHJlZih0aGlzKTsKICAgIHRoaXMudHJhaWxlciA9IHRyYWlsZXJEaWN0OwogICAgbGV0IGVuY3J5cHQ7CiAgICB0cnkgewogICAgICBlbmNyeXB0ID0gdHJhaWxlckRpY3QuZ2V0KCJFbmNyeXB0Iik7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgI
20HRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oYFhSZWYucGFyc2UgLSBJbnZhbGlkICJFbmNyeXB0IiByZWZlcmVuY2U6ICIke2V4fSIuYCk7CiAgICB9CiAgICBpZiAoZW5jcnlwdCBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgY29uc3QgaWRzID0gdHJhaWxlckRpY3QuZ2V0KCJJRCIpOwogICAgICBjb25zdCBmaWxlSWQgPSBpZHM/Lmxlbmd0aCA/IGlkc1swXSA6ICIiOwogICAgICBlbmNyeXB0LnN1cHByZXNzRW5jcnlwdGlvbiA9IHRydWU7CiAgICAgIHRoaXMuZW5jcnlwdCA9IG5ldyBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5KGVuY3J5cHQsIGZpbGVJZCwgdGhpcy5wZGZNYW5hZ2VyLnBhc3N3b3JkKTsKICAgIH0KICAgIGxldCByb290OwogICAgdHJ5IHsKICAgICAgcm9vdCA9IHRyYWlsZXJEaWN0LmdldCgiUm9vdCIpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICB3YXJuKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUm9vdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgfQogICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFnZXMgPSByb290LmdldCgiUGFnZXMiKTsKICAgICAgICBpZiAocGFnZXMgaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICB0aGlzLnJvb3QgPSByb290OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICAgIHdhcm4oYFhSZWYucGFyc2UgLSBJbnZhbGlkICJQYWdlcyIgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgICB9CiAgICB9CiAgICBpZiAoIXJlY292ZXJ5TW9kZSkgewogICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICB9CiAgICB0aHJvdyBuZXcgSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBSb290IHJlZmVyZW5jZS4iKTsKICB9CiAgcHJvY2Vzc1hSZWZUYWJsZShwYXJzZXIpIHsKICAgIGlmICghKCJ0YWJsZVN0YXRlIiBpbiB0aGlzKSkgewogICAgICB0aGlzLnRhYmxlU3RhdGUgPSB7CiAgICAgICAgZW50cnlOdW06IDAsCiAgICAgICAgc3RyZWFtUG9zOiBwYXJzZXIubGV4ZXIuc3RyZWFtLnBvcywKICAgICAgICBwYXJzZXJCdWYxOiBwYXJzZXIuYnVmMSwKICAgICAgICBwYXJzZXJCdWYyOiBwYXJzZXIuYnVmMgogICAgICB9OwogICAgfQogICAgY29uc3Qgb2JqID0gdGhpcy5yZWFkWFJlZlRhYmxlKHBhcnNlcik7CiAgICBpZiAoIWlzQ21kKG9iaiwgInRyYWlsZXIiKSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogY291bGQgbm90IGZpbmQgdHJhaWxlciBkaWN0aW9uYXJ5Iik7CiAgICB9CiAgICBsZXQgZGljdCA9IHBhcnNlci5nZXRPYmooKTsKICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSAmJiBkaWN0LmRpY3QpIHsKICAgICAgZGljdCA9IGRpY3QuZGljdDsKICAgIH0KICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogY291bGQgbm90IHBhcnNlIHRyYWlsZXIgZGljdGlvbmFyeSIpOwogICAgfQogICAgZGVsZXRlIHRoaXMudGFibGVTdGF0ZTsKICAgIHJldHVybiBkaWN0OwogIH0KICByZWFkWFJlZlRhYmxlKHBhcnNlcikgewogICAgY29uc3Qgc3RyZWFtID0gcGFyc2VyLmxleGVyLnN0cmVhbTsKICAgIGNvbnN0IHRhYmxlU3RhdGUgPSB0aGlzLnRhYmxlU3RhdGU7CiAgICBzdHJlYW0ucG9zID0gdGFibGVTdGF0ZS5zdHJlYW1Qb3M7CiAgICBwYXJzZXIuYnVmMSA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMTsKICAgIHBhcnNlci5idWYyID0gdGFibGVTdGF0ZS5wYXJzZXJCdWYyOwogICAgbGV0IG9iajsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICghKCJmaXJzdEVudHJ5TnVtIiBpbiB0YWJsZVN0YXRlKSB8fCAhKCJlbnRyeUNvdW50IiBpbiB0YWJsZVN0YXRlKSkgewogICAgICAgIGlmIChpc0NtZChvYmogPSBwYXJzZXIuZ2V0T2JqKCksICJ0cmFpbGVyIikpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW0gPSBvYmo7CiAgICAgICAgdGFibGVTdGF0ZS5lbn
20RyeUNvdW50ID0gcGFyc2VyLmdldE9iaigpOwogICAgICB9CiAgICAgIGxldCBmaXJzdCA9IHRhYmxlU3RhdGUuZmlyc3RFbnRyeU51bTsKICAgICAgY29uc3QgY291bnQgPSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIoY291bnQpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyIik7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IHRhYmxlU3RhdGUuZW50cnlOdW07IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSBpOwogICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxOwogICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyOwogICAgICAgIGNvbnN0IGVudHJ5ID0ge307CiAgICAgICAgZW50cnkub2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICAgIGVudHJ5LmdlbiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VyLmdldE9iaigpOwogICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ21kKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGUuY21kKSB7CiAgICAgICAgICAgIGNhc2UgImYiOgogICAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJuIjoKICAgICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZW50cnkub2Zmc2V0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5nZW4pIHx8ICEoZW50cnkuZnJlZSB8fCBlbnRyeS51bmNvbXByZXNzZWQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgZW50cnkgaW4gWFJlZiBzdWJzZWN0aW9uOiAke2ZpcnN0fSwgJHtjb3VudH1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT09IDAgJiYgZW50cnkuZnJlZSAmJiBmaXJzdCA9PT0gMSkgewogICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tpICsgZmlyc3RdKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbaSArIGZpcnN0XSA9IGVudHJ5OwogICAgICAgIH0KICAgICAgfQogICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gMDsKICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYyID0gcGFyc2VyLmJ1ZjI7CiAgICAgIGRlbGV0ZSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CiAgICAgIGRlbGV0ZSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7CiAgICB9CiAgICBpZiAodGhpcy5lbnRyaWVzWzBdICYmICF0aGlzLmVudHJpZXNbMF0uZnJlZSkgewogICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogdW5leHBlY3RlZCBmaXJzdCBvYmplY3QiKTsKICAgIH0KICAgIHJldHVybiBvYmo7CiAgfQogIHByb2Nlc3NYUmVmU3RyZWFtKHN0cmVhbSkgewogICAgaWYgKCEoInN0cmVhbVN0YXRlIiBpbiB0aGlzKSkgewogICAgICBjb25zdCB7CiAgICAgICAgZGljdCwKICAgICAgICBwb3MKICAgICAgfSA9IHN0cmVhbTsKICAgICAgY29uc3QgYnl0ZVdpZHRocyA9IGRpY3QuZ2V0KCJXIik7CiAgICAgIGNvbnN0IHJhbmdlID0gZGljdC5nZXQoIkluZGV4IikgfHwgWzAsIGRpY3QuZ2V0KCJTaXplIildOwogICAgICB0aGlzLnN0cmVhbVN0YXRlID0gewogICAgICAgIGVudHJ5UmFuZ2VzOiByYW5nZSwKICAgICAgICBieXRlV2lkdGhzLAogICAgICAgIGVudHJ5TnVtOiAwLAogICAgICAgIHN0cmVhbVBvczogcG9zCiAgICAgIH07CiAgICB9CiAgICB0aGlzLnJlYWRYUmVmU3RyZWFtKHN0cmVhbSk7CiAgICBkZWxldGUgdGhpcy5zdHJlYW1TdGF0ZTsKICAgIHJldHVybiBzdHJlYW0uZGljdDsKICB9CiAgcmVhZFhSZWZTdHJlYW0oc3RyZWFtKSB7CiAgICBjb25zdCBzdHJlYW1TdGF0ZSA9IHRoaXMuc3RyZWFtU3RhdGU7CiAgICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhdGUuc3RyZWFtUG9zOwogICAgY29uc3QgW3R5cGVGaWVsZFdpZHRoLCBvZmZzZXRGaWVsZFdpZHRoLCBnZW5lcmF0aW9uRmllbGRXaWR0aF0gPSBzdHJlYW1TdGF0ZS5ieXRlV2lkdGhzOwogICAgY29uc3QgZW50cnlSYW5nZXMgPSBzdHJlYW1TdGF0ZS5lbn
20RyeVJhbmdlczsKICAgIHdoaWxlIChlbnRyeVJhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IFtmaXJzdCwgbl0gPSBlbnRyeVJhbmdlczsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogJHtmaXJzdH0sICR7bn1gKTsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodHlwZUZpZWxkV2lkdGgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG9mZnNldEZpZWxkV2lkdGgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGdlbmVyYXRpb25GaWVsZFdpZHRoKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIGVudHJ5IGZpZWxkcyBsZW5ndGg6ICR7Zmlyc3R9LCAke259YCk7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IHN0cmVhbVN0YXRlLmVudHJ5TnVtOyBpIDwgbjsgKytpKSB7CiAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSBpOwogICAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgICAgbGV0IHR5cGUgPSAwLAogICAgICAgICAgb2Zmc2V0ID0gMCwKICAgICAgICAgIGdlbmVyYXRpb24gPSAwOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdHlwZUZpZWxkV2lkdGg7ICsraikgewogICAgICAgICAgY29uc3QgdHlwZUJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKHR5cGVCeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICd0eXBlJy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHR5cGUgPSB0eXBlIDw8IDggfCB0eXBlQnl0ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVGaWVsZFdpZHRoID09PSAwKSB7CiAgICAgICAgICB0eXBlID0gMTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvZmZzZXRGaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IG9mZnNldEJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKG9mZnNldEJ5dGUgPT09IC0xKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ29mZnNldCcuIik7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPDwgOCB8IG9mZnNldEJ5dGU7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ2VuZXJhdGlvbkZpZWxkV2lkdGg7ICsraikgewogICAgICAgICAgY29uc3QgZ2VuZXJhdGlvbkJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKGdlbmVyYXRpb25CeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdnZW5lcmF0aW9uJy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGdlbmVyYXRpb24gPSBnZW5lcmF0aW9uIDw8IDggfCBnZW5lcmF0aW9uQnl0ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZW50cnkgPSB7fTsKICAgICAgICBlbnRyeS5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgZW50cnkuZ2VuID0gZ2VuZXJhdGlvbjsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAke3R5cGV9YCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2ZpcnN0ICsgaV0pIHsKICAgICAgICAgIHRoaXMuZW50cmllc1tmaXJzdCArIGldID0gZW50cnk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gMDsKICAgICAgc3RyZWFtU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgZW50cnlSYW5nZXMuc3BsaWNlKDAsIDIpOwogICAgfQogIH0KICBpbmRleE9iamVjdHMoKSB7CiAgICBjb25zdCBUQUIgPSAweDksCiAgICAgIExGID0gMHhhLAogICAgICBDUiA9IDB4ZCwKICAgICAgU1BBQ0UgPSAweDIwOwogICAgY29uc3QgUEVSQ0VOVCA9IDB4MjUsCiAgICAgIExUID0gMHgzYzsKICAgIGZ1bmN0aW9uIHJlYWRUb2tlbihkYXRhLCBvZmZzZXQpIHsKICAgICAgbGV0IHRva2VuID0gIiIsCiAgICAgICAgY2ggPSBkYXRhW29mZnNldF0
207CiAgICAgIHdoaWxlIChjaCAhPT0gTEYgJiYgY2ggIT09IENSICYmIGNoICE9PSBMVCkgewogICAgICAgIGlmICgrK29mZnNldCA+PSBkYXRhLmxlbmd0aCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIGZ1bmN0aW9uIHNraXBVbnRpbChkYXRhLCBvZmZzZXQsIHdoYXQpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gd2hhdC5sZW5ndGgsCiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgICBsZXQgc2tpcHBlZCA9IDA7CiAgICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhTGVuZ3RoKSB7CiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGRhdGFbb2Zmc2V0ICsgaV0gPT09IHdoYXRbaV0pIHsKICAgICAgICAgICsraTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgc2tpcHBlZCsrOwogICAgICB9CiAgICAgIHJldHVybiBza2lwcGVkOwogICAgfQogICAgY29uc3QgZ0VuZG9ialJlZ0V4cCA9IC9cYihlbmRvYmp8XGQrXHMrXGQrXHMrb2JqfHhyZWZ8dHJhaWxlclxzKjw8KVxiL2c7CiAgICBjb25zdCBnU3RhcnR4cmVmUmVnRXhwID0gL1xiKHN0YXJ0eHJlZnxcZCtccytcZCtccytvYmopXGIvZzsKICAgIGNvbnN0IG9ialJlZ0V4cCA9IC9eKFxkKylccysoXGQrKVxzK29ialxiLzsKICAgIGNvbnN0IHRyYWlsZXJCeXRlcyA9IG5ldyBVaW50OEFycmF5KFsxMTYsIDExNCwgOTcsIDEwNSwgMTA4LCAxMDEsIDExNF0pOwogICAgY29uc3Qgc3RhcnR4cmVmQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE1LCAxMTYsIDk3LCAxMTQsIDExNiwgMTIwLCAxMTQsIDEwMSwgMTAyXSk7CiAgICBjb25zdCB4cmVmQnl0ZXMgPSBuZXcgVWludDhBcnJheShbNDcsIDg4LCA4MiwgMTAxLCAxMDJdKTsKICAgIHRoaXMuZW50cmllcy5sZW5ndGggPSAwOwogICAgdGhpcy5fY2FjaGVNYXAuY2xlYXIoKTsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgc3RyZWFtLnBvcyA9IDA7CiAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0uZ2V0Qnl0ZXMoKSwKICAgICAgYnVmZmVyU3RyID0gYnl0ZXNUb1N0cmluZyhidWZmZXIpLAogICAgICBsZW5ndGggPSBidWZmZXIubGVuZ3RoOwogICAgbGV0IHBvc2l0aW9uID0gc3RyZWFtLnN0YXJ0OwogICAgY29uc3QgdHJhaWxlcnMgPSBbXSwKICAgICAgeHJlZlN0bXMgPSBbXTsKICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgewogICAgICBsZXQgY2ggPSBidWZmZXJbcG9zaXRpb25dOwogICAgICBpZiAoY2ggPT09IFRBQiB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSIHx8IGNoID09PSBTUEFDRSkgewogICAgICAgICsrcG9zaXRpb247CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSBQRVJDRU5UKSB7CiAgICAgICAgZG8gewogICAgICAgICAgKytwb3NpdGlvbjsKICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjaCA9IGJ1ZmZlcltwb3NpdGlvbl07CiAgICAgICAgfSB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdG9rZW4gPSByZWFkVG9rZW4oYnVmZmVyLCBwb3NpdGlvbik7CiAgICAgIGxldCBtOwogICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgieHJlZiIpICYmICh0b2tlbi5sZW5ndGggPT09IDQgfHwgL1xzLy50ZXN0KHRva2VuWzRdKSkpIHsKICAgICAgICBwb3NpdGlvbiArPSBza2lwVW50aWwoYnVmZmVyLCBwb3NpdGlvbiwgdHJhaWxlckJ5dGVzKTsKICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICBwb3NpdGlvbiArPSBza2lwVW50aWwoYnVmZmVyLCBwb3NpdGlvbiwgc3RhcnR4cmVmQnl0ZXMpOwogICAgICB9IGVsc2UgaWYgKG0gPSBvYmpSZWdFeHAuZXhlYyh0b2tlbikpIHsKICAgICAgICBjb25zdCBudW0gPSBtWzFdIHwgMCwKICAgICAgICAgIGdlbiA9IG1bMl0gfCAwOwogICAgICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGg7CiAgICAgICAgbGV0IGNvbnRlbnRMZW5ndGgsCiAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gZmFsc2U7CiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbbnVtXSkgewogICAgICAgICAgdXBkYXRlRW50cmllcyA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVudHJpZXNbbnVtXS5nZW4gPT09IGdlbikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgICAgICAgbGV4ZXI6IG5ldyBMZXhlcihzdHJlYW0ubWFrZVN1YlN0cmVhbShzdGFydFBvcykpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgICAgICAgIHVwZGF0ZUVudHJpZXMgPSB0cnVlOwogICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUGFyc2VyRU9GRXhjZXB0aW9uKSB7CiAgICAgICAgICAgICAgd2FybihgaW5kZXhPYmplY3RzIC0tIGNoZWNraW5nIG9iamVjdCAoJHt0b2tlbn0pOiAiJHtleH0iLmApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVwZGF0ZUVudHJpZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh1cGRhdGVFbnRyaWVzKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbbnVtXSA9IHsKICAgICAgICAgICAgb2Zmc2V0OiBwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCwKICAgICAgICAgICAgZ2VuLAogICAgICAgICAgICB1bmNvbXByZXNzZWQ6IHRydWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGdFbmRvYmpSZWdFeHAubGFzdEluZGV4ID0gc3RhcnRQb3M7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBnRW5kb2JqUmVnRXhwLmV4ZWMoYnVmZmVyU3RyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IGdFbmRvYmpSZWdFeHAubGFzdEluZGV4ICsgMTsKICAgICAgICAgIGNvbnRlbn
20RMZW5ndGggPSBlbmRQb3MgLSBwb3NpdGlvbjsKICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gImVuZG9iaiIpIHsKICAgICAgICAgICAgd2FybihgaW5kZXhPYmplY3RzOiBGb3VuZCAiJHttYXRjaFsxXX0iIGluc2lkZSBvZiBhbm90aGVyICJvYmoiLCBgICsgJ2NhdXNlZCBieSBtaXNzaW5nICJlbmRvYmoiIC0tIHRyeWluZyB0byByZWNvdmVyLicpOwogICAgICAgICAgICBjb250ZW50TGVuZ3RoIC09IG1hdGNoWzFdLmxlbmd0aCArIDE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBsZW5ndGggLSBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgY29uc3QgY29udGVudCA9IGJ1ZmZlci5zdWJhcnJheShwb3NpdGlvbiwgcG9zaXRpb24gKyBjb250ZW50TGVuZ3RoKTsKICAgICAgICBjb25zdCB4cmVmVGFnT2Zmc2V0ID0gc2tpcFVudGlsKGNvbnRlbnQsIDAsIHhyZWZCeXRlcyk7CiAgICAgICAgaWYgKHhyZWZUYWdPZmZzZXQgPCBjb250ZW50TGVuZ3RoICYmIGNvbnRlbnRbeHJlZlRhZ09mZnNldCArIDVdIDwgNjQpIHsKICAgICAgICAgIHhyZWZTdG1zLnB1c2gocG9zaXRpb24gLSBzdHJlYW0uc3RhcnQpOwogICAgICAgICAgdGhpcy5feHJlZlN0bXMuYWRkKHBvc2l0aW9uIC0gc3RyZWFtLnN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb24gKz0gY29udGVudExlbmd0aDsKICAgICAgfSBlbHNlIGlmICh0b2tlbi5zdGFydHNXaXRoKCJ0cmFpbGVyIikgJiYgKHRva2VuLmxlbmd0aCA9PT0gNyB8fCAvXHMvLnRlc3QodG9rZW5bN10pKSkgewogICAgICAgIHRyYWlsZXJzLnB1c2gocG9zaXRpb24pOwogICAgICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGg7CiAgICAgICAgbGV0IGNvbnRlbnRMZW5ndGg7CiAgICAgICAgZ1N0YXJ0eHJlZlJlZ0V4cC5sYXN0SW5kZXggPSBzdGFydFBvczsKICAgICAgICBjb25zdCBtYXRjaCA9IGdTdGFydHhyZWZSZWdFeHAuZXhlYyhidWZmZXJTdHIpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgY29uc3QgZW5kUG9zID0gZ1N0YXJ0eHJlZlJlZ0V4cC5sYXN0SW5kZXggKyAxOwogICAgICAgICAgY29udGVudExlbmd0aCA9IGVuZFBvcyAtIHBvc2l0aW9uOwogICAgICAgICAgaWYgKG1hdGNoWzFdICE9PSAic3RhcnR4cmVmIikgewogICAgICAgICAgICB3YXJuKGBpbmRleE9iamVjdHM6IEZvdW5kICIke21hdGNoWzFdfSIgYWZ0ZXIgInRyYWlsZXIiLCBgICsgJ2NhdXNlZCBieSBtaXNzaW5nICJzdGFydHhyZWYiIC0tIHRyeWluZyB0byByZWNvdmVyLicpOwogICAgICAgICAgICBjb250ZW50TGVuZ3RoIC09IG1hdGNoWzFdLmxlbmd0aCArIDE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBsZW5ndGggLSBwb3NpdGlvbjsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb24gKz0gY29udGVudExlbmd0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NpdGlvbiArPSB0b2tlbi5sZW5ndGggKyAxOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IHhyZWZTdG0gb2YgeHJlZlN0bXMpIHsKICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKHhyZWZTdG0pOwogICAgICB0aGlzLnJlYWRYUmVmKHRydWUpOwogICAgfQogICAgY29uc3QgdHJhaWxlckRpY3RzID0gW107CiAgICBsZXQgaXNFbmNyeXB0ZWQgPSBmYWxzZTsKICAgIGZvciAoY29uc3QgdHJhaWxlciBvZiB0cmFpbGVycykgewogICAgICBzdHJlYW0ucG9zID0gdHJhaWxlcjsKICAgICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgICAgbGV4ZXI6IG5ldyBMZXhlcihzdHJlYW0pLAogICAgICAgIHhyZWY6IHRoaXMsCiAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlLAogICAgICAgIHJlY292ZXJ5TW9kZTogdHJ1ZQogICAgICB9KTsKICAgICAgY29uc3Qgb2JqID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIWlzQ21kKG9iaiwgInRyYWlsZXIiKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRyYWlsZXJEaWN0cy5wdXNoKGRpY3QpOwogICAgICBpZiAoZGljdC5oYXMoIkVuY3J5cHQiKSkgewogICAgICAgIGlzRW5jcnlwdGVkID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgbGV0IHRyYWlsZXJEaWN0LCB0cmFpbGVyRXJyb3I7CiAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgWy4uLnRyYWlsZXJEaWN0cywgImdlbkZhbGxiYWNrIiwgLi4udHJhaWxlckRpY3RzXSkgewogICAgICBpZiAoZGljdCA9PT0gImdlbkZhbGxiYWNrIikgewogICAgICAgIGlmICghdHJhaWxlckVycm9yKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZ2VuZXJhdGlvbkZhbGxiYWNrID0gdHJ1ZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgdmFsaWRQYWdlc0RpY3QgPSBmYWxzZTsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCByb290RGljdCA9IGRpY3QuZ2V0KCJSb290Iik7CiAgICAgICAgaWYgKCEocm9vdERpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhZ2VzRGljdCA9IHJvb3REaWN0LmdldCgiUGFnZXMiKTsKICAgICAgICBpZiAoIShwYWdlc0RpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhZ2VzQ291bnQgPSBwYWdlc0RpY3QuZ2V0KCJDb3VudCIpOwogICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VzQ291bnQpKSB7CiAgICAgICAgICB2YWxpZFBhZ2VzRGljdCA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHRyYWlsZXJFcnJvciA9IGV4OwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh2YWxpZFBhZ2VzRGljdCAmJiAoIWlzRW5jcnlwdGVkIHx8IGRpY3QuaGFzKCJFbmNyeXB0IikpICYmIGRpY3QuaGFzKCJJRCIpKSB7CiAgICAgICAgcmV0dXJuIGRpY3Q7CiAgICAgI
20H0KICAgICAgdHJhaWxlckRpY3QgPSBkaWN0OwogICAgfQogICAgaWYgKHRyYWlsZXJEaWN0KSB7CiAgICAgIHJldHVybiB0cmFpbGVyRGljdDsKICAgIH0KICAgIGlmICh0aGlzLnRvcERpY3QpIHsKICAgICAgcmV0dXJuIHRoaXMudG9wRGljdDsKICAgIH0KICAgIGlmICghdHJhaWxlckRpY3RzLmxlbmd0aCkgewogICAgICBmb3IgKGNvbnN0IFtudW0sIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7CiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlZiA9IFJlZi5nZXQobnVtLCBlbnRyeS5nZW4pOwogICAgICAgIGxldCBvYmo7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9iaiA9IHRoaXMuZmV0Y2gocmVmKTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICAgICAgb2JqID0gb2JqLmRpY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0ICYmIG9iai5oYXMoIlJvb3QiKSkgewogICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFBERiBzdHJ1Y3R1cmUuIik7CiAgfQogIHJlYWRYUmVmKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKICAgIGNvbnN0IHN0YXJ0WFJlZlBhcnNlZENhY2hlID0gbmV3IFNldCgpOwogICAgd2hpbGUgKHRoaXMuc3RhcnRYUmVmUXVldWUubGVuZ3RoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgc3RhcnRYUmVmID0gdGhpcy5zdGFydFhSZWZRdWV1ZVswXTsKICAgICAgICBpZiAoc3RhcnRYUmVmUGFyc2VkQ2FjaGUuaGFzKHN0YXJ0WFJlZikpIHsKICAgICAgICAgIHdhcm4oInJlYWRYUmVmIC0gc2tpcHBpbmcgWFJlZiB0YWJsZSBzaW5jZSBpdCB3YXMgYWxyZWFkeSBwYXJzZWQuIik7CiAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgc3RhcnRYUmVmUGFyc2VkQ2FjaGUuYWRkKHN0YXJ0WFJlZik7CiAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXJ0WFJlZiArIHN0cmVhbS5zdGFydDsKICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHsKICAgICAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgICAgIHhyZWY6IHRoaXMsCiAgICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUKICAgICAgICB9KTsKICAgICAgICBsZXQgb2JqID0gcGFyc2VyLmdldE9iaigpOwogICAgICAgIGxldCBkaWN0OwogICAgICAgIGlmIChpc0NtZChvYmosICJ4cmVmIikpIHsKICAgICAgICAgIGRpY3QgPSB0aGlzLnByb2Nlc3NYUmVmVGFibGUocGFyc2VyKTsKICAgICAgICAgIGlmICghdGhpcy50b3BEaWN0KSB7CiAgICAgICAgICAgIHRoaXMudG9wRGljdCA9IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBvYmogPSBkaWN0LmdldCgiWFJlZlN0bSIpOwogICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSAmJiAhdGhpcy5feHJlZlN0bXMuaGFzKG9iaikpIHsKICAgICAgICAgICAgdGhpcy5feHJlZlN0bXMuYWRkKG9iaik7CiAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmopOwogICAgICAgICAgICB0aGlzLiNmaXJzdFhSZWZTdG1Qb3MgPz89IG9iajsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlci5nZXRPYmooKSkgfHwgIWlzQ21kKHBhcnNlci5nZXRPYmooKSwgIm9iaiIpIHx8ICEoKG9iaiA9IHBhcnNlci5nZXRPYmooKSkgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0iKTsKICAgICAgICAgIH0KICAgICAgICAgIGRpY3QgPSB0aGlzLnByb2Nlc3NYUmVmU3RyZWFtKG9iaik7CiAgICAgICAgICBpZiAoIXRoaXMudG9wRGljdCkgewogICAgICAgICAgICB0aGlzLnRvcERpY3QgPSBkaWN0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFkaWN0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiRmFpbGVkIHRvIHJlYWQgWFJlZiBzdHJlYW0iKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgc3RyZWFtIGhlYWRlciIpOwogICAgICAgIH0KICAgICAgICBvYmogPSBkaWN0LmdldCgiUHJldiIpOwogICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmopOwogICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVmKSB7CiAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnB1c2gob2JqLm51bSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgaW5mbygiKHdoaWxlIHJlYWRpbmcgWFJlZik6ICIgKyBlKTsKICAgICAgfQogICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCk7CiAgICB9CiAgICBpZiAodGhpcy50b3BEaWN0KSB7CiAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7CiAgICB9CiAgICBpZiAocmVjb3ZlcnlNb2RlKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgfQogIGdldCBsYXN0WFJlZlN0cmVhbVBvcygpIHsKICAgIHJldHVybiB0aGlzLiNmaXJzdFhSZWZTdG1Qb3MgPz8gKHRoaXMuX3hyZWZTdG1zLnNpemUgPiAwID8gTWF0aC5tYXgoLi4udGh
20pcy5feHJlZlN0bXMpIDogbnVsbCk7CiAgfQogIGdldEVudHJ5KGkpIHsKICAgIGNvbnN0IHhyZWZFbnRyeSA9IHRoaXMuZW50cmllc1tpXTsKICAgIGlmICh4cmVmRW50cnkgJiYgIXhyZWZFbnRyeS5mcmVlICYmIHhyZWZFbnRyeS5vZmZzZXQpIHsKICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBmZXRjaElmUmVmKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgcmV0dXJuIHRoaXMuZmV0Y2gob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIG9iajsKICB9CiAgZmV0Y2gocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZSkgewogICAgaWYgKCEocmVmIGluc3RhbmNlb2YgUmVmKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoInJlZiBvYmplY3QgaXMgbm90IGEgcmVmZXJlbmNlIik7CiAgICB9CiAgICBjb25zdCBudW0gPSByZWYubnVtOwogICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuX2NhY2hlTWFwLmdldChudW0pOwogICAgaWYgKGNhY2hlRW50cnkgIT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoY2FjaGVFbnRyeSBpbnN0YW5jZW9mIERpY3QgJiYgIWNhY2hlRW50cnkub2JqSWQpIHsKICAgICAgICBjYWNoZUVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNhY2hlRW50cnk7CiAgICB9CiAgICBsZXQgeHJlZkVudHJ5ID0gdGhpcy5nZXRFbnRyeShudW0pOwogICAgaWYgKHhyZWZFbnRyeSA9PT0gbnVsbCkgewogICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCB4cmVmRW50cnkpOwogICAgICByZXR1cm4geHJlZkVudHJ5OwogICAgfQogICAgaWYgKHRoaXMuX3BlbmRpbmdSZWZzLmhhcyhyZWYpKSB7CiAgICAgIHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShyZWYpOwogICAgICB3YXJuKGBJZ25vcmluZyBjaXJjdWxhciByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgcmV0dXJuIENJUkNVTEFSX1JFRjsKICAgIH0KICAgIHRoaXMuX3BlbmRpbmdSZWZzLnB1dChyZWYpOwogICAgdHJ5IHsKICAgICAgeHJlZkVudHJ5ID0geHJlZkVudHJ5LnVuY29tcHJlc3NlZCA/IHRoaXMuZmV0Y2hVbmNvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbikgOiB0aGlzLmZldGNoQ29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgICAgdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKHJlZik7CiAgICB9IGNhdGNoIChleCkgewogICAgICB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUocmVmKTsKICAgICAgdGhyb3cgZXg7CiAgICB9CiAgICBpZiAoeHJlZkVudHJ5IGluc3RhbmNlb2YgRGljdCkgewogICAgICB4cmVmRW50cnkub2JqSWQgPSByZWYudG9TdHJpbmcoKTsKICAgIH0gZWxzZSBpZiAoeHJlZkVudHJ5IGluc3RhbmNlb2YgQmFzZVN0cmVhbSkgewogICAgICB4cmVmRW50cnkuZGljdC5vYmpJZCA9IHJlZi50b1N0cmluZygpOwogICAgfQogICAgcmV0dXJuIHhyZWZFbnRyeTsKICB9CiAgZmV0Y2hVbmNvbXByZXNzZWQocmVmLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBjb25zdCBnZW4gPSByZWYuZ2VuOwogICAgbGV0IG51bSA9IHJlZi5udW07CiAgICBpZiAoeHJlZkVudHJ5LmdlbiAhPT0gZ2VuKSB7CiAgICAgIGNvbnN0IG1zZyA9IGBJbmNvbnNpc3RlbnQgZ2VuZXJhdGlvbiBpbiBYUmVmOiAke3JlZn1gOwogICAgICBpZiAodGhpcy5fZ2VuZXJhdGlvbkZhbGxiYWNrICYmIHhyZWZFbnRyeS5nZW4gPCBnZW4pIHsKICAgICAgICB3YXJuKG1zZyk7CiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hVbmNvbXByZXNzZWQoUmVmLmdldChudW0sIHhyZWZFbnRyeS5nZW4pLCB4cmVmRW50cnksIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihtc2cpOwogICAgfQogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW0ubWFrZVN1YlN0cmVhbSh4cmVmRW50cnkub2Zmc2V0ICsgdGhpcy5zdHJlYW0uc3RhcnQpOwogICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgeHJlZjogdGhpcywKICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IG9iajEgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBvYmoyID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3Qgb2JqMyA9IHBhcnNlci5nZXRPYmooKTsKICAgIGlmIChvYmoxICE9PSBudW0gfHwgb2JqMiAhPT0gZ2VuIHx8ICEob2JqMyBpbnN0YW5jZW9mIENtZCkpIHsKICAgICAgdGhyb3cgbmV3IFhSZWZFbnRyeUV4Y2VwdGlvbihgQmFkICh1bmNvbXByZXNzZWQpIFhSZWYgZW50cnk6ICR7cmVmfWApOwogICAgfQogICAgaWYgKG9iajMuY21kICE9PSAib2JqIikgewogICAgICBpZiAob2JqMy5jbWQuc3RhcnRzV2l0aCgib2JqIikpIHsKICAgICAgICBudW0gPSBwYXJzZUludChvYmozLmNtZC5zdWJzdHJpbmcoMyksIDEwKTsKICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW0pKSB7CiAgICAgICAgICByZXR1cm4gbnVtOwogICAgICAgIH0KICAgICAgfQogICAgICB0aHJvdyBuZXcgWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtyZWZ9YCk7CiAgICB9CiAgICB4cmVmRW50cnkgPSB0aGlzLmVuY3J5cHQgJiYgIXN1cHByZXNzRW5jcnlwdGlvbiA/IHBhcnNlci5nZXRPYmoodGhpcy5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShudW0sIGdlbikpIDogcGFyc2VyLmdldE9iaigpOwogICAgaWYgKCEoeHJlZkVudHJ5IGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgeHJlZkVudHJ5KTsKICAgIH0KICAgIHJldHVybiB4cmVmRW50cnk7CiAgfQogIGZldGNoQ29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGNvbnN0IHRhYmxlT2Zmc2V0ID0geHJlZkVudHJ5Lm9mZnNldDsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuZmV0Y2goUmVmLmdldCh0YWJsZU9mZnNldCwgMCkpOwogICAgaWYgKCEoc3RyZWFtIGluc3RhbmNlb2YgQmFzZVN0cmVhbSkpIHsKICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJiYWQgT2JqU3RtIHN0cmVhbSIpOwogICAgfQogICAgY29uc3QgZmlyc3QgPSBzdHJlYW0uZGljdC5nZXQoIkZpcnN0Iik7CiAgICBjb25zdCBuID0gc3RyZWFtLmRpY3QuZ2V0KCJOIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7CiAgICAgI
20HRocm93IG5ldyBGb3JtYXRFcnJvcigiaW52YWxpZCBmaXJzdCBhbmQgbiBwYXJhbWV0ZXJzIGZvciBPYmpTdG0gc3RyZWFtIik7CiAgICB9CiAgICBsZXQgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgeHJlZjogdGhpcywKICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IG51bXMgPSBuZXcgQXJyYXkobik7CiAgICBjb25zdCBvZmZzZXRzID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgY29uc3QgbnVtID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3QgbnVtYmVyIGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke251bX1gKTsKICAgICAgfQogICAgICBjb25zdCBvZmZzZXQgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihvZmZzZXQpKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKGBpbnZhbGlkIG9iamVjdCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW06ICR7b2Zmc2V0fWApOwogICAgICB9CiAgICAgIG51bXNbaV0gPSBudW07CiAgICAgIG9mZnNldHNbaV0gPSBvZmZzZXQ7CiAgICB9CiAgICBjb25zdCBzdGFydCA9IChzdHJlYW0uc3RhcnQgfHwgMCkgKyBmaXJzdDsKICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBjb25zdCBsZW5ndGggPSBpIDwgbiAtIDEgPyBvZmZzZXRzW2kgKyAxXSAtIG9mZnNldHNbaV0gOiB1bmRlZmluZWQ7CiAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJJbnZhbGlkIG9mZnNldCBpbiB0aGUgT2JqU3RtIHN0cmVhbS4iKTsKICAgICAgfQogICAgICBwYXJzZXIgPSBuZXcgUGFyc2VyKHsKICAgICAgICBsZXhlcjogbmV3IExleGVyKHN0cmVhbS5tYWtlU3ViU3RyZWFtKHN0YXJ0ICsgb2Zmc2V0c1tpXSwgbGVuZ3RoLCBzdHJlYW0uZGljdCkpLAogICAgICAgIHhyZWY6IHRoaXMsCiAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICAgIH0pOwogICAgICBjb25zdCBvYmogPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGVudHJpZXNbaV0gPSBvYmo7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgbnVtID0gbnVtc1tpXSwKICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tudW1dOwogICAgICBpZiAoZW50cnkgJiYgZW50cnkub2Zmc2V0ID09PSB0YWJsZU9mZnNldCAmJiBlbn
20RyeS5nZW4gPT09IGkpIHsKICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCBvYmopOwogICAgICB9CiAgICB9CiAgICB4cmVmRW50cnkgPSBlbnRyaWVzW3hyZWZFbnRyeS5nZW5dOwogICAgaWYgKHhyZWZFbnRyeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRocm93IG5ldyBYUmVmRW50cnlFeGNlcHRpb24oYEJhZCAoY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtyZWZ9YCk7CiAgICB9CiAgICByZXR1cm4geHJlZkVudHJ5OwogIH0KICBhc3luYyBmZXRjaElmUmVmQXN5bmMob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pIHsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBc3luYyhvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBhc3luYyBmZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gdGhpcy5mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIShleCBpbnN0YW5jZW9mIE1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMucGRmTWFuYWdlci5yZXF1ZXN0UmFuZ2UoZXguYmVnaW4sIGV4LmVuZCk7CiAgICAgIHJldHVybiB0aGlzLmZldGNoQXN5bmMocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogIH0KICBnZXRDYXRhbG9nT2JqKCkgewogICAgcmV0dXJuIHRoaXMucm9vdDsKICB9Cn0KCjsvLyAuL3NyYy9jb3JlL2RvY3VtZW50LmpzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjb25zdCBMRVRURVJfU0laRV9NRURJQUJPWCA9IFswLCAwLCA2MTIsIDc5Ml07CmNsYXNzIFBhZ2UgewogIGNvbnN0cnVjdG9yKHsKICAgIHBkZk1hbmFnZXIsCiAgICB4cmVmLAogICAgcGFnZUluZGV4LAogICAgcGFnZURpY3QsCiAgICByZWYsCiAgICBnbG9iYWxJZEZhY3RvcnksCiAgICBmb250Q2FjaGUsCiAgICBidWlsdEluQ01hcENhY2hlLAogICAgc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgZ2xvYmFsSW1hZ2VDYWNoZSwKICAgIHN5c3RlbUZvbnRDYWNoZSwKICAgIG5vbkJsZW5kTW9kZXNTZXQsCiAgICB4ZmFGYWN0b3J5CiAgfSkgewogICAgdGhpcy5wZGZNYW5hZ2VyID0gcGRmTWFuYWdlcjsKICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwogICAgdGhpcy5wYWdlRGljdCA9IHBhZ2VEaWN0OwogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMucmVmID0gcmVmOwogICAgdGhpcy5mb250Q2FjaGUgPSBmb250Q2FjaGU7CiAgICB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUgPSBidWlsdEluQ01hcENhY2hlOwogICAgdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUgPSBzdGFuZGFyZEZvbnREYXRhQ2FjaGU7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBnbG9iYWxJbWFnZUNhY2hlOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUgPSBzeXN0ZW1Gb250Q2FjaGU7CiAgICB0aGlzLm5vbkJsZW5kTW9kZXNTZXQgPSBub25CbGVuZE1vZGVzU2V0OwogICAgdGhpcy5ldmFsdWF0b3JPcHRpb25zID0gcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gbnVsbDsKICAgIHRoaXMueGZhRmFjdG9yeSA9IHhmYUZhY3Rvcnk7CiAgICBjb25zdCBpZENvdW50ZXJzID0gewogICAgICBvYmo6IDAKICAgIH07CiAgICB0aGlzLl9sb2NhbElkRmFjdG9yeSA9IGNsYXNzIGV4dGVuZHMgZ2xvYmFsSWRGYWN0b3J5IHsKICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cGFnZUluZGV4fV8keysraWRDb3VudGVycy5vYmp9YDsKICAgICAgfQogICAgICBzdGF0aWMgZ2V0UGFnZU9iaklkKCkgewogICAgICAgIHJldHVybiBgcCR7cmVmLnRvU3RyaW5nKCl9YDsKICAgICAgfQogICAgfTsKICB9CiAgX2dldEluaGVyaXRhYmxlUHJvcGVydHkoa2V5LCBnZXRBcnJheSA9IGZhbHNlKSB7CiAgICBjb25zdCB2YWx1ZSA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgICBkaWN0OiB0aGlzLnBhZ2VEaWN0LAogICAgICBrZXksCiAgICAgIGdldEFycmF5LAogICAgICBzdG9wV2hlbkZvdW5kOiBmYWxzZQogICAgfSk7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEgfHwgISh2YWx1ZVswXSBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgIHJldHVybiB2YWx1ZVswXTsKICAgIH0KICAgIHJldHVybiBEaWN0Lm1lcmdlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBkaWN0QXJyYXk6IHZhbHVlCiAgICB9KTsKICB9CiAgZ2V0IGNvbnRlbnQoKSB7CiAgICByZXR1cm4gdGhpcy5wYWdlRGljdC5nZXRBcnJheSgiQ29udGVudHMiKTsKICB9CiAgZ2V0IHJlc291cmNlcygpIHsKICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJlc291cmNlcyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicmVzb3VyY2VzIiwgcmVzb3VyY2VzIGluc3RhbmNlb2YgRGljdCA/IHJlc291cmNlcyA6IERpY3QuZW1wdHkpOwogIH0KICBfZ2V0Qm91bmRpbmdCb3gobmFtZSkgewogICAgaWYgKHRoaXMueGZhRGF0YSkgewogICAgICByZXR1cm4gdGhpcy54ZmFEYXRhLmJib3g7CiAgICB9CiAgICBjb25zdCBib3ggPSBsb29rdXBOb3JtYWxSZWN0KHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkobmFtZSwgdHJ1ZSksIG51bGwpOwogICAgaWYgKGJveCkgewogICAgICBpZiAoYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIGJveDsKICAgICAgfQogICAgICB3YXJuKGBFbXB0eSwgb3IgaW52YWxpZCwgLyR7bmFtZX0gZW50cnkuYCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IG1lZGlhQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAibWVkaWFCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiTWVkaWFCb3giKSB8fCBMRVRURVJfU0laRV9NRURJQUJPWCk7CiAgfQogIGdldCBjcm9wQm94KCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCA
20iY3JvcEJveCIsIHRoaXMuX2dldEJvdW5kaW5nQm94KCJDcm9wQm94IikgfHwgdGhpcy5tZWRpYUJveCk7CiAgfQogIGdldCB1c2VyVW5pdCgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMucGFnZURpY3QuZ2V0KCJVc2VyVW5pdCIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidXNlclVuaXQiLCB0eXBlb2Ygb2JqID09PSAibnVtYmVyIiAmJiBvYmogPiAwID8gb2JqIDogMS4wKTsKICB9CiAgZ2V0IHZpZXcoKSB7CiAgICBjb25zdCB7CiAgICAgIGNyb3BCb3gsCiAgICAgIG1lZGlhQm94CiAgICB9ID0gdGhpczsKICAgIGlmIChjcm9wQm94ICE9PSBtZWRpYUJveCAmJiAhaXNBcnJheUVxdWFsKGNyb3BCb3gsIG1lZGlhQm94KSkgewogICAgICBjb25zdCBib3ggPSBVdGlsLmludGVyc2VjdChjcm9wQm94LCBtZWRpYUJveCk7CiAgICAgIGlmIChib3ggJiYgYm94WzJdIC0gYm94WzBdID4gMCAmJiBib3hbM10gLSBib3hbMV0gPiAwKSB7CiAgICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAidmlldyIsIGJveCk7CiAgICAgIH0KICAgICAgd2FybigiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ2aWV3IiwgbWVkaWFCb3gpOwogIH0KICBnZXQgcm90YXRlKCkgewogICAgbGV0IHJvdGF0ZSA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIlJvdGF0ZSIpIHx8IDA7CiAgICBpZiAocm90YXRlICUgOTAgIT09IDApIHsKICAgICAgcm90YXRlID0gMDsKICAgIH0gZWxzZSBpZiAocm90YXRlID49IDM2MCkgewogICAgICByb3RhdGUgJT0gMzYwOwogICAgfSBlbHNlIGlmIChyb3RhdGUgPCAwKSB7CiAgICAgIHJvdGF0ZSA9IChyb3RhdGUgJSAzNjAgKyAzNjApICUgMzYwOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAicm90YXRlIiwgcm90YXRlKTsKICB9CiAgX29uU3ViU3RyZWFtRXJyb3IocmVhc29uLCBvYmpJZCkgewogICAgaWYgKHRoaXMuZXZhbHVhdG9yT3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgd2FybihgZ2V0Q29udGVudFN0cmVhbSAtIGlnbm9yaW5nIHN1Yi1zdHJlYW0gKCR7b2JqSWR9KTogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IHJlYXNvbjsKICB9CiAgZ2V0Q29udGVudFN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJjb250ZW50IikudGhlbihjb250ZW50ID0+IHsKICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgIH0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHsKICAgICAgICByZXR1cm4gbmV3IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbShjb250ZW50LCB0aGlzLl9vblN1YlN0cmVhbUVycm9yLmJpbmQodGhpcykpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgTnVsbFN0cmVhbSgpOwogICAgfSk7CiAgfQogIGdldCB4ZmFEYXRhKCkgewogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YSIsIHRoaXMueGZhRmFjdG9yeSA/IHsKICAgICAgYmJveDogdGhpcy54ZmFGYWN0b3J5LmdldEJvdW5kaW5nQm94KHRoaXMucGFnZUluZGV4KQogICAgfSA6IG51bGwpOwogIH0KICBhc3luYyAjcmVwbGFjZUlkQnlSZWYoYW5ub3RhdGlvbnMsIGRlbGV0ZWRBbm5vdGF0aW9ucywgZXhpc3RpbmdBbm5vdGF0aW9ucykgewogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBpZiAoYW5ub3RhdGlvbi5pZCkgewogICAgICAgIGNvbnN0IHJlZiA9IFJlZi5mcm9tU3RyaW5nKGFubm90YXRpb24uaWQpOwogICAgICAgIGlmICghcmVmKSB7CiAgICAgICAgICB3YXJuKGBBIG5vbi1saW5rZWQgYW5ub3RhdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQ6ICR7YW5ub3RhdGlvbi5pZH1gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbi5kZWxldGVkKSB7CiAgICAgICAgICBkZWxldGVkQW5ub3RhdGlvbnMucHV0KHJlZiwgcmVmKTsKICAgICAgICAgIGlmIChhbm5vdGF0aW9uLnBvcHVwUmVmKSB7CiAgICAgICAgICAgIGNvbnN0IHBvcHVwUmVmID0gUmVmLmZyb21TdHJpbmcoYW5ub3RhdGlvbi5wb3B1cFJlZik7CiAgICAgICAgICAgIGlmIChwb3B1cFJlZikgewogICAgICAgICAgICAgIGRlbGV0ZWRBbm5vdGF0aW9ucy5wdXQocG9wdXBSZWYsIHBvcHVwUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGV4aXN0aW5nQW5ub3RhdGlvbnM/LnB1dChyZWYpOwogICAgICAgIGFubm90YXRpb24ucmVmID0gcmVmOwogICAgICAgIHByb21pc2VzLnB1c2godGhpcy54cmVmLmZldGNoQXN5bmMocmVmKS50aGVuKG9iaiA9PiB7CiAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGljdCkgewogICAgICAgICAgICBhbm5vdGF0aW9uLm9sZEFubm90YXRpb24gPSBvYmouY2xvbmUoKTsKICAgICAgICAgIH0KICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICB3YXJuKGBDYW5ub3QgZmV0Y2ggXGBvbGRBbm5vdGF0aW9uXGAgZm9yOiAke3JlZn0uYCk7CiAgICAgICAgfSkpOwogICAgICAgIGRlbGV0ZSBhbm5vdGF0aW9uLmlkOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQogIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykgewogICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlhGQTogQ2Fubm90IHNhdmUgbmV3IGFubm90YXRpb25zLiIpOwogICAgfQogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBQYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgI
20HN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IGRlbGV0ZWRBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXRDYWNoZSgpOwogICAgY29uc3QgZXhpc3RpbmdBbm5vdGF0aW9ucyA9IG5ldyBSZWZTZXQoKTsKICAgIGF3YWl0IHRoaXMuI3JlcGxhY2VJZEJ5UmVmKGFubm90YXRpb25zLCBkZWxldGVkQW5ub3RhdGlvbnMsIGV4aXN0aW5nQW5ub3RhdGlvbnMpOwogICAgY29uc3QgcGFnZURpY3QgPSB0aGlzLnBhZ2VEaWN0OwogICAgY29uc3QgYW5ub3RhdGlvbnNBcnJheSA9IHRoaXMuYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhIGluc3RhbmNlb2YgUmVmICYmIGRlbGV0ZWRBbm5vdGF0aW9ucy5oYXMoYSkpKTsKICAgIGNvbnN0IG5ld0RhdGEgPSBhd2FpdCBBbm5vdGF0aW9uRmFjdG9yeS5zYXZlTmV3QW5ub3RhdGlvbnMocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMsIGltYWdlUHJvbWlzZXMsIGNoYW5nZXMpOwogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZgogICAgfSBvZiBuZXdEYXRhLmFubm90YXRpb25zKSB7CiAgICAgIGlmIChyZWYgaW5zdGFuY2VvZiBSZWYgJiYgIWV4aXN0aW5nQW5ub3RhdGlvbnMuaGFzKHJlZikpIHsKICAgICAgICBhbm5vdGF0aW9uc0FycmF5LnB1c2gocmVmKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IHBhZ2VEaWN0LmNsb25lKCk7CiAgICBkaWN0LnNldCgiQW5ub3RzIiwgYW5ub3RhdGlvbnNBcnJheSk7CiAgICBjaGFuZ2VzLnB1dCh0aGlzLnJlZiwgewogICAgICBkYXRhOiBkaWN0CiAgICB9KTsKICAgIGZvciAoY29uc3QgZGVsZXRlZFJlZiBvZiBkZWxldGVkQW5ub3RhdGlvbnMpIHsKICAgICAgY2hhbmdlcy5wdXQoZGVsZXRlZFJlZiwgewogICAgICAgIGRhdGE6IG51bGwKICAgICAgfSk7CiAgICB9CiAgfQogIHNhdmUoaGFuZGxlciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgfSk7CiAgICByZXR1cm4gdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHsKICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgICAgcHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UsIGNoYW5nZXMpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIHdhcm4oInNhdmUgLSBpZ25vcmluZyBhbm5vdGF0aW9uIGRhdGEgZHVyaW5nICIgKyBgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTsKICAgIH0pOwogIH0KICBsb2FkUmVzb3VyY2VzKGtleXMpIHsKICAgIHRoaXMucmVzb3VyY2VzUHJvbWlzZSB8fD0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAicmVzb3VyY2VzIik7CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICBjb25zdCBvYmplY3RMb2FkZXIgPSBuZXcgT2JqZWN0TG9hZGVyKHRoaXMucmVzb3VyY2VzLCBrZXlzLCB0aGlzLnhyZWYpOwogICAgICByZXR1cm4gb2JqZWN0TG9hZGVyLmxvYWQoKTsKICAgIH0pOwogIH0KICBnZXRPcGVyYXRvckxpc3QoewogICAgaGFuZGxlciwKICAgIHNpbmssCiAgICB0YXNrLAogICAgaW50ZW50LAogICAgY2FjaGVLZXksCiAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsCiAgICBtb2RpZmllZElkcyA9IG51bGwKICB9KSB7CiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpOwogICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkNvbG9yU3BhY2UiLCAiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUGF0dGVybiIsICJQcm9wZXJ0aWVzIiwgIlNoYWRpbmciLCAiWE9iamVjdCJdKTsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBuZXdBbm5vdHNCeVBhZ2UgPSAhdGhpcy54ZmFGYWN0b3J5ID8gZ2V0TmV3QW5ub3RhdGlvbnNNYXAoYW5ub3RhdGlvblN0b3JhZ2UpIDogbnVsbDsKICAgIGNvbnN0IG5ld0Fubm90cyA9IG5ld0Fubm90c0J5UGFnZT8uZ2V0KHRoaXMucGFnZUluZGV4KTsKICAgIGxldCBuZXdBbm5vdGF0aW9uc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICBsZXQgZGVsZXRlZEFubm9
200YXRpb25zID0gbnVsbDsKICAgIGlmIChuZXdBbm5vdHMpIHsKICAgICAgY29uc3QgYW5ub3RhdGlvbkdsb2JhbHNQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiYW5ub3RhdGlvbkdsb2JhbHMiKTsKICAgICAgbGV0IGltYWdlUHJvbWlzZXM7CiAgICAgIGNvbnN0IG1pc3NpbmdCaXRtYXBzID0gbmV3IFNldCgpOwogICAgICBmb3IgKGNvbnN0IHsKICAgICAgICBiaXRtYXBJZCwKICAgICAgICBiaXRtYXAKICAgICAgfSBvZiBuZXdBbm5vdHMpIHsKICAgICAgICBpZiAoYml0bWFwSWQgJiYgIWJpdG1hcCAmJiAhbWlzc2luZ0JpdG1hcHMuaGFzKGJpdG1hcElkKSkgewogICAgICAgICAgbWlzc2luZ0JpdG1hcHMuYWRkKGJpdG1hcElkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICAgIH0gPSB0aGlzLmV2YWx1YXRvck9wdGlvbnM7CiAgICAgIGlmIChtaXNzaW5nQml0bWFwcy5zaXplID4gMCkgewogICAgICAgIGNvbnN0IGFubm90YXRpb25XaXRoQml0bWFwcyA9IG5ld0Fubm90cy5zbGljZSgpOwogICAgICAgIGZvciAoY29uc3QgW2tleSwgYW5ub3RhdGlvbl0gb2YgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoQW5ub3RhdGlvbkVkaXRvclByZWZpeCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5iaXRtYXAgJiYgbWlzc2luZ0JpdG1hcHMuaGFzKGFubm90YXRpb24uYml0bWFwSWQpKSB7CiAgICAgICAgICAgIGFubm90YXRpb25XaXRoQml0bWFwcy5wdXNoKGFubm90YXRpb24pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpbWFnZVByb21pc2VzID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2VuZXJhdGVJbWFnZXMoYW5ub3RhdGlvbldpdGhCaXRtYXBzLCB0aGlzLnhyZWYsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbWFnZVByb21pc2VzID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2VuZXJhdGVJbWFnZXMobmV3QW5ub3RzLCB0aGlzLnhyZWYsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgfQogICAgICBkZWxldGVkQW5ub3RhdGlvbnMgPSBuZXcgUmVmU2V0KCk7CiAgICAgIG5ld0Fubm90YXRpb25zUHJvbWlzZSA9IFByb21pc2UuYWxsKFthbm5vdGF0aW9uR2xvYmFsc1Byb21pc2UsIHRoaXMuI3JlcGxhY2VJZEJ5UmVmKG5ld0Fubm90cywgZGVsZXRlZEFubm90YXRpb25zLCBudWxsKV0pLnRoZW4oKFthbm5vdGF0aW9uR2xvYmFsc10pID0+IHsKICAgICAgICBpZiAoIWFubm90YXRpb25HbG9iYWxzKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LnByaW50TmV3QW5ub3RhdGlvbnMoYW5ub3RhdGlvbkdsb2JhbHMsIHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIG5ld0Fubm90cywgaW1hZ2VQcm9taXNlcyk7CiAgICAgIH0pOwogICAgfQogICAgY29uc3QgcGFnZUxpc3RQcm9taXNlID0gUHJvbWlzZS5hbGwoW2NvbnRlbnRTdHJlYW1Qcm9taXNlLCByZXNvdXJjZXNQcm9taXNlXSkudGhlbigoW2NvbnRlbnRTdHJlYW1dKSA9PiB7CiAgICAgIGNvbnN0IG9wTGlzdCA9IG5ldyBPcGVyYXRvckxpc3QoaW50ZW50LCBzaW5rKTsKICAgICAgaGFuZGxlci5zZW5kKCJTdGFydFJlbmRlclBhZ2UiLCB7CiAgICAgICAgdHJhbnNwYXJlbmN5OiBwYXJ0aWFsRXZhbHVhdG9yLmhhc0JsZW5kTW9kZXModGhpcy5yZXNvdXJjZXMsIHRoaXMubm9uQmxlbmRNb2Rlc1NldCksCiAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgICBjYWNoZUtleQogICAgICB9KTsKICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCiAgICAgICAgdGFzaywKICAgICAgICByZXNvdXJjZXM6IHRoaXMucmVzb3VyY2VzLAogICAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBvcExpc3Q7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3BhZ2VMaXN0UHJvbWlzZSwgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMsIG5ld0Fubm90YXRpb25zUHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKFtwYWdlT3BMaXN0LCBhbm5vdGF0aW9ucywgbmV3QW5ub3RhdGlvbnNdKSB7CiAgICAgIGlmIChuZXdBbm5vdGF0aW9ucykgewogICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gIShhLnJlZiAmJiBkZWxldGVkQW5ub3RhdGlvbnMuaGFzKGEucmVmKSkpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG5ld0Fubm90YXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGNvbnN0IG5ld0Fubm90YXRpb24gPSBuZXdBbm5vdGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChuZXdBbm5vdGF0aW9uLnJlZlRvUmVwbGFjZSkgewogICAgICAgICAgICBjb25zdCBqID0gYW5ub3RhdGlvbnMuZmluZEluZGV4KGEgPT4gYS5yZWYgJiYgaXNSZWZzRXF1YWwoYS5yZWYsIG5ld0Fubm90YXRpb24ucmVmVG9SZXBsYWNlKSk7CiAgICAgICAgICAgIGlmIChqID49IDApIHsKICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5zcGxpY2UoaiwgMSwgbmV3QW5ub3RhdGlvbik7CiAgICAgICAgICAgICAgbmV3QW5ub3RhdGlvbnMuc3BsaWNlKGktLSwgMSk7CiAgICAgICAgICAgICAgaWktLTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmNvbmNhdChuZXdBbm5vdGF0aW9ucyk7CiAgICAgIH0KICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PT0gMCB8fCBpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0RJU0FCTEUpIHsKICAgICAgICBwYWdlT3BMaXN0LmZsdXNoKHRydWUpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGgKICAgICAgICB9OwogICAgICB9CiAgICAgIGNvbnN0IHJlbmRlckZvcm1zID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19GT1JNUyksCiAgICAgICAgaXNFZGl0aW5nID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5JU19FRElUSU5HKSwKICAgICAgICBpbnRlbnRBbnkgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLkFOWSksCiAgICAgICAgaW50ZW50RGlzcGxheSA9ICEhKGludGVudCAmIFJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksCiAgICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgICAgY29uc3Qgb3BMaXN0UHJvbWlzZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgICAgaWYgKGludGVudEFueSB8fCBpbnRlbnREaXNwbGF5ICYmIGFubm90YXRpb24ubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlLCByZW5kZXJGb3JtcykgJiYgYW5ub3RhdGlvbi5tdXN0QmVWaWV3ZWRXaGVuRWRpdGluZyhpc0VkaXRpbmcsIG1vZGlmaWVkSWRzKSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLm11c3RCZVByaW50ZWQoYW5ub3RhdGlvblN0b3JhZ2UpKSB7CiAgICAgICAgICBvcExpc3RQcm9taXNlcy5wdXNoKGFubm90YXRpb24uZ2V0T3BlcmF0b3JMaXN0KHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgd2FybigiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyAiICsgYCIke3Rhc2submFtZX0iIHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIG9wTGlzdDogbnVsbCwKICAgICAgICAgICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICAgICAgICAgI
20HNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgICAgICAgICB9OwogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3BMaXN0UHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKG9wTGlzdHMpIHsKICAgICAgICBsZXQgZm9ybSA9IGZhbHNlLAogICAgICAgICAgY2FudmFzID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCB7CiAgICAgICAgICBvcExpc3QsCiAgICAgICAgICBzZXBhcmF0ZUZvcm0sCiAgICAgICAgICBzZXBhcmF0ZUNhbnZhcwogICAgICAgIH0gb2Ygb3BMaXN0cykgewogICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcExpc3Qob3BMaXN0KTsKICAgICAgICAgIGZvcm0gfHw9IHNlcGFyYXRlRm9ybTsKICAgICAgICAgIGNhbnZhcyB8fD0gc2VwYXJhdGVDYW52YXM7CiAgICAgICAgfQogICAgICAgIHBhZ2VPcExpc3QuZmx1c2godHJ1ZSwgewogICAgICAgICAgZm9ybSwKICAgICAgICAgIGNhbnZhcwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGgKICAgICAgICB9OwogICAgICB9KTsKICAgIH0pOwogIH0KICBhc3luYyBleHRyYWN0VGV4dENvbnRlbnQoewogICAgaGFuZGxlciwKICAgIHRhc2ssCiAgICBpbmNsdWRlTWFya2VkQ29udGVudCwKICAgIGRpc2FibGVOb3JtYWxpemF0aW9uLAogICAgc2luawogIH0pIHsKICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7CiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0pOwogICAgY29uc3QgbGFuZ1Byb21pc2UgPSB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibGFuZyIpOwogICAgY29uc3QgW2NvbnRlbnRTdHJlYW0sLCBsYW5nXSA9IGF3YWl0IFByb21pc2UuYWxsKFtjb250ZW50U3RyZWFtUHJvbWlzZSwgcmVzb3VyY2VzUHJvbWlzZSwgbGFuZ1Byb21pc2VdKTsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgZm9udENhY2hlOiB0aGlzLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICBnbG9iYWxJbWFnZUNhY2hlOiB0aGlzLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgfSk7CiAgICByZXR1cm4gcGFydGlhbEV2YWx1YXRvci5nZXRUZXh0Q29udGVudCh7CiAgICAgIHN0cmVhbTogY29udGVudFN0cmVhbSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uLAogICAgICBzaW5rLAogICAgICB2aWV3Qm94OiB0aGlzLnZpZXcsCiAgICAgIGxhbmcKICAgIH0pOwogIH0KICBhc3luYyBnZXRTdHJ1Y3RUcmVlKCkgewogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygic3RydWN0VHJlZVJvb3QiKTsKICAgIGlmICghc3RydWN0VHJlZVJvb3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBhd2FpdCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uczsKICAgIGNvbnN0IHN0cnVjdFRyZWUgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJfcGFyc2VTdHJ1Y3RUcmVlIiwgW3N0cnVjdFRyZWVSb290XSk7CiAgICByZXR1cm4gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZShzdHJ1Y3RUcmVlLCAic2VyaWFsaXphYmxlIik7CiAgfQogIF9wYXJzZVN0cnVjdFRyZWUoc3RydWN0VHJlZVJvb3QpIHsKICAgIGNvbnN0IHRyZWUgPSBuZXcgU3RydWN0VHJlZVBhZ2Uoc3RydWN0VHJlZVJvb3QsIHRoaXMucGFnZURpY3QpOwogICAgdHJlZS5wYXJzZSh0aGlzLnJlZik7CiAgICByZXR1cm4gdHJlZTsKICB9CiAgYXN5bmMgZ2V0QW5ub3RhdGlvbnNEYXRhKGhhbmRsZXIsIHRhc2ssIGludGVudCkgewogICAgY29uc3QgYW5ub3RhdGlvbnMgPSBhd2FpdCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uczsKICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgfQogICAgY29uc3QgYW5ub3RhdGlvbnNEYXRhID0gW10sCiAgICAgIHRleHRDb250ZW50UHJvbWlzZXMgPSBbXTsKICAgIGxldCBwYXJ0aWFsRXZhbHVhdG9yOwogICAgY29uc3QgaW50ZW50QW55ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLAogICAgICBpbnRlbnREaXNwbGF5ID0gISEoaW50ZW50ICYgUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKSwKICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBSZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBjb25zdCBpc1Zpc2libGUgPSBpbnRlbnRBbnkgfHwgaW50ZW50RGlzcGxheSAmJiBhbm5vdGF0aW9uLnZpZXdhYmxlOwogICAgICBpZiAoaXNWaXNpYmxlIHx8IGludGVudFByaW50ICYmIGFubm90YXRpb24ucHJpbnRhYmxlKSB7CiAgICAgICAgYW5ub3RhdGlvbnNEYXRhLnB1c2goYW5ub3RhdGlvbi5kYXRhKTsKICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvbi5oYXNUZXh0Q29udGVudCAmJiBpc1Zpc2libGUpIHsKICAgICAgICBwYXJ0aWFsRXZhbHVhdG9yIHx8PSBuZXcgUGFydGlhbEV2YWx1YXRvcih7CiAgICAgICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgICAgICBoYW5kbGVyLAogICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgICAgIGl
20kRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCiAgICAgICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKICAgICAgICB9KTsKICAgICAgICB0ZXh0Q29udGVudFByb21pc2VzLnB1c2goYW5ub3RhdGlvbi5leHRyYWN0VGV4dENvbnRlbnQocGFydGlhbEV2YWx1YXRvciwgdGFzaywgWy1JbmZpbml0eSwgLUluZmluaXR5LCBJbmZpbml0eSwgSW5maW5pdHldKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKGBnZXRBbm5vdGF0aW9uc0RhdGEgLSBpZ25vcmluZyB0ZXh0Q29udGVudCBkdXJpbmcgIiR7dGFzay5uYW1lfSIgdGFzazogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgfSkpOwogICAgICB9CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbCh0ZXh0Q29udGVudFByb21pc2VzKTsKICAgIHJldHVybiBhbm5vdGF0aW9uc0RhdGE7CiAgfQogIGdldCBhbm5vdGF0aW9ucygpIHsKICAgIGNvbnN0IGFubm90cyA9IHRoaXMuX2dldEluaGVyaXRhYmxlUHJvcGVydHkoIkFubm90cyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiYW5ub3RhdGlvbnMiLCBBcnJheS5pc0FycmF5KGFubm90cykgPyBhbm5vdHMgOiBbXSk7CiAgfQogIGdldCBfcGFyc2VkQW5ub3RhdGlvbnMoKSB7CiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiYW5ub3RhdGlvbnMiKS50aGVuKGFzeW5jIGFubm90cyA9PiB7CiAgICAgIGlmIChhbm5vdHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGFubm90czsKICAgICAgfQogICAgICBjb25zdCBbYW5ub3RhdGlvbkdsb2JhbHMsIGZpZWxkT2JqZWN0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiYW5ub3RhdGlvbkdsb2JhbHMiKSwgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiZmllbGRPYmplY3RzIildKTsKICAgICAgaWYgKCFhbm5vdGF0aW9uR2xvYmFscykgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICBjb25zdCBvcnBoYW5GaWVsZHMgPSBmaWVsZE9iamVjdHM/Lm9ycGhhbkZpZWxkczsKICAgICAgY29uc3QgYW5ub3RhdGlvblByb21pc2VzID0gW107CiAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvblJlZiBvZiBhbm5vdHMpIHsKICAgICAgICBhbm5vdGF0aW9uUHJvbWlzZXMucHVzaChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUodGhpcy54cmVmLCBhbm5vdGF0aW9uUmVmLCBhbm5vdGF0aW9uR2xvYmFscywgdGhpcy5fbG9jYWxJZEZhY3RvcnksIGZhbHNlLCBvcnBoYW5GaWVsZHMsIHRoaXMucmVmKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICB3YXJuKGBfcGFyc2VkQW5ub3RhdGlvbnM6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGNvbnN0IHNvcnRlZEFubm90YXRpb25zID0gW107CiAgICAgIGxldCBwb3B1cEFubm9
200YXRpb25zLCB3aWRnZXRBbm5vdGF0aW9uczsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGF3YWl0IFByb21pc2UuYWxsKGFubm90YXRpb25Qcm9taXNlcykpIHsKICAgICAgICBpZiAoIWFubm90YXRpb24pIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFdpZGdldEFubm90YXRpb24pIHsKICAgICAgICAgICh3aWRnZXRBbm5vdGF0aW9ucyB8fD0gW10pLnB1c2goYW5ub3RhdGlvbik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQb3B1cEFubm90YXRpb24pIHsKICAgICAgICAgIChwb3B1cEFubm90YXRpb25zIHx8PSBbXSkucHVzaChhbm5vdGF0aW9uKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBzb3J0ZWRBbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pOwogICAgICB9CiAgICAgIGlmICh3aWRnZXRBbm5vdGF0aW9ucykgewogICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goLi4ud2lkZ2V0QW5ub3RhdGlvbnMpOwogICAgICB9CiAgICAgIGlmIChwb3B1cEFubm90YXRpb25zKSB7CiAgICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaCguLi5wb3B1cEFubm90YXRpb25zKTsKICAgICAgfQogICAgICByZXR1cm4gc29ydGVkQW5ub3RhdGlvbnM7CiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgIl9wYXJzZWRBbm5vdGF0aW9ucyIsIHByb21pc2UpOwogIH0KICBnZXQganNBY3Rpb25zKCkgewogICAgY29uc3QgYWN0aW9ucyA9IGNvbGxlY3RBY3Rpb25zKHRoaXMueHJlZiwgdGhpcy5wYWdlRGljdCwgUGFnZUFjdGlvbkV2ZW50VHlwZSk7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJqc0FjdGlvbnMiLCBhY3Rpb25zKTsKICB9Cn0KY29uc3QgUERGX0hFQURFUl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHgyNSwgMHg1MCwgMHg0NCwgMHg0NiwgMHgyZF0pOwpjb25zdCBTVEFSVFhSRUZfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4NzQsIDB4NzgsIDB4NzIsIDB4NjUsIDB4NjZdKTsKY29uc3QgRU5ET0JKX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDY1LCAweDZlLCAweDY0LCAweDZmLCAweDYyLCAweDZhXSk7CmZ1bmN0aW9uIGZpbmQoc3RyZWFtLCBzaWduYXR1cmUsIGxpbWl0ID0gMTAyNCwgYmFja3dhcmRzID0gZmFsc2UpIHsKICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOwogIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMobGltaXQpOwogIGNvbnN0IHNjYW5MZW5ndGggPSBzY2FuQnl0ZXMubGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogIGlmIChzY2FuTGVuZ3RoIDw9IDApIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKGJhY2t3YXJkcykgewogICAgY29uc3Qgc2lnbmF0dXJlRW5kID0gc2lnbmF0dXJlTGVuZ3RoIC0gMTsKICAgIGxldCBwb3MgPSBzY2FuQnl0ZXMubGVuZ3RoIC0gMTsKICAgIHdoaWxlIChwb3MgPj0gc2lnbmF0dXJlRW5kKSB7CiAgICAgIGxldCBqID0gMDsKICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyAtIGpdID09PSBzaWduYXR1cmVbc2lnbmF0dXJlRW5kIC0gal0pIHsKICAgICAgICBqKys7CiAgICAgIH0KICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7CiAgICAgICAgc3RyZWFtLnBvcyArPSBwb3MgLSBzaWduYXR1cmVFbmQ7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcG9zLS07CiAgICB9CiAgfSBlbHNlIHsKICAgIGxldCBwb3MgPSAwOwogICAgd2hpbGUgKHBvcyA8PSBzY2FuTGVuZ3RoKSB7CiAgICAgIGxldCBqID0gMDsKICAgICAgd2hpbGUgKGogPCBzaWduYXR1cmVMZW5ndGggJiYgc2NhbkJ5dGVzW3BvcyArIGpdID09PSBzaWduYXR1cmVbal0pIHsKICAgICAgICBqKys7CiAgICAgIH0KICAgICAgaWYgKGogPj0gc2lnbmF0dXJlTGVuZ3RoKSB7CiAgICAgICAgc3RyZWFtLnBvcyArPSBwb3M7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcG9zKys7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQpjbGFzcyBQREZEb2N1bWVudCB7CiAgY29uc3RydWN0b3IocGRmTWFuYWdlciwgc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLmxlbmd0aCA8PSAwKSB7CiAgICAgIHRocm93IG5ldyBJbnZhbGlkUERGRXhjZXB0aW9uKCJUaGUgUERGIGZpbGUgaXMgZW1wdHksIGkuZS4gaXRzIHNpemUgaXMgemVybyBieXRlcy4iKTsKICAgIH0KICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMueHJlZiA9IG5ldyBYUmVmKHN0cmVhbSwgcGRmTWFuYWdlcik7CiAgICB0aGlzLl9wYWdlUHJvbWlzZXMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl92ZXJzaW9uID0gbnVsbDsKICAgIGNvbnN0IGlkQ291bnRlcnMgPSB7CiAgICAgIGZvbnQ6IDAKICAgIH07CiAgICB0aGlzLl9nbG9iYWxJZEZhY3RvcnkgPSBjbGFzcyB7CiAgICAgIHN0YXRpYyBnZXREb2NJZCgpIHsKICAgICAgICByZXR1cm4gYGdfJHtwZGZNYW5hZ2VyLmRvY0lkfWA7CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZUZvbnRJZCgpIHsKICAgICAgICByZXR1cm4gYGYkeysraWRDb3VudGVycy5mb250fWA7CiAgICAgIH0KICAgICAgc3RhdGljIGNyZWF0ZU9iaklkKCkgewogICAgICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZU9iaklkYCBjYWxsZWQuIik7CiAgICAgIH0KICAgICAgc3RhdGljIGdldFBhZ2VPYmpJZCgpIHsKICAgICAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBnZXRQYWdlT2JqSWRgIGNhbGxlZC4iKTsKICAgICAgfQogICAgfTsKICB9CiAgcGFyc2UocmVjb3ZlcnlNb2RlKSB7CiAgICB0aGlzLnhyZWYucGFyc2UocmVjb3ZlcnlNb2RlKTsKICAgIHRoaXMuY2F0YWxvZyA9IG5ldyBDYXRhbG9nKHRoaXMucGRmTWFuYWdlciwgdGhpcy54cmVmKTsKICB9CiAgZ2V0IGxpbmVhcml6YXRpb24oKSB7CiAgICBsZXQgbGluZWFyaXphdGlvbiA9IG51bGw7CiAgICB0cnkgewogICAgICBsaW5lYXJpemF0aW9uID0gTGluZWFyaXphdGlvbi5jcmVhdGUodGhpcy5zdHJlYW0pOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgI
20HRocm93IGVycjsKICAgICAgfQogICAgICBpbmZvKGVycik7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJsaW5lYXJpemF0aW9uIiwgbGluZWFyaXphdGlvbik7CiAgfQogIGdldCBzdGFydFhSZWYoKSB7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKICAgIGxldCBzdGFydFhSZWYgPSAwOwogICAgaWYgKHRoaXMubGluZWFyaXphdGlvbikgewogICAgICBzdHJlYW0ucmVzZXQoKTsKICAgICAgaWYgKGZpbmQoc3RyZWFtLCBFTkRPQkpfU0lHTkFUVVJFKSkgewogICAgICAgIHN0cmVhbS5za2lwKDYpOwogICAgICAgIGxldCBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgICAgIHdoaWxlIChpc1doaXRlU3BhY2UoY2gpKSB7CiAgICAgICAgICBzdHJlYW0ucG9zKys7CiAgICAgICAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgICAgIH0KICAgICAgICBzdGFydFhSZWYgPSBzdHJlYW0ucG9zIC0gc3RyZWFtLnN0YXJ0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzdGVwID0gMTAyNDsKICAgICAgY29uc3Qgc3RhcnRYUmVmTGVuZ3RoID0gU1RBUlRYUkVGX1NJR05BVFVSRS5sZW5ndGg7CiAgICAgIGxldCBmb3VuZCA9IGZhbHNlLAogICAgICAgIHBvcyA9IHN0cmVhbS5lbmQ7CiAgICAgIHdoaWxlICghZm91bmQgJiYgcG9zID4gMCkgewogICAgICAgIHBvcyAtPSBzdGVwIC0gc3RhcnRYUmVmTGVuZ3RoOwogICAgICAgIGlmIChwb3MgPCAwKSB7CiAgICAgICAgICBwb3MgPSAwOwogICAgICAgIH0KICAgICAgICBzdHJlYW0ucG9zID0gcG9zOwogICAgICAgIGZvdW5kID0gZmluZChzdHJlYW0sIFNUQVJUWFJFRl9TSUdOQVRVUkUsIHN0ZXAsIHRydWUpOwogICAgICB9CiAgICAgIGlmIChmb3VuZCkgewogICAgICAgIHN0cmVhbS5za2lwKDkpOwogICAgICAgIGxldCBjaDsKICAgICAgICBkbyB7CiAgICAgICAgICBjaCA9IHN0cmVhbS5nZXRCeXRlKCk7CiAgICAgICAgfSB3aGlsZSAoaXNXaGl0ZVNwYWNlKGNoKSk7CiAgICAgICAgbGV0IHN0ciA9ICIiOwogICAgICAgIHdoaWxlIChjaCA+PSAweDIwICYmIGNoIDw9IDB4MzkpIHsKICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICB9CiAgICAgICAgc3RhcnRYUmVmID0gcGFyc2VJbnQoc3RyLCAxMCk7CiAgICAgICAgaWYgKGlzTmFOKHN0YXJ0WFJlZikpIHsKICAgICAgICAgIHN0YXJ0WFJlZiA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJzdGFydFhSZWYiLCBzdGFydFhSZWYpOwogIH0KICBjaGVja0hlYWRlcigpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgc3RyZWFtLnJlc2V0KCk7CiAgICBpZiAoIWZpbmQoc3RyZWFtLCBQREZfSEVBREVSX1NJR05BVFVSRSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RyZWFtLm1vdmVTdGFydCgpOwogICAgc3RyZWFtLnNraXAoUERGX0hFQURFUl9TSUdOQVRVUkUubGVuZ3RoKTsKICAgIGxldCB2ZXJzaW9uID0gIiIsCiAgICAgIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpID4gMHgyMCAmJiB2ZXJzaW9uLmxlbmd0aCA8IDcpIHsKICAgICAgdmVyc2lvbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIH0KICAgIGlmIChQREZfVkVSU0lPTl9SRUdFWFAudGVzdCh2ZXJzaW9uKSkgewogICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjsKICAgIH0gZWxzZSB7CiAgICAgIHdhcm4oYEludmFsaWQgUERGIGhlYWRlciB2ZXJzaW9uOiAke3ZlcnNpb259YCk7CiAgICB9CiAgfQogIHBhcnNlU3RhcnRYUmVmKCkgewogICAgdGhpcy54cmVmLnNldFN0YXJ0WFJlZih0aGlzLnN0YXJ0WFJlZik7CiAgfQogIGdldCBudW1QYWdlcygpIHsKICAgIGxldCBudW0gPSAwOwogICAgaWYgKHRoaXMuY2F0YWxvZy5oYXNBY3R1YWxOdW1QYWdlcykgewogICAgICBudW0gPSB0aGlzLmNhdGFsb2cubnVtUGFnZXM7CiAgICB9IGVsc2UgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICBudW0gPSB0aGlzLnhmYUZhY3RvcnkuZ2V0TnVtUGFnZXMoKTsKICAgIH0gZWxzZSBpZiAodGhpcy5saW5lYXJpemF0aW9uKSB7CiAgICAgIG51bSA9IHRoaXMubGluZWFyaXphdGlvbi5udW1QYWdlczsKICAgIH0gZWxzZSB7CiAgICAgIG51bSA9IHRoaXMuY2F0YWxvZy5udW1QYWdlczsKICAgIH0KICAgIHJldHVybiBzaGFkb3codGhpcywgIm51bVBhZ2VzIiwgbnVtKTsKICB9CiAgX2hhc09ubHlEb2N1bWVudFNpZ25hdHVyZXMoZmllbGRzLCByZWN1cnNpb25EZXB0aCA9IDApIHsKICAgIGNvbnN0IFJFQ1VSU0lPTl9MSU1JVCA9IDEwOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkcykpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIGZpZWxkcy5ldmVyeShmaWVsZCA9PiB7CiAgICAgIGZpZWxkID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmllbGQpOwogICAgICBpZiAoIShmaWVsZCBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChmaWVsZC5oYXMoIktpZHMiKSkgewogICAgICAgIGlmICgrK3JlY3Vyc2lvbkRlcHRoID4gUkVDVVJTSU9OX0xJTUlUKSB7CiAgICAgICAgICB3YXJuKCJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlczogbWF4aW11bSByZWN1cnNpb24gZGVwdGggcmVhY2hlZCIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZC5nZXQoIktpZHMiKSwgcmVjdXJzaW9uRGVwdGgpOwogICAgICB9CiAgICAgIGNvbnN0IGlzU2lnbmF0dXJlID0gaXNOYW1lKGZpZWxkLmdldCgiRlQiKSwgIlNpZyIpOwogICAgICBjb25zdCByZWN0YW5nbGUgPSBmaWVsZC5nZXQoIlJlY3QiKTsKICAgICAgY29uc3QgaXNJbnZpc2libGUgPSBBcnJheS5pc0FycmF5KHJlY3RhbmdsZSkgJiYgcmVjdGFuZ2xlLmV2ZXJ5KHZhbHVlID0+IHZhbHVlID09PSAwKTsKICAgICAgcmV0dXJuIGlzU2lnbmF0dXJlICYmIGlzSW52aXNpYmxlOwogICAgfSk7CiAgfQogIGdldCBfeGZhU3RyZWFtcygpIHsKICAgIGNvbnN0IGFjcm9Gb3JtID0gdGhpcy5jYXRhbG9nLmFjcm9Gb3JtOwogICAgaWYgKCFhY3JvRm9ybSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHhmYSA9IGFjcm9Gb3JtLmdldCgiWEZBIik7CiAgICBjb25zdCBlbnRyaWVzID0gewogICAgICAieGRwOnhkcCI6ICIiLAogICAgICB0ZW1wbGF0ZTogIiIsCiAgICAgIGRhdGFzZXRzOiAiIiwKICAgICAgY29uZmlnOiAiIiwKICAgICAgY29ubmVjdGlvblNldDogIiIsCiAgICAgIGxvY2FsZVNldDogIiIsCiAgICAgI
20HN0eWxlc2hlZXQ6ICIiLAogICAgICAiL3hkcDp4ZHAiOiAiIgogICAgfTsKICAgIGlmICh4ZmEgaW5zdGFuY2VvZiBCYXNlU3RyZWFtICYmICF4ZmEuaXNFbXB0eSkgewogICAgICBlbnRyaWVzWyJ4ZHA6eGRwIl0gPSB4ZmE7CiAgICAgIHJldHVybiBlbnRyaWVzOwogICAgfQogICAgaWYgKCFBcnJheS5pc0FycmF5KHhmYSkgfHwgeGZhLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgIGxldCBuYW1lOwogICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgIG5hbWUgPSAieGRwOnhkcCI7CiAgICAgIH0gZWxzZSBpZiAoaSA9PT0gaWkgLSAyKSB7CiAgICAgICAgbmFtZSA9ICIveGRwOnhkcCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9IHhmYVtpXTsKICAgICAgfQogICAgICBpZiAoIWVudHJpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBkYXRhID0gdGhpcy54cmVmLmZldGNoSWZSZWYoeGZhW2kgKyAxXSk7CiAgICAgIGlmICghKGRhdGEgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB8fCBkYXRhLmlzRW1wdHkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBlbnRyaWVzW25hbWVdID0gZGF0YTsKICAgIH0KICAgIHJldHVybiBlbnRyaWVzOwogIH0KICBnZXQgeGZhRGF0YXNldHMoKSB7CiAgICBjb25zdCBzdHJlYW1zID0gdGhpcy5feGZhU3RyZWFtczsKICAgIGlmICghc3RyZWFtcykgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ4ZmFEYXRhc2V0cyIsIG51bGwpOwogICAgfQogICAgZm9yIChjb25zdCBrZXkgb2YgWyJkYXRhc2V0cyIsICJ4ZHA6eGRwIl0pIHsKICAgICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1trZXldOwogICAgICBpZiAoIXN0cmVhbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgc3RyID0gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cmVhbS5nZXRTdHJpbmcoKSk7CiAgICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICAgIFtrZXldOiBzdHIKICAgICAgICB9OwogICAgICAgIHJldHVybiBzaGFkb3codGhpcywgInhmYURhdGFzZXRzIiwgbmV3IERhdGFzZXRSZWFkZXIoZGF0YSkpOwogICAgICB9IGNhdGNoIHsKICAgICAgICB3YXJuKCJYRkEgLSBJbnZhbGlkIHV0Zi04IHN0cmluZy4iKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAieGZhRGF0YXNldHMiLCBudWxsKTsKICB9CiAgZ2V0IHhmYURhdGEoKSB7CiAgICBjb25zdCBzdHJlYW1zID0gdGhpcy5feGZhU3RyZWFtczsKICAgIGlmICghc3RyZWFtcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yIChjb25zdCBba2V5LCBzdHJlYW1dIG9mIE9iamVjdC5lbnRyaWVzKHN0cmVhbXMpKSB7CiAgICAgIGlmICghc3RyZWFtKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBkYXRhW2tleV0gPSBzdHJpbmdUb1VURjhTdHJpbmcoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgfSBjYXRjaCB7CiAgICAgICAgd2FybigiWEZBIC0gSW52YWxpZCB1dGYtOCBzdHJpbmcuIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXQgeGZhRmFjdG9yeSgpIHsKICAgIGxldCBkYXRhOwogICAgaWYgKHRoaXMucGRmTWFuYWdlci5lbmFibGVYZmEgJiYgdGhpcy5jYXRhbG9nLm5lZWRzUmVuZGVyaW5nICYmIHRoaXMuZm9ybUluZm8uaGFzWGZhICYmICF0aGlzLmZvcm1JbmZvLmhhc0Fjcm9Gb3JtKSB7CiAgICAgIGRhdGEgPSB0aGlzLnhmYURhdGE7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJ4ZmFGYWN0b3J5IiwgZGF0YSA/IG5ldyBYRkFGYWN0b3J5KGRhdGEpIDogbnVsbCk7CiAgfQogIGdldCBpc1B1cmVYZmEoKSB7CiAgICByZXR1cm4gdGhpcy54ZmFGYWN0b3J5ID8gdGhpcy54ZmFGYWN0b3J5LmlzVmFsaWQoKSA6IGZhbHNlOwogIH0KICBnZXQgaHRtbEZvclhmYSgpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3RvcnkuZ2V0UGFnZXMoKSA6IG51bGw7CiAgfQogIGFzeW5jIGxvYWRYZmFJbWFnZXMoKSB7CiAgICBjb25zdCB4ZmFJbWFnZXNEaWN0ID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInhmYUltYWdlcyIpOwogICAgaWYgKCF4ZmFJbWFnZXNEaWN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGtleXMgPSB4ZmFJbWFnZXNEaWN0LmdldEtleXMoKTsKICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBPYmplY3RMb2FkZXIoeGZhSW1hZ2VzRGljdCwga2V5cywgdGhpcy54cmVmKTsKICAgIGF3YWl0IG9iamVjdExvYWRlci5sb2FkKCk7CiAgICBjb25zdCB4ZmFJbWFnZXMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgIGNvbnN0IHN0cmVhbSA9IHhmYUltYWdlc0RpY3QuZ2V0KGtleSk7CiAgICAgIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICAgICAgeGZhSW1hZ2VzLnNldChrZXksIHN0cmVhbS5nZXRCeXRlcygpKTsKICAgICAgfQogICAgfQogICAgdGhpcy54ZmFGYWN0b3J5LnNldEltYWdlcyh4ZmFJbWFnZXMpOwogIH0KICBhc3luYyBsb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykgewogICAgY29uc3QgYWNyb0Zvcm0gPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKTsKICAgIGlmICghYWNyb0Zvcm0pIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgYWNyb0Zvcm0uZ2V0QXN5bmMoIkRSIik7CiAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBvYmplY3RMb2FkZXIgPSBuZXcgT2JqZWN0TG9hZGVyKHJlc291cmNlcywgWyJGb250Il0sIHR
20oaXMueHJlZik7CiAgICBhd2FpdCBvYmplY3RMb2FkZXIubG9hZCgpOwogICAgY29uc3QgZm9udFJlcyA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgIGlmICghKGZvbnRSZXMgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9ucyk7CiAgICBvcHRpb25zLnVzZVN5c3RlbUZvbnRzID0gZmFsc2U7CiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IFBhcnRpYWxFdmFsdWF0b3IoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGhhbmRsZXIsCiAgICAgIHBhZ2VJbmRleDogLTEsCiAgICAgIGlkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuY2F0YWxvZy5mb250Q2FjaGUsCiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuY2F0YWxvZy5idWlsdEluQ01hcENhY2hlLAogICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIG9wdGlvbnMKICAgIH0pOwogICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gbmV3IE9wZXJhdG9yTGlzdCgpOwogICAgY29uc3QgcGRmRm9udHMgPSBbXTsKICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKICAgICAgZ2V0IGZvbnQoKSB7CiAgICAgICAgcmV0dXJuIHBkZkZvbnRzLmF0KC0xKTsKICAgICAgfSwKICAgICAgc2V0IGZvbnQoZm9udCkgewogICAgICAgIHBkZkZvbnRzLnB1c2goZm9udCk7CiAgICAgIH0sCiAgICAgIGNsb25lKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9OwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgW2ZvbnROYW1lLCBmb250XSBvZiBmb250UmVzKSB7CiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBmb250LmdldCgiRm9udERlc2NyaXB0b3IiKTsKICAgICAgaWYgKCEoZGVzY3JpcHRvciBpbnN0YW5jZW9mIERpY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IGZvbnRGYW1pbHkgPSBkZXNjcmlwdG9yLmdldCgiRm9udEZhbWlseSIpOwogICAgICBmb250RmFtaWx5ID0gZm9udEZhbWlseS5yZXBsYWNlQWxsKC9bIF0rKFxkKS9nLCAiJDEiKTsKICAgICAgY29uc3QgZm9udFdlaWdodCA9IGRlc2NyaXB0b3IuZ2V0KCJGb250V2VpZ2h0Iik7CiAgICAgIGNvbnN0IGl0YWxpY0FuZ2xlID0gLWRlc2NyaXB0b3IuZ2V0KCJJdGFsaWNBbmdsZSIpOwogICAgICBjb25zdCBjc3NGb250SW5mbyA9IHsKICAgICAgICBmb250RmFtaWx5LAogICAgICAgIGZvbnRXZWlnaHQsCiAgICAgICAgaXRhbGljQW5nbGUKICAgICAgfTsKICAgICAgaWYgKCF2YWxpZGF0ZUNTU0ZvbnQoY3NzRm9udEluZm8pKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcHJvbWlzZXMucHVzaChwYXJ0aWFsRXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbTmFtZS5nZXQoZm9udE5hbWUpLCAxXSwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBpbml0aWFsU3RhdGUsIG51bGwsIGNzc0ZvbnRJbmZvKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgd2FybihgbG9hZFhmYUZvbnRzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSkpOwogICAgfQogICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgY29uc3QgbWlzc2luZ0ZvbnRzID0gdGhpcy54ZmFGYWN0b3J5LnNldEZvbnRzKHBkZkZvbnRzKTsKICAgIGlmICghbWlzc2luZ0ZvbnRzKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG9wdGlvbnMuaWdub3JlRXJyb3JzID0gdHJ1ZTsKICAgIHByb21pc2VzLmxlbmd0aCA9IDA7CiAgICBwZGZGb250cy5sZW5ndGggPSAwOwogICAgY29uc3QgcmVhbGx5TWlzc2luZ0ZvbnRzID0gbmV3IFNldCgpOwogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIG1pc3NpbmdGb250cykgewogICAgICBpZiAoIWdldFhmYUZvbnROYW1lKGAke21pc3Npbmd9LVJlZ3VsYXJgKSkgewogICAgICAgIHJlYWxseU1pc3NpbmdGb250cy5hZGQobWlzc2luZyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZWFsbHlNaXNzaW5nRm9udHMuc2l6ZSkgewogICAgICBtaXNzaW5nRm9udHMucHVzaCgiUGRmSlMtRmFsbGJhY2siKTsKICAgIH0KICAgIGZvciAoY29uc3QgbWlzc2luZyBvZiBtaXNzaW5nRm9udHMpIHsKICAgICAgaWYgKHJlYWxseU1pc3NpbmdGb250cy5oYXMobWlzc2luZykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGZvbnRJbmZvIG9mIFt7CiAgICAgICAgbmFtZTogIlJlZ3VsYXIiLAogICAgICAgIGZvbnRXZWlnaHQ6IDQwMCwKICAgICAgICBpdGFsaWNBbmdsZTogMAogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkJvbGQiLAogICAgICAgIGZvbnRXZWlnaHQ6IDcwMCwKICAgICAgICBpdGFsaWNBbmdsZTogMAogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkl0YWxpYyIsCiAgICAgICAgZm9udFdlaWdodDogNDAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAxMgogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkJvbGRJdGFsaWMiLAogICAgICAgIGZvbnRXZWlnaHQ6IDcwMCwKICAgICAgICBpdGFsaWNBbmdsZTogMTIKICAgICAgfV0pIHsKICAgICAgICBjb25zdCBuYW1lID0gYCR7bWlzc2luZ30tJHtmb250SW5mby5uYW1lfWA7CiAgICAgICAgY29uc3QgZGljdCA9IGdldFhmYUZvbnREaWN0KG5hbWUpOwogICAgICAgIHByb21pc2VzLnB1c2gocGFydGlhbEV2YWx1YXRvci5oYW5kbGVTZXRGb250KHJlc291cmNlcywgW05hbWUuZ2V0KG5hbWUpLCAxXSwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBpbml0aWFsU3RhdGUsIGRpY3QsIHsKICAgICAgICAgIGZvbnRGYW1pbHk6IG1pc3NpbmcsCiAgICAgICAgICBmb250V2VpZ2h0OiBmb250SW5mby5mb250V2VpZ2h0LAogICAgICAgICAgaXRhbGljQW5nbGU6IGZvbnRJbmZvLml0YWxpY0FuZ2xlCiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgd2FybihgbG9hZFhmYUZvbnRzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgI
20HJldHVybiBudWxsOwogICAgICAgIH0pKTsKICAgICAgfQogICAgfQogICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgdGhpcy54ZmFGYWN0b3J5LmFwcGVuZEZvbnRzKHBkZkZvbnRzLCByZWFsbHlNaXNzaW5nRm9udHMpOwogIH0KICBhc3luYyBzZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gdGhpcy54ZmFGYWN0b3J5ID8gdGhpcy54ZmFGYWN0b3J5LnNlcmlhbGl6ZURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpIDogbnVsbDsKICB9CiAgZ2V0IHZlcnNpb24oKSB7CiAgICByZXR1cm4gdGhpcy5jYXRhbG9nLnZlcnNpb24gfHwgdGhpcy5fdmVyc2lvbjsKICB9CiAgZ2V0IGZvcm1JbmZvKCkgewogICAgY29uc3QgZm9ybUluZm8gPSB7CiAgICAgIGhhc0ZpZWxkczogZmFsc2UsCiAgICAgIGhhc0Fjcm9Gb3JtOiBmYWxzZSwKICAgICAgaGFzWGZhOiBmYWxzZSwKICAgICAgaGFzU2lnbmF0dXJlczogZmFsc2UKICAgIH07CiAgICBjb25zdCBhY3JvRm9ybSA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybTsKICAgIGlmICghYWNyb0Zvcm0pIHsKICAgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZm9ybUluZm8iLCBmb3JtSW5mbyk7CiAgICB9CiAgICB0cnkgewogICAgICBjb25zdCBmaWVsZHMgPSBhY3JvRm9ybS5nZXQoIkZpZWxkcyIpOwogICAgICBjb25zdCBoYXNGaWVsZHMgPSBBcnJheS5pc0FycmF5KGZpZWxkcykgJiYgZmllbGRzLmxlbmd0aCA+IDA7CiAgICAgIGZvcm1JbmZvLmhhc0ZpZWxkcyA9IGhhc0ZpZWxkczsKICAgICAgY29uc3QgeGZhID0gYWNyb0Zvcm0uZ2V0KCJYRkEiKTsKICAgICAgZm9ybUluZm8uaGFzWGZhID0gQXJyYXkuaXNBcnJheSh4ZmEpICYmIHhmYS5sZW5ndGggPiAwIHx8IHhmYSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0gJiYgIXhmYS5pc0VtcHR5OwogICAgICBjb25zdCBzaWdGbGFncyA9IGFjcm9Gb3JtLmdldCgiU2lnRmxhZ3MiKTsKICAgICAgY29uc3QgaGFzU2lnbmF0dXJlcyA9ICEhKHNpZ0ZsYWdzICYgMHgxKTsKICAgICAgY29uc3QgaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyA9IGhhc1NpZ25hdHVyZXMgJiYgdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMpOwogICAgICBmb3JtSW5mby5oYXNBY3JvRm9ybSA9IGhhc0ZpZWxkcyAmJiAhaGFzT25seURvY3VtZW50U2lnbmF0dXJlczsKICAgICAgZm9ybUluZm8uaGFzU2lnbmF0dXJlcyA9IGhhc1NpZ25hdHVyZXM7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIHdhcm4oYENhbm5vdCBmZXRjaCBmb3JtIGluZm9ybWF0aW9uOiAiJHtleH0iLmApOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZm9ybUluZm8iLCBmb3JtSW5mbyk7CiAgfQogIGdldCBkb2N1bWVudEluZm8oKSB7CiAgICBjb25zdCBkb2NJbmZvID0gewogICAgICBQREZGb3JtYXRWZXJzaW9uOiB0aGlzLnZlcnNpb24sCiAgICAgIExhbmd1YWdlOiB0aGlzLmNhdGFsb2cubGFuZywKICAgICAgRW5jcnlwdEZpbHRlck5hbWU6IHRoaXMueHJlZi5lbmNyeXB0ID8gdGhpcy54cmVmLmVuY3J5cHQuZmlsdGVyTmFtZSA6IG51bGwsCiAgICAgIElzTGluZWFyaXplZDogISF0aGlzLmxpbmVhcml6YXRpb24sCiAgICAgIElzQWNyb0Zvcm1QcmVzZW50OiB0aGlzLmZvcm1JbmZvLmhhc0Fjcm9Gb3JtLAogICAgICBJc1hGQVByZXNlbnQ6IHRoaXMuZm9ybUluZm8uaGFzWGZhLAogICAgICBJc0NvbGxlY3Rpb25QcmVzZW50OiAhIXRoaXMuY2F0YWxvZy5jb2xsZWN0aW9uLAogICAgICBJc1NpZ25hdHVyZXNQcmVzZW50OiB0aGlzLmZvcm1JbmZvLmhhc1NpZ25hdHVyZXMKICAgIH07CiAgICBsZXQgaW5mb0RpY3Q7CiAgICB0cnkgewogICAgICBpbmZvRGljdCA9IHRoaXMueHJlZi50cmFpbGVyLmdldCgiSW5mbyIpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGVycjsKICAgICAgfQogICAgICBpbmZvKCJUaGUgZG9jdW1lbnQgaW5mb3JtYXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpOwogICAgfQogICAgaWYgKCEoaW5mb0RpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkb2N1bWVudEluZm8iLCBkb2NJbmZvKTsKICAgIH0KICAgIGZvciAoY29uc3Qga2V5IG9mIGluZm9EaWN0LmdldEtleXMoKSkgewogICAgICBjb25zdCB2YWx1ZSA9IGluZm9EaWN0LmdldChrZXkpOwogICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgIGNhc2UgIlRpdGxlIjoKICAgICAgICBjYXNlICJBdXRob3IiOgogICAgICAgIGNhc2UgIlN1YmplY3QiOgogICAgICAgIGNhc2UgIktleXdvcmRzIjoKICAgICAgICBjYXNlICJDcmVhdG9yIjoKICAgICAgICBjYXNlICJQcm9kdWNlciI6CiAgICAgICAgY2FzZSAiQ3JlYXRpb25EYXRlIjoKICAgICAgICBjYXNlICJNb2REYXRlIjoKICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGRvY0luZm9ba2V5XSA9IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJUcmFwcGVkIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWUpIHsKICAgICAgICAgICAgZG9jSW5mb1trZXldID0gdmFsdWU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGxldCBjdXN0b21WYWx1ZTsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSBzdHJpbmdUb1BERlN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTmFtZSkgewogICAgICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY3VzdG9tVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB3YXJuKGBCYWQgdmFsdWUsIGZvciBjdXN0b20ga2V5ICIke2tleX0iLCBpbiBJbmZvOiAke3ZhbHVlfS5gKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWRvY0luZm8uQ3VzdG9tKSB7CiAgICAgICAgICAgIGRvY0luZm8uQ3VzdG9tID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgI
20H0KICAgICAgICAgIGRvY0luZm8uQ3VzdG9tW2tleV0gPSBjdXN0b21WYWx1ZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHdhcm4oYEJhZCB2YWx1ZSwgZm9yIGtleSAiJHtrZXl9IiwgaW4gSW5mbzogJHt2YWx1ZX0uYCk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJkb2N1bWVudEluZm8iLCBkb2NJbmZvKTsKICB9CiAgZ2V0IGZpbmdlcnByaW50cygpIHsKICAgIGNvbnN0IEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTID0gMTAyNDsKICAgIGNvbnN0IEVNUFRZX0ZJTkdFUlBSSU5UID0gIlx4MDAiLnJlcGVhdCgxNik7CiAgICBmdW5jdGlvbiB2YWxpZGF0ZShkYXRhKSB7CiAgICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgJiYgZGF0YS5sZW5ndGggPT09IDE2ICYmIGRhdGEgIT09IEVNUFRZX0ZJTkdFUlBSSU5UOwogICAgfQogICAgY29uc3QgaWQgPSB0aGlzLnhyZWYudHJhaWxlci5nZXQoIklEIik7CiAgICBsZXQgaGFzaE9yaWdpbmFsLCBoYXNoTW9kaWZpZWQ7CiAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkgJiYgdmFsaWRhdGUoaWRbMF0pKSB7CiAgICAgIGhhc2hPcmlnaW5hbCA9IHN0cmluZ1RvQnl0ZXMoaWRbMF0pOwogICAgICBpZiAoaWRbMV0gIT09IGlkWzBdICYmIHZhbGlkYXRlKGlkWzFdKSkgewogICAgICAgIGhhc2hNb2RpZmllZCA9IHN0cmluZ1RvQnl0ZXMoaWRbMV0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBoYXNoT3JpZ2luYWwgPSBjYWxjdWxhdGVNRDUodGhpcy5zdHJlYW0uZ2V0Qnl0ZVJhbmdlKDAsIEZJTkdFUlBSSU5UX0ZJUlNUX0JZVEVTKSwgMCwgRklOR0VSUFJJTlRfRklSU1RfQllURVMpOwogICAgfQogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiZmluZ2VycHJpbnRzIiwgW3RvSGV4VXRpbChoYXNoT3JpZ2luYWwpLCBoYXNoTW9kaWZpZWQgPyB0b0hleFV0aWwoaGFzaE1vZGlmaWVkKSA6IG51bGxdKTsKICB9CiAgYXN5bmMgX2dldExpbmVhcml6YXRpb25QYWdlKHBhZ2VJbmRleCkgewogICAgY29uc3QgewogICAgICBjYXRhbG9nLAogICAgICBsaW5lYXJpemF0aW9uLAogICAgICB4cmVmCiAgICB9ID0gdGhpczsKICAgIGNvbnN0IHJlZiA9IFJlZi5nZXQobGluZWFyaXphdGlvbi5vYmplY3ROdW1iZXJGaXJzdCwgMCk7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSBhd2FpdCB4cmVmLmZldGNoQXN5bmMocmVmKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpY3QpIHsKICAgICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFJlZikgewogICAgICAgICAgdHlwZSA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyh0eXBlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTmFtZSh0eXBlLCAiUGFnZSIpIHx8ICFvYmouaGFzKCJUeXBlIikgJiYgIW9iai5oYXMoIktpZHMiKSAmJiBvYmouaGFzKCJDb250ZW50cyIpKSB7CiAgICAgICAgICBpZiAoIWNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgICAgIGNhdGFsb2cucGFnZUtpZHNDb3VudENhY2hlLnB1dChyZWYsIDEpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFjYXRhbG9nLnBhZ2VJbmRleENhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgICAgIGNhdGFsb2cucGFnZUluZGV4Q2FjaGUucHV0KHJlZiwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW29iaiwgcmVmXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJUaGUgTGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGRvZXNuJ3QgcG9pbnQgdG8gYSB2YWxpZCBQYWdlIGRpY3Rpb25hcnkuIik7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgd2FybihgX2dldExpbmVhcml6YXRpb25QYWdlOiAiJHtyZWFzb24ubWVzc2FnZX0iLmApOwogICAgICByZXR1cm4gY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOwogICAgfQogIH0KICBnZXRQYWdlKHBhZ2VJbmRleCkgewogICAgY29uc3QgY2FjaGVkUHJvbWlzZSA9IHRoaXMuX3BhZ2VQcm9taXNlcy5nZXQocGFnZUluZGV4KTsKICAgIGlmIChjYWNoZWRQcm9taXNlKSB7CiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlOwogICAgfQogICAgY29uc3QgewogICAgICBjYXRhbG9nLAogICAgICBsaW5lYXJpemF0aW9uLAogICAgICB4ZmFGYWN0b3J5CiAgICB9ID0gdGhpczsKICAgIGxldCBwcm9taXNlOwogICAgaWYgKHhmYUZhY3RvcnkpIHsKICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShbRGljdC5lbXB0eSwgbnVsbF0pOwogICAgfSBlbHNlIGlmIChsaW5lYXJpemF0aW9uPy5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleCkgewogICAgICBwcm9taXNlID0gdGhpcy5fZ2V0TGluZWFyaXphdGlvblBhZ2UocGFnZUluZGV4KTsKICAgIH0gZWxzZSB7CiAgICAgIHByb21pc2UgPSBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7CiAgICB9CiAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKChbcGFnZURpY3QsIHJlZl0pID0+IHsKICAgICAgcmV0dXJuIG5ldyBQYWdlKHsKICAgICAgICBwZGZNYW5hZ2VyOiB0aGlzLnBkZk1hbmFnZXIsCiAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgIHBhZ2VJbmRleCwKICAgICAgICBwYWdlRGljdCwKICAgICAgICByZWYsCiAgICAgICAgZ2xvYmFsSWRGYWN0b3J5OiB0aGlzLl9nbG9iYWxJZEZhY3RvcnksCiAgICAgICAgZm9udENhY2hlOiBjYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiBjYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiBjYXRhbG9nLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICBub25CbGVuZE1vZGVzU2V0OiBjYXRhbG9nLm5vbkJsZW5kTW9kZXNTZXQsCiAgICAgICAgeGZhRmFjdG9yeQogICAgICB9KTsKICAgIH0pOwogICAgdGhpcy5fcGFnZVByb21pc2VzLnNldChwYWdlSW5kZXgsIHByb21pc2UpOwogICAgcmV0dXJuIHByb21pc2U7CiAgfQogIGFzeW5jIGNoZWNrRmlyc3RQYWdlKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBpZiAocmVjb3ZlcnlNb2RlKSB7CiAgICAgI
20HJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIGF3YWl0IHRoaXMuZ2V0UGFnZSgwKTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgWFJlZkVudHJ5RXhjZXB0aW9uKSB7CiAgICAgICAgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZSgwKTsKICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTsKICAgICAgICB0aHJvdyBuZXcgWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgY2hlY2tMYXN0UGFnZShyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3QgewogICAgICBjYXRhbG9nLAogICAgICBwZGZNYW5hZ2VyCiAgICB9ID0gdGhpczsKICAgIGNhdGFsb2cuc2V0QWN0dWFsTnVtUGFnZXMoKTsKICAgIGxldCBudW1QYWdlczsKICAgIHRyeSB7CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygieGZhRmFjdG9yeSIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm51bVBhZ2VzIildKTsKICAgICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHsKICAgICAgICBudW1QYWdlcyA9IHRoaXMubGluZWFyaXphdGlvbi5udW1QYWdlczsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1QYWdlcyA9IGNhdGFsb2cubnVtUGFnZXM7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bVBhZ2VzKSkgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpcyBub3QgYW4gaW50ZWdlci4iKTsKICAgICAgfSBlbHNlIGlmIChudW1QYWdlcyA8PSAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMuZ2V0UGFnZShudW1QYWdlcyAtIDEpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5kZWxldGUobnVtUGFnZXMgLSAxKTsKICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgIHRocm93IG5ldyBYUmVmUGFyc2VFeGNlcHRpb24oKTsKICAgICAgfQogICAgICB3YXJuKGBjaGVja0xhc3RQYWdlIC0gaW52YWxpZCAvUGFnZXMgdHJlZSAvQ291bnQ6ICR7bnVtUGFnZXN9LmApOwogICAgICBsZXQgcGFnZXNUcmVlOwogICAgICB0cnkgewogICAgICAgIHBhZ2VzVHJlZSA9IGF3YWl0IGNhdGFsb2cuZ2V0QWxsUGFnZURpY3RzKHJlY292ZXJ5TW9kZSk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbkFsbCkgewogICAgICAgIGlmIChyZWFzb25BbGwgaW5zdGFuY2VvZiBYUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgICAgdGhyb3cgbmV3IFhSZWZQYXJzZUV4Y2VwdGlvbigpOwogICAgICAgIH0KICAgICAgICBjYXRhbG9nLnNldEFjdHVhbE51bVBhZ2VzKDEpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IFtwYWdlSW5kZXgsIFtwYWdlRGljdCwgcmVmXV0gb2YgcGFnZXNUcmVlKSB7CiAgICAgICAgbGV0IHByb21pc2U7CiAgICAgICAgaWYgKHBhZ2VEaWN0IGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlamVjdChwYWdlRGljdCk7CiAgICAgICAgICBwcm9taXNlLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShuZXcgUGFnZSh7CiAgICAgICAgICAgIHBkZk1hbmFnZXIsCiAgICAgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgICAgICAgcGFnZUluZGV4LAogICAgICAgICAgICBwYWdlRGljdCwKICAgICAgICAgICAgcmVmLAogICAgICAgICAgICBnbG9iYWxJZEZhY3Rvcnk6IHRoaXMuX2dsb2JhbElkRmFjdG9yeSwKICAgICAgICAgICAgZm9udENhY2hlOiBjYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogY2F0YWxvZy5idWlsdEluQ01hcENhY2hlLAogICAgICAgICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IGNhdGFsb2cuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiBjYXRhbG9nLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgICAgICAgIHN5c3RlbUZvbnRDYWNoZTogY2F0YWxvZy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgICAgICAgIG5vbkJsZW5kTW9kZXNTZXQ6IGNhdGFsb2cubm9uQmxlbmRNb2Rlc1NldCwKICAgICAgICAgICAgeGZhRmFjdG9yeTogbnVsbAogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wYWdlUHJvbWlzZXMuc2V0KHBhZ2VJbmRleCwgcHJvbWlzZSk7CiAgICAgIH0KICAgICAgY2F0YWxvZy5zZXRBY3R1YWxOdW1QYWdlcyhwYWdlc1RyZWUuc2l6ZSk7CiAgICB9CiAgfQogIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgewogICAgcmV0dXJuIHRoaXMuY2F0YWxvZy5mb250RmFsbGJhY2soaWQsIGhhbmRsZXIpOwogIH0KICBhc3luYyBjbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkID0gZmFsc2UpIHsKICAgIHJldHVybiB0aGlzLmNhdGFsb2cgPyB0aGlzLmNhdGFsb2cuY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCkgOiBjbGVhckdsb2JhbENhY2hlcygpOwogIH0KICBhc3luYyAjY29sbGVjdEZpZWxkT2JqZWN0cyhuYW1lLCBwYXJlbnRSZWYsIGZpZWxkUmVmLCBwcm9taXNlcywgYW5ub3RhdGlvbkdsb2JhbHMsIHZpc2l0ZWRSZWZzLCBvcnBoYW5GaWVsZHMpIHsKICAgIGNvbnN0IHsKICAgICAgeHJlZgogICAgfSA9IHRoaXM7CiAgICBpZiAoIShmaWVsZFJlZiBpbnN0YW5jZW9mIFJlZikgfHwgdmlzaXRlZFJlZnMuaGFzKGZpZWxkUmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2aXNpdGVkUmVmcy5wdXQoZmllbGRSZWYpOwogICAgY29uc3QgZmllbGQgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmMoZmllbGRSZWYpOwogICAgaWYgKCEoZmllbGQgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZmllbGQuaGFzKCJUIikpIHsKICAgICAgY29uc3QgcGFydE5hbWUgPSBzdHJpbmdUb1BERlN0cmluZyhhd2FpdCBmaWVsZC5nZXRBc3luYygiVCIpKTsKICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICB9IGVsc2UgewogICAgICBsZXQgb2JqID0gZmllbGQ7CiAgICAgI
20HdoaWxlICh0cnVlKSB7CiAgICAgICAgb2JqID0gb2JqLmdldFJhdygiUGFyZW50IikgfHwgcGFyZW50UmVmOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWYpIHsKICAgICAgICAgIGlmICh2aXNpdGVkUmVmcy5oYXMob2JqKSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIG9iaiA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhvYmopOwogICAgICAgIH0KICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChvYmouaGFzKCJUIikpIHsKICAgICAgICAgIGNvbnN0IHBhcnROYW1lID0gc3RyaW5nVG9QREZTdHJpbmcoYXdhaXQgb2JqLmdldEFzeW5jKCJUIikpOwogICAgICAgICAgbmFtZSA9IG5hbWUgPT09ICIiID8gcGFydE5hbWUgOiBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwYXJlbnRSZWYgJiYgIWZpZWxkLmhhcygiUGFyZW50IikgJiYgaXNOYW1lKGZpZWxkLmdldCgiU3VidHlwZSIpLCAiV2lkZ2V0IikpIHsKICAgICAgb3JwaGFuRmllbGRzLnB1dChmaWVsZFJlZiwgcGFyZW50UmVmKTsKICAgIH0KICAgIGlmICghcHJvbWlzZXMuaGFzKG5hbWUpKSB7CiAgICAgIHByb21pc2VzLnNldChuYW1lLCBbXSk7CiAgICB9CiAgICBwcm9taXNlcy5nZXQobmFtZSkucHVzaChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUoeHJlZiwgZmllbGRSZWYsIGFubm90YXRpb25HbG9iYWxzLCBudWxsLCB0cnVlLCBvcnBoYW5GaWVsZHMsIG51bGwpLnRoZW4oYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uPy5nZXRGaWVsZE9iamVjdCgpKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgIHdhcm4oYCNjb2xsZWN0RmllbGRPYmplY3RzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9KSk7CiAgICBpZiAoIWZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGtpZHMgPSBhd2FpdCBmaWVsZC5nZXRBc3luYygiS2lkcyIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIGF3YWl0IHRoaXMuI2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwgZmllbGRSZWYsIGtpZCwgcHJvbWlzZXMsIGFubm90YXRpb25HbG9iYWxzLCB2aXNpdGVkUmVmcywgb3JwaGFuRmllbGRzKTsKICAgICAgfQogICAgfQogIH0KICBnZXQgZmllbGRPYmplY3RzKCkgewogICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZvcm1JbmZvIikudGhlbihhc3luYyBmb3JtSW5mbyA9PiB7CiAgICAgIGlmICghZm9ybUluZm8uaGFzRmllbGRzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgW2Fubm90YXRpb25HbG9iYWxzLCBhY3JvRm9ybV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiYW5ub3RhdGlvbkdsb2JhbHMiKSwgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIildKTsKICAgICAgaWYgKCFhbm5vdGF0aW9uR2xvYmFscykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHZpc2l0ZWRSZWZzID0gbmV3IFJlZlNldCgpOwogICAgICBjb25zdCBhbGxGaWVsZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBjb25zdCBmaWVsZFByb21pc2VzID0gbmV3IE1hcCgpOwogICAgICBjb25zdCBvcnBoYW5GaWVsZHMgPSBuZXcgUmVmU2V0Q2FjaGUoKTsKICAgICAgZm9yIChjb25zdCBmaWVsZFJlZiBvZiBhd2FpdCBhY3JvRm9ybS5nZXRBc3luYygiRmllbGRzIikpIHsKICAgICAgICBhd2FpdCB0aGlzLiNjb2xsZWN0RmllbGRPYmplY3RzKCIiLCBudWxsLCBmaWVsZFJlZiwgZmllbGRQcm9taXNlcywgYW5ub3RhdGlvbkdsb2JhbHMsIHZpc2l0ZWRSZWZzLCBvcnBoYW5GaWVsZHMpOwogICAgICB9CiAgICAgIGNvbnN0IGFsbFByb21pc2VzID0gW107CiAgICAgIGZvciAoY29uc3QgW25hbWUsIHByb21pc2VzXSBvZiBmaWVsZFByb21pc2VzKSB7CiAgICAgICAgYWxsUHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmaWVsZHMgPT4gewogICAgICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKTsKICAgICAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBhbGxGaWVsZHNbbmFtZV0gPSBmaWVsZHM7CiAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICB9CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFsbFByb21pc2VzKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBhbGxGaWVsZHMsCiAgICAgICAgb3JwaGFuRmllbGRzCiAgICAgIH07CiAgICB9KTsKICAgIHJldHVybiBzaGFkb3codGhpcywgImZpZWxkT2JqZWN0cyIsIHByb21pc2UpOwogIH0KICBnZXQgaGFzSlNBY3Rpb25zKCkgewogICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoIl9wYXJzZUhhc0pTQWN0aW9ucyIpOwogICAgcmV0dXJuIHNoYWRvdyh0aGlzLCAiaGFzSlNBY3Rpb25zIiwgcHJvbWlzZSk7CiAgfQogIGFzeW5jIF9wYXJzZUhhc0pTQWN0aW9ucygpIHsKICAgIGNvbnN0IFtjYXRhbG9nSnNBY3Rpb25zLCBmaWVsZE9iamVjdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMucGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJqc0FjdGlvbnMiKSwgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiZmllbGRPYmplY3RzIildKTsKICAgIGlmIChjYXRhbG9nSnNBY3Rpb25zKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKGZpZWxkT2JqZWN0cykgewogICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhmaWVsZE9iamVjdHMuYWxsRmllbGRzKS5zb21lKGZpZWxkT2JqZWN0ID0+IGZpZWxkT2JqZWN0LnNvbWUob2JqZWN0ID0+IG9iamVjdC5hY3Rpb25zICE9PSBudWxsKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCkgewogICAgY29uc3QgY2FsY3VsYXRpb25PcmRlciA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybT8uZ2V0KCJDTyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF
205KGNhbGN1bGF0aW9uT3JkZXIpIHx8IGNhbGN1bGF0aW9uT3JkZXIubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgImNhbGN1bGF0aW9uT3JkZXJJZHMiLCBudWxsKTsKICAgIH0KICAgIGNvbnN0IGlkcyA9IFtdOwogICAgZm9yIChjb25zdCBpZCBvZiBjYWxjdWxhdGlvbk9yZGVyKSB7CiAgICAgIGlmIChpZCBpbnN0YW5jZW9mIFJlZikgewogICAgICAgIGlkcy5wdXNoKGlkLnRvU3RyaW5nKCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJjYWxjdWxhdGlvbk9yZGVySWRzIiwgaWRzLmxlbmd0aCA/IGlkcyA6IG51bGwpOwogIH0KICBnZXQgYW5ub3RhdGlvbkdsb2JhbHMoKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJhbm5vdGF0aW9uR2xvYmFscyIsIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUdsb2JhbHModGhpcy5wZGZNYW5hZ2VyKSk7CiAgfQp9Cgo7Ly8gLi9zcmMvY29yZS9wZGZfbWFuYWdlci5qcwoKCgoKCmZ1bmN0aW9uIHBhcnNlRG9jQmFzZVVybCh1cmwpIHsKICBpZiAodXJsKSB7CiAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwodXJsKTsKICAgIGlmIChhYnNvbHV0ZVVybCkgewogICAgICByZXR1cm4gYWJzb2x1dGVVcmwuaHJlZjsKICAgIH0KICAgIHdhcm4oYEludmFsaWQgYWJzb2x1dGUgZG9jQmFzZVVybDogIiR7dXJsfSIuYCk7CiAgfQogIHJldHVybiBudWxsOwp9CmNsYXNzIEJhc2VQZGZNYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcihhcmdzKSB7CiAgICB0aGlzLl9kb2NCYXNlVXJsID0gcGFyc2VEb2NCYXNlVXJsKGFyZ3MuZG9jQmFzZVVybCk7CiAgICB0aGlzLl9kb2NJZCA9IGFyZ3MuZG9jSWQ7CiAgICB0aGlzLl9wYXNzd29yZCA9IGFyZ3MucGFzc3dvcmQ7CiAgICB0aGlzLmVuYWJsZVhmYSA9IGFyZ3MuZW5hYmxlWGZhOwogICAgYXJncy5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmPSBGZWF0dXJlVGVzdC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDsKICAgIGFyZ3MuZXZhbHVhdG9yT3B0aW9ucy5pc0ltYWdlRGVjb2RlclN1cHBvcnRlZCAmJj0gRmVhdHVyZVRlc3QuaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQ7CiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBPYmplY3QuZnJlZXplKGFyZ3MuZXZhbHVhdG9yT3B0aW9ucyk7CiAgfQogIGdldCBkb2NJZCgpIHsKICAgIHJldHVybiB0aGlzLl9kb2NJZDsKICB9CiAgZ2V0IHBhc3N3b3JkKCkgewogICAgcmV0dXJuIHRoaXMuX3Bhc3N3b3JkOwogIH0KICBnZXQgZG9jQmFzZVVybCgpIHsKICAgIHJldHVybiB0aGlzLl9kb2NCYXNlVXJsOwogIH0KICBnZXQgY2F0YWxvZygpIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmNhdGFsb2c7CiAgfQogIGVuc3VyZURvYyhwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudCwgcHJvcCwgYXJncyk7CiAgfQogIGVuc3VyZVhSZWYocHJvcCwgYXJncykgewogICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQueHJlZiwgcHJvcCwgYXJncyk7CiAgfQogIGVuc3VyZUNhdGFsb2cocHJvcCwgYXJncykgewogICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZywgcHJvcCwgYXJncyk7CiAgfQogIGdldFBhZ2UocGFnZUluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgfQogIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKTsKICB9CiAgbG9hZFhmYUZvbnRzKGhhbmRsZXIsIHRhc2spIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmxvYWRYZmFGb250cyhoYW5kbGVyLCB0YXNrKTsKICB9CiAgbG9hZFhmYUltYWdlcygpIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmxvYWRYZmFJbWFnZXMoKTsKICB9CiAgc2VyaWFsaXplWGZhRGF0YShhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuc2VyaWFsaXplWGZhRGF0YShhbm5vdGF0aW9uU3RvcmFnZSk7CiAgfQogIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCk7CiAgfQogIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGVuc3VyZWAgY2FsbGVkIik7CiAgfQogIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CiAgICB1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGByZXF1ZXN0UmFuZ2VgIGNhbGxlZCIpOwogIH0KICByZXF1ZXN0TG9hZGVkU3RyZWFtKG5vRmV0Y2ggPSBmYWxzZSkgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdExvYWRlZFN0cmVhbWAgY2FsbGVkIik7CiAgfQogIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHsKICAgIHVucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYHNlbmRQcm9ncmVzc2l2ZURhdGFgIGNhbGxlZCIpOwogIH0KICB1cGRhdGVQYXNzd29yZChwYXNzd29yZCkgewogICAgdGhpcy5fcGFzc3dvcmQgPSBwYXNzd29yZDsKICB9CiAgdGVybWluYXRlKHJlYXNvbikgewogICAgdW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgdGVybWluYXRlYCBjYWxsZWQiKTsKICB9Cn0KY2xhc3MgTG9jYWxQZGZNYW5hZ2VyIGV4dGVuZHMgQmFzZVBkZk1hbmFnZXIgewogIGNvbnN0cnVjdG9yKGFyZ3MpIHsKICAgIHN1cGVyKGFyZ3MpOwogICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbShhcmdzLnNvdXJjZSk7CiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IFBERkRvY3VtZW50KHRoaXMsIHN0cmVhbSk7CiAgICB0aGlzLl9sb2FkZWRTdHJlYW1Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHN0cmVhbSk7CiAgfQogIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHsKICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICByZXR1cm4gdmFsdWUuYXBwbHkob2JqLCBhcmdzKTsKICAgIH0KICAgIHJldHVybi
20B2YWx1ZTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICB9CiAgcmVxdWVzdExvYWRlZFN0cmVhbShub0ZldGNoID0gZmFsc2UpIHsKICAgIHJldHVybiB0aGlzLl9sb2FkZWRTdHJlYW1Qcm9taXNlOwogIH0KICB0ZXJtaW5hdGUocmVhc29uKSB7fQp9CmNsYXNzIE5ldHdvcmtQZGZNYW5hZ2VyIGV4dGVuZHMgQmFzZVBkZk1hbmFnZXIgewogIGNvbnN0cnVjdG9yKGFyZ3MpIHsKICAgIHN1cGVyKGFyZ3MpOwogICAgdGhpcy5zdHJlYW1NYW5hZ2VyID0gbmV3IENodW5rZWRTdHJlYW1NYW5hZ2VyKGFyZ3Muc291cmNlLCB7CiAgICAgIG1zZ0hhbmRsZXI6IGFyZ3MuaGFuZGxlciwKICAgICAgbGVuZ3RoOiBhcmdzLmxlbmd0aCwKICAgICAgZGlzYWJsZUF1dG9GZXRjaDogYXJncy5kaXNhYmxlQXV0b0ZldGNoLAogICAgICByYW5nZUNodW5rU2l6ZTogYXJncy5yYW5nZUNodW5rU2l6ZQogICAgfSk7CiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IFBERkRvY3VtZW50KHRoaXMsIHRoaXMuc3RyZWFtTWFuYWdlci5nZXRTdHJlYW0oKSk7CiAgfQogIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW3Byb3BdOwogICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KG9iaiwgYXJncyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBNaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICBhd2FpdCB0aGlzLnJlcXVlc3RSYW5nZShleC5iZWdpbiwgZXguZW5kKTsKICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlKG9iaiwgcHJvcCwgYXJncyk7CiAgICB9CiAgfQogIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKTsKICB9CiAgcmVxdW
20VzdExvYWRlZFN0cmVhbShub0ZldGNoID0gZmFsc2UpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbU1hbmFnZXIucmVxdWVzdEFsbENodW5rcyhub0ZldGNoKTsKICB9CiAgc2VuZFByb2dyZXNzaXZlRGF0YShjaHVuaykgewogICAgdGhpcy5zdHJlYW1NYW5hZ2VyLm9uUmVjZWl2ZURhdGEoewogICAgICBjaHVuawogICAgfSk7CiAgfQogIHRlcm1pbmF0ZShyZWFzb24pIHsKICAgIHRoaXMuc3RyZWFtTWFuYWdlci5hYm9ydChyZWFzb24pOwogIH0KfQoKOy8vIC4vc3JjL3NoYXJlZC9tZXNzYWdlX2hhbmRsZXIuanMKCgoKY29uc3QgQ2FsbGJhY2tLaW5kID0gewogIERBVEE6IDEsCiAgRVJST1I6IDIKfTsKY29uc3QgU3RyZWFtS2luZCA9IHsKICBDQU5DRUw6IDEsCiAgQ0FOQ0VMX0NPTVBMRVRFOiAyLAogIENMT1NFOiAzLAogIEVOUVVFVUU6IDQsCiAgRVJST1I6IDUsCiAgUFVMTDogNiwKICBQVUxMX0NPTVBMRVRFOiA3LAogIFNUQVJUX0NPTVBMRVRFOiA4Cn07CmZ1bmN0aW9uIG9uRm4oKSB7fQpmdW5jdGlvbiB3cmFwUmVhc29uKGV4KSB7CiAgaWYgKGV4IGluc3RhbmNlb2YgQWJvcnRFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBJbnZhbGlkUERGRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgTWlzc2luZ1BERkV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIFBhc3N3b3JkRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIHx8IGV4IGluc3RhbmNlb2YgVW5rbm93bkVycm9yRXhjZXB0aW9uKSB7CiAgICByZXR1cm4gZXg7CiAgfQogIGlmICghKGV4IGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGV4ID09PSAib2JqZWN0IiAmJiBleCAhPT0gbnVsbCkpIHsKICAgIHVucmVhY2hhYmxlKCd3cmFwUmVhc29uOiBFeHBlY3RlZCAicmVhc29uIiB0byBiZSBhIChwb3NzaWJseSBjbG9uZWQpIEVycm9yLicpOwogIH0KICBzd2l0Y2ggKGV4Lm5hbWUpIHsKICAgIGNhc2UgIkFib3J0RXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBBYm9ydEV4Y2VwdGlvbihleC5tZXNzYWdlKTsKICAgIGNhc2UgIkludmFsaWRQREZFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IEludmFsaWRQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7CiAgICBjYXNlICJNaXNzaW5nUERGRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBNaXNzaW5nUERGRXhjZXB0aW9uKGV4Lm1lc3NhZ2UpOwogICAgY2FzZSAiUGFzc3dvcmRFeGNlcHRpb24iOgogICAgICByZXR1cm4gbmV3IFBhc3N3b3JkRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmNvZGUpOwogICAgY2FzZSAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguc3Rh
20dHVzKTsKICAgIGNhc2UgIlVua25vd25FcnJvckV4Y2VwdGlvbiI6CiAgICAgIHJldHVybiBuZXcgVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmRldGFpbHMpOwogIH0KICByZXR1cm4gbmV3IFVua25vd25FcnJvckV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC50b1N0cmluZygpKTsKfQpjbGFzcyBNZXNzYWdlSGFuZGxlciB7CiAgI21lc3NhZ2VBQyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTsKICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBjb21PYmopIHsKICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7CiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lOwogICAgdGhpcy5jb21PYmogPSBjb21PYmo7CiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOwogICAgdGhpcy5zdHJlYW1JZCA9IDE7CiAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29tT2JqLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCB0aGlzLiNvbk1lc3NhZ2UuYmluZCh0aGlzKSwgewogICAgICBzaWduYWw6IHRoaXMuI21lc3NhZ2VBQy5zaWduYWwKICAgIH0pOwogIH0KICAjb25NZXNzYWdlKHsKICAgIGRhdGEKICB9KSB7CiAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRhdGEuc3RyZWFtKSB7CiAgICAgIHRoaXMuI3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZGF0YS5jYWxsYmFjaykgewogICAgICBjb25zdCBjYWxsYmFja0lkID0gZGF0YS5jYWxsYmFja0lkOwogICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKICAgICAgaWYgKCFjYXBhYmlsaXR5KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVzb2x2ZSBjYWxsYmFjayAke2NhbGxiYWNrSWR9YCk7CiAgICAgIH0KICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07CiAgICAgIGlmIChkYXRhLmNhbGxiYWNrID09PSBDYWxsYmFja0tpbmQuREFUQSkgewogICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShkYXRhLmRhdGEpOwogICAgICB9IGVsc2UgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5FUlJPUikgewogICAgICAgIGNhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZSIpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CiAgICBpZiAoIWFjdGlvbikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYWN0aW9uIGZyb20gd29ya2VyOiAke2RhdGEuYWN0aW9ufWApOwogICAgfQogICAgaWYgKGRhdGEuY2FsbGJhY2tJZCkgewogICAgICBjb25zdCBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLAogICAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7CiAgICAgIFByb21pc2UudHJ5KGFjdGlvbiwgZGF0YS5kYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkRBVEEsCiAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsCiAgICAgICAgICBkYXRhOiByZXN1bHQKICAgICAgICB9KTsKICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuRVJST1IsCiAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGRhdGEuc3RyZWFtSWQpIHsKICAgICAgdGhpcy4jY3JlYXRlU3RyZWFtU2luayhkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYWN0aW9uKGRhdGEuZGF0YSk7CiAgfQogIG9uKGFjdGlvbk5hbWUsIGhhbmRsZXIpIHsKICAgIGNvbnN0IGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyOwogICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCAiJHthY3Rpb25OYW1lfSJgKTsKICAgIH0KICAgIGFoW2FjdGlvbk5hbWVdID0gaGFuZGxlcjsKICB9CiAgc2VuZChhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHsKICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLAogICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsCiAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKICAgICAgZGF0YQogICAgfSwgdHJhbnNmZXJzKTsKICB9CiAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykgewogICAgY29uc3QgY2FsbGJhY2tJZCA9IHRoaXMuY2FsbGJhY2tJZCsrOwogICAgY29uc3QgY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7CiAgICB0cnkgewogICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLAogICAgICAgI
20HRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSwKICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsCiAgICAgICAgY2FsbGJhY2tJZCwKICAgICAgICBkYXRhCiAgICAgIH0sIHRyYW5zZmVycyk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7CiAgICB9CiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlOwogIH0KICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lLCBkYXRhLCBxdWV1ZWluZ1N0cmF0ZWd5LCB0cmFuc2ZlcnMpIHsKICAgIGNvbnN0IHN0cmVhbUlkID0gdGhpcy5zdHJlYW1JZCsrLAogICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLAogICAgICB0YXJnZXROYW1lID0gdGhpcy50YXJnZXROYW1lLAogICAgICBjb21PYmogPSB0aGlzLmNvbU9iajsKICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oewogICAgICBzdGFydDogY29udHJvbGxlciA9PiB7CiAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7CiAgICAgICAgICBjb250cm9sbGVyLAogICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksCiAgICAgICAgICBwdWxsQ2FsbDogbnVsbCwKICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsCiAgICAgICAgICBpc0Nsb3NlZDogZmFsc2UKICAgICAgICB9OwogICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgZGF0YSwKICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplCiAgICAgICAgfSwgdHJhbnNmZXJzKTsKICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0sCiAgICAgIHB1bGw6IGNvbnRyb2xsZXIgPT4gewogICAgICAgIGNvbnN0IHB1bGxDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwgPSBwdWxsQ2FwYWJpbGl0eTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCwKICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcHVsbENhcGFiaWxpdHkucHJvbWlzZTsKICAgICAgfSwKICAgICAgY2FuY2VsOiByZWFzb24gPT4gewogICAgICAgIGFzc2VydChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTsKICAgICAgICBjb25zdCBjYW5jZWxDYXBhYmlsaXR5ID0gUHJvbWlzZS53aXRoUmVzb2x2ZXJzKCk7CiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCA9IGNhbmNlbENhcGFiaWxpdHk7CiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlOwogICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGNhbmNlbENhcGFiaWxpdHkucHJvbWlzZTsKICAgICAgfQogICAgfSwgcXVldWVpbmdTdHJhdGVneSk7CiAgfQogICNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpIHsKICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCwKICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSwKICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7CiAgICBjb25zdCBzZWxmID0gdGhpcywKICAgICAgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTsKICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7CiAgICAgIGVucXVldWUoY2h1bmssIHNpemUgPSAxLCB0cmFuc2ZlcnMpIHsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBsYXN0RGVzaXJlZFNpemUgPSB0aGlzLmRlc2lyZWRTaXplOwogICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTsKICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHsKICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBQcm9taXNlLndpdGhSZXNvbHZlcnMoKTsKICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgICAgfQogICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FTlFVRVVFLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICBjaHVuawogICAgICAgIH0sIHRyYW5zZmVycyk7CiAgICAgIH0sCiAgICAgIGNsb3NlKCkgewogICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlOwogICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DTE9TRSwKICAgICAgICAgIHN0cmVhbUlkCiAgICAgICAgfSk7CiAgICAgICAgZGVsZXRlIHNlbGYuc3RyZWFtU2lua3Nbc3RyZWFtSWRdOwogICAgICB9LAogICAgICBlcnJvcihyZWFzb24pIHsKICAgICAgICBhc3NlcnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJlcnJvciBtdXN0IGhh
20dmUgYSB2YWxpZCByZWFzb24iKTsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIHNpbmtDYXBhYmlsaXR5OiBQcm9taXNlLndpdGhSZXNvbHZlcnMoKSwKICAgICAgb25QdWxsOiBudWxsLAogICAgICBvbkNhbmNlbDogbnVsbCwKICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLAogICAgICBkZXNpcmVkU2l6ZTogZGF0YS5kZXNpcmVkU2l6ZSwKICAgICAgcmVhZHk6IG51bGwKICAgIH07CiAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTsKICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7CiAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSA9IHN0cmVhbVNpbms7CiAgICBQcm9taXNlLnRyeShhY3Rpb24sIGRhdGEuZGF0YSwgc3RyZWFtU2luaykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgc291cmNlTmFtZSwKICAgICAgICB0YXJnZXROYW1lLAogICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSwKICAgICAgICBzdHJlYW1JZCwKICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgIH0pOwogICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCiAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbikKICAgICAgfSk7CiAgICB9KTsKICB9CiAgI3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpIHsKICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCwKICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSwKICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSwKICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7CiAgICBjb25zdCBzdHJlYW1Db250cm9sbGVyID0gdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sCiAgICAgIHN0cmVhbVNpbmsgPSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHsKICAgICAgY2FzZSBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFOgogICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFOgogICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGwucmVzb2x2ZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDoKICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLAogICAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbVNpbmsuZGVzaXJlZFNpemUgPD0gMCAmJiBkYXRhLmRlc2lyZWRTaXplID4gMCkgewogICAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7CiAgICAgICAgfQogICAgICAgIHN0cmVhbVNpbmsuZGVzaXJlZFNpemUgPSBkYXRhLmRlc2lyZWRTaXplOwogICAgICAgIFByb21pc2UudHJ5KHN0cmVhbVNpbmsub25QdWxsIHx8IG9uRm4pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6CiAgICAgICAgYXNzZXJ0KHN0cmVhbUNvbnRyb2xsZXIsICJlbnF1ZXVlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkNMT1NFOgogICAgICAgIGFzc2VydChzdHJlYW1Db250cm9sbGVyLCAiY2xvc2Ugc2hvdWxkIGhh
20dmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQgPSB0cnVlOwogICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5jbG9zZSgpOwogICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6CiAgICAgICAgYXNzZXJ0KHN0cmVhbUNvbnRyb2xsZXIsICJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOwogICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcih3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgdGhpcy4jZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEU6CiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOgogICAgICAgIGlmICghc3RyZWFtU2luaykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRhdGFSZWFzb24gPSB3cmFwUmVhc29uKGRhdGEucmVhc29uKTsKICAgICAgICBQcm9taXNlLnRyeShzdHJlYW1TaW5rLm9uQ2FuY2VsIHx8IG9uRm4sIGRhdGFSZWFzb24pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZWplY3QoZGF0YVJlYXNvbik7CiAgICAgICAgc3RyZWFtU2luay5pc0NhbmNlbGxlZCA9IHRydWU7CiAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBzdHJlYW0gY2FzZSIpOwogICAgfQogIH0KICBhc3luYyAjZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCkgewogICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbD8ucHJvbWlzZSwgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbD8ucHJvbWlzZSwgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsPy5wcm9taXNlXSk7CiAgICBkZWxldGUgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF07CiAgfQogIGRlc3Ryb3koKSB7CiAgICB0aGlzLiNtZXNzYWdlQUM/LmFib3J0KCk7CiAgICB0aGlzLiNtZXNzYWdlQUMgPSBudWxsOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvd3JpdGVyLmpzCgoKCgoKCgoKCgoKCgoKCgoKYXN5bmMgZnVuY3Rpb24gd3JpdGVPYmplY3QocmVmLCBvYmosIGJ1ZmZlciwgewogIGVuY3J5cHQgPSBudWxsCn0pIHsKICBjb25zdCB0cmFuc2Zvcm0gPSBlbmNyeXB0Py5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0ocmVmLm51bSwgcmVmLmdlbik7CiAgYnVmZmVyLnB1c2goYCR7cmVmLm51bX0gJHtyZWYuZ2VufSBvYmpcbmApOwogIGlmIChvYmogaW5zdGFuY2VvZiBEaWN0KSB7CiAgICBhd2FpdCB3cml0ZURpY3Qob2JqLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCYXNlU3RyZWFtKSB7CiAgICBhd2FpdCB3cml0ZVN0cmVhbShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSkgewogICAgYXdhaXQgd3JpdGVBcnJheShvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9CiAgYnVmZmVyLnB1c2goIlxuZW5kb2JqXG4iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZURpY3QoZGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBidWZmZXIucHVzaCgiPDwiKTsKICBmb3IgKGNvbnN0IGtleSBvZiBkaWN0LmdldEtleXMoKSkgewogICAgYnVmZmVyLnB1c2goYCAvJHtlc2NhcGVQREZOYW1lKGtleSl9IGApOwogICAgYXdhaXQgd3JpdGVWYWx1ZShkaWN0LmdldFJhdyhrZXkpLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCI+PiIpOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlU3RyZWFtKHN0cmVhbSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBsZXQgYnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKTsKICBjb25zdCB7CiAgICBkaWN0CiAgfSA9IHN0cmVhbTsKICBjb25zdCBbZmlsdGVyLCBwYXJhbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2RpY3QuZ2V0QXN5bmMoIkZpbHRlciIpLCBkaWN0LmdldEFzeW5jKCJEZWNvZGVQYXJtcyIpXSk7CiAgY29uc3QgZmlsdGVyWmVybyA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGF3YWl0IGRpY3QueHJlZi5mZXRjaElmUmVmQXN5bmMoZmlsdGVyWzBdKSA6IGZpbHRlcjsKICBjb25zdCBpc0ZpbHRlclplcm9GbGF0ZURlY29kZSA9IGlzTmFtZShmaWx0ZXJa
20ZXJvLCAiRmxhdGVEZWNvZGUiKTsKICBjb25zdCBNSU5fTEVOR1RIX0ZPUl9DT01QUkVTU0lORyA9IDI1NjsKICBpZiAoYnl0ZXMubGVuZ3RoID49IE1JTl9MRU5HVEhfRk9SX0NPTVBSRVNTSU5HIHx8IGlzRmlsdGVyWmVyb0ZsYXRlRGVjb2RlKSB7CiAgICB0cnkgewogICAgICBjb25zdCBjcyA9IG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZGVmbGF0ZSIpOwogICAgICBjb25zdCB3cml0ZXIgPSBjcy53cml0YWJsZS5nZXRXcml0ZXIoKTsKICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5OwogICAgICB3cml0ZXIud3JpdGUoYnl0ZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgIGF3YWl0IHdyaXRlci5yZWFkeTsKICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTsKICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICBjb25zdCBidWYgPSBhd2FpdCBuZXcgUmVzcG9uc2UoY3MucmVhZGFibGUpLmFycmF5QnVmZmVyKCk7CiAgICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKICAgICAgbGV0IG5ld0ZpbHRlciwgbmV3UGFyYW1zOwogICAgICBpZiAoIWZpbHRlcikgewogICAgICAgIG5ld0ZpbHRlciA9IE5hbWUuZ2V0KCJGbGF0ZURlY29kZSIpOwogICAgICB9IGVsc2UgaWYgKCFpc0ZpbHRlclplcm9GbGF0ZURlY29kZSkgewogICAgICAgIG5ld0ZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgLi4uZmlsdGVyXSA6IFtOYW1lLmdldCgiRmxhdGVEZWNvZGUiKSwgZmlsdGVyXTsKICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICBuZXdQYXJhbXMgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgPyBbbnVsbCwgLi4ucGFyYW1zXSA6IFtudWxsLCBwYXJhbXNdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobmV3RmlsdGVyKSB7CiAgICAgICAgZGljdC5zZXQoIkZpbHRlciIsIG5ld0ZpbHRlcik7CiAgICAgIH0KICAgICAgaWYgKG5ld1BhcmFtcykgewogICAgICAgIGRpY3Quc2V0KCJEZWNvZGVQYXJtcyIsIG5ld1BhcmFtcyk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGluZm8oYHdyaXRlU3RyZWFtIC0gY2Fubm90IGNvbXByZXNzIGRhdGE6ICIke2V4fSIuYCk7CiAgICB9CiAgfQogIGxldCBzdHJpbmcgPSBieXRlc1RvU3RyaW5nKGJ5dGVzKTsKICBpZiAodHJhbnNmb3JtKSB7CiAgICBzdHJpbmcgPSB0cmFuc2Zvcm0uZW5jcnlwdFN0cmluZyhzdHJpbmcpOwogIH0KICBkaWN0LnNldCgiTGVuZ3RoIiwgc3RyaW5nLmxlbmd0aCk7CiAgYXdhaXQgd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIiwgc3RyaW5nLCAiXG5lbmRzdHJlYW0iKTsKfQphc3luYyBmdW5jdGlvbiB3cml0ZUFycmF5KGFycmF5LCBidWZmZXIsIHRyYW5zZm9ybSkgewogIGJ1ZmZlci5wdXNoKCJbIik7CiAgbGV0IGZpcnN0ID0gdHJ1ZTsKICBmb3IgKGNvbnN0IHZhbCBvZiBhcnJheSkgewogICAgaWYgKCFmaXJzdCkgewogICAgICBidWZmZXIucHVzaCgiICIpOwogICAgfSBlbHNlIHsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGF3YWl0IHdyaXRlVmFsdWUodmFsLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCJdIik7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOYW1lKSB7CiAgICBidWZmZXIucHVzaChgLyR7ZXNjYXBlUERGTmFtZSh2YWx1ZS
205uYW1lKX1gKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmKSB7CiAgICBidWZmZXIucHVzaChgJHt2YWx1ZS5udW19ICR7dmFsdWUuZ2VufSBSYCk7CiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7CiAgICBhd2FpdCB3cml0ZUFycmF5KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIHZhbHVlID0gdHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcodmFsdWUpOwogICAgfQogICAgYnVmZmVyLnB1c2goYCgke2VzY2FwZVN0cmluZyh2YWx1ZSl9KWApOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgewogICAgYnVmZmVyLnB1c2gobnVtYmVyVG9TdHJpbmcodmFsdWUpKTsKICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICBidWZmZXIucHVzaCh2YWx1ZS50b1N0cmluZygpKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGljdCkgewogICAgYXdhaXQgd3JpdGVEaWN0KHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2VTdHJlYW0pIHsKICAgIGF3YWl0IHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgYnVmZmVyLnB1c2goIm51bGwiKTsKICB9IGVsc2UgewogICAgd2FybihgVW5oYW5kbGVkIHZhbHVlIGluIHdyaXRlcjogJHt0eXBlb2YgdmFsdWV9LCBwbGVhc2UgZmlsZSBhIGJ1Zy5gKTsKICB9Cn0KZnVuY3Rpb24gd3JpdGVJbnQobnVtYmVyLCBzaXplLCBvZmZzZXQsIGJ1ZmZlcikgewogIGZvciAobGV0IGkgPSBzaXplICsgb2Zmc2V0IC0gMTsgaSA+IG9mZnNldCAtIDE7IGktLSkgewogICAgYnVmZmVyW2ldID0gbnVtYmVyICYgMHhmZjsKICAgIG51bWJlciA+Pj0gODsKICB9CiAgcmV0dXJuIG9mZnNldCArIHNpemU7Cn0KZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyaW5nLCBvZmZzZXQsIGJ1ZmZlcikgewogIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHJpbmcubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICB9Cn0KZnVuY3Rpb24gY29tcHV0ZU1ENShmaWxlc2l6ZSwgeHJlZkluZm8pIHsKICBjb25zdCB0aW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7CiAgY29uc3QgZmlsZW5hbWUgPSB4cmVmSW5mby5maWxlbmFtZSB8fCAiIjsKICBjb25zdCBtZDVCdWZmZXIgPSBbdGltZS50b1N0cmluZygpLCBmaWxlbmFtZSwgZmlsZXNpemUudG9TdHJpbmcoKV07CiAgbGV0IG1kNUJ1ZmZlckxlbiA9IG1kNUJ1ZmZlci5yZWR1Y2UoKGEsIHN0cikgPT4gYSArIHN0ci5sZW5ndGgsIDApOwogIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyh4cmVmSW5mby5pbmZvKSkgewogICAgbWQ1QnVmZmVyLnB1c2godmFsdWUpOwogICAgbWQ1QnVmZmVyTGVuICs9IHZhbHVlLmxlbmd0aDsKICB9CiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShtZDVCdWZmZXJMZW4pOwogIGxldCBvZmZzZXQgPSAwOwogIGZvciAoY29uc3Qgc3RyIG9mIG1kNUJ1ZmZlcikgewogICAgd3JpdGVTdHJpbmcoc3RyLCBvZmZzZXQsIGFycmF5KTsKICAgIG9mZnNldCArPSBzdHIubGVuZ3RoOwogIH0KICByZXR1cm4gYnl0ZXNUb1N0cmluZyhjYWxjdWxhdGVNR
20DUoYXJyYXkpKTsKfQpmdW5jdGlvbiB3cml0ZVhGQURhdGFGb3JBY3JvZm9ybShzdHIsIGNoYW5nZXMpIHsKICBjb25zdCB4bWwgPSBuZXcgU2ltcGxlWE1MUGFyc2VyKHsKICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICB9KS5wYXJzZUZyb21TdHJpbmcoc3RyKTsKICBmb3IgKGNvbnN0IHsKICAgIHhmYQogIH0gb2YgY2hhbmdlcykgewogICAgaWYgKCF4ZmEpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCB7CiAgICAgIHBhdGgsCiAgICAgIHZhbHVlCiAgICB9ID0geGZhOwogICAgaWYgKCFwYXRoKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3Qgbm9kZVBhdGggPSBwYXJzZVhGQVBhdGgocGF0aCk7CiAgICBsZXQgbm9kZSA9IHhtbC5kb2N1bWVudEVsZW1lbnQuc2VhcmNoTm9kZShub2RlUGF0aCwgMCk7CiAgICBpZiAoIW5vZGUgJiYgbm9kZVBhdGgubGVuZ3RoID4gMSkgewogICAgICBub2RlID0geG1sLmRvY3VtZW50RWxlbWVudC5zZWFyY2hOb2RlKFtub2RlUGF0aC5hdCgtMSldLCAwKTsKICAgIH0KICAgIGlmIChub2RlKSB7CiAgICAgIG5vZGUuY2hpbGROb2RlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKHZhbCA9PiBuZXcgU2ltcGxlRE9NTm9kZSgidmFsdWUiLCB2YWwpKSA6IFtuZXcgU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB2YWx1ZSldOwogICAgfSBlbHNlIHsKICAgICAgd2FybihgTm9kZSBub3QgZm91bmQgZm9yIHBhdGg6ICR7cGF0aH1gKTsKICAgIH0KICB9CiAgY29uc3QgYnVmZmVyID0gW107CiAgeG1sLmRvY3VtZW50RWxlbWVudC5kdW1wKGJ1ZmZlcik7CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQphc3luYyBmdW5jdGlvbiB1cGRhdGVBY3JvZm9ybSh7CiAgeHJlZiwKICBhY3JvRm9ybSwKICBhY3JvRm9ybVJlZiwKICBoYXNYZmEsCiAgaGFzWGZhRGF0YXNldHNFbnRyeSwKICB4ZmFEYXRhc2V0c1JlZiwKICBuZWVkQXBwZWFyYW5jZXMsCiAgY2hhbmdlcwp9KSB7CiAgaWYgKGhhc1hmYSAmJiAhaGFzWGZhRGF0YXNldHNFbnRyeSAmJiAheGZhRGF0YXNldHNSZWYpIHsKICAgIHdhcm4oIlhGQSAtIENhbm5vdCBzYXZlIGl0Iik7CiAgfQogIGlmICghbmVlZEFwcGVhcmFuY2VzICYmICghaGFzWGZhIHx8ICF4ZmFEYXRhc2V0c1JlZiB8fCBoYXNYZmFEYXRhc2V0c0VudHJ5KSkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBkaWN0ID0gYWNyb0Zvcm0uY2xvbmUoKTsKICBpZiAoaGFzWGZhICYmICFoYXNYZmFEYXRhc2V0c0VudHJ5KSB7CiAgICBjb25zdCBuZXdYZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpLnNsaWNlKCk7CiAgICBuZXdYZmEuc3BsaWNlKDIsIDAsICJkYXRhc2V0cyIpOwogICAgbmV3WGZhLnNwbGljZSgzLCAwLCB4ZmFEYXRhc2V0c1JlZik7CiAgICBkaWN0LnNldCgiWEZBIiwgbmV3WGZhKTsKICB9CiAgaWYgKG5lZWRBcHBlYXJhbmNlcykgewogICAgZGljdC5zZXQoIk5lZWRBcHBlYXJhbmNlcyIsIHRydWUpOwogIH0KICBjaGFuZ2VzLnB1dChhY3JvRm9ybVJlZiwgewogICAgZGF0YTogZGljdAogIH0pOwp9CmZ1bmN0aW9uIHVwZGF0ZVhGQSh7CiAgeGZhRGF0YSwKICB4ZmFEYXRhc2V0c1JlZiwKICBjaGFuZ2VzLAogIHhyZWYKfSkgewogIGlmICh4ZmFEYXRhID09PSBudWxsKSB7CiAgICBjb25zdCBkYXRhc2V0cyA9IHhyZWYuZmV0Y2hJZlJlZih4ZmFEYXRhc2V0c1JlZik7CiAgICB4ZmFEYXRhID0gd3JpdGVYRkFEYXRhRm9yQWNyb2Zvcm0oZGF0YXNldHMuZ2V0U3RyaW5nKCksIGNoYW5nZXMpOwogIH0KICBjb25zdCB4ZmFEYXRhU3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbSh4ZmFEYXRhKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3QgPSBuZXcgRGljdCh4cmVmKTsKICB4ZmFEYXRhU3RyZWFtLmRpY3Quc2V0KCJUeXBlIiwgTmFtZS5nZXQoIkVtYmVkZGVkRmlsZSIpKTsKICBjaGFuZ2VzLnB1dCh4ZmFEYXRhc2V0c1JlZiwgewogICAgZGF0YTogeGZhRGF0YVN0cmVhbQogIH0pOwp9CmFzeW5jIGZ1bmN0aW9uIGdldFhSZWZUYWJsZSh4cmVmSW5mbywgYmFzZU9mZnNldCwgbmV3UmVmcywgbmV3WHJlZiwgYnVmZmVyKSB7CiAgYnVmZmVyLnB1c2goInhyZWZcbiIpOwogIGNvbnN0IGluZGV4ZXMgPSBnZXRJbmRleGVzKG5ld1JlZnMpOwogIGxldCBpbmRleGVzUG9zaXRpb24gPSAwOwogIGZvciAoY29uc3QgewogICAgcmVmLAogICAgZGF0YQogIH0gb2YgbmV3UmVmcykgewogICAgaWYgKHJlZi5udW0gPT09IGluZGV4ZXNbaW5kZXhlc1Bvc2l0aW9uXSkgewogICAgICBidWZmZXIucHVzaChgJHtpbmRleGVzW2luZGV4ZXNQb3NpdGlvbl19ICR7aW5kZXhlc1tpbmRleGVzUG9zaXRpb24gKyAxXX1cbmApOwogICAgICBpbmRleGVzUG9zaXRpb24gKz0gMjsKICAgIH0KICAgIGlmIChkYXRhICE9PSBudWxsKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAke2Jhc2VPZmZzZXQudG9TdHJpbmcoKS5wYWRTdGFydCgxMCwgIjAiKX0gJHtNYXRoLm1pbihyZWYuZ2VuLCAweGZmZmYpLnRvU3RyaW5nKCkucGFkU3RhcnQoNSwgIjAiKX0gblxyXG5gKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAwMDAwMDAwMDAwICR7TWF0aC5taW4ocmVmLmdlbiArIDEsIDB4ZmZmZikudG9TdHJpbmcoKS5wYWRTdGFydCg1LCAiMCIpfSBmXHJcbmApOwogICAgfQogIH0KICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBidWZmZXIucHVzaCgidHJhaWxlclxuIik7CiAgYXdhaXQgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlcik7CiAgYnVmZmVyLnB1c2goIlxuc3RhcnR4cmVmXG4iLCBiYXNlT2Zmc2V0LnRvU3RyaW5nKCksICJcbiUlRU9GXG4iKTsKfQpmdW5jdGlvbiBnZXRJbmRleGVzKG5ld1JlZnMpIHsKICBjb25zdCBpbmRleGVzID0gW107CiAgZm9yIChjb25zdCB7CiAgICByZWYKICB9IG9mIG5ld1JlZnMpIHsKICAgIGlmIChyZWYubnVtID09PSBpbmRleGVzLmF0KC0yKSArIGluZGV4ZXMuYXQoLTEpKSB7CiAgICAgIGluZGV4ZXNbaW5kZXhlcy5sZW5ndGggLSAxXSArPSAxOwogICAgfSBlbHNlIHsKICAgICAgaW5kZXhlcy5wdXNoKHJlZi5udW0sIDEpOwogICAgfQogIH0KICByZXR1cm4gaW5kZXhlczsKfQphc3luYyBmdW5jdGlvbiBnZXRYUmVmU3RyZWFtVGFibGUoeHJlZkluZm8sIGJhc2VPZmZzZXQsIG5ld1JlZnMsIG5ld1hyZWYsIGJ1ZmZlcikgewogIGNvbnN0IHhyZWZUYWJsZURhdGEgPSBbXTsKICBsZXQgbWF4T2Zmc2V0ID0gMDsKICBsZXQgbWF4R2VuID0gMDsKICBmb3IgKGNvbnN0IHsKICAgIHJlZiwKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIGxldCBnZW47CiAgICBtYXhPZmZzZXQgPSBNYXRoLm1heChtYXhPZmZzZXQsIGJhc2VPZmZzZXQpOwogICAgaWYgKGRhdGEgIT09IG51bGwpIHsKICAgICAgZ2VuID0gTWF0aC5taW4ocmVmLmdlbiwgMHhmZmZmKTsKICAgICAgeHJlZlRhYmxlRGF0YS5wdXNoKFsxLCBiYXNlT2Zmc2V0LCBnZW5dKTsKICAgICAgYmFzZU9mZnNldCArPSBkYXRhLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGdlbiA9IE1hdGgubWluKHJlZi5nZW4gKyAxLCAweGZmZmYpOwogICAgICB4cmVmVGFibGVEYXRhLnB1c2goWzAsIDAsIGdlbl0pOwogICAgfQogICAgbWF4R2VuID0gTWF0aC5tYXgobWF4R2VuLCBnZW4pOwogIH0KICBuZXdYcmVmLnNldCgiSW5kZXgiLCBnZXRJbmRleGVzKG5ld1JlZnMpKTsKICBjb25zdCBvZmZzZXRTaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4T2Zmc2V0KTsKICBjb25zdCBtYXhHZW5TaXplID0gZ2V0U2l6ZUluQnl0ZXMobWF4R2VuKTsKICBjb25zdCBzaXplcyA9IFsxLCBvZmZzZXRTaXplLCBtYXhHZW5TaXplXTsKICBuZXdYcmVmLnNldCgiVyIsIHNpemVzKTsKICBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKTsKICBjb25zdCBzdHJ1Y3RTaXplID0gc2l6ZXMucmVkdWNlKChhLCB4KSA9PiBhICsgeCwgMCk7CiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHN0cnVjdFNpemUgKiB4cmVmVGFibGVEYXRhLmxlbmd0aCk7CiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbShkYXRhKTsKICBzdHJlYW0uZGljdCA9IG5ld1hyZWY7CiAgbGV0IG9mZnNldCA9IDA7CiAgZm9yIChjb25zdCBbdHlwZSwgb2JqT2Zmc2V0LCBnZW5dIG9mIHhyZWZUYWJsZURhdGEpIHsKICAgIG9mZnNldCA9IHdyaXRlSW50KH
20R5cGUsIHNpemVzWzBdLCBvZmZzZXQsIGRhdGEpOwogICAgb2Zmc2V0ID0gd3JpdGVJbnQob2JqT2Zmc2V0LCBzaXplc1sxXSwgb2Zmc2V0LCBkYXRhKTsKICAgIG9mZnNldCA9IHdyaXRlSW50KGdlbiwgc2l6ZXNbMl0sIG9mZnNldCwgZGF0YSk7CiAgfQogIGF3YWl0IHdyaXRlT2JqZWN0KHhyZWZJbmZvLm5ld1JlZiwgc3RyZWFtLCBidWZmZXIsIHt9KTsKICBidWZmZXIucHVzaCgic3RhcnR4cmVmXG4iLCBiYXNlT2Zmc2V0LnRvU3RyaW5nKCksICJcbiUlRU9GXG4iKTsKfQpmdW5jdGlvbiBjb21wdXRlSURzKGJhc2VPZmZzZXQsIHhyZWZJbmZvLCBuZXdYcmVmKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkoeHJlZkluZm8uZmlsZUlkcykgJiYgeHJlZkluZm8uZmlsZUlkcy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCBtZDUgPSBjb21wdXRlTUQ1KGJhc2VPZmZzZXQsIHhyZWZJbmZvKTsKICAgIG5ld1hyZWYuc2V0KCJJRCIsIFt4cmVmSW5mby5maWxlSWRzWzBdLCBtZDVdKTsKICB9Cn0KZnVuY3Rpb24gZ2V0VHJhaWxlckRpY3QoeHJlZkluZm8sIGNoYW5nZXMsIHVzZVhyZWZTdHJlYW0pIHsKICBjb25zdCBuZXdYcmVmID0gbmV3IERpY3QobnVsbCk7CiAgbmV3WHJlZi5zZXQoIlByZXYiLCB4cmVmSW5mby5zdGFydFhSZWYpOwogIGNvbnN0IHJlZkZvclhyZWZUYWJsZSA9IHhyZWZJbmZvLm5ld1JlZjsKICBpZiAodXNlWHJlZlN0cmVhbSkgewogICAgY2hhbmdlcy5wdXQocmVmRm9yWHJlZlRhYmxlLCB7CiAgICAgIGRhdGE6ICIiCiAgICB9KTsKICAgIG5ld1hyZWYuc2V0KCJTaXplIiwgcmVmRm9yWHJlZlRhYmxlLm51bSArIDEpOwogICAgbmV3WHJlZi5zZXQoIlR5cGUiLCBOYW1lLmdldCgiWFJlZiIpKTsKICB9IGVsc2UgewogICAgbmV3WHJlZi5zZXQoIlNpemUiLCByZWZGb3JYcmVmVGFibGUubnVtKTsKICB9CiAgaWYgKHhyZWZJbmZvLnJvb3RSZWYgIT09IG51bGwpIHsKICAgIG5ld1hyZWYuc2V0KCJSb290IiwgeHJlZkluZm8ucm9vdFJlZik7CiAgfQogIGlmICh4cmVmSW5mby5pbmZvUmVmICE9PSBudWxsKSB7CiAgICBuZXdYcmVmLnNldCgiSW5mbyIsIHhyZWZJbmZvLmluZm9SZWYpOwogIH0KICBpZiAoeHJlZkluZm8uZW5jcnlwdFJlZiAhPT0gbnVsbCkgewogICAgbmV3WHJlZi5zZXQoIkVuY3J5cHQiLCB4cmVmSW5mby5lbmNyeXB0UmVmKTsKICB9CiAgcmV0dXJuIG5ld1hyZWY7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFuZ2VzKGNoYW5nZXMsIHhyZWYsIGJ1ZmZlciA9IFtdKSB7CiAgY29uc3QgbmV3UmVmcyA9IFtdOwogIGZvciAoY29uc3QgW3JlZiwgewogICAgZGF0YQogIH1dIG9mIGNoYW5nZXMuaXRlbXMoKSkgewogICAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciKSB7CiAgICAgIG5ld1JlZnMucHVzaCh7CiAgICAgICAgcmVmLAogICAgICAgIGRhdGEKICAgICAgfSk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgYXdhaXQgd3JpdGVPYmplY3QocmVmLCBkYXRhLCBidWZmZXIsIHhyZWYpOwogICAgbmV3UmVmcy5wdXNoKHsKICAgICAgcmVmLAogICAgICBkYXRhOiBidWZmZXIuam9pbigiIikKICAgIH0pOwogICAgYnVmZmVyLmxlbmd0aCA9IDA7CiAgfQogIHJldHVybiBuZXdSZWZzLnNvcnQoKGEsIGIpID0+IGEucmVmLm51bSAtIGIucmVmLm51bSk7Cn0KYXN5bmMgZnVuY3Rpb24gaW5jcmVtZW50YWxVcGRhdGUoewogIG9yaWdpbmFsRGF0YSwKICB4cmVmSW5mbywKICBjaGFuZ2VzLAogIHhyZWYgPSBudWxsLAogIGhhc1hmYSA9IGZhbHNlLAogIHhmYURhdGFzZXRzUmVmID0gbnVsbCwKICBoYXNYZmFEYXRhc2V0c0VudHJ5ID0gZmFsc2UsCiAgbmVlZEFwcGVhcmFuY2VzLAogIGFjcm9Gb3JtUmVmID0gbnVsbCwKICBhY3JvRm9ybSA9IG51bGwsCiAgeGZhRGF0YSA9IG51bGwsCiAgdXNlWHJlZlN0cmVhbSA9IGZhbHNlCn0pIHsKICBhd2FpdCB1cGRhdGVBY3JvZm9ybSh7CiAgICB4cmVmLAogICAgYWNyb0Zvcm0sCiAgICBhY3JvRm9ybVJlZiwKICAgIGhhc1hmYSwKICAgIGhhc1hmYURhdGFzZXRzRW50cnksCiAgICB4ZmFEYXRhc2V0c1JlZiwKICAgIG5lZWRBcHBlYXJhbmNlcywKICAgIGNoYW5nZXMKICB9KTsKICBpZiAoaGFzWGZhKSB7CiAgICB1cGRhdGVYRkEoewogICAgICB4ZmFEYXRhLAogICAgICB4ZmFEYXRhc2V0c1JlZiwKICAgICAgY2hhbmdlcywKICAgICAgeHJlZgogICAgfSk7CiAgfQogIGNvbnN0IG5ld1hyZWYgPSBnZXRUcmFpbGVyRGljdCh4cmVmSW5mbywgY2hhbmdlcywgdXNlWHJlZlN0cmVhbSk7CiAgY29uc3QgYnVmZmVyID0gW107CiAgY29uc3QgbmV3UmVmcyA9IGF3YWl0IHdyaXRlQ2hhbmdlcyhjaGFuZ2VzLCB4cmVmLCBidWZmZXIpOwogIGxldCBiYXNlT2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDsKICBjb25zdCBsYXN0Qnl0ZSA9IG9yaWdpbmFsRGF0YS5hdCgtMSk7CiAgaWYgKGxhc3RCeXRlICE9PSAweDBhICYmIGxhc3RCeXRlICE9PSAweDBkKSB7CiAgICBidWZmZXIucHVzaCgiXG4iKTsKICAgIGJhc2VPZmZzZXQgKz0gMTsKICB9CiAgZm9yIChjb25zdCB7CiAgICBkYXRhCiAgfSBvZiBuZXdSZWZzKSB7CiAgICBpZiAoZGF0YSAhPT0gbnVsbCkgewogICAgICBidWZmZXIucHVzaChkYXRhKTsKICAgIH0KICB9CiAgYXdhaXQgKHVzZVhyZWZTdHJlYW0gPyBnZXRYUmVmU3RyZWFtVGFibGUoeHJlZkluZm8sIGJhc2VPZmZzZXQsIG5ld1JlZnMsIG5ld1hyZWYsIGJ1ZmZlcikgOiBnZXRYUmVmVGFibGUoeHJlZkluZm8sIGJhc2VPZmZzZXQsIG5ld1JlZnMsIG5ld1hyZWYsIGJ1ZmZlcikpOwogIGNvbnN0IHRvdGFsTGVuZ3RoID0gYnVmZmVyLnJlZHVjZSgoYSwgc3RyKSA9PiBhICsgc3RyLmxlbmd0aCwgb3JpZ2luYWxEYXRhLmxlbmd0aCk7CiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7CiAgYXJyYXkuc2V0KG9yaWdpbmFsRGF0YSk7CiAgbGV0IG9mZnNldCA9IG9yaWdpbmFsRGF0YS5sZW5ndGg7CiAgZm9yIChjb25zdCBzdHIgb2YgYnVmZmVyKSB7CiAgICB3cml0ZVN0cmluZyhzdHIsIG9mZnNldCwgYXJyYXkpOwogICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7CiAgfQogIHJldHVybi
20BhcnJheTsKfQoKOy8vIC4vc3JjL2NvcmUvd29ya2VyX3N0cmVhbS5qcwoKCmNsYXNzIFBERldvcmtlclN0cmVhbSB7CiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgewogICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7CiAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbnVsbDsKICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDsKICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTsKICB9CiAgZ2V0RnVsbFJlYWRlcigpIHsKICAgIGFzc2VydCghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsICJQREZXb3JrZXJTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4iKTsKICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJlYWRlcih0aGlzLl9tc2dIYW5kbGVyKTsKICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjsKICB9CiAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkgewogICAgY29uc3QgcmVhZGVyID0gbmV3IFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyKGJlZ2luLCBlbmQsIHRoaXMuX21zZ0hhbmRsZXIpOwogICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7CiAgICByZXR1cm4gcmVhZGVyOwogIH0KICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHsKICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTsKICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHsKICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pOwogICAgfQogIH0KfQpjbGFzcyBQREZXb3JrZXJTdHJlYW1SZWFkZXIgewogIGNvbnN0cnVjdG9yKG1zZ0hhbmRsZXIpIHsKICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOwogICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOwogICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGZhbHNlOwogICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTsKICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmVhZGVyIik7CiAgICB0aGlzLl9yZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTsKICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhQcm9taXNlKCJSZWFkZXJIZWFkZXJzUmVhZHkiKS50aGVuKGRhdGEgPT4gewogICAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGRhdGEuaXNTdHJlYW1pbmdTdXBwb3J0ZWQ7CiAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBkYXRhLmlzUmFuZ2VTdXBwb3J0ZWQ7CiAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBkYXRhLmNvbnRlbnRMZW5ndGg7CiAgICB9KTsKICB9CiAgZ2V0IGhlYWRlcnNSZWFkeSgpIHsKICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7CiAgfQogIGdldCBjb250ZW50TGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7CiAgfQogIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDsKICB9CiAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDsKICB9CiAgYXN5bmMgcmVhZCgpIHsKICAgIGNvbnN0IHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmUKICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOwogICAgaWYgKGRvbmUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgIGRvbmU6IHRydWUKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCiAgICAgIGRvbmU6IGZhbHNlCiAgICB9OwogIH0KICBjYW5jZWwocmVhc29uKSB7CiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgfQp9CmNsYXNzIFBERldvcmtlclN0cmVhbVJhbmdlUmVhZGVyIHsKICBjb25zdHJ1Y3RvcihiZWdpbiwgZW5kLCBtc2dIYW5kbGVyKSB7CiAgICB0aGlzLl9tc2dIYW5kbGVyID0gbXNnSGFuZGxlcjsKICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7CiAgICBjb25zdCByZWFkYWJsZVN0cmVhbSA9IHRoaXMuX21zZ0hhbmRsZXIuc2VuZFdpdGhTdHJlYW0oIkdldFJhbmdlUmVhZGVyIiwgewogICAgICBiZWdpbiwKICAgICAgZW5kCiAgICB9KTsKICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogIH0KICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGFzeW5jIHJlYWQoKSB7CiAgICBjb25zdCB7CiAgICAgIHZhbHVlLAogICAgICBkb25lCiAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTsKICAgIGlmIChkb25lKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICBkb25lOiB0cnVlCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICB2YWx1ZTogdmFsdWUuYnVmZmVyLAogICAgICBkb25lOiBmYWxzZQogICAgfTsKICB9CiAgY2FuY2VsKHJlYXNvbikgewogICAgdGhpcy5fcmVhZGVyLmNhbmNlbChyZWFzb24pOwogIH0KfQoKOy8vIC4vc3JjL2NvcmUvd29ya2VyLmpzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgV29ya2VyVGFzayB7CiAgY29uc3RydWN0b3IobmFtZSkgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMudGVybWluYXRlZCA9IGZhbHNlOwogICAgdGhpcy5fY2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogIH0KICBnZXQgZmluaXNoZWQoKSB7CiAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlOwogIH0KICBmaW5pc2goKSB7CiAgICB0aGlzLl9jYXBhYmlsaXR5LnJlc29sdmUoKTsKICB9CiAgdGVybWluYXRlKCkgewogICAgdGhpcy50ZXJtaW5hdGVkID0gdHJ1ZTsKICB9CiAgZW5zdXJlTm90VGVybWluYXRlZCgpIHsKICAgIGlmICh0aGlzLnRlcm1pbmF0ZWQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZCIpOwogICAgfQogIH0KfQpjbGFzcyBXb3JrZXJNZXNzYWdlSGFuZGxlciB7CiAgc3RhdGljIHsKICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAidW5kZWZpbmVkIiAmJiAhaXNOb2RlSlMgJiYgdHlwZW9mIHNlbGYgIT09ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBzZWxmLnBvc3RNZXNzYWdlID09PSAiZnVuY3Rpb24iICYmICJvbm1lc3NhZ2UiIGluIHNlbGYpIHsKICAgICAgdGhpcy5pbml0aWFsaXplRnJvbVBvcnQoc2VsZik7CiAgICB9CiAgfQogIHN0YXRpYyBzZXR1cChoYW5kbGVyLCBwb3J0KSB7CiAgICBsZXQgdGVzdE1lc3NhZ2VQcm9jZXNzZWQgPSBmYWxzZTsKICAgIGhhbmRsZXIub24oInRlc3QiLCBkYXRhID0+IHsKICAgICAgaWYgKHRlc3RNZXNzYWdlUHJvY2Vzc2VkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgI
20HRlc3RNZXNzYWdlUHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgaGFuZGxlci5zZW5kKCJ0ZXN0IiwgZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJjb25maWd1cmUiLCBkYXRhID0+IHsKICAgICAgc2V0VmVyYm9zaXR5TGV2ZWwoZGF0YS52ZXJib3NpdHkpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREb2NSZXF1ZXN0IiwgZGF0YSA9PiB0aGlzLmNyZWF0ZURvY3VtZW50SGFuZGxlcihkYXRhLCBwb3J0KSk7CiAgfQogIHN0YXRpYyBjcmVhdGVEb2N1bWVudEhhbmRsZXIoZG9jUGFyYW1zLCBwb3J0KSB7CiAgICBsZXQgcGRmTWFuYWdlcjsKICAgIGxldCB0ZXJtaW5hdGVkID0gZmFsc2U7CiAgICBsZXQgY2FuY2VsWEhScyA9IG51bGw7CiAgICBjb25zdCBXb3JrZXJUYXNrcyA9IG5ldyBTZXQoKTsKICAgIGNvbnN0IHZlcmJvc2l0eSA9IGdldFZlcmJvc2l0eUxldmVsKCk7CiAgICBjb25zdCB7CiAgICAgIGRvY0lkLAogICAgICBhcGlWZXJzaW9uCiAgICB9ID0gZG9jUGFyYW1zOwogICAgY29uc3Qgd29ya2VyVmVyc2lvbiA9ICI0LjEwLjM4IjsKICAgIGlmIChhcGlWZXJzaW9uICE9PSB3b3JrZXJWZXJzaW9uKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEFQSSB2ZXJzaW9uICIke2FwaVZlcnNpb259IiBkb2VzIG5vdCBtYXRjaCBgICsgYHRoZSBXb3JrZXIgdmVyc2lvbiAiJHt3b3JrZXJWZXJzaW9ufSIuYCk7CiAgICB9CiAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdOwogICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBbXSkgewogICAgICBlbnVtZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKICAgIH0KICAgIGlmIChlbnVtZXJhYmxlUHJvcGVydGllcy5sZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgYEFycmF5LnByb3RvdHlwZWAgY29udGFpbnMgdW5leHBlY3RlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXM6ICIgKyBlbnVtZXJhYmxlUHJvcGVydGllcy5qb2luKCIsICIpICsgIjsgdGh1cyBicmVha2luZyBlLmcuIGBmb3IuLi5pbmAgaXRlcmF0aW9uIG9mIGBBcnJheWBzLiIpOwogICAgfQogICAgY29uc3Qgd29ya2VySGFuZGxlck5hbWUgPSBkb2NJZCArICJfd29ya2VyIjsKICAgIGxldCBoYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKHdvcmtlckhhbmRsZXJOYW1lLCBkb2NJZCwgcG9ydCk7CiAgICBmdW5jdGlvbiBlbnN1cmVOb3RUZXJtaW5hdGVkKCkgewogICAgICBpZiAodGVybWluYXRlZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0V29ya2VyVGFzayh0YXNrKSB7CiAgICAgIFdvcmtlclRhc2tzLmFkZCh0YXNrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmlzaFdvcmtlclRhc2sodGFzaykgewogICAgICB0YXNrLmZpbmlzaCgpOwogICAgICBXb3JrZXJUYXNrcy5kZWxldGUodGFzayk7CiAgICB9CiAgICBhc3luYyBmdW5jdGlvbiBsb2FkRG9jdW1lbnQocmVjb3ZlcnlNb2RlKSB7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0hlYWRlciIpOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygicGFyc2VTdGFydFhSZWYiKTsKICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tGaXJzdFBhZ2UiLCBbcmVjb3ZlcnlNb2RlXSk7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJjaGVja0xhc3RQYWdlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBjb25zdCBpc1B1cmVYZmEgPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaXNQdXJlWGZhIik7CiAgICAgIGlmIChpc1B1cmVYZmEpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soImxvYWRYZmFGb250cyIpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5sb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykuY2F0Y2gocmVhc29uID0+IHt9KS50aGVuKCgpID0+IGZpbmlzaFdvcmtlclRhc2sodGFzaykpLCBwZGZNYW5hZ2VyLmxvYWRYZmFJbWFnZXMoKV0pOwogICAgICB9CiAgICAgIGNvbnN0IFtudW1QYWdlcywgZmluZ2VycHJpbnRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygibnVtUGFnZXMiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoImZpbmdlcnByaW50cyIpXSk7CiAgICAgIGNvbnN0IGh0bWxGb3JYZmEgPSBpc1B1cmVYZmEgPyBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaHRtbEZvclhmYSIpIDogbnVsbDsKICAgICAgcmV0dXJuIHsKICAgICAgICBudW1QYWdlcywKICAgICAgICBmaW5nZXJwcmludHMsCiAgICAgICAgaHRtbEZvclhmYQogICAgICB9OwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gZ2V0UGRmTWFuYWdlcih7CiAgICAgIGRhdGEsCiAgICAgIHBhc3N3b3JkLAogICAgICBkaXNhYmxlQXV0b0ZldGNoLAogICAgICByYW5nZUNodW5rU2l6ZSwKICAgICAgbGVuZ3RoLAogICAgICBkb2NCYXNlVXJsLAogICAgICBlbmFibGVYZmEsCiAgICAgIGV2YWx1YXRvck9wdGlvbnMKICAgIH0pIHsKICAgICAgY29uc3QgcGRmTWFuYWdlckFyZ3MgPSB7CiAgICAgICAgc291cmNlOiBudWxsLAogICAgICAgIGRpc2FibGVBdXRvRmV0Y2gsCiAgICAgICAgZG9jQmFzZVVybCwKICAgICAgICBkb2
20NJZCwKICAgICAgICBlbmFibGVYZmEsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9ucywKICAgICAgICBoYW5kbGVyLAogICAgICAgIGxlbmd0aCwKICAgICAgICBwYXNzd29yZCwKICAgICAgICByYW5nZUNodW5rU2l6ZQogICAgICB9OwogICAgICBpZiAoZGF0YSkgewogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IGRhdGE7CiAgICAgICAgcmV0dXJuIG5ldyBMb2NhbFBkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICB9CiAgICAgIGNvbnN0IHBkZlN0cmVhbSA9IG5ldyBQREZXb3JrZXJTdHJlYW0oaGFuZGxlciksCiAgICAgICAgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOwogICAgICBjb25zdCBwZGZNYW5hZ2VyQ2FwYWJpbGl0eSA9IFByb21pc2Uud2l0aFJlc29sdmVycygpOwogICAgICBsZXQgbmV3UGRmTWFuYWdlciwKICAgICAgICBjYWNoZWRDaHVua3MgPSBbXSwKICAgICAgICBsb2FkZWQgPSAwOwogICAgICBmdWxsUmVxdWVzdC5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1JhbmdlU3VwcG9ydGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZlN0cmVhbTsKICAgICAgICBwZGZNYW5hZ2VyQXJncy5sZW5ndGggPSBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoOwogICAgICAgIHBkZk1hbmFnZXJBcmdzLmRpc2FibGVBdXRvRmV0Y2ggfHw9IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOwogICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgTmV0d29ya1BkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2FjaGVkQ2h1bmtzKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspOwogICAgICAgIH0KICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7CiAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CiAgICAgIH0pOwogICAgICBuZXcgUHJvbWlzZS
20hmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgY29uc3QgcmVhZENodW5rID0gZnVuY3Rpb24gKHsKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgZG9uZQogICAgICAgIH0pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBkZkZpbGUgPSBhcnJheUJ1ZmZlcnNUb0J5dGVzKGNhY2hlZENodW5rcyk7CiAgICAgICAgICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChsZW5ndGggJiYgcGRmRmlsZS5sZW5ndGggIT09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgICB3YXJuKCJyZXBvcnRlZCBIVFRQIGxlbmd0aCBpcyBkaWZmZXJlbnQgZnJvbSBhY3R1YWwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZkZpbGU7CiAgICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IExvY2FsUGRmTWFuYWdlcihwZGZNYW5hZ2VyQXJncyk7CiAgICAgICAgICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZXNvbHZlKG5ld1BkZk1hbmFnZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7CiAgICAgICAgICAgIGlmICghZnVsbFJlcXVlc3QuaXNTdHJlYW1pbmdTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIiwgewogICAgICAgICAgICAgICAgbG9hZGVkLAogICAgICAgICAgICAgICAgdG90YWw6IE1hdGgubWF4KGxvYWRlZCwgZnVsbFJlcXVlc3QuY29udGVudExlbmd0aCB8fCAwKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdQZGZNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjYWNoZWRDaHVua3MucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVsbFJlcXVlc3QucmVhZCgpLnRoZW4ocmVhZENodW5rLCByZWplY3QpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGUpOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KTsKICAgICAgY2FuY2VsWEhScyA9IHJlYXNvbiA9PiB7CiAgICAgICAgcGRmU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbik7CiAgICAgIH07CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgfQogICAgZnVuY3Rpb24gc2V0dXBEb2MoZGF0YSkgewogICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MoZG9jKSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGhhbmRsZXIuc2VuZCgiR2V0RG9jIiwgewogICAgICAgICAgcGRmSW5mbzogZG9jCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gb25GYWlsdXJlKGV4KSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFBhc3N3b3JkRXhjZXB0aW9uKSB7CiAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFBhc3N3b3JkRXhjZXB0aW9uOiByZXNwb25zZSAke2V4LmNvZGV9YCk7CiAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBoYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiUGFzc3dvcmRSZXF1ZXN0IiwgZXgpLnRoZW4oZnVuY3Rpb24gKHsKICAgICAgICAgICAgcGFzc3dvcmQKICAgICAgICAgIH0pIHsKICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcGRmTWFuYWdlci51cGRhdGVQYXNzd29yZChwYXNzd29yZCk7CiAgICAgICAgICAgIHBkZk1hbmFnZXJSZWFkeSgpOwogICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIGV4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIHdyYXBSZWFzb24oZXgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGRmTWFuYWdlclJlYWR5KCkgewogICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICBsb2FkRG9jdW1lbnQoZmFsc2UpLnRoZW4ob25TdWNjZXNzLCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgICAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBYUmVmUGFyc2VFeGNlcHRpb24pKSB7CiAgICAgICAgICAgIG9uRmFpbHVyZShyZWFzb24pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0oKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgICAgICBsb2FkRG9jdW1lbnQodHJ1ZSkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIGdldFBkZk1hbmFnZXIoZGF0YSkudGhlbihmdW5jdGlvbiAobmV3UGRmTWFuYWdlcikgewogICAgICAgIGlmICh0ZXJtaW5hdGVkKSB7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpOwogICAgICAgI
20H0KICAgICAgICBwZGZNYW5hZ2VyID0gbmV3UGRmTWFuYWdlcjsKICAgICAgICBwZGZNYW5hZ2VyLnJlcXVlc3RMb2FkZWRTdHJlYW0odHJ1ZSkudGhlbihzdHJlYW0gPT4gewogICAgICAgICAgaGFuZGxlci5zZW5kKCJEYXRhTG9hZGVkIiwgewogICAgICAgICAgICBsZW5ndGg6IHN0cmVhbS5ieXRlcy5ieXRlTGVuZ3RoCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSkudGhlbihwZGZNYW5hZ2VyUmVhZHksIG9uRmFpbHVyZSk7CiAgICB9CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShkYXRhLnBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInJvdGF0ZSIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicmVmIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ1c2VyVW5pdCIpLCBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAidmlldyIpXSkudGhlbihmdW5jdGlvbiAoW3JvdGF0ZSwgcmVmLCB1c2VyVW5pdCwgdmlld10pIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdGF0ZSwKICAgICAgICAgICAgcmVmLAogICAgICAgICAgICByZWZTdHI6IHJlZj8udG9TdHJpbmcoKSA/PyBudWxsLAogICAgICAgICAgICB1c2VyVW5pdCwKICAgICAgICAgICAgdmlldwogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VJbmRleCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIGNvbnN0IHBhZ2VSZWYgPSBSZWYuZ2V0KGRhdGEubnVtLCBkYXRhLmdlbik7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRlc3RpbmF0aW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREZXN0aW5hdGlvbiIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldERlc3RpbmF0aW9uIiwgW2RhdGEuaWRdKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxhYmVscyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYWJlbHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUxheW91dCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VMYXlvdXQiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZU1vZGUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwYWdlTW9kZSIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRWaWV3ZXJQcmVmZXJlbmNlcyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInZpZXdlclByZWZlcmVuY2VzIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wZW5BY3Rpb24iLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJvcGVuQWN0aW9uIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldEF0dGFjaG1lbnRzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYXR0YWNobWVudHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RG9jSlNBY3Rpb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFBhZ2VKU0FjdGlvbnMiLCBmdW5jdGlvbiAoewogICAgICBwYWdlSW5kZXgKICAgIH0pIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgImpzQWN0aW9ucyIpOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0T3V0bGluZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImRvY3VtZW50T3V0bGluZSIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPcHRpb25hbENvbnRlbnRDb25maWciLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJvcHRpb25hbENvbnRlbnRDb25maWciKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGVybWlzc2lvbnMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJwZXJtaXNzaW9ucyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRNZXRhZGF0YSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmVEb2MoImRvY3VtZW50SW5mbyIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1ldGFkYXRhIildKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0TWFya0luZm8iLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJtYXJrSW5mbyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREYXRhIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKHN0cmVhbSkgewogICAgICAgIHJldHVybiBzdHJlYW0uYnl0ZXM7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRBbm5vdGF0aW9ucyIsIGZ1bmN0aW9uICh7CiAgICAgIHBhZ2VJbmRleCwKICAgICAgaW50ZW50CiAgICB9KSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmdldFBhZ2UocGFnZUluZGV4KS50aG
20VuKGZ1bmN0aW9uIChwYWdlKSB7CiAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBHZXRBbm5vdGF0aW9uczogcGFnZSAke3BhZ2VJbmRleH1gKTsKICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgcmV0dXJuIHBhZ2UuZ2V0QW5ub3RhdGlvbnNEYXRhKGhhbmRsZXIsIHRhc2ssIGludGVudCkudGhlbihkYXRhID0+IHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9LCByZWFzb24gPT4gewogICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldEZpZWxkT2JqZWN0cyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZURvYygiZmllbGRPYmplY3RzIikudGhlbihmaWVsZE9iamVjdHMgPT4gZmllbGRPYmplY3RzPy5hbGxGaWVsZHMgfHwgbnVsbCk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkhhc0pTQWN0aW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZURvYygiaGFzSlNBY3Rpb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldENhbGN1bGF0aW9uT3JkZXJJZHMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVEb2MoImNhbGN1bGF0aW9uT3JkZXJJZHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiU2F2ZURvY3VtZW50IiwgYXN5bmMgZnVuY3Rpb24gKHsKICAgICAgaXNQdXJlWGZhLAogICAgICBudW1QYWdlcywKICAgICAgYW5ub3RhdGlvblN0b3JhZ2UsCiAgICAgIGZpbGVuYW1lCiAgICB9KSB7CiAgICAgIGNvbnN0IGdsb2JhbFByb21pc2VzID0gW3BkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm1SZWYiKSwgcGRmTWFuYWdlci5lbnN1cmVEb2MoInN0YXJ0WFJlZiIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygieHJlZiIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInN0cnVjdFRyZWVSb290IildOwogICAgICBjb25zdCBjaGFuZ2VzID0gbmV3IFJlZlNldENhY2hlKCk7CiAgICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICAgIGNvbnN0IG5ld0Fubm90YXRpb25zQnlQYWdlID0gIWlzUHVyZVhmYSA/IGdldE5ld0Fubm90YXRpb25zTWFwKGFubm90YXRpb25TdG9yYWdlKSA6IG51bGw7CiAgICAgIGNvbnN0IFtzdHJlYW0sIGFjcm9Gb3JtLCBhY3JvRm9ybVJlZiwgc3RhcnRYUmVmLCB4cmVmLCBsaW5lYXJpemF0aW9uLCBfc3RydWN0VHJlZVJvb3RdID0gYXdhaXQgUHJvbWlzZS5hbGwoZ2xvYmFsUHJvbWlzZXMpOwogICAgICBjb25zdCBjYXRhbG9nUmVmID0geHJlZi50cmFpbGVyLmdldFJhdygiUm9vdCIpIHx8IG51bGw7CiAgICAgIGxldCBzdHJ1Y3RUcmVlUm9vdDsKICAgICAgaWYgKG5ld0Fubm90YXRpb25zQnlQYWdlKSB7CiAgICAgICAgaWYgKCFfc3RydWN0VHJlZVJvb3QpIHsKICAgICAgICAgIGlmIChhd2FpdCBTdHJ1Y3RUcmVlUm9vdC5jYW5DcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgICAgICAgICAgY2F0YWxvZ1JlZiwKICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgIHN0cnVjdFRyZWVSb290ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGF3YWl0IF9zdHJ1Y3RUcmVlUm9vdC5jYW5VcGRhdGVTdHJ1Y3RUcmVlKHsKICAgICAgICAgIHBkZk1hbmFnZXIsCiAgICAgICAgICB4cmVmLAogICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UKICAgICAgICB9KSkgewogICAgICAgICAgc3RydWN0VHJlZVJvb3QgPSBfc3RydWN0VHJlZVJvb3Q7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGltYWdlUHJvbWlzZXMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZW5lcmF0ZUltYWdlcyhhbm5vdGF0aW9uU3RvcmFnZS52YWx1ZXMoKSwgeHJlZiwgcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgICBjb25zdCBuZXdBbm5vdGF0aW9uUHJvbWlzZXMgPSBzdHJ1Y3RUcmVlUm9vdCA9PT0gdW5kZWZpbmVkID8gcHJvbWlzZXMgOiBbXTsKICAgICAgICBmb3IgKGNvbnN0IFtwYWdlSW5kZXgsIGFubm90YXRpb25zXSBvZiBuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgICAgbmV3QW5ub3RhdGlvblByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihwYWdlID0+IHsKICAgICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBTYXZlIChlZGl0b3IpOiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICAgIHJldHVybiBwYWdlLnNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucywgaW1hZ2VQcm9taXNlcywgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ1Y3RUcmVlUm9vdCA9PT0gbnVsbCkgewogICAgICAgICAgcHJvbWlzZXMucHVzaChQcm9taXNlLmFsbChuZXdBbm5vdGF0aW9uUHJvbWlzZXMpLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgICAgICBhd2FpdCBTdHJ1Y3RUcmVlUm9vdC5jcmVhdGVTdHJ1Y3R1cmVUcmVlKHsKICAgICAgICAgICAgICBuZXdBbm5vdGF0aW9uc0J5UGFnZSwKICAgICAgICAgICAgICB4cmVmLAogICAgICAgICAgICAgIGNhdGFsb2dSZWYsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgI
20H0gZWxzZSBpZiAoc3RydWN0VHJlZVJvb3QpIHsKICAgICAgICAgIHByb21pc2VzLnB1c2goUHJvbWlzZS5hbGwobmV3QW5ub3RhdGlvblByb21pc2VzKS50aGVuKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgYXdhaXQgc3RydWN0VHJlZVJvb3QudXBkYXRlU3RydWN0dXJlVHJlZSh7CiAgICAgICAgICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2UsCiAgICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgICBjaGFuZ2VzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNQdXJlWGZhKSB7CiAgICAgICAgcHJvbWlzZXMucHVzaChwZGZNYW5hZ2VyLnNlcmlhbGl6ZVhmYURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxldCBwYWdlSW5kZXggPSAwOyBwYWdlSW5kZXggPCBudW1QYWdlczsgcGFnZUluZGV4KyspIHsKICAgICAgICAgIHByb21pc2VzLnB1c2gocGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYFNhdmU6IHBhZ2UgJHtwYWdlSW5kZXh9YCk7CiAgICAgICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSwgY2hhbmdlcykuZmluYWxseShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHJlZnMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgIGxldCB4ZmFEYXRhID0gbnVsbDsKICAgICAgaWYgKGlzUHVyZVhmYSkgewogICAgICAgIHhmYURhdGEgPSByZWZzWzBdOwogICAgICAgIGlmICgheGZhRGF0YSkgewogICAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5zaXplID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgfQogICAgICBjb25zdCBuZWVkQXBwZWFyYW5jZXMgPSBhY3JvRm9ybVJlZiAmJiBhY3JvRm9ybSBpbnN0YW5jZW9mIERpY3QgJiYgY2hhbmdlcy52YWx1ZXMoKS5zb21lKHJlZiA9PiByZWYubmVlZEFwcGVhcmFuY2VzKTsKICAgICAgY29uc3QgeGZhID0gYWNyb0Zvcm0gaW5zdGFuY2VvZiBEaWN0ICYmIGFjcm9Gb3JtLmdldCgiWEZBIikgfHwgbnVsbDsKICAgICAgbGV0IHhmYURhdGFzZXRzUmVmID0gbnVsbDsKICAgICAgbGV0IGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeGZhKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICBpZiAoeGZhW2ldID09PSAiZGF0YXNldHMiKSB7CiAgICAgICAgICAgIHhmYURhdGFzZXRzUmVmID0geGZhW2kgKyAxXTsKICAgICAgICAgICAgaGFzWGZhRGF0YXNldHNFbnRyeSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh4ZmFEYXRhc2V0c1JlZiA9PT0gbnVsbCkgewogICAgICAgICAgeGZhRGF0YXNldHNSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh4ZmEpIHsKICAgICAgICB3YXJuKCJVbnN1cHBvcnRlZCBYRkEgdHlwZS4iKTsKICAgICAgfQogICAgICBsZXQgbmV3WHJlZkluZm8gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBpZiAoeHJlZi50cmFpbGVyKSB7CiAgICAgICAgY29uc3QgaW5mb09iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgY29uc3QgeHJlZkluZm8gPSB4cmVmLnRyYWlsZXIuZ2V0KCJJbmZvIikgfHwgbnVsbDsKICAgICAgICBpZiAoeHJlZkluZm8gaW5zdGFuY2VvZiBEaWN0KSB7CiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB4cmVmSW5mbykgewogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIGluZm9PYmpba2V5XSA9IHN0cmluZ1RvUERGU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXdYcmVmSW5mbyA9IHsKICAgICAgICAgIHJvb3RSZWY6IGNhdGFsb2dSZWYsCiAgICAgICAgICBlbmNyeXB0UmVmOiB4cmVmLnRyYWlsZXIuZ2V0UmF3KCJFbmNyeXB0IikgfHwgbnVsbCwKICAgICAgICAgIG5ld1JlZjogeHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKSwKICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAogICAgICAgICAgaW5mbzogaW5mb09iaiwKICAgICAgICAgIGZpbGVJZHM6IHhyZWYudHJhaWxlci5nZXQoIklEIikgfHwgbnVsbCwKICAgICAgICAgIHN0YXJ0WFJlZjogbGluZWFyaXphdGlvbiA/IHN0YXJ0WFJlZiA6IHhyZWYubGFzdFhSZWZTdHJlYW1Qb3MgPz8gc3RhcnRYUmVmLAogICAgICAgICAgZmlsZW5hbWUKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgICAgICAgb3JpZ2luYWxEYXRhOiBzdHJlYW0uYnl0ZXMsCiAgICAgICAgeHJlZkluZm86IG5ld1hyZWZJbmZvLAogICAgICAgIGNoYW5nZXMsCiAgICAgICAgeHJlZiwKICAgICAgICBoYXNYZmE6ICEheGZhLAogICAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICAgIGhhc1hmYURhdGFzZXRzRW50cnksCiAgICAgICAgbmVlZEFwcGVhcmFuY2VzLAogICAgICAgIGFjcm9Gb3JtUmVmLAogICAgICAgIGFjcm9Gb3JtLAogICAgICAgIHhmYURhdGEsCiAgICAgICAgdXNlWHJlZlN0cmVhbTogaXNEaWN0KHhyZWYudG9wRGljdCwgIlhSZWYiKQogICAgICB9KS5maW5hbGx5KCgpID0+IHsKICAgICAgICB4cmVmLnJlc2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPcGVyYXRvckxpc3QiLCBmdW5jdGlvbiAoZGF0YSwgc2luaykgewogICAgICBjb25zdCBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDsKICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0T3BlcmF0b3JMaXN0OiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgI
20HN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICBzaW5rLAogICAgICAgICAgdGFzaywKICAgICAgICAgIGludGVudDogZGF0YS5pbnRlbnQsCiAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSwKICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBkYXRhLmFubm90YXRpb25TdG9yYWdlLAogICAgICAgICAgbW9kaWZpZWRJZHM6IGRhdGEubW9kaWZpZWRJZHMKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChvcGVyYXRvckxpc3RJbmZvKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHN0YXJ0KSB7CiAgICAgICAgICAgIGluZm8oYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldE9wZXJhdG9yTGlzdDogdGltZT1gICsgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBsZW49JHtvcGVyYXRvckxpc3RJbmZvLmxlbmd0aH1gKTsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuY2xvc2UoKTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRUZXh0Q29udGVudCIsIGZ1bmN0aW9uIChkYXRhLCBzaW5rKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgfSA9IGRhdGE7CiAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZXh0cmFjdFRleHRDb250ZW50KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICB0YXNrLAogICAgICAgICAgc2luaywKICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgaW5mbyhgcGFnZT0ke3BhZ2VJbmRleCArIDF9IC0gZ2V0VGV4dENvbnRlbnQ6IHRpbWU9YCArIGAke0RhdGUubm93KCkgLSBzdGFydH1tc2ApOwogICAgICAgICAgfQogICAgICAgICAgc2luay5jbG9zZSgpOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAodGFzay50ZXJtaW5hdGVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFN0cnVjdFRyZWUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CiAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJnZXRTdHJ1Y3RUcmVlIik7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJGb250RmFsbGJhY2siLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5mb250RmFsbGJhY2soZGF0YS5pZCwgaGFuZGxlcik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkNsZWFudXAiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5jbGVhbnVwKHRydWUpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJUZXJtaW5hdGUiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTsKICAgICAgY29uc3Qgd2FpdE9uID0gW107CiAgICAgIGlmIChwZGZNYW5hZ2VyKSB7CiAgICAgICAgcGRmTWFuYWdlci50ZXJtaW5hdGUobmV3IEFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOwogICAgICAgIGNvbnN0IGNsZWFudXBQcm9taXNlID0gcGRmTWFuYWdlci5jbGVhbnVwKCk7CiAgICAgICAgd2FpdE9uLnB1c2goY2xlYW51cFByb21pc2UpOwogICAgICAgIHBkZk1hbmFnZXIgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIGNsZWFyR2xvYmFsQ2FjaGVzKCk7CiAgICAgIH0KICAgICAgY2FuY2VsWEhScz8uKG5ldyBBYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTsKICAgICAgZm9yIChjb25zdCB0YXNrIG9mIFdvcmtlclRhc2tzKSB7CiAgICAgICAgd2FpdE9uLnB1c2godGFzay5maW5pc2hlZCk7CiAgICAgICAgdGFzay50ZXJtaW5hdGUoKTsKICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICBoYW5kbGVyLmRlc3Ryb3koKTsKICAgICAgICBoYW5kbGVyID0gbnVsbDsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlJlYWR5IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgc2V0dXBEb2MoZG9jUGFyYW1zKTsKICAgICAgZG9jUGFyYW1zID0gbnVsbDsKICAgIH0pOwogICAgcmV0dXJuIHdvcmtlckhhbmRsZXJOYW1lOwogIH0KICBzdGF0aWMgaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHsKICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsICJtYWluIiwgcG9ydCk7CiAgICB0aGlzLnNldHVwKGhhbmRsZXIsIHBvcnQpOwogICAgaGFuZGxlci5zZW5kKCJyZWFkeSIsIG51bGwpOwogIH0KfQoKOy8vIC4vc3JjL3BkZi53b3JrZXIuanMKCmNvbnN0IHBkZmpzVmVyc2lvbiA9ICI0LjEwLjM4IjsKY29uc3QgcGRmanNCdWlsZCA9ICJmOWJlYTM5N2YiOwoKdmFyIF9fd2VicGFja19leHBvcnRzX19Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IF9fd2VicGFja19leHBvcnRzX18uV29ya2VyTWVzc2FnZUhhbmRsZXI7CmV4cG9ydCB7
20IF9fd2VicGFja19leHBvcnRzX19Xb3JrZXJNZXNzYWdlSGFuZGxlciBhcyBXb3JrZXJNZXNzYWdlSGFuZGxlciB9OwoKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmLndvcmtlci5tanMubWFw",self.location).href),l.workerSrc=S,Z.value=window.devicePixelRatio||1,_.value=window.innerHeight,await Rg(),SA(),cg(A.src)){const y=mC();rB(y),window.addEventListener("resize",cd),XA.value=!0}E.value=!0,$I(()=>A.src,y=>{if(!cg(y)){JA(),QI();return}const D=mC();rB(D),XA.value||(window.addEventListener("resize",cd),XA.value=!0)}),$I([i,B,()=>A.pdfWidth],()=>{E.value&&Zd()}),$I([()=>A.virtual,c],()=>{E.value&&mg()})}catch(U){g("onError",U)}}),Ec(()=>{u.value=!0,clearTimeout(JI),clearTimeout(Bd),cancelAnimationFrame(yA),XA.value&&typeof window<"u"&&window.removeEventListener("resize",cd),JA()});let yA=0;const uG=U=>1-Math.pow(1-U,3),pG=()=>{if(!K.value)return;const U=500,S=K.value.scrollTop,y=performance.now(),D=T=>{if(u.value||!K.value)return;const II=T-y,dI=Math.min(II/U,1),gI=uG(dI),VI=S*(1-gI);K.value.scrollTo(0,VI),dI<1&&(yA=requestAnimationFrame(D))};cancelAnimationFrame(yA),yA=requestAnimationFrame(D)},tA=U=>{if(!K.value||!Ag.value.length)return;const S=Math.max(0,Math.min(U-1,Ag.value.length-1)),y=Ag.value[S];K.value.scrollTo(0,y+2)};$I(()=>A.page,U=>{U!==m.value&&(r.value?tA(U):AI=()=>tA(U))}),$I(()=>r.value,U=>{U&&AI&&(AI(),AI=null)}),$I(()=>m.value,U=>{g("onPageChange",U)});const KG=(U,S)=>{if(!w.value||w.value[U]===S)return;const y=w.value[U];y&&y!==S&&q(U);const D=w.value.slice();D[U]=S,w.value=D;const T=o.value[U];S&&T&&T.inView&&!T.rendered&&RI(U,s)},kG=U=>{let S=J.get(U);return S||(S=y=>{KG(U,y instanceof HTMLCanvasElement?y:null)},J.set(U,S)),S};return I({reload:()=>{typeof window<"u"&&(jB.value=window.innerWidth-2),SA(),Zd()},goToPage:U=>{tA(U)},getPdf:()=>G,getTotalPages:()=>Q.value,getCurrentPage:()=>m.value,print:async()=>{if(G&&!(typeof window>"u"))try{const U=await G.getData(),S=new Blob([U],{type:"application/pdf"}),y=URL.createObjectURL(S),D=document.createElement("iframe");D.style.position="fixed",D.style.right="0",D.style.bottom="0",D.style.width="0",D.style.height="0",D.style.border="0",D.src=y,D.onload=()=>{var T,II;try{(T=D.contentWindow)==null||T.focus(),(II=D.contentWindow)==null||II.print()}catch(dI){g("onError",dI)}},document.body.appendChild(D),window.setTimeout(()=>{URL.revokeObjectURL(y),D.remove()},6e4)}catch(U){g("onError",U)}},download:async U=>{if(G&&!(typeof window>"u"))try{const S=await G.getData(),y=new Blob([S],{type:"application/pdf"}),D=URL.createObjectURL(y),T=document.createElement("a");T.href=D,T.download=U||"document.pdf",document.body.appendChild(T),T.click(),T.remove(),window.setTimeout(()=>URL.revokeObjectURL(D),5e3)}catch(S){g("onError",S)}},destroy:()=>{JA(),QI()}}),(U,S)=>(wI(),rI("div",YY,[aI("div",wY,[aI("div",{ref_key:"scroller",ref:K,class:"pdf-vue3-scroller",style:ug([{height:"100%","overflow-y":"auto"},{maxHeight:`${_.value}px`}]),onScroll:DG},[aI("div",{class:"pdf-vue3-canvas-container",ref_key:"container",ref:t,style:ug([{margin:"0 auto",position:"relative"},{width:isNaN(Number(A.pdfWidth))?A.pdfWidth:`${A.pdfWidth}px`,height:CC.value?`${CC.value}px`:"auto"}])},[(wI(!0),rI(rc,null,_G(o.value,(y,D)=>(wI(),rI("div",{key:D,class:"pdf-vue3-page",style:ug({position:"absolute",top:`${Ag.value[D]||0}px`,left:0,right:0,width:"100%",height:`${y.renderHeight}px`,display:"flex",justifyContent:"center"})},[y.inView||!A.virtual?(wI(),rI("canvas",{key:0,ref_for:!0,ref:kG(D),class:"pdf-vue3-canvas",style:ug([{display:"block","box-shadow":"#a9a9a9 0px 1px 3px 0px",background:"#fff"},{width:`${y.renderWidth}px`,height:`${y.renderHeight}px`}])},null,4)):DA(U.$slots,"pagePlaceholder",{key:1,page:D+1,width:y.renderWidth,height:y.renderHeight},()=>[aI("div",{class:"pdf-vue3-page-placeholder",style:ug({width:`${y.renderWidth}px`,height:`${y.renderHeight}px`,background:"repeating-linear-gradient(45deg,#f4f4f4,#f4f4f4 10px,#ececec 10px,#ececec 20px)",boxShadow:"#a9a9a9 0px 1px 3px 0px"})},null,4)])],4))),128))],4)],36)]),A.showProgress?(wI(),rI("div",hY,[j(F).progress?DA(U.$slots,"progress",{key:0,loadRatio:V.value}):(wI(),rI("div",{key:1,style:ug([{width:"0%",height:"4px",transition:"all 0.2s"},{width:`${V.value}%`,opacity:V.value<100?"1":"0",backgroundColor:A.progressColor}])},null,4))])):_A("",!0),A.showPageTooltip?(wI(),rI("div",eY,[j(F).pageTooltip?DA(U.$slots,"pageTooltip",{key:0,currentPage:m.value,totalPages:Q.value}):(wI(),rI("div",{key:1,style:ug([{padding:"4px 8px",background:"rgba(0, 0, 0, 0.5)",color:"#ffffff","font-size":"16px","border-radius":"6px",display:"inline-block",transition:"opacity 0.3s"},{opacity:O.value&&Q.value>0?"1":"0"}])},AA(m.value)+"/"+AA(Q.value),5))])):_A("",!0),A.showBackToTopBtn?(wI(),rI("div",{key:2,class:"pdf-vue3-backToTopBtn",onClick:pG,style:ug([{position:"absolute",right:"16px",bottom:"16
20px",display:"inline-block","user-select":"none","pointer-events":"none",opacity:"0",transition:"opacity 0.3s"},n.value>A.scrollThreshold?{opacity:"1",pointerEvents:"initial"}:void 0])},[j(F).backToTopBtn?DA(U.$slots,"backToTopBtn",{key:0,scrollOffset:n.value}):(wI(),rI("div",JY,XY))],4)):_A("",!0)]))}}),tY=WI(C=>{C.vueApp.component("VuePDF",yY)}),DY=WI(async()=>{let C,I;return{provide:{swal:([C,I]=Og(()=>h(()=>import("./CPXpo6tx.js"),[],import.meta.url)),C=await C,I(),C).default}}}),MY=WI({enforce:"post",async setup(){const C=EC(),I=ZF("nuxt-seo-utils:routeRules",()=>null);if(I.value){const{head:g,seoMeta:A}=I.value;g&&C.push(g),A&&Ji(A)}}});function HY(C,I){let g=C;Ug(C,{strict:!1,acceptRelative:!0})&&(g=NA(C).pathname);const A=eW(I.base||"/");A!=="/"&&g.startsWith(A)&&(g=g.slice(A.length));let l=$g(I.absolute?I.siteUrl:"");A!=="/"&&l.endsWith(A)&&(l=l.slice(0,l.indexOf(A)));const d=I.withBase?Md(A,l||"/"):l,Z=Md(g,d);return g==="/"&&!I.withBase?ul(Z):KY(I.trailingSlash,Z)}const uY=["jpg","jpeg","png","gif","bmp","webp","svg","ico","pdf","doc","docx","xls","xlsx","ppt","pptx","txt","md","markdown","zip","rar","7z","tar","gz","mp3","wav","flac","ogg","opus","m4a","aac","midi","mid","mp4","avi","mkv","mov","wmv","flv","webm","html","css","js","json","xml","tsx","jsx","ts","vue","svelte","xsl","rss","atom","php","py","rb","java","c","cpp","h","go","csv","tsv","sql","yaml","yml","woff","woff2","ttf","otf","eot","exe","msi","apk","ipa","dmg","iso","bin","bat","cmd","sh","env","htaccess","conf","toml","ini","deb","rpm","jar","war","epub","mobi","log","tmp","bak","old","sav"];function pY(C){const g=(C.split("/").pop()||C).match(/\.[0-9a-z]+$/i)?.[0];return g&&uY.includes(g.replace(".",""))}function KY(C,I){const g=NA(I);if(pY(g.pathname))return I;const A=C?ul(g.pathname):$g(g.pathname);return`${g.protocol?`${g.protocol}//`:""}${g.host||""}${A}${g.search||""}${g.hash||""}`}function kY(C){return window.location.origin}function TY(C){return kY()}function zY(C={}){const I=tZ(),g=TY(),A=og().app.baseURL||"/";return l=>v(()=>HY(j(l),{absolute:j(C.absolute),withBase:j(C.withBase),siteUrl:j(C.canonical)!==!1?I.url:g,trailingSlash:I.trailingSlash,base:A}))}function LY(){const C=tZ({resolveRefs:!1}),I=()=>(Ig(C.currentLocale)||Ig(C.defaultLocale)||"en").replace(/_/g,"-");EC().use(wi);const{canonicalQueryWhitelist:A,canonicalLowercase:l}=og().public["seo-utils"],d=bC(),Z=zY({withBase:!0,absolute:!0}),B=LC(),c=v(()=>{if(B.value)return!1;const{query:V}=d;let W=Z(d.path||"/").value||d.path;if(l)try{W=W.toLocaleLowerCase(I())}catch{W=W.toLowerCase()}const G=Object.fromEntries(Object.entries(V).filter(([s])=>A.includes(s)).sort(([s],[Q])=>s.localeCompare(Q)));return{rel:"canonical",href:Object.keys(G).length?`${W}?${_c(G)}`:W}}),i={tagPriority:"low"};Kl({htmlAttrs:{lang:I},templateParams:{site:()=>C,siteName:()=>C.name},titleTemplate:"%s %separator %siteName",link:[()=>c.value]},i);const F={ogType:"website",ogUrl:()=>{const V=c.value;return V?V.href:!1},ogLocale:()=>{const V=I();if(V){const W=V.replace("-","_");if(W.includes("_"))return W}return!1},ogSiteName:C.name};if(C.description&&(F.description=C.description),C.twitter){const V=C.twitter.startsWith("@")?C.twitter:`@${C.twitter}`;F.twitterCreator=V,F.twitterSite=V}Ji(F,i)}const EY=WI({name:"nuxt-seo:defaults",order:999,env:{islands:!1},setup(){LY()}}),rY=[es,Ss,Ms,WU,co,io,Fo,Vo,Go,Wo,Ro,so,bo,Pm,fm,$m,Zn,Bn,Nn,Xn,NY,tY,DY,MY,EY],XG=(C="RouteProvider")=>Bg({name:C,props:{route:{type:Object,required:!0},vnode:Object,vnodeRef:Object,renderKey:String,trackRootNodes:Boolean},setup(I){const g=I.renderKey,A=I.route,l={};for(const d in I.route)Object.defineProperty(l,d,{get:()=>g===I.renderKey?I.route[d]:A[d],enumerable:!0});return jg(FC,Qg(l)),()=>I.vnode?sI(I.vnode,{ref:I.vnodeRef}):I.vnode}}),jY=XG(),pc=new WeakMap,OY=Bg({name:"NuxtPage",inheritAttrs:!1,props:{name:{type:String},transition:{type:[Boolean,Object],default:void 0},keepalive:{type:[Boolean,Object],default:void 0},route:{type:Object},pageKey:{type:[Function,String],default:null}},setup(C,{attrs:I,slots:g,expose:A}){const l=CI(),d=f(),Z=EI(FC,null);let B;A({pageRef:d});const c=EI(Fi,null);let i;const F=l.deferHydration();let V=!1,W=!1,G=0;if(l.isHydrating){const s=l.hooks.hookOnce("app:error",F),Q=HI().beforeEach(()=>{s(),Q()})}C.pageKey&&$I(()=>C.pageKey,(s,Q)=>{s!==Q&&l.callHook("page:loading:start")});let R=!1;{const s=HI().beforeResolve(()=>{R=!1});sZ(()=>{s(),F()})}return()=>sI(xi,{name:C.name,route:C.route,...I},{default:s=>{const Q=vY(Z,s.route,s.Component),m=Z&&Z.matched.length===s.route.matched.length;if(!s.Component){if(i&&!m&&!yd(i))return i;F();return}if(i&&c&&!yd(i)&&!c.isCurrent(s.route))return i;if(Q&&Z&&(!c||c?.isCurrent(Z)))return(m||i)&&!yd(i)?i:null;const n=Pd(s,C.pageKey),o=xY(Z,s.route,s.Component);!l.isHydrating&&B===n&&!o&&Rg(()=>{R||(R=!0,l.callHook("page:loading:end"))}),V&&B!==n&&W&&G++,B=n;const w=!!(C.transition??s.route.meta.pageTransition??C0),J=w&&qi([C.transition,s.route.meta.pageTransition,C0,{onAfterLeave(){l["~transitionFinish"]?.(),delete l["~transitionFinish"],delete l["~transitionPromise"],l.callHook("page:transition:finish",s.Component)}}]),K=C.keepalive??s.route.meta.keepalive??lR;return i=fi(w&&J,vb(K,sI(bZ,{key:G,suspensible:!0,onPending:()=>{V=!0,w&&!l["~transitionPromise"]&&(l["~transitionPromise"]=new Promise(t=>{l["~transitionFinish"]=t})),l.callHook("page:start",s.Component)}
20,onResolve:async()=>{V=!1,W=!0;try{await Rg(),l._route.sync?.(),await l.callHook("page:finish",s.Component),!R&&!o&&(R=!0,await l.callHook("page:loading:end"))}finally{F()}}},{default:()=>{const t={key:n||void 0,vnode:g.default?PY(g.default,s):s.Component,route:s.route,renderKey:n||void 0,trackRootNodes:w,vnodeRef:d};if(!K)return sI(jY,t);const u=s.Component.type,E=u;let r=pc.get(E);return r||(r=XG(u.name||u.__name),pc.set(E,r)),sI(r,t)}}))).default(),i}})}});function vY(C,I,g){if(!C)return!1;const A=I.matched.findIndex(l=>l.components?.default===g?.type);return!A||A===-1?!1:I.matched.slice(0,A).some((l,d)=>l.components?.default!==C.matched[d]?.components?.default)||g&&Pd({route:I,Component:g})!==Pd({route:C,Component:g})}function xY(C,I,g){return C?I.matched.findIndex(l=>l.components?.default===g?.type)<I.matched.length-1:!1}function PY(C,I){const g=C(I);return g.length===1?sI(g[0]):sI(rc,void 0,g)}function yd(C){return!!C&&(!!C.suspense?.isUnmounted||!!C.component?.isUnmounted)}const yG=Si,fY=Bg({name:"LayoutLoader",inheritAttrs:!1,props:{name:String,layoutProps:Object},setup(C,I){return()=>sI(Eg[C.name],C.layoutProps,I.slots)}}),_Y={name:{type:[String,Boolean,Object],default:null},fallback:{type:[String,Object],default:null}},qY=Bg({name:"NuxtLayout",inheritAttrs:!1,props:_Y,setup(C,I){const g=CI(),A=EI(FC),d=!A||A===bC()?pi():A,Z=v(()=>{let F=j(C.name)??d?.meta.layout??yG(d?.path).appLayout??"default";return F&&!(F in Eg)&&C.fallback&&(F=j(C.fallback)),F}),B=OI();I.expose({layoutRef:B});const c=g.deferHydration();if(g.isHydrating){const F=g.hooks.hookOnce("app:error",c),V=HI().beforeEach(()=>{F(),V()})}let i;return()=>{const V=!!Z.value&&Z.value in Eg&&!!(d?.meta.layoutTransition??g0),W=V&&qi([d?.meta.layoutTransition,g0,{onBeforeLeave(){g["~transitionPromise"]=new Promise(R=>{g["~transitionFinish"]=R})},onAfterLeave(){g["~transitionFinish"]?.(),delete g["~transitionFinish"],delete g["~transitionPromise"]}}]),G=i;return i=Z.value,fi(W,{default:()=>sI(bZ,{suspensible:!0,onResolve:async()=>{await Rg(c)}},{default:()=>sI($Y,{layoutProps:qG(I.attrs,d.meta.layoutProps??{},{ref:B}),key:Z.value||void 0,name:Z.value,shouldProvide:!C.name,isRenderingNewLayout:R=>R!==G&&R===Z.value,hasTransition:V},I.slots)})}).default()}}}),$Y=Bg({name:"NuxtLayoutProvider",inheritAttrs:!1,props:{name:{type:[String,Boolean]},layoutProps:{type:Object},hasTransition:{type:Boolean},shouldProvide:{type:Boolean},isRenderingNewLayout:{type:Function,required:!0}},setup(C,I){const g=C.name;C.shouldProvide&&jg(Fi,{isCurrent:d=>g===!1||g===(d.meta.layout??yG(d.path).appLayout??"default")});const A=EI(FC);if(A&&A===bC()){const d=pi(),Z={};for(const B in d){const c=B;Object.defineProperty(Z,c,{enumerable:!0,get:()=>C.isRenderingNewLayout(C.name)?d[c]:A[c]})}jg(FC,Qg(Z))}return()=>!g||typeof g=="string"&&!(g in Eg)?I.slots.default?.():sI(fY,{key:g,layoutProps:C.layoutProps,name:g},I.slots)}}),tG=NZ("app-store",()=>{const{$swal:C}=CI(),I=f(),g=f(!1),A=f(!1),l=f(null),d=HI();async function Z(){const{data:G}=await yZ("/api/site/information",{method:"get"},"$2bXKmb0Bbd");return l.value=G.value?G.value:null,l.value.abn=l.value.abn?l.value.abn:"698 403 244",l.value}function B(G){A.value=G}function c(G){return I.value=G,C.fire({title:G.title,text:G.text,icon:G.icon,showCancelButton:!0,confirmButtonColor:"#3085d6",cancelButtonColor:"#d33",confirmButtonText:G.confirmButtonText})}function i(G,R){I.value=G,C.fire({title:G.title,text:G.text,icon:G.icon,confirmButtonText:G.confirmButtonText}).then(async s=>{s.isConfirmed&&R&&await d.push(R)})}function F(){i({title:"success",text:"your-record-has-been-deleted",icon:"success",confirmButtonText:"Ok"})}function V(G,R,s){const Q={};R?(Q.title="Record could not be added",Q.text=G,Q.confirmButtonText="ok",Q.icon="error"):(Q.title="success",Q.text="Your record has been added",Q.icon="success",Q.confirmButtonText="ok"),i(Q,s)}const W=v(()=>l.value);return{company:l,loadingData:g,loadInformation:Z,getCompany:W,loadingPage:A,setPageLoading:B,showAlertConfirm:c,showSuccesInfo:F,setApiResult:V}}),Iw=NZ("navigation-store",()=>{const C=f([]),I=f(null),g=tG(),A=f(!1);async function l(){if(I.value&&I.value.navigationMenu.length>0)return I.value;g.loadingData=!0,C.value=[];const{data:W,error:G}=await yZ("/api/cms/site",{method:"get"},"$-fSRJRreVT");if(G.value!==void 0)throw tg({statusCode:400,statusMessage:G.value.message});return C.value=W.value?W.value.navigationMenu:[],I.value=W.value,I.value}function d(W){A.value=W}const Z=v(()=>C.value),B=v(()=>A.value),c=v(()=>I.value?I.value?.pageSetting:null);function i(W){return V(W)}function F(W){const G=V(W);if(G>0)return{pageId:G,module:""};const R=W.split("/")[0];if(R&&W.includes("/")){const s=C.value.find(Q=>Q.slug===R&&Q.type===1);if(s)return{pageId:s.pageId,module:R}}return{pageId:0,module:""}}function V(W){let G=0;return C.value.forEach(R=>{if(R.slug===W){G=R.pageId;return}
20R.items&&R.items.forEach(s=>{if(s.slug===W){G=s.pageId;return}})}),G}return{list:C,getList:Z,loadList:l,setTransparent:d,isTransparent:B,getPageIdFromSlug:i,getPageSettings:c,webSite:I,getModuleFromSlug:F}}),gw=NZ("ms-auth-store",()=>{const{$msal:C,$msalLoginRequest:I}=CI(),g=og(),A=f(null),l=f(!1),d=f(null),Z=Il(g.public.accessCookieName),B=f(!1),c=f(null);Z.value&&(d.value=Z.value);function i(){try{l.value=!0,C.loginRedirect(I)}catch{l.value=!1}}async function F(){C.handleRedirectPromise().then(async t=>{if(t)A.value=t.account,d.value=t.accessToken,await W(t.accessToken);else{const u=C.getAllAccounts();u.length>0?(A.value=u[0],d.value=await V(u[0])):i()}R(!1)}).catch(t=>{l.value=!1})}async function V(t){const u={...I,account:t};try{const E=await C.acquireTokenSilent(u),r=E.expiresOn;return await W(E.accessToken),E.accessToken}catch{return null}}async function W(t){await $fetch("/api/auth/set-token",{method:"POST",headers:{"x-auth-token":t},body:{token:t}}).catch(u=>{throw new Error("Failed to set auth token on server:",u)})}async function G(){try{await $fetch("/api/auth/logout",{method:"POST"}),await C.clearCache(),await C.logoutRedirect(),A.value=null,l.value=!1}catch{l.value=!1}}function R(t){l.value=t}async function s(){const{data:t}=await yZ("/api/auth/session",{method:"GET",credentials:"include"},"$saEj6KNp23");return t.value?.token||null}function Q(){return d.value}function m(t){d.value=t}const n=v(()=>!!A.value),o=v(()=>A.value);async function w(){const t=await $fetch("/api/me",{method:"GET"});return B.value=!1,t.role||null}async function J(){const t=await $fetch("/api/me",{method:"GET"});return c.value=t,c}const K=v(()=>B.value);return{account:A,accessToken:d,processing:l,isAuthenticated:n,getAccount:o,loginRedirect:i,handleRedirect:F,logoutRedirect:G,setProcessing:R,getToken:s,getRole:w,getStateToken:Q,setStateToken:m,hasOwnerRole:K,getUser:J,user:c}}),Cw=Bg({__name:"app",async setup(C){let I,g;const{$msal:A}=CI(),l=Iw(),d=tG(),Z=gw();async function B(){const s=await Z.getToken();s&&Z.setStateToken(s)}[I,g]=PB(()=>B()),await I,g();const{data:c,status:i,error:F}=([I,g]=PB(async()=>AF("applicationData",async s=>{const[Q,m]=await Promise.all([l.loadList(),d.loadInformation()]);return{webSite:Q,company:m}})),I=await I,g(),I),V=v(()=>i.value==="success"&&!F.value&&!!c.value);
20l.setTransparent(c.value?.webSite.pageSetting?.navigationTransparent??!1);const W=f(c.value?.company?.ico),G=f();W.value!==null&&(G.value=`/api/image/${W.value}`),VA(async()=>{}),Kl({link:[G.value?{rel:"icon",href:G.value}:{}]});const R=v(()=>{const s=c.value?.company.name.toLowerCase().replaceAll(" ","")||null;return s&&s!=="leveled abilities"?s:"default"});return(s,Q)=>{const m=OY,n=qY;return wI(),rI("div",null,[j(V)?(wI(),NC(n,{key:0,name:j(R),company:j(c)?.company,"page-setting":j(c)?.webSite?.pageSetting,"link-menu":(j(c)?.webSite?.navigationMenu||[]).filter(o=>o?.status)},{default:UZ(()=>[jc(m)]),_:1},8,["name","company","page-setting","link-menu"])):_A("",!0)])}}}),Aw=QZ("/images/error.png"),lw={class:"relative bg-indigo-600/5"},dw={class:"container-fluid relative"},Zw={class:"grid grid-cols-1"},Bw={class:"flex flex-col min-h-screen justify-center md:px-10 py-10 px-4"},cw={class:"title-heading text-center my-auto"},iw={class:"mt-4"},Fw={class:"text-center"},Vw={class:"mb-0 text-slate-400"},Gw=Bg({__name:"error",props:{error:{}},setup(C){const I=()=>"";return(g,A)=>{const l=go;return wI(),rI("div",null,[aI("section",lw,[aI("div",dw,[aI("div",Zw,[aI("div",Bw,[A[4]||(A[4]=aI("div",{class:"text-center"},[aI("a",{href:"/"})],-1)),aI("div",cw,[A[1]||(A[1]=aI("img",{src:Aw,class:"mx-auto",alt:""},null,-1)),A[2]||(A[2]=aI("h1",{class:"mt-3 mb-6 md:text-5xl text-3xl font-bold"}," Page Not Found? ",-1)),A[3]||(A[3]=aI("p",{class:"text-slate-400"},[id(" Whoops, this is embarassing. "),aI("br"),id(" Looks like the page you were looking for wasn't found. ")],-1)),aI("div",iw,[jc(l,{to:"/",class:"btn bg-indigo-600 hover:bg-indigo-700 border-indigo-600 hover:border-indigo-700 text-white rounded-md"},{default:UZ(()=>[...A[0]||(A[0]=[id("Back to Home",-1)])]),_:1})])]),aI("div",Fw,[aI("p",Vw,AA(C.error.statusCode)+" "+AA(C.error.message)+" "+AA(I()),1)])])])])])])}}}),Ww={key:0},Kc={__name:"nuxt-root",setup(C){const I=()=>null,g=CI(),A=g.deferHydration();if(g.isHydrating){const F=g.hooks.hookOnce("app:error",A),V=HI().beforeEach(()=>{F(),V()})}const l=!1;jg(FC,bC()),g.hooks.callHookWith(F=>F.map(V=>V()),"vue:setup",[]);const d=LC(),Z=!1,B=/bot\b|chrome-lighthouse|facebookexternalhit|google\b/i;function c(F,V,W){const G=g.vueApp.config.errorHandler;if(G&&!G.__nuxt_default)try{G(F,V,W)}catch{}}$G((F,V,W)=>{if(g.hooks.callHook("vue:error",F,V,W)?.catch(G=>{}),B.test(navigator.userAgent))return g.hooks.callHook("app:error",F),!1;if(Wi(F)&&(F.fatal||F.unhandled))return g.runWithContext(()=>ZC(F)),c(F,V,W),!1});const i=!1;return(F,V)=>(wI(),NC(bZ,{onResolve:j(A)},{default:UZ(()=>[j(Z)?(wI(),rI("div",Ww)):j(d)?(wI(),NC(j(Gw),{key:1,error:j(d)},null,8,["error"])):j(i)?(wI(),NC(j(I),{key:2,context:j(i)},null,8,["context"])):j(l)?(wI(),NC(IW(j(l)),{key:3})):(wI(),NC(j(Cw),{key:4}))]),_:1},8,["onResolve"]))}};let kc;{let C;kc=async function(){if(C)return C;const g=!!(window.__NUXT__?.serverRendered??document.getElementById("__NUXT_DATA__")?.dataset.ssr==="true"),A=g?gW(Kc):CW(Kc),l=GR({vueApp:A});async function d(Z){await l.callHook("app:error",Z),l.payload.error||=tg(Z)}d.__nuxt_default=!0,A.config.errorHandler=d,l.hook("app:suspense:resolve",()=>{A.config.errorHandler===d&&(A.config.errorHandler=void 0)}),!g&&A0.id&&l.hook("app:suspense:resolve",()=>{document.getElementById(A0.id)?.remove()});try{await sR(l,rY)}catch(Z){d(Z)}try{await l.hooks.callHook("app:created",A),await l.hooks.callHook("app:beforeMount",A),A.mount(iR),await l.hooks.callHook("app:mounted",A),await Rg()}catch(Z){d(Z)}return A},C=kc().catch(I=>{throw I})}export{go as _,bC as a,gw as b,og as c,Iw as d,yZ as e,tG as f,NZ as g,Kl as h,AF as i,bw as j,pl as k,aZ as l,Ug as m,qA as n,sw as o,NA as p,fc as q,CI as r,Uw as s,QZ as t,HI as u,ow as v,eW as w,NU as x};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.