hrms-manual/dist/assets/index-b183697f.js
2023-09-06 14:51:44 +07:00

7 lines
2.7 MiB
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{b$ as getAugmentedNamespace,d as defineComponent,a as ref,w as watch,o as onMounted,e as openBlock,f as createElementBlock,I as withDirectives,J as vShow,g as createVNode,A as createBaseVNode,k as renderSlot,c0 as shallowRef,c1 as toRaw}from"./index-3a2b6cd5.js";function commonjsRequire(F){throw new Error('Could not dynamically require "'+F+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var pdf={exports:{}};const __viteBrowserExternal={},__viteBrowserExternal$1=Object.freeze(Object.defineProperty({__proto__:null,default:__viteBrowserExternal},Symbol.toStringTag,{value:"Module"})),require$$5=getAugmentedNamespace(__viteBrowserExternal$1);(function(module,exports){(function(C,a){module.exports=a()})(globalThis,()=>(()=>{var __webpack_modules__=[,(F,C)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.VerbosityLevel=C.Util=C.UnknownErrorException=C.UnexpectedResponseException=C.TextRenderingMode=C.RenderingIntentFlag=C.PromiseCapability=C.PermissionFlag=C.PasswordResponses=C.PasswordException=C.PageActionEventType=C.OPS=C.MissingPDFException=C.MAX_IMAGE_SIZE_TO_CACHE=C.LINE_FACTOR=C.LINE_DESCENT_FACTOR=C.InvalidPDFException=C.ImageKind=C.IDENTITY_MATRIX=C.FormatError=C.FeatureTest=C.FONT_IDENTITY_MATRIX=C.DocumentActionEventType=C.CMapCompressionType=C.BaseException=C.BASELINE_FACTOR=C.AnnotationType=C.AnnotationStateModelType=C.AnnotationReviewState=C.AnnotationReplyType=C.AnnotationMode=C.AnnotationMarkedState=C.AnnotationFlag=C.AnnotationFieldFlag=C.AnnotationEditorType=C.AnnotationEditorPrefix=C.AnnotationEditorParamsType=C.AnnotationBorderStyleType=C.AnnotationActionEventType=C.AbortException=void 0,C.assert=c,C.bytesToString=v,C.createValidAbsoluteUrl=n,C.getModificationDate=$I,C.getVerbosityLevel=U,C.info=Q,C.isArrayBuffer=rI,C.isArrayEqual=UI,C.normalizeUnicode=bg,C.objectFromMap=uI,C.objectSize=XI,C.setVerbosityLevel=oI,C.shadow=g,C.string32=MI,C.stringToBytes=II,C.stringToPDFString=TI,C.stringToUTF8String=jI,C.unreachable=G,C.utf8StringToString=JI,C.warn=D;const a=[1,0,0,1,0,0];C.IDENTITY_MATRIX=a;const l=[.001,0,0,.001,0,0];C.FONT_IDENTITY_MATRIX=l;const s=1e7;C.MAX_IMAGE_SIZE_TO_CACHE=s;const S=1.35;C.LINE_FACTOR=S;const M=.35;C.LINE_DESCENT_FACTOR=M;const L=M/S;C.BASELINE_FACTOR=L;const X={ANY:1,DISPLAY:2,PRINT:4,SAVE:8,ANNOTATIONS_FORMS:16,ANNOTATIONS_STORAGE:32,ANNOTATIONS_DISABLE:64,OPLIST:256};C.RenderingIntentFlag=X;const A={DISABLE:0,ENABLE:1,ENABLE_FORMS:2,ENABLE_STORAGE:3};C.AnnotationMode=A;const I="pdfjs_internal_editor_";C.AnnotationEditorPrefix=I;const m={DISABLE:-1,NONE:0,FREETEXT:3,INK:15};C.AnnotationEditorType=m;const W={FREETEXT_SIZE:1,FREETEXT_COLOR:2,FREETEXT_OPACITY:3,INK_COLOR:11,INK_THICKNESS:12,INK_OPACITY:13};C.AnnotationEditorParamsType=W;const Z={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048};C.PermissionFlag=Z;const w={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4};C.TextRenderingMode=w;const y={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};C.ImageKind=y;const N={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26};C.AnnotationType=N;const Y={MARKED:"Marked",REVIEW:"Review"};C.AnnotationStateModelType=Y;const k={MARKED:"Marked",UNMARKED:"Unmarked"};C.AnnotationMarkedState=k;const j={ACCEPTED:"Accepted",REJECTED:"Rejected",CANCELLED:"Cancelled",COMPLETED:"Completed",NONE:"None"};C.AnnotationReviewState=j;const p={GROUP:"Group",REPLY:"R"};C.AnnotationReplyType=p;const b={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};C.AnnotationFlag=b;const B={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864};C.AnnotationFieldFlag=B;const u={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};C.AnnotationBorderStyleType=u;const T={E:"Mouse Enter",X:"Mouse Exit",D:"Mouse Down",U:"Mouse Up",Fo:"Focus",Bl:"Blur",PO:"PageOpen",PC:"PageClose",PV:"PageVisible",PI:"PageInvisible",K:"Keystroke",F:"Format",V:"Validate",C:"Calculate"};C.AnnotationActionEventType=T;const J={WC:"WillClose",WS:"WillSave",DS:"DidSave",WP:"WillPrint",DP:"DidPrint"};C.DocumentActionEventType=J;const r={O:"PageOpen",C:"PageClose"};C.PageActionEventType=r;const q={ERRORS:0,WARNINGS:1,INFOS:5};C.VerbosityLevel=q;const hI={NONE:0,BINARY:1};C.CMapCompressionType=hI;const KI={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotation:80,endAnnotation:81,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};C.OPS=KI;const NI={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};C.PasswordResponses=NI;let yI=q.WARNINGS;function oI(aI){Number.isInteger(aI)&&(yI=aI)}function U(){return yI}function Q(aI){yI>=q.INFOS&&console.log(`Info: ${aI}`)}function D(aI){yI>=q.WARNINGS&&console.log(`Warning: ${aI}`)}function G(aI){throw new Error(aI)}function c(aI,f){aI||G(f)}function V(aI){switch(aI?.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}function n(aI,f=null,P=null){if(!aI)return null;try{if(P&&typeof aI=="string"&&(P.addDefaultProtocol&&aI.startsWith("www.")&&aI.match(/\./g)?.length>=2&&(aI=`http://${aI}`),P.tryConvertEncoding))try{aI=jI(aI)}catch{}const nI=f?new URL(aI,f):new URL(aI);if(V(nI))return nI}catch{}return null}function g(aI,f,P,nI=!1){return Object.defineProperty(aI,f,{value:P,enumerable:!nI,configurable:!0,writable:!1}),P}const d=function(){function f(P,nI){this.constructor===f&&G("Cannot initialize BaseException."),this.message=P,this.name=nI}return f.prototype=new Error,f.constructor=f,f}();C.BaseException=d;class i extends d{constructor(f,P){super(f,"PasswordException"),this.code=P}}C.PasswordException=i;class o extends d{constructor(f,P){super(f,"UnknownErrorException"),this.details=P}}C.UnknownErrorException=o;class R extends d{constructor(f){super(f,"InvalidPDFException")}}C.InvalidPDFException=R;class t extends d{constructor(f){super(f,"MissingPDFException")}}C.MissingPDFException=t;class z extends d{constructor(f,P){super(f,"UnexpectedResponseException"),this.status=P}}C.UnexpectedResponseException=z;class O extends d{constructor(f){super(f,"FormatError")}}C.FormatError=O;class sI extends d{constructor(f){super(f,"AbortException")}}C.AbortException=sI;function v(aI){(typeof aI!="object"||aI?.length===void 0)&&G("Invalid argument for bytesToString");const f=aI.length,P=8192;if(f<P)return String.fromCharCode.apply(null,aI);const nI=[];for(let tI=0;tI<f;tI+=P){const LI=Math.min(tI+P,f),kI=aI.subarray(tI,LI);nI.push(String.fromCharCode.apply(null,kI))}return nI.join("")}function II(aI){typeof aI!="string"&&G("Invalid argument for stringToBytes");const f=aI.length,P=new Uint8Array(f);for(let nI=0;nI<f;++nI)P[nI]=aI.charCodeAt(nI)&255;return P}function MI(aI){return String.fromCharCode(aI>>24&255,aI>>16&255,aI>>8&255,aI&255)}function XI(aI){return Object.keys(aI).length}function uI(aI){const f=Object.create(null);for(const[P,nI]of aI)f[P]=nI;return f}function DI(){const aI=new Uint8Array(4);return aI[0]=1,new Uint32Array(aI.buffer,0,1)[0]===1}function HI(){try{return new Function(""),!0}catch{return!1}}class SI{static get isLittleEndian(){return g(this,"isLittleEndian",DI())}static get isEvalSupported(){return g(this,"isEvalSupported",HI())}static get isOffscreenCanvasSupported(){return g(this,"isOffscreenCanvasSupported",typeof OffscreenCanvas<"u")}static get platform(){return typeof navigator>"u"?g(this,"platform",{isWin:!1,isMac:!1}):g(this,"platform",{isWin:navigator.platform.includes("Win"),isMac:navigator.platform.includes("Mac")})}}C.FeatureTest=SI;const pI=[...Array(256).keys()].map(aI=>aI.toString(16).padStart(2,"0"));class eI{static makeHexColor(f,P,nI){return`#${pI[f]}${pI[P]}${pI[nI]}`}static scaleMinMax(f,P){let nI;f[0]?(f[0]<0&&(nI=P[0],P[0]=P[1],P[1]=nI),P[0]*=f[0],P[1]*=f[0],f[3]<0&&(nI=P[2],P[2]=P[3],P[3]=nI),P[2]*=f[3],P[3]*=f[3]):(nI=P[0],P[0]=P[2],P[2]=nI,nI=P[1],P[1]=P[3],P[3]=nI,f[1]<0&&(nI=P[2],P[2]=P[3],P[3]=nI),P[2]*=f[1],P[3]*=f[1],f[2]<0&&(nI=P[0],P[0]=P[1],P[1]=nI),P[0]*=f[2],P[1]*=f[2]),P[0]+=f[4],P[1]+=f[4],P[2]+=f[5],P[3]+=f[5]}static transform(f,P){return[f[0]*P[0]+f[2]*P[1],f[1]*P[0]+f[3]*P[1],f[0]*P[2]+f[2]*P[3],f[1]*P[2]+f[3]*P[3],f[0]*P[4]+f[2]*P[5]+f[4],f[1]*P[4]+f[3]*P[5]+f[5]]}static applyTransform(f,P){const nI=f[0]*P[0]+f[1]*P[2]+P[4],tI=f[0]*P[1]+f[1]*P[3]+P[5];return[nI,tI]}static applyInverseTransform(f,P){const nI=P[0]*P[3]-P[1]*P[2],tI=(f[0]*P[3]-f[1]*P[2]+P[2]*P[5]-P[4]*P[3])/nI,LI=(-f[0]*P[1]+f[1]*P[0]+P[4]*P[1]-P[5]*P[0])/nI;return[tI,LI]}static getAxialAlignedBoundingBox(f,P){const nI=eI.applyTransform(f,P),tI=eI.applyTransform(f.slice(2,4),P),LI=eI.applyTransform([f[0],f[3]],P),kI=eI.applyTransform([f[2],f[1]],P);return[Math.min(nI[0],tI[0],LI[0],kI[0]),Math.min(nI[1],tI[1],LI[1],kI[1]),Math.max(nI[0],tI[0],LI[0],kI[0]),Math.max(nI[1],tI[1],LI[1],kI[1])]}static inverseTransform(f){const P=f[0]*f[3]-f[1]*f[2];return[f[3]/P,-f[1]/P,-f[2]/P,f[0]/P,(f[2]*f[5]-f[4]*f[3])/P,(f[4]*f[1]-f[5]*f[0])/P]}static singularValueDecompose2dScale(f){const P=[f[0],f[2],f[1],f[3]],nI=f[0]*P[0]+f[1]*P[2],tI=f[0]*P[1]+f[1]*P[3],LI=f[2]*P[0]+f[3]*P[2],kI=f[2]*P[1]+f[3]*P[3],fI=(nI+kI)/2,qI=Math.sqrt((nI+kI)**2-4*(nI*kI-LI*tI))/2,PI=fI+qI||1,QI=fI-qI||1;return[Math.sqrt(PI),Math.sqrt(QI)]}static normalizeRect(f){const P=f.slice(0);return f[0]>f[2]&&(P[0]=f[2],P[2]=f[0]),f[1]>f[3]&&(P[1]=f[3],P[3]=f[1]),P}static intersect(f,P){const nI=Math.max(Math.min(f[0],f[2]),Math.min(P[0],P[2])),tI=Math.min(Math.max(f[0],f[2]),Math.max(P[0],P[2]));if(nI>tI)return null;const LI=Math.max(Math.min(f[1],f[3]),Math.min(P[1],P[3])),kI=Math.min(Math.max(f[1],f[3]),Math.max(P[1],P[3]));return LI>kI?null:[nI,LI,tI,kI]}static bezierBoundingBox(f,P,nI,tI,LI,kI,fI,qI){const PI=[],QI=[[],[]];let _I,EI,Ag,zI,Zg,lg,dg,Gg;for(let cg=0;cg<2;++cg){if(cg===0?(EI=6*f-12*nI+6*LI,_I=-3*f+9*nI-9*LI+3*fI,Ag=3*nI-3*f):(EI=6*P-12*tI+6*kI,_I=-3*P+9*tI-9*kI+3*qI,Ag=3*tI-3*P),Math.abs(_I)<1e-12){if(Math.abs(EI)<1e-12)continue;zI=-Ag/EI,0<zI&&zI<1&&PI.push(zI);continue}dg=EI*EI-4*Ag*_I,Gg=Math.sqrt(dg),!(dg<0)&&(Zg=(-EI+Gg)/(2*_I),0<Zg&&Zg<1&&PI.push(Zg),lg=(-EI-Gg)/(2*_I),0<lg&&lg<1&&PI.push(lg))}let Ig=PI.length,xI;const gg=Ig;for(;Ig--;)zI=PI[Ig],xI=1-zI,QI[0][Ig]=xI*xI*xI*f+3*xI*xI*zI*nI+3*xI*zI*zI*LI+zI*zI*zI*fI,QI[1][Ig]=xI*xI*xI*P+3*xI*xI*zI*tI+3*xI*zI*zI*kI+zI*zI*zI*qI;return QI[0][gg]=f,QI[1][gg]=P,QI[0][gg+1]=fI,QI[1][gg+1]=qI,QI[0].length=QI[1].length=gg+2,[Math.min(...QI[0]),Math.min(...QI[1]),Math.max(...QI[0]),Math.max(...QI[1])]}}C.Util=eI;const FI=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];function TI(aI){if(aI[0]>="ï"){let P;if(aI[0]==="þ"&&aI[1]==="ÿ"?P="utf-16be":aI[0]==="ÿ"&&aI[1]==="þ"?P="utf-16le":aI[0]==="ï"&&aI[1]==="»"&&aI[2]==="¿"&&(P="utf-8"),P)try{const nI=new TextDecoder(P,{fatal:!0}),tI=II(aI);return nI.decode(tI)}catch(nI){D(`stringToPDFString: "${nI}".`)}}const f=[];for(let P=0,nI=aI.length;P<nI;P++){const tI=FI[aI.charCodeAt(P)];f.push(tI?String.fromCharCode(tI):aI.charAt(P))}return f.join("")}function jI(aI){return decodeURIComponent(escape(aI))}function JI(aI){return unescape(encodeURIComponent(aI))}function rI(aI){return typeof aI=="object"&&aI?.byteLength!==void 0}function UI(aI,f){if(aI.length!==f.length)return!1;for(let P=0,nI=aI.length;P<nI;P++)if(aI[P]!==f[P])return!1;return!0}function $I(aI=new Date){return[aI.getUTCFullYear().toString(),(aI.getUTCMonth()+1).toString().padStart(2,"0"),aI.getUTCDate().toString().padStart(2,"0"),aI.getUTCHours().toString().padStart(2,"0"),aI.getUTCMinutes().toString().padStart(2,"0"),aI.getUTCSeconds().toString().padStart(2,"0")].join("")}class OI{#I=!1;constructor(){this.promise=new Promise((f,P)=>{this.resolve=nI=>{this.#I=!0,f(nI)},this.reject=nI=>{this.#I=!0,P(nI)}})}get settled(){return this.#I}}C.PromiseCapability=OI;let vI=null,Cg=null;function bg(aI){return vI||(vI=/([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu,Cg=new Map([["ſt","ſt"]])),aI.replaceAll(vI,(f,P,nI)=>P?P.normalize("NFKC"):Cg.get(nI))}},(__unused_webpack_module,exports,__w_pdfjs_require__)=>{Object.defineProperty(exports,"__esModule",{value:!0}),exports.build=exports.RenderTask=exports.PDFWorkerUtil=exports.PDFWorker=exports.PDFPageProxy=exports.PDFDocumentProxy=exports.PDFDocumentLoadingTask=exports.PDFDataRangeTransport=exports.LoopbackPort=exports.DefaultStandardFontDataFactory=exports.DefaultFilterFactory=exports.DefaultCanvasFactory=exports.DefaultCMapReaderFactory=void 0,exports.getDocument=getDocument,exports.version=void 0;var _util=__w_pdfjs_require__(1),_annotation_storage=__w_pdfjs_require__(3),_display_utils=__w_pdfjs_require__(6),_font_loader=__w_pdfjs_require__(9),_canvas=__w_pdfjs_require__(11),_worker_options=__w_pdfjs_require__(14),_is_node=__w_pdfjs_require__(10),_message_handler=__w_pdfjs_require__(15),_metadata=__w_pdfjs_require__(16),_optional_content_config=__w_pdfjs_require__(17),_transport_stream=__w_pdfjs_require__(18),_xfa_text=__w_pdfjs_require__(19);const DEFAULT_RANGE_CHUNK_SIZE=65536,RENDERING_CANCELLED_TIMEOUT=100,DELAYED_CLEANUP_TIMEOUT=5e3;let DefaultCanvasFactory=_display_utils.DOMCanvasFactory;exports.DefaultCanvasFactory=DefaultCanvasFactory;let DefaultCMapReaderFactory=_display_utils.DOMCMapReaderFactory;exports.DefaultCMapReaderFactory=DefaultCMapReaderFactory;let DefaultFilterFactory=_display_utils.DOMFilterFactory;exports.DefaultFilterFactory=DefaultFilterFactory;let DefaultStandardFontDataFactory=_display_utils.DOMStandardFontDataFactory;if(exports.DefaultStandardFontDataFactory=DefaultStandardFontDataFactory,_is_node.isNodeJS){const{NodeCanvasFactory:F,NodeCMapReaderFactory:C,NodeFilterFactory:a,NodeStandardFontDataFactory:l}=__w_pdfjs_require__(20);exports.DefaultCanvasFactory=DefaultCanvasFactory=F,exports.DefaultCMapReaderFactory=DefaultCMapReaderFactory=C,exports.DefaultFilterFactory=DefaultFilterFactory=a,exports.DefaultStandardFontDataFactory=DefaultStandardFontDataFactory=l}let createPDFNetworkStream;if(_is_node.isNodeJS){const{PDFNodeStream:F}=__w_pdfjs_require__(21);createPDFNetworkStream=C=>new F(C)}else{const{PDFNetworkStream:F}=__w_pdfjs_require__(24),{PDFFetchStream:C}=__w_pdfjs_require__(25);createPDFNetworkStream=a=>(0,_display_utils.isValidFetchUrl)(a.url)?new C(a):new F(a)}function getDocument(F){if(typeof F=="string"||F instanceof URL?F={url:F}:(0,_util.isArrayBuffer)(F)&&(F={data:F}),typeof F!="object")throw new Error("Invalid parameter in getDocument, need parameter object.");if(!F.url&&!F.data&&!F.range)throw new Error("Invalid parameter object: need either .data, .range or .url");const C=new PDFDocumentLoadingTask,{docId:a}=C,l=F.url?getUrlProp(F.url):null,s=F.data?getDataProp(F.data):null,S=F.httpHeaders||null,M=F.withCredentials===!0,L=F.password??null,X=F.range instanceof PDFDataRangeTransport?F.range:null,A=Number.isInteger(F.rangeChunkSize)&&F.rangeChunkSize>0?F.rangeChunkSize:DEFAULT_RANGE_CHUNK_SIZE;let I=F.worker instanceof PDFWorker?F.worker:null;const m=F.verbosity,W=typeof F.docBaseUrl=="string"&&!(0,_display_utils.isDataScheme)(F.docBaseUrl)?F.docBaseUrl:null,Z=typeof F.cMapUrl=="string"?F.cMapUrl:null,w=F.cMapPacked!==!1,y=F.CMapReaderFactory||DefaultCMapReaderFactory,N=typeof F.standardFontDataUrl=="string"?F.standardFontDataUrl:null,Y=F.StandardFontDataFactory||DefaultStandardFontDataFactory,k=F.stopAtErrors!==!0,j=Number.isInteger(F.maxImageSize)&&F.maxImageSize>-1?F.maxImageSize:-1,p=F.isEvalSupported!==!1,b=typeof F.isOffscreenCanvasSupported=="boolean"?F.isOffscreenCanvasSupported:!_is_node.isNodeJS,B=Number.isInteger(F.canvasMaxAreaInBytes)?F.canvasMaxAreaInBytes:-1,u=typeof F.disableFontFace=="boolean"?F.disableFontFace:_is_node.isNodeJS,T=F.fontExtraProperties===!0,J=F.enableXfa===!0,r=F.ownerDocument||globalThis.document,q=F.disableRange===!0,hI=F.disableStream===!0,KI=F.disableAutoFetch===!0,NI=F.pdfBug===!0,yI=X?X.length:F.length??NaN,oI=typeof F.useSystemFonts=="boolean"?F.useSystemFonts:!_is_node.isNodeJS&&!u,U=typeof F.useWorkerFetch=="boolean"?F.useWorkerFetch:y===_display_utils.DOMCMapReaderFactory&&Y===_display_utils.DOMStandardFontDataFactory&&(0,_display_utils.isValidFetchUrl)(Z,document.baseURI)&&(0,_display_utils.isValidFetchUrl)(N,document.baseURI),Q=F.canvasFactory||new DefaultCanvasFactory({ownerDocument:r}),D=F.filterFactory||new DefaultFilterFactory({docId:a,ownerDocument:r}),G=null;(0,_util.setVerbosityLevel)(m);const c={canvasFactory:Q,filterFactory:D};if(U||(c.cMapReaderFactory=new y({baseUrl:Z,isCompressed:w}),c.standardFontDataFactory=new Y({baseUrl:N})),!I){const g={verbosity:m,port:_worker_options.GlobalWorkerOptions.workerPort};I=g.port?PDFWorker.fromPort(g):new PDFWorker(g),C._worker=I}const V={docId:a,apiVersion:"3.7.107",data:s,password:L,disableAutoFetch:KI,rangeChunkSize:A,length:yI,docBaseUrl:W,enableXfa:J,evaluatorOptions:{maxImageSize:j,disableFontFace:u,ignoreErrors:k,isEvalSupported:p,isOffscreenCanvasSupported:b,canvasMaxAreaInBytes:B,fontExtraProperties:T,useSystemFonts:oI,cMapUrl:U?Z:null,standardFontDataUrl:U?N:null}},n={ignoreErrors:k,isEvalSupported:p,disableFontFace:u,fontExtraProperties:T,enableXfa:J,ownerDocument:r,disableAutoFetch:KI,pdfBug:NI,styleElement:G};return I.promise.then(function(){if(C.destroyed)throw new Error("Loading aborted");const g=_fetchDocument(I,V),d=new Promise(function(i){let o;X?o=new _transport_stream.PDFDataTransportStream({length:yI,initialData:X.initialData,progressiveDone:X.progressiveDone,contentDispositionFilename:X.contentDispositionFilename,disableRange:q,disableStream:hI},X):s||(o=createPDFNetworkStream({url:l,length:yI,httpHeaders:S,withCredentials:M,rangeChunkSize:A,disableRange:q,disableStream:hI})),i(o)});return Promise.all([g,d]).then(function([i,o]){if(C.destroyed)throw new Error("Loading aborted");const R=new _message_handler.MessageHandler(a,i,I.port),t=new WorkerTransport(R,C,o,n,c);C._transport=t,R.send("Ready",null)})}).catch(C._capability.reject),C}async function _fetchDocument(F,C){if(F.destroyed)throw new Error("Worker was destroyed");const a=await F.messageHandler.sendWithPromise("GetDocRequest",C,C.data?[C.data.buffer]:null);if(F.destroyed)throw new Error("Worker was destroyed");return a}function getUrlProp(F){if(F instanceof URL)return F.href;try{return new URL(F,window.location).href}catch{if(_is_node.isNodeJS&&typeof F=="string")return F}throw new Error("Invalid PDF url data: either string or URL-object is expected in the url property.")}function getDataProp(F){if(_is_node.isNodeJS&&typeof Buffer<"u"&&F instanceof Buffer)return(0,_display_utils.deprecated)("Please provide binary data as `Uint8Array`, rather than `Buffer`."),new Uint8Array(F);if(F instanceof Uint8Array&&F.byteLength===F.buffer.byteLength)return F;if(typeof F=="string")return(0,_util.stringToBytes)(F);if(typeof F=="object"&&!isNaN(F?.length)||(0,_util.isArrayBuffer)(F))return new Uint8Array(F);throw new Error("Invalid PDF binary data: either TypedArray, string, or array-like object is expected in the data property.")}class PDFDocumentLoadingTask{static#I=0;constructor(){this._capability=new _util.PromiseCapability,this._transport=null,this._worker=null,this.docId=`d${PDFDocumentLoadingTask.#I++}`,this.destroyed=!1,this.onPassword=null,this.onProgress=null}get promise(){return this._capability.promise}async destroy(){this.destroyed=!0,await this._transport?.destroy(),this._transport=null,this._worker&&(this._worker.destroy(),this._worker=null)}}exports.PDFDocumentLoadingTask=PDFDocumentLoadingTask;class PDFDataRangeTransport{constructor(C,a,l=!1,s=null){this.length=C,this.initialData=a,this.progressiveDone=l,this.contentDispositionFilename=s,this._rangeListeners=[],this._progressListeners=[],this._progressiveReadListeners=[],this._progressiveDoneListeners=[],this._readyCapability=new _util.PromiseCapability}addRangeListener(C){this._rangeListeners.push(C)}addProgressListener(C){this._progressListeners.push(C)}addProgressiveReadListener(C){this._progressiveReadListeners.push(C)}addProgressiveDoneListener(C){this._progressiveDoneListeners.push(C)}onDataRange(C,a){for(const l of this._rangeListeners)l(C,a)}onDataProgress(C,a){this._readyCapability.promise.then(()=>{for(const l of this._progressListeners)l(C,a)})}onDataProgressiveRead(C){this._readyCapability.promise.then(()=>{for(const a of this._progressiveReadListeners)a(C)})}onDataProgressiveDone(){this._readyCapability.promise.then(()=>{for(const C of this._progressiveDoneListeners)C()})}transportReady(){this._readyCapability.resolve()}requestDataRange(C,a){(0,_util.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange")}abort(){}}exports.PDFDataRangeTransport=PDFDataRangeTransport;class PDFDocumentProxy{constructor(C,a){this._pdfInfo=C,this._transport=a}get annotationStorage(){return this._transport.annotationStorage}get filterFactory(){return this._transport.filterFactory}get numPages(){return this._pdfInfo.numPages}get fingerprints(){return this._pdfInfo.fingerprints}get isPureXfa(){return(0,_util.shadow)(this,"isPureXfa",!!this._transport._htmlForXfa)}get allXfaHtml(){return this._transport._htmlForXfa}getPage(C){return this._transport.getPage(C)}getPageIndex(C){return this._transport.getPageIndex(C)}getDestinations(){return this._transport.getDestinations()}getDestination(C){return this._transport.getDestination(C)}getPageLabels(){return this._transport.getPageLabels()}getPageLayout(){return this._transport.getPageLayout()}getPageMode(){return this._transport.getPageMode()}getViewerPreferences(){return this._transport.getViewerPreferences()}getOpenAction(){return this._transport.getOpenAction()}getAttachments(){return this._transport.getAttachments()}getJavaScript(){return this._transport.getJavaScript()}getJSActions(){return this._transport.getDocJSActions()}getOutline(){return this._transport.getOutline()}getOptionalContentConfig(){return this._transport.getOptionalContentConfig()}getPermissions(){return this._transport.getPermissions()}getMetadata(){return this._transport.getMetadata()}getMarkInfo(){return this._transport.getMarkInfo()}getData(){return this._transport.getData()}saveDocument(){return this._transport.saveDocument()}getDownloadInfo(){return this._transport.downloadInfoCapability.promise}cleanup(C=!1){return this._transport.startCleanup(C||this.isPureXfa)}destroy(){return this.loadingTask.destroy()}get loadingParams(){return this._transport.loadingParams}get loadingTask(){return this._transport.loadingTask}getFieldObjects(){return this._transport.getFieldObjects()}hasJSActions(){return this._transport.hasJSActions()}getCalculationOrderIds(){return this._transport.getCalculationOrderIds()}}exports.PDFDocumentProxy=PDFDocumentProxy;class PDFPageProxy{#I=null;#g=!1;constructor(C,a,l,s=!1){this._pageIndex=C,this._pageInfo=a,this._transport=l,this._stats=s?new _display_utils.StatTimer:null,this._pdfBug=s,this.commonObjs=l.commonObjs,this.objs=new PDFObjects,this._maybeCleanupAfterRender=!1,this._intentStates=new Map,this.destroyed=!1}get pageNumber(){return this._pageIndex+1}get rotate(){return this._pageInfo.rotate}get ref(){return this._pageInfo.ref}get userUnit(){return this._pageInfo.userUnit}get view(){return this._pageInfo.view}getViewport({scale:C,rotation:a=this.rotate,offsetX:l=0,offsetY:s=0,dontFlip:S=!1}={}){return new _display_utils.PageViewport({viewBox:this.view,scale:C,rotation:a,offsetX:l,offsetY:s,dontFlip:S})}getAnnotations({intent:C="display"}={}){const a=this._transport.getRenderingIntent(C);return this._transport.getAnnotations(this._pageIndex,a.renderingIntent)}getJSActions(){return this._transport.getPageJSActions(this._pageIndex)}get isPureXfa(){return(0,_util.shadow)(this,"isPureXfa",!!this._transport._htmlForXfa)}async getXfa(){return this._transport._htmlForXfa?.children[this._pageIndex]||null}render({canvasContext:C,viewport:a,intent:l="display",annotationMode:s=_util.AnnotationMode.ENABLE,transform:S=null,background:M=null,optionalContentConfigPromise:L=null,annotationCanvasMap:X=null,pageColors:A=null,printAnnotationStorage:I=null}){if(arguments[0]?.canvasFactory)throw new Error("render no longer accepts the `canvasFactory`-option, please pass it to the `getDocument`-function instead.");this._stats?.time("Overall");const m=this._transport.getRenderingIntent(l,s,I);this.#g=!1,this.#C(),L||(L=this._transport.getOptionalContentConfig());let W=this._intentStates.get(m.cacheKey);W||(W=Object.create(null),this._intentStates.set(m.cacheKey,W)),W.streamReaderCancelTimeout&&(clearTimeout(W.streamReaderCancelTimeout),W.streamReaderCancelTimeout=null);const Z=!!(m.renderingIntent&_util.RenderingIntentFlag.PRINT);W.displayReadyCapability||(W.displayReadyCapability=new _util.PromiseCapability,W.operatorList={fnArray:[],argsArray:[],lastChunk:!1,separateAnnots:null},this._stats?.time("Page Request"),this._pumpOperatorList(m));const w=Y=>{W.renderTasks.delete(y),(this._maybeCleanupAfterRender||Z)&&(this.#g=!0),this.#A(!Z),Y?(y.capability.reject(Y),this._abortOperatorList({intentState:W,reason:Y instanceof Error?Y:new Error(Y)})):y.capability.resolve(),this._stats?.timeEnd("Rendering"),this._stats?.timeEnd("Overall")},y=new InternalRenderTask({callback:w,params:{canvasContext:C,viewport:a,transform:S,background:M},objs:this.objs,commonObjs:this.commonObjs,annotationCanvasMap:X,operatorList:W.operatorList,pageIndex:this._pageIndex,canvasFactory:this._transport.canvasFactory,filterFactory:this._transport.filterFactory,useRequestAnimationFrame:!Z,pdfBug:this._pdfBug,pageColors:A});(W.renderTasks||=new Set).add(y);const N=y.task;return Promise.all([W.displayReadyCapability.promise,L]).then(([Y,k])=>{if(this.#g){w();return}this._stats?.time("Rendering"),y.initializeGraphics({transparency:Y,optionalContentConfig:k}),y.operatorListChanged()}).catch(w),N}getOperatorList({intent:C="display",annotationMode:a=_util.AnnotationMode.ENABLE,printAnnotationStorage:l=null}={}){function s(){M.operatorList.lastChunk&&(M.opListReadCapability.resolve(M.operatorList),M.renderTasks.delete(L))}const S=this._transport.getRenderingIntent(C,a,l,!0);let M=this._intentStates.get(S.cacheKey);M||(M=Object.create(null),this._intentStates.set(S.cacheKey,M));let L;return M.opListReadCapability||(L=Object.create(null),L.operatorListChanged=s,M.opListReadCapability=new _util.PromiseCapability,(M.renderTasks||=new Set).add(L),M.operatorList={fnArray:[],argsArray:[],lastChunk:!1,separateAnnots:null},this._stats?.time("Page Request"),this._pumpOperatorList(S)),M.opListReadCapability.promise}streamTextContent({includeMarkedContent:C=!1,disableNormalization:a=!1}={}){return this._transport.messageHandler.sendWithStream("GetTextContent",{pageIndex:this._pageIndex,includeMarkedContent:C===!0,disableNormalization:a===!0},{highWaterMark:100,size(s){return s.items.length}})}getTextContent(C={}){if(this._transport._htmlForXfa)return this.getXfa().then(l=>_xfa_text.XfaText.textContent(l));const a=this.streamTextContent(C);return new Promise(function(l,s){function S(){M.read().then(function({value:X,done:A}){if(A){l(L);return}Object.assign(L.styles,X.styles),L.items.push(...X.items),S()},s)}const M=a.getReader(),L={items:[],styles:Object.create(null)};S()})}getStructTree(){return this._transport.getStructTree(this._pageIndex)}_destroy(){this.destroyed=!0;const C=[];for(const a of this._intentStates.values())if(this._abortOperatorList({intentState:a,reason:new Error("Page was destroyed."),force:!0}),!a.opListReadCapability)for(const l of a.renderTasks)C.push(l.completed),l.cancel();return this.objs.clear(),this.#g=!1,this.#C(),Promise.all(C)}cleanup(C=!1){this.#g=!0;const a=this.#A(!1);return C&&a&&(this._stats&&=new _display_utils.StatTimer),a}#A(C=!1){if(this.#C(),!this.#g)return!1;if(C)return this.#I=setTimeout(()=>{this.#I=null,this.#A(!1)},DELAYED_CLEANUP_TIMEOUT),!1;for(const{renderTasks:a,operatorList:l}of this._intentStates.values())if(a.size>0||!l.lastChunk)return!1;return this._intentStates.clear(),this.objs.clear(),this.#g=!1,!0}#C(){this.#I&&(clearTimeout(this.#I),this.#I=null)}_startRenderPage(C,a){const l=this._intentStates.get(a);l&&(this._stats?.timeEnd("Page Request"),l.displayReadyCapability?.resolve(C))}_renderPageChunk(C,a){for(let l=0,s=C.length;l<s;l++)a.operatorList.fnArray.push(C.fnArray[l]),a.operatorList.argsArray.push(C.argsArray[l]);a.operatorList.lastChunk=C.lastChunk,a.operatorList.separateAnnots=C.separateAnnots;for(const l of a.renderTasks)l.operatorListChanged();C.lastChunk&&this.#A(!0)}_pumpOperatorList({renderingIntent:C,cacheKey:a,annotationStorageMap:l}){const S=this._transport.messageHandler.sendWithStream("GetOperatorList",{pageIndex:this._pageIndex,intent:C,cacheKey:a,annotationStorage:l}).getReader(),M=this._intentStates.get(a);M.streamReader=S;const L=()=>{S.read().then(({value:X,done:A})=>{if(A){M.streamReader=null;return}this._transport.destroyed||(this._renderPageChunk(X,M),L())},X=>{if(M.streamReader=null,!this._transport.destroyed){if(M.operatorList){M.operatorList.lastChunk=!0;for(const A of M.renderTasks)A.operatorListChanged();this.#A(!0)}if(M.displayReadyCapability)M.displayReadyCapability.reject(X);else if(M.opListReadCapability)M.opListReadCapability.reject(X);else throw X}})};L()}_abortOperatorList({intentState:C,reason:a,force:l=!1}){if(C.streamReader){if(C.streamReaderCancelTimeout&&(clearTimeout(C.streamReaderCancelTimeout),C.streamReaderCancelTimeout=null),!l){if(C.renderTasks.size>0)return;if(a instanceof _display_utils.RenderingCancelledException){let s=RENDERING_CANCELLED_TIMEOUT;a.extraDelay>0&&a.extraDelay<1e3&&(s+=a.extraDelay),C.streamReaderCancelTimeout=setTimeout(()=>{C.streamReaderCancelTimeout=null,this._abortOperatorList({intentState:C,reason:a,force:!0})},s);return}}if(C.streamReader.cancel(new _util.AbortException(a.message)).catch(()=>{}),C.streamReader=null,!this._transport.destroyed){for(const[s,S]of this._intentStates)if(S===C){this._intentStates.delete(s);break}this.cleanup()}}}get stats(){return this._stats}}exports.PDFPageProxy=PDFPageProxy;class LoopbackPort{#I=new Set;#g=Promise.resolve();postMessage(C,a){const l={data:structuredClone(C,a?{transfer:a}:null)};this.#g.then(()=>{for(const s of this.#I)s.call(this,l)})}addEventListener(C,a){this.#I.add(a)}removeEventListener(C,a){this.#I.delete(a)}terminate(){this.#I.clear()}}exports.LoopbackPort=LoopbackPort;const PDFWorkerUtil={isWorkerDisabled:!1,fallbackWorkerSrc:null,fakeWorkerId:0};exports.PDFWorkerUtil=PDFWorkerUtil;{if(_is_node.isNodeJS&&typeof commonjsRequire=="function")PDFWorkerUtil.isWorkerDisabled=!0,PDFWorkerUtil.fallbackWorkerSrc="./pdf.worker.js";else if(typeof document=="object"){const F=document?.currentScript?.src;F&&(PDFWorkerUtil.fallbackWorkerSrc=F.replace(/(\.(?:min\.)?js)(\?.*)?$/i,".worker$1$2"))}PDFWorkerUtil.isSameOrigin=function(F,C){let a;try{if(a=new URL(F),!a.origin||a.origin==="null")return!1}catch{return!1}const l=new URL(C,a);return a.origin===l.origin},PDFWorkerUtil.createCDNWrapper=function(F){const C=`importScripts("${F}");`;return URL.createObjectURL(new Blob([C]))}}class PDFWorker{static#workerPorts=new WeakMap;constructor({name:F=null,port:C=null,verbosity:a=(0,_util.getVerbosityLevel)()}={}){if(C&&PDFWorker.#workerPorts.has(C))throw new Error("Cannot use more than one PDFWorker per port.");if(this.name=F,this.destroyed=!1,this.verbosity=a,this._readyCapability=new _util.PromiseCapability,this._port=null,this._webWorker=null,this._messageHandler=null,C){PDFWorker.#workerPorts.set(C,this),this._initializeFromPort(C);return}this._initialize()}get promise(){return this._readyCapability.promise}get port(){return this._port}get messageHandler(){return this._messageHandler}_initializeFromPort(F){this._port=F,this._messageHandler=new _message_handler.MessageHandler("main","worker",F),this._messageHandler.on("ready",function(){}),this._readyCapability.resolve(),this._messageHandler.send("configure",{verbosity:this.verbosity})}_initialize(){if(!PDFWorkerUtil.isWorkerDisabled&&!PDFWorker._mainThreadWorkerMessageHandler){let{workerSrc:F}=PDFWorker;try{PDFWorkerUtil.isSameOrigin(window.location.href,F)||(F=PDFWorkerUtil.createCDNWrapper(new URL(F,window.location).href));const C=new Worker(F),a=new _message_handler.MessageHandler("main","worker",C),l=()=>{C.removeEventListener("error",s),a.destroy(),C.terminate(),this.destroyed?this._readyCapability.reject(new Error("Worker was destroyed")):this._setupFakeWorker()},s=()=>{this._webWorker||l()};C.addEventListener("error",s),a.on("test",M=>{if(C.removeEventListener("error",s),this.destroyed){l();return}M?(this._messageHandler=a,this._port=C,this._webWorker=C,this._readyCapability.resolve(),a.send("configure",{verbosity:this.verbosity})):(this._setupFakeWorker(),a.destroy(),C.terminate())}),a.on("ready",M=>{if(C.removeEventListener("error",s),this.destroyed){l();return}try{S()}catch{this._setupFakeWorker()}});const S=()=>{const M=new Uint8Array;a.send("test",M,[M.buffer])};S();return}catch{(0,_util.info)("The worker has been disabled.")}}this._setupFakeWorker()}_setupFakeWorker(){PDFWorkerUtil.isWorkerDisabled||((0,_util.warn)("Setting up fake worker."),PDFWorkerUtil.isWorkerDisabled=!0),PDFWorker._setupFakeWorkerGlobal.then(F=>{if(this.destroyed){this._readyCapability.reject(new Error("Worker was destroyed"));return}const C=new LoopbackPort;this._port=C;const a=`fake${PDFWorkerUtil.fakeWorkerId++}`,l=new _message_handler.MessageHandler(a+"_worker",a,C);F.setup(l,C);const s=new _message_handler.MessageHandler(a,a+"_worker",C);this._messageHandler=s,this._readyCapability.resolve(),s.send("configure",{verbosity:this.verbosity})}).catch(F=>{this._readyCapability.reject(new Error(`Setting up fake worker failed: "${F.message}".`))})}destroy(){this.destroyed=!0,this._webWorker&&(this._webWorker.terminate(),this._webWorker=null),PDFWorker.#workerPorts.delete(this._port),this._port=null,this._messageHandler&&(this._messageHandler.destroy(),this._messageHandler=null)}static fromPort(F){if(!F?.port)throw new Error("PDFWorker.fromPort - invalid method signature.");return this.#workerPorts.has(F.port)?this.#workerPorts.get(F.port):new PDFWorker(F)}static get workerSrc(){if(_worker_options.GlobalWorkerOptions.workerSrc)return _worker_options.GlobalWorkerOptions.workerSrc;if(PDFWorkerUtil.fallbackWorkerSrc!==null)return _is_node.isNodeJS||(0,_display_utils.deprecated)('No "GlobalWorkerOptions.workerSrc" specified.'),PDFWorkerUtil.fallbackWorkerSrc;throw new Error('No "GlobalWorkerOptions.workerSrc" specified.')}static get _mainThreadWorkerMessageHandler(){try{return globalThis.pdfjsWorker?.WorkerMessageHandler||null}catch{return null}}static get _setupFakeWorkerGlobal(){const loader=async()=>{const mainWorkerMessageHandler=this._mainThreadWorkerMessageHandler;if(mainWorkerMessageHandler)return mainWorkerMessageHandler;if(_is_node.isNodeJS&&typeof commonjsRequire=="function"){const worker=eval("require")(this.workerSrc);return worker.WorkerMessageHandler}return await(0,_display_utils.loadScript)(this.workerSrc),window.pdfjsWorker.WorkerMessageHandler};return(0,_util.shadow)(this,"_setupFakeWorkerGlobal",loader())}}exports.PDFWorker=PDFWorker;class WorkerTransport{#I=new Map;#g=new Map;#A=new Map;constructor(C,a,l,s,S){this.messageHandler=C,this.loadingTask=a,this.commonObjs=new PDFObjects,this.fontLoader=new _font_loader.FontLoader({ownerDocument:s.ownerDocument,styleElement:s.styleElement}),this._params=s,this.canvasFactory=S.canvasFactory,this.filterFactory=S.filterFactory,this.cMapReaderFactory=S.cMapReaderFactory,this.standardFontDataFactory=S.standardFontDataFactory,this.destroyed=!1,this.destroyCapability=null,this._passwordCapability=null,this._networkStream=l,this._fullReader=null,this._lastProgress=null,this.downloadInfoCapability=new _util.PromiseCapability,this.setupMessageHandler()}#C(C,a=null){const l=this.#I.get(C);if(l)return l;const s=this.messageHandler.sendWithPromise(C,a);return this.#I.set(C,s),s}get annotationStorage(){return(0,_util.shadow)(this,"annotationStorage",new _annotation_storage.AnnotationStorage)}getRenderingIntent(C,a=_util.AnnotationMode.ENABLE,l=null,s=!1){let S=_util.RenderingIntentFlag.DISPLAY,M=null;switch(C){case"any":S=_util.RenderingIntentFlag.ANY;break;case"display":break;case"print":S=_util.RenderingIntentFlag.PRINT;break;default:(0,_util.warn)(`getRenderingIntent - invalid intent: ${C}`)}switch(a){case _util.AnnotationMode.DISABLE:S+=_util.RenderingIntentFlag.ANNOTATIONS_DISABLE;break;case _util.AnnotationMode.ENABLE:break;case _util.AnnotationMode.ENABLE_FORMS:S+=_util.RenderingIntentFlag.ANNOTATIONS_FORMS;break;case _util.AnnotationMode.ENABLE_STORAGE:S+=_util.RenderingIntentFlag.ANNOTATIONS_STORAGE,M=(S&_util.RenderingIntentFlag.PRINT&&l instanceof _annotation_storage.PrintAnnotationStorage?l:this.annotationStorage).serializable;break;default:(0,_util.warn)(`getRenderingIntent - invalid annotationMode: ${a}`)}return s&&(S+=_util.RenderingIntentFlag.OPLIST),{renderingIntent:S,cacheKey:`${S}_${_annotation_storage.AnnotationStorage.getHash(M)}`,annotationStorageMap:M}}destroy(){if(this.destroyCapability)return this.destroyCapability.promise;this.destroyed=!0,this.destroyCapability=new _util.PromiseCapability,this._passwordCapability&&this._passwordCapability.reject(new Error("Worker was destroyed during onPassword callback"));const C=[];for(const l of this.#g.values())C.push(l._destroy());this.#g.clear(),this.#A.clear(),this.hasOwnProperty("annotationStorage")&&this.annotationStorage.resetModified();const a=this.messageHandler.sendWithPromise("Terminate",null);return C.push(a),Promise.all(C).then(()=>{this.commonObjs.clear(),this.fontLoader.clear(),this.#I.clear(),this.filterFactory.destroy(),this._networkStream&&this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated.")),this.messageHandler&&(this.messageHandler.destroy(),this.messageHandler=null),this.destroyCapability.resolve()},this.destroyCapability.reject),this.destroyCapability.promise}setupMessageHandler(){const{messageHandler:C,loadingTask:a}=this;C.on("GetReader",(l,s)=>{(0,_util.assert)(this._networkStream,"GetReader - no `IPDFStream` instance available."),this._fullReader=this._networkStream.getFullReader(),this._fullReader.onProgress=S=>{this._lastProgress={loaded:S.loaded,total:S.total}},s.onPull=()=>{this._fullReader.read().then(function({value:S,done:M}){if(M){s.close();return}(0,_util.assert)(S instanceof ArrayBuffer,"GetReader - expected an ArrayBuffer."),s.enqueue(new Uint8Array(S),1,[S])}).catch(S=>{s.error(S)})},s.onCancel=S=>{this._fullReader.cancel(S),s.ready.catch(M=>{if(!this.destroyed)throw M})}}),C.on("ReaderHeadersReady",l=>{const s=new _util.PromiseCapability,S=this._fullReader;return S.headersReady.then(()=>{(!S.isStreamingSupported||!S.isRangeSupported)&&(this._lastProgress&&a.onProgress?.(this._lastProgress),S.onProgress=M=>{a.onProgress?.({loaded:M.loaded,total:M.total})}),s.resolve({isStreamingSupported:S.isStreamingSupported,isRangeSupported:S.isRangeSupported,contentLength:S.contentLength})},s.reject),s.promise}),C.on("GetRangeReader",(l,s)=>{(0,_util.assert)(this._networkStream,"GetRangeReader - no `IPDFStream` instance available.");const S=this._networkStream.getRangeReader(l.begin,l.end);if(!S){s.close();return}s.onPull=()=>{S.read().then(function({value:M,done:L}){if(L){s.close();return}(0,_util.assert)(M instanceof ArrayBuffer,"GetRangeReader - expected an ArrayBuffer."),s.enqueue(new Uint8Array(M),1,[M])}).catch(M=>{s.error(M)})},s.onCancel=M=>{S.cancel(M),s.ready.catch(L=>{if(!this.destroyed)throw L})}}),C.on("GetDoc",({pdfInfo:l})=>{this._numPages=l.numPages,this._htmlForXfa=l.htmlForXfa,delete l.htmlForXfa,a._capability.resolve(new PDFDocumentProxy(l,this))}),C.on("DocException",function(l){let s;switch(l.name){case"PasswordException":s=new _util.PasswordException(l.message,l.code);break;case"InvalidPDFException":s=new _util.InvalidPDFException(l.message);break;case"MissingPDFException":s=new _util.MissingPDFException(l.message);break;case"UnexpectedResponseException":s=new _util.UnexpectedResponseException(l.message,l.status);break;case"UnknownErrorException":s=new _util.UnknownErrorException(l.message,l.details);break;default:(0,_util.unreachable)("DocException - expected a valid Error.")}a._capability.reject(s)}),C.on("PasswordRequest",l=>{if(this._passwordCapability=new _util.PromiseCapability,a.onPassword){const s=S=>{S instanceof Error?this._passwordCapability.reject(S):this._passwordCapability.resolve({password:S})};try{a.onPassword(s,l.code)}catch(S){this._passwordCapability.reject(S)}}else this._passwordCapability.reject(new _util.PasswordException(l.message,l.code));return this._passwordCapability.promise}),C.on("DataLoaded",l=>{a.onProgress?.({loaded:l.length,total:l.length}),this.downloadInfoCapability.resolve(l)}),C.on("StartRenderPage",l=>{if(this.destroyed)return;this.#g.get(l.pageIndex)._startRenderPage(l.transparency,l.cacheKey)}),C.on("commonobj",([l,s,S])=>{if(!this.destroyed&&!this.commonObjs.has(l))switch(s){case"Font":const M=this._params;if("error"in S){const A=S.error;(0,_util.warn)(`Error during font loading: ${A}`),this.commonObjs.resolve(l,A);break}const L=M.pdfBug&&globalThis.FontInspector?.enabled?(A,I)=>globalThis.FontInspector.fontAdded(A,I):null,X=new _font_loader.FontFaceObject(S,{isEvalSupported:M.isEvalSupported,disableFontFace:M.disableFontFace,ignoreErrors:M.ignoreErrors,inspectFont:L});this.fontLoader.bind(X).catch(A=>C.sendWithPromise("FontFallback",{id:l})).finally(()=>{!M.fontExtraProperties&&X.data&&(X.data=null),this.commonObjs.resolve(l,X)});break;case"FontPath":case"Image":case"Pattern":this.commonObjs.resolve(l,S);break;default:throw new Error(`Got unknown common object type ${s}`)}}),C.on("obj",([l,s,S,M])=>{if(this.destroyed)return;const L=this.#g.get(s);if(!L.objs.has(l))switch(S){case"Image":if(L.objs.resolve(l,M),M){let X;if(M.bitmap){const{width:A,height:I}=M;X=A*I*4}else X=M.data?.length||0;X>_util.MAX_IMAGE_SIZE_TO_CACHE&&(L._maybeCleanupAfterRender=!0)}break;case"Pattern":L.objs.resolve(l,M);break;default:throw new Error(`Got unknown object type ${S}`)}}),C.on("DocProgress",l=>{this.destroyed||a.onProgress?.({loaded:l.loaded,total:l.total})}),C.on("FetchBuiltInCMap",l=>this.destroyed?Promise.reject(new Error("Worker was destroyed.")):this.cMapReaderFactory?this.cMapReaderFactory.fetch(l):Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter."))),C.on("FetchStandardFontData",l=>this.destroyed?Promise.reject(new Error("Worker was destroyed.")):this.standardFontDataFactory?this.standardFontDataFactory.fetch(l):Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.")))}getData(){return this.messageHandler.sendWithPromise("GetData",null)}saveDocument(){return this.annotationStorage.size<=0&&(0,_util.warn)("saveDocument called while `annotationStorage` is empty, please use the getData-method instead."),this.messageHandler.sendWithPromise("SaveDocument",{isPureXfa:!!this._htmlForXfa,numPages:this._numPages,annotationStorage:this.annotationStorage.serializable,filename:this._fullReader?.filename??null}).finally(()=>{this.annotationStorage.resetModified()})}getPage(C){if(!Number.isInteger(C)||C<=0||C>this._numPages)return Promise.reject(new Error("Invalid page request."));const a=C-1,l=this.#A.get(a);if(l)return l;const s=this.messageHandler.sendWithPromise("GetPage",{pageIndex:a}).then(S=>{if(this.destroyed)throw new Error("Transport destroyed");const M=new PDFPageProxy(a,S,this,this._params.pdfBug);return this.#g.set(a,M),M});return this.#A.set(a,s),s}getPageIndex(C){return typeof C!="object"||C===null||!Number.isInteger(C.num)||C.num<0||!Number.isInteger(C.gen)||C.gen<0?Promise.reject(new Error("Invalid pageIndex request.")):this.messageHandler.sendWithPromise("GetPageIndex",{num:C.num,gen:C.gen})}getAnnotations(C,a){return this.messageHandler.sendWithPromise("GetAnnotations",{pageIndex:C,intent:a})}getFieldObjects(){return this.#C("GetFieldObjects")}hasJSActions(){return this.#C("HasJSActions")}getCalculationOrderIds(){return this.messageHandler.sendWithPromise("GetCalculationOrderIds",null)}getDestinations(){return this.messageHandler.sendWithPromise("GetDestinations",null)}getDestination(C){return typeof C!="string"?Promise.reject(new Error("Invalid destination request.")):this.messageHandler.sendWithPromise("GetDestination",{id:C})}getPageLabels(){return this.messageHandler.sendWithPromise("GetPageLabels",null)}getPageLayout(){return this.messageHandler.sendWithPromise("GetPageLayout",null)}getPageMode(){return this.messageHandler.sendWithPromise("GetPageMode",null)}getViewerPreferences(){return this.messageHandler.sendWithPromise("GetViewerPreferences",null)}getOpenAction(){return this.messageHandler.sendWithPromise("GetOpenAction",null)}getAttachments(){return this.messageHandler.sendWithPromise("GetAttachments",null)}getJavaScript(){return this.messageHandler.sendWithPromise("GetJavaScript",null)}getDocJSActions(){return this.messageHandler.sendWithPromise("GetDocJSActions",null)}getPageJSActions(C){return this.messageHandler.sendWithPromise("GetPageJSActions",{pageIndex:C})}getStructTree(C){return this.messageHandler.sendWithPromise("GetStructTree",{pageIndex:C})}getOutline(){return this.messageHandler.sendWithPromise("GetOutline",null)}getOptionalContentConfig(){return this.messageHandler.sendWithPromise("GetOptionalContentConfig",null).then(C=>new _optional_content_config.OptionalContentConfig(C))}getPermissions(){return this.messageHandler.sendWithPromise("GetPermissions",null)}getMetadata(){const C="GetMetadata",a=this.#I.get(C);if(a)return a;const l=this.messageHandler.sendWithPromise(C,null).then(s=>({info:s[0],metadata:s[1]?new _metadata.Metadata(s[1]):null,contentDispositionFilename:this._fullReader?.filename??null,contentLength:this._fullReader?.contentLength??null}));return this.#I.set(C,l),l}getMarkInfo(){return this.messageHandler.sendWithPromise("GetMarkInfo",null)}async startCleanup(C=!1){if(!this.destroyed){await this.messageHandler.sendWithPromise("Cleanup",null);for(const a of this.#g.values())if(!a.cleanup())throw new Error(`startCleanup: Page ${a.pageNumber} is currently rendering.`);this.commonObjs.clear(),C||this.fontLoader.clear(),this.#I.clear(),this.filterFactory.destroy(!0)}}get loadingParams(){const{disableAutoFetch:C,enableXfa:a}=this._params;return(0,_util.shadow)(this,"loadingParams",{disableAutoFetch:C,enableXfa:a})}}class PDFObjects{#I=Object.create(null);#g(C){const a=this.#I[C];return a||(this.#I[C]={capability:new _util.PromiseCapability,data:null})}get(C,a=null){if(a){const s=this.#g(C);return s.capability.promise.then(()=>a(s.data)),null}const l=this.#I[C];if(!l?.capability.settled)throw new Error(`Requesting object that isn't resolved yet ${C}.`);return l.data}has(C){return this.#I[C]?.capability.settled||!1}resolve(C,a=null){const l=this.#g(C);l.data=a,l.capability.resolve()}clear(){for(const C in this.#I){const{data:a}=this.#I[C];a?.bitmap?.close()}this.#I=Object.create(null)}}class RenderTask{#I=null;constructor(C){this.#I=C,this.onContinue=null}get promise(){return this.#I.capability.promise}cancel(C=0){this.#I.cancel(null,C)}get separateAnnots(){const{separateAnnots:C}=this.#I.operatorList;if(!C)return!1;const{annotationCanvasMap:a}=this.#I;return C.form||C.canvas&&a?.size>0}}exports.RenderTask=RenderTask;class InternalRenderTask{static#I=new WeakSet;constructor({callback:C,params:a,objs:l,commonObjs:s,annotationCanvasMap:S,operatorList:M,pageIndex:L,canvasFactory:X,filterFactory:A,useRequestAnimationFrame:I=!1,pdfBug:m=!1,pageColors:W=null}){this.callback=C,this.params=a,this.objs=l,this.commonObjs=s,this.annotationCanvasMap=S,this.operatorListIdx=null,this.operatorList=M,this._pageIndex=L,this.canvasFactory=X,this.filterFactory=A,this._pdfBug=m,this.pageColors=W,this.running=!1,this.graphicsReadyCallback=null,this.graphicsReady=!1,this._useRequestAnimationFrame=I===!0&&typeof window<"u",this.cancelled=!1,this.capability=new _util.PromiseCapability,this.task=new RenderTask(this),this._cancelBound=this.cancel.bind(this),this._continueBound=this._continue.bind(this),this._scheduleNextBound=this._scheduleNext.bind(this),this._nextBound=this._next.bind(this),this._canvas=a.canvasContext.canvas}get completed(){return this.capability.promise.catch(function(){})}initializeGraphics({transparency:C=!1,optionalContentConfig:a}){if(this.cancelled)return;if(this._canvas){if(InternalRenderTask.#I.has(this._canvas))throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");InternalRenderTask.#I.add(this._canvas)}this._pdfBug&&globalThis.StepperManager?.enabled&&(this.stepper=globalThis.StepperManager.create(this._pageIndex),this.stepper.init(this.operatorList),this.stepper.nextBreakPoint=this.stepper.getNextBreakPoint());const{canvasContext:l,viewport:s,transform:S,background:M}=this.params;this.gfx=new _canvas.CanvasGraphics(l,this.commonObjs,this.objs,this.canvasFactory,this.filterFactory,{optionalContentConfig:a},this.annotationCanvasMap,this.pageColors),this.gfx.beginDrawing({transform:S,viewport:s,transparency:C,background:M}),this.operatorListIdx=0,this.graphicsReady=!0,this.graphicsReadyCallback?.()}cancel(C=null,a=0){this.running=!1,this.cancelled=!0,this.gfx?.endDrawing(),this._canvas&&InternalRenderTask.#I.delete(this._canvas),this.callback(C||new _display_utils.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex+1}`,"canvas",a))}operatorListChanged(){if(!this.graphicsReady){this.graphicsReadyCallback||=this._continueBound;return}this.stepper?.updateOperatorList(this.operatorList),!this.running&&this._continue()}_continue(){this.running=!0,!this.cancelled&&(this.task.onContinue?this.task.onContinue(this._scheduleNextBound):this._scheduleNext())}_scheduleNext(){this._useRequestAnimationFrame?window.requestAnimationFrame(()=>{this._nextBound().catch(this._cancelBound)}):Promise.resolve().then(this._nextBound).catch(this._cancelBound)}async _next(){this.cancelled||(this.operatorListIdx=this.gfx.executeOperatorList(this.operatorList,this.operatorListIdx,this._continueBound,this.stepper),this.operatorListIdx===this.operatorList.argsArray.length&&(this.running=!1,this.operatorList.lastChunk&&(this.gfx.endDrawing(this.pageColors),this._canvas&&InternalRenderTask.#I.delete(this._canvas),this.callback())))}}const version="3.7.107";exports.version=version;const build="036f855dc";exports.build=build},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.PrintAnnotationStorage=C.AnnotationStorage=void 0;var l=a(1),s=a(4),S=a(8);class M{#I=!1;#g=new Map;constructor(){this.onSetModified=null,this.onResetModified=null,this.onAnnotationEditor=null}getValue(A,I){const m=this.#g.get(A);return m===void 0?I:Object.assign(I,m)}getRawValue(A){return this.#g.get(A)}remove(A){if(this.#g.delete(A),this.#g.size===0&&this.resetModified(),typeof this.onAnnotationEditor=="function"){for(const I of this.#g.values())if(I instanceof s.AnnotationEditor)return;this.onAnnotationEditor(null)}}setValue(A,I){const m=this.#g.get(A);let W=!1;if(m!==void 0)for(const[Z,w]of Object.entries(I))m[Z]!==w&&(W=!0,m[Z]=w);else W=!0,this.#g.set(A,I);W&&this.#A(),I instanceof s.AnnotationEditor&&typeof this.onAnnotationEditor=="function"&&this.onAnnotationEditor(I.constructor._type)}has(A){return this.#g.has(A)}getAll(){return this.#g.size>0?(0,l.objectFromMap)(this.#g):null}setAll(A){for(const[I,m]of Object.entries(A))this.setValue(I,m)}get size(){return this.#g.size}#A(){this.#I||(this.#I=!0,typeof this.onSetModified=="function"&&this.onSetModified())}resetModified(){this.#I&&(this.#I=!1,typeof this.onResetModified=="function"&&this.onResetModified())}get print(){return new L(this)}get serializable(){if(this.#g.size===0)return null;const A=new Map;for(const[I,m]of this.#g){const W=m instanceof s.AnnotationEditor?m.serialize():m;W&&A.set(I,W)}return A}static getHash(A){if(!A)return"";const I=new S.MurmurHash3_64;for(const[m,W]of A)I.update(`${m}:${JSON.stringify(W)}`);return I.hexdigest()}}C.AnnotationStorage=M;class L extends M{#I=null;constructor(A){super(),this.#I=structuredClone(A.serializable)}get print(){(0,l.unreachable)("Should not call PrintAnnotationStorage.print")}get serializable(){return this.#I}}C.PrintAnnotationStorage=L},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.AnnotationEditor=void 0;var l=a(5),s=a(1);class S{#I=this.focusin.bind(this);#g=this.focusout.bind(this);#A=!1;#C=!1;#l=!1;_uiManager=null;#s=S._zIndex++;static _colorManager=new l.ColorManager;static _zIndex=1;constructor(L){this.constructor===S&&(0,s.unreachable)("Cannot initialize AnnotationEditor."),this.parent=L.parent,this.id=L.id,this.width=this.height=null,this.pageIndex=L.parent.pageIndex,this.name=L.name,this.div=null,this._uiManager=L.uiManager;const{rotation:X,rawDims:{pageWidth:A,pageHeight:I,pageX:m,pageY:W}}=this.parent.viewport;this.rotation=X,this.pageRotation=(360+X-this._uiManager.viewParameters.rotation)%360,this.pageDimensions=[A,I],this.pageTranslation=[m,W];const[Z,w]=this.parentDimensions;this.x=L.x/Z,this.y=L.y/w,this.isAttachedToDOM=!1}static get _defaultLineColor(){return(0,s.shadow)(this,"_defaultLineColor",this._colorManager.getHexCode("CanvasText"))}addCommands(L){this._uiManager.addCommands(L)}get currentLayer(){return this._uiManager.currentLayer}setInBackground(){this.div.style.zIndex=0}setInForeground(){this.div.style.zIndex=this.#s}setParent(L){L!==null&&(this.pageIndex=L.pageIndex,this.pageDimensions=L.pageDimensions),this.parent=L}focusin(L){this.#A?this.#A=!1:this.parent.setSelected(this)}focusout(L){!this.isAttachedToDOM||L.relatedTarget?.closest(`#${this.id}`)||(L.preventDefault(),this.parent?.isMultipleSelection||this.commitOrRemove())}commitOrRemove(){this.isEmpty()?this.remove():this.commit()}commit(){this.addToAnnotationStorage()}addToAnnotationStorage(){this._uiManager.addToAnnotationStorage(this)}dragstart(L){const X=this.parent.div.getBoundingClientRect();this.startX=L.clientX-X.x,this.startY=L.clientY-X.y,L.dataTransfer.setData("text/plain",this.id),L.dataTransfer.effectAllowed="move"}setAt(L,X,A,I){const[m,W]=this.parentDimensions;[A,I]=this.screenToPageTranslation(A,I),this.x=(L+A)/m,this.y=(X+I)/W,this.div.style.left=`${100*this.x}%`,this.div.style.top=`${100*this.y}%`}translate(L,X){const[A,I]=this.parentDimensions;[L,X]=this.screenToPageTranslation(L,X),this.x+=L/A,this.y+=X/I,this.div.style.left=`${100*this.x}%`,this.div.style.top=`${100*this.y}%`}screenToPageTranslation(L,X){switch(this.parentRotation){case 90:return[X,-L];case 180:return[-L,-X];case 270:return[-X,L];default:return[L,X]}}get parentScale(){return this._uiManager.viewParameters.realScale}get parentRotation(){return(this._uiManager.viewParameters.rotation+this.pageRotation)%360}get parentDimensions(){const{realScale:L}=this._uiManager.viewParameters,[X,A]=this.pageDimensions;return[X*L,A*L]}setDims(L,X){const[A,I]=this.parentDimensions;this.div.style.width=`${100*L/A}%`,this.div.style.height=`${100*X/I}%`}fixDims(){const{style:L}=this.div,{height:X,width:A}=L,I=A.endsWith("%"),m=X.endsWith("%");if(I&&m)return;const[W,Z]=this.parentDimensions;I||(L.width=`${100*parseFloat(A)/W}%`),m||(L.height=`${100*parseFloat(X)/Z}%`)}getInitialTranslation(){return[0,0]}render(){this.div=document.createElement("div"),this.div.setAttribute("data-editor-rotation",(360-this.rotation)%360),this.div.className=this.name,this.div.setAttribute("id",this.id),this.div.setAttribute("tabIndex",0),this.setInForeground(),this.div.addEventListener("focusin",this.#I),this.div.addEventListener("focusout",this.#g);const[L,X]=this.getInitialTranslation();return this.translate(L,X),(0,l.bindEvents)(this,this.div,["dragstart","pointerdown"]),this.div}pointerdown(L){const{isMac:X}=s.FeatureTest.platform;if(L.button!==0||L.ctrlKey&&X){L.preventDefault();return}L.ctrlKey&&!X||L.shiftKey||L.metaKey&&X?this.parent.toggleSelected(this):this.parent.setSelected(this),this.#A=!0}getRect(L,X){const A=this.parentScale,[I,m]=this.pageDimensions,[W,Z]=this.pageTranslation,w=L/A,y=X/A,N=this.x*I,Y=this.y*m,k=this.width*I,j=this.height*m;switch(this.rotation){case 0:return[N+w+W,m-Y-y-j+Z,N+w+k+W,m-Y-y+Z];case 90:return[N+y+W,m-Y+w+Z,N+y+j+W,m-Y+w+k+Z];case 180:return[N-w-k+W,m-Y+y+Z,N-w+W,m-Y+y+j+Z];case 270:return[N-y-j+W,m-Y-w-k+Z,N-y+W,m-Y-w+Z];default:throw new Error("Invalid rotation")}}getRectInCurrentCoords(L,X){const[A,I,m,W]=L,Z=m-A,w=W-I;switch(this.rotation){case 0:return[A,X-W,Z,w];case 90:return[A,X-I,w,Z];case 180:return[m,X-I,Z,w];case 270:return[m,X-W,w,Z];default:throw new Error("Invalid rotation")}}onceAdded(){}isEmpty(){return!1}enableEditMode(){this.#l=!0}disableEditMode(){this.#l=!1}isInEditMode(){return this.#l}shouldGetKeyboardEvents(){return!1}needsToBeRebuilt(){return this.div&&!this.isAttachedToDOM}rebuild(){this.div?.addEventListener("focusin",this.#I)}serialize(){(0,s.unreachable)("An editor must be serializable")}static deserialize(L,X,A){const I=new this.prototype.constructor({parent:X,id:X.getNextId(),uiManager:A});I.rotation=L.rotation;const[m,W]=I.pageDimensions,[Z,w,y,N]=I.getRectInCurrentCoords(L.rect,W);return I.x=Z/m,I.y=w/W,I.width=y/m,I.height=N/W,I}remove(){this.div.removeEventListener("focusin",this.#I),this.div.removeEventListener("focusout",this.#g),this.isEmpty()||this.commit(),this.parent.remove(this)}select(){this.div?.classList.add("selectedEditor")}unselect(){this.div?.classList.remove("selectedEditor")}updateParams(L,X){}disableEditing(){}enableEditing(){}get propertiesToUpdate(){return{}}get contentDiv(){return this.div}get isEditing(){return this.#C}set isEditing(L){this.#C=L,L?(this.parent.setSelected(this),this.parent.setActiveEditor(this)):this.parent.setActiveEditor(null)}}C.AnnotationEditor=S},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.KeyboardManager=C.CommandManager=C.ColorManager=C.AnnotationEditorUIManager=void 0,C.bindEvents=S,C.opacityToHex=M;var l=a(1),s=a(6);function S(W,Z,w){for(const y of w)Z.addEventListener(y,W[y].bind(W))}function M(W){return Math.round(Math.min(255,Math.max(1,255*W))).toString(16).padStart(2,"0")}class L{#I=0;getId(){return`${l.AnnotationEditorPrefix}${this.#I++}`}}class X{#I=[];#g=!1;#A;#C=-1;constructor(Z=128){this.#A=Z}add({cmd:Z,undo:w,mustExec:y,type:N=NaN,overwriteIfSameType:Y=!1,keepUndo:k=!1}){if(y&&Z(),this.#g)return;const j={cmd:Z,undo:w,type:N};if(this.#C===-1){this.#I.length>0&&(this.#I.length=0),this.#C=0,this.#I.push(j);return}if(Y&&this.#I[this.#C].type===N){k&&(j.undo=this.#I[this.#C].undo),this.#I[this.#C]=j;return}const p=this.#C+1;p===this.#A?this.#I.splice(0,1):(this.#C=p,p<this.#I.length&&this.#I.splice(p)),this.#I.push(j)}undo(){this.#C!==-1&&(this.#g=!0,this.#I[this.#C].undo(),this.#g=!1,this.#C-=1)}redo(){this.#C<this.#I.length-1&&(this.#C+=1,this.#g=!0,this.#I[this.#C].cmd(),this.#g=!1)}hasSomethingToUndo(){return this.#C!==-1}hasSomethingToRedo(){return this.#C<this.#I.length-1}destroy(){this.#I=null}}C.CommandManager=X;class A{constructor(Z){this.buffer=[],this.callbacks=new Map,this.allKeys=new Set;const{isMac:w}=l.FeatureTest.platform;for(const[y,N]of Z)for(const Y of y){const k=Y.startsWith("mac+");w&&k?(this.callbacks.set(Y.slice(4),N),this.allKeys.add(Y.split("+").at(-1))):!w&&!k&&(this.callbacks.set(Y,N),this.allKeys.add(Y.split("+").at(-1)))}}#I(Z){Z.altKey&&this.buffer.push("alt"),Z.ctrlKey&&this.buffer.push("ctrl"),Z.metaKey&&this.buffer.push("meta"),Z.shiftKey&&this.buffer.push("shift"),this.buffer.push(Z.key);const w=this.buffer.join("+");return this.buffer.length=0,w}exec(Z,w){if(!this.allKeys.has(w.key))return;const y=this.callbacks.get(this.#I(w));y&&(y.bind(Z)(),w.stopPropagation(),w.preventDefault())}}C.KeyboardManager=A;class I{static _colorsMapping=new Map([["CanvasText",[0,0,0]],["Canvas",[255,255,255]]]);get _colors(){const Z=new Map([["CanvasText",null],["Canvas",null]]);return(0,s.getColorValues)(Z),(0,l.shadow)(this,"_colors",Z)}convert(Z){const w=(0,s.getRGB)(Z);if(!window.matchMedia("(forced-colors: active)").matches)return w;for(const[y,N]of this._colors)if(N.every((Y,k)=>Y===w[k]))return I._colorsMapping.get(y);return w}getHexCode(Z){const w=this._colors.get(Z);return w?l.Util.makeHexColor(...w):Z}}C.ColorManager=I;class m{#I=null;#g=new Map;#A=new Map;#C=null;#l=new X;#s=0;#b=null;#Z=new Set;#d=null;#i=new L;#c=!1;#m=l.AnnotationEditorType.NONE;#G=new Set;#o=this.copy.bind(this);#V=this.cut.bind(this);#Y=this.paste.bind(this);#M=this.keydown.bind(this);#H=this.onEditingAction.bind(this);#u=this.onPageChanging.bind(this);#D=this.onScaleChanging.bind(this);#a=this.onRotationChanging.bind(this);#n={isEditing:!1,isEmpty:!0,hasSomethingToUndo:!1,hasSomethingToRedo:!1,hasSelectedEditor:!1};#X=null;static _keyboardManager=new A([[["ctrl+a","mac+meta+a"],m.prototype.selectAll],[["ctrl+z","mac+meta+z"],m.prototype.undo],[["ctrl+y","ctrl+shift+Z","mac+meta+shift+Z"],m.prototype.redo],[["Backspace","alt+Backspace","ctrl+Backspace","shift+Backspace","mac+Backspace","mac+alt+Backspace","mac+ctrl+Backspace","Delete","ctrl+Delete","shift+Delete"],m.prototype.delete],[["Escape","mac+Escape"],m.prototype.unselectAll]]);constructor(Z,w,y){this.#X=Z,this.#d=w,this.#d._on("editingaction",this.#H),this.#d._on("pagechanging",this.#u),this.#d._on("scalechanging",this.#D),this.#d._on("rotationchanging",this.#a),this.#C=y,this.viewParameters={realScale:s.PixelsPerInch.PDF_TO_CSS_UNITS,rotation:0}}destroy(){this.#K(),this.#d._off("editingaction",this.#H),this.#d._off("pagechanging",this.#u),this.#d._off("scalechanging",this.#D),this.#d._off("rotationchanging",this.#a);for(const Z of this.#A.values())Z.destroy();this.#A.clear(),this.#g.clear(),this.#Z.clear(),this.#I=null,this.#G.clear(),this.#l.destroy()}onPageChanging({pageNumber:Z}){this.#s=Z-1}focusMainContainer(){this.#X.focus()}addShouldRescale(Z){this.#Z.add(Z)}removeShouldRescale(Z){this.#Z.delete(Z)}onScaleChanging({scale:Z}){this.commitOrRemove(),this.viewParameters.realScale=Z*s.PixelsPerInch.PDF_TO_CSS_UNITS;for(const w of this.#Z)w.onScaleChanging()}onRotationChanging({pagesRotation:Z}){this.commitOrRemove(),this.viewParameters.rotation=Z}addToAnnotationStorage(Z){!Z.isEmpty()&&this.#C&&!this.#C.has(Z.id)&&this.#C.setValue(Z.id,Z)}#p(){this.#X.addEventListener("keydown",this.#M)}#K(){this.#X.removeEventListener("keydown",this.#M)}#e(){document.addEventListener("copy",this.#o),document.addEventListener("cut",this.#V),document.addEventListener("paste",this.#Y)}#F(){document.removeEventListener("copy",this.#o),document.removeEventListener("cut",this.#V),document.removeEventListener("paste",this.#Y)}copy(Z){if(Z.preventDefault(),this.#I&&this.#I.commitOrRemove(),!this.hasSelection)return;const w=[];for(const y of this.#G)y.isEmpty()||w.push(y.serialize());w.length!==0&&Z.clipboardData.setData("application/pdfjs",JSON.stringify(w))}cut(Z){this.copy(Z),this.delete()}paste(Z){Z.preventDefault();let w=Z.clipboardData.getData("application/pdfjs");if(!w)return;try{w=JSON.parse(w)}catch(N){(0,l.warn)(`paste: "${N.message}".`);return}if(!Array.isArray(w))return;this.unselectAll();const y=this.#A.get(this.#s);try{const N=[];for(const j of w){const p=y.deserialize(j);if(!p)return;N.push(p)}const Y=()=>{for(const j of N)this.#h(j);this.#R(N)},k=()=>{for(const j of N)j.remove()};this.addCommands({cmd:Y,undo:k,mustExec:!0})}catch(N){(0,l.warn)(`paste: "${N.message}".`)}}keydown(Z){this.getActive()?.shouldGetKeyboardEvents()||m._keyboardManager.exec(this,Z)}onEditingAction(Z){["undo","redo","delete","selectAll"].includes(Z.name)&&this[Z.name]()}#W(Z){Object.entries(Z).some(([y,N])=>this.#n[y]!==N)&&this.#d.dispatch("annotationeditorstateschanged",{source:this,details:Object.assign(this.#n,Z)})}#B(Z){this.#d.dispatch("annotationeditorparamschanged",{source:this,details:Z})}setEditingState(Z){Z?(this.#p(),this.#e(),this.#W({isEditing:this.#m!==l.AnnotationEditorType.NONE,isEmpty:this.#w(),hasSomethingToUndo:this.#l.hasSomethingToUndo(),hasSomethingToRedo:this.#l.hasSomethingToRedo(),hasSelectedEditor:!1})):(this.#K(),this.#F(),this.#W({isEditing:!1}))}registerEditorTypes(Z){if(!this.#b){this.#b=Z;for(const w of this.#b)this.#B(w.defaultPropertiesToUpdate)}}getId(){return this.#i.getId()}get currentLayer(){return this.#A.get(this.#s)}get currentPageIndex(){return this.#s}addLayer(Z){this.#A.set(Z.pageIndex,Z),this.#c?Z.enable():Z.disable()}removeLayer(Z){this.#A.delete(Z.pageIndex)}updateMode(Z){if(this.#m=Z,Z===l.AnnotationEditorType.NONE)this.setEditingState(!1),this.#N();else{this.setEditingState(!0),this.#S();for(const w of this.#A.values())w.updateMode(Z)}}updateToolbar(Z){Z!==this.#m&&this.#d.dispatch("switchannotationeditormode",{source:this,mode:Z})}updateParams(Z,w){if(this.#b){for(const y of this.#G)y.updateParams(Z,w);for(const y of this.#b)y.updateDefaultParams(Z,w)}}#S(){if(!this.#c){this.#c=!0;for(const Z of this.#A.values())Z.enable()}}#N(){if(this.unselectAll(),this.#c){this.#c=!1;for(const Z of this.#A.values())Z.disable()}}getEditors(Z){const w=[];for(const y of this.#g.values())y.pageIndex===Z&&w.push(y);return w}getEditor(Z){return this.#g.get(Z)}addEditor(Z){this.#g.set(Z.id,Z)}removeEditor(Z){this.#g.delete(Z.id),this.unselect(Z),this.#C?.remove(Z.id)}#h(Z){const w=this.#A.get(Z.pageIndex);w?w.addOrRebuild(Z):this.addEditor(Z)}setActiveEditor(Z){this.#I!==Z&&(this.#I=Z,Z&&this.#B(Z.propertiesToUpdate))}toggleSelected(Z){if(this.#G.has(Z)){this.#G.delete(Z),Z.unselect(),this.#W({hasSelectedEditor:this.hasSelection});return}this.#G.add(Z),Z.select(),this.#B(Z.propertiesToUpdate),this.#W({hasSelectedEditor:!0})}setSelected(Z){for(const w of this.#G)w!==Z&&w.unselect();this.#G.clear(),this.#G.add(Z),Z.select(),this.#B(Z.propertiesToUpdate),this.#W({hasSelectedEditor:!0})}isSelected(Z){return this.#G.has(Z)}unselect(Z){Z.unselect(),this.#G.delete(Z),this.#W({hasSelectedEditor:this.hasSelection})}get hasSelection(){return this.#G.size!==0}undo(){this.#l.undo(),this.#W({hasSomethingToUndo:this.#l.hasSomethingToUndo(),hasSomethingToRedo:!0,isEmpty:this.#w()})}redo(){this.#l.redo(),this.#W({hasSomethingToUndo:!0,hasSomethingToRedo:this.#l.hasSomethingToRedo(),isEmpty:this.#w()})}addCommands(Z){this.#l.add(Z),this.#W({hasSomethingToUndo:!0,hasSomethingToRedo:!1,isEmpty:this.#w()})}#w(){if(this.#g.size===0)return!0;if(this.#g.size===1)for(const Z of this.#g.values())return Z.isEmpty();return!1}delete(){if(this.commitOrRemove(),!this.hasSelection)return;const Z=[...this.#G],w=()=>{for(const N of Z)N.remove()},y=()=>{for(const N of Z)this.#h(N)};this.addCommands({cmd:w,undo:y,mustExec:!0})}commitOrRemove(){this.#I?.commitOrRemove()}#R(Z){this.#G.clear();for(const w of Z)w.isEmpty()||(this.#G.add(w),w.select());this.#W({hasSelectedEditor:!0})}selectAll(){for(const Z of this.#G)Z.commit();this.#R(this.#g.values())}unselectAll(){if(this.#I){this.#I.commitOrRemove();return}if(this.#G.size!==0){for(const Z of this.#G)Z.unselect();this.#G.clear(),this.#W({hasSelectedEditor:!1})}}isActive(Z){return this.#I===Z}getActive(){return this.#I}getMode(){return this.#m}}C.AnnotationEditorUIManager=m},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.StatTimer=C.RenderingCancelledException=C.PixelsPerInch=C.PageViewport=C.PDFDateString=C.DOMStandardFontDataFactory=C.DOMSVGFactory=C.DOMFilterFactory=C.DOMCanvasFactory=C.DOMCMapReaderFactory=C.AnnotationPrefix=void 0,C.deprecated=u,C.getColorValues=hI,C.getCurrentTransform=KI,C.getCurrentTransformInverse=NI,C.getFilenameFromUrl=k,C.getPdfFilenameFromUrl=j,C.getRGB=q,C.getXfaPageViewport=r,C.isDataScheme=N,C.isPdfFile=Y,C.isValidFetchUrl=b,C.loadScript=B,C.setLayerDimensions=yI;var l=a(7),s=a(1);const S="http://www.w3.org/2000/svg",M="pdfjs_internal_id_";C.AnnotationPrefix=M;class L{static CSS=96;static PDF=72;static PDF_TO_CSS_UNITS=this.CSS/this.PDF}C.PixelsPerInch=L;class X extends l.BaseFilterFactory{#I;#g;#A;#C;#l;#s;#b;#Z=0;constructor({docId:U,ownerDocument:Q=globalThis.document}={}){super(),this.#A=U,this.#C=Q}get#d(){return this.#I||=new Map}get#i(){if(!this.#g){const U=this.#C.createElement("div"),{style:Q}=U;Q.visibility="hidden",Q.contain="strict",Q.width=Q.height=0,Q.position="absolute",Q.top=Q.left=0,Q.zIndex=-1;const D=this.#C.createElementNS(S,"svg");D.setAttribute("width",0),D.setAttribute("height",0),this.#g=this.#C.createElementNS(S,"defs"),U.append(D),D.append(this.#g),this.#C.body.append(U)}return this.#g}#c(U,Q,D){const G=this.#C.createElementNS(S,Q);G.setAttribute("type","discrete"),G.setAttribute("tableValues",D),U.append(G)}addFilter(U){if(!U)return"none";let Q=this.#d.get(U);if(Q)return Q;let D,G,c,V;if(U.length===1){const o=U[0],R=new Array(256);for(let t=0;t<256;t++)R[t]=o[t]/255;V=D=G=c=R.join(",")}else{const[o,R,t]=U,z=new Array(256),O=new Array(256),sI=new Array(256);for(let v=0;v<256;v++)z[v]=o[v]/255,O[v]=R[v]/255,sI[v]=t[v]/255;D=z.join(","),G=O.join(","),c=sI.join(","),V=`${D}${G}${c}`}if(Q=this.#d.get(V),Q)return this.#d.set(U,Q),Q;const n=`g_${this.#A}_transfer_map_${this.#Z++}`,g=`url(#${n})`;this.#d.set(U,g),this.#d.set(V,g);const d=this.#C.createElementNS(S,"filter",S);d.setAttribute("id",n),d.setAttribute("color-interpolation-filters","sRGB");const i=this.#C.createElementNS(S,"feComponentTransfer");return d.append(i),this.#c(i,"feFuncR",D),this.#c(i,"feFuncG",G),this.#c(i,"feFuncB",c),this.#i.append(d),g}addHCMFilter(U,Q){const D=`${U}-${Q}`;if(this.#s===D)return this.#b;if(this.#s=D,this.#b="none",this.#l?.remove(),!U||!Q)return this.#b;this.#i.style.color=U,U=getComputedStyle(this.#i).getPropertyValue("color");const G=q(U);U=s.Util.makeHexColor(...G),this.#i.style.color=Q,Q=getComputedStyle(this.#i).getPropertyValue("color");const c=q(Q);if(Q=s.Util.makeHexColor(...c),this.#i.style.color="",U==="#000000"&&Q==="#ffffff"||U===Q)return this.#b;const V=new Array(256);for(let t=0;t<=255;t++){const z=t/255;V[t]=z<=.03928?z/12.92:((z+.055)/1.055)**2.4}const n=V.join(","),g=`g_${this.#A}_hcm_filter`,d=this.#l=this.#C.createElementNS(S,"filter",S);d.setAttribute("id",g),d.setAttribute("color-interpolation-filters","sRGB");let i=this.#C.createElementNS(S,"feComponentTransfer");d.append(i),this.#c(i,"feFuncR",n),this.#c(i,"feFuncG",n),this.#c(i,"feFuncB",n);const o=this.#C.createElementNS(S,"feColorMatrix");o.setAttribute("type","matrix"),o.setAttribute("values","0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"),d.append(o),i=this.#C.createElementNS(S,"feComponentTransfer"),d.append(i);const R=(t,z)=>{const O=G[t]/255,sI=c[t]/255,v=new Array(z+1);for(let II=0;II<=z;II++)v[II]=O+II/z*(sI-O);return v.join(",")};return this.#c(i,"feFuncR",R(0,5)),this.#c(i,"feFuncG",R(1,5)),this.#c(i,"feFuncB",R(2,5)),this.#i.append(d),this.#b=`url(#${g})`,this.#b}destroy(U=!1){U&&this.#b||(this.#g&&(this.#g.parentNode.parentNode.remove(),this.#g=null),this.#I&&(this.#I.clear(),this.#I=null),this.#Z=0)}}C.DOMFilterFactory=X;class A extends l.BaseCanvasFactory{constructor({ownerDocument:U=globalThis.document}={}){super(),this._document=U}_createCanvas(U,Q){const D=this._document.createElement("canvas");return D.width=U,D.height=Q,D}}C.DOMCanvasFactory=A;async function I(oI,U=!1){if(b(oI,document.baseURI)){const Q=await fetch(oI);if(!Q.ok)throw new Error(Q.statusText);return U?new Uint8Array(await Q.arrayBuffer()):(0,s.stringToBytes)(await Q.text())}return new Promise((Q,D)=>{const G=new XMLHttpRequest;G.open("GET",oI,!0),U&&(G.responseType="arraybuffer"),G.onreadystatechange=()=>{if(G.readyState===XMLHttpRequest.DONE){if(G.status===200||G.status===0){let c;if(U&&G.response?c=new Uint8Array(G.response):!U&&G.responseText&&(c=(0,s.stringToBytes)(G.responseText)),c){Q(c);return}}D(new Error(G.statusText))}},G.send(null)})}class m extends l.BaseCMapReaderFactory{_fetchData(U,Q){return I(U,this.isCompressed).then(D=>({cMapData:D,compressionType:Q}))}}C.DOMCMapReaderFactory=m;class W extends l.BaseStandardFontDataFactory{_fetchData(U){return I(U,!0)}}C.DOMStandardFontDataFactory=W;class Z extends l.BaseSVGFactory{_createSVG(U){return document.createElementNS(S,U)}}C.DOMSVGFactory=Z;class w{constructor({viewBox:U,scale:Q,rotation:D,offsetX:G=0,offsetY:c=0,dontFlip:V=!1}){this.viewBox=U,this.scale=Q,this.rotation=D,this.offsetX=G,this.offsetY=c;const n=(U[2]+U[0])/2,g=(U[3]+U[1])/2;let d,i,o,R;switch(D%=360,D<0&&(D+=360),D){case 180:d=-1,i=0,o=0,R=1;break;case 90:d=0,i=1,o=1,R=0;break;case 270:d=0,i=-1,o=-1,R=0;break;case 0:d=1,i=0,o=0,R=-1;break;default:throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.")}V&&(o=-o,R=-R);let t,z,O,sI;d===0?(t=Math.abs(g-U[1])*Q+G,z=Math.abs(n-U[0])*Q+c,O=(U[3]-U[1])*Q,sI=(U[2]-U[0])*Q):(t=Math.abs(n-U[0])*Q+G,z=Math.abs(g-U[1])*Q+c,O=(U[2]-U[0])*Q,sI=(U[3]-U[1])*Q),this.transform=[d*Q,i*Q,o*Q,R*Q,t-d*Q*n-o*Q*g,z-i*Q*n-R*Q*g],this.width=O,this.height=sI}get rawDims(){const{viewBox:U}=this;return(0,s.shadow)(this,"rawDims",{pageWidth:U[2]-U[0],pageHeight:U[3]-U[1],pageX:U[0],pageY:U[1]})}clone({scale:U=this.scale,rotation:Q=this.rotation,offsetX:D=this.offsetX,offsetY:G=this.offsetY,dontFlip:c=!1}={}){return new w({viewBox:this.viewBox.slice(),scale:U,rotation:Q,offsetX:D,offsetY:G,dontFlip:c})}convertToViewportPoint(U,Q){return s.Util.applyTransform([U,Q],this.transform)}convertToViewportRectangle(U){const Q=s.Util.applyTransform([U[0],U[1]],this.transform),D=s.Util.applyTransform([U[2],U[3]],this.transform);return[Q[0],Q[1],D[0],D[1]]}convertToPdfPoint(U,Q){return s.Util.applyInverseTransform([U,Q],this.transform)}}C.PageViewport=w;class y extends s.BaseException{constructor(U,Q,D=0){super(U,"RenderingCancelledException"),this.type=Q,this.extraDelay=D}}C.RenderingCancelledException=y;function N(oI){const U=oI.length;let Q=0;for(;Q<U&&oI[Q].trim()==="";)Q++;return oI.substring(Q,Q+5).toLowerCase()==="data:"}function Y(oI){return typeof oI=="string"&&/\.pdf$/i.test(oI)}function k(oI,U=!1){return U||([oI]=oI.split(/[#?]/,1)),oI.substring(oI.lastIndexOf("/")+1)}function j(oI,U="document.pdf"){if(typeof oI!="string")return U;if(N(oI))return(0,s.warn)('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'),U;const Q=/^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/,D=/[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i,G=Q.exec(oI);let c=D.exec(G[1])||D.exec(G[2])||D.exec(G[3]);if(c&&(c=c[0],c.includes("%")))try{c=D.exec(decodeURIComponent(c))[0]}catch{}return c||U}class p{started=Object.create(null);times=[];time(U){U in this.started&&(0,s.warn)(`Timer is already running for ${U}`),this.started[U]=Date.now()}timeEnd(U){U in this.started||(0,s.warn)(`Timer has not been started for ${U}`),this.times.push({name:U,start:this.started[U],end:Date.now()}),delete this.started[U]}toString(){const U=[];let Q=0;for(const{name:D}of this.times)Q=Math.max(D.length,Q);for(const{name:D,start:G,end:c}of this.times)U.push(`${D.padEnd(Q)} ${c-G}ms
`);return U.join("")}}C.StatTimer=p;function b(oI,U){try{const{protocol:Q}=U?new URL(oI,U):new URL(oI);return Q==="http:"||Q==="https:"}catch{return!1}}function B(oI,U=!1){return new Promise((Q,D)=>{const G=document.createElement("script");G.src=oI,G.onload=function(c){U&&G.remove(),Q(c)},G.onerror=function(){D(new Error(`Cannot load script at: ${G.src}`))},(document.head||document.documentElement).append(G)})}function u(oI){console.log("Deprecated API usage: "+oI)}let T;class J{static toDateObject(U){if(!U||typeof U!="string")return null;T||=new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?");const Q=T.exec(U);if(!Q)return null;const D=parseInt(Q[1],10);let G=parseInt(Q[2],10);G=G>=1&&G<=12?G-1:0;let c=parseInt(Q[3],10);c=c>=1&&c<=31?c:1;let V=parseInt(Q[4],10);V=V>=0&&V<=23?V:0;let n=parseInt(Q[5],10);n=n>=0&&n<=59?n:0;let g=parseInt(Q[6],10);g=g>=0&&g<=59?g:0;const d=Q[7]||"Z";let i=parseInt(Q[8],10);i=i>=0&&i<=23?i:0;let o=parseInt(Q[9],10)||0;return o=o>=0&&o<=59?o:0,d==="-"?(V+=i,n+=o):d==="+"&&(V-=i,n-=o),new Date(Date.UTC(D,G,c,V,n,g))}}C.PDFDateString=J;function r(oI,{scale:U=1,rotation:Q=0}){const{width:D,height:G}=oI.attributes.style,c=[0,0,parseInt(D),parseInt(G)];return new w({viewBox:c,scale:U,rotation:Q})}function q(oI){if(oI.startsWith("#")){const U=parseInt(oI.slice(1),16);return[(U&16711680)>>16,(U&65280)>>8,U&255]}return oI.startsWith("rgb(")?oI.slice(4,-1).split(",").map(U=>parseInt(U)):oI.startsWith("rgba(")?oI.slice(5,-1).split(",").map(U=>parseInt(U)).slice(0,3):((0,s.warn)(`Not a valid color format: "${oI}"`),[0,0,0])}function hI(oI){const U=document.createElement("span");U.style.visibility="hidden",document.body.append(U);for(const Q of oI.keys()){U.style.color=Q;const D=window.getComputedStyle(U).color;oI.set(Q,q(D))}U.remove()}function KI(oI){const{a:U,b:Q,c:D,d:G,e:c,f:V}=oI.getTransform();return[U,Q,D,G,c,V]}function NI(oI){const{a:U,b:Q,c:D,d:G,e:c,f:V}=oI.getTransform().invertSelf();return[U,Q,D,G,c,V]}function yI(oI,U,Q=!1,D=!0){if(U instanceof w){const{pageWidth:G,pageHeight:c}=U.rawDims,{style:V}=oI,n=`calc(var(--scale-factor) * ${G}px)`,g=`calc(var(--scale-factor) * ${c}px)`;!Q||U.rotation%180===0?(V.width=n,V.height=g):(V.width=g,V.height=n)}D&&oI.setAttribute("data-main-rotation",U.rotation)}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.BaseStandardFontDataFactory=C.BaseSVGFactory=C.BaseFilterFactory=C.BaseCanvasFactory=C.BaseCMapReaderFactory=void 0;var l=a(1);class s{constructor(){this.constructor===s&&(0,l.unreachable)("Cannot initialize BaseFilterFactory.")}addFilter(I){return"none"}addHCMFilter(I,m){return"none"}destroy(I=!1){}}C.BaseFilterFactory=s;class S{constructor(){this.constructor===S&&(0,l.unreachable)("Cannot initialize BaseCanvasFactory.")}create(I,m){if(I<=0||m<=0)throw new Error("Invalid canvas size");const W=this._createCanvas(I,m);return{canvas:W,context:W.getContext("2d")}}reset(I,m,W){if(!I.canvas)throw new Error("Canvas is not specified");if(m<=0||W<=0)throw new Error("Invalid canvas size");I.canvas.width=m,I.canvas.height=W}destroy(I){if(!I.canvas)throw new Error("Canvas is not specified");I.canvas.width=0,I.canvas.height=0,I.canvas=null,I.context=null}_createCanvas(I,m){(0,l.unreachable)("Abstract method `_createCanvas` called.")}}C.BaseCanvasFactory=S;class M{constructor({baseUrl:I=null,isCompressed:m=!0}){this.constructor===M&&(0,l.unreachable)("Cannot initialize BaseCMapReaderFactory."),this.baseUrl=I,this.isCompressed=m}async fetch({name:I}){if(!this.baseUrl)throw new Error('The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided.');if(!I)throw new Error("CMap name must be specified.");const m=this.baseUrl+I+(this.isCompressed?".bcmap":""),W=this.isCompressed?l.CMapCompressionType.BINARY:l.CMapCompressionType.NONE;return this._fetchData(m,W).catch(Z=>{throw new Error(`Unable to load ${this.isCompressed?"binary ":""}CMap at: ${m}`)})}_fetchData(I,m){(0,l.unreachable)("Abstract method `_fetchData` called.")}}C.BaseCMapReaderFactory=M;class L{constructor({baseUrl:I=null}){this.constructor===L&&(0,l.unreachable)("Cannot initialize BaseStandardFontDataFactory."),this.baseUrl=I}async fetch({filename:I}){if(!this.baseUrl)throw new Error('The standard font "baseUrl" parameter must be specified, ensure that the "standardFontDataUrl" API parameter is provided.');if(!I)throw new Error("Font filename must be specified.");const m=`${this.baseUrl}${I}`;return this._fetchData(m).catch(W=>{throw new Error(`Unable to load font data at: ${m}`)})}_fetchData(I){(0,l.unreachable)("Abstract method `_fetchData` called.")}}C.BaseStandardFontDataFactory=L;class X{constructor(){this.constructor===X&&(0,l.unreachable)("Cannot initialize BaseSVGFactory.")}create(I,m,W=!1){if(I<=0||m<=0)throw new Error("Invalid SVG dimensions");const Z=this._createSVG("svg:svg");return Z.setAttribute("version","1.1"),W||(Z.setAttribute("width",`${I}px`),Z.setAttribute("height",`${m}px`)),Z.setAttribute("preserveAspectRatio","none"),Z.setAttribute("viewBox",`0 0 ${I} ${m}`),Z}createElement(I){if(typeof I!="string")throw new Error("Invalid SVG element type");return this._createSVG(I)}_createSVG(I){(0,l.unreachable)("Abstract method `_createSVG` called.")}}C.BaseSVGFactory=X},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.MurmurHash3_64=void 0;var l=a(1);const s=3285377520,S=4294901760,M=65535;class L{constructor(A){this.h1=A?A&4294967295:s,this.h2=A?A&4294967295:s}update(A){let I,m;if(typeof A=="string"){I=new Uint8Array(A.length*2),m=0;for(let u=0,T=A.length;u<T;u++){const J=A.charCodeAt(u);J<=255?I[m++]=J:(I[m++]=J>>>8,I[m++]=J&255)}}else if((0,l.isArrayBuffer)(A))I=A.slice(),m=I.byteLength;else throw new Error("Wrong data format in MurmurHash3_64_update. Input must be a string or array.");const W=m>>2,Z=m-W*4,w=new Uint32Array(I.buffer,0,W);let y=0,N=0,Y=this.h1,k=this.h2;const j=3432918353,p=461845907,b=j&M,B=p&M;for(let u=0;u<W;u++)u&1?(y=w[u],y=y*j&S|y*b&M,y=y<<15|y>>>17,y=y*p&S|y*B&M,Y^=y,Y=Y<<13|Y>>>19,Y=Y*5+3864292196):(N=w[u],N=N*j&S|N*b&M,N=N<<15|N>>>17,N=N*p&S|N*B&M,k^=N,k=k<<13|k>>>19,k=k*5+3864292196);switch(y=0,Z){case 3:y^=I[W*4+2]<<16;case 2:y^=I[W*4+1]<<8;case 1:y^=I[W*4],y=y*j&S|y*b&M,y=y<<15|y>>>17,y=y*p&S|y*B&M,W&1?Y^=y:k^=y}this.h1=Y,this.h2=k}hexdigest(){let A=this.h1,I=this.h2;return A^=I>>>1,A=A*3981806797&S|A*36045&M,I=I*4283543511&S|((I<<16|A>>>16)*2950163797&S)>>>16,A^=I>>>1,A=A*444984403&S|A*60499&M,I=I*3301882366&S|((I<<16|A>>>16)*3120437893&S)>>>16,A^=I>>>1,(A>>>0).toString(16).padStart(8,"0")+(I>>>0).toString(16).padStart(8,"0")}}C.MurmurHash3_64=L},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.FontLoader=C.FontFaceObject=void 0;var l=a(1),s=a(10);class S{#I=new Set;constructor({ownerDocument:X=globalThis.document,styleElement:A=null}){this._document=X,this.nativeFontFaces=new Set,this.styleElement=null,this.loadingRequests=[],this.loadTestFontId=0}addNativeFontFace(X){this.nativeFontFaces.add(X),this._document.fonts.add(X)}removeNativeFontFace(X){this.nativeFontFaces.delete(X),this._document.fonts.delete(X)}insertRule(X){this.styleElement||(this.styleElement=this._document.createElement("style"),this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement));const A=this.styleElement.sheet;A.insertRule(X,A.cssRules.length)}clear(){for(const X of this.nativeFontFaces)this._document.fonts.delete(X);this.nativeFontFaces.clear(),this.#I.clear(),this.styleElement&&(this.styleElement.remove(),this.styleElement=null)}async loadSystemFont(X){if(!(!X||this.#I.has(X.loadedName))){if((0,l.assert)(!this.disableFontFace,"loadSystemFont shouldn't be called when `disableFontFace` is set."),this.isFontLoadingAPISupported){const{loadedName:A,src:I,style:m}=X,W=new FontFace(A,I,m);this.addNativeFontFace(W);try{await W.load(),this.#I.add(A)}catch{(0,l.warn)(`Cannot load system font: ${X.baseFontName}, installing it could help to improve PDF rendering.`),this.removeNativeFontFace(W)}return}(0,l.unreachable)("Not implemented: loadSystemFont without the Font Loading API.")}}async bind(X){if(X.attached||X.missingFile&&!X.systemFontInfo)return;if(X.attached=!0,X.systemFontInfo){await this.loadSystemFont(X.systemFontInfo);return}if(this.isFontLoadingAPISupported){const I=X.createNativeFontFace();if(I){this.addNativeFontFace(I);try{await I.loaded}catch(m){throw(0,l.warn)(`Failed to load font '${I.family}': '${m}'.`),X.disableFontFace=!0,m}}return}const A=X.createFontFaceRule();if(A){if(this.insertRule(A),this.isSyncFontLoadingSupported)return;await new Promise(I=>{const m=this._queueLoadingCallback(I);this._prepareFontLoadEvent(X,m)})}}get isFontLoadingAPISupported(){const X=!!this._document?.fonts;return(0,l.shadow)(this,"isFontLoadingAPISupported",X)}get isSyncFontLoadingSupported(){let X=!1;return(s.isNodeJS||typeof navigator<"u"&&/Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent))&&(X=!0),(0,l.shadow)(this,"isSyncFontLoadingSupported",X)}_queueLoadingCallback(X){function A(){for((0,l.assert)(!m.done,"completeRequest() cannot be called twice."),m.done=!0;I.length>0&&I[0].done;){const W=I.shift();setTimeout(W.callback,0)}}const{loadingRequests:I}=this,m={done:!1,complete:A,callback:X};return I.push(m),m}get _loadTestFont(){const X=atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");return(0,l.shadow)(this,"_loadTestFont",X)}_prepareFontLoadEvent(X,A){function I(q,hI){return q.charCodeAt(hI)<<24|q.charCodeAt(hI+1)<<16|q.charCodeAt(hI+2)<<8|q.charCodeAt(hI+3)&255}function m(q,hI,KI,NI){const yI=q.substring(0,hI),oI=q.substring(hI+KI);return yI+NI+oI}let W,Z;const w=this._document.createElement("canvas");w.width=1,w.height=1;const y=w.getContext("2d");let N=0;function Y(q,hI){if(++N>30){(0,l.warn)("Load test font never loaded."),hI();return}if(y.font="30px "+q,y.fillText(".",0,20),y.getImageData(0,0,1,1).data[3]>0){hI();return}setTimeout(Y.bind(null,q,hI))}const k=`lt${Date.now()}${this.loadTestFontId++}`;let j=this._loadTestFont;j=m(j,976,k.length,k);const b=16,B=1482184792;let u=I(j,b);for(W=0,Z=k.length-3;W<Z;W+=4)u=u-B+I(k,W)|0;W<k.length&&(u=u-B+I(k+"XXX",W)|0),j=m(j,b,4,(0,l.string32)(u));const T=`url(data:font/opentype;base64,${btoa(j)});`,J=`@font-face {font-family:"${k}";src:${T}}`;this.insertRule(J);const r=this._document.createElement("div");r.style.visibility="hidden",r.style.width=r.style.height="10px",r.style.position="absolute",r.style.top=r.style.left="0px";for(const q of[X.loadedName,k]){const hI=this._document.createElement("span");hI.textContent="Hi",hI.style.fontFamily=q,r.append(hI)}this._document.body.append(r),Y(k,()=>{r.remove(),A.complete()})}}C.FontLoader=S;class M{constructor(X,{isEvalSupported:A=!0,disableFontFace:I=!1,ignoreErrors:m=!1,inspectFont:W=null}){this.compiledGlyphs=Object.create(null);for(const Z in X)this[Z]=X[Z];this.isEvalSupported=A!==!1,this.disableFontFace=I===!0,this.ignoreErrors=m===!0,this._inspectFont=W}createNativeFontFace(){if(!this.data||this.disableFontFace)return null;let X;if(!this.cssFontInfo)X=new FontFace(this.loadedName,this.data,{});else{const A={weight:this.cssFontInfo.fontWeight};this.cssFontInfo.italicAngle&&(A.style=`oblique ${this.cssFontInfo.italicAngle}deg`),X=new FontFace(this.cssFontInfo.fontFamily,this.data,A)}return this._inspectFont?.(this),X}createFontFaceRule(){if(!this.data||this.disableFontFace)return null;const X=(0,l.bytesToString)(this.data),A=`url(data:${this.mimetype};base64,${btoa(X)});`;let I;if(!this.cssFontInfo)I=`@font-face {font-family:"${this.loadedName}";src:${A}}`;else{let m=`font-weight: ${this.cssFontInfo.fontWeight};`;this.cssFontInfo.italicAngle&&(m+=`font-style: oblique ${this.cssFontInfo.italicAngle}deg;`),I=`@font-face {font-family:"${this.cssFontInfo.fontFamily}";${m}src:${A}}`}return this._inspectFont?.(this,A),I}getPathGenerator(X,A){if(this.compiledGlyphs[A]!==void 0)return this.compiledGlyphs[A];let I;try{I=X.get(this.loadedName+"_path_"+A)}catch(m){if(!this.ignoreErrors)throw m;return(0,l.warn)(`getPathGenerator - ignoring character: "${m}".`),this.compiledGlyphs[A]=function(W,Z){}}if(this.isEvalSupported&&l.FeatureTest.isEvalSupported){const m=[];for(const W of I){const Z=W.args!==void 0?W.args.join(","):"";m.push("c.",W.cmd,"(",Z,`);
`)}return this.compiledGlyphs[A]=new Function("c","size",m.join(""))}return this.compiledGlyphs[A]=function(m,W){for(const Z of I)Z.cmd==="scale"&&(Z.args=[W,-W]),m[Z.cmd].apply(m,Z.args)}}}C.FontFaceObject=M},(F,C)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.isNodeJS=void 0;const a=typeof process=="object"&&process+""=="[object process]"&&!process.versions.nw&&!(process.versions.electron&&process.type&&process.type!=="browser");C.isNodeJS=a},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.CanvasGraphics=void 0;var l=a(1),s=a(6),S=a(12),M=a(13),L=a(10);const X=16,A=100,I=4096,m=15,W=10,Z=1e3,w=16;function y(D,G){if(D._removeMirroring)throw new Error("Context is already forwarding operations.");D.__originalSave=D.save,D.__originalRestore=D.restore,D.__originalRotate=D.rotate,D.__originalScale=D.scale,D.__originalTranslate=D.translate,D.__originalTransform=D.transform,D.__originalSetTransform=D.setTransform,D.__originalResetTransform=D.resetTransform,D.__originalClip=D.clip,D.__originalMoveTo=D.moveTo,D.__originalLineTo=D.lineTo,D.__originalBezierCurveTo=D.bezierCurveTo,D.__originalRect=D.rect,D.__originalClosePath=D.closePath,D.__originalBeginPath=D.beginPath,D._removeMirroring=()=>{D.save=D.__originalSave,D.restore=D.__originalRestore,D.rotate=D.__originalRotate,D.scale=D.__originalScale,D.translate=D.__originalTranslate,D.transform=D.__originalTransform,D.setTransform=D.__originalSetTransform,D.resetTransform=D.__originalResetTransform,D.clip=D.__originalClip,D.moveTo=D.__originalMoveTo,D.lineTo=D.__originalLineTo,D.bezierCurveTo=D.__originalBezierCurveTo,D.rect=D.__originalRect,D.closePath=D.__originalClosePath,D.beginPath=D.__originalBeginPath,delete D._removeMirroring},D.save=function(){G.save(),this.__originalSave()},D.restore=function(){G.restore(),this.__originalRestore()},D.translate=function(V,n){G.translate(V,n),this.__originalTranslate(V,n)},D.scale=function(V,n){G.scale(V,n),this.__originalScale(V,n)},D.transform=function(V,n,g,d,i,o){G.transform(V,n,g,d,i,o),this.__originalTransform(V,n,g,d,i,o)},D.setTransform=function(V,n,g,d,i,o){G.setTransform(V,n,g,d,i,o),this.__originalSetTransform(V,n,g,d,i,o)},D.resetTransform=function(){G.resetTransform(),this.__originalResetTransform()},D.rotate=function(V){G.rotate(V),this.__originalRotate(V)},D.clip=function(V){G.clip(V),this.__originalClip(V)},D.moveTo=function(c,V){G.moveTo(c,V),this.__originalMoveTo(c,V)},D.lineTo=function(c,V){G.lineTo(c,V),this.__originalLineTo(c,V)},D.bezierCurveTo=function(c,V,n,g,d,i){G.bezierCurveTo(c,V,n,g,d,i),this.__originalBezierCurveTo(c,V,n,g,d,i)},D.rect=function(c,V,n,g){G.rect(c,V,n,g),this.__originalRect(c,V,n,g)},D.closePath=function(){G.closePath(),this.__originalClosePath()},D.beginPath=function(){G.beginPath(),this.__originalBeginPath()}}class N{constructor(G){this.canvasFactory=G,this.cache=Object.create(null)}getCanvas(G,c,V){let n;return this.cache[G]!==void 0?(n=this.cache[G],this.canvasFactory.reset(n,c,V)):(n=this.canvasFactory.create(c,V),this.cache[G]=n),n}delete(G){delete this.cache[G]}clear(){for(const G in this.cache){const c=this.cache[G];this.canvasFactory.destroy(c),delete this.cache[G]}}}function Y(D,G,c,V,n,g,d,i,o,R){const[t,z,O,sI,v,II]=(0,s.getCurrentTransform)(D);if(z===0&&O===0){const uI=d*t+v,DI=Math.round(uI),HI=i*sI+II,SI=Math.round(HI),pI=(d+o)*t+v,eI=Math.abs(Math.round(pI)-DI)||1,FI=(i+R)*sI+II,TI=Math.abs(Math.round(FI)-SI)||1;return D.setTransform(Math.sign(t),0,0,Math.sign(sI),DI,SI),D.drawImage(G,c,V,n,g,0,0,eI,TI),D.setTransform(t,z,O,sI,v,II),[eI,TI]}if(t===0&&sI===0){const uI=i*O+v,DI=Math.round(uI),HI=d*z+II,SI=Math.round(HI),pI=(i+R)*O+v,eI=Math.abs(Math.round(pI)-DI)||1,FI=(d+o)*z+II,TI=Math.abs(Math.round(FI)-SI)||1;return D.setTransform(0,Math.sign(z),Math.sign(O),0,DI,SI),D.drawImage(G,c,V,n,g,0,0,TI,eI),D.setTransform(t,z,O,sI,v,II),[TI,eI]}D.drawImage(G,c,V,n,g,d,i,o,R);const MI=Math.hypot(t,z),XI=Math.hypot(O,sI);return[MI*o,XI*R]}function k(D){const{width:G,height:c}=D;if(G>Z||c>Z)return null;const V=1e3,n=new Uint8Array([0,2,4,0,1,0,5,4,8,10,0,8,0,2,1,0]),g=G+1;let d=new Uint8Array(g*(c+1)),i,o,R;const t=G+7&-8;let z=new Uint8Array(t*c),O=0;for(const XI of D.data){let uI=128;for(;uI>0;)z[O++]=XI&uI?0:255,uI>>=1}let sI=0;for(O=0,z[O]!==0&&(d[0]=1,++sI),o=1;o<G;o++)z[O]!==z[O+1]&&(d[o]=z[O]?2:1,++sI),O++;for(z[O]!==0&&(d[o]=2,++sI),i=1;i<c;i++){O=i*t,R=i*g,z[O-t]!==z[O]&&(d[R]=z[O]?1:8,++sI);let XI=(z[O]?4:0)+(z[O-t]?8:0);for(o=1;o<G;o++)XI=(XI>>2)+(z[O+1]?4:0)+(z[O-t+1]?8:0),n[XI]&&(d[R+o]=n[XI],++sI),O++;if(z[O-t]!==z[O]&&(d[R+o]=z[O]?2:4,++sI),sI>V)return null}for(O=t*(c-1),R=i*g,z[O]!==0&&(d[R]=8,++sI),o=1;o<G;o++)z[O]!==z[O+1]&&(d[R+o]=z[O]?4:8,++sI),O++;if(z[O]!==0&&(d[R+o]=4,++sI),sI>V)return null;const v=new Int32Array([0,g,-1,0,-g,0,0,0,1]),II=new Path2D;for(i=0;sI&&i<=c;i++){let XI=i*g;const uI=XI+G;for(;XI<uI&&!d[XI];)XI++;if(XI===uI)continue;II.moveTo(XI%g,i);const DI=XI;let HI=d[XI];do{const SI=v[HI];do XI+=SI;while(!d[XI]);const pI=d[XI];pI!==5&&pI!==10?(HI=pI,d[XI]=0):(HI=pI&51*HI>>4,d[XI]&=HI>>2|HI<<2),II.lineTo(XI%g,XI/g|0),d[XI]||--sI}while(DI!==XI);--i}return z=null,d=null,function(XI){XI.save(),XI.scale(1/G,-1/c),XI.translate(0,-c),XI.fill(II),XI.beginPath(),XI.restore()}}class j{constructor(G,c){this.alphaIsShape=!1,this.fontSize=0,this.fontSizeScale=1,this.textMatrix=l.IDENTITY_MATRIX,this.textMatrixScale=1,this.fontMatrix=l.FONT_IDENTITY_MATRIX,this.leading=0,this.x=0,this.y=0,this.lineX=0,this.lineY=0,this.charSpacing=0,this.wordSpacing=0,this.textHScale=1,this.textRenderingMode=l.TextRenderingMode.FILL,this.textRise=0,this.fillColor="#000000",this.strokeColor="#000000",this.patternFill=!1,this.fillAlpha=1,this.strokeAlpha=1,this.lineWidth=1,this.activeSMask=null,this.transferMaps="none",this.startNewPathAndClipBox([0,0,G,c])}clone(){const G=Object.create(this);return G.clipBox=this.clipBox.slice(),G}setCurrentPoint(G,c){this.x=G,this.y=c}updatePathMinMax(G,c,V){[c,V]=l.Util.applyTransform([c,V],G),this.minX=Math.min(this.minX,c),this.minY=Math.min(this.minY,V),this.maxX=Math.max(this.maxX,c),this.maxY=Math.max(this.maxY,V)}updateRectMinMax(G,c){const V=l.Util.applyTransform(c,G),n=l.Util.applyTransform(c.slice(2),G);this.minX=Math.min(this.minX,V[0],n[0]),this.minY=Math.min(this.minY,V[1],n[1]),this.maxX=Math.max(this.maxX,V[0],n[0]),this.maxY=Math.max(this.maxY,V[1],n[1])}updateScalingPathMinMax(G,c){l.Util.scaleMinMax(G,c),this.minX=Math.min(this.minX,c[0]),this.maxX=Math.max(this.maxX,c[1]),this.minY=Math.min(this.minY,c[2]),this.maxY=Math.max(this.maxY,c[3])}updateCurvePathMinMax(G,c,V,n,g,d,i,o,R,t){const z=l.Util.bezierBoundingBox(c,V,n,g,d,i,o,R);if(t){t[0]=Math.min(t[0],z[0],z[2]),t[1]=Math.max(t[1],z[0],z[2]),t[2]=Math.min(t[2],z[1],z[3]),t[3]=Math.max(t[3],z[1],z[3]);return}this.updateRectMinMax(G,z)}getPathBoundingBox(G=S.PathType.FILL,c=null){const V=[this.minX,this.minY,this.maxX,this.maxY];if(G===S.PathType.STROKE){c||(0,l.unreachable)("Stroke bounding box must include transform.");const n=l.Util.singularValueDecompose2dScale(c),g=n[0]*this.lineWidth/2,d=n[1]*this.lineWidth/2;V[0]-=g,V[1]-=d,V[2]+=g,V[3]+=d}return V}updateClipFromPath(){const G=l.Util.intersect(this.clipBox,this.getPathBoundingBox());this.startNewPathAndClipBox(G||[0,0,0,0])}isEmptyClip(){return this.minX===1/0}startNewPathAndClipBox(G){this.clipBox=G,this.minX=1/0,this.minY=1/0,this.maxX=0,this.maxY=0}getClippedPathBoundingBox(G=S.PathType.FILL,c=null){return l.Util.intersect(this.clipBox,this.getPathBoundingBox(G,c))}}function p(D,G){if(typeof ImageData<"u"&&G instanceof ImageData){D.putImageData(G,0,0);return}const c=G.height,V=G.width,n=c%w,g=(c-n)/w,d=n===0?g:g+1,i=D.createImageData(V,w);let o=0,R;const t=G.data,z=i.data;let O,sI,v,II;if(G.kind===l.ImageKind.GRAYSCALE_1BPP){const MI=t.byteLength,XI=new Uint32Array(z.buffer,0,z.byteLength>>2),uI=XI.length,DI=V+7>>3,HI=4294967295,SI=l.FeatureTest.isLittleEndian?4278190080:255;for(O=0;O<d;O++){for(v=O<g?w:n,R=0,sI=0;sI<v;sI++){const pI=MI-o;let eI=0;const FI=pI>DI?V:pI*8-7,TI=FI&-8;let jI=0,JI=0;for(;eI<TI;eI+=8)JI=t[o++],XI[R++]=JI&128?HI:SI,XI[R++]=JI&64?HI:SI,XI[R++]=JI&32?HI:SI,XI[R++]=JI&16?HI:SI,XI[R++]=JI&8?HI:SI,XI[R++]=JI&4?HI:SI,XI[R++]=JI&2?HI:SI,XI[R++]=JI&1?HI:SI;for(;eI<FI;eI++)jI===0&&(JI=t[o++],jI=128),XI[R++]=JI&jI?HI:SI,jI>>=1}for(;R<uI;)XI[R++]=0;D.putImageData(i,0,O*w)}}else if(G.kind===l.ImageKind.RGBA_32BPP){for(sI=0,II=V*w*4,O=0;O<g;O++)z.set(t.subarray(o,o+II)),o+=II,D.putImageData(i,0,sI),sI+=w;O<d&&(II=V*n*4,z.set(t.subarray(o,o+II)),D.putImageData(i,0,sI))}else if(G.kind===l.ImageKind.RGB_24BPP)for(v=w,II=V*v,O=0;O<d;O++){for(O>=g&&(v=n,II=V*v),R=0,sI=II;sI--;)z[R++]=t[o++],z[R++]=t[o++],z[R++]=t[o++],z[R++]=255;D.putImageData(i,0,O*w)}else throw new Error(`bad image kind: ${G.kind}`)}function b(D,G){if(G.bitmap){D.drawImage(G.bitmap,0,0);return}const c=G.height,V=G.width,n=c%w,g=(c-n)/w,d=n===0?g:g+1,i=D.createImageData(V,w);let o=0;const R=G.data,t=i.data;for(let z=0;z<d;z++){const O=z<g?w:n;({srcPos:o}=(0,M.convertBlackAndWhiteToRGBA)({src:R,srcPos:o,dest:t,width:V,height:O,nonBlackColor:0})),D.putImageData(i,0,z*w)}}function B(D,G){const c=["strokeStyle","fillStyle","fillRule","globalAlpha","lineWidth","lineCap","lineJoin","miterLimit","globalCompositeOperation","font","filter"];for(const V of c)D[V]!==void 0&&(G[V]=D[V]);D.setLineDash!==void 0&&(G.setLineDash(D.getLineDash()),G.lineDashOffset=D.lineDashOffset)}function u(D){D.strokeStyle=D.fillStyle="#000000",D.fillRule="nonzero",D.globalAlpha=1,D.lineWidth=1,D.lineCap="butt",D.lineJoin="miter",D.miterLimit=10,D.globalCompositeOperation="source-over",D.font="10px sans-serif",D.setLineDash!==void 0&&(D.setLineDash([]),D.lineDashOffset=0),L.isNodeJS||(D.filter="none")}function T(D,G,c,V){const n=D.length;for(let g=3;g<n;g+=4){const d=D[g];if(d===0)D[g-3]=G,D[g-2]=c,D[g-1]=V;else if(d<255){const i=255-d;D[g-3]=D[g-3]*d+G*i>>8,D[g-2]=D[g-2]*d+c*i>>8,D[g-1]=D[g-1]*d+V*i>>8}}}function J(D,G,c){const V=D.length,n=1/255;for(let g=3;g<V;g+=4){const d=c?c[D[g]]:D[g];G[g]=G[g]*d*n|0}}function r(D,G,c){const V=D.length;for(let n=3;n<V;n+=4){const g=D[n-3]*77+D[n-2]*152+D[n-1]*28;G[n]=c?G[n]*c[g>>8]>>8:G[n]*g>>16}}function q(D,G,c,V,n,g,d,i,o,R,t){const z=!!g,O=z?g[0]:0,sI=z?g[1]:0,v=z?g[2]:0;let II;n==="Luminosity"?II=r:II=J;const XI=Math.min(V,Math.ceil(1048576/c));for(let uI=0;uI<V;uI+=XI){const DI=Math.min(XI,V-uI),HI=D.getImageData(i-R,uI+(o-t),c,DI),SI=G.getImageData(i,uI+o,c,DI);z&&T(HI.data,O,sI,v),II(HI.data,SI.data,d),G.putImageData(SI,i,uI+o)}}function hI(D,G,c,V){const n=V[0],g=V[1],d=V[2]-n,i=V[3]-g;d===0||i===0||(q(G.context,c,d,i,G.subtype,G.backdrop,G.transferMap,n,g,G.offsetX,G.offsetY),D.save(),D.globalAlpha=1,D.globalCompositeOperation="source-over",D.setTransform(1,0,0,1,0,0),D.drawImage(c.canvas,0,0),D.restore())}function KI(D,G){const c=l.Util.singularValueDecompose2dScale(D);c[0]=Math.fround(c[0]),c[1]=Math.fround(c[1]);const V=Math.fround((globalThis.devicePixelRatio||1)*s.PixelsPerInch.PDF_TO_CSS_UNITS);return G!==void 0?G:c[0]<=V||c[1]<=V}const NI=["butt","round","square"],yI=["miter","round","bevel"],oI={},U={};class Q{constructor(G,c,V,n,g,{optionalContentConfig:d,markedContentStack:i=null},o,R){this.ctx=G,this.current=new j(this.ctx.canvas.width,this.ctx.canvas.height),this.stateStack=[],this.pendingClip=null,this.pendingEOFill=!1,this.res=null,this.xobjs=null,this.commonObjs=c,this.objs=V,this.canvasFactory=n,this.filterFactory=g,this.groupStack=[],this.processingType3=null,this.baseTransform=null,this.baseTransformStack=[],this.groupLevel=0,this.smaskStack=[],this.smaskCounter=0,this.tempSMask=null,this.suspendedCtx=null,this.contentVisible=!0,this.markedContentStack=i||[],this.optionalContentConfig=d,this.cachedCanvases=new N(this.canvasFactory),this.cachedPatterns=new Map,this.annotationCanvasMap=o,this.viewportScale=1,this.outputScaleX=1,this.outputScaleY=1,this.pageColors=R,this._cachedScaleForStroking=[-1,0],this._cachedGetSinglePixelWidth=null,this._cachedBitmapsMap=new Map}getObject(G,c=null){return typeof G=="string"?G.startsWith("g_")?this.commonObjs.get(G):this.objs.get(G):c}beginDrawing({transform:G,viewport:c,transparency:V=!1,background:n=null}){const g=this.ctx.canvas.width,d=this.ctx.canvas.height,i=this.ctx.fillStyle;if(this.ctx.fillStyle=n||"#ffffff",this.ctx.fillRect(0,0,g,d),this.ctx.fillStyle=i,V){const o=this.cachedCanvases.getCanvas("transparent",g,d);this.compositeCtx=this.ctx,this.transparentCanvas=o.canvas,this.ctx=o.context,this.ctx.save(),this.ctx.transform(...(0,s.getCurrentTransform)(this.compositeCtx))}this.ctx.save(),u(this.ctx),G&&(this.ctx.transform(...G),this.outputScaleX=G[0],this.outputScaleY=G[0]),this.ctx.transform(...c.transform),this.viewportScale=c.scale,this.baseTransform=(0,s.getCurrentTransform)(this.ctx)}executeOperatorList(G,c,V,n){const g=G.argsArray,d=G.fnArray;let i=c||0;const o=g.length;if(o===i)return i;const R=o-i>W&&typeof V=="function",t=R?Date.now()+m:0;let z=0;const O=this.commonObjs,sI=this.objs;let v;for(;;){if(n!==void 0&&i===n.nextBreakPoint)return n.breakIt(i,V),i;if(v=d[i],v!==l.OPS.dependency)this[v].apply(this,g[i]);else for(const II of g[i]){const MI=II.startsWith("g_")?O:sI;if(!MI.has(II))return MI.get(II,V),i}if(i++,i===o)return i;if(R&&++z>W){if(Date.now()>t)return V(),i;z=0}}}#I(){for(;this.stateStack.length||this.inSMaskMode;)this.restore();this.ctx.restore(),this.transparentCanvas&&(this.ctx=this.compositeCtx,this.ctx.save(),this.ctx.setTransform(1,0,0,1,0,0),this.ctx.drawImage(this.transparentCanvas,0,0),this.ctx.restore(),this.transparentCanvas=null)}endDrawing(){this.#I(),this.cachedCanvases.clear(),this.cachedPatterns.clear();for(const G of this._cachedBitmapsMap.values()){for(const c of G.values())typeof HTMLCanvasElement<"u"&&c instanceof HTMLCanvasElement&&(c.width=c.height=0);G.clear()}this._cachedBitmapsMap.clear(),this.#g()}#g(){if(this.pageColors){const G=this.filterFactory.addHCMFilter(this.pageColors.foreground,this.pageColors.background);if(G!=="none"){const c=this.ctx.filter;this.ctx.filter=G,this.ctx.drawImage(this.ctx.canvas,0,0),this.ctx.filter=c}}}_scaleImage(G,c){const V=G.width,n=G.height;let g=Math.max(Math.hypot(c[0],c[1]),1),d=Math.max(Math.hypot(c[2],c[3]),1),i=V,o=n,R="prescale1",t,z;for(;g>2&&i>1||d>2&&o>1;){let O=i,sI=o;g>2&&i>1&&(O=i>=16384?Math.floor(i/2)-1||1:Math.ceil(i/2),g/=i/O),d>2&&o>1&&(sI=o>=16384?Math.floor(o/2)-1||1:Math.ceil(o)/2,d/=o/sI),t=this.cachedCanvases.getCanvas(R,O,sI),z=t.context,z.clearRect(0,0,O,sI),z.drawImage(G,0,0,i,o,0,0,O,sI),G=t.canvas,i=O,o=sI,R=R==="prescale1"?"prescale2":"prescale1"}return{img:G,paintWidth:i,paintHeight:o}}_createMaskCanvas(G){const c=this.ctx,{width:V,height:n}=G,g=this.current.fillColor,d=this.current.patternFill,i=(0,s.getCurrentTransform)(c);let o,R,t,z;if((G.bitmap||G.data)&&G.count>1){const eI=G.bitmap||G.data.buffer;R=JSON.stringify(d?i:[i.slice(0,4),g]),o=this._cachedBitmapsMap.get(eI),o||(o=new Map,this._cachedBitmapsMap.set(eI,o));const FI=o.get(R);if(FI&&!d){const TI=Math.round(Math.min(i[0],i[2])+i[4]),jI=Math.round(Math.min(i[1],i[3])+i[5]);return{canvas:FI,offsetX:TI,offsetY:jI}}t=FI}t||(z=this.cachedCanvases.getCanvas("maskCanvas",V,n),b(z.context,G));let O=l.Util.transform(i,[1/V,0,0,-1/n,0,0]);O=l.Util.transform(O,[1,0,0,1,0,-n]);const sI=l.Util.applyTransform([0,0],O),v=l.Util.applyTransform([V,n],O),II=l.Util.normalizeRect([sI[0],sI[1],v[0],v[1]]),MI=Math.round(II[2]-II[0])||1,XI=Math.round(II[3]-II[1])||1,uI=this.cachedCanvases.getCanvas("fillCanvas",MI,XI),DI=uI.context,HI=Math.min(sI[0],v[0]),SI=Math.min(sI[1],v[1]);DI.translate(-HI,-SI),DI.transform(...O),t||(t=this._scaleImage(z.canvas,(0,s.getCurrentTransformInverse)(DI)),t=t.img,o&&d&&o.set(R,t)),DI.imageSmoothingEnabled=KI((0,s.getCurrentTransform)(DI),G.interpolate),Y(DI,t,0,0,t.width,t.height,0,0,V,n),DI.globalCompositeOperation="source-in";const pI=l.Util.transform((0,s.getCurrentTransformInverse)(DI),[1,0,0,1,-HI,-SI]);return DI.fillStyle=d?g.getPattern(c,this,pI,S.PathType.FILL):g,DI.fillRect(0,0,V,n),o&&!d&&(this.cachedCanvases.delete("fillCanvas"),o.set(R,uI.canvas)),{canvas:uI.canvas,offsetX:Math.round(HI),offsetY:Math.round(SI)}}setLineWidth(G){G!==this.current.lineWidth&&(this._cachedScaleForStroking[0]=-1),this.current.lineWidth=G,this.ctx.lineWidth=G}setLineCap(G){this.ctx.lineCap=NI[G]}setLineJoin(G){this.ctx.lineJoin=yI[G]}setMiterLimit(G){this.ctx.miterLimit=G}setDash(G,c){const V=this.ctx;V.setLineDash!==void 0&&(V.setLineDash(G),V.lineDashOffset=c)}setRenderingIntent(G){}setFlatness(G){}setGState(G){for(const[c,V]of G)switch(c){case"LW":this.setLineWidth(V);break;case"LC":this.setLineCap(V);break;case"LJ":this.setLineJoin(V);break;case"ML":this.setMiterLimit(V);break;case"D":this.setDash(V[0],V[1]);break;case"RI":this.setRenderingIntent(V);break;case"FL":this.setFlatness(V);break;case"Font":this.setFont(V[0],V[1]);break;case"CA":this.current.strokeAlpha=V;break;case"ca":this.current.fillAlpha=V,this.ctx.globalAlpha=V;break;case"BM":this.ctx.globalCompositeOperation=V;break;case"SMask":this.current.activeSMask=V?this.tempSMask:null,this.tempSMask=null,this.checkSMaskState();break;case"TR":this.ctx.filter=this.current.transferMaps=this.filterFactory.addFilter(V);break}}get inSMaskMode(){return!!this.suspendedCtx}checkSMaskState(){const G=this.inSMaskMode;this.current.activeSMask&&!G?this.beginSMaskMode():!this.current.activeSMask&&G&&this.endSMaskMode()}beginSMaskMode(){if(this.inSMaskMode)throw new Error("beginSMaskMode called while already in smask mode");const G=this.ctx.canvas.width,c=this.ctx.canvas.height,V="smaskGroupAt"+this.groupLevel,n=this.cachedCanvases.getCanvas(V,G,c);this.suspendedCtx=this.ctx,this.ctx=n.context;const g=this.ctx;g.setTransform(...(0,s.getCurrentTransform)(this.suspendedCtx)),B(this.suspendedCtx,g),y(g,this.suspendedCtx),this.setGState([["BM","source-over"],["ca",1],["CA",1]])}endSMaskMode(){if(!this.inSMaskMode)throw new Error("endSMaskMode called while not in smask mode");this.ctx._removeMirroring(),B(this.ctx,this.suspendedCtx),this.ctx=this.suspendedCtx,this.suspendedCtx=null}compose(G){if(!this.current.activeSMask)return;G?(G[0]=Math.floor(G[0]),G[1]=Math.floor(G[1]),G[2]=Math.ceil(G[2]),G[3]=Math.ceil(G[3])):G=[0,0,this.ctx.canvas.width,this.ctx.canvas.height];const c=this.current.activeSMask,V=this.suspendedCtx;hI(V,c,this.ctx,G),this.ctx.save(),this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height),this.ctx.restore()}save(){this.inSMaskMode?(B(this.ctx,this.suspendedCtx),this.suspendedCtx.save()):this.ctx.save();const G=this.current;this.stateStack.push(G),this.current=G.clone()}restore(){this.stateStack.length===0&&this.inSMaskMode&&this.endSMaskMode(),this.stateStack.length!==0&&(this.current=this.stateStack.pop(),this.inSMaskMode?(this.suspendedCtx.restore(),B(this.suspendedCtx,this.ctx)):this.ctx.restore(),this.checkSMaskState(),this.pendingClip=null,this._cachedScaleForStroking[0]=-1,this._cachedGetSinglePixelWidth=null)}transform(G,c,V,n,g,d){this.ctx.transform(G,c,V,n,g,d),this._cachedScaleForStroking[0]=-1,this._cachedGetSinglePixelWidth=null}constructPath(G,c,V){const n=this.ctx,g=this.current;let d=g.x,i=g.y,o,R;const t=(0,s.getCurrentTransform)(n),z=t[0]===0&&t[3]===0||t[1]===0&&t[2]===0,O=z?V.slice(0):null;for(let sI=0,v=0,II=G.length;sI<II;sI++)switch(G[sI]|0){case l.OPS.rectangle:d=c[v++],i=c[v++];const MI=c[v++],XI=c[v++],uI=d+MI,DI=i+XI;n.moveTo(d,i),MI===0||XI===0?n.lineTo(uI,DI):(n.lineTo(uI,i),n.lineTo(uI,DI),n.lineTo(d,DI)),z||g.updateRectMinMax(t,[d,i,uI,DI]),n.closePath();break;case l.OPS.moveTo:d=c[v++],i=c[v++],n.moveTo(d,i),z||g.updatePathMinMax(t,d,i);break;case l.OPS.lineTo:d=c[v++],i=c[v++],n.lineTo(d,i),z||g.updatePathMinMax(t,d,i);break;case l.OPS.curveTo:o=d,R=i,d=c[v+4],i=c[v+5],n.bezierCurveTo(c[v],c[v+1],c[v+2],c[v+3],d,i),g.updateCurvePathMinMax(t,o,R,c[v],c[v+1],c[v+2],c[v+3],d,i,O),v+=6;break;case l.OPS.curveTo2:o=d,R=i,n.bezierCurveTo(d,i,c[v],c[v+1],c[v+2],c[v+3]),g.updateCurvePathMinMax(t,o,R,d,i,c[v],c[v+1],c[v+2],c[v+3],O),d=c[v+2],i=c[v+3],v+=4;break;case l.OPS.curveTo3:o=d,R=i,d=c[v+2],i=c[v+3],n.bezierCurveTo(c[v],c[v+1],d,i,d,i),g.updateCurvePathMinMax(t,o,R,c[v],c[v+1],d,i,d,i,O),v+=4;break;case l.OPS.closePath:n.closePath();break}z&&g.updateScalingPathMinMax(t,O),g.setCurrentPoint(d,i)}closePath(){this.ctx.closePath()}stroke(G=!0){const c=this.ctx,V=this.current.strokeColor;c.globalAlpha=this.current.strokeAlpha,this.contentVisible&&(typeof V=="object"&&V?.getPattern?(c.save(),c.strokeStyle=V.getPattern(c,this,(0,s.getCurrentTransformInverse)(c),S.PathType.STROKE),this.rescaleAndStroke(!1),c.restore()):this.rescaleAndStroke(!0)),G&&this.consumePath(this.current.getClippedPathBoundingBox()),c.globalAlpha=this.current.fillAlpha}closeStroke(){this.closePath(),this.stroke()}fill(G=!0){const c=this.ctx,V=this.current.fillColor,n=this.current.patternFill;let g=!1;n&&(c.save(),c.fillStyle=V.getPattern(c,this,(0,s.getCurrentTransformInverse)(c),S.PathType.FILL),g=!0);const d=this.current.getClippedPathBoundingBox();this.contentVisible&&d!==null&&(this.pendingEOFill?(c.fill("evenodd"),this.pendingEOFill=!1):c.fill()),g&&c.restore(),G&&this.consumePath(d)}eoFill(){this.pendingEOFill=!0,this.fill()}fillStroke(){this.fill(!1),this.stroke(!1),this.consumePath()}eoFillStroke(){this.pendingEOFill=!0,this.fillStroke()}closeFillStroke(){this.closePath(),this.fillStroke()}closeEOFillStroke(){this.pendingEOFill=!0,this.closePath(),this.fillStroke()}endPath(){this.consumePath()}clip(){this.pendingClip=oI}eoClip(){this.pendingClip=U}beginText(){this.current.textMatrix=l.IDENTITY_MATRIX,this.current.textMatrixScale=1,this.current.x=this.current.lineX=0,this.current.y=this.current.lineY=0}endText(){const G=this.pendingTextPaths,c=this.ctx;if(G===void 0){c.beginPath();return}c.save(),c.beginPath();for(const V of G)c.setTransform(...V.transform),c.translate(V.x,V.y),V.addToPath(c,V.fontSize);c.restore(),c.clip(),c.beginPath(),delete this.pendingTextPaths}setCharSpacing(G){this.current.charSpacing=G}setWordSpacing(G){this.current.wordSpacing=G}setHScale(G){this.current.textHScale=G/100}setLeading(G){this.current.leading=-G}setFont(G,c){const V=this.commonObjs.get(G),n=this.current;if(!V)throw new Error(`Can't find font for ${G}`);if(n.fontMatrix=V.fontMatrix||l.FONT_IDENTITY_MATRIX,(n.fontMatrix[0]===0||n.fontMatrix[3]===0)&&(0,l.warn)("Invalid font matrix for font "+G),c<0?(c=-c,n.fontDirection=-1):n.fontDirection=1,this.current.font=V,this.current.fontSize=c,V.isType3Font)return;const g=V.loadedName||"sans-serif",d=V.systemFontInfo?.css||`"${g}", ${V.fallbackName}`;let i="normal";V.black?i="900":V.bold&&(i="bold");const o=V.italic?"italic":"normal";let R=c;c<X?R=X:c>A&&(R=A),this.current.fontSizeScale=c/R,this.ctx.font=`${o} ${i} ${R}px ${d}`}setTextRenderingMode(G){this.current.textRenderingMode=G}setTextRise(G){this.current.textRise=G}moveText(G,c){this.current.x=this.current.lineX+=G,this.current.y=this.current.lineY+=c}setLeadingMoveText(G,c){this.setLeading(-c),this.moveText(G,c)}setTextMatrix(G,c,V,n,g,d){this.current.textMatrix=[G,c,V,n,g,d],this.current.textMatrixScale=Math.hypot(G,c),this.current.x=this.current.lineX=0,this.current.y=this.current.lineY=0}nextLine(){this.moveText(0,this.current.leading)}paintChar(G,c,V,n){const g=this.ctx,d=this.current,i=d.font,o=d.textRenderingMode,R=d.fontSize/d.fontSizeScale,t=o&l.TextRenderingMode.FILL_STROKE_MASK,z=!!(o&l.TextRenderingMode.ADD_TO_PATH_FLAG),O=d.patternFill&&!i.missingFile;let sI;(i.disableFontFace||z||O)&&(sI=i.getPathGenerator(this.commonObjs,G)),i.disableFontFace||O?(g.save(),g.translate(c,V),g.beginPath(),sI(g,R),n&&g.setTransform(...n),(t===l.TextRenderingMode.FILL||t===l.TextRenderingMode.FILL_STROKE)&&g.fill(),(t===l.TextRenderingMode.STROKE||t===l.TextRenderingMode.FILL_STROKE)&&g.stroke(),g.restore()):((t===l.TextRenderingMode.FILL||t===l.TextRenderingMode.FILL_STROKE)&&g.fillText(G,c,V),(t===l.TextRenderingMode.STROKE||t===l.TextRenderingMode.FILL_STROKE)&&g.strokeText(G,c,V)),z&&(this.pendingTextPaths||=[]).push({transform:(0,s.getCurrentTransform)(g),x:c,y:V,fontSize:R,addToPath:sI})}get isFontSubpixelAAEnabled(){const{context:G}=this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled",10,10);G.scale(1.5,1),G.fillText("I",0,10);const c=G.getImageData(0,0,10,10).data;let V=!1;for(let n=3;n<c.length;n+=4)if(c[n]>0&&c[n]<255){V=!0;break}return(0,l.shadow)(this,"isFontSubpixelAAEnabled",V)}showText(G){const c=this.current,V=c.font;if(V.isType3Font)return this.showType3Text(G);const n=c.fontSize;if(n===0)return;const g=this.ctx,d=c.fontSizeScale,i=c.charSpacing,o=c.wordSpacing,R=c.fontDirection,t=c.textHScale*R,z=G.length,O=V.vertical,sI=O?1:-1,v=V.defaultVMetrics,II=n*c.fontMatrix[0],MI=c.textRenderingMode===l.TextRenderingMode.FILL&&!V.disableFontFace&&!c.patternFill;g.save(),g.transform(...c.textMatrix),g.translate(c.x,c.y+c.textRise),R>0?g.scale(t,-1):g.scale(t,1);let XI;if(c.patternFill){g.save();const pI=c.fillColor.getPattern(g,this,(0,s.getCurrentTransformInverse)(g),S.PathType.FILL);XI=(0,s.getCurrentTransform)(g),g.restore(),g.fillStyle=pI}let uI=c.lineWidth;const DI=c.textMatrixScale;if(DI===0||uI===0){const pI=c.textRenderingMode&l.TextRenderingMode.FILL_STROKE_MASK;(pI===l.TextRenderingMode.STROKE||pI===l.TextRenderingMode.FILL_STROKE)&&(uI=this.getSinglePixelWidth())}else uI/=DI;if(d!==1&&(g.scale(d,d),uI/=d),g.lineWidth=uI,V.isInvalidPDFjsFont){const pI=[];let eI=0;for(const FI of G)pI.push(FI.unicode),eI+=FI.width;g.fillText(pI.join(""),0,0),c.x+=eI*II*t,g.restore(),this.compose();return}let HI=0,SI;for(SI=0;SI<z;++SI){const pI=G[SI];if(typeof pI=="number"){HI+=sI*pI*n/1e3;continue}let eI=!1;const FI=(pI.isSpace?o:0)+i,TI=pI.fontChar,jI=pI.accent;let JI,rI,UI=pI.width;if(O){const OI=pI.vmetric||v,vI=-(pI.vmetric?OI[1]:UI*.5)*II,Cg=OI[2]*II;UI=OI?-OI[0]:UI,JI=vI/d,rI=(HI+Cg)/d}else JI=HI/d,rI=0;if(V.remeasure&&UI>0){const OI=g.measureText(TI).width*1e3/n*d;if(UI<OI&&this.isFontSubpixelAAEnabled){const vI=UI/OI;eI=!0,g.save(),g.scale(vI,1),JI/=vI}else UI!==OI&&(JI+=(UI-OI)/2e3*n/d)}if(this.contentVisible&&(pI.isInFont||V.missingFile)){if(MI&&!jI)g.fillText(TI,JI,rI);else if(this.paintChar(TI,JI,rI,XI),jI){const OI=JI+n*jI.offset.x/d,vI=rI-n*jI.offset.y/d;this.paintChar(jI.fontChar,OI,vI,XI)}}let $I;O?$I=UI*II-FI*R:$I=UI*II+FI*R,HI+=$I,eI&&g.restore()}O?c.y-=HI:c.x+=HI*t,g.restore(),this.compose()}showType3Text(G){const c=this.ctx,V=this.current,n=V.font,g=V.fontSize,d=V.fontDirection,i=n.vertical?1:-1,o=V.charSpacing,R=V.wordSpacing,t=V.textHScale*d,z=V.fontMatrix||l.FONT_IDENTITY_MATRIX,O=G.length,sI=V.textRenderingMode===l.TextRenderingMode.INVISIBLE;let v,II,MI,XI;if(!(sI||g===0)){for(this._cachedScaleForStroking[0]=-1,this._cachedGetSinglePixelWidth=null,c.save(),c.transform(...V.textMatrix),c.translate(V.x,V.y),c.scale(t,d),v=0;v<O;++v){if(II=G[v],typeof II=="number"){XI=i*II*g/1e3,this.ctx.translate(XI,0),V.x+=XI*t;continue}const uI=(II.isSpace?R:0)+o,DI=n.charProcOperatorList[II.operatorListId];if(!DI){(0,l.warn)(`Type3 character "${II.operatorListId}" is not available.`);continue}this.contentVisible&&(this.processingType3=II,this.save(),c.scale(g,g),c.transform(...z),this.executeOperatorList(DI),this.restore()),MI=l.Util.applyTransform([II.width,0],z)[0]*g+uI,c.translate(MI,0),V.x+=MI*t}c.restore(),this.processingType3=null}}setCharWidth(G,c){}setCharWidthAndBounds(G,c,V,n,g,d){this.ctx.rect(V,n,g-V,d-n),this.ctx.clip(),this.endPath()}getColorN_Pattern(G){let c;if(G[0]==="TilingPattern"){const V=G[1],n=this.baseTransform||(0,s.getCurrentTransform)(this.ctx),g={createCanvasGraphics:d=>new Q(d,this.commonObjs,this.objs,this.canvasFactory,this.filterFactory,{optionalContentConfig:this.optionalContentConfig,markedContentStack:this.markedContentStack})};c=new S.TilingPattern(G,V,this.ctx,g,n)}else c=this._getPattern(G[1],G[2]);return c}setStrokeColorN(){this.current.strokeColor=this.getColorN_Pattern(arguments)}setFillColorN(){this.current.fillColor=this.getColorN_Pattern(arguments),this.current.patternFill=!0}setStrokeRGBColor(G,c,V){const n=l.Util.makeHexColor(G,c,V);this.ctx.strokeStyle=n,this.current.strokeColor=n}setFillRGBColor(G,c,V){const n=l.Util.makeHexColor(G,c,V);this.ctx.fillStyle=n,this.current.fillColor=n,this.current.patternFill=!1}_getPattern(G,c=null){let V;return this.cachedPatterns.has(G)?V=this.cachedPatterns.get(G):(V=(0,S.getShadingPattern)(this.getObject(G)),this.cachedPatterns.set(G,V)),c&&(V.matrix=c),V}shadingFill(G){if(!this.contentVisible)return;const c=this.ctx;this.save();const V=this._getPattern(G);c.fillStyle=V.getPattern(c,this,(0,s.getCurrentTransformInverse)(c),S.PathType.SHADING);const n=(0,s.getCurrentTransformInverse)(c);if(n){const g=c.canvas,d=g.width,i=g.height,o=l.Util.applyTransform([0,0],n),R=l.Util.applyTransform([0,i],n),t=l.Util.applyTransform([d,0],n),z=l.Util.applyTransform([d,i],n),O=Math.min(o[0],R[0],t[0],z[0]),sI=Math.min(o[1],R[1],t[1],z[1]),v=Math.max(o[0],R[0],t[0],z[0]),II=Math.max(o[1],R[1],t[1],z[1]);this.ctx.fillRect(O,sI,v-O,II-sI)}else this.ctx.fillRect(-1e10,-1e10,2e10,2e10);this.compose(this.current.getClippedPathBoundingBox()),this.restore()}beginInlineImage(){(0,l.unreachable)("Should not call beginInlineImage")}beginImageData(){(0,l.unreachable)("Should not call beginImageData")}paintFormXObjectBegin(G,c){if(this.contentVisible&&(this.save(),this.baseTransformStack.push(this.baseTransform),Array.isArray(G)&&G.length===6&&this.transform(...G),this.baseTransform=(0,s.getCurrentTransform)(this.ctx),c)){const V=c[2]-c[0],n=c[3]-c[1];this.ctx.rect(c[0],c[1],V,n),this.current.updateRectMinMax((0,s.getCurrentTransform)(this.ctx),c),this.clip(),this.endPath()}}paintFormXObjectEnd(){this.contentVisible&&(this.restore(),this.baseTransform=this.baseTransformStack.pop())}beginGroup(G){if(!this.contentVisible)return;this.save(),this.inSMaskMode&&(this.endSMaskMode(),this.current.activeSMask=null);const c=this.ctx;G.isolated||(0,l.info)("TODO: Support non-isolated groups."),G.knockout&&(0,l.warn)("Knockout groups not supported.");const V=(0,s.getCurrentTransform)(c);if(G.matrix&&c.transform(...G.matrix),!G.bbox)throw new Error("Bounding box is required.");let n=l.Util.getAxialAlignedBoundingBox(G.bbox,(0,s.getCurrentTransform)(c));const g=[0,0,c.canvas.width,c.canvas.height];n=l.Util.intersect(n,g)||[0,0,0,0];const d=Math.floor(n[0]),i=Math.floor(n[1]);let o=Math.max(Math.ceil(n[2])-d,1),R=Math.max(Math.ceil(n[3])-i,1),t=1,z=1;o>I&&(t=o/I,o=I),R>I&&(z=R/I,R=I),this.current.startNewPathAndClipBox([0,0,o,R]);let O="groupAt"+this.groupLevel;G.smask&&(O+="_smask_"+this.smaskCounter++%2);const sI=this.cachedCanvases.getCanvas(O,o,R),v=sI.context;v.scale(1/t,1/z),v.translate(-d,-i),v.transform(...V),G.smask?this.smaskStack.push({canvas:sI.canvas,context:v,offsetX:d,offsetY:i,scaleX:t,scaleY:z,subtype:G.smask.subtype,backdrop:G.smask.backdrop,transferMap:G.smask.transferMap||null,startTransformInverse:null}):(c.setTransform(1,0,0,1,0,0),c.translate(d,i),c.scale(t,z),c.save()),B(c,v),this.ctx=v,this.setGState([["BM","source-over"],["ca",1],["CA",1]]),this.groupStack.push(c),this.groupLevel++}endGroup(G){if(!this.contentVisible)return;this.groupLevel--;const c=this.ctx,V=this.groupStack.pop();if(this.ctx=V,this.ctx.imageSmoothingEnabled=!1,G.smask)this.tempSMask=this.smaskStack.pop(),this.restore();else{this.ctx.restore();const n=(0,s.getCurrentTransform)(this.ctx);this.restore(),this.ctx.save(),this.ctx.setTransform(...n);const g=l.Util.getAxialAlignedBoundingBox([0,0,c.canvas.width,c.canvas.height],n);this.ctx.drawImage(c.canvas,0,0),this.ctx.restore(),this.compose(g)}}beginAnnotation(G,c,V,n,g){if(this.#I(),u(this.ctx),this.ctx.save(),this.save(),this.baseTransform&&this.ctx.setTransform(...this.baseTransform),Array.isArray(c)&&c.length===4){const d=c[2]-c[0],i=c[3]-c[1];if(g&&this.annotationCanvasMap){V=V.slice(),V[4]-=c[0],V[5]-=c[1],c=c.slice(),c[0]=c[1]=0,c[2]=d,c[3]=i;const[o,R]=l.Util.singularValueDecompose2dScale((0,s.getCurrentTransform)(this.ctx)),{viewportScale:t}=this,z=Math.ceil(d*this.outputScaleX*t),O=Math.ceil(i*this.outputScaleY*t);this.annotationCanvas=this.canvasFactory.create(z,O);const{canvas:sI,context:v}=this.annotationCanvas;this.annotationCanvasMap.set(G,sI),this.annotationCanvas.savedCtx=this.ctx,this.ctx=v,this.ctx.save(),this.ctx.setTransform(o,0,0,-R,0,i*R),u(this.ctx)}else u(this.ctx),this.ctx.rect(c[0],c[1],d,i),this.ctx.clip(),this.endPath()}this.current=new j(this.ctx.canvas.width,this.ctx.canvas.height),this.transform(...V),this.transform(...n)}endAnnotation(){this.annotationCanvas&&(this.ctx.restore(),this.#g(),this.ctx=this.annotationCanvas.savedCtx,delete this.annotationCanvas.savedCtx,delete this.annotationCanvas)}paintImageMaskXObject(G){if(!this.contentVisible)return;const c=G.count;G=this.getObject(G.data,G),G.count=c;const V=this.ctx,n=this.processingType3;if(n&&(n.compiled===void 0&&(n.compiled=k(G)),n.compiled)){n.compiled(V);return}const g=this._createMaskCanvas(G),d=g.canvas;V.save(),V.setTransform(1,0,0,1,0,0),V.drawImage(d,g.offsetX,g.offsetY),V.restore(),this.compose()}paintImageMaskXObjectRepeat(G,c,V=0,n=0,g,d){if(!this.contentVisible)return;G=this.getObject(G.data,G);const i=this.ctx;i.save();const o=(0,s.getCurrentTransform)(i);i.transform(c,V,n,g,0,0);const R=this._createMaskCanvas(G);i.setTransform(1,0,0,1,R.offsetX-o[4],R.offsetY-o[5]);for(let t=0,z=d.length;t<z;t+=2){const O=l.Util.transform(o,[c,V,n,g,d[t],d[t+1]]),[sI,v]=l.Util.applyTransform([0,0],O);i.drawImage(R.canvas,sI,v)}i.restore(),this.compose()}paintImageMaskXObjectGroup(G){if(!this.contentVisible)return;const c=this.ctx,V=this.current.fillColor,n=this.current.patternFill;for(const g of G){const{data:d,width:i,height:o,transform:R}=g,t=this.cachedCanvases.getCanvas("maskCanvas",i,o),z=t.context;z.save();const O=this.getObject(d,g);b(z,O),z.globalCompositeOperation="source-in",z.fillStyle=n?V.getPattern(z,this,(0,s.getCurrentTransformInverse)(c),S.PathType.FILL):V,z.fillRect(0,0,i,o),z.restore(),c.save(),c.transform(...R),c.scale(1,-1),Y(c,t.canvas,0,0,i,o,0,-1,1,1),c.restore()}this.compose()}paintImageXObject(G){if(!this.contentVisible)return;const c=this.getObject(G);if(!c){(0,l.warn)("Dependent image isn't ready yet");return}this.paintInlineImageXObject(c)}paintImageXObjectRepeat(G,c,V,n){if(!this.contentVisible)return;const g=this.getObject(G);if(!g){(0,l.warn)("Dependent image isn't ready yet");return}const d=g.width,i=g.height,o=[];for(let R=0,t=n.length;R<t;R+=2)o.push({transform:[c,0,0,V,n[R],n[R+1]],x:0,y:0,w:d,h:i});this.paintInlineImageXObjectGroup(g,o)}applyTransferMapsToCanvas(G){return this.current.transferMaps!=="none"&&(G.filter=this.current.transferMaps,G.drawImage(G.canvas,0,0),G.filter="none"),G.canvas}applyTransferMapsToBitmap(G){if(this.current.transferMaps==="none")return G.bitmap;const{bitmap:c,width:V,height:n}=G,g=this.cachedCanvases.getCanvas("inlineImage",V,n),d=g.context;return d.filter=this.current.transferMaps,d.drawImage(c,0,0),d.filter="none",g.canvas}paintInlineImageXObject(G){if(!this.contentVisible)return;const c=G.width,V=G.height,n=this.ctx;this.save(),L.isNodeJS||(n.filter="none"),n.scale(1/c,-1/V);let g;if(G.bitmap)g=this.applyTransferMapsToBitmap(G);else if(typeof HTMLElement=="function"&&G instanceof HTMLElement||!G.data)g=G;else{const o=this.cachedCanvases.getCanvas("inlineImage",c,V).context;p(o,G),g=this.applyTransferMapsToCanvas(o)}const d=this._scaleImage(g,(0,s.getCurrentTransformInverse)(n));n.imageSmoothingEnabled=KI((0,s.getCurrentTransform)(n),G.interpolate),Y(n,d.img,0,0,d.paintWidth,d.paintHeight,0,-V,c,V),this.compose(),this.restore()}paintInlineImageXObjectGroup(G,c){if(!this.contentVisible)return;const V=this.ctx;let n;if(G.bitmap)n=G.bitmap;else{const g=G.width,d=G.height,o=this.cachedCanvases.getCanvas("inlineImage",g,d).context;p(o,G),n=this.applyTransferMapsToCanvas(o)}for(const g of c)V.save(),V.transform(...g.transform),V.scale(1,-1),Y(V,n,g.x,g.y,g.w,g.h,0,-1,1,1),V.restore();this.compose()}paintSolidColorImageMask(){this.contentVisible&&(this.ctx.fillRect(0,0,1,1),this.compose())}markPoint(G){}markPointProps(G,c){}beginMarkedContent(G){this.markedContentStack.push({visible:!0})}beginMarkedContentProps(G,c){G==="OC"?this.markedContentStack.push({visible:this.optionalContentConfig.isVisible(c)}):this.markedContentStack.push({visible:!0}),this.contentVisible=this.isContentVisible()}endMarkedContent(){this.markedContentStack.pop(),this.contentVisible=this.isContentVisible()}beginCompat(){}endCompat(){}consumePath(G){const c=this.current.isEmptyClip();this.pendingClip&&this.current.updateClipFromPath(),this.pendingClip||this.compose(G);const V=this.ctx;this.pendingClip&&(c||(this.pendingClip===U?V.clip("evenodd"):V.clip()),this.pendingClip=null),this.current.startNewPathAndClipBox(this.current.clipBox),V.beginPath()}getSinglePixelWidth(){if(!this._cachedGetSinglePixelWidth){const G=(0,s.getCurrentTransform)(this.ctx);if(G[1]===0&&G[2]===0)this._cachedGetSinglePixelWidth=1/Math.min(Math.abs(G[0]),Math.abs(G[3]));else{const c=Math.abs(G[0]*G[3]-G[2]*G[1]),V=Math.hypot(G[0],G[2]),n=Math.hypot(G[1],G[3]);this._cachedGetSinglePixelWidth=Math.max(V,n)/c}}return this._cachedGetSinglePixelWidth}getScaleForStroking(){if(this._cachedScaleForStroking[0]===-1){const{lineWidth:G}=this.current,{a:c,b:V,c:n,d:g}=this.ctx.getTransform();let d,i;if(V===0&&n===0){const o=Math.abs(c),R=Math.abs(g);if(o===R)if(G===0)d=i=1/o;else{const t=o*G;d=i=t<1?1/t:1}else if(G===0)d=1/o,i=1/R;else{const t=o*G,z=R*G;d=t<1?1/t:1,i=z<1?1/z:1}}else{const o=Math.abs(c*g-V*n),R=Math.hypot(c,V),t=Math.hypot(n,g);if(G===0)d=t/o,i=R/o;else{const z=G*o;d=t>z?t/z:1,i=R>z?R/z:1}}this._cachedScaleForStroking[0]=d,this._cachedScaleForStroking[1]=i}return this._cachedScaleForStroking}rescaleAndStroke(G){const{ctx:c}=this,{lineWidth:V}=this.current,[n,g]=this.getScaleForStroking();if(c.lineWidth=V||1,n===1&&g===1){c.stroke();return}const d=c.getLineDash();if(G&&c.save(),c.scale(n,g),d.length>0){const i=Math.max(n,g);c.setLineDash(d.map(o=>o/i)),c.lineDashOffset/=i}c.stroke(),G&&c.restore()}isContentVisible(){for(let G=this.markedContentStack.length-1;G>=0;G--)if(!this.markedContentStack[G].visible)return!1;return!0}}C.CanvasGraphics=Q;for(const D in l.OPS)Q.prototype[D]!==void 0&&(Q.prototype[l.OPS[D]]=Q.prototype[D])},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.TilingPattern=C.PathType=void 0,C.getShadingPattern=Z;var l=a(1),s=a(6);const S={FILL:"Fill",STROKE:"Stroke",SHADING:"Shading"};C.PathType=S;function M(N,Y){if(!Y)return;const k=Y[2]-Y[0],j=Y[3]-Y[1],p=new Path2D;p.rect(Y[0],Y[1],k,j),N.clip(p)}class L{constructor(){this.constructor===L&&(0,l.unreachable)("Cannot initialize BaseShadingPattern.")}getPattern(){(0,l.unreachable)("Abstract method `getPattern` called.")}}class X extends L{constructor(Y){super(),this._type=Y[1],this._bbox=Y[2],this._colorStops=Y[3],this._p0=Y[4],this._p1=Y[5],this._r0=Y[6],this._r1=Y[7],this.matrix=null}_createGradient(Y){let k;this._type==="axial"?k=Y.createLinearGradient(this._p0[0],this._p0[1],this._p1[0],this._p1[1]):this._type==="radial"&&(k=Y.createRadialGradient(this._p0[0],this._p0[1],this._r0,this._p1[0],this._p1[1],this._r1));for(const j of this._colorStops)k.addColorStop(j[0],j[1]);return k}getPattern(Y,k,j,p){let b;if(p===S.STROKE||p===S.FILL){const B=k.current.getClippedPathBoundingBox(p,(0,s.getCurrentTransform)(Y))||[0,0,0,0],u=Math.ceil(B[2]-B[0])||1,T=Math.ceil(B[3]-B[1])||1,J=k.cachedCanvases.getCanvas("pattern",u,T,!0),r=J.context;r.clearRect(0,0,r.canvas.width,r.canvas.height),r.beginPath(),r.rect(0,0,r.canvas.width,r.canvas.height),r.translate(-B[0],-B[1]),j=l.Util.transform(j,[1,0,0,1,B[0],B[1]]),r.transform(...k.baseTransform),this.matrix&&r.transform(...this.matrix),M(r,this._bbox),r.fillStyle=this._createGradient(r),r.fill(),b=Y.createPattern(J.canvas,"no-repeat");const q=new DOMMatrix(j);b.setTransform(q)}else M(Y,this._bbox),b=this._createGradient(Y);return b}}function A(N,Y,k,j,p,b,B,u){const T=Y.coords,J=Y.colors,r=N.data,q=N.width*4;let hI;T[k+1]>T[j+1]&&(hI=k,k=j,j=hI,hI=b,b=B,B=hI),T[j+1]>T[p+1]&&(hI=j,j=p,p=hI,hI=B,B=u,u=hI),T[k+1]>T[j+1]&&(hI=k,k=j,j=hI,hI=b,b=B,B=hI);const KI=(T[k]+Y.offsetX)*Y.scaleX,NI=(T[k+1]+Y.offsetY)*Y.scaleY,yI=(T[j]+Y.offsetX)*Y.scaleX,oI=(T[j+1]+Y.offsetY)*Y.scaleY,U=(T[p]+Y.offsetX)*Y.scaleX,Q=(T[p+1]+Y.offsetY)*Y.scaleY;if(NI>=Q)return;const D=J[b],G=J[b+1],c=J[b+2],V=J[B],n=J[B+1],g=J[B+2],d=J[u],i=J[u+1],o=J[u+2],R=Math.round(NI),t=Math.round(Q);let z,O,sI,v,II,MI,XI,uI;for(let DI=R;DI<=t;DI++){if(DI<oI){let FI;DI<NI?FI=0:FI=(NI-DI)/(NI-oI),z=KI-(KI-yI)*FI,O=D-(D-V)*FI,sI=G-(G-n)*FI,v=c-(c-g)*FI}else{let FI;DI>Q?FI=1:oI===Q?FI=0:FI=(oI-DI)/(oI-Q),z=yI-(yI-U)*FI,O=V-(V-d)*FI,sI=n-(n-i)*FI,v=g-(g-o)*FI}let HI;DI<NI?HI=0:DI>Q?HI=1:HI=(NI-DI)/(NI-Q),II=KI-(KI-U)*HI,MI=D-(D-d)*HI,XI=G-(G-i)*HI,uI=c-(c-o)*HI;const SI=Math.round(Math.min(z,II)),pI=Math.round(Math.max(z,II));let eI=q*DI+SI*4;for(let FI=SI;FI<=pI;FI++)HI=(z-FI)/(z-II),HI<0?HI=0:HI>1&&(HI=1),r[eI++]=O-(O-MI)*HI|0,r[eI++]=sI-(sI-XI)*HI|0,r[eI++]=v-(v-uI)*HI|0,r[eI++]=255}}function I(N,Y,k){const j=Y.coords,p=Y.colors;let b,B;switch(Y.type){case"lattice":const u=Y.verticesPerRow,T=Math.floor(j.length/u)-1,J=u-1;for(b=0;b<T;b++){let r=b*u;for(let q=0;q<J;q++,r++)A(N,k,j[r],j[r+1],j[r+u],p[r],p[r+1],p[r+u]),A(N,k,j[r+u+1],j[r+1],j[r+u],p[r+u+1],p[r+1],p[r+u])}break;case"triangles":for(b=0,B=j.length;b<B;b+=3)A(N,k,j[b],j[b+1],j[b+2],p[b],p[b+1],p[b+2]);break;default:throw new Error("illegal figure")}}class m extends L{constructor(Y){super(),this._coords=Y[2],this._colors=Y[3],this._figures=Y[4],this._bounds=Y[5],this._bbox=Y[7],this._background=Y[8],this.matrix=null}_createMeshCanvas(Y,k,j){const u=Math.floor(this._bounds[0]),T=Math.floor(this._bounds[1]),J=Math.ceil(this._bounds[2])-u,r=Math.ceil(this._bounds[3])-T,q=Math.min(Math.ceil(Math.abs(J*Y[0]*1.1)),3e3),hI=Math.min(Math.ceil(Math.abs(r*Y[1]*1.1)),3e3),KI=J/q,NI=r/hI,yI={coords:this._coords,colors:this._colors,offsetX:-u,offsetY:-T,scaleX:1/KI,scaleY:1/NI},oI=q+2*2,U=hI+2*2,Q=j.getCanvas("mesh",oI,U,!1),D=Q.context,G=D.createImageData(q,hI);if(k){const V=G.data;for(let n=0,g=V.length;n<g;n+=4)V[n]=k[0],V[n+1]=k[1],V[n+2]=k[2],V[n+3]=255}for(const V of this._figures)I(G,V,yI);return D.putImageData(G,2,2),{canvas:Q.canvas,offsetX:u-2*KI,offsetY:T-2*NI,scaleX:KI,scaleY:NI}}getPattern(Y,k,j,p){M(Y,this._bbox);let b;if(p===S.SHADING)b=l.Util.singularValueDecompose2dScale((0,s.getCurrentTransform)(Y));else if(b=l.Util.singularValueDecompose2dScale(k.baseTransform),this.matrix){const u=l.Util.singularValueDecompose2dScale(this.matrix);b=[b[0]*u[0],b[1]*u[1]]}const B=this._createMeshCanvas(b,p===S.SHADING?null:this._background,k.cachedCanvases);return p!==S.SHADING&&(Y.setTransform(...k.baseTransform),this.matrix&&Y.transform(...this.matrix)),Y.translate(B.offsetX,B.offsetY),Y.scale(B.scaleX,B.scaleY),Y.createPattern(B.canvas,"no-repeat")}}class W extends L{getPattern(){return"hotpink"}}function Z(N){switch(N[0]){case"RadialAxial":return new X(N);case"Mesh":return new m(N);case"Dummy":return new W}throw new Error(`Unknown IR type: ${N[0]}`)}const w={COLORED:1,UNCOLORED:2};class y{static MAX_PATTERN_SIZE=3e3;constructor(Y,k,j,p,b){this.operatorList=Y[2],this.matrix=Y[3]||[1,0,0,1,0,0],this.bbox=Y[4],this.xstep=Y[5],this.ystep=Y[6],this.paintType=Y[7],this.tilingType=Y[8],this.color=k,this.ctx=j,this.canvasGraphicsFactory=p,this.baseTransform=b}createPatternCanvas(Y){const k=this.operatorList,j=this.bbox,p=this.xstep,b=this.ystep,B=this.paintType,u=this.tilingType,T=this.color,J=this.canvasGraphicsFactory;(0,l.info)("TilingType: "+u);const r=j[0],q=j[1],hI=j[2],KI=j[3],NI=l.Util.singularValueDecompose2dScale(this.matrix),yI=l.Util.singularValueDecompose2dScale(this.baseTransform),oI=[NI[0]*yI[0],NI[1]*yI[1]],U=this.getSizeAndScale(p,this.ctx.canvas.width,oI[0]),Q=this.getSizeAndScale(b,this.ctx.canvas.height,oI[1]),D=Y.cachedCanvases.getCanvas("pattern",U.size,Q.size,!0),G=D.context,c=J.createCanvasGraphics(G);c.groupLevel=Y.groupLevel,this.setFillAndStrokeStyleToContext(c,B,T);let V=r,n=q,g=hI,d=KI;return r<0&&(V=0,g+=Math.abs(r)),q<0&&(n=0,d+=Math.abs(q)),G.translate(-(U.scale*V),-(Q.scale*n)),c.transform(U.scale,0,0,Q.scale,0,0),G.save(),this.clipBbox(c,V,n,g,d),c.baseTransform=(0,s.getCurrentTransform)(c.ctx),c.executeOperatorList(k),c.endDrawing(),{canvas:D.canvas,scaleX:U.scale,scaleY:Q.scale,offsetX:V,offsetY:n}}getSizeAndScale(Y,k,j){Y=Math.abs(Y);const p=Math.max(y.MAX_PATTERN_SIZE,k);let b=Math.ceil(Y*j);return b>=p?b=p:j=b/Y,{scale:j,size:b}}clipBbox(Y,k,j,p,b){const B=p-k,u=b-j;Y.ctx.rect(k,j,B,u),Y.current.updateRectMinMax((0,s.getCurrentTransform)(Y.ctx),[k,j,p,b]),Y.clip(),Y.endPath()}setFillAndStrokeStyleToContext(Y,k,j){const p=Y.ctx,b=Y.current;switch(k){case w.COLORED:const B=this.ctx;p.fillStyle=B.fillStyle,p.strokeStyle=B.strokeStyle,b.fillColor=B.fillStyle,b.strokeColor=B.strokeStyle;break;case w.UNCOLORED:const u=l.Util.makeHexColor(j[0],j[1],j[2]);p.fillStyle=u,p.strokeStyle=u,b.fillColor=u,b.strokeColor=u;break;default:throw new l.FormatError(`Unsupported paint type: ${k}`)}}getPattern(Y,k,j,p){let b=j;p!==S.SHADING&&(b=l.Util.transform(b,k.baseTransform),this.matrix&&(b=l.Util.transform(b,this.matrix)));const B=this.createPatternCanvas(k);let u=new DOMMatrix(b);u=u.translate(B.offsetX,B.offsetY),u=u.scale(1/B.scaleX,1/B.scaleY);const T=Y.createPattern(B.canvas,"repeat");return T.setTransform(u),T}}C.TilingPattern=y},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.convertBlackAndWhiteToRGBA=S,C.convertToRGBA=s,C.grayToRGBA=L;var l=a(1);function s(X){switch(X.kind){case l.ImageKind.GRAYSCALE_1BPP:return S(X);case l.ImageKind.RGB_24BPP:return M(X)}return null}function S({src:X,srcPos:A=0,dest:I,width:m,height:W,nonBlackColor:Z=4294967295,inverseDecode:w=!1}){const y=l.FeatureTest.isLittleEndian?4278190080:255,[N,Y]=w?[Z,y]:[y,Z],k=m>>3,j=m&7,p=X.length;I=new Uint32Array(I.buffer);let b=0;for(let B=0;B<W;B++){for(const T=A+k;A<T;A++){const J=A<p?X[A]:255;I[b++]=J&128?Y:N,I[b++]=J&64?Y:N,I[b++]=J&32?Y:N,I[b++]=J&16?Y:N,I[b++]=J&8?Y:N,I[b++]=J&4?Y:N,I[b++]=J&2?Y:N,I[b++]=J&1?Y:N}if(j===0)continue;const u=A<p?X[A++]:255;for(let T=0;T<j;T++)I[b++]=u&1<<7-T?Y:N}return{srcPos:A,destPos:b}}function M({src:X,srcPos:A=0,dest:I,destPos:m=0,width:W,height:Z}){let w=0;const y=X.length>>2,N=new Uint32Array(X.buffer,A,y);if(l.FeatureTest.isLittleEndian){for(;w<y-2;w+=3,m+=4){const Y=N[w],k=N[w+1],j=N[w+2];I[m]=Y|4278190080,I[m+1]=Y>>>24|k<<8|4278190080,I[m+2]=k>>>16|j<<16|4278190080,I[m+3]=j>>>8|4278190080}for(let Y=w*4,k=X.length;Y<k;Y+=3)I[m++]=X[Y]|X[Y+1]<<8|X[Y+2]<<16|4278190080}else{for(;w<y-2;w+=3,m+=4){const Y=N[w],k=N[w+1],j=N[w+2];I[m]=Y|255,I[m+1]=Y<<24|k>>>8|255,I[m+2]=k<<16|j>>>16|255,I[m+3]=j<<8|255}for(let Y=w*4,k=X.length;Y<k;Y+=3)I[m++]=X[Y]<<24|X[Y+1]<<16|X[Y+2]<<8|255}return{srcPos:A,destPos:m}}function L(X,A){if(l.FeatureTest.isLittleEndian)for(let I=0,m=X.length;I<m;I++)A[I]=X[I]*65793|4278190080;else for(let I=0,m=X.length;I<m;I++)A[I]=X[I]*16843008|255}},(F,C)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.GlobalWorkerOptions=void 0;const a=Object.create(null);C.GlobalWorkerOptions=a,a.workerPort=null,a.workerSrc=""},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.MessageHandler=void 0;var l=a(1);const s={UNKNOWN:0,DATA:1,ERROR:2},S={UNKNOWN:0,CANCEL:1,CANCEL_COMPLETE:2,CLOSE:3,ENQUEUE:4,ERROR:5,PULL:6,PULL_COMPLETE:7,START_COMPLETE:8};function M(X){switch(X instanceof Error||typeof X=="object"&&X!==null||(0,l.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.'),X.name){case"AbortException":return new l.AbortException(X.message);case"MissingPDFException":return new l.MissingPDFException(X.message);case"PasswordException":return new l.PasswordException(X.message,X.code);case"UnexpectedResponseException":return new l.UnexpectedResponseException(X.message,X.status);case"UnknownErrorException":return new l.UnknownErrorException(X.message,X.details);default:return new l.UnknownErrorException(X.message,X.toString())}}class L{constructor(A,I,m){this.sourceName=A,this.targetName=I,this.comObj=m,this.callbackId=1,this.streamId=1,this.streamSinks=Object.create(null),this.streamControllers=Object.create(null),this.callbackCapabilities=Object.create(null),this.actionHandler=Object.create(null),this._onComObjOnMessage=W=>{const Z=W.data;if(Z.targetName!==this.sourceName)return;if(Z.stream){this.#g(Z);return}if(Z.callback){const y=Z.callbackId,N=this.callbackCapabilities[y];if(!N)throw new Error(`Cannot resolve callback ${y}`);if(delete this.callbackCapabilities[y],Z.callback===s.DATA)N.resolve(Z.data);else if(Z.callback===s.ERROR)N.reject(M(Z.reason));else throw new Error("Unexpected callback case");return}const w=this.actionHandler[Z.action];if(!w)throw new Error(`Unknown action from worker: ${Z.action}`);if(Z.callbackId){const y=this.sourceName,N=Z.sourceName;new Promise(function(Y){Y(w(Z.data))}).then(function(Y){m.postMessage({sourceName:y,targetName:N,callback:s.DATA,callbackId:Z.callbackId,data:Y})},function(Y){m.postMessage({sourceName:y,targetName:N,callback:s.ERROR,callbackId:Z.callbackId,reason:M(Y)})});return}if(Z.streamId){this.#I(Z);return}w(Z.data)},m.addEventListener("message",this._onComObjOnMessage)}on(A,I){const m=this.actionHandler;if(m[A])throw new Error(`There is already an actionName called "${A}"`);m[A]=I}send(A,I,m){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:A,data:I},m)}sendWithPromise(A,I,m){const W=this.callbackId++,Z=new l.PromiseCapability;this.callbackCapabilities[W]=Z;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:A,callbackId:W,data:I},m)}catch(w){Z.reject(w)}return Z.promise}sendWithStream(A,I,m,W){const Z=this.streamId++,w=this.sourceName,y=this.targetName,N=this.comObj;return new ReadableStream({start:Y=>{const k=new l.PromiseCapability;return this.streamControllers[Z]={controller:Y,startCall:k,pullCall:null,cancelCall:null,isClosed:!1},N.postMessage({sourceName:w,targetName:y,action:A,streamId:Z,data:I,desiredSize:Y.desiredSize},W),k.promise},pull:Y=>{const k=new l.PromiseCapability;return this.streamControllers[Z].pullCall=k,N.postMessage({sourceName:w,targetName:y,stream:S.PULL,streamId:Z,desiredSize:Y.desiredSize}),k.promise},cancel:Y=>{(0,l.assert)(Y instanceof Error,"cancel must have a valid reason");const k=new l.PromiseCapability;return this.streamControllers[Z].cancelCall=k,this.streamControllers[Z].isClosed=!0,N.postMessage({sourceName:w,targetName:y,stream:S.CANCEL,streamId:Z,reason:M(Y)}),k.promise}},m)}#I(A){const I=A.streamId,m=this.sourceName,W=A.sourceName,Z=this.comObj,w=this,y=this.actionHandler[A.action],N={enqueue(Y,k=1,j){if(this.isCancelled)return;const p=this.desiredSize;this.desiredSize-=k,p>0&&this.desiredSize<=0&&(this.sinkCapability=new l.PromiseCapability,this.ready=this.sinkCapability.promise),Z.postMessage({sourceName:m,targetName:W,stream:S.ENQUEUE,streamId:I,chunk:Y},j)},close(){this.isCancelled||(this.isCancelled=!0,Z.postMessage({sourceName:m,targetName:W,stream:S.CLOSE,streamId:I}),delete w.streamSinks[I])},error(Y){(0,l.assert)(Y instanceof Error,"error must have a valid reason"),!this.isCancelled&&(this.isCancelled=!0,Z.postMessage({sourceName:m,targetName:W,stream:S.ERROR,streamId:I,reason:M(Y)}))},sinkCapability:new l.PromiseCapability,onPull:null,onCancel:null,isCancelled:!1,desiredSize:A.desiredSize,ready:null};N.sinkCapability.resolve(),N.ready=N.sinkCapability.promise,this.streamSinks[I]=N,new Promise(function(Y){Y(y(A.data,N))}).then(function(){Z.postMessage({sourceName:m,targetName:W,stream:S.START_COMPLETE,streamId:I,success:!0})},function(Y){Z.postMessage({sourceName:m,targetName:W,stream:S.START_COMPLETE,streamId:I,reason:M(Y)})})}#g(A){const I=A.streamId,m=this.sourceName,W=A.sourceName,Z=this.comObj,w=this.streamControllers[I],y=this.streamSinks[I];switch(A.stream){case S.START_COMPLETE:A.success?w.startCall.resolve():w.startCall.reject(M(A.reason));break;case S.PULL_COMPLETE:A.success?w.pullCall.resolve():w.pullCall.reject(M(A.reason));break;case S.PULL:if(!y){Z.postMessage({sourceName:m,targetName:W,stream:S.PULL_COMPLETE,streamId:I,success:!0});break}y.desiredSize<=0&&A.desiredSize>0&&y.sinkCapability.resolve(),y.desiredSize=A.desiredSize,new Promise(function(N){N(y.onPull?.())}).then(function(){Z.postMessage({sourceName:m,targetName:W,stream:S.PULL_COMPLETE,streamId:I,success:!0})},function(N){Z.postMessage({sourceName:m,targetName:W,stream:S.PULL_COMPLETE,streamId:I,reason:M(N)})});break;case S.ENQUEUE:if((0,l.assert)(w,"enqueue should have stream controller"),w.isClosed)break;w.controller.enqueue(A.chunk);break;case S.CLOSE:if((0,l.assert)(w,"close should have stream controller"),w.isClosed)break;w.isClosed=!0,w.controller.close(),this.#A(w,I);break;case S.ERROR:(0,l.assert)(w,"error should have stream controller"),w.controller.error(M(A.reason)),this.#A(w,I);break;case S.CANCEL_COMPLETE:A.success?w.cancelCall.resolve():w.cancelCall.reject(M(A.reason)),this.#A(w,I);break;case S.CANCEL:if(!y)break;new Promise(function(N){N(y.onCancel?.(M(A.reason)))}).then(function(){Z.postMessage({sourceName:m,targetName:W,stream:S.CANCEL_COMPLETE,streamId:I,success:!0})},function(N){Z.postMessage({sourceName:m,targetName:W,stream:S.CANCEL_COMPLETE,streamId:I,reason:M(N)})}),y.sinkCapability.reject(M(A.reason)),y.isCancelled=!0,delete this.streamSinks[I];break;default:throw new Error("Unexpected stream case")}}async#A(A,I){await Promise.allSettled([A.startCall?.promise,A.pullCall?.promise,A.cancelCall?.promise]),delete this.streamControllers[I]}destroy(){this.comObj.removeEventListener("message",this._onComObjOnMessage)}}C.MessageHandler=L},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.Metadata=void 0;var l=a(1);class s{#I;#g;constructor({parsedData:M,rawData:L}){this.#I=M,this.#g=L}getRaw(){return this.#g}get(M){return this.#I.get(M)??null}getAll(){return(0,l.objectFromMap)(this.#I)}has(M){return this.#I.has(M)}}C.Metadata=s},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.OptionalContentConfig=void 0;var l=a(1),s=a(8);const S=Symbol("INTERNAL");class M{#I=!0;constructor(A,I){this.name=A,this.intent=I}get visible(){return this.#I}_setVisible(A,I){A!==S&&(0,l.unreachable)("Internal method `_setVisible` called."),this.#I=I}}class L{#I=null;#g=new Map;#A=null;#C=null;constructor(A){if(this.name=null,this.creator=null,A!==null){this.name=A.name,this.creator=A.creator,this.#C=A.order;for(const I of A.groups)this.#g.set(I.id,new M(I.name,I.intent));if(A.baseState==="OFF")for(const I of this.#g.values())I._setVisible(S,!1);for(const I of A.on)this.#g.get(I)._setVisible(S,!0);for(const I of A.off)this.#g.get(I)._setVisible(S,!1);this.#A=this.getHash()}}#l(A){const I=A.length;if(I<2)return!0;const m=A[0];for(let W=1;W<I;W++){const Z=A[W];let w;if(Array.isArray(Z))w=this.#l(Z);else if(this.#g.has(Z))w=this.#g.get(Z).visible;else return(0,l.warn)(`Optional content group not found: ${Z}`),!0;switch(m){case"And":if(!w)return!1;break;case"Or":if(w)return!0;break;case"Not":return!w;default:return!0}}return m==="And"}isVisible(A){if(this.#g.size===0)return!0;if(!A)return(0,l.warn)("Optional content group not defined."),!0;if(A.type==="OCG")return this.#g.has(A.id)?this.#g.get(A.id).visible:((0,l.warn)(`Optional content group not found: ${A.id}`),!0);if(A.type==="OCMD"){if(A.expression)return this.#l(A.expression);if(!A.policy||A.policy==="AnyOn"){for(const I of A.ids){if(!this.#g.has(I))return(0,l.warn)(`Optional content group not found: ${I}`),!0;if(this.#g.get(I).visible)return!0}return!1}else if(A.policy==="AllOn"){for(const I of A.ids){if(!this.#g.has(I))return(0,l.warn)(`Optional content group not found: ${I}`),!0;if(!this.#g.get(I).visible)return!1}return!0}else if(A.policy==="AnyOff"){for(const I of A.ids){if(!this.#g.has(I))return(0,l.warn)(`Optional content group not found: ${I}`),!0;if(!this.#g.get(I).visible)return!0}return!1}else if(A.policy==="AllOff"){for(const I of A.ids){if(!this.#g.has(I))return(0,l.warn)(`Optional content group not found: ${I}`),!0;if(this.#g.get(I).visible)return!1}return!0}return(0,l.warn)(`Unknown optional content policy ${A.policy}.`),!0}return(0,l.warn)(`Unknown group type ${A.type}.`),!0}setVisibility(A,I=!0){if(!this.#g.has(A)){(0,l.warn)(`Optional content group not found: ${A}`);return}this.#g.get(A)._setVisible(S,!!I),this.#I=null}get hasInitialVisibility(){return this.getHash()===this.#A}getOrder(){return this.#g.size?this.#C?this.#C.slice():[...this.#g.keys()]:null}getGroups(){return this.#g.size>0?(0,l.objectFromMap)(this.#g):null}getGroup(A){return this.#g.get(A)||null}getHash(){if(this.#I!==null)return this.#I;const A=new s.MurmurHash3_64;for(const[I,m]of this.#g)A.update(`${I}:${m.visible}`);return this.#I=A.hexdigest()}}C.OptionalContentConfig=L},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.PDFDataTransportStream=void 0;var l=a(1),s=a(6);class S{constructor({length:A,initialData:I,progressiveDone:m=!1,contentDispositionFilename:W=null,disableRange:Z=!1,disableStream:w=!1},y){if((0,l.assert)(y,'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'),this._queuedChunks=[],this._progressiveDone=m,this._contentDispositionFilename=W,I?.length>0){const N=I instanceof Uint8Array&&I.byteLength===I.buffer.byteLength?I.buffer:new Uint8Array(I).buffer;this._queuedChunks.push(N)}this._pdfDataRangeTransport=y,this._isStreamingSupported=!w,this._isRangeSupported=!Z,this._contentLength=A,this._fullRequestReader=null,this._rangeReaders=[],this._pdfDataRangeTransport.addRangeListener((N,Y)=>{this._onReceiveData({begin:N,chunk:Y})}),this._pdfDataRangeTransport.addProgressListener((N,Y)=>{this._onProgress({loaded:N,total:Y})}),this._pdfDataRangeTransport.addProgressiveReadListener(N=>{this._onReceiveData({chunk:N})}),this._pdfDataRangeTransport.addProgressiveDoneListener(()=>{this._onProgressiveDone()}),this._pdfDataRangeTransport.transportReady()}_onReceiveData({begin:A,chunk:I}){const m=I instanceof Uint8Array&&I.byteLength===I.buffer.byteLength?I.buffer:new Uint8Array(I).buffer;if(A===void 0)this._fullRequestReader?this._fullRequestReader._enqueue(m):this._queuedChunks.push(m);else{const W=this._rangeReaders.some(function(Z){return Z._begin!==A?!1:(Z._enqueue(m),!0)});(0,l.assert)(W,"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.")}}get _progressiveDataLength(){return this._fullRequestReader?._loaded??0}_onProgress(A){A.total===void 0?this._rangeReaders[0]?.onProgress?.({loaded:A.loaded}):this._fullRequestReader?.onProgress?.({loaded:A.loaded,total:A.total})}_onProgressiveDone(){this._fullRequestReader?.progressiveDone(),this._progressiveDone=!0}_removeRangeReader(A){const I=this._rangeReaders.indexOf(A);I>=0&&this._rangeReaders.splice(I,1)}getFullReader(){(0,l.assert)(!this._fullRequestReader,"PDFDataTransportStream.getFullReader can only be called once.");const A=this._queuedChunks;return this._queuedChunks=null,new M(this,A,this._progressiveDone,this._contentDispositionFilename)}getRangeReader(A,I){if(I<=this._progressiveDataLength)return null;const m=new L(this,A,I);return this._pdfDataRangeTransport.requestDataRange(A,I),this._rangeReaders.push(m),m}cancelAllRequests(A){this._fullRequestReader?.cancel(A);for(const I of this._rangeReaders.slice(0))I.cancel(A);this._pdfDataRangeTransport.abort()}}C.PDFDataTransportStream=S;class M{constructor(A,I,m=!1,W=null){this._stream=A,this._done=m||!1,this._filename=(0,s.isPdfFile)(W)?W:null,this._queuedChunks=I||[],this._loaded=0;for(const Z of this._queuedChunks)this._loaded+=Z.byteLength;this._requests=[],this._headersReady=Promise.resolve(),A._fullRequestReader=this,this.onProgress=null}_enqueue(A){this._done||(this._requests.length>0?this._requests.shift().resolve({value:A,done:!1}):this._queuedChunks.push(A),this._loaded+=A.byteLength)}get headersReady(){return this._headersReady}get filename(){return this._filename}get isRangeSupported(){return this._stream._isRangeSupported}get isStreamingSupported(){return this._stream._isStreamingSupported}get contentLength(){return this._stream._contentLength}async read(){if(this._queuedChunks.length>0)return{value:this._queuedChunks.shift(),done:!1};if(this._done)return{value:void 0,done:!0};const A=new l.PromiseCapability;return this._requests.push(A),A.promise}cancel(A){this._done=!0;for(const I of this._requests)I.resolve({value:void 0,done:!0});this._requests.length=0}progressiveDone(){this._done||(this._done=!0)}}class L{constructor(A,I,m){this._stream=A,this._begin=I,this._end=m,this._queuedChunk=null,this._requests=[],this._done=!1,this.onProgress=null}_enqueue(A){if(!this._done){if(this._requests.length===0)this._queuedChunk=A;else{this._requests.shift().resolve({value:A,done:!1});for(const m of this._requests)m.resolve({value:void 0,done:!0});this._requests.length=0}this._done=!0,this._stream._removeRangeReader(this)}}get isStreamingSupported(){return!1}async read(){if(this._queuedChunk){const I=this._queuedChunk;return this._queuedChunk=null,{value:I,done:!1}}if(this._done)return{value:void 0,done:!0};const A=new l.PromiseCapability;return this._requests.push(A),A.promise}cancel(A){this._done=!0;for(const I of this._requests)I.resolve({value:void 0,done:!0});this._requests.length=0,this._stream._removeRangeReader(this)}}},(F,C)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.XfaText=void 0;class a{static textContent(s){const S=[],M={items:S,styles:Object.create(null)};function L(X){if(!X)return;let A=null;const I=X.name;if(I==="#text")A=X.value;else if(a.shouldBuildText(I))X?.attributes?.textContent?A=X.attributes.textContent:X.value&&(A=X.value);else return;if(A!==null&&S.push({str:A}),!!X.children)for(const m of X.children)L(m)}return L(s),M}static shouldBuildText(s){return!(s==="textarea"||s==="input"||s==="option"||s==="select")}}C.XfaText=a},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.NodeStandardFontDataFactory=C.NodeFilterFactory=C.NodeCanvasFactory=C.NodeCMapReaderFactory=void 0;var l=a(7);const s=function(A){return new Promise((I,m)=>{require$$5.readFile(A,(Z,w)=>{if(Z||!w){m(new Error(Z));return}I(new Uint8Array(w))})})};class S extends l.BaseFilterFactory{}C.NodeFilterFactory=S;class M extends l.BaseCanvasFactory{_createCanvas(I,m){return require$$5.createCanvas(I,m)}}C.NodeCanvasFactory=M;class L extends l.BaseCMapReaderFactory{_fetchData(I,m){return s(I).then(W=>({cMapData:W,compressionType:m}))}}C.NodeCMapReaderFactory=L;class X extends l.BaseStandardFontDataFactory{_fetchData(I){return s(I)}}C.NodeStandardFontDataFactory=X},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.PDFNodeStream=void 0;var l=a(1),s=a(22);const S=require$$5,M=require$$5,L=require$$5,X=require$$5,A=/^file:\/\/\/[a-zA-Z]:\//;function I(j){const p=X.parse(j);return p.protocol==="file:"||p.host?p:/^[a-z]:[/\\]/i.test(j)?X.parse(`file:///${j}`):(p.host||(p.protocol="file:"),p)}class m{constructor(p){this.source=p,this.url=I(p.url),this.isHttp=this.url.protocol==="http:"||this.url.protocol==="https:",this.isFsUrl=this.url.protocol==="file:",this.httpHeaders=this.isHttp&&p.httpHeaders||{},this._fullRequestReader=null,this._rangeRequestReaders=[]}get _progressiveDataLength(){return this._fullRequestReader?._loaded??0}getFullReader(){return(0,l.assert)(!this._fullRequestReader,"PDFNodeStream.getFullReader can only be called once."),this._fullRequestReader=this.isFsUrl?new Y(this):new y(this),this._fullRequestReader}getRangeReader(p,b){if(b<=this._progressiveDataLength)return null;const B=this.isFsUrl?new k(this,p,b):new N(this,p,b);return this._rangeRequestReaders.push(B),B}cancelAllRequests(p){this._fullRequestReader?.cancel(p);for(const b of this._rangeRequestReaders.slice(0))b.cancel(p)}}C.PDFNodeStream=m;class W{constructor(p){this._url=p.url,this._done=!1,this._storedError=null,this.onProgress=null;const b=p.source;this._contentLength=b.length,this._loaded=0,this._filename=null,this._disableRange=b.disableRange||!1,this._rangeChunkSize=b.rangeChunkSize,!this._rangeChunkSize&&!this._disableRange&&(this._disableRange=!0),this._isStreamingSupported=!b.disableStream,this._isRangeSupported=!b.disableRange,this._readableStream=null,this._readCapability=new l.PromiseCapability,this._headersCapability=new l.PromiseCapability}get headersReady(){return this._headersCapability.promise}get filename(){return this._filename}get contentLength(){return this._contentLength}get isRangeSupported(){return this._isRangeSupported}get isStreamingSupported(){return this._isStreamingSupported}async read(){if(await this._readCapability.promise,this._done)return{value:void 0,done:!0};if(this._storedError)throw this._storedError;const p=this._readableStream.read();return p===null?(this._readCapability=new l.PromiseCapability,this.read()):(this._loaded+=p.length,this.onProgress?.({loaded:this._loaded,total:this._contentLength}),{value:new Uint8Array(p).buffer,done:!1})}cancel(p){if(!this._readableStream){this._error(p);return}this._readableStream.destroy(p)}_error(p){this._storedError=p,this._readCapability.resolve()}_setReadableStream(p){this._readableStream=p,p.on("readable",()=>{this._readCapability.resolve()}),p.on("end",()=>{p.destroy(),this._done=!0,this._readCapability.resolve()}),p.on("error",b=>{this._error(b)}),!this._isStreamingSupported&&this._isRangeSupported&&this._error(new l.AbortException("streaming is disabled")),this._storedError&&this._readableStream.destroy(this._storedError)}}class Z{constructor(p){this._url=p.url,this._done=!1,this._storedError=null,this.onProgress=null,this._loaded=0,this._readableStream=null,this._readCapability=new l.PromiseCapability;const b=p.source;this._isStreamingSupported=!b.disableStream}get isStreamingSupported(){return this._isStreamingSupported}async read(){if(await this._readCapability.promise,this._done)return{value:void 0,done:!0};if(this._storedError)throw this._storedError;const p=this._readableStream.read();return p===null?(this._readCapability=new l.PromiseCapability,this.read()):(this._loaded+=p.length,this.onProgress?.({loaded:this._loaded}),{value:new Uint8Array(p).buffer,done:!1})}cancel(p){if(!this._readableStream){this._error(p);return}this._readableStream.destroy(p)}_error(p){this._storedError=p,this._readCapability.resolve()}_setReadableStream(p){this._readableStream=p,p.on("readable",()=>{this._readCapability.resolve()}),p.on("end",()=>{p.destroy(),this._done=!0,this._readCapability.resolve()}),p.on("error",b=>{this._error(b)}),this._storedError&&this._readableStream.destroy(this._storedError)}}function w(j,p){return{protocol:j.protocol,auth:j.auth,host:j.hostname,port:j.port,path:j.path,method:"GET",headers:p}}class y extends W{constructor(p){super(p);const b=B=>{if(B.statusCode===404){const r=new l.MissingPDFException(`Missing PDF "${this._url}".`);this._storedError=r,this._headersCapability.reject(r);return}this._headersCapability.resolve(),this._setReadableStream(B);const u=r=>this._readableStream.headers[r.toLowerCase()],{allowRangeRequests:T,suggestedLength:J}=(0,s.validateRangeRequestCapabilities)({getResponseHeader:u,isHttp:p.isHttp,rangeChunkSize:this._rangeChunkSize,disableRange:this._disableRange});this._isRangeSupported=T,this._contentLength=J||this._contentLength,this._filename=(0,s.extractFilenameFromHeader)(u)};this._request=null,this._url.protocol==="http:"?this._request=M.request(w(this._url,p.httpHeaders),b):this._request=L.request(w(this._url,p.httpHeaders),b),this._request.on("error",B=>{this._storedError=B,this._headersCapability.reject(B)}),this._request.end()}}class N extends Z{constructor(p,b,B){super(p),this._httpHeaders={};for(const T in p.httpHeaders){const J=p.httpHeaders[T];J!==void 0&&(this._httpHeaders[T]=J)}this._httpHeaders.Range=`bytes=${b}-${B-1}`;const u=T=>{if(T.statusCode===404){const J=new l.MissingPDFException(`Missing PDF "${this._url}".`);this._storedError=J;return}this._setReadableStream(T)};this._request=null,this._url.protocol==="http:"?this._request=M.request(w(this._url,this._httpHeaders),u):this._request=L.request(w(this._url,this._httpHeaders),u),this._request.on("error",T=>{this._storedError=T}),this._request.end()}}class Y extends W{constructor(p){super(p);let b=decodeURIComponent(this._url.path);A.test(this._url.href)&&(b=b.replace(/^\//,"")),S.lstat(b,(B,u)=>{if(B){B.code==="ENOENT"&&(B=new l.MissingPDFException(`Missing PDF "${b}".`)),this._storedError=B,this._headersCapability.reject(B);return}this._contentLength=u.size,this._setReadableStream(S.createReadStream(b)),this._headersCapability.resolve()})}}class k extends Z{constructor(p,b,B){super(p);let u=decodeURIComponent(this._url.path);A.test(this._url.href)&&(u=u.replace(/^\//,"")),this._setReadableStream(S.createReadStream(u,{start:b,end:B-1}))}}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.createResponseStatusError=X,C.extractFilenameFromHeader=L,C.validateRangeRequestCapabilities=M,C.validateResponseStatus=A;var l=a(1),s=a(23),S=a(6);function M({getResponseHeader:I,isHttp:m,rangeChunkSize:W,disableRange:Z}){const w={allowRangeRequests:!1,suggestedLength:void 0},y=parseInt(I("Content-Length"),10);return!Number.isInteger(y)||(w.suggestedLength=y,y<=2*W)||Z||!m||I("Accept-Ranges")!=="bytes"||(I("Content-Encoding")||"identity")!=="identity"||(w.allowRangeRequests=!0),w}function L(I){const m=I("Content-Disposition");if(m){let W=(0,s.getFilenameFromContentDispositionHeader)(m);if(W.includes("%"))try{W=decodeURIComponent(W)}catch{}if((0,S.isPdfFile)(W))return W}return null}function X(I,m){return I===404||I===0&&m.startsWith("file:")?new l.MissingPDFException('Missing PDF "'+m+'".'):new l.UnexpectedResponseException(`Unexpected server response (${I}) while retrieving PDF "${m}".`,I)}function A(I){return I===200||I===206}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.getFilenameFromContentDispositionHeader=s;var l=a(1);function s(S){let M=!0,L=X("filename\\*","i").exec(S);if(L){L=L[1];let y=W(L);return y=unescape(y),y=Z(y),y=w(y),I(y)}if(L=m(S),L){const y=w(L);return I(y)}if(L=X("filename","i").exec(S),L){L=L[1];let y=W(L);return y=w(y),I(y)}function X(y,N){return new RegExp("(?:^|;)\\s*"+y+'\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)',N)}function A(y,N){if(y){if(!/^[\x00-\xFF]+$/.test(N))return N;try{const Y=new TextDecoder(y,{fatal:!0}),k=(0,l.stringToBytes)(N);N=Y.decode(k),M=!1}catch{}}return N}function I(y){return M&&/[\x80-\xff]/.test(y)&&(y=A("utf-8",y),M&&(y=A("iso-8859-1",y))),y}function m(y){const N=[];let Y;const k=X("filename\\*((?!0\\d)\\d+)(\\*?)","ig");for(;(Y=k.exec(y))!==null;){let[,p,b,B]=Y;if(p=parseInt(p,10),p in N){if(p===0)break;continue}N[p]=[b,B]}const j=[];for(let p=0;p<N.length&&p in N;++p){let[b,B]=N[p];B=W(B),b&&(B=unescape(B),p===0&&(B=Z(B))),j.push(B)}return j.join("")}function W(y){if(y.startsWith('"')){const N=y.slice(1).split('\\"');for(let Y=0;Y<N.length;++Y){const k=N[Y].indexOf('"');k!==-1&&(N[Y]=N[Y].slice(0,k),N.length=Y+1),N[Y]=N[Y].replaceAll(/\\(.)/g,"$1")}y=N.join('"')}return y}function Z(y){const N=y.indexOf("'");if(N===-1)return y;const Y=y.slice(0,N),j=y.slice(N+1).replace(/^[^']*'/,"");return A(Y,j)}function w(y){return!y.startsWith("=?")||/[\x00-\x19\x80-\xff]/.test(y)?y:y.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g,function(N,Y,k,j){if(k==="q"||k==="Q")return j=j.replaceAll("_"," "),j=j.replaceAll(/=([0-9a-fA-F]{2})/g,function(p,b){return String.fromCharCode(parseInt(b,16))}),A(Y,j);try{j=atob(j)}catch{}return A(Y,j)})}return""}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.PDFNetworkStream=void 0;var l=a(1),s=a(22);const S=200,M=206;function L(W){const Z=W.response;return typeof Z!="string"?Z:(0,l.stringToBytes)(Z).buffer}class X{constructor(Z,w={}){this.url=Z,this.isHttp=/^https?:/i.test(Z),this.httpHeaders=this.isHttp&&w.httpHeaders||Object.create(null),this.withCredentials=w.withCredentials||!1,this.currXhrId=0,this.pendingRequests=Object.create(null)}requestRange(Z,w,y){const N={begin:Z,end:w};for(const Y in y)N[Y]=y[Y];return this.request(N)}requestFull(Z){return this.request(Z)}request(Z){const w=new XMLHttpRequest,y=this.currXhrId++,N=this.pendingRequests[y]={xhr:w};w.open("GET",this.url),w.withCredentials=this.withCredentials;for(const Y in this.httpHeaders){const k=this.httpHeaders[Y];k!==void 0&&w.setRequestHeader(Y,k)}return this.isHttp&&"begin"in Z&&"end"in Z?(w.setRequestHeader("Range",`bytes=${Z.begin}-${Z.end-1}`),N.expectedStatus=M):N.expectedStatus=S,w.responseType="arraybuffer",Z.onError&&(w.onerror=function(Y){Z.onError(w.status)}),w.onreadystatechange=this.onStateChange.bind(this,y),w.onprogress=this.onProgress.bind(this,y),N.onHeadersReceived=Z.onHeadersReceived,N.onDone=Z.onDone,N.onError=Z.onError,N.onProgress=Z.onProgress,w.send(null),y}onProgress(Z,w){const y=this.pendingRequests[Z];y&&y.onProgress?.(w)}onStateChange(Z,w){const y=this.pendingRequests[Z];if(!y)return;const N=y.xhr;if(N.readyState>=2&&y.onHeadersReceived&&(y.onHeadersReceived(),delete y.onHeadersReceived),N.readyState!==4||!(Z in this.pendingRequests))return;if(delete this.pendingRequests[Z],N.status===0&&this.isHttp){y.onError?.(N.status);return}const Y=N.status||S;if(!(Y===S&&y.expectedStatus===M)&&Y!==y.expectedStatus){y.onError?.(N.status);return}const j=L(N);if(Y===M){const p=N.getResponseHeader("Content-Range"),b=/bytes (\d+)-(\d+)\/(\d+)/.exec(p);y.onDone({begin:parseInt(b[1],10),chunk:j})}else j?y.onDone({begin:0,chunk:j}):y.onError?.(N.status)}getRequestXhr(Z){return this.pendingRequests[Z].xhr}isPendingRequest(Z){return Z in this.pendingRequests}abortRequest(Z){const w=this.pendingRequests[Z].xhr;delete this.pendingRequests[Z],w.abort()}}class A{constructor(Z){this._source=Z,this._manager=new X(Z.url,{httpHeaders:Z.httpHeaders,withCredentials:Z.withCredentials}),this._rangeChunkSize=Z.rangeChunkSize,this._fullRequestReader=null,this._rangeRequestReaders=[]}_onRangeRequestReaderClosed(Z){const w=this._rangeRequestReaders.indexOf(Z);w>=0&&this._rangeRequestReaders.splice(w,1)}getFullReader(){return(0,l.assert)(!this._fullRequestReader,"PDFNetworkStream.getFullReader can only be called once."),this._fullRequestReader=new I(this._manager,this._source),this._fullRequestReader}getRangeReader(Z,w){const y=new m(this._manager,Z,w);return y.onClosed=this._onRangeRequestReaderClosed.bind(this),this._rangeRequestReaders.push(y),y}cancelAllRequests(Z){this._fullRequestReader?.cancel(Z);for(const w of this._rangeRequestReaders.slice(0))w.cancel(Z)}}C.PDFNetworkStream=A;class I{constructor(Z,w){this._manager=Z;const y={onHeadersReceived:this._onHeadersReceived.bind(this),onDone:this._onDone.bind(this),onError:this._onError.bind(this),onProgress:this._onProgress.bind(this)};this._url=w.url,this._fullRequestId=Z.requestFull(y),this._headersReceivedCapability=new l.PromiseCapability,this._disableRange=w.disableRange||!1,this._contentLength=w.length,this._rangeChunkSize=w.rangeChunkSize,!this._rangeChunkSize&&!this._disableRange&&(this._disableRange=!0),this._isStreamingSupported=!1,this._isRangeSupported=!1,this._cachedChunks=[],this._requests=[],this._done=!1,this._storedError=void 0,this._filename=null,this.onProgress=null}_onHeadersReceived(){const Z=this._fullRequestId,w=this._manager.getRequestXhr(Z),y=k=>w.getResponseHeader(k),{allowRangeRequests:N,suggestedLength:Y}=(0,s.validateRangeRequestCapabilities)({getResponseHeader:y,isHttp:this._manager.isHttp,rangeChunkSize:this._rangeChunkSize,disableRange:this._disableRange});N&&(this._isRangeSupported=!0),this._contentLength=Y||this._contentLength,this._filename=(0,s.extractFilenameFromHeader)(y),this._isRangeSupported&&this._manager.abortRequest(Z),this._headersReceivedCapability.resolve()}_onDone(Z){if(Z&&(this._requests.length>0?this._requests.shift().resolve({value:Z.chunk,done:!1}):this._cachedChunks.push(Z.chunk)),this._done=!0,!(this._cachedChunks.length>0)){for(const w of this._requests)w.resolve({value:void 0,done:!0});this._requests.length=0}}_onError(Z){this._storedError=(0,s.createResponseStatusError)(Z,this._url),this._headersReceivedCapability.reject(this._storedError);for(const w of this._requests)w.reject(this._storedError);this._requests.length=0,this._cachedChunks.length=0}_onProgress(Z){this.onProgress?.({loaded:Z.loaded,total:Z.lengthComputable?Z.total:this._contentLength})}get filename(){return this._filename}get isRangeSupported(){return this._isRangeSupported}get isStreamingSupported(){return this._isStreamingSupported}get contentLength(){return this._contentLength}get headersReady(){return this._headersReceivedCapability.promise}async read(){if(this._storedError)throw this._storedError;if(this._cachedChunks.length>0)return{value:this._cachedChunks.shift(),done:!1};if(this._done)return{value:void 0,done:!0};const Z=new l.PromiseCapability;return this._requests.push(Z),Z.promise}cancel(Z){this._done=!0,this._headersReceivedCapability.reject(Z);for(const w of this._requests)w.resolve({value:void 0,done:!0});this._requests.length=0,this._manager.isPendingRequest(this._fullRequestId)&&this._manager.abortRequest(this._fullRequestId),this._fullRequestReader=null}}class m{constructor(Z,w,y){this._manager=Z;const N={onDone:this._onDone.bind(this),onError:this._onError.bind(this),onProgress:this._onProgress.bind(this)};this._url=Z.url,this._requestId=Z.requestRange(w,y,N),this._requests=[],this._queuedChunk=null,this._done=!1,this._storedError=void 0,this.onProgress=null,this.onClosed=null}_close(){this.onClosed?.(this)}_onDone(Z){const w=Z.chunk;this._requests.length>0?this._requests.shift().resolve({value:w,done:!1}):this._queuedChunk=w,this._done=!0;for(const y of this._requests)y.resolve({value:void 0,done:!0});this._requests.length=0,this._close()}_onError(Z){this._storedError=(0,s.createResponseStatusError)(Z,this._url);for(const w of this._requests)w.reject(this._storedError);this._requests.length=0,this._queuedChunk=null}_onProgress(Z){this.isStreamingSupported||this.onProgress?.({loaded:Z.loaded})}get isStreamingSupported(){return!1}async read(){if(this._storedError)throw this._storedError;if(this._queuedChunk!==null){const w=this._queuedChunk;return this._queuedChunk=null,{value:w,done:!1}}if(this._done)return{value:void 0,done:!0};const Z=new l.PromiseCapability;return this._requests.push(Z),Z.promise}cancel(Z){this._done=!0;for(const w of this._requests)w.resolve({value:void 0,done:!0});this._requests.length=0,this._manager.isPendingRequest(this._requestId)&&this._manager.abortRequest(this._requestId),this._close()}}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.PDFFetchStream=void 0;var l=a(1),s=a(22);function S(m,W,Z){return{method:"GET",headers:m,signal:Z.signal,mode:"cors",credentials:W?"include":"same-origin",redirect:"follow"}}function M(m){const W=new Headers;for(const Z in m){const w=m[Z];w!==void 0&&W.append(Z,w)}return W}function L(m){return m instanceof Uint8Array?m.buffer:m instanceof ArrayBuffer?m:((0,l.warn)(`getArrayBuffer - unexpected data format: ${m}`),new Uint8Array(m).buffer)}class X{constructor(W){this.source=W,this.isHttp=/^https?:/i.test(W.url),this.httpHeaders=this.isHttp&&W.httpHeaders||{},this._fullRequestReader=null,this._rangeRequestReaders=[]}get _progressiveDataLength(){return this._fullRequestReader?._loaded??0}getFullReader(){return(0,l.assert)(!this._fullRequestReader,"PDFFetchStream.getFullReader can only be called once."),this._fullRequestReader=new A(this),this._fullRequestReader}getRangeReader(W,Z){if(Z<=this._progressiveDataLength)return null;const w=new I(this,W,Z);return this._rangeRequestReaders.push(w),w}cancelAllRequests(W){this._fullRequestReader?.cancel(W);for(const Z of this._rangeRequestReaders.slice(0))Z.cancel(W)}}C.PDFFetchStream=X;class A{constructor(W){this._stream=W,this._reader=null,this._loaded=0,this._filename=null;const Z=W.source;this._withCredentials=Z.withCredentials||!1,this._contentLength=Z.length,this._headersCapability=new l.PromiseCapability,this._disableRange=Z.disableRange||!1,this._rangeChunkSize=Z.rangeChunkSize,!this._rangeChunkSize&&!this._disableRange&&(this._disableRange=!0),this._abortController=new AbortController,this._isStreamingSupported=!Z.disableStream,this._isRangeSupported=!Z.disableRange,this._headers=M(this._stream.httpHeaders);const w=Z.url;fetch(w,S(this._headers,this._withCredentials,this._abortController)).then(y=>{if(!(0,s.validateResponseStatus)(y.status))throw(0,s.createResponseStatusError)(y.status,w);this._reader=y.body.getReader(),this._headersCapability.resolve();const N=j=>y.headers.get(j),{allowRangeRequests:Y,suggestedLength:k}=(0,s.validateRangeRequestCapabilities)({getResponseHeader:N,isHttp:this._stream.isHttp,rangeChunkSize:this._rangeChunkSize,disableRange:this._disableRange});this._isRangeSupported=Y,this._contentLength=k||this._contentLength,this._filename=(0,s.extractFilenameFromHeader)(N),!this._isStreamingSupported&&this._isRangeSupported&&this.cancel(new l.AbortException("Streaming is disabled."))}).catch(this._headersCapability.reject),this.onProgress=null}get headersReady(){return this._headersCapability.promise}get filename(){return this._filename}get contentLength(){return this._contentLength}get isRangeSupported(){return this._isRangeSupported}get isStreamingSupported(){return this._isStreamingSupported}async read(){await this._headersCapability.promise;const{value:W,done:Z}=await this._reader.read();return Z?{value:W,done:Z}:(this._loaded+=W.byteLength,this.onProgress?.({loaded:this._loaded,total:this._contentLength}),{value:L(W),done:!1})}cancel(W){this._reader?.cancel(W),this._abortController.abort()}}class I{constructor(W,Z,w){this._stream=W,this._reader=null,this._loaded=0;const y=W.source;this._withCredentials=y.withCredentials||!1,this._readCapability=new l.PromiseCapability,this._isStreamingSupported=!y.disableStream,this._abortController=new AbortController,this._headers=M(this._stream.httpHeaders),this._headers.append("Range",`bytes=${Z}-${w-1}`);const N=y.url;fetch(N,S(this._headers,this._withCredentials,this._abortController)).then(Y=>{if(!(0,s.validateResponseStatus)(Y.status))throw(0,s.createResponseStatusError)(Y.status,N);this._readCapability.resolve(),this._reader=Y.body.getReader()}).catch(this._readCapability.reject),this.onProgress=null}get isStreamingSupported(){return this._isStreamingSupported}async read(){await this._readCapability.promise;const{value:W,done:Z}=await this._reader.read();return Z?{value:W,done:Z}:(this._loaded+=W.byteLength,this.onProgress?.({loaded:this._loaded}),{value:L(W),done:!1})}cancel(W){this._reader?.cancel(W),this._abortController.abort()}}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.TextLayerRenderTask=void 0,C.renderTextLayer=y,C.updateTextLayer=N;var l=a(1),s=a(6);const S=1e5,M=30,L=.8,X=new Map;function A(Y,k){let j;if(k&&l.FeatureTest.isOffscreenCanvasSupported)j=new OffscreenCanvas(Y,Y).getContext("2d",{alpha:!1});else{const p=document.createElement("canvas");p.width=p.height=Y,j=p.getContext("2d",{alpha:!1})}return j}function I(Y,k){const j=X.get(Y);if(j)return j;const p=A(M,k);p.font=`${M}px ${Y}`;const b=p.measureText("");let B=b.fontBoundingBoxAscent,u=Math.abs(b.fontBoundingBoxDescent);if(B){const J=B/(B+u);return X.set(Y,J),p.canvas.width=p.canvas.height=0,J}p.strokeStyle="red",p.clearRect(0,0,M,M),p.strokeText("g",0,0);let T=p.getImageData(0,0,M,M).data;u=0;for(let J=T.length-1-3;J>=0;J-=4)if(T[J]>0){u=Math.ceil(J/4/M);break}p.clearRect(0,0,M,M),p.strokeText("A",0,M),T=p.getImageData(0,0,M,M).data,B=0;for(let J=0,r=T.length;J<r;J+=4)if(T[J]>0){B=M-Math.floor(J/4/M);break}if(p.canvas.width=p.canvas.height=0,B){const J=B/(B+u);return X.set(Y,J),J}return X.set(Y,L),L}function m(Y,k,j){const p=document.createElement("span"),b={angle:0,canvasWidth:0,hasText:k.str!=="",hasEOL:k.hasEOL,fontSize:0};Y._textDivs.push(p);const B=l.Util.transform(Y._transform,k.transform);let u=Math.atan2(B[1],B[0]);const T=j[k.fontName];T.vertical&&(u+=Math.PI/2);const J=Math.hypot(B[2],B[3]),r=J*I(T.fontFamily,Y._isOffscreenCanvasSupported);let q,hI;u===0?(q=B[4],hI=B[5]-r):(q=B[4]+r*Math.sin(u),hI=B[5]-r*Math.cos(u));const KI="calc(var(--scale-factor)*",NI=p.style;Y._container===Y._rootContainer?(NI.left=`${(100*q/Y._pageWidth).toFixed(2)}%`,NI.top=`${(100*hI/Y._pageHeight).toFixed(2)}%`):(NI.left=`${KI}${q.toFixed(2)}px)`,NI.top=`${KI}${hI.toFixed(2)}px)`),NI.fontSize=`${KI}${J.toFixed(2)}px)`,NI.fontFamily=T.fontFamily,b.fontSize=J,p.setAttribute("role","presentation"),p.textContent=k.str,p.dir=k.dir,Y._fontInspectorEnabled&&(p.dataset.fontName=k.fontName),u!==0&&(b.angle=u*(180/Math.PI));let yI=!1;if(k.str.length>1)yI=!0;else if(k.str!==" "&&k.transform[0]!==k.transform[3]){const oI=Math.abs(k.transform[0]),U=Math.abs(k.transform[3]);oI!==U&&Math.max(oI,U)/Math.min(oI,U)>1.5&&(yI=!0)}yI&&(b.canvasWidth=T.vertical?k.height:k.width),Y._textDivProperties.set(p,b),Y._isReadableStream&&Y._layoutText(p)}function W(Y){const{div:k,scale:j,properties:p,ctx:b,prevFontSize:B,prevFontFamily:u}=Y,{style:T}=k;let J="";if(p.canvasWidth!==0&&p.hasText){const{fontFamily:r}=T,{canvasWidth:q,fontSize:hI}=p;(B!==hI||u!==r)&&(b.font=`${hI*j}px ${r}`,Y.prevFontSize=hI,Y.prevFontFamily=r);const{width:KI}=b.measureText(k.textContent);KI>0&&(J=`scaleX(${q*j/KI})`)}p.angle!==0&&(J=`rotate(${p.angle}deg) ${J}`),J.length>0&&(T.transform=J)}function Z(Y){if(Y._canceled)return;const k=Y._textDivs,j=Y._capability;if(k.length>S){j.resolve();return}if(!Y._isReadableStream)for(const b of k)Y._layoutText(b);j.resolve()}class w{constructor({textContentSource:k,container:j,viewport:p,textDivs:b,textDivProperties:B,textContentItemsStr:u,isOffscreenCanvasSupported:T}){this._textContentSource=k,this._isReadableStream=k instanceof ReadableStream,this._container=this._rootContainer=j,this._textDivs=b||[],this._textContentItemsStr=u||[],this._isOffscreenCanvasSupported=T,this._fontInspectorEnabled=!!globalThis.FontInspector?.enabled,this._reader=null,this._textDivProperties=B||new WeakMap,this._canceled=!1,this._capability=new l.PromiseCapability,this._layoutTextParams={prevFontSize:null,prevFontFamily:null,div:null,scale:p.scale*(globalThis.devicePixelRatio||1),properties:null,ctx:A(0,T)};const{pageWidth:J,pageHeight:r,pageX:q,pageY:hI}=p.rawDims;this._transform=[1,0,0,-1,-q,hI+r],this._pageWidth=J,this._pageHeight=r,(0,s.setLayerDimensions)(j,p),this._capability.promise.finally(()=>{this._layoutTextParams=null}).catch(()=>{})}get promise(){return this._capability.promise}cancel(){this._canceled=!0,this._reader&&(this._reader.cancel(new l.AbortException("TextLayer task cancelled.")).catch(()=>{}),this._reader=null),this._capability.reject(new l.AbortException("TextLayer task cancelled."))}_processItems(k,j){for(const p of k){if(p.str===void 0){if(p.type==="beginMarkedContentProps"||p.type==="beginMarkedContent"){const b=this._container;this._container=document.createElement("span"),this._container.classList.add("markedContent"),p.id!==null&&this._container.setAttribute("id",`${p.id}`),b.append(this._container)}else p.type==="endMarkedContent"&&(this._container=this._container.parentNode);continue}this._textContentItemsStr.push(p.str),m(this,p,j)}}_layoutText(k){const j=this._layoutTextParams.properties=this._textDivProperties.get(k);if(this._layoutTextParams.div=k,W(this._layoutTextParams),j.hasText&&this._container.append(k),j.hasEOL){const p=document.createElement("br");p.setAttribute("role","presentation"),this._container.append(p)}}_render(){const k=new l.PromiseCapability;let j=Object.create(null);if(this._isReadableStream){const p=()=>{this._reader.read().then(({value:b,done:B})=>{if(B){k.resolve();return}Object.assign(j,b.styles),this._processItems(b.items,j),p()},k.reject)};this._reader=this._textContentSource.getReader(),p()}else if(this._textContentSource){const{items:p,styles:b}=this._textContentSource;this._processItems(p,b),k.resolve()}else throw new Error('No "textContentSource" parameter specified.');k.promise.then(()=>{j=null,Z(this)},this._capability.reject)}}C.TextLayerRenderTask=w;function y(Y){!Y.textContentSource&&(Y.textContent||Y.textContentStream)&&((0,s.deprecated)("The TextLayerRender `textContent`/`textContentStream` parameters will be removed in the future, please use `textContentSource` instead."),Y.textContentSource=Y.textContent||Y.textContentStream);const{container:k,viewport:j}=Y,p=getComputedStyle(k),b=p.getPropertyValue("visibility"),B=parseFloat(p.getPropertyValue("--scale-factor"));b==="visible"&&(!B||Math.abs(B-j.scale)>1e-5)&&console.error("The `--scale-factor` CSS-variable must be set, to the same value as `viewport.scale`, either on the `container`-element itself or higher up in the DOM.");const u=new w(Y);return u._render(),u}function N({container:Y,viewport:k,textDivs:j,textDivProperties:p,isOffscreenCanvasSupported:b,mustRotate:B=!0,mustRescale:u=!0}){if(B&&(0,s.setLayerDimensions)(Y,{rotation:k.rotation}),u){const T=A(0,b),r={prevFontSize:null,prevFontFamily:null,div:null,scale:k.scale*(globalThis.devicePixelRatio||1),properties:null,ctx:T};for(const q of j)r.properties=p.get(q),r.div=q,W(r)}}},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.AnnotationEditorLayer=void 0;var l=a(1),s=a(5),S=a(28),M=a(29),L=a(6);class X{#I;#g=!1;#A=this.pointerup.bind(this);#C=this.pointerdown.bind(this);#l=new Map;#s=!1;#b=!1;#Z;static _initialized=!1;constructor(I){X._initialized||(X._initialized=!0,S.FreeTextEditor.initialize(I.l10n),M.InkEditor.initialize(I.l10n)),I.uiManager.registerEditorTypes([S.FreeTextEditor,M.InkEditor]),this.#Z=I.uiManager,this.pageIndex=I.pageIndex,this.div=I.div,this.#I=I.accessibilityManager,this.#Z.addLayer(this)}get isEmpty(){return this.#l.size===0}updateToolbar(I){this.#Z.updateToolbar(I)}updateMode(I=this.#Z.getMode()){this.#m(),I===l.AnnotationEditorType.INK?(this.addInkEditorIfNeeded(!1),this.disableClick()):this.enableClick(),this.#Z.unselectAll(),I!==l.AnnotationEditorType.NONE&&(this.div.classList.toggle("freeTextEditing",I===l.AnnotationEditorType.FREETEXT),this.div.classList.toggle("inkEditing",I===l.AnnotationEditorType.INK),this.div.hidden=!1)}addInkEditorIfNeeded(I){if(!I&&this.#Z.getMode()!==l.AnnotationEditorType.INK)return;if(!I){for(const W of this.#l.values())if(W.isEmpty()){W.setInBackground();return}}this.#c({offsetX:0,offsetY:0}).setInBackground()}setEditingState(I){this.#Z.setEditingState(I)}addCommands(I){this.#Z.addCommands(I)}enable(){this.div.style.pointerEvents="auto";for(const I of this.#l.values())I.enableEditing()}disable(){this.div.style.pointerEvents="none";for(const I of this.#l.values())I.disableEditing();this.#m(),this.isEmpty&&(this.div.hidden=!0)}setActiveEditor(I){this.#Z.getActive()!==I&&this.#Z.setActiveEditor(I)}enableClick(){this.div.addEventListener("pointerdown",this.#C),this.div.addEventListener("pointerup",this.#A)}disableClick(){this.div.removeEventListener("pointerdown",this.#C),this.div.removeEventListener("pointerup",this.#A)}attach(I){this.#l.set(I.id,I)}detach(I){this.#l.delete(I.id),this.#I?.removePointerInTextLayer(I.contentDiv)}remove(I){this.#Z.removeEditor(I),this.detach(I),I.div.style.display="none",setTimeout(()=>{I.div.style.display="",I.div.remove(),I.isAttachedToDOM=!1,document.activeElement===document.body&&this.#Z.focusMainContainer()},0),this.#b||this.addInkEditorIfNeeded(!1)}#d(I){I.parent!==this&&(this.attach(I),I.parent?.detach(I),I.setParent(this),I.div&&I.isAttachedToDOM&&(I.div.remove(),this.div.append(I.div)))}add(I){if(this.#d(I),this.#Z.addEditor(I),this.attach(I),!I.isAttachedToDOM){const m=I.render();this.div.append(m),I.isAttachedToDOM=!0}this.moveEditorInDOM(I),I.onceAdded(),this.#Z.addToAnnotationStorage(I)}moveEditorInDOM(I){this.#I?.moveElementInDOM(this.div,I.div,I.contentDiv,!0)}addOrRebuild(I){I.needsToBeRebuilt()?I.rebuild():this.add(I)}addANewEditor(I){const m=()=>{this.addOrRebuild(I)},W=()=>{I.remove()};this.addCommands({cmd:m,undo:W,mustExec:!0})}addUndoableEditor(I){const m=()=>{this.addOrRebuild(I)},W=()=>{I.remove()};this.addCommands({cmd:m,undo:W,mustExec:!1})}getNextId(){return this.#Z.getId()}#i(I){switch(this.#Z.getMode()){case l.AnnotationEditorType.FREETEXT:return new S.FreeTextEditor(I);case l.AnnotationEditorType.INK:return new M.InkEditor(I)}return null}deserialize(I){switch(I.annotationType){case l.AnnotationEditorType.FREETEXT:return S.FreeTextEditor.deserialize(I,this,this.#Z);case l.AnnotationEditorType.INK:return M.InkEditor.deserialize(I,this,this.#Z)}return null}#c(I){const m=this.getNextId(),W=this.#i({parent:this,id:m,x:I.offsetX,y:I.offsetY,uiManager:this.#Z});return W&&this.add(W),W}setSelected(I){this.#Z.setSelected(I)}toggleSelected(I){this.#Z.toggleSelected(I)}isSelected(I){return this.#Z.isSelected(I)}unselect(I){this.#Z.unselect(I)}pointerup(I){const{isMac:m}=l.FeatureTest.platform;if(!(I.button!==0||I.ctrlKey&&m)&&I.target===this.div&&this.#s){if(this.#s=!1,!this.#g){this.#g=!0;return}this.#c(I)}}pointerdown(I){const{isMac:m}=l.FeatureTest.platform;if(I.button!==0||I.ctrlKey&&m||I.target!==this.div)return;this.#s=!0;const W=this.#Z.getActive();this.#g=!W||W.isEmpty()}drop(I){const m=I.dataTransfer.getData("text/plain"),W=this.#Z.getEditor(m);if(!W)return;I.preventDefault(),I.dataTransfer.dropEffect="move",this.#d(W);const Z=this.div.getBoundingClientRect(),w=I.clientX-Z.x,y=I.clientY-Z.y;W.translate(w-W.startX,y-W.startY),this.moveEditorInDOM(W),W.div.focus()}dragover(I){I.preventDefault()}destroy(){this.#Z.getActive()?.parent===this&&this.#Z.setActiveEditor(null);for(const I of this.#l.values())this.#I?.removePointerInTextLayer(I.contentDiv),I.setParent(null),I.isAttachedToDOM=!1,I.div.remove();this.div=null,this.#l.clear(),this.#Z.removeLayer(this)}#m(){this.#b=!0;for(const I of this.#l.values())I.isEmpty()&&I.remove();this.#b=!1}render({viewport:I}){this.viewport=I,(0,L.setLayerDimensions)(this.div,I),(0,s.bindEvents)(this,this.div,["dragover","drop"]);for(const m of this.#Z.getEditors(this.pageIndex))this.add(m);this.updateMode()}update({viewport:I}){this.#Z.commitOrRemove(),this.viewport=I,(0,L.setLayerDimensions)(this.div,{rotation:I.rotation}),this.updateMode()}get pageDimensions(){const{pageWidth:I,pageHeight:m}=this.viewport.rawDims;return[I,m]}}C.AnnotationEditorLayer=X},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.FreeTextEditor=void 0;var l=a(1),s=a(5),S=a(4);class M extends S.AnnotationEditor{#I=this.editorDivBlur.bind(this);#g=this.editorDivFocus.bind(this);#A=this.editorDivInput.bind(this);#C=this.editorDivKeydown.bind(this);#l;#s="";#b=`${this.id}-editor`;#Z=!1;#d;static _freeTextDefaultContent="";static _l10nPromise;static _internalPadding=0;static _defaultColor=null;static _defaultFontSize=10;static _keyboardManager=new s.KeyboardManager([[["ctrl+Enter","mac+meta+Enter","Escape","mac+Escape"],M.prototype.commitOrRemove]]);static _type="freetext";constructor(X){super({...X,name:"freeTextEditor"}),this.#l=X.color||M._defaultColor||S.AnnotationEditor._defaultLineColor,this.#d=X.fontSize||M._defaultFontSize}static initialize(X){this._l10nPromise=new Map(["free_text2_default_content","editor_free_text2_aria_label"].map(I=>[I,X.get(I)]));const A=getComputedStyle(document.documentElement);this._internalPadding=parseFloat(A.getPropertyValue("--freetext-padding"))}static updateDefaultParams(X,A){switch(X){case l.AnnotationEditorParamsType.FREETEXT_SIZE:M._defaultFontSize=A;break;case l.AnnotationEditorParamsType.FREETEXT_COLOR:M._defaultColor=A;break}}updateParams(X,A){switch(X){case l.AnnotationEditorParamsType.FREETEXT_SIZE:this.#i(A);break;case l.AnnotationEditorParamsType.FREETEXT_COLOR:this.#c(A);break}}static get defaultPropertiesToUpdate(){return[[l.AnnotationEditorParamsType.FREETEXT_SIZE,M._defaultFontSize],[l.AnnotationEditorParamsType.FREETEXT_COLOR,M._defaultColor||S.AnnotationEditor._defaultLineColor]]}get propertiesToUpdate(){return[[l.AnnotationEditorParamsType.FREETEXT_SIZE,this.#d],[l.AnnotationEditorParamsType.FREETEXT_COLOR,this.#l]]}#i(X){const A=m=>{this.editorDiv.style.fontSize=`calc(${m}px * var(--scale-factor))`,this.translate(0,-(m-this.#d)*this.parentScale),this.#d=m,this.#G()},I=this.#d;this.addCommands({cmd:()=>{A(X)},undo:()=>{A(I)},mustExec:!0,type:l.AnnotationEditorParamsType.FREETEXT_SIZE,overwriteIfSameType:!0,keepUndo:!0})}#c(X){const A=this.#l;this.addCommands({cmd:()=>{this.#l=this.editorDiv.style.color=X},undo:()=>{this.#l=this.editorDiv.style.color=A},mustExec:!0,type:l.AnnotationEditorParamsType.FREETEXT_COLOR,overwriteIfSameType:!0,keepUndo:!0})}getInitialTranslation(){const X=this.parentScale;return[-M._internalPadding*X,-(M._internalPadding+this.#d)*X]}rebuild(){super.rebuild(),this.div!==null&&(this.isAttachedToDOM||this.parent.add(this))}enableEditMode(){this.isInEditMode()||(this.parent.setEditingState(!1),this.parent.updateToolbar(l.AnnotationEditorType.FREETEXT),super.enableEditMode(),this.overlayDiv.classList.remove("enabled"),this.editorDiv.contentEditable=!0,this.div.draggable=!1,this.div.removeAttribute("aria-activedescendant"),this.editorDiv.addEventListener("keydown",this.#C),this.editorDiv.addEventListener("focus",this.#g),this.editorDiv.addEventListener("blur",this.#I),this.editorDiv.addEventListener("input",this.#A))}disableEditMode(){this.isInEditMode()&&(this.parent.setEditingState(!0),super.disableEditMode(),this.overlayDiv.classList.add("enabled"),this.editorDiv.contentEditable=!1,this.div.setAttribute("aria-activedescendant",this.#b),this.div.draggable=!0,this.editorDiv.removeEventListener("keydown",this.#C),this.editorDiv.removeEventListener("focus",this.#g),this.editorDiv.removeEventListener("blur",this.#I),this.editorDiv.removeEventListener("input",this.#A),this.div.focus({preventScroll:!0}),this.isEditing=!1,this.parent.div.classList.add("freeTextEditing"))}focusin(X){super.focusin(X),X.target!==this.editorDiv&&this.editorDiv.focus()}onceAdded(){this.width||(this.enableEditMode(),this.editorDiv.focus())}isEmpty(){return!this.editorDiv||this.editorDiv.innerText.trim()===""}remove(){this.isEditing=!1,this.parent.setEditingState(!0),this.parent.div.classList.add("freeTextEditing"),super.remove()}#m(){const X=this.editorDiv.getElementsByTagName("div");if(X.length===0)return this.editorDiv.innerText;const A=[];for(const I of X)A.push(I.innerText.replace(/\r\n?|\n/,""));return A.join(`
`)}#G(){const[X,A]=this.parentDimensions;let I;if(this.isAttachedToDOM)I=this.div.getBoundingClientRect();else{const{currentLayer:m,div:W}=this,Z=W.style.display;W.style.display="hidden",m.div.append(this.div),I=W.getBoundingClientRect(),W.remove(),W.style.display=Z}this.width=I.width/X,this.height=I.height/A}commit(){this.isInEditMode()&&(super.commit(),this.#Z||(this.#Z=!0,this.parent.addUndoableEditor(this)),this.disableEditMode(),this.#s=this.#m().trimEnd(),this.#G())}shouldGetKeyboardEvents(){return this.isInEditMode()}dblclick(X){this.enableEditMode(),this.editorDiv.focus()}keydown(X){X.target===this.div&&X.key==="Enter"&&(this.enableEditMode(),this.editorDiv.focus())}editorDivKeydown(X){M._keyboardManager.exec(this,X)}editorDivFocus(X){this.isEditing=!0}editorDivBlur(X){this.isEditing=!1}editorDivInput(X){this.parent.div.classList.toggle("freeTextEditing",this.isEmpty())}disableEditing(){this.editorDiv.setAttribute("role","comment"),this.editorDiv.removeAttribute("aria-multiline")}enableEditing(){this.editorDiv.setAttribute("role","textbox"),this.editorDiv.setAttribute("aria-multiline",!0)}render(){if(this.div)return this.div;let X,A;this.width&&(X=this.x,A=this.y),super.render(),this.editorDiv=document.createElement("div"),this.editorDiv.className="internal",this.editorDiv.setAttribute("id",this.#b),this.enableEditing(),M._l10nPromise.get("editor_free_text2_aria_label").then(m=>this.editorDiv?.setAttribute("aria-label",m)),M._l10nPromise.get("free_text2_default_content").then(m=>this.editorDiv?.setAttribute("default-content",m)),this.editorDiv.contentEditable=!0;const{style:I}=this.editorDiv;if(I.fontSize=`calc(${this.#d}px * var(--scale-factor))`,I.color=this.#l,this.div.append(this.editorDiv),this.overlayDiv=document.createElement("div"),this.overlayDiv.classList.add("overlay","enabled"),this.div.append(this.overlayDiv),(0,s.bindEvents)(this,this.div,["dblclick","keydown"]),this.width){const[m,W]=this.parentDimensions;this.setAt(X*m,A*W,this.width*m,this.height*W);for(const Z of this.#s.split(`
`)){const w=document.createElement("div");w.append(Z?document.createTextNode(Z):document.createElement("br")),this.editorDiv.append(w)}this.div.draggable=!0,this.editorDiv.contentEditable=!1}else this.div.draggable=!1,this.editorDiv.contentEditable=!0;return this.div}get contentDiv(){return this.editorDiv}static deserialize(X,A,I){const m=super.deserialize(X,A,I);return m.#d=X.fontSize,m.#l=l.Util.makeHexColor(...X.color),m.#s=X.value,m}serialize(){if(this.isEmpty())return null;const X=M._internalPadding*this.parentScale,A=this.getRect(X,X),I=S.AnnotationEditor._colorManager.convert(this.isAttachedToDOM?getComputedStyle(this.editorDiv).color:this.#l);return{annotationType:l.AnnotationEditorType.FREETEXT,color:I,fontSize:this.#d,value:this.#s,pageIndex:this.pageIndex,rect:A,rotation:this.rotation}}}C.FreeTextEditor=M},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.InkEditor=void 0;var l=a(1),s=a(4),S=a(5);const M=16;class L extends s.AnnotationEditor{#I=0;#g=0;#A=0;#C=this.canvasContextMenu.bind(this);#l=this.canvasPointermove.bind(this);#s=this.canvasPointerleave.bind(this);#b=this.canvasPointerup.bind(this);#Z=this.canvasPointerdown.bind(this);#d=new Path2D;#i=!1;#c=!1;#m=!1;#G=null;#o=0;#V=0;#Y=null;static _defaultColor=null;static _defaultOpacity=1;static _defaultThickness=1;static _l10nPromise;static _type="ink";constructor(A){super({...A,name:"inkEditor"}),this.color=A.color||null,this.thickness=A.thickness||null,this.opacity=A.opacity||null,this.paths=[],this.bezierPath2D=[],this.allRawPaths=[],this.currentPath=[],this.scaleFactor=1,this.translationX=this.translationY=0,this.x=0,this.y=0}static initialize(A){this._l10nPromise=new Map(["editor_ink_canvas_aria_label","editor_ink2_aria_label"].map(I=>[I,A.get(I)]))}static updateDefaultParams(A,I){switch(A){case l.AnnotationEditorParamsType.INK_THICKNESS:L._defaultThickness=I;break;case l.AnnotationEditorParamsType.INK_COLOR:L._defaultColor=I;break;case l.AnnotationEditorParamsType.INK_OPACITY:L._defaultOpacity=I/100;break}}updateParams(A,I){switch(A){case l.AnnotationEditorParamsType.INK_THICKNESS:this.#M(I);break;case l.AnnotationEditorParamsType.INK_COLOR:this.#H(I);break;case l.AnnotationEditorParamsType.INK_OPACITY:this.#u(I);break}}static get defaultPropertiesToUpdate(){return[[l.AnnotationEditorParamsType.INK_THICKNESS,L._defaultThickness],[l.AnnotationEditorParamsType.INK_COLOR,L._defaultColor||s.AnnotationEditor._defaultLineColor],[l.AnnotationEditorParamsType.INK_OPACITY,Math.round(L._defaultOpacity*100)]]}get propertiesToUpdate(){return[[l.AnnotationEditorParamsType.INK_THICKNESS,this.thickness||L._defaultThickness],[l.AnnotationEditorParamsType.INK_COLOR,this.color||L._defaultColor||s.AnnotationEditor._defaultLineColor],[l.AnnotationEditorParamsType.INK_OPACITY,Math.round(100*(this.opacity??L._defaultOpacity))]]}#M(A){const I=this.thickness;this.addCommands({cmd:()=>{this.thickness=A,this.#y()},undo:()=>{this.thickness=I,this.#y()},mustExec:!0,type:l.AnnotationEditorParamsType.INK_THICKNESS,overwriteIfSameType:!0,keepUndo:!0})}#H(A){const I=this.color;this.addCommands({cmd:()=>{this.color=A,this.#B()},undo:()=>{this.color=I,this.#B()},mustExec:!0,type:l.AnnotationEditorParamsType.INK_COLOR,overwriteIfSameType:!0,keepUndo:!0})}#u(A){A/=100;const I=this.opacity;this.addCommands({cmd:()=>{this.opacity=A,this.#B()},undo:()=>{this.opacity=I,this.#B()},mustExec:!0,type:l.AnnotationEditorParamsType.INK_OPACITY,overwriteIfSameType:!0,keepUndo:!0})}rebuild(){super.rebuild(),this.div!==null&&(this.canvas||(this.#N(),this.#h()),this.isAttachedToDOM||(this.parent.add(this),this.#w()),this.#y())}remove(){this.canvas!==null&&(this.isEmpty()||this.commit(),this.canvas.width=this.canvas.height=0,this.canvas.remove(),this.canvas=null,this.#G.disconnect(),this.#G=null,super.remove())}setParent(A){!this.parent&&A?this._uiManager.removeShouldRescale(this):this.parent&&A===null&&this._uiManager.addShouldRescale(this),super.setParent(A)}onScaleChanging(){const[A,I]=this.parentDimensions,m=this.width*A,W=this.height*I;this.setDimensions(m,W)}enableEditMode(){this.#i||this.canvas===null||(super.enableEditMode(),this.div.draggable=!1,this.canvas.addEventListener("pointerdown",this.#Z))}disableEditMode(){!this.isInEditMode()||this.canvas===null||(super.disableEditMode(),this.div.draggable=!this.isEmpty(),this.div.classList.remove("editing"),this.canvas.removeEventListener("pointerdown",this.#Z))}onceAdded(){this.div.draggable=!this.isEmpty()}isEmpty(){return this.paths.length===0||this.paths.length===1&&this.paths[0].length===0}#D(){const{parentRotation:A,parentDimensions:[I,m]}=this;switch(A){case 90:return[0,m,m,I];case 180:return[I,m,I,m];case 270:return[I,0,m,I];default:return[0,0,I,m]}}#a(){const{ctx:A,color:I,opacity:m,thickness:W,parentScale:Z,scaleFactor:w}=this;A.lineWidth=W*Z/w,A.lineCap="round",A.lineJoin="round",A.miterLimit=10,A.strokeStyle=`${I}${(0,S.opacityToHex)(m)}`}#n(A,I){this.canvas.addEventListener("contextmenu",this.#C),this.canvas.addEventListener("pointerleave",this.#s),this.canvas.addEventListener("pointermove",this.#l),this.canvas.addEventListener("pointerup",this.#b),this.canvas.removeEventListener("pointerdown",this.#Z),this.isEditing=!0,this.#m||(this.#m=!0,this.#w(),this.thickness||=L._defaultThickness,this.color||=L._defaultColor||s.AnnotationEditor._defaultLineColor,this.opacity??=L._defaultOpacity),this.currentPath.push([A,I]),this.#c=!1,this.#a(),this.#Y=()=>{this.#e(),this.#Y&&window.requestAnimationFrame(this.#Y)},window.requestAnimationFrame(this.#Y)}#X(A,I){const[m,W]=this.currentPath.at(-1);if(this.currentPath.length>1&&A===m&&I===W)return;const Z=this.currentPath;let w=this.#d;if(Z.push([A,I]),this.#c=!0,Z.length<=2){w.moveTo(...Z[0]),w.lineTo(A,I);return}Z.length===3&&(this.#d=w=new Path2D,w.moveTo(...Z[0])),this.#F(w,...Z.at(-3),...Z.at(-2),A,I)}#p(){if(this.currentPath.length===0)return;const A=this.currentPath.at(-1);this.#d.lineTo(...A)}#K(A,I){this.#Y=null,A=Math.min(Math.max(A,0),this.canvas.width),I=Math.min(Math.max(I,0),this.canvas.height),this.#X(A,I),this.#p();let m;if(this.currentPath.length!==1)m=this.#W();else{const N=[A,I];m=[[N,N.slice(),N.slice(),N]]}const W=this.#d,Z=this.currentPath;this.currentPath=[],this.#d=new Path2D;const w=()=>{this.allRawPaths.push(Z),this.paths.push(m),this.bezierPath2D.push(W),this.rebuild()},y=()=>{this.allRawPaths.pop(),this.paths.pop(),this.bezierPath2D.pop(),this.paths.length===0?this.remove():(this.canvas||(this.#N(),this.#h()),this.#y())};this.addCommands({cmd:w,undo:y,mustExec:!0})}#e(){if(!this.#c)return;this.#c=!1;const A=Math.ceil(this.thickness*this.parentScale),I=this.currentPath.slice(-3),m=I.map(w=>w[0]),W=I.map(w=>w[1]);Math.min(...m)-A,Math.max(...m)+A,Math.min(...W)-A,Math.max(...W)+A;const{ctx:Z}=this;Z.save(),Z.clearRect(0,0,this.canvas.width,this.canvas.height);for(const w of this.bezierPath2D)Z.stroke(w);Z.stroke(this.#d),Z.restore()}#F(A,I,m,W,Z,w,y){const N=(I+W)/2,Y=(m+Z)/2,k=(W+w)/2,j=(Z+y)/2;A.bezierCurveTo(N+2*(W-N)/3,Y+2*(Z-Y)/3,k+2*(W-k)/3,j+2*(Z-j)/3,k,j)}#W(){const A=this.currentPath;if(A.length<=2)return[[A[0],A[0],A.at(-1),A.at(-1)]];const I=[];let m,[W,Z]=A[0];for(m=1;m<A.length-2;m++){const[p,b]=A[m],[B,u]=A[m+1],T=(p+B)/2,J=(b+u)/2,r=[W+2*(p-W)/3,Z+2*(b-Z)/3],q=[T+2*(p-T)/3,J+2*(b-J)/3];I.push([[W,Z],r,q,[T,J]]),[W,Z]=[T,J]}const[w,y]=A[m],[N,Y]=A[m+1],k=[W+2*(w-W)/3,Z+2*(y-Z)/3],j=[N+2*(w-N)/3,Y+2*(y-Y)/3];return I.push([[W,Z],k,j,[N,Y]]),I}#B(){if(this.isEmpty()){this.#t();return}this.#a();const{canvas:A,ctx:I}=this;I.setTransform(1,0,0,1,0,0),I.clearRect(0,0,A.width,A.height),this.#t();for(const m of this.bezierPath2D)I.stroke(m)}commit(){this.#i||(super.commit(),this.isEditing=!1,this.disableEditMode(),this.setInForeground(),this.#i=!0,this.div.classList.add("disabled"),this.#y(!0),this.parent.addInkEditorIfNeeded(!0),this.parent.moveEditorInDOM(this),this.div.focus({preventScroll:!0}))}focusin(A){super.focusin(A),this.enableEditMode()}canvasPointerdown(A){A.button!==0||!this.isInEditMode()||this.#i||(this.setInForeground(),A.preventDefault(),A.type!=="mouse"&&this.div.focus(),this.#n(A.offsetX,A.offsetY))}canvasContextMenu(A){A.preventDefault()}canvasPointermove(A){A.preventDefault(),this.#X(A.offsetX,A.offsetY)}canvasPointerup(A){A.preventDefault(),this.#S(A)}canvasPointerleave(A){this.#S(A)}#S(A){this.canvas.removeEventListener("pointerleave",this.#s),this.canvas.removeEventListener("pointermove",this.#l),this.canvas.removeEventListener("pointerup",this.#b),this.canvas.addEventListener("pointerdown",this.#Z),setTimeout(()=>{this.canvas.removeEventListener("contextmenu",this.#C)},10),this.#K(A.offsetX,A.offsetY),this.addToAnnotationStorage(),this.setInBackground()}#N(){this.canvas=document.createElement("canvas"),this.canvas.width=this.canvas.height=0,this.canvas.className="inkEditorCanvas",L._l10nPromise.get("editor_ink_canvas_aria_label").then(A=>this.canvas?.setAttribute("aria-label",A)),this.div.append(this.canvas),this.ctx=this.canvas.getContext("2d")}#h(){this.#G=new ResizeObserver(A=>{const I=A[0].contentRect;I.width&&I.height&&this.setDimensions(I.width,I.height)}),this.#G.observe(this.div)}render(){if(this.div)return this.div;let A,I;this.width&&(A=this.x,I=this.y),super.render(),L._l10nPromise.get("editor_ink2_aria_label").then(y=>this.div?.setAttribute("aria-label",y));const[m,W,Z,w]=this.#D();if(this.setAt(m,W,0,0),this.setDims(Z,w),this.#N(),this.width){const[y,N]=this.parentDimensions;this.setAt(A*y,I*N,this.width*y,this.height*N),this.#m=!0,this.#w(),this.setDims(this.width*y,this.height*N),this.#B(),this.#L(),this.div.classList.add("disabled")}else this.div.classList.add("editing"),this.enableEditMode();return this.#h(),this.div}#w(){if(!this.#m)return;const[A,I]=this.parentDimensions;this.canvas.width=Math.ceil(this.width*A),this.canvas.height=Math.ceil(this.height*I),this.#t()}setDimensions(A,I){const m=Math.round(A),W=Math.round(I);if(this.#o===m&&this.#V===W)return;this.#o=m,this.#V=W,this.canvas.style.visibility="hidden",this.#I&&Math.abs(this.#I-A/I)>.01&&(I=Math.ceil(A/this.#I),this.setDims(A,I));const[Z,w]=this.parentDimensions;this.width=A/Z,this.height=I/w,this.#i&&this.#R(A,I),this.#w(),this.#B(),this.canvas.style.visibility="visible",this.fixDims()}#R(A,I){const m=this.#J(),W=(A-m)/this.#A,Z=(I-m)/this.#g;this.scaleFactor=Math.min(W,Z)}#t(){const A=this.#J()/2;this.ctx.setTransform(this.scaleFactor,0,0,this.scaleFactor,this.translationX*this.scaleFactor+A,this.translationY*this.scaleFactor+A)}static#k(A){const I=new Path2D;for(let m=0,W=A.length;m<W;m++){const[Z,w,y,N]=A[m];m===0&&I.moveTo(...Z),I.bezierCurveTo(w[0],w[1],y[0],y[1],N[0],N[1])}return I}#T(A,I,m,W){const w=[],y=this.thickness/2;let N,Y;for(const k of this.paths){N=[],Y=[];for(let j=0,p=k.length;j<p;j++){const[b,B,u,T]=k[j],J=A*(b[0]+I)+y,r=W-A*(b[1]+m)-y,q=A*(B[0]+I)+y,hI=W-A*(B[1]+m)-y,KI=A*(u[0]+I)+y,NI=W-A*(u[1]+m)-y,yI=A*(T[0]+I)+y,oI=W-A*(T[1]+m)-y;j===0&&(N.push(J,r),Y.push(J,r)),N.push(q,hI,KI,NI,yI,oI),this.#j(J,r,q,hI,KI,NI,yI,oI,4,Y)}w.push({bezier:N,points:Y})}return w}#j(A,I,m,W,Z,w,y,N,Y,k){if(this.#Q(A,I,m,W,Z,w,y,N)){k.push(y,N);return}for(let j=1;j<Y-1;j++){const p=j/Y,b=1-p;let B=p*A+b*m,u=p*I+b*W,T=p*m+b*Z,J=p*W+b*w;const r=p*Z+b*y,q=p*w+b*N;B=p*B+b*T,u=p*u+b*J,T=p*T+b*r,J=p*J+b*q,B=p*B+b*T,u=p*u+b*J,k.push(B,u)}k.push(y,N)}#Q(A,I,m,W,Z,w,y,N){const k=(3*m-2*A-y)**2,j=(3*W-2*I-N)**2,p=(3*Z-A-2*y)**2,b=(3*w-I-2*N)**2;return Math.max(k,p)+Math.max(j,b)<=10}#z(){let A=1/0,I=-1/0,m=1/0,W=-1/0;for(const Z of this.paths)for(const[w,y,N,Y]of Z){const k=l.Util.bezierBoundingBox(...w,...y,...N,...Y);A=Math.min(A,k[0]),m=Math.min(m,k[1]),I=Math.max(I,k[2]),W=Math.max(W,k[3])}return[A,m,I,W]}#J(){return this.#i?Math.ceil(this.thickness*this.parentScale):0}#y(A=!1){if(this.isEmpty())return;if(!this.#i){this.#B();return}const I=this.#z(),m=this.#J();this.#A=Math.max(M,I[2]-I[0]),this.#g=Math.max(M,I[3]-I[1]);const W=Math.ceil(m+this.#A*this.scaleFactor),Z=Math.ceil(m+this.#g*this.scaleFactor),[w,y]=this.parentDimensions;this.width=W/w,this.height=Z/y,this.#I=W/Z,this.#L();const N=this.translationX,Y=this.translationY;this.translationX=-I[0],this.translationY=-I[1],this.#w(),this.#B(),this.#o=W,this.#V=Z,this.setDims(W,Z);const k=A?m/this.scaleFactor/2:0;this.translate(N-this.translationX-k,Y-this.translationY-k)}#L(){const{style:A}=this.div;this.#I>=1?(A.minHeight=`${M}px`,A.minWidth=`${Math.round(this.#I*M)}px`):(A.minWidth=`${M}px`,A.minHeight=`${Math.round(M/this.#I)}px`)}static deserialize(A,I,m){const W=super.deserialize(A,I,m);W.thickness=A.thickness,W.color=l.Util.makeHexColor(...A.color),W.opacity=A.opacity;const[Z,w]=W.pageDimensions,y=W.width*Z,N=W.height*w,Y=W.parentScale,k=A.thickness/2;W.#I=y/N,W.#i=!0,W.#o=Math.round(y),W.#V=Math.round(N);for(const{bezier:p}of A.paths){const b=[];W.paths.push(b);let B=Y*(p[0]-k),u=Y*(N-p[1]-k);for(let J=2,r=p.length;J<r;J+=6){const q=Y*(p[J]-k),hI=Y*(N-p[J+1]-k),KI=Y*(p[J+2]-k),NI=Y*(N-p[J+3]-k),yI=Y*(p[J+4]-k),oI=Y*(N-p[J+5]-k);b.push([[B,u],[q,hI],[KI,NI],[yI,oI]]),B=yI,u=oI}const T=this.#k(b);W.bezierPath2D.push(T)}const j=W.#z();return W.#A=Math.max(M,j[2]-j[0]),W.#g=Math.max(M,j[3]-j[1]),W.#R(y,N),W}serialize(){if(this.isEmpty())return null;const A=this.getRect(0,0),I=this.rotation%180===0?A[3]-A[1]:A[2]-A[0],m=s.AnnotationEditor._colorManager.convert(this.ctx.strokeStyle);return{annotationType:l.AnnotationEditorType.INK,color:m,thickness:this.thickness,opacity:this.opacity,paths:this.#T(this.scaleFactor/this.parentScale,this.translationX,this.translationY,I),pageIndex:this.pageIndex,rect:A,rotation:this.rotation}}}C.InkEditor=L},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.AnnotationLayer=void 0;var l=a(1),s=a(6),S=a(3),M=a(31),L=a(32);const X=1e3,A=9,I=new WeakSet;function m(n){return{width:n[2]-n[0],height:n[3]-n[1]}}class W{static create(g){switch(g.data.annotationType){case l.AnnotationType.LINK:return new w(g);case l.AnnotationType.TEXT:return new y(g);case l.AnnotationType.WIDGET:switch(g.data.fieldType){case"Tx":return new Y(g);case"Btn":return g.data.radioButton?new j(g):g.data.checkBox?new k(g):new p(g);case"Ch":return new b(g)}return new N(g);case l.AnnotationType.POPUP:return new B(g);case l.AnnotationType.FREETEXT:return new T(g);case l.AnnotationType.LINE:return new J(g);case l.AnnotationType.SQUARE:return new r(g);case l.AnnotationType.CIRCLE:return new q(g);case l.AnnotationType.POLYLINE:return new hI(g);case l.AnnotationType.CARET:return new NI(g);case l.AnnotationType.INK:return new yI(g);case l.AnnotationType.POLYGON:return new KI(g);case l.AnnotationType.HIGHLIGHT:return new oI(g);case l.AnnotationType.UNDERLINE:return new U(g);case l.AnnotationType.SQUIGGLY:return new Q(g);case l.AnnotationType.STRIKEOUT:return new D(g);case l.AnnotationType.STAMP:return new G(g);case l.AnnotationType.FILEATTACHMENT:return new c(g);default:return new Z(g)}}}class Z{constructor(g,{isRenderable:d=!1,ignoreBorder:i=!1,createQuadrilaterals:o=!1}={}){this.isRenderable=d,this.data=g.data,this.layer=g.layer,this.page=g.page,this.viewport=g.viewport,this.linkService=g.linkService,this.downloadManager=g.downloadManager,this.imageResourcesPath=g.imageResourcesPath,this.renderForms=g.renderForms,this.svgFactory=g.svgFactory,this.annotationStorage=g.annotationStorage,this.enableScripting=g.enableScripting,this.hasJSActions=g.hasJSActions,this._fieldObjects=g.fieldObjects,d&&(this.container=this._createContainer(i)),o&&(this.quadrilaterals=this._createQuadrilaterals(i))}_createContainer(g=!1){const{data:d,page:i,viewport:o}=this,R=document.createElement("section");R.setAttribute("data-annotation-id",d.id),d.noRotate&&R.classList.add("norotate");const{pageWidth:t,pageHeight:z,pageX:O,pageY:sI}=o.rawDims,{width:v,height:II}=m(d.rect),MI=l.Util.normalizeRect([d.rect[0],i.view[3]-d.rect[1]+i.view[1],d.rect[2],i.view[3]-d.rect[3]+i.view[1]]);if(!g&&d.borderStyle.width>0){R.style.borderWidth=`${d.borderStyle.width}px`;const uI=d.borderStyle.horizontalCornerRadius,DI=d.borderStyle.verticalCornerRadius;if(uI>0||DI>0){const SI=`calc(${uI}px * var(--scale-factor)) / calc(${DI}px * var(--scale-factor))`;R.style.borderRadius=SI}else if(this instanceof j){const SI=`calc(${v}px * var(--scale-factor)) / calc(${II}px * var(--scale-factor))`;R.style.borderRadius=SI}switch(d.borderStyle.style){case l.AnnotationBorderStyleType.SOLID:R.style.borderStyle="solid";break;case l.AnnotationBorderStyleType.DASHED:R.style.borderStyle="dashed";break;case l.AnnotationBorderStyleType.BEVELED:(0,l.warn)("Unimplemented border style: beveled");break;case l.AnnotationBorderStyleType.INSET:(0,l.warn)("Unimplemented border style: inset");break;case l.AnnotationBorderStyleType.UNDERLINE:R.style.borderBottomStyle="solid";break}const HI=d.borderColor||null;HI?R.style.borderColor=l.Util.makeHexColor(HI[0]|0,HI[1]|0,HI[2]|0):R.style.borderWidth=0}R.style.left=`${100*(MI[0]-O)/t}%`,R.style.top=`${100*(MI[1]-sI)/z}%`;const{rotation:XI}=d;return d.hasOwnCanvas||XI===0?(R.style.width=`${100*v/t}%`,R.style.height=`${100*II/z}%`):this.setRotation(XI,R),R}setRotation(g,d=this.container){const{pageWidth:i,pageHeight:o}=this.viewport.rawDims,{width:R,height:t}=m(this.data.rect);let z,O;g%180===0?(z=100*R/i,O=100*t/o):(z=100*t/i,O=100*R/o),d.style.width=`${z}%`,d.style.height=`${O}%`,d.setAttribute("data-main-rotation",(360-g)%360)}get _commonActions(){const g=(d,i,o)=>{const R=o.detail[d];o.target.style[i]=M.ColorConverters[`${R[0]}_HTML`](R.slice(1))};return(0,l.shadow)(this,"_commonActions",{display:d=>{const i=d.detail.display%2===1;this.container.style.visibility=i?"hidden":"visible",this.annotationStorage.setValue(this.data.id,{hidden:i,print:d.detail.display===0||d.detail.display===3})},print:d=>{this.annotationStorage.setValue(this.data.id,{print:d.detail.print})},hidden:d=>{this.container.style.visibility=d.detail.hidden?"hidden":"visible",this.annotationStorage.setValue(this.data.id,{hidden:d.detail.hidden})},focus:d=>{setTimeout(()=>d.target.focus({preventScroll:!1}),0)},userName:d=>{d.target.title=d.detail.userName},readonly:d=>{d.detail.readonly?d.target.setAttribute("readonly",""):d.target.removeAttribute("readonly")},required:d=>{this._setRequired(d.target,d.detail.required)},bgColor:d=>{g("bgColor","backgroundColor",d)},fillColor:d=>{g("fillColor","backgroundColor",d)},fgColor:d=>{g("fgColor","color",d)},textColor:d=>{g("textColor","color",d)},borderColor:d=>{g("borderColor","borderColor",d)},strokeColor:d=>{g("strokeColor","borderColor",d)},rotation:d=>{const i=d.detail.rotation;this.setRotation(i),this.annotationStorage.setValue(this.data.id,{rotation:i})}})}_dispatchEventFromSandbox(g,d){const i=this._commonActions;for(const o of Object.keys(d.detail))(g[o]||i[o])?.(d)}_setDefaultPropertiesFromJS(g){if(!this.enableScripting)return;const d=this.annotationStorage.getRawValue(this.data.id);if(!d)return;const i=this._commonActions;for(const[o,R]of Object.entries(d)){const t=i[o];if(t){const z={detail:{[o]:R},target:g};t(z),delete d[o]}}}_createQuadrilaterals(g=!1){if(!this.data.quadPoints)return null;const d=[],i=this.data.rect;for(const o of this.data.quadPoints)this.data.rect=[o[2].x,o[2].y,o[1].x,o[1].y],d.push(this._createContainer(g));return this.data.rect=i,d}_createPopup(g,d){let i=this.container;this.quadrilaterals&&(g||=this.quadrilaterals,i=this.quadrilaterals[0]),g||(g=document.createElement("div"),g.classList.add("popupTriggerArea"),i.append(g));const R=new u({container:i,trigger:g,color:d.color,titleObj:d.titleObj,modificationDate:d.modificationDate,contentsObj:d.contentsObj,richText:d.richText,hideWrapper:!0}).render();R.style.left="100%",i.append(R)}_renderQuadrilaterals(g){for(const d of this.quadrilaterals)d.classList.add(g);return this.quadrilaterals}render(){(0,l.unreachable)("Abstract method `AnnotationElement.render` called")}_getElementsByName(g,d=null){const i=[];if(this._fieldObjects){const o=this._fieldObjects[g];if(o)for(const{page:R,id:t,exportValues:z}of o){if(R===-1||t===d)continue;const O=typeof z=="string"?z:null,sI=document.querySelector(`[data-element-id="${t}"]`);if(sI&&!I.has(sI)){(0,l.warn)(`_getElementsByName - element not allowed: ${t}`);continue}i.push({id:t,exportValue:O,domElement:sI})}return i}for(const o of document.getElementsByName(g)){const{exportValue:R}=o,t=o.getAttribute("data-element-id");t!==d&&I.has(o)&&i.push({id:t,exportValue:R,domElement:o})}return i}}class w extends Z{constructor(g,d=null){super(g,{isRenderable:!0,ignoreBorder:!!d?.ignoreBorder,createQuadrilaterals:!0}),this.isTooltipOnly=g.data.isTooltipOnly}render(){const{data:g,linkService:d}=this,i=document.createElement("a");i.setAttribute("data-element-id",g.id);let o=!1;return g.url?(d.addLinkAttributes(i,g.url,g.newWindow),o=!0):g.action?(this._bindNamedAction(i,g.action),o=!0):g.attachment?(this._bindAttachment(i,g.attachment),o=!0):g.setOCGState?(this.#g(i,g.setOCGState),o=!0):g.dest?(this._bindLink(i,g.dest),o=!0):(g.actions&&(g.actions.Action||g.actions["Mouse Up"]||g.actions["Mouse Down"])&&this.enableScripting&&this.hasJSActions&&(this._bindJSAction(i,g),o=!0),g.resetForm?(this._bindResetFormAction(i,g.resetForm),o=!0):this.isTooltipOnly&&!o&&(this._bindLink(i,""),o=!0)),this.quadrilaterals?this._renderQuadrilaterals("linkAnnotation").map((R,t)=>{const z=t===0?i:i.cloneNode();return R.append(z),R}):(this.container.classList.add("linkAnnotation"),o&&this.container.append(i),this.container)}#I(){this.container.setAttribute("data-internal-link","")}_bindLink(g,d){g.href=this.linkService.getDestinationHash(d),g.onclick=()=>(d&&this.linkService.goToDestination(d),!1),(d||d==="")&&this.#I()}_bindNamedAction(g,d){g.href=this.linkService.getAnchorUrl(""),g.onclick=()=>(this.linkService.executeNamedAction(d),!1),this.#I()}_bindAttachment(g,d){g.href=this.linkService.getAnchorUrl(""),g.onclick=()=>(this.downloadManager?.openOrDownloadData(this.container,d.content,d.filename),!1),this.#I()}#g(g,d){g.href=this.linkService.getAnchorUrl(""),g.onclick=()=>(this.linkService.executeSetOCGState(d),!1),this.#I()}_bindJSAction(g,d){g.href=this.linkService.getAnchorUrl("");const i=new Map([["Action","onclick"],["Mouse Up","onmouseup"],["Mouse Down","onmousedown"]]);for(const o of Object.keys(d.actions)){const R=i.get(o);R&&(g[R]=()=>(this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:d.id,name:o}}),!1))}g.onclick||(g.onclick=()=>!1),this.#I()}_bindResetFormAction(g,d){const i=g.onclick;if(i||(g.href=this.linkService.getAnchorUrl("")),this.#I(),!this._fieldObjects){(0,l.warn)('_bindResetFormAction - "resetForm" action not supported, ensure that the `fieldObjects` parameter is provided.'),i||(g.onclick=()=>!1);return}g.onclick=()=>{i?.();const{fields:o,refs:R,include:t}=d,z=[];if(o.length!==0||R.length!==0){const v=new Set(R);for(const II of o){const MI=this._fieldObjects[II]||[];for(const{id:XI}of MI)v.add(XI)}for(const II of Object.values(this._fieldObjects))for(const MI of II)v.has(MI.id)===t&&z.push(MI)}else for(const v of Object.values(this._fieldObjects))z.push(...v);const O=this.annotationStorage,sI=[];for(const v of z){const{id:II}=v;switch(sI.push(II),v.type){case"text":{const XI=v.defaultValue||"";O.setValue(II,{value:XI});break}case"checkbox":case"radiobutton":{const XI=v.defaultValue===v.exportValues;O.setValue(II,{value:XI});break}case"combobox":case"listbox":{const XI=v.defaultValue||"";O.setValue(II,{value:XI});break}default:continue}const MI=document.querySelector(`[data-element-id="${II}"]`);if(MI){if(!I.has(MI)){(0,l.warn)(`_bindResetFormAction - element not allowed: ${II}`);continue}}else continue;MI.dispatchEvent(new Event("resetform"))}return this.enableScripting&&this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:"app",ids:sI,name:"ResetForm"}}),!1}}}class y extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d})}render(){this.container.classList.add("textAnnotation");const g=document.createElement("img");return g.src=this.imageResourcesPath+"annotation-"+this.data.name.toLowerCase()+".svg",g.alt="[{{type}} Annotation]",g.dataset.l10nId="text_annotation_type",g.dataset.l10nArgs=JSON.stringify({type:this.data.name}),this.data.hasPopup||this._createPopup(g,this.data),this.container.append(g),this.container}}class N extends Z{render(){return this.data.alternativeText&&(this.container.title=this.data.alternativeText),this.container}showElementAndHideCanvas(g){this.data.hasOwnCanvas&&(g.previousSibling?.nodeName==="CANVAS"&&(g.previousSibling.hidden=!0),g.hidden=!1)}_getKeyModifier(g){const{isWin:d,isMac:i}=l.FeatureTest.platform;return d&&g.ctrlKey||i&&g.metaKey}_setEventListener(g,d,i,o){d.includes("mouse")?g.addEventListener(d,R=>{this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:this.data.id,name:i,value:o(R),shift:R.shiftKey,modifier:this._getKeyModifier(R)}})}):g.addEventListener(d,R=>{this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:this.data.id,name:i,value:o(R)}})})}_setEventListeners(g,d,i){for(const[o,R]of d)(R==="Action"||this.data.actions?.[R])&&this._setEventListener(g,o,R,i)}_setBackgroundColor(g){const d=this.data.backgroundColor||null;g.style.backgroundColor=d===null?"transparent":l.Util.makeHexColor(d[0],d[1],d[2])}_setTextStyle(g){const d=["left","center","right"],{fontColor:i}=this.data.defaultAppearanceData,o=this.data.defaultAppearanceData.fontSize||A,R=g.style;let t;const z=2,O=sI=>Math.round(10*sI)/10;if(this.data.multiLine){const sI=Math.abs(this.data.rect[3]-this.data.rect[1]-z),v=Math.round(sI/(l.LINE_FACTOR*o))||1,II=sI/v;t=Math.min(o,O(II/l.LINE_FACTOR))}else{const sI=Math.abs(this.data.rect[3]-this.data.rect[1]-z);t=Math.min(o,O(sI/l.LINE_FACTOR))}R.fontSize=`calc(${t}px * var(--scale-factor))`,R.color=l.Util.makeHexColor(i[0],i[1],i[2]),this.data.textAlignment!==null&&(R.textAlign=d[this.data.textAlignment])}_setRequired(g,d){d?g.setAttribute("required",!0):g.removeAttribute("required"),g.setAttribute("aria-required",d)}}class Y extends N{constructor(g){const d=g.renderForms||!g.data.hasAppearance&&!!g.data.fieldValue;super(g,{isRenderable:d})}setPropertyOnSiblings(g,d,i,o){const R=this.annotationStorage;for(const t of this._getElementsByName(g.name,g.id))t.domElement&&(t.domElement[d]=i),R.setValue(t.id,{[o]:i})}render(){const g=this.annotationStorage,d=this.data.id;this.container.classList.add("textWidgetAnnotation");let i=null;if(this.renderForms){const o=g.getValue(d,{value:this.data.fieldValue});let R=o.value||"";const t=g.getValue(d,{charLimit:this.data.maxLen}).charLimit;t&&R.length>t&&(R=R.slice(0,t));let z=o.formattedValue||this.data.textContent?.join(`
`)||null;z&&this.data.comb&&(z=z.replaceAll(/\s+/g,""));const O={userValue:R,formattedValue:z,lastCommittedValue:null,commitKey:1};this.data.multiLine?(i=document.createElement("textarea"),i.textContent=z??R,this.data.doNotScroll&&(i.style.overflowY="hidden")):(i=document.createElement("input"),i.type="text",i.setAttribute("value",z??R),this.data.doNotScroll&&(i.style.overflowX="hidden")),this.data.hasOwnCanvas&&(i.hidden=!0),I.add(i),i.setAttribute("data-element-id",d),i.disabled=this.data.readOnly,i.name=this.data.fieldName,i.tabIndex=X,this._setRequired(i,this.data.required),t&&(i.maxLength=t),i.addEventListener("input",v=>{g.setValue(d,{value:v.target.value}),this.setPropertyOnSiblings(i,"value",v.target.value,"value"),O.formattedValue=null}),i.addEventListener("resetform",v=>{const II=this.data.defaultFieldValue??"";i.value=O.userValue=II,O.formattedValue=null});let sI=v=>{const{formattedValue:II}=O;II!=null&&(v.target.value=II),v.target.scrollLeft=0};if(this.enableScripting&&this.hasJSActions){i.addEventListener("focus",II=>{const{target:MI}=II;O.userValue&&(MI.value=O.userValue),O.lastCommittedValue=MI.value,O.commitKey=1}),i.addEventListener("updatefromsandbox",II=>{this.showElementAndHideCanvas(II.target);const MI={value(XI){O.userValue=XI.detail.value??"",g.setValue(d,{value:O.userValue.toString()}),XI.target.value=O.userValue},formattedValue(XI){const{formattedValue:uI}=XI.detail;O.formattedValue=uI,uI!=null&&XI.target!==document.activeElement&&(XI.target.value=uI),g.setValue(d,{formattedValue:uI})},selRange(XI){XI.target.setSelectionRange(...XI.detail.selRange)},charLimit:XI=>{const{charLimit:uI}=XI.detail,{target:DI}=XI;if(uI===0){DI.removeAttribute("maxLength");return}DI.setAttribute("maxLength",uI);let HI=O.userValue;!HI||HI.length<=uI||(HI=HI.slice(0,uI),DI.value=O.userValue=HI,g.setValue(d,{value:HI}),this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:d,name:"Keystroke",value:HI,willCommit:!0,commitKey:1,selStart:DI.selectionStart,selEnd:DI.selectionEnd}}))}};this._dispatchEventFromSandbox(MI,II)}),i.addEventListener("keydown",II=>{O.commitKey=1;let MI=-1;if(II.key==="Escape"?MI=0:II.key==="Enter"&&!this.data.multiLine?MI=2:II.key==="Tab"&&(O.commitKey=3),MI===-1)return;const{value:XI}=II.target;O.lastCommittedValue!==XI&&(O.lastCommittedValue=XI,O.userValue=XI,this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:d,name:"Keystroke",value:XI,willCommit:!0,commitKey:MI,selStart:II.target.selectionStart,selEnd:II.target.selectionEnd}}))});const v=sI;sI=null,i.addEventListener("blur",II=>{if(!II.relatedTarget)return;const{value:MI}=II.target;O.userValue=MI,O.lastCommittedValue!==MI&&this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:d,name:"Keystroke",value:MI,willCommit:!0,commitKey:O.commitKey,selStart:II.target.selectionStart,selEnd:II.target.selectionEnd}}),v(II)}),this.data.actions?.Keystroke&&i.addEventListener("beforeinput",II=>{O.lastCommittedValue=null;const{data:MI,target:XI}=II,{value:uI,selectionStart:DI,selectionEnd:HI}=XI;let SI=DI,pI=HI;switch(II.inputType){case"deleteWordBackward":{const eI=uI.substring(0,DI).match(/\w*[^\w]*$/);eI&&(SI-=eI[0].length);break}case"deleteWordForward":{const eI=uI.substring(DI).match(/^[^\w]*\w*/);eI&&(pI+=eI[0].length);break}case"deleteContentBackward":DI===HI&&(SI-=1);break;case"deleteContentForward":DI===HI&&(pI+=1);break}II.preventDefault(),this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:d,name:"Keystroke",value:uI,change:MI||"",willCommit:!1,selStart:SI,selEnd:pI}})}),this._setEventListeners(i,[["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],II=>II.target.value)}if(sI&&i.addEventListener("blur",sI),this.data.comb){const II=(this.data.rect[2]-this.data.rect[0])/t;i.classList.add("comb"),i.style.letterSpacing=`calc(${II}px * var(--scale-factor) - 1ch)`}}else i=document.createElement("div"),i.textContent=this.data.fieldValue,i.style.verticalAlign="middle",i.style.display="table-cell";return this._setTextStyle(i),this._setBackgroundColor(i),this._setDefaultPropertiesFromJS(i),this.container.append(i),this.container}}class k extends N{constructor(g){super(g,{isRenderable:g.renderForms})}render(){const g=this.annotationStorage,d=this.data,i=d.id;let o=g.getValue(i,{value:d.exportValue===d.fieldValue}).value;typeof o=="string"&&(o=o!=="Off",g.setValue(i,{value:o})),this.container.classList.add("buttonWidgetAnnotation","checkBox");const R=document.createElement("input");return I.add(R),R.setAttribute("data-element-id",i),R.disabled=d.readOnly,this._setRequired(R,this.data.required),R.type="checkbox",R.name=d.fieldName,o&&R.setAttribute("checked",!0),R.setAttribute("exportValue",d.exportValue),R.tabIndex=X,R.addEventListener("change",t=>{const{name:z,checked:O}=t.target;for(const sI of this._getElementsByName(z,i)){const v=O&&sI.exportValue===d.exportValue;sI.domElement&&(sI.domElement.checked=v),g.setValue(sI.id,{value:v})}g.setValue(i,{value:O})}),R.addEventListener("resetform",t=>{const z=d.defaultFieldValue||"Off";t.target.checked=z===d.exportValue}),this.enableScripting&&this.hasJSActions&&(R.addEventListener("updatefromsandbox",t=>{const z={value(O){O.target.checked=O.detail.value!=="Off",g.setValue(i,{value:O.target.checked})}};this._dispatchEventFromSandbox(z,t)}),this._setEventListeners(R,[["change","Validate"],["change","Action"],["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],t=>t.target.checked)),this._setBackgroundColor(R),this._setDefaultPropertiesFromJS(R),this.container.append(R),this.container}}class j extends N{constructor(g){super(g,{isRenderable:g.renderForms})}render(){this.container.classList.add("buttonWidgetAnnotation","radioButton");const g=this.annotationStorage,d=this.data,i=d.id;let o=g.getValue(i,{value:d.fieldValue===d.buttonValue}).value;typeof o=="string"&&(o=o!==d.buttonValue,g.setValue(i,{value:o}));const R=document.createElement("input");if(I.add(R),R.setAttribute("data-element-id",i),R.disabled=d.readOnly,this._setRequired(R,this.data.required),R.type="radio",R.name=d.fieldName,o&&R.setAttribute("checked",!0),R.tabIndex=X,R.addEventListener("change",t=>{const{name:z,checked:O}=t.target;for(const sI of this._getElementsByName(z,i))g.setValue(sI.id,{value:!1});g.setValue(i,{value:O})}),R.addEventListener("resetform",t=>{const z=d.defaultFieldValue;t.target.checked=z!=null&&z===d.buttonValue}),this.enableScripting&&this.hasJSActions){const t=d.buttonValue;R.addEventListener("updatefromsandbox",z=>{const O={value:sI=>{const v=t===sI.detail.value;for(const II of this._getElementsByName(sI.target.name)){const MI=v&&II.id===i;II.domElement&&(II.domElement.checked=MI),g.setValue(II.id,{value:MI})}}};this._dispatchEventFromSandbox(O,z)}),this._setEventListeners(R,[["change","Validate"],["change","Action"],["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"]],z=>z.target.checked)}return this._setBackgroundColor(R),this._setDefaultPropertiesFromJS(R),this.container.append(R),this.container}}class p extends w{constructor(g){super(g,{ignoreBorder:g.data.hasAppearance})}render(){const g=super.render();g.classList.add("buttonWidgetAnnotation","pushButton"),this.data.alternativeText&&(g.title=this.data.alternativeText);const d=g.lastChild;return this.enableScripting&&this.hasJSActions&&d&&(this._setDefaultPropertiesFromJS(d),d.addEventListener("updatefromsandbox",i=>{this._dispatchEventFromSandbox({},i)})),g}}class b extends N{constructor(g){super(g,{isRenderable:g.renderForms})}render(){this.container.classList.add("choiceWidgetAnnotation");const g=this.annotationStorage,d=this.data.id,i=g.getValue(d,{value:this.data.fieldValue}),o=document.createElement("select");I.add(o),o.setAttribute("data-element-id",d),o.disabled=this.data.readOnly,this._setRequired(o,this.data.required),o.name=this.data.fieldName,o.tabIndex=X;let R=this.data.combo&&this.data.options.length>0;this.data.combo||(o.size=this.data.options.length,this.data.multiSelect&&(o.multiple=!0)),o.addEventListener("resetform",v=>{const II=this.data.defaultFieldValue;for(const MI of o.options)MI.selected=MI.value===II});for(const v of this.data.options){const II=document.createElement("option");II.textContent=v.displayValue,II.value=v.exportValue,i.value.includes(v.exportValue)&&(II.setAttribute("selected",!0),R=!1),o.append(II)}let t=null;if(R){const v=document.createElement("option");v.value=" ",v.setAttribute("hidden",!0),v.setAttribute("selected",!0),o.prepend(v),t=()=>{v.remove(),o.removeEventListener("input",t),t=null},o.addEventListener("input",t)}const z=v=>{const II=v?"value":"textContent",{options:MI,multiple:XI}=o;return XI?Array.prototype.filter.call(MI,uI=>uI.selected).map(uI=>uI[II]):MI.selectedIndex===-1?null:MI[MI.selectedIndex][II]};let O=z(!1);const sI=v=>{const II=v.target.options;return Array.prototype.map.call(II,MI=>({displayValue:MI.textContent,exportValue:MI.value}))};return this.enableScripting&&this.hasJSActions?(o.addEventListener("updatefromsandbox",v=>{const II={value(MI){t?.();const XI=MI.detail.value,uI=new Set(Array.isArray(XI)?XI:[XI]);for(const DI of o.options)DI.selected=uI.has(DI.value);g.setValue(d,{value:z(!0)}),O=z(!1)},multipleSelection(MI){o.multiple=!0},remove(MI){const XI=o.options,uI=MI.detail.remove;XI[uI].selected=!1,o.remove(uI),XI.length>0&&Array.prototype.findIndex.call(XI,HI=>HI.selected)===-1&&(XI[0].selected=!0),g.setValue(d,{value:z(!0),items:sI(MI)}),O=z(!1)},clear(MI){for(;o.length!==0;)o.remove(0);g.setValue(d,{value:null,items:[]}),O=z(!1)},insert(MI){const{index:XI,displayValue:uI,exportValue:DI}=MI.detail.insert,HI=o.children[XI],SI=document.createElement("option");SI.textContent=uI,SI.value=DI,HI?HI.before(SI):o.append(SI),g.setValue(d,{value:z(!0),items:sI(MI)}),O=z(!1)},items(MI){const{items:XI}=MI.detail;for(;o.length!==0;)o.remove(0);for(const uI of XI){const{displayValue:DI,exportValue:HI}=uI,SI=document.createElement("option");SI.textContent=DI,SI.value=HI,o.append(SI)}o.options.length>0&&(o.options[0].selected=!0),g.setValue(d,{value:z(!0),items:sI(MI)}),O=z(!1)},indices(MI){const XI=new Set(MI.detail.indices);for(const uI of MI.target.options)uI.selected=XI.has(uI.index);g.setValue(d,{value:z(!0)}),O=z(!1)},editable(MI){MI.target.disabled=!MI.detail.editable}};this._dispatchEventFromSandbox(II,v)}),o.addEventListener("input",v=>{const II=z(!0);g.setValue(d,{value:II}),v.preventDefault(),this.linkService.eventBus?.dispatch("dispatcheventinsandbox",{source:this,detail:{id:d,name:"Keystroke",value:O,changeEx:II,willCommit:!1,commitKey:1,keyDown:!1}})}),this._setEventListeners(o,[["focus","Focus"],["blur","Blur"],["mousedown","Mouse Down"],["mouseenter","Mouse Enter"],["mouseleave","Mouse Exit"],["mouseup","Mouse Up"],["input","Action"],["input","Validate"]],v=>v.target.value)):o.addEventListener("input",function(v){g.setValue(d,{value:z(!0)})}),this.data.combo&&this._setTextStyle(o),this._setBackgroundColor(o),this._setDefaultPropertiesFromJS(o),this.container.append(o),this.container}}class B extends Z{static IGNORE_TYPES=new Set(["Line","Square","Circle","PolyLine","Polygon","Ink"]);constructor(g){const{data:d}=g,i=!B.IGNORE_TYPES.has(d.parentType)&&!!(d.titleObj?.str||d.contentsObj?.str||d.richText?.str);super(g,{isRenderable:i})}render(){this.container.classList.add("popupAnnotation");const g=this.layer.querySelectorAll(`[data-annotation-id="${this.data.parentId}"]`);if(g.length===0)return this.container;const d=new u({container:this.container,trigger:Array.from(g),color:this.data.color,titleObj:this.data.titleObj,modificationDate:this.data.modificationDate,contentsObj:this.data.contentsObj,richText:this.data.richText}),i=this.page,o=l.Util.normalizeRect([this.data.parentRect[0],i.view[3]-this.data.parentRect[1]+i.view[1],this.data.parentRect[2],i.view[3]-this.data.parentRect[3]+i.view[1]]),R=o[0]+this.data.parentRect[2]-this.data.parentRect[0],t=o[1],{pageWidth:z,pageHeight:O,pageX:sI,pageY:v}=this.viewport.rawDims;return this.container.style.left=`${100*(R-sI)/z}%`,this.container.style.top=`${100*(t-v)/O}%`,this.container.append(d.render()),this.container}}class u{constructor(g){this.container=g.container,this.trigger=g.trigger,this.color=g.color,this.titleObj=g.titleObj,this.modificationDate=g.modificationDate,this.contentsObj=g.contentsObj,this.richText=g.richText,this.hideWrapper=g.hideWrapper||!1,this.pinned=!1}render(){const d=document.createElement("div");d.classList.add("popupWrapper"),this.hideElement=this.hideWrapper?d:this.container,this.hideElement.hidden=!0;const i=document.createElement("div");i.classList.add("popup");const o=this.color;if(o){const z=.7*(255-o[0])+o[0],O=.7*(255-o[1])+o[1],sI=.7*(255-o[2])+o[2];i.style.backgroundColor=l.Util.makeHexColor(z|0,O|0,sI|0)}const R=document.createElement("h1");R.dir=this.titleObj.dir,R.textContent=this.titleObj.str,i.append(R);const t=s.PDFDateString.toDateObject(this.modificationDate);if(t){const z=document.createElement("span");z.classList.add("popupDate"),z.textContent="{{date}}, {{time}}",z.dataset.l10nId="annotation_date_string",z.dataset.l10nArgs=JSON.stringify({date:t.toLocaleDateString(),time:t.toLocaleTimeString()}),i.append(z)}if(this.richText?.str&&(!this.contentsObj?.str||this.contentsObj.str===this.richText.str))L.XfaLayer.render({xfaHtml:this.richText.html,intent:"richText",div:i}),i.lastChild.classList.add("richText","popupContent");else{const z=this._formatContents(this.contentsObj);i.append(z)}Array.isArray(this.trigger)||(this.trigger=[this.trigger]);for(const z of this.trigger)z.addEventListener("click",this._toggle.bind(this)),z.addEventListener("mouseover",this._show.bind(this,!1)),z.addEventListener("mouseout",this._hide.bind(this,!1));return i.addEventListener("click",this._hide.bind(this,!0)),d.append(i),d}_formatContents({str:g,dir:d}){const i=document.createElement("p");i.classList.add("popupContent"),i.dir=d;const o=g.split(/(?:\r\n?|\n)/);for(let R=0,t=o.length;R<t;++R){const z=o[R];i.append(document.createTextNode(z)),R<t-1&&i.append(document.createElement("br"))}return i}_toggle(){this.pinned?this._hide(!0):this._show(!0)}_show(g=!1){g&&(this.pinned=!0),this.hideElement.hidden&&(this.hideElement.hidden=!1,this.container.style.zIndex=parseInt(this.container.style.zIndex)+1e3)}_hide(g=!0){g&&(this.pinned=!1),!this.hideElement.hidden&&!this.pinned&&(this.hideElement.hidden=!0,this.container.style.zIndex=parseInt(this.container.style.zIndex)-1e3)}}class T extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0}),this.textContent=g.data.textContent}render(){if(this.container.classList.add("freeTextAnnotation"),this.textContent){const g=document.createElement("div");g.classList.add("annotationTextContent"),g.setAttribute("role","comment");for(const d of this.textContent){const i=document.createElement("span");i.textContent=d,g.append(i)}this.container.append(g)}return this.data.hasPopup||this._createPopup(null,this.data),this.container}}class J extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0})}render(){this.container.classList.add("lineAnnotation");const g=this.data,{width:d,height:i}=m(g.rect),o=this.svgFactory.create(d,i,!0),R=this.svgFactory.createElement("svg:line");return R.setAttribute("x1",g.rect[2]-g.lineCoordinates[0]),R.setAttribute("y1",g.rect[3]-g.lineCoordinates[1]),R.setAttribute("x2",g.rect[2]-g.lineCoordinates[2]),R.setAttribute("y2",g.rect[3]-g.lineCoordinates[3]),R.setAttribute("stroke-width",g.borderStyle.width||1),R.setAttribute("stroke","transparent"),R.setAttribute("fill","transparent"),o.append(R),this.container.append(o),this._createPopup(R,g),this.container}}class r extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0})}render(){this.container.classList.add("squareAnnotation");const g=this.data,{width:d,height:i}=m(g.rect),o=this.svgFactory.create(d,i,!0),R=g.borderStyle.width,t=this.svgFactory.createElement("svg:rect");return t.setAttribute("x",R/2),t.setAttribute("y",R/2),t.setAttribute("width",d-R),t.setAttribute("height",i-R),t.setAttribute("stroke-width",R||1),t.setAttribute("stroke","transparent"),t.setAttribute("fill","transparent"),o.append(t),this.container.append(o),this._createPopup(t,g),this.container}}class q extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0})}render(){this.container.classList.add("circleAnnotation");const g=this.data,{width:d,height:i}=m(g.rect),o=this.svgFactory.create(d,i,!0),R=g.borderStyle.width,t=this.svgFactory.createElement("svg:ellipse");return t.setAttribute("cx",d/2),t.setAttribute("cy",i/2),t.setAttribute("rx",d/2-R/2),t.setAttribute("ry",i/2-R/2),t.setAttribute("stroke-width",R||1),t.setAttribute("stroke","transparent"),t.setAttribute("fill","transparent"),o.append(t),this.container.append(o),this._createPopup(t,g),this.container}}class hI extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0}),this.containerClassName="polylineAnnotation",this.svgElementName="svg:polyline"}render(){this.container.classList.add(this.containerClassName);const g=this.data,{width:d,height:i}=m(g.rect),o=this.svgFactory.create(d,i,!0);let R=[];for(const z of g.vertices){const O=z.x-g.rect[0],sI=g.rect[3]-z.y;R.push(O+","+sI)}R=R.join(" ");const t=this.svgFactory.createElement(this.svgElementName);return t.setAttribute("points",R),t.setAttribute("stroke-width",g.borderStyle.width||1),t.setAttribute("stroke","transparent"),t.setAttribute("fill","transparent"),o.append(t),this.container.append(o),this._createPopup(t,g),this.container}}class KI extends hI{constructor(g){super(g),this.containerClassName="polygonAnnotation",this.svgElementName="svg:polygon"}}class NI extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0})}render(){return this.container.classList.add("caretAnnotation"),this.data.hasPopup||this._createPopup(null,this.data),this.container}}class yI extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0}),this.containerClassName="inkAnnotation",this.svgElementName="svg:polyline"}render(){this.container.classList.add(this.containerClassName);const g=this.data,{width:d,height:i}=m(g.rect),o=this.svgFactory.create(d,i,!0);for(const R of g.inkLists){let t=[];for(const O of R){const sI=O.x-g.rect[0],v=g.rect[3]-O.y;t.push(`${sI},${v}`)}t=t.join(" ");const z=this.svgFactory.createElement(this.svgElementName);z.setAttribute("points",t),z.setAttribute("stroke-width",g.borderStyle.width||1),z.setAttribute("stroke","transparent"),z.setAttribute("fill","transparent"),this._createPopup(z,g),o.append(z)}return this.container.append(o),this.container}}class oI extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0,createQuadrilaterals:!0})}render(){return this.data.hasPopup||this._createPopup(null,this.data),this.quadrilaterals?this._renderQuadrilaterals("highlightAnnotation"):(this.container.classList.add("highlightAnnotation"),this.container)}}class U extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0,createQuadrilaterals:!0})}render(){return this.data.hasPopup||this._createPopup(null,this.data),this.quadrilaterals?this._renderQuadrilaterals("underlineAnnotation"):(this.container.classList.add("underlineAnnotation"),this.container)}}class Q extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0,createQuadrilaterals:!0})}render(){return this.data.hasPopup||this._createPopup(null,this.data),this.quadrilaterals?this._renderQuadrilaterals("squigglyAnnotation"):(this.container.classList.add("squigglyAnnotation"),this.container)}}class D extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0,createQuadrilaterals:!0})}render(){return this.data.hasPopup||this._createPopup(null,this.data),this.quadrilaterals?this._renderQuadrilaterals("strikeoutAnnotation"):(this.container.classList.add("strikeoutAnnotation"),this.container)}}class G extends Z{constructor(g){const d=!!(g.data.hasPopup||g.data.titleObj?.str||g.data.contentsObj?.str||g.data.richText?.str);super(g,{isRenderable:d,ignoreBorder:!0})}render(){return this.container.classList.add("stampAnnotation"),this.data.hasPopup||this._createPopup(null,this.data),this.container}}class c extends Z{constructor(g){super(g,{isRenderable:!0});const{filename:d,content:i}=this.data.file;this.filename=(0,s.getFilenameFromUrl)(d,!0),this.content=i,this.linkService.eventBus?.dispatch("fileattachmentannotation",{source:this,filename:d,content:i})}render(){this.container.classList.add("fileAttachmentAnnotation");let g;return this.data.hasAppearance?g=document.createElement("div"):(g=document.createElement("img"),g.src=`${this.imageResourcesPath}annotation-${/paperclip/i.test(this.data.name)?"paperclip":"pushpin"}.svg`),g.classList.add("popupTriggerArea"),g.addEventListener("dblclick",this._download.bind(this)),!this.data.hasPopup&&(this.data.titleObj?.str||this.data.contentsObj?.str||this.data.richText)&&this._createPopup(g,this.data),this.container.append(g),this.container}_download(){this.downloadManager?.openOrDownloadData(this.container,this.content,this.filename)}}class V{static#I(g,d,i,o){const R=g.firstChild||g;R.id=`${s.AnnotationPrefix}${d}`,i.append(g),o?.moveElementInDOM(i,g,R,!1)}static render(g){const{annotations:d,div:i,viewport:o,accessibilityManager:R}=g;(0,s.setLayerDimensions)(i,o);const t={data:null,layer:i,page:g.page,viewport:o,linkService:g.linkService,downloadManager:g.downloadManager,imageResourcesPath:g.imageResourcesPath||"",renderForms:g.renderForms!==!1,svgFactory:new s.DOMSVGFactory,annotationStorage:g.annotationStorage||new S.AnnotationStorage,enableScripting:g.enableScripting===!0,hasJSActions:g.hasJSActions,fieldObjects:g.fieldObjects};let z=0;for(const O of d){if(O.noHTML)continue;if(O.annotationType!==l.AnnotationType.POPUP){const{width:II,height:MI}=m(O.rect);if(II<=0||MI<=0)continue}t.data=O;const sI=W.create(t);if(!sI.isRenderable)continue;const v=sI.render();if(O.hidden&&(v.style.visibility="hidden"),Array.isArray(v))for(const II of v)II.style.zIndex=z++,V.#I(II,O.id,i,R);else v.style.zIndex=z++,sI instanceof B?i.prepend(v):V.#I(v,O.id,i,R)}this.#g(i,g.annotationCanvasMap)}static update(g){const{annotationCanvasMap:d,div:i,viewport:o}=g;(0,s.setLayerDimensions)(i,{rotation:o.rotation}),this.#g(i,d),i.hidden=!1}static#g(g,d){if(d){for(const[i,o]of d){const R=g.querySelector(`[data-annotation-id="${i}"]`);if(!R)continue;const{firstChild:t}=R;t?t.nodeName==="CANVAS"?t.replaceWith(o):t.before(o):R.append(o)}d.clear()}}}C.AnnotationLayer=V},(F,C)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.ColorConverters=void 0;function a(s){return Math.floor(Math.max(0,Math.min(1,s))*255).toString(16).padStart(2,"0")}class l{static CMYK_G([S,M,L,X]){return["G",1-Math.min(1,.3*S+.59*L+.11*M+X)]}static G_CMYK([S]){return["CMYK",0,0,0,1-S]}static G_RGB([S]){return["RGB",S,S,S]}static G_HTML([S]){const M=a(S);return`#${M}${M}${M}`}static RGB_G([S,M,L]){return["G",.3*S+.59*M+.11*L]}static RGB_HTML([S,M,L]){const X=a(S),A=a(M),I=a(L);return`#${X}${A}${I}`}static T_HTML(){return"#00000000"}static CMYK_RGB([S,M,L,X]){return["RGB",1-Math.min(1,S+X),1-Math.min(1,L+X),1-Math.min(1,M+X)]}static CMYK_HTML(S){const M=this.CMYK_RGB(S).slice(1);return this.RGB_HTML(M)}static RGB_CMYK([S,M,L]){const X=1-S,A=1-M,I=1-L,m=Math.min(X,A,I);return["CMYK",X,A,I,m]}}C.ColorConverters=l},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.XfaLayer=void 0;var l=a(19);class s{static setupStorage(M,L,X,A,I){const m=A.getValue(L,{value:null});switch(X.name){case"textarea":if(m.value!==null&&(M.textContent=m.value),I==="print")break;M.addEventListener("input",W=>{A.setValue(L,{value:W.target.value})});break;case"input":if(X.attributes.type==="radio"||X.attributes.type==="checkbox"){if(m.value===X.attributes.xfaOn?M.setAttribute("checked",!0):m.value===X.attributes.xfaOff&&M.removeAttribute("checked"),I==="print")break;M.addEventListener("change",W=>{A.setValue(L,{value:W.target.checked?W.target.getAttribute("xfaOn"):W.target.getAttribute("xfaOff")})})}else{if(m.value!==null&&M.setAttribute("value",m.value),I==="print")break;M.addEventListener("input",W=>{A.setValue(L,{value:W.target.value})})}break;case"select":if(m.value!==null)for(const W of X.children)W.attributes.value===m.value&&(W.attributes.selected=!0);M.addEventListener("input",W=>{const Z=W.target.options,w=Z.selectedIndex===-1?"":Z[Z.selectedIndex].value;A.setValue(L,{value:w})});break}}static setAttributes({html:M,element:L,storage:X=null,intent:A,linkService:I}){const{attributes:m}=L,W=M instanceof HTMLAnchorElement;m.type==="radio"&&(m.name=`${m.name}-${A}`);for(const[Z,w]of Object.entries(m))if(w!=null)switch(Z){case"class":w.length&&M.setAttribute(Z,w.join(" "));break;case"dataId":break;case"id":M.setAttribute("data-element-id",w);break;case"style":Object.assign(M.style,w);break;case"textContent":M.textContent=w;break;default:(!W||Z!=="href"&&Z!=="newWindow")&&M.setAttribute(Z,w)}W&&I.addLinkAttributes(M,m.href,m.newWindow),X&&m.dataId&&this.setupStorage(M,m.dataId,L,X)}static render(M){const L=M.annotationStorage,X=M.linkService,A=M.xfaHtml,I=M.intent||"display",m=document.createElement(A.name);A.attributes&&this.setAttributes({html:m,element:A,intent:I,linkService:X});const W=[[A,-1,m]],Z=M.div;if(Z.append(m),M.viewport){const y=`matrix(${M.viewport.transform.join(",")})`;Z.style.transform=y}I!=="richText"&&Z.setAttribute("class","xfaLayer xfaFont");const w=[];for(;W.length>0;){const[y,N,Y]=W.at(-1);if(N+1===y.children.length){W.pop();continue}const k=y.children[++W.at(-1)[1]];if(k===null)continue;const{name:j}=k;if(j==="#text"){const b=document.createTextNode(k.value);w.push(b),Y.append(b);continue}let p;if(k?.attributes?.xmlns?p=document.createElementNS(k.attributes.xmlns,j):p=document.createElement(j),Y.append(p),k.attributes&&this.setAttributes({html:p,element:k,storage:L,intent:I,linkService:X}),k.children&&k.children.length>0)W.push([k,-1,p]);else if(k.value){const b=document.createTextNode(k.value);l.XfaText.shouldBuildText(j)&&w.push(b),p.append(b)}}for(const y of Z.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea"))y.setAttribute("readOnly",!0);return{textDivs:w}}static update(M){const L=`matrix(${M.viewport.transform.join(",")})`;M.div.style.transform=L,M.div.hidden=!1}}C.XfaLayer=s},(F,C,a)=>{Object.defineProperty(C,"__esModule",{value:!0}),C.SVGGraphics=void 0;var l=a(6),s=a(1),S=a(10);let M=class{constructor(){(0,s.unreachable)("Not implemented: SVGGraphics")}};C.SVGGraphics=M;{let y=function(b){let B=[];const u=[];for(const T of b){if(T.fn==="save"){B.push({fnId:92,fn:"group",items:[]}),u.push(B),B=B.at(-1).items;continue}T.fn==="restore"?B=u.pop():B.push(T)}return B},N=function(b){if(Number.isInteger(b))return b.toString();const B=b.toFixed(10);let u=B.length-1;if(B[u]!=="0")return B;do u--;while(B[u]==="0");return B.substring(0,B[u]==="."?u:u+1)},Y=function(b){if(b[4]===0&&b[5]===0){if(b[1]===0&&b[2]===0)return b[0]===1&&b[3]===1?"":`scale(${N(b[0])} ${N(b[3])})`;if(b[0]===b[3]&&b[1]===-b[2]){const B=Math.acos(b[0])*180/Math.PI;return`rotate(${N(B)})`}}else if(b[0]===1&&b[1]===0&&b[2]===0&&b[3]===1)return`translate(${N(b[4])} ${N(b[5])})`;return`matrix(${N(b[0])} ${N(b[1])} ${N(b[2])} ${N(b[3])} ${N(b[4])} ${N(b[5])})`};const L={fontStyle:"normal",fontWeight:"normal",fillColor:"#000000"},X="http://www.w3.org/XML/1998/namespace",A="http://www.w3.org/1999/xlink",I=["butt","round","square"],m=["miter","round","bevel"],W=function(b,B="",u=!1){if(URL.createObjectURL&&typeof Blob<"u"&&!u)return URL.createObjectURL(new Blob([b],{type:B}));const T="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";let J=`data:${B};base64,`;for(let r=0,q=b.length;r<q;r+=3){const hI=b[r]&255,KI=b[r+1]&255,NI=b[r+2]&255,yI=hI>>2,oI=(hI&3)<<4|KI>>4,U=r+1<q?(KI&15)<<2|NI>>6:64,Q=r+2<q?NI&63:64;J+=T[yI]+T[oI]+T[U]+T[Q]}return J},Z=function(){const b=new Uint8Array([137,80,78,71,13,10,26,10]),B=12,u=new Int32Array(256);for(let NI=0;NI<256;NI++){let yI=NI;for(let oI=0;oI<8;oI++)yI&1?yI=3988292384^yI>>1&2147483647:yI=yI>>1&2147483647;u[NI]=yI}function T(NI,yI,oI){let U=-1;for(let Q=yI;Q<oI;Q++){const D=(U^NI[Q])&255,G=u[D];U=U>>>8^G}return U^-1}function J(NI,yI,oI,U){let Q=U;const D=yI.length;oI[Q]=D>>24&255,oI[Q+1]=D>>16&255,oI[Q+2]=D>>8&255,oI[Q+3]=D&255,Q+=4,oI[Q]=NI.charCodeAt(0)&255,oI[Q+1]=NI.charCodeAt(1)&255,oI[Q+2]=NI.charCodeAt(2)&255,oI[Q+3]=NI.charCodeAt(3)&255,Q+=4,oI.set(yI,Q),Q+=yI.length;const G=T(oI,U+4,Q);oI[Q]=G>>24&255,oI[Q+1]=G>>16&255,oI[Q+2]=G>>8&255,oI[Q+3]=G&255}function r(NI,yI,oI){let U=1,Q=0;for(let D=yI;D<oI;++D)U=(U+(NI[D]&255))%65521,Q=(Q+U)%65521;return Q<<16|U}function q(NI){if(!S.isNodeJS)return hI(NI);try{let yI;parseInt(process.versions.node)>=8?yI=NI:yI=Buffer.from(NI);const oI=require$$5.deflateSync(yI,{level:9});return oI instanceof Uint8Array?oI:new Uint8Array(oI)}catch(yI){(0,s.warn)("Not compressing PNG because zlib.deflateSync is unavailable: "+yI)}return hI(NI)}function hI(NI){let yI=NI.length;const oI=65535,U=Math.ceil(yI/oI),Q=new Uint8Array(2+yI+U*5+4);let D=0;Q[D++]=120,Q[D++]=156;let G=0;for(;yI>oI;)Q[D++]=0,Q[D++]=255,Q[D++]=255,Q[D++]=0,Q[D++]=0,Q.set(NI.subarray(G,G+oI),D),D+=oI,G+=oI,yI-=oI;Q[D++]=1,Q[D++]=yI&255,Q[D++]=yI>>8&255,Q[D++]=~yI&65535&255,Q[D++]=(~yI&65535)>>8&255,Q.set(NI.subarray(G),D),D+=NI.length-G;const c=r(NI,0,NI.length);return Q[D++]=c>>24&255,Q[D++]=c>>16&255,Q[D++]=c>>8&255,Q[D++]=c&255,Q}function KI(NI,yI,oI,U){const Q=NI.width,D=NI.height;let G,c,V;const n=NI.data;switch(yI){case s.ImageKind.GRAYSCALE_1BPP:c=0,G=1,V=Q+7>>3;break;case s.ImageKind.RGB_24BPP:c=2,G=8,V=Q*3;break;case s.ImageKind.RGBA_32BPP:c=6,G=8,V=Q*4;break;default:throw new Error("invalid format")}const g=new Uint8Array((1+V)*D);let d=0,i=0;for(let sI=0;sI<D;++sI)g[d++]=0,g.set(n.subarray(i,i+V),d),i+=V,d+=V;if(yI===s.ImageKind.GRAYSCALE_1BPP&&U){d=0;for(let sI=0;sI<D;sI++){d++;for(let v=0;v<V;v++)g[d++]^=255}}const o=new Uint8Array([Q>>24&255,Q>>16&255,Q>>8&255,Q&255,D>>24&255,D>>16&255,D>>8&255,D&255,G,c,0,0,0]),R=q(g),t=b.length+B*3+o.length+R.length,z=new Uint8Array(t);let O=0;return z.set(b,O),O+=b.length,J("IHDR",o,z,O),O+=B+o.length,J("IDATA",R,z,O),O+=B+R.length,J("IEND",new Uint8Array(0),z,O),W(z,"image/png",oI)}return function(yI,oI,U){const Q=yI.kind===void 0?s.ImageKind.GRAYSCALE_1BPP:yI.kind;return KI(yI,Q,oI,U)}}();class w{constructor(){this.fontSizeScale=1,this.fontWeight=L.fontWeight,this.fontSize=0,this.textMatrix=s.IDENTITY_MATRIX,this.fontMatrix=s.FONT_IDENTITY_MATRIX,this.leading=0,this.textRenderingMode=s.TextRenderingMode.FILL,this.textMatrixScale=1,this.x=0,this.y=0,this.lineX=0,this.lineY=0,this.charSpacing=0,this.wordSpacing=0,this.textHScale=1,this.textRise=0,this.fillColor=L.fillColor,this.strokeColor="#000000",this.fillAlpha=1,this.strokeAlpha=1,this.lineWidth=1,this.lineJoin="",this.lineCap="",this.miterLimit=0,this.dashArray=[],this.dashPhase=0,this.dependencies=[],this.activeClipUrl=null,this.clipGroup=null,this.maskId=""}clone(){return Object.create(this)}setCurrentPoint(B,u){this.x=B,this.y=u}}let k=0,j=0,p=0;C.SVGGraphics=M=class{constructor(b,B,u=!1){(0,l.deprecated)("The SVG back-end is no longer maintained and *may* be removed in the future."),this.svgFactory=new l.DOMSVGFactory,this.current=new w,this.transformMatrix=s.IDENTITY_MATRIX,this.transformStack=[],this.extraStack=[],this.commonObjs=b,this.objs=B,this.pendingClip=null,this.pendingEOFill=!1,this.embedFonts=!1,this.embeddedFonts=Object.create(null),this.cssStyle=null,this.forceDataSchema=!!u,this._operatorIdMapping=[];for(const T in s.OPS)this._operatorIdMapping[s.OPS[T]]=T}getObject(b,B=null){return typeof b=="string"?b.startsWith("g_")?this.commonObjs.get(b):this.objs.get(b):B}save(){this.transformStack.push(this.transformMatrix);const b=this.current;this.extraStack.push(b),this.current=b.clone()}restore(){this.transformMatrix=this.transformStack.pop(),this.current=this.extraStack.pop(),this.pendingClip=null,this.tgrp=null}group(b){this.save(),this.executeOpTree(b),this.restore()}loadDependencies(b){const B=b.fnArray,u=b.argsArray;for(let T=0,J=B.length;T<J;T++)if(B[T]===s.OPS.dependency)for(const r of u[T]){const q=r.startsWith("g_")?this.commonObjs:this.objs,hI=new Promise(KI=>{q.get(r,KI)});this.current.dependencies.push(hI)}return Promise.all(this.current.dependencies)}transform(b,B,u,T,J,r){const q=[b,B,u,T,J,r];this.transformMatrix=s.Util.transform(this.transformMatrix,q),this.tgrp=null}getSVG(b,B){this.viewport=B;const u=this._initialize(B);return this.loadDependencies(b).then(()=>(this.transformMatrix=s.IDENTITY_MATRIX,this.executeOpTree(this.convertOpList(b)),u))}convertOpList(b){const B=this._operatorIdMapping,u=b.argsArray,T=b.fnArray,J=[];for(let r=0,q=T.length;r<q;r++){const hI=T[r];J.push({fnId:hI,fn:B[hI],args:u[r]})}return y(J)}executeOpTree(b){for(const B of b){const u=B.fn,T=B.fnId,J=B.args;switch(T|0){case s.OPS.beginText:this.beginText();break;case s.OPS.dependency:break;case s.OPS.setLeading:this.setLeading(J);break;case s.OPS.setLeadingMoveText:this.setLeadingMoveText(J[0],J[1]);break;case s.OPS.setFont:this.setFont(J);break;case s.OPS.showText:this.showText(J[0]);break;case s.OPS.showSpacedText:this.showText(J[0]);break;case s.OPS.endText:this.endText();break;case s.OPS.moveText:this.moveText(J[0],J[1]);break;case s.OPS.setCharSpacing:this.setCharSpacing(J[0]);break;case s.OPS.setWordSpacing:this.setWordSpacing(J[0]);break;case s.OPS.setHScale:this.setHScale(J[0]);break;case s.OPS.setTextMatrix:this.setTextMatrix(J[0],J[1],J[2],J[3],J[4],J[5]);break;case s.OPS.setTextRise:this.setTextRise(J[0]);break;case s.OPS.setTextRenderingMode:this.setTextRenderingMode(J[0]);break;case s.OPS.setLineWidth:this.setLineWidth(J[0]);break;case s.OPS.setLineJoin:this.setLineJoin(J[0]);break;case s.OPS.setLineCap:this.setLineCap(J[0]);break;case s.OPS.setMiterLimit:this.setMiterLimit(J[0]);break;case s.OPS.setFillRGBColor:this.setFillRGBColor(J[0],J[1],J[2]);break;case s.OPS.setStrokeRGBColor:this.setStrokeRGBColor(J[0],J[1],J[2]);break;case s.OPS.setStrokeColorN:this.setStrokeColorN(J);break;case s.OPS.setFillColorN:this.setFillColorN(J);break;case s.OPS.shadingFill:this.shadingFill(J[0]);break;case s.OPS.setDash:this.setDash(J[0],J[1]);break;case s.OPS.setRenderingIntent:this.setRenderingIntent(J[0]);break;case s.OPS.setFlatness:this.setFlatness(J[0]);break;case s.OPS.setGState:this.setGState(J[0]);break;case s.OPS.fill:this.fill();break;case s.OPS.eoFill:this.eoFill();break;case s.OPS.stroke:this.stroke();break;case s.OPS.fillStroke:this.fillStroke();break;case s.OPS.eoFillStroke:this.eoFillStroke();break;case s.OPS.clip:this.clip("nonzero");break;case s.OPS.eoClip:this.clip("evenodd");break;case s.OPS.paintSolidColorImageMask:this.paintSolidColorImageMask();break;case s.OPS.paintImageXObject:this.paintImageXObject(J[0]);break;case s.OPS.paintInlineImageXObject:this.paintInlineImageXObject(J[0]);break;case s.OPS.paintImageMaskXObject:this.paintImageMaskXObject(J[0]);break;case s.OPS.paintFormXObjectBegin:this.paintFormXObjectBegin(J[0],J[1]);break;case s.OPS.paintFormXObjectEnd:this.paintFormXObjectEnd();break;case s.OPS.closePath:this.closePath();break;case s.OPS.closeStroke:this.closeStroke();break;case s.OPS.closeFillStroke:this.closeFillStroke();break;case s.OPS.closeEOFillStroke:this.closeEOFillStroke();break;case s.OPS.nextLine:this.nextLine();break;case s.OPS.transform:this.transform(J[0],J[1],J[2],J[3],J[4],J[5]);break;case s.OPS.constructPath:this.constructPath(J[0],J[1]);break;case s.OPS.endPath:this.endPath();break;case 92:this.group(B.items);break;default:(0,s.warn)(`Unimplemented operator ${u}`);break}}}setWordSpacing(b){this.current.wordSpacing=b}setCharSpacing(b){this.current.charSpacing=b}nextLine(){this.moveText(0,this.current.leading)}setTextMatrix(b,B,u,T,J,r){const q=this.current;q.textMatrix=q.lineMatrix=[b,B,u,T,J,r],q.textMatrixScale=Math.hypot(b,B),q.x=q.lineX=0,q.y=q.lineY=0,q.xcoords=[],q.ycoords=[],q.tspan=this.svgFactory.createElement("svg:tspan"),q.tspan.setAttributeNS(null,"font-family",q.fontFamily),q.tspan.setAttributeNS(null,"font-size",`${N(q.fontSize)}px`),q.tspan.setAttributeNS(null,"y",N(-q.y)),q.txtElement=this.svgFactory.createElement("svg:text"),q.txtElement.append(q.tspan)}beginText(){const b=this.current;b.x=b.lineX=0,b.y=b.lineY=0,b.textMatrix=s.IDENTITY_MATRIX,b.lineMatrix=s.IDENTITY_MATRIX,b.textMatrixScale=1,b.tspan=this.svgFactory.createElement("svg:tspan"),b.txtElement=this.svgFactory.createElement("svg:text"),b.txtgrp=this.svgFactory.createElement("svg:g"),b.xcoords=[],b.ycoords=[]}moveText(b,B){const u=this.current;u.x=u.lineX+=b,u.y=u.lineY+=B,u.xcoords=[],u.ycoords=[],u.tspan=this.svgFactory.createElement("svg:tspan"),u.tspan.setAttributeNS(null,"font-family",u.fontFamily),u.tspan.setAttributeNS(null,"font-size",`${N(u.fontSize)}px`),u.tspan.setAttributeNS(null,"y",N(-u.y))}showText(b){const B=this.current,u=B.font,T=B.fontSize;if(T===0)return;const J=B.fontSizeScale,r=B.charSpacing,q=B.wordSpacing,hI=B.fontDirection,KI=B.textHScale*hI,NI=u.vertical,yI=NI?1:-1,oI=u.defaultVMetrics,U=T*B.fontMatrix[0];let Q=0;for(const c of b){if(c===null){Q+=hI*q;continue}else if(typeof c=="number"){Q+=yI*c*T/1e3;continue}const V=(c.isSpace?q:0)+r,n=c.fontChar;let g,d,i=c.width;if(NI){let R;const t=c.vmetric||oI;R=c.vmetric?t[1]:i*.5,R=-R*U;const z=t[2]*U;i=t?-t[0]:i,g=R/J,d=(Q+z)/J}else g=Q/J,d=0;(c.isInFont||u.missingFile)&&(B.xcoords.push(B.x+g),NI&&B.ycoords.push(-B.y+d),B.tspan.textContent+=n);let o;NI?o=i*U-V*hI:o=i*U+V*hI,Q+=o}B.tspan.setAttributeNS(null,"x",B.xcoords.map(N).join(" ")),NI?B.tspan.setAttributeNS(null,"y",B.ycoords.map(N).join(" ")):B.tspan.setAttributeNS(null,"y",N(-B.y)),NI?B.y-=Q:B.x+=Q*KI,B.tspan.setAttributeNS(null,"font-family",B.fontFamily),B.tspan.setAttributeNS(null,"font-size",`${N(B.fontSize)}px`),B.fontStyle!==L.fontStyle&&B.tspan.setAttributeNS(null,"font-style",B.fontStyle),B.fontWeight!==L.fontWeight&&B.tspan.setAttributeNS(null,"font-weight",B.fontWeight);const D=B.textRenderingMode&s.TextRenderingMode.FILL_STROKE_MASK;if(D===s.TextRenderingMode.FILL||D===s.TextRenderingMode.FILL_STROKE?(B.fillColor!==L.fillColor&&B.tspan.setAttributeNS(null,"fill",B.fillColor),B.fillAlpha<1&&B.tspan.setAttributeNS(null,"fill-opacity",B.fillAlpha)):B.textRenderingMode===s.TextRenderingMode.ADD_TO_PATH?B.tspan.setAttributeNS(null,"fill","transparent"):B.tspan.setAttributeNS(null,"fill","none"),D===s.TextRenderingMode.STROKE||D===s.TextRenderingMode.FILL_STROKE){const c=1/(B.textMatrixScale||1);this._setStrokeAttributes(B.tspan,c)}let G=B.textMatrix;B.textRise!==0&&(G=G.slice(),G[5]+=B.textRise),B.txtElement.setAttributeNS(null,"transform",`${Y(G)} scale(${N(KI)}, -1)`),B.txtElement.setAttributeNS(X,"xml:space","preserve"),B.txtElement.append(B.tspan),B.txtgrp.append(B.txtElement),this._ensureTransformGroup().append(B.txtElement)}setLeadingMoveText(b,B){this.setLeading(-B),this.moveText(b,B)}addFontStyle(b){if(!b.data)throw new Error('addFontStyle: No font data available, ensure that the "fontExtraProperties" API parameter is set.');this.cssStyle||(this.cssStyle=this.svgFactory.createElement("svg:style"),this.cssStyle.setAttributeNS(null,"type","text/css"),this.defs.append(this.cssStyle));const B=W(b.data,b.mimetype,this.forceDataSchema);this.cssStyle.textContent+=`@font-face { font-family: "${b.loadedName}"; src: url(${B}); }
`}setFont(b){const B=this.current,u=this.commonObjs.get(b[0]);let T=b[1];B.font=u,this.embedFonts&&!u.missingFile&&!this.embeddedFonts[u.loadedName]&&(this.addFontStyle(u),this.embeddedFonts[u.loadedName]=u),B.fontMatrix=u.fontMatrix||s.FONT_IDENTITY_MATRIX;let J="normal";u.black?J="900":u.bold&&(J="bold");const r=u.italic?"italic":"normal";T<0?(T=-T,B.fontDirection=-1):B.fontDirection=1,B.fontSize=T,B.fontFamily=u.loadedName,B.fontWeight=J,B.fontStyle=r,B.tspan=this.svgFactory.createElement("svg:tspan"),B.tspan.setAttributeNS(null,"y",N(-B.y)),B.xcoords=[],B.ycoords=[]}endText(){const b=this.current;b.textRenderingMode&s.TextRenderingMode.ADD_TO_PATH_FLAG&&b.txtElement?.hasChildNodes()&&(b.element=b.txtElement,this.clip("nonzero"),this.endPath())}setLineWidth(b){b>0&&(this.current.lineWidth=b)}setLineCap(b){this.current.lineCap=I[b]}setLineJoin(b){this.current.lineJoin=m[b]}setMiterLimit(b){this.current.miterLimit=b}setStrokeAlpha(b){this.current.strokeAlpha=b}setStrokeRGBColor(b,B,u){this.current.strokeColor=s.Util.makeHexColor(b,B,u)}setFillAlpha(b){this.current.fillAlpha=b}setFillRGBColor(b,B,u){this.current.fillColor=s.Util.makeHexColor(b,B,u),this.current.tspan=this.svgFactory.createElement("svg:tspan"),this.current.xcoords=[],this.current.ycoords=[]}setStrokeColorN(b){this.current.strokeColor=this._makeColorN_Pattern(b)}setFillColorN(b){this.current.fillColor=this._makeColorN_Pattern(b)}shadingFill(b){const B=this.viewport.width,u=this.viewport.height,T=s.Util.inverseTransform(this.transformMatrix),J=s.Util.applyTransform([0,0],T),r=s.Util.applyTransform([0,u],T),q=s.Util.applyTransform([B,0],T),hI=s.Util.applyTransform([B,u],T),KI=Math.min(J[0],r[0],q[0],hI[0]),NI=Math.min(J[1],r[1],q[1],hI[1]),yI=Math.max(J[0],r[0],q[0],hI[0]),oI=Math.max(J[1],r[1],q[1],hI[1]),U=this.svgFactory.createElement("svg:rect");U.setAttributeNS(null,"x",KI),U.setAttributeNS(null,"y",NI),U.setAttributeNS(null,"width",yI-KI),U.setAttributeNS(null,"height",oI-NI),U.setAttributeNS(null,"fill",this._makeShadingPattern(b)),this.current.fillAlpha<1&&U.setAttributeNS(null,"fill-opacity",this.current.fillAlpha),this._ensureTransformGroup().append(U)}_makeColorN_Pattern(b){return b[0]==="TilingPattern"?this._makeTilingPattern(b):this._makeShadingPattern(b)}_makeTilingPattern(b){const B=b[1],u=b[2],T=b[3]||s.IDENTITY_MATRIX,[J,r,q,hI]=b[4],KI=b[5],NI=b[6],yI=b[7],oI=`shading${p++}`,[U,Q,D,G]=s.Util.normalizeRect([...s.Util.applyTransform([J,r],T),...s.Util.applyTransform([q,hI],T)]),[c,V]=s.Util.singularValueDecompose2dScale(T),n=KI*c,g=NI*V,d=this.svgFactory.createElement("svg:pattern");d.setAttributeNS(null,"id",oI),d.setAttributeNS(null,"patternUnits","userSpaceOnUse"),d.setAttributeNS(null,"width",n),d.setAttributeNS(null,"height",g),d.setAttributeNS(null,"x",`${U}`),d.setAttributeNS(null,"y",`${Q}`);const i=this.svg,o=this.transformMatrix,R=this.current.fillColor,t=this.current.strokeColor,z=this.svgFactory.create(D-U,G-Q);if(this.svg=z,this.transformMatrix=T,yI===2){const O=s.Util.makeHexColor(...B);this.current.fillColor=O,this.current.strokeColor=O}return this.executeOpTree(this.convertOpList(u)),this.svg=i,this.transformMatrix=o,this.current.fillColor=R,this.current.strokeColor=t,d.append(z.childNodes[0]),this.defs.append(d),`url(#${oI})`}_makeShadingPattern(b){switch(typeof b=="string"&&(b=this.objs.get(b)),b[0]){case"RadialAxial":const B=`shading${p++}`,u=b[3];let T;switch(b[1]){case"axial":const J=b[4],r=b[5];T=this.svgFactory.createElement("svg:linearGradient"),T.setAttributeNS(null,"id",B),T.setAttributeNS(null,"gradientUnits","userSpaceOnUse"),T.setAttributeNS(null,"x1",J[0]),T.setAttributeNS(null,"y1",J[1]),T.setAttributeNS(null,"x2",r[0]),T.setAttributeNS(null,"y2",r[1]);break;case"radial":const q=b[4],hI=b[5],KI=b[6],NI=b[7];T=this.svgFactory.createElement("svg:radialGradient"),T.setAttributeNS(null,"id",B),T.setAttributeNS(null,"gradientUnits","userSpaceOnUse"),T.setAttributeNS(null,"cx",hI[0]),T.setAttributeNS(null,"cy",hI[1]),T.setAttributeNS(null,"r",NI),T.setAttributeNS(null,"fx",q[0]),T.setAttributeNS(null,"fy",q[1]),T.setAttributeNS(null,"fr",KI);break;default:throw new Error(`Unknown RadialAxial type: ${b[1]}`)}for(const J of u){const r=this.svgFactory.createElement("svg:stop");r.setAttributeNS(null,"offset",J[0]),r.setAttributeNS(null,"stop-color",J[1]),T.append(r)}return this.defs.append(T),`url(#${B})`;case"Mesh":return(0,s.warn)("Unimplemented pattern Mesh"),null;case"Dummy":return"hotpink";default:throw new Error(`Unknown IR type: ${b[0]}`)}}setDash(b,B){this.current.dashArray=b,this.current.dashPhase=B}constructPath(b,B){const u=this.current;let T=u.x,J=u.y,r=[],q=0;for(const hI of b)switch(hI|0){case s.OPS.rectangle:T=B[q++],J=B[q++];const KI=B[q++],NI=B[q++],yI=T+KI,oI=J+NI;r.push("M",N(T),N(J),"L",N(yI),N(J),"L",N(yI),N(oI),"L",N(T),N(oI),"Z");break;case s.OPS.moveTo:T=B[q++],J=B[q++],r.push("M",N(T),N(J));break;case s.OPS.lineTo:T=B[q++],J=B[q++],r.push("L",N(T),N(J));break;case s.OPS.curveTo:T=B[q+4],J=B[q+5],r.push("C",N(B[q]),N(B[q+1]),N(B[q+2]),N(B[q+3]),N(T),N(J)),q+=6;break;case s.OPS.curveTo2:r.push("C",N(T),N(J),N(B[q]),N(B[q+1]),N(B[q+2]),N(B[q+3])),T=B[q+2],J=B[q+3],q+=4;break;case s.OPS.curveTo3:T=B[q+2],J=B[q+3],r.push("C",N(B[q]),N(B[q+1]),N(T),N(J),N(T),N(J)),q+=4;break;case s.OPS.closePath:r.push("Z");break}r=r.join(" "),u.path&&b.length>0&&b[0]!==s.OPS.rectangle&&b[0]!==s.OPS.moveTo?r=u.path.getAttributeNS(null,"d")+r:(u.path=this.svgFactory.createElement("svg:path"),this._ensureTransformGroup().append(u.path)),u.path.setAttributeNS(null,"d",r),u.path.setAttributeNS(null,"fill","none"),u.element=u.path,u.setCurrentPoint(T,J)}endPath(){const b=this.current;if(b.path=null,!this.pendingClip)return;if(!b.element){this.pendingClip=null;return}const B=`clippath${k++}`,u=this.svgFactory.createElement("svg:clipPath");u.setAttributeNS(null,"id",B),u.setAttributeNS(null,"transform",Y(this.transformMatrix));const T=b.element.cloneNode(!0);if(this.pendingClip==="evenodd"?T.setAttributeNS(null,"clip-rule","evenodd"):T.setAttributeNS(null,"clip-rule","nonzero"),this.pendingClip=null,u.append(T),this.defs.append(u),b.activeClipUrl){b.clipGroup=null;for(const J of this.extraStack)J.clipGroup=null;u.setAttributeNS(null,"clip-path",b.activeClipUrl)}b.activeClipUrl=`url(#${B})`,this.tgrp=null}clip(b){this.pendingClip=b}closePath(){const b=this.current;if(b.path){const B=`${b.path.getAttributeNS(null,"d")}Z`;b.path.setAttributeNS(null,"d",B)}}setLeading(b){this.current.leading=-b}setTextRise(b){this.current.textRise=b}setTextRenderingMode(b){this.current.textRenderingMode=b}setHScale(b){this.current.textHScale=b/100}setRenderingIntent(b){}setFlatness(b){}setGState(b){for(const[B,u]of b)switch(B){case"LW":this.setLineWidth(u);break;case"LC":this.setLineCap(u);break;case"LJ":this.setLineJoin(u);break;case"ML":this.setMiterLimit(u);break;case"D":this.setDash(u[0],u[1]);break;case"RI":this.setRenderingIntent(u);break;case"FL":this.setFlatness(u);break;case"Font":this.setFont(u);break;case"CA":this.setStrokeAlpha(u);break;case"ca":this.setFillAlpha(u);break;default:(0,s.warn)(`Unimplemented graphic state operator ${B}`);break}}fill(){const b=this.current;b.element&&(b.element.setAttributeNS(null,"fill",b.fillColor),b.element.setAttributeNS(null,"fill-opacity",b.fillAlpha),this.endPath())}stroke(){const b=this.current;b.element&&(this._setStrokeAttributes(b.element),b.element.setAttributeNS(null,"fill","none"),this.endPath())}_setStrokeAttributes(b,B=1){const u=this.current;let T=u.dashArray;B!==1&&T.length>0&&(T=T.map(function(J){return B*J})),b.setAttributeNS(null,"stroke",u.strokeColor),b.setAttributeNS(null,"stroke-opacity",u.strokeAlpha),b.setAttributeNS(null,"stroke-miterlimit",N(u.miterLimit)),b.setAttributeNS(null,"stroke-linecap",u.lineCap),b.setAttributeNS(null,"stroke-linejoin",u.lineJoin),b.setAttributeNS(null,"stroke-width",N(B*u.lineWidth)+"px"),b.setAttributeNS(null,"stroke-dasharray",T.map(N).join(" ")),b.setAttributeNS(null,"stroke-dashoffset",N(B*u.dashPhase)+"px")}eoFill(){this.current.element?.setAttributeNS(null,"fill-rule","evenodd"),this.fill()}fillStroke(){this.stroke(),this.fill()}eoFillStroke(){this.current.element?.setAttributeNS(null,"fill-rule","evenodd"),this.fillStroke()}closeStroke(){this.closePath(),this.stroke()}closeFillStroke(){this.closePath(),this.fillStroke()}closeEOFillStroke(){this.closePath(),this.eoFillStroke()}paintSolidColorImageMask(){const b=this.svgFactory.createElement("svg:rect");b.setAttributeNS(null,"x","0"),b.setAttributeNS(null,"y","0"),b.setAttributeNS(null,"width","1px"),b.setAttributeNS(null,"height","1px"),b.setAttributeNS(null,"fill",this.current.fillColor),this._ensureTransformGroup().append(b)}paintImageXObject(b){const B=this.getObject(b);if(!B){(0,s.warn)(`Dependent image with object ID ${b} is not ready yet`);return}this.paintInlineImageXObject(B)}paintInlineImageXObject(b,B){const u=b.width,T=b.height,J=Z(b,this.forceDataSchema,!!B),r=this.svgFactory.createElement("svg:rect");r.setAttributeNS(null,"x","0"),r.setAttributeNS(null,"y","0"),r.setAttributeNS(null,"width",N(u)),r.setAttributeNS(null,"height",N(T)),this.current.element=r,this.clip("nonzero");const q=this.svgFactory.createElement("svg:image");q.setAttributeNS(A,"xlink:href",J),q.setAttributeNS(null,"x","0"),q.setAttributeNS(null,"y",N(-T)),q.setAttributeNS(null,"width",N(u)+"px"),q.setAttributeNS(null,"height",N(T)+"px"),q.setAttributeNS(null,"transform",`scale(${N(1/u)} ${N(-1/T)})`),B?B.append(q):this._ensureTransformGroup().append(q)}paintImageMaskXObject(b){const B=this.getObject(b.data,b);if(B.bitmap){(0,s.warn)("paintImageMaskXObject: ImageBitmap support is not implemented, ensure that the `isOffscreenCanvasSupported` API parameter is disabled.");return}const u=this.current,T=B.width,J=B.height,r=u.fillColor;u.maskId=`mask${j++}`;const q=this.svgFactory.createElement("svg:mask");q.setAttributeNS(null,"id",u.maskId);const hI=this.svgFactory.createElement("svg:rect");hI.setAttributeNS(null,"x","0"),hI.setAttributeNS(null,"y","0"),hI.setAttributeNS(null,"width",N(T)),hI.setAttributeNS(null,"height",N(J)),hI.setAttributeNS(null,"fill",r),hI.setAttributeNS(null,"mask",`url(#${u.maskId})`),this.defs.append(q),this._ensureTransformGroup().append(hI),this.paintInlineImageXObject(B,q)}paintFormXObjectBegin(b,B){if(Array.isArray(b)&&b.length===6&&this.transform(b[0],b[1],b[2],b[3],b[4],b[5]),B){const u=B[2]-B[0],T=B[3]-B[1],J=this.svgFactory.createElement("svg:rect");J.setAttributeNS(null,"x",B[0]),J.setAttributeNS(null,"y",B[1]),J.setAttributeNS(null,"width",N(u)),J.setAttributeNS(null,"height",N(T)),this.current.element=J,this.clip("nonzero"),this.endPath()}}paintFormXObjectEnd(){}_initialize(b){const B=this.svgFactory.create(b.width,b.height),u=this.svgFactory.createElement("svg:defs");B.append(u),this.defs=u;const T=this.svgFactory.createElement("svg:g");return T.setAttributeNS(null,"transform",Y(b.transform)),B.append(T),this.svg=T,B}_ensureClipGroup(){if(!this.current.clipGroup){const b=this.svgFactory.createElement("svg:g");b.setAttributeNS(null,"clip-path",this.current.activeClipUrl),this.svg.append(b),this.current.clipGroup=b}return this.current.clipGroup}_ensureTransformGroup(){return this.tgrp||(this.tgrp=this.svgFactory.createElement("svg:g"),this.tgrp.setAttributeNS(null,"transform",Y(this.transformMatrix)),this.current.activeClipUrl?this._ensureClipGroup().append(this.tgrp):this.svg.append(this.tgrp)),this.tgrp}}}}],__webpack_module_cache__={};function __w_pdfjs_require__(F){var C=__webpack_module_cache__[F];if(C!==void 0)return C.exports;var a=__webpack_module_cache__[F]={exports:{}};return __webpack_modules__[F](a,a.exports,__w_pdfjs_require__),a.exports}var __webpack_exports__={};return(()=>{var F=__webpack_exports__;Object.defineProperty(F,"__esModule",{value:!0}),Object.defineProperty(F,"AbortException",{enumerable:!0,get:function(){return C.AbortException}}),Object.defineProperty(F,"AnnotationEditorLayer",{enumerable:!0,get:function(){return S.AnnotationEditorLayer}}),Object.defineProperty(F,"AnnotationEditorParamsType",{enumerable:!0,get:function(){return C.AnnotationEditorParamsType}}),Object.defineProperty(F,"AnnotationEditorType",{enumerable:!0,get:function(){return C.AnnotationEditorType}}),Object.defineProperty(F,"AnnotationEditorUIManager",{enumerable:!0,get:function(){return M.AnnotationEditorUIManager}}),Object.defineProperty(F,"AnnotationLayer",{enumerable:!0,get:function(){return L.AnnotationLayer}}),Object.defineProperty(F,"AnnotationMode",{enumerable:!0,get:function(){return C.AnnotationMode}}),Object.defineProperty(F,"CMapCompressionType",{enumerable:!0,get:function(){return C.CMapCompressionType}}),Object.defineProperty(F,"FeatureTest",{enumerable:!0,get:function(){return C.FeatureTest}}),Object.defineProperty(F,"GlobalWorkerOptions",{enumerable:!0,get:function(){return X.GlobalWorkerOptions}}),Object.defineProperty(F,"InvalidPDFException",{enumerable:!0,get:function(){return C.InvalidPDFException}}),Object.defineProperty(F,"MissingPDFException",{enumerable:!0,get:function(){return C.MissingPDFException}}),Object.defineProperty(F,"OPS",{enumerable:!0,get:function(){return C.OPS}}),Object.defineProperty(F,"PDFDataRangeTransport",{enumerable:!0,get:function(){return a.PDFDataRangeTransport}}),Object.defineProperty(F,"PDFDateString",{enumerable:!0,get:function(){return l.PDFDateString}}),Object.defineProperty(F,"PDFWorker",{enumerable:!0,get:function(){return a.PDFWorker}}),Object.defineProperty(F,"PasswordResponses",{enumerable:!0,get:function(){return C.PasswordResponses}}),Object.defineProperty(F,"PermissionFlag",{enumerable:!0,get:function(){return C.PermissionFlag}}),Object.defineProperty(F,"PixelsPerInch",{enumerable:!0,get:function(){return l.PixelsPerInch}}),Object.defineProperty(F,"PromiseCapability",{enumerable:!0,get:function(){return C.PromiseCapability}}),Object.defineProperty(F,"RenderingCancelledException",{enumerable:!0,get:function(){return l.RenderingCancelledException}}),Object.defineProperty(F,"SVGGraphics",{enumerable:!0,get:function(){return A.SVGGraphics}}),Object.defineProperty(F,"UnexpectedResponseException",{enumerable:!0,get:function(){return C.UnexpectedResponseException}}),Object.defineProperty(F,"Util",{enumerable:!0,get:function(){return C.Util}}),Object.defineProperty(F,"VerbosityLevel",{enumerable:!0,get:function(){return C.VerbosityLevel}}),Object.defineProperty(F,"XfaLayer",{enumerable:!0,get:function(){return I.XfaLayer}}),Object.defineProperty(F,"build",{enumerable:!0,get:function(){return a.build}}),Object.defineProperty(F,"createValidAbsoluteUrl",{enumerable:!0,get:function(){return C.createValidAbsoluteUrl}}),Object.defineProperty(F,"getDocument",{enumerable:!0,get:function(){return a.getDocument}}),Object.defineProperty(F,"getFilenameFromUrl",{enumerable:!0,get:function(){return l.getFilenameFromUrl}}),Object.defineProperty(F,"getPdfFilenameFromUrl",{enumerable:!0,get:function(){return l.getPdfFilenameFromUrl}}),Object.defineProperty(F,"getXfaPageViewport",{enumerable:!0,get:function(){return l.getXfaPageViewport}}),Object.defineProperty(F,"isDataScheme",{enumerable:!0,get:function(){return l.isDataScheme}}),Object.defineProperty(F,"isPdfFile",{enumerable:!0,get:function(){return l.isPdfFile}}),Object.defineProperty(F,"loadScript",{enumerable:!0,get:function(){return l.loadScript}}),Object.defineProperty(F,"normalizeUnicode",{enumerable:!0,get:function(){return C.normalizeUnicode}}),Object.defineProperty(F,"renderTextLayer",{enumerable:!0,get:function(){return s.renderTextLayer}}),Object.defineProperty(F,"setLayerDimensions",{enumerable:!0,get:function(){return l.setLayerDimensions}}),Object.defineProperty(F,"shadow",{enumerable:!0,get:function(){return C.shadow}}),Object.defineProperty(F,"updateTextLayer",{enumerable:!0,get:function(){return s.updateTextLayer}}),Object.defineProperty(F,"version",{enumerable:!0,get:function(){return a.version}});var C=__w_pdfjs_require__(1),a=__w_pdfjs_require__(2),l=__w_pdfjs_require__(6),s=__w_pdfjs_require__(26),S=__w_pdfjs_require__(27),M=__w_pdfjs_require__(5),L=__w_pdfjs_require__(30),X=__w_pdfjs_require__(14),A=__w_pdfjs_require__(33),I=__w_pdfjs_require__(32)})(),__webpack_exports__})())})(pdf);var pdfExports=pdf.exports;const pdf_viewer="";var _=Object.defineProperty,$=(F,C,a)=>C in F?_(F,C,{enumerable:!0,configurable:!0,writable:!0,value:a}):F[C]=a,x=(F,C,a)=>($(F,typeof C!="symbol"?C+"":C,a),a);const E="internal-link",gI="link",CI="file-attachment",AI="form-text",ZI="form-select",GI="form-checkbox",lI="form-radio",bI="form-button",dI=["click","dblclick","mouseover","input","change"];function K(F,C,a){const l=[];if(a)for(const s of a)s[F]===C&&l.push(s);return l}function H(F,C){return{type:F,data:C}}function h(F,C){switch(F.type){case"textarea":case"text":return H(AI,{fieldName:F.name,value:F.value});case"select-one":case"select-multiple":const a=[];for(const s of F.options)a.push({value:s.value,label:s.label});const l=[];for(const s of F.selectedOptions)l.push({value:s.value,label:s.label});return H(ZI,{fieldName:F.name,value:l,options:a});case"checkbox":return H(GI,{fieldName:F.name,checked:F.checked});case"radio":return H(lI,{fieldName:F.name,...C});case"button":return H(bI,{fieldName:F.name,...C})}}function cI(F){return H(CI,F.file)}async function mI(F,C){if(F.dest){if(typeof F.dest=="string")return H(E,{referencedPage:Number(F.dest.substring(1,F.dest.length)),offset:null});{const a=await C.getPageIndex(F.dest[0]);return H(E,{referencedPage:a+1,offset:{left:F.dest[2],bottom:F.dest[3]}})}}else if(F.url)return H(gI,{url:F.url,unsafeUrl:F.unsafeUrl})}function WI(F,C,a){var l;let s=F.target.parentNode;if(s.tagName==="DIV"&&(s=s.firstChild),s.className==="linkAnnotation"&&F.type==="click"){const S=(l=s.dataset)==null?void 0:l.annotationId;if(S)return mI(K("id",S,a)[0],C)}else if(["popupAnnotation","textAnnotation","fileAttachmentAnnotation"].includes(s.className)){for(const S of s.getElementsByTagName("span")){let M=S.textContent;const L=JSON.parse(S.dataset.l10nArgs??"{}");if(M)for(const X in L)M=M.replace(`{{${X}}}`,L[X]);S.textContent=M}if(s.className==="fileAttachmentAnnotation"&&F.type==="dblclick"){const S=s.dataset.annotationId;if(S)return cI(K("id",S,a)[0])}}else if(s.className==="textWidgetAnnotation"&&F.type==="input"){let S=s.getElementsByTagName("input")[0];return S||(S=s.getElementsByTagName("textarea")[0]),h(S)}else{if(s.className==="choiceWidgetAnnotation"&&F.type==="input")return h(s.getElementsByTagName("select")[0]);if(s.className==="buttonWidgetAnnotation checkBox"&&F.type==="change")return h(s.getElementsByTagName("input")[0]);if(s.className==="buttonWidgetAnnotation radioButton"&&F.type==="change"){const S=s.dataset.annotationId;if(S){const M=K("id",S,a)[0],L=[];for(const X of K("fieldName",M.fieldName,a))X.buttonValue&&L.push(X.buttonValue);return h(s.getElementsByTagName("input")[0],{value:M.buttonValue,defaultValue:M.fieldValue,options:L})}}else if(s.className==="linkAnnotation buttonWidgetAnnotation pushButton"&&F.type==="click"){const S=s.dataset.annotationId;if(S){const M=K("id",S,a)[0];return M.resetForm?h({name:M.fieldName,type:"button"},{actions:M.actions,reset:!0}):h({name:M.fieldName,type:"button"},{actions:M.actions,reset:!1})}}}}class BI{constructor(){x(this,"externalLinkEnabled"),this.externalLinkEnabled=!0}get pagesCount(){return 0}get page(){return 0}set page(C){}get rotation(){return 0}set rotation(C){}get isInPresentationMode(){return!1}async goToDestination(C){}goToPage(C){}addLinkAttributes(C,a,l=!1){}getDestinationHash(C){return"#"}getAnchorUrl(C){return"#"}setHash(C){}executeNamedAction(C){}executeSetOCGState(C){}cachePageRef(C,a){}}const wI=defineComponent({__name:"AnnotationLayer",props:{page:{},viewport:{},document:{},filter:{},map:{type:Function}},emits:["annotation"],setup(F,{emit:C}){const a=F,l=ref(),s=ref();function S(I){const m=WI(I,a.document,s.value);Promise.resolve(m).then(W=>{W&&C("annotation",W)})}async function M(){var I;return await((I=toRaw(a.document))==null?void 0:I.getFieldObjects())}async function L(){var I;return await((I=toRaw(a.document))==null?void 0:I.hasJSActions())}async function X(){const I=a.page;let m=await I?.getAnnotations();if(a.filter){const W=a.filter;m=m.filter(Z=>{const w=Z.subtype,y=Z.fieldType?`${w}.${Z.fieldType}`:null;return W?.includes(w)||y!==null&&W?.includes(y)})}if(a.map&&typeof a.map=="function"){const W=[];for(const Z of m){const w=a.map(Z);w&&W.push(w)}m=W}return m}async function A(){var I,m;(m=(I=l.value).replaceChildren)==null||m.call(I);const W=toRaw(a.document),Z=a.page,w=a.viewport;s.value=await X();const y=new Map([]);for(const Y of s.value)if(Y.subtype==="Widget"&&Y.fieldType==="Btn"&&Y.pushButton){const k=Y.rect[2]-Y.rect[0],j=Y.rect[3]-Y.rect[1],p=document.createElement("canvas");p.setAttribute("width",(k*w.scale).toString()),p.setAttribute("height",(j*w.scale).toString()),y.set(Y.id,p)}const N={annotations:s.value,viewport:w?.clone({dontFlip:!0}),linkService:new BI,annotationCanvasMap:y,div:l.value,annotationStorage:W.annotationStorage,renderForms:!0,page:Z,enableScripting:!0,hasJSActions:await L(),fieldObjects:await M(),downloadManager:null};pdfExports.AnnotationLayer.render(N);for(const Y of dI)l.value.addEventListener(Y,S)}return watch(()=>a.viewport,()=>{a.page&&a.viewport&&l.value&&A()}),onMounted(()=>{a.page&&a.viewport&&l.value&&A()}),(I,m)=>(openBlock(),createElementBlock("div",{ref_key:"layer",ref:l,class:"annotationLayer",style:{display:"block"}},null,512))}}),YI=defineComponent({__name:"TextLayer",props:{page:{},viewport:{}},setup(F){const C=F,a=ref(),l=ref();function s(){var L,X;(X=(L=a.value).replaceChildren)==null||X.call(L);const A=C.page,I=C.viewport,m={textContentSource:A?.streamTextContent({includeMarkedContent:!0,disableNormalization:!0}),viewport:I,container:a.value,isOffscreenCanvasSupported:!0,textDivs:[],textDivProperties:new WeakMap};pdfExports.renderTextLayer(m).promise.then(()=>{var W;const Z=document.createElement("div");Z.className="endOfContent",(W=a.value)==null||W.appendChild(Z),l.value=Z})}function S(){l.value&&l.value.classList.add("active")}function M(){l.value&&l.value.classList.remove("active")}return watch(()=>C.viewport,L=>{C.page&&C.viewport&&a.value&&s()}),onMounted(()=>{C.page&&C.viewport&&a.value&&s()}),(L,X)=>(openBlock(),createElementBlock("div",{ref_key:"layer",ref:a,class:"textLayer",style:{display:"block"},onMousedown:S,onMouseup:M},null,544))}}),iI=createBaseVNode("canvas",{dir:"ltr",style:{display:"block"},role:"main"},null,-1),e=defineComponent({__name:"VuePDF",props:{pdf:{},page:{default:1},scale:{default:1},rotation:{},fitParent:{type:Boolean},textLayer:{type:Boolean},annotationLayer:{type:Boolean},annotationsFilter:{},annotationsMap:{}},emits:["annotation","loaded"],setup(F,{expose:C,emit:a}){const l=F,s=ref(),S=ref(),M=ref(!1);let L;const X=ref(null),A=ref(null),I=ref(null);function m(u){a("loaded",u)}function W(u){a("annotation",u)}function Z(u){if(!(typeof u=="number"&&u%90===0))return 0;const T=u/90;return T>4?Z(u-360):T<0?Z(u+360):u}function w(u){let T=l.scale;if(l.fitParent){const J=s.value.parentNode.clientWidth,r=u.getViewport({scale:1}).width;T=J/r}return T}function y(){var u;let T=null;return(u=s.value)==null||u.childNodes.forEach(J=>{J.tagName==="CANVAS"&&(T=J)}),T}function N(u){var T;let J;const r=y();return r&&r?.getAttribute("role")==="main"?J=r:(J=document.createElement("canvas"),J.style.display="block",J.setAttribute("dir","ltr")),J.width=u.width,J.height=u.height,J.style.width=`${u.width}px`,J.style.height=`${u.height}px`,(T=s.value)==null||T.style.setProperty("--scale-factor",`${u.scale}`),S.value.style.width=`${u.width}px`,S.value.style.height=`${u.height}px`,M.value=!0,J}function Y(){L&&L.cancel()}function k(u){var T;(T=toRaw(X.value))==null||T.getPage(u).then(J=>{var r;Y();const q=J.getViewport(),hI={scale:w(J),rotation:Z((l.rotation||0)+q.rotation)},KI=J.getViewport(hI),NI=y(),yI=N(KI),oI={canvasContext:yI.getContext("2d"),viewport:KI,annotationMode:pdfExports.AnnotationMode.ENABLE_FORMS};yI?.getAttribute("role")!=="main"?NI&&((r=s.value)==null||r.replaceChild(yI,NI)):yI.removeAttribute("role"),A.value=J,I.value=KI,L=J.render(oI),L.promise.then(()=>{M.value=!1,m(I.value)}).catch(()=>{})})}function j(u){u.promise.then(async T=>{X.value=T,k(l.page)})}watch(()=>l.pdf,u=>{u!==void 0&&j(u)}),watch(()=>[l.scale,l.rotation,l.page],()=>{k(l.page)}),onMounted(()=>{l.pdf!==void 0&&j(l.pdf)});function p(){k(l.page)}function b(){Y()}function B(){const u=toRaw(X.value);return u?.annotationStorage}return C({reload:p,cancel:b,getAnnotationStorage:B}),(u,T)=>(openBlock(),createElementBlock("div",{ref_key:"container",ref:s,style:{position:"relative",display:"block",overflow:"hidden"}},[iI,withDirectives(createVNode(YI,{page:A.value,viewport:I.value},null,8,["page","viewport"]),[[vShow,u.textLayer]]),withDirectives(createVNode(wI,{page:A.value,viewport:I.value,document:X.value,filter:u.annotationsFilter,map:u.annotationsMap,onAnnotation:T[0]||(T[0]=J=>W(J))},null,8,["page","viewport","document","filter","map"]),[[vShow,u.annotationLayer]]),withDirectives(createBaseVNode("div",{ref_key:"loadingLayer",ref:S,style:{display:"block",position:"absolute"}},[renderSlot(u.$slots,"default")],512),[[vShow,M.value]])],512))}}),VI="data:application/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDIzIE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KCihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7CglpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpCgkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CgllbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkKCQlkZWZpbmUoInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciIsIFtdLCBmYWN0b3J5KTsKCWVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQoJCWV4cG9ydHNbInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdID0gZmFjdG9yeSgpOwoJZWxzZQoJCXJvb3RbInBkZmpzLWRpc3QvYnVpbGQvcGRmLndvcmtlciJdID0gcm9vdC5wZGZqc1dvcmtlciA9IGZhY3RvcnkoKTsKfSkoZ2xvYmFsVGhpcywgKCkgPT4gewpyZXR1cm4gLyoqKioqKi8gKCgpID0+IHsgLy8gd2VicGFja0Jvb3RzdHJhcAovKioqKioqLyAJInVzZSBzdHJpY3QiOwovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoWwovKiAwICovLAovKiAxICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuV29ya2VyVGFzayA9IGV4cG9ydHMuV29ya2VyTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfcGRmX21hbmFnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpOwp2YXIgX2NsZWFudXBfaGVscGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg3Mik7CnZhciBfd3JpdGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Nik7CnZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTAzKTsKdmFyIF9tZXNzYWdlX2hhbmRsZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwNCk7CnZhciBfd29ya2VyX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTA1KTsKY2xhc3MgV29ya2VyVGFzayB7CiAgY29uc3RydWN0b3IobmFtZSkgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMudGVybWluYXRlZCA9IGZhbHNlOwogICAgdGhpcy5fY2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpOwogIH0KICBnZXQgZmluaXNoZWQoKSB7CiAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlOwogIH0KICBmaW5pc2goKSB7CiAgICB0aGlzLl9jYXBhYmlsaXR5LnJlc29sdmUoKTsKICB9CiAgdGVybWluYXRlKCkgewogICAgdGhpcy50ZXJtaW5hdGVkID0gdHJ1ZTsKICB9CiAgZW5zdXJlTm90VGVybWluYXRlZCgpIHsKICAgIGlmICh0aGlzLnRlcm1pbmF0ZWQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3JrZXIgdGFzayB3YXMgdGVybWluYXRlZCIpOwogICAgfQogIH0KfQpleHBvcnRzLldvcmtlclRhc2sgPSBXb3JrZXJUYXNrOwpjbGFzcyBXb3JrZXJNZXNzYWdlSGFuZGxlciB7CiAgc3RhdGljIHNldHVwKGhhbmRsZXIsIHBvcnQpIHsKICAgIGxldCB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IGZhbHNlOwogICAgaGFuZGxlci5vbigidGVzdCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIGlmICh0ZXN0TWVzc2FnZVByb2Nlc3NlZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0ZXN0TWVzc2FnZVByb2Nlc3NlZCA9IHRydWU7CiAgICAgIGhhbmRsZXIuc2VuZCgidGVzdCIsIGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiY29uZmlndXJlIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgKDAsIF91dGlsLnNldFZlcmJvc2l0eUxldmVsKShkYXRhLnZlcmJvc2l0eSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERvY1JlcXVlc3QiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gV29ya2VyTWVzc2FnZUhhbmRsZXIuY3JlYXRlRG9jdW1lbnRIYW5kbGVyKGRhdGEsIHBvcnQpOwogICAgfSk7CiAgfQogIHN0YXRpYyBjcmVhdGVEb2N1bWVudEhhbmRsZXIoZG9jUGFyYW1zLCBwb3J0KSB7CiAgICBsZXQgcGRmTWFuYWdlcjsKICAgIGxldCB0ZXJtaW5hdGVkID0gZmFsc2U7CiAgICBsZXQgY2FuY2VsWEhScyA9IG51bGw7CiAgICBjb25zdCBXb3JrZXJUYXNrcyA9IG5ldyBTZXQoKTsKICAgIGNvbnN0IHZlcmJvc2l0eSA9ICgwLCBfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKTsKICAgIGNvbnN0IHsKICAgICAgZG9jSWQsCiAgICAgIGFwaVZlcnNpb24KICAgIH0gPSBkb2NQYXJhbXM7CiAgICBjb25zdCB3b3JrZXJWZXJzaW9uID0gJzMuNy4xMDcnOwogICAgaWYgKGFwaVZlcnNpb24gIT09IHdvcmtlclZlcnNpb24pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQVBJIHZlcnNpb24gIiR7YXBpVmVyc2lvbn0iIGRvZXMgbm90IG1hdGNoIGAgKyBgdGhlIFdvcmtlciB2ZXJzaW9uICIke3dvcmtlclZlcnNpb259Ii5gKTsKICAgIH0KICAgIGNvbnN0IGVudW1lcmFibGVQcm9wZXJ0aWVzID0gW107CiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIFtdKSB7CiAgICAgIGVudW1lcmFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpOwogICAgfQogICAgaWYgKGVudW1lcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSBgQXJyYXkucHJvdG90eXBlYCBjb250YWlucyB1bmV4cGVjdGVkIGVudW1lcmFibGUgcHJvcGVydGllczogIiArIGVudW1lcmFibGVQcm9wZXJ0aWVzLmpvaW4oIiwgIikgKyAiOyB0aHVzIGJyZWFraW5nIGUuZy4gYGZvci4uLmluYCBpdGVyYXRpb24gb2YgYEFycmF5YHMuIik7CiAgICB9CiAgICBjb25zdCB3b3JrZXJIYW5kbGVyTmFtZSA9IGRvY0lkICsgIl93b3JrZXIiOwogICAgbGV0IGhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcih3b3JrZXJIYW5kbGVyTmFtZSwgZG9jSWQsIHBvcnQpOwogICAgZnVuY3Rpb24gZW5zdXJlTm90VGVybWluYXRlZCgpIHsKICAgICAgaWYgKHRlcm1pbmF0ZWQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldvcmtlciB3YXMgdGVybWluYXRlZCIpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzdGFydFdvcmtlclRhc2sodGFzaykgewogICAgICBXb3JrZXJUYXNrcy5hZGQodGFzayk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5pc2hXb3JrZXJUYXNrKHRhc2spIHsKICAgICAgdGFzay5maW5pc2goKTsKICAgICAgV29ya2VyVGFza3MuZGVsZXRlKHRhc2spOwogICAgfQogICAgYXN5bmMgZnVuY3Rpb24gbG9hZERvY3VtZW50KHJlY292ZXJ5TW9kZSkgewogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tIZWFkZXIiKTsKICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoInBhcnNlU3RhcnRYUmVmIik7CiAgICAgIGF3YWl0IHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJwYXJzZSIsIFtyZWNvdmVyeU1vZGVdKTsKICAgICAgYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoImNoZWNrRmlyc3RQYWdlIiwgW3JlY292ZXJ5TW9kZV0pOwogICAgICBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2hlY2tMYXN0UGFnZSIsIFtyZWNvdmVyeU1vZGVdKTsKICAgICAgY29uc3QgaXNQdXJlWGZhID0gYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoImlzUHVyZVhmYSIpOwogICAgICBpZiAoaXNQdXJlWGZhKSB7CiAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKCJsb2FkWGZhRm9udHMiKTsKICAgICAgICBzdGFydFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3BkZk1hbmFnZXIubG9hZFhmYUZvbnRzKGhhbmRsZXIsIHRhc2spLmNhdGNoKHJlYXNvbiA9PiB7fSkudGhlbigoKSA9PiBmaW5pc2hXb3JrZXJUYXNrKHRhc2spKSwgcGRmTWFuYWdlci5sb2FkWGZhSW1hZ2VzKCldKTsKICAgICAgfQogICAgICBjb25zdCBbbnVtUGFnZXMsIGZpbmdlcnByaW50c10gPSBhd2FpdCBQcm9taXNlLmFsbChbcGRmTWFuYWdlci5lbnN1cmVEb2MoIm51bVBhZ2VzIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJmaW5nZXJwcmludHMiKV0pOwogICAgICBjb25zdCBodG1sRm9yWGZhID0gaXNQdXJlWGZhID8gYXdhaXQgcGRmTWFuYWdlci5lbnN1cmVEb2MoImh0bWxGb3JYZmEiKSA6IG51bGw7CiAgICAgIHJldHVybiB7CiAgICAgICAgbnVtUGFnZXMsCiAgICAgICAgZmluZ2VycHJpbnRzLAogICAgICAgIGh0bWxGb3JYZmEKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFBkZk1hbmFnZXIoewogICAgICBkYXRhLAogICAgICBwYXNzd29yZCwKICAgICAgZGlzYWJsZUF1dG9GZXRjaCwKICAgICAgcmFuZ2VDaHVua1NpemUsCiAgICAgIGxlbmd0aCwKICAgICAgZG9jQmFzZVVybCwKICAgICAgZW5hYmxlWGZhLAogICAgICBldmFsdWF0b3JPcHRpb25zCiAgICB9KSB7CiAgICAgIGNvbnN0IHBkZk1hbmFnZXJBcmdzID0gewogICAgICAgIHNvdXJjZTogbnVsbCwKICAgICAgICBkaXNhYmxlQXV0b0ZldGNoLAogICAgICAgIGRvY0Jhc2VVcmwsCiAgICAgICAgZG9jSWQsCiAgICAgICAgZW5hYmxlWGZhLAogICAgICAgIGV2YWx1YXRvck9wdGlvbnMsCiAgICAgICAgaGFuZGxlciwKICAgICAgICBsZW5ndGgsCiAgICAgICAgcGFzc3dvcmQsCiAgICAgICAgcmFuZ2VDaHVua1NpemUKICAgICAgfTsKICAgICAgY29uc3QgcGRmTWFuYWdlckNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTsKICAgICAgbGV0IG5ld1BkZk1hbmFnZXI7CiAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IGRhdGE7CiAgICAgICAgICBuZXdQZGZNYW5hZ2VyID0gbmV3IF9wZGZfbWFuYWdlci5Mb2NhbFBkZk1hbmFnZXIocGRmTWFuYWdlckFyZ3MpOwogICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVzb2x2ZShuZXdQZGZNYW5hZ2VyKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVqZWN0KGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0KICAgICAgbGV0IHBkZlN0cmVhbSwKICAgICAgICBjYWNoZWRDaHVua3MgPSBbXTsKICAgICAgdHJ5IHsKICAgICAgICBwZGZTdHJlYW0gPSBuZXcgX3dvcmtlcl9zdHJlYW0uUERGV29ya2VyU3RyZWFtKGhhbmRsZXIpOwogICAgICB9IGNhdGNoIChleCkgewogICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7CiAgICAgICAgcmV0dXJuIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0KICAgICAgY29uc3QgZnVsbFJlcXVlc3QgPSBwZGZTdHJlYW0uZ2V0RnVsbFJlYWRlcigpOwogICAgICBmdWxsUmVxdWVzdC5oZWFkZXJzUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1JhbmdlU3VwcG9ydGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBkZk1hbmFnZXJBcmdzLnNvdXJjZSA9IHBkZlN0cmVhbTsKICAgICAgICBwZGZNYW5hZ2VyQXJncy5sZW5ndGggPSBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoOwogICAgICAgIHBkZk1hbmFnZXJBcmdzLmRpc2FibGVBdXRvRmV0Y2ggfHw9IGZ1bGxSZXF1ZXN0LmlzU3RyZWFtaW5nU3VwcG9ydGVkOwogICAgICAgIG5ld1BkZk1hbmFnZXIgPSBuZXcgX3BkZl9tYW5hZ2VyLk5ldHdvcmtQZGZNYW5hZ2VyKHBkZk1hbmFnZXJBcmdzKTsKICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNhY2hlZENodW5rcykgewogICAgICAgICAgbmV3UGRmTWFuYWdlci5zZW5kUHJvZ3Jlc3NpdmVEYXRhKGNodW5rKTsKICAgICAgICB9CiAgICAgICAgY2FjaGVkQ2h1bmtzID0gW107CiAgICAgICAgcGRmTWFuYWdlckNhcGFiaWxpdHkucmVzb2x2ZShuZXdQZGZNYW5hZ2VyKTsKICAgICAgICBjYW5jZWxYSFJzID0gbnVsbDsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOwogICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICB9KTsKICAgICAgbGV0IGxvYWRlZCA9IDA7CiAgICAgIGNvbnN0IGZsdXNoQ2h1bmtzID0gZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnN0IHBkZkZpbGUgPSAoMCwgX2NvcmVfdXRpbHMuYXJyYXlCdWZmZXJzVG9CeXRlcykoY2FjaGVkQ2h1bmtzKTsKICAgICAgICBpZiAobGVuZ3RoICYmIHBkZkZpbGUubGVuZ3RoICE9PSBsZW5ndGgpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicmVwb3J0ZWQgSFRUUCBsZW5ndGggaXMgZGlmZmVyZW50IGZyb20gYWN0dWFsIik7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBwZGZNYW5hZ2VyQXJncy5zb3VyY2UgPSBwZGZGaWxlOwogICAgICAgICAgbmV3UGRmTWFuYWdlciA9IG5ldyBfcGRmX21hbmFnZXIuTG9jYWxQZGZNYW5hZ2VyKHBkZk1hbmFnZXJBcmdzKTsKICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlc29sdmUobmV3UGRmTWFuYWdlcik7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIHBkZk1hbmFnZXJDYXBhYmlsaXR5LnJlamVjdChleCk7CiAgICAgICAgfQogICAgICAgIGNhY2hlZENodW5rcyA9IFtdOwogICAgICB9OwogICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgY29uc3QgcmVhZENodW5rID0gZnVuY3Rpb24gKHsKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgZG9uZQogICAgICAgIH0pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICBpZiAoIW5ld1BkZk1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIGZsdXNoQ2h1bmtzKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNhbmNlbFhIUnMgPSBudWxsOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDsKICAgICAgICAgICAgaWYgKCFmdWxsUmVxdWVzdC5pc1N0cmVhbWluZ1N1cHBvcnRlZCkgewogICAgICAgICAgICAgIGhhbmRsZXIuc2VuZCgiRG9jUHJvZ3Jlc3MiLCB7CiAgICAgICAgICAgICAgICBsb2FkZWQsCiAgICAgICAgICAgICAgICB0b3RhbDogTWF0aC5tYXgobG9hZGVkLCBmdWxsUmVxdWVzdC5jb250ZW50TGVuZ3RoIHx8IDApCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld1BkZk1hbmFnZXIpIHsKICAgICAgICAgICAgICBuZXdQZGZNYW5hZ2VyLnNlbmRQcm9ncmVzc2l2ZURhdGEodmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNhY2hlZENodW5rcy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdWxsUmVxdWVzdC5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGZ1bGxSZXF1ZXN0LnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHsKICAgICAgICBwZGZNYW5hZ2VyQ2FwYWJpbGl0eS5yZWplY3QoZSk7CiAgICAgICAgY2FuY2VsWEhScyA9IG51bGw7CiAgICAgIH0pOwogICAgICBjYW5jZWxYSFJzID0gZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIHBkZlN0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pOwogICAgICB9OwogICAgICByZXR1cm4gcGRmTWFuYWdlckNhcGFiaWxpdHkucHJvbWlzZTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldHVwRG9jKGRhdGEpIHsKICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKGRvYykgewogICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICBoYW5kbGVyLnNlbmQoIkdldERvYyIsIHsKICAgICAgICAgIHBkZkluZm86IGRvYwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG9uRmFpbHVyZShleCkgewogICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbikgewogICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBQYXNzd29yZEV4Y2VwdGlvbjogcmVzcG9uc2UgJHtleC5jb2RlfWApOwogICAgICAgICAgc3RhcnRXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlBhc3N3b3JkUmVxdWVzdCIsIGV4KS50aGVuKGZ1bmN0aW9uICh7CiAgICAgICAgICAgIHBhc3N3b3JkCiAgICAgICAgICB9KSB7CiAgICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICAgIHBkZk1hbmFnZXIudXBkYXRlUGFzc3dvcmQocGFzc3dvcmQpOwogICAgICAgICAgICBwZGZNYW5hZ2VyUmVhZHkoKTsKICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgICAgaGFuZGxlci5zZW5kKCJEb2NFeGNlcHRpb24iLCBleCk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbiB8fCBleCBpbnN0YW5jZW9mIF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gfHwgZXggaW5zdGFuY2VvZiBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24pIHsKICAgICAgICAgIGhhbmRsZXIuc2VuZCgiRG9jRXhjZXB0aW9uIiwgZXgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRvY0V4Y2VwdGlvbiIsIG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXgudG9TdHJpbmcoKSkpOwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBwZGZNYW5hZ2VyUmVhZHkoKSB7CiAgICAgICAgZW5zdXJlTm90VGVybWluYXRlZCgpOwogICAgICAgIGxvYWREb2N1bWVudChmYWxzZSkudGhlbihvblN1Y2Nlc3MsIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgICAgIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbikpIHsKICAgICAgICAgICAgb25GYWlsdXJlKHJlYXNvbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICBlbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgICAgICAgIGxvYWREb2N1bWVudCh0cnVlKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsdXJlKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgZ2V0UGRmTWFuYWdlcihkYXRhKS50aGVuKGZ1bmN0aW9uIChuZXdQZGZNYW5hZ2VyKSB7CiAgICAgICAgaWYgKHRlcm1pbmF0ZWQpIHsKICAgICAgICAgIG5ld1BkZk1hbmFnZXIudGVybWluYXRlKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkLiIpKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIHdhcyB0ZXJtaW5hdGVkIik7CiAgICAgICAgfQogICAgICAgIHBkZk1hbmFnZXIgPSBuZXdQZGZNYW5hZ2VyOwogICAgICAgIHBkZk1hbmFnZXIucmVxdWVzdExvYWRlZFN0cmVhbSh0cnVlKS50aGVuKHN0cmVhbSA9PiB7CiAgICAgICAgICBoYW5kbGVyLnNlbmQoIkRhdGFMb2FkZWQiLCB7CiAgICAgICAgICAgIGxlbmd0aDogc3RyZWFtLmJ5dGVzLmJ5dGVMZW5ndGgKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9KS50aGVuKHBkZk1hbmFnZXJSZWFkeSwgb25GYWlsdXJlKTsKICAgIH0KICAgIGhhbmRsZXIub24oIkdldFBhZ2UiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKGRhdGEucGFnZUluZGV4KS50aGVuKGZ1bmN0aW9uIChwYWdlKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAicm90YXRlIiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJyZWYiKSwgcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgInVzZXJVbml0IiksIHBkZk1hbmFnZXIuZW5zdXJlKHBhZ2UsICJ2aWV3IildKS50aGVuKGZ1bmN0aW9uIChbcm90YXRlLCByZWYsIHVzZXJVbml0LCB2aWV3XSkgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcm90YXRlLAogICAgICAgICAgICByZWYsCiAgICAgICAgICAgIHVzZXJVbml0LAogICAgICAgICAgICB2aWV3CiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUluZGV4IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgY29uc3QgcGFnZVJlZiA9IF9wcmltaXRpdmVzLlJlZi5nZXQoZGF0YS5udW0sIGRhdGEuZ2VuKTsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZ2V0UGFnZUluZGV4IiwgW3BhZ2VSZWZdKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RGVzdGluYXRpb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZGVzdGluYXRpb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERlc3RpbmF0aW9uIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZ2V0RGVzdGluYXRpb24iLCBbZGF0YS5pZF0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlTGFiZWxzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygicGFnZUxhYmVscyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlTGF5b3V0IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygicGFnZUxheW91dCIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQYWdlTW9kZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBhZ2VNb2RlIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldFZpZXdlclByZWZlcmVuY2VzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygidmlld2VyUHJlZmVyZW5jZXMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0T3BlbkFjdGlvbiIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wZW5BY3Rpb24iKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0QXR0YWNobWVudHMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhdHRhY2htZW50cyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRKYXZhU2NyaXB0IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiamF2YVNjcmlwdCIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXREb2NKU0FjdGlvbnMiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJqc0FjdGlvbnMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0UGFnZUpTQWN0aW9ucyIsIGZ1bmN0aW9uICh7CiAgICAgIHBhZ2VJbmRleAogICAgfSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZShwYWdlLCAianNBY3Rpb25zIik7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPdXRsaW5lIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiZG9jdW1lbnRPdXRsaW5lIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE9wdGlvbmFsQ29udGVudENvbmZpZyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm9wdGlvbmFsQ29udGVudENvbmZpZyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRQZXJtaXNzaW9ucyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coInBlcm1pc3Npb25zIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldE1ldGFkYXRhIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygiZG9jdW1lbnRJbmZvIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygibWV0YWRhdGEiKV0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRNYXJrSW5mbyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm1hcmtJbmZvIik7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldERhdGEiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICByZXR1cm4gcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCkudGhlbihmdW5jdGlvbiAoc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5ieXRlczsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkdldEFubm90YXRpb25zIiwgZnVuY3Rpb24gKHsKICAgICAgcGFnZUluZGV4LAogICAgICBpbnRlbnQKICAgIH0pIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soYEdldEFubm90YXRpb25zOiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICByZXR1cm4gcGFnZS5nZXRBbm5vdGF0aW9uc0RhdGEoaGFuZGxlciwgdGFzaywgaW50ZW50KS50aGVuKGRhdGEgPT4gewogICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0sIHJlYXNvbiA9PiB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0RmllbGRPYmplY3RzIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJmaWVsZE9iamVjdHMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiSGFzSlNBY3Rpb25zIiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgcmV0dXJuIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJoYXNKU0FjdGlvbnMiKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0Q2FsY3VsYXRpb25PcmRlcklkcyIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmVuc3VyZURvYygiY2FsY3VsYXRpb25PcmRlcklkcyIpOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJTYXZlRG9jdW1lbnQiLCBmdW5jdGlvbiAoewogICAgICBpc1B1cmVYZmEsCiAgICAgIG51bVBhZ2VzLAogICAgICBhbm5vdGF0aW9uU3RvcmFnZSwKICAgICAgZmlsZW5hbWUKICAgIH0pIHsKICAgICAgY29uc3QgcHJvbWlzZXMgPSBbcGRmTWFuYWdlci5yZXF1ZXN0TG9hZGVkU3RyZWFtKCksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKSwgcGRmTWFuYWdlci5lbnN1cmVDYXRhbG9nKCJhY3JvRm9ybVJlZiIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygieHJlZiIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygic3RhcnRYUmVmIildOwogICAgICBjb25zdCBuZXdBbm5vdGF0aW9uc0J5UGFnZSA9ICFpc1B1cmVYZmEgPyAoMCwgX2NvcmVfdXRpbHMuZ2V0TmV3QW5ub3RhdGlvbnNNYXApKGFubm90YXRpb25TdG9yYWdlKSA6IG51bGw7CiAgICAgIGlmIChuZXdBbm5vdGF0aW9uc0J5UGFnZSkgewogICAgICAgIGZvciAoY29uc3QgW3BhZ2VJbmRleCwgYW5ub3RhdGlvbnNdIG9mIG5ld0Fubm90YXRpb25zQnlQYWdlKSB7CiAgICAgICAgICBwcm9taXNlcy5wdXNoKHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4ocGFnZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgU2F2ZSAoZWRpdG9yKTogcGFnZSAke3BhZ2VJbmRleH1gKTsKICAgICAgICAgICAgcmV0dXJuIHBhZ2Uuc2F2ZU5ld0Fubm90YXRpb25zKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25zKS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlzUHVyZVhmYSkgewogICAgICAgIHByb21pc2VzLnB1c2gocGRmTWFuYWdlci5zZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChsZXQgcGFnZUluZGV4ID0gMDsgcGFnZUluZGV4IDwgbnVtUGFnZXM7IHBhZ2VJbmRleCsrKSB7CiAgICAgICAgICBwcm9taXNlcy5wdXNoKHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICAgICAgY29uc3QgdGFzayA9IG5ldyBXb3JrZXJUYXNrKGBTYXZlOiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgICAgICByZXR1cm4gcGFnZS5zYXZlKGhhbmRsZXIsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uIChbc3RyZWFtLCBhY3JvRm9ybSwgYWNyb0Zvcm1SZWYsIHhyZWYsIHN0YXJ0WFJlZiwgLi4ucmVmc10pIHsKICAgICAgICBsZXQgbmV3UmVmcyA9IFtdOwogICAgICAgIGxldCB4ZmFEYXRhID0gbnVsbDsKICAgICAgICBpZiAoaXNQdXJlWGZhKSB7CiAgICAgICAgICB4ZmFEYXRhID0gcmVmc1swXTsKICAgICAgICAgIGlmICgheGZhRGF0YSkgewogICAgICAgICAgICByZXR1cm4gc3RyZWFtLmJ5dGVzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZWZzID0gcmVmcy5mbGF0KDIpOwogICAgICAgICAgaWYgKG5ld1JlZnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBzdHJlYW0uYnl0ZXM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5lZWRBcHBlYXJhbmNlcyA9IGFjcm9Gb3JtUmVmICYmIGFjcm9Gb3JtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiBuZXdSZWZzLnNvbWUocmVmID0+IHJlZi5uZWVkQXBwZWFyYW5jZXMpOwogICAgICAgIGNvbnN0IHhmYSA9IGFjcm9Gb3JtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiBhY3JvRm9ybS5nZXQoIlhGQSIpIHx8IG51bGw7CiAgICAgICAgbGV0IHhmYURhdGFzZXRzUmVmID0gbnVsbDsKICAgICAgICBsZXQgaGFzWGZhRGF0YXNldHNFbnRyeSA9IGZhbHNlOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHhmYSkpIHsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgIGlmICh4ZmFbaV0gPT09ICJkYXRhc2V0cyIpIHsKICAgICAgICAgICAgICB4ZmFEYXRhc2V0c1JlZiA9IHhmYVtpICsgMV07CiAgICAgICAgICAgICAgaGFzWGZhRGF0YXNldHNFbnRyeSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh4ZmFEYXRhc2V0c1JlZiA9PT0gbnVsbCkgewogICAgICAgICAgICB4ZmFEYXRhc2V0c1JlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh4ZmEpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5zdXBwb3J0ZWQgWEZBIHR5cGUuIik7CiAgICAgICAgfQogICAgICAgIGxldCBuZXdYcmVmSW5mbyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgaWYgKHhyZWYudHJhaWxlcikgewogICAgICAgICAgY29uc3QgaW5mb09iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICBjb25zdCB4cmVmSW5mbyA9IHhyZWYudHJhaWxlci5nZXQoIkluZm8iKSB8fCBudWxsOwogICAgICAgICAgaWYgKHhyZWZJbmZvIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICAgICAgICB4cmVmSW5mby5mb3JFYWNoKChrZXksIHZhbHVlKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIGluZm9PYmpba2V5XSA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykodmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZXdYcmVmSW5mbyA9IHsKICAgICAgICAgICAgcm9vdFJlZjogeHJlZi50cmFpbGVyLmdldFJhdygiUm9vdCIpIHx8IG51bGwsCiAgICAgICAgICAgIGVuY3J5cHRSZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkVuY3J5cHQiKSB8fCBudWxsLAogICAgICAgICAgICBuZXdSZWY6IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCksCiAgICAgICAgICAgIGluZm9SZWY6IHhyZWYudHJhaWxlci5nZXRSYXcoIkluZm8iKSB8fCBudWxsLAogICAgICAgICAgICBpbmZvOiBpbmZvT2JqLAogICAgICAgICAgICBmaWxlSWRzOiB4cmVmLnRyYWlsZXIuZ2V0KCJJRCIpIHx8IG51bGwsCiAgICAgICAgICAgIHN0YXJ0WFJlZjogeHJlZi5sYXN0WFJlZlN0cmVhbVBvcyA/PyBzdGFydFhSZWYsCiAgICAgICAgICAgIGZpbGVuYW1lCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuICgwLCBfd3JpdGVyLmluY3JlbWVudGFsVXBkYXRlKSh7CiAgICAgICAgICAgIG9yaWdpbmFsRGF0YTogc3RyZWFtLmJ5dGVzLAogICAgICAgICAgICB4cmVmSW5mbzogbmV3WHJlZkluZm8sCiAgICAgICAgICAgIG5ld1JlZnMsCiAgICAgICAgICAgIHhyZWYsCiAgICAgICAgICAgIGhhc1hmYTogISF4ZmEsCiAgICAgICAgICAgIHhmYURhdGFzZXRzUmVmLAogICAgICAgICAgICBoYXNYZmFEYXRhc2V0c0VudHJ5LAogICAgICAgICAgICBuZWVkQXBwZWFyYW5jZXMsCiAgICAgICAgICAgIGFjcm9Gb3JtUmVmLAogICAgICAgICAgICBhY3JvRm9ybSwKICAgICAgICAgICAgeGZhRGF0YQogICAgICAgICAgfSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHhyZWYucmVzZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRPcGVyYXRvckxpc3QiLCBmdW5jdGlvbiAoZGF0YSwgc2luaykgewogICAgICBjb25zdCBwYWdlSW5kZXggPSBkYXRhLnBhZ2VJbmRleDsKICAgICAgcGRmTWFuYWdlci5nZXRQYWdlKHBhZ2VJbmRleCkudGhlbihmdW5jdGlvbiAocGFnZSkgewogICAgICAgIGNvbnN0IHRhc2sgPSBuZXcgV29ya2VyVGFzayhgR2V0T3BlcmF0b3JMaXN0OiBwYWdlICR7cGFnZUluZGV4fWApOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBfdXRpbC5WZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICBzaW5rLAogICAgICAgICAgdGFzaywKICAgICAgICAgIGludGVudDogZGF0YS5pbnRlbnQsCiAgICAgICAgICBjYWNoZUtleTogZGF0YS5jYWNoZUtleSwKICAgICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBkYXRhLmFubm90YXRpb25TdG9yYWdlCiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAob3BlcmF0b3JMaXN0SW5mbykgewogICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgIGlmIChzdGFydCkgewogICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoYHBhZ2U9JHtwYWdlSW5kZXggKyAxfSAtIGdldE9wZXJhdG9yTGlzdDogdGltZT1gICsgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zLCBsZW49JHtvcGVyYXRvckxpc3RJbmZvLmxlbmd0aH1gKTsKICAgICAgICAgIH0KICAgICAgICAgIHNpbmsuY2xvc2UoKTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBmaW5pc2hXb3JrZXJUYXNrKHRhc2spOwogICAgICAgICAgaWYgKHRhc2sudGVybWluYXRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJHZXRUZXh0Q29udGVudCIsIGZ1bmN0aW9uIChkYXRhLCBzaW5rKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQsCiAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgfSA9IGRhdGE7CiAgICAgIHBkZk1hbmFnZXIuZ2V0UGFnZShwYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICBjb25zdCB0YXNrID0gbmV3IFdvcmtlclRhc2soIkdldFRleHRDb250ZW50OiBwYWdlICIgKyBwYWdlSW5kZXgpOwogICAgICAgIHN0YXJ0V29ya2VyVGFzayh0YXNrKTsKICAgICAgICBjb25zdCBzdGFydCA9IHZlcmJvc2l0eSA+PSBfdXRpbC5WZXJib3NpdHlMZXZlbC5JTkZPUyA/IERhdGUubm93KCkgOiAwOwogICAgICAgIHBhZ2UuZXh0cmFjdFRleHRDb250ZW50KHsKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICB0YXNrLAogICAgICAgICAgc2luaywKICAgICAgICAgIGluY2x1ZGVNYXJrZWRDb250ZW50LAogICAgICAgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZpbmlzaFdvcmtlclRhc2sodGFzayk7CiAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBwYWdlPSR7cGFnZUluZGV4ICsgMX0gLSBnZXRUZXh0Q29udGVudDogdGltZT1gICsgYCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCk7CiAgICAgICAgICB9CiAgICAgICAgICBzaW5rLmNsb3NlKCk7CiAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgZmluaXNoV29ya2VyVGFzayh0YXNrKTsKICAgICAgICAgIGlmICh0YXNrLnRlcm1pbmF0ZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgc2luay5lcnJvcihyZWFzb24pOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiR2V0U3RydWN0VHJlZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmdldFBhZ2UoZGF0YS5wYWdlSW5kZXgpLnRoZW4oZnVuY3Rpb24gKHBhZ2UpIHsKICAgICAgICByZXR1cm4gcGRmTWFuYWdlci5lbnN1cmUocGFnZSwgImdldFN0cnVjdFRyZWUiKTsKICAgICAgfSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIkZvbnRGYWxsYmFjayIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmZvbnRGYWxsYmFjayhkYXRhLmlkLCBoYW5kbGVyKTsKICAgIH0pOwogICAgaGFuZGxlci5vbigiQ2xlYW51cCIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHJldHVybiBwZGZNYW5hZ2VyLmNsZWFudXAodHJ1ZSk7CiAgICB9KTsKICAgIGhhbmRsZXIub24oIlRlcm1pbmF0ZSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlOwogICAgICBjb25zdCB3YWl0T24gPSBbXTsKICAgICAgaWYgKHBkZk1hbmFnZXIpIHsKICAgICAgICBwZGZNYW5hZ2VyLnRlcm1pbmF0ZShuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oIldvcmtlciB3YXMgdGVybWluYXRlZC4iKSk7CiAgICAgICAgY29uc3QgY2xlYW51cFByb21pc2UgPSBwZGZNYW5hZ2VyLmNsZWFudXAoKTsKICAgICAgICB3YWl0T24ucHVzaChjbGVhbnVwUHJvbWlzZSk7CiAgICAgICAgcGRmTWFuYWdlciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgKDAsIF9jbGVhbnVwX2hlbHBlci5jbGVhckdsb2JhbENhY2hlcykoKTsKICAgICAgfQogICAgICBpZiAoY2FuY2VsWEhScykgewogICAgICAgIGNhbmNlbFhIUnMobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuIikpOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBXb3JrZXJUYXNrcykgewogICAgICAgIHdhaXRPbi5wdXNoKHRhc2suZmluaXNoZWQpOwogICAgICAgIHRhc2sudGVybWluYXRlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHdhaXRPbikudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgaGFuZGxlci5kZXN0cm95KCk7CiAgICAgICAgaGFuZGxlciA9IG51bGw7CiAgICAgIH0pOwogICAgfSk7CiAgICBoYW5kbGVyLm9uKCJSZWFkeSIsIGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgIHNldHVwRG9jKGRvY1BhcmFtcyk7CiAgICAgIGRvY1BhcmFtcyA9IG51bGw7CiAgICB9KTsKICAgIHJldHVybiB3b3JrZXJIYW5kbGVyTmFtZTsKICB9CiAgc3RhdGljIGluaXRpYWxpemVGcm9tUG9ydChwb3J0KSB7CiAgICBjb25zdCBoYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoIndvcmtlciIsICJtYWluIiwgcG9ydCk7CiAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cChoYW5kbGVyLCBwb3J0KTsKICAgIGhhbmRsZXIuc2VuZCgicmVhZHkiLCBudWxsKTsKICB9Cn0KZXhwb3J0cy5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IFdvcmtlck1lc3NhZ2VIYW5kbGVyOwpmdW5jdGlvbiBpc01lc3NhZ2VQb3J0KG1heWJlUG9ydCkgewogIHJldHVybiB0eXBlb2YgbWF5YmVQb3J0LnBvc3RNZXNzYWdlID09PSAiZnVuY3Rpb24iICYmICJvbm1lc3NhZ2UiIGluIG1heWJlUG9ydDsKfQppZiAodHlwZW9mIHdpbmRvdyA9PT0gInVuZGVmaW5lZCIgJiYgIV9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiBzZWxmICE9PSAidW5kZWZpbmVkIiAmJiBpc01lc3NhZ2VQb3J0KHNlbGYpKSB7CiAgV29ya2VyTWVzc2FnZUhhbmRsZXIuaW5pdGlhbGl6ZUZyb21Qb3J0KHNlbGYpOwp9CgovKioqLyB9KSwKLyogMiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlZlcmJvc2l0eUxldmVsID0gZXhwb3J0cy5VdGlsID0gZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IGV4cG9ydHMuVGV4dFJlbmRlcmluZ01vZGUgPSBleHBvcnRzLlJlbmRlcmluZ0ludGVudEZsYWcgPSBleHBvcnRzLlByb21pc2VDYXBhYmlsaXR5ID0gZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gZXhwb3J0cy5QYWdlQWN0aW9uRXZlbnRUeXBlID0gZXhwb3J0cy5PUFMgPSBleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBleHBvcnRzLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFID0gZXhwb3J0cy5MSU5FX0ZBQ1RPUiA9IGV4cG9ydHMuTElORV9ERVNDRU5UX0ZBQ1RPUiA9IGV4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IGV4cG9ydHMuSW1hZ2VLaW5kID0gZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkZvcm1hdEVycm9yID0gZXhwb3J0cy5GZWF0dXJlVGVzdCA9IGV4cG9ydHMuRk9OVF9JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkRvY3VtZW50QWN0aW9uRXZlbnRUeXBlID0gZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gZXhwb3J0cy5CQVNFTElORV9GQUNUT1IgPSBleHBvcnRzLkFubm90YXRpb25UeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSBleHBvcnRzLkFubm90YXRpb25SZXZpZXdTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJlcGx5VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbk1vZGUgPSBleHBvcnRzLkFubm90YXRpb25NYXJrZWRTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBleHBvcnRzLkFubm90YXRpb25FZGl0b3JUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4ID0gZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSA9IGV4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSB2b2lkIDA7CmV4cG9ydHMuYXNzZXJ0ID0gYXNzZXJ0OwpleHBvcnRzLmJ5dGVzVG9TdHJpbmcgPSBieXRlc1RvU3RyaW5nOwpleHBvcnRzLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsOwpleHBvcnRzLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBnZXRNb2RpZmljYXRpb25EYXRlOwpleHBvcnRzLmdldFZlcmJvc2l0eUxldmVsID0gZ2V0VmVyYm9zaXR5TGV2ZWw7CmV4cG9ydHMuaW5mbyA9IGluZm87CmV4cG9ydHMuaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7CmV4cG9ydHMuaXNBcnJheUVxdWFsID0gaXNBcnJheUVxdWFsOwpleHBvcnRzLm5vcm1hbGl6ZVVuaWNvZGUgPSBub3JtYWxpemVVbmljb2RlOwpleHBvcnRzLm9iamVjdEZyb21NYXAgPSBvYmplY3RGcm9tTWFwOwpleHBvcnRzLm9iamVjdFNpemUgPSBvYmplY3RTaXplOwpleHBvcnRzLnNldFZlcmJvc2l0eUxldmVsID0gc2V0VmVyYm9zaXR5TGV2ZWw7CmV4cG9ydHMuc2hhZG93ID0gc2hhZG93OwpleHBvcnRzLnN0cmluZzMyID0gc3RyaW5nMzI7CmV4cG9ydHMuc3RyaW5nVG9CeXRlcyA9IHN0cmluZ1RvQnl0ZXM7CmV4cG9ydHMuc3RyaW5nVG9QREZTdHJpbmcgPSBzdHJpbmdUb1BERlN0cmluZzsKZXhwb3J0cy5zdHJpbmdUb1VURjhTdHJpbmcgPSBzdHJpbmdUb1VURjhTdHJpbmc7CmV4cG9ydHMudW5yZWFjaGFibGUgPSB1bnJlYWNoYWJsZTsKZXhwb3J0cy51dGY4U3RyaW5nVG9TdHJpbmcgPSB1dGY4U3RyaW5nVG9TdHJpbmc7CmV4cG9ydHMud2FybiA9IHdhcm47CjsKY29uc3QgSURFTlRJVFlfTUFUUklYID0gWzEsIDAsIDAsIDEsIDAsIDBdOwpleHBvcnRzLklERU5USVRZX01BVFJJWCA9IElERU5USVRZX01BVFJJWDsKY29uc3QgRk9OVF9JREVOVElUWV9NQVRSSVggPSBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXTsKZXhwb3J0cy5GT05UX0lERU5USVRZX01BVFJJWCA9IEZPTlRfSURFTlRJVFlfTUFUUklYOwpjb25zdCBNQVhfSU1BR0VfU0laRV9UT19DQUNIRSA9IDEwZTY7CmV4cG9ydHMuTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSBNQVhfSU1BR0VfU0laRV9UT19DQUNIRTsKY29uc3QgTElORV9GQUNUT1IgPSAxLjM1OwpleHBvcnRzLkxJTkVfRkFDVE9SID0gTElORV9GQUNUT1I7CmNvbnN0IExJTkVfREVTQ0VOVF9GQUNUT1IgPSAwLjM1OwpleHBvcnRzLkxJTkVfREVTQ0VOVF9GQUNUT1IgPSBMSU5FX0RFU0NFTlRfRkFDVE9SOwpjb25zdCBCQVNFTElORV9GQUNUT1IgPSBMSU5FX0RFU0NFTlRfRkFDVE9SIC8gTElORV9GQUNUT1I7CmV4cG9ydHMuQkFTRUxJTkVfRkFDVE9SID0gQkFTRUxJTkVfRkFDVE9SOwpjb25zdCBSZW5kZXJpbmdJbnRlbnRGbGFnID0gewogIEFOWTogMHgwMSwKICBESVNQTEFZOiAweDAyLAogIFBSSU5UOiAweDA0LAogIFNBVkU6IDB4MDgsCiAgQU5OT1RBVElPTlNfRk9STVM6IDB4MTAsCiAgQU5OT1RBVElPTlNfU1RPUkFHRTogMHgyMCwKICBBTk5PVEFUSU9OU19ESVNBQkxFOiAweDQwLAogIE9QTElTVDogMHgxMDAKfTsKZXhwb3J0cy5SZW5kZXJpbmdJbnRlbnRGbGFnID0gUmVuZGVyaW5nSW50ZW50RmxhZzsKY29uc3QgQW5ub3RhdGlvbk1vZGUgPSB7CiAgRElTQUJMRTogMCwKICBFTkFCTEU6IDEsCiAgRU5BQkxFX0ZPUk1TOiAyLAogIEVOQUJMRV9TVE9SQUdFOiAzCn07CmV4cG9ydHMuQW5ub3RhdGlvbk1vZGUgPSBBbm5vdGF0aW9uTW9kZTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9ICJwZGZqc19pbnRlcm5hbF9lZGl0b3JfIjsKZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4ID0gQW5ub3RhdGlvbkVkaXRvclByZWZpeDsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7CiAgRElTQUJMRTogLTEsCiAgTk9ORTogMCwKICBGUkVFVEVYVDogMywKICBJTks6IDE1Cn07CmV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZTsKY29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7CiAgRlJFRVRFWFRfU0laRTogMSwKICBGUkVFVEVYVF9DT0xPUjogMiwKICBGUkVFVEVYVF9PUEFDSVRZOiAzLAogIElOS19DT0xPUjogMTEsCiAgSU5LX1RISUNLTkVTUzogMTIsCiAgSU5LX09QQUNJVFk6IDEzCn07CmV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTsKY29uc3QgUGVybWlzc2lvbkZsYWcgPSB7CiAgUFJJTlQ6IDB4MDQsCiAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LAogIENPUFk6IDB4MTAsCiAgTU9ESUZZX0FOTk9UQVRJT05TOiAweDIwLAogIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLAogIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLAogIEFTU0VNQkxFOiAweDQwMCwKICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwCn07CmV4cG9ydHMuUGVybWlzc2lvbkZsYWcgPSBQZXJtaXNzaW9uRmxhZzsKY29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7CiAgRklMTDogMCwKICBTVFJPS0U6IDEsCiAgRklMTF9TVFJPS0U6IDIsCiAgSU5WSVNJQkxFOiAzLAogIEZJTExfQUREX1RPX1BBVEg6IDQsCiAgU1RST0tFX0FERF9UT19QQVRIOiA1LAogIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LAogIEFERF9UT19QQVRIOiA3LAogIEZJTExfU1RST0tFX01BU0s6IDMsCiAgQUREX1RPX1BBVEhfRkxBRzogNAp9OwpleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGU7CmNvbnN0IEltYWdlS2luZCA9IHsKICBHUkFZU0NBTEVfMUJQUDogMSwKICBSR0JfMjRCUFA6IDIsCiAgUkdCQV8zMkJQUDogMwp9OwpleHBvcnRzLkltYWdlS2luZCA9IEltYWdlS2luZDsKY29uc3QgQW5ub3RhdGlvblR5cGUgPSB7CiAgVEVYVDogMSwKICBMSU5LOiAyLAogIEZSRUVURVhUOiAzLAogIExJTkU6IDQsCiAgU1FVQVJFOiA1LAogIENJUkNMRTogNiwKICBQT0xZR09OOiA3LAogIFBPTFlMSU5FOiA4LAogIEhJR0hMSUdIVDogOSwKICBVTkRFUkxJTkU6IDEwLAogIFNRVUlHR0xZOiAxMSwKICBTVFJJS0VPVVQ6IDEyLAogIFNUQU1QOiAxMywKICBDQVJFVDogMTQsCiAgSU5LOiAxNSwKICBQT1BVUDogMTYsCiAgRklMRUFUVEFDSE1FTlQ6IDE3LAogIFNPVU5EOiAxOCwKICBNT1ZJRTogMTksCiAgV0lER0VUOiAyMCwKICBTQ1JFRU46IDIxLAogIFBSSU5URVJNQVJLOiAyMiwKICBUUkFQTkVUOiAyMywKICBXQVRFUk1BUks6IDI0LAogIFRIUkVFRDogMjUsCiAgUkVEQUNUOiAyNgp9OwpleHBvcnRzLkFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGU7CmNvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHsKICBNQVJLRUQ6ICJNYXJrZWQiLAogIFJFVklFVzogIlJldmlldyIKfTsKZXhwb3J0cy5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGU7CmNvbnN0IEFubm90YXRpb25NYXJrZWRTdGF0ZSA9IHsKICBNQVJLRUQ6ICJNYXJrZWQiLAogIFVOTUFSS0VEOiAiVW5tYXJrZWQiCn07CmV4cG9ydHMuQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0gQW5ub3RhdGlvbk1hcmtlZFN0YXRlOwpjb25zdCBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7CiAgQUNDRVBURUQ6ICJBY2NlcHRlZCIsCiAgUkVKRUNURUQ6ICJSZWplY3RlZCIsCiAgQ0FOQ0VMTEVEOiAiQ2FuY2VsbGVkIiwKICBDT01QTEVURUQ6ICJDb21wbGV0ZWQiLAogIE5PTkU6ICJOb25lIgp9OwpleHBvcnRzLkFubm90YXRpb25SZXZpZXdTdGF0ZSA9IEFubm90YXRpb25SZXZpZXdTdGF0ZTsKY29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHsKICBHUk9VUDogIkdyb3VwIiwKICBSRVBMWTogIlIiCn07CmV4cG9ydHMuQW5ub3RhdGlvblJlcGx5VHlwZSA9IEFubm90YXRpb25SZXBseVR5cGU7CmNvbnN0IEFubm90YXRpb25GbGFnID0gewogIElOVklTSUJMRTogMHgwMSwKICBISURERU46IDB4MDIsCiAgUFJJTlQ6IDB4MDQsCiAgTk9aT09NOiAweDA4LAogIE5PUk9UQVRFOiAweDEwLAogIE5PVklFVzogMHgyMCwKICBSRUFET05MWTogMHg0MCwKICBMT0NLRUQ6IDB4ODAsCiAgVE9HR0xFTk9WSUVXOiAweDEwMCwKICBMT0NLRURDT05URU5UUzogMHgyMDAKfTsKZXhwb3J0cy5Bbm5vdGF0aW9uRmxhZyA9IEFubm90YXRpb25GbGFnOwpjb25zdCBBbm5vdGF0aW9uRmllbGRGbGFnID0gewogIFJFQURPTkxZOiAweDAwMDAwMDEsCiAgUkVRVUlSRUQ6IDB4MDAwMDAwMiwKICBOT0VYUE9SVDogMHgwMDAwMDA0LAogIE1VTFRJTElORTogMHgwMDAxMDAwLAogIFBBU1NXT1JEOiAweDAwMDIwMDAsCiAgTk9UT0dHTEVUT09GRjogMHgwMDA0MDAwLAogIFJBRElPOiAweDAwMDgwMDAsCiAgUFVTSEJVVFRPTjogMHgwMDEwMDAwLAogIENPTUJPOiAweDAwMjAwMDAsCiAgRURJVDogMHgwMDQwMDAwLAogIFNPUlQ6IDB4MDA4MDAwMCwKICBGSUxFU0VMRUNUOiAweDAxMDAwMDAsCiAgTVVMVElTRUxFQ1Q6IDB4MDIwMDAwMCwKICBET05PVFNQRUxMQ0hFQ0s6IDB4MDQwMDAwMCwKICBET05PVFNDUk9MTDogMHgwODAwMDAwLAogIENPTUI6IDB4MTAwMDAwMCwKICBSSUNIVEVYVDogMHgyMDAwMDAwLAogIFJBRElPU0lOVU5JU09OOiAweDIwMDAwMDAsCiAgQ09NTUlUT05TRUxDSEFOR0U6IDB4NDAwMDAwMAp9OwpleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBBbm5vdGF0aW9uRmllbGRGbGFnOwpjb25zdCBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gewogIFNPTElEOiAxLAogIERBU0hFRDogMiwKICBCRVZFTEVEOiAzLAogIElOU0VUOiA0LAogIFVOREVSTElORTogNQp9OwpleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSBBbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlOwpjb25zdCBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlID0gewogIEU6ICJNb3VzZSBFbnRlciIsCiAgWDogIk1vdXNlIEV4aXQiLAogIEQ6ICJNb3VzZSBEb3duIiwKICBVOiAiTW91c2UgVXAiLAogIEZvOiAiRm9jdXMiLAogIEJsOiAiQmx1ciIsCiAgUE86ICJQYWdlT3BlbiIsCiAgUEM6ICJQYWdlQ2xvc2UiLAogIFBWOiAiUGFnZVZpc2libGUiLAogIFBJOiAiUGFnZUludmlzaWJsZSIsCiAgSzogIktleXN0cm9rZSIsCiAgRjogIkZvcm1hdCIsCiAgVjogIlZhbGlkYXRlIiwKICBDOiAiQ2FsY3VsYXRlIgp9OwpleHBvcnRzLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlOwpjb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHsKICBXQzogIldpbGxDbG9zZSIsCiAgV1M6ICJXaWxsU2F2ZSIsCiAgRFM6ICJEaWRTYXZlIiwKICBXUDogIldpbGxQcmludCIsCiAgRFA6ICJEaWRQcmludCIKfTsKZXhwb3J0cy5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IERvY3VtZW50QWN0aW9uRXZlbnRUeXBlOwpjb25zdCBQYWdlQWN0aW9uRXZlbnRUeXBlID0gewogIE86ICJQYWdlT3BlbiIsCiAgQzogIlBhZ2VDbG9zZSIKfTsKZXhwb3J0cy5QYWdlQWN0aW9uRXZlbnRUeXBlID0gUGFnZUFjdGlvbkV2ZW50VHlwZTsKY29uc3QgVmVyYm9zaXR5TGV2ZWwgPSB7CiAgRVJST1JTOiAwLAogIFdBUk5JTkdTOiAxLAogIElORk9TOiA1Cn07CmV4cG9ydHMuVmVyYm9zaXR5TGV2ZWwgPSBWZXJib3NpdHlMZXZlbDsKY29uc3QgQ01hcENvbXByZXNzaW9uVHlwZSA9IHsKICBOT05FOiAwLAogIEJJTkFSWTogMQp9OwpleHBvcnRzLkNNYXBDb21wcmVzc2lvblR5cGUgPSBDTWFwQ29tcHJlc3Npb25UeXBlOwpjb25zdCBPUFMgPSB7CiAgZGVwZW5kZW5jeTogMSwKICBzZXRMaW5lV2lkdGg6IDIsCiAgc2V0TGluZUNhcDogMywKICBzZXRMaW5lSm9pbjogNCwKICBzZXRNaXRlckxpbWl0OiA1LAogIHNldERhc2g6IDYsCiAgc2V0UmVuZGVyaW5nSW50ZW50OiA3LAogIHNldEZsYXRuZXNzOiA4LAogIHNldEdTdGF0ZTogOSwKICBzYXZlOiAxMCwKICByZXN0b3JlOiAxMSwKICB0cmFuc2Zvcm06IDEyLAogIG1vdmVUbzogMTMsCiAgbGluZVRvOiAxNCwKICBjdXJ2ZVRvOiAxNSwKICBjdXJ2ZVRvMjogMTYsCiAgY3VydmVUbzM6IDE3LAogIGNsb3NlUGF0aDogMTgsCiAgcmVjdGFuZ2xlOiAxOSwKICBzdHJva2U6IDIwLAogIGNsb3NlU3Ryb2tlOiAyMSwKICBmaWxsOiAyMiwKICBlb0ZpbGw6IDIzLAogIGZpbGxTdHJva2U6IDI0LAogIGVvRmlsbFN0cm9rZTogMjUsCiAgY2xvc2VGaWxsU3Ryb2tlOiAyNiwKICBjbG9zZUVPRmlsbFN0cm9rZTogMjcsCiAgZW5kUGF0aDogMjgsCiAgY2xpcDogMjksCiAgZW9DbGlwOiAzMCwKICBiZWdpblRleHQ6IDMxLAogIGVuZFRleHQ6IDMyLAogIHNldENoYXJTcGFjaW5nOiAzMywKICBzZXRXb3JkU3BhY2luZzogMzQsCiAgc2V0SFNjYWxlOiAzNSwKICBzZXRMZWFkaW5nOiAzNiwKICBzZXRGb250OiAzNywKICBzZXRUZXh0UmVuZGVyaW5nTW9kZTogMzgsCiAgc2V0VGV4dFJpc2U6IDM5LAogIG1vdmVUZXh0OiA0MCwKICBzZXRMZWFkaW5nTW92ZVRleHQ6IDQxLAogIHNldFRleHRNYXRyaXg6IDQyLAogIG5leHRMaW5lOiA0MywKICBzaG93VGV4dDogNDQsCiAgc2hvd1NwYWNlZFRleHQ6IDQ1LAogIG5leHRMaW5lU2hvd1RleHQ6IDQ2LAogIG5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OiA0NywKICBzZXRDaGFyV2lkdGg6IDQ4LAogIHNldENoYXJXaWR0aEFuZEJvdW5kczogNDksCiAgc2V0U3Ryb2tlQ29sb3JTcGFjZTogNTAsCiAgc2V0RmlsbENvbG9yU3BhY2U6IDUxLAogIHNldFN0cm9rZUNvbG9yOiA1MiwKICBzZXRTdHJva2VDb2xvck46IDUzLAogIHNldEZpbGxDb2xvcjogNTQsCiAgc2V0RmlsbENvbG9yTjogNTUsCiAgc2V0U3Ryb2tlR3JheTogNTYsCiAgc2V0RmlsbEdyYXk6IDU3LAogIHNldFN0cm9rZVJHQkNvbG9yOiA1OCwKICBzZXRGaWxsUkdCQ29sb3I6IDU5LAogIHNldFN0cm9rZUNNWUtDb2xvcjogNjAsCiAgc2V0RmlsbENNWUtDb2xvcjogNjEsCiAgc2hhZGluZ0ZpbGw6IDYyLAogIGJlZ2luSW5saW5lSW1hZ2U6IDYzLAogIGJlZ2luSW1hZ2VEYXRhOiA2NCwKICBlbmRJbmxpbmVJbWFnZTogNjUsCiAgcGFpbnRYT2JqZWN0OiA2NiwKICBtYXJrUG9pbnQ6IDY3LAogIG1hcmtQb2ludFByb3BzOiA2OCwKICBiZWdpbk1hcmtlZENvbnRlbnQ6IDY5LAogIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiA3MCwKICBlbmRNYXJrZWRDb250ZW50OiA3MSwKICBiZWdpbkNvbXBhdDogNzIsCiAgZW5kQ29tcGF0OiA3MywKICBwYWludEZvcm1YT2JqZWN0QmVnaW46IDc0LAogIHBhaW50Rm9ybVhPYmplY3RFbmQ6IDc1LAogIGJlZ2luR3JvdXA6IDc2LAogIGVuZEdyb3VwOiA3NywKICBiZWdpbkFubm90YXRpb246IDgwLAogIGVuZEFubm90YXRpb246IDgxLAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdDogODMsCiAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXA6IDg0LAogIHBhaW50SW1hZ2VYT2JqZWN0OiA4NSwKICBwYWludElubGluZUltYWdlWE9iamVjdDogODYsCiAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cDogODcsCiAgcGFpbnRJbWFnZVhPYmplY3RSZXBlYXQ6IDg4LAogIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdDogODksCiAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrOiA5MCwKICBjb25zdHJ1Y3RQYXRoOiA5MQp9OwpleHBvcnRzLk9QUyA9IE9QUzsKY29uc3QgUGFzc3dvcmRSZXNwb25zZXMgPSB7CiAgTkVFRF9QQVNTV09SRDogMSwKICBJTkNPUlJFQ1RfUEFTU1dPUkQ6IDIKfTsKZXhwb3J0cy5QYXNzd29yZFJlc3BvbnNlcyA9IFBhc3N3b3JkUmVzcG9uc2VzOwpsZXQgdmVyYm9zaXR5ID0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1M7CmZ1bmN0aW9uIHNldFZlcmJvc2l0eUxldmVsKGxldmVsKSB7CiAgaWYgKE51bWJlci5pc0ludGVnZXIobGV2ZWwpKSB7CiAgICB2ZXJib3NpdHkgPSBsZXZlbDsKICB9Cn0KZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKSB7CiAgcmV0dXJuIHZlcmJvc2l0eTsKfQpmdW5jdGlvbiBpbmZvKG1zZykgewogIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuSU5GT1MpIHsKICAgIGNvbnNvbGUubG9nKGBJbmZvOiAke21zZ31gKTsKICB9Cn0KZnVuY3Rpb24gd2Fybihtc2cpIHsKICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTKSB7CiAgICBjb25zb2xlLmxvZyhgV2FybmluZzogJHttc2d9YCk7CiAgfQp9CmZ1bmN0aW9uIHVucmVhY2hhYmxlKG1zZykgewogIHRocm93IG5ldyBFcnJvcihtc2cpOwp9CmZ1bmN0aW9uIGFzc2VydChjb25kLCBtc2cpIHsKICBpZiAoIWNvbmQpIHsKICAgIHVucmVhY2hhYmxlKG1zZyk7CiAgfQp9CmZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2wodXJsKSB7CiAgc3dpdGNoICh1cmw/LnByb3RvY29sKSB7CiAgICBjYXNlICJodHRwOiI6CiAgICBjYXNlICJodHRwczoiOgogICAgY2FzZSAiZnRwOiI6CiAgICBjYXNlICJtYWlsdG86IjoKICAgIGNhc2UgInRlbDoiOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICB9Cn0KZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwgPSBudWxsLCBvcHRpb25zID0gbnVsbCkgewogIGlmICghdXJsKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgdHJ5IHsKICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICAgIGlmIChvcHRpb25zLmFkZERlZmF1bHRQcm90b2NvbCAmJiB1cmwuc3RhcnRzV2l0aCgid3d3LiIpKSB7CiAgICAgICAgY29uc3QgZG90cyA9IHVybC5tYXRjaCgvXC4vZyk7CiAgICAgICAgaWYgKGRvdHM/Lmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICB1cmwgPSBgaHR0cDovLyR7dXJsfWA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLnRyeUNvbnZlcnRFbmNvZGluZykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB1cmwgPSBzdHJpbmdUb1VURjhTdHJpbmcodXJsKTsKICAgICAgICB9IGNhdGNoIChleCkge30KICAgICAgfQogICAgfQogICAgY29uc3QgYWJzb2x1dGVVcmwgPSBiYXNlVXJsID8gbmV3IFVSTCh1cmwsIGJhc2VVcmwpIDogbmV3IFVSTCh1cmwpOwogICAgaWYgKF9pc1ZhbGlkUHJvdG9jb2woYWJzb2x1dGVVcmwpKSB7CiAgICAgIHJldHVybiBhYnNvbHV0ZVVybDsKICAgIH0KICB9IGNhdGNoIChleCkge30KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBzaGFkb3cob2JqLCBwcm9wLCB2YWx1ZSwgbm9uU2VyaWFsaXphYmxlID0gZmFsc2UpIHsKICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7CiAgICB2YWx1ZSwKICAgIGVudW1lcmFibGU6ICFub25TZXJpYWxpemFibGUsCiAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICB3cml0YWJsZTogZmFsc2UKICB9KTsKICByZXR1cm4gdmFsdWU7Cn0KY29uc3QgQmFzZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCkgewogIGZ1bmN0aW9uIEJhc2VFeGNlcHRpb24obWVzc2FnZSwgbmFtZSkgewogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VFeGNlcHRpb24pIHsKICAgICAgdW5yZWFjaGFibGUoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uIik7CiAgICB9CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogICAgdGhpcy5uYW1lID0gbmFtZTsKICB9CiAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsKICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjsKICByZXR1cm4gQmFzZUV4Y2VwdGlvbjsKfSgpOwpleHBvcnRzLkJhc2VFeGNlcHRpb24gPSBCYXNlRXhjZXB0aW9uOwpjbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZywgY29kZSkgewogICAgc3VwZXIobXNnLCAiUGFzc3dvcmRFeGNlcHRpb24iKTsKICAgIHRoaXMuY29kZSA9IGNvZGU7CiAgfQp9CmV4cG9ydHMuUGFzc3dvcmRFeGNlcHRpb24gPSBQYXNzd29yZEV4Y2VwdGlvbjsKY2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7CiAgICBzdXBlcihtc2csICJVbmtub3duRXJyb3JFeGNlcHRpb24iKTsKICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7CiAgfQp9CmV4cG9ydHMuVW5rbm93bkVycm9yRXhjZXB0aW9uID0gVW5rbm93bkVycm9yRXhjZXB0aW9uOwpjbGFzcyBJbnZhbGlkUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJJbnZhbGlkUERGRXhjZXB0aW9uIik7CiAgfQp9CmV4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IEludmFsaWRQREZFeGNlcHRpb247CmNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIk1pc3NpbmdQREZFeGNlcHRpb24iKTsKICB9Cn0KZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gTWlzc2luZ1BERkV4Y2VwdGlvbjsKY2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnLCBzdGF0dXMpIHsKICAgIHN1cGVyKG1zZywgIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiIpOwogICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CiAgfQp9CmV4cG9ydHMuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uID0gVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uOwpjbGFzcyBGb3JtYXRFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiRm9ybWF0RXJyb3IiKTsKICB9Cn0KZXhwb3J0cy5Gb3JtYXRFcnJvciA9IEZvcm1hdEVycm9yOwpjbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiQWJvcnRFeGNlcHRpb24iKTsKICB9Cn0KZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IEFib3J0RXhjZXB0aW9uOwpmdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7CiAgaWYgKHR5cGVvZiBieXRlcyAhPT0gIm9iamVjdCIgfHwgYnl0ZXM/Lmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7CiAgICB1bnJlYWNoYWJsZSgiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZyIpOwogIH0KICBjb25zdCBsZW5ndGggPSBieXRlcy5sZW5ndGg7CiAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5MjsKICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7CiAgfQogIGNvbnN0IHN0ckJ1ZiA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IE1BWF9BUkdVTUVOVF9DT1VOVCkgewogICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpOwogICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7CiAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgfQogIHJldHVybiBzdHJCdWYuam9pbigiIik7Cn0KZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHsKICBpZiAodHlwZW9mIHN0ciAhPT0gInN0cmluZyIpIHsKICAgIHVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7CiAgfQogIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7CiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmOwogIH0KICByZXR1cm4gYnl0ZXM7Cn0KZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHsKICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7Cn0KZnVuY3Rpb24gb2JqZWN0U2l6ZShvYmopIHsKICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGg7Cn0KZnVuY3Rpb24gb2JqZWN0RnJvbU1hcChtYXApIHsKICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcCkgewogICAgb2JqW2tleV0gPSB2YWx1ZTsKICB9CiAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHsKICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7CiAgYnVmZmVyOFswXSA9IDE7CiAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTsKICByZXR1cm4gdmlldzMyWzBdID09PSAxOwp9CmZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHsKICB0cnkgewogICAgbmV3IEZ1bmN0aW9uKCIiKTsKICAgIHJldHVybiB0cnVlOwogIH0gY2F0Y2ggKGUpIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KY2xhc3MgRmVhdHVyZVRlc3QgewogIHN0YXRpYyBnZXQgaXNMaXR0bGVFbmRpYW4oKSB7CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJpc0xpdHRsZUVuZGlhbiIsIGlzTGl0dGxlRW5kaWFuKCkpOwogIH0KICBzdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzRXZhbFN1cHBvcnRlZCIsIGlzRXZhbFN1cHBvcnRlZCgpKTsKICB9CiAgc3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiBzaGFkb3codGhpcywgImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwgdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gInVuZGVmaW5lZCIpOwogIH0KICBzdGF0aWMgZ2V0IHBsYXRmb3JtKCkgewogICAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHJldHVybiBzaGFkb3codGhpcywgInBsYXRmb3JtIiwgewogICAgICAgIGlzV2luOiBmYWxzZSwKICAgICAgICBpc01hYzogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc2hhZG93KHRoaXMsICJwbGF0Zm9ybSIsIHsKICAgICAgaXNXaW46IG5hdmlnYXRvci5wbGF0Zm9ybS5pbmNsdWRlcygiV2luIiksCiAgICAgIGlzTWFjOiBuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoIk1hYyIpCiAgICB9KTsKICB9Cn0KZXhwb3J0cy5GZWF0dXJlVGVzdCA9IEZlYXR1cmVUZXN0Owpjb25zdCBoZXhOdW1iZXJzID0gWy4uLkFycmF5KDI1Nikua2V5cygpXS5tYXAobiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAiMCIpKTsKY2xhc3MgVXRpbCB7CiAgc3RhdGljIG1ha2VIZXhDb2xvcihyLCBnLCBiKSB7CiAgICByZXR1cm4gYCMke2hleE51bWJlcnNbcl19JHtoZXhOdW1iZXJzW2ddfSR7aGV4TnVtYmVyc1tiXX1gOwogIH0KICBzdGF0aWMgc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHsKICAgIGxldCB0ZW1wOwogICAgaWYgKHRyYW5zZm9ybVswXSkgewogICAgICBpZiAodHJhbnNmb3JtWzBdIDwgMCkgewogICAgICAgIHRlbXAgPSBtaW5NYXhbMF07CiAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzFdOwogICAgICAgIG1pbk1heFsxXSA9IHRlbXA7CiAgICAgIH0KICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVswXTsKICAgICAgbWluTWF4WzFdICo9IHRyYW5zZm9ybVswXTsKICAgICAgaWYgKHRyYW5zZm9ybVszXSA8IDApIHsKICAgICAgICB0ZW1wID0gbWluTWF4WzJdOwogICAgICAgIG1pbk1heFsyXSA9IG1pbk1heFszXTsKICAgICAgICBtaW5NYXhbM10gPSB0ZW1wOwogICAgICB9CiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bM107CiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bM107CiAgICB9IGVsc2UgewogICAgICB0ZW1wID0gbWluTWF4WzBdOwogICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMl07CiAgICAgIG1pbk1heFsyXSA9IHRlbXA7CiAgICAgIHRlbXAgPSBtaW5NYXhbMV07CiAgICAgIG1pbk1heFsxXSA9IG1pbk1heFszXTsKICAgICAgbWluTWF4WzNdID0gdGVtcDsKICAgICAgaWYgKHRyYW5zZm9ybVsxXSA8IDApIHsKICAgICAgICB0ZW1wID0gbWluTWF4WzJdOwogICAgICAgIG1pbk1heFsyXSA9IG1pbk1heFszXTsKICAgICAgICBtaW5NYXhbM10gPSB0ZW1wOwogICAgICB9CiAgICAgIG1pbk1heFsyXSAqPSB0cmFuc2Zvcm1bMV07CiAgICAgIG1pbk1heFszXSAqPSB0cmFuc2Zvcm1bMV07CiAgICAgIGlmICh0cmFuc2Zvcm1bMl0gPCAwKSB7CiAgICAgICAgdGVtcCA9IG1pbk1heFswXTsKICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMV07CiAgICAgICAgbWluTWF4WzFdID0gdGVtcDsKICAgICAgfQogICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzJdOwogICAgICBtaW5NYXhbMV0gKj0gdHJhbnNmb3JtWzJdOwogICAgfQogICAgbWluTWF4WzBdICs9IHRyYW5zZm9ybVs0XTsKICAgIG1pbk1heFsxXSArPSB0cmFuc2Zvcm1bNF07CiAgICBtaW5NYXhbMl0gKz0gdHJhbnNmb3JtWzVdOwogICAgbWluTWF4WzNdICs9IHRyYW5zZm9ybVs1XTsKICB9CiAgc3RhdGljIHRyYW5zZm9ybShtMSwgbTIpIHsKICAgIHJldHVybiBbbTFbMF0gKiBtMlswXSArIG0xWzJdICogbTJbMV0sIG0xWzFdICogbTJbMF0gKyBtMVszXSAqIG0yWzFdLCBtMVswXSAqIG0yWzJdICsgbTFbMl0gKiBtMlszXSwgbTFbMV0gKiBtMlsyXSArIG0xWzNdICogbTJbM10sIG0xWzBdICogbTJbNF0gKyBtMVsyXSAqIG0yWzVdICsgbTFbNF0sIG0xWzFdICogbTJbNF0gKyBtMVszXSAqIG0yWzVdICsgbTFbNV1dOwogIH0KICBzdGF0aWMgYXBwbHlUcmFuc2Zvcm0ocCwgbSkgewogICAgY29uc3QgeHQgPSBwWzBdICogbVswXSArIHBbMV0gKiBtWzJdICsgbVs0XTsKICAgIGNvbnN0IHl0ID0gcFswXSAqIG1bMV0gKyBwWzFdICogbVszXSArIG1bNV07CiAgICByZXR1cm4gW3h0LCB5dF07CiAgfQogIHN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0ocCwgbSkgewogICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07CiAgICBjb25zdCB4dCA9IChwWzBdICogbVszXSAtIHBbMV0gKiBtWzJdICsgbVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkOwogICAgY29uc3QgeXQgPSAoLXBbMF0gKiBtWzFdICsgcFsxXSAqIG1bMF0gKyBtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGQ7CiAgICByZXR1cm4gW3h0LCB5dF07CiAgfQogIHN0YXRpYyBnZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChyLCBtKSB7CiAgICBjb25zdCBwMSA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0ociwgbSk7CiAgICBjb25zdCBwMiA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oci5zbGljZSgyLCA0KSwgbSk7CiAgICBjb25zdCBwMyA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMF0sIHJbM11dLCBtKTsKICAgIGNvbnN0IHA0ID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclsyXSwgclsxXV0sIG0pOwogICAgcmV0dXJuIFtNYXRoLm1pbihwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWluKHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKSwgTWF0aC5tYXgocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1heChwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSldOwogIH0KICBzdGF0aWMgaW52ZXJzZVRyYW5zZm9ybShtKSB7CiAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTsKICAgIHJldHVybiBbbVszXSAvIGQsIC1tWzFdIC8gZCwgLW1bMl0gLyBkLCBtWzBdIC8gZCwgKG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZCwgKG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZF07CiAgfQogIHN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShtKSB7CiAgICBjb25zdCB0cmFuc3Bvc2UgPSBbbVswXSwgbVsyXSwgbVsxXSwgbVszXV07CiAgICBjb25zdCBhID0gbVswXSAqIHRyYW5zcG9zZVswXSArIG1bMV0gKiB0cmFuc3Bvc2VbMl07CiAgICBjb25zdCBiID0gbVswXSAqIHRyYW5zcG9zZVsxXSArIG1bMV0gKiB0cmFuc3Bvc2VbM107CiAgICBjb25zdCBjID0gbVsyXSAqIHRyYW5zcG9zZVswXSArIG1bM10gKiB0cmFuc3Bvc2VbMl07CiAgICBjb25zdCBkID0gbVsyXSAqIHRyYW5zcG9zZVsxXSArIG1bM10gKiB0cmFuc3Bvc2VbM107CiAgICBjb25zdCBmaXJzdCA9IChhICsgZCkgLyAyOwogICAgY29uc3Qgc2Vjb25kID0gTWF0aC5zcXJ0KChhICsgZCkgKiogMiAtIDQgKiAoYSAqIGQgLSBjICogYikpIC8gMjsKICAgIGNvbnN0IHN4ID0gZmlyc3QgKyBzZWNvbmQgfHwgMTsKICAgIGNvbnN0IHN5ID0gZmlyc3QgLSBzZWNvbmQgfHwgMTsKICAgIHJldHVybiBbTWF0aC5zcXJ0KHN4KSwgTWF0aC5zcXJ0KHN5KV07CiAgfQogIHN0YXRpYyBub3JtYWxpemVSZWN0KHJlY3QpIHsKICAgIGNvbnN0IHIgPSByZWN0LnNsaWNlKDApOwogICAgaWYgKHJlY3RbMF0gPiByZWN0WzJdKSB7CiAgICAgIHJbMF0gPSByZWN0WzJdOwogICAgICByWzJdID0gcmVjdFswXTsKICAgIH0KICAgIGlmIChyZWN0WzFdID4gcmVjdFszXSkgewogICAgICByWzFdID0gcmVjdFszXTsKICAgICAgclszXSA9IHJlY3RbMV07CiAgICB9CiAgICByZXR1cm4gcjsKICB9CiAgc3RhdGljIGludGVyc2VjdChyZWN0MSwgcmVjdDIpIHsKICAgIGNvbnN0IHhMb3cgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1pbihyZWN0MlswXSwgcmVjdDJbMl0pKTsKICAgIGNvbnN0IHhIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5tYXgocmVjdDJbMF0sIHJlY3QyWzJdKSk7CiAgICBpZiAoeExvdyA+IHhIaWdoKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeUxvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWluKHJlY3QyWzFdLCByZWN0MlszXSkpOwogICAgY29uc3QgeUhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVsxXSwgcmVjdDFbM10pLCBNYXRoLm1heChyZWN0MlsxXSwgcmVjdDJbM10pKTsKICAgIGlmICh5TG93ID4geUhpZ2gpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gW3hMb3csIHlMb3csIHhIaWdoLCB5SGlnaF07CiAgfQogIHN0YXRpYyBiZXppZXJCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHsKICAgIGNvbnN0IHR2YWx1ZXMgPSBbXSwKICAgICAgYm91bmRzID0gW1tdLCBbXV07CiAgICBsZXQgYSwgYiwgYywgdCwgdDEsIHQyLCBiMmFjLCBzcXJ0YjJhYzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgYiA9IDYgKiB4MCAtIDEyICogeDEgKyA2ICogeDI7CiAgICAgICAgYSA9IC0zICogeDAgKyA5ICogeDEgLSA5ICogeDIgKyAzICogeDM7CiAgICAgICAgYyA9IDMgKiB4MSAtIDMgKiB4MDsKICAgICAgfSBlbHNlIHsKICAgICAgICBiID0gNiAqIHkwIC0gMTIgKiB5MSArIDYgKiB5MjsKICAgICAgICBhID0gLTMgKiB5MCArIDkgKiB5MSAtIDkgKiB5MiArIDMgKiB5MzsKICAgICAgICBjID0gMyAqIHkxIC0gMyAqIHkwOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhKSA8IDFlLTEyKSB7CiAgICAgICAgaWYgKE1hdGguYWJzKGIpIDwgMWUtMTIpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0ID0gLWMgLyBiOwogICAgICAgIGlmICgwIDwgdCAmJiB0IDwgMSkgewogICAgICAgICAgdHZhbHVlcy5wdXNoKHQpOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBiMmFjID0gYiAqIGIgLSA0ICogYyAqIGE7CiAgICAgIHNxcnRiMmFjID0gTWF0aC5zcXJ0KGIyYWMpOwogICAgICBpZiAoYjJhYyA8IDApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0MSA9ICgtYiArIHNxcnRiMmFjKSAvICgyICogYSk7CiAgICAgIGlmICgwIDwgdDEgJiYgdDEgPCAxKSB7CiAgICAgICAgdHZhbHVlcy5wdXNoKHQxKTsKICAgICAgfQogICAgICB0MiA9ICgtYiAtIHNxcnRiMmFjKSAvICgyICogYSk7CiAgICAgIGlmICgwIDwgdDIgJiYgdDIgPCAxKSB7CiAgICAgICAgdHZhbHVlcy5wdXNoKHQyKTsKICAgICAgfQogICAgfQogICAgbGV0IGogPSB0dmFsdWVzLmxlbmd0aCwKICAgICAgbXQ7CiAgICBjb25zdCBqbGVuID0gajsKICAgIHdoaWxlIChqLS0pIHsKICAgICAgdCA9IHR2YWx1ZXNbal07CiAgICAgIG10ID0gMSAtIHQ7CiAgICAgIGJvdW5kc1swXVtqXSA9IG10ICogbXQgKiBtdCAqIHgwICsgMyAqIG10ICogbXQgKiB0ICogeDEgKyAzICogbXQgKiB0ICogdCAqIHgyICsgdCAqIHQgKiB0ICogeDM7CiAgICAgIGJvdW5kc1sxXVtqXSA9IG10ICogbXQgKiBtdCAqIHkwICsgMyAqIG10ICogbXQgKiB0ICogeTEgKyAzICogbXQgKiB0ICogdCAqIHkyICsgdCAqIHQgKiB0ICogeTM7CiAgICB9CiAgICBib3VuZHNbMF1bamxlbl0gPSB4MDsKICAgIGJvdW5kc1sxXVtqbGVuXSA9IHkwOwogICAgYm91bmRzWzBdW2psZW4gKyAxXSA9IHgzOwogICAgYm91bmRzWzFdW2psZW4gKyAxXSA9IHkzOwogICAgYm91bmRzWzBdLmxlbmd0aCA9IGJvdW5kc1sxXS5sZW5ndGggPSBqbGVuICsgMjsKICAgIHJldHVybiBbTWF0aC5taW4oLi4uYm91bmRzWzBdKSwgTWF0aC5taW4oLi4uYm91bmRzWzFdKSwgTWF0aC5tYXgoLi4uYm91bmRzWzBdKSwgTWF0aC5tYXgoLi4uYm91bmRzWzFdKV07CiAgfQp9CmV4cG9ydHMuVXRpbCA9IFV0aWw7CmNvbnN0IFBERlN0cmluZ1RyYW5zbGF0ZVRhYmxlID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MmQ4LCAweDJjNywgMHgyYzYsIDB4MmQ5LCAweDJkZCwgMHgyZGIsIDB4MmRhLCAweDJkYywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyMDIyLCAweDIwMjAsIDB4MjAyMSwgMHgyMDI2LCAweDIwMTQsIDB4MjAxMywgMHgxOTIsIDB4MjA0NCwgMHgyMDM5LCAweDIwM2EsIDB4MjIxMiwgMHgyMDMwLCAweDIwMWUsIDB4MjAxYywgMHgyMDFkLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFhLCAweDIxMjIsIDB4ZmIwMSwgMHhmYjAyLCAweDE0MSwgMHgxNTIsIDB4MTYwLCAweDE3OCwgMHgxN2QsIDB4MTMxLCAweDE0MiwgMHgxNTMsIDB4MTYxLCAweDE3ZSwgMCwgMHgyMGFjXTsKZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoc3RyKSB7CiAgaWYgKHN0clswXSA+PSAiXHhFRiIpIHsKICAgIGxldCBlbmNvZGluZzsKICAgIGlmIChzdHJbMF0gPT09ICJceEZFIiAmJiBzdHJbMV0gPT09ICJceEZGIikgewogICAgICBlbmNvZGluZyA9ICJ1dGYtMTZiZSI7CiAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gIlx4RkYiICYmIHN0clsxXSA9PT0gIlx4RkUiKSB7CiAgICAgIGVuY29kaW5nID0gInV0Zi0xNmxlIjsKICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSAiXHhFRiIgJiYgc3RyWzFdID09PSAiXHhCQiIgJiYgc3RyWzJdID09PSAiXHhCRiIpIHsKICAgICAgZW5jb2RpbmcgPSAidXRmLTgiOwogICAgfQogICAgaWYgKGVuY29kaW5nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywgewogICAgICAgICAgZmF0YWw6IHRydWUKICAgICAgICB9KTsKICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJpbmdUb0J5dGVzKHN0cik7CiAgICAgICAgcmV0dXJuIGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgd2Fybihgc3RyaW5nVG9QREZTdHJpbmc6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICB9CiAgY29uc3Qgc3RyQnVmID0gW107CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07CiAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpOwogIH0KICByZXR1cm4gc3RyQnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhzdHIpIHsKICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTsKfQpmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7CiAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsKfQpmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHYpIHsKICByZXR1cm4gdHlwZW9mIHYgPT09ICJvYmplY3QiICYmIHY/LmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZDsKfQpmdW5jdGlvbiBpc0FycmF5RXF1YWwoYXJyMSwgYXJyMikgewogIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gYXJyMS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIGdldE1vZGlmaWNhdGlvbkRhdGUoZGF0ZSA9IG5ldyBEYXRlKCkpIHsKICBjb25zdCBidWZmZXIgPSBbZGF0ZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksIChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIiksIGRhdGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKSwgZGF0ZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAiMCIpLCBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIildOwogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KY2xhc3MgUHJvbWlzZUNhcGFiaWxpdHkgewogICNzZXR0bGVkID0gZmFsc2U7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIHRoaXMucmVzb2x2ZSA9IGRhdGEgPT4gewogICAgICAgIHRoaXMuI3NldHRsZWQgPSB0cnVlOwogICAgICAgIHJlc29sdmUoZGF0YSk7CiAgICAgIH07CiAgICAgIHRoaXMucmVqZWN0ID0gcmVhc29uID0+IHsKICAgICAgICB0aGlzLiNzZXR0bGVkID0gdHJ1ZTsKICAgICAgICByZWplY3QocmVhc29uKTsKICAgICAgfTsKICAgIH0pOwogIH0KICBnZXQgc2V0dGxlZCgpIHsKICAgIHJldHVybiB0aGlzLiNzZXR0bGVkOwogIH0KfQpleHBvcnRzLlByb21pc2VDYXBhYmlsaXR5ID0gUHJvbWlzZUNhcGFiaWxpdHk7CmxldCBOb3JtYWxpemVSZWdleCA9IG51bGw7CmxldCBOb3JtYWxpemF0aW9uTWFwID0gbnVsbDsKZnVuY3Rpb24gbm9ybWFsaXplVW5pY29kZShzdHIpIHsKICBpZiAoIU5vcm1hbGl6ZVJlZ2V4KSB7CiAgICBOb3JtYWxpemVSZWdleCA9IC8oW1x1MDBhMFx1MDBiNVx1MDM3ZVx1MGViM1x1MjAwMC1cdTIwMGFcdTIwMmZcdTIxMjZcdWZiMDAtXHVmYjA0XHVmYjA2XHVmYjIwLVx1ZmIzNlx1ZmIzOC1cdWZiM2NcdWZiM2VcdWZiNDAtXHVmYjQxXHVmYjQzLVx1ZmI0NFx1ZmI0Ni1cdWZiYTFcdWZiYTQtXHVmYmE5XHVmYmFlLVx1ZmJiMVx1ZmJkMy1cdWZiZGNcdWZiZGUtXHVmYmU3XHVmYmVhLVx1ZmJmOFx1ZmJmYy1cdWZiZmRcdWZjMDAtXHVmYzVkXHVmYzY0LVx1ZmNmMVx1ZmNmNS1cdWZkM2RcdWZkODhcdWZkZjRcdWZkZmEtXHVmZGZiXHVmZTcxXHVmZTc3XHVmZTc5XHVmZTdiXHVmZTdkXSspfChcdWZiMDUrKS9ndTsKICAgIE5vcm1hbGl6YXRpb25NYXAgPSBuZXcgTWFwKFtbIu+shSIsICLFv3QiXV0pOwogIH0KICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoTm9ybWFsaXplUmVnZXgsIChfLCBwMSwgcDIpID0+IHsKICAgIHJldHVybiBwMSA/IHAxLm5vcm1hbGl6ZSgiTkZLQyIpIDogTm9ybWFsaXphdGlvbk1hcC5nZXQocDIpOwogIH0pOwp9CgovKioqLyB9KSwKLyogMyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlhSZWZQYXJzZUV4Y2VwdGlvbiA9IGV4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gZXhwb3J0cy5QYXJzZXJFT0ZFeGNlcHRpb24gPSBleHBvcnRzLlBERl9WRVJTSU9OX1JFR0VYUCA9IGV4cG9ydHMuTWlzc2luZ0RhdGFFeGNlcHRpb24gPSB2b2lkIDA7CmV4cG9ydHMuYXJyYXlCdWZmZXJzVG9CeXRlcyA9IGFycmF5QnVmZmVyc1RvQnl0ZXM7CmV4cG9ydHMuY29sbGVjdEFjdGlvbnMgPSBjb2xsZWN0QWN0aW9uczsKZXhwb3J0cy5lbmNvZGVUb1htbFN0cmluZyA9IGVuY29kZVRvWG1sU3RyaW5nOwpleHBvcnRzLmVzY2FwZVBERk5hbWUgPSBlc2NhcGVQREZOYW1lOwpleHBvcnRzLmVzY2FwZVN0cmluZyA9IGVzY2FwZVN0cmluZzsKZXhwb3J0cy5nZXRJbmhlcml0YWJsZVByb3BlcnR5ID0gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eTsKZXhwb3J0cy5nZXRMb29rdXBUYWJsZUZhY3RvcnkgPSBnZXRMb29rdXBUYWJsZUZhY3Rvcnk7CmV4cG9ydHMuZ2V0TmV3QW5ub3RhdGlvbnNNYXAgPSBnZXROZXdBbm5vdGF0aW9uc01hcDsKZXhwb3J0cy5nZXRSb3RhdGlvbk1hdHJpeCA9IGdldFJvdGF0aW9uTWF0cml4OwpleHBvcnRzLmlzQXNjaWkgPSBpc0FzY2lpOwpleHBvcnRzLmlzV2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZTsKZXhwb3J0cy5sb2cyID0gbG9nMjsKZXhwb3J0cy5udW1iZXJUb1N0cmluZyA9IG51bWJlclRvU3RyaW5nOwpleHBvcnRzLnBhcnNlWEZBUGF0aCA9IHBhcnNlWEZBUGF0aDsKZXhwb3J0cy5yZWFkSW50OCA9IHJlYWRJbnQ4OwpleHBvcnRzLnJlYWRVaW50MTYgPSByZWFkVWludDE2OwpleHBvcnRzLnJlYWRVaW50MzIgPSByZWFkVWludDMyOwpleHBvcnRzLnJlY292ZXJKc1VSTCA9IHJlY292ZXJKc1VSTDsKZXhwb3J0cy5zdHJpbmdUb1VURjE2SGV4U3RyaW5nID0gc3RyaW5nVG9VVEYxNkhleFN0cmluZzsKZXhwb3J0cy5zdHJpbmdUb1VURjE2U3RyaW5nID0gc3RyaW5nVG9VVEYxNlN0cmluZzsKZXhwb3J0cy50b1JvbWFuTnVtZXJhbHMgPSB0b1JvbWFuTnVtZXJhbHM7CmV4cG9ydHMudmFsaWRhdGVDU1NGb250ID0gdmFsaWRhdGVDU1NGb250OwpleHBvcnRzLnZhbGlkYXRlRm9udE5hbWUgPSB2YWxpZGF0ZUZvbnROYW1lOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwp2YXIgX2Jhc2Vfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKY29uc3QgUERGX1ZFUlNJT05fUkVHRVhQID0gL15bMS05XVwuXGQkLzsKZXhwb3J0cy5QREZfVkVSU0lPTl9SRUdFWFAgPSBQREZfVkVSU0lPTl9SRUdFWFA7CmZ1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShpbml0aWFsaXplcikgewogIGxldCBsb29rdXA7CiAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgIGlmIChpbml0aWFsaXplcikgewogICAgICBsb29rdXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBpbml0aWFsaXplcihsb29rdXApOwogICAgICBpbml0aWFsaXplciA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gbG9va3VwOwogIH07Cn0KY2xhc3MgTWlzc2luZ0RhdGFFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3RvcihiZWdpbiwgZW5kKSB7CiAgICBzdXBlcihgTWlzc2luZyBkYXRhIFske2JlZ2lufSwgJHtlbmR9KWAsICJNaXNzaW5nRGF0YUV4Y2VwdGlvbiIpOwogICAgdGhpcy5iZWdpbiA9IGJlZ2luOwogICAgdGhpcy5lbmQgPSBlbmQ7CiAgfQp9CmV4cG9ydHMuTWlzc2luZ0RhdGFFeGNlcHRpb24gPSBNaXNzaW5nRGF0YUV4Y2VwdGlvbjsKY2xhc3MgUGFyc2VyRU9GRXhjZXB0aW9uIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJQYXJzZXJFT0ZFeGNlcHRpb24iKTsKICB9Cn0KZXhwb3J0cy5QYXJzZXJFT0ZFeGNlcHRpb24gPSBQYXJzZXJFT0ZFeGNlcHRpb247CmNsYXNzIFhSZWZFbnRyeUV4Y2VwdGlvbiBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIobXNnLCAiWFJlZkVudHJ5RXhjZXB0aW9uIik7CiAgfQp9CmV4cG9ydHMuWFJlZkVudHJ5RXhjZXB0aW9uID0gWFJlZkVudHJ5RXhjZXB0aW9uOwpjbGFzcyBYUmVmUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3Rvcihtc2cpIHsKICAgIHN1cGVyKG1zZywgIlhSZWZQYXJzZUV4Y2VwdGlvbiIpOwogIH0KfQpleHBvcnRzLlhSZWZQYXJzZUV4Y2VwdGlvbiA9IFhSZWZQYXJzZUV4Y2VwdGlvbjsKZnVuY3Rpb24gYXJyYXlCdWZmZXJzVG9CeXRlcyhhcnIpIHsKICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoOwogIGlmIChsZW5ndGggPT09IDApIHsKICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICB9CiAgaWYgKGxlbmd0aCA9PT0gMSkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyclswXSk7CiAgfQogIGxldCBkYXRhTGVuZ3RoID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBkYXRhTGVuZ3RoICs9IGFycltpXS5ieXRlTGVuZ3RoOwogIH0KICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YUxlbmd0aCk7CiAgbGV0IHBvcyA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgY29uc3QgaXRlbSA9IG5ldyBVaW50OEFycmF5KGFycltpXSk7CiAgICBkYXRhLnNldChpdGVtLCBwb3MpOwogICAgcG9zICs9IGl0ZW0uYnl0ZUxlbmd0aDsKICB9CiAgcmV0dXJuIGRhdGE7Cn0KZnVuY3Rpb24gZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7CiAgZGljdCwKICBrZXksCiAgZ2V0QXJyYXkgPSBmYWxzZSwKICBzdG9wV2hlbkZvdW5kID0gdHJ1ZQp9KSB7CiAgbGV0IHZhbHVlczsKICBjb25zdCB2aXNpdGVkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOwogIHdoaWxlIChkaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiAhKGRpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMoZGljdC5vYmpJZCkpKSB7CiAgICBpZiAoZGljdC5vYmpJZCkgewogICAgICB2aXNpdGVkLnB1dChkaWN0Lm9iaklkKTsKICAgIH0KICAgIGNvbnN0IHZhbHVlID0gZ2V0QXJyYXkgPyBkaWN0LmdldEFycmF5KGtleSkgOiBkaWN0LmdldChrZXkpOwogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKHN0b3BXaGVuRm91bmQpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgICAgKHZhbHVlcyB8fD0gW10pLnB1c2godmFsdWUpOwogICAgfQogICAgZGljdCA9IGRpY3QuZ2V0KCJQYXJlbnQiKTsKICB9CiAgcmV0dXJuIHZhbHVlczsKfQpjb25zdCBST01BTl9OVU1CRVJfTUFQID0gWyIiLCAiQyIsICJDQyIsICJDQ0MiLCAiQ0QiLCAiRCIsICJEQyIsICJEQ0MiLCAiRENDQyIsICJDTSIsICIiLCAiWCIsICJYWCIsICJYWFgiLCAiWEwiLCAiTCIsICJMWCIsICJMWFgiLCAiTFhYWCIsICJYQyIsICIiLCAiSSIsICJJSSIsICJJSUkiLCAiSVYiLCAiViIsICJWSSIsICJWSUkiLCAiVklJSSIsICJJWCJdOwpmdW5jdGlvbiB0b1JvbWFuTnVtZXJhbHMobnVtYmVyLCBsb3dlckNhc2UgPSBmYWxzZSkgewogICgwLCBfdXRpbC5hc3NlcnQpKE51bWJlci5pc0ludGVnZXIobnVtYmVyKSAmJiBudW1iZXIgPiAwLCAiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOwogIGNvbnN0IHJvbWFuQnVmID0gW107CiAgbGV0IHBvczsKICB3aGlsZSAobnVtYmVyID49IDEwMDApIHsKICAgIG51bWJlciAtPSAxMDAwOwogICAgcm9tYW5CdWYucHVzaCgiTSIpOwogIH0KICBwb3MgPSBudW1iZXIgLyAxMDAgfCAwOwogIG51bWJlciAlPSAxMDA7CiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQW3Bvc10pOwogIHBvcyA9IG51bWJlciAvIDEwIHwgMDsKICBudW1iZXIgJT0gMTA7CiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzEwICsgcG9zXSk7CiAgcm9tYW5CdWYucHVzaChST01BTl9OVU1CRVJfTUFQWzIwICsgbnVtYmVyXSk7CiAgY29uc3Qgcm9tYW5TdHIgPSByb21hbkJ1Zi5qb2luKCIiKTsKICByZXR1cm4gbG93ZXJDYXNlID8gcm9tYW5TdHIudG9Mb3dlckNhc2UoKSA6IHJvbWFuU3RyOwp9CmZ1bmN0aW9uIGxvZzIoeCkgewogIGlmICh4IDw9IDApIHsKICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nMih4KSk7Cn0KZnVuY3Rpb24gcmVhZEludDgoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCA+PiAyNDsKfQpmdW5jdGlvbiByZWFkVWludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07Cn0KZnVuY3Rpb24gcmVhZFVpbnQzMihkYXRhLCBvZmZzZXQpIHsKICByZXR1cm4gKGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdKSA+Pj4gMDsKfQpmdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHsKICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MGQgfHwgY2ggPT09IDB4MGE7Cn0KZnVuY3Rpb24gcGFyc2VYRkFQYXRoKHBhdGgpIHsKICBjb25zdCBwb3NpdGlvblBhdHRlcm4gPSAvKC4rKVxbKFxkKylcXSQvOwogIHJldHVybiBwYXRoLnNwbGl0KCIuIikubWFwKGNvbXBvbmVudCA9PiB7CiAgICBjb25zdCBtID0gY29tcG9uZW50Lm1hdGNoKHBvc2l0aW9uUGF0dGVybik7CiAgICBpZiAobSkgewogICAgICByZXR1cm4gewogICAgICAgIG5hbWU6IG1bMV0sCiAgICAgICAgcG9zOiBwYXJzZUludChtWzJdLCAxMCkKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWU6IGNvbXBvbmVudCwKICAgICAgcG9zOiAwCiAgICB9OwogIH0pOwp9CmZ1bmN0aW9uIGVzY2FwZVBERk5hbWUoc3RyKSB7CiAgY29uc3QgYnVmZmVyID0gW107CiAgbGV0IHN0YXJ0ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgaWYgKGNoYXIgPCAweDIxIHx8IGNoYXIgPiAweDdlIHx8IGNoYXIgPT09IDB4MjMgfHwgY2hhciA9PT0gMHgyOCB8fCBjaGFyID09PSAweDI5IHx8IGNoYXIgPT09IDB4M2MgfHwgY2hhciA9PT0gMHgzZSB8fCBjaGFyID09PSAweDViIHx8IGNoYXIgPT09IDB4NWQgfHwgY2hhciA9PT0gMHg3YiB8fCBjaGFyID09PSAweDdkIHx8IGNoYXIgPT09IDB4MmYgfHwgY2hhciA9PT0gMHgyNSkgewogICAgICBpZiAoc3RhcnQgPCBpKSB7CiAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKGAjJHtjaGFyLnRvU3RyaW5nKDE2KX1gKTsKICAgICAgc3RhcnQgPSBpICsgMTsKICAgIH0KICB9CiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBzdHI7CiAgfQogIGlmIChzdGFydCA8IHN0ci5sZW5ndGgpIHsKICAgIGJ1ZmZlci5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIHN0ci5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGJ1ZmZlci5qb2luKCIiKTsKfQpmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKC8oWygpXFxcblxyXSkvZywgbWF0Y2ggPT4gewogICAgaWYgKG1hdGNoID09PSAiXG4iKSB7CiAgICAgIHJldHVybiAiXFxuIjsKICAgIH0gZWxzZSBpZiAobWF0Y2ggPT09ICJcciIpIHsKICAgICAgcmV0dXJuICJcXHIiOwogICAgfQogICAgcmV0dXJuIGBcXCR7bWF0Y2h9YDsKICB9KTsKfQpmdW5jdGlvbiBfY29sbGVjdEpTKGVudHJ5LCB4cmVmLCBsaXN0LCBwYXJlbnRzKSB7CiAgaWYgKCFlbnRyeSkgewogICAgcmV0dXJuOwogIH0KICBsZXQgcGFyZW50ID0gbnVsbDsKICBpZiAoZW50cnkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgIGlmIChwYXJlbnRzLmhhcyhlbnRyeSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgcGFyZW50ID0gZW50cnk7CiAgICBwYXJlbnRzLnB1dChwYXJlbnQpOwogICAgZW50cnkgPSB4cmVmLmZldGNoKGVudHJ5KTsKICB9CiAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnkpKSB7CiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgX2NvbGxlY3RKUyhlbGVtZW50LCB4cmVmLCBsaXN0LCBwYXJlbnRzKTsKICAgIH0KICB9IGVsc2UgaWYgKGVudHJ5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGVudHJ5LmdldCgiUyIpLCAiSmF2YVNjcmlwdCIpKSB7CiAgICAgIGNvbnN0IGpzID0gZW50cnkuZ2V0KCJKUyIpOwogICAgICBsZXQgY29kZTsKICAgICAgaWYgKGpzIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgICBjb2RlID0ganMuZ2V0U3RyaW5nKCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzID09PSAic3RyaW5nIikgewogICAgICAgIGNvZGUgPSBqczsKICAgICAgfQogICAgICBjb2RlICYmPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNvZGUpLnJlcGxhY2VBbGwoIlx4MDAiLCAiIik7CiAgICAgIGlmIChjb2RlKSB7CiAgICAgICAgbGlzdC5wdXNoKGNvZGUpOwogICAgICB9CiAgICB9CiAgICBfY29sbGVjdEpTKGVudHJ5LmdldFJhdygiTmV4dCIpLCB4cmVmLCBsaXN0LCBwYXJlbnRzKTsKICB9CiAgaWYgKHBhcmVudCkgewogICAgcGFyZW50cy5yZW1vdmUocGFyZW50KTsKICB9Cn0KZnVuY3Rpb24gY29sbGVjdEFjdGlvbnMoeHJlZiwgZGljdCwgZXZlbnRUeXBlKSB7CiAgY29uc3QgYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgYWRkaXRpb25hbEFjdGlvbnNEaWN0cyA9IGdldEluaGVyaXRhYmxlUHJvcGVydHkoewogICAgZGljdCwKICAgIGtleTogIkFBIiwKICAgIHN0b3BXaGVuRm91bmQ6IGZhbHNlCiAgfSk7CiAgaWYgKGFkZGl0aW9uYWxBY3Rpb25zRGljdHMpIHsKICAgIGZvciAobGV0IGkgPSBhZGRpdGlvbmFsQWN0aW9uc0RpY3RzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIGNvbnN0IGFkZGl0aW9uYWxBY3Rpb25zID0gYWRkaXRpb25hbEFjdGlvbnNEaWN0c1tpXTsKICAgICAgaWYgKCEoYWRkaXRpb25hbEFjdGlvbnMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFkZGl0aW9uYWxBY3Rpb25zLmdldEtleXMoKSkgewogICAgICAgIGNvbnN0IGFjdGlvbiA9IGV2ZW50VHlwZVtrZXldOwogICAgICAgIGlmICghYWN0aW9uKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgYWN0aW9uRGljdCA9IGFkZGl0aW9uYWxBY3Rpb25zLmdldFJhdyhrZXkpOwogICAgICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CiAgICAgICAgY29uc3QgbGlzdCA9IFtdOwogICAgICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYWN0aW9uc1thY3Rpb25dID0gbGlzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGRpY3QuaGFzKCJBIikpIHsKICAgIGNvbnN0IGFjdGlvbkRpY3QgPSBkaWN0LmdldCgiQSIpOwogICAgY29uc3QgcGFyZW50cyA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgIF9jb2xsZWN0SlMoYWN0aW9uRGljdCwgeHJlZiwgbGlzdCwgcGFyZW50cyk7CiAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7CiAgICAgIGFjdGlvbnMuQWN0aW9uID0gbGlzdDsKICAgIH0KICB9CiAgcmV0dXJuICgwLCBfdXRpbC5vYmplY3RTaXplKShhY3Rpb25zKSA+IDAgPyBhY3Rpb25zIDogbnVsbDsKfQpjb25zdCBYTUxFbnRpdGllcyA9IHsKICAweDNjOiAiJmx0OyIsCiAgMHgzZTogIiZndDsiLAogIDB4MjY6ICImYW1wOyIsCiAgMHgyMjogIiZxdW90OyIsCiAgMHgyNzogIiZhcG9zOyIKfTsKZnVuY3Rpb24gZW5jb2RlVG9YbWxTdHJpbmcoc3RyKSB7CiAgY29uc3QgYnVmZmVyID0gW107CiAgbGV0IHN0YXJ0ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jb2RlUG9pbnRBdChpKTsKICAgIGlmICgweDIwIDw9IGNoYXIgJiYgY2hhciA8PSAweDdlKSB7CiAgICAgIGNvbnN0IGVudGl0eSA9IFhNTEVudGl0aWVzW2NoYXJdOwogICAgICBpZiAoZW50aXR5KSB7CiAgICAgICAgaWYgKHN0YXJ0IDwgaSkgewogICAgICAgICAgYnVmZmVyLnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgaSkpOwogICAgICAgIH0KICAgICAgICBidWZmZXIucHVzaChlbnRpdHkpOwogICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChzdGFydCA8IGkpIHsKICAgICAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7CiAgICAgIH0KICAgICAgYnVmZmVyLnB1c2goYCYjeCR7Y2hhci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX07YCk7CiAgICAgIGlmIChjaGFyID4gMHhkN2ZmICYmIChjaGFyIDwgMHhlMDAwIHx8IGNoYXIgPiAweGZmZmQpKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICB9CiAgfQogIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gc3RyOwogIH0KICBpZiAoc3RhcnQgPCBzdHIubGVuZ3RoKSB7CiAgICBidWZmZXIucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBzdHIubGVuZ3RoKSk7CiAgfQogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KZnVuY3Rpb24gdmFsaWRhdGVGb250TmFtZShmb250RmFtaWx5LCBtdXN0V2FybiA9IGZhbHNlKSB7CiAgY29uc3QgbSA9IC9eKCJ8JykuKigifCcpJC8uZXhlYyhmb250RmFtaWx5KTsKICBpZiAobSAmJiBtWzFdID09PSBtWzJdKSB7CiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYFteXFxcXF0ke21bMV19YCk7CiAgICBpZiAocmUudGVzdChmb250RmFtaWx5LnNsaWNlKDEsIC0xKSkpIHsKICAgICAgaWYgKG11c3RXYXJuKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBGb250RmFtaWx5IGNvbnRhaW5zIHVuZXNjYXBlZCAke21bMV19OiAke2ZvbnRGYW1pbHl9LmApOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChjb25zdCBpZGVudCBvZiBmb250RmFtaWx5LnNwbGl0KC9bIFx0XSsvKSkgewogICAgICBpZiAoL14oXGR8KC0oXGR8LSkpKS8udGVzdChpZGVudCkgfHwgIS9eW1x3LVxcXSskLy50ZXN0KGlkZW50KSkgewogICAgICAgIGlmIChtdXN0V2FybikgewogICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBGb250RmFtaWx5IGNvbnRhaW5zIGludmFsaWQgPGN1c3RvbS1pZGVudD46ICR7Zm9udEZhbWlseX0uYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiB2YWxpZGF0ZUNTU0ZvbnQoY3NzRm9udEluZm8pIHsKICBjb25zdCBERUZBVUxUX0NTU19GT05UX09CTElRVUUgPSAiMTQiOwogIGNvbnN0IERFRkFVTFRfQ1NTX0ZPTlRfV0VJR0hUID0gIjQwMCI7CiAgY29uc3QgQ1NTX0ZPTlRfV0VJR0hUX1ZBTFVFUyA9IG5ldyBTZXQoWyIxMDAiLCAiMjAwIiwgIjMwMCIsICI0MDAiLCAiNTAwIiwgIjYwMCIsICI3MDAiLCAiODAwIiwgIjkwMCIsICIxMDAwIiwgIm5vcm1hbCIsICJib2xkIiwgImJvbGRlciIsICJsaWdodGVyIl0pOwogIGNvbnN0IHsKICAgIGZvbnRGYW1pbHksCiAgICBmb250V2VpZ2h0LAogICAgaXRhbGljQW5nbGUKICB9ID0gY3NzRm9udEluZm87CiAgaWYgKCF2YWxpZGF0ZUZvbnROYW1lKGZvbnRGYW1pbHksIHRydWUpKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IHdlaWdodCA9IGZvbnRXZWlnaHQgPyBmb250V2VpZ2h0LnRvU3RyaW5nKCkgOiAiIjsKICBjc3NGb250SW5mby5mb250V2VpZ2h0ID0gQ1NTX0ZPTlRfV0VJR0hUX1ZBTFVFUy5oYXMod2VpZ2h0KSA/IHdlaWdodCA6IERFRkFVTFRfQ1NTX0ZPTlRfV0VJR0hUOwogIGNvbnN0IGFuZ2xlID0gcGFyc2VGbG9hdChpdGFsaWNBbmdsZSk7CiAgY3NzRm9udEluZm8uaXRhbGljQW5nbGUgPSBpc05hTihhbmdsZSkgfHwgYW5nbGUgPCAtOTAgfHwgYW5nbGUgPiA5MCA/IERFRkFVTFRfQ1NTX0ZPTlRfT0JMSVFVRSA6IGl0YWxpY0FuZ2xlLnRvU3RyaW5nKCk7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gcmVjb3ZlckpzVVJMKHN0cikgewogIGNvbnN0IFVSTF9PUEVOX01FVEhPRFMgPSBbImFwcC5sYXVuY2hVUkwiLCAid2luZG93Lm9wZW4iLCAieGZhLmhvc3QuZ290b1VSTCJdOwogIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgiXlxccyooIiArIFVSTF9PUEVOX01FVEhPRFMuam9pbigifCIpLnJlcGxhY2VBbGwoIi4iLCAiXFwuIikgKyAiKVxcKCg/Oid8XCIpKFteJ1wiXSopKD86J3xcIikoPzosXFxzKihcXHcrKVxcKXxcXCkpIiwgImkiKTsKICBjb25zdCBqc1VybCA9IHJlZ2V4LmV4ZWMoc3RyKTsKICBpZiAoanNVcmw/LlsyXSkgewogICAgY29uc3QgdXJsID0ganNVcmxbMl07CiAgICBsZXQgbmV3V2luZG93ID0gZmFsc2U7CiAgICBpZiAoanNVcmxbM10gPT09ICJ0cnVlIiAmJiBqc1VybFsxXSA9PT0gImFwcC5sYXVuY2hVUkwiKSB7CiAgICAgIG5ld1dpbmRvdyA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gewogICAgICB1cmwsCiAgICAgIG5ld1dpbmRvdwogICAgfTsKICB9CiAgcmV0dXJuIG51bGw7Cn0KZnVuY3Rpb24gbnVtYmVyVG9TdHJpbmcodmFsdWUpIHsKICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogIH0KICBjb25zdCByb3VuZGVkVmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlICogMTAwKTsKICBpZiAocm91bmRlZFZhbHVlICUgMTAwID09PSAwKSB7CiAgICByZXR1cm4gKHJvdW5kZWRWYWx1ZSAvIDEwMCkudG9TdHJpbmcoKTsKICB9CiAgaWYgKHJvdW5kZWRWYWx1ZSAlIDEwID09PSAwKSB7CiAgICByZXR1cm4gdmFsdWUudG9GaXhlZCgxKTsKICB9CiAgcmV0dXJuIHZhbHVlLnRvRml4ZWQoMik7Cn0KZnVuY3Rpb24gZ2V0TmV3QW5ub3RhdGlvbnNNYXAoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICBpZiAoIWFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbmV3QW5ub3RhdGlvbnNCeVBhZ2UgPSBuZXcgTWFwKCk7CiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoX3V0aWwuQW5ub3RhdGlvbkVkaXRvclByZWZpeCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBsZXQgYW5ub3RhdGlvbnMgPSBuZXdBbm5vdGF0aW9uc0J5UGFnZS5nZXQodmFsdWUucGFnZUluZGV4KTsKICAgIGlmICghYW5ub3RhdGlvbnMpIHsKICAgICAgYW5ub3RhdGlvbnMgPSBbXTsKICAgICAgbmV3QW5ub3RhdGlvbnNCeVBhZ2Uuc2V0KHZhbHVlLnBhZ2VJbmRleCwgYW5ub3RhdGlvbnMpOwogICAgfQogICAgYW5ub3RhdGlvbnMucHVzaCh2YWx1ZSk7CiAgfQogIHJldHVybiBuZXdBbm5vdGF0aW9uc0J5UGFnZS5zaXplID4gMCA/IG5ld0Fubm90YXRpb25zQnlQYWdlIDogbnVsbDsKfQpmdW5jdGlvbiBpc0FzY2lpKHN0cikgewogIHJldHVybiAvXltceDAwLVx4N0ZdKiQvLnRlc3Qoc3RyKTsKfQpmdW5jdGlvbiBzdHJpbmdUb1VURjE2SGV4U3RyaW5nKHN0cikgewogIGNvbnN0IGJ1ZiA9IFtdOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICBidWYucHVzaCgoY2hhciA+PiA4ICYgMHhmZikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICIwIiksIChjaGFyICYgMHhmZikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICIwIikpOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIHN0cmluZ1RvVVRGMTZTdHJpbmcoc3RyLCBiaWdFbmRpYW4gPSBmYWxzZSkgewogIGNvbnN0IGJ1ZiA9IFtdOwogIGlmIChiaWdFbmRpYW4pIHsKICAgIGJ1Zi5wdXNoKCJceEZFXHhGRiIpOwogIH0KICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdHIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgYnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyID4+IDggJiAweGZmKSwgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyICYgMHhmZikpOwogIH0KICByZXR1cm4gYnVmLmpvaW4oIiIpOwp9CmZ1bmN0aW9uIGdldFJvdGF0aW9uTWF0cml4KHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KSB7CiAgc3dpdGNoIChyb3RhdGlvbikgewogICAgY2FzZSA5MDoKICAgICAgcmV0dXJuIFswLCAxLCAtMSwgMCwgd2lkdGgsIDBdOwogICAgY2FzZSAxODA6CiAgICAgIHJldHVybiBbLTEsIDAsIDAsIC0xLCB3aWR0aCwgaGVpZ2h0XTsKICAgIGNhc2UgMjcwOgogICAgICByZXR1cm4gWzAsIC0xLCAxLCAwLCAwLCBoZWlnaHRdOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHJvdGF0aW9uIik7CiAgfQp9CgovKioqLyB9KSwKLyogNCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlJlZlNldENhY2hlID0gZXhwb3J0cy5SZWZTZXQgPSBleHBvcnRzLlJlZiA9IGV4cG9ydHMuTmFtZSA9IGV4cG9ydHMuRU9GID0gZXhwb3J0cy5EaWN0ID0gZXhwb3J0cy5DbWQgPSBleHBvcnRzLkNJUkNVTEFSX1JFRiA9IHZvaWQgMDsKZXhwb3J0cy5jbGVhclByaW1pdGl2ZUNhY2hlcyA9IGNsZWFyUHJpbWl0aXZlQ2FjaGVzOwpleHBvcnRzLmlzQ21kID0gaXNDbWQ7CmV4cG9ydHMuaXNEaWN0ID0gaXNEaWN0OwpleHBvcnRzLmlzTmFtZSA9IGlzTmFtZTsKZXhwb3J0cy5pc1JlZnNFcXVhbCA9IGlzUmVmc0VxdWFsOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpjb25zdCBDSVJDVUxBUl9SRUYgPSBTeW1ib2woIkNJUkNVTEFSX1JFRiIpOwpleHBvcnRzLkNJUkNVTEFSX1JFRiA9IENJUkNVTEFSX1JFRjsKY29uc3QgRU9GID0gU3ltYm9sKCJFT0YiKTsKZXhwb3J0cy5FT0YgPSBFT0Y7CmxldCBDbWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CmxldCBOYW1lQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpsZXQgUmVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwpmdW5jdGlvbiBjbGVhclByaW1pdGl2ZUNhY2hlcygpIHsKICBDbWRDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgTmFtZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICBSZWZDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7Cn0KY2xhc3MgTmFtZSB7CiAgY29uc3RydWN0b3IobmFtZSkgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICB9CiAgc3RhdGljIGdldChuYW1lKSB7CiAgICByZXR1cm4gTmFtZUNhY2hlW25hbWVdIHx8PSBuZXcgTmFtZShuYW1lKTsKICB9Cn0KZXhwb3J0cy5OYW1lID0gTmFtZTsKY2xhc3MgQ21kIHsKICBjb25zdHJ1Y3RvcihjbWQpIHsKICAgIHRoaXMuY21kID0gY21kOwogIH0KICBzdGF0aWMgZ2V0KGNtZCkgewogICAgcmV0dXJuIENtZENhY2hlW2NtZF0gfHw9IG5ldyBDbWQoY21kKTsKICB9Cn0KZXhwb3J0cy5DbWQgPSBDbWQ7CmNvbnN0IG5vblNlcmlhbGl6YWJsZSA9IGZ1bmN0aW9uIG5vblNlcmlhbGl6YWJsZUNsb3N1cmUoKSB7CiAgcmV0dXJuIG5vblNlcmlhbGl6YWJsZTsKfTsKY2xhc3MgRGljdCB7CiAgY29uc3RydWN0b3IoeHJlZiA9IG51bGwpIHsKICAgIHRoaXMuX21hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5vYmpJZCA9IG51bGw7CiAgICB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlOwogICAgdGhpcy5fX25vblNlcmlhbGl6YWJsZV9fID0gbm9uU2VyaWFsaXphYmxlOwogIH0KICBhc3NpZ25YcmVmKG5ld1hyZWYpIHsKICAgIHRoaXMueHJlZiA9IG5ld1hyZWY7CiAgfQogIGdldCBzaXplKCkgewogICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21hcCkubGVuZ3RoOwogIH0KICBnZXQoa2V5MSwga2V5Miwga2V5MykgewogICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwW2tleTFdOwogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5fbWFwW2tleTJdOwogICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBrZXkzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB2YWx1ZSA9IHRoaXMuX21hcFtrZXkzXTsKICAgICAgfQogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVmICYmIHRoaXMueHJlZikgewogICAgICByZXR1cm4gdGhpcy54cmVmLmZldGNoKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQogIGFzeW5jIGdldEFzeW5jKGtleTEsIGtleTIsIGtleTMpIHsKICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcFtrZXkxXTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcFtrZXkyXTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107CiAgICAgIH0KICAgIH0KICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKICAgICAgcmV0dXJuIHRoaXMueHJlZi5mZXRjaEFzeW5jKHZhbHVlLCB0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQogIGdldEFycmF5KGtleTEsIGtleTIsIGtleTMpIHsKICAgIGxldCB2YWx1ZSA9IHRoaXMuX21hcFtrZXkxXTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGtleTIgIT09IHVuZGVmaW5lZCkgewogICAgICB2YWx1ZSA9IHRoaXMuX21hcFtrZXkyXTsKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYga2V5MyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9tYXBba2V5M107CiAgICAgIH0KICAgIH0KICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZiAmJiB0aGlzLnhyZWYpIHsKICAgICAgdmFsdWUgPSB0aGlzLnhyZWYuZmV0Y2godmFsdWUsIHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKCk7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBpZiAodmFsdWVbaV0gaW5zdGFuY2VvZiBSZWYgJiYgdGhpcy54cmVmKSB7CiAgICAgICAgICB2YWx1ZVtpXSA9IHRoaXMueHJlZi5mZXRjaCh2YWx1ZVtpXSwgdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHZhbHVlOwogIH0KICBnZXRSYXcoa2V5KSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2tleV07CiAgfQogIGdldEtleXMoKSB7CiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fbWFwKTsKICB9CiAgZ2V0UmF3VmFsdWVzKCkgewogICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fbWFwKTsKICB9CiAgc2V0KGtleSwgdmFsdWUpIHsKICAgIHRoaXMuX21hcFtrZXldID0gdmFsdWU7CiAgfQogIGhhcyhrZXkpIHsKICAgIHJldHVybiB0aGlzLl9tYXBba2V5XSAhPT0gdW5kZWZpbmVkOwogIH0KICBmb3JFYWNoKGNhbGxiYWNrKSB7CiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9tYXApIHsKICAgICAgY2FsbGJhY2soa2V5LCB0aGlzLmdldChrZXkpKTsKICAgIH0KICB9CiAgc3RhdGljIGdldCBlbXB0eSgpIHsKICAgIGNvbnN0IGVtcHR5RGljdCA9IG5ldyBEaWN0KG51bGwpOwogICAgZW1wdHlEaWN0LnNldCA9IChrZXksIHZhbHVlKSA9PiB7CiAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIlNob3VsZCBub3QgY2FsbCBgc2V0YCBvbiB0aGUgZW1wdHkgZGljdGlvbmFyeS4iKTsKICAgIH07CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImVtcHR5IiwgZW1wdHlEaWN0KTsKICB9CiAgc3RhdGljIG1lcmdlKHsKICAgIHhyZWYsCiAgICBkaWN0QXJyYXksCiAgICBtZXJnZVN1YkRpY3RzID0gZmFsc2UKICB9KSB7CiAgICBjb25zdCBtZXJnZWREaWN0ID0gbmV3IERpY3QoeHJlZiksCiAgICAgIHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgZGljdEFycmF5KSB7CiAgICAgIGlmICghKGRpY3QgaW5zdGFuY2VvZiBEaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRpY3QuX21hcCkpIHsKICAgICAgICBsZXQgcHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldChrZXkpOwogICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBwcm9wZXJ0eSA9IFtdOwogICAgICAgICAgcHJvcGVydGllcy5zZXQoa2V5LCBwcm9wZXJ0eSk7CiAgICAgICAgfSBlbHNlIGlmICghbWVyZ2VTdWJEaWN0cyB8fCAhKHZhbHVlIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBwcm9wZXJ0eS5wdXNoKHZhbHVlKTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVzXSBvZiBwcm9wZXJ0aWVzKSB7CiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxIHx8ICEodmFsdWVzWzBdIGluc3RhbmNlb2YgRGljdCkpIHsKICAgICAgICBtZXJnZWREaWN0Ll9tYXBbbmFtZV0gPSB2YWx1ZXNbMF07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgc3ViRGljdCA9IG5ldyBEaWN0KHhyZWYpOwogICAgICBmb3IgKGNvbnN0IGRpY3Qgb2YgdmFsdWVzKSB7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGljdC5fbWFwKSkgewogICAgICAgICAgaWYgKHN1YkRpY3QuX21hcFtrZXldID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgc3ViRGljdC5fbWFwW2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN1YkRpY3Quc2l6ZSA+IDApIHsKICAgICAgICBtZXJnZWREaWN0Ll9tYXBbbmFtZV0gPSBzdWJEaWN0OwogICAgICB9CiAgICB9CiAgICBwcm9wZXJ0aWVzLmNsZWFyKCk7CiAgICByZXR1cm4gbWVyZ2VkRGljdC5zaXplID4gMCA/IG1lcmdlZERpY3QgOiBEaWN0LmVtcHR5OwogIH0KfQpleHBvcnRzLkRpY3QgPSBEaWN0OwpjbGFzcyBSZWYgewogIGNvbnN0cnVjdG9yKG51bSwgZ2VuKSB7CiAgICB0aGlzLm51bSA9IG51bTsKICAgIHRoaXMuZ2VuID0gZ2VuOwogIH0KICB0b1N0cmluZygpIHsKICAgIGlmICh0aGlzLmdlbiA9PT0gMCkgewogICAgICByZXR1cm4gYCR7dGhpcy5udW19UmA7CiAgICB9CiAgICByZXR1cm4gYCR7dGhpcy5udW19UiR7dGhpcy5nZW59YDsKICB9CiAgc3RhdGljIGdldChudW0sIGdlbikgewogICAgY29uc3Qga2V5ID0gZ2VuID09PSAwID8gYCR7bnVtfVJgIDogYCR7bnVtfVIke2dlbn1gOwogICAgcmV0dXJuIFJlZkNhY2hlW2tleV0gfHw9IG5ldyBSZWYobnVtLCBnZW4pOwogIH0KfQpleHBvcnRzLlJlZiA9IFJlZjsKY2xhc3MgUmVmU2V0IHsKICBjb25zdHJ1Y3RvcihwYXJlbnQgPSBudWxsKSB7CiAgICB0aGlzLl9zZXQgPSBuZXcgU2V0KHBhcmVudD8uX3NldCk7CiAgfQogIGhhcyhyZWYpIHsKICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKHJlZi50b1N0cmluZygpKTsKICB9CiAgcHV0KHJlZikgewogICAgdGhpcy5fc2V0LmFkZChyZWYudG9TdHJpbmcoKSk7CiAgfQogIHJlbW92ZShyZWYpIHsKICAgIHRoaXMuX3NldC5kZWxldGUocmVmLnRvU3RyaW5nKCkpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLl9zZXQudmFsdWVzKCk7CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5fc2V0LmNsZWFyKCk7CiAgfQp9CmV4cG9ydHMuUmVmU2V0ID0gUmVmU2V0OwpjbGFzcyBSZWZTZXRDYWNoZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7CiAgfQogIGdldCBzaXplKCkgewogICAgcmV0dXJuIHRoaXMuX21hcC5zaXplOwogIH0KICBnZXQocmVmKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmdldChyZWYudG9TdHJpbmcoKSk7CiAgfQogIGhhcyhyZWYpIHsKICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHJlZi50b1N0cmluZygpKTsKICB9CiAgcHV0KHJlZiwgb2JqKSB7CiAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCBvYmopOwogIH0KICBwdXRBbGlhcyhyZWYsIGFsaWFzUmVmKSB7CiAgICB0aGlzLl9tYXAuc2V0KHJlZi50b1N0cmluZygpLCB0aGlzLmdldChhbGlhc1JlZikpOwogIH0KICBbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgIHJldHVybiB0aGlzLl9tYXAudmFsdWVzKCk7CiAgfQogIGNsZWFyKCkgewogICAgdGhpcy5fbWFwLmNsZWFyKCk7CiAgfQp9CmV4cG9ydHMuUmVmU2V0Q2FjaGUgPSBSZWZTZXRDYWNoZTsKZnVuY3Rpb24gaXNOYW1lKHYsIG5hbWUpIHsKICByZXR1cm4gdiBpbnN0YW5jZW9mIE5hbWUgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB2Lm5hbWUgPT09IG5hbWUpOwp9CmZ1bmN0aW9uIGlzQ21kKHYsIGNtZCkgewogIHJldHVybiB2IGluc3RhbmNlb2YgQ21kICYmIChjbWQgPT09IHVuZGVmaW5lZCB8fCB2LmNtZCA9PT0gY21kKTsKfQpmdW5jdGlvbiBpc0RpY3QodiwgdHlwZSkgewogIHJldHVybiB2IGluc3RhbmNlb2YgRGljdCAmJiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IGlzTmFtZSh2LmdldCgiVHlwZSIpLCB0eXBlKSk7Cn0KZnVuY3Rpb24gaXNSZWZzRXF1YWwodjEsIHYyKSB7CiAgcmV0dXJuIHYxLm51bSA9PT0gdjIubnVtICYmIHYxLmdlbiA9PT0gdjIuZ2VuOwp9CgovKioqLyB9KSwKLyogNSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkJhc2VTdHJlYW0gPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNsYXNzIEJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKCkgewogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTdHJlYW0pIHsKICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZVN0cmVhbS4iKTsKICAgIH0KICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IGdldHRlciBgbGVuZ3RoYCBhY2Nlc3NlZCIpOwogIH0KICBnZXQgaXNFbXB0eSgpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IGdldHRlciBgaXNFbXB0eWAgYWNjZXNzZWQiKTsKICB9CiAgZ2V0IGlzRGF0YUxvYWRlZCgpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiaXNEYXRhTG9hZGVkIiwgdHJ1ZSk7CiAgfQogIGdldEJ5dGUoKSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVgIGNhbGxlZCIpOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZXNgIGNhbGxlZCIpOwogIH0KICBwZWVrQnl0ZSgpIHsKICAgIGNvbnN0IHBlZWtlZEJ5dGUgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGlmIChwZWVrZWRCeXRlICE9PSAtMSkgewogICAgICB0aGlzLnBvcy0tOwogICAgfQogICAgcmV0dXJuIHBlZWtlZEJ5dGU7CiAgfQogIHBlZWtCeXRlcyhsZW5ndGgpIHsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5nZXRCeXRlcyhsZW5ndGgpOwogICAgdGhpcy5wb3MgLT0gYnl0ZXMubGVuZ3RoOwogICAgcmV0dXJuIGJ5dGVzOwogIH0KICBnZXRVaW50MTYoKSB7CiAgICBjb25zdCBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgY29uc3QgYjEgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGlmIChiMCA9PT0gLTEgfHwgYjEgPT09IC0xKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiAoYjAgPDwgOCkgKyBiMTsKICB9CiAgZ2V0SW50MzIoKSB7CiAgICBjb25zdCBiMCA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgY29uc3QgYjEgPSB0aGlzLmdldEJ5dGUoKTsKICAgIGNvbnN0IGIyID0gdGhpcy5nZXRCeXRlKCk7CiAgICBjb25zdCBiMyA9IHRoaXMuZ2V0Qnl0ZSgpOwogICAgcmV0dXJuIChiMCA8PCAyNCkgKyAoYjEgPDwgMTYpICsgKGIyIDw8IDgpICsgYjM7CiAgfQogIGdldEJ5dGVSYW5nZShiZWdpbiwgZW5kKSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldEJ5dGVSYW5nZWAgY2FsbGVkIik7CiAgfQogIGdldFN0cmluZyhsZW5ndGgpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykodGhpcy5nZXRCeXRlcyhsZW5ndGgpKTsKICB9CiAgc2tpcChuKSB7CiAgICB0aGlzLnBvcyArPSBuIHx8IDE7CiAgfQogIHJlc2V0KCkgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGByZXNldGAgY2FsbGVkIik7CiAgfQogIG1vdmVTdGFydCgpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgbW92ZVN0YXJ0YCBjYWxsZWQiKTsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBtYWtlU3ViU3RyZWFtYCBjYWxsZWQiKTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KZXhwb3J0cy5CYXNlU3RyZWFtID0gQmFzZVN0cmVhbTsKCi8qKiovIH0pLAovKiA2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuTmV0d29ya1BkZk1hbmFnZXIgPSBleHBvcnRzLkxvY2FsUGRmTWFuYWdlciA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9jaHVua2VkX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfZG9jdW1lbnQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CmZ1bmN0aW9uIHBhcnNlRG9jQmFzZVVybCh1cmwpIHsKICBpZiAodXJsKSB7CiAgICBjb25zdCBhYnNvbHV0ZVVybCA9ICgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSh1cmwpOwogICAgaWYgKGFic29sdXRlVXJsKSB7CiAgICAgIHJldHVybiBhYnNvbHV0ZVVybC5ocmVmOwogICAgfQogICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIGFic29sdXRlIGRvY0Jhc2VVcmw6ICIke3VybH0iLmApOwogIH0KICByZXR1cm4gbnVsbDsKfQpjbGFzcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VQZGZNYW5hZ2VyKSB7CiAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEJhc2VQZGZNYW5hZ2VyLiIpOwogICAgfQogICAgdGhpcy5fZG9jQmFzZVVybCA9IHBhcnNlRG9jQmFzZVVybChhcmdzLmRvY0Jhc2VVcmwpOwogICAgdGhpcy5fZG9jSWQgPSBhcmdzLmRvY0lkOwogICAgdGhpcy5fcGFzc3dvcmQgPSBhcmdzLnBhc3N3b3JkOwogICAgdGhpcy5lbmFibGVYZmEgPSBhcmdzLmVuYWJsZVhmYTsKICAgIGFyZ3MuZXZhbHVhdG9yT3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJj0gX3V0aWwuRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7CiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBhcmdzLmV2YWx1YXRvck9wdGlvbnM7CiAgfQogIGdldCBkb2NJZCgpIHsKICAgIHJldHVybiB0aGlzLl9kb2NJZDsKICB9CiAgZ2V0IHBhc3N3b3JkKCkgewogICAgcmV0dXJuIHRoaXMuX3Bhc3N3b3JkOwogIH0KICBnZXQgZG9jQmFzZVVybCgpIHsKICAgIGNvbnN0IGNhdGFsb2cgPSB0aGlzLnBkZkRvY3VtZW50LmNhdGFsb2c7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRvY0Jhc2VVcmwiLCBjYXRhbG9nLmJhc2VVcmwgfHwgdGhpcy5fZG9jQmFzZVVybCk7CiAgfQogIGVuc3VyZURvYyhwcm9wLCBhcmdzKSB7CiAgICByZXR1cm4gdGhpcy5lbnN1cmUodGhpcy5wZGZEb2N1bWVudCwgcHJvcCwgYXJncyk7CiAgfQogIGVuc3VyZVhSZWYocHJvcCwgYXJncykgewogICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQueHJlZiwgcHJvcCwgYXJncyk7CiAgfQogIGVuc3VyZUNhdGFsb2cocHJvcCwgYXJncykgewogICAgcmV0dXJuIHRoaXMuZW5zdXJlKHRoaXMucGRmRG9jdW1lbnQuY2F0YWxvZywgcHJvcCwgYXJncyk7CiAgfQogIGdldFBhZ2UocGFnZUluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VJbmRleCk7CiAgfQogIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKTsKICB9CiAgbG9hZFhmYUZvbnRzKGhhbmRsZXIsIHRhc2spIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmxvYWRYZmFGb250cyhoYW5kbGVyLCB0YXNrKTsKICB9CiAgbG9hZFhmYUltYWdlcygpIHsKICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmxvYWRYZmFJbWFnZXMoKTsKICB9CiAgc2VyaWFsaXplWGZhRGF0YShhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuc2VyaWFsaXplWGZhRGF0YShhbm5vdGF0aW9uU3RvcmFnZSk7CiAgfQogIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuY2xlYW51cChtYW51YWxseVRyaWdnZXJlZCk7CiAgfQogIGFzeW5jIGVuc3VyZShvYmosIHByb3AsIGFyZ3MpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgZW5zdXJlYCBjYWxsZWQiKTsKICB9CiAgcmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdFJhbmdlYCBjYWxsZWQiKTsKICB9CiAgcmVxdWVzdExvYWRlZFN0cmVhbShub0ZldGNoID0gZmFsc2UpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgcmVxdWVzdExvYWRlZFN0cmVhbWAgY2FsbGVkIik7CiAgfQogIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkFic3RyYWN0IG1ldGhvZCBgc2VuZFByb2dyZXNzaXZlRGF0YWAgY2FsbGVkIik7CiAgfQogIHVwZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKSB7CiAgICB0aGlzLl9wYXNzd29yZCA9IHBhc3N3b3JkOwogIH0KICB0ZXJtaW5hdGUocmVhc29uKSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYHRlcm1pbmF0ZWAgY2FsbGVkIik7CiAgfQp9CmNsYXNzIExvY2FsUGRmTWFuYWdlciBleHRlbmRzIEJhc2VQZGZNYW5hZ2VyIHsKICBjb25zdHJ1Y3RvcihhcmdzKSB7CiAgICBzdXBlcihhcmdzKTsKICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmVhbShhcmdzLnNvdXJjZSk7CiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IF9kb2N1bWVudC5QREZEb2N1bWVudCh0aGlzLCBzdHJlYW0pOwogICAgdGhpcy5fbG9hZGVkU3RyZWFtUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShzdHJlYW0pOwogIH0KICBhc3luYyBlbnN1cmUob2JqLCBwcm9wLCBhcmdzKSB7CiAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIHZhbHVlLmFwcGx5KG9iaiwgYXJncyk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQogIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgfQogIHJlcXVlc3RMb2FkZWRTdHJlYW0obm9GZXRjaCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5fbG9hZGVkU3RyZWFtUHJvbWlzZTsKICB9CiAgdGVybWluYXRlKHJlYXNvbikge30KfQpleHBvcnRzLkxvY2FsUGRmTWFuYWdlciA9IExvY2FsUGRmTWFuYWdlcjsKY2xhc3MgTmV0d29ya1BkZk1hbmFnZXIgZXh0ZW5kcyBCYXNlUGRmTWFuYWdlciB7CiAgY29uc3RydWN0b3IoYXJncykgewogICAgc3VwZXIoYXJncyk7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIgPSBuZXcgX2NodW5rZWRfc3RyZWFtLkNodW5rZWRTdHJlYW1NYW5hZ2VyKGFyZ3Muc291cmNlLCB7CiAgICAgIG1zZ0hhbmRsZXI6IGFyZ3MuaGFuZGxlciwKICAgICAgbGVuZ3RoOiBhcmdzLmxlbmd0aCwKICAgICAgZGlzYWJsZUF1dG9GZXRjaDogYXJncy5kaXNhYmxlQXV0b0ZldGNoLAogICAgICByYW5nZUNodW5rU2l6ZTogYXJncy5yYW5nZUNodW5rU2l6ZQogICAgfSk7CiAgICB0aGlzLnBkZkRvY3VtZW50ID0gbmV3IF9kb2N1bWVudC5QREZEb2N1bWVudCh0aGlzLCB0aGlzLnN0cmVhbU1hbmFnZXIuZ2V0U3RyZWFtKCkpOwogIH0KICBhc3luYyBlbnN1cmUob2JqLCBwcm9wLCBhcmdzKSB7CiAgICB0cnkgewogICAgICBjb25zdCB2YWx1ZSA9IG9ialtwcm9wXTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIHJldHVybiB2YWx1ZS5hcHBseShvYmosIGFyZ3MpOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0UmFuZ2UoZXguYmVnaW4sIGV4LmVuZCk7CiAgICAgIHJldHVybiB0aGlzLmVuc3VyZShvYmosIHByb3AsIGFyZ3MpOwogICAgfQogIH0KICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCkgewogICAgcmV0dXJuIHRoaXMuc3RyZWFtTWFuYWdlci5yZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCk7CiAgfQogIHJlcXVlc3RMb2FkZWRTdHJlYW0obm9GZXRjaCA9IGZhbHNlKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW1NYW5hZ2VyLnJlcXVlc3RBbGxDaHVua3Mobm9GZXRjaCk7CiAgfQogIHNlbmRQcm9ncmVzc2l2ZURhdGEoY2h1bmspIHsKICAgIHRoaXMuc3RyZWFtTWFuYWdlci5vblJlY2VpdmVEYXRhKHsKICAgICAgY2h1bmsKICAgIH0pOwogIH0KICB0ZXJtaW5hdGUocmVhc29uKSB7CiAgICB0aGlzLnN0cmVhbU1hbmFnZXIuYWJvcnQocmVhc29uKTsKICB9Cn0KZXhwb3J0cy5OZXR3b3JrUGRmTWFuYWdlciA9IE5ldHdvcmtQZGZNYW5hZ2VyOwoKLyoqKi8gfSksCi8qIDcgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5DaHVua2VkU3RyZWFtTWFuYWdlciA9IGV4cG9ydHMuQ2h1bmtlZFN0cmVhbSA9IHZvaWQgMDsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOwpjbGFzcyBDaHVua2VkU3RyZWFtIGV4dGVuZHMgX3N0cmVhbS5TdHJlYW0gewogIGNvbnN0cnVjdG9yKGxlbmd0aCwgY2h1bmtTaXplLCBtYW5hZ2VyKSB7CiAgICBzdXBlcihuZXcgVWludDhBcnJheShsZW5ndGgpLCAwLCBsZW5ndGgsIG51bGwpOwogICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CiAgICB0aGlzLl9sb2FkZWRDaHVua3MgPSBuZXcgU2V0KCk7CiAgICB0aGlzLm51bUNodW5rcyA9IE1hdGguY2VpbChsZW5ndGggLyBjaHVua1NpemUpOwogICAgdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKICAgIHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoID0gMDsKICAgIHRoaXMubGFzdFN1Y2Nlc3NmdWxFbnN1cmVCeXRlQ2h1bmsgPSAtMTsKICB9CiAgZ2V0TWlzc2luZ0NodW5rcygpIHsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgZm9yIChsZXQgY2h1bmsgPSAwLCBuID0gdGhpcy5udW1DaHVua3M7IGNodW5rIDwgbjsgKytjaHVuaykgewogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KICBnZXQgbnVtQ2h1bmtzTG9hZGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5zaXplOwogIH0KICBnZXQgaXNEYXRhTG9hZGVkKCkgewogICAgcmV0dXJuIHRoaXMubnVtQ2h1bmtzTG9hZGVkID09PSB0aGlzLm51bUNodW5rczsKICB9CiAgb25SZWNlaXZlRGF0YShiZWdpbiwgY2h1bmspIHsKICAgIGNvbnN0IGNodW5rU2l6ZSA9IHRoaXMuY2h1bmtTaXplOwogICAgaWYgKGJlZ2luICUgY2h1bmtTaXplICE9PSAwKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIGJlZ2luIG9mZnNldDogJHtiZWdpbn1gKTsKICAgIH0KICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2h1bmsuYnl0ZUxlbmd0aDsKICAgIGlmIChlbmQgJSBjaHVua1NpemUgIT09IDAgJiYgZW5kICE9PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBlbmQgb2Zmc2V0OiAke2VuZH1gKTsKICAgIH0KICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgYmVnaW4pOwogICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IoYmVnaW4gLyBjaHVua1NpemUpOwogICAgY29uc3QgZW5kQ2h1bmsgPSBNYXRoLmZsb29yKChlbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOwogICAgZm9yIChsZXQgY3VyQ2h1bmsgPSBiZWdpbkNodW5rOyBjdXJDaHVuayA8IGVuZENodW5rOyArK2N1ckNodW5rKSB7CiAgICAgIHRoaXMuX2xvYWRlZENodW5rcy5hZGQoY3VyQ2h1bmspOwogICAgfQogIH0KICBvblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoZGF0YSkgewogICAgbGV0IHBvc2l0aW9uID0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGg7CiAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihwb3NpdGlvbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIHRoaXMuYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGRhdGEpLCBwb3NpdGlvbik7CiAgICBwb3NpdGlvbiArPSBkYXRhLmJ5dGVMZW5ndGg7CiAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IHBvc2l0aW9uOwogICAgY29uc3QgZW5kQ2h1bmsgPSBwb3NpdGlvbiA+PSB0aGlzLmVuZCA/IHRoaXMubnVtQ2h1bmtzIDogTWF0aC5mbG9vcihwb3NpdGlvbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGZvciAobGV0IGN1ckNodW5rID0gYmVnaW5DaHVuazsgY3VyQ2h1bmsgPCBlbmRDaHVuazsgKytjdXJDaHVuaykgewogICAgICB0aGlzLl9sb2FkZWRDaHVua3MuYWRkKGN1ckNodW5rKTsKICAgIH0KICB9CiAgZW5zdXJlQnl0ZShwb3MpIHsKICAgIGlmIChwb3MgPCB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjaHVuayA9IE1hdGguZmxvb3IocG9zIC8gdGhpcy5jaHVua1NpemUpOwogICAgaWYgKGNodW5rID4gdGhpcy5udW1DaHVua3MpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNodW5rID09PSB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKHBvcywgcG9zICsgMSk7CiAgICB9CiAgICB0aGlzLmxhc3RTdWNjZXNzZnVsRW5zdXJlQnl0ZUNodW5rID0gY2h1bms7CiAgfQogIGVuc3VyZVJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGlmIChiZWdpbiA+PSBlbmQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGVuZCA8PSB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGlmIChiZWdpbkNodW5rID4gdGhpcy5udW1DaHVua3MpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZW5kQ2h1bmsgPSBNYXRoLm1pbihNYXRoLmZsb29yKChlbmQgLSAxKSAvIHRoaXMuY2h1bmtTaXplKSArIDEsIHRoaXMubnVtQ2h1bmtzKTsKICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgewogICAgICBpZiAoIXRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspKSB7CiAgICAgICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKGJlZ2luLCBlbmQpOwogICAgICB9CiAgICB9CiAgfQogIG5leHRFbXB0eUNodW5rKGJlZ2luQ2h1bmspIHsKICAgIGNvbnN0IG51bUNodW5rcyA9IHRoaXMubnVtQ2h1bmtzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1DaHVua3M7ICsraSkgewogICAgICBjb25zdCBjaHVuayA9IChiZWdpbkNodW5rICsgaSkgJSBudW1DaHVua3M7CiAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKICAgICAgICByZXR1cm4gY2h1bms7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBoYXNDaHVuayhjaHVuaykgewogICAgcmV0dXJuIHRoaXMuX2xvYWRlZENodW5rcy5oYXMoY2h1bmspOwogIH0KICBnZXRCeXRlKCkgewogICAgY29uc3QgcG9zID0gdGhpcy5wb3M7CiAgICBpZiAocG9zID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmIChwb3MgPj0gdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHsKICAgICAgdGhpcy5lbnN1cmVCeXRlKHBvcyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlc1t0aGlzLnBvcysrXTsKICB9CiAgZ2V0Qnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIGNvbnN0IHN0ckVuZCA9IHRoaXMuZW5kOwogICAgaWYgKCFsZW5ndGgpIHsKICAgICAgaWYgKHN0ckVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgICAgdGhpcy5lbnN1cmVSYW5nZShwb3MsIHN0ckVuZCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KHBvcywgc3RyRW5kKTsKICAgIH0KICAgIGxldCBlbmQgPSBwb3MgKyBsZW5ndGg7CiAgICBpZiAoZW5kID4gc3RyRW5kKSB7CiAgICAgIGVuZCA9IHN0ckVuZDsKICAgIH0KICAgIGlmIChlbmQgPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICB0aGlzLmVuc3VyZVJhbmdlKHBvcywgZW5kKTsKICAgIH0KICAgIHRoaXMucG9zID0gZW5kOwogICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KHBvcywgZW5kKTsKICB9CiAgZ2V0Qnl0ZVJhbmdlKGJlZ2luLCBlbmQpIHsKICAgIGlmIChiZWdpbiA8IDApIHsKICAgICAgYmVnaW4gPSAwOwogICAgfQogICAgaWYgKGVuZCA+IHRoaXMuZW5kKSB7CiAgICAgIGVuZCA9IHRoaXMuZW5kOwogICAgfQogICAgaWYgKGVuZCA+IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlUmFuZ2UoYmVnaW4sIGVuZCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgaWYgKGxlbmd0aCkgewogICAgICBpZiAoc3RhcnQgKyBsZW5ndGggPiB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCkgewogICAgICAgIHRoaXMuZW5zdXJlUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaWYgKHN0YXJ0ID49IHRoaXMucHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7CiAgICAgICAgdGhpcy5lbnN1cmVCeXRlKHN0YXJ0KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gQ2h1bmtlZFN0cmVhbVN1YnN0cmVhbSgpIHt9CiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZS5nZXRNaXNzaW5nQ2h1bmtzID0gZnVuY3Rpb24gKCkgewogICAgICBjb25zdCBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZTsKICAgICAgY29uc3QgYmVnaW5DaHVuayA9IE1hdGguZmxvb3IodGhpcy5zdGFydCAvIGNodW5rU2l6ZSk7CiAgICAgIGNvbnN0IGVuZENodW5rID0gTWF0aC5mbG9vcigodGhpcy5lbmQgLSAxKSAvIGNodW5rU2l6ZSkgKyAxOwogICAgICBjb25zdCBtaXNzaW5nQ2h1bmtzID0gW107CiAgICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgewogICAgICAgIGlmICghdGhpcy5fbG9hZGVkQ2h1bmtzLmhhcyhjaHVuaykpIHsKICAgICAgICAgIG1pc3NpbmdDaHVua3MucHVzaChjaHVuayk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtaXNzaW5nQ2h1bmtzOwogICAgfTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDaHVua2VkU3RyZWFtU3Vic3RyZWFtLnByb3RvdHlwZSwgImlzRGF0YUxvYWRlZCIsIHsKICAgICAgZ2V0KCkgewogICAgICAgIGlmICh0aGlzLm51bUNodW5rc0xvYWRlZCA9PT0gdGhpcy5udW1DaHVua3MpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5nZXRNaXNzaW5nQ2h1bmtzKCkubGVuZ3RoID09PSAwOwogICAgICB9LAogICAgICBjb25maWd1cmFibGU6IHRydWUKICAgIH0pOwogICAgY29uc3Qgc3ViU3RyZWFtID0gbmV3IENodW5rZWRTdHJlYW1TdWJzdHJlYW0oKTsKICAgIHN1YlN0cmVhbS5wb3MgPSBzdWJTdHJlYW0uc3RhcnQgPSBzdGFydDsKICAgIHN1YlN0cmVhbS5lbmQgPSBzdGFydCArIGxlbmd0aCB8fCB0aGlzLmVuZDsKICAgIHN1YlN0cmVhbS5kaWN0ID0gZGljdDsKICAgIHJldHVybiBzdWJTdHJlYW07CiAgfQogIGdldEJhc2VTdHJlYW1zKCkgewogICAgcmV0dXJuIFt0aGlzXTsKICB9Cn0KZXhwb3J0cy5DaHVua2VkU3RyZWFtID0gQ2h1bmtlZFN0cmVhbTsKY2xhc3MgQ2h1bmtlZFN0cmVhbU1hbmFnZXIgewogIGNvbnN0cnVjdG9yKHBkZk5ldHdvcmtTdHJlYW0sIGFyZ3MpIHsKICAgIHRoaXMubGVuZ3RoID0gYXJncy5sZW5ndGg7CiAgICB0aGlzLmNodW5rU2l6ZSA9IGFyZ3MucmFuZ2VDaHVua1NpemU7CiAgICB0aGlzLnN0cmVhbSA9IG5ldyBDaHVua2VkU3RyZWFtKHRoaXMubGVuZ3RoLCB0aGlzLmNodW5rU2l6ZSwgdGhpcyk7CiAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0gPSBwZGZOZXR3b3JrU3RyZWFtOwogICAgdGhpcy5kaXNhYmxlQXV0b0ZldGNoID0gYXJncy5kaXNhYmxlQXV0b0ZldGNoOwogICAgdGhpcy5tc2dIYW5kbGVyID0gYXJncy5tc2dIYW5kbGVyOwogICAgdGhpcy5jdXJyUmVxdWVzdElkID0gMDsKICAgIHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdCA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3JlcXVlc3RzQnlDaHVuayA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0ID0gbmV3IE1hcCgpOwogICAgdGhpcy5wcm9ncmVzc2l2ZURhdGFMZW5ndGggPSAwOwogICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7CiAgICB0aGlzLl9sb2FkZWRTdHJlYW1DYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7CiAgfQogIHNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpIHsKICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5wZGZOZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpOwogICAgaWYgKCFyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkgewogICAgICByYW5nZVJlYWRlci5vblByb2dyZXNzID0gdGhpcy5vblByb2dyZXNzLmJpbmQodGhpcyk7CiAgICB9CiAgICBsZXQgY2h1bmtzID0gW10sCiAgICAgIGxvYWRlZCA9IDA7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICBjb25zdCByZWFkQ2h1bmsgPSAoewogICAgICAgIHZhbHVlLAogICAgICAgIGRvbmUKICAgICAgfSkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICBpZiAoZG9uZSkgewogICAgICAgICAgICBjb25zdCBjaHVua0RhdGEgPSAoMCwgX2NvcmVfdXRpbHMuYXJyYXlCdWZmZXJzVG9CeXRlcykoY2h1bmtzKTsKICAgICAgICAgICAgY2h1bmtzID0gbnVsbDsKICAgICAgICAgICAgcmVzb2x2ZShjaHVua0RhdGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBsb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDsKICAgICAgICAgIGlmIChyYW5nZVJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCkgewogICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MoewogICAgICAgICAgICAgIGxvYWRlZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTsKICAgICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKHJlYWRDaHVuaywgcmVqZWN0KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICByZWplY3QoZSk7CiAgICAgICAgfQogICAgICB9OwogICAgICByYW5nZVJlYWRlci5yZWFkKCkudGhlbihyZWFkQ2h1bmssIHJlamVjdCk7CiAgICB9KS50aGVuKGRhdGEgPT4gewogICAgICBpZiAodGhpcy5hYm9ydGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMub25SZWNlaXZlRGF0YSh7CiAgICAgICAgY2h1bms6IGRhdGEsCiAgICAgICAgYmVnaW4KICAgICAgfSk7CiAgICB9KTsKICB9CiAgcmVxdWVzdEFsbENodW5rcyhub0ZldGNoID0gZmFsc2UpIHsKICAgIGlmICghbm9GZXRjaCkgewogICAgICBjb25zdCBtaXNzaW5nQ2h1bmtzID0gdGhpcy5zdHJlYW0uZ2V0TWlzc2luZ0NodW5rcygpOwogICAgICB0aGlzLl9yZXF1ZXN0Q2h1bmtzKG1pc3NpbmdDaHVua3MpOwogICAgfQogICAgcmV0dXJuIHRoaXMuX2xvYWRlZFN0cmVhbUNhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgX3JlcXVlc3RDaHVua3MoY2h1bmtzKSB7CiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmN1cnJSZXF1ZXN0SWQrKzsKICAgIGNvbnN0IGNodW5rc05lZWRlZCA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5zZXQocmVxdWVzdElkLCBjaHVua3NOZWVkZWQpOwogICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHsKICAgICAgaWYgKCF0aGlzLnN0cmVhbS5oYXNDaHVuayhjaHVuaykpIHsKICAgICAgICBjaHVua3NOZWVkZWQuYWRkKGNodW5rKTsKICAgICAgfQogICAgfQogICAgaWYgKGNodW5rc05lZWRlZC5zaXplID09PSAwKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKICAgIH0KICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTsKICAgIHRoaXMuX3Byb21pc2VzQnlSZXF1ZXN0LnNldChyZXF1ZXN0SWQsIGNhcGFiaWxpdHkpOwogICAgY29uc3QgY2h1bmtzVG9SZXF1ZXN0ID0gW107CiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rc05lZWRlZCkgewogICAgICBsZXQgcmVxdWVzdElkcyA9IHRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoY2h1bmspOwogICAgICBpZiAoIXJlcXVlc3RJZHMpIHsKICAgICAgICByZXF1ZXN0SWRzID0gW107CiAgICAgICAgdGhpcy5fcmVxdWVzdHNCeUNodW5rLnNldChjaHVuaywgcmVxdWVzdElkcyk7CiAgICAgICAgY2h1bmtzVG9SZXF1ZXN0LnB1c2goY2h1bmspOwogICAgICB9CiAgICAgIHJlcXVlc3RJZHMucHVzaChyZXF1ZXN0SWQpOwogICAgfQogICAgaWYgKGNodW5rc1RvUmVxdWVzdC5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGdyb3VwZWRDaHVua3NUb1JlcXVlc3QgPSB0aGlzLmdyb3VwQ2h1bmtzKGNodW5rc1RvUmVxdWVzdCk7CiAgICAgIGZvciAoY29uc3QgZ3JvdXBlZENodW5rIG9mIGdyb3VwZWRDaHVua3NUb1JlcXVlc3QpIHsKICAgICAgICBjb25zdCBiZWdpbiA9IGdyb3VwZWRDaHVuay5iZWdpbkNodW5rICogdGhpcy5jaHVua1NpemU7CiAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oZ3JvdXBlZENodW5rLmVuZENodW5rICogdGhpcy5jaHVua1NpemUsIHRoaXMubGVuZ3RoKTsKICAgICAgICB0aGlzLnNlbmRSZXF1ZXN0KGJlZ2luLCBlbmQpLmNhdGNoKGNhcGFiaWxpdHkucmVqZWN0KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZS5jYXRjaChyZWFzb24gPT4gewogICAgICBpZiAodGhpcy5hYm9ydGVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRocm93IHJlYXNvbjsKICAgIH0pOwogIH0KICBnZXRTdHJlYW0oKSB7CiAgICByZXR1cm4gdGhpcy5zdHJlYW07CiAgfQogIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kKSB7CiAgICBlbmQgPSBNYXRoLm1pbihlbmQsIHRoaXMubGVuZ3RoKTsKICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsoYmVnaW4pOwogICAgY29uc3QgZW5kQ2h1bmsgPSB0aGlzLmdldEVuZENodW5rKGVuZCk7CiAgICBjb25zdCBjaHVua3MgPSBbXTsKICAgIGZvciAobGV0IGNodW5rID0gYmVnaW5DaHVuazsgY2h1bmsgPCBlbmRDaHVuazsgKytjaHVuaykgewogICAgICBjaHVua3MucHVzaChjaHVuayk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdENodW5rcyhjaHVua3MpOwogIH0KICByZXF1ZXN0UmFuZ2VzKHJhbmdlcyA9IFtdKSB7CiAgICBjb25zdCBjaHVua3NUb1JlcXVlc3QgPSBbXTsKICAgIGZvciAoY29uc3QgcmFuZ2Ugb2YgcmFuZ2VzKSB7CiAgICAgIGNvbnN0IGJlZ2luQ2h1bmsgPSB0aGlzLmdldEJlZ2luQ2h1bmsocmFuZ2UuYmVnaW4pOwogICAgICBjb25zdCBlbmRDaHVuayA9IHRoaXMuZ2V0RW5kQ2h1bmsocmFuZ2UuZW5kKTsKICAgICAgZm9yIChsZXQgY2h1bmsgPSBiZWdpbkNodW5rOyBjaHVuayA8IGVuZENodW5rOyArK2NodW5rKSB7CiAgICAgICAgaWYgKCFjaHVua3NUb1JlcXVlc3QuaW5jbHVkZXMoY2h1bmspKSB7CiAgICAgICAgICBjaHVua3NUb1JlcXVlc3QucHVzaChjaHVuayk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjaHVua3NUb1JlcXVlc3Quc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICByZXR1cm4gYSAtIGI7CiAgICB9KTsKICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0Q2h1bmtzKGNodW5rc1RvUmVxdWVzdCk7CiAgfQogIGdyb3VwQ2h1bmtzKGNodW5rcykgewogICAgY29uc3QgZ3JvdXBlZENodW5rcyA9IFtdOwogICAgbGV0IGJlZ2luQ2h1bmsgPSAtMTsKICAgIGxldCBwcmV2Q2h1bmsgPSAtMTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNodW5rcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldOwogICAgICBpZiAoYmVnaW5DaHVuayA8IDApIHsKICAgICAgICBiZWdpbkNodW5rID0gY2h1bms7CiAgICAgIH0KICAgICAgaWYgKHByZXZDaHVuayA+PSAwICYmIHByZXZDaHVuayArIDEgIT09IGNodW5rKSB7CiAgICAgICAgZ3JvdXBlZENodW5rcy5wdXNoKHsKICAgICAgICAgIGJlZ2luQ2h1bmssCiAgICAgICAgICBlbmRDaHVuazogcHJldkNodW5rICsgMQogICAgICAgIH0pOwogICAgICAgIGJlZ2luQ2h1bmsgPSBjaHVuazsKICAgICAgfQogICAgICBpZiAoaSArIDEgPT09IGNodW5rcy5sZW5ndGgpIHsKICAgICAgICBncm91cGVkQ2h1bmtzLnB1c2goewogICAgICAgICAgYmVnaW5DaHVuaywKICAgICAgICAgIGVuZENodW5rOiBjaHVuayArIDEKICAgICAgICB9KTsKICAgICAgfQogICAgICBwcmV2Q2h1bmsgPSBjaHVuazsKICAgIH0KICAgIHJldHVybiBncm91cGVkQ2h1bmtzOwogIH0KICBvblByb2dyZXNzKGFyZ3MpIHsKICAgIHRoaXMubXNnSGFuZGxlci5zZW5kKCJEb2NQcm9ncmVzcyIsIHsKICAgICAgbG9hZGVkOiB0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgKiB0aGlzLmNodW5rU2l6ZSArIGFyZ3MubG9hZGVkLAogICAgICB0b3RhbDogdGhpcy5sZW5ndGgKICAgIH0pOwogIH0KICBvblJlY2VpdmVEYXRhKGFyZ3MpIHsKICAgIGNvbnN0IGNodW5rID0gYXJncy5jaHVuazsKICAgIGNvbnN0IGlzUHJvZ3Jlc3NpdmUgPSBhcmdzLmJlZ2luID09PSB1bmRlZmluZWQ7CiAgICBjb25zdCBiZWdpbiA9IGlzUHJvZ3Jlc3NpdmUgPyB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA6IGFyZ3MuYmVnaW47CiAgICBjb25zdCBlbmQgPSBiZWdpbiArIGNodW5rLmJ5dGVMZW5ndGg7CiAgICBjb25zdCBiZWdpbkNodW5rID0gTWF0aC5mbG9vcihiZWdpbiAvIHRoaXMuY2h1bmtTaXplKTsKICAgIGNvbnN0IGVuZENodW5rID0gZW5kIDwgdGhpcy5sZW5ndGggPyBNYXRoLmZsb29yKGVuZCAvIHRoaXMuY2h1bmtTaXplKSA6IE1hdGguY2VpbChlbmQgLyB0aGlzLmNodW5rU2l6ZSk7CiAgICBpZiAoaXNQcm9ncmVzc2l2ZSkgewogICAgICB0aGlzLnN0cmVhbS5vblJlY2VpdmVQcm9ncmVzc2l2ZURhdGEoY2h1bmspOwogICAgICB0aGlzLnByb2dyZXNzaXZlRGF0YUxlbmd0aCA9IGVuZDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuc3RyZWFtLm9uUmVjZWl2ZURhdGEoYmVnaW4sIGNodW5rKTsKICAgIH0KICAgIGlmICh0aGlzLnN0cmVhbS5pc0RhdGFMb2FkZWQpIHsKICAgICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZXNvbHZlKHRoaXMuc3RyZWFtKTsKICAgIH0KICAgIGNvbnN0IGxvYWRlZFJlcXVlc3RzID0gW107CiAgICBmb3IgKGxldCBjdXJDaHVuayA9IGJlZ2luQ2h1bms7IGN1ckNodW5rIDwgZW5kQ2h1bms7ICsrY3VyQ2h1bmspIHsKICAgICAgY29uc3QgcmVxdWVzdElkcyA9IHRoaXMuX3JlcXVlc3RzQnlDaHVuay5nZXQoY3VyQ2h1bmspOwogICAgICBpZiAoIXJlcXVlc3RJZHMpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuZGVsZXRlKGN1ckNodW5rKTsKICAgICAgZm9yIChjb25zdCByZXF1ZXN0SWQgb2YgcmVxdWVzdElkcykgewogICAgICAgIGNvbnN0IGNodW5rc05lZWRlZCA9IHRoaXMuX2NodW5rc05lZWRlZEJ5UmVxdWVzdC5nZXQocmVxdWVzdElkKTsKICAgICAgICBpZiAoY2h1bmtzTmVlZGVkLmhhcyhjdXJDaHVuaykpIHsKICAgICAgICAgIGNodW5rc05lZWRlZC5kZWxldGUoY3VyQ2h1bmspOwogICAgICAgIH0KICAgICAgICBpZiAoY2h1bmtzTmVlZGVkLnNpemUgPiAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbG9hZGVkUmVxdWVzdHMucHVzaChyZXF1ZXN0SWQpOwogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMuZGlzYWJsZUF1dG9GZXRjaCAmJiB0aGlzLl9yZXF1ZXN0c0J5Q2h1bmsuc2l6ZSA9PT0gMCkgewogICAgICBsZXQgbmV4dEVtcHR5Q2h1bms7CiAgICAgIGlmICh0aGlzLnN0cmVhbS5udW1DaHVua3NMb2FkZWQgPT09IDEpIHsKICAgICAgICBjb25zdCBsYXN0Q2h1bmsgPSB0aGlzLnN0cmVhbS5udW1DaHVua3MgLSAxOwogICAgICAgIGlmICghdGhpcy5zdHJlYW0uaGFzQ2h1bmsobGFzdENodW5rKSkgewogICAgICAgICAgbmV4dEVtcHR5Q2h1bmsgPSBsYXN0Q2h1bms7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG5leHRFbXB0eUNodW5rID0gdGhpcy5zdHJlYW0ubmV4dEVtcHR5Q2h1bmsoZW5kQ2h1bmspOwogICAgICB9CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG5leHRFbXB0eUNodW5rKSkgewogICAgICAgIHRoaXMuX3JlcXVlc3RDaHVua3MoW25leHRFbXB0eUNodW5rXSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgcmVxdWVzdElkIG9mIGxvYWRlZFJlcXVlc3RzKSB7CiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC5nZXQocmVxdWVzdElkKTsKICAgICAgdGhpcy5fcHJvbWlzZXNCeVJlcXVlc3QuZGVsZXRlKHJlcXVlc3RJZCk7CiAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpOwogICAgfQogICAgdGhpcy5tc2dIYW5kbGVyLnNlbmQoIkRvY1Byb2dyZXNzIiwgewogICAgICBsb2FkZWQ6IHRoaXMuc3RyZWFtLm51bUNodW5rc0xvYWRlZCAqIHRoaXMuY2h1bmtTaXplLAogICAgICB0b3RhbDogdGhpcy5sZW5ndGgKICAgIH0pOwogIH0KICBvbkVycm9yKGVycikgewogICAgdGhpcy5fbG9hZGVkU3RyZWFtQ2FwYWJpbGl0eS5yZWplY3QoZXJyKTsKICB9CiAgZ2V0QmVnaW5DaHVuayhiZWdpbikgewogICAgcmV0dXJuIE1hdGguZmxvb3IoYmVnaW4gLyB0aGlzLmNodW5rU2l6ZSk7CiAgfQogIGdldEVuZENodW5rKGVuZCkgewogICAgcmV0dXJuIE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gdGhpcy5jaHVua1NpemUpICsgMTsKICB9CiAgYWJvcnQocmVhc29uKSB7CiAgICB0aGlzLmFib3J0ZWQgPSB0cnVlOwogICAgaWYgKHRoaXMucGRmTmV0d29ya1N0cmVhbSkgewogICAgICB0aGlzLnBkZk5ldHdvcmtTdHJlYW0uY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKTsKICAgIH0KICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiB0aGlzLl9wcm9taXNlc0J5UmVxdWVzdC52YWx1ZXMoKSkgewogICAgICBjYXBhYmlsaXR5LnJlamVjdChyZWFzb24pOwogICAgfQogIH0KfQpleHBvcnRzLkNodW5rZWRTdHJlYW1NYW5hZ2VyID0gQ2h1bmtlZFN0cmVhbU1hbmFnZXI7CgovKioqLyB9KSwKLyogOCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlN0cmluZ1N0cmVhbSA9IGV4cG9ydHMuU3RyZWFtID0gZXhwb3J0cy5OdWxsU3RyZWFtID0gdm9pZCAwOwp2YXIgX2Jhc2Vfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgU3RyZWFtIGV4dGVuZHMgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5ieXRlcyA9IGFycmF5QnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGFycmF5QnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpOwogICAgdGhpcy5zdGFydCA9IHN0YXJ0IHx8IDA7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgICB0aGlzLmVuZCA9IHN0YXJ0ICsgbGVuZ3RoIHx8IHRoaXMuYnl0ZXMubGVuZ3RoOwogICAgdGhpcy5kaWN0ID0gZGljdDsKICB9CiAgZ2V0IGxlbmd0aCgpIHsKICAgIHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhcnQ7CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwOwogIH0KICBnZXRCeXRlKCkgewogICAgaWYgKHRoaXMucG9zID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ5dGVzW3RoaXMucG9zKytdOwogIH0KICBnZXRCeXRlcyhsZW5ndGgpIHsKICAgIGNvbnN0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgY29uc3Qgc3RyRW5kID0gdGhpcy5lbmQ7CiAgICBpZiAoIWxlbmd0aCkgewogICAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBzdHJFbmQpOwogICAgfQogICAgbGV0IGVuZCA9IHBvcyArIGxlbmd0aDsKICAgIGlmIChlbmQgPiBzdHJFbmQpIHsKICAgICAgZW5kID0gc3RyRW5kOwogICAgfQogICAgdGhpcy5wb3MgPSBlbmQ7CiAgICByZXR1cm4gYnl0ZXMuc3ViYXJyYXkocG9zLCBlbmQpOwogIH0KICBnZXRCeXRlUmFuZ2UoYmVnaW4sIGVuZCkgewogICAgaWYgKGJlZ2luIDwgMCkgewogICAgICBiZWdpbiA9IDA7CiAgICB9CiAgICBpZiAoZW5kID4gdGhpcy5lbmQpIHsKICAgICAgZW5kID0gdGhpcy5lbmQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5ieXRlcy5zdWJhcnJheShiZWdpbiwgZW5kKTsKICB9CiAgcmVzZXQoKSB7CiAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7CiAgfQogIG1vdmVTdGFydCgpIHsKICAgIHRoaXMuc3RhcnQgPSB0aGlzLnBvczsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgcmV0dXJuIG5ldyBTdHJlYW0odGhpcy5ieXRlcy5idWZmZXIsIHN0YXJ0LCBsZW5ndGgsIGRpY3QpOwogIH0KfQpleHBvcnRzLlN0cmVhbSA9IFN0cmVhbTsKY2xhc3MgU3RyaW5nU3RyZWFtIGV4dGVuZHMgU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIpIHsKICAgIHN1cGVyKCgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzdHIpKTsKICB9Cn0KZXhwb3J0cy5TdHJpbmdTdHJlYW0gPSBTdHJpbmdTdHJlYW07CmNsYXNzIE51bGxTdHJlYW0gZXh0ZW5kcyBTdHJlYW0gewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIobmV3IFVpbnQ4QXJyYXkoMCkpOwogIH0KfQpleHBvcnRzLk51bGxTdHJlYW0gPSBOdWxsU3RyZWFtOwoKLyoqKi8gfSksCi8qIDkgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5QYWdlID0gZXhwb3J0cy5QREZEb2N1bWVudCA9IHZvaWQgMDsKdmFyIF9hbm5vdGF0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfeGZhX2ZvbnRzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1MSk7CnZhciBfYmFzZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOwp2YXIgX2NyeXB0byA9IF9fd19wZGZqc19yZXF1aXJlX18oNjgpOwp2YXIgX2NhdGFsb2cgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcwKTsKdmFyIF9jbGVhbnVwX2hlbHBlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNzIpOwp2YXIgX2RhdGFzZXRfcmVhZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxMDEpOwp2YXIgX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CnZhciBfb2JqZWN0X2xvYWRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNzYpOwp2YXIgX29wZXJhdG9yX2xpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY0KTsKdmFyIF9ldmFsdWF0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTsKdmFyIF9kZWNvZGVfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7CnZhciBfc3RydWN0X3RyZWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc1KTsKdmFyIF93cml0ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY2KTsKdmFyIF9mYWN0b3J5ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3Nyk7CnZhciBfeHJlZiA9IF9fd19wZGZqc19yZXF1aXJlX18oMTAyKTsKY29uc3QgREVGQVVMVF9VU0VSX1VOSVQgPSAxLjA7CmNvbnN0IExFVFRFUl9TSVpFX01FRElBQk9YID0gWzAsIDAsIDYxMiwgNzkyXTsKY2xhc3MgUGFnZSB7CiAgY29uc3RydWN0b3IoewogICAgcGRmTWFuYWdlciwKICAgIHhyZWYsCiAgICBwYWdlSW5kZXgsCiAgICBwYWdlRGljdCwKICAgIHJlZiwKICAgIGdsb2JhbElkRmFjdG9yeSwKICAgIGZvbnRDYWNoZSwKICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCiAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICBnbG9iYWxJbWFnZUNhY2hlLAogICAgc3lzdGVtRm9udENhY2hlLAogICAgbm9uQmxlbmRNb2Rlc1NldCwKICAgIHhmYUZhY3RvcnkKICB9KSB7CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7CiAgICB0aGlzLnBhZ2VEaWN0ID0gcGFnZURpY3Q7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5yZWYgPSByZWY7CiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSA9IHN0YW5kYXJkRm9udERhdGFDYWNoZTsKICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7CiAgICB0aGlzLnN5c3RlbUZvbnRDYWNoZSA9IHN5c3RlbUZvbnRDYWNoZTsKICAgIHRoaXMubm9uQmxlbmRNb2Rlc1NldCA9IG5vbkJsZW5kTW9kZXNTZXQ7CiAgICB0aGlzLmV2YWx1YXRvck9wdGlvbnMgPSBwZGZNYW5hZ2VyLmV2YWx1YXRvck9wdGlvbnM7CiAgICB0aGlzLnJlc291cmNlc1Byb21pc2UgPSBudWxsOwogICAgdGhpcy54ZmFGYWN0b3J5ID0geGZhRmFjdG9yeTsKICAgIGNvbnN0IGlkQ291bnRlcnMgPSB7CiAgICAgIG9iajogMAogICAgfTsKICAgIHRoaXMuX2xvY2FsSWRGYWN0b3J5ID0gY2xhc3MgZXh0ZW5kcyBnbG9iYWxJZEZhY3RvcnkgewogICAgICBzdGF0aWMgY3JlYXRlT2JqSWQoKSB7CiAgICAgICAgcmV0dXJuIGBwJHtwYWdlSW5kZXh9XyR7KytpZENvdW50ZXJzLm9ian1gOwogICAgICB9CiAgICAgIHN0YXRpYyBnZXRQYWdlT2JqSWQoKSB7CiAgICAgICAgcmV0dXJuIGBwJHtyZWYudG9TdHJpbmcoKX1gOwogICAgICB9CiAgICB9OwogIH0KICBfZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShrZXksIGdldEFycmF5ID0gZmFsc2UpIHsKICAgIGNvbnN0IHZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKICAgICAgZGljdDogdGhpcy5wYWdlRGljdCwKICAgICAga2V5LAogICAgICBnZXRBcnJheSwKICAgICAgc3RvcFdoZW5Gb3VuZDogZmFsc2UKICAgIH0pOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAxIHx8ICEodmFsdWVbMF0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm4gdmFsdWVbMF07CiAgICB9CiAgICByZXR1cm4gX3ByaW1pdGl2ZXMuRGljdC5tZXJnZSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgZGljdEFycmF5OiB2YWx1ZQogICAgfSk7CiAgfQogIGdldCBjb250ZW50KCkgewogICAgcmV0dXJuIHRoaXMucGFnZURpY3QuZ2V0QXJyYXkoIkNvbnRlbnRzIik7CiAgfQogIGdldCByZXNvdXJjZXMoKSB7CiAgICBjb25zdCByZXNvdXJjZXMgPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJSZXNvdXJjZXMiKTsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAicmVzb3VyY2VzIiwgcmVzb3VyY2VzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCA/IHJlc291cmNlcyA6IF9wcmltaXRpdmVzLkRpY3QuZW1wdHkpOwogIH0KICBfZ2V0Qm91bmRpbmdCb3gobmFtZSkgewogICAgaWYgKHRoaXMueGZhRGF0YSkgewogICAgICByZXR1cm4gdGhpcy54ZmFEYXRhLmJib3g7CiAgICB9CiAgICBsZXQgYm94ID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eShuYW1lLCB0cnVlKTsKICAgIGlmIChBcnJheS5pc0FycmF5KGJveCkgJiYgYm94Lmxlbmd0aCA9PT0gNCkgewogICAgICBib3ggPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoYm94KTsKICAgICAgaWYgKGJveFsyXSAtIGJveFswXSA+IDAgJiYgYm94WzNdIC0gYm94WzFdID4gMCkgewogICAgICAgIHJldHVybiBib3g7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBFbXB0eSwgb3IgaW52YWxpZCwgLyR7bmFtZX0gZW50cnkuYCk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZ2V0IG1lZGlhQm94KCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtZWRpYUJveCIsIHRoaXMuX2dldEJvdW5kaW5nQm94KCJNZWRpYUJveCIpIHx8IExFVFRFUl9TSVpFX01FRElBQk9YKTsKICB9CiAgZ2V0IGNyb3BCb3goKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImNyb3BCb3giLCB0aGlzLl9nZXRCb3VuZGluZ0JveCgiQ3JvcEJveCIpIHx8IHRoaXMubWVkaWFCb3gpOwogIH0KICBnZXQgdXNlclVuaXQoKSB7CiAgICBsZXQgb2JqID0gdGhpcy5wYWdlRGljdC5nZXQoIlVzZXJVbml0Iik7CiAgICBpZiAodHlwZW9mIG9iaiAhPT0gIm51bWJlciIgfHwgb2JqIDw9IDApIHsKICAgICAgb2JqID0gREVGQVVMVF9VU0VSX1VOSVQ7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXJVbml0Iiwgb2JqKTsKICB9CiAgZ2V0IHZpZXcoKSB7CiAgICBjb25zdCB7CiAgICAgIGNyb3BCb3gsCiAgICAgIG1lZGlhQm94CiAgICB9ID0gdGhpczsKICAgIGlmIChjcm9wQm94ICE9PSBtZWRpYUJveCAmJiAhKDAsIF91dGlsLmlzQXJyYXlFcXVhbCkoY3JvcEJveCwgbWVkaWFCb3gpKSB7CiAgICAgIGNvbnN0IGJveCA9IF91dGlsLlV0aWwuaW50ZXJzZWN0KGNyb3BCb3gsIG1lZGlhQm94KTsKICAgICAgaWYgKGJveCAmJiBib3hbMl0gLSBib3hbMF0gPiAwICYmIGJveFszXSAtIGJveFsxXSA+IDApIHsKICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInZpZXciLCBib3gpOwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKSgiRW1wdHkgL0Nyb3BCb3ggYW5kIC9NZWRpYUJveCBpbnRlcnNlY3Rpb24uIik7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInZpZXciLCBtZWRpYUJveCk7CiAgfQogIGdldCByb3RhdGUoKSB7CiAgICBsZXQgcm90YXRlID0gdGhpcy5fZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSgiUm90YXRlIikgfHwgMDsKICAgIGlmIChyb3RhdGUgJSA5MCAhPT0gMCkgewogICAgICByb3RhdGUgPSAwOwogICAgfSBlbHNlIGlmIChyb3RhdGUgPj0gMzYwKSB7CiAgICAgIHJvdGF0ZSAlPSAzNjA7CiAgICB9IGVsc2UgaWYgKHJvdGF0ZSA8IDApIHsKICAgICAgcm90YXRlID0gKHJvdGF0ZSAlIDM2MCArIDM2MCkgJSAzNjA7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJvdGF0ZSIsIHJvdGF0ZSk7CiAgfQogIF9vblN1YlN0cmVhbUVycm9yKHJlYXNvbiwgb2JqSWQpIHsKICAgIGlmICh0aGlzLmV2YWx1YXRvck9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0Q29udGVudFN0cmVhbSAtIGlnbm9yaW5nIHN1Yi1zdHJlYW0gKCR7b2JqSWR9KTogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRocm93IHJlYXNvbjsKICB9CiAgZ2V0Q29udGVudFN0cmVhbSgpIHsKICAgIHJldHVybiB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlKHRoaXMsICJjb250ZW50IikudGhlbihjb250ZW50ID0+IHsKICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgICAgIHJldHVybiBjb250ZW50OwogICAgICB9CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7CiAgICAgICAgcmV0dXJuIG5ldyBfZGVjb2RlX3N0cmVhbS5TdHJlYW1zU2VxdWVuY2VTdHJlYW0oY29udGVudCwgdGhpcy5fb25TdWJTdHJlYW1FcnJvci5iaW5kKHRoaXMpKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IF9zdHJlYW0uTnVsbFN0cmVhbSgpOwogICAgfSk7CiAgfQogIGdldCB4ZmFEYXRhKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ4ZmFEYXRhIiwgdGhpcy54ZmFGYWN0b3J5ID8gewogICAgICBiYm94OiB0aGlzLnhmYUZhY3RvcnkuZ2V0Qm91bmRpbmdCb3godGhpcy5wYWdlSW5kZXgpCiAgICB9IDogbnVsbCk7CiAgfQogIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9ucykgewogICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlhGQTogQ2Fubm90IHNhdmUgbmV3IGFubm90YXRpb25zLiIpOwogICAgfQogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBfZXZhbHVhdG9yLlBhcnRpYWxFdmFsdWF0b3IoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGhhbmRsZXIsCiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICBzeXN0ZW1Gb250Q2FjaGU6IHRoaXMuc3lzdGVtRm9udENhY2hlLAogICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgY29uc3QgcGFnZURpY3QgPSB0aGlzLnBhZ2VEaWN0OwogICAgY29uc3QgYW5ub3RhdGlvbnNBcnJheSA9IHRoaXMuYW5ub3RhdGlvbnMuc2xpY2UoKTsKICAgIGNvbnN0IG5ld0RhdGEgPSBhd2FpdCBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5zYXZlTmV3QW5ub3RhdGlvbnMocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMpOwogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZgogICAgfSBvZiBuZXdEYXRhLmFubm90YXRpb25zKSB7CiAgICAgIGFubm90YXRpb25zQXJyYXkucHVzaChyZWYpOwogICAgfQogICAgY29uc3Qgc2F2ZWREaWN0ID0gcGFnZURpY3QuZ2V0KCJBbm5vdHMiKTsKICAgIHBhZ2VEaWN0LnNldCgiQW5ub3RzIiwgYW5ub3RhdGlvbnNBcnJheSk7CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGxldCB0cmFuc2Zvcm0gPSBudWxsOwogICAgaWYgKHRoaXMueHJlZi5lbmNyeXB0KSB7CiAgICAgIHRyYW5zZm9ybSA9IHRoaXMueHJlZi5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnJlZi5udW0sIHRoaXMucmVmLmdlbik7CiAgICB9CiAgICBhd2FpdCAoMCwgX3dyaXRlci53cml0ZU9iamVjdCkodGhpcy5yZWYsIHBhZ2VEaWN0LCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgICBpZiAoc2F2ZWREaWN0KSB7CiAgICAgIHBhZ2VEaWN0LnNldCgiQW5ub3RzIiwgc2F2ZWREaWN0KTsKICAgIH0KICAgIGNvbnN0IG9iamVjdHMgPSBuZXdEYXRhLmRlcGVuZGVuY2llczsKICAgIG9iamVjdHMucHVzaCh7CiAgICAgIHJlZjogdGhpcy5yZWYsCiAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQogICAgfSwgLi4ubmV3RGF0YS5hbm5vdGF0aW9ucyk7CiAgICByZXR1cm4gb2JqZWN0czsKICB9CiAgc2F2ZShoYW5kbGVyLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgcGFydGlhbEV2YWx1YXRvciA9IG5ldyBfZXZhbHVhdG9yLlBhcnRpYWxFdmFsdWF0b3IoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGhhbmRsZXIsCiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsCiAgICAgIGlkRmFjdG9yeTogdGhpcy5fbG9jYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgIGJ1aWx0SW5DTWFwQ2FjaGU6IHRoaXMuYnVpbHRJbkNNYXBDYWNoZSwKICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICBzeXN0ZW1Gb250Q2FjaGU6IHRoaXMuc3lzdGVtRm9udENhY2hlLAogICAgICBvcHRpb25zOiB0aGlzLmV2YWx1YXRvck9wdGlvbnMKICAgIH0pOwogICAgcmV0dXJuIHRoaXMuX3BhcnNlZEFubm90YXRpb25zLnRoZW4oZnVuY3Rpb24gKGFubm90YXRpb25zKSB7CiAgICAgIGNvbnN0IG5ld1JlZnNQcm9taXNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgICBpZiAoIWFubm90YXRpb24ubXVzdEJlUHJpbnRlZChhbm5vdGF0aW9uU3RvcmFnZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBuZXdSZWZzUHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLnNhdmUocGFydGlhbEV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgic2F2ZSAtIGlnbm9yaW5nIGFubm90YXRpb24gZGF0YSBkdXJpbmcgIiArIGAiJHt0YXNrLm5hbWV9IiB0YXNrOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pKTsKICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmV3UmVmc1Byb21pc2VzKS50aGVuKGZ1bmN0aW9uIChuZXdSZWZzKSB7CiAgICAgICAgcmV0dXJuIG5ld1JlZnMuZmlsdGVyKG5ld1JlZiA9PiAhIW5ld1JlZik7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGxvYWRSZXNvdXJjZXMoa2V5cykgewogICAgaWYgKCF0aGlzLnJlc291cmNlc1Byb21pc2UpIHsKICAgICAgdGhpcy5yZXNvdXJjZXNQcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAicmVzb3VyY2VzIik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXNQcm9taXNlLnRoZW4oKCkgPT4gewogICAgICBjb25zdCBvYmplY3RMb2FkZXIgPSBuZXcgX29iamVjdF9sb2FkZXIuT2JqZWN0TG9hZGVyKHRoaXMucmVzb3VyY2VzLCBrZXlzLCB0aGlzLnhyZWYpOwogICAgICByZXR1cm4gb2JqZWN0TG9hZGVyLmxvYWQoKTsKICAgIH0pOwogIH0KICBnZXRPcGVyYXRvckxpc3QoewogICAgaGFuZGxlciwKICAgIHNpbmssCiAgICB0YXNrLAogICAgaW50ZW50LAogICAgY2FjaGVLZXksCiAgICBhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwKICB9KSB7CiAgICBjb25zdCBjb250ZW50U3RyZWFtUHJvbWlzZSA9IHRoaXMuZ2V0Q29udGVudFN0cmVhbSgpOwogICAgY29uc3QgcmVzb3VyY2VzUHJvbWlzZSA9IHRoaXMubG9hZFJlc291cmNlcyhbIkNvbG9yU3BhY2UiLCAiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUGF0dGVybiIsICJQcm9wZXJ0aWVzIiwgIlNoYWRpbmciLCAiWE9iamVjdCJdKTsKICAgIGNvbnN0IHBhcnRpYWxFdmFsdWF0b3IgPSBuZXcgX2V2YWx1YXRvci5QYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBoYW5kbGVyLAogICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICBmb250Q2FjaGU6IHRoaXMuZm9udENhY2hlLAogICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICB9KTsKICAgIGNvbnN0IG5ld0Fubm90YXRpb25zQnlQYWdlID0gIXRoaXMueGZhRmFjdG9yeSA/ICgwLCBfY29yZV91dGlscy5nZXROZXdBbm5vdGF0aW9uc01hcCkoYW5ub3RhdGlvblN0b3JhZ2UpIDogbnVsbDsKICAgIGxldCBuZXdBbm5vdGF0aW9uc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICBpZiAobmV3QW5ub3RhdGlvbnNCeVBhZ2UpIHsKICAgICAgY29uc3QgbmV3QW5ub3RhdGlvbnMgPSBuZXdBbm5vdGF0aW9uc0J5UGFnZS5nZXQodGhpcy5wYWdlSW5kZXgpOwogICAgICBpZiAobmV3QW5ub3RhdGlvbnMpIHsKICAgICAgICBuZXdBbm5vdGF0aW9uc1Byb21pc2UgPSBfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5wcmludE5ld0Fubm90YXRpb25zKHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIG5ld0Fubm90YXRpb25zKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZGF0YVByb21pc2VzID0gUHJvbWlzZS5hbGwoW2NvbnRlbnRTdHJlYW1Qcm9taXNlLCByZXNvdXJjZXNQcm9taXNlXSk7CiAgICBjb25zdCBwYWdlTGlzdFByb21pc2UgPSBkYXRhUHJvbWlzZXMudGhlbigoW2NvbnRlbnRTdHJlYW1dKSA9PiB7CiAgICAgIGNvbnN0IG9wTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoaW50ZW50LCBzaW5rKTsKICAgICAgaGFuZGxlci5zZW5kKCJTdGFydFJlbmRlclBhZ2UiLCB7CiAgICAgICAgdHJhbnNwYXJlbmN5OiBwYXJ0aWFsRXZhbHVhdG9yLmhhc0JsZW5kTW9kZXModGhpcy5yZXNvdXJjZXMsIHRoaXMubm9uQmxlbmRNb2Rlc1NldCksCiAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgICBjYWNoZUtleQogICAgICB9KTsKICAgICAgcmV0dXJuIHBhcnRpYWxFdmFsdWF0b3IuZ2V0T3BlcmF0b3JMaXN0KHsKICAgICAgICBzdHJlYW06IGNvbnRlbnRTdHJlYW0sCiAgICAgICAgdGFzaywKICAgICAgICByZXNvdXJjZXM6IHRoaXMucmVzb3VyY2VzLAogICAgICAgIG9wZXJhdG9yTGlzdDogb3BMaXN0CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBvcExpc3Q7CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3BhZ2VMaXN0UHJvbWlzZSwgdGhpcy5fcGFyc2VkQW5ub3RhdGlvbnMsIG5ld0Fubm90YXRpb25zUHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKFtwYWdlT3BMaXN0LCBhbm5vdGF0aW9ucywgbmV3QW5ub3RhdGlvbnNdKSB7CiAgICAgIGlmIChuZXdBbm5vdGF0aW9ucykgewogICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuY29uY2F0KG5ld0Fubm90YXRpb25zKTsKICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwIHx8IGludGVudCAmIF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRSkgewogICAgICAgIHBhZ2VPcExpc3QuZmx1c2godHJ1ZSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGxlbmd0aDogcGFnZU9wTGlzdC50b3RhbExlbmd0aAogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3QgcmVuZGVyRm9ybXMgPSAhIShpbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TKSwKICAgICAgICBpbnRlbnRBbnkgPSAhIShpbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOWSksCiAgICAgICAgaW50ZW50RGlzcGxheSA9ICEhKGludGVudCAmIF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuRElTUExBWSksCiAgICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgICAgY29uc3Qgb3BMaXN0UHJvbWlzZXMgPSBbXTsKICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgICAgaWYgKGludGVudEFueSB8fCBpbnRlbnREaXNwbGF5ICYmIGFubm90YXRpb24ubXVzdEJlVmlld2VkKGFubm90YXRpb25TdG9yYWdlKSB8fCBpbnRlbnRQcmludCAmJiBhbm5vdGF0aW9uLm11c3RCZVByaW50ZWQoYW5ub3RhdGlvblN0b3JhZ2UpKSB7CiAgICAgICAgICBvcExpc3RQcm9taXNlcy5wdXNoKGFubm90YXRpb24uZ2V0T3BlcmF0b3JMaXN0KHBhcnRpYWxFdmFsdWF0b3IsIHRhc2ssIGludGVudCwgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgYW5ub3RhdGlvbiBkYXRhIGR1cmluZyAiICsgYCIke3Rhc2submFtZX0iIHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIG9wTGlzdDogbnVsbCwKICAgICAgICAgICAgICBzZXBhcmF0ZUZvcm06IGZhbHNlLAogICAgICAgICAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgICAgICAgICB9OwogICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3BMaXN0UHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKG9wTGlzdHMpIHsKICAgICAgICBsZXQgZm9ybSA9IGZhbHNlLAogICAgICAgICAgY2FudmFzID0gZmFsc2U7CiAgICAgICAgZm9yIChjb25zdCB7CiAgICAgICAgICBvcExpc3QsCiAgICAgICAgICBzZXBhcmF0ZUZvcm0sCiAgICAgICAgICBzZXBhcmF0ZUNhbnZhcwogICAgICAgIH0gb2Ygb3BMaXN0cykgewogICAgICAgICAgcGFnZU9wTGlzdC5hZGRPcExpc3Qob3BMaXN0KTsKICAgICAgICAgIGZvcm0gfHw9IHNlcGFyYXRlRm9ybTsKICAgICAgICAgIGNhbnZhcyB8fD0gc2VwYXJhdGVDYW52YXM7CiAgICAgICAgfQogICAgICAgIHBhZ2VPcExpc3QuZmx1c2godHJ1ZSwgewogICAgICAgICAgZm9ybSwKICAgICAgICAgIGNhbnZhcwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsZW5ndGg6IHBhZ2VPcExpc3QudG90YWxMZW5ndGgKICAgICAgICB9OwogICAgICB9KTsKICAgIH0pOwogIH0KICBleHRyYWN0VGV4dENvbnRlbnQoewogICAgaGFuZGxlciwKICAgIHRhc2ssCiAgICBpbmNsdWRlTWFya2VkQ29udGVudCwKICAgIGRpc2FibGVOb3JtYWxpemF0aW9uLAogICAgc2luawogIH0pIHsKICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1Qcm9taXNlID0gdGhpcy5nZXRDb250ZW50U3RyZWFtKCk7CiAgICBjb25zdCByZXNvdXJjZXNQcm9taXNlID0gdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0pOwogICAgY29uc3QgZGF0YVByb21pc2VzID0gUHJvbWlzZS5hbGwoW2NvbnRlbnRTdHJlYW1Qcm9taXNlLCByZXNvdXJjZXNQcm9taXNlXSk7CiAgICByZXR1cm4gZGF0YVByb21pc2VzLnRoZW4oKFtjb250ZW50U3RyZWFtXSkgPT4gewogICAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CiAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgIGhhbmRsZXIsCiAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgICBpZEZhY3Rvcnk6IHRoaXMuX2xvY2FsSWRGYWN0b3J5LAogICAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5idWlsdEluQ01hcENhY2hlLAogICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICAgIHN5c3RlbUZvbnRDYWNoZTogdGhpcy5zeXN0ZW1Gb250Q2FjaGUsCiAgICAgICAgb3B0aW9uczogdGhpcy5ldmFsdWF0b3JPcHRpb25zCiAgICAgIH0pOwogICAgICByZXR1cm4gcGFydGlhbEV2YWx1YXRvci5nZXRUZXh0Q29udGVudCh7CiAgICAgICAgc3RyZWFtOiBjb250ZW50U3RyZWFtLAogICAgICAgIHRhc2ssCiAgICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcywKICAgICAgICBpbmNsdWRlTWFya2VkQ29udGVudCwKICAgICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiwKICAgICAgICBzaW5rLAogICAgICAgIHZpZXdCb3g6IHRoaXMudmlldwogICAgICB9KTsKICAgIH0pOwogIH0KICBhc3luYyBnZXRTdHJ1Y3RUcmVlKCkgewogICAgY29uc3Qgc3RydWN0VHJlZVJvb3QgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygic3RydWN0VHJlZVJvb3QiKTsKICAgIGlmICghc3RydWN0VHJlZVJvb3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdHJ1Y3RUcmVlID0gYXdhaXQgdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiX3BhcnNlU3RydWN0VHJlZSIsIFtzdHJ1Y3RUcmVlUm9vdF0pOwogICAgcmV0dXJuIHN0cnVjdFRyZWUuc2VyaWFsaXphYmxlOwogIH0KICBfcGFyc2VTdHJ1Y3RUcmVlKHN0cnVjdFRyZWVSb290KSB7CiAgICBjb25zdCB0cmVlID0gbmV3IF9zdHJ1Y3RfdHJlZS5TdHJ1Y3RUcmVlUGFnZShzdHJ1Y3RUcmVlUm9vdCwgdGhpcy5wYWdlRGljdCk7CiAgICB0cmVlLnBhcnNlKCk7CiAgICByZXR1cm4gdHJlZTsKICB9CiAgYXN5bmMgZ2V0QW5ub3RhdGlvbnNEYXRhKGhhbmRsZXIsIHRhc2ssIGludGVudCkgewogICAgY29uc3QgYW5ub3RhdGlvbnMgPSBhd2FpdCB0aGlzLl9wYXJzZWRBbm5vdGF0aW9uczsKICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgY29uc3QgYW5ub3RhdGlvbnNEYXRhID0gW10sCiAgICAgIHRleHRDb250ZW50UHJvbWlzZXMgPSBbXTsKICAgIGxldCBwYXJ0aWFsRXZhbHVhdG9yOwogICAgY29uc3QgaW50ZW50QW55ID0gISEoaW50ZW50ICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTlkpLAogICAgICBpbnRlbnREaXNwbGF5ID0gISEoaW50ZW50ICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZKSwKICAgICAgaW50ZW50UHJpbnQgPSAhIShpbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTsKICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICBjb25zdCBpc1Zpc2libGUgPSBpbnRlbnRBbnkgfHwgaW50ZW50RGlzcGxheSAmJiBhbm5vdGF0aW9uLnZpZXdhYmxlOwogICAgICBpZiAoaXNWaXNpYmxlIHx8IGludGVudFByaW50ICYmIGFubm90YXRpb24ucHJpbnRhYmxlKSB7CiAgICAgICAgYW5ub3RhdGlvbnNEYXRhLnB1c2goYW5ub3RhdGlvbi5kYXRhKTsKICAgICAgfQogICAgICBpZiAoYW5ub3RhdGlvbi5oYXNUZXh0Q29udGVudCAmJiBpc1Zpc2libGUpIHsKICAgICAgICBwYXJ0aWFsRXZhbHVhdG9yIHx8PSBuZXcgX2V2YWx1YXRvci5QYXJ0aWFsRXZhbHVhdG9yKHsKICAgICAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgICAgIGhhbmRsZXIsCiAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LAogICAgICAgICAgaWRGYWN0b3J5OiB0aGlzLl9sb2NhbElkRmFjdG9yeSwKICAgICAgICAgIGZvbnRDYWNoZTogdGhpcy5mb250Q2FjaGUsCiAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGU6IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLAogICAgICAgICAgZ2xvYmFsSW1hZ2VDYWNoZTogdGhpcy5nbG9iYWxJbWFnZUNhY2hlLAogICAgICAgICAgc3lzdGVtRm9udENhY2hlOiB0aGlzLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZXZhbHVhdG9yT3B0aW9ucwogICAgICAgIH0pOwogICAgICAgIHRleHRDb250ZW50UHJvbWlzZXMucHVzaChhbm5vdGF0aW9uLmV4dHJhY3RUZXh0Q29udGVudChwYXJ0aWFsRXZhbHVhdG9yLCB0YXNrLCBbLUluZmluaXR5LCAtSW5maW5pdHksIEluZmluaXR5LCBJbmZpbml0eV0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0QW5ub3RhdGlvbnNEYXRhIC0gaWdub3JpbmcgdGV4dENvbnRlbnQgZHVyaW5nICIke3Rhc2submFtZX0iIHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgIH0pKTsKICAgICAgfQogICAgfQogICAgYXdhaXQgUHJvbWlzZS5hbGwodGV4dENvbnRlbnRQcm9taXNlcyk7CiAgICByZXR1cm4gYW5ub3RhdGlvbnNEYXRhOwogIH0KICBnZXQgYW5ub3RhdGlvbnMoKSB7CiAgICBjb25zdCBhbm5vdHMgPSB0aGlzLl9nZXRJbmhlcml0YWJsZVByb3BlcnR5KCJBbm5vdHMiKTsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYW5ub3RhdGlvbnMiLCBBcnJheS5pc0FycmF5KGFubm90cykgPyBhbm5vdHMgOiBbXSk7CiAgfQogIGdldCBfcGFyc2VkQW5ub3RhdGlvbnMoKSB7CiAgICBjb25zdCBwYXJzZWRBbm5vdGF0aW9ucyA9IHRoaXMucGRmTWFuYWdlci5lbnN1cmUodGhpcywgImFubm90YXRpb25zIikudGhlbigoKSA9PiB7CiAgICAgIGNvbnN0IGFubm90YXRpb25Qcm9taXNlcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGFubm90YXRpb25SZWYgb2YgdGhpcy5hbm5vdGF0aW9ucykgewogICAgICAgIGFubm90YXRpb25Qcm9taXNlcy5wdXNoKF9hbm5vdGF0aW9uLkFubm90YXRpb25GYWN0b3J5LmNyZWF0ZSh0aGlzLnhyZWYsIGFubm90YXRpb25SZWYsIHRoaXMucGRmTWFuYWdlciwgdGhpcy5fbG9jYWxJZEZhY3RvcnksIGZhbHNlKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYF9wYXJzZWRBbm5vdGF0aW9uczogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGFubm90YXRpb25Qcm9taXNlcykudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHsKICAgICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHNvcnRlZEFubm90YXRpb25zID0gW107CiAgICAgICAgbGV0IHBvcHVwQW5ub3RhdGlvbnM7CiAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgICAgICBpZiAoIWFubm90YXRpb24pIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIF9hbm5vdGF0aW9uLlBvcHVwQW5ub3RhdGlvbikgewogICAgICAgICAgICAocG9wdXBBbm5vdGF0aW9ucyB8fD0gW10pLnB1c2goYW5ub3RhdGlvbik7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc29ydGVkQW5ub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBvcHVwQW5ub3RhdGlvbnMpIHsKICAgICAgICAgIHNvcnRlZEFubm90YXRpb25zLnB1c2goLi4ucG9wdXBBbm5vdGF0aW9ucyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzb3J0ZWRBbm5vdGF0aW9uczsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiX3BhcnNlZEFubm90YXRpb25zIiwgcGFyc2VkQW5ub3RhdGlvbnMpOwogIH0KICBnZXQganNBY3Rpb25zKCkgewogICAgY29uc3QgYWN0aW9ucyA9ICgwLCBfY29yZV91dGlscy5jb2xsZWN0QWN0aW9ucykodGhpcy54cmVmLCB0aGlzLnBhZ2VEaWN0LCBfdXRpbC5QYWdlQWN0aW9uRXZlbnRUeXBlKTsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAianNBY3Rpb25zIiwgYWN0aW9ucyk7CiAgfQp9CmV4cG9ydHMuUGFnZSA9IFBhZ2U7CmNvbnN0IFBERl9IRUFERVJfU0lHTkFUVVJFID0gbmV3IFVpbnQ4QXJyYXkoWzB4MjUsIDB4NTAsIDB4NDQsIDB4NDYsIDB4MmRdKTsKY29uc3QgU1RBUlRYUkVGX1NJR05BVFVSRSA9IG5ldyBVaW50OEFycmF5KFsweDczLCAweDc0LCAweDYxLCAweDcyLCAweDc0LCAweDc4LCAweDcyLCAweDY1LCAweDY2XSk7CmNvbnN0IEVORE9CSl9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg2NSwgMHg2ZSwgMHg2NCwgMHg2ZiwgMHg2MiwgMHg2YV0pOwpjb25zdCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyA9IDEwMjQ7CmNvbnN0IEVNUFRZX0ZJTkdFUlBSSU5UID0gIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiOwpmdW5jdGlvbiBmaW5kKHN0cmVhbSwgc2lnbmF0dXJlLCBsaW1pdCA9IDEwMjQsIGJhY2t3YXJkcyA9IGZhbHNlKSB7CiAgY29uc3Qgc2lnbmF0dXJlTGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aDsKICBjb25zdCBzY2FuQnl0ZXMgPSBzdHJlYW0ucGVla0J5dGVzKGxpbWl0KTsKICBjb25zdCBzY2FuTGVuZ3RoID0gc2NhbkJ5dGVzLmxlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDsKICBpZiAoc2Nhbkxlbmd0aCA8PSAwKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmIChiYWNrd2FyZHMpIHsKICAgIGNvbnN0IHNpZ25hdHVyZUVuZCA9IHNpZ25hdHVyZUxlbmd0aCAtIDE7CiAgICBsZXQgcG9zID0gc2NhbkJ5dGVzLmxlbmd0aCAtIDE7CiAgICB3aGlsZSAocG9zID49IHNpZ25hdHVyZUVuZCkgewogICAgICBsZXQgaiA9IDA7CiAgICAgIHdoaWxlIChqIDwgc2lnbmF0dXJlTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgLSBqXSA9PT0gc2lnbmF0dXJlW3NpZ25hdHVyZUVuZCAtIGpdKSB7CiAgICAgICAgaisrOwogICAgICB9CiAgICAgIGlmIChqID49IHNpZ25hdHVyZUxlbmd0aCkgewogICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zIC0gc2lnbmF0dXJlRW5kOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHBvcy0tOwogICAgfQogIH0gZWxzZSB7CiAgICBsZXQgcG9zID0gMDsKICAgIHdoaWxlIChwb3MgPD0gc2Nhbkxlbmd0aCkgewogICAgICBsZXQgaiA9IDA7CiAgICAgIHdoaWxlIChqIDwgc2lnbmF0dXJlTGVuZ3RoICYmIHNjYW5CeXRlc1twb3MgKyBqXSA9PT0gc2lnbmF0dXJlW2pdKSB7CiAgICAgICAgaisrOwogICAgICB9CiAgICAgIGlmIChqID49IHNpZ25hdHVyZUxlbmd0aCkgewogICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHBvcysrOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KY2xhc3MgUERGRG9jdW1lbnQgewogIGNvbnN0cnVjdG9yKHBkZk1hbmFnZXIsIHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5sZW5ndGggPD0gMCkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbigiVGhlIFBERiBmaWxlIGlzIGVtcHR5LCBpLmUuIGl0cyBzaXplIGlzIHplcm8gYnl0ZXMuIik7CiAgICB9CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLnhyZWYgPSBuZXcgX3hyZWYuWFJlZihzdHJlYW0sIHBkZk1hbmFnZXIpOwogICAgdGhpcy5fcGFnZVByb21pc2VzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fdmVyc2lvbiA9IG51bGw7CiAgICBjb25zdCBpZENvdW50ZXJzID0gewogICAgICBmb250OiAwCiAgICB9OwogICAgdGhpcy5fZ2xvYmFsSWRGYWN0b3J5ID0gY2xhc3MgewogICAgICBzdGF0aWMgZ2V0RG9jSWQoKSB7CiAgICAgICAgcmV0dXJuIGBnXyR7cGRmTWFuYWdlci5kb2NJZH1gOwogICAgICB9CiAgICAgIHN0YXRpYyBjcmVhdGVGb250SWQoKSB7CiAgICAgICAgcmV0dXJuIGBmJHsrK2lkQ291bnRlcnMuZm9udH1gOwogICAgICB9CiAgICAgIHN0YXRpYyBjcmVhdGVPYmpJZCgpIHsKICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGNyZWF0ZU9iaklkYCBjYWxsZWQuIik7CiAgICAgIH0KICAgICAgc3RhdGljIGdldFBhZ2VPYmpJZCgpIHsKICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldFBhZ2VPYmpJZGAgY2FsbGVkLiIpOwogICAgICB9CiAgICB9OwogIH0KICBwYXJzZShyZWNvdmVyeU1vZGUpIHsKICAgIHRoaXMueHJlZi5wYXJzZShyZWNvdmVyeU1vZGUpOwogICAgdGhpcy5jYXRhbG9nID0gbmV3IF9jYXRhbG9nLkNhdGFsb2codGhpcy5wZGZNYW5hZ2VyLCB0aGlzLnhyZWYpOwogIH0KICBnZXQgbGluZWFyaXphdGlvbigpIHsKICAgIGxldCBsaW5lYXJpemF0aW9uID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGxpbmVhcml6YXRpb24gPSBfcGFyc2VyLkxpbmVhcml6YXRpb24uY3JlYXRlKHRoaXMuc3RyZWFtKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBpZiAoZXJyIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBlcnI7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLmluZm8pKGVycik7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImxpbmVhcml6YXRpb24iLCBsaW5lYXJpemF0aW9uKTsKICB9CiAgZ2V0IHN0YXJ0WFJlZigpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgbGV0IHN0YXJ0WFJlZiA9IDA7CiAgICBpZiAodGhpcy5saW5lYXJpemF0aW9uKSB7CiAgICAgIHN0cmVhbS5yZXNldCgpOwogICAgICBpZiAoZmluZChzdHJlYW0sIEVORE9CSl9TSUdOQVRVUkUpKSB7CiAgICAgICAgc3RhcnRYUmVmID0gc3RyZWFtLnBvcyArIDYgLSBzdHJlYW0uc3RhcnQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHN0ZXAgPSAxMDI0OwogICAgICBjb25zdCBzdGFydFhSZWZMZW5ndGggPSBTVEFSVFhSRUZfU0lHTkFUVVJFLmxlbmd0aDsKICAgICAgbGV0IGZvdW5kID0gZmFsc2UsCiAgICAgICAgcG9zID0gc3RyZWFtLmVuZDsKICAgICAgd2hpbGUgKCFmb3VuZCAmJiBwb3MgPiAwKSB7CiAgICAgICAgcG9zIC09IHN0ZXAgLSBzdGFydFhSZWZMZW5ndGg7CiAgICAgICAgaWYgKHBvcyA8IDApIHsKICAgICAgICAgIHBvcyA9IDA7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5wb3MgPSBwb3M7CiAgICAgICAgZm91bmQgPSBmaW5kKHN0cmVhbSwgU1RBUlRYUkVGX1NJR05BVFVSRSwgc3RlcCwgdHJ1ZSk7CiAgICAgIH0KICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgc3RyZWFtLnNraXAoOSk7CiAgICAgICAgbGV0IGNoOwogICAgICAgIGRvIHsKICAgICAgICAgIGNoID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgICB9IHdoaWxlICgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkpOwogICAgICAgIGxldCBzdHIgPSAiIjsKICAgICAgICB3aGlsZSAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweDM5KSB7CiAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7CiAgICAgICAgICBjaCA9IHN0cmVhbS5nZXRCeXRlKCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0WFJlZiA9IHBhcnNlSW50KHN0ciwgMTApOwogICAgICAgIGlmIChpc05hTihzdGFydFhSZWYpKSB7CiAgICAgICAgICBzdGFydFhSZWYgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzdGFydFhSZWYiLCBzdGFydFhSZWYpOwogIH0KICBjaGVja0hlYWRlcigpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtOwogICAgc3RyZWFtLnJlc2V0KCk7CiAgICBpZiAoIWZpbmQoc3RyZWFtLCBQREZfSEVBREVSX1NJR05BVFVSRSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RyZWFtLm1vdmVTdGFydCgpOwogICAgc3RyZWFtLnNraXAoUERGX0hFQURFUl9TSUdOQVRVUkUubGVuZ3RoKTsKICAgIGxldCB2ZXJzaW9uID0gIiIsCiAgICAgIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpID4gMHgyMCAmJiB2ZXJzaW9uLmxlbmd0aCA8IDcpIHsKICAgICAgdmVyc2lvbiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIH0KICAgIGlmIChfY29yZV91dGlscy5QREZfVkVSU0lPTl9SRUdFWFAudGVzdCh2ZXJzaW9uKSkgewogICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjsKICAgIH0gZWxzZSB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgSW52YWxpZCBQREYgaGVhZGVyIHZlcnNpb246ICR7dmVyc2lvbn1gKTsKICAgIH0KICB9CiAgcGFyc2VTdGFydFhSZWYoKSB7CiAgICB0aGlzLnhyZWYuc2V0U3RhcnRYUmVmKHRoaXMuc3RhcnRYUmVmKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgbGV0IG51bSA9IDA7CiAgICBpZiAodGhpcy5jYXRhbG9nLmhhc0FjdHVhbE51bVBhZ2VzKSB7CiAgICAgIG51bSA9IHRoaXMuY2F0YWxvZy5udW1QYWdlczsKICAgIH0gZWxzZSBpZiAodGhpcy54ZmFGYWN0b3J5KSB7CiAgICAgIG51bSA9IHRoaXMueGZhRmFjdG9yeS5nZXROdW1QYWdlcygpOwogICAgfSBlbHNlIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHsKICAgICAgbnVtID0gdGhpcy5saW5lYXJpemF0aW9uLm51bVBhZ2VzOwogICAgfSBlbHNlIHsKICAgICAgbnVtID0gdGhpcy5jYXRhbG9nLm51bVBhZ2VzOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJudW1QYWdlcyIsIG51bSk7CiAgfQogIF9oYXNPbmx5RG9jdW1lbnRTaWduYXR1cmVzKGZpZWxkcywgcmVjdXJzaW9uRGVwdGggPSAwKSB7CiAgICBjb25zdCBSRUNVUlNJT05fTElNSVQgPSAxMDsKICAgIGlmICghQXJyYXkuaXNBcnJheShmaWVsZHMpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiBmaWVsZHMuZXZlcnkoZmllbGQgPT4gewogICAgICBmaWVsZCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpZWxkKTsKICAgICAgaWYgKCEoZmllbGQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoZmllbGQuaGFzKCJLaWRzIikpIHsKICAgICAgICBpZiAoKytyZWN1cnNpb25EZXB0aCA+IFJFQ1VSU0lPTl9MSU1JVCkgewogICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJfaGFzT25seURvY3VtZW50U2lnbmF0dXJlczogbWF4aW11bSByZWN1cnNpb24gZGVwdGggcmVhY2hlZCIpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZC5nZXQoIktpZHMiKSwgcmVjdXJzaW9uRGVwdGgpOwogICAgICB9CiAgICAgIGNvbnN0IGlzU2lnbmF0dXJlID0gKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmllbGQuZ2V0KCJGVCIpLCAiU2lnIik7CiAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGZpZWxkLmdldCgiUmVjdCIpOwogICAgICBjb25zdCBpc0ludmlzaWJsZSA9IEFycmF5LmlzQXJyYXkocmVjdGFuZ2xlKSAmJiByZWN0YW5nbGUuZXZlcnkodmFsdWUgPT4gdmFsdWUgPT09IDApOwogICAgICByZXR1cm4gaXNTaWduYXR1cmUgJiYgaXNJbnZpc2libGU7CiAgICB9KTsKICB9CiAgZ2V0IF94ZmFTdHJlYW1zKCkgewogICAgY29uc3QgYWNyb0Zvcm0gPSB0aGlzLmNhdGFsb2cuYWNyb0Zvcm07CiAgICBpZiAoIWFjcm9Gb3JtKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeGZhID0gYWNyb0Zvcm0uZ2V0KCJYRkEiKTsKICAgIGNvbnN0IGVudHJpZXMgPSB7CiAgICAgICJ4ZHA6eGRwIjogIiIsCiAgICAgIHRlbXBsYXRlOiAiIiwKICAgICAgZGF0YXNldHM6ICIiLAogICAgICBjb25maWc6ICIiLAogICAgICBjb25uZWN0aW9uU2V0OiAiIiwKICAgICAgbG9jYWxlU2V0OiAiIiwKICAgICAgc3R5bGVzaGVldDogIiIsCiAgICAgICIveGRwOnhkcCI6ICIiCiAgICB9OwogICAgaWYgKHhmYSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtICYmICF4ZmEuaXNFbXB0eSkgewogICAgICBlbnRyaWVzWyJ4ZHA6eGRwIl0gPSB4ZmE7CiAgICAgIHJldHVybiBlbnRyaWVzOwogICAgfQogICAgaWYgKCFBcnJheS5pc0FycmF5KHhmYSkgfHwgeGZhLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhmYS5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgIGxldCBuYW1lOwogICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgIG5hbWUgPSAieGRwOnhkcCI7CiAgICAgIH0gZWxzZSBpZiAoaSA9PT0gaWkgLSAyKSB7CiAgICAgICAgbmFtZSA9ICIveGRwOnhkcCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9IHhmYVtpXTsKICAgICAgfQogICAgICBpZiAoIWVudHJpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBkYXRhID0gdGhpcy54cmVmLmZldGNoSWZSZWYoeGZhW2kgKyAxXSk7CiAgICAgIGlmICghKGRhdGEgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgfHwgZGF0YS5pc0VtcHR5KSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZW50cmllc1tuYW1lXSA9IGRhdGE7CiAgICB9CiAgICByZXR1cm4gZW50cmllczsKICB9CiAgZ2V0IHhmYURhdGFzZXRzKCkgewogICAgY29uc3Qgc3RyZWFtcyA9IHRoaXMuX3hmYVN0cmVhbXM7CiAgICBpZiAoIXN0cmVhbXMpIHsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ4ZmFEYXRhc2V0cyIsIG51bGwpOwogICAgfQogICAgZm9yIChjb25zdCBrZXkgb2YgWyJkYXRhc2V0cyIsICJ4ZHA6eGRwIl0pIHsKICAgICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1trZXldOwogICAgICBpZiAoIXN0cmVhbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgc3RyID0gKDAsIF91dGlsLnN0cmluZ1RvVVRGOFN0cmluZykoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgICBjb25zdCBkYXRhID0gewogICAgICAgICAgW2tleV06IHN0cgogICAgICAgIH07CiAgICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ4ZmFEYXRhc2V0cyIsIG5ldyBfZGF0YXNldF9yZWFkZXIuRGF0YXNldFJlYWRlcihkYXRhKSk7CiAgICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIEludmFsaWQgdXRmLTggc3RyaW5nLiIpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInhmYURhdGFzZXRzIiwgbnVsbCk7CiAgfQogIGdldCB4ZmFEYXRhKCkgewogICAgY29uc3Qgc3RyZWFtcyA9IHRoaXMuX3hmYVN0cmVhbXM7CiAgICBpZiAoIXN0cmVhbXMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBkYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGZvciAoY29uc3QgW2tleSwgc3RyZWFtXSBvZiBPYmplY3QuZW50cmllcyhzdHJlYW1zKSkgewogICAgICBpZiAoIXN0cmVhbSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgZGF0YVtrZXldID0gKDAsIF91dGlsLnN0cmluZ1RvVVRGOFN0cmluZykoc3RyZWFtLmdldFN0cmluZygpKTsKICAgICAgfSBjYXRjaCAoXykgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiWEZBIC0gSW52YWxpZCB1dGYtOCBzdHJpbmcuIik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXQgeGZhRmFjdG9yeSgpIHsKICAgIGxldCBkYXRhOwogICAgaWYgKHRoaXMucGRmTWFuYWdlci5lbmFibGVYZmEgJiYgdGhpcy5jYXRhbG9nLm5lZWRzUmVuZGVyaW5nICYmIHRoaXMuZm9ybUluZm8uaGFzWGZhICYmICF0aGlzLmZvcm1JbmZvLmhhc0Fjcm9Gb3JtKSB7CiAgICAgIGRhdGEgPSB0aGlzLnhmYURhdGE7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInhmYUZhY3RvcnkiLCBkYXRhID8gbmV3IF9mYWN0b3J5LlhGQUZhY3RvcnkoZGF0YSkgOiBudWxsKTsKICB9CiAgZ2V0IGlzUHVyZVhmYSgpIHsKICAgIHJldHVybiB0aGlzLnhmYUZhY3RvcnkgPyB0aGlzLnhmYUZhY3RvcnkuaXNWYWxpZCgpIDogZmFsc2U7CiAgfQogIGdldCBodG1sRm9yWGZhKCkgewogICAgcmV0dXJuIHRoaXMueGZhRmFjdG9yeSA/IHRoaXMueGZhRmFjdG9yeS5nZXRQYWdlcygpIDogbnVsbDsKICB9CiAgYXN5bmMgbG9hZFhmYUltYWdlcygpIHsKICAgIGNvbnN0IHhmYUltYWdlc0RpY3QgPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygieGZhSW1hZ2VzIik7CiAgICBpZiAoIXhmYUltYWdlc0RpY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qga2V5cyA9IHhmYUltYWdlc0RpY3QuZ2V0S2V5cygpOwogICAgY29uc3Qgb2JqZWN0TG9hZGVyID0gbmV3IF9vYmplY3RfbG9hZGVyLk9iamVjdExvYWRlcih4ZmFJbWFnZXNEaWN0LCBrZXlzLCB0aGlzLnhyZWYpOwogICAgYXdhaXQgb2JqZWN0TG9hZGVyLmxvYWQoKTsKICAgIGNvbnN0IHhmYUltYWdlcyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgY29uc3Qgc3RyZWFtID0geGZhSW1hZ2VzRGljdC5nZXQoa2V5KTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgICAgeGZhSW1hZ2VzLnNldChrZXksIHN0cmVhbS5nZXRCeXRlcygpKTsKICAgICAgfQogICAgfQogICAgdGhpcy54ZmFGYWN0b3J5LnNldEltYWdlcyh4ZmFJbWFnZXMpOwogIH0KICBhc3luYyBsb2FkWGZhRm9udHMoaGFuZGxlciwgdGFzaykgewogICAgY29uc3QgYWNyb0Zvcm0gPSBhd2FpdCB0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYWNyb0Zvcm0iKTsKICAgIGlmICghYWNyb0Zvcm0pIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgYWNyb0Zvcm0uZ2V0QXN5bmMoIkRSIik7CiAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBvYmplY3RMb2FkZXIgPSBuZXcgX29iamVjdF9sb2FkZXIuT2JqZWN0TG9hZGVyKHJlc291cmNlcywgWyJGb250Il0sIHRoaXMueHJlZik7CiAgICBhd2FpdCBvYmplY3RMb2FkZXIubG9hZCgpOwogICAgY29uc3QgZm9udFJlcyA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgIGlmICghKGZvbnRSZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLnBkZk1hbmFnZXIuZXZhbHVhdG9yT3B0aW9ucyk7CiAgICBvcHRpb25zLnVzZVN5c3RlbUZvbnRzID0gZmFsc2U7CiAgICBjb25zdCBwYXJ0aWFsRXZhbHVhdG9yID0gbmV3IF9ldmFsdWF0b3IuUGFydGlhbEV2YWx1YXRvcih7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaGFuZGxlciwKICAgICAgcGFnZUluZGV4OiAtMSwKICAgICAgaWRGYWN0b3J5OiB0aGlzLl9nbG9iYWxJZEZhY3RvcnksCiAgICAgIGZvbnRDYWNoZTogdGhpcy5jYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgYnVpbHRJbkNNYXBDYWNoZTogdGhpcy5jYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogdGhpcy5jYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgb3B0aW9ucwogICAgfSk7CiAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CiAgICBjb25zdCBwZGZGb250cyA9IFtdOwogICAgY29uc3QgaW5pdGlhbFN0YXRlID0gewogICAgICBnZXQgZm9udCgpIHsKICAgICAgICByZXR1cm4gcGRmRm9udHMuYXQoLTEpOwogICAgICB9LAogICAgICBzZXQgZm9udChmb250KSB7CiAgICAgICAgcGRmRm9udHMucHVzaChmb250KTsKICAgICAgfSwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBmb250cyA9IG5ldyBNYXAoKTsKICAgIGZvbnRSZXMuZm9yRWFjaCgoZm9udE5hbWUsIGZvbnQpID0+IHsKICAgICAgZm9udHMuc2V0KGZvbnROYW1lLCBmb250KTsKICAgIH0pOwogICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgIGZvciAoY29uc3QgW2ZvbnROYW1lLCBmb250XSBvZiBmb250cykgewogICAgICBjb25zdCBkZXNjcmlwdG9yID0gZm9udC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CiAgICAgIGlmICghKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBmb250RmFtaWx5ID0gZGVzY3JpcHRvci5nZXQoIkZvbnRGYW1pbHkiKTsKICAgICAgZm9udEZhbWlseSA9IGZvbnRGYW1pbHkucmVwbGFjZUFsbCgvWyBdKyhcZCkvZywgIiQxIik7CiAgICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBkZXNjcmlwdG9yLmdldCgiRm9udFdlaWdodCIpOwogICAgICBjb25zdCBpdGFsaWNBbmdsZSA9IC1kZXNjcmlwdG9yLmdldCgiSXRhbGljQW5nbGUiKTsKICAgICAgY29uc3QgY3NzRm9udEluZm8gPSB7CiAgICAgICAgZm9udEZhbWlseSwKICAgICAgICBmb250V2VpZ2h0LAogICAgICAgIGl0YWxpY0FuZ2xlCiAgICAgIH07CiAgICAgIGlmICghKDAsIF9jb3JlX3V0aWxzLnZhbGlkYXRlQ1NTRm9udCkoY3NzRm9udEluZm8pKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcHJvbWlzZXMucHVzaChwYXJ0aWFsRXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbX3ByaW1pdGl2ZXMuTmFtZS5nZXQoZm9udE5hbWUpLCAxXSwgbnVsbCwgb3BlcmF0b3JMaXN0LCB0YXNrLCBpbml0aWFsU3RhdGUsIG51bGwsIGNzc0ZvbnRJbmZvKS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBsb2FkWGZhRm9udHM6ICIke3JlYXNvbn0iLmApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9KSk7CiAgICB9CiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICBjb25zdCBtaXNzaW5nRm9udHMgPSB0aGlzLnhmYUZhY3Rvcnkuc2V0Rm9udHMocGRmRm9udHMpOwogICAgaWYgKCFtaXNzaW5nRm9udHMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgb3B0aW9ucy5pZ25vcmVFcnJvcnMgPSB0cnVlOwogICAgcHJvbWlzZXMubGVuZ3RoID0gMDsKICAgIHBkZkZvbnRzLmxlbmd0aCA9IDA7CiAgICBjb25zdCByZWFsbHlNaXNzaW5nRm9udHMgPSBuZXcgU2V0KCk7CiAgICBmb3IgKGNvbnN0IG1pc3Npbmcgb2YgbWlzc2luZ0ZvbnRzKSB7CiAgICAgIGlmICghKDAsIF94ZmFfZm9udHMuZ2V0WGZhRm9udE5hbWUpKGAke21pc3Npbmd9LVJlZ3VsYXJgKSkgewogICAgICAgIHJlYWxseU1pc3NpbmdGb250cy5hZGQobWlzc2luZyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChyZWFsbHlNaXNzaW5nRm9udHMuc2l6ZSkgewogICAgICBtaXNzaW5nRm9udHMucHVzaCgiUGRmSlMtRmFsbGJhY2siKTsKICAgIH0KICAgIGZvciAoY29uc3QgbWlzc2luZyBvZiBtaXNzaW5nRm9udHMpIHsKICAgICAgaWYgKHJlYWxseU1pc3NpbmdGb250cy5oYXMobWlzc2luZykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGNvbnN0IGZvbnRJbmZvIG9mIFt7CiAgICAgICAgbmFtZTogIlJlZ3VsYXIiLAogICAgICAgIGZvbnRXZWlnaHQ6IDQwMCwKICAgICAgICBpdGFsaWNBbmdsZTogMAogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkJvbGQiLAogICAgICAgIGZvbnRXZWlnaHQ6IDcwMCwKICAgICAgICBpdGFsaWNBbmdsZTogMAogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkl0YWxpYyIsCiAgICAgICAgZm9udFdlaWdodDogNDAwLAogICAgICAgIGl0YWxpY0FuZ2xlOiAxMgogICAgICB9LCB7CiAgICAgICAgbmFtZTogIkJvbGRJdGFsaWMiLAogICAgICAgIGZvbnRXZWlnaHQ6IDcwMCwKICAgICAgICBpdGFsaWNBbmdsZTogMTIKICAgICAgfV0pIHsKICAgICAgICBjb25zdCBuYW1lID0gYCR7bWlzc2luZ30tJHtmb250SW5mby5uYW1lfWA7CiAgICAgICAgY29uc3QgZGljdCA9ICgwLCBfeGZhX2ZvbnRzLmdldFhmYUZvbnREaWN0KShuYW1lKTsKICAgICAgICBwcm9taXNlcy5wdXNoKHBhcnRpYWxFdmFsdWF0b3IuaGFuZGxlU2V0Rm9udChyZXNvdXJjZXMsIFtfcHJpbWl0aXZlcy5OYW1lLmdldChuYW1lKSwgMV0sIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBkaWN0LCB7CiAgICAgICAgICBmb250RmFtaWx5OiBtaXNzaW5nLAogICAgICAgICAgZm9udFdlaWdodDogZm9udEluZm8uZm9udFdlaWdodCwKICAgICAgICAgIGl0YWxpY0FuZ2xlOiBmb250SW5mby5pdGFsaWNBbmdsZQogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgbG9hZFhmYUZvbnRzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pKTsKICAgICAgfQogICAgfQogICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgdGhpcy54ZmFGYWN0b3J5LmFwcGVuZEZvbnRzKHBkZkZvbnRzLCByZWFsbHlNaXNzaW5nRm9udHMpOwogIH0KICBhc3luYyBzZXJpYWxpemVYZmFEYXRhKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICByZXR1cm4gdGhpcy54ZmFGYWN0b3J5ID8gdGhpcy54ZmFGYWN0b3J5LnNlcmlhbGl6ZURhdGEoYW5ub3RhdGlvblN0b3JhZ2UpIDogbnVsbDsKICB9CiAgZ2V0IHZlcnNpb24oKSB7CiAgICByZXR1cm4gdGhpcy5jYXRhbG9nLnZlcnNpb24gfHwgdGhpcy5fdmVyc2lvbjsKICB9CiAgZ2V0IGZvcm1JbmZvKCkgewogICAgY29uc3QgZm9ybUluZm8gPSB7CiAgICAgIGhhc0ZpZWxkczogZmFsc2UsCiAgICAgIGhhc0Fjcm9Gb3JtOiBmYWxzZSwKICAgICAgaGFzWGZhOiBmYWxzZSwKICAgICAgaGFzU2lnbmF0dXJlczogZmFsc2UKICAgIH07CiAgICBjb25zdCBhY3JvRm9ybSA9IHRoaXMuY2F0YWxvZy5hY3JvRm9ybTsKICAgIGlmICghYWNyb0Zvcm0pIHsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJmb3JtSW5mbyIsIGZvcm1JbmZvKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGNvbnN0IGZpZWxkcyA9IGFjcm9Gb3JtLmdldCgiRmllbGRzIik7CiAgICAgIGNvbnN0IGhhc0ZpZWxkcyA9IEFycmF5LmlzQXJyYXkoZmllbGRzKSAmJiBmaWVsZHMubGVuZ3RoID4gMDsKICAgICAgZm9ybUluZm8uaGFzRmllbGRzID0gaGFzRmllbGRzOwogICAgICBjb25zdCB4ZmEgPSBhY3JvRm9ybS5nZXQoIlhGQSIpOwogICAgICBmb3JtSW5mby5oYXNYZmEgPSBBcnJheS5pc0FycmF5KHhmYSkgJiYgeGZhLmxlbmd0aCA+IDAgfHwgeGZhIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0gJiYgIXhmYS5pc0VtcHR5OwogICAgICBjb25zdCBzaWdGbGFncyA9IGFjcm9Gb3JtLmdldCgiU2lnRmxhZ3MiKTsKICAgICAgY29uc3QgaGFzU2lnbmF0dXJlcyA9ICEhKHNpZ0ZsYWdzICYgMHgxKTsKICAgICAgY29uc3QgaGFzT25seURvY3VtZW50U2lnbmF0dXJlcyA9IGhhc1NpZ25hdHVyZXMgJiYgdGhpcy5faGFzT25seURvY3VtZW50U2lnbmF0dXJlcyhmaWVsZHMpOwogICAgICBmb3JtSW5mby5oYXNBY3JvRm9ybSA9IGhhc0ZpZWxkcyAmJiAhaGFzT25seURvY3VtZW50U2lnbmF0dXJlczsKICAgICAgZm9ybUluZm8uaGFzU2lnbmF0dXJlcyA9IGhhc1NpZ25hdHVyZXM7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKShgQ2Fubm90IGZldGNoIGZvcm0gaW5mb3JtYXRpb246ICIke2V4fSIuYCk7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZvcm1JbmZvIiwgZm9ybUluZm8pOwogIH0KICBnZXQgZG9jdW1lbnRJbmZvKCkgewogICAgY29uc3QgZG9jSW5mbyA9IHsKICAgICAgUERGRm9ybWF0VmVyc2lvbjogdGhpcy52ZXJzaW9uLAogICAgICBMYW5ndWFnZTogdGhpcy5jYXRhbG9nLmxhbmcsCiAgICAgIEVuY3J5cHRGaWx0ZXJOYW1lOiB0aGlzLnhyZWYuZW5jcnlwdCA/IHRoaXMueHJlZi5lbmNyeXB0LmZpbHRlck5hbWUgOiBudWxsLAogICAgICBJc0xpbmVhcml6ZWQ6ICEhdGhpcy5saW5lYXJpemF0aW9uLAogICAgICBJc0Fjcm9Gb3JtUHJlc2VudDogdGhpcy5mb3JtSW5mby5oYXNBY3JvRm9ybSwKICAgICAgSXNYRkFQcmVzZW50OiB0aGlzLmZvcm1JbmZvLmhhc1hmYSwKICAgICAgSXNDb2xsZWN0aW9uUHJlc2VudDogISF0aGlzLmNhdGFsb2cuY29sbGVjdGlvbiwKICAgICAgSXNTaWduYXR1cmVzUHJlc2VudDogdGhpcy5mb3JtSW5mby5oYXNTaWduYXR1cmVzCiAgICB9OwogICAgbGV0IGluZm9EaWN0OwogICAgdHJ5IHsKICAgICAgaW5mb0RpY3QgPSB0aGlzLnhyZWYudHJhaWxlci5nZXQoIkluZm8iKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBpZiAoZXJyIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBlcnI7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLmluZm8pKCJUaGUgZG9jdW1lbnQgaW5mb3JtYXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpOwogICAgfQogICAgaWYgKCEoaW5mb0RpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRvY3VtZW50SW5mbyIsIGRvY0luZm8pOwogICAgfQogICAgZm9yIChjb25zdCBrZXkgb2YgaW5mb0RpY3QuZ2V0S2V5cygpKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gaW5mb0RpY3QuZ2V0KGtleSk7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiVGl0bGUiOgogICAgICAgIGNhc2UgIkF1dGhvciI6CiAgICAgICAgY2FzZSAiU3ViamVjdCI6CiAgICAgICAgY2FzZSAiS2V5d29yZHMiOgogICAgICAgIGNhc2UgIkNyZWF0b3IiOgogICAgICAgIGNhc2UgIlByb2R1Y2VyIjoKICAgICAgICBjYXNlICJDcmVhdGlvbkRhdGUiOgogICAgICAgIGNhc2UgIk1vZERhdGUiOgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgZG9jSW5mb1trZXldID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKSh2YWx1ZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVHJhcHBlZCI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgIGRvY0luZm9ba2V5XSA9IHZhbHVlOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBsZXQgY3VzdG9tVmFsdWU7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKSh2YWx1ZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICAgIGN1c3RvbVZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICAgICAgY3VzdG9tVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY3VzdG9tVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYEJhZCB2YWx1ZSwgZm9yIGN1c3RvbSBrZXkgIiR7a2V5fSIsIGluIEluZm86ICR7dmFsdWV9LmApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghZG9jSW5mby5DdXN0b20pIHsKICAgICAgICAgICAgZG9jSW5mby5DdXN0b20gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgZG9jSW5mby5DdXN0b21ba2V5XSA9IGN1c3RvbVZhbHVlOwogICAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBCYWQgdmFsdWUsIGZvciBrZXkgIiR7a2V5fSIsIGluIEluZm86ICR7dmFsdWV9LmApOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJkb2N1bWVudEluZm8iLCBkb2NJbmZvKTsKICB9CiAgZ2V0IGZpbmdlcnByaW50cygpIHsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlKGRhdGEpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiAmJiBkYXRhLmxlbmd0aCA+IDAgJiYgZGF0YSAhPT0gRU1QVFlfRklOR0VSUFJJTlQ7CiAgICB9CiAgICBmdW5jdGlvbiBoZXhTdHJpbmcoaGFzaCkgewogICAgICBjb25zdCBidWYgPSBbXTsKICAgICAgZm9yIChjb25zdCBudW0gb2YgaGFzaCkgewogICAgICAgIGNvbnN0IGhleCA9IG51bS50b1N0cmluZygxNik7CiAgICAgICAgYnVmLnB1c2goaGV4LnBhZFN0YXJ0KDIsICIwIikpOwogICAgICB9CiAgICAgIHJldHVybiBidWYuam9pbigiIik7CiAgICB9CiAgICBjb25zdCBpZEFycmF5ID0gdGhpcy54cmVmLnRyYWlsZXIuZ2V0KCJJRCIpOwogICAgbGV0IGhhc2hPcmlnaW5hbCwgaGFzaE1vZGlmaWVkOwogICAgaWYgKEFycmF5LmlzQXJyYXkoaWRBcnJheSkgJiYgdmFsaWRhdGUoaWRBcnJheVswXSkpIHsKICAgICAgaGFzaE9yaWdpbmFsID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGlkQXJyYXlbMF0pOwogICAgICBpZiAoaWRBcnJheVsxXSAhPT0gaWRBcnJheVswXSAmJiB2YWxpZGF0ZShpZEFycmF5WzFdKSkgewogICAgICAgIGhhc2hNb2RpZmllZCA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShpZEFycmF5WzFdKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgaGFzaE9yaWdpbmFsID0gKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KSh0aGlzLnN0cmVhbS5nZXRCeXRlUmFuZ2UoMCwgRklOR0VSUFJJTlRfRklSU1RfQllURVMpLCAwLCBGSU5HRVJQUklOVF9GSVJTVF9CWVRFUyk7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZpbmdlcnByaW50cyIsIFtoZXhTdHJpbmcoaGFzaE9yaWdpbmFsKSwgaGFzaE1vZGlmaWVkID8gaGV4U3RyaW5nKGhhc2hNb2RpZmllZCkgOiBudWxsXSk7CiAgfQogIGFzeW5jIF9nZXRMaW5lYXJpemF0aW9uUGFnZShwYWdlSW5kZXgpIHsKICAgIGNvbnN0IHsKICAgICAgY2F0YWxvZywKICAgICAgbGluZWFyaXphdGlvbiwKICAgICAgeHJlZgogICAgfSA9IHRoaXM7CiAgICBjb25zdCByZWYgPSBfcHJpbWl0aXZlcy5SZWYuZ2V0KGxpbmVhcml6YXRpb24ub2JqZWN0TnVtYmVyRmlyc3QsIDApOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gYXdhaXQgeHJlZi5mZXRjaEFzeW5jKHJlZik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgbGV0IHR5cGUgPSBvYmouZ2V0UmF3KCJUeXBlIik7CiAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKSh0eXBlLCAiUGFnZSIpIHx8ICFvYmouaGFzKCJUeXBlIikgJiYgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgICAgaWYgKCFjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VLaWRzQ291bnRDYWNoZS5wdXQocmVmLCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghY2F0YWxvZy5wYWdlSW5kZXhDYWNoZS5oYXMocmVmKSkgewogICAgICAgICAgICBjYXRhbG9nLnBhZ2VJbmRleENhY2hlLnB1dChyZWYsIDApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtvYmosIHJlZl07CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVGhlIExpbmVhcml6YXRpb24gZGljdGlvbmFyeSBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgUGFnZSBkaWN0aW9uYXJ5LiIpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgX2dldExpbmVhcml6YXRpb25QYWdlOiAiJHtyZWFzb24ubWVzc2FnZX0iLmApOwogICAgICByZXR1cm4gY2F0YWxvZy5nZXRQYWdlRGljdChwYWdlSW5kZXgpOwogICAgfQogIH0KICBnZXRQYWdlKHBhZ2VJbmRleCkgewogICAgY29uc3QgY2FjaGVkUHJvbWlzZSA9IHRoaXMuX3BhZ2VQcm9taXNlcy5nZXQocGFnZUluZGV4KTsKICAgIGlmIChjYWNoZWRQcm9taXNlKSB7CiAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlOwogICAgfQogICAgY29uc3QgewogICAgICBjYXRhbG9nLAogICAgICBsaW5lYXJpemF0aW9uLAogICAgICB4ZmFGYWN0b3J5CiAgICB9ID0gdGhpczsKICAgIGxldCBwcm9taXNlOwogICAgaWYgKHhmYUZhY3RvcnkpIHsKICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShbX3ByaW1pdGl2ZXMuRGljdC5lbXB0eSwgbnVsbF0pOwogICAgfSBlbHNlIGlmIChsaW5lYXJpemF0aW9uPy5wYWdlRmlyc3QgPT09IHBhZ2VJbmRleCkgewogICAgICBwcm9taXNlID0gdGhpcy5fZ2V0TGluZWFyaXphdGlvblBhZ2UocGFnZUluZGV4KTsKICAgIH0gZWxzZSB7CiAgICAgIHByb21pc2UgPSBjYXRhbG9nLmdldFBhZ2VEaWN0KHBhZ2VJbmRleCk7CiAgICB9CiAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKChbcGFnZURpY3QsIHJlZl0pID0+IHsKICAgICAgcmV0dXJuIG5ldyBQYWdlKHsKICAgICAgICBwZGZNYW5hZ2VyOiB0aGlzLnBkZk1hbmFnZXIsCiAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgIHBhZ2VJbmRleCwKICAgICAgICBwYWdlRGljdCwKICAgICAgICByZWYsCiAgICAgICAgZ2xvYmFsSWRGYWN0b3J5OiB0aGlzLl9nbG9iYWxJZEZhY3RvcnksCiAgICAgICAgZm9udENhY2hlOiBjYXRhbG9nLmZvbnRDYWNoZSwKICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgc3RhbmRhcmRGb250RGF0YUNhY2hlOiBjYXRhbG9nLnN0YW5kYXJkRm9udERhdGFDYWNoZSwKICAgICAgICBnbG9iYWxJbWFnZUNhY2hlOiBjYXRhbG9nLmdsb2JhbEltYWdlQ2FjaGUsCiAgICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICBub25CbGVuZE1vZGVzU2V0OiBjYXRhbG9nLm5vbkJsZW5kTW9kZXNTZXQsCiAgICAgICAgeGZhRmFjdG9yeQogICAgICB9KTsKICAgIH0pOwogICAgdGhpcy5fcGFnZVByb21pc2VzLnNldChwYWdlSW5kZXgsIHByb21pc2UpOwogICAgcmV0dXJuIHByb21pc2U7CiAgfQogIGFzeW5jIGNoZWNrRmlyc3RQYWdlKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBpZiAocmVjb3ZlcnlNb2RlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRyeSB7CiAgICAgIGF3YWl0IHRoaXMuZ2V0UGFnZSgwKTsKICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKSB7CiAgICAgICAgdGhpcy5fcGFnZVByb21pc2VzLmRlbGV0ZSgwKTsKICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXAoKTsKICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICAgIH0KICAgIH0KICB9CiAgYXN5bmMgY2hlY2tMYXN0UGFnZShyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3QgewogICAgICBjYXRhbG9nLAogICAgICBwZGZNYW5hZ2VyCiAgICB9ID0gdGhpczsKICAgIGNhdGFsb2cuc2V0QWN0dWFsTnVtUGFnZXMoKTsKICAgIGxldCBudW1QYWdlczsKICAgIHRyeSB7CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZURvYygieGZhRmFjdG9yeSIpLCBwZGZNYW5hZ2VyLmVuc3VyZURvYygibGluZWFyaXphdGlvbiIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coIm51bVBhZ2VzIildKTsKICAgICAgaWYgKHRoaXMueGZhRmFjdG9yeSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmVhcml6YXRpb24pIHsKICAgICAgICBudW1QYWdlcyA9IHRoaXMubGluZWFyaXphdGlvbi5udW1QYWdlczsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1QYWdlcyA9IGNhdGFsb2cubnVtUGFnZXM7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bVBhZ2VzKSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBjb3VudCBpcyBub3QgYW4gaW50ZWdlci4iKTsKICAgICAgfSBlbHNlIGlmIChudW1QYWdlcyA8PSAxKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMuZ2V0UGFnZShudW1QYWdlcyAtIDEpOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5kZWxldGUobnVtUGFnZXMgLSAxKTsKICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24gJiYgIXJlY292ZXJ5TW9kZSkgewogICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmUGFyc2VFeGNlcHRpb24oKTsKICAgICAgfQogICAgICAoMCwgX3V0aWwud2FybikoYGNoZWNrTGFzdFBhZ2UgLSBpbnZhbGlkIC9QYWdlcyB0cmVlIC9Db3VudDogJHtudW1QYWdlc30uYCk7CiAgICAgIGxldCBwYWdlc1RyZWU7CiAgICAgIHRyeSB7CiAgICAgICAgcGFnZXNUcmVlID0gYXdhaXQgY2F0YWxvZy5nZXRBbGxQYWdlRGljdHMocmVjb3ZlcnlNb2RlKTsKICAgICAgfSBjYXRjaCAocmVhc29uQWxsKSB7CiAgICAgICAgaWYgKHJlYXNvbkFsbCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLlhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZlBhcnNlRXhjZXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGNhdGFsb2cuc2V0QWN0dWFsTnVtUGFnZXMoMSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW3BhZ2VJbmRleCwgW3BhZ2VEaWN0LCByZWZdXSBvZiBwYWdlc1RyZWUpIHsKICAgICAgICBsZXQgcHJvbWlzZTsKICAgICAgICBpZiAocGFnZURpY3QgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVqZWN0KHBhZ2VEaWN0KTsKICAgICAgICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBQYWdlKHsKICAgICAgICAgICAgcGRmTWFuYWdlciwKICAgICAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgICAgIHBhZ2VEaWN0LAogICAgICAgICAgICByZWYsCiAgICAgICAgICAgIGdsb2JhbElkRmFjdG9yeTogdGhpcy5fZ2xvYmFsSWRGYWN0b3J5LAogICAgICAgICAgICBmb250Q2FjaGU6IGNhdGFsb2cuZm9udENhY2hlLAogICAgICAgICAgICBidWlsdEluQ01hcENhY2hlOiBjYXRhbG9nLmJ1aWx0SW5DTWFwQ2FjaGUsCiAgICAgICAgICAgIHN0YW5kYXJkRm9udERhdGFDYWNoZTogY2F0YWxvZy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICAgICAgICAgIGdsb2JhbEltYWdlQ2FjaGU6IGNhdGFsb2cuZ2xvYmFsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgc3lzdGVtRm9udENhY2hlOiBjYXRhbG9nLnN5c3RlbUZvbnRDYWNoZSwKICAgICAgICAgICAgbm9uQmxlbmRNb2Rlc1NldDogY2F0YWxvZy5ub25CbGVuZE1vZGVzU2V0LAogICAgICAgICAgICB4ZmFGYWN0b3J5OiBudWxsCiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BhZ2VQcm9taXNlcy5zZXQocGFnZUluZGV4LCBwcm9taXNlKTsKICAgICAgfQogICAgICBjYXRhbG9nLnNldEFjdHVhbE51bVBhZ2VzKHBhZ2VzVHJlZS5zaXplKTsKICAgIH0KICB9CiAgZm9udEZhbGxiYWNrKGlkLCBoYW5kbGVyKSB7CiAgICByZXR1cm4gdGhpcy5jYXRhbG9nLmZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcik7CiAgfQogIGFzeW5jIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgcmV0dXJuIHRoaXMuY2F0YWxvZyA/IHRoaXMuY2F0YWxvZy5jbGVhbnVwKG1hbnVhbGx5VHJpZ2dlcmVkKSA6ICgwLCBfY2xlYW51cF9oZWxwZXIuY2xlYXJHbG9iYWxDYWNoZXMpKCk7CiAgfQogIF9jb2xsZWN0RmllbGRPYmplY3RzKG5hbWUsIGZpZWxkUmVmLCBwcm9taXNlcykgewogICAgY29uc3QgZmllbGQgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihmaWVsZFJlZik7CiAgICBpZiAoZmllbGQuaGFzKCJUIikpIHsKICAgICAgY29uc3QgcGFydE5hbWUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZpZWxkLmdldCgiVCIpKTsKICAgICAgaWYgKG5hbWUgPT09ICIiKSB7CiAgICAgICAgbmFtZSA9IHBhcnROYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIG5hbWUgPSBgJHtuYW1lfS4ke3BhcnROYW1lfWA7CiAgICAgIH0KICAgIH0KICAgIGlmICghcHJvbWlzZXMuaGFzKG5hbWUpKSB7CiAgICAgIHByb21pc2VzLnNldChuYW1lLCBbXSk7CiAgICB9CiAgICBwcm9taXNlcy5nZXQobmFtZSkucHVzaChfYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGUodGhpcy54cmVmLCBmaWVsZFJlZiwgdGhpcy5wZGZNYW5hZ2VyLCB0aGlzLl9sb2NhbElkRmFjdG9yeSwgdHJ1ZSkudGhlbihhbm5vdGF0aW9uID0+IGFubm90YXRpb24/LmdldEZpZWxkT2JqZWN0KCkpLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBfY29sbGVjdEZpZWxkT2JqZWN0czogIiR7cmVhc29ufSIuYCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSkpOwogICAgaWYgKGZpZWxkLmhhcygiS2lkcyIpKSB7CiAgICAgIGNvbnN0IGtpZHMgPSBmaWVsZC5nZXQoIktpZHMiKTsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIHRoaXMuX2NvbGxlY3RGaWVsZE9iamVjdHMobmFtZSwga2lkLCBwcm9taXNlcyk7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0IGZpZWxkT2JqZWN0cygpIHsKICAgIGlmICghdGhpcy5mb3JtSW5mby5oYXNGaWVsZHMpIHsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJmaWVsZE9iamVjdHMiLCBQcm9taXNlLnJlc29sdmUobnVsbCkpOwogICAgfQogICAgY29uc3QgYWxsRmllbGRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGZpZWxkUHJvbWlzZXMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGZpZWxkUmVmIG9mIHRoaXMuY2F0YWxvZy5hY3JvRm9ybS5nZXQoIkZpZWxkcyIpKSB7CiAgICAgIHRoaXMuX2NvbGxlY3RGaWVsZE9iamVjdHMoIiIsIGZpZWxkUmVmLCBmaWVsZFByb21pc2VzKTsKICAgIH0KICAgIGNvbnN0IGFsbFByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9taXNlc10gb2YgZmllbGRQcm9taXNlcykgewogICAgICBhbGxQcm9taXNlcy5wdXNoKFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZpZWxkcyA9PiB7CiAgICAgICAgZmllbGRzID0gZmllbGRzLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKTsKICAgICAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGFsbEZpZWxkc1tuYW1lXSA9IGZpZWxkczsKICAgICAgICB9CiAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZmllbGRPYmplY3RzIiwgUHJvbWlzZS5hbGwoYWxsUHJvbWlzZXMpLnRoZW4oKCkgPT4gYWxsRmllbGRzKSk7CiAgfQogIGdldCBoYXNKU0FjdGlvbnMoKSB7CiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5wZGZNYW5hZ2VyLmVuc3VyZURvYygiX3BhcnNlSGFzSlNBY3Rpb25zIik7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImhhc0pTQWN0aW9ucyIsIHByb21pc2UpOwogIH0KICBhc3luYyBfcGFyc2VIYXNKU0FjdGlvbnMoKSB7CiAgICBjb25zdCBbY2F0YWxvZ0pzQWN0aW9ucywgZmllbGRPYmplY3RzXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygianNBY3Rpb25zIiksIHRoaXMucGRmTWFuYWdlci5lbnN1cmVEb2MoImZpZWxkT2JqZWN0cyIpXSk7CiAgICBpZiAoY2F0YWxvZ0pzQWN0aW9ucykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChmaWVsZE9iamVjdHMpIHsKICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZmllbGRPYmplY3RzKS5zb21lKGZpZWxkT2JqZWN0ID0+IGZpZWxkT2JqZWN0LnNvbWUob2JqZWN0ID0+IG9iamVjdC5hY3Rpb25zICE9PSBudWxsKSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGdldCBjYWxjdWxhdGlvbk9yZGVySWRzKCkgewogICAgY29uc3QgYWNyb0Zvcm0gPSB0aGlzLmNhdGFsb2cuYWNyb0Zvcm07CiAgICBpZiAoIWFjcm9Gb3JtPy5oYXMoIkNPIikpIHsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjYWxjdWxhdGlvbk9yZGVySWRzIiwgbnVsbCk7CiAgICB9CiAgICBjb25zdCBjYWxjdWxhdGlvbk9yZGVyID0gYWNyb0Zvcm0uZ2V0KCJDTyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KGNhbGN1bGF0aW9uT3JkZXIpIHx8IGNhbGN1bGF0aW9uT3JkZXIubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY2FsY3VsYXRpb25PcmRlcklkcyIsIG51bGwpOwogICAgfQogICAgY29uc3QgaWRzID0gW107CiAgICBmb3IgKGNvbnN0IGlkIG9mIGNhbGN1bGF0aW9uT3JkZXIpIHsKICAgICAgaWYgKGlkIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgaWRzLnB1c2goaWQudG9TdHJpbmcoKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY2FsY3VsYXRpb25PcmRlcklkcyIsIG51bGwpOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjYWxjdWxhdGlvbk9yZGVySWRzIiwgaWRzKTsKICB9Cn0KZXhwb3J0cy5QREZEb2N1bWVudCA9IFBERkRvY3VtZW50OwoKLyoqKi8gfSksCi8qIDEwICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuUG9wdXBBbm5vdGF0aW9uID0gZXhwb3J0cy5NYXJrdXBBbm5vdGF0aW9uID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmFjdG9yeSA9IGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlID0gZXhwb3J0cy5Bbm5vdGF0aW9uID0gdm9pZCAwOwpleHBvcnRzLmdldFF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwp2YXIgX2RlZmF1bHRfYXBwZWFyYW5jZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTEpOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwp2YXIgX3dyaXRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNjYpOwp2YXIgX2Jhc2Vfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKdmFyIF9iaWRpID0gX193X3BkZmpzX3JlcXVpcmVfXyg2MCk7CnZhciBfY2F0YWxvZyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzApOwp2YXIgX2NvbG9yc3BhY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTsKdmFyIF9maWxlX3NwZWMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDczKTsKdmFyIF9vYmplY3RfbG9hZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg3Nik7CnZhciBfb3BlcmF0b3JfbGlzdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjQpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CnZhciBfZmFjdG9yeSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzcpOwpjbGFzcyBBbm5vdGF0aW9uRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZSh4cmVmLCByZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeSwgY29sbGVjdEZpZWxkcykgewogICAgcmV0dXJuIFByb21pc2UuYWxsKFtwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImFjcm9Gb3JtIiksIHBkZk1hbmFnZXIuZW5zdXJlQ2F0YWxvZygiYmFzZVVybCIpLCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImF0dGFjaG1lbnRzIiksIHBkZk1hbmFnZXIuZW5zdXJlRG9jKCJ4ZmFEYXRhc2V0cyIpLCBjb2xsZWN0RmllbGRzID8gdGhpcy5fZ2V0UGFnZUluZGV4KHhyZWYsIHJlZiwgcGRmTWFuYWdlcikgOiAtMV0pLnRoZW4oKFthY3JvRm9ybSwgYmFzZVVybCwgYXR0YWNobWVudHMsIHhmYURhdGFzZXRzLCBwYWdlSW5kZXhdKSA9PiBwZGZNYW5hZ2VyLmVuc3VyZSh0aGlzLCAiX2NyZWF0ZSIsIFt4cmVmLCByZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeSwgYWNyb0Zvcm0sIGF0dGFjaG1lbnRzLCB4ZmFEYXRhc2V0cywgY29sbGVjdEZpZWxkcywgcGFnZUluZGV4XSkpOwogIH0KICBzdGF0aWMgX2NyZWF0ZSh4cmVmLCByZWYsIHBkZk1hbmFnZXIsIGlkRmFjdG9yeSwgYWNyb0Zvcm0sIGF0dGFjaG1lbnRzID0gbnVsbCwgeGZhRGF0YXNldHMsIGNvbGxlY3RGaWVsZHMsIHBhZ2VJbmRleCA9IC0xKSB7CiAgICBjb25zdCBkaWN0ID0geHJlZi5mZXRjaElmUmVmKHJlZik7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IGlkID0gcmVmIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8gcmVmLnRvU3RyaW5nKCkgOiBgYW5ub3RfJHtpZEZhY3RvcnkuY3JlYXRlT2JqSWQoKX1gOwogICAgbGV0IHN1YnR5cGUgPSBkaWN0LmdldCgiU3VidHlwZSIpOwogICAgc3VidHlwZSA9IHN1YnR5cGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lID8gc3VidHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IGFjcm9Gb3JtRGljdCA9IGFjcm9Gb3JtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCA/IGFjcm9Gb3JtIDogX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7CiAgICAgIHhyZWYsCiAgICAgIHJlZiwKICAgICAgZGljdCwKICAgICAgc3VidHlwZSwKICAgICAgaWQsCiAgICAgIHBkZk1hbmFnZXIsCiAgICAgIGFjcm9Gb3JtOiBhY3JvRm9ybURpY3QsCiAgICAgIGF0dGFjaG1lbnRzLAogICAgICB4ZmFEYXRhc2V0cywKICAgICAgY29sbGVjdEZpZWxkcywKICAgICAgbmVlZEFwcGVhcmFuY2VzOiAhY29sbGVjdEZpZWxkcyAmJiBhY3JvRm9ybURpY3QuZ2V0KCJOZWVkQXBwZWFyYW5jZXMiKSA9PT0gdHJ1ZSwKICAgICAgcGFnZUluZGV4LAogICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogcGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICB9OwogICAgc3dpdGNoIChzdWJ0eXBlKSB7CiAgICAgIGNhc2UgIkxpbmsiOgogICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlRleHQiOgogICAgICAgIHJldHVybiBuZXcgVGV4dEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIldpZGdldCI6CiAgICAgICAgbGV0IGZpZWxkVHlwZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CiAgICAgICAgICBkaWN0LAogICAgICAgICAga2V5OiAiRlQiCiAgICAgICAgfSk7CiAgICAgICAgZmllbGRUeXBlID0gZmllbGRUeXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSA/IGZpZWxkVHlwZS5uYW1lIDogbnVsbDsKICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgewogICAgICAgICAgY2FzZSAiVHgiOgogICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQnRuIjoKICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25XaWRnZXRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICAgICAgY2FzZSAiQ2giOgogICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgICBjYXNlICJTaWciOgogICAgICAgICAgICByZXR1cm4gbmV3IFNpZ25hdHVyZVdpZGdldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgICAgfQogICAgICAgICgwLCBfdXRpbC53YXJuKShgVW5pbXBsZW1lbnRlZCB3aWRnZXQgZmllbGQgdHlwZSAiJHtmaWVsZFR5cGV9IiwgYCArICJmYWxsaW5nIGJhY2sgdG8gYmFzZSBmaWVsZCB0eXBlLiIpOwogICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiUG9wdXAiOgogICAgICAgIHJldHVybiBuZXcgUG9wdXBBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJGcmVlVGV4dCI6CiAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkxpbmUiOgogICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlNxdWFyZSI6CiAgICAgICAgcmV0dXJuIG5ldyBTcXVhcmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJDaXJjbGUiOgogICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiUG9seUxpbmUiOgogICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJQb2x5Z29uIjoKICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJDYXJldCI6CiAgICAgICAgcmV0dXJuIG5ldyBDYXJldEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIkluayI6CiAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBjYXNlICJIaWdobGlnaHQiOgogICAgICAgIHJldHVybiBuZXcgSGlnaGxpZ2h0QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiVW5kZXJsaW5lIjoKICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlNxdWlnZ2x5IjoKICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiU3RyaWtlT3V0IjoKICAgICAgICByZXR1cm4gbmV3IFN0cmlrZU91dEFubm90YXRpb24ocGFyYW1ldGVycyk7CiAgICAgIGNhc2UgIlN0YW1wIjoKICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgICAgY2FzZSAiRmlsZUF0dGFjaG1lbnQiOgogICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uKHBhcmFtZXRlcnMpOwogICAgICBkZWZhdWx0OgogICAgICAgIGlmICghY29sbGVjdEZpZWxkcykgewogICAgICAgICAgaWYgKCFzdWJ0eXBlKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiQW5ub3RhdGlvbiBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCAvU3VidHlwZS4iKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVW5pbXBsZW1lbnRlZCBhbm5vdGF0aW9uIHR5cGUgIiR7c3VidHlwZX0iLCBgICsgImZhbGxpbmcgYmFjayB0byBiYXNlIGFubm90YXRpb24uIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbihwYXJhbWV0ZXJzKTsKICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIF9nZXRQYWdlSW5kZXgoeHJlZiwgcmVmLCBwZGZNYW5hZ2VyKSB7CiAgICB0cnkgewogICAgICBjb25zdCBhbm5vdERpY3QgPSBhd2FpdCB4cmVmLmZldGNoSWZSZWZBc3luYyhyZWYpOwogICAgICBpZiAoIShhbm5vdERpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCBwYWdlUmVmID0gYW5ub3REaWN0LmdldFJhdygiUCIpOwogICAgICBpZiAoIShwYWdlUmVmIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSkgewogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICBjb25zdCBwYWdlSW5kZXggPSBhd2FpdCBwZGZNYW5hZ2VyLmVuc3VyZUNhdGFsb2coImdldFBhZ2VJbmRleCIsIFtwYWdlUmVmXSk7CiAgICAgIHJldHVybiBwYWdlSW5kZXg7CiAgICB9IGNhdGNoIChleCkgewogICAgICAoMCwgX3V0aWwud2FybikoYF9nZXRQYWdlSW5kZXg6ICIke2V4fSIuYCk7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIHNhdmVOZXdBbm5vdGF0aW9ucyhldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25zKSB7CiAgICBjb25zdCB4cmVmID0gZXZhbHVhdG9yLnhyZWY7CiAgICBsZXQgYmFzZUZvbnRSZWY7CiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbXTsKICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgc3dpdGNoIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKSB7CiAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDoKICAgICAgICAgIGlmICghYmFzZUZvbnRSZWYpIHsKICAgICAgICAgICAgY29uc3QgYmFzZUZvbnQgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgICAgICAgICAgYmFzZUZvbnQuc2V0KCJCYXNlRm9udCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7CiAgICAgICAgICAgIGJhc2VGb250LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250IikpOwogICAgICAgICAgICBiYXNlRm9udC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVHlwZTEiKSk7CiAgICAgICAgICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpOwogICAgICAgICAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgICAgICAgICAgYmFzZUZvbnRSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICAgICAgICBhd2FpdCAoMCwgX3dyaXRlci53cml0ZU9iamVjdCkoYmFzZUZvbnRSZWYsIGJhc2VGb250LCBidWZmZXIsIG51bGwpOwogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCh7CiAgICAgICAgICAgICAgcmVmOiBiYXNlRm9udFJlZiwKICAgICAgICAgICAgICBkYXRhOiBidWZmZXIuam9pbigiIikKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBwcm9taXNlcy5wdXNoKEZyZWVUZXh0QW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGRlcGVuZGVuY2llcywgewogICAgICAgICAgICBldmFsdWF0b3IsCiAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgIGJhc2VGb250UmVmCiAgICAgICAgICB9KSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGRlcGVuZGVuY2llcykpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gewogICAgICBhbm5vdGF0aW9uczogYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpLAogICAgICBkZXBlbmRlbmNpZXMKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBwcmludE5ld0Fubm90YXRpb25zKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvbnMpIHsKICAgIGlmICghYW5ub3RhdGlvbnMpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB4cmVmID0gZXZhbHVhdG9yLnhyZWY7CiAgICBjb25zdCB7CiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICB9ID0gZXZhbHVhdG9yLm9wdGlvbnM7CiAgICBjb25zdCBwcm9taXNlcyA9IFtdOwogICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgIHN3aXRjaCAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSkgewogICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6CiAgICAgICAgICBwcm9taXNlcy5wdXNoKEZyZWVUZXh0QW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBldmFsdWF0b3IsCiAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkCiAgICAgICAgICB9KSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzoKICAgICAgICAgIHByb21pc2VzLnB1c2goSW5rQW5ub3RhdGlvbi5jcmVhdGVOZXdQcmludEFubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgewogICAgICAgICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZAogICAgICAgICAgfSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgfQp9CmV4cG9ydHMuQW5ub3RhdGlvbkZhY3RvcnkgPSBBbm5vdGF0aW9uRmFjdG9yeTsKZnVuY3Rpb24gZ2V0UmdiQ29sb3IoY29sb3IsIGRlZmF1bHRDb2xvciA9IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKSkgewogIGlmICghQXJyYXkuaXNBcnJheShjb2xvcikpIHsKICAgIHJldHVybiBkZWZhdWx0Q29sb3I7CiAgfQogIGNvbnN0IHJnYkNvbG9yID0gZGVmYXVsdENvbG9yIHx8IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKTsKICBzd2l0Y2ggKGNvbG9yLmxlbmd0aCkgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gbnVsbDsKICAgIGNhc2UgMToKICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOwogICAgICByZXR1cm4gcmdiQ29sb3I7CiAgICBjYXNlIDM6CiAgICAgIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbShjb2xvciwgMCwgcmdiQ29sb3IsIDApOwogICAgICByZXR1cm4gcmdiQ29sb3I7CiAgICBjYXNlIDQ6CiAgICAgIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5jbXlrLmdldFJnYkl0ZW0oY29sb3IsIDAsIHJnYkNvbG9yLCAwKTsKICAgICAgcmV0dXJuIHJnYkNvbG9yOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvcjsKICB9Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3JBcnJheShjb2xvcikgewogIHJldHVybiBBcnJheS5mcm9tKGNvbG9yLCBjID0+IGMgLyAyNTUpOwp9CmZ1bmN0aW9uIGdldFF1YWRQb2ludHMoZGljdCwgcmVjdCkgewogIGNvbnN0IHF1YWRQb2ludHMgPSBkaWN0LmdldEFycmF5KCJRdWFkUG9pbnRzIik7CiAgaWYgKCFBcnJheS5pc0FycmF5KHF1YWRQb2ludHMpIHx8IHF1YWRQb2ludHMubGVuZ3RoID09PSAwIHx8IHF1YWRQb2ludHMubGVuZ3RoICUgOCA+IDApIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBxdWFkUG9pbnRzTGlzdHMgPSBbXTsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBxdWFkUG9pbnRzLmxlbmd0aCAvIDg7IGkgPCBpaTsgaSsrKSB7CiAgICBsZXQgbWluWCA9IEluZmluaXR5LAogICAgICBtYXhYID0gLUluZmluaXR5LAogICAgICBtaW5ZID0gSW5maW5pdHksCiAgICAgIG1heFkgPSAtSW5maW5pdHk7CiAgICBmb3IgKGxldCBqID0gaSAqIDgsIGpqID0gaSAqIDggKyA4OyBqIDwgamo7IGogKz0gMikgewogICAgICBjb25zdCB4ID0gcXVhZFBvaW50c1tqXTsKICAgICAgY29uc3QgeSA9IHF1YWRQb2ludHNbaiArIDFdOwogICAgICBtaW5YID0gTWF0aC5taW4oeCwgbWluWCk7CiAgICAgIG1heFggPSBNYXRoLm1heCh4LCBtYXhYKTsKICAgICAgbWluWSA9IE1hdGgubWluKHksIG1pblkpOwogICAgICBtYXhZID0gTWF0aC5tYXgoeSwgbWF4WSk7CiAgICB9CiAgICBpZiAocmVjdCAhPT0gbnVsbCAmJiAobWluWCA8IHJlY3RbMF0gfHwgbWF4WCA+IHJlY3RbMl0gfHwgbWluWSA8IHJlY3RbMV0gfHwgbWF4WSA+IHJlY3RbM10pKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcXVhZFBvaW50c0xpc3RzLnB1c2goW3sKICAgICAgeDogbWluWCwKICAgICAgeTogbWF4WQogICAgfSwgewogICAgICB4OiBtYXhYLAogICAgICB5OiBtYXhZCiAgICB9LCB7CiAgICAgIHg6IG1pblgsCiAgICAgIHk6IG1pblkKICAgIH0sIHsKICAgICAgeDogbWF4WCwKICAgICAgeTogbWluWQogICAgfV0pOwogIH0KICByZXR1cm4gcXVhZFBvaW50c0xpc3RzOwp9CmZ1bmN0aW9uIGdldFRyYW5zZm9ybU1hdHJpeChyZWN0LCBiYm94LCBtYXRyaXgpIHsKICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBfdXRpbC5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGJib3gsIG1hdHJpeCk7CiAgaWYgKG1pblggPT09IG1heFggfHwgbWluWSA9PT0gbWF4WSkgewogICAgcmV0dXJuIFsxLCAwLCAwLCAxLCByZWN0WzBdLCByZWN0WzFdXTsKICB9CiAgY29uc3QgeFJhdGlvID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIChtYXhYIC0gbWluWCk7CiAgY29uc3QgeVJhdGlvID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIChtYXhZIC0gbWluWSk7CiAgcmV0dXJuIFt4UmF0aW8sIDAsIDAsIHlSYXRpbywgcmVjdFswXSAtIG1pblggKiB4UmF0aW8sIHJlY3RbMV0gLSBtaW5ZICogeVJhdGlvXTsKfQpjbGFzcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuc2V0VGl0bGUoZGljdC5nZXQoIlQiKSk7CiAgICB0aGlzLnNldENvbnRlbnRzKGRpY3QuZ2V0KCJDb250ZW50cyIpKTsKICAgIHRoaXMuc2V0TW9kaWZpY2F0aW9uRGF0ZShkaWN0LmdldCgiTSIpKTsKICAgIHRoaXMuc2V0RmxhZ3MoZGljdC5nZXQoIkYiKSk7CiAgICB0aGlzLnNldFJlY3RhbmdsZShkaWN0LmdldEFycmF5KCJSZWN0IikpOwogICAgdGhpcy5zZXRDb2xvcihkaWN0LmdldEFycmF5KCJDIikpOwogICAgdGhpcy5zZXRCb3JkZXJTdHlsZShkaWN0KTsKICAgIHRoaXMuc2V0QXBwZWFyYW5jZShkaWN0KTsKICAgIHRoaXMuc2V0T3B0aW9uYWxDb250ZW50KGRpY3QpOwogICAgY29uc3QgTUsgPSBkaWN0LmdldCgiTUsiKTsKICAgIHRoaXMuc2V0Qm9yZGVyQW5kQmFja2dyb3VuZENvbG9ycyhNSyk7CiAgICB0aGlzLnNldFJvdGF0aW9uKE1LKTsKICAgIHRoaXMuX3N0cmVhbXMgPSBbXTsKICAgIGlmICh0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuYXBwZWFyYW5jZSk7CiAgICB9CiAgICBjb25zdCBpc0xvY2tlZCA9ICEhKHRoaXMuZmxhZ3MgJiBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5MT0NLRUQpOwogICAgY29uc3QgaXNDb250ZW50TG9ja2VkID0gISEodGhpcy5mbGFncyAmIF91dGlsLkFubm90YXRpb25GbGFnLkxPQ0tFRENPTlRFTlRTKTsKICAgIHRoaXMuZGF0YSA9IHsKICAgICAgYW5ub3RhdGlvbkZsYWdzOiB0aGlzLmZsYWdzLAogICAgICBib3JkZXJTdHlsZTogdGhpcy5ib3JkZXJTdHlsZSwKICAgICAgY29sb3I6IHRoaXMuY29sb3IsCiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNrZ3JvdW5kQ29sb3IsCiAgICAgIGJvcmRlckNvbG9yOiB0aGlzLmJvcmRlckNvbG9yLAogICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbiwKICAgICAgY29udGVudHNPYmo6IHRoaXMuX2NvbnRlbnRzLAogICAgICBoYXNBcHBlYXJhbmNlOiAhIXRoaXMuYXBwZWFyYW5jZSwKICAgICAgaWQ6IHBhcmFtcy5pZCwKICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogdGhpcy5tb2RpZmljYXRpb25EYXRlLAogICAgICByZWN0OiB0aGlzLnJlY3RhbmdsZSwKICAgICAgc3VidHlwZTogcGFyYW1zLnN1YnR5cGUsCiAgICAgIGhhc093bkNhbnZhczogZmFsc2UsCiAgICAgIG5vUm90YXRlOiAhISh0aGlzLmZsYWdzICYgX3V0aWwuQW5ub3RhdGlvbkZsYWcuTk9ST1RBVEUpLAogICAgICBub0hUTUw6IGlzTG9ja2VkICYmIGlzQ29udGVudExvY2tlZAogICAgfTsKICAgIGlmIChwYXJhbXMuY29sbGVjdEZpZWxkcykgewogICAgICBjb25zdCBraWRzID0gZGljdC5nZXQoIktpZHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgICBjb25zdCBraWRJZHMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IGtpZCBvZiBraWRzKSB7CiAgICAgICAgICBpZiAoa2lkIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICAgIGtpZElkcy5wdXNoKGtpZC50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGtpZElkcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgIHRoaXMuZGF0YS5raWRJZHMgPSBraWRJZHM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuZGF0YS5hY3Rpb25zID0gKDAsIF9jb3JlX3V0aWxzLmNvbGxlY3RBY3Rpb25zKSh4cmVmLCBkaWN0LCBfdXRpbC5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKTsKICAgICAgdGhpcy5kYXRhLmZpZWxkTmFtZSA9IHRoaXMuX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KTsKICAgICAgdGhpcy5kYXRhLnBhZ2VJbmRleCA9IHBhcmFtcy5wYWdlSW5kZXg7CiAgICB9CiAgICB0aGlzLl9pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHBhcmFtcy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDsKICAgIHRoaXMuX2ZhbGxiYWNrRm9udERpY3QgPSBudWxsOwogICAgdGhpcy5fbmVlZEFwcGVhcmFuY2VzID0gZmFsc2U7CiAgfQogIF9oYXNGbGFnKGZsYWdzLCBmbGFnKSB7CiAgICByZXR1cm4gISEoZmxhZ3MgJiBmbGFnKTsKICB9CiAgX2lzVmlld2FibGUoZmxhZ3MpIHsKICAgIHJldHVybiAhdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuSU5WSVNJQkxFKSAmJiAhdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuTk9WSUVXKTsKICB9CiAgX2lzUHJpbnRhYmxlKGZsYWdzKSB7CiAgICByZXR1cm4gdGhpcy5faGFzRmxhZyhmbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuUFJJTlQpICYmICF0aGlzLl9oYXNGbGFnKGZsYWdzLCBfdXRpbC5Bbm5vdGF0aW9uRmxhZy5JTlZJU0lCTEUpOwogIH0KICBtdXN0QmVWaWV3ZWQoYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGNvbnN0IGhpZGRlbiA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKT8uaGlkZGVuOwogICAgaWYgKGhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAhaGlkZGVuOwogICAgfQogICAgcmV0dXJuIHRoaXMudmlld2FibGUgJiYgIXRoaXMuX2hhc0ZsYWcodGhpcy5mbGFncywgX3V0aWwuQW5ub3RhdGlvbkZsYWcuSElEREVOKTsKICB9CiAgbXVzdEJlUHJpbnRlZChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgY29uc3QgcHJpbnQgPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnByaW50OwogICAgaWYgKHByaW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHByaW50OwogICAgfQogICAgcmV0dXJuIHRoaXMucHJpbnRhYmxlOwogIH0KICBnZXQgdmlld2FibGUoKSB7CiAgICBpZiAodGhpcy5kYXRhLnF1YWRQb2ludHMgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXMuZmxhZ3MgPT09IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gdGhpcy5faXNWaWV3YWJsZSh0aGlzLmZsYWdzKTsKICB9CiAgZ2V0IHByaW50YWJsZSgpIHsKICAgIGlmICh0aGlzLmRhdGEucXVhZFBvaW50cyA9PT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5mbGFncyA9PT0gMCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdGhpcy5faXNQcmludGFibGUodGhpcy5mbGFncyk7CiAgfQogIF9wYXJzZVN0cmluZ0hlbHBlcihkYXRhKSB7CiAgICBjb25zdCBzdHIgPSB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRhdGEpIDogIiI7CiAgICBjb25zdCBkaXIgPSBzdHIgJiYgKDAsIF9iaWRpLmJpZGkpKHN0cikuZGlyID09PSAicnRsIiA/ICJydGwiIDogImx0ciI7CiAgICByZXR1cm4gewogICAgICBzdHIsCiAgICAgIGRpcgogICAgfTsKICB9CiAgc2V0RGVmYXVsdEFwcGVhcmFuY2UocGFyYW1zKSB7CiAgICBjb25zdCBkZWZhdWx0QXBwZWFyYW5jZSA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CiAgICAgIGRpY3Q6IHBhcmFtcy5kaWN0LAogICAgICBrZXk6ICJEQSIKICAgIH0pIHx8IHBhcmFtcy5hY3JvRm9ybS5nZXQoIkRBIik7CiAgICB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9IHR5cGVvZiBkZWZhdWx0QXBwZWFyYW5jZSA9PT0gInN0cmluZyIgPyBkZWZhdWx0QXBwZWFyYW5jZSA6ICIiOwogICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSA9ICgwLCBfZGVmYXVsdF9hcHBlYXJhbmNlLnBhcnNlRGVmYXVsdEFwcGVhcmFuY2UpKHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKTsKICB9CiAgc2V0VGl0bGUodGl0bGUpIHsKICAgIHRoaXMuX3RpdGxlID0gdGhpcy5fcGFyc2VTdHJpbmdIZWxwZXIodGl0bGUpOwogIH0KICBzZXRDb250ZW50cyhjb250ZW50cykgewogICAgdGhpcy5fY29udGVudHMgPSB0aGlzLl9wYXJzZVN0cmluZ0hlbHBlcihjb250ZW50cyk7CiAgfQogIHNldE1vZGlmaWNhdGlvbkRhdGUobW9kaWZpY2F0aW9uRGF0ZSkgewogICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gdHlwZW9mIG1vZGlmaWNhdGlvbkRhdGUgPT09ICJzdHJpbmciID8gbW9kaWZpY2F0aW9uRGF0ZSA6IG51bGw7CiAgfQogIHNldEZsYWdzKGZsYWdzKSB7CiAgICB0aGlzLmZsYWdzID0gTnVtYmVyLmlzSW50ZWdlcihmbGFncykgJiYgZmxhZ3MgPiAwID8gZmxhZ3MgOiAwOwogIH0KICBoYXNGbGFnKGZsYWcpIHsKICAgIHJldHVybiB0aGlzLl9oYXNGbGFnKHRoaXMuZmxhZ3MsIGZsYWcpOwogIH0KICBzZXRSZWN0YW5nbGUocmVjdGFuZ2xlKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWN0YW5nbGUpICYmIHJlY3RhbmdsZS5sZW5ndGggPT09IDQpIHsKICAgICAgdGhpcy5yZWN0YW5nbGUgPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QocmVjdGFuZ2xlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMucmVjdGFuZ2xlID0gWzAsIDAsIDAsIDBdOwogICAgfQogIH0KICBzZXRDb2xvcihjb2xvcikgewogICAgdGhpcy5jb2xvciA9IGdldFJnYkNvbG9yKGNvbG9yKTsKICB9CiAgc2V0TGluZUVuZGluZ3MobGluZUVuZGluZ3MpIHsKICAgIHRoaXMubGluZUVuZGluZ3MgPSBbIk5vbmUiLCAiTm9uZSJdOwogICAgaWYgKEFycmF5LmlzQXJyYXkobGluZUVuZGluZ3MpICYmIGxpbmVFbmRpbmdzLmxlbmd0aCA9PT0gMikgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgIGNvbnN0IG9iaiA9IGxpbmVFbmRpbmdzW2ldOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICBzd2l0Y2ggKG9iai5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgIk5vbmUiOgogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBjYXNlICJTcXVhcmUiOgogICAgICAgICAgICBjYXNlICJDaXJjbGUiOgogICAgICAgICAgICBjYXNlICJEaWFtb25kIjoKICAgICAgICAgICAgY2FzZSAiT3BlbkFycm93IjoKICAgICAgICAgICAgY2FzZSAiQ2xvc2VkQXJyb3ciOgogICAgICAgICAgICBjYXNlICJCdXR0IjoKICAgICAgICAgICAgY2FzZSAiUk9wZW5BcnJvdyI6CiAgICAgICAgICAgIGNhc2UgIlJDbG9zZWRBcnJvdyI6CiAgICAgICAgICAgIGNhc2UgIlNsYXNoIjoKICAgICAgICAgICAgICB0aGlzLmxpbmVFbmRpbmdzW2ldID0gb2JqLm5hbWU7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICgwLCBfdXRpbC53YXJuKShgSWdub3JpbmcgaW52YWxpZCBsaW5lRW5kaW5nOiAke29ian1gKTsKICAgICAgfQogICAgfQogIH0KICBzZXRSb3RhdGlvbihtaykgewogICAgdGhpcy5yb3RhdGlvbiA9IDA7CiAgICBpZiAobWsgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIGxldCBhbmdsZSA9IG1rLmdldCgiUiIpIHx8IDA7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGFuZ2xlKSAmJiBhbmdsZSAhPT0gMCkgewogICAgICAgIGFuZ2xlICU9IDM2MDsKICAgICAgICBpZiAoYW5nbGUgPCAwKSB7CiAgICAgICAgICBhbmdsZSArPSAzNjA7CiAgICAgICAgfQogICAgICAgIGlmIChhbmdsZSAlIDkwID09PSAwKSB7CiAgICAgICAgICB0aGlzLnJvdGF0aW9uID0gYW5nbGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHNldEJvcmRlckFuZEJhY2tncm91bmRDb2xvcnMobWspIHsKICAgIGlmIChtayBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgdGhpcy5ib3JkZXJDb2xvciA9IGdldFJnYkNvbG9yKG1rLmdldEFycmF5KCJCQyIpLCBudWxsKTsKICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRSZ2JDb2xvcihtay5nZXRBcnJheSgiQkciKSwgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvcmRlckNvbG9yID0gdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwogICAgfQogIH0KICBzZXRCb3JkZXJTdHlsZShib3JkZXJTdHlsZSkgewogICAgdGhpcy5ib3JkZXJTdHlsZSA9IG5ldyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUoKTsKICAgIGlmICghKGJvcmRlclN0eWxlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGJvcmRlclN0eWxlLmhhcygiQlMiKSkgewogICAgICBjb25zdCBkaWN0ID0gYm9yZGVyU3R5bGUuZ2V0KCJCUyIpOwogICAgICBjb25zdCBkaWN0VHlwZSA9IGRpY3QuZ2V0KCJUeXBlIik7CiAgICAgIGlmICghZGljdFR5cGUgfHwgKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZGljdFR5cGUsICJCb3JkZXIiKSkgewogICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoZGljdC5nZXQoIlciKSwgdGhpcy5yZWN0YW5nbGUpOwogICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0U3R5bGUoZGljdC5nZXQoIlMiKSk7CiAgICAgICAgdGhpcy5ib3JkZXJTdHlsZS5zZXREYXNoQXJyYXkoZGljdC5nZXRBcnJheSgiRCIpKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChib3JkZXJTdHlsZS5oYXMoIkJvcmRlciIpKSB7CiAgICAgIGNvbnN0IGFycmF5ID0gYm9yZGVyU3R5bGUuZ2V0QXJyYXkoIkJvcmRlciIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkgJiYgYXJyYXkubGVuZ3RoID49IDMpIHsKICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldEhvcml6b250YWxDb3JuZXJSYWRpdXMoYXJyYXlbMF0pOwogICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0VmVydGljYWxDb3JuZXJSYWRpdXMoYXJyYXlbMV0pOwogICAgICAgIHRoaXMuYm9yZGVyU3R5bGUuc2V0V2lkdGgoYXJyYXlbMl0sIHRoaXMucmVjdGFuZ2xlKTsKICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSA0KSB7CiAgICAgICAgICB0aGlzLmJvcmRlclN0eWxlLnNldERhc2hBcnJheShhcnJheVszXSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJvcmRlclN0eWxlLnNldFdpZHRoKDApOwogICAgfQogIH0KICBzZXRBcHBlYXJhbmNlKGRpY3QpIHsKICAgIHRoaXMuYXBwZWFyYW5jZSA9IG51bGw7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RhdGVzID0gZGljdC5nZXQoIkFQIik7CiAgICBpZiAoIShhcHBlYXJhbmNlU3RhdGVzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZVN0YXRlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoIk4iKTsKICAgIGlmIChub3JtYWxBcHBlYXJhbmNlU3RhdGUgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghKG5vcm1hbEFwcGVhcmFuY2VTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFzID0gZGljdC5nZXQoIkFTIik7CiAgICBpZiAoIShhcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHx8ICFub3JtYWxBcHBlYXJhbmNlU3RhdGUuaGFzKGFzLm5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlU3RhdGUuZ2V0KGFzLm5hbWUpOwogICAgaWYgKGFwcGVhcmFuY2UgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBhcHBlYXJhbmNlOwogICAgfQogIH0KICBzZXRPcHRpb25hbENvbnRlbnQoZGljdCkgewogICAgdGhpcy5vYyA9IG51bGw7CiAgICBjb25zdCBvYyA9IGRpY3QuZ2V0KCJPQyIpOwogICAgaWYgKG9jIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAoMCwgX3V0aWwud2FybikoInNldE9wdGlvbmFsQ29udGVudDogU3VwcG9ydCBmb3IgL05hbWUtZW50cnkgaXMgbm90IGltcGxlbWVudGVkLiIpOwogICAgfSBlbHNlIGlmIChvYyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgdGhpcy5vYyA9IG9jOwogICAgfQogIH0KICBsb2FkUmVzb3VyY2VzKGtleXMsIGFwcGVhcmFuY2UpIHsKICAgIHJldHVybiBhcHBlYXJhbmNlLmRpY3QuZ2V0QXN5bmMoIlJlc291cmNlcyIpLnRoZW4ocmVzb3VyY2VzID0+IHsKICAgICAgaWYgKCFyZXNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIGNvbnN0IG9iamVjdExvYWRlciA9IG5ldyBfb2JqZWN0X2xvYWRlci5PYmplY3RMb2FkZXIocmVzb3VyY2VzLCBrZXlzLCByZXNvdXJjZXMueHJlZik7CiAgICAgIHJldHVybiBvYmplY3RMb2FkZXIubG9hZCgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiByZXNvdXJjZXM7CiAgICAgIH0pOwogICAgfSk7CiAgfQogIGFzeW5jIGdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhOwogICAgbGV0IGFwcGVhcmFuY2UgPSB0aGlzLmFwcGVhcmFuY2U7CiAgICBjb25zdCBpc1VzaW5nT3duQ2FudmFzID0gISEodGhpcy5kYXRhLmhhc093bkNhbnZhcyAmJiBpbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVkpOwogICAgaWYgKCFhcHBlYXJhbmNlKSB7CiAgICAgIGlmICghaXNVc2luZ093bkNhbnZhcykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBvcExpc3Q6IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKSwKICAgICAgICAgIHNlcGFyYXRlRm9ybTogZmFsc2UsCiAgICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgICB9OwogICAgICB9CiAgICAgIGFwcGVhcmFuY2UgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oIiIpOwogICAgICBhcHBlYXJhbmNlLmRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOwogICAgfQogICAgY29uc3QgYXBwZWFyYW5jZURpY3QgPSBhcHBlYXJhbmNlLmRpY3Q7CiAgICBjb25zdCByZXNvdXJjZXMgPSBhd2FpdCB0aGlzLmxvYWRSZXNvdXJjZXMoWyJFeHRHU3RhdGUiLCAiQ29sb3JTcGFjZSIsICJQYXR0ZXJuIiwgIlNoYWRpbmciLCAiWE9iamVjdCIsICJGb250Il0sIGFwcGVhcmFuY2UpOwogICAgY29uc3QgYmJveCA9IGFwcGVhcmFuY2VEaWN0LmdldEFycmF5KCJCQm94IikgfHwgWzAsIDAsIDEsIDFdOwogICAgY29uc3QgbWF0cml4ID0gYXBwZWFyYW5jZURpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGdldFRyYW5zZm9ybU1hdHJpeChkYXRhLnJlY3QsIGJib3gsIG1hdHJpeCk7CiAgICBjb25zdCBvcExpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKHRoaXMub2MpIHsKICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgZXZhbHVhdG9yLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsIG51bGwpOwogICAgfQogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKICAgIH0KICAgIG9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBbZGF0YS5pZCwgZGF0YS5yZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaXNVc2luZ093bkNhbnZhc10pOwogICAgYXdhaXQgZXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdCwKICAgICAgZmFsbGJhY2tGb250RGljdDogdGhpcy5fZmFsbGJhY2tGb250RGljdAogICAgfSk7CiAgICBvcExpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZEFubm90YXRpb24sIFtdKTsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIHRoaXMucmVzZXQoKTsKICAgIHJldHVybiB7CiAgICAgIG9wTGlzdCwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGlzVXNpbmdPd25DYW52YXMKICAgIH07CiAgfQogIGFzeW5jIHNhdmUoZXZhbHVhdG9yLCB0YXNrLCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGdldCBoYXNUZXh0Q29udGVudCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgZXh0cmFjdFRleHRDb250ZW50KGV2YWx1YXRvciwgdGFzaywgdmlld0JveCkgewogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5sb2FkUmVzb3VyY2VzKFsiRXh0R1N0YXRlIiwgIkZvbnQiLCAiUHJvcGVydGllcyIsICJYT2JqZWN0Il0sIHRoaXMuYXBwZWFyYW5jZSk7CiAgICBjb25zdCB0ZXh0ID0gW107CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGNvbnN0IHNpbmsgPSB7CiAgICAgIGRlc2lyZWRTaXplOiBNYXRoLkluZmluaXR5LAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgZW5xdWV1ZShjaHVuaywgc2l6ZSkgewogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjaHVuay5pdGVtcykgewogICAgICAgICAgYnVmZmVyLnB1c2goaXRlbS5zdHIpOwogICAgICAgICAgaWYgKGl0ZW0uaGFzRU9MKSB7CiAgICAgICAgICAgIHRleHQucHVzaChidWZmZXIuam9pbigiIikpOwogICAgICAgICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBhd2FpdCBldmFsdWF0b3IuZ2V0VGV4dENvbnRlbnQoewogICAgICBzdHJlYW06IHRoaXMuYXBwZWFyYW5jZSwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzLAogICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogdHJ1ZSwKICAgICAgc2luaywKICAgICAgdmlld0JveAogICAgfSk7CiAgICB0aGlzLnJlc2V0KCk7CiAgICBpZiAoYnVmZmVyLmxlbmd0aCkgewogICAgICB0ZXh0LnB1c2goYnVmZmVyLmpvaW4oIiIpKTsKICAgIH0KICAgIGlmICh0ZXh0Lmxlbmd0aCA+IDApIHsKICAgICAgdGhpcy5kYXRhLnRleHRDb250ZW50ID0gdGV4dDsKICAgIH0KICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBpZiAodGhpcy5kYXRhLmtpZElkcykgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgICBzdHJva2VDb2xvcjogdGhpcy5kYXRhLmJvcmRlckNvbG9yLAogICAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgICB0eXBlOiAiIiwKICAgICAgICBraWRJZHM6IHRoaXMuZGF0YS5raWRJZHMsCiAgICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvbgogICAgICB9OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIHJlc2V0KCkgewogICAgZm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5fc3RyZWFtcykgewogICAgICBzdHJlYW0ucmVzZXQoKTsKICAgIH0KICB9CiAgX2NvbnN0cnVjdEZpZWxkTmFtZShkaWN0KSB7CiAgICBpZiAoIWRpY3QuaGFzKCJUIikgJiYgIWRpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICAoMCwgX3V0aWwud2FybikoIlVua25vd24gZmllbGQgbmFtZSwgZmFsbGluZyBiYWNrIHRvIGVtcHR5IGZpZWxkIG5hbWUuIik7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmICghZGljdC5oYXMoIlBhcmVudCIpKSB7CiAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUIikpOwogICAgfQogICAgY29uc3QgZmllbGROYW1lID0gW107CiAgICBpZiAoZGljdC5oYXMoIlQiKSkgewogICAgICBmaWVsZE5hbWUudW5zaGlmdCgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRpY3QuZ2V0KCJUIikpKTsKICAgIH0KICAgIGxldCBsb29wRGljdCA9IGRpY3Q7CiAgICBjb25zdCB2aXNpdGVkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldCgpOwogICAgaWYgKGRpY3Qub2JqSWQpIHsKICAgICAgdmlzaXRlZC5wdXQoZGljdC5vYmpJZCk7CiAgICB9CiAgICB3aGlsZSAobG9vcERpY3QuaGFzKCJQYXJlbnQiKSkgewogICAgICBsb29wRGljdCA9IGxvb3BEaWN0LmdldCgiUGFyZW50Iik7CiAgICAgIGlmICghKGxvb3BEaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgfHwgbG9vcERpY3Qub2JqSWQgJiYgdmlzaXRlZC5oYXMobG9vcERpY3Qub2JqSWQpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGxvb3BEaWN0Lm9iaklkKSB7CiAgICAgICAgdmlzaXRlZC5wdXQobG9vcERpY3Qub2JqSWQpOwogICAgICB9CiAgICAgIGlmIChsb29wRGljdC5oYXMoIlQiKSkgewogICAgICAgIGNvbnN0IHQgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGxvb3BEaWN0LmdldCgiVCIpKTsKICAgICAgICBpZiAoIXQuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgICAgICBmaWVsZE5hbWUudW5zaGlmdCh0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaWVsZE5hbWUuam9pbigiLiIpOwogIH0KfQpleHBvcnRzLkFubm90YXRpb24gPSBBbm5vdGF0aW9uOwpjbGFzcyBBbm5vdGF0aW9uQm9yZGVyU3R5bGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy53aWR0aCA9IDE7CiAgICB0aGlzLnN0eWxlID0gX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDsKICAgIHRoaXMuZGFzaEFycmF5ID0gWzNdOwogICAgdGhpcy5ob3Jpem9udGFsQ29ybmVyUmFkaXVzID0gMDsKICAgIHRoaXMudmVydGljYWxDb3JuZXJSYWRpdXMgPSAwOwogIH0KICBzZXRXaWR0aCh3aWR0aCwgcmVjdCA9IFswLCAwLCAwLCAwXSkgewogICAgaWYgKHdpZHRoIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICB0aGlzLndpZHRoID0gMDsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHR5cGVvZiB3aWR0aCA9PT0gIm51bWJlciIpIHsKICAgICAgaWYgKHdpZHRoID4gMCkgewogICAgICAgIGNvbnN0IG1heFdpZHRoID0gKHJlY3RbMl0gLSByZWN0WzBdKSAvIDI7CiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gKHJlY3RbM10gLSByZWN0WzFdKSAvIDI7CiAgICAgICAgaWYgKG1heFdpZHRoID4gMCAmJiBtYXhIZWlnaHQgPiAwICYmICh3aWR0aCA+IG1heFdpZHRoIHx8IHdpZHRoID4gbWF4SGVpZ2h0KSkgewogICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBBbm5vdGF0aW9uQm9yZGVyU3R5bGUuc2V0V2lkdGggLSBpZ25vcmluZyB3aWR0aDogJHt3aWR0aH1gKTsKICAgICAgICAgIHdpZHRoID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgfQogIH0KICBzZXRTdHlsZShzdHlsZSkgewogICAgaWYgKCEoc3R5bGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBzd2l0Y2ggKHN0eWxlLm5hbWUpIHsKICAgICAgY2FzZSAiUyI6CiAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIkQiOgogICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkRBU0hFRDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQiI6CiAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuQkVWRUxFRDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiSSI6CiAgICAgICAgdGhpcy5zdHlsZSA9IF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIlUiOgogICAgICAgIHRoaXMuc3R5bGUgPSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLlVOREVSTElORTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgc2V0RGFzaEFycmF5KGRhc2hBcnJheSwgZm9yY2VTdHlsZSA9IGZhbHNlKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXNoQXJyYXkpICYmIGRhc2hBcnJheS5sZW5ndGggPiAwKSB7CiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTsKICAgICAgbGV0IGFsbFplcm9zID0gdHJ1ZTsKICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRhc2hBcnJheSkgewogICAgICAgIGNvbnN0IHZhbGlkTnVtYmVyID0gK2VsZW1lbnQgPj0gMDsKICAgICAgICBpZiAoIXZhbGlkTnVtYmVyKSB7CiAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPiAwKSB7CiAgICAgICAgICBhbGxaZXJvcyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNWYWxpZCAmJiAhYWxsWmVyb3MpIHsKICAgICAgICB0aGlzLmRhc2hBcnJheSA9IGRhc2hBcnJheTsKICAgICAgICBpZiAoZm9yY2VTdHlsZSkgewogICAgICAgICAgdGhpcy5zZXRTdHlsZShfcHJpbWl0aXZlcy5OYW1lLmdldCgiRCIpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy53aWR0aCA9IDA7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGFzaEFycmF5KSB7CiAgICAgIHRoaXMud2lkdGggPSAwOwogICAgfQogIH0KICBzZXRIb3Jpem9udGFsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLmhvcml6b250YWxDb3JuZXJSYWRpdXMgPSByYWRpdXM7CiAgICB9CiAgfQogIHNldFZlcnRpY2FsQ29ybmVyUmFkaXVzKHJhZGl1cykgewogICAgaWYgKE51bWJlci5pc0ludGVnZXIocmFkaXVzKSkgewogICAgICB0aGlzLnZlcnRpY2FsQ29ybmVyUmFkaXVzID0gcmFkaXVzOwogICAgfQogIH0KfQpleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZTsKY2xhc3MgTWFya3VwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdAogICAgfSA9IHBhcmFtczsKICAgIGlmIChkaWN0LmhhcygiSVJUIikpIHsKICAgICAgY29uc3QgcmF3SVJUID0gZGljdC5nZXRSYXcoIklSVCIpOwogICAgICB0aGlzLmRhdGEuaW5SZXBseVRvID0gcmF3SVJUIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8gcmF3SVJULnRvU3RyaW5nKCkgOiBudWxsOwogICAgICBjb25zdCBydCA9IGRpY3QuZ2V0KCJSVCIpOwogICAgICB0aGlzLmRhdGEucmVwbHlUeXBlID0gcnQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lID8gcnQubmFtZSA6IF91dGlsLkFubm90YXRpb25SZXBseVR5cGUuUkVQTFk7CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLnJlcGx5VHlwZSA9PT0gX3V0aWwuQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkgewogICAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiSVJUIik7CiAgICAgIHRoaXMuc2V0VGl0bGUocGFyZW50LmdldCgiVCIpKTsKICAgICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICAgIHRoaXMuc2V0Q29udGVudHMocGFyZW50LmdldCgiQ29udGVudHMiKSk7CiAgICAgIHRoaXMuZGF0YS5jb250ZW50c09iaiA9IHRoaXMuX2NvbnRlbnRzOwogICAgICBpZiAoIXBhcmVudC5oYXMoIkNyZWF0aW9uRGF0ZSIpKSB7CiAgICAgICAgdGhpcy5kYXRhLmNyZWF0aW9uRGF0ZSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRDcmVhdGlvbkRhdGUocGFyZW50LmdldCgiQ3JlYXRpb25EYXRlIikpOwogICAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKICAgICAgfQogICAgICBpZiAoIXBhcmVudC5oYXMoIk0iKSkgewogICAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50LmdldCgiTSIpKTsKICAgICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IHRoaXMubW9kaWZpY2F0aW9uRGF0ZTsKICAgICAgfQogICAgICB0aGlzLmRhdGEuaGFzUG9wdXAgPSBwYXJlbnQuaGFzKCJQb3B1cCIpOwogICAgICBpZiAoIXBhcmVudC5oYXMoIkMiKSkgewogICAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXRDb2xvcihwYXJlbnQuZ2V0QXJyYXkoIkMiKSk7CiAgICAgICAgdGhpcy5kYXRhLmNvbG9yID0gdGhpcy5jb2xvcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnRpdGxlT2JqID0gdGhpcy5fdGl0bGU7CiAgICAgIHRoaXMuc2V0Q3JlYXRpb25EYXRlKGRpY3QuZ2V0KCJDcmVhdGlvbkRhdGUiKSk7CiAgICAgIHRoaXMuZGF0YS5jcmVhdGlvbkRhdGUgPSB0aGlzLmNyZWF0aW9uRGF0ZTsKICAgICAgdGhpcy5kYXRhLmhhc1BvcHVwID0gZGljdC5oYXMoIlBvcHVwIik7CiAgICAgIGlmICghZGljdC5oYXMoIkMiKSkgewogICAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGlmIChkaWN0LmhhcygiUkMiKSkgewogICAgICB0aGlzLmRhdGEucmljaFRleHQgPSBfZmFjdG9yeS5YRkFGYWN0b3J5LmdldFJpY2hUZXh0QXNIdG1sKGRpY3QuZ2V0KCJSQyIpKTsKICAgIH0KICB9CiAgc2V0Q3JlYXRpb25EYXRlKGNyZWF0aW9uRGF0ZSkgewogICAgdGhpcy5jcmVhdGlvbkRhdGUgPSB0eXBlb2YgY3JlYXRpb25EYXRlID09PSAic3RyaW5nIiA/IGNyZWF0aW9uRGF0ZSA6IG51bGw7CiAgfQogIF9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICB4cmVmLAogICAgZXh0cmEsCiAgICBzdHJva2VDb2xvciwKICAgIGZpbGxDb2xvciwKICAgIGJsZW5kTW9kZSwKICAgIHN0cm9rZUFscGhhLAogICAgZmlsbEFscGhhLAogICAgcG9pbnRzQ2FsbGJhY2sKICB9KSB7CiAgICBsZXQgbWluWCA9IE51bWJlci5NQVhfVkFMVUU7CiAgICBsZXQgbWluWSA9IE51bWJlci5NQVhfVkFMVUU7CiAgICBsZXQgbWF4WCA9IE51bWJlci5NSU5fVkFMVUU7CiAgICBsZXQgbWF4WSA9IE51bWJlci5NSU5fVkFMVUU7CiAgICBjb25zdCBidWZmZXIgPSBbInEiXTsKICAgIGlmIChleHRyYSkgewogICAgICBidWZmZXIucHVzaChleHRyYSk7CiAgICB9CiAgICBpZiAoc3Ryb2tlQ29sb3IpIHsKICAgICAgYnVmZmVyLnB1c2goYCR7c3Ryb2tlQ29sb3JbMF19ICR7c3Ryb2tlQ29sb3JbMV19ICR7c3Ryb2tlQ29sb3JbMl19IFJHYCk7CiAgICB9CiAgICBpZiAoZmlsbENvbG9yKSB7CiAgICAgIGJ1ZmZlci5wdXNoKGAke2ZpbGxDb2xvclswXX0gJHtmaWxsQ29sb3JbMV19ICR7ZmlsbENvbG9yWzJdfSByZ2ApOwogICAgfQogICAgbGV0IHBvaW50c0FycmF5ID0gdGhpcy5kYXRhLnF1YWRQb2ludHM7CiAgICBpZiAoIXBvaW50c0FycmF5KSB7CiAgICAgIHBvaW50c0FycmF5ID0gW1t7CiAgICAgICAgeDogdGhpcy5yZWN0YW5nbGVbMF0sCiAgICAgICAgeTogdGhpcy5yZWN0YW5nbGVbM10KICAgICAgfSwgewogICAgICAgIHg6IHRoaXMucmVjdGFuZ2xlWzJdLAogICAgICAgIHk6IHRoaXMucmVjdGFuZ2xlWzNdCiAgICAgIH0sIHsKICAgICAgICB4OiB0aGlzLnJlY3RhbmdsZVswXSwKICAgICAgICB5OiB0aGlzLnJlY3RhbmdsZVsxXQogICAgICB9LCB7CiAgICAgICAgeDogdGhpcy5yZWN0YW5nbGVbMl0sCiAgICAgICAgeTogdGhpcy5yZWN0YW5nbGVbMV0KICAgICAgfV1dOwogICAgfQogICAgZm9yIChjb25zdCBwb2ludHMgb2YgcG9pbnRzQXJyYXkpIHsKICAgICAgY29uc3QgW21YLCBNWCwgbVksIE1ZXSA9IHBvaW50c0NhbGxiYWNrKGJ1ZmZlciwgcG9pbnRzKTsKICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIG1YKTsKICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIE1YKTsKICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIG1ZKTsKICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIE1ZKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKCJRIik7CiAgICBjb25zdCBmb3JtRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb3JtIikpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShidWZmZXIuam9pbigiICIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW0uZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgZm9ybURpY3Quc2V0KCJGbTAiLCBhcHBlYXJhbmNlU3RyZWFtKTsKICAgIGNvbnN0IGdzRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgaWYgKGJsZW5kTW9kZSkgewogICAgICBnc0RpY3Quc2V0KCJCTSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KGJsZW5kTW9kZSkpOwogICAgfQogICAgaWYgKHR5cGVvZiBzdHJva2VBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiQ0EiLCBzdHJva2VBbHBoYSk7CiAgICB9CiAgICBpZiAodHlwZW9mIGZpbGxBbHBoYSA9PT0gIm51bWJlciIpIHsKICAgICAgZ3NEaWN0LnNldCgiY2EiLCBmaWxsQWxwaGEpOwogICAgfQogICAgY29uc3Qgc3RhdGVEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CiAgICBzdGF0ZURpY3Quc2V0KCJHUzAiLCBnc0RpY3QpOwogICAgY29uc3QgcmVzb3VyY2VzID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CiAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBzdGF0ZURpY3QpOwogICAgcmVzb3VyY2VzLnNldCgiWE9iamVjdCIsIGZvcm1EaWN0KTsKICAgIGNvbnN0IGFwcGVhcmFuY2VEaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBjb25zdCBiYm94ID0gdGhpcy5kYXRhLnJlY3QgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07CiAgICBhcHBlYXJhbmNlRGljdC5zZXQoIkJCb3giLCBiYm94KTsKICAgIHRoaXMuYXBwZWFyYW5jZSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbSgiL0dTMCBncyAvRm0wIERvIik7CiAgICB0aGlzLmFwcGVhcmFuY2UuZGljdCA9IGFwcGVhcmFuY2VEaWN0OwogICAgdGhpcy5fc3RyZWFtcy5wdXNoKHRoaXMuYXBwZWFyYW5jZSwgYXBwZWFyYW5jZVN0cmVhbSk7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBbm5vdGF0aW9uKHhyZWYsIGFubm90YXRpb24sIGRlcGVuZGVuY2llcywgcGFyYW1zKSB7CiAgICBjb25zdCBhbm5vdGF0aW9uUmVmID0geHJlZi5nZXROZXdUZW1wb3JhcnlSZWYoKTsKICAgIGNvbnN0IGFwID0gYXdhaXQgdGhpcy5jcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcyk7CiAgICBjb25zdCBidWZmZXIgPSBbXTsKICAgIGxldCBhbm5vdGF0aW9uRGljdDsKICAgIGlmIChhcCkgewogICAgICBjb25zdCBhcFJlZiA9IHhyZWYuZ2V0TmV3VGVtcG9yYXJ5UmVmKCk7CiAgICAgIGFubm90YXRpb25EaWN0ID0gdGhpcy5jcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgICAgICBhcFJlZgogICAgICB9KTsKICAgICAgY29uc3QgdHJhbnNmb3JtID0geHJlZi5lbmNyeXB0ID8geHJlZi5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShhcFJlZi5udW0sIGFwUmVmLmdlbikgOiBudWxsOwogICAgICBhd2FpdCAoMCwgX3dyaXRlci53cml0ZU9iamVjdCkoYXBSZWYsIGFwLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsKICAgICAgICByZWY6IGFwUmVmLAogICAgICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGFubm90YXRpb25EaWN0ID0gdGhpcy5jcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHt9KTsKICAgIH0KICAgIGJ1ZmZlci5sZW5ndGggPSAwOwogICAgY29uc3QgdHJhbnNmb3JtID0geHJlZi5lbmNyeXB0ID8geHJlZi5lbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybShhbm5vdGF0aW9uUmVmLm51bSwgYW5ub3RhdGlvblJlZi5nZW4pIDogbnVsbDsKICAgIGF3YWl0ICgwLCBfd3JpdGVyLndyaXRlT2JqZWN0KShhbm5vdGF0aW9uUmVmLCBhbm5vdGF0aW9uRGljdCwgYnVmZmVyLCB0cmFuc2Zvcm0pOwogICAgcmV0dXJuIHsKICAgICAgcmVmOiBhbm5vdGF0aW9uUmVmLAogICAgICBkYXRhOiBidWZmZXIuam9pbigiIikKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdQcmludEFubm90YXRpb24oeHJlZiwgYW5ub3RhdGlvbiwgcGFyYW1zKSB7CiAgICBjb25zdCBhcCA9IGF3YWl0IHRoaXMuY3JlYXRlTmV3QXBwZWFyYW5jZVN0cmVhbShhbm5vdGF0aW9uLCB4cmVmLCBwYXJhbXMpOwogICAgY29uc3QgYW5ub3RhdGlvbkRpY3QgPSB0aGlzLmNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgICBhcAogICAgfSk7CiAgICByZXR1cm4gbmV3IHRoaXMucHJvdG90eXBlLmNvbnN0cnVjdG9yKHsKICAgICAgZGljdDogYW5ub3RhdGlvbkRpY3QsCiAgICAgIHhyZWYsCiAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOiBwYXJhbXMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQKICAgIH0pOwogIH0KfQpleHBvcnRzLk1hcmt1cEFubm90YXRpb24gPSBNYXJrdXBBbm5vdGF0aW9uOwpjbGFzcyBXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKICAgIHRoaXMucmVmID0gcGFyYW1zLnJlZjsKICAgIHRoaXMuX25lZWRBcHBlYXJhbmNlcyA9IHBhcmFtcy5uZWVkQXBwZWFyYW5jZXM7CiAgICBkYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUOwogICAgaWYgKGRhdGEuZmllbGROYW1lID09PSB1bmRlZmluZWQpIHsKICAgICAgZGF0YS5maWVsZE5hbWUgPSB0aGlzLl9jb25zdHJ1Y3RGaWVsZE5hbWUoZGljdCk7CiAgICB9CiAgICBpZiAoZGF0YS5hY3Rpb25zID09PSB1bmRlZmluZWQpIHsKICAgICAgZGF0YS5hY3Rpb25zID0gKDAsIF9jb3JlX3V0aWxzLmNvbGxlY3RBY3Rpb25zKSh4cmVmLCBkaWN0LCBfdXRpbC5Bbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlKTsKICAgIH0KICAgIGxldCBmaWVsZFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKICAgICAgZGljdCwKICAgICAga2V5OiAiViIsCiAgICAgIGdldEFycmF5OiB0cnVlCiAgICB9KTsKICAgIGRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShmaWVsZFZhbHVlKTsKICAgIGNvbnN0IGRlZmF1bHRGaWVsZFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKICAgICAgZGljdCwKICAgICAga2V5OiAiRFYiLAogICAgICBnZXRBcnJheTogdHJ1ZQogICAgfSk7CiAgICBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlID0gdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGRlZmF1bHRGaWVsZFZhbHVlKTsKICAgIGlmIChmaWVsZFZhbHVlID09PSB1bmRlZmluZWQgJiYgcGFyYW1zLnhmYURhdGFzZXRzKSB7CiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl90aXRsZS5zdHI7CiAgICAgIGlmIChwYXRoKSB7CiAgICAgICAgdGhpcy5faGFzVmFsdWVGcm9tWEZBID0gdHJ1ZTsKICAgICAgICBkYXRhLmZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlID0gcGFyYW1zLnhmYURhdGFzZXRzLmdldFZhbHVlKHBhdGgpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgIT09IG51bGwpIHsKICAgICAgZGF0YS5maWVsZFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTsKICAgIH0KICAgIGRhdGEuYWx0ZXJuYXRpdmVUZXh0ID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShkaWN0LmdldCgiVFUiKSB8fCAiIik7CiAgICB0aGlzLnNldERlZmF1bHRBcHBlYXJhbmNlKHBhcmFtcyk7CiAgICBkYXRhLmhhc0FwcGVhcmFuY2UgfHw9IHRoaXMuX25lZWRBcHBlYXJhbmNlcyAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmZpZWxkVmFsdWUgIT09IG51bGw7CiAgICBjb25zdCBmaWVsZFR5cGUgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJGVCIKICAgIH0pOwogICAgZGF0YS5maWVsZFR5cGUgPSBmaWVsZFR5cGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lID8gZmllbGRUeXBlLm5hbWUgOiBudWxsOwogICAgY29uc3QgbG9jYWxSZXNvdXJjZXMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0SW5oZXJpdGFibGVQcm9wZXJ0eSkoewogICAgICBkaWN0LAogICAgICBrZXk6ICJEUiIKICAgIH0pOwogICAgY29uc3QgYWNyb0Zvcm1SZXNvdXJjZXMgPSBwYXJhbXMuYWNyb0Zvcm0uZ2V0KCJEUiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVJlc291cmNlcyA9IHRoaXMuYXBwZWFyYW5jZT8uZGljdC5nZXQoIlJlc291cmNlcyIpOwogICAgdGhpcy5fZmllbGRSZXNvdXJjZXMgPSB7CiAgICAgIGxvY2FsUmVzb3VyY2VzLAogICAgICBhY3JvRm9ybVJlc291cmNlcywKICAgICAgYXBwZWFyYW5jZVJlc291cmNlcywKICAgICAgbWVyZ2VkUmVzb3VyY2VzOiBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKICAgICAgICB4cmVmLAogICAgICAgIGRpY3RBcnJheTogW2xvY2FsUmVzb3VyY2VzLCBhcHBlYXJhbmNlUmVzb3VyY2VzLCBhY3JvRm9ybVJlc291cmNlc10sCiAgICAgICAgbWVyZ2VTdWJEaWN0czogdHJ1ZQogICAgICB9KQogICAgfTsKICAgIGRhdGEuZmllbGRGbGFncyA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIkZmIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0YS5maWVsZEZsYWdzKSB8fCBkYXRhLmZpZWxkRmxhZ3MgPCAwKSB7CiAgICAgIGRhdGEuZmllbGRGbGFncyA9IDA7CiAgICB9CiAgICBkYXRhLnJlYWRPbmx5ID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SRUFET05MWSk7CiAgICBkYXRhLnJlcXVpcmVkID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5SRVFVSVJFRCk7CiAgICBkYXRhLmhpZGRlbiA9IHRoaXMuX2hhc0ZsYWcoZGF0YS5hbm5vdGF0aW9uRmxhZ3MsIF91dGlsLkFubm90YXRpb25GbGFnLkhJRERFTik7CiAgfQogIF9kZWNvZGVGb3JtVmFsdWUoZm9ybVZhbHVlKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShmb3JtVmFsdWUpKSB7CiAgICAgIHJldHVybiBmb3JtVmFsdWUuZmlsdGVyKGl0ZW0gPT4gdHlwZW9mIGl0ZW0gPT09ICJzdHJpbmciKS5tYXAoaXRlbSA9PiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGl0ZW0pKTsKICAgIH0gZWxzZSBpZiAoZm9ybVZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICByZXR1cm4gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShmb3JtVmFsdWUubmFtZSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmb3JtVmFsdWUgPT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZvcm1WYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgaGFzRmllbGRGbGFnKGZsYWcpIHsKICAgIHJldHVybiAhISh0aGlzLmRhdGEuZmllbGRGbGFncyAmIGZsYWcpOwogIH0KICBnZXRSb3RhdGlvbk1hdHJpeChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgbGV0IHJvdGF0aW9uID0gYW5ub3RhdGlvblN0b3JhZ2U/LmdldCh0aGlzLmRhdGEuaWQpPy5yb3RhdGlvbjsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gMCkgewogICAgICByZXR1cm4gX3V0aWwuSURFTlRJVFlfTUFUUklYOwogICAgfQogICAgY29uc3Qgd2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdOwogICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXTsKICAgIHJldHVybiAoMCwgX2NvcmVfdXRpbHMuZ2V0Um90YXRpb25NYXRyaXgpKHJvdGF0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKICB9CiAgZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBsZXQgcm90YXRpb24gPSBhbm5vdGF0aW9uU3RvcmFnZT8uZ2V0KHRoaXMuZGF0YS5pZCk/LnJvdGF0aW9uOwogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgaWYgKCF0aGlzLmJhY2tncm91bmRDb2xvciAmJiAhdGhpcy5ib3JkZXJDb2xvcikgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdOwogICAgY29uc3QgcmVjdCA9IHJvdGF0aW9uID09PSAwIHx8IHJvdGF0aW9uID09PSAxODAgPyBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fSByZWAgOiBgMCAwICR7aGVpZ2h0fSAke3dpZHRofSByZWA7CiAgICBsZXQgc3RyID0gIiI7CiAgICBpZiAodGhpcy5iYWNrZ3JvdW5kQ29sb3IpIHsKICAgICAgc3RyID0gYCR7KDAsIF9kZWZhdWx0X2FwcGVhcmFuY2UuZ2V0UGRmQ29sb3IpKHRoaXMuYmFja2dyb3VuZENvbG9yLCB0cnVlKX0gJHtyZWN0fSBmIGA7CiAgICB9CiAgICBpZiAodGhpcy5ib3JkZXJDb2xvcikgewogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMTsKICAgICAgc3RyICs9IGAke2JvcmRlcldpZHRofSB3ICR7KDAsIF9kZWZhdWx0X2FwcGVhcmFuY2UuZ2V0UGRmQ29sb3IpKHRoaXMuYm9yZGVyQ29sb3IsIGZhbHNlKX0gJHtyZWN0fSBTIGA7CiAgICB9CiAgICByZXR1cm4gc3RyOwogIH0KICBhc3luYyBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHJlbmRlckZvcm1zICYmICEodGhpcyBpbnN0YW5jZW9mIFNpZ25hdHVyZVdpZGdldEFubm90YXRpb24pICYmICF0aGlzLmRhdGEubm9IVE1MICYmICF0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3BMaXN0OiBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCksCiAgICAgICAgc2VwYXJhdGVGb3JtOiB0cnVlLAogICAgICAgIHNlcGFyYXRlQ2FudmFzOiBmYWxzZQogICAgICB9OwogICAgfQogICAgaWYgKCF0aGlzLl9oYXNUZXh0KSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5fZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgaWYgKHRoaXMuYXBwZWFyYW5jZSAmJiBjb250ZW50ID09PSBudWxsKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBjb25zdCBvcExpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlIHx8IGNvbnRlbnQgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvcExpc3QsCiAgICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgICBzZXBhcmF0ZUNhbnZhczogZmFsc2UKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IG1hdHJpeCA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKICAgIGNvbnN0IGJib3ggPSBbMCwgMCwgdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXSwgdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXV07CiAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1NYXRyaXgodGhpcy5kYXRhLnJlY3QsIGJib3gsIG1hdHJpeCk7CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKHRoaXMub2MpIHsKICAgICAgb3B0aW9uYWxDb250ZW50ID0gYXdhaXQgZXZhbHVhdG9yLnBhcnNlTWFya2VkQ29udGVudFByb3BzKHRoaXMub2MsIG51bGwpOwogICAgfQogICAgaWYgKG9wdGlvbmFsQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBvcHRpb25hbENvbnRlbnRdKTsKICAgIH0KICAgIG9wTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5Bbm5vdGF0aW9uLCBbdGhpcy5kYXRhLmlkLCB0aGlzLmRhdGEucmVjdCwgdHJhbnNmb3JtLCB0aGlzLmdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKSwgZmFsc2VdKTsKICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShjb250ZW50KTsKICAgIGF3YWl0IGV2YWx1YXRvci5nZXRPcGVyYXRvckxpc3QoewogICAgICBzdHJlYW0sCiAgICAgIHRhc2ssCiAgICAgIHJlc291cmNlczogdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IG9wTGlzdAogICAgfSk7CiAgICBvcExpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZEFubm90YXRpb24sIFtdKTsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICBvcExpc3QuYWRkT3AoX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQsIFtdKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG9wTGlzdCwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICB9OwogIH0KICBfZ2V0TUtEaWN0KHJvdGF0aW9uKSB7CiAgICBjb25zdCBtayA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KG51bGwpOwogICAgaWYgKHJvdGF0aW9uKSB7CiAgICAgIG1rLnNldCgiUiIsIHJvdGF0aW9uKTsKICAgIH0KICAgIGlmICh0aGlzLmJvcmRlckNvbG9yKSB7CiAgICAgIG1rLnNldCgiQkMiLCBnZXRQZGZDb2xvckFycmF5KHRoaXMuYm9yZGVyQ29sb3IpKTsKICAgIH0KICAgIGlmICh0aGlzLmJhY2tncm91bmRDb2xvcikgewogICAgICBtay5zZXQoIkJHIiwgZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmJhY2tncm91bmRDb2xvcikpOwogICAgfQogICAgcmV0dXJuIG1rLnNpemUgPiAwID8gbWsgOiBudWxsOwogIH0KICBhbWVuZFNhdmVkRGljdChhbm5vdGF0aW9uU3RvcmFnZSwgZGljdCkge30KICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2VFbnRyeT8udmFsdWUsCiAgICAgIHJvdGF0aW9uID0gc3RvcmFnZUVudHJ5Py5yb3RhdGlvbjsKICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICBpZiAoIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiByb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmFsdWUgfHw9IHRoaXMuZGF0YS5maWVsZFZhbHVlOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQgJiYgIXRoaXMuX2hhc1ZhbHVlRnJvbVhGQSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWVsZFZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IHRoaXMuZGF0YS5maWVsZFZhbHVlLmxlbmd0aCAmJiB2YWx1ZS5ldmVyeSgoeCwgaSkgPT4geCA9PT0gdGhpcy5kYXRhLmZpZWxkVmFsdWVbaV0pKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgbGV0IGFwcGVhcmFuY2UgPSBudWxsOwogICAgaWYgKCF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpIHsKICAgICAgYXBwZWFyYW5jZSA9IGF3YWl0IHRoaXMuX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUsIGFubm90YXRpb25TdG9yYWdlKTsKICAgICAgaWYgKGFwcGVhcmFuY2UgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIHt9CiAgICBsZXQgbmVlZEFwcGVhcmFuY2VzID0gZmFsc2U7CiAgICBpZiAoYXBwZWFyYW5jZT8ubmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIG5lZWRBcHBlYXJhbmNlcyA9IHRydWU7CiAgICAgIGFwcGVhcmFuY2UgPSBudWxsOwogICAgfQogICAgY29uc3QgewogICAgICB4cmVmCiAgICB9ID0gZXZhbHVhdG9yOwogICAgY29uc3Qgb3JpZ2luYWxEaWN0ID0geHJlZi5mZXRjaElmUmVmKHRoaXMucmVmKTsKICAgIGlmICghKG9yaWdpbmFsRGljdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgZm9yIChjb25zdCBrZXkgb2Ygb3JpZ2luYWxEaWN0LmdldEtleXMoKSkgewogICAgICBpZiAoa2V5ICE9PSAiQVAiKSB7CiAgICAgICAgZGljdC5zZXQoa2V5LCBvcmlnaW5hbERpY3QuZ2V0UmF3KGtleSkpOwogICAgICB9CiAgICB9CiAgICBjb25zdCB4ZmEgPSB7CiAgICAgIHBhdGg6IHRoaXMuZGF0YS5maWVsZE5hbWUsCiAgICAgIHZhbHVlCiAgICB9OwogICAgY29uc3QgZW5jb2RlciA9IHZhbCA9PiB7CiAgICAgIHJldHVybiAoMCwgX2NvcmVfdXRpbHMuaXNBc2NpaSkodmFsKSA/IHZhbCA6ICgwLCBfY29yZV91dGlscy5zdHJpbmdUb1VURjE2U3RyaW5nKSh2YWwsIHRydWUpOwogICAgfTsKICAgIGRpY3Quc2V0KCJWIiwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoZW5jb2RlcikgOiBlbmNvZGVyKHZhbHVlKSk7CiAgICB0aGlzLmFtZW5kU2F2ZWREaWN0KGFubm90YXRpb25TdG9yYWdlLCBkaWN0KTsKICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjb25zdCBlbmNyeXB0ID0geHJlZi5lbmNyeXB0OwogICAgY29uc3Qgb3JpZ2luYWxUcmFuc2Zvcm0gPSBlbmNyeXB0ID8gZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0odGhpcy5yZWYubnVtLCB0aGlzLnJlZi5nZW4pIDogbnVsbDsKICAgIGNvbnN0IGJ1ZmZlciA9IFtdOwogICAgY29uc3QgY2hhbmdlcyA9IFt7CiAgICAgIHJlZjogdGhpcy5yZWYsCiAgICAgIGRhdGE6ICIiLAogICAgICB4ZmEsCiAgICAgIG5lZWRBcHBlYXJhbmNlcwogICAgfV07CiAgICBpZiAoYXBwZWFyYW5jZSAhPT0gbnVsbCkgewogICAgICBjb25zdCBuZXdSZWYgPSB4cmVmLmdldE5ld1RlbXBvcmFyeVJlZigpOwogICAgICBjb25zdCBBUCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgICBkaWN0LnNldCgiQVAiLCBBUCk7CiAgICAgIEFQLnNldCgiTiIsIG5ld1JlZik7CiAgICAgIGxldCBuZXdUcmFuc2Zvcm0gPSBudWxsOwogICAgICBpZiAoZW5jcnlwdCkgewogICAgICAgIG5ld1RyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKG5ld1JlZi5udW0sIG5ld1JlZi5nZW4pOwogICAgICB9CiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dldFNhdmVGaWVsZFJlc291cmNlcyh4cmVmKTsKICAgICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbSA9IG5ldyBfc3RyZWFtLlN0cmluZ1N0cmVhbShhcHBlYXJhbmNlKTsKICAgICAgY29uc3QgYXBwZWFyYW5jZURpY3QgPSBhcHBlYXJhbmNlU3RyZWFtLmRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZvcm0iKSk7CiAgICAgIGFwcGVhcmFuY2VEaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgICAgYXBwZWFyYW5jZURpY3Quc2V0KCJCQm94IiwgWzAsIDAsIHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF0sIHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV1dKTsKICAgICAgY29uc3Qgcm90YXRpb25NYXRyaXggPSB0aGlzLmdldFJvdGF0aW9uTWF0cml4KGFubm90YXRpb25TdG9yYWdlKTsKICAgICAgaWYgKHJvdGF0aW9uTWF0cml4ICE9PSBfdXRpbC5JREVOVElUWV9NQVRSSVgpIHsKICAgICAgICBhcHBlYXJhbmNlRGljdC5zZXQoIk1hdHJpeCIsIHJvdGF0aW9uTWF0cml4KTsKICAgICAgfQogICAgICBhd2FpdCAoMCwgX3dyaXRlci53cml0ZU9iamVjdCkobmV3UmVmLCBhcHBlYXJhbmNlU3RyZWFtLCBidWZmZXIsIG5ld1RyYW5zZm9ybSk7CiAgICAgIGNoYW5nZXMucHVzaCh7CiAgICAgICAgcmVmOiBuZXdSZWYsCiAgICAgICAgZGF0YTogYnVmZmVyLmpvaW4oIiIpLAogICAgICAgIHhmYTogbnVsbCwKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IGZhbHNlCiAgICAgIH0pOwogICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgIH0KICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHsoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTsKICAgIGF3YWl0ICgwLCBfd3JpdGVyLndyaXRlT2JqZWN0KSh0aGlzLnJlZiwgZGljdCwgYnVmZmVyLCBvcmlnaW5hbFRyYW5zZm9ybSk7CiAgICBjaGFuZ2VzWzBdLmRhdGEgPSBidWZmZXIuam9pbigiIik7CiAgICByZXR1cm4gY2hhbmdlczsKICB9CiAgYXN5bmMgX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBjb25zdCBpc1Bhc3N3b3JkID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCk7CiAgICBpZiAoaXNQYXNzd29yZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IGFubm90YXRpb25TdG9yYWdlPy5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGxldCB2YWx1ZSwgcm90YXRpb247CiAgICBpZiAoc3RvcmFnZUVudHJ5KSB7CiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5LmZvcm1hdHRlZFZhbHVlIHx8IHN0b3JhZ2VFbnRyeS52YWx1ZTsKICAgICAgcm90YXRpb24gPSBzdG9yYWdlRW50cnkucm90YXRpb247CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICF0aGlzLl9uZWVkQXBwZWFyYW5jZXMpIHsKICAgICAgaWYgKCF0aGlzLl9oYXNWYWx1ZUZyb21YRkEgfHwgdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31RIEVNQ2A7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgdmFsdWUgPSB2YWx1ZVswXTsKICAgIH0KICAgICgwLCBfdXRpbC5hc3NlcnQpKHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIsICJFeHBlY3RlZCBgdmFsdWVgIHRvIGJlIGEgc3RyaW5nLiIpOwogICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7CiAgICBpZiAodGhpcy5kYXRhLmNvbWJvKSB7CiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZGF0YS5vcHRpb25zLmZpbmQoKHsKICAgICAgICBleHBvcnRWYWx1ZQogICAgICB9KSA9PiB2YWx1ZSA9PT0gZXhwb3J0VmFsdWUpOwogICAgICB2YWx1ZSA9IG9wdGlvbj8uZGlzcGxheVZhbHVlIHx8IHZhbHVlOwogICAgfQogICAgaWYgKHZhbHVlID09PSAiIikgewogICAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31RIEVNQ2A7CiAgICB9CiAgICBpZiAocm90YXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICByb3RhdGlvbiA9IHRoaXMucm90YXRpb247CiAgICB9CiAgICBsZXQgbGluZUNvdW50ID0gLTE7CiAgICBsZXQgbGluZXM7CiAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkgewogICAgICBsaW5lcyA9IHZhbHVlLnNwbGl0KC9cclxuP3xcbi8pLm1hcChsaW5lID0+IGxpbmUubm9ybWFsaXplKCJORkMiKSk7CiAgICAgIGxpbmVDb3VudCA9IGxpbmVzLmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIGxpbmVzID0gW3ZhbHVlLnJlcGxhY2UoL1xyXG4/fFxuLywgIiIpLm5vcm1hbGl6ZSgiTkZDIildOwogICAgfQogICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSAxOwogICAgY29uc3QgZGVmYXVsdEhQYWRkaW5nID0gMjsKICAgIGxldCB0b3RhbEhlaWdodCA9IHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV07CiAgICBsZXQgdG90YWxXaWR0aCA9IHRoaXMuZGF0YS5yZWN0WzJdIC0gdGhpcy5kYXRhLnJlY3RbMF07CiAgICBpZiAocm90YXRpb24gPT09IDkwIHx8IHJvdGF0aW9uID09PSAyNzApIHsKICAgICAgW3RvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0XSA9IFt0b3RhbEhlaWdodCwgdG90YWxXaWR0aF07CiAgICB9CiAgICBpZiAoIXRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEgPSAoMCwgX2RlZmF1bHRfYXBwZWFyYW5jZS5wYXJzZURlZmF1bHRBcHBlYXJhbmNlKSh0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9ICIvSGVsdmV0aWNhIDAgVGYgMCBnIik7CiAgICB9CiAgICBsZXQgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSwgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTsKICAgIGxldCBkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHQ7CiAgICBjb25zdCBlbmNvZGVkTGluZXMgPSBbXTsKICAgIGxldCBlbmNvZGluZ0Vycm9yID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpOwogICAgICBpZiAoZW5jb2RlZFN0cmluZy5sZW5ndGggPiAxKSB7CiAgICAgICAgZW5jb2RpbmdFcnJvciA9IHRydWU7CiAgICAgIH0KICAgICAgZW5jb2RlZExpbmVzLnB1c2goZW5jb2RlZFN0cmluZy5qb2luKCIiKSk7CiAgICB9CiAgICBpZiAoZW5jb2RpbmdFcnJvciAmJiBpbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlNBVkUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBuZWVkQXBwZWFyYW5jZXM6IHRydWUKICAgICAgfTsKICAgIH0KICAgIGlmIChlbmNvZGluZ0Vycm9yICYmIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmRhdGEuY29tYiA/ICJtb25vc3BhY2UiIDogInNhbnMtc2VyaWYiOwogICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgX2RlZmF1bHRfYXBwZWFyYW5jZS5GYWtlVW5pY29kZUZvbnQoZXZhbHVhdG9yLnhyZWYsIGZvbnRGYW1pbHkpOwogICAgICBjb25zdCByZXNvdXJjZXMgPSBmYWtlVW5pY29kZUZvbnQuY3JlYXRlRm9udFJlc291cmNlcyhsaW5lcy5qb2luKCIiKSk7CiAgICAgIGNvbnN0IG5ld0ZvbnQgPSByZXNvdXJjZXMuZ2V0UmF3KCJGb250Iik7CiAgICAgIGlmICh0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMuaGFzKCJGb250IikpIHsKICAgICAgICBjb25zdCBvbGRGb250ID0gdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgICAgIGZvciAoY29uc3Qga2V5IG9mIG5ld0ZvbnQuZ2V0S2V5cygpKSB7CiAgICAgICAgICBvbGRGb250LnNldChrZXksIG5ld0ZvbnQuZ2V0UmF3KGtleSkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9maWVsZFJlc291cmNlcy5tZXJnZWRSZXNvdXJjZXMuc2V0KCJGb250IiwgbmV3Rm9udCk7CiAgICAgIH0KICAgICAgY29uc3QgZm9udE5hbWUgPSBmYWtlVW5pY29kZUZvbnQuZm9udE5hbWUubmFtZTsKICAgICAgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgewogICAgICAgIGZvbnROYW1lLAogICAgICAgIGZvbnRTaXplOiAwCiAgICAgIH0sIHJlc291cmNlcyk7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVuY29kZWRMaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgZW5jb2RlZExpbmVzW2ldID0gKDAsIF9jb3JlX3V0aWxzLnN0cmluZ1RvVVRGMTZTdHJpbmcpKGxpbmVzW2ldKTsKICAgICAgfQogICAgICBjb25zdCBzYXZlZERlZmF1bHRBcHBlYXJhbmNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhKTsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZSA9IDA7CiAgICAgIHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGEuZm9udE5hbWUgPSBmb250TmFtZTsKICAgICAgW2RlZmF1bHRBcHBlYXJhbmNlLCBmb250U2l6ZSwgbGluZUhlaWdodF0gPSB0aGlzLl9jb21wdXRlRm9udFNpemUodG90YWxIZWlnaHQgLSAyICogZGVmYXVsdFBhZGRpbmcsIHRvdGFsV2lkdGggLSAyICogZGVmYXVsdEhQYWRkaW5nLCB2YWx1ZSwgZm9udCwgbGluZUNvdW50KTsKICAgICAgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSA9IHNhdmVkRGVmYXVsdEFwcGVhcmFuY2U7CiAgICB9IGVsc2UgewogICAgICBpZiAoIXRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJfZ2V0QXBwZWFyYW5jZTogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgICB9CiAgICAgIFtkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemUsIGxpbmVIZWlnaHRdID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKHRvdGFsSGVpZ2h0IC0gMiAqIGRlZmF1bHRQYWRkaW5nLCB0b3RhbFdpZHRoIC0gMiAqIGRlZmF1bHRIUGFkZGluZywgdmFsdWUsIGZvbnQsIGxpbmVDb3VudCk7CiAgICB9CiAgICBsZXQgZGVzY2VudCA9IGZvbnQuZGVzY2VudDsKICAgIGlmIChpc05hTihkZXNjZW50KSkgewogICAgICBkZXNjZW50ID0gX3V0aWwuQkFTRUxJTkVfRkFDVE9SICogbGluZUhlaWdodDsKICAgIH0gZWxzZSB7CiAgICAgIGRlc2NlbnQgPSBNYXRoLm1heChfdXRpbC5CQVNFTElORV9GQUNUT1IgKiBsaW5lSGVpZ2h0LCBNYXRoLmFicyhkZXNjZW50KSAqIGZvbnRTaXplKTsKICAgIH0KICAgIGNvbnN0IGRlZmF1bHRWUGFkZGluZyA9IE1hdGgubWluKE1hdGguZmxvb3IoKHRvdGFsSGVpZ2h0IC0gZm9udFNpemUpIC8gMiksIGRlZmF1bHRQYWRkaW5nKTsKICAgIGNvbnN0IGFsaWdubWVudCA9IHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50OwogICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldE11bHRpbGluZUFwcGVhcmFuY2UoZGVmYXVsdEFwcGVhcmFuY2UsIGVuY29kZWRMaW5lcywgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIHRvdGFsSGVpZ2h0LCBhbGlnbm1lbnQsIGRlZmF1bHRIUGFkZGluZywgZGVmYXVsdFZQYWRkaW5nLCBkZXNjZW50LCBsaW5lSGVpZ2h0LCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHsKICAgICAgcmV0dXJuIHRoaXMuX2dldENvbWJBcHBlYXJhbmNlKGRlZmF1bHRBcHBlYXJhbmNlLCBmb250LCBlbmNvZGVkTGluZXNbMF0sIGZvbnRTaXplLCB0b3RhbFdpZHRoLCB0b3RhbEhlaWdodCwgZGVmYXVsdEhQYWRkaW5nLCBkZWZhdWx0VlBhZGRpbmcsIGRlc2NlbnQsIGxpbmVIZWlnaHQsIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBkZWZhdWx0VlBhZGRpbmcgKyBkZXNjZW50OwogICAgaWYgKGFsaWdubWVudCA9PT0gMCB8fCBhbGlnbm1lbnQgPiAyKSB7CiAgICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoZGVmYXVsdEhQYWRkaW5nKX0gJHsoMCwgX2NvcmVfdXRpbHMubnVtYmVyVG9TdHJpbmcpKGJvdHRvbVBhZGRpbmcpfSBUbSAoJHsoMCwgX2NvcmVfdXRpbHMuZXNjYXBlU3RyaW5nKShlbmNvZGVkTGluZXNbMF0pfSkgVGpgICsgIiBFVCBRIEVNQyI7CiAgICB9CiAgICBjb25zdCBwcmV2SW5mbyA9IHsKICAgICAgc2hpZnQ6IDAKICAgIH07CiAgICBjb25zdCByZW5kZXJlZFRleHQgPSB0aGlzLl9yZW5kZXJUZXh0KGVuY29kZWRMaW5lc1swXSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgcHJldkluZm8sIGRlZmF1bHRIUGFkZGluZywgYm90dG9tUGFkZGluZyk7CiAgICByZXR1cm4gYC9UeCBCTUMgcSAke2NvbG9yc31CVCBgICsgZGVmYXVsdEFwcGVhcmFuY2UgKyBgIDEgMCAwIDEgMCAwIFRtICR7cmVuZGVyZWRUZXh0fWAgKyAiIEVUIFEgRU1DIjsKICB9CiAgc3RhdGljIGFzeW5jIF9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIGFwcGVhcmFuY2VEYXRhLCByZXNvdXJjZXMpIHsKICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsKICAgICAgZm9udDogbnVsbCwKICAgICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCB7CiAgICAgIGZvbnROYW1lLAogICAgICBmb250U2l6ZQogICAgfSA9IGFwcGVhcmFuY2VEYXRhOwogICAgYXdhaXQgZXZhbHVhdG9yLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBbZm9udE5hbWUgJiYgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoZm9udE5hbWUpLCBmb250U2l6ZV0sIG51bGwsIG9wZXJhdG9yTGlzdCwgdGFzaywgaW5pdGlhbFN0YXRlLCBudWxsKTsKICAgIHJldHVybiBpbml0aWFsU3RhdGUuZm9udDsKICB9CiAgX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSB7CiAgICByZXR1cm4gZm9udC5jaGFyc1RvR2x5cGhzKHRleHQpLnJlZHVjZSgod2lkdGgsIGdseXBoKSA9PiB3aWR0aCArIGdseXBoLndpZHRoLCAwKSAvIDEwMDA7CiAgfQogIF9jb21wdXRlRm9udFNpemUoaGVpZ2h0LCB3aWR0aCwgdGV4dCwgZm9udCwgbGluZUNvdW50KSB7CiAgICBsZXQgewogICAgICBmb250U2l6ZQogICAgfSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE7CiAgICBsZXQgbGluZUhlaWdodCA9IChmb250U2l6ZSB8fCAxMikgKiBfdXRpbC5MSU5FX0ZBQ1RPUiwKICAgICAgbnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQoaGVpZ2h0IC8gbGluZUhlaWdodCk7CiAgICBpZiAoIWZvbnRTaXplKSB7CiAgICAgIGNvbnN0IHJvdW5kV2l0aFR3b0RpZ2l0cyA9IHggPT4gTWF0aC5mbG9vcih4ICogMTAwKSAvIDEwMDsKICAgICAgaWYgKGxpbmVDb3VudCA9PT0gLTEpIHsKICAgICAgICBjb25zdCB0ZXh0V2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7CiAgICAgICAgZm9udFNpemUgPSByb3VuZFdpdGhUd29EaWdpdHMoTWF0aC5taW4oaGVpZ2h0IC8gX3V0aWwuTElORV9GQUNUT1IsIHRleHRXaWR0aCA+IHdpZHRoID8gd2lkdGggLyB0ZXh0V2lkdGggOiBJbmZpbml0eSkpOwogICAgICAgIG51bWJlck9mTGluZXMgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXHJcbj98XG4vKTsKICAgICAgICBjb25zdCBjYWNoZWRMaW5lcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgY29uc3QgZW5jb2RlZCA9IGZvbnQuZW5jb2RlU3RyaW5nKGxpbmUpLmpvaW4oIiIpOwogICAgICAgICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWQpOwogICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZm9udC5nZXRDaGFyUG9zaXRpb25zKGVuY29kZWQpOwogICAgICAgICAgY2FjaGVkTGluZXMucHVzaCh7CiAgICAgICAgICAgIGxpbmU6IGVuY29kZWQsCiAgICAgICAgICAgIGdseXBocywKICAgICAgICAgICAgcG9zaXRpb25zCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaXNUb29CaWcgPSBmc2l6ZSA9PiB7CiAgICAgICAgICBsZXQgdG90YWxIZWlnaHQgPSAwOwogICAgICAgICAgZm9yIChjb25zdCBjYWNoZSBvZiBjYWNoZWRMaW5lcykgewogICAgICAgICAgICBjb25zdCBjaHVua3MgPSB0aGlzLl9zcGxpdExpbmUobnVsbCwgZm9udCwgZnNpemUsIHdpZHRoLCBjYWNoZSk7CiAgICAgICAgICAgIHRvdGFsSGVpZ2h0ICs9IGNodW5rcy5sZW5ndGggKiBmc2l6ZTsKICAgICAgICAgICAgaWYgKHRvdGFsSGVpZ2h0ID4gaGVpZ2h0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIG51bWJlck9mTGluZXMgPSBNYXRoLm1heChudW1iZXJPZkxpbmVzLCBsaW5lQ291bnQpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lczsKICAgICAgICAgIGZvbnRTaXplID0gcm91bmRXaXRoVHdvRGlnaXRzKGxpbmVIZWlnaHQgLyBfdXRpbC5MSU5FX0ZBQ1RPUik7CiAgICAgICAgICBpZiAoaXNUb29CaWcoZm9udFNpemUpKSB7CiAgICAgICAgICAgIG51bWJlck9mTGluZXMrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGZvbnROYW1lLAogICAgICAgIGZvbnRDb2xvcgogICAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTsKICAgICAgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSAoMCwgX2RlZmF1bHRfYXBwZWFyYW5jZS5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSkoewogICAgICAgIGZvbnRTaXplLAogICAgICAgIGZvbnROYW1lLAogICAgICAgIGZvbnRDb2xvcgogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBbdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UsIGZvbnRTaXplLCBoZWlnaHQgLyBudW1iZXJPZkxpbmVzXTsKICB9CiAgX3JlbmRlclRleHQodGV4dCwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIGFsaWdubWVudCwgcHJldkluZm8sIGhQYWRkaW5nLCB2UGFkZGluZykgewogICAgbGV0IHNoaWZ0OwogICAgaWYgKGFsaWdubWVudCA9PT0gMSkgewogICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2dldFRleHRXaWR0aCh0ZXh0LCBmb250KSAqIGZvbnRTaXplOwogICAgICBzaGlmdCA9ICh0b3RhbFdpZHRoIC0gd2lkdGgpIC8gMjsKICAgIH0gZWxzZSBpZiAoYWxpZ25tZW50ID09PSAyKSB7CiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0VGV4dFdpZHRoKHRleHQsIGZvbnQpICogZm9udFNpemU7CiAgICAgIHNoaWZ0ID0gdG90YWxXaWR0aCAtIHdpZHRoIC0gaFBhZGRpbmc7CiAgICB9IGVsc2UgewogICAgICBzaGlmdCA9IGhQYWRkaW5nOwogICAgfQogICAgY29uc3Qgc2hpZnRTdHIgPSAoMCwgX2NvcmVfdXRpbHMubnVtYmVyVG9TdHJpbmcpKHNoaWZ0IC0gcHJldkluZm8uc2hpZnQpOwogICAgcHJldkluZm8uc2hpZnQgPSBzaGlmdDsKICAgIHZQYWRkaW5nID0gKDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKSh2UGFkZGluZyk7CiAgICByZXR1cm4gYCR7c2hpZnRTdHJ9ICR7dlBhZGRpbmd9IFRkICgkeygwLCBfY29yZV91dGlscy5lc2NhcGVTdHJpbmcpKHRleHQpfSkgVGpgOwogIH0KICBfZ2V0U2F2ZUZpZWxkUmVzb3VyY2VzKHhyZWYpIHsKICAgIGNvbnN0IHsKICAgICAgbG9jYWxSZXNvdXJjZXMsCiAgICAgIGFwcGVhcmFuY2VSZXNvdXJjZXMsCiAgICAgIGFjcm9Gb3JtUmVzb3VyY2VzCiAgICB9ID0gdGhpcy5fZmllbGRSZXNvdXJjZXM7CiAgICBjb25zdCBmb250TmFtZSA9IHRoaXMuZGF0YS5kZWZhdWx0QXBwZWFyYW5jZURhdGE/LmZvbnROYW1lOwogICAgaWYgKCFmb250TmFtZSkgewogICAgICByZXR1cm4gbG9jYWxSZXNvdXJjZXMgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKICAgIH0KICAgIGZvciAoY29uc3QgcmVzb3VyY2VzIG9mIFtsb2NhbFJlc291cmNlcywgYXBwZWFyYW5jZVJlc291cmNlc10pIHsKICAgICAgaWYgKHJlc291cmNlcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgICBjb25zdCBsb2NhbEZvbnQgPSByZXNvdXJjZXMuZ2V0KCJGb250Iik7CiAgICAgICAgaWYgKGxvY2FsRm9udCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QgJiYgbG9jYWxGb250Lmhhcyhmb250TmFtZSkpIHsKICAgICAgICAgIHJldHVybiByZXNvdXJjZXM7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoYWNyb0Zvcm1SZXNvdXJjZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIGNvbnN0IGFjcm9Gb3JtRm9udCA9IGFjcm9Gb3JtUmVzb3VyY2VzLmdldCgiRm9udCIpOwogICAgICBpZiAoYWNyb0Zvcm1Gb250IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiBhY3JvRm9ybUZvbnQuaGFzKGZvbnROYW1lKSkgewogICAgICAgIGNvbnN0IHN1YkZvbnREaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CiAgICAgICAgc3ViRm9udERpY3Quc2V0KGZvbnROYW1lLCBhY3JvRm9ybUZvbnQuZ2V0UmF3KGZvbnROYW1lKSk7CiAgICAgICAgY29uc3Qgc3ViUmVzb3VyY2VzRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgICAgIHN1YlJlc291cmNlc0RpY3Quc2V0KCJGb250Iiwgc3ViRm9udERpY3QpOwogICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBkaWN0QXJyYXk6IFtzdWJSZXNvdXJjZXNEaWN0LCBsb2NhbFJlc291cmNlc10sCiAgICAgICAgICBtZXJnZVN1YkRpY3RzOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsb2NhbFJlc291cmNlcyB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OwogIH0KICBnZXRGaWVsZE9iamVjdCgpIHsKICAgIHJldHVybiBudWxsOwogIH0KfQpjbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEucmVhZE9ubHkgJiYgIXRoaXMuZGF0YS5ub0hUTUw7CiAgICB0aGlzLl9oYXNUZXh0ID0gdHJ1ZTsKICAgIGNvbnN0IGRpY3QgPSBwYXJhbXMuZGljdDsKICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLmZpZWxkVmFsdWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gIiI7CiAgICB9CiAgICBsZXQgYWxpZ25tZW50ID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKICAgICAgZGljdCwKICAgICAga2V5OiAiUSIKICAgIH0pOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGFsaWdubWVudCkgfHwgYWxpZ25tZW50IDwgMCB8fCBhbGlnbm1lbnQgPiAyKSB7CiAgICAgIGFsaWdubWVudCA9IG51bGw7CiAgICB9CiAgICB0aGlzLmRhdGEudGV4dEFsaWdubWVudCA9IGFsaWdubWVudDsKICAgIGxldCBtYXhpbXVtTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmdldEluaGVyaXRhYmxlUHJvcGVydHkpKHsKICAgICAgZGljdCwKICAgICAga2V5OiAiTWF4TGVuIgogICAgfSk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4aW11bUxlbmd0aCkgfHwgbWF4aW11bUxlbmd0aCA8IDApIHsKICAgICAgbWF4aW11bUxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmRhdGEubWF4TGVuID0gbWF4aW11bUxlbmd0aDsKICAgIHRoaXMuZGF0YS5tdWx0aUxpbmUgPSB0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLk1VTFRJTElORSk7CiAgICB0aGlzLmRhdGEuY29tYiA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuQ09NQikgJiYgIXRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuTVVMVElMSU5FKSAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QQVNTV09SRCkgJiYgIXRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuRklMRVNFTEVDVCkgJiYgdGhpcy5kYXRhLm1heExlbiAhPT0gMDsKICAgIHRoaXMuZGF0YS5kb05vdFNjcm9sbCA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuRE9OT1RTQ1JPTEwpOwogIH0KICBnZXQgaGFzVGV4dENvbnRlbnQoKSB7CiAgICByZXR1cm4gISF0aGlzLmFwcGVhcmFuY2U7CiAgfQogIF9nZXRDb21iQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgZm9udCwgdGV4dCwgZm9udFNpemUsIHdpZHRoLCBoZWlnaHQsIGhQYWRkaW5nLCB2UGFkZGluZywgZGVzY2VudCwgbGluZUhlaWdodCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGNvbnN0IGNvbWJXaWR0aCA9IHdpZHRoIC8gdGhpcy5kYXRhLm1heExlbjsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuZ2V0Qm9yZGVyQW5kQmFja2dyb3VuZEFwcGVhcmFuY2VzKGFubm90YXRpb25TdG9yYWdlKTsKICAgIGNvbnN0IGJ1ZiA9IFtdOwogICAgY29uc3QgcG9zaXRpb25zID0gZm9udC5nZXRDaGFyUG9zaXRpb25zKHRleHQpOwogICAgZm9yIChjb25zdCBbc3RhcnQsIGVuZF0gb2YgcG9zaXRpb25zKSB7CiAgICAgIGJ1Zi5wdXNoKGAoJHsoMCwgX2NvcmVfdXRpbHMuZXNjYXBlU3RyaW5nKSh0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKSl9KSBUamApOwogICAgfQogICAgY29uc3QgcmVuZGVyZWRDb21iID0gYnVmLmpvaW4oYCAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoY29tYldpZHRoKX0gMCBUZCBgKTsKICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoaFBhZGRpbmcpfSAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykodlBhZGRpbmcgKyBkZXNjZW50KX0gVG0gJHtyZW5kZXJlZENvbWJ9YCArICIgRVQgUSBFTUMiOwogIH0KICBfZ2V0TXVsdGlsaW5lQXBwZWFyYW5jZShkZWZhdWx0QXBwZWFyYW5jZSwgbGluZXMsIGZvbnQsIGZvbnRTaXplLCB3aWR0aCwgaGVpZ2h0LCBhbGlnbm1lbnQsIGhQYWRkaW5nLCB2UGFkZGluZywgZGVzY2VudCwgbGluZUhlaWdodCwgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGNvbnN0IGJ1ZiA9IFtdOwogICAgY29uc3QgdG90YWxXaWR0aCA9IHdpZHRoIC0gMiAqIGhQYWRkaW5nOwogICAgY29uc3QgcHJldkluZm8gPSB7CiAgICAgIHNoaWZ0OiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07CiAgICAgIGNvbnN0IGNodW5rcyA9IHRoaXMuX3NwbGl0TGluZShsaW5lLCBmb250LCBmb250U2l6ZSwgdG90YWxXaWR0aCk7CiAgICAgIGZvciAobGV0IGogPSAwLCBqaiA9IGNodW5rcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgY29uc3QgY2h1bmsgPSBjaHVua3Nbal07CiAgICAgICAgY29uc3QgdlNoaWZ0ID0gaSA9PT0gMCAmJiBqID09PSAwID8gLXZQYWRkaW5nIC0gKGxpbmVIZWlnaHQgLSBkZXNjZW50KSA6IC1saW5lSGVpZ2h0OwogICAgICAgIGJ1Zi5wdXNoKHRoaXMuX3JlbmRlclRleHQoY2h1bmssIGZvbnQsIGZvbnRTaXplLCB3aWR0aCwgYWxpZ25tZW50LCBwcmV2SW5mbywgaFBhZGRpbmcsIHZTaGlmdCkpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmdldEJvcmRlckFuZEJhY2tncm91bmRBcHBlYXJhbmNlcyhhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICBjb25zdCByZW5kZXJlZFRleHQgPSBidWYuam9pbigiXG4iKTsKICAgIHJldHVybiBgL1R4IEJNQyBxICR7Y29sb3JzfUJUIGAgKyBkZWZhdWx0QXBwZWFyYW5jZSArIGAgMSAwIDAgMSAwICR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShoZWlnaHQpfSBUbSAke3JlbmRlcmVkVGV4dH1gICsgIiBFVCBRIEVNQyI7CiAgfQogIF9zcGxpdExpbmUobGluZSwgZm9udCwgZm9udFNpemUsIHdpZHRoLCBjYWNoZSA9IHt9KSB7CiAgICBsaW5lID0gY2FjaGUubGluZSB8fCBsaW5lOwogICAgY29uc3QgZ2x5cGhzID0gY2FjaGUuZ2x5cGhzIHx8IGZvbnQuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgIGlmIChnbHlwaHMubGVuZ3RoIDw9IDEpIHsKICAgICAgcmV0dXJuIFtsaW5lXTsKICAgIH0KICAgIGNvbnN0IHBvc2l0aW9ucyA9IGNhY2hlLnBvc2l0aW9ucyB8fCBmb250LmdldENoYXJQb3NpdGlvbnMobGluZSk7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgbGV0IGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zSW5TdHJpbmdFbmQgPSAtMSwKICAgICAgbGFzdFNwYWNlUG9zID0gLTEsCiAgICAgIHN0YXJ0Q2h1bmsgPSAwLAogICAgICBjdXJyZW50V2lkdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcG9zaXRpb25zW2ldOwogICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTsKICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoICogc2NhbGU7CiAgICAgIGlmIChnbHlwaC51bmljb2RlID09PSAiICIpIHsKICAgICAgICBpZiAoY3VycmVudFdpZHRoICsgZ2x5cGhXaWR0aCA+IHdpZHRoKSB7CiAgICAgICAgICBjaHVua3MucHVzaChsaW5lLnN1YnN0cmluZyhzdGFydENodW5rLCBzdGFydCkpOwogICAgICAgICAgc3RhcnRDaHVuayA9IHN0YXJ0OwogICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMTsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50V2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSBzdGFydDsKICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kID0gZW5kOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCArIGdseXBoV2lkdGggPiB3aWR0aCkgewogICAgICAgICAgaWYgKGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgIT09IC0xKSB7CiAgICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGxhc3RTcGFjZVBvc0luU3RyaW5nRW5kKSk7CiAgICAgICAgICAgIHN0YXJ0Q2h1bmsgPSBsYXN0U3BhY2VQb3NJblN0cmluZ0VuZDsKICAgICAgICAgICAgaSA9IGxhc3RTcGFjZVBvcyArIDE7CiAgICAgICAgICAgIGxhc3RTcGFjZVBvc0luU3RyaW5nU3RhcnQgPSAtMTsKICAgICAgICAgICAgY3VycmVudFdpZHRoID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIHN0YXJ0KSk7CiAgICAgICAgICAgIHN0YXJ0Q2h1bmsgPSBzdGFydDsKICAgICAgICAgICAgY3VycmVudFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFdpZHRoICs9IGdseXBoV2lkdGg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3RhcnRDaHVuayA8IGxpbmUubGVuZ3RoKSB7CiAgICAgIGNodW5rcy5wdXNoKGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q2h1bmssIGxpbmUubGVuZ3RoKSk7CiAgICB9CiAgICByZXR1cm4gY2h1bmtzOwogIH0KICBnZXRGaWVsZE9iamVjdCgpIHsKICAgIHJldHVybiB7CiAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgIHZhbHVlOiB0aGlzLmRhdGEuZmllbGRWYWx1ZSwKICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgfHwgIiIsCiAgICAgIG11bHRpbGluZTogdGhpcy5kYXRhLm11bHRpTGluZSwKICAgICAgcGFzc3dvcmQ6IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUEFTU1dPUkQpLAogICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW4sCiAgICAgIGNvbWI6IHRoaXMuZGF0YS5jb21iLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgaGlkZGVuOiB0aGlzLmRhdGEuaGlkZGVuLAogICAgICBuYW1lOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICByZWN0OiB0aGlzLmRhdGEucmVjdCwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGU6ICJ0ZXh0IgogICAgfTsKICB9Cn0KY2xhc3MgQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbiBleHRlbmRzIFdpZGdldEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBudWxsOwogICAgdGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlID0gbnVsbDsKICAgIHRoaXMuZGF0YS5jaGVja0JveCA9ICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlJBRElPKSAmJiAhdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5QVVNIQlVUVE9OKTsKICAgIHRoaXMuZGF0YS5yYWRpb0J1dHRvbiA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuUkFESU8pICYmICF0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOwogICAgdGhpcy5kYXRhLnB1c2hCdXR0b24gPSB0aGlzLmhhc0ZpZWxkRmxhZyhfdXRpbC5Bbm5vdGF0aW9uRmllbGRGbGFnLlBVU0hCVVRUT04pOwogICAgdGhpcy5kYXRhLmlzVG9vbHRpcE9ubHkgPSBmYWxzZTsKICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKICAgICAgdGhpcy5fcHJvY2Vzc0NoZWNrQm94KHBhcmFtcyk7CiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgewogICAgICB0aGlzLl9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKTsKICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLnB1c2hCdXR0b24pIHsKICAgICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRydWU7CiAgICAgIHRoaXMuX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcyk7CiAgICB9IGVsc2UgewogICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZmllbGQgZmxhZ3MgZm9yIGJ1dHRvbiB3aWRnZXQgYW5ub3RhdGlvbiIpOwogICAgfQogIH0KICBhc3luYyBnZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgaWYgKHRoaXMuZGF0YS5wdXNoQnV0dG9uKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGZhbHNlLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBsZXQgdmFsdWUgPSBudWxsOwogICAgbGV0IHJvdGF0aW9uID0gbnVsbDsKICAgIGlmIChhbm5vdGF0aW9uU3RvcmFnZSkgewogICAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgICAgdmFsdWUgPSBzdG9yYWdlRW50cnkgPyBzdG9yYWdlRW50cnkudmFsdWUgOiBudWxsOwogICAgICByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeSA/IHN0b3JhZ2VFbnRyeS5yb3RhdGlvbiA6IG51bGw7CiAgICB9CiAgICBpZiAodmFsdWUgPT09IG51bGwgJiYgdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIHJldHVybiBzdXBlci5nZXRPcGVyYXRvckxpc3QoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIHJlbmRlckZvcm1zLCBhbm5vdGF0aW9uU3RvcmFnZSk7CiAgICB9CiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgICAgdmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9PT0gdGhpcy5kYXRhLmV4cG9ydFZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgICAgfQogICAgfQogICAgY29uc3QgYXBwZWFyYW5jZSA9IHZhbHVlID8gdGhpcy5jaGVja2VkQXBwZWFyYW5jZSA6IHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZTsKICAgIGlmIChhcHBlYXJhbmNlKSB7CiAgICAgIGNvbnN0IHNhdmVkQXBwZWFyYW5jZSA9IHRoaXMuYXBwZWFyYW5jZTsKICAgICAgY29uc3Qgc2F2ZWRNYXRyaXggPSBhcHBlYXJhbmNlLmRpY3QuZ2V0QXJyYXkoIk1hdHJpeCIpIHx8IF91dGlsLklERU5USVRZX01BVFJJWDsKICAgICAgaWYgKHJvdGF0aW9uKSB7CiAgICAgICAgYXBwZWFyYW5jZS5kaWN0LnNldCgiTWF0cml4IiwgdGhpcy5nZXRSb3RhdGlvbk1hdHJpeChhbm5vdGF0aW9uU3RvcmFnZSkpOwogICAgICB9CiAgICAgIHRoaXMuYXBwZWFyYW5jZSA9IGFwcGVhcmFuY2U7CiAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IHN1cGVyLmdldE9wZXJhdG9yTGlzdChldmFsdWF0b3IsIHRhc2ssIGludGVudCwgcmVuZGVyRm9ybXMsIGFubm90YXRpb25TdG9yYWdlKTsKICAgICAgdGhpcy5hcHBlYXJhbmNlID0gc2F2ZWRBcHBlYXJhbmNlOwogICAgICBhcHBlYXJhbmNlLmRpY3Quc2V0KCJNYXRyaXgiLCBzYXZlZE1hdHJpeCk7CiAgICAgIHJldHVybiBvcGVyYXRvckxpc3Q7CiAgICB9CiAgICByZXR1cm4gewogICAgICBvcExpc3Q6IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKSwKICAgICAgc2VwYXJhdGVGb3JtOiBmYWxzZSwKICAgICAgc2VwYXJhdGVDYW52YXM6IGZhbHNlCiAgICB9OwogIH0KICBhc3luYyBzYXZlKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICh0aGlzLmRhdGEuY2hlY2tCb3gpIHsKICAgICAgcmV0dXJuIHRoaXMuX3NhdmVDaGVja2JveChldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIGlmICh0aGlzLmRhdGEucmFkaW9CdXR0b24pIHsKICAgICAgcmV0dXJuIHRoaXMuX3NhdmVSYWRpb0J1dHRvbihldmFsdWF0b3IsIHRhc2ssIGFubm90YXRpb25TdG9yYWdlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBhc3luYyBfc2F2ZUNoZWNrYm94KGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICghYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5leHBvcnRWYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpOwogICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9PT0gdGhpcy5kYXRhLmV4cG9ydFZhbHVlOwogICAgfQogICAgY29uc3QgeGZhID0gewogICAgICBwYXRoOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICB2YWx1ZTogdmFsdWUgPyB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgOiAiIgogICAgfTsKICAgIGNvbnN0IG5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCh2YWx1ZSA/IHRoaXMuZGF0YS5leHBvcnRWYWx1ZSA6ICJPZmYiKTsKICAgIGRpY3Quc2V0KCJWIiwgbmFtZSk7CiAgICBkaWN0LnNldCgiQVMiLCBuYW1lKTsKICAgIGRpY3Quc2V0KCJNIiwgYEQ6JHsoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTsKICAgIGNvbnN0IG1heWJlTUsgPSB0aGlzLl9nZXRNS0RpY3Qocm90YXRpb24pOwogICAgaWYgKG1heWJlTUspIHsKICAgICAgZGljdC5zZXQoIk1LIiwgbWF5YmVNSyk7CiAgICB9CiAgICBjb25zdCBlbmNyeXB0ID0gZXZhbHVhdG9yLnhyZWYuZW5jcnlwdDsKICAgIGxldCBvcmlnaW5hbFRyYW5zZm9ybSA9IG51bGw7CiAgICBpZiAoZW5jcnlwdCkgewogICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSwgdGhpcy5yZWYuZ2VuKTsKICAgIH0KICAgIGNvbnN0IGJ1ZmZlciA9IFtgJHt0aGlzLnJlZi5udW19ICR7dGhpcy5yZWYuZ2VufSBvYmpcbmBdOwogICAgYXdhaXQgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXIsIG9yaWdpbmFsVHJhbnNmb3JtKTsKICAgIGJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CiAgICByZXR1cm4gW3sKICAgICAgcmVmOiB0aGlzLnJlZiwKICAgICAgZGF0YTogYnVmZmVyLmpvaW4oIiIpLAogICAgICB4ZmEKICAgIH1dOwogIH0KICBhc3luYyBfc2F2ZVJhZGlvQnV0dG9uKGV2YWx1YXRvciwgdGFzaywgYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgIGlmICghYW5ub3RhdGlvblN0b3JhZ2UpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBzdG9yYWdlRW50cnkgPSBhbm5vdGF0aW9uU3RvcmFnZS5nZXQodGhpcy5kYXRhLmlkKTsKICAgIGxldCByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeT8ucm90YXRpb24sCiAgICAgIHZhbHVlID0gc3RvcmFnZUVudHJ5Py52YWx1ZTsKICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUgPT09IHRoaXMuZGF0YS5idXR0b25WYWx1ZTsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgY29uc3QgZGljdCA9IGV2YWx1YXRvci54cmVmLmZldGNoSWZSZWYodGhpcy5yZWYpOwogICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9PT0gdGhpcy5kYXRhLmJ1dHRvblZhbHVlOwogICAgfQogICAgaWYgKHJvdGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwogICAgfQogICAgY29uc3QgeGZhID0gewogICAgICBwYXRoOiB0aGlzLmRhdGEuZmllbGROYW1lLAogICAgICB2YWx1ZTogdmFsdWUgPyB0aGlzLmRhdGEuYnV0dG9uVmFsdWUgOiAiIgogICAgfTsKICAgIGNvbnN0IG5hbWUgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCh2YWx1ZSA/IHRoaXMuZGF0YS5idXR0b25WYWx1ZSA6ICJPZmYiKTsKICAgIGxldCBwYXJlbnRCdWZmZXIgPSBudWxsOwogICAgY29uc3QgZW5jcnlwdCA9IGV2YWx1YXRvci54cmVmLmVuY3J5cHQ7CiAgICBpZiAodmFsdWUpIHsKICAgICAgaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgY29uc3QgcGFyZW50ID0gZXZhbHVhdG9yLnhyZWYuZmV0Y2godGhpcy5wYXJlbnQpOwogICAgICAgIGxldCBwYXJlbnRUcmFuc2Zvcm0gPSBudWxsOwogICAgICAgIGlmIChlbmNyeXB0KSB7CiAgICAgICAgICBwYXJlbnRUcmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh0aGlzLnBhcmVudC5udW0sIHRoaXMucGFyZW50Lmdlbik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5zZXQoIlYiLCBuYW1lKTsKICAgICAgICBwYXJlbnRCdWZmZXIgPSBbYCR7dGhpcy5wYXJlbnQubnVtfSAke3RoaXMucGFyZW50Lmdlbn0gb2JqXG5gXTsKICAgICAgICBhd2FpdCAoMCwgX3dyaXRlci53cml0ZURpY3QpKHBhcmVudCwgcGFyZW50QnVmZmVyLCBwYXJlbnRUcmFuc2Zvcm0pOwogICAgICAgIHBhcmVudEJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgdGhpcy5wYXJlbnQuc2V0KCJWIiwgbmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGRpY3Quc2V0KCJBUyIsIG5hbWUpOwogICAgZGljdC5zZXQoIk0iLCBgRDokeygwLCBfdXRpbC5nZXRNb2RpZmljYXRpb25EYXRlKSgpfWApOwogICAgY29uc3QgbWF5YmVNSyA9IHRoaXMuX2dldE1LRGljdChyb3RhdGlvbik7CiAgICBpZiAobWF5YmVNSykgewogICAgICBkaWN0LnNldCgiTUsiLCBtYXliZU1LKTsKICAgIH0KICAgIGxldCBvcmlnaW5hbFRyYW5zZm9ybSA9IG51bGw7CiAgICBpZiAoZW5jcnlwdCkgewogICAgICBvcmlnaW5hbFRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKHRoaXMucmVmLm51bSwgdGhpcy5yZWYuZ2VuKTsKICAgIH0KICAgIGNvbnN0IGJ1ZmZlciA9IFtgJHt0aGlzLnJlZi5udW19ICR7dGhpcy5yZWYuZ2VufSBvYmpcbmBdOwogICAgYXdhaXQgKDAsIF93cml0ZXIud3JpdGVEaWN0KShkaWN0LCBidWZmZXIsIG9yaWdpbmFsVHJhbnNmb3JtKTsKICAgIGJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7CiAgICBjb25zdCBuZXdSZWZzID0gW3sKICAgICAgcmVmOiB0aGlzLnJlZiwKICAgICAgZGF0YTogYnVmZmVyLmpvaW4oIiIpLAogICAgICB4ZmEKICAgIH1dOwogICAgaWYgKHBhcmVudEJ1ZmZlciAhPT0gbnVsbCkgewogICAgICBuZXdSZWZzLnB1c2goewogICAgICAgIHJlZjogdGhpcy5wYXJlbnQsCiAgICAgICAgZGF0YTogcGFyZW50QnVmZmVyLmpvaW4oIiIpLAogICAgICAgIHhmYTogbnVsbAogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXdSZWZzOwogIH0KICBfZ2V0RGVmYXVsdENoZWNrZWRBcHBlYXJhbmNlKHBhcmFtcywgdHlwZSkgewogICAgY29uc3Qgd2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdOwogICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXTsKICAgIGNvbnN0IGJib3ggPSBbMCwgMCwgd2lkdGgsIGhlaWdodF07CiAgICBjb25zdCBGT05UX1JBVElPID0gMC44OwogICAgY29uc3QgZm9udFNpemUgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAqIEZPTlRfUkFUSU87CiAgICBsZXQgbWV0cmljcywgY2hhcjsKICAgIGlmICh0eXBlID09PSAiY2hlY2siKSB7CiAgICAgIG1ldHJpY3MgPSB7CiAgICAgICAgd2lkdGg6IDAuNzU1ICogZm9udFNpemUsCiAgICAgICAgaGVpZ2h0OiAwLjcwNSAqIGZvbnRTaXplCiAgICAgIH07CiAgICAgIGNoYXIgPSAiXHgzMyI7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJkaXNjIikgewogICAgICBtZXRyaWNzID0gewogICAgICAgIHdpZHRoOiAwLjc5MSAqIGZvbnRTaXplLAogICAgICAgIGhlaWdodDogMC43MDUgKiBmb250U2l6ZQogICAgICB9OwogICAgICBjaGFyID0gIlx4NkMiOwogICAgfSBlbHNlIHsKICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShgX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZSAtIHVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZX1gKTsKICAgIH0KICAgIGNvbnN0IHhTaGlmdCA9ICgwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoKHdpZHRoIC0gbWV0cmljcy53aWR0aCkgLyAyKTsKICAgIGNvbnN0IHlTaGlmdCA9ICgwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoKGhlaWdodCAtIG1ldHJpY3MuaGVpZ2h0KSAvIDIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGBxIEJUIC9QZGZKc1phRGIgJHtmb250U2l6ZX0gVGYgMCBnICR7eFNoaWZ0fSAke3lTaGlmdH0gVGQgKCR7Y2hhcn0pIFRqIEVUIFFgOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChwYXJhbXMueHJlZik7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkZvcm1UeXBlIiwgMSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRm9ybSIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJYT2JqZWN0IikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJCQm94IiwgYmJveCk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIk1hdHJpeCIsIFsxLCAwLCAwLCAxLCAwLCAwXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHBhcmFtcy54cmVmKTsKICAgIGNvbnN0IGZvbnQgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChwYXJhbXMueHJlZik7CiAgICBmb250LnNldCgiUGRmSnNaYURiIiwgdGhpcy5mYWxsYmFja0ZvbnREaWN0KTsKICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIHRoaXMuY2hlY2tlZEFwcGVhcmFuY2UgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlLmRpY3QgPSBhcHBlYXJhbmNlU3RyZWFtRGljdDsKICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTsKICB9CiAgX3Byb2Nlc3NDaGVja0JveChwYXJhbXMpIHsKICAgIGNvbnN0IGN1c3RvbUFwcGVhcmFuY2UgPSBwYXJhbXMuZGljdC5nZXQoIkFQIik7CiAgICBpZiAoIShjdXN0b21BcHBlYXJhbmNlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9ybWFsQXBwZWFyYW5jZSA9IGN1c3RvbUFwcGVhcmFuY2UuZ2V0KCJOIik7CiAgICBpZiAoIShub3JtYWxBcHBlYXJhbmNlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgYXNWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShwYXJhbXMuZGljdC5nZXQoIkFTIikpOwogICAgaWYgKHR5cGVvZiBhc1ZhbHVlID09PSAic3RyaW5nIikgewogICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IGFzVmFsdWU7CiAgICB9CiAgICBjb25zdCB5ZXMgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLmRhdGEuZmllbGRWYWx1ZSAhPT0gIk9mZiIgPyB0aGlzLmRhdGEuZmllbGRWYWx1ZSA6ICJZZXMiOwogICAgY29uc3QgZXhwb3J0VmFsdWVzID0gbm9ybWFsQXBwZWFyYW5jZS5nZXRLZXlzKCk7CiAgICBpZiAoZXhwb3J0VmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICBleHBvcnRWYWx1ZXMucHVzaCgiT2ZmIiwgeWVzKTsKICAgIH0gZWxzZSBpZiAoZXhwb3J0VmFsdWVzLmxlbmd0aCA9PT0gMSkgewogICAgICBpZiAoZXhwb3J0VmFsdWVzWzBdID09PSAiT2ZmIikgewogICAgICAgIGV4cG9ydFZhbHVlcy5wdXNoKHllcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXhwb3J0VmFsdWVzLnVuc2hpZnQoIk9mZiIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGV4cG9ydFZhbHVlcy5pbmNsdWRlcyh5ZXMpKSB7CiAgICAgIGV4cG9ydFZhbHVlcy5sZW5ndGggPSAwOwogICAgICBleHBvcnRWYWx1ZXMucHVzaCgiT2ZmIiwgeWVzKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IG90aGVyWWVzID0gZXhwb3J0VmFsdWVzLmZpbmQodiA9PiB2ICE9PSAiT2ZmIik7CiAgICAgIGV4cG9ydFZhbHVlcy5sZW5ndGggPSAwOwogICAgICBleHBvcnRWYWx1ZXMucHVzaCgiT2ZmIiwgb3RoZXJZZXMpOwogICAgfQogICAgaWYgKCFleHBvcnRWYWx1ZXMuaW5jbHVkZXModGhpcy5kYXRhLmZpZWxkVmFsdWUpKSB7CiAgICAgIHRoaXMuZGF0YS5maWVsZFZhbHVlID0gIk9mZiI7CiAgICB9CiAgICB0aGlzLmRhdGEuZXhwb3J0VmFsdWUgPSBleHBvcnRWYWx1ZXNbMV07CiAgICBjb25zdCBjaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KHRoaXMuZGF0YS5leHBvcnRWYWx1ZSk7CiAgICB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlID0gY2hlY2tlZEFwcGVhcmFuY2UgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0gPyB1bmNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGlmICh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZShwYXJhbXMsICJjaGVjayIpOwogICAgfQogICAgaWYgKHRoaXMudW5jaGVja2VkQXBwZWFyYW5jZSkgewogICAgICB0aGlzLl9zdHJlYW1zLnB1c2godGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKTsKICAgIH0KICAgIHRoaXMuX2ZhbGxiYWNrRm9udERpY3QgPSB0aGlzLmZhbGxiYWNrRm9udERpY3Q7CiAgfQogIF9wcm9jZXNzUmFkaW9CdXR0b24ocGFyYW1zKSB7CiAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuZGF0YS5idXR0b25WYWx1ZSA9IG51bGw7CiAgICBjb25zdCBmaWVsZFBhcmVudCA9IHBhcmFtcy5kaWN0LmdldCgiUGFyZW50Iik7CiAgICBpZiAoZmllbGRQYXJlbnQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIHRoaXMucGFyZW50ID0gcGFyYW1zLmRpY3QuZ2V0UmF3KCJQYXJlbnQiKTsKICAgICAgY29uc3QgZmllbGRQYXJlbnRWYWx1ZSA9IGZpZWxkUGFyZW50LmdldCgiViIpOwogICAgICBpZiAoZmllbGRQYXJlbnRWYWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShmaWVsZFBhcmVudFZhbHVlKTsKICAgICAgfQogICAgfQogICAgY29uc3QgYXBwZWFyYW5jZVN0YXRlcyA9IHBhcmFtcy5kaWN0LmdldCgiQVAiKTsKICAgIGlmICghKGFwcGVhcmFuY2VTdGF0ZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBub3JtYWxBcHBlYXJhbmNlID0gYXBwZWFyYW5jZVN0YXRlcy5nZXQoIk4iKTsKICAgIGlmICghKG5vcm1hbEFwcGVhcmFuY2UgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGtleSBvZiBub3JtYWxBcHBlYXJhbmNlLmdldEtleXMoKSkgewogICAgICBpZiAoa2V5ICE9PSAiT2ZmIikgewogICAgICAgIHRoaXMuZGF0YS5idXR0b25WYWx1ZSA9IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShrZXkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCBjaGVja2VkQXBwZWFyYW5jZSA9IG5vcm1hbEFwcGVhcmFuY2UuZ2V0KHRoaXMuZGF0YS5idXR0b25WYWx1ZSk7CiAgICB0aGlzLmNoZWNrZWRBcHBlYXJhbmNlID0gY2hlY2tlZEFwcGVhcmFuY2UgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSA/IGNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGNvbnN0IHVuY2hlY2tlZEFwcGVhcmFuY2UgPSBub3JtYWxBcHBlYXJhbmNlLmdldCgiT2ZmIik7CiAgICB0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UgPSB1bmNoZWNrZWRBcHBlYXJhbmNlIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0gPyB1bmNoZWNrZWRBcHBlYXJhbmNlIDogbnVsbDsKICAgIGlmICh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmNoZWNrZWRBcHBlYXJhbmNlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuX2dldERlZmF1bHRDaGVja2VkQXBwZWFyYW5jZShwYXJhbXMsICJkaXNjIik7CiAgICB9CiAgICBpZiAodGhpcy51bmNoZWNrZWRBcHBlYXJhbmNlKSB7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLnVuY2hlY2tlZEFwcGVhcmFuY2UpOwogICAgfQogICAgdGhpcy5fZmFsbGJhY2tGb250RGljdCA9IHRoaXMuZmFsbGJhY2tGb250RGljdDsKICB9CiAgX3Byb2Nlc3NQdXNoQnV0dG9uKHBhcmFtcykgewogICAgaWYgKCFwYXJhbXMuZGljdC5oYXMoIkEiKSAmJiAhcGFyYW1zLmRpY3QuaGFzKCJBQSIpICYmICF0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KSB7CiAgICAgICgwLCBfdXRpbC53YXJuKSgiUHVzaCBidXR0b25zIHdpdGhvdXQgYWN0aW9uIGRpY3Rpb25hcmllcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLmRhdGEuaXNUb29sdGlwT25seSA9ICFwYXJhbXMuZGljdC5oYXMoIkEiKSAmJiAhcGFyYW1zLmRpY3QuaGFzKCJBQSIpOwogICAgX2NhdGFsb2cuQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LAogICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKICAgICAgZG9jQmFzZVVybDogcGFyYW1zLnBkZk1hbmFnZXIuZG9jQmFzZVVybCwKICAgICAgZG9jQXR0YWNobWVudHM6IHBhcmFtcy5hdHRhY2htZW50cwogICAgfSk7CiAgfQogIGdldEZpZWxkT2JqZWN0KCkgewogICAgbGV0IHR5cGUgPSAiYnV0dG9uIjsKICAgIGxldCBleHBvcnRWYWx1ZXM7CiAgICBpZiAodGhpcy5kYXRhLmNoZWNrQm94KSB7CiAgICAgIHR5cGUgPSAiY2hlY2tib3giOwogICAgICBleHBvcnRWYWx1ZXMgPSB0aGlzLmRhdGEuZXhwb3J0VmFsdWU7CiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5yYWRpb0J1dHRvbikgewogICAgICB0eXBlID0gInJhZGlvYnV0dG9uIjsKICAgICAgZXhwb3J0VmFsdWVzID0gdGhpcy5kYXRhLmJ1dHRvblZhbHVlOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgaWQ6IHRoaXMuZGF0YS5pZCwKICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlIHx8ICJPZmYiLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSwKICAgICAgZXhwb3J0VmFsdWVzLAogICAgICBlZGl0YWJsZTogIXRoaXMuZGF0YS5yZWFkT25seSwKICAgICAgbmFtZTogdGhpcy5kYXRhLmZpZWxkTmFtZSwKICAgICAgcmVjdDogdGhpcy5kYXRhLnJlY3QsCiAgICAgIGhpZGRlbjogdGhpcy5kYXRhLmhpZGRlbiwKICAgICAgYWN0aW9uczogdGhpcy5kYXRhLmFjdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGUKICAgIH07CiAgfQogIGdldCBmYWxsYmFja0ZvbnREaWN0KCkgewogICAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KCk7CiAgICBkaWN0LnNldCgiQmFzZUZvbnQiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiWmFwZkRpbmdiYXRzIikpOwogICAgZGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOwogICAgZGljdC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRmFsbGJhY2tUeXBlIikpOwogICAgZGljdC5zZXQoIkVuY29kaW5nIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlphcGZEaW5nYmF0c0VuY29kaW5nIikpOwogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJmYWxsYmFja0ZvbnREaWN0IiwgZGljdCk7CiAgfQp9CmNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb24gZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmluZGljZXMgPSBkaWN0LmdldEFycmF5KCJJIik7CiAgICB0aGlzLmhhc0luZGljZXMgPSBBcnJheS5pc0FycmF5KHRoaXMuaW5kaWNlcykgJiYgdGhpcy5pbmRpY2VzLmxlbmd0aCA+IDA7CiAgICB0aGlzLmRhdGEub3B0aW9ucyA9IFtdOwogICAgY29uc3Qgb3B0aW9ucyA9ICgwLCBfY29yZV91dGlscy5nZXRJbmhlcml0YWJsZVByb3BlcnR5KSh7CiAgICAgIGRpY3QsCiAgICAgIGtleTogIk9wdCIKICAgIH0pOwogICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3B0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3Qgb3B0aW9uID0geHJlZi5mZXRjaElmUmVmKG9wdGlvbnNbaV0pOwogICAgICAgIGNvbnN0IGlzT3B0aW9uQXJyYXkgPSBBcnJheS5pc0FycmF5KG9wdGlvbik7CiAgICAgICAgdGhpcy5kYXRhLm9wdGlvbnNbaV0gPSB7CiAgICAgICAgICBleHBvcnRWYWx1ZTogdGhpcy5fZGVjb2RlRm9ybVZhbHVlKGlzT3B0aW9uQXJyYXkgPyB4cmVmLmZldGNoSWZSZWYob3B0aW9uWzBdKSA6IG9wdGlvbiksCiAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuX2RlY29kZUZvcm1WYWx1ZShpc09wdGlvbkFycmF5ID8geHJlZi5mZXRjaElmUmVmKG9wdGlvblsxXSkgOiBvcHRpb24pCiAgICAgICAgfTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLmhhc0luZGljZXMpIHsKICAgICAgaWYgKHR5cGVvZiB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZSA9IFt0aGlzLmRhdGEuZmllbGRWYWx1ZV07CiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGF0YS5maWVsZFZhbHVlKSB7CiAgICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBbXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBbXTsKICAgICAgY29uc3QgaWkgPSB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGg7CiAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLmluZGljZXMpIHsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpKSAmJiBpID49IDAgJiYgaSA8IGlpKSB7CiAgICAgICAgICB0aGlzLmRhdGEuZmllbGRWYWx1ZS5wdXNoKHRoaXMuZGF0YS5vcHRpb25zW2ldLmV4cG9ydFZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuZGF0YS5jb21ibyA9IHRoaXMuaGFzRmllbGRGbGFnKF91dGlsLkFubm90YXRpb25GaWVsZEZsYWcuQ09NQk8pOwogICAgdGhpcy5kYXRhLm11bHRpU2VsZWN0ID0gdGhpcy5oYXNGaWVsZEZsYWcoX3V0aWwuQW5ub3RhdGlvbkZpZWxkRmxhZy5NVUxUSVNFTEVDVCk7CiAgICB0aGlzLl9oYXNUZXh0ID0gdHJ1ZTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICBjb25zdCB0eXBlID0gdGhpcy5kYXRhLmNvbWJvID8gImNvbWJvYm94IiA6ICJsaXN0Ym94IjsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoID4gMCA/IHRoaXMuZGF0YS5maWVsZFZhbHVlWzBdIDogbnVsbDsKICAgIHJldHVybiB7CiAgICAgIGlkOiB0aGlzLmRhdGEuaWQsCiAgICAgIHZhbHVlLAogICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSwKICAgICAgZWRpdGFibGU6ICF0aGlzLmRhdGEucmVhZE9ubHksCiAgICAgIG5hbWU6IHRoaXMuZGF0YS5maWVsZE5hbWUsCiAgICAgIHJlY3Q6IHRoaXMuZGF0YS5yZWN0LAogICAgICBudW1JdGVtczogdGhpcy5kYXRhLmZpZWxkVmFsdWUubGVuZ3RoLAogICAgICBtdWx0aXBsZVNlbGVjdGlvbjogdGhpcy5kYXRhLm11bHRpU2VsZWN0LAogICAgICBoaWRkZW46IHRoaXMuZGF0YS5oaWRkZW4sCiAgICAgIGFjdGlvbnM6IHRoaXMuZGF0YS5hY3Rpb25zLAogICAgICBpdGVtczogdGhpcy5kYXRhLm9wdGlvbnMsCiAgICAgIHBhZ2U6IHRoaXMuZGF0YS5wYWdlSW5kZXgsCiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLmRhdGEuYm9yZGVyQ29sb3IsCiAgICAgIGZpbGxDb2xvcjogdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciwKICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb24sCiAgICAgIHR5cGUKICAgIH07CiAgfQogIGFtZW5kU2F2ZWREaWN0KGFubm90YXRpb25TdG9yYWdlLCBkaWN0KSB7CiAgICBpZiAoIXRoaXMuaGFzSW5kaWNlcykgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgdmFsdWVzID0gYW5ub3RhdGlvblN0b3JhZ2U/LmdldCh0aGlzLmRhdGEuaWQpPy52YWx1ZTsKICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7CiAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdOwogICAgfQogICAgY29uc3QgaW5kaWNlcyA9IFtdOwogICAgY29uc3QgewogICAgICBvcHRpb25zCiAgICB9ID0gdGhpcy5kYXRhOwogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBpZiAob3B0aW9uc1tpXS5leHBvcnRWYWx1ZSA9PT0gdmFsdWVzW2pdKSB7CiAgICAgICAgaW5kaWNlcy5wdXNoKGkpOwogICAgICAgIGogKz0gMTsKICAgICAgfQogICAgfQogICAgZGljdC5zZXQoIkkiLCBpbmRpY2VzKTsKICB9CiAgYXN5bmMgX2dldEFwcGVhcmFuY2UoZXZhbHVhdG9yLCB0YXNrLCBpbnRlbnQsIGFubm90YXRpb25TdG9yYWdlKSB7CiAgICBpZiAodGhpcy5kYXRhLmNvbWJvKSB7CiAgICAgIHJldHVybiBzdXBlci5fZ2V0QXBwZWFyYW5jZShldmFsdWF0b3IsIHRhc2ssIGludGVudCwgYW5ub3RhdGlvblN0b3JhZ2UpOwogICAgfQogICAgbGV0IGV4cG9ydGVkVmFsdWUsIHJvdGF0aW9uOwogICAgY29uc3Qgc3RvcmFnZUVudHJ5ID0gYW5ub3RhdGlvblN0b3JhZ2U/LmdldCh0aGlzLmRhdGEuaWQpOwogICAgaWYgKHN0b3JhZ2VFbnRyeSkgewogICAgICByb3RhdGlvbiA9IHN0b3JhZ2VFbnRyeS5yb3RhdGlvbjsKICAgICAgZXhwb3J0ZWRWYWx1ZSA9IHN0b3JhZ2VFbnRyeS52YWx1ZTsKICAgIH0KICAgIGlmIChyb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIGV4cG9ydGVkVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5fbmVlZEFwcGVhcmFuY2VzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGV4cG9ydGVkVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICBleHBvcnRlZFZhbHVlID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7CiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGV4cG9ydGVkVmFsdWUpKSB7CiAgICAgIGV4cG9ydGVkVmFsdWUgPSBbZXhwb3J0ZWRWYWx1ZV07CiAgICB9CiAgICBjb25zdCBkZWZhdWx0UGFkZGluZyA9IDE7CiAgICBjb25zdCBkZWZhdWx0SFBhZGRpbmcgPSAyOwogICAgbGV0IHRvdGFsSGVpZ2h0ID0gdGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXTsKICAgIGxldCB0b3RhbFdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTsKICAgIGlmIChyb3RhdGlvbiA9PT0gOTAgfHwgcm90YXRpb24gPT09IDI3MCkgewogICAgICBbdG90YWxXaWR0aCwgdG90YWxIZWlnaHRdID0gW3RvdGFsSGVpZ2h0LCB0b3RhbFdpZHRoXTsKICAgIH0KICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDsKICAgIGNvbnN0IHZhbHVlSW5kaWNlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZXhwb3J0VmFsdWUKICAgICAgfSA9IHRoaXMuZGF0YS5vcHRpb25zW2ldOwogICAgICBpZiAoZXhwb3J0ZWRWYWx1ZS5pbmNsdWRlcyhleHBvcnRWYWx1ZSkpIHsKICAgICAgICB2YWx1ZUluZGljZXMucHVzaChpKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhID0gKDAsIF9kZWZhdWx0X2FwcGVhcmFuY2UucGFyc2VEZWZhdWx0QXBwZWFyYW5jZSkodGhpcy5fZGVmYXVsdEFwcGVhcmFuY2UgPSAiL0hlbHZldGljYSAwIFRmIDAgZyIpOwogICAgfQogICAgY29uc3QgZm9udCA9IGF3YWl0IFdpZGdldEFubm90YXRpb24uX2dldEZvbnREYXRhKGV2YWx1YXRvciwgdGFzaywgdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YSwgdGhpcy5fZmllbGRSZXNvdXJjZXMubWVyZ2VkUmVzb3VyY2VzKTsKICAgIGxldCBkZWZhdWx0QXBwZWFyYW5jZTsKICAgIGxldCB7CiAgICAgIGZvbnRTaXplCiAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTsKICAgIGlmICghZm9udFNpemUpIHsKICAgICAgY29uc3QgbGluZUhlaWdodCA9ICh0b3RhbEhlaWdodCAtIGRlZmF1bHRQYWRkaW5nKSAvIGxpbmVDb3VudDsKICAgICAgbGV0IGxpbmVXaWR0aCA9IC0xOwogICAgICBsZXQgdmFsdWU7CiAgICAgIGZvciAoY29uc3QgewogICAgICAgIGRpc3BsYXlWYWx1ZQogICAgICB9IG9mIHRoaXMuZGF0YS5vcHRpb25zKSB7CiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9nZXRUZXh0V2lkdGgoZGlzcGxheVZhbHVlLCBmb250KTsKICAgICAgICBpZiAod2lkdGggPiBsaW5lV2lkdGgpIHsKICAgICAgICAgIGxpbmVXaWR0aCA9IHdpZHRoOwogICAgICAgICAgdmFsdWUgPSBkaXNwbGF5VmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIFtkZWZhdWx0QXBwZWFyYW5jZSwgZm9udFNpemVdID0gdGhpcy5fY29tcHV0ZUZvbnRTaXplKGxpbmVIZWlnaHQsIHRvdGFsV2lkdGggLSAyICogZGVmYXVsdEhQYWRkaW5nLCB2YWx1ZSwgZm9udCwgLTEpOwogICAgfSBlbHNlIHsKICAgICAgZGVmYXVsdEFwcGVhcmFuY2UgPSB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTsKICAgIH0KICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBmb250U2l6ZSAqIF91dGlsLkxJTkVfRkFDVE9SOwogICAgY29uc3QgdlBhZGRpbmcgPSAobGluZUhlaWdodCAtIGZvbnRTaXplKSAvIDI7CiAgICBjb25zdCBudW1iZXJPZlZpc2libGVMaW5lcyA9IE1hdGguZmxvb3IodG90YWxIZWlnaHQgLyBsaW5lSGVpZ2h0KTsKICAgIGxldCBmaXJzdEluZGV4OwogICAgaWYgKHZhbHVlSW5kaWNlcy5sZW5ndGggPT09IDEpIHsKICAgICAgY29uc3QgdmFsdWVQb3NpdGlvbiA9IHZhbHVlSW5kaWNlc1swXTsKICAgICAgY29uc3QgaW5kZXhJblBhZ2UgPSB2YWx1ZVBvc2l0aW9uICUgbnVtYmVyT2ZWaXNpYmxlTGluZXM7CiAgICAgIGZpcnN0SW5kZXggPSB2YWx1ZVBvc2l0aW9uIC0gaW5kZXhJblBhZ2U7CiAgICB9IGVsc2UgewogICAgICBmaXJzdEluZGV4ID0gdmFsdWVJbmRpY2VzLmxlbmd0aCA/IHZhbHVlSW5kaWNlc1swXSA6IDA7CiAgICB9CiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihmaXJzdEluZGV4ICsgbnVtYmVyT2ZWaXNpYmxlTGluZXMgKyAxLCBsaW5lQ291bnQpOwogICAgY29uc3QgYnVmID0gWyIvVHggQk1DIHEiLCBgMSAxICR7dG90YWxXaWR0aH0gJHt0b3RhbEhlaWdodH0gcmUgVyBuYF07CiAgICBpZiAodmFsdWVJbmRpY2VzLmxlbmd0aCkgewogICAgICBidWYucHVzaCgiMC42MDAwMDYgMC43NTY4NjYgMC44NTQ5MDQgcmciKTsKICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB2YWx1ZUluZGljZXMpIHsKICAgICAgICBpZiAoZmlyc3RJbmRleCA8PSBpbmRleCAmJiBpbmRleCA8IGVuZCkgewogICAgICAgICAgYnVmLnB1c2goYDEgJHt0b3RhbEhlaWdodCAtIChpbmRleCAtIGZpcnN0SW5kZXggKyAxKSAqIGxpbmVIZWlnaHR9ICR7dG90YWxXaWR0aH0gJHtsaW5lSGVpZ2h0fSByZSBmYCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBidWYucHVzaCgiQlQiLCBkZWZhdWx0QXBwZWFyYW5jZSwgYDEgMCAwIDEgMCAke3RvdGFsSGVpZ2h0fSBUbWApOwogICAgY29uc3QgcHJldkluZm8gPSB7CiAgICAgIHNoaWZ0OiAwCiAgICB9OwogICAgZm9yIChsZXQgaSA9IGZpcnN0SW5kZXg7IGkgPCBlbmQ7IGkrKykgewogICAgICBjb25zdCB7CiAgICAgICAgZGlzcGxheVZhbHVlCiAgICAgIH0gPSB0aGlzLmRhdGEub3B0aW9uc1tpXTsKICAgICAgY29uc3QgdnBhZGRpbmcgPSBpID09PSBmaXJzdEluZGV4ID8gdlBhZGRpbmcgOiAwOwogICAgICBidWYucHVzaCh0aGlzLl9yZW5kZXJUZXh0KGRpc3BsYXlWYWx1ZSwgZm9udCwgZm9udFNpemUsIHRvdGFsV2lkdGgsIDAsIHByZXZJbmZvLCBkZWZhdWx0SFBhZGRpbmcsIC1saW5lSGVpZ2h0ICsgdnBhZGRpbmcpKTsKICAgIH0KICAgIGJ1Zi5wdXNoKCJFVCBRIEVNQyIpOwogICAgcmV0dXJuIGJ1Zi5qb2luKCJcbiIpOwogIH0KfQpjbGFzcyBTaWduYXR1cmVXaWRnZXRBbm5vdGF0aW9uIGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmZpZWxkVmFsdWUgPSBudWxsOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICB9CiAgZ2V0RmllbGRPYmplY3QoKSB7CiAgICByZXR1cm4gewogICAgICBpZDogdGhpcy5kYXRhLmlkLAogICAgICB2YWx1ZTogbnVsbCwKICAgICAgcGFnZTogdGhpcy5kYXRhLnBhZ2VJbmRleCwKICAgICAgdHlwZTogInNpZ25hdHVyZSIKICAgIH07CiAgfQp9CmNsYXNzIFRleHRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBjb25zdCBERUZBVUxUX0lDT05fU0laRSA9IDIyOwogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5ub1JvdGF0ZSA9IHRydWU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgY29uc3QgewogICAgICBkaWN0CiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuVEVYVDsKICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkgewogICAgICB0aGlzLmRhdGEubmFtZSA9ICJOb0ljb24iOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLnJlY3RbMV0gPSB0aGlzLmRhdGEucmVjdFszXSAtIERFRkFVTFRfSUNPTl9TSVpFOwogICAgICB0aGlzLmRhdGEucmVjdFsyXSA9IHRoaXMuZGF0YS5yZWN0WzBdICsgREVGQVVMVF9JQ09OX1NJWkU7CiAgICAgIHRoaXMuZGF0YS5uYW1lID0gZGljdC5oYXMoIk5hbWUiKSA/IGRpY3QuZ2V0KCJOYW1lIikubmFtZSA6ICJOb3RlIjsKICAgIH0KICAgIGlmIChkaWN0LmhhcygiU3RhdGUiKSkgewogICAgICB0aGlzLmRhdGEuc3RhdGUgPSBkaWN0LmdldCgiU3RhdGUiKSB8fCBudWxsOwogICAgICB0aGlzLmRhdGEuc3RhdGVNb2RlbCA9IGRpY3QuZ2V0KCJTdGF0ZU1vZGVsIikgfHwgbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuZGF0YS5zdGF0ZU1vZGVsID0gbnVsbDsKICAgIH0KICB9Cn0KY2xhc3MgTGlua0Fubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LOwogICAgY29uc3QgcXVhZFBvaW50cyA9IGdldFF1YWRQb2ludHMocGFyYW1zLmRpY3QsIHRoaXMucmVjdGFuZ2xlKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gcXVhZFBvaW50czsKICAgIH0KICAgIHRoaXMuZGF0YS5ib3JkZXJDb2xvciB8fD0gdGhpcy5kYXRhLmNvbG9yOwogICAgX2NhdGFsb2cuQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgZGVzdERpY3Q6IHBhcmFtcy5kaWN0LAogICAgICByZXN1bHRPYmo6IHRoaXMuZGF0YSwKICAgICAgZG9jQmFzZVVybDogcGFyYW1zLnBkZk1hbmFnZXIuZG9jQmFzZVVybCwKICAgICAgZG9jQXR0YWNobWVudHM6IHBhcmFtcy5hdHRhY2htZW50cwogICAgfSk7CiAgfQp9CmNsYXNzIFBvcHVwQW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdAogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlBPUFVQOwogICAgbGV0IHBhcmVudEl0ZW0gPSBkaWN0LmdldCgiUGFyZW50Iik7CiAgICBpZiAoIXBhcmVudEl0ZW0pIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJQb3B1cCBhbm5vdGF0aW9uIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBwYXJlbnQgYW5ub3RhdGlvbi4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGFyZW50U3VidHlwZSA9IHBhcmVudEl0ZW0uZ2V0KCJTdWJ0eXBlIik7CiAgICB0aGlzLmRhdGEucGFyZW50VHlwZSA9IHBhcmVudFN1YnR5cGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lID8gcGFyZW50U3VidHlwZS5uYW1lIDogbnVsbDsKICAgIGNvbnN0IHJhd1BhcmVudCA9IGRpY3QuZ2V0UmF3KCJQYXJlbnQiKTsKICAgIHRoaXMuZGF0YS5wYXJlbnRJZCA9IHJhd1BhcmVudCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiA/IHJhd1BhcmVudC50b1N0cmluZygpIDogbnVsbDsKICAgIGNvbnN0IHBhcmVudFJlY3QgPSBwYXJlbnRJdGVtLmdldEFycmF5KCJSZWN0Iik7CiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJlbnRSZWN0KSAmJiBwYXJlbnRSZWN0Lmxlbmd0aCA9PT0gNCkgewogICAgICB0aGlzLmRhdGEucGFyZW50UmVjdCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChwYXJlbnRSZWN0KTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5wYXJlbnRSZWN0ID0gWzAsIDAsIDAsIDBdOwogICAgfQogICAgY29uc3QgcnQgPSBwYXJlbnRJdGVtLmdldCgiUlQiKTsKICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNOYW1lKShydCwgX3V0aWwuQW5ub3RhdGlvblJlcGx5VHlwZS5HUk9VUCkpIHsKICAgICAgcGFyZW50SXRlbSA9IHBhcmVudEl0ZW0uZ2V0KCJJUlQiKTsKICAgIH0KICAgIGlmICghcGFyZW50SXRlbS5oYXMoIk0iKSkgewogICAgICB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNldE1vZGlmaWNhdGlvbkRhdGUocGFyZW50SXRlbS5nZXQoIk0iKSk7CiAgICAgIHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlID0gdGhpcy5tb2RpZmljYXRpb25EYXRlOwogICAgfQogICAgaWYgKCFwYXJlbnRJdGVtLmhhcygiQyIpKSB7CiAgICAgIHRoaXMuZGF0YS5jb2xvciA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNldENvbG9yKHBhcmVudEl0ZW0uZ2V0QXJyYXkoIkMiKSk7CiAgICAgIHRoaXMuZGF0YS5jb2xvciA9IHRoaXMuY29sb3I7CiAgICB9CiAgICBpZiAoIXRoaXMudmlld2FibGUpIHsKICAgICAgY29uc3QgcGFyZW50RmxhZ3MgPSBwYXJlbnRJdGVtLmdldCgiRiIpOwogICAgICBpZiAodGhpcy5faXNWaWV3YWJsZShwYXJlbnRGbGFncykpIHsKICAgICAgICB0aGlzLnNldEZsYWdzKHBhcmVudEZsYWdzKTsKICAgICAgfQogICAgfQogICAgdGhpcy5zZXRUaXRsZShwYXJlbnRJdGVtLmdldCgiVCIpKTsKICAgIHRoaXMuZGF0YS50aXRsZU9iaiA9IHRoaXMuX3RpdGxlOwogICAgdGhpcy5zZXRDb250ZW50cyhwYXJlbnRJdGVtLmdldCgiQ29udGVudHMiKSk7CiAgICB0aGlzLmRhdGEuY29udGVudHNPYmogPSB0aGlzLl9jb250ZW50czsKICAgIGlmIChwYXJlbnRJdGVtLmhhcygiUkMiKSkgewogICAgICB0aGlzLmRhdGEucmljaFRleHQgPSBfZmFjdG9yeS5YRkFGYWN0b3J5LmdldFJpY2hUZXh0QXNIdG1sKHBhcmVudEl0ZW0uZ2V0KCJSQyIpKTsKICAgIH0KICB9Cn0KZXhwb3J0cy5Qb3B1cEFubm90YXRpb24gPSBQb3B1cEFubm90YXRpb247CmNsYXNzIEZyZWVUZXh0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5oYXNPd25DYW52YXMgPSB0aGlzLmRhdGEubm9Sb3RhdGU7CiAgICBjb25zdCB7CiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5GUkVFVEVYVDsKICAgIHRoaXMuc2V0RGVmYXVsdEFwcGVhcmFuY2UocGFyYW1zKTsKICAgIGlmICghdGhpcy5hcHBlYXJhbmNlICYmIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gcGFyYW1zLmRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBmYWtlVW5pY29kZUZvbnQgPSBuZXcgX2RlZmF1bHRfYXBwZWFyYW5jZS5GYWtlVW5pY29kZUZvbnQoeHJlZiwgInNhbnMtc2VyaWYiKTsKICAgICAgY29uc3QgZm9udERhdGEgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhOwogICAgICB0aGlzLmFwcGVhcmFuY2UgPSBmYWtlVW5pY29kZUZvbnQuY3JlYXRlQXBwZWFyYW5jZSh0aGlzLl9jb250ZW50cy5zdHIsIHRoaXMucmVjdGFuZ2xlLCB0aGlzLnJvdGF0aW9uLCBmb250RGF0YS5mb250U2l6ZSB8fCAxMCwgZm9udERhdGEuZm9udENvbG9yLCBzdHJva2VBbHBoYSk7CiAgICAgIHRoaXMuX3N0cmVhbXMucHVzaCh0aGlzLmFwcGVhcmFuY2UsIF9kZWZhdWx0X2FwcGVhcmFuY2UuRmFrZVVuaWNvZGVGb250LnRvVW5pY29kZVN0cmVhbSk7CiAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkgewogICAgICAoMCwgX3V0aWwud2FybikoIkZyZWVUZXh0QW5ub3RhdGlvbjogT2Zmc2NyZWVuQ2FudmFzIGlzIG5vdCBzdXBwb3J0ZWQsIGFubm90YXRpb24gbWF5IG5vdCByZW5kZXIgY29ycmVjdGx5LiIpOwogICAgfQogIH0KICBnZXQgaGFzVGV4dENvbnRlbnQoKSB7CiAgICByZXR1cm4gISF0aGlzLmFwcGVhcmFuY2U7CiAgfQogIHN0YXRpYyBjcmVhdGVOZXdEaWN0KGFubm90YXRpb24sIHhyZWYsIHsKICAgIGFwUmVmLAogICAgYXAKICB9KSB7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBmb250U2l6ZSwKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHVzZXIsCiAgICAgIHZhbHVlCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGZyZWV0ZXh0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CiAgICBmcmVldGV4dC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiQW5ub3QiKSk7CiAgICBmcmVldGV4dC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRnJlZVRleHQiKSk7CiAgICBmcmVldGV4dC5zZXQoIkNyZWF0aW9uRGF0ZSIsIGBEOiR7KDAsIF91dGlsLmdldE1vZGlmaWNhdGlvbkRhdGUpKCl9YCk7CiAgICBmcmVldGV4dC5zZXQoIlJlY3QiLCByZWN0KTsKICAgIGNvbnN0IGRhID0gYC9IZWx2ICR7Zm9udFNpemV9IFRmICR7KDAsIF9kZWZhdWx0X2FwcGVhcmFuY2UuZ2V0UGRmQ29sb3IpKGNvbG9yLCB0cnVlKX1gOwogICAgZnJlZXRleHQuc2V0KCJEQSIsIGRhKTsKICAgIGZyZWV0ZXh0LnNldCgiQ29udGVudHMiLCAoMCwgX2NvcmVfdXRpbHMuaXNBc2NpaSkodmFsdWUpID8gdmFsdWUgOiAoMCwgX2NvcmVfdXRpbHMuc3RyaW5nVG9VVEYxNlN0cmluZykodmFsdWUsIHRydWUpKTsKICAgIGZyZWV0ZXh0LnNldCgiRiIsIDQpOwogICAgZnJlZXRleHQuc2V0KCJCb3JkZXIiLCBbMCwgMCwgMF0pOwogICAgZnJlZXRleHQuc2V0KCJSb3RhdGUiLCByb3RhdGlvbik7CiAgICBpZiAodXNlcikgewogICAgICBmcmVldGV4dC5zZXQoIlQiLCAoMCwgX2NvcmVfdXRpbHMuaXNBc2NpaSkodXNlcikgPyB1c2VyIDogKDAsIF9jb3JlX3V0aWxzLnN0cmluZ1RvVVRGMTZTdHJpbmcpKHVzZXIsIHRydWUpKTsKICAgIH0KICAgIGlmIChhcFJlZiB8fCBhcCkgewogICAgICBjb25zdCBuID0gbmV3IF9wcmltaXRpdmVzLkRpY3QoeHJlZik7CiAgICAgIGZyZWV0ZXh0LnNldCgiQVAiLCBuKTsKICAgICAgaWYgKGFwUmVmKSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbi5zZXQoIk4iLCBhcCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmcmVldGV4dDsKICB9CiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5ld0FwcGVhcmFuY2VTdHJlYW0oYW5ub3RhdGlvbiwgeHJlZiwgcGFyYW1zKSB7CiAgICBjb25zdCB7CiAgICAgIGJhc2VGb250UmVmLAogICAgICBldmFsdWF0b3IsCiAgICAgIHRhc2sKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCB7CiAgICAgIGNvbG9yLAogICAgICBmb250U2l6ZSwKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHZhbHVlCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgY29uc3QgZm9udCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgaWYgKGJhc2VGb250UmVmKSB7CiAgICAgIGZvbnQuc2V0KCJIZWx2IiwgYmFzZUZvbnRSZWYpOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgYmFzZUZvbnQgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgICAgYmFzZUZvbnQuc2V0KCJCYXNlRm9udCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJIZWx2ZXRpY2EiKSk7CiAgICAgIGJhc2VGb250LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250IikpOwogICAgICBiYXNlRm9udC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVHlwZTEiKSk7CiAgICAgIGJhc2VGb250LnNldCgiRW5jb2RpbmciLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiV2luQW5zaUVuY29kaW5nIikpOwogICAgICBmb250LnNldCgiSGVsdiIsIGJhc2VGb250KTsKICAgIH0KICAgIHJlc291cmNlcy5zZXQoIkZvbnQiLCBmb250KTsKICAgIGNvbnN0IGhlbHYgPSBhd2FpdCBXaWRnZXRBbm5vdGF0aW9uLl9nZXRGb250RGF0YShldmFsdWF0b3IsIHRhc2ssIHsKICAgICAgZm9udE5hbWU6ICJIZWx2ZXRpY2EiLAogICAgICBmb250U2l6ZQogICAgfSwgcmVzb3VyY2VzKTsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGNvbnN0IGxpbmVzID0gdmFsdWUuc3BsaXQoIlxuIik7CiAgICBjb25zdCBzY2FsZSA9IGZvbnRTaXplIC8gMTAwMDsKICAgIGxldCB0b3RhbFdpZHRoID0gLUluZmluaXR5OwogICAgY29uc3QgZW5jb2RlZExpbmVzID0gW107CiAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgIGNvbnN0IGVuY29kZWQgPSBoZWx2LmVuY29kZVN0cmluZyhsaW5lKTsKICAgICAgaWYgKGVuY29kZWQubGVuZ3RoID4gMSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGxpbmUgPSBlbmNvZGVkLmpvaW4oIiIpOwogICAgICBlbmNvZGVkTGluZXMucHVzaChsaW5lKTsKICAgICAgbGV0IGxpbmVXaWR0aCA9IDA7CiAgICAgIGNvbnN0IGdseXBocyA9IGhlbHYuY2hhcnNUb0dseXBocyhsaW5lKTsKICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgICBsaW5lV2lkdGggKz0gZ2x5cGgud2lkdGggKiBzY2FsZTsKICAgICAgfQogICAgICB0b3RhbFdpZHRoID0gTWF0aC5tYXgodG90YWxXaWR0aCwgbGluZVdpZHRoKTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKHRvdGFsV2lkdGggPiB3KSB7CiAgICAgIGhzY2FsZSA9IHcgLyB0b3RhbFdpZHRoOwogICAgfQogICAgbGV0IHZzY2FsZSA9IDE7CiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gX3V0aWwuTElORV9GQUNUT1IgKiBmb250U2l6ZTsKICAgIGNvbnN0IGxpbmVEZXNjZW50ID0gX3V0aWwuTElORV9ERVNDRU5UX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgY29uc3QgdG90YWxIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKHRvdGFsSGVpZ2h0ID4gaCkgewogICAgICB2c2NhbGUgPSBoIC8gdG90YWxIZWlnaHQ7CiAgICB9CiAgICBjb25zdCBmc2NhbGUgPSBNYXRoLm1pbihoc2NhbGUsIHZzY2FsZSk7CiAgICBjb25zdCBuZXdGb250U2l6ZSA9IGZvbnRTaXplICogZnNjYWxlOwogICAgY29uc3QgYnVmZmVyID0gWyJxIiwgYDAgMCAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykodyl9ICR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShoKX0gcmUgVyBuYCwgYEJUYCwgYDEgMCAwIDEgMCAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoaCArIGxpbmVEZXNjZW50KX0gVG0gMCBUYyAkeygwLCBfZGVmYXVsdF9hcHBlYXJhbmNlLmdldFBkZkNvbG9yKShjb2xvciwgdHJ1ZSl9YCwgYC9IZWx2ICR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShuZXdGb250U2l6ZSl9IFRmYF07CiAgICBjb25zdCB2U2hpZnQgPSAoMCwgX2NvcmVfdXRpbHMubnVtYmVyVG9TdHJpbmcpKGxpbmVIZWlnaHQpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGVuY29kZWRMaW5lcykgewogICAgICBidWZmZXIucHVzaChgMCAtJHt2U2hpZnR9IFRkICgkeygwLCBfY29yZV91dGlscy5lc2NhcGVTdHJpbmcpKGxpbmUpfSkgVGpgKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKCJFVCIsICJRIik7CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYnVmZmVyLmpvaW4oIlxuIik7CiAgICBjb25zdCBhcHBlYXJhbmNlU3RyZWFtRGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJGb3JtVHlwZSIsIDEpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIFswLCAwLCB3LCBoXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlJlc291cmNlcyIsIHJlc291cmNlcyk7CiAgICBpZiAocm90YXRpb24pIHsKICAgICAgY29uc3QgbWF0cml4ID0gKDAsIF9jb3JlX3V0aWxzLmdldFJvdGF0aW9uTWF0cml4KShyb3RhdGlvbiwgdywgaCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGNvbnN0IGFwID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKGFwcGVhcmFuY2UpOwogICAgYXAuZGljdCA9IGFwcGVhcmFuY2VTdHJlYW1EaWN0OwogICAgcmV0dXJuIGFwOwogIH0KfQpjbGFzcyBMaW5lQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkxJTkU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgY29uc3QgbGluZUNvb3JkaW5hdGVzID0gZGljdC5nZXRBcnJheSgiTCIpOwogICAgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlcyA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChsaW5lQ29vcmRpbmF0ZXMpOwogICAgdGhpcy5zZXRMaW5lRW5kaW5ncyhkaWN0LmdldEFycmF5KCJMRSIpKTsKICAgIHRoaXMuZGF0YS5saW5lRW5kaW5ncyA9IHRoaXMubGluZUVuZGluZ3M7CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBpbnRlcmlvckNvbG9yID0gZ2V0UmdiQ29sb3IoZGljdC5nZXRBcnJheSgiSUMiKSwgbnVsbCk7CiAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGludGVyaW9yQ29sb3IgPyBnZXRQZGZDb2xvckFycmF5KGludGVyaW9yQ29sb3IpIDogbnVsbDsKICAgICAgY29uc3QgZmlsbEFscGhhID0gZmlsbENvbG9yID8gc3Ryb2tlQWxwaGEgOiBudWxsOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1swXSAtIGJvcmRlckFkanVzdCwgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1sxXSAtIGJvcmRlckFkanVzdCwgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1syXSArIGJvcmRlckFkanVzdCwgdGhpcy5kYXRhLmxpbmVDb29yZGluYXRlc1szXSArIGJvcmRlckFkanVzdF07CiAgICAgIGlmICghX3V0aWwuVXRpbC5pbnRlcnNlY3QodGhpcy5yZWN0YW5nbGUsIGJib3gpKSB7CiAgICAgICAgdGhpcy5yZWN0YW5nbGUgPSBiYm94OwogICAgICB9CiAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICB4cmVmLAogICAgICAgIGV4dHJhOiBgJHtib3JkZXJXaWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgZmlsbENvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIGZpbGxBbHBoYSwKICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICBidWZmZXIucHVzaChgJHtsaW5lQ29vcmRpbmF0ZXNbMF19ICR7bGluZUNvb3JkaW5hdGVzWzFdfSBtYCwgYCR7bGluZUNvb3JkaW5hdGVzWzJdfSAke2xpbmVDb29yZGluYXRlc1szXX0gbGAsICJTIik7CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXS54IC0gYm9yZGVyV2lkdGgsIHBvaW50c1sxXS54ICsgYm9yZGVyV2lkdGgsIHBvaW50c1szXS55IC0gYm9yZGVyV2lkdGgsIHBvaW50c1sxXS55ICsgYm9yZGVyV2lkdGhdOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIFNxdWFyZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVBUkU7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgaWYgKHRoaXMuYm9yZGVyU3R5bGUud2lkdGggPT09IDAgJiYgIWZpbGxDb2xvcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLl9zZXREZWZhdWx0QXBwZWFyYW5jZSh7CiAgICAgICAgeHJlZiwKICAgICAgICBleHRyYTogYCR7dGhpcy5ib3JkZXJTdHlsZS53aWR0aH0gd2AsCiAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgZmlsbENvbG9yLAogICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgIGZpbGxBbHBoYSwKICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICBjb25zdCB4ID0gcG9pbnRzWzJdLnggKyB0aGlzLmJvcmRlclN0eWxlLndpZHRoIC8gMjsKICAgICAgICAgIGNvbnN0IHkgPSBwb2ludHNbMl0ueSArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3Qgd2lkdGggPSBwb2ludHNbM10ueCAtIHBvaW50c1syXS54IC0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aDsKICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHBvaW50c1sxXS55IC0gcG9pbnRzWzNdLnkgLSB0aGlzLmJvcmRlclN0eWxlLndpZHRoOwogICAgICAgICAgYnVmZmVyLnB1c2goYCR7eH0gJHt5fSAke3dpZHRofSAke2hlaWdodH0gcmVgKTsKICAgICAgICAgIGlmIChmaWxsQ29sb3IpIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIkIiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gW3BvaW50c1swXS54LCBwb2ludHNbMV0ueCwgcG9pbnRzWzNdLnksIHBvaW50c1sxXS55XTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KfQpjbGFzcyBDaXJjbGVBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOwogICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgY29uc3Qgc3Ryb2tlQWxwaGEgPSBkaWN0LmdldCgiQ0EiKTsKICAgICAgY29uc3QgaW50ZXJpb3JDb2xvciA9IGdldFJnYkNvbG9yKGRpY3QuZ2V0QXJyYXkoIklDIiksIG51bGwpOwogICAgICBjb25zdCBmaWxsQ29sb3IgPSBpbnRlcmlvckNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheShpbnRlcmlvckNvbG9yKSA6IG51bGw7CiAgICAgIGNvbnN0IGZpbGxBbHBoYSA9IGZpbGxDb2xvciA/IHN0cm9rZUFscGhhIDogbnVsbDsKICAgICAgaWYgKHRoaXMuYm9yZGVyU3R5bGUud2lkdGggPT09IDAgJiYgIWZpbGxDb2xvcikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBjb250cm9sUG9pbnRzRGlzdGFuY2UgPSA0IC8gMyAqIE1hdGgudGFuKE1hdGguUEkgLyAoMiAqIDQpKTsKICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke3RoaXMuYm9yZGVyU3R5bGUud2lkdGh9IHdgLAogICAgICAgIHN0cm9rZUNvbG9yLAogICAgICAgIGZpbGxDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBmaWxsQWxwaGEsCiAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgY29uc3QgeDAgPSBwb2ludHNbMF0ueCArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeTAgPSBwb2ludHNbMF0ueSAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeDEgPSBwb2ludHNbM10ueCAtIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeTEgPSBwb2ludHNbM10ueSArIHRoaXMuYm9yZGVyU3R5bGUud2lkdGggLyAyOwogICAgICAgICAgY29uc3QgeE1pZCA9IHgwICsgKHgxIC0geDApIC8gMjsKICAgICAgICAgIGNvbnN0IHlNaWQgPSB5MCArICh5MSAtIHkwKSAvIDI7CiAgICAgICAgICBjb25zdCB4T2Zmc2V0ID0gKHgxIC0geDApIC8gMiAqIGNvbnRyb2xQb2ludHNEaXN0YW5jZTsKICAgICAgICAgIGNvbnN0IHlPZmZzZXQgPSAoeTEgLSB5MCkgLyAyICogY29udHJvbFBvaW50c0Rpc3RhbmNlOwogICAgICAgICAgYnVmZmVyLnB1c2goYCR7eE1pZH0gJHt5MX0gbWAsIGAke3hNaWQgKyB4T2Zmc2V0fSAke3kxfSAke3gxfSAke3lNaWQgKyB5T2Zmc2V0fSAke3gxfSAke3lNaWR9IGNgLCBgJHt4MX0gJHt5TWlkIC0geU9mZnNldH0gJHt4TWlkICsgeE9mZnNldH0gJHt5MH0gJHt4TWlkfSAke3kwfSBjYCwgYCR7eE1pZCAtIHhPZmZzZXR9ICR7eTB9ICR7eDB9ICR7eU1pZCAtIHlPZmZzZXR9ICR7eDB9ICR7eU1pZH0gY2AsIGAke3gwfSAke3lNaWQgKyB5T2Zmc2V0fSAke3hNaWQgLSB4T2Zmc2V0fSAke3kxfSAke3hNaWR9ICR7eTF9IGNgLCAiaCIpOwogICAgICAgICAgaWYgKGZpbGxDb2xvcikgewogICAgICAgICAgICBidWZmZXIucHVzaCgiQiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLngsIHBvaW50c1sxXS54LCBwb2ludHNbM10ueSwgcG9pbnRzWzFdLnldOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfQp9CmNsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIHRoaXMuZGF0YS52ZXJ0aWNlcyA9IFtdOwogICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBvbHlnb25Bbm5vdGF0aW9uKSkgewogICAgICB0aGlzLnNldExpbmVFbmRpbmdzKGRpY3QuZ2V0QXJyYXkoIkxFIikpOwogICAgICB0aGlzLmRhdGEubGluZUVuZGluZ3MgPSB0aGlzLmxpbmVFbmRpbmdzOwogICAgfQogICAgY29uc3QgcmF3VmVydGljZXMgPSBkaWN0LmdldEFycmF5KCJWZXJ0aWNlcyIpOwogICAgaWYgKCFBcnJheS5pc0FycmF5KHJhd1ZlcnRpY2VzKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSByYXdWZXJ0aWNlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgIHRoaXMuZGF0YS52ZXJ0aWNlcy5wdXNoKHsKICAgICAgICB4OiByYXdWZXJ0aWNlc1tpXSwKICAgICAgICB5OiByYXdWZXJ0aWNlc1tpICsgMV0KICAgICAgfSk7CiAgICB9CiAgICBpZiAoIXRoaXMuYXBwZWFyYW5jZSkgewogICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRoaXMuYm9yZGVyU3R5bGUud2lkdGggfHwgMSwKICAgICAgICBib3JkZXJBZGp1c3QgPSAyICogYm9yZGVyV2lkdGg7CiAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07CiAgICAgIGZvciAoY29uc3QgdmVydGV4IG9mIHRoaXMuZGF0YS52ZXJ0aWNlcykgewogICAgICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCB2ZXJ0ZXgueCAtIGJvcmRlckFkanVzdCk7CiAgICAgICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIHZlcnRleC55IC0gYm9yZGVyQWRqdXN0KTsKICAgICAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgdmVydGV4LnggKyBib3JkZXJBZGp1c3QpOwogICAgICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCB2ZXJ0ZXgueSArIGJvcmRlckFkanVzdCk7CiAgICAgIH0KICAgICAgaWYgKCFfdXRpbC5VdGlsLmludGVyc2VjdCh0aGlzLnJlY3RhbmdsZSwgYmJveCkpIHsKICAgICAgICB0aGlzLnJlY3RhbmdsZSA9IGJib3g7CiAgICAgIH0KICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke2JvcmRlcldpZHRofSB3YCwKICAgICAgICBzdHJva2VDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IHRoaXMuZGF0YS52ZXJ0aWNlczsKICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7dmVydGljZXNbaV0ueH0gJHt2ZXJ0aWNlc1tpXS55fSAke2kgPT09IDAgPyAibSIgOiAibCJ9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0ueCwgcG9pbnRzWzFdLngsIHBvaW50c1szXS55LCBwb2ludHNbMV0ueV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9Cn0KY2xhc3MgUG9seWdvbkFubm90YXRpb24gZXh0ZW5kcyBQb2x5bGluZUFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlHT047CiAgfQp9CmNsYXNzIENhcmV0QW5ub3RhdGlvbiBleHRlbmRzIE1hcmt1cEFubm90YXRpb24gewogIGNvbnN0cnVjdG9yKHBhcmFtcykgewogICAgc3VwZXIocGFyYW1zKTsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLkNBUkVUOwogIH0KfQpjbGFzcyBJbmtBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmhhc093bkNhbnZhcyA9IHRoaXMuZGF0YS5ub1JvdGF0ZTsKICAgIGNvbnN0IHsKICAgICAgZGljdCwKICAgICAgeHJlZgogICAgfSA9IHBhcmFtczsKICAgIHRoaXMuZGF0YS5hbm5vdGF0aW9uVHlwZSA9IF91dGlsLkFubm90YXRpb25UeXBlLklOSzsKICAgIHRoaXMuZGF0YS5pbmtMaXN0cyA9IFtdOwogICAgY29uc3QgcmF3SW5rTGlzdHMgPSBkaWN0LmdldEFycmF5KCJJbmtMaXN0Iik7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3SW5rTGlzdHMpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHJhd0lua0xpc3RzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgdGhpcy5kYXRhLmlua0xpc3RzLnB1c2goW10pOwogICAgICBmb3IgKGxldCBqID0gMCwgamogPSByYXdJbmtMaXN0c1tpXS5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7CiAgICAgICAgdGhpcy5kYXRhLmlua0xpc3RzW2ldLnB1c2goewogICAgICAgICAgeDogeHJlZi5mZXRjaElmUmVmKHJhd0lua0xpc3RzW2ldW2pdKSwKICAgICAgICAgIHk6IHhyZWYuZmV0Y2hJZlJlZihyYXdJbmtMaXN0c1tpXVtqICsgMV0pCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMCwgMCwgMF07CiAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgIGNvbnN0IGJvcmRlcldpZHRoID0gdGhpcy5ib3JkZXJTdHlsZS53aWR0aCB8fCAxLAogICAgICAgIGJvcmRlckFkanVzdCA9IDIgKiBib3JkZXJXaWR0aDsKICAgICAgY29uc3QgYmJveCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTsKICAgICAgZm9yIChjb25zdCBpbmtMaXN0cyBvZiB0aGlzLmRhdGEuaW5rTGlzdHMpIHsKICAgICAgICBmb3IgKGNvbnN0IHZlcnRleCBvZiBpbmtMaXN0cykgewogICAgICAgICAgYmJveFswXSA9IE1hdGgubWluKGJib3hbMF0sIHZlcnRleC54IC0gYm9yZGVyQWRqdXN0KTsKICAgICAgICAgIGJib3hbMV0gPSBNYXRoLm1pbihiYm94WzFdLCB2ZXJ0ZXgueSAtIGJvcmRlckFkanVzdCk7CiAgICAgICAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgdmVydGV4LnggKyBib3JkZXJBZGp1c3QpOwogICAgICAgICAgYmJveFszXSA9IE1hdGgubWF4KGJib3hbM10sIHZlcnRleC55ICsgYm9yZGVyQWRqdXN0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFfdXRpbC5VdGlsLmludGVyc2VjdCh0aGlzLnJlY3RhbmdsZSwgYmJveCkpIHsKICAgICAgICB0aGlzLnJlY3RhbmdsZSA9IGJib3g7CiAgICAgIH0KICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgIHhyZWYsCiAgICAgICAgZXh0cmE6IGAke2JvcmRlcldpZHRofSB3YCwKICAgICAgICBzdHJva2VDb2xvciwKICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICBwb2ludHNDYWxsYmFjazogKGJ1ZmZlciwgcG9pbnRzKSA9PiB7CiAgICAgICAgICBmb3IgKGNvbnN0IGlua0xpc3Qgb2YgdGhpcy5kYXRhLmlua0xpc3RzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlua0xpc3QubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke2lua0xpc3RbaV0ueH0gJHtpbmtMaXN0W2ldLnl9ICR7aSA9PT0gMCA/ICJtIiA6ICJsIn1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWZmZXIucHVzaCgiUyIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtwb2ludHNbMF0ueCwgcG9pbnRzWzFdLngsIHBvaW50c1szXS55LCBwb2ludHNbMV0ueV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CiAgc3RhdGljIGNyZWF0ZU5ld0RpY3QoYW5ub3RhdGlvbiwgeHJlZiwgewogICAgYXBSZWYsCiAgICBhcAogIH0pIHsKICAgIGNvbnN0IHsKICAgICAgcGF0aHMsCiAgICAgIHJlY3QsCiAgICAgIHJvdGF0aW9uCiAgICB9ID0gYW5ub3RhdGlvbjsKICAgIGNvbnN0IGluayA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgaW5rLnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJBbm5vdCIpKTsKICAgIGluay5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSW5rIikpOwogICAgaW5rLnNldCgiQ3JlYXRpb25EYXRlIiwgYEQ6JHsoMCwgX3V0aWwuZ2V0TW9kaWZpY2F0aW9uRGF0ZSkoKX1gKTsKICAgIGluay5zZXQoIlJlY3QiLCByZWN0KTsKICAgIGluay5zZXQoIklua0xpc3QiLCBwYXRocy5tYXAocCA9PiBwLnBvaW50cykpOwogICAgaW5rLnNldCgiRiIsIDQpOwogICAgaW5rLnNldCgiQm9yZGVyIiwgWzAsIDAsIDBdKTsKICAgIGluay5zZXQoIlJvdGF0ZSIsIHJvdGF0aW9uKTsKICAgIGNvbnN0IG4gPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgIGluay5zZXQoIkFQIiwgbik7CiAgICBpZiAoYXBSZWYpIHsKICAgICAgbi5zZXQoIk4iLCBhcFJlZik7CiAgICB9IGVsc2UgewogICAgICBuLnNldCgiTiIsIGFwKTsKICAgIH0KICAgIHJldHVybiBpbms7CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVOZXdBcHBlYXJhbmNlU3RyZWFtKGFubm90YXRpb24sIHhyZWYsIHBhcmFtcykgewogICAgY29uc3QgewogICAgICBjb2xvciwKICAgICAgcmVjdCwKICAgICAgcm90YXRpb24sCiAgICAgIHBhdGhzLAogICAgICB0aGlja25lc3MsCiAgICAgIG9wYWNpdHkKICAgIH0gPSBhbm5vdGF0aW9uOwogICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IHJlY3Q7CiAgICBsZXQgdyA9IHgyIC0geDE7CiAgICBsZXQgaCA9IHkyIC0geTE7CiAgICBpZiAocm90YXRpb24gJSAxODAgIT09IDApIHsKICAgICAgW3csIGhdID0gW2gsIHddOwogICAgfQogICAgY29uc3QgYXBwZWFyYW5jZUJ1ZmZlciA9IFtgJHt0aGlja25lc3N9IHcgMSBKIDEgamAsIGAkeygwLCBfZGVmYXVsdF9hcHBlYXJhbmNlLmdldFBkZkNvbG9yKShjb2xvciwgZmFsc2UpfWBdOwogICAgaWYgKG9wYWNpdHkgIT09IDEpIHsKICAgICAgYXBwZWFyYW5jZUJ1ZmZlci5wdXNoKCIvUjAgZ3MiKTsKICAgIH0KICAgIGNvbnN0IGJ1ZmZlciA9IFtdOwogICAgZm9yIChjb25zdCB7CiAgICAgIGJlemllcgogICAgfSBvZiBwYXRocykgewogICAgICBidWZmZXIubGVuZ3RoID0gMDsKICAgICAgYnVmZmVyLnB1c2goYCR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShiZXppZXJbMF0pfSAkeygwLCBfY29yZV91dGlscy5udW1iZXJUb1N0cmluZykoYmV6aWVyWzFdKX0gbWApOwogICAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikgewogICAgICAgIGNvbnN0IGN1cnZlID0gYmV6aWVyLnNsaWNlKGksIGkgKyA2KS5tYXAoX2NvcmVfdXRpbHMubnVtYmVyVG9TdHJpbmcpLmpvaW4oIiAiKTsKICAgICAgICBidWZmZXIucHVzaChgJHtjdXJ2ZX0gY2ApOwogICAgICB9CiAgICAgIGJ1ZmZlci5wdXNoKCJTIik7CiAgICAgIGFwcGVhcmFuY2VCdWZmZXIucHVzaChidWZmZXIuam9pbigiXG4iKSk7CiAgICB9CiAgICBjb25zdCBhcHBlYXJhbmNlID0gYXBwZWFyYW5jZUJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiRm9ybVR5cGUiLCAxKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiU3VidHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb3JtIikpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIlhPYmplY3QiKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkJCb3giLCBbMCwgMCwgdywgaF0pOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJMZW5ndGgiLCBhcHBlYXJhbmNlLmxlbmd0aCk7CiAgICBpZiAocm90YXRpb24pIHsKICAgICAgY29uc3QgbWF0cml4ID0gKDAsIF9jb3JlX3V0aWxzLmdldFJvdGF0aW9uTWF0cml4KShyb3RhdGlvbiwgdywgaCk7CiAgICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiTWF0cml4IiwgbWF0cml4KTsKICAgIH0KICAgIGlmIChvcGFjaXR5ICE9PSAxKSB7CiAgICAgIGNvbnN0IHJlc291cmNlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogICAgICBjb25zdCBleHRHU3RhdGUgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgICAgY29uc3QgcjAgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh4cmVmKTsKICAgICAgcjAuc2V0KCJDQSIsIG9wYWNpdHkpOwogICAgICByMC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRXh0R1N0YXRlIikpOwogICAgICBleHRHU3RhdGUuc2V0KCJSMCIsIHIwKTsKICAgICAgcmVzb3VyY2VzLnNldCgiRXh0R1N0YXRlIiwgZXh0R1N0YXRlKTsKICAgICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJSZXNvdXJjZXMiLCByZXNvdXJjZXMpOwogICAgfQogICAgY29uc3QgYXAgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQp9CmNsYXNzIEhpZ2hsaWdodEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5hcHBlYXJhbmNlPy5kaWN0LmdldCgiUmVzb3VyY2VzIik7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlIHx8ICFyZXNvdXJjZXM/LmhhcygiRXh0R1N0YXRlIikpIHsKICAgICAgICBpZiAodGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkhpZ2hsaWdodEFubm90YXRpb24gLSBpZ25vcmluZyBidWlsdC1pbiBhcHBlYXJhbmNlIHN0cmVhbS4iKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jb2xvciA/IGdldFBkZkNvbG9yQXJyYXkodGhpcy5jb2xvcikgOiBbMSwgMSwgMF07CiAgICAgICAgY29uc3QgZmlsbEFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGZpbGxDb2xvciwKICAgICAgICAgIGJsZW5kTW9kZTogIk11bHRpcGx5IiwKICAgICAgICAgIGZpbGxBbHBoYSwKICAgICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7cG9pbnRzWzBdLnh9ICR7cG9pbnRzWzBdLnl9IG1gLCBgJHtwb2ludHNbMV0ueH0gJHtwb2ludHNbMV0ueX0gbGAsIGAke3BvaW50c1szXS54fSAke3BvaW50c1szXS55fSBsYCwgYCR7cG9pbnRzWzJdLnh9ICR7cG9pbnRzWzJdLnl9IGxgLCAiZiIpOwogICAgICAgICAgICByZXR1cm4gW3BvaW50c1swXS54LCBwb2ludHNbMV0ueCwgcG9pbnRzWzNdLnksIHBvaW50c1sxXS55XTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhpcy5kYXRhLmhhc1BvcHVwID0gZmFsc2U7CiAgICB9CiAgfQp9CmNsYXNzIFVuZGVybGluZUFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICB0aGlzLmRhdGEuYW5ub3RhdGlvblR5cGUgPSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGV4dHJhOiAiW10gMCBkIDAuNTcxIHciLAogICAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7cG9pbnRzWzJdLnh9ICR7cG9pbnRzWzJdLnkgKyAxLjN9IG1gLCBgJHtwb2ludHNbM10ueH0gJHtwb2ludHNbM10ueSArIDEuM30gbGAsICJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLngsIHBvaW50c1sxXS54LCBwb2ludHNbM10ueSwgcG9pbnRzWzFdLnldOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEuaGFzUG9wdXAgPSBmYWxzZTsKICAgIH0KICB9Cn0KY2xhc3MgU3F1aWdnbHlBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVSUdHTFk7CiAgICBjb25zdCBxdWFkUG9pbnRzID0gdGhpcy5kYXRhLnF1YWRQb2ludHMgPSBnZXRRdWFkUG9pbnRzKGRpY3QsIG51bGwpOwogICAgaWYgKHF1YWRQb2ludHMpIHsKICAgICAgaWYgKCF0aGlzLmFwcGVhcmFuY2UpIHsKICAgICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY29sb3IgPyBnZXRQZGZDb2xvckFycmF5KHRoaXMuY29sb3IpIDogWzAsIDAsIDBdOwogICAgICAgIGNvbnN0IHN0cm9rZUFscGhhID0gZGljdC5nZXQoIkNBIik7CiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdEFwcGVhcmFuY2UoewogICAgICAgICAgeHJlZiwKICAgICAgICAgIGV4dHJhOiAiW10gMCBkIDEgdyIsCiAgICAgICAgICBzdHJva2VDb2xvciwKICAgICAgICAgIHN0cm9rZUFscGhhLAogICAgICAgICAgcG9pbnRzQ2FsbGJhY2s6IChidWZmZXIsIHBvaW50cykgPT4gewogICAgICAgICAgICBjb25zdCBkeSA9IChwb2ludHNbMF0ueSAtIHBvaW50c1syXS55KSAvIDY7CiAgICAgICAgICAgIGxldCBzaGlmdCA9IGR5OwogICAgICAgICAgICBsZXQgeCA9IHBvaW50c1syXS54OwogICAgICAgICAgICBjb25zdCB5ID0gcG9pbnRzWzJdLnk7CiAgICAgICAgICAgIGNvbnN0IHhFbmQgPSBwb2ludHNbM10ueDsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7eH0gJHt5ICsgc2hpZnR9IG1gKTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIHggKz0gMjsKICAgICAgICAgICAgICBzaGlmdCA9IHNoaWZ0ID09PSAwID8gZHkgOiAwOwogICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGAke3h9ICR7eSArIHNoaWZ0fSBsYCk7CiAgICAgICAgICAgIH0gd2hpbGUgKHggPCB4RW5kKTsKICAgICAgICAgICAgYnVmZmVyLnB1c2goIlMiKTsKICAgICAgICAgICAgcmV0dXJuIFtwb2ludHNbMl0ueCwgeEVuZCwgeSAtIDIgKiBkeSwgeSArIDIgKiBkeV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZGF0YS5oYXNQb3B1cCA9IGZhbHNlOwogICAgfQogIH0KfQpjbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgY29uc3QgewogICAgICBkaWN0LAogICAgICB4cmVmCiAgICB9ID0gcGFyYW1zOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOwogICAgY29uc3QgcXVhZFBvaW50cyA9IHRoaXMuZGF0YS5xdWFkUG9pbnRzID0gZ2V0UXVhZFBvaW50cyhkaWN0LCBudWxsKTsKICAgIGlmIChxdWFkUG9pbnRzKSB7CiAgICAgIGlmICghdGhpcy5hcHBlYXJhbmNlKSB7CiAgICAgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmNvbG9yID8gZ2V0UGRmQ29sb3JBcnJheSh0aGlzLmNvbG9yKSA6IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzdHJva2VBbHBoYSA9IGRpY3QuZ2V0KCJDQSIpOwogICAgICAgIHRoaXMuX3NldERlZmF1bHRBcHBlYXJhbmNlKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBleHRyYTogIltdIDAgZCAxIHciLAogICAgICAgICAgc3Ryb2tlQ29sb3IsCiAgICAgICAgICBzdHJva2VBbHBoYSwKICAgICAgICAgIHBvaW50c0NhbGxiYWNrOiAoYnVmZmVyLCBwb2ludHMpID0+IHsKICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7KHBvaW50c1swXS54ICsgcG9pbnRzWzJdLngpIC8gMn0gYCArIGAkeyhwb2ludHNbMF0ueSArIHBvaW50c1syXS55KSAvIDJ9IG1gLCBgJHsocG9pbnRzWzFdLnggKyBwb2ludHNbM10ueCkgLyAyfSBgICsgYCR7KHBvaW50c1sxXS55ICsgcG9pbnRzWzNdLnkpIC8gMn0gbGAsICJTIik7CiAgICAgICAgICAgIHJldHVybiBbcG9pbnRzWzBdLngsIHBvaW50c1sxXS54LCBwb2ludHNbM10ueSwgcG9pbnRzWzFdLnldOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEuaGFzUG9wdXAgPSBmYWxzZTsKICAgIH0KICB9Cn0KY2xhc3MgU3RhbXBBbm5vdGF0aW9uIGV4dGVuZHMgTWFya3VwQW5ub3RhdGlvbiB7CiAgY29uc3RydWN0b3IocGFyYW1zKSB7CiAgICBzdXBlcihwYXJhbXMpOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RBTVA7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogIH0KfQpjbGFzcyBGaWxlQXR0YWNobWVudEFubm90YXRpb24gZXh0ZW5kcyBNYXJrdXBBbm5vdGF0aW9uIHsKICBjb25zdHJ1Y3RvcihwYXJhbXMpIHsKICAgIHN1cGVyKHBhcmFtcyk7CiAgICBjb25zdCB7CiAgICAgIGRpY3QsCiAgICAgIHhyZWYKICAgIH0gPSBwYXJhbXM7CiAgICBjb25zdCBmaWxlID0gbmV3IF9maWxlX3NwZWMuRmlsZVNwZWMoZGljdC5nZXQoIkZTIiksIHhyZWYpOwogICAgdGhpcy5kYXRhLmFubm90YXRpb25UeXBlID0gX3V0aWwuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ7CiAgICB0aGlzLmRhdGEuaGFzT3duQ2FudmFzID0gdGhpcy5kYXRhLm5vUm90YXRlOwogICAgdGhpcy5kYXRhLmZpbGUgPSBmaWxlLnNlcmlhbGl6YWJsZTsKICAgIGNvbnN0IG5hbWUgPSBkaWN0LmdldCgiTmFtZSIpOwogICAgdGhpcy5kYXRhLm5hbWUgPSBuYW1lIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSA/ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykobmFtZS5uYW1lKSA6ICJQdXNoUGluIjsKICB9Cn0KCi8qKiovIH0pLAovKiAxMSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkZha2VVbmljb2RlRm9udCA9IHZvaWQgMDsKZXhwb3J0cy5jcmVhdGVEZWZhdWx0QXBwZWFyYW5jZSA9IGNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlOwpleHBvcnRzLmdldFBkZkNvbG9yID0gZ2V0UGRmQ29sb3I7CmV4cG9ydHMucGFyc2VEZWZhdWx0QXBwZWFyYW5jZSA9IHBhcnNlRGVmYXVsdEFwcGVhcmFuY2U7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29sb3JzcGFjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOwp2YXIgX2V2YWx1YXRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CmNsYXNzIERlZmF1bHRBcHBlYXJhbmNlRXZhbHVhdG9yIGV4dGVuZHMgX2V2YWx1YXRvci5FdmFsdWF0b3JQcmVwcm9jZXNzb3IgewogIGNvbnN0cnVjdG9yKHN0cikgewogICAgc3VwZXIobmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHN0cikpOwogIH0KICBwYXJzZSgpIHsKICAgIGNvbnN0IG9wZXJhdGlvbiA9IHsKICAgICAgZm46IDAsCiAgICAgIGFyZ3M6IFtdCiAgICB9OwogICAgY29uc3QgcmVzdWx0ID0gewogICAgICBmb250U2l6ZTogMCwKICAgICAgZm9udE5hbWU6ICIiLAogICAgICBmb250Q29sb3I6IG5ldyBVaW50OENsYW1wZWRBcnJheSgzKQogICAgfTsKICAgIHRyeSB7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MubGVuZ3RoID0gMDsKICAgICAgICBpZiAoIXRoaXMucmVhZChvcGVyYXRpb24pKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2F2ZWRTdGF0ZXNEZXB0aCAhPT0gMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGZuLAogICAgICAgICAgYXJncwogICAgICAgIH0gPSBvcGVyYXRpb247CiAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZvbnQ6CiAgICAgICAgICAgIGNvbnN0IFtmb250TmFtZSwgZm9udFNpemVdID0gYXJnczsKICAgICAgICAgICAgaWYgKGZvbnROYW1lIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICAgIHJlc3VsdC5mb250TmFtZSA9IGZvbnROYW1lLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBmb250U2l6ZSA9PT0gIm51bWJlciIgJiYgZm9udFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgcmVzdWx0LmZvbnRTaXplID0gZm9udFNpemU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I6CiAgICAgICAgICAgIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsR3JheToKICAgICAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JTcGFjZToKICAgICAgICAgICAgX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWsuZ2V0UmdiSXRlbShhcmdzLCAwLCByZXN1bHQuZm9udENvbG9yLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBwYXJzZURlZmF1bHRBcHBlYXJhbmNlIC0gaWdub3JpbmcgZXJyb3JzOiAiJHtyZWFzb259Ii5gKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CmZ1bmN0aW9uIHBhcnNlRGVmYXVsdEFwcGVhcmFuY2Uoc3RyKSB7CiAgcmV0dXJuIG5ldyBEZWZhdWx0QXBwZWFyYW5jZUV2YWx1YXRvcihzdHIpLnBhcnNlKCk7Cn0KZnVuY3Rpb24gZ2V0UGRmQ29sb3IoY29sb3IsIGlzRmlsbCkgewogIGlmIChjb2xvclswXSA9PT0gY29sb3JbMV0gJiYgY29sb3JbMV0gPT09IGNvbG9yWzJdKSB7CiAgICBjb25zdCBncmF5ID0gY29sb3JbMF0gLyAyNTU7CiAgICByZXR1cm4gYCR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShncmF5KX0gJHtpc0ZpbGwgPyAiZyIgOiAiRyJ9YDsKICB9CiAgcmV0dXJuIEFycmF5LmZyb20oY29sb3IsIGMgPT4gKDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShjIC8gMjU1KSkuam9pbigiICIpICsgYCAke2lzRmlsbCA/ICJyZyIgOiAiUkcifWA7Cn0KZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2UoewogIGZvbnRTaXplLAogIGZvbnROYW1lLAogIGZvbnRDb2xvcgp9KSB7CiAgcmV0dXJuIGAvJHsoMCwgX2NvcmVfdXRpbHMuZXNjYXBlUERGTmFtZSkoZm9udE5hbWUpfSAke2ZvbnRTaXplfSBUZiAke2dldFBkZkNvbG9yKGZvbnRDb2xvciwgdHJ1ZSl9YDsKfQpjbGFzcyBGYWtlVW5pY29kZUZvbnQgewogIGNvbnN0cnVjdG9yKHhyZWYsIGZvbnRGYW1pbHkpIHsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLndpZHRocyA9IG51bGw7CiAgICB0aGlzLmZpcnN0Q2hhciA9IEluZmluaXR5OwogICAgdGhpcy5sYXN0Q2hhciA9IC1JbmZpbml0eTsKICAgIHRoaXMuZm9udEZhbWlseSA9IGZvbnRGYW1pbHk7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpOwogICAgdGhpcy5jdHhNZWFzdXJlID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBpZiAoIUZha2VVbmljb2RlRm9udC5fZm9udE5hbWVJZCkgewogICAgICBGYWtlVW5pY29kZUZvbnQuX2ZvbnROYW1lSWQgPSAxOwogICAgfQogICAgdGhpcy5mb250TmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KGBJbnZhbGlkUERGanNGb250XyR7Zm9udEZhbWlseX1fJHtGYWtlVW5pY29kZUZvbnQuX2ZvbnROYW1lSWQrK31gKTsKICB9CiAgZ2V0IHRvVW5pY29kZVJlZigpIHsKICAgIGlmICghRmFrZVVuaWNvZGVGb250Ll90b1VuaWNvZGVSZWYpIHsKICAgICAgY29uc3QgdG9Vbmljb2RlID0gYC9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpbgoxMiBkaWN0IGJlZ2luCmJlZ2luY21hcAovQ0lEU3lzdGVtSW5mbwo8PCAvUmVnaXN0cnkgKEFkb2JlKQovT3JkZXJpbmcgKFVDUykgL1N1cHBsZW1lbnQgMCA+PiBkZWYKL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1VQ1MgZGVmCi9DTWFwVHlwZSAyIGRlZgoxIGJlZ2luY29kZXNwYWNlcmFuZ2UKPDAwMDA+IDxGRkZGPgplbmRjb2Rlc3BhY2VyYW5nZQoxIGJlZ2luYmZyYW5nZQo8MDAwMD4gPEZGRkY+IDwwMDAwPgplbmRiZnJhbmdlCmVuZGNtYXAgQ01hcE5hbWUgY3VycmVudGRpY3QgL0NNYXAgZGVmaW5lcmVzb3VyY2UgcG9wIGVuZCBlbmRgOwogICAgICBjb25zdCB0b1VuaWNvZGVTdHJlYW0gPSBGYWtlVW5pY29kZUZvbnQudG9Vbmljb2RlU3RyZWFtID0gbmV3IF9zdHJlYW0uU3RyaW5nU3RyZWFtKHRvVW5pY29kZSk7CiAgICAgIGNvbnN0IHRvVW5pY29kZURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgICB0b1VuaWNvZGVTdHJlYW0uZGljdCA9IHRvVW5pY29kZURpY3Q7CiAgICAgIHRvVW5pY29kZURpY3Quc2V0KCJMZW5ndGgiLCB0b1VuaWNvZGUubGVuZ3RoKTsKICAgICAgRmFrZVVuaWNvZGVGb250Ll90b1VuaWNvZGVSZWYgPSB0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZih0b1VuaWNvZGVTdHJlYW0pOwogICAgfQogICAgcmV0dXJuIEZha2VVbmljb2RlRm9udC5fdG9Vbmljb2RlUmVmOwogIH0KICBnZXQgZm9udERlc2NyaXB0b3JSZWYoKSB7CiAgICBpZiAoIUZha2VVbmljb2RlRm9udC5fZm9udERlc2NyaXB0b3JSZWYpIHsKICAgICAgY29uc3QgZm9udERlc2NyaXB0b3IgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRm9udERlc2NyaXB0b3IiKSk7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiRm9udE5hbWUiLCB0aGlzLmZvbnROYW1lKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250RmFtaWx5IiwgIk15cmlhZFBybyBSZWd1bGFyIik7CiAgICAgIGZvbnREZXNjcmlwdG9yLnNldCgiRm9udEJCb3giLCBbMCwgMCwgMCwgMF0pOwogICAgICBmb250RGVzY3JpcHRvci5zZXQoIkZvbnRTdHJldGNoIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIk5vcm1hbCIpKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJGb250V2VpZ2h0IiwgNDAwKTsKICAgICAgZm9udERlc2NyaXB0b3Iuc2V0KCJJdGFsaWNBbmdsZSIsIDApOwogICAgICBGYWtlVW5pY29kZUZvbnQuX2ZvbnREZXNjcmlwdG9yUmVmID0gdGhpcy54cmVmLmdldE5ld1BlcnNpc3RlbnRSZWYoZm9udERlc2NyaXB0b3IpOwogICAgfQogICAgcmV0dXJuIEZha2VVbmljb2RlRm9udC5fZm9udERlc2NyaXB0b3JSZWY7CiAgfQogIGdldCBkZXNjZW5kYW50Rm9udFJlZigpIHsKICAgIGNvbnN0IGRlc2NlbmRhbnRGb250ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QodGhpcy54cmVmKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiQmFzZUZvbnQiLCB0aGlzLmZvbnROYW1lKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250IikpOwogICAgZGVzY2VuZGFudEZvbnQuc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkNJREZvbnRUeXBlMCIpKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiQ0lEVG9HSURNYXAiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSWRlbnRpdHkiKSk7CiAgICBkZXNjZW5kYW50Rm9udC5zZXQoIkZpcnN0Q2hhciIsIHRoaXMuZmlyc3RDaGFyKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiTGFzdENoYXIiLCB0aGlzLmxhc3RDaGFyKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiRm9udERlc2NyaXB0b3IiLCB0aGlzLmZvbnREZXNjcmlwdG9yUmVmKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiRFciLCAxMDAwKTsKICAgIGNvbnN0IHdpZHRocyA9IFtdOwogICAgY29uc3QgY2hhcnMgPSBbLi4udGhpcy53aWR0aHMuZW50cmllcygpXS5zb3J0KCk7CiAgICBsZXQgY3VycmVudENoYXIgPSBudWxsOwogICAgbGV0IGN1cnJlbnRXaWR0aHMgPSBudWxsOwogICAgZm9yIChjb25zdCBbY2hhciwgd2lkdGhdIG9mIGNoYXJzKSB7CiAgICAgIGlmICghY3VycmVudENoYXIpIHsKICAgICAgICBjdXJyZW50Q2hhciA9IGNoYXI7CiAgICAgICAgY3VycmVudFdpZHRocyA9IFt3aWR0aF07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoYXIgPT09IGN1cnJlbnRDaGFyICsgY3VycmVudFdpZHRocy5sZW5ndGgpIHsKICAgICAgICBjdXJyZW50V2lkdGhzLnB1c2god2lkdGgpOwogICAgICB9IGVsc2UgewogICAgICAgIHdpZHRocy5wdXNoKGN1cnJlbnRDaGFyLCBjdXJyZW50V2lkdGhzKTsKICAgICAgICBjdXJyZW50Q2hhciA9IGNoYXI7CiAgICAgICAgY3VycmVudFdpZHRocyA9IFt3aWR0aF07CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50Q2hhcikgewogICAgICB3aWR0aHMucHVzaChjdXJyZW50Q2hhciwgY3VycmVudFdpZHRocyk7CiAgICB9CiAgICBkZXNjZW5kYW50Rm9udC5zZXQoIlciLCB3aWR0aHMpOwogICAgY29uc3QgY2lkU3lzdGVtSW5mbyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CiAgICBjaWRTeXN0ZW1JbmZvLnNldCgiT3JkZXJpbmciLCAiSWRlbnRpdHkiKTsKICAgIGNpZFN5c3RlbUluZm8uc2V0KCJSZWdpc3RyeSIsICJBZG9iZSIpOwogICAgY2lkU3lzdGVtSW5mby5zZXQoIlN1cHBsZW1lbnQiLCAwKTsKICAgIGRlc2NlbmRhbnRGb250LnNldCgiQ0lEU3lzdGVtSW5mbyIsIGNpZFN5c3RlbUluZm8pOwogICAgcmV0dXJuIHRoaXMueHJlZi5nZXROZXdQZXJzaXN0ZW50UmVmKGRlc2NlbmRhbnRGb250KTsKICB9CiAgZ2V0IGJhc2VGb250UmVmKCkgewogICAgY29uc3QgYmFzZUZvbnQgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgYmFzZUZvbnQuc2V0KCJCYXNlRm9udCIsIHRoaXMuZm9udE5hbWUpOwogICAgYmFzZUZvbnQuc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZvbnQiKSk7CiAgICBiYXNlRm9udC5zZXQoIlN1YnR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiVHlwZTAiKSk7CiAgICBiYXNlRm9udC5zZXQoIkVuY29kaW5nIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIklkZW50aXR5LUgiKSk7CiAgICBiYXNlRm9udC5zZXQoIkRlc2NlbmRhbnRGb250cyIsIFt0aGlzLmRlc2NlbmRhbnRGb250UmVmXSk7CiAgICBiYXNlRm9udC5zZXQoIlRvVW5pY29kZSIsIHRoaXMudG9Vbmljb2RlUmVmKTsKICAgIHJldHVybiB0aGlzLnhyZWYuZ2V0TmV3UGVyc2lzdGVudFJlZihiYXNlRm9udCk7CiAgfQogIGdldCByZXNvdXJjZXMoKSB7CiAgICBjb25zdCByZXNvdXJjZXMgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgY29uc3QgZm9udCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CiAgICBmb250LnNldCh0aGlzLmZvbnROYW1lLm5hbWUsIHRoaXMuYmFzZUZvbnRSZWYpOwogICAgcmVzb3VyY2VzLnNldCgiRm9udCIsIGZvbnQpOwogICAgcmV0dXJuIHJlc291cmNlczsKICB9CiAgX2NyZWF0ZUNvbnRleHQoKSB7CiAgICB0aGlzLndpZHRocyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuY3R4TWVhc3VyZS5mb250ID0gYDEwMDBweCAke3RoaXMuZm9udEZhbWlseX1gOwogICAgcmV0dXJuIHRoaXMuY3R4TWVhc3VyZTsKICB9CiAgY3JlYXRlRm9udFJlc291cmNlcyh0ZXh0KSB7CiAgICBjb25zdCBjdHggPSB0aGlzLl9jcmVhdGVDb250ZXh0KCk7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGV4dC5zcGxpdCgvXHJcbj98XG4vKSkgewogICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgbGluZS5zcGxpdCgiIikpIHsKICAgICAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApOwogICAgICAgIGlmICh0aGlzLndpZHRocy5oYXMoY29kZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXRyaWNzID0gY3R4Lm1lYXN1cmVUZXh0KGNoYXIpOwogICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKG1ldHJpY3Mud2lkdGgpOwogICAgICAgIHRoaXMud2lkdGhzLnNldChjb2RlLCB3aWR0aCk7CiAgICAgICAgdGhpcy5maXJzdENoYXIgPSBNYXRoLm1pbihjb2RlLCB0aGlzLmZpcnN0Q2hhcik7CiAgICAgICAgdGhpcy5sYXN0Q2hhciA9IE1hdGgubWF4KGNvZGUsIHRoaXMubGFzdENoYXIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXM7CiAgfQogIGNyZWF0ZUFwcGVhcmFuY2UodGV4dCwgcmVjdCwgcm90YXRpb24sIGZvbnRTaXplLCBiZ0NvbG9yLCBzdHJva2VBbHBoYSkgewogICAgY29uc3QgY3R4ID0gdGhpcy5fY3JlYXRlQ29udGV4dCgpOwogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGxldCBtYXhXaWR0aCA9IC1JbmZpbml0eTsKICAgIGZvciAoY29uc3QgbGluZSBvZiB0ZXh0LnNwbGl0KC9cclxuP3xcbi8pKSB7CiAgICAgIGxpbmVzLnB1c2gobGluZSk7CiAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChsaW5lKS53aWR0aDsKICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgbGluZVdpZHRoKTsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTsKICAgICAgICBsZXQgd2lkdGggPSB0aGlzLndpZHRocy5nZXQoY29kZSk7CiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoY2hhcik7CiAgICAgICAgICB3aWR0aCA9IE1hdGguY2VpbChtZXRyaWNzLndpZHRoKTsKICAgICAgICAgIHRoaXMud2lkdGhzLnNldChjb2RlLCB3aWR0aCk7CiAgICAgICAgICB0aGlzLmZpcnN0Q2hhciA9IE1hdGgubWluKGNvZGUsIHRoaXMuZmlyc3RDaGFyKTsKICAgICAgICAgIHRoaXMubGFzdENoYXIgPSBNYXRoLm1heChjb2RlLCB0aGlzLmxhc3RDaGFyKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1heFdpZHRoICo9IGZvbnRTaXplIC8gMTAwMDsKICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSByZWN0OwogICAgbGV0IHcgPSB4MiAtIHgxOwogICAgbGV0IGggPSB5MiAtIHkxOwogICAgaWYgKHJvdGF0aW9uICUgMTgwICE9PSAwKSB7CiAgICAgIFt3LCBoXSA9IFtoLCB3XTsKICAgIH0KICAgIGxldCBoc2NhbGUgPSAxOwogICAgaWYgKG1heFdpZHRoID4gdykgewogICAgICBoc2NhbGUgPSB3IC8gbWF4V2lkdGg7CiAgICB9CiAgICBsZXQgdnNjYWxlID0gMTsKICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBfdXRpbC5MSU5FX0ZBQ1RPUiAqIGZvbnRTaXplOwogICAgY29uc3QgbGluZURlc2NlbnQgPSBfdXRpbC5MSU5FX0RFU0NFTlRfRkFDVE9SICogZm9udFNpemU7CiAgICBjb25zdCBtYXhIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZXMubGVuZ3RoOwogICAgaWYgKG1heEhlaWdodCA+IGgpIHsKICAgICAgdnNjYWxlID0gaCAvIG1heEhlaWdodDsKICAgIH0KICAgIGNvbnN0IGZzY2FsZSA9IE1hdGgubWluKGhzY2FsZSwgdnNjYWxlKTsKICAgIGNvbnN0IG5ld0ZvbnRTaXplID0gZm9udFNpemUgKiBmc2NhbGU7CiAgICBjb25zdCBidWZmZXIgPSBbInEiLCBgMCAwICR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKSh3KX0gJHsoMCwgX2NvcmVfdXRpbHMubnVtYmVyVG9TdHJpbmcpKGgpfSByZSBXIG5gLCBgQlRgLCBgMSAwIDAgMSAwICR7KDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShoICsgbGluZURlc2NlbnQpfSBUbSAwIFRjICR7Z2V0UGRmQ29sb3IoYmdDb2xvciwgdHJ1ZSl9YCwgYC8ke3RoaXMuZm9udE5hbWUubmFtZX0gJHsoMCwgX2NvcmVfdXRpbHMubnVtYmVyVG9TdHJpbmcpKG5ld0ZvbnRTaXplKX0gVGZgXTsKICAgIGNvbnN0IHsKICAgICAgcmVzb3VyY2VzCiAgICB9ID0gdGhpczsKICAgIHN0cm9rZUFscGhhID0gdHlwZW9mIHN0cm9rZUFscGhhID09PSAibnVtYmVyIiAmJiBzdHJva2VBbHBoYSA+PSAwICYmIHN0cm9rZUFscGhhIDw9IDEgPyBzdHJva2VBbHBoYSA6IDE7CiAgICBpZiAoc3Ryb2tlQWxwaGEgIT09IDEpIHsKICAgICAgYnVmZmVyLnB1c2goIi9SMCBncyIpOwogICAgICBjb25zdCBleHRHU3RhdGUgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgICBjb25zdCByMCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CiAgICAgIHIwLnNldCgiY2EiLCBzdHJva2VBbHBoYSk7CiAgICAgIHIwLnNldCgiQ0EiLCBzdHJva2VBbHBoYSk7CiAgICAgIHIwLnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJFeHRHU3RhdGUiKSk7CiAgICAgIGV4dEdTdGF0ZS5zZXQoIlIwIiwgcjApOwogICAgICByZXNvdXJjZXMuc2V0KCJFeHRHU3RhdGUiLCBleHRHU3RhdGUpOwogICAgfQogICAgY29uc3QgdlNoaWZ0ID0gKDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKShsaW5lSGVpZ2h0KTsKICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICBidWZmZXIucHVzaChgMCAtJHt2U2hpZnR9IFRkIDwkeygwLCBfY29yZV91dGlscy5zdHJpbmdUb1VURjE2SGV4U3RyaW5nKShsaW5lKX0+IFRqYCk7CiAgICB9CiAgICBidWZmZXIucHVzaCgiRVQiLCAiUSIpOwogICAgY29uc3QgYXBwZWFyYW5jZSA9IGJ1ZmZlci5qb2luKCJcbiIpOwogICAgY29uc3QgYXBwZWFyYW5jZVN0cmVhbURpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZvcm0iKSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiWE9iamVjdCIpKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiQkJveCIsIFswLCAwLCB3LCBoXSk7CiAgICBhcHBlYXJhbmNlU3RyZWFtRGljdC5zZXQoIkxlbmd0aCIsIGFwcGVhcmFuY2UubGVuZ3RoKTsKICAgIGFwcGVhcmFuY2VTdHJlYW1EaWN0LnNldCgiUmVzb3VyY2VzIiwgcmVzb3VyY2VzKTsKICAgIGlmIChyb3RhdGlvbikgewogICAgICBjb25zdCBtYXRyaXggPSAoMCwgX2NvcmVfdXRpbHMuZ2V0Um90YXRpb25NYXRyaXgpKHJvdGF0aW9uLCB3LCBoKTsKICAgICAgYXBwZWFyYW5jZVN0cmVhbURpY3Quc2V0KCJNYXRyaXgiLCBtYXRyaXgpOwogICAgfQogICAgY29uc3QgYXAgPSBuZXcgX3N0cmVhbS5TdHJpbmdTdHJlYW0oYXBwZWFyYW5jZSk7CiAgICBhcC5kaWN0ID0gYXBwZWFyYW5jZVN0cmVhbURpY3Q7CiAgICByZXR1cm4gYXA7CiAgfQp9CmV4cG9ydHMuRmFrZVVuaWNvZGVGb250ID0gRmFrZVVuaWNvZGVGb250OwoKLyoqKi8gfSksCi8qIDEyICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuQ29sb3JTcGFjZSA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CmZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKHNyYywgZGVzdCwgdzEsIGgxLCB3MiwgaDIsIGFscGhhMDEpIHsKICBjb25zdCBDT01QT05FTlRTID0gMzsKICBhbHBoYTAxID0gYWxwaGEwMSAhPT0gMSA/IDAgOiBhbHBoYTAxOwogIGNvbnN0IHhSYXRpbyA9IHcxIC8gdzI7CiAgY29uc3QgeVJhdGlvID0gaDEgLyBoMjsKICBsZXQgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxICogQ09NUE9ORU5UUzsKICBmb3IgKGxldCBpID0gMDsgaSA8IHcyOyBpKyspIHsKICAgIHhTY2FsZWRbaV0gPSBNYXRoLmZsb29yKGkgKiB4UmF0aW8pICogQ09NUE9ORU5UUzsKICB9CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoMjsgaSsrKSB7CiAgICBjb25zdCBweSA9IE1hdGguZmxvb3IoaSAqIHlSYXRpbykgKiB3MVNjYW5saW5lOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3MjsgaisrKSB7CiAgICAgIG9sZEluZGV4ID0gcHkgKyB4U2NhbGVkW2pdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBkZXN0W25ld0luZGV4KytdID0gc3JjW29sZEluZGV4KytdOwogICAgICBuZXdJbmRleCArPSBhbHBoYTAxOwogICAgfQogIH0KfQpjbGFzcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcihuYW1lLCBudW1Db21wcykgewogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IENvbG9yU3BhY2UpIHsKICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29sb3JTcGFjZS4iKTsKICAgIH0KICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICB0aGlzLm51bUNvbXBzID0gbnVtQ29tcHM7CiAgfQogIGdldFJnYihzcmMsIHNyY09mZnNldCkgewogICAgY29uc3QgcmdiID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpOwogICAgdGhpcy5nZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCByZ2IsIDApOwogICAgcmV0dXJuIHJnYjsKICB9CiAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0UmdiSXRlbSIpOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKTsKICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRPdXRwdXRMZW5ndGgiKTsKICB9CiAgaXNQYXNzdGhyb3VnaChiaXRzKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgewogICAgcmV0dXJuIENvbG9yU3BhY2UuaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgdGhpcy5udW1Db21wcyk7CiAgfQogIGZpbGxSZ2IoZGVzdCwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIGFjdHVhbEhlaWdodCwgYnBjLCBjb21wcywgYWxwaGEwMSkgewogICAgY29uc3QgY291bnQgPSBvcmlnaW5hbFdpZHRoICogb3JpZ2luYWxIZWlnaHQ7CiAgICBsZXQgcmdiQnVmID0gbnVsbDsKICAgIGNvbnN0IG51bUNvbXBvbmVudENvbG9ycyA9IDEgPDwgYnBjOwogICAgY29uc3QgbmVlZHNSZXNpemluZyA9IG9yaWdpbmFsSGVpZ2h0ICE9PSBoZWlnaHQgfHwgb3JpZ2luYWxXaWR0aCAhPT0gd2lkdGg7CiAgICBpZiAodGhpcy5pc1Bhc3N0aHJvdWdoKGJwYykpIHsKICAgICAgcmdiQnVmID0gY29tcHM7CiAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcHMgPT09IDEgJiYgY291bnQgPiBudW1Db21wb25lbnRDb2xvcnMgJiYgdGhpcy5uYW1lICE9PSAiRGV2aWNlR3JheSIgJiYgdGhpcy5uYW1lICE9PSAiRGV2aWNlUkdCIikgewogICAgICBjb25zdCBhbGxDb2xvcnMgPSBicGMgPD0gOCA/IG5ldyBVaW50OEFycmF5KG51bUNvbXBvbmVudENvbG9ycykgOiBuZXcgVWludDE2QXJyYXkobnVtQ29tcG9uZW50Q29sb3JzKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRDb2xvcnM7IGkrKykgewogICAgICAgIGFsbENvbG9yc1tpXSA9IGk7CiAgICAgIH0KICAgICAgY29uc3QgY29sb3JNYXAgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobnVtQ29tcG9uZW50Q29sb3JzICogMyk7CiAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGFsbENvbG9ycywgMCwgbnVtQ29tcG9uZW50Q29sb3JzLCBjb2xvck1hcCwgMCwgYnBjLCAwKTsKICAgICAgaWYgKCFuZWVkc1Jlc2l6aW5nKSB7CiAgICAgICAgbGV0IGRlc3RQb3MgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgICAgY29uc3Qga2V5ID0gY29tcHNbaV0gKiAzOwogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gY29sb3JNYXBba2V5XTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGNvbG9yTWFwW2tleSArIDFdOwogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gY29sb3JNYXBba2V5ICsgMl07CiAgICAgICAgICBkZXN0UG9zICs9IGFscGhhMDE7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJnYkJ1ZiA9IG5ldyBVaW50OEFycmF5KGNvdW50ICogMyk7CiAgICAgICAgbGV0IHJnYlBvcyA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICBjb25zdCBrZXkgPSBjb21wc1tpXSAqIDM7CiAgICAgICAgICByZ2JCdWZbcmdiUG9zKytdID0gY29sb3JNYXBba2V5XTsKICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAxXTsKICAgICAgICAgIHJnYkJ1ZltyZ2JQb3MrK10gPSBjb2xvck1hcFtrZXkgKyAyXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICghbmVlZHNSZXNpemluZykgewogICAgICAgIHRoaXMuZ2V0UmdiQnVmZmVyKGNvbXBzLCAwLCB3aWR0aCAqIGFjdHVhbEhlaWdodCwgZGVzdCwgMCwgYnBjLCBhbHBoYTAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZ2JCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoY291bnQgKiAzKTsKICAgICAgICB0aGlzLmdldFJnYkJ1ZmZlcihjb21wcywgMCwgY291bnQsIHJnYkJ1ZiwgMCwgYnBjLCAwKTsKICAgICAgfQogICAgfQogICAgaWYgKHJnYkJ1ZikgewogICAgICBpZiAobmVlZHNSZXNpemluZykgewogICAgICAgIHJlc2l6ZVJnYkltYWdlKHJnYkJ1ZiwgZGVzdCwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIHdpZHRoLCBoZWlnaHQsIGFscGhhMDEpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXN0UG9zID0gMCwKICAgICAgICAgIHJnYlBvcyA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gd2lkdGggKiBhY3R1YWxIZWlnaHQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSByZ2JCdWZbcmdiUG9zKytdOwogICAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gcmdiQnVmW3JnYlBvcysrXTsKICAgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHJnYkJ1ZltyZ2JQb3MrK107CiAgICAgICAgICBkZXN0UG9zICs9IGFscGhhMDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInVzZXNaZXJvVG9PbmVSYW5nZSIsIHRydWUpOwogIH0KICBzdGF0aWMgX2NhY2hlKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSkgewogICAgaWYgKCFsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICghcGFyc2VkQ29sb3JTcGFjZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuX2NhY2hlIC0gZXhwZWN0ZWQgInBhcnNlZENvbG9yU3BhY2UiIGFyZ3VtZW50LicpOwogICAgfQogICAgbGV0IGNzTmFtZSwgY3NSZWY7CiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgY3NSZWYgPSBjYWNoZUtleTsKICAgICAgY2FjaGVLZXkgPSB4cmVmLmZldGNoKGNhY2hlS2V5KTsKICAgIH0KICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgY3NOYW1lID0gY2FjaGVLZXkubmFtZTsKICAgIH0KICAgIGlmIChjc05hbWUgfHwgY3NSZWYpIHsKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUuc2V0KGNzTmFtZSwgY3NSZWYsIHBhcnNlZENvbG9yU3BhY2UpOwogICAgfQogIH0KICBzdGF0aWMgZ2V0Q2FjaGVkKGNhY2hlS2V5LCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgaWYgKCFsb2NhbENvbG9yU3BhY2VDYWNoZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbG9yU3BhY2UuZ2V0Q2FjaGVkIC0gZXhwZWN0ZWQgImxvY2FsQ29sb3JTcGFjZUNhY2hlIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICBjb25zdCBsb2NhbENvbG9yU3BhY2UgPSBsb2NhbENvbG9yU3BhY2VDYWNoZS5nZXRCeVJlZihjYWNoZUtleSk7CiAgICAgIGlmIChsb2NhbENvbG9yU3BhY2UpIHsKICAgICAgICByZXR1cm4gbG9jYWxDb2xvclNwYWNlOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgY2FjaGVLZXkgPSB4cmVmLmZldGNoKGNhY2hlS2V5KTsKICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgIGNvbnN0IGxvY2FsQ29sb3JTcGFjZSA9IGxvY2FsQ29sb3JTcGFjZUNhY2hlLmdldEJ5TmFtZShjYWNoZUtleS5uYW1lKTsKICAgICAgaWYgKGxvY2FsQ29sb3JTcGFjZSkgewogICAgICAgIHJldHVybiBsb2NhbENvbG9yU3BhY2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBzdGF0aWMgYXN5bmMgcGFyc2VBc3luYyh7CiAgICBjcywKICAgIHhyZWYsCiAgICByZXNvdXJjZXMgPSBudWxsLAogICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBwYXJzZWRDb2xvclNwYWNlID0gdGhpcy5fcGFyc2UoY3MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICAgIHRoaXMuX2NhY2hlKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSk7CiAgICByZXR1cm4gcGFyc2VkQ29sb3JTcGFjZTsKICB9CiAgc3RhdGljIHBhcnNlKHsKICAgIGNzLAogICAgeHJlZiwKICAgIHJlc291cmNlcyA9IG51bGwsCiAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSB0aGlzLmdldENhY2hlZChjcywgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgaWYgKGNhY2hlZENvbG9yU3BhY2UpIHsKICAgICAgcmV0dXJuIGNhY2hlZENvbG9yU3BhY2U7CiAgICB9CiAgICBjb25zdCBwYXJzZWRDb2xvclNwYWNlID0gdGhpcy5fcGFyc2UoY3MsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICAgIHRoaXMuX2NhY2hlKGNzLCB4cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgcGFyc2VkQ29sb3JTcGFjZSk7CiAgICByZXR1cm4gcGFyc2VkQ29sb3JTcGFjZTsKICB9CiAgc3RhdGljIF9wYXJzZShjcywgeHJlZiwgcmVzb3VyY2VzID0gbnVsbCwgcGRmRnVuY3Rpb25GYWN0b3J5KSB7CiAgICBjcyA9IHhyZWYuZmV0Y2hJZlJlZihjcyk7CiAgICBpZiAoY3MgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgIHN3aXRjaCAoY3MubmFtZSkgewogICAgICAgIGNhc2UgIkciOgogICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OwogICAgICAgIGNhc2UgIlJHQiI6CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiOwogICAgICAgIGNhc2UgIkNNWUsiOgogICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOwogICAgICAgIGNhc2UgIlBhdHRlcm4iOgogICAgICAgICAgcmV0dXJuIG5ldyBQYXR0ZXJuQ1MobnVsbCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmIChyZXNvdXJjZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvbG9yU3BhY2VzID0gcmVzb3VyY2VzLmdldCgiQ29sb3JTcGFjZSIpOwogICAgICAgICAgICBpZiAoY29sb3JTcGFjZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzQ1MgPSBjb2xvclNwYWNlcy5nZXQoY3MubmFtZSk7CiAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NTKSB7CiAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzQ1MgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZShyZXNvdXJjZXNDUywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3MgPSByZXNvdXJjZXNDUzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbnJlY29nbml6ZWQgQ29sb3JTcGFjZTogJHtjcy5uYW1lfWApOwogICAgICB9CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShjcykpIHsKICAgICAgY29uc3QgbW9kZSA9IHhyZWYuZmV0Y2hJZlJlZihjc1swXSkubmFtZTsKICAgICAgbGV0IHBhcmFtcywgbnVtQ29tcHMsIGJhc2VDUywgd2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWE7CiAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgIGNhc2UgIkciOgogICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5ncmF5OwogICAgICAgIGNhc2UgIlJHQiI6CiAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiOwogICAgICAgIGNhc2UgIkNNWUsiOgogICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgcmV0dXJuIHRoaXMuc2luZ2xldG9ucy5jbXlrOwogICAgICAgIGNhc2UgIkNhbEdyYXkiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldCgiR2FtbWEiKTsKICAgICAgICAgIHJldHVybiBuZXcgQ2FsR3JheUNTKHdoaXRlUG9pbnQsIGJsYWNrUG9pbnQsIGdhbW1hKTsKICAgICAgICBjYXNlICJDYWxSR0IiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGdhbW1hID0gcGFyYW1zLmdldEFycmF5KCJHYW1tYSIpOwogICAgICAgICAgY29uc3QgbWF0cml4ID0gcGFyYW1zLmdldEFycmF5KCJNYXRyaXgiKTsKICAgICAgICAgIHJldHVybiBuZXcgQ2FsUkdCQ1Mod2hpdGVQb2ludCwgYmxhY2tQb2ludCwgZ2FtbWEsIG1hdHJpeCk7CiAgICAgICAgY2FzZSAiSUNDQmFzZWQiOgogICAgICAgICAgY29uc3Qgc3RyZWFtID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIGNvbnN0IGRpY3QgPSBzdHJlYW0uZGljdDsKICAgICAgICAgIG51bUNvbXBzID0gZGljdC5nZXQoIk4iKTsKICAgICAgICAgIGNvbnN0IGFsdCA9IGRpY3QuZ2V0KCJBbHRlcm5hdGUiKTsKICAgICAgICAgIGlmIChhbHQpIHsKICAgICAgICAgICAgY29uc3QgYWx0Q1MgPSB0aGlzLl9wYXJzZShhbHQsIHhyZWYsIHJlc291cmNlcywgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICAgICAgICAgICAgaWYgKGFsdENTLm51bUNvbXBzID09PSBudW1Db21wcykgewogICAgICAgICAgICAgIHJldHVybiBhbHRDUzsKICAgICAgICAgICAgfQogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIklDQ0Jhc2VkIGNvbG9yIHNwYWNlOiBJZ25vcmluZyBpbmNvcnJlY3QgL0FsdGVybmF0ZSBlbnRyeS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChudW1Db21wcyA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmdyYXk7CiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNvbXBzID09PSAzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpbmdsZXRvbnMucmdiOwogICAgICAgICAgfSBlbHNlIGlmIChudW1Db21wcyA9PT0gNCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b25zLmNteWs7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQYXR0ZXJuIjoKICAgICAgICAgIGJhc2VDUyA9IGNzWzFdIHx8IG51bGw7CiAgICAgICAgICBpZiAoYmFzZUNTKSB7CiAgICAgICAgICAgIGJhc2VDUyA9IHRoaXMuX3BhcnNlKGJhc2VDUywgeHJlZiwgcmVzb3VyY2VzLCBwZGZGdW5jdGlvbkZhY3RvcnkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBQYXR0ZXJuQ1MoYmFzZUNTKTsKICAgICAgICBjYXNlICJJIjoKICAgICAgICBjYXNlICJJbmRleGVkIjoKICAgICAgICAgIGJhc2VDUyA9IHRoaXMuX3BhcnNlKGNzWzFdLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CiAgICAgICAgICBjb25zdCBoaVZhbCA9IHhyZWYuZmV0Y2hJZlJlZihjc1syXSkgKyAxOwogICAgICAgICAgY29uc3QgbG9va3VwID0geHJlZi5mZXRjaElmUmVmKGNzWzNdKTsKICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhlZENTKGJhc2VDUywgaGlWYWwsIGxvb2t1cCk7CiAgICAgICAgY2FzZSAiU2VwYXJhdGlvbiI6CiAgICAgICAgY2FzZSAiRGV2aWNlTiI6CiAgICAgICAgICBjb25zdCBuYW1lID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIG51bUNvbXBzID0gQXJyYXkuaXNBcnJheShuYW1lKSA/IG5hbWUubGVuZ3RoIDogMTsKICAgICAgICAgIGJhc2VDUyA9IHRoaXMuX3BhcnNlKGNzWzJdLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSk7CiAgICAgICAgICBjb25zdCB0aW50Rm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKGNzWzNdKTsKICAgICAgICAgIHJldHVybiBuZXcgQWx0ZXJuYXRlQ1MobnVtQ29tcHMsIGJhc2VDUywgdGludEZuKTsKICAgICAgICBjYXNlICJMYWIiOgogICAgICAgICAgcGFyYW1zID0geHJlZi5mZXRjaElmUmVmKGNzWzFdKTsKICAgICAgICAgIHdoaXRlUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKICAgICAgICAgIGJsYWNrUG9pbnQgPSBwYXJhbXMuZ2V0QXJyYXkoIkJsYWNrUG9pbnQiKTsKICAgICAgICAgIGNvbnN0IHJhbmdlID0gcGFyYW1zLmdldEFycmF5KCJSYW5nZSIpOwogICAgICAgICAgcmV0dXJuIG5ldyBMYWJDUyh3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5pbXBsZW1lbnRlZCBDb2xvclNwYWNlIG9iamVjdDogJHttb2RlfWApOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVucmVjb2duaXplZCBDb2xvclNwYWNlIG9iamVjdDogJHtjc31gKTsKICB9CiAgc3RhdGljIGlzRGVmYXVsdERlY29kZShkZWNvZGUsIG51bUNvbXBzKSB7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjb2RlKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmIChudW1Db21wcyAqIDIgIT09IGRlY29kZS5sZW5ndGgpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJUaGUgZGVjb2RlIG1hcCBpcyBub3QgdGhlIGNvcnJlY3QgbGVuZ3RoIik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGVjb2RlLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgaWYgKGRlY29kZVtpXSAhPT0gMCB8fCBkZWNvZGVbaSArIDFdICE9PSAxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgc3RhdGljIGdldCBzaW5nbGV0b25zKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzaW5nbGV0b25zIiwgewogICAgICBnZXQgZ3JheSgpIHsKICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImdyYXkiLCBuZXcgRGV2aWNlR3JheUNTKCkpOwogICAgICB9LAogICAgICBnZXQgcmdiKCkgewogICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAicmdiIiwgbmV3IERldmljZVJnYkNTKCkpOwogICAgICB9LAogICAgICBnZXQgY215aygpIHsKICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImNteWsiLCBuZXcgRGV2aWNlQ215a0NTKCkpOwogICAgICB9CiAgICB9KTsKICB9Cn0KZXhwb3J0cy5Db2xvclNwYWNlID0gQ29sb3JTcGFjZTsKY2xhc3MgQWx0ZXJuYXRlQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcihudW1Db21wcywgYmFzZSwgdGludEZuKSB7CiAgICBzdXBlcigiQWx0ZXJuYXRlIiwgbnVtQ29tcHMpOwogICAgdGhpcy5iYXNlID0gYmFzZTsKICAgIHRoaXMudGludEZuID0gdGludEZuOwogICAgdGhpcy50bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KGJhc2UubnVtQ29tcHMpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCB0bXBCdWYgPSB0aGlzLnRtcEJ1ZjsKICAgIHRoaXMudGludEZuKHNyYywgc3JjT2Zmc2V0LCB0bXBCdWYsIDApOwogICAgdGhpcy5iYXNlLmdldFJnYkl0ZW0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICB9CiAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgY29uc3QgdGludEZuID0gdGhpcy50aW50Rm47CiAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlOwogICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBjb25zdCBiYXNlTnVtQ29tcHMgPSBiYXNlLm51bUNvbXBzOwogICAgY29uc3QgdXNlc1plcm9Ub09uZVJhbmdlID0gYmFzZS51c2VzWmVyb1RvT25lUmFuZ2U7CiAgICBjb25zdCBpc1Bhc3N0aHJvdWdoID0gKGJhc2UuaXNQYXNzdGhyb3VnaCg4KSB8fCAhdXNlc1plcm9Ub09uZVJhbmdlKSAmJiBhbHBoYTAxID09PSAwOwogICAgbGV0IHBvcyA9IGlzUGFzc3Rocm91Z2ggPyBkZXN0T2Zmc2V0IDogMDsKICAgIGNvbnN0IGJhc2VCdWYgPSBpc1Bhc3N0aHJvdWdoID8gZGVzdCA6IG5ldyBVaW50OENsYW1wZWRBcnJheShiYXNlTnVtQ29tcHMgKiBjb3VudCk7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CiAgICBjb25zdCBzY2FsZWQgPSBuZXcgRmxvYXQzMkFycmF5KG51bUNvbXBzKTsKICAgIGNvbnN0IHRpbnRlZCA9IG5ldyBGbG9hdDMyQXJyYXkoYmFzZU51bUNvbXBzKTsKICAgIGxldCBpLCBqOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IG51bUNvbXBzOyBqKyspIHsKICAgICAgICBzY2FsZWRbal0gPSBzcmNbc3JjT2Zmc2V0KytdICogc2NhbGU7CiAgICAgIH0KICAgICAgdGludEZuKHNjYWxlZCwgMCwgdGludGVkLCAwKTsKICAgICAgaWYgKHVzZXNaZXJvVG9PbmVSYW5nZSkgewogICAgICAgIGZvciAoaiA9IDA7IGogPCBiYXNlTnVtQ29tcHM7IGorKykgewogICAgICAgICAgYmFzZUJ1Zltwb3MrK10gPSB0aW50ZWRbal0gKiAyNTU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGJhc2UuZ2V0UmdiSXRlbSh0aW50ZWQsIDAsIGJhc2VCdWYsIHBvcyk7CiAgICAgICAgcG9zICs9IGJhc2VOdW1Db21wczsKICAgICAgfQogICAgfQogICAgaWYgKCFpc1Bhc3N0aHJvdWdoKSB7CiAgICAgIGJhc2UuZ2V0UmdiQnVmZmVyKGJhc2VCdWYsIDAsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCBhbHBoYTAxKTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcyAvIHRoaXMubnVtQ29tcHMsIGFscGhhMDEpOwogIH0KfQpjbGFzcyBQYXR0ZXJuQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICBjb25zdHJ1Y3RvcihiYXNlQ1MpIHsKICAgIHN1cGVyKCJQYXR0ZXJuIiwgbnVsbCk7CiAgICB0aGlzLmJhc2UgPSBiYXNlQ1M7CiAgfQogIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIFBhdHRlcm5DUy5pc0RlZmF1bHREZWNvZGUiKTsKICB9Cn0KY2xhc3MgSW5kZXhlZENTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoYmFzZSwgaGlnaFZhbCwgbG9va3VwKSB7CiAgICBzdXBlcigiSW5kZXhlZCIsIDEpOwogICAgdGhpcy5iYXNlID0gYmFzZTsKICAgIHRoaXMuaGlnaFZhbCA9IGhpZ2hWYWw7CiAgICBjb25zdCBsZW5ndGggPSBiYXNlLm51bUNvbXBzICogaGlnaFZhbDsKICAgIHRoaXMubG9va3VwID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsKICAgIGlmIChsb29rdXAgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgICBjb25zdCBieXRlcyA9IGxvb2t1cC5nZXRCeXRlcyhsZW5ndGgpOwogICAgICB0aGlzLmxvb2t1cC5zZXQoYnl0ZXMpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbG9va3VwID09PSAic3RyaW5nIikgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgdGhpcy5sb29rdXBbaV0gPSBsb29rdXAuY2hhckNvZGVBdChpKSAmIDB4ZmY7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW5kZXhlZENTIC0gdW5yZWNvZ25pemVkIGxvb2t1cCB0YWJsZTogJHtsb29rdXB9YCk7CiAgICB9CiAgfQogIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5iYXNlLm51bUNvbXBzOwogICAgY29uc3Qgc3RhcnQgPSBzcmNbc3JjT2Zmc2V0XSAqIG51bUNvbXBzOwogICAgdGhpcy5iYXNlLmdldFJnYkJ1ZmZlcih0aGlzLmxvb2t1cCwgc3RhcnQsIDEsIGRlc3QsIGRlc3RPZmZzZXQsIDgsIDApOwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlOwogICAgY29uc3QgbnVtQ29tcHMgPSBiYXNlLm51bUNvbXBzOwogICAgY29uc3Qgb3V0cHV0RGVsdGEgPSBiYXNlLmdldE91dHB1dExlbmd0aChudW1Db21wcywgYWxwaGEwMSk7CiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBjb25zdCBsb29rdXBQb3MgPSBzcmNbc3JjT2Zmc2V0KytdICogbnVtQ29tcHM7CiAgICAgIGJhc2UuZ2V0UmdiQnVmZmVyKGxvb2t1cCwgbG9va3VwUG9zLCAxLCBkZXN0LCBkZXN0T2Zmc2V0LCA4LCBhbHBoYTAxKTsKICAgICAgZGVzdE9mZnNldCArPSBvdXRwdXREZWx0YTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gdGhpcy5iYXNlLmdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCAqIHRoaXMuYmFzZS5udW1Db21wcywgYWxwaGEwMSk7CiAgfQogIGlzRGVmYXVsdERlY29kZShkZWNvZGVNYXAsIGJwYykgewogICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZU1hcCkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoZGVjb2RlTWFwLmxlbmd0aCAhPT0gMikgewogICAgICAoMCwgX3V0aWwud2FybikoIkRlY29kZSBtYXAgbGVuZ3RoIGlzIG5vdCBjb3JyZWN0Iik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGJwYykgfHwgYnBjIDwgMSkgewogICAgICAoMCwgX3V0aWwud2FybikoIkJpdHMgcGVyIGNvbXBvbmVudCBpcyBub3QgY29ycmVjdCIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVNYXBbMF0gPT09IDAgJiYgZGVjb2RlTWFwWzFdID09PSAoMSA8PCBicGMpIC0gMTsKICB9Cn0KY2xhc3MgRGV2aWNlR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBzdXBlcigiRGV2aWNlR3JheSIsIDEpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBjb25zdCBjID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IGM7CiAgfQogIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICBsZXQgaiA9IHNyY09mZnNldCwKICAgICAgcSA9IGRlc3RPZmZzZXQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgY29uc3QgYyA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIGRlc3RbcSsrXSA9IGM7CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpOwogIH0KfQpjbGFzcyBEZXZpY2VSZ2JDUyBleHRlbmRzIENvbG9yU3BhY2UgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoIkRldmljZVJHQiIsIDMpOwogIH0KICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gc3JjW3NyY09mZnNldF0gKiAyNTU7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAxXSA9IHNyY1tzcmNPZmZzZXQgKyAxXSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc3JjW3NyY09mZnNldCArIDJdICogMjU1OwogIH0KICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICBpZiAoYml0cyA9PT0gOCAmJiBhbHBoYTAxID09PSAwKSB7CiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50ICogMyksIGRlc3RPZmZzZXQpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzY2FsZSA9IDI1NSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgbGV0IGogPSBzcmNPZmZzZXQsCiAgICAgIHEgPSBkZXN0T2Zmc2V0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIGRlc3RbcSsrXSA9IHNjYWxlICogc3JjW2orK107CiAgICAgIHEgKz0gYWxwaGEwMTsKICAgIH0KICB9CiAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CiAgfQogIGlzUGFzc3Rocm91Z2goYml0cykgewogICAgcmV0dXJuIGJpdHMgPT09IDg7CiAgfQp9CmNvbnN0IERldmljZUNteWtDUyA9IGZ1bmN0aW9uIERldmljZUNteWtDU0Nsb3N1cmUoKSB7CiAgZnVuY3Rpb24gY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzcmNTY2FsZSwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgY29uc3QgYyA9IHNyY1tzcmNPZmZzZXRdICogc3JjU2NhbGU7CiAgICBjb25zdCBtID0gc3JjW3NyY09mZnNldCArIDFdICogc3JjU2NhbGU7CiAgICBjb25zdCB5ID0gc3JjW3NyY09mZnNldCArIDJdICogc3JjU2NhbGU7CiAgICBjb25zdCBrID0gc3JjW3NyY09mZnNldCArIDNdICogc3JjU2NhbGU7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gMjU1ICsgYyAqICgtNC4zODczMzIzODQ2MDk5ODggKiBjICsgNTQuNDg2MTUxOTQxODkxNzYgKiBtICsgMTguODIyOTA1MDIxNjUzMDIgKiB5ICsgMjEyLjI1NjYyNDUxNjM5NTg1ICogayArIC0yODUuMjMzMTAyNjEzNzAwNCkgKyBtICogKDEuNzE0OTc2MzQ3NzM2MjEzNCAqIG0gLSA1LjYwOTY3MzY5MDQwNDczMTUgKiB5ICsgLTE3Ljg3Mzg3MDg2MTQxNTQ0NCAqIGsgLSA1LjQ5NzAwNjQyNzE5NjM2NikgKyB5ICogKC0yLjUyMTczNDAxMzE2ODMwMzMgKiB5IC0gMjEuMjQ4OTIzMzM3MzUzMDczICogayArIDE3LjUxMTkyNzA4NDE4MTMpICsgayAqICgtMjEuODYxMjIxNDc0NjM2MDUgKiBrIC0gMTg5LjQ4MTgwODM1OTIyNzQ3KTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gMjU1ICsgYyAqICg4Ljg0MTA0MTQyMjAzNjE0OSAqIGMgKyA2MC4xMTgwMjcwNDU1OTczNjYgKiBtICsgNi44NzE0MjU1OTIwNDkwMDcgKiB5ICsgMzEuMTU5MTAwMTMwMDU1OTIyICogayArIC03OS4yOTcwODQ0ODE2NTQ4KSArIG0gKiAoLTE1LjMxMDM2MTMwNjk2NzgxNyAqIG0gKyAxNy41NzUyNTEyNjExMDk0ODIgKiB5ICsgMTMxLjM1MjUwOTEyNDkzOTc2ICogayAtIDE5MC45NDUzMzAyNTg4OTUxKSArIHkgKiAoNC40NDQzMzkxMDI4NTI3MzkgKiB5ICsgOS44NjMyODYxNDkzNDA1ICogayAtIDI0Ljg2NzQxNTgyNTU1ODc4KSArIGsgKiAoLTIwLjczNzMyNTQ3MTE4MTAzNCAqIGsgLSAxODcuODA0NTM3MDk3MTk1NzgpOwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSAyNTUgKyBjICogKDAuODg0MjUyMjQzMDAwMzI5NiAqIGMgKyA4LjA3ODY3NzUwMzExMjkyOCAqIG0gKyAzMC44OTk3ODMwOTcwMzcyOSAqIHkgLSAwLjIzODgzMjM4Njg5MTc4OTM0ICogayArIC0xNC4xODM1NzY3OTk2NzMyODYpICsgbSAqICgxMC40OTU5MzI3MzQzMjA3MiAqIG0gKyA2My4wMjM3ODQ5NDc1NDA1MiAqIHkgKyA1MC42MDY5NTc2NTYzNjA3MzQgKiBrIC0gMTEyLjIzODg0MjUzNzE5MjQ4KSArIHkgKiAoMC4wMzI5NjA0MTExNDg3MzIxNyAqIHkgKyAxMTUuNjAzODQ0NDk2NDY2NDEgKiBrICsgLTE5My41ODIwOTM1Njg2MTUwNSkgKyBrICogKC0yMi4zMzgxNjgwNzMwOTg4NiAqIGsgLSAxODAuMTI2MTM5NzQ3MDgzNjcpOwogIH0KICBjbGFzcyBEZXZpY2VDbXlrQ1MgZXh0ZW5kcyBDb2xvclNwYWNlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlcigiRGV2aWNlQ01ZSyIsIDQpOwogICAgfQogICAgZ2V0UmdiSXRlbShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb252ZXJ0VG9SZ2Ioc3JjLCBzcmNPZmZzZXQsIDEsIGRlc3QsIGRlc3RPZmZzZXQpOwogICAgfQogICAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgICBjb25zdCBzY2FsZSA9IDEgLyAoKDEgPDwgYml0cykgLSAxKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgY29udmVydFRvUmdiKHNyYywgc3JjT2Zmc2V0LCBzY2FsZSwgZGVzdCwgZGVzdE9mZnNldCk7CiAgICAgICAgc3JjT2Zmc2V0ICs9IDQ7CiAgICAgICAgZGVzdE9mZnNldCArPSAzICsgYWxwaGEwMTsKICAgICAgfQogICAgfQogICAgZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoLCBhbHBoYTAxKSB7CiAgICAgIHJldHVybiBpbnB1dExlbmd0aCAvIDQgKiAoMyArIGFscGhhMDEpIHwgMDsKICAgIH0KICB9CiAgcmV0dXJuIERldmljZUNteWtDUzsKfSgpOwpjb25zdCBDYWxHcmF5Q1MgPSBmdW5jdGlvbiBDYWxHcmF5Q1NDbG9zdXJlKCkgewogIGZ1bmN0aW9uIGNvbnZlcnRUb1JnYihjcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CiAgICBjb25zdCBBID0gc3JjW3NyY09mZnNldF0gKiBzY2FsZTsKICAgIGNvbnN0IEFHID0gQSAqKiBjcy5HOwogICAgY29uc3QgTCA9IGNzLllXICogQUc7CiAgICBjb25zdCB2YWwgPSBNYXRoLm1heCgyOTUuOCAqIEwgKiogMC4zMzMzMzMzMzMzMzMzMzMzIC0gNDAuOCwgMCk7CiAgICBkZXN0W2Rlc3RPZmZzZXRdID0gdmFsOwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSB2YWw7CiAgICBkZXN0W2Rlc3RPZmZzZXQgKyAyXSA9IHZhbDsKICB9CiAgY2xhc3MgQ2FsR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSkgewogICAgICBzdXBlcigiQ2FsR3JheSIsIDEpOwogICAgICBpZiAoIXdoaXRlUG9pbnQpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIldoaXRlUG9pbnQgbWlzc2luZyAtIHJlcXVpcmVkIGZvciBjb2xvciBzcGFjZSBDYWxHcmF5Iik7CiAgICAgIH0KICAgICAgYmxhY2tQb2ludCB8fD0gWzAsIDAsIDBdOwogICAgICBnYW1tYSB8fD0gMTsKICAgICAgdGhpcy5YVyA9IHdoaXRlUG9pbnRbMF07CiAgICAgIHRoaXMuWVcgPSB3aGl0ZVBvaW50WzFdOwogICAgICB0aGlzLlpXID0gd2hpdGVQb2ludFsyXTsKICAgICAgdGhpcy5YQiA9IGJsYWNrUG9pbnRbMF07CiAgICAgIHRoaXMuWUIgPSBibGFja1BvaW50WzFdOwogICAgICB0aGlzLlpCID0gYmxhY2tQb2ludFsyXTsKICAgICAgdGhpcy5HID0gZ2FtbWE7CiAgICAgIGlmICh0aGlzLlhXIDwgMCB8fCB0aGlzLlpXIDwgMCB8fCB0aGlzLllXICE9PSAxKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9YCArICIsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkgewogICAgICAgICgwLCBfdXRpbC5pbmZvKShgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOwogICAgICAgIHRoaXMuWEIgPSB0aGlzLllCID0gdGhpcy5aQiA9IDA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuWEIgIT09IDAgfHwgdGhpcy5ZQiAhPT0gMCB8fCB0aGlzLlpCICE9PSAwKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke3RoaXMubmFtZX0sIEJsYWNrUG9pbnQ6IFhCOiAke3RoaXMuWEJ9LCBZQjogJHt0aGlzLllCfSwgYCArIGBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApOwogICAgICB9CiAgICAgIGlmICh0aGlzLkcgPCAxKSB7CiAgICAgICAgKDAsIF91dGlsLmluZm8pKGBJbnZhbGlkIEdhbW1hOiAke3RoaXMuR30gZm9yICR7dGhpcy5uYW1lfSwgYCArICJmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC4iKTsKICAgICAgICB0aGlzLkcgPSAxOwogICAgICB9CiAgICB9CiAgICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgMSk7CiAgICB9CiAgICBnZXRSZ2JCdWZmZXIoc3JjLCBzcmNPZmZzZXQsIGNvdW50LCBkZXN0LCBkZXN0T2Zmc2V0LCBiaXRzLCBhbHBoYTAxKSB7CiAgICAgIGNvbnN0IHNjYWxlID0gMSAvICgoMSA8PCBiaXRzKSAtIDEpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICBjb252ZXJ0VG9SZ2IodGhpcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKTsKICAgICAgICBzcmNPZmZzZXQgKz0gMTsKICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgICB9CiAgICB9CiAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKTsKICAgIH0KICB9CiAgcmV0dXJuIENhbEdyYXlDUzsKfSgpOwpjb25zdCBDYWxSR0JDUyA9IGZ1bmN0aW9uIENhbFJHQkNTQ2xvc3VyZSgpIHsKICBjb25zdCBCUkFERk9SRF9TQ0FMRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFswLjg5NTEsIDAuMjY2NCwgLTAuMTYxNCwgLTAuNzUwMiwgMS43MTM1LCAwLjAzNjcsIDAuMDM4OSwgLTAuMDY4NSwgMS4wMjk2XSk7CiAgY29uc3QgQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVggPSBuZXcgRmxvYXQzMkFycmF5KFswLjk4Njk5MjksIC0wLjE0NzA1NDMsIDAuMTU5OTYyNywgMC40MzIzMDUzLCAwLjUxODM2MDMsIDAuMDQ5MjkxMiwgLTAuMDA4NTI4NywgMC4wNDAwNDI4LCAwLjk2ODQ4NjddKTsKICBjb25zdCBTUkdCX0Q2NV9YWVpfVE9fUkdCX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwgLTEuNTM3MTM4NSwgLTAuNDk4NTMxNCwgLTAuOTY5MjY2MCwgMS44NzYwMTA4LCAwLjA0MTU1NjAsIDAuMDU1NjQzNCwgLTAuMjA0MDI1OSwgMS4wNTcyMjUyXSk7CiAgY29uc3QgRkxBVF9XSElURVBPSU5UX01BVFJJWCA9IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTsKICBjb25zdCB0ZW1wTm9ybWFsaXplTWF0cml4ID0gbmV3IEZsb2F0MzJBcnJheSgzKTsKICBjb25zdCB0ZW1wQ29udmVydE1hdHJpeDEgPSBuZXcgRmxvYXQzMkFycmF5KDMpOwogIGNvbnN0IHRlbXBDb252ZXJ0TWF0cml4MiA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgY29uc3QgREVDT0RFX0xfQ09OU1RBTlQgPSAoKDggKyAxNikgLyAxMTYpICoqIDMgLyA4LjA7CiAgZnVuY3Rpb24gbWF0cml4UHJvZHVjdChhLCBiLCByZXN1bHQpIHsKICAgIHJlc3VsdFswXSA9IGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTsKICAgIHJlc3VsdFsxXSA9IGFbM10gKiBiWzBdICsgYVs0XSAqIGJbMV0gKyBhWzVdICogYlsyXTsKICAgIHJlc3VsdFsyXSA9IGFbNl0gKiBiWzBdICsgYVs3XSAqIGJbMV0gKyBhWzhdICogYlsyXTsKICB9CiAgZnVuY3Rpb24gY29udmVydFRvRmxhdChzb3VyY2VXaGl0ZVBvaW50LCBMTVMsIHJlc3VsdCkgewogICAgcmVzdWx0WzBdID0gTE1TWzBdICogMSAvIHNvdXJjZVdoaXRlUG9pbnRbMF07CiAgICByZXN1bHRbMV0gPSBMTVNbMV0gKiAxIC8gc291cmNlV2hpdGVQb2ludFsxXTsKICAgIHJlc3VsdFsyXSA9IExNU1syXSAqIDEgLyBzb3VyY2VXaGl0ZVBvaW50WzJdOwogIH0KICBmdW5jdGlvbiBjb252ZXJ0VG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCByZXN1bHQpIHsKICAgIGNvbnN0IEQ2NVggPSAwLjk1MDQ3OwogICAgY29uc3QgRDY1WSA9IDE7CiAgICBjb25zdCBENjVaID0gMS4wODg4MzsKICAgIHJlc3VsdFswXSA9IExNU1swXSAqIEQ2NVggLyBzb3VyY2VXaGl0ZVBvaW50WzBdOwogICAgcmVzdWx0WzFdID0gTE1TWzFdICogRDY1WSAvIHNvdXJjZVdoaXRlUG9pbnRbMV07CiAgICByZXN1bHRbMl0gPSBMTVNbMl0gKiBENjVaIC8gc291cmNlV2hpdGVQb2ludFsyXTsKICB9CiAgZnVuY3Rpb24gc1JHQlRyYW5zZmVyRnVuY3Rpb24oY29sb3IpIHsKICAgIGlmIChjb2xvciA8PSAwLjAwMzEzMDgpIHsKICAgICAgcmV0dXJuIGFkanVzdFRvUmFuZ2UoMCwgMSwgMTIuOTIgKiBjb2xvcik7CiAgICB9CiAgICBpZiAoY29sb3IgPj0gMC45OTU1NDUyNSkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiBhZGp1c3RUb1JhbmdlKDAsIDEsICgxICsgMC4wNTUpICogY29sb3IgKiogKDEgLyAyLjQpIC0gMC4wNTUpOwogIH0KICBmdW5jdGlvbiBhZGp1c3RUb1JhbmdlKG1pbiwgbWF4LCB2YWx1ZSkgewogICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpOwogIH0KICBmdW5jdGlvbiBkZWNvZGVMKEwpIHsKICAgIGlmIChMIDwgMCkgewogICAgICByZXR1cm4gLWRlY29kZUwoLUwpOwogICAgfQogICAgaWYgKEwgPiA4LjApIHsKICAgICAgcmV0dXJuICgoTCArIDE2KSAvIDExNikgKiogMzsKICAgIH0KICAgIHJldHVybiBMICogREVDT0RFX0xfQ09OU1RBTlQ7CiAgfQogIGZ1bmN0aW9uIGNvbXBlbnNhdGVCbGFja1BvaW50KHNvdXJjZUJsYWNrUG9pbnQsIFhZWl9GbGF0LCByZXN1bHQpIHsKICAgIGlmIChzb3VyY2VCbGFja1BvaW50WzBdID09PSAwICYmIHNvdXJjZUJsYWNrUG9pbnRbMV0gPT09IDAgJiYgc291cmNlQmxhY2tQb2ludFsyXSA9PT0gMCkgewogICAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXTsKICAgICAgcmVzdWx0WzFdID0gWFlaX0ZsYXRbMV07CiAgICAgIHJlc3VsdFsyXSA9IFhZWl9GbGF0WzJdOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB6ZXJvRGVjb2RlTCA9IGRlY29kZUwoMCk7CiAgICBjb25zdCBYX0RTVCA9IHplcm9EZWNvZGVMOwogICAgY29uc3QgWF9TUkMgPSBkZWNvZGVMKHNvdXJjZUJsYWNrUG9pbnRbMF0pOwogICAgY29uc3QgWV9EU1QgPSB6ZXJvRGVjb2RlTDsKICAgIGNvbnN0IFlfU1JDID0gZGVjb2RlTChzb3VyY2VCbGFja1BvaW50WzFdKTsKICAgIGNvbnN0IFpfRFNUID0gemVyb0RlY29kZUw7CiAgICBjb25zdCBaX1NSQyA9IGRlY29kZUwoc291cmNlQmxhY2tQb2ludFsyXSk7CiAgICBjb25zdCBYX1NjYWxlID0gKDEgLSBYX0RTVCkgLyAoMSAtIFhfU1JDKTsKICAgIGNvbnN0IFhfT2Zmc2V0ID0gMSAtIFhfU2NhbGU7CiAgICBjb25zdCBZX1NjYWxlID0gKDEgLSBZX0RTVCkgLyAoMSAtIFlfU1JDKTsKICAgIGNvbnN0IFlfT2Zmc2V0ID0gMSAtIFlfU2NhbGU7CiAgICBjb25zdCBaX1NjYWxlID0gKDEgLSBaX0RTVCkgLyAoMSAtIFpfU1JDKTsKICAgIGNvbnN0IFpfT2Zmc2V0ID0gMSAtIFpfU2NhbGU7CiAgICByZXN1bHRbMF0gPSBYWVpfRmxhdFswXSAqIFhfU2NhbGUgKyBYX09mZnNldDsKICAgIHJlc3VsdFsxXSA9IFhZWl9GbGF0WzFdICogWV9TY2FsZSArIFlfT2Zmc2V0OwogICAgcmVzdWx0WzJdID0gWFlaX0ZsYXRbMl0gKiBaX1NjYWxlICsgWl9PZmZzZXQ7CiAgfQogIGZ1bmN0aW9uIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgWFlaX0luLCByZXN1bHQpIHsKICAgIGlmIChzb3VyY2VXaGl0ZVBvaW50WzBdID09PSAxICYmIHNvdXJjZVdoaXRlUG9pbnRbMl0gPT09IDEpIHsKICAgICAgcmVzdWx0WzBdID0gWFlaX0luWzBdOwogICAgICByZXN1bHRbMV0gPSBYWVpfSW5bMV07CiAgICAgIHJlc3VsdFsyXSA9IFhZWl9JblsyXTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgTE1TID0gcmVzdWx0OwogICAgbWF0cml4UHJvZHVjdChCUkFERk9SRF9TQ0FMRV9NQVRSSVgsIFhZWl9JbiwgTE1TKTsKICAgIGNvbnN0IExNU19GbGF0ID0gdGVtcE5vcm1hbGl6ZU1hdHJpeDsKICAgIGNvbnZlcnRUb0ZsYXQoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRmxhdCk7CiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX0lOVkVSU0VfTUFUUklYLCBMTVNfRmxhdCwgcmVzdWx0KTsKICB9CiAgZnVuY3Rpb24gbm9ybWFsaXplV2hpdGVQb2ludFRvRDY1KHNvdXJjZVdoaXRlUG9pbnQsIFhZWl9JbiwgcmVzdWx0KSB7CiAgICBjb25zdCBMTVMgPSByZXN1bHQ7CiAgICBtYXRyaXhQcm9kdWN0KEJSQURGT1JEX1NDQUxFX01BVFJJWCwgWFlaX0luLCBMTVMpOwogICAgY29uc3QgTE1TX0Q2NSA9IHRlbXBOb3JtYWxpemVNYXRyaXg7CiAgICBjb252ZXJ0VG9ENjUoc291cmNlV2hpdGVQb2ludCwgTE1TLCBMTVNfRDY1KTsKICAgIG1hdHJpeFByb2R1Y3QoQlJBREZPUkRfU0NBTEVfSU5WRVJTRV9NQVRSSVgsIExNU19ENjUsIHJlc3VsdCk7CiAgfQogIGZ1bmN0aW9uIGNvbnZlcnRUb1JnYihjcywgc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQsIHNjYWxlKSB7CiAgICBjb25zdCBBID0gYWRqdXN0VG9SYW5nZSgwLCAxLCBzcmNbc3JjT2Zmc2V0XSAqIHNjYWxlKTsKICAgIGNvbnN0IEIgPSBhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAxXSAqIHNjYWxlKTsKICAgIGNvbnN0IEMgPSBhZGp1c3RUb1JhbmdlKDAsIDEsIHNyY1tzcmNPZmZzZXQgKyAyXSAqIHNjYWxlKTsKICAgIGNvbnN0IEFHUiA9IEEgPT09IDEgPyAxIDogQSAqKiBjcy5HUjsKICAgIGNvbnN0IEJHRyA9IEIgPT09IDEgPyAxIDogQiAqKiBjcy5HRzsKICAgIGNvbnN0IENHQiA9IEMgPT09IDEgPyAxIDogQyAqKiBjcy5HQjsKICAgIGNvbnN0IFggPSBjcy5NWEEgKiBBR1IgKyBjcy5NWEIgKiBCR0cgKyBjcy5NWEMgKiBDR0I7CiAgICBjb25zdCBZID0gY3MuTVlBICogQUdSICsgY3MuTVlCICogQkdHICsgY3MuTVlDICogQ0dCOwogICAgY29uc3QgWiA9IGNzLk1aQSAqIEFHUiArIGNzLk1aQiAqIEJHRyArIGNzLk1aQyAqIENHQjsKICAgIGNvbnN0IFhZWiA9IHRlbXBDb252ZXJ0TWF0cml4MTsKICAgIFhZWlswXSA9IFg7CiAgICBYWVpbMV0gPSBZOwogICAgWFlaWzJdID0gWjsKICAgIGNvbnN0IFhZWl9GbGF0ID0gdGVtcENvbnZlcnRNYXRyaXgyOwogICAgbm9ybWFsaXplV2hpdGVQb2ludFRvRmxhdChjcy53aGl0ZVBvaW50LCBYWVosIFhZWl9GbGF0KTsKICAgIGNvbnN0IFhZWl9CbGFjayA9IHRlbXBDb252ZXJ0TWF0cml4MTsKICAgIGNvbXBlbnNhdGVCbGFja1BvaW50KGNzLmJsYWNrUG9pbnQsIFhZWl9GbGF0LCBYWVpfQmxhY2spOwogICAgY29uc3QgWFlaX0Q2NSA9IHRlbXBDb252ZXJ0TWF0cml4MjsKICAgIG5vcm1hbGl6ZVdoaXRlUG9pbnRUb0Q2NShGTEFUX1dISVRFUE9JTlRfTUFUUklYLCBYWVpfQmxhY2ssIFhZWl9ENjUpOwogICAgY29uc3QgU1JHQiA9IHRlbXBDb252ZXJ0TWF0cml4MTsKICAgIG1hdHJpeFByb2R1Y3QoU1JHQl9ENjVfWFlaX1RPX1JHQl9NQVRSSVgsIFhZWl9ENjUsIFNSR0IpOwogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IHNSR0JUcmFuc2ZlckZ1bmN0aW9uKFNSR0JbMF0pICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMV0gPSBzUkdCVHJhbnNmZXJGdW5jdGlvbihTUkdCWzFdKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDJdID0gc1JHQlRyYW5zZmVyRnVuY3Rpb24oU1JHQlsyXSkgKiAyNTU7CiAgfQogIGNsYXNzIENhbFJHQkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCBnYW1tYSwgbWF0cml4KSB7CiAgICAgIHN1cGVyKCJDYWxSR0IiLCAzKTsKICAgICAgaWYgKCF3aGl0ZVBvaW50KSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgQ2FsUkdCIik7CiAgICAgIH0KICAgICAgYmxhY2tQb2ludCB8fD0gbmV3IEZsb2F0MzJBcnJheSgzKTsKICAgICAgZ2FtbWEgfHw9IG5ldyBGbG9hdDMyQXJyYXkoWzEsIDEsIDFdKTsKICAgICAgbWF0cml4IHx8PSBuZXcgRmxvYXQzMkFycmF5KFsxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxXSk7CiAgICAgIGNvbnN0IFhXID0gd2hpdGVQb2ludFswXTsKICAgICAgY29uc3QgWVcgPSB3aGl0ZVBvaW50WzFdOwogICAgICBjb25zdCBaVyA9IHdoaXRlUG9pbnRbMl07CiAgICAgIHRoaXMud2hpdGVQb2ludCA9IHdoaXRlUG9pbnQ7CiAgICAgIGNvbnN0IFhCID0gYmxhY2tQb2ludFswXTsKICAgICAgY29uc3QgWUIgPSBibGFja1BvaW50WzFdOwogICAgICBjb25zdCBaQiA9IGJsYWNrUG9pbnRbMl07CiAgICAgIHRoaXMuYmxhY2tQb2ludCA9IGJsYWNrUG9pbnQ7CiAgICAgIHRoaXMuR1IgPSBnYW1tYVswXTsKICAgICAgdGhpcy5HRyA9IGdhbW1hWzFdOwogICAgICB0aGlzLkdCID0gZ2FtbWFbMl07CiAgICAgIHRoaXMuTVhBID0gbWF0cml4WzBdOwogICAgICB0aGlzLk1ZQSA9IG1hdHJpeFsxXTsKICAgICAgdGhpcy5NWkEgPSBtYXRyaXhbMl07CiAgICAgIHRoaXMuTVhCID0gbWF0cml4WzNdOwogICAgICB0aGlzLk1ZQiA9IG1hdHJpeFs0XTsKICAgICAgdGhpcy5NWkIgPSBtYXRyaXhbNV07CiAgICAgIHRoaXMuTVhDID0gbWF0cml4WzZdOwogICAgICB0aGlzLk1ZQyA9IG1hdHJpeFs3XTsKICAgICAgdGhpcy5NWkMgPSBtYXRyaXhbOF07CiAgICAgIGlmIChYVyA8IDAgfHwgWlcgPCAwIHx8IFlXICE9PSAxKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIFdoaXRlUG9pbnQgY29tcG9uZW50cyBmb3IgJHt0aGlzLm5hbWV9YCArICIsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOwogICAgICB9CiAgICAgIGlmIChYQiA8IDAgfHwgWUIgPCAwIHx8IFpCIDwgMCkgewogICAgICAgICgwLCBfdXRpbC5pbmZvKShgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7WEJ9LCAke1lCfSwgJHtaQn1dLCBgICsgImZhbGxpbmcgYmFjayB0byBkZWZhdWx0LiIpOwogICAgICAgIHRoaXMuYmxhY2tQb2ludCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuR1IgPCAwIHx8IHRoaXMuR0cgPCAwIHx8IHRoaXMuR0IgPCAwKSB7CiAgICAgICAgKDAsIF91dGlsLmluZm8pKGBJbnZhbGlkIEdhbW1hIFske3RoaXMuR1J9LCAke3RoaXMuR0d9LCAke3RoaXMuR0J9XSBmb3IgYCArIGAke3RoaXMubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0LmApOwogICAgICAgIHRoaXMuR1IgPSB0aGlzLkdHID0gdGhpcy5HQiA9IDE7CiAgICAgIH0KICAgIH0KICAgIGdldFJnYkl0ZW0oc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgY29udmVydFRvUmdiKHRoaXMsIHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0LCAxKTsKICAgIH0KICAgIGdldFJnYkJ1ZmZlcihzcmMsIHNyY09mZnNldCwgY291bnQsIGRlc3QsIGRlc3RPZmZzZXQsIGJpdHMsIGFscGhhMDEpIHsKICAgICAgY29uc3Qgc2NhbGUgPSAxIC8gKCgxIDw8IGJpdHMpIC0gMSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCwgc2NhbGUpOwogICAgICAgIHNyY09mZnNldCArPSAzOwogICAgICAgIGRlc3RPZmZzZXQgKz0gMyArIGFscGhhMDE7CiAgICAgIH0KICAgIH0KICAgIGdldE91dHB1dExlbmd0aChpbnB1dExlbmd0aCwgYWxwaGEwMSkgewogICAgICByZXR1cm4gaW5wdXRMZW5ndGggKiAoMyArIGFscGhhMDEpIC8gMyB8IDA7CiAgICB9CiAgfQogIHJldHVybiBDYWxSR0JDUzsKfSgpOwpjb25zdCBMYWJDUyA9IGZ1bmN0aW9uIExhYkNTQ2xvc3VyZSgpIHsKICBmdW5jdGlvbiBmbl9nKHgpIHsKICAgIGxldCByZXN1bHQ7CiAgICBpZiAoeCA+PSA2IC8gMjkpIHsKICAgICAgcmVzdWx0ID0geCAqKiAzOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gMTA4IC8gODQxICogKHggLSA0IC8gMjkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gZGVjb2RlKHZhbHVlLCBoaWdoMSwgbG93MiwgaGlnaDIpIHsKICAgIHJldHVybiBsb3cyICsgdmFsdWUgKiAoaGlnaDIgLSBsb3cyKSAvIGhpZ2gxOwogIH0KICBmdW5jdGlvbiBjb252ZXJ0VG9SZ2IoY3MsIHNyYywgc3JjT2Zmc2V0LCBtYXhWYWwsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgIGxldCBMcyA9IHNyY1tzcmNPZmZzZXRdOwogICAgbGV0IGFzID0gc3JjW3NyY09mZnNldCArIDFdOwogICAgbGV0IGJzID0gc3JjW3NyY09mZnNldCArIDJdOwogICAgaWYgKG1heFZhbCAhPT0gZmFsc2UpIHsKICAgICAgTHMgPSBkZWNvZGUoTHMsIG1heFZhbCwgMCwgMTAwKTsKICAgICAgYXMgPSBkZWNvZGUoYXMsIG1heFZhbCwgY3MuYW1pbiwgY3MuYW1heCk7CiAgICAgIGJzID0gZGVjb2RlKGJzLCBtYXhWYWwsIGNzLmJtaW4sIGNzLmJtYXgpOwogICAgfQogICAgaWYgKGFzID4gY3MuYW1heCkgewogICAgICBhcyA9IGNzLmFtYXg7CiAgICB9IGVsc2UgaWYgKGFzIDwgY3MuYW1pbikgewogICAgICBhcyA9IGNzLmFtaW47CiAgICB9CiAgICBpZiAoYnMgPiBjcy5ibWF4KSB7CiAgICAgIGJzID0gY3MuYm1heDsKICAgIH0gZWxzZSBpZiAoYnMgPCBjcy5ibWluKSB7CiAgICAgIGJzID0gY3MuYm1pbjsKICAgIH0KICAgIGNvbnN0IE0gPSAoTHMgKyAxNikgLyAxMTY7CiAgICBjb25zdCBMID0gTSArIGFzIC8gNTAwOwogICAgY29uc3QgTiA9IE0gLSBicyAvIDIwMDsKICAgIGNvbnN0IFggPSBjcy5YVyAqIGZuX2coTCk7CiAgICBjb25zdCBZID0gY3MuWVcgKiBmbl9nKE0pOwogICAgY29uc3QgWiA9IGNzLlpXICogZm5fZyhOKTsKICAgIGxldCByLCBnLCBiOwogICAgaWYgKGNzLlpXIDwgMSkgewogICAgICByID0gWCAqIDMuMTMzOSArIFkgKiAtMS42MTcgKyBaICogLTAuNDkwNjsKICAgICAgZyA9IFggKiAtMC45Nzg1ICsgWSAqIDEuOTE2ICsgWiAqIDAuMDMzMzsKICAgICAgYiA9IFggKiAwLjA3MiArIFkgKiAtMC4yMjkgKyBaICogMS40MDU3OwogICAgfSBlbHNlIHsKICAgICAgciA9IFggKiAzLjI0MDYgKyBZICogLTEuNTM3MiArIFogKiAtMC40OTg2OwogICAgICBnID0gWCAqIC0wLjk2ODkgKyBZICogMS44NzU4ICsgWiAqIDAuMDQxNTsKICAgICAgYiA9IFggKiAwLjA1NTcgKyBZICogLTAuMjA0ICsgWiAqIDEuMDU3OwogICAgfQogICAgZGVzdFtkZXN0T2Zmc2V0XSA9IE1hdGguc3FydChyKSAqIDI1NTsKICAgIGRlc3RbZGVzdE9mZnNldCArIDFdID0gTWF0aC5zcXJ0KGcpICogMjU1OwogICAgZGVzdFtkZXN0T2Zmc2V0ICsgMl0gPSBNYXRoLnNxcnQoYikgKiAyNTU7CiAgfQogIGNsYXNzIExhYkNTIGV4dGVuZHMgQ29sb3JTcGFjZSB7CiAgICBjb25zdHJ1Y3Rvcih3aGl0ZVBvaW50LCBibGFja1BvaW50LCByYW5nZSkgewogICAgICBzdXBlcigiTGFiIiwgMyk7CiAgICAgIGlmICghd2hpdGVQb2ludCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIExhYiIpOwogICAgICB9CiAgICAgIGJsYWNrUG9pbnQgfHw9IFswLCAwLCAwXTsKICAgICAgcmFuZ2UgfHw9IFstMTAwLCAxMDAsIC0xMDAsIDEwMF07CiAgICAgIHRoaXMuWFcgPSB3aGl0ZVBvaW50WzBdOwogICAgICB0aGlzLllXID0gd2hpdGVQb2ludFsxXTsKICAgICAgdGhpcy5aVyA9IHdoaXRlUG9pbnRbMl07CiAgICAgIHRoaXMuYW1pbiA9IHJhbmdlWzBdOwogICAgICB0aGlzLmFtYXggPSByYW5nZVsxXTsKICAgICAgdGhpcy5ibWluID0gcmFuZ2VbMl07CiAgICAgIHRoaXMuYm1heCA9IHJhbmdlWzNdOwogICAgICB0aGlzLlhCID0gYmxhY2tQb2ludFswXTsKICAgICAgdGhpcy5ZQiA9IGJsYWNrUG9pbnRbMV07CiAgICAgIHRoaXMuWkIgPSBibGFja1BvaW50WzJdOwogICAgICBpZiAodGhpcy5YVyA8IDAgfHwgdGhpcy5aVyA8IDAgfHwgdGhpcy5ZVyAhPT0gMSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMsIG5vIGZhbGxiYWNrIGF2YWlsYWJsZSIpOwogICAgICB9CiAgICAgIGlmICh0aGlzLlhCIDwgMCB8fCB0aGlzLllCIDwgMCB8fCB0aGlzLlpCIDwgMCkgewogICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW52YWxpZCBCbGFja1BvaW50LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCIpOwogICAgICAgIHRoaXMuWEIgPSB0aGlzLllCID0gdGhpcy5aQiA9IDA7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYW1pbiA+IHRoaXMuYW1heCB8fCB0aGlzLmJtaW4gPiB0aGlzLmJtYXgpIHsKICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkludmFsaWQgUmFuZ2UsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIpOwogICAgICAgIHRoaXMuYW1pbiA9IC0xMDA7CiAgICAgICAgdGhpcy5hbWF4ID0gMTAwOwogICAgICAgIHRoaXMuYm1pbiA9IC0xMDA7CiAgICAgICAgdGhpcy5ibWF4ID0gMTAwOwogICAgICB9CiAgICB9CiAgICBnZXRSZ2JJdGVtKHNyYywgc3JjT2Zmc2V0LCBkZXN0LCBkZXN0T2Zmc2V0KSB7CiAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgZmFsc2UsIGRlc3QsIGRlc3RPZmZzZXQpOwogICAgfQogICAgZ2V0UmdiQnVmZmVyKHNyYywgc3JjT2Zmc2V0LCBjb3VudCwgZGVzdCwgZGVzdE9mZnNldCwgYml0cywgYWxwaGEwMSkgewogICAgICBjb25zdCBtYXhWYWwgPSAoMSA8PCBiaXRzKSAtIDE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIGNvbnZlcnRUb1JnYih0aGlzLCBzcmMsIHNyY09mZnNldCwgbWF4VmFsLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgICAgICBzcmNPZmZzZXQgKz0gMzsKICAgICAgICBkZXN0T2Zmc2V0ICs9IDMgKyBhbHBoYTAxOwogICAgICB9CiAgICB9CiAgICBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGgsIGFscGhhMDEpIHsKICAgICAgcmV0dXJuIGlucHV0TGVuZ3RoICogKDMgKyBhbHBoYTAxKSAvIDMgfCAwOwogICAgfQogICAgaXNEZWZhdWx0RGVjb2RlKGRlY29kZU1hcCwgYnBjKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZ2V0IHVzZXNaZXJvVG9PbmVSYW5nZSgpIHsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ1c2VzWmVyb1RvT25lUmFuZ2UiLCBmYWxzZSk7CiAgICB9CiAgfQogIHJldHVybiBMYWJDUzsKfSgpOwoKLyoqKi8gfSksCi8qIDEzICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuUGFydGlhbEV2YWx1YXRvciA9IGV4cG9ydHMuRXZhbHVhdG9yUHJlcHJvY2Vzc29yID0gdm9pZCAwOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX2NtYXAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKdmFyIF9mb250cyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzQpOwp2YXIgX2VuY29kaW5ncyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzcpOwp2YXIgX3N0YW5kYXJkX2ZvbnRzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MSk7CnZhciBfcGF0dGVybiA9IF9fd19wZGZqc19yZXF1aXJlX18oNTApOwp2YXIgX3hmYV9mb250cyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTEpOwp2YXIgX3RvX3VuaWNvZGVfbWFwID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Mik7CnZhciBfZnVuY3Rpb24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU3KTsKdmFyIF9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKdmFyIF9pbWFnZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTkpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CnZhciBfYmFzZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOwp2YXIgX2JpZGkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYwKTsKdmFyIF9jb2xvcnNwYWNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CnZhciBfZGVjb2RlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwp2YXIgX2ZvbnRzX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7CnZhciBfZm9udF9zdWJzdGl0dXRpb25zID0gX193X3BkZmpzX3JlcXVpcmVfXyg2MSk7CnZhciBfZ2x5cGhsaXN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygzOSk7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfbWV0cmljcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNDUpOwp2YXIgX3VuaWNvZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQwKTsKdmFyIF9pbWFnZV9yZXNpemVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7CnZhciBfbXVybXVyaGFzaCA9IF9fd19wZGZqc19yZXF1aXJlX18oNjMpOwp2YXIgX29wZXJhdG9yX2xpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY0KTsKdmFyIF9pbWFnZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNjUpOwpjb25zdCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnMgPSBPYmplY3QuZnJlZXplKHsKICBtYXhJbWFnZVNpemU6IC0xLAogIGRpc2FibGVGb250RmFjZTogZmFsc2UsCiAgaWdub3JlRXJyb3JzOiBmYWxzZSwKICBpc0V2YWxTdXBwb3J0ZWQ6IHRydWUsCiAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IGZhbHNlLAogIGNhbnZhc01heEFyZWFJbkJ5dGVzOiAtMSwKICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSwKICB1c2VTeXN0ZW1Gb250czogdHJ1ZSwKICBjTWFwVXJsOiBudWxsLAogIHN0YW5kYXJkRm9udERhdGFVcmw6IG51bGwKfSk7CmNvbnN0IFBhdHRlcm5UeXBlID0gewogIFRJTElORzogMSwKICBTSEFESU5HOiAyCn07CmNvbnN0IFRFWFRfQ0hVTktfQkFUQ0hfU0laRSA9IDEwOwpjb25zdCBkZWZlcnJlZCA9IFByb21pc2UucmVzb2x2ZSgpOwpmdW5jdGlvbiBub3JtYWxpemVCbGVuZE1vZGUodmFsdWUsIHBhcnNpbmdBcnJheSA9IGZhbHNlKSB7CiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZSkgewogICAgICBjb25zdCBtYXliZUJNID0gbm9ybWFsaXplQmxlbmRNb2RlKHZhbCwgdHJ1ZSk7CiAgICAgIGlmIChtYXliZUJNKSB7CiAgICAgICAgcmV0dXJuIG1heWJlQk07CiAgICAgIH0KICAgIH0KICAgICgwLCBfdXRpbC53YXJuKShgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZSBBcnJheTogJHt2YWx1ZX1gKTsKICAgIHJldHVybiAic291cmNlLW92ZXIiOwogIH0KICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICBpZiAocGFyc2luZ0FycmF5KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuICJzb3VyY2Utb3ZlciI7CiAgfQogIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgY2FzZSAiTm9ybWFsIjoKICAgIGNhc2UgIkNvbXBhdGlibGUiOgogICAgICByZXR1cm4gInNvdXJjZS1vdmVyIjsKICAgIGNhc2UgIk11bHRpcGx5IjoKICAgICAgcmV0dXJuICJtdWx0aXBseSI7CiAgICBjYXNlICJTY3JlZW4iOgogICAgICByZXR1cm4gInNjcmVlbiI7CiAgICBjYXNlICJPdmVybGF5IjoKICAgICAgcmV0dXJuICJvdmVybGF5IjsKICAgIGNhc2UgIkRhcmtlbiI6CiAgICAgIHJldHVybiAiZGFya2VuIjsKICAgIGNhc2UgIkxpZ2h0ZW4iOgogICAgICByZXR1cm4gImxpZ2h0ZW4iOwogICAgY2FzZSAiQ29sb3JEb2RnZSI6CiAgICAgIHJldHVybiAiY29sb3ItZG9kZ2UiOwogICAgY2FzZSAiQ29sb3JCdXJuIjoKICAgICAgcmV0dXJuICJjb2xvci1idXJuIjsKICAgIGNhc2UgIkhhcmRMaWdodCI6CiAgICAgIHJldHVybiAiaGFyZC1saWdodCI7CiAgICBjYXNlICJTb2Z0TGlnaHQiOgogICAgICByZXR1cm4gInNvZnQtbGlnaHQiOwogICAgY2FzZSAiRGlmZmVyZW5jZSI6CiAgICAgIHJldHVybiAiZGlmZmVyZW5jZSI7CiAgICBjYXNlICJFeGNsdXNpb24iOgogICAgICByZXR1cm4gImV4Y2x1c2lvbiI7CiAgICBjYXNlICJIdWUiOgogICAgICByZXR1cm4gImh1ZSI7CiAgICBjYXNlICJTYXR1cmF0aW9uIjoKICAgICAgcmV0dXJuICJzYXR1cmF0aW9uIjsKICAgIGNhc2UgIkNvbG9yIjoKICAgICAgcmV0dXJuICJjb2xvciI7CiAgICBjYXNlICJMdW1pbm9zaXR5IjoKICAgICAgcmV0dXJuICJsdW1pbm9zaXR5IjsKICB9CiAgaWYgKHBhcnNpbmdBcnJheSkgewogICAgcmV0dXJuIG51bGw7CiAgfQogICgwLCBfdXRpbC53YXJuKShgVW5zdXBwb3J0ZWQgYmxlbmQgbW9kZTogJHt2YWx1ZS5uYW1lfWApOwogIHJldHVybiAic291cmNlLW92ZXIiOwp9CmZ1bmN0aW9uIGluY3JlbWVudENhY2hlZEltYWdlTWFza0NvdW50KGRhdGEpIHsKICBpZiAoZGF0YS5mbiA9PT0gX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCAmJiBkYXRhLmFyZ3NbMF0/LmNvdW50ID4gMCkgewogICAgZGF0YS5hcmdzWzBdLmNvdW50Kys7CiAgfQp9CmNsYXNzIFRpbWVTbG90TWFuYWdlciB7CiAgc3RhdGljIFRJTUVfU0xPVF9EVVJBVElPTl9NUyA9IDIwOwogIHN0YXRpYyBDSEVDS19USU1FX0VWRVJZID0gMTAwOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5yZXNldCgpOwogIH0KICBjaGVjaygpIHsKICAgIGlmICgrK3RoaXMuY2hlY2tlZCA8IFRpbWVTbG90TWFuYWdlci5DSEVDS19USU1FX0VWRVJZKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXMuY2hlY2tlZCA9IDA7CiAgICByZXR1cm4gdGhpcy5lbmRUaW1lIDw9IERhdGUubm93KCk7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5lbmRUaW1lID0gRGF0ZS5ub3coKSArIFRpbWVTbG90TWFuYWdlci5USU1FX1NMT1RfRFVSQVRJT05fTVM7CiAgICB0aGlzLmNoZWNrZWQgPSAwOwogIH0KfQpjbGFzcyBQYXJ0aWFsRXZhbHVhdG9yIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgaGFuZGxlciwKICAgIHBhZ2VJbmRleCwKICAgIGlkRmFjdG9yeSwKICAgIGZvbnRDYWNoZSwKICAgIGJ1aWx0SW5DTWFwQ2FjaGUsCiAgICBzdGFuZGFyZEZvbnREYXRhQ2FjaGUsCiAgICBnbG9iYWxJbWFnZUNhY2hlLAogICAgc3lzdGVtRm9udENhY2hlLAogICAgb3B0aW9ucyA9IG51bGwKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwogICAgdGhpcy5pZEZhY3RvcnkgPSBpZEZhY3Rvcnk7CiAgICB0aGlzLmZvbnRDYWNoZSA9IGZvbnRDYWNoZTsKICAgIHRoaXMuYnVpbHRJbkNNYXBDYWNoZSA9IGJ1aWx0SW5DTWFwQ2FjaGU7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZSA9IHN0YW5kYXJkRm9udERhdGFDYWNoZTsKICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZSA9IGdsb2JhbEltYWdlQ2FjaGU7CiAgICB0aGlzLnN5c3RlbUZvbnRDYWNoZSA9IHN5c3RlbUZvbnRDYWNoZTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgRGVmYXVsdFBhcnRpYWxFdmFsdWF0b3JPcHRpb25zOwogICAgdGhpcy5wYXJzaW5nVHlwZTNGb250ID0gZmFsc2U7CiAgICB0aGlzLl9yZWdpb25hbEltYWdlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLlJlZ2lvbmFsSW1hZ2VDYWNoZSgpOwogICAgdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kID0gdGhpcy5mZXRjaEJ1aWx0SW5DTWFwLmJpbmQodGhpcyk7CiAgICBfaW1hZ2VfcmVzaXplci5JbWFnZVJlc2l6ZXIuc2V0TWF4QXJlYSh0aGlzLm9wdGlvbnMuY2FudmFzTWF4QXJlYUluQnl0ZXMpOwogIH0KICBnZXQgX3BkZkZ1bmN0aW9uRmFjdG9yeSgpIHsKICAgIGNvbnN0IHBkZkZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBfZnVuY3Rpb24uUERGRnVuY3Rpb25GYWN0b3J5KHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc0V2YWxTdXBwb3J0ZWQKICAgIH0pOwogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJfcGRmRnVuY3Rpb25GYWN0b3J5IiwgcGRmRnVuY3Rpb25GYWN0b3J5KTsKICB9CiAgY2xvbmUobmV3T3B0aW9ucyA9IG51bGwpIHsKICAgIGNvbnN0IG5ld0V2YWx1YXRvciA9IE9iamVjdC5jcmVhdGUodGhpcyk7CiAgICBuZXdFdmFsdWF0b3Iub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5vcHRpb25zLCBuZXdPcHRpb25zKTsKICAgIHJldHVybiBuZXdFdmFsdWF0b3I7CiAgfQogIGhhc0JsZW5kTW9kZXMocmVzb3VyY2VzLCBub25CbGVuZE1vZGVzU2V0KSB7CiAgICBpZiAoIShyZXNvdXJjZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocmVzb3VyY2VzLm9iaklkICYmIG5vbkJsZW5kTW9kZXNTZXQuaGFzKHJlc291cmNlcy5vYmpJZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcHJvY2Vzc2VkID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldChub25CbGVuZE1vZGVzU2V0KTsKICAgIGlmIChyZXNvdXJjZXMub2JqSWQpIHsKICAgICAgcHJvY2Vzc2VkLnB1dChyZXNvdXJjZXMub2JqSWQpOwogICAgfQogICAgY29uc3Qgbm9kZXMgPSBbcmVzb3VyY2VzXSwKICAgICAgeHJlZiA9IHRoaXMueHJlZjsKICAgIHdoaWxlIChub2Rlcy5sZW5ndGgpIHsKICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLnNoaWZ0KCk7CiAgICAgIGNvbnN0IGdyYXBoaWNTdGF0ZXMgPSBub2RlLmdldCgiRXh0R1N0YXRlIik7CiAgICAgIGlmIChncmFwaGljU3RhdGVzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICAgIGZvciAobGV0IGdyYXBoaWNTdGF0ZSBvZiBncmFwaGljU3RhdGVzLmdldFJhd1ZhbHVlcygpKSB7CiAgICAgICAgICBpZiAoZ3JhcGhpY1N0YXRlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGdyYXBoaWNTdGF0ZSkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGdyYXBoaWNTdGF0ZSA9IHhyZWYuZmV0Y2goZ3JhcGhpY1N0YXRlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICBwcm9jZXNzZWQucHV0KGdyYXBoaWNTdGF0ZSk7CiAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtleH0iLmApOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIShncmFwaGljU3RhdGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChncmFwaGljU3RhdGUub2JqSWQpIHsKICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dChncmFwaGljU3RhdGUub2JqSWQpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgYm0gPSBncmFwaGljU3RhdGUuZ2V0KCJCTSIpOwogICAgICAgICAgaWYgKGJtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICBpZiAoYm0ubmFtZSAhPT0gIk5vcm1hbCIpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChibSAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkoYm0pKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBibSkgewogICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSAmJiBlbGVtZW50Lm5hbWUgIT09ICJOb3JtYWwiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgeE9iamVjdHMgPSBub2RlLmdldCgiWE9iamVjdCIpOwogICAgICBpZiAoISh4T2JqZWN0cyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQgeE9iamVjdCBvZiB4T2JqZWN0cy5nZXRSYXdWYWx1ZXMoKSkgewogICAgICAgIGlmICh4T2JqZWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICBpZiAocHJvY2Vzc2VkLmhhcyh4T2JqZWN0KSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHhPYmplY3QgPSB4cmVmLmZldGNoKHhPYmplY3QpOwogICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4T2JqZWN0KTsKICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBoYXNCbGVuZE1vZGVzIC0gaWdub3JpbmcgWE9iamVjdDogIiR7ZXh9Ii5gKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghKHhPYmplY3QgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoeE9iamVjdC5kaWN0Lm9iaklkKSB7CiAgICAgICAgICBwcm9jZXNzZWQucHV0KHhPYmplY3QuZGljdC5vYmpJZCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHhSZXNvdXJjZXMgPSB4T2JqZWN0LmRpY3QuZ2V0KCJSZXNvdXJjZXMiKTsKICAgICAgICBpZiAoISh4UmVzb3VyY2VzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoeFJlc291cmNlcy5vYmpJZCAmJiBwcm9jZXNzZWQuaGFzKHhSZXNvdXJjZXMub2JqSWQpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbm9kZXMucHVzaCh4UmVzb3VyY2VzKTsKICAgICAgICBpZiAoeFJlc291cmNlcy5vYmpJZCkgewogICAgICAgICAgcHJvY2Vzc2VkLnB1dCh4UmVzb3VyY2VzLm9iaklkKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgcmVmIG9mIHByb2Nlc3NlZCkgewogICAgICBub25CbGVuZE1vZGVzU2V0LnB1dChyZWYpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBhc3luYyBmZXRjaEJ1aWx0SW5DTWFwKG5hbWUpIHsKICAgIGNvbnN0IGNhY2hlZERhdGEgPSB0aGlzLmJ1aWx0SW5DTWFwQ2FjaGUuZ2V0KG5hbWUpOwogICAgaWYgKGNhY2hlZERhdGEpIHsKICAgICAgcmV0dXJuIGNhY2hlZERhdGE7CiAgICB9CiAgICBsZXQgZGF0YTsKICAgIGlmICh0aGlzLm9wdGlvbnMuY01hcFVybCAhPT0gbnVsbCkgewogICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9wdGlvbnMuY01hcFVybH0ke25hbWV9LmJjbWFwYDsKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpOwogICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmZXRjaEJ1aWx0SW5DTWFwOiBmYWlsZWQgdG8gZmV0Y2ggZmlsZSAiJHt1cmx9IiB3aXRoICIke3Jlc3BvbnNlLnN0YXR1c1RleHR9Ii5gKTsKICAgICAgfQogICAgICBkYXRhID0gewogICAgICAgIGNNYXBEYXRhOiBuZXcgVWludDhBcnJheShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKSwKICAgICAgICBjb21wcmVzc2lvblR5cGU6IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gYXdhaXQgdGhpcy5oYW5kbGVyLnNlbmRXaXRoUHJvbWlzZSgiRmV0Y2hCdWlsdEluQ01hcCIsIHsKICAgICAgICBuYW1lCiAgICAgIH0pOwogICAgfQogICAgaWYgKGRhdGEuY29tcHJlc3Npb25UeXBlICE9PSBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkUpIHsKICAgICAgdGhpcy5idWlsdEluQ01hcENhY2hlLnNldChuYW1lLCBkYXRhKTsKICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBhc3luYyBmZXRjaFN0YW5kYXJkRm9udERhdGEobmFtZSkgewogICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuc3RhbmRhcmRGb250RGF0YUNhY2hlLmdldChuYW1lKTsKICAgIGlmIChjYWNoZWREYXRhKSB7CiAgICAgIHJldHVybiBuZXcgX3N0cmVhbS5TdHJlYW0oY2FjaGVkRGF0YSk7CiAgICB9CiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzICYmIG5hbWUgIT09ICJTeW1ib2wiICYmIG5hbWUgIT09ICJaYXBmRGluZ2JhdHMiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgc3RhbmRhcmRGb250TmFtZVRvRmlsZU5hbWUgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEZvbnROYW1lVG9GaWxlTWFwKSgpLAogICAgICBmaWxlbmFtZSA9IHN0YW5kYXJkRm9udE5hbWVUb0ZpbGVOYW1lW25hbWVdOwogICAgbGV0IGRhdGE7CiAgICBpZiAodGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmwgIT09IG51bGwpIHsKICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5vcHRpb25zLnN0YW5kYXJkRm9udERhdGFVcmx9JHtmaWxlbmFtZX1gOwogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7CiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYGZldGNoU3RhbmRhcmRGb250RGF0YTogZmFpbGVkIHRvIGZldGNoIGZpbGUgIiR7dXJsfSIgd2l0aCAiJHtyZXNwb25zZS5zdGF0dXNUZXh0fSIuYCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRyeSB7CiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuaGFuZGxlci5zZW5kV2l0aFByb21pc2UoIkZldGNoU3RhbmRhcmRGb250RGF0YSIsIHsKICAgICAgICAgIGZpbGVuYW1lCiAgICAgICAgfSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYGZldGNoU3RhbmRhcmRGb250RGF0YTogZmFpbGVkIHRvIGZldGNoIGZpbGUgIiR7ZmlsZW5hbWV9IiB3aXRoICIke2V9Ii5gKTsKICAgICAgfQogICAgfQogICAgaWYgKCFkYXRhKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUuc2V0KG5hbWUsIGRhdGEpOwogICAgcmV0dXJuIG5ldyBfc3RyZWFtLlN0cmVhbShkYXRhKTsKICB9CiAgYXN5bmMgYnVpbGRGb3JtWE9iamVjdChyZXNvdXJjZXMsIHhvYmosIHNtYXNrLCBvcGVyYXRvckxpc3QsIHRhc2ssIGluaXRpYWxTdGF0ZSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIGNvbnN0IGRpY3QgPSB4b2JqLmRpY3Q7CiAgICBjb25zdCBtYXRyaXggPSBkaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKICAgIGxldCBiYm94ID0gZGljdC5nZXRBcnJheSgiQkJveCIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHsKICAgICAgYmJveCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChiYm94KTsKICAgIH0gZWxzZSB7CiAgICAgIGJib3ggPSBudWxsOwogICAgfQogICAgbGV0IG9wdGlvbmFsQ29udGVudCwgZ3JvdXBPcHRpb25zOwogICAgaWYgKGRpY3QuaGFzKCJPQyIpKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IHRoaXMucGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZGljdC5nZXQoIk9DIiksIHJlc291cmNlcyk7CiAgICB9CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgY29uc3QgZ3JvdXAgPSBkaWN0LmdldCgiR3JvdXAiKTsKICAgIGlmIChncm91cCkgewogICAgICBncm91cE9wdGlvbnMgPSB7CiAgICAgICAgbWF0cml4LAogICAgICAgIGJib3gsCiAgICAgICAgc21hc2ssCiAgICAgICAgaXNvbGF0ZWQ6IGZhbHNlLAogICAgICAgIGtub2Nrb3V0OiBmYWxzZQogICAgICB9OwogICAgICBjb25zdCBncm91cFN1YnR5cGUgPSBncm91cC5nZXQoIlMiKTsKICAgICAgbGV0IGNvbG9yU3BhY2UgPSBudWxsOwogICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZ3JvdXBTdWJ0eXBlLCAiVHJhbnNwYXJlbmN5IikpIHsKICAgICAgICBncm91cE9wdGlvbnMuaXNvbGF0ZWQgPSBncm91cC5nZXQoIkkiKSB8fCBmYWxzZTsKICAgICAgICBncm91cE9wdGlvbnMua25vY2tvdXQgPSBncm91cC5nZXQoIksiKSB8fCBmYWxzZTsKICAgICAgICBpZiAoZ3JvdXAuaGFzKCJDUyIpKSB7CiAgICAgICAgICBjb25zdCBjcyA9IGdyb3VwLmdldFJhdygiQ1MiKTsKICAgICAgICAgIGNvbnN0IGNhY2hlZENvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLmdldENhY2hlZChjcywgdGhpcy54cmVmLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkgewogICAgICAgICAgICBjb2xvclNwYWNlID0gY2FjaGVkQ29sb3JTcGFjZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBhd2FpdCB0aGlzLnBhcnNlQ29sb3JTcGFjZSh7CiAgICAgICAgICAgICAgY3MsCiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc21hc2s/LmJhY2tkcm9wKSB7CiAgICAgICAgY29sb3JTcGFjZSB8fD0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjsKICAgICAgICBzbWFzay5iYWNrZHJvcCA9IGNvbG9yU3BhY2UuZ2V0UmdiKHNtYXNrLmJhY2tkcm9wLCAwKTsKICAgICAgfQogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLmJlZ2luR3JvdXAsIFtncm91cE9wdGlvbnNdKTsKICAgIH0KICAgIGNvbnN0IGFyZ3MgPSBncm91cCA/IFttYXRyaXgsIG51bGxdIDogW21hdHJpeCwgYmJveF07CiAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnBhaW50Rm9ybVhPYmplY3RCZWdpbiwgYXJncyk7CiAgICByZXR1cm4gdGhpcy5nZXRPcGVyYXRvckxpc3QoewogICAgICBzdHJlYW06IHhvYmosCiAgICAgIHRhc2ssCiAgICAgIHJlc291cmNlczogZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlcywKICAgICAgb3BlcmF0b3JMaXN0LAogICAgICBpbml0aWFsU3RhdGUKICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQsIFtdKTsKICAgICAgaWYgKGdyb3VwKSB7CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5lbmRHcm91cCwgW2dyb3VwT3B0aW9uc10pOwogICAgICB9CiAgICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgICB9CiAgICB9KTsKICB9CiAgX3NlbmRJbWdEYXRhKG9iaklkLCBpbWdEYXRhLCBjYWNoZUdsb2JhbGx5ID0gZmFsc2UpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IGltZ0RhdGEgPyBbaW1nRGF0YS5iaXRtYXAgfHwgaW1nRGF0YS5kYXRhLmJ1ZmZlcl0gOiBudWxsOwogICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCB8fCBjYWNoZUdsb2JhbGx5KSB7CiAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW29iaklkLCAiSW1hZ2UiLCBpbWdEYXRhXSwgdHJhbnNmZXJzKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VuZCgib2JqIiwgW29iaklkLCB0aGlzLnBhZ2VJbmRleCwgIkltYWdlIiwgaW1nRGF0YV0sIHRyYW5zZmVycyk7CiAgfQogIGFzeW5jIGJ1aWxkUGFpbnRJbWFnZVhPYmplY3QoewogICAgcmVzb3VyY2VzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgb3BlcmF0b3JMaXN0LAogICAgY2FjaGVLZXksCiAgICBsb2NhbEltYWdlQ2FjaGUsCiAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogIH0pIHsKICAgIGNvbnN0IGRpY3QgPSBpbWFnZS5kaWN0OwogICAgY29uc3QgaW1hZ2VSZWYgPSBkaWN0Lm9iaklkOwogICAgY29uc3QgdyA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBjb25zdCBoID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoISh3ICYmIHR5cGVvZiB3ID09PSAibnVtYmVyIikgfHwgIShoICYmIHR5cGVvZiBoID09PSAibnVtYmVyIikpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJJbWFnZSBkaW1lbnNpb25zIGFyZSBtaXNzaW5nLCBvciBub3QgbnVtYmVycy4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF4SW1hZ2VTaXplID0gdGhpcy5vcHRpb25zLm1heEltYWdlU2l6ZTsKICAgIGlmIChtYXhJbWFnZVNpemUgIT09IC0xICYmIHcgKiBoID4gbWF4SW1hZ2VTaXplKSB7CiAgICAgIGNvbnN0IG1zZyA9ICJJbWFnZSBleGNlZWRlZCBtYXhpbXVtIGFsbG93ZWQgc2l6ZSBhbmQgd2FzIHJlbW92ZWQuIjsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikobXNnKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICB9CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKGRpY3QuaGFzKCJPQyIpKSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGF3YWl0IHRoaXMucGFyc2VNYXJrZWRDb250ZW50UHJvcHMoZGljdC5nZXQoIk9DIiksIHJlc291cmNlcyk7CiAgICB9CiAgICBjb25zdCBpbWFnZU1hc2sgPSBkaWN0LmdldCgiSU0iLCAiSW1hZ2VNYXNrIikgfHwgZmFsc2U7CiAgICBsZXQgaW1nRGF0YSwgYXJnczsKICAgIGlmIChpbWFnZU1hc2spIHsKICAgICAgY29uc3QgaW50ZXJwb2xhdGUgPSBkaWN0LmdldCgiSSIsICJJbnRlcnBvbGF0ZSIpOwogICAgICBjb25zdCBiaXRTdHJpZGVMZW5ndGggPSB3ICsgNyA+PiAzOwogICAgICBjb25zdCBpbWdBcnJheSA9IGltYWdlLmdldEJ5dGVzKGJpdFN0cmlkZUxlbmd0aCAqIGgpOwogICAgICBjb25zdCBkZWNvZGUgPSBkaWN0LmdldEFycmF5KCJEIiwgIkRlY29kZSIpOwogICAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgaW1nRGF0YSA9IF9pbWFnZS5QREZJbWFnZS5jcmVhdGVSYXdNYXNrKHsKICAgICAgICAgIGltZ0FycmF5LAogICAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgICBoZWlnaHQ6IGgsCiAgICAgICAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbTogaW1hZ2UgaW5zdGFuY2VvZiBfZGVjb2RlX3N0cmVhbS5EZWNvZGVTdHJlYW0sCiAgICAgICAgICBpbnZlcnNlRGVjb2RlOiBkZWNvZGU/LlswXSA+IDAsCiAgICAgICAgICBpbnRlcnBvbGF0ZQogICAgICAgIH0pOwogICAgICAgIGltZ0RhdGEuY2FjaGVkID0gISFjYWNoZUtleTsKICAgICAgICBhcmdzID0gW2ltZ0RhdGFdOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgICAgIGlmIChjYWNoZUtleSkgewogICAgICAgICAgY29uc3QgY2FjaGVEYXRhID0gewogICAgICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwKICAgICAgICAgICAgYXJncywKICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgICAgICB9OwogICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLnNldChjYWNoZUtleSwgaW1hZ2VSZWYsIGNhY2hlRGF0YSk7CiAgICAgICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGltZ0RhdGEgPSBhd2FpdCBfaW1hZ2UuUERGSW1hZ2UuY3JlYXRlTWFzayh7CiAgICAgICAgaW1nQXJyYXksCiAgICAgICAgd2lkdGg6IHcsCiAgICAgICAgaGVpZ2h0OiBoLAogICAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtOiBpbWFnZSBpbnN0YW5jZW9mIF9kZWNvZGVfc3RyZWFtLkRlY29kZVN0cmVhbSwKICAgICAgICBpbnZlcnNlRGVjb2RlOiBkZWNvZGU/LlswXSA+IDAsCiAgICAgICAgaW50ZXJwb2xhdGUsCiAgICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IHRoaXMub3B0aW9ucy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZAogICAgICB9KTsKICAgICAgaWYgKGltZ0RhdGEuaXNTaW5nbGVPcGFxdWVQaXhlbCkgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhfdXRpbC5PUFMucGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrLCBbXSwgb3B0aW9uYWxDb250ZW50KTsKICAgICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHsKICAgICAgICAgICAgZm46IF91dGlsLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2ssCiAgICAgICAgICAgIGFyZ3M6IFtdLAogICAgICAgICAgICBvcHRpb25hbENvbnRlbnQKICAgICAgICAgIH07CiAgICAgICAgICBsb2NhbEltYWdlQ2FjaGUuc2V0KGNhY2hlS2V5LCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgICAgICB0aGlzLl9yZWdpb25hbEltYWdlQ2FjaGUuc2V0KG51bGwsIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb2JqSWQgPSBgbWFza18ke3RoaXMuaWRGYWN0b3J5LmNyZWF0ZU9iaklkKCl9YDsKICAgICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kob2JqSWQpOwogICAgICB0aGlzLl9zZW5kSW1nRGF0YShvYmpJZCwgaW1nRGF0YSk7CiAgICAgIGFyZ3MgPSBbewogICAgICAgIGRhdGE6IG9iaklkLAogICAgICAgIHdpZHRoOiBpbWdEYXRhLndpZHRoLAogICAgICAgIGhlaWdodDogaW1nRGF0YS5oZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGU6IGltZ0RhdGEuaW50ZXJwb2xhdGUsCiAgICAgICAgY291bnQ6IDEKICAgICAgfV07CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0LCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgICBpZiAoY2FjaGVLZXkpIHsKICAgICAgICBjb25zdCBjYWNoZURhdGEgPSB7CiAgICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdCwKICAgICAgICAgIGFyZ3MsCiAgICAgICAgICBvcHRpb25hbENvbnRlbnQKICAgICAgICB9OwogICAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgIGlmIChpbWFnZVJlZikgewogICAgICAgICAgdGhpcy5fcmVnaW9uYWxJbWFnZUNhY2hlLnNldChudWxsLCBpbWFnZVJlZiwgY2FjaGVEYXRhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc29mdE1hc2sgPSBkaWN0LmdldCgiU00iLCAiU01hc2siKSB8fCBmYWxzZTsKICAgIGNvbnN0IG1hc2sgPSBkaWN0LmdldCgiTWFzayIpIHx8IGZhbHNlOwogICAgY29uc3QgU01BTExfSU1BR0VfRElNRU5TSU9OUyA9IDIwMDsKICAgIGlmIChpc0lubGluZSAmJiAhc29mdE1hc2sgJiYgIW1hc2sgJiYgdyArIGggPCBTTUFMTF9JTUFHRV9ESU1FTlNJT05TKSB7CiAgICAgIGNvbnN0IGltYWdlT2JqID0gbmV3IF9pbWFnZS5QREZJbWFnZSh7CiAgICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICAgIHJlczogcmVzb3VyY2VzLAogICAgICAgIGltYWdlLAogICAgICAgIGlzSW5saW5lLAogICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeTogdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgIH0pOwogICAgICBpbWdEYXRhID0gYXdhaXQgaW1hZ2VPYmouY3JlYXRlSW1hZ2VEYXRhKHRydWUsIGZhbHNlKTsKICAgICAgb3BlcmF0b3JMaXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkOwogICAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMoX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0LCBbaW1nRGF0YV0sIG9wdGlvbmFsQ29udGVudCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBvYmpJZCA9IGBpbWdfJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWAsCiAgICAgIGNhY2hlR2xvYmFsbHkgPSBmYWxzZTsKICAgIGlmICh0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpIHsKICAgICAgb2JqSWQgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV90eXBlM18ke29iaklkfWA7CiAgICB9IGVsc2UgaWYgKGltYWdlUmVmKSB7CiAgICAgIGNhY2hlR2xvYmFsbHkgPSB0aGlzLmdsb2JhbEltYWdlQ2FjaGUuc2hvdWxkQ2FjaGUoaW1hZ2VSZWYsIHRoaXMucGFnZUluZGV4KTsKICAgICAgaWYgKGNhY2hlR2xvYmFsbHkpIHsKICAgICAgICBvYmpJZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9XyR7b2JqSWR9YDsKICAgICAgfQogICAgfQogICAgb3BlcmF0b3JMaXN0LmFkZERlcGVuZGVuY3kob2JqSWQpOwogICAgYXJncyA9IFtvYmpJZCwgdywgaF07CiAgICBfaW1hZ2UuUERGSW1hZ2UuYnVpbGRJbWFnZSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgcmVzOiByZXNvdXJjZXMsCiAgICAgIGltYWdlLAogICAgICBpc0lubGluZSwKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KS50aGVuKGFzeW5jIGltYWdlT2JqID0+IHsKICAgICAgaW1nRGF0YSA9IGF3YWl0IGltYWdlT2JqLmNyZWF0ZUltYWdlRGF0YShmYWxzZSwgdGhpcy5vcHRpb25zLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTsKICAgICAgaWYgKGNhY2hlS2V5ICYmIGltYWdlUmVmICYmIGNhY2hlR2xvYmFsbHkpIHsKICAgICAgICBsZXQgbGVuZ3RoID0gMDsKICAgICAgICBpZiAoaW1nRGF0YS5iaXRtYXApIHsKICAgICAgICAgIGxlbmd0aCA9IGltZ0RhdGEud2lkdGggKiBpbWdEYXRhLmhlaWdodCAqIDQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxlbmd0aCA9IGltZ0RhdGEuZGF0YS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5hZGRCeXRlU2l6ZShpbWFnZVJlZiwgbGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc2VuZEltZ0RhdGEob2JqSWQsIGltZ0RhdGEsIGNhY2hlR2xvYmFsbHkpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmFibGUgdG8gZGVjb2RlIGltYWdlICIke29iaklkfSI6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm4gdGhpcy5fc2VuZEltZ0RhdGEob2JqSWQsIG51bGwsIGNhY2hlR2xvYmFsbHkpOwogICAgfSk7CiAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMoX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LCBhcmdzLCBvcHRpb25hbENvbnRlbnQpOwogICAgaWYgKGNhY2hlS2V5KSB7CiAgICAgIGNvbnN0IGNhY2hlRGF0YSA9IHsKICAgICAgICBmbjogX3V0aWwuT1BTLnBhaW50SW1hZ2VYT2JqZWN0LAogICAgICAgIGFyZ3MsCiAgICAgICAgb3B0aW9uYWxDb250ZW50CiAgICAgIH07CiAgICAgIGxvY2FsSW1hZ2VDYWNoZS5zZXQoY2FjaGVLZXksIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICBpZiAoaW1hZ2VSZWYpIHsKICAgICAgICB0aGlzLl9yZWdpb25hbEltYWdlQ2FjaGUuc2V0KG51bGwsIGltYWdlUmVmLCBjYWNoZURhdGEpOwogICAgICAgIGlmIChjYWNoZUdsb2JhbGx5KSB7CiAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSghaXNJbmxpbmUsICJDYW5ub3QgY2FjaGUgYW4gaW5saW5lIGltYWdlIGdsb2JhbGx5LiIpOwogICAgICAgICAgdGhpcy5nbG9iYWxJbWFnZUNhY2hlLnNldERhdGEoaW1hZ2VSZWYsIHsKICAgICAgICAgICAgb2JqSWQsCiAgICAgICAgICAgIGZuOiBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3QsCiAgICAgICAgICAgIGFyZ3MsCiAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudCwKICAgICAgICAgICAgYnl0ZVNpemU6IDAKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBoYW5kbGVTTWFzayhzbWFzaywgcmVzb3VyY2VzLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlciwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIGNvbnN0IHNtYXNrQ29udGVudCA9IHNtYXNrLmdldCgiRyIpOwogICAgY29uc3Qgc21hc2tPcHRpb25zID0gewogICAgICBzdWJ0eXBlOiBzbWFzay5nZXQoIlMiKS5uYW1lLAogICAgICBiYWNrZHJvcDogc21hc2suZ2V0KCJCQyIpCiAgICB9OwogICAgY29uc3QgdHJhbnNmZXJPYmogPSBzbWFzay5nZXQoIlRSIik7CiAgICBpZiAoKDAsIF9mdW5jdGlvbi5pc1BERkZ1bmN0aW9uKSh0cmFuc2Zlck9iaikpIHsKICAgICAgY29uc3QgdHJhbnNmZXJGbiA9IHRoaXMuX3BkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGUodHJhbnNmZXJPYmopOwogICAgICBjb25zdCB0cmFuc2Zlck1hcCA9IG5ldyBVaW50OEFycmF5KDI1Nik7CiAgICAgIGNvbnN0IHRtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICB0bXBbMF0gPSBpIC8gMjU1OwogICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApOwogICAgICAgIHRyYW5zZmVyTWFwW2ldID0gdG1wWzBdICogMjU1IHwgMDsKICAgICAgfQogICAgICBzbWFza09wdGlvbnMudHJhbnNmZXJNYXAgPSB0cmFuc2Zlck1hcDsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ1aWxkRm9ybVhPYmplY3QocmVzb3VyY2VzLCBzbWFza0NvbnRlbnQsIHNtYXNrT3B0aW9ucywgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogIH0KICBoYW5kbGVUcmFuc2ZlckZ1bmN0aW9uKHRyKSB7CiAgICBsZXQgdHJhbnNmZXJBcnJheTsKICAgIGlmIChBcnJheS5pc0FycmF5KHRyKSkgewogICAgICB0cmFuc2ZlckFycmF5ID0gdHI7CiAgICB9IGVsc2UgaWYgKCgwLCBfZnVuY3Rpb24uaXNQREZGdW5jdGlvbikodHIpKSB7CiAgICAgIHRyYW5zZmVyQXJyYXkgPSBbdHJdOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCB0cmFuc2Zlck1hcHMgPSBbXTsKICAgIGxldCBudW1GbnMgPSAwLAogICAgICBudW1FZmZlY3RmdWxGbnMgPSAwOwogICAgZm9yIChjb25zdCBlbnRyeSBvZiB0cmFuc2ZlckFycmF5KSB7CiAgICAgIGNvbnN0IHRyYW5zZmVyT2JqID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZW50cnkpOwogICAgICBudW1GbnMrKzsKICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHRyYW5zZmVyT2JqLCAiSWRlbnRpdHkiKSkgewogICAgICAgIHRyYW5zZmVyTWFwcy5wdXNoKG51bGwpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCEoMCwgX2Z1bmN0aW9uLmlzUERGRnVuY3Rpb24pKHRyYW5zZmVyT2JqKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHRyYW5zZmVyRm4gPSB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlKHRyYW5zZmVyT2JqKTsKICAgICAgY29uc3QgdHJhbnNmZXJNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpLAogICAgICAgIHRtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMjU2OyBqKyspIHsKICAgICAgICB0bXBbMF0gPSBqIC8gMjU1OwogICAgICAgIHRyYW5zZmVyRm4odG1wLCAwLCB0bXAsIDApOwogICAgICAgIHRyYW5zZmVyTWFwW2pdID0gdG1wWzBdICogMjU1IHwgMDsKICAgICAgfQogICAgICB0cmFuc2Zlck1hcHMucHVzaCh0cmFuc2Zlck1hcCk7CiAgICAgIG51bUVmZmVjdGZ1bEZucysrOwogICAgfQogICAgaWYgKCEobnVtRm5zID09PSAxIHx8IG51bUZucyA9PT0gNCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAobnVtRWZmZWN0ZnVsRm5zID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHRyYW5zZmVyTWFwczsKICB9CiAgaGFuZGxlVGlsaW5nVHlwZShmbiwgY29sb3IsIHJlc291cmNlcywgcGF0dGVybiwgcGF0dGVybkRpY3QsIG9wZXJhdG9yTGlzdCwgdGFzaywgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUpIHsKICAgIGNvbnN0IHRpbGluZ09wTGlzdCA9IG5ldyBfb3BlcmF0b3JfbGlzdC5PcGVyYXRvckxpc3QoKTsKICAgIGNvbnN0IHBhdHRlcm5SZXNvdXJjZXMgPSBfcHJpbWl0aXZlcy5EaWN0Lm1lcmdlKHsKICAgICAgeHJlZjogdGhpcy54cmVmLAogICAgICBkaWN0QXJyYXk6IFtwYXR0ZXJuRGljdC5nZXQoIlJlc291cmNlcyIpLCByZXNvdXJjZXNdCiAgICB9KTsKICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgIHN0cmVhbTogcGF0dGVybiwKICAgICAgdGFzaywKICAgICAgcmVzb3VyY2VzOiBwYXR0ZXJuUmVzb3VyY2VzLAogICAgICBvcGVyYXRvckxpc3Q6IHRpbGluZ09wTGlzdAogICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdElSID0gdGlsaW5nT3BMaXN0LmdldElSKCk7CiAgICAgIGNvbnN0IHRpbGluZ1BhdHRlcm5JUiA9ICgwLCBfcGF0dGVybi5nZXRUaWxpbmdQYXR0ZXJuSVIpKG9wZXJhdG9yTGlzdElSLCBwYXR0ZXJuRGljdCwgY29sb3IpOwogICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jaWVzKHRpbGluZ09wTGlzdC5kZXBlbmRlbmNpZXMpOwogICAgICBvcGVyYXRvckxpc3QuYWRkT3AoZm4sIHRpbGluZ1BhdHRlcm5JUik7CiAgICAgIGlmIChwYXR0ZXJuRGljdC5vYmpJZCkgewogICAgICAgIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLnNldChudWxsLCBwYXR0ZXJuRGljdC5vYmpJZCwgewogICAgICAgICAgb3BlcmF0b3JMaXN0SVIsCiAgICAgICAgICBkaWN0OiBwYXR0ZXJuRGljdAogICAgICAgIH0pOwogICAgICB9CiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYGhhbmRsZVRpbGluZ1R5cGUgLSBpZ25vcmluZyBwYXR0ZXJuOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBmb250QXJncywgZm9udFJlZiwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZSwgZmFsbGJhY2tGb250RGljdCA9IG51bGwsIGNzc0ZvbnRJbmZvID0gbnVsbCkgewogICAgY29uc3QgZm9udE5hbWUgPSBmb250QXJncz8uWzBdIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSA/IGZvbnRBcmdzWzBdLm5hbWUgOiBudWxsOwogICAgcmV0dXJuIHRoaXMubG9hZEZvbnQoZm9udE5hbWUsIGZvbnRSZWYsIHJlc291cmNlcywgZmFsbGJhY2tGb250RGljdCwgY3NzRm9udEluZm8pLnRoZW4odHJhbnNsYXRlZCA9PiB7CiAgICAgIGlmICghdHJhbnNsYXRlZC5mb250LmlzVHlwZTNGb250KSB7CiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQubG9hZFR5cGUzRGF0YSh0aGlzLCByZXNvdXJjZXMsIHRhc2spLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmNpZXModHJhbnNsYXRlZC50eXBlM0RlcGVuZGVuY2llcyk7CiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7CiAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgICAgICBsb2FkZWROYW1lOiAiZ19mb250X2Vycm9yIiwKICAgICAgICAgIGZvbnQ6IG5ldyBfZm9udHMuRXJyb3JGb250KGBUeXBlMyBmb250IGxvYWQgZXJyb3I6ICR7cmVhc29ufWApLAogICAgICAgICAgZGljdDogdHJhbnNsYXRlZC5mb250LAogICAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSkudGhlbih0cmFuc2xhdGVkID0+IHsKICAgICAgc3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKICAgICAgdHJhbnNsYXRlZC5zZW5kKHRoaXMuaGFuZGxlcik7CiAgICAgIHJldHVybiB0cmFuc2xhdGVkLmxvYWRlZE5hbWU7CiAgICB9KTsKICB9CiAgaGFuZGxlVGV4dChjaGFycywgc3RhdGUpIHsKICAgIGNvbnN0IGZvbnQgPSBzdGF0ZS5mb250OwogICAgY29uc3QgZ2x5cGhzID0gZm9udC5jaGFyc1RvR2x5cGhzKGNoYXJzKTsKICAgIGlmIChmb250LmRhdGEpIHsKICAgICAgY29uc3QgaXNBZGRUb1BhdGhTZXQgPSAhIShzdGF0ZS50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpOwogICAgICBpZiAoaXNBZGRUb1BhdGhTZXQgfHwgc3RhdGUuZmlsbENvbG9yU3BhY2UubmFtZSA9PT0gIlBhdHRlcm4iIHx8IGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlRm9udEZhY2UpIHsKICAgICAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKGZvbnQsIGdseXBocywgdGhpcy5oYW5kbGVyLCB0aGlzLm9wdGlvbnMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZ2x5cGhzOwogIH0KICBlbnN1cmVTdGF0ZUZvbnQoc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5mb250KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlYXNvbiA9IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWlzc2luZyBzZXRGb250IChUZikgb3BlcmF0b3IgYmVmb3JlIHRleHQgcmVuZGVyaW5nIG9wZXJhdG9yLiIpOwogICAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBlbnN1cmVTdGF0ZUZvbnQ6ICIke3JlYXNvbn0iLmApOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aHJvdyByZWFzb247CiAgfQogIGFzeW5jIHNldEdTdGF0ZSh7CiAgICByZXNvdXJjZXMsCiAgICBnU3RhdGUsCiAgICBvcGVyYXRvckxpc3QsCiAgICBjYWNoZUtleSwKICAgIHRhc2ssCiAgICBzdGF0ZU1hbmFnZXIsCiAgICBsb2NhbEdTdGF0ZUNhY2hlLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICB9KSB7CiAgICBjb25zdCBnU3RhdGVSZWYgPSBnU3RhdGUub2JqSWQ7CiAgICBsZXQgaXNTaW1wbGVHU3RhdGUgPSB0cnVlOwogICAgY29uc3QgZ1N0YXRlT2JqID0gW107CiAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgZm9yIChjb25zdCBrZXkgb2YgZ1N0YXRlLmdldEtleXMoKSkgewogICAgICBjb25zdCB2YWx1ZSA9IGdTdGF0ZS5nZXQoa2V5KTsKICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICBjYXNlICJUeXBlIjoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkxXIjoKICAgICAgICBjYXNlICJMQyI6CiAgICAgICAgY2FzZSAiTEoiOgogICAgICAgIGNhc2UgIk1MIjoKICAgICAgICBjYXNlICJEIjoKICAgICAgICBjYXNlICJSSSI6CiAgICAgICAgY2FzZSAiRkwiOgogICAgICAgIGNhc2UgIkNBIjoKICAgICAgICBjYXNlICJjYSI6CiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB2YWx1ZV0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRm9udCI6CiAgICAgICAgICBpc1NpbXBsZUdTdGF0ZSA9IGZhbHNlOwogICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBudWxsLCB2YWx1ZVswXSwgb3BlcmF0b3JMaXN0LCB0YXNrLCBzdGF0ZU1hbmFnZXIuc3RhdGUpLnRoZW4oZnVuY3Rpb24gKGxvYWRlZE5hbWUpIHsKICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShsb2FkZWROYW1lKTsKICAgICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBbbG9hZGVkTmFtZSwgdmFsdWVbMV1dXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJCTSI6CiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCBub3JtYWxpemVCbGVuZE1vZGUodmFsdWUpXSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTTWFzayI6CiAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodmFsdWUsICJOb25lIikpIHsKICAgICAgICAgICAgZ1N0YXRlT2JqLnB1c2goW2tleSwgZmFsc2VdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICAgIGlzU2ltcGxlR1N0YXRlID0gZmFsc2U7CiAgICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVNNYXNrKHZhbHVlLCByZXNvdXJjZXMsIG9wZXJhdG9yTGlzdCwgdGFzaywgc3RhdGVNYW5hZ2VyLCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cnVlXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIFNNYXNrIHR5cGUiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlRSIjoKICAgICAgICAgIGNvbnN0IHRyYW5zZmVyTWFwcyA9IHRoaXMuaGFuZGxlVHJhbnNmZXJGdW5jdGlvbih2YWx1ZSk7CiAgICAgICAgICBnU3RhdGVPYmoucHVzaChba2V5LCB0cmFuc2Zlck1hcHNdKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIk9QIjoKICAgICAgICBjYXNlICJvcCI6CiAgICAgICAgY2FzZSAiT1BNIjoKICAgICAgICBjYXNlICJCRyI6CiAgICAgICAgY2FzZSAiQkcyIjoKICAgICAgICBjYXNlICJVQ1IiOgogICAgICAgIGNhc2UgIlVDUjIiOgogICAgICAgIGNhc2UgIlRSMiI6CiAgICAgICAgY2FzZSAiSFQiOgogICAgICAgIGNhc2UgIlNNIjoKICAgICAgICBjYXNlICJTQSI6CiAgICAgICAgY2FzZSAiQUlTIjoKICAgICAgICBjYXNlICJUSyI6CiAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoImdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJVbmtub3duIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgIiArIGtleSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChnU3RhdGVPYmoubGVuZ3RoID4gMCkgewogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0R1N0YXRlLCBbZ1N0YXRlT2JqXSk7CiAgICAgIH0KICAgICAgaWYgKGlzU2ltcGxlR1N0YXRlKSB7CiAgICAgICAgbG9jYWxHU3RhdGVDYWNoZS5zZXQoY2FjaGVLZXksIGdTdGF0ZVJlZiwgZ1N0YXRlT2JqKTsKICAgICAgfQogICAgfSk7CiAgfQogIGxvYWRGb250KGZvbnROYW1lLCBmb250LCByZXNvdXJjZXMsIGZhbGxiYWNrRm9udERpY3QgPSBudWxsLCBjc3NGb250SW5mbyA9IG51bGwpIHsKICAgIGNvbnN0IGVycm9yRm9udCA9IGFzeW5jICgpID0+IHsKICAgICAgcmV0dXJuIG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgICAgbG9hZGVkTmFtZTogImdfZm9udF9lcnJvciIsCiAgICAgICAgZm9udDogbmV3IF9mb250cy5FcnJvckZvbnQoYEZvbnQgIiR7Zm9udE5hbWV9IiBpcyBub3QgYXZhaWxhYmxlLmApLAogICAgICAgIGRpY3Q6IGZvbnQsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgIH0pOwogICAgfTsKICAgIGxldCBmb250UmVmOwogICAgaWYgKGZvbnQpIHsKICAgICAgaWYgKGZvbnQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICBmb250UmVmID0gZm9udDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZm9udFJlcyA9IHJlc291cmNlcy5nZXQoIkZvbnQiKTsKICAgICAgaWYgKGZvbnRSZXMpIHsKICAgICAgICBmb250UmVmID0gZm9udFJlcy5nZXRSYXcoZm9udE5hbWUpOwogICAgICB9CiAgICB9CiAgICBpZiAoZm9udFJlZikgewogICAgICBpZiAodGhpcy5wYXJzaW5nVHlwZTNGb250ICYmIHRoaXMudHlwZTNGb250UmVmcy5oYXMoZm9udFJlZikpIHsKICAgICAgICByZXR1cm4gZXJyb3JGb250KCk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZm9udENhY2hlLmhhcyhmb250UmVmKSkgewogICAgICAgIHJldHVybiB0aGlzLmZvbnRDYWNoZS5nZXQoZm9udFJlZik7CiAgICAgIH0KICAgICAgZm9udCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZvbnRSZWYpOwogICAgfQogICAgaWYgKCEoZm9udCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIGlmICghdGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycyAmJiAhdGhpcy5wYXJzaW5nVHlwZTNGb250KSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZS5gKTsKICAgICAgICByZXR1cm4gZXJyb3JGb250KCk7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBGb250ICIke2ZvbnROYW1lfSIgaXMgbm90IGF2YWlsYWJsZSAtLSBhdHRlbXB0aW5nIHRvIGZhbGxiYWNrIHRvIGEgZGVmYXVsdCBmb250LmApOwogICAgICBmb250ID0gZmFsbGJhY2tGb250RGljdCB8fCBQYXJ0aWFsRXZhbHVhdG9yLmZhbGxiYWNrRm9udERpY3Q7CiAgICB9CiAgICBpZiAoZm9udC5jYWNoZUtleSAmJiB0aGlzLmZvbnRDYWNoZS5oYXMoZm9udC5jYWNoZUtleSkpIHsKICAgICAgcmV0dXJuIHRoaXMuZm9udENhY2hlLmdldChmb250LmNhY2hlS2V5KTsKICAgIH0KICAgIGNvbnN0IGZvbnRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7CiAgICBsZXQgcHJlRXZhbHVhdGVkRm9udDsKICAgIHRyeSB7CiAgICAgIHByZUV2YWx1YXRlZEZvbnQgPSB0aGlzLnByZUV2YWx1YXRlRm9udChmb250KTsKICAgICAgcHJlRXZhbHVhdGVkRm9udC5jc3NGb250SW5mbyA9IGNzc0ZvbnRJbmZvOwogICAgfSBjYXRjaCAocmVhc29uKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgbG9hZEZvbnQgLSBwcmVFdmFsdWF0ZUZvbnQgZmFpbGVkOiAiJHtyZWFzb259Ii5gKTsKICAgICAgcmV0dXJuIGVycm9yRm9udCgpOwogICAgfQogICAgY29uc3QgewogICAgICBkZXNjcmlwdG9yLAogICAgICBoYXNoCiAgICB9ID0gcHJlRXZhbHVhdGVkRm9udDsKICAgIGNvbnN0IGZvbnRSZWZJc1JlZiA9IGZvbnRSZWYgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWY7CiAgICBsZXQgZm9udElEOwogICAgaWYgKGhhc2ggJiYgZGVzY3JpcHRvciBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgY29uc3QgZm9udEFsaWFzZXMgPSBkZXNjcmlwdG9yLmZvbnRBbGlhc2VzIHx8PSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBpZiAoZm9udEFsaWFzZXNbaGFzaF0pIHsKICAgICAgICBjb25zdCBhbGlhc0ZvbnRSZWYgPSBmb250QWxpYXNlc1toYXNoXS5hbGlhc1JlZjsKICAgICAgICBpZiAoZm9udFJlZklzUmVmICYmIGFsaWFzRm9udFJlZiAmJiB0aGlzLmZvbnRDYWNoZS5oYXMoYWxpYXNGb250UmVmKSkgewogICAgICAgICAgdGhpcy5mb250Q2FjaGUucHV0QWxpYXMoZm9udFJlZiwgYWxpYXNGb250UmVmKTsKICAgICAgICAgIHJldHVybiB0aGlzLmZvbnRDYWNoZS5nZXQoZm9udFJlZik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdID0gewogICAgICAgICAgZm9udElEOiB0aGlzLmlkRmFjdG9yeS5jcmVhdGVGb250SWQoKQogICAgICAgIH07CiAgICAgIH0KICAgICAgaWYgKGZvbnRSZWZJc1JlZikgewogICAgICAgIGZvbnRBbGlhc2VzW2hhc2hdLmFsaWFzUmVmID0gZm9udFJlZjsKICAgICAgfQogICAgICBmb250SUQgPSBmb250QWxpYXNlc1toYXNoXS5mb250SUQ7CiAgICB9IGVsc2UgewogICAgICBmb250SUQgPSB0aGlzLmlkRmFjdG9yeS5jcmVhdGVGb250SWQoKTsKICAgIH0KICAgICgwLCBfdXRpbC5hc3NlcnQpKGZvbnRJRD8uc3RhcnRzV2l0aCgiZiIpLCAnVGhlICJmb250SUQiIG11c3QgYmUgKGNvcnJlY3RseSkgZGVmaW5lZC4nKTsKICAgIGlmIChmb250UmVmSXNSZWYpIHsKICAgICAgdGhpcy5mb250Q2FjaGUucHV0KGZvbnRSZWYsIGZvbnRDYXBhYmlsaXR5LnByb21pc2UpOwogICAgfSBlbHNlIHsKICAgICAgZm9udC5jYWNoZUtleSA9IGBjYWNoZUtleV8ke2ZvbnRJRH1gOwogICAgICB0aGlzLmZvbnRDYWNoZS5wdXQoZm9udC5jYWNoZUtleSwgZm9udENhcGFiaWxpdHkucHJvbWlzZSk7CiAgICB9CiAgICBmb250LmxvYWRlZE5hbWUgPSBgJHt0aGlzLmlkRmFjdG9yeS5nZXREb2NJZCgpfV8ke2ZvbnRJRH1gOwogICAgdGhpcy50cmFuc2xhdGVGb250KHByZUV2YWx1YXRlZEZvbnQpLnRoZW4odHJhbnNsYXRlZEZvbnQgPT4gewogICAgICBmb250Q2FwYWJpbGl0eS5yZXNvbHZlKG5ldyBUcmFuc2xhdGVkRm9udCh7CiAgICAgICAgbG9hZGVkTmFtZTogZm9udC5sb2FkZWROYW1lLAogICAgICAgIGZvbnQ6IHRyYW5zbGF0ZWRGb250LAogICAgICAgIGRpY3Q6IGZvbnQsCiAgICAgICAgZXZhbHVhdG9yT3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgIH0pKTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgbG9hZEZvbnQgLSB0cmFuc2xhdGVGb250IGZhaWxlZDogIiR7cmVhc29ufSIuYCk7CiAgICAgIGZvbnRDYXBhYmlsaXR5LnJlc29sdmUobmV3IFRyYW5zbGF0ZWRGb250KHsKICAgICAgICBsb2FkZWROYW1lOiBmb250LmxvYWRlZE5hbWUsCiAgICAgICAgZm9udDogbmV3IF9mb250cy5FcnJvckZvbnQocmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24ubWVzc2FnZSA6IHJlYXNvbiksCiAgICAgICAgZGljdDogZm9udCwKICAgICAgICBldmFsdWF0b3JPcHRpb25zOiB0aGlzLm9wdGlvbnMKICAgICAgfSkpOwogICAgfSk7CiAgICByZXR1cm4gZm9udENhcGFiaWxpdHkucHJvbWlzZTsKICB9CiAgYnVpbGRQYXRoKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIHBhcnNpbmdUZXh0ID0gZmFsc2UpIHsKICAgIGNvbnN0IGxhc3RJbmRleCA9IG9wZXJhdG9yTGlzdC5sZW5ndGggLSAxOwogICAgaWYgKCFhcmdzKSB7CiAgICAgIGFyZ3MgPSBbXTsKICAgIH0KICAgIGlmIChsYXN0SW5kZXggPCAwIHx8IG9wZXJhdG9yTGlzdC5mbkFycmF5W2xhc3RJbmRleF0gIT09IF91dGlsLk9QUy5jb25zdHJ1Y3RQYXRoKSB7CiAgICAgIGlmIChwYXJzaW5nVGV4dCkgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgRW5jb3VudGVyZWQgcGF0aCBvcGVyYXRvciAiJHtmbn0iIGluc2lkZSBvZiBhIHRleHQgb2JqZWN0LmApOwogICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2F2ZSwgbnVsbCk7CiAgICAgIH0KICAgICAgbGV0IG1pbk1heDsKICAgICAgc3dpdGNoIChmbikgewogICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZToKICAgICAgICAgIGNvbnN0IHggPSBhcmdzWzBdICsgYXJnc1syXTsKICAgICAgICAgIGNvbnN0IHkgPSBhcmdzWzFdICsgYXJnc1szXTsKICAgICAgICAgIG1pbk1heCA9IFtNYXRoLm1pbihhcmdzWzBdLCB4KSwgTWF0aC5tYXgoYXJnc1swXSwgeCksIE1hdGgubWluKGFyZ3NbMV0sIHkpLCBNYXRoLm1heChhcmdzWzFdLCB5KV07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVG86CiAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOgogICAgICAgICAgbWluTWF4ID0gW2FyZ3NbMF0sIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMV1dOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIG1pbk1heCA9IFtJbmZpbml0eSwgLUluZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5XTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuY29uc3RydWN0UGF0aCwgW1tmbl0sIGFyZ3MsIG1pbk1heF0pOwogICAgICBpZiAocGFyc2luZ1RleHQpIHsKICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnJlc3RvcmUsIG51bGwpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBvcEFyZ3MgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5W2xhc3RJbmRleF07CiAgICAgIG9wQXJnc1swXS5wdXNoKGZuKTsKICAgICAgb3BBcmdzWzFdLnB1c2goLi4uYXJncyk7CiAgICAgIGNvbnN0IG1pbk1heCA9IG9wQXJnc1syXTsKICAgICAgc3dpdGNoIChmbikgewogICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZToKICAgICAgICAgIGNvbnN0IHggPSBhcmdzWzBdICsgYXJnc1syXTsKICAgICAgICAgIGNvbnN0IHkgPSBhcmdzWzFdICsgYXJnc1szXTsKICAgICAgICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgYXJnc1swXSwgeCk7CiAgICAgICAgICBtaW5NYXhbMV0gPSBNYXRoLm1heChtaW5NYXhbMV0sIGFyZ3NbMF0sIHgpOwogICAgICAgICAgbWluTWF4WzJdID0gTWF0aC5taW4obWluTWF4WzJdLCBhcmdzWzFdLCB5KTsKICAgICAgICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgYXJnc1sxXSwgeSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVG86CiAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOgogICAgICAgICAgbWluTWF4WzBdID0gTWF0aC5taW4obWluTWF4WzBdLCBhcmdzWzBdKTsKICAgICAgICAgIG1pbk1heFsxXSA9IE1hdGgubWF4KG1pbk1heFsxXSwgYXJnc1swXSk7CiAgICAgICAgICBtaW5NYXhbMl0gPSBNYXRoLm1pbihtaW5NYXhbMl0sIGFyZ3NbMV0pOwogICAgICAgICAgbWluTWF4WzNdID0gTWF0aC5tYXgobWluTWF4WzNdLCBhcmdzWzFdKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlQ29sb3JTcGFjZSh7CiAgICBjcywKICAgIHJlc291cmNlcywKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgfSkgewogICAgcmV0dXJuIF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UucGFyc2VBc3luYyh7CiAgICAgIGNzLAogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIHJlc291cmNlcywKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5OiB0aGlzLl9wZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICB9KS5jYXRjaChyZWFzb24gPT4gewogICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgcGFyc2VDb2xvclNwYWNlIC0gaWdub3JpbmcgQ29sb3JTcGFjZTogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIHBhcnNlU2hhZGluZyh7CiAgICBzaGFkaW5nLAogICAgcmVzb3VyY2VzLAogICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUsCiAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUKICB9KSB7CiAgICBsZXQgaWQgPSBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuZ2V0KHNoYWRpbmcpOwogICAgaWYgKCFpZCkgewogICAgICB2YXIgc2hhZGluZ0ZpbGwgPSBfcGF0dGVybi5QYXR0ZXJuLnBhcnNlU2hhZGluZyhzaGFkaW5nLCB0aGlzLnhyZWYsIHJlc291cmNlcywgdGhpcy5fcGRmRnVuY3Rpb25GYWN0b3J5LCBsb2NhbENvbG9yU3BhY2VDYWNoZSk7CiAgICAgIGNvbnN0IHBhdHRlcm5JUiA9IHNoYWRpbmdGaWxsLmdldElSKCk7CiAgICAgIGlkID0gYHBhdHRlcm5fJHt0aGlzLmlkRmFjdG9yeS5jcmVhdGVPYmpJZCgpfWA7CiAgICAgIGlmICh0aGlzLnBhcnNpbmdUeXBlM0ZvbnQpIHsKICAgICAgICBpZCA9IGAke3RoaXMuaWRGYWN0b3J5LmdldERvY0lkKCl9X3R5cGUzXyR7aWR9YDsKICAgICAgfQogICAgICBsb2NhbFNoYWRpbmdQYXR0ZXJuQ2FjaGUuc2V0KHNoYWRpbmcsIGlkKTsKICAgICAgaWYgKHRoaXMucGFyc2luZ1R5cGUzRm9udCkgewogICAgICAgIHRoaXMuaGFuZGxlci5zZW5kKCJjb21tb25vYmoiLCBbaWQsICJQYXR0ZXJuIiwgcGF0dGVybklSXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5oYW5kbGVyLnNlbmQoIm9iaiIsIFtpZCwgdGhpcy5wYWdlSW5kZXgsICJQYXR0ZXJuIiwgcGF0dGVybklSXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpZDsKICB9CiAgaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgZm4sIGFyZ3MsIGNzLCBwYXR0ZXJucywgcmVzb3VyY2VzLCB0YXNrLCBsb2NhbENvbG9yU3BhY2VDYWNoZSwgbG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUsIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZSkgewogICAgY29uc3QgcGF0dGVybk5hbWUgPSBhcmdzLnBvcCgpOwogICAgaWYgKHBhdHRlcm5OYW1lIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICBjb25zdCByYXdQYXR0ZXJuID0gcGF0dGVybnMuZ2V0UmF3KHBhdHRlcm5OYW1lLm5hbWUpOwogICAgICBjb25zdCBsb2NhbFRpbGluZ1BhdHRlcm4gPSByYXdQYXR0ZXJuIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmICYmIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlLmdldEJ5UmVmKHJhd1BhdHRlcm4pOwogICAgICBpZiAobG9jYWxUaWxpbmdQYXR0ZXJuKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IGNvbG9yID0gY3MuYmFzZSA/IGNzLmJhc2UuZ2V0UmdiKGFyZ3MsIDApIDogbnVsbDsKICAgICAgICAgIGNvbnN0IHRpbGluZ1BhdHRlcm5JUiA9ICgwLCBfcGF0dGVybi5nZXRUaWxpbmdQYXR0ZXJuSVIpKGxvY2FsVGlsaW5nUGF0dGVybi5vcGVyYXRvckxpc3RJUiwgbG9jYWxUaWxpbmdQYXR0ZXJuLmRpY3QsIGNvbG9yKTsKICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgdGlsaW5nUGF0dGVybklSKTsKICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfSBjYXRjaCAoZXgpIHt9CiAgICAgIH0KICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHJhd1BhdHRlcm4pOwogICAgICBpZiAocGF0dGVybikgewogICAgICAgIGNvbnN0IGRpY3QgPSBwYXR0ZXJuIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0gPyBwYXR0ZXJuLmRpY3QgOiBwYXR0ZXJuOwogICAgICAgIGNvbnN0IHR5cGVOdW0gPSBkaWN0LmdldCgiUGF0dGVyblR5cGUiKTsKICAgICAgICBpZiAodHlwZU51bSA9PT0gUGF0dGVyblR5cGUuVElMSU5HKSB7CiAgICAgICAgICBjb25zdCBjb2xvciA9IGNzLmJhc2UgPyBjcy5iYXNlLmdldFJnYihhcmdzLCAwKSA6IG51bGw7CiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVUaWxpbmdUeXBlKGZuLCBjb2xvciwgcmVzb3VyY2VzLCBwYXR0ZXJuLCBkaWN0LCBvcGVyYXRvckxpc3QsIHRhc2ssIGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVOdW0gPT09IFBhdHRlcm5UeXBlLlNIQURJTkcpIHsKICAgICAgICAgIGNvbnN0IHNoYWRpbmcgPSBkaWN0LmdldCgiU2hhZGluZyIpOwogICAgICAgICAgY29uc3QgbWF0cml4ID0gZGljdC5nZXRBcnJheSgiTWF0cml4Iik7CiAgICAgICAgICBjb25zdCBvYmpJZCA9IHRoaXMucGFyc2VTaGFkaW5nKHsKICAgICAgICAgICAgc2hhZGluZywKICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZSwKICAgICAgICAgICAgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlCiAgICAgICAgICB9KTsKICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChmbiwgWyJTaGFkaW5nIiwgb2JqSWQsIG1hdHJpeF0pOwogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmtub3duIFBhdHRlcm5UeXBlOiAke3R5cGVOdW19YCk7CiAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBQYXR0ZXJuTmFtZTogJHtwYXR0ZXJuTmFtZX1gKTsKICB9CiAgX3BhcnNlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXksIG5lc3RpbmdDb3VudGVyLCBjdXJyZW50UmVzdWx0KSB7CiAgICBjb25zdCBNQVhfTkVTVElORyA9IDEwOwogICAgaWYgKCsrbmVzdGluZ0NvdW50ZXIgPiBNQVhfTkVTVElORykgewogICAgICAoMCwgX3V0aWwud2FybikoIlZpc2liaWxpdHkgZXhwcmVzc2lvbiBpcyB0b28gZGVlcGx5IG5lc3RlZCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGFycmF5WzBdKTsKICAgIGlmIChsZW5ndGggPCAyIHx8ICEob3BlcmF0b3IgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSkgewogICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgdmlzaWJpbGl0eSBleHByZXNzaW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHN3aXRjaCAob3BlcmF0b3IubmFtZSkgewogICAgICBjYXNlICJBbmQiOgogICAgICBjYXNlICJPciI6CiAgICAgIGNhc2UgIk5vdCI6CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKG9wZXJhdG9yLm5hbWUpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgICgwLCBfdXRpbC53YXJuKShgSW52YWxpZCBvcGVyYXRvciAke29wZXJhdG9yLm5hbWV9IGluIHZpc2liaWxpdHkgZXhwcmVzc2lvbmApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgcmF3ID0gYXJyYXlbaV07CiAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHJhdyk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBbXTsKICAgICAgICBjdXJyZW50UmVzdWx0LnB1c2gobmVzdGVkUmVzdWx0KTsKICAgICAgICB0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKG9iamVjdCwgbmVzdGluZ0NvdW50ZXIsIG5lc3RlZFJlc3VsdCk7CiAgICAgIH0gZWxzZSBpZiAocmF3IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgY3VycmVudFJlc3VsdC5wdXNoKHJhdy50b1N0cmluZygpKTsKICAgICAgfQogICAgfQogIH0KICBhc3luYyBwYXJzZU1hcmtlZENvbnRlbnRQcm9wcyhjb250ZW50UHJvcGVydGllcywgcmVzb3VyY2VzKSB7CiAgICBsZXQgb3B0aW9uYWxDb250ZW50OwogICAgaWYgKGNvbnRlbnRQcm9wZXJ0aWVzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICBjb25zdCBwcm9wZXJ0aWVzID0gcmVzb3VyY2VzLmdldCgiUHJvcGVydGllcyIpOwogICAgICBvcHRpb25hbENvbnRlbnQgPSBwcm9wZXJ0aWVzLmdldChjb250ZW50UHJvcGVydGllcy5uYW1lKTsKICAgIH0gZWxzZSBpZiAoY29udGVudFByb3BlcnRpZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIG9wdGlvbmFsQ29udGVudCA9IGNvbnRlbnRQcm9wZXJ0aWVzOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJPcHRpb25hbCBjb250ZW50IHByb3BlcnRpZXMgbWFsZm9ybWVkLiIpOwogICAgfQogICAgY29uc3Qgb3B0aW9uYWxDb250ZW50VHlwZSA9IG9wdGlvbmFsQ29udGVudC5nZXQoIlR5cGUiKS5uYW1lOwogICAgaWYgKG9wdGlvbmFsQ29udGVudFR5cGUgPT09ICJPQ0ciKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKICAgICAgICBpZDogb3B0aW9uYWxDb250ZW50Lm9iaklkCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKG9wdGlvbmFsQ29udGVudFR5cGUgPT09ICJPQ01EIikgewogICAgICBjb25zdCBleHByZXNzaW9uID0gb3B0aW9uYWxDb250ZW50LmdldCgiVkUiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbikpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICB0aGlzLl9wYXJzZVZpc2liaWxpdHlFeHByZXNzaW9uKGV4cHJlc3Npb24sIDAsIHJlc3VsdCk7CiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAiT0NNRCIsCiAgICAgICAgICAgIGV4cHJlc3Npb246IHJlc3VsdAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3Qgb3B0aW9uYWxDb250ZW50R3JvdXBzID0gb3B0aW9uYWxDb250ZW50LmdldCgiT0NHcyIpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25hbENvbnRlbnRHcm91cHMpIHx8IG9wdGlvbmFsQ29udGVudEdyb3VwcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgICBjb25zdCBncm91cElkcyA9IFtdOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbmFsQ29udGVudEdyb3VwcykpIHsKICAgICAgICAgIGZvciAoY29uc3Qgb2NnIG9mIG9wdGlvbmFsQ29udGVudEdyb3VwcykgewogICAgICAgICAgICBncm91cElkcy5wdXNoKG9jZy50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ3JvdXBJZHMucHVzaChvcHRpb25hbENvbnRlbnRHcm91cHMub2JqSWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKICAgICAgICAgIGlkczogZ3JvdXBJZHMsCiAgICAgICAgICBwb2xpY3k6IG9wdGlvbmFsQ29udGVudC5nZXQoIlAiKSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUgPyBvcHRpb25hbENvbnRlbnQuZ2V0KCJQIikubmFtZSA6IG51bGwsCiAgICAgICAgICBleHByZXNzaW9uOiBudWxsCiAgICAgICAgfTsKICAgICAgfSBlbHNlIGlmIChvcHRpb25hbENvbnRlbnRHcm91cHMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogb3B0aW9uYWxDb250ZW50VHlwZSwKICAgICAgICAgIGlkOiBvcHRpb25hbENvbnRlbnRHcm91cHMudG9TdHJpbmcoKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBnZXRPcGVyYXRvckxpc3QoewogICAgc3RyZWFtLAogICAgdGFzaywKICAgIHJlc291cmNlcywKICAgIG9wZXJhdG9yTGlzdCwKICAgIGluaXRpYWxTdGF0ZSA9IG51bGwsCiAgICBmYWxsYmFja0ZvbnREaWN0ID0gbnVsbAogIH0pIHsKICAgIHJlc291cmNlcyB8fD0gX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKICAgIGluaXRpYWxTdGF0ZSB8fD0gbmV3IEV2YWxTdGF0ZSgpOwogICAgaWYgKCFvcGVyYXRvckxpc3QpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRPcGVyYXRvckxpc3Q6IG1pc3NpbmcgIm9wZXJhdG9yTGlzdCIgcGFyYW1ldGVyJyk7CiAgICB9CiAgICBjb25zdCBzZWxmID0gdGhpczsKICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBsZXQgcGFyc2luZ1RleHQgPSBmYWxzZTsKICAgIGNvbnN0IGxvY2FsSW1hZ2VDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxJbWFnZUNhY2hlKCk7CiAgICBjb25zdCBsb2NhbENvbG9yU3BhY2VDYWNoZSA9IG5ldyBfaW1hZ2VfdXRpbHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsR1N0YXRlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsR1N0YXRlQ2FjaGUoKTsKICAgIGNvbnN0IGxvY2FsVGlsaW5nUGF0dGVybkNhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSgpOwogICAgY29uc3QgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlID0gbmV3IE1hcCgpOwogICAgY29uc3QgeG9ianMgPSByZXNvdXJjZXMuZ2V0KCJYT2JqZWN0IikgfHwgX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKICAgIGNvbnN0IHBhdHRlcm5zID0gcmVzb3VyY2VzLmdldCgiUGF0dGVybiIpIHx8IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CiAgICBjb25zdCBzdGF0ZU1hbmFnZXIgPSBuZXcgU3RhdGVNYW5hZ2VyKGluaXRpYWxTdGF0ZSk7CiAgICBjb25zdCBwcmVwcm9jZXNzb3IgPSBuZXcgRXZhbHVhdG9yUHJlcHJvY2Vzc29yKHN0cmVhbSwgeHJlZiwgc3RhdGVNYW5hZ2VyKTsKICAgIGNvbnN0IHRpbWVTbG90TWFuYWdlciA9IG5ldyBUaW1lU2xvdE1hbmFnZXIoKTsKICAgIGZ1bmN0aW9uIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoYXJndW1lbnQpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcHJlcHJvY2Vzc29yLnNhdmVkU3RhdGVzRGVwdGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5yZXN0b3JlLCBbXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpIHsKICAgICAgY29uc3QgbmV4dCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgUHJvbWlzZS5hbGwoW3Byb21pc2UsIG9wZXJhdG9yTGlzdC5yZWFkeV0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcHJvbWlzZUJvZHkocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIHJlamVjdChleCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgcmVqZWN0KTsKICAgICAgfTsKICAgICAgdGFzay5lbnN1cmVOb3RUZXJtaW5hdGVkKCk7CiAgICAgIHRpbWVTbG90TWFuYWdlci5yZXNldCgpOwogICAgICBjb25zdCBvcGVyYXRpb24gPSB7fTsKICAgICAgbGV0IHN0b3AsIGksIGlpLCBjcywgbmFtZSwgaXNWYWxpZE5hbWU7CiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKICAgICAgICBvcGVyYXRpb24uYXJncyA9IG51bGw7CiAgICAgICAgaWYgKCFwcmVwcm9jZXNzb3IucmVhZChvcGVyYXRpb24pKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbGV0IGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKICAgICAgICBsZXQgZm4gPSBvcGVyYXRpb24uZm47CiAgICAgICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50WE9iamVjdDoKICAgICAgICAgICAgaXNWYWxpZE5hbWUgPSBhcmdzWzBdIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZTsKICAgICAgICAgICAgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKGlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgY29uc3QgbG9jYWxJbWFnZSA9IGxvY2FsSW1hZ2VDYWNoZS5nZXRCeU5hbWUobmFtZSk7CiAgICAgICAgICAgICAgaWYgKGxvY2FsSW1hZ2UpIHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhsb2NhbEltYWdlLmZuLCBsb2NhbEltYWdlLmFyZ3MsIGxvY2FsSW1hZ2Uub3B0aW9uYWxDb250ZW50KTsKICAgICAgICAgICAgICAgIGluY3JlbWVudENhY2hlZEltYWdlTWFza0NvdW50KGxvY2FsSW1hZ2UpOwogICAgICAgICAgICAgICAgYXJncyA9IG51bGw7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZVhPYmplY3QsIHJlamVjdFhPYmplY3QpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlhPYmplY3QgbXVzdCBiZSByZWZlcnJlZCB0byBieSBuYW1lLiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBsZXQgeG9iaiA9IHhvYmpzLmdldFJhdyhuYW1lKTsKICAgICAgICAgICAgICBpZiAoeG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgICAgICAgICAgY29uc3QgbG9jYWxJbWFnZSA9IGxvY2FsSW1hZ2VDYWNoZS5nZXRCeVJlZih4b2JqKSB8fCBzZWxmLl9yZWdpb25hbEltYWdlQ2FjaGUuZ2V0QnlSZWYoeG9iaik7CiAgICAgICAgICAgICAgICBpZiAobG9jYWxJbWFnZSkgewogICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMobG9jYWxJbWFnZS5mbiwgbG9jYWxJbWFnZS5hcmdzLCBsb2NhbEltYWdlLm9wdGlvbmFsQ29udGVudCk7CiAgICAgICAgICAgICAgICAgIGluY3JlbWVudENhY2hlZEltYWdlTWFza0NvdW50KGxvY2FsSW1hZ2UpOwogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxJbWFnZSA9IHNlbGYuZ2xvYmFsSW1hZ2VDYWNoZS5nZXREYXRhKHhvYmosIHNlbGYucGFnZUluZGV4KTsKICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbWFnZSkgewogICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkRGVwZW5kZW5jeShnbG9iYWxJbWFnZS5vYmpJZCk7CiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRJbWFnZU9wcyhnbG9iYWxJbWFnZS5mbiwgZ2xvYmFsSW1hZ2UuYXJncywgZ2xvYmFsSW1hZ2Uub3B0aW9uYWxDb250ZW50KTsKICAgICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgeG9iaiA9IHhyZWYuZmV0Y2goeG9iaik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICghKHhvYmogaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgYmUgYSBzdHJlYW0iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHhvYmouZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICAgICAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiWE9iamVjdCBzaG91bGQgaGF2ZSBhIE5hbWUgc3VidHlwZSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodHlwZS5uYW1lID09PSAiRm9ybSIpIHsKICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zYXZlKCk7CiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkRm9ybVhPYmplY3QocmVzb3VyY2VzLCB4b2JqLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZS5jbG9uZSgpLCBsb2NhbENvbG9yU3BhY2VDYWNoZSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHN0YXRlTWFuYWdlci5yZXN0b3JlKCk7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVYT2JqZWN0KCk7CiAgICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUubmFtZSA9PT0gIkltYWdlIikgewogICAgICAgICAgICAgICAgc2VsZi5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgICAgICBpbWFnZTogeG9iaiwKICAgICAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LAogICAgICAgICAgICAgICAgICBjYWNoZUtleTogbmFtZSwKICAgICAgICAgICAgICAgICAgbG9jYWxJbWFnZUNhY2hlLAogICAgICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICAgICAgfSkudGhlbihyZXNvbHZlWE9iamVjdCwgcmVqZWN0WE9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLm5hbWUgPT09ICJQUyIpIHsKICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiSWdub3JlZCBYT2JqZWN0IHN1YnR5cGUgUFMiKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmhhbmRsZWQgWE9iamVjdCBzdWJ0eXBlICR7dHlwZS5uYW1lfWApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzZWxmLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Rm9udDoKICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gYXJnc1sxXTsKICAgICAgICAgICAgbmV4dChzZWxmLmhhbmRsZVNldEZvbnQocmVzb3VyY2VzLCBhcmdzLCBudWxsLCBvcGVyYXRvckxpc3QsIHRhc2ssIHN0YXRlTWFuYWdlci5zdGF0ZSwgZmFsbGJhY2tGb250RGljdCkudGhlbihmdW5jdGlvbiAobG9hZGVkTmFtZSkgewogICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGREZXBlbmRlbmN5KGxvYWRlZE5hbWUpOwogICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0Rm9udCwgW2xvYWRlZE5hbWUsIGZvbnRTaXplXSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5UZXh0OgogICAgICAgICAgICBwYXJzaW5nVGV4dCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kVGV4dDoKICAgICAgICAgICAgcGFyc2luZ1RleHQgPSBmYWxzZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRJbmxpbmVJbWFnZToKICAgICAgICAgICAgdmFyIGNhY2hlS2V5ID0gYXJnc1swXS5jYWNoZUtleTsKICAgICAgICAgICAgaWYgKGNhY2hlS2V5KSB7CiAgICAgICAgICAgICAgY29uc3QgbG9jYWxJbWFnZSA9IGxvY2FsSW1hZ2VDYWNoZS5nZXRCeU5hbWUoY2FjaGVLZXkpOwogICAgICAgICAgICAgIGlmIChsb2NhbEltYWdlKSB7CiAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkSW1hZ2VPcHMobG9jYWxJbWFnZS5mbiwgbG9jYWxJbWFnZS5hcmdzLCBsb2NhbEltYWdlLm9wdGlvbmFsQ29udGVudCk7CiAgICAgICAgICAgICAgICBpbmNyZW1lbnRDYWNoZWRJbWFnZU1hc2tDb3VudChsb2NhbEltYWdlKTsKICAgICAgICAgICAgICAgIGFyZ3MgPSBudWxsOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQoc2VsZi5idWlsZFBhaW50SW1hZ2VYT2JqZWN0KHsKICAgICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgICAgICAgaW1hZ2U6IGFyZ3NbMF0sCiAgICAgICAgICAgICAgaXNJbmxpbmU6IHRydWUsCiAgICAgICAgICAgICAgb3BlcmF0b3JMaXN0LAogICAgICAgICAgICAgIGNhY2hlS2V5LAogICAgICAgICAgICAgIGxvY2FsSW1hZ2VDYWNoZSwKICAgICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1NwYWNlZFRleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21iaW5lZEdseXBocyA9IFtdOwogICAgICAgICAgICB2YXIgc3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGU7CiAgICAgICAgICAgIGZvciAoY29uc3QgYXJySXRlbSBvZiBhcmdzWzBdKSB7CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcnJJdGVtID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgY29tYmluZWRHbHlwaHMucHVzaCguLi5zZWxmLmhhbmRsZVRleHQoYXJySXRlbSwgc3RhdGUpKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcnJJdGVtID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgY29tYmluZWRHbHlwaHMucHVzaChhcnJJdGVtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJnc1swXSA9IGNvbWJpbmVkR2x5cGhzOwogICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZVNob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLm5leHRMaW5lKTsKICAgICAgICAgICAgYXJnc1swXSA9IHNlbGYuaGFuZGxlVGV4dChhcmdzWzBdLCBzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaG93VGV4dDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDoKICAgICAgICAgICAgaWYgKCFzdGF0ZU1hbmFnZXIuc3RhdGUuZm9udCkgewogICAgICAgICAgICAgIHNlbGYuZW5zdXJlU3RhdGVGb250KHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5uZXh0TGluZSk7CiAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuc2V0V29yZFNwYWNpbmcsIFthcmdzLnNoaWZ0KCldKTsKICAgICAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZywgW2FyZ3Muc2hpZnQoKV0pOwogICAgICAgICAgICBhcmdzWzBdID0gc2VsZi5oYW5kbGVUZXh0KGFyZ3NbMF0sIHN0YXRlTWFuYWdlci5zdGF0ZSk7CiAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNob3dUZXh0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRSZW5kZXJpbmdNb2RlOgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUudGV4dFJlbmRlcmluZ01vZGUgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvclNwYWNlOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgY29uc3QgY2FjaGVkQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2UuZ2V0Q2FjaGVkKGFyZ3NbMF0sIHhyZWYsIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgICAgICAgICBpZiAoY2FjaGVkQ29sb3JTcGFjZSkgewogICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gY2FjaGVkQ29sb3JTcGFjZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBuZXh0KHNlbGYucGFyc2VDb2xvclNwYWNlKHsKICAgICAgICAgICAgICAgIGNzOiBhcmdzWzBdLAogICAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBpZiAoY29sb3JTcGFjZSkgewogICAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2UgPSBjb2xvclNwYWNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBjb25zdCBjYWNoZWRDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5nZXRDYWNoZWQoYXJnc1swXSwgeHJlZiwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgICAgICAgIGlmIChjYWNoZWRDb2xvclNwYWNlKSB7CiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IGNhY2hlZENvbG9yU3BhY2U7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlQ29sb3JTcGFjZSh7CiAgICAgICAgICAgICAgICBjczogYXJnc1swXSwKICAgICAgICAgICAgICAgIHJlc291cmNlcywKICAgICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoY29sb3JTcGFjZSkgewogICAgICAgICAgICAgICAgaWYgKGNvbG9yU3BhY2UpIHsKICAgICAgICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBjb2xvclNwYWNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvcjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuZmlsbENvbG9yU3BhY2U7CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvcjoKICAgICAgICAgICAgY3MgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZTsKICAgICAgICAgICAgYXJncyA9IGNzLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbEdyYXk6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5OwogICAgICAgICAgICBhcmdzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXkuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zZXRGaWxsUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlR3JheToKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTsKICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5ncmF5LmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgZm4gPSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbENNWUtDb2xvcjoKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7CiAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDTVlLQ29sb3I6CiAgICAgICAgICAgIHN0YXRlTWFuYWdlci5zdGF0ZS5zdHJva2VDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmNteWs7CiAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuY215ay5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjoKICAgICAgICAgICAgc3RhdGVNYW5hZ2VyLnN0YXRlLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLnJnYjsKICAgICAgICAgICAgYXJncyA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2IuZ2V0UmdiKGFyZ3MsIDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOgogICAgICAgICAgICBzdGF0ZU1hbmFnZXIuc3RhdGUuc3Ryb2tlQ29sb3JTcGFjZSA9IF9jb2xvcnNwYWNlLkNvbG9yU3BhY2Uuc2luZ2xldG9ucy5yZ2I7CiAgICAgICAgICAgIGFyZ3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihhcmdzLCAwKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOOgogICAgICAgICAgICBjcyA9IHN0YXRlTWFuYWdlci5zdGF0ZS5maWxsQ29sb3JTcGFjZTsKICAgICAgICAgICAgaWYgKGNzLm5hbWUgPT09ICJQYXR0ZXJuIikgewogICAgICAgICAgICAgIG5leHQoc2VsZi5oYW5kbGVDb2xvck4ob3BlcmF0b3JMaXN0LCBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTiwgYXJncywgY3MsIHBhdHRlcm5zLCByZXNvdXJjZXMsIHRhc2ssIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSwgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlKSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvck46CiAgICAgICAgICAgIGNzID0gc3RhdGVNYW5hZ2VyLnN0YXRlLnN0cm9rZUNvbG9yU3BhY2U7CiAgICAgICAgICAgIGlmIChjcy5uYW1lID09PSAiUGF0dGVybiIpIHsKICAgICAgICAgICAgICBuZXh0KHNlbGYuaGFuZGxlQ29sb3JOKG9wZXJhdG9yTGlzdCwgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yTiwgYXJncywgY3MsIHBhdHRlcm5zLCByZXNvdXJjZXMsIHRhc2ssIGxvY2FsQ29sb3JTcGFjZUNhY2hlLCBsb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSwgbG9jYWxTaGFkaW5nUGF0dGVybkNhY2hlKSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MgPSBjcy5nZXRSZ2IoYXJncywgMCk7CiAgICAgICAgICAgIGZuID0gX3V0aWwuT1BTLnNldFN0cm9rZVJHQkNvbG9yOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNoYWRpbmdGaWxsOgogICAgICAgICAgICB2YXIgc2hhZGluZ1JlcyA9IHJlc291cmNlcy5nZXQoIlNoYWRpbmciKTsKICAgICAgICAgICAgaWYgKCFzaGFkaW5nUmVzKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJObyBzaGFkaW5nIHJlc291cmNlIGZvdW5kIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNoYWRpbmcgPSBzaGFkaW5nUmVzLmdldChhcmdzWzBdLm5hbWUpOwogICAgICAgICAgICBpZiAoIXNoYWRpbmcpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIHNoYWRpbmcgb2JqZWN0IGZvdW5kIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGF0dGVybklkID0gc2VsZi5wYXJzZVNoYWRpbmcoewogICAgICAgICAgICAgIHNoYWRpbmcsCiAgICAgICAgICAgICAgcmVzb3VyY2VzLAogICAgICAgICAgICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlLAogICAgICAgICAgICAgIGxvY2FsU2hhZGluZ1BhdHRlcm5DYWNoZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXJncyA9IFtwYXR0ZXJuSWRdOwogICAgICAgICAgICBmbiA9IF91dGlsLk9QUy5zaGFkaW5nRmlsbDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRHU3RhdGU6CiAgICAgICAgICAgIGlzVmFsaWROYW1lID0gYXJnc1swXSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWU7CiAgICAgICAgICAgIG5hbWUgPSBhcmdzWzBdLm5hbWU7CiAgICAgICAgICAgIGlmIChpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgIGNvbnN0IGxvY2FsR1N0YXRlT2JqID0gbG9jYWxHU3RhdGVDYWNoZS5nZXRCeU5hbWUobmFtZSk7CiAgICAgICAgICAgICAgaWYgKGxvY2FsR1N0YXRlT2JqKSB7CiAgICAgICAgICAgICAgICBpZiAobG9jYWxHU3RhdGVPYmoubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QuYWRkT3AoX3V0aWwuT1BTLnNldEdTdGF0ZSwgW2xvY2FsR1N0YXRlT2JqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhcmdzID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlR1N0YXRlLCByZWplY3RHU3RhdGUpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoIkV4dEdTdGF0ZSIpOwogICAgICAgICAgICAgIGlmICghKGV4dEdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBnU3RhdGUgPSBleHRHU3RhdGUuZ2V0KG5hbWUpOwogICAgICAgICAgICAgIGlmICghKGdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzZWxmLnNldEdTdGF0ZSh7CiAgICAgICAgICAgICAgICByZXNvdXJjZXMsCiAgICAgICAgICAgICAgICBnU3RhdGUsCiAgICAgICAgICAgICAgICBvcGVyYXRvckxpc3QsCiAgICAgICAgICAgICAgICBjYWNoZUtleTogbmFtZSwKICAgICAgICAgICAgICAgIHRhc2ssCiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXIsCiAgICAgICAgICAgICAgICBsb2NhbEdTdGF0ZUNhY2hlLAogICAgICAgICAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgICAgICAgICB9KS50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgRXh0R1N0YXRlOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUbzoKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmxpbmVUbzoKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvMjoKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8zOgogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VQYXRoOgogICAgICAgICAgY2FzZSBfdXRpbC5PUFMucmVjdGFuZ2xlOgogICAgICAgICAgICBzZWxmLmJ1aWxkUGF0aChvcGVyYXRvckxpc3QsIGZuLCBhcmdzLCBwYXJzaW5nVGV4dCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMubWFya1BvaW50OgogICAgICAgICAgY2FzZSBfdXRpbC5PUFMubWFya1BvaW50UHJvcHM6CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpbkNvbXBhdDoKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZENvbXBhdDoKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wczoKICAgICAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBFeHBlY3RlZCBuYW1lIGZvciBiZWdpbk1hcmtlZENvbnRlbnRQcm9wcyBhcmcwPSR7YXJnc1swXX1gKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJnc1swXS5uYW1lID09PSAiT0MiKSB7CiAgICAgICAgICAgICAgbmV4dChzZWxmLnBhcnNlTWFya2VkQ29udGVudFByb3BzKGFyZ3NbMV0sIHJlc291cmNlcykudGhlbihkYXRhID0+IHsKICAgICAgICAgICAgICAgIG9wZXJhdG9yTGlzdC5hZGRPcChfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHMsIFsiT0MiLCBkYXRhXSk7CiAgICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYGdldE9wZXJhdG9yTGlzdCAtIGlnbm9yaW5nIGJlZ2luTWFya2VkQ29udGVudFByb3BzOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgcmVhc29uOwogICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXJncyA9IFthcmdzWzBdLm5hbWUsIGFyZ3NbMV0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ID8gYXJnc1sxXS5nZXQoIk1DSUQiKSA6IG51bGxdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudDoKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQ6CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpZiAoYXJncyAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gYXJncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChpIDwgaWkpIHsKICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3Jpbmcgb3BlcmF0b3I6ICIgKyBmbik7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3BlcmF0b3JMaXN0LmFkZE9wKGZuLCBhcmdzKTsKICAgICAgfQogICAgICBpZiAoc3RvcCkgewogICAgICAgIG5leHQoZGVmZXJyZWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjbG9zZVBlbmRpbmdSZXN0b3JlT1BTKCk7CiAgICAgIHJlc29sdmUoKTsKICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7CiAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0T3BlcmF0b3JMaXN0IC0gaWdub3JpbmcgZXJyb3JzIGR1cmluZyAiJHt0YXNrLm5hbWV9IiBgICsgYHRhc2s6ICIke3JlYXNvbn0iLmApOwogICAgICAgIGNsb3NlUGVuZGluZ1Jlc3RvcmVPUFMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfSk7CiAgfQogIGdldFRleHRDb250ZW50KHsKICAgIHN0cmVhbSwKICAgIHRhc2ssCiAgICByZXNvdXJjZXMsCiAgICBzdGF0ZU1hbmFnZXIgPSBudWxsLAogICAgaW5jbHVkZU1hcmtlZENvbnRlbnQgPSBmYWxzZSwKICAgIHNpbmssCiAgICBzZWVuU3R5bGVzID0gbmV3IFNldCgpLAogICAgdmlld0JveCwKICAgIG1hcmtlZENvbnRlbnREYXRhID0gbnVsbCwKICAgIGRpc2FibGVOb3JtYWxpemF0aW9uID0gZmFsc2UKICB9KSB7CiAgICByZXNvdXJjZXMgfHw9IF9wcmltaXRpdmVzLkRpY3QuZW1wdHk7CiAgICBzdGF0ZU1hbmFnZXIgfHw9IG5ldyBTdGF0ZU1hbmFnZXIobmV3IFRleHRTdGF0ZSgpKTsKICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICBtYXJrZWRDb250ZW50RGF0YSB8fD0gewogICAgICAgIGxldmVsOiAwCiAgICAgIH07CiAgICB9CiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHsKICAgICAgaXRlbXM6IFtdLAogICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbCkKICAgIH07CiAgICBjb25zdCB0ZXh0Q29udGVudEl0ZW0gPSB7CiAgICAgIGluaXRpYWxpemVkOiBmYWxzZSwKICAgICAgc3RyOiBbXSwKICAgICAgdG90YWxXaWR0aDogMCwKICAgICAgdG90YWxIZWlnaHQ6IDAsCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHZlcnRpY2FsOiBmYWxzZSwKICAgICAgcHJldlRyYW5zZm9ybTogbnVsbCwKICAgICAgdGV4dEFkdmFuY2VTY2FsZTogMCwKICAgICAgc3BhY2VJbkZsb3dNaW46IDAsCiAgICAgIHNwYWNlSW5GbG93TWF4OiAwLAogICAgICB0cmFja2luZ1NwYWNlTWluOiBJbmZpbml0eSwKICAgICAgbmVnYXRpdmVTcGFjZU1heDogLUluZmluaXR5LAogICAgICBub3RBU3BhY2U6IC1JbmZpbml0eSwKICAgICAgdHJhbnNmb3JtOiBudWxsLAogICAgICBmb250TmFtZTogbnVsbCwKICAgICAgaGFzRU9MOiBmYWxzZQogICAgfTsKICAgIGNvbnN0IHR3b0xhc3RDaGFycyA9IFsiICIsICIgIl07CiAgICBsZXQgdHdvTGFzdENoYXJzUG9zID0gMDsKICAgIGZ1bmN0aW9uIHNhdmVMYXN0Q2hhcihjaGFyKSB7CiAgICAgIGNvbnN0IG5leHRQb3MgPSAodHdvTGFzdENoYXJzUG9zICsgMSkgJSAyOwogICAgICBjb25zdCByZXQgPSB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSAhPT0gIiAiICYmIHR3b0xhc3RDaGFyc1tuZXh0UG9zXSA9PT0gIiAiOwogICAgICB0d29MYXN0Q2hhcnNbdHdvTGFzdENoYXJzUG9zXSA9IGNoYXI7CiAgICAgIHR3b0xhc3RDaGFyc1BvcyA9IG5leHRQb3M7CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzaG91bGRBZGRXaGl0ZXBzYWNlKCkgewogICAgICByZXR1cm4gdHdvTGFzdENoYXJzW3R3b0xhc3RDaGFyc1Bvc10gIT09ICIgIiAmJiB0d29MYXN0Q2hhcnNbKHR3b0xhc3RDaGFyc1BvcyArIDEpICUgMl0gPT09ICIgIjsKICAgIH0KICAgIGZ1bmN0aW9uIHJlc2V0TGFzdENoYXJzKCkgewogICAgICB0d29MYXN0Q2hhcnNbMF0gPSB0d29MYXN0Q2hhcnNbMV0gPSAiICI7CiAgICAgIHR3b0xhc3RDaGFyc1BvcyA9IDA7CiAgICB9CiAgICBjb25zdCBUUkFDS0lOR19TUEFDRV9GQUNUT1IgPSAwLjEwMjsKICAgIGNvbnN0IE5PVF9BX1NQQUNFX0ZBQ1RPUiA9IDAuMDM7CiAgICBjb25zdCBORUdBVElWRV9TUEFDRV9GQUNUT1IgPSAtMC4yOwogICAgY29uc3QgU1BBQ0VfSU5fRkxPV19NSU5fRkFDVE9SID0gMC4xMDI7CiAgICBjb25zdCBTUEFDRV9JTl9GTE9XX01BWF9GQUNUT1IgPSAwLjY7CiAgICBjb25zdCBWRVJUSUNBTF9TSElGVF9SQVRJTyA9IDAuMjU7CiAgICBjb25zdCBzZWxmID0gdGhpczsKICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBjb25zdCBzaG93U3BhY2VkVGV4dEJ1ZmZlciA9IFtdOwogICAgbGV0IHhvYmpzID0gbnVsbDsKICAgIGNvbnN0IGVtcHR5WE9iamVjdENhY2hlID0gbmV3IF9pbWFnZV91dGlscy5Mb2NhbEltYWdlQ2FjaGUoKTsKICAgIGNvbnN0IGVtcHR5R1N0YXRlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkxvY2FsR1N0YXRlQ2FjaGUoKTsKICAgIGNvbnN0IHByZXByb2Nlc3NvciA9IG5ldyBFdmFsdWF0b3JQcmVwcm9jZXNzb3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIpOwogICAgbGV0IHRleHRTdGF0ZTsKICAgIGZ1bmN0aW9uIHB1c2hXaGl0ZXNwYWNlKHsKICAgICAgd2lkdGggPSAwLAogICAgICBoZWlnaHQgPSAwLAogICAgICB0cmFuc2Zvcm0gPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybSwKICAgICAgZm9udE5hbWUgPSB0ZXh0Q29udGVudEl0ZW0uZm9udE5hbWUKICAgIH0pIHsKICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgc3RyOiAiICIsCiAgICAgICAgZGlyOiAibHRyIiwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgdHJhbnNmb3JtLAogICAgICAgIGZvbnROYW1lLAogICAgICAgIGhhc0VPTDogZmFsc2UKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpIHsKICAgICAgY29uc3QgZm9udCA9IHRleHRTdGF0ZS5mb250OwogICAgICBjb25zdCB0c20gPSBbdGV4dFN0YXRlLmZvbnRTaXplICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDAsIDAsIHRleHRTdGF0ZS5mb250U2l6ZSwgMCwgdGV4dFN0YXRlLnRleHRSaXNlXTsKICAgICAgaWYgKGZvbnQuaXNUeXBlM0ZvbnQgJiYgKHRleHRTdGF0ZS5mb250U2l6ZSA8PSAxIHx8IGZvbnQuaXNDaGFyQkJveCkgJiYgISgwLCBfdXRpbC5pc0FycmF5RXF1YWwpKHRleHRTdGF0ZS5mb250TWF0cml4LCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWCkpIHsKICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IGZvbnQuYmJveFszXSAtIGZvbnQuYmJveFsxXTsKICAgICAgICBpZiAoZ2x5cGhIZWlnaHQgPiAwKSB7CiAgICAgICAgICB0c21bM10gKj0gZ2x5cGhIZWlnaHQgKiB0ZXh0U3RhdGUuZm9udE1hdHJpeFszXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIF91dGlsLlV0aWwudHJhbnNmb3JtKHRleHRTdGF0ZS5jdG0sIF91dGlsLlV0aWwudHJhbnNmb3JtKHRleHRTdGF0ZS50ZXh0TWF0cml4LCB0c20pKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuc3VyZVRleHRDb250ZW50SXRlbSgpIHsKICAgICAgaWYgKHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCkgewogICAgICAgIHJldHVybiB0ZXh0Q29udGVudEl0ZW07CiAgICAgIH0KICAgICAgY29uc3QgewogICAgICAgIGZvbnQsCiAgICAgICAgbG9hZGVkTmFtZQogICAgICB9ID0gdGV4dFN0YXRlOwogICAgICBpZiAoIXNlZW5TdHlsZXMuaGFzKGxvYWRlZE5hbWUpKSB7CiAgICAgICAgc2VlblN0eWxlcy5hZGQobG9hZGVkTmFtZSk7CiAgICAgICAgdGV4dENvbnRlbnQuc3R5bGVzW2xvYWRlZE5hbWVdID0gewogICAgICAgICAgZm9udEZhbWlseTogZm9udC5mYWxsYmFja05hbWUsCiAgICAgICAgICBhc2NlbnQ6IGZvbnQuYXNjZW50LAogICAgICAgICAgZGVzY2VudDogZm9udC5kZXNjZW50LAogICAgICAgICAgdmVydGljYWw6IGZvbnQudmVydGljYWwKICAgICAgICB9OwogICAgICB9CiAgICAgIHRleHRDb250ZW50SXRlbS5mb250TmFtZSA9IGxvYWRlZE5hbWU7CiAgICAgIGNvbnN0IHRybSA9IHRleHRDb250ZW50SXRlbS50cmFuc2Zvcm0gPSBnZXRDdXJyZW50VGV4dFRyYW5zZm9ybSgpOwogICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggPSB0ZXh0Q29udGVudEl0ZW0udG90YWxXaWR0aCA9IDA7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IHRleHRDb250ZW50SXRlbS50b3RhbEhlaWdodCA9IE1hdGguaHlwb3QodHJtWzJdLCB0cm1bM10pOwogICAgICAgIHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCA9IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHRDb250ZW50SXRlbS53aWR0aCA9IHRleHRDb250ZW50SXRlbS50b3RhbFdpZHRoID0gTWF0aC5oeXBvdCh0cm1bMF0sIHRybVsxXSk7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCA9IHRleHRDb250ZW50SXRlbS50b3RhbEhlaWdodCA9IDA7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsID0gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBzY2FsZUxpbmVYID0gTWF0aC5oeXBvdCh0ZXh0U3RhdGUudGV4dExpbmVNYXRyaXhbMF0sIHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFsxXSk7CiAgICAgIGNvbnN0IHNjYWxlQ3RtWCA9IE1hdGguaHlwb3QodGV4dFN0YXRlLmN0bVswXSwgdGV4dFN0YXRlLmN0bVsxXSk7CiAgICAgIHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlID0gc2NhbGVDdG1YICogc2NhbGVMaW5lWDsKICAgICAgY29uc3QgewogICAgICAgIGZvbnRTaXplCiAgICAgIH0gPSB0ZXh0U3RhdGU7CiAgICAgIHRleHRDb250ZW50SXRlbS50cmFja2luZ1NwYWNlTWluID0gZm9udFNpemUgKiBUUkFDS0lOR19TUEFDRV9GQUNUT1I7CiAgICAgIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UgPSBmb250U2l6ZSAqIE5PVF9BX1NQQUNFX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXggPSBmb250U2l6ZSAqIE5FR0FUSVZFX1NQQUNFX0ZBQ1RPUjsKICAgICAgdGV4dENvbnRlbnRJdGVtLnNwYWNlSW5GbG93TWluID0gZm9udFNpemUgKiBTUEFDRV9JTl9GTE9XX01JTl9GQUNUT1I7CiAgICAgIHRleHRDb250ZW50SXRlbS5zcGFjZUluRmxvd01heCA9IGZvbnRTaXplICogU1BBQ0VfSU5fRkxPV19NQVhfRkFDVE9SOwogICAgICB0ZXh0Q29udGVudEl0ZW0uaGFzRU9MID0gZmFsc2U7CiAgICAgIHRleHRDb250ZW50SXRlbS5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgIHJldHVybiB0ZXh0Q29udGVudEl0ZW07CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVBZHZhbmNlU2NhbGUoKSB7CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHNjYWxlTGluZVggPSBNYXRoLmh5cG90KHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeFswXSwgdGV4dFN0YXRlLnRleHRMaW5lTWF0cml4WzFdKTsKICAgICAgY29uc3Qgc2NhbGVDdG1YID0gTWF0aC5oeXBvdCh0ZXh0U3RhdGUuY3RtWzBdLCB0ZXh0U3RhdGUuY3RtWzFdKTsKICAgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBzY2FsZUN0bVggKiBzY2FsZUxpbmVYOwogICAgICBpZiAoc2NhbGVGYWN0b3IgPT09IHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghdGV4dENvbnRlbnRJdGVtLnZlcnRpY2FsKSB7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLnRvdGFsV2lkdGggKz0gdGV4dENvbnRlbnRJdGVtLndpZHRoICogdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxIZWlnaHQgKz0gdGV4dENvbnRlbnRJdGVtLmhlaWdodCAqIHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlOwogICAgICAgIHRleHRDb250ZW50SXRlbS5oZWlnaHQgPSAwOwogICAgICB9CiAgICAgIHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlID0gc2NhbGVGYWN0b3I7CiAgICB9CiAgICBmdW5jdGlvbiBydW5CaWRpVHJhbnNmb3JtKHRleHRDaHVuaykgewogICAgICBsZXQgdGV4dCA9IHRleHRDaHVuay5zdHIuam9pbigiIik7CiAgICAgIGlmICghZGlzYWJsZU5vcm1hbGl6YXRpb24pIHsKICAgICAgICB0ZXh0ID0gKDAsIF91dGlsLm5vcm1hbGl6ZVVuaWNvZGUpKHRleHQpOwogICAgICB9CiAgICAgIGNvbnN0IGJpZGlSZXN1bHQgPSAoMCwgX2JpZGkuYmlkaSkodGV4dCwgLTEsIHRleHRDaHVuay52ZXJ0aWNhbCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RyOiBiaWRpUmVzdWx0LnN0ciwKICAgICAgICBkaXI6IGJpZGlSZXN1bHQuZGlyLAogICAgICAgIHdpZHRoOiBNYXRoLmFicyh0ZXh0Q2h1bmsudG90YWxXaWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyh0ZXh0Q2h1bmsudG90YWxIZWlnaHQpLAogICAgICAgIHRyYW5zZm9ybTogdGV4dENodW5rLnRyYW5zZm9ybSwKICAgICAgICBmb250TmFtZTogdGV4dENodW5rLmZvbnROYW1lLAogICAgICAgIGhhc0VPTDogdGV4dENodW5rLmhhc0VPTAogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gaGFuZGxlU2V0Rm9udChmb250TmFtZSwgZm9udFJlZikgewogICAgICByZXR1cm4gc2VsZi5sb2FkRm9udChmb250TmFtZSwgZm9udFJlZiwgcmVzb3VyY2VzKS50aGVuKGZ1bmN0aW9uICh0cmFuc2xhdGVkKSB7CiAgICAgICAgaWYgKCF0cmFuc2xhdGVkLmZvbnQuaXNUeXBlM0ZvbnQpIHsKICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJhbnNsYXRlZC5sb2FkVHlwZTNEYXRhKHNlbGYsIHJlc291cmNlcywgdGFzaykuY2F0Y2goZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQ7CiAgICAgICAgfSk7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHRyYW5zbGF0ZWQpIHsKICAgICAgICB0ZXh0U3RhdGUubG9hZGVkTmFtZSA9IHRyYW5zbGF0ZWQubG9hZGVkTmFtZTsKICAgICAgICB0ZXh0U3RhdGUuZm9udCA9IHRyYW5zbGF0ZWQuZm9udDsKICAgICAgICB0ZXh0U3RhdGUuZm9udE1hdHJpeCA9IHRyYW5zbGF0ZWQuZm9udC5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGFwcGx5SW52ZXJzZVJvdGF0aW9uKHgsIHksIG1hdHJpeCkgewogICAgICBjb25zdCBzY2FsZSA9IE1hdGguaHlwb3QobWF0cml4WzBdLCBtYXRyaXhbMV0pOwogICAgICByZXR1cm4gWyhtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzFdICogeSkgLyBzY2FsZSwgKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbM10gKiB5KSAvIHNjYWxlXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbXBhcmVXaXRoTGFzdFBvc2l0aW9uKGdseXBoV2lkdGgpIHsKICAgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9IGdldEN1cnJlbnRUZXh0VHJhbnNmb3JtKCk7CiAgICAgIGxldCBwb3NYID0gY3VycmVudFRyYW5zZm9ybVs0XTsKICAgICAgbGV0IHBvc1kgPSBjdXJyZW50VHJhbnNmb3JtWzVdOwogICAgICBpZiAodGV4dFN0YXRlLmZvbnQ/LnZlcnRpY2FsKSB7CiAgICAgICAgaWYgKHBvc1ggPCB2aWV3Qm94WzBdIHx8IHBvc1ggPiB2aWV3Qm94WzJdIHx8IHBvc1kgKyBnbHlwaFdpZHRoIDwgdmlld0JveFsxXSB8fCBwb3NZID4gdmlld0JveFszXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwb3NYICsgZ2x5cGhXaWR0aCA8IHZpZXdCb3hbMF0gfHwgcG9zWCA+IHZpZXdCb3hbMl0gfHwgcG9zWSA8IHZpZXdCb3hbMV0gfHwgcG9zWSA+IHZpZXdCb3hbM10pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0U3RhdGUuZm9udCB8fCAhdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbGFzdFBvc1ggPSB0ZXh0Q29udGVudEl0ZW0ucHJldlRyYW5zZm9ybVs0XTsKICAgICAgbGV0IGxhc3RQb3NZID0gdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm1bNV07CiAgICAgIGlmIChsYXN0UG9zWCA9PT0gcG9zWCAmJiBsYXN0UG9zWSA9PT0gcG9zWSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCByb3RhdGUgPSAtMTsKICAgICAgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMF0gJiYgY3VycmVudFRyYW5zZm9ybVsxXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzJdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVswXSA+IDAgPyAwIDogMTgwOwogICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUcmFuc2Zvcm1bMV0gJiYgY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwKSB7CiAgICAgICAgcm90YXRlID0gY3VycmVudFRyYW5zZm9ybVsxXSA+IDAgPyA5MCA6IDI3MDsKICAgICAgfQogICAgICBzd2l0Y2ggKHJvdGF0ZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTA6CiAgICAgICAgICBbcG9zWCwgcG9zWV0gPSBbcG9zWSwgcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFtsYXN0UG9zWSwgbGFzdFBvc1hdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICBbcG9zWCwgcG9zWSwgbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstcG9zWCwgLXBvc1ksIC1sYXN0UG9zWCwgLWxhc3RQb3NZXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjcwOgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gWy1wb3NZLCAtcG9zWF07CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IFstbGFzdFBvc1ksIC1sYXN0UG9zWF07CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgW3Bvc1gsIHBvc1ldID0gYXBwbHlJbnZlcnNlUm90YXRpb24ocG9zWCwgcG9zWSwgY3VycmVudFRyYW5zZm9ybSk7CiAgICAgICAgICBbbGFzdFBvc1gsIGxhc3RQb3NZXSA9IGFwcGx5SW52ZXJzZVJvdGF0aW9uKGxhc3RQb3NYLCBsYXN0UG9zWSwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0pOwogICAgICB9CiAgICAgIGlmICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCkgewogICAgICAgIGNvbnN0IGFkdmFuY2VZID0gKGxhc3RQb3NZIC0gcG9zWSkgLyB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgICBjb25zdCBhZHZhbmNlWCA9IHBvc1ggLSBsYXN0UG9zWDsKICAgICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLmhlaWdodCk7CiAgICAgICAgaWYgKGFkdmFuY2VZIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWCkgPiAwLjUgKiB0ZXh0Q29udGVudEl0ZW0ud2lkdGgpIHsKICAgICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGFkdmFuY2VZIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgfQogICAgICAgIGlmIChhZHZhbmNlWSA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgICAgaWYgKHNob3VsZEFkZFdoaXRlcHNhY2UoKSkgewogICAgICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLmFicyhhZHZhbmNlWSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICs9IGFkdmFuY2VZOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIWFkZEZha2VTcGFjZXMoYWR2YW5jZVksIHRleHRDb250ZW50SXRlbS5wcmV2VHJhbnNmb3JtLCB0ZXh0T3JpZW50YXRpb24pKSB7CiAgICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICAgIGhlaWdodDogTWF0aC5hYnMoYWR2YW5jZVkpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dENvbnRlbnRJdGVtLmhlaWdodCArPSBhZHZhbmNlWTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKE1hdGguYWJzKGFkdmFuY2VYKSA+IHRleHRDb250ZW50SXRlbS53aWR0aCAqIFZFUlRJQ0FMX1NISUZUX1JBVElPKSB7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBjb25zdCBhZHZhbmNlWCA9IChwb3NYIC0gbGFzdFBvc1gpIC8gdGV4dENvbnRlbnRJdGVtLnRleHRBZHZhbmNlU2NhbGU7CiAgICAgIGNvbnN0IGFkdmFuY2VZID0gcG9zWSAtIGxhc3RQb3NZOwogICAgICBjb25zdCB0ZXh0T3JpZW50YXRpb24gPSBNYXRoLnNpZ24odGV4dENvbnRlbnRJdGVtLndpZHRoKTsKICAgICAgaWYgKGFkdmFuY2VYIDwgdGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLm5lZ2F0aXZlU3BhY2VNYXgpIHsKICAgICAgICBpZiAoTWF0aC5hYnMoYWR2YW5jZVkpID4gMC41ICogdGV4dENvbnRlbnRJdGVtLmhlaWdodCkgewogICAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmVzZXRMYXN0Q2hhcnMoKTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0KSB7CiAgICAgICAgYXBwZW5kRU9MKCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGFkdmFuY2VYIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5ub3RBU3BhY2UpIHsKICAgICAgICByZXNldExhc3RDaGFycygpOwogICAgICB9CiAgICAgIGlmIChhZHZhbmNlWCA8PSB0ZXh0T3JpZW50YXRpb24gKiB0ZXh0Q29udGVudEl0ZW0udHJhY2tpbmdTcGFjZU1pbikgewogICAgICAgIGlmIChzaG91bGRBZGRXaGl0ZXBzYWNlKCkpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgcHVzaFdoaXRlc3BhY2UoewogICAgICAgICAgICB3aWR0aDogTWF0aC5hYnMoYWR2YW5jZVgpCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dENvbnRlbnRJdGVtLndpZHRoICs9IGFkdmFuY2VYOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghYWRkRmFrZVNwYWNlcyhhZHZhbmNlWCwgdGV4dENvbnRlbnRJdGVtLnByZXZUcmFuc2Zvcm0sIHRleHRPcmllbnRhdGlvbikpIHsKICAgICAgICBpZiAodGV4dENvbnRlbnRJdGVtLnN0ci5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmFicyhhZHZhbmNlWCkKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKz0gYWR2YW5jZVg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhhZHZhbmNlWSkgPiB0ZXh0Q29udGVudEl0ZW0uaGVpZ2h0ICogVkVSVElDQUxfU0hJRlRfUkFUSU8pIHsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICBjaGFycywKICAgICAgZXh0cmFTcGFjaW5nCiAgICB9KSB7CiAgICAgIGNvbnN0IGZvbnQgPSB0ZXh0U3RhdGUuZm9udDsKICAgICAgaWYgKCFjaGFycykgewogICAgICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gdGV4dFN0YXRlLmNoYXJTcGFjaW5nICsgZXh0cmFTcGFjaW5nOwogICAgICAgIGlmIChjaGFyU3BhY2luZykgewogICAgICAgICAgaWYgKCFmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KGNoYXJTcGFjaW5nICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgLWNoYXJTcGFjaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGdseXBocyA9IGZvbnQuY2hhcnNUb0dseXBocyhjaGFycyk7CiAgICAgIGNvbnN0IHNjYWxlID0gdGV4dFN0YXRlLmZvbnRNYXRyaXhbMF0gKiB0ZXh0U3RhdGUuZm9udFNpemU7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGdseXBocy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbaV07CiAgICAgICAgY29uc3QgewogICAgICAgICAgY2F0ZWdvcnkKICAgICAgICB9ID0gZ2x5cGg7CiAgICAgICAgaWYgKGNhdGVnb3J5LmlzSW52aXNpYmxlRm9ybWF0TWFyaykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBjaGFyU3BhY2luZyA9IHRleHRTdGF0ZS5jaGFyU3BhY2luZyArIChpICsgMSA9PT0gaWkgPyBleHRyYVNwYWNpbmcgOiAwKTsKICAgICAgICBsZXQgZ2x5cGhXaWR0aCA9IGdseXBoLndpZHRoOwogICAgICAgIGlmIChmb250LnZlcnRpY2FsKSB7CiAgICAgICAgICBnbHlwaFdpZHRoID0gZ2x5cGgudm1ldHJpYyA/IGdseXBoLnZtZXRyaWNbMF0gOiAtZ2x5cGhXaWR0aDsKICAgICAgICB9CiAgICAgICAgbGV0IHNjYWxlZERpbSA9IGdseXBoV2lkdGggKiBzY2FsZTsKICAgICAgICBpZiAoY2F0ZWdvcnkuaXNXaGl0ZXNwYWNlKSB7CiAgICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgICAgY2hhclNwYWNpbmcgKz0gc2NhbGVkRGltICsgdGV4dFN0YXRlLndvcmRTcGFjaW5nOwogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeChjaGFyU3BhY2luZyAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNoYXJTcGFjaW5nICs9IC1zY2FsZWREaW0gKyB0ZXh0U3RhdGUud29yZFNwYWNpbmc7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIC1jaGFyU3BhY2luZyk7CiAgICAgICAgICB9CiAgICAgICAgICBzYXZlTGFzdENoYXIoIiAiKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWNhdGVnb3J5LmlzWmVyb1dpZHRoRGlhY3JpdGljICYmICFjb21wYXJlV2l0aExhc3RQb3NpdGlvbihzY2FsZWREaW0pKSB7CiAgICAgICAgICBpZiAoIWZvbnQudmVydGljYWwpIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoc2NhbGVkRGltICogdGV4dFN0YXRlLnRleHRIU2NhbGUsIDApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoMCwgc2NhbGVkRGltKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZXh0Q2h1bmsgPSBlbnN1cmVUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICBpZiAoY2F0ZWdvcnkuaXNaZXJvV2lkdGhEaWFjcml0aWMpIHsKICAgICAgICAgIHNjYWxlZERpbSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgewogICAgICAgICAgc2NhbGVkRGltICo9IHRleHRTdGF0ZS50ZXh0SFNjYWxlOwogICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRNYXRyaXgoc2NhbGVkRGltLCAwKTsKICAgICAgICAgIHRleHRDaHVuay53aWR0aCArPSBzY2FsZWREaW07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIHNjYWxlZERpbSk7CiAgICAgICAgICBzY2FsZWREaW0gPSBNYXRoLmFicyhzY2FsZWREaW0pOwogICAgICAgICAgdGV4dENodW5rLmhlaWdodCArPSBzY2FsZWREaW07CiAgICAgICAgfQogICAgICAgIGlmIChzY2FsZWREaW0pIHsKICAgICAgICAgIHRleHRDaHVuay5wcmV2VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRleHRUcmFuc2Zvcm0oKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZ2x5cGhVbmljb2RlID0gZ2x5cGgudW5pY29kZTsKICAgICAgICBpZiAoc2F2ZUxhc3RDaGFyKGdseXBoVW5pY29kZSkpIHsKICAgICAgICAgIHRleHRDaHVuay5zdHIucHVzaCgiICIpOwogICAgICAgIH0KICAgICAgICB0ZXh0Q2h1bmsuc3RyLnB1c2goZ2x5cGhVbmljb2RlKTsKICAgICAgICBpZiAoY2hhclNwYWNpbmcpIHsKICAgICAgICAgIGlmICghZm9udC52ZXJ0aWNhbCkgewogICAgICAgICAgICB0ZXh0U3RhdGUudHJhbnNsYXRlVGV4dE1hdHJpeChjaGFyU3BhY2luZyAqIHRleHRTdGF0ZS50ZXh0SFNjYWxlLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHRTdGF0ZS50cmFuc2xhdGVUZXh0TWF0cml4KDAsIC1jaGFyU3BhY2luZyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBhcHBlbmRFT0woKSB7CiAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0uaGFzRU9MID0gdHJ1ZTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgc3RyOiAiIiwKICAgICAgICAgIGRpcjogImx0ciIsCiAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgIGhlaWdodDogMCwKICAgICAgICAgIHRyYW5zZm9ybTogZ2V0Q3VycmVudFRleHRUcmFuc2Zvcm0oKSwKICAgICAgICAgIGZvbnROYW1lOiB0ZXh0U3RhdGUubG9hZGVkTmFtZSwKICAgICAgICAgIGhhc0VPTDogdHJ1ZQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBhZGRGYWtlU3BhY2VzKHdpZHRoLCB0cmFuc2YsIHRleHRPcmllbnRhdGlvbikgewogICAgICBpZiAodGV4dE9yaWVudGF0aW9uICogdGV4dENvbnRlbnRJdGVtLnNwYWNlSW5GbG93TWluIDw9IHdpZHRoICYmIHdpZHRoIDw9IHRleHRPcmllbnRhdGlvbiAqIHRleHRDb250ZW50SXRlbS5zcGFjZUluRmxvd01heCkgewogICAgICAgIGlmICh0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgIHJlc2V0TGFzdENoYXJzKCk7CiAgICAgICAgICB0ZXh0Q29udGVudEl0ZW0uc3RyLnB1c2goIiAiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGNvbnN0IGZvbnROYW1lID0gdGV4dENvbnRlbnRJdGVtLmZvbnROYW1lOwogICAgICBsZXQgaGVpZ2h0ID0gMDsKICAgICAgaWYgKHRleHRDb250ZW50SXRlbS52ZXJ0aWNhbCkgewogICAgICAgIGhlaWdodCA9IHdpZHRoOwogICAgICAgIHdpZHRoID0gMDsKICAgICAgfQogICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICByZXNldExhc3RDaGFycygpOwogICAgICBwdXNoV2hpdGVzcGFjZSh7CiAgICAgICAgd2lkdGg6IE1hdGguYWJzKHdpZHRoKSwKICAgICAgICBoZWlnaHQ6IE1hdGguYWJzKGhlaWdodCksCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2YgfHwgZ2V0Q3VycmVudFRleHRUcmFuc2Zvcm0oKSwKICAgICAgICBmb250TmFtZQogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBmbHVzaFRleHRDb250ZW50SXRlbSgpIHsKICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0uaW5pdGlhbGl6ZWQgfHwgIXRleHRDb250ZW50SXRlbS5zdHIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCF0ZXh0Q29udGVudEl0ZW0udmVydGljYWwpIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxXaWR0aCArPSB0ZXh0Q29udGVudEl0ZW0ud2lkdGggKiB0ZXh0Q29udGVudEl0ZW0udGV4dEFkdmFuY2VTY2FsZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZXh0Q29udGVudEl0ZW0udG90YWxIZWlnaHQgKz0gdGV4dENvbnRlbnRJdGVtLmhlaWdodCAqIHRleHRDb250ZW50SXRlbS50ZXh0QWR2YW5jZVNjYWxlOwogICAgICB9CiAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2gocnVuQmlkaVRyYW5zZm9ybSh0ZXh0Q29udGVudEl0ZW0pKTsKICAgICAgdGV4dENvbnRlbnRJdGVtLmluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIHRleHRDb250ZW50SXRlbS5zdHIubGVuZ3RoID0gMDsKICAgIH0KICAgIGZ1bmN0aW9uIGVucXVldWVDaHVuayhiYXRjaCA9IGZhbHNlKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aDsKICAgICAgaWYgKGxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoYmF0Y2ggJiYgbGVuZ3RoIDwgVEVYVF9DSFVOS19CQVRDSF9TSVpFKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHNpbmsuZW5xdWV1ZSh0ZXh0Q29udGVudCwgbGVuZ3RoKTsKICAgICAgdGV4dENvbnRlbnQuaXRlbXMgPSBbXTsKICAgICAgdGV4dENvbnRlbnQuc3R5bGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIGNvbnN0IHRpbWVTbG90TWFuYWdlciA9IG5ldyBUaW1lU2xvdE1hbmFnZXIoKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpIHsKICAgICAgY29uc3QgbmV4dCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7CiAgICAgICAgZW5xdWV1ZUNodW5rKHRydWUpOwogICAgICAgIFByb21pc2UuYWxsKFtwcm9taXNlLCBzaW5rLnJlYWR5XSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBwcm9taXNlQm9keShyZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgcmVqZWN0KGV4KTsKICAgICAgICAgIH0KICAgICAgICB9LCByZWplY3QpOwogICAgICB9OwogICAgICB0YXNrLmVuc3VyZU5vdFRlcm1pbmF0ZWQoKTsKICAgICAgdGltZVNsb3RNYW5hZ2VyLnJlc2V0KCk7CiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHt9OwogICAgICBsZXQgc3RvcCwKICAgICAgICBhcmdzID0gW107CiAgICAgIHdoaWxlICghKHN0b3AgPSB0aW1lU2xvdE1hbmFnZXIuY2hlY2soKSkpIHsKICAgICAgICBhcmdzLmxlbmd0aCA9IDA7CiAgICAgICAgb3BlcmF0aW9uLmFyZ3MgPSBhcmdzOwogICAgICAgIGlmICghcHJlcHJvY2Vzc29yLnJlYWQob3BlcmF0aW9uKSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0ZXh0U3RhdGU7CiAgICAgICAgdGV4dFN0YXRlID0gc3RhdGVNYW5hZ2VyLnN0YXRlOwogICAgICAgIGNvbnN0IGZuID0gb3BlcmF0aW9uLmZuOwogICAgICAgIGFyZ3MgPSBvcGVyYXRpb24uYXJnczsKICAgICAgICBzd2l0Y2ggKGZuIHwgMCkgewogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Rm9udDoKICAgICAgICAgICAgdmFyIGZvbnROYW1lQXJnID0gYXJnc1swXS5uYW1lLAogICAgICAgICAgICAgIGZvbnRTaXplQXJnID0gYXJnc1sxXTsKICAgICAgICAgICAgaWYgKHRleHRTdGF0ZS5mb250ICYmIGZvbnROYW1lQXJnID09PSB0ZXh0U3RhdGUuZm9udE5hbWUgJiYgZm9udFNpemVBcmcgPT09IHRleHRTdGF0ZS5mb250U2l6ZSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIHRleHRTdGF0ZS5mb250TmFtZSA9IGZvbnROYW1lQXJnOwogICAgICAgICAgICB0ZXh0U3RhdGUuZm9udFNpemUgPSBmb250U2l6ZUFyZzsKICAgICAgICAgICAgbmV4dChoYW5kbGVTZXRGb250KGZvbnROYW1lQXJnLCBudWxsKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRSaXNlOgogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dFJpc2UgPSBhcmdzWzBdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEhTY2FsZToKICAgICAgICAgICAgdGV4dFN0YXRlLnRleHRIU2NhbGUgPSBhcmdzWzBdIC8gMTAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmc6CiAgICAgICAgICAgIHRleHRTdGF0ZS5sZWFkaW5nID0gYXJnc1swXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVGV4dDoKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOwogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeC5zbGljZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmdNb3ZlVGV4dDoKICAgICAgICAgICAgdGV4dFN0YXRlLmxlYWRpbmcgPSAtYXJnc1sxXTsKICAgICAgICAgICAgdGV4dFN0YXRlLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0pOwogICAgICAgICAgICB0ZXh0U3RhdGUudGV4dE1hdHJpeCA9IHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeC5zbGljZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lOgogICAgICAgICAgICB0ZXh0U3RhdGUuY2FycmlhZ2VSZXR1cm4oKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0TWF0cml4OgogICAgICAgICAgICB0ZXh0U3RhdGUuc2V0VGV4dE1hdHJpeChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTsKICAgICAgICAgICAgdGV4dFN0YXRlLnNldFRleHRMaW5lTWF0cml4KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pOwogICAgICAgICAgICB1cGRhdGVBZHZhbmNlU2NhbGUoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZzoKICAgICAgICAgICAgdGV4dFN0YXRlLmNoYXJTcGFjaW5nID0gYXJnc1swXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRXb3JkU3BhY2luZzoKICAgICAgICAgICAgdGV4dFN0YXRlLndvcmRTcGFjaW5nID0gYXJnc1swXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpblRleHQ6CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICAgICAgICAgIHRleHRTdGF0ZS50ZXh0TGluZU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWC5zbGljZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dTcGFjZWRUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzcGFjZUZhY3RvciA9ICh0ZXh0U3RhdGUuZm9udC52ZXJ0aWNhbCA/IDEgOiAtMSkgKiB0ZXh0U3RhdGUuZm9udFNpemUgLyAxMDAwOwogICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGFyZ3NbMF07CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZWxlbWVudHNbaV07CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgc2hvd1NwYWNlZFRleHRCdWZmZXIucHVzaChpdGVtKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAibnVtYmVyIiAmJiBpdGVtICE9PSAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBzaG93U3BhY2VkVGV4dEJ1ZmZlci5qb2luKCIiKTsKICAgICAgICAgICAgICAgIHNob3dTcGFjZWRUZXh0QnVmZmVyLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgICAgIGNoYXJzOiBzdHIsCiAgICAgICAgICAgICAgICAgIGV4dHJhU3BhY2luZzogaXRlbSAqIHNwYWNlRmFjdG9yCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNob3dTcGFjZWRUZXh0QnVmZmVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBjb25zdCBzdHIgPSBzaG93U3BhY2VkVGV4dEJ1ZmZlci5qb2luKCIiKTsKICAgICAgICAgICAgICBzaG93U3BhY2VkVGV4dEJ1ZmZlci5sZW5ndGggPSAwOwogICAgICAgICAgICAgIGJ1aWxkVGV4dENvbnRlbnRJdGVtKHsKICAgICAgICAgICAgICAgIGNoYXJzOiBzdHIsCiAgICAgICAgICAgICAgICBleHRyYVNwYWNpbmc6IDAKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgY2hhcnM6IGFyZ3NbMF0sCiAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiAwCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lU2hvd1RleHQ6CiAgICAgICAgICAgIGlmICghc3RhdGVNYW5hZ2VyLnN0YXRlLmZvbnQpIHsKICAgICAgICAgICAgICBzZWxmLmVuc3VyZVN0YXRlRm9udChzdGF0ZU1hbmFnZXIuc3RhdGUpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRleHRTdGF0ZS5jYXJyaWFnZVJldHVybigpOwogICAgICAgICAgICBidWlsZFRleHRDb250ZW50SXRlbSh7CiAgICAgICAgICAgICAgY2hhcnM6IGFyZ3NbMF0sCiAgICAgICAgICAgICAgZXh0cmFTcGFjaW5nOiAwCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lU2V0U3BhY2luZ1Nob3dUZXh0OgogICAgICAgICAgICBpZiAoIXN0YXRlTWFuYWdlci5zdGF0ZS5mb250KSB7CiAgICAgICAgICAgICAgc2VsZi5lbnN1cmVTdGF0ZUZvbnQoc3RhdGVNYW5hZ2VyLnN0YXRlKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZXh0U3RhdGUud29yZFNwYWNpbmcgPSBhcmdzWzBdOwogICAgICAgICAgICB0ZXh0U3RhdGUuY2hhclNwYWNpbmcgPSBhcmdzWzFdOwogICAgICAgICAgICB0ZXh0U3RhdGUuY2FycmlhZ2VSZXR1cm4oKTsKICAgICAgICAgICAgYnVpbGRUZXh0Q29udGVudEl0ZW0oewogICAgICAgICAgICAgIGNoYXJzOiBhcmdzWzJdLAogICAgICAgICAgICAgIGV4dHJhU3BhY2luZzogMAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludFhPYmplY3Q6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmICgheG9ianMpIHsKICAgICAgICAgICAgICB4b2JqcyA9IHJlc291cmNlcy5nZXQoIlhPYmplY3QiKSB8fCBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpc1ZhbGlkTmFtZSA9IGFyZ3NbMF0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lOwogICAgICAgICAgICB2YXIgbmFtZSA9IGFyZ3NbMF0ubmFtZTsKICAgICAgICAgICAgaWYgKGlzVmFsaWROYW1lICYmIGVtcHR5WE9iamVjdENhY2hlLmdldEJ5TmFtZShuYW1lKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmVYT2JqZWN0LCByZWplY3RYT2JqZWN0KSB7CiAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgbmFtZS4iKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGV0IHhvYmogPSB4b2Jqcy5nZXRSYXcobmFtZSk7CiAgICAgICAgICAgICAgaWYgKHhvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICAgICAgICAgIGlmIChlbXB0eVhPYmplY3RDYWNoZS5nZXRCeVJlZih4b2JqKSkgewogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxJbWFnZSA9IHNlbGYuZ2xvYmFsSW1hZ2VDYWNoZS5nZXREYXRhKHhvYmosIHNlbGYucGFnZUluZGV4KTsKICAgICAgICAgICAgICAgIGlmIChnbG9iYWxJbWFnZSkgewogICAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4b2JqID0geHJlZi5mZXRjaCh4b2JqKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCEoeG9iaiBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBiZSBhIHN0cmVhbSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCB0eXBlID0geG9iai5kaWN0LmdldCgiU3VidHlwZSIpOwogICAgICAgICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJYT2JqZWN0IHNob3VsZCBoYXZlIGEgTmFtZSBzdWJ0eXBlIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmICh0eXBlLm5hbWUgIT09ICJGb3JtIikgewogICAgICAgICAgICAgICAgZW1wdHlYT2JqZWN0Q2FjaGUuc2V0KG5hbWUsIHhvYmouZGljdC5vYmpJZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICByZXNvbHZlWE9iamVjdCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBzdGF0ZU1hbmFnZXIuc3RhdGUuY2xvbmUoKTsKICAgICAgICAgICAgICBjb25zdCB4T2JqU3RhdGVNYW5hZ2VyID0gbmV3IFN0YXRlTWFuYWdlcihjdXJyZW50U3RhdGUpOwogICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IHhvYmouZGljdC5nZXRBcnJheSgiTWF0cml4Iik7CiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7CiAgICAgICAgICAgICAgICB4T2JqU3RhdGVNYW5hZ2VyLnRyYW5zZm9ybShtYXRyaXgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgICAgICAgICBjb25zdCBzaW5rV3JhcHBlciA9IHsKICAgICAgICAgICAgICAgIGVucXVldWVJbnZva2VkOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVucXVldWUoY2h1bmssIHNpemUpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5lbnF1ZXVlSW52b2tlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIHNpbmsuZW5xdWV1ZShjaHVuaywgc2l6ZSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZ2V0IGRlc2lyZWRTaXplKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gc2luay5kZXNpcmVkU2l6ZTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQgcmVhZHkoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBzaW5rLnJlYWR5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgc2VsZi5nZXRUZXh0Q29udGVudCh7CiAgICAgICAgICAgICAgICBzdHJlYW06IHhvYmosCiAgICAgICAgICAgICAgICB0YXNrLAogICAgICAgICAgICAgICAgcmVzb3VyY2VzOiB4b2JqLmRpY3QuZ2V0KCJSZXNvdXJjZXMiKSB8fCByZXNvdXJjZXMsCiAgICAgICAgICAgICAgICBzdGF0ZU1hbmFnZXI6IHhPYmpTdGF0ZU1hbmFnZXIsCiAgICAgICAgICAgICAgICBpbmNsdWRlTWFya2VkQ29udGVudCwKICAgICAgICAgICAgICAgIHNpbms6IHNpbmtXcmFwcGVyLAogICAgICAgICAgICAgICAgc2VlblN0eWxlcywKICAgICAgICAgICAgICAgIHZpZXdCb3gsCiAgICAgICAgICAgICAgICBtYXJrZWRDb250ZW50RGF0YSwKICAgICAgICAgICAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNpbmtXcmFwcGVyLmVucXVldWVJbnZva2VkKSB7CiAgICAgICAgICAgICAgICAgIGVtcHR5WE9iamVjdENhY2hlLnNldChuYW1lLCB4b2JqLmRpY3Qub2JqSWQsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzb2x2ZVhPYmplY3QoKTsKICAgICAgICAgICAgICB9LCByZWplY3RYT2JqZWN0KTsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfdXRpbC5BYm9ydEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2VsZi5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIFhPYmplY3Q6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0R1N0YXRlOgogICAgICAgICAgICBpc1ZhbGlkTmFtZSA9IGFyZ3NbMF0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lOwogICAgICAgICAgICBuYW1lID0gYXJnc1swXS5uYW1lOwogICAgICAgICAgICBpZiAoaXNWYWxpZE5hbWUgJiYgZW1wdHlHU3RhdGVDYWNoZS5nZXRCeU5hbWUobmFtZSkpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlR1N0YXRlLCByZWplY3RHU3RhdGUpIHsKICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IG5hbWUuIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGV4dEdTdGF0ZSA9IHJlc291cmNlcy5nZXQoIkV4dEdTdGF0ZSIpOwogICAgICAgICAgICAgIGlmICghKGV4dEdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkV4dEdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBnU3RhdGUgPSBleHRHU3RhdGUuZ2V0KG5hbWUpOwogICAgICAgICAgICAgIGlmICghKGdTdGF0ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkdTdGF0ZSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBnU3RhdGVGb250ID0gZ1N0YXRlLmdldCgiRm9udCIpOwogICAgICAgICAgICAgIGlmICghZ1N0YXRlRm9udCkgewogICAgICAgICAgICAgICAgZW1wdHlHU3RhdGVDYWNoZS5zZXQobmFtZSwgZ1N0YXRlLm9iaklkLCB0cnVlKTsKICAgICAgICAgICAgICAgIHJlc29sdmVHU3RhdGUoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgICB0ZXh0U3RhdGUuZm9udE5hbWUgPSBudWxsOwogICAgICAgICAgICAgIHRleHRTdGF0ZS5mb250U2l6ZSA9IGdTdGF0ZUZvbnRbMV07CiAgICAgICAgICAgICAgaGFuZGxlU2V0Rm9udChudWxsLCBnU3RhdGVGb250WzBdKS50aGVuKHJlc29sdmVHU3RhdGUsIHJlamVjdEdTdGF0ZSk7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5pZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0VGV4dENvbnRlbnQgLSBpZ25vcmluZyBFeHRHU3RhdGU6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aHJvdyByZWFzb247CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50OgogICAgICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgICAgICBpZiAoaW5jbHVkZU1hcmtlZENvbnRlbnQpIHsKICAgICAgICAgICAgICBtYXJrZWRDb250ZW50RGF0YS5sZXZlbCsrOwogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudCIsCiAgICAgICAgICAgICAgICB0YWc6IGFyZ3NbMF0gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lID8gYXJnc1swXS5uYW1lIDogbnVsbAogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBfdXRpbC5PUFMuYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsKys7CiAgICAgICAgICAgICAgbGV0IG1jaWQgPSBudWxsOwogICAgICAgICAgICAgIGlmIChhcmdzWzFdIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICAgICAgICAgICAgbWNpZCA9IGFyZ3NbMV0uZ2V0KCJNQ0lEIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTogImJlZ2luTWFya2VkQ29udGVudFByb3BzIiwKICAgICAgICAgICAgICAgIGlkOiBOdW1iZXIuaXNJbnRlZ2VyKG1jaWQpID8gYCR7c2VsZi5pZEZhY3RvcnkuZ2V0UGFnZU9iaklkKCl9X21jJHttY2lkfWAgOiBudWxsLAogICAgICAgICAgICAgICAgdGFnOiBhcmdzWzBdIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSA/IGFyZ3NbMF0ubmFtZSA6IG51bGwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVuZE1hcmtlZENvbnRlbnQ6CiAgICAgICAgICAgIGZsdXNoVGV4dENvbnRlbnRJdGVtKCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlTWFya2VkQ29udGVudCkgewogICAgICAgICAgICAgIGlmIChtYXJrZWRDb250ZW50RGF0YS5sZXZlbCA9PT0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcmtlZENvbnRlbnREYXRhLmxldmVsLS07CiAgICAgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZW5kTWFya2VkQ29udGVudCIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlc3RvcmU6CiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0YXRlICYmIChwcmV2aW91c1N0YXRlLmZvbnQgIT09IHRleHRTdGF0ZS5mb250IHx8IHByZXZpb3VzU3RhdGUuZm9udFNpemUgIT09IHRleHRTdGF0ZS5mb250U2l6ZSB8fCBwcmV2aW91c1N0YXRlLmZvbnROYW1lICE9PSB0ZXh0U3RhdGUuZm9udE5hbWUpKSB7CiAgICAgICAgICAgICAgZmx1c2hUZXh0Q29udGVudEl0ZW0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRleHRDb250ZW50Lml0ZW1zLmxlbmd0aCA+PSBzaW5rLmRlc2lyZWRTaXplKSB7CiAgICAgICAgICBzdG9wID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RvcCkgewogICAgICAgIG5leHQoZGVmZXJyZWQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICBlbnF1ZXVlQ2h1bmsoKTsKICAgICAgcmVzb2x2ZSgpOwogICAgfSkuY2F0Y2gocmVhc29uID0+IHsKICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF91dGlsLkFib3J0RXhjZXB0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRUZXh0Q29udGVudCAtIGlnbm9yaW5nIGVycm9ycyBkdXJpbmcgIiR7dGFzay5uYW1lfSIgYCArIGB0YXNrOiAiJHtyZWFzb259Ii5gKTsKICAgICAgICBmbHVzaFRleHRDb250ZW50SXRlbSgpOwogICAgICAgIGVucXVldWVDaHVuaygpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyByZWFzb247CiAgICB9KTsKICB9CiAgZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGJhc2VEaWN0LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmOwogICAgbGV0IGNpZFRvR2lkQnl0ZXM7CiAgICBjb25zdCB0b1VuaWNvZGVQcm9taXNlID0gdGhpcy5yZWFkVG9Vbmljb2RlKHByb3BlcnRpZXMudG9Vbmljb2RlIHx8IGRpY3QuZ2V0KCJUb1VuaWNvZGUiKSB8fCBiYXNlRGljdC5nZXQoIlRvVW5pY29kZSIpKTsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRTeXN0ZW1JbmZvID0gZGljdC5nZXQoIkNJRFN5c3RlbUluZm8iKTsKICAgICAgaWYgKGNpZFN5c3RlbUluZm8gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgcHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvID0gewogICAgICAgICAgcmVnaXN0cnk6ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoY2lkU3lzdGVtSW5mby5nZXQoIlJlZ2lzdHJ5IikpLAogICAgICAgICAgb3JkZXJpbmc6ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoY2lkU3lzdGVtSW5mby5nZXQoIk9yZGVyaW5nIikpLAogICAgICAgICAgc3VwcGxlbWVudDogY2lkU3lzdGVtSW5mby5nZXQoIlN1cHBsZW1lbnQiKQogICAgICAgIH07CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0KCJDSURUb0dJRE1hcCIpOwogICAgICAgIGlmIChjaWRUb0dpZE1hcCBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgICAgICBjaWRUb0dpZEJ5dGVzID0gY2lkVG9HaWRNYXAuZ2V0Qnl0ZXMoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB0aHJvdyBleDsKICAgICAgICB9CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBleHRyYWN0RGF0YVN0cnVjdHVyZXMgLSBpZ25vcmluZyBDSURUb0dJRE1hcCBkYXRhOiAiJHtleH0iLmApOwogICAgICB9CiAgICB9CiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IFtdOwogICAgbGV0IGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOwogICAgbGV0IGVuY29kaW5nOwogICAgaWYgKGRpY3QuaGFzKCJFbmNvZGluZyIpKSB7CiAgICAgIGVuY29kaW5nID0gZGljdC5nZXQoIkVuY29kaW5nIik7CiAgICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gZW5jb2RpbmcuZ2V0KCJCYXNlRW5jb2RpbmciKTsKICAgICAgICBiYXNlRW5jb2RpbmdOYW1lID0gYmFzZUVuY29kaW5nTmFtZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUgPyBiYXNlRW5jb2RpbmdOYW1lLm5hbWUgOiBudWxsOwogICAgICAgIGlmIChlbmNvZGluZy5oYXMoIkRpZmZlcmVuY2VzIikpIHsKICAgICAgICAgIGNvbnN0IGRpZmZFbmNvZGluZyA9IGVuY29kaW5nLmdldCgiRGlmZmVyZW5jZXMiKTsKICAgICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGRpZmZFbmNvZGluZykgewogICAgICAgICAgICBjb25zdCBkYXRhID0geHJlZi5mZXRjaElmUmVmKGVudHJ5KTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAibnVtYmVyIikgewogICAgICAgICAgICAgIGluZGV4ID0gZGF0YTsKICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICAgIGRpZmZlcmVuY2VzW2luZGV4KytdID0gZGF0YS5uYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBlbnRyeSBpbiAnRGlmZmVyZW5jZXMnIGFycmF5OiAke2RhdGF9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IGVuY29kaW5nLm5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgbXNnID0gIkVuY29kaW5nIGlzIG5vdCBhIE5hbWUgbm9yIGEgRGljdCI7CiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IobXNnKTsKICAgICAgICB9CiAgICAgICAgKDAsIF91dGlsLndhcm4pKG1zZyk7CiAgICAgIH0KICAgICAgaWYgKGJhc2VFbmNvZGluZ05hbWUgIT09ICJNYWNSb21hbkVuY29kaW5nIiAmJiBiYXNlRW5jb2RpbmdOYW1lICE9PSAiTWFjRXhwZXJ0RW5jb2RpbmciICYmIGJhc2VFbmNvZGluZ05hbWUgIT09ICJXaW5BbnNpRW5jb2RpbmciKSB7CiAgICAgICAgYmFzZUVuY29kaW5nTmFtZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG5vbkVtYmVkZGVkRm9udCA9ICFwcm9wZXJ0aWVzLmZpbGUgfHwgcHJvcGVydGllcy5pc0ludGVybmFsRm9udDsKICAgIGlmIChiYXNlRW5jb2RpbmdOYW1lICYmIG5vbkVtYmVkZGVkRm9udCAmJiAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN5bWJvbHNGb250cykoKVtwcm9wZXJ0aWVzLm5hbWVdKSB7CiAgICAgIGJhc2VFbmNvZGluZ05hbWUgPSBudWxsOwogICAgfQogICAgaWYgKGJhc2VFbmNvZGluZ05hbWUpIHsKICAgICAgcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykoYmFzZUVuY29kaW5nTmFtZSk7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBpc1N5bWJvbGljRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBfZm9udHNfdXRpbHMuRm9udEZsYWdzLlN5bWJvbGljKTsKICAgICAgY29uc3QgaXNOb25zeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgX2ZvbnRzX3V0aWxzLkZvbnRGbGFncy5Ob25zeW1ib2xpYyk7CiAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nOwogICAgICBpZiAocHJvcGVydGllcy50eXBlID09PSAiVHJ1ZVR5cGUiICYmICFpc05vbnN5bWJvbGljRm9udCkgewogICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5XaW5BbnNpRW5jb2Rpbmc7CiAgICAgIH0KICAgICAgaWYgKGlzU3ltYm9saWNGb250KSB7CiAgICAgICAgZW5jb2RpbmcgPSBfZW5jb2RpbmdzLk1hY1JvbWFuRW5jb2Rpbmc7CiAgICAgICAgaWYgKG5vbkVtYmVkZGVkRm9udCkgewogICAgICAgICAgaWYgKC9TeW1ib2wvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBfZW5jb2RpbmdzLlN5bWJvbFNldEVuY29kaW5nOwogICAgICAgICAgfSBlbHNlIGlmICgvRGluZ2JhdHMvaS50ZXN0KHByb3BlcnRpZXMubmFtZSkpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBfZW5jb2RpbmdzLlphcGZEaW5nYmF0c0VuY29kaW5nOwogICAgICAgICAgfSBlbHNlIGlmICgvV2luZ2RpbmdzL2kudGVzdChwcm9wZXJ0aWVzLm5hbWUpKSB7CiAgICAgICAgICAgIGVuY29kaW5nID0gX2VuY29kaW5ncy5XaW5BbnNpRW5jb2Rpbmc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7CiAgICB9CiAgICBwcm9wZXJ0aWVzLmRpZmZlcmVuY2VzID0gZGlmZmVyZW5jZXM7CiAgICBwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgPSBiYXNlRW5jb2RpbmdOYW1lOwogICAgcHJvcGVydGllcy5oYXNFbmNvZGluZyA9ICEhYmFzZUVuY29kaW5nTmFtZSB8fCBkaWZmZXJlbmNlcy5sZW5ndGggPiAwOwogICAgcHJvcGVydGllcy5kaWN0ID0gZGljdDsKICAgIHJldHVybiB0b1VuaWNvZGVQcm9taXNlLnRoZW4ocmVhZFRvVW5pY29kZSA9PiB7CiAgICAgIHByb3BlcnRpZXMudG9Vbmljb2RlID0gcmVhZFRvVW5pY29kZTsKICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB9KS50aGVuKGJ1aWx0VG9Vbmljb2RlID0+IHsKICAgICAgcHJvcGVydGllcy50b1VuaWNvZGUgPSBidWlsdFRvVW5pY29kZTsKICAgICAgaWYgKGNpZFRvR2lkQnl0ZXMpIHsKICAgICAgICBwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwID0gdGhpcy5yZWFkQ2lkVG9HaWRNYXAoY2lkVG9HaWRCeXRlcywgYnVpbHRUb1VuaWNvZGUpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwogICAgfSk7CiAgfQogIF9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMsIGZvcmNlR2x5cGhzID0gZmFsc2UpIHsKICAgICgwLCBfdXRpbC5hc3NlcnQpKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSwgIk11c3QgYmUgYSBzaW1wbGUgZm9udC4iKTsKICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdOwogICAgY29uc3QgZW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZy5zbGljZSgpOwogICAgY29uc3QgYmFzZUVuY29kaW5nTmFtZSA9IHByb3BlcnRpZXMuYmFzZUVuY29kaW5nTmFtZTsKICAgIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhcmNvZGVdOwogICAgICBpZiAoZ2x5cGhOYW1lID09PSAiLm5vdGRlZiIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBlbmNvZGluZ1tjaGFyY29kZV0gPSBnbHlwaE5hbWU7CiAgICB9CiAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKICAgIGZvciAoY29uc3QgY2hhcmNvZGUgaW4gZW5jb2RpbmcpIHsKICAgICAgbGV0IGdseXBoTmFtZSA9IGVuY29kaW5nW2NoYXJjb2RlXTsKICAgICAgaWYgKGdseXBoTmFtZSA9PT0gIiIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXTsKICAgICAgaWYgKHVuaWNvZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBjb2RlID0gMDsKICAgICAgc3dpdGNoIChnbHlwaE5hbWVbMF0pIHsKICAgICAgICBjYXNlICJHIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSAzKSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJnIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID09PSA1KSB7CiAgICAgICAgICAgIGNvZGUgPSBwYXJzZUludChnbHlwaE5hbWUuc3Vic3RyaW5nKDEpLCAxNik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDIjoKICAgICAgICBjYXNlICJjIjoKICAgICAgICAgIGlmIChnbHlwaE5hbWUubGVuZ3RoID49IDMgJiYgZ2x5cGhOYW1lLmxlbmd0aCA8PSA0KSB7CiAgICAgICAgICAgIGNvbnN0IGNvZGVTdHIgPSBnbHlwaE5hbWUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICBpZiAoZm9yY2VHbHlwaHMpIHsKICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQoY29kZVN0ciwgMTYpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvZGUgPSArY29kZVN0cjsKICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihjb2RlKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGNvZGVTdHIsIDE2KSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2ltcGxlRm9udFRvVW5pY29kZShwcm9wZXJ0aWVzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAidSI6CiAgICAgICAgICB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgICAgICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICAgICAgICBjb2RlID0gdW5pY29kZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBzd2l0Y2ggKGdseXBoTmFtZSkgewogICAgICAgICAgICBjYXNlICJmX2giOgogICAgICAgICAgICBjYXNlICJmX3QiOgogICAgICAgICAgICBjYXNlICJUX2giOgogICAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBnbHlwaE5hbWUucmVwbGFjZUFsbCgiXyIsICIiKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChjb2RlID4gMCAmJiBjb2RlIDw9IDB4MTBmZmZmICYmIE51bWJlci5pc0ludGVnZXIoY29kZSkpIHsKICAgICAgICBpZiAoYmFzZUVuY29kaW5nTmFtZSAmJiBjb2RlID09PSArY2hhcmNvZGUpIHsKICAgICAgICAgIGNvbnN0IGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShiYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgJiYgKGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyY29kZV0pKSB7CiAgICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGdseXBoc1VuaWNvZGVNYXBbZ2x5cGhOYW1lXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b1VuaWNvZGVbY2hhcmNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0b1VuaWNvZGU7CiAgfQogIGFzeW5jIGJ1aWxkVG9Vbmljb2RlKHByb3BlcnRpZXMpIHsKICAgIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgPSBwcm9wZXJ0aWVzLnRvVW5pY29kZT8ubGVuZ3RoID4gMDsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0luY2x1ZGVkVG9Vbmljb2RlTWFwKSB7CiAgICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUgJiYgcHJvcGVydGllcy5oYXNFbmNvZGluZykgewogICAgICAgIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUgPSB0aGlzLl9zaW1wbGVGb250VG9Vbmljb2RlKHByb3BlcnRpZXMpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnRvVW5pY29kZTsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgcmV0dXJuIG5ldyBfdG9fdW5pY29kZV9tYXAuVG9Vbmljb2RlTWFwKHRoaXMuX3NpbXBsZUZvbnRUb1VuaWNvZGUocHJvcGVydGllcykpOwogICAgfQogICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlICYmIChwcm9wZXJ0aWVzLmNNYXAuYnVpbHRJbkNNYXAgJiYgIShwcm9wZXJ0aWVzLmNNYXAgaW5zdGFuY2VvZiBfY21hcC5JZGVudGl0eUNNYXApIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5yZWdpc3RyeSA9PT0gIkFkb2JlIiAmJiAocHJvcGVydGllcy5jaWRTeXN0ZW1JbmZvLm9yZGVyaW5nID09PSAiR0IxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJDTlMxIiB8fCBwcm9wZXJ0aWVzLmNpZFN5c3RlbUluZm8ub3JkZXJpbmcgPT09ICJKYXBhbjEiIHx8IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mby5vcmRlcmluZyA9PT0gIktvcmVhMSIpKSkgewogICAgICBjb25zdCB7CiAgICAgICAgcmVnaXN0cnksCiAgICAgICAgb3JkZXJpbmcKICAgICAgfSA9IHByb3BlcnRpZXMuY2lkU3lzdGVtSW5mbzsKICAgICAgY29uc3QgdWNzMkNNYXBOYW1lID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoYCR7cmVnaXN0cnl9LSR7b3JkZXJpbmd9LVVDUzJgKTsKICAgICAgY29uc3QgdWNzMkNNYXAgPSBhd2FpdCBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoewogICAgICAgIGVuY29kaW5nOiB1Y3MyQ01hcE5hbWUsCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSk7CiAgICAgIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgICAgIGJ1ZiA9IFtdOwogICAgICBwcm9wZXJ0aWVzLmNNYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhcmNvZGUsIGNpZCkgewogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBjb25zdCB1Y3MyID0gdWNzMkNNYXAubG9va3VwKGNpZCk7CiAgICAgICAgaWYgKHVjczIpIHsKICAgICAgICAgIGJ1Zi5sZW5ndGggPSAwOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdWNzMi5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgICAgIGJ1Zi5wdXNoKCh1Y3MyLmNoYXJDb2RlQXQoaSkgPDwgOCkgKyB1Y3MyLmNoYXJDb2RlQXQoaSArIDEpKTsKICAgICAgICAgIH0KICAgICAgICAgIHRvVW5pY29kZVtjaGFyY29kZV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ldyBfdG9fdW5pY29kZV9tYXAuVG9Vbmljb2RlTWFwKHRvVW5pY29kZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcChwcm9wZXJ0aWVzLmZpcnN0Q2hhciwgcHJvcGVydGllcy5sYXN0Q2hhcik7CiAgfQogIHJlYWRUb1VuaWNvZGUoY21hcE9iaikgewogICAgaWYgKCFjbWFwT2JqKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICB9CiAgICBpZiAoY21hcE9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgcmV0dXJuIF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CiAgICAgICAgZW5jb2Rpbmc6IGNtYXBPYmosCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSkudGhlbihmdW5jdGlvbiAoY21hcCkgewogICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcCgwLCAweGZmZmYpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IF90b191bmljb2RlX21hcC5Ub1VuaWNvZGVNYXAoY21hcC5nZXRNYXAoKSk7CiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChjbWFwT2JqIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgcmV0dXJuIF9jbWFwLkNNYXBGYWN0b3J5LmNyZWF0ZSh7CiAgICAgICAgZW5jb2Rpbmc6IGNtYXBPYmosCiAgICAgICAgZmV0Y2hCdWlsdEluQ01hcDogdGhpcy5fZmV0Y2hCdWlsdEluQ01hcEJvdW5kLAogICAgICAgIHVzZUNNYXA6IG51bGwKICAgICAgfSkudGhlbihmdW5jdGlvbiAoY21hcCkgewogICAgICAgIGlmIChjbWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSB7CiAgICAgICAgICByZXR1cm4gbmV3IF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcCgwLCAweGZmZmYpOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXAgPSBuZXcgQXJyYXkoY21hcC5sZW5ndGgpOwogICAgICAgIGNtYXAuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHRva2VuKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAibnVtYmVyIikgewogICAgICAgICAgICBtYXBbY2hhckNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQodG9rZW4pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdHIgPSBbXTsKICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdG9rZW4ubGVuZ3RoOyBrICs9IDIpIHsKICAgICAgICAgICAgY29uc3QgdzEgPSB0b2tlbi5jaGFyQ29kZUF0KGspIDw8IDggfCB0b2tlbi5jaGFyQ29kZUF0KGsgKyAxKTsKICAgICAgICAgICAgaWYgKCh3MSAmIDB4ZjgwMCkgIT09IDB4ZDgwMCkgewogICAgICAgICAgICAgIHN0ci5wdXNoKHcxKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBrICs9IDI7CiAgICAgICAgICAgIGNvbnN0IHcyID0gdG9rZW4uY2hhckNvZGVBdChrKSA8PCA4IHwgdG9rZW4uY2hhckNvZGVBdChrICsgMSk7CiAgICAgICAgICAgIHN0ci5wdXNoKCgodzEgJiAweDNmZikgPDwgMTApICsgKHcyICYgMHgzZmYpICsgMHgxMDAwMCk7CiAgICAgICAgICB9CiAgICAgICAgICBtYXBbY2hhckNvZGVdID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoLi4uc3RyKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbmV3IF90b191bmljb2RlX21hcC5Ub1VuaWNvZGVNYXAobWFwKTsKICAgICAgfSwgcmVhc29uID0+IHsKICAgICAgICBpZiAocmVhc29uIGluc3RhbmNlb2YgX3V0aWwuQWJvcnRFeGNlcHRpb24pIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgKDAsIF91dGlsLndhcm4pKGByZWFkVG9Vbmljb2RlIC0gaWdub3JpbmcgVG9Vbmljb2RlIGRhdGE6ICIke3JlYXNvbn0iLmApOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogIH0KICByZWFkQ2lkVG9HaWRNYXAoZ2x5cGhzRGF0YSwgdG9Vbmljb2RlKSB7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGZvciAobGV0IGogPSAwLCBqaiA9IGdseXBoc0RhdGEubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICBjb25zdCBnbHlwaElEID0gZ2x5cGhzRGF0YVtqKytdIDw8IDggfCBnbHlwaHNEYXRhW2pdOwogICAgICBjb25zdCBjb2RlID0gaiA+PiAxOwogICAgICBpZiAoZ2x5cGhJRCA9PT0gMCAmJiAhdG9Vbmljb2RlLmhhcyhjb2RlKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJlc3VsdFtjb2RlXSA9IGdseXBoSUQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBleHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBsZXQgZ2x5cGhzV2lkdGhzID0gW107CiAgICBsZXQgZGVmYXVsdFdpZHRoID0gMDsKICAgIGNvbnN0IGdseXBoc1ZNZXRyaWNzID0gW107CiAgICBsZXQgZGVmYXVsdFZNZXRyaWNzOwogICAgbGV0IGksIGlpLCBqLCBqaiwgc3RhcnQsIGNvZGUsIHdpZHRoczsKICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBkZWZhdWx0V2lkdGggPSBkaWN0LmhhcygiRFciKSA/IGRpY3QuZ2V0KCJEVyIpIDogMTAwMDsKICAgICAgd2lkdGhzID0gZGljdC5nZXQoIlciKTsKICAgICAgaWYgKHdpZHRocykgewogICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIHN0YXJ0ID0geHJlZi5mZXRjaElmUmVmKHdpZHRoc1tpKytdKTsKICAgICAgICAgIGNvZGUgPSB4cmVmLmZldGNoSWZSZWYod2lkdGhzW2ldKTsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CiAgICAgICAgICAgIGZvciAoaiA9IDAsIGpqID0gY29kZS5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgICAgICAgZ2x5cGhzV2lkdGhzW3N0YXJ0KytdID0geHJlZi5mZXRjaElmUmVmKGNvZGVbal0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCB3aWR0aCA9IHhyZWYuZmV0Y2hJZlJlZih3aWR0aHNbKytpXSk7CiAgICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGNvZGU7IGorKykgewogICAgICAgICAgICAgIGdseXBoc1dpZHRoc1tqXSA9IHdpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLnZlcnRpY2FsKSB7CiAgICAgICAgbGV0IHZtZXRyaWNzID0gZGljdC5nZXRBcnJheSgiRFcyIikgfHwgWzg4MCwgLTEwMDBdOwogICAgICAgIGRlZmF1bHRWTWV0cmljcyA9IFt2bWV0cmljc1sxXSwgZGVmYXVsdFdpZHRoICogMC41LCB2bWV0cmljc1swXV07CiAgICAgICAgdm1ldHJpY3MgPSBkaWN0LmdldCgiVzIiKTsKICAgICAgICBpZiAodm1ldHJpY3MpIHsKICAgICAgICAgIGZvciAoaSA9IDAsIGlpID0gdm1ldHJpY3MubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgICBzdGFydCA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpKytdKTsKICAgICAgICAgICAgY29kZSA9IHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1tpXSk7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvZGUpKSB7CiAgICAgICAgICAgICAgZm9yIChqID0gMCwgamogPSBjb2RlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW3N0YXJ0KytdID0gW3hyZWYuZmV0Y2hJZlJlZihjb2RlW2orK10pLCB4cmVmLmZldGNoSWZSZWYoY29kZVtqKytdKSwgeHJlZi5mZXRjaElmUmVmKGNvZGVbal0pXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IFt4cmVmLmZldGNoSWZSZWYodm1ldHJpY3NbKytpXSksIHhyZWYuZmV0Y2hJZlJlZih2bWV0cmljc1srK2ldKSwgeHJlZi5mZXRjaElmUmVmKHZtZXRyaWNzWysraV0pXTsKICAgICAgICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8PSBjb2RlOyBqKyspIHsKICAgICAgICAgICAgICAgIGdseXBoc1ZNZXRyaWNzW2pdID0gdm1ldHJpYzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGZpcnN0Q2hhciA9IHByb3BlcnRpZXMuZmlyc3RDaGFyOwogICAgICB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIik7CiAgICAgIGlmICh3aWR0aHMpIHsKICAgICAgICBqID0gZmlyc3RDaGFyOwogICAgICAgIGZvciAoaSA9IDAsIGlpID0gd2lkdGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgIGdseXBoc1dpZHRoc1tqKytdID0geHJlZi5mZXRjaElmUmVmKHdpZHRoc1tpXSk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRXaWR0aCA9IHBhcnNlRmxvYXQoZGVzY3JpcHRvci5nZXQoIk1pc3NpbmdXaWR0aCIpKSB8fCAwOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGJhc2VGb250TmFtZSA9IGRpY3QuZ2V0KCJCYXNlRm9udCIpOwogICAgICAgIGlmIChiYXNlRm9udE5hbWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5nZXRCYXNlRm9udE1ldHJpY3MoYmFzZUZvbnROYW1lLm5hbWUpOwogICAgICAgICAgZ2x5cGhzV2lkdGhzID0gdGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChtZXRyaWNzLndpZHRocywgcHJvcGVydGllcyk7CiAgICAgICAgICBkZWZhdWx0V2lkdGggPSBtZXRyaWNzLmRlZmF1bHRXaWR0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxldCBpc01vbm9zcGFjZSA9IHRydWU7CiAgICBsZXQgZmlyc3RXaWR0aCA9IGRlZmF1bHRXaWR0aDsKICAgIGZvciAoY29uc3QgZ2x5cGggaW4gZ2x5cGhzV2lkdGhzKSB7CiAgICAgIGNvbnN0IGdseXBoV2lkdGggPSBnbHlwaHNXaWR0aHNbZ2x5cGhdOwogICAgICBpZiAoIWdseXBoV2lkdGgpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoIWZpcnN0V2lkdGgpIHsKICAgICAgICBmaXJzdFdpZHRoID0gZ2x5cGhXaWR0aDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoZmlyc3RXaWR0aCAhPT0gZ2x5cGhXaWR0aCkgewogICAgICAgIGlzTW9ub3NwYWNlID0gZmFsc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc01vbm9zcGFjZSkgewogICAgICBwcm9wZXJ0aWVzLmZsYWdzIHw9IF9mb250c191dGlscy5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKICAgIH0gZWxzZSB7CiAgICAgIHByb3BlcnRpZXMuZmxhZ3MgJj0gfl9mb250c191dGlscy5Gb250RmxhZ3MuRml4ZWRQaXRjaDsKICAgIH0KICAgIHByb3BlcnRpZXMuZGVmYXVsdFdpZHRoID0gZGVmYXVsdFdpZHRoOwogICAgcHJvcGVydGllcy53aWR0aHMgPSBnbHlwaHNXaWR0aHM7CiAgICBwcm9wZXJ0aWVzLmRlZmF1bHRWTWV0cmljcyA9IGRlZmF1bHRWTWV0cmljczsKICAgIHByb3BlcnRpZXMudm1ldHJpY3MgPSBnbHlwaHNWTWV0cmljczsKICB9CiAgaXNTZXJpZkZvbnQoYmFzZUZvbnROYW1lKSB7CiAgICBjb25zdCBmb250TmFtZVdvU3R5bGUgPSBiYXNlRm9udE5hbWUuc3BsaXQoIi0iKVswXTsKICAgIHJldHVybiBmb250TmFtZVdvU3R5bGUgaW4gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTZXJpZkZvbnRzKSgpIHx8IC9zZXJpZi9naS50ZXN0KGZvbnROYW1lV29TdHlsZSk7CiAgfQogIGdldEJhc2VGb250TWV0cmljcyhuYW1lKSB7CiAgICBsZXQgZGVmYXVsdFdpZHRoID0gMDsKICAgIGxldCB3aWR0aHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IG1vbm9zcGFjZSA9IGZhbHNlOwogICAgY29uc3Qgc3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0U3RkRm9udE1hcCkoKTsKICAgIGxldCBsb29rdXBOYW1lID0gc3RkRm9udE1hcFtuYW1lXSB8fCBuYW1lOwogICAgY29uc3QgTWV0cmljcyA9ICgwLCBfbWV0cmljcy5nZXRNZXRyaWNzKSgpOwogICAgaWYgKCEobG9va3VwTmFtZSBpbiBNZXRyaWNzKSkgewogICAgICBpZiAodGhpcy5pc1NlcmlmRm9udChuYW1lKSkgewogICAgICAgIGxvb2t1cE5hbWUgPSAiVGltZXMtUm9tYW4iOwogICAgICB9IGVsc2UgewogICAgICAgIGxvb2t1cE5hbWUgPSAiSGVsdmV0aWNhIjsKICAgICAgfQogICAgfQogICAgY29uc3QgZ2x5cGhXaWR0aHMgPSBNZXRyaWNzW2xvb2t1cE5hbWVdOwogICAgaWYgKHR5cGVvZiBnbHlwaFdpZHRocyA9PT0gIm51bWJlciIpIHsKICAgICAgZGVmYXVsdFdpZHRoID0gZ2x5cGhXaWR0aHM7CiAgICAgIG1vbm9zcGFjZSA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICB3aWR0aHMgPSBnbHlwaFdpZHRocygpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgZGVmYXVsdFdpZHRoLAogICAgICBtb25vc3BhY2UsCiAgICAgIHdpZHRocwogICAgfTsKICB9CiAgYnVpbGRDaGFyQ29kZVRvV2lkdGgod2lkdGhzQnlHbHlwaE5hbWUsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IHdpZHRocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCBkaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICBjb25zdCBlbmNvZGluZyA9IHByb3BlcnRpZXMuZGVmYXVsdEVuY29kaW5nOwogICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICBpZiAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMgJiYgd2lkdGhzQnlHbHlwaE5hbWVbZGlmZmVyZW5jZXNbY2hhckNvZGVdXSkgewogICAgICAgIHdpZHRoc1tjaGFyQ29kZV0gPSB3aWR0aHNCeUdseXBoTmFtZVtkaWZmZXJlbmNlc1tjaGFyQ29kZV1dOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChjaGFyQ29kZSBpbiBlbmNvZGluZyAmJiB3aWR0aHNCeUdseXBoTmFtZVtlbmNvZGluZ1tjaGFyQ29kZV1dKSB7CiAgICAgICAgd2lkdGhzW2NoYXJDb2RlXSA9IHdpZHRoc0J5R2x5cGhOYW1lW2VuY29kaW5nW2NoYXJDb2RlXV07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB3aWR0aHM7CiAgfQogIHByZUV2YWx1YXRlRm9udChkaWN0KSB7CiAgICBjb25zdCBiYXNlRGljdCA9IGRpY3Q7CiAgICBsZXQgdHlwZSA9IGRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICBpZiAoISh0eXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOwogICAgfQogICAgbGV0IGNvbXBvc2l0ZSA9IGZhbHNlOwogICAgbGV0IGhhc2gsIHRvVW5pY29kZTsKICAgIGlmICh0eXBlLm5hbWUgPT09ICJUeXBlMCIpIHsKICAgICAgY29uc3QgZGYgPSBkaWN0LmdldCgiRGVzY2VuZGFudEZvbnRzIik7CiAgICAgIGlmICghZGYpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkRlc2NlbmRhbnQgZm9udHMgYXJlIG5vdCBzcGVjaWZpZWQiKTsKICAgICAgfQogICAgICBkaWN0ID0gQXJyYXkuaXNBcnJheShkZikgPyB0aGlzLnhyZWYuZmV0Y2hJZlJlZihkZlswXSkgOiBkZjsKICAgICAgaWYgKCEoZGljdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJEZXNjZW5kYW50IGZvbnQgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgICAgfQogICAgICB0eXBlID0gZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgU3VidHlwZSIpOwogICAgICB9CiAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICB9CiAgICBjb25zdCBmaXJzdENoYXIgPSBkaWN0LmdldCgiRmlyc3RDaGFyIikgfHwgMCwKICAgICAgbGFzdENoYXIgPSBkaWN0LmdldCgiTGFzdENoYXIiKSB8fCAoY29tcG9zaXRlID8gMHhmZmZmIDogMHhmZik7CiAgICBjb25zdCBkZXNjcmlwdG9yID0gZGljdC5nZXQoIkZvbnREZXNjcmlwdG9yIik7CiAgICBpZiAoZGVzY3JpcHRvcikgewogICAgICBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KCk7CiAgICAgIGNvbnN0IGVuY29kaW5nID0gYmFzZURpY3QuZ2V0UmF3KCJFbmNvZGluZyIpOwogICAgICBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgaGFzaC51cGRhdGUoZW5jb2RpbmcubmFtZSk7CiAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICBoYXNoLnVwZGF0ZShlbmNvZGluZy50b1N0cmluZygpKTsKICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVuY29kaW5nLmdldFJhd1ZhbHVlcygpKSB7CiAgICAgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgIGhhc2gudXBkYXRlKGVudHJ5Lm5hbWUpOwogICAgICAgICAgfSBlbHNlIGlmIChlbnRyeSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS50b1N0cmluZygpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgICAgICAgICAgY29uc3QgZGlmZkxlbmd0aCA9IGVudHJ5Lmxlbmd0aCwKICAgICAgICAgICAgICBkaWZmQnVmID0gbmV3IEFycmF5KGRpZmZMZW5ndGgpOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRpZmZMZW5ndGg7IGorKykgewogICAgICAgICAgICAgIGNvbnN0IGRpZmZFbnRyeSA9IGVudHJ5W2pdOwogICAgICAgICAgICAgIGlmIChkaWZmRW50cnkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgICAgICBkaWZmQnVmW2pdID0gZGlmZkVudHJ5Lm5hbWU7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGlmZkVudHJ5ID09PSAibnVtYmVyIiB8fCBkaWZmRW50cnkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICAgICAgICAgIGRpZmZCdWZbal0gPSBkaWZmRW50cnkudG9TdHJpbmcoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGFzaC51cGRhdGUoZGlmZkJ1Zi5qb2luKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYXNoLnVwZGF0ZShgJHtmaXJzdENoYXJ9LSR7bGFzdENoYXJ9YCk7CiAgICAgIHRvVW5pY29kZSA9IGRpY3QuZ2V0KCJUb1VuaWNvZGUiKSB8fCBiYXNlRGljdC5nZXQoIlRvVW5pY29kZSIpOwogICAgICBpZiAodG9Vbmljb2RlIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgICBjb25zdCBzdHJlYW0gPSB0b1VuaWNvZGUuc3RyIHx8IHRvVW5pY29kZTsKICAgICAgICBjb25zdCB1aW50OGFycmF5ID0gc3RyZWFtLmJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KHN0cmVhbS5idWZmZXIuYnVmZmVyLCAwLCBzdHJlYW0uYnVmZmVyTGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KHN0cmVhbS5ieXRlcy5idWZmZXIsIHN0cmVhbS5zdGFydCwgc3RyZWFtLmVuZCAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgaGFzaC51cGRhdGUodWludDhhcnJheSk7CiAgICAgIH0gZWxzZSBpZiAodG9Vbmljb2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgIGhhc2gudXBkYXRlKHRvVW5pY29kZS5uYW1lKTsKICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBkaWN0LmdldCgiV2lkdGhzIikgfHwgYmFzZURpY3QuZ2V0KCJXaWR0aHMiKTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2lkdGhzKSkgewogICAgICAgIGNvbnN0IHdpZHRoc0J1ZiA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygd2lkdGhzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAibnVtYmVyIiB8fCBlbnRyeSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgICAgICB3aWR0aHNCdWYucHVzaChlbnRyeS50b1N0cmluZygpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFzaC51cGRhdGUod2lkdGhzQnVmLmpvaW4oKSk7CiAgICAgIH0KICAgICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICAgIGhhc2gudXBkYXRlKCJjb21wb3NpdGVGb250Iik7CiAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGhzID0gZGljdC5nZXQoIlciKSB8fCBiYXNlRGljdC5nZXQoIlciKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb21wb3NpdGVXaWR0aHMpKSB7CiAgICAgICAgICBjb25zdCB3aWR0aHNCdWYgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29tcG9zaXRlV2lkdGhzKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICJudW1iZXIiIHx8IGVudHJ5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICAgICAgd2lkdGhzQnVmLnB1c2goZW50cnkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHsKICAgICAgICAgICAgICBjb25zdCBzdWJXaWR0aHNCdWYgPSBbXTsKICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZW50cnkpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gIm51bWJlciIgfHwgZWxlbWVudCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgICAgICAgICAgICBzdWJXaWR0aHNCdWYucHVzaChlbGVtZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB3aWR0aHNCdWYucHVzaChgWyR7c3ViV2lkdGhzQnVmLmpvaW4oKX1dYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGhhc2gudXBkYXRlKHdpZHRoc0J1Zi5qb2luKCkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IGRpY3QuZ2V0UmF3KCJDSURUb0dJRE1hcCIpIHx8IGJhc2VEaWN0LmdldFJhdygiQ0lEVG9HSURNYXAiKTsKICAgICAgICBpZiAoY2lkVG9HaWRNYXAgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC5uYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICBoYXNoLnVwZGF0ZShjaWRUb0dpZE1hcC50b1N0cmluZygpKTsKICAgICAgICB9IGVsc2UgaWYgKGNpZFRvR2lkTWFwIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgICAgIGhhc2gudXBkYXRlKGNpZFRvR2lkTWFwLnBlZWtCeXRlcygpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRlc2NyaXB0b3IsCiAgICAgIGRpY3QsCiAgICAgIGJhc2VEaWN0LAogICAgICBjb21wb3NpdGUsCiAgICAgIHR5cGU6IHR5cGUubmFtZSwKICAgICAgZmlyc3RDaGFyLAogICAgICBsYXN0Q2hhciwKICAgICAgdG9Vbmljb2RlLAogICAgICBoYXNoOiBoYXNoID8gaGFzaC5oZXhkaWdlc3QoKSA6ICIiCiAgICB9OwogIH0KICBhc3luYyB0cmFuc2xhdGVGb250KHsKICAgIGRlc2NyaXB0b3IsCiAgICBkaWN0LAogICAgYmFzZURpY3QsCiAgICBjb21wb3NpdGUsCiAgICB0eXBlLAogICAgZmlyc3RDaGFyLAogICAgbGFzdENoYXIsCiAgICB0b1VuaWNvZGUsCiAgICBjc3NGb250SW5mbwogIH0pIHsKICAgIGNvbnN0IGlzVHlwZTNGb250ID0gdHlwZSA9PT0gIlR5cGUzIjsKICAgIGxldCBwcm9wZXJ0aWVzOwogICAgaWYgKCFkZXNjcmlwdG9yKSB7CiAgICAgIGlmIChpc1R5cGUzRm9udCkgewogICAgICAgIGRlc2NyaXB0b3IgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKICAgICAgICBkZXNjcmlwdG9yLnNldCgiRm9udE5hbWUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCh0eXBlKSk7CiAgICAgICAgZGVzY3JpcHRvci5zZXQoIkZvbnRCQm94IiwgZGljdC5nZXRBcnJheSgiRm9udEJCb3giKSB8fCBbMCwgMCwgMCwgMF0pOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBiYXNlRm9udE5hbWUgPSBkaWN0LmdldCgiQmFzZUZvbnQiKTsKICAgICAgICBpZiAoIShiYXNlRm9udE5hbWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSkgewogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYXNlIGZvbnQgaXMgbm90IHNwZWNpZmllZCIpOwogICAgICAgIH0KICAgICAgICBiYXNlRm9udE5hbWUgPSBiYXNlRm9udE5hbWUubmFtZS5yZXBsYWNlQWxsKC9bLF9dL2csICItIik7CiAgICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMuZ2V0QmFzZUZvbnRNZXRyaWNzKGJhc2VGb250TmFtZSk7CiAgICAgICAgY29uc3QgZm9udE5hbWVXb1N0eWxlID0gYmFzZUZvbnROYW1lLnNwbGl0KCItIilbMF07CiAgICAgICAgY29uc3QgZmxhZ3MgPSAodGhpcy5pc1NlcmlmRm9udChmb250TmFtZVdvU3R5bGUpID8gX2ZvbnRzX3V0aWxzLkZvbnRGbGFncy5TZXJpZiA6IDApIHwgKG1ldHJpY3MubW9ub3NwYWNlID8gX2ZvbnRzX3V0aWxzLkZvbnRGbGFncy5GaXhlZFBpdGNoIDogMCkgfCAoKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTeW1ib2xzRm9udHMpKClbZm9udE5hbWVXb1N0eWxlXSA/IF9mb250c191dGlscy5Gb250RmxhZ3MuU3ltYm9saWMgOiBfZm9udHNfdXRpbHMuRm9udEZsYWdzLk5vbnN5bWJvbGljKTsKICAgICAgICBwcm9wZXJ0aWVzID0gewogICAgICAgICAgdHlwZSwKICAgICAgICAgIG5hbWU6IGJhc2VGb250TmFtZSwKICAgICAgICAgIGxvYWRlZE5hbWU6IGJhc2VEaWN0LmxvYWRlZE5hbWUsCiAgICAgICAgICBzeXN0ZW1Gb250SW5mbzogbnVsbCwKICAgICAgICAgIHdpZHRoczogbWV0cmljcy53aWR0aHMsCiAgICAgICAgICBkZWZhdWx0V2lkdGg6IG1ldHJpY3MuZGVmYXVsdFdpZHRoLAogICAgICAgICAgaXNTaW11bGF0ZWRGbGFnczogdHJ1ZSwKICAgICAgICAgIGZsYWdzLAogICAgICAgICAgZmlyc3RDaGFyLAogICAgICAgICAgbGFzdENoYXIsCiAgICAgICAgICB0b1VuaWNvZGUsCiAgICAgICAgICB4SGVpZ2h0OiAwLAogICAgICAgICAgY2FwSGVpZ2h0OiAwLAogICAgICAgICAgaXRhbGljQW5nbGU6IDAsCiAgICAgICAgICBpc1R5cGUzRm9udAogICAgICAgIH07CiAgICAgICAgY29uc3Qgd2lkdGhzID0gZGljdC5nZXQoIldpZHRocyIpOwogICAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN0YW5kYXJkRm9udE5hbWUpKGJhc2VGb250TmFtZSk7CiAgICAgICAgbGV0IGZpbGUgPSBudWxsOwogICAgICAgIGlmIChzdGFuZGFyZEZvbnROYW1lKSB7CiAgICAgICAgICBmaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250ID0gISFmaWxlOwogICAgICAgIH0KICAgICAgICBpZiAoIXByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgICBwcm9wZXJ0aWVzLnN5c3RlbUZvbnRJbmZvID0gKDAsIF9mb250X3N1YnN0aXR1dGlvbnMuZ2V0Rm9udFN1YnN0aXR1dGlvbikodGhpcy5zeXN0ZW1Gb250Q2FjaGUsIHRoaXMuaWRGYWN0b3J5LCB0aGlzLm9wdGlvbnMuc3RhbmRhcmRGb250RGF0YVVybCwgYmFzZUZvbnROYW1lLCBzdGFuZGFyZEZvbnROYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFTdHJ1Y3R1cmVzKGRpY3QsIGRpY3QsIHByb3BlcnRpZXMpLnRoZW4obmV3UHJvcGVydGllcyA9PiB7CiAgICAgICAgICBpZiAod2lkdGhzKSB7CiAgICAgICAgICAgIGNvbnN0IGdseXBoV2lkdGhzID0gW107CiAgICAgICAgICAgIGxldCBqID0gZmlyc3RDaGFyOwogICAgICAgICAgICBmb3IgKGNvbnN0IHdpZHRoIG9mIHdpZHRocykgewogICAgICAgICAgICAgIGdseXBoV2lkdGhzW2orK10gPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZih3aWR0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV3UHJvcGVydGllcy53aWR0aHMgPSBnbHlwaFdpZHRoczsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMud2lkdGhzID0gdGhpcy5idWlsZENoYXJDb2RlVG9XaWR0aChtZXRyaWNzLndpZHRocywgbmV3UHJvcGVydGllcyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmV3IF9mb250cy5Gb250KGJhc2VGb250TmFtZSwgZmlsZSwgbmV3UHJvcGVydGllcyk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGxldCBmb250TmFtZSA9IGRlc2NyaXB0b3IuZ2V0KCJGb250TmFtZSIpOwogICAgbGV0IGJhc2VGb250ID0gZGljdC5nZXQoIkJhc2VGb250Iik7CiAgICBpZiAodHlwZW9mIGZvbnROYW1lID09PSAic3RyaW5nIikgewogICAgICBmb250TmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KGZvbnROYW1lKTsKICAgIH0KICAgIGlmICh0eXBlb2YgYmFzZUZvbnQgPT09ICJzdHJpbmciKSB7CiAgICAgIGJhc2VGb250ID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoYmFzZUZvbnQpOwogICAgfQogICAgaWYgKCFpc1R5cGUzRm9udCkgewogICAgICBjb25zdCBmb250TmFtZVN0ciA9IGZvbnROYW1lPy5uYW1lOwogICAgICBjb25zdCBiYXNlRm9udFN0ciA9IGJhc2VGb250Py5uYW1lOwogICAgICBpZiAoZm9udE5hbWVTdHIgIT09IGJhc2VGb250U3RyKSB7CiAgICAgICAgKDAsIF91dGlsLmluZm8pKGBUaGUgRm9udERlc2NyaXB0b3IncyBGb250TmFtZSBpcyAiJHtmb250TmFtZVN0cn0iIGJ1dCBgICsgYHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgRm9udCdzIEJhc2VGb250ICIke2Jhc2VGb250U3RyfSIuYCk7CiAgICAgICAgaWYgKGZvbnROYW1lU3RyICYmIGJhc2VGb250U3RyPy5zdGFydHNXaXRoKGZvbnROYW1lU3RyKSkgewogICAgICAgICAgZm9udE5hbWUgPSBiYXNlRm9udDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZvbnROYW1lIHx8PSBiYXNlRm9udDsKICAgIGlmICghKGZvbnROYW1lIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJpbnZhbGlkIGZvbnQgbmFtZSIpOwogICAgfQogICAgbGV0IGZvbnRGaWxlLCBzdWJ0eXBlLCBsZW5ndGgxLCBsZW5ndGgyLCBsZW5ndGgzOwogICAgdHJ5IHsKICAgICAgZm9udEZpbGUgPSBkZXNjcmlwdG9yLmdldCgiRm9udEZpbGUiLCAiRm9udEZpbGUyIiwgIkZvbnRGaWxlMyIpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuaWdub3JlRXJyb3JzKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGB0cmFuc2xhdGVGb250IC0gZmV0Y2hpbmcgIiR7Zm9udE5hbWUubmFtZX0iIGZvbnQgZmlsZTogIiR7ZXh9Ii5gKTsKICAgICAgZm9udEZpbGUgPSBuZXcgX3N0cmVhbS5OdWxsU3RyZWFtKCk7CiAgICB9CiAgICBsZXQgaXNJbnRlcm5hbEZvbnQgPSBmYWxzZTsKICAgIGxldCBnbHlwaFNjYWxlRmFjdG9ycyA9IG51bGw7CiAgICBsZXQgc3lzdGVtRm9udEluZm8gPSBudWxsOwogICAgaWYgKGZvbnRGaWxlKSB7CiAgICAgIGlmIChmb250RmlsZS5kaWN0KSB7CiAgICAgICAgY29uc3Qgc3VidHlwZUVudHJ5ID0gZm9udEZpbGUuZGljdC5nZXQoIlN1YnR5cGUiKTsKICAgICAgICBpZiAoc3VidHlwZUVudHJ5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgc3VidHlwZSA9IHN1YnR5cGVFbnRyeS5uYW1lOwogICAgICAgIH0KICAgICAgICBsZW5ndGgxID0gZm9udEZpbGUuZGljdC5nZXQoIkxlbmd0aDEiKTsKICAgICAgICBsZW5ndGgyID0gZm9udEZpbGUuZGljdC5nZXQoIkxlbmd0aDIiKTsKICAgICAgICBsZW5ndGgzID0gZm9udEZpbGUuZGljdC5nZXQoIkxlbmd0aDMiKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjc3NGb250SW5mbykgewogICAgICBjb25zdCBzdGFuZGFyZEZvbnROYW1lID0gKDAsIF94ZmFfZm9udHMuZ2V0WGZhRm9udE5hbWUpKGZvbnROYW1lLm5hbWUpOwogICAgICBpZiAoc3RhbmRhcmRGb250TmFtZSkgewogICAgICAgIGNzc0ZvbnRJbmZvLmZvbnRGYW1pbHkgPSBgJHtjc3NGb250SW5mby5mb250RmFtaWx5fS1QZGZKUy1YRkFgOwogICAgICAgIGNzc0ZvbnRJbmZvLm1ldHJpY3MgPSBzdGFuZGFyZEZvbnROYW1lLm1ldHJpY3MgfHwgbnVsbDsKICAgICAgICBnbHlwaFNjYWxlRmFjdG9ycyA9IHN0YW5kYXJkRm9udE5hbWUuZmFjdG9ycyB8fCBudWxsOwogICAgICAgIGZvbnRGaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZS5uYW1lKTsKICAgICAgICBpc0ludGVybmFsRm9udCA9ICEhZm9udEZpbGU7CiAgICAgICAgYmFzZURpY3QgPSBkaWN0ID0gKDAsIF94ZmFfZm9udHMuZ2V0WGZhRm9udERpY3QpKGZvbnROYW1lLm5hbWUpOwogICAgICAgIGNvbXBvc2l0ZSA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIWlzVHlwZTNGb250KSB7CiAgICAgIGNvbnN0IHN0YW5kYXJkRm9udE5hbWUgPSAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN0YW5kYXJkRm9udE5hbWUpKGZvbnROYW1lLm5hbWUpOwogICAgICBpZiAoc3RhbmRhcmRGb250TmFtZSkgewogICAgICAgIGZvbnRGaWxlID0gYXdhaXQgdGhpcy5mZXRjaFN0YW5kYXJkRm9udERhdGEoc3RhbmRhcmRGb250TmFtZSk7CiAgICAgICAgaXNJbnRlcm5hbEZvbnQgPSAhIWZvbnRGaWxlOwogICAgICB9CiAgICAgIGlmICghaXNJbnRlcm5hbEZvbnQgJiYgdGhpcy5vcHRpb25zLnVzZVN5c3RlbUZvbnRzKSB7CiAgICAgICAgc3lzdGVtRm9udEluZm8gPSAoMCwgX2ZvbnRfc3Vic3RpdHV0aW9ucy5nZXRGb250U3Vic3RpdHV0aW9uKSh0aGlzLnN5c3RlbUZvbnRDYWNoZSwgdGhpcy5pZEZhY3RvcnksIHRoaXMub3B0aW9ucy5zdGFuZGFyZEZvbnREYXRhVXJsLCBmb250TmFtZS5uYW1lLCBzdGFuZGFyZEZvbnROYW1lKTsKICAgICAgfQogICAgfQogICAgcHJvcGVydGllcyA9IHsKICAgICAgdHlwZSwKICAgICAgbmFtZTogZm9udE5hbWUubmFtZSwKICAgICAgc3VidHlwZSwKICAgICAgZmlsZTogZm9udEZpbGUsCiAgICAgIGxlbmd0aDEsCiAgICAgIGxlbmd0aDIsCiAgICAgIGxlbmd0aDMsCiAgICAgIGlzSW50ZXJuYWxGb250LAogICAgICBsb2FkZWROYW1lOiBiYXNlRGljdC5sb2FkZWROYW1lLAogICAgICBjb21wb3NpdGUsCiAgICAgIGZpeGVkUGl0Y2g6IGZhbHNlLAogICAgICBmb250TWF0cml4OiBkaWN0LmdldEFycmF5KCJGb250TWF0cml4IikgfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVgsCiAgICAgIGZpcnN0Q2hhciwKICAgICAgbGFzdENoYXIsCiAgICAgIHRvVW5pY29kZSwKICAgICAgYmJveDogZGVzY3JpcHRvci5nZXRBcnJheSgiRm9udEJCb3giKSB8fCBkaWN0LmdldEFycmF5KCJGb250QkJveCIpLAogICAgICBhc2NlbnQ6IGRlc2NyaXB0b3IuZ2V0KCJBc2NlbnQiKSwKICAgICAgZGVzY2VudDogZGVzY3JpcHRvci5nZXQoIkRlc2NlbnQiKSwKICAgICAgeEhlaWdodDogZGVzY3JpcHRvci5nZXQoIlhIZWlnaHQiKSB8fCAwLAogICAgICBjYXBIZWlnaHQ6IGRlc2NyaXB0b3IuZ2V0KCJDYXBIZWlnaHQiKSB8fCAwLAogICAgICBmbGFnczogZGVzY3JpcHRvci5nZXQoIkZsYWdzIiksCiAgICAgIGl0YWxpY0FuZ2xlOiBkZXNjcmlwdG9yLmdldCgiSXRhbGljQW5nbGUiKSB8fCAwLAogICAgICBpc1R5cGUzRm9udCwKICAgICAgY3NzRm9udEluZm8sCiAgICAgIHNjYWxlRmFjdG9yczogZ2x5cGhTY2FsZUZhY3RvcnMsCiAgICAgIHN5c3RlbUZvbnRJbmZvCiAgICB9OwogICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRFbmNvZGluZyA9IGJhc2VEaWN0LmdldCgiRW5jb2RpbmciKTsKICAgICAgaWYgKGNpZEVuY29kaW5nIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgIHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgPSBjaWRFbmNvZGluZy5uYW1lOwogICAgICB9CiAgICAgIGNvbnN0IGNNYXAgPSBhd2FpdCBfY21hcC5DTWFwRmFjdG9yeS5jcmVhdGUoewogICAgICAgIGVuY29kaW5nOiBjaWRFbmNvZGluZywKICAgICAgICBmZXRjaEJ1aWx0SW5DTWFwOiB0aGlzLl9mZXRjaEJ1aWx0SW5DTWFwQm91bmQsCiAgICAgICAgdXNlQ01hcDogbnVsbAogICAgICB9KTsKICAgICAgcHJvcGVydGllcy5jTWFwID0gY01hcDsKICAgICAgcHJvcGVydGllcy52ZXJ0aWNhbCA9IHByb3BlcnRpZXMuY01hcC52ZXJ0aWNhbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhU3RydWN0dXJlcyhkaWN0LCBiYXNlRGljdCwgcHJvcGVydGllcykudGhlbihuZXdQcm9wZXJ0aWVzID0+IHsKICAgICAgdGhpcy5leHRyYWN0V2lkdGhzKGRpY3QsIGRlc2NyaXB0b3IsIG5ld1Byb3BlcnRpZXMpOwogICAgICByZXR1cm4gbmV3IF9mb250cy5Gb250KGZvbnROYW1lLm5hbWUsIGZvbnRGaWxlLCBuZXdQcm9wZXJ0aWVzKTsKICAgIH0pOwogIH0KICBzdGF0aWMgYnVpbGRGb250UGF0aHMoZm9udCwgZ2x5cGhzLCBoYW5kbGVyLCBldmFsdWF0b3JPcHRpb25zKSB7CiAgICBmdW5jdGlvbiBidWlsZFBhdGgoZm9udENoYXIpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gYCR7Zm9udC5sb2FkZWROYW1lfV9wYXRoXyR7Zm9udENoYXJ9YDsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoZm9udC5yZW5kZXJlci5oYXNCdWlsdFBhdGgoZm9udENoYXIpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW2dseXBoTmFtZSwgIkZvbnRQYXRoIiwgZm9udC5yZW5kZXJlci5nZXRQYXRoSnMoZm9udENoYXIpXSk7CiAgICAgIH0gY2F0Y2ggKHJlYXNvbikgewogICAgICAgIGlmIChldmFsdWF0b3JPcHRpb25zLmlnbm9yZUVycm9ycykgewogICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBidWlsZEZvbnRQYXRocyAtIGlnbm9yaW5nICR7Z2x5cGhOYW1lfSBnbHlwaDogIiR7cmVhc29ufSIuYCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRocm93IHJlYXNvbjsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHsKICAgICAgYnVpbGRQYXRoKGdseXBoLmZvbnRDaGFyKTsKICAgICAgY29uc3QgYWNjZW50ID0gZ2x5cGguYWNjZW50OwogICAgICBpZiAoYWNjZW50Py5mb250Q2hhcikgewogICAgICAgIGJ1aWxkUGF0aChhY2NlbnQuZm9udENoYXIpOwogICAgICB9CiAgICB9CiAgfQogIHN0YXRpYyBnZXQgZmFsbGJhY2tGb250RGljdCgpIHsKICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCgpOwogICAgZGljdC5zZXQoIkJhc2VGb250IiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkhlbHZldGljYSIpKTsKICAgIGRpY3Quc2V0KCJUeXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZhbGxiYWNrVHlwZSIpKTsKICAgIGRpY3Quc2V0KCJFbmNvZGluZyIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJXaW5BbnNpRW5jb2RpbmciKSk7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImZhbGxiYWNrRm9udERpY3QiLCBkaWN0KTsKICB9Cn0KZXhwb3J0cy5QYXJ0aWFsRXZhbHVhdG9yID0gUGFydGlhbEV2YWx1YXRvcjsKY2xhc3MgVHJhbnNsYXRlZEZvbnQgewogIGNvbnN0cnVjdG9yKHsKICAgIGxvYWRlZE5hbWUsCiAgICBmb250LAogICAgZGljdCwKICAgIGV2YWx1YXRvck9wdGlvbnMKICB9KSB7CiAgICB0aGlzLmxvYWRlZE5hbWUgPSBsb2FkZWROYW1lOwogICAgdGhpcy5mb250ID0gZm9udDsKICAgIHRoaXMuZGljdCA9IGRpY3Q7CiAgICB0aGlzLl9ldmFsdWF0b3JPcHRpb25zID0gZXZhbHVhdG9yT3B0aW9ucyB8fCBEZWZhdWx0UGFydGlhbEV2YWx1YXRvck9wdGlvbnM7CiAgICB0aGlzLnR5cGUzTG9hZGVkID0gbnVsbDsKICAgIHRoaXMudHlwZTNEZXBlbmRlbmNpZXMgPSBmb250LmlzVHlwZTNGb250ID8gbmV3IFNldCgpIDogbnVsbDsKICAgIHRoaXMuc2VudCA9IGZhbHNlOwogIH0KICBzZW5kKGhhbmRsZXIpIHsKICAgIGlmICh0aGlzLnNlbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5zZW50ID0gdHJ1ZTsKICAgIGhhbmRsZXIuc2VuZCgiY29tbW9ub2JqIiwgW3RoaXMubG9hZGVkTmFtZSwgIkZvbnQiLCB0aGlzLmZvbnQuZXhwb3J0RGF0YSh0aGlzLl9ldmFsdWF0b3JPcHRpb25zLmZvbnRFeHRyYVByb3BlcnRpZXMpXSk7CiAgfQogIGZhbGxiYWNrKGhhbmRsZXIpIHsKICAgIGlmICghdGhpcy5mb250LmRhdGEpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5mb250LmRpc2FibGVGb250RmFjZSA9IHRydWU7CiAgICBQYXJ0aWFsRXZhbHVhdG9yLmJ1aWxkRm9udFBhdGhzKHRoaXMuZm9udCwgdGhpcy5mb250LmdseXBoQ2FjaGVWYWx1ZXMsIGhhbmRsZXIsIHRoaXMuX2V2YWx1YXRvck9wdGlvbnMpOwogIH0KICBsb2FkVHlwZTNEYXRhKGV2YWx1YXRvciwgcmVzb3VyY2VzLCB0YXNrKSB7CiAgICBpZiAodGhpcy50eXBlM0xvYWRlZCkgewogICAgICByZXR1cm4gdGhpcy50eXBlM0xvYWRlZDsKICAgIH0KICAgIGlmICghdGhpcy5mb250LmlzVHlwZTNGb250KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhIFR5cGUzIGZvbnQuIik7CiAgICB9CiAgICBjb25zdCB0eXBlM0V2YWx1YXRvciA9IGV2YWx1YXRvci5jbG9uZSh7CiAgICAgIGlnbm9yZUVycm9yczogZmFsc2UKICAgIH0pOwogICAgdHlwZTNFdmFsdWF0b3IucGFyc2luZ1R5cGUzRm9udCA9IHRydWU7CiAgICBjb25zdCB0eXBlM0ZvbnRSZWZzID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldChldmFsdWF0b3IudHlwZTNGb250UmVmcyk7CiAgICBpZiAodGhpcy5kaWN0Lm9iaklkICYmICF0eXBlM0ZvbnRSZWZzLmhhcyh0aGlzLmRpY3Qub2JqSWQpKSB7CiAgICAgIHR5cGUzRm9udFJlZnMucHV0KHRoaXMuZGljdC5vYmpJZCk7CiAgICB9CiAgICB0eXBlM0V2YWx1YXRvci50eXBlM0ZvbnRSZWZzID0gdHlwZTNGb250UmVmczsKICAgIGNvbnN0IHRyYW5zbGF0ZWRGb250ID0gdGhpcy5mb250LAogICAgICB0eXBlM0RlcGVuZGVuY2llcyA9IHRoaXMudHlwZTNEZXBlbmRlbmNpZXM7CiAgICBsZXQgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgIGNvbnN0IGNoYXJQcm9jcyA9IHRoaXMuZGljdC5nZXQoIkNoYXJQcm9jcyIpOwogICAgY29uc3QgZm9udFJlc291cmNlcyA9IHRoaXMuZGljdC5nZXQoIlJlc291cmNlcyIpIHx8IHJlc291cmNlczsKICAgIGNvbnN0IGNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGNvbnN0IGZvbnRCQm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KHRyYW5zbGF0ZWRGb250LmJib3ggfHwgWzAsIDAsIDAsIDBdKSwKICAgICAgd2lkdGggPSBmb250QkJveFsyXSAtIGZvbnRCQm94WzBdLAogICAgICBoZWlnaHQgPSBmb250QkJveFszXSAtIGZvbnRCQm94WzFdOwogICAgY29uc3QgZm9udEJCb3hTaXplID0gTWF0aC5oeXBvdCh3aWR0aCwgaGVpZ2h0KTsKICAgIGZvciAoY29uc3Qga2V5IG9mIGNoYXJQcm9jcy5nZXRLZXlzKCkpIHsKICAgICAgbG9hZENoYXJQcm9jc1Byb21pc2UgPSBsb2FkQ2hhclByb2NzUHJvbWlzZS50aGVuKCgpID0+IHsKICAgICAgICBjb25zdCBnbHlwaFN0cmVhbSA9IGNoYXJQcm9jcy5nZXQoa2V5KTsKICAgICAgICBjb25zdCBvcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CiAgICAgICAgcmV0dXJuIHR5cGUzRXZhbHVhdG9yLmdldE9wZXJhdG9yTGlzdCh7CiAgICAgICAgICBzdHJlYW06IGdseXBoU3RyZWFtLAogICAgICAgICAgdGFzaywKICAgICAgICAgIHJlc291cmNlczogZm9udFJlc291cmNlcywKICAgICAgICAgIG9wZXJhdG9yTGlzdAogICAgICAgIH0pLnRoZW4oKCkgPT4gewogICAgICAgICAgaWYgKG9wZXJhdG9yTGlzdC5mbkFycmF5WzBdID09PSBfdXRpbC5PUFMuc2V0Q2hhcldpZHRoQW5kQm91bmRzKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92ZVR5cGUzQ29sb3JPcGVyYXRvcnMob3BlcmF0b3JMaXN0LCBmb250QkJveFNpemUpOwogICAgICAgICAgfQogICAgICAgICAgY2hhclByb2NPcGVyYXRvckxpc3Rba2V5XSA9IG9wZXJhdG9yTGlzdC5nZXRJUigpOwogICAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9wZXJhdG9yTGlzdC5kZXBlbmRlbmNpZXMpIHsKICAgICAgICAgICAgdHlwZTNEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgICAgICAgfQogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVHlwZTMgZm9udCByZXNvdXJjZSAiJHtrZXl9IiBpcyBub3QgYXZhaWxhYmxlLmApOwogICAgICAgICAgY29uc3QgZHVtbXlPcGVyYXRvckxpc3QgPSBuZXcgX29wZXJhdG9yX2xpc3QuT3BlcmF0b3JMaXN0KCk7CiAgICAgICAgICBjaGFyUHJvY09wZXJhdG9yTGlzdFtrZXldID0gZHVtbXlPcGVyYXRvckxpc3QuZ2V0SVIoKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgICB0aGlzLnR5cGUzTG9hZGVkID0gbG9hZENoYXJQcm9jc1Byb21pc2UudGhlbigoKSA9PiB7CiAgICAgIHRyYW5zbGF0ZWRGb250LmNoYXJQcm9jT3BlcmF0b3JMaXN0ID0gY2hhclByb2NPcGVyYXRvckxpc3Q7CiAgICAgIGlmICh0aGlzLl9iYm94KSB7CiAgICAgICAgdHJhbnNsYXRlZEZvbnQuaXNDaGFyQkJveCA9IHRydWU7CiAgICAgICAgdHJhbnNsYXRlZEZvbnQuYmJveCA9IHRoaXMuX2Jib3g7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRoaXMudHlwZTNMb2FkZWQ7CiAgfQogIF9yZW1vdmVUeXBlM0NvbG9yT3BlcmF0b3JzKG9wZXJhdG9yTGlzdCwgZm9udEJCb3hTaXplID0gTmFOKSB7CiAgICBjb25zdCBjaGFyQkJveCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChvcGVyYXRvckxpc3QuYXJnc0FycmF5WzBdLnNsaWNlKDIpKSwKICAgICAgd2lkdGggPSBjaGFyQkJveFsyXSAtIGNoYXJCQm94WzBdLAogICAgICBoZWlnaHQgPSBjaGFyQkJveFszXSAtIGNoYXJCQm94WzFdOwogICAgY29uc3QgY2hhckJCb3hTaXplID0gTWF0aC5oeXBvdCh3aWR0aCwgaGVpZ2h0KTsKICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHsKICAgICAgb3BlcmF0b3JMaXN0LmZuQXJyYXkuc3BsaWNlKDAsIDEpOwogICAgICBvcGVyYXRvckxpc3QuYXJnc0FycmF5LnNwbGljZSgwLCAxKTsKICAgIH0gZWxzZSBpZiAoZm9udEJCb3hTaXplID09PSAwIHx8IE1hdGgucm91bmQoY2hhckJCb3hTaXplIC8gZm9udEJCb3hTaXplKSA+PSAxMCkgewogICAgICBpZiAoIXRoaXMuX2Jib3gpIHsKICAgICAgICB0aGlzLl9iYm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldOwogICAgICB9CiAgICAgIHRoaXMuX2Jib3hbMF0gPSBNYXRoLm1pbih0aGlzLl9iYm94WzBdLCBjaGFyQkJveFswXSk7CiAgICAgIHRoaXMuX2Jib3hbMV0gPSBNYXRoLm1pbih0aGlzLl9iYm94WzFdLCBjaGFyQkJveFsxXSk7CiAgICAgIHRoaXMuX2Jib3hbMl0gPSBNYXRoLm1heCh0aGlzLl9iYm94WzJdLCBjaGFyQkJveFsyXSk7CiAgICAgIHRoaXMuX2Jib3hbM10gPSBNYXRoLm1heCh0aGlzLl9iYm94WzNdLCBjaGFyQkJveFszXSk7CiAgICB9CiAgICBsZXQgaSA9IDAsCiAgICAgIGlpID0gb3BlcmF0b3JMaXN0Lmxlbmd0aDsKICAgIHdoaWxlIChpIDwgaWkpIHsKICAgICAgc3dpdGNoIChvcGVyYXRvckxpc3QuZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kczoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2U6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbENvbG9yU3BhY2U6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3I6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOOgogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvcjoKICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOOgogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUdyYXk6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbEdyYXk6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yOgogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFN0cm9rZUNNWUtDb2xvcjoKICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ01ZS0NvbG9yOgogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNoYWRpbmdGaWxsOgogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFJlbmRlcmluZ0ludGVudDoKICAgICAgICAgIG9wZXJhdG9yTGlzdC5mbkFycmF5LnNwbGljZShpLCAxKTsKICAgICAgICAgIG9wZXJhdG9yTGlzdC5hcmdzQXJyYXkuc3BsaWNlKGksIDEpOwogICAgICAgICAgaWktLTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEdTdGF0ZToKICAgICAgICAgIGNvbnN0IFtnU3RhdGVPYmpdID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheVtpXTsKICAgICAgICAgIGxldCBqID0gMCwKICAgICAgICAgICAgamogPSBnU3RhdGVPYmoubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKGogPCBqaikgewogICAgICAgICAgICBjb25zdCBbZ1N0YXRlS2V5XSA9IGdTdGF0ZU9ialtqXTsKICAgICAgICAgICAgc3dpdGNoIChnU3RhdGVLZXkpIHsKICAgICAgICAgICAgICBjYXNlICJUUiI6CiAgICAgICAgICAgICAgY2FzZSAiVFIyIjoKICAgICAgICAgICAgICBjYXNlICJIVCI6CiAgICAgICAgICAgICAgY2FzZSAiQkciOgogICAgICAgICAgICAgIGNhc2UgIkJHMiI6CiAgICAgICAgICAgICAgY2FzZSAiVUNSIjoKICAgICAgICAgICAgICBjYXNlICJVQ1IyIjoKICAgICAgICAgICAgICAgIGdTdGF0ZU9iai5zcGxpY2UoaiwgMSk7CiAgICAgICAgICAgICAgICBqai0tOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaisrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaSsrOwogICAgfQogIH0KfQpjbGFzcyBTdGF0ZU1hbmFnZXIgewogIGNvbnN0cnVjdG9yKGluaXRpYWxTdGF0ZSA9IG5ldyBFdmFsU3RhdGUoKSkgewogICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTsKICAgIHRoaXMuc3RhdGVTdGFjayA9IFtdOwogIH0KICBzYXZlKCkgewogICAgY29uc3Qgb2xkID0gdGhpcy5zdGF0ZTsKICAgIHRoaXMuc3RhdGVTdGFjay5wdXNoKHRoaXMuc3RhdGUpOwogICAgdGhpcy5zdGF0ZSA9IG9sZC5jbG9uZSgpOwogIH0KICByZXN0b3JlKCkgewogICAgY29uc3QgcHJldiA9IHRoaXMuc3RhdGVTdGFjay5wb3AoKTsKICAgIGlmIChwcmV2KSB7CiAgICAgIHRoaXMuc3RhdGUgPSBwcmV2OwogICAgfQogIH0KICB0cmFuc2Zvcm0oYXJncykgewogICAgdGhpcy5zdGF0ZS5jdG0gPSBfdXRpbC5VdGlsLnRyYW5zZm9ybSh0aGlzLnN0YXRlLmN0bSwgYXJncyk7CiAgfQp9CmNsYXNzIFRleHRTdGF0ZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmN0bSA9IG5ldyBGbG9hdDMyQXJyYXkoX3V0aWwuSURFTlRJVFlfTUFUUklYKTsKICAgIHRoaXMuZm9udE5hbWUgPSBudWxsOwogICAgdGhpcy5mb250U2l6ZSA9IDA7CiAgICB0aGlzLmxvYWRlZE5hbWUgPSBudWxsOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOwogICAgdGhpcy50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICB0aGlzLnRleHRMaW5lTWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYLnNsaWNlKCk7CiAgICB0aGlzLmNoYXJTcGFjaW5nID0gMDsKICAgIHRoaXMud29yZFNwYWNpbmcgPSAwOwogICAgdGhpcy5sZWFkaW5nID0gMDsKICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7CiAgICB0aGlzLnRleHRSaXNlID0gMDsKICB9CiAgc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICBjb25zdCBtID0gdGhpcy50ZXh0TWF0cml4OwogICAgbVswXSA9IGE7CiAgICBtWzFdID0gYjsKICAgIG1bMl0gPSBjOwogICAgbVszXSA9IGQ7CiAgICBtWzRdID0gZTsKICAgIG1bNV0gPSBmOwogIH0KICBzZXRUZXh0TGluZU1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICBjb25zdCBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDsKICAgIG1bMF0gPSBhOwogICAgbVsxXSA9IGI7CiAgICBtWzJdID0gYzsKICAgIG1bM10gPSBkOwogICAgbVs0XSA9IGU7CiAgICBtWzVdID0gZjsKICB9CiAgdHJhbnNsYXRlVGV4dE1hdHJpeCh4LCB5KSB7CiAgICBjb25zdCBtID0gdGhpcy50ZXh0TWF0cml4OwogICAgbVs0XSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdOwogICAgbVs1XSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdOwogIH0KICB0cmFuc2xhdGVUZXh0TGluZU1hdHJpeCh4LCB5KSB7CiAgICBjb25zdCBtID0gdGhpcy50ZXh0TGluZU1hdHJpeDsKICAgIG1bNF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTsKICAgIG1bNV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTsKICB9CiAgY2FycmlhZ2VSZXR1cm4oKSB7CiAgICB0aGlzLnRyYW5zbGF0ZVRleHRMaW5lTWF0cml4KDAsIC10aGlzLmxlYWRpbmcpOwogICAgdGhpcy50ZXh0TWF0cml4ID0gdGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpOwogIH0KICBjbG9uZSgpIHsKICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKICAgIGNsb25lLnRleHRNYXRyaXggPSB0aGlzLnRleHRNYXRyaXguc2xpY2UoKTsKICAgIGNsb25lLnRleHRMaW5lTWF0cml4ID0gdGhpcy50ZXh0TGluZU1hdHJpeC5zbGljZSgpOwogICAgY2xvbmUuZm9udE1hdHJpeCA9IHRoaXMuZm9udE1hdHJpeC5zbGljZSgpOwogICAgcmV0dXJuIGNsb25lOwogIH0KfQpjbGFzcyBFdmFsU3RhdGUgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5jdG0gPSBuZXcgRmxvYXQzMkFycmF5KF91dGlsLklERU5USVRZX01BVFJJWCk7CiAgICB0aGlzLmZvbnQgPSBudWxsOwogICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7CiAgICB0aGlzLmZpbGxDb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5zaW5nbGV0b25zLmdyYXk7CiAgICB0aGlzLnN0cm9rZUNvbG9yU3BhY2UgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMuZ3JheTsKICB9CiAgY2xvbmUoKSB7CiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSh0aGlzKTsKICB9Cn0KY2xhc3MgRXZhbHVhdG9yUHJlcHJvY2Vzc29yIHsKICBzdGF0aWMgZ2V0IG9wTWFwKCkgewogICAgY29uc3QgZ2V0T1BNYXAgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogICAgICB0LncgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMaW5lV2lkdGgsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuSiA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldExpbmVDYXAsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuaiA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldExpbmVKb2luLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0Lk0gPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRNaXRlckxpbWl0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LmQgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXREYXNoLAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LnJpID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0UmVuZGVyaW5nSW50ZW50LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LmkgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGbGF0bmVzcywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5ncyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldEdTdGF0ZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5xID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2F2ZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5RID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMucmVzdG9yZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5jbSA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnRyYW5zZm9ybSwKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5tID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMubW92ZVRvLAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LmwgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5saW5lVG8sCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuYyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmN1cnZlVG8sCiAgICAgICAgbnVtQXJnczogNiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQudiA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmN1cnZlVG8yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LnkgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5jdXJ2ZVRvMywKICAgICAgICBudW1BcmdzOiA0LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5oID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuY2xvc2VQYXRoLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LnJlID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMucmVjdGFuZ2xlLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LlMgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQucyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmNsb3NlU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LmYgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LkYgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0WyJmKiJdID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuZW9GaWxsLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LkIgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5maWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0WyJCKiJdID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuZW9GaWxsU3Ryb2tlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LmIgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZUZpbGxTdHJva2UsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHRbImIqIl0gPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5jbG9zZUVPRmlsbFN0cm9rZSwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5uID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuZW5kUGF0aCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5XID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuY2xpcCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdFsiVyoiXSA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmVvQ2xpcCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5CVCA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luVGV4dCwKICAgICAgICBudW1BcmdzOiAwLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5FVCA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmVuZFRleHQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuVGMgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5UdyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldFdvcmRTcGFjaW5nLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LlR6ID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0SFNjYWxlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LlRMID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0TGVhZGluZywKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5UZiA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZvbnQsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuVHIgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5UcyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldFRleHRSaXNlLAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LlRkID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMubW92ZVRleHQsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuVEQgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRMZWFkaW5nTW92ZVRleHQsCiAgICAgICAgbnVtQXJnczogMiwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuVG0gPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRUZXh0TWF0cml4LAogICAgICAgIG51bUFyZ3M6IDYsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0WyJUKiJdID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMubmV4dExpbmUsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuVGogPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5USiA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNob3dTcGFjZWRUZXh0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0WyInIl0gPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5uZXh0TGluZVNob3dUZXh0LAogICAgICAgIG51bUFyZ3M6IDEsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0WyciJ10gPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5uZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dCwKICAgICAgICBudW1BcmdzOiAzLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5kMCA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldENoYXJXaWR0aCwKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5kMSA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldENoYXJXaWR0aEFuZEJvdW5kcywKICAgICAgICBudW1BcmdzOiA2LAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5DUyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yU3BhY2UsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuY3MgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ29sb3JTcGFjZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5TQyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldFN0cm9rZUNvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH07CiAgICAgIHQuU0NOID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOLAogICAgICAgIG51bUFyZ3M6IDMzLAogICAgICAgIHZhcmlhYmxlQXJnczogdHJ1ZQogICAgICB9OwogICAgICB0LnNjID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiB0cnVlCiAgICAgIH07CiAgICAgIHQuc2NuID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbENvbG9yTiwKICAgICAgICBudW1BcmdzOiAzMywKICAgICAgICB2YXJpYWJsZUFyZ3M6IHRydWUKICAgICAgfTsKICAgICAgdC5HID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlR3JheSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5nID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0RmlsbEdyYXksCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuUkcgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvciwKICAgICAgICBudW1BcmdzOiAzLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5yZyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvciwKICAgICAgICBudW1BcmdzOiAzLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5LID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2V0U3Ryb2tlQ01ZS0NvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LmsgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5zZXRGaWxsQ01ZS0NvbG9yLAogICAgICAgIG51bUFyZ3M6IDQsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LnNoID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuc2hhZGluZ0ZpbGwsCiAgICAgICAgbnVtQXJnczogMSwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuQkkgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbklubGluZUltYWdlLAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LklEID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5JbWFnZURhdGEsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuRUkgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRJbmxpbmVJbWFnZSwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5EbyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLnBhaW50WE9iamVjdCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5NUCA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLm1hcmtQb2ludCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5EUCA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLm1hcmtQb2ludFByb3BzLAogICAgICAgIG51bUFyZ3M6IDIsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LkJNQyA9IHsKICAgICAgICBpZDogX3V0aWwuT1BTLmJlZ2luTWFya2VkQ29udGVudCwKICAgICAgICBudW1BcmdzOiAxLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5CREMgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywKICAgICAgICBudW1BcmdzOiAyLAogICAgICAgIHZhcmlhYmxlQXJnczogZmFsc2UKICAgICAgfTsKICAgICAgdC5FTUMgPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRNYXJrZWRDb250ZW50LAogICAgICAgIG51bUFyZ3M6IDAsCiAgICAgICAgdmFyaWFibGVBcmdzOiBmYWxzZQogICAgICB9OwogICAgICB0LkJYID0gewogICAgICAgIGlkOiBfdXRpbC5PUFMuYmVnaW5Db21wYXQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuRVggPSB7CiAgICAgICAgaWQ6IF91dGlsLk9QUy5lbmRDb21wYXQsCiAgICAgICAgbnVtQXJnczogMCwKICAgICAgICB2YXJpYWJsZUFyZ3M6IGZhbHNlCiAgICAgIH07CiAgICAgIHQuQk0gPSBudWxsOwogICAgICB0LkJEID0gbnVsbDsKICAgICAgdC50cnVlID0gbnVsbDsKICAgICAgdC5mYSA9IG51bGw7CiAgICAgIHQuZmFsID0gbnVsbDsKICAgICAgdC5mYWxzID0gbnVsbDsKICAgICAgdC5mYWxzZSA9IG51bGw7CiAgICAgIHQubnUgPSBudWxsOwogICAgICB0Lm51bCA9IG51bGw7CiAgICAgIHQubnVsbCA9IG51bGw7CiAgICB9KTsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3BNYXAiLCBnZXRPUE1hcCgpKTsKICB9CiAgc3RhdGljIE1BWF9JTlZBTElEX1BBVEhfT1BTID0gMTA7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCB4cmVmLCBzdGF0ZU1hbmFnZXIgPSBuZXcgU3RhdGVNYW5hZ2VyKCkpIHsKICAgIHRoaXMucGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSwgRXZhbHVhdG9yUHJlcHJvY2Vzc29yLm9wTWFwKSwKICAgICAgeHJlZgogICAgfSk7CiAgICB0aGlzLnN0YXRlTWFuYWdlciA9IHN0YXRlTWFuYWdlcjsKICAgIHRoaXMubm9uUHJvY2Vzc2VkQXJncyA9IFtdOwogICAgdGhpcy5faXNQYXRoT3AgPSBmYWxzZTsKICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKICB9CiAgZ2V0IHNhdmVkU3RhdGVzRGVwdGgoKSB7CiAgICByZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuc3RhdGVTdGFjay5sZW5ndGg7CiAgfQogIHJlYWQob3BlcmF0aW9uKSB7CiAgICBsZXQgYXJncyA9IG9wZXJhdGlvbi5hcmdzOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5wYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQpIHsKICAgICAgICBjb25zdCBjbWQgPSBvYmouY21kOwogICAgICAgIGNvbnN0IG9wU3BlYyA9IEV2YWx1YXRvclByZXByb2Nlc3Nvci5vcE1hcFtjbWRdOwogICAgICAgIGlmICghb3BTcGVjKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFVua25vd24gY29tbWFuZCAiJHtjbWR9Ii5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBmbiA9IG9wU3BlYy5pZDsKICAgICAgICBjb25zdCBudW1BcmdzID0gb3BTcGVjLm51bUFyZ3M7CiAgICAgICAgbGV0IGFyZ3NMZW5ndGggPSBhcmdzICE9PSBudWxsID8gYXJncy5sZW5ndGggOiAwOwogICAgICAgIGlmICghdGhpcy5faXNQYXRoT3ApIHsKICAgICAgICAgIHRoaXMuX251bUludmFsaWRQYXRoT1BTID0gMDsKICAgICAgICB9CiAgICAgICAgdGhpcy5faXNQYXRoT3AgPSBmbiA+PSBfdXRpbC5PUFMubW92ZVRvICYmIGZuIDw9IF91dGlsLk9QUy5lbmRQYXRoOwogICAgICAgIGlmICghb3BTcGVjLnZhcmlhYmxlQXJncykgewogICAgICAgICAgaWYgKGFyZ3NMZW5ndGggIT09IG51bUFyZ3MpIHsKICAgICAgICAgICAgY29uc3Qgbm9uUHJvY2Vzc2VkQXJncyA9IHRoaXMubm9uUHJvY2Vzc2VkQXJnczsKICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGggPiBudW1BcmdzKSB7CiAgICAgICAgICAgICAgbm9uUHJvY2Vzc2VkQXJncy5wdXNoKGFyZ3Muc2hpZnQoKSk7CiAgICAgICAgICAgICAgYXJnc0xlbmd0aC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoIDwgbnVtQXJncyAmJiBub25Qcm9jZXNzZWRBcmdzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFyZ3MudW5zaGlmdChub25Qcm9jZXNzZWRBcmdzLnBvcCgpKTsKICAgICAgICAgICAgICBhcmdzTGVuZ3RoKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhcmdzTGVuZ3RoIDwgbnVtQXJncykgewogICAgICAgICAgICBjb25zdCBwYXJ0aWFsTXNnID0gYGNvbW1hbmQgJHtjbWR9OiBleHBlY3RlZCAke251bUFyZ3N9IGFyZ3MsIGAgKyBgYnV0IHJlY2VpdmVkICR7YXJnc0xlbmd0aH0gYXJncy5gOwogICAgICAgICAgICBpZiAodGhpcy5faXNQYXRoT3AgJiYgKyt0aGlzLl9udW1JbnZhbGlkUGF0aE9QUyA+IEV2YWx1YXRvclByZXByb2Nlc3Nvci5NQVhfSU5WQUxJRF9QQVRIX09QUykgewogICAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCAke3BhcnRpYWxNc2d9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBTa2lwcGluZyAke3BhcnRpYWxNc2d9YCk7CiAgICAgICAgICAgIGlmIChhcmdzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgYXJncy5sZW5ndGggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoYXJnc0xlbmd0aCA+IG51bUFyZ3MpIHsKICAgICAgICAgICgwLCBfdXRpbC5pbmZvKShgQ29tbWFuZCAke2NtZH06IGV4cGVjdGVkIFswLCAke251bUFyZ3N9XSBhcmdzLCBgICsgYGJ1dCByZWNlaXZlZCAke2FyZ3NMZW5ndGh9IGFyZ3MuYCk7CiAgICAgICAgfQogICAgICAgIHRoaXMucHJlcHJvY2Vzc0NvbW1hbmQoZm4sIGFyZ3MpOwogICAgICAgIG9wZXJhdGlvbi5mbiA9IGZuOwogICAgICAgIG9wZXJhdGlvbi5hcmdzID0gYXJnczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob2JqID09PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKG9iaiAhPT0gbnVsbCkgewogICAgICAgIGlmIChhcmdzID09PSBudWxsKSB7CiAgICAgICAgICBhcmdzID0gW107CiAgICAgICAgfQogICAgICAgIGFyZ3MucHVzaChvYmopOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDMzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBwcmVwcm9jZXNzQ29tbWFuZChmbiwgYXJncykgewogICAgc3dpdGNoIChmbiB8IDApIHsKICAgICAgY2FzZSBfdXRpbC5PUFMuc2F2ZToKICAgICAgICB0aGlzLnN0YXRlTWFuYWdlci5zYXZlKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgX3V0aWwuT1BTLnJlc3RvcmU6CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIucmVzdG9yZSgpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIF91dGlsLk9QUy50cmFuc2Zvcm06CiAgICAgICAgdGhpcy5zdGF0ZU1hbmFnZXIudHJhbnNmb3JtKGFyZ3MpOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KfQpleHBvcnRzLkV2YWx1YXRvclByZXByb2Nlc3NvciA9IEV2YWx1YXRvclByZXByb2Nlc3NvcjsKCi8qKiovIH0pLAovKiAxNCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLklkZW50aXR5Q01hcCA9IGV4cG9ydHMuQ01hcEZhY3RvcnkgPSBleHBvcnRzLkNNYXAgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfYmFzZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOwp2YXIgX2JpbmFyeV9jbWFwID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7CnZhciBfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKY29uc3QgQlVJTFRfSU5fQ01BUFMgPSBbIkFkb2JlLUdCMS1VQ1MyIiwgIkFkb2JlLUNOUzEtVUNTMiIsICJBZG9iZS1KYXBhbjEtVUNTMiIsICJBZG9iZS1Lb3JlYTEtVUNTMiIsICI3OC1FVUMtSCIsICI3OC1FVUMtViIsICI3OC1IIiwgIjc4LVJLU0otSCIsICI3OC1SS1NKLVYiLCAiNzgtViIsICI3OG1zLVJLU0otSCIsICI3OG1zLVJLU0otViIsICI4M3B2LVJLU0otSCIsICI5MG1zLVJLU0otSCIsICI5MG1zLVJLU0otViIsICI5MG1zcC1SS1NKLUgiLCAiOTBtc3AtUktTSi1WIiwgIjkwcHYtUktTSi1IIiwgIjkwcHYtUktTSi1WIiwgIkFkZC1IIiwgIkFkZC1SS1NKLUgiLCAiQWRkLVJLU0otViIsICJBZGQtViIsICJBZG9iZS1DTlMxLTAiLCAiQWRvYmUtQ05TMS0xIiwgIkFkb2JlLUNOUzEtMiIsICJBZG9iZS1DTlMxLTMiLCAiQWRvYmUtQ05TMS00IiwgIkFkb2JlLUNOUzEtNSIsICJBZG9iZS1DTlMxLTYiLCAiQWRvYmUtR0IxLTAiLCAiQWRvYmUtR0IxLTEiLCAiQWRvYmUtR0IxLTIiLCAiQWRvYmUtR0IxLTMiLCAiQWRvYmUtR0IxLTQiLCAiQWRvYmUtR0IxLTUiLCAiQWRvYmUtSmFwYW4xLTAiLCAiQWRvYmUtSmFwYW4xLTEiLCAiQWRvYmUtSmFwYW4xLTIiLCAiQWRvYmUtSmFwYW4xLTMiLCAiQWRvYmUtSmFwYW4xLTQiLCAiQWRvYmUtSmFwYW4xLTUiLCAiQWRvYmUtSmFwYW4xLTYiLCAiQWRvYmUtS29yZWExLTAiLCAiQWRvYmUtS29yZWExLTEiLCAiQWRvYmUtS29yZWExLTIiLCAiQjUtSCIsICJCNS1WIiwgIkI1cGMtSCIsICJCNXBjLVYiLCAiQ05TLUVVQy1IIiwgIkNOUy1FVUMtViIsICJDTlMxLUgiLCAiQ05TMS1WIiwgIkNOUzItSCIsICJDTlMyLVYiLCAiRVRISy1CNS1IIiwgIkVUSEstQjUtViIsICJFVGVuLUI1LUgiLCAiRVRlbi1CNS1WIiwgIkVUZW5tcy1CNS1IIiwgIkVUZW5tcy1CNS1WIiwgIkVVQy1IIiwgIkVVQy1WIiwgIkV4dC1IIiwgIkV4dC1SS1NKLUgiLCAiRXh0LVJLU0otViIsICJFeHQtViIsICJHQi1FVUMtSCIsICJHQi1FVUMtViIsICJHQi1IIiwgIkdCLVYiLCAiR0JLLUVVQy1IIiwgIkdCSy1FVUMtViIsICJHQksySy1IIiwgIkdCSzJLLVYiLCAiR0JLcC1FVUMtSCIsICJHQktwLUVVQy1WIiwgIkdCVC1FVUMtSCIsICJHQlQtRVVDLVYiLCAiR0JULUgiLCAiR0JULVYiLCAiR0JUcGMtRVVDLUgiLCAiR0JUcGMtRVVDLVYiLCAiR0JwYy1FVUMtSCIsICJHQnBjLUVVQy1WIiwgIkgiLCAiSEtkbGEtQjUtSCIsICJIS2RsYS1CNS1WIiwgIkhLZGxiLUI1LUgiLCAiSEtkbGItQjUtViIsICJIS2djY3MtQjUtSCIsICJIS2djY3MtQjUtViIsICJIS20zMTQtQjUtSCIsICJIS20zMTQtQjUtViIsICJIS200NzEtQjUtSCIsICJIS200NzEtQjUtViIsICJIS3Njcy1CNS1IIiwgIkhLc2NzLUI1LVYiLCAiSGFua2FrdSIsICJIaXJhZ2FuYSIsICJLU0MtRVVDLUgiLCAiS1NDLUVVQy1WIiwgIktTQy1IIiwgIktTQy1Kb2hhYi1IIiwgIktTQy1Kb2hhYi1WIiwgIktTQy1WIiwgIktTQ21zLVVIQy1IIiwgIktTQ21zLVVIQy1IVy1IIiwgIktTQ21zLVVIQy1IVy1WIiwgIktTQ21zLVVIQy1WIiwgIktTQ3BjLUVVQy1IIiwgIktTQ3BjLUVVQy1WIiwgIkthdGFrYW5hIiwgIk5XUC1IIiwgIk5XUC1WIiwgIlJLU0otSCIsICJSS1NKLVYiLCAiUm9tYW4iLCAiVW5pQ05TLVVDUzItSCIsICJVbmlDTlMtVUNTMi1WIiwgIlVuaUNOUy1VVEYxNi1IIiwgIlVuaUNOUy1VVEYxNi1WIiwgIlVuaUNOUy1VVEYzMi1IIiwgIlVuaUNOUy1VVEYzMi1WIiwgIlVuaUNOUy1VVEY4LUgiLCAiVW5pQ05TLVVURjgtViIsICJVbmlHQi1VQ1MyLUgiLCAiVW5pR0ItVUNTMi1WIiwgIlVuaUdCLVVURjE2LUgiLCAiVW5pR0ItVVRGMTYtViIsICJVbmlHQi1VVEYzMi1IIiwgIlVuaUdCLVVURjMyLVYiLCAiVW5pR0ItVVRGOC1IIiwgIlVuaUdCLVVURjgtViIsICJVbmlKSVMtVUNTMi1IIiwgIlVuaUpJUy1VQ1MyLUhXLUgiLCAiVW5pSklTLVVDUzItSFctViIsICJVbmlKSVMtVUNTMi1WIiwgIlVuaUpJUy1VVEYxNi1IIiwgIlVuaUpJUy1VVEYxNi1WIiwgIlVuaUpJUy1VVEYzMi1IIiwgIlVuaUpJUy1VVEYzMi1WIiwgIlVuaUpJUy1VVEY4LUgiLCAiVW5pSklTLVVURjgtViIsICJVbmlKSVMyMDA0LVVURjE2LUgiLCAiVW5pSklTMjAwNC1VVEYxNi1WIiwgIlVuaUpJUzIwMDQtVVRGMzItSCIsICJVbmlKSVMyMDA0LVVURjMyLVYiLCAiVW5pSklTMjAwNC1VVEY4LUgiLCAiVW5pSklTMjAwNC1VVEY4LVYiLCAiVW5pSklTUHJvLVVDUzItSFctViIsICJVbmlKSVNQcm8tVUNTMi1WIiwgIlVuaUpJU1Byby1VVEY4LVYiLCAiVW5pSklTWDAyMTMtVVRGMzItSCIsICJVbmlKSVNYMDIxMy1VVEYzMi1WIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1IIiwgIlVuaUpJU1gwMjEzMjAwNC1VVEYzMi1WIiwgIlVuaUtTLVVDUzItSCIsICJVbmlLUy1VQ1MyLVYiLCAiVW5pS1MtVVRGMTYtSCIsICJVbmlLUy1VVEYxNi1WIiwgIlVuaUtTLVVURjMyLUgiLCAiVW5pS1MtVVRGMzItViIsICJVbmlLUy1VVEY4LUgiLCAiVW5pS1MtVVRGOC1WIiwgIlYiLCAiV1AtU3ltYm9sIl07CmNvbnN0IE1BWF9NQVBfUkFOR0UgPSAyICoqIDI0IC0gMTsKY2xhc3MgQ01hcCB7CiAgY29uc3RydWN0b3IoYnVpbHRJbkNNYXAgPSBmYWxzZSkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXMgPSBbW10sIFtdLCBbXSwgW11dOwogICAgdGhpcy5udW1Db2Rlc3BhY2VSYW5nZXMgPSAwOwogICAgdGhpcy5fbWFwID0gW107CiAgICB0aGlzLm5hbWUgPSAiIjsKICAgIHRoaXMudmVydGljYWwgPSBmYWxzZTsKICAgIHRoaXMudXNlQ01hcCA9IG51bGw7CiAgICB0aGlzLmJ1aWx0SW5DTWFwID0gYnVpbHRJbkNNYXA7CiAgfQogIGFkZENvZGVzcGFjZVJhbmdlKG4sIGxvdywgaGlnaCkgewogICAgdGhpcy5jb2Rlc3BhY2VSYW5nZXNbbiAtIDFdLnB1c2gobG93LCBoaWdoKTsKICAgIHRoaXMubnVtQ29kZXNwYWNlUmFuZ2VzKys7CiAgfQogIG1hcENpZFJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CiAgICBpZiAoaGlnaCAtIGxvdyA+IE1BWF9NQVBfUkFOR0UpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXBDaWRSYW5nZSAtIGlnbm9yaW5nIGRhdGEgYWJvdmUgTUFYX01BUF9SQU5HRS4iKTsKICAgIH0KICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewogICAgICB0aGlzLl9tYXBbbG93KytdID0gZHN0TG93Kys7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2UgLSBpZ25vcmluZyBkYXRhIGFib3ZlIE1BWF9NQVBfUkFOR0UuIik7CiAgICB9CiAgICBjb25zdCBsYXN0Qnl0ZSA9IGRzdExvdy5sZW5ndGggLSAxOwogICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgIHRoaXMuX21hcFtsb3crK10gPSBkc3RMb3c7CiAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGRzdExvdy5jaGFyQ29kZUF0KGxhc3RCeXRlKSArIDE7CiAgICAgIGlmIChuZXh0Q2hhckNvZGUgPiAweGZmKSB7CiAgICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSAtIDEpICsgU3RyaW5nLmZyb21DaGFyQ29kZShkc3RMb3cuY2hhckNvZGVBdChsYXN0Qnl0ZSAtIDEpICsgMSkgKyAiXHgwMCI7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZHN0TG93ID0gZHN0TG93LnN1YnN0cmluZygwLCBsYXN0Qnl0ZSkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyQ29kZSk7CiAgICB9CiAgfQogIG1hcEJmUmFuZ2VUb0FycmF5KGxvdywgaGlnaCwgYXJyYXkpIHsKICAgIGlmIChoaWdoIC0gbG93ID4gTUFYX01BUF9SQU5HRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIm1hcEJmUmFuZ2VUb0FycmF5IC0gaWdub3JpbmcgZGF0YSBhYm92ZSBNQVhfTUFQX1JBTkdFLiIpOwogICAgfQogICAgY29uc3QgaWkgPSBhcnJheS5sZW5ndGg7CiAgICBsZXQgaSA9IDA7CiAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaSA8IGlpKSB7CiAgICAgIHRoaXMuX21hcFtsb3ddID0gYXJyYXlbaSsrXTsKICAgICAgKytsb3c7CiAgICB9CiAgfQogIG1hcE9uZShzcmMsIGRzdCkgewogICAgdGhpcy5fbWFwW3NyY10gPSBkc3Q7CiAgfQogIGxvb2t1cChjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdOwogIH0KICBjb250YWlucyhjb2RlKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2NvZGVdICE9PSB1bmRlZmluZWQ7CiAgfQogIGZvckVhY2goY2FsbGJhY2spIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGNvbnN0IGxlbmd0aCA9IG1hcC5sZW5ndGg7CiAgICBpZiAobGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGlmIChtYXBbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY2FsbGJhY2soaSwgbWFwW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgaSBpbiBtYXApIHsKICAgICAgICBjYWxsYmFjayhpLCBtYXBbaV0pOwogICAgICB9CiAgICB9CiAgfQogIGNoYXJDb2RlT2YodmFsdWUpIHsKICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDsKICAgIGlmIChtYXAubGVuZ3RoIDw9IDB4MTAwMDApIHsKICAgICAgcmV0dXJuIG1hcC5pbmRleE9mKHZhbHVlKTsKICAgIH0KICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gbWFwKSB7CiAgICAgIGlmIChtYXBbY2hhckNvZGVdID09PSB2YWx1ZSkgewogICAgICAgIHJldHVybiBjaGFyQ29kZSB8IDA7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKICB9CiAgZ2V0TWFwKCkgewogICAgcmV0dXJuIHRoaXMuX21hcDsKICB9CiAgcmVhZENoYXJDb2RlKHN0ciwgb2Zmc2V0LCBvdXQpIHsKICAgIGxldCBjID0gMDsKICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlcyA9IHRoaXMuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgbiA9IDAsIG5uID0gY29kZXNwYWNlUmFuZ2VzLmxlbmd0aDsgbiA8IG5uOyBuKyspIHsKICAgICAgYyA9IChjIDw8IDggfCBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyBuKSkgPj4+IDA7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjID49IGxvdyAmJiBjIDw9IGhpZ2gpIHsKICAgICAgICAgIG91dC5jaGFyY29kZSA9IGM7CiAgICAgICAgICBvdXQubGVuZ3RoID0gbiArIDE7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBvdXQuY2hhcmNvZGUgPSAwOwogICAgb3V0Lmxlbmd0aCA9IDE7CiAgfQogIGdldENoYXJDb2RlTGVuZ3RoKGNoYXJDb2RlKSB7CiAgICBjb25zdCBjb2Rlc3BhY2VSYW5nZXMgPSB0aGlzLmNvZGVzcGFjZVJhbmdlczsKICAgIGZvciAobGV0IG4gPSAwLCBubiA9IGNvZGVzcGFjZVJhbmdlcy5sZW5ndGg7IG4gPCBubjsgbisrKSB7CiAgICAgIGNvbnN0IGNvZGVzcGFjZVJhbmdlID0gY29kZXNwYWNlUmFuZ2VzW25dOwogICAgICBmb3IgKGxldCBrID0gMCwga2sgPSBjb2Rlc3BhY2VSYW5nZS5sZW5ndGg7IGsgPCBrazspIHsKICAgICAgICBjb25zdCBsb3cgPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGNvbnN0IGhpZ2ggPSBjb2Rlc3BhY2VSYW5nZVtrKytdOwogICAgICAgIGlmIChjaGFyQ29kZSA+PSBsb3cgJiYgY2hhckNvZGUgPD0gaGlnaCkgewogICAgICAgICAgcmV0dXJuIG4gKyAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZ2V0IGlzSWRlbnRpdHlDTWFwKCkgewogICAgaWYgKCEodGhpcy5uYW1lID09PSAiSWRlbnRpdHktSCIgfHwgdGhpcy5uYW1lID09PSAiSWRlbnRpdHktViIpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICh0aGlzLl9tYXAubGVuZ3RoICE9PSAweDEwMDAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMHgxMDAwMDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLl9tYXBbaV0gIT09IGkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpleHBvcnRzLkNNYXAgPSBDTWFwOwpjbGFzcyBJZGVudGl0eUNNYXAgZXh0ZW5kcyBDTWFwIHsKICBjb25zdHJ1Y3Rvcih2ZXJ0aWNhbCwgbikgewogICAgc3VwZXIoKTsKICAgIHRoaXMudmVydGljYWwgPSB2ZXJ0aWNhbDsKICAgIHRoaXMuYWRkQ29kZXNwYWNlUmFuZ2UobiwgMCwgMHhmZmZmKTsKICB9CiAgbWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgY2FsbCBtYXBDaWRSYW5nZSIpOwogIH0KICBtYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZSIpOwogIH0KICBtYXBCZlJhbmdlVG9BcnJheShsb3csIGhpZ2gsIGFycmF5KSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQmZSYW5nZVRvQXJyYXkiKTsKICB9CiAgbWFwT25lKHNyYywgZHN0KSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJzaG91bGQgbm90IGNhbGwgbWFwQ2lkT25lIik7CiAgfQogIGxvb2t1cChjb2RlKSB7CiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihjb2RlKSAmJiBjb2RlIDw9IDB4ZmZmZiA/IGNvZGUgOiB1bmRlZmluZWQ7CiAgfQogIGNvbnRhaW5zKGNvZGUpIHsKICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKGNvZGUpICYmIGNvZGUgPD0gMHhmZmZmOwogIH0KICBmb3JFYWNoKGNhbGxiYWNrKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAweGZmZmY7IGkrKykgewogICAgICBjYWxsYmFjayhpLCBpKTsKICAgIH0KICB9CiAgY2hhckNvZGVPZih2YWx1ZSkgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlIDw9IDB4ZmZmZiA/IHZhbHVlIDogLTE7CiAgfQogIGdldE1hcCgpIHsKICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheSgweDEwMDAwKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKSB7CiAgICAgIG1hcFtpXSA9IGk7CiAgICB9CiAgICByZXR1cm4gbWFwOwogIH0KICBnZXQgbGVuZ3RoKCkgewogICAgcmV0dXJuIDB4MTAwMDA7CiAgfQogIGdldCBpc0lkZW50aXR5Q01hcCgpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoInNob3VsZCBub3QgYWNjZXNzIC5pc0lkZW50aXR5Q01hcCIpOwogIH0KfQpleHBvcnRzLklkZW50aXR5Q01hcCA9IElkZW50aXR5Q01hcDsKZnVuY3Rpb24gc3RyVG9JbnQoc3RyKSB7CiAgbGV0IGEgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICBhID0gYSA8PCA4IHwgc3RyLmNoYXJDb2RlQXQoaSk7CiAgfQogIHJldHVybiBhID4+PiAwOwp9CmZ1bmN0aW9uIGV4cGVjdFN0cmluZyhvYmopIHsKICBpZiAodHlwZW9mIG9iaiAhPT0gInN0cmluZyIpIHsKICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWFsZm9ybWVkIENNYXA6IGV4cGVjdGVkIHN0cmluZy4iKTsKICB9Cn0KZnVuY3Rpb24gZXhwZWN0SW50KG9iaikgewogIGlmICghTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk1hbGZvcm1lZCBDTWFwOiBleHBlY3RlZCBpbnQuIik7CiAgfQp9CmZ1bmN0aW9uIHBhcnNlQmZDaGFyKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IF9wcmltaXRpdmVzLkVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGJmY2hhciIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGV4cGVjdFN0cmluZyhvYmopOwogICAgY29uc3Qgc3JjID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBkc3QgPSBvYmo7CiAgICBjTWFwLm1hcE9uZShzcmMsIGRzdCk7CiAgfQp9CmZ1bmN0aW9uIHBhcnNlQmZSYW5nZShjTWFwLCBsZXhlcikgewogIHdoaWxlICh0cnVlKSB7CiAgICBsZXQgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAob2JqID09PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJlbmRiZnJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopIHx8IHR5cGVvZiBvYmogPT09ICJzdHJpbmciKSB7CiAgICAgIGNvbnN0IGRzdExvdyA9IE51bWJlci5pc0ludGVnZXIob2JqKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUob2JqKSA6IG9iajsKICAgICAgY01hcC5tYXBCZlJhbmdlKGxvdywgaGlnaCwgZHN0TG93KTsKICAgIH0gZWxzZSBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJbIikpIHsKICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgIHdoaWxlICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJdIikgJiYgb2JqICE9PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgICBhcnJheS5wdXNoKG9iaik7CiAgICAgICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICAgIH0KICAgICAgY01hcC5tYXBCZlJhbmdlVG9BcnJheShsb3csIGhpZ2gsIGFycmF5KTsKICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgYmYgcmFuZ2UuIik7Cn0KZnVuY3Rpb24gcGFyc2VDaWRDaGFyKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IF9wcmltaXRpdmVzLkVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNpZGNoYXIiKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IHNyYyA9IHN0clRvSW50KG9iaik7CiAgICBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGV4cGVjdEludChvYmopOwogICAgY29uc3QgZHN0ID0gb2JqOwogICAgY01hcC5tYXBPbmUoc3JjLCBkc3QpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNpZFJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IF9wcmltaXRpdmVzLkVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNpZHJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZXhwZWN0U3RyaW5nKG9iaik7CiAgICBjb25zdCBsb3cgPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RTdHJpbmcob2JqKTsKICAgIGNvbnN0IGhpZ2ggPSBzdHJUb0ludChvYmopOwogICAgb2JqID0gbGV4ZXIuZ2V0T2JqKCk7CiAgICBleHBlY3RJbnQob2JqKTsKICAgIGNvbnN0IGRzdExvdyA9IG9iajsKICAgIGNNYXAubWFwQ2lkUmFuZ2UobG93LCBoaWdoLCBkc3RMb3cpOwogIH0KfQpmdW5jdGlvbiBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKSB7CiAgd2hpbGUgKHRydWUpIHsKICAgIGxldCBvYmogPSBsZXhlci5nZXRPYmooKTsKICAgIGlmIChvYmogPT09IF9wcmltaXRpdmVzLkVPRikgewogICAgICBicmVhazsKICAgIH0KICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKG9iaiwgImVuZGNvZGVzcGFjZXJhbmdlIikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHR5cGVvZiBvYmogIT09ICJzdHJpbmciKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgY29uc3QgbG93ID0gc3RyVG9JbnQob2JqKTsKICAgIG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgaWYgKHR5cGVvZiBvYmogIT09ICJzdHJpbmciKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgY29uc3QgaGlnaCA9IHN0clRvSW50KG9iaik7CiAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKG9iai5sZW5ndGgsIGxvdywgaGlnaCk7CiAgfQogIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBjb2Rlc3BhY2UgcmFuZ2UuIik7Cn0KZnVuY3Rpb24gcGFyc2VXTW9kZShjTWFwLCBsZXhlcikgewogIGNvbnN0IG9iaiA9IGxleGVyLmdldE9iaigpOwogIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikpIHsKICAgIGNNYXAudmVydGljYWwgPSAhIW9iajsKICB9Cn0KZnVuY3Rpb24gcGFyc2VDTWFwTmFtZShjTWFwLCBsZXhlcikgewogIGNvbnN0IG9iaiA9IGxleGVyLmdldE9iaigpOwogIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICBjTWFwLm5hbWUgPSBvYmoubmFtZTsKICB9Cn0KYXN5bmMgZnVuY3Rpb24gcGFyc2VDTWFwKGNNYXAsIGxleGVyLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CiAgbGV0IHByZXZpb3VzLCBlbWJlZGRlZFVzZUNNYXA7CiAgb2JqTG9vcDogd2hpbGUgKHRydWUpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IG9iaiA9IGxleGVyLmdldE9iaigpOwogICAgICBpZiAob2JqID09PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgaWYgKG9iai5uYW1lID09PSAiV01vZGUiKSB7CiAgICAgICAgICBwYXJzZVdNb2RlKGNNYXAsIGxleGVyKTsKICAgICAgICB9IGVsc2UgaWYgKG9iai5uYW1lID09PSAiQ01hcE5hbWUiKSB7CiAgICAgICAgICBwYXJzZUNNYXBOYW1lKGNNYXAsIGxleGVyKTsKICAgICAgICB9CiAgICAgICAgcHJldmlvdXMgPSBvYmo7CiAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CiAgICAgICAgc3dpdGNoIChvYmouY21kKSB7CiAgICAgICAgICBjYXNlICJlbmRjbWFwIjoKICAgICAgICAgICAgYnJlYWsgb2JqTG9vcDsKICAgICAgICAgIGNhc2UgInVzZWNtYXAiOgogICAgICAgICAgICBpZiAocHJldmlvdXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgICAgZW1iZWRkZWRVc2VDTWFwID0gcHJldmlvdXMubmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luY29kZXNwYWNlcmFuZ2UiOgogICAgICAgICAgICBwYXJzZUNvZGVzcGFjZVJhbmdlKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmJmY2hhciI6CiAgICAgICAgICAgIHBhcnNlQmZDaGFyKGNNYXAsIGxleGVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJiZWdpbmNpZGNoYXIiOgogICAgICAgICAgICBwYXJzZUNpZENoYXIoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgImJlZ2luYmZyYW5nZSI6CiAgICAgICAgICAgIHBhcnNlQmZSYW5nZShjTWFwLCBsZXhlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYmVnaW5jaWRyYW5nZSI6CiAgICAgICAgICAgIHBhcnNlQ2lkUmFuZ2UoY01hcCwgbGV4ZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIGNNYXAgZGF0YTogIiArIGV4KTsKICAgICAgY29udGludWU7CiAgICB9CiAgfQogIGlmICghdXNlQ01hcCAmJiBlbWJlZGRlZFVzZUNNYXApIHsKICAgIHVzZUNNYXAgPSBlbWJlZGRlZFVzZUNNYXA7CiAgfQogIGlmICh1c2VDTWFwKSB7CiAgICByZXR1cm4gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKICB9CiAgcmV0dXJuIGNNYXA7Cn0KYXN5bmMgZnVuY3Rpb24gZXh0ZW5kQ01hcChjTWFwLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKSB7CiAgY01hcC51c2VDTWFwID0gYXdhaXQgY3JlYXRlQnVpbHRJbkNNYXAodXNlQ01hcCwgZmV0Y2hCdWlsdEluQ01hcCk7CiAgaWYgKGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID09PSAwKSB7CiAgICBjb25zdCB1c2VDb2Rlc3BhY2VSYW5nZXMgPSBjTWFwLnVzZUNNYXAuY29kZXNwYWNlUmFuZ2VzOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VDb2Rlc3BhY2VSYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY01hcC5jb2Rlc3BhY2VSYW5nZXNbaV0gPSB1c2VDb2Rlc3BhY2VSYW5nZXNbaV0uc2xpY2UoKTsKICAgIH0KICAgIGNNYXAubnVtQ29kZXNwYWNlUmFuZ2VzID0gY01hcC51c2VDTWFwLm51bUNvZGVzcGFjZVJhbmdlczsKICB9CiAgY01hcC51c2VDTWFwLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgIGlmICghY01hcC5jb250YWlucyhrZXkpKSB7CiAgICAgIGNNYXAubWFwT25lKGtleSwgY01hcC51c2VDTWFwLmxvb2t1cChrZXkpKTsKICAgIH0KICB9KTsKICByZXR1cm4gY01hcDsKfQphc3luYyBmdW5jdGlvbiBjcmVhdGVCdWlsdEluQ01hcChuYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKSB7CiAgaWYgKG5hbWUgPT09ICJJZGVudGl0eS1IIikgewogICAgcmV0dXJuIG5ldyBJZGVudGl0eUNNYXAoZmFsc2UsIDIpOwogIH0gZWxzZSBpZiAobmFtZSA9PT0gIklkZW50aXR5LVYiKSB7CiAgICByZXR1cm4gbmV3IElkZW50aXR5Q01hcCh0cnVlLCAyKTsKICB9CiAgaWYgKCFCVUlMVF9JTl9DTUFQUy5pbmNsdWRlcyhuYW1lKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIENNYXAgbmFtZTogIiArIG5hbWUpOwogIH0KICBpZiAoIWZldGNoQnVpbHRJbkNNYXApIHsKICAgIHRocm93IG5ldyBFcnJvcigiQnVpbHQtaW4gQ01hcCBwYXJhbWV0ZXJzIGFyZSBub3QgcHJvdmlkZWQuIik7CiAgfQogIGNvbnN0IHsKICAgIGNNYXBEYXRhLAogICAgY29tcHJlc3Npb25UeXBlCiAgfSA9IGF3YWl0IGZldGNoQnVpbHRJbkNNYXAobmFtZSk7CiAgY29uc3QgY01hcCA9IG5ldyBDTWFwKHRydWUpOwogIGlmIChjb21wcmVzc2lvblR5cGUgPT09IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZKSB7CiAgICByZXR1cm4gbmV3IF9iaW5hcnlfY21hcC5CaW5hcnlDTWFwUmVhZGVyKCkucHJvY2VzcyhjTWFwRGF0YSwgY01hcCwgdXNlQ01hcCA9PiB7CiAgICAgIHJldHVybiBleHRlbmRDTWFwKGNNYXAsIGZldGNoQnVpbHRJbkNNYXAsIHVzZUNNYXApOwogICAgfSk7CiAgfQogIGlmIChjb21wcmVzc2lvblR5cGUgPT09IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuTk9ORSkgewogICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BhcnNlci5MZXhlcihuZXcgX3N0cmVhbS5TdHJlYW0oY01hcERhdGEpKTsKICAgIHJldHVybiBwYXJzZUNNYXAoY01hcCwgbGV4ZXIsIGZldGNoQnVpbHRJbkNNYXAsIG51bGwpOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgQ01hcCAiY29tcHJlc3Npb25UeXBlIiB2YWx1ZTogJHtjb21wcmVzc2lvblR5cGV9YCk7Cn0KY2xhc3MgQ01hcEZhY3RvcnkgewogIHN0YXRpYyBhc3luYyBjcmVhdGUoewogICAgZW5jb2RpbmcsCiAgICBmZXRjaEJ1aWx0SW5DTWFwLAogICAgdXNlQ01hcAogIH0pIHsKICAgIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgcmV0dXJuIGNyZWF0ZUJ1aWx0SW5DTWFwKGVuY29kaW5nLm5hbWUsIGZldGNoQnVpbHRJbkNNYXApOwogICAgfSBlbHNlIGlmIChlbmNvZGluZyBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgIGNvbnN0IHBhcnNlZENNYXAgPSBhd2FpdCBwYXJzZUNNYXAobmV3IENNYXAoKSwgbmV3IF9wYXJzZXIuTGV4ZXIoZW5jb2RpbmcpLCBmZXRjaEJ1aWx0SW5DTWFwLCB1c2VDTWFwKTsKICAgICAgaWYgKHBhcnNlZENNYXAuaXNJZGVudGl0eUNNYXApIHsKICAgICAgICByZXR1cm4gY3JlYXRlQnVpbHRJbkNNYXAocGFyc2VkQ01hcC5uYW1lLCBmZXRjaEJ1aWx0SW5DTWFwKTsKICAgICAgfQogICAgICByZXR1cm4gcGFyc2VkQ01hcDsKICAgIH0KICAgIHRocm93IG5ldyBFcnJvcigiRW5jb2RpbmcgcmVxdWlyZWQuIik7CiAgfQp9CmV4cG9ydHMuQ01hcEZhY3RvcnkgPSBDTWFwRmFjdG9yeTsKCi8qKiovIH0pLAovKiAxNSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkJpbmFyeUNNYXBSZWFkZXIgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmZ1bmN0aW9uIGhleFRvSW50KGEsIHNpemUpIHsKICBsZXQgbiA9IDA7CiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7CiAgICBuID0gbiA8PCA4IHwgYVtpXTsKICB9CiAgcmV0dXJuIG4gPj4+IDA7Cn0KZnVuY3Rpb24gaGV4VG9TdHIoYSwgc2l6ZSkgewogIGlmIChzaXplID09PSAxKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhWzBdLCBhWzFdKTsKICB9CiAgaWYgKHNpemUgPT09IDMpIHsKICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pOwogIH0KICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5hLnN1YmFycmF5KDAsIHNpemUgKyAxKSk7Cn0KZnVuY3Rpb24gYWRkSGV4KGEsIGIsIHNpemUpIHsKICBsZXQgYyA9IDA7CiAgZm9yIChsZXQgaSA9IHNpemU7IGkgPj0gMDsgaS0tKSB7CiAgICBjICs9IGFbaV0gKyBiW2ldOwogICAgYVtpXSA9IGMgJiAyNTU7CiAgICBjID4+PSA4OwogIH0KfQpmdW5jdGlvbiBpbmNIZXgoYSwgc2l6ZSkgewogIGxldCBjID0gMTsKICBmb3IgKGxldCBpID0gc2l6ZTsgaSA+PSAwICYmIGMgPiAwOyBpLS0pIHsKICAgIGMgKz0gYVtpXTsKICAgIGFbaV0gPSBjICYgMjU1OwogICAgYyA+Pj0gODsKICB9Cn0KY29uc3QgTUFYX05VTV9TSVpFID0gMTY7CmNvbnN0IE1BWF9FTkNPREVEX05VTV9TSVpFID0gMTk7CmNsYXNzIEJpbmFyeUNNYXBTdHJlYW0gewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIHRoaXMuYnVmZmVyID0gZGF0YTsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuZW5kID0gZGF0YS5sZW5ndGg7CiAgICB0aGlzLnRtcEJ1ZiA9IG5ldyBVaW50OEFycmF5KE1BWF9FTkNPREVEX05VTV9TSVpFKTsKICB9CiAgcmVhZEJ5dGUoKSB7CiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5lbmQpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zKytdOwogIH0KICByZWFkTnVtYmVyKCkgewogICAgbGV0IG4gPSAwOwogICAgbGV0IGxhc3Q7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIG4gPSBuIDw8IDcgfCBiICYgMHg3ZjsKICAgIH0gd2hpbGUgKCFsYXN0KTsKICAgIHJldHVybiBuOwogIH0KICByZWFkU2lnbmVkKCkgewogICAgY29uc3QgbiA9IHRoaXMucmVhZE51bWJlcigpOwogICAgcmV0dXJuIG4gJiAxID8gfihuID4+PiAxKSA6IG4gPj4+IDE7CiAgfQogIHJlYWRIZXgobnVtLCBzaXplKSB7CiAgICBudW0uc2V0KHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zLCB0aGlzLnBvcyArIHNpemUgKyAxKSk7CiAgICB0aGlzLnBvcyArPSBzaXplICsgMTsKICB9CiAgcmVhZEhleE51bWJlcihudW0sIHNpemUpIHsKICAgIGxldCBsYXN0OwogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnRtcEJ1ZjsKICAgIGxldCBzcCA9IDA7CiAgICBkbyB7CiAgICAgIGNvbnN0IGIgPSB0aGlzLnJlYWRCeXRlKCk7CiAgICAgIGlmIChiIDwgMCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5leHBlY3RlZCBFT0YgaW4gYmNtYXAiKTsKICAgICAgfQogICAgICBsYXN0ID0gIShiICYgMHg4MCk7CiAgICAgIHN0YWNrW3NwKytdID0gYiAmIDB4N2Y7CiAgICB9IHdoaWxlICghbGFzdCk7CiAgICBsZXQgaSA9IHNpemUsCiAgICAgIGJ1ZmZlciA9IDAsCiAgICAgIGJ1ZmZlclNpemUgPSAwOwogICAgd2hpbGUgKGkgPj0gMCkgewogICAgICB3aGlsZSAoYnVmZmVyU2l6ZSA8IDggJiYgc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgIGJ1ZmZlciB8PSBzdGFja1stLXNwXSA8PCBidWZmZXJTaXplOwogICAgICAgIGJ1ZmZlclNpemUgKz0gNzsKICAgICAgfQogICAgICBudW1baV0gPSBidWZmZXIgJiAyNTU7CiAgICAgIGktLTsKICAgICAgYnVmZmVyID4+PSA4OwogICAgICBidWZmZXJTaXplIC09IDg7CiAgICB9CiAgfQogIHJlYWRIZXhTaWduZWQobnVtLCBzaXplKSB7CiAgICB0aGlzLnJlYWRIZXhOdW1iZXIobnVtLCBzaXplKTsKICAgIGNvbnN0IHNpZ24gPSBudW1bc2l6ZV0gJiAxID8gMjU1IDogMDsKICAgIGxldCBjID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykgewogICAgICBjID0gKGMgJiAxKSA8PCA4IHwgbnVtW2ldOwogICAgICBudW1baV0gPSBjID4+IDEgXiBzaWduOwogICAgfQogIH0KICByZWFkU3RyaW5nKCkgewogICAgY29uc3QgbGVuID0gdGhpcy5yZWFkTnVtYmVyKCksCiAgICAgIGJ1ZiA9IG5ldyBBcnJheShsZW4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBidWZbaV0gPSB0aGlzLnJlYWROdW1iZXIoKTsKICAgIH0KICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7CiAgfQp9CmNsYXNzIEJpbmFyeUNNYXBSZWFkZXIgewogIGFzeW5jIHByb2Nlc3MoZGF0YSwgY01hcCwgZXh0ZW5kKSB7CiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5Q01hcFN0cmVhbShkYXRhKTsKICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpOwogICAgY01hcC52ZXJ0aWNhbCA9ICEhKGhlYWRlciAmIDEpOwogICAgbGV0IHVzZUNNYXAgPSBudWxsOwogICAgY29uc3Qgc3RhcnQgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgZW5kID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGNvbnN0IGNoYXIgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgY2hhckNvZGUgPSBuZXcgVWludDhBcnJheShNQVhfTlVNX1NJWkUpOwogICAgY29uc3QgdG1wID0gbmV3IFVpbnQ4QXJyYXkoTUFYX05VTV9TSVpFKTsKICAgIGxldCBjb2RlOwogICAgbGV0IGI7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZEJ5dGUoKSkgPj0gMCkgewogICAgICBjb25zdCB0eXBlID0gYiA+PiA1OwogICAgICBpZiAodHlwZSA9PT0gNykgewogICAgICAgIHN3aXRjaCAoYiAmIDB4MWYpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgc3RyZWFtLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHVzZUNNYXAgPSBzdHJlYW0ucmVhZFN0cmluZygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgc2VxdWVuY2UgPSAhIShiICYgMHgxMCk7CiAgICAgIGNvbnN0IGRhdGFTaXplID0gYiAmIDE1OwogICAgICBpZiAoZGF0YVNpemUgKyAxID4gTUFYX05VTV9TSVpFKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3M6IEludmFsaWQgZGF0YVNpemUuIik7CiAgICAgIH0KICAgICAgY29uc3QgdWNzMkRhdGFTaXplID0gMTsKICAgICAgY29uc3Qgc3ViaXRlbXNDb3VudCA9IHN0cmVhbS5yZWFkTnVtYmVyKCk7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBjTWFwLmFkZENvZGVzcGFjZVJhbmdlKGRhdGFTaXplICsgMSwgaGV4VG9JbnQoc3RhcnQsIGRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCBkYXRhU2l6ZSkpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5hZGRDb2Rlc3BhY2VSYW5nZShkYXRhU2l6ZSArIDEsIGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdWJpdGVtc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgaW5jSGV4KGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgICAgc3RyZWFtLnJlYWROdW1iZXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChjaGFyLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcih0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29kZSA9IHN0cmVhbS5yZWFkU2lnbmVkKCkgKyAoY29kZSArIDEpOwogICAgICAgICAgICBjTWFwLm1hcE9uZShoZXhUb0ludChjaGFyLCBkYXRhU2l6ZSksIGNvZGUpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgZGF0YVNpemUpOwogICAgICAgICAgYWRkSGV4KGVuZCwgc3RhcnQsIGRhdGFTaXplKTsKICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgY01hcC5tYXBDaWRSYW5nZShoZXhUb0ludChzdGFydCwgZGF0YVNpemUpLCBoZXhUb0ludChlbmQsIGRhdGFTaXplKSwgY29kZSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgZGF0YVNpemUpOwogICAgICAgICAgICAgIGFkZEhleChzdGFydCwgZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RhcnQuc2V0KGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtLnJlYWRIZXhOdW1iZXIoZW5kLCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCBkYXRhU2l6ZSk7CiAgICAgICAgICAgIGNvZGUgPSBzdHJlYW0ucmVhZE51bWJlcigpOwogICAgICAgICAgICBjTWFwLm1hcENpZFJhbmdlKGhleFRvSW50KHN0YXJ0LCBkYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgZGF0YVNpemUpLCBjb2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4KGNoYXIsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN1Yml0ZW1zQ291bnQ7IGkrKykgewogICAgICAgICAgICBpbmNIZXgoY2hhciwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgaWYgKCFzZXF1ZW5jZSkgewogICAgICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKHRtcCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoY2hhciwgdG1wLCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluY0hleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleFNpZ25lZCh0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgYWRkSGV4KGNoYXJDb2RlLCB0bXAsIGRhdGFTaXplKTsKICAgICAgICAgICAgY01hcC5tYXBPbmUoaGV4VG9JbnQoY2hhciwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICBzdHJlYW0ucmVhZEhleChzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIHN0cmVhbS5yZWFkSGV4TnVtYmVyKGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgc3RyZWFtLnJlYWRIZXgoY2hhckNvZGUsIGRhdGFTaXplKTsKICAgICAgICAgIGNNYXAubWFwQmZSYW5nZShoZXhUb0ludChzdGFydCwgdWNzMkRhdGFTaXplKSwgaGV4VG9JbnQoZW5kLCB1Y3MyRGF0YVNpemUpLCBoZXhUb1N0cihjaGFyQ29kZSwgZGF0YVNpemUpKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3ViaXRlbXNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGluY0hleChlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGlmICghc2VxdWVuY2UpIHsKICAgICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihzdGFydCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgICBhZGRIZXgoc3RhcnQsIGVuZCwgdWNzMkRhdGFTaXplKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdGFydC5zZXQoZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ucmVhZEhleE51bWJlcihlbmQsIHVjczJEYXRhU2l6ZSk7CiAgICAgICAgICAgIGFkZEhleChlbmQsIHN0YXJ0LCB1Y3MyRGF0YVNpemUpOwogICAgICAgICAgICBzdHJlYW0ucmVhZEhleChjaGFyQ29kZSwgZGF0YVNpemUpOwogICAgICAgICAgICBjTWFwLm1hcEJmUmFuZ2UoaGV4VG9JbnQoc3RhcnQsIHVjczJEYXRhU2l6ZSksIGhleFRvSW50KGVuZCwgdWNzMkRhdGFTaXplKSwgaGV4VG9TdHIoY2hhckNvZGUsIGRhdGFTaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCaW5hcnlDTWFwUmVhZGVyLnByb2Nlc3MgLSB1bmtub3duIHR5cGU6ICR7dHlwZX1gKTsKICAgICAgfQogICAgfQogICAgaWYgKHVzZUNNYXApIHsKICAgICAgcmV0dXJuIGV4dGVuZCh1c2VDTWFwKTsKICAgIH0KICAgIHJldHVybiBjTWFwOwogIH0KfQpleHBvcnRzLkJpbmFyeUNNYXBSZWFkZXIgPSBCaW5hcnlDTWFwUmVhZGVyOwoKLyoqKi8gfSksCi8qIDE2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuUGFyc2VyID0gZXhwb3J0cy5MaW5lYXJpemF0aW9uID0gZXhwb3J0cy5MZXhlciA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKdmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOwp2YXIgX2FzY2lpXzg1X3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpOwp2YXIgX2FzY2lpX2hleF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTsKdmFyIF9jY2l0dF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIwKTsKdmFyIF9mbGF0ZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyKTsKdmFyIF9qYmlnMl9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIzKTsKdmFyIF9qcGVnX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjYpOwp2YXIgX2pweF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTsKdmFyIF9sendfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygzMSk7CnZhciBfcHJlZGljdG9yX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzIpOwp2YXIgX3J1bl9sZW5ndGhfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7CmNvbnN0IE1BWF9MRU5HVEhfVE9fQ0FDSEUgPSAxMDAwOwpmdW5jdGlvbiBnZXRJbmxpbmVJbWFnZUNhY2hlS2V5KGJ5dGVzKSB7CiAgY29uc3Qgc3RyQnVmID0gW10sCiAgICBpaSA9IGJ5dGVzLmxlbmd0aDsKICBsZXQgaSA9IDA7CiAgd2hpbGUgKGkgPCBpaSAtIDEpIHsKICAgIHN0ckJ1Zi5wdXNoKGJ5dGVzW2krK10gPDwgOCB8IGJ5dGVzW2krK10pOwogIH0KICBpZiAoaSA8IGlpKSB7CiAgICBzdHJCdWYucHVzaChieXRlc1tpXSk7CiAgfQogIHJldHVybiBpaSArICJfIiArIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgc3RyQnVmKTsKfQpjbGFzcyBQYXJzZXIgewogIGNvbnN0cnVjdG9yKHsKICAgIGxleGVyLAogICAgeHJlZiwKICAgIGFsbG93U3RyZWFtcyA9IGZhbHNlLAogICAgcmVjb3ZlcnlNb2RlID0gZmFsc2UKICB9KSB7CiAgICB0aGlzLmxleGVyID0gbGV4ZXI7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5hbGxvd1N0cmVhbXMgPSBhbGxvd1N0cmVhbXM7CiAgICB0aGlzLnJlY292ZXJ5TW9kZSA9IHJlY292ZXJ5TW9kZTsKICAgIHRoaXMuaW1hZ2VDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLl9pbWFnZUlkID0gMDsKICAgIHRoaXMucmVmaWxsKCk7CiAgfQogIHJlZmlsbCgpIHsKICAgIHRoaXMuYnVmMSA9IHRoaXMubGV4ZXIuZ2V0T2JqKCk7CiAgICB0aGlzLmJ1ZjIgPSB0aGlzLmxleGVyLmdldE9iaigpOwogIH0KICBzaGlmdCgpIHsKICAgIGlmICh0aGlzLmJ1ZjIgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5DbWQgJiYgdGhpcy5idWYyLmNtZCA9PT0gIklEIikgewogICAgICB0aGlzLmJ1ZjEgPSB0aGlzLmJ1ZjI7CiAgICAgIHRoaXMuYnVmMiA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmJ1ZjEgPSB0aGlzLmJ1ZjI7CiAgICAgIHRoaXMuYnVmMiA9IHRoaXMubGV4ZXIuZ2V0T2JqKCk7CiAgICB9CiAgfQogIHRyeVNoaWZ0KCkgewogICAgdHJ5IHsKICAgICAgdGhpcy5zaGlmdCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKGUgaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICBnZXRPYmooY2lwaGVyVHJhbnNmb3JtID0gbnVsbCkgewogICAgY29uc3QgYnVmMSA9IHRoaXMuYnVmMTsKICAgIHRoaXMuc2hpZnQoKTsKICAgIGlmIChidWYxIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CiAgICAgIHN3aXRjaCAoYnVmMS5jbWQpIHsKICAgICAgICBjYXNlICJCSSI6CiAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlSW5saW5lSW1hZ2UoY2lwaGVyVHJhbnNmb3JtKTsKICAgICAgICBjYXNlICJbIjoKICAgICAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgICAgICB3aGlsZSAoISgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYxLCAiXSIpICYmIHRoaXMuYnVmMSAhPT0gX3ByaW1pdGl2ZXMuRU9GKSB7CiAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5nZXRPYmooY2lwaGVyVHJhbnNmb3JtKSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5idWYxID09PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5QYXJzZXJFT0ZFeGNlcHRpb24oIkVuZCBvZiBmaWxlIGluc2lkZSBhcnJheS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICBjYXNlICI8PCI6CiAgICAgICAgICBjb25zdCBkaWN0ID0gbmV3IF9wcmltaXRpdmVzLkRpY3QodGhpcy54cmVmKTsKICAgICAgICAgIHdoaWxlICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKSh0aGlzLmJ1ZjEsICI+PiIpICYmIHRoaXMuYnVmMSAhPT0gX3ByaW1pdGl2ZXMuRU9GKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuYnVmMSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNYWxmb3JtZWQgZGljdGlvbmFyeToga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpOwogICAgICAgICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1ZjEubmFtZTsKICAgICAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgICAgICBpZiAodGhpcy5idWYxID09PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkaWN0LnNldChrZXksIHRoaXMuZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuYnVmMSA9PT0gX3ByaW1pdGl2ZXMuRU9GKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlY292ZXJ5TW9kZSkgewogICAgICAgICAgICAgIHJldHVybiBkaWN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5QYXJzZXJFT0ZFeGNlcHRpb24oIkVuZCBvZiBmaWxlIGluc2lkZSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYyLCAic3RyZWFtIikpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWxsb3dTdHJlYW1zID8gdGhpcy5tYWtlU3RyZWFtKGRpY3QsIGNpcGhlclRyYW5zZm9ybSkgOiBkaWN0OwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5zaGlmdCgpOwogICAgICAgICAgcmV0dXJuIGRpY3Q7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBidWYxOwogICAgICB9CiAgICB9CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihidWYxKSkgewogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLmJ1ZjEpICYmICgwLCBfcHJpbWl0aXZlcy5pc0NtZCkodGhpcy5idWYyLCAiUiIpKSB7CiAgICAgICAgY29uc3QgcmVmID0gX3ByaW1pdGl2ZXMuUmVmLmdldChidWYxLCB0aGlzLmJ1ZjEpOwogICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYnVmMSA9PT0gInN0cmluZyIpIHsKICAgICAgaWYgKGNpcGhlclRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBjaXBoZXJUcmFuc2Zvcm0uZGVjcnlwdFN0cmluZyhidWYxKTsKICAgICAgfQogICAgICByZXR1cm4gYnVmMTsKICAgIH0KICAgIHJldHVybiBidWYxOwogIH0KICBmaW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OSwKICAgICAgU1BBQ0UgPSAweDIwLAogICAgICBMRiA9IDB4YSwKICAgICAgQ1IgPSAweGQsCiAgICAgIE5VTCA9IDB4MDsKICAgIGNvbnN0IHsKICAgICAgICBrbm93bkNvbW1hbmRzCiAgICAgIH0gPSB0aGlzLmxleGVyLAogICAgICBzdGFydFBvcyA9IHN0cmVhbS5wb3MsCiAgICAgIG4gPSAxNTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoLAogICAgICBtYXliZUVJUG9zOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGNoID09PSBTUEFDRSB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSKSB7CiAgICAgICAgICBtYXliZUVJUG9zID0gc3RyZWFtLnBvczsKICAgICAgICAgIGNvbnN0IGZvbGxvd2luZ0J5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhuKTsKICAgICAgICAgIGNvbnN0IGlpID0gZm9sbG93aW5nQnl0ZXMubGVuZ3RoOwogICAgICAgICAgaWYgKGlpID09PSAwKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgICAgIGNoID0gZm9sbG93aW5nQnl0ZXNbaV07CiAgICAgICAgICAgIGlmIChjaCA9PT0gTlVMICYmIGZvbGxvd2luZ0J5dGVzW2kgKyAxXSAhPT0gTlVMKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoICE9PSBMRiAmJiBjaCAhPT0gQ1IgJiYgKGNoIDwgU1BBQ0UgfHwgY2ggPiAweDdmKSkgewogICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlICE9PSAyKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmRzKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQgLSBgbGV4ZXIua25vd25Db21tYW5kc2AgaXMgdW5kZWZpbmVkLiIpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHRtcExleGVyID0gbmV3IExleGVyKG5ldyBfc3RyZWFtLlN0cmVhbShmb2xsb3dpbmdCeXRlcy5zbGljZSgpKSwga25vd25Db21tYW5kcyk7CiAgICAgICAgICB0bXBMZXhlci5faGV4U3RyaW5nV2FybiA9ICgpID0+IHt9OwogICAgICAgICAgbGV0IG51bUFyZ3MgPSAwOwogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgY29uc3QgbmV4dE9iaiA9IHRtcExleGVyLmdldE9iaigpOwogICAgICAgICAgICBpZiAobmV4dE9iaiA9PT0gX3ByaW1pdGl2ZXMuRU9GKSB7CiAgICAgICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0T2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CiAgICAgICAgICAgICAgY29uc3Qga25vd25Db21tYW5kID0ga25vd25Db21tYW5kc1tuZXh0T2JqLmNtZF07CiAgICAgICAgICAgICAgaWYgKCFrbm93bkNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIHN0YXRlID0gMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoa25vd25Db21tYW5kLnZhcmlhYmxlQXJncyA/IG51bUFyZ3MgPD0ga25vd25Db21tYW5kLm51bUFyZ3MgOiBudW1BcmdzID09PSBrbm93bkNvbW1hbmQubnVtQXJncykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG51bUFyZ3MgPSAwOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG51bUFyZ3MrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMikgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAtMSkgewogICAgICAoMCwgX3V0aWwud2FybikoImZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kOiAiICsgIlJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgZmluZGluZyBhIHZhbGlkIEVJIG1hcmtlciIpOwogICAgICBpZiAobWF5YmVFSVBvcykgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgnLi4uIHRyeWluZyB0byByZWNvdmVyIGJ5IHVzaW5nIHRoZSBsYXN0ICJFSSIgb2NjdXJyZW5jZS4nKTsKICAgICAgICBzdHJlYW0uc2tpcCgtKHN0cmVhbS5wb3MgLSBtYXliZUVJUG9zKSk7CiAgICAgIH0KICAgIH0KICAgIGxldCBlbmRPZmZzZXQgPSA0OwogICAgc3RyZWFtLnNraXAoLWVuZE9mZnNldCk7CiAgICBjaCA9IHN0cmVhbS5wZWVrQnl0ZSgpOwogICAgc3RyZWFtLnNraXAoZW5kT2Zmc2V0KTsKICAgIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CiAgICAgIGVuZE9mZnNldC0tOwogICAgfQogICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBlbmRPZmZzZXQgLSBzdGFydFBvczsKICB9CiAgZmluZERDVERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBmb3VuZEVPSSA9IGZhbHNlLAogICAgICBiLAogICAgICBtYXJrZXJMZW5ndGg7CiAgICB3aGlsZSAoKGIgPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGIgIT09IDB4ZmYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKHN0cmVhbS5nZXRCeXRlKCkpIHsKICAgICAgICBjYXNlIDB4MDA6CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmY6CiAgICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZDk6CiAgICAgICAgICBmb3VuZEVPSSA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4YzA6CiAgICAgICAgY2FzZSAweGMxOgogICAgICAgIGNhc2UgMHhjMjoKICAgICAgICBjYXNlIDB4YzM6CiAgICAgICAgY2FzZSAweGM1OgogICAgICAgIGNhc2UgMHhjNjoKICAgICAgICBjYXNlIDB4Yzc6CiAgICAgICAgY2FzZSAweGM5OgogICAgICAgIGNhc2UgMHhjYToKICAgICAgICBjYXNlIDB4Y2I6CiAgICAgICAgY2FzZSAweGNkOgogICAgICAgIGNhc2UgMHhjZToKICAgICAgICBjYXNlIDB4Y2Y6CiAgICAgICAgY2FzZSAweGM0OgogICAgICAgIGNhc2UgMHhjYzoKICAgICAgICBjYXNlIDB4ZGE6CiAgICAgICAgY2FzZSAweGRiOgogICAgICAgIGNhc2UgMHhkYzoKICAgICAgICBjYXNlIDB4ZGQ6CiAgICAgICAgY2FzZSAweGRlOgogICAgICAgIGNhc2UgMHhkZjoKICAgICAgICBjYXNlIDB4ZTA6CiAgICAgICAgY2FzZSAweGUxOgogICAgICAgIGNhc2UgMHhlMjoKICAgICAgICBjYXNlIDB4ZTM6CiAgICAgICAgY2FzZSAweGU0OgogICAgICAgIGNhc2UgMHhlNToKICAgICAgICBjYXNlIDB4ZTY6CiAgICAgICAgY2FzZSAweGU3OgogICAgICAgIGNhc2UgMHhlODoKICAgICAgICBjYXNlIDB4ZTk6CiAgICAgICAgY2FzZSAweGVhOgogICAgICAgIGNhc2UgMHhlYjoKICAgICAgICBjYXNlIDB4ZWM6CiAgICAgICAgY2FzZSAweGVkOgogICAgICAgIGNhc2UgMHhlZToKICAgICAgICBjYXNlIDB4ZWY6CiAgICAgICAgY2FzZSAweGZlOgogICAgICAgICAgbWFya2VyTGVuZ3RoID0gc3RyZWFtLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKG1hcmtlckxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXAobWFya2VyTGVuZ3RoIC0gMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0uc2tpcCgtMik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoZm91bmRFT0kpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOwogICAgaWYgKGIgPT09IC0xKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKSgiSW5saW5lIERDVERlY29kZSBpbWFnZSBzdHJlYW06ICIgKyAiRU9JIG1hcmtlciBub3QgZm91bmQsIHNlYXJjaGluZyBmb3IgL0VJLyBpbnN0ZWFkLiIpOwogICAgICBzdHJlYW0uc2tpcCgtbGVuZ3RoKTsKICAgICAgcmV0dXJuIHRoaXMuZmluZERlZmF1bHRJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgIH0KICAgIHRoaXMuaW5saW5lU3RyZWFtU2tpcEVJKHN0cmVhbSk7CiAgICByZXR1cm4gbGVuZ3RoOwogIH0KICBmaW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IFRJTERFID0gMHg3ZSwKICAgICAgR1QgPSAweDNlOwogICAgY29uc3Qgc3RhcnRQb3MgPSBzdHJlYW0ucG9zOwogICAgbGV0IGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoY2ggPT09IFRJTERFKSB7CiAgICAgICAgY29uc3QgdGlsZGVQb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgd2hpbGUgKCgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSkgewogICAgICAgICAgc3RyZWFtLnNraXAoKTsKICAgICAgICAgIGNoID0gc3RyZWFtLnBlZWtCeXRlKCk7CiAgICAgICAgfQogICAgICAgIGlmIChjaCA9PT0gR1QpIHsKICAgICAgICAgIHN0cmVhbS5za2lwKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5wb3MgPiB0aWxkZVBvcykgewogICAgICAgICAgY29uc3QgbWF5YmVFSSA9IHN0cmVhbS5wZWVrQnl0ZXMoMik7CiAgICAgICAgICBpZiAobWF5YmVFSVswXSA9PT0gMHg0NSAmJiBtYXliZUVJWzFdID09PSAweDQ5KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0YXJ0UG9zOwogICAgaWYgKGNoID09PSAtMSkgewogICAgICAoMCwgX3V0aWwud2FybikoIklubGluZSBBU0NJSTg1RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CiAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGZpbmRBU0NJSUhleERlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pIHsKICAgIGNvbnN0IEdUID0gMHgzZTsKICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0uZ2V0Qnl0ZSgpKSAhPT0gLTEpIHsKICAgICAgaWYgKGNoID09PSBHVCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucG9zIC0gc3RhcnRQb3M7CiAgICBpZiAoY2ggPT09IC0xKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKSgiSW5saW5lIEFTQ0lJSGV4RGVjb2RlIGltYWdlIHN0cmVhbTogIiArICJFT0QgbWFya2VyIG5vdCBmb3VuZCwgc2VhcmNoaW5nIGZvciAvRUkvIGluc3RlYWQuIik7CiAgICAgIHN0cmVhbS5za2lwKC1sZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5maW5kRGVmYXVsdElubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgfQogICAgdGhpcy5pbmxpbmVTdHJlYW1Ta2lwRUkoc3RyZWFtKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQogIGlubGluZVN0cmVhbVNraXBFSShzdHJlYW0pIHsKICAgIGNvbnN0IEUgPSAweDQ1LAogICAgICBJID0gMHg0OTsKICAgIGxldCBzdGF0ZSA9IDAsCiAgICAgIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoc3RhdGUgPT09IDApIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBFID8gMSA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDEpIHsKICAgICAgICBzdGF0ZSA9IGNoID09PSBJID8gMiA6IDA7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IDIpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICBtYWtlSW5saW5lSW1hZ2UoY2lwaGVyVHJhbnNmb3JtKSB7CiAgICBjb25zdCBsZXhlciA9IHRoaXMubGV4ZXI7CiAgICBjb25zdCBzdHJlYW0gPSBsZXhlci5zdHJlYW07CiAgICBjb25zdCBkaWN0TWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGxldCBkaWN0TGVuZ3RoOwogICAgd2hpbGUgKCEoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKHRoaXMuYnVmMSwgIklEIikgJiYgdGhpcy5idWYxICE9PSBfcHJpbWl0aXZlcy5FT0YpIHsKICAgICAgaWYgKCEodGhpcy5idWYxIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkRpY3Rpb25hcnkga2V5IG11c3QgYmUgYSBuYW1lIG9iamVjdCIpOwogICAgICB9CiAgICAgIGNvbnN0IGtleSA9IHRoaXMuYnVmMS5uYW1lOwogICAgICB0aGlzLnNoaWZ0KCk7CiAgICAgIGlmICh0aGlzLmJ1ZjEgPT09IF9wcmltaXRpdmVzLkVPRikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRpY3RNYXBba2V5XSA9IHRoaXMuZ2V0T2JqKGNpcGhlclRyYW5zZm9ybSk7CiAgICB9CiAgICBpZiAobGV4ZXIuYmVnaW5JbmxpbmVJbWFnZVBvcyAhPT0gLTEpIHsKICAgICAgZGljdExlbmd0aCA9IHN0cmVhbS5wb3MgLSBsZXhlci5iZWdpbklubGluZUltYWdlUG9zOwogICAgfQogICAgY29uc3QgZmlsdGVyID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZGljdE1hcC5GIHx8IGRpY3RNYXAuRmlsdGVyKTsKICAgIGxldCBmaWx0ZXJOYW1lOwogICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHsKICAgICAgY29uc3QgZmlsdGVyWmVybyA9IHRoaXMueHJlZi5mZXRjaElmUmVmKGZpbHRlclswXSk7CiAgICAgIGlmIChmaWx0ZXJaZXJvIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXJaZXJvLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICAgIGxldCBsZW5ndGg7CiAgICBzd2l0Y2ggKGZpbHRlck5hbWUpIHsKICAgICAgY2FzZSAiRENUIjoKICAgICAgY2FzZSAiRENURGVjb2RlIjoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmREQ1REZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiQTg1IjoKICAgICAgY2FzZSAiQVNDSUk4NURlY29kZSI6CiAgICAgICAgbGVuZ3RoID0gdGhpcy5maW5kQVNDSUk4NURlY29kZUlubGluZVN0cmVhbUVuZChzdHJlYW0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJBSHgiOgogICAgICBjYXNlICJBU0NJSUhleERlY29kZSI6CiAgICAgICAgbGVuZ3RoID0gdGhpcy5maW5kQVNDSUlIZXhEZWNvZGVJbmxpbmVTdHJlYW1FbmQoc3RyZWFtKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBsZW5ndGggPSB0aGlzLmZpbmREZWZhdWx0SW5saW5lU3RyZWFtRW5kKHN0cmVhbSk7CiAgICB9CiAgICBsZXQgY2FjaGVLZXk7CiAgICBpZiAobGVuZ3RoIDwgTUFYX0xFTkdUSF9UT19DQUNIRSAmJiBkaWN0TGVuZ3RoID4gMCkgewogICAgICBjb25zdCBpbml0aWFsU3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgc3RyZWFtLnBvcyA9IGxleGVyLmJlZ2luSW5saW5lSW1hZ2VQb3M7CiAgICAgIGNhY2hlS2V5ID0gZ2V0SW5saW5lSW1hZ2VDYWNoZUtleShzdHJlYW0uZ2V0Qnl0ZXMoZGljdExlbmd0aCArIGxlbmd0aCkpOwogICAgICBzdHJlYW0ucG9zID0gaW5pdGlhbFN0cmVhbVBvczsKICAgICAgY29uc3QgY2FjaGVFbnRyeSA9IHRoaXMuaW1hZ2VDYWNoZVtjYWNoZUtleV07CiAgICAgIGlmIChjYWNoZUVudHJ5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aGlzLmJ1ZjIgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJFSSIpOwogICAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgICBjYWNoZUVudHJ5LnJlc2V0KCk7CiAgICAgICAgcmV0dXJuIGNhY2hlRW50cnk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRpY3QgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdCh0aGlzLnhyZWYpOwogICAgZm9yIChjb25zdCBrZXkgaW4gZGljdE1hcCkgewogICAgICBkaWN0LnNldChrZXksIGRpY3RNYXBba2V5XSk7CiAgICB9CiAgICBsZXQgaW1hZ2VTdHJlYW0gPSBzdHJlYW0ubWFrZVN1YlN0cmVhbShzdGFydFBvcywgbGVuZ3RoLCBkaWN0KTsKICAgIGlmIChjaXBoZXJUcmFuc2Zvcm0pIHsKICAgICAgaW1hZ2VTdHJlYW0gPSBjaXBoZXJUcmFuc2Zvcm0uY3JlYXRlU3RyZWFtKGltYWdlU3RyZWFtLCBsZW5ndGgpOwogICAgfQogICAgaW1hZ2VTdHJlYW0gPSB0aGlzLmZpbHRlcihpbWFnZVN0cmVhbSwgZGljdCwgbGVuZ3RoKTsKICAgIGltYWdlU3RyZWFtLmRpY3QgPSBkaWN0OwogICAgaWYgKGNhY2hlS2V5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgaW1hZ2VTdHJlYW0uY2FjaGVLZXkgPSBgaW5saW5lX2ltZ18keysrdGhpcy5faW1hZ2VJZH1gOwogICAgICB0aGlzLmltYWdlQ2FjaGVbY2FjaGVLZXldID0gaW1hZ2VTdHJlYW07CiAgICB9CiAgICB0aGlzLmJ1ZjIgPSBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJFSSIpOwogICAgdGhpcy5zaGlmdCgpOwogICAgcmV0dXJuIGltYWdlU3RyZWFtOwogIH0KICBfZmluZFN0cmVhbUxlbmd0aChzdGFydFBvcywgc2lnbmF0dXJlKSB7CiAgICBjb25zdCB7CiAgICAgIHN0cmVhbQogICAgfSA9IHRoaXMubGV4ZXI7CiAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3M7CiAgICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CiAgICBjb25zdCBzaWduYXR1cmVMZW5ndGggPSBzaWduYXR1cmUubGVuZ3RoOwogICAgd2hpbGUgKHN0cmVhbS5wb3MgPCBzdHJlYW0uZW5kKSB7CiAgICAgIGNvbnN0IHNjYW5CeXRlcyA9IHN0cmVhbS5wZWVrQnl0ZXMoU0NBTl9CTE9DS19MRU5HVEgpOwogICAgICBjb25zdCBzY2FuTGVuZ3RoID0gc2NhbkJ5dGVzLmxlbmd0aCAtIHNpZ25hdHVyZUxlbmd0aDsKICAgICAgaWYgKHNjYW5MZW5ndGggPD0gMCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGxldCBwb3MgPSAwOwogICAgICB3aGlsZSAocG9zIDwgc2Nhbkxlbmd0aCkgewogICAgICAgIGxldCBqID0gMDsKICAgICAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzY2FuQnl0ZXNbcG9zICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgICAgIHN0cmVhbS5wb3MgKz0gcG9zOwogICAgICAgICAgcmV0dXJuIHN0cmVhbS5wb3MgLSBzdGFydFBvczsKICAgICAgICB9CiAgICAgICAgcG9zKys7CiAgICAgIH0KICAgICAgc3RyZWFtLnBvcyArPSBzY2FuTGVuZ3RoOwogICAgfQogICAgcmV0dXJuIC0xOwogIH0KICBtYWtlU3RyZWFtKGRpY3QsIGNpcGhlclRyYW5zZm9ybSkgewogICAgY29uc3QgbGV4ZXIgPSB0aGlzLmxleGVyOwogICAgbGV0IHN0cmVhbSA9IGxleGVyLnN0cmVhbTsKICAgIGxleGVyLnNraXBUb05leHRMaW5lKCk7CiAgICBjb25zdCBzdGFydFBvcyA9IHN0cmVhbS5wb3MgLSAxOwogICAgbGV0IGxlbmd0aCA9IGRpY3QuZ2V0KCJMZW5ndGgiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpKSB7CiAgICAgICgwLCBfdXRpbC5pbmZvKShgQmFkIGxlbmd0aCAiJHtsZW5ndGggJiYgbGVuZ3RoLnRvU3RyaW5nKCl9IiBpbiBzdHJlYW0uYCk7CiAgICAgIGxlbmd0aCA9IDA7CiAgICB9CiAgICBzdHJlYW0ucG9zID0gc3RhcnRQb3MgKyBsZW5ndGg7CiAgICBsZXhlci5uZXh0Q2hhcigpOwogICAgaWYgKHRoaXMudHJ5U2hpZnQoKSAmJiAoMCwgX3ByaW1pdGl2ZXMuaXNDbWQpKHRoaXMuYnVmMiwgImVuZHN0cmVhbSIpKSB7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IEVORFNUUkVBTV9TSUdOQVRVUkUgPSBuZXcgVWludDhBcnJheShbMHg2NSwgMHg2ZSwgMHg2NCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2ZF0pOwogICAgICBsZXQgYWN0dWFsTGVuZ3RoID0gdGhpcy5fZmluZFN0cmVhbUxlbmd0aChzdGFydFBvcywgRU5EU1RSRUFNX1NJR05BVFVSRSk7CiAgICAgIGlmIChhY3R1YWxMZW5ndGggPCAwKSB7CiAgICAgICAgY29uc3QgTUFYX1RSVU5DQVRJT04gPSAxOwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IE1BWF9UUlVOQ0FUSU9OOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGVuZCA9IEVORFNUUkVBTV9TSUdOQVRVUkUubGVuZ3RoIC0gaTsKICAgICAgICAgIGNvbnN0IFRSVU5DQVRFRF9TSUdOQVRVUkUgPSBFTkRTVFJFQU1fU0lHTkFUVVJFLnNsaWNlKDAsIGVuZCk7CiAgICAgICAgICBjb25zdCBtYXliZUxlbmd0aCA9IHRoaXMuX2ZpbmRTdHJlYW1MZW5ndGgoc3RhcnRQb3MsIFRSVU5DQVRFRF9TSUdOQVRVUkUpOwogICAgICAgICAgaWYgKG1heWJlTGVuZ3RoID49IDApIHsKICAgICAgICAgICAgY29uc3QgbGFzdEJ5dGUgPSBzdHJlYW0ucGVla0J5dGVzKGVuZCArIDEpW2VuZF07CiAgICAgICAgICAgIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkobGFzdEJ5dGUpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKDAsIF91dGlsLmluZm8pKGBGb3VuZCAiJHsoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoVFJVTkNBVEVEX1NJR05BVFVSRSl9IiB3aGVuIGAgKyAic2VhcmNoaW5nIGZvciBlbmRzdHJlYW0gY29tbWFuZC4iKTsKICAgICAgICAgICAgYWN0dWFsTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoYWN0dWFsTGVuZ3RoIDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNaXNzaW5nIGVuZHN0cmVhbSBjb21tYW5kLiIpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZW5ndGggPSBhY3R1YWxMZW5ndGg7CiAgICAgIGxleGVyLm5leHRDaGFyKCk7CiAgICAgIHRoaXMuc2hpZnQoKTsKICAgICAgdGhpcy5zaGlmdCgpOwogICAgfQogICAgdGhpcy5zaGlmdCgpOwogICAgc3RyZWFtID0gc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MsIGxlbmd0aCwgZGljdCk7CiAgICBpZiAoY2lwaGVyVHJhbnNmb3JtKSB7CiAgICAgIHN0cmVhbSA9IGNpcGhlclRyYW5zZm9ybS5jcmVhdGVTdHJlYW0oc3RyZWFtLCBsZW5ndGgpOwogICAgfQogICAgc3RyZWFtID0gdGhpcy5maWx0ZXIoc3RyZWFtLCBkaWN0LCBsZW5ndGgpOwogICAgc3RyZWFtLmRpY3QgPSBkaWN0OwogICAgcmV0dXJuIHN0cmVhbTsKICB9CiAgZmlsdGVyKHN0cmVhbSwgZGljdCwgbGVuZ3RoKSB7CiAgICBsZXQgZmlsdGVyID0gZGljdC5nZXQoIkYiLCAiRmlsdGVyIik7CiAgICBsZXQgcGFyYW1zID0gZGljdC5nZXQoIkRQIiwgIkRlY29kZVBhcm1zIik7CiAgICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCIvRGVjb2RlUGFybXMgc2hvdWxkIG5vdCBiZSBhbiBBcnJheSwgd2hlbiAvRmlsdGVyIGlzIGEgTmFtZS4iKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5tYWtlRmlsdGVyKHN0cmVhbSwgZmlsdGVyLm5hbWUsIGxlbmd0aCwgcGFyYW1zKTsKICAgIH0KICAgIGxldCBtYXliZUxlbmd0aCA9IGxlbmd0aDsKICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHsKICAgICAgY29uc3QgZmlsdGVyQXJyYXkgPSBmaWx0ZXI7CiAgICAgIGNvbnN0IHBhcmFtc0FycmF5ID0gcGFyYW1zOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmaWx0ZXJBcnJheS5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgZmlsdGVyID0gdGhpcy54cmVmLmZldGNoSWZSZWYoZmlsdGVyQXJyYXlbaV0pOwogICAgICAgIGlmICghKGZpbHRlciBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEJhZCBmaWx0ZXIgbmFtZSAiJHtmaWx0ZXJ9ImApOwogICAgICAgIH0KICAgICAgICBwYXJhbXMgPSBudWxsOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtc0FycmF5KSAmJiBpIGluIHBhcmFtc0FycmF5KSB7CiAgICAgICAgICBwYXJhbXMgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihwYXJhbXNBcnJheVtpXSk7CiAgICAgICAgfQogICAgICAgIHN0cmVhbSA9IHRoaXMubWFrZUZpbHRlcihzdHJlYW0sIGZpbHRlci5uYW1lLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICBtYXliZUxlbmd0aCA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHJlYW07CiAgfQogIG1ha2VGaWx0ZXIoc3RyZWFtLCBuYW1lLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBpZiAobWF5YmVMZW5ndGggPT09IDApIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBFbXB0eSAiJHtuYW1lfSIgc3RyZWFtLmApOwogICAgICByZXR1cm4gbmV3IF9zdHJlYW0uTnVsbFN0cmVhbSgpOwogICAgfQogICAgdHJ5IHsKICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgY2FzZSAiRmwiOgogICAgICAgIGNhc2UgIkZsYXRlRGVjb2RlIjoKICAgICAgICAgIGlmIChwYXJhbXMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBfcHJlZGljdG9yX3N0cmVhbS5QcmVkaWN0b3JTdHJlYW0obmV3IF9mbGF0ZV9zdHJlYW0uRmxhdGVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCksIG1heWJlTGVuZ3RoLCBwYXJhbXMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBfZmxhdGVfc3RyZWFtLkZsYXRlU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkxaVyI6CiAgICAgICAgY2FzZSAiTFpXRGVjb2RlIjoKICAgICAgICAgIGxldCBlYXJseUNoYW5nZSA9IDE7CiAgICAgICAgICBpZiAocGFyYW1zKSB7CiAgICAgICAgICAgIGlmIChwYXJhbXMuaGFzKCJFYXJseUNoYW5nZSIpKSB7CiAgICAgICAgICAgICAgZWFybHlDaGFuZ2UgPSBwYXJhbXMuZ2V0KCJFYXJseUNoYW5nZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgX3ByZWRpY3Rvcl9zdHJlYW0uUHJlZGljdG9yU3RyZWFtKG5ldyBfbHp3X3N0cmVhbS5MWldTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgZWFybHlDaGFuZ2UpLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuZXcgX2x6d19zdHJlYW0uTFpXU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKTsKICAgICAgICBjYXNlICJEQ1QiOgogICAgICAgIGNhc2UgIkRDVERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IF9qcGVnX3N0cmVhbS5KcGVnU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgY2FzZSAiSlBYIjoKICAgICAgICBjYXNlICJKUFhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBfanB4X3N0cmVhbS5KcHhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCwgcGFyYW1zKTsKICAgICAgICBjYXNlICJBODUiOgogICAgICAgIGNhc2UgIkFTQ0lJODVEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBfYXNjaWlfODVfc3RyZWFtLkFzY2lpODVTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiQUh4IjoKICAgICAgICBjYXNlICJBU0NJSUhleERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IF9hc2NpaV9oZXhfc3RyZWFtLkFzY2lpSGV4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgpOwogICAgICAgIGNhc2UgIkNDRiI6CiAgICAgICAgY2FzZSAiQ0NJVFRGYXhEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBfY2NpdHRfc3RyZWFtLkNDSVRURmF4U3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgICAgY2FzZSAiUkwiOgogICAgICAgIGNhc2UgIlJ1bkxlbmd0aERlY29kZSI6CiAgICAgICAgICByZXR1cm4gbmV3IF9ydW5fbGVuZ3RoX3N0cmVhbS5SdW5MZW5ndGhTdHJlYW0oc3RyZWFtLCBtYXliZUxlbmd0aCk7CiAgICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgICAgcmV0dXJuIG5ldyBfamJpZzJfc3RyZWFtLkpiaWcyU3RyZWFtKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcyk7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBGaWx0ZXIgIiR7bmFtZX0iIGlzIG5vdCBzdXBwb3J0ZWQuYCk7CiAgICAgIHJldHVybiBzdHJlYW07CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKShgSW52YWxpZCBzdHJlYW06ICIke2V4fSJgKTsKICAgICAgcmV0dXJuIG5ldyBfc3RyZWFtLk51bGxTdHJlYW0oKTsKICAgIH0KICB9Cn0KZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7CmNvbnN0IHNwZWNpYWxDaGFycyA9IFsxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAyLCAyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTsKZnVuY3Rpb24gdG9IZXhEaWdpdChjaCkgewogIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgIHJldHVybiBjaCAmIDB4MGY7CiAgfQogIGlmIChjaCA+PSAweDQxICYmIGNoIDw9IDB4NDYgfHwgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDY2KSB7CiAgICByZXR1cm4gKGNoICYgMHgwZikgKyA5OwogIH0KICByZXR1cm4gLTE7Cn0KY2xhc3MgTGV4ZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwga25vd25Db21tYW5kcyA9IG51bGwpIHsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5uZXh0Q2hhcigpOwogICAgdGhpcy5zdHJCdWYgPSBbXTsKICAgIHRoaXMua25vd25Db21tYW5kcyA9IGtub3duQ29tbWFuZHM7CiAgICB0aGlzLl9oZXhTdHJpbmdOdW1XYXJuID0gMDsKICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IC0xOwogIH0KICBuZXh0Q2hhcigpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBwZWVrQ2hhcigpIHsKICAgIHJldHVybiB0aGlzLnN0cmVhbS5wZWVrQnl0ZSgpOwogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgbGV0IGVOb3RhdGlvbiA9IGZhbHNlOwogICAgbGV0IGRpdmlkZUJ5ID0gMDsKICAgIGxldCBzaWduID0gMDsKICAgIGlmIChjaCA9PT0gMHgyZCkgewogICAgICBzaWduID0gLTE7CiAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICBpZiAoY2ggPT09IDB4MmQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyYikgewogICAgICBzaWduID0gMTsKICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB9CiAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKICAgICAgZG8gewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICB9IHdoaWxlIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCk7CiAgICB9CiAgICBpZiAoY2ggPT09IDB4MmUpIHsKICAgICAgZGl2aWRlQnkgPSAxMDsKICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB9CiAgICBpZiAoY2ggPCAweDMwIHx8IGNoID4gMHgzOSkgewogICAgICBjb25zdCBtc2cgPSBgSW52YWxpZCBudW1iZXI6ICR7U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9IChjaGFyQ29kZSAke2NofSlgOwogICAgICBpZiAoKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpIHx8IGNoID09PSAtMSkgewogICAgICAgICgwLCBfdXRpbC5pbmZvKShgTGV4ZXIuZ2V0TnVtYmVyIC0gIiR7bXNnfSIuYCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKG1zZyk7CiAgICB9CiAgICBzaWduIHx8PSAxOwogICAgbGV0IGJhc2VWYWx1ZSA9IGNoIC0gMHgzMDsKICAgIGxldCBwb3dlclZhbHVlID0gMDsKICAgIGxldCBwb3dlclZhbHVlU2lnbiA9IDE7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwKSB7CiAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzkpIHsKICAgICAgICBjb25zdCBjdXJyZW50RGlnaXQgPSBjaCAtIDB4MzA7CiAgICAgICAgaWYgKGVOb3RhdGlvbikgewogICAgICAgICAgcG93ZXJWYWx1ZSA9IHBvd2VyVmFsdWUgKiAxMCArIGN1cnJlbnREaWdpdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CiAgICAgICAgICAgIGRpdmlkZUJ5ICo9IDEwOwogICAgICAgICAgfQogICAgICAgICAgYmFzZVZhbHVlID0gYmFzZVZhbHVlICogMTAgKyBjdXJyZW50RGlnaXQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDJlKSB7CiAgICAgICAgaWYgKGRpdmlkZUJ5ID09PSAwKSB7CiAgICAgICAgICBkaXZpZGVCeSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyZCkgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiQmFkbHkgZm9ybWF0dGVkIG51bWJlcjogbWludXMgc2lnbiBpbiB0aGUgbWlkZGxlIik7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NDUgfHwgY2ggPT09IDB4NjUpIHsKICAgICAgICBjaCA9IHRoaXMucGVla0NoYXIoKTsKICAgICAgICBpZiAoY2ggPT09IDB4MmIgfHwgY2ggPT09IDB4MmQpIHsKICAgICAgICAgIHBvd2VyVmFsdWVTaWduID0gY2ggPT09IDB4MmQgPyAtMSA6IDE7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaCA8IDB4MzAgfHwgY2ggPiAweDM5KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZU5vdGF0aW9uID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGRpdmlkZUJ5ICE9PSAwKSB7CiAgICAgIGJhc2VWYWx1ZSAvPSBkaXZpZGVCeTsKICAgIH0KICAgIGlmIChlTm90YXRpb24pIHsKICAgICAgYmFzZVZhbHVlICo9IDEwICoqIChwb3dlclZhbHVlU2lnbiAqIHBvd2VyVmFsdWUpOwogICAgfQogICAgcmV0dXJuIHNpZ24gKiBiYXNlVmFsdWU7CiAgfQogIGdldFN0cmluZygpIHsKICAgIGxldCBudW1QYXJlbiA9IDE7CiAgICBsZXQgZG9uZSA9IGZhbHNlOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIGxldCBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGxldCBjaGFyQnVmZmVyZWQgPSBmYWxzZTsKICAgICAgc3dpdGNoIChjaCB8IDApIHsKICAgICAgICBjYXNlIC0xOgogICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIik7CiAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyODoKICAgICAgICAgICsrbnVtUGFyZW47CiAgICAgICAgICBzdHJCdWYucHVzaCgiKCIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDI5OgogICAgICAgICAgaWYgKC0tbnVtUGFyZW4gPT09IDApIHsKICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIpIik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4NWM6CiAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVudGVybWluYXRlZCBzdHJpbmciKTsKICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDZlOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcbiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NzI6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxyIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg3NDoKICAgICAgICAgICAgICBzdHJCdWYucHVzaCgiXHQiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAweDYyOgogICAgICAgICAgICAgIHN0ckJ1Zi5wdXNoKCJcYiIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4NjY6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goIlxmIik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHg1YzoKICAgICAgICAgICAgY2FzZSAweDI4OgogICAgICAgICAgICBjYXNlIDB4Mjk6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MzA6CiAgICAgICAgICAgIGNhc2UgMHgzMToKICAgICAgICAgICAgY2FzZSAweDMyOgogICAgICAgICAgICBjYXNlIDB4MzM6CiAgICAgICAgICAgIGNhc2UgMHgzNDoKICAgICAgICAgICAgY2FzZSAweDM1OgogICAgICAgICAgICBjYXNlIDB4MzY6CiAgICAgICAgICAgIGNhc2UgMHgzNzoKICAgICAgICAgICAgICBsZXQgeCA9IGNoICYgMHgwZjsKICAgICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgICBjaGFyQnVmZmVyZWQgPSB0cnVlOwogICAgICAgICAgICAgIGlmIChjaCA+PSAweDMwICYmIGNoIDw9IDB4MzcpIHsKICAgICAgICAgICAgICAgIHggPSAoeCA8PCAzKSArIChjaCAmIDB4MGYpOwogICAgICAgICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM3KSB7CiAgICAgICAgICAgICAgICAgIGNoYXJCdWZmZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICB4ID0gKHggPDwgMykgKyAoY2ggJiAweDBmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4KSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMHgwZDoKICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrQ2hhcigpID09PSAweDBhKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MGE6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChkb25lKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFjaGFyQnVmZmVyZWQpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0TmFtZSgpIHsKICAgIGxldCBjaCwgcHJldmlvdXNDaDsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICB3aGlsZSAoKGNoID0gdGhpcy5uZXh0Q2hhcigpKSA+PSAwICYmICFzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgIGlmIChjaCA9PT0gMHgyMykgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChzcGVjaWFsQ2hhcnNbY2hdKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkxleGVyX2dldE5hbWU6ICIgKyAiTlVNQkVSIFNJR04gKCMpIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhIGhleGFkZWNpbWFsIG51bWJlci4iKTsKICAgICAgICAgIHN0ckJ1Zi5wdXNoKCIjIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY29uc3QgeCA9IHRvSGV4RGlnaXQoY2gpOwogICAgICAgIGlmICh4ICE9PSAtMSkgewogICAgICAgICAgcHJldmlvdXNDaCA9IGNoOwogICAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICBjb25zdCB4MiA9IHRvSGV4RGlnaXQoY2gpOwogICAgICAgICAgaWYgKHgyID09PSAtMSkgewogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYExleGVyX2dldE5hbWU6IElsbGVnYWwgZGlnaXQgKCR7U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9KSBgICsgImluIGhleGFkZWNpbWFsIG51bWJlci4iKTsKICAgICAgICAgICAgc3RyQnVmLnB1c2goIiMiLCBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZXZpb3VzQ2gpKTsKICAgICAgICAgICAgaWYgKHNwZWNpYWxDaGFyc1tjaF0pIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSh4IDw8IDQgfCB4MikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHJCdWYucHVzaCgiIyIsIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RyQnVmLmxlbmd0aCA+IDEyNykgewogICAgICAoMCwgX3V0aWwud2FybikoYE5hbWUgdG9rZW4gaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZCBieSB0aGUgc3BlYzogJHtzdHJCdWYubGVuZ3RofWApOwogICAgfQogICAgcmV0dXJuIF9wcmltaXRpdmVzLk5hbWUuZ2V0KHN0ckJ1Zi5qb2luKCIiKSk7CiAgfQogIF9oZXhTdHJpbmdXYXJuKGNoKSB7CiAgICBjb25zdCBNQVhfSEVYX1NUUklOR19OVU1fV0FSTiA9IDU7CiAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybisrID09PSBNQVhfSEVYX1NUUklOR19OVU1fV0FSTikgewogICAgICAoMCwgX3V0aWwud2FybikoImdldEhleFN0cmluZyAtIGlnbm9yaW5nIGFkZGl0aW9uYWwgaW52YWxpZCBjaGFyYWN0ZXJzLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5faGV4U3RyaW5nTnVtV2FybiA+IE1BWF9IRVhfU1RSSU5HX05VTV9XQVJOKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgICgwLCBfdXRpbC53YXJuKShgZ2V0SGV4U3RyaW5nIC0gaWdub3JpbmcgaW52YWxpZCBjaGFyYWN0ZXI6ICR7Y2h9YCk7CiAgfQogIGdldEhleFN0cmluZygpIHsKICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgbGV0IGlzRmlyc3RIZXggPSB0cnVlOwogICAgbGV0IGZpcnN0RGlnaXQsIHNlY29uZERpZ2l0OwogICAgdGhpcy5faGV4U3RyaW5nTnVtV2FybiA9IDA7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnRlcm1pbmF0ZWQgaGV4IHN0cmluZyIpOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gPT09IDEpIHsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaXNGaXJzdEhleCkgewogICAgICAgICAgZmlyc3REaWdpdCA9IHRvSGV4RGlnaXQoY2gpOwogICAgICAgICAgaWYgKGZpcnN0RGlnaXQgPT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMuX2hleFN0cmluZ1dhcm4oY2gpOwogICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlY29uZERpZ2l0ID0gdG9IZXhEaWdpdChjaCk7CiAgICAgICAgICBpZiAoc2Vjb25kRGlnaXQgPT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMuX2hleFN0cmluZ1dhcm4oY2gpOwogICAgICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGZpcnN0RGlnaXQgPDwgNCB8IHNlY29uZERpZ2l0KSk7CiAgICAgICAgfQogICAgICAgIGlzRmlyc3RIZXggPSAhaXNGaXJzdEhleDsKICAgICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0ckJ1Zi5qb2luKCIiKTsKICB9CiAgZ2V0T2JqKCkgewogICAgbGV0IGNvbW1lbnQgPSBmYWxzZTsKICAgIGxldCBjaCA9IHRoaXMuY3VycmVudENoYXI7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoY2ggPCAwKSB7CiAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkVPRjsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFyc1tjaF0gIT09IDEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIHN3aXRjaCAoY2ggfCAwKSB7CiAgICAgIGNhc2UgMHgzMDoKICAgICAgY2FzZSAweDMxOgogICAgICBjYXNlIDB4MzI6CiAgICAgIGNhc2UgMHgzMzoKICAgICAgY2FzZSAweDM0OgogICAgICBjYXNlIDB4MzU6CiAgICAgIGNhc2UgMHgzNjoKICAgICAgY2FzZSAweDM3OgogICAgICBjYXNlIDB4Mzg6CiAgICAgIGNhc2UgMHgzOToKICAgICAgY2FzZSAweDJiOgogICAgICBjYXNlIDB4MmQ6CiAgICAgIGNhc2UgMHgyZToKICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoKTsKICAgICAgY2FzZSAweDI4OgogICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygpOwogICAgICBjYXNlIDB4MmY6CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOwogICAgICBjYXNlIDB4NWI6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJbIik7CiAgICAgIGNhc2UgMHg1ZDoKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIl0iKTsKICAgICAgY2FzZSAweDNjOgogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgzYykgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIjw8Iik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmdldEhleFN0cmluZygpOwogICAgICBjYXNlIDB4M2U6CiAgICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgaWYgKGNoID09PSAweDNlKSB7CiAgICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgiPj4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNtZC5nZXQoIj4iKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gX3ByaW1pdGl2ZXMuQ21kLmdldCgieyIpOwogICAgICBjYXNlIDB4N2Q6CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KCJ9Iik7CiAgICAgIGNhc2UgMHgyOToKICAgICAgICB0aGlzLm5leHRDaGFyKCk7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbGxlZ2FsIGNoYXJhY3RlcjogJHtjaH1gKTsKICAgIH0KICAgIGxldCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIGlmIChjaCA8IDB4MjAgfHwgY2ggPiAweDdmKSB7CiAgICAgIGNvbnN0IG5leHRDaCA9IHRoaXMucGVla0NoYXIoKTsKICAgICAgaWYgKG5leHRDaCA+PSAweDIwICYmIG5leHRDaCA8PSAweDdmKSB7CiAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KHN0cik7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGtub3duQ29tbWFuZHMgPSB0aGlzLmtub3duQ29tbWFuZHM7CiAgICBsZXQga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCAmJiAhc3BlY2lhbENoYXJzW2NoXSkgewogICAgICBjb25zdCBwb3NzaWJsZUNvbW1hbmQgPSBzdHIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgICAgaWYgKGtub3duQ29tbWFuZEZvdW5kICYmIGtub3duQ29tbWFuZHNbcG9zc2libGVDb21tYW5kXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEyOCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgQ29tbWFuZCB0b2tlbiB0b28gbG9uZzogJHtzdHIubGVuZ3RofWApOwogICAgICB9CiAgICAgIHN0ciA9IHBvc3NpYmxlQ29tbWFuZDsKICAgICAga25vd25Db21tYW5kRm91bmQgPSBrbm93bkNvbW1hbmRzPy5bc3RyXSAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgaWYgKHN0ciA9PT0gInRydWUiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKHN0ciA9PT0gImZhbHNlIikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyID09PSAibnVsbCIpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoc3RyID09PSAiQkkiKSB7CiAgICAgIHRoaXMuYmVnaW5JbmxpbmVJbWFnZVBvcyA9IHRoaXMuc3RyZWFtLnBvczsKICAgIH0KICAgIHJldHVybiBfcHJpbWl0aXZlcy5DbWQuZ2V0KHN0cik7CiAgfQogIHNraXBUb05leHRMaW5lKCkgewogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIHdoaWxlIChjaCA+PSAwKSB7CiAgICAgIGlmIChjaCA9PT0gMHgwZCkgewogICAgICAgIGNoID0gdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwYSkgewogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICB9Cn0KZXhwb3J0cy5MZXhlciA9IExleGVyOwpjbGFzcyBMaW5lYXJpemF0aW9uIHsKICBzdGF0aWMgY3JlYXRlKHN0cmVhbSkgewogICAgZnVuY3Rpb24gZ2V0SW50KGxpbkRpY3QsIG5hbWUsIGFsbG93WmVyb1ZhbHVlID0gZmFsc2UpIHsKICAgICAgY29uc3Qgb2JqID0gbGluRGljdC5nZXQobmFtZSk7CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG9iaikgJiYgKGFsbG93WmVyb1ZhbHVlID8gb2JqID49IDAgOiBvYmogPiAwKSkgewogICAgICAgIHJldHVybiBvYmo7CiAgICAgIH0KICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgIiR7bmFtZX0iIHBhcmFtZXRlciBpbiB0aGUgbGluZWFyaXphdGlvbiBgICsgImRpY3Rpb25hcnkgaXMgaW52YWxpZC4iKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEhpbnRzKGxpbkRpY3QpIHsKICAgICAgY29uc3QgaGludHMgPSBsaW5EaWN0LmdldCgiSCIpOwogICAgICBsZXQgaGludHNMZW5ndGg7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KGhpbnRzKSAmJiAoKGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoKSA9PT0gMiB8fCBoaW50c0xlbmd0aCA9PT0gNCkpIHsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaGludHNMZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIGNvbnN0IGhpbnQgPSBoaW50c1tpbmRleF07CiAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKGhpbnQpICYmIGhpbnQgPiAwKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhpbnQgKCR7aW5kZXh9KSBpbiB0aGUgbGluZWFyaXphdGlvbiBkaWN0aW9uYXJ5IGlzIGludmFsaWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBoaW50czsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoIkhpbnQgYXJyYXkgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSBpcyBpbnZhbGlkLiIpOwogICAgfQogICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlcih7CiAgICAgIGxleGVyOiBuZXcgTGV4ZXIoc3RyZWFtKSwKICAgICAgeHJlZjogbnVsbAogICAgfSk7CiAgICBjb25zdCBvYmoxID0gcGFyc2VyLmdldE9iaigpOwogICAgY29uc3Qgb2JqMiA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajMgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBsaW5EaWN0ID0gcGFyc2VyLmdldE9iaigpOwogICAgbGV0IG9iaiwgbGVuZ3RoOwogICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihvYmoxKSAmJiBOdW1iZXIuaXNJbnRlZ2VyKG9iajIpICYmICgwLCBfcHJpbWl0aXZlcy5pc0NtZCkob2JqMywgIm9iaiIpICYmIGxpbkRpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ICYmIHR5cGVvZiAob2JqID0gbGluRGljdC5nZXQoIkxpbmVhcml6ZWQiKSkgPT09ICJudW1iZXIiICYmIG9iaiA+IDApKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmICgobGVuZ3RoID0gZ2V0SW50KGxpbkRpY3QsICJMIikpICE9PSBzdHJlYW0ubGVuZ3RoKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlICJMIiBwYXJhbWV0ZXIgaW4gdGhlIGxpbmVhcml6YXRpb24gZGljdGlvbmFyeSAnICsgImRvZXMgbm90IGVxdWFsIHRoZSBzdHJlYW0gbGVuZ3RoLiIpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgbGVuZ3RoLAogICAgICBoaW50czogZ2V0SGludHMobGluRGljdCksCiAgICAgIG9iamVjdE51bWJlckZpcnN0OiBnZXRJbnQobGluRGljdCwgIk8iKSwKICAgICAgZW5kRmlyc3Q6IGdldEludChsaW5EaWN0LCAiRSIpLAogICAgICBudW1QYWdlczogZ2V0SW50KGxpbkRpY3QsICJOIiksCiAgICAgIG1haW5YUmVmRW50cmllc09mZnNldDogZ2V0SW50KGxpbkRpY3QsICJUIiksCiAgICAgIHBhZ2VGaXJzdDogbGluRGljdC5oYXMoIlAiKSA/IGdldEludChsaW5EaWN0LCAiUCIsIHRydWUpIDogMAogICAgfTsKICB9Cn0KZXhwb3J0cy5MaW5lYXJpemF0aW9uID0gTGluZWFyaXphdGlvbjsKCi8qKiovIH0pLAovKiAxNyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkFzY2lpODVTdHJlYW0gPSB2b2lkIDA7CnZhciBfZGVjb2RlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwpjbGFzcyBBc2NpaTg1U3RyZWFtIGV4dGVuZHMgX2RlY29kZV9zdHJlYW0uRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoKSB7CiAgICBpZiAobWF5YmVMZW5ndGgpIHsKICAgICAgbWF5YmVMZW5ndGggKj0gMC44OwogICAgfQogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuaW5wdXQgPSBuZXcgVWludDhBcnJheSg1KTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgVElMREFfQ0hBUiA9IDB4N2U7CiAgICBjb25zdCBaX0xPV0VSX0NIQVIgPSAweDdhOwogICAgY29uc3QgRU9GID0gLTE7CiAgICBjb25zdCBzdHIgPSB0aGlzLnN0cjsKICAgIGxldCBjID0gc3RyLmdldEJ5dGUoKTsKICAgIHdoaWxlICgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjKSkgewogICAgICBjID0gc3RyLmdldEJ5dGUoKTsKICAgIH0KICAgIGlmIChjID09PSBFT0YgfHwgYyA9PT0gVElMREFfQ0hBUikgewogICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IGJ1ZmZlciwgaTsKICAgIGlmIChjID09PSBaX0xPV0VSX0NIQVIpIHsKICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgNCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSAwOwogICAgICB9CiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IDQ7CiAgICB9IGVsc2UgewogICAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXQ7CiAgICAgIGlucHV0WzBdID0gYzsKICAgICAgZm9yIChpID0gMTsgaSA8IDU7ICsraSkgewogICAgICAgIGMgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgICAgIHdoaWxlICgoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjKSkgewogICAgICAgICAgYyA9IHN0ci5nZXRCeXRlKCk7CiAgICAgICAgfQogICAgICAgIGlucHV0W2ldID0gYzsKICAgICAgICBpZiAoYyA9PT0gRU9GIHx8IGMgPT09IFRJTERBX0NIQVIpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBpIC0gMSk7CiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IGkgLSAxOwogICAgICBpZiAoaSA8IDUpIHsKICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkgewogICAgICAgICAgaW5wdXRbaV0gPSAweDIxICsgODQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgdCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgICB0ID0gdCAqIDg1ICsgKGlucHV0W2ldIC0gMHgyMSk7CiAgICAgIH0KICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoICsgaV0gPSB0ICYgMHhmZjsKICAgICAgICB0ID4+PSA4OwogICAgICB9CiAgICB9CiAgfQp9CmV4cG9ydHMuQXNjaWk4NVN0cmVhbSA9IEFzY2lpODVTdHJlYW07CgovKioqLyB9KSwKLyogMTggKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5TdHJlYW1zU2VxdWVuY2VTdHJlYW0gPSBleHBvcnRzLkRlY29kZVN0cmVhbSA9IHZvaWQgMDsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTsKY29uc3QgZW1wdHlCdWZmZXIgPSBuZXcgVWludDhBcnJheSgwKTsKY2xhc3MgRGVjb2RlU3RyZWFtIGV4dGVuZHMgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0gewogIGNvbnN0cnVjdG9yKG1heWJlTWluQnVmZmVyTGVuZ3RoKSB7CiAgICBzdXBlcigpOwogICAgdGhpcy5fcmF3TWluQnVmZmVyTGVuZ3RoID0gbWF5YmVNaW5CdWZmZXJMZW5ndGggfHwgMDsKICAgIHRoaXMucG9zID0gMDsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKICAgIHRoaXMuZW9mID0gZmFsc2U7CiAgICB0aGlzLmJ1ZmZlciA9IGVtcHR5QnVmZmVyOwogICAgdGhpcy5taW5CdWZmZXJMZW5ndGggPSA1MTI7CiAgICBpZiAobWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgd2hpbGUgKHRoaXMubWluQnVmZmVyTGVuZ3RoIDwgbWF5YmVNaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgICB0aGlzLm1pbkJ1ZmZlckxlbmd0aCAqPSAyOwogICAgICB9CiAgICB9CiAgfQogIGdldCBpc0VtcHR5KCkgewogICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA9PT0gMCkgewogICAgICB0aGlzLnJlYWRCbG9jaygpOwogICAgfQogICAgcmV0dXJuIHRoaXMuYnVmZmVyTGVuZ3RoID09PSAwOwogIH0KICBlbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGlmIChyZXF1ZXN0ZWQgPD0gYnVmZmVyLmJ5dGVMZW5ndGgpIHsKICAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgIH0KICAgIGxldCBzaXplID0gdGhpcy5taW5CdWZmZXJMZW5ndGg7CiAgICB3aGlsZSAoc2l6ZSA8IHJlcXVlc3RlZCkgewogICAgICBzaXplICo9IDI7CiAgICB9CiAgICBjb25zdCBidWZmZXIyID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7CiAgICBidWZmZXIyLnNldChidWZmZXIpOwogICAgcmV0dXJuIHRoaXMuYnVmZmVyID0gYnVmZmVyMjsKICB9CiAgZ2V0Qnl0ZSgpIHsKICAgIGNvbnN0IHBvcyA9IHRoaXMucG9zOwogICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IHBvcykgewogICAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgdGhpcy5yZWFkQmxvY2soKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcysrXTsKICB9CiAgZ2V0Qnl0ZXMobGVuZ3RoKSB7CiAgICBjb25zdCBwb3MgPSB0aGlzLnBvczsKICAgIGxldCBlbmQ7CiAgICBpZiAobGVuZ3RoKSB7CiAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHBvcyArIGxlbmd0aCk7CiAgICAgIGVuZCA9IHBvcyArIGxlbmd0aDsKICAgICAgd2hpbGUgKCF0aGlzLmVvZiAmJiB0aGlzLmJ1ZmZlckxlbmd0aCA8IGVuZCkgewogICAgICAgIHRoaXMucmVhZEJsb2NrKCk7CiAgICAgIH0KICAgICAgY29uc3QgYnVmRW5kID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICAgIGlmIChlbmQgPiBidWZFbmQpIHsKICAgICAgICBlbmQgPSBidWZFbmQ7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlICghdGhpcy5lb2YpIHsKICAgICAgICB0aGlzLnJlYWRCbG9jaygpOwogICAgICB9CiAgICAgIGVuZCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgfQogICAgdGhpcy5wb3MgPSBlbmQ7CiAgICByZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkocG9zLCBlbmQpOwogIH0KICByZXNldCgpIHsKICAgIHRoaXMucG9zID0gMDsKICB9CiAgbWFrZVN1YlN0cmVhbShzdGFydCwgbGVuZ3RoLCBkaWN0ID0gbnVsbCkgewogICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHdoaWxlICghdGhpcy5lb2YpIHsKICAgICAgICB0aGlzLnJlYWRCbG9jaygpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBlbmQgPSBzdGFydCArIGxlbmd0aDsKICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyTGVuZ3RoIDw9IGVuZCAmJiAhdGhpcy5lb2YpIHsKICAgICAgICB0aGlzLnJlYWRCbG9jaygpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IF9zdHJlYW0uU3RyZWFtKHRoaXMuYnVmZmVyLCBzdGFydCwgbGVuZ3RoLCBkaWN0KTsKICB9CiAgZ2V0QmFzZVN0cmVhbXMoKSB7CiAgICByZXR1cm4gdGhpcy5zdHIgPyB0aGlzLnN0ci5nZXRCYXNlU3RyZWFtcygpIDogbnVsbDsKICB9Cn0KZXhwb3J0cy5EZWNvZGVTdHJlYW0gPSBEZWNvZGVTdHJlYW07CmNsYXNzIFN0cmVhbXNTZXF1ZW5jZVN0cmVhbSBleHRlbmRzIERlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyZWFtcywgb25FcnJvciA9IG51bGwpIHsKICAgIGxldCBtYXliZUxlbmd0aCA9IDA7CiAgICBmb3IgKGNvbnN0IHN0cmVhbSBvZiBzdHJlYW1zKSB7CiAgICAgIG1heWJlTGVuZ3RoICs9IHN0cmVhbSBpbnN0YW5jZW9mIERlY29kZVN0cmVhbSA/IHN0cmVhbS5fcmF3TWluQnVmZmVyTGVuZ3RoIDogc3RyZWFtLmxlbmd0aDsKICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtcyA9IHN0cmVhbXM7CiAgICB0aGlzLl9vbkVycm9yID0gb25FcnJvcjsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3Qgc3RyZWFtcyA9IHRoaXMuc3RyZWFtczsKICAgIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMCkgewogICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKTsKICAgIGxldCBjaHVuazsKICAgIHRyeSB7CiAgICAgIGNodW5rID0gc3RyZWFtLmdldEJ5dGVzKCk7CiAgICB9IGNhdGNoIChyZWFzb24pIHsKICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHsKICAgICAgICB0aGlzLl9vbkVycm9yKHJlYXNvbiwgc3RyZWFtLmRpY3Q/Lm9iaklkKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhyb3cgcmVhc29uOwogICAgfQogICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBjb25zdCBuZXdMZW5ndGggPSBidWZmZXJMZW5ndGggKyBjaHVuay5sZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihuZXdMZW5ndGgpOwogICAgYnVmZmVyLnNldChjaHVuaywgYnVmZmVyTGVuZ3RoKTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gbmV3TGVuZ3RoOwogIH0KICBnZXRCYXNlU3RyZWFtcygpIHsKICAgIGNvbnN0IGJhc2VTdHJlYW1zQnVmID0gW107CiAgICBmb3IgKGNvbnN0IHN0cmVhbSBvZiB0aGlzLnN0cmVhbXMpIHsKICAgICAgY29uc3QgYmFzZVN0cmVhbXMgPSBzdHJlYW0uZ2V0QmFzZVN0cmVhbXMoKTsKICAgICAgaWYgKGJhc2VTdHJlYW1zKSB7CiAgICAgICAgYmFzZVN0cmVhbXNCdWYucHVzaCguLi5iYXNlU3RyZWFtcyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBiYXNlU3RyZWFtc0J1Zi5sZW5ndGggPiAwID8gYmFzZVN0cmVhbXNCdWYgOiBudWxsOwogIH0KfQpleHBvcnRzLlN0cmVhbXNTZXF1ZW5jZVN0cmVhbSA9IFN0cmVhbXNTZXF1ZW5jZVN0cmVhbTsKCi8qKiovIH0pLAovKiAxOSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkFzY2lpSGV4U3RyZWFtID0gdm9pZCAwOwp2YXIgX2RlY29kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKY2xhc3MgQXNjaWlIZXhTdHJlYW0gZXh0ZW5kcyBfZGVjb2RlX3N0cmVhbS5EZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgpIHsKICAgIGlmIChtYXliZUxlbmd0aCkgewogICAgICBtYXliZUxlbmd0aCAqPSAwLjU7CiAgICB9CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgdGhpcy5maXJzdERpZ2l0ID0gLTE7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGNvbnN0IFVQU1RSRUFNX0JMT0NLX1NJWkUgPSA4MDAwOwogICAgY29uc3QgYnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhVUFNUUkVBTV9CTE9DS19TSVpFKTsKICAgIGlmICghYnl0ZXMubGVuZ3RoKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWF4RGVjb2RlTGVuZ3RoID0gYnl0ZXMubGVuZ3RoICsgMSA+PiAxOwogICAgY29uc3QgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBtYXhEZWNvZGVMZW5ndGgpOwogICAgbGV0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgbGV0IGZpcnN0RGlnaXQgPSB0aGlzLmZpcnN0RGlnaXQ7CiAgICBmb3IgKGNvbnN0IGNoIG9mIGJ5dGVzKSB7CiAgICAgIGxldCBkaWdpdDsKICAgICAgaWYgKGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSkgewogICAgICAgIGRpZ2l0ID0gY2ggJiAweDBmOwogICAgICB9IGVsc2UgaWYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg0NiB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4NjYpIHsKICAgICAgICBkaWdpdCA9IChjaCAmIDB4MGYpICsgOTsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgzZSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoZmlyc3REaWdpdCA8IDApIHsKICAgICAgICBmaXJzdERpZ2l0ID0gZGlnaXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGZpcnN0RGlnaXQgPDwgNCB8IGRpZ2l0OwogICAgICAgIGZpcnN0RGlnaXQgPSAtMTsKICAgICAgfQogICAgfQogICAgaWYgKGZpcnN0RGlnaXQgPj0gMCAmJiB0aGlzLmVvZikgewogICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoKytdID0gZmlyc3REaWdpdCA8PCA0OwogICAgICBmaXJzdERpZ2l0ID0gLTE7CiAgICB9CiAgICB0aGlzLmZpcnN0RGlnaXQgPSBmaXJzdERpZ2l0OwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CiAgfQp9CmV4cG9ydHMuQXNjaWlIZXhTdHJlYW0gPSBBc2NpaUhleFN0cmVhbTsKCi8qKiovIH0pLAovKiAyMCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkNDSVRURmF4U3RyZWFtID0gdm9pZCAwOwp2YXIgX2NjaXR0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMSk7CnZhciBfZGVjb2RlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwpjbGFzcyBDQ0lUVEZheFN0cmVhbSBleHRlbmRzIF9kZWNvZGVfc3RyZWFtLkRlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgcGFyYW1zKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcGFyYW1zID0gX3ByaW1pdGl2ZXMuRGljdC5lbXB0eTsKICAgIH0KICAgIGNvbnN0IHNvdXJjZSA9IHsKICAgICAgbmV4dCgpIHsKICAgICAgICByZXR1cm4gc3RyLmdldEJ5dGUoKTsKICAgICAgfQogICAgfTsKICAgIHRoaXMuY2NpdHRGYXhEZWNvZGVyID0gbmV3IF9jY2l0dC5DQ0lUVEZheERlY29kZXIoc291cmNlLCB7CiAgICAgIEs6IHBhcmFtcy5nZXQoIksiKSwKICAgICAgRW5kT2ZMaW5lOiBwYXJhbXMuZ2V0KCJFbmRPZkxpbmUiKSwKICAgICAgRW5jb2RlZEJ5dGVBbGlnbjogcGFyYW1zLmdldCgiRW5jb2RlZEJ5dGVBbGlnbiIpLAogICAgICBDb2x1bW5zOiBwYXJhbXMuZ2V0KCJDb2x1bW5zIiksCiAgICAgIFJvd3M6IHBhcmFtcy5nZXQoIlJvd3MiKSwKICAgICAgRW5kT2ZCbG9jazogcGFyYW1zLmdldCgiRW5kT2ZCbG9jayIpLAogICAgICBCbGFja0lzMTogcGFyYW1zLmdldCgiQmxhY2tJczEiKQogICAgfSk7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIHdoaWxlICghdGhpcy5lb2YpIHsKICAgICAgY29uc3QgYyA9IHRoaXMuY2NpdHRGYXhEZWNvZGVyLnJlYWROZXh0Q2hhcigpOwogICAgICBpZiAoYyA9PT0gLTEpIHsKICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuZW5zdXJlQnVmZmVyKHRoaXMuYnVmZmVyTGVuZ3RoICsgMSk7CiAgICAgIHRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdID0gYzsKICAgIH0KICB9Cn0KZXhwb3J0cy5DQ0lUVEZheFN0cmVhbSA9IENDSVRURmF4U3RyZWFtOwoKLyoqKi8gfSksCi8qIDIxICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuQ0NJVFRGYXhEZWNvZGVyID0gdm9pZCAwOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpjb25zdCBjY2l0dEVPTCA9IC0yOwpjb25zdCBjY2l0dEVPRiA9IC0xOwpjb25zdCB0d29EaW1QYXNzID0gMDsKY29uc3QgdHdvRGltSG9yaXogPSAxOwpjb25zdCB0d29EaW1WZXJ0MCA9IDI7CmNvbnN0IHR3b0RpbVZlcnRSMSA9IDM7CmNvbnN0IHR3b0RpbVZlcnRMMSA9IDQ7CmNvbnN0IHR3b0RpbVZlcnRSMiA9IDU7CmNvbnN0IHR3b0RpbVZlcnRMMiA9IDY7CmNvbnN0IHR3b0RpbVZlcnRSMyA9IDc7CmNvbnN0IHR3b0RpbVZlcnRMMyA9IDg7CmNvbnN0IHR3b0RpbVRhYmxlID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzcsIHR3b0RpbVZlcnRMM10sIFs3LCB0d29EaW1WZXJ0UjNdLCBbNiwgdHdvRGltVmVydEwyXSwgWzYsIHR3b0RpbVZlcnRMMl0sIFs2LCB0d29EaW1WZXJ0UjJdLCBbNiwgdHdvRGltVmVydFIyXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFs0LCB0d29EaW1QYXNzXSwgWzQsIHR3b0RpbVBhc3NdLCBbNCwgdHdvRGltUGFzc10sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1Ib3Jpel0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydEwxXSwgWzMsIHR3b0RpbVZlcnRMMV0sIFszLCB0d29EaW1WZXJ0TDFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzMsIHR3b0RpbVZlcnRSMV0sIFszLCB0d29EaW1WZXJ0UjFdLCBbMywgdHdvRGltVmVydFIxXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXSwgWzEsIHR3b0RpbVZlcnQwXV07CmNvbnN0IHdoaXRlVGFibGUxID0gW1stMSwgLTFdLCBbMTIsIGNjaXR0RU9MXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbMTEsIDE3OTJdLCBbMTEsIDE3OTJdLCBbMTIsIDE5ODRdLCBbMTIsIDIwNDhdLCBbMTIsIDIxMTJdLCBbMTIsIDIxNzZdLCBbMTIsIDIyNDBdLCBbMTIsIDIzMDRdLCBbMTEsIDE4NTZdLCBbMTEsIDE4NTZdLCBbMTEsIDE5MjBdLCBbMTEsIDE5MjBdLCBbMTIsIDIzNjhdLCBbMTIsIDI0MzJdLCBbMTIsIDI0OTZdLCBbMTIsIDI1NjBdXTsKY29uc3Qgd2hpdGVUYWJsZTIgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs4LCAyOV0sIFs4LCAyOV0sIFs4LCAzMF0sIFs4LCAzMF0sIFs4LCA0NV0sIFs4LCA0NV0sIFs4LCA0Nl0sIFs4LCA0Nl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyMl0sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs3LCAyM10sIFs4LCA0N10sIFs4LCA0N10sIFs4LCA0OF0sIFs4LCA0OF0sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs2LCAxM10sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs3LCAyMF0sIFs4LCAzM10sIFs4LCAzM10sIFs4LCAzNF0sIFs4LCAzNF0sIFs4LCAzNV0sIFs4LCAzNV0sIFs4LCAzNl0sIFs4LCAzNl0sIFs4LCAzN10sIFs4LCAzN10sIFs4LCAzOF0sIFs4LCAzOF0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs3LCAxOV0sIFs4LCAzMV0sIFs4LCAzMV0sIFs4LCAzMl0sIFs4LCAzMl0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMV0sIFs2LCAxXSwgWzYsIDFdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbNiwgMTJdLCBbOCwgNTNdLCBbOCwgNTNdLCBbOCwgNTRdLCBbOCwgNTRdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbNywgMjZdLCBbOCwgMzldLCBbOCwgMzldLCBbOCwgNDBdLCBbOCwgNDBdLCBbOCwgNDFdLCBbOCwgNDFdLCBbOCwgNDJdLCBbOCwgNDJdLCBbOCwgNDNdLCBbOCwgNDNdLCBbOCwgNDRdLCBbOCwgNDRdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjFdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbNywgMjhdLCBbOCwgNjFdLCBbOCwgNjFdLCBbOCwgNjJdLCBbOCwgNjJdLCBbOCwgNjNdLCBbOCwgNjNdLCBbOCwgMF0sIFs4LCAwXSwgWzgsIDMyMF0sIFs4LCAzMjBdLCBbOCwgMzg0XSwgWzgsIDM4NF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMF0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs1LCAxMV0sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs3LCAyN10sIFs4LCA1OV0sIFs4LCA1OV0sIFs4LCA2MF0sIFs4LCA2MF0sIFs5LCAxNDcyXSwgWzksIDE1MzZdLCBbOSwgMTYwMF0sIFs5LCAxNzI4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDE4XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzcsIDI0XSwgWzgsIDQ5XSwgWzgsIDQ5XSwgWzgsIDUwXSwgWzgsIDUwXSwgWzgsIDUxXSwgWzgsIDUxXSwgWzgsIDUyXSwgWzgsIDUyXSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzcsIDI1XSwgWzgsIDU1XSwgWzgsIDU1XSwgWzgsIDU2XSwgWzgsIDU2XSwgWzgsIDU3XSwgWzgsIDU3XSwgWzgsIDU4XSwgWzgsIDU4XSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTkyXSwgWzYsIDE5Ml0sIFs2LCAxOTJdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzYsIDE2NjRdLCBbNiwgMTY2NF0sIFs2LCAxNjY0XSwgWzgsIDQ0OF0sIFs4LCA0NDhdLCBbOCwgNTEyXSwgWzgsIDUxMl0sIFs5LCA3MDRdLCBbOSwgNzY4XSwgWzgsIDY0MF0sIFs4LCA2NDBdLCBbOCwgNTc2XSwgWzgsIDU3Nl0sIFs5LCA4MzJdLCBbOSwgODk2XSwgWzksIDk2MF0sIFs5LCAxMDI0XSwgWzksIDEwODhdLCBbOSwgMTE1Ml0sIFs5LCAxMjE2XSwgWzksIDEyODBdLCBbOSwgMTM0NF0sIFs5LCAxNDA4XSwgWzcsIDI1Nl0sIFs3LCAyNTZdLCBbNywgMjU2XSwgWzcsIDI1Nl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgMl0sIFs0LCAyXSwgWzQsIDJdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzQsIDNdLCBbNCwgM10sIFs0LCAzXSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCAxMjhdLCBbNSwgMTI4XSwgWzUsIDEyOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDhdLCBbNSwgOF0sIFs1LCA4XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNSwgOV0sIFs1LCA5XSwgWzUsIDldLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTZdLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNiwgMTddLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDRdLCBbNCwgNF0sIFs0LCA0XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNF0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs2LCAxNV0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs1LCA2NF0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XSwgWzQsIDddLCBbNCwgN10sIFs0LCA3XV07CmNvbnN0IGJsYWNrVGFibGUxID0gW1stMSwgLTFdLCBbLTEsIC0xXSwgWzEyLCBjY2l0dEVPTF0sIFsxMiwgY2NpdHRFT0xdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzExLCAxNzkyXSwgWzEyLCAxOTg0XSwgWzEyLCAxOTg0XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMDQ4XSwgWzEyLCAyMTEyXSwgWzEyLCAyMTEyXSwgWzEyLCAyMTc2XSwgWzEyLCAyMTc2XSwgWzEyLCAyMjQwXSwgWzEyLCAyMjQwXSwgWzEyLCAyMzA0XSwgWzEyLCAyMzA0XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxODU2XSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzExLCAxOTIwXSwgWzEyLCAyMzY4XSwgWzEyLCAyMzY4XSwgWzEyLCAyNDMyXSwgWzEyLCAyNDMyXSwgWzEyLCAyNDk2XSwgWzEyLCAyNDk2XSwgWzEyLCAyNTYwXSwgWzEyLCAyNTYwXSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTAsIDE4XSwgWzEwLCAxOF0sIFsxMCwgMThdLCBbMTIsIDUyXSwgWzEyLCA1Ml0sIFsxMywgNjQwXSwgWzEzLCA3MDRdLCBbMTMsIDc2OF0sIFsxMywgODMyXSwgWzEyLCA1NV0sIFsxMiwgNTVdLCBbMTIsIDU2XSwgWzEyLCA1Nl0sIFsxMywgMTI4MF0sIFsxMywgMTM0NF0sIFsxMywgMTQwOF0sIFsxMywgMTQ3Ml0sIFsxMiwgNTldLCBbMTIsIDU5XSwgWzEyLCA2MF0sIFsxMiwgNjBdLCBbMTMsIDE1MzZdLCBbMTMsIDE2MDBdLCBbMTEsIDI0XSwgWzExLCAyNF0sIFsxMSwgMjRdLCBbMTEsIDI0XSwgWzExLCAyNV0sIFsxMSwgMjVdLCBbMTEsIDI1XSwgWzExLCAyNV0sIFsxMywgMTY2NF0sIFsxMywgMTcyOF0sIFsxMiwgMzIwXSwgWzEyLCAzMjBdLCBbMTIsIDM4NF0sIFsxMiwgMzg0XSwgWzEyLCA0NDhdLCBbMTIsIDQ0OF0sIFsxMywgNTEyXSwgWzEzLCA1NzZdLCBbMTIsIDUzXSwgWzEyLCA1M10sIFsxMiwgNTRdLCBbMTIsIDU0XSwgWzEzLCA4OTZdLCBbMTMsIDk2MF0sIFsxMywgMTAyNF0sIFsxMywgMTA4OF0sIFsxMywgMTE1Ml0sIFsxMywgMTIxNl0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XSwgWzEwLCA2NF0sIFsxMCwgNjRdLCBbMTAsIDY0XV07CmNvbnN0IGJsYWNrVGFibGUyID0gW1s4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFs4LCAxM10sIFsxMSwgMjNdLCBbMTEsIDIzXSwgWzEyLCA1MF0sIFsxMiwgNTFdLCBbMTIsIDQ0XSwgWzEyLCA0NV0sIFsxMiwgNDZdLCBbMTIsIDQ3XSwgWzEyLCA1N10sIFsxMiwgNThdLCBbMTIsIDYxXSwgWzEyLCAyNTZdLCBbMTAsIDE2XSwgWzEwLCAxNl0sIFsxMCwgMTZdLCBbMTAsIDE2XSwgWzEwLCAxN10sIFsxMCwgMTddLCBbMTAsIDE3XSwgWzEwLCAxN10sIFsxMiwgNDhdLCBbMTIsIDQ5XSwgWzEyLCA2Ml0sIFsxMiwgNjNdLCBbMTIsIDMwXSwgWzEyLCAzMV0sIFsxMiwgMzJdLCBbMTIsIDMzXSwgWzEyLCA0MF0sIFsxMiwgNDFdLCBbMTEsIDIyXSwgWzExLCAyMl0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs4LCAxNF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMF0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs3LCAxMV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFs5LCAxNV0sIFsxMiwgMTI4XSwgWzEyLCAxOTJdLCBbMTIsIDI2XSwgWzEyLCAyN10sIFsxMiwgMjhdLCBbMTIsIDI5XSwgWzExLCAxOV0sIFsxMSwgMTldLCBbMTEsIDIwXSwgWzExLCAyMF0sIFsxMiwgMzRdLCBbMTIsIDM1XSwgWzEyLCAzNl0sIFsxMiwgMzddLCBbMTIsIDM4XSwgWzEyLCAzOV0sIFsxMSwgMjFdLCBbMTEsIDIxXSwgWzEyLCA0Ml0sIFsxMiwgNDNdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbMTAsIDBdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdLCBbNywgMTJdXTsKY29uc3QgYmxhY2tUYWJsZTMgPSBbWy0xLCAtMV0sIFstMSwgLTFdLCBbLTEsIC0xXSwgWy0xLCAtMV0sIFs2LCA5XSwgWzYsIDhdLCBbNSwgN10sIFs1LCA3XSwgWzQsIDZdLCBbNCwgNl0sIFs0LCA2XSwgWzQsIDZdLCBbNCwgNV0sIFs0LCA1XSwgWzQsIDVdLCBbNCwgNV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgMV0sIFszLCAxXSwgWzMsIDFdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzMsIDRdLCBbMywgNF0sIFszLCA0XSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgM10sIFsyLCAzXSwgWzIsIDNdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl0sIFsyLCAyXSwgWzIsIDJdLCBbMiwgMl1dOwpjbGFzcyBDQ0lUVEZheERlY29kZXIgewogIGNvbnN0cnVjdG9yKHNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7CiAgICBpZiAoIXNvdXJjZSB8fCB0eXBlb2Ygc291cmNlLm5leHQgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdDQ0lUVEZheERlY29kZXIgLSBpbnZhbGlkICJzb3VyY2UiIHBhcmFtZXRlci4nKTsKICAgIH0KICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgdGhpcy5lb2YgPSBmYWxzZTsKICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLksgfHwgMDsKICAgIHRoaXMuZW9saW5lID0gb3B0aW9ucy5FbmRPZkxpbmUgfHwgZmFsc2U7CiAgICB0aGlzLmJ5dGVBbGlnbiA9IG9wdGlvbnMuRW5jb2RlZEJ5dGVBbGlnbiB8fCBmYWxzZTsKICAgIHRoaXMuY29sdW1ucyA9IG9wdGlvbnMuQ29sdW1ucyB8fCAxNzI4OwogICAgdGhpcy5yb3dzID0gb3B0aW9ucy5Sb3dzIHx8IDA7CiAgICB0aGlzLmVvYmxvY2sgPSBvcHRpb25zLkVuZE9mQmxvY2sgPz8gdHJ1ZTsKICAgIHRoaXMuYmxhY2sgPSBvcHRpb25zLkJsYWNrSXMxIHx8IGZhbHNlOwogICAgdGhpcy5jb2RpbmdMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDEpOwogICAgdGhpcy5yZWZMaW5lID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuY29sdW1ucyArIDIpOwogICAgdGhpcy5jb2RpbmdMaW5lWzBdID0gdGhpcy5jb2x1bW5zOwogICAgdGhpcy5jb2RpbmdQb3MgPSAwOwogICAgdGhpcy5yb3cgPSAwOwogICAgdGhpcy5uZXh0TGluZTJEID0gdGhpcy5lbmNvZGluZyA8IDA7CiAgICB0aGlzLmlucHV0Qml0cyA9IDA7CiAgICB0aGlzLmlucHV0QnVmID0gMDsKICAgIHRoaXMub3V0cHV0Qml0cyA9IDA7CiAgICB0aGlzLnJvd3NEb25lID0gZmFsc2U7CiAgICBsZXQgY29kZTE7CiAgICB3aGlsZSAoKGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpKSA9PT0gMCkgewogICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgfQogICAgaWYgKGNvZGUxID09PSAxKSB7CiAgICAgIHRoaXMuX2VhdEJpdHMoMTIpOwogICAgfQogICAgaWYgKHRoaXMuZW5jb2RpbmcgPiAwKSB7CiAgICAgIHRoaXMubmV4dExpbmUyRCA9ICF0aGlzLl9sb29rQml0cygxKTsKICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgIH0KICB9CiAgcmVhZE5leHRDaGFyKCkgewogICAgaWYgKHRoaXMuZW9mKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGNvbnN0IHJlZkxpbmUgPSB0aGlzLnJlZkxpbmU7CiAgICBjb25zdCBjb2RpbmdMaW5lID0gdGhpcy5jb2RpbmdMaW5lOwogICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uczsKICAgIGxldCByZWZQb3MsIGJsYWNrUGl4ZWxzLCBiaXRzLCBpOwogICAgaWYgKHRoaXMub3V0cHV0Qml0cyA9PT0gMCkgewogICAgICBpZiAodGhpcy5yb3dzRG9uZSkgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgdGhpcy5lcnIgPSBmYWxzZTsKICAgICAgbGV0IGNvZGUxLCBjb2RlMiwgY29kZTM7CiAgICAgIGlmICh0aGlzLm5leHRMaW5lMkQpIHsKICAgICAgICBmb3IgKGkgPSAwOyBjb2RpbmdMaW5lW2ldIDwgY29sdW1uczsgKytpKSB7CiAgICAgICAgICByZWZMaW5lW2ldID0gY29kaW5nTGluZVtpXTsKICAgICAgICB9CiAgICAgICAgcmVmTGluZVtpKytdID0gY29sdW1uczsKICAgICAgICByZWZMaW5lW2ldID0gY29sdW1uczsKICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICAgICAgcmVmUG9zID0gMDsKICAgICAgICBibGFja1BpeGVscyA9IDA7CiAgICAgICAgd2hpbGUgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgY29kZTEgPSB0aGlzLl9nZXRUd29EaW1Db2RlKCk7CiAgICAgICAgICBzd2l0Y2ggKGNvZGUxKSB7CiAgICAgICAgICAgIGNhc2UgdHdvRGltUGFzczoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3MgKyAxXSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGlmIChyZWZMaW5lW3JlZlBvcyArIDFdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbUhvcml6OgogICAgICAgICAgICAgIGNvZGUxID0gY29kZTIgPSAwOwogICAgICAgICAgICAgIGlmIChibGFja1BpeGVscykgewogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICBjb2RlMSArPSBjb2RlMyA9IHRoaXMuX2dldEJsYWNrQ29kZSgpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICBjb2RlMiArPSBjb2RlMyA9IHRoaXMuX2dldFdoaXRlQ29kZSgpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgIGNvZGUyICs9IGNvZGUzID0gdGhpcy5fZ2V0QmxhY2tDb2RlKCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChjb2RlMyA+PSA2NCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICsgY29kZTIsIGJsYWNrUGl4ZWxzIF4gMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMzoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMywgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMjoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMiwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRSMToKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMocmVmTGluZVtyZWZQb3NdICsgMSwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnQwOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhyZWZMaW5lW3JlZlBvc10sIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSB0d29EaW1WZXJ0TDM6CiAgICAgICAgICAgICAgdGhpcy5fYWRkUGl4ZWxzTmVnKHJlZkxpbmVbcmVmUG9zXSAtIDMsIGJsYWNrUGl4ZWxzKTsKICAgICAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIGlmIChyZWZQb3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgIC0tcmVmUG9zOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgKytyZWZQb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAocmVmTGluZVtyZWZQb3NdIDw9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdICYmIHJlZkxpbmVbcmVmUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgcmVmUG9zICs9IDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHR3b0RpbVZlcnRMMjoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHNOZWcocmVmTGluZVtyZWZQb3NdIC0gMiwgYmxhY2tQaXhlbHMpOwogICAgICAgICAgICAgIGJsYWNrUGl4ZWxzIF49IDE7CiAgICAgICAgICAgICAgaWYgKGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgaWYgKHJlZlBvcyA+IDApIHsKICAgICAgICAgICAgICAgICAgLS1yZWZQb3M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICArK3JlZlBvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChyZWZMaW5lW3JlZlBvc10gPD0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gJiYgcmVmTGluZVtyZWZQb3NdIDwgY29sdW1ucykgewogICAgICAgICAgICAgICAgICByZWZQb3MgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgdHdvRGltVmVydEwxOgogICAgICAgICAgICAgIHRoaXMuX2FkZFBpeGVsc05lZyhyZWZMaW5lW3JlZlBvc10gLSAxLCBibGFja1BpeGVscyk7CiAgICAgICAgICAgICAgYmxhY2tQaXhlbHMgXj0gMTsKICAgICAgICAgICAgICBpZiAoY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICBpZiAocmVmUG9zID4gMCkgewogICAgICAgICAgICAgICAgICAtLXJlZlBvczsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICsrcmVmUG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHJlZkxpbmVbcmVmUG9zXSA8PSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAmJiByZWZMaW5lW3JlZlBvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgIHJlZlBvcyArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBjY2l0dEVPRjoKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CiAgICAgICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIDJkIGNvZGUiKTsKICAgICAgICAgICAgICB0aGlzLl9hZGRQaXhlbHMoY29sdW1ucywgMCk7CiAgICAgICAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RpbmdMaW5lWzBdID0gMDsKICAgICAgICB0aGlzLmNvZGluZ1BvcyA9IDA7CiAgICAgICAgYmxhY2tQaXhlbHMgPSAwOwogICAgICAgIHdoaWxlIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgIGNvZGUxID0gMDsKICAgICAgICAgIGlmIChibGFja1BpeGVscykgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgY29kZTEgKz0gY29kZTMgPSB0aGlzLl9nZXRCbGFja0NvZGUoKTsKICAgICAgICAgICAgfSB3aGlsZSAoY29kZTMgPj0gNjQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNvZGUxICs9IGNvZGUzID0gdGhpcy5fZ2V0V2hpdGVDb2RlKCk7CiAgICAgICAgICAgIH0gd2hpbGUgKGNvZGUzID49IDY0KTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX2FkZFBpeGVscyhjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSArIGNvZGUxLCBibGFja1BpeGVscyk7CiAgICAgICAgICBibGFja1BpeGVscyBePSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZ290RU9MID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIHRoaXMuaW5wdXRCaXRzICY9IH43OwogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2Jsb2NrICYmIHRoaXMucm93ID09PSB0aGlzLnJvd3MgLSAxKSB7CiAgICAgICAgdGhpcy5yb3dzRG9uZSA9IHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgaWYgKHRoaXMuZW9saW5lKSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgIT09IGNjaXR0RU9GICYmIGNvZGUxICE9PSAxKSB7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aGlsZSAoY29kZTEgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBnb3RFT0wgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghdGhpcy5lb2YgJiYgdGhpcy5lbmNvZGluZyA+IDAgJiYgIXRoaXMucm93c0RvbmUpIHsKICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgfQogICAgICBpZiAodGhpcy5lb2Jsb2NrICYmIGdvdEVPTCAmJiB0aGlzLmJ5dGVBbGlnbikgewogICAgICAgIGNvZGUxID0gdGhpcy5fbG9va0JpdHMoMTIpOwogICAgICAgIGlmIChjb2RlMSA9PT0gMSkgewogICAgICAgICAgdGhpcy5fZWF0Qml0cygxMik7CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgICAgdGhpcy5fbG9va0JpdHMoMSk7CiAgICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+PSAwKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBjb2RlMSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgICAgICAgICBpZiAoY29kZTEgIT09IDEpIHsKICAgICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIHJ0YyBjb2RlOiAiICsgY29kZTEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xvb2tCaXRzKDEpOwogICAgICAgICAgICAgICAgdGhpcy5fZWF0Qml0cygxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5lcnIgJiYgdGhpcy5lb2xpbmUpIHsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgY29kZTEgPSB0aGlzLl9sb29rQml0cygxMyk7CiAgICAgICAgICBpZiAoY29kZTEgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvZGUxID4+IDEgPT09IDEpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lYXRCaXRzKDEyKTsKICAgICAgICBpZiAodGhpcy5lbmNvZGluZyA+IDApIHsKICAgICAgICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICAgICAgICB0aGlzLm5leHRMaW5lMkQgPSAhKGNvZGUxICYgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjb2RpbmdMaW5lWzBdID4gMCkgewogICAgICAgIHRoaXMub3V0cHV0Qml0cyA9IGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgPSAwXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zID0gMV07CiAgICAgIH0KICAgICAgdGhpcy5yb3crKzsKICAgIH0KICAgIGxldCBjOwogICAgaWYgKHRoaXMub3V0cHV0Qml0cyA+PSA4KSB7CiAgICAgIGMgPSB0aGlzLmNvZGluZ1BvcyAmIDEgPyAwIDogMHhmZjsKICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IDg7CiAgICAgIGlmICh0aGlzLm91dHB1dEJpdHMgPT09IDAgJiYgY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gPCBjb2x1bW5zKSB7CiAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICB0aGlzLm91dHB1dEJpdHMgPSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSAtIGNvZGluZ0xpbmVbdGhpcy5jb2RpbmdQb3MgLSAxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgYml0cyA9IDg7CiAgICAgIGMgPSAwOwogICAgICBkbyB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm91dHB1dEJpdHMgIT09ICJudW1iZXIiKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ0ludmFsaWQgL0NDSVRURmF4RGVjb2RlIGRhdGEsICJvdXRwdXRCaXRzIiBtdXN0IGJlIGEgbnVtYmVyLicpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vdXRwdXRCaXRzID4gYml0cykgewogICAgICAgICAgYyA8PD0gYml0czsKICAgICAgICAgIGlmICghKHRoaXMuY29kaW5nUG9zICYgMSkpIHsKICAgICAgICAgICAgYyB8PSAweGZmID4+IDggLSBiaXRzOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzIC09IGJpdHM7CiAgICAgICAgICBiaXRzID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYyA8PD0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgaWYgKCEodGhpcy5jb2RpbmdQb3MgJiAxKSkgewogICAgICAgICAgICBjIHw9IDB4ZmYgPj4gOCAtIHRoaXMub3V0cHV0Qml0czsKICAgICAgICAgIH0KICAgICAgICAgIGJpdHMgLT0gdGhpcy5vdXRwdXRCaXRzOwogICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gMDsKICAgICAgICAgIGlmIChjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zXSA8IGNvbHVtbnMpIHsKICAgICAgICAgICAgdGhpcy5jb2RpbmdQb3MrKzsKICAgICAgICAgICAgdGhpcy5vdXRwdXRCaXRzID0gY29kaW5nTGluZVt0aGlzLmNvZGluZ1Bvc10gLSBjb2RpbmdMaW5lW3RoaXMuY29kaW5nUG9zIC0gMV07CiAgICAgICAgICB9IGVsc2UgaWYgKGJpdHMgPiAwKSB7CiAgICAgICAgICAgIGMgPDw9IGJpdHM7CiAgICAgICAgICAgIGJpdHMgPSAwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSAoYml0cyk7CiAgICB9CiAgICBpZiAodGhpcy5ibGFjaykgewogICAgICBjIF49IDB4ZmY7CiAgICB9CiAgICByZXR1cm4gYzsKICB9CiAgX2FkZFBpeGVscyhhMSwgYmxhY2tQaXhlbHMpIHsKICAgIGNvbnN0IGNvZGluZ0xpbmUgPSB0aGlzLmNvZGluZ0xpbmU7CiAgICBsZXQgY29kaW5nUG9zID0gdGhpcy5jb2RpbmdQb3M7CiAgICBpZiAoYTEgPiBjb2RpbmdMaW5lW2NvZGluZ1Bvc10pIHsKICAgICAgaWYgKGExID4gdGhpcy5jb2x1bW5zKSB7CiAgICAgICAgKDAsIF91dGlsLmluZm8pKCJyb3cgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgICAgdGhpcy5lcnIgPSB0cnVlOwogICAgICAgIGExID0gdGhpcy5jb2x1bW5zOwogICAgICB9CiAgICAgIGlmIChjb2RpbmdQb3MgJiAxIF4gYmxhY2tQaXhlbHMpIHsKICAgICAgICArK2NvZGluZ1BvczsKICAgICAgfQogICAgICBjb2RpbmdMaW5lW2NvZGluZ1Bvc10gPSBhMTsKICAgIH0KICAgIHRoaXMuY29kaW5nUG9zID0gY29kaW5nUG9zOwogIH0KICBfYWRkUGl4ZWxzTmVnKGExLCBibGFja1BpeGVscykgewogICAgY29uc3QgY29kaW5nTGluZSA9IHRoaXMuY29kaW5nTGluZTsKICAgIGxldCBjb2RpbmdQb3MgPSB0aGlzLmNvZGluZ1BvczsKICAgIGlmIChhMSA+IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgewogICAgICBpZiAoYTEgPiB0aGlzLmNvbHVtbnMpIHsKICAgICAgICAoMCwgX3V0aWwuaW5mbykoInJvdyBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgICB0aGlzLmVyciA9IHRydWU7CiAgICAgICAgYTEgPSB0aGlzLmNvbHVtbnM7CiAgICAgIH0KICAgICAgaWYgKGNvZGluZ1BvcyAmIDEgXiBibGFja1BpeGVscykgewogICAgICAgICsrY29kaW5nUG9zOwogICAgICB9CiAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOwogICAgfSBlbHNlIGlmIChhMSA8IGNvZGluZ0xpbmVbY29kaW5nUG9zXSkgewogICAgICBpZiAoYTEgPCAwKSB7CiAgICAgICAgKDAsIF91dGlsLmluZm8pKCJpbnZhbGlkIGNvZGUiKTsKICAgICAgICB0aGlzLmVyciA9IHRydWU7CiAgICAgICAgYTEgPSAwOwogICAgICB9CiAgICAgIHdoaWxlIChjb2RpbmdQb3MgPiAwICYmIGExIDwgY29kaW5nTGluZVtjb2RpbmdQb3MgLSAxXSkgewogICAgICAgIC0tY29kaW5nUG9zOwogICAgICB9CiAgICAgIGNvZGluZ0xpbmVbY29kaW5nUG9zXSA9IGExOwogICAgfQogICAgdGhpcy5jb2RpbmdQb3MgPSBjb2RpbmdQb3M7CiAgfQogIF9maW5kVGFibGVDb2RlKHN0YXJ0LCBlbmQsIHRhYmxlLCBsaW1pdCkgewogICAgY29uc3QgbGltaXRWYWx1ZSA9IGxpbWl0IHx8IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgbGV0IGNvZGUgPSB0aGlzLl9sb29rQml0cyhpKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIFt0cnVlLCAxLCBmYWxzZV07CiAgICAgIH0KICAgICAgaWYgKGkgPCBlbmQpIHsKICAgICAgICBjb2RlIDw8PSBlbmQgLSBpOwogICAgICB9CiAgICAgIGlmICghbGltaXRWYWx1ZSB8fCBjb2RlID49IGxpbWl0VmFsdWUpIHsKICAgICAgICBjb25zdCBwID0gdGFibGVbY29kZSAtIGxpbWl0VmFsdWVdOwogICAgICAgIGlmIChwWzBdID09PSBpKSB7CiAgICAgICAgICB0aGlzLl9lYXRCaXRzKGkpOwogICAgICAgICAgcmV0dXJuIFt0cnVlLCBwWzFdLCB0cnVlXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbZmFsc2UsIDAsIGZhbHNlXTsKICB9CiAgX2dldFR3b0RpbUNvZGUoKSB7CiAgICBsZXQgY29kZSA9IDA7CiAgICBsZXQgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDcpOwogICAgICBwID0gdHdvRGltVGFibGVbY29kZV07CiAgICAgIGlmIChwPy5bMF0gPiAwKSB7CiAgICAgICAgdGhpcy5fZWF0Qml0cyhwWzBdKTsKICAgICAgICByZXR1cm4gcFsxXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA3LCB0d29EaW1UYWJsZSk7CiAgICAgIGlmIChyZXN1bHRbMF0gJiYgcmVzdWx0WzJdKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdFsxXTsKICAgICAgfQogICAgfQogICAgKDAsIF91dGlsLmluZm8pKCJCYWQgdHdvIGRpbSBjb2RlIik7CiAgICByZXR1cm4gY2NpdHRFT0Y7CiAgfQogIF9nZXRXaGl0ZUNvZGUoKSB7CiAgICBsZXQgY29kZSA9IDA7CiAgICBsZXQgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEyKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgaWYgKGNvZGUgPj4gNSA9PT0gMCkgewogICAgICAgIHAgPSB3aGl0ZVRhYmxlMVtjb2RlXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwID0gd2hpdGVUYWJsZTJbY29kZSA+PiAzXTsKICAgICAgfQogICAgICBpZiAocFswXSA+IDApIHsKICAgICAgICB0aGlzLl9lYXRCaXRzKHBbMF0pOwogICAgICAgIHJldHVybiBwWzFdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxLCA5LCB3aGl0ZVRhYmxlMik7CiAgICAgIGlmIChyZXN1bHRbMF0pIHsKICAgICAgICByZXR1cm4gcmVzdWx0WzFdOwogICAgICB9CiAgICAgIHJlc3VsdCA9IHRoaXMuX2ZpbmRUYWJsZUNvZGUoMTEsIDEyLCB3aGl0ZVRhYmxlMSk7CiAgICAgIGlmIChyZXN1bHRbMF0pIHsKICAgICAgICByZXR1cm4gcmVzdWx0WzFdOwogICAgICB9CiAgICB9CiAgICAoMCwgX3V0aWwuaW5mbykoImJhZCB3aGl0ZSBjb2RlIik7CiAgICB0aGlzLl9lYXRCaXRzKDEpOwogICAgcmV0dXJuIDE7CiAgfQogIF9nZXRCbGFja0NvZGUoKSB7CiAgICBsZXQgY29kZSwgcDsKICAgIGlmICh0aGlzLmVvYmxvY2spIHsKICAgICAgY29kZSA9IHRoaXMuX2xvb2tCaXRzKDEzKTsKICAgICAgaWYgKGNvZGUgPT09IGNjaXR0RU9GKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICAgICAgaWYgKGNvZGUgPj4gNyA9PT0gMCkgewogICAgICAgIHAgPSBibGFja1RhYmxlMVtjb2RlXTsKICAgICAgfSBlbHNlIGlmIChjb2RlID4+IDkgPT09IDAgJiYgY29kZSA+PiA3ICE9PSAwKSB7CiAgICAgICAgcCA9IGJsYWNrVGFibGUyWyhjb2RlID4+IDEpIC0gNjRdOwogICAgICB9IGVsc2UgewogICAgICAgIHAgPSBibGFja1RhYmxlM1tjb2RlID4+IDddOwogICAgICB9CiAgICAgIGlmIChwWzBdID4gMCkgewogICAgICAgIHRoaXMuX2VhdEJpdHMocFswXSk7CiAgICAgICAgcmV0dXJuIHBbMV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9maW5kVGFibGVDb2RlKDIsIDYsIGJsYWNrVGFibGUzKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSg3LCAxMiwgYmxhY2tUYWJsZTIsIDY0KTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgICAgcmVzdWx0ID0gdGhpcy5fZmluZFRhYmxlQ29kZSgxMCwgMTMsIGJsYWNrVGFibGUxKTsKICAgICAgaWYgKHJlc3VsdFswXSkgewogICAgICAgIHJldHVybiByZXN1bHRbMV07CiAgICAgIH0KICAgIH0KICAgICgwLCBfdXRpbC5pbmZvKSgiYmFkIGJsYWNrIGNvZGUiKTsKICAgIHRoaXMuX2VhdEJpdHMoMSk7CiAgICByZXR1cm4gMTsKICB9CiAgX2xvb2tCaXRzKG4pIHsKICAgIGxldCBjOwogICAgd2hpbGUgKHRoaXMuaW5wdXRCaXRzIDwgbikgewogICAgICBpZiAoKGMgPSB0aGlzLnNvdXJjZS5uZXh0KCkpID09PSAtMSkgewogICAgICAgIGlmICh0aGlzLmlucHV0Qml0cyA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIGNjaXR0RU9GOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEJ1ZiA8PCBuIC0gdGhpcy5pbnB1dEJpdHMgJiAweGZmZmYgPj4gMTYgLSBuOwogICAgICB9CiAgICAgIHRoaXMuaW5wdXRCdWYgPSB0aGlzLmlucHV0QnVmIDw8IDggfCBjOwogICAgICB0aGlzLmlucHV0Qml0cyArPSA4OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5wdXRCdWYgPj4gdGhpcy5pbnB1dEJpdHMgLSBuICYgMHhmZmZmID4+IDE2IC0gbjsKICB9CiAgX2VhdEJpdHMobikgewogICAgaWYgKCh0aGlzLmlucHV0Qml0cyAtPSBuKSA8IDApIHsKICAgICAgdGhpcy5pbnB1dEJpdHMgPSAwOwogICAgfQogIH0KfQpleHBvcnRzLkNDSVRURmF4RGVjb2RlciA9IENDSVRURmF4RGVjb2RlcjsKCi8qKiovIH0pLAovKiAyMiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkZsYXRlU3RyZWFtID0gdm9pZCAwOwp2YXIgX2RlY29kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY29uc3QgY29kZUxlbkNvZGVNYXAgPSBuZXcgSW50MzJBcnJheShbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV0pOwpjb25zdCBsZW5ndGhEZWNvZGUgPSBuZXcgSW50MzJBcnJheShbMHgwMDAwMywgMHgwMDAwNCwgMHgwMDAwNSwgMHgwMDAwNiwgMHgwMDAwNywgMHgwMDAwOCwgMHgwMDAwOSwgMHgwMDAwYSwgMHgxMDAwYiwgMHgxMDAwZCwgMHgxMDAwZiwgMHgxMDAxMSwgMHgyMDAxMywgMHgyMDAxNywgMHgyMDAxYiwgMHgyMDAxZiwgMHgzMDAyMywgMHgzMDAyYiwgMHgzMDAzMywgMHgzMDAzYiwgMHg0MDA0MywgMHg0MDA1MywgMHg0MDA2MywgMHg0MDA3MywgMHg1MDA4MywgMHg1MDBhMywgMHg1MDBjMywgMHg1MDBlMywgMHgwMDEwMiwgMHgwMDEwMiwgMHgwMDEwMl0pOwpjb25zdCBkaXN0RGVjb2RlID0gbmV3IEludDMyQXJyYXkoWzB4MDAwMDEsIDB4MDAwMDIsIDB4MDAwMDMsIDB4MDAwMDQsIDB4MTAwMDUsIDB4MTAwMDcsIDB4MjAwMDksIDB4MjAwMGQsIDB4MzAwMTEsIDB4MzAwMTksIDB4NDAwMjEsIDB4NDAwMzEsIDB4NTAwNDEsIDB4NTAwNjEsIDB4NjAwODEsIDB4NjAwYzEsIDB4NzAxMDEsIDB4NzAxODEsIDB4ODAyMDEsIDB4ODAzMDEsIDB4OTA0MDEsIDB4OTA2MDEsIDB4YTA4MDEsIDB4YTBjMDEsIDB4YjEwMDEsIDB4YjE4MDEsIDB4YzIwMDEsIDB4YzMwMDEsIDB4ZDQwMDEsIDB4ZDYwMDFdKTsKY29uc3QgZml4ZWRMaXRDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFsweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMwLCAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGEwLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUwLCAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkwLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQwLCAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIwLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYwLCAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM4LCAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE4LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU4LCAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk4LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ4LCAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI4LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY4LCAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM0LCAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE0LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU0LCAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk0LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ0LCAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI0LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY0LCAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNjLCAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFjLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVjLCAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDljLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRjLCAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJjLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZjLCAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMyLCAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEyLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUyLCAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkyLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQyLCAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIyLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYyLCAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNhLCAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFhLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGVhLCAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDlhLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRhLCAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJhLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZhLCAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM2LCAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE2LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU2LCAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk2LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ2LCAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI2LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY2LCAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNlLCAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFlLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVlLCAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDllLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRlLCAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJlLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZlLCAweDcwMTAwLCAweDgwMDUwLCAweDgwMDEwLCAweDgwMTE4LCAweDcwMTEwLCAweDgwMDcwLCAweDgwMDMwLCAweDkwMGMxLCAweDcwMTA4LCAweDgwMDYwLCAweDgwMDIwLCAweDkwMGExLCAweDgwMDAwLCAweDgwMDgwLCAweDgwMDQwLCAweDkwMGUxLCAweDcwMTA0LCAweDgwMDU4LCAweDgwMDE4LCAweDkwMDkxLCAweDcwMTE0LCAweDgwMDc4LCAweDgwMDM4LCAweDkwMGQxLCAweDcwMTBjLCAweDgwMDY4LCAweDgwMDI4LCAweDkwMGIxLCAweDgwMDA4LCAweDgwMDg4LCAweDgwMDQ4LCAweDkwMGYxLCAweDcwMTAyLCAweDgwMDU0LCAweDgwMDE0LCAweDgwMTFjLCAweDcwMTEyLCAweDgwMDc0LCAweDgwMDM0LCAweDkwMGM5LCAweDcwMTBhLCAweDgwMDY0LCAweDgwMDI0LCAweDkwMGE5LCAweDgwMDA0LCAweDgwMDg0LCAweDgwMDQ0LCAweDkwMGU5LCAweDcwMTA2LCAweDgwMDVjLCAweDgwMDFjLCAweDkwMDk5LCAweDcwMTE2LCAweDgwMDdjLCAweDgwMDNjLCAweDkwMGQ5LCAweDcwMTBlLCAweDgwMDZjLCAweDgwMDJjLCAweDkwMGI5LCAweDgwMDBjLCAweDgwMDhjLCAweDgwMDRjLCAweDkwMGY5LCAweDcwMTAxLCAweDgwMDUyLCAweDgwMDEyLCAweDgwMTFhLCAweDcwMTExLCAweDgwMDcyLCAweDgwMDMyLCAweDkwMGM1LCAweDcwMTA5LCAweDgwMDYyLCAweDgwMDIyLCAweDkwMGE1LCAweDgwMDAyLCAweDgwMDgyLCAweDgwMDQyLCAweDkwMGU1LCAweDcwMTA1LCAweDgwMDVhLCAweDgwMDFhLCAweDkwMDk1LCAweDcwMTE1LCAweDgwMDdhLCAweDgwMDNhLCAweDkwMGQ1LCAweDcwMTBkLCAweDgwMDZhLCAweDgwMDJhLCAweDkwMGI1LCAweDgwMDBhLCAweDgwMDhhLCAweDgwMDRhLCAweDkwMGY1LCAweDcwMTAzLCAweDgwMDU2LCAweDgwMDE2LCAweDgwMTFlLCAweDcwMTEzLCAweDgwMDc2LCAweDgwMDM2LCAweDkwMGNkLCAweDcwMTBiLCAweDgwMDY2LCAweDgwMDI2LCAweDkwMGFkLCAweDgwMDA2LCAweDgwMDg2LCAweDgwMDQ2LCAweDkwMGVkLCAweDcwMTA3LCAweDgwMDVlLCAweDgwMDFlLCAweDkwMDlkLCAweDcwMTE3LCAweDgwMDdlLCAweDgwMDNlLCAweDkwMGRkLCAweDcwMTBmLCAweDgwMDZlLCAweDgwMDJlLCAweDkwMGJkLCAweDgwMDBlLCAweDgwMDhlLCAweDgwMDRlLCAweDkwMGZkLCAweDcwMTAwLCAweDgwMDUxLCAweDgwMDExLCAweDgwMTE5LCAweDcwMTEwLCAweDgwMDcxLCAweDgwMDMxLCAweDkwMGMzLCAweDcwMTA4LCAweDgwMDYxLCAweDgwMDIxLCAweDkwMGEzLCAweDgwMDAxLCAweDgwMDgxLCAweDgwMDQxLCAweDkwMGUzLCAweDcwMTA0LCAweDgwMDU5LCAweDgwMDE5LCAweDkwMDkzLCAweDcwMTE0LCAweDgwMDc5LCAweDgwMDM5LCAweDkwMGQzLCAweDcwMTBjLCAweDgwMDY5LCAweDgwMDI5LCAweDkwMGIzLCAweDgwMDA5LCAweDgwMDg5LCAweDgwMDQ5LCAweDkwMGYzLCAweDcwMTAyLCAweDgwMDU1LCAweDgwMDE1LCAweDgwMTFkLCAweDcwMTEyLCAweDgwMDc1LCAweDgwMDM1LCAweDkwMGNiLCAweDcwMTBhLCAweDgwMDY1LCAweDgwMDI1LCAweDkwMGFiLCAweDgwMDA1LCAweDgwMDg1LCAweDgwMDQ1LCAweDkwMGViLCAweDcwMTA2LCAweDgwMDVkLCAweDgwMDFkLCAweDkwMDliLCAweDcwMTE2LCAweDgwMDdkLCAweDgwMDNkLCAweDkwMGRiLCAweDcwMTBlLCAweDgwMDZkLCAweDgwMDJkLCAweDkwMGJiLCAweDgwMDBkLCAweDgwMDhkLCAweDgwMDRkLCAweDkwMGZiLCAweDcwMTAxLCAweDgwMDUzLCAweDgwMDEzLCAweDgwMTFiLCAweDcwMTExLCAweDgwMDczLCAweDgwMDMzLCAweDkwMGM3LCAweDcwMTA5LCAweDgwMDYzLCAweDgwMDIzLCAweDkwMGE3LCAweDgwMDAzLCAweDgwMDgzLCAweDgwMDQzLCAweDkwMGU3LCAweDcwMTA1LCAweDgwMDViLCAweDgwMDFiLCAweDkwMDk3LCAweDcwMTE1LCAweDgwMDdiLCAweDgwMDNiLCAweDkwMGQ3LCAweDcwMTBkLCAweDgwMDZiLCAweDgwMDJiLCAweDkwMGI3LCAweDgwMDBiLCAweDgwMDhiLCAweDgwMDRiLCAweDkwMGY3LCAweDcwMTAzLCAweDgwMDU3LCAweDgwMDE3LCAweDgwMTFmLCAweDcwMTEzLCAweDgwMDc3LCAweDgwMDM3LCAweDkwMGNmLCAweDcwMTBiLCAweDgwMDY3LCAweDgwMDI3LCAweDkwMGFmLCAweDgwMDA3LCAweDgwMDg3LCAweDgwMDQ3LCAweDkwMGVmLCAweDcwMTA3LCAweDgwMDVmLCAweDgwMDFmLCAweDkwMDlmLCAweDcwMTE3LCAweDgwMDdmLCAweDgwMDNmLCAweDkwMGRmLCAweDcwMTBmLCAweDgwMDZmLCAweDgwMDJmLCAweDkwMGJmLCAweDgwMDBmLCAweDgwMDhmLCAweDgwMDRmLCAweDkwMGZmXSksIDldOwpjb25zdCBmaXhlZERpc3RDb2RlVGFiID0gW25ldyBJbnQzMkFycmF5KFsweDUwMDAwLCAweDUwMDEwLCAweDUwMDA4LCAweDUwMDE4LCAweDUwMDA0LCAweDUwMDE0LCAweDUwMDBjLCAweDUwMDFjLCAweDUwMDAyLCAweDUwMDEyLCAweDUwMDBhLCAweDUwMDFhLCAweDUwMDA2LCAweDUwMDE2LCAweDUwMDBlLCAweDAwMDAwLCAweDUwMDAxLCAweDUwMDExLCAweDUwMDA5LCAweDUwMDE5LCAweDUwMDA1LCAweDUwMDE1LCAweDUwMDBkLCAweDUwMDFkLCAweDUwMDAzLCAweDUwMDEzLCAweDUwMDBiLCAweDUwMDFiLCAweDUwMDA3LCAweDUwMDE3LCAweDUwMDBmLCAweDAwMDAwXSksIDVdOwpjbGFzcyBGbGF0ZVN0cmVhbSBleHRlbmRzIF9kZWNvZGVfc3RyZWFtLkRlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIGNvbnN0IGNtZiA9IHN0ci5nZXRCeXRlKCk7CiAgICBjb25zdCBmbGcgPSBzdHIuZ2V0Qnl0ZSgpOwogICAgaWYgKGNtZiA9PT0gLTEgfHwgZmxnID09PSAtMSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgaGVhZGVyIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTsKICAgIH0KICAgIGlmICgoY21mICYgMHgwZikgIT09IDB4MDgpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICBpZiAoKChjbWYgPDwgOCkgKyBmbGcpICUgMzEgIT09IDApIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBCYWQgRkNIRUNLIGluIGZsYXRlIHN0cmVhbTogJHtjbWZ9LCAke2ZsZ31gKTsKICAgIH0KICAgIGlmIChmbGcgJiAweDIwKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgRkRJQ1QgYml0IHNldCBpbiBmbGF0ZSBzdHJlYW06ICR7Y21mfSwgJHtmbGd9YCk7CiAgICB9CiAgICB0aGlzLmNvZGVTaXplID0gMDsKICAgIHRoaXMuY29kZUJ1ZiA9IDA7CiAgfQogIGdldEJpdHMoYml0cykgewogICAgY29uc3Qgc3RyID0gdGhpcy5zdHI7CiAgICBsZXQgY29kZVNpemUgPSB0aGlzLmNvZGVTaXplOwogICAgbGV0IGNvZGVCdWYgPSB0aGlzLmNvZGVCdWY7CiAgICBsZXQgYjsKICAgIHdoaWxlIChjb2RlU2l6ZSA8IGJpdHMpIHsKICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgIH0KICAgICAgY29kZUJ1ZiB8PSBiIDw8IGNvZGVTaXplOwogICAgICBjb2RlU2l6ZSArPSA4OwogICAgfQogICAgYiA9IGNvZGVCdWYgJiAoMSA8PCBiaXRzKSAtIDE7CiAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGJpdHM7CiAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLT0gYml0czsKICAgIHJldHVybiBiOwogIH0KICBnZXRDb2RlKHRhYmxlKSB7CiAgICBjb25zdCBzdHIgPSB0aGlzLnN0cjsKICAgIGNvbnN0IGNvZGVzID0gdGFibGVbMF07CiAgICBjb25zdCBtYXhMZW4gPSB0YWJsZVsxXTsKICAgIGxldCBjb2RlU2l6ZSA9IHRoaXMuY29kZVNpemU7CiAgICBsZXQgY29kZUJ1ZiA9IHRoaXMuY29kZUJ1ZjsKICAgIGxldCBiOwogICAgd2hpbGUgKGNvZGVTaXplIDwgbWF4TGVuKSB7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvZGVCdWYgfD0gYiA8PCBjb2RlU2l6ZTsKICAgICAgY29kZVNpemUgKz0gODsKICAgIH0KICAgIGNvbnN0IGNvZGUgPSBjb2Rlc1tjb2RlQnVmICYgKDEgPDwgbWF4TGVuKSAtIDFdOwogICAgY29uc3QgY29kZUxlbiA9IGNvZGUgPj4gMTY7CiAgICBjb25zdCBjb2RlVmFsID0gY29kZSAmIDB4ZmZmZjsKICAgIGlmIChjb2RlTGVuIDwgMSB8fCBjb2RlU2l6ZSA8IGNvZGVMZW4pIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgZW5jb2RpbmcgaW4gZmxhdGUgc3RyZWFtIik7CiAgICB9CiAgICB0aGlzLmNvZGVCdWYgPSBjb2RlQnVmID4+IGNvZGVMZW47CiAgICB0aGlzLmNvZGVTaXplID0gY29kZVNpemUgLSBjb2RlTGVuOwogICAgcmV0dXJuIGNvZGVWYWw7CiAgfQogIGdlbmVyYXRlSHVmZm1hblRhYmxlKGxlbmd0aHMpIHsKICAgIGNvbnN0IG4gPSBsZW5ndGhzLmxlbmd0aDsKICAgIGxldCBtYXhMZW4gPSAwOwogICAgbGV0IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChsZW5ndGhzW2ldID4gbWF4TGVuKSB7CiAgICAgICAgbWF4TGVuID0gbGVuZ3Roc1tpXTsKICAgICAgfQogICAgfQogICAgY29uc3Qgc2l6ZSA9IDEgPDwgbWF4TGVuOwogICAgY29uc3QgY29kZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTsKICAgIGZvciAobGV0IGxlbiA9IDEsIGNvZGUgPSAwLCBza2lwID0gMjsgbGVuIDw9IG1heExlbjsgKytsZW4sIGNvZGUgPDw9IDEsIHNraXAgPDw9IDEpIHsKICAgICAgZm9yIChsZXQgdmFsID0gMDsgdmFsIDwgbjsgKyt2YWwpIHsKICAgICAgICBpZiAobGVuZ3Roc1t2YWxdID09PSBsZW4pIHsKICAgICAgICAgIGxldCBjb2RlMiA9IDA7CiAgICAgICAgICBsZXQgdCA9IGNvZGU7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgICAgY29kZTIgPSBjb2RlMiA8PCAxIHwgdCAmIDE7CiAgICAgICAgICAgIHQgPj49IDE7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGkgPSBjb2RlMjsgaSA8IHNpemU7IGkgKz0gc2tpcCkgewogICAgICAgICAgICBjb2Rlc1tpXSA9IGxlbiA8PCAxNiB8IHZhbDsKICAgICAgICAgIH0KICAgICAgICAgICsrY29kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBbY29kZXMsIG1heExlbl07CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBidWZmZXIsIGxlbjsKICAgIGNvbnN0IHN0ciA9IHRoaXMuc3RyOwogICAgbGV0IGhkciA9IHRoaXMuZ2V0Qml0cygzKTsKICAgIGlmIChoZHIgJiAxKSB7CiAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgIH0KICAgIGhkciA+Pj0gMTsKICAgIGlmIChoZHIgPT09IDApIHsKICAgICAgbGV0IGI7CiAgICAgIGlmICgoYiA9IHN0ci5nZXRCeXRlKCkpID09PSAtMSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQmFkIGJsb2NrIGhlYWRlciBpbiBmbGF0ZSBzdHJlYW0iKTsKICAgICAgfQogICAgICBsZXQgYmxvY2tMZW4gPSBiOwogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgIH0KICAgICAgYmxvY2tMZW4gfD0gYiA8PCA4OwogICAgICBpZiAoKGIgPSBzdHIuZ2V0Qnl0ZSgpKSA9PT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkJhZCBibG9jayBoZWFkZXIgaW4gZmxhdGUgc3RyZWFtIik7CiAgICAgIH0KICAgICAgbGV0IGNoZWNrID0gYjsKICAgICAgaWYgKChiID0gc3RyLmdldEJ5dGUoKSkgPT09IC0xKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgYmxvY2sgaGVhZGVyIGluIGZsYXRlIHN0cmVhbSIpOwogICAgICB9CiAgICAgIGNoZWNrIHw9IGIgPDwgODsKICAgICAgaWYgKGNoZWNrICE9PSAofmJsb2NrTGVuICYgMHhmZmZmKSAmJiAoYmxvY2tMZW4gIT09IDAgfHwgY2hlY2sgIT09IDApKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgdW5jb21wcmVzc2VkIGJsb2NrIGxlbmd0aCBpbiBmbGF0ZSBzdHJlYW0iKTsKICAgICAgfQogICAgICB0aGlzLmNvZGVCdWYgPSAwOwogICAgICB0aGlzLmNvZGVTaXplID0gMDsKICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGgsCiAgICAgICAgZW5kID0gYnVmZmVyTGVuZ3RoICsgYmxvY2tMZW47CiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGVuZCk7CiAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gZW5kOwogICAgICBpZiAoYmxvY2tMZW4gPT09IDApIHsKICAgICAgICBpZiAoc3RyLnBlZWtCeXRlKCkgPT09IC0xKSB7CiAgICAgICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGJsb2NrID0gc3RyLmdldEJ5dGVzKGJsb2NrTGVuKTsKICAgICAgICBidWZmZXIuc2V0KGJsb2NrLCBidWZmZXJMZW5ndGgpOwogICAgICAgIGlmIChibG9jay5sZW5ndGggPCBibG9ja0xlbikgewogICAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgbGl0Q29kZVRhYmxlOwogICAgbGV0IGRpc3RDb2RlVGFibGU7CiAgICBpZiAoaGRyID09PSAxKSB7CiAgICAgIGxpdENvZGVUYWJsZSA9IGZpeGVkTGl0Q29kZVRhYjsKICAgICAgZGlzdENvZGVUYWJsZSA9IGZpeGVkRGlzdENvZGVUYWI7CiAgICB9IGVsc2UgaWYgKGhkciA9PT0gMikgewogICAgICBjb25zdCBudW1MaXRDb2RlcyA9IHRoaXMuZ2V0Qml0cyg1KSArIDI1NzsKICAgICAgY29uc3QgbnVtRGlzdENvZGVzID0gdGhpcy5nZXRCaXRzKDUpICsgMTsKICAgICAgY29uc3QgbnVtQ29kZUxlbkNvZGVzID0gdGhpcy5nZXRCaXRzKDQpICsgNDsKICAgICAgY29uc3QgY29kZUxlbkNvZGVMZW5ndGhzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbkNvZGVNYXAubGVuZ3RoKTsKICAgICAgbGV0IGk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1Db2RlTGVuQ29kZXM7ICsraSkgewogICAgICAgIGNvZGVMZW5Db2RlTGVuZ3Roc1tjb2RlTGVuQ29kZU1hcFtpXV0gPSB0aGlzLmdldEJpdHMoMyk7CiAgICAgIH0KICAgICAgY29uc3QgY29kZUxlbkNvZGVUYWIgPSB0aGlzLmdlbmVyYXRlSHVmZm1hblRhYmxlKGNvZGVMZW5Db2RlTGVuZ3Rocyk7CiAgICAgIGxlbiA9IDA7CiAgICAgIGkgPSAwOwogICAgICBjb25zdCBjb2RlcyA9IG51bUxpdENvZGVzICsgbnVtRGlzdENvZGVzOwogICAgICBjb25zdCBjb2RlTGVuZ3RocyA9IG5ldyBVaW50OEFycmF5KGNvZGVzKTsKICAgICAgbGV0IGJpdHNMZW5ndGgsIGJpdHNPZmZzZXQsIHdoYXQ7CiAgICAgIHdoaWxlIChpIDwgY29kZXMpIHsKICAgICAgICBjb25zdCBjb2RlID0gdGhpcy5nZXRDb2RlKGNvZGVMZW5Db2RlVGFiKTsKICAgICAgICBpZiAoY29kZSA9PT0gMTYpIHsKICAgICAgICAgIGJpdHNMZW5ndGggPSAyOwogICAgICAgICAgYml0c09mZnNldCA9IDM7CiAgICAgICAgICB3aGF0ID0gbGVuOwogICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMTcpIHsKICAgICAgICAgIGJpdHNMZW5ndGggPSAzOwogICAgICAgICAgYml0c09mZnNldCA9IDM7CiAgICAgICAgICB3aGF0ID0gbGVuID0gMDsKICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDE4KSB7CiAgICAgICAgICBiaXRzTGVuZ3RoID0gNzsKICAgICAgICAgIGJpdHNPZmZzZXQgPSAxMTsKICAgICAgICAgIHdoYXQgPSBsZW4gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gbGVuID0gY29kZTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBsZXQgcmVwZWF0TGVuZ3RoID0gdGhpcy5nZXRCaXRzKGJpdHNMZW5ndGgpICsgYml0c09mZnNldDsKICAgICAgICB3aGlsZSAocmVwZWF0TGVuZ3RoLS0gPiAwKSB7CiAgICAgICAgICBjb2RlTGVuZ3Roc1tpKytdID0gd2hhdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgbGl0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheSgwLCBudW1MaXRDb2RlcykpOwogICAgICBkaXN0Q29kZVRhYmxlID0gdGhpcy5nZW5lcmF0ZUh1ZmZtYW5UYWJsZShjb2RlTGVuZ3Rocy5zdWJhcnJheShudW1MaXRDb2RlcywgY29kZXMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBibG9jayB0eXBlIGluIGZsYXRlIHN0cmVhbSIpOwogICAgfQogICAgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICBsZXQgbGltaXQgPSBidWZmZXIgPyBidWZmZXIubGVuZ3RoIDogMDsKICAgIGxldCBwb3MgPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGxldCBjb2RlMSA9IHRoaXMuZ2V0Q29kZShsaXRDb2RlVGFibGUpOwogICAgICBpZiAoY29kZTEgPCAyNTYpIHsKICAgICAgICBpZiAocG9zICsgMSA+PSBsaW1pdCkgewogICAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgMSk7CiAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGJ1ZmZlcltwb3MrK10gPSBjb2RlMTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoY29kZTEgPT09IDI1NikgewogICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gcG9zOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb2RlMSAtPSAyNTc7CiAgICAgIGNvZGUxID0gbGVuZ3RoRGVjb2RlW2NvZGUxXTsKICAgICAgbGV0IGNvZGUyID0gY29kZTEgPj4gMTY7CiAgICAgIGlmIChjb2RlMiA+IDApIHsKICAgICAgICBjb2RlMiA9IHRoaXMuZ2V0Qml0cyhjb2RlMik7CiAgICAgIH0KICAgICAgbGVuID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyOwogICAgICBjb2RlMSA9IHRoaXMuZ2V0Q29kZShkaXN0Q29kZVRhYmxlKTsKICAgICAgY29kZTEgPSBkaXN0RGVjb2RlW2NvZGUxXTsKICAgICAgY29kZTIgPSBjb2RlMSA+PiAxNjsKICAgICAgaWYgKGNvZGUyID4gMCkgewogICAgICAgIGNvZGUyID0gdGhpcy5nZXRCaXRzKGNvZGUyKTsKICAgICAgfQogICAgICBjb25zdCBkaXN0ID0gKGNvZGUxICYgMHhmZmZmKSArIGNvZGUyOwogICAgICBpZiAocG9zICsgbGVuID49IGxpbWl0KSB7CiAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIocG9zICsgbGVuKTsKICAgICAgICBsaW1pdCA9IGJ1ZmZlci5sZW5ndGg7CiAgICAgIH0KICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsZW47ICsraywgKytwb3MpIHsKICAgICAgICBidWZmZXJbcG9zXSA9IGJ1ZmZlcltwb3MgLSBkaXN0XTsKICAgICAgfQogICAgfQogIH0KfQpleHBvcnRzLkZsYXRlU3RyZWFtID0gRmxhdGVTdHJlYW07CgovKioqLyB9KSwKLyogMjMgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5KYmlnMlN0cmVhbSA9IHZvaWQgMDsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfZGVjb2RlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwp2YXIgX2piaWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI0KTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgSmJpZzJTdHJlYW0gZXh0ZW5kcyBfZGVjb2RlX3N0cmVhbS5EZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLmRpY3QgPSBzdHJlYW0uZGljdDsKICAgIHRoaXMubWF5YmVMZW5ndGggPSBtYXliZUxlbmd0aDsKICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogIH0KICBnZXQgYnl0ZXMoKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJ5dGVzIiwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZXModGhpcy5tYXliZUxlbmd0aCkpOwogIH0KICBlbnN1cmVCdWZmZXIocmVxdWVzdGVkKSB7fQogIHJlYWRCbG9jaygpIHsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBqYmlnMkltYWdlID0gbmV3IF9qYmlnLkpiaWcySW1hZ2UoKTsKICAgIGNvbnN0IGNodW5rcyA9IFtdOwogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBjb25zdCBnbG9iYWxzU3RyZWFtID0gdGhpcy5wYXJhbXMuZ2V0KCJKQklHMkdsb2JhbHMiKTsKICAgICAgaWYgKGdsb2JhbHNTdHJlYW0gaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgICAgIGNvbnN0IGdsb2JhbHMgPSBnbG9iYWxzU3RyZWFtLmdldEJ5dGVzKCk7CiAgICAgICAgY2h1bmtzLnB1c2goewogICAgICAgICAgZGF0YTogZ2xvYmFscywKICAgICAgICAgIHN0YXJ0OiAwLAogICAgICAgICAgZW5kOiBnbG9iYWxzLmxlbmd0aAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICBjaHVua3MucHVzaCh7CiAgICAgIGRhdGE6IHRoaXMuYnl0ZXMsCiAgICAgIHN0YXJ0OiAwLAogICAgICBlbmQ6IHRoaXMuYnl0ZXMubGVuZ3RoCiAgICB9KTsKICAgIGNvbnN0IGRhdGEgPSBqYmlnMkltYWdlLnBhcnNlQ2h1bmtzKGNodW5rcyk7CiAgICBjb25zdCBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykgewogICAgICBkYXRhW2ldIF49IDB4ZmY7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGFMZW5ndGg7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgfQp9CmV4cG9ydHMuSmJpZzJTdHJlYW0gPSBKYmlnMlN0cmVhbTsKCi8qKiovIH0pLAovKiAyNCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkpiaWcySW1hZ2UgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfYXJpdGhtZXRpY19kZWNvZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7CnZhciBfY2NpdHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTsKY2xhc3MgSmJpZzJFcnJvciBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIoYEpCSUcyIGVycm9yOiAke21zZ31gLCAiSmJpZzJFcnJvciIpOwogIH0KfQpjbGFzcyBDb250ZXh0Q2FjaGUgewogIGdldENvbnRleHRzKGlkKSB7CiAgICBpZiAoaWQgaW4gdGhpcykgewogICAgICByZXR1cm4gdGhpc1tpZF07CiAgICB9CiAgICByZXR1cm4gdGhpc1tpZF0gPSBuZXcgSW50OEFycmF5KDEgPDwgMTYpOwogIH0KfQpjbGFzcyBEZWNvZGluZ0NvbnRleHQgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICB9CiAgZ2V0IGRlY29kZXIoKSB7CiAgICBjb25zdCBkZWNvZGVyID0gbmV3IF9hcml0aG1ldGljX2RlY29kZXIuQXJpdGhtZXRpY0RlY29kZXIodGhpcy5kYXRhLCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRlY29kZXIiLCBkZWNvZGVyKTsKICB9CiAgZ2V0IGNvbnRleHRDYWNoZSgpIHsKICAgIGNvbnN0IGNhY2hlID0gbmV3IENvbnRleHRDYWNoZSgpOwogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJjb250ZXh0Q2FjaGUiLCBjYWNoZSk7CiAgfQp9CmNvbnN0IE1BWF9JTlRfMzIgPSAyICoqIDMxIC0gMTsKY29uc3QgTUlOX0lOVF8zMiA9IC0oMiAqKiAzMSk7CmZ1bmN0aW9uIGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCBwcm9jZWR1cmUsIGRlY29kZXIpIHsKICBjb25zdCBjb250ZXh0cyA9IGNvbnRleHRDYWNoZS5nZXRDb250ZXh0cyhwcm9jZWR1cmUpOwogIGxldCBwcmV2ID0gMTsKICBmdW5jdGlvbiByZWFkQml0cyhsZW5ndGgpIHsKICAgIGxldCB2ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYml0ID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBwcmV2KTsKICAgICAgcHJldiA9IHByZXYgPCAyNTYgPyBwcmV2IDw8IDEgfCBiaXQgOiAocHJldiA8PCAxIHwgYml0KSAmIDUxMSB8IDI1NjsKICAgICAgdiA9IHYgPDwgMSB8IGJpdDsKICAgIH0KICAgIHJldHVybiB2ID4+PiAwOwogIH0KICBjb25zdCBzaWduID0gcmVhZEJpdHMoMSk7CiAgY29uc3QgdmFsdWUgPSByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMSkgPyByZWFkQml0cygxKSA/IHJlYWRCaXRzKDEpID8gcmVhZEJpdHMoMzIpICsgNDQzNiA6IHJlYWRCaXRzKDEyKSArIDM0MCA6IHJlYWRCaXRzKDgpICsgODQgOiByZWFkQml0cyg2KSArIDIwIDogcmVhZEJpdHMoNCkgKyA0IDogcmVhZEJpdHMoMik7CiAgbGV0IHNpZ25lZFZhbHVlOwogIGlmIChzaWduID09PSAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IHZhbHVlOwogIH0gZWxzZSBpZiAodmFsdWUgPiAwKSB7CiAgICBzaWduZWRWYWx1ZSA9IC12YWx1ZTsKICB9CiAgaWYgKHNpZ25lZFZhbHVlID49IE1JTl9JTlRfMzIgJiYgc2lnbmVkVmFsdWUgPD0gTUFYX0lOVF8zMikgewogICAgcmV0dXJuIHNpZ25lZFZhbHVlOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2RlciwgY29kZUxlbmd0aCkgewogIGNvbnN0IGNvbnRleHRzID0gY29udGV4dENhY2hlLmdldENvbnRleHRzKCJJQUlEIik7CiAgbGV0IHByZXYgPSAxOwogIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBiaXQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHByZXYpOwogICAgcHJldiA9IHByZXYgPDwgMSB8IGJpdDsKICB9CiAgaWYgKGNvZGVMZW5ndGggPCAzMSkgewogICAgcmV0dXJuIHByZXYgJiAoMSA8PCBjb2RlTGVuZ3RoKSAtIDE7CiAgfQogIHJldHVybiBwcmV2ICYgMHg3ZmZmZmZmZjsKfQpjb25zdCBTZWdtZW50VHlwZXMgPSBbIlN5bWJvbERpY3Rpb25hcnkiLCBudWxsLCBudWxsLCBudWxsLCAiSW50ZXJtZWRpYXRlVGV4dFJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVUZXh0UmVnaW9uIiwgIkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYXR0ZXJuRGljdGlvbmFyeSIsIG51bGwsIG51bGwsIG51bGwsICJJbnRlcm1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsIG51bGwsICJJbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIkludGVybWVkaWF0ZUdlbmVyaWNSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZ2lvbiIsICJJbW1lZGlhdGVMb3NzbGVzc0dlbmVyaWNSZWdpb24iLCAiSW50ZXJtZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCBudWxsLCAiSW1tZWRpYXRlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24iLCAiSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVmaW5lbWVudFJlZ2lvbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJQYWdlSW5mb3JtYXRpb24iLCAiRW5kT2ZQYWdlIiwgIkVuZE9mU3RyaXBlIiwgIkVuZE9mRmlsZSIsICJQcm9maWxlcyIsICJUYWJsZXMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiRXh0ZW5zaW9uIl07CmNvbnN0IENvZGluZ1RlbXBsYXRlcyA9IFtbewogIHg6IC0xLAogIHk6IC0yCn0sIHsKICB4OiAwLAogIHk6IC0yCn0sIHsKICB4OiAxLAogIHk6IC0yCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IDIsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV0sIFt7CiAgeDogLTEsCiAgeTogLTIKfSwgewogIHg6IDAsCiAgeTogLTIKfSwgewogIHg6IDEsCiAgeTogLTIKfSwgewogIHg6IDIsCiAgeTogLTIKfSwgewogIHg6IC0yLAogIHk6IC0xCn0sIHsKICB4OiAtMSwKICB5OiAtMQp9LCB7CiAgeDogMCwKICB5OiAtMQp9LCB7CiAgeDogMSwKICB5OiAtMQp9LCB7CiAgeDogMiwKICB5OiAtMQp9LCB7CiAgeDogLTMsCiAgeTogMAp9LCB7CiAgeDogLTIsCiAgeTogMAp9LCB7CiAgeDogLTEsCiAgeTogMAp9XSwgW3sKICB4OiAtMSwKICB5OiAtMgp9LCB7CiAgeDogMCwKICB5OiAtMgp9LCB7CiAgeDogMSwKICB5OiAtMgp9LCB7CiAgeDogLTIsCiAgeTogLTEKfSwgewogIHg6IC0xLAogIHk6IC0xCn0sIHsKICB4OiAwLAogIHk6IC0xCn0sIHsKICB4OiAxLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAwCn0sIHsKICB4OiAtMSwKICB5OiAwCn1dLCBbewogIHg6IC0zLAogIHk6IC0xCn0sIHsKICB4OiAtMiwKICB5OiAtMQp9LCB7CiAgeDogLTEsCiAgeTogLTEKfSwgewogIHg6IDAsCiAgeTogLTEKfSwgewogIHg6IDEsCiAgeTogLTEKfSwgewogIHg6IC00LAogIHk6IDAKfSwgewogIHg6IC0zLAogIHk6IDAKfSwgewogIHg6IC0yLAogIHk6IDAKfSwgewogIHg6IC0xLAogIHk6IDAKfV1dOwpjb25zdCBSZWZpbmVtZW50VGVtcGxhdGVzID0gW3sKICBjb2Rpbmc6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9XSwKICByZWZlcmVuY2U6IFt7CiAgICB4OiAwLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAxLAogICAgeTogLTEKICB9LCB7CiAgICB4OiAtMSwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAwLAogICAgeTogMAogIH0sIHsKICAgIHg6IDEsCiAgICB5OiAwCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAxCiAgfSwgewogICAgeDogMCwKICAgIHk6IDEKICB9LCB7CiAgICB4OiAxLAogICAgeTogMQogIH1dCn0sIHsKICBjb2Rpbmc6IFt7CiAgICB4OiAtMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogMSwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfV0sCiAgcmVmZXJlbmNlOiBbewogICAgeDogMCwKICAgIHk6IC0xCiAgfSwgewogICAgeDogLTEsCiAgICB5OiAwCiAgfSwgewogICAgeDogMCwKICAgIHk6IDAKICB9LCB7CiAgICB4OiAxLAogICAgeTogMAogIH0sIHsKICAgIHg6IDAsCiAgICB5OiAxCiAgfSwgewogICAgeDogMSwKICAgIHk6IDEKICB9XQp9XTsKY29uc3QgUmV1c2VkQ29udGV4dHMgPSBbMHg5YjI1LCAweDA3OTUsIDB4MDBlNSwgMHgwMTk1XTsKY29uc3QgUmVmaW5lbWVudFJldXNlZENvbnRleHRzID0gWzB4MDAyMCwgMHgwMDA4XTsKZnVuY3Rpb24gZGVjb2RlQml0bWFwVGVtcGxhdGUwKHdpZHRoLCBoZWlnaHQsIGRlY29kaW5nQ29udGV4dCkgewogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0cyA9IGRlY29kaW5nQ29udGV4dC5jb250ZXh0Q2FjaGUuZ2V0Q29udGV4dHMoIkdCIik7CiAgY29uc3QgYml0bWFwID0gW107CiAgbGV0IGNvbnRleHRMYWJlbCwgaSwgaiwgcGl4ZWwsIHJvdywgcm93MSwgcm93MjsKICBjb25zdCBPTERfUElYRUxfTUFTSyA9IDB4N2JmNzsKICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIHJvdyA9IGJpdG1hcFtpXSA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICAgIHJvdzEgPSBpIDwgMSA/IHJvdyA6IGJpdG1hcFtpIC0gMV07CiAgICByb3cyID0gaSA8IDIgPyByb3cgOiBiaXRtYXBbaSAtIDJdOwogICAgY29udGV4dExhYmVsID0gcm93MlswXSA8PCAxMyB8IHJvdzJbMV0gPDwgMTIgfCByb3cyWzJdIDw8IDExIHwgcm93MVswXSA8PCA3IHwgcm93MVsxXSA8PCA2IHwgcm93MVsyXSA8PCA1IHwgcm93MVszXSA8PCA0OwogICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKICAgICAgcm93W2pdID0gcGl4ZWwgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIGNvbnRleHRMYWJlbCk7CiAgICAgIGNvbnRleHRMYWJlbCA9IChjb250ZXh0TGFiZWwgJiBPTERfUElYRUxfTUFTSykgPDwgMSB8IChqICsgMyA8IHdpZHRoID8gcm93MltqICsgM10gPDwgMTEgOiAwKSB8IChqICsgNCA8IHdpZHRoID8gcm93MVtqICsgNF0gPDwgNCA6IDApIHwgcGl4ZWw7CiAgICB9CiAgfQogIHJldHVybiBiaXRtYXA7Cn0KZnVuY3Rpb24gZGVjb2RlQml0bWFwKG1tciwgd2lkdGgsIGhlaWdodCwgdGVtcGxhdGVJbmRleCwgcHJlZGljdGlvbiwgc2tpcCwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGlmIChtbXIpIHsKICAgIGNvbnN0IGlucHV0ID0gbmV3IFJlYWRlcihkZWNvZGluZ0NvbnRleHQuZGF0YSwgZGVjb2RpbmdDb250ZXh0LnN0YXJ0LCBkZWNvZGluZ0NvbnRleHQuZW5kKTsKICAgIHJldHVybiBkZWNvZGVNTVJCaXRtYXAoaW5wdXQsIHdpZHRoLCBoZWlnaHQsIGZhbHNlKTsKICB9CiAgaWYgKHRlbXBsYXRlSW5kZXggPT09IDAgJiYgIXNraXAgJiYgIXByZWRpY3Rpb24gJiYgYXQubGVuZ3RoID09PSA0ICYmIGF0WzBdLnggPT09IDMgJiYgYXRbMF0ueSA9PT0gLTEgJiYgYXRbMV0ueCA9PT0gLTMgJiYgYXRbMV0ueSA9PT0gLTEgJiYgYXRbMl0ueCA9PT0gMiAmJiBhdFsyXS55ID09PSAtMiAmJiBhdFszXS54ID09PSAtMiAmJiBhdFszXS55ID09PSAtMikgewogICAgcmV0dXJuIGRlY29kZUJpdG1hcFRlbXBsYXRlMCh3aWR0aCwgaGVpZ2h0LCBkZWNvZGluZ0NvbnRleHQpOwogIH0KICBjb25zdCB1c2Vza2lwID0gISFza2lwOwogIGNvbnN0IHRlbXBsYXRlID0gQ29kaW5nVGVtcGxhdGVzW3RlbXBsYXRlSW5kZXhdLmNvbmNhdChhdCk7CiAgdGVtcGxhdGUuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgcmV0dXJuIGEueSAtIGIueSB8fCBhLnggLSBiLng7CiAgfSk7CiAgY29uc3QgdGVtcGxhdGVMZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgdGVtcGxhdGVYID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgdGVtcGxhdGVZID0gbmV3IEludDhBcnJheSh0ZW1wbGF0ZUxlbmd0aCk7CiAgY29uc3QgY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXMgPSBbXTsKICBsZXQgcmV1c2VNYXNrID0gMCwKICAgIG1pblggPSAwLAogICAgbWF4WCA9IDAsCiAgICBtaW5ZID0gMDsKICBsZXQgYywgazsKICBmb3IgKGsgPSAwOyBrIDwgdGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgdGVtcGxhdGVYW2tdID0gdGVtcGxhdGVba10ueDsKICAgIHRlbXBsYXRlWVtrXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgdGVtcGxhdGVba10ueCk7CiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgdGVtcGxhdGVba10ueCk7CiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgdGVtcGxhdGVba10ueSk7CiAgICBpZiAoayA8IHRlbXBsYXRlTGVuZ3RoIC0gMSAmJiB0ZW1wbGF0ZVtrXS55ID09PSB0ZW1wbGF0ZVtrICsgMV0ueSAmJiB0ZW1wbGF0ZVtrXS54ID09PSB0ZW1wbGF0ZVtrICsgMV0ueCAtIDEpIHsKICAgICAgcmV1c2VNYXNrIHw9IDEgPDwgdGVtcGxhdGVMZW5ndGggLSAxIC0gazsKICAgIH0gZWxzZSB7CiAgICAgIGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLnB1c2goayk7CiAgICB9CiAgfQogIGNvbnN0IGNoYW5naW5nRW50cmllc0xlbmd0aCA9IGNoYW5naW5nVGVtcGxhdGVFbnRyaWVzLmxlbmd0aDsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWCA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlWSA9IG5ldyBJbnQ4QXJyYXkoY2hhbmdpbmdFbnRyaWVzTGVuZ3RoKTsKICBjb25zdCBjaGFuZ2luZ1RlbXBsYXRlQml0ID0gbmV3IFVpbnQxNkFycmF5KGNoYW5naW5nRW50cmllc0xlbmd0aCk7CiAgZm9yIChjID0gMDsgYyA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgYysrKSB7CiAgICBrID0gY2hhbmdpbmdUZW1wbGF0ZUVudHJpZXNbY107CiAgICBjaGFuZ2luZ1RlbXBsYXRlWFtjXSA9IHRlbXBsYXRlW2tdLng7CiAgICBjaGFuZ2luZ1RlbXBsYXRlWVtjXSA9IHRlbXBsYXRlW2tdLnk7CiAgICBjaGFuZ2luZ1RlbXBsYXRlQml0W2NdID0gMSA8PCB0ZW1wbGF0ZUxlbmd0aCAtIDEgLSBrOwogIH0KICBjb25zdCBzYmJfbGVmdCA9IC1taW5YOwogIGNvbnN0IHNiYl90b3AgPSAtbWluWTsKICBjb25zdCBzYmJfcmlnaHQgPSB3aWR0aCAtIG1heFg7CiAgY29uc3QgcHNldWRvUGl4ZWxDb250ZXh0ID0gUmV1c2VkQ29udGV4dHNbdGVtcGxhdGVJbmRleF07CiAgbGV0IHJvdyA9IG5ldyBVaW50OEFycmF5KHdpZHRoKTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHQiIpOwogIGxldCBsdHAgPSAwLAogICAgaiwKICAgIGkwLAogICAgajAsCiAgICBjb250ZXh0TGFiZWwgPSAwLAogICAgYml0LAogICAgc2hpZnQ7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgaWYgKHByZWRpY3Rpb24pIHsKICAgICAgY29uc3Qgc2x0cCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgcHNldWRvUGl4ZWxDb250ZXh0KTsKICAgICAgbHRwIF49IHNsdHA7CiAgICAgIGlmIChsdHApIHsKICAgICAgICBiaXRtYXAucHVzaChyb3cpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICByb3cgPSBuZXcgVWludDhBcnJheShyb3cpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGlmICh1c2Vza2lwICYmIHNraXBbaV1bal0pIHsKICAgICAgICByb3dbal0gPSAwOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChqID49IHNiYl9sZWZ0ICYmIGogPCBzYmJfcmlnaHQgJiYgaSA+PSBzYmJfdG9wKSB7CiAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgJiByZXVzZU1hc2s7CiAgICAgICAgZm9yIChrID0gMDsgayA8IGNoYW5naW5nRW50cmllc0xlbmd0aDsgaysrKSB7CiAgICAgICAgICBpMCA9IGkgKyBjaGFuZ2luZ1RlbXBsYXRlWVtrXTsKICAgICAgICAgIGowID0gaiArIGNoYW5naW5nVGVtcGxhdGVYW2tdOwogICAgICAgICAgYml0ID0gYml0bWFwW2kwXVtqMF07CiAgICAgICAgICBpZiAoYml0KSB7CiAgICAgICAgICAgIGJpdCA9IGNoYW5naW5nVGVtcGxhdGVCaXRba107CiAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRleHRMYWJlbCA9IDA7CiAgICAgICAgc2hpZnQgPSB0ZW1wbGF0ZUxlbmd0aCAtIDE7CiAgICAgICAgZm9yIChrID0gMDsgayA8IHRlbXBsYXRlTGVuZ3RoOyBrKyssIHNoaWZ0LS0pIHsKICAgICAgICAgIGowID0gaiArIHRlbXBsYXRlWFtrXTsKICAgICAgICAgIGlmIChqMCA+PSAwICYmIGowIDwgd2lkdGgpIHsKICAgICAgICAgICAgaTAgPSBpICsgdGVtcGxhdGVZW2tdOwogICAgICAgICAgICBpZiAoaTAgPj0gMCkgewogICAgICAgICAgICAgIGJpdCA9IGJpdG1hcFtpMF1bajBdOwogICAgICAgICAgICAgIGlmIChiaXQpIHsKICAgICAgICAgICAgICAgIGNvbnRleHRMYWJlbCB8PSBiaXQgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVSZWZpbmVtZW50KHdpZHRoLCBoZWlnaHQsIHRlbXBsYXRlSW5kZXgsIHJlZmVyZW5jZUJpdG1hcCwgb2Zmc2V0WCwgb2Zmc2V0WSwgcHJlZGljdGlvbiwgYXQsIGRlY29kaW5nQ29udGV4dCkgewogIGxldCBjb2RpbmdUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0uY29kaW5nOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICBjb2RpbmdUZW1wbGF0ZSA9IGNvZGluZ1RlbXBsYXRlLmNvbmNhdChbYXRbMF1dKTsKICB9CiAgY29uc3QgY29kaW5nVGVtcGxhdGVMZW5ndGggPSBjb2RpbmdUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgY29kaW5nVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkoY29kaW5nVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IGNvZGluZ1RlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KGNvZGluZ1RlbXBsYXRlTGVuZ3RoKTsKICBsZXQgazsKICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgY29kaW5nVGVtcGxhdGVYW2tdID0gY29kaW5nVGVtcGxhdGVba10ueDsKICAgIGNvZGluZ1RlbXBsYXRlWVtrXSA9IGNvZGluZ1RlbXBsYXRlW2tdLnk7CiAgfQogIGxldCByZWZlcmVuY2VUZW1wbGF0ZSA9IFJlZmluZW1lbnRUZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0ucmVmZXJlbmNlOwogIGlmICh0ZW1wbGF0ZUluZGV4ID09PSAwKSB7CiAgICByZWZlcmVuY2VUZW1wbGF0ZSA9IHJlZmVyZW5jZVRlbXBsYXRlLmNvbmNhdChbYXRbMV1dKTsKICB9CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGggPSByZWZlcmVuY2VUZW1wbGF0ZS5sZW5ndGg7CiAgY29uc3QgcmVmZXJlbmNlVGVtcGxhdGVYID0gbmV3IEludDMyQXJyYXkocmVmZXJlbmNlVGVtcGxhdGVMZW5ndGgpOwogIGNvbnN0IHJlZmVyZW5jZVRlbXBsYXRlWSA9IG5ldyBJbnQzMkFycmF5KHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoKTsKICBmb3IgKGsgPSAwOyBrIDwgcmVmZXJlbmNlVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgcmVmZXJlbmNlVGVtcGxhdGVYW2tdID0gcmVmZXJlbmNlVGVtcGxhdGVba10ueDsKICAgIHJlZmVyZW5jZVRlbXBsYXRlWVtrXSA9IHJlZmVyZW5jZVRlbXBsYXRlW2tdLnk7CiAgfQogIGNvbnN0IHJlZmVyZW5jZVdpZHRoID0gcmVmZXJlbmNlQml0bWFwWzBdLmxlbmd0aDsKICBjb25zdCByZWZlcmVuY2VIZWlnaHQgPSByZWZlcmVuY2VCaXRtYXAubGVuZ3RoOwogIGNvbnN0IHBzZXVkb1BpeGVsQ29udGV4dCA9IFJlZmluZW1lbnRSZXVzZWRDb250ZXh0c1t0ZW1wbGF0ZUluZGV4XTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dHMgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlLmdldENvbnRleHRzKCJHUiIpOwogIGxldCBsdHAgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGlmIChwcmVkaWN0aW9uKSB7CiAgICAgIGNvbnN0IHNsdHAgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIHBzZXVkb1BpeGVsQ29udGV4dCk7CiAgICAgIGx0cCBePSBzbHRwOwogICAgICBpZiAobHRwKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInByZWRpY3Rpb24gaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICB9CiAgICB9CiAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBiaXRtYXAucHVzaChyb3cpOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgIGxldCBpMCwgajA7CiAgICAgIGxldCBjb250ZXh0TGFiZWwgPSAwOwogICAgICBmb3IgKGsgPSAwOyBrIDwgY29kaW5nVGVtcGxhdGVMZW5ndGg7IGsrKykgewogICAgICAgIGkwID0gaSArIGNvZGluZ1RlbXBsYXRlWVtrXTsKICAgICAgICBqMCA9IGogKyBjb2RpbmdUZW1wbGF0ZVhba107CiAgICAgICAgaWYgKGkwIDwgMCB8fCBqMCA8IDAgfHwgajAgPj0gd2lkdGgpIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA8PD0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29udGV4dExhYmVsID0gY29udGV4dExhYmVsIDw8IDEgfCBiaXRtYXBbaTBdW2owXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yIChrID0gMDsgayA8IHJlZmVyZW5jZVRlbXBsYXRlTGVuZ3RoOyBrKyspIHsKICAgICAgICBpMCA9IGkgKyByZWZlcmVuY2VUZW1wbGF0ZVlba10gLSBvZmZzZXRZOwogICAgICAgIGowID0gaiArIHJlZmVyZW5jZVRlbXBsYXRlWFtrXSAtIG9mZnNldFg7CiAgICAgICAgaWYgKGkwIDwgMCB8fCBpMCA+PSByZWZlcmVuY2VIZWlnaHQgfHwgajAgPCAwIHx8IGowID49IHJlZmVyZW5jZVdpZHRoKSB7CiAgICAgICAgICBjb250ZXh0TGFiZWwgPDw9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnRleHRMYWJlbCA9IGNvbnRleHRMYWJlbCA8PCAxIHwgcmVmZXJlbmNlQml0bWFwW2kwXVtqMF07CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IHBpeGVsID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICByb3dbal0gPSBwaXhlbDsKICAgIH0KICB9CiAgcmV0dXJuIGJpdG1hcDsKfQpmdW5jdGlvbiBkZWNvZGVTeW1ib2xEaWN0aW9uYXJ5KGh1ZmZtYW4sIHJlZmluZW1lbnQsIHN5bWJvbHMsIG51bWJlck9mTmV3U3ltYm9scywgbnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIHRlbXBsYXRlSW5kZXgsIGF0LCByZWZpbmVtZW50VGVtcGxhdGVJbmRleCwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQsIGh1ZmZtYW5JbnB1dCkgewogIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJzeW1ib2wgcmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICBjb25zdCBuZXdTeW1ib2xzID0gW107CiAgbGV0IGN1cnJlbnRIZWlnaHQgPSAwOwogIGxldCBzeW1ib2xDb2RlTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzKTsKICBjb25zdCBkZWNvZGVyID0gZGVjb2RpbmdDb250ZXh0LmRlY29kZXI7CiAgY29uc3QgY29udGV4dENhY2hlID0gZGVjb2RpbmdDb250ZXh0LmNvbnRleHRDYWNoZTsKICBsZXQgdGFibGVCMSwgc3ltYm9sV2lkdGhzOwogIGlmIChodWZmbWFuKSB7CiAgICB0YWJsZUIxID0gZ2V0U3RhbmRhcmRUYWJsZSgxKTsKICAgIHN5bWJvbFdpZHRocyA9IFtdOwogICAgc3ltYm9sQ29kZUxlbmd0aCA9IE1hdGgubWF4KHN5bWJvbENvZGVMZW5ndGgsIDEpOwogIH0KICB3aGlsZSAobmV3U3ltYm9scy5sZW5ndGggPCBudW1iZXJPZk5ld1N5bWJvbHMpIHsKICAgIGNvbnN0IGRlbHRhSGVpZ2h0ID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YUhlaWdodC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFESCIsIGRlY29kZXIpOwogICAgY3VycmVudEhlaWdodCArPSBkZWx0YUhlaWdodDsKICAgIGxldCBjdXJyZW50V2lkdGggPSAwLAogICAgICB0b3RhbFdpZHRoID0gMDsKICAgIGNvbnN0IGZpcnN0U3ltYm9sID0gaHVmZm1hbiA/IHN5bWJvbFdpZHRocy5sZW5ndGggOiAwOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgY29uc3QgZGVsdGFXaWR0aCA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFXaWR0aC5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFEVyIsIGRlY29kZXIpOwogICAgICBpZiAoZGVsdGFXaWR0aCA9PT0gbnVsbCkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGN1cnJlbnRXaWR0aCArPSBkZWx0YVdpZHRoOwogICAgICB0b3RhbFdpZHRoICs9IGN1cnJlbnRXaWR0aDsKICAgICAgbGV0IGJpdG1hcDsKICAgICAgaWYgKHJlZmluZW1lbnQpIHsKICAgICAgICBjb25zdCBudW1iZXJPZkluc3RhbmNlcyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFBSSIsIGRlY29kZXIpOwogICAgICAgIGlmIChudW1iZXJPZkluc3RhbmNlcyA+IDEpIHsKICAgICAgICAgIGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCAwLCBudW1iZXJPZkluc3RhbmNlcywgMSwgc3ltYm9scy5jb25jYXQobmV3U3ltYm9scyksIHN5bWJvbENvZGVMZW5ndGgsIDAsIDAsIDEsIDAsIGh1ZmZtYW5UYWJsZXMsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgMCwgaHVmZm1hbklucHV0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgc3ltYm9sSWQgPSBkZWNvZGVJQUlEKGNvbnRleHRDYWNoZSwgZGVjb2Rlciwgc3ltYm9sQ29kZUxlbmd0aCk7CiAgICAgICAgICBjb25zdCByZHggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRYIiwgZGVjb2Rlcik7CiAgICAgICAgICBjb25zdCByZHkgPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRZIiwgZGVjb2Rlcik7CiAgICAgICAgICBjb25zdCBzeW1ib2wgPSBzeW1ib2xJZCA8IHN5bWJvbHMubGVuZ3RoID8gc3ltYm9sc1tzeW1ib2xJZF0gOiBuZXdTeW1ib2xzW3N5bWJvbElkIC0gc3ltYm9scy5sZW5ndGhdOwogICAgICAgICAgYml0bWFwID0gZGVjb2RlUmVmaW5lbWVudChjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2wsIHJkeCwgcmR5LCBmYWxzZSwgcmVmaW5lbWVudEF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgICAgIH0KICAgICAgICBuZXdTeW1ib2xzLnB1c2goYml0bWFwKTsKICAgICAgfSBlbHNlIGlmIChodWZmbWFuKSB7CiAgICAgICAgc3ltYm9sV2lkdGhzLnB1c2goY3VycmVudFdpZHRoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCwgdGVtcGxhdGVJbmRleCwgZmFsc2UsIG51bGwsIGF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgICAgIG5ld1N5bWJvbHMucHVzaChiaXRtYXApOwogICAgICB9CiAgICB9CiAgICBpZiAoaHVmZm1hbiAmJiAhcmVmaW5lbWVudCkgewogICAgICBjb25zdCBiaXRtYXBTaXplID0gaHVmZm1hblRhYmxlcy50YWJsZUJpdG1hcFNpemUuZGVjb2RlKGh1ZmZtYW5JbnB1dCk7CiAgICAgIGh1ZmZtYW5JbnB1dC5ieXRlQWxpZ24oKTsKICAgICAgbGV0IGNvbGxlY3RpdmVCaXRtYXA7CiAgICAgIGlmIChiaXRtYXBTaXplID09PSAwKSB7CiAgICAgICAgY29sbGVjdGl2ZUJpdG1hcCA9IHJlYWRVbmNvbXByZXNzZWRCaXRtYXAoaHVmZm1hbklucHV0LCB0b3RhbFdpZHRoLCBjdXJyZW50SGVpZ2h0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGh1ZmZtYW5JbnB1dC5lbmQ7CiAgICAgICAgY29uc3QgYml0bWFwRW5kID0gaHVmZm1hbklucHV0LnBvc2l0aW9uICsgYml0bWFwU2l6ZTsKICAgICAgICBodWZmbWFuSW5wdXQuZW5kID0gYml0bWFwRW5kOwogICAgICAgIGNvbGxlY3RpdmVCaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAoaHVmZm1hbklucHV0LCB0b3RhbFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBmYWxzZSk7CiAgICAgICAgaHVmZm1hbklucHV0LmVuZCA9IG9yaWdpbmFsRW5kOwogICAgICAgIGh1ZmZtYW5JbnB1dC5wb3NpdGlvbiA9IGJpdG1hcEVuZDsKICAgICAgfQogICAgICBjb25zdCBudW1iZXJPZlN5bWJvbHNEZWNvZGVkID0gc3ltYm9sV2lkdGhzLmxlbmd0aDsKICAgICAgaWYgKGZpcnN0U3ltYm9sID09PSBudW1iZXJPZlN5bWJvbHNEZWNvZGVkIC0gMSkgewogICAgICAgIG5ld1N5bWJvbHMucHVzaChjb2xsZWN0aXZlQml0bWFwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgaSwKICAgICAgICAgIHksCiAgICAgICAgICB4TWluID0gMCwKICAgICAgICAgIHhNYXgsCiAgICAgICAgICBiaXRtYXBXaWR0aCwKICAgICAgICAgIHN5bWJvbEJpdG1hcDsKICAgICAgICBmb3IgKGkgPSBmaXJzdFN5bWJvbDsgaSA8IG51bWJlck9mU3ltYm9sc0RlY29kZWQ7IGkrKykgewogICAgICAgICAgYml0bWFwV2lkdGggPSBzeW1ib2xXaWR0aHNbaV07CiAgICAgICAgICB4TWF4ID0geE1pbiArIGJpdG1hcFdpZHRoOwogICAgICAgICAgc3ltYm9sQml0bWFwID0gW107CiAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgY3VycmVudEhlaWdodDsgeSsrKSB7CiAgICAgICAgICAgIHN5bWJvbEJpdG1hcC5wdXNoKGNvbGxlY3RpdmVCaXRtYXBbeV0uc3ViYXJyYXkoeE1pbiwgeE1heCkpOwogICAgICAgICAgfQogICAgICAgICAgbmV3U3ltYm9scy5wdXNoKHN5bWJvbEJpdG1hcCk7CiAgICAgICAgICB4TWluID0geE1heDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgY29uc3QgZXhwb3J0ZWRTeW1ib2xzID0gW10sCiAgICBmbGFncyA9IFtdOwogIGxldCBjdXJyZW50RmxhZyA9IGZhbHNlLAogICAgaSwKICAgIGlpOwogIGNvbnN0IHRvdGFsU3ltYm9sc0xlbmd0aCA9IHN5bWJvbHMubGVuZ3RoICsgbnVtYmVyT2ZOZXdTeW1ib2xzOwogIHdoaWxlIChmbGFncy5sZW5ndGggPCB0b3RhbFN5bWJvbHNMZW5ndGgpIHsKICAgIGxldCBydW5MZW5ndGggPSBodWZmbWFuID8gdGFibGVCMS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFFWCIsIGRlY29kZXIpOwogICAgd2hpbGUgKHJ1bkxlbmd0aC0tKSB7CiAgICAgIGZsYWdzLnB1c2goY3VycmVudEZsYWcpOwogICAgfQogICAgY3VycmVudEZsYWcgPSAhY3VycmVudEZsYWc7CiAgfQogIGZvciAoaSA9IDAsIGlpID0gc3ltYm9scy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBpZiAoZmxhZ3NbaV0pIHsKICAgICAgZXhwb3J0ZWRTeW1ib2xzLnB1c2goc3ltYm9sc1tpXSk7CiAgICB9CiAgfQogIGZvciAobGV0IGogPSAwOyBqIDwgbnVtYmVyT2ZOZXdTeW1ib2xzOyBpKyssIGorKykgewogICAgaWYgKGZsYWdzW2ldKSB7CiAgICAgIGV4cG9ydGVkU3ltYm9scy5wdXNoKG5ld1N5bWJvbHNbal0pOwogICAgfQogIH0KICByZXR1cm4gZXhwb3J0ZWRTeW1ib2xzOwp9CmZ1bmN0aW9uIGRlY29kZVRleHRSZWdpb24oaHVmZm1hbiwgcmVmaW5lbWVudCwgd2lkdGgsIGhlaWdodCwgZGVmYXVsdFBpeGVsVmFsdWUsIG51bWJlck9mU3ltYm9sSW5zdGFuY2VzLCBzdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgdHJhbnNwb3NlZCwgZHNPZmZzZXQsIHJlZmVyZW5jZUNvcm5lciwgY29tYmluYXRpb25PcGVyYXRvciwgaHVmZm1hblRhYmxlcywgcmVmaW5lbWVudFRlbXBsYXRlSW5kZXgsIHJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBsb2dTdHJpcFNpemUsIGh1ZmZtYW5JbnB1dCkgewogIGlmIChodWZmbWFuICYmIHJlZmluZW1lbnQpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJyZWZpbmVtZW50IHdpdGggSHVmZm1hbiBpcyBub3Qgc3VwcG9ydGVkIik7CiAgfQogIGNvbnN0IGJpdG1hcCA9IFtdOwogIGxldCBpLCByb3c7CiAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBpZiAoZGVmYXVsdFBpeGVsVmFsdWUpIHsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgcm93W2pdID0gZGVmYXVsdFBpeGVsVmFsdWU7CiAgICAgIH0KICAgIH0KICAgIGJpdG1hcC5wdXNoKHJvdyk7CiAgfQogIGNvbnN0IGRlY29kZXIgPSBkZWNvZGluZ0NvbnRleHQuZGVjb2RlcjsKICBjb25zdCBjb250ZXh0Q2FjaGUgPSBkZWNvZGluZ0NvbnRleHQuY29udGV4dENhY2hlOwogIGxldCBzdHJpcFQgPSBodWZmbWFuID8gLWh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiAtZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURUIiwgZGVjb2Rlcik7CiAgbGV0IGZpcnN0UyA9IDA7CiAgaSA9IDA7CiAgd2hpbGUgKGkgPCBudW1iZXJPZlN5bWJvbEluc3RhbmNlcykgewogICAgY29uc3QgZGVsdGFUID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMudGFibGVEZWx0YVQuZGVjb2RlKGh1ZmZtYW5JbnB1dCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBRFQiLCBkZWNvZGVyKTsKICAgIHN0cmlwVCArPSBkZWx0YVQ7CiAgICBjb25zdCBkZWx0YUZpcnN0UyA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRmlyc3RTLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQUZTIiwgZGVjb2Rlcik7CiAgICBmaXJzdFMgKz0gZGVsdGFGaXJzdFM7CiAgICBsZXQgY3VycmVudFMgPSBmaXJzdFM7CiAgICBkbyB7CiAgICAgIGxldCBjdXJyZW50VCA9IDA7CiAgICAgIGlmIChzdHJpcFNpemUgPiAxKSB7CiAgICAgICAgY3VycmVudFQgPSBodWZmbWFuID8gaHVmZm1hbklucHV0LnJlYWRCaXRzKGxvZ1N0cmlwU2l6ZSkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBSVQiLCBkZWNvZGVyKTsKICAgICAgfQogICAgICBjb25zdCB0ID0gc3RyaXBTaXplICogc3RyaXBUICsgY3VycmVudFQ7CiAgICAgIGNvbnN0IHN5bWJvbElkID0gaHVmZm1hbiA/IGh1ZmZtYW5UYWJsZXMuc3ltYm9sSURUYWJsZS5kZWNvZGUoaHVmZm1hbklucHV0KSA6IGRlY29kZUlBSUQoY29udGV4dENhY2hlLCBkZWNvZGVyLCBzeW1ib2xDb2RlTGVuZ3RoKTsKICAgICAgY29uc3QgYXBwbHlSZWZpbmVtZW50ID0gcmVmaW5lbWVudCAmJiAoaHVmZm1hbiA/IGh1ZmZtYW5JbnB1dC5yZWFkQml0KCkgOiBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkkiLCBkZWNvZGVyKSk7CiAgICAgIGxldCBzeW1ib2xCaXRtYXAgPSBpbnB1dFN5bWJvbHNbc3ltYm9sSWRdOwogICAgICBsZXQgc3ltYm9sV2lkdGggPSBzeW1ib2xCaXRtYXBbMF0ubGVuZ3RoOwogICAgICBsZXQgc3ltYm9sSGVpZ2h0ID0gc3ltYm9sQml0bWFwLmxlbmd0aDsKICAgICAgaWYgKGFwcGx5UmVmaW5lbWVudCkgewogICAgICAgIGNvbnN0IHJkdyA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFciLCBkZWNvZGVyKTsKICAgICAgICBjb25zdCByZGggPSBkZWNvZGVJbnRlZ2VyKGNvbnRleHRDYWNoZSwgIklBUkRIIiwgZGVjb2Rlcik7CiAgICAgICAgY29uc3QgcmR4ID0gZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQVJEWCIsIGRlY29kZXIpOwogICAgICAgIGNvbnN0IHJkeSA9IGRlY29kZUludGVnZXIoY29udGV4dENhY2hlLCAiSUFSRFkiLCBkZWNvZGVyKTsKICAgICAgICBzeW1ib2xXaWR0aCArPSByZHc7CiAgICAgICAgc3ltYm9sSGVpZ2h0ICs9IHJkaDsKICAgICAgICBzeW1ib2xCaXRtYXAgPSBkZWNvZGVSZWZpbmVtZW50KHN5bWJvbFdpZHRoLCBzeW1ib2xIZWlnaHQsIHJlZmluZW1lbnRUZW1wbGF0ZUluZGV4LCBzeW1ib2xCaXRtYXAsIChyZHcgPj4gMSkgKyByZHgsIChyZGggPj4gMSkgKyByZHksIGZhbHNlLCByZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCk7CiAgICAgIH0KICAgICAgY29uc3Qgb2Zmc2V0VCA9IHQgLSAocmVmZXJlbmNlQ29ybmVyICYgMSA/IDAgOiBzeW1ib2xIZWlnaHQgLSAxKTsKICAgICAgY29uc3Qgb2Zmc2V0UyA9IGN1cnJlbnRTIC0gKHJlZmVyZW5jZUNvcm5lciAmIDIgPyBzeW1ib2xXaWR0aCAtIDEgOiAwKTsKICAgICAgbGV0IHMyLCB0Miwgc3ltYm9sUm93OwogICAgICBpZiAodHJhbnNwb3NlZCkgewogICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbEhlaWdodDsgczIrKykgewogICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFMgKyBzMl07CiAgICAgICAgICBpZiAoIXJvdykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFtzMl07CiAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWluKHdpZHRoIC0gb2Zmc2V0VCwgc3ltYm9sV2lkdGgpOwogICAgICAgICAgc3dpdGNoIChjb21iaW5hdGlvbk9wZXJhdG9yKSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykgewogICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gfD0gc3ltYm9sUm93W3QyXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICBmb3IgKHQyID0gMDsgdDIgPCBtYXhXaWR0aDsgdDIrKykgewogICAgICAgICAgICAgICAgcm93W29mZnNldFQgKyB0Ml0gXj0gc3ltYm9sUm93W3QyXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoYG9wZXJhdG9yICR7Y29tYmluYXRpb25PcGVyYXRvcn0gaXMgbm90IHN1cHBvcnRlZGApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjdXJyZW50UyArPSBzeW1ib2xIZWlnaHQgLSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAodDIgPSAwOyB0MiA8IHN5bWJvbEhlaWdodDsgdDIrKykgewogICAgICAgICAgcm93ID0gYml0bWFwW29mZnNldFQgKyB0Ml07CiAgICAgICAgICBpZiAoIXJvdykgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHN5bWJvbFJvdyA9IHN5bWJvbEJpdG1hcFt0Ml07CiAgICAgICAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSB8PSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGZvciAoczIgPSAwOyBzMiA8IHN5bWJvbFdpZHRoOyBzMisrKSB7CiAgICAgICAgICAgICAgICByb3dbb2Zmc2V0UyArIHMyXSBePSBzeW1ib2xSb3dbczJdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgb3BlcmF0b3IgJHtjb21iaW5hdGlvbk9wZXJhdG9yfSBpcyBub3Qgc3VwcG9ydGVkYCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRTICs9IHN5bWJvbFdpZHRoIC0gMTsKICAgICAgfQogICAgICBpKys7CiAgICAgIGNvbnN0IGRlbHRhUyA9IGh1ZmZtYW4gPyBodWZmbWFuVGFibGVzLnRhYmxlRGVsdGFTLmRlY29kZShodWZmbWFuSW5wdXQpIDogZGVjb2RlSW50ZWdlcihjb250ZXh0Q2FjaGUsICJJQURTIiwgZGVjb2Rlcik7CiAgICAgIGlmIChkZWx0YVMgPT09IG51bGwpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjdXJyZW50UyArPSBkZWx0YVMgKyBkc09mZnNldDsKICAgIH0gd2hpbGUgKHRydWUpOwogIH0KICByZXR1cm4gYml0bWFwOwp9CmZ1bmN0aW9uIGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KG1tciwgcGF0dGVybldpZHRoLCBwYXR0ZXJuSGVpZ2h0LCBtYXhQYXR0ZXJuSW5kZXgsIHRlbXBsYXRlLCBkZWNvZGluZ0NvbnRleHQpIHsKICBjb25zdCBhdCA9IFtdOwogIGlmICghbW1yKSB7CiAgICBhdC5wdXNoKHsKICAgICAgeDogLXBhdHRlcm5XaWR0aCwKICAgICAgeTogMAogICAgfSk7CiAgICBpZiAodGVtcGxhdGUgPT09IDApIHsKICAgICAgYXQucHVzaCh7CiAgICAgICAgeDogLTMsCiAgICAgICAgeTogLTEKICAgICAgfSwgewogICAgICAgIHg6IDIsCiAgICAgICAgeTogLTIKICAgICAgfSwgewogICAgICAgIHg6IC0yLAogICAgICAgIHk6IC0yCiAgICAgIH0pOwogICAgfQogIH0KICBjb25zdCBjb2xsZWN0aXZlV2lkdGggPSAobWF4UGF0dGVybkluZGV4ICsgMSkgKiBwYXR0ZXJuV2lkdGg7CiAgY29uc3QgY29sbGVjdGl2ZUJpdG1hcCA9IGRlY29kZUJpdG1hcChtbXIsIGNvbGxlY3RpdmVXaWR0aCwgcGF0dGVybkhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBudWxsLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICBjb25zdCBwYXR0ZXJucyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDw9IG1heFBhdHRlcm5JbmRleDsgaSsrKSB7CiAgICBjb25zdCBwYXR0ZXJuQml0bWFwID0gW107CiAgICBjb25zdCB4TWluID0gcGF0dGVybldpZHRoICogaTsKICAgIGNvbnN0IHhNYXggPSB4TWluICsgcGF0dGVybldpZHRoOwogICAgZm9yIChsZXQgeSA9IDA7IHkgPCBwYXR0ZXJuSGVpZ2h0OyB5KyspIHsKICAgICAgcGF0dGVybkJpdG1hcC5wdXNoKGNvbGxlY3RpdmVCaXRtYXBbeV0uc3ViYXJyYXkoeE1pbiwgeE1heCkpOwogICAgfQogICAgcGF0dGVybnMucHVzaChwYXR0ZXJuQml0bWFwKTsKICB9CiAgcmV0dXJuIHBhdHRlcm5zOwp9CmZ1bmN0aW9uIGRlY29kZUhhbGZ0b25lUmVnaW9uKG1tciwgcGF0dGVybnMsIHRlbXBsYXRlLCByZWdpb25XaWR0aCwgcmVnaW9uSGVpZ2h0LCBkZWZhdWx0UGl4ZWxWYWx1ZSwgZW5hYmxlU2tpcCwgY29tYmluYXRpb25PcGVyYXRvciwgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCBncmlkT2Zmc2V0WCwgZ3JpZE9mZnNldFksIGdyaWRWZWN0b3JYLCBncmlkVmVjdG9yWSwgZGVjb2RpbmdDb250ZXh0KSB7CiAgY29uc3Qgc2tpcCA9IG51bGw7CiAgaWYgKGVuYWJsZVNraXApIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJza2lwIGlzIG5vdCBzdXBwb3J0ZWQiKTsKICB9CiAgaWYgKGNvbWJpbmF0aW9uT3BlcmF0b3IgIT09IDApIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAiJHtjb21iaW5hdGlvbk9wZXJhdG9yfSIgaXMgbm90IHN1cHBvcnRlZCBpbiBoYWxmdG9uZSByZWdpb25gKTsKICB9CiAgY29uc3QgcmVnaW9uQml0bWFwID0gW107CiAgbGV0IGksIGosIHJvdzsKICBmb3IgKGkgPSAwOyBpIDwgcmVnaW9uSGVpZ2h0OyBpKyspIHsKICAgIHJvdyA9IG5ldyBVaW50OEFycmF5KHJlZ2lvbldpZHRoKTsKICAgIGlmIChkZWZhdWx0UGl4ZWxWYWx1ZSkgewogICAgICBmb3IgKGogPSAwOyBqIDwgcmVnaW9uV2lkdGg7IGorKykgewogICAgICAgIHJvd1tqXSA9IGRlZmF1bHRQaXhlbFZhbHVlOwogICAgICB9CiAgICB9CiAgICByZWdpb25CaXRtYXAucHVzaChyb3cpOwogIH0KICBjb25zdCBudW1iZXJPZlBhdHRlcm5zID0gcGF0dGVybnMubGVuZ3RoOwogIGNvbnN0IHBhdHRlcm4wID0gcGF0dGVybnNbMF07CiAgY29uc3QgcGF0dGVybldpZHRoID0gcGF0dGVybjBbMF0ubGVuZ3RoLAogICAgcGF0dGVybkhlaWdodCA9IHBhdHRlcm4wLmxlbmd0aDsKICBjb25zdCBiaXRzUGVyVmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikobnVtYmVyT2ZQYXR0ZXJucyk7CiAgY29uc3QgYXQgPSBbXTsKICBpZiAoIW1tcikgewogICAgYXQucHVzaCh7CiAgICAgIHg6IHRlbXBsYXRlIDw9IDEgPyAzIDogMiwKICAgICAgeTogLTEKICAgIH0pOwogICAgaWYgKHRlbXBsYXRlID09PSAwKSB7CiAgICAgIGF0LnB1c2goewogICAgICAgIHg6IC0zLAogICAgICAgIHk6IC0xCiAgICAgIH0sIHsKICAgICAgICB4OiAyLAogICAgICAgIHk6IC0yCiAgICAgIH0sIHsKICAgICAgICB4OiAtMiwKICAgICAgICB5OiAtMgogICAgICB9KTsKICAgIH0KICB9CiAgY29uc3QgZ3JheVNjYWxlQml0UGxhbmVzID0gW107CiAgbGV0IG1tcklucHV0LCBiaXRtYXA7CiAgaWYgKG1tcikgewogICAgbW1ySW5wdXQgPSBuZXcgUmVhZGVyKGRlY29kaW5nQ29udGV4dC5kYXRhLCBkZWNvZGluZ0NvbnRleHQuc3RhcnQsIGRlY29kaW5nQ29udGV4dC5lbmQpOwogIH0KICBmb3IgKGkgPSBiaXRzUGVyVmFsdWUgLSAxOyBpID49IDA7IGktLSkgewogICAgaWYgKG1tcikgewogICAgICBiaXRtYXAgPSBkZWNvZGVNTVJCaXRtYXAobW1ySW5wdXQsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBiaXRtYXAgPSBkZWNvZGVCaXRtYXAoZmFsc2UsIGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgdGVtcGxhdGUsIGZhbHNlLCBza2lwLCBhdCwgZGVjb2RpbmdDb250ZXh0KTsKICAgIH0KICAgIGdyYXlTY2FsZUJpdFBsYW5lc1tpXSA9IGJpdG1hcDsKICB9CiAgbGV0IG1nLCBuZywgYml0LCBwYXR0ZXJuSW5kZXgsIHBhdHRlcm5CaXRtYXAsIHgsIHksIHBhdHRlcm5Sb3csIHJlZ2lvblJvdzsKICBmb3IgKG1nID0gMDsgbWcgPCBncmlkSGVpZ2h0OyBtZysrKSB7CiAgICBmb3IgKG5nID0gMDsgbmcgPCBncmlkV2lkdGg7IG5nKyspIHsKICAgICAgYml0ID0gMDsKICAgICAgcGF0dGVybkluZGV4ID0gMDsKICAgICAgZm9yIChqID0gYml0c1BlclZhbHVlIC0gMTsgaiA+PSAwOyBqLS0pIHsKICAgICAgICBiaXQgXj0gZ3JheVNjYWxlQml0UGxhbmVzW2pdW21nXVtuZ107CiAgICAgICAgcGF0dGVybkluZGV4IHw9IGJpdCA8PCBqOwogICAgICB9CiAgICAgIHBhdHRlcm5CaXRtYXAgPSBwYXR0ZXJuc1twYXR0ZXJuSW5kZXhdOwogICAgICB4ID0gZ3JpZE9mZnNldFggKyBtZyAqIGdyaWRWZWN0b3JZICsgbmcgKiBncmlkVmVjdG9yWCA+PiA4OwogICAgICB5ID0gZ3JpZE9mZnNldFkgKyBtZyAqIGdyaWRWZWN0b3JYIC0gbmcgKiBncmlkVmVjdG9yWSA+PiA4OwogICAgICBpZiAoeCA+PSAwICYmIHggKyBwYXR0ZXJuV2lkdGggPD0gcmVnaW9uV2lkdGggJiYgeSA+PSAwICYmIHkgKyBwYXR0ZXJuSGVpZ2h0IDw9IHJlZ2lvbkhlaWdodCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFt5ICsgaV07CiAgICAgICAgICBwYXR0ZXJuUm93ID0gcGF0dGVybkJpdG1hcFtpXTsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXR0ZXJuV2lkdGg7IGorKykgewogICAgICAgICAgICByZWdpb25Sb3dbeCArIGpdIHw9IHBhdHRlcm5Sb3dbal07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxldCByZWdpb25YLCByZWdpb25ZOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXR0ZXJuSGVpZ2h0OyBpKyspIHsKICAgICAgICAgIHJlZ2lvblkgPSB5ICsgaTsKICAgICAgICAgIGlmIChyZWdpb25ZIDwgMCB8fCByZWdpb25ZID49IHJlZ2lvbkhlaWdodCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJlZ2lvblJvdyA9IHJlZ2lvbkJpdG1hcFtyZWdpb25ZXTsKICAgICAgICAgIHBhdHRlcm5Sb3cgPSBwYXR0ZXJuQml0bWFwW2ldOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhdHRlcm5XaWR0aDsgaisrKSB7CiAgICAgICAgICAgIHJlZ2lvblggPSB4ICsgajsKICAgICAgICAgICAgaWYgKHJlZ2lvblggPj0gMCAmJiByZWdpb25YIDwgcmVnaW9uV2lkdGgpIHsKICAgICAgICAgICAgICByZWdpb25Sb3dbcmVnaW9uWF0gfD0gcGF0dGVyblJvd1tqXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICByZXR1cm4gcmVnaW9uQml0bWFwOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHN0YXJ0KSB7CiAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHt9OwogIHNlZ21lbnRIZWFkZXIubnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0KTsKICBjb25zdCBmbGFncyA9IGRhdGFbc3RhcnQgKyA0XTsKICBjb25zdCBzZWdtZW50VHlwZSA9IGZsYWdzICYgMHgzZjsKICBpZiAoIVNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV0pIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHNlZ21lbnQgdHlwZTogIiArIHNlZ21lbnRUeXBlKTsKICB9CiAgc2VnbWVudEhlYWRlci50eXBlID0gc2VnbWVudFR5cGU7CiAgc2VnbWVudEhlYWRlci50eXBlTmFtZSA9IFNlZ21lbnRUeXBlc1tzZWdtZW50VHlwZV07CiAgc2VnbWVudEhlYWRlci5kZWZlcnJlZE5vblJldGFpbiA9ICEhKGZsYWdzICYgMHg4MCk7CiAgY29uc3QgcGFnZUFzc29jaWF0aW9uRmllbGRTaXplID0gISEoZmxhZ3MgJiAweDQwKTsKICBjb25zdCByZWZlcnJlZEZsYWdzID0gZGF0YVtzdGFydCArIDVdOwogIGxldCByZWZlcnJlZFRvQ291bnQgPSByZWZlcnJlZEZsYWdzID4+IDUgJiA3OwogIGNvbnN0IHJldGFpbkJpdHMgPSBbcmVmZXJyZWRGbGFncyAmIDMxXTsKICBsZXQgcG9zaXRpb24gPSBzdGFydCArIDY7CiAgaWYgKHJlZmVycmVkRmxhZ3MgPT09IDcpIHsKICAgIHJlZmVycmVkVG9Db3VudCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiAtIDEpICYgMHgxZmZmZmZmZjsKICAgIHBvc2l0aW9uICs9IDM7CiAgICBsZXQgYnl0ZXMgPSByZWZlcnJlZFRvQ291bnQgKyA3ID4+IDM7CiAgICByZXRhaW5CaXRzWzBdID0gZGF0YVtwb3NpdGlvbisrXTsKICAgIHdoaWxlICgtLWJ5dGVzID4gMCkgewogICAgICByZXRhaW5CaXRzLnB1c2goZGF0YVtwb3NpdGlvbisrXSk7CiAgICB9CiAgfSBlbHNlIGlmIChyZWZlcnJlZEZsYWdzID09PSA1IHx8IHJlZmVycmVkRmxhZ3MgPT09IDYpIHsKICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIHJlZmVycmVkLXRvIGZsYWdzIik7CiAgfQogIHNlZ21lbnRIZWFkZXIucmV0YWluQml0cyA9IHJldGFpbkJpdHM7CiAgbGV0IHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9IDQ7CiAgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDI1NikgewogICAgcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplID0gMTsKICB9IGVsc2UgaWYgKHNlZ21lbnRIZWFkZXIubnVtYmVyIDw9IDY1NTM2KSB7CiAgICByZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPSAyOwogIH0KICBjb25zdCByZWZlcnJlZFRvID0gW107CiAgbGV0IGksIGlpOwogIGZvciAoaSA9IDA7IGkgPCByZWZlcnJlZFRvQ291bnQ7IGkrKykgewogICAgbGV0IG51bWJlcjsKICAgIGlmIChyZWZlcnJlZFRvU2VnbWVudE51bWJlclNpemUgPT09IDEpIHsKICAgICAgbnVtYmVyID0gZGF0YVtwb3NpdGlvbl07CiAgICB9IGVsc2UgaWYgKHJlZmVycmVkVG9TZWdtZW50TnVtYmVyU2l6ZSA9PT0gMikgewogICAgICBudW1iZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgbnVtYmVyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKICAgIH0KICAgIHJlZmVycmVkVG8ucHVzaChudW1iZXIpOwogICAgcG9zaXRpb24gKz0gcmVmZXJyZWRUb1NlZ21lbnROdW1iZXJTaXplOwogIH0KICBzZWdtZW50SGVhZGVyLnJlZmVycmVkVG8gPSByZWZlcnJlZFRvOwogIGlmICghcGFnZUFzc29jaWF0aW9uRmllbGRTaXplKSB7CiAgICBzZWdtZW50SGVhZGVyLnBhZ2VBc3NvY2lhdGlvbiA9IGRhdGFbcG9zaXRpb24rK107CiAgfSBlbHNlIHsKICAgIHNlZ21lbnRIZWFkZXIucGFnZUFzc29jaWF0aW9uID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKICAgIHBvc2l0aW9uICs9IDQ7CiAgfQogIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKICBwb3NpdGlvbiArPSA0OwogIGlmIChzZWdtZW50SGVhZGVyLmxlbmd0aCA9PT0gMHhmZmZmZmZmZikgewogICAgaWYgKHNlZ21lbnRUeXBlID09PSAzOCkgewogICAgICBjb25zdCBnZW5lcmljUmVnaW9uSW5mbyA9IHJlYWRSZWdpb25TZWdtZW50SW5mb3JtYXRpb24oZGF0YSwgcG9zaXRpb24pOwogICAgICBjb25zdCBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbiArIFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoXTsKICAgICAgY29uc3QgZ2VuZXJpY1JlZ2lvbk1tciA9ICEhKGdlbmVyaWNSZWdpb25TZWdtZW50RmxhZ3MgJiAxKTsKICAgICAgY29uc3Qgc2VhcmNoUGF0dGVybkxlbmd0aCA9IDY7CiAgICAgIGNvbnN0IHNlYXJjaFBhdHRlcm4gPSBuZXcgVWludDhBcnJheShzZWFyY2hQYXR0ZXJuTGVuZ3RoKTsKICAgICAgaWYgKCFnZW5lcmljUmVnaW9uTW1yKSB7CiAgICAgICAgc2VhcmNoUGF0dGVyblswXSA9IDB4ZmY7CiAgICAgICAgc2VhcmNoUGF0dGVyblsxXSA9IDB4YWM7CiAgICAgIH0KICAgICAgc2VhcmNoUGF0dGVyblsyXSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+Pj4gMjQgJiAweGZmOwogICAgICBzZWFyY2hQYXR0ZXJuWzNdID0gZ2VuZXJpY1JlZ2lvbkluZm8uaGVpZ2h0ID4+IDE2ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls0XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCA+PiA4ICYgMHhmZjsKICAgICAgc2VhcmNoUGF0dGVybls1XSA9IGdlbmVyaWNSZWdpb25JbmZvLmhlaWdodCAmIDB4ZmY7CiAgICAgIGZvciAoaSA9IHBvc2l0aW9uLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCBqID0gMDsKICAgICAgICB3aGlsZSAoaiA8IHNlYXJjaFBhdHRlcm5MZW5ndGggJiYgc2VhcmNoUGF0dGVybltqXSA9PT0gZGF0YVtpICsgal0pIHsKICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICAgICAgaWYgKGogPT09IHNlYXJjaFBhdHRlcm5MZW5ndGgpIHsKICAgICAgICAgIHNlZ21lbnRIZWFkZXIubGVuZ3RoID0gaSArIHNlYXJjaFBhdHRlcm5MZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNlZ21lbnRIZWFkZXIubGVuZ3RoID09PSAweGZmZmZmZmZmKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoInNlZ21lbnQgZW5kIHdhcyBub3QgZm91bmQiKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgdW5rbm93biBzZWdtZW50IGxlbmd0aCIpOwogICAgfQogIH0KICBzZWdtZW50SGVhZGVyLmhlYWRlckVuZCA9IHBvc2l0aW9uOwogIHJldHVybiBzZWdtZW50SGVhZGVyOwp9CmZ1bmN0aW9uIHJlYWRTZWdtZW50cyhoZWFkZXIsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICBjb25zdCBzZWdtZW50cyA9IFtdOwogIGxldCBwb3NpdGlvbiA9IHN0YXJ0OwogIHdoaWxlIChwb3NpdGlvbiA8IGVuZCkgewogICAgY29uc3Qgc2VnbWVudEhlYWRlciA9IHJlYWRTZWdtZW50SGVhZGVyKGRhdGEsIHBvc2l0aW9uKTsKICAgIHBvc2l0aW9uID0gc2VnbWVudEhlYWRlci5oZWFkZXJFbmQ7CiAgICBjb25zdCBzZWdtZW50ID0gewogICAgICBoZWFkZXI6IHNlZ21lbnRIZWFkZXIsCiAgICAgIGRhdGEKICAgIH07CiAgICBpZiAoIWhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgICAgc2VnbWVudC5zdGFydCA9IHBvc2l0aW9uOwogICAgICBwb3NpdGlvbiArPSBzZWdtZW50SGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudC5lbmQgPSBwb3NpdGlvbjsKICAgIH0KICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7CiAgICBpZiAoc2VnbWVudEhlYWRlci50eXBlID09PSA1MSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGhlYWRlci5yYW5kb21BY2Nlc3MpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgc2VnbWVudHNbaV0uc3RhcnQgPSBwb3NpdGlvbjsKICAgICAgcG9zaXRpb24gKz0gc2VnbWVudHNbaV0uaGVhZGVyLmxlbmd0aDsKICAgICAgc2VnbWVudHNbaV0uZW5kID0gcG9zaXRpb247CiAgICB9CiAgfQogIHJldHVybiBzZWdtZW50czsKfQpmdW5jdGlvbiByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHN0YXJ0KSB7CiAgcmV0dXJuIHsKICAgIHdpZHRoOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQpLAogICAgaGVpZ2h0OiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyA0KSwKICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBzdGFydCArIDgpLAogICAgeTogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgMTIpLAogICAgY29tYmluYXRpb25PcGVyYXRvcjogZGF0YVtzdGFydCArIDE2XSAmIDcKICB9Owp9CmNvbnN0IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoID0gMTc7CmZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHNlZ21lbnQsIHZpc2l0b3IpIHsKICBjb25zdCBoZWFkZXIgPSBzZWdtZW50LmhlYWRlcjsKICBjb25zdCBkYXRhID0gc2VnbWVudC5kYXRhLAogICAgZW5kID0gc2VnbWVudC5lbmQ7CiAgbGV0IHBvc2l0aW9uID0gc2VnbWVudC5zdGFydDsKICBsZXQgYXJncywgYXQsIGksIGF0TGVuZ3RoOwogIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHsKICAgIGNhc2UgMDoKICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHt9OwogICAgICBjb25zdCBkaWN0aW9uYXJ5RmxhZ3MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgICBkaWN0aW9uYXJ5Lmh1ZmZtYW4gPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKICAgICAgZGljdGlvbmFyeS5yZWZpbmVtZW50ID0gISEoZGljdGlvbmFyeUZsYWdzICYgMik7CiAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gMiAmIDM7CiAgICAgIGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNCAmIDM7CiAgICAgIGRpY3Rpb25hcnkuYml0bWFwU2l6ZVNlbGVjdG9yID0gZGljdGlvbmFyeUZsYWdzID4+IDYgJiAxOwogICAgICBkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gNyAmIDE7CiAgICAgIGRpY3Rpb25hcnkuYml0bWFwQ29kaW5nQ29udGV4dFVzZWQgPSAhIShkaWN0aW9uYXJ5RmxhZ3MgJiAyNTYpOwogICAgICBkaWN0aW9uYXJ5LmJpdG1hcENvZGluZ0NvbnRleHRSZXRhaW5lZCA9ICEhKGRpY3Rpb25hcnlGbGFncyAmIDUxMik7CiAgICAgIGRpY3Rpb25hcnkudGVtcGxhdGUgPSBkaWN0aW9uYXJ5RmxhZ3MgPj4gMTAgJiAzOwogICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRUZW1wbGF0ZSA9IGRpY3Rpb25hcnlGbGFncyA+PiAxMiAmIDE7CiAgICAgIHBvc2l0aW9uICs9IDI7CiAgICAgIGlmICghZGljdGlvbmFyeS5odWZmbWFuKSB7CiAgICAgICAgYXRMZW5ndGggPSBkaWN0aW9uYXJ5LnRlbXBsYXRlID09PSAwID8gNCA6IDE7CiAgICAgICAgYXQgPSBbXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRMZW5ndGg7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAogICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgZGljdGlvbmFyeS5hdCA9IGF0OwogICAgICB9CiAgICAgIGlmIChkaWN0aW9uYXJ5LnJlZmluZW1lbnQgJiYgIWRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlKSB7CiAgICAgICAgYXQgPSBbXTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICBhdC5wdXNoKHsKICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCA9IGF0OwogICAgICB9CiAgICAgIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSA0OwogICAgICBkaWN0aW9uYXJ5Lm51bWJlck9mTmV3U3ltYm9scyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGFyZ3MgPSBbZGljdGlvbmFyeSwgaGVhZGVyLm51bWJlciwgaGVhZGVyLnJlZmVycmVkVG8sIGRhdGEsIHBvc2l0aW9uLCBlbmRdOwogICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgICAgY29uc3QgdGV4dFJlZ2lvbiA9IHt9OwogICAgICB0ZXh0UmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CiAgICAgIGNvbnN0IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSAyOwogICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW4gPSAhISh0ZXh0UmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CiAgICAgIHRleHRSZWdpb24ucmVmaW5lbWVudCA9ICEhKHRleHRSZWdpb25TZWdtZW50RmxhZ3MgJiAyKTsKICAgICAgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemUgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzID4+IDIgJiAzOwogICAgICB0ZXh0UmVnaW9uLnN0cmlwU2l6ZSA9IDEgPDwgdGV4dFJlZ2lvbi5sb2dTdHJpcFNpemU7CiAgICAgIHRleHRSZWdpb24ucmVmZXJlbmNlQ29ybmVyID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA0ICYgMzsKICAgICAgdGV4dFJlZ2lvbi50cmFuc3Bvc2VkID0gISEodGV4dFJlZ2lvblNlZ21lbnRGbGFncyAmIDY0KTsKICAgICAgdGV4dFJlZ2lvbi5jb21iaW5hdGlvbk9wZXJhdG9yID0gdGV4dFJlZ2lvblNlZ21lbnRGbGFncyA+PiA3ICYgMzsKICAgICAgdGV4dFJlZ2lvbi5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gOSAmIDE7CiAgICAgIHRleHRSZWdpb24uZHNPZmZzZXQgPSB0ZXh0UmVnaW9uU2VnbWVudEZsYWdzIDw8IDE3ID4+IDI3OwogICAgICB0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSA9IHRleHRSZWdpb25TZWdtZW50RmxhZ3MgPj4gMTUgJiAxOwogICAgICBpZiAodGV4dFJlZ2lvbi5odWZmbWFuKSB7CiAgICAgICAgY29uc3QgdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5GUyA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hbkRTID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiAyICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5EVCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gNCAmIDM7CiAgICAgICAgdGV4dFJlZ2lvbi5odWZmbWFuUmVmaW5lbWVudERXID0gdGV4dFJlZ2lvbkh1ZmZtYW5GbGFncyA+PiA2ICYgMzsKICAgICAgICB0ZXh0UmVnaW9uLmh1ZmZtYW5SZWZpbmVtZW50REggPSB0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzID4+IDggJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWCA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTAgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnREWSA9IHRleHRSZWdpb25IdWZmbWFuRmxhZ3MgPj4gMTIgJiAzOwogICAgICAgIHRleHRSZWdpb24uaHVmZm1hblJlZmluZW1lbnRTaXplU2VsZWN0b3IgPSAhISh0ZXh0UmVnaW9uSHVmZm1hbkZsYWdzICYgMHg0MDAwKTsKICAgICAgfQogICAgICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50ICYmICF0ZXh0UmVnaW9uLnJlZmluZW1lbnRUZW1wbGF0ZSkgewogICAgICAgIGF0ID0gW107CiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgYXQucHVzaCh7CiAgICAgICAgICAgIHg6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24pLAogICAgICAgICAgICB5OiAoMCwgX2NvcmVfdXRpbHMucmVhZEludDgpKGRhdGEsIHBvc2l0aW9uICsgMSkKICAgICAgICAgIH0pOwogICAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgdGV4dFJlZ2lvbi5yZWZpbmVtZW50QXQgPSBhdDsKICAgICAgfQogICAgICB0ZXh0UmVnaW9uLm51bWJlck9mU3ltYm9sSW5zdGFuY2VzID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgYXJncyA9IFt0ZXh0UmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNjoKICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnkgPSB7fTsKICAgICAgY29uc3QgcGF0dGVybkRpY3Rpb25hcnlGbGFncyA9IGRhdGFbcG9zaXRpb24rK107CiAgICAgIHBhdHRlcm5EaWN0aW9uYXJ5Lm1tciA9ICEhKHBhdHRlcm5EaWN0aW9uYXJ5RmxhZ3MgJiAxKTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkudGVtcGxhdGUgPSBwYXR0ZXJuRGljdGlvbmFyeUZsYWdzID4+IDEgJiAzOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuV2lkdGggPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBwYXR0ZXJuRGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0ID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgcGF0dGVybkRpY3Rpb25hcnkubWF4UGF0dGVybkluZGV4ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgYXJncyA9IFtwYXR0ZXJuRGljdGlvbmFyeSwgaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAyMjoKICAgIGNhc2UgMjM6CiAgICAgIGNvbnN0IGhhbGZ0b25lUmVnaW9uID0ge307CiAgICAgIGhhbGZ0b25lUmVnaW9uLmluZm8gPSByZWFkUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gUmVnaW9uU2VnbWVudEluZm9ybWF0aW9uRmllbGRMZW5ndGg7CiAgICAgIGNvbnN0IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPSBkYXRhW3Bvc2l0aW9uKytdOwogICAgICBoYWxmdG9uZVJlZ2lvbi5tbXIgPSAhIShoYWxmdG9uZVJlZ2lvbkZsYWdzICYgMSk7CiAgICAgIGhhbGZ0b25lUmVnaW9uLnRlbXBsYXRlID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiAxICYgMzsKICAgICAgaGFsZnRvbmVSZWdpb24uZW5hYmxlU2tpcCA9ICEhKGhhbGZ0b25lUmVnaW9uRmxhZ3MgJiA4KTsKICAgICAgaGFsZnRvbmVSZWdpb24uY29tYmluYXRpb25PcGVyYXRvciA9IGhhbGZ0b25lUmVnaW9uRmxhZ3MgPj4gNCAmIDc7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlID0gaGFsZnRvbmVSZWdpb25GbGFncyA+PiA3ICYgMTsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFdpZHRoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gNDsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZEhlaWdodCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRPZmZzZXRYID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRPZmZzZXRZID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSAmIDB4ZmZmZmZmZmY7CiAgICAgIHBvc2l0aW9uICs9IDQ7CiAgICAgIGhhbGZ0b25lUmVnaW9uLmdyaWRWZWN0b3JYID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgaGFsZnRvbmVSZWdpb24uZ3JpZFZlY3RvclkgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSAyOwogICAgICBhcmdzID0gW2hhbGZ0b25lUmVnaW9uLCBoZWFkZXIucmVmZXJyZWRUbywgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAzODoKICAgIGNhc2UgMzk6CiAgICAgIGNvbnN0IGdlbmVyaWNSZWdpb24gPSB7fTsKICAgICAgZ2VuZXJpY1JlZ2lvbi5pbmZvID0gcmVhZFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbihkYXRhLCBwb3NpdGlvbik7CiAgICAgIHBvc2l0aW9uICs9IFJlZ2lvblNlZ21lbnRJbmZvcm1hdGlvbkZpZWxkTGVuZ3RoOwogICAgICBjb25zdCBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID0gZGF0YVtwb3NpdGlvbisrXTsKICAgICAgZ2VuZXJpY1JlZ2lvbi5tbXIgPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgMSk7CiAgICAgIGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPSBnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzID4+IDEgJiAzOwogICAgICBnZW5lcmljUmVnaW9uLnByZWRpY3Rpb24gPSAhIShnZW5lcmljUmVnaW9uU2VnbWVudEZsYWdzICYgOCk7CiAgICAgIGlmICghZ2VuZXJpY1JlZ2lvbi5tbXIpIHsKICAgICAgICBhdExlbmd0aCA9IGdlbmVyaWNSZWdpb24udGVtcGxhdGUgPT09IDAgPyA0IDogMTsKICAgICAgICBhdCA9IFtdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdExlbmd0aDsgaSsrKSB7CiAgICAgICAgICBhdC5wdXNoKHsKICAgICAgICAgICAgeDogKDAsIF9jb3JlX3V0aWxzLnJlYWRJbnQ4KShkYXRhLCBwb3NpdGlvbiksCiAgICAgICAgICAgIHk6ICgwLCBfY29yZV91dGlscy5yZWFkSW50OCkoZGF0YSwgcG9zaXRpb24gKyAxKQogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbiArPSAyOwogICAgICAgIH0KICAgICAgICBnZW5lcmljUmVnaW9uLmF0ID0gYXQ7CiAgICAgIH0KICAgICAgYXJncyA9IFtnZW5lcmljUmVnaW9uLCBkYXRhLCBwb3NpdGlvbiwgZW5kXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDQ4OgogICAgICBjb25zdCBwYWdlSW5mbyA9IHsKICAgICAgICB3aWR0aDogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uKSwKICAgICAgICBoZWlnaHQ6ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDQpLAogICAgICAgIHJlc29sdXRpb25YOiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA4KSwKICAgICAgICByZXNvbHV0aW9uWTogKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMTIpCiAgICAgIH07CiAgICAgIGlmIChwYWdlSW5mby5oZWlnaHQgPT09IDB4ZmZmZmZmZmYpIHsKICAgICAgICBkZWxldGUgcGFnZUluZm8uaGVpZ2h0OwogICAgICB9CiAgICAgIGNvbnN0IHBhZ2VTZWdtZW50RmxhZ3MgPSBkYXRhW3Bvc2l0aW9uICsgMTZdOwogICAgICAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAxNyk7CiAgICAgIHBhZ2VJbmZvLmxvc3NsZXNzID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDEpOwogICAgICBwYWdlSW5mby5yZWZpbmVtZW50ID0gISEocGFnZVNlZ21lbnRGbGFncyAmIDIpOwogICAgICBwYWdlSW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSA9IHBhZ2VTZWdtZW50RmxhZ3MgPj4gMiAmIDE7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3IgPSBwYWdlU2VnbWVudEZsYWdzID4+IDMgJiAzOwogICAgICBwYWdlSW5mby5yZXF1aXJlc0J1ZmZlciA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiAzMik7CiAgICAgIHBhZ2VJbmZvLmNvbWJpbmF0aW9uT3BlcmF0b3JPdmVycmlkZSA9ICEhKHBhZ2VTZWdtZW50RmxhZ3MgJiA2NCk7CiAgICAgIGFyZ3MgPSBbcGFnZUluZm9dOwogICAgICBicmVhazsKICAgIGNhc2UgNDk6CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MDoKICAgICAgYnJlYWs7CiAgICBjYXNlIDUxOgogICAgICBicmVhazsKICAgIGNhc2UgNTM6CiAgICAgIGFyZ3MgPSBbaGVhZGVyLm51bWJlciwgZGF0YSwgcG9zaXRpb24sIGVuZF07CiAgICAgIGJyZWFrOwogICAgY2FzZSA2MjoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc2VnbWVudCB0eXBlICR7aGVhZGVyLnR5cGVOYW1lfSgke2hlYWRlci50eXBlfSkgaXMgbm90IGltcGxlbWVudGVkYCk7CiAgfQogIGNvbnN0IGNhbGxiYWNrTmFtZSA9ICJvbiIgKyBoZWFkZXIudHlwZU5hbWU7CiAgaWYgKGNhbGxiYWNrTmFtZSBpbiB2aXNpdG9yKSB7CiAgICB2aXNpdG9yW2NhbGxiYWNrTmFtZV0uYXBwbHkodmlzaXRvciwgYXJncyk7CiAgfQp9CmZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50cyhzZWdtZW50cywgdmlzaXRvcikgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHNlZ21lbnRzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHByb2Nlc3NTZWdtZW50KHNlZ21lbnRzW2ldLCB2aXNpdG9yKTsKICB9Cn0KZnVuY3Rpb24gcGFyc2VKYmlnMkNodW5rcyhjaHVua3MpIHsKICBjb25zdCB2aXNpdG9yID0gbmV3IFNpbXBsZVNlZ21lbnRWaXNpdG9yKCk7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2h1bmtzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNodW5rID0gY2h1bmtzW2ldOwogICAgY29uc3Qgc2VnbWVudHMgPSByZWFkU2VnbWVudHMoe30sIGNodW5rLmRhdGEsIGNodW5rLnN0YXJ0LCBjaHVuay5lbmQpOwogICAgcHJvY2Vzc1NlZ21lbnRzKHNlZ21lbnRzLCB2aXNpdG9yKTsKICB9CiAgcmV0dXJuIHZpc2l0b3IuYnVmZmVyOwp9CmZ1bmN0aW9uIHBhcnNlSmJpZzIoZGF0YSkgewogIHRocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkOiBwYXJzZUpiaWcyIik7Cn0KY2xhc3MgU2ltcGxlU2VnbWVudFZpc2l0b3IgewogIG9uUGFnZUluZm9ybWF0aW9uKGluZm8pIHsKICAgIHRoaXMuY3VycmVudFBhZ2VJbmZvID0gaW5mbzsKICAgIGNvbnN0IHJvd1NpemUgPSBpbmZvLndpZHRoICsgNyA+PiAzOwogICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKiBpbmZvLmhlaWdodCk7CiAgICBpZiAoaW5mby5kZWZhdWx0UGl4ZWxWYWx1ZSkgewogICAgICBidWZmZXIuZmlsbCgweGZmKTsKICAgIH0KICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogIH0KICBkcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCkgewogICAgY29uc3QgcGFnZUluZm8gPSB0aGlzLmN1cnJlbnRQYWdlSW5mbzsKICAgIGNvbnN0IHdpZHRoID0gcmVnaW9uSW5mby53aWR0aCwKICAgICAgaGVpZ2h0ID0gcmVnaW9uSW5mby5oZWlnaHQ7CiAgICBjb25zdCByb3dTaXplID0gcGFnZUluZm8ud2lkdGggKyA3ID4+IDM7CiAgICBjb25zdCBjb21iaW5hdGlvbk9wZXJhdG9yID0gcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvck92ZXJyaWRlID8gcmVnaW9uSW5mby5jb21iaW5hdGlvbk9wZXJhdG9yIDogcGFnZUluZm8uY29tYmluYXRpb25PcGVyYXRvcjsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgY29uc3QgbWFzazAgPSAxMjggPj4gKHJlZ2lvbkluZm8ueCAmIDcpOwogICAgbGV0IG9mZnNldDAgPSByZWdpb25JbmZvLnkgKiByb3dTaXplICsgKHJlZ2lvbkluZm8ueCA+PiAzKTsKICAgIGxldCBpLCBqLCBtYXNrLCBvZmZzZXQ7CiAgICBzd2l0Y2ggKGNvbWJpbmF0aW9uT3BlcmF0b3IpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgICAgbWFzayA9IG1hc2swOwogICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MDsKICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgICAgIGlmIChiaXRtYXBbaV1bal0pIHsKICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0XSB8PSBtYXNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hc2sgPj49IDE7CiAgICAgICAgICAgIGlmICghbWFzaykgewogICAgICAgICAgICAgIG1hc2sgPSAxMjg7CiAgICAgICAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG9mZnNldDAgKz0gcm93U2l6ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgICAgICAgIG1hc2sgPSBtYXNrMDsKICAgICAgICAgIG9mZnNldCA9IG9mZnNldDA7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICAgICAgICBpZiAoYml0bWFwW2ldW2pdKSB7CiAgICAgICAgICAgICAgYnVmZmVyW29mZnNldF0gXj0gbWFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXNrID4+PSAxOwogICAgICAgICAgICBpZiAoIW1hc2spIHsKICAgICAgICAgICAgICBtYXNrID0gMTI4OwogICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQwICs9IHJvd1NpemU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKGBvcGVyYXRvciAke2NvbWJpbmF0aW9uT3BlcmF0b3J9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgIH0KICB9CiAgb25JbW1lZGlhdGVHZW5lcmljUmVnaW9uKHJlZ2lvbiwgZGF0YSwgc3RhcnQsIGVuZCkgewogICAgY29uc3QgcmVnaW9uSW5mbyA9IHJlZ2lvbi5pbmZvOwogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZUJpdG1hcChyZWdpb24ubW1yLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLnRlbXBsYXRlLCByZWdpb24ucHJlZGljdGlvbiwgbnVsbCwgcmVnaW9uLmF0LCBkZWNvZGluZ0NvbnRleHQpOwogICAgdGhpcy5kcmF3Qml0bWFwKHJlZ2lvbkluZm8sIGJpdG1hcCk7CiAgfQogIG9uSW1tZWRpYXRlTG9zc2xlc3NHZW5lcmljUmVnaW9uKCkgewogICAgdGhpcy5vbkltbWVkaWF0ZUdlbmVyaWNSZWdpb24oLi4uYXJndW1lbnRzKTsKICB9CiAgb25TeW1ib2xEaWN0aW9uYXJ5KGRpY3Rpb25hcnksIGN1cnJlbnRTZWdtZW50LCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgaWYgKGRpY3Rpb25hcnkuaHVmZm1hbikgewogICAgICBodWZmbWFuVGFibGVzID0gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRTZWdtZW50cywgdGhpcy5jdXN0b21UYWJsZXMpOwogICAgICBodWZmbWFuSW5wdXQgPSBuZXcgUmVhZGVyKGRhdGEsIHN0YXJ0LCBlbmQpOwogICAgfQogICAgbGV0IHN5bWJvbHMgPSB0aGlzLnN5bWJvbHM7CiAgICBpZiAoIXN5bWJvbHMpIHsKICAgICAgdGhpcy5zeW1ib2xzID0gc3ltYm9scyA9IHt9OwogICAgfQogICAgY29uc3QgaW5wdXRTeW1ib2xzID0gW107CiAgICBmb3IgKGNvbnN0IHJlZmVycmVkU2VnbWVudCBvZiByZWZlcnJlZFNlZ21lbnRzKSB7CiAgICAgIGNvbnN0IHJlZmVycmVkU3ltYm9scyA9IHN5bWJvbHNbcmVmZXJyZWRTZWdtZW50XTsKICAgICAgaWYgKHJlZmVycmVkU3ltYm9scykgewogICAgICAgIGlucHV0U3ltYm9scy5wdXNoKC4uLnJlZmVycmVkU3ltYm9scyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBzeW1ib2xzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVN5bWJvbERpY3Rpb25hcnkoZGljdGlvbmFyeS5odWZmbWFuLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnQsIGlucHV0U3ltYm9scywgZGljdGlvbmFyeS5udW1iZXJPZk5ld1N5bWJvbHMsIGRpY3Rpb25hcnkubnVtYmVyT2ZFeHBvcnRlZFN5bWJvbHMsIGh1ZmZtYW5UYWJsZXMsIGRpY3Rpb25hcnkudGVtcGxhdGUsIGRpY3Rpb25hcnkuYXQsIGRpY3Rpb25hcnkucmVmaW5lbWVudFRlbXBsYXRlLCBkaWN0aW9uYXJ5LnJlZmluZW1lbnRBdCwgZGVjb2RpbmdDb250ZXh0LCBodWZmbWFuSW5wdXQpOwogIH0KICBvbkltbWVkaWF0ZVRleHRSZWdpb24ocmVnaW9uLCByZWZlcnJlZFNlZ21lbnRzLCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBjb25zdCByZWdpb25JbmZvID0gcmVnaW9uLmluZm87CiAgICBsZXQgaHVmZm1hblRhYmxlcywgaHVmZm1hbklucHV0OwogICAgY29uc3Qgc3ltYm9scyA9IHRoaXMuc3ltYm9sczsKICAgIGNvbnN0IGlucHV0U3ltYm9scyA9IFtdOwogICAgZm9yIChjb25zdCByZWZlcnJlZFNlZ21lbnQgb2YgcmVmZXJyZWRTZWdtZW50cykgewogICAgICBjb25zdCByZWZlcnJlZFN5bWJvbHMgPSBzeW1ib2xzW3JlZmVycmVkU2VnbWVudF07CiAgICAgIGlmIChyZWZlcnJlZFN5bWJvbHMpIHsKICAgICAgICBpbnB1dFN5bWJvbHMucHVzaCguLi5yZWZlcnJlZFN5bWJvbHMpOwogICAgICB9CiAgICB9CiAgICBjb25zdCBzeW1ib2xDb2RlTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKGlucHV0U3ltYm9scy5sZW5ndGgpOwogICAgaWYgKHJlZ2lvbi5odWZmbWFuKSB7CiAgICAgIGh1ZmZtYW5JbnB1dCA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICAgIGh1ZmZtYW5UYWJsZXMgPSBnZXRUZXh0UmVnaW9uSHVmZm1hblRhYmxlcyhyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIHRoaXMuY3VzdG9tVGFibGVzLCBpbnB1dFN5bWJvbHMubGVuZ3RoLCBodWZmbWFuSW5wdXQpOwogICAgfQogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIGNvbnN0IGJpdG1hcCA9IGRlY29kZVRleHRSZWdpb24ocmVnaW9uLmh1ZmZtYW4sIHJlZ2lvbi5yZWZpbmVtZW50LCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24ubnVtYmVyT2ZTeW1ib2xJbnN0YW5jZXMsIHJlZ2lvbi5zdHJpcFNpemUsIGlucHV0U3ltYm9scywgc3ltYm9sQ29kZUxlbmd0aCwgcmVnaW9uLnRyYW5zcG9zZWQsIHJlZ2lvbi5kc09mZnNldCwgcmVnaW9uLnJlZmVyZW5jZUNvcm5lciwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIGh1ZmZtYW5UYWJsZXMsIHJlZ2lvbi5yZWZpbmVtZW50VGVtcGxhdGUsIHJlZ2lvbi5yZWZpbmVtZW50QXQsIGRlY29kaW5nQ29udGV4dCwgcmVnaW9uLmxvZ1N0cmlwU2l6ZSwgaHVmZm1hbklucHV0KTsKICAgIHRoaXMuZHJhd0JpdG1hcChyZWdpb25JbmZvLCBiaXRtYXApOwogIH0KICBvbkltbWVkaWF0ZUxvc3NsZXNzVGV4dFJlZ2lvbigpIHsKICAgIHRoaXMub25JbW1lZGlhdGVUZXh0UmVnaW9uKC4uLmFyZ3VtZW50cyk7CiAgfQogIG9uUGF0dGVybkRpY3Rpb25hcnkoZGljdGlvbmFyeSwgY3VycmVudFNlZ21lbnQsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGxldCBwYXR0ZXJucyA9IHRoaXMucGF0dGVybnM7CiAgICBpZiAoIXBhdHRlcm5zKSB7CiAgICAgIHRoaXMucGF0dGVybnMgPSBwYXR0ZXJucyA9IHt9OwogICAgfQogICAgY29uc3QgZGVjb2RpbmdDb250ZXh0ID0gbmV3IERlY29kaW5nQ29udGV4dChkYXRhLCBzdGFydCwgZW5kKTsKICAgIHBhdHRlcm5zW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVBhdHRlcm5EaWN0aW9uYXJ5KGRpY3Rpb25hcnkubW1yLCBkaWN0aW9uYXJ5LnBhdHRlcm5XaWR0aCwgZGljdGlvbmFyeS5wYXR0ZXJuSGVpZ2h0LCBkaWN0aW9uYXJ5Lm1heFBhdHRlcm5JbmRleCwgZGljdGlvbmFyeS50ZW1wbGF0ZSwgZGVjb2RpbmdDb250ZXh0KTsKICB9CiAgb25JbW1lZGlhdGVIYWxmdG9uZVJlZ2lvbihyZWdpb24sIHJlZmVycmVkU2VnbWVudHMsIGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wYXR0ZXJuc1tyZWZlcnJlZFNlZ21lbnRzWzBdXTsKICAgIGNvbnN0IHJlZ2lvbkluZm8gPSByZWdpb24uaW5mbzsKICAgIGNvbnN0IGRlY29kaW5nQ29udGV4dCA9IG5ldyBEZWNvZGluZ0NvbnRleHQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgICBjb25zdCBiaXRtYXAgPSBkZWNvZGVIYWxmdG9uZVJlZ2lvbihyZWdpb24ubW1yLCBwYXR0ZXJucywgcmVnaW9uLnRlbXBsYXRlLCByZWdpb25JbmZvLndpZHRoLCByZWdpb25JbmZvLmhlaWdodCwgcmVnaW9uLmRlZmF1bHRQaXhlbFZhbHVlLCByZWdpb24uZW5hYmxlU2tpcCwgcmVnaW9uLmNvbWJpbmF0aW9uT3BlcmF0b3IsIHJlZ2lvbi5ncmlkV2lkdGgsIHJlZ2lvbi5ncmlkSGVpZ2h0LCByZWdpb24uZ3JpZE9mZnNldFgsIHJlZ2lvbi5ncmlkT2Zmc2V0WSwgcmVnaW9uLmdyaWRWZWN0b3JYLCByZWdpb24uZ3JpZFZlY3RvclksIGRlY29kaW5nQ29udGV4dCk7CiAgICB0aGlzLmRyYXdCaXRtYXAocmVnaW9uSW5mbywgYml0bWFwKTsKICB9CiAgb25JbW1lZGlhdGVMb3NzbGVzc0hhbGZ0b25lUmVnaW9uKCkgewogICAgdGhpcy5vbkltbWVkaWF0ZUhhbGZ0b25lUmVnaW9uKC4uLmFyZ3VtZW50cyk7CiAgfQogIG9uVGFibGVzKGN1cnJlbnRTZWdtZW50LCBkYXRhLCBzdGFydCwgZW5kKSB7CiAgICBsZXQgY3VzdG9tVGFibGVzID0gdGhpcy5jdXN0b21UYWJsZXM7CiAgICBpZiAoIWN1c3RvbVRhYmxlcykgewogICAgICB0aGlzLmN1c3RvbVRhYmxlcyA9IGN1c3RvbVRhYmxlcyA9IHt9OwogICAgfQogICAgY3VzdG9tVGFibGVzW2N1cnJlbnRTZWdtZW50XSA9IGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCk7CiAgfQp9CmNsYXNzIEh1ZmZtYW5MaW5lIHsKICBjb25zdHJ1Y3RvcihsaW5lRGF0YSkgewogICAgaWYgKGxpbmVEYXRhLmxlbmd0aCA9PT0gMikgewogICAgICB0aGlzLmlzT09CID0gdHJ1ZTsKICAgICAgdGhpcy5yYW5nZUxvdyA9IDA7CiAgICAgIHRoaXMucHJlZml4TGVuZ3RoID0gbGluZURhdGFbMF07CiAgICAgIHRoaXMucmFuZ2VMZW5ndGggPSAwOwogICAgICB0aGlzLnByZWZpeENvZGUgPSBsaW5lRGF0YVsxXTsKICAgICAgdGhpcy5pc0xvd2VyUmFuZ2UgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNPT0IgPSBmYWxzZTsKICAgICAgdGhpcy5yYW5nZUxvdyA9IGxpbmVEYXRhWzBdOwogICAgICB0aGlzLnByZWZpeExlbmd0aCA9IGxpbmVEYXRhWzFdOwogICAgICB0aGlzLnJhbmdlTGVuZ3RoID0gbGluZURhdGFbMl07CiAgICAgIHRoaXMucHJlZml4Q29kZSA9IGxpbmVEYXRhWzNdOwogICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmVEYXRhWzRdID09PSAibG93ZXIiOwogICAgfQogIH0KfQpjbGFzcyBIdWZmbWFuVHJlZU5vZGUgewogIGNvbnN0cnVjdG9yKGxpbmUpIHsKICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgIGlmIChsaW5lKSB7CiAgICAgIHRoaXMuaXNMZWFmID0gdHJ1ZTsKICAgICAgdGhpcy5yYW5nZUxlbmd0aCA9IGxpbmUucmFuZ2VMZW5ndGg7CiAgICAgIHRoaXMucmFuZ2VMb3cgPSBsaW5lLnJhbmdlTG93OwogICAgICB0aGlzLmlzTG93ZXJSYW5nZSA9IGxpbmUuaXNMb3dlclJhbmdlOwogICAgICB0aGlzLmlzT09CID0gbGluZS5pc09PQjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaXNMZWFmID0gZmFsc2U7CiAgICB9CiAgfQogIGJ1aWxkVHJlZShsaW5lLCBzaGlmdCkgewogICAgY29uc3QgYml0ID0gbGluZS5wcmVmaXhDb2RlID4+IHNoaWZ0ICYgMTsKICAgIGlmIChzaGlmdCA8PSAwKSB7CiAgICAgIHRoaXMuY2hpbGRyZW5bYml0XSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobGluZSk7CiAgICB9IGVsc2UgewogICAgICBsZXQgbm9kZSA9IHRoaXMuY2hpbGRyZW5bYml0XTsKICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgdGhpcy5jaGlsZHJlbltiaXRdID0gbm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CiAgICAgIH0KICAgICAgbm9kZS5idWlsZFRyZWUobGluZSwgc2hpZnQgLSAxKTsKICAgIH0KICB9CiAgZGVjb2RlTm9kZShyZWFkZXIpIHsKICAgIGlmICh0aGlzLmlzTGVhZikgewogICAgICBpZiAodGhpcy5pc09PQikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IGh0T2Zmc2V0ID0gcmVhZGVyLnJlYWRCaXRzKHRoaXMucmFuZ2VMZW5ndGgpOwogICAgICByZXR1cm4gdGhpcy5yYW5nZUxvdyArICh0aGlzLmlzTG93ZXJSYW5nZSA/IC1odE9mZnNldCA6IGh0T2Zmc2V0KTsKICAgIH0KICAgIGNvbnN0IG5vZGUgPSB0aGlzLmNoaWxkcmVuW3JlYWRlci5yZWFkQml0KCldOwogICAgaWYgKCFub2RlKSB7CiAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJpbnZhbGlkIEh1ZmZtYW4gZGF0YSIpOwogICAgfQogICAgcmV0dXJuIG5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOwogIH0KfQpjbGFzcyBIdWZmbWFuVGFibGUgewogIGNvbnN0cnVjdG9yKGxpbmVzLCBwcmVmaXhDb2Rlc0RvbmUpIHsKICAgIGlmICghcHJlZml4Q29kZXNEb25lKSB7CiAgICAgIHRoaXMuYXNzaWduUHJlZml4Q29kZXMobGluZXMpOwogICAgfQogICAgdGhpcy5yb290Tm9kZSA9IG5ldyBIdWZmbWFuVHJlZU5vZGUobnVsbCk7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTsKICAgICAgaWYgKGxpbmUucHJlZml4TGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMucm9vdE5vZGUuYnVpbGRUcmVlKGxpbmUsIGxpbmUucHJlZml4TGVuZ3RoIC0gMSk7CiAgICAgIH0KICAgIH0KICB9CiAgZGVjb2RlKHJlYWRlcikgewogICAgcmV0dXJuIHRoaXMucm9vdE5vZGUuZGVjb2RlTm9kZShyZWFkZXIpOwogIH0KICBhc3NpZ25QcmVmaXhDb2RlcyhsaW5lcykgewogICAgY29uc3QgbGluZXNMZW5ndGggPSBsaW5lcy5sZW5ndGg7CiAgICBsZXQgcHJlZml4TGVuZ3RoTWF4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNMZW5ndGg7IGkrKykgewogICAgICBwcmVmaXhMZW5ndGhNYXggPSBNYXRoLm1heChwcmVmaXhMZW5ndGhNYXgsIGxpbmVzW2ldLnByZWZpeExlbmd0aCk7CiAgICB9CiAgICBjb25zdCBoaXN0b2dyYW0gPSBuZXcgVWludDMyQXJyYXkocHJlZml4TGVuZ3RoTWF4ICsgMSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKICAgICAgaGlzdG9ncmFtW2xpbmVzW2ldLnByZWZpeExlbmd0aF0rKzsKICAgIH0KICAgIGxldCBjdXJyZW50TGVuZ3RoID0gMSwKICAgICAgZmlyc3RDb2RlID0gMCwKICAgICAgY3VycmVudENvZGUsCiAgICAgIGN1cnJlbnRUZW1wLAogICAgICBsaW5lOwogICAgaGlzdG9ncmFtWzBdID0gMDsKICAgIHdoaWxlIChjdXJyZW50TGVuZ3RoIDw9IHByZWZpeExlbmd0aE1heCkgewogICAgICBmaXJzdENvZGUgPSBmaXJzdENvZGUgKyBoaXN0b2dyYW1bY3VycmVudExlbmd0aCAtIDFdIDw8IDE7CiAgICAgIGN1cnJlbnRDb2RlID0gZmlyc3RDb2RlOwogICAgICBjdXJyZW50VGVtcCA9IDA7CiAgICAgIHdoaWxlIChjdXJyZW50VGVtcCA8IGxpbmVzTGVuZ3RoKSB7CiAgICAgICAgbGluZSA9IGxpbmVzW2N1cnJlbnRUZW1wXTsKICAgICAgICBpZiAobGluZS5wcmVmaXhMZW5ndGggPT09IGN1cnJlbnRMZW5ndGgpIHsKICAgICAgICAgIGxpbmUucHJlZml4Q29kZSA9IGN1cnJlbnRDb2RlOwogICAgICAgICAgY3VycmVudENvZGUrKzsKICAgICAgICB9CiAgICAgICAgY3VycmVudFRlbXArKzsKICAgICAgfQogICAgICBjdXJyZW50TGVuZ3RoKys7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGRlY29kZVRhYmxlc1NlZ21lbnQoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IGZsYWdzID0gZGF0YVtzdGFydF07CiAgY29uc3QgbG93ZXN0VmFsdWUgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgc3RhcnQgKyAxKSAmIDB4ZmZmZmZmZmY7CiAgY29uc3QgaGlnaGVzdFZhbHVlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHN0YXJ0ICsgNSkgJiAweGZmZmZmZmZmOwogIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXIoZGF0YSwgc3RhcnQgKyA5LCBlbmQpOwogIGNvbnN0IHByZWZpeFNpemVCaXRzID0gKGZsYWdzID4+IDEgJiA3KSArIDE7CiAgY29uc3QgcmFuZ2VTaXplQml0cyA9IChmbGFncyA+PiA0ICYgNykgKyAxOwogIGNvbnN0IGxpbmVzID0gW107CiAgbGV0IHByZWZpeExlbmd0aCwKICAgIHJhbmdlTGVuZ3RoLAogICAgY3VycmVudFJhbmdlTG93ID0gbG93ZXN0VmFsdWU7CiAgZG8gewogICAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICAgIHJhbmdlTGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHJhbmdlU2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2N1cnJlbnRSYW5nZUxvdywgcHJlZml4TGVuZ3RoLCByYW5nZUxlbmd0aCwgMF0pKTsKICAgIGN1cnJlbnRSYW5nZUxvdyArPSAxIDw8IHJhbmdlTGVuZ3RoOwogIH0gd2hpbGUgKGN1cnJlbnRSYW5nZUxvdyA8IGhpZ2hlc3RWYWx1ZSk7CiAgcHJlZml4TGVuZ3RoID0gcmVhZGVyLnJlYWRCaXRzKHByZWZpeFNpemVCaXRzKTsKICBsaW5lcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbbG93ZXN0VmFsdWUgLSAxLCBwcmVmaXhMZW5ndGgsIDMyLCAwLCAibG93ZXIiXSkpOwogIHByZWZpeExlbmd0aCA9IHJlYWRlci5yZWFkQml0cyhwcmVmaXhTaXplQml0cyk7CiAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW2hpZ2hlc3RWYWx1ZSwgcHJlZml4TGVuZ3RoLCAzMiwgMF0pKTsKICBpZiAoZmxhZ3MgJiAxKSB7CiAgICBwcmVmaXhMZW5ndGggPSByZWFkZXIucmVhZEJpdHMocHJlZml4U2l6ZUJpdHMpOwogICAgbGluZXMucHVzaChuZXcgSHVmZm1hbkxpbmUoW3ByZWZpeExlbmd0aCwgMF0pKTsKICB9CiAgcmV0dXJuIG5ldyBIdWZmbWFuVGFibGUobGluZXMsIGZhbHNlKTsKfQpjb25zdCBzdGFuZGFyZFRhYmxlc0NhY2hlID0ge307CmZ1bmN0aW9uIGdldFN0YW5kYXJkVGFibGUobnVtYmVyKSB7CiAgbGV0IHRhYmxlID0gc3RhbmRhcmRUYWJsZXNDYWNoZVtudW1iZXJdOwogIGlmICh0YWJsZSkgewogICAgcmV0dXJuIHRhYmxlOwogIH0KICBsZXQgbGluZXM7CiAgc3dpdGNoIChudW1iZXIpIHsKICAgIGNhc2UgMToKICAgICAgbGluZXMgPSBbWzAsIDEsIDQsIDB4MF0sIFsxNiwgMiwgOCwgMHgyXSwgWzI3MiwgMywgMTYsIDB4Nl0sIFs2NTgwOCwgMywgMzIsIDB4N11dOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgbGluZXMgPSBbWzAsIDEsIDAsIDB4MF0sIFsxLCAyLCAwLCAweDJdLCBbMiwgMywgMCwgMHg2XSwgWzMsIDQsIDMsIDB4ZV0sIFsxMSwgNSwgNiwgMHgxZV0sIFs3NSwgNiwgMzIsIDB4M2VdLCBbNiwgMHgzZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgbGluZXMgPSBbWy0yNTYsIDgsIDgsIDB4ZmVdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDIsIDAsIDB4Ml0sIFsyLCAzLCAwLCAweDZdLCBbMywgNCwgMywgMHhlXSwgWzExLCA1LCA2LCAweDFlXSwgWy0yNTcsIDgsIDMyLCAweGZmLCAibG93ZXIiXSwgWzc1LCA3LCAzMiwgMHg3ZV0sIFs2LCAweDNlXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWzc2LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgNToKICAgICAgbGluZXMgPSBbWy0yNTUsIDcsIDgsIDB4N2VdLCBbMSwgMSwgMCwgMHgwXSwgWzIsIDIsIDAsIDB4Ml0sIFszLCAzLCAwLCAweDZdLCBbNCwgNCwgMywgMHhlXSwgWzEyLCA1LCA2LCAweDFlXSwgWy0yNTYsIDcsIDMyLCAweDdmLCAibG93ZXIiXSwgWzc2LCA2LCAzMiwgMHgzZV1dOwogICAgICBicmVhazsKICAgIGNhc2UgNjoKICAgICAgbGluZXMgPSBbWy0yMDQ4LCA1LCAxMCwgMHgxY10sIFstMTAyNCwgNCwgOSwgMHg4XSwgWy01MTIsIDQsIDgsIDB4OV0sIFstMjU2LCA0LCA3LCAweGFdLCBbLTEyOCwgNSwgNiwgMHgxZF0sIFstNjQsIDUsIDUsIDB4MWVdLCBbLTMyLCA0LCA1LCAweGJdLCBbMCwgMiwgNywgMHgwXSwgWzEyOCwgMywgNywgMHgyXSwgWzI1NiwgMywgOCwgMHgzXSwgWzUxMiwgNCwgOSwgMHhjXSwgWzEwMjQsIDQsIDEwLCAweGRdLCBbLTIwNDksIDYsIDMyLCAweDNlLCAibG93ZXIiXSwgWzIwNDgsIDYsIDMyLCAweDNmXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSA3OgogICAgICBsaW5lcyA9IFtbLTEwMjQsIDQsIDksIDB4OF0sIFstNTEyLCAzLCA4LCAweDBdLCBbLTI1NiwgNCwgNywgMHg5XSwgWy0xMjgsIDUsIDYsIDB4MWFdLCBbLTY0LCA1LCA1LCAweDFiXSwgWy0zMiwgNCwgNSwgMHhhXSwgWzAsIDQsIDUsIDB4Yl0sIFszMiwgNSwgNSwgMHgxY10sIFs2NCwgNSwgNiwgMHgxZF0sIFsxMjgsIDQsIDcsIDB4Y10sIFsyNTYsIDMsIDgsIDB4MV0sIFs1MTIsIDMsIDksIDB4Ml0sIFsxMDI0LCAzLCAxMCwgMHgzXSwgWy0xMDI1LCA1LCAzMiwgMHgxZSwgImxvd2VyIl0sIFsyMDQ4LCA1LCAzMiwgMHgxZl1dOwogICAgICBicmVhazsKICAgIGNhc2UgODoKICAgICAgbGluZXMgPSBbWy0xNSwgOCwgMywgMHhmY10sIFstNywgOSwgMSwgMHgxZmNdLCBbLTUsIDgsIDEsIDB4ZmRdLCBbLTMsIDksIDAsIDB4MWZkXSwgWy0yLCA3LCAwLCAweDdjXSwgWy0xLCA0LCAwLCAweGFdLCBbMCwgMiwgMSwgMHgwXSwgWzIsIDUsIDAsIDB4MWFdLCBbMywgNiwgMCwgMHgzYV0sIFs0LCAzLCA0LCAweDRdLCBbMjAsIDYsIDEsIDB4M2JdLCBbMjIsIDQsIDQsIDB4Yl0sIFszOCwgNCwgNSwgMHhjXSwgWzcwLCA1LCA2LCAweDFiXSwgWzEzNCwgNSwgNywgMHgxY10sIFsyNjIsIDYsIDcsIDB4M2NdLCBbMzkwLCA3LCA4LCAweDdkXSwgWzY0NiwgNiwgMTAsIDB4M2RdLCBbLTE2LCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMTY3MCwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MV1dOwogICAgICBicmVhazsKICAgIGNhc2UgOToKICAgICAgbGluZXMgPSBbWy0zMSwgOCwgNCwgMHhmY10sIFstMTUsIDksIDIsIDB4MWZjXSwgWy0xMSwgOCwgMiwgMHhmZF0sIFstNywgOSwgMSwgMHgxZmRdLCBbLTUsIDcsIDEsIDB4N2NdLCBbLTMsIDQsIDEsIDB4YV0sIFstMSwgMywgMSwgMHgyXSwgWzEsIDMsIDEsIDB4M10sIFszLCA1LCAxLCAweDFhXSwgWzUsIDYsIDEsIDB4M2FdLCBbNywgMywgNSwgMHg0XSwgWzM5LCA2LCAyLCAweDNiXSwgWzQzLCA0LCA1LCAweGJdLCBbNzUsIDQsIDYsIDB4Y10sIFsxMzksIDUsIDcsIDB4MWJdLCBbMjY3LCA1LCA4LCAweDFjXSwgWzUyMywgNiwgOCwgMHgzY10sIFs3NzksIDcsIDksIDB4N2RdLCBbMTI5MSwgNiwgMTEsIDB4M2RdLCBbLTMyLCA5LCAzMiwgMHgxZmUsICJsb3dlciJdLCBbMzMzOSwgOSwgMzIsIDB4MWZmXSwgWzIsIDB4MF1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTA6CiAgICAgIGxpbmVzID0gW1stMjEsIDcsIDQsIDB4N2FdLCBbLTUsIDgsIDAsIDB4ZmNdLCBbLTQsIDcsIDAsIDB4N2JdLCBbLTMsIDUsIDAsIDB4MThdLCBbLTIsIDIsIDIsIDB4MF0sIFsyLCA1LCAwLCAweDE5XSwgWzMsIDYsIDAsIDB4MzZdLCBbNCwgNywgMCwgMHg3Y10sIFs1LCA4LCAwLCAweGZkXSwgWzYsIDIsIDYsIDB4MV0sIFs3MCwgNSwgNSwgMHgxYV0sIFsxMDIsIDYsIDUsIDB4MzddLCBbMTM0LCA2LCA2LCAweDM4XSwgWzE5OCwgNiwgNywgMHgzOV0sIFszMjYsIDYsIDgsIDB4M2FdLCBbNTgyLCA2LCA5LCAweDNiXSwgWzEwOTQsIDYsIDEwLCAweDNjXSwgWzIxMTgsIDcsIDExLCAweDdkXSwgWy0yMiwgOCwgMzIsIDB4ZmUsICJsb3dlciJdLCBbNDE2NiwgOCwgMzIsIDB4ZmZdLCBbMiwgMHgyXV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgbGluZXMgPSBbWzEsIDEsIDAsIDB4MF0sIFsyLCAyLCAxLCAweDJdLCBbNCwgNCwgMCwgMHhjXSwgWzUsIDQsIDEsIDB4ZF0sIFs3LCA1LCAxLCAweDFjXSwgWzksIDUsIDIsIDB4MWRdLCBbMTMsIDYsIDIsIDB4M2NdLCBbMTcsIDcsIDIsIDB4N2FdLCBbMjEsIDcsIDMsIDB4N2JdLCBbMjksIDcsIDQsIDB4N2NdLCBbNDUsIDcsIDUsIDB4N2RdLCBbNzcsIDcsIDYsIDB4N2VdLCBbMTQxLCA3LCAzMiwgMHg3Zl1dOwogICAgICBicmVhazsKICAgIGNhc2UgMTI6CiAgICAgIGxpbmVzID0gW1sxLCAxLCAwLCAweDBdLCBbMiwgMiwgMCwgMHgyXSwgWzMsIDMsIDEsIDB4Nl0sIFs1LCA1LCAwLCAweDFjXSwgWzYsIDUsIDEsIDB4MWRdLCBbOCwgNiwgMSwgMHgzY10sIFsxMCwgNywgMCwgMHg3YV0sIFsxMSwgNywgMSwgMHg3Yl0sIFsxMywgNywgMiwgMHg3Y10sIFsxNywgNywgMywgMHg3ZF0sIFsyNSwgNywgNCwgMHg3ZV0sIFs0MSwgOCwgNSwgMHhmZV0sIFs3MywgOCwgMzIsIDB4ZmZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDEzOgogICAgICBsaW5lcyA9IFtbMSwgMSwgMCwgMHgwXSwgWzIsIDMsIDAsIDB4NF0sIFszLCA0LCAwLCAweGNdLCBbNCwgNSwgMCwgMHgxY10sIFs1LCA0LCAxLCAweGRdLCBbNywgMywgMywgMHg1XSwgWzE1LCA2LCAxLCAweDNhXSwgWzE3LCA2LCAyLCAweDNiXSwgWzIxLCA2LCAzLCAweDNjXSwgWzI5LCA2LCA0LCAweDNkXSwgWzQ1LCA2LCA1LCAweDNlXSwgWzc3LCA3LCA2LCAweDdlXSwgWzE0MSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE0OgogICAgICBsaW5lcyA9IFtbLTIsIDMsIDAsIDB4NF0sIFstMSwgMywgMCwgMHg1XSwgWzAsIDEsIDAsIDB4MF0sIFsxLCAzLCAwLCAweDZdLCBbMiwgMywgMCwgMHg3XV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNToKICAgICAgbGluZXMgPSBbWy0yNCwgNywgNCwgMHg3Y10sIFstOCwgNiwgMiwgMHgzY10sIFstNCwgNSwgMSwgMHgxY10sIFstMiwgNCwgMCwgMHhjXSwgWy0xLCAzLCAwLCAweDRdLCBbMCwgMSwgMCwgMHgwXSwgWzEsIDMsIDAsIDB4NV0sIFsyLCA0LCAwLCAweGRdLCBbMywgNSwgMSwgMHgxZF0sIFs1LCA2LCAyLCAweDNkXSwgWzksIDcsIDQsIDB4N2RdLCBbLTI1LCA3LCAzMiwgMHg3ZSwgImxvd2VyIl0sIFsyNSwgNywgMzIsIDB4N2ZdXTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcihgc3RhbmRhcmQgdGFibGUgQi4ke251bWJlcn0gZG9lcyBub3QgZXhpc3RgKTsKICB9CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgbGluZXNbaV0gPSBuZXcgSHVmZm1hbkxpbmUobGluZXNbaV0pOwogIH0KICB0YWJsZSA9IG5ldyBIdWZmbWFuVGFibGUobGluZXMsIHRydWUpOwogIHN0YW5kYXJkVGFibGVzQ2FjaGVbbnVtYmVyXSA9IHRhYmxlOwogIHJldHVybiB0YWJsZTsKfQpjbGFzcyBSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CiAgICB0aGlzLmVuZCA9IGVuZDsKICAgIHRoaXMucG9zaXRpb24gPSBzdGFydDsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICAgIHRoaXMuY3VycmVudEJ5dGUgPSAwOwogIH0KICByZWFkQml0KCkgewogICAgaWYgKHRoaXMuc2hpZnQgPCAwKSB7CiAgICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImVuZCBvZiBkYXRhIHdoaWxlIHJlYWRpbmcgYml0Iik7CiAgICAgIH0KICAgICAgdGhpcy5jdXJyZW50Qnl0ZSA9IHRoaXMuZGF0YVt0aGlzLnBvc2l0aW9uKytdOwogICAgICB0aGlzLnNoaWZ0ID0gNzsKICAgIH0KICAgIGNvbnN0IGJpdCA9IHRoaXMuY3VycmVudEJ5dGUgPj4gdGhpcy5zaGlmdCAmIDE7CiAgICB0aGlzLnNoaWZ0LS07CiAgICByZXR1cm4gYml0OwogIH0KICByZWFkQml0cyhudW1CaXRzKSB7CiAgICBsZXQgcmVzdWx0ID0gMCwKICAgICAgaTsKICAgIGZvciAoaSA9IG51bUJpdHMgLSAxOyBpID49IDA7IGktLSkgewogICAgICByZXN1bHQgfD0gdGhpcy5yZWFkQml0KCkgPDwgaTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGJ5dGVBbGlnbigpIHsKICAgIHRoaXMuc2hpZnQgPSAtMTsKICB9CiAgbmV4dCgpIHsKICAgIGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMuZW5kKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5wb3NpdGlvbisrXTsKICB9Cn0KZnVuY3Rpb24gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpIHsKICBsZXQgY3VycmVudEluZGV4ID0gMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSByZWZlcnJlZFRvLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHRhYmxlID0gY3VzdG9tVGFibGVzW3JlZmVycmVkVG9baV1dOwogICAgaWYgKHRhYmxlKSB7CiAgICAgIGlmIChpbmRleCA9PT0gY3VycmVudEluZGV4KSB7CiAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgICB9CiAgICAgIGN1cnJlbnRJbmRleCsrOwogICAgfQogIH0KICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiY2FuJ3QgZmluZCBjdXN0b20gSHVmZm1hbiB0YWJsZSIpOwp9CmZ1bmN0aW9uIGdldFRleHRSZWdpb25IdWZmbWFuVGFibGVzKHRleHRSZWdpb24sIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcywgbnVtYmVyT2ZTeW1ib2xzLCByZWFkZXIpIHsKICBjb25zdCBjb2RlcyA9IFtdOwogIGZvciAobGV0IGkgPSAwOyBpIDw9IDM0OyBpKyspIHsKICAgIGNvbnN0IGNvZGVMZW5ndGggPSByZWFkZXIucmVhZEJpdHMoNCk7CiAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICB9CiAgY29uc3QgcnVuQ29kZXNUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBjb2Rlcy5sZW5ndGggPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZTeW1ib2xzOykgewogICAgY29uc3QgY29kZUxlbmd0aCA9IHJ1bkNvZGVzVGFibGUuZGVjb2RlKHJlYWRlcik7CiAgICBpZiAoY29kZUxlbmd0aCA+PSAzMikgewogICAgICBsZXQgcmVwZWF0ZWRMZW5ndGgsIG51bWJlck9mUmVwZWF0cywgajsKICAgICAgc3dpdGNoIChjb2RlTGVuZ3RoKSB7CiAgICAgICAgY2FzZSAzMjoKICAgICAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBKYmlnMkVycm9yKCJubyBwcmV2aW91cyB2YWx1ZSBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgICAgIH0KICAgICAgICAgIG51bWJlck9mUmVwZWF0cyA9IHJlYWRlci5yZWFkQml0cygyKSArIDM7CiAgICAgICAgICByZXBlYXRlZExlbmd0aCA9IGNvZGVzW2kgLSAxXS5wcmVmaXhMZW5ndGg7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMzOgogICAgICAgICAgbnVtYmVyT2ZSZXBlYXRzID0gcmVhZGVyLnJlYWRCaXRzKDMpICsgMzsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICBudW1iZXJPZlJlcGVhdHMgPSByZWFkZXIucmVhZEJpdHMoNykgKyAxMTsKICAgICAgICAgIHJlcGVhdGVkTGVuZ3RoID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBjb2RlIGxlbmd0aCBpbiBzeW1ib2wgSUQgdGFibGUiKTsKICAgICAgfQogICAgICBmb3IgKGogPSAwOyBqIDwgbnVtYmVyT2ZSZXBlYXRzOyBqKyspIHsKICAgICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgcmVwZWF0ZWRMZW5ndGgsIDAsIDBdKSk7CiAgICAgICAgaSsrOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb2Rlcy5wdXNoKG5ldyBIdWZmbWFuTGluZShbaSwgY29kZUxlbmd0aCwgMCwgMF0pKTsKICAgICAgaSsrOwogICAgfQogIH0KICByZWFkZXIuYnl0ZUFsaWduKCk7CiAgY29uc3Qgc3ltYm9sSURUYWJsZSA9IG5ldyBIdWZmbWFuVGFibGUoY29kZXMsIGZhbHNlKTsKICBsZXQgY3VzdG9tSW5kZXggPSAwLAogICAgdGFibGVGaXJzdFMsCiAgICB0YWJsZURlbHRhUywKICAgIHRhYmxlRGVsdGFUOwogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRlMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVGaXJzdFMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkZTICsgNik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZUZpcnN0UyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIEZTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFMpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVMgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRTICsgOCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhUyA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgICAgY3VzdG9tSW5kZXgrKzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigiaW52YWxpZCBIdWZmbWFuIERTIHNlbGVjdG9yIik7CiAgfQogIHN3aXRjaCAodGV4dFJlZ2lvbi5odWZmbWFuRFQpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRTdGFuZGFyZFRhYmxlKHRleHRSZWdpb24uaHVmZm1hbkRUICsgMTEpOwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgdGFibGVEZWx0YVQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVCBzZWxlY3RvciIpOwogIH0KICBpZiAodGV4dFJlZ2lvbi5yZWZpbmVtZW50KSB7CiAgICB0aHJvdyBuZXcgSmJpZzJFcnJvcigicmVmaW5lbWVudCB3aXRoIEh1ZmZtYW4gaXMgbm90IHN1cHBvcnRlZCIpOwogIH0KICByZXR1cm4gewogICAgc3ltYm9sSURUYWJsZSwKICAgIHRhYmxlRmlyc3RTLAogICAgdGFibGVEZWx0YVMsCiAgICB0YWJsZURlbHRhVAogIH07Cn0KZnVuY3Rpb24gZ2V0U3ltYm9sRGljdGlvbmFyeUh1ZmZtYW5UYWJsZXMoZGljdGlvbmFyeSwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKSB7CiAgbGV0IGN1c3RvbUluZGV4ID0gMCwKICAgIHRhYmxlRGVsdGFIZWlnaHQsCiAgICB0YWJsZURlbHRhV2lkdGg7CiAgc3dpdGNoIChkaWN0aW9uYXJ5Lmh1ZmZtYW5ESFNlbGVjdG9yKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRTdGFuZGFyZFRhYmxlKGRpY3Rpb25hcnkuaHVmZm1hbkRIU2VsZWN0b3IgKyA0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRhYmxlRGVsdGFIZWlnaHQgPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBESCBzZWxlY3RvciIpOwogIH0KICBzd2l0Y2ggKGRpY3Rpb25hcnkuaHVmZm1hbkRXU2VsZWN0b3IpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgdGFibGVEZWx0YVdpZHRoID0gZ2V0U3RhbmRhcmRUYWJsZShkaWN0aW9uYXJ5Lmh1ZmZtYW5EV1NlbGVjdG9yICsgMik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICB0YWJsZURlbHRhV2lkdGggPSBnZXRDdXN0b21IdWZmbWFuVGFibGUoY3VzdG9tSW5kZXgsIHJlZmVycmVkVG8sIGN1c3RvbVRhYmxlcyk7CiAgICAgIGN1c3RvbUluZGV4Kys7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGhyb3cgbmV3IEpiaWcyRXJyb3IoImludmFsaWQgSHVmZm1hbiBEVyBzZWxlY3RvciIpOwogIH0KICBsZXQgdGFibGVCaXRtYXBTaXplLCB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlczsKICBpZiAoZGljdGlvbmFyeS5iaXRtYXBTaXplU2VsZWN0b3IpIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldEN1c3RvbUh1ZmZtYW5UYWJsZShjdXN0b21JbmRleCwgcmVmZXJyZWRUbywgY3VzdG9tVGFibGVzKTsKICAgIGN1c3RvbUluZGV4Kys7CiAgfSBlbHNlIHsKICAgIHRhYmxlQml0bWFwU2l6ZSA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIGlmIChkaWN0aW9uYXJ5LmFnZ3JlZ2F0aW9uSW5zdGFuY2VzU2VsZWN0b3IpIHsKICAgIHRhYmxlQWdncmVnYXRlSW5zdGFuY2VzID0gZ2V0Q3VzdG9tSHVmZm1hblRhYmxlKGN1c3RvbUluZGV4LCByZWZlcnJlZFRvLCBjdXN0b21UYWJsZXMpOwogIH0gZWxzZSB7CiAgICB0YWJsZUFnZ3JlZ2F0ZUluc3RhbmNlcyA9IGdldFN0YW5kYXJkVGFibGUoMSk7CiAgfQogIHJldHVybiB7CiAgICB0YWJsZURlbHRhSGVpZ2h0LAogICAgdGFibGVEZWx0YVdpZHRoLAogICAgdGFibGVCaXRtYXBTaXplLAogICAgdGFibGVBZ2dyZWdhdGVJbnN0YW5jZXMKICB9Owp9CmZ1bmN0aW9uIHJlYWRVbmNvbXByZXNzZWRCaXRtYXAocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB7CiAgY29uc3QgYml0bWFwID0gW107CiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgY29uc3Qgcm93ID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgpOwogICAgYml0bWFwLnB1c2gocm93KTsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICByb3dbeF0gPSByZWFkZXIucmVhZEJpdCgpOwogICAgfQogICAgcmVhZGVyLmJ5dGVBbGlnbigpOwogIH0KICByZXR1cm4gYml0bWFwOwp9CmZ1bmN0aW9uIGRlY29kZU1NUkJpdG1hcChpbnB1dCwgd2lkdGgsIGhlaWdodCwgZW5kT2ZCbG9jaykgewogIGNvbnN0IHBhcmFtcyA9IHsKICAgIEs6IC0xLAogICAgQ29sdW1uczogd2lkdGgsCiAgICBSb3dzOiBoZWlnaHQsCiAgICBCbGFja0lzMTogdHJ1ZSwKICAgIEVuZE9mQmxvY2s6IGVuZE9mQmxvY2sKICB9OwogIGNvbnN0IGRlY29kZXIgPSBuZXcgX2NjaXR0LkNDSVRURmF4RGVjb2RlcihpbnB1dCwgcGFyYW1zKTsKICBjb25zdCBiaXRtYXAgPSBbXTsKICBsZXQgY3VycmVudEJ5dGUsCiAgICBlb2YgPSBmYWxzZTsKICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICBjb25zdCByb3cgPSBuZXcgVWludDhBcnJheSh3aWR0aCk7CiAgICBiaXRtYXAucHVzaChyb3cpOwogICAgbGV0IHNoaWZ0ID0gLTE7CiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgaWYgKHNoaWZ0IDwgMCkgewogICAgICAgIGN1cnJlbnRCeXRlID0gZGVjb2Rlci5yZWFkTmV4dENoYXIoKTsKICAgICAgICBpZiAoY3VycmVudEJ5dGUgPT09IC0xKSB7CiAgICAgICAgICBjdXJyZW50Qnl0ZSA9IDA7CiAgICAgICAgICBlb2YgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBzaGlmdCA9IDc7CiAgICAgIH0KICAgICAgcm93W3hdID0gY3VycmVudEJ5dGUgPj4gc2hpZnQgJiAxOwogICAgICBzaGlmdC0tOwogICAgfQogIH0KICBpZiAoZW5kT2ZCbG9jayAmJiAhZW9mKSB7CiAgICBjb25zdCBsb29rRm9yRU9GTGltaXQgPSA1OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rRm9yRU9GTGltaXQ7IGkrKykgewogICAgICBpZiAoZGVjb2Rlci5yZWFkTmV4dENoYXIoKSA9PT0gLTEpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gYml0bWFwOwp9CmNsYXNzIEpiaWcySW1hZ2UgewogIHBhcnNlQ2h1bmtzKGNodW5rcykgewogICAgcmV0dXJuIHBhcnNlSmJpZzJDaHVua3MoY2h1bmtzKTsKICB9CiAgcGFyc2UoZGF0YSkgewogICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQ6IEpiaWcySW1hZ2UucGFyc2UiKTsKICB9Cn0KZXhwb3J0cy5KYmlnMkltYWdlID0gSmJpZzJJbWFnZTsKCi8qKiovIH0pLAovKiAyNSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkFyaXRobWV0aWNEZWNvZGVyID0gdm9pZCAwOwpjb25zdCBRZVRhYmxlID0gW3sKICBxZTogMHg1NjAxLAogIG5tcHM6IDEsCiAgbmxwczogMSwKICBzd2l0Y2hGbGFnOiAxCn0sIHsKICBxZTogMHgzNDAxLAogIG5tcHM6IDIsCiAgbmxwczogNiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxODAxLAogIG5tcHM6IDMsCiAgbmxwczogOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwYWMxLAogIG5tcHM6IDQsCiAgbmxwczogMTIsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDUyMSwKICBubXBzOiA1LAogIG5scHM6IDI5LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAyMjEsCiAgbm1wczogMzgsCiAgbmxwczogMzMsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4NTYwMSwKICBubXBzOiA3LAogIG5scHM6IDYsCiAgc3dpdGNoRmxhZzogMQp9LCB7CiAgcWU6IDB4NTQwMSwKICBubXBzOiA4LAogIG5scHM6IDE0LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDQ4MDEsCiAgbm1wczogOSwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzODAxLAogIG5tcHM6IDEwLAogIG5scHM6IDE0LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDMwMDEsCiAgbm1wczogMTEsCiAgbmxwczogMTcsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MjQwMSwKICBubXBzOiAxMiwKICBubHBzOiAxOCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxYzAxLAogIG5tcHM6IDEzLAogIG5scHM6IDIwLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDE2MDEsCiAgbm1wczogMjksCiAgbmxwczogMjEsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4NTYwMSwKICBubXBzOiAxNSwKICBubHBzOiAxNCwKICBzd2l0Y2hGbGFnOiAxCn0sIHsKICBxZTogMHg1NDAxLAogIG5tcHM6IDE2LAogIG5scHM6IDE0LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDUxMDEsCiAgbm1wczogMTcsCiAgbmxwczogMTUsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4NDgwMSwKICBubXBzOiAxOCwKICBubHBzOiAxNiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgzODAxLAogIG5tcHM6IDE5LAogIG5scHM6IDE3LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDM0MDEsCiAgbm1wczogMjAsCiAgbmxwczogMTgsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MzAwMSwKICBubXBzOiAyMSwKICBubHBzOiAxOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgyODAxLAogIG5tcHM6IDIyLAogIG5scHM6IDE5LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDI0MDEsCiAgbm1wczogMjMsCiAgbmxwczogMjAsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MjIwMSwKICBubXBzOiAyNCwKICBubHBzOiAyMSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxYzAxLAogIG5tcHM6IDI1LAogIG5scHM6IDIyLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDE4MDEsCiAgbm1wczogMjYsCiAgbmxwczogMjMsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTYwMSwKICBubXBzOiAyNywKICBubHBzOiAyNCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgxNDAxLAogIG5tcHM6IDI4LAogIG5scHM6IDI1LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDEyMDEsCiAgbm1wczogMjksCiAgbmxwczogMjYsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MTEwMSwKICBubXBzOiAzMCwKICBubHBzOiAyNywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwYWMxLAogIG5tcHM6IDMxLAogIG5scHM6IDI4LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA5YzEsCiAgbm1wczogMzIsCiAgbmxwczogMjksCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDhhMSwKICBubXBzOiAzMywKICBubHBzOiAzMCwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwNTIxLAogIG5tcHM6IDM0LAogIG5scHM6IDMxLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDA0NDEsCiAgbm1wczogMzUsCiAgbmxwczogMzIsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDJhMSwKICBubXBzOiAzNiwKICBubHBzOiAzMywKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMjIxLAogIG5tcHM6IDM3LAogIG5scHM6IDM0LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAxNDEsCiAgbm1wczogMzgsCiAgbmxwczogMzUsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDExMSwKICBubXBzOiAzOSwKICBubHBzOiAzNiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDg1LAogIG5tcHM6IDQwLAogIG5scHM6IDM3LAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwNDksCiAgbm1wczogNDEsCiAgbmxwczogMzgsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAyNSwKICBubXBzOiA0MiwKICBubHBzOiAzOSwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDE1LAogIG5tcHM6IDQzLAogIG5scHM6IDQwLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDAwMDksCiAgbm1wczogNDQsCiAgbmxwczogNDEsCiAgc3dpdGNoRmxhZzogMAp9LCB7CiAgcWU6IDB4MDAwNSwKICBubXBzOiA0NSwKICBubHBzOiA0MiwKICBzd2l0Y2hGbGFnOiAwCn0sIHsKICBxZTogMHgwMDAxLAogIG5tcHM6IDQ1LAogIG5scHM6IDQzLAogIHN3aXRjaEZsYWc6IDAKfSwgewogIHFlOiAweDU2MDEsCiAgbm1wczogNDYsCiAgbmxwczogNDYsCiAgc3dpdGNoRmxhZzogMAp9XTsKY2xhc3MgQXJpdGhtZXRpY0RlY29kZXIgewogIGNvbnN0cnVjdG9yKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLmJwID0gc3RhcnQ7CiAgICB0aGlzLmRhdGFFbmQgPSBlbmQ7CiAgICB0aGlzLmNoaWdoID0gZGF0YVtzdGFydF07CiAgICB0aGlzLmNsb3cgPSAwOwogICAgdGhpcy5ieXRlSW4oKTsKICAgIHRoaXMuY2hpZ2ggPSB0aGlzLmNoaWdoIDw8IDcgJiAweGZmZmYgfCB0aGlzLmNsb3cgPj4gOSAmIDB4N2Y7CiAgICB0aGlzLmNsb3cgPSB0aGlzLmNsb3cgPDwgNyAmIDB4ZmZmZjsKICAgIHRoaXMuY3QgLT0gNzsKICAgIHRoaXMuYSA9IDB4ODAwMDsKICB9CiAgYnl0ZUluKCkgewogICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTsKICAgIGxldCBicCA9IHRoaXMuYnA7CiAgICBpZiAoZGF0YVticF0gPT09IDB4ZmYpIHsKICAgICAgaWYgKGRhdGFbYnAgKyAxXSA+IDB4OGYpIHsKICAgICAgICB0aGlzLmNsb3cgKz0gMHhmZjAwOwogICAgICAgIHRoaXMuY3QgPSA4OwogICAgICB9IGVsc2UgewogICAgICAgIGJwKys7CiAgICAgICAgdGhpcy5jbG93ICs9IGRhdGFbYnBdIDw8IDk7CiAgICAgICAgdGhpcy5jdCA9IDc7CiAgICAgICAgdGhpcy5icCA9IGJwOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBicCsrOwogICAgICB0aGlzLmNsb3cgKz0gYnAgPCB0aGlzLmRhdGFFbmQgPyBkYXRhW2JwXSA8PCA4IDogMHhmZjAwOwogICAgICB0aGlzLmN0ID0gODsKICAgICAgdGhpcy5icCA9IGJwOwogICAgfQogICAgaWYgKHRoaXMuY2xvdyA+IDB4ZmZmZikgewogICAgICB0aGlzLmNoaWdoICs9IHRoaXMuY2xvdyA+PiAxNjsKICAgICAgdGhpcy5jbG93ICY9IDB4ZmZmZjsKICAgIH0KICB9CiAgcmVhZEJpdChjb250ZXh0cywgcG9zKSB7CiAgICBsZXQgY3hfaW5kZXggPSBjb250ZXh0c1twb3NdID4+IDEsCiAgICAgIGN4X21wcyA9IGNvbnRleHRzW3Bvc10gJiAxOwogICAgY29uc3QgcWVUYWJsZUljeCA9IFFlVGFibGVbY3hfaW5kZXhdOwogICAgY29uc3QgcWVJY3ggPSBxZVRhYmxlSWN4LnFlOwogICAgbGV0IGQ7CiAgICBsZXQgYSA9IHRoaXMuYSAtIHFlSWN4OwogICAgaWYgKHRoaXMuY2hpZ2ggPCBxZUljeCkgewogICAgICBpZiAoYSA8IHFlSWN4KSB7CiAgICAgICAgYSA9IHFlSWN4OwogICAgICAgIGQgPSBjeF9tcHM7CiAgICAgICAgY3hfaW5kZXggPSBxZVRhYmxlSWN4Lm5tcHM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYSA9IHFlSWN4OwogICAgICAgIGQgPSAxIF4gY3hfbXBzOwogICAgICAgIGlmIChxZVRhYmxlSWN4LnN3aXRjaEZsYWcgPT09IDEpIHsKICAgICAgICAgIGN4X21wcyA9IGQ7CiAgICAgICAgfQogICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubHBzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzLmNoaWdoIC09IHFlSWN4OwogICAgICBpZiAoKGEgJiAweDgwMDApICE9PSAwKSB7CiAgICAgICAgdGhpcy5hID0gYTsKICAgICAgICByZXR1cm4gY3hfbXBzOwogICAgICB9CiAgICAgIGlmIChhIDwgcWVJY3gpIHsKICAgICAgICBkID0gMSBeIGN4X21wczsKICAgICAgICBpZiAocWVUYWJsZUljeC5zd2l0Y2hGbGFnID09PSAxKSB7CiAgICAgICAgICBjeF9tcHMgPSBkOwogICAgICAgIH0KICAgICAgICBjeF9pbmRleCA9IHFlVGFibGVJY3gubmxwczsKICAgICAgfSBlbHNlIHsKICAgICAgICBkID0gY3hfbXBzOwogICAgICAgIGN4X2luZGV4ID0gcWVUYWJsZUljeC5ubXBzOwogICAgICB9CiAgICB9CiAgICBkbyB7CiAgICAgIGlmICh0aGlzLmN0ID09PSAwKSB7CiAgICAgICAgdGhpcy5ieXRlSW4oKTsKICAgICAgfQogICAgICBhIDw8PSAxOwogICAgICB0aGlzLmNoaWdoID0gdGhpcy5jaGlnaCA8PCAxICYgMHhmZmZmIHwgdGhpcy5jbG93ID4+IDE1ICYgMTsKICAgICAgdGhpcy5jbG93ID0gdGhpcy5jbG93IDw8IDEgJiAweGZmZmY7CiAgICAgIHRoaXMuY3QtLTsKICAgIH0gd2hpbGUgKChhICYgMHg4MDAwKSA9PT0gMCk7CiAgICB0aGlzLmEgPSBhOwogICAgY29udGV4dHNbcG9zXSA9IGN4X2luZGV4IDw8IDEgfCBjeF9tcHM7CiAgICByZXR1cm4gZDsKICB9Cn0KZXhwb3J0cy5Bcml0aG1ldGljRGVjb2RlciA9IEFyaXRobWV0aWNEZWNvZGVyOwoKLyoqKi8gfSksCi8qIDI2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuSnBlZ1N0cmVhbSA9IHZvaWQgMDsKdmFyIF9kZWNvZGVfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfanBnID0gX193X3BkZmpzX3JlcXVpcmVfXygyNyk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNsYXNzIEpwZWdTdHJlYW0gZXh0ZW5kcyBfZGVjb2RlX3N0cmVhbS5EZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgbWF5YmVMZW5ndGgsIHBhcmFtcykgewogICAgbGV0IGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5nZXRCeXRlKCkpICE9PSAtMSkgewogICAgICBpZiAoY2ggPT09IDB4ZmYpIHsKICAgICAgICBzdHJlYW0uc2tpcCgtMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge30KICByZWFkQmxvY2soKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QganBlZ09wdGlvbnMgPSB7CiAgICAgIGRlY29kZVRyYW5zZm9ybTogdW5kZWZpbmVkLAogICAgICBjb2xvclRyYW5zZm9ybTogdW5kZWZpbmVkCiAgICB9OwogICAgY29uc3QgZGVjb2RlQXJyID0gdGhpcy5kaWN0LmdldEFycmF5KCJEIiwgIkRlY29kZSIpOwogICAgaWYgKCh0aGlzLmZvcmNlUkdCQSB8fCB0aGlzLmZvcmNlUkdCKSAmJiBBcnJheS5pc0FycmF5KGRlY29kZUFycikpIHsKICAgICAgY29uc3QgYml0c1BlckNvbXBvbmVudCA9IHRoaXMuZGljdC5nZXQoIkJQQyIsICJCaXRzUGVyQ29tcG9uZW50IikgfHwgODsKICAgICAgY29uc3QgZGVjb2RlQXJyTGVuZ3RoID0gZGVjb2RlQXJyLmxlbmd0aDsKICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEludDMyQXJyYXkoZGVjb2RlQXJyTGVuZ3RoKTsKICAgICAgbGV0IHRyYW5zZm9ybU5lZWRlZCA9IGZhbHNlOwogICAgICBjb25zdCBtYXhWYWx1ZSA9ICgxIDw8IGJpdHNQZXJDb21wb25lbnQpIC0gMTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvZGVBcnJMZW5ndGg7IGkgKz0gMikgewogICAgICAgIHRyYW5zZm9ybVtpXSA9IChkZWNvZGVBcnJbaSArIDFdIC0gZGVjb2RlQXJyW2ldKSAqIDI1NiB8IDA7CiAgICAgICAgdHJhbnNmb3JtW2kgKyAxXSA9IGRlY29kZUFycltpXSAqIG1heFZhbHVlIHwgMDsKICAgICAgICBpZiAodHJhbnNmb3JtW2ldICE9PSAyNTYgfHwgdHJhbnNmb3JtW2kgKyAxXSAhPT0gMCkgewogICAgICAgICAgdHJhbnNmb3JtTmVlZGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRyYW5zZm9ybU5lZWRlZCkgewogICAgICAgIGpwZWdPcHRpb25zLmRlY29kZVRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMucGFyYW1zIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBjb25zdCBjb2xvclRyYW5zZm9ybSA9IHRoaXMucGFyYW1zLmdldCgiQ29sb3JUcmFuc2Zvcm0iKTsKICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoY29sb3JUcmFuc2Zvcm0pKSB7CiAgICAgICAganBlZ09wdGlvbnMuY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKICAgICAgfQogICAgfQogICAgY29uc3QganBlZ0ltYWdlID0gbmV3IF9qcGcuSnBlZ0ltYWdlKGpwZWdPcHRpb25zKTsKICAgIGpwZWdJbWFnZS5wYXJzZSh0aGlzLmJ5dGVzKTsKICAgIGNvbnN0IGRhdGEgPSBqcGVnSW1hZ2UuZ2V0RGF0YSh7CiAgICAgIHdpZHRoOiB0aGlzLmRyYXdXaWR0aCwKICAgICAgaGVpZ2h0OiB0aGlzLmRyYXdIZWlnaHQsCiAgICAgIGZvcmNlUkdCQTogdGhpcy5mb3JjZVJHQkEsCiAgICAgIGZvcmNlUkdCOiB0aGlzLmZvcmNlUkdCLAogICAgICBpc1NvdXJjZVBERjogdHJ1ZQogICAgfSk7CiAgICB0aGlzLmJ1ZmZlciA9IGRhdGE7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgdGhpcy5lb2YgPSB0cnVlOwogIH0KfQpleHBvcnRzLkpwZWdTdHJlYW0gPSBKcGVnU3RyZWFtOwoKLyoqKi8gfSksCi8qIDI3ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuSnBlZ0ltYWdlID0gdm9pZCAwOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX2ltYWdlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CmNsYXNzIEpwZWdFcnJvciBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24gewogIGNvbnN0cnVjdG9yKG1zZykgewogICAgc3VwZXIoYEpQRUcgZXJyb3I6ICR7bXNnfWAsICJKcGVnRXJyb3IiKTsKICB9Cn0KY2xhc3MgRE5MTWFya2VyRXJyb3IgZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHsKICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzY2FuTGluZXMpIHsKICAgIHN1cGVyKG1lc3NhZ2UsICJETkxNYXJrZXJFcnJvciIpOwogICAgdGhpcy5zY2FuTGluZXMgPSBzY2FuTGluZXM7CiAgfQp9CmNsYXNzIEVPSU1hcmtlckVycm9yIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihtc2csICJFT0lNYXJrZXJFcnJvciIpOwogIH0KfQpjb25zdCBkY3RaaWdaYWcgPSBuZXcgVWludDhBcnJheShbMCwgMSwgOCwgMTYsIDksIDIsIDMsIDEwLCAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LCAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsIDI3LCAyMCwgMTMsIDYsIDcsIDE0LCAyMSwgMjgsIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLCA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2M10pOwpjb25zdCBkY3RDb3MxID0gNDAxNzsKY29uc3QgZGN0U2luMSA9IDc5OTsKY29uc3QgZGN0Q29zMyA9IDM0MDY7CmNvbnN0IGRjdFNpbjMgPSAyMjc2Owpjb25zdCBkY3RDb3M2ID0gMTU2NzsKY29uc3QgZGN0U2luNiA9IDM3ODQ7CmNvbnN0IGRjdFNxcnQyID0gNTc5MzsKY29uc3QgZGN0U3FydDFkMiA9IDI4OTY7CmZ1bmN0aW9uIGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCB2YWx1ZXMpIHsKICBsZXQgayA9IDAsCiAgICBpLAogICAgaiwKICAgIGxlbmd0aCA9IDE2OwogIHdoaWxlIChsZW5ndGggPiAwICYmICFjb2RlTGVuZ3Roc1tsZW5ndGggLSAxXSkgewogICAgbGVuZ3RoLS07CiAgfQogIGNvbnN0IGNvZGUgPSBbewogICAgY2hpbGRyZW46IFtdLAogICAgaW5kZXg6IDAKICB9XTsKICBsZXQgcCA9IGNvZGVbMF0sCiAgICBxOwogIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgZm9yIChqID0gMDsgaiA8IGNvZGVMZW5ndGhzW2ldOyBqKyspIHsKICAgICAgcCA9IGNvZGUucG9wKCk7CiAgICAgIHAuY2hpbGRyZW5bcC5pbmRleF0gPSB2YWx1ZXNba107CiAgICAgIHdoaWxlIChwLmluZGV4ID4gMCkgewogICAgICAgIHAgPSBjb2RlLnBvcCgpOwogICAgICB9CiAgICAgIHAuaW5kZXgrKzsKICAgICAgY29kZS5wdXNoKHApOwogICAgICB3aGlsZSAoY29kZS5sZW5ndGggPD0gaSkgewogICAgICAgIGNvZGUucHVzaChxID0gewogICAgICAgICAgY2hpbGRyZW46IFtdLAogICAgICAgICAgaW5kZXg6IDAKICAgICAgICB9KTsKICAgICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKICAgICAgICBwID0gcTsKICAgICAgfQogICAgICBrKys7CiAgICB9CiAgICBpZiAoaSArIDEgPCBsZW5ndGgpIHsKICAgICAgY29kZS5wdXNoKHEgPSB7CiAgICAgICAgY2hpbGRyZW46IFtdLAogICAgICAgIGluZGV4OiAwCiAgICAgIH0pOwogICAgICBwLmNoaWxkcmVuW3AuaW5kZXhdID0gcS5jaGlsZHJlbjsKICAgICAgcCA9IHE7CiAgICB9CiAgfQogIHJldHVybiBjb2RlWzBdLmNoaWxkcmVuOwp9CmZ1bmN0aW9uIGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgcm93LCBjb2wpIHsKICByZXR1cm4gNjQgKiAoKGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lICsgMSkgKiByb3cgKyBjb2wpOwp9CmZ1bmN0aW9uIGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVQcmV2LCBzdWNjZXNzaXZlLCBwYXJzZUROTE1hcmtlciA9IGZhbHNlKSB7CiAgY29uc3QgbWN1c1BlckxpbmUgPSBmcmFtZS5tY3VzUGVyTGluZTsKICBjb25zdCBwcm9ncmVzc2l2ZSA9IGZyYW1lLnByb2dyZXNzaXZlOwogIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogIGxldCBiaXRzRGF0YSA9IDAsCiAgICBiaXRzQ291bnQgPSAwOwogIGZ1bmN0aW9uIHJlYWRCaXQoKSB7CiAgICBpZiAoYml0c0NvdW50ID4gMCkgewogICAgICBiaXRzQ291bnQtLTsKICAgICAgcmV0dXJuIGJpdHNEYXRhID4+IGJpdHNDb3VudCAmIDE7CiAgICB9CiAgICBiaXRzRGF0YSA9IGRhdGFbb2Zmc2V0KytdOwogICAgaWYgKGJpdHNEYXRhID09PSAweGZmKSB7CiAgICAgIGNvbnN0IG5leHRCeXRlID0gZGF0YVtvZmZzZXQrK107CiAgICAgIGlmIChuZXh0Qnl0ZSkgewogICAgICAgIGlmIChuZXh0Qnl0ZSA9PT0gMHhkYyAmJiBwYXJzZUROTE1hcmtlcikgewogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICBjb25zdCBzY2FuTGluZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgaWYgKHNjYW5MaW5lcyA+IDAgJiYgc2NhbkxpbmVzICE9PSBmcmFtZS5zY2FuTGluZXMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEROTE1hcmtlckVycm9yKCJGb3VuZCBETkwgbWFya2VyICgweEZGREMpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIiwgc2NhbkxpbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG5leHRCeXRlID09PSAweGQ5KSB7CiAgICAgICAgICBpZiAocGFyc2VETkxNYXJrZXIpIHsKICAgICAgICAgICAgY29uc3QgbWF5YmVTY2FuTGluZXMgPSBibG9ja1JvdyAqIChmcmFtZS5wcmVjaXNpb24gPT09IDggPyA4IDogMCk7CiAgICAgICAgICAgIGlmIChtYXliZVNjYW5MaW5lcyA+IDAgJiYgTWF0aC5yb3VuZChmcmFtZS5zY2FuTGluZXMgLyBtYXliZVNjYW5MaW5lcykgPj0gNSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBETkxNYXJrZXJFcnJvcigiRm91bmQgRU9JIG1hcmtlciAoMHhGRkQ5KSB3aGlsZSBwYXJzaW5nIHNjYW4gZGF0YSwgIiArICJwb3NzaWJseSBjYXVzZWQgYnkgaW5jb3JyZWN0IGBzY2FuTGluZXNgIHBhcmFtZXRlciIsIG1heWJlU2NhbkxpbmVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhyb3cgbmV3IEVPSU1hcmtlckVycm9yKCJGb3VuZCBFT0kgbWFya2VyICgweEZGRDkpIHdoaWxlIHBhcnNpbmcgc2NhbiBkYXRhIik7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoYHVuZXhwZWN0ZWQgbWFya2VyICR7KGJpdHNEYXRhIDw8IDggfCBuZXh0Qnl0ZSkudG9TdHJpbmcoMTYpfWApOwogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSA3OwogICAgcmV0dXJuIGJpdHNEYXRhID4+PiA3OwogIH0KICBmdW5jdGlvbiBkZWNvZGVIdWZmbWFuKHRyZWUpIHsKICAgIGxldCBub2RlID0gdHJlZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIG5vZGUgPSBub2RlW3JlYWRCaXQoKV07CiAgICAgIHN3aXRjaCAodHlwZW9mIG5vZGUpIHsKICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgaHVmZm1hbiBzZXF1ZW5jZSIpOwogICAgfQogIH0KICBmdW5jdGlvbiByZWNlaXZlKGxlbmd0aCkgewogICAgbGV0IG4gPSAwOwogICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKICAgICAgbiA9IG4gPDwgMSB8IHJlYWRCaXQoKTsKICAgICAgbGVuZ3RoLS07CiAgICB9CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gcmVjZWl2ZUFuZEV4dGVuZChsZW5ndGgpIHsKICAgIGlmIChsZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHJlYWRCaXQoKSA9PT0gMSA/IDEgOiAtMTsKICAgIH0KICAgIGNvbnN0IG4gPSByZWNlaXZlKGxlbmd0aCk7CiAgICBpZiAobiA+PSAxIDw8IGxlbmd0aCAtIDEpIHsKICAgICAgcmV0dXJuIG47CiAgICB9CiAgICByZXR1cm4gbiArICgtMSA8PCBsZW5ndGgpICsgMTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmFzZWxpbmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29uc3QgdCA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZURDKTsKICAgIGNvbnN0IGRpZmYgPSB0ID09PSAwID8gMCA6IHJlY2VpdmVBbmRFeHRlbmQodCk7CiAgICBjb21wb25lbnQuYmxvY2tEYXRhW2Jsb2NrT2Zmc2V0XSA9IGNvbXBvbmVudC5wcmVkICs9IGRpZmY7CiAgICBsZXQgayA9IDE7CiAgICB3aGlsZSAoayA8IDY0KSB7CiAgICAgIGNvbnN0IHJzID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlQUMpOwogICAgICBjb25zdCBzID0gcnMgJiAxNSwKICAgICAgICByID0gcnMgPj4gNDsKICAgICAgaWYgKHMgPT09IDApIHsKICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocyk7CiAgICAgIGsrKzsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGVjb2RlRENGaXJzdChjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBjb25zdCB0ID0gZGVjb2RlSHVmZm1hbihjb21wb25lbnQuaHVmZm1hblRhYmxlREMpOwogICAgY29uc3QgZGlmZiA9IHQgPT09IDAgPyAwIDogcmVjZWl2ZUFuZEV4dGVuZCh0KSA8PCBzdWNjZXNzaXZlOwogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gPSBjb21wb25lbnQucHJlZCArPSBkaWZmOwogIH0KICBmdW5jdGlvbiBkZWNvZGVEQ1N1Y2Nlc3NpdmUoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgY29tcG9uZW50LmJsb2NrRGF0YVtibG9ja09mZnNldF0gfD0gcmVhZEJpdCgpIDw8IHN1Y2Nlc3NpdmU7CiAgfQogIGxldCBlb2JydW4gPSAwOwogIGZ1bmN0aW9uIGRlY29kZUFDRmlyc3QoY29tcG9uZW50LCBibG9ja09mZnNldCkgewogICAgaWYgKGVvYnJ1biA+IDApIHsKICAgICAgZW9icnVuLS07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBrID0gc3BlY3RyYWxTdGFydDsKICAgIGNvbnN0IGUgPSBzcGVjdHJhbEVuZDsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3QgcnMgPSBkZWNvZGVIdWZmbWFuKGNvbXBvbmVudC5odWZmbWFuVGFibGVBQyk7CiAgICAgIGNvbnN0IHMgPSBycyAmIDE1LAogICAgICAgIHIgPSBycyA+PiA0OwogICAgICBpZiAocyA9PT0gMCkgewogICAgICAgIGlmIChyIDwgMTUpIHsKICAgICAgICAgIGVvYnJ1biA9IHJlY2VpdmUocikgKyAoMSA8PCByKSAtIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgayArPSAxNjsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBrICs9IHI7CiAgICAgIGNvbnN0IHogPSBkY3RaaWdaYWdba107CiAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbYmxvY2tPZmZzZXQgKyB6XSA9IHJlY2VpdmVBbmRFeHRlbmQocykgKiAoMSA8PCBzdWNjZXNzaXZlKTsKICAgICAgaysrOwogICAgfQogIH0KICBsZXQgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAwLAogICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlOwogIGZ1bmN0aW9uIGRlY29kZUFDU3VjY2Vzc2l2ZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KSB7CiAgICBsZXQgayA9IHNwZWN0cmFsU3RhcnQ7CiAgICBjb25zdCBlID0gc3BlY3RyYWxFbmQ7CiAgICBsZXQgciA9IDA7CiAgICBsZXQgczsKICAgIGxldCByczsKICAgIHdoaWxlIChrIDw9IGUpIHsKICAgICAgY29uc3Qgb2Zmc2V0WiA9IGJsb2NrT2Zmc2V0ICsgZGN0WmlnWmFnW2tdOwogICAgICBjb25zdCBzaWduID0gY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSA8IDAgPyAtMSA6IDE7CiAgICAgIHN3aXRjaCAoc3VjY2Vzc2l2ZUFDU3RhdGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBycyA9IGRlY29kZUh1ZmZtYW4oY29tcG9uZW50Lmh1ZmZtYW5UYWJsZUFDKTsKICAgICAgICAgIHMgPSBycyAmIDE1OwogICAgICAgICAgciA9IHJzID4+IDQ7CiAgICAgICAgICBpZiAocyA9PT0gMCkgewogICAgICAgICAgICBpZiAociA8IDE1KSB7CiAgICAgICAgICAgICAgZW9icnVuID0gcmVjZWl2ZShyKSArICgxIDw8IHIpOwogICAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gNDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByID0gMTY7CiAgICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocyAhPT0gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBKcGVnRXJyb3IoImludmFsaWQgQUNuIGVuY29kaW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlID0gcmVjZWl2ZUFuZEV4dGVuZChzKTsKICAgICAgICAgICAgc3VjY2Vzc2l2ZUFDU3RhdGUgPSByID8gMiA6IDM7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIDE6CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaWYgKGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0pIHsKICAgICAgICAgICAgY29tcG9uZW50LmJsb2NrRGF0YVtvZmZzZXRaXSArPSBzaWduICogKHJlYWRCaXQoKSA8PCBzdWNjZXNzaXZlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHItLTsKICAgICAgICAgICAgaWYgKHIgPT09IDApIHsKICAgICAgICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IHN1Y2Nlc3NpdmVBQ1N0YXRlID09PSAyID8gMyA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdID0gc3VjY2Vzc2l2ZUFDTmV4dFZhbHVlIDw8IHN1Y2Nlc3NpdmU7CiAgICAgICAgICAgIHN1Y2Nlc3NpdmVBQ1N0YXRlID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgIGlmIChjb21wb25lbnQuYmxvY2tEYXRhW29mZnNldFpdKSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGFbb2Zmc2V0Wl0gKz0gc2lnbiAqIChyZWFkQml0KCkgPDwgc3VjY2Vzc2l2ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBrKys7CiAgICB9CiAgICBpZiAoc3VjY2Vzc2l2ZUFDU3RhdGUgPT09IDQpIHsKICAgICAgZW9icnVuLS07CiAgICAgIGlmIChlb2JydW4gPT09IDApIHsKICAgICAgICBzdWNjZXNzaXZlQUNTdGF0ZSA9IDA7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IGJsb2NrUm93ID0gMDsKICBmdW5jdGlvbiBkZWNvZGVNY3UoY29tcG9uZW50LCBkZWNvZGUsIG1jdSwgcm93LCBjb2wpIHsKICAgIGNvbnN0IG1jdVJvdyA9IG1jdSAvIG1jdXNQZXJMaW5lIHwgMDsKICAgIGNvbnN0IG1jdUNvbCA9IG1jdSAlIG1jdXNQZXJMaW5lOwogICAgYmxvY2tSb3cgPSBtY3VSb3cgKiBjb21wb25lbnQudiArIHJvdzsKICAgIGNvbnN0IGJsb2NrQ29sID0gbWN1Q29sICogY29tcG9uZW50LmggKyBjb2w7CiAgICBjb25zdCBibG9ja09mZnNldCA9IGdldEJsb2NrQnVmZmVyT2Zmc2V0KGNvbXBvbmVudCwgYmxvY2tSb3csIGJsb2NrQ29sKTsKICAgIGRlY29kZShjb21wb25lbnQsIGJsb2NrT2Zmc2V0KTsKICB9CiAgZnVuY3Rpb24gZGVjb2RlQmxvY2soY29tcG9uZW50LCBkZWNvZGUsIG1jdSkgewogICAgYmxvY2tSb3cgPSBtY3UgLyBjb21wb25lbnQuYmxvY2tzUGVyTGluZSB8IDA7CiAgICBjb25zdCBibG9ja0NvbCA9IG1jdSAlIGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOwogICAgY29uc3QgYmxvY2tPZmZzZXQgPSBnZXRCbG9ja0J1ZmZlck9mZnNldChjb21wb25lbnQsIGJsb2NrUm93LCBibG9ja0NvbCk7CiAgICBkZWNvZGUoY29tcG9uZW50LCBibG9ja09mZnNldCk7CiAgfQogIGNvbnN0IGNvbXBvbmVudHNMZW5ndGggPSBjb21wb25lbnRzLmxlbmd0aDsKICBsZXQgY29tcG9uZW50LCBpLCBqLCBrLCBuOwogIGxldCBkZWNvZGVGbjsKICBpZiAocHJvZ3Jlc3NpdmUpIHsKICAgIGlmIChzcGVjdHJhbFN0YXJ0ID09PSAwKSB7CiAgICAgIGRlY29kZUZuID0gc3VjY2Vzc2l2ZVByZXYgPT09IDAgPyBkZWNvZGVEQ0ZpcnN0IDogZGVjb2RlRENTdWNjZXNzaXZlOwogICAgfSBlbHNlIHsKICAgICAgZGVjb2RlRm4gPSBzdWNjZXNzaXZlUHJldiA9PT0gMCA/IGRlY29kZUFDRmlyc3QgOiBkZWNvZGVBQ1N1Y2Nlc3NpdmU7CiAgICB9CiAgfSBlbHNlIHsKICAgIGRlY29kZUZuID0gZGVjb2RlQmFzZWxpbmU7CiAgfQogIGxldCBtY3UgPSAwLAogICAgZmlsZU1hcmtlcjsKICBsZXQgbWN1RXhwZWN0ZWQ7CiAgaWYgKGNvbXBvbmVudHNMZW5ndGggPT09IDEpIHsKICAgIG1jdUV4cGVjdGVkID0gY29tcG9uZW50c1swXS5ibG9ja3NQZXJMaW5lICogY29tcG9uZW50c1swXS5ibG9ja3NQZXJDb2x1bW47CiAgfSBlbHNlIHsKICAgIG1jdUV4cGVjdGVkID0gbWN1c1BlckxpbmUgKiBmcmFtZS5tY3VzUGVyQ29sdW1uOwogIH0KICBsZXQgaCwgdjsKICB3aGlsZSAobWN1IDw9IG1jdUV4cGVjdGVkKSB7CiAgICBjb25zdCBtY3VUb1JlYWQgPSByZXNldEludGVydmFsID8gTWF0aC5taW4obWN1RXhwZWN0ZWQgLSBtY3UsIHJlc2V0SW50ZXJ2YWwpIDogbWN1RXhwZWN0ZWQ7CiAgICBpZiAobWN1VG9SZWFkID4gMCkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50c0xlbmd0aDsgaSsrKSB7CiAgICAgICAgY29tcG9uZW50c1tpXS5wcmVkID0gMDsKICAgICAgfQogICAgICBlb2JydW4gPSAwOwogICAgICBpZiAoY29tcG9uZW50c0xlbmd0aCA9PT0gMSkgewogICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudHNbMF07CiAgICAgICAgZm9yIChuID0gMDsgbiA8IG1jdVRvUmVhZDsgbisrKSB7CiAgICAgICAgICBkZWNvZGVCbG9jayhjb21wb25lbnQsIGRlY29kZUZuLCBtY3UpOwogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobiA9IDA7IG4gPCBtY3VUb1JlYWQ7IG4rKykgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNMZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzW2ldOwogICAgICAgICAgICBoID0gY29tcG9uZW50Lmg7CiAgICAgICAgICAgIHYgPSBjb21wb25lbnQudjsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHY7IGorKykgewogICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoOyBrKyspIHsKICAgICAgICAgICAgICAgIGRlY29kZU1jdShjb21wb25lbnQsIGRlY29kZUZuLCBtY3UsIGosIGspOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWN1Kys7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBiaXRzQ291bnQgPSAwOwogICAgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBvZmZzZXQpOwogICAgaWYgKCFmaWxlTWFya2VyKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGZpbGVNYXJrZXIuaW52YWxpZCkgewogICAgICBjb25zdCBwYXJ0aWFsTXNnID0gbWN1VG9SZWFkID4gMCA/ICJ1bmV4cGVjdGVkIiA6ICJleGNlc3NpdmUiOwogICAgICAoMCwgX3V0aWwud2FybikoYGRlY29kZVNjYW4gLSAke3BhcnRpYWxNc2d9IE1DVSBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogJHtmaWxlTWFya2VyLmludmFsaWR9YCk7CiAgICAgIG9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0OwogICAgfQogICAgaWYgKGZpbGVNYXJrZXIubWFya2VyID49IDB4ZmZkMCAmJiBmaWxlTWFya2VyLm1hcmtlciA8PSAweGZmZDcpIHsKICAgICAgb2Zmc2V0ICs9IDI7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIG9mZnNldCAtIHN0YXJ0T2Zmc2V0Owp9CmZ1bmN0aW9uIHF1YW50aXplQW5kSW52ZXJzZShjb21wb25lbnQsIGJsb2NrQnVmZmVyT2Zmc2V0LCBwKSB7CiAgY29uc3QgcXQgPSBjb21wb25lbnQucXVhbnRpemF0aW9uVGFibGUsCiAgICBibG9ja0RhdGEgPSBjb21wb25lbnQuYmxvY2tEYXRhOwogIGxldCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2Niwgdjc7CiAgbGV0IHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNzsKICBsZXQgdDsKICBpZiAoIXF0KSB7CiAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJtaXNzaW5nIHJlcXVpcmVkIFF1YW50aXphdGlvbiBUYWJsZS4iKTsKICB9CiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgNjQ7IHJvdyArPSA4KSB7CiAgICBwMCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvd107CiAgICBwMSA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDFdOwogICAgcDIgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyAyXTsKICAgIHAzID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgM107CiAgICBwNCA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDRdOwogICAgcDUgPSBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyByb3cgKyA1XTsKICAgIHA2ID0gYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgcm93ICsgNl07CiAgICBwNyA9IGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIHJvdyArIDddOwogICAgcDAgKj0gcXRbcm93XTsKICAgIGlmICgocDEgfCBwMiB8IHAzIHwgcDQgfCBwNSB8IHA2IHwgcDcpID09PSAwKSB7CiAgICAgIHQgPSBkY3RTcXJ0MiAqIHAwICsgNTEyID4+IDEwOwogICAgICBwW3Jvd10gPSB0OwogICAgICBwW3JvdyArIDFdID0gdDsKICAgICAgcFtyb3cgKyAyXSA9IHQ7CiAgICAgIHBbcm93ICsgM10gPSB0OwogICAgICBwW3JvdyArIDRdID0gdDsKICAgICAgcFtyb3cgKyA1XSA9IHQ7CiAgICAgIHBbcm93ICsgNl0gPSB0OwogICAgICBwW3JvdyArIDddID0gdDsKICAgICAgY29udGludWU7CiAgICB9CiAgICBwMSAqPSBxdFtyb3cgKyAxXTsKICAgIHAyICo9IHF0W3JvdyArIDJdOwogICAgcDMgKj0gcXRbcm93ICsgM107CiAgICBwNCAqPSBxdFtyb3cgKyA0XTsKICAgIHA1ICo9IHF0W3JvdyArIDVdOwogICAgcDYgKj0gcXRbcm93ICsgNl07CiAgICBwNyAqPSBxdFtyb3cgKyA3XTsKICAgIHYwID0gZGN0U3FydDIgKiBwMCArIDEyOCA+PiA4OwogICAgdjEgPSBkY3RTcXJ0MiAqIHA0ICsgMTI4ID4+IDg7CiAgICB2MiA9IHAyOwogICAgdjMgPSBwNjsKICAgIHY0ID0gZGN0U3FydDFkMiAqIChwMSAtIHA3KSArIDEyOCA+PiA4OwogICAgdjcgPSBkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMTI4ID4+IDg7CiAgICB2NSA9IHAzIDw8IDQ7CiAgICB2NiA9IHA1IDw8IDQ7CiAgICB2MCA9IHYwICsgdjEgKyAxID4+IDE7CiAgICB2MSA9IHYwIC0gdjE7CiAgICB0ID0gdjIgKiBkY3RTaW42ICsgdjMgKiBkY3RDb3M2ICsgMTI4ID4+IDg7CiAgICB2MiA9IHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDEyOCA+PiA4OwogICAgdjMgPSB0OwogICAgdjQgPSB2NCArIHY2ICsgMSA+PiAxOwogICAgdjYgPSB2NCAtIHY2OwogICAgdjcgPSB2NyArIHY1ICsgMSA+PiAxOwogICAgdjUgPSB2NyAtIHY1OwogICAgdjAgPSB2MCArIHYzICsgMSA+PiAxOwogICAgdjMgPSB2MCAtIHYzOwogICAgdjEgPSB2MSArIHYyICsgMSA+PiAxOwogICAgdjIgPSB2MSAtIHYyOwogICAgdCA9IHY0ICogZGN0U2luMyArIHY3ICogZGN0Q29zMyArIDIwNDggPj4gMTI7CiAgICB2NCA9IHY0ICogZGN0Q29zMyAtIHY3ICogZGN0U2luMyArIDIwNDggPj4gMTI7CiAgICB2NyA9IHQ7CiAgICB0ID0gdjUgKiBkY3RTaW4xICsgdjYgKiBkY3RDb3MxICsgMjA0OCA+PiAxMjsKICAgIHY1ID0gdjUgKiBkY3RDb3MxIC0gdjYgKiBkY3RTaW4xICsgMjA0OCA+PiAxMjsKICAgIHY2ID0gdDsKICAgIHBbcm93XSA9IHYwICsgdjc7CiAgICBwW3JvdyArIDddID0gdjAgLSB2NzsKICAgIHBbcm93ICsgMV0gPSB2MSArIHY2OwogICAgcFtyb3cgKyA2XSA9IHYxIC0gdjY7CiAgICBwW3JvdyArIDJdID0gdjIgKyB2NTsKICAgIHBbcm93ICsgNV0gPSB2MiAtIHY1OwogICAgcFtyb3cgKyAzXSA9IHYzICsgdjQ7CiAgICBwW3JvdyArIDRdID0gdjMgLSB2NDsKICB9CiAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgODsgKytjb2wpIHsKICAgIHAwID0gcFtjb2xdOwogICAgcDEgPSBwW2NvbCArIDhdOwogICAgcDIgPSBwW2NvbCArIDE2XTsKICAgIHAzID0gcFtjb2wgKyAyNF07CiAgICBwNCA9IHBbY29sICsgMzJdOwogICAgcDUgPSBwW2NvbCArIDQwXTsKICAgIHA2ID0gcFtjb2wgKyA0OF07CiAgICBwNyA9IHBbY29sICsgNTZdOwogICAgaWYgKChwMSB8IHAyIHwgcDMgfCBwNCB8IHA1IHwgcDYgfCBwNykgPT09IDApIHsKICAgICAgdCA9IGRjdFNxcnQyICogcDAgKyA4MTkyID4+IDE0OwogICAgICBpZiAodCA8IC0yMDQwKSB7CiAgICAgICAgdCA9IDA7CiAgICAgIH0gZWxzZSBpZiAodCA+PSAyMDI0KSB7CiAgICAgICAgdCA9IDI1NTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ID0gdCArIDIwNTYgPj4gNDsKICAgICAgfQogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2xdID0gdDsKICAgICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgOF0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAyNF0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAzMl0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0OF0gPSB0OwogICAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA1Nl0gPSB0OwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHYwID0gZGN0U3FydDIgKiBwMCArIDIwNDggPj4gMTI7CiAgICB2MSA9IGRjdFNxcnQyICogcDQgKyAyMDQ4ID4+IDEyOwogICAgdjIgPSBwMjsKICAgIHYzID0gcDY7CiAgICB2NCA9IGRjdFNxcnQxZDIgKiAocDEgLSBwNykgKyAyMDQ4ID4+IDEyOwogICAgdjcgPSBkY3RTcXJ0MWQyICogKHAxICsgcDcpICsgMjA0OCA+PiAxMjsKICAgIHY1ID0gcDM7CiAgICB2NiA9IHA1OwogICAgdjAgPSAodjAgKyB2MSArIDEgPj4gMSkgKyA0MTEyOwogICAgdjEgPSB2MCAtIHYxOwogICAgdCA9IHYyICogZGN0U2luNiArIHYzICogZGN0Q29zNiArIDIwNDggPj4gMTI7CiAgICB2MiA9IHYyICogZGN0Q29zNiAtIHYzICogZGN0U2luNiArIDIwNDggPj4gMTI7CiAgICB2MyA9IHQ7CiAgICB2NCA9IHY0ICsgdjYgKyAxID4+IDE7CiAgICB2NiA9IHY0IC0gdjY7CiAgICB2NyA9IHY3ICsgdjUgKyAxID4+IDE7CiAgICB2NSA9IHY3IC0gdjU7CiAgICB2MCA9IHYwICsgdjMgKyAxID4+IDE7CiAgICB2MyA9IHYwIC0gdjM7CiAgICB2MSA9IHYxICsgdjIgKyAxID4+IDE7CiAgICB2MiA9IHYxIC0gdjI7CiAgICB0ID0gdjQgKiBkY3RTaW4zICsgdjcgKiBkY3RDb3MzICsgMjA0OCA+PiAxMjsKICAgIHY0ID0gdjQgKiBkY3RDb3MzIC0gdjcgKiBkY3RTaW4zICsgMjA0OCA+PiAxMjsKICAgIHY3ID0gdDsKICAgIHQgPSB2NSAqIGRjdFNpbjEgKyB2NiAqIGRjdENvczEgKyAyMDQ4ID4+IDEyOwogICAgdjUgPSB2NSAqIGRjdENvczEgLSB2NiAqIGRjdFNpbjEgKyAyMDQ4ID4+IDEyOwogICAgdjYgPSB0OwogICAgcDAgPSB2MCArIHY3OwogICAgcDcgPSB2MCAtIHY3OwogICAgcDEgPSB2MSArIHY2OwogICAgcDYgPSB2MSAtIHY2OwogICAgcDIgPSB2MiArIHY1OwogICAgcDUgPSB2MiAtIHY1OwogICAgcDMgPSB2MyArIHY0OwogICAgcDQgPSB2MyAtIHY0OwogICAgaWYgKHAwIDwgMTYpIHsKICAgICAgcDAgPSAwOwogICAgfSBlbHNlIGlmIChwMCA+PSA0MDgwKSB7CiAgICAgIHAwID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDAgPj49IDQ7CiAgICB9CiAgICBpZiAocDEgPCAxNikgewogICAgICBwMSA9IDA7CiAgICB9IGVsc2UgaWYgKHAxID49IDQwODApIHsKICAgICAgcDEgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwMSA+Pj0gNDsKICAgIH0KICAgIGlmIChwMiA8IDE2KSB7CiAgICAgIHAyID0gMDsKICAgIH0gZWxzZSBpZiAocDIgPj0gNDA4MCkgewogICAgICBwMiA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHAyID4+PSA0OwogICAgfQogICAgaWYgKHAzIDwgMTYpIHsKICAgICAgcDMgPSAwOwogICAgfSBlbHNlIGlmIChwMyA+PSA0MDgwKSB7CiAgICAgIHAzID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDMgPj49IDQ7CiAgICB9CiAgICBpZiAocDQgPCAxNikgewogICAgICBwNCA9IDA7CiAgICB9IGVsc2UgaWYgKHA0ID49IDQwODApIHsKICAgICAgcDQgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwNCA+Pj0gNDsKICAgIH0KICAgIGlmIChwNSA8IDE2KSB7CiAgICAgIHA1ID0gMDsKICAgIH0gZWxzZSBpZiAocDUgPj0gNDA4MCkgewogICAgICBwNSA9IDI1NTsKICAgIH0gZWxzZSB7CiAgICAgIHA1ID4+PSA0OwogICAgfQogICAgaWYgKHA2IDwgMTYpIHsKICAgICAgcDYgPSAwOwogICAgfSBlbHNlIGlmIChwNiA+PSA0MDgwKSB7CiAgICAgIHA2ID0gMjU1OwogICAgfSBlbHNlIHsKICAgICAgcDYgPj49IDQ7CiAgICB9CiAgICBpZiAocDcgPCAxNikgewogICAgICBwNyA9IDA7CiAgICB9IGVsc2UgaWYgKHA3ID49IDQwODApIHsKICAgICAgcDcgPSAyNTU7CiAgICB9IGVsc2UgewogICAgICBwNyA+Pj0gNDsKICAgIH0KICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbF0gPSBwMDsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDhdID0gcDE7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyAxNl0gPSBwMjsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDI0XSA9IHAzOwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgMzJdID0gcDQ7CiAgICBibG9ja0RhdGFbYmxvY2tCdWZmZXJPZmZzZXQgKyBjb2wgKyA0MF0gPSBwNTsKICAgIGJsb2NrRGF0YVtibG9ja0J1ZmZlck9mZnNldCArIGNvbCArIDQ4XSA9IHA2OwogICAgYmxvY2tEYXRhW2Jsb2NrQnVmZmVyT2Zmc2V0ICsgY29sICsgNTZdID0gcDc7CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50RGF0YShmcmFtZSwgY29tcG9uZW50KSB7CiAgY29uc3QgYmxvY2tzUGVyTGluZSA9IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lOwogIGNvbnN0IGJsb2Nrc1BlckNvbHVtbiA9IGNvbXBvbmVudC5ibG9ja3NQZXJDb2x1bW47CiAgY29uc3QgY29tcHV0YXRpb25CdWZmZXIgPSBuZXcgSW50MTZBcnJheSg2NCk7CiAgZm9yIChsZXQgYmxvY2tSb3cgPSAwOyBibG9ja1JvdyA8IGJsb2Nrc1BlckNvbHVtbjsgYmxvY2tSb3crKykgewogICAgZm9yIChsZXQgYmxvY2tDb2wgPSAwOyBibG9ja0NvbCA8IGJsb2Nrc1BlckxpbmU7IGJsb2NrQ29sKyspIHsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0QmxvY2tCdWZmZXJPZmZzZXQoY29tcG9uZW50LCBibG9ja1JvdywgYmxvY2tDb2wpOwogICAgICBxdWFudGl6ZUFuZEludmVyc2UoY29tcG9uZW50LCBvZmZzZXQsIGNvbXB1dGF0aW9uQnVmZmVyKTsKICAgIH0KICB9CiAgcmV0dXJuIGNvbXBvbmVudC5ibG9ja0RhdGE7Cn0KZnVuY3Rpb24gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIGN1cnJlbnRQb3MsIHN0YXJ0UG9zID0gY3VycmVudFBvcykgewogIGNvbnN0IG1heFBvcyA9IGRhdGEubGVuZ3RoIC0gMTsKICBsZXQgbmV3UG9zID0gc3RhcnRQb3MgPCBjdXJyZW50UG9zID8gc3RhcnRQb3MgOiBjdXJyZW50UG9zOwogIGlmIChjdXJyZW50UG9zID49IG1heFBvcykgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGNvbnN0IGN1cnJlbnRNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgY3VycmVudFBvcyk7CiAgaWYgKGN1cnJlbnRNYXJrZXIgPj0gMHhmZmMwICYmIGN1cnJlbnRNYXJrZXIgPD0gMHhmZmZlKSB7CiAgICByZXR1cm4gewogICAgICBpbnZhbGlkOiBudWxsLAogICAgICBtYXJrZXI6IGN1cnJlbnRNYXJrZXIsCiAgICAgIG9mZnNldDogY3VycmVudFBvcwogICAgfTsKICB9CiAgbGV0IG5ld01hcmtlciA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBuZXdQb3MpOwogIHdoaWxlICghKG5ld01hcmtlciA+PSAweGZmYzAgJiYgbmV3TWFya2VyIDw9IDB4ZmZmZSkpIHsKICAgIGlmICgrK25ld1BvcyA+PSBtYXhQb3MpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBuZXdNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgbmV3UG9zKTsKICB9CiAgcmV0dXJuIHsKICAgIGludmFsaWQ6IGN1cnJlbnRNYXJrZXIudG9TdHJpbmcoMTYpLAogICAgbWFya2VyOiBuZXdNYXJrZXIsCiAgICBvZmZzZXQ6IG5ld1BvcwogIH07Cn0KY2xhc3MgSnBlZ0ltYWdlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBkZWNvZGVUcmFuc2Zvcm0gPSBudWxsLAogICAgY29sb3JUcmFuc2Zvcm0gPSAtMQogIH0gPSB7fSkgewogICAgdGhpcy5fZGVjb2RlVHJhbnNmb3JtID0gZGVjb2RlVHJhbnNmb3JtOwogICAgdGhpcy5fY29sb3JUcmFuc2Zvcm0gPSBjb2xvclRyYW5zZm9ybTsKICB9CiAgcGFyc2UoZGF0YSwgewogICAgZG5sU2NhbkxpbmVzID0gbnVsbAogIH0gPSB7fSkgewogICAgZnVuY3Rpb24gcmVhZERhdGFCbG9jaygpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSAyOwogICAgICBsZXQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoIC0gMjsKICAgICAgY29uc3QgZmlsZU1hcmtlciA9IGZpbmROZXh0RmlsZU1hcmtlcihkYXRhLCBlbmRPZmZzZXQsIG9mZnNldCk7CiAgICAgIGlmIChmaWxlTWFya2VyPy5pbnZhbGlkKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJyZWFkRGF0YUJsb2NrIC0gaW5jb3JyZWN0IGxlbmd0aCwgY3VycmVudCBtYXJrZXIgaXM6ICIgKyBmaWxlTWFya2VyLmludmFsaWQpOwogICAgICAgIGVuZE9mZnNldCA9IGZpbGVNYXJrZXIub2Zmc2V0OwogICAgICB9CiAgICAgIGNvbnN0IGFycmF5ID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIGVuZE9mZnNldCk7CiAgICAgIG9mZnNldCArPSBhcnJheS5sZW5ndGg7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIGZ1bmN0aW9uIHByZXBhcmVDb21wb25lbnRzKGZyYW1lKSB7CiAgICAgIGNvbnN0IG1jdXNQZXJMaW5lID0gTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCAvIGZyYW1lLm1heEgpOwogICAgICBjb25zdCBtY3VzUGVyQ29sdW1uID0gTWF0aC5jZWlsKGZyYW1lLnNjYW5MaW5lcyAvIDggLyBmcmFtZS5tYXhWKTsKICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgZnJhbWUuY29tcG9uZW50cykgewogICAgICAgIGNvbnN0IGJsb2Nrc1BlckxpbmUgPSBNYXRoLmNlaWwoTWF0aC5jZWlsKGZyYW1lLnNhbXBsZXNQZXJMaW5lIC8gOCkgKiBjb21wb25lbnQuaCAvIGZyYW1lLm1heEgpOwogICAgICAgIGNvbnN0IGJsb2Nrc1BlckNvbHVtbiA9IE1hdGguY2VpbChNYXRoLmNlaWwoZnJhbWUuc2NhbkxpbmVzIC8gOCkgKiBjb21wb25lbnQudiAvIGZyYW1lLm1heFYpOwogICAgICAgIGNvbnN0IGJsb2Nrc1BlckxpbmVGb3JNY3UgPSBtY3VzUGVyTGluZSAqIGNvbXBvbmVudC5oOwogICAgICAgIGNvbnN0IGJsb2Nrc1BlckNvbHVtbkZvck1jdSA9IG1jdXNQZXJDb2x1bW4gKiBjb21wb25lbnQudjsKICAgICAgICBjb25zdCBibG9ja3NCdWZmZXJTaXplID0gNjQgKiBibG9ja3NQZXJDb2x1bW5Gb3JNY3UgKiAoYmxvY2tzUGVyTGluZUZvck1jdSArIDEpOwogICAgICAgIGNvbXBvbmVudC5ibG9ja0RhdGEgPSBuZXcgSW50MTZBcnJheShibG9ja3NCdWZmZXJTaXplKTsKICAgICAgICBjb21wb25lbnQuYmxvY2tzUGVyTGluZSA9IGJsb2Nrc1BlckxpbmU7CiAgICAgICAgY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbiA9IGJsb2Nrc1BlckNvbHVtbjsKICAgICAgfQogICAgICBmcmFtZS5tY3VzUGVyTGluZSA9IG1jdXNQZXJMaW5lOwogICAgICBmcmFtZS5tY3VzUGVyQ29sdW1uID0gbWN1c1BlckNvbHVtbjsKICAgIH0KICAgIGxldCBvZmZzZXQgPSAwOwogICAgbGV0IGpmaWYgPSBudWxsOwogICAgbGV0IGFkb2JlID0gbnVsbDsKICAgIGxldCBmcmFtZSwgcmVzZXRJbnRlcnZhbDsKICAgIGxldCBudW1TT1NNYXJrZXJzID0gMDsKICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlcyA9IFtdOwogICAgY29uc3QgaHVmZm1hblRhYmxlc0FDID0gW10sCiAgICAgIGh1ZmZtYW5UYWJsZXNEQyA9IFtdOwogICAgbGV0IGZpbGVNYXJrZXIgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKICAgIG9mZnNldCArPSAyOwogICAgaWYgKGZpbGVNYXJrZXIgIT09IDB4ZmZkOCkgewogICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJTT0kgbm90IGZvdW5kIik7CiAgICB9CiAgICBmaWxlTWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CiAgICBvZmZzZXQgKz0gMjsKICAgIG1hcmtlckxvb3A6IHdoaWxlIChmaWxlTWFya2VyICE9PSAweGZmZDkpIHsKICAgICAgbGV0IGksIGosIGw7CiAgICAgIHN3aXRjaCAoZmlsZU1hcmtlcikgewogICAgICAgIGNhc2UgMHhmZmUwOgogICAgICAgIGNhc2UgMHhmZmUxOgogICAgICAgIGNhc2UgMHhmZmUyOgogICAgICAgIGNhc2UgMHhmZmUzOgogICAgICAgIGNhc2UgMHhmZmU0OgogICAgICAgIGNhc2UgMHhmZmU1OgogICAgICAgIGNhc2UgMHhmZmU2OgogICAgICAgIGNhc2UgMHhmZmU3OgogICAgICAgIGNhc2UgMHhmZmU4OgogICAgICAgIGNhc2UgMHhmZmU5OgogICAgICAgIGNhc2UgMHhmZmVhOgogICAgICAgIGNhc2UgMHhmZmViOgogICAgICAgIGNhc2UgMHhmZmVjOgogICAgICAgIGNhc2UgMHhmZmVkOgogICAgICAgIGNhc2UgMHhmZmVlOgogICAgICAgIGNhc2UgMHhmZmVmOgogICAgICAgIGNhc2UgMHhmZmZlOgogICAgICAgICAgY29uc3QgYXBwRGF0YSA9IHJlYWREYXRhQmxvY2soKTsKICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZTApIHsKICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NGEgJiYgYXBwRGF0YVsxXSA9PT0gMHg0NiAmJiBhcHBEYXRhWzJdID09PSAweDQ5ICYmIGFwcERhdGFbM10gPT09IDB4NDYgJiYgYXBwRGF0YVs0XSA9PT0gMCkgewogICAgICAgICAgICAgIGpmaWYgPSB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB7CiAgICAgICAgICAgICAgICAgIG1ham9yOiBhcHBEYXRhWzVdLAogICAgICAgICAgICAgICAgICBtaW5vcjogYXBwRGF0YVs2XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRlbnNpdHlVbml0czogYXBwRGF0YVs3XSwKICAgICAgICAgICAgICAgIHhEZW5zaXR5OiBhcHBEYXRhWzhdIDw8IDggfCBhcHBEYXRhWzldLAogICAgICAgICAgICAgICAgeURlbnNpdHk6IGFwcERhdGFbMTBdIDw8IDggfCBhcHBEYXRhWzExXSwKICAgICAgICAgICAgICAgIHRodW1iV2lkdGg6IGFwcERhdGFbMTJdLAogICAgICAgICAgICAgICAgdGh1bWJIZWlnaHQ6IGFwcERhdGFbMTNdLAogICAgICAgICAgICAgICAgdGh1bWJEYXRhOiBhcHBEYXRhLnN1YmFycmF5KDE0LCAxNCArIDMgKiBhcHBEYXRhWzEyXSAqIGFwcERhdGFbMTNdKQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChmaWxlTWFya2VyID09PSAweGZmZWUpIHsKICAgICAgICAgICAgaWYgKGFwcERhdGFbMF0gPT09IDB4NDEgJiYgYXBwRGF0YVsxXSA9PT0gMHg2NCAmJiBhcHBEYXRhWzJdID09PSAweDZmICYmIGFwcERhdGFbM10gPT09IDB4NjIgJiYgYXBwRGF0YVs0XSA9PT0gMHg2NSkgewogICAgICAgICAgICAgIGFkb2JlID0gewogICAgICAgICAgICAgICAgdmVyc2lvbjogYXBwRGF0YVs1XSA8PCA4IHwgYXBwRGF0YVs2XSwKICAgICAgICAgICAgICAgIGZsYWdzMDogYXBwRGF0YVs3XSA8PCA4IHwgYXBwRGF0YVs4XSwKICAgICAgICAgICAgICAgIGZsYWdzMTogYXBwRGF0YVs5XSA8PCA4IHwgYXBwRGF0YVsxMF0sCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Db2RlOiBhcHBEYXRhWzExXQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRiOgogICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlc0VuZCA9IHF1YW50aXphdGlvblRhYmxlc0xlbmd0aCArIG9mZnNldCAtIDI7CiAgICAgICAgICBsZXQgejsKICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBxdWFudGl6YXRpb25UYWJsZXNFbmQpIHsKICAgICAgICAgICAgY29uc3QgcXVhbnRpemF0aW9uVGFibGVTcGVjID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBVaW50MTZBcnJheSg2NCk7CiAgICAgICAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZVNwZWMgPj4gNCA9PT0gMCkgewogICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CiAgICAgICAgICAgICAgICB6ID0gZGN0WmlnWmFnW2pdOwogICAgICAgICAgICAgICAgdGFibGVEYXRhW3pdID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHF1YW50aXphdGlvblRhYmxlU3BlYyA+PiA0ID09PSAxKSB7CiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKICAgICAgICAgICAgICAgIHogPSBkY3RaaWdaYWdbal07CiAgICAgICAgICAgICAgICB0YWJsZURhdGFbel0gPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJEUVQgLSBpbnZhbGlkIHRhYmxlIHNwZWMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZXNbcXVhbnRpemF0aW9uVGFibGVTcGVjICYgMTVdID0gdGFibGVEYXRhOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmYzA6CiAgICAgICAgY2FzZSAweGZmYzE6CiAgICAgICAgY2FzZSAweGZmYzI6CiAgICAgICAgICBpZiAoZnJhbWUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiT25seSBzaW5nbGUgZnJhbWUgSlBFR3Mgc3VwcG9ydGVkIik7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lID0ge307CiAgICAgICAgICBmcmFtZS5leHRlbmRlZCA9IGZpbGVNYXJrZXIgPT09IDB4ZmZjMTsKICAgICAgICAgIGZyYW1lLnByb2dyZXNzaXZlID0gZmlsZU1hcmtlciA9PT0gMHhmZmMyOwogICAgICAgICAgZnJhbWUucHJlY2lzaW9uID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICBjb25zdCBzb2ZTY2FuTGluZXMgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZnJhbWUuc2NhbkxpbmVzID0gZG5sU2NhbkxpbmVzIHx8IHNvZlNjYW5MaW5lczsKICAgICAgICAgIGZyYW1lLnNhbXBsZXNQZXJMaW5lID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGZyYW1lLmNvbXBvbmVudHMgPSBbXTsKICAgICAgICAgIGZyYW1lLmNvbXBvbmVudElkcyA9IHt9OwogICAgICAgICAgY29uc3QgY29tcG9uZW50c0NvdW50ID0gZGF0YVtvZmZzZXQrK107CiAgICAgICAgICBsZXQgbWF4SCA9IDAsCiAgICAgICAgICAgIG1heFYgPSAwOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gZGF0YVtvZmZzZXRdOwogICAgICAgICAgICBjb25zdCBoID0gZGF0YVtvZmZzZXQgKyAxXSA+PiA0OwogICAgICAgICAgICBjb25zdCB2ID0gZGF0YVtvZmZzZXQgKyAxXSAmIDE1OwogICAgICAgICAgICBpZiAobWF4SCA8IGgpIHsKICAgICAgICAgICAgICBtYXhIID0gaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWF4ViA8IHYpIHsKICAgICAgICAgICAgICBtYXhWID0gdjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBxSWQgPSBkYXRhW29mZnNldCArIDJdOwogICAgICAgICAgICBsID0gZnJhbWUuY29tcG9uZW50cy5wdXNoKHsKICAgICAgICAgICAgICBoLAogICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgcXVhbnRpemF0aW9uSWQ6IHFJZCwKICAgICAgICAgICAgICBxdWFudGl6YXRpb25UYWJsZTogbnVsbAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZnJhbWUuY29tcG9uZW50SWRzW2NvbXBvbmVudElkXSA9IGwgLSAxOwogICAgICAgICAgICBvZmZzZXQgKz0gMzsKICAgICAgICAgIH0KICAgICAgICAgIGZyYW1lLm1heEggPSBtYXhIOwogICAgICAgICAgZnJhbWUubWF4ViA9IG1heFY7CiAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50cyhmcmFtZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZjNDoKICAgICAgICAgIGNvbnN0IGh1ZmZtYW5MZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgb2Zmc2V0KTsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgZm9yIChpID0gMjsgaSA8IGh1ZmZtYW5MZW5ndGg7KSB7CiAgICAgICAgICAgIGNvbnN0IGh1ZmZtYW5UYWJsZVNwZWMgPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgY29kZUxlbmd0aHMgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgICAgICAgIGxldCBjb2RlTGVuZ3RoU3VtID0gMDsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgY29kZUxlbmd0aFN1bSArPSBjb2RlTGVuZ3Roc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBodWZmbWFuVmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoY29kZUxlbmd0aFN1bSk7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlTGVuZ3RoU3VtOyBqKyssIG9mZnNldCsrKSB7CiAgICAgICAgICAgICAgaHVmZm1hblZhbHVlc1tqXSA9IGRhdGFbb2Zmc2V0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IDE3ICsgY29kZUxlbmd0aFN1bTsKICAgICAgICAgICAgKGh1ZmZtYW5UYWJsZVNwZWMgPj4gNCA9PT0gMCA/IGh1ZmZtYW5UYWJsZXNEQyA6IGh1ZmZtYW5UYWJsZXNBQylbaHVmZm1hblRhYmxlU3BlYyAmIDE1XSA9IGJ1aWxkSHVmZm1hblRhYmxlKGNvZGVMZW5ndGhzLCBodWZmbWFuVmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRkOgogICAgICAgICAgb2Zmc2V0ICs9IDI7CiAgICAgICAgICByZXNldEludGVydmFsID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CiAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHhmZmRhOgogICAgICAgICAgY29uc3QgcGFyc2VETkxNYXJrZXIgPSArK251bVNPU01hcmtlcnMgPT09IDEgJiYgIWRubFNjYW5MaW5lczsKICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgY29uc3Qgc2VsZWN0b3JzQ291bnQgPSBkYXRhW29mZnNldCsrXSwKICAgICAgICAgICAgY29tcG9uZW50cyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGVjdG9yc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgICAgY29uc3QgY29tcG9uZW50SW5kZXggPSBmcmFtZS5jb21wb25lbnRJZHNbaW5kZXhdOwogICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBmcmFtZS5jb21wb25lbnRzW2NvbXBvbmVudEluZGV4XTsKICAgICAgICAgICAgY29tcG9uZW50LmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIGNvbnN0IHRhYmxlU3BlYyA9IGRhdGFbb2Zmc2V0KytdOwogICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlREMgPSBodWZmbWFuVGFibGVzRENbdGFibGVTcGVjID4+IDRdOwogICAgICAgICAgICBjb21wb25lbnQuaHVmZm1hblRhYmxlQUMgPSBodWZmbWFuVGFibGVzQUNbdGFibGVTcGVjICYgMTVdOwogICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHNwZWN0cmFsU3RhcnQgPSBkYXRhW29mZnNldCsrXSwKICAgICAgICAgICAgc3BlY3RyYWxFbmQgPSBkYXRhW29mZnNldCsrXSwKICAgICAgICAgICAgc3VjY2Vzc2l2ZUFwcHJveGltYXRpb24gPSBkYXRhW29mZnNldCsrXTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGRlY29kZVNjYW4oZGF0YSwgb2Zmc2V0LCBmcmFtZSwgY29tcG9uZW50cywgcmVzZXRJbnRlcnZhbCwgc3BlY3RyYWxTdGFydCwgc3BlY3RyYWxFbmQsIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uID4+IDQsIHN1Y2Nlc3NpdmVBcHByb3hpbWF0aW9uICYgMTUsIHBhcnNlRE5MTWFya2VyKTsKICAgICAgICAgICAgb2Zmc2V0ICs9IHByb2Nlc3NlZDsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEROTE1hcmtlckVycm9yKSB7CiAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke2V4Lm1lc3NhZ2V9IC0tIGF0dGVtcHRpbmcgdG8gcmUtcGFyc2UgdGhlIEpQRUcgaW1hZ2UuYCk7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoZGF0YSwgewogICAgICAgICAgICAgICAgZG5sU2NhbkxpbmVzOiBleC5zY2FuTGluZXMKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEVPSU1hcmtlckVycm9yKSB7CiAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGAke2V4Lm1lc3NhZ2V9IC0tIGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSBpbWFnZSBkYXRhLmApOwogICAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4ZmZkYzoKICAgICAgICAgIG9mZnNldCArPSA0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICBpZiAoZGF0YVtvZmZzZXRdICE9PSAweGZmKSB7CiAgICAgICAgICAgIG9mZnNldC0tOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGNvbnN0IG5leHRGaWxlTWFya2VyID0gZmluZE5leHRGaWxlTWFya2VyKGRhdGEsIG9mZnNldCAtIDIsIG9mZnNldCAtIDMpOwogICAgICAgICAgaWYgKG5leHRGaWxlTWFya2VyPy5pbnZhbGlkKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gdW5leHBlY3RlZCBkYXRhLCBjdXJyZW50IG1hcmtlciBpczogIiArIG5leHRGaWxlTWFya2VyLmludmFsaWQpOwogICAgICAgICAgICBvZmZzZXQgPSBuZXh0RmlsZU1hcmtlci5vZmZzZXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFuZXh0RmlsZU1hcmtlciB8fCBvZmZzZXQgPj0gZGF0YS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiSnBlZ0ltYWdlLnBhcnNlIC0gcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbWFnZSBkYXRhICIgKyAid2l0aG91dCBmaW5kaW5nIGFuIEVPSSBtYXJrZXIgKDB4RkZEOSkuIik7CiAgICAgICAgICAgIGJyZWFrIG1hcmtlckxvb3A7CiAgICAgICAgICB9CiAgICAgICAgICB0aHJvdyBuZXcgSnBlZ0Vycm9yKCJKcGVnSW1hZ2UucGFyc2UgLSB1bmtub3duIG1hcmtlcjogIiArIGZpbGVNYXJrZXIudG9TdHJpbmcoMTYpKTsKICAgICAgfQogICAgICBmaWxlTWFya2VyID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIG9mZnNldCk7CiAgICAgIG9mZnNldCArPSAyOwogICAgfQogICAgdGhpcy53aWR0aCA9IGZyYW1lLnNhbXBsZXNQZXJMaW5lOwogICAgdGhpcy5oZWlnaHQgPSBmcmFtZS5zY2FuTGluZXM7CiAgICB0aGlzLmpmaWYgPSBqZmlmOwogICAgdGhpcy5hZG9iZSA9IGFkb2JlOwogICAgdGhpcy5jb21wb25lbnRzID0gW107CiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBmcmFtZS5jb21wb25lbnRzKSB7CiAgICAgIGNvbnN0IHF1YW50aXphdGlvblRhYmxlID0gcXVhbnRpemF0aW9uVGFibGVzW2NvbXBvbmVudC5xdWFudGl6YXRpb25JZF07CiAgICAgIGlmIChxdWFudGl6YXRpb25UYWJsZSkgewogICAgICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25UYWJsZSA9IHF1YW50aXphdGlvblRhYmxlOwogICAgICB9CiAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHsKICAgICAgICBpbmRleDogY29tcG9uZW50LmluZGV4LAogICAgICAgIG91dHB1dDogYnVpbGRDb21wb25lbnREYXRhKGZyYW1lLCBjb21wb25lbnQpLAogICAgICAgIHNjYWxlWDogY29tcG9uZW50LmggLyBmcmFtZS5tYXhILAogICAgICAgIHNjYWxlWTogY29tcG9uZW50LnYgLyBmcmFtZS5tYXhWLAogICAgICAgIGJsb2Nrc1BlckxpbmU6IGNvbXBvbmVudC5ibG9ja3NQZXJMaW5lLAogICAgICAgIGJsb2Nrc1BlckNvbHVtbjogY29tcG9uZW50LmJsb2Nrc1BlckNvbHVtbgogICAgICB9KTsKICAgIH0KICAgIHRoaXMubnVtQ29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KICBfZ2V0TGluZWFyaXplZEJsb2NrRGF0YSh3aWR0aCwgaGVpZ2h0LCBpc1NvdXJjZVBERiA9IGZhbHNlKSB7CiAgICBjb25zdCBzY2FsZVggPSB0aGlzLndpZHRoIC8gd2lkdGgsCiAgICAgIHNjYWxlWSA9IHRoaXMuaGVpZ2h0IC8gaGVpZ2h0OwogICAgbGV0IGNvbXBvbmVudCwgY29tcG9uZW50U2NhbGVYLCBjb21wb25lbnRTY2FsZVksIGJsb2Nrc1BlclNjYW5saW5lOwogICAgbGV0IHgsIHksIGksIGosIGs7CiAgICBsZXQgaW5kZXg7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGxldCBvdXRwdXQ7CiAgICBjb25zdCBudW1Db21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmxlbmd0aDsKICAgIGNvbnN0IGRhdGFMZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIG51bUNvbXBvbmVudHM7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGFMZW5ndGgpOwogICAgY29uc3QgeFNjYWxlQmxvY2tPZmZzZXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGgpOwogICAgY29uc3QgbWFzazNMU0IgPSAweGZmZmZmZmY4OwogICAgbGV0IGxhc3RDb21wb25lbnRTY2FsZVg7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgaSsrKSB7CiAgICAgIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tpXTsKICAgICAgY29tcG9uZW50U2NhbGVYID0gY29tcG9uZW50LnNjYWxlWCAqIHNjYWxlWDsKICAgICAgY29tcG9uZW50U2NhbGVZID0gY29tcG9uZW50LnNjYWxlWSAqIHNjYWxlWTsKICAgICAgb2Zmc2V0ID0gaTsKICAgICAgb3V0cHV0ID0gY29tcG9uZW50Lm91dHB1dDsKICAgICAgYmxvY2tzUGVyU2NhbmxpbmUgPSBjb21wb25lbnQuYmxvY2tzUGVyTGluZSArIDEgPDwgMzsKICAgICAgaWYgKGNvbXBvbmVudFNjYWxlWCAhPT0gbGFzdENvbXBvbmVudFNjYWxlWCkgewogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBqID0gMCB8IHggKiBjb21wb25lbnRTY2FsZVg7CiAgICAgICAgICB4U2NhbGVCbG9ja09mZnNldFt4XSA9IChqICYgbWFzazNMU0IpIDw8IDMgfCBqICYgNzsKICAgICAgICB9CiAgICAgICAgbGFzdENvbXBvbmVudFNjYWxlWCA9IGNvbXBvbmVudFNjYWxlWDsKICAgICAgfQogICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICBqID0gMCB8IHkgKiBjb21wb25lbnRTY2FsZVk7CiAgICAgICAgaW5kZXggPSBibG9ja3NQZXJTY2FubGluZSAqIChqICYgbWFzazNMU0IpIHwgKGogJiA3KSA8PCAzOwogICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSBvdXRwdXRbaW5kZXggKyB4U2NhbGVCbG9ja09mZnNldFt4XV07CiAgICAgICAgICBvZmZzZXQgKz0gbnVtQ29tcG9uZW50czsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFuc2Zvcm0gPSB0aGlzLl9kZWNvZGVUcmFuc2Zvcm07CiAgICBpZiAoIWlzU291cmNlUERGICYmIG51bUNvbXBvbmVudHMgPT09IDQgJiYgIXRyYW5zZm9ybSkgewogICAgICB0cmFuc2Zvcm0gPSBuZXcgSW50MzJBcnJheShbLTI1NiwgMjU1LCAtMjU2LCAyNTUsIC0yNTYsIDI1NSwgLTI1NiwgMjU1XSk7CiAgICB9CiAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOykgewogICAgICAgIGZvciAoaiA9IDAsIGsgPSAwOyBqIDwgbnVtQ29tcG9uZW50czsgaisrLCBpKyssIGsgKz0gMikgewogICAgICAgICAgZGF0YVtpXSA9IChkYXRhW2ldICogdHJhbnNmb3JtW2tdID4+IDgpICsgdHJhbnNmb3JtW2sgKyAxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBkYXRhOwogIH0KICBnZXQgX2lzQ29sb3JDb252ZXJzaW9uTmVlZGVkKCkgewogICAgaWYgKHRoaXMuYWRvYmUpIHsKICAgICAgcmV0dXJuICEhdGhpcy5hZG9iZS50cmFuc2Zvcm1Db2RlOwogICAgfQogICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMykgewogICAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21wb25lbnRzWzBdLmluZGV4ID09PSAweDUyICYmIHRoaXMuY29tcG9uZW50c1sxXS5pbmRleCA9PT0gMHg0NyAmJiB0aGlzLmNvbXBvbmVudHNbMl0uaW5kZXggPT09IDB4NDIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5fY29sb3JUcmFuc2Zvcm0gPT09IDEpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2IoZGF0YSkgewogICAgbGV0IFksIENiLCBDcjsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzKSB7CiAgICAgIFkgPSBkYXRhW2ldOwogICAgICBDYiA9IGRhdGFbaSArIDFdOwogICAgICBDciA9IGRhdGFbaSArIDJdOwogICAgICBkYXRhW2ldID0gWSAtIDE3OS40NTYgKyAxLjQwMiAqIENyOwogICAgICBkYXRhW2kgKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIGRhdGFbaSArIDJdID0gWSAtIDIyNi44MTYgKyAxLjc3MiAqIENiOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9jb252ZXJ0WWNjVG9SZ2JhKGRhdGEsIG91dCkgewogICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSAzLCBqICs9IDQpIHsKICAgICAgY29uc3QgWSA9IGRhdGFbaV07CiAgICAgIGNvbnN0IENiID0gZGF0YVtpICsgMV07CiAgICAgIGNvbnN0IENyID0gZGF0YVtpICsgMl07CiAgICAgIG91dFtqXSA9IFkgLSAxNzkuNDU2ICsgMS40MDIgKiBDcjsKICAgICAgb3V0W2ogKyAxXSA9IFkgKyAxMzUuNDU5IC0gMC4zNDQgKiBDYiAtIDAuNzE0ICogQ3I7CiAgICAgIG91dFtqICsgMl0gPSBZIC0gMjI2LjgxNiArIDEuNzcyICogQ2I7CiAgICAgIG91dFtqICsgM10gPSAyNTU7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBfY29udmVydFljY2tUb1JnYihkYXRhKSB7CiAgICBsZXQgWSwgQ2IsIENyLCBrOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gZGF0YS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewogICAgICBZID0gZGF0YVtpXTsKICAgICAgQ2IgPSBkYXRhW2kgKyAxXTsKICAgICAgQ3IgPSBkYXRhW2kgKyAyXTsKICAgICAgayA9IGRhdGFbaSArIDNdOwogICAgICBkYXRhW29mZnNldCsrXSA9IC0xMjIuNjcxOTU0MDY4OTQgKyBDYiAqICgtNi42MDYzNTY2OTQyMDM2NGUtNSAqIENiICsgMC4wMDA0MzcxMzA0NzU5MjYyMzIgKiBDciAtIDUuNDA4MDYxMDA2NDU5OWUtNSAqIFkgKyAwLjAwMDQ4NDQ5Nzk3MTIwMjgxICogayAtIDAuMTU0MzYyMTUxODcxMTI2KSArIENyICogKC0wLjAwMDk1Nzk2NDM3ODQ0NTc3MyAqIENyICsgMC4wMDA4MTcwNzY5MTEzNDY2MjUgKiBZIC0gMC4wMDQ3NzI3MTQwNTQwODc0NyAqIGsgKyAxLjUzMzgwMjUzMjIxNzM0KSArIFkgKiAoMC4wMDA5NjEyNTAxODQxMzA2ODggKiBZIC0gMC4wMDI2NjI1NzMzMjI4MzkzMyAqIGsgKyAwLjQ4MzU3MDg4NDUxMjY1KSArIGsgKiAoLTAuMDAwMzM2MTk3MTc3NjE4Mzk0ICogayArIDAuNDg0NzkxNTYxNDkwNzc2KTsKICAgICAgZGF0YVtvZmZzZXQrK10gPSAxMDcuMjY4MDM5Mzk3NzI0ICsgQ2IgKiAoMi4xOTkyNzEwNDUyNTc0MWUtNSAqIENiIC0gMC4wMDA2NDA5OTIwMTgyOTc5NDUgKiBDciArIDAuMDAwNjU5Mzk3MDAxMjQ1NTc3ICogWSArIDAuMDAwNDI2MTA1NjUyOTM4ODM3ICogayAtIDAuMTc2NDkxNzkyNDYyODc1KSArIENyICogKC0wLjAwMDc3ODI2OTk0MTUxMzY4MyAqIENyICsgMC4wMDEzMDg3MjI2MTQwODI3NSAqIFkgKyAwLjAwMDc3MDQ4MjYzMTgwMTEzMiAqIGsgLSAwLjE1MTA1MTQ5Mjc3NTU2MikgKyBZICogKDAuMDAxMjY5MzUzNjgxMTQ4NDMgKiBZIC0gMC4wMDI2NTA5MDE4OTAxMDg5OCAqIGsgKyAwLjI1ODAyOTEwMjA2ODQ1KSArIGsgKiAoLTAuMDAwMzE4OTEzMTE3NTg4MzI4ICogayAtIDAuMjEzNzQyNDAwMzIzNjY1KTsKICAgICAgZGF0YVtvZmZzZXQrK10gPSAtMjAuODEwMDEyNTQ2OTQ3ICsgQ2IgKiAoLTAuMDAwNTcwMTE1MTk2OTczNjc3ICogQ2IgLSAyLjYzNDA5MDUxMDA0NTg5ZS01ICogQ3IgKyAwLjAwMjA3NDEwODgxMTUwMTIgKiBZIC0gMC4wMDI4ODI2MDIzNjg1MzQ0MiAqIGsgKyAwLjgxNDI3Mjk2ODM1OTI5NSkgKyBDciAqICgtMS41MzQ5NjA1NzQ0MDk3NWUtNSAqIENyIC0gMC4wMDAxMzI2ODkwNDM5NjE0NDYgKiBZICsgMC4wMDA1NjA4MzM2OTEyNDI4MTIgKiBrIC0gMC4xOTUxNTIwMjc1MzQwNDkpICsgWSAqICgwLjAwMTc0NDE4MTMyOTI3NTgyICogWSAtIDAuMDAyNTUyNDMzMjE0MzkzNDcgKiBrICsgMC4xMTY5MzUwMjA0NjUxNDUpICsgayAqICgtMC4wMDAzNDM1MzE5OTY1MTA1NTUgKiBrICsgMC4yNDE2NTI2MDIzMjQwNyk7CiAgICB9CiAgICByZXR1cm4gZGF0YS5zdWJhcnJheSgwLCBvZmZzZXQpOwogIH0KICBfY29udmVydFljY2tUb1JnYmEoZGF0YSkgewogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgY29uc3QgWSA9IGRhdGFbaV07CiAgICAgIGNvbnN0IENiID0gZGF0YVtpICsgMV07CiAgICAgIGNvbnN0IENyID0gZGF0YVtpICsgMl07CiAgICAgIGNvbnN0IGsgPSBkYXRhW2kgKyAzXTsKICAgICAgZGF0YVtpXSA9IC0xMjIuNjcxOTU0MDY4OTQgKyBDYiAqICgtNi42MDYzNTY2OTQyMDM2NGUtNSAqIENiICsgMC4wMDA0MzcxMzA0NzU5MjYyMzIgKiBDciAtIDUuNDA4MDYxMDA2NDU5OWUtNSAqIFkgKyAwLjAwMDQ4NDQ5Nzk3MTIwMjgxICogayAtIDAuMTU0MzYyMTUxODcxMTI2KSArIENyICogKC0wLjAwMDk1Nzk2NDM3ODQ0NTc3MyAqIENyICsgMC4wMDA4MTcwNzY5MTEzNDY2MjUgKiBZIC0gMC4wMDQ3NzI3MTQwNTQwODc0NyAqIGsgKyAxLjUzMzgwMjUzMjIxNzM0KSArIFkgKiAoMC4wMDA5NjEyNTAxODQxMzA2ODggKiBZIC0gMC4wMDI2NjI1NzMzMjI4MzkzMyAqIGsgKyAwLjQ4MzU3MDg4NDUxMjY1KSArIGsgKiAoLTAuMDAwMzM2MTk3MTc3NjE4Mzk0ICogayArIDAuNDg0NzkxNTYxNDkwNzc2KTsKICAgICAgZGF0YVtpICsgMV0gPSAxMDcuMjY4MDM5Mzk3NzI0ICsgQ2IgKiAoMi4xOTkyNzEwNDUyNTc0MWUtNSAqIENiIC0gMC4wMDA2NDA5OTIwMTgyOTc5NDUgKiBDciArIDAuMDAwNjU5Mzk3MDAxMjQ1NTc3ICogWSArIDAuMDAwNDI2MTA1NjUyOTM4ODM3ICogayAtIDAuMTc2NDkxNzkyNDYyODc1KSArIENyICogKC0wLjAwMDc3ODI2OTk0MTUxMzY4MyAqIENyICsgMC4wMDEzMDg3MjI2MTQwODI3NSAqIFkgKyAwLjAwMDc3MDQ4MjYzMTgwMTEzMiAqIGsgLSAwLjE1MTA1MTQ5Mjc3NTU2MikgKyBZICogKDAuMDAxMjY5MzUzNjgxMTQ4NDMgKiBZIC0gMC4wMDI2NTA5MDE4OTAxMDg5OCAqIGsgKyAwLjI1ODAyOTEwMjA2ODQ1KSArIGsgKiAoLTAuMDAwMzE4OTEzMTE3NTg4MzI4ICogayAtIDAuMjEzNzQyNDAwMzIzNjY1KTsKICAgICAgZGF0YVtpICsgMl0gPSAtMjAuODEwMDEyNTQ2OTQ3ICsgQ2IgKiAoLTAuMDAwNTcwMTE1MTk2OTczNjc3ICogQ2IgLSAyLjYzNDA5MDUxMDA0NTg5ZS01ICogQ3IgKyAwLjAwMjA3NDEwODgxMTUwMTIgKiBZIC0gMC4wMDI4ODI2MDIzNjg1MzQ0MiAqIGsgKyAwLjgxNDI3Mjk2ODM1OTI5NSkgKyBDciAqICgtMS41MzQ5NjA1NzQ0MDk3NWUtNSAqIENyIC0gMC4wMDAxMzI2ODkwNDM5NjE0NDYgKiBZICsgMC4wMDA1NjA4MzM2OTEyNDI4MTIgKiBrIC0gMC4xOTUxNTIwMjc1MzQwNDkpICsgWSAqICgwLjAwMTc0NDE4MTMyOTI3NTgyICogWSAtIDAuMDAyNTUyNDMzMjE0MzkzNDcgKiBrICsgMC4xMTY5MzUwMjA0NjUxNDUpICsgayAqICgtMC4wMDAzNDM1MzE5OTY1MTA1NTUgKiBrICsgMC4yNDE2NTI2MDIzMjQwNyk7CiAgICAgIGRhdGFbaSArIDNdID0gMjU1OwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIF9jb252ZXJ0WWNja1RvQ215ayhkYXRhKSB7CiAgICBsZXQgWSwgQ2IsIENyOwogICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHsKICAgICAgWSA9IGRhdGFbaV07CiAgICAgIENiID0gZGF0YVtpICsgMV07CiAgICAgIENyID0gZGF0YVtpICsgMl07CiAgICAgIGRhdGFbaV0gPSA0MzQuNDU2IC0gWSAtIDEuNDAyICogQ3I7CiAgICAgIGRhdGFbaSArIDFdID0gMTE5LjU0MSAtIFkgKyAwLjM0NCAqIENiICsgMC43MTQgKiBDcjsKICAgICAgZGF0YVtpICsgMl0gPSA0ODEuODE2IC0gWSAtIDEuNzcyICogQ2I7CiAgICB9CiAgICByZXR1cm4gZGF0YTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2IoZGF0YSkgewogICAgbGV0IGMsIG0sIHksIGs7CiAgICBsZXQgb2Zmc2V0ID0gMDsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CiAgICAgIGMgPSBkYXRhW2ldOwogICAgICBtID0gZGF0YVtpICsgMV07CiAgICAgIHkgPSBkYXRhW2kgKyAyXTsKICAgICAgayA9IGRhdGFbaSArIDNdOwogICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSArIGMgKiAoLTAuMDAwMDY3NDcxNDcwNzM2MDI0NDEgKiBjICsgMC4wMDA4Mzc5MjYyMTIxMDEzNzI3ICogbSArIDAuMDAwMjg5NDcxODE4ODY0MzI5NCAqIHkgKyAwLjAwMzI2NDIzMTA1NzUzNzgwNiAqIGsgLSAxLjExODU2MTE4NjcyMDM5MzcpICsgbSAqICgwLjAwMDAyNjM3NDEwNzYxNjA4OTQwNSAqIG0gLSAwLjAwMDA4NjI2OTQ5MTU4NjM4NTcyICogeSAtIDAuMDAwMjc0ODc2OTA2NzQ5OTQ5MSAqIGsgLSAwLjAyMTU1Njg4Nzk0OTc4OTY3KSArIHkgKiAoLTAuMDAwMDM4NzgwOTkyMTI4NjkzNjMgKiB5IC0gMC4wMDAzMjY3ODA4Mjc5NDg1Mjg2ICogayArIDAuMDY4Njc0MjIzODU5NTM0NSkgLSBrICogKDAuMDAwMzM2MTk3MTc3NjE4MzkzNyAqIGsgKyAwLjc0MzA2NTkxNTEzNDIyNTQpOwogICAgICBkYXRhW29mZnNldCsrXSA9IDI1NSArIGMgKiAoMC4wMDAxMzU5NjM3MjgxMzU4ODg0OCAqIGMgKyAwLjAwMDkyNDUzNzEzMjU3MzU4NSAqIG0gKyAwLjAwMDEwNTY3MzU5NjE4NjgzNTkzICogeSArIDAuMDAwNDc5MTg2NDY4NzQzNjUxMiAqIGsgLSAwLjMxMDk2ODk1ODc1MTU4NzUpICsgbSAqICgtMC4wMDAyMzU0NTM0NjEwODM3MDM0NCAqIG0gKyAwLjAwMDI3MDI4NDUyNTM1MzQ3MTQgKiB5ICsgMC4wMDIwMjAwMzA4OTc3MzA3MTU2ICogayAtIDAuNzQ4ODA1MjE2NzAxNTQ5NCkgKyB5ICogKDAuMDAwMDY4MzQ4MTU5OTgyMzU2NjIgKiB5ICsgMC4wMDAxNTE2ODQ1MjM2MzQ2MDk3MyAqIGsgLSAwLjA5NzUxOTI3Nzc0NzI4OTMzKSAtIGsgKiAoMC4wMDAzMTg5MTMxMTc1ODgzMjgxICogayArIDAuNzM2NDg4MzgwNzczMzE2OCk7CiAgICAgIGRhdGFbb2Zmc2V0KytdID0gMjU1ICsgYyAqICgwLjAwMDAxMzU5ODY1MDQxMTM4NTMwNyAqIGMgKyAwLjAwMDEyNDIzOTU2MTc1NDkwODUxICogbSArIDAuMDAwNDc1MTk4NTA5NzU4MzU4OSAqIHkgLSAwLjAwMDAwMzY3MjkzMTc0NzY2MzA0MjIgKiBrIC0gMC4wNTU2MjE4Njk4MDI2NDAzNCkgKyBtICogKDAuMDAwMTYxNDEzODA1OTg3MjQ2NzYgKiBtICsgMC4wMDA5NjkyMjM5MTMwNzI1MTg2ICogeSArIDAuMDAwNzc4MjY5MjQ1MDAzNjI1MyAqIGsgLSAwLjQ0MDE1MjMyMzY3NTI2NDYzKSArIHkgKiAoNS4wNjg4ODI5MTQwNjg3NjllLTcgKiB5ICsgMC4wMDE3Nzc4MzY5MDExMzc1MDcxICogayAtIDAuNzU5MTQ1NDY0OTc0OTYwOSkgLSBrICogKDAuMDAwMzQzNTMxOTk2NTEwNTU1MyAqIGsgKyAwLjcwNjM3NzAxODYxNjAxNDQpOwogICAgfQogICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgb2Zmc2V0KTsKICB9CiAgX2NvbnZlcnRDbXlrVG9SZ2JhKGRhdGEpIHsKICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBkYXRhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7CiAgICAgIGNvbnN0IGMgPSBkYXRhW2ldOwogICAgICBjb25zdCBtID0gZGF0YVtpICsgMV07CiAgICAgIGNvbnN0IHkgPSBkYXRhW2kgKyAyXTsKICAgICAgY29uc3QgayA9IGRhdGFbaSArIDNdOwogICAgICBkYXRhW2ldID0gMjU1ICsgYyAqICgtMC4wMDAwNjc0NzE0NzA3MzYwMjQ0MSAqIGMgKyAwLjAwMDgzNzkyNjIxMjEwMTM3MjcgKiBtICsgMC4wMDAyODk0NzE4MTg4NjQzMjk0ICogeSArIDAuMDAzMjY0MjMxMDU3NTM3ODA2ICogayAtIDEuMTE4NTYxMTg2NzIwMzkzNykgKyBtICogKDAuMDAwMDI2Mzc0MTA3NjE2MDg5NDA1ICogbSAtIDAuMDAwMDg2MjY5NDkxNTg2Mzg1NzIgKiB5IC0gMC4wMDAyNzQ4NzY5MDY3NDk5NDkxICogayAtIDAuMDIxNTU2ODg3OTQ5Nzg5NjcpICsgeSAqICgtMC4wMDAwMzg3ODA5OTIxMjg2OTM2MyAqIHkgLSAwLjAwMDMyNjc4MDgyNzk0ODUyODYgKiBrICsgMC4wNjg2NzQyMjM4NTk1MzQ1KSAtIGsgKiAoMC4wMDAzMzYxOTcxNzc2MTgzOTM3ICogayArIDAuNzQzMDY1OTE1MTM0MjI1NCk7CiAgICAgIGRhdGFbaSArIDFdID0gMjU1ICsgYyAqICgwLjAwMDEzNTk2MzcyODEzNTg4ODQ4ICogYyArIDAuMDAwOTI0NTM3MTMyNTczNTg1ICogbSArIDAuMDAwMTA1NjczNTk2MTg2ODM1OTMgKiB5ICsgMC4wMDA0NzkxODY0Njg3NDM2NTEyICogayAtIDAuMzEwOTY4OTU4NzUxNTg3NSkgKyBtICogKC0wLjAwMDIzNTQ1MzQ2MTA4MzcwMzQ0ICogbSArIDAuMDAwMjcwMjg0NTI1MzUzNDcxNCAqIHkgKyAwLjAwMjAyMDAzMDg5NzczMDcxNTYgKiBrIC0gMC43NDg4MDUyMTY3MDE1NDk0KSArIHkgKiAoMC4wMDAwNjgzNDgxNTk5ODIzNTY2MiAqIHkgKyAwLjAwMDE1MTY4NDUyMzYzNDYwOTczICogayAtIDAuMDk3NTE5Mjc3NzQ3Mjg5MzMpIC0gayAqICgwLjAwMDMxODkxMzExNzU4ODMyODEgKiBrICsgMC43MzY0ODgzODA3NzMzMTY4KTsKICAgICAgZGF0YVtpICsgMl0gPSAyNTUgKyBjICogKDAuMDAwMDEzNTk4NjUwNDExMzg1MzA3ICogYyArIDAuMDAwMTI0MjM5NTYxNzU0OTA4NTEgKiBtICsgMC4wMDA0NzUxOTg1MDk3NTgzNTg5ICogeSAtIDAuMDAwMDAzNjcyOTMxNzQ3NjYzMDQyMiAqIGsgLSAwLjA1NTYyMTg2OTgwMjY0MDM0KSArIG0gKiAoMC4wMDAxNjE0MTM4MDU5ODcyNDY3NiAqIG0gKyAwLjAwMDk2OTIyMzkxMzA3MjUxODYgKiB5ICsgMC4wMDA3NzgyNjkyNDUwMDM2MjUzICogayAtIDAuNDQwMTUyMzIzNjc1MjY0NjMpICsgeSAqICg1LjA2ODg4MjkxNDA2ODc2OWUtNyAqIHkgKyAwLjAwMTc3NzgzNjkwMTEzNzUwNzEgKiBrIC0gMC43NTkxNDU0NjQ5NzQ5NjA5KSAtIGsgKiAoMC4wMDAzNDM1MzE5OTY1MTA1NTUzICogayArIDAuNzA2Mzc3MDE4NjE2MDE0NCk7CiAgICAgIGRhdGFbaSArIDNdID0gMjU1OwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGdldERhdGEoewogICAgd2lkdGgsCiAgICBoZWlnaHQsCiAgICBmb3JjZVJHQkEgPSBmYWxzZSwKICAgIGZvcmNlUkdCID0gZmFsc2UsCiAgICBpc1NvdXJjZVBERiA9IGZhbHNlCiAgfSkgewogICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA+IDQpIHsKICAgICAgdGhyb3cgbmV3IEpwZWdFcnJvcigiVW5zdXBwb3J0ZWQgY29sb3IgbW9kZSIpOwogICAgfQogICAgY29uc3QgZGF0YSA9IHRoaXMuX2dldExpbmVhcml6ZWRCbG9ja0RhdGEod2lkdGgsIGhlaWdodCwgaXNTb3VyY2VQREYpOwogICAgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMSAmJiAoZm9yY2VSR0JBIHx8IGZvcmNlUkdCKSkgewogICAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aCAqIChmb3JjZVJHQkEgPyA0IDogMyk7CiAgICAgIGNvbnN0IHJnYmFEYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGxlbik7CiAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICBpZiAoZm9yY2VSR0JBKSB7CiAgICAgICAgKDAsIF9pbWFnZV91dGlscy5ncmF5VG9SR0JBKShkYXRhLCBuZXcgVWludDMyQXJyYXkocmdiYURhdGEuYnVmZmVyKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChjb25zdCBncmF5Q29sb3Igb2YgZGF0YSkgewogICAgICAgICAgcmdiYURhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yOwogICAgICAgICAgcmdiYURhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yOwogICAgICAgICAgcmdiYURhdGFbb2Zmc2V0KytdID0gZ3JheUNvbG9yOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmdiYURhdGE7CiAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gMyAmJiB0aGlzLl9pc0NvbG9yQ29udmVyc2lvbk5lZWRlZCkgewogICAgICBpZiAoZm9yY2VSR0JBKSB7CiAgICAgICAgY29uc3QgcmdiYURhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5sZW5ndGggLyAzICogNCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NUb1JnYmEoZGF0YSwgcmdiYURhdGEpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNjVG9SZ2IoZGF0YSk7CiAgICB9IGVsc2UgaWYgKHRoaXMubnVtQ29tcG9uZW50cyA9PT0gNCkgewogICAgICBpZiAodGhpcy5faXNDb2xvckNvbnZlcnNpb25OZWVkZWQpIHsKICAgICAgICBpZiAoZm9yY2VSR0JBKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydFljY2tUb1JnYmEoZGF0YSk7CiAgICAgICAgfQogICAgICAgIGlmIChmb3JjZVJHQikgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRZY2NrVG9SZ2IoZGF0YSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0WWNja1RvQ215ayhkYXRhKTsKICAgICAgfSBlbHNlIGlmIChmb3JjZVJHQkEpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYmEoZGF0YSk7CiAgICAgIH0gZWxzZSBpZiAoZm9yY2VSR0IpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY29udmVydENteWtUb1JnYihkYXRhKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQp9CmV4cG9ydHMuSnBlZ0ltYWdlID0gSnBlZ0ltYWdlOwoKLyoqKi8gfSksCi8qIDI4ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEgPSBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQTsKZXhwb3J0cy5jb252ZXJ0VG9SR0JBID0gY29udmVydFRvUkdCQTsKZXhwb3J0cy5ncmF5VG9SR0JBID0gZ3JheVRvUkdCQTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHsKICBzd2l0Y2ggKHBhcmFtcy5raW5kKSB7CiAgICBjYXNlIF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDoKICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7CiAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA6CiAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7CiAgfQogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIHdpZHRoLAogIGhlaWdodCwKICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZiwKICBpbnZlcnNlRGVjb2RlID0gZmFsc2UKfSkgewogIGNvbnN0IGJsYWNrID0gX3V0aWwuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjsKICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdOwogIGNvbnN0IHdpZHRoSW5Tb3VyY2UgPSB3aWR0aCA+PiAzOwogIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3OwogIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7CiAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7CiAgbGV0IGRlc3RQb3MgPSAwOwogIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKICAgIGZvciAoY29uc3QgbWF4ID0gc3JjUG9zICsgd2lkdGhJblNvdXJjZTsgc3JjUG9zIDwgbWF4OyBzcmNQb3MrKykgewogICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nOwogICAgfQogICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoUmVtYWluZGVyOyBqKyspIHsKICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7CiAgICB9CiAgfQogIHJldHVybiB7CiAgICBzcmNQb3MsCiAgICBkZXN0UG9zCiAgfTsKfQpmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHsKICBzcmMsCiAgc3JjUG9zID0gMCwKICBkZXN0LAogIGRlc3RQb3MgPSAwLAogIHdpZHRoLAogIGhlaWdodAp9KSB7CiAgbGV0IGkgPSAwOwogIGNvbnN0IGxlbjMyID0gc3JjLmxlbmd0aCA+PiAyOwogIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpOwogIGlmIChfdXRpbC5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikgewogICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7CiAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07CiAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdOwogICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTsKICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDsKICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA+Pj4gMTYgfCBzMyA8PCAxNiB8IDB4ZmYwMDAwMDA7CiAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwOwogICAgfQogICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyYy5sZW5ndGg7IGogPCBqajsgaiArPSAzKSB7CiAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSB8IHNyY1tqICsgMV0gPDwgOCB8IHNyY1tqICsgMl0gPDwgMTYgfCAweGZmMDAwMDAwOwogICAgfQogIH0gZWxzZSB7CiAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHsKICAgICAgY29uc3QgczEgPSBzcmMzMltpXTsKICAgICAgY29uc3QgczIgPSBzcmMzMltpICsgMV07CiAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdOwogICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAxXSA9IHMxIDw8IDI0IHwgczIgPj4+IDggfCAweGZmOwogICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyIDw8IDE2IHwgczMgPj4+IDE2IHwgMHhmZjsKICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA8PCA4IHwgMHhmZjsKICAgIH0KICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmMubGVuZ3RoOyBqIDwgamo7IGogKz0gMykgewogICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbal0gPDwgMjQgfCBzcmNbaiArIDFdIDw8IDE2IHwgc3JjW2ogKyAyXSA8PCA4IHwgMHhmZjsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIHNyY1BvcywKICAgIGRlc3RQb3MKICB9Owp9CmZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7CiAgaWYgKF91dGlsLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmOwogICAgfQogIH0KfQoKLyoqKi8gfSksCi8qIDI5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuSnB4U3RyZWFtID0gdm9pZCAwOwp2YXIgX2RlY29kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKdmFyIF9qcHggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMwKTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgSnB4U3RyZWFtIGV4dGVuZHMgX2RlY29kZV9zdHJlYW0uRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHJlYW0sIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgdGhpcy5kaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLm1heWJlTGVuZ3RoID0gbWF5YmVMZW5ndGg7CiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICB9CiAgZ2V0IGJ5dGVzKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJieXRlcyIsIHRoaXMuc3RyZWFtLmdldEJ5dGVzKHRoaXMubWF5YmVMZW5ndGgpKTsKICB9CiAgZW5zdXJlQnVmZmVyKHJlcXVlc3RlZCkge30KICByZWFkQmxvY2soKSB7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QganB4SW1hZ2UgPSBuZXcgX2pweC5KcHhJbWFnZSgpOwogICAganB4SW1hZ2UucGFyc2UodGhpcy5ieXRlcyk7CiAgICBjb25zdCB3aWR0aCA9IGpweEltYWdlLndpZHRoOwogICAgY29uc3QgaGVpZ2h0ID0ganB4SW1hZ2UuaGVpZ2h0OwogICAgY29uc3QgY29tcG9uZW50c0NvdW50ID0ganB4SW1hZ2UuY29tcG9uZW50c0NvdW50OwogICAgY29uc3QgdGlsZUNvdW50ID0ganB4SW1hZ2UudGlsZXMubGVuZ3RoOwogICAgaWYgKHRpbGVDb3VudCA9PT0gMSkgewogICAgICB0aGlzLmJ1ZmZlciA9IGpweEltYWdlLnRpbGVzWzBdLml0ZW1zOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNvbXBvbmVudHNDb3VudCk7CiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGlsZUNvdW50OyBrKyspIHsKICAgICAgICBjb25zdCB0aWxlQ29tcG9uZW50cyA9IGpweEltYWdlLnRpbGVzW2tdOwogICAgICAgIGNvbnN0IHRpbGVXaWR0aCA9IHRpbGVDb21wb25lbnRzLndpZHRoOwogICAgICAgIGNvbnN0IHRpbGVIZWlnaHQgPSB0aWxlQ29tcG9uZW50cy5oZWlnaHQ7CiAgICAgICAgY29uc3QgdGlsZUxlZnQgPSB0aWxlQ29tcG9uZW50cy5sZWZ0OwogICAgICAgIGNvbnN0IHRpbGVUb3AgPSB0aWxlQ29tcG9uZW50cy50b3A7CiAgICAgICAgY29uc3Qgc3JjID0gdGlsZUNvbXBvbmVudHMuaXRlbXM7CiAgICAgICAgbGV0IHNyY1Bvc2l0aW9uID0gMDsKICAgICAgICBsZXQgZGF0YVBvc2l0aW9uID0gKHdpZHRoICogdGlsZVRvcCArIHRpbGVMZWZ0KSAqIGNvbXBvbmVudHNDb3VudDsKICAgICAgICBjb25zdCBpbWdSb3dTaXplID0gd2lkdGggKiBjb21wb25lbnRzQ291bnQ7CiAgICAgICAgY29uc3QgdGlsZVJvd1NpemUgPSB0aWxlV2lkdGggKiBjb21wb25lbnRzQ291bnQ7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aWxlSGVpZ2h0OyBqKyspIHsKICAgICAgICAgIGNvbnN0IHJvd0J5dGVzID0gc3JjLnN1YmFycmF5KHNyY1Bvc2l0aW9uLCBzcmNQb3NpdGlvbiArIHRpbGVSb3dTaXplKTsKICAgICAgICAgIGRhdGEuc2V0KHJvd0J5dGVzLCBkYXRhUG9zaXRpb24pOwogICAgICAgICAgc3JjUG9zaXRpb24gKz0gdGlsZVJvd1NpemU7CiAgICAgICAgICBkYXRhUG9zaXRpb24gKz0gaW1nUm93U2l6ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5idWZmZXIgPSBkYXRhOwogICAgfQogICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlci5sZW5ndGg7CiAgICB0aGlzLmVvZiA9IHRydWU7CiAgfQp9CmV4cG9ydHMuSnB4U3RyZWFtID0gSnB4U3RyZWFtOwoKLyoqKi8gfSksCi8qIDMwICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuSnB4SW1hZ2UgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfYXJpdGhtZXRpY19kZWNvZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7CmNsYXNzIEpweEVycm9yIGV4dGVuZHMgX3V0aWwuQmFzZUV4Y2VwdGlvbiB7CiAgY29uc3RydWN0b3IobXNnKSB7CiAgICBzdXBlcihgSlBYIGVycm9yOiAke21zZ31gLCAiSnB4RXJyb3IiKTsKICB9Cn0KY29uc3QgU3ViYmFuZHNHYWluTG9nMiA9IHsKICBMTDogMCwKICBMSDogMSwKICBITDogMSwKICBISDogMgp9OwpjbGFzcyBKcHhJbWFnZSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlID0gZmFsc2U7CiAgfQogIHBhcnNlKGRhdGEpIHsKICAgIGNvbnN0IGhlYWQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgMCk7CiAgICBpZiAoaGVhZCA9PT0gMHhmZjRmKSB7CiAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgbGVuZ3RoKSB7CiAgICAgIGxldCBoZWFkZXJTaXplID0gODsKICAgICAgbGV0IGxib3ggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24pOwogICAgICBjb25zdCB0Ym94ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CiAgICAgIHBvc2l0aW9uICs9IGhlYWRlclNpemU7CiAgICAgIGlmIChsYm94ID09PSAxKSB7CiAgICAgICAgbGJveCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgKiA0Mjk0OTY3Mjk2ICsgKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgNCk7CiAgICAgICAgcG9zaXRpb24gKz0gODsKICAgICAgICBoZWFkZXJTaXplICs9IDg7CiAgICAgIH0KICAgICAgaWYgKGxib3ggPT09IDApIHsKICAgICAgICBsYm94ID0gbGVuZ3RoIC0gcG9zaXRpb24gKyBoZWFkZXJTaXplOwogICAgICB9CiAgICAgIGlmIChsYm94IDwgaGVhZGVyU2l6ZSkgewogICAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBib3ggZmllbGQgc2l6ZSIpOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGFMZW5ndGggPSBsYm94IC0gaGVhZGVyU2l6ZTsKICAgICAgbGV0IGp1bXBEYXRhTGVuZ3RoID0gdHJ1ZTsKICAgICAgc3dpdGNoICh0Ym94KSB7CiAgICAgICAgY2FzZSAweDZhNzAzMjY4OgogICAgICAgICAganVtcERhdGFMZW5ndGggPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg2MzZmNmM3MjoKICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IGRhdGFbcG9zaXRpb25dOwogICAgICAgICAgaWYgKG1ldGhvZCA9PT0gMSkgewogICAgICAgICAgICBjb25zdCBjb2xvcnNwYWNlID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMyk7CiAgICAgICAgICAgIHN3aXRjaCAoY29sb3JzcGFjZSkgewogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5rbm93biBjb2xvcnNwYWNlICIgKyBjb2xvcnNwYWNlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gMikgewogICAgICAgICAgICAoMCwgX3V0aWwuaW5mbykoIklDQyBwcm9maWxlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg2YTcwMzI2MzoKICAgICAgICAgIHRoaXMucGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHBvc2l0aW9uLCBwb3NpdGlvbiArIGRhdGFMZW5ndGgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDZhNTAyMDIwOgogICAgICAgICAgaWYgKCgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbikgIT09IDB4MGQwYTg3MGEpIHsKICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJJbnZhbGlkIEpQMiBzaWduYXR1cmUiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg2YTUwMWExYToKICAgICAgICBjYXNlIDB4NjY3NDc5NzA6CiAgICAgICAgY2FzZSAweDcyNzI2NTcxOgogICAgICAgIGNhc2UgMHg3MjY1NzMyMDoKICAgICAgICBjYXNlIDB4Njk2ODY0NzI6CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29uc3QgaGVhZGVyVHlwZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGJveCA+PiAyNCAmIDB4ZmYsIHRib3ggPj4gMTYgJiAweGZmLCB0Ym94ID4+IDggJiAweGZmLCB0Ym94ICYgMHhmZik7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFVuc3VwcG9ydGVkIGhlYWRlciB0eXBlICR7dGJveH0gKCR7aGVhZGVyVHlwZX0pLmApOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGp1bXBEYXRhTGVuZ3RoKSB7CiAgICAgICAgcG9zaXRpb24gKz0gZGF0YUxlbmd0aDsKICAgICAgfQogICAgfQogIH0KICBwYXJzZUltYWdlUHJvcGVydGllcyhzdHJlYW0pIHsKICAgIGxldCBuZXdCeXRlID0gc3RyZWFtLmdldEJ5dGUoKTsKICAgIHdoaWxlIChuZXdCeXRlID49IDApIHsKICAgICAgY29uc3Qgb2xkQnl0ZSA9IG5ld0J5dGU7CiAgICAgIG5ld0J5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICBjb25zdCBjb2RlID0gb2xkQnl0ZSA8PCA4IHwgbmV3Qnl0ZTsKICAgICAgaWYgKGNvZGUgPT09IDB4ZmY1MSkgewogICAgICAgIHN0cmVhbS5za2lwKDQpOwogICAgICAgIGNvbnN0IFhzaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBjb25zdCBZc2l6ID0gc3RyZWFtLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgY29uc3QgWE9zaXogPSBzdHJlYW0uZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBjb25zdCBZT3NpeiA9IHN0cmVhbS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgIHN0cmVhbS5za2lwKDE2KTsKICAgICAgICBjb25zdCBDc2l6ID0gc3RyZWFtLmdldFVpbnQxNigpOwogICAgICAgIHRoaXMud2lkdGggPSBYc2l6IC0gWE9zaXo7CiAgICAgICAgdGhpcy5oZWlnaHQgPSBZc2l6IC0gWU9zaXo7CiAgICAgICAgdGhpcy5jb21wb25lbnRzQ291bnQgPSBDc2l6OwogICAgICAgIHRoaXMuYml0c1BlckNvbXBvbmVudCA9IDg7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk5vIHNpemUgbWFya2VyIGZvdW5kIGluIEpQWCBzdHJlYW0iKTsKICB9CiAgcGFyc2VDb2Rlc3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IGNvbnRleHQgPSB7fTsKICAgIGxldCBkb05vdFJlY292ZXIgPSBmYWxzZTsKICAgIHRyeSB7CiAgICAgIGxldCBwb3NpdGlvbiA9IHN0YXJ0OwogICAgICB3aGlsZSAocG9zaXRpb24gKyAxIDwgZW5kKSB7CiAgICAgICAgY29uc3QgY29kZSA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CiAgICAgICAgcG9zaXRpb24gKz0gMjsKICAgICAgICBsZXQgbGVuZ3RoID0gMCwKICAgICAgICAgIGosCiAgICAgICAgICBzcWNkLAogICAgICAgICAgc3BxY2RzLAogICAgICAgICAgc3BxY2RTaXplLAogICAgICAgICAgc2NhbGFyRXhwb3VuZGVkLAogICAgICAgICAgdGlsZTsKICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgIGNhc2UgMHhmZjRmOgogICAgICAgICAgICBjb250ZXh0Lm1haW5IZWFkZXIgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMHhmZmQ5OgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMHhmZjUxOgogICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgICAgICAgICBjb25zdCBzaXogPSB7fTsKICAgICAgICAgICAgc2l6LlhzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKICAgICAgICAgICAgc2l6LllzaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA4KTsKICAgICAgICAgICAgc2l6LlhPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMTIpOwogICAgICAgICAgICBzaXouWU9zaXogPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyAxNik7CiAgICAgICAgICAgIHNpei5YVHNpeiA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDMyKShkYXRhLCBwb3NpdGlvbiArIDIwKTsKICAgICAgICAgICAgc2l6LllUc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMjQpOwogICAgICAgICAgICBzaXouWFRPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMjgpOwogICAgICAgICAgICBzaXouWVRPc2l6ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MzIpKGRhdGEsIHBvc2l0aW9uICsgMzIpOwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRzQ291bnQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAzNik7CiAgICAgICAgICAgIHNpei5Dc2l6ID0gY29tcG9uZW50c0NvdW50OwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gW107CiAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDM4OwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudHNDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gewogICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAoZGF0YVtqXSAmIDB4N2YpICsgMSwKICAgICAgICAgICAgICAgIGlzU2lnbmVkOiAhIShkYXRhW2pdICYgMHg4MCksCiAgICAgICAgICAgICAgICBYUnNpejogZGF0YVtqICsgMV0sCiAgICAgICAgICAgICAgICBZUnNpejogZGF0YVtqICsgMl0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGogKz0gMzsKICAgICAgICAgICAgICBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KTsKICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LlNJWiA9IHNpejsKICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gY29tcG9uZW50czsKICAgICAgICAgICAgY2FsY3VsYXRlVGlsZUdyaWRzKGNvbnRleHQsIGNvbXBvbmVudHMpOwogICAgICAgICAgICBjb250ZXh0LlFDQyA9IFtdOwogICAgICAgICAgICBjb250ZXh0LkNPQyA9IFtdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMHhmZjVjOgogICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgICAgICAgICBjb25zdCBxY2QgPSB7fTsKICAgICAgICAgICAgaiA9IHBvc2l0aW9uICsgMjsKICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTsKICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7CiAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CiAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OwogICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiICsgc3FjZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcWNkLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4OwogICAgICAgICAgICBxY2Quc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkOwogICAgICAgICAgICBxY2QuZ3VhcmRCaXRzID0gc3FjZCA+PiA1OwogICAgICAgICAgICBzcHFjZHMgPSBbXTsKICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgewogICAgICAgICAgICAgIGNvbnN0IHNwcWNkID0ge307CiAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkgewogICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzOwogICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzOwogICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoZGF0YVtqXSAmIDB4NykgPDwgOCB8IGRhdGFbaiArIDFdOwogICAgICAgICAgICAgICAgaiArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzcHFjZHMucHVzaChzcHFjZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcWNkLlNQcWNkcyA9IHNwcWNkczsKICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgewogICAgICAgICAgICAgIGNvbnRleHQuUUNEID0gcWNkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNEID0gcWNkOwogICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDB4ZmY1ZDoKICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgICAgICAgY29uc3QgcWNjID0ge307CiAgICAgICAgICAgIGogPSBwb3NpdGlvbiArIDI7CiAgICAgICAgICAgIGxldCBjcWNjOwogICAgICAgICAgICBpZiAoY29udGV4dC5TSVouQ3NpeiA8IDI1NykgewogICAgICAgICAgICAgIGNxY2MgPSBkYXRhW2orK107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY3FjYyA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBqKTsKICAgICAgICAgICAgICBqICs9IDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3FjZCA9IGRhdGFbaisrXTsKICAgICAgICAgICAgc3dpdGNoIChzcWNkICYgMHgxZikgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDg7CiAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgc3BxY2RTaXplID0gMTY7CiAgICAgICAgICAgICAgICBzY2FsYXJFeHBvdW5kZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHNwcWNkU2l6ZSA9IDE2OwogICAgICAgICAgICAgICAgc2NhbGFyRXhwb3VuZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgU1FjZCB2YWx1ZSAiICsgc3FjZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcWNjLm5vUXVhbnRpemF0aW9uID0gc3BxY2RTaXplID09PSA4OwogICAgICAgICAgICBxY2Muc2NhbGFyRXhwb3VuZGVkID0gc2NhbGFyRXhwb3VuZGVkOwogICAgICAgICAgICBxY2MuZ3VhcmRCaXRzID0gc3FjZCA+PiA1OwogICAgICAgICAgICBzcHFjZHMgPSBbXTsKICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgewogICAgICAgICAgICAgIGNvbnN0IHNwcWNkID0ge307CiAgICAgICAgICAgICAgaWYgKHNwcWNkU2l6ZSA9PT0gOCkgewogICAgICAgICAgICAgICAgc3BxY2QuZXBzaWxvbiA9IGRhdGFbaisrXSA+PiAzOwogICAgICAgICAgICAgICAgc3BxY2QubXUgPSAwOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHFjZC5lcHNpbG9uID0gZGF0YVtqXSA+PiAzOwogICAgICAgICAgICAgICAgc3BxY2QubXUgPSAoZGF0YVtqXSAmIDB4NykgPDwgOCB8IGRhdGFbaiArIDFdOwogICAgICAgICAgICAgICAgaiArPSAyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzcHFjZHMucHVzaChzcHFjZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcWNjLlNQcWNkcyA9IHNwcWNkczsKICAgICAgICAgICAgaWYgKGNvbnRleHQubWFpbkhlYWRlcikgewogICAgICAgICAgICAgIGNvbnRleHQuUUNDW2NxY2NdID0gcWNjOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUuUUNDW2NxY2NdID0gcWNjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAweGZmNTI6CiAgICAgICAgICAgIGxlbmd0aCA9ICgwLCBfY29yZV91dGlscy5yZWFkVWludDE2KShkYXRhLCBwb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnN0IGNvZCA9IHt9OwogICAgICAgICAgICBqID0gcG9zaXRpb24gKyAyOwogICAgICAgICAgICBjb25zdCBzY29kID0gZGF0YVtqKytdOwogICAgICAgICAgICBjb2QuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cyA9ICEhKHNjb2QgJiAxKTsKICAgICAgICAgICAgY29kLnNvcE1hcmtlclVzZWQgPSAhIShzY29kICYgMik7CiAgICAgICAgICAgIGNvZC5lcGhNYXJrZXJVc2VkID0gISEoc2NvZCAmIDQpOwogICAgICAgICAgICBjb2QucHJvZ3Jlc3Npb25PcmRlciA9IGRhdGFbaisrXTsKICAgICAgICAgICAgY29kLmxheWVyc0NvdW50ID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIGopOwogICAgICAgICAgICBqICs9IDI7CiAgICAgICAgICAgIGNvZC5tdWx0aXBsZUNvbXBvbmVudFRyYW5zZm9ybSA9IGRhdGFbaisrXTsKICAgICAgICAgICAgY29kLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IGRhdGFbaisrXTsKICAgICAgICAgICAgY29kLnhjYiA9IChkYXRhW2orK10gJiAweGYpICsgMjsKICAgICAgICAgICAgY29kLnljYiA9IChkYXRhW2orK10gJiAweGYpICsgMjsKICAgICAgICAgICAgY29uc3QgYmxvY2tTdHlsZSA9IGRhdGFbaisrXTsKICAgICAgICAgICAgY29kLnNlbGVjdGl2ZUFyaXRobWV0aWNDb2RpbmdCeXBhc3MgPSAhIShibG9ja1N0eWxlICYgMSk7CiAgICAgICAgICAgIGNvZC5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzID0gISEoYmxvY2tTdHlsZSAmIDIpOwogICAgICAgICAgICBjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzID0gISEoYmxvY2tTdHlsZSAmIDQpOwogICAgICAgICAgICBjb2QudmVydGljYWxseVN0cmlwZSA9ICEhKGJsb2NrU3R5bGUgJiA4KTsKICAgICAgICAgICAgY29kLnByZWRpY3RhYmxlVGVybWluYXRpb24gPSAhIShibG9ja1N0eWxlICYgMTYpOwogICAgICAgICAgICBjb2Quc2VnbWVudGF0aW9uU3ltYm9sVXNlZCA9ICEhKGJsb2NrU3R5bGUgJiAzMik7CiAgICAgICAgICAgIGNvZC5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24gPSBkYXRhW2orK107CiAgICAgICAgICAgIGlmIChjb2QuZW50cm9weUNvZGVyV2l0aEN1c3RvbVByZWNpbmN0cykgewogICAgICAgICAgICAgIGNvbnN0IHByZWNpbmN0c1NpemVzID0gW107CiAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggKyBwb3NpdGlvbikgewogICAgICAgICAgICAgICAgY29uc3QgcHJlY2luY3RzU2l6ZSA9IGRhdGFbaisrXTsKICAgICAgICAgICAgICAgIHByZWNpbmN0c1NpemVzLnB1c2goewogICAgICAgICAgICAgICAgICBQUHg6IHByZWNpbmN0c1NpemUgJiAweGYsCiAgICAgICAgICAgICAgICAgIFBQeTogcHJlY2luY3RzU2l6ZSA+PiA0CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29kLnByZWNpbmN0c1NpemVzID0gcHJlY2luY3RzU2l6ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWQgPSBbXTsKICAgICAgICAgICAgaWYgKGNvZC5zZWxlY3RpdmVBcml0aG1ldGljQ29kaW5nQnlwYXNzKSB7CiAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgic2VsZWN0aXZlQXJpdGhtZXRpY0NvZGluZ0J5cGFzcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb2QudGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzKSB7CiAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgidGVybWluYXRpb25PbkVhY2hDb2RpbmdQYXNzIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvZC52ZXJ0aWNhbGx5U3RyaXBlKSB7CiAgICAgICAgICAgICAgdW5zdXBwb3J0ZWQucHVzaCgidmVydGljYWxseVN0cmlwZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb2QucHJlZGljdGFibGVUZXJtaW5hdGlvbikgewogICAgICAgICAgICAgIHVuc3VwcG9ydGVkLnB1c2goInByZWRpY3RhYmxlVGVybWluYXRpb24iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGRvTm90UmVjb3ZlciA9IHRydWU7CiAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBKUFg6IFVuc3VwcG9ydGVkIENPRCBvcHRpb25zICgke3Vuc3VwcG9ydGVkLmpvaW4oIiwgIil9KS5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29udGV4dC5tYWluSGVhZGVyKSB7CiAgICAgICAgICAgICAgY29udGV4dC5DT0QgPSBjb2Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0QgPSBjb2Q7CiAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGlsZS5DT0MgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMHhmZjkwOgogICAgICAgICAgICBsZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24pOwogICAgICAgICAgICB0aWxlID0ge307CiAgICAgICAgICAgIHRpbGUuaW5kZXggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQxNikoZGF0YSwgcG9zaXRpb24gKyAyKTsKICAgICAgICAgICAgdGlsZS5sZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZGF0YSwgcG9zaXRpb24gKyA0KTsKICAgICAgICAgICAgdGlsZS5kYXRhRW5kID0gdGlsZS5sZW5ndGggKyBwb3NpdGlvbiAtIDI7CiAgICAgICAgICAgIHRpbGUucGFydEluZGV4ID0gZGF0YVtwb3NpdGlvbiArIDhdOwogICAgICAgICAgICB0aWxlLnBhcnRzQ291bnQgPSBkYXRhW3Bvc2l0aW9uICsgOV07CiAgICAgICAgICAgIGNvbnRleHQubWFpbkhlYWRlciA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGlsZS5wYXJ0SW5kZXggPT09IDApIHsKICAgICAgICAgICAgICB0aWxlLkNPRCA9IGNvbnRleHQuQ09EOwogICAgICAgICAgICAgIHRpbGUuQ09DID0gY29udGV4dC5DT0Muc2xpY2UoMCk7CiAgICAgICAgICAgICAgdGlsZS5RQ0QgPSBjb250ZXh0LlFDRDsKICAgICAgICAgICAgICB0aWxlLlFDQyA9IGNvbnRleHQuUUNDLnNsaWNlKDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbGUgPSB0aWxlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMHhmZjkzOgogICAgICAgICAgICB0aWxlID0gY29udGV4dC5jdXJyZW50VGlsZTsKICAgICAgICAgICAgaWYgKHRpbGUucGFydEluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgaW5pdGlhbGl6ZVRpbGUoY29udGV4dCwgdGlsZS5pbmRleCk7CiAgICAgICAgICAgICAgYnVpbGRQYWNrZXRzKGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlbmd0aCA9IHRpbGUuZGF0YUVuZCAtIHBvc2l0aW9uOwogICAgICAgICAgICBwYXJzZVRpbGVQYWNrZXRzKGNvbnRleHQsIGRhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMHhmZjUzOgogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkpQWDogQ29kZXN0cmVhbSBjb2RlIDB4RkY1MyAoQ09DKSBpcyBub3QgaW1wbGVtZW50ZWQuIik7CiAgICAgICAgICBjYXNlIDB4ZmY1NToKICAgICAgICAgIGNhc2UgMHhmZjU3OgogICAgICAgICAgY2FzZSAweGZmNTg6CiAgICAgICAgICBjYXNlIDB4ZmY2NDoKICAgICAgICAgICAgbGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLnJlYWRVaW50MTYpKGRhdGEsIHBvc2l0aW9uKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29kZXN0cmVhbSBjb2RlOiAiICsgY29kZS50b1N0cmluZygxNikpOwogICAgICAgIH0KICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKGRvTm90UmVjb3ZlciB8fCB0aGlzLmZhaWxPbkNvcnJ1cHRlZEltYWdlKSB7CiAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKGUubWVzc2FnZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBKUFg6IFRyeWluZyB0byByZWNvdmVyIGZyb206ICIke2UubWVzc2FnZX0iLmApOwogICAgICB9CiAgICB9CiAgICB0aGlzLnRpbGVzID0gdHJhbnNmb3JtQ29tcG9uZW50cyhjb250ZXh0KTsKICAgIHRoaXMud2lkdGggPSBjb250ZXh0LlNJWi5Yc2l6IC0gY29udGV4dC5TSVouWE9zaXo7CiAgICB0aGlzLmhlaWdodCA9IGNvbnRleHQuU0laLllzaXogLSBjb250ZXh0LlNJWi5ZT3NpejsKICAgIHRoaXMuY29tcG9uZW50c0NvdW50ID0gY29udGV4dC5TSVouQ3NpejsKICB9Cn0KZXhwb3J0cy5KcHhJbWFnZSA9IEpweEltYWdlOwpmdW5jdGlvbiBjYWxjdWxhdGVDb21wb25lbnREaW1lbnNpb25zKGNvbXBvbmVudCwgc2l6KSB7CiAgY29tcG9uZW50LngwID0gTWF0aC5jZWlsKHNpei5YT3NpeiAvIGNvbXBvbmVudC5YUnNpeik7CiAgY29tcG9uZW50LngxID0gTWF0aC5jZWlsKHNpei5Yc2l6IC8gY29tcG9uZW50LlhSc2l6KTsKICBjb21wb25lbnQueTAgPSBNYXRoLmNlaWwoc2l6LllPc2l6IC8gY29tcG9uZW50LllSc2l6KTsKICBjb21wb25lbnQueTEgPSBNYXRoLmNlaWwoc2l6LllzaXogLyBjb21wb25lbnQuWVJzaXopOwogIGNvbXBvbmVudC53aWR0aCA9IGNvbXBvbmVudC54MSAtIGNvbXBvbmVudC54MDsKICBjb21wb25lbnQuaGVpZ2h0ID0gY29tcG9uZW50LnkxIC0gY29tcG9uZW50LnkwOwp9CmZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVHcmlkcyhjb250ZXh0LCBjb21wb25lbnRzKSB7CiAgY29uc3Qgc2l6ID0gY29udGV4dC5TSVo7CiAgY29uc3QgdGlsZXMgPSBbXTsKICBsZXQgdGlsZTsKICBjb25zdCBudW1YdGlsZXMgPSBNYXRoLmNlaWwoKHNpei5Yc2l6IC0gc2l6LlhUT3NpeikgLyBzaXouWFRzaXopOwogIGNvbnN0IG51bVl0aWxlcyA9IE1hdGguY2VpbCgoc2l6LllzaXogLSBzaXouWVRPc2l6KSAvIHNpei5ZVHNpeik7CiAgZm9yIChsZXQgcSA9IDA7IHEgPCBudW1ZdGlsZXM7IHErKykgewogICAgZm9yIChsZXQgcCA9IDA7IHAgPCBudW1YdGlsZXM7IHArKykgewogICAgICB0aWxlID0ge307CiAgICAgIHRpbGUudHgwID0gTWF0aC5tYXgoc2l6LlhUT3NpeiArIHAgKiBzaXouWFRzaXosIHNpei5YT3Npeik7CiAgICAgIHRpbGUudHkwID0gTWF0aC5tYXgoc2l6LllUT3NpeiArIHEgKiBzaXouWVRzaXosIHNpei5ZT3Npeik7CiAgICAgIHRpbGUudHgxID0gTWF0aC5taW4oc2l6LlhUT3NpeiArIChwICsgMSkgKiBzaXouWFRzaXosIHNpei5Yc2l6KTsKICAgICAgdGlsZS50eTEgPSBNYXRoLm1pbihzaXouWVRPc2l6ICsgKHEgKyAxKSAqIHNpei5ZVHNpeiwgc2l6LllzaXopOwogICAgICB0aWxlLndpZHRoID0gdGlsZS50eDEgLSB0aWxlLnR4MDsKICAgICAgdGlsZS5oZWlnaHQgPSB0aWxlLnR5MSAtIHRpbGUudHkwOwogICAgICB0aWxlLmNvbXBvbmVudHMgPSBbXTsKICAgICAgdGlsZXMucHVzaCh0aWxlKTsKICAgIH0KICB9CiAgY29udGV4dC50aWxlcyA9IHRpbGVzOwogIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OwogIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbXBvbmVudHNDb3VudDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07CiAgICBmb3IgKGxldCBqID0gMCwgamogPSB0aWxlcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIGNvbnN0IHRpbGVDb21wb25lbnQgPSB7fTsKICAgICAgdGlsZSA9IHRpbGVzW2pdOwogICAgICB0aWxlQ29tcG9uZW50LnRjeDAgPSBNYXRoLmNlaWwodGlsZS50eDAgLyBjb21wb25lbnQuWFJzaXopOwogICAgICB0aWxlQ29tcG9uZW50LnRjeTAgPSBNYXRoLmNlaWwodGlsZS50eTAgLyBjb21wb25lbnQuWVJzaXopOwogICAgICB0aWxlQ29tcG9uZW50LnRjeDEgPSBNYXRoLmNlaWwodGlsZS50eDEgLyBjb21wb25lbnQuWFJzaXopOwogICAgICB0aWxlQ29tcG9uZW50LnRjeTEgPSBNYXRoLmNlaWwodGlsZS50eTEgLyBjb21wb25lbnQuWVJzaXopOwogICAgICB0aWxlQ29tcG9uZW50LndpZHRoID0gdGlsZUNvbXBvbmVudC50Y3gxIC0gdGlsZUNvbXBvbmVudC50Y3gwOwogICAgICB0aWxlQ29tcG9uZW50LmhlaWdodCA9IHRpbGVDb21wb25lbnQudGN5MSAtIHRpbGVDb21wb25lbnQudGN5MDsKICAgICAgdGlsZS5jb21wb25lbnRzW2ldID0gdGlsZUNvbXBvbmVudDsKICAgIH0KICB9Cn0KZnVuY3Rpb24gZ2V0QmxvY2tzRGltZW5zaW9ucyhjb250ZXh0LCBjb21wb25lbnQsIHIpIHsKICBjb25zdCBjb2RPckNvYyA9IGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnM7CiAgY29uc3QgcmVzdWx0ID0ge307CiAgaWYgKCFjb2RPckNvYy5lbnRyb3B5Q29kZXJXaXRoQ3VzdG9tUHJlY2luY3RzKSB7CiAgICByZXN1bHQuUFB4ID0gMTU7CiAgICByZXN1bHQuUFB5ID0gMTU7CiAgfSBlbHNlIHsKICAgIHJlc3VsdC5QUHggPSBjb2RPckNvYy5wcmVjaW5jdHNTaXplc1tyXS5QUHg7CiAgICByZXN1bHQuUFB5ID0gY29kT3JDb2MucHJlY2luY3RzU2l6ZXNbcl0uUFB5OwogIH0KICByZXN1bHQueGNiXyA9IHIgPiAwID8gTWF0aC5taW4oY29kT3JDb2MueGNiLCByZXN1bHQuUFB4IC0gMSkgOiBNYXRoLm1pbihjb2RPckNvYy54Y2IsIHJlc3VsdC5QUHgpOwogIHJlc3VsdC55Y2JfID0gciA+IDAgPyBNYXRoLm1pbihjb2RPckNvYy55Y2IsIHJlc3VsdC5QUHkgLSAxKSA6IE1hdGgubWluKGNvZE9yQ29jLnljYiwgcmVzdWx0LlBQeSk7CiAgcmV0dXJuIHJlc3VsdDsKfQpmdW5jdGlvbiBidWlsZFByZWNpbmN0cyhjb250ZXh0LCByZXNvbHV0aW9uLCBkaW1lbnNpb25zKSB7CiAgY29uc3QgcHJlY2luY3RXaWR0aCA9IDEgPDwgZGltZW5zaW9ucy5QUHg7CiAgY29uc3QgcHJlY2luY3RIZWlnaHQgPSAxIDw8IGRpbWVuc2lvbnMuUFB5OwogIGNvbnN0IGlzWmVyb1JlcyA9IHJlc29sdXRpb24ucmVzTGV2ZWwgPT09IDA7CiAgY29uc3QgcHJlY2luY3RXaWR0aEluU3ViYmFuZCA9IDEgPDwgZGltZW5zaW9ucy5QUHggKyAoaXNaZXJvUmVzID8gMCA6IC0xKTsKICBjb25zdCBwcmVjaW5jdEhlaWdodEluU3ViYmFuZCA9IDEgPDwgZGltZW5zaW9ucy5QUHkgKyAoaXNaZXJvUmVzID8gMCA6IC0xKTsKICBjb25zdCBudW1wcmVjaW5jdHN3aWRlID0gcmVzb2x1dGlvbi50cngxID4gcmVzb2x1dGlvbi50cngwID8gTWF0aC5jZWlsKHJlc29sdXRpb24udHJ4MSAvIHByZWNpbmN0V2lkdGgpIC0gTWF0aC5mbG9vcihyZXNvbHV0aW9uLnRyeDAgLyBwcmVjaW5jdFdpZHRoKSA6IDA7CiAgY29uc3QgbnVtcHJlY2luY3RzaGlnaCA9IHJlc29sdXRpb24udHJ5MSA+IHJlc29sdXRpb24udHJ5MCA/IE1hdGguY2VpbChyZXNvbHV0aW9uLnRyeTEgLyBwcmVjaW5jdEhlaWdodCkgLSBNYXRoLmZsb29yKHJlc29sdXRpb24udHJ5MCAvIHByZWNpbmN0SGVpZ2h0KSA6IDA7CiAgY29uc3QgbnVtcHJlY2luY3RzID0gbnVtcHJlY2luY3Rzd2lkZSAqIG51bXByZWNpbmN0c2hpZ2g7CiAgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMgPSB7CiAgICBwcmVjaW5jdFdpZHRoLAogICAgcHJlY2luY3RIZWlnaHQsCiAgICBudW1wcmVjaW5jdHN3aWRlLAogICAgbnVtcHJlY2luY3RzaGlnaCwKICAgIG51bXByZWNpbmN0cywKICAgIHByZWNpbmN0V2lkdGhJblN1YmJhbmQsCiAgICBwcmVjaW5jdEhlaWdodEluU3ViYmFuZAogIH07Cn0KZnVuY3Rpb24gYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGRpbWVuc2lvbnMpIHsKICBjb25zdCB4Y2JfID0gZGltZW5zaW9ucy54Y2JfOwogIGNvbnN0IHljYl8gPSBkaW1lbnNpb25zLnljYl87CiAgY29uc3QgY29kZWJsb2NrV2lkdGggPSAxIDw8IHhjYl87CiAgY29uc3QgY29kZWJsb2NrSGVpZ2h0ID0gMSA8PCB5Y2JfOwogIGNvbnN0IGNieDAgPSBzdWJiYW5kLnRieDAgPj4geGNiXzsKICBjb25zdCBjYnkwID0gc3ViYmFuZC50YnkwID4+IHljYl87CiAgY29uc3QgY2J4MSA9IHN1YmJhbmQudGJ4MSArIGNvZGVibG9ja1dpZHRoIC0gMSA+PiB4Y2JfOwogIGNvbnN0IGNieTEgPSBzdWJiYW5kLnRieTEgKyBjb2RlYmxvY2tIZWlnaHQgLSAxID4+IHljYl87CiAgY29uc3QgcHJlY2luY3RQYXJhbWV0ZXJzID0gc3ViYmFuZC5yZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVyczsKICBjb25zdCBjb2RlYmxvY2tzID0gW107CiAgY29uc3QgcHJlY2luY3RzID0gW107CiAgbGV0IGksIGosIGNvZGVibG9jaywgcHJlY2luY3ROdW1iZXI7CiAgZm9yIChqID0gY2J5MDsgaiA8IGNieTE7IGorKykgewogICAgZm9yIChpID0gY2J4MDsgaSA8IGNieDE7IGkrKykgewogICAgICBjb2RlYmxvY2sgPSB7CiAgICAgICAgY2J4OiBpLAogICAgICAgIGNieTogaiwKICAgICAgICB0YngwOiBjb2RlYmxvY2tXaWR0aCAqIGksCiAgICAgICAgdGJ5MDogY29kZWJsb2NrSGVpZ2h0ICogaiwKICAgICAgICB0YngxOiBjb2RlYmxvY2tXaWR0aCAqIChpICsgMSksCiAgICAgICAgdGJ5MTogY29kZWJsb2NrSGVpZ2h0ICogKGogKyAxKQogICAgICB9OwogICAgICBjb2RlYmxvY2sudGJ4MF8gPSBNYXRoLm1heChzdWJiYW5kLnRieDAsIGNvZGVibG9jay50YngwKTsKICAgICAgY29kZWJsb2NrLnRieTBfID0gTWF0aC5tYXgoc3ViYmFuZC50YnkwLCBjb2RlYmxvY2sudGJ5MCk7CiAgICAgIGNvZGVibG9jay50YngxXyA9IE1hdGgubWluKHN1YmJhbmQudGJ4MSwgY29kZWJsb2NrLnRieDEpOwogICAgICBjb2RlYmxvY2sudGJ5MV8gPSBNYXRoLm1pbihzdWJiYW5kLnRieTEsIGNvZGVibG9jay50YnkxKTsKICAgICAgY29uc3QgcGkgPSBNYXRoLmZsb29yKChjb2RlYmxvY2sudGJ4MF8gLSBzdWJiYW5kLnRieDApIC8gcHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0V2lkdGhJblN1YmJhbmQpOwogICAgICBjb25zdCBwaiA9IE1hdGguZmxvb3IoKGNvZGVibG9jay50YnkwXyAtIHN1YmJhbmQudGJ5MCkgLyBwcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RIZWlnaHRJblN1YmJhbmQpOwogICAgICBwcmVjaW5jdE51bWJlciA9IHBpICsgcGogKiBwcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3Rzd2lkZTsKICAgICAgY29kZWJsb2NrLnByZWNpbmN0TnVtYmVyID0gcHJlY2luY3ROdW1iZXI7CiAgICAgIGNvZGVibG9jay5zdWJiYW5kVHlwZSA9IHN1YmJhbmQudHlwZTsKICAgICAgY29kZWJsb2NrLkxibG9jayA9IDM7CiAgICAgIGlmIChjb2RlYmxvY2sudGJ4MV8gPD0gY29kZWJsb2NrLnRieDBfIHx8IGNvZGVibG9jay50YnkxXyA8PSBjb2RlYmxvY2sudGJ5MF8pIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb2RlYmxvY2tzLnB1c2goY29kZWJsb2NrKTsKICAgICAgbGV0IHByZWNpbmN0ID0gcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXTsKICAgICAgaWYgKHByZWNpbmN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpZiAoaSA8IHByZWNpbmN0LmNieE1pbikgewogICAgICAgICAgcHJlY2luY3QuY2J4TWluID0gaTsKICAgICAgICB9IGVsc2UgaWYgKGkgPiBwcmVjaW5jdC5jYnhNYXgpIHsKICAgICAgICAgIHByZWNpbmN0LmNieE1heCA9IGk7CiAgICAgICAgfQogICAgICAgIGlmIChqIDwgcHJlY2luY3QuY2J5TWluKSB7CiAgICAgICAgICBwcmVjaW5jdC5jYnhNaW4gPSBqOwogICAgICAgIH0gZWxzZSBpZiAoaiA+IHByZWNpbmN0LmNieU1heCkgewogICAgICAgICAgcHJlY2luY3QuY2J5TWF4ID0gajsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJlY2luY3RzW3ByZWNpbmN0TnVtYmVyXSA9IHByZWNpbmN0ID0gewogICAgICAgICAgY2J4TWluOiBpLAogICAgICAgICAgY2J5TWluOiBqLAogICAgICAgICAgY2J4TWF4OiBpLAogICAgICAgICAgY2J5TWF4OiBqCiAgICAgICAgfTsKICAgICAgfQogICAgICBjb2RlYmxvY2sucHJlY2luY3QgPSBwcmVjaW5jdDsKICAgIH0KICB9CiAgc3ViYmFuZC5jb2RlYmxvY2tQYXJhbWV0ZXJzID0gewogICAgY29kZWJsb2NrV2lkdGg6IHhjYl8sCiAgICBjb2RlYmxvY2tIZWlnaHQ6IHljYl8sCiAgICBudW1jb2RlYmxvY2t3aWRlOiBjYngxIC0gY2J4MCArIDEsCiAgICBudW1jb2RlYmxvY2toaWdoOiBjYnkxIC0gY2J5MCArIDEKICB9OwogIHN1YmJhbmQuY29kZWJsb2NrcyA9IGNvZGVibG9ja3M7CiAgc3ViYmFuZC5wcmVjaW5jdHMgPSBwcmVjaW5jdHM7Cn0KZnVuY3Rpb24gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIHByZWNpbmN0TnVtYmVyLCBsYXllck51bWJlcikgewogIGNvbnN0IHByZWNpbmN0Q29kZWJsb2NrcyA9IFtdOwogIGNvbnN0IHN1YmJhbmRzID0gcmVzb2x1dGlvbi5zdWJiYW5kczsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBzdWJiYW5kcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICBjb25zdCBzdWJiYW5kID0gc3ViYmFuZHNbaV07CiAgICBjb25zdCBjb2RlYmxvY2tzID0gc3ViYmFuZC5jb2RlYmxvY2tzOwogICAgZm9yIChsZXQgaiA9IDAsIGpqID0gY29kZWJsb2Nrcy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIGNvbnN0IGNvZGVibG9jayA9IGNvZGVibG9ja3Nbal07CiAgICAgIGlmIChjb2RlYmxvY2sucHJlY2luY3ROdW1iZXIgIT09IHByZWNpbmN0TnVtYmVyKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcHJlY2luY3RDb2RlYmxvY2tzLnB1c2goY29kZWJsb2NrKTsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIGxheWVyTnVtYmVyLAogICAgY29kZWJsb2NrczogcHJlY2luY3RDb2RlYmxvY2tzCiAgfTsKfQpmdW5jdGlvbiBMYXllclJlc29sdXRpb25Db21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHsKICBjb25zdCBzaXogPSBjb250ZXh0LlNJWjsKICBjb25zdCB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OwogIGNvbnN0IHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CiAgY29uc3QgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CiAgY29uc3QgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CiAgbGV0IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CiAgZm9yIChsZXQgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgewogICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CiAgfQogIGxldCBsID0gMCwKICAgIHIgPSAwLAogICAgaSA9IDAsCiAgICBrID0gMDsKICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgewogICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgbCsrKSB7CiAgICAgIGZvciAoOyByIDw9IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgcisrKSB7CiAgICAgICAgZm9yICg7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgewogICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldOwogICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CiAgICAgICAgICBjb25zdCBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CiAgICAgICAgICBmb3IgKDsgayA8IG51bXByZWNpbmN0czspIHsKICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpOwogICAgICAgICAgICBrKys7CiAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBrID0gMDsKICAgICAgICB9CiAgICAgICAgaSA9IDA7CiAgICAgIH0KICAgICAgciA9IDA7CiAgICB9CiAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CiAgfTsKfQpmdW5jdGlvbiBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpIHsKICBjb25zdCBzaXogPSBjb250ZXh0LlNJWjsKICBjb25zdCB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OwogIGNvbnN0IHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CiAgY29uc3QgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CiAgY29uc3QgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CiAgbGV0IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CiAgZm9yIChsZXQgcSA9IDA7IHEgPCBjb21wb25lbnRzQ291bnQ7IHErKykgewogICAgbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gTWF0aC5tYXgobWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50LCB0aWxlLmNvbXBvbmVudHNbcV0uY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCk7CiAgfQogIGxldCByID0gMCwKICAgIGwgPSAwLAogICAgaSA9IDAsCiAgICBrID0gMDsKICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgewogICAgZm9yICg7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDsgbCsrKSB7CiAgICAgICAgZm9yICg7IGkgPCBjb21wb25lbnRzQ291bnQ7IGkrKykgewogICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2ldOwogICAgICAgICAgaWYgKHIgPiBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSBjb21wb25lbnQucmVzb2x1dGlvbnNbcl07CiAgICAgICAgICBjb25zdCBudW1wcmVjaW5jdHMgPSByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHM7CiAgICAgICAgICBmb3IgKDsgayA8IG51bXByZWNpbmN0czspIHsKICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpOwogICAgICAgICAgICBrKys7CiAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBrID0gMDsKICAgICAgICB9CiAgICAgICAgaSA9IDA7CiAgICAgIH0KICAgICAgbCA9IDA7CiAgICB9CiAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CiAgfTsKfQpmdW5jdGlvbiBSZXNvbHV0aW9uUG9zaXRpb25Db21wb25lbnRMYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKICBjb25zdCBzaXogPSBjb250ZXh0LlNJWjsKICBjb25zdCB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OwogIGNvbnN0IHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CiAgY29uc3QgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CiAgY29uc3QgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CiAgbGV0IGwsIHIsIGMsIHA7CiAgbGV0IG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCA9IDA7CiAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CiAgICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CiAgICBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBNYXRoLm1heChtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQsIGNvbXBvbmVudC5jb2RpbmdTdHlsZVBhcmFtZXRlcnMuZGVjb21wb3NpdGlvbkxldmVsc0NvdW50KTsKICB9CiAgY29uc3QgbWF4TnVtUHJlY2luY3RzSW5MZXZlbCA9IG5ldyBJbnQzMkFycmF5KG1heERlY29tcG9zaXRpb25MZXZlbHNDb3VudCArIDEpOwogIGZvciAociA9IDA7IHIgPD0gbWF4RGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyArK3IpIHsKICAgIGxldCBtYXhOdW1QcmVjaW5jdHMgPSAwOwogICAgZm9yIChjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgKytjKSB7CiAgICAgIGNvbnN0IHJlc29sdXRpb25zID0gdGlsZS5jb21wb25lbnRzW2NdLnJlc29sdXRpb25zOwogICAgICBpZiAociA8IHJlc29sdXRpb25zLmxlbmd0aCkgewogICAgICAgIG1heE51bVByZWNpbmN0cyA9IE1hdGgubWF4KG1heE51bVByZWNpbmN0cywgcmVzb2x1dGlvbnNbcl0ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0cyk7CiAgICAgIH0KICAgIH0KICAgIG1heE51bVByZWNpbmN0c0luTGV2ZWxbcl0gPSBtYXhOdW1QcmVjaW5jdHM7CiAgfQogIGwgPSAwOwogIHIgPSAwOwogIGMgPSAwOwogIHAgPSAwOwogIHRoaXMubmV4dFBhY2tldCA9IGZ1bmN0aW9uIEpweEltYWdlX25leHRQYWNrZXQoKSB7CiAgICBmb3IgKDsgciA8PSBtYXhEZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgewogICAgICBmb3IgKDsgcCA8IG1heE51bVByZWNpbmN0c0luTGV2ZWxbcl07IHArKykgewogICAgICAgIGZvciAoOyBjIDwgY29tcG9uZW50c0NvdW50OyBjKyspIHsKICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRpbGUuY29tcG9uZW50c1tjXTsKICAgICAgICAgIGlmIChyID4gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOwogICAgICAgICAgY29uc3QgbnVtcHJlY2luY3RzID0gcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzOwogICAgICAgICAgaWYgKHAgPj0gbnVtcHJlY2luY3RzKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgZm9yICg7IGwgPCBsYXllcnNDb3VudDspIHsKICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIHAsIGwpOwogICAgICAgICAgICBsKys7CiAgICAgICAgICAgIHJldHVybiBwYWNrZXQ7CiAgICAgICAgICB9CiAgICAgICAgICBsID0gMDsKICAgICAgICB9CiAgICAgICAgYyA9IDA7CiAgICAgIH0KICAgICAgcCA9IDA7CiAgICB9CiAgICB0aHJvdyBuZXcgSnB4RXJyb3IoIk91dCBvZiBwYWNrZXRzIik7CiAgfTsKfQpmdW5jdGlvbiBQb3NpdGlvbkNvbXBvbmVudFJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpIHsKICBjb25zdCBzaXogPSBjb250ZXh0LlNJWjsKICBjb25zdCB0aWxlSW5kZXggPSBjb250ZXh0LmN1cnJlbnRUaWxlLmluZGV4OwogIGNvbnN0IHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CiAgY29uc3QgbGF5ZXJzQ291bnQgPSB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMubGF5ZXJzQ291bnQ7CiAgY29uc3QgY29tcG9uZW50c0NvdW50ID0gc2l6LkNzaXo7CiAgY29uc3QgcHJlY2luY3RzU2l6ZXMgPSBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpOwogIGNvbnN0IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXM7CiAgbGV0IGwgPSAwLAogICAgciA9IDAsCiAgICBjID0gMCwKICAgIHB4ID0gMCwKICAgIHB5ID0gMDsKICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgewogICAgZm9yICg7IHB5IDwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMubWF4TnVtSGlnaDsgcHkrKykgewogICAgICBmb3IgKDsgcHggPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1XaWRlOyBweCsrKSB7CiAgICAgICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgewogICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOwogICAgICAgICAgY29uc3QgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CiAgICAgICAgICBmb3IgKDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgewogICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOwogICAgICAgICAgICBjb25zdCBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzU2l6ZXMuY29tcG9uZW50c1tjXS5yZXNvbHV0aW9uc1tyXTsKICAgICAgICAgICAgY29uc3QgayA9IGdldFByZWNpbmN0SW5kZXhJZkV4aXN0KHB4LCBweSwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMsIHJlc29sdXRpb24pOwogICAgICAgICAgICBpZiAoayA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoOyBsIDwgbGF5ZXJzQ291bnQ7KSB7CiAgICAgICAgICAgICAgY29uc3QgcGFja2V0ID0gY3JlYXRlUGFja2V0KHJlc29sdXRpb24sIGssIGwpOwogICAgICAgICAgICAgIGwrKzsKICAgICAgICAgICAgICByZXR1cm4gcGFja2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGwgPSAwOwogICAgICAgICAgfQogICAgICAgICAgciA9IDA7CiAgICAgICAgfQogICAgICAgIGMgPSAwOwogICAgICB9CiAgICAgIHB4ID0gMDsKICAgIH0KICAgIHRocm93IG5ldyBKcHhFcnJvcigiT3V0IG9mIHBhY2tldHMiKTsKICB9Owp9CmZ1bmN0aW9uIENvbXBvbmVudFBvc2l0aW9uUmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCkgewogIGNvbnN0IHNpeiA9IGNvbnRleHQuU0laOwogIGNvbnN0IHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CiAgY29uc3QgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKICBjb25zdCBsYXllcnNDb3VudCA9IHRpbGUuY29kaW5nU3R5bGVEZWZhdWx0UGFyYW1ldGVycy5sYXllcnNDb3VudDsKICBjb25zdCBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKICBjb25zdCBwcmVjaW5jdHNTaXplcyA9IGdldFByZWNpbmN0U2l6ZXNJbkltYWdlU2NhbGUodGlsZSk7CiAgbGV0IGwgPSAwLAogICAgciA9IDAsCiAgICBjID0gMCwKICAgIHB4ID0gMCwKICAgIHB5ID0gMDsKICB0aGlzLm5leHRQYWNrZXQgPSBmdW5jdGlvbiBKcHhJbWFnZV9uZXh0UGFja2V0KCkgewogICAgZm9yICg7IGMgPCBjb21wb25lbnRzQ291bnQ7ICsrYykgewogICAgICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CiAgICAgIGNvbnN0IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzID0gcHJlY2luY3RzU2l6ZXMuY29tcG9uZW50c1tjXTsKICAgICAgY29uc3QgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CiAgICAgIGZvciAoOyBweSA8IHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLm1heE51bUhpZ2g7IHB5KyspIHsKICAgICAgICBmb3IgKDsgcHggPCBwcmVjaW5jdHNJdGVyYXRpb25TaXplcy5tYXhOdW1XaWRlOyBweCsrKSB7CiAgICAgICAgICBmb3IgKDsgciA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IHIrKykgewogICAgICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gY29tcG9uZW50LnJlc29sdXRpb25zW3JdOwogICAgICAgICAgICBjb25zdCBzaXplSW5JbWFnZVNjYWxlID0gcHJlY2luY3RzSXRlcmF0aW9uU2l6ZXMucmVzb2x1dGlvbnNbcl07CiAgICAgICAgICAgIGNvbnN0IGsgPSBnZXRQcmVjaW5jdEluZGV4SWZFeGlzdChweCwgcHksIHNpemVJbkltYWdlU2NhbGUsIHByZWNpbmN0c0l0ZXJhdGlvblNpemVzLCByZXNvbHV0aW9uKTsKICAgICAgICAgICAgaWYgKGsgPT09IG51bGwpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKDsgbCA8IGxheWVyc0NvdW50OykgewogICAgICAgICAgICAgIGNvbnN0IHBhY2tldCA9IGNyZWF0ZVBhY2tldChyZXNvbHV0aW9uLCBrLCBsKTsKICAgICAgICAgICAgICBsKys7CiAgICAgICAgICAgICAgcmV0dXJuIHBhY2tldDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHIgPSAwOwogICAgICAgIH0KICAgICAgICBweCA9IDA7CiAgICAgIH0KICAgICAgcHkgPSAwOwogICAgfQogICAgdGhyb3cgbmV3IEpweEVycm9yKCJPdXQgb2YgcGFja2V0cyIpOwogIH07Cn0KZnVuY3Rpb24gZ2V0UHJlY2luY3RJbmRleElmRXhpc3QocHhJbmRleCwgcHlJbmRleCwgc2l6ZUluSW1hZ2VTY2FsZSwgcHJlY2luY3RJdGVyYXRpb25TaXplcywgcmVzb2x1dGlvbikgewogIGNvbnN0IHBvc1ggPSBweEluZGV4ICogcHJlY2luY3RJdGVyYXRpb25TaXplcy5taW5XaWR0aDsKICBjb25zdCBwb3NZID0gcHlJbmRleCAqIHByZWNpbmN0SXRlcmF0aW9uU2l6ZXMubWluSGVpZ2h0OwogIGlmIChwb3NYICUgc2l6ZUluSW1hZ2VTY2FsZS53aWR0aCAhPT0gMCB8fCBwb3NZICUgc2l6ZUluSW1hZ2VTY2FsZS5oZWlnaHQgIT09IDApIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBzdGFydFByZWNpbmN0Um93SW5kZXggPSBwb3NZIC8gc2l6ZUluSW1hZ2VTY2FsZS53aWR0aCAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLm51bXByZWNpbmN0c3dpZGU7CiAgcmV0dXJuIHBvc1ggLyBzaXplSW5JbWFnZVNjYWxlLmhlaWdodCArIHN0YXJ0UHJlY2luY3RSb3dJbmRleDsKfQpmdW5jdGlvbiBnZXRQcmVjaW5jdFNpemVzSW5JbWFnZVNjYWxlKHRpbGUpIHsKICBjb25zdCBjb21wb25lbnRzQ291bnQgPSB0aWxlLmNvbXBvbmVudHMubGVuZ3RoOwogIGxldCBtaW5XaWR0aCA9IE51bWJlci5NQVhfVkFMVUU7CiAgbGV0IG1pbkhlaWdodCA9IE51bWJlci5NQVhfVkFMVUU7CiAgbGV0IG1heE51bVdpZGUgPSAwOwogIGxldCBtYXhOdW1IaWdoID0gMDsKICBjb25zdCBzaXplUGVyQ29tcG9uZW50ID0gbmV3IEFycmF5KGNvbXBvbmVudHNDb3VudCk7CiAgZm9yIChsZXQgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgewogICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOwogICAgY29uc3QgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycy5kZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7CiAgICBjb25zdCBzaXplUGVyUmVzb2x1dGlvbiA9IG5ldyBBcnJheShkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgKyAxKTsKICAgIGxldCBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgbGV0IG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgbGV0IG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50ID0gMDsKICAgIGxldCBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCA9IDA7CiAgICBsZXQgc2NhbGUgPSAxOwogICAgZm9yIChsZXQgciA9IGRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsgciA+PSAwOyAtLXIpIHsKICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tyXTsKICAgICAgY29uc3Qgd2lkdGhDdXJyZW50UmVzb2x1dGlvbiA9IHNjYWxlICogcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMucHJlY2luY3RXaWR0aDsKICAgICAgY29uc3QgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24gPSBzY2FsZSAqIHJlc29sdXRpb24ucHJlY2luY3RQYXJhbWV0ZXJzLnByZWNpbmN0SGVpZ2h0OwogICAgICBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1pbihtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQsIHdpZHRoQ3VycmVudFJlc29sdXRpb24pOwogICAgICBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50ID0gTWF0aC5taW4obWluSGVpZ2h0Q3VycmVudENvbXBvbmVudCwgaGVpZ2h0Q3VycmVudFJlc29sdXRpb24pOwogICAgICBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCA9IE1hdGgubWF4KG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LCByZXNvbHV0aW9uLnByZWNpbmN0UGFyYW1ldGVycy5udW1wcmVjaW5jdHN3aWRlKTsKICAgICAgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQgPSBNYXRoLm1heChtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudCwgcmVzb2x1dGlvbi5wcmVjaW5jdFBhcmFtZXRlcnMubnVtcHJlY2luY3RzaGlnaCk7CiAgICAgIHNpemVQZXJSZXNvbHV0aW9uW3JdID0gewogICAgICAgIHdpZHRoOiB3aWR0aEN1cnJlbnRSZXNvbHV0aW9uLAogICAgICAgIGhlaWdodDogaGVpZ2h0Q3VycmVudFJlc29sdXRpb24KICAgICAgfTsKICAgICAgc2NhbGUgPDw9IDE7CiAgICB9CiAgICBtaW5XaWR0aCA9IE1hdGgubWluKG1pbldpZHRoLCBtaW5XaWR0aEN1cnJlbnRDb21wb25lbnQpOwogICAgbWluSGVpZ2h0ID0gTWF0aC5taW4obWluSGVpZ2h0LCBtaW5IZWlnaHRDdXJyZW50Q29tcG9uZW50KTsKICAgIG1heE51bVdpZGUgPSBNYXRoLm1heChtYXhOdW1XaWRlLCBtYXhOdW1XaWRlQ3VycmVudENvbXBvbmVudCk7CiAgICBtYXhOdW1IaWdoID0gTWF0aC5tYXgobWF4TnVtSGlnaCwgbWF4TnVtSGlnaEN1cnJlbnRDb21wb25lbnQpOwogICAgc2l6ZVBlckNvbXBvbmVudFtjXSA9IHsKICAgICAgcmVzb2x1dGlvbnM6IHNpemVQZXJSZXNvbHV0aW9uLAogICAgICBtaW5XaWR0aDogbWluV2lkdGhDdXJyZW50Q29tcG9uZW50LAogICAgICBtaW5IZWlnaHQ6IG1pbkhlaWdodEN1cnJlbnRDb21wb25lbnQsCiAgICAgIG1heE51bVdpZGU6IG1heE51bVdpZGVDdXJyZW50Q29tcG9uZW50LAogICAgICBtYXhOdW1IaWdoOiBtYXhOdW1IaWdoQ3VycmVudENvbXBvbmVudAogICAgfTsKICB9CiAgcmV0dXJuIHsKICAgIGNvbXBvbmVudHM6IHNpemVQZXJDb21wb25lbnQsCiAgICBtaW5XaWR0aCwKICAgIG1pbkhlaWdodCwKICAgIG1heE51bVdpZGUsCiAgICBtYXhOdW1IaWdoCiAgfTsKfQpmdW5jdGlvbiBidWlsZFBhY2tldHMoY29udGV4dCkgewogIGNvbnN0IHNpeiA9IGNvbnRleHQuU0laOwogIGNvbnN0IHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CiAgY29uc3QgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKICBjb25zdCBjb21wb25lbnRzQ291bnQgPSBzaXouQ3NpejsKICBmb3IgKGxldCBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CiAgICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CiAgICBjb25zdCBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgPSBjb21wb25lbnQuY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKICAgIGNvbnN0IHJlc29sdXRpb25zID0gW107CiAgICBjb25zdCBzdWJiYW5kcyA9IFtdOwogICAgZm9yIChsZXQgciA9IDA7IHIgPD0gZGVjb21wb3NpdGlvbkxldmVsc0NvdW50OyByKyspIHsKICAgICAgY29uc3QgYmxvY2tzRGltZW5zaW9ucyA9IGdldEJsb2Nrc0RpbWVuc2lvbnMoY29udGV4dCwgY29tcG9uZW50LCByKTsKICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IHt9OwogICAgICBjb25zdCBzY2FsZSA9IDEgPDwgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50IC0gcjsKICAgICAgcmVzb2x1dGlvbi50cngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gc2NhbGUpOwogICAgICByZXNvbHV0aW9uLnRyeTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CiAgICAgIHJlc29sdXRpb24udHJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIHNjYWxlKTsKICAgICAgcmVzb2x1dGlvbi50cnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gc2NhbGUpOwogICAgICByZXNvbHV0aW9uLnJlc0xldmVsID0gcjsKICAgICAgYnVpbGRQcmVjaW5jdHMoY29udGV4dCwgcmVzb2x1dGlvbiwgYmxvY2tzRGltZW5zaW9ucyk7CiAgICAgIHJlc29sdXRpb25zLnB1c2gocmVzb2x1dGlvbik7CiAgICAgIGxldCBzdWJiYW5kOwogICAgICBpZiAociA9PT0gMCkgewogICAgICAgIHN1YmJhbmQgPSB7fTsKICAgICAgICBzdWJiYW5kLnR5cGUgPSAiTEwiOwogICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIHNjYWxlKTsKICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBzY2FsZSk7CiAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gc2NhbGUpOwogICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIHNjYWxlKTsKICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOwogICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOwogICAgICAgIHJlc29sdXRpb24uc3ViYmFuZHMgPSBbc3ViYmFuZF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYnNjYWxlID0gMSA8PCBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQgLSByICsgMTsKICAgICAgICBjb25zdCByZXNvbHV0aW9uU3ViYmFuZHMgPSBbXTsKICAgICAgICBzdWJiYW5kID0ge307CiAgICAgICAgc3ViYmFuZC50eXBlID0gIkhMIjsKICAgICAgICBzdWJiYW5kLnRieDAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDAgLyBic2NhbGUgLSAwLjUpOwogICAgICAgIHN1YmJhbmQudGJ5MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MCAvIGJzY2FsZSk7CiAgICAgICAgc3ViYmFuZC50YngxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gxIC8gYnNjYWxlIC0gMC41KTsKICAgICAgICBzdWJiYW5kLnRieTEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTEgLyBic2NhbGUpOwogICAgICAgIHN1YmJhbmQucmVzb2x1dGlvbiA9IHJlc29sdXRpb247CiAgICAgICAgYnVpbGRDb2RlYmxvY2tzKGNvbnRleHQsIHN1YmJhbmQsIGJsb2Nrc0RpbWVuc2lvbnMpOwogICAgICAgIHN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CiAgICAgICAgcmVzb2x1dGlvblN1YmJhbmRzLnB1c2goc3ViYmFuZCk7CiAgICAgICAgc3ViYmFuZCA9IHt9OwogICAgICAgIHN1YmJhbmQudHlwZSA9ICJMSCI7CiAgICAgICAgc3ViYmFuZC50YngwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3gwIC8gYnNjYWxlKTsKICAgICAgICBzdWJiYW5kLnRieTAgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeTAgLyBic2NhbGUgLSAwLjUpOwogICAgICAgIHN1YmJhbmQudGJ4MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MSAvIGJzY2FsZSk7CiAgICAgICAgc3ViYmFuZC50YnkxID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kxIC8gYnNjYWxlIC0gMC41KTsKICAgICAgICBzdWJiYW5kLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOwogICAgICAgIGJ1aWxkQ29kZWJsb2Nrcyhjb250ZXh0LCBzdWJiYW5kLCBibG9ja3NEaW1lbnNpb25zKTsKICAgICAgICBzdWJiYW5kcy5wdXNoKHN1YmJhbmQpOwogICAgICAgIHJlc29sdXRpb25TdWJiYW5kcy5wdXNoKHN1YmJhbmQpOwogICAgICAgIHN1YmJhbmQgPSB7fTsKICAgICAgICBzdWJiYW5kLnR5cGUgPSAiSEgiOwogICAgICAgIHN1YmJhbmQudGJ4MCA9IE1hdGguY2VpbChjb21wb25lbnQudGN4MCAvIGJzY2FsZSAtIDAuNSk7CiAgICAgICAgc3ViYmFuZC50YnkwID0gTWF0aC5jZWlsKGNvbXBvbmVudC50Y3kwIC8gYnNjYWxlIC0gMC41KTsKICAgICAgICBzdWJiYW5kLnRieDEgPSBNYXRoLmNlaWwoY29tcG9uZW50LnRjeDEgLyBic2NhbGUgLSAwLjUpOwogICAgICAgIHN1YmJhbmQudGJ5MSA9IE1hdGguY2VpbChjb21wb25lbnQudGN5MSAvIGJzY2FsZSAtIDAuNSk7CiAgICAgICAgc3ViYmFuZC5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKICAgICAgICBidWlsZENvZGVibG9ja3MoY29udGV4dCwgc3ViYmFuZCwgYmxvY2tzRGltZW5zaW9ucyk7CiAgICAgICAgc3ViYmFuZHMucHVzaChzdWJiYW5kKTsKICAgICAgICByZXNvbHV0aW9uU3ViYmFuZHMucHVzaChzdWJiYW5kKTsKICAgICAgICByZXNvbHV0aW9uLnN1YmJhbmRzID0gcmVzb2x1dGlvblN1YmJhbmRzOwogICAgICB9CiAgICB9CiAgICBjb21wb25lbnQucmVzb2x1dGlvbnMgPSByZXNvbHV0aW9uczsKICAgIGNvbXBvbmVudC5zdWJiYW5kcyA9IHN1YmJhbmRzOwogIH0KICBjb25zdCBwcm9ncmVzc2lvbk9yZGVyID0gdGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLnByb2dyZXNzaW9uT3JkZXI7CiAgc3dpdGNoIChwcm9ncmVzc2lvbk9yZGVyKSB7CiAgICBjYXNlIDA6CiAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IExheWVyUmVzb2x1dGlvbkNvbXBvbmVudFBvc2l0aW9uSXRlcmF0b3IoY29udGV4dCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBSZXNvbHV0aW9uTGF5ZXJDb21wb25lbnRQb3NpdGlvbkl0ZXJhdG9yKGNvbnRleHQpOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgdGlsZS5wYWNrZXRzSXRlcmF0b3IgPSBuZXcgUmVzb2x1dGlvblBvc2l0aW9uQ29tcG9uZW50TGF5ZXJJdGVyYXRvcihjb250ZXh0KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM6CiAgICAgIHRpbGUucGFja2V0c0l0ZXJhdG9yID0gbmV3IFBvc2l0aW9uQ29tcG9uZW50UmVzb2x1dGlvbkxheWVySXRlcmF0b3IoY29udGV4dCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICB0aWxlLnBhY2tldHNJdGVyYXRvciA9IG5ldyBDb21wb25lbnRQb3NpdGlvblJlc29sdXRpb25MYXllckl0ZXJhdG9yKGNvbnRleHQpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBKcHhFcnJvcihgVW5zdXBwb3J0ZWQgcHJvZ3Jlc3Npb24gb3JkZXIgJHtwcm9ncmVzc2lvbk9yZGVyfWApOwogIH0KfQpmdW5jdGlvbiBwYXJzZVRpbGVQYWNrZXRzKGNvbnRleHQsIGRhdGEsIG9mZnNldCwgZGF0YUxlbmd0aCkgewogIGxldCBwb3NpdGlvbiA9IDA7CiAgbGV0IGJ1ZmZlciwKICAgIGJ1ZmZlclNpemUgPSAwLAogICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKICBmdW5jdGlvbiByZWFkQml0cyhjb3VudCkgewogICAgd2hpbGUgKGJ1ZmZlclNpemUgPCBjb3VudCkgewogICAgICBjb25zdCBiID0gZGF0YVtvZmZzZXQgKyBwb3NpdGlvbl07CiAgICAgIHBvc2l0aW9uKys7CiAgICAgIGlmIChza2lwTmV4dEJpdCkgewogICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciA8PCA3IHwgYjsKICAgICAgICBidWZmZXJTaXplICs9IDc7CiAgICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBidWZmZXIgPSBidWZmZXIgPDwgOCB8IGI7CiAgICAgICAgYnVmZmVyU2l6ZSArPSA4OwogICAgICB9CiAgICAgIGlmIChiID09PSAweGZmKSB7CiAgICAgICAgc2tpcE5leHRCaXQgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICBidWZmZXJTaXplIC09IGNvdW50OwogICAgcmV0dXJuIGJ1ZmZlciA+Pj4gYnVmZmVyU2l6ZSAmICgxIDw8IGNvdW50KSAtIDE7CiAgfQogIGZ1bmN0aW9uIHNraXBNYXJrZXJJZkVxdWFsKHZhbHVlKSB7CiAgICBpZiAoZGF0YVtvZmZzZXQgKyBwb3NpdGlvbiAtIDFdID09PSAweGZmICYmIGRhdGFbb2Zmc2V0ICsgcG9zaXRpb25dID09PSB2YWx1ZSkgewogICAgICBza2lwQnl0ZXMoMSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChkYXRhW29mZnNldCArIHBvc2l0aW9uXSA9PT0gMHhmZiAmJiBkYXRhW29mZnNldCArIHBvc2l0aW9uICsgMV0gPT09IHZhbHVlKSB7CiAgICAgIHNraXBCeXRlcygyKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIHNraXBCeXRlcyhjb3VudCkgewogICAgcG9zaXRpb24gKz0gY291bnQ7CiAgfQogIGZ1bmN0aW9uIGFsaWduVG9CeXRlKCkgewogICAgYnVmZmVyU2l6ZSA9IDA7CiAgICBpZiAoc2tpcE5leHRCaXQpIHsKICAgICAgcG9zaXRpb24rKzsKICAgICAgc2tpcE5leHRCaXQgPSBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVhZENvZGluZ3Bhc3NlcygpIHsKICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmIChyZWFkQml0cygxKSA9PT0gMCkgewogICAgICByZXR1cm4gMjsKICAgIH0KICAgIGxldCB2YWx1ZSA9IHJlYWRCaXRzKDIpOwogICAgaWYgKHZhbHVlIDwgMykgewogICAgICByZXR1cm4gdmFsdWUgKyAzOwogICAgfQogICAgdmFsdWUgPSByZWFkQml0cyg1KTsKICAgIGlmICh2YWx1ZSA8IDMxKSB7CiAgICAgIHJldHVybiB2YWx1ZSArIDY7CiAgICB9CiAgICB2YWx1ZSA9IHJlYWRCaXRzKDcpOwogICAgcmV0dXJuIHZhbHVlICsgMzc7CiAgfQogIGNvbnN0IHRpbGVJbmRleCA9IGNvbnRleHQuY3VycmVudFRpbGUuaW5kZXg7CiAgY29uc3QgdGlsZSA9IGNvbnRleHQudGlsZXNbdGlsZUluZGV4XTsKICBjb25zdCBzb3BNYXJrZXJVc2VkID0gY29udGV4dC5DT0Quc29wTWFya2VyVXNlZDsKICBjb25zdCBlcGhNYXJrZXJVc2VkID0gY29udGV4dC5DT0QuZXBoTWFya2VyVXNlZDsKICBjb25zdCBwYWNrZXRzSXRlcmF0b3IgPSB0aWxlLnBhY2tldHNJdGVyYXRvcjsKICB3aGlsZSAocG9zaXRpb24gPCBkYXRhTGVuZ3RoKSB7CiAgICBhbGlnblRvQnl0ZSgpOwogICAgaWYgKHNvcE1hcmtlclVzZWQgJiYgc2tpcE1hcmtlcklmRXF1YWwoMHg5MSkpIHsKICAgICAgc2tpcEJ5dGVzKDQpOwogICAgfQogICAgY29uc3QgcGFja2V0ID0gcGFja2V0c0l0ZXJhdG9yLm5leHRQYWNrZXQoKTsKICAgIGlmICghcmVhZEJpdHMoMSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCBsYXllck51bWJlciA9IHBhY2tldC5sYXllck51bWJlciwKICAgICAgcXVldWUgPSBbXTsKICAgIGxldCBjb2RlYmxvY2s7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYWNrZXQuY29kZWJsb2Nrcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvZGVibG9jayA9IHBhY2tldC5jb2RlYmxvY2tzW2ldOwogICAgICBsZXQgcHJlY2luY3QgPSBjb2RlYmxvY2sucHJlY2luY3Q7CiAgICAgIGNvbnN0IGNvZGVibG9ja0NvbHVtbiA9IGNvZGVibG9jay5jYnggLSBwcmVjaW5jdC5jYnhNaW47CiAgICAgIGNvbnN0IGNvZGVibG9ja1JvdyA9IGNvZGVibG9jay5jYnkgLSBwcmVjaW5jdC5jYnlNaW47CiAgICAgIGxldCBjb2RlYmxvY2tJbmNsdWRlZCA9IGZhbHNlOwogICAgICBsZXQgZmlyc3RUaW1lSW5jbHVzaW9uID0gZmFsc2U7CiAgICAgIGxldCB2YWx1ZVJlYWR5LCB6ZXJvQml0UGxhbmVzVHJlZTsKICAgICAgaWYgKGNvZGVibG9jay5pbmNsdWRlZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSAhIXJlYWRCaXRzKDEpOwogICAgICB9IGVsc2UgewogICAgICAgIHByZWNpbmN0ID0gY29kZWJsb2NrLnByZWNpbmN0OwogICAgICAgIGxldCBpbmNsdXNpb25UcmVlOwogICAgICAgIGlmIChwcmVjaW5jdC5pbmNsdXNpb25UcmVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGluY2x1c2lvblRyZWUgPSBwcmVjaW5jdC5pbmNsdXNpb25UcmVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCB3aWR0aCA9IHByZWNpbmN0LmNieE1heCAtIHByZWNpbmN0LmNieE1pbiArIDE7CiAgICAgICAgICBjb25zdCBoZWlnaHQgPSBwcmVjaW5jdC5jYnlNYXggLSBwcmVjaW5jdC5jYnlNaW4gKyAxOwogICAgICAgICAgaW5jbHVzaW9uVHJlZSA9IG5ldyBJbmNsdXNpb25UcmVlKHdpZHRoLCBoZWlnaHQsIGxheWVyTnVtYmVyKTsKICAgICAgICAgIHplcm9CaXRQbGFuZXNUcmVlID0gbmV3IFRhZ1RyZWUod2lkdGgsIGhlaWdodCk7CiAgICAgICAgICBwcmVjaW5jdC5pbmNsdXNpb25UcmVlID0gaW5jbHVzaW9uVHJlZTsKICAgICAgICAgIHByZWNpbmN0Lnplcm9CaXRQbGFuZXNUcmVlID0gemVyb0JpdFBsYW5lc1RyZWU7CiAgICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGxheWVyTnVtYmVyOyBsKyspIHsKICAgICAgICAgICAgaWYgKHJlYWRCaXRzKDEpICE9PSAwKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEpweEVycm9yKCJJbnZhbGlkIHRhZyB0cmVlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGluY2x1c2lvblRyZWUucmVzZXQoY29kZWJsb2NrQ29sdW1uLCBjb2RlYmxvY2tSb3csIGxheWVyTnVtYmVyKSkgewogICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaWYgKHJlYWRCaXRzKDEpKSB7CiAgICAgICAgICAgICAgdmFsdWVSZWFkeSA9ICFpbmNsdXNpb25UcmVlLm5leHRMZXZlbCgpOwogICAgICAgICAgICAgIGlmICh2YWx1ZVJlYWR5KSB7CiAgICAgICAgICAgICAgICBjb2RlYmxvY2suaW5jbHVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgY29kZWJsb2NrSW5jbHVkZWQgPSBmaXJzdFRpbWVJbmNsdXNpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGluY2x1c2lvblRyZWUuaW5jcmVtZW50VmFsdWUobGF5ZXJOdW1iZXIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghY29kZWJsb2NrSW5jbHVkZWQpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoZmlyc3RUaW1lSW5jbHVzaW9uKSB7CiAgICAgICAgemVyb0JpdFBsYW5lc1RyZWUgPSBwcmVjaW5jdC56ZXJvQml0UGxhbmVzVHJlZTsKICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZS5yZXNldChjb2RlYmxvY2tDb2x1bW4sIGNvZGVibG9ja1Jvdyk7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGlmIChyZWFkQml0cygxKSkgewogICAgICAgICAgICB2YWx1ZVJlYWR5ID0gIXplcm9CaXRQbGFuZXNUcmVlLm5leHRMZXZlbCgpOwogICAgICAgICAgICBpZiAodmFsdWVSZWFkeSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB6ZXJvQml0UGxhbmVzVHJlZS5pbmNyZW1lbnRWYWx1ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb2RlYmxvY2suemVyb0JpdFBsYW5lcyA9IHplcm9CaXRQbGFuZXNUcmVlLnZhbHVlOwogICAgICB9CiAgICAgIGNvbnN0IGNvZGluZ3Bhc3NlcyA9IHJlYWRDb2RpbmdwYXNzZXMoKTsKICAgICAgd2hpbGUgKHJlYWRCaXRzKDEpKSB7CiAgICAgICAgY29kZWJsb2NrLkxibG9jaysrOwogICAgICB9CiAgICAgIGNvbnN0IGNvZGluZ3Bhc3Nlc0xvZzIgPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoY29kaW5ncGFzc2VzKTsKICAgICAgY29uc3QgYml0cyA9IChjb2RpbmdwYXNzZXMgPCAxIDw8IGNvZGluZ3Bhc3Nlc0xvZzIgPyBjb2RpbmdwYXNzZXNMb2cyIC0gMSA6IGNvZGluZ3Bhc3Nlc0xvZzIpICsgY29kZWJsb2NrLkxibG9jazsKICAgICAgY29uc3QgY29kZWREYXRhTGVuZ3RoID0gcmVhZEJpdHMoYml0cyk7CiAgICAgIHF1ZXVlLnB1c2goewogICAgICAgIGNvZGVibG9jaywKICAgICAgICBjb2RpbmdwYXNzZXMsCiAgICAgICAgZGF0YUxlbmd0aDogY29kZWREYXRhTGVuZ3RoCiAgICAgIH0pOwogICAgfQogICAgYWxpZ25Ub0J5dGUoKTsKICAgIGlmIChlcGhNYXJrZXJVc2VkKSB7CiAgICAgIHNraXBNYXJrZXJJZkVxdWFsKDB4OTIpOwogICAgfQogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgcGFja2V0SXRlbSA9IHF1ZXVlLnNoaWZ0KCk7CiAgICAgIGNvZGVibG9jayA9IHBhY2tldEl0ZW0uY29kZWJsb2NrOwogICAgICBpZiAoY29kZWJsb2NrLmRhdGEgPT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvZGVibG9jay5kYXRhID0gW107CiAgICAgIH0KICAgICAgY29kZWJsb2NrLmRhdGEucHVzaCh7CiAgICAgICAgZGF0YSwKICAgICAgICBzdGFydDogb2Zmc2V0ICsgcG9zaXRpb24sCiAgICAgICAgZW5kOiBvZmZzZXQgKyBwb3NpdGlvbiArIHBhY2tldEl0ZW0uZGF0YUxlbmd0aCwKICAgICAgICBjb2RpbmdwYXNzZXM6IHBhY2tldEl0ZW0uY29kaW5ncGFzc2VzCiAgICAgIH0pOwogICAgICBwb3NpdGlvbiArPSBwYWNrZXRJdGVtLmRhdGFMZW5ndGg7CiAgICB9CiAgfQogIHJldHVybiBwb3NpdGlvbjsKfQpmdW5jdGlvbiBjb3B5Q29lZmZpY2llbnRzKGNvZWZmaWNpZW50cywgbGV2ZWxXaWR0aCwgbGV2ZWxIZWlnaHQsIHN1YmJhbmQsIGRlbHRhLCBtYiwgcmV2ZXJzaWJsZSwgc2VnbWVudGF0aW9uU3ltYm9sVXNlZCwgcmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcykgewogIGNvbnN0IHgwID0gc3ViYmFuZC50YngwOwogIGNvbnN0IHkwID0gc3ViYmFuZC50YnkwOwogIGNvbnN0IHdpZHRoID0gc3ViYmFuZC50YngxIC0gc3ViYmFuZC50YngwOwogIGNvbnN0IGNvZGVibG9ja3MgPSBzdWJiYW5kLmNvZGVibG9ja3M7CiAgY29uc3QgcmlnaHQgPSBzdWJiYW5kLnR5cGUuY2hhckF0KDApID09PSAiSCIgPyAxIDogMDsKICBjb25zdCBib3R0b20gPSBzdWJiYW5kLnR5cGUuY2hhckF0KDEpID09PSAiSCIgPyBsZXZlbFdpZHRoIDogMDsKICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlYmxvY2tzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgIGNvbnN0IGNvZGVibG9jayA9IGNvZGVibG9ja3NbaV07CiAgICBjb25zdCBibG9ja1dpZHRoID0gY29kZWJsb2NrLnRieDFfIC0gY29kZWJsb2NrLnRieDBfOwogICAgY29uc3QgYmxvY2tIZWlnaHQgPSBjb2RlYmxvY2sudGJ5MV8gLSBjb2RlYmxvY2sudGJ5MF87CiAgICBpZiAoYmxvY2tXaWR0aCA9PT0gMCB8fCBibG9ja0hlaWdodCA9PT0gMCkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChjb2RlYmxvY2suZGF0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgY29uc3QgYml0TW9kZWwgPSBuZXcgQml0TW9kZWwoYmxvY2tXaWR0aCwgYmxvY2tIZWlnaHQsIGNvZGVibG9jay5zdWJiYW5kVHlwZSwgY29kZWJsb2NrLnplcm9CaXRQbGFuZXMsIG1iKTsKICAgIGxldCBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAyOwogICAgY29uc3QgZGF0YSA9IGNvZGVibG9jay5kYXRhOwogICAgbGV0IHRvdGFsTGVuZ3RoID0gMCwKICAgICAgY29kaW5ncGFzc2VzID0gMDsKICAgIGxldCBqLCBqaiwgZGF0YUl0ZW07CiAgICBmb3IgKGogPSAwLCBqaiA9IGRhdGEubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICBkYXRhSXRlbSA9IGRhdGFbal07CiAgICAgIHRvdGFsTGVuZ3RoICs9IGRhdGFJdGVtLmVuZCAtIGRhdGFJdGVtLnN0YXJ0OwogICAgICBjb2RpbmdwYXNzZXMgKz0gZGF0YUl0ZW0uY29kaW5ncGFzc2VzOwogICAgfQogICAgY29uc3QgZW5jb2RlZERhdGEgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7CiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgZm9yIChqID0gMCwgamogPSBkYXRhLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgZGF0YUl0ZW0gPSBkYXRhW2pdOwogICAgICBjb25zdCBjaHVuayA9IGRhdGFJdGVtLmRhdGEuc3ViYXJyYXkoZGF0YUl0ZW0uc3RhcnQsIGRhdGFJdGVtLmVuZCk7CiAgICAgIGVuY29kZWREYXRhLnNldChjaHVuaywgcG9zaXRpb24pOwogICAgICBwb3NpdGlvbiArPSBjaHVuay5sZW5ndGg7CiAgICB9CiAgICBjb25zdCBkZWNvZGVyID0gbmV3IF9hcml0aG1ldGljX2RlY29kZXIuQXJpdGhtZXRpY0RlY29kZXIoZW5jb2RlZERhdGEsIDAsIHRvdGFsTGVuZ3RoKTsKICAgIGJpdE1vZGVsLnNldERlY29kZXIoZGVjb2Rlcik7CiAgICBmb3IgKGogPSAwOyBqIDwgY29kaW5ncGFzc2VzOyBqKyspIHsKICAgICAgc3dpdGNoIChjdXJyZW50Q29kaW5ncGFzc1R5cGUpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBiaXRNb2RlbC5ydW5TaWduaWZpY2FuY2VQcm9wYWdhdGlvblBhc3MoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIGJpdE1vZGVsLnJ1bk1hZ25pdHVkZVJlZmluZW1lbnRQYXNzKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBiaXRNb2RlbC5ydW5DbGVhbnVwUGFzcygpOwogICAgICAgICAgaWYgKHNlZ21lbnRhdGlvblN5bWJvbFVzZWQpIHsKICAgICAgICAgICAgYml0TW9kZWwuY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChyZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKSB7CiAgICAgICAgYml0TW9kZWwucmVzZXQoKTsKICAgICAgfQogICAgICBjdXJyZW50Q29kaW5ncGFzc1R5cGUgPSAoY3VycmVudENvZGluZ3Bhc3NUeXBlICsgMSkgJSAzOwogICAgfQogICAgbGV0IG9mZnNldCA9IGNvZGVibG9jay50YngwXyAtIHgwICsgKGNvZGVibG9jay50YnkwXyAtIHkwKSAqIHdpZHRoOwogICAgY29uc3Qgc2lnbiA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzU2lnbjsKICAgIGNvbnN0IG1hZ25pdHVkZSA9IGJpdE1vZGVsLmNvZWZmaWNlbnRzTWFnbml0dWRlOwogICAgY29uc3QgYml0c0RlY29kZWQgPSBiaXRNb2RlbC5iaXRzRGVjb2RlZDsKICAgIGNvbnN0IG1hZ25pdHVkZUNvcnJlY3Rpb24gPSByZXZlcnNpYmxlID8gMCA6IDAuNTsKICAgIGxldCBrLCBuLCBuYjsKICAgIHBvc2l0aW9uID0gMDsKICAgIGNvbnN0IGludGVybGVhdmUgPSBzdWJiYW5kLnR5cGUgIT09ICJMTCI7CiAgICBmb3IgKGogPSAwOyBqIDwgYmxvY2tIZWlnaHQ7IGorKykgewogICAgICBjb25zdCByb3cgPSBvZmZzZXQgLyB3aWR0aCB8IDA7CiAgICAgIGNvbnN0IGxldmVsT2Zmc2V0ID0gMiAqIHJvdyAqIChsZXZlbFdpZHRoIC0gd2lkdGgpICsgcmlnaHQgKyBib3R0b207CiAgICAgIGZvciAoayA9IDA7IGsgPCBibG9ja1dpZHRoOyBrKyspIHsKICAgICAgICBuID0gbWFnbml0dWRlW3Bvc2l0aW9uXTsKICAgICAgICBpZiAobiAhPT0gMCkgewogICAgICAgICAgbiA9IChuICsgbWFnbml0dWRlQ29ycmVjdGlvbikgKiBkZWx0YTsKICAgICAgICAgIGlmIChzaWduW3Bvc2l0aW9uXSAhPT0gMCkgewogICAgICAgICAgICBuID0gLW47CiAgICAgICAgICB9CiAgICAgICAgICBuYiA9IGJpdHNEZWNvZGVkW3Bvc2l0aW9uXTsKICAgICAgICAgIGNvbnN0IHBvcyA9IGludGVybGVhdmUgPyBsZXZlbE9mZnNldCArIChvZmZzZXQgPDwgMSkgOiBvZmZzZXQ7CiAgICAgICAgICBpZiAocmV2ZXJzaWJsZSAmJiBuYiA+PSBtYikgewogICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb2VmZmljaWVudHNbcG9zXSA9IG4gKiAoMSA8PCBtYiAtIG5iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgcG9zaXRpb24rKzsKICAgICAgfQogICAgICBvZmZzZXQgKz0gd2lkdGggLSBibG9ja1dpZHRoOwogICAgfQogIH0KfQpmdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKGNvbnRleHQsIHRpbGUsIGMpIHsKICBjb25zdCBjb21wb25lbnQgPSB0aWxlLmNvbXBvbmVudHNbY107CiAgY29uc3QgY29kaW5nU3R5bGVQYXJhbWV0ZXJzID0gY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVyczsKICBjb25zdCBxdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gY29tcG9uZW50LnF1YW50aXphdGlvblBhcmFtZXRlcnM7CiAgY29uc3QgZGVjb21wb3NpdGlvbkxldmVsc0NvdW50ID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLmRlY29tcG9zaXRpb25MZXZlbHNDb3VudDsKICBjb25zdCBzcHFjZHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNQcWNkczsKICBjb25zdCBzY2FsYXJFeHBvdW5kZWQgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLnNjYWxhckV4cG91bmRlZDsKICBjb25zdCBndWFyZEJpdHMgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLmd1YXJkQml0czsKICBjb25zdCBzZWdtZW50YXRpb25TeW1ib2xVc2VkID0gY29kaW5nU3R5bGVQYXJhbWV0ZXJzLnNlZ21lbnRhdGlvblN5bWJvbFVzZWQ7CiAgY29uc3QgcmVzZXRDb250ZXh0UHJvYmFiaWxpdGllcyA9IGNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXNldENvbnRleHRQcm9iYWJpbGl0aWVzOwogIGNvbnN0IHByZWNpc2lvbiA9IGNvbnRleHQuY29tcG9uZW50c1tjXS5wcmVjaXNpb247CiAgY29uc3QgcmV2ZXJzaWJsZSA9IGNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb247CiAgY29uc3QgdHJhbnNmb3JtID0gcmV2ZXJzaWJsZSA/IG5ldyBSZXZlcnNpYmxlVHJhbnNmb3JtKCkgOiBuZXcgSXJyZXZlcnNpYmxlVHJhbnNmb3JtKCk7CiAgY29uc3Qgc3ViYmFuZENvZWZmaWNpZW50cyA9IFtdOwogIGxldCBiID0gMDsKICBmb3IgKGxldCBpID0gMDsgaSA8PSBkZWNvbXBvc2l0aW9uTGV2ZWxzQ291bnQ7IGkrKykgewogICAgY29uc3QgcmVzb2x1dGlvbiA9IGNvbXBvbmVudC5yZXNvbHV0aW9uc1tpXTsKICAgIGNvbnN0IHdpZHRoID0gcmVzb2x1dGlvbi50cngxIC0gcmVzb2x1dGlvbi50cngwOwogICAgY29uc3QgaGVpZ2h0ID0gcmVzb2x1dGlvbi50cnkxIC0gcmVzb2x1dGlvbi50cnkwOwogICAgY29uc3QgY29lZmZpY2llbnRzID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCk7CiAgICBmb3IgKGxldCBqID0gMCwgamogPSByZXNvbHV0aW9uLnN1YmJhbmRzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgbGV0IG11LCBlcHNpbG9uOwogICAgICBpZiAoIXNjYWxhckV4cG91bmRlZCkgewogICAgICAgIG11ID0gc3BxY2RzWzBdLm11OwogICAgICAgIGVwc2lsb24gPSBzcHFjZHNbMF0uZXBzaWxvbiArIChpID4gMCA/IDEgLSBpIDogMCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbXUgPSBzcHFjZHNbYl0ubXU7CiAgICAgICAgZXBzaWxvbiA9IHNwcWNkc1tiXS5lcHNpbG9uOwogICAgICAgIGIrKzsKICAgICAgfQogICAgICBjb25zdCBzdWJiYW5kID0gcmVzb2x1dGlvbi5zdWJiYW5kc1tqXTsKICAgICAgY29uc3QgZ2FpbkxvZzIgPSBTdWJiYW5kc0dhaW5Mb2cyW3N1YmJhbmQudHlwZV07CiAgICAgIGNvbnN0IGRlbHRhID0gcmV2ZXJzaWJsZSA/IDEgOiAyICoqIChwcmVjaXNpb24gKyBnYWluTG9nMiAtIGVwc2lsb24pICogKDEgKyBtdSAvIDIwNDgpOwogICAgICBjb25zdCBtYiA9IGd1YXJkQml0cyArIGVwc2lsb24gLSAxOwogICAgICBjb3B5Q29lZmZpY2llbnRzKGNvZWZmaWNpZW50cywgd2lkdGgsIGhlaWdodCwgc3ViYmFuZCwgZGVsdGEsIG1iLCByZXZlcnNpYmxlLCBzZWdtZW50YXRpb25TeW1ib2xVc2VkLCByZXNldENvbnRleHRQcm9iYWJpbGl0aWVzKTsKICAgIH0KICAgIHN1YmJhbmRDb2VmZmljaWVudHMucHVzaCh7CiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGl0ZW1zOiBjb2VmZmljaWVudHMKICAgIH0pOwogIH0KICBjb25zdCByZXN1bHQgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlKHN1YmJhbmRDb2VmZmljaWVudHMsIGNvbXBvbmVudC50Y3gwLCBjb21wb25lbnQudGN5MCk7CiAgcmV0dXJuIHsKICAgIGxlZnQ6IGNvbXBvbmVudC50Y3gwLAogICAgdG9wOiBjb21wb25lbnQudGN5MCwKICAgIHdpZHRoOiByZXN1bHQud2lkdGgsCiAgICBoZWlnaHQ6IHJlc3VsdC5oZWlnaHQsCiAgICBpdGVtczogcmVzdWx0Lml0ZW1zCiAgfTsKfQpmdW5jdGlvbiB0cmFuc2Zvcm1Db21wb25lbnRzKGNvbnRleHQpIHsKICBjb25zdCBzaXogPSBjb250ZXh0LlNJWjsKICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jb21wb25lbnRzOwogIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OwogIGNvbnN0IHJlc3VsdEltYWdlcyA9IFtdOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbnRleHQudGlsZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgdGlsZSA9IGNvbnRleHQudGlsZXNbaV07CiAgICBjb25zdCB0cmFuc2Zvcm1lZFRpbGVzID0gW107CiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CiAgICAgIHRyYW5zZm9ybWVkVGlsZXNbY10gPSB0cmFuc2Zvcm1UaWxlKGNvbnRleHQsIHRpbGUsIGMpOwogICAgfQogICAgY29uc3QgdGlsZTAgPSB0cmFuc2Zvcm1lZFRpbGVzWzBdOwogICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHRpbGUwLml0ZW1zLmxlbmd0aCAqIGNvbXBvbmVudHNDb3VudCk7CiAgICBjb25zdCByZXN1bHQgPSB7CiAgICAgIGxlZnQ6IHRpbGUwLmxlZnQsCiAgICAgIHRvcDogdGlsZTAudG9wLAogICAgICB3aWR0aDogdGlsZTAud2lkdGgsCiAgICAgIGhlaWdodDogdGlsZTAuaGVpZ2h0LAogICAgICBpdGVtczogb3V0CiAgICB9OwogICAgbGV0IHNoaWZ0LCBvZmZzZXQ7CiAgICBsZXQgcG9zID0gMCwKICAgICAgaiwKICAgICAgamosCiAgICAgIHkwLAogICAgICB5MSwKICAgICAgeTI7CiAgICBpZiAodGlsZS5jb2RpbmdTdHlsZURlZmF1bHRQYXJhbWV0ZXJzLm11bHRpcGxlQ29tcG9uZW50VHJhbnNmb3JtKSB7CiAgICAgIGNvbnN0IGZvdXJDb21wb25lbnRzID0gY29tcG9uZW50c0NvdW50ID09PSA0OwogICAgICBjb25zdCB5MGl0ZW1zID0gdHJhbnNmb3JtZWRUaWxlc1swXS5pdGVtczsKICAgICAgY29uc3QgeTFpdGVtcyA9IHRyYW5zZm9ybWVkVGlsZXNbMV0uaXRlbXM7CiAgICAgIGNvbnN0IHkyaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzWzJdLml0ZW1zOwogICAgICBjb25zdCB5M2l0ZW1zID0gZm91ckNvbXBvbmVudHMgPyB0cmFuc2Zvcm1lZFRpbGVzWzNdLml0ZW1zIDogbnVsbDsKICAgICAgc2hpZnQgPSBjb21wb25lbnRzWzBdLnByZWNpc2lvbiAtIDg7CiAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41OwogICAgICBjb25zdCBjb21wb25lbnQwID0gdGlsZS5jb21wb25lbnRzWzBdOwogICAgICBjb25zdCBhbHBoYTAxID0gY29tcG9uZW50c0NvdW50IC0gMzsKICAgICAgamogPSB5MGl0ZW1zLmxlbmd0aDsKICAgICAgaWYgKCFjb21wb25lbnQwLmNvZGluZ1N0eWxlUGFyYW1ldGVycy5yZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24pIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHsKICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDsKICAgICAgICAgIHkxID0geTFpdGVtc1tqXTsKICAgICAgICAgIHkyID0geTJpdGVtc1tqXTsKICAgICAgICAgIG91dFtwb3MrK10gPSB5MCArIDEuNDAyICogeTIgPj4gc2hpZnQ7CiAgICAgICAgICBvdXRbcG9zKytdID0geTAgLSAwLjM0NDEzICogeTEgLSAwLjcxNDE0ICogeTIgPj4gc2hpZnQ7CiAgICAgICAgICBvdXRbcG9zKytdID0geTAgKyAxLjc3MiAqIHkxID4+IHNoaWZ0OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgamo7IGorKywgcG9zICs9IGFscGhhMDEpIHsKICAgICAgICAgIHkwID0geTBpdGVtc1tqXSArIG9mZnNldDsKICAgICAgICAgIHkxID0geTFpdGVtc1tqXTsKICAgICAgICAgIHkyID0geTJpdGVtc1tqXTsKICAgICAgICAgIGNvbnN0IGcgPSB5MCAtICh5MiArIHkxID4+IDIpOwogICAgICAgICAgb3V0W3BvcysrXSA9IGcgKyB5MiA+PiBzaGlmdDsKICAgICAgICAgIG91dFtwb3MrK10gPSBnID4+IHNoaWZ0OwogICAgICAgICAgb3V0W3BvcysrXSA9IGcgKyB5MSA+PiBzaGlmdDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGZvdXJDb21wb25lbnRzKSB7CiAgICAgICAgZm9yIChqID0gMCwgcG9zID0gMzsgaiA8IGpqOyBqKyssIHBvcyArPSA0KSB7CiAgICAgICAgICBvdXRbcG9zXSA9IHkzaXRlbXNbal0gKyBvZmZzZXQgPj4gc2hpZnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNvbXBvbmVudHNDb3VudDsgYysrKSB7CiAgICAgICAgY29uc3QgaXRlbXMgPSB0cmFuc2Zvcm1lZFRpbGVzW2NdLml0ZW1zOwogICAgICAgIHNoaWZ0ID0gY29tcG9uZW50c1tjXS5wcmVjaXNpb24gLSA4OwogICAgICAgIG9mZnNldCA9ICgxMjggPDwgc2hpZnQpICsgMC41OwogICAgICAgIGZvciAocG9zID0gYywgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgICAgb3V0W3Bvc10gPSBpdGVtc1tqXSArIG9mZnNldCA+PiBzaGlmdDsKICAgICAgICAgIHBvcyArPSBjb21wb25lbnRzQ291bnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXN1bHRJbWFnZXMucHVzaChyZXN1bHQpOwogIH0KICByZXR1cm4gcmVzdWx0SW1hZ2VzOwp9CmZ1bmN0aW9uIGluaXRpYWxpemVUaWxlKGNvbnRleHQsIHRpbGVJbmRleCkgewogIGNvbnN0IHNpeiA9IGNvbnRleHQuU0laOwogIGNvbnN0IGNvbXBvbmVudHNDb3VudCA9IHNpei5Dc2l6OwogIGNvbnN0IHRpbGUgPSBjb250ZXh0LnRpbGVzW3RpbGVJbmRleF07CiAgZm9yIChsZXQgYyA9IDA7IGMgPCBjb21wb25lbnRzQ291bnQ7IGMrKykgewogICAgY29uc3QgY29tcG9uZW50ID0gdGlsZS5jb21wb25lbnRzW2NdOwogICAgY29uc3QgcWNkT3JRY2MgPSBjb250ZXh0LmN1cnJlbnRUaWxlLlFDQ1tjXSAhPT0gdW5kZWZpbmVkID8gY29udGV4dC5jdXJyZW50VGlsZS5RQ0NbY10gOiBjb250ZXh0LmN1cnJlbnRUaWxlLlFDRDsKICAgIGNvbXBvbmVudC5xdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gcWNkT3JRY2M7CiAgICBjb25zdCBjb2RPckNvYyA9IGNvbnRleHQuY3VycmVudFRpbGUuQ09DW2NdICE9PSB1bmRlZmluZWQgPyBjb250ZXh0LmN1cnJlbnRUaWxlLkNPQ1tjXSA6IGNvbnRleHQuY3VycmVudFRpbGUuQ09EOwogICAgY29tcG9uZW50LmNvZGluZ1N0eWxlUGFyYW1ldGVycyA9IGNvZE9yQ29jOwogIH0KICB0aWxlLmNvZGluZ1N0eWxlRGVmYXVsdFBhcmFtZXRlcnMgPSBjb250ZXh0LmN1cnJlbnRUaWxlLkNPRDsKfQpjbGFzcyBUYWdUcmVlIHsKICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7CiAgICBjb25zdCBsZXZlbHNMZW5ndGggPSAoMCwgX2NvcmVfdXRpbHMubG9nMikoTWF0aC5tYXgod2lkdGgsIGhlaWdodCkpICsgMTsKICAgIHRoaXMubGV2ZWxzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxldmVsc0xlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IGxldmVsID0gewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBpdGVtczogW10KICAgICAgfTsKICAgICAgdGhpcy5sZXZlbHMucHVzaChsZXZlbCk7CiAgICAgIHdpZHRoID0gTWF0aC5jZWlsKHdpZHRoIC8gMik7CiAgICAgIGhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgLyAyKTsKICAgIH0KICB9CiAgcmVzZXQoaSwgaikgewogICAgbGV0IGN1cnJlbnRMZXZlbCA9IDAsCiAgICAgIHZhbHVlID0gMCwKICAgICAgbGV2ZWw7CiAgICB3aGlsZSAoY3VycmVudExldmVsIDwgdGhpcy5sZXZlbHMubGVuZ3RoKSB7CiAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKICAgICAgY29uc3QgaW5kZXggPSBpICsgaiAqIGxldmVsLndpZHRoOwogICAgICBpZiAobGV2ZWwuaXRlbXNbaW5kZXhdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB2YWx1ZSA9IGxldmVsLml0ZW1zW2luZGV4XTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBsZXZlbC5pbmRleCA9IGluZGV4OwogICAgICBpID4+PSAxOwogICAgICBqID4+PSAxOwogICAgICBjdXJyZW50TGV2ZWwrKzsKICAgIH0KICAgIGN1cnJlbnRMZXZlbC0tOwogICAgbGV2ZWwgPSB0aGlzLmxldmVsc1tjdXJyZW50TGV2ZWxdOwogICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gdmFsdWU7CiAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKICAgIGRlbGV0ZSB0aGlzLnZhbHVlOwogIH0KICBpbmNyZW1lbnRWYWx1ZSgpIHsKICAgIGNvbnN0IGxldmVsID0gdGhpcy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxdOwogICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdKys7CiAgfQogIG5leHRMZXZlbCgpIHsKICAgIGxldCBjdXJyZW50TGV2ZWwgPSB0aGlzLmN1cnJlbnRMZXZlbDsKICAgIGxldCBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CiAgICBjb25zdCB2YWx1ZSA9IGxldmVsLml0ZW1zW2xldmVsLmluZGV4XTsKICAgIGN1cnJlbnRMZXZlbC0tOwogICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLmN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKICAgIGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IHZhbHVlOwogICAgcmV0dXJuIHRydWU7CiAgfQp9CmNsYXNzIEluY2x1c2lvblRyZWUgewogIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIGRlZmF1bHRWYWx1ZSkgewogICAgY29uc3QgbGV2ZWxzTGVuZ3RoID0gKDAsIF9jb3JlX3V0aWxzLmxvZzIpKE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpKSArIDE7CiAgICB0aGlzLmxldmVscyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbHNMZW5ndGg7IGkrKykgewogICAgICBjb25zdCBpdGVtcyA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0KTsKICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIGl0ZW1zW2pdID0gZGVmYXVsdFZhbHVlOwogICAgICB9CiAgICAgIGNvbnN0IGxldmVsID0gewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBpdGVtcwogICAgICB9OwogICAgICB0aGlzLmxldmVscy5wdXNoKGxldmVsKTsKICAgICAgd2lkdGggPSBNYXRoLmNlaWwod2lkdGggLyAyKTsKICAgICAgaGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAvIDIpOwogICAgfQogIH0KICByZXNldChpLCBqLCBzdG9wVmFsdWUpIHsKICAgIGxldCBjdXJyZW50TGV2ZWwgPSAwOwogICAgd2hpbGUgKGN1cnJlbnRMZXZlbCA8IHRoaXMubGV2ZWxzLmxlbmd0aCkgewogICAgICBjb25zdCBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CiAgICAgIGNvbnN0IGluZGV4ID0gaSArIGogKiBsZXZlbC53aWR0aDsKICAgICAgbGV2ZWwuaW5kZXggPSBpbmRleDsKICAgICAgY29uc3QgdmFsdWUgPSBsZXZlbC5pdGVtc1tpbmRleF07CiAgICAgIGlmICh2YWx1ZSA9PT0gMHhmZikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA+IHN0b3BWYWx1ZSkgewogICAgICAgIHRoaXMuY3VycmVudExldmVsID0gY3VycmVudExldmVsOwogICAgICAgIHRoaXMucHJvcGFnYXRlVmFsdWVzKCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGkgPj49IDE7CiAgICAgIGogPj49IDE7CiAgICAgIGN1cnJlbnRMZXZlbCsrOwogICAgfQogICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWwgLSAxOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGluY3JlbWVudFZhbHVlKHN0b3BWYWx1ZSkgewogICAgY29uc3QgbGV2ZWwgPSB0aGlzLmxldmVsc1t0aGlzLmN1cnJlbnRMZXZlbF07CiAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSBzdG9wVmFsdWUgKyAxOwogICAgdGhpcy5wcm9wYWdhdGVWYWx1ZXMoKTsKICB9CiAgcHJvcGFnYXRlVmFsdWVzKCkgewogICAgbGV0IGxldmVsSW5kZXggPSB0aGlzLmN1cnJlbnRMZXZlbDsKICAgIGxldCBsZXZlbCA9IHRoaXMubGV2ZWxzW2xldmVsSW5kZXhdOwogICAgY29uc3QgY3VycmVudFZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdOwogICAgd2hpbGUgKC0tbGV2ZWxJbmRleCA+PSAwKSB7CiAgICAgIGxldmVsID0gdGhpcy5sZXZlbHNbbGV2ZWxJbmRleF07CiAgICAgIGxldmVsLml0ZW1zW2xldmVsLmluZGV4XSA9IGN1cnJlbnRWYWx1ZTsKICAgIH0KICB9CiAgbmV4dExldmVsKCkgewogICAgbGV0IGN1cnJlbnRMZXZlbCA9IHRoaXMuY3VycmVudExldmVsOwogICAgbGV0IGxldmVsID0gdGhpcy5sZXZlbHNbY3VycmVudExldmVsXTsKICAgIGNvbnN0IHZhbHVlID0gbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdOwogICAgbGV2ZWwuaXRlbXNbbGV2ZWwuaW5kZXhdID0gMHhmZjsKICAgIGN1cnJlbnRMZXZlbC0tOwogICAgaWYgKGN1cnJlbnRMZXZlbCA8IDApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdGhpcy5jdXJyZW50TGV2ZWwgPSBjdXJyZW50TGV2ZWw7CiAgICBsZXZlbCA9IHRoaXMubGV2ZWxzW2N1cnJlbnRMZXZlbF07CiAgICBsZXZlbC5pdGVtc1tsZXZlbC5pbmRleF0gPSB2YWx1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBCaXRNb2RlbCB7CiAgc3RhdGljIFVOSUZPUk1fQ09OVEVYVCA9IDE3OwogIHN0YXRpYyBSVU5MRU5HVEhfQ09OVEVYVCA9IDE4OwogIHN0YXRpYyBMTEFuZExIQ29udGV4dHNMYWJlbCA9IG5ldyBVaW50OEFycmF5KFswLCA1LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAxLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4LCAwLCAwLCAwLCAwLCAwLCAyLCA2LCA4LCAwLCAzLCA3LCA4LCAwLCA0LCA3LCA4XSk7CiAgc3RhdGljIEhMQ29udGV4dExhYmVsID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDMsIDQsIDAsIDUsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDEsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDQsIDAsIDYsIDcsIDcsIDAsIDgsIDgsIDhdKTsKICBzdGF0aWMgSEhDb250ZXh0TGFiZWwgPSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgMCwgMSwgMiwgMiwgMCwgMiwgMiwgMiwgMCwgMCwgMCwgMCwgMCwgMywgNCwgNSwgMCwgNCwgNSwgNSwgMCwgNSwgNSwgNSwgMCwgMCwgMCwgMCwgMCwgNiwgNywgNywgMCwgNywgNywgNywgMCwgNywgNywgNywgMCwgMCwgMCwgMCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgMCwgMCwgMCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOCwgMCwgOCwgOCwgOF0pOwogIGNvbnN0cnVjdG9yKHdpZHRoLCBoZWlnaHQsIHN1YmJhbmQsIHplcm9CaXRQbGFuZXMsIG1iKSB7CiAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIGxldCBjb250ZXh0TGFiZWxUYWJsZTsKICAgIGlmIChzdWJiYW5kID09PSAiSEgiKSB7CiAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gQml0TW9kZWwuSEhDb250ZXh0TGFiZWw7CiAgICB9IGVsc2UgaWYgKHN1YmJhbmQgPT09ICJITCIpIHsKICAgICAgY29udGV4dExhYmVsVGFibGUgPSBCaXRNb2RlbC5ITENvbnRleHRMYWJlbDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRleHRMYWJlbFRhYmxlID0gQml0TW9kZWwuTExBbmRMSENvbnRleHRzTGFiZWw7CiAgICB9CiAgICB0aGlzLmNvbnRleHRMYWJlbFRhYmxlID0gY29udGV4dExhYmVsVGFibGU7CiAgICBjb25zdCBjb2VmZmljaWVudENvdW50ID0gd2lkdGggKiBoZWlnaHQ7CiAgICB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOwogICAgdGhpcy5jb2VmZmljZW50c1NpZ24gPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKICAgIGxldCBjb2VmZmljZW50c01hZ25pdHVkZTsKICAgIGlmIChtYiA+IDE0KSB7CiAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlID0gbmV3IFVpbnQzMkFycmF5KGNvZWZmaWNpZW50Q291bnQpOwogICAgfSBlbHNlIGlmIChtYiA+IDYpIHsKICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGUgPSBuZXcgVWludDE2QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CiAgICB9IGVsc2UgewogICAgICBjb2VmZmljZW50c01hZ25pdHVkZSA9IG5ldyBVaW50OEFycmF5KGNvZWZmaWNpZW50Q291bnQpOwogICAgfQogICAgdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlOwogICAgdGhpcy5wcm9jZXNzaW5nRmxhZ3MgPSBuZXcgVWludDhBcnJheShjb2VmZmljaWVudENvdW50KTsKICAgIGNvbnN0IGJpdHNEZWNvZGVkID0gbmV3IFVpbnQ4QXJyYXkoY29lZmZpY2llbnRDb3VudCk7CiAgICBpZiAoemVyb0JpdFBsYW5lcyAhPT0gMCkgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZWZmaWNpZW50Q291bnQ7IGkrKykgewogICAgICAgIGJpdHNEZWNvZGVkW2ldID0gemVyb0JpdFBsYW5lczsKICAgICAgfQogICAgfQogICAgdGhpcy5iaXRzRGVjb2RlZCA9IGJpdHNEZWNvZGVkOwogICAgdGhpcy5yZXNldCgpOwogIH0KICBzZXREZWNvZGVyKGRlY29kZXIpIHsKICAgIHRoaXMuZGVjb2RlciA9IGRlY29kZXI7CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5jb250ZXh0cyA9IG5ldyBJbnQ4QXJyYXkoMTkpOwogICAgdGhpcy5jb250ZXh0c1swXSA9IDQgPDwgMSB8IDA7CiAgICB0aGlzLmNvbnRleHRzW0JpdE1vZGVsLlVOSUZPUk1fQ09OVEVYVF0gPSA0NiA8PCAxIHwgMDsKICAgIHRoaXMuY29udGV4dHNbQml0TW9kZWwuUlVOTEVOR1RIX0NPTlRFWFRdID0gMyA8PCAxIHwgMDsKICB9CiAgc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKHJvdywgY29sdW1uLCBpbmRleCkgewogICAgY29uc3QgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGgsCiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgbGVmdCA9IGNvbHVtbiA+IDA7CiAgICBjb25zdCByaWdodCA9IGNvbHVtbiArIDEgPCB3aWR0aDsKICAgIGxldCBpOwogICAgaWYgKHJvdyA+IDApIHsKICAgICAgaSA9IGluZGV4IC0gd2lkdGg7CiAgICAgIGlmIChsZWZ0KSB7CiAgICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2kgLSAxXSArPSAweDEwOwogICAgICB9CiAgICAgIGlmIChyaWdodCkgewogICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpICsgMV0gKz0gMHgxMDsKICAgICAgfQogICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaV0gKz0gMHgwNDsKICAgIH0KICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0KSB7CiAgICAgIGkgPSBpbmRleCArIHdpZHRoOwogICAgICBpZiAobGVmdCkgewogICAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpIC0gMV0gKz0gMHgxMDsKICAgICAgfQogICAgICBpZiAocmlnaHQpIHsKICAgICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaSArIDFdICs9IDB4MTA7CiAgICAgIH0KICAgICAgbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2ldICs9IDB4MDQ7CiAgICB9CiAgICBpZiAobGVmdCkgewogICAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXggLSAxXSArPSAweDAxOwogICAgfQogICAgaWYgKHJpZ2h0KSB7CiAgICAgIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleCArIDFdICs9IDB4MDE7CiAgICB9CiAgICBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdIHw9IDB4ODA7CiAgfQogIHJ1blNpZ25pZmljYW5jZVByb3BhZ2F0aW9uUGFzcygpIHsKICAgIGNvbnN0IGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGgsCiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOwogICAgY29uc3QgY29lZmZpY2VudHNTaWduID0gdGhpcy5jb2VmZmljZW50c1NpZ247CiAgICBjb25zdCBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTsKICAgIGNvbnN0IHByb2Nlc3NpbmdGbGFncyA9IHRoaXMucHJvY2Vzc2luZ0ZsYWdzOwogICAgY29uc3QgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOwogICAgY29uc3QgbGFiZWxzID0gdGhpcy5jb250ZXh0TGFiZWxUYWJsZTsKICAgIGNvbnN0IGJpdHNEZWNvZGVkID0gdGhpcy5iaXRzRGVjb2RlZDsKICAgIGNvbnN0IHByb2Nlc3NlZEludmVyc2VNYXNrID0gfjE7CiAgICBjb25zdCBwcm9jZXNzZWRNYXNrID0gMTsKICAgIGNvbnN0IGZpcnN0TWFnbml0dWRlQml0TWFzayA9IDI7CiAgICBmb3IgKGxldCBpMCA9IDA7IGkwIDwgaGVpZ2h0OyBpMCArPSA0KSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICAgIGxldCBpbmRleCA9IGkwICogd2lkdGggKyBqOwogICAgICAgIGZvciAobGV0IGkxID0gMDsgaTEgPCA0OyBpMSsrLCBpbmRleCArPSB3aWR0aCkgewogICAgICAgICAgY29uc3QgaSA9IGkwICsgaTE7CiAgICAgICAgICBpZiAoaSA+PSBoZWlnaHQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICY9IHByb2Nlc3NlZEludmVyc2VNYXNrOwogICAgICAgICAgaWYgKGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAhbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGNvbnRleHRMYWJlbCA9IGxhYmVsc1tuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXhdXTsKICAgICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBjb250ZXh0TGFiZWwpOwogICAgICAgICAgaWYgKGRlY2lzaW9uKSB7CiAgICAgICAgICAgIGNvbnN0IHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOwogICAgICAgICAgICBjb2VmZmljZW50c1NpZ25baW5kZXhdID0gc2lnbjsKICAgICAgICAgICAgY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdID0gMTsKICAgICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOwogICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IGZpcnN0TWFnbml0dWRlQml0TWFzazsKICAgICAgICAgIH0KICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrOwogICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBwcm9jZXNzZWRNYXNrOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBkZWNvZGVTaWduQml0KHJvdywgY29sdW1uLCBpbmRleCkgewogICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoLAogICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKICAgIGNvbnN0IGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOwogICAgbGV0IGNvbnRyaWJ1dGlvbiwgc2lnbjAsIHNpZ24xLCBzaWduaWZpY2FuY2UxOwogICAgbGV0IGNvbnRleHRMYWJlbCwgZGVjb2RlZDsKICAgIHNpZ25pZmljYW5jZTEgPSBjb2x1bW4gPiAwICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4IC0gMV0gIT09IDA7CiAgICBpZiAoY29sdW1uICsgMSA8IHdpZHRoICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4ICsgMV0gIT09IDApIHsKICAgICAgc2lnbjEgPSBjb2VmZmljZW50c1NpZ25baW5kZXggKyAxXTsKICAgICAgaWYgKHNpZ25pZmljYW5jZTEpIHsKICAgICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIDFdOwogICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24xOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHNpZ25pZmljYW5jZTEpIHsKICAgICAgc2lnbjAgPSBjb2VmZmljZW50c1NpZ25baW5kZXggLSAxXTsKICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjA7CiAgICB9IGVsc2UgewogICAgICBjb250cmlidXRpb24gPSAwOwogICAgfQogICAgY29uc3QgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbiA9IDMgKiBjb250cmlidXRpb247CiAgICBzaWduaWZpY2FuY2UxID0gcm93ID4gMCAmJiBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleCAtIHdpZHRoXSAhPT0gMDsKICAgIGlmIChyb3cgKyAxIDwgaGVpZ2h0ICYmIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4ICsgd2lkdGhdICE9PSAwKSB7CiAgICAgIHNpZ24xID0gY29lZmZpY2VudHNTaWduW2luZGV4ICsgd2lkdGhdOwogICAgICBpZiAoc2lnbmlmaWNhbmNlMSkgewogICAgICAgIHNpZ24wID0gY29lZmZpY2VudHNTaWduW2luZGV4IC0gd2lkdGhdOwogICAgICAgIGNvbnRyaWJ1dGlvbiA9IDEgLSBzaWduMSAtIHNpZ24wICsgaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cmlidXRpb24gPSAxIC0gc2lnbjEgLSBzaWduMSArIGhvcml6b250YWxDb250cmlidXRpb247CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2lnbmlmaWNhbmNlMSkgewogICAgICBzaWduMCA9IGNvZWZmaWNlbnRzU2lnbltpbmRleCAtIHdpZHRoXTsKICAgICAgY29udHJpYnV0aW9uID0gMSAtIHNpZ24wIC0gc2lnbjAgKyBob3Jpem9udGFsQ29udHJpYnV0aW9uOwogICAgfSBlbHNlIHsKICAgICAgY29udHJpYnV0aW9uID0gaG9yaXpvbnRhbENvbnRyaWJ1dGlvbjsKICAgIH0KICAgIGlmIChjb250cmlidXRpb24gPj0gMCkgewogICAgICBjb250ZXh0TGFiZWwgPSA5ICsgY29udHJpYnV0aW9uOwogICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVyLnJlYWRCaXQodGhpcy5jb250ZXh0cywgY29udGV4dExhYmVsKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRleHRMYWJlbCA9IDkgLSBjb250cmlidXRpb247CiAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZXIucmVhZEJpdCh0aGlzLmNvbnRleHRzLCBjb250ZXh0TGFiZWwpIF4gMTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVkOwogIH0KICBydW5NYWduaXR1ZGVSZWZpbmVtZW50UGFzcygpIHsKICAgIGNvbnN0IGRlY29kZXIgPSB0aGlzLmRlY29kZXI7CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGgsCiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgY29lZmZpY2VudHNNYWduaXR1ZGUgPSB0aGlzLmNvZWZmaWNlbnRzTWFnbml0dWRlOwogICAgY29uc3QgbmVpZ2hib3JzU2lnbmlmaWNhbmNlID0gdGhpcy5uZWlnaGJvcnNTaWduaWZpY2FuY2U7CiAgICBjb25zdCBjb250ZXh0cyA9IHRoaXMuY29udGV4dHM7CiAgICBjb25zdCBiaXRzRGVjb2RlZCA9IHRoaXMuYml0c0RlY29kZWQ7CiAgICBjb25zdCBwcm9jZXNzaW5nRmxhZ3MgPSB0aGlzLnByb2Nlc3NpbmdGbGFnczsKICAgIGNvbnN0IHByb2Nlc3NlZE1hc2sgPSAxOwogICAgY29uc3QgZmlyc3RNYWduaXR1ZGVCaXRNYXNrID0gMjsKICAgIGNvbnN0IGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0OwogICAgY29uc3Qgd2lkdGg0ID0gd2lkdGggKiA0OwogICAgZm9yIChsZXQgaW5kZXgwID0gMCwgaW5kZXhOZXh0OyBpbmRleDAgPCBsZW5ndGg7IGluZGV4MCA9IGluZGV4TmV4dCkgewogICAgICBpbmRleE5leHQgPSBNYXRoLm1pbihsZW5ndGgsIGluZGV4MCArIHdpZHRoNCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGg7IGorKykgewogICAgICAgIGZvciAobGV0IGluZGV4ID0gaW5kZXgwICsgajsgaW5kZXggPCBpbmRleE5leHQ7IGluZGV4ICs9IHdpZHRoKSB7CiAgICAgICAgICBpZiAoIWNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSB8fCAocHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSAmIHByb2Nlc3NlZE1hc2spICE9PSAwKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IDE2OwogICAgICAgICAgaWYgKChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgZmlyc3RNYWduaXR1ZGVCaXRNYXNrKSAhPT0gMCkgewogICAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIF49IGZpcnN0TWFnbml0dWRlQml0TWFzazsKICAgICAgICAgICAgY29uc3Qgc2lnbmlmaWNhbmNlID0gbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XSAmIDEyNzsKICAgICAgICAgICAgY29udGV4dExhYmVsID0gc2lnbmlmaWNhbmNlID09PSAwID8gMTUgOiAxNDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGJpdCA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA8PCAxIHwgYml0OwogICAgICAgICAgYml0c0RlY29kZWRbaW5kZXhdKys7CiAgICAgICAgICBwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdIHw9IHByb2Nlc3NlZE1hc2s7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJ1bkNsZWFudXBQYXNzKCkgewogICAgY29uc3QgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjsKICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CiAgICBjb25zdCBuZWlnaGJvcnNTaWduaWZpY2FuY2UgPSB0aGlzLm5laWdoYm9yc1NpZ25pZmljYW5jZTsKICAgIGNvbnN0IGNvZWZmaWNlbnRzTWFnbml0dWRlID0gdGhpcy5jb2VmZmljZW50c01hZ25pdHVkZTsKICAgIGNvbnN0IGNvZWZmaWNlbnRzU2lnbiA9IHRoaXMuY29lZmZpY2VudHNTaWduOwogICAgY29uc3QgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOwogICAgY29uc3QgbGFiZWxzID0gdGhpcy5jb250ZXh0TGFiZWxUYWJsZTsKICAgIGNvbnN0IGJpdHNEZWNvZGVkID0gdGhpcy5iaXRzRGVjb2RlZDsKICAgIGNvbnN0IHByb2Nlc3NpbmdGbGFncyA9IHRoaXMucHJvY2Vzc2luZ0ZsYWdzOwogICAgY29uc3QgcHJvY2Vzc2VkTWFzayA9IDE7CiAgICBjb25zdCBmaXJzdE1hZ25pdHVkZUJpdE1hc2sgPSAyOwogICAgY29uc3Qgb25lUm93RG93biA9IHdpZHRoOwogICAgY29uc3QgdHdvUm93c0Rvd24gPSB3aWR0aCAqIDI7CiAgICBjb25zdCB0aHJlZVJvd3NEb3duID0gd2lkdGggKiAzOwogICAgbGV0IGlOZXh0OwogICAgZm9yIChsZXQgaTAgPSAwOyBpMCA8IGhlaWdodDsgaTAgPSBpTmV4dCkgewogICAgICBpTmV4dCA9IE1hdGgubWluKGkwICsgNCwgaGVpZ2h0KTsKICAgICAgY29uc3QgaW5kZXhCYXNlID0gaTAgKiB3aWR0aDsKICAgICAgY29uc3QgY2hlY2tBbGxFbXB0eSA9IGkwICsgMyA8IGhlaWdodDsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aWR0aDsgaisrKSB7CiAgICAgICAgY29uc3QgaW5kZXgwID0gaW5kZXhCYXNlICsgajsKICAgICAgICBjb25zdCBhbGxFbXB0eSA9IGNoZWNrQWxsRW1wdHkgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MF0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIG9uZVJvd0Rvd25dID09PSAwICYmIHByb2Nlc3NpbmdGbGFnc1tpbmRleDAgKyB0d29Sb3dzRG93bl0gPT09IDAgJiYgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4MCArIHRocmVlUm93c0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDBdID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyBvbmVSb3dEb3duXSA9PT0gMCAmJiBuZWlnaGJvcnNTaWduaWZpY2FuY2VbaW5kZXgwICsgdHdvUm93c0Rvd25dID09PSAwICYmIG5laWdoYm9yc1NpZ25pZmljYW5jZVtpbmRleDAgKyB0aHJlZVJvd3NEb3duXSA9PT0gMDsKICAgICAgICBsZXQgaTEgPSAwLAogICAgICAgICAgaW5kZXggPSBpbmRleDA7CiAgICAgICAgbGV0IGkgPSBpMCwKICAgICAgICAgIHNpZ247CiAgICAgICAgaWYgKGFsbEVtcHR5KSB7CiAgICAgICAgICBjb25zdCBoYXNTaWduaWZpY2FudENvZWZmaWNlbnQgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIEJpdE1vZGVsLlJVTkxFTkdUSF9DT05URVhUKTsKICAgICAgICAgIGlmICghaGFzU2lnbmlmaWNhbnRDb2VmZmljZW50KSB7CiAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MF0rKzsKICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgb25lUm93RG93bl0rKzsKICAgICAgICAgICAgYml0c0RlY29kZWRbaW5kZXgwICsgdHdvUm93c0Rvd25dKys7CiAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4MCArIHRocmVlUm93c0Rvd25dKys7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaTEgPSBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIEJpdE1vZGVsLlVOSUZPUk1fQ09OVEVYVCkgPDwgMSB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgQml0TW9kZWwuVU5JRk9STV9DT05URVhUKTsKICAgICAgICAgIGlmIChpMSAhPT0gMCkgewogICAgICAgICAgICBpID0gaTAgKyBpMTsKICAgICAgICAgICAgaW5kZXggKz0gaTEgKiB3aWR0aDsKICAgICAgICAgIH0KICAgICAgICAgIHNpZ24gPSB0aGlzLmRlY29kZVNpZ25CaXQoaSwgaiwgaW5kZXgpOwogICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CiAgICAgICAgICBjb2VmZmljZW50c01hZ25pdHVkZVtpbmRleF0gPSAxOwogICAgICAgICAgdGhpcy5zZXROZWlnaGJvcnNTaWduaWZpY2FuY2UoaSwgaiwgaW5kZXgpOwogICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CiAgICAgICAgICBpbmRleCA9IGluZGV4MDsKICAgICAgICAgIGZvciAobGV0IGkyID0gaTA7IGkyIDw9IGk7IGkyKyssIGluZGV4ICs9IHdpZHRoKSB7CiAgICAgICAgICAgIGJpdHNEZWNvZGVkW2luZGV4XSsrOwogICAgICAgICAgfQogICAgICAgICAgaTErKzsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gaTAgKyBpMTsgaSA8IGlOZXh0OyBpKyssIGluZGV4ICs9IHdpZHRoKSB7CiAgICAgICAgICBpZiAoY29lZmZpY2VudHNNYWduaXR1ZGVbaW5kZXhdIHx8IChwcm9jZXNzaW5nRmxhZ3NbaW5kZXhdICYgcHJvY2Vzc2VkTWFzaykgIT09IDApIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjb250ZXh0TGFiZWwgPSBsYWJlbHNbbmVpZ2hib3JzU2lnbmlmaWNhbmNlW2luZGV4XV07CiAgICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgY29udGV4dExhYmVsKTsKICAgICAgICAgIGlmIChkZWNpc2lvbiA9PT0gMSkgewogICAgICAgICAgICBzaWduID0gdGhpcy5kZWNvZGVTaWduQml0KGksIGosIGluZGV4KTsKICAgICAgICAgICAgY29lZmZpY2VudHNTaWduW2luZGV4XSA9IHNpZ247CiAgICAgICAgICAgIGNvZWZmaWNlbnRzTWFnbml0dWRlW2luZGV4XSA9IDE7CiAgICAgICAgICAgIHRoaXMuc2V0TmVpZ2hib3JzU2lnbmlmaWNhbmNlKGksIGosIGluZGV4KTsKICAgICAgICAgICAgcHJvY2Vzc2luZ0ZsYWdzW2luZGV4XSB8PSBmaXJzdE1hZ25pdHVkZUJpdE1hc2s7CiAgICAgICAgICB9CiAgICAgICAgICBiaXRzRGVjb2RlZFtpbmRleF0rKzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgY2hlY2tTZWdtZW50YXRpb25TeW1ib2woKSB7CiAgICBjb25zdCBkZWNvZGVyID0gdGhpcy5kZWNvZGVyOwogICAgY29uc3QgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzOwogICAgY29uc3Qgc3ltYm9sID0gZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBCaXRNb2RlbC5VTklGT1JNX0NPTlRFWFQpIDw8IDMgfCBkZWNvZGVyLnJlYWRCaXQoY29udGV4dHMsIEJpdE1vZGVsLlVOSUZPUk1fQ09OVEVYVCkgPDwgMiB8IGRlY29kZXIucmVhZEJpdChjb250ZXh0cywgQml0TW9kZWwuVU5JRk9STV9DT05URVhUKSA8PCAxIHwgZGVjb2Rlci5yZWFkQml0KGNvbnRleHRzLCBCaXRNb2RlbC5VTklGT1JNX0NPTlRFWFQpOwogICAgaWYgKHN5bWJvbCAhPT0gMHhhKSB7CiAgICAgIHRocm93IG5ldyBKcHhFcnJvcigiSW52YWxpZCBzZWdtZW50YXRpb24gc3ltYm9sIik7CiAgICB9CiAgfQp9CmNsYXNzIFRyYW5zZm9ybSB7CiAgY29uc3RydWN0b3IoKSB7CiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gVHJhbnNmb3JtKSB7CiAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIFRyYW5zZm9ybS4iKTsKICAgIH0KICB9CiAgY2FsY3VsYXRlKHN1YmJhbmRzLCB1MCwgdjApIHsKICAgIGxldCBsbCA9IHN1YmJhbmRzWzBdOwogICAgZm9yIChsZXQgaSA9IDEsIGlpID0gc3ViYmFuZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBsbCA9IHRoaXMuaXRlcmF0ZShsbCwgc3ViYmFuZHNbaV0sIHUwLCB2MCk7CiAgICB9CiAgICByZXR1cm4gbGw7CiAgfQogIGV4dGVuZChidWZmZXIsIG9mZnNldCwgc2l6ZSkgewogICAgbGV0IGkxID0gb2Zmc2V0IC0gMSwKICAgICAgajEgPSBvZmZzZXQgKyAxOwogICAgbGV0IGkyID0gb2Zmc2V0ICsgc2l6ZSAtIDIsCiAgICAgIGoyID0gb2Zmc2V0ICsgc2l6ZTsKICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTsKICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTsKICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTsKICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTsKICAgIGJ1ZmZlcltpMS0tXSA9IGJ1ZmZlcltqMSsrXTsKICAgIGJ1ZmZlcltqMisrXSA9IGJ1ZmZlcltpMi0tXTsKICAgIGJ1ZmZlcltpMV0gPSBidWZmZXJbajFdOwogICAgYnVmZmVyW2oyXSA9IGJ1ZmZlcltpMl07CiAgfQogIGZpbHRlcih4LCBvZmZzZXQsIGxlbmd0aCkgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBmaWx0ZXJgIGNhbGxlZCIpOwogIH0KICBpdGVyYXRlKGxsLCBobF9saF9oaCwgdTAsIHYwKSB7CiAgICBjb25zdCBsbFdpZHRoID0gbGwud2lkdGgsCiAgICAgIGxsSGVpZ2h0ID0gbGwuaGVpZ2h0OwogICAgbGV0IGxsSXRlbXMgPSBsbC5pdGVtczsKICAgIGNvbnN0IHdpZHRoID0gaGxfbGhfaGgud2lkdGg7CiAgICBjb25zdCBoZWlnaHQgPSBobF9saF9oaC5oZWlnaHQ7CiAgICBjb25zdCBpdGVtcyA9IGhsX2xoX2hoLml0ZW1zOwogICAgbGV0IGksIGosIGssIGwsIHUsIHY7CiAgICBmb3IgKGsgPSAwLCBpID0gMDsgaSA8IGxsSGVpZ2h0OyBpKyspIHsKICAgICAgbCA9IGkgKiAyICogd2lkdGg7CiAgICAgIGZvciAoaiA9IDA7IGogPCBsbFdpZHRoOyBqKyssIGsrKywgbCArPSAyKSB7CiAgICAgICAgaXRlbXNbbF0gPSBsbEl0ZW1zW2tdOwogICAgICB9CiAgICB9CiAgICBsbEl0ZW1zID0gbGwuaXRlbXMgPSBudWxsOwogICAgY29uc3QgYnVmZmVyUGFkZGluZyA9IDQ7CiAgICBjb25zdCByb3dCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KHdpZHRoICsgMiAqIGJ1ZmZlclBhZGRpbmcpOwogICAgaWYgKHdpZHRoID09PSAxKSB7CiAgICAgIGlmICgodTAgJiAxKSAhPT0gMCkgewogICAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKICAgICAgICAgIGl0ZW1zW2tdICo9IDAuNTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAodiA9IDAsIGsgPSAwOyB2IDwgaGVpZ2h0OyB2KyssIGsgKz0gd2lkdGgpIHsKICAgICAgICByb3dCdWZmZXIuc2V0KGl0ZW1zLnN1YmFycmF5KGssIGsgKyB3aWR0aCksIGJ1ZmZlclBhZGRpbmcpOwogICAgICAgIHRoaXMuZXh0ZW5kKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOwogICAgICAgIHRoaXMuZmlsdGVyKHJvd0J1ZmZlciwgYnVmZmVyUGFkZGluZywgd2lkdGgpOwogICAgICAgIGl0ZW1zLnNldChyb3dCdWZmZXIuc3ViYXJyYXkoYnVmZmVyUGFkZGluZywgYnVmZmVyUGFkZGluZyArIHdpZHRoKSwgayk7CiAgICAgIH0KICAgIH0KICAgIGxldCBudW1CdWZmZXJzID0gMTY7CiAgICBjb25zdCBjb2xCdWZmZXJzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7CiAgICAgIGNvbEJ1ZmZlcnMucHVzaChuZXcgRmxvYXQzMkFycmF5KGhlaWdodCArIDIgKiBidWZmZXJQYWRkaW5nKSk7CiAgICB9CiAgICBsZXQgYiwKICAgICAgY3VycmVudEJ1ZmZlciA9IDA7CiAgICBsbCA9IGJ1ZmZlclBhZGRpbmcgKyBoZWlnaHQ7CiAgICBpZiAoaGVpZ2h0ID09PSAxKSB7CiAgICAgIGlmICgodjAgJiAxKSAhPT0gMCkgewogICAgICAgIGZvciAodSA9IDA7IHUgPCB3aWR0aDsgdSsrKSB7CiAgICAgICAgICBpdGVtc1t1XSAqPSAwLjU7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKHUgPSAwOyB1IDwgd2lkdGg7IHUrKykgewogICAgICAgIGlmIChjdXJyZW50QnVmZmVyID09PSAwKSB7CiAgICAgICAgICBudW1CdWZmZXJzID0gTWF0aC5taW4od2lkdGggLSB1LCBudW1CdWZmZXJzKTsKICAgICAgICAgIGZvciAoayA9IHUsIGwgPSBidWZmZXJQYWRkaW5nOyBsIDwgbGw7IGsgKz0gd2lkdGgsIGwrKykgewogICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgbnVtQnVmZmVyczsgYisrKSB7CiAgICAgICAgICAgICAgY29sQnVmZmVyc1tiXVtsXSA9IGl0ZW1zW2sgKyBiXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY3VycmVudEJ1ZmZlciA9IG51bUJ1ZmZlcnM7CiAgICAgICAgfQogICAgICAgIGN1cnJlbnRCdWZmZXItLTsKICAgICAgICBjb25zdCBidWZmZXIgPSBjb2xCdWZmZXJzW2N1cnJlbnRCdWZmZXJdOwogICAgICAgIHRoaXMuZXh0ZW5kKGJ1ZmZlciwgYnVmZmVyUGFkZGluZywgaGVpZ2h0KTsKICAgICAgICB0aGlzLmZpbHRlcihidWZmZXIsIGJ1ZmZlclBhZGRpbmcsIGhlaWdodCk7CiAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXIgPT09IDApIHsKICAgICAgICAgIGsgPSB1IC0gbnVtQnVmZmVycyArIDE7CiAgICAgICAgICBmb3IgKGwgPSBidWZmZXJQYWRkaW5nOyBsIDwgbGw7IGsgKz0gd2lkdGgsIGwrKykgewogICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgbnVtQnVmZmVyczsgYisrKSB7CiAgICAgICAgICAgICAgaXRlbXNbayArIGJdID0gY29sQnVmZmVyc1tiXVtsXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodCwKICAgICAgaXRlbXMKICAgIH07CiAgfQp9CmNsYXNzIElycmV2ZXJzaWJsZVRyYW5zZm9ybSBleHRlbmRzIFRyYW5zZm9ybSB7CiAgZmlsdGVyKHgsIG9mZnNldCwgbGVuZ3RoKSB7CiAgICBjb25zdCBsZW4gPSBsZW5ndGggPj4gMTsKICAgIG9mZnNldCB8PSAwOwogICAgbGV0IGosIG4sIGN1cnJlbnQsIG5leHQ7CiAgICBjb25zdCBhbHBoYSA9IC0xLjU4NjEzNDM0MjA1OTkyNDsKICAgIGNvbnN0IGJldGEgPSAtMC4wNTI5ODAxMTg1NzI5NjE7CiAgICBjb25zdCBnYW1tYSA9IDAuODgyOTExMDc1NTMwOTM0OwogICAgY29uc3QgZGVsdGEgPSAwLjQ0MzUwNjg1MjA0Mzk3MTsKICAgIGNvbnN0IEsgPSAxLjIzMDE3NDEwNDkxNDAwMTsKICAgIGNvbnN0IEtfID0gMSAvIEs7CiAgICBqID0gb2Zmc2V0IC0gMzsKICAgIGZvciAobiA9IGxlbiArIDQ7IG4tLTsgaiArPSAyKSB7CiAgICAgIHhbal0gKj0gS187CiAgICB9CiAgICBqID0gb2Zmc2V0IC0gMjsKICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiAtIDFdOwogICAgZm9yIChuID0gbGVuICsgMzsgbi0tOyBqICs9IDIpIHsKICAgICAgbmV4dCA9IGRlbHRhICogeFtqICsgMV07CiAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OwogICAgICBpZiAobi0tKSB7CiAgICAgICAgaiArPSAyOwogICAgICAgIGN1cnJlbnQgPSBkZWx0YSAqIHhbaiArIDFdOwogICAgICAgIHhbal0gPSBLICogeFtqXSAtIGN1cnJlbnQgLSBuZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBqID0gb2Zmc2V0IC0gMTsKICAgIGN1cnJlbnQgPSBnYW1tYSAqIHhbaiAtIDFdOwogICAgZm9yIChuID0gbGVuICsgMjsgbi0tOyBqICs9IDIpIHsKICAgICAgbmV4dCA9IGdhbW1hICogeFtqICsgMV07CiAgICAgIHhbal0gLT0gY3VycmVudCArIG5leHQ7CiAgICAgIGlmIChuLS0pIHsKICAgICAgICBqICs9IDI7CiAgICAgICAgY3VycmVudCA9IGdhbW1hICogeFtqICsgMV07CiAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaiA9IG9mZnNldDsKICAgIGN1cnJlbnQgPSBiZXRhICogeFtqIC0gMV07CiAgICBmb3IgKG4gPSBsZW4gKyAxOyBuLS07IGogKz0gMikgewogICAgICBuZXh0ID0gYmV0YSAqIHhbaiArIDFdOwogICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OwogICAgICBpZiAobi0tKSB7CiAgICAgICAgaiArPSAyOwogICAgICAgIGN1cnJlbnQgPSBiZXRhICogeFtqICsgMV07CiAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGxlbiAhPT0gMCkgewogICAgICBqID0gb2Zmc2V0ICsgMTsKICAgICAgY3VycmVudCA9IGFscGhhICogeFtqIC0gMV07CiAgICAgIGZvciAobiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKICAgICAgICBuZXh0ID0gYWxwaGEgKiB4W2ogKyAxXTsKICAgICAgICB4W2pdIC09IGN1cnJlbnQgKyBuZXh0OwogICAgICAgIGlmIChuLS0pIHsKICAgICAgICAgIGogKz0gMjsKICAgICAgICAgIGN1cnJlbnQgPSBhbHBoYSAqIHhbaiArIDFdOwogICAgICAgICAgeFtqXSAtPSBjdXJyZW50ICsgbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CmNsYXNzIFJldmVyc2libGVUcmFuc2Zvcm0gZXh0ZW5kcyBUcmFuc2Zvcm0gewogIGZpbHRlcih4LCBvZmZzZXQsIGxlbmd0aCkgewogICAgY29uc3QgbGVuID0gbGVuZ3RoID4+IDE7CiAgICBvZmZzZXQgfD0gMDsKICAgIGxldCBqLCBuOwogICAgZm9yIChqID0gb2Zmc2V0LCBuID0gbGVuICsgMTsgbi0tOyBqICs9IDIpIHsKICAgICAgeFtqXSAtPSB4W2ogLSAxXSArIHhbaiArIDFdICsgMiA+PiAyOwogICAgfQogICAgZm9yIChqID0gb2Zmc2V0ICsgMSwgbiA9IGxlbjsgbi0tOyBqICs9IDIpIHsKICAgICAgeFtqXSArPSB4W2ogLSAxXSArIHhbaiArIDFdID4+IDE7CiAgICB9CiAgfQp9CgovKioqLyB9KSwKLyogMzEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5MWldTdHJlYW0gPSB2b2lkIDA7CnZhciBfZGVjb2RlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpOwpjbGFzcyBMWldTdHJlYW0gZXh0ZW5kcyBfZGVjb2RlX3N0cmVhbS5EZWNvZGVTdHJlYW0gewogIGNvbnN0cnVjdG9yKHN0ciwgbWF5YmVMZW5ndGgsIGVhcmx5Q2hhbmdlKSB7CiAgICBzdXBlcihtYXliZUxlbmd0aCk7CiAgICB0aGlzLnN0ciA9IHN0cjsKICAgIHRoaXMuZGljdCA9IHN0ci5kaWN0OwogICAgdGhpcy5jYWNoZWREYXRhID0gMDsKICAgIHRoaXMuYml0c0NhY2hlZCA9IDA7CiAgICBjb25zdCBtYXhMendEaWN0aW9uYXJ5U2l6ZSA9IDQwOTY7CiAgICBjb25zdCBsendTdGF0ZSA9IHsKICAgICAgZWFybHlDaGFuZ2UsCiAgICAgIGNvZGVMZW5ndGg6IDksCiAgICAgIG5leHRDb2RlOiAyNTgsCiAgICAgIGRpY3Rpb25hcnlWYWx1ZXM6IG5ldyBVaW50OEFycmF5KG1heEx6d0RpY3Rpb25hcnlTaXplKSwKICAgICAgZGljdGlvbmFyeUxlbmd0aHM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCiAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXM6IG5ldyBVaW50MTZBcnJheShtYXhMendEaWN0aW9uYXJ5U2l6ZSksCiAgICAgIGN1cnJlbnRTZXF1ZW5jZTogbmV3IFVpbnQ4QXJyYXkobWF4THp3RGljdGlvbmFyeVNpemUpLAogICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGg6IDAKICAgIH07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAgICAgIGx6d1N0YXRlLmRpY3Rpb25hcnlWYWx1ZXNbaV0gPSBpOwogICAgICBsendTdGF0ZS5kaWN0aW9uYXJ5TGVuZ3Roc1tpXSA9IDE7CiAgICB9CiAgICB0aGlzLmx6d1N0YXRlID0gbHp3U3RhdGU7CiAgfQogIHJlYWRCaXRzKG4pIHsKICAgIGxldCBiaXRzQ2FjaGVkID0gdGhpcy5iaXRzQ2FjaGVkOwogICAgbGV0IGNhY2hlZERhdGEgPSB0aGlzLmNhY2hlZERhdGE7CiAgICB3aGlsZSAoYml0c0NhY2hlZCA8IG4pIHsKICAgICAgY29uc3QgYyA9IHRoaXMuc3RyLmdldEJ5dGUoKTsKICAgICAgaWYgKGMgPT09IC0xKSB7CiAgICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNhY2hlZERhdGEgPSBjYWNoZWREYXRhIDw8IDggfCBjOwogICAgICBiaXRzQ2FjaGVkICs9IDg7CiAgICB9CiAgICB0aGlzLmJpdHNDYWNoZWQgPSBiaXRzQ2FjaGVkIC09IG47CiAgICB0aGlzLmNhY2hlZERhdGEgPSBjYWNoZWREYXRhOwogICAgdGhpcy5sYXN0Q29kZSA9IG51bGw7CiAgICByZXR1cm4gY2FjaGVkRGF0YSA+Pj4gYml0c0NhY2hlZCAmICgxIDw8IG4pIC0gMTsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgYmxvY2tTaXplID0gNTEyLAogICAgICBkZWNvZGVkU2l6ZURlbHRhID0gYmxvY2tTaXplOwogICAgbGV0IGVzdGltYXRlZERlY29kZWRTaXplID0gYmxvY2tTaXplICogMjsKICAgIGxldCBpLCBqLCBxOwogICAgY29uc3QgbHp3U3RhdGUgPSB0aGlzLmx6d1N0YXRlOwogICAgaWYgKCFsendTdGF0ZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBlYXJseUNoYW5nZSA9IGx6d1N0YXRlLmVhcmx5Q2hhbmdlOwogICAgbGV0IG5leHRDb2RlID0gbHp3U3RhdGUubmV4dENvZGU7CiAgICBjb25zdCBkaWN0aW9uYXJ5VmFsdWVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVZhbHVlczsKICAgIGNvbnN0IGRpY3Rpb25hcnlMZW5ndGhzID0gbHp3U3RhdGUuZGljdGlvbmFyeUxlbmd0aHM7CiAgICBjb25zdCBkaWN0aW9uYXJ5UHJldkNvZGVzID0gbHp3U3RhdGUuZGljdGlvbmFyeVByZXZDb2RlczsKICAgIGxldCBjb2RlTGVuZ3RoID0gbHp3U3RhdGUuY29kZUxlbmd0aDsKICAgIGxldCBwcmV2Q29kZSA9IGx6d1N0YXRlLnByZXZDb2RlOwogICAgY29uc3QgY3VycmVudFNlcXVlbmNlID0gbHp3U3RhdGUuY3VycmVudFNlcXVlbmNlOwogICAgbGV0IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGx6d1N0YXRlLmN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsKICAgIGxldCBkZWNvZGVkTGVuZ3RoID0gMDsKICAgIGxldCBjdXJyZW50QnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHsKICAgICAgY29uc3QgY29kZSA9IHRoaXMucmVhZEJpdHMoY29kZUxlbmd0aCk7CiAgICAgIGNvbnN0IGhhc1ByZXYgPSBjdXJyZW50U2VxdWVuY2VMZW5ndGggPiAwOwogICAgICBpZiAoY29kZSA8IDI1NikgewogICAgICAgIGN1cnJlbnRTZXF1ZW5jZVswXSA9IGNvZGU7CiAgICAgICAgY3VycmVudFNlcXVlbmNlTGVuZ3RoID0gMTsKICAgICAgfSBlbHNlIGlmIChjb2RlID49IDI1OCkgewogICAgICAgIGlmIChjb2RlIDwgbmV4dENvZGUpIHsKICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZUxlbmd0aCA9IGRpY3Rpb25hcnlMZW5ndGhzW2NvZGVdOwogICAgICAgICAgZm9yIChqID0gY3VycmVudFNlcXVlbmNlTGVuZ3RoIC0gMSwgcSA9IGNvZGU7IGogPj0gMDsgai0tKSB7CiAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZVtqXSA9IGRpY3Rpb25hcnlWYWx1ZXNbcV07CiAgICAgICAgICAgIHEgPSBkaWN0aW9uYXJ5UHJldkNvZGVzW3FdOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50U2VxdWVuY2VbY3VycmVudFNlcXVlbmNlTGVuZ3RoKytdID0gY3VycmVudFNlcXVlbmNlWzBdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAyNTYpIHsKICAgICAgICBjb2RlTGVuZ3RoID0gOTsKICAgICAgICBuZXh0Q29kZSA9IDI1ODsKICAgICAgICBjdXJyZW50U2VxdWVuY2VMZW5ndGggPSAwOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZW9mID0gdHJ1ZTsKICAgICAgICBkZWxldGUgdGhpcy5sendTdGF0ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoaGFzUHJldikgewogICAgICAgIGRpY3Rpb25hcnlQcmV2Q29kZXNbbmV4dENvZGVdID0gcHJldkNvZGU7CiAgICAgICAgZGljdGlvbmFyeUxlbmd0aHNbbmV4dENvZGVdID0gZGljdGlvbmFyeUxlbmd0aHNbcHJldkNvZGVdICsgMTsKICAgICAgICBkaWN0aW9uYXJ5VmFsdWVzW25leHRDb2RlXSA9IGN1cnJlbnRTZXF1ZW5jZVswXTsKICAgICAgICBuZXh0Q29kZSsrOwogICAgICAgIGNvZGVMZW5ndGggPSBuZXh0Q29kZSArIGVhcmx5Q2hhbmdlICYgbmV4dENvZGUgKyBlYXJseUNoYW5nZSAtIDEgPyBjb2RlTGVuZ3RoIDogTWF0aC5taW4oTWF0aC5sb2cobmV4dENvZGUgKyBlYXJseUNoYW5nZSkgLyAwLjY5MzE0NzE4MDU1OTk0NTMgKyAxLCAxMikgfCAwOwogICAgICB9CiAgICAgIHByZXZDb2RlID0gY29kZTsKICAgICAgZGVjb2RlZExlbmd0aCArPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7CiAgICAgIGlmIChlc3RpbWF0ZWREZWNvZGVkU2l6ZSA8IGRlY29kZWRMZW5ndGgpIHsKICAgICAgICBkbyB7CiAgICAgICAgICBlc3RpbWF0ZWREZWNvZGVkU2l6ZSArPSBkZWNvZGVkU2l6ZURlbHRhOwogICAgICAgIH0gd2hpbGUgKGVzdGltYXRlZERlY29kZWRTaXplIDwgZGVjb2RlZExlbmd0aCk7CiAgICAgICAgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIodGhpcy5idWZmZXJMZW5ndGggKyBlc3RpbWF0ZWREZWNvZGVkU2l6ZSk7CiAgICAgIH0KICAgICAgZm9yIChqID0gMDsgaiA8IGN1cnJlbnRTZXF1ZW5jZUxlbmd0aDsgaisrKSB7CiAgICAgICAgYnVmZmVyW2N1cnJlbnRCdWZmZXJMZW5ndGgrK10gPSBjdXJyZW50U2VxdWVuY2Vbal07CiAgICAgIH0KICAgIH0KICAgIGx6d1N0YXRlLm5leHRDb2RlID0gbmV4dENvZGU7CiAgICBsendTdGF0ZS5jb2RlTGVuZ3RoID0gY29kZUxlbmd0aDsKICAgIGx6d1N0YXRlLnByZXZDb2RlID0gcHJldkNvZGU7CiAgICBsendTdGF0ZS5jdXJyZW50U2VxdWVuY2VMZW5ndGggPSBjdXJyZW50U2VxdWVuY2VMZW5ndGg7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IGN1cnJlbnRCdWZmZXJMZW5ndGg7CiAgfQp9CmV4cG9ydHMuTFpXU3RyZWFtID0gTFpXU3RyZWFtOwoKLyoqKi8gfSksCi8qIDMyICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuUHJlZGljdG9yU3RyZWFtID0gdm9pZCAwOwp2YXIgX2RlY29kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgUHJlZGljdG9yU3RyZWFtIGV4dGVuZHMgX2RlY29kZV9zdHJlYW0uRGVjb2RlU3RyZWFtIHsKICBjb25zdHJ1Y3RvcihzdHIsIG1heWJlTGVuZ3RoLCBwYXJhbXMpIHsKICAgIHN1cGVyKG1heWJlTGVuZ3RoKTsKICAgIGlmICghKHBhcmFtcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHJldHVybiBzdHI7CiAgICB9CiAgICBjb25zdCBwcmVkaWN0b3IgPSB0aGlzLnByZWRpY3RvciA9IHBhcmFtcy5nZXQoIlByZWRpY3RvciIpIHx8IDE7CiAgICBpZiAocHJlZGljdG9yIDw9IDEpIHsKICAgICAgcmV0dXJuIHN0cjsKICAgIH0KICAgIGlmIChwcmVkaWN0b3IgIT09IDIgJiYgKHByZWRpY3RvciA8IDEwIHx8IHByZWRpY3RvciA+IDE1KSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFVuc3VwcG9ydGVkIHByZWRpY3RvcjogJHtwcmVkaWN0b3J9YCk7CiAgICB9CiAgICBpZiAocHJlZGljdG9yID09PSAyKSB7CiAgICAgIHRoaXMucmVhZEJsb2NrID0gdGhpcy5yZWFkQmxvY2tUaWZmOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5yZWFkQmxvY2sgPSB0aGlzLnJlYWRCbG9ja1BuZzsKICAgIH0KICAgIHRoaXMuc3RyID0gc3RyOwogICAgdGhpcy5kaWN0ID0gc3RyLmRpY3Q7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9ycyA9IHBhcmFtcy5nZXQoIkNvbG9ycyIpIHx8IDE7CiAgICBjb25zdCBiaXRzID0gdGhpcy5iaXRzID0gcGFyYW1zLmdldCgiQlBDIiwgIkJpdHNQZXJDb21wb25lbnQiKSB8fCA4OwogICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucyA9IHBhcmFtcy5nZXQoIkNvbHVtbnMiKSB8fCAxOwogICAgdGhpcy5waXhCeXRlcyA9IGNvbG9ycyAqIGJpdHMgKyA3ID4+IDM7CiAgICB0aGlzLnJvd0J5dGVzID0gY29sdW1ucyAqIGNvbG9ycyAqIGJpdHMgKyA3ID4+IDM7CiAgICByZXR1cm4gdGhpczsKICB9CiAgcmVhZEJsb2NrVGlmZigpIHsKICAgIGNvbnN0IHJvd0J5dGVzID0gdGhpcy5yb3dCeXRlczsKICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoOwogICAgY29uc3QgYnVmZmVyID0gdGhpcy5lbnN1cmVCdWZmZXIoYnVmZmVyTGVuZ3RoICsgcm93Qnl0ZXMpOwogICAgY29uc3QgYml0cyA9IHRoaXMuYml0czsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3QgcmF3Qnl0ZXMgPSB0aGlzLnN0ci5nZXRCeXRlcyhyb3dCeXRlcyk7CiAgICB0aGlzLmVvZiA9ICFyYXdCeXRlcy5sZW5ndGg7CiAgICBpZiAodGhpcy5lb2YpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgbGV0IGluYnVmID0gMCwKICAgICAgb3V0YnVmID0gMDsKICAgIGxldCBpbmJpdHMgPSAwLAogICAgICBvdXRiaXRzID0gMDsKICAgIGxldCBwb3MgPSBidWZmZXJMZW5ndGg7CiAgICBsZXQgaTsKICAgIGlmIChiaXRzID09PSAxICYmIGNvbG9ycyA9PT0gMSkgewogICAgICBmb3IgKGkgPSAwOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgIGxldCBjID0gcmF3Qnl0ZXNbaV0gXiBpbmJ1ZjsKICAgICAgICBjIF49IGMgPj4gMTsKICAgICAgICBjIF49IGMgPj4gMjsKICAgICAgICBjIF49IGMgPj4gNDsKICAgICAgICBpbmJ1ZiA9IChjICYgMSkgPDwgNzsKICAgICAgICBidWZmZXJbcG9zKytdID0gYzsKICAgICAgfQogICAgfSBlbHNlIGlmIChiaXRzID09PSA4KSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7ICsraSkgewogICAgICAgIGJ1ZmZlcltwb3MrK10gPSByYXdCeXRlc1tpXTsKICAgICAgfQogICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICBidWZmZXJbcG9zXSA9IGJ1ZmZlcltwb3MgLSBjb2xvcnNdICsgcmF3Qnl0ZXNbaV07CiAgICAgICAgcG9zKys7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYml0cyA9PT0gMTYpIHsKICAgICAgY29uc3QgYnl0ZXNQZXJQaXhlbCA9IGNvbG9ycyAqIDI7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBieXRlc1BlclBpeGVsOyArK2kpIHsKICAgICAgICBidWZmZXJbcG9zKytdID0gcmF3Qnl0ZXNbaV07CiAgICAgIH0KICAgICAgZm9yICg7IGkgPCByb3dCeXRlczsgaSArPSAyKSB7CiAgICAgICAgY29uc3Qgc3VtID0gKChyYXdCeXRlc1tpXSAmIDB4ZmYpIDw8IDgpICsgKHJhd0J5dGVzW2kgKyAxXSAmIDB4ZmYpICsgKChidWZmZXJbcG9zIC0gYnl0ZXNQZXJQaXhlbF0gJiAweGZmKSA8PCA4KSArIChidWZmZXJbcG9zIC0gYnl0ZXNQZXJQaXhlbCArIDFdICYgMHhmZik7CiAgICAgICAgYnVmZmVyW3BvcysrXSA9IHN1bSA+PiA4ICYgMHhmZjsKICAgICAgICBidWZmZXJbcG9zKytdID0gc3VtICYgMHhmZjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3QgY29tcEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoY29sb3JzICsgMSk7CiAgICAgIGNvbnN0IGJpdE1hc2sgPSAoMSA8PCBiaXRzKSAtIDE7CiAgICAgIGxldCBqID0gMCwKICAgICAgICBrID0gYnVmZmVyTGVuZ3RoOwogICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zOwogICAgICBmb3IgKGkgPSAwOyBpIDwgY29sdW1uczsgKytpKSB7CiAgICAgICAgZm9yIChsZXQga2sgPSAwOyBrayA8IGNvbG9yczsgKytraykgewogICAgICAgICAgaWYgKGluYml0cyA8IGJpdHMpIHsKICAgICAgICAgICAgaW5idWYgPSBpbmJ1ZiA8PCA4IHwgcmF3Qnl0ZXNbaisrXSAmIDB4ZmY7CiAgICAgICAgICAgIGluYml0cyArPSA4OwogICAgICAgICAgfQogICAgICAgICAgY29tcEFycmF5W2trXSA9IGNvbXBBcnJheVtra10gKyAoaW5idWYgPj4gaW5iaXRzIC0gYml0cykgJiBiaXRNYXNrOwogICAgICAgICAgaW5iaXRzIC09IGJpdHM7CiAgICAgICAgICBvdXRidWYgPSBvdXRidWYgPDwgYml0cyB8IGNvbXBBcnJheVtra107CiAgICAgICAgICBvdXRiaXRzICs9IGJpdHM7CiAgICAgICAgICBpZiAob3V0Yml0cyA+PSA4KSB7CiAgICAgICAgICAgIGJ1ZmZlcltrKytdID0gb3V0YnVmID4+IG91dGJpdHMgLSA4ICYgMHhmZjsKICAgICAgICAgICAgb3V0Yml0cyAtPSA4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAob3V0Yml0cyA+IDApIHsKICAgICAgICBidWZmZXJbaysrXSA9IChvdXRidWYgPDwgOCAtIG91dGJpdHMpICsgKGluYnVmICYgKDEgPDwgOCAtIG91dGJpdHMpIC0gMSk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IHJvd0J5dGVzOwogIH0KICByZWFkQmxvY2tQbmcoKSB7CiAgICBjb25zdCByb3dCeXRlcyA9IHRoaXMucm93Qnl0ZXM7CiAgICBjb25zdCBwaXhCeXRlcyA9IHRoaXMucGl4Qnl0ZXM7CiAgICBjb25zdCBwcmVkaWN0b3IgPSB0aGlzLnN0ci5nZXRCeXRlKCk7CiAgICBjb25zdCByYXdCeXRlcyA9IHRoaXMuc3RyLmdldEJ5dGVzKHJvd0J5dGVzKTsKICAgIHRoaXMuZW9mID0gIXJhd0J5dGVzLmxlbmd0aDsKICAgIGlmICh0aGlzLmVvZikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIHJvd0J5dGVzKTsKICAgIGxldCBwcmV2Um93ID0gYnVmZmVyLnN1YmFycmF5KGJ1ZmZlckxlbmd0aCAtIHJvd0J5dGVzLCBidWZmZXJMZW5ndGgpOwogICAgaWYgKHByZXZSb3cubGVuZ3RoID09PSAwKSB7CiAgICAgIHByZXZSb3cgPSBuZXcgVWludDhBcnJheShyb3dCeXRlcyk7CiAgICB9CiAgICBsZXQgaSwKICAgICAgaiA9IGJ1ZmZlckxlbmd0aCwKICAgICAgdXAsCiAgICAgIGM7CiAgICBzd2l0Y2ggKHByZWRpY3RvcikgewogICAgICBjYXNlIDA6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gcmF3Qnl0ZXNbaV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gcmF3Qnl0ZXNbaV07CiAgICAgICAgfQogICAgICAgIGZvciAoOyBpIDwgcm93Qnl0ZXM7ICsraSkgewogICAgICAgICAgYnVmZmVyW2pdID0gYnVmZmVyW2ogLSBwaXhCeXRlc10gKyByYXdCeXRlc1tpXSAmIDB4ZmY7CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gcHJldlJvd1tpXSArIHJhd0J5dGVzW2ldICYgMHhmZjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4Qnl0ZXM7ICsraSkgewogICAgICAgICAgYnVmZmVyW2orK10gPSAocHJldlJvd1tpXSA+PiAxKSArIHJhd0J5dGVzW2ldOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIGJ1ZmZlcltqXSA9IChwcmV2Um93W2ldICsgYnVmZmVyW2ogLSBwaXhCeXRlc10gPj4gMSkgKyByYXdCeXRlc1tpXSAmIDB4ZmY7CiAgICAgICAgICBqKys7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeEJ5dGVzOyArK2kpIHsKICAgICAgICAgIHVwID0gcHJldlJvd1tpXTsKICAgICAgICAgIGMgPSByYXdCeXRlc1tpXTsKICAgICAgICAgIGJ1ZmZlcltqKytdID0gdXAgKyBjOwogICAgICAgIH0KICAgICAgICBmb3IgKDsgaSA8IHJvd0J5dGVzOyArK2kpIHsKICAgICAgICAgIHVwID0gcHJldlJvd1tpXTsKICAgICAgICAgIGNvbnN0IHVwTGVmdCA9IHByZXZSb3dbaSAtIHBpeEJ5dGVzXTsKICAgICAgICAgIGNvbnN0IGxlZnQgPSBidWZmZXJbaiAtIHBpeEJ5dGVzXTsKICAgICAgICAgIGNvbnN0IHAgPSBsZWZ0ICsgdXAgLSB1cExlZnQ7CiAgICAgICAgICBsZXQgcGEgPSBwIC0gbGVmdDsKICAgICAgICAgIGlmIChwYSA8IDApIHsKICAgICAgICAgICAgcGEgPSAtcGE7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgcGIgPSBwIC0gdXA7CiAgICAgICAgICBpZiAocGIgPCAwKSB7CiAgICAgICAgICAgIHBiID0gLXBiOwogICAgICAgICAgfQogICAgICAgICAgbGV0IHBjID0gcCAtIHVwTGVmdDsKICAgICAgICAgIGlmIChwYyA8IDApIHsKICAgICAgICAgICAgcGMgPSAtcGM7CiAgICAgICAgICB9CiAgICAgICAgICBjID0gcmF3Qnl0ZXNbaV07CiAgICAgICAgICBpZiAocGEgPD0gcGIgJiYgcGEgPD0gcGMpIHsKICAgICAgICAgICAgYnVmZmVyW2orK10gPSBsZWZ0ICsgYzsKICAgICAgICAgIH0gZWxzZSBpZiAocGIgPD0gcGMpIHsKICAgICAgICAgICAgYnVmZmVyW2orK10gPSB1cCArIGM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBidWZmZXJbaisrXSA9IHVwTGVmdCArIGM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcHJlZGljdG9yOiAke3ByZWRpY3Rvcn1gKTsKICAgIH0KICAgIHRoaXMuYnVmZmVyTGVuZ3RoICs9IHJvd0J5dGVzOwogIH0KfQpleHBvcnRzLlByZWRpY3RvclN0cmVhbSA9IFByZWRpY3RvclN0cmVhbTsKCi8qKiovIH0pLAovKiAzMyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlJ1bkxlbmd0aFN0cmVhbSA9IHZvaWQgMDsKdmFyIF9kZWNvZGVfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7CmNsYXNzIFJ1bkxlbmd0aFN0cmVhbSBleHRlbmRzIF9kZWNvZGVfc3RyZWFtLkRlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICB9CiAgcmVhZEJsb2NrKCkgewogICAgY29uc3QgcmVwZWF0SGVhZGVyID0gdGhpcy5zdHIuZ2V0Qnl0ZXMoMik7CiAgICBpZiAoIXJlcGVhdEhlYWRlciB8fCByZXBlYXRIZWFkZXIubGVuZ3RoIDwgMiB8fCByZXBlYXRIZWFkZXJbMF0gPT09IDEyOCkgewogICAgICB0aGlzLmVvZiA9IHRydWU7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBidWZmZXI7CiAgICBsZXQgYnVmZmVyTGVuZ3RoID0gdGhpcy5idWZmZXJMZW5ndGg7CiAgICBsZXQgbiA9IHJlcGVhdEhlYWRlclswXTsKICAgIGlmIChuIDwgMTI4KSB7CiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKGJ1ZmZlckxlbmd0aCArIG4gKyAxKTsKICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IHJlcGVhdEhlYWRlclsxXTsKICAgICAgaWYgKG4gPiAwKSB7CiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5zdHIuZ2V0Qnl0ZXMobik7CiAgICAgICAgYnVmZmVyLnNldChzb3VyY2UsIGJ1ZmZlckxlbmd0aCk7CiAgICAgICAgYnVmZmVyTGVuZ3RoICs9IG47CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG4gPSAyNTcgLSBuOwogICAgICBjb25zdCBiID0gcmVwZWF0SGVhZGVyWzFdOwogICAgICBidWZmZXIgPSB0aGlzLmVuc3VyZUJ1ZmZlcihidWZmZXJMZW5ndGggKyBuICsgMSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aCsrXSA9IGI7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogIH0KfQpleHBvcnRzLlJ1bkxlbmd0aFN0cmVhbSA9IFJ1bkxlbmd0aFN0cmVhbTsKCi8qKiovIH0pLAovKiAzNCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkZvbnQgPSBleHBvcnRzLkVycm9yRm9udCA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9jZmZfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7CnZhciBfZm9udHNfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKdmFyIF91bmljb2RlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCk7CnZhciBfZ2x5cGhsaXN0ID0gX193X3BkZmpzX3JlcXVpcmVfXygzOSk7CnZhciBfZW5jb2RpbmdzID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7CnZhciBfc3RhbmRhcmRfZm9udHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQxKTsKdmFyIF90b191bmljb2RlX21hcCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDIpOwp2YXIgX2NmZl9mb250ID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Myk7CnZhciBfZm9udF9yZW5kZXJlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDQpOwp2YXIgX21ldHJpY3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQ1KTsKdmFyIF9nbHlmID0gX193X3BkZmpzX3JlcXVpcmVfXyg0Nik7CnZhciBfY21hcCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpOwp2YXIgX29wZW50eXBlX2ZpbGVfYnVpbGRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDcpOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CnZhciBfdHlwZTFfZm9udCA9IF9fd19wZGZqc19yZXF1aXJlX18oNDgpOwpjb25zdCBQUklWQVRFX1VTRV9BUkVBUyA9IFtbMHhlMDAwLCAweGY4ZmZdLCBbMHgxMDAwMDAsIDB4MTBmZmZkXV07CmNvbnN0IFBERl9HTFlQSF9TUEFDRV9VTklUUyA9IDEwMDA7CmNvbnN0IEVYUE9SVF9EQVRBX1BST1BFUlRJRVMgPSBbImFzY2VudCIsICJiYm94IiwgImJsYWNrIiwgImJvbGQiLCAiY2hhclByb2NPcGVyYXRvckxpc3QiLCAiY29tcG9zaXRlIiwgImNzc0ZvbnRJbmZvIiwgImRhdGEiLCAiZGVmYXVsdFZNZXRyaWNzIiwgImRlZmF1bHRXaWR0aCIsICJkZXNjZW50IiwgImZhbGxiYWNrTmFtZSIsICJmb250TWF0cml4IiwgImlzSW52YWxpZFBERmpzRm9udCIsICJpc1R5cGUzRm9udCIsICJpdGFsaWMiLCAibG9hZGVkTmFtZSIsICJtaW1ldHlwZSIsICJtaXNzaW5nRmlsZSIsICJuYW1lIiwgInJlbWVhc3VyZSIsICJzdWJ0eXBlIiwgInN5c3RlbUZvbnRJbmZvIiwgInR5cGUiLCAidmVydGljYWwiXTsKY29uc3QgRVhQT1JUX0RBVEFfRVhUUkFfUFJPUEVSVElFUyA9IFsiY01hcCIsICJkZWZhdWx0RW5jb2RpbmciLCAiZGlmZmVyZW5jZXMiLCAiaXNNb25vc3BhY2UiLCAiaXNTZXJpZkZvbnQiLCAiaXNTeW1ib2xpY0ZvbnQiLCAic2VhY01hcCIsICJ0b0ZvbnRDaGFyIiwgInRvVW5pY29kZSIsICJ2bWV0cmljcyIsICJ3aWR0aHMiXTsKZnVuY3Rpb24gYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpIHsKICBpZiAoIXByb3BlcnRpZXMuZm9udE1hdHJpeCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5mb250TWF0cml4WzBdID09PSBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWFswXSkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBzY2FsZSA9IDAuMDAxIC8gcHJvcGVydGllcy5mb250TWF0cml4WzBdOwogIGNvbnN0IGdseXBoc1dpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogIGZvciAoY29uc3QgZ2x5cGggaW4gZ2x5cGhzV2lkdGhzKSB7CiAgICBnbHlwaHNXaWR0aHNbZ2x5cGhdICo9IHNjYWxlOwogIH0KICBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aCAqPSBzY2FsZTsKfQpmdW5jdGlvbiBhZGp1c3RUcnVlVHlwZVRvVW5pY29kZShwcm9wZXJ0aWVzLCBpc1N5bWJvbGljRm9udCwgbmFtZVJlY29yZHMpIHsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZykgewogICAgcmV0dXJuOwogIH0KICBpZiAocHJvcGVydGllcy50b1VuaWNvZGUgaW5zdGFuY2VvZiBfdG9fdW5pY29kZV9tYXAuSWRlbnRpdHlUb1VuaWNvZGVNYXApIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFpc1N5bWJvbGljRm9udCkgewogICAgcmV0dXJuOwogIH0KICBpZiAobmFtZVJlY29yZHMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZyA9PT0gX2VuY29kaW5ncy5XaW5BbnNpRW5jb2RpbmcpIHsKICAgIHJldHVybjsKICB9CiAgZm9yIChjb25zdCByIG9mIG5hbWVSZWNvcmRzKSB7CiAgICBpZiAoIWlzV2luTmFtZVJlY29yZChyKSkgewogICAgICByZXR1cm47CiAgICB9CiAgfQogIGNvbnN0IGVuY29kaW5nID0gX2VuY29kaW5ncy5XaW5BbnNpRW5jb2Rpbmc7CiAgY29uc3QgdG9Vbmljb2RlID0gW10sCiAgICBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGVuY29kaW5nKSB7CiAgICBjb25zdCBnbHlwaE5hbWUgPSBlbmNvZGluZ1tjaGFyQ29kZV07CiAgICBpZiAoZ2x5cGhOYW1lID09PSAiIikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IHVuaWNvZGUgPSBnbHlwaHNVbmljb2RlTWFwW2dseXBoTmFtZV07CiAgICBpZiAodW5pY29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CiAgfQogIGlmICh0b1VuaWNvZGUubGVuZ3RoID4gMCkgewogICAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTsKICB9Cn0KZnVuY3Rpb24gYWRqdXN0VHlwZTFUb1VuaWNvZGUocHJvcGVydGllcywgYnVpbHRJbkVuY29kaW5nKSB7CiAgaWYgKHByb3BlcnRpZXMuaXNJbnRlcm5hbEZvbnQpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXApIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGJ1aWx0SW5FbmNvZGluZyA9PT0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2RpbmcpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKHByb3BlcnRpZXMudG9Vbmljb2RlIGluc3RhbmNlb2YgX3RvX3VuaWNvZGVfbWFwLklkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHRvVW5pY29kZSA9IFtdLAogICAgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc0VuY29kaW5nKSB7CiAgICAgIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUgfHwgcHJvcGVydGllcy5kaWZmZXJlbmNlc1tjaGFyQ29kZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBnbHlwaE5hbWUgPSBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdOwogICAgY29uc3QgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGdseXBoTmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CiAgICB9CiAgfQogIGlmICh0b1VuaWNvZGUubGVuZ3RoID4gMCkgewogICAgcHJvcGVydGllcy50b1VuaWNvZGUuYW1lbmQodG9Vbmljb2RlKTsKICB9Cn0KZnVuY3Rpb24gYW1lbmRGYWxsYmFja1RvVW5pY29kZShwcm9wZXJ0aWVzKSB7CiAgaWYgKCFwcm9wZXJ0aWVzLmZhbGxiYWNrVG9Vbmljb2RlKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZSBpbnN0YW5jZW9mIF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCB0b1VuaWNvZGUgPSBbXTsKICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGUpIHsKICAgIGlmIChwcm9wZXJ0aWVzLnRvVW5pY29kZS5oYXMoY2hhckNvZGUpKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgdG9Vbmljb2RlW2NoYXJDb2RlXSA9IHByb3BlcnRpZXMuZmFsbGJhY2tUb1VuaWNvZGVbY2hhckNvZGVdOwogIH0KICBpZiAodG9Vbmljb2RlLmxlbmd0aCA+IDApIHsKICAgIHByb3BlcnRpZXMudG9Vbmljb2RlLmFtZW5kKHRvVW5pY29kZSk7CiAgfQp9CmNsYXNzIEdseXBoIHsKICBjb25zdHJ1Y3RvcihvcmlnaW5hbENoYXJDb2RlLCBmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KSB7CiAgICB0aGlzLm9yaWdpbmFsQ2hhckNvZGUgPSBvcmlnaW5hbENoYXJDb2RlOwogICAgdGhpcy5mb250Q2hhciA9IGZvbnRDaGFyOwogICAgdGhpcy51bmljb2RlID0gdW5pY29kZTsKICAgIHRoaXMuYWNjZW50ID0gYWNjZW50OwogICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgdGhpcy52bWV0cmljID0gdm1ldHJpYzsKICAgIHRoaXMub3BlcmF0b3JMaXN0SWQgPSBvcGVyYXRvckxpc3RJZDsKICAgIHRoaXMuaXNTcGFjZSA9IGlzU3BhY2U7CiAgICB0aGlzLmlzSW5Gb250ID0gaXNJbkZvbnQ7CiAgfQogIGdldCBjYXRlZ29yeSgpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY2F0ZWdvcnkiLCAoMCwgX3VuaWNvZGUuZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeSkodGhpcy51bmljb2RlKSwgdHJ1ZSk7CiAgfQp9CmZ1bmN0aW9uIGludDE2KGIwLCBiMSkgewogIHJldHVybiAoYjAgPDwgOCkgKyBiMTsKfQpmdW5jdGlvbiB3cml0ZVNpZ25lZEludDE2KGJ5dGVzLCBpbmRleCwgdmFsdWUpIHsKICBieXRlc1tpbmRleCArIDFdID0gdmFsdWU7CiAgYnl0ZXNbaW5kZXhdID0gdmFsdWUgPj4+IDg7Cn0KZnVuY3Rpb24gc2lnbmVkSW50MTYoYjAsIGIxKSB7CiAgY29uc3QgdmFsdWUgPSAoYjAgPDwgOCkgKyBiMTsKICByZXR1cm4gdmFsdWUgJiAxIDw8IDE1ID8gdmFsdWUgLSAweDEwMDAwIDogdmFsdWU7Cn0KZnVuY3Rpb24gaW50MzIoYjAsIGIxLCBiMiwgYjMpIHsKICByZXR1cm4gKGIwIDw8IDI0KSArIChiMSA8PCAxNikgKyAoYjIgPDwgOCkgKyBiMzsKfQpmdW5jdGlvbiBzdHJpbmcxNih2YWx1ZSkgewogIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpOwp9CmZ1bmN0aW9uIHNhZmVTdHJpbmcxNih2YWx1ZSkgewogIGlmICh2YWx1ZSA+IDB4N2ZmZikgewogICAgdmFsdWUgPSAweDdmZmY7CiAgfSBlbHNlIGlmICh2YWx1ZSA8IC0weDgwMDApIHsKICAgIHZhbHVlID0gLTB4ODAwMDsKICB9CiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7Cn0KZnVuY3Rpb24gaXNUcnVlVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoaGVhZGVyLCAwKSA9PT0gMHgwMDAxMDAwMCB8fCAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoaGVhZGVyKSA9PT0gInRydWUiOwp9CmZ1bmN0aW9uIGlzVHJ1ZVR5cGVDb2xsZWN0aW9uRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CiAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShoZWFkZXIpID09PSAidHRjZiI7Cn0KZnVuY3Rpb24gaXNPcGVuVHlwZUZpbGUoZmlsZSkgewogIGNvbnN0IGhlYWRlciA9IGZpbGUucGVla0J5dGVzKDQpOwogIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoaGVhZGVyKSA9PT0gIk9UVE8iOwp9CmZ1bmN0aW9uIGlzVHlwZTFGaWxlKGZpbGUpIHsKICBjb25zdCBoZWFkZXIgPSBmaWxlLnBlZWtCeXRlcygyKTsKICBpZiAoaGVhZGVyWzBdID09PSAweDI1ICYmIGhlYWRlclsxXSA9PT0gMHgyMSkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGlmIChoZWFkZXJbMF0gPT09IDB4ODAgJiYgaGVhZGVyWzFdID09PSAweDAxKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGlzQ0ZGRmlsZShmaWxlKSB7CiAgY29uc3QgaGVhZGVyID0gZmlsZS5wZWVrQnl0ZXMoNCk7CiAgaWYgKGhlYWRlclswXSA+PSAxICYmIGhlYWRlclszXSA+PSAxICYmIGhlYWRlclszXSA8PSA0KSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIGdldEZvbnRGaWxlVHlwZShmaWxlLCB7CiAgdHlwZSwKICBzdWJ0eXBlLAogIGNvbXBvc2l0ZQp9KSB7CiAgbGV0IGZpbGVUeXBlLCBmaWxlU3VidHlwZTsKICBpZiAoaXNUcnVlVHlwZUZpbGUoZmlsZSkgfHwgaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZpbGUpKSB7CiAgICBpZiAoY29tcG9zaXRlKSB7CiAgICAgIGZpbGVUeXBlID0gIkNJREZvbnRUeXBlMiI7CiAgICB9IGVsc2UgewogICAgICBmaWxlVHlwZSA9ICJUcnVlVHlwZSI7CiAgICB9CiAgfSBlbHNlIGlmIChpc09wZW5UeXBlRmlsZShmaWxlKSkgewogICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTIiOwogICAgfSBlbHNlIHsKICAgICAgZmlsZVR5cGUgPSAiT3BlblR5cGUiOwogICAgfQogIH0gZWxzZSBpZiAoaXNUeXBlMUZpbGUoZmlsZSkpIHsKICAgIGlmIChjb21wb3NpdGUpIHsKICAgICAgZmlsZVR5cGUgPSAiQ0lERm9udFR5cGUwIjsKICAgIH0gZWxzZSB7CiAgICAgIGZpbGVUeXBlID0gdHlwZSA9PT0gIk1NVHlwZTEiID8gIk1NVHlwZTEiIDogIlR5cGUxIjsKICAgIH0KICB9IGVsc2UgaWYgKGlzQ0ZGRmlsZShmaWxlKSkgewogICAgaWYgKGNvbXBvc2l0ZSkgewogICAgICBmaWxlVHlwZSA9ICJDSURGb250VHlwZTAiOwogICAgICBmaWxlU3VidHlwZSA9ICJDSURGb250VHlwZTBDIjsKICAgIH0gZWxzZSB7CiAgICAgIGZpbGVUeXBlID0gdHlwZSA9PT0gIk1NVHlwZTEiID8gIk1NVHlwZTEiIDogIlR5cGUxIjsKICAgICAgZmlsZVN1YnR5cGUgPSAiVHlwZTFDIjsKICAgIH0KICB9IGVsc2UgewogICAgKDAsIF91dGlsLndhcm4pKCJnZXRGb250RmlsZVR5cGU6IFVuYWJsZSB0byBkZXRlY3QgY29ycmVjdCBmb250IGZpbGUgVHlwZS9TdWJ0eXBlLiIpOwogICAgZmlsZVR5cGUgPSB0eXBlOwogICAgZmlsZVN1YnR5cGUgPSBzdWJ0eXBlOwogIH0KICByZXR1cm4gW2ZpbGVUeXBlLCBmaWxlU3VidHlwZV07Cn0KZnVuY3Rpb24gYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsIGdseXBoTWFwKSB7CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBnbHlwaE1hcCkgewogICAgbWFwWytjaGFyQ29kZV0gPSBnbHlwaE1hcFtjaGFyQ29kZV07CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkVG9Gb250Q2hhcihlbmNvZGluZywgZ2x5cGhzVW5pY29kZU1hcCwgZGlmZmVyZW5jZXMpIHsKICBjb25zdCB0b0ZvbnRDaGFyID0gW107CiAgbGV0IHVuaWNvZGU7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gZW5jb2RpbmcubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGVuY29kaW5nW2ldLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgIGlmICh1bmljb2RlICE9PSAtMSkgewogICAgICB0b0ZvbnRDaGFyW2ldID0gdW5pY29kZTsKICAgIH0KICB9CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBkaWZmZXJlbmNlcykgewogICAgdW5pY29kZSA9ICgwLCBfdW5pY29kZS5nZXRVbmljb2RlRm9yR2x5cGgpKGRpZmZlcmVuY2VzW2NoYXJDb2RlXSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgICBpZiAodW5pY29kZSAhPT0gLTEpIHsKICAgICAgdG9Gb250Q2hhclsrY2hhckNvZGVdID0gdW5pY29kZTsKICAgIH0KICB9CiAgcmV0dXJuIHRvRm9udENoYXI7Cn0KZnVuY3Rpb24gaXNNYWNOYW1lUmVjb3JkKHIpIHsKICByZXR1cm4gci5wbGF0Zm9ybSA9PT0gMSAmJiByLmVuY29kaW5nID09PSAwICYmIHIubGFuZ3VhZ2UgPT09IDA7Cn0KZnVuY3Rpb24gaXNXaW5OYW1lUmVjb3JkKHIpIHsKICByZXR1cm4gci5wbGF0Zm9ybSA9PT0gMyAmJiByLmVuY29kaW5nID09PSAxICYmIHIubGFuZ3VhZ2UgPT09IDB4NDA5Owp9CmZ1bmN0aW9uIGNvbnZlcnRDaWRTdHJpbmcoY2hhckNvZGUsIGNpZCwgc2hvdWxkVGhyb3cgPSBmYWxzZSkgewogIHN3aXRjaCAoY2lkLmxlbmd0aCkgewogICAgY2FzZSAxOgogICAgICByZXR1cm4gY2lkLmNoYXJDb2RlQXQoMCk7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBjaWQuY2hhckNvZGVBdCgwKSA8PCA4IHwgY2lkLmNoYXJDb2RlQXQoMSk7CiAgfQogIGNvbnN0IG1zZyA9IGBVbnN1cHBvcnRlZCBDSUQgc3RyaW5nIChjaGFyQ29kZSAke2NoYXJDb2RlfSk6ICIke2NpZH0iLmA7CiAgaWYgKHNob3VsZFRocm93KSB7CiAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IobXNnKTsKICB9CiAgKDAsIF91dGlsLndhcm4pKG1zZyk7CiAgcmV0dXJuIGNpZDsKfQpmdW5jdGlvbiBhZGp1c3RNYXBwaW5nKGNoYXJDb2RlVG9HbHlwaElkLCBoYXNHbHlwaCwgbmV3R2x5cGhaZXJvSWQsIHRvVW5pY29kZSkgewogIGNvbnN0IG5ld01hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgY29uc3QgdG9Vbmljb2RlRXh0cmFNYXAgPSBuZXcgTWFwKCk7CiAgY29uc3QgdG9Gb250Q2hhciA9IFtdOwogIGNvbnN0IHVzZWRHbHlwaElkcyA9IG5ldyBTZXQoKTsKICBsZXQgcHJpdmF0ZVVzZUFyZWFJbmRleCA9IDA7CiAgY29uc3QgcHJpdmF0ZVVzZU9mZmV0U3RhcnQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVswXTsKICBsZXQgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IHByaXZhdGVVc2VPZmZldFN0YXJ0OwogIGxldCBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKICBjb25zdCBpc0luUHJpdmF0ZUFyZWEgPSBjb2RlID0+IFBSSVZBVEVfVVNFX0FSRUFTWzBdWzBdIDw9IGNvZGUgJiYgY29kZSA8PSBQUklWQVRFX1VTRV9BUkVBU1swXVsxXSB8fCBQUklWQVRFX1VTRV9BUkVBU1sxXVswXSA8PSBjb2RlICYmIGNvZGUgPD0gUFJJVkFURV9VU0VfQVJFQVNbMV1bMV07CiAgZm9yIChsZXQgb3JpZ2luYWxDaGFyQ29kZSBpbiBjaGFyQ29kZVRvR2x5cGhJZCkgewogICAgb3JpZ2luYWxDaGFyQ29kZSB8PSAwOwogICAgbGV0IGdseXBoSWQgPSBjaGFyQ29kZVRvR2x5cGhJZFtvcmlnaW5hbENoYXJDb2RlXTsKICAgIGlmICghaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAobmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA+IHByaXZhdGVVc2VPZmZldEVuZCkgewogICAgICBwcml2YXRlVXNlQXJlYUluZGV4Kys7CiAgICAgIGlmIChwcml2YXRlVXNlQXJlYUluZGV4ID49IFBSSVZBVEVfVVNFX0FSRUFTLmxlbmd0aCkgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiUmFuIG91dCBvZiBzcGFjZSBpbiBmb250IHByaXZhdGUgdXNlIGFyZWEuIik7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZSA9IFBSSVZBVEVfVVNFX0FSRUFTW3ByaXZhdGVVc2VBcmVhSW5kZXhdWzBdOwogICAgICBwcml2YXRlVXNlT2ZmZXRFbmQgPSBQUklWQVRFX1VTRV9BUkVBU1twcml2YXRlVXNlQXJlYUluZGV4XVsxXTsKICAgIH0KICAgIGNvbnN0IGZvbnRDaGFyQ29kZSA9IG5leHRBdmFpbGFibGVGb250Q2hhckNvZGUrKzsKICAgIGlmIChnbHlwaElkID09PSAwKSB7CiAgICAgIGdseXBoSWQgPSBuZXdHbHlwaFplcm9JZDsKICAgIH0KICAgIGxldCB1bmljb2RlID0gdG9Vbmljb2RlLmdldChvcmlnaW5hbENoYXJDb2RlKTsKICAgIGlmICh0eXBlb2YgdW5pY29kZSA9PT0gInN0cmluZyIpIHsKICAgICAgdW5pY29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgICB9CiAgICBpZiAodW5pY29kZSAmJiAhaXNJblByaXZhdGVBcmVhKHVuaWNvZGUpICYmICF1c2VkR2x5cGhJZHMuaGFzKGdseXBoSWQpKSB7CiAgICAgIHRvVW5pY29kZUV4dHJhTWFwLnNldCh1bmljb2RlLCBnbHlwaElkKTsKICAgICAgdXNlZEdseXBoSWRzLmFkZChnbHlwaElkKTsKICAgIH0KICAgIG5ld01hcFtmb250Q2hhckNvZGVdID0gZ2x5cGhJZDsKICAgIHRvRm9udENoYXJbb3JpZ2luYWxDaGFyQ29kZV0gPSBmb250Q2hhckNvZGU7CiAgfQogIHJldHVybiB7CiAgICB0b0ZvbnRDaGFyLAogICAgY2hhckNvZGVUb0dseXBoSWQ6IG5ld01hcCwKICAgIHRvVW5pY29kZUV4dHJhTWFwLAogICAgbmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZQogIH07Cn0KZnVuY3Rpb24gZ2V0UmFuZ2VzKGdseXBocywgdG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBocykgewogIGNvbnN0IGNvZGVzID0gW107CiAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBnbHlwaHMpIHsKICAgIGlmIChnbHlwaHNbY2hhckNvZGVdID49IG51bUdseXBocykgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvZGVzLnB1c2goewogICAgICBmb250Q2hhckNvZGU6IGNoYXJDb2RlIHwgMCwKICAgICAgZ2x5cGhJZDogZ2x5cGhzW2NoYXJDb2RlXQogICAgfSk7CiAgfQogIGlmICh0b1VuaWNvZGVFeHRyYU1hcCkgewogICAgZm9yIChjb25zdCBbdW5pY29kZSwgZ2x5cGhJZF0gb2YgdG9Vbmljb2RlRXh0cmFNYXApIHsKICAgICAgaWYgKGdseXBoSWQgPj0gbnVtR2x5cGhzKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29kZXMucHVzaCh7CiAgICAgICAgZm9udENoYXJDb2RlOiB1bmljb2RlLAogICAgICAgIGdseXBoSWQKICAgICAgfSk7CiAgICB9CiAgfQogIGlmIChjb2Rlcy5sZW5ndGggPT09IDApIHsKICAgIGNvZGVzLnB1c2goewogICAgICBmb250Q2hhckNvZGU6IDAsCiAgICAgIGdseXBoSWQ6IDAKICAgIH0pOwogIH0KICBjb2Rlcy5zb3J0KGZ1bmN0aW9uIGZvbnRHZXRSYW5nZXNTb3J0KGEsIGIpIHsKICAgIHJldHVybiBhLmZvbnRDaGFyQ29kZSAtIGIuZm9udENoYXJDb2RlOwogIH0pOwogIGNvbnN0IHJhbmdlcyA9IFtdOwogIGNvbnN0IGxlbmd0aCA9IGNvZGVzLmxlbmd0aDsKICBmb3IgKGxldCBuID0gMDsgbiA8IGxlbmd0aDspIHsKICAgIGNvbnN0IHN0YXJ0ID0gY29kZXNbbl0uZm9udENoYXJDb2RlOwogICAgY29uc3QgY29kZUluZGljZXMgPSBbY29kZXNbbl0uZ2x5cGhJZF07CiAgICArK247CiAgICBsZXQgZW5kID0gc3RhcnQ7CiAgICB3aGlsZSAobiA8IGxlbmd0aCAmJiBlbmQgKyAxID09PSBjb2Rlc1tuXS5mb250Q2hhckNvZGUpIHsKICAgICAgY29kZUluZGljZXMucHVzaChjb2Rlc1tuXS5nbHlwaElkKTsKICAgICAgKytlbmQ7CiAgICAgICsrbjsKICAgICAgaWYgKGVuZCA9PT0gMHhmZmZmKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJhbmdlcy5wdXNoKFtzdGFydCwgZW5kLCBjb2RlSW5kaWNlc10pOwogIH0KICByZXR1cm4gcmFuZ2VzOwp9CmZ1bmN0aW9uIGNyZWF0ZUNtYXBUYWJsZShnbHlwaHMsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpIHsKICBjb25zdCByYW5nZXMgPSBnZXRSYW5nZXMoZ2x5cGhzLCB0b1VuaWNvZGVFeHRyYU1hcCwgbnVtR2x5cGhzKTsKICBjb25zdCBudW1UYWJsZXMgPSByYW5nZXMuYXQoLTEpWzFdID4gMHhmZmZmID8gMiA6IDE7CiAgbGV0IGNtYXAgPSAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtVGFibGVzKSArICJceDAwXHgwMyIgKyAiXHgwMFx4MDEiICsgKDAsIF91dGlsLnN0cmluZzMyKSg0ICsgbnVtVGFibGVzICogOCk7CiAgbGV0IGksIGlpLCBqLCBqajsKICBmb3IgKGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGlmIChyYW5nZXNbaV1bMF0gPD0gMHhmZmZmKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBjb25zdCBibXBMZW5ndGggPSBpICsgMTsKICBpZiAocmFuZ2VzW2ldWzBdIDwgMHhmZmZmICYmIHJhbmdlc1tpXVsxXSA9PT0gMHhmZmZmKSB7CiAgICByYW5nZXNbaV1bMV0gPSAweGZmZmU7CiAgfQogIGNvbnN0IHRyYWlsaW5nUmFuZ2VzQ291bnQgPSByYW5nZXNbaV1bMV0gPCAweGZmZmYgPyAxIDogMDsKICBjb25zdCBzZWdDb3VudCA9IGJtcExlbmd0aCArIHRyYWlsaW5nUmFuZ2VzQ291bnQ7CiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gX29wZW50eXBlX2ZpbGVfYnVpbGRlci5PcGVuVHlwZUZpbGVCdWlsZGVyLmdldFNlYXJjaFBhcmFtcyhzZWdDb3VudCwgMik7CiAgbGV0IHN0YXJ0Q291bnQgPSAiIjsKICBsZXQgZW5kQ291bnQgPSAiIjsKICBsZXQgaWREZWx0YXMgPSAiIjsKICBsZXQgaWRSYW5nZU9mZnNldHMgPSAiIjsKICBsZXQgZ2x5cGhzSWRzID0gIiI7CiAgbGV0IGJpYXMgPSAwOwogIGxldCByYW5nZSwgc3RhcnQsIGVuZCwgY29kZXM7CiAgZm9yIChpID0gMCwgaWkgPSBibXBMZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICByYW5nZSA9IHJhbmdlc1tpXTsKICAgIHN0YXJ0ID0gcmFuZ2VbMF07CiAgICBlbmQgPSByYW5nZVsxXTsKICAgIHN0YXJ0Q291bnQgKz0gc3RyaW5nMTYoc3RhcnQpOwogICAgZW5kQ291bnQgKz0gc3RyaW5nMTYoZW5kKTsKICAgIGNvZGVzID0gcmFuZ2VbMl07CiAgICBsZXQgY29udGlndW91cyA9IHRydWU7CiAgICBmb3IgKGogPSAxLCBqaiA9IGNvZGVzLmxlbmd0aDsgaiA8IGpqOyArK2opIHsKICAgICAgaWYgKGNvZGVzW2pdICE9PSBjb2Rlc1tqIC0gMV0gKyAxKSB7CiAgICAgICAgY29udGlndW91cyA9IGZhbHNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoIWNvbnRpZ3VvdXMpIHsKICAgICAgY29uc3Qgb2Zmc2V0ID0gKHNlZ0NvdW50IC0gaSkgKiAyICsgYmlhcyAqIDI7CiAgICAgIGJpYXMgKz0gZW5kIC0gc3RhcnQgKyAxOwogICAgICBpZERlbHRhcyArPSBzdHJpbmcxNigwKTsKICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYob2Zmc2V0KTsKICAgICAgZm9yIChqID0gMCwgamogPSBjb2Rlcy5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICAgICAgZ2x5cGhzSWRzICs9IHN0cmluZzE2KGNvZGVzW2pdKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgY29uc3Qgc3RhcnRDb2RlID0gY29kZXNbMF07CiAgICAgIGlkRGVsdGFzICs9IHN0cmluZzE2KHN0YXJ0Q29kZSAtIHN0YXJ0ICYgMHhmZmZmKTsKICAgICAgaWRSYW5nZU9mZnNldHMgKz0gc3RyaW5nMTYoMCk7CiAgICB9CiAgfQogIGlmICh0cmFpbGluZ1Jhbmdlc0NvdW50ID4gMCkgewogICAgZW5kQ291bnQgKz0gIlx4RkZceEZGIjsKICAgIHN0YXJ0Q291bnQgKz0gIlx4RkZceEZGIjsKICAgIGlkRGVsdGFzICs9ICJceDAwXHgwMSI7CiAgICBpZFJhbmdlT2Zmc2V0cyArPSAiXHgwMFx4MDAiOwogIH0KICBjb25zdCBmb3JtYXQzMTQgPSAiXHgwMFx4MDAiICsgc3RyaW5nMTYoMiAqIHNlZ0NvdW50KSArIHN0cmluZzE2KHNlYXJjaFBhcmFtcy5yYW5nZSkgKyBzdHJpbmcxNihzZWFyY2hQYXJhbXMuZW50cnkpICsgc3RyaW5nMTYoc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpICsgZW5kQ291bnQgKyAiXHgwMFx4MDAiICsgc3RhcnRDb3VudCArIGlkRGVsdGFzICsgaWRSYW5nZU9mZnNldHMgKyBnbHlwaHNJZHM7CiAgbGV0IGZvcm1hdDMxMDEyID0gIiI7CiAgbGV0IGhlYWRlcjMxMDEyID0gIiI7CiAgaWYgKG51bVRhYmxlcyA+IDEpIHsKICAgIGNtYXAgKz0gIlx4MDBceDAzIiArICJceDAwXHgwQSIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKDQgKyBudW1UYWJsZXMgKiA4ICsgNCArIGZvcm1hdDMxNC5sZW5ndGgpOwogICAgZm9ybWF0MzEwMTIgPSAiIjsKICAgIGZvciAoaSA9IDAsIGlpID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgIHN0YXJ0ID0gcmFuZ2VbMF07CiAgICAgIGNvZGVzID0gcmFuZ2VbMl07CiAgICAgIGxldCBjb2RlID0gY29kZXNbMF07CiAgICAgIGZvciAoaiA9IDEsIGpqID0gY29kZXMubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgICAgIGlmIChjb2Rlc1tqXSAhPT0gY29kZXNbaiAtIDFdICsgMSkgewogICAgICAgICAgZW5kID0gcmFuZ2VbMF0gKyBqIC0gMTsKICAgICAgICAgIGZvcm1hdDMxMDEyICs9ICgwLCBfdXRpbC5zdHJpbmczMikoc3RhcnQpICsgKDAsIF91dGlsLnN0cmluZzMyKShlbmQpICsgKDAsIF91dGlsLnN0cmluZzMyKShjb2RlKTsKICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKICAgICAgICAgIGNvZGUgPSBjb2Rlc1tqXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZm9ybWF0MzEwMTIgKz0gKDAsIF91dGlsLnN0cmluZzMyKShzdGFydCkgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKHJhbmdlWzFdKSArICgwLCBfdXRpbC5zdHJpbmczMikoY29kZSk7CiAgICB9CiAgICBoZWFkZXIzMTAxMiA9ICJceDAwXHgwQyIgKyAiXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKShmb3JtYXQzMTAxMi5sZW5ndGggKyAxNikgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAoMCwgX3V0aWwuc3RyaW5nMzIpKGZvcm1hdDMxMDEyLmxlbmd0aCAvIDEyKTsKICB9CiAgcmV0dXJuIGNtYXAgKyAiXHgwMFx4MDQiICsgc3RyaW5nMTYoZm9ybWF0MzE0Lmxlbmd0aCArIDQpICsgZm9ybWF0MzE0ICsgaGVhZGVyMzEwMTIgKyBmb3JtYXQzMTAxMjsKfQpmdW5jdGlvbiB2YWxpZGF0ZU9TMlRhYmxlKG9zMiwgZmlsZSkgewogIGZpbGUucG9zID0gKGZpbGUuc3RhcnQgfHwgMCkgKyBvczIub2Zmc2V0OwogIGNvbnN0IHZlcnNpb24gPSBmaWxlLmdldFVpbnQxNigpOwogIGZpbGUuc2tpcCg2MCk7CiAgY29uc3Qgc2VsZWN0aW9uID0gZmlsZS5nZXRVaW50MTYoKTsKICBpZiAodmVyc2lvbiA8IDQgJiYgc2VsZWN0aW9uICYgMHgwMzAwKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IGZpcnN0Q2hhciA9IGZpbGUuZ2V0VWludDE2KCk7CiAgY29uc3QgbGFzdENoYXIgPSBmaWxlLmdldFVpbnQxNigpOwogIGlmIChmaXJzdENoYXIgPiBsYXN0Q2hhcikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmaWxlLnNraXAoNik7CiAgY29uc3QgdXNXaW5Bc2NlbnQgPSBmaWxlLmdldFVpbnQxNigpOwogIGlmICh1c1dpbkFzY2VudCA9PT0gMCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBvczIuZGF0YVs4XSA9IG9zMi5kYXRhWzldID0gMDsKICByZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBjcmVhdGVPUzJUYWJsZShwcm9wZXJ0aWVzLCBjaGFyc3RyaW5ncywgb3ZlcnJpZGUpIHsKICBvdmVycmlkZSB8fD0gewogICAgdW5pdHNQZXJFbTogMCwKICAgIHlNYXg6IDAsCiAgICB5TWluOiAwLAogICAgYXNjZW50OiAwLAogICAgZGVzY2VudDogMAogIH07CiAgbGV0IHVsVW5pY29kZVJhbmdlMSA9IDA7CiAgbGV0IHVsVW5pY29kZVJhbmdlMiA9IDA7CiAgbGV0IHVsVW5pY29kZVJhbmdlMyA9IDA7CiAgbGV0IHVsVW5pY29kZVJhbmdlNCA9IDA7CiAgbGV0IGZpcnN0Q2hhckluZGV4ID0gbnVsbDsKICBsZXQgbGFzdENoYXJJbmRleCA9IDA7CiAgbGV0IHBvc2l0aW9uID0gLTE7CiAgaWYgKGNoYXJzdHJpbmdzKSB7CiAgICBmb3IgKGxldCBjb2RlIGluIGNoYXJzdHJpbmdzKSB7CiAgICAgIGNvZGUgfD0gMDsKICAgICAgaWYgKGZpcnN0Q2hhckluZGV4ID4gY29kZSB8fCAhZmlyc3RDaGFySW5kZXgpIHsKICAgICAgICBmaXJzdENoYXJJbmRleCA9IGNvZGU7CiAgICAgIH0KICAgICAgaWYgKGxhc3RDaGFySW5kZXggPCBjb2RlKSB7CiAgICAgICAgbGFzdENoYXJJbmRleCA9IGNvZGU7CiAgICAgIH0KICAgICAgcG9zaXRpb24gPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZVJhbmdlRm9yKShjb2RlLCBwb3NpdGlvbik7CiAgICAgIGlmIChwb3NpdGlvbiA8IDMyKSB7CiAgICAgICAgdWxVbmljb2RlUmFuZ2UxIHw9IDEgPDwgcG9zaXRpb247CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCA2NCkgewogICAgICAgIHVsVW5pY29kZVJhbmdlMiB8PSAxIDw8IHBvc2l0aW9uIC0gMzI7CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCA5NikgewogICAgICAgIHVsVW5pY29kZVJhbmdlMyB8PSAxIDw8IHBvc2l0aW9uIC0gNjQ7CiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPCAxMjMpIHsKICAgICAgICB1bFVuaWNvZGVSYW5nZTQgfD0gMSA8PCBwb3NpdGlvbiAtIDk2OwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5pY29kZSByYW5nZXMgQml0cyA+IDEyMyBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlIik7CiAgICAgIH0KICAgIH0KICAgIGlmIChsYXN0Q2hhckluZGV4ID4gMHhmZmZmKSB7CiAgICAgIGxhc3RDaGFySW5kZXggPSAweGZmZmY7CiAgICB9CiAgfSBlbHNlIHsKICAgIGZpcnN0Q2hhckluZGV4ID0gMDsKICAgIGxhc3RDaGFySW5kZXggPSAyNTU7CiAgfQogIGNvbnN0IGJib3ggPSBwcm9wZXJ0aWVzLmJib3ggfHwgWzAsIDAsIDAsIDBdOwogIGNvbnN0IHVuaXRzUGVyRW0gPSBvdmVycmlkZS51bml0c1BlckVtIHx8IDEgLyAocHJvcGVydGllcy5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYKVswXTsKICBjb25zdCBzY2FsZSA9IHByb3BlcnRpZXMuYXNjZW50U2NhbGVkID8gMS4wIDogdW5pdHNQZXJFbSAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICBjb25zdCB0eXBvQXNjZW50ID0gb3ZlcnJpZGUuYXNjZW50IHx8IE1hdGgucm91bmQoc2NhbGUgKiAocHJvcGVydGllcy5hc2NlbnQgfHwgYmJveFszXSkpOwogIGxldCB0eXBvRGVzY2VudCA9IG92ZXJyaWRlLmRlc2NlbnQgfHwgTWF0aC5yb3VuZChzY2FsZSAqIChwcm9wZXJ0aWVzLmRlc2NlbnQgfHwgYmJveFsxXSkpOwogIGlmICh0eXBvRGVzY2VudCA+IDAgJiYgcHJvcGVydGllcy5kZXNjZW50ID4gMCAmJiBiYm94WzFdIDwgMCkgewogICAgdHlwb0Rlc2NlbnQgPSAtdHlwb0Rlc2NlbnQ7CiAgfQogIGNvbnN0IHdpbkFzY2VudCA9IG92ZXJyaWRlLnlNYXggfHwgdHlwb0FzY2VudDsKICBjb25zdCB3aW5EZXNjZW50ID0gLW92ZXJyaWRlLnlNaW4gfHwgLXR5cG9EZXNjZW50OwogIHJldHVybiAiXHgwMFx4MDMiICsgIlx4MDJceDI0IiArICJceDAxXHhGNCIgKyAiXHgwMFx4MDUiICsgIlx4MDBceDAwIiArICJceDAyXHg4QSIgKyAiXHgwMlx4QkIiICsgIlx4MDBceDAwIiArICJceDAwXHg4QyIgKyAiXHgwMlx4OEEiICsgIlx4MDJceEJCIiArICJceDAwXHgwMCIgKyAiXHgwMVx4REYiICsgIlx4MDBceDMxIiArICJceDAxXHgwMiIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwNiIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHByb3BlcnRpZXMuZml4ZWRQaXRjaCA/IDB4MDkgOiAweDAwKSArICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTEpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTIpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTMpICsgKDAsIF91dGlsLnN0cmluZzMyKSh1bFVuaWNvZGVSYW5nZTQpICsgIlx4MkFceDMyXHgzMVx4MkEiICsgc3RyaW5nMTYocHJvcGVydGllcy5pdGFsaWNBbmdsZSA/IDEgOiAwKSArIHN0cmluZzE2KGZpcnN0Q2hhckluZGV4IHx8IHByb3BlcnRpZXMuZmlyc3RDaGFyKSArIHN0cmluZzE2KGxhc3RDaGFySW5kZXggfHwgcHJvcGVydGllcy5sYXN0Q2hhcikgKyBzdHJpbmcxNih0eXBvQXNjZW50KSArIHN0cmluZzE2KHR5cG9EZXNjZW50KSArICJceDAwXHg2NCIgKyBzdHJpbmcxNih3aW5Bc2NlbnQpICsgc3RyaW5nMTYod2luRGVzY2VudCkgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyBzdHJpbmcxNihwcm9wZXJ0aWVzLnhIZWlnaHQpICsgc3RyaW5nMTYocHJvcGVydGllcy5jYXBIZWlnaHQpICsgc3RyaW5nMTYoMCkgKyBzdHJpbmcxNihmaXJzdENoYXJJbmRleCB8fCBwcm9wZXJ0aWVzLmZpcnN0Q2hhcikgKyAiXHgwMFx4MDMiOwp9CmZ1bmN0aW9uIGNyZWF0ZVBvc3RUYWJsZShwcm9wZXJ0aWVzKSB7CiAgY29uc3QgYW5nbGUgPSBNYXRoLmZsb29yKHByb3BlcnRpZXMuaXRhbGljQW5nbGUgKiAyICoqIDE2KTsKICByZXR1cm4gIlx4MDBceDAzXHgwMFx4MDAiICsgKDAsIF91dGlsLnN0cmluZzMyKShhbmdsZSkgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICgwLCBfdXRpbC5zdHJpbmczMikocHJvcGVydGllcy5maXhlZFBpdGNoID8gMSA6IDApICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiICsgIlx4MDBceDAwXHgwMFx4MDAiOwp9CmZ1bmN0aW9uIGNyZWF0ZVBvc3RzY3JpcHROYW1lKG5hbWUpIHsKICByZXR1cm4gbmFtZS5yZXBsYWNlQWxsKC9bXlx4MjEtXHg3RV18W1tcXSgpe308Pi8lXS9nLCAiIikuc2xpY2UoMCwgNjMpOwp9CmZ1bmN0aW9uIGNyZWF0ZU5hbWVUYWJsZShuYW1lLCBwcm90bykgewogIGlmICghcHJvdG8pIHsKICAgIHByb3RvID0gW1tdLCBbXV07CiAgfQogIGNvbnN0IHN0cmluZ3MgPSBbcHJvdG9bMF1bMF0gfHwgIk9yaWdpbmFsIGxpY2VuY2UiLCBwcm90b1swXVsxXSB8fCBuYW1lLCBwcm90b1swXVsyXSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzNdIHx8ICJ1bmlxdWVJRCIsIHByb3RvWzBdWzRdIHx8IG5hbWUsIHByb3RvWzBdWzVdIHx8ICJWZXJzaW9uIDAuMTEiLCBwcm90b1swXVs2XSB8fCBjcmVhdGVQb3N0c2NyaXB0TmFtZShuYW1lKSwgcHJvdG9bMF1bN10gfHwgIlVua25vd24iLCBwcm90b1swXVs4XSB8fCAiVW5rbm93biIsIHByb3RvWzBdWzldIHx8ICJVbmtub3duIl07CiAgY29uc3Qgc3RyaW5nc1VuaWNvZGUgPSBbXTsKICBsZXQgaSwgaWksIGosIGpqLCBzdHI7CiAgZm9yIChpID0gMCwgaWkgPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIHN0ciA9IHByb3RvWzFdW2ldIHx8IHN0cmluZ3NbaV07CiAgICBjb25zdCBzdHJCdWZVbmljb2RlID0gW107CiAgICBmb3IgKGogPSAwLCBqaiA9IHN0ci5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ckJ1ZlVuaWNvZGUucHVzaChzdHJpbmcxNihzdHIuY2hhckNvZGVBdChqKSkpOwogICAgfQogICAgc3RyaW5nc1VuaWNvZGUucHVzaChzdHJCdWZVbmljb2RlLmpvaW4oIiIpKTsKICB9CiAgY29uc3QgbmFtZXMgPSBbc3RyaW5ncywgc3RyaW5nc1VuaWNvZGVdOwogIGNvbnN0IHBsYXRmb3JtcyA9IFsiXHgwMFx4MDEiLCAiXHgwMFx4MDMiXTsKICBjb25zdCBlbmNvZGluZ3MgPSBbIlx4MDBceDAwIiwgIlx4MDBceDAxIl07CiAgY29uc3QgbGFuZ3VhZ2VzID0gWyJceDAwXHgwMCIsICJceDA0XHgwOSJdOwogIGNvbnN0IG5hbWVzUmVjb3JkQ291bnQgPSBzdHJpbmdzLmxlbmd0aCAqIHBsYXRmb3Jtcy5sZW5ndGg7CiAgbGV0IG5hbWVUYWJsZSA9ICJceDAwXHgwMCIgKyBzdHJpbmcxNihuYW1lc1JlY29yZENvdW50KSArIHN0cmluZzE2KG5hbWVzUmVjb3JkQ291bnQgKiAxMiArIDYpOwogIGxldCBzdHJPZmZzZXQgPSAwOwogIGZvciAoaSA9IDAsIGlpID0gcGxhdGZvcm1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHN0cnMgPSBuYW1lc1tpXTsKICAgIGZvciAoaiA9IDAsIGpqID0gc3Rycy5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgIHN0ciA9IHN0cnNbal07CiAgICAgIGNvbnN0IG5hbWVSZWNvcmQgPSBwbGF0Zm9ybXNbaV0gKyBlbmNvZGluZ3NbaV0gKyBsYW5ndWFnZXNbaV0gKyBzdHJpbmcxNihqKSArIHN0cmluZzE2KHN0ci5sZW5ndGgpICsgc3RyaW5nMTYoc3RyT2Zmc2V0KTsKICAgICAgbmFtZVRhYmxlICs9IG5hbWVSZWNvcmQ7CiAgICAgIHN0ck9mZnNldCArPSBzdHIubGVuZ3RoOwogICAgfQogIH0KICBuYW1lVGFibGUgKz0gc3RyaW5ncy5qb2luKCIiKSArIHN0cmluZ3NVbmljb2RlLmpvaW4oIiIpOwogIHJldHVybiBuYW1lVGFibGU7Cn0KY2xhc3MgRm9udCB7CiAgY29uc3RydWN0b3IobmFtZSwgZmlsZSwgcHJvcGVydGllcykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMucHNOYW1lID0gbnVsbDsKICAgIHRoaXMubWltZXR5cGUgPSBudWxsOwogICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBmYWxzZTsKICAgIHRoaXMubG9hZGVkTmFtZSA9IHByb3BlcnRpZXMubG9hZGVkTmFtZTsKICAgIHRoaXMuaXNUeXBlM0ZvbnQgPSBwcm9wZXJ0aWVzLmlzVHlwZTNGb250OwogICAgdGhpcy5taXNzaW5nRmlsZSA9IGZhbHNlOwogICAgdGhpcy5jc3NGb250SW5mbyA9IHByb3BlcnRpZXMuY3NzRm9udEluZm87CiAgICB0aGlzLl9jaGFyc0NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuX2dseXBoQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IGlzU2VyaWZGb250ID0gISEocHJvcGVydGllcy5mbGFncyAmIF9mb250c191dGlscy5Gb250RmxhZ3MuU2VyaWYpOwogICAgaWYgKCFpc1NlcmlmRm9udCAmJiAhcHJvcGVydGllcy5pc1NpbXVsYXRlZEZsYWdzKSB7CiAgICAgIGNvbnN0IGJhc2VOYW1lID0gbmFtZS5yZXBsYWNlQWxsKC9bLF9dL2csICItIikuc3BsaXQoIi0iKVswXSwKICAgICAgICBzZXJpZkZvbnRzID0gKDAsIF9zdGFuZGFyZF9mb250cy5nZXRTZXJpZkZvbnRzKSgpOwogICAgICBmb3IgKGNvbnN0IG5hbWVQYXJ0IG9mIGJhc2VOYW1lLnNwbGl0KCIrIikpIHsKICAgICAgICBpZiAoc2VyaWZGb250c1tuYW1lUGFydF0pIHsKICAgICAgICAgIGlzU2VyaWZGb250ID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpcy5pc1NlcmlmRm9udCA9IGlzU2VyaWZGb250OwogICAgdGhpcy5pc1N5bWJvbGljRm9udCA9ICEhKHByb3BlcnRpZXMuZmxhZ3MgJiBfZm9udHNfdXRpbHMuRm9udEZsYWdzLlN5bWJvbGljKTsKICAgIHRoaXMuaXNNb25vc3BhY2UgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgX2ZvbnRzX3V0aWxzLkZvbnRGbGFncy5GaXhlZFBpdGNoKTsKICAgIGxldCB7CiAgICAgIHR5cGUsCiAgICAgIHN1YnR5cGUKICAgIH0gPSBwcm9wZXJ0aWVzOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLnN5c3RlbUZvbnRJbmZvID0gcHJvcGVydGllcy5zeXN0ZW1Gb250SW5mbzsKICAgIGNvbnN0IG1hdGNoZXMgPSBuYW1lLm1hdGNoKC9eSW52YWxpZFBERmpzRm9udF8oLiopX1xkKyQvKTsKICAgIHRoaXMuaXNJbnZhbGlkUERGanNGb250ID0gISFtYXRjaGVzOwogICAgaWYgKHRoaXMuaXNJbnZhbGlkUERGanNGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gbWF0Y2hlc1sxXTsKICAgIH0gZWxzZSBpZiAodGhpcy5pc01vbm9zcGFjZSkgewogICAgICB0aGlzLmZhbGxiYWNrTmFtZSA9ICJtb25vc3BhY2UiOwogICAgfSBlbHNlIGlmICh0aGlzLmlzU2VyaWZGb250KSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNlcmlmIjsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuZmFsbGJhY2tOYW1lID0gInNhbnMtc2VyaWYiOwogICAgfQogICAgaWYgKHRoaXMuc3lzdGVtRm9udEluZm8/Lmd1ZXNzRmFsbGJhY2spIHsKICAgICAgdGhpcy5zeXN0ZW1Gb250SW5mby5ndWVzc0ZhbGxiYWNrID0gZmFsc2U7CiAgICAgIHRoaXMuc3lzdGVtRm9udEluZm8uY3NzICs9IGAsJHt0aGlzLmZhbGxiYWNrTmFtZX1gOwogICAgfQogICAgdGhpcy5kaWZmZXJlbmNlcyA9IHByb3BlcnRpZXMuZGlmZmVyZW5jZXM7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMuY29tcG9zaXRlID0gcHJvcGVydGllcy5jb21wb3NpdGU7CiAgICB0aGlzLmNNYXAgPSBwcm9wZXJ0aWVzLmNNYXA7CiAgICB0aGlzLmNhcEhlaWdodCA9IHByb3BlcnRpZXMuY2FwSGVpZ2h0IC8gUERGX0dMWVBIX1NQQUNFX1VOSVRTOwogICAgdGhpcy5hc2NlbnQgPSBwcm9wZXJ0aWVzLmFzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMuZGVzY2VudCA9IHByb3BlcnRpZXMuZGVzY2VudCAvIFBERl9HTFlQSF9TUEFDRV9VTklUUzsKICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuYXNjZW50IC0gdGhpcy5kZXNjZW50OwogICAgdGhpcy5mb250TWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4OwogICAgdGhpcy5iYm94ID0gcHJvcGVydGllcy5iYm94OwogICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZzsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnRvRm9udENoYXIgPSBbXTsKICAgIGlmIChwcm9wZXJ0aWVzLnR5cGUgPT09ICJUeXBlMyIpIHsKICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICAgIHRoaXMudG9Gb250Q2hhcltjaGFyQ29kZV0gPSB0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSB8fCBwcm9wZXJ0aWVzLmRlZmF1bHRFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5jaWRFbmNvZGluZyA9IHByb3BlcnRpZXMuY2lkRW5jb2RpbmcgfHwgIiI7CiAgICB0aGlzLnZlcnRpY2FsID0gISFwcm9wZXJ0aWVzLnZlcnRpY2FsOwogICAgaWYgKHRoaXMudmVydGljYWwpIHsKICAgICAgdGhpcy52bWV0cmljcyA9IHByb3BlcnRpZXMudm1ldHJpY3M7CiAgICAgIHRoaXMuZGVmYXVsdFZNZXRyaWNzID0gcHJvcGVydGllcy5kZWZhdWx0Vk1ldHJpY3M7CiAgICB9CiAgICBpZiAoIWZpbGUgfHwgZmlsZS5pc0VtcHR5KSB7CiAgICAgIGlmIChmaWxlKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCdGb250IGZpbGUgaXMgZW1wdHkgaW4gIicgKyBuYW1lICsgJyIgKCcgKyB0aGlzLmxvYWRlZE5hbWUgKyAiKSIpOwogICAgICB9CiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIFt0eXBlLCBzdWJ0eXBlXSA9IGdldEZvbnRGaWxlVHlwZShmaWxlLCBwcm9wZXJ0aWVzKTsKICAgIGlmICh0eXBlICE9PSB0aGlzLnR5cGUgfHwgc3VidHlwZSAhPT0gdGhpcy5zdWJ0eXBlKSB7CiAgICAgICgwLCBfdXRpbC5pbmZvKSgiSW5jb25zaXN0ZW50IGZvbnQgZmlsZSBUeXBlL1N1YlR5cGUsIGV4cGVjdGVkOiAiICsgYCR7dGhpcy50eXBlfS8ke3RoaXMuc3VidHlwZX0gYnV0IGZvdW5kOiAke3R5cGV9LyR7c3VidHlwZX0uYCk7CiAgICB9CiAgICBsZXQgZGF0YTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgIk1NVHlwZTEiOgogICAgICAgICAgKDAsIF91dGlsLmluZm8pKCJNTVR5cGUxIGZvbnQgKCIgKyBuYW1lICsgIiksIGZhbGxpbmcgYmFjayB0byBUeXBlMS4iKTsKICAgICAgICBjYXNlICJUeXBlMSI6CiAgICAgICAgY2FzZSAiQ0lERm9udFR5cGUwIjoKICAgICAgICAgIHRoaXMubWltZXR5cGUgPSAiZm9udC9vcGVudHlwZSI7CiAgICAgICAgICBjb25zdCBjZmYgPSBzdWJ0eXBlID09PSAiVHlwZTFDIiB8fCBzdWJ0eXBlID09PSAiQ0lERm9udFR5cGUwQyIgPyBuZXcgX2NmZl9mb250LkNGRkZvbnQoZmlsZSwgcHJvcGVydGllcykgOiBuZXcgX3R5cGUxX2ZvbnQuVHlwZTFGb250KG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpOwogICAgICAgICAgYWRqdXN0V2lkdGhzKHByb3BlcnRpZXMpOwogICAgICAgICAgZGF0YSA9IHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiT3BlblR5cGUiOgogICAgICAgIGNhc2UgIlRydWVUeXBlIjoKICAgICAgICBjYXNlICJDSURGb250VHlwZTIiOgogICAgICAgICAgdGhpcy5taW1ldHlwZSA9ICJmb250L29wZW50eXBlIjsKICAgICAgICAgIGRhdGEgPSB0aGlzLmNoZWNrQW5kUmVwYWlyKG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpOwogICAgICAgICAgaWYgKHRoaXMuaXNPcGVuVHlwZSkgewogICAgICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CiAgICAgICAgICAgIHR5cGUgPSAiT3BlblR5cGUiOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgRm9udCAke3R5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICAoMCwgX3V0aWwud2FybikoZSk7CiAgICAgIHRoaXMuZmFsbGJhY2tUb1N5c3RlbUZvbnQocHJvcGVydGllcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuc3VidHlwZSA9IHN1YnR5cGU7CiAgICB0aGlzLmZvbnRNYXRyaXggPSBwcm9wZXJ0aWVzLmZvbnRNYXRyaXg7CiAgICB0aGlzLndpZHRocyA9IHByb3BlcnRpZXMud2lkdGhzOwogICAgdGhpcy5kZWZhdWx0V2lkdGggPSBwcm9wZXJ0aWVzLmRlZmF1bHRXaWR0aDsKICAgIHRoaXMudG9Vbmljb2RlID0gcHJvcGVydGllcy50b1VuaWNvZGU7CiAgICB0aGlzLnNlYWNNYXAgPSBwcm9wZXJ0aWVzLnNlYWNNYXA7CiAgfQogIGdldCByZW5kZXJlcigpIHsKICAgIGNvbnN0IHJlbmRlcmVyID0gX2ZvbnRfcmVuZGVyZXIuRm9udFJlbmRlcmVyRmFjdG9yeS5jcmVhdGUodGhpcywgX2ZvbnRzX3V0aWxzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInJlbmRlcmVyIiwgcmVuZGVyZXIpOwogIH0KICBleHBvcnREYXRhKGV4dHJhUHJvcGVydGllcyA9IGZhbHNlKSB7CiAgICBjb25zdCBleHBvcnREYXRhUHJvcGVydGllcyA9IGV4dHJhUHJvcGVydGllcyA/IFsuLi5FWFBPUlRfREFUQV9QUk9QRVJUSUVTLCAuLi5FWFBPUlRfREFUQV9FWFRSQV9QUk9QRVJUSUVTXSA6IEVYUE9SVF9EQVRBX1BST1BFUlRJRVM7CiAgICBjb25zdCBkYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGxldCBwcm9wZXJ0eSwgdmFsdWU7CiAgICBmb3IgKHByb3BlcnR5IG9mIGV4cG9ydERhdGFQcm9wZXJ0aWVzKSB7CiAgICAgIHZhbHVlID0gdGhpc1twcm9wZXJ0eV07CiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQogIGZhbGxiYWNrVG9TeXN0ZW1Gb250KHByb3BlcnRpZXMpIHsKICAgIHRoaXMubWlzc2luZ0ZpbGUgPSB0cnVlOwogICAgY29uc3QgewogICAgICBuYW1lLAogICAgICB0eXBlCiAgICB9ID0gdGhpczsKICAgIGxldCBmb250TmFtZSA9ICgwLCBfZm9udHNfdXRpbHMubm9ybWFsaXplRm9udE5hbWUpKG5hbWUpOwogICAgY29uc3Qgc3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0U3RkRm9udE1hcCkoKSwKICAgICAgbm9uU3RkRm9udE1hcCA9ICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0Tm9uU3RkRm9udE1hcCkoKTsKICAgIGNvbnN0IGlzU3RhbmRhcmRGb250ID0gISFzdGRGb250TWFwW2ZvbnROYW1lXTsKICAgIGNvbnN0IGlzTWFwcGVkVG9TdGFuZGFyZEZvbnQgPSAhIShub25TdGRGb250TWFwW2ZvbnROYW1lXSAmJiBzdGRGb250TWFwW25vblN0ZEZvbnRNYXBbZm9udE5hbWVdXSk7CiAgICBmb250TmFtZSA9IHN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8IG5vblN0ZEZvbnRNYXBbZm9udE5hbWVdIHx8IGZvbnROYW1lOwogICAgY29uc3QgZm9udEJhc2ljTWV0cmljc01hcCA9ICgwLCBfbWV0cmljcy5nZXRGb250QmFzaWNNZXRyaWNzKSgpOwogICAgY29uc3QgbWV0cmljcyA9IGZvbnRCYXNpY01ldHJpY3NNYXBbZm9udE5hbWVdOwogICAgaWYgKG1ldHJpY3MpIHsKICAgICAgaWYgKGlzTmFOKHRoaXMuYXNjZW50KSkgewogICAgICAgIHRoaXMuYXNjZW50ID0gbWV0cmljcy5hc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuZGVzY2VudCkpIHsKICAgICAgICB0aGlzLmRlc2NlbnQgPSBtZXRyaWNzLmRlc2NlbnQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKHRoaXMuY2FwSGVpZ2h0KSkgewogICAgICAgIHRoaXMuY2FwSGVpZ2h0ID0gbWV0cmljcy5jYXBIZWlnaHQgLyBQREZfR0xZUEhfU1BBQ0VfVU5JVFM7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYm9sZCA9IC9ib2xkL2dpLnRlc3QoZm9udE5hbWUpOwogICAgdGhpcy5pdGFsaWMgPSAvb2JsaXF1ZXxpdGFsaWMvZ2kudGVzdChmb250TmFtZSk7CiAgICB0aGlzLmJsYWNrID0gL0JsYWNrL2cudGVzdChuYW1lKTsKICAgIGNvbnN0IGlzTmFycm93ID0gL05hcnJvdy9nLnRlc3QobmFtZSk7CiAgICB0aGlzLnJlbWVhc3VyZSA9ICghaXNTdGFuZGFyZEZvbnQgfHwgaXNOYXJyb3cpICYmIE9iamVjdC5rZXlzKHRoaXMud2lkdGhzKS5sZW5ndGggPiAwOwogICAgaWYgKChpc1N0YW5kYXJkRm9udCB8fCBpc01hcHBlZFRvU3RhbmRhcmRGb250KSAmJiB0eXBlID09PSAiQ0lERm9udFR5cGUyIiAmJiB0aGlzLmNpZEVuY29kaW5nLnN0YXJ0c1dpdGgoIklkZW50aXR5LSIpKSB7CiAgICAgIGNvbnN0IGNpZFRvR2lkTWFwID0gcHJvcGVydGllcy5jaWRUb0dpZE1hcDsKICAgICAgY29uc3QgbWFwID0gW107CiAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSk7CiAgICAgIGlmICgvQXJpYWwtP0JsYWNrL2kudGVzdChuYW1lKSkgewogICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjaykoKSk7CiAgICAgIH0gZWxzZSBpZiAoL0NhbGlicmkvaS50ZXN0KG5hbWUpKSB7CiAgICAgICAgYXBwbHlTdGFuZGFyZEZvbnRHbHlwaE1hcChtYXAsICgwLCBfc3RhbmRhcmRfZm9udHMuZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpKSgpKTsKICAgICAgfQogICAgICBpZiAoY2lkVG9HaWRNYXApIHsKICAgICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgewogICAgICAgICAgY29uc3QgY2lkID0gbWFwW2NoYXJDb2RlXTsKICAgICAgICAgIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2lkVG9HaWRNYXAubGVuZ3RoICE9PSB0aGlzLnRvVW5pY29kZS5sZW5ndGggJiYgcHJvcGVydGllcy5oYXNJbmNsdWRlZFRvVW5pY29kZU1hcCAmJiB0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcCkgewogICAgICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaChmdW5jdGlvbiAoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgewogICAgICAgICAgICBjb25zdCBjaWQgPSBtYXBbY2hhckNvZGVdOwogICAgICAgICAgICBpZiAoY2lkVG9HaWRNYXBbY2lkXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgbWFwWytjaGFyQ29kZV0gPSB1bmljb2RlQ2hhckNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcCkpIHsKICAgICAgICB0aGlzLnRvVW5pY29kZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFyQ29kZSwgdW5pY29kZUNoYXJDb2RlKSB7CiAgICAgICAgICBtYXBbK2NoYXJDb2RlXSA9IHVuaWNvZGVDaGFyQ29kZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnRvRm9udENoYXIgPSBtYXA7CiAgICAgIHRoaXMudG9Vbmljb2RlID0gbmV3IF90b191bmljb2RlX21hcC5Ub1VuaWNvZGVNYXAobWFwKTsKICAgIH0gZWxzZSBpZiAoL1N5bWJvbC9pLnRlc3QoZm9udE5hbWUpKSB7CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IGJ1aWxkVG9Gb250Q2hhcihfZW5jb2RpbmdzLlN5bWJvbFNldEVuY29kaW5nLCAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpLCB0aGlzLmRpZmZlcmVuY2VzKTsKICAgIH0gZWxzZSBpZiAoL0RpbmdiYXRzL2kudGVzdChmb250TmFtZSkpIHsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gYnVpbGRUb0ZvbnRDaGFyKF9lbmNvZGluZ3MuWmFwZkRpbmdiYXRzRW5jb2RpbmcsICgwLCBfZ2x5cGhsaXN0LmdldERpbmdiYXRzR2x5cGhzVW5pY29kZSkoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CiAgICB9IGVsc2UgaWYgKGlzU3RhbmRhcmRGb250KSB7CiAgICAgIGNvbnN0IG1hcCA9IGJ1aWxkVG9Gb250Q2hhcih0aGlzLmRlZmF1bHRFbmNvZGluZywgKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKSwgdGhpcy5kaWZmZXJlbmNlcyk7CiAgICAgIGlmICh0eXBlID09PSAiQ0lERm9udFR5cGUyIiAmJiAhdGhpcy5jaWRFbmNvZGluZy5zdGFydHNXaXRoKCJJZGVudGl0eS0iKSAmJiAhKHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgX3RvX3VuaWNvZGVfbWFwLklkZW50aXR5VG9Vbmljb2RlTWFwKSkgewogICAgICAgIHRoaXMudG9Vbmljb2RlLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCB1bmljb2RlQ2hhckNvZGUpIHsKICAgICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGdseXBoc1VuaWNvZGVNYXAgPSAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOwogICAgICBjb25zdCBtYXAgPSBbXTsKICAgICAgdGhpcy50b1VuaWNvZGUuZm9yRWFjaCgoY2hhckNvZGUsIHVuaWNvZGVDaGFyQ29kZSkgPT4gewogICAgICAgIGlmICghdGhpcy5jb21wb3NpdGUpIHsKICAgICAgICAgIGNvbnN0IGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdIHx8IHRoaXMuZGVmYXVsdEVuY29kaW5nW2NoYXJDb2RlXTsKICAgICAgICAgIGNvbnN0IHVuaWNvZGUgPSAoMCwgX3VuaWNvZGUuZ2V0VW5pY29kZUZvckdseXBoKShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgICAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICAgICAgICAgIHVuaWNvZGVDaGFyQ29kZSA9IHVuaWNvZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG1hcFsrY2hhckNvZGVdID0gdW5pY29kZUNoYXJDb2RlOwogICAgICB9KTsKICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICYmIHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgX3RvX3VuaWNvZGVfbWFwLklkZW50aXR5VG9Vbmljb2RlTWFwKSB7CiAgICAgICAgaWYgKC9UYWhvbWF8VmVyZGFuYS9pLnRlc3QobmFtZSkpIHsKICAgICAgICAgIGFwcGx5U3RhbmRhcmRGb250R2x5cGhNYXAobWFwLCAoMCwgX3N0YW5kYXJkX2ZvbnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cykoKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG1hcDsKICAgIH0KICAgIGFtZW5kRmFsbGJhY2tUb1VuaWNvZGUocHJvcGVydGllcyk7CiAgICB0aGlzLmxvYWRlZE5hbWUgPSBmb250TmFtZS5zcGxpdCgiLSIpWzBdOwogIH0KICBjaGVja0FuZFJlcGFpcihuYW1lLCBmb250LCBwcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBWQUxJRF9UQUJMRVMgPSBbIk9TLzIiLCAiY21hcCIsICJoZWFkIiwgImhoZWEiLCAiaG10eCIsICJtYXhwIiwgIm5hbWUiLCAicG9zdCIsICJsb2NhIiwgImdseWYiLCAiZnBnbSIsICJwcmVwIiwgImN2dCAiLCAiQ0ZGICJdOwogICAgZnVuY3Rpb24gcmVhZFRhYmxlcyhmaWxlLCBudW1UYWJsZXMpIHsKICAgICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGFibGVzWyJPUy8yIl0gPSBudWxsOwogICAgICB0YWJsZXMuY21hcCA9IG51bGw7CiAgICAgIHRhYmxlcy5oZWFkID0gbnVsbDsKICAgICAgdGFibGVzLmhoZWEgPSBudWxsOwogICAgICB0YWJsZXMuaG10eCA9IG51bGw7CiAgICAgIHRhYmxlcy5tYXhwID0gbnVsbDsKICAgICAgdGFibGVzLm5hbWUgPSBudWxsOwogICAgICB0YWJsZXMucG9zdCA9IG51bGw7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVGFibGVzOyBpKyspIHsKICAgICAgICBjb25zdCB0YWJsZSA9IHJlYWRUYWJsZUVudHJ5KGZpbGUpOwogICAgICAgIGlmICghVkFMSURfVEFCTEVTLmluY2x1ZGVzKHRhYmxlLnRhZykpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGFibGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGFibGVzW3RhYmxlLnRhZ10gPSB0YWJsZTsKICAgICAgfQogICAgICByZXR1cm4gdGFibGVzOwogICAgfQogICAgZnVuY3Rpb24gcmVhZFRhYmxlRW50cnkoZmlsZSkgewogICAgICBjb25zdCB0YWcgPSBmaWxlLmdldFN0cmluZyg0KTsKICAgICAgY29uc3QgY2hlY2tzdW0gPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IG9mZnNldCA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgY29uc3QgbGVuZ3RoID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gZmlsZS5wb3M7CiAgICAgIGZpbGUucG9zID0gZmlsZS5zdGFydCB8fCAwOwogICAgICBmaWxlLnNraXAob2Zmc2V0KTsKICAgICAgY29uc3QgZGF0YSA9IGZpbGUuZ2V0Qnl0ZXMobGVuZ3RoKTsKICAgICAgZmlsZS5wb3MgPSBwcmV2aW91c1Bvc2l0aW9uOwogICAgICBpZiAodGFnID09PSAiaGVhZCIpIHsKICAgICAgICBkYXRhWzhdID0gZGF0YVs5XSA9IGRhdGFbMTBdID0gZGF0YVsxMV0gPSAwOwogICAgICAgIGRhdGFbMTddIHw9IDB4MjA7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICB0YWcsCiAgICAgICAgY2hlY2tzdW0sCiAgICAgICAgbGVuZ3RoLAogICAgICAgIG9mZnNldCwKICAgICAgICBkYXRhCiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiByZWFkT3BlblR5cGVIZWFkZXIodHRmKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVyc2lvbjogdHRmLmdldFN0cmluZyg0KSwKICAgICAgICBudW1UYWJsZXM6IHR0Zi5nZXRVaW50MTYoKSwKICAgICAgICBzZWFyY2hSYW5nZTogdHRmLmdldFVpbnQxNigpLAogICAgICAgIGVudHJ5U2VsZWN0b3I6IHR0Zi5nZXRVaW50MTYoKSwKICAgICAgICByYW5nZVNoaWZ0OiB0dGYuZ2V0VWludDE2KCkKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25IZWFkZXIodHRjKSB7CiAgICAgIGNvbnN0IHR0Y1RhZyA9IHR0Yy5nZXRTdHJpbmcoNCk7CiAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHR0Y1RhZyA9PT0gInR0Y2YiLCAiTXVzdCBiZSBhIFRydWVUeXBlIENvbGxlY3Rpb24gZm9udC4iKTsKICAgICAgY29uc3QgbWFqb3JWZXJzaW9uID0gdHRjLmdldFVpbnQxNigpOwogICAgICBjb25zdCBtaW5vclZlcnNpb24gPSB0dGMuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IG51bUZvbnRzID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgIGNvbnN0IG9mZnNldFRhYmxlID0gW107CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRm9udHM7IGkrKykgewogICAgICAgIG9mZnNldFRhYmxlLnB1c2godHRjLmdldEludDMyKCkgPj4+IDApOwogICAgICB9CiAgICAgIGNvbnN0IGhlYWRlciA9IHsKICAgICAgICB0dGNUYWcsCiAgICAgICAgbWFqb3JWZXJzaW9uLAogICAgICAgIG1pbm9yVmVyc2lvbiwKICAgICAgICBudW1Gb250cywKICAgICAgICBvZmZzZXRUYWJsZQogICAgICB9OwogICAgICBzd2l0Y2ggKG1ham9yVmVyc2lvbikgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBoZWFkZXI7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgaGVhZGVyLmRzaWdUYWcgPSB0dGMuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICAgIGhlYWRlci5kc2lnTGVuZ3RoID0gdHRjLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBoZWFkZXIuZHNpZ09mZnNldCA9IHR0Yy5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgcmV0dXJuIGhlYWRlcjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgVHJ1ZVR5cGUgQ29sbGVjdGlvbiBtYWpvclZlcnNpb246ICR7bWFqb3JWZXJzaW9ufS5gKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRUcnVlVHlwZUNvbGxlY3Rpb25EYXRhKHR0YywgZm9udE5hbWUpIHsKICAgICAgY29uc3QgewogICAgICAgIG51bUZvbnRzLAogICAgICAgIG9mZnNldFRhYmxlCiAgICAgIH0gPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uSGVhZGVyKHR0Yyk7CiAgICAgIGNvbnN0IGZvbnROYW1lUGFydHMgPSBmb250TmFtZS5zcGxpdCgiKyIpOwogICAgICBsZXQgZmFsbGJhY2tEYXRhOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUZvbnRzOyBpKyspIHsKICAgICAgICB0dGMucG9zID0gKHR0Yy5zdGFydCB8fCAwKSArIG9mZnNldFRhYmxlW2ldOwogICAgICAgIGNvbnN0IHBvdGVudGlhbEhlYWRlciA9IHJlYWRPcGVuVHlwZUhlYWRlcih0dGMpOwogICAgICAgIGNvbnN0IHBvdGVudGlhbFRhYmxlcyA9IHJlYWRUYWJsZXModHRjLCBwb3RlbnRpYWxIZWFkZXIubnVtVGFibGVzKTsKICAgICAgICBpZiAoIXBvdGVudGlhbFRhYmxlcy5uYW1lKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1RydWVUeXBlIENvbGxlY3Rpb24gZm9udCBtdXN0IGNvbnRhaW4gYSAibmFtZSIgdGFibGUuJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IFtuYW1lVGFibGVdID0gcmVhZE5hbWVUYWJsZShwb3RlbnRpYWxUYWJsZXMubmFtZSk7CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gbmFtZVRhYmxlLmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIGZvciAobGV0IGsgPSAwLCBrayA9IG5hbWVUYWJsZVtqXS5sZW5ndGg7IGsgPCBrazsgaysrKSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWVFbnRyeSA9IG5hbWVUYWJsZVtqXVtrXT8ucmVwbGFjZUFsbCgvXHMvZywgIiIpOwogICAgICAgICAgICBpZiAoIW5hbWVFbnRyeSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IGZvbnROYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhlYWRlcjogcG90ZW50aWFsSGVhZGVyLAogICAgICAgICAgICAgICAgdGFibGVzOiBwb3RlbnRpYWxUYWJsZXMKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmb250TmFtZVBhcnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZm9udE5hbWVQYXJ0cykgewogICAgICAgICAgICAgIGlmIChuYW1lRW50cnkgPT09IHBhcnQpIHsKICAgICAgICAgICAgICAgIGZhbGxiYWNrRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgbmFtZTogcGFydCwKICAgICAgICAgICAgICAgICAgaGVhZGVyOiBwb3RlbnRpYWxIZWFkZXIsCiAgICAgICAgICAgICAgICAgIHRhYmxlczogcG90ZW50aWFsVGFibGVzCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZmFsbGJhY2tEYXRhKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBUcnVlVHlwZSBDb2xsZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4gIiR7Zm9udE5hbWV9IiBmb250LCBgICsgYGZhbGxpbmcgYmFjayB0byAiJHtmYWxsYmFja0RhdGEubmFtZX0iIGZvbnQgaW5zdGVhZC5gKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaGVhZGVyOiBmYWxsYmFja0RhdGEuaGVhZGVyLAogICAgICAgICAgdGFibGVzOiBmYWxsYmFja0RhdGEudGFibGVzCiAgICAgICAgfTsKICAgICAgfQogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFRydWVUeXBlIENvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiJHtmb250TmFtZX0iIGZvbnQuYCk7CiAgICB9CiAgICBmdW5jdGlvbiByZWFkQ21hcFRhYmxlKGNtYXAsIGZpbGUsIGlzU3ltYm9saWNGb250LCBoYXNFbmNvZGluZykgewogICAgICBpZiAoIWNtYXApIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIk5vIGNtYXAgdGFibGUgYXZhaWxhYmxlLiIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgbGV0IHNlZ21lbnQ7CiAgICAgIGxldCBzdGFydCA9IChmaWxlLnN0YXJ0IHx8IDApICsgY21hcC5vZmZzZXQ7CiAgICAgIGZpbGUucG9zID0gc3RhcnQ7CiAgICAgIGZpbGUuc2tpcCgyKTsKICAgICAgY29uc3QgbnVtVGFibGVzID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgbGV0IHBvdGVudGlhbFRhYmxlOwogICAgICBsZXQgY2FuQnJlYWsgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICAgIGNvbnN0IHBsYXRmb3JtSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIGNvbnN0IGVuY29kaW5nSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIGNvbnN0IG9mZnNldCA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBsZXQgdXNlVGFibGUgPSBmYWxzZTsKICAgICAgICBpZiAocG90ZW50aWFsVGFibGU/LnBsYXRmb3JtSWQgPT09IHBsYXRmb3JtSWQgJiYgcG90ZW50aWFsVGFibGU/LmVuY29kaW5nSWQgPT09IGVuY29kaW5nSWQpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAocGxhdGZvcm1JZCA9PT0gMCAmJiAoZW5jb2RpbmdJZCA9PT0gMCB8fCBlbmNvZGluZ0lkID09PSAxIHx8IGVuY29kaW5nSWQgPT09IDMpKSB7CiAgICAgICAgICB1c2VUYWJsZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUlkID09PSAxICYmIGVuY29kaW5nSWQgPT09IDApIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKHBsYXRmb3JtSWQgPT09IDMgJiYgZW5jb2RpbmdJZCA9PT0gMSAmJiAoaGFzRW5jb2RpbmcgfHwgIXBvdGVudGlhbFRhYmxlKSkgewogICAgICAgICAgdXNlVGFibGUgPSB0cnVlOwogICAgICAgICAgaWYgKCFpc1N5bWJvbGljRm9udCkgewogICAgICAgICAgICBjYW5CcmVhayA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCAmJiBwbGF0Zm9ybUlkID09PSAzICYmIGVuY29kaW5nSWQgPT09IDApIHsKICAgICAgICAgIHVzZVRhYmxlID0gdHJ1ZTsKICAgICAgICAgIGxldCBjb3JyZWN0bHlTb3J0ZWQgPSB0cnVlOwogICAgICAgICAgaWYgKGkgPCBudW1UYWJsZXMgLSAxKSB7CiAgICAgICAgICAgIGNvbnN0IG5leHRCeXRlcyA9IGZpbGUucGVla0J5dGVzKDIpLAogICAgICAgICAgICAgIG5leHRQbGF0Zm9ybUlkID0gaW50MTYobmV4dEJ5dGVzWzBdLCBuZXh0Qnl0ZXNbMV0pOwogICAgICAgICAgICBpZiAobmV4dFBsYXRmb3JtSWQgPCBwbGF0Zm9ybUlkKSB7CiAgICAgICAgICAgICAgY29ycmVjdGx5U29ydGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb3JyZWN0bHlTb3J0ZWQpIHsKICAgICAgICAgICAgY2FuQnJlYWsgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodXNlVGFibGUpIHsKICAgICAgICAgIHBvdGVudGlhbFRhYmxlID0gewogICAgICAgICAgICBwbGF0Zm9ybUlkLAogICAgICAgICAgICBlbmNvZGluZ0lkLAogICAgICAgICAgICBvZmZzZXQKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChjYW5CcmVhaykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwb3RlbnRpYWxUYWJsZSkgewogICAgICAgIGZpbGUucG9zID0gc3RhcnQgKyBwb3RlbnRpYWxUYWJsZS5vZmZzZXQ7CiAgICAgIH0KICAgICAgaWYgKCFwb3RlbnRpYWxUYWJsZSB8fCBmaWxlLnBlZWtCeXRlKCkgPT09IC0xKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJDb3VsZCBub3QgZmluZCBhIHByZWZlcnJlZCBjbWFwIHRhYmxlLiIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3QgZm9ybWF0ID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgbGV0IGhhc1Nob3J0Q21hcCA9IGZhbHNlOwogICAgICBjb25zdCBtYXBwaW5ncyA9IFtdOwogICAgICBsZXQgaiwgZ2x5cGhJZDsKICAgICAgaWYgKGZvcm1hdCA9PT0gMCkgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CiAgICAgICAgICBjb25zdCBpbmRleCA9IGZpbGUuZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKCFpbmRleCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgZ2x5cGhJZDogaW5kZXgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBoYXNTaG9ydENtYXAgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMikgewogICAgICAgIGZpbGUuc2tpcCgyICsgMik7CiAgICAgICAgY29uc3Qgc3ViSGVhZGVyS2V5cyA9IFtdOwogICAgICAgIGxldCBtYXhTdWJIZWFkZXJLZXkgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgICAgIGNvbnN0IHN1YkhlYWRlcktleSA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMzsKICAgICAgICAgIHN1YkhlYWRlcktleXMucHVzaChzdWJIZWFkZXJLZXkpOwogICAgICAgICAgbWF4U3ViSGVhZGVyS2V5ID0gTWF0aC5tYXgoc3ViSGVhZGVyS2V5LCBtYXhTdWJIZWFkZXJLZXkpOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdWJIZWFkZXJzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4U3ViSGVhZGVyS2V5OyBpKyspIHsKICAgICAgICAgIHN1YkhlYWRlcnMucHVzaCh7CiAgICAgICAgICAgIGZpcnN0Q29kZTogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgZW50cnlDb3VudDogZmlsZS5nZXRVaW50MTYoKSwKICAgICAgICAgICAgaWREZWx0YTogc2lnbmVkSW50MTYoZmlsZS5nZXRCeXRlKCksIGZpbGUuZ2V0Qnl0ZSgpKSwKICAgICAgICAgICAgaWRSYW5nZVBvczogZmlsZS5wb3MgKyBmaWxlLmdldFVpbnQxNigpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICAgaWYgKHN1YkhlYWRlcktleXNbaV0gPT09IDApIHsKICAgICAgICAgICAgZmlsZS5wb3MgPSBzdWJIZWFkZXJzWzBdLmlkUmFuZ2VQb3MgKyAyICogaTsKICAgICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgIGNoYXJDb2RlOiBpLAogICAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBzID0gc3ViSGVhZGVyc1tzdWJIZWFkZXJLZXlzW2ldXTsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMuZW50cnlDb3VudDsgaisrKSB7CiAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGUgPSAoaSA8PCA4KSArIGogKyBzLmZpcnN0Q29kZTsKICAgICAgICAgICAgICBmaWxlLnBvcyA9IHMuaWRSYW5nZVBvcyArIDIgKiBqOwogICAgICAgICAgICAgIGdseXBoSWQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgICAgIGlmIChnbHlwaElkICE9PSAwKSB7CiAgICAgICAgICAgICAgICBnbHlwaElkID0gKGdseXBoSWQgKyBzLmlkRGVsdGEpICUgNjU1MzY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG1hcHBpbmdzLnB1c2goewogICAgICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSA0KSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyAyKTsKICAgICAgICBjb25zdCBzZWdDb3VudCA9IGZpbGUuZ2V0VWludDE2KCkgPj4gMTsKICAgICAgICBmaWxlLnNraXAoNik7CiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBbXTsKICAgICAgICBsZXQgc2VnSW5kZXg7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzLnB1c2goewogICAgICAgICAgICBlbmQ6IGZpbGUuZ2V0VWludDE2KCkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmaWxlLnNraXAoMik7CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnRzW3NlZ0luZGV4XS5zdGFydCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgfQogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50c1tzZWdJbmRleF0uZGVsdGEgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgIH0KICAgICAgICBsZXQgb2Zmc2V0c0NvdW50ID0gMCwKICAgICAgICAgIG9mZnNldEluZGV4OwogICAgICAgIGZvciAoc2VnSW5kZXggPSAwOyBzZWdJbmRleCA8IHNlZ0NvdW50OyBzZWdJbmRleCsrKSB7CiAgICAgICAgICBzZWdtZW50ID0gc2VnbWVudHNbc2VnSW5kZXhdOwogICAgICAgICAgY29uc3QgcmFuZ2VPZmZzZXQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICAgICAgaWYgKCFyYW5nZU9mZnNldCkgewogICAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gLTE7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgb2Zmc2V0SW5kZXggPSAocmFuZ2VPZmZzZXQgPj4gMSkgLSAoc2VnQ291bnQgLSBzZWdJbmRleCk7CiAgICAgICAgICBzZWdtZW50Lm9mZnNldEluZGV4ID0gb2Zmc2V0SW5kZXg7CiAgICAgICAgICBvZmZzZXRzQ291bnQgPSBNYXRoLm1heChvZmZzZXRzQ291bnQsIG9mZnNldEluZGV4ICsgc2VnbWVudC5lbmQgLSBzZWdtZW50LnN0YXJ0ICsgMSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9mZnNldHMgPSBbXTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2Zmc2V0c0NvdW50OyBqKyspIHsKICAgICAgICAgIG9mZnNldHMucHVzaChmaWxlLmdldFVpbnQxNigpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChzZWdJbmRleCA9IDA7IHNlZ0luZGV4IDwgc2VnQ291bnQ7IHNlZ0luZGV4KyspIHsKICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50c1tzZWdJbmRleF07CiAgICAgICAgICBzdGFydCA9IHNlZ21lbnQuc3RhcnQ7CiAgICAgICAgICBjb25zdCBlbmQgPSBzZWdtZW50LmVuZDsKICAgICAgICAgIGNvbnN0IGRlbHRhID0gc2VnbWVudC5kZWx0YTsKICAgICAgICAgIG9mZnNldEluZGV4ID0gc2VnbWVudC5vZmZzZXRJbmRleDsKICAgICAgICAgIGZvciAoaiA9IHN0YXJ0OyBqIDw9IGVuZDsgaisrKSB7CiAgICAgICAgICAgIGlmIChqID09PSAweGZmZmYpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbHlwaElkID0gb2Zmc2V0SW5kZXggPCAwID8gaiA6IG9mZnNldHNbb2Zmc2V0SW5kZXggKyBqIC0gc3RhcnRdOwogICAgICAgICAgICBnbHlwaElkID0gZ2x5cGhJZCArIGRlbHRhICYgMHhmZmZmOwogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZTogaiwKICAgICAgICAgICAgICBnbHlwaElkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDYpIHsKICAgICAgICBmaWxlLnNraXAoMiArIDIpOwogICAgICAgIGNvbnN0IGZpcnN0Q29kZSA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IGVudHJ5Q291bnQ7IGorKykgewogICAgICAgICAgZ2x5cGhJZCA9IGZpbGUuZ2V0VWludDE2KCk7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZSA9IGZpcnN0Q29kZSArIGo7CiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgY2hhckNvZGUsCiAgICAgICAgICAgIGdseXBoSWQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09IDEyKSB7CiAgICAgICAgZmlsZS5za2lwKDIgKyA0ICsgNCk7CiAgICAgICAgY29uc3Qgbkdyb3VwcyA9IGZpbGUuZ2V0SW50MzIoKSA+Pj4gMDsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkdyb3VwczsgaisrKSB7CiAgICAgICAgICBjb25zdCBzdGFydENoYXJDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgY29uc3QgZW5kQ2hhckNvZGUgPSBmaWxlLmdldEludDMyKCkgPj4+IDA7CiAgICAgICAgICBsZXQgZ2x5cGhDb2RlID0gZmlsZS5nZXRJbnQzMigpID4+PiAwOwogICAgICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSBzdGFydENoYXJDb2RlOyBjaGFyQ29kZSA8PSBlbmRDaGFyQ29kZTsgY2hhckNvZGUrKykgewogICAgICAgICAgICBtYXBwaW5ncy5wdXNoKHsKICAgICAgICAgICAgICBjaGFyQ29kZSwKICAgICAgICAgICAgICBnbHlwaElkOiBnbHlwaENvZGUrKwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJjbWFwIHRhYmxlIGhhcyB1bnN1cHBvcnRlZCBmb3JtYXQ6ICIgKyBmb3JtYXQpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwbGF0Zm9ybUlkOiAtMSwKICAgICAgICAgIGVuY29kaW5nSWQ6IC0xLAogICAgICAgICAgbWFwcGluZ3M6IFtdLAogICAgICAgICAgaGFzU2hvcnRDbWFwOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0KICAgICAgbWFwcGluZ3Muc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgIHJldHVybiBhLmNoYXJDb2RlIC0gYi5jaGFyQ29kZTsKICAgICAgfSk7CiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAobWFwcGluZ3NbaSAtIDFdLmNoYXJDb2RlID09PSBtYXBwaW5nc1tpXS5jaGFyQ29kZSkgewogICAgICAgICAgbWFwcGluZ3Muc3BsaWNlKGksIDEpOwogICAgICAgICAgaS0tOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHBsYXRmb3JtSWQ6IHBvdGVudGlhbFRhYmxlLnBsYXRmb3JtSWQsCiAgICAgICAgZW5jb2RpbmdJZDogcG90ZW50aWFsVGFibGUuZW5jb2RpbmdJZCwKICAgICAgICBtYXBwaW5ncywKICAgICAgICBoYXNTaG9ydENtYXAKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplTWV0cmljcyhmaWxlLCBoZWFkZXIsIG1ldHJpY3MsIGhlYWRUYWJsZSwgbnVtR2x5cGhzLCBkdXBGaXJzdEVudHJ5KSB7CiAgICAgIGlmICghaGVhZGVyKSB7CiAgICAgICAgaWYgKG1ldHJpY3MpIHsKICAgICAgICAgIG1ldHJpY3MuZGF0YSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmaWxlLnBvcyA9IChmaWxlLnN0YXJ0IHx8IDApICsgaGVhZGVyLm9mZnNldDsKICAgICAgZmlsZS5wb3MgKz0gNDsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgZmlsZS5wb3MgKz0gMjsKICAgICAgY29uc3QgY2FyZXRPZmZzZXQgPSBmaWxlLmdldFVpbnQxNigpOwogICAgICBmaWxlLnBvcyArPSA4OwogICAgICBmaWxlLnBvcyArPSAyOwogICAgICBsZXQgbnVtT2ZNZXRyaWNzID0gZmlsZS5nZXRVaW50MTYoKTsKICAgICAgaWYgKGNhcmV0T2Zmc2V0ICE9PSAwKSB7CiAgICAgICAgY29uc3QgbWFjU3R5bGUgPSBpbnQxNihoZWFkVGFibGUuZGF0YVs0NF0sIGhlYWRUYWJsZS5kYXRhWzQ1XSk7CiAgICAgICAgaWYgKCEobWFjU3R5bGUgJiAyKSkgewogICAgICAgICAgaGVhZGVyLmRhdGFbMjJdID0gMDsKICAgICAgICAgIGhlYWRlci5kYXRhWzIzXSA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChudW1PZk1ldHJpY3MgPiBudW1HbHlwaHMpIHsKICAgICAgICAoMCwgX3V0aWwuaW5mbykoYFRoZSBudW1PZk1ldHJpY3MgKCR7bnVtT2ZNZXRyaWNzfSkgc2hvdWxkIG5vdCBiZSBgICsgYGdyZWF0ZXIgdGhhbiB0aGUgbnVtR2x5cGhzICgke251bUdseXBoc30pLmApOwogICAgICAgIG51bU9mTWV0cmljcyA9IG51bUdseXBoczsKICAgICAgICBoZWFkZXIuZGF0YVszNF0gPSAobnVtT2ZNZXRyaWNzICYgMHhmZjAwKSA+PiA4OwogICAgICAgIGhlYWRlci5kYXRhWzM1XSA9IG51bU9mTWV0cmljcyAmIDB4MDBmZjsKICAgICAgfQogICAgICBjb25zdCBudW1PZlNpZGViZWFyaW5ncyA9IG51bUdseXBocyAtIG51bU9mTWV0cmljczsKICAgICAgY29uc3QgbnVtTWlzc2luZyA9IG51bU9mU2lkZWJlYXJpbmdzIC0gKG1ldHJpY3MubGVuZ3RoIC0gbnVtT2ZNZXRyaWNzICogNCA+PiAxKTsKICAgICAgaWYgKG51bU1pc3NpbmcgPiAwKSB7CiAgICAgICAgY29uc3QgZW50cmllcyA9IG5ldyBVaW50OEFycmF5KG1ldHJpY3MubGVuZ3RoICsgbnVtTWlzc2luZyAqIDIpOwogICAgICAgIGVudHJpZXMuc2V0KG1ldHJpY3MuZGF0YSk7CiAgICAgICAgaWYgKGR1cEZpcnN0RW50cnkpIHsKICAgICAgICAgIGVudHJpZXNbbWV0cmljcy5sZW5ndGhdID0gbWV0cmljcy5kYXRhWzJdOwogICAgICAgICAgZW50cmllc1ttZXRyaWNzLmxlbmd0aCArIDFdID0gbWV0cmljcy5kYXRhWzNdOwogICAgICAgIH0KICAgICAgICBtZXRyaWNzLmRhdGEgPSBlbnRyaWVzOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoKHNvdXJjZSwgc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgZGVzdCwgZGVzdFN0YXJ0LCBoaW50c1ZhbGlkKSB7CiAgICAgIGNvbnN0IGdseXBoUHJvZmlsZSA9IHsKICAgICAgICBsZW5ndGg6IDAsCiAgICAgICAgc2l6ZU9mSW5zdHJ1Y3Rpb25zOiAwCiAgICAgIH07CiAgICAgIGlmIChzb3VyY2VTdGFydCA8IDAgfHwgc291cmNlU3RhcnQgPj0gc291cmNlLmxlbmd0aCB8fCBzb3VyY2VFbmQgPiBzb3VyY2UubGVuZ3RoIHx8IHNvdXJjZUVuZCAtIHNvdXJjZVN0YXJ0IDw9IDEyKSB7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBjb25zdCBnbHlmID0gc291cmNlLnN1YmFycmF5KHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpOwogICAgICBjb25zdCB4TWluID0gc2lnbmVkSW50MTYoZ2x5ZlsyXSwgZ2x5ZlszXSk7CiAgICAgIGNvbnN0IHlNaW4gPSBzaWduZWRJbnQxNihnbHlmWzRdLCBnbHlmWzVdKTsKICAgICAgY29uc3QgeE1heCA9IHNpZ25lZEludDE2KGdseWZbNl0sIGdseWZbN10pOwogICAgICBjb25zdCB5TWF4ID0gc2lnbmVkSW50MTYoZ2x5Zls4XSwgZ2x5Zls5XSk7CiAgICAgIGlmICh4TWluID4geE1heCkgewogICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgMiwgeE1heCk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihnbHlmLCA2LCB4TWluKTsKICAgICAgfQogICAgICBpZiAoeU1pbiA+IHlNYXgpIHsKICAgICAgICB3cml0ZVNpZ25lZEludDE2KGdseWYsIDQsIHlNYXgpOwogICAgICAgIHdyaXRlU2lnbmVkSW50MTYoZ2x5ZiwgOCwgeU1pbik7CiAgICAgIH0KICAgICAgY29uc3QgY29udG91cnNDb3VudCA9IHNpZ25lZEludDE2KGdseWZbMF0sIGdseWZbMV0pOwogICAgICBpZiAoY29udG91cnNDb3VudCA8IDApIHsKICAgICAgICBpZiAoY29udG91cnNDb3VudCA8IC0xKSB7CiAgICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICAgIH0KICAgICAgICBkZXN0LnNldChnbHlmLCBkZXN0U3RhcnQpOwogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlmLmxlbmd0aDsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGxldCBpLAogICAgICAgIGogPSAxMCwKICAgICAgICBmbGFnc0NvdW50ID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRvdXJzQ291bnQ7IGkrKykgewogICAgICAgIGNvbnN0IGVuZFBvaW50ID0gZ2x5ZltqXSA8PCA4IHwgZ2x5ZltqICsgMV07CiAgICAgICAgZmxhZ3NDb3VudCA9IGVuZFBvaW50ICsgMTsKICAgICAgICBqICs9IDI7CiAgICAgIH0KICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zU3RhcnQgPSBqOwogICAgICBjb25zdCBpbnN0cnVjdGlvbnNMZW5ndGggPSBnbHlmW2pdIDw8IDggfCBnbHlmW2ogKyAxXTsKICAgICAgZ2x5cGhQcm9maWxlLnNpemVPZkluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uc0xlbmd0aDsKICAgICAgaiArPSAyICsgaW5zdHJ1Y3Rpb25zTGVuZ3RoOwogICAgICBjb25zdCBpbnN0cnVjdGlvbnNFbmQgPSBqOwogICAgICBsZXQgY29vcmRpbmF0ZXNMZW5ndGggPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgZmxhZ3NDb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgZmxhZyA9IGdseWZbaisrXTsKICAgICAgICBpZiAoZmxhZyAmIDB4YzApIHsKICAgICAgICAgIGdseWZbaiAtIDFdID0gZmxhZyAmIDB4M2Y7CiAgICAgICAgfQogICAgICAgIGxldCB4TGVuZ3RoID0gMjsKICAgICAgICBpZiAoZmxhZyAmIDIpIHsKICAgICAgICAgIHhMZW5ndGggPSAxOwogICAgICAgIH0gZWxzZSBpZiAoZmxhZyAmIDE2KSB7CiAgICAgICAgICB4TGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgbGV0IHlMZW5ndGggPSAyOwogICAgICAgIGlmIChmbGFnICYgNCkgewogICAgICAgICAgeUxlbmd0aCA9IDE7CiAgICAgICAgfSBlbHNlIGlmIChmbGFnICYgMzIpIHsKICAgICAgICAgIHlMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICBjb25zdCB4eUxlbmd0aCA9IHhMZW5ndGggKyB5TGVuZ3RoOwogICAgICAgIGNvb3JkaW5hdGVzTGVuZ3RoICs9IHh5TGVuZ3RoOwogICAgICAgIGlmIChmbGFnICYgOCkgewogICAgICAgICAgY29uc3QgcmVwZWF0ID0gZ2x5ZltqKytdOwogICAgICAgICAgaWYgKHJlcGVhdCA9PT0gMCkgewogICAgICAgICAgICBnbHlmW2ogLSAxXSBePSA4OwogICAgICAgICAgfQogICAgICAgICAgaSArPSByZXBlYXQ7CiAgICAgICAgICBjb29yZGluYXRlc0xlbmd0aCArPSByZXBlYXQgKiB4eUxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNvb3JkaW5hdGVzTGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBsZXQgZ2x5cGhEYXRhTGVuZ3RoID0gaiArIGNvb3JkaW5hdGVzTGVuZ3RoOwogICAgICBpZiAoZ2x5cGhEYXRhTGVuZ3RoID4gZ2x5Zi5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgICB9CiAgICAgIGlmICghaGludHNWYWxpZCAmJiBpbnN0cnVjdGlvbnNMZW5ndGggPiAwKSB7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheSgwLCBpbnN0cnVjdGlvbnNTdGFydCksIGRlc3RTdGFydCk7CiAgICAgICAgZGVzdC5zZXQoWzAsIDBdLCBkZXN0U3RhcnQgKyBpbnN0cnVjdGlvbnNTdGFydCk7CiAgICAgICAgZGVzdC5zZXQoZ2x5Zi5zdWJhcnJheShpbnN0cnVjdGlvbnNFbmQsIGdseXBoRGF0YUxlbmd0aCksIGRlc3RTdGFydCArIGluc3RydWN0aW9uc1N0YXJ0ICsgMik7CiAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoIC09IGluc3RydWN0aW9uc0xlbmd0aDsKICAgICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CiAgICAgICAgICBnbHlwaERhdGFMZW5ndGggPSBnbHlwaERhdGFMZW5ndGggKyAzICYgfjM7CiAgICAgICAgfQogICAgICAgIGdseXBoUHJvZmlsZS5sZW5ndGggPSBnbHlwaERhdGFMZW5ndGg7CiAgICAgICAgcmV0dXJuIGdseXBoUHJvZmlsZTsKICAgICAgfQogICAgICBpZiAoZ2x5Zi5sZW5ndGggLSBnbHlwaERhdGFMZW5ndGggPiAzKSB7CiAgICAgICAgZ2x5cGhEYXRhTGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoICsgMyAmIH4zOwogICAgICAgIGRlc3Quc2V0KGdseWYuc3ViYXJyYXkoMCwgZ2x5cGhEYXRhTGVuZ3RoKSwgZGVzdFN0YXJ0KTsKICAgICAgICBnbHlwaFByb2ZpbGUubGVuZ3RoID0gZ2x5cGhEYXRhTGVuZ3RoOwogICAgICAgIHJldHVybiBnbHlwaFByb2ZpbGU7CiAgICAgIH0KICAgICAgZGVzdC5zZXQoZ2x5ZiwgZGVzdFN0YXJ0KTsKICAgICAgZ2x5cGhQcm9maWxlLmxlbmd0aCA9IGdseWYubGVuZ3RoOwogICAgICByZXR1cm4gZ2x5cGhQcm9maWxlOwogICAgfQogICAgZnVuY3Rpb24gc2FuaXRpemVIZWFkKGhlYWQsIG51bUdseXBocywgbG9jYUxlbmd0aCkgewogICAgICBjb25zdCBkYXRhID0gaGVhZC5kYXRhOwogICAgICBjb25zdCB2ZXJzaW9uID0gaW50MzIoZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CiAgICAgIGlmICh2ZXJzaW9uID4+IDE2ICE9PSAxKSB7CiAgICAgICAgKDAsIF91dGlsLmluZm8pKCJBdHRlbXB0aW5nIHRvIGZpeCBpbnZhbGlkIHZlcnNpb24gaW4gaGVhZCB0YWJsZTogIiArIHZlcnNpb24pOwogICAgICAgIGRhdGFbMF0gPSAwOwogICAgICAgIGRhdGFbMV0gPSAxOwogICAgICAgIGRhdGFbMl0gPSAwOwogICAgICAgIGRhdGFbM10gPSAwOwogICAgICB9CiAgICAgIGNvbnN0IGluZGV4VG9Mb2NGb3JtYXQgPSBpbnQxNihkYXRhWzUwXSwgZGF0YVs1MV0pOwogICAgICBpZiAoaW5kZXhUb0xvY0Zvcm1hdCA8IDAgfHwgaW5kZXhUb0xvY0Zvcm1hdCA+IDEpIHsKICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkF0dGVtcHRpbmcgdG8gZml4IGludmFsaWQgaW5kZXhUb0xvY0Zvcm1hdCBpbiBoZWFkIHRhYmxlOiAiICsgaW5kZXhUb0xvY0Zvcm1hdCk7CiAgICAgICAgY29uc3QgbnVtR2x5cGhzUGx1c09uZSA9IG51bUdseXBocyArIDE7CiAgICAgICAgaWYgKGxvY2FMZW5ndGggPT09IG51bUdseXBoc1BsdXNPbmUgPDwgMSkgewogICAgICAgICAgZGF0YVs1MF0gPSAwOwogICAgICAgICAgZGF0YVs1MV0gPSAwOwogICAgICAgIH0gZWxzZSBpZiAobG9jYUxlbmd0aCA9PT0gbnVtR2x5cGhzUGx1c09uZSA8PCAyKSB7CiAgICAgICAgICBkYXRhWzUwXSA9IDA7CiAgICAgICAgICBkYXRhWzUxXSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQ291bGQgbm90IGZpeCBpbmRleFRvTG9jRm9ybWF0OiAiICsgaW5kZXhUb0xvY0Zvcm1hdCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKGxvY2EsIGdseWYsIG51bUdseXBocywgaXNHbHlwaExvY2F0aW9uc0xvbmcsIGhpbnRzVmFsaWQsIGR1cEZpcnN0RW50cnksIG1heFNpemVPZkluc3RydWN0aW9ucykgewogICAgICBsZXQgaXRlbVNpemUsIGl0ZW1EZWNvZGUsIGl0ZW1FbmNvZGU7CiAgICAgIGlmIChpc0dseXBoTG9jYXRpb25zTG9uZykgewogICAgICAgIGl0ZW1TaXplID0gNDsKICAgICAgICBpdGVtRGVjb2RlID0gZnVuY3Rpb24gZm9udEl0ZW1EZWNvZGVMb25nKGRhdGEsIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCAyNCB8IGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYgfCBkYXRhW29mZnNldCArIDJdIDw8IDggfCBkYXRhW29mZnNldCArIDNdOwogICAgICAgIH07CiAgICAgICAgaXRlbUVuY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRW5jb2RlTG9uZyhkYXRhLCBvZmZzZXQsIHZhbHVlKSB7CiAgICAgICAgICBkYXRhW29mZnNldF0gPSB2YWx1ZSA+Pj4gMjQgJiAweGZmOwogICAgICAgICAgZGF0YVtvZmZzZXQgKyAxXSA9IHZhbHVlID4+IDE2ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMl0gPSB2YWx1ZSA+PiA4ICYgMHhmZjsKICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgM10gPSB2YWx1ZSAmIDB4ZmY7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpdGVtU2l6ZSA9IDI7CiAgICAgICAgaXRlbURlY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRGVjb2RlKGRhdGEsIG9mZnNldCkgewogICAgICAgICAgcmV0dXJuIGRhdGFbb2Zmc2V0XSA8PCA5IHwgZGF0YVtvZmZzZXQgKyAxXSA8PCAxOwogICAgICAgIH07CiAgICAgICAgaXRlbUVuY29kZSA9IGZ1bmN0aW9uIGZvbnRJdGVtRW5jb2RlKGRhdGEsIG9mZnNldCwgdmFsdWUpIHsKICAgICAgICAgIGRhdGFbb2Zmc2V0XSA9IHZhbHVlID4+IDkgJiAweGZmOwogICAgICAgICAgZGF0YVtvZmZzZXQgKyAxXSA9IHZhbHVlID4+IDEgJiAweGZmOwogICAgICAgIH07CiAgICAgIH0KICAgICAgY29uc3QgbnVtR2x5cGhzT3V0ID0gZHVwRmlyc3RFbnRyeSA/IG51bUdseXBocyArIDEgOiBudW1HbHlwaHM7CiAgICAgIGNvbnN0IGxvY2FEYXRhU2l6ZSA9IGl0ZW1TaXplICogKDEgKyBudW1HbHlwaHNPdXQpOwogICAgICBjb25zdCBsb2NhRGF0YSA9IG5ldyBVaW50OEFycmF5KGxvY2FEYXRhU2l6ZSk7CiAgICAgIGxvY2FEYXRhLnNldChsb2NhLmRhdGEuc3ViYXJyYXkoMCwgbG9jYURhdGFTaXplKSk7CiAgICAgIGxvY2EuZGF0YSA9IGxvY2FEYXRhOwogICAgICBjb25zdCBvbGRHbHlmRGF0YSA9IGdseWYuZGF0YTsKICAgICAgY29uc3Qgb2xkR2x5ZkRhdGFMZW5ndGggPSBvbGRHbHlmRGF0YS5sZW5ndGg7CiAgICAgIGNvbnN0IG5ld0dseWZEYXRhID0gbmV3IFVpbnQ4QXJyYXkob2xkR2x5ZkRhdGFMZW5ndGgpOwogICAgICBsZXQgaSwgajsKICAgICAgY29uc3QgbG9jYUVudHJpZXMgPSBbXTsKICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBudW1HbHlwaHMgKyAxOyBpKyssIGogKz0gaXRlbVNpemUpIHsKICAgICAgICBsZXQgb2Zmc2V0ID0gaXRlbURlY29kZShsb2NhRGF0YSwgaik7CiAgICAgICAgaWYgKG9mZnNldCA+IG9sZEdseWZEYXRhTGVuZ3RoKSB7CiAgICAgICAgICBvZmZzZXQgPSBvbGRHbHlmRGF0YUxlbmd0aDsKICAgICAgICB9CiAgICAgICAgbG9jYUVudHJpZXMucHVzaCh7CiAgICAgICAgICBpbmRleDogaSwKICAgICAgICAgIG9mZnNldCwKICAgICAgICAgIGVuZE9mZnNldDogMAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGxvY2FFbnRyaWVzLnNvcnQoKGEsIGIpID0+IHsKICAgICAgICByZXR1cm4gYS5vZmZzZXQgLSBiLm9mZnNldDsKICAgICAgfSk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICAgIGxvY2FFbnRyaWVzW2ldLmVuZE9mZnNldCA9IGxvY2FFbnRyaWVzW2kgKyAxXS5vZmZzZXQ7CiAgICAgIH0KICAgICAgbG9jYUVudHJpZXMuc29ydCgoYSwgYikgPT4gewogICAgICAgIHJldHVybiBhLmluZGV4IC0gYi5pbmRleDsKICAgICAgfSk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIG9mZnNldCwKICAgICAgICAgIGVuZE9mZnNldAogICAgICAgIH0gPSBsb2NhRW50cmllc1tpXTsKICAgICAgICBpZiAob2Zmc2V0ICE9PSAwIHx8IGVuZE9mZnNldCAhPT0gMCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5leHRPZmZzZXQgPSBsb2NhRW50cmllc1tpICsgMV0ub2Zmc2V0OwogICAgICAgIGlmIChuZXh0T2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0ID0gbmV4dE9mZnNldDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCBtaXNzaW5nR2x5cGhzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGV0IHdyaXRlT2Zmc2V0ID0gMDsKICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgMCwgd3JpdGVPZmZzZXQpOwogICAgICBmb3IgKGkgPSAwLCBqID0gaXRlbVNpemU7IGkgPCBudW1HbHlwaHM7IGkrKywgaiArPSBpdGVtU2l6ZSkgewogICAgICAgIGNvbnN0IGdseXBoUHJvZmlsZSA9IHNhbml0aXplR2x5cGgob2xkR2x5ZkRhdGEsIGxvY2FFbnRyaWVzW2ldLm9mZnNldCwgbG9jYUVudHJpZXNbaV0uZW5kT2Zmc2V0LCBuZXdHbHlmRGF0YSwgd3JpdGVPZmZzZXQsIGhpbnRzVmFsaWQpOwogICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IGdseXBoUHJvZmlsZS5sZW5ndGg7CiAgICAgICAgaWYgKG5ld0xlbmd0aCA9PT0gMCkgewogICAgICAgICAgbWlzc2luZ0dseXBoc1tpXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zID4gbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSBnbHlwaFByb2ZpbGUuc2l6ZU9mSW5zdHJ1Y3Rpb25zOwogICAgICAgIH0KICAgICAgICB3cml0ZU9mZnNldCArPSBuZXdMZW5ndGg7CiAgICAgICAgaXRlbUVuY29kZShsb2NhRGF0YSwgaiwgd3JpdGVPZmZzZXQpOwogICAgICB9CiAgICAgIGlmICh3cml0ZU9mZnNldCA9PT0gMCkgewogICAgICAgIGNvbnN0IHNpbXBsZUdseXBoID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQ5LCAwXSk7CiAgICAgICAgZm9yIChpID0gMCwgaiA9IGl0ZW1TaXplOyBpIDwgbnVtR2x5cGhzT3V0OyBpKyssIGogKz0gaXRlbVNpemUpIHsKICAgICAgICAgIGl0ZW1FbmNvZGUobG9jYURhdGEsIGosIHNpbXBsZUdseXBoLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGdseWYuZGF0YSA9IHNpbXBsZUdseXBoOwogICAgICB9IGVsc2UgaWYgKGR1cEZpcnN0RW50cnkpIHsKICAgICAgICBjb25zdCBmaXJzdEVudHJ5TGVuZ3RoID0gaXRlbURlY29kZShsb2NhRGF0YSwgaXRlbVNpemUpOwogICAgICAgIGlmIChuZXdHbHlmRGF0YS5sZW5ndGggPiBmaXJzdEVudHJ5TGVuZ3RoICsgd3JpdGVPZmZzZXQpIHsKICAgICAgICAgIGdseWYuZGF0YSA9IG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdseWYuZGF0YSA9IG5ldyBVaW50OEFycmF5KGZpcnN0RW50cnlMZW5ndGggKyB3cml0ZU9mZnNldCk7CiAgICAgICAgICBnbHlmLmRhdGEuc2V0KG5ld0dseWZEYXRhLnN1YmFycmF5KDAsIHdyaXRlT2Zmc2V0KSk7CiAgICAgICAgfQogICAgICAgIGdseWYuZGF0YS5zZXQobmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgZmlyc3RFbnRyeUxlbmd0aCksIHdyaXRlT2Zmc2V0KTsKICAgICAgICBpdGVtRW5jb2RlKGxvY2EuZGF0YSwgbG9jYURhdGEubGVuZ3RoIC0gaXRlbVNpemUsIHdyaXRlT2Zmc2V0ICsgZmlyc3RFbnRyeUxlbmd0aCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2x5Zi5kYXRhID0gbmV3R2x5ZkRhdGEuc3ViYXJyYXkoMCwgd3JpdGVPZmZzZXQpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgbWlzc2luZ0dseXBocywKICAgICAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlYWRQb3N0U2NyaXB0VGFibGUocG9zdCwgcHJvcGVydGllc09iaiwgbWF4cE51bUdseXBocykgewogICAgICBjb25zdCBzdGFydCA9IChmb250LnN0YXJ0IHx8IDApICsgcG9zdC5vZmZzZXQ7CiAgICAgIGZvbnQucG9zID0gc3RhcnQ7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHBvc3QubGVuZ3RoLAogICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICBjb25zdCB2ZXJzaW9uID0gZm9udC5nZXRJbnQzMigpOwogICAgICBmb250LnNraXAoMjgpOwogICAgICBsZXQgZ2x5cGhOYW1lczsKICAgICAgbGV0IHZhbGlkID0gdHJ1ZTsKICAgICAgbGV0IGk7CiAgICAgIHN3aXRjaCAodmVyc2lvbikgewogICAgICAgIGNhc2UgMHgwMDAxMDAwMDoKICAgICAgICAgIGdseXBoTmFtZXMgPSBfZm9udHNfdXRpbHMuTWFjU3RhbmRhcmRHbHlwaE9yZGVyaW5nOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAwMDIwMDAwOgogICAgICAgICAgY29uc3QgbnVtR2x5cGhzID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgICAgIGlmIChudW1HbHlwaHMgIT09IG1heHBOdW1HbHlwaHMpIHsKICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBnbHlwaE5hbWVJbmRleGVzID0gW107CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSBmb250LmdldFVpbnQxNigpOwogICAgICAgICAgICBpZiAoaW5kZXggPj0gMzI3NjgpIHsKICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdseXBoTmFtZUluZGV4ZXMucHVzaChpbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgY3VzdG9tTmFtZXMgPSBbXSwKICAgICAgICAgICAgc3RyQnVmID0gW107CiAgICAgICAgICB3aGlsZSAoZm9udC5wb3MgPCBlbmQpIHsKICAgICAgICAgICAgY29uc3Qgc3RyaW5nTGVuZ3RoID0gZm9udC5nZXRCeXRlKCk7CiAgICAgICAgICAgIHN0ckJ1Zi5sZW5ndGggPSBzdHJpbmdMZW5ndGg7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdMZW5ndGg7ICsraSkgewogICAgICAgICAgICAgIHN0ckJ1ZltpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nZXRCeXRlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1c3RvbU5hbWVzLnB1c2goc3RyQnVmLmpvaW4oIiIpKTsKICAgICAgICAgIH0KICAgICAgICAgIGdseXBoTmFtZXMgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgewogICAgICAgICAgICBjb25zdCBqID0gZ2x5cGhOYW1lSW5kZXhlc1tpXTsKICAgICAgICAgICAgaWYgKGogPCAyNTgpIHsKICAgICAgICAgICAgICBnbHlwaE5hbWVzLnB1c2goX2ZvbnRzX3V0aWxzLk1hY1N0YW5kYXJkR2x5cGhPcmRlcmluZ1tqXSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2x5cGhOYW1lcy5wdXNoKGN1c3RvbU5hbWVzW2ogLSAyNThdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMDAzMDAwMDoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlVua25vd24vdW5zdXBwb3J0ZWQgcG9zdCB0YWJsZSB2ZXJzaW9uICIgKyB2ZXJzaW9uKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICBpZiAocHJvcGVydGllc09iai5kZWZhdWx0RW5jb2RpbmcpIHsKICAgICAgICAgICAgZ2x5cGhOYW1lcyA9IHByb3BlcnRpZXNPYmouZGVmYXVsdEVuY29kaW5nOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcHJvcGVydGllc09iai5nbHlwaE5hbWVzID0gZ2x5cGhOYW1lczsKICAgICAgcmV0dXJuIHZhbGlkOwogICAgfQogICAgZnVuY3Rpb24gcmVhZE5hbWVUYWJsZShuYW1lVGFibGUpIHsKICAgICAgY29uc3Qgc3RhcnQgPSAoZm9udC5zdGFydCB8fCAwKSArIG5hbWVUYWJsZS5vZmZzZXQ7CiAgICAgIGZvbnQucG9zID0gc3RhcnQ7CiAgICAgIGNvbnN0IG5hbWVzID0gW1tdLCBbXV0sCiAgICAgICAgcmVjb3JkcyA9IFtdOwogICAgICBjb25zdCBsZW5ndGggPSBuYW1lVGFibGUubGVuZ3RoLAogICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwogICAgICBjb25zdCBmb3JtYXQgPSBmb250LmdldFVpbnQxNigpOwogICAgICBjb25zdCBGT1JNQVRfMF9IRUFERVJfTEVOR1RIID0gNjsKICAgICAgaWYgKGZvcm1hdCAhPT0gMCB8fCBsZW5ndGggPCBGT1JNQVRfMF9IRUFERVJfTEVOR1RIKSB7CiAgICAgICAgcmV0dXJuIFtuYW1lcywgcmVjb3Jkc107CiAgICAgIH0KICAgICAgY29uc3QgbnVtUmVjb3JkcyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IHN0cmluZ3NTdGFydCA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICAgIGNvbnN0IE5BTUVfUkVDT1JEX0xFTkdUSCA9IDEyOwogICAgICBsZXQgaSwgaWk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWNvcmRzICYmIGZvbnQucG9zICsgTkFNRV9SRUNPUkRfTEVOR1RIIDw9IGVuZDsgaSsrKSB7CiAgICAgICAgY29uc3QgciA9IHsKICAgICAgICAgIHBsYXRmb3JtOiBmb250LmdldFVpbnQxNigpLAogICAgICAgICAgZW5jb2Rpbmc6IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBsYW5ndWFnZTogZm9udC5nZXRVaW50MTYoKSwKICAgICAgICAgIG5hbWU6IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBsZW5ndGg6IGZvbnQuZ2V0VWludDE2KCksCiAgICAgICAgICBvZmZzZXQ6IGZvbnQuZ2V0VWludDE2KCkKICAgICAgICB9OwogICAgICAgIGlmIChpc01hY05hbWVSZWNvcmQocikgfHwgaXNXaW5OYW1lUmVjb3JkKHIpKSB7CiAgICAgICAgICByZWNvcmRzLnB1c2gocik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAoaSA9IDAsIGlpID0gcmVjb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgcmVjb3JkID0gcmVjb3Jkc1tpXTsKICAgICAgICBpZiAocmVjb3JkLmxlbmd0aCA8PSAwKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcG9zID0gc3RhcnQgKyBzdHJpbmdzU3RhcnQgKyByZWNvcmQub2Zmc2V0OwogICAgICAgIGlmIChwb3MgKyByZWNvcmQubGVuZ3RoID4gZW5kKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZm9udC5wb3MgPSBwb3M7CiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gcmVjb3JkLm5hbWU7CiAgICAgICAgaWYgKHJlY29yZC5lbmNvZGluZykgewogICAgICAgICAgbGV0IHN0ciA9ICIiOwogICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gcmVjb3JkLmxlbmd0aDsgaiA8IGpqOyBqICs9IDIpIHsKICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nZXRVaW50MTYoKSk7CiAgICAgICAgICB9CiAgICAgICAgICBuYW1lc1sxXVtuYW1lSW5kZXhdID0gc3RyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuYW1lc1swXVtuYW1lSW5kZXhdID0gZm9udC5nZXRTdHJpbmcocmVjb3JkLmxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBbbmFtZXMsIHJlY29yZHNdOwogICAgfQogICAgY29uc3QgVFRPcHNTdGFja0RlbHRhcyA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMiwgLTIsIC0yLCAtMiwgMCwgMCwgLTIsIC01LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSwgMSwgLTEsIC05OTksIDAsIDEsIDAsIC0xLCAtMiwgMCwgLTEsIC0yLCAtMSwgLTEsIDAsIC0xLCAtMSwgMCwgMCwgLTk5OSwgLTk5OSwgLTEsIC0xLCAtMSwgLTEsIC0yLCAtOTk5LCAtMiwgLTIsIC05OTksIDAsIC0yLCAtMiwgMCwgMCwgLTIsIDAsIC0yLCAwLCAwLCAwLCAtMiwgLTEsIC0xLCAxLCAxLCAwLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAtMSwgMCwgLTk5OSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTIsIC05OTksIC05OTksIC05OTksIC05OTksIC05OTksIC0xLCAtMSwgLTIsIC0yLCAwLCAwLCAwLCAwLCAtMSwgLTEsIC05OTksIC0yLCAtMiwgMCwgMCwgLTEsIC0yLCAtMiwgMCwgMCwgMCwgLTEsIC0xLCAtMSwgLTJdOwogICAgZnVuY3Rpb24gc2FuaXRpemVUVFByb2dyYW0odGFibGUsIHR0Q29udGV4dCkgewogICAgICBsZXQgZGF0YSA9IHRhYmxlLmRhdGE7CiAgICAgIGxldCBpID0gMCwKICAgICAgICBqLAogICAgICAgIG4sCiAgICAgICAgYiwKICAgICAgICBmdW5jSWQsCiAgICAgICAgcGMsCiAgICAgICAgbGFzdEVuZGYgPSAwLAogICAgICAgIGxhc3REZWZmID0gMDsKICAgICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgICAgY29uc3QgY2FsbHN0YWNrID0gW107CiAgICAgIGNvbnN0IGZ1bmN0aW9uc0NhbGxlZCA9IFtdOwogICAgICBsZXQgdG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zID0gdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKICAgICAgbGV0IGluRkRFRiA9IGZhbHNlLAogICAgICAgIGlmTGV2ZWwgPSAwLAogICAgICAgIGluRUxTRSA9IDA7CiAgICAgIGZvciAobGV0IGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTspIHsKICAgICAgICBjb25zdCBvcCA9IGRhdGFbaSsrXTsKICAgICAgICBpZiAob3AgPT09IDB4NDApIHsKICAgICAgICAgIG4gPSBkYXRhW2krK107CiAgICAgICAgICBpZiAoaW5GREVGIHx8IGluRUxTRSkgewogICAgICAgICAgICBpICs9IG47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2krK10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg0MSkgewogICAgICAgICAgbiA9IGRhdGFbaSsrXTsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIGkgKz0gbiAqIDI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgYiA9IGRhdGFbaSsrXTsKICAgICAgICAgICAgICBzdGFjay5wdXNoKGIgPDwgOCB8IGRhdGFbaSsrXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZjgpID09PSAweGIwKSB7CiAgICAgICAgICBuID0gb3AgLSAweGIwICsgMTsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIGkgKz0gbjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICBzdGFjay5wdXNoKGRhdGFbaSsrXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKChvcCAmIDB4ZjgpID09PSAweGI4KSB7CiAgICAgICAgICBuID0gb3AgLSAweGI4ICsgMTsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgIGkgKz0gbiAqIDI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgYiA9IGRhdGFbaSsrXTsKICAgICAgICAgICAgICBzdGFjay5wdXNoKGIgPDwgOCB8IGRhdGFbaSsrXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJiICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKICAgICAgICAgIGlmICghaW5GREVGICYmICFpbkVMU0UpIHsKICAgICAgICAgICAgZnVuY0lkID0gc3RhY2suYXQoLTEpOwogICAgICAgICAgICBpZiAoaXNOYU4oZnVuY0lkKSkgewogICAgICAgICAgICAgICgwLCBfdXRpbC5pbmZvKSgiVFQ6IENBTEwgZW1wdHkgc3RhY2sgKG9yIGludmFsaWQgZW50cnkpLiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNVc2VkW2Z1bmNJZF0gPSB0cnVlOwogICAgICAgICAgICAgIGlmIChmdW5jSWQgaW4gdHRDb250ZXh0LmZ1bmN0aW9uc1N0YWNrRGVsdGFzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGFja0xlbmd0aCA9IHN0YWNrLmxlbmd0aCArIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tmdW5jSWRdOwogICAgICAgICAgICAgICAgaWYgKG5ld1N0YWNrTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBDQUxMIGludmFsaWQgZnVuY3Rpb25zIHN0YWNrIGRlbHRhLiIpOwogICAgICAgICAgICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPSBuZXdTdGFja0xlbmd0aDsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZ1bmNJZCBpbiB0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZCAmJiAhZnVuY3Rpb25zQ2FsbGVkLmluY2x1ZGVzKGZ1bmNJZCkpIHsKICAgICAgICAgICAgICAgIGNhbGxzdGFjay5wdXNoKHsKICAgICAgICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgICAgICAgaSwKICAgICAgICAgICAgICAgICAgc3RhY2tUb3A6IHN0YWNrLmxlbmd0aCAtIDEKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb25zQ2FsbGVkLnB1c2goZnVuY0lkKTsKICAgICAgICAgICAgICAgIHBjID0gdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXTsKICAgICAgICAgICAgICAgIGlmICghcGMpIHsKICAgICAgICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogQ0FMTCBub24tZXhpc3RlbnQgZnVuY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YSA9IHBjLmRhdGE7CiAgICAgICAgICAgICAgICBpID0gcGMuaTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJjICYmICF0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMpIHsKICAgICAgICAgIGlmIChpbkZERUYgfHwgaW5FTFNFKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IG5lc3RlZCBGREVGcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICB0b29Db21wbGV4VG9Gb2xsb3dGdW5jdGlvbnMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaW5GREVGID0gdHJ1ZTsKICAgICAgICAgIGxhc3REZWZmID0gaTsKICAgICAgICAgIGZ1bmNJZCA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbZnVuY0lkXSA9IHsKICAgICAgICAgICAgZGF0YSwKICAgICAgICAgICAgaQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDJkKSB7CiAgICAgICAgICBpZiAoaW5GREVGKSB7CiAgICAgICAgICAgIGluRkRFRiA9IGZhbHNlOwogICAgICAgICAgICBsYXN0RW5kZiA9IGk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYyA9IGNhbGxzdGFjay5wb3AoKTsKICAgICAgICAgICAgaWYgKCFwYykgewogICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IEVOREYgYmFkIHN0YWNrIik7CiAgICAgICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY0lkID0gZnVuY3Rpb25zQ2FsbGVkLnBvcCgpOwogICAgICAgICAgICBkYXRhID0gcGMuZGF0YTsKICAgICAgICAgICAgaSA9IHBjLmk7CiAgICAgICAgICAgIHR0Q29udGV4dC5mdW5jdGlvbnNTdGFja0RlbHRhc1tmdW5jSWRdID0gc3RhY2subGVuZ3RoIC0gcGMuc3RhY2tUb3A7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcCA9PT0gMHg4OSkgewogICAgICAgICAgaWYgKGluRkRFRiB8fCBpbkVMU0UpIHsKICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJUVDogbmVzdGVkIElERUZzIG5vdCBhbGxvd2VkIik7CiAgICAgICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpbkZERUYgPSB0cnVlOwogICAgICAgICAgbGFzdERlZmYgPSBpOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTgpIHsKICAgICAgICAgICsraWZMZXZlbDsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDFiKSB7CiAgICAgICAgICBpbkVMU0UgPSBpZkxldmVsOwogICAgICAgIH0gZWxzZSBpZiAob3AgPT09IDB4NTkpIHsKICAgICAgICAgIGlmIChpbkVMU0UgPT09IGlmTGV2ZWwpIHsKICAgICAgICAgICAgaW5FTFNFID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIC0taWZMZXZlbDsKICAgICAgICB9IGVsc2UgaWYgKG9wID09PSAweDFjKSB7CiAgICAgICAgICBpZiAoIWluRkRFRiAmJiAhaW5FTFNFKSB7CiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHN0YWNrLmF0KC0xKTsKICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKICAgICAgICAgICAgICBpICs9IG9mZnNldCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFpbkZERUYgJiYgIWluRUxTRSkgewogICAgICAgICAgbGV0IHN0YWNrRGVsdGEgPSAwOwogICAgICAgICAgaWYgKG9wIDw9IDB4OGUpIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IFRUT3BzU3RhY2tEZWx0YXNbb3BdOwogICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGMwICYmIG9wIDw9IDB4ZGYpIHsKICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC0xOwogICAgICAgICAgfSBlbHNlIGlmIChvcCA+PSAweGUwKSB7CiAgICAgICAgICAgIHN0YWNrRGVsdGEgPSAtMjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcCA+PSAweDcxICYmIG9wIDw9IDB4NzUpIHsKICAgICAgICAgICAgbiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBpZiAoIWlzTmFOKG4pKSB7CiAgICAgICAgICAgICAgc3RhY2tEZWx0YSA9IC1uICogMjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrRGVsdGEgPCAwICYmIHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHN0YWNrRGVsdGErKzsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChzdGFja0RlbHRhID4gMCkgewogICAgICAgICAgICBzdGFjay5wdXNoKE5hTik7CiAgICAgICAgICAgIHN0YWNrRGVsdGEtLTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdHRDb250ZXh0LnRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9ucyA9IHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczsKICAgICAgY29uc3QgY29udGVudCA9IFtkYXRhXTsKICAgICAgaWYgKGkgPiBkYXRhLmxlbmd0aCkgewogICAgICAgIGNvbnRlbnQucHVzaChuZXcgVWludDhBcnJheShpIC0gZGF0YS5sZW5ndGgpKTsKICAgICAgfQogICAgICBpZiAobGFzdERlZmYgPiBsYXN0RW5kZikgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IGNvbXBsZW1lbnRpbmcgYSBtaXNzaW5nIGZ1bmN0aW9uIHRhaWwiKTsKICAgICAgICBjb250ZW50LnB1c2gobmV3IFVpbnQ4QXJyYXkoWzB4MjIsIDB4MmRdKSk7CiAgICAgIH0KICAgICAgZm9sZFRUVGFibGUodGFibGUsIGNvbnRlbnQpOwogICAgfQogICAgZnVuY3Rpb24gY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKSB7CiAgICAgIGlmICh0dENvbnRleHQudG9vQ29tcGxleFRvRm9sbG93RnVuY3Rpb25zKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zRGVmaW5lZC5sZW5ndGggPiBtYXhGdW5jdGlvbkRlZnMpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIlRUOiBtb3JlIGZ1bmN0aW9ucyBkZWZpbmVkIHRoYW4gZXhwZWN0ZWQiKTsKICAgICAgICB0dENvbnRleHQuaGludHNWYWxpZCA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMCwgamogPSB0dENvbnRleHQuZnVuY3Rpb25zVXNlZC5sZW5ndGg7IGogPCBqajsgaisrKSB7CiAgICAgICAgaWYgKGogPiBtYXhGdW5jdGlvbkRlZnMpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IGludmFsaWQgZnVuY3Rpb24gaWQ6ICIgKyBqKTsKICAgICAgICAgIHR0Q29udGV4dC5oaW50c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0dENvbnRleHQuZnVuY3Rpb25zVXNlZFtqXSAmJiAhdHRDb250ZXh0LmZ1bmN0aW9uc0RlZmluZWRbal0pIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiVFQ6IHVuZGVmaW5lZCBmdW5jdGlvbjogIiArIGopOwogICAgICAgICAgdHRDb250ZXh0LmhpbnRzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZvbGRUVFRhYmxlKHRhYmxlLCBjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDEpIHsKICAgICAgICBsZXQgbmV3TGVuZ3RoID0gMDsKICAgICAgICBsZXQgaiwgamo7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIG5ld0xlbmd0aCArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgbmV3TGVuZ3RoID0gbmV3TGVuZ3RoICsgMyAmIH4zOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KG5ld0xlbmd0aCk7CiAgICAgICAgbGV0IHBvcyA9IDA7CiAgICAgICAgZm9yIChqID0gMCwgamogPSBjb250ZW50Lmxlbmd0aDsgaiA8IGpqOyBqKyspIHsKICAgICAgICAgIHJlc3VsdC5zZXQoY29udGVudFtqXSwgcG9zKTsKICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgdGFibGUuZGF0YSA9IHJlc3VsdDsKICAgICAgICB0YWJsZS5sZW5ndGggPSBuZXdMZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNhbml0aXplVFRQcm9ncmFtcyhmcGdtLCBwcmVwLCBjdnQsIG1heEZ1bmN0aW9uRGVmcykgewogICAgICBjb25zdCB0dENvbnRleHQgPSB7CiAgICAgICAgZnVuY3Rpb25zRGVmaW5lZDogW10sCiAgICAgICAgZnVuY3Rpb25zVXNlZDogW10sCiAgICAgICAgZnVuY3Rpb25zU3RhY2tEZWx0YXM6IFtdLAogICAgICAgIHRvb0NvbXBsZXhUb0ZvbGxvd0Z1bmN0aW9uczogZmFsc2UsCiAgICAgICAgaGludHNWYWxpZDogdHJ1ZQogICAgICB9OwogICAgICBpZiAoZnBnbSkgewogICAgICAgIHNhbml0aXplVFRQcm9ncmFtKGZwZ20sIHR0Q29udGV4dCk7CiAgICAgIH0KICAgICAgaWYgKHByZXApIHsKICAgICAgICBzYW5pdGl6ZVRUUHJvZ3JhbShwcmVwLCB0dENvbnRleHQpOwogICAgICB9CiAgICAgIGlmIChmcGdtKSB7CiAgICAgICAgY2hlY2tJbnZhbGlkRnVuY3Rpb25zKHR0Q29udGV4dCwgbWF4RnVuY3Rpb25EZWZzKTsKICAgICAgfQogICAgICBpZiAoY3Z0ICYmIGN2dC5sZW5ndGggJiAxKSB7CiAgICAgICAgY29uc3QgY3Z0RGF0YSA9IG5ldyBVaW50OEFycmF5KGN2dC5sZW5ndGggKyAxKTsKICAgICAgICBjdnREYXRhLnNldChjdnQuZGF0YSk7CiAgICAgICAgY3Z0LmRhdGEgPSBjdnREYXRhOwogICAgICB9CiAgICAgIHJldHVybiB0dENvbnRleHQuaGludHNWYWxpZDsKICAgIH0KICAgIGZvbnQgPSBuZXcgX3N0cmVhbS5TdHJlYW0obmV3IFVpbnQ4QXJyYXkoZm9udC5nZXRCeXRlcygpKSk7CiAgICBsZXQgaGVhZGVyLCB0YWJsZXM7CiAgICBpZiAoaXNUcnVlVHlwZUNvbGxlY3Rpb25GaWxlKGZvbnQpKSB7CiAgICAgIGNvbnN0IHR0Y0RhdGEgPSByZWFkVHJ1ZVR5cGVDb2xsZWN0aW9uRGF0YShmb250LCB0aGlzLm5hbWUpOwogICAgICBoZWFkZXIgPSB0dGNEYXRhLmhlYWRlcjsKICAgICAgdGFibGVzID0gdHRjRGF0YS50YWJsZXM7CiAgICB9IGVsc2UgewogICAgICBoZWFkZXIgPSByZWFkT3BlblR5cGVIZWFkZXIoZm9udCk7CiAgICAgIHRhYmxlcyA9IHJlYWRUYWJsZXMoZm9udCwgaGVhZGVyLm51bVRhYmxlcyk7CiAgICB9CiAgICBsZXQgY2ZmLCBjZmZGaWxlOwogICAgY29uc3QgaXNUcnVlVHlwZSA9ICF0YWJsZXNbIkNGRiAiXTsKICAgIGlmICghaXNUcnVlVHlwZSkgewogICAgICBjb25zdCBpc0NvbXBvc2l0ZSA9IHByb3BlcnRpZXMuY29tcG9zaXRlICYmIChwcm9wZXJ0aWVzLmNpZFRvR2lkTWFwPy5sZW5ndGggPiAwIHx8ICEocHJvcGVydGllcy5jTWFwIGluc3RhbmNlb2YgX2NtYXAuSWRlbnRpdHlDTWFwKSk7CiAgICAgIGlmIChoZWFkZXIudmVyc2lvbiA9PT0gIk9UVE8iICYmICFpc0NvbXBvc2l0ZSB8fCAhdGFibGVzLmhlYWQgfHwgIXRhYmxlcy5oaGVhIHx8ICF0YWJsZXMubWF4cCB8fCAhdGFibGVzLnBvc3QpIHsKICAgICAgICBjZmZGaWxlID0gbmV3IF9zdHJlYW0uU3RyZWFtKHRhYmxlc1siQ0ZGICJdLmRhdGEpOwogICAgICAgIGNmZiA9IG5ldyBfY2ZmX2ZvbnQuQ0ZGRm9udChjZmZGaWxlLCBwcm9wZXJ0aWVzKTsKICAgICAgICBhZGp1c3RXaWR0aHMocHJvcGVydGllcyk7CiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydChuYW1lLCBjZmYsIHByb3BlcnRpZXMpOwogICAgICB9CiAgICAgIGRlbGV0ZSB0YWJsZXMuZ2x5ZjsKICAgICAgZGVsZXRlIHRhYmxlcy5sb2NhOwogICAgICBkZWxldGUgdGFibGVzLmZwZ207CiAgICAgIGRlbGV0ZSB0YWJsZXMucHJlcDsKICAgICAgZGVsZXRlIHRhYmxlc1siY3Z0ICJdOwogICAgICB0aGlzLmlzT3BlblR5cGUgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCF0YWJsZXMubG9jYSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcignUmVxdWlyZWQgImxvY2EiIHRhYmxlIGlzIG5vdCBmb3VuZCcpOwogICAgICB9CiAgICAgIGlmICghdGFibGVzLmdseWYpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoJ1JlcXVpcmVkICJnbHlmIiB0YWJsZSBpcyBub3QgZm91bmQgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7CiAgICAgICAgdGFibGVzLmdseWYgPSB7CiAgICAgICAgICB0YWc6ICJnbHlmIiwKICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDApCiAgICAgICAgfTsKICAgICAgfQogICAgICB0aGlzLmlzT3BlblR5cGUgPSBmYWxzZTsKICAgIH0KICAgIGlmICghdGFibGVzLm1heHApIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCdSZXF1aXJlZCAibWF4cCIgdGFibGUgaXMgbm90IGZvdW5kJyk7CiAgICB9CiAgICBmb250LnBvcyA9IChmb250LnN0YXJ0IHx8IDApICsgdGFibGVzLm1heHAub2Zmc2V0OwogICAgY29uc3QgdmVyc2lvbiA9IGZvbnQuZ2V0SW50MzIoKTsKICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQuZ2V0VWludDE2KCk7CiAgICBpZiAocHJvcGVydGllcy5zY2FsZUZhY3RvcnM/Lmxlbmd0aCA9PT0gbnVtR2x5cGhzICYmIGlzVHJ1ZVR5cGUpIHsKICAgICAgY29uc3QgewogICAgICAgIHNjYWxlRmFjdG9ycwogICAgICB9ID0gcHJvcGVydGllczsKICAgICAgY29uc3QgaXNHbHlwaExvY2F0aW9uc0xvbmcgPSBpbnQxNih0YWJsZXMuaGVhZC5kYXRhWzUwXSwgdGFibGVzLmhlYWQuZGF0YVs1MV0pOwogICAgICBjb25zdCBnbHlwaHMgPSBuZXcgX2dseWYuR2x5ZlRhYmxlKHsKICAgICAgICBnbHlmVGFibGU6IHRhYmxlcy5nbHlmLmRhdGEsCiAgICAgICAgaXNHbHlwaExvY2F0aW9uc0xvbmcsCiAgICAgICAgbG9jYVRhYmxlOiB0YWJsZXMubG9jYS5kYXRhLAogICAgICAgIG51bUdseXBocwogICAgICB9KTsKICAgICAgZ2x5cGhzLnNjYWxlKHNjYWxlRmFjdG9ycyk7CiAgICAgIGNvbnN0IHsKICAgICAgICBnbHlmLAogICAgICAgIGxvY2EsCiAgICAgICAgaXNMb2NhdGlvbkxvbmcKICAgICAgfSA9IGdseXBocy53cml0ZSgpOwogICAgICB0YWJsZXMuZ2x5Zi5kYXRhID0gZ2x5ZjsKICAgICAgdGFibGVzLmxvY2EuZGF0YSA9IGxvY2E7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZyAhPT0gISFpc0dseXBoTG9jYXRpb25zTG9uZykgewogICAgICAgIHRhYmxlcy5oZWFkLmRhdGFbNTBdID0gMDsKICAgICAgICB0YWJsZXMuaGVhZC5kYXRhWzUxXSA9IGlzTG9jYXRpb25Mb25nID8gMSA6IDA7CiAgICAgIH0KICAgICAgY29uc3QgbWV0cmljcyA9IHRhYmxlcy5obXR4LmRhdGE7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyBpKyspIHsKICAgICAgICBjb25zdCBqID0gNCAqIGk7CiAgICAgICAgY29uc3QgYWR2YW5jZVdpZHRoID0gTWF0aC5yb3VuZChzY2FsZUZhY3RvcnNbaV0gKiBpbnQxNihtZXRyaWNzW2pdLCBtZXRyaWNzW2ogKyAxXSkpOwogICAgICAgIG1ldHJpY3Nbal0gPSBhZHZhbmNlV2lkdGggPj4gOCAmIDB4ZmY7CiAgICAgICAgbWV0cmljc1tqICsgMV0gPSBhZHZhbmNlV2lkdGggJiAweGZmOwogICAgICAgIGNvbnN0IGxzYiA9IE1hdGgucm91bmQoc2NhbGVGYWN0b3JzW2ldICogc2lnbmVkSW50MTYobWV0cmljc1tqICsgMl0sIG1ldHJpY3NbaiArIDNdKSk7CiAgICAgICAgd3JpdGVTaWduZWRJbnQxNihtZXRyaWNzLCBqICsgMiwgbHNiKTsKICAgICAgfQogICAgfQogICAgbGV0IG51bUdseXBoc091dCA9IG51bUdseXBocyArIDE7CiAgICBsZXQgZHVwRmlyc3RFbnRyeSA9IHRydWU7CiAgICBpZiAobnVtR2x5cGhzT3V0ID4gMHhmZmZmKSB7CiAgICAgIGR1cEZpcnN0RW50cnkgPSBmYWxzZTsKICAgICAgbnVtR2x5cGhzT3V0ID0gbnVtR2x5cGhzOwogICAgICAoMCwgX3V0aWwud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gZ2x5ZnMgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpOwogICAgfQogICAgbGV0IG1heEZ1bmN0aW9uRGVmcyA9IDA7CiAgICBsZXQgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gMDsKICAgIGlmICh2ZXJzaW9uID49IDB4MDAwMTAwMDAgJiYgdGFibGVzLm1heHAubGVuZ3RoID49IDIyKSB7CiAgICAgIGZvbnQucG9zICs9IDg7CiAgICAgIGNvbnN0IG1heFpvbmVzID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgaWYgKG1heFpvbmVzID4gMikgewogICAgICAgIHRhYmxlcy5tYXhwLmRhdGFbMTRdID0gMDsKICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzE1XSA9IDI7CiAgICAgIH0KICAgICAgZm9udC5wb3MgKz0gNDsKICAgICAgbWF4RnVuY3Rpb25EZWZzID0gZm9udC5nZXRVaW50MTYoKTsKICAgICAgZm9udC5wb3MgKz0gNDsKICAgICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID0gZm9udC5nZXRVaW50MTYoKTsKICAgIH0KICAgIHRhYmxlcy5tYXhwLmRhdGFbNF0gPSBudW1HbHlwaHNPdXQgPj4gODsKICAgIHRhYmxlcy5tYXhwLmRhdGFbNV0gPSBudW1HbHlwaHNPdXQgJiAyNTU7CiAgICBjb25zdCBoaW50c1ZhbGlkID0gc2FuaXRpemVUVFByb2dyYW1zKHRhYmxlcy5mcGdtLCB0YWJsZXMucHJlcCwgdGFibGVzWyJjdnQgIl0sIG1heEZ1bmN0aW9uRGVmcyk7CiAgICBpZiAoIWhpbnRzVmFsaWQpIHsKICAgICAgZGVsZXRlIHRhYmxlcy5mcGdtOwogICAgICBkZWxldGUgdGFibGVzLnByZXA7CiAgICAgIGRlbGV0ZSB0YWJsZXNbImN2dCAiXTsKICAgIH0KICAgIHNhbml0aXplTWV0cmljcyhmb250LCB0YWJsZXMuaGhlYSwgdGFibGVzLmhtdHgsIHRhYmxlcy5oZWFkLCBudW1HbHlwaHNPdXQsIGR1cEZpcnN0RW50cnkpOwogICAgaWYgKCF0YWJsZXMuaGVhZCkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoZWFkIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgIH0KICAgIHNhbml0aXplSGVhZCh0YWJsZXMuaGVhZCwgbnVtR2x5cGhzLCBpc1RydWVUeXBlID8gdGFibGVzLmxvY2EubGVuZ3RoIDogMCk7CiAgICBsZXQgbWlzc2luZ0dseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAoaXNUcnVlVHlwZSkgewogICAgICBjb25zdCBpc0dseXBoTG9jYXRpb25zTG9uZyA9IGludDE2KHRhYmxlcy5oZWFkLmRhdGFbNTBdLCB0YWJsZXMuaGVhZC5kYXRhWzUxXSk7CiAgICAgIGNvbnN0IGdseXBoc0luZm8gPSBzYW5pdGl6ZUdseXBoTG9jYXRpb25zKHRhYmxlcy5sb2NhLCB0YWJsZXMuZ2x5ZiwgbnVtR2x5cGhzLCBpc0dseXBoTG9jYXRpb25zTG9uZywgaGludHNWYWxpZCwgZHVwRmlyc3RFbnRyeSwgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zKTsKICAgICAgbWlzc2luZ0dseXBocyA9IGdseXBoc0luZm8ubWlzc2luZ0dseXBoczsKICAgICAgaWYgKHZlcnNpb24gPj0gMHgwMDAxMDAwMCAmJiB0YWJsZXMubWF4cC5sZW5ndGggPj0gMjIpIHsKICAgICAgICB0YWJsZXMubWF4cC5kYXRhWzI2XSA9IGdseXBoc0luZm8ubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zID4+IDg7CiAgICAgICAgdGFibGVzLm1heHAuZGF0YVsyN10gPSBnbHlwaHNJbmZvLm1heFNpemVPZkluc3RydWN0aW9ucyAmIDI1NTsKICAgICAgfQogICAgfQogICAgaWYgKCF0YWJsZXMuaGhlYSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoJ1JlcXVpcmVkICJoaGVhIiB0YWJsZSBpcyBub3QgZm91bmQnKTsKICAgIH0KICAgIGlmICh0YWJsZXMuaGhlYS5kYXRhWzEwXSA9PT0gMCAmJiB0YWJsZXMuaGhlYS5kYXRhWzExXSA9PT0gMCkgewogICAgICB0YWJsZXMuaGhlYS5kYXRhWzEwXSA9IDB4ZmY7CiAgICAgIHRhYmxlcy5oaGVhLmRhdGFbMTFdID0gMHhmZjsKICAgIH0KICAgIGNvbnN0IG1ldHJpY3NPdmVycmlkZSA9IHsKICAgICAgdW5pdHNQZXJFbTogaW50MTYodGFibGVzLmhlYWQuZGF0YVsxOF0sIHRhYmxlcy5oZWFkLmRhdGFbMTldKSwKICAgICAgeU1heDogc2lnbmVkSW50MTYodGFibGVzLmhlYWQuZGF0YVs0Ml0sIHRhYmxlcy5oZWFkLmRhdGFbNDNdKSwKICAgICAgeU1pbjogc2lnbmVkSW50MTYodGFibGVzLmhlYWQuZGF0YVszOF0sIHRhYmxlcy5oZWFkLmRhdGFbMzldKSwKICAgICAgYXNjZW50OiBzaWduZWRJbnQxNih0YWJsZXMuaGhlYS5kYXRhWzRdLCB0YWJsZXMuaGhlYS5kYXRhWzVdKSwKICAgICAgZGVzY2VudDogc2lnbmVkSW50MTYodGFibGVzLmhoZWEuZGF0YVs2XSwgdGFibGVzLmhoZWEuZGF0YVs3XSksCiAgICAgIGxpbmVHYXA6IHNpZ25lZEludDE2KHRhYmxlcy5oaGVhLmRhdGFbOF0sIHRhYmxlcy5oaGVhLmRhdGFbOV0pCiAgICB9OwogICAgdGhpcy5hc2NlbnQgPSBtZXRyaWNzT3ZlcnJpZGUuYXNjZW50IC8gbWV0cmljc092ZXJyaWRlLnVuaXRzUGVyRW07CiAgICB0aGlzLmRlc2NlbnQgPSBtZXRyaWNzT3ZlcnJpZGUuZGVzY2VudCAvIG1ldHJpY3NPdmVycmlkZS51bml0c1BlckVtOwogICAgdGhpcy5saW5lR2FwID0gbWV0cmljc092ZXJyaWRlLmxpbmVHYXAgLyBtZXRyaWNzT3ZlcnJpZGUudW5pdHNQZXJFbTsKICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvPy5saW5lSGVpZ2h0KSB7CiAgICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuY3NzRm9udEluZm8ubWV0cmljcy5saW5lSGVpZ2h0OwogICAgICB0aGlzLmxpbmVHYXAgPSB0aGlzLmNzc0ZvbnRJbmZvLm1ldHJpY3MubGluZUdhcDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMubGluZUhlaWdodCA9IHRoaXMuYXNjZW50IC0gdGhpcy5kZXNjZW50ICsgdGhpcy5saW5lR2FwOwogICAgfQogICAgaWYgKHRhYmxlcy5wb3N0KSB7CiAgICAgIHJlYWRQb3N0U2NyaXB0VGFibGUodGFibGVzLnBvc3QsIHByb3BlcnRpZXMsIG51bUdseXBocyk7CiAgICB9CiAgICB0YWJsZXMucG9zdCA9IHsKICAgICAgdGFnOiAicG9zdCIsCiAgICAgIGRhdGE6IGNyZWF0ZVBvc3RUYWJsZShwcm9wZXJ0aWVzKQogICAgfTsKICAgIGNvbnN0IGNoYXJDb2RlVG9HbHlwaElkID0gW107CiAgICBmdW5jdGlvbiBoYXNHbHlwaChnbHlwaElkKSB7CiAgICAgIHJldHVybiAhbWlzc2luZ0dseXBoc1tnbHlwaElkXTsKICAgIH0KICAgIGlmIChwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICBjb25zdCBjaWRUb0dpZE1hcCA9IHByb3BlcnRpZXMuY2lkVG9HaWRNYXAgfHwgW107CiAgICAgIGNvbnN0IGlzQ2lkVG9HaWRNYXBFbXB0eSA9IGNpZFRvR2lkTWFwLmxlbmd0aCA9PT0gMDsKICAgICAgcHJvcGVydGllcy5jTWFwLmZvckVhY2goZnVuY3Rpb24gKGNoYXJDb2RlLCBjaWQpIHsKICAgICAgICBpZiAodHlwZW9mIGNpZCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgIGNpZCA9IGNvbnZlcnRDaWRTdHJpbmcoY2hhckNvZGUsIGNpZCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChjaWQgPiAweGZmZmYpIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTWF4IHNpemUgb2YgQ0lEIGlzIDY1LDUzNSIpOwogICAgICAgIH0KICAgICAgICBsZXQgZ2x5cGhJZCA9IC0xOwogICAgICAgIGlmIChpc0NpZFRvR2lkTWFwRW1wdHkpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWQ7CiAgICAgICAgfSBlbHNlIGlmIChjaWRUb0dpZE1hcFtjaWRdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGdseXBoSWQgPSBjaWRUb0dpZE1hcFtjaWRdOwogICAgICAgIH0KICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwICYmIGdseXBoSWQgPCBudW1HbHlwaHMgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGNtYXBUYWJsZSA9IHJlYWRDbWFwVGFibGUodGFibGVzLmNtYXAsIGZvbnQsIHRoaXMuaXNTeW1ib2xpY0ZvbnQsIHByb3BlcnRpZXMuaGFzRW5jb2RpbmcpOwogICAgICBjb25zdCBjbWFwUGxhdGZvcm1JZCA9IGNtYXBUYWJsZS5wbGF0Zm9ybUlkOwogICAgICBjb25zdCBjbWFwRW5jb2RpbmdJZCA9IGNtYXBUYWJsZS5lbmNvZGluZ0lkOwogICAgICBjb25zdCBjbWFwTWFwcGluZ3MgPSBjbWFwVGFibGUubWFwcGluZ3M7CiAgICAgIGxldCBiYXNlRW5jb2RpbmcgPSBbXSwKICAgICAgICBmb3JjZVBvc3RUYWJsZSA9IGZhbHNlOwogICAgICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZyAmJiAocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiTWFjUm9tYW5FbmNvZGluZyIgfHwgcHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lID09PSAiV2luQW5zaUVuY29kaW5nIikpIHsKICAgICAgICBiYXNlRW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykocHJvcGVydGllcy5iYXNlRW5jb2RpbmdOYW1lKTsKICAgICAgfQogICAgICBpZiAocHJvcGVydGllcy5oYXNFbmNvZGluZyAmJiAhdGhpcy5pc1N5bWJvbGljRm9udCAmJiAoY21hcFBsYXRmb3JtSWQgPT09IDMgJiYgY21hcEVuY29kaW5nSWQgPT09IDEgfHwgY21hcFBsYXRmb3JtSWQgPT09IDEgJiYgY21hcEVuY29kaW5nSWQgPT09IDApKSB7CiAgICAgICAgY29uc3QgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CiAgICAgICAgZm9yIChsZXQgY2hhckNvZGUgPSAwOyBjaGFyQ29kZSA8IDI1NjsgY2hhckNvZGUrKykgewogICAgICAgICAgbGV0IGdseXBoTmFtZTsKICAgICAgICAgIGlmICh0aGlzLmRpZmZlcmVuY2VzW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGdseXBoTmFtZSA9IHRoaXMuZGlmZmVyZW5jZXNbY2hhckNvZGVdOwogICAgICAgICAgfSBlbHNlIGlmIChiYXNlRW5jb2RpbmcubGVuZ3RoICYmIGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0gIT09ICIiKSB7CiAgICAgICAgICAgIGdseXBoTmFtZSA9IGJhc2VFbmNvZGluZ1tjaGFyQ29kZV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbHlwaE5hbWUgPSBfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2RpbmdbY2hhckNvZGVdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFnbHlwaE5hbWUpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdGFuZGFyZEdseXBoTmFtZSA9ICgwLCBfZm9udHNfdXRpbHMucmVjb3ZlckdseXBoTmFtZSkoZ2x5cGhOYW1lLCBnbHlwaHNVbmljb2RlTWFwKTsKICAgICAgICAgIGxldCB1bmljb2RlT3JDaGFyQ29kZTsKICAgICAgICAgIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMyAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMSkgewogICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IGdseXBoc1VuaWNvZGVNYXBbc3RhbmRhcmRHbHlwaE5hbWVdOwogICAgICAgICAgfSBlbHNlIGlmIChjbWFwUGxhdGZvcm1JZCA9PT0gMSAmJiBjbWFwRW5jb2RpbmdJZCA9PT0gMCkgewogICAgICAgICAgICB1bmljb2RlT3JDaGFyQ29kZSA9IF9lbmNvZGluZ3MuTWFjUm9tYW5FbmNvZGluZy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1bmljb2RlT3JDaGFyQ29kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5nbHlwaE5hbWVzICYmIHByb3BlcnRpZXMuaGFzSW5jbHVkZWRUb1VuaWNvZGVNYXAgJiYgISh0aGlzLnRvVW5pY29kZSBpbnN0YW5jZW9mIF90b191bmljb2RlX21hcC5JZGVudGl0eVRvVW5pY29kZU1hcCkpIHsKICAgICAgICAgICAgICBjb25zdCB1bmljb2RlID0gdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJDb2RlKTsKICAgICAgICAgICAgICBpZiAodW5pY29kZSkgewogICAgICAgICAgICAgICAgdW5pY29kZU9yQ2hhckNvZGUgPSB1bmljb2RlLmNvZGVQb2ludEF0KDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodW5pY29kZU9yQ2hhckNvZGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICAgIGlmIChtYXBwaW5nLmNoYXJDb2RlICE9PSB1bmljb2RlT3JDaGFyQ29kZSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAwKSB7CiAgICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIGNtYXBNYXBwaW5ncykgewogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbbWFwcGluZy5jaGFyQ29kZV0gPSBtYXBwaW5nLmdseXBoSWQ7CiAgICAgICAgfQogICAgICAgIGZvcmNlUG9zdFRhYmxlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgY21hcE1hcHBpbmdzKSB7CiAgICAgICAgICBsZXQgY2hhckNvZGUgPSBtYXBwaW5nLmNoYXJDb2RlOwogICAgICAgICAgaWYgKGNtYXBQbGF0Zm9ybUlkID09PSAzICYmIGNoYXJDb2RlID49IDB4ZjAwMCAmJiBjaGFyQ29kZSA8PSAweGYwZmYpIHsKICAgICAgICAgICAgY2hhckNvZGUgJj0gMHhmZjsKICAgICAgICAgIH0KICAgICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IG1hcHBpbmcuZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHByb3BlcnRpZXMuZ2x5cGhOYW1lcyAmJiAoYmFzZUVuY29kaW5nLmxlbmd0aCB8fCB0aGlzLmRpZmZlcmVuY2VzLmxlbmd0aCkpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CiAgICAgICAgICBpZiAoIWZvcmNlUG9zdFRhYmxlICYmIGNoYXJDb2RlVG9HbHlwaElkW2ldICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBnbHlwaE5hbWUgPSB0aGlzLmRpZmZlcmVuY2VzW2ldIHx8IGJhc2VFbmNvZGluZ1tpXTsKICAgICAgICAgIGlmICghZ2x5cGhOYW1lKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgZ2x5cGhJZCA9IHByb3BlcnRpZXMuZ2x5cGhOYW1lcy5pbmRleE9mKGdseXBoTmFtZSk7CiAgICAgICAgICBpZiAoZ2x5cGhJZCA+IDAgJiYgaGFzR2x5cGgoZ2x5cGhJZCkpIHsKICAgICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbaV0gPSBnbHlwaElkOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoYXJDb2RlVG9HbHlwaElkLmxlbmd0aCA9PT0gMCkgewogICAgICBjaGFyQ29kZVRvR2x5cGhJZFswXSA9IDA7CiAgICB9CiAgICBsZXQgZ2x5cGhaZXJvSWQgPSBudW1HbHlwaHNPdXQgLSAxOwogICAgaWYgKCFkdXBGaXJzdEVudHJ5KSB7CiAgICAgIGdseXBoWmVyb0lkID0gMDsKICAgIH0KICAgIGlmICghcHJvcGVydGllcy5jc3NGb250SW5mbykgewogICAgICBjb25zdCBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhjaGFyQ29kZVRvR2x5cGhJZCwgaGFzR2x5cGgsIGdseXBoWmVyb0lkLCB0aGlzLnRvVW5pY29kZSk7CiAgICAgIHRoaXMudG9Gb250Q2hhciA9IG5ld01hcHBpbmcudG9Gb250Q2hhcjsKICAgICAgdGFibGVzLmNtYXAgPSB7CiAgICAgICAgdGFnOiAiY21hcCIsCiAgICAgICAgZGF0YTogY3JlYXRlQ21hcFRhYmxlKG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQsIG5ld01hcHBpbmcudG9Vbmljb2RlRXh0cmFNYXAsIG51bUdseXBoc091dCkKICAgICAgfTsKICAgICAgaWYgKCF0YWJsZXNbIk9TLzIiXSB8fCAhdmFsaWRhdGVPUzJUYWJsZSh0YWJsZXNbIk9TLzIiXSwgZm9udCkpIHsKICAgICAgICB0YWJsZXNbIk9TLzIiXSA9IHsKICAgICAgICAgIHRhZzogIk9TLzIiLAogICAgICAgICAgZGF0YTogY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3TWFwcGluZy5jaGFyQ29kZVRvR2x5cGhJZCwgbWV0cmljc092ZXJyaWRlKQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGlmICghaXNUcnVlVHlwZSkgewogICAgICB0cnkgewogICAgICAgIGNmZkZpbGUgPSBuZXcgX3N0cmVhbS5TdHJlYW0odGFibGVzWyJDRkYgIl0uZGF0YSk7CiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9jZmZfcGFyc2VyLkNGRlBhcnNlcihjZmZGaWxlLCBwcm9wZXJ0aWVzLCBfZm9udHNfdXRpbHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgICAgICBjZmYgPSBwYXJzZXIucGFyc2UoKTsKICAgICAgICBjZmYuZHVwbGljYXRlRmlyc3RHbHlwaCgpOwogICAgICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKGNmZik7CiAgICAgICAgdGFibGVzWyJDRkYgIl0uZGF0YSA9IGNvbXBpbGVyLmNvbXBpbGUoKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiRmFpbGVkIHRvIGNvbXBpbGUgZm9udCAiICsgcHJvcGVydGllcy5sb2FkZWROYW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKCF0YWJsZXMubmFtZSkgewogICAgICB0YWJsZXMubmFtZSA9IHsKICAgICAgICB0YWc6ICJuYW1lIiwKICAgICAgICBkYXRhOiBjcmVhdGVOYW1lVGFibGUodGhpcy5uYW1lKQogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgW25hbWVQcm90b3R5cGUsIG5hbWVSZWNvcmRzXSA9IHJlYWROYW1lVGFibGUodGFibGVzLm5hbWUpOwogICAgICB0YWJsZXMubmFtZS5kYXRhID0gY3JlYXRlTmFtZVRhYmxlKG5hbWUsIG5hbWVQcm90b3R5cGUpOwogICAgICB0aGlzLnBzTmFtZSA9IG5hbWVQcm90b3R5cGVbMF1bNl0gfHwgbnVsbDsKICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbXBvc2l0ZSkgewogICAgICAgIGFkanVzdFRydWVUeXBlVG9Vbmljb2RlKHByb3BlcnRpZXMsIHRoaXMuaXNTeW1ib2xpY0ZvbnQsIG5hbWVSZWNvcmRzKTsKICAgICAgfQogICAgfQogICAgY29uc3QgYnVpbGRlciA9IG5ldyBfb3BlbnR5cGVfZmlsZV9idWlsZGVyLk9wZW5UeXBlRmlsZUJ1aWxkZXIoaGVhZGVyLnZlcnNpb24pOwogICAgZm9yIChjb25zdCB0YWJsZVRhZyBpbiB0YWJsZXMpIHsKICAgICAgYnVpbGRlci5hZGRUYWJsZSh0YWJsZVRhZywgdGFibGVzW3RhYmxlVGFnXS5kYXRhKTsKICAgIH0KICAgIHJldHVybiBidWlsZGVyLnRvQXJyYXkoKTsKICB9CiAgY29udmVydChmb250TmFtZSwgZm9udCwgcHJvcGVydGllcykgewogICAgcHJvcGVydGllcy5maXhlZFBpdGNoID0gZmFsc2U7CiAgICBpZiAocHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpIHsKICAgICAgYWRqdXN0VHlwZTFUb1VuaWNvZGUocHJvcGVydGllcywgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcpOwogICAgfQogICAgbGV0IGdseXBoWmVyb0lkID0gMTsKICAgIGlmIChmb250IGluc3RhbmNlb2YgX2NmZl9mb250LkNGRkZvbnQpIHsKICAgICAgZ2x5cGhaZXJvSWQgPSBmb250Lm51bUdseXBocyAtIDE7CiAgICB9CiAgICBjb25zdCBtYXBwaW5nID0gZm9udC5nZXRHbHlwaE1hcHBpbmcocHJvcGVydGllcyk7CiAgICBsZXQgbmV3TWFwcGluZyA9IG51bGw7CiAgICBsZXQgbmV3Q2hhckNvZGVUb0dseXBoSWQgPSBtYXBwaW5nOwogICAgbGV0IHRvVW5pY29kZUV4dHJhTWFwID0gbnVsbDsKICAgIGlmICghcHJvcGVydGllcy5jc3NGb250SW5mbykgewogICAgICBuZXdNYXBwaW5nID0gYWRqdXN0TWFwcGluZyhtYXBwaW5nLCBmb250Lmhhc0dseXBoSWQuYmluZChmb250KSwgZ2x5cGhaZXJvSWQsIHRoaXMudG9Vbmljb2RlKTsKICAgICAgdGhpcy50b0ZvbnRDaGFyID0gbmV3TWFwcGluZy50b0ZvbnRDaGFyOwogICAgICBuZXdDaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7CiAgICAgIHRvVW5pY29kZUV4dHJhTWFwID0gbmV3TWFwcGluZy50b1VuaWNvZGVFeHRyYU1hcDsKICAgIH0KICAgIGNvbnN0IG51bUdseXBocyA9IGZvbnQubnVtR2x5cGhzOwogICAgZnVuY3Rpb24gZ2V0Q2hhckNvZGVzKGNoYXJDb2RlVG9HbHlwaElkLCBnbHlwaElkKSB7CiAgICAgIGxldCBjaGFyQ29kZXMgPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIGNoYXJDb2RlVG9HbHlwaElkKSB7CiAgICAgICAgaWYgKGdseXBoSWQgPT09IGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSkgewogICAgICAgICAgKGNoYXJDb2RlcyB8fD0gW10pLnB1c2goY2hhckNvZGUgfCAwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJDb2RlczsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBnbHlwaElkKSB7CiAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgaW4gY2hhckNvZGVUb0dseXBoSWQpIHsKICAgICAgICBpZiAoZ2x5cGhJZCA9PT0gY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdKSB7CiAgICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOwogICAgICAgIH0KICAgICAgfQogICAgICBuZXdNYXBwaW5nLmNoYXJDb2RlVG9HbHlwaElkW25ld01hcHBpbmcubmV4dEF2YWlsYWJsZUZvbnRDaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICByZXR1cm4gbmV3TWFwcGluZy5uZXh0QXZhaWxhYmxlRm9udENoYXJDb2RlKys7CiAgICB9CiAgICBjb25zdCBzZWFjcyA9IGZvbnQuc2VhY3M7CiAgICBpZiAobmV3TWFwcGluZyAmJiBfZm9udHNfdXRpbHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEICYmIHNlYWNzPy5sZW5ndGgpIHsKICAgICAgY29uc3QgbWF0cml4ID0gcHJvcGVydGllcy5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOwogICAgICBjb25zdCBjaGFyc2V0ID0gZm9udC5nZXRDaGFyc2V0KCk7CiAgICAgIGNvbnN0IHNlYWNNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICBmb3IgKGxldCBnbHlwaElkIGluIHNlYWNzKSB7CiAgICAgICAgZ2x5cGhJZCB8PSAwOwogICAgICAgIGNvbnN0IHNlYWMgPSBzZWFjc1tnbHlwaElkXTsKICAgICAgICBjb25zdCBiYXNlR2x5cGhOYW1lID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW3NlYWNbMl1dOwogICAgICAgIGNvbnN0IGFjY2VudEdseXBoTmFtZSA9IF9lbmNvZGluZ3MuU3RhbmRhcmRFbmNvZGluZ1tzZWFjWzNdXTsKICAgICAgICBjb25zdCBiYXNlR2x5cGhJZCA9IGNoYXJzZXQuaW5kZXhPZihiYXNlR2x5cGhOYW1lKTsKICAgICAgICBjb25zdCBhY2NlbnRHbHlwaElkID0gY2hhcnNldC5pbmRleE9mKGFjY2VudEdseXBoTmFtZSk7CiAgICAgICAgaWYgKGJhc2VHbHlwaElkIDwgMCB8fCBhY2NlbnRHbHlwaElkIDwgMCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFjY2VudE9mZnNldCA9IHsKICAgICAgICAgIHg6IHNlYWNbMF0gKiBtYXRyaXhbMF0gKyBzZWFjWzFdICogbWF0cml4WzJdICsgbWF0cml4WzRdLAogICAgICAgICAgeTogc2VhY1swXSAqIG1hdHJpeFsxXSArIHNlYWNbMV0gKiBtYXRyaXhbM10gKyBtYXRyaXhbNV0KICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYXJDb2RlcyA9IGdldENoYXJDb2RlcyhtYXBwaW5nLCBnbHlwaElkKTsKICAgICAgICBpZiAoIWNoYXJDb2RlcykgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgY2hhckNvZGUgb2YgY2hhckNvZGVzKSB7CiAgICAgICAgICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IG5ld01hcHBpbmcuY2hhckNvZGVUb0dseXBoSWQ7CiAgICAgICAgICBjb25zdCBiYXNlRm9udENoYXJDb2RlID0gY3JlYXRlQ2hhckNvZGUoY2hhckNvZGVUb0dseXBoSWQsIGJhc2VHbHlwaElkKTsKICAgICAgICAgIGNvbnN0IGFjY2VudEZvbnRDaGFyQ29kZSA9IGNyZWF0ZUNoYXJDb2RlKGNoYXJDb2RlVG9HbHlwaElkLCBhY2NlbnRHbHlwaElkKTsKICAgICAgICAgIHNlYWNNYXBbY2hhckNvZGVdID0gewogICAgICAgICAgICBiYXNlRm9udENoYXJDb2RlLAogICAgICAgICAgICBhY2NlbnRGb250Q2hhckNvZGUsCiAgICAgICAgICAgIGFjY2VudE9mZnNldAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvcGVydGllcy5zZWFjTWFwID0gc2VhY01hcDsKICAgIH0KICAgIGNvbnN0IHVuaXRzUGVyRW0gPSAxIC8gKHByb3BlcnRpZXMuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWClbMF07CiAgICBjb25zdCBidWlsZGVyID0gbmV3IF9vcGVudHlwZV9maWxlX2J1aWxkZXIuT3BlblR5cGVGaWxlQnVpbGRlcigiXHg0Rlx4NTRceDU0XHg0RiIpOwogICAgYnVpbGRlci5hZGRUYWJsZSgiQ0ZGICIsIGZvbnQuZGF0YSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJPUy8yIiwgY3JlYXRlT1MyVGFibGUocHJvcGVydGllcywgbmV3Q2hhckNvZGVUb0dseXBoSWQpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImNtYXAiLCBjcmVhdGVDbWFwVGFibGUobmV3Q2hhckNvZGVUb0dseXBoSWQsIHRvVW5pY29kZUV4dHJhTWFwLCBudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhlYWQiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyAiXHgwMFx4MDBceDEwXHgwMCIgKyAiXHgwMFx4MDBceDAwXHgwMCIgKyAiXHg1Rlx4MEZceDNDXHhGNSIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHVuaXRzUGVyRW0pICsgIlx4MDBceDAwXHgwMFx4MDBceDllXHgwYlx4N2VceDI3IiArICJceDAwXHgwMFx4MDBceDAwXHg5ZVx4MGJceDdlXHgyNyIgKyAiXHgwMFx4MDAiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwRlx4RkYiICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuYXNjZW50KSArIHN0cmluZzE2KHByb3BlcnRpZXMuaXRhbGljQW5nbGUgPyAyIDogMCkgKyAiXHgwMFx4MTEiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoImhoZWEiLCAiXHgwMFx4MDFceDAwXHgwMCIgKyBzYWZlU3RyaW5nMTYocHJvcGVydGllcy5hc2NlbnQpICsgc2FmZVN0cmluZzE2KHByb3BlcnRpZXMuZGVzY2VudCkgKyAiXHgwMFx4MDAiICsgIlx4RkZceEZGIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArIHNhZmVTdHJpbmcxNihwcm9wZXJ0aWVzLmNhcEhlaWdodCkgKyBzYWZlU3RyaW5nMTYoTWF0aC50YW4ocHJvcGVydGllcy5pdGFsaWNBbmdsZSkgKiBwcm9wZXJ0aWVzLnhIZWlnaHQpICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgIlx4MDBceDAwIiArICJceDAwXHgwMCIgKyAiXHgwMFx4MDAiICsgc3RyaW5nMTYobnVtR2x5cGhzKSk7CiAgICBidWlsZGVyLmFkZFRhYmxlKCJobXR4IiwgZnVuY3Rpb24gZm9udEZpZWxkc0htdHgoKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmdzID0gZm9udC5jaGFyc3RyaW5nczsKICAgICAgY29uc3QgY2ZmV2lkdGhzID0gZm9udC5jZmYgPyBmb250LmNmZi53aWR0aHMgOiBudWxsOwogICAgICBsZXQgaG10eCA9ICJceDAwXHgwMFx4MDBceDAwIjsKICAgICAgZm9yIChsZXQgaSA9IDEsIGlpID0gbnVtR2x5cGhzOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCB3aWR0aCA9IDA7CiAgICAgICAgaWYgKGNoYXJzdHJpbmdzKSB7CiAgICAgICAgICBjb25zdCBjaGFyc3RyaW5nID0gY2hhcnN0cmluZ3NbaSAtIDFdOwogICAgICAgICAgd2lkdGggPSAid2lkdGgiIGluIGNoYXJzdHJpbmcgPyBjaGFyc3RyaW5nLndpZHRoIDogMDsKICAgICAgICB9IGVsc2UgaWYgKGNmZldpZHRocykgewogICAgICAgICAgd2lkdGggPSBNYXRoLmNlaWwoY2ZmV2lkdGhzW2ldIHx8IDApOwogICAgICAgIH0KICAgICAgICBobXR4ICs9IHN0cmluZzE2KHdpZHRoKSArIHN0cmluZzE2KDApOwogICAgICB9CiAgICAgIHJldHVybiBobXR4OwogICAgfSgpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm1heHAiLCAiXHgwMFx4MDBceDUwXHgwMCIgKyBzdHJpbmcxNihudW1HbHlwaHMpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoIm5hbWUiLCBjcmVhdGVOYW1lVGFibGUoZm9udE5hbWUpKTsKICAgIGJ1aWxkZXIuYWRkVGFibGUoInBvc3QiLCBjcmVhdGVQb3N0VGFibGUocHJvcGVydGllcykpOwogICAgcmV0dXJuIGJ1aWxkZXIudG9BcnJheSgpOwogIH0KICBnZXQgc3BhY2VXaWR0aCgpIHsKICAgIGNvbnN0IHBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHMgPSBbInNwYWNlIiwgIm1pbnVzIiwgIm9uZSIsICJpIiwgIkkiXTsKICAgIGxldCB3aWR0aDsKICAgIGZvciAoY29uc3QgZ2x5cGhOYW1lIG9mIHBvc3NpYmxlU3BhY2VSZXBsYWNlbWVudHMpIHsKICAgICAgaWYgKGdseXBoTmFtZSBpbiB0aGlzLndpZHRocykgewogICAgICAgIHdpZHRoID0gdGhpcy53aWR0aHNbZ2x5cGhOYW1lXTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCBnbHlwaHNVbmljb2RlTWFwID0gKDAsIF9nbHlwaGxpc3QuZ2V0R2x5cGhzVW5pY29kZSkoKTsKICAgICAgY29uc3QgZ2x5cGhVbmljb2RlID0gZ2x5cGhzVW5pY29kZU1hcFtnbHlwaE5hbWVdOwogICAgICBsZXQgY2hhcmNvZGUgPSAwOwogICAgICBpZiAodGhpcy5jb21wb3NpdGUgJiYgdGhpcy5jTWFwLmNvbnRhaW5zKGdseXBoVW5pY29kZSkpIHsKICAgICAgICBjaGFyY29kZSA9IHRoaXMuY01hcC5sb29rdXAoZ2x5cGhVbmljb2RlKTsKICAgICAgICBpZiAodHlwZW9mIGNoYXJjb2RlID09PSAic3RyaW5nIikgewogICAgICAgICAgY2hhcmNvZGUgPSBjb252ZXJ0Q2lkU3RyaW5nKGdseXBoVW5pY29kZSwgY2hhcmNvZGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWNoYXJjb2RlICYmIHRoaXMudG9Vbmljb2RlKSB7CiAgICAgICAgY2hhcmNvZGUgPSB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKGdseXBoVW5pY29kZSk7CiAgICAgIH0KICAgICAgaWYgKGNoYXJjb2RlIDw9IDApIHsKICAgICAgICBjaGFyY29kZSA9IGdseXBoVW5pY29kZTsKICAgICAgfQogICAgICB3aWR0aCA9IHRoaXMud2lkdGhzW2NoYXJjb2RlXTsKICAgICAgaWYgKHdpZHRoKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAic3BhY2VXaWR0aCIsIHdpZHRoIHx8IHRoaXMuZGVmYXVsdFdpZHRoKTsKICB9CiAgX2NoYXJUb0dseXBoKGNoYXJjb2RlLCBpc1NwYWNlID0gZmFsc2UpIHsKICAgIGxldCBnbHlwaCA9IHRoaXMuX2dseXBoQ2FjaGVbY2hhcmNvZGVdOwogICAgaWYgKGdseXBoPy5pc1NwYWNlID09PSBpc1NwYWNlKSB7CiAgICAgIHJldHVybiBnbHlwaDsKICAgIH0KICAgIGxldCBmb250Q2hhckNvZGUsIHdpZHRoLCBvcGVyYXRvckxpc3RJZDsKICAgIGxldCB3aWR0aENvZGUgPSBjaGFyY29kZTsKICAgIGlmICh0aGlzLmNNYXA/LmNvbnRhaW5zKGNoYXJjb2RlKSkgewogICAgICB3aWR0aENvZGUgPSB0aGlzLmNNYXAubG9va3VwKGNoYXJjb2RlKTsKICAgICAgaWYgKHR5cGVvZiB3aWR0aENvZGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgd2lkdGhDb2RlID0gY29udmVydENpZFN0cmluZyhjaGFyY29kZSwgd2lkdGhDb2RlKTsKICAgICAgfQogICAgfQogICAgd2lkdGggPSB0aGlzLndpZHRoc1t3aWR0aENvZGVdOwogICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gIm51bWJlciIpIHsKICAgICAgd2lkdGggPSB0aGlzLmRlZmF1bHRXaWR0aDsKICAgIH0KICAgIGNvbnN0IHZtZXRyaWMgPSB0aGlzLnZtZXRyaWNzPy5bd2lkdGhDb2RlXTsKICAgIGxldCB1bmljb2RlID0gdGhpcy50b1VuaWNvZGUuZ2V0KGNoYXJjb2RlKSB8fCBjaGFyY29kZTsKICAgIGlmICh0eXBlb2YgdW5pY29kZSA9PT0gIm51bWJlciIpIHsKICAgICAgdW5pY29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7CiAgICB9CiAgICBsZXQgaXNJbkZvbnQgPSB0aGlzLnRvRm9udENoYXJbY2hhcmNvZGVdICE9PSB1bmRlZmluZWQ7CiAgICBmb250Q2hhckNvZGUgPSB0aGlzLnRvRm9udENoYXJbY2hhcmNvZGVdIHx8IGNoYXJjb2RlOwogICAgaWYgKHRoaXMubWlzc2luZ0ZpbGUpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gdGhpcy5kaWZmZXJlbmNlc1tjaGFyY29kZV0gfHwgdGhpcy5kZWZhdWx0RW5jb2RpbmdbY2hhcmNvZGVdOwogICAgICBpZiAoKGdseXBoTmFtZSA9PT0gIi5ub3RkZWYiIHx8IGdseXBoTmFtZSA9PT0gIiIpICYmIHRoaXMudHlwZSA9PT0gIlR5cGUxIikgewogICAgICAgIGZvbnRDaGFyQ29kZSA9IDB4MjA7CiAgICAgIH0KICAgICAgZm9udENoYXJDb2RlID0gKDAsIF91bmljb2RlLm1hcFNwZWNpYWxVbmljb2RlVmFsdWVzKShmb250Q2hhckNvZGUpOwogICAgfQogICAgaWYgKHRoaXMuaXNUeXBlM0ZvbnQpIHsKICAgICAgb3BlcmF0b3JMaXN0SWQgPSBmb250Q2hhckNvZGU7CiAgICB9CiAgICBsZXQgYWNjZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLnNlYWNNYXA/LltjaGFyY29kZV0pIHsKICAgICAgaXNJbkZvbnQgPSB0cnVlOwogICAgICBjb25zdCBzZWFjID0gdGhpcy5zZWFjTWFwW2NoYXJjb2RlXTsKICAgICAgZm9udENoYXJDb2RlID0gc2VhYy5iYXNlRm9udENoYXJDb2RlOwogICAgICBhY2NlbnQgPSB7CiAgICAgICAgZm9udENoYXI6IFN0cmluZy5mcm9tQ29kZVBvaW50KHNlYWMuYWNjZW50Rm9udENoYXJDb2RlKSwKICAgICAgICBvZmZzZXQ6IHNlYWMuYWNjZW50T2Zmc2V0CiAgICAgIH07CiAgICB9CiAgICBsZXQgZm9udENoYXIgPSAiIjsKICAgIGlmICh0eXBlb2YgZm9udENoYXJDb2RlID09PSAibnVtYmVyIikgewogICAgICBpZiAoZm9udENoYXJDb2RlIDw9IDB4MTBmZmZmKSB7CiAgICAgICAgZm9udENoYXIgPSBTdHJpbmcuZnJvbUNvZGVQb2ludChmb250Q2hhckNvZGUpOwogICAgICB9IGVsc2UgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgY2hhclRvR2x5cGggLSBpbnZhbGlkIGZvbnRDaGFyQ29kZTogJHtmb250Q2hhckNvZGV9YCk7CiAgICAgIH0KICAgIH0KICAgIGdseXBoID0gbmV3IEdseXBoKGNoYXJjb2RlLCBmb250Q2hhciwgdW5pY29kZSwgYWNjZW50LCB3aWR0aCwgdm1ldHJpYywgb3BlcmF0b3JMaXN0SWQsIGlzU3BhY2UsIGlzSW5Gb250KTsKICAgIHJldHVybiB0aGlzLl9nbHlwaENhY2hlW2NoYXJjb2RlXSA9IGdseXBoOwogIH0KICBjaGFyc1RvR2x5cGhzKGNoYXJzKSB7CiAgICBsZXQgZ2x5cGhzID0gdGhpcy5fY2hhcnNDYWNoZVtjaGFyc107CiAgICBpZiAoZ2x5cGhzKSB7CiAgICAgIHJldHVybiBnbHlwaHM7CiAgICB9CiAgICBnbHlwaHMgPSBbXTsKICAgIGlmICh0aGlzLmNNYXApIHsKICAgICAgY29uc3QgYyA9IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgaWkgPSBjaGFycy5sZW5ndGg7CiAgICAgIGxldCBpID0gMDsKICAgICAgd2hpbGUgKGkgPCBpaSkgewogICAgICAgIHRoaXMuY01hcC5yZWFkQ2hhckNvZGUoY2hhcnMsIGksIGMpOwogICAgICAgIGNvbnN0IHsKICAgICAgICAgIGNoYXJjb2RlLAogICAgICAgICAgbGVuZ3RoCiAgICAgICAgfSA9IGM7CiAgICAgICAgaSArPSBsZW5ndGg7CiAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLl9jaGFyVG9HbHlwaChjaGFyY29kZSwgbGVuZ3RoID09PSAxICYmIGNoYXJzLmNoYXJDb2RlQXQoaSAtIDEpID09PSAweDIwKTsKICAgICAgICBnbHlwaHMucHVzaChnbHlwaCk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNoYXJzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBjb25zdCBjaGFyY29kZSA9IGNoYXJzLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLl9jaGFyVG9HbHlwaChjaGFyY29kZSwgY2hhcmNvZGUgPT09IDB4MjApOwogICAgICAgIGdseXBocy5wdXNoKGdseXBoKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXMuX2NoYXJzQ2FjaGVbY2hhcnNdID0gZ2x5cGhzOwogIH0KICBnZXRDaGFyUG9zaXRpb25zKGNoYXJzKSB7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBbXTsKICAgIGlmICh0aGlzLmNNYXApIHsKICAgICAgY29uc3QgYyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGxldCBpID0gMDsKICAgICAgd2hpbGUgKGkgPCBjaGFycy5sZW5ndGgpIHsKICAgICAgICB0aGlzLmNNYXAucmVhZENoYXJDb2RlKGNoYXJzLCBpLCBjKTsKICAgICAgICBjb25zdCBsZW5ndGggPSBjLmxlbmd0aDsKICAgICAgICBwb3NpdGlvbnMucHVzaChbaSwgaSArIGxlbmd0aF0pOwogICAgICAgIGkgKz0gbGVuZ3RoOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgcG9zaXRpb25zLnB1c2goW2ksIGkgKyAxXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwb3NpdGlvbnM7CiAgfQogIGdldCBnbHlwaENhY2hlVmFsdWVzKCkgewogICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fZ2x5cGhDYWNoZSk7CiAgfQogIGVuY29kZVN0cmluZyhzdHIpIHsKICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTsKICAgIGNvbnN0IGN1cnJlbnRCdWYgPSBbXTsKICAgIGNvbnN0IGhhc0N1cnJlbnRCdWZFcnJvcnMgPSAoKSA9PiBidWZmZXJzLmxlbmd0aCAlIDIgPT09IDE7CiAgICBjb25zdCBnZXRDaGFyQ29kZSA9IHRoaXMudG9Vbmljb2RlIGluc3RhbmNlb2YgX3RvX3VuaWNvZGVfbWFwLklkZW50aXR5VG9Vbmljb2RlTWFwID8gdW5pY29kZSA9PiB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKHVuaWNvZGUpIDogdW5pY29kZSA9PiB0aGlzLnRvVW5pY29kZS5jaGFyQ29kZU9mKFN0cmluZy5mcm9tQ29kZVBvaW50KHVuaWNvZGUpKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IHVuaWNvZGUgPSBzdHIuY29kZVBvaW50QXQoaSk7CiAgICAgIGlmICh1bmljb2RlID4gMHhkN2ZmICYmICh1bmljb2RlIDwgMHhlMDAwIHx8IHVuaWNvZGUgPiAweGZmZmQpKSB7CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIGlmICh0aGlzLnRvVW5pY29kZSkgewogICAgICAgIGNvbnN0IGNoYXJDb2RlID0gZ2V0Q2hhckNvZGUodW5pY29kZSk7CiAgICAgICAgaWYgKGNoYXJDb2RlICE9PSAtMSkgewogICAgICAgICAgaWYgKGhhc0N1cnJlbnRCdWZFcnJvcnMoKSkgewogICAgICAgICAgICBidWZmZXJzLnB1c2goY3VycmVudEJ1Zi5qb2luKCIiKSk7CiAgICAgICAgICAgIGN1cnJlbnRCdWYubGVuZ3RoID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGNoYXJDb2RlTGVuZ3RoID0gdGhpcy5jTWFwID8gdGhpcy5jTWFwLmdldENoYXJDb2RlTGVuZ3RoKGNoYXJDb2RlKSA6IDE7CiAgICAgICAgICBmb3IgKGxldCBqID0gY2hhckNvZGVMZW5ndGggLSAxOyBqID49IDA7IGotLSkgewogICAgICAgICAgICBjdXJyZW50QnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSA+PiA4ICogaiAmIDB4ZmYpKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIWhhc0N1cnJlbnRCdWZFcnJvcnMoKSkgewogICAgICAgIGJ1ZmZlcnMucHVzaChjdXJyZW50QnVmLmpvaW4oIiIpKTsKICAgICAgICBjdXJyZW50QnVmLmxlbmd0aCA9IDA7CiAgICAgIH0KICAgICAgY3VycmVudEJ1Zi5wdXNoKFN0cmluZy5mcm9tQ29kZVBvaW50KHVuaWNvZGUpKTsKICAgIH0KICAgIGJ1ZmZlcnMucHVzaChjdXJyZW50QnVmLmpvaW4oIiIpKTsKICAgIHJldHVybiBidWZmZXJzOwogIH0KfQpleHBvcnRzLkZvbnQgPSBGb250OwpjbGFzcyBFcnJvckZvbnQgewogIGNvbnN0cnVjdG9yKGVycm9yKSB7CiAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICB0aGlzLmxvYWRlZE5hbWUgPSAiZ19mb250X2Vycm9yIjsKICAgIHRoaXMubWlzc2luZ0ZpbGUgPSB0cnVlOwogIH0KICBjaGFyc1RvR2x5cGhzKCkgewogICAgcmV0dXJuIFtdOwogIH0KICBlbmNvZGVTdHJpbmcoY2hhcnMpIHsKICAgIHJldHVybiBbY2hhcnNdOwogIH0KICBleHBvcnREYXRhKGV4dHJhUHJvcGVydGllcyA9IGZhbHNlKSB7CiAgICByZXR1cm4gewogICAgICBlcnJvcjogdGhpcy5lcnJvcgogICAgfTsKICB9Cn0KZXhwb3J0cy5FcnJvckZvbnQgPSBFcnJvckZvbnQ7CgovKioqLyB9KSwKLyogMzUgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5DRkZUb3BEaWN0ID0gZXhwb3J0cy5DRkZTdHJpbmdzID0gZXhwb3J0cy5DRkZTdGFuZGFyZFN0cmluZ3MgPSBleHBvcnRzLkNGRlByaXZhdGVEaWN0ID0gZXhwb3J0cy5DRkZQYXJzZXIgPSBleHBvcnRzLkNGRkluZGV4ID0gZXhwb3J0cy5DRkZIZWFkZXIgPSBleHBvcnRzLkNGRkZEU2VsZWN0ID0gZXhwb3J0cy5DRkZDb21waWxlciA9IGV4cG9ydHMuQ0ZGQ2hhcnNldCA9IGV4cG9ydHMuQ0ZGID0gdm9pZCAwOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX2NoYXJzZXRzID0gX193X3BkZmpzX3JlcXVpcmVfXygzNik7CnZhciBfZW5jb2RpbmdzID0gX193X3BkZmpzX3JlcXVpcmVfXygzNyk7CmNvbnN0IE1BWF9TVUJSX05FU1RJTkcgPSAxMDsKY29uc3QgQ0ZGU3RhbmRhcmRTdHJpbmdzID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgImVpZ2h0c3VwZXJpb3IiLCAibmluZXN1cGVyaW9yIiwgInplcm9pbmZlcmlvciIsICJvbmVpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICJ0aHJlZWluZmVyaW9yIiwgImZvdXJpbmZlcmlvciIsICJmaXZlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAic2V2ZW5pbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgIm5pbmVpbmZlcmlvciIsICJjZW50aW5mZXJpb3IiLCAiZG9sbGFyaW5mZXJpb3IiLCAicGVyaW9kaW5mZXJpb3IiLCAiY29tbWFpbmZlcmlvciIsICJBZ3JhdmVzbWFsbCIsICJBYWN1dGVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkFyaW5nc21hbGwiLCAiQUVzbWFsbCIsICJDY2VkaWxsYXNtYWxsIiwgIkVncmF2ZXNtYWxsIiwgIkVhY3V0ZXNtYWxsIiwgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJFdGhzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPZ3JhdmVzbWFsbCIsICJPYWN1dGVzbWFsbCIsICJPY2lyY3VtZmxleHNtYWxsIiwgIk90aWxkZXNtYWxsIiwgIk9kaWVyZXNpc3NtYWxsIiwgIk9Fc21hbGwiLCAiT3NsYXNoc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICJZYWN1dGVzbWFsbCIsICJUaG9ybnNtYWxsIiwgIllkaWVyZXNpc3NtYWxsIiwgIjAwMS4wMDAiLCAiMDAxLjAwMSIsICIwMDEuMDAyIiwgIjAwMS4wMDMiLCAiQmxhY2siLCAiQm9sZCIsICJCb29rIiwgIkxpZ2h0IiwgIk1lZGl1bSIsICJSZWd1bGFyIiwgIlJvbWFuIiwgIlNlbWlib2xkIl07CmV4cG9ydHMuQ0ZGU3RhbmRhcmRTdHJpbmdzID0gQ0ZGU3RhbmRhcmRTdHJpbmdzOwpjb25zdCBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1MgPSAzOTE7CmNvbnN0IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YSA9IFtudWxsLCB7CiAgaWQ6ICJoc3RlbSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCBudWxsLCB7CiAgaWQ6ICJ2c3RlbSIsCiAgbWluOiAyLAogIHN0YWNrQ2xlYXJpbmc6IHRydWUsCiAgc3RlbTogdHJ1ZQp9LCB7CiAgaWQ6ICJ2bW92ZXRvIiwKICBtaW46IDEsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJybGluZXRvIiwKICBtaW46IDIsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJobGluZXRvIiwKICBtaW46IDEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJ2bGluZXRvIiwKICBtaW46IDEsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJycmN1cnZldG8iLAogIG1pbjogNiwKICByZXNldFN0YWNrOiB0cnVlCn0sIG51bGwsIHsKICBpZDogImNhbGxzdWJyIiwKICBtaW46IDEsCiAgdW5kZWZTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJyZXR1cm4iLAogIG1pbjogMCwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIG51bGwsIG51bGwsIHsKICBpZDogImVuZGNoYXIiLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIG51bGwsIG51bGwsIG51bGwsIHsKICBpZDogImhzdGVtaG0iLAogIG1pbjogMiwKICBzdGFja0NsZWFyaW5nOiB0cnVlLAogIHN0ZW06IHRydWUKfSwgewogIGlkOiAiaGludG1hc2siLAogIG1pbjogMCwKICBzdGFja0NsZWFyaW5nOiB0cnVlCn0sIHsKICBpZDogImNudHJtYXNrIiwKICBtaW46IDAsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJybW92ZXRvIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJobW92ZXRvIiwKICBtaW46IDEsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZQp9LCB7CiAgaWQ6ICJ2c3RlbWhtIiwKICBtaW46IDIsCiAgc3RhY2tDbGVhcmluZzogdHJ1ZSwKICBzdGVtOiB0cnVlCn0sIHsKICBpZDogInJjdXJ2ZWxpbmUiLAogIG1pbjogOCwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInJsaW5lY3VydmUiLAogIG1pbjogOCwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZ2Y3VydmV0byIsCiAgbWluOiA0LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiaGhjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCBudWxsLCB7CiAgaWQ6ICJjYWxsZ3N1YnIiLAogIG1pbjogMSwKICB1bmRlZlN0YWNrOiB0cnVlCn0sIHsKICBpZDogInZoY3VydmV0byIsCiAgbWluOiA0LAogIHJlc2V0U3RhY2s6IHRydWUKfSwgewogIGlkOiAiaHZjdXJ2ZXRvIiwKICBtaW46IDQsCiAgcmVzZXRTdGFjazogdHJ1ZQp9XTsKY29uc3QgQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhMTIgPSBbbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiYW5kIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEKfSwgewogIGlkOiAib3IiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCB7CiAgaWQ6ICJub3QiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAwCn0sIG51bGwsIG51bGwsIG51bGwsIHsKICBpZDogImFicyIsCiAgbWluOiAxLAogIHN0YWNrRGVsdGE6IDAKfSwgewogIGlkOiAiYWRkIiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTEsCiAgc3RhY2tGbihzdGFjaywgaW5kZXgpIHsKICAgIHN0YWNrW2luZGV4IC0gMl0gPSBzdGFja1tpbmRleCAtIDJdICsgc3RhY2tbaW5kZXggLSAxXTsKICB9Cn0sIHsKICBpZDogInN1YiIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAtIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCB7CiAgaWQ6ICJkaXYiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMSwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAyXSA9IHN0YWNrW2luZGV4IC0gMl0gLyBzdGFja1tpbmRleCAtIDFdOwogIH0KfSwgbnVsbCwgewogIGlkOiAibmVnIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMCwKICBzdGFja0ZuKHN0YWNrLCBpbmRleCkgewogICAgc3RhY2tbaW5kZXggLSAxXSA9IC1zdGFja1tpbmRleCAtIDFdOwogIH0KfSwgewogIGlkOiAiZXEiLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAtMQp9LCBudWxsLCBudWxsLCB7CiAgaWQ6ICJkcm9wIiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogLTEKfSwgbnVsbCwgewogIGlkOiAicHV0IiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogLTIKfSwgewogIGlkOiAiZ2V0IiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJpZmVsc2UiLAogIG1pbjogNCwKICBzdGFja0RlbHRhOiAtMwp9LCB7CiAgaWQ6ICJyYW5kb20iLAogIG1pbjogMCwKICBzdGFja0RlbHRhOiAxCn0sIHsKICBpZDogIm11bCIsCiAgbWluOiAyLAogIHN0YWNrRGVsdGE6IC0xLAogIHN0YWNrRm4oc3RhY2ssIGluZGV4KSB7CiAgICBzdGFja1tpbmRleCAtIDJdID0gc3RhY2tbaW5kZXggLSAyXSAqIHN0YWNrW2luZGV4IC0gMV07CiAgfQp9LCBudWxsLCB7CiAgaWQ6ICJzcXJ0IiwKICBtaW46IDEsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJkdXAiLAogIG1pbjogMSwKICBzdGFja0RlbHRhOiAxCn0sIHsKICBpZDogImV4Y2giLAogIG1pbjogMiwKICBzdGFja0RlbHRhOiAwCn0sIHsKICBpZDogImluZGV4IiwKICBtaW46IDIsCiAgc3RhY2tEZWx0YTogMAp9LCB7CiAgaWQ6ICJyb2xsIiwKICBtaW46IDMsCiAgc3RhY2tEZWx0YTogLTIKfSwgbnVsbCwgbnVsbCwgbnVsbCwgewogIGlkOiAiaGZsZXgiLAogIG1pbjogNywKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImZsZXgiLAogIG1pbjogMTMsCiAgcmVzZXRTdGFjazogdHJ1ZQp9LCB7CiAgaWQ6ICJoZmxleDEiLAogIG1pbjogOSwKICByZXNldFN0YWNrOiB0cnVlCn0sIHsKICBpZDogImZsZXgxIiwKICBtaW46IDExLAogIHJlc2V0U3RhY2s6IHRydWUKfV07CmNsYXNzIENGRlBhcnNlciB7CiAgY29uc3RydWN0b3IoZmlsZSwgcHJvcGVydGllcywgc2VhY0FuYWx5c2lzRW5hYmxlZCkgewogICAgdGhpcy5ieXRlcyA9IGZpbGUuZ2V0Qnl0ZXMoKTsKICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CiAgICB0aGlzLnNlYWNBbmFseXNpc0VuYWJsZWQgPSAhIXNlYWNBbmFseXNpc0VuYWJsZWQ7CiAgfQogIHBhcnNlKCkgewogICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKICAgIGNvbnN0IGNmZiA9IG5ldyBDRkYoKTsKICAgIHRoaXMuY2ZmID0gY2ZmOwogICAgY29uc3QgaGVhZGVyID0gdGhpcy5wYXJzZUhlYWRlcigpOwogICAgY29uc3QgbmFtZUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KGhlYWRlci5lbmRQb3MpOwogICAgY29uc3QgdG9wRGljdEluZGV4ID0gdGhpcy5wYXJzZUluZGV4KG5hbWVJbmRleC5lbmRQb3MpOwogICAgY29uc3Qgc3RyaW5nSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgodG9wRGljdEluZGV4LmVuZFBvcyk7CiAgICBjb25zdCBnbG9iYWxTdWJySW5kZXggPSB0aGlzLnBhcnNlSW5kZXgoc3RyaW5nSW5kZXguZW5kUG9zKTsKICAgIGNvbnN0IHRvcERpY3RQYXJzZWQgPSB0aGlzLnBhcnNlRGljdCh0b3BEaWN0SW5kZXgub2JqLmdldCgwKSk7CiAgICBjb25zdCB0b3BEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlRvcERpY3QsIHRvcERpY3RQYXJzZWQsIGNmZi5zdHJpbmdzKTsKICAgIGNmZi5oZWFkZXIgPSBoZWFkZXIub2JqOwogICAgY2ZmLm5hbWVzID0gdGhpcy5wYXJzZU5hbWVJbmRleChuYW1lSW5kZXgub2JqKTsKICAgIGNmZi5zdHJpbmdzID0gdGhpcy5wYXJzZVN0cmluZ0luZGV4KHN0cmluZ0luZGV4Lm9iaik7CiAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7CiAgICBjZmYuZ2xvYmFsU3VickluZGV4ID0gZ2xvYmFsU3VickluZGV4Lm9iajsKICAgIHRoaXMucGFyc2VQcml2YXRlRGljdChjZmYudG9wRGljdCk7CiAgICBjZmYuaXNDSURGb250ID0gdG9wRGljdC5oYXNOYW1lKCJST1MiKTsKICAgIGNvbnN0IGNoYXJTdHJpbmdPZmZzZXQgPSB0b3BEaWN0LmdldEJ5TmFtZSgiQ2hhclN0cmluZ3MiKTsKICAgIGNvbnN0IGNoYXJTdHJpbmdJbmRleCA9IHRoaXMucGFyc2VJbmRleChjaGFyU3RyaW5nT2Zmc2V0KS5vYmo7CiAgICBjb25zdCBmb250TWF0cml4ID0gdG9wRGljdC5nZXRCeU5hbWUoIkZvbnRNYXRyaXgiKTsKICAgIGlmIChmb250TWF0cml4KSB7CiAgICAgIHByb3BlcnRpZXMuZm9udE1hdHJpeCA9IGZvbnRNYXRyaXg7CiAgICB9CiAgICBjb25zdCBmb250QkJveCA9IHRvcERpY3QuZ2V0QnlOYW1lKCJGb250QkJveCIpOwogICAgaWYgKGZvbnRCQm94KSB7CiAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgcHJvcGVydGllcy5kZXNjZW50ID0gTWF0aC5taW4oZm9udEJCb3hbMV0sIGZvbnRCQm94WzNdKTsKICAgICAgcHJvcGVydGllcy5hc2NlbnRTY2FsZWQgPSB0cnVlOwogICAgfQogICAgbGV0IGNoYXJzZXQsIGVuY29kaW5nOwogICAgaWYgKGNmZi5pc0NJREZvbnQpIHsKICAgICAgY29uc3QgZmRBcnJheUluZGV4ID0gdGhpcy5wYXJzZUluZGV4KHRvcERpY3QuZ2V0QnlOYW1lKCJGREFycmF5IikpLm9iajsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZmRBcnJheUluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgewogICAgICAgIGNvbnN0IGRpY3RSYXcgPSBmZEFycmF5SW5kZXguZ2V0KGkpOwogICAgICAgIGNvbnN0IGZvbnREaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlRvcERpY3QsIHRoaXMucGFyc2VEaWN0KGRpY3RSYXcpLCBjZmYuc3RyaW5ncyk7CiAgICAgICAgdGhpcy5wYXJzZVByaXZhdGVEaWN0KGZvbnREaWN0KTsKICAgICAgICBjZmYuZmRBcnJheS5wdXNoKGZvbnREaWN0KTsKICAgICAgfQogICAgICBlbmNvZGluZyA9IG51bGw7CiAgICAgIGNoYXJzZXQgPSB0aGlzLnBhcnNlQ2hhcnNldHModG9wRGljdC5nZXRCeU5hbWUoImNoYXJzZXQiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50LCBjZmYuc3RyaW5ncywgdHJ1ZSk7CiAgICAgIGNmZi5mZFNlbGVjdCA9IHRoaXMucGFyc2VGRFNlbGVjdCh0b3BEaWN0LmdldEJ5TmFtZSgiRkRTZWxlY3QiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50KTsKICAgIH0gZWxzZSB7CiAgICAgIGNoYXJzZXQgPSB0aGlzLnBhcnNlQ2hhcnNldHModG9wRGljdC5nZXRCeU5hbWUoImNoYXJzZXQiKSwgY2hhclN0cmluZ0luZGV4LmNvdW50LCBjZmYuc3RyaW5ncywgZmFsc2UpOwogICAgICBlbmNvZGluZyA9IHRoaXMucGFyc2VFbmNvZGluZyh0b3BEaWN0LmdldEJ5TmFtZSgiRW5jb2RpbmciKSwgcHJvcGVydGllcywgY2ZmLnN0cmluZ3MsIGNoYXJzZXQuY2hhcnNldCk7CiAgICB9CiAgICBjZmYuY2hhcnNldCA9IGNoYXJzZXQ7CiAgICBjZmYuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgIGNvbnN0IGNoYXJTdHJpbmdzQW5kU2VhY3MgPSB0aGlzLnBhcnNlQ2hhclN0cmluZ3MoewogICAgICBjaGFyU3RyaW5nczogY2hhclN0cmluZ0luZGV4LAogICAgICBsb2NhbFN1YnJJbmRleDogdG9wRGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4LAogICAgICBnbG9iYWxTdWJySW5kZXg6IGdsb2JhbFN1YnJJbmRleC5vYmosCiAgICAgIGZkU2VsZWN0OiBjZmYuZmRTZWxlY3QsCiAgICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5LAogICAgICBwcml2YXRlRGljdDogdG9wRGljdC5wcml2YXRlRGljdAogICAgfSk7CiAgICBjZmYuY2hhclN0cmluZ3MgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLmNoYXJTdHJpbmdzOwogICAgY2ZmLnNlYWNzID0gY2hhclN0cmluZ3NBbmRTZWFjcy5zZWFjczsKICAgIGNmZi53aWR0aHMgPSBjaGFyU3RyaW5nc0FuZFNlYWNzLndpZHRoczsKICAgIHJldHVybiBjZmY7CiAgfQogIHBhcnNlSGVhZGVyKCkgewogICAgbGV0IGJ5dGVzID0gdGhpcy5ieXRlczsKICAgIGNvbnN0IGJ5dGVzTGVuZ3RoID0gYnl0ZXMubGVuZ3RoOwogICAgbGV0IG9mZnNldCA9IDA7CiAgICB3aGlsZSAob2Zmc2V0IDwgYnl0ZXNMZW5ndGggJiYgYnl0ZXNbb2Zmc2V0XSAhPT0gMSkgewogICAgICArK29mZnNldDsKICAgIH0KICAgIGlmIChvZmZzZXQgPj0gYnl0ZXNMZW5ndGgpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIENGRiBoZWFkZXIiKTsKICAgIH0KICAgIGlmIChvZmZzZXQgIT09IDApIHsKICAgICAgKDAsIF91dGlsLmluZm8pKCJjZmYgZGF0YSBpcyBzaGlmdGVkIik7CiAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KTsKICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwogICAgfQogICAgY29uc3QgbWFqb3IgPSBieXRlc1swXTsKICAgIGNvbnN0IG1pbm9yID0gYnl0ZXNbMV07CiAgICBjb25zdCBoZHJTaXplID0gYnl0ZXNbMl07CiAgICBjb25zdCBvZmZTaXplID0gYnl0ZXNbM107CiAgICBjb25zdCBoZWFkZXIgPSBuZXcgQ0ZGSGVhZGVyKG1ham9yLCBtaW5vciwgaGRyU2l6ZSwgb2ZmU2l6ZSk7CiAgICByZXR1cm4gewogICAgICBvYmo6IGhlYWRlciwKICAgICAgZW5kUG9zOiBoZHJTaXplCiAgICB9OwogIH0KICBwYXJzZURpY3QoZGljdCkgewogICAgbGV0IHBvcyA9IDA7CiAgICBmdW5jdGlvbiBwYXJzZU9wZXJhbmQoKSB7CiAgICAgIGxldCB2YWx1ZSA9IGRpY3RbcG9zKytdOwogICAgICBpZiAodmFsdWUgPT09IDMwKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXRPcGVyYW5kKCk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI4KSB7CiAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCAyNCB8IGRpY3RbcG9zKytdIDw8IDE2KSA+PiAxNjsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI5KSB7CiAgICAgICAgdmFsdWUgPSBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDggfCBkaWN0W3BvcysrXTsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMzIgJiYgdmFsdWUgPD0gMjQ2KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIC0gMTM5OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI0NyAmJiB2YWx1ZSA8PSAyNTApIHsKICAgICAgICByZXR1cm4gKHZhbHVlIC0gMjQ3KSAqIDI1NiArIGRpY3RbcG9zKytdICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDI1MSAmJiB2YWx1ZSA8PSAyNTQpIHsKICAgICAgICByZXR1cm4gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGRpY3RbcG9zKytdIC0gMTA4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKSgnQ0ZGUGFyc2VyX3BhcnNlRGljdDogIicgKyB2YWx1ZSArICciIGlzIGEgcmVzZXJ2ZWQgY29tbWFuZC4nKTsKICAgICAgcmV0dXJuIE5hTjsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlRmxvYXRPcGVyYW5kKCkgewogICAgICBsZXQgc3RyID0gIiI7CiAgICAgIGNvbnN0IGVvZiA9IDE1OwogICAgICBjb25zdCBsb29rdXAgPSBbIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiLiIsICJFIiwgIkUtIiwgbnVsbCwgIi0iXTsKICAgICAgY29uc3QgbGVuZ3RoID0gZGljdC5sZW5ndGg7CiAgICAgIHdoaWxlIChwb3MgPCBsZW5ndGgpIHsKICAgICAgICBjb25zdCBiID0gZGljdFtwb3MrK107CiAgICAgICAgY29uc3QgYjEgPSBiID4+IDQ7CiAgICAgICAgY29uc3QgYjIgPSBiICYgMTU7CiAgICAgICAgaWYgKGIxID09PSBlb2YpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHIgKz0gbG9va3VwW2IxXTsKICAgICAgICBpZiAoYjIgPT09IGVvZikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0ciArPSBsb29rdXBbYjJdOwogICAgICB9CiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0cik7CiAgICB9CiAgICBsZXQgb3BlcmFuZHMgPSBbXTsKICAgIGNvbnN0IGVudHJpZXMgPSBbXTsKICAgIHBvcyA9IDA7CiAgICBjb25zdCBlbmQgPSBkaWN0Lmxlbmd0aDsKICAgIHdoaWxlIChwb3MgPCBlbmQpIHsKICAgICAgbGV0IGIgPSBkaWN0W3Bvc107CiAgICAgIGlmIChiIDw9IDIxKSB7CiAgICAgICAgaWYgKGIgPT09IDEyKSB7CiAgICAgICAgICBiID0gYiA8PCA4IHwgZGljdFsrK3Bvc107CiAgICAgICAgfQogICAgICAgIGVudHJpZXMucHVzaChbYiwgb3BlcmFuZHNdKTsKICAgICAgICBvcGVyYW5kcyA9IFtdOwogICAgICAgICsrcG9zOwogICAgICB9IGVsc2UgewogICAgICAgIG9wZXJhbmRzLnB1c2gocGFyc2VPcGVyYW5kKCkpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZW50cmllczsKICB9CiAgcGFyc2VJbmRleChwb3MpIHsKICAgIGNvbnN0IGNmZkluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXM7CiAgICBjb25zdCBjb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgY29uc3Qgb2Zmc2V0cyA9IFtdOwogICAgbGV0IGVuZCA9IHBvczsKICAgIGxldCBpLCBpaTsKICAgIGlmIChjb3VudCAhPT0gMCkgewogICAgICBjb25zdCBvZmZzZXRTaXplID0gYnl0ZXNbcG9zKytdOwogICAgICBjb25zdCBzdGFydFBvcyA9IHBvcyArIChjb3VudCArIDEpICogb2Zmc2V0U2l6ZSAtIDE7CiAgICAgIGZvciAoaSA9IDAsIGlpID0gY291bnQgKyAxOyBpIDwgaWk7ICsraSkgewogICAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2Zmc2V0U2l6ZTsgKytqKSB7CiAgICAgICAgICBvZmZzZXQgPDw9IDg7CiAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNbcG9zKytdOwogICAgICAgIH0KICAgICAgICBvZmZzZXRzLnB1c2goc3RhcnRQb3MgKyBvZmZzZXQpOwogICAgICB9CiAgICAgIGVuZCA9IG9mZnNldHNbY291bnRdOwogICAgfQogICAgZm9yIChpID0gMCwgaWkgPSBvZmZzZXRzLmxlbmd0aCAtIDE7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IG9mZnNldFN0YXJ0ID0gb2Zmc2V0c1tpXTsKICAgICAgY29uc3Qgb2Zmc2V0RW5kID0gb2Zmc2V0c1tpICsgMV07CiAgICAgIGNmZkluZGV4LmFkZChieXRlcy5zdWJhcnJheShvZmZzZXRTdGFydCwgb2Zmc2V0RW5kKSk7CiAgICB9CiAgICByZXR1cm4gewogICAgICBvYmo6IGNmZkluZGV4LAogICAgICBlbmRQb3M6IGVuZAogICAgfTsKICB9CiAgcGFyc2VOYW1lSW5kZXgoaW5kZXgpIHsKICAgIGNvbnN0IG5hbWVzID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBpbmRleC5jb3VudDsgaSA8IGlpOyArK2kpIHsKICAgICAgY29uc3QgbmFtZSA9IGluZGV4LmdldChpKTsKICAgICAgbmFtZXMucHVzaCgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykobmFtZSkpOwogICAgfQogICAgcmV0dXJuIG5hbWVzOwogIH0KICBwYXJzZVN0cmluZ0luZGV4KGluZGV4KSB7CiAgICBjb25zdCBzdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGluZGV4LmNvdW50OyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBkYXRhID0gaW5kZXguZ2V0KGkpOwogICAgICBzdHJpbmdzLmFkZCgoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YSkpOwogICAgfQogICAgcmV0dXJuIHN0cmluZ3M7CiAgfQogIGNyZWF0ZURpY3QoVHlwZSwgZGljdCwgc3RyaW5ncykgewogICAgY29uc3QgY2ZmRGljdCA9IG5ldyBUeXBlKHN0cmluZ3MpOwogICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGljdCkgewogICAgICBjZmZEaWN0LnNldEJ5S2V5KGtleSwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGNmZkRpY3Q7CiAgfQogIHBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgZGF0YSwgbG9jYWxTdWJySW5kZXgsIGdsb2JhbFN1YnJJbmRleCkgewogICAgaWYgKCFkYXRhIHx8IHN0YXRlLmNhbGxEZXB0aCA+IE1BWF9TVUJSX05FU1RJTkcpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgbGV0IHN0YWNrU2l6ZSA9IHN0YXRlLnN0YWNrU2l6ZTsKICAgIGNvbnN0IHN0YWNrID0gc3RhdGUuc3RhY2s7CiAgICBsZXQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbmd0aDspIHsKICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2orK107CiAgICAgIGxldCB2YWxpZGF0aW9uQ29tbWFuZCA9IG51bGw7CiAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKICAgICAgICBjb25zdCBxID0gZGF0YVtqKytdOwogICAgICAgIGlmIChxID09PSAwKSB7CiAgICAgICAgICBkYXRhW2ogLSAyXSA9IDEzOTsKICAgICAgICAgIGRhdGFbaiAtIDFdID0gMjI7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YTEyW3FdOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMjgpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gKGRhdGFbal0gPDwgMjQgfCBkYXRhW2ogKyAxXSA8PCAxNikgPj4gMTY7CiAgICAgICAgaiArPSAyOwogICAgICAgIHN0YWNrU2l6ZSsrOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxNCkgewogICAgICAgIGlmIChzdGFja1NpemUgPj0gNCkgewogICAgICAgICAgc3RhY2tTaXplIC09IDQ7CiAgICAgICAgICBpZiAodGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICAgICAgICAgIHN0YXRlLnNlYWMgPSBzdGFjay5zbGljZShzdGFja1NpemUsIHN0YWNrU2l6ZSArIDQpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhW3ZhbHVlXTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSAzMiAmJiB2YWx1ZSA8PSAyNDYpIHsKICAgICAgICBzdGFja1tzdGFja1NpemVdID0gdmFsdWUgLSAxMzk7CiAgICAgICAgc3RhY2tTaXplKys7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMjQ3ICYmIHZhbHVlIDw9IDI1NCkgewogICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSB2YWx1ZSA8IDI1MSA/ICh2YWx1ZSAtIDI0NyA8PCA4KSArIGRhdGFbal0gKyAxMDggOiAtKHZhbHVlIC0gMjUxIDw8IDgpIC0gZGF0YVtqXSAtIDEwODsKICAgICAgICBqKys7CiAgICAgICAgc3RhY2tTaXplKys7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDI1NSkgewogICAgICAgIHN0YWNrW3N0YWNrU2l6ZV0gPSAoZGF0YVtqXSA8PCAyNCB8IGRhdGFbaiArIDFdIDw8IDE2IHwgZGF0YVtqICsgMl0gPDwgOCB8IGRhdGFbaiArIDNdKSAvIDY1NTM2OwogICAgICAgIGogKz0gNDsKICAgICAgICBzdGFja1NpemUrKzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTkgfHwgdmFsdWUgPT09IDIwKSB7CiAgICAgICAgc3RhdGUuaGludHMgKz0gc3RhY2tTaXplID4+IDE7CiAgICAgICAgaWYgKHN0YXRlLmhpbnRzID09PSAwKSB7CiAgICAgICAgICBkYXRhLmNvcHlXaXRoaW4oaiAtIDEsIGosIC0xKTsKICAgICAgICAgIGogLT0gMTsKICAgICAgICAgIGxlbmd0aCAtPSAxOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGogKz0gc3RhdGUuaGludHMgKyA3ID4+IDM7CiAgICAgICAgc3RhY2tTaXplICU9IDI7CiAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAxMCB8fCB2YWx1ZSA9PT0gMjkpIHsKICAgICAgICBsZXQgc3VicnNJbmRleDsKICAgICAgICBpZiAodmFsdWUgPT09IDEwKSB7CiAgICAgICAgICBzdWJyc0luZGV4ID0gbG9jYWxTdWJySW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1YnJzSW5kZXggPSBnbG9iYWxTdWJySW5kZXg7CiAgICAgICAgfQogICAgICAgIGlmICghc3VicnNJbmRleCkgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJNaXNzaW5nIHN1YnJzSW5kZXggZm9yICIgKyB2YWxpZGF0aW9uQ29tbWFuZC5pZCk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGxldCBiaWFzID0gMzI3Njg7CiAgICAgICAgaWYgKHN1YnJzSW5kZXguY291bnQgPCAxMjQwKSB7CiAgICAgICAgICBiaWFzID0gMTA3OwogICAgICAgIH0gZWxzZSBpZiAoc3VicnNJbmRleC5jb3VudCA8IDMzOTAwKSB7CiAgICAgICAgICBiaWFzID0gMTEzMTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3Vick51bWJlciA9IHN0YWNrWy0tc3RhY2tTaXplXSArIGJpYXM7CiAgICAgICAgaWYgKHN1YnJOdW1iZXIgPCAwIHx8IHN1YnJOdW1iZXIgPj0gc3VicnNJbmRleC5jb3VudCB8fCBpc05hTihzdWJyTnVtYmVyKSkgewogICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQgPSBDaGFyc3RyaW5nVmFsaWRhdGlvbkRhdGFbdmFsdWVdOwogICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJPdXQgb2YgYm91bmRzIHN1YnJJbmRleCBmb3IgIiArIHZhbGlkYXRpb25Db21tYW5kLmlkKTsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGUuc3RhY2tTaXplID0gc3RhY2tTaXplOwogICAgICAgIHN0YXRlLmNhbGxEZXB0aCsrOwogICAgICAgIGNvbnN0IHZhbGlkID0gdGhpcy5wYXJzZUNoYXJTdHJpbmcoc3RhdGUsIHN1YnJzSW5kZXguZ2V0KHN1YnJOdW1iZXIpLCBsb2NhbFN1YnJJbmRleCwgZ2xvYmFsU3VickluZGV4KTsKICAgICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHN0YXRlLmNhbGxEZXB0aC0tOwogICAgICAgIHN0YWNrU2l6ZSA9IHN0YXRlLnN0YWNrU2l6ZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gMTEpIHsKICAgICAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IDAgJiYgaiA9PT0gZGF0YS5sZW5ndGgpIHsKICAgICAgICBkYXRhW2ogLSAxXSA9IDE0OwogICAgICAgIHZhbGlkYXRpb25Db21tYW5kID0gQ2hhcnN0cmluZ1ZhbGlkYXRpb25EYXRhWzE0XTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gOSkgewogICAgICAgIGRhdGEuY29weVdpdGhpbihqIC0gMSwgaiwgLTEpOwogICAgICAgIGogLT0gMTsKICAgICAgICBsZW5ndGggLT0gMTsKICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWxpZGF0aW9uQ29tbWFuZCA9IENoYXJzdHJpbmdWYWxpZGF0aW9uRGF0YVt2YWx1ZV07CiAgICAgIH0KICAgICAgaWYgKHZhbGlkYXRpb25Db21tYW5kKSB7CiAgICAgICAgaWYgKHZhbGlkYXRpb25Db21tYW5kLnN0ZW0pIHsKICAgICAgICAgIHN0YXRlLmhpbnRzICs9IHN0YWNrU2l6ZSA+PiAxOwogICAgICAgICAgaWYgKHZhbHVlID09PSAzIHx8IHZhbHVlID09PSAyMykgewogICAgICAgICAgICBzdGF0ZS5oYXNWU3RlbXMgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5oYXNWU3RlbXMgJiYgKHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAxOCkpIHsKICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCJDRkYgc3RlbSBoaW50cyBhcmUgaW4gd3Jvbmcgb3JkZXIiKTsKICAgICAgICAgICAgZGF0YVtqIC0gMV0gPSB2YWx1ZSA9PT0gMSA/IDMgOiAyMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCJtaW4iIGluIHZhbGlkYXRpb25Db21tYW5kKSB7CiAgICAgICAgICBpZiAoIXN0YXRlLnVuZGVmU3RhY2sgJiYgc3RhY2tTaXplIDwgdmFsaWRhdGlvbkNvbW1hbmQubWluKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiTm90IGVub3VnaCBwYXJhbWV0ZXJzIGZvciAiICsgdmFsaWRhdGlvbkNvbW1hbmQuaWQgKyAiOyBhY3R1YWw6ICIgKyBzdGFja1NpemUgKyAiLCBleHBlY3RlZDogIiArIHZhbGlkYXRpb25Db21tYW5kLm1pbik7CiAgICAgICAgICAgIGlmIChzdGFja1NpemUgPT09IDApIHsKICAgICAgICAgICAgICBkYXRhW2ogLSAxXSA9IDE0OwogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlLmZpcnN0U3RhY2tDbGVhcmluZyAmJiB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0NsZWFyaW5nKSB7CiAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTsKICAgICAgICAgIHN0YWNrU2l6ZSAtPSB2YWxpZGF0aW9uQ29tbWFuZC5taW47CiAgICAgICAgICBpZiAoc3RhY2tTaXplID49IDIgJiYgdmFsaWRhdGlvbkNvbW1hbmQuc3RlbSkgewogICAgICAgICAgICBzdGFja1NpemUgJT0gMjsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tTaXplID4gMSkgewogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkZvdW5kIHRvbyBtYW55IHBhcmFtZXRlcnMgZm9yIHN0YWNrLWNsZWFyaW5nIGNvbW1hbmQiKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGFja1NpemUgPiAwKSB7CiAgICAgICAgICAgIHN0YXRlLndpZHRoID0gc3RhY2tbc3RhY2tTaXplIC0gMV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgic3RhY2tEZWx0YSIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKICAgICAgICAgIGlmICgic3RhY2tGbiIgaW4gdmFsaWRhdGlvbkNvbW1hbmQpIHsKICAgICAgICAgICAgdmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tGbihzdGFjaywgc3RhY2tTaXplKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YWNrU2l6ZSArPSB2YWxpZGF0aW9uQ29tbWFuZC5zdGFja0RlbHRhOwogICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbkNvbW1hbmQuc3RhY2tDbGVhcmluZykgewogICAgICAgICAgc3RhY2tTaXplID0gMDsKICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25Db21tYW5kLnJlc2V0U3RhY2spIHsKICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CiAgICAgICAgICBzdGF0ZS51bmRlZlN0YWNrID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0aW9uQ29tbWFuZC51bmRlZlN0YWNrKSB7CiAgICAgICAgICBzdGFja1NpemUgPSAwOwogICAgICAgICAgc3RhdGUudW5kZWZTdGFjayA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5maXJzdFN0YWNrQ2xlYXJpbmcgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChsZW5ndGggPCBkYXRhLmxlbmd0aCkgewogICAgICBkYXRhLmZpbGwoMTQsIGxlbmd0aCk7CiAgICB9CiAgICBzdGF0ZS5zdGFja1NpemUgPSBzdGFja1NpemU7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcGFyc2VDaGFyU3RyaW5ncyh7CiAgICBjaGFyU3RyaW5ncywKICAgIGxvY2FsU3VickluZGV4LAogICAgZ2xvYmFsU3VickluZGV4LAogICAgZmRTZWxlY3QsCiAgICBmZEFycmF5LAogICAgcHJpdmF0ZURpY3QKICB9KSB7CiAgICBjb25zdCBzZWFjcyA9IFtdOwogICAgY29uc3Qgd2lkdGhzID0gW107CiAgICBjb25zdCBjb3VudCA9IGNoYXJTdHJpbmdzLmNvdW50OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmcgPSBjaGFyU3RyaW5ncy5nZXQoaSk7CiAgICAgIGNvbnN0IHN0YXRlID0gewogICAgICAgIGNhbGxEZXB0aDogMCwKICAgICAgICBzdGFja1NpemU6IDAsCiAgICAgICAgc3RhY2s6IFtdLAogICAgICAgIHVuZGVmU3RhY2s6IHRydWUsCiAgICAgICAgaGludHM6IDAsCiAgICAgICAgZmlyc3RTdGFja0NsZWFyaW5nOiB0cnVlLAogICAgICAgIHNlYWM6IG51bGwsCiAgICAgICAgd2lkdGg6IG51bGwsCiAgICAgICAgaGFzVlN0ZW1zOiBmYWxzZQogICAgICB9OwogICAgICBsZXQgdmFsaWQgPSB0cnVlOwogICAgICBsZXQgbG9jYWxTdWJyVG9Vc2UgPSBudWxsOwogICAgICBsZXQgcHJpdmF0ZURpY3RUb1VzZSA9IHByaXZhdGVEaWN0OwogICAgICBpZiAoZmRTZWxlY3QgJiYgZmRBcnJheS5sZW5ndGgpIHsKICAgICAgICBjb25zdCBmZEluZGV4ID0gZmRTZWxlY3QuZ2V0RkRJbmRleChpKTsKICAgICAgICBpZiAoZmRJbmRleCA9PT0gLTEpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiR2x5cGggaW5kZXggaXMgbm90IGluIGZkIHNlbGVjdC4iKTsKICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChmZEluZGV4ID49IGZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpOwogICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICBwcml2YXRlRGljdFRvVXNlID0gZmRBcnJheVtmZEluZGV4XS5wcml2YXRlRGljdDsKICAgICAgICAgIGxvY2FsU3ViclRvVXNlID0gcHJpdmF0ZURpY3RUb1VzZS5zdWJyc0luZGV4OwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChsb2NhbFN1YnJJbmRleCkgewogICAgICAgIGxvY2FsU3ViclRvVXNlID0gbG9jYWxTdWJySW5kZXg7CiAgICAgIH0KICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgdmFsaWQgPSB0aGlzLnBhcnNlQ2hhclN0cmluZyhzdGF0ZSwgY2hhcnN0cmluZywgbG9jYWxTdWJyVG9Vc2UsIGdsb2JhbFN1YnJJbmRleCk7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLndpZHRoICE9PSBudWxsKSB7CiAgICAgICAgY29uc3Qgbm9taW5hbFdpZHRoID0gcHJpdmF0ZURpY3RUb1VzZS5nZXRCeU5hbWUoIm5vbWluYWxXaWR0aFgiKTsKICAgICAgICB3aWR0aHNbaV0gPSBub21pbmFsV2lkdGggKyBzdGF0ZS53aWR0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSBwcml2YXRlRGljdFRvVXNlLmdldEJ5TmFtZSgiZGVmYXVsdFdpZHRoWCIpOwogICAgICAgIHdpZHRoc1tpXSA9IGRlZmF1bHRXaWR0aDsKICAgICAgfQogICAgICBpZiAoc3RhdGUuc2VhYyAhPT0gbnVsbCkgewogICAgICAgIHNlYWNzW2ldID0gc3RhdGUuc2VhYzsKICAgICAgfQogICAgICBpZiAoIXZhbGlkKSB7CiAgICAgICAgY2hhclN0cmluZ3Muc2V0KGksIG5ldyBVaW50OEFycmF5KFsxNF0pKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgY2hhclN0cmluZ3MsCiAgICAgIHNlYWNzLAogICAgICB3aWR0aHMKICAgIH07CiAgfQogIGVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCkgewogICAgY29uc3QgcHJpdmF0ZURpY3QgPSB0aGlzLmNyZWF0ZURpY3QoQ0ZGUHJpdmF0ZURpY3QsIFtdLCBwYXJlbnREaWN0LnN0cmluZ3MpOwogICAgcGFyZW50RGljdC5zZXRCeUtleSgxOCwgWzAsIDBdKTsKICAgIHBhcmVudERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICB9CiAgcGFyc2VQcml2YXRlRGljdChwYXJlbnREaWN0KSB7CiAgICBpZiAoIXBhcmVudERpY3QuaGFzTmFtZSgiUHJpdmF0ZSIpKSB7CiAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcHJpdmF0ZU9mZnNldCA9IHBhcmVudERpY3QuZ2V0QnlOYW1lKCJQcml2YXRlIik7CiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJpdmF0ZU9mZnNldCkgfHwgcHJpdmF0ZU9mZnNldC5sZW5ndGggIT09IDIpIHsKICAgICAgcGFyZW50RGljdC5yZW1vdmVCeU5hbWUoIlByaXZhdGUiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgc2l6ZSA9IHByaXZhdGVPZmZzZXRbMF07CiAgICBjb25zdCBvZmZzZXQgPSBwcml2YXRlT2Zmc2V0WzFdOwogICAgaWYgKHNpemUgPT09IDAgfHwgb2Zmc2V0ID49IHRoaXMuYnl0ZXMubGVuZ3RoKSB7CiAgICAgIHRoaXMuZW1wdHlQcml2YXRlRGljdGlvbmFyeShwYXJlbnREaWN0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcHJpdmF0ZURpY3RFbmQgPSBvZmZzZXQgKyBzaXplOwogICAgY29uc3QgZGljdERhdGEgPSB0aGlzLmJ5dGVzLnN1YmFycmF5KG9mZnNldCwgcHJpdmF0ZURpY3RFbmQpOwogICAgY29uc3QgZGljdCA9IHRoaXMucGFyc2VEaWN0KGRpY3REYXRhKTsKICAgIGNvbnN0IHByaXZhdGVEaWN0ID0gdGhpcy5jcmVhdGVEaWN0KENGRlByaXZhdGVEaWN0LCBkaWN0LCBwYXJlbnREaWN0LnN0cmluZ3MpOwogICAgcGFyZW50RGljdC5wcml2YXRlRGljdCA9IHByaXZhdGVEaWN0OwogICAgaWYgKHByaXZhdGVEaWN0LmdldEJ5TmFtZSgiRXhwYW5zaW9uRmFjdG9yIikgPT09IDApIHsKICAgICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKCJFeHBhbnNpb25GYWN0b3IiLCAwLjA2KTsKICAgIH0KICAgIGlmICghcHJpdmF0ZURpY3QuZ2V0QnlOYW1lKCJTdWJycyIpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHN1YnJzT2Zmc2V0ID0gcHJpdmF0ZURpY3QuZ2V0QnlOYW1lKCJTdWJycyIpOwogICAgY29uc3QgcmVsYXRpdmVPZmZzZXQgPSBvZmZzZXQgKyBzdWJyc09mZnNldDsKICAgIGlmIChzdWJyc09mZnNldCA9PT0gMCB8fCByZWxhdGl2ZU9mZnNldCA+PSB0aGlzLmJ5dGVzLmxlbmd0aCkgewogICAgICB0aGlzLmVtcHR5UHJpdmF0ZURpY3Rpb25hcnkocGFyZW50RGljdCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHN1YnJzSW5kZXggPSB0aGlzLnBhcnNlSW5kZXgocmVsYXRpdmVPZmZzZXQpOwogICAgcHJpdmF0ZURpY3Quc3VicnNJbmRleCA9IHN1YnJzSW5kZXgub2JqOwogIH0KICBwYXJzZUNoYXJzZXRzKHBvcywgbGVuZ3RoLCBzdHJpbmdzLCBjaWQpIHsKICAgIGlmIChwb3MgPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuSVNPX0FET0JFLCBfY2hhcnNldHMuSVNPQWRvYmVDaGFyc2V0KTsKICAgIH0gZWxzZSBpZiAocG9zID09PSAxKSB7CiAgICAgIHJldHVybiBuZXcgQ0ZGQ2hhcnNldCh0cnVlLCBDRkZDaGFyc2V0UHJlZGVmaW5lZFR5cGVzLkVYUEVSVCwgX2NoYXJzZXRzLkV4cGVydENoYXJzZXQpOwogICAgfSBlbHNlIGlmIChwb3MgPT09IDIpIHsKICAgICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KHRydWUsIENGRkNoYXJzZXRQcmVkZWZpbmVkVHlwZXMuRVhQRVJUX1NVQlNFVCwgX2NoYXJzZXRzLkV4cGVydFN1YnNldENoYXJzZXQpOwogICAgfQogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3Qgc3RhcnQgPSBwb3M7CiAgICBjb25zdCBmb3JtYXQgPSBieXRlc1twb3MrK107CiAgICBjb25zdCBjaGFyc2V0ID0gW2NpZCA/IDAgOiAiLm5vdGRlZiJdOwogICAgbGV0IGlkLCBjb3VudCwgaTsKICAgIGxlbmd0aCAtPSAxOwogICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgaWQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCA6IHN0cmluZ3MuZ2V0KGlkKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgd2hpbGUgKGNoYXJzZXQubGVuZ3RoIDw9IGxlbmd0aCkgewogICAgICAgICAgaWQgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGNvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIHdoaWxlIChjaGFyc2V0Lmxlbmd0aCA8PSBsZW5ndGgpIHsKICAgICAgICAgIGlkID0gYnl0ZXNbcG9zKytdIDw8IDggfCBieXRlc1twb3MrK107CiAgICAgICAgICBjb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgIGNoYXJzZXQucHVzaChjaWQgPyBpZCsrIDogc3RyaW5ncy5nZXQoaWQrKykpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlVua25vd24gY2hhcnNldCBmb3JtYXQiKTsKICAgIH0KICAgIGNvbnN0IGVuZCA9IHBvczsKICAgIGNvbnN0IHJhdyA9IGJ5dGVzLnN1YmFycmF5KHN0YXJ0LCBlbmQpOwogICAgcmV0dXJuIG5ldyBDRkZDaGFyc2V0KGZhbHNlLCBmb3JtYXQsIGNoYXJzZXQsIHJhdyk7CiAgfQogIHBhcnNlRW5jb2RpbmcocG9zLCBwcm9wZXJ0aWVzLCBzdHJpbmdzLCBjaGFyc2V0KSB7CiAgICBjb25zdCBlbmNvZGluZyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCBieXRlcyA9IHRoaXMuYnl0ZXM7CiAgICBsZXQgcHJlZGVmaW5lZCA9IGZhbHNlOwogICAgbGV0IGZvcm1hdCwgaSwgaWk7CiAgICBsZXQgcmF3ID0gbnVsbDsKICAgIGZ1bmN0aW9uIHJlYWRTdXBwbGVtZW50KCkgewogICAgICBjb25zdCBzdXBwbGVtZW50c0NvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICBmb3IgKGkgPSAwOyBpIDwgc3VwcGxlbWVudHNDb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGJ5dGVzW3BvcysrXTsKICAgICAgICBjb25zdCBzaWQgPSAoYnl0ZXNbcG9zKytdIDw8IDgpICsgKGJ5dGVzW3BvcysrXSAmIDB4ZmYpOwogICAgICAgIGVuY29kaW5nW2NvZGVdID0gY2hhcnNldC5pbmRleE9mKHN0cmluZ3MuZ2V0KHNpZCkpOwogICAgICB9CiAgICB9CiAgICBpZiAocG9zID09PSAwIHx8IHBvcyA9PT0gMSkgewogICAgICBwcmVkZWZpbmVkID0gdHJ1ZTsKICAgICAgZm9ybWF0ID0gcG9zOwogICAgICBjb25zdCBiYXNlRW5jb2RpbmcgPSBwb3MgPyBfZW5jb2RpbmdzLkV4cGVydEVuY29kaW5nIDogX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGNoYXJzZXQubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGluZGV4ID0gYmFzZUVuY29kaW5nLmluZGV4T2YoY2hhcnNldFtpXSk7CiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgZW5jb2RpbmdbaW5kZXhdID0gaTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGRhdGFTdGFydCA9IHBvczsKICAgICAgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgICBzd2l0Y2ggKGZvcm1hdCAmIDB4N2YpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBjb25zdCBnbHlwaHNDb3VudCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZ2x5cGhzQ291bnQ7IGkrKykgewogICAgICAgICAgICBlbmNvZGluZ1tieXRlc1twb3MrK11dID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIGNvbnN0IHJhbmdlc0NvdW50ID0gYnl0ZXNbcG9zKytdOwogICAgICAgICAgbGV0IGdpZCA9IDE7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2VzQ291bnQ7IGkrKykgewogICAgICAgICAgICBjb25zdCBzdGFydCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgY29uc3QgbGVmdCA9IGJ5dGVzW3BvcysrXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IHN0YXJ0ICsgbGVmdDsgaisrKSB7CiAgICAgICAgICAgICAgZW5jb2Rpbmdbal0gPSBnaWQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBlbmNvZGluZyBmb3JtYXQ6ICR7Zm9ybWF0fSBpbiBDRkZgKTsKICAgICAgfQogICAgICBjb25zdCBkYXRhRW5kID0gcG9zOwogICAgICBpZiAoZm9ybWF0ICYgMHg4MCkgewogICAgICAgIGJ5dGVzW2RhdGFTdGFydF0gJj0gMHg3ZjsKICAgICAgICByZWFkU3VwcGxlbWVudCgpOwogICAgICB9CiAgICAgIHJhdyA9IGJ5dGVzLnN1YmFycmF5KGRhdGFTdGFydCwgZGF0YUVuZCk7CiAgICB9CiAgICBmb3JtYXQgJj0gMHg3ZjsKICAgIHJldHVybiBuZXcgQ0ZGRW5jb2RpbmcocHJlZGVmaW5lZCwgZm9ybWF0LCBlbmNvZGluZywgcmF3KTsKICB9CiAgcGFyc2VGRFNlbGVjdChwb3MsIGxlbmd0aCkgewogICAgY29uc3QgYnl0ZXMgPSB0aGlzLmJ5dGVzOwogICAgY29uc3QgZm9ybWF0ID0gYnl0ZXNbcG9zKytdOwogICAgY29uc3QgZmRTZWxlY3QgPSBbXTsKICAgIGxldCBpOwogICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgY29uc3QgaWQgPSBieXRlc1twb3MrK107CiAgICAgICAgICBmZFNlbGVjdC5wdXNoKGlkKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBjb25zdCByYW5nZXNDb3VudCA9IGJ5dGVzW3BvcysrXSA8PCA4IHwgYnl0ZXNbcG9zKytdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXNDb3VudDsgKytpKSB7CiAgICAgICAgICBsZXQgZmlyc3QgPSBieXRlc1twb3MrK10gPDwgOCB8IGJ5dGVzW3BvcysrXTsKICAgICAgICAgIGlmIChpID09PSAwICYmIGZpcnN0ICE9PSAwKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgicGFyc2VGRFNlbGVjdDogVGhlIGZpcnN0IHJhbmdlIG11c3QgaGF2ZSBhIGZpcnN0IEdJRCBvZiAwIiArICIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuIik7CiAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IGZkSW5kZXggPSBieXRlc1twb3MrK107CiAgICAgICAgICBjb25zdCBuZXh0ID0gYnl0ZXNbcG9zXSA8PCA4IHwgYnl0ZXNbcG9zICsgMV07CiAgICAgICAgICBmb3IgKGxldCBqID0gZmlyc3Q7IGogPCBuZXh0OyArK2opIHsKICAgICAgICAgICAgZmRTZWxlY3QucHVzaChmZEluZGV4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9zICs9IDI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBwYXJzZUZEU2VsZWN0OiBVbmtub3duIGZvcm1hdCAiJHtmb3JtYXR9Ii5gKTsKICAgIH0KICAgIGlmIChmZFNlbGVjdC5sZW5ndGggIT09IGxlbmd0aCkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInBhcnNlRkRTZWxlY3Q6IEludmFsaWQgZm9udCBkYXRhLiIpOwogICAgfQogICAgcmV0dXJuIG5ldyBDRkZGRFNlbGVjdChmb3JtYXQsIGZkU2VsZWN0KTsKICB9Cn0KZXhwb3J0cy5DRkZQYXJzZXIgPSBDRkZQYXJzZXI7CmNsYXNzIENGRiB7CiAgY29uc3RydWN0b3IoKSB7CiAgICB0aGlzLmhlYWRlciA9IG51bGw7CiAgICB0aGlzLm5hbWVzID0gW107CiAgICB0aGlzLnRvcERpY3QgPSBudWxsOwogICAgdGhpcy5zdHJpbmdzID0gbmV3IENGRlN0cmluZ3MoKTsKICAgIHRoaXMuZ2xvYmFsU3VickluZGV4ID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmcgPSBudWxsOwogICAgdGhpcy5jaGFyc2V0ID0gbnVsbDsKICAgIHRoaXMuY2hhclN0cmluZ3MgPSBudWxsOwogICAgdGhpcy5mZEFycmF5ID0gW107CiAgICB0aGlzLmZkU2VsZWN0ID0gbnVsbDsKICAgIHRoaXMuaXNDSURGb250ID0gZmFsc2U7CiAgfQogIGR1cGxpY2F0ZUZpcnN0R2x5cGgoKSB7CiAgICBpZiAodGhpcy5jaGFyU3RyaW5ncy5jb3VudCA+PSA2NTUzNSkgewogICAgICAoMCwgX3V0aWwud2FybikoIk5vdCBlbm91Z2ggc3BhY2UgaW4gY2hhcnN0cmluZ3MgdG8gZHVwbGljYXRlIGZpcnN0IGdseXBoLiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBnbHlwaFplcm8gPSB0aGlzLmNoYXJTdHJpbmdzLmdldCgwKTsKICAgIHRoaXMuY2hhclN0cmluZ3MuYWRkKGdseXBoWmVybyk7CiAgICBpZiAodGhpcy5pc0NJREZvbnQpIHsKICAgICAgdGhpcy5mZFNlbGVjdC5mZFNlbGVjdC5wdXNoKHRoaXMuZmRTZWxlY3QuZmRTZWxlY3RbMF0pOwogICAgfQogIH0KICBoYXNHbHlwaElkKGlkKSB7CiAgICBpZiAoaWQgPCAwIHx8IGlkID49IHRoaXMuY2hhclN0cmluZ3MuY291bnQpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgZ2x5cGggPSB0aGlzLmNoYXJTdHJpbmdzLmdldChpZCk7CiAgICByZXR1cm4gZ2x5cGgubGVuZ3RoID4gMDsKICB9Cn0KZXhwb3J0cy5DRkYgPSBDRkY7CmNsYXNzIENGRkhlYWRlciB7CiAgY29uc3RydWN0b3IobWFqb3IsIG1pbm9yLCBoZHJTaXplLCBvZmZTaXplKSB7CiAgICB0aGlzLm1ham9yID0gbWFqb3I7CiAgICB0aGlzLm1pbm9yID0gbWlub3I7CiAgICB0aGlzLmhkclNpemUgPSBoZHJTaXplOwogICAgdGhpcy5vZmZTaXplID0gb2ZmU2l6ZTsKICB9Cn0KZXhwb3J0cy5DRkZIZWFkZXIgPSBDRkZIZWFkZXI7CmNsYXNzIENGRlN0cmluZ3MgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5zdHJpbmdzID0gW107CiAgfQogIGdldChpbmRleCkgewogICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gTlVNX1NUQU5EQVJEX0NGRl9TVFJJTkdTIC0gMSkgewogICAgICByZXR1cm4gQ0ZGU3RhbmRhcmRTdHJpbmdzW2luZGV4XTsKICAgIH0KICAgIGlmIChpbmRleCAtIE5VTV9TVEFOREFSRF9DRkZfU1RSSU5HUyA8PSB0aGlzLnN0cmluZ3MubGVuZ3RoKSB7CiAgICAgIHJldHVybiB0aGlzLnN0cmluZ3NbaW5kZXggLSBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1NdOwogICAgfQogICAgcmV0dXJuIENGRlN0YW5kYXJkU3RyaW5nc1swXTsKICB9CiAgZ2V0U0lEKHN0cikgewogICAgbGV0IGluZGV4ID0gQ0ZGU3RhbmRhcmRTdHJpbmdzLmluZGV4T2Yoc3RyKTsKICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgaW5kZXggPSB0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHIpOwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICByZXR1cm4gaW5kZXggKyBOVU1fU1RBTkRBUkRfQ0ZGX1NUUklOR1M7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQogIGFkZCh2YWx1ZSkgewogICAgdGhpcy5zdHJpbmdzLnB1c2godmFsdWUpOwogIH0KICBnZXQgY291bnQoKSB7CiAgICByZXR1cm4gdGhpcy5zdHJpbmdzLmxlbmd0aDsKICB9Cn0KZXhwb3J0cy5DRkZTdHJpbmdzID0gQ0ZGU3RyaW5nczsKY2xhc3MgQ0ZGSW5kZXggewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5vYmplY3RzID0gW107CiAgICB0aGlzLmxlbmd0aCA9IDA7CiAgfQogIGFkZChkYXRhKSB7CiAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aDsKICAgIHRoaXMub2JqZWN0cy5wdXNoKGRhdGEpOwogIH0KICBzZXQoaW5kZXgsIGRhdGEpIHsKICAgIHRoaXMubGVuZ3RoICs9IGRhdGEubGVuZ3RoIC0gdGhpcy5vYmplY3RzW2luZGV4XS5sZW5ndGg7CiAgICB0aGlzLm9iamVjdHNbaW5kZXhdID0gZGF0YTsKICB9CiAgZ2V0KGluZGV4KSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RzW2luZGV4XTsKICB9CiAgZ2V0IGNvdW50KCkgewogICAgcmV0dXJuIHRoaXMub2JqZWN0cy5sZW5ndGg7CiAgfQp9CmV4cG9ydHMuQ0ZGSW5kZXggPSBDRkZJbmRleDsKY2xhc3MgQ0ZGRGljdCB7CiAgY29uc3RydWN0b3IodGFibGVzLCBzdHJpbmdzKSB7CiAgICB0aGlzLmtleVRvTmFtZU1hcCA9IHRhYmxlcy5rZXlUb05hbWVNYXA7CiAgICB0aGlzLm5hbWVUb0tleU1hcCA9IHRhYmxlcy5uYW1lVG9LZXlNYXA7CiAgICB0aGlzLmRlZmF1bHRzID0gdGFibGVzLmRlZmF1bHRzOwogICAgdGhpcy50eXBlcyA9IHRhYmxlcy50eXBlczsKICAgIHRoaXMub3Bjb2RlcyA9IHRhYmxlcy5vcGNvZGVzOwogICAgdGhpcy5vcmRlciA9IHRhYmxlcy5vcmRlcjsKICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7CiAgICB0aGlzLnZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgfQogIHNldEJ5S2V5KGtleSwgdmFsdWUpIHsKICAgIGlmICghKGtleSBpbiB0aGlzLmtleVRvTmFtZU1hcCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlKSB7CiAgICAgIGlmIChpc05hTih2YWwpKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIENGRkRpY3QgdmFsdWU6ICIke3ZhbHVlfSIgZm9yIGtleSAiJHtrZXl9Ii5gKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZXNba2V5XTsKICAgIGlmICh0eXBlID09PSAibnVtIiB8fCB0eXBlID09PSAic2lkIiB8fCB0eXBlID09PSAib2Zmc2V0IikgewogICAgICB2YWx1ZSA9IHZhbHVlWzBdOwogICAgfQogICAgdGhpcy52YWx1ZXNba2V5XSA9IHZhbHVlOwogICAgcmV0dXJuIHRydWU7CiAgfQogIHNldEJ5TmFtZShuYW1lLCB2YWx1ZSkgewogICAgaWYgKCEobmFtZSBpbiB0aGlzLm5hbWVUb0tleU1hcCkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGRpY3Rpb25hcnkgbmFtZSAiJHtuYW1lfSJgKTsKICAgIH0KICAgIHRoaXMudmFsdWVzW3RoaXMubmFtZVRvS2V5TWFwW25hbWVdXSA9IHZhbHVlOwogIH0KICBoYXNOYW1lKG5hbWUpIHsKICAgIHJldHVybiB0aGlzLm5hbWVUb0tleU1hcFtuYW1lXSBpbiB0aGlzLnZhbHVlczsKICB9CiAgZ2V0QnlOYW1lKG5hbWUpIHsKICAgIGlmICghKG5hbWUgaW4gdGhpcy5uYW1lVG9LZXlNYXApKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBkaWN0aW9uYXJ5IG5hbWUgJHtuYW1lfSJgKTsKICAgIH0KICAgIGNvbnN0IGtleSA9IHRoaXMubmFtZVRvS2V5TWFwW25hbWVdOwogICAgaWYgKCEoa2V5IGluIHRoaXMudmFsdWVzKSkgewogICAgICByZXR1cm4gdGhpcy5kZWZhdWx0c1trZXldOwogICAgfQogICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07CiAgfQogIHJlbW92ZUJ5TmFtZShuYW1lKSB7CiAgICBkZWxldGUgdGhpcy52YWx1ZXNbdGhpcy5uYW1lVG9LZXlNYXBbbmFtZV1dOwogIH0KICBzdGF0aWMgY3JlYXRlVGFibGVzKGxheW91dCkgewogICAgY29uc3QgdGFibGVzID0gewogICAgICBrZXlUb05hbWVNYXA6IHt9LAogICAgICBuYW1lVG9LZXlNYXA6IHt9LAogICAgICBkZWZhdWx0czoge30sCiAgICAgIHR5cGVzOiB7fSwKICAgICAgb3Bjb2Rlczoge30sCiAgICAgIG9yZGVyOiBbXQogICAgfTsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgbGF5b3V0KSB7CiAgICAgIGNvbnN0IGtleSA9IEFycmF5LmlzQXJyYXkoZW50cnlbMF0pID8gKGVudHJ5WzBdWzBdIDw8IDgpICsgZW50cnlbMF1bMV0gOiBlbnRyeVswXTsKICAgICAgdGFibGVzLmtleVRvTmFtZU1hcFtrZXldID0gZW50cnlbMV07CiAgICAgIHRhYmxlcy5uYW1lVG9LZXlNYXBbZW50cnlbMV1dID0ga2V5OwogICAgICB0YWJsZXMudHlwZXNba2V5XSA9IGVudHJ5WzJdOwogICAgICB0YWJsZXMuZGVmYXVsdHNba2V5XSA9IGVudHJ5WzNdOwogICAgICB0YWJsZXMub3Bjb2Rlc1trZXldID0gQXJyYXkuaXNBcnJheShlbnRyeVswXSkgPyBlbnRyeVswXSA6IFtlbnRyeVswXV07CiAgICAgIHRhYmxlcy5vcmRlci5wdXNoKGtleSk7CiAgICB9CiAgICByZXR1cm4gdGFibGVzOwogIH0KfQpjb25zdCBDRkZUb3BEaWN0TGF5b3V0ID0gW1tbMTIsIDMwXSwgIlJPUyIsIFsic2lkIiwgInNpZCIsICJudW0iXSwgbnVsbF0sIFtbMTIsIDIwXSwgIlN5bnRoZXRpY0Jhc2UiLCAibnVtIiwgbnVsbF0sIFswLCAidmVyc2lvbiIsICJzaWQiLCBudWxsXSwgWzEsICJOb3RpY2UiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDBdLCAiQ29weXJpZ2h0IiwgInNpZCIsIG51bGxdLCBbMiwgIkZ1bGxOYW1lIiwgInNpZCIsIG51bGxdLCBbMywgIkZhbWlseU5hbWUiLCAic2lkIiwgbnVsbF0sIFs0LCAiV2VpZ2h0IiwgInNpZCIsIG51bGxdLCBbWzEyLCAxXSwgImlzRml4ZWRQaXRjaCIsICJudW0iLCAwXSwgW1sxMiwgMl0sICJJdGFsaWNBbmdsZSIsICJudW0iLCAwXSwgW1sxMiwgM10sICJVbmRlcmxpbmVQb3NpdGlvbiIsICJudW0iLCAtMTAwXSwgW1sxMiwgNF0sICJVbmRlcmxpbmVUaGlja25lc3MiLCAibnVtIiwgNTBdLCBbWzEyLCA1XSwgIlBhaW50VHlwZSIsICJudW0iLCAwXSwgW1sxMiwgNl0sICJDaGFyc3RyaW5nVHlwZSIsICJudW0iLCAyXSwgW1sxMiwgN10sICJGb250TWF0cml4IiwgWyJudW0iLCAibnVtIiwgIm51bSIsICJudW0iLCAibnVtIiwgIm51bSJdLCBbMC4wMDEsIDAsIDAsIDAuMDAxLCAwLCAwXV0sIFsxMywgIlVuaXF1ZUlEIiwgIm51bSIsIG51bGxdLCBbNSwgIkZvbnRCQm94IiwgWyJudW0iLCAibnVtIiwgIm51bSIsICJudW0iXSwgWzAsIDAsIDAsIDBdXSwgW1sxMiwgOF0sICJTdHJva2VXaWR0aCIsICJudW0iLCAwXSwgWzE0LCAiWFVJRCIsICJhcnJheSIsIG51bGxdLCBbMTUsICJjaGFyc2V0IiwgIm9mZnNldCIsIDBdLCBbMTYsICJFbmNvZGluZyIsICJvZmZzZXQiLCAwXSwgWzE3LCAiQ2hhclN0cmluZ3MiLCAib2Zmc2V0IiwgMF0sIFsxOCwgIlByaXZhdGUiLCBbIm9mZnNldCIsICJvZmZzZXQiXSwgbnVsbF0sIFtbMTIsIDIxXSwgIlBvc3RTY3JpcHQiLCAic2lkIiwgbnVsbF0sIFtbMTIsIDIyXSwgIkJhc2VGb250TmFtZSIsICJzaWQiLCBudWxsXSwgW1sxMiwgMjNdLCAiQmFzZUZvbnRCbGVuZCIsICJkZWx0YSIsIG51bGxdLCBbWzEyLCAzMV0sICJDSURGb250VmVyc2lvbiIsICJudW0iLCAwXSwgW1sxMiwgMzJdLCAiQ0lERm9udFJldmlzaW9uIiwgIm51bSIsIDBdLCBbWzEyLCAzM10sICJDSURGb250VHlwZSIsICJudW0iLCAwXSwgW1sxMiwgMzRdLCAiQ0lEQ291bnQiLCAibnVtIiwgODcyMF0sIFtbMTIsIDM1XSwgIlVJREJhc2UiLCAibnVtIiwgbnVsbF0sIFtbMTIsIDM3XSwgIkZEU2VsZWN0IiwgIm9mZnNldCIsIG51bGxdLCBbWzEyLCAzNl0sICJGREFycmF5IiwgIm9mZnNldCIsIG51bGxdLCBbWzEyLCAzOF0sICJGb250TmFtZSIsICJzaWQiLCBudWxsXV07CmNsYXNzIENGRlRvcERpY3QgZXh0ZW5kcyBDRkZEaWN0IHsKICBzdGF0aWMgZ2V0IHRhYmxlcygpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidGFibGVzIiwgdGhpcy5jcmVhdGVUYWJsZXMoQ0ZGVG9wRGljdExheW91dCkpOwogIH0KICBjb25zdHJ1Y3RvcihzdHJpbmdzKSB7CiAgICBzdXBlcihDRkZUb3BEaWN0LnRhYmxlcywgc3RyaW5ncyk7CiAgICB0aGlzLnByaXZhdGVEaWN0ID0gbnVsbDsKICB9Cn0KZXhwb3J0cy5DRkZUb3BEaWN0ID0gQ0ZGVG9wRGljdDsKY29uc3QgQ0ZGUHJpdmF0ZURpY3RMYXlvdXQgPSBbWzYsICJCbHVlVmFsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs3LCAiT3RoZXJCbHVlcyIsICJkZWx0YSIsIG51bGxdLCBbOCwgIkZhbWlseUJsdWVzIiwgImRlbHRhIiwgbnVsbF0sIFs5LCAiRmFtaWx5T3RoZXJCbHVlcyIsICJkZWx0YSIsIG51bGxdLCBbWzEyLCA5XSwgIkJsdWVTY2FsZSIsICJudW0iLCAwLjAzOTYyNV0sIFtbMTIsIDEwXSwgIkJsdWVTaGlmdCIsICJudW0iLCA3XSwgW1sxMiwgMTFdLCAiQmx1ZUZ1enoiLCAibnVtIiwgMV0sIFsxMCwgIlN0ZEhXIiwgIm51bSIsIG51bGxdLCBbMTEsICJTdGRWVyIsICJudW0iLCBudWxsXSwgW1sxMiwgMTJdLCAiU3RlbVNuYXBIIiwgImRlbHRhIiwgbnVsbF0sIFtbMTIsIDEzXSwgIlN0ZW1TbmFwViIsICJkZWx0YSIsIG51bGxdLCBbWzEyLCAxNF0sICJGb3JjZUJvbGQiLCAibnVtIiwgMF0sIFtbMTIsIDE3XSwgIkxhbmd1YWdlR3JvdXAiLCAibnVtIiwgMF0sIFtbMTIsIDE4XSwgIkV4cGFuc2lvbkZhY3RvciIsICJudW0iLCAwLjA2XSwgW1sxMiwgMTldLCAiaW5pdGlhbFJhbmRvbVNlZWQiLCAibnVtIiwgMF0sIFsyMCwgImRlZmF1bHRXaWR0aFgiLCAibnVtIiwgMF0sIFsyMSwgIm5vbWluYWxXaWR0aFgiLCAibnVtIiwgMF0sIFsxOSwgIlN1YnJzIiwgIm9mZnNldCIsIG51bGxdXTsKY2xhc3MgQ0ZGUHJpdmF0ZURpY3QgZXh0ZW5kcyBDRkZEaWN0IHsKICBzdGF0aWMgZ2V0IHRhYmxlcygpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidGFibGVzIiwgdGhpcy5jcmVhdGVUYWJsZXMoQ0ZGUHJpdmF0ZURpY3RMYXlvdXQpKTsKICB9CiAgY29uc3RydWN0b3Ioc3RyaW5ncykgewogICAgc3VwZXIoQ0ZGUHJpdmF0ZURpY3QudGFibGVzLCBzdHJpbmdzKTsKICAgIHRoaXMuc3VicnNJbmRleCA9IG51bGw7CiAgfQp9CmV4cG9ydHMuQ0ZGUHJpdmF0ZURpY3QgPSBDRkZQcml2YXRlRGljdDsKY29uc3QgQ0ZGQ2hhcnNldFByZWRlZmluZWRUeXBlcyA9IHsKICBJU09fQURPQkU6IDAsCiAgRVhQRVJUOiAxLAogIEVYUEVSVF9TVUJTRVQ6IDIKfTsKY2xhc3MgQ0ZGQ2hhcnNldCB7CiAgY29uc3RydWN0b3IocHJlZGVmaW5lZCwgZm9ybWF0LCBjaGFyc2V0LCByYXcpIHsKICAgIHRoaXMucHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7CiAgICB0aGlzLnJhdyA9IHJhdzsKICB9Cn0KZXhwb3J0cy5DRkZDaGFyc2V0ID0gQ0ZGQ2hhcnNldDsKY2xhc3MgQ0ZGRW5jb2RpbmcgewogIGNvbnN0cnVjdG9yKHByZWRlZmluZWQsIGZvcm1hdCwgZW5jb2RpbmcsIHJhdykgewogICAgdGhpcy5wcmVkZWZpbmVkID0gcHJlZGVmaW5lZDsKICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwogICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwogICAgdGhpcy5yYXcgPSByYXc7CiAgfQp9CmNsYXNzIENGRkZEU2VsZWN0IHsKICBjb25zdHJ1Y3Rvcihmb3JtYXQsIGZkU2VsZWN0KSB7CiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKICAgIHRoaXMuZmRTZWxlY3QgPSBmZFNlbGVjdDsKICB9CiAgZ2V0RkRJbmRleChnbHlwaEluZGV4KSB7CiAgICBpZiAoZ2x5cGhJbmRleCA8IDAgfHwgZ2x5cGhJbmRleCA+PSB0aGlzLmZkU2VsZWN0Lmxlbmd0aCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gdGhpcy5mZFNlbGVjdFtnbHlwaEluZGV4XTsKICB9Cn0KZXhwb3J0cy5DRkZGRFNlbGVjdCA9IENGRkZEU2VsZWN0OwpjbGFzcyBDRkZPZmZzZXRUcmFja2VyIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMub2Zmc2V0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgfQogIGlzVHJhY2tpbmcoa2V5KSB7CiAgICByZXR1cm4ga2V5IGluIHRoaXMub2Zmc2V0czsKICB9CiAgdHJhY2soa2V5LCBsb2NhdGlvbikgewogICAgaWYgKGtleSBpbiB0aGlzLm9mZnNldHMpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBBbHJlYWR5IHRyYWNraW5nIGxvY2F0aW9uIG9mICR7a2V5fWApOwogICAgfQogICAgdGhpcy5vZmZzZXRzW2tleV0gPSBsb2NhdGlvbjsKICB9CiAgb2Zmc2V0KHZhbHVlKSB7CiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm9mZnNldHMpIHsKICAgICAgdGhpcy5vZmZzZXRzW2tleV0gKz0gdmFsdWU7CiAgICB9CiAgfQogIHNldEVudHJ5TG9jYXRpb24oa2V5LCB2YWx1ZXMsIG91dHB1dCkgewogICAgaWYgKCEoa2V5IGluIHRoaXMub2Zmc2V0cykpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBOb3QgdHJhY2tpbmcgbG9jYXRpb24gb2YgJHtrZXl9YCk7CiAgICB9CiAgICBjb25zdCBkYXRhID0gb3V0cHV0LmRhdGE7CiAgICBjb25zdCBkYXRhT2Zmc2V0ID0gdGhpcy5vZmZzZXRzW2tleV07CiAgICBjb25zdCBzaXplID0gNTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHZhbHVlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgIGNvbnN0IG9mZnNldDAgPSBpICogc2l6ZSArIGRhdGFPZmZzZXQ7CiAgICAgIGNvbnN0IG9mZnNldDEgPSBvZmZzZXQwICsgMTsKICAgICAgY29uc3Qgb2Zmc2V0MiA9IG9mZnNldDAgKyAyOwogICAgICBjb25zdCBvZmZzZXQzID0gb2Zmc2V0MCArIDM7CiAgICAgIGNvbnN0IG9mZnNldDQgPSBvZmZzZXQwICsgNDsKICAgICAgaWYgKGRhdGFbb2Zmc2V0MF0gIT09IDB4MWQgfHwgZGF0YVtvZmZzZXQxXSAhPT0gMCB8fCBkYXRhW29mZnNldDJdICE9PSAwIHx8IGRhdGFbb2Zmc2V0M10gIT09IDAgfHwgZGF0YVtvZmZzZXQ0XSAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigid3JpdGluZyB0byBhbiBvZmZzZXQgdGhhdCBpcyBub3QgZW1wdHkiKTsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTsKICAgICAgZGF0YVtvZmZzZXQwXSA9IDB4MWQ7CiAgICAgIGRhdGFbb2Zmc2V0MV0gPSB2YWx1ZSA+PiAyNCAmIDB4ZmY7CiAgICAgIGRhdGFbb2Zmc2V0Ml0gPSB2YWx1ZSA+PiAxNiAmIDB4ZmY7CiAgICAgIGRhdGFbb2Zmc2V0M10gPSB2YWx1ZSA+PiA4ICYgMHhmZjsKICAgICAgZGF0YVtvZmZzZXQ0XSA9IHZhbHVlICYgMHhmZjsKICAgIH0KICB9Cn0KY2xhc3MgQ0ZGQ29tcGlsZXIgewogIGNvbnN0cnVjdG9yKGNmZikgewogICAgdGhpcy5jZmYgPSBjZmY7CiAgfQogIGNvbXBpbGUoKSB7CiAgICBjb25zdCBjZmYgPSB0aGlzLmNmZjsKICAgIGNvbnN0IG91dHB1dCA9IHsKICAgICAgZGF0YTogW10sCiAgICAgIGxlbmd0aDogMCwKICAgICAgYWRkKGRhdGEpIHsKICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gNjU1MzYpIHsKICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKC4uLmRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KGRhdGEpOwogICAgICAgIH0KICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7CiAgICAgIH0KICAgIH07CiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmNvbXBpbGVIZWFkZXIoY2ZmLmhlYWRlcik7CiAgICBvdXRwdXQuYWRkKGhlYWRlcik7CiAgICBjb25zdCBuYW1lSW5kZXggPSB0aGlzLmNvbXBpbGVOYW1lSW5kZXgoY2ZmLm5hbWVzKTsKICAgIG91dHB1dC5hZGQobmFtZUluZGV4KTsKICAgIGlmIChjZmYuaXNDSURGb250KSB7CiAgICAgIGlmIChjZmYudG9wRGljdC5oYXNOYW1lKCJGb250TWF0cml4IikpIHsKICAgICAgICBjb25zdCBiYXNlID0gY2ZmLnRvcERpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4Iik7CiAgICAgICAgY2ZmLnRvcERpY3QucmVtb3ZlQnlOYW1lKCJGb250TWF0cml4Iik7CiAgICAgICAgZm9yIChjb25zdCBzdWJEaWN0IG9mIGNmZi5mZEFycmF5KSB7CiAgICAgICAgICBsZXQgbWF0cml4ID0gYmFzZS5zbGljZSgwKTsKICAgICAgICAgIGlmIChzdWJEaWN0Lmhhc05hbWUoIkZvbnRNYXRyaXgiKSkgewogICAgICAgICAgICBtYXRyaXggPSBfdXRpbC5VdGlsLnRyYW5zZm9ybShtYXRyaXgsIHN1YkRpY3QuZ2V0QnlOYW1lKCJGb250TWF0cml4IikpOwogICAgICAgICAgfQogICAgICAgICAgc3ViRGljdC5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLCBtYXRyaXgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3QgeHVpZCA9IGNmZi50b3BEaWN0LmdldEJ5TmFtZSgiWFVJRCIpOwogICAgaWYgKHh1aWQ/Lmxlbmd0aCA+IDE2KSB7CiAgICAgIGNmZi50b3BEaWN0LnJlbW92ZUJ5TmFtZSgiWFVJRCIpOwogICAgfQogICAgY2ZmLnRvcERpY3Quc2V0QnlOYW1lKCJjaGFyc2V0IiwgMCk7CiAgICBsZXQgY29tcGlsZWQgPSB0aGlzLmNvbXBpbGVUb3BEaWN0cyhbY2ZmLnRvcERpY3RdLCBvdXRwdXQubGVuZ3RoLCBjZmYuaXNDSURGb250KTsKICAgIG91dHB1dC5hZGQoY29tcGlsZWQub3V0cHV0KTsKICAgIGNvbnN0IHRvcERpY3RUcmFja2VyID0gY29tcGlsZWQudHJhY2tlcnNbMF07CiAgICBjb25zdCBzdHJpbmdJbmRleCA9IHRoaXMuY29tcGlsZVN0cmluZ0luZGV4KGNmZi5zdHJpbmdzLnN0cmluZ3MpOwogICAgb3V0cHV0LmFkZChzdHJpbmdJbmRleCk7CiAgICBjb25zdCBnbG9iYWxTdWJySW5kZXggPSB0aGlzLmNvbXBpbGVJbmRleChjZmYuZ2xvYmFsU3VickluZGV4KTsKICAgIG91dHB1dC5hZGQoZ2xvYmFsU3VickluZGV4KTsKICAgIGlmIChjZmYuZW5jb2RpbmcgJiYgY2ZmLnRvcERpY3QuaGFzTmFtZSgiRW5jb2RpbmciKSkgewogICAgICBpZiAoY2ZmLmVuY29kaW5nLnByZWRlZmluZWQpIHsKICAgICAgICB0b3BEaWN0VHJhY2tlci5zZXRFbnRyeUxvY2F0aW9uKCJFbmNvZGluZyIsIFtjZmYuZW5jb2RpbmcuZm9ybWF0XSwgb3V0cHV0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBlbmNvZGluZyA9IHRoaXMuY29tcGlsZUVuY29kaW5nKGNmZi5lbmNvZGluZyk7CiAgICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRW5jb2RpbmciLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICAgICAgb3V0cHV0LmFkZChlbmNvZGluZyk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNoYXJzZXQgPSB0aGlzLmNvbXBpbGVDaGFyc2V0KGNmZi5jaGFyc2V0LCBjZmYuY2hhclN0cmluZ3MuY291bnQsIGNmZi5zdHJpbmdzLCBjZmYuaXNDSURGb250KTsKICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oImNoYXJzZXQiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICBvdXRwdXQuYWRkKGNoYXJzZXQpOwogICAgY29uc3QgY2hhclN0cmluZ3MgPSB0aGlzLmNvbXBpbGVDaGFyU3RyaW5ncyhjZmYuY2hhclN0cmluZ3MpOwogICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiQ2hhclN0cmluZ3MiLCBbb3V0cHV0Lmxlbmd0aF0sIG91dHB1dCk7CiAgICBvdXRwdXQuYWRkKGNoYXJTdHJpbmdzKTsKICAgIGlmIChjZmYuaXNDSURGb250KSB7CiAgICAgIHRvcERpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIkZEU2VsZWN0IiwgW291dHB1dC5sZW5ndGhdLCBvdXRwdXQpOwogICAgICBjb25zdCBmZFNlbGVjdCA9IHRoaXMuY29tcGlsZUZEU2VsZWN0KGNmZi5mZFNlbGVjdCk7CiAgICAgIG91dHB1dC5hZGQoZmRTZWxlY3QpOwogICAgICBjb21waWxlZCA9IHRoaXMuY29tcGlsZVRvcERpY3RzKGNmZi5mZEFycmF5LCBvdXRwdXQubGVuZ3RoLCB0cnVlKTsKICAgICAgdG9wRGljdFRyYWNrZXIuc2V0RW50cnlMb2NhdGlvbigiRkRBcnJheSIsIFtvdXRwdXQubGVuZ3RoXSwgb3V0cHV0KTsKICAgICAgb3V0cHV0LmFkZChjb21waWxlZC5vdXRwdXQpOwogICAgICBjb25zdCBmb250RGljdFRyYWNrZXJzID0gY29tcGlsZWQudHJhY2tlcnM7CiAgICAgIHRoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhjZmYuZmRBcnJheSwgZm9udERpY3RUcmFja2Vycywgb3V0cHV0KTsKICAgIH0KICAgIHRoaXMuY29tcGlsZVByaXZhdGVEaWN0cyhbY2ZmLnRvcERpY3RdLCBbdG9wRGljdFRyYWNrZXJdLCBvdXRwdXQpOwogICAgb3V0cHV0LmFkZChbMF0pOwogICAgcmV0dXJuIG91dHB1dC5kYXRhOwogIH0KICBlbmNvZGVOdW1iZXIodmFsdWUpIHsKICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkgewogICAgICByZXR1cm4gdGhpcy5lbmNvZGVJbnRlZ2VyKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmVuY29kZUZsb2F0KHZhbHVlKTsKICB9CiAgc3RhdGljIGdldCBFbmNvZGVGbG9hdFJlZ0V4cCgpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiRW5jb2RlRmxvYXRSZWdFeHAiLCAvXC4oXGQqPykoPzo5ezUsMjB9fDB7NSwyMH0pXGR7MCwyfSg/OmUoLispfCQpLyk7CiAgfQogIGVuY29kZUZsb2F0KG51bSkgewogICAgbGV0IHZhbHVlID0gbnVtLnRvU3RyaW5nKCk7CiAgICBjb25zdCBtID0gQ0ZGQ29tcGlsZXIuRW5jb2RlRmxvYXRSZWdFeHAuZXhlYyh2YWx1ZSk7CiAgICBpZiAobSkgewogICAgICBjb25zdCBlcHNpbG9uID0gcGFyc2VGbG9hdCgiMWUiICsgKChtWzJdID8gK21bMl0gOiAwKSArIG1bMV0ubGVuZ3RoKSk7CiAgICAgIHZhbHVlID0gKE1hdGgucm91bmQobnVtICogZXBzaWxvbikgLyBlcHNpbG9uKS50b1N0cmluZygpOwogICAgfQogICAgbGV0IG5pYmJsZXMgPSAiIjsKICAgIGxldCBpLCBpaTsKICAgIGZvciAoaSA9IDAsIGlpID0gdmFsdWUubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBhID0gdmFsdWVbaV07CiAgICAgIGlmIChhID09PSAiZSIpIHsKICAgICAgICBuaWJibGVzICs9IHZhbHVlWysraV0gPT09ICItIiA/ICJjIiA6ICJiIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLiIpIHsKICAgICAgICBuaWJibGVzICs9ICJhIjsKICAgICAgfSBlbHNlIGlmIChhID09PSAiLSIpIHsKICAgICAgICBuaWJibGVzICs9ICJlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBuaWJibGVzICs9IGE7CiAgICAgIH0KICAgIH0KICAgIG5pYmJsZXMgKz0gbmliYmxlcy5sZW5ndGggJiAxID8gImYiIDogImZmIjsKICAgIGNvbnN0IG91dCA9IFszMF07CiAgICBmb3IgKGkgPSAwLCBpaSA9IG5pYmJsZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICBvdXQucHVzaChwYXJzZUludChuaWJibGVzLnN1YnN0cmluZyhpLCBpICsgMiksIDE2KSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KICBlbmNvZGVJbnRlZ2VyKHZhbHVlKSB7CiAgICBsZXQgY29kZTsKICAgIGlmICh2YWx1ZSA+PSAtMTA3ICYmIHZhbHVlIDw9IDEwNykgewogICAgICBjb2RlID0gW3ZhbHVlICsgMTM5XTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gMTA4ICYmIHZhbHVlIDw9IDExMzEpIHsKICAgICAgdmFsdWUgLT0gMTA4OwogICAgICBjb2RlID0gWyh2YWx1ZSA+PiA4KSArIDI0NywgdmFsdWUgJiAweGZmXTsKICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gLTExMzEgJiYgdmFsdWUgPD0gLTEwOCkgewogICAgICB2YWx1ZSA9IC12YWx1ZSAtIDEwODsKICAgICAgY29kZSA9IFsodmFsdWUgPj4gOCkgKyAyNTEsIHZhbHVlICYgMHhmZl07CiAgICB9IGVsc2UgaWYgKHZhbHVlID49IC0zMjc2OCAmJiB2YWx1ZSA8PSAzMjc2NykgewogICAgICBjb2RlID0gWzB4MWMsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmZdOwogICAgfSBlbHNlIHsKICAgICAgY29kZSA9IFsweDFkLCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZl07CiAgICB9CiAgICByZXR1cm4gY29kZTsKICB9CiAgY29tcGlsZUhlYWRlcihoZWFkZXIpIHsKICAgIHJldHVybiBbaGVhZGVyLm1ham9yLCBoZWFkZXIubWlub3IsIDQsIGhlYWRlci5vZmZTaXplXTsKICB9CiAgY29tcGlsZU5hbWVJbmRleChuYW1lcykgewogICAgY29uc3QgbmFtZUluZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4obmFtZS5sZW5ndGgsIDEyNyk7CiAgICAgIGxldCBzYW5pdGl6ZWROYW1lID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICBsZXQgY2hhciA9IG5hbWVbal07CiAgICAgICAgaWYgKGNoYXIgPCAiISIgfHwgY2hhciA+ICJ+IiB8fCBjaGFyID09PSAiWyIgfHwgY2hhciA9PT0gIl0iIHx8IGNoYXIgPT09ICIoIiB8fCBjaGFyID09PSAiKSIgfHwgY2hhciA9PT0gInsiIHx8IGNoYXIgPT09ICJ9IiB8fCBjaGFyID09PSAiPCIgfHwgY2hhciA9PT0gIj4iIHx8IGNoYXIgPT09ICIvIiB8fCBjaGFyID09PSAiJSIpIHsKICAgICAgICAgIGNoYXIgPSAiXyI7CiAgICAgICAgfQogICAgICAgIHNhbml0aXplZE5hbWVbal0gPSBjaGFyOwogICAgICB9CiAgICAgIHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZWROYW1lLmpvaW4oIiIpOwogICAgICBpZiAoc2FuaXRpemVkTmFtZSA9PT0gIiIpIHsKICAgICAgICBzYW5pdGl6ZWROYW1lID0gIkJhZF9Gb250X05hbWUiOwogICAgICB9CiAgICAgIG5hbWVJbmRleC5hZGQoKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHNhbml0aXplZE5hbWUpKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmNvbXBpbGVJbmRleChuYW1lSW5kZXgpOwogIH0KICBjb21waWxlVG9wRGljdHMoZGljdHMsIGxlbmd0aCwgcmVtb3ZlQ2lkS2V5cykgewogICAgY29uc3QgZm9udERpY3RUcmFja2VycyA9IFtdOwogICAgbGV0IGZkQXJyYXlJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgZm9yIChjb25zdCBmb250RGljdCBvZiBkaWN0cykgewogICAgICBpZiAocmVtb3ZlQ2lkS2V5cykgewogICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiQ0lERm9udFZlcnNpb24iKTsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJREZvbnRSZXZpc2lvbiIpOwogICAgICAgIGZvbnREaWN0LnJlbW92ZUJ5TmFtZSgiQ0lERm9udFR5cGUiKTsKICAgICAgICBmb250RGljdC5yZW1vdmVCeU5hbWUoIkNJRENvdW50Iik7CiAgICAgICAgZm9udERpY3QucmVtb3ZlQnlOYW1lKCJVSURCYXNlIik7CiAgICAgIH0KICAgICAgY29uc3QgZm9udERpY3RUcmFja2VyID0gbmV3IENGRk9mZnNldFRyYWNrZXIoKTsKICAgICAgY29uc3QgZm9udERpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChmb250RGljdCwgZm9udERpY3RUcmFja2VyKTsKICAgICAgZm9udERpY3RUcmFja2Vycy5wdXNoKGZvbnREaWN0VHJhY2tlcik7CiAgICAgIGZkQXJyYXlJbmRleC5hZGQoZm9udERpY3REYXRhKTsKICAgICAgZm9udERpY3RUcmFja2VyLm9mZnNldChsZW5ndGgpOwogICAgfQogICAgZmRBcnJheUluZGV4ID0gdGhpcy5jb21waWxlSW5kZXgoZmRBcnJheUluZGV4LCBmb250RGljdFRyYWNrZXJzKTsKICAgIHJldHVybiB7CiAgICAgIHRyYWNrZXJzOiBmb250RGljdFRyYWNrZXJzLAogICAgICBvdXRwdXQ6IGZkQXJyYXlJbmRleAogICAgfTsKICB9CiAgY29tcGlsZVByaXZhdGVEaWN0cyhkaWN0cywgdHJhY2tlcnMsIG91dHB1dCkgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGljdHMubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBjb25zdCBmb250RGljdCA9IGRpY3RzW2ldOwogICAgICBjb25zdCBwcml2YXRlRGljdCA9IGZvbnREaWN0LnByaXZhdGVEaWN0OwogICAgICBpZiAoIXByaXZhdGVEaWN0IHx8ICFmb250RGljdC5oYXNOYW1lKCJQcml2YXRlIikpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlRoZXJlIG11c3QgYmUgYSBwcml2YXRlIGRpY3Rpb25hcnkuIik7CiAgICAgIH0KICAgICAgY29uc3QgcHJpdmF0ZURpY3RUcmFja2VyID0gbmV3IENGRk9mZnNldFRyYWNrZXIoKTsKICAgICAgY29uc3QgcHJpdmF0ZURpY3REYXRhID0gdGhpcy5jb21waWxlRGljdChwcml2YXRlRGljdCwgcHJpdmF0ZURpY3RUcmFja2VyKTsKICAgICAgbGV0IG91dHB1dExlbmd0aCA9IG91dHB1dC5sZW5ndGg7CiAgICAgIHByaXZhdGVEaWN0VHJhY2tlci5vZmZzZXQob3V0cHV0TGVuZ3RoKTsKICAgICAgaWYgKCFwcml2YXRlRGljdERhdGEubGVuZ3RoKSB7CiAgICAgICAgb3V0cHV0TGVuZ3RoID0gMDsKICAgICAgfQogICAgICB0cmFja2Vyc1tpXS5zZXRFbnRyeUxvY2F0aW9uKCJQcml2YXRlIiwgW3ByaXZhdGVEaWN0RGF0YS5sZW5ndGgsIG91dHB1dExlbmd0aF0sIG91dHB1dCk7CiAgICAgIG91dHB1dC5hZGQocHJpdmF0ZURpY3REYXRhKTsKICAgICAgaWYgKHByaXZhdGVEaWN0LnN1YnJzSW5kZXggJiYgcHJpdmF0ZURpY3QuaGFzTmFtZSgiU3VicnMiKSkgewogICAgICAgIGNvbnN0IHN1YnJzID0gdGhpcy5jb21waWxlSW5kZXgocHJpdmF0ZURpY3Quc3VicnNJbmRleCk7CiAgICAgICAgcHJpdmF0ZURpY3RUcmFja2VyLnNldEVudHJ5TG9jYXRpb24oIlN1YnJzIiwgW3ByaXZhdGVEaWN0RGF0YS5sZW5ndGhdLCBvdXRwdXQpOwogICAgICAgIG91dHB1dC5hZGQoc3VicnMpOwogICAgICB9CiAgICB9CiAgfQogIGNvbXBpbGVEaWN0KGRpY3QsIG9mZnNldFRyYWNrZXIpIHsKICAgIGNvbnN0IG91dCA9IFtdOwogICAgZm9yIChjb25zdCBrZXkgb2YgZGljdC5vcmRlcikgewogICAgICBpZiAoIShrZXkgaW4gZGljdC52YWx1ZXMpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IHZhbHVlcyA9IGRpY3QudmFsdWVzW2tleV07CiAgICAgIGxldCB0eXBlcyA9IGRpY3QudHlwZXNba2V5XTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGVzKSkgewogICAgICAgIHR5cGVzID0gW3R5cGVzXTsKICAgICAgfQogICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgewogICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdOwogICAgICB9CiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gdHlwZXMubGVuZ3RoOyBqIDwgamo7ICsraikgewogICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlc1tqXTsKICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tqXTsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgIGNhc2UgIm51bSI6CiAgICAgICAgICBjYXNlICJzaWQiOgogICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLmVuY29kZU51bWJlcih2YWx1ZSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIm9mZnNldCI6CiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkaWN0LmtleVRvTmFtZU1hcFtrZXldOwogICAgICAgICAgICBpZiAoIW9mZnNldFRyYWNrZXIuaXNUcmFja2luZyhuYW1lKSkgewogICAgICAgICAgICAgIG9mZnNldFRyYWNrZXIudHJhY2sobmFtZSwgb3V0Lmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0LnB1c2goMHgxZCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgY2FzZSAiZGVsdGEiOgogICAgICAgICAgICBvdXQucHVzaCguLi50aGlzLmVuY29kZU51bWJlcih2YWx1ZSkpOwogICAgICAgICAgICBmb3IgKGxldCBrID0gMSwga2sgPSB2YWx1ZXMubGVuZ3RoOyBrIDwga2s7ICsraykgewogICAgICAgICAgICAgIG91dC5wdXNoKC4uLnRoaXMuZW5jb2RlTnVtYmVyKHZhbHVlc1trXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbmtub3duIGRhdGEgdHlwZSBvZiAke3R5cGV9YCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIG91dC5wdXNoKC4uLmRpY3Qub3Bjb2Rlc1trZXldKTsKICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQogIGNvbXBpbGVTdHJpbmdJbmRleChzdHJpbmdzKSB7CiAgICBjb25zdCBzdHJpbmdJbmRleCA9IG5ldyBDRkZJbmRleCgpOwogICAgZm9yIChjb25zdCBzdHJpbmcgb2Ygc3RyaW5ncykgewogICAgICBzdHJpbmdJbmRleC5hZGQoKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHN0cmluZykpOwogICAgfQogICAgcmV0dXJuIHRoaXMuY29tcGlsZUluZGV4KHN0cmluZ0luZGV4KTsKICB9CiAgY29tcGlsZUNoYXJTdHJpbmdzKGNoYXJTdHJpbmdzKSB7CiAgICBjb25zdCBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IENGRkluZGV4KCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYXJTdHJpbmdzLmNvdW50OyBpKyspIHsKICAgICAgY29uc3QgZ2x5cGggPSBjaGFyU3RyaW5ncy5nZXQoaSk7CiAgICAgIGlmIChnbHlwaC5sZW5ndGggPT09IDApIHsKICAgICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChuZXcgVWludDhBcnJheShbMHg4YiwgMHgwZV0pKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChnbHlwaCk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlSW5kZXgoY2hhclN0cmluZ3NJbmRleCk7CiAgfQogIGNvbXBpbGVDaGFyc2V0KGNoYXJzZXQsIG51bUdseXBocywgc3RyaW5ncywgaXNDSURGb250KSB7CiAgICBsZXQgb3V0OwogICAgY29uc3QgbnVtR2x5cGhzTGVzc05vdERlZiA9IG51bUdseXBocyAtIDE7CiAgICBpZiAoaXNDSURGb250KSB7CiAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KFsyLCAwLCAwLCBudW1HbHlwaHNMZXNzTm90RGVmID4+IDggJiAweGZmLCBudW1HbHlwaHNMZXNzTm90RGVmICYgMHhmZl0pOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgbGVuZ3RoID0gMSArIG51bUdseXBoc0xlc3NOb3REZWYgKiAyOwogICAgICBvdXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgICBvdXRbMF0gPSAwOwogICAgICBsZXQgY2hhcnNldEluZGV4ID0gMDsKICAgICAgY29uc3QgbnVtQ2hhcnNldHMgPSBjaGFyc2V0LmNoYXJzZXQubGVuZ3RoOwogICAgICBsZXQgd2FybmVkID0gZmFsc2U7CiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgbGV0IHNpZCA9IDA7CiAgICAgICAgaWYgKGNoYXJzZXRJbmRleCA8IG51bUNoYXJzZXRzKSB7CiAgICAgICAgICBjb25zdCBuYW1lID0gY2hhcnNldC5jaGFyc2V0W2NoYXJzZXRJbmRleCsrXTsKICAgICAgICAgIHNpZCA9IHN0cmluZ3MuZ2V0U0lEKG5hbWUpOwogICAgICAgICAgaWYgKHNpZCA9PT0gLTEpIHsKICAgICAgICAgICAgc2lkID0gMDsKICAgICAgICAgICAgaWYgKCF3YXJuZWQpIHsKICAgICAgICAgICAgICB3YXJuZWQgPSB0cnVlOwogICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgQ291bGRuJ3QgZmluZCAke25hbWV9IGluIENGRiBzdHJpbmdzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3V0W2ldID0gc2lkID4+IDggJiAweGZmOwogICAgICAgIG91dFtpICsgMV0gPSBzaWQgJiAweGZmOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlRW5jb2RpbmcoZW5jb2RpbmcpIHsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVUeXBlZEFycmF5KGVuY29kaW5nLnJhdyk7CiAgfQogIGNvbXBpbGVGRFNlbGVjdChmZFNlbGVjdCkgewogICAgY29uc3QgZm9ybWF0ID0gZmRTZWxlY3QuZm9ybWF0OwogICAgbGV0IG91dCwgaTsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBvdXQgPSBuZXcgVWludDhBcnJheSgxICsgZmRTZWxlY3QuZmRTZWxlY3QubGVuZ3RoKTsKICAgICAgICBvdXRbMF0gPSBmb3JtYXQ7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkU2VsZWN0LmZkU2VsZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBvdXRbaSArIDFdID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY29uc3Qgc3RhcnQgPSAwOwogICAgICAgIGxldCBsYXN0RkQgPSBmZFNlbGVjdC5mZFNlbGVjdFswXTsKICAgICAgICBjb25zdCByYW5nZXMgPSBbZm9ybWF0LCAwLCAwLCBzdGFydCA+PiA4ICYgMHhmZiwgc3RhcnQgJiAweGZmLCBsYXN0RkRdOwogICAgICAgIGZvciAoaSA9IDE7IGkgPCBmZFNlbGVjdC5mZFNlbGVjdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY3VycmVudEZEID0gZmRTZWxlY3QuZmRTZWxlY3RbaV07CiAgICAgICAgICBpZiAoY3VycmVudEZEICE9PSBsYXN0RkQpIHsKICAgICAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYsIGN1cnJlbnRGRCk7CiAgICAgICAgICAgIGxhc3RGRCA9IGN1cnJlbnRGRDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbnVtUmFuZ2VzID0gKHJhbmdlcy5sZW5ndGggLSAzKSAvIDM7CiAgICAgICAgcmFuZ2VzWzFdID0gbnVtUmFuZ2VzID4+IDggJiAweGZmOwogICAgICAgIHJhbmdlc1syXSA9IG51bVJhbmdlcyAmIDB4ZmY7CiAgICAgICAgcmFuZ2VzLnB1c2goaSA+PiA4ICYgMHhmZiwgaSAmIDB4ZmYpOwogICAgICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHJhbmdlcyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gdGhpcy5jb21waWxlVHlwZWRBcnJheShvdXQpOwogIH0KICBjb21waWxlVHlwZWRBcnJheShkYXRhKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbShkYXRhKTsKICB9CiAgY29tcGlsZUluZGV4KGluZGV4LCB0cmFja2VycyA9IFtdKSB7CiAgICBjb25zdCBvYmplY3RzID0gaW5kZXgub2JqZWN0czsKICAgIGNvbnN0IGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7CiAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgcmV0dXJuIFswLCAwXTsKICAgIH0KICAgIGNvbnN0IGRhdGEgPSBbY291bnQgPj4gOCAmIDB4ZmYsIGNvdW50ICYgMHhmZl07CiAgICBsZXQgbGFzdE9mZnNldCA9IDEsCiAgICAgIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogICAgICBsYXN0T2Zmc2V0ICs9IG9iamVjdHNbaV0ubGVuZ3RoOwogICAgfQogICAgbGV0IG9mZnNldFNpemU7CiAgICBpZiAobGFzdE9mZnNldCA8IDB4MTAwKSB7CiAgICAgIG9mZnNldFNpemUgPSAxOwogICAgfSBlbHNlIGlmIChsYXN0T2Zmc2V0IDwgMHgxMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMjsKICAgIH0gZWxzZSBpZiAobGFzdE9mZnNldCA8IDB4MTAwMDAwMCkgewogICAgICBvZmZzZXRTaXplID0gMzsKICAgIH0gZWxzZSB7CiAgICAgIG9mZnNldFNpemUgPSA0OwogICAgfQogICAgZGF0YS5wdXNoKG9mZnNldFNpemUpOwogICAgbGV0IHJlbGF0aXZlT2Zmc2V0ID0gMTsKICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCArIDE7IGkrKykgewogICAgICBpZiAob2Zmc2V0U2l6ZSA9PT0gMSkgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgaWYgKG9mZnNldFNpemUgPT09IDIpIHsKICAgICAgICBkYXRhLnB1c2gocmVsYXRpdmVPZmZzZXQgPj4gOCAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ICYgMHhmZik7CiAgICAgIH0gZWxzZSBpZiAob2Zmc2V0U2l6ZSA9PT0gMykgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9IGVsc2UgewogICAgICAgIGRhdGEucHVzaChyZWxhdGl2ZU9mZnNldCA+Pj4gMjQgJiAweGZmLCByZWxhdGl2ZU9mZnNldCA+PiAxNiAmIDB4ZmYsIHJlbGF0aXZlT2Zmc2V0ID4+IDggJiAweGZmLCByZWxhdGl2ZU9mZnNldCAmIDB4ZmYpOwogICAgICB9CiAgICAgIGlmIChvYmplY3RzW2ldKSB7CiAgICAgICAgcmVsYXRpdmVPZmZzZXQgKz0gb2JqZWN0c1tpXS5sZW5ndGg7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgIGlmICh0cmFja2Vyc1tpXSkgewogICAgICAgIHRyYWNrZXJzW2ldLm9mZnNldChkYXRhLmxlbmd0aCk7CiAgICAgIH0KICAgICAgZGF0YS5wdXNoKC4uLm9iamVjdHNbaV0pOwogICAgfQogICAgcmV0dXJuIGRhdGE7CiAgfQp9CmV4cG9ydHMuQ0ZGQ29tcGlsZXIgPSBDRkZDb21waWxlcjsKCi8qKiovIH0pLAovKiAzNiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLklTT0Fkb2JlQ2hhcnNldCA9IGV4cG9ydHMuRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IGV4cG9ydHMuRXhwZXJ0Q2hhcnNldCA9IHZvaWQgMDsKY29uc3QgSVNPQWRvYmVDaGFyc2V0ID0gWyIubm90ZGVmIiwgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXJpZ2h0IiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLCAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLCAiUCIsICJRIiwgIlIiLCAiUyIsICJUIiwgIlUiLCAiViIsICJXIiwgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICJlbmRhc2giLCAiZGFnZ2VyIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJwYXJhZ3JhcGgiLCAiYnVsbGV0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibHJpZ2h0IiwgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInBlcnRob3VzYW5kIiwgInF1ZXN0aW9uZG93biIsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLCAiZGllcmVzaXMiLCAicmluZyIsICJjZWRpbGxhIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIkFFIiwgIm9yZGZlbWluaW5lIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgImFlIiwgImRvdGxlc3NpIiwgImxzbGFzaCIsICJvc2xhc2giLCAib2UiLCAiZ2VybWFuZGJscyIsICJvbmVzdXBlcmlvciIsICJsb2dpY2Fsbm90IiwgIm11IiwgInRyYWRlbWFyayIsICJFdGgiLCAib25laGFsZiIsICJwbHVzbWludXMiLCAiVGhvcm4iLCAib25lcXVhcnRlciIsICJkaXZpZGUiLCAiYnJva2VuYmFyIiwgImRlZ3JlZSIsICJ0aG9ybiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInR3b3N1cGVyaW9yIiwgInJlZ2lzdGVyZWQiLCAibWludXMiLCAiZXRoIiwgIm11bHRpcGx5IiwgInRocmVlc3VwZXJpb3IiLCAiY29weXJpZ2h0IiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBZGllcmVzaXMiLCAiQWdyYXZlIiwgIkFyaW5nIiwgIkF0aWxkZSIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJOdGlsZGUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk9kaWVyZXNpcyIsICJPZ3JhdmUiLCAiT3RpbGRlIiwgIlNjYXJvbiIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIlVncmF2ZSIsICJZYWN1dGUiLCAiWWRpZXJlc2lzIiwgIlpjYXJvbiIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImFncmF2ZSIsICJhcmluZyIsICJhdGlsZGUiLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJlZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJpZ3JhdmUiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib2dyYXZlIiwgIm90aWxkZSIsICJzY2Fyb24iLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ1Z3JhdmUiLCAieWFjdXRlIiwgInlkaWVyZXNpcyIsICJ6Y2Fyb24iXTsKZXhwb3J0cy5JU09BZG9iZUNoYXJzZXQgPSBJU09BZG9iZUNoYXJzZXQ7CmNvbnN0IEV4cGVydENoYXJzZXQgPSBbIi5ub3RkZWYiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiZG9sbGFyb2xkc3R5bGUiLCAiZG9sbGFyc3VwZXJpb3IiLCAiYW1wZXJzYW5kc21hbGwiLCAiQWN1dGVzbWFsbCIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJxdWVzdGlvbnNtYWxsIiwgImFzdXBlcmlvciIsICJic3VwZXJpb3IiLCAiY2VudHN1cGVyaW9yIiwgImRzdXBlcmlvciIsICJlc3VwZXJpb3IiLCAiaXN1cGVyaW9yIiwgImxzdXBlcmlvciIsICJtc3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm9zdXBlcmlvciIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICJmZiIsICJmaSIsICJmbCIsICJmZmkiLCAiZmZsIiwgInBhcmVubGVmdGluZmVyaW9yIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuc3VwZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiU2Nhcm9uc21hbGwiLCAiWmNhcm9uc21hbGwiLCAiRGllcmVzaXNzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIkNhcm9uc21hbGwiLCAiRG90YWNjZW50c21hbGwiLCAiTWFjcm9uc21hbGwiLCAiZmlndXJlZGFzaCIsICJoeXBoZW5pbmZlcmlvciIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIiwgIkFncmF2ZXNtYWxsIiwgIkFhY3V0ZXNtYWxsIiwgIkFjaXJjdW1mbGV4c21hbGwiLCAiQXRpbGRlc21hbGwiLCAiQWRpZXJlc2lzc21hbGwiLCAiQXJpbmdzbWFsbCIsICJBRXNtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIkV0aHNtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT3RpbGRlc21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT0VzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJVZ3JhdmVzbWFsbCIsICJVYWN1dGVzbWFsbCIsICJVY2lyY3VtZmxleHNtYWxsIiwgIlVkaWVyZXNpc3NtYWxsIiwgIllhY3V0ZXNtYWxsIiwgIlRob3Juc21hbGwiLCAiWWRpZXJlc2lzc21hbGwiXTsKZXhwb3J0cy5FeHBlcnRDaGFyc2V0ID0gRXhwZXJ0Q2hhcnNldDsKY29uc3QgRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IFsiLm5vdGRlZiIsICJzcGFjZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJwYXJlbmxlZnRzdXBlcmlvciIsICJwYXJlbnJpZ2h0c3VwZXJpb3IiLCAidHdvZG90ZW5sZWFkZXIiLCAib25lZG90ZW5sZWFkZXIiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJmcmFjdGlvbiIsICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLCAiZWlnaHRvbGRzdHlsZSIsICJuaW5lb2xkc3R5bGUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImNvbW1hc3VwZXJpb3IiLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsICJwZXJpb2RzdXBlcmlvciIsICJhc3VwZXJpb3IiLCAiYnN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiZXN1cGVyaW9yIiwgImlzdXBlcmlvciIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAicnN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJ0c3VwZXJpb3IiLCAiZmYiLCAiZmkiLCAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICJwYXJlbnJpZ2h0aW5mZXJpb3IiLCAiaHlwaGVuc3VwZXJpb3IiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgImNlbnRvbGRzdHlsZSIsICJmaWd1cmVkYXNoIiwgImh5cGhlbmluZmVyaW9yIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICJ6ZXJvc3VwZXJpb3IiLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwgInNldmVuc3VwZXJpb3IiLCAiZWlnaHRzdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIm9uZWluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgImZpdmVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgImVpZ2h0aW5mZXJpb3IiLCAibmluZWluZmVyaW9yIiwgImNlbnRpbmZlcmlvciIsICJkb2xsYXJpbmZlcmlvciIsICJwZXJpb2RpbmZlcmlvciIsICJjb21tYWluZmVyaW9yIl07CmV4cG9ydHMuRXhwZXJ0U3Vic2V0Q2hhcnNldCA9IEV4cGVydFN1YnNldENoYXJzZXQ7CgovKioqLyB9KSwKLyogMzcgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5aYXBmRGluZ2JhdHNFbmNvZGluZyA9IGV4cG9ydHMuV2luQW5zaUVuY29kaW5nID0gZXhwb3J0cy5TeW1ib2xTZXRFbmNvZGluZyA9IGV4cG9ydHMuU3RhbmRhcmRFbmNvZGluZyA9IGV4cG9ydHMuTWFjUm9tYW5FbmNvZGluZyA9IGV4cG9ydHMuRXhwZXJ0RW5jb2RpbmcgPSB2b2lkIDA7CmV4cG9ydHMuZ2V0RW5jb2RpbmcgPSBnZXRFbmNvZGluZzsKY29uc3QgRXhwZXJ0RW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtc21hbGwiLCAiSHVuZ2FydW1sYXV0c21hbGwiLCAiIiwgImRvbGxhcm9sZHN0eWxlIiwgImRvbGxhcnN1cGVyaW9yIiwgImFtcGVyc2FuZHNtYWxsIiwgIkFjdXRlc21hbGwiLCAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAiZnJhY3Rpb24iLCAiemVyb29sZHN0eWxlIiwgIm9uZW9sZHN0eWxlIiwgInR3b29sZHN0eWxlIiwgInRocmVlb2xkc3R5bGUiLCAiZm91cm9sZHN0eWxlIiwgImZpdmVvbGRzdHlsZSIsICJzaXhvbGRzdHlsZSIsICJzZXZlbm9sZHN0eWxlIiwgImVpZ2h0b2xkc3R5bGUiLCAibmluZW9sZHN0eWxlIiwgImNvbG9uIiwgInNlbWljb2xvbiIsICJjb21tYXN1cGVyaW9yIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAicGVyaW9kc3VwZXJpb3IiLCAicXVlc3Rpb25zbWFsbCIsICIiLCAiYXN1cGVyaW9yIiwgImJzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCAiZHN1cGVyaW9yIiwgImVzdXBlcmlvciIsICIiLCAiIiwgIiIsICJpc3VwZXJpb3IiLCAiIiwgIiIsICJsc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwgIm5zdXBlcmlvciIsICJvc3VwZXJpb3IiLCAiIiwgIiIsICJyc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgInRzdXBlcmlvciIsICIiLCAiZmYiLCAiZmkiLCAiZmwiLCAiZmZpIiwgImZmbCIsICJwYXJlbmxlZnRpbmZlcmlvciIsICIiLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5zdXBlcmlvciIsICJHcmF2ZXNtYWxsIiwgIkFzbWFsbCIsICJCc21hbGwiLCAiQ3NtYWxsIiwgIkRzbWFsbCIsICJFc21hbGwiLCAiRnNtYWxsIiwgIkdzbWFsbCIsICJIc21hbGwiLCAiSXNtYWxsIiwgIkpzbWFsbCIsICJLc21hbGwiLCAiTHNtYWxsIiwgIk1zbWFsbCIsICJOc21hbGwiLCAiT3NtYWxsIiwgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLCAiWHNtYWxsIiwgIllzbWFsbCIsICJac21hbGwiLCAiY29sb25tb25ldGFyeSIsICJvbmVmaXR0ZWQiLCAicnVwaWFoIiwgIlRpbGRlc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd25zbWFsbCIsICJjZW50b2xkc3R5bGUiLCAiTHNsYXNoc21hbGwiLCAiIiwgIiIsICJTY2Fyb25zbWFsbCIsICJaY2Fyb25zbWFsbCIsICJEaWVyZXNpc3NtYWxsIiwgIkJyZXZlc21hbGwiLCAiQ2Fyb25zbWFsbCIsICIiLCAiRG90YWNjZW50c21hbGwiLCAiIiwgIiIsICJNYWNyb25zbWFsbCIsICIiLCAiIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuaW5mZXJpb3IiLCAiIiwgIiIsICJPZ29uZWtzbWFsbCIsICJSaW5nc21hbGwiLCAiQ2VkaWxsYXNtYWxsIiwgIiIsICIiLCAiIiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93bnNtYWxsIiwgIm9uZWVpZ2h0aCIsICJ0aHJlZWVpZ2h0aHMiLCAiZml2ZWVpZ2h0aHMiLCAic2V2ZW5laWdodGhzIiwgIm9uZXRoaXJkIiwgInR3b3RoaXJkcyIsICIiLCAiIiwgInplcm9zdXBlcmlvciIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgImZvdXJzdXBlcmlvciIsICJmaXZlc3VwZXJpb3IiLCAic2l4c3VwZXJpb3IiLCAic2V2ZW5zdXBlcmlvciIsICJlaWdodHN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAib25laW5mZXJpb3IiLCAidHdvaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgInNpeGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJuaW5laW5mZXJpb3IiLCAiY2VudGluZmVyaW9yIiwgImRvbGxhcmluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgImNvbW1haW5mZXJpb3IiLCAiQWdyYXZlc21hbGwiLCAiQWFjdXRlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkFFc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFZ3JhdmVzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFY2lyY3VtZmxleHNtYWxsIiwgIkVkaWVyZXNpc3NtYWxsIiwgIklncmF2ZXNtYWxsIiwgIklhY3V0ZXNtYWxsIiwgIkljaXJjdW1mbGV4c21hbGwiLCAiSWRpZXJlc2lzc21hbGwiLCAiRXRoc21hbGwiLCAiTnRpbGRlc21hbGwiLCAiT2dyYXZlc21hbGwiLCAiT2FjdXRlc21hbGwiLCAiT2NpcmN1bWZsZXhzbWFsbCIsICJPdGlsZGVzbWFsbCIsICJPZGllcmVzaXNzbWFsbCIsICJPRXNtYWxsIiwgIk9zbGFzaHNtYWxsIiwgIlVncmF2ZXNtYWxsIiwgIlVhY3V0ZXNtYWxsIiwgIlVjaXJjdW1mbGV4c21hbGwiLCAiVWRpZXJlc2lzc21hbGwiLCAiWWFjdXRlc21hbGwiLCAiVGhvcm5zbWFsbCIsICJZZGllcmVzaXNzbWFsbCJdOwpleHBvcnRzLkV4cGVydEVuY29kaW5nID0gRXhwZXJ0RW5jb2Rpbmc7CmNvbnN0IE1hY0V4cGVydEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwgInBhcmVubGVmdHN1cGVyaW9yIiwgInBhcmVucmlnaHRzdXBlcmlvciIsICJ0d29kb3RlbmxlYWRlciIsICJvbmVkb3RlbmxlYWRlciIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgImZyYWN0aW9uIiwgInplcm9vbGRzdHlsZSIsICJvbmVvbGRzdHlsZSIsICJ0d29vbGRzdHlsZSIsICJ0aHJlZW9sZHN0eWxlIiwgImZvdXJvbGRzdHlsZSIsICJmaXZlb2xkc3R5bGUiLCAic2l4b2xkc3R5bGUiLCAic2V2ZW5vbGRzdHlsZSIsICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAiIiwgInRocmVlcXVhcnRlcnNlbWRhc2giLCAiIiwgInF1ZXN0aW9uc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIkV0aHNtYWxsIiwgIiIsICIiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAib25lZWlnaHRoIiwgInRocmVlZWlnaHRocyIsICJmaXZlZWlnaHRocyIsICJzZXZlbmVpZ2h0aHMiLCAib25ldGhpcmQiLCAidHdvdGhpcmRzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImZmIiwgImZpIiwgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCAiIiwgInBhcmVucmlnaHRpbmZlcmlvciIsICJDaXJjdW1mbGV4c21hbGwiLCAiaHlwaGVuaW5mZXJpb3IiLCAiR3JhdmVzbWFsbCIsICJBc21hbGwiLCAiQnNtYWxsIiwgIkNzbWFsbCIsICJEc21hbGwiLCAiRXNtYWxsIiwgIkZzbWFsbCIsICJHc21hbGwiLCAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsICJQc21hbGwiLCAiUXNtYWxsIiwgIlJzbWFsbCIsICJTc21hbGwiLCAiVHNtYWxsIiwgIlVzbWFsbCIsICJWc21hbGwiLCAiV3NtYWxsIiwgIlhzbWFsbCIsICJZc21hbGwiLCAiWnNtYWxsIiwgImNvbG9ubW9uZXRhcnkiLCAib25lZml0dGVkIiwgInJ1cGlhaCIsICJUaWxkZXNtYWxsIiwgIiIsICIiLCAiYXN1cGVyaW9yIiwgImNlbnRzdXBlcmlvciIsICIiLCAiIiwgIiIsICIiLCAiQWFjdXRlc21hbGwiLCAiQWdyYXZlc21hbGwiLCAiQWNpcmN1bWZsZXhzbWFsbCIsICJBZGllcmVzaXNzbWFsbCIsICJBdGlsZGVzbWFsbCIsICJBcmluZ3NtYWxsIiwgIkNjZWRpbGxhc21hbGwiLCAiRWFjdXRlc21hbGwiLCAiRWdyYXZlc21hbGwiLCAiRWNpcmN1bWZsZXhzbWFsbCIsICJFZGllcmVzaXNzbWFsbCIsICJJYWN1dGVzbWFsbCIsICJJZ3JhdmVzbWFsbCIsICJJY2lyY3VtZmxleHNtYWxsIiwgIklkaWVyZXNpc3NtYWxsIiwgIk50aWxkZXNtYWxsIiwgIk9hY3V0ZXNtYWxsIiwgIk9ncmF2ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT3RpbGRlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsICIiLCAiZWlnaHRzdXBlcmlvciIsICJmb3VyaW5mZXJpb3IiLCAidGhyZWVpbmZlcmlvciIsICJzaXhpbmZlcmlvciIsICJlaWdodGluZmVyaW9yIiwgInNldmVuaW5mZXJpb3IiLCAiU2Nhcm9uc21hbGwiLCAiIiwgImNlbnRpbmZlcmlvciIsICJ0d29pbmZlcmlvciIsICIiLCAiRGllcmVzaXNzbWFsbCIsICIiLCAiQ2Fyb25zbWFsbCIsICJvc3VwZXJpb3IiLCAiZml2ZWluZmVyaW9yIiwgIiIsICJjb21tYWluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgIllhY3V0ZXNtYWxsIiwgIiIsICJkb2xsYXJpbmZlcmlvciIsICIiLCAiIiwgIlRob3Juc21hbGwiLCAiIiwgIm5pbmVpbmZlcmlvciIsICJ6ZXJvaW5mZXJpb3IiLCAiWmNhcm9uc21hbGwiLCAiQUVzbWFsbCIsICJPc2xhc2hzbWFsbCIsICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVpbmZlcmlvciIsICJMc2xhc2hzbWFsbCIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJDZWRpbGxhc21hbGwiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJPRXNtYWxsIiwgImZpZ3VyZWRhc2giLCAiaHlwaGVuc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd25zbWFsbCIsICIiLCAiWWRpZXJlc2lzc21hbGwiLCAiIiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiZm91cnN1cGVyaW9yIiwgImZpdmVzdXBlcmlvciIsICJzaXhzdXBlcmlvciIsICJzZXZlbnN1cGVyaW9yIiwgIm5pbmVzdXBlcmlvciIsICJ6ZXJvc3VwZXJpb3IiLCAiIiwgImVzdXBlcmlvciIsICJyc3VwZXJpb3IiLCAidHN1cGVyaW9yIiwgIiIsICIiLCAiaXN1cGVyaW9yIiwgInNzdXBlcmlvciIsICJkc3VwZXJpb3IiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJsc3VwZXJpb3IiLCAiT2dvbmVrc21hbGwiLCAiQnJldmVzbWFsbCIsICJNYWNyb25zbWFsbCIsICJic3VwZXJpb3IiLCAibnN1cGVyaW9yIiwgIm1zdXBlcmlvciIsICJjb21tYXN1cGVyaW9yIiwgInBlcmlvZHN1cGVyaW9yIiwgIkRvdGFjY2VudHNtYWxsIiwgIlJpbmdzbWFsbCIsICIiLCAiIiwgIiIsICIiXTsKY29uc3QgTWFjUm9tYW5FbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICIiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkNjZWRpbGxhIiwgIkVhY3V0ZSIsICJOdGlsZGUiLCAiT2RpZXJlc2lzIiwgIlVkaWVyZXNpcyIsICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLCAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsICJlY2lyY3VtZmxleCIsICJlZGllcmVzaXMiLCAiaWFjdXRlIiwgImlncmF2ZSIsICJpY2lyY3VtZmxleCIsICJpZGllcmVzaXMiLCAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwgIm90aWxkZSIsICJ1YWN1dGUiLCAidWdyYXZlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJkYWdnZXIiLCAiZGVncmVlIiwgImNlbnQiLCAic3RlcmxpbmciLCAic2VjdGlvbiIsICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLCAidHJhZGVtYXJrIiwgImFjdXRlIiwgImRpZXJlc2lzIiwgIm5vdGVxdWFsIiwgIkFFIiwgIk9zbGFzaCIsICJpbmZpbml0eSIsICJwbHVzbWludXMiLCAibGVzc2VxdWFsIiwgImdyZWF0ZXJlcXVhbCIsICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLCAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwgImFlIiwgIm9zbGFzaCIsICJxdWVzdGlvbmRvd24iLCAiZXhjbGFtZG93biIsICJsb2dpY2Fsbm90IiwgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAic3BhY2UiLCAiQWdyYXZlIiwgIkF0aWxkZSIsICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsICJ5ZGllcmVzaXMiLCAiWWRpZXJlc2lzIiwgImZyYWN0aW9uIiwgImN1cnJlbmN5IiwgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgInF1b3Rlc2luZ2xiYXNlIiwgInF1b3RlZGJsYmFzZSIsICJwZXJ0aG91c2FuZCIsICJBY2lyY3VtZmxleCIsICJFY2lyY3VtZmxleCIsICJBYWN1dGUiLCAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiYXBwbGUiLCAiT2dyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZ3JhdmUiLCAiZG90bGVzc2kiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgImNhcm9uIl07CmV4cG9ydHMuTWFjUm9tYW5FbmNvZGluZyA9IE1hY1JvbWFuRW5jb2Rpbmc7CmNvbnN0IFN0YW5kYXJkRW5jb2RpbmcgPSBbIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgInF1b3RlbGVmdCIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgImV4Y2xhbWRvd24iLCAiY2VudCIsICJzdGVybGluZyIsICJmcmFjdGlvbiIsICJ5ZW4iLCAiZmxvcmluIiwgInNlY3Rpb24iLCAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsICIiLCAiZW5kYXNoIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAicGVyaW9kY2VudGVyZWQiLCAiIiwgInBhcmFncmFwaCIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInF1b3RlZGJscmlnaHQiLCAiZ3VpbGxlbW90cmlnaHQiLCAiZWxsaXBzaXMiLCAicGVydGhvdXNhbmQiLCAiIiwgInF1ZXN0aW9uZG93biIsICIiLCAiZ3JhdmUiLCAiYWN1dGUiLCAiY2lyY3VtZmxleCIsICJ0aWxkZSIsICJtYWNyb24iLCAiYnJldmUiLCAiZG90YWNjZW50IiwgImRpZXJlc2lzIiwgIiIsICJyaW5nIiwgImNlZGlsbGEiLCAiIiwgImh1bmdhcnVtbGF1dCIsICJvZ29uZWsiLCAiY2Fyb24iLCAiZW1kYXNoIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJBRSIsICIiLCAib3JkZmVtaW5pbmUiLCAiIiwgIiIsICIiLCAiIiwgIkxzbGFzaCIsICJPc2xhc2giLCAiT0UiLCAib3JkbWFzY3VsaW5lIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiYWUiLCAiIiwgIiIsICIiLCAiZG90bGVzc2kiLCAiIiwgIiIsICJsc2xhc2giLCAib3NsYXNoIiwgIm9lIiwgImdlcm1hbmRibHMiLCAiIiwgIiIsICIiLCAiIl07CmV4cG9ydHMuU3RhbmRhcmRFbmNvZGluZyA9IFN0YW5kYXJkRW5jb2Rpbmc7CmNvbnN0IFdpbkFuc2lFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJidWxsZXQiLCAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgImNpcmN1bWZsZXgiLCAicGVydGhvdXNhbmQiLCAiU2Nhcm9uIiwgImd1aWxzaW5nbGxlZnQiLCAiT0UiLCAiYnVsbGV0IiwgIlpjYXJvbiIsICJidWxsZXQiLCAiYnVsbGV0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgImJ1bGxldCIsICJlbmRhc2giLCAiZW1kYXNoIiwgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLCAic3BhY2UiLCAiZXhjbGFtZG93biIsICJjZW50IiwgInN0ZXJsaW5nIiwgImN1cnJlbmN5IiwgInllbiIsICJicm9rZW5iYXIiLCAic2VjdGlvbiIsICJkaWVyZXNpcyIsICJjb3B5cmlnaHQiLCAib3JkZmVtaW5pbmUiLCAiZ3VpbGxlbW90bGVmdCIsICJsb2dpY2Fsbm90IiwgImh5cGhlbiIsICJyZWdpc3RlcmVkIiwgIm1hY3JvbiIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwgImNlZGlsbGEiLCAib25lc3VwZXJpb3IiLCAib3JkbWFzY3VsaW5lIiwgImd1aWxsZW1vdHJpZ2h0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsICJBZ3JhdmUiLCAiQWFjdXRlIiwgIkFjaXJjdW1mbGV4IiwgIkF0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQUUiLCAiQ2NlZGlsbGEiLCAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLCAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLCAiT3NsYXNoIiwgIlVncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWRpZXJlc2lzIiwgIllhY3V0ZSIsICJUaG9ybiIsICJnZXJtYW5kYmxzIiwgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJldGgiLCAibnRpbGRlIiwgIm9ncmF2ZSIsICJvYWN1dGUiLCAib2NpcmN1bWZsZXgiLCAib3RpbGRlIiwgIm9kaWVyZXNpcyIsICJkaXZpZGUiLCAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiXTsKZXhwb3J0cy5XaW5BbnNpRW5jb2RpbmcgPSBXaW5BbnNpRW5jb2Rpbmc7CmNvbnN0IFN5bWJvbFNldEVuY29kaW5nID0gWyIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgInNwYWNlIiwgImV4Y2xhbSIsICJ1bml2ZXJzYWwiLCAibnVtYmVyc2lnbiIsICJleGlzdGVudGlhbCIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJzdWNodGhhdCIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3Rlcmlza21hdGgiLCAicGx1cyIsICJjb21tYSIsICJtaW51cyIsICJwZXJpb2QiLCAic2xhc2giLCAiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLCAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwgImNvbmdydWVudCIsICJBbHBoYSIsICJCZXRhIiwgIkNoaSIsICJEZWx0YSIsICJFcHNpbG9uIiwgIlBoaSIsICJHYW1tYSIsICJFdGEiLCAiSW90YSIsICJ0aGV0YTEiLCAiS2FwcGEiLCAiTGFtYmRhIiwgIk11IiwgIk51IiwgIk9taWNyb24iLCAiUGkiLCAiVGhldGEiLCAiUmhvIiwgIlNpZ21hIiwgIlRhdSIsICJVcHNpbG9uIiwgInNpZ21hMSIsICJPbWVnYSIsICJYaSIsICJQc2kiLCAiWmV0YSIsICJicmFja2V0bGVmdCIsICJ0aGVyZWZvcmUiLCAiYnJhY2tldHJpZ2h0IiwgInBlcnBlbmRpY3VsYXIiLCAidW5kZXJzY29yZSIsICJyYWRpY2FsZXgiLCAiYWxwaGEiLCAiYmV0YSIsICJjaGkiLCAiZGVsdGEiLCAiZXBzaWxvbiIsICJwaGkiLCAiZ2FtbWEiLCAiZXRhIiwgImlvdGEiLCAicGhpMSIsICJrYXBwYSIsICJsYW1iZGEiLCAibXUiLCAibnUiLCAib21pY3JvbiIsICJwaSIsICJ0aGV0YSIsICJyaG8iLCAic2lnbWEiLCAidGF1IiwgInVwc2lsb24iLCAib21lZ2ExIiwgIm9tZWdhIiwgInhpIiwgInBzaSIsICJ6ZXRhIiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJzaW1pbGFyIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIkV1cm8iLCAiVXBzaWxvbjEiLCAibWludXRlIiwgImxlc3NlcXVhbCIsICJmcmFjdGlvbiIsICJpbmZpbml0eSIsICJmbG9yaW4iLCAiY2x1YiIsICJkaWFtb25kIiwgImhlYXJ0IiwgInNwYWRlIiwgImFycm93Ym90aCIsICJhcnJvd2xlZnQiLCAiYXJyb3d1cCIsICJhcnJvd3JpZ2h0IiwgImFycm93ZG93biIsICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInNlY29uZCIsICJncmVhdGVyZXF1YWwiLCAibXVsdGlwbHkiLCAicHJvcG9ydGlvbmFsIiwgInBhcnRpYWxkaWZmIiwgImJ1bGxldCIsICJkaXZpZGUiLCAibm90ZXF1YWwiLCAiZXF1aXZhbGVuY2UiLCAiYXBwcm94ZXF1YWwiLCAiZWxsaXBzaXMiLCAiYXJyb3d2ZXJ0ZXgiLCAiYXJyb3dob3JpemV4IiwgImNhcnJpYWdlcmV0dXJuIiwgImFsZXBoIiwgIklmcmFrdHVyIiwgIlJmcmFrdHVyIiwgIndlaWVyc3RyYXNzIiwgImNpcmNsZW11bHRpcGx5IiwgImNpcmNsZXBsdXMiLCAiZW1wdHlzZXQiLCAiaW50ZXJzZWN0aW9uIiwgInVuaW9uIiwgInByb3BlcnN1cGVyc2V0IiwgInJlZmxleHN1cGVyc2V0IiwgIm5vdHN1YnNldCIsICJwcm9wZXJzdWJzZXQiLCAicmVmbGV4c3Vic2V0IiwgImVsZW1lbnQiLCAibm90ZWxlbWVudCIsICJhbmdsZSIsICJncmFkaWVudCIsICJyZWdpc3RlcnNlcmlmIiwgImNvcHlyaWdodHNlcmlmIiwgInRyYWRlbWFya3NlcmlmIiwgInByb2R1Y3QiLCAicmFkaWNhbCIsICJkb3RtYXRoIiwgImxvZ2ljYWxub3QiLCAibG9naWNhbGFuZCIsICJsb2dpY2Fsb3IiLCAiYXJyb3dkYmxib3RoIiwgImFycm93ZGJsbGVmdCIsICJhcnJvd2RibHVwIiwgImFycm93ZGJscmlnaHQiLCAiYXJyb3dkYmxkb3duIiwgImxvemVuZ2UiLCAiYW5nbGVsZWZ0IiwgInJlZ2lzdGVyc2FucyIsICJjb3B5cmlnaHRzYW5zIiwgInRyYWRlbWFya3NhbnMiLCAic3VtbWF0aW9uIiwgInBhcmVubGVmdHRwIiwgInBhcmVubGVmdGV4IiwgInBhcmVubGVmdGJ0IiwgImJyYWNrZXRsZWZ0dHAiLCAiYnJhY2tldGxlZnRleCIsICJicmFja2V0bGVmdGJ0IiwgImJyYWNlbGVmdHRwIiwgImJyYWNlbGVmdG1pZCIsICJicmFjZWxlZnRidCIsICJicmFjZWV4IiwgIiIsICJhbmdsZXJpZ2h0IiwgImludGVncmFsIiwgImludGVncmFsdHAiLCAiaW50ZWdyYWxleCIsICJpbnRlZ3JhbGJ0IiwgInBhcmVucmlnaHR0cCIsICJwYXJlbnJpZ2h0ZXgiLCAicGFyZW5yaWdodGJ0IiwgImJyYWNrZXRyaWdodHRwIiwgImJyYWNrZXRyaWdodGV4IiwgImJyYWNrZXRyaWdodGJ0IiwgImJyYWNlcmlnaHR0cCIsICJicmFjZXJpZ2h0bWlkIiwgImJyYWNlcmlnaHRidCIsICIiXTsKZXhwb3J0cy5TeW1ib2xTZXRFbmNvZGluZyA9IFN5bWJvbFNldEVuY29kaW5nOwpjb25zdCBaYXBmRGluZ2JhdHNFbmNvZGluZyA9IFsiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJzcGFjZSIsICJhMSIsICJhMiIsICJhMjAyIiwgImEzIiwgImE0IiwgImE1IiwgImExMTkiLCAiYTExOCIsICJhMTE3IiwgImExMSIsICJhMTIiLCAiYTEzIiwgImExNCIsICJhMTUiLCAiYTE2IiwgImExMDUiLCAiYTE3IiwgImExOCIsICJhMTkiLCAiYTIwIiwgImEyMSIsICJhMjIiLCAiYTIzIiwgImEyNCIsICJhMjUiLCAiYTI2IiwgImEyNyIsICJhMjgiLCAiYTYiLCAiYTciLCAiYTgiLCAiYTkiLCAiYTEwIiwgImEyOSIsICJhMzAiLCAiYTMxIiwgImEzMiIsICJhMzMiLCAiYTM0IiwgImEzNSIsICJhMzYiLCAiYTM3IiwgImEzOCIsICJhMzkiLCAiYTQwIiwgImE0MSIsICJhNDIiLCAiYTQzIiwgImE0NCIsICJhNDUiLCAiYTQ2IiwgImE0NyIsICJhNDgiLCAiYTQ5IiwgImE1MCIsICJhNTEiLCAiYTUyIiwgImE1MyIsICJhNTQiLCAiYTU1IiwgImE1NiIsICJhNTciLCAiYTU4IiwgImE1OSIsICJhNjAiLCAiYTYxIiwgImE2MiIsICJhNjMiLCAiYTY0IiwgImE2NSIsICJhNjYiLCAiYTY3IiwgImE2OCIsICJhNjkiLCAiYTcwIiwgImE3MSIsICJhNzIiLCAiYTczIiwgImE3NCIsICJhMjAzIiwgImE3NSIsICJhMjA0IiwgImE3NiIsICJhNzciLCAiYTc4IiwgImE3OSIsICJhODEiLCAiYTgyIiwgImE4MyIsICJhODQiLCAiYTk3IiwgImE5OCIsICJhOTkiLCAiYTEwMCIsICIiLCAiYTg5IiwgImE5MCIsICJhOTMiLCAiYTk0IiwgImE5MSIsICJhOTIiLCAiYTIwNSIsICJhODUiLCAiYTIwNiIsICJhODYiLCAiYTg3IiwgImE4OCIsICJhOTUiLCAiYTk2IiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsICJhMTA4IiwgImExMTIiLCAiYTExMSIsICJhMTEwIiwgImExMDkiLCAiYTEyMCIsICJhMTIxIiwgImExMjIiLCAiYTEyMyIsICJhMTI0IiwgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLCAiYTEzMiIsICJhMTMzIiwgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwgImExNDAiLCAiYTE0MSIsICJhMTQyIiwgImExNDMiLCAiYTE0NCIsICJhMTQ1IiwgImExNDYiLCAiYTE0NyIsICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsICJhMTUxIiwgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLCAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsICJhMTYwIiwgImExNjEiLCAiYTE2MyIsICJhMTY0IiwgImExOTYiLCAiYTE2NSIsICJhMTkyIiwgImExNjYiLCAiYTE2NyIsICJhMTY4IiwgImExNjkiLCAiYTE3MCIsICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsICJhMTc2IiwgImExNzciLCAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsICJhMTgyIiwgIiIsICJhMjAxIiwgImExODMiLCAiYTE4NCIsICJhMTk3IiwgImExODUiLCAiYTE5NCIsICJhMTk4IiwgImExODYiLCAiYTE5NSIsICJhMTg3IiwgImExODgiLCAiYTE4OSIsICJhMTkwIiwgImExOTEiLCAiIl07CmV4cG9ydHMuWmFwZkRpbmdiYXRzRW5jb2RpbmcgPSBaYXBmRGluZ2JhdHNFbmNvZGluZzsKZnVuY3Rpb24gZ2V0RW5jb2RpbmcoZW5jb2RpbmdOYW1lKSB7CiAgc3dpdGNoIChlbmNvZGluZ05hbWUpIHsKICAgIGNhc2UgIldpbkFuc2lFbmNvZGluZyI6CiAgICAgIHJldHVybiBXaW5BbnNpRW5jb2Rpbmc7CiAgICBjYXNlICJTdGFuZGFyZEVuY29kaW5nIjoKICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2Rpbmc7CiAgICBjYXNlICJNYWNSb21hbkVuY29kaW5nIjoKICAgICAgcmV0dXJuIE1hY1JvbWFuRW5jb2Rpbmc7CiAgICBjYXNlICJTeW1ib2xTZXRFbmNvZGluZyI6CiAgICAgIHJldHVybiBTeW1ib2xTZXRFbmNvZGluZzsKICAgIGNhc2UgIlphcGZEaW5nYmF0c0VuY29kaW5nIjoKICAgICAgcmV0dXJuIFphcGZEaW5nYmF0c0VuY29kaW5nOwogICAgY2FzZSAiRXhwZXJ0RW5jb2RpbmciOgogICAgICByZXR1cm4gRXhwZXJ0RW5jb2Rpbmc7CiAgICBjYXNlICJNYWNFeHBlcnRFbmNvZGluZyI6CiAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZzsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBudWxsOwogIH0KfQoKLyoqKi8gfSksCi8qIDM4ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEID0gZXhwb3J0cy5NYWNTdGFuZGFyZEdseXBoT3JkZXJpbmcgPSBleHBvcnRzLkZvbnRGbGFncyA9IHZvaWQgMDsKZXhwb3J0cy5ub3JtYWxpemVGb250TmFtZSA9IG5vcm1hbGl6ZUZvbnROYW1lOwpleHBvcnRzLnJlY292ZXJHbHlwaE5hbWUgPSByZWNvdmVyR2x5cGhOYW1lOwpleHBvcnRzLnR5cGUxRm9udEdseXBoTWFwcGluZyA9IHR5cGUxRm9udEdseXBoTWFwcGluZzsKdmFyIF9lbmNvZGluZ3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKdmFyIF9nbHlwaGxpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKdmFyIF91bmljb2RlID0gX193X3BkZmpzX3JlcXVpcmVfXyg0MCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNvbnN0IFNFQUNfQU5BTFlTSVNfRU5BQkxFRCA9IHRydWU7CmV4cG9ydHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEID0gU0VBQ19BTkFMWVNJU19FTkFCTEVEOwpjb25zdCBGb250RmxhZ3MgPSB7CiAgRml4ZWRQaXRjaDogMSwKICBTZXJpZjogMiwKICBTeW1ib2xpYzogNCwKICBTY3JpcHQ6IDgsCiAgTm9uc3ltYm9saWM6IDMyLAogIEl0YWxpYzogNjQsCiAgQWxsQ2FwOiA2NTUzNiwKICBTbWFsbENhcDogMTMxMDcyLAogIEZvcmNlQm9sZDogMjYyMTQ0Cn07CmV4cG9ydHMuRm9udEZsYWdzID0gRm9udEZsYWdzOwpjb25zdCBNYWNTdGFuZGFyZEdseXBoT3JkZXJpbmcgPSBbIi5ub3RkZWYiLCAiLm51bGwiLCAibm9ubWFya2luZ3JldHVybiIsICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYXN0ZXJpc2siLCAicGx1cyIsICJjb21tYSIsICJoeXBoZW4iLCAicGVyaW9kIiwgInNsYXNoIiwgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIsICJHIiwgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLCAiWCIsICJZIiwgIloiLCAiYnJhY2tldGxlZnQiLCAiYmFja3NsYXNoIiwgImJyYWNrZXRyaWdodCIsICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLCAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLCAiQ2NlZGlsbGEiLCAiRWFjdXRlIiwgIk50aWxkZSIsICJPZGllcmVzaXMiLCAiVWRpZXJlc2lzIiwgImFhY3V0ZSIsICJhZ3JhdmUiLCAiYWNpcmN1bWZsZXgiLCAiYWRpZXJlc2lzIiwgImF0aWxkZSIsICJhcmluZyIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWdyYXZlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpYWN1dGUiLCAiaWdyYXZlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJudGlsZGUiLCAib2FjdXRlIiwgIm9ncmF2ZSIsICJvY2lyY3VtZmxleCIsICJvZGllcmVzaXMiLCAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgImRhZ2dlciIsICJkZWdyZWUiLCAiY2VudCIsICJzdGVybGluZyIsICJzZWN0aW9uIiwgImJ1bGxldCIsICJwYXJhZ3JhcGgiLCAiZ2VybWFuZGJscyIsICJyZWdpc3RlcmVkIiwgImNvcHlyaWdodCIsICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLCAiT3NsYXNoIiwgImluZmluaXR5IiwgInBsdXNtaW51cyIsICJsZXNzZXF1YWwiLCAiZ3JlYXRlcmVxdWFsIiwgInllbiIsICJtdSIsICJwYXJ0aWFsZGlmZiIsICJzdW1tYXRpb24iLCAicHJvZHVjdCIsICJwaSIsICJpbnRlZ3JhbCIsICJvcmRmZW1pbmluZSIsICJvcmRtYXNjdWxpbmUiLCAiT21lZ2EiLCAiYWUiLCAib3NsYXNoIiwgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLCAicmFkaWNhbCIsICJmbG9yaW4iLCAiYXBwcm94ZXF1YWwiLCAiRGVsdGEiLCAiZ3VpbGxlbW90bGVmdCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJub25icmVha2luZ3NwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLCAiT3RpbGRlIiwgIk9FIiwgIm9lIiwgImVuZGFzaCIsICJlbWRhc2giLCAicXVvdGVkYmxsZWZ0IiwgInF1b3RlZGJscmlnaHQiLCAicXVvdGVsZWZ0IiwgInF1b3RlcmlnaHQiLCAiZGl2aWRlIiwgImxvemVuZ2UiLCAieWRpZXJlc2lzIiwgIllkaWVyZXNpcyIsICJmcmFjdGlvbiIsICJjdXJyZW5jeSIsICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgImZpIiwgImZsIiwgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicGVydGhvdXNhbmQiLCAiQWNpcmN1bWZsZXgiLCAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwgIkljaXJjdW1mbGV4IiwgIklkaWVyZXNpcyIsICJJZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgImFwcGxlIiwgIk9ncmF2ZSIsICJVYWN1dGUiLCAiVWNpcmN1bWZsZXgiLCAiVWdyYXZlIiwgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiIsICJMc2xhc2giLCAibHNsYXNoIiwgIlNjYXJvbiIsICJzY2Fyb24iLCAiWmNhcm9uIiwgInpjYXJvbiIsICJicm9rZW5iYXIiLCAiRXRoIiwgImV0aCIsICJZYWN1dGUiLCAieWFjdXRlIiwgIlRob3JuIiwgInRob3JuIiwgIm1pbnVzIiwgIm11bHRpcGx5IiwgIm9uZXN1cGVyaW9yIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAib25laGFsZiIsICJvbmVxdWFydGVyIiwgInRocmVlcXVhcnRlcnMiLCAiZnJhbmMiLCAiR2JyZXZlIiwgImdicmV2ZSIsICJJZG90YWNjZW50IiwgIlNjZWRpbGxhIiwgInNjZWRpbGxhIiwgIkNhY3V0ZSIsICJjYWN1dGUiLCAiQ2Nhcm9uIiwgImNjYXJvbiIsICJkY3JvYXQiXTsKZXhwb3J0cy5NYWNTdGFuZGFyZEdseXBoT3JkZXJpbmcgPSBNYWNTdGFuZGFyZEdseXBoT3JkZXJpbmc7CmZ1bmN0aW9uIHJlY292ZXJHbHlwaE5hbWUobmFtZSwgZ2x5cGhzVW5pY29kZU1hcCkgewogIGlmIChnbHlwaHNVbmljb2RlTWFwW25hbWVdICE9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybiBuYW1lOwogIH0KICBjb25zdCB1bmljb2RlID0gKDAsIF91bmljb2RlLmdldFVuaWNvZGVGb3JHbHlwaCkobmFtZSwgZ2x5cGhzVW5pY29kZU1hcCk7CiAgaWYgKHVuaWNvZGUgIT09IC0xKSB7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBnbHlwaHNVbmljb2RlTWFwKSB7CiAgICAgIGlmIChnbHlwaHNVbmljb2RlTWFwW2tleV0gPT09IHVuaWNvZGUpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgICB9CiAgICB9CiAgfQogICgwLCBfdXRpbC5pbmZvKSgiVW5hYmxlIHRvIHJlY292ZXIgYSBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvcjogIiArIG5hbWUpOwogIHJldHVybiBuYW1lOwp9CmZ1bmN0aW9uIHR5cGUxRm9udEdseXBoTWFwcGluZyhwcm9wZXJ0aWVzLCBidWlsdEluRW5jb2RpbmcsIGdseXBoTmFtZXMpIHsKICBjb25zdCBjaGFyQ29kZVRvR2x5cGhJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgbGV0IGdseXBoSWQsIGNoYXJDb2RlLCBiYXNlRW5jb2Rpbmc7CiAgY29uc3QgaXNTeW1ib2xpY0ZvbnQgPSAhIShwcm9wZXJ0aWVzLmZsYWdzICYgRm9udEZsYWdzLlN5bWJvbGljKTsKICBpZiAocHJvcGVydGllcy5pc0ludGVybmFsRm9udCkgewogICAgYmFzZUVuY29kaW5nID0gYnVpbHRJbkVuY29kaW5nOwogICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgewogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpIHsKICAgIGJhc2VFbmNvZGluZyA9ICgwLCBfZW5jb2RpbmdzLmdldEVuY29kaW5nKShwcm9wZXJ0aWVzLmJhc2VFbmNvZGluZ05hbWUpOwogICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgewogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOwogICAgICB9CiAgICB9CiAgfSBlbHNlIGlmIChpc1N5bWJvbGljRm9udCkgewogICAgZm9yIChjaGFyQ29kZSBpbiBidWlsdEluRW5jb2RpbmcpIHsKICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gYnVpbHRJbkVuY29kaW5nW2NoYXJDb2RlXTsKICAgIH0KICB9IGVsc2UgewogICAgYmFzZUVuY29kaW5nID0gX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nOwogICAgZm9yIChjaGFyQ29kZSA9IDA7IGNoYXJDb2RlIDwgYmFzZUVuY29kaW5nLmxlbmd0aDsgY2hhckNvZGUrKykgewogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGJhc2VFbmNvZGluZ1tjaGFyQ29kZV0pOwogICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSAwOwogICAgICB9CiAgICB9CiAgfQogIGNvbnN0IGRpZmZlcmVuY2VzID0gcHJvcGVydGllcy5kaWZmZXJlbmNlczsKICBsZXQgZ2x5cGhzVW5pY29kZU1hcDsKICBpZiAoZGlmZmVyZW5jZXMpIHsKICAgIGZvciAoY2hhckNvZGUgaW4gZGlmZmVyZW5jZXMpIHsKICAgICAgY29uc3QgZ2x5cGhOYW1lID0gZGlmZmVyZW5jZXNbY2hhckNvZGVdOwogICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKGdseXBoTmFtZSk7CiAgICAgIGlmIChnbHlwaElkID09PSAtMSkgewogICAgICAgIGlmICghZ2x5cGhzVW5pY29kZU1hcCkgewogICAgICAgICAgZ2x5cGhzVW5pY29kZU1hcCA9ICgwLCBfZ2x5cGhsaXN0LmdldEdseXBoc1VuaWNvZGUpKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YW5kYXJkR2x5cGhOYW1lID0gcmVjb3ZlckdseXBoTmFtZShnbHlwaE5hbWUsIGdseXBoc1VuaWNvZGVNYXApOwogICAgICAgIGlmIChzdGFuZGFyZEdseXBoTmFtZSAhPT0gZ2x5cGhOYW1lKSB7CiAgICAgICAgICBnbHlwaElkID0gZ2x5cGhOYW1lcy5pbmRleE9mKHN0YW5kYXJkR2x5cGhOYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGdseXBoSWQgPj0gMCkgewogICAgICAgIGNoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gMDsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gY2hhckNvZGVUb0dseXBoSWQ7Cn0KZnVuY3Rpb24gbm9ybWFsaXplRm9udE5hbWUobmFtZSkgewogIHJldHVybiBuYW1lLnJlcGxhY2VBbGwoL1ssX10vZywgIi0iKS5yZXBsYWNlQWxsKC9ccy9nLCAiIik7Cn0KCi8qKiovIH0pLAovKiAzOSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgpfX3dfcGRmanNfcmVxdWlyZV9fLnIoX193ZWJwYWNrX2V4cG9ydHNfXyk7Ci8qIGhhcm1vbnkgZXhwb3J0ICovIF9fd19wZGZqc19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCB7Ci8qIGhhcm1vbnkgZXhwb3J0ICovICAgZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlOiAoKSA9PiAoLyogYmluZGluZyAqLyBnZXREaW5nYmF0c0dseXBoc1VuaWNvZGUpLAovKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldEdseXBoc1VuaWNvZGU6ICgpID0+ICgvKiBiaW5kaW5nICovIGdldEdseXBoc1VuaWNvZGUpCi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2NvcmVfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7Cgpjb25zdCBnZXRHbHlwaHNVbmljb2RlID0gKDAsX2NvcmVfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiB0LkEgPSAweDAwNDE7CiB0LkFFID0gMHgwMGM2OwogdC5BRWFjdXRlID0gMHgwMWZjOwogdC5BRW1hY3JvbiA9IDB4MDFlMjsKIHQuQUVzbWFsbCA9IDB4ZjdlNjsKIHQuQWFjdXRlID0gMHgwMGMxOwogdC5BYWN1dGVzbWFsbCA9IDB4ZjdlMTsKIHQuQWJyZXZlID0gMHgwMTAyOwogdC5BYnJldmVhY3V0ZSA9IDB4MWVhZTsKIHQuQWJyZXZlY3lyaWxsaWMgPSAweDA0ZDA7CiB0LkFicmV2ZWRvdGJlbG93ID0gMHgxZWI2OwogdC5BYnJldmVncmF2ZSA9IDB4MWViMDsKIHQuQWJyZXZlaG9va2Fib3ZlID0gMHgxZWIyOwogdC5BYnJldmV0aWxkZSA9IDB4MWViNDsKIHQuQWNhcm9uID0gMHgwMWNkOwogdC5BY2lyY2xlID0gMHgyNGI2OwogdC5BY2lyY3VtZmxleCA9IDB4MDBjMjsKIHQuQWNpcmN1bWZsZXhhY3V0ZSA9IDB4MWVhNDsKIHQuQWNpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVhYzsKIHQuQWNpcmN1bWZsZXhncmF2ZSA9IDB4MWVhNjsKIHQuQWNpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlYTg7CiB0LkFjaXJjdW1mbGV4c21hbGwgPSAweGY3ZTI7CiB0LkFjaXJjdW1mbGV4dGlsZGUgPSAweDFlYWE7CiB0LkFjdXRlID0gMHhmNmM5OwogdC5BY3V0ZXNtYWxsID0gMHhmN2I0OwogdC5BY3lyaWxsaWMgPSAweDA0MTA7CiB0LkFkYmxncmF2ZSA9IDB4MDIwMDsKIHQuQWRpZXJlc2lzID0gMHgwMGM0OwogdC5BZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkMjsKIHQuQWRpZXJlc2lzbWFjcm9uID0gMHgwMWRlOwogdC5BZGllcmVzaXNzbWFsbCA9IDB4ZjdlNDsKIHQuQWRvdGJlbG93ID0gMHgxZWEwOwogdC5BZG90bWFjcm9uID0gMHgwMWUwOwogdC5BZ3JhdmUgPSAweDAwYzA7CiB0LkFncmF2ZXNtYWxsID0gMHhmN2UwOwogdC5BaG9va2Fib3ZlID0gMHgxZWEyOwogdC5BaWVjeXJpbGxpYyA9IDB4MDRkNDsKIHQuQWludmVydGVkYnJldmUgPSAweDAyMDI7CiB0LkFscGhhID0gMHgwMzkxOwogdC5BbHBoYXRvbm9zID0gMHgwMzg2OwogdC5BbWFjcm9uID0gMHgwMTAwOwogdC5BbW9ub3NwYWNlID0gMHhmZjIxOwogdC5Bb2dvbmVrID0gMHgwMTA0OwogdC5BcmluZyA9IDB4MDBjNTsKIHQuQXJpbmdhY3V0ZSA9IDB4MDFmYTsKIHQuQXJpbmdiZWxvdyA9IDB4MWUwMDsKIHQuQXJpbmdzbWFsbCA9IDB4ZjdlNTsKIHQuQXNtYWxsID0gMHhmNzYxOwogdC5BdGlsZGUgPSAweDAwYzM7CiB0LkF0aWxkZXNtYWxsID0gMHhmN2UzOwogdC5BeWJhcm1lbmlhbiA9IDB4MDUzMTsKIHQuQiA9IDB4MDA0MjsKIHQuQmNpcmNsZSA9IDB4MjRiNzsKIHQuQmRvdGFjY2VudCA9IDB4MWUwMjsKIHQuQmRvdGJlbG93ID0gMHgxZTA0OwogdC5CZWN5cmlsbGljID0gMHgwNDExOwogdC5CZW5hcm1lbmlhbiA9IDB4MDUzMjsKIHQuQmV0YSA9IDB4MDM5MjsKIHQuQmhvb2sgPSAweDAxODE7CiB0LkJsaW5lYmVsb3cgPSAweDFlMDY7CiB0LkJtb25vc3BhY2UgPSAweGZmMjI7CiB0LkJyZXZlc21hbGwgPSAweGY2ZjQ7CiB0LkJzbWFsbCA9IDB4Zjc2MjsKIHQuQnRvcGJhciA9IDB4MDE4MjsKIHQuQyA9IDB4MDA0MzsKIHQuQ2Fhcm1lbmlhbiA9IDB4MDUzZTsKIHQuQ2FjdXRlID0gMHgwMTA2OwogdC5DYXJvbiA9IDB4ZjZjYTsKIHQuQ2Fyb25zbWFsbCA9IDB4ZjZmNTsKIHQuQ2Nhcm9uID0gMHgwMTBjOwogdC5DY2VkaWxsYSA9IDB4MDBjNzsKIHQuQ2NlZGlsbGFhY3V0ZSA9IDB4MWUwODsKIHQuQ2NlZGlsbGFzbWFsbCA9IDB4ZjdlNzsKIHQuQ2NpcmNsZSA9IDB4MjRiODsKIHQuQ2NpcmN1bWZsZXggPSAweDAxMDg7CiB0LkNkb3QgPSAweDAxMGE7CiB0LkNkb3RhY2NlbnQgPSAweDAxMGE7CiB0LkNlZGlsbGFzbWFsbCA9IDB4ZjdiODsKIHQuQ2hhYXJtZW5pYW4gPSAweDA1NDk7CiB0LkNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJjOwogdC5DaGVjeXJpbGxpYyA9IDB4MDQyNzsKIHQuQ2hlZGVzY2VuZGVyYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YmU7CiB0LkNoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGI2OwogdC5DaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY0OwogdC5DaGVoYXJtZW5pYW4gPSAweDA1NDM7CiB0LkNoZWtoYWthc3NpYW5jeXJpbGxpYyA9IDB4MDRjYjsKIHQuQ2hldmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDRiODsKIHQuQ2hpID0gMHgwM2E3OwogdC5DaG9vayA9IDB4MDE4NzsKIHQuQ2lyY3VtZmxleHNtYWxsID0gMHhmNmY2OwogdC5DbW9ub3NwYWNlID0gMHhmZjIzOwogdC5Db2FybWVuaWFuID0gMHgwNTUxOwogdC5Dc21hbGwgPSAweGY3NjM7CiB0LkQgPSAweDAwNDQ7CiB0LkRaID0gMHgwMWYxOwogdC5EWmNhcm9uID0gMHgwMWM0OwogdC5EYWFybWVuaWFuID0gMHgwNTM0OwogdC5EYWZyaWNhbiA9IDB4MDE4OTsKIHQuRGNhcm9uID0gMHgwMTBlOwogdC5EY2VkaWxsYSA9IDB4MWUxMDsKIHQuRGNpcmNsZSA9IDB4MjRiOTsKIHQuRGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUxMjsKIHQuRGNyb2F0ID0gMHgwMTEwOwogdC5EZG90YWNjZW50ID0gMHgxZTBhOwogdC5EZG90YmVsb3cgPSAweDFlMGM7CiB0LkRlY3lyaWxsaWMgPSAweDA0MTQ7CiB0LkRlaWNvcHRpYyA9IDB4MDNlZTsKIHQuRGVsdGEgPSAweDIyMDY7CiB0LkRlbHRhZ3JlZWsgPSAweDAzOTQ7CiB0LkRob29rID0gMHgwMThhOwogdC5EaWVyZXNpcyA9IDB4ZjZjYjsKIHQuRGllcmVzaXNBY3V0ZSA9IDB4ZjZjYzsKIHQuRGllcmVzaXNHcmF2ZSA9IDB4ZjZjZDsKIHQuRGllcmVzaXNzbWFsbCA9IDB4ZjdhODsKIHQuRGlnYW1tYWdyZWVrID0gMHgwM2RjOwogdC5EamVjeXJpbGxpYyA9IDB4MDQwMjsKIHQuRGxpbmViZWxvdyA9IDB4MWUwZTsKIHQuRG1vbm9zcGFjZSA9IDB4ZmYyNDsKIHQuRG90YWNjZW50c21hbGwgPSAweGY2Zjc7CiB0LkRzbGFzaCA9IDB4MDExMDsKIHQuRHNtYWxsID0gMHhmNzY0OwogdC5EdG9wYmFyID0gMHgwMThiOwogdC5EeiA9IDB4MDFmMjsKIHQuRHpjYXJvbiA9IDB4MDFjNTsKIHQuRHplYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0ZTA7CiB0LkR6ZWN5cmlsbGljID0gMHgwNDA1OwogdC5EemhlY3lyaWxsaWMgPSAweDA0MGY7CiB0LkUgPSAweDAwNDU7CiB0LkVhY3V0ZSA9IDB4MDBjOTsKIHQuRWFjdXRlc21hbGwgPSAweGY3ZTk7CiB0LkVicmV2ZSA9IDB4MDExNDsKIHQuRWNhcm9uID0gMHgwMTFhOwogdC5FY2VkaWxsYWJyZXZlID0gMHgxZTFjOwogdC5FY2hhcm1lbmlhbiA9IDB4MDUzNTsKIHQuRWNpcmNsZSA9IDB4MjRiYTsKIHQuRWNpcmN1bWZsZXggPSAweDAwY2E7CiB0LkVjaXJjdW1mbGV4YWN1dGUgPSAweDFlYmU7CiB0LkVjaXJjdW1mbGV4YmVsb3cgPSAweDFlMTg7CiB0LkVjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYzY7CiB0LkVjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYzA7CiB0LkVjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWMyOwogdC5FY2lyY3VtZmxleHNtYWxsID0gMHhmN2VhOwogdC5FY2lyY3VtZmxleHRpbGRlID0gMHgxZWM0OwogdC5FY3lyaWxsaWMgPSAweDA0MDQ7CiB0LkVkYmxncmF2ZSA9IDB4MDIwNDsKIHQuRWRpZXJlc2lzID0gMHgwMGNiOwogdC5FZGllcmVzaXNzbWFsbCA9IDB4ZjdlYjsKIHQuRWRvdCA9IDB4MDExNjsKIHQuRWRvdGFjY2VudCA9IDB4MDExNjsKIHQuRWRvdGJlbG93ID0gMHgxZWI4OwogdC5FZmN5cmlsbGljID0gMHgwNDI0OwogdC5FZ3JhdmUgPSAweDAwYzg7CiB0LkVncmF2ZXNtYWxsID0gMHhmN2U4OwogdC5FaGFybWVuaWFuID0gMHgwNTM3OwogdC5FaG9va2Fib3ZlID0gMHgxZWJhOwogdC5FaWdodHJvbWFuID0gMHgyMTY3OwogdC5FaW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNjsKIHQuRWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjQ7CiB0LkVsY3lyaWxsaWMgPSAweDA0MWI7CiB0LkVsZXZlbnJvbWFuID0gMHgyMTZhOwogdC5FbWFjcm9uID0gMHgwMTEyOwogdC5FbWFjcm9uYWN1dGUgPSAweDFlMTY7CiB0LkVtYWNyb25ncmF2ZSA9IDB4MWUxNDsKIHQuRW1jeXJpbGxpYyA9IDB4MDQxYzsKIHQuRW1vbm9zcGFjZSA9IDB4ZmYyNTsKIHQuRW5jeXJpbGxpYyA9IDB4MDQxZDsKIHQuRW5kZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhMjsKIHQuRW5nID0gMHgwMTRhOwogdC5FbmdoZWN5cmlsbGljID0gMHgwNGE0OwogdC5Fbmhvb2tjeXJpbGxpYyA9IDB4MDRjNzsKIHQuRW9nb25layA9IDB4MDExODsKIHQuRW9wZW4gPSAweDAxOTA7CiB0LkVwc2lsb24gPSAweDAzOTU7CiB0LkVwc2lsb250b25vcyA9IDB4MDM4ODsKIHQuRXJjeXJpbGxpYyA9IDB4MDQyMDsKIHQuRXJldmVyc2VkID0gMHgwMThlOwogdC5FcmV2ZXJzZWRjeXJpbGxpYyA9IDB4MDQyZDsKIHQuRXNjeXJpbGxpYyA9IDB4MDQyMTsKIHQuRXNkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhYTsKIHQuRXNoID0gMHgwMWE5OwogdC5Fc21hbGwgPSAweGY3NjU7CiB0LkV0YSA9IDB4MDM5NzsKIHQuRXRhcm1lbmlhbiA9IDB4MDUzODsKIHQuRXRhdG9ub3MgPSAweDAzODk7CiB0LkV0aCA9IDB4MDBkMDsKIHQuRXRoc21hbGwgPSAweGY3ZjA7CiB0LkV0aWxkZSA9IDB4MWViYzsKIHQuRXRpbGRlYmVsb3cgPSAweDFlMWE7CiB0LkV1cm8gPSAweDIwYWM7CiB0LkV6aCA9IDB4MDFiNzsKIHQuRXpoY2Fyb24gPSAweDAxZWU7CiB0LkV6aHJldmVyc2VkID0gMHgwMWI4OwogdC5GID0gMHgwMDQ2OwogdC5GY2lyY2xlID0gMHgyNGJiOwogdC5GZG90YWNjZW50ID0gMHgxZTFlOwogdC5GZWhhcm1lbmlhbiA9IDB4MDU1NjsKIHQuRmVpY29wdGljID0gMHgwM2U0OwogdC5GaG9vayA9IDB4MDE5MTsKIHQuRml0YWN5cmlsbGljID0gMHgwNDcyOwogdC5GaXZlcm9tYW4gPSAweDIxNjQ7CiB0LkZtb25vc3BhY2UgPSAweGZmMjY7CiB0LkZvdXJyb21hbiA9IDB4MjE2MzsKIHQuRnNtYWxsID0gMHhmNzY2OwogdC5HID0gMHgwMDQ3OwogdC5HQnNxdWFyZSA9IDB4MzM4NzsKIHQuR2FjdXRlID0gMHgwMWY0OwogdC5HYW1tYSA9IDB4MDM5MzsKIHQuR2FtbWFhZnJpY2FuID0gMHgwMTk0OwogdC5HYW5naWFjb3B0aWMgPSAweDAzZWE7CiB0LkdicmV2ZSA9IDB4MDExZTsKIHQuR2Nhcm9uID0gMHgwMWU2OwogdC5HY2VkaWxsYSA9IDB4MDEyMjsKIHQuR2NpcmNsZSA9IDB4MjRiYzsKIHQuR2NpcmN1bWZsZXggPSAweDAxMWM7CiB0Lkdjb21tYWFjY2VudCA9IDB4MDEyMjsKIHQuR2RvdCA9IDB4MDEyMDsKIHQuR2RvdGFjY2VudCA9IDB4MDEyMDsKIHQuR2VjeXJpbGxpYyA9IDB4MDQxMzsKIHQuR2hhZGFybWVuaWFuID0gMHgwNTQyOwogdC5HaGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0OTQ7CiB0LkdoZXN0cm9rZWN5cmlsbGljID0gMHgwNDkyOwogdC5HaGV1cHR1cm5jeXJpbGxpYyA9IDB4MDQ5MDsKIHQuR2hvb2sgPSAweDAxOTM7CiB0LkdpbWFybWVuaWFuID0gMHgwNTMzOwogdC5HamVjeXJpbGxpYyA9IDB4MDQwMzsKIHQuR21hY3JvbiA9IDB4MWUyMDsKIHQuR21vbm9zcGFjZSA9IDB4ZmYyNzsKIHQuR3JhdmUgPSAweGY2Y2U7CiB0LkdyYXZlc21hbGwgPSAweGY3NjA7CiB0LkdzbWFsbCA9IDB4Zjc2NzsKIHQuR3NtYWxsaG9vayA9IDB4MDI5YjsKIHQuR3N0cm9rZSA9IDB4MDFlNDsKIHQuSCA9IDB4MDA0ODsKIHQuSDE4NTMzID0gMHgyNWNmOwogdC5IMTg1NDMgPSAweDI1YWE7CiB0LkgxODU1MSA9IDB4MjVhYjsKIHQuSDIyMDczID0gMHgyNWExOwogdC5IUHNxdWFyZSA9IDB4MzNjYjsKIHQuSGFhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRhODsKIHQuSGFkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRiMjsKIHQuSGFyZHNpZ25jeXJpbGxpYyA9IDB4MDQyYTsKIHQuSGJhciA9IDB4MDEyNjsKIHQuSGJyZXZlYmVsb3cgPSAweDFlMmE7CiB0LkhjZWRpbGxhID0gMHgxZTI4OwogdC5IY2lyY2xlID0gMHgyNGJkOwogdC5IY2lyY3VtZmxleCA9IDB4MDEyNDsKIHQuSGRpZXJlc2lzID0gMHgxZTI2OwogdC5IZG90YWNjZW50ID0gMHgxZTIyOwogdC5IZG90YmVsb3cgPSAweDFlMjQ7CiB0Lkhtb25vc3BhY2UgPSAweGZmMjg7CiB0LkhvYXJtZW5pYW4gPSAweDA1NDA7CiB0Lkhvcmljb3B0aWMgPSAweDAzZTg7CiB0LkhzbWFsbCA9IDB4Zjc2ODsKIHQuSHVuZ2FydW1sYXV0ID0gMHhmNmNmOwogdC5IdW5nYXJ1bWxhdXRzbWFsbCA9IDB4ZjZmODsKIHQuSHpzcXVhcmUgPSAweDMzOTA7CiB0LkkgPSAweDAwNDk7CiB0LklBY3lyaWxsaWMgPSAweDA0MmY7CiB0LklKID0gMHgwMTMyOwogdC5JVWN5cmlsbGljID0gMHgwNDJlOwogdC5JYWN1dGUgPSAweDAwY2Q7CiB0LklhY3V0ZXNtYWxsID0gMHhmN2VkOwogdC5JYnJldmUgPSAweDAxMmM7CiB0LkljYXJvbiA9IDB4MDFjZjsKIHQuSWNpcmNsZSA9IDB4MjRiZTsKIHQuSWNpcmN1bWZsZXggPSAweDAwY2U7CiB0LkljaXJjdW1mbGV4c21hbGwgPSAweGY3ZWU7CiB0LkljeXJpbGxpYyA9IDB4MDQwNjsKIHQuSWRibGdyYXZlID0gMHgwMjA4OwogdC5JZGllcmVzaXMgPSAweDAwY2Y7CiB0LklkaWVyZXNpc2FjdXRlID0gMHgxZTJlOwogdC5JZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNDsKIHQuSWRpZXJlc2lzc21hbGwgPSAweGY3ZWY7CiB0Lklkb3QgPSAweDAxMzA7CiB0Lklkb3RhY2NlbnQgPSAweDAxMzA7CiB0Lklkb3RiZWxvdyA9IDB4MWVjYTsKIHQuSWVicmV2ZWN5cmlsbGljID0gMHgwNGQ2OwogdC5JZWN5cmlsbGljID0gMHgwNDE1OwogdC5JZnJha3R1ciA9IDB4MjExMTsKIHQuSWdyYXZlID0gMHgwMGNjOwogdC5JZ3JhdmVzbWFsbCA9IDB4ZjdlYzsKIHQuSWhvb2thYm92ZSA9IDB4MWVjODsKIHQuSWljeXJpbGxpYyA9IDB4MDQxODsKIHQuSWludmVydGVkYnJldmUgPSAweDAyMGE7CiB0Lklpc2hvcnRjeXJpbGxpYyA9IDB4MDQxOTsKIHQuSW1hY3JvbiA9IDB4MDEyYTsKIHQuSW1hY3JvbmN5cmlsbGljID0gMHgwNGUyOwogdC5JbW9ub3NwYWNlID0gMHhmZjI5OwogdC5Jbmlhcm1lbmlhbiA9IDB4MDUzYjsKIHQuSW9jeXJpbGxpYyA9IDB4MDQwMTsKIHQuSW9nb25layA9IDB4MDEyZTsKIHQuSW90YSA9IDB4MDM5OTsKIHQuSW90YWFmcmljYW4gPSAweDAxOTY7CiB0LklvdGFkaWVyZXNpcyA9IDB4MDNhYTsKIHQuSW90YXRvbm9zID0gMHgwMzhhOwogdC5Jc21hbGwgPSAweGY3Njk7CiB0LklzdHJva2UgPSAweDAxOTc7CiB0Lkl0aWxkZSA9IDB4MDEyODsKIHQuSXRpbGRlYmVsb3cgPSAweDFlMmM7CiB0Lkl6aGl0c2FjeXJpbGxpYyA9IDB4MDQ3NDsKIHQuSXpoaXRzYWRibGdyYXZlY3lyaWxsaWMgPSAweDA0NzY7CiB0LkogPSAweDAwNGE7CiB0LkphYXJtZW5pYW4gPSAweDA1NDE7CiB0LkpjaXJjbGUgPSAweDI0YmY7CiB0LkpjaXJjdW1mbGV4ID0gMHgwMTM0OwogdC5KZWN5cmlsbGljID0gMHgwNDA4OwogdC5KaGVoYXJtZW5pYW4gPSAweDA1NGI7CiB0Lkptb25vc3BhY2UgPSAweGZmMmE7CiB0LkpzbWFsbCA9IDB4Zjc2YTsKIHQuSyA9IDB4MDA0YjsKIHQuS0JzcXVhcmUgPSAweDMzODU7CiB0LktLc3F1YXJlID0gMHgzM2NkOwogdC5LYWJhc2hraXJjeXJpbGxpYyA9IDB4MDRhMDsKIHQuS2FjdXRlID0gMHgxZTMwOwogdC5LYWN5cmlsbGljID0gMHgwNDFhOwogdC5LYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDlhOwogdC5LYWhvb2tjeXJpbGxpYyA9IDB4MDRjMzsKIHQuS2FwcGEgPSAweDAzOWE7CiB0Lkthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWU7CiB0LkthdmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDQ5YzsKIHQuS2Nhcm9uID0gMHgwMWU4OwogdC5LY2VkaWxsYSA9IDB4MDEzNjsKIHQuS2NpcmNsZSA9IDB4MjRjMDsKIHQuS2NvbW1hYWNjZW50ID0gMHgwMTM2OwogdC5LZG90YmVsb3cgPSAweDFlMzI7CiB0LktlaGFybWVuaWFuID0gMHgwNTU0OwogdC5LZW5hcm1lbmlhbiA9IDB4MDUzZjsKIHQuS2hhY3lyaWxsaWMgPSAweDA0MjU7CiB0LktoZWljb3B0aWMgPSAweDAzZTY7CiB0Lktob29rID0gMHgwMTk4OwogdC5LamVjeXJpbGxpYyA9IDB4MDQwYzsKIHQuS2xpbmViZWxvdyA9IDB4MWUzNDsKIHQuS21vbm9zcGFjZSA9IDB4ZmYyYjsKIHQuS29wcGFjeXJpbGxpYyA9IDB4MDQ4MDsKIHQuS29wcGFncmVlayA9IDB4MDNkZTsKIHQuS3NpY3lyaWxsaWMgPSAweDA0NmU7CiB0LktzbWFsbCA9IDB4Zjc2YjsKIHQuTCA9IDB4MDA0YzsKIHQuTEogPSAweDAxYzc7CiB0LkxMID0gMHhmNmJmOwogdC5MYWN1dGUgPSAweDAxMzk7CiB0LkxhbWJkYSA9IDB4MDM5YjsKIHQuTGNhcm9uID0gMHgwMTNkOwogdC5MY2VkaWxsYSA9IDB4MDEzYjsKIHQuTGNpcmNsZSA9IDB4MjRjMTsKIHQuTGNpcmN1bWZsZXhiZWxvdyA9IDB4MWUzYzsKIHQuTGNvbW1hYWNjZW50ID0gMHgwMTNiOwogdC5MZG90ID0gMHgwMTNmOwogdC5MZG90YWNjZW50ID0gMHgwMTNmOwogdC5MZG90YmVsb3cgPSAweDFlMzY7CiB0Lkxkb3RiZWxvd21hY3JvbiA9IDB4MWUzODsKIHQuTGl3bmFybWVuaWFuID0gMHgwNTNjOwogdC5MaiA9IDB4MDFjODsKIHQuTGplY3lyaWxsaWMgPSAweDA0MDk7CiB0LkxsaW5lYmVsb3cgPSAweDFlM2E7CiB0Lkxtb25vc3BhY2UgPSAweGZmMmM7CiB0LkxzbGFzaCA9IDB4MDE0MTsKIHQuTHNsYXNoc21hbGwgPSAweGY2Zjk7CiB0LkxzbWFsbCA9IDB4Zjc2YzsKIHQuTSA9IDB4MDA0ZDsKIHQuTUJzcXVhcmUgPSAweDMzODY7CiB0Lk1hY3JvbiA9IDB4ZjZkMDsKIHQuTWFjcm9uc21hbGwgPSAweGY3YWY7CiB0Lk1hY3V0ZSA9IDB4MWUzZTsKIHQuTWNpcmNsZSA9IDB4MjRjMjsKIHQuTWRvdGFjY2VudCA9IDB4MWU0MDsKIHQuTWRvdGJlbG93ID0gMHgxZTQyOwogdC5NZW5hcm1lbmlhbiA9IDB4MDU0NDsKIHQuTW1vbm9zcGFjZSA9IDB4ZmYyZDsKIHQuTXNtYWxsID0gMHhmNzZkOwogdC5NdHVybmVkID0gMHgwMTljOwogdC5NdSA9IDB4MDM5YzsKIHQuTiA9IDB4MDA0ZTsKIHQuTkogPSAweDAxY2E7CiB0Lk5hY3V0ZSA9IDB4MDE0MzsKIHQuTmNhcm9uID0gMHgwMTQ3OwogdC5OY2VkaWxsYSA9IDB4MDE0NTsKIHQuTmNpcmNsZSA9IDB4MjRjMzsKIHQuTmNpcmN1bWZsZXhiZWxvdyA9IDB4MWU0YTsKIHQuTmNvbW1hYWNjZW50ID0gMHgwMTQ1OwogdC5OZG90YWNjZW50ID0gMHgxZTQ0OwogdC5OZG90YmVsb3cgPSAweDFlNDY7CiB0Lk5ob29rbGVmdCA9IDB4MDE5ZDsKIHQuTmluZXJvbWFuID0gMHgyMTY4OwogdC5OaiA9IDB4MDFjYjsKIHQuTmplY3lyaWxsaWMgPSAweDA0MGE7CiB0Lk5saW5lYmVsb3cgPSAweDFlNDg7CiB0Lk5tb25vc3BhY2UgPSAweGZmMmU7CiB0Lk5vd2FybWVuaWFuID0gMHgwNTQ2OwogdC5Oc21hbGwgPSAweGY3NmU7CiB0Lk50aWxkZSA9IDB4MDBkMTsKIHQuTnRpbGRlc21hbGwgPSAweGY3ZjE7CiB0Lk51ID0gMHgwMzlkOwogdC5PID0gMHgwMDRmOwogdC5PRSA9IDB4MDE1MjsKIHQuT0VzbWFsbCA9IDB4ZjZmYTsKIHQuT2FjdXRlID0gMHgwMGQzOwogdC5PYWN1dGVzbWFsbCA9IDB4ZjdmMzsKIHQuT2JhcnJlZGN5cmlsbGljID0gMHgwNGU4OwogdC5PYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYTsKIHQuT2JyZXZlID0gMHgwMTRlOwogdC5PY2Fyb24gPSAweDAxZDE7CiB0Lk9jZW50ZXJlZHRpbGRlID0gMHgwMTlmOwogdC5PY2lyY2xlID0gMHgyNGM0OwogdC5PY2lyY3VtZmxleCA9IDB4MDBkNDsKIHQuT2NpcmN1bWZsZXhhY3V0ZSA9IDB4MWVkMDsKIHQuT2NpcmN1bWZsZXhkb3RiZWxvdyA9IDB4MWVkODsKIHQuT2NpcmN1bWZsZXhncmF2ZSA9IDB4MWVkMjsKIHQuT2NpcmN1bWZsZXhob29rYWJvdmUgPSAweDFlZDQ7CiB0Lk9jaXJjdW1mbGV4c21hbGwgPSAweGY3ZjQ7CiB0Lk9jaXJjdW1mbGV4dGlsZGUgPSAweDFlZDY7CiB0Lk9jeXJpbGxpYyA9IDB4MDQxZTsKIHQuT2RibGFjdXRlID0gMHgwMTUwOwogdC5PZGJsZ3JhdmUgPSAweDAyMGM7CiB0Lk9kaWVyZXNpcyA9IDB4MDBkNjsKIHQuT2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTY7CiB0Lk9kaWVyZXNpc3NtYWxsID0gMHhmN2Y2OwogdC5PZG90YmVsb3cgPSAweDFlY2M7CiB0Lk9nb25la3NtYWxsID0gMHhmNmZiOwogdC5PZ3JhdmUgPSAweDAwZDI7CiB0Lk9ncmF2ZXNtYWxsID0gMHhmN2YyOwogdC5PaGFybWVuaWFuID0gMHgwNTU1OwogdC5PaG0gPSAweDIxMjY7CiB0Lk9ob29rYWJvdmUgPSAweDFlY2U7CiB0Lk9ob3JuID0gMHgwMWEwOwogdC5PaG9ybmFjdXRlID0gMHgxZWRhOwogdC5PaG9ybmRvdGJlbG93ID0gMHgxZWUyOwogdC5PaG9ybmdyYXZlID0gMHgxZWRjOwogdC5PaG9ybmhvb2thYm92ZSA9IDB4MWVkZTsKIHQuT2hvcm50aWxkZSA9IDB4MWVlMDsKIHQuT2h1bmdhcnVtbGF1dCA9IDB4MDE1MDsKIHQuT2kgPSAweDAxYTI7CiB0Lk9pbnZlcnRlZGJyZXZlID0gMHgwMjBlOwogdC5PbWFjcm9uID0gMHgwMTRjOwogdC5PbWFjcm9uYWN1dGUgPSAweDFlNTI7CiB0Lk9tYWNyb25ncmF2ZSA9IDB4MWU1MDsKIHQuT21lZ2EgPSAweDIxMjY7CiB0Lk9tZWdhY3lyaWxsaWMgPSAweDA0NjA7CiB0Lk9tZWdhZ3JlZWsgPSAweDAzYTk7CiB0Lk9tZWdhcm91bmRjeXJpbGxpYyA9IDB4MDQ3YTsKIHQuT21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdjOwogdC5PbWVnYXRvbm9zID0gMHgwMzhmOwogdC5PbWljcm9uID0gMHgwMzlmOwogdC5PbWljcm9udG9ub3MgPSAweDAzOGM7CiB0Lk9tb25vc3BhY2UgPSAweGZmMmY7CiB0Lk9uZXJvbWFuID0gMHgyMTYwOwogdC5Pb2dvbmVrID0gMHgwMWVhOwogdC5Pb2dvbmVrbWFjcm9uID0gMHgwMWVjOwogdC5Pb3BlbiA9IDB4MDE4NjsKIHQuT3NsYXNoID0gMHgwMGQ4OwogdC5Pc2xhc2hhY3V0ZSA9IDB4MDFmZTsKIHQuT3NsYXNoc21hbGwgPSAweGY3Zjg7CiB0Lk9zbWFsbCA9IDB4Zjc2ZjsKIHQuT3N0cm9rZWFjdXRlID0gMHgwMWZlOwogdC5PdGN5cmlsbGljID0gMHgwNDdlOwogdC5PdGlsZGUgPSAweDAwZDU7CiB0Lk90aWxkZWFjdXRlID0gMHgxZTRjOwogdC5PdGlsZGVkaWVyZXNpcyA9IDB4MWU0ZTsKIHQuT3RpbGRlc21hbGwgPSAweGY3ZjU7CiB0LlAgPSAweDAwNTA7CiB0LlBhY3V0ZSA9IDB4MWU1NDsKIHQuUGNpcmNsZSA9IDB4MjRjNTsKIHQuUGRvdGFjY2VudCA9IDB4MWU1NjsKIHQuUGVjeXJpbGxpYyA9IDB4MDQxZjsKIHQuUGVoYXJtZW5pYW4gPSAweDA1NGE7CiB0LlBlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNGE2OwogdC5QaGkgPSAweDAzYTY7CiB0LlBob29rID0gMHgwMWE0OwogdC5QaSA9IDB4MDNhMDsKIHQuUGl3cmFybWVuaWFuID0gMHgwNTUzOwogdC5QbW9ub3NwYWNlID0gMHhmZjMwOwogdC5Qc2kgPSAweDAzYTg7CiB0LlBzaWN5cmlsbGljID0gMHgwNDcwOwogdC5Qc21hbGwgPSAweGY3NzA7CiB0LlEgPSAweDAwNTE7CiB0LlFjaXJjbGUgPSAweDI0YzY7CiB0LlFtb25vc3BhY2UgPSAweGZmMzE7CiB0LlFzbWFsbCA9IDB4Zjc3MTsKIHQuUiA9IDB4MDA1MjsKIHQuUmFhcm1lbmlhbiA9IDB4MDU0YzsKIHQuUmFjdXRlID0gMHgwMTU0OwogdC5SY2Fyb24gPSAweDAxNTg7CiB0LlJjZWRpbGxhID0gMHgwMTU2OwogdC5SY2lyY2xlID0gMHgyNGM3OwogdC5SY29tbWFhY2NlbnQgPSAweDAxNTY7CiB0LlJkYmxncmF2ZSA9IDB4MDIxMDsKIHQuUmRvdGFjY2VudCA9IDB4MWU1ODsKIHQuUmRvdGJlbG93ID0gMHgxZTVhOwogdC5SZG90YmVsb3dtYWNyb24gPSAweDFlNWM7CiB0LlJlaGFybWVuaWFuID0gMHgwNTUwOwogdC5SZnJha3R1ciA9IDB4MjExYzsKIHQuUmhvID0gMHgwM2ExOwogdC5SaW5nc21hbGwgPSAweGY2ZmM7CiB0LlJpbnZlcnRlZGJyZXZlID0gMHgwMjEyOwogdC5SbGluZWJlbG93ID0gMHgxZTVlOwogdC5SbW9ub3NwYWNlID0gMHhmZjMyOwogdC5Sc21hbGwgPSAweGY3NzI7CiB0LlJzbWFsbGludmVydGVkID0gMHgwMjgxOwogdC5Sc21hbGxpbnZlcnRlZHN1cGVyaW9yID0gMHgwMmI2OwogdC5TID0gMHgwMDUzOwogdC5TRjAxMDAwMCA9IDB4MjUwYzsKIHQuU0YwMjAwMDAgPSAweDI1MTQ7CiB0LlNGMDMwMDAwID0gMHgyNTEwOwogdC5TRjA0MDAwMCA9IDB4MjUxODsKIHQuU0YwNTAwMDAgPSAweDI1M2M7CiB0LlNGMDYwMDAwID0gMHgyNTJjOwogdC5TRjA3MDAwMCA9IDB4MjUzNDsKIHQuU0YwODAwMDAgPSAweDI1MWM7CiB0LlNGMDkwMDAwID0gMHgyNTI0OwogdC5TRjEwMDAwMCA9IDB4MjUwMDsKIHQuU0YxMTAwMDAgPSAweDI1MDI7CiB0LlNGMTkwMDAwID0gMHgyNTYxOwogdC5TRjIwMDAwMCA9IDB4MjU2MjsKIHQuU0YyMTAwMDAgPSAweDI1NTY7CiB0LlNGMjIwMDAwID0gMHgyNTU1OwogdC5TRjIzMDAwMCA9IDB4MjU2MzsKIHQuU0YyNDAwMDAgPSAweDI1NTE7CiB0LlNGMjUwMDAwID0gMHgyNTU3OwogdC5TRjI2MDAwMCA9IDB4MjU1ZDsKIHQuU0YyNzAwMDAgPSAweDI1NWM7CiB0LlNGMjgwMDAwID0gMHgyNTViOwogdC5TRjM2MDAwMCA9IDB4MjU1ZTsKIHQuU0YzNzAwMDAgPSAweDI1NWY7CiB0LlNGMzgwMDAwID0gMHgyNTVhOwogdC5TRjM5MDAwMCA9IDB4MjU1NDsKIHQuU0Y0MDAwMDAgPSAweDI1Njk7CiB0LlNGNDEwMDAwID0gMHgyNTY2OwogdC5TRjQyMDAwMCA9IDB4MjU2MDsKIHQuU0Y0MzAwMDAgPSAweDI1NTA7CiB0LlNGNDQwMDAwID0gMHgyNTZjOwogdC5TRjQ1MDAwMCA9IDB4MjU2NzsKIHQuU0Y0NjAwMDAgPSAweDI1Njg7CiB0LlNGNDcwMDAwID0gMHgyNTY0OwogdC5TRjQ4MDAwMCA9IDB4MjU2NTsKIHQuU0Y0OTAwMDAgPSAweDI1NTk7CiB0LlNGNTAwMDAwID0gMHgyNTU4OwogdC5TRjUxMDAwMCA9IDB4MjU1MjsKIHQuU0Y1MjAwMDAgPSAweDI1NTM7CiB0LlNGNTMwMDAwID0gMHgyNTZiOwogdC5TRjU0MDAwMCA9IDB4MjU2YTsKIHQuU2FjdXRlID0gMHgwMTVhOwogdC5TYWN1dGVkb3RhY2NlbnQgPSAweDFlNjQ7CiB0LlNhbXBpZ3JlZWsgPSAweDAzZTA7CiB0LlNjYXJvbiA9IDB4MDE2MDsKIHQuU2Nhcm9uZG90YWNjZW50ID0gMHgxZTY2OwogdC5TY2Fyb25zbWFsbCA9IDB4ZjZmZDsKIHQuU2NlZGlsbGEgPSAweDAxNWU7CiB0LlNjaHdhID0gMHgwMThmOwogdC5TY2h3YWN5cmlsbGljID0gMHgwNGQ4OwogdC5TY2h3YWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGE7CiB0LlNjaXJjbGUgPSAweDI0Yzg7CiB0LlNjaXJjdW1mbGV4ID0gMHgwMTVjOwogdC5TY29tbWFhY2NlbnQgPSAweDAyMTg7CiB0LlNkb3RhY2NlbnQgPSAweDFlNjA7CiB0LlNkb3RiZWxvdyA9IDB4MWU2MjsKIHQuU2RvdGJlbG93ZG90YWNjZW50ID0gMHgxZTY4OwogdC5TZWhhcm1lbmlhbiA9IDB4MDU0ZDsKIHQuU2V2ZW5yb21hbiA9IDB4MjE2NjsKIHQuU2hhYXJtZW5pYW4gPSAweDA1NDc7CiB0LlNoYWN5cmlsbGljID0gMHgwNDI4OwogdC5TaGNoYWN5cmlsbGljID0gMHgwNDI5OwogdC5TaGVpY29wdGljID0gMHgwM2UyOwogdC5TaGhhY3lyaWxsaWMgPSAweDA0YmE7CiB0LlNoaW1hY29wdGljID0gMHgwM2VjOwogdC5TaWdtYSA9IDB4MDNhMzsKIHQuU2l4cm9tYW4gPSAweDIxNjU7CiB0LlNtb25vc3BhY2UgPSAweGZmMzM7CiB0LlNvZnRzaWduY3lyaWxsaWMgPSAweDA0MmM7CiB0LlNzbWFsbCA9IDB4Zjc3MzsKIHQuU3RpZ21hZ3JlZWsgPSAweDAzZGE7CiB0LlQgPSAweDAwNTQ7CiB0LlRhdSA9IDB4MDNhNDsKIHQuVGJhciA9IDB4MDE2NjsKIHQuVGNhcm9uID0gMHgwMTY0OwogdC5UY2VkaWxsYSA9IDB4MDE2MjsKIHQuVGNpcmNsZSA9IDB4MjRjOTsKIHQuVGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MDsKIHQuVGNvbW1hYWNjZW50ID0gMHgwMTYyOwogdC5UZG90YWNjZW50ID0gMHgxZTZhOwogdC5UZG90YmVsb3cgPSAweDFlNmM7CiB0LlRlY3lyaWxsaWMgPSAweDA0MjI7CiB0LlRlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YWM7CiB0LlRlbnJvbWFuID0gMHgyMTY5OwogdC5UZXRzZWN5cmlsbGljID0gMHgwNGI0OwogdC5UaGV0YSA9IDB4MDM5ODsKIHQuVGhvb2sgPSAweDAxYWM7CiB0LlRob3JuID0gMHgwMGRlOwogdC5UaG9ybnNtYWxsID0gMHhmN2ZlOwogdC5UaHJlZXJvbWFuID0gMHgyMTYyOwogdC5UaWxkZXNtYWxsID0gMHhmNmZlOwogdC5UaXduYXJtZW5pYW4gPSAweDA1NGY7CiB0LlRsaW5lYmVsb3cgPSAweDFlNmU7CiB0LlRtb25vc3BhY2UgPSAweGZmMzQ7CiB0LlRvYXJtZW5pYW4gPSAweDA1Mzk7CiB0LlRvbmVmaXZlID0gMHgwMWJjOwogdC5Ub25lc2l4ID0gMHgwMTg0OwogdC5Ub25ldHdvID0gMHgwMWE3OwogdC5UcmV0cm9mbGV4aG9vayA9IDB4MDFhZTsKIHQuVHNlY3lyaWxsaWMgPSAweDA0MjY7CiB0LlRzaGVjeXJpbGxpYyA9IDB4MDQwYjsKIHQuVHNtYWxsID0gMHhmNzc0OwogdC5Ud2VsdmVyb21hbiA9IDB4MjE2YjsKIHQuVHdvcm9tYW4gPSAweDIxNjE7CiB0LlUgPSAweDAwNTU7CiB0LlVhY3V0ZSA9IDB4MDBkYTsKIHQuVWFjdXRlc21hbGwgPSAweGY3ZmE7CiB0LlVicmV2ZSA9IDB4MDE2YzsKIHQuVWNhcm9uID0gMHgwMWQzOwogdC5VY2lyY2xlID0gMHgyNGNhOwogdC5VY2lyY3VtZmxleCA9IDB4MDBkYjsKIHQuVWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NjsKIHQuVWNpcmN1bWZsZXhzbWFsbCA9IDB4ZjdmYjsKIHQuVWN5cmlsbGljID0gMHgwNDIzOwogdC5VZGJsYWN1dGUgPSAweDAxNzA7CiB0LlVkYmxncmF2ZSA9IDB4MDIxNDsKIHQuVWRpZXJlc2lzID0gMHgwMGRjOwogdC5VZGllcmVzaXNhY3V0ZSA9IDB4MDFkNzsKIHQuVWRpZXJlc2lzYmVsb3cgPSAweDFlNzI7CiB0LlVkaWVyZXNpc2Nhcm9uID0gMHgwMWQ5OwogdC5VZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRmMDsKIHQuVWRpZXJlc2lzZ3JhdmUgPSAweDAxZGI7CiB0LlVkaWVyZXNpc21hY3JvbiA9IDB4MDFkNTsKIHQuVWRpZXJlc2lzc21hbGwgPSAweGY3ZmM7CiB0LlVkb3RiZWxvdyA9IDB4MWVlNDsKIHQuVWdyYXZlID0gMHgwMGQ5OwogdC5VZ3JhdmVzbWFsbCA9IDB4ZjdmOTsKIHQuVWhvb2thYm92ZSA9IDB4MWVlNjsKIHQuVWhvcm4gPSAweDAxYWY7CiB0LlVob3JuYWN1dGUgPSAweDFlZTg7CiB0LlVob3JuZG90YmVsb3cgPSAweDFlZjA7CiB0LlVob3JuZ3JhdmUgPSAweDFlZWE7CiB0LlVob3JuaG9va2Fib3ZlID0gMHgxZWVjOwogdC5VaG9ybnRpbGRlID0gMHgxZWVlOwogdC5VaHVuZ2FydW1sYXV0ID0gMHgwMTcwOwogdC5VaHVuZ2FydW1sYXV0Y3lyaWxsaWMgPSAweDA0ZjI7CiB0LlVpbnZlcnRlZGJyZXZlID0gMHgwMjE2OwogdC5Va2N5cmlsbGljID0gMHgwNDc4OwogdC5VbWFjcm9uID0gMHgwMTZhOwogdC5VbWFjcm9uY3lyaWxsaWMgPSAweDA0ZWU7CiB0LlVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YTsKIHQuVW1vbm9zcGFjZSA9IDB4ZmYzNTsKIHQuVW9nb25layA9IDB4MDE3MjsKIHQuVXBzaWxvbiA9IDB4MDNhNTsKIHQuVXBzaWxvbjEgPSAweDAzZDI7CiB0LlVwc2lsb25hY3V0ZWhvb2tzeW1ib2xncmVlayA9IDB4MDNkMzsKIHQuVXBzaWxvbmFmcmljYW4gPSAweDAxYjE7CiB0LlVwc2lsb25kaWVyZXNpcyA9IDB4MDNhYjsKIHQuVXBzaWxvbmRpZXJlc2lzaG9va3N5bWJvbGdyZWVrID0gMHgwM2Q0OwogdC5VcHNpbG9uaG9va3N5bWJvbCA9IDB4MDNkMjsKIHQuVXBzaWxvbnRvbm9zID0gMHgwMzhlOwogdC5VcmluZyA9IDB4MDE2ZTsKIHQuVXNob3J0Y3lyaWxsaWMgPSAweDA0MGU7CiB0LlVzbWFsbCA9IDB4Zjc3NTsKIHQuVXN0cmFpZ2h0Y3lyaWxsaWMgPSAweDA0YWU7CiB0LlVzdHJhaWdodHN0cm9rZWN5cmlsbGljID0gMHgwNGIwOwogdC5VdGlsZGUgPSAweDAxNjg7CiB0LlV0aWxkZWFjdXRlID0gMHgxZTc4OwogdC5VdGlsZGViZWxvdyA9IDB4MWU3NDsKIHQuViA9IDB4MDA1NjsKIHQuVmNpcmNsZSA9IDB4MjRjYjsKIHQuVmRvdGJlbG93ID0gMHgxZTdlOwogdC5WZWN5cmlsbGljID0gMHgwNDEyOwogdC5WZXdhcm1lbmlhbiA9IDB4MDU0ZTsKIHQuVmhvb2sgPSAweDAxYjI7CiB0LlZtb25vc3BhY2UgPSAweGZmMzY7CiB0LlZvYXJtZW5pYW4gPSAweDA1NDg7CiB0LlZzbWFsbCA9IDB4Zjc3NjsKIHQuVnRpbGRlID0gMHgxZTdjOwogdC5XID0gMHgwMDU3OwogdC5XYWN1dGUgPSAweDFlODI7CiB0LldjaXJjbGUgPSAweDI0Y2M7CiB0LldjaXJjdW1mbGV4ID0gMHgwMTc0OwogdC5XZGllcmVzaXMgPSAweDFlODQ7CiB0Lldkb3RhY2NlbnQgPSAweDFlODY7CiB0Lldkb3RiZWxvdyA9IDB4MWU4ODsKIHQuV2dyYXZlID0gMHgxZTgwOwogdC5XbW9ub3NwYWNlID0gMHhmZjM3OwogdC5Xc21hbGwgPSAweGY3Nzc7CiB0LlggPSAweDAwNTg7CiB0LlhjaXJjbGUgPSAweDI0Y2Q7CiB0LlhkaWVyZXNpcyA9IDB4MWU4YzsKIHQuWGRvdGFjY2VudCA9IDB4MWU4YTsKIHQuWGVoYXJtZW5pYW4gPSAweDA1M2Q7CiB0LlhpID0gMHgwMzllOwogdC5YbW9ub3NwYWNlID0gMHhmZjM4OwogdC5Yc21hbGwgPSAweGY3Nzg7CiB0LlkgPSAweDAwNTk7CiB0LllhY3V0ZSA9IDB4MDBkZDsKIHQuWWFjdXRlc21hbGwgPSAweGY3ZmQ7CiB0LllhdGN5cmlsbGljID0gMHgwNDYyOwogdC5ZY2lyY2xlID0gMHgyNGNlOwogdC5ZY2lyY3VtZmxleCA9IDB4MDE3NjsKIHQuWWRpZXJlc2lzID0gMHgwMTc4OwogdC5ZZGllcmVzaXNzbWFsbCA9IDB4ZjdmZjsKIHQuWWRvdGFjY2VudCA9IDB4MWU4ZTsKIHQuWWRvdGJlbG93ID0gMHgxZWY0OwogdC5ZZXJpY3lyaWxsaWMgPSAweDA0MmI7CiB0LlllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY4OwogdC5ZZ3JhdmUgPSAweDFlZjI7CiB0Lllob29rID0gMHgwMWIzOwogdC5ZaG9va2Fib3ZlID0gMHgxZWY2OwogdC5ZaWFybWVuaWFuID0gMHgwNTQ1OwogdC5ZaWN5cmlsbGljID0gMHgwNDA3OwogdC5ZaXduYXJtZW5pYW4gPSAweDA1NTI7CiB0Llltb25vc3BhY2UgPSAweGZmMzk7CiB0LllzbWFsbCA9IDB4Zjc3OTsKIHQuWXRpbGRlID0gMHgxZWY4OwogdC5ZdXNiaWdjeXJpbGxpYyA9IDB4MDQ2YTsKIHQuWXVzYmlnaW90aWZpZWRjeXJpbGxpYyA9IDB4MDQ2YzsKIHQuWXVzbGl0dGxlY3lyaWxsaWMgPSAweDA0NjY7CiB0Lll1c2xpdHRsZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0Njg7CiB0LlogPSAweDAwNWE7CiB0LlphYXJtZW5pYW4gPSAweDA1MzY7CiB0LlphY3V0ZSA9IDB4MDE3OTsKIHQuWmNhcm9uID0gMHgwMTdkOwogdC5aY2Fyb25zbWFsbCA9IDB4ZjZmZjsKIHQuWmNpcmNsZSA9IDB4MjRjZjsKIHQuWmNpcmN1bWZsZXggPSAweDFlOTA7CiB0Llpkb3QgPSAweDAxN2I7CiB0Llpkb3RhY2NlbnQgPSAweDAxN2I7CiB0Llpkb3RiZWxvdyA9IDB4MWU5MjsKIHQuWmVjeXJpbGxpYyA9IDB4MDQxNzsKIHQuWmVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5ODsKIHQuWmVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRlOwogdC5aZXRhID0gMHgwMzk2OwogdC5aaGVhcm1lbmlhbiA9IDB4MDUzYTsKIHQuWmhlYnJldmVjeXJpbGxpYyA9IDB4MDRjMTsKIHQuWmhlY3lyaWxsaWMgPSAweDA0MTY7CiB0LlpoZWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDk2OwogdC5aaGVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRjOwogdC5abGluZWJlbG93ID0gMHgxZTk0OwogdC5abW9ub3NwYWNlID0gMHhmZjNhOwogdC5ac21hbGwgPSAweGY3N2E7CiB0LlpzdHJva2UgPSAweDAxYjU7CiB0LmEgPSAweDAwNjE7CiB0LmFhYmVuZ2FsaSA9IDB4MDk4NjsKIHQuYWFjdXRlID0gMHgwMGUxOwogdC5hYWRldmEgPSAweDA5MDY7CiB0LmFhZ3VqYXJhdGkgPSAweDBhODY7CiB0LmFhZ3VybXVraGkgPSAweDBhMDY7CiB0LmFhbWF0cmFndXJtdWtoaSA9IDB4MGEzZTsKIHQuYWFydXNxdWFyZSA9IDB4MzMwMzsKIHQuYWF2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJlOwogdC5hYXZvd2Vsc2lnbmRldmEgPSAweDA5M2U7CiB0LmFhdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYmU7CiB0LmFiYnJldmlhdGlvbm1hcmthcm1lbmlhbiA9IDB4MDU1ZjsKIHQuYWJicmV2aWF0aW9uc2lnbmRldmEgPSAweDA5NzA7CiB0LmFiZW5nYWxpID0gMHgwOTg1OwogdC5hYm9wb21vZm8gPSAweDMxMWE7CiB0LmFicmV2ZSA9IDB4MDEwMzsKIHQuYWJyZXZlYWN1dGUgPSAweDFlYWY7CiB0LmFicmV2ZWN5cmlsbGljID0gMHgwNGQxOwogdC5hYnJldmVkb3RiZWxvdyA9IDB4MWViNzsKIHQuYWJyZXZlZ3JhdmUgPSAweDFlYjE7CiB0LmFicmV2ZWhvb2thYm92ZSA9IDB4MWViMzsKIHQuYWJyZXZldGlsZGUgPSAweDFlYjU7CiB0LmFjYXJvbiA9IDB4MDFjZTsKIHQuYWNpcmNsZSA9IDB4MjRkMDsKIHQuYWNpcmN1bWZsZXggPSAweDAwZTI7CiB0LmFjaXJjdW1mbGV4YWN1dGUgPSAweDFlYTU7CiB0LmFjaXJjdW1mbGV4ZG90YmVsb3cgPSAweDFlYWQ7CiB0LmFjaXJjdW1mbGV4Z3JhdmUgPSAweDFlYTc7CiB0LmFjaXJjdW1mbGV4aG9va2Fib3ZlID0gMHgxZWE5OwogdC5hY2lyY3VtZmxleHRpbGRlID0gMHgxZWFiOwogdC5hY3V0ZSA9IDB4MDBiNDsKIHQuYWN1dGViZWxvd2NtYiA9IDB4MDMxNzsKIHQuYWN1dGVjbWIgPSAweDAzMDE7CiB0LmFjdXRlY29tYiA9IDB4MDMwMTsKIHQuYWN1dGVkZXZhID0gMHgwOTU0OwogdC5hY3V0ZWxvd21vZCA9IDB4MDJjZjsKIHQuYWN1dGV0b25lY21iID0gMHgwMzQxOwogdC5hY3lyaWxsaWMgPSAweDA0MzA7CiB0LmFkYmxncmF2ZSA9IDB4MDIwMTsKIHQuYWRkYWtndXJtdWtoaSA9IDB4MGE3MTsKIHQuYWRldmEgPSAweDA5MDU7CiB0LmFkaWVyZXNpcyA9IDB4MDBlNDsKIHQuYWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZDM7CiB0LmFkaWVyZXNpc21hY3JvbiA9IDB4MDFkZjsKIHQuYWRvdGJlbG93ID0gMHgxZWExOwogdC5hZG90bWFjcm9uID0gMHgwMWUxOwogdC5hZSA9IDB4MDBlNjsKIHQuYWVhY3V0ZSA9IDB4MDFmZDsKIHQuYWVrb3JlYW4gPSAweDMxNTA7CiB0LmFlbWFjcm9uID0gMHgwMWUzOwogdC5hZmlpMDAyMDggPSAweDIwMTU7CiB0LmFmaWkwODk0MSA9IDB4MjBhNDsKIHQuYWZpaTEwMDE3ID0gMHgwNDEwOwogdC5hZmlpMTAwMTggPSAweDA0MTE7CiB0LmFmaWkxMDAxOSA9IDB4MDQxMjsKIHQuYWZpaTEwMDIwID0gMHgwNDEzOwogdC5hZmlpMTAwMjEgPSAweDA0MTQ7CiB0LmFmaWkxMDAyMiA9IDB4MDQxNTsKIHQuYWZpaTEwMDIzID0gMHgwNDAxOwogdC5hZmlpMTAwMjQgPSAweDA0MTY7CiB0LmFmaWkxMDAyNSA9IDB4MDQxNzsKIHQuYWZpaTEwMDI2ID0gMHgwNDE4OwogdC5hZmlpMTAwMjcgPSAweDA0MTk7CiB0LmFmaWkxMDAyOCA9IDB4MDQxYTsKIHQuYWZpaTEwMDI5ID0gMHgwNDFiOwogdC5hZmlpMTAwMzAgPSAweDA0MWM7CiB0LmFmaWkxMDAzMSA9IDB4MDQxZDsKIHQuYWZpaTEwMDMyID0gMHgwNDFlOwogdC5hZmlpMTAwMzMgPSAweDA0MWY7CiB0LmFmaWkxMDAzNCA9IDB4MDQyMDsKIHQuYWZpaTEwMDM1ID0gMHgwNDIxOwogdC5hZmlpMTAwMzYgPSAweDA0MjI7CiB0LmFmaWkxMDAzNyA9IDB4MDQyMzsKIHQuYWZpaTEwMDM4ID0gMHgwNDI0OwogdC5hZmlpMTAwMzkgPSAweDA0MjU7CiB0LmFmaWkxMDA0MCA9IDB4MDQyNjsKIHQuYWZpaTEwMDQxID0gMHgwNDI3OwogdC5hZmlpMTAwNDIgPSAweDA0Mjg7CiB0LmFmaWkxMDA0MyA9IDB4MDQyOTsKIHQuYWZpaTEwMDQ0ID0gMHgwNDJhOwogdC5hZmlpMTAwNDUgPSAweDA0MmI7CiB0LmFmaWkxMDA0NiA9IDB4MDQyYzsKIHQuYWZpaTEwMDQ3ID0gMHgwNDJkOwogdC5hZmlpMTAwNDggPSAweDA0MmU7CiB0LmFmaWkxMDA0OSA9IDB4MDQyZjsKIHQuYWZpaTEwMDUwID0gMHgwNDkwOwogdC5hZmlpMTAwNTEgPSAweDA0MDI7CiB0LmFmaWkxMDA1MiA9IDB4MDQwMzsKIHQuYWZpaTEwMDUzID0gMHgwNDA0OwogdC5hZmlpMTAwNTQgPSAweDA0MDU7CiB0LmFmaWkxMDA1NSA9IDB4MDQwNjsKIHQuYWZpaTEwMDU2ID0gMHgwNDA3OwogdC5hZmlpMTAwNTcgPSAweDA0MDg7CiB0LmFmaWkxMDA1OCA9IDB4MDQwOTsKIHQuYWZpaTEwMDU5ID0gMHgwNDBhOwogdC5hZmlpMTAwNjAgPSAweDA0MGI7CiB0LmFmaWkxMDA2MSA9IDB4MDQwYzsKIHQuYWZpaTEwMDYyID0gMHgwNDBlOwogdC5hZmlpMTAwNjMgPSAweGY2YzQ7CiB0LmFmaWkxMDA2NCA9IDB4ZjZjNTsKIHQuYWZpaTEwMDY1ID0gMHgwNDMwOwogdC5hZmlpMTAwNjYgPSAweDA0MzE7CiB0LmFmaWkxMDA2NyA9IDB4MDQzMjsKIHQuYWZpaTEwMDY4ID0gMHgwNDMzOwogdC5hZmlpMTAwNjkgPSAweDA0MzQ7CiB0LmFmaWkxMDA3MCA9IDB4MDQzNTsKIHQuYWZpaTEwMDcxID0gMHgwNDUxOwogdC5hZmlpMTAwNzIgPSAweDA0MzY7CiB0LmFmaWkxMDA3MyA9IDB4MDQzNzsKIHQuYWZpaTEwMDc0ID0gMHgwNDM4OwogdC5hZmlpMTAwNzUgPSAweDA0Mzk7CiB0LmFmaWkxMDA3NiA9IDB4MDQzYTsKIHQuYWZpaTEwMDc3ID0gMHgwNDNiOwogdC5hZmlpMTAwNzggPSAweDA0M2M7CiB0LmFmaWkxMDA3OSA9IDB4MDQzZDsKIHQuYWZpaTEwMDgwID0gMHgwNDNlOwogdC5hZmlpMTAwODEgPSAweDA0M2Y7CiB0LmFmaWkxMDA4MiA9IDB4MDQ0MDsKIHQuYWZpaTEwMDgzID0gMHgwNDQxOwogdC5hZmlpMTAwODQgPSAweDA0NDI7CiB0LmFmaWkxMDA4NSA9IDB4MDQ0MzsKIHQuYWZpaTEwMDg2ID0gMHgwNDQ0OwogdC5hZmlpMTAwODcgPSAweDA0NDU7CiB0LmFmaWkxMDA4OCA9IDB4MDQ0NjsKIHQuYWZpaTEwMDg5ID0gMHgwNDQ3OwogdC5hZmlpMTAwOTAgPSAweDA0NDg7CiB0LmFmaWkxMDA5MSA9IDB4MDQ0OTsKIHQuYWZpaTEwMDkyID0gMHgwNDRhOwogdC5hZmlpMTAwOTMgPSAweDA0NGI7CiB0LmFmaWkxMDA5NCA9IDB4MDQ0YzsKIHQuYWZpaTEwMDk1ID0gMHgwNDRkOwogdC5hZmlpMTAwOTYgPSAweDA0NGU7CiB0LmFmaWkxMDA5NyA9IDB4MDQ0ZjsKIHQuYWZpaTEwMDk4ID0gMHgwNDkxOwogdC5hZmlpMTAwOTkgPSAweDA0NTI7CiB0LmFmaWkxMDEwMCA9IDB4MDQ1MzsKIHQuYWZpaTEwMTAxID0gMHgwNDU0OwogdC5hZmlpMTAxMDIgPSAweDA0NTU7CiB0LmFmaWkxMDEwMyA9IDB4MDQ1NjsKIHQuYWZpaTEwMTA0ID0gMHgwNDU3OwogdC5hZmlpMTAxMDUgPSAweDA0NTg7CiB0LmFmaWkxMDEwNiA9IDB4MDQ1OTsKIHQuYWZpaTEwMTA3ID0gMHgwNDVhOwogdC5hZmlpMTAxMDggPSAweDA0NWI7CiB0LmFmaWkxMDEwOSA9IDB4MDQ1YzsKIHQuYWZpaTEwMTEwID0gMHgwNDVlOwogdC5hZmlpMTAxNDUgPSAweDA0MGY7CiB0LmFmaWkxMDE0NiA9IDB4MDQ2MjsKIHQuYWZpaTEwMTQ3ID0gMHgwNDcyOwogdC5hZmlpMTAxNDggPSAweDA0NzQ7CiB0LmFmaWkxMDE5MiA9IDB4ZjZjNjsKIHQuYWZpaTEwMTkzID0gMHgwNDVmOwogdC5hZmlpMTAxOTQgPSAweDA0NjM7CiB0LmFmaWkxMDE5NSA9IDB4MDQ3MzsKIHQuYWZpaTEwMTk2ID0gMHgwNDc1OwogdC5hZmlpMTA4MzEgPSAweGY2Yzc7CiB0LmFmaWkxMDgzMiA9IDB4ZjZjODsKIHQuYWZpaTEwODQ2ID0gMHgwNGQ5OwogdC5hZmlpMjk5ID0gMHgyMDBlOwogdC5hZmlpMzAwID0gMHgyMDBmOwogdC5hZmlpMzAxID0gMHgyMDBkOwogdC5hZmlpNTczODEgPSAweDA2NmE7CiB0LmFmaWk1NzM4OCA9IDB4MDYwYzsKIHQuYWZpaTU3MzkyID0gMHgwNjYwOwogdC5hZmlpNTczOTMgPSAweDA2NjE7CiB0LmFmaWk1NzM5NCA9IDB4MDY2MjsKIHQuYWZpaTU3Mzk1ID0gMHgwNjYzOwogdC5hZmlpNTczOTYgPSAweDA2NjQ7CiB0LmFmaWk1NzM5NyA9IDB4MDY2NTsKIHQuYWZpaTU3Mzk4ID0gMHgwNjY2OwogdC5hZmlpNTczOTkgPSAweDA2Njc7CiB0LmFmaWk1NzQwMCA9IDB4MDY2ODsKIHQuYWZpaTU3NDAxID0gMHgwNjY5OwogdC5hZmlpNTc0MDMgPSAweDA2MWI7CiB0LmFmaWk1NzQwNyA9IDB4MDYxZjsKIHQuYWZpaTU3NDA5ID0gMHgwNjIxOwogdC5hZmlpNTc0MTAgPSAweDA2MjI7CiB0LmFmaWk1NzQxMSA9IDB4MDYyMzsKIHQuYWZpaTU3NDEyID0gMHgwNjI0OwogdC5hZmlpNTc0MTMgPSAweDA2MjU7CiB0LmFmaWk1NzQxNCA9IDB4MDYyNjsKIHQuYWZpaTU3NDE1ID0gMHgwNjI3OwogdC5hZmlpNTc0MTYgPSAweDA2Mjg7CiB0LmFmaWk1NzQxNyA9IDB4MDYyOTsKIHQuYWZpaTU3NDE4ID0gMHgwNjJhOwogdC5hZmlpNTc0MTkgPSAweDA2MmI7CiB0LmFmaWk1NzQyMCA9IDB4MDYyYzsKIHQuYWZpaTU3NDIxID0gMHgwNjJkOwogdC5hZmlpNTc0MjIgPSAweDA2MmU7CiB0LmFmaWk1NzQyMyA9IDB4MDYyZjsKIHQuYWZpaTU3NDI0ID0gMHgwNjMwOwogdC5hZmlpNTc0MjUgPSAweDA2MzE7CiB0LmFmaWk1NzQyNiA9IDB4MDYzMjsKIHQuYWZpaTU3NDI3ID0gMHgwNjMzOwogdC5hZmlpNTc0MjggPSAweDA2MzQ7CiB0LmFmaWk1NzQyOSA9IDB4MDYzNTsKIHQuYWZpaTU3NDMwID0gMHgwNjM2OwogdC5hZmlpNTc0MzEgPSAweDA2Mzc7CiB0LmFmaWk1NzQzMiA9IDB4MDYzODsKIHQuYWZpaTU3NDMzID0gMHgwNjM5OwogdC5hZmlpNTc0MzQgPSAweDA2M2E7CiB0LmFmaWk1NzQ0MCA9IDB4MDY0MDsKIHQuYWZpaTU3NDQxID0gMHgwNjQxOwogdC5hZmlpNTc0NDIgPSAweDA2NDI7CiB0LmFmaWk1NzQ0MyA9IDB4MDY0MzsKIHQuYWZpaTU3NDQ0ID0gMHgwNjQ0OwogdC5hZmlpNTc0NDUgPSAweDA2NDU7CiB0LmFmaWk1NzQ0NiA9IDB4MDY0NjsKIHQuYWZpaTU3NDQ4ID0gMHgwNjQ4OwogdC5hZmlpNTc0NDkgPSAweDA2NDk7CiB0LmFmaWk1NzQ1MCA9IDB4MDY0YTsKIHQuYWZpaTU3NDUxID0gMHgwNjRiOwogdC5hZmlpNTc0NTIgPSAweDA2NGM7CiB0LmFmaWk1NzQ1MyA9IDB4MDY0ZDsKIHQuYWZpaTU3NDU0ID0gMHgwNjRlOwogdC5hZmlpNTc0NTUgPSAweDA2NGY7CiB0LmFmaWk1NzQ1NiA9IDB4MDY1MDsKIHQuYWZpaTU3NDU3ID0gMHgwNjUxOwogdC5hZmlpNTc0NTggPSAweDA2NTI7CiB0LmFmaWk1NzQ3MCA9IDB4MDY0NzsKIHQuYWZpaTU3NTA1ID0gMHgwNmE0OwogdC5hZmlpNTc1MDYgPSAweDA2N2U7CiB0LmFmaWk1NzUwNyA9IDB4MDY4NjsKIHQuYWZpaTU3NTA4ID0gMHgwNjk4OwogdC5hZmlpNTc1MDkgPSAweDA2YWY7CiB0LmFmaWk1NzUxMSA9IDB4MDY3OTsKIHQuYWZpaTU3NTEyID0gMHgwNjg4OwogdC5hZmlpNTc1MTMgPSAweDA2OTE7CiB0LmFmaWk1NzUxNCA9IDB4MDZiYTsKIHQuYWZpaTU3NTE5ID0gMHgwNmQyOwogdC5hZmlpNTc1MzQgPSAweDA2ZDU7CiB0LmFmaWk1NzYzNiA9IDB4MjBhYTsKIHQuYWZpaTU3NjQ1ID0gMHgwNWJlOwogdC5hZmlpNTc2NTggPSAweDA1YzM7CiB0LmFmaWk1NzY2NCA9IDB4MDVkMDsKIHQuYWZpaTU3NjY1ID0gMHgwNWQxOwogdC5hZmlpNTc2NjYgPSAweDA1ZDI7CiB0LmFmaWk1NzY2NyA9IDB4MDVkMzsKIHQuYWZpaTU3NjY4ID0gMHgwNWQ0OwogdC5hZmlpNTc2NjkgPSAweDA1ZDU7CiB0LmFmaWk1NzY3MCA9IDB4MDVkNjsKIHQuYWZpaTU3NjcxID0gMHgwNWQ3OwogdC5hZmlpNTc2NzIgPSAweDA1ZDg7CiB0LmFmaWk1NzY3MyA9IDB4MDVkOTsKIHQuYWZpaTU3Njc0ID0gMHgwNWRhOwogdC5hZmlpNTc2NzUgPSAweDA1ZGI7CiB0LmFmaWk1NzY3NiA9IDB4MDVkYzsKIHQuYWZpaTU3Njc3ID0gMHgwNWRkOwogdC5hZmlpNTc2NzggPSAweDA1ZGU7CiB0LmFmaWk1NzY3OSA9IDB4MDVkZjsKIHQuYWZpaTU3NjgwID0gMHgwNWUwOwogdC5hZmlpNTc2ODEgPSAweDA1ZTE7CiB0LmFmaWk1NzY4MiA9IDB4MDVlMjsKIHQuYWZpaTU3NjgzID0gMHgwNWUzOwogdC5hZmlpNTc2ODQgPSAweDA1ZTQ7CiB0LmFmaWk1NzY4NSA9IDB4MDVlNTsKIHQuYWZpaTU3Njg2ID0gMHgwNWU2OwogdC5hZmlpNTc2ODcgPSAweDA1ZTc7CiB0LmFmaWk1NzY4OCA9IDB4MDVlODsKIHQuYWZpaTU3Njg5ID0gMHgwNWU5OwogdC5hZmlpNTc2OTAgPSAweDA1ZWE7CiB0LmFmaWk1NzY5NCA9IDB4ZmIyYTsKIHQuYWZpaTU3Njk1ID0gMHhmYjJiOwogdC5hZmlpNTc3MDAgPSAweGZiNGI7CiB0LmFmaWk1NzcwNSA9IDB4ZmIxZjsKIHQuYWZpaTU3NzE2ID0gMHgwNWYwOwogdC5hZmlpNTc3MTcgPSAweDA1ZjE7CiB0LmFmaWk1NzcxOCA9IDB4MDVmMjsKIHQuYWZpaTU3NzIzID0gMHhmYjM1OwogdC5hZmlpNTc3OTMgPSAweDA1YjQ7CiB0LmFmaWk1Nzc5NCA9IDB4MDViNTsKIHQuYWZpaTU3Nzk1ID0gMHgwNWI2OwogdC5hZmlpNTc3OTYgPSAweDA1YmI7CiB0LmFmaWk1Nzc5NyA9IDB4MDViODsKIHQuYWZpaTU3Nzk4ID0gMHgwNWI3OwogdC5hZmlpNTc3OTkgPSAweDA1YjA7CiB0LmFmaWk1NzgwMCA9IDB4MDViMjsKIHQuYWZpaTU3ODAxID0gMHgwNWIxOwogdC5hZmlpNTc4MDIgPSAweDA1YjM7CiB0LmFmaWk1NzgwMyA9IDB4MDVjMjsKIHQuYWZpaTU3ODA0ID0gMHgwNWMxOwogdC5hZmlpNTc4MDYgPSAweDA1Yjk7CiB0LmFmaWk1NzgwNyA9IDB4MDViYzsKIHQuYWZpaTU3ODM5ID0gMHgwNWJkOwogdC5hZmlpNTc4NDEgPSAweDA1YmY7CiB0LmFmaWk1Nzg0MiA9IDB4MDVjMDsKIHQuYWZpaTU3OTI5ID0gMHgwMmJjOwogdC5hZmlpNjEyNDggPSAweDIxMDU7CiB0LmFmaWk2MTI4OSA9IDB4MjExMzsKIHQuYWZpaTYxMzUyID0gMHgyMTE2OwogdC5hZmlpNjE1NzMgPSAweDIwMmM7CiB0LmFmaWk2MTU3NCA9IDB4MjAyZDsKIHQuYWZpaTYxNTc1ID0gMHgyMDJlOwogdC5hZmlpNjE2NjQgPSAweDIwMGM7CiB0LmFmaWk2MzE2NyA9IDB4MDY2ZDsKIHQuYWZpaTY0OTM3ID0gMHgwMmJkOwogdC5hZ3JhdmUgPSAweDAwZTA7CiB0LmFndWphcmF0aSA9IDB4MGE4NTsKIHQuYWd1cm11a2hpID0gMHgwYTA1OwogdC5haGlyYWdhbmEgPSAweDMwNDI7CiB0LmFob29rYWJvdmUgPSAweDFlYTM7CiB0LmFpYmVuZ2FsaSA9IDB4MDk5MDsKIHQuYWlib3BvbW9mbyA9IDB4MzExZTsKIHQuYWlkZXZhID0gMHgwOTEwOwogdC5haWVjeXJpbGxpYyA9IDB4MDRkNTsKIHQuYWlndWphcmF0aSA9IDB4MGE5MDsKIHQuYWlndXJtdWtoaSA9IDB4MGExMDsKIHQuYWltYXRyYWd1cm11a2hpID0gMHgwYTQ4OwogdC5haW5hcmFiaWMgPSAweDA2Mzk7CiB0LmFpbmZpbmFsYXJhYmljID0gMHhmZWNhOwogdC5haW5pbml0aWFsYXJhYmljID0gMHhmZWNiOwogdC5haW5tZWRpYWxhcmFiaWMgPSAweGZlY2M7CiB0LmFpbnZlcnRlZGJyZXZlID0gMHgwMjAzOwogdC5haXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Yzg7CiB0LmFpdm93ZWxzaWduZGV2YSA9IDB4MDk0ODsKIHQuYWl2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjODsKIHQuYWthdGFrYW5hID0gMHgzMGEyOwogdC5ha2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzE7CiB0LmFrb3JlYW4gPSAweDMxNGY7CiB0LmFsZWYgPSAweDA1ZDA7CiB0LmFsZWZhcmFiaWMgPSAweDA2Mjc7CiB0LmFsZWZkYWdlc2hoZWJyZXcgPSAweGZiMzA7CiB0LmFsZWZmaW5hbGFyYWJpYyA9IDB4ZmU4ZTsKIHQuYWxlZmhhbXphYWJvdmVhcmFiaWMgPSAweDA2MjM7CiB0LmFsZWZoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODQ7CiB0LmFsZWZoYW16YWJlbG93YXJhYmljID0gMHgwNjI1OwogdC5hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljID0gMHhmZTg4OwogdC5hbGVmaGVicmV3ID0gMHgwNWQwOwogdC5hbGVmbGFtZWRoZWJyZXcgPSAweGZiNGY7CiB0LmFsZWZtYWRkYWFib3ZlYXJhYmljID0gMHgwNjIyOwogdC5hbGVmbWFkZGFhYm92ZWZpbmFsYXJhYmljID0gMHhmZTgyOwogdC5hbGVmbWFrc3VyYWFyYWJpYyA9IDB4MDY0OTsKIHQuYWxlZm1ha3N1cmFmaW5hbGFyYWJpYyA9IDB4ZmVmMDsKIHQuYWxlZm1ha3N1cmFpbml0aWFsYXJhYmljID0gMHhmZWYzOwogdC5hbGVmbWFrc3VyYW1lZGlhbGFyYWJpYyA9IDB4ZmVmNDsKIHQuYWxlZnBhdGFoaGVicmV3ID0gMHhmYjJlOwogdC5hbGVmcWFtYXRzaGVicmV3ID0gMHhmYjJmOwogdC5hbGVwaCA9IDB4MjEzNTsKIHQuYWxsZXF1YWwgPSAweDIyNGM7CiB0LmFscGhhID0gMHgwM2IxOwogdC5hbHBoYXRvbm9zID0gMHgwM2FjOwogdC5hbWFjcm9uID0gMHgwMTAxOwogdC5hbW9ub3NwYWNlID0gMHhmZjQxOwogdC5hbXBlcnNhbmQgPSAweDAwMjY7CiB0LmFtcGVyc2FuZG1vbm9zcGFjZSA9IDB4ZmYwNjsKIHQuYW1wZXJzYW5kc21hbGwgPSAweGY3MjY7CiB0LmFtc3F1YXJlID0gMHgzM2MyOwogdC5hbmJvcG9tb2ZvID0gMHgzMTIyOwogdC5hbmdib3BvbW9mbyA9IDB4MzEyNDsKIHQuYW5nYnJhY2tldGxlZnQgPSAweDMwMDg7CiB0LmFuZ2JyYWNrZXRyaWdodCA9IDB4MzAwOTsKIHQuYW5na2hhbmtodXRoYWkgPSAweDBlNWE7CiB0LmFuZ2xlID0gMHgyMjIwOwogdC5hbmdsZWJyYWNrZXRsZWZ0ID0gMHgzMDA4OwogdC5hbmdsZWJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlM2Y7CiB0LmFuZ2xlYnJhY2tldHJpZ2h0ID0gMHgzMDA5OwogdC5hbmdsZWJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQwOwogdC5hbmdsZWxlZnQgPSAweDIzMjk7CiB0LmFuZ2xlcmlnaHQgPSAweDIzMmE7CiB0LmFuZ3N0cm9tID0gMHgyMTJiOwogdC5hbm90ZWxlaWEgPSAweDAzODc7CiB0LmFudWRhdHRhZGV2YSA9IDB4MDk1MjsKIHQuYW51c3ZhcmFiZW5nYWxpID0gMHgwOTgyOwogdC5hbnVzdmFyYWRldmEgPSAweDA5MDI7CiB0LmFudXN2YXJhZ3VqYXJhdGkgPSAweDBhODI7CiB0LmFvZ29uZWsgPSAweDAxMDU7CiB0LmFwYWF0b3NxdWFyZSA9IDB4MzMwMDsKIHQuYXBhcmVuID0gMHgyNDljOwogdC5hcG9zdHJvcGhlYXJtZW5pYW4gPSAweDA1NWE7CiB0LmFwb3N0cm9waGVtb2QgPSAweDAyYmM7CiB0LmFwcGxlID0gMHhmOGZmOwogdC5hcHByb2FjaGVzID0gMHgyMjUwOwogdC5hcHByb3hlcXVhbCA9IDB4MjI0ODsKIHQuYXBwcm94ZXF1YWxvcmltYWdlID0gMHgyMjUyOwogdC5hcHByb3hpbWF0ZWx5ZXF1YWwgPSAweDIyNDU7CiB0LmFyYWVhZWtvcmVhbiA9IDB4MzE4ZTsKIHQuYXJhZWFrb3JlYW4gPSAweDMxOGQ7CiB0LmFyYyA9IDB4MjMxMjsKIHQuYXJpZ2h0aGFsZnJpbmcgPSAweDFlOWE7CiB0LmFyaW5nID0gMHgwMGU1OwogdC5hcmluZ2FjdXRlID0gMHgwMWZiOwogdC5hcmluZ2JlbG93ID0gMHgxZTAxOwogdC5hcnJvd2JvdGggPSAweDIxOTQ7CiB0LmFycm93ZGFzaGRvd24gPSAweDIxZTM7CiB0LmFycm93ZGFzaGxlZnQgPSAweDIxZTA7CiB0LmFycm93ZGFzaHJpZ2h0ID0gMHgyMWUyOwogdC5hcnJvd2Rhc2h1cCA9IDB4MjFlMTsKIHQuYXJyb3dkYmxib3RoID0gMHgyMWQ0OwogdC5hcnJvd2RibGRvd24gPSAweDIxZDM7CiB0LmFycm93ZGJsbGVmdCA9IDB4MjFkMDsKIHQuYXJyb3dkYmxyaWdodCA9IDB4MjFkMjsKIHQuYXJyb3dkYmx1cCA9IDB4MjFkMTsKIHQuYXJyb3dkb3duID0gMHgyMTkzOwogdC5hcnJvd2Rvd25sZWZ0ID0gMHgyMTk5OwogdC5hcnJvd2Rvd25yaWdodCA9IDB4MjE5ODsKIHQuYXJyb3dkb3dud2hpdGUgPSAweDIxZTk7CiB0LmFycm93aGVhZGRvd25tb2QgPSAweDAyYzU7CiB0LmFycm93aGVhZGxlZnRtb2QgPSAweDAyYzI7CiB0LmFycm93aGVhZHJpZ2h0bW9kID0gMHgwMmMzOwogdC5hcnJvd2hlYWR1cG1vZCA9IDB4MDJjNDsKIHQuYXJyb3dob3JpemV4ID0gMHhmOGU3OwogdC5hcnJvd2xlZnQgPSAweDIxOTA7CiB0LmFycm93bGVmdGRibCA9IDB4MjFkMDsKIHQuYXJyb3dsZWZ0ZGJsc3Ryb2tlID0gMHgyMWNkOwogdC5hcnJvd2xlZnRvdmVycmlnaHQgPSAweDIxYzY7CiB0LmFycm93bGVmdHdoaXRlID0gMHgyMWU2OwogdC5hcnJvd3JpZ2h0ID0gMHgyMTkyOwogdC5hcnJvd3JpZ2h0ZGJsc3Ryb2tlID0gMHgyMWNmOwogdC5hcnJvd3JpZ2h0aGVhdnkgPSAweDI3OWU7CiB0LmFycm93cmlnaHRvdmVybGVmdCA9IDB4MjFjNDsKIHQuYXJyb3dyaWdodHdoaXRlID0gMHgyMWU4OwogdC5hcnJvd3RhYmxlZnQgPSAweDIxZTQ7CiB0LmFycm93dGFicmlnaHQgPSAweDIxZTU7CiB0LmFycm93dXAgPSAweDIxOTE7CiB0LmFycm93dXBkbiA9IDB4MjE5NTsKIHQuYXJyb3d1cGRuYnNlID0gMHgyMWE4OwogdC5hcnJvd3VwZG93bmJhc2UgPSAweDIxYTg7CiB0LmFycm93dXBsZWZ0ID0gMHgyMTk2OwogdC5hcnJvd3VwbGVmdG9mZG93biA9IDB4MjFjNTsKIHQuYXJyb3d1cHJpZ2h0ID0gMHgyMTk3OwogdC5hcnJvd3Vwd2hpdGUgPSAweDIxZTc7CiB0LmFycm93dmVydGV4ID0gMHhmOGU2OwogdC5hc2NpaWNpcmN1bSA9IDB4MDA1ZTsKIHQuYXNjaWljaXJjdW1tb25vc3BhY2UgPSAweGZmM2U7CiB0LmFzY2lpdGlsZGUgPSAweDAwN2U7CiB0LmFzY2lpdGlsZGVtb25vc3BhY2UgPSAweGZmNWU7CiB0LmFzY3JpcHQgPSAweDAyNTE7CiB0LmFzY3JpcHR0dXJuZWQgPSAweDAyNTI7CiB0LmFzbWFsbGhpcmFnYW5hID0gMHgzMDQxOwogdC5hc21hbGxrYXRha2FuYSA9IDB4MzBhMTsKIHQuYXNtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjc7CiB0LmFzdGVyaXNrID0gMHgwMDJhOwogdC5hc3Rlcmlza2FsdG9uZWFyYWJpYyA9IDB4MDY2ZDsKIHQuYXN0ZXJpc2thcmFiaWMgPSAweDA2NmQ7CiB0LmFzdGVyaXNrbWF0aCA9IDB4MjIxNzsKIHQuYXN0ZXJpc2ttb25vc3BhY2UgPSAweGZmMGE7CiB0LmFzdGVyaXNrc21hbGwgPSAweGZlNjE7CiB0LmFzdGVyaXNtID0gMHgyMDQyOwogdC5hc3VwZXJpb3IgPSAweGY2ZTk7CiB0LmFzeW1wdG90aWNhbGx5ZXF1YWwgPSAweDIyNDM7CiB0LmF0ID0gMHgwMDQwOwogdC5hdGlsZGUgPSAweDAwZTM7CiB0LmF0bW9ub3NwYWNlID0gMHhmZjIwOwogdC5hdHNtYWxsID0gMHhmZTZiOwogdC5hdHVybmVkID0gMHgwMjUwOwogdC5hdWJlbmdhbGkgPSAweDA5OTQ7CiB0LmF1Ym9wb21vZm8gPSAweDMxMjA7CiB0LmF1ZGV2YSA9IDB4MDkxNDsKIHQuYXVndWphcmF0aSA9IDB4MGE5NDsKIHQuYXVndXJtdWtoaSA9IDB4MGExNDsKIHQuYXVsZW5ndGhtYXJrYmVuZ2FsaSA9IDB4MDlkNzsKIHQuYXVtYXRyYWd1cm11a2hpID0gMHgwYTRjOwogdC5hdXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Y2M7CiB0LmF1dm93ZWxzaWduZGV2YSA9IDB4MDk0YzsKIHQuYXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjYzsKIHQuYXZhZ3JhaGFkZXZhID0gMHgwOTNkOwogdC5heWJhcm1lbmlhbiA9IDB4MDU2MTsKIHQuYXlpbiA9IDB4MDVlMjsKIHQuYXlpbmFsdG9uZWhlYnJldyA9IDB4ZmIyMDsKIHQuYXlpbmhlYnJldyA9IDB4MDVlMjsKIHQuYiA9IDB4MDA2MjsKIHQuYmFiZW5nYWxpID0gMHgwOWFjOwogdC5iYWNrc2xhc2ggPSAweDAwNWM7CiB0LmJhY2tzbGFzaG1vbm9zcGFjZSA9IDB4ZmYzYzsKIHQuYmFkZXZhID0gMHgwOTJjOwogdC5iYWd1amFyYXRpID0gMHgwYWFjOwogdC5iYWd1cm11a2hpID0gMHgwYTJjOwogdC5iYWhpcmFnYW5hID0gMHgzMDcwOwogdC5iYWh0dGhhaSA9IDB4MGUzZjsKIHQuYmFrYXRha2FuYSA9IDB4MzBkMDsKIHQuYmFyID0gMHgwMDdjOwogdC5iYXJtb25vc3BhY2UgPSAweGZmNWM7CiB0LmJib3BvbW9mbyA9IDB4MzEwNTsKIHQuYmNpcmNsZSA9IDB4MjRkMTsKIHQuYmRvdGFjY2VudCA9IDB4MWUwMzsKIHQuYmRvdGJlbG93ID0gMHgxZTA1OwogdC5iZWFtZWRzaXh0ZWVudGhub3RlcyA9IDB4MjY2YzsKIHQuYmVjYXVzZSA9IDB4MjIzNTsKIHQuYmVjeXJpbGxpYyA9IDB4MDQzMTsKIHQuYmVoYXJhYmljID0gMHgwNjI4OwogdC5iZWhmaW5hbGFyYWJpYyA9IDB4ZmU5MDsKIHQuYmVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5MTsKIHQuYmVoaXJhZ2FuYSA9IDB4MzA3OTsKIHQuYmVobWVkaWFsYXJhYmljID0gMHhmZTkyOwogdC5iZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmM5ZjsKIHQuYmVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzA4OwogdC5iZWhub29uZmluYWxhcmFiaWMgPSAweGZjNmQ7CiB0LmJla2F0YWthbmEgPSAweDMwZDk7CiB0LmJlbmFybWVuaWFuID0gMHgwNTYyOwogdC5iZXQgPSAweDA1ZDE7CiB0LmJldGEgPSAweDAzYjI7CiB0LmJldGFzeW1ib2xncmVlayA9IDB4MDNkMDsKIHQuYmV0ZGFnZXNoID0gMHhmYjMxOwogdC5iZXRkYWdlc2hoZWJyZXcgPSAweGZiMzE7CiB0LmJldGhlYnJldyA9IDB4MDVkMTsKIHQuYmV0cmFmZWhlYnJldyA9IDB4ZmI0YzsKIHQuYmhhYmVuZ2FsaSA9IDB4MDlhZDsKIHQuYmhhZGV2YSA9IDB4MDkyZDsKIHQuYmhhZ3VqYXJhdGkgPSAweDBhYWQ7CiB0LmJoYWd1cm11a2hpID0gMHgwYTJkOwogdC5iaG9vayA9IDB4MDI1MzsKIHQuYmloaXJhZ2FuYSA9IDB4MzA3MzsKIHQuYmlrYXRha2FuYSA9IDB4MzBkMzsKIHQuYmlsYWJpYWxjbGljayA9IDB4MDI5ODsKIHQuYmluZGlndXJtdWtoaSA9IDB4MGEwMjsKIHQuYmlydXNxdWFyZSA9IDB4MzMzMTsKIHQuYmxhY2tjaXJjbGUgPSAweDI1Y2Y7CiB0LmJsYWNrZGlhbW9uZCA9IDB4MjVjNjsKIHQuYmxhY2tkb3ducG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViYzsKIHQuYmxhY2tsZWZ0cG9pbnRpbmdwb2ludGVyID0gMHgyNWM0OwogdC5ibGFja2xlZnRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWMwOwogdC5ibGFja2xlbnRpY3VsYXJicmFja2V0bGVmdCA9IDB4MzAxMDsKIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzYjsKIHQuYmxhY2tsZW50aWN1bGFyYnJhY2tldHJpZ2h0ID0gMHgzMDExOwogdC5ibGFja2xlbnRpY3VsYXJicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzYzsKIHQuYmxhY2tsb3dlcmxlZnR0cmlhbmdsZSA9IDB4MjVlMzsKIHQuYmxhY2tsb3dlcnJpZ2h0dHJpYW5nbGUgPSAweDI1ZTI7CiB0LmJsYWNrcmVjdGFuZ2xlID0gMHgyNWFjOwogdC5ibGFja3JpZ2h0cG9pbnRpbmdwb2ludGVyID0gMHgyNWJhOwogdC5ibGFja3JpZ2h0cG9pbnRpbmd0cmlhbmdsZSA9IDB4MjViNjsKIHQuYmxhY2tzbWFsbHNxdWFyZSA9IDB4MjVhYTsKIHQuYmxhY2tzbWlsaW5nZmFjZSA9IDB4MjYzYjsKIHQuYmxhY2tzcXVhcmUgPSAweDI1YTA7CiB0LmJsYWNrc3RhciA9IDB4MjYwNTsKIHQuYmxhY2t1cHBlcmxlZnR0cmlhbmdsZSA9IDB4MjVlNDsKIHQuYmxhY2t1cHBlcnJpZ2h0dHJpYW5nbGUgPSAweDI1ZTU7CiB0LmJsYWNrdXBwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YjQ7CiB0LmJsYWNrdXBwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWIyOwogdC5ibGFuayA9IDB4MjQyMzsKIHQuYmxpbmViZWxvdyA9IDB4MWUwNzsKIHQuYmxvY2sgPSAweDI1ODg7CiB0LmJtb25vc3BhY2UgPSAweGZmNDI7CiB0LmJvYmFpbWFpdGhhaSA9IDB4MGUxYTsKIHQuYm9oaXJhZ2FuYSA9IDB4MzA3YzsKIHQuYm9rYXRha2FuYSA9IDB4MzBkYzsKIHQuYnBhcmVuID0gMHgyNDlkOwogdC5icXNxdWFyZSA9IDB4MzNjMzsKIHQuYnJhY2VleCA9IDB4ZjhmNDsKIHQuYnJhY2VsZWZ0ID0gMHgwMDdiOwogdC5icmFjZWxlZnRidCA9IDB4ZjhmMzsKIHQuYnJhY2VsZWZ0bWlkID0gMHhmOGYyOwogdC5icmFjZWxlZnRtb25vc3BhY2UgPSAweGZmNWI7CiB0LmJyYWNlbGVmdHNtYWxsID0gMHhmZTViOwogdC5icmFjZWxlZnR0cCA9IDB4ZjhmMTsKIHQuYnJhY2VsZWZ0dmVydGljYWwgPSAweGZlMzc7CiB0LmJyYWNlcmlnaHQgPSAweDAwN2Q7CiB0LmJyYWNlcmlnaHRidCA9IDB4ZjhmZTsKIHQuYnJhY2VyaWdodG1pZCA9IDB4ZjhmZDsKIHQuYnJhY2VyaWdodG1vbm9zcGFjZSA9IDB4ZmY1ZDsKIHQuYnJhY2VyaWdodHNtYWxsID0gMHhmZTVjOwogdC5icmFjZXJpZ2h0dHAgPSAweGY4ZmM7CiB0LmJyYWNlcmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzODsKIHQuYnJhY2tldGxlZnQgPSAweDAwNWI7CiB0LmJyYWNrZXRsZWZ0YnQgPSAweGY4ZjA7CiB0LmJyYWNrZXRsZWZ0ZXggPSAweGY4ZWY7CiB0LmJyYWNrZXRsZWZ0bW9ub3NwYWNlID0gMHhmZjNiOwogdC5icmFja2V0bGVmdHRwID0gMHhmOGVlOwogdC5icmFja2V0cmlnaHQgPSAweDAwNWQ7CiB0LmJyYWNrZXRyaWdodGJ0ID0gMHhmOGZiOwogdC5icmFja2V0cmlnaHRleCA9IDB4ZjhmYTsKIHQuYnJhY2tldHJpZ2h0bW9ub3NwYWNlID0gMHhmZjNkOwogdC5icmFja2V0cmlnaHR0cCA9IDB4ZjhmOTsKIHQuYnJldmUgPSAweDAyZDg7CiB0LmJyZXZlYmVsb3djbWIgPSAweDAzMmU7CiB0LmJyZXZlY21iID0gMHgwMzA2OwogdC5icmV2ZWludmVydGVkYmVsb3djbWIgPSAweDAzMmY7CiB0LmJyZXZlaW52ZXJ0ZWRjbWIgPSAweDAzMTE7CiB0LmJyZXZlaW52ZXJ0ZWRkb3VibGVjbWIgPSAweDAzNjE7CiB0LmJyaWRnZWJlbG93Y21iID0gMHgwMzJhOwogdC5icmlkZ2VpbnZlcnRlZGJlbG93Y21iID0gMHgwMzNhOwogdC5icm9rZW5iYXIgPSAweDAwYTY7CiB0LmJzdHJva2UgPSAweDAxODA7CiB0LmJzdXBlcmlvciA9IDB4ZjZlYTsKIHQuYnRvcGJhciA9IDB4MDE4MzsKIHQuYnVoaXJhZ2FuYSA9IDB4MzA3NjsKIHQuYnVrYXRha2FuYSA9IDB4MzBkNjsKIHQuYnVsbGV0ID0gMHgyMDIyOwogdC5idWxsZXRpbnZlcnNlID0gMHgyNWQ4OwogdC5idWxsZXRvcGVyYXRvciA9IDB4MjIxOTsKIHQuYnVsbHNleWUgPSAweDI1Y2U7CiB0LmMgPSAweDAwNjM7CiB0LmNhYXJtZW5pYW4gPSAweDA1NmU7CiB0LmNhYmVuZ2FsaSA9IDB4MDk5YTsKIHQuY2FjdXRlID0gMHgwMTA3OwogdC5jYWRldmEgPSAweDA5MWE7CiB0LmNhZ3VqYXJhdGkgPSAweDBhOWE7CiB0LmNhZ3VybXVraGkgPSAweDBhMWE7CiB0LmNhbHNxdWFyZSA9IDB4MzM4ODsKIHQuY2FuZHJhYmluZHViZW5nYWxpID0gMHgwOTgxOwogdC5jYW5kcmFiaW5kdWNtYiA9IDB4MDMxMDsKIHQuY2FuZHJhYmluZHVkZXZhID0gMHgwOTAxOwogdC5jYW5kcmFiaW5kdWd1amFyYXRpID0gMHgwYTgxOwogdC5jYXBzbG9jayA9IDB4MjFlYTsKIHQuY2FyZW9mID0gMHgyMTA1OwogdC5jYXJvbiA9IDB4MDJjNzsKIHQuY2Fyb25iZWxvd2NtYiA9IDB4MDMyYzsKIHQuY2Fyb25jbWIgPSAweDAzMGM7CiB0LmNhcnJpYWdlcmV0dXJuID0gMHgyMWI1OwogdC5jYm9wb21vZm8gPSAweDMxMTg7CiB0LmNjYXJvbiA9IDB4MDEwZDsKIHQuY2NlZGlsbGEgPSAweDAwZTc7CiB0LmNjZWRpbGxhYWN1dGUgPSAweDFlMDk7CiB0LmNjaXJjbGUgPSAweDI0ZDI7CiB0LmNjaXJjdW1mbGV4ID0gMHgwMTA5OwogdC5jY3VybCA9IDB4MDI1NTsKIHQuY2RvdCA9IDB4MDEwYjsKIHQuY2RvdGFjY2VudCA9IDB4MDEwYjsKIHQuY2RzcXVhcmUgPSAweDMzYzU7CiB0LmNlZGlsbGEgPSAweDAwYjg7CiB0LmNlZGlsbGFjbWIgPSAweDAzMjc7CiB0LmNlbnQgPSAweDAwYTI7CiB0LmNlbnRpZ3JhZGUgPSAweDIxMDM7CiB0LmNlbnRpbmZlcmlvciA9IDB4ZjZkZjsKIHQuY2VudG1vbm9zcGFjZSA9IDB4ZmZlMDsKIHQuY2VudG9sZHN0eWxlID0gMHhmN2EyOwogdC5jZW50c3VwZXJpb3IgPSAweGY2ZTA7CiB0LmNoYWFybWVuaWFuID0gMHgwNTc5OwogdC5jaGFiZW5nYWxpID0gMHgwOTliOwogdC5jaGFkZXZhID0gMHgwOTFiOwogdC5jaGFndWphcmF0aSA9IDB4MGE5YjsKIHQuY2hhZ3VybXVraGkgPSAweDBhMWI7CiB0LmNoYm9wb21vZm8gPSAweDMxMTQ7CiB0LmNoZWFia2hhc2lhbmN5cmlsbGljID0gMHgwNGJkOwogdC5jaGVja21hcmsgPSAweDI3MTM7CiB0LmNoZWN5cmlsbGljID0gMHgwNDQ3OwogdC5jaGVkZXNjZW5kZXJhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRiZjsKIHQuY2hlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0Yjc7CiB0LmNoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjU7CiB0LmNoZWhhcm1lbmlhbiA9IDB4MDU3MzsKIHQuY2hla2hha2Fzc2lhbmN5cmlsbGljID0gMHgwNGNjOwogdC5jaGV2ZXJ0aWNhbHN0cm9rZWN5cmlsbGljID0gMHgwNGI5OwogdC5jaGkgPSAweDAzYzc7CiB0LmNoaWV1Y2hhY2lyY2xla29yZWFuID0gMHgzMjc3OwogdC5jaGlldWNoYXBhcmVua29yZWFuID0gMHgzMjE3OwogdC5jaGlldWNoY2lyY2xla29yZWFuID0gMHgzMjY5OwogdC5jaGlldWNoa29yZWFuID0gMHgzMTRhOwogdC5jaGlldWNocGFyZW5rb3JlYW4gPSAweDMyMDk7CiB0LmNob2NoYW5ndGhhaSA9IDB4MGUwYTsKIHQuY2hvY2hhbnRoYWkgPSAweDBlMDg7CiB0LmNob2NoaW5ndGhhaSA9IDB4MGUwOTsKIHQuY2hvY2hvZXRoYWkgPSAweDBlMGM7CiB0LmNob29rID0gMHgwMTg4OwogdC5jaWV1Y2FjaXJjbGVrb3JlYW4gPSAweDMyNzY7CiB0LmNpZXVjYXBhcmVua29yZWFuID0gMHgzMjE2OwogdC5jaWV1Y2NpcmNsZWtvcmVhbiA9IDB4MzI2ODsKIHQuY2lldWNrb3JlYW4gPSAweDMxNDg7CiB0LmNpZXVjcGFyZW5rb3JlYW4gPSAweDMyMDg7CiB0LmNpZXVjdXBhcmVua29yZWFuID0gMHgzMjFjOwogdC5jaXJjbGUgPSAweDI1Y2I7CiB0LmNpcmNsZWNvcHlydCA9IDB4MDBhOTsKIHQuY2lyY2xlbXVsdGlwbHkgPSAweDIyOTc7CiB0LmNpcmNsZW90ID0gMHgyMjk5OwogdC5jaXJjbGVwbHVzID0gMHgyMjk1OwogdC5jaXJjbGVwb3N0YWxtYXJrID0gMHgzMDM2OwogdC5jaXJjbGV3aXRobGVmdGhhbGZibGFjayA9IDB4MjVkMDsKIHQuY2lyY2xld2l0aHJpZ2h0aGFsZmJsYWNrID0gMHgyNWQxOwogdC5jaXJjdW1mbGV4ID0gMHgwMmM2OwogdC5jaXJjdW1mbGV4YmVsb3djbWIgPSAweDAzMmQ7CiB0LmNpcmN1bWZsZXhjbWIgPSAweDAzMDI7CiB0LmNsZWFyID0gMHgyMzI3OwogdC5jbGlja2FsdmVvbGFyID0gMHgwMWMyOwogdC5jbGlja2RlbnRhbCA9IDB4MDFjMDsKIHQuY2xpY2tsYXRlcmFsID0gMHgwMWMxOwogdC5jbGlja3JldHJvZmxleCA9IDB4MDFjMzsKIHQuY2x1YiA9IDB4MjY2MzsKIHQuY2x1YnN1aXRibGFjayA9IDB4MjY2MzsKIHQuY2x1YnN1aXR3aGl0ZSA9IDB4MjY2NzsKIHQuY21jdWJlZHNxdWFyZSA9IDB4MzNhNDsKIHQuY21vbm9zcGFjZSA9IDB4ZmY0MzsKIHQuY21zcXVhcmVkc3F1YXJlID0gMHgzM2EwOwogdC5jb2FybWVuaWFuID0gMHgwNTgxOwogdC5jb2xvbiA9IDB4MDAzYTsKIHQuY29sb25tb25ldGFyeSA9IDB4MjBhMTsKIHQuY29sb25tb25vc3BhY2UgPSAweGZmMWE7CiB0LmNvbG9uc2lnbiA9IDB4MjBhMTsKIHQuY29sb25zbWFsbCA9IDB4ZmU1NTsKIHQuY29sb250cmlhbmd1bGFyaGFsZm1vZCA9IDB4MDJkMTsKIHQuY29sb250cmlhbmd1bGFybW9kID0gMHgwMmQwOwogdC5jb21tYSA9IDB4MDAyYzsKIHQuY29tbWFhYm92ZWNtYiA9IDB4MDMxMzsKIHQuY29tbWFhYm92ZXJpZ2h0Y21iID0gMHgwMzE1OwogdC5jb21tYWFjY2VudCA9IDB4ZjZjMzsKIHQuY29tbWFhcmFiaWMgPSAweDA2MGM7CiB0LmNvbW1hYXJtZW5pYW4gPSAweDA1NWQ7CiB0LmNvbW1haW5mZXJpb3IgPSAweGY2ZTE7CiB0LmNvbW1hbW9ub3NwYWNlID0gMHhmZjBjOwogdC5jb21tYXJldmVyc2VkYWJvdmVjbWIgPSAweDAzMTQ7CiB0LmNvbW1hcmV2ZXJzZWRtb2QgPSAweDAyYmQ7CiB0LmNvbW1hc21hbGwgPSAweGZlNTA7CiB0LmNvbW1hc3VwZXJpb3IgPSAweGY2ZTI7CiB0LmNvbW1hdHVybmVkYWJvdmVjbWIgPSAweDAzMTI7CiB0LmNvbW1hdHVybmVkbW9kID0gMHgwMmJiOwogdC5jb21wYXNzID0gMHgyNjNjOwogdC5jb25ncnVlbnQgPSAweDIyNDU7CiB0LmNvbnRvdXJpbnRlZ3JhbCA9IDB4MjIyZTsKIHQuY29udHJvbCA9IDB4MjMwMzsKIHQuY29udHJvbEFDSyA9IDB4MDAwNjsKIHQuY29udHJvbEJFTCA9IDB4MDAwNzsKIHQuY29udHJvbEJTID0gMHgwMDA4OwogdC5jb250cm9sQ0FOID0gMHgwMDE4OwogdC5jb250cm9sQ1IgPSAweDAwMGQ7CiB0LmNvbnRyb2xEQzEgPSAweDAwMTE7CiB0LmNvbnRyb2xEQzIgPSAweDAwMTI7CiB0LmNvbnRyb2xEQzMgPSAweDAwMTM7CiB0LmNvbnRyb2xEQzQgPSAweDAwMTQ7CiB0LmNvbnRyb2xERUwgPSAweDAwN2Y7CiB0LmNvbnRyb2xETEUgPSAweDAwMTA7CiB0LmNvbnRyb2xFTSA9IDB4MDAxOTsKIHQuY29udHJvbEVOUSA9IDB4MDAwNTsKIHQuY29udHJvbEVPVCA9IDB4MDAwNDsKIHQuY29udHJvbEVTQyA9IDB4MDAxYjsKIHQuY29udHJvbEVUQiA9IDB4MDAxNzsKIHQuY29udHJvbEVUWCA9IDB4MDAwMzsKIHQuY29udHJvbEZGID0gMHgwMDBjOwogdC5jb250cm9sRlMgPSAweDAwMWM7CiB0LmNvbnRyb2xHUyA9IDB4MDAxZDsKIHQuY29udHJvbEhUID0gMHgwMDA5OwogdC5jb250cm9sTEYgPSAweDAwMGE7CiB0LmNvbnRyb2xOQUsgPSAweDAwMTU7CiB0LmNvbnRyb2xOVUxMID0gMHgwMDAwOwogdC5jb250cm9sUlMgPSAweDAwMWU7CiB0LmNvbnRyb2xTSSA9IDB4MDAwZjsKIHQuY29udHJvbFNPID0gMHgwMDBlOwogdC5jb250cm9sU09UID0gMHgwMDAyOwogdC5jb250cm9sU1RYID0gMHgwMDAxOwogdC5jb250cm9sU1VCID0gMHgwMDFhOwogdC5jb250cm9sU1lOID0gMHgwMDE2OwogdC5jb250cm9sVVMgPSAweDAwMWY7CiB0LmNvbnRyb2xWVCA9IDB4MDAwYjsKIHQuY29weXJpZ2h0ID0gMHgwMGE5OwogdC5jb3B5cmlnaHRzYW5zID0gMHhmOGU5OwogdC5jb3B5cmlnaHRzZXJpZiA9IDB4ZjZkOTsKIHQuY29ybmVyYnJhY2tldGxlZnQgPSAweDMwMGM7CiB0LmNvcm5lcmJyYWNrZXRsZWZ0aGFsZndpZHRoID0gMHhmZjYyOwogdC5jb3JuZXJicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTQxOwogdC5jb3JuZXJicmFja2V0cmlnaHQgPSAweDMwMGQ7CiB0LmNvcm5lcmJyYWNrZXRyaWdodGhhbGZ3aWR0aCA9IDB4ZmY2MzsKIHQuY29ybmVyYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlNDI7CiB0LmNvcnBvcmF0aW9uc3F1YXJlID0gMHgzMzdmOwogdC5jb3NxdWFyZSA9IDB4MzNjNzsKIHQuY292ZXJrZ3NxdWFyZSA9IDB4MzNjNjsKIHQuY3BhcmVuID0gMHgyNDllOwogdC5jcnV6ZWlybyA9IDB4MjBhMjsKIHQuY3N0cmV0Y2hlZCA9IDB4MDI5NzsKIHQuY3VybHlhbmQgPSAweDIyY2Y7CiB0LmN1cmx5b3IgPSAweDIyY2U7CiB0LmN1cnJlbmN5ID0gMHgwMGE0OwogdC5jeXJCcmV2ZSA9IDB4ZjZkMTsKIHQuY3lyRmxleCA9IDB4ZjZkMjsKIHQuY3lyYnJldmUgPSAweGY2ZDQ7CiB0LmN5cmZsZXggPSAweGY2ZDU7CiB0LmQgPSAweDAwNjQ7CiB0LmRhYXJtZW5pYW4gPSAweDA1NjQ7CiB0LmRhYmVuZ2FsaSA9IDB4MDlhNjsKIHQuZGFkYXJhYmljID0gMHgwNjM2OwogdC5kYWRldmEgPSAweDA5MjY7CiB0LmRhZGZpbmFsYXJhYmljID0gMHhmZWJlOwogdC5kYWRpbml0aWFsYXJhYmljID0gMHhmZWJmOwogdC5kYWRtZWRpYWxhcmFiaWMgPSAweGZlYzA7CiB0LmRhZ2VzaCA9IDB4MDViYzsKIHQuZGFnZXNoaGVicmV3ID0gMHgwNWJjOwogdC5kYWdnZXIgPSAweDIwMjA7CiB0LmRhZ2dlcmRibCA9IDB4MjAyMTsKIHQuZGFndWphcmF0aSA9IDB4MGFhNjsKIHQuZGFndXJtdWtoaSA9IDB4MGEyNjsKIHQuZGFoaXJhZ2FuYSA9IDB4MzA2MDsKIHQuZGFrYXRha2FuYSA9IDB4MzBjMDsKIHQuZGFsYXJhYmljID0gMHgwNjJmOwogdC5kYWxldCA9IDB4MDVkMzsKIHQuZGFsZXRkYWdlc2ggPSAweGZiMzM7CiB0LmRhbGV0ZGFnZXNoaGVicmV3ID0gMHhmYjMzOwogdC5kYWxldGhlYnJldyA9IDB4MDVkMzsKIHQuZGFsZmluYWxhcmFiaWMgPSAweGZlYWE7CiB0LmRhbW1hYXJhYmljID0gMHgwNjRmOwogdC5kYW1tYWxvd2FyYWJpYyA9IDB4MDY0ZjsKIHQuZGFtbWF0YW5hbHRvbmVhcmFiaWMgPSAweDA2NGM7CiB0LmRhbW1hdGFuYXJhYmljID0gMHgwNjRjOwogdC5kYW5kYSA9IDB4MDk2NDsKIHQuZGFyZ2FoZWJyZXcgPSAweDA1YTc7CiB0LmRhcmdhbGVmdGhlYnJldyA9IDB4MDVhNzsKIHQuZGFzaWFwbmV1bWF0YWN5cmlsbGljY21iID0gMHgwNDg1OwogdC5kYmxHcmF2ZSA9IDB4ZjZkMzsKIHQuZGJsYW5nbGVicmFja2V0bGVmdCA9IDB4MzAwYTsKIHQuZGJsYW5nbGVicmFja2V0bGVmdHZlcnRpY2FsID0gMHhmZTNkOwogdC5kYmxhbmdsZWJyYWNrZXRyaWdodCA9IDB4MzAwYjsKIHQuZGJsYW5nbGVicmFja2V0cmlnaHR2ZXJ0aWNhbCA9IDB4ZmUzZTsKIHQuZGJsYXJjaGludmVydGVkYmVsb3djbWIgPSAweDAzMmI7CiB0LmRibGFycm93bGVmdCA9IDB4MjFkNDsKIHQuZGJsYXJyb3dyaWdodCA9IDB4MjFkMjsKIHQuZGJsZGFuZGEgPSAweDA5NjU7CiB0LmRibGdyYXZlID0gMHhmNmQ2OwogdC5kYmxncmF2ZWNtYiA9IDB4MDMwZjsKIHQuZGJsaW50ZWdyYWwgPSAweDIyMmM7CiB0LmRibGxvd2xpbmUgPSAweDIwMTc7CiB0LmRibGxvd2xpbmVjbWIgPSAweDAzMzM7CiB0LmRibG92ZXJsaW5lY21iID0gMHgwMzNmOwogdC5kYmxwcmltZW1vZCA9IDB4MDJiYTsKIHQuZGJsdmVydGljYWxiYXIgPSAweDIwMTY7CiB0LmRibHZlcnRpY2FsbGluZWFib3ZlY21iID0gMHgwMzBlOwogdC5kYm9wb21vZm8gPSAweDMxMDk7CiB0LmRic3F1YXJlID0gMHgzM2M4OwogdC5kY2Fyb24gPSAweDAxMGY7CiB0LmRjZWRpbGxhID0gMHgxZTExOwogdC5kY2lyY2xlID0gMHgyNGQzOwogdC5kY2lyY3VtZmxleGJlbG93ID0gMHgxZTEzOwogdC5kY3JvYXQgPSAweDAxMTE7CiB0LmRkYWJlbmdhbGkgPSAweDA5YTE7CiB0LmRkYWRldmEgPSAweDA5MjE7CiB0LmRkYWd1amFyYXRpID0gMHgwYWExOwogdC5kZGFndXJtdWtoaSA9IDB4MGEyMTsKIHQuZGRhbGFyYWJpYyA9IDB4MDY4ODsKIHQuZGRhbGZpbmFsYXJhYmljID0gMHhmYjg5OwogdC5kZGRoYWRldmEgPSAweDA5NWM7CiB0LmRkaGFiZW5nYWxpID0gMHgwOWEyOwogdC5kZGhhZGV2YSA9IDB4MDkyMjsKIHQuZGRoYWd1amFyYXRpID0gMHgwYWEyOwogdC5kZGhhZ3VybXVraGkgPSAweDBhMjI7CiB0LmRkb3RhY2NlbnQgPSAweDFlMGI7CiB0LmRkb3RiZWxvdyA9IDB4MWUwZDsKIHQuZGVjaW1hbHNlcGFyYXRvcmFyYWJpYyA9IDB4MDY2YjsKIHQuZGVjaW1hbHNlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmI7CiB0LmRlY3lyaWxsaWMgPSAweDA0MzQ7CiB0LmRlZ3JlZSA9IDB4MDBiMDsKIHQuZGVoaWhlYnJldyA9IDB4MDVhZDsKIHQuZGVoaXJhZ2FuYSA9IDB4MzA2NzsKIHQuZGVpY29wdGljID0gMHgwM2VmOwogdC5kZWthdGFrYW5hID0gMHgzMGM3OwogdC5kZWxldGVsZWZ0ID0gMHgyMzJiOwogdC5kZWxldGVyaWdodCA9IDB4MjMyNjsKIHQuZGVsdGEgPSAweDAzYjQ7CiB0LmRlbHRhdHVybmVkID0gMHgwMThkOwogdC5kZW5vbWluYXRvcm1pbnVzb25lbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmODsKIHQuZGV6aCA9IDB4MDJhNDsKIHQuZGhhYmVuZ2FsaSA9IDB4MDlhNzsKIHQuZGhhZGV2YSA9IDB4MDkyNzsKIHQuZGhhZ3VqYXJhdGkgPSAweDBhYTc7CiB0LmRoYWd1cm11a2hpID0gMHgwYTI3OwogdC5kaG9vayA9IDB4MDI1NzsKIHQuZGlhbHl0aWthdG9ub3MgPSAweDAzODU7CiB0LmRpYWx5dGlrYXRvbm9zY21iID0gMHgwMzQ0OwogdC5kaWFtb25kID0gMHgyNjY2OwogdC5kaWFtb25kc3VpdHdoaXRlID0gMHgyNjYyOwogdC5kaWVyZXNpcyA9IDB4MDBhODsKIHQuZGllcmVzaXNhY3V0ZSA9IDB4ZjZkNzsKIHQuZGllcmVzaXNiZWxvd2NtYiA9IDB4MDMyNDsKIHQuZGllcmVzaXNjbWIgPSAweDAzMDg7CiB0LmRpZXJlc2lzZ3JhdmUgPSAweGY2ZDg7CiB0LmRpZXJlc2lzdG9ub3MgPSAweDAzODU7CiB0LmRpaGlyYWdhbmEgPSAweDMwNjI7CiB0LmRpa2F0YWthbmEgPSAweDMwYzI7CiB0LmRpdHRvbWFyayA9IDB4MzAwMzsKIHQuZGl2aWRlID0gMHgwMGY3OwogdC5kaXZpZGVzID0gMHgyMjIzOwogdC5kaXZpc2lvbnNsYXNoID0gMHgyMjE1OwogdC5kamVjeXJpbGxpYyA9IDB4MDQ1MjsKIHQuZGtzaGFkZSA9IDB4MjU5MzsKIHQuZGxpbmViZWxvdyA9IDB4MWUwZjsKIHQuZGxzcXVhcmUgPSAweDMzOTc7CiB0LmRtYWNyb24gPSAweDAxMTE7CiB0LmRtb25vc3BhY2UgPSAweGZmNDQ7CiB0LmRuYmxvY2sgPSAweDI1ODQ7CiB0LmRvY2hhZGF0aGFpID0gMHgwZTBlOwogdC5kb2Rla3RoYWkgPSAweDBlMTQ7CiB0LmRvaGlyYWdhbmEgPSAweDMwNjk7CiB0LmRva2F0YWthbmEgPSAweDMwYzk7CiB0LmRvbGxhciA9IDB4MDAyNDsKIHQuZG9sbGFyaW5mZXJpb3IgPSAweGY2ZTM7CiB0LmRvbGxhcm1vbm9zcGFjZSA9IDB4ZmYwNDsKIHQuZG9sbGFyb2xkc3R5bGUgPSAweGY3MjQ7CiB0LmRvbGxhcnNtYWxsID0gMHhmZTY5OwogdC5kb2xsYXJzdXBlcmlvciA9IDB4ZjZlNDsKIHQuZG9uZyA9IDB4MjBhYjsKIHQuZG9ydXNxdWFyZSA9IDB4MzMyNjsKIHQuZG90YWNjZW50ID0gMHgwMmQ5OwogdC5kb3RhY2NlbnRjbWIgPSAweDAzMDc7CiB0LmRvdGJlbG93Y21iID0gMHgwMzIzOwogdC5kb3RiZWxvd2NvbWIgPSAweDAzMjM7CiB0LmRvdGthdGFrYW5hID0gMHgzMGZiOwogdC5kb3RsZXNzaSA9IDB4MDEzMTsKIHQuZG90bGVzc2ogPSAweGY2YmU7CiB0LmRvdGxlc3Nqc3Ryb2tlaG9vayA9IDB4MDI4NDsKIHQuZG90bWF0aCA9IDB4MjJjNTsKIHQuZG90dGVkY2lyY2xlID0gMHgyNWNjOwogdC5kb3VibGV5b2RwYXRhaCA9IDB4ZmIxZjsKIHQuZG91YmxleW9kcGF0YWhoZWJyZXcgPSAweGZiMWY7CiB0LmRvd250YWNrYmVsb3djbWIgPSAweDAzMWU7CiB0LmRvd250YWNrbW9kID0gMHgwMmQ1OwogdC5kcGFyZW4gPSAweDI0OWY7CiB0LmRzdXBlcmlvciA9IDB4ZjZlYjsKIHQuZHRhaWwgPSAweDAyNTY7CiB0LmR0b3BiYXIgPSAweDAxOGM7CiB0LmR1aGlyYWdhbmEgPSAweDMwNjU7CiB0LmR1a2F0YWthbmEgPSAweDMwYzU7CiB0LmR6ID0gMHgwMWYzOwogdC5kemFsdG9uZSA9IDB4MDJhMzsKIHQuZHpjYXJvbiA9IDB4MDFjNjsKIHQuZHpjdXJsID0gMHgwMmE1OwogdC5kemVhYmtoYXNpYW5jeXJpbGxpYyA9IDB4MDRlMTsKIHQuZHplY3lyaWxsaWMgPSAweDA0NTU7CiB0LmR6aGVjeXJpbGxpYyA9IDB4MDQ1ZjsKIHQuZSA9IDB4MDA2NTsKIHQuZWFjdXRlID0gMHgwMGU5OwogdC5lYXJ0aCA9IDB4MjY0MTsKIHQuZWJlbmdhbGkgPSAweDA5OGY7CiB0LmVib3BvbW9mbyA9IDB4MzExYzsKIHQuZWJyZXZlID0gMHgwMTE1OwogdC5lY2FuZHJhZGV2YSA9IDB4MDkwZDsKIHQuZWNhbmRyYWd1amFyYXRpID0gMHgwYThkOwogdC5lY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0NTsKIHQuZWNhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM1OwogdC5lY2Fyb24gPSAweDAxMWI7CiB0LmVjZWRpbGxhYnJldmUgPSAweDFlMWQ7CiB0LmVjaGFybWVuaWFuID0gMHgwNTY1OwogdC5lY2h5aXduYXJtZW5pYW4gPSAweDA1ODc7CiB0LmVjaXJjbGUgPSAweDI0ZDQ7CiB0LmVjaXJjdW1mbGV4ID0gMHgwMGVhOwogdC5lY2lyY3VtZmxleGFjdXRlID0gMHgxZWJmOwogdC5lY2lyY3VtZmxleGJlbG93ID0gMHgxZTE5OwogdC5lY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWM3OwogdC5lY2lyY3VtZmxleGdyYXZlID0gMHgxZWMxOwogdC5lY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVjMzsKIHQuZWNpcmN1bWZsZXh0aWxkZSA9IDB4MWVjNTsKIHQuZWN5cmlsbGljID0gMHgwNDU0OwogdC5lZGJsZ3JhdmUgPSAweDAyMDU7CiB0LmVkZXZhID0gMHgwOTBmOwogdC5lZGllcmVzaXMgPSAweDAwZWI7CiB0LmVkb3QgPSAweDAxMTc7CiB0LmVkb3RhY2NlbnQgPSAweDAxMTc7CiB0LmVkb3RiZWxvdyA9IDB4MWViOTsKIHQuZWVndXJtdWtoaSA9IDB4MGEwZjsKIHQuZWVtYXRyYWd1cm11a2hpID0gMHgwYTQ3OwogdC5lZmN5cmlsbGljID0gMHgwNDQ0OwogdC5lZ3JhdmUgPSAweDAwZTg7CiB0LmVndWphcmF0aSA9IDB4MGE4ZjsKIHQuZWhhcm1lbmlhbiA9IDB4MDU2NzsKIHQuZWhib3BvbW9mbyA9IDB4MzExZDsKIHQuZWhpcmFnYW5hID0gMHgzMDQ4OwogdC5laG9va2Fib3ZlID0gMHgxZWJiOwogdC5laWJvcG9tb2ZvID0gMHgzMTFmOwogdC5laWdodCA9IDB4MDAzODsKIHQuZWlnaHRhcmFiaWMgPSAweDA2Njg7CiB0LmVpZ2h0YmVuZ2FsaSA9IDB4MDllZTsKIHQuZWlnaHRjaXJjbGUgPSAweDI0Njc7CiB0LmVpZ2h0Y2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MTsKIHQuZWlnaHRkZXZhID0gMHgwOTZlOwogdC5laWdodGVlbmNpcmNsZSA9IDB4MjQ3MTsKIHQuZWlnaHRlZW5wYXJlbiA9IDB4MjQ4NTsKIHQuZWlnaHRlZW5wZXJpb2QgPSAweDI0OTk7CiB0LmVpZ2h0Z3VqYXJhdGkgPSAweDBhZWU7CiB0LmVpZ2h0Z3VybXVraGkgPSAweDBhNmU7CiB0LmVpZ2h0aGFja2FyYWJpYyA9IDB4MDY2ODsKIHQuZWlnaHRoYW5nemhvdSA9IDB4MzAyODsKIHQuZWlnaHRobm90ZWJlYW1lZCA9IDB4MjY2YjsKIHQuZWlnaHRpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI3OwogdC5laWdodGluZmVyaW9yID0gMHgyMDg4OwogdC5laWdodG1vbm9zcGFjZSA9IDB4ZmYxODsKIHQuZWlnaHRvbGRzdHlsZSA9IDB4ZjczODsKIHQuZWlnaHRwYXJlbiA9IDB4MjQ3YjsKIHQuZWlnaHRwZXJpb2QgPSAweDI0OGY7CiB0LmVpZ2h0cGVyc2lhbiA9IDB4MDZmODsKIHQuZWlnaHRyb21hbiA9IDB4MjE3NzsKIHQuZWlnaHRzdXBlcmlvciA9IDB4MjA3ODsKIHQuZWlnaHR0aGFpID0gMHgwZTU4OwogdC5laW52ZXJ0ZWRicmV2ZSA9IDB4MDIwNzsKIHQuZWlvdGlmaWVkY3lyaWxsaWMgPSAweDA0NjU7CiB0LmVrYXRha2FuYSA9IDB4MzBhODsKIHQuZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc0OwogdC5la29ua2FyZ3VybXVraGkgPSAweDBhNzQ7CiB0LmVrb3JlYW4gPSAweDMxNTQ7CiB0LmVsY3lyaWxsaWMgPSAweDA0M2I7CiB0LmVsZW1lbnQgPSAweDIyMDg7CiB0LmVsZXZlbmNpcmNsZSA9IDB4MjQ2YTsKIHQuZWxldmVucGFyZW4gPSAweDI0N2U7CiB0LmVsZXZlbnBlcmlvZCA9IDB4MjQ5MjsKIHQuZWxldmVucm9tYW4gPSAweDIxN2E7CiB0LmVsbGlwc2lzID0gMHgyMDI2OwogdC5lbGxpcHNpc3ZlcnRpY2FsID0gMHgyMmVlOwogdC5lbWFjcm9uID0gMHgwMTEzOwogdC5lbWFjcm9uYWN1dGUgPSAweDFlMTc7CiB0LmVtYWNyb25ncmF2ZSA9IDB4MWUxNTsKIHQuZW1jeXJpbGxpYyA9IDB4MDQzYzsKIHQuZW1kYXNoID0gMHgyMDE0OwogdC5lbWRhc2h2ZXJ0aWNhbCA9IDB4ZmUzMTsKIHQuZW1vbm9zcGFjZSA9IDB4ZmY0NTsKIHQuZW1waGFzaXNtYXJrYXJtZW5pYW4gPSAweDA1NWI7CiB0LmVtcHR5c2V0ID0gMHgyMjA1OwogdC5lbmJvcG9tb2ZvID0gMHgzMTIzOwogdC5lbmN5cmlsbGljID0gMHgwNDNkOwogdC5lbmRhc2ggPSAweDIwMTM7CiB0LmVuZGFzaHZlcnRpY2FsID0gMHhmZTMyOwogdC5lbmRlc2NlbmRlcmN5cmlsbGljID0gMHgwNGEzOwogdC5lbmcgPSAweDAxNGI7CiB0LmVuZ2JvcG9tb2ZvID0gMHgzMTI1OwogdC5lbmdoZWN5cmlsbGljID0gMHgwNGE1OwogdC5lbmhvb2tjeXJpbGxpYyA9IDB4MDRjODsKIHQuZW5zcGFjZSA9IDB4MjAwMjsKIHQuZW9nb25layA9IDB4MDExOTsKIHQuZW9rb3JlYW4gPSAweDMxNTM7CiB0LmVvcGVuID0gMHgwMjViOwogdC5lb3BlbmNsb3NlZCA9IDB4MDI5YTsKIHQuZW9wZW5yZXZlcnNlZCA9IDB4MDI1YzsKIHQuZW9wZW5yZXZlcnNlZGNsb3NlZCA9IDB4MDI1ZTsKIHQuZW9wZW5yZXZlcnNlZGhvb2sgPSAweDAyNWQ7CiB0LmVwYXJlbiA9IDB4MjRhMDsKIHQuZXBzaWxvbiA9IDB4MDNiNTsKIHQuZXBzaWxvbnRvbm9zID0gMHgwM2FkOwogdC5lcXVhbCA9IDB4MDAzZDsKIHQuZXF1YWxtb25vc3BhY2UgPSAweGZmMWQ7CiB0LmVxdWFsc21hbGwgPSAweGZlNjY7CiB0LmVxdWFsc3VwZXJpb3IgPSAweDIwN2M7CiB0LmVxdWl2YWxlbmNlID0gMHgyMjYxOwogdC5lcmJvcG9tb2ZvID0gMHgzMTI2OwogdC5lcmN5cmlsbGljID0gMHgwNDQwOwogdC5lcmV2ZXJzZWQgPSAweDAyNTg7CiB0LmVyZXZlcnNlZGN5cmlsbGljID0gMHgwNDRkOwogdC5lc2N5cmlsbGljID0gMHgwNDQxOwogdC5lc2Rlc2NlbmRlcmN5cmlsbGljID0gMHgwNGFiOwogdC5lc2ggPSAweDAyODM7CiB0LmVzaGN1cmwgPSAweDAyODY7CiB0LmVzaG9ydGRldmEgPSAweDA5MGU7CiB0LmVzaG9ydHZvd2Vsc2lnbmRldmEgPSAweDA5NDY7CiB0LmVzaHJldmVyc2VkbG9vcCA9IDB4MDFhYTsKIHQuZXNoc3F1YXRyZXZlcnNlZCA9IDB4MDI4NTsKIHQuZXNtYWxsaGlyYWdhbmEgPSAweDMwNDc7CiB0LmVzbWFsbGthdGFrYW5hID0gMHgzMGE3OwogdC5lc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2YTsKIHQuZXN0aW1hdGVkID0gMHgyMTJlOwogdC5lc3VwZXJpb3IgPSAweGY2ZWM7CiB0LmV0YSA9IDB4MDNiNzsKIHQuZXRhcm1lbmlhbiA9IDB4MDU2ODsKIHQuZXRhdG9ub3MgPSAweDAzYWU7CiB0LmV0aCA9IDB4MDBmMDsKIHQuZXRpbGRlID0gMHgxZWJkOwogdC5ldGlsZGViZWxvdyA9IDB4MWUxYjsKIHQuZXRuYWh0YWZvdWtoaGVicmV3ID0gMHgwNTkxOwogdC5ldG5haHRhZm91a2hsZWZ0aGVicmV3ID0gMHgwNTkxOwogdC5ldG5haHRhaGVicmV3ID0gMHgwNTkxOwogdC5ldG5haHRhbGVmdGhlYnJldyA9IDB4MDU5MTsKIHQuZXR1cm5lZCA9IDB4MDFkZDsKIHQuZXVrb3JlYW4gPSAweDMxNjE7CiB0LmV1cm8gPSAweDIwYWM7CiB0LmV2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWM3OwogdC5ldm93ZWxzaWduZGV2YSA9IDB4MDk0NzsKIHQuZXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM3OwogdC5leGNsYW0gPSAweDAwMjE7CiB0LmV4Y2xhbWFybWVuaWFuID0gMHgwNTVjOwogdC5leGNsYW1kYmwgPSAweDIwM2M7CiB0LmV4Y2xhbWRvd24gPSAweDAwYTE7CiB0LmV4Y2xhbWRvd25zbWFsbCA9IDB4ZjdhMTsKIHQuZXhjbGFtbW9ub3NwYWNlID0gMHhmZjAxOwogdC5leGNsYW1zbWFsbCA9IDB4ZjcyMTsKIHQuZXhpc3RlbnRpYWwgPSAweDIyMDM7CiB0LmV6aCA9IDB4MDI5MjsKIHQuZXpoY2Fyb24gPSAweDAxZWY7CiB0LmV6aGN1cmwgPSAweDAyOTM7CiB0LmV6aHJldmVyc2VkID0gMHgwMWI5OwogdC5lemh0YWlsID0gMHgwMWJhOwogdC5mID0gMHgwMDY2OwogdC5mYWRldmEgPSAweDA5NWU7CiB0LmZhZ3VybXVraGkgPSAweDBhNWU7CiB0LmZhaHJlbmhlaXQgPSAweDIxMDk7CiB0LmZhdGhhYXJhYmljID0gMHgwNjRlOwogdC5mYXRoYWxvd2FyYWJpYyA9IDB4MDY0ZTsKIHQuZmF0aGF0YW5hcmFiaWMgPSAweDA2NGI7CiB0LmZib3BvbW9mbyA9IDB4MzEwODsKIHQuZmNpcmNsZSA9IDB4MjRkNTsKIHQuZmRvdGFjY2VudCA9IDB4MWUxZjsKIHQuZmVoYXJhYmljID0gMHgwNjQxOwogdC5mZWhhcm1lbmlhbiA9IDB4MDU4NjsKIHQuZmVoZmluYWxhcmFiaWMgPSAweGZlZDI7CiB0LmZlaGluaXRpYWxhcmFiaWMgPSAweGZlZDM7CiB0LmZlaG1lZGlhbGFyYWJpYyA9IDB4ZmVkNDsKIHQuZmVpY29wdGljID0gMHgwM2U1OwogdC5mZW1hbGUgPSAweDI2NDA7CiB0LmZmID0gMHhmYjAwOwogdC5mX2YgPSAweGZiMDA7CiB0LmZmaSA9IDB4ZmIwMzsKIHQuZl9mX2kgPSAweGZiMDM7CiB0LmZmbCA9IDB4ZmIwNDsKIHQuZl9mX2wgPSAweGZiMDQ7CiB0LmZpID0gMHhmYjAxOwogdC5mX2kgPSAweGZiMDE7CiB0LmZpZnRlZW5jaXJjbGUgPSAweDI0NmU7CiB0LmZpZnRlZW5wYXJlbiA9IDB4MjQ4MjsKIHQuZmlmdGVlbnBlcmlvZCA9IDB4MjQ5NjsKIHQuZmlndXJlZGFzaCA9IDB4MjAxMjsKIHQuZmlsbGVkYm94ID0gMHgyNWEwOwogdC5maWxsZWRyZWN0ID0gMHgyNWFjOwogdC5maW5hbGthZiA9IDB4MDVkYTsKIHQuZmluYWxrYWZkYWdlc2ggPSAweGZiM2E7CiB0LmZpbmFsa2FmZGFnZXNoaGVicmV3ID0gMHhmYjNhOwogdC5maW5hbGthZmhlYnJldyA9IDB4MDVkYTsKIHQuZmluYWxtZW0gPSAweDA1ZGQ7CiB0LmZpbmFsbWVtaGVicmV3ID0gMHgwNWRkOwogdC5maW5hbG51biA9IDB4MDVkZjsKIHQuZmluYWxudW5oZWJyZXcgPSAweDA1ZGY7CiB0LmZpbmFscGUgPSAweDA1ZTM7CiB0LmZpbmFscGVoZWJyZXcgPSAweDA1ZTM7CiB0LmZpbmFsdHNhZGkgPSAweDA1ZTU7CiB0LmZpbmFsdHNhZGloZWJyZXcgPSAweDA1ZTU7CiB0LmZpcnN0dG9uZWNoaW5lc2UgPSAweDAyYzk7CiB0LmZpc2hleWUgPSAweDI1Yzk7CiB0LmZpdGFjeXJpbGxpYyA9IDB4MDQ3MzsKIHQuZml2ZSA9IDB4MDAzNTsKIHQuZml2ZWFyYWJpYyA9IDB4MDY2NTsKIHQuZml2ZWJlbmdhbGkgPSAweDA5ZWI7CiB0LmZpdmVjaXJjbGUgPSAweDI0NjQ7CiB0LmZpdmVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhlOwogdC5maXZlZGV2YSA9IDB4MDk2YjsKIHQuZml2ZWVpZ2h0aHMgPSAweDIxNWQ7CiB0LmZpdmVndWphcmF0aSA9IDB4MGFlYjsKIHQuZml2ZWd1cm11a2hpID0gMHgwYTZiOwogdC5maXZlaGFja2FyYWJpYyA9IDB4MDY2NTsKIHQuZml2ZWhhbmd6aG91ID0gMHgzMDI1OwogdC5maXZlaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyNDsKIHQuZml2ZWluZmVyaW9yID0gMHgyMDg1OwogdC5maXZlbW9ub3NwYWNlID0gMHhmZjE1OwogdC5maXZlb2xkc3R5bGUgPSAweGY3MzU7CiB0LmZpdmVwYXJlbiA9IDB4MjQ3ODsKIHQuZml2ZXBlcmlvZCA9IDB4MjQ4YzsKIHQuZml2ZXBlcnNpYW4gPSAweDA2ZjU7CiB0LmZpdmVyb21hbiA9IDB4MjE3NDsKIHQuZml2ZXN1cGVyaW9yID0gMHgyMDc1OwogdC5maXZldGhhaSA9IDB4MGU1NTsKIHQuZmwgPSAweGZiMDI7CiB0LmZfbCA9IDB4ZmIwMjsKIHQuZmxvcmluID0gMHgwMTkyOwogdC5mbW9ub3NwYWNlID0gMHhmZjQ2OwogdC5mbXNxdWFyZSA9IDB4MzM5OTsKIHQuZm9mYW50aGFpID0gMHgwZTFmOwogdC5mb2ZhdGhhaSA9IDB4MGUxZDsKIHQuZm9uZ21hbnRoYWkgPSAweDBlNGY7CiB0LmZvcmFsbCA9IDB4MjIwMDsKIHQuZm91ciA9IDB4MDAzNDsKIHQuZm91cmFyYWJpYyA9IDB4MDY2NDsKIHQuZm91cmJlbmdhbGkgPSAweDA5ZWE7CiB0LmZvdXJjaXJjbGUgPSAweDI0NjM7CiB0LmZvdXJjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhkOwogdC5mb3VyZGV2YSA9IDB4MDk2YTsKIHQuZm91cmd1amFyYXRpID0gMHgwYWVhOwogdC5mb3VyZ3VybXVraGkgPSAweDBhNmE7CiB0LmZvdXJoYWNrYXJhYmljID0gMHgwNjY0OwogdC5mb3VyaGFuZ3pob3UgPSAweDMwMjQ7CiB0LmZvdXJpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjIzOwogdC5mb3VyaW5mZXJpb3IgPSAweDIwODQ7CiB0LmZvdXJtb25vc3BhY2UgPSAweGZmMTQ7CiB0LmZvdXJudW1lcmF0b3JiZW5nYWxpID0gMHgwOWY3OwogdC5mb3Vyb2xkc3R5bGUgPSAweGY3MzQ7CiB0LmZvdXJwYXJlbiA9IDB4MjQ3NzsKIHQuZm91cnBlcmlvZCA9IDB4MjQ4YjsKIHQuZm91cnBlcnNpYW4gPSAweDA2ZjQ7CiB0LmZvdXJyb21hbiA9IDB4MjE3MzsKIHQuZm91cnN1cGVyaW9yID0gMHgyMDc0OwogdC5mb3VydGVlbmNpcmNsZSA9IDB4MjQ2ZDsKIHQuZm91cnRlZW5wYXJlbiA9IDB4MjQ4MTsKIHQuZm91cnRlZW5wZXJpb2QgPSAweDI0OTU7CiB0LmZvdXJ0aGFpID0gMHgwZTU0OwogdC5mb3VydGh0b25lY2hpbmVzZSA9IDB4MDJjYjsKIHQuZnBhcmVuID0gMHgyNGExOwogdC5mcmFjdGlvbiA9IDB4MjA0NDsKIHQuZnJhbmMgPSAweDIwYTM7CiB0LmcgPSAweDAwNjc7CiB0LmdhYmVuZ2FsaSA9IDB4MDk5NzsKIHQuZ2FjdXRlID0gMHgwMWY1OwogdC5nYWRldmEgPSAweDA5MTc7CiB0LmdhZmFyYWJpYyA9IDB4MDZhZjsKIHQuZ2FmZmluYWxhcmFiaWMgPSAweGZiOTM7CiB0LmdhZmluaXRpYWxhcmFiaWMgPSAweGZiOTQ7CiB0LmdhZm1lZGlhbGFyYWJpYyA9IDB4ZmI5NTsKIHQuZ2FndWphcmF0aSA9IDB4MGE5NzsKIHQuZ2FndXJtdWtoaSA9IDB4MGExNzsKIHQuZ2FoaXJhZ2FuYSA9IDB4MzA0YzsKIHQuZ2FrYXRha2FuYSA9IDB4MzBhYzsKIHQuZ2FtbWEgPSAweDAzYjM7CiB0LmdhbW1hbGF0aW5zbWFsbCA9IDB4MDI2MzsKIHQuZ2FtbWFzdXBlcmlvciA9IDB4MDJlMDsKIHQuZ2FuZ2lhY29wdGljID0gMHgwM2ViOwogdC5nYm9wb21vZm8gPSAweDMxMGQ7CiB0LmdicmV2ZSA9IDB4MDExZjsKIHQuZ2Nhcm9uID0gMHgwMWU3OwogdC5nY2VkaWxsYSA9IDB4MDEyMzsKIHQuZ2NpcmNsZSA9IDB4MjRkNjsKIHQuZ2NpcmN1bWZsZXggPSAweDAxMWQ7CiB0Lmdjb21tYWFjY2VudCA9IDB4MDEyMzsKIHQuZ2RvdCA9IDB4MDEyMTsKIHQuZ2RvdGFjY2VudCA9IDB4MDEyMTsKIHQuZ2VjeXJpbGxpYyA9IDB4MDQzMzsKIHQuZ2VoaXJhZ2FuYSA9IDB4MzA1MjsKIHQuZ2VrYXRha2FuYSA9IDB4MzBiMjsKIHQuZ2VvbWV0cmljYWxseWVxdWFsID0gMHgyMjUxOwogdC5nZXJlc2hhY2NlbnRoZWJyZXcgPSAweDA1OWM7CiB0LmdlcmVzaGhlYnJldyA9IDB4MDVmMzsKIHQuZ2VyZXNobXVxZGFtaGVicmV3ID0gMHgwNTlkOwogdC5nZXJtYW5kYmxzID0gMHgwMGRmOwogdC5nZXJzaGF5aW1hY2NlbnRoZWJyZXcgPSAweDA1OWU7CiB0LmdlcnNoYXlpbWhlYnJldyA9IDB4MDVmNDsKIHQuZ2V0YW1hcmsgPSAweDMwMTM7CiB0LmdoYWJlbmdhbGkgPSAweDA5OTg7CiB0LmdoYWRhcm1lbmlhbiA9IDB4MDU3MjsKIHQuZ2hhZGV2YSA9IDB4MDkxODsKIHQuZ2hhZ3VqYXJhdGkgPSAweDBhOTg7CiB0LmdoYWd1cm11a2hpID0gMHgwYTE4OwogdC5naGFpbmFyYWJpYyA9IDB4MDYzYTsKIHQuZ2hhaW5maW5hbGFyYWJpYyA9IDB4ZmVjZTsKIHQuZ2hhaW5pbml0aWFsYXJhYmljID0gMHhmZWNmOwogdC5naGFpbm1lZGlhbGFyYWJpYyA9IDB4ZmVkMDsKIHQuZ2hlbWlkZGxlaG9va2N5cmlsbGljID0gMHgwNDk1OwogdC5naGVzdHJva2VjeXJpbGxpYyA9IDB4MDQ5MzsKIHQuZ2hldXB0dXJuY3lyaWxsaWMgPSAweDA0OTE7CiB0LmdoaGFkZXZhID0gMHgwOTVhOwogdC5naGhhZ3VybXVraGkgPSAweDBhNWE7CiB0Lmdob29rID0gMHgwMjYwOwogdC5naHpzcXVhcmUgPSAweDMzOTM7CiB0LmdpaGlyYWdhbmEgPSAweDMwNGU7CiB0Lmdpa2F0YWthbmEgPSAweDMwYWU7CiB0LmdpbWFybWVuaWFuID0gMHgwNTYzOwogdC5naW1lbCA9IDB4MDVkMjsKIHQuZ2ltZWxkYWdlc2ggPSAweGZiMzI7CiB0LmdpbWVsZGFnZXNoaGVicmV3ID0gMHhmYjMyOwogdC5naW1lbGhlYnJldyA9IDB4MDVkMjsKIHQuZ2plY3lyaWxsaWMgPSAweDA0NTM7CiB0Lmdsb3R0YWxpbnZlcnRlZHN0cm9rZSA9IDB4MDFiZTsKIHQuZ2xvdHRhbHN0b3AgPSAweDAyOTQ7CiB0Lmdsb3R0YWxzdG9waW52ZXJ0ZWQgPSAweDAyOTY7CiB0Lmdsb3R0YWxzdG9wbW9kID0gMHgwMmMwOwogdC5nbG90dGFsc3RvcHJldmVyc2VkID0gMHgwMjk1OwogdC5nbG90dGFsc3RvcHJldmVyc2VkbW9kID0gMHgwMmMxOwogdC5nbG90dGFsc3RvcHJldmVyc2Vkc3VwZXJpb3IgPSAweDAyZTQ7CiB0Lmdsb3R0YWxzdG9wc3Ryb2tlID0gMHgwMmExOwogdC5nbG90dGFsc3RvcHN0cm9rZXJldmVyc2VkID0gMHgwMmEyOwogdC5nbWFjcm9uID0gMHgxZTIxOwogdC5nbW9ub3NwYWNlID0gMHhmZjQ3OwogdC5nb2hpcmFnYW5hID0gMHgzMDU0OwogdC5nb2thdGFrYW5hID0gMHgzMGI0OwogdC5ncGFyZW4gPSAweDI0YTI7CiB0LmdwYXNxdWFyZSA9IDB4MzNhYzsKIHQuZ3JhZGllbnQgPSAweDIyMDc7CiB0LmdyYXZlID0gMHgwMDYwOwogdC5ncmF2ZWJlbG93Y21iID0gMHgwMzE2OwogdC5ncmF2ZWNtYiA9IDB4MDMwMDsKIHQuZ3JhdmVjb21iID0gMHgwMzAwOwogdC5ncmF2ZWRldmEgPSAweDA5NTM7CiB0LmdyYXZlbG93bW9kID0gMHgwMmNlOwogdC5ncmF2ZW1vbm9zcGFjZSA9IDB4ZmY0MDsKIHQuZ3JhdmV0b25lY21iID0gMHgwMzQwOwogdC5ncmVhdGVyID0gMHgwMDNlOwogdC5ncmVhdGVyZXF1YWwgPSAweDIyNjU7CiB0LmdyZWF0ZXJlcXVhbG9ybGVzcyA9IDB4MjJkYjsKIHQuZ3JlYXRlcm1vbm9zcGFjZSA9IDB4ZmYxZTsKIHQuZ3JlYXRlcm9yZXF1aXZhbGVudCA9IDB4MjI3MzsKIHQuZ3JlYXRlcm9ybGVzcyA9IDB4MjI3NzsKIHQuZ3JlYXRlcm92ZXJlcXVhbCA9IDB4MjI2NzsKIHQuZ3JlYXRlcnNtYWxsID0gMHhmZTY1OwogdC5nc2NyaXB0ID0gMHgwMjYxOwogdC5nc3Ryb2tlID0gMHgwMWU1OwogdC5ndWhpcmFnYW5hID0gMHgzMDUwOwogdC5ndWlsbGVtb3RsZWZ0ID0gMHgwMGFiOwogdC5ndWlsbGVtb3RyaWdodCA9IDB4MDBiYjsKIHQuZ3VpbHNpbmdsbGVmdCA9IDB4MjAzOTsKIHQuZ3VpbHNpbmdscmlnaHQgPSAweDIwM2E7CiB0Lmd1a2F0YWthbmEgPSAweDMwYjA7CiB0Lmd1cmFtdXNxdWFyZSA9IDB4MzMxODsKIHQuZ3lzcXVhcmUgPSAweDMzYzk7CiB0LmggPSAweDAwNjg7CiB0LmhhYWJraGFzaWFuY3lyaWxsaWMgPSAweDA0YTk7CiB0LmhhYWx0b25lYXJhYmljID0gMHgwNmMxOwogdC5oYWJlbmdhbGkgPSAweDA5Yjk7CiB0LmhhZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0YjM7CiB0LmhhZGV2YSA9IDB4MDkzOTsKIHQuaGFndWphcmF0aSA9IDB4MGFiOTsKIHQuaGFndXJtdWtoaSA9IDB4MGEzOTsKIHQuaGFoYXJhYmljID0gMHgwNjJkOwogdC5oYWhmaW5hbGFyYWJpYyA9IDB4ZmVhMjsKIHQuaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhMzsKIHQuaGFoaXJhZ2FuYSA9IDB4MzA2ZjsKIHQuaGFobWVkaWFsYXJhYmljID0gMHhmZWE0OwogdC5oYWl0dXNxdWFyZSA9IDB4MzMyYTsKIHQuaGFrYXRha2FuYSA9IDB4MzBjZjsKIHQuaGFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YTsKIHQuaGFsYW50Z3VybXVraGkgPSAweDBhNGQ7CiB0LmhhbXphYXJhYmljID0gMHgwNjIxOwogdC5oYW16YWxvd2FyYWJpYyA9IDB4MDYyMTsKIHQuaGFuZ3VsZmlsbGVyID0gMHgzMTY0OwogdC5oYXJkc2lnbmN5cmlsbGljID0gMHgwNDRhOwogdC5oYXJwb29ubGVmdGJhcmJ1cCA9IDB4MjFiYzsKIHQuaGFycG9vbnJpZ2h0YmFyYnVwID0gMHgyMWMwOwogdC5oYXNxdWFyZSA9IDB4MzNjYTsKIHQuaGF0YWZwYXRhaCA9IDB4MDViMjsKIHQuaGF0YWZwYXRhaDE2ID0gMHgwNWIyOwogdC5oYXRhZnBhdGFoMjMgPSAweDA1YjI7CiB0LmhhdGFmcGF0YWgyZiA9IDB4MDViMjsKIHQuaGF0YWZwYXRhaGhlYnJldyA9IDB4MDViMjsKIHQuaGF0YWZwYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViMjsKIHQuaGF0YWZwYXRhaHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjI7CiB0LmhhdGFmcGF0YWh3aWRlaGVicmV3ID0gMHgwNWIyOwogdC5oYXRhZnFhbWF0cyA9IDB4MDViMzsKIHQuaGF0YWZxYW1hdHMxYiA9IDB4MDViMzsKIHQuaGF0YWZxYW1hdHMyOCA9IDB4MDViMzsKIHQuaGF0YWZxYW1hdHMzNCA9IDB4MDViMzsKIHQuaGF0YWZxYW1hdHNoZWJyZXcgPSAweDA1YjM7CiB0LmhhdGFmcWFtYXRzbmFycm93aGVicmV3ID0gMHgwNWIzOwogdC5oYXRhZnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1YjM7CiB0LmhhdGFmcWFtYXRzd2lkZWhlYnJldyA9IDB4MDViMzsKIHQuaGF0YWZzZWdvbCA9IDB4MDViMTsKIHQuaGF0YWZzZWdvbDE3ID0gMHgwNWIxOwogdC5oYXRhZnNlZ29sMjQgPSAweDA1YjE7CiB0LmhhdGFmc2Vnb2wzMCA9IDB4MDViMTsKIHQuaGF0YWZzZWdvbGhlYnJldyA9IDB4MDViMTsKIHQuaGF0YWZzZWdvbG5hcnJvd2hlYnJldyA9IDB4MDViMTsKIHQuaGF0YWZzZWdvbHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjE7CiB0LmhhdGFmc2Vnb2x3aWRlaGVicmV3ID0gMHgwNWIxOwogdC5oYmFyID0gMHgwMTI3OwogdC5oYm9wb21vZm8gPSAweDMxMGY7CiB0LmhicmV2ZWJlbG93ID0gMHgxZTJiOwogdC5oY2VkaWxsYSA9IDB4MWUyOTsKIHQuaGNpcmNsZSA9IDB4MjRkNzsKIHQuaGNpcmN1bWZsZXggPSAweDAxMjU7CiB0LmhkaWVyZXNpcyA9IDB4MWUyNzsKIHQuaGRvdGFjY2VudCA9IDB4MWUyMzsKIHQuaGRvdGJlbG93ID0gMHgxZTI1OwogdC5oZSA9IDB4MDVkNDsKIHQuaGVhcnQgPSAweDI2NjU7CiB0LmhlYXJ0c3VpdGJsYWNrID0gMHgyNjY1OwogdC5oZWFydHN1aXR3aGl0ZSA9IDB4MjY2MTsKIHQuaGVkYWdlc2ggPSAweGZiMzQ7CiB0LmhlZGFnZXNoaGVicmV3ID0gMHhmYjM0OwogdC5oZWhhbHRvbmVhcmFiaWMgPSAweDA2YzE7CiB0LmhlaGFyYWJpYyA9IDB4MDY0NzsKIHQuaGVoZWJyZXcgPSAweDA1ZDQ7CiB0LmhlaGZpbmFsYWx0b25lYXJhYmljID0gMHhmYmE3OwogdC5oZWhmaW5hbGFsdHR3b2FyYWJpYyA9IDB4ZmVlYTsKIHQuaGVoZmluYWxhcmFiaWMgPSAweGZlZWE7CiB0LmhlaGhhbXphYWJvdmVmaW5hbGFyYWJpYyA9IDB4ZmJhNTsKIHQuaGVoaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmYmE0OwogdC5oZWhpbml0aWFsYWx0b25lYXJhYmljID0gMHhmYmE4OwogdC5oZWhpbml0aWFsYXJhYmljID0gMHhmZWViOwogdC5oZWhpcmFnYW5hID0gMHgzMDc4OwogdC5oZWhtZWRpYWxhbHRvbmVhcmFiaWMgPSAweGZiYTk7CiB0LmhlaG1lZGlhbGFyYWJpYyA9IDB4ZmVlYzsKIHQuaGVpc2VpZXJhc3F1YXJlID0gMHgzMzdiOwogdC5oZWthdGFrYW5hID0gMHgzMGQ4OwogdC5oZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhkOwogdC5oZWt1dGFhcnVzcXVhcmUgPSAweDMzMzY7CiB0Lmhlbmdob29rID0gMHgwMjY3OwogdC5oZXJ1dHVzcXVhcmUgPSAweDMzMzk7CiB0LmhldCA9IDB4MDVkNzsKIHQuaGV0aGVicmV3ID0gMHgwNWQ3OwogdC5oaG9vayA9IDB4MDI2NjsKIHQuaGhvb2tzdXBlcmlvciA9IDB4MDJiMTsKIHQuaGlldWhhY2lyY2xla29yZWFuID0gMHgzMjdiOwogdC5oaWV1aGFwYXJlbmtvcmVhbiA9IDB4MzIxYjsKIHQuaGlldWhjaXJjbGVrb3JlYW4gPSAweDMyNmQ7CiB0LmhpZXVoa29yZWFuID0gMHgzMTRlOwogdC5oaWV1aHBhcmVua29yZWFuID0gMHgzMjBkOwogdC5oaWhpcmFnYW5hID0gMHgzMDcyOwogdC5oaWthdGFrYW5hID0gMHgzMGQyOwogdC5oaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjhiOwogdC5oaXJpcSA9IDB4MDViNDsKIHQuaGlyaXExNCA9IDB4MDViNDsKIHQuaGlyaXEyMSA9IDB4MDViNDsKIHQuaGlyaXEyZCA9IDB4MDViNDsKIHQuaGlyaXFoZWJyZXcgPSAweDA1YjQ7CiB0LmhpcmlxbmFycm93aGVicmV3ID0gMHgwNWI0OwogdC5oaXJpcXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjQ7CiB0Lmhpcmlxd2lkZWhlYnJldyA9IDB4MDViNDsKIHQuaGxpbmViZWxvdyA9IDB4MWU5NjsKIHQuaG1vbm9zcGFjZSA9IDB4ZmY0ODsKIHQuaG9hcm1lbmlhbiA9IDB4MDU3MDsKIHQuaG9oaXB0aGFpID0gMHgwZTJiOwogdC5ob2hpcmFnYW5hID0gMHgzMDdiOwogdC5ob2thdGFrYW5hID0gMHgzMGRiOwogdC5ob2thdGFrYW5haGFsZndpZHRoID0gMHhmZjhlOwogdC5ob2xhbSA9IDB4MDViOTsKIHQuaG9sYW0xOSA9IDB4MDViOTsKIHQuaG9sYW0yNiA9IDB4MDViOTsKIHQuaG9sYW0zMiA9IDB4MDViOTsKIHQuaG9sYW1oZWJyZXcgPSAweDA1Yjk7CiB0LmhvbGFtbmFycm93aGVicmV3ID0gMHgwNWI5OwogdC5ob2xhbXF1YXJ0ZXJoZWJyZXcgPSAweDA1Yjk7CiB0LmhvbGFtd2lkZWhlYnJldyA9IDB4MDViOTsKIHQuaG9ub2todWt0aGFpID0gMHgwZTJlOwogdC5ob29rYWJvdmVjb21iID0gMHgwMzA5OwogdC5ob29rY21iID0gMHgwMzA5OwogdC5ob29rcGFsYXRhbGl6ZWRiZWxvd2NtYiA9IDB4MDMyMTsKIHQuaG9va3JldHJvZmxleGJlbG93Y21iID0gMHgwMzIyOwogdC5ob29uc3F1YXJlID0gMHgzMzQyOwogdC5ob3JpY29wdGljID0gMHgwM2U5OwogdC5ob3Jpem9udGFsYmFyID0gMHgyMDE1OwogdC5ob3JuY21iID0gMHgwMzFiOwogdC5ob3RzcHJpbmdzID0gMHgyNjY4OwogdC5ob3VzZSA9IDB4MjMwMjsKIHQuaHBhcmVuID0gMHgyNGEzOwogdC5oc3VwZXJpb3IgPSAweDAyYjA7CiB0Lmh0dXJuZWQgPSAweDAyNjU7CiB0Lmh1aGlyYWdhbmEgPSAweDMwNzU7CiB0Lmh1aWl0b3NxdWFyZSA9IDB4MzMzMzsKIHQuaHVrYXRha2FuYSA9IDB4MzBkNTsKIHQuaHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4YzsKIHQuaHVuZ2FydW1sYXV0ID0gMHgwMmRkOwogdC5odW5nYXJ1bWxhdXRjbWIgPSAweDAzMGI7CiB0Lmh2ID0gMHgwMTk1OwogdC5oeXBoZW4gPSAweDAwMmQ7CiB0Lmh5cGhlbmluZmVyaW9yID0gMHhmNmU1OwogdC5oeXBoZW5tb25vc3BhY2UgPSAweGZmMGQ7CiB0Lmh5cGhlbnNtYWxsID0gMHhmZTYzOwogdC5oeXBoZW5zdXBlcmlvciA9IDB4ZjZlNjsKIHQuaHlwaGVudHdvID0gMHgyMDEwOwogdC5pID0gMHgwMDY5OwogdC5pYWN1dGUgPSAweDAwZWQ7CiB0LmlhY3lyaWxsaWMgPSAweDA0NGY7CiB0LmliZW5nYWxpID0gMHgwOTg3OwogdC5pYm9wb21vZm8gPSAweDMxMjc7CiB0LmlicmV2ZSA9IDB4MDEyZDsKIHQuaWNhcm9uID0gMHgwMWQwOwogdC5pY2lyY2xlID0gMHgyNGQ4OwogdC5pY2lyY3VtZmxleCA9IDB4MDBlZTsKIHQuaWN5cmlsbGljID0gMHgwNDU2OwogdC5pZGJsZ3JhdmUgPSAweDAyMDk7CiB0LmlkZW9ncmFwaGVhcnRoY2lyY2xlID0gMHgzMjhmOwogdC5pZGVvZ3JhcGhmaXJlY2lyY2xlID0gMHgzMjhiOwogdC5pZGVvZ3JhcGhpY2FsbGlhbmNlcGFyZW4gPSAweDMyM2Y7CiB0LmlkZW9ncmFwaGljY2FsbHBhcmVuID0gMHgzMjNhOwogdC5pZGVvZ3JhcGhpY2NlbnRyZWNpcmNsZSA9IDB4MzJhNTsKIHQuaWRlb2dyYXBoaWNjbG9zZSA9IDB4MzAwNjsKIHQuaWRlb2dyYXBoaWNjb21tYSA9IDB4MzAwMTsKIHQuaWRlb2dyYXBoaWNjb21tYWxlZnQgPSAweGZmNjQ7CiB0LmlkZW9ncmFwaGljY29uZ3JhdHVsYXRpb25wYXJlbiA9IDB4MzIzNzsKIHQuaWRlb2dyYXBoaWNjb3JyZWN0Y2lyY2xlID0gMHgzMmEzOwogdC5pZGVvZ3JhcGhpY2VhcnRocGFyZW4gPSAweDMyMmY7CiB0LmlkZW9ncmFwaGljZW50ZXJwcmlzZXBhcmVuID0gMHgzMjNkOwogdC5pZGVvZ3JhcGhpY2V4Y2VsbGVudGNpcmNsZSA9IDB4MzI5ZDsKIHQuaWRlb2dyYXBoaWNmZXN0aXZhbHBhcmVuID0gMHgzMjQwOwogdC5pZGVvZ3JhcGhpY2ZpbmFuY2lhbGNpcmNsZSA9IDB4MzI5NjsKIHQuaWRlb2dyYXBoaWNmaW5hbmNpYWxwYXJlbiA9IDB4MzIzNjsKIHQuaWRlb2dyYXBoaWNmaXJlcGFyZW4gPSAweDMyMmI7CiB0LmlkZW9ncmFwaGljaGF2ZXBhcmVuID0gMHgzMjMyOwogdC5pZGVvZ3JhcGhpY2hpZ2hjaXJjbGUgPSAweDMyYTQ7CiB0LmlkZW9ncmFwaGljaXRlcmF0aW9ubWFyayA9IDB4MzAwNTsKIHQuaWRlb2dyYXBoaWNsYWJvcmNpcmNsZSA9IDB4MzI5ODsKIHQuaWRlb2dyYXBoaWNsYWJvcnBhcmVuID0gMHgzMjM4OwogdC5pZGVvZ3JhcGhpY2xlZnRjaXJjbGUgPSAweDMyYTc7CiB0LmlkZW9ncmFwaGljbG93Y2lyY2xlID0gMHgzMmE2OwogdC5pZGVvZ3JhcGhpY21lZGljaW5lY2lyY2xlID0gMHgzMmE5OwogdC5pZGVvZ3JhcGhpY21ldGFscGFyZW4gPSAweDMyMmU7CiB0LmlkZW9ncmFwaGljbW9vbnBhcmVuID0gMHgzMjJhOwogdC5pZGVvZ3JhcGhpY25hbWVwYXJlbiA9IDB4MzIzNDsKIHQuaWRlb2dyYXBoaWNwZXJpb2QgPSAweDMwMDI7CiB0LmlkZW9ncmFwaGljcHJpbnRjaXJjbGUgPSAweDMyOWU7CiB0LmlkZW9ncmFwaGljcmVhY2hwYXJlbiA9IDB4MzI0MzsKIHQuaWRlb2dyYXBoaWNyZXByZXNlbnRwYXJlbiA9IDB4MzIzOTsKIHQuaWRlb2dyYXBoaWNyZXNvdXJjZXBhcmVuID0gMHgzMjNlOwogdC5pZGVvZ3JhcGhpY3JpZ2h0Y2lyY2xlID0gMHgzMmE4OwogdC5pZGVvZ3JhcGhpY3NlY3JldGNpcmNsZSA9IDB4MzI5OTsKIHQuaWRlb2dyYXBoaWNzZWxmcGFyZW4gPSAweDMyNDI7CiB0LmlkZW9ncmFwaGljc29jaWV0eXBhcmVuID0gMHgzMjMzOwogdC5pZGVvZ3JhcGhpY3NwYWNlID0gMHgzMDAwOwogdC5pZGVvZ3JhcGhpY3NwZWNpYWxwYXJlbiA9IDB4MzIzNTsKIHQuaWRlb2dyYXBoaWNzdG9ja3BhcmVuID0gMHgzMjMxOwogdC5pZGVvZ3JhcGhpY3N0dWR5cGFyZW4gPSAweDMyM2I7CiB0LmlkZW9ncmFwaGljc3VucGFyZW4gPSAweDMyMzA7CiB0LmlkZW9ncmFwaGljc3VwZXJ2aXNlcGFyZW4gPSAweDMyM2M7CiB0LmlkZW9ncmFwaGljd2F0ZXJwYXJlbiA9IDB4MzIyYzsKIHQuaWRlb2dyYXBoaWN3b29kcGFyZW4gPSAweDMyMmQ7CiB0LmlkZW9ncmFwaGljemVybyA9IDB4MzAwNzsKIHQuaWRlb2dyYXBobWV0YWxjaXJjbGUgPSAweDMyOGU7CiB0LmlkZW9ncmFwaG1vb25jaXJjbGUgPSAweDMyOGE7CiB0LmlkZW9ncmFwaG5hbWVjaXJjbGUgPSAweDMyOTQ7CiB0LmlkZW9ncmFwaHN1bmNpcmNsZSA9IDB4MzI5MDsKIHQuaWRlb2dyYXBod2F0ZXJjaXJjbGUgPSAweDMyOGM7CiB0LmlkZW9ncmFwaHdvb2RjaXJjbGUgPSAweDMyOGQ7CiB0LmlkZXZhID0gMHgwOTA3OwogdC5pZGllcmVzaXMgPSAweDAwZWY7CiB0LmlkaWVyZXNpc2FjdXRlID0gMHgxZTJmOwogdC5pZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlNTsKIHQuaWRvdGJlbG93ID0gMHgxZWNiOwogdC5pZWJyZXZlY3lyaWxsaWMgPSAweDA0ZDc7CiB0LmllY3lyaWxsaWMgPSAweDA0MzU7CiB0LmlldW5nYWNpcmNsZWtvcmVhbiA9IDB4MzI3NTsKIHQuaWV1bmdhcGFyZW5rb3JlYW4gPSAweDMyMTU7CiB0LmlldW5nY2lyY2xla29yZWFuID0gMHgzMjY3OwogdC5pZXVuZ2tvcmVhbiA9IDB4MzE0NzsKIHQuaWV1bmdwYXJlbmtvcmVhbiA9IDB4MzIwNzsKIHQuaWdyYXZlID0gMHgwMGVjOwogdC5pZ3VqYXJhdGkgPSAweDBhODc7CiB0LmlndXJtdWtoaSA9IDB4MGEwNzsKIHQuaWhpcmFnYW5hID0gMHgzMDQ0OwogdC5paG9va2Fib3ZlID0gMHgxZWM5OwogdC5paWJlbmdhbGkgPSAweDA5ODg7CiB0LmlpY3lyaWxsaWMgPSAweDA0Mzg7CiB0LmlpZGV2YSA9IDB4MDkwODsKIHQuaWlndWphcmF0aSA9IDB4MGE4ODsKIHQuaWlndXJtdWtoaSA9IDB4MGEwODsKIHQuaWltYXRyYWd1cm11a2hpID0gMHgwYTQwOwogdC5paW52ZXJ0ZWRicmV2ZSA9IDB4MDIwYjsKIHQuaWlzaG9ydGN5cmlsbGljID0gMHgwNDM5OwogdC5paXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzA7CiB0Lmlpdm93ZWxzaWduZGV2YSA9IDB4MDk0MDsKIHQuaWl2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMDsKIHQuaWogPSAweDAxMzM7CiB0LmlrYXRha2FuYSA9IDB4MzBhNDsKIHQuaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjcyOwogdC5pa29yZWFuID0gMHgzMTYzOwogdC5pbGRlID0gMHgwMmRjOwogdC5pbHV5aGVicmV3ID0gMHgwNWFjOwogdC5pbWFjcm9uID0gMHgwMTJiOwogdC5pbWFjcm9uY3lyaWxsaWMgPSAweDA0ZTM7CiB0LmltYWdlb3JhcHByb3hpbWF0ZWx5ZXF1YWwgPSAweDIyNTM7CiB0LmltYXRyYWd1cm11a2hpID0gMHgwYTNmOwogdC5pbW9ub3NwYWNlID0gMHhmZjQ5OwogdC5pbmNyZW1lbnQgPSAweDIyMDY7CiB0LmluZmluaXR5ID0gMHgyMjFlOwogdC5pbmlhcm1lbmlhbiA9IDB4MDU2YjsKIHQuaW50ZWdyYWwgPSAweDIyMmI7CiB0LmludGVncmFsYm90dG9tID0gMHgyMzIxOwogdC5pbnRlZ3JhbGJ0ID0gMHgyMzIxOwogdC5pbnRlZ3JhbGV4ID0gMHhmOGY1OwogdC5pbnRlZ3JhbHRvcCA9IDB4MjMyMDsKIHQuaW50ZWdyYWx0cCA9IDB4MjMyMDsKIHQuaW50ZXJzZWN0aW9uID0gMHgyMjI5OwogdC5pbnRpc3F1YXJlID0gMHgzMzA1OwogdC5pbnZidWxsZXQgPSAweDI1ZDg7CiB0LmludmNpcmNsZSA9IDB4MjVkOTsKIHQuaW52c21pbGVmYWNlID0gMHgyNjNiOwogdC5pb2N5cmlsbGljID0gMHgwNDUxOwogdC5pb2dvbmVrID0gMHgwMTJmOwogdC5pb3RhID0gMHgwM2I5OwogdC5pb3RhZGllcmVzaXMgPSAweDAzY2E7CiB0LmlvdGFkaWVyZXNpc3Rvbm9zID0gMHgwMzkwOwogdC5pb3RhbGF0aW4gPSAweDAyNjk7CiB0LmlvdGF0b25vcyA9IDB4MDNhZjsKIHQuaXBhcmVuID0gMHgyNGE0OwogdC5pcmlndXJtdWtoaSA9IDB4MGE3MjsKIHQuaXNtYWxsaGlyYWdhbmEgPSAweDMwNDM7CiB0LmlzbWFsbGthdGFrYW5hID0gMHgzMGEzOwogdC5pc21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ODsKIHQuaXNzaGFyYmVuZ2FsaSA9IDB4MDlmYTsKIHQuaXN0cm9rZSA9IDB4MDI2ODsKIHQuaXN1cGVyaW9yID0gMHhmNmVkOwogdC5pdGVyYXRpb25oaXJhZ2FuYSA9IDB4MzA5ZDsKIHQuaXRlcmF0aW9ua2F0YWthbmEgPSAweDMwZmQ7CiB0Lml0aWxkZSA9IDB4MDEyOTsKIHQuaXRpbGRlYmVsb3cgPSAweDFlMmQ7CiB0Lml1Ym9wb21vZm8gPSAweDMxMjk7CiB0Lml1Y3lyaWxsaWMgPSAweDA0NGU7CiB0Lml2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWJmOwogdC5pdm93ZWxzaWduZGV2YSA9IDB4MDkzZjsKIHQuaXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWJmOwogdC5pemhpdHNhY3lyaWxsaWMgPSAweDA0NzU7CiB0Lml6aGl0c2FkYmxncmF2ZWN5cmlsbGljID0gMHgwNDc3OwogdC5qID0gMHgwMDZhOwogdC5qYWFybWVuaWFuID0gMHgwNTcxOwogdC5qYWJlbmdhbGkgPSAweDA5OWM7CiB0LmphZGV2YSA9IDB4MDkxYzsKIHQuamFndWphcmF0aSA9IDB4MGE5YzsKIHQuamFndXJtdWtoaSA9IDB4MGExYzsKIHQuamJvcG9tb2ZvID0gMHgzMTEwOwogdC5qY2Fyb24gPSAweDAxZjA7CiB0LmpjaXJjbGUgPSAweDI0ZDk7CiB0LmpjaXJjdW1mbGV4ID0gMHgwMTM1OwogdC5qY3Jvc3NlZHRhaWwgPSAweDAyOWQ7CiB0Lmpkb3RsZXNzc3Ryb2tlID0gMHgwMjVmOwogdC5qZWN5cmlsbGljID0gMHgwNDU4OwogdC5qZWVtYXJhYmljID0gMHgwNjJjOwogdC5qZWVtZmluYWxhcmFiaWMgPSAweGZlOWU7CiB0LmplZW1pbml0aWFsYXJhYmljID0gMHhmZTlmOwogdC5qZWVtbWVkaWFsYXJhYmljID0gMHhmZWEwOwogdC5qZWhhcmFiaWMgPSAweDA2OTg7CiB0LmplaGZpbmFsYXJhYmljID0gMHhmYjhiOwogdC5qaGFiZW5nYWxpID0gMHgwOTlkOwogdC5qaGFkZXZhID0gMHgwOTFkOwogdC5qaGFndWphcmF0aSA9IDB4MGE5ZDsKIHQuamhhZ3VybXVraGkgPSAweDBhMWQ7CiB0LmpoZWhhcm1lbmlhbiA9IDB4MDU3YjsKIHQuamlzID0gMHgzMDA0OwogdC5qbW9ub3NwYWNlID0gMHhmZjRhOwogdC5qcGFyZW4gPSAweDI0YTU7CiB0LmpzdXBlcmlvciA9IDB4MDJiMjsKIHQuayA9IDB4MDA2YjsKIHQua2FiYXNoa2lyY3lyaWxsaWMgPSAweDA0YTE7CiB0LmthYmVuZ2FsaSA9IDB4MDk5NTsKIHQua2FjdXRlID0gMHgxZTMxOwogdC5rYWN5cmlsbGljID0gMHgwNDNhOwogdC5rYWRlc2NlbmRlcmN5cmlsbGljID0gMHgwNDliOwogdC5rYWRldmEgPSAweDA5MTU7CiB0LmthZiA9IDB4MDVkYjsKIHQua2FmYXJhYmljID0gMHgwNjQzOwogdC5rYWZkYWdlc2ggPSAweGZiM2I7CiB0LmthZmRhZ2VzaGhlYnJldyA9IDB4ZmIzYjsKIHQua2FmZmluYWxhcmFiaWMgPSAweGZlZGE7CiB0LmthZmhlYnJldyA9IDB4MDVkYjsKIHQua2FmaW5pdGlhbGFyYWJpYyA9IDB4ZmVkYjsKIHQua2FmbWVkaWFsYXJhYmljID0gMHhmZWRjOwogdC5rYWZyYWZlaGVicmV3ID0gMHhmYjRkOwogdC5rYWd1amFyYXRpID0gMHgwYTk1OwogdC5rYWd1cm11a2hpID0gMHgwYTE1OwogdC5rYWhpcmFnYW5hID0gMHgzMDRiOwogdC5rYWhvb2tjeXJpbGxpYyA9IDB4MDRjNDsKIHQua2FrYXRha2FuYSA9IDB4MzBhYjsKIHQua2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3NjsKIHQua2FwcGEgPSAweDAzYmE7CiB0LmthcHBhc3ltYm9sZ3JlZWsgPSAweDAzZjA7CiB0LmthcHllb3VubWlldW1rb3JlYW4gPSAweDMxNzE7CiB0LmthcHllb3VucGhpZXVwaGtvcmVhbiA9IDB4MzE4NDsKIHQua2FweWVvdW5waWV1cGtvcmVhbiA9IDB4MzE3ODsKIHQua2FweWVvdW5zc2FuZ3BpZXVwa29yZWFuID0gMHgzMTc5OwogdC5rYXJvcmlpc3F1YXJlID0gMHgzMzBkOwogdC5rYXNoaWRhYXV0b2FyYWJpYyA9IDB4MDY0MDsKIHQua2FzaGlkYWF1dG9ub3NpZGViZWFyaW5nYXJhYmljID0gMHgwNjQwOwogdC5rYXNtYWxsa2F0YWthbmEgPSAweDMwZjU7CiB0Lmthc3F1YXJlID0gMHgzMzg0OwogdC5rYXNyYWFyYWJpYyA9IDB4MDY1MDsKIHQua2FzcmF0YW5hcmFiaWMgPSAweDA2NGQ7CiB0Lmthc3Ryb2tlY3lyaWxsaWMgPSAweDA0OWY7CiB0LmthdGFoaXJhcHJvbG9uZ21hcmtoYWxmd2lkdGggPSAweGZmNzA7CiB0LmthdmVydGljYWxzdHJva2VjeXJpbGxpYyA9IDB4MDQ5ZDsKIHQua2JvcG9tb2ZvID0gMHgzMTBlOwogdC5rY2Fsc3F1YXJlID0gMHgzMzg5OwogdC5rY2Fyb24gPSAweDAxZTk7CiB0LmtjZWRpbGxhID0gMHgwMTM3OwogdC5rY2lyY2xlID0gMHgyNGRhOwogdC5rY29tbWFhY2NlbnQgPSAweDAxMzc7CiB0Lmtkb3RiZWxvdyA9IDB4MWUzMzsKIHQua2VoYXJtZW5pYW4gPSAweDA1ODQ7CiB0LmtlaGlyYWdhbmEgPSAweDMwNTE7CiB0Lmtla2F0YWthbmEgPSAweDMwYjE7CiB0Lmtla2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzk7CiB0LmtlbmFybWVuaWFuID0gMHgwNTZmOwogdC5rZXNtYWxsa2F0YWthbmEgPSAweDMwZjY7CiB0LmtncmVlbmxhbmRpYyA9IDB4MDEzODsKIHQua2hhYmVuZ2FsaSA9IDB4MDk5NjsKIHQua2hhY3lyaWxsaWMgPSAweDA0NDU7CiB0LmtoYWRldmEgPSAweDA5MTY7CiB0LmtoYWd1amFyYXRpID0gMHgwYTk2OwogdC5raGFndXJtdWtoaSA9IDB4MGExNjsKIHQua2hhaGFyYWJpYyA9IDB4MDYyZTsKIHQua2hhaGZpbmFsYXJhYmljID0gMHhmZWE2OwogdC5raGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVhNzsKIHQua2hhaG1lZGlhbGFyYWJpYyA9IDB4ZmVhODsKIHQua2hlaWNvcHRpYyA9IDB4MDNlNzsKIHQua2hoYWRldmEgPSAweDA5NTk7CiB0LmtoaGFndXJtdWtoaSA9IDB4MGE1OTsKIHQua2hpZXVraGFjaXJjbGVrb3JlYW4gPSAweDMyNzg7CiB0LmtoaWV1a2hhcGFyZW5rb3JlYW4gPSAweDMyMTg7CiB0LmtoaWV1a2hjaXJjbGVrb3JlYW4gPSAweDMyNmE7CiB0LmtoaWV1a2hrb3JlYW4gPSAweDMxNGI7CiB0LmtoaWV1a2hwYXJlbmtvcmVhbiA9IDB4MzIwYTsKIHQua2hva2hhaXRoYWkgPSAweDBlMDI7CiB0Lmtob2tob250aGFpID0gMHgwZTA1OwogdC5raG9raHVhdHRoYWkgPSAweDBlMDM7CiB0Lmtob2tod2FpdGhhaSA9IDB4MGUwNDsKIHQua2hvbXV0dGhhaSA9IDB4MGU1YjsKIHQua2hvb2sgPSAweDAxOTk7CiB0Lmtob3Jha2hhbmd0aGFpID0gMHgwZTA2OwogdC5raHpzcXVhcmUgPSAweDMzOTE7CiB0LmtpaGlyYWdhbmEgPSAweDMwNGQ7CiB0Lmtpa2F0YWthbmEgPSAweDMwYWQ7CiB0Lmtpa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNzc7CiB0Lmtpcm9ndXJhbXVzcXVhcmUgPSAweDMzMTU7CiB0Lmtpcm9tZWV0b3J1c3F1YXJlID0gMHgzMzE2OwogdC5raXJvc3F1YXJlID0gMHgzMzE0OwogdC5raXllb2thY2lyY2xla29yZWFuID0gMHgzMjZlOwogdC5raXllb2thcGFyZW5rb3JlYW4gPSAweDMyMGU7CiB0LmtpeWVva2NpcmNsZWtvcmVhbiA9IDB4MzI2MDsKIHQua2l5ZW9ra29yZWFuID0gMHgzMTMxOwogdC5raXllb2twYXJlbmtvcmVhbiA9IDB4MzIwMDsKIHQua2l5ZW9rc2lvc2tvcmVhbiA9IDB4MzEzMzsKIHQua2plY3lyaWxsaWMgPSAweDA0NWM7CiB0LmtsaW5lYmVsb3cgPSAweDFlMzU7CiB0Lmtsc3F1YXJlID0gMHgzMzk4OwogdC5rbWN1YmVkc3F1YXJlID0gMHgzM2E2OwogdC5rbW9ub3NwYWNlID0gMHhmZjRiOwogdC5rbXNxdWFyZWRzcXVhcmUgPSAweDMzYTI7CiB0LmtvaGlyYWdhbmEgPSAweDMwNTM7CiB0LmtvaG1zcXVhcmUgPSAweDMzYzA7CiB0Lmtva2FpdGhhaSA9IDB4MGUwMTsKIHQua29rYXRha2FuYSA9IDB4MzBiMzsKIHQua29rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YTsKIHQua29vcG9zcXVhcmUgPSAweDMzMWU7CiB0LmtvcHBhY3lyaWxsaWMgPSAweDA0ODE7CiB0LmtvcmVhbnN0YW5kYXJkc3ltYm9sID0gMHgzMjdmOwogdC5rb3JvbmlzY21iID0gMHgwMzQzOwogdC5rcGFyZW4gPSAweDI0YTY7CiB0LmtwYXNxdWFyZSA9IDB4MzNhYTsKIHQua3NpY3lyaWxsaWMgPSAweDA0NmY7CiB0Lmt0c3F1YXJlID0gMHgzM2NmOwogdC5rdHVybmVkID0gMHgwMjllOwogdC5rdWhpcmFnYW5hID0gMHgzMDRmOwogdC5rdWthdGFrYW5hID0gMHgzMGFmOwogdC5rdWthdGFrYW5haGFsZndpZHRoID0gMHhmZjc4OwogdC5rdnNxdWFyZSA9IDB4MzNiODsKIHQua3dzcXVhcmUgPSAweDMzYmU7CiB0LmwgPSAweDAwNmM7CiB0LmxhYmVuZ2FsaSA9IDB4MDliMjsKIHQubGFjdXRlID0gMHgwMTNhOwogdC5sYWRldmEgPSAweDA5MzI7CiB0LmxhZ3VqYXJhdGkgPSAweDBhYjI7CiB0LmxhZ3VybXVraGkgPSAweDBhMzI7CiB0Lmxha2toYW5neWFvdGhhaSA9IDB4MGU0NTsKIHQubGFtYWxlZmZpbmFsYXJhYmljID0gMHhmZWZjOwogdC5sYW1hbGVmaGFtemFhYm92ZWZpbmFsYXJhYmljID0gMHhmZWY4OwogdC5sYW1hbGVmaGFtemFhYm92ZWlzb2xhdGVkYXJhYmljID0gMHhmZWY3OwogdC5sYW1hbGVmaGFtemFiZWxvd2ZpbmFsYXJhYmljID0gMHhmZWZhOwogdC5sYW1hbGVmaGFtemFiZWxvd2lzb2xhdGVkYXJhYmljID0gMHhmZWY5OwogdC5sYW1hbGVmaXNvbGF0ZWRhcmFiaWMgPSAweGZlZmI7CiB0LmxhbWFsZWZtYWRkYWFib3ZlZmluYWxhcmFiaWMgPSAweGZlZjY7CiB0LmxhbWFsZWZtYWRkYWFib3ZlaXNvbGF0ZWRhcmFiaWMgPSAweGZlZjU7CiB0LmxhbWFyYWJpYyA9IDB4MDY0NDsKIHQubGFtYmRhID0gMHgwM2JiOwogdC5sYW1iZGFzdHJva2UgPSAweDAxOWI7CiB0LmxhbWVkID0gMHgwNWRjOwogdC5sYW1lZGRhZ2VzaCA9IDB4ZmIzYzsKIHQubGFtZWRkYWdlc2hoZWJyZXcgPSAweGZiM2M7CiB0LmxhbWVkaGVicmV3ID0gMHgwNWRjOwogdC5sYW1maW5hbGFyYWJpYyA9IDB4ZmVkZTsKIHQubGFtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNjYTsKIHQubGFtaW5pdGlhbGFyYWJpYyA9IDB4ZmVkZjsKIHQubGFtamVlbWluaXRpYWxhcmFiaWMgPSAweGZjYzk7CiB0LmxhbWtoYWhpbml0aWFsYXJhYmljID0gMHhmY2NiOwogdC5sYW1sYW1oZWhpc29sYXRlZGFyYWJpYyA9IDB4ZmRmMjsKIHQubGFtbWVkaWFsYXJhYmljID0gMHhmZWUwOwogdC5sYW1tZWVtaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmQ4ODsKIHQubGFtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjY2M7CiB0LmxhcmdlY2lyY2xlID0gMHgyNWVmOwogdC5sYmFyID0gMHgwMTlhOwogdC5sYmVsdCA9IDB4MDI2YzsKIHQubGJvcG9tb2ZvID0gMHgzMTBjOwogdC5sY2Fyb24gPSAweDAxM2U7CiB0LmxjZWRpbGxhID0gMHgwMTNjOwogdC5sY2lyY2xlID0gMHgyNGRiOwogdC5sY2lyY3VtZmxleGJlbG93ID0gMHgxZTNkOwogdC5sY29tbWFhY2NlbnQgPSAweDAxM2M7CiB0Lmxkb3QgPSAweDAxNDA7CiB0Lmxkb3RhY2NlbnQgPSAweDAxNDA7CiB0Lmxkb3RiZWxvdyA9IDB4MWUzNzsKIHQubGRvdGJlbG93bWFjcm9uID0gMHgxZTM5OwogdC5sZWZ0YW5nbGVhYm92ZWNtYiA9IDB4MDMxYTsKIHQubGVmdHRhY2tiZWxvd2NtYiA9IDB4MDMxODsKIHQubGVzcyA9IDB4MDAzYzsKIHQubGVzc2VxdWFsID0gMHgyMjY0OwogdC5sZXNzZXF1YWxvcmdyZWF0ZXIgPSAweDIyZGE7CiB0Lmxlc3Ntb25vc3BhY2UgPSAweGZmMWM7CiB0Lmxlc3NvcmVxdWl2YWxlbnQgPSAweDIyNzI7CiB0Lmxlc3NvcmdyZWF0ZXIgPSAweDIyNzY7CiB0Lmxlc3NvdmVyZXF1YWwgPSAweDIyNjY7CiB0Lmxlc3NzbWFsbCA9IDB4ZmU2NDsKIHQubGV6aCA9IDB4MDI2ZTsKIHQubGZibG9jayA9IDB4MjU4YzsKIHQubGhvb2tyZXRyb2ZsZXggPSAweDAyNmQ7CiB0LmxpcmEgPSAweDIwYTQ7CiB0Lmxpd25hcm1lbmlhbiA9IDB4MDU2YzsKIHQubGogPSAweDAxYzk7CiB0LmxqZWN5cmlsbGljID0gMHgwNDU5OwogdC5sbCA9IDB4ZjZjMDsKIHQubGxhZGV2YSA9IDB4MDkzMzsKIHQubGxhZ3VqYXJhdGkgPSAweDBhYjM7CiB0LmxsaW5lYmVsb3cgPSAweDFlM2I7CiB0LmxsbGFkZXZhID0gMHgwOTM0OwogdC5sbHZvY2FsaWNiZW5nYWxpID0gMHgwOWUxOwogdC5sbHZvY2FsaWNkZXZhID0gMHgwOTYxOwogdC5sbHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUzOwogdC5sbHZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTYzOwogdC5sbWlkZGxldGlsZGUgPSAweDAyNmI7CiB0Lmxtb25vc3BhY2UgPSAweGZmNGM7CiB0Lmxtc3F1YXJlID0gMHgzM2QwOwogdC5sb2NodWxhdGhhaSA9IDB4MGUyYzsKIHQubG9naWNhbGFuZCA9IDB4MjIyNzsKIHQubG9naWNhbG5vdCA9IDB4MDBhYzsKIHQubG9naWNhbG5vdHJldmVyc2VkID0gMHgyMzEwOwogdC5sb2dpY2Fsb3IgPSAweDIyMjg7CiB0LmxvbGluZ3RoYWkgPSAweDBlMjU7CiB0LmxvbmdzID0gMHgwMTdmOwogdC5sb3dsaW5lY2VudGVybGluZSA9IDB4ZmU0ZTsKIHQubG93bGluZWNtYiA9IDB4MDMzMjsKIHQubG93bGluZWRhc2hlZCA9IDB4ZmU0ZDsKIHQubG96ZW5nZSA9IDB4MjVjYTsKIHQubHBhcmVuID0gMHgyNGE3OwogdC5sc2xhc2ggPSAweDAxNDI7CiB0LmxzcXVhcmUgPSAweDIxMTM7CiB0LmxzdXBlcmlvciA9IDB4ZjZlZTsKIHQubHRzaGFkZSA9IDB4MjU5MTsKIHQubHV0aGFpID0gMHgwZTI2OwogdC5sdm9jYWxpY2JlbmdhbGkgPSAweDA5OGM7CiB0Lmx2b2NhbGljZGV2YSA9IDB4MDkwYzsKIHQubHZvY2FsaWN2b3dlbHNpZ25iZW5nYWxpID0gMHgwOWUyOwogdC5sdm9jYWxpY3Zvd2Vsc2lnbmRldmEgPSAweDA5NjI7CiB0Lmx4c3F1YXJlID0gMHgzM2QzOwogdC5tID0gMHgwMDZkOwogdC5tYWJlbmdhbGkgPSAweDA5YWU7CiB0Lm1hY3JvbiA9IDB4MDBhZjsKIHQubWFjcm9uYmVsb3djbWIgPSAweDAzMzE7CiB0Lm1hY3JvbmNtYiA9IDB4MDMwNDsKIHQubWFjcm9ubG93bW9kID0gMHgwMmNkOwogdC5tYWNyb25tb25vc3BhY2UgPSAweGZmZTM7CiB0Lm1hY3V0ZSA9IDB4MWUzZjsKIHQubWFkZXZhID0gMHgwOTJlOwogdC5tYWd1amFyYXRpID0gMHgwYWFlOwogdC5tYWd1cm11a2hpID0gMHgwYTJlOwogdC5tYWhhcGFraGhlYnJldyA9IDB4MDVhNDsKIHQubWFoYXBha2hsZWZ0aGVicmV3ID0gMHgwNWE0OwogdC5tYWhpcmFnYW5hID0gMHgzMDdlOwogdC5tYWljaGF0dGF3YWxvd2xlZnR0aGFpID0gMHhmODk1OwogdC5tYWljaGF0dGF3YWxvd3JpZ2h0dGhhaSA9IDB4Zjg5NDsKIHQubWFpY2hhdHRhd2F0aGFpID0gMHgwZTRiOwogdC5tYWljaGF0dGF3YXVwcGVybGVmdHRoYWkgPSAweGY4OTM7CiB0Lm1haWVrbG93bGVmdHRoYWkgPSAweGY4OGM7CiB0Lm1haWVrbG93cmlnaHR0aGFpID0gMHhmODhiOwogdC5tYWlla3RoYWkgPSAweDBlNDg7CiB0Lm1haWVrdXBwZXJsZWZ0dGhhaSA9IDB4Zjg4YTsKIHQubWFpaGFuYWthdGxlZnR0aGFpID0gMHhmODg0OwogdC5tYWloYW5ha2F0dGhhaSA9IDB4MGUzMTsKIHQubWFpdGFpa2h1bGVmdHRoYWkgPSAweGY4ODk7CiB0Lm1haXRhaWtodXRoYWkgPSAweDBlNDc7CiB0Lm1haXRob2xvd2xlZnR0aGFpID0gMHhmODhmOwogdC5tYWl0aG9sb3dyaWdodHRoYWkgPSAweGY4OGU7CiB0Lm1haXRob3RoYWkgPSAweDBlNDk7CiB0Lm1haXRob3VwcGVybGVmdHRoYWkgPSAweGY4OGQ7CiB0Lm1haXRyaWxvd2xlZnR0aGFpID0gMHhmODkyOwogdC5tYWl0cmlsb3dyaWdodHRoYWkgPSAweGY4OTE7CiB0Lm1haXRyaXRoYWkgPSAweDBlNGE7CiB0Lm1haXRyaXVwcGVybGVmdHRoYWkgPSAweGY4OTA7CiB0Lm1haXlhbW9rdGhhaSA9IDB4MGU0NjsKIHQubWFrYXRha2FuYSA9IDB4MzBkZTsKIHQubWFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4ZjsKIHQubWFsZSA9IDB4MjY0MjsKIHQubWFuc3lvbnNxdWFyZSA9IDB4MzM0NzsKIHQubWFxYWZoZWJyZXcgPSAweDA1YmU7CiB0Lm1hcnMgPSAweDI2NDI7CiB0Lm1hc29yYWNpcmNsZWhlYnJldyA9IDB4MDVhZjsKIHQubWFzcXVhcmUgPSAweDMzODM7CiB0Lm1ib3BvbW9mbyA9IDB4MzEwNzsKIHQubWJzcXVhcmUgPSAweDMzZDQ7CiB0Lm1jaXJjbGUgPSAweDI0ZGM7CiB0Lm1jdWJlZHNxdWFyZSA9IDB4MzNhNTsKIHQubWRvdGFjY2VudCA9IDB4MWU0MTsKIHQubWRvdGJlbG93ID0gMHgxZTQzOwogdC5tZWVtYXJhYmljID0gMHgwNjQ1OwogdC5tZWVtZmluYWxhcmFiaWMgPSAweGZlZTI7CiB0Lm1lZW1pbml0aWFsYXJhYmljID0gMHhmZWUzOwogdC5tZWVtbWVkaWFsYXJhYmljID0gMHhmZWU0OwogdC5tZWVtbWVlbWluaXRpYWxhcmFiaWMgPSAweGZjZDE7CiB0Lm1lZW1tZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNDg7CiB0Lm1lZXRvcnVzcXVhcmUgPSAweDMzNGQ7CiB0Lm1laGlyYWdhbmEgPSAweDMwODE7CiB0Lm1laXppZXJhc3F1YXJlID0gMHgzMzdlOwogdC5tZWthdGFrYW5hID0gMHgzMGUxOwogdC5tZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjkyOwogdC5tZW0gPSAweDA1ZGU7CiB0Lm1lbWRhZ2VzaCA9IDB4ZmIzZTsKIHQubWVtZGFnZXNoaGVicmV3ID0gMHhmYjNlOwogdC5tZW1oZWJyZXcgPSAweDA1ZGU7CiB0Lm1lbmFybWVuaWFuID0gMHgwNTc0OwogdC5tZXJraGFoZWJyZXcgPSAweDA1YTU7CiB0Lm1lcmtoYWtlZnVsYWhlYnJldyA9IDB4MDVhNjsKIHQubWVya2hha2VmdWxhbGVmdGhlYnJldyA9IDB4MDVhNjsKIHQubWVya2hhbGVmdGhlYnJldyA9IDB4MDVhNTsKIHQubWhvb2sgPSAweDAyNzE7CiB0Lm1oenNxdWFyZSA9IDB4MzM5MjsKIHQubWlkZGxlZG90a2F0YWthbmFoYWxmd2lkdGggPSAweGZmNjU7CiB0Lm1pZGRvdCA9IDB4MDBiNzsKIHQubWlldW1hY2lyY2xla29yZWFuID0gMHgzMjcyOwogdC5taWV1bWFwYXJlbmtvcmVhbiA9IDB4MzIxMjsKIHQubWlldW1jaXJjbGVrb3JlYW4gPSAweDMyNjQ7CiB0Lm1pZXVta29yZWFuID0gMHgzMTQxOwogdC5taWV1bXBhbnNpb3Nrb3JlYW4gPSAweDMxNzA7CiB0Lm1pZXVtcGFyZW5rb3JlYW4gPSAweDMyMDQ7CiB0Lm1pZXVtcGlldXBrb3JlYW4gPSAweDMxNmU7CiB0Lm1pZXVtc2lvc2tvcmVhbiA9IDB4MzE2ZjsKIHQubWloaXJhZ2FuYSA9IDB4MzA3ZjsKIHQubWlrYXRha2FuYSA9IDB4MzBkZjsKIHQubWlrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MDsKIHQubWludXMgPSAweDIyMTI7CiB0Lm1pbnVzYmVsb3djbWIgPSAweDAzMjA7CiB0Lm1pbnVzY2lyY2xlID0gMHgyMjk2OwogdC5taW51c21vZCA9IDB4MDJkNzsKIHQubWludXNwbHVzID0gMHgyMjEzOwogdC5taW51dGUgPSAweDIwMzI7CiB0Lm1pcmliYWFydXNxdWFyZSA9IDB4MzM0YTsKIHQubWlyaXNxdWFyZSA9IDB4MzM0OTsKIHQubWxvbmdsZWd0dXJuZWQgPSAweDAyNzA7CiB0Lm1sc3F1YXJlID0gMHgzMzk2OwogdC5tbWN1YmVkc3F1YXJlID0gMHgzM2EzOwogdC5tbW9ub3NwYWNlID0gMHhmZjRkOwogdC5tbXNxdWFyZWRzcXVhcmUgPSAweDMzOWY7CiB0Lm1vaGlyYWdhbmEgPSAweDMwODI7CiB0Lm1vaG1zcXVhcmUgPSAweDMzYzE7CiB0Lm1va2F0YWthbmEgPSAweDMwZTI7CiB0Lm1va2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTM7CiB0Lm1vbHNxdWFyZSA9IDB4MzNkNjsKIHQubW9tYXRoYWkgPSAweDBlMjE7CiB0Lm1vdmVyc3NxdWFyZSA9IDB4MzNhNzsKIHQubW92ZXJzc3F1YXJlZHNxdWFyZSA9IDB4MzNhODsKIHQubXBhcmVuID0gMHgyNGE4OwogdC5tcGFzcXVhcmUgPSAweDMzYWI7CiB0Lm1zc3F1YXJlID0gMHgzM2IzOwogdC5tc3VwZXJpb3IgPSAweGY2ZWY7CiB0Lm10dXJuZWQgPSAweDAyNmY7CiB0Lm11ID0gMHgwMGI1OwogdC5tdTEgPSAweDAwYjU7CiB0Lm11YXNxdWFyZSA9IDB4MzM4MjsKIHQubXVjaGdyZWF0ZXIgPSAweDIyNmI7CiB0Lm11Y2hsZXNzID0gMHgyMjZhOwogdC5tdWZzcXVhcmUgPSAweDMzOGM7CiB0Lm11Z3JlZWsgPSAweDAzYmM7CiB0Lm11Z3NxdWFyZSA9IDB4MzM4ZDsKIHQubXVoaXJhZ2FuYSA9IDB4MzA4MDsKIHQubXVrYXRha2FuYSA9IDB4MzBlMDsKIHQubXVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5MTsKIHQubXVsc3F1YXJlID0gMHgzMzk1OwogdC5tdWx0aXBseSA9IDB4MDBkNzsKIHQubXVtc3F1YXJlID0gMHgzMzliOwogdC5tdW5haGhlYnJldyA9IDB4MDVhMzsKIHQubXVuYWhsZWZ0aGVicmV3ID0gMHgwNWEzOwogdC5tdXNpY2Fsbm90ZSA9IDB4MjY2YTsKIHQubXVzaWNhbG5vdGVkYmwgPSAweDI2NmI7CiB0Lm11c2ljZmxhdHNpZ24gPSAweDI2NmQ7CiB0Lm11c2ljc2hhcnBzaWduID0gMHgyNjZmOwogdC5tdXNzcXVhcmUgPSAweDMzYjI7CiB0Lm11dnNxdWFyZSA9IDB4MzNiNjsKIHQubXV3c3F1YXJlID0gMHgzM2JjOwogdC5tdm1lZ2FzcXVhcmUgPSAweDMzYjk7CiB0Lm12c3F1YXJlID0gMHgzM2I3OwogdC5td21lZ2FzcXVhcmUgPSAweDMzYmY7CiB0Lm13c3F1YXJlID0gMHgzM2JkOwogdC5uID0gMHgwMDZlOwogdC5uYWJlbmdhbGkgPSAweDA5YTg7CiB0Lm5hYmxhID0gMHgyMjA3OwogdC5uYWN1dGUgPSAweDAxNDQ7CiB0Lm5hZGV2YSA9IDB4MDkyODsKIHQubmFndWphcmF0aSA9IDB4MGFhODsKIHQubmFndXJtdWtoaSA9IDB4MGEyODsKIHQubmFoaXJhZ2FuYSA9IDB4MzA2YTsKIHQubmFrYXRha2FuYSA9IDB4MzBjYTsKIHQubmFrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NTsKIHQubmFwb3N0cm9waGUgPSAweDAxNDk7CiB0Lm5hc3F1YXJlID0gMHgzMzgxOwogdC5uYm9wb21vZm8gPSAweDMxMGI7CiB0Lm5ic3BhY2UgPSAweDAwYTA7CiB0Lm5jYXJvbiA9IDB4MDE0ODsKIHQubmNlZGlsbGEgPSAweDAxNDY7CiB0Lm5jaXJjbGUgPSAweDI0ZGQ7CiB0Lm5jaXJjdW1mbGV4YmVsb3cgPSAweDFlNGI7CiB0Lm5jb21tYWFjY2VudCA9IDB4MDE0NjsKIHQubmRvdGFjY2VudCA9IDB4MWU0NTsKIHQubmRvdGJlbG93ID0gMHgxZTQ3OwogdC5uZWhpcmFnYW5hID0gMHgzMDZkOwogdC5uZWthdGFrYW5hID0gMHgzMGNkOwogdC5uZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg4OwogdC5uZXdzaGVxZWxzaWduID0gMHgyMGFhOwogdC5uZnNxdWFyZSA9IDB4MzM4YjsKIHQubmdhYmVuZ2FsaSA9IDB4MDk5OTsKIHQubmdhZGV2YSA9IDB4MDkxOTsKIHQubmdhZ3VqYXJhdGkgPSAweDBhOTk7CiB0Lm5nYWd1cm11a2hpID0gMHgwYTE5OwogdC5uZ29uZ3V0aGFpID0gMHgwZTA3OwogdC5uaGlyYWdhbmEgPSAweDMwOTM7CiB0Lm5ob29rbGVmdCA9IDB4MDI3MjsKIHQubmhvb2tyZXRyb2ZsZXggPSAweDAyNzM7CiB0Lm5pZXVuYWNpcmNsZWtvcmVhbiA9IDB4MzI2ZjsKIHQubmlldW5hcGFyZW5rb3JlYW4gPSAweDMyMGY7CiB0Lm5pZXVuY2lldWNrb3JlYW4gPSAweDMxMzU7CiB0Lm5pZXVuY2lyY2xla29yZWFuID0gMHgzMjYxOwogdC5uaWV1bmhpZXVoa29yZWFuID0gMHgzMTM2OwogdC5uaWV1bmtvcmVhbiA9IDB4MzEzNDsKIHQubmlldW5wYW5zaW9za29yZWFuID0gMHgzMTY4OwogdC5uaWV1bnBhcmVua29yZWFuID0gMHgzMjAxOwogdC5uaWV1bnNpb3Nrb3JlYW4gPSAweDMxNjc7CiB0Lm5pZXVudGlrZXV0a29yZWFuID0gMHgzMTY2OwogdC5uaWhpcmFnYW5hID0gMHgzMDZiOwogdC5uaWthdGFrYW5hID0gMHgzMGNiOwogdC5uaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg2OwogdC5uaWtoYWhpdGxlZnR0aGFpID0gMHhmODk5OwogdC5uaWtoYWhpdHRoYWkgPSAweDBlNGQ7CiB0Lm5pbmUgPSAweDAwMzk7CiB0Lm5pbmVhcmFiaWMgPSAweDA2Njk7CiB0Lm5pbmViZW5nYWxpID0gMHgwOWVmOwogdC5uaW5lY2lyY2xlID0gMHgyNDY4OwogdC5uaW5lY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MjsKIHQubmluZWRldmEgPSAweDA5NmY7CiB0Lm5pbmVndWphcmF0aSA9IDB4MGFlZjsKIHQubmluZWd1cm11a2hpID0gMHgwYTZmOwogdC5uaW5laGFja2FyYWJpYyA9IDB4MDY2OTsKIHQubmluZWhhbmd6aG91ID0gMHgzMDI5OwogdC5uaW5laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyODsKIHQubmluZWluZmVyaW9yID0gMHgyMDg5OwogdC5uaW5lbW9ub3NwYWNlID0gMHhmZjE5OwogdC5uaW5lb2xkc3R5bGUgPSAweGY3Mzk7CiB0Lm5pbmVwYXJlbiA9IDB4MjQ3YzsKIHQubmluZXBlcmlvZCA9IDB4MjQ5MDsKIHQubmluZXBlcnNpYW4gPSAweDA2Zjk7CiB0Lm5pbmVyb21hbiA9IDB4MjE3ODsKIHQubmluZXN1cGVyaW9yID0gMHgyMDc5OwogdC5uaW5ldGVlbmNpcmNsZSA9IDB4MjQ3MjsKIHQubmluZXRlZW5wYXJlbiA9IDB4MjQ4NjsKIHQubmluZXRlZW5wZXJpb2QgPSAweDI0OWE7CiB0Lm5pbmV0aGFpID0gMHgwZTU5OwogdC5uaiA9IDB4MDFjYzsKIHQubmplY3lyaWxsaWMgPSAweDA0NWE7CiB0Lm5rYXRha2FuYSA9IDB4MzBmMzsKIHQubmthdGFrYW5haGFsZndpZHRoID0gMHhmZjlkOwogdC5ubGVncmlnaHRsb25nID0gMHgwMTllOwogdC5ubGluZWJlbG93ID0gMHgxZTQ5OwogdC5ubW9ub3NwYWNlID0gMHhmZjRlOwogdC5ubXNxdWFyZSA9IDB4MzM5YTsKIHQubm5hYmVuZ2FsaSA9IDB4MDlhMzsKIHQubm5hZGV2YSA9IDB4MDkyMzsKIHQubm5hZ3VqYXJhdGkgPSAweDBhYTM7CiB0Lm5uYWd1cm11a2hpID0gMHgwYTIzOwogdC5ubm5hZGV2YSA9IDB4MDkyOTsKIHQubm9oaXJhZ2FuYSA9IDB4MzA2ZTsKIHQubm9rYXRha2FuYSA9IDB4MzBjZTsKIHQubm9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4OTsKIHQubm9uYnJlYWtpbmdzcGFjZSA9IDB4MDBhMDsKIHQubm9uZW50aGFpID0gMHgwZTEzOwogdC5ub251dGhhaSA9IDB4MGUxOTsKIHQubm9vbmFyYWJpYyA9IDB4MDY0NjsKIHQubm9vbmZpbmFsYXJhYmljID0gMHhmZWU2OwogdC5ub29uZ2h1bm5hYXJhYmljID0gMHgwNmJhOwogdC5ub29uZ2h1bm5hZmluYWxhcmFiaWMgPSAweGZiOWY7CiB0Lm5vb25pbml0aWFsYXJhYmljID0gMHhmZWU3OwogdC5ub29uamVlbWluaXRpYWxhcmFiaWMgPSAweGZjZDI7CiB0Lm5vb25qZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNGI7CiB0Lm5vb25tZWRpYWxhcmFiaWMgPSAweGZlZTg7CiB0Lm5vb25tZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNkNTsKIHQubm9vbm1lZW1pc29sYXRlZGFyYWJpYyA9IDB4ZmM0ZTsKIHQubm9vbm5vb25maW5hbGFyYWJpYyA9IDB4ZmM4ZDsKIHQubm90Y29udGFpbnMgPSAweDIyMGM7CiB0Lm5vdGVsZW1lbnQgPSAweDIyMDk7CiB0Lm5vdGVsZW1lbnRvZiA9IDB4MjIwOTsKIHQubm90ZXF1YWwgPSAweDIyNjA7CiB0Lm5vdGdyZWF0ZXIgPSAweDIyNmY7CiB0Lm5vdGdyZWF0ZXJub3JlcXVhbCA9IDB4MjI3MTsKIHQubm90Z3JlYXRlcm5vcmxlc3MgPSAweDIyNzk7CiB0Lm5vdGlkZW50aWNhbCA9IDB4MjI2MjsKIHQubm90bGVzcyA9IDB4MjI2ZTsKIHQubm90bGVzc25vcmVxdWFsID0gMHgyMjcwOwogdC5ub3RwYXJhbGxlbCA9IDB4MjIyNjsKIHQubm90cHJlY2VkZXMgPSAweDIyODA7CiB0Lm5vdHN1YnNldCA9IDB4MjI4NDsKIHQubm90c3VjY2VlZHMgPSAweDIyODE7CiB0Lm5vdHN1cGVyc2V0ID0gMHgyMjg1OwogdC5ub3dhcm1lbmlhbiA9IDB4MDU3NjsKIHQubnBhcmVuID0gMHgyNGE5OwogdC5uc3NxdWFyZSA9IDB4MzNiMTsKIHQubnN1cGVyaW9yID0gMHgyMDdmOwogdC5udGlsZGUgPSAweDAwZjE7CiB0Lm51ID0gMHgwM2JkOwogdC5udWhpcmFnYW5hID0gMHgzMDZjOwogdC5udWthdGFrYW5hID0gMHgzMGNjOwogdC5udWthdGFrYW5haGFsZndpZHRoID0gMHhmZjg3OwogdC5udWt0YWJlbmdhbGkgPSAweDA5YmM7CiB0Lm51a3RhZGV2YSA9IDB4MDkzYzsKIHQubnVrdGFndWphcmF0aSA9IDB4MGFiYzsKIHQubnVrdGFndXJtdWtoaSA9IDB4MGEzYzsKIHQubnVtYmVyc2lnbiA9IDB4MDAyMzsKIHQubnVtYmVyc2lnbm1vbm9zcGFjZSA9IDB4ZmYwMzsKIHQubnVtYmVyc2lnbnNtYWxsID0gMHhmZTVmOwogdC5udW1lcmFsc2lnbmdyZWVrID0gMHgwMzc0OwogdC5udW1lcmFsc2lnbmxvd2VyZ3JlZWsgPSAweDAzNzU7CiB0Lm51bWVybyA9IDB4MjExNjsKIHQubnVuID0gMHgwNWUwOwogdC5udW5kYWdlc2ggPSAweGZiNDA7CiB0Lm51bmRhZ2VzaGhlYnJldyA9IDB4ZmI0MDsKIHQubnVuaGVicmV3ID0gMHgwNWUwOwogdC5udnNxdWFyZSA9IDB4MzNiNTsKIHQubndzcXVhcmUgPSAweDMzYmI7CiB0Lm55YWJlbmdhbGkgPSAweDA5OWU7CiB0Lm55YWRldmEgPSAweDA5MWU7CiB0Lm55YWd1amFyYXRpID0gMHgwYTllOwogdC5ueWFndXJtdWtoaSA9IDB4MGExZTsKIHQubyA9IDB4MDA2ZjsKIHQub2FjdXRlID0gMHgwMGYzOwogdC5vYW5ndGhhaSA9IDB4MGUyZDsKIHQub2JhcnJlZCA9IDB4MDI3NTsKIHQub2JhcnJlZGN5cmlsbGljID0gMHgwNGU5OwogdC5vYmFycmVkZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRlYjsKIHQub2JlbmdhbGkgPSAweDA5OTM7CiB0Lm9ib3BvbW9mbyA9IDB4MzExYjsKIHQub2JyZXZlID0gMHgwMTRmOwogdC5vY2FuZHJhZGV2YSA9IDB4MDkxMTsKIHQub2NhbmRyYWd1amFyYXRpID0gMHgwYTkxOwogdC5vY2FuZHJhdm93ZWxzaWduZGV2YSA9IDB4MDk0OTsKIHQub2NhbmRyYXZvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWM5OwogdC5vY2Fyb24gPSAweDAxZDI7CiB0Lm9jaXJjbGUgPSAweDI0ZGU7CiB0Lm9jaXJjdW1mbGV4ID0gMHgwMGY0OwogdC5vY2lyY3VtZmxleGFjdXRlID0gMHgxZWQxOwogdC5vY2lyY3VtZmxleGRvdGJlbG93ID0gMHgxZWQ5OwogdC5vY2lyY3VtZmxleGdyYXZlID0gMHgxZWQzOwogdC5vY2lyY3VtZmxleGhvb2thYm92ZSA9IDB4MWVkNTsKIHQub2NpcmN1bWZsZXh0aWxkZSA9IDB4MWVkNzsKIHQub2N5cmlsbGljID0gMHgwNDNlOwogdC5vZGJsYWN1dGUgPSAweDAxNTE7CiB0Lm9kYmxncmF2ZSA9IDB4MDIwZDsKIHQub2RldmEgPSAweDA5MTM7CiB0Lm9kaWVyZXNpcyA9IDB4MDBmNjsKIHQub2RpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZTc7CiB0Lm9kb3RiZWxvdyA9IDB4MWVjZDsKIHQub2UgPSAweDAxNTM7CiB0Lm9la29yZWFuID0gMHgzMTVhOwogdC5vZ29uZWsgPSAweDAyZGI7CiB0Lm9nb25la2NtYiA9IDB4MDMyODsKIHQub2dyYXZlID0gMHgwMGYyOwogdC5vZ3VqYXJhdGkgPSAweDBhOTM7CiB0Lm9oYXJtZW5pYW4gPSAweDA1ODU7CiB0Lm9oaXJhZ2FuYSA9IDB4MzA0YTsKIHQub2hvb2thYm92ZSA9IDB4MWVjZjsKIHQub2hvcm4gPSAweDAxYTE7CiB0Lm9ob3JuYWN1dGUgPSAweDFlZGI7CiB0Lm9ob3JuZG90YmVsb3cgPSAweDFlZTM7CiB0Lm9ob3JuZ3JhdmUgPSAweDFlZGQ7CiB0Lm9ob3JuaG9va2Fib3ZlID0gMHgxZWRmOwogdC5vaG9ybnRpbGRlID0gMHgxZWUxOwogdC5vaHVuZ2FydW1sYXV0ID0gMHgwMTUxOwogdC5vaSA9IDB4MDFhMzsKIHQub2ludmVydGVkYnJldmUgPSAweDAyMGY7CiB0Lm9rYXRha2FuYSA9IDB4MzBhYTsKIHQub2thdGFrYW5haGFsZndpZHRoID0gMHhmZjc1OwogdC5va29yZWFuID0gMHgzMTU3OwogdC5vbGVoZWJyZXcgPSAweDA1YWI7CiB0Lm9tYWNyb24gPSAweDAxNGQ7CiB0Lm9tYWNyb25hY3V0ZSA9IDB4MWU1MzsKIHQub21hY3JvbmdyYXZlID0gMHgxZTUxOwogdC5vbWRldmEgPSAweDA5NTA7CiB0Lm9tZWdhID0gMHgwM2M5OwogdC5vbWVnYTEgPSAweDAzZDY7CiB0Lm9tZWdhY3lyaWxsaWMgPSAweDA0NjE7CiB0Lm9tZWdhbGF0aW5jbG9zZWQgPSAweDAyNzc7CiB0Lm9tZWdhcm91bmRjeXJpbGxpYyA9IDB4MDQ3YjsKIHQub21lZ2F0aXRsb2N5cmlsbGljID0gMHgwNDdkOwogdC5vbWVnYXRvbm9zID0gMHgwM2NlOwogdC5vbWd1amFyYXRpID0gMHgwYWQwOwogdC5vbWljcm9uID0gMHgwM2JmOwogdC5vbWljcm9udG9ub3MgPSAweDAzY2M7CiB0Lm9tb25vc3BhY2UgPSAweGZmNGY7CiB0Lm9uZSA9IDB4MDAzMTsKIHQub25lYXJhYmljID0gMHgwNjYxOwogdC5vbmViZW5nYWxpID0gMHgwOWU3OwogdC5vbmVjaXJjbGUgPSAweDI0NjA7CiB0Lm9uZWNpcmNsZWludmVyc2VzYW5zc2VyaWYgPSAweDI3OGE7CiB0Lm9uZWRldmEgPSAweDA5Njc7CiB0Lm9uZWRvdGVubGVhZGVyID0gMHgyMDI0OwogdC5vbmVlaWdodGggPSAweDIxNWI7CiB0Lm9uZWZpdHRlZCA9IDB4ZjZkYzsKIHQub25lZ3VqYXJhdGkgPSAweDBhZTc7CiB0Lm9uZWd1cm11a2hpID0gMHgwYTY3OwogdC5vbmVoYWNrYXJhYmljID0gMHgwNjYxOwogdC5vbmVoYWxmID0gMHgwMGJkOwogdC5vbmVoYW5nemhvdSA9IDB4MzAyMTsKIHQub25laWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyMDsKIHQub25laW5mZXJpb3IgPSAweDIwODE7CiB0Lm9uZW1vbm9zcGFjZSA9IDB4ZmYxMTsKIHQub25lbnVtZXJhdG9yYmVuZ2FsaSA9IDB4MDlmNDsKIHQub25lb2xkc3R5bGUgPSAweGY3MzE7CiB0Lm9uZXBhcmVuID0gMHgyNDc0OwogdC5vbmVwZXJpb2QgPSAweDI0ODg7CiB0Lm9uZXBlcnNpYW4gPSAweDA2ZjE7CiB0Lm9uZXF1YXJ0ZXIgPSAweDAwYmM7CiB0Lm9uZXJvbWFuID0gMHgyMTcwOwogdC5vbmVzdXBlcmlvciA9IDB4MDBiOTsKIHQub25ldGhhaSA9IDB4MGU1MTsKIHQub25ldGhpcmQgPSAweDIxNTM7CiB0Lm9vZ29uZWsgPSAweDAxZWI7CiB0Lm9vZ29uZWttYWNyb24gPSAweDAxZWQ7CiB0Lm9vZ3VybXVraGkgPSAweDBhMTM7CiB0Lm9vbWF0cmFndXJtdWtoaSA9IDB4MGE0YjsKIHQub29wZW4gPSAweDAyNTQ7CiB0Lm9wYXJlbiA9IDB4MjRhYTsKIHQub3BlbmJ1bGxldCA9IDB4MjVlNjsKIHQub3B0aW9uID0gMHgyMzI1OwogdC5vcmRmZW1pbmluZSA9IDB4MDBhYTsKIHQub3JkbWFzY3VsaW5lID0gMHgwMGJhOwogdC5vcnRob2dvbmFsID0gMHgyMjFmOwogdC5vc2hvcnRkZXZhID0gMHgwOTEyOwogdC5vc2hvcnR2b3dlbHNpZ25kZXZhID0gMHgwOTRhOwogdC5vc2xhc2ggPSAweDAwZjg7CiB0Lm9zbGFzaGFjdXRlID0gMHgwMWZmOwogdC5vc21hbGxoaXJhZ2FuYSA9IDB4MzA0OTsKIHQub3NtYWxsa2F0YWthbmEgPSAweDMwYTk7CiB0Lm9zbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZiOwogdC5vc3Ryb2tlYWN1dGUgPSAweDAxZmY7CiB0Lm9zdXBlcmlvciA9IDB4ZjZmMDsKIHQub3RjeXJpbGxpYyA9IDB4MDQ3ZjsKIHQub3RpbGRlID0gMHgwMGY1OwogdC5vdGlsZGVhY3V0ZSA9IDB4MWU0ZDsKIHQub3RpbGRlZGllcmVzaXMgPSAweDFlNGY7CiB0Lm91Ym9wb21vZm8gPSAweDMxMjE7CiB0Lm92ZXJsaW5lID0gMHgyMDNlOwogdC5vdmVybGluZWNlbnRlcmxpbmUgPSAweGZlNGE7CiB0Lm92ZXJsaW5lY21iID0gMHgwMzA1OwogdC5vdmVybGluZWRhc2hlZCA9IDB4ZmU0OTsKIHQub3ZlcmxpbmVkYmx3YXZ5ID0gMHhmZTRjOwogdC5vdmVybGluZXdhdnkgPSAweGZlNGI7CiB0Lm92ZXJzY29yZSA9IDB4MDBhZjsKIHQub3Zvd2Vsc2lnbmJlbmdhbGkgPSAweDA5Y2I7CiB0Lm92b3dlbHNpZ25kZXZhID0gMHgwOTRiOwogdC5vdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhY2I7CiB0LnAgPSAweDAwNzA7CiB0LnBhYW1wc3NxdWFyZSA9IDB4MzM4MDsKIHQucGFhc2VudG9zcXVhcmUgPSAweDMzMmI7CiB0LnBhYmVuZ2FsaSA9IDB4MDlhYTsKIHQucGFjdXRlID0gMHgxZTU1OwogdC5wYWRldmEgPSAweDA5MmE7CiB0LnBhZ2Vkb3duID0gMHgyMWRmOwogdC5wYWdldXAgPSAweDIxZGU7CiB0LnBhZ3VqYXJhdGkgPSAweDBhYWE7CiB0LnBhZ3VybXVraGkgPSAweDBhMmE7CiB0LnBhaGlyYWdhbmEgPSAweDMwNzE7CiB0LnBhaXlhbm5vaXRoYWkgPSAweDBlMmY7CiB0LnBha2F0YWthbmEgPSAweDMwZDE7CiB0LnBhbGF0YWxpemF0aW9uY3lyaWxsaWNjbWIgPSAweDA0ODQ7CiB0LnBhbG9jaGthY3lyaWxsaWMgPSAweDA0YzA7CiB0LnBhbnNpb3Nrb3JlYW4gPSAweDMxN2Y7CiB0LnBhcmFncmFwaCA9IDB4MDBiNjsKIHQucGFyYWxsZWwgPSAweDIyMjU7CiB0LnBhcmVubGVmdCA9IDB4MDAyODsKIHQucGFyZW5sZWZ0YWx0b25lYXJhYmljID0gMHhmZDNlOwogdC5wYXJlbmxlZnRidCA9IDB4ZjhlZDsKIHQucGFyZW5sZWZ0ZXggPSAweGY4ZWM7CiB0LnBhcmVubGVmdGluZmVyaW9yID0gMHgyMDhkOwogdC5wYXJlbmxlZnRtb25vc3BhY2UgPSAweGZmMDg7CiB0LnBhcmVubGVmdHNtYWxsID0gMHhmZTU5OwogdC5wYXJlbmxlZnRzdXBlcmlvciA9IDB4MjA3ZDsKIHQucGFyZW5sZWZ0dHAgPSAweGY4ZWI7CiB0LnBhcmVubGVmdHZlcnRpY2FsID0gMHhmZTM1OwogdC5wYXJlbnJpZ2h0ID0gMHgwMDI5OwogdC5wYXJlbnJpZ2h0YWx0b25lYXJhYmljID0gMHhmZDNmOwogdC5wYXJlbnJpZ2h0YnQgPSAweGY4Zjg7CiB0LnBhcmVucmlnaHRleCA9IDB4ZjhmNzsKIHQucGFyZW5yaWdodGluZmVyaW9yID0gMHgyMDhlOwogdC5wYXJlbnJpZ2h0bW9ub3NwYWNlID0gMHhmZjA5OwogdC5wYXJlbnJpZ2h0c21hbGwgPSAweGZlNWE7CiB0LnBhcmVucmlnaHRzdXBlcmlvciA9IDB4MjA3ZTsKIHQucGFyZW5yaWdodHRwID0gMHhmOGY2OwogdC5wYXJlbnJpZ2h0dmVydGljYWwgPSAweGZlMzY7CiB0LnBhcnRpYWxkaWZmID0gMHgyMjAyOwogdC5wYXNlcWhlYnJldyA9IDB4MDVjMDsKIHQucGFzaHRhaGVicmV3ID0gMHgwNTk5OwogdC5wYXNxdWFyZSA9IDB4MzNhOTsKIHQucGF0YWggPSAweDA1Yjc7CiB0LnBhdGFoMTEgPSAweDA1Yjc7CiB0LnBhdGFoMWQgPSAweDA1Yjc7CiB0LnBhdGFoMmEgPSAweDA1Yjc7CiB0LnBhdGFoaGVicmV3ID0gMHgwNWI3OwogdC5wYXRhaG5hcnJvd2hlYnJldyA9IDB4MDViNzsKIHQucGF0YWhxdWFydGVyaGVicmV3ID0gMHgwNWI3OwogdC5wYXRhaHdpZGVoZWJyZXcgPSAweDA1Yjc7CiB0LnBhemVyaGVicmV3ID0gMHgwNWExOwogdC5wYm9wb21vZm8gPSAweDMxMDY7CiB0LnBjaXJjbGUgPSAweDI0ZGY7CiB0LnBkb3RhY2NlbnQgPSAweDFlNTc7CiB0LnBlID0gMHgwNWU0OwogdC5wZWN5cmlsbGljID0gMHgwNDNmOwogdC5wZWRhZ2VzaCA9IDB4ZmI0NDsKIHQucGVkYWdlc2hoZWJyZXcgPSAweGZiNDQ7CiB0LnBlZXppc3F1YXJlID0gMHgzMzNiOwogdC5wZWZpbmFsZGFnZXNoaGVicmV3ID0gMHhmYjQzOwogdC5wZWhhcmFiaWMgPSAweDA2N2U7CiB0LnBlaGFybWVuaWFuID0gMHgwNTdhOwogdC5wZWhlYnJldyA9IDB4MDVlNDsKIHQucGVoZmluYWxhcmFiaWMgPSAweGZiNTc7CiB0LnBlaGluaXRpYWxhcmFiaWMgPSAweGZiNTg7CiB0LnBlaGlyYWdhbmEgPSAweDMwN2E7CiB0LnBlaG1lZGlhbGFyYWJpYyA9IDB4ZmI1OTsKIHQucGVrYXRha2FuYSA9IDB4MzBkYTsKIHQucGVtaWRkbGVob29rY3lyaWxsaWMgPSAweDA0YTc7CiB0LnBlcmFmZWhlYnJldyA9IDB4ZmI0ZTsKIHQucGVyY2VudCA9IDB4MDAyNTsKIHQucGVyY2VudGFyYWJpYyA9IDB4MDY2YTsKIHQucGVyY2VudG1vbm9zcGFjZSA9IDB4ZmYwNTsKIHQucGVyY2VudHNtYWxsID0gMHhmZTZhOwogdC5wZXJpb2QgPSAweDAwMmU7CiB0LnBlcmlvZGFybWVuaWFuID0gMHgwNTg5OwogdC5wZXJpb2RjZW50ZXJlZCA9IDB4MDBiNzsKIHQucGVyaW9kaGFsZndpZHRoID0gMHhmZjYxOwogdC5wZXJpb2RpbmZlcmlvciA9IDB4ZjZlNzsKIHQucGVyaW9kbW9ub3NwYWNlID0gMHhmZjBlOwogdC5wZXJpb2RzbWFsbCA9IDB4ZmU1MjsKIHQucGVyaW9kc3VwZXJpb3IgPSAweGY2ZTg7CiB0LnBlcmlzcG9tZW5pZ3JlZWtjbWIgPSAweDAzNDI7CiB0LnBlcnBlbmRpY3VsYXIgPSAweDIyYTU7CiB0LnBlcnRob3VzYW5kID0gMHgyMDMwOwogdC5wZXNldGEgPSAweDIwYTc7CiB0LnBmc3F1YXJlID0gMHgzMzhhOwogdC5waGFiZW5nYWxpID0gMHgwOWFiOwogdC5waGFkZXZhID0gMHgwOTJiOwogdC5waGFndWphcmF0aSA9IDB4MGFhYjsKIHQucGhhZ3VybXVraGkgPSAweDBhMmI7CiB0LnBoaSA9IDB4MDNjNjsKIHQucGhpMSA9IDB4MDNkNTsKIHQucGhpZXVwaGFjaXJjbGVrb3JlYW4gPSAweDMyN2E7CiB0LnBoaWV1cGhhcGFyZW5rb3JlYW4gPSAweDMyMWE7CiB0LnBoaWV1cGhjaXJjbGVrb3JlYW4gPSAweDMyNmM7CiB0LnBoaWV1cGhrb3JlYW4gPSAweDMxNGQ7CiB0LnBoaWV1cGhwYXJlbmtvcmVhbiA9IDB4MzIwYzsKIHQucGhpbGF0aW4gPSAweDAyNzg7CiB0LnBoaW50aHV0aGFpID0gMHgwZTNhOwogdC5waGlzeW1ib2xncmVlayA9IDB4MDNkNTsKIHQucGhvb2sgPSAweDAxYTU7CiB0LnBob3BoYW50aGFpID0gMHgwZTFlOwogdC5waG9waHVuZ3RoYWkgPSAweDBlMWM7CiB0LnBob3NhbXBoYW90aGFpID0gMHgwZTIwOwogdC5waSA9IDB4MDNjMDsKIHQucGlldXBhY2lyY2xla29yZWFuID0gMHgzMjczOwogdC5waWV1cGFwYXJlbmtvcmVhbiA9IDB4MzIxMzsKIHQucGlldXBjaWV1Y2tvcmVhbiA9IDB4MzE3NjsKIHQucGlldXBjaXJjbGVrb3JlYW4gPSAweDMyNjU7CiB0LnBpZXVwa2l5ZW9ra29yZWFuID0gMHgzMTcyOwogdC5waWV1cGtvcmVhbiA9IDB4MzE0MjsKIHQucGlldXBwYXJlbmtvcmVhbiA9IDB4MzIwNTsKIHQucGlldXBzaW9za2l5ZW9ra29yZWFuID0gMHgzMTc0OwogdC5waWV1cHNpb3Nrb3JlYW4gPSAweDMxNDQ7CiB0LnBpZXVwc2lvc3Rpa2V1dGtvcmVhbiA9IDB4MzE3NTsKIHQucGlldXB0aGlldXRoa29yZWFuID0gMHgzMTc3OwogdC5waWV1cHRpa2V1dGtvcmVhbiA9IDB4MzE3MzsKIHQucGloaXJhZ2FuYSA9IDB4MzA3NDsKIHQucGlrYXRha2FuYSA9IDB4MzBkNDsKIHQucGlzeW1ib2xncmVlayA9IDB4MDNkNjsKIHQucGl3cmFybWVuaWFuID0gMHgwNTgzOwogdC5wbHVzID0gMHgwMDJiOwogdC5wbHVzYmVsb3djbWIgPSAweDAzMWY7CiB0LnBsdXNjaXJjbGUgPSAweDIyOTU7CiB0LnBsdXNtaW51cyA9IDB4MDBiMTsKIHQucGx1c21vZCA9IDB4MDJkNjsKIHQucGx1c21vbm9zcGFjZSA9IDB4ZmYwYjsKIHQucGx1c3NtYWxsID0gMHhmZTYyOwogdC5wbHVzc3VwZXJpb3IgPSAweDIwN2E7CiB0LnBtb25vc3BhY2UgPSAweGZmNTA7CiB0LnBtc3F1YXJlID0gMHgzM2Q4OwogdC5wb2hpcmFnYW5hID0gMHgzMDdkOwogdC5wb2ludGluZ2luZGV4ZG93bndoaXRlID0gMHgyNjFmOwogdC5wb2ludGluZ2luZGV4bGVmdHdoaXRlID0gMHgyNjFjOwogdC5wb2ludGluZ2luZGV4cmlnaHR3aGl0ZSA9IDB4MjYxZTsKIHQucG9pbnRpbmdpbmRleHVwd2hpdGUgPSAweDI2MWQ7CiB0LnBva2F0YWthbmEgPSAweDMwZGQ7CiB0LnBvcGxhdGhhaSA9IDB4MGUxYjsKIHQucG9zdGFsbWFyayA9IDB4MzAxMjsKIHQucG9zdGFsbWFya2ZhY2UgPSAweDMwMjA7CiB0LnBwYXJlbiA9IDB4MjRhYjsKIHQucHJlY2VkZXMgPSAweDIyN2E7CiB0LnByZXNjcmlwdGlvbiA9IDB4MjExZTsKIHQucHJpbWVtb2QgPSAweDAyYjk7CiB0LnByaW1lcmV2ZXJzZWQgPSAweDIwMzU7CiB0LnByb2R1Y3QgPSAweDIyMGY7CiB0LnByb2plY3RpdmUgPSAweDIzMDU7CiB0LnByb2xvbmdlZGthbmEgPSAweDMwZmM7CiB0LnByb3BlbGxvciA9IDB4MjMxODsKIHQucHJvcGVyc3Vic2V0ID0gMHgyMjgyOwogdC5wcm9wZXJzdXBlcnNldCA9IDB4MjI4MzsKIHQucHJvcG9ydGlvbiA9IDB4MjIzNzsKIHQucHJvcG9ydGlvbmFsID0gMHgyMjFkOwogdC5wc2kgPSAweDAzYzg7CiB0LnBzaWN5cmlsbGljID0gMHgwNDcxOwogdC5wc2lsaXBuZXVtYXRhY3lyaWxsaWNjbWIgPSAweDA0ODY7CiB0LnBzc3F1YXJlID0gMHgzM2IwOwogdC5wdWhpcmFnYW5hID0gMHgzMDc3OwogdC5wdWthdGFrYW5hID0gMHgzMGQ3OwogdC5wdnNxdWFyZSA9IDB4MzNiNDsKIHQucHdzcXVhcmUgPSAweDMzYmE7CiB0LnEgPSAweDAwNzE7CiB0LnFhZGV2YSA9IDB4MDk1ODsKIHQucWFkbWFoZWJyZXcgPSAweDA1YTg7CiB0LnFhZmFyYWJpYyA9IDB4MDY0MjsKIHQucWFmZmluYWxhcmFiaWMgPSAweGZlZDY7CiB0LnFhZmluaXRpYWxhcmFiaWMgPSAweGZlZDc7CiB0LnFhZm1lZGlhbGFyYWJpYyA9IDB4ZmVkODsKIHQucWFtYXRzID0gMHgwNWI4OwogdC5xYW1hdHMxMCA9IDB4MDViODsKIHQucWFtYXRzMWEgPSAweDA1Yjg7CiB0LnFhbWF0czFjID0gMHgwNWI4OwogdC5xYW1hdHMyNyA9IDB4MDViODsKIHQucWFtYXRzMjkgPSAweDA1Yjg7CiB0LnFhbWF0czMzID0gMHgwNWI4OwogdC5xYW1hdHNkZSA9IDB4MDViODsKIHQucWFtYXRzaGVicmV3ID0gMHgwNWI4OwogdC5xYW1hdHNuYXJyb3doZWJyZXcgPSAweDA1Yjg7CiB0LnFhbWF0c3FhdGFuaGVicmV3ID0gMHgwNWI4OwogdC5xYW1hdHNxYXRhbm5hcnJvd2hlYnJldyA9IDB4MDViODsKIHQucWFtYXRzcWF0YW5xdWFydGVyaGVicmV3ID0gMHgwNWI4OwogdC5xYW1hdHNxYXRhbndpZGVoZWJyZXcgPSAweDA1Yjg7CiB0LnFhbWF0c3F1YXJ0ZXJoZWJyZXcgPSAweDA1Yjg7CiB0LnFhbWF0c3dpZGVoZWJyZXcgPSAweDA1Yjg7CiB0LnFhcm5leXBhcmFoZWJyZXcgPSAweDA1OWY7CiB0LnFib3BvbW9mbyA9IDB4MzExMTsKIHQucWNpcmNsZSA9IDB4MjRlMDsKIHQucWhvb2sgPSAweDAyYTA7CiB0LnFtb25vc3BhY2UgPSAweGZmNTE7CiB0LnFvZiA9IDB4MDVlNzsKIHQucW9mZGFnZXNoID0gMHhmYjQ3OwogdC5xb2ZkYWdlc2hoZWJyZXcgPSAweGZiNDc7CiB0LnFvZmhlYnJldyA9IDB4MDVlNzsKIHQucXBhcmVuID0gMHgyNGFjOwogdC5xdWFydGVybm90ZSA9IDB4MjY2OTsKIHQucXVidXRzID0gMHgwNWJiOwogdC5xdWJ1dHMxOCA9IDB4MDViYjsKIHQucXVidXRzMjUgPSAweDA1YmI7CiB0LnF1YnV0czMxID0gMHgwNWJiOwogdC5xdWJ1dHNoZWJyZXcgPSAweDA1YmI7CiB0LnF1YnV0c25hcnJvd2hlYnJldyA9IDB4MDViYjsKIHQucXVidXRzcXVhcnRlcmhlYnJldyA9IDB4MDViYjsKIHQucXVidXRzd2lkZWhlYnJldyA9IDB4MDViYjsKIHQucXVlc3Rpb24gPSAweDAwM2Y7CiB0LnF1ZXN0aW9uYXJhYmljID0gMHgwNjFmOwogdC5xdWVzdGlvbmFybWVuaWFuID0gMHgwNTVlOwogdC5xdWVzdGlvbmRvd24gPSAweDAwYmY7CiB0LnF1ZXN0aW9uZG93bnNtYWxsID0gMHhmN2JmOwogdC5xdWVzdGlvbmdyZWVrID0gMHgwMzdlOwogdC5xdWVzdGlvbm1vbm9zcGFjZSA9IDB4ZmYxZjsKIHQucXVlc3Rpb25zbWFsbCA9IDB4ZjczZjsKIHQucXVvdGVkYmwgPSAweDAwMjI7CiB0LnF1b3RlZGJsYmFzZSA9IDB4MjAxZTsKIHQucXVvdGVkYmxsZWZ0ID0gMHgyMDFjOwogdC5xdW90ZWRibG1vbm9zcGFjZSA9IDB4ZmYwMjsKIHQucXVvdGVkYmxwcmltZSA9IDB4MzAxZTsKIHQucXVvdGVkYmxwcmltZXJldmVyc2VkID0gMHgzMDFkOwogdC5xdW90ZWRibHJpZ2h0ID0gMHgyMDFkOwogdC5xdW90ZWxlZnQgPSAweDIwMTg7CiB0LnF1b3RlbGVmdHJldmVyc2VkID0gMHgyMDFiOwogdC5xdW90ZXJldmVyc2VkID0gMHgyMDFiOwogdC5xdW90ZXJpZ2h0ID0gMHgyMDE5OwogdC5xdW90ZXJpZ2h0biA9IDB4MDE0OTsKIHQucXVvdGVzaW5nbGJhc2UgPSAweDIwMWE7CiB0LnF1b3Rlc2luZ2xlID0gMHgwMDI3OwogdC5xdW90ZXNpbmdsZW1vbm9zcGFjZSA9IDB4ZmYwNzsKIHQuciA9IDB4MDA3MjsKIHQucmFhcm1lbmlhbiA9IDB4MDU3YzsKIHQucmFiZW5nYWxpID0gMHgwOWIwOwogdC5yYWN1dGUgPSAweDAxNTU7CiB0LnJhZGV2YSA9IDB4MDkzMDsKIHQucmFkaWNhbCA9IDB4MjIxYTsKIHQucmFkaWNhbGV4ID0gMHhmOGU1OwogdC5yYWRvdmVyc3NxdWFyZSA9IDB4MzNhZTsKIHQucmFkb3ZlcnNzcXVhcmVkc3F1YXJlID0gMHgzM2FmOwogdC5yYWRzcXVhcmUgPSAweDMzYWQ7CiB0LnJhZmUgPSAweDA1YmY7CiB0LnJhZmVoZWJyZXcgPSAweDA1YmY7CiB0LnJhZ3VqYXJhdGkgPSAweDBhYjA7CiB0LnJhZ3VybXVraGkgPSAweDBhMzA7CiB0LnJhaGlyYWdhbmEgPSAweDMwODk7CiB0LnJha2F0YWthbmEgPSAweDMwZTk7CiB0LnJha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOTc7CiB0LnJhbG93ZXJkaWFnb25hbGJlbmdhbGkgPSAweDA5ZjE7CiB0LnJhbWlkZGxlZGlhZ29uYWxiZW5nYWxpID0gMHgwOWYwOwogdC5yYW1zaG9ybiA9IDB4MDI2NDsKIHQucmF0aW8gPSAweDIyMzY7CiB0LnJib3BvbW9mbyA9IDB4MzExNjsKIHQucmNhcm9uID0gMHgwMTU5OwogdC5yY2VkaWxsYSA9IDB4MDE1NzsKIHQucmNpcmNsZSA9IDB4MjRlMTsKIHQucmNvbW1hYWNjZW50ID0gMHgwMTU3OwogdC5yZGJsZ3JhdmUgPSAweDAyMTE7CiB0LnJkb3RhY2NlbnQgPSAweDFlNTk7CiB0LnJkb3RiZWxvdyA9IDB4MWU1YjsKIHQucmRvdGJlbG93bWFjcm9uID0gMHgxZTVkOwogdC5yZWZlcmVuY2VtYXJrID0gMHgyMDNiOwogdC5yZWZsZXhzdWJzZXQgPSAweDIyODY7CiB0LnJlZmxleHN1cGVyc2V0ID0gMHgyMjg3OwogdC5yZWdpc3RlcmVkID0gMHgwMGFlOwogdC5yZWdpc3RlcnNhbnMgPSAweGY4ZTg7CiB0LnJlZ2lzdGVyc2VyaWYgPSAweGY2ZGE7CiB0LnJlaGFyYWJpYyA9IDB4MDYzMTsKIHQucmVoYXJtZW5pYW4gPSAweDA1ODA7CiB0LnJlaGZpbmFsYXJhYmljID0gMHhmZWFlOwogdC5yZWhpcmFnYW5hID0gMHgzMDhjOwogdC5yZWthdGFrYW5hID0gMHgzMGVjOwogdC5yZWthdGFrYW5haGFsZndpZHRoID0gMHhmZjlhOwogdC5yZXNoID0gMHgwNWU4OwogdC5yZXNoZGFnZXNoaGVicmV3ID0gMHhmYjQ4OwogdC5yZXNoaGVicmV3ID0gMHgwNWU4OwogdC5yZXZlcnNlZHRpbGRlID0gMHgyMjNkOwogdC5yZXZpYWhlYnJldyA9IDB4MDU5NzsKIHQucmV2aWFtdWdyYXNoaGVicmV3ID0gMHgwNTk3OwogdC5yZXZsb2dpY2Fsbm90ID0gMHgyMzEwOwogdC5yZmlzaGhvb2sgPSAweDAyN2U7CiB0LnJmaXNoaG9va3JldmVyc2VkID0gMHgwMjdmOwogdC5yaGFiZW5nYWxpID0gMHgwOWRkOwogdC5yaGFkZXZhID0gMHgwOTVkOwogdC5yaG8gPSAweDAzYzE7CiB0LnJob29rID0gMHgwMjdkOwogdC5yaG9va3R1cm5lZCA9IDB4MDI3YjsKIHQucmhvb2t0dXJuZWRzdXBlcmlvciA9IDB4MDJiNTsKIHQucmhvc3ltYm9sZ3JlZWsgPSAweDAzZjE7CiB0LnJob3RpY2hvb2ttb2QgPSAweDAyZGU7CiB0LnJpZXVsYWNpcmNsZWtvcmVhbiA9IDB4MzI3MTsKIHQucmlldWxhcGFyZW5rb3JlYW4gPSAweDMyMTE7CiB0LnJpZXVsY2lyY2xla29yZWFuID0gMHgzMjYzOwogdC5yaWV1bGhpZXVoa29yZWFuID0gMHgzMTQwOwogdC5yaWV1bGtpeWVva2tvcmVhbiA9IDB4MzEzYTsKIHQucmlldWxraXllb2tzaW9za29yZWFuID0gMHgzMTY5OwogdC5yaWV1bGtvcmVhbiA9IDB4MzEzOTsKIHQucmlldWxtaWV1bWtvcmVhbiA9IDB4MzEzYjsKIHQucmlldWxwYW5zaW9za29yZWFuID0gMHgzMTZjOwogdC5yaWV1bHBhcmVua29yZWFuID0gMHgzMjAzOwogdC5yaWV1bHBoaWV1cGhrb3JlYW4gPSAweDMxM2Y7CiB0LnJpZXVscGlldXBrb3JlYW4gPSAweDMxM2M7CiB0LnJpZXVscGlldXBzaW9za29yZWFuID0gMHgzMTZiOwogdC5yaWV1bHNpb3Nrb3JlYW4gPSAweDMxM2Q7CiB0LnJpZXVsdGhpZXV0aGtvcmVhbiA9IDB4MzEzZTsKIHQucmlldWx0aWtldXRrb3JlYW4gPSAweDMxNmE7CiB0LnJpZXVseWVvcmluaGlldWhrb3JlYW4gPSAweDMxNmQ7CiB0LnJpZ2h0YW5nbGUgPSAweDIyMWY7CiB0LnJpZ2h0dGFja2JlbG93Y21iID0gMHgwMzE5OwogdC5yaWdodHRyaWFuZ2xlID0gMHgyMmJmOwogdC5yaWhpcmFnYW5hID0gMHgzMDhhOwogdC5yaWthdGFrYW5hID0gMHgzMGVhOwogdC5yaWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk4OwogdC5yaW5nID0gMHgwMmRhOwogdC5yaW5nYmVsb3djbWIgPSAweDAzMjU7CiB0LnJpbmdjbWIgPSAweDAzMGE7CiB0LnJpbmdoYWxmbGVmdCA9IDB4MDJiZjsKIHQucmluZ2hhbGZsZWZ0YXJtZW5pYW4gPSAweDA1NTk7CiB0LnJpbmdoYWxmbGVmdGJlbG93Y21iID0gMHgwMzFjOwogdC5yaW5naGFsZmxlZnRjZW50ZXJlZCA9IDB4MDJkMzsKIHQucmluZ2hhbGZyaWdodCA9IDB4MDJiZTsKIHQucmluZ2hhbGZyaWdodGJlbG93Y21iID0gMHgwMzM5OwogdC5yaW5naGFsZnJpZ2h0Y2VudGVyZWQgPSAweDAyZDI7CiB0LnJpbnZlcnRlZGJyZXZlID0gMHgwMjEzOwogdC5yaXR0b3J1c3F1YXJlID0gMHgzMzUxOwogdC5ybGluZWJlbG93ID0gMHgxZTVmOwogdC5ybG9uZ2xlZyA9IDB4MDI3YzsKIHQucmxvbmdsZWd0dXJuZWQgPSAweDAyN2E7CiB0LnJtb25vc3BhY2UgPSAweGZmNTI7CiB0LnJvaGlyYWdhbmEgPSAweDMwOGQ7CiB0LnJva2F0YWthbmEgPSAweDMwZWQ7CiB0LnJva2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWI7CiB0LnJvcnVhdGhhaSA9IDB4MGUyMzsKIHQucnBhcmVuID0gMHgyNGFkOwogdC5ycmFiZW5nYWxpID0gMHgwOWRjOwogdC5ycmFkZXZhID0gMHgwOTMxOwogdC5ycmFndXJtdWtoaSA9IDB4MGE1YzsKIHQucnJlaGFyYWJpYyA9IDB4MDY5MTsKIHQucnJlaGZpbmFsYXJhYmljID0gMHhmYjhkOwogdC5ycnZvY2FsaWNiZW5nYWxpID0gMHgwOWUwOwogdC5ycnZvY2FsaWNkZXZhID0gMHgwOTYwOwogdC5ycnZvY2FsaWNndWphcmF0aSA9IDB4MGFlMDsKIHQucnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljNDsKIHQucnJ2b2NhbGljdm93ZWxzaWduZGV2YSA9IDB4MDk0NDsKIHQucnJ2b2NhbGljdm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzQ7CiB0LnJzdXBlcmlvciA9IDB4ZjZmMTsKIHQucnRibG9jayA9IDB4MjU5MDsKIHQucnR1cm5lZCA9IDB4MDI3OTsKIHQucnR1cm5lZHN1cGVyaW9yID0gMHgwMmI0OwogdC5ydWhpcmFnYW5hID0gMHgzMDhiOwogdC5ydWthdGFrYW5hID0gMHgzMGViOwogdC5ydWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk5OwogdC5ydXBlZW1hcmtiZW5nYWxpID0gMHgwOWYyOwogdC5ydXBlZXNpZ25iZW5nYWxpID0gMHgwOWYzOwogdC5ydXBpYWggPSAweGY2ZGQ7CiB0LnJ1dGhhaSA9IDB4MGUyNDsKIHQucnZvY2FsaWNiZW5nYWxpID0gMHgwOThiOwogdC5ydm9jYWxpY2RldmEgPSAweDA5MGI7CiB0LnJ2b2NhbGljZ3VqYXJhdGkgPSAweDBhOGI7CiB0LnJ2b2NhbGljdm93ZWxzaWduYmVuZ2FsaSA9IDB4MDljMzsKIHQucnZvY2FsaWN2b3dlbHNpZ25kZXZhID0gMHgwOTQzOwogdC5ydm9jYWxpY3Zvd2Vsc2lnbmd1amFyYXRpID0gMHgwYWMzOwogdC5zID0gMHgwMDczOwogdC5zYWJlbmdhbGkgPSAweDA5Yjg7CiB0LnNhY3V0ZSA9IDB4MDE1YjsKIHQuc2FjdXRlZG90YWNjZW50ID0gMHgxZTY1OwogdC5zYWRhcmFiaWMgPSAweDA2MzU7CiB0LnNhZGV2YSA9IDB4MDkzODsKIHQuc2FkZmluYWxhcmFiaWMgPSAweGZlYmE7CiB0LnNhZGluaXRpYWxhcmFiaWMgPSAweGZlYmI7CiB0LnNhZG1lZGlhbGFyYWJpYyA9IDB4ZmViYzsKIHQuc2FndWphcmF0aSA9IDB4MGFiODsKIHQuc2FndXJtdWtoaSA9IDB4MGEzODsKIHQuc2FoaXJhZ2FuYSA9IDB4MzA1NTsKIHQuc2FrYXRha2FuYSA9IDB4MzBiNTsKIHQuc2FrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YjsKIHQuc2FsbGFsbGFob3VhbGF5aGV3YXNhbGxhbWFyYWJpYyA9IDB4ZmRmYTsKIHQuc2FtZWtoID0gMHgwNWUxOwogdC5zYW1la2hkYWdlc2ggPSAweGZiNDE7CiB0LnNhbWVraGRhZ2VzaGhlYnJldyA9IDB4ZmI0MTsKIHQuc2FtZWtoaGVicmV3ID0gMHgwNWUxOwogdC5zYXJhYWF0aGFpID0gMHgwZTMyOwogdC5zYXJhYWV0aGFpID0gMHgwZTQxOwogdC5zYXJhYWltYWltYWxhaXRoYWkgPSAweDBlNDQ7CiB0LnNhcmFhaW1haW11YW50aGFpID0gMHgwZTQzOwogdC5zYXJhYW10aGFpID0gMHgwZTMzOwogdC5zYXJhYXRoYWkgPSAweDBlMzA7CiB0LnNhcmFldGhhaSA9IDB4MGU0MDsKIHQuc2FyYWlpbGVmdHRoYWkgPSAweGY4ODY7CiB0LnNhcmFpaXRoYWkgPSAweDBlMzU7CiB0LnNhcmFpbGVmdHRoYWkgPSAweGY4ODU7CiB0LnNhcmFpdGhhaSA9IDB4MGUzNDsKIHQuc2FyYW90aGFpID0gMHgwZTQyOwogdC5zYXJhdWVlbGVmdHRoYWkgPSAweGY4ODg7CiB0LnNhcmF1ZWV0aGFpID0gMHgwZTM3OwogdC5zYXJhdWVsZWZ0dGhhaSA9IDB4Zjg4NzsKIHQuc2FyYXVldGhhaSA9IDB4MGUzNjsKIHQuc2FyYXV0aGFpID0gMHgwZTM4OwogdC5zYXJhdXV0aGFpID0gMHgwZTM5OwogdC5zYm9wb21vZm8gPSAweDMxMTk7CiB0LnNjYXJvbiA9IDB4MDE2MTsKIHQuc2Nhcm9uZG90YWNjZW50ID0gMHgxZTY3OwogdC5zY2VkaWxsYSA9IDB4MDE1ZjsKIHQuc2Nod2EgPSAweDAyNTk7CiB0LnNjaHdhY3lyaWxsaWMgPSAweDA0ZDk7CiB0LnNjaHdhZGllcmVzaXNjeXJpbGxpYyA9IDB4MDRkYjsKIHQuc2Nod2Fob29rID0gMHgwMjVhOwogdC5zY2lyY2xlID0gMHgyNGUyOwogdC5zY2lyY3VtZmxleCA9IDB4MDE1ZDsKIHQuc2NvbW1hYWNjZW50ID0gMHgwMjE5OwogdC5zZG90YWNjZW50ID0gMHgxZTYxOwogdC5zZG90YmVsb3cgPSAweDFlNjM7CiB0LnNkb3RiZWxvd2RvdGFjY2VudCA9IDB4MWU2OTsKIHQuc2VhZ3VsbGJlbG93Y21iID0gMHgwMzNjOwogdC5zZWNvbmQgPSAweDIwMzM7CiB0LnNlY29uZHRvbmVjaGluZXNlID0gMHgwMmNhOwogdC5zZWN0aW9uID0gMHgwMGE3OwogdC5zZWVuYXJhYmljID0gMHgwNjMzOwogdC5zZWVuZmluYWxhcmFiaWMgPSAweGZlYjI7CiB0LnNlZW5pbml0aWFsYXJhYmljID0gMHhmZWIzOwogdC5zZWVubWVkaWFsYXJhYmljID0gMHhmZWI0OwogdC5zZWdvbCA9IDB4MDViNjsKIHQuc2Vnb2wxMyA9IDB4MDViNjsKIHQuc2Vnb2wxZiA9IDB4MDViNjsKIHQuc2Vnb2wyYyA9IDB4MDViNjsKIHQuc2Vnb2xoZWJyZXcgPSAweDA1YjY7CiB0LnNlZ29sbmFycm93aGVicmV3ID0gMHgwNWI2OwogdC5zZWdvbHF1YXJ0ZXJoZWJyZXcgPSAweDA1YjY7CiB0LnNlZ29sdGFoZWJyZXcgPSAweDA1OTI7CiB0LnNlZ29sd2lkZWhlYnJldyA9IDB4MDViNjsKIHQuc2VoYXJtZW5pYW4gPSAweDA1N2Q7CiB0LnNlaGlyYWdhbmEgPSAweDMwNWI7CiB0LnNla2F0YWthbmEgPSAweDMwYmI7CiB0LnNla2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2U7CiB0LnNlbWljb2xvbiA9IDB4MDAzYjsKIHQuc2VtaWNvbG9uYXJhYmljID0gMHgwNjFiOwogdC5zZW1pY29sb25tb25vc3BhY2UgPSAweGZmMWI7CiB0LnNlbWljb2xvbnNtYWxsID0gMHhmZTU0OwogdC5zZW1pdm9pY2VkbWFya2thbmEgPSAweDMwOWM7CiB0LnNlbWl2b2ljZWRtYXJra2FuYWhhbGZ3aWR0aCA9IDB4ZmY5ZjsKIHQuc2VudGlzcXVhcmUgPSAweDMzMjI7CiB0LnNlbnRvc3F1YXJlID0gMHgzMzIzOwogdC5zZXZlbiA9IDB4MDAzNzsKIHQuc2V2ZW5hcmFiaWMgPSAweDA2Njc7CiB0LnNldmVuYmVuZ2FsaSA9IDB4MDllZDsKIHQuc2V2ZW5jaXJjbGUgPSAweDI0NjY7CiB0LnNldmVuY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc5MDsKIHQuc2V2ZW5kZXZhID0gMHgwOTZkOwogdC5zZXZlbmVpZ2h0aHMgPSAweDIxNWU7CiB0LnNldmVuZ3VqYXJhdGkgPSAweDBhZWQ7CiB0LnNldmVuZ3VybXVraGkgPSAweDBhNmQ7CiB0LnNldmVuaGFja2FyYWJpYyA9IDB4MDY2NzsKIHQuc2V2ZW5oYW5nemhvdSA9IDB4MzAyNzsKIHQuc2V2ZW5pZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI2OwogdC5zZXZlbmluZmVyaW9yID0gMHgyMDg3OwogdC5zZXZlbm1vbm9zcGFjZSA9IDB4ZmYxNzsKIHQuc2V2ZW5vbGRzdHlsZSA9IDB4ZjczNzsKIHQuc2V2ZW5wYXJlbiA9IDB4MjQ3YTsKIHQuc2V2ZW5wZXJpb2QgPSAweDI0OGU7CiB0LnNldmVucGVyc2lhbiA9IDB4MDZmNzsKIHQuc2V2ZW5yb21hbiA9IDB4MjE3NjsKIHQuc2V2ZW5zdXBlcmlvciA9IDB4MjA3NzsKIHQuc2V2ZW50ZWVuY2lyY2xlID0gMHgyNDcwOwogdC5zZXZlbnRlZW5wYXJlbiA9IDB4MjQ4NDsKIHQuc2V2ZW50ZWVucGVyaW9kID0gMHgyNDk4OwogdC5zZXZlbnRoYWkgPSAweDBlNTc7CiB0LnNmdGh5cGhlbiA9IDB4MDBhZDsKIHQuc2hhYXJtZW5pYW4gPSAweDA1Nzc7CiB0LnNoYWJlbmdhbGkgPSAweDA5YjY7CiB0LnNoYWN5cmlsbGljID0gMHgwNDQ4OwogdC5zaGFkZGFhcmFiaWMgPSAweDA2NTE7CiB0LnNoYWRkYWRhbW1hYXJhYmljID0gMHhmYzYxOwogdC5zaGFkZGFkYW1tYXRhbmFyYWJpYyA9IDB4ZmM1ZTsKIHQuc2hhZGRhZmF0aGFhcmFiaWMgPSAweGZjNjA7CiB0LnNoYWRkYWthc3JhYXJhYmljID0gMHhmYzYyOwogdC5zaGFkZGFrYXNyYXRhbmFyYWJpYyA9IDB4ZmM1ZjsKIHQuc2hhZGUgPSAweDI1OTI7CiB0LnNoYWRlZGFyayA9IDB4MjU5MzsKIHQuc2hhZGVsaWdodCA9IDB4MjU5MTsKIHQuc2hhZGVtZWRpdW0gPSAweDI1OTI7CiB0LnNoYWRldmEgPSAweDA5MzY7CiB0LnNoYWd1amFyYXRpID0gMHgwYWI2OwogdC5zaGFndXJtdWtoaSA9IDB4MGEzNjsKIHQuc2hhbHNoZWxldGhlYnJldyA9IDB4MDU5MzsKIHQuc2hib3BvbW9mbyA9IDB4MzExNTsKIHQuc2hjaGFjeXJpbGxpYyA9IDB4MDQ0OTsKIHQuc2hlZW5hcmFiaWMgPSAweDA2MzQ7CiB0LnNoZWVuZmluYWxhcmFiaWMgPSAweGZlYjY7CiB0LnNoZWVuaW5pdGlhbGFyYWJpYyA9IDB4ZmViNzsKIHQuc2hlZW5tZWRpYWxhcmFiaWMgPSAweGZlYjg7CiB0LnNoZWljb3B0aWMgPSAweDAzZTM7CiB0LnNoZXFlbCA9IDB4MjBhYTsKIHQuc2hlcWVsaGVicmV3ID0gMHgyMGFhOwogdC5zaGV2YSA9IDB4MDViMDsKIHQuc2hldmExMTUgPSAweDA1YjA7CiB0LnNoZXZhMTUgPSAweDA1YjA7CiB0LnNoZXZhMjIgPSAweDA1YjA7CiB0LnNoZXZhMmUgPSAweDA1YjA7CiB0LnNoZXZhaGVicmV3ID0gMHgwNWIwOwogdC5zaGV2YW5hcnJvd2hlYnJldyA9IDB4MDViMDsKIHQuc2hldmFxdWFydGVyaGVicmV3ID0gMHgwNWIwOwogdC5zaGV2YXdpZGVoZWJyZXcgPSAweDA1YjA7CiB0LnNoaGFjeXJpbGxpYyA9IDB4MDRiYjsKIHQuc2hpbWFjb3B0aWMgPSAweDAzZWQ7CiB0LnNoaW4gPSAweDA1ZTk7CiB0LnNoaW5kYWdlc2ggPSAweGZiNDk7CiB0LnNoaW5kYWdlc2hoZWJyZXcgPSAweGZiNDk7CiB0LnNoaW5kYWdlc2hzaGluZG90ID0gMHhmYjJjOwogdC5zaGluZGFnZXNoc2hpbmRvdGhlYnJldyA9IDB4ZmIyYzsKIHQuc2hpbmRhZ2VzaHNpbmRvdCA9IDB4ZmIyZDsKIHQuc2hpbmRhZ2VzaHNpbmRvdGhlYnJldyA9IDB4ZmIyZDsKIHQuc2hpbmRvdGhlYnJldyA9IDB4MDVjMTsKIHQuc2hpbmhlYnJldyA9IDB4MDVlOTsKIHQuc2hpbnNoaW5kb3QgPSAweGZiMmE7CiB0LnNoaW5zaGluZG90aGVicmV3ID0gMHhmYjJhOwogdC5zaGluc2luZG90ID0gMHhmYjJiOwogdC5zaGluc2luZG90aGVicmV3ID0gMHhmYjJiOwogdC5zaG9vayA9IDB4MDI4MjsKIHQuc2lnbWEgPSAweDAzYzM7CiB0LnNpZ21hMSA9IDB4MDNjMjsKIHQuc2lnbWFmaW5hbCA9IDB4MDNjMjsKIHQuc2lnbWFsdW5hdGVzeW1ib2xncmVlayA9IDB4MDNmMjsKIHQuc2loaXJhZ2FuYSA9IDB4MzA1NzsKIHQuc2lrYXRha2FuYSA9IDB4MzBiNzsKIHQuc2lrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY3YzsKIHQuc2lsdXFoZWJyZXcgPSAweDA1YmQ7CiB0LnNpbHVxbGVmdGhlYnJldyA9IDB4MDViZDsKIHQuc2ltaWxhciA9IDB4MjIzYzsKIHQuc2luZG90aGVicmV3ID0gMHgwNWMyOwogdC5zaW9zYWNpcmNsZWtvcmVhbiA9IDB4MzI3NDsKIHQuc2lvc2FwYXJlbmtvcmVhbiA9IDB4MzIxNDsKIHQuc2lvc2NpZXVja29yZWFuID0gMHgzMTdlOwogdC5zaW9zY2lyY2xla29yZWFuID0gMHgzMjY2OwogdC5zaW9za2l5ZW9ra29yZWFuID0gMHgzMTdhOwogdC5zaW9za29yZWFuID0gMHgzMTQ1OwogdC5zaW9zbmlldW5rb3JlYW4gPSAweDMxN2I7CiB0LnNpb3NwYXJlbmtvcmVhbiA9IDB4MzIwNjsKIHQuc2lvc3BpZXVwa29yZWFuID0gMHgzMTdkOwogdC5zaW9zdGlrZXV0a29yZWFuID0gMHgzMTdjOwogdC5zaXggPSAweDAwMzY7CiB0LnNpeGFyYWJpYyA9IDB4MDY2NjsKIHQuc2l4YmVuZ2FsaSA9IDB4MDllYzsKIHQuc2l4Y2lyY2xlID0gMHgyNDY1OwogdC5zaXhjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhmOwogdC5zaXhkZXZhID0gMHgwOTZjOwogdC5zaXhndWphcmF0aSA9IDB4MGFlYzsKIHQuc2l4Z3VybXVraGkgPSAweDBhNmM7CiB0LnNpeGhhY2thcmFiaWMgPSAweDA2NjY7CiB0LnNpeGhhbmd6aG91ID0gMHgzMDI2OwogdC5zaXhpZGVvZ3JhcGhpY3BhcmVuID0gMHgzMjI1OwogdC5zaXhpbmZlcmlvciA9IDB4MjA4NjsKIHQuc2l4bW9ub3NwYWNlID0gMHhmZjE2OwogdC5zaXhvbGRzdHlsZSA9IDB4ZjczNjsKIHQuc2l4cGFyZW4gPSAweDI0Nzk7CiB0LnNpeHBlcmlvZCA9IDB4MjQ4ZDsKIHQuc2l4cGVyc2lhbiA9IDB4MDZmNjsKIHQuc2l4cm9tYW4gPSAweDIxNzU7CiB0LnNpeHN1cGVyaW9yID0gMHgyMDc2OwogdC5zaXh0ZWVuY2lyY2xlID0gMHgyNDZmOwogdC5zaXh0ZWVuY3VycmVuY3lkZW5vbWluYXRvcmJlbmdhbGkgPSAweDA5Zjk7CiB0LnNpeHRlZW5wYXJlbiA9IDB4MjQ4MzsKIHQuc2l4dGVlbnBlcmlvZCA9IDB4MjQ5NzsKIHQuc2l4dGhhaSA9IDB4MGU1NjsKIHQuc2xhc2ggPSAweDAwMmY7CiB0LnNsYXNobW9ub3NwYWNlID0gMHhmZjBmOwogdC5zbG9uZyA9IDB4MDE3ZjsKIHQuc2xvbmdkb3RhY2NlbnQgPSAweDFlOWI7CiB0LnNtaWxlZmFjZSA9IDB4MjYzYTsKIHQuc21vbm9zcGFjZSA9IDB4ZmY1MzsKIHQuc29mcGFzdXFoZWJyZXcgPSAweDA1YzM7CiB0LnNvZnRoeXBoZW4gPSAweDAwYWQ7CiB0LnNvZnRzaWduY3lyaWxsaWMgPSAweDA0NGM7CiB0LnNvaGlyYWdhbmEgPSAweDMwNWQ7CiB0LnNva2F0YWthbmEgPSAweDMwYmQ7CiB0LnNva2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Y7CiB0LnNvbGlkdXNsb25nb3ZlcmxheWNtYiA9IDB4MDMzODsKIHQuc29saWR1c3Nob3J0b3ZlcmxheWNtYiA9IDB4MDMzNzsKIHQuc29ydXNpdGhhaSA9IDB4MGUyOTsKIHQuc29zYWxhdGhhaSA9IDB4MGUyODsKIHQuc29zb3RoYWkgPSAweDBlMGI7CiB0LnNvc3VhdGhhaSA9IDB4MGUyYTsKIHQuc3BhY2UgPSAweDAwMjA7CiB0LnNwYWNlaGFja2FyYWJpYyA9IDB4MDAyMDsKIHQuc3BhZGUgPSAweDI2NjA7CiB0LnNwYWRlc3VpdGJsYWNrID0gMHgyNjYwOwogdC5zcGFkZXN1aXR3aGl0ZSA9IDB4MjY2NDsKIHQuc3BhcmVuID0gMHgyNGFlOwogdC5zcXVhcmViZWxvd2NtYiA9IDB4MDMzYjsKIHQuc3F1YXJlY2MgPSAweDMzYzQ7CiB0LnNxdWFyZWNtID0gMHgzMzlkOwogdC5zcXVhcmVkaWFnb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE5OwogdC5zcXVhcmVob3Jpem9udGFsZmlsbCA9IDB4MjVhNDsKIHQuc3F1YXJla2cgPSAweDMzOGY7CiB0LnNxdWFyZWttID0gMHgzMzllOwogdC5zcXVhcmVrbWNhcGl0YWwgPSAweDMzY2U7CiB0LnNxdWFyZWxuID0gMHgzM2QxOwogdC5zcXVhcmVsb2cgPSAweDMzZDI7CiB0LnNxdWFyZW1nID0gMHgzMzhlOwogdC5zcXVhcmVtaWwgPSAweDMzZDU7CiB0LnNxdWFyZW1tID0gMHgzMzljOwogdC5zcXVhcmVtc3F1YXJlZCA9IDB4MzNhMTsKIHQuc3F1YXJlb3J0aG9nb25hbGNyb3NzaGF0Y2hmaWxsID0gMHgyNWE2OwogdC5zcXVhcmV1cHBlcmxlZnR0b2xvd2VycmlnaHRmaWxsID0gMHgyNWE3OwogdC5zcXVhcmV1cHBlcnJpZ2h0dG9sb3dlcmxlZnRmaWxsID0gMHgyNWE4OwogdC5zcXVhcmV2ZXJ0aWNhbGZpbGwgPSAweDI1YTU7CiB0LnNxdWFyZXdoaXRld2l0aHNtYWxsYmxhY2sgPSAweDI1YTM7CiB0LnNyc3F1YXJlID0gMHgzM2RiOwogdC5zc2FiZW5nYWxpID0gMHgwOWI3OwogdC5zc2FkZXZhID0gMHgwOTM3OwogdC5zc2FndWphcmF0aSA9IDB4MGFiNzsKIHQuc3NhbmdjaWV1Y2tvcmVhbiA9IDB4MzE0OTsKIHQuc3NhbmdoaWV1aGtvcmVhbiA9IDB4MzE4NTsKIHQuc3NhbmdpZXVuZ2tvcmVhbiA9IDB4MzE4MDsKIHQuc3NhbmdraXllb2trb3JlYW4gPSAweDMxMzI7CiB0LnNzYW5nbmlldW5rb3JlYW4gPSAweDMxNjU7CiB0LnNzYW5ncGlldXBrb3JlYW4gPSAweDMxNDM7CiB0LnNzYW5nc2lvc2tvcmVhbiA9IDB4MzE0NjsKIHQuc3Nhbmd0aWtldXRrb3JlYW4gPSAweDMxMzg7CiB0LnNzdXBlcmlvciA9IDB4ZjZmMjsKIHQuc3RlcmxpbmcgPSAweDAwYTM7CiB0LnN0ZXJsaW5nbW9ub3NwYWNlID0gMHhmZmUxOwogdC5zdHJva2Vsb25nb3ZlcmxheWNtYiA9IDB4MDMzNjsKIHQuc3Ryb2tlc2hvcnRvdmVybGF5Y21iID0gMHgwMzM1OwogdC5zdWJzZXQgPSAweDIyODI7CiB0LnN1YnNldG5vdGVxdWFsID0gMHgyMjhhOwogdC5zdWJzZXRvcmVxdWFsID0gMHgyMjg2OwogdC5zdWNjZWVkcyA9IDB4MjI3YjsKIHQuc3VjaHRoYXQgPSAweDIyMGI7CiB0LnN1aGlyYWdhbmEgPSAweDMwNTk7CiB0LnN1a2F0YWthbmEgPSAweDMwYjk7CiB0LnN1a2F0YWthbmFoYWxmd2lkdGggPSAweGZmN2Q7CiB0LnN1a3VuYXJhYmljID0gMHgwNjUyOwogdC5zdW1tYXRpb24gPSAweDIyMTE7CiB0LnN1biA9IDB4MjYzYzsKIHQuc3VwZXJzZXQgPSAweDIyODM7CiB0LnN1cGVyc2V0bm90ZXF1YWwgPSAweDIyOGI7CiB0LnN1cGVyc2V0b3JlcXVhbCA9IDB4MjI4NzsKIHQuc3ZzcXVhcmUgPSAweDMzZGM7CiB0LnN5b3V3YWVyYXNxdWFyZSA9IDB4MzM3YzsKIHQudCA9IDB4MDA3NDsKIHQudGFiZW5nYWxpID0gMHgwOWE0OwogdC50YWNrZG93biA9IDB4MjJhNDsKIHQudGFja2xlZnQgPSAweDIyYTM7CiB0LnRhZGV2YSA9IDB4MDkyNDsKIHQudGFndWphcmF0aSA9IDB4MGFhNDsKIHQudGFndXJtdWtoaSA9IDB4MGEyNDsKIHQudGFoYXJhYmljID0gMHgwNjM3OwogdC50YWhmaW5hbGFyYWJpYyA9IDB4ZmVjMjsKIHQudGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmVjMzsKIHQudGFoaXJhZ2FuYSA9IDB4MzA1ZjsKIHQudGFobWVkaWFsYXJhYmljID0gMHhmZWM0OwogdC50YWlzeW91ZXJhc3F1YXJlID0gMHgzMzdkOwogdC50YWthdGFrYW5hID0gMHgzMGJmOwogdC50YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgwOwogdC50YXR3ZWVsYXJhYmljID0gMHgwNjQwOwogdC50YXUgPSAweDAzYzQ7CiB0LnRhdiA9IDB4MDVlYTsKIHQudGF2ZGFnZXMgPSAweGZiNGE7CiB0LnRhdmRhZ2VzaCA9IDB4ZmI0YTsKIHQudGF2ZGFnZXNoaGVicmV3ID0gMHhmYjRhOwogdC50YXZoZWJyZXcgPSAweDA1ZWE7CiB0LnRiYXIgPSAweDAxNjc7CiB0LnRib3BvbW9mbyA9IDB4MzEwYTsKIHQudGNhcm9uID0gMHgwMTY1OwogdC50Y2N1cmwgPSAweDAyYTg7CiB0LnRjZWRpbGxhID0gMHgwMTYzOwogdC50Y2hlaGFyYWJpYyA9IDB4MDY4NjsKIHQudGNoZWhmaW5hbGFyYWJpYyA9IDB4ZmI3YjsKIHQudGNoZWhpbml0aWFsYXJhYmljID0gMHhmYjdjOwogdC50Y2hlaG1lZGlhbGFyYWJpYyA9IDB4ZmI3ZDsKIHQudGNpcmNsZSA9IDB4MjRlMzsKIHQudGNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3MTsKIHQudGNvbW1hYWNjZW50ID0gMHgwMTYzOwogdC50ZGllcmVzaXMgPSAweDFlOTc7CiB0LnRkb3RhY2NlbnQgPSAweDFlNmI7CiB0LnRkb3RiZWxvdyA9IDB4MWU2ZDsKIHQudGVjeXJpbGxpYyA9IDB4MDQ0MjsKIHQudGVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDRhZDsKIHQudGVoYXJhYmljID0gMHgwNjJhOwogdC50ZWhmaW5hbGFyYWJpYyA9IDB4ZmU5NjsKIHQudGVoaGFoaW5pdGlhbGFyYWJpYyA9IDB4ZmNhMjsKIHQudGVoaGFoaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGM7CiB0LnRlaGluaXRpYWxhcmFiaWMgPSAweGZlOTc7CiB0LnRlaGlyYWdhbmEgPSAweDMwNjY7CiB0LnRlaGplZW1pbml0aWFsYXJhYmljID0gMHhmY2ExOwogdC50ZWhqZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjMGI7CiB0LnRlaG1hcmJ1dGFhcmFiaWMgPSAweDA2Mjk7CiB0LnRlaG1hcmJ1dGFmaW5hbGFyYWJpYyA9IDB4ZmU5NDsKIHQudGVobWVkaWFsYXJhYmljID0gMHhmZTk4OwogdC50ZWhtZWVtaW5pdGlhbGFyYWJpYyA9IDB4ZmNhNDsKIHQudGVobWVlbWlzb2xhdGVkYXJhYmljID0gMHhmYzBlOwogdC50ZWhub29uZmluYWxhcmFiaWMgPSAweGZjNzM7CiB0LnRla2F0YWthbmEgPSAweDMwYzY7CiB0LnRla2F0YWthbmFoYWxmd2lkdGggPSAweGZmODM7CiB0LnRlbGVwaG9uZSA9IDB4MjEyMTsKIHQudGVsZXBob25lYmxhY2sgPSAweDI2MGU7CiB0LnRlbGlzaGFnZWRvbGFoZWJyZXcgPSAweDA1YTA7CiB0LnRlbGlzaGFxZXRhbmFoZWJyZXcgPSAweDA1YTk7CiB0LnRlbmNpcmNsZSA9IDB4MjQ2OTsKIHQudGVuaWRlb2dyYXBoaWNwYXJlbiA9IDB4MzIyOTsKIHQudGVucGFyZW4gPSAweDI0N2Q7CiB0LnRlbnBlcmlvZCA9IDB4MjQ5MTsKIHQudGVucm9tYW4gPSAweDIxNzk7CiB0LnRlc2ggPSAweDAyYTc7CiB0LnRldCA9IDB4MDVkODsKIHQudGV0ZGFnZXNoID0gMHhmYjM4OwogdC50ZXRkYWdlc2hoZWJyZXcgPSAweGZiMzg7CiB0LnRldGhlYnJldyA9IDB4MDVkODsKIHQudGV0c2VjeXJpbGxpYyA9IDB4MDRiNTsKIHQudGV2aXJoZWJyZXcgPSAweDA1OWI7CiB0LnRldmlybGVmdGhlYnJldyA9IDB4MDU5YjsKIHQudGhhYmVuZ2FsaSA9IDB4MDlhNTsKIHQudGhhZGV2YSA9IDB4MDkyNTsKIHQudGhhZ3VqYXJhdGkgPSAweDBhYTU7CiB0LnRoYWd1cm11a2hpID0gMHgwYTI1OwogdC50aGFsYXJhYmljID0gMHgwNjMwOwogdC50aGFsZmluYWxhcmFiaWMgPSAweGZlYWM7CiB0LnRoYW50aGFraGF0bG93bGVmdHRoYWkgPSAweGY4OTg7CiB0LnRoYW50aGFraGF0bG93cmlnaHR0aGFpID0gMHhmODk3OwogdC50aGFudGhha2hhdHRoYWkgPSAweDBlNGM7CiB0LnRoYW50aGFraGF0dXBwZXJsZWZ0dGhhaSA9IDB4Zjg5NjsKIHQudGhlaGFyYWJpYyA9IDB4MDYyYjsKIHQudGhlaGZpbmFsYXJhYmljID0gMHhmZTlhOwogdC50aGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmU5YjsKIHQudGhlaG1lZGlhbGFyYWJpYyA9IDB4ZmU5YzsKIHQudGhlcmVleGlzdHMgPSAweDIyMDM7CiB0LnRoZXJlZm9yZSA9IDB4MjIzNDsKIHQudGhldGEgPSAweDAzYjg7CiB0LnRoZXRhMSA9IDB4MDNkMTsKIHQudGhldGFzeW1ib2xncmVlayA9IDB4MDNkMTsKIHQudGhpZXV0aGFjaXJjbGVrb3JlYW4gPSAweDMyNzk7CiB0LnRoaWV1dGhhcGFyZW5rb3JlYW4gPSAweDMyMTk7CiB0LnRoaWV1dGhjaXJjbGVrb3JlYW4gPSAweDMyNmI7CiB0LnRoaWV1dGhrb3JlYW4gPSAweDMxNGM7CiB0LnRoaWV1dGhwYXJlbmtvcmVhbiA9IDB4MzIwYjsKIHQudGhpcnRlZW5jaXJjbGUgPSAweDI0NmM7CiB0LnRoaXJ0ZWVucGFyZW4gPSAweDI0ODA7CiB0LnRoaXJ0ZWVucGVyaW9kID0gMHgyNDk0OwogdC50aG9uYW5nbW9udGhvdGhhaSA9IDB4MGUxMTsKIHQudGhvb2sgPSAweDAxYWQ7CiB0LnRob3BodXRoYW90aGFpID0gMHgwZTEyOwogdC50aG9ybiA9IDB4MDBmZTsKIHQudGhvdGhhaGFudGhhaSA9IDB4MGUxNzsKIHQudGhvdGhhbnRoYWkgPSAweDBlMTA7CiB0LnRob3Rob25ndGhhaSA9IDB4MGUxODsKIHQudGhvdGh1bmd0aGFpID0gMHgwZTE2OwogdC50aG91c2FuZGN5cmlsbGljID0gMHgwNDgyOwogdC50aG91c2FuZHNzZXBhcmF0b3JhcmFiaWMgPSAweDA2NmM7CiB0LnRob3VzYW5kc3NlcGFyYXRvcnBlcnNpYW4gPSAweDA2NmM7CiB0LnRocmVlID0gMHgwMDMzOwogdC50aHJlZWFyYWJpYyA9IDB4MDY2MzsKIHQudGhyZWViZW5nYWxpID0gMHgwOWU5OwogdC50aHJlZWNpcmNsZSA9IDB4MjQ2MjsKIHQudGhyZWVjaXJjbGVpbnZlcnNlc2Fuc3NlcmlmID0gMHgyNzhjOwogdC50aHJlZWRldmEgPSAweDA5Njk7CiB0LnRocmVlZWlnaHRocyA9IDB4MjE1YzsKIHQudGhyZWVndWphcmF0aSA9IDB4MGFlOTsKIHQudGhyZWVndXJtdWtoaSA9IDB4MGE2OTsKIHQudGhyZWVoYWNrYXJhYmljID0gMHgwNjYzOwogdC50aHJlZWhhbmd6aG91ID0gMHgzMDIzOwogdC50aHJlZWlkZW9ncmFwaGljcGFyZW4gPSAweDMyMjI7CiB0LnRocmVlaW5mZXJpb3IgPSAweDIwODM7CiB0LnRocmVlbW9ub3NwYWNlID0gMHhmZjEzOwogdC50aHJlZW51bWVyYXRvcmJlbmdhbGkgPSAweDA5ZjY7CiB0LnRocmVlb2xkc3R5bGUgPSAweGY3MzM7CiB0LnRocmVlcGFyZW4gPSAweDI0NzY7CiB0LnRocmVlcGVyaW9kID0gMHgyNDhhOwogdC50aHJlZXBlcnNpYW4gPSAweDA2ZjM7CiB0LnRocmVlcXVhcnRlcnMgPSAweDAwYmU7CiB0LnRocmVlcXVhcnRlcnNlbWRhc2ggPSAweGY2ZGU7CiB0LnRocmVlcm9tYW4gPSAweDIxNzI7CiB0LnRocmVlc3VwZXJpb3IgPSAweDAwYjM7CiB0LnRocmVldGhhaSA9IDB4MGU1MzsKIHQudGh6c3F1YXJlID0gMHgzMzk0OwogdC50aWhpcmFnYW5hID0gMHgzMDYxOwogdC50aWthdGFrYW5hID0gMHgzMGMxOwogdC50aWthdGFrYW5haGFsZndpZHRoID0gMHhmZjgxOwogdC50aWtldXRhY2lyY2xla29yZWFuID0gMHgzMjcwOwogdC50aWtldXRhcGFyZW5rb3JlYW4gPSAweDMyMTA7CiB0LnRpa2V1dGNpcmNsZWtvcmVhbiA9IDB4MzI2MjsKIHQudGlrZXV0a29yZWFuID0gMHgzMTM3OwogdC50aWtldXRwYXJlbmtvcmVhbiA9IDB4MzIwMjsKIHQudGlsZGUgPSAweDAyZGM7CiB0LnRpbGRlYmVsb3djbWIgPSAweDAzMzA7CiB0LnRpbGRlY21iID0gMHgwMzAzOwogdC50aWxkZWNvbWIgPSAweDAzMDM7CiB0LnRpbGRlZG91YmxlY21iID0gMHgwMzYwOwogdC50aWxkZW9wZXJhdG9yID0gMHgyMjNjOwogdC50aWxkZW92ZXJsYXljbWIgPSAweDAzMzQ7CiB0LnRpbGRldmVydGljYWxjbWIgPSAweDAzM2U7CiB0LnRpbWVzY2lyY2xlID0gMHgyMjk3OwogdC50aXBlaGFoZWJyZXcgPSAweDA1OTY7CiB0LnRpcGVoYWxlZnRoZWJyZXcgPSAweDA1OTY7CiB0LnRpcHBpZ3VybXVraGkgPSAweDBhNzA7CiB0LnRpdGxvY3lyaWxsaWNjbWIgPSAweDA0ODM7CiB0LnRpd25hcm1lbmlhbiA9IDB4MDU3ZjsKIHQudGxpbmViZWxvdyA9IDB4MWU2ZjsKIHQudG1vbm9zcGFjZSA9IDB4ZmY1NDsKIHQudG9hcm1lbmlhbiA9IDB4MDU2OTsKIHQudG9oaXJhZ2FuYSA9IDB4MzA2ODsKIHQudG9rYXRha2FuYSA9IDB4MzBjODsKIHQudG9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4NDsKIHQudG9uZWJhcmV4dHJhaGlnaG1vZCA9IDB4MDJlNTsKIHQudG9uZWJhcmV4dHJhbG93bW9kID0gMHgwMmU5OwogdC50b25lYmFyaGlnaG1vZCA9IDB4MDJlNjsKIHQudG9uZWJhcmxvd21vZCA9IDB4MDJlODsKIHQudG9uZWJhcm1pZG1vZCA9IDB4MDJlNzsKIHQudG9uZWZpdmUgPSAweDAxYmQ7CiB0LnRvbmVzaXggPSAweDAxODU7CiB0LnRvbmV0d28gPSAweDAxYTg7CiB0LnRvbm9zID0gMHgwMzg0OwogdC50b25zcXVhcmUgPSAweDMzMjc7CiB0LnRvcGF0YWt0aGFpID0gMHgwZTBmOwogdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTQ7CiB0LnRvcnRvaXNlc2hlbGxicmFja2V0bGVmdHNtYWxsID0gMHhmZTVkOwogdC50b3J0b2lzZXNoZWxsYnJhY2tldGxlZnR2ZXJ0aWNhbCA9IDB4ZmUzOTsKIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxNTsKIHQudG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodHNtYWxsID0gMHhmZTVlOwogdC50b3J0b2lzZXNoZWxsYnJhY2tldHJpZ2h0dmVydGljYWwgPSAweGZlM2E7CiB0LnRvdGFvdGhhaSA9IDB4MGUxNTsKIHQudHBhbGF0YWxob29rID0gMHgwMWFiOwogdC50cGFyZW4gPSAweDI0YWY7CiB0LnRyYWRlbWFyayA9IDB4MjEyMjsKIHQudHJhZGVtYXJrc2FucyA9IDB4ZjhlYTsKIHQudHJhZGVtYXJrc2VyaWYgPSAweGY2ZGI7CiB0LnRyZXRyb2ZsZXhob29rID0gMHgwMjg4OwogdC50cmlhZ2RuID0gMHgyNWJjOwogdC50cmlhZ2xmID0gMHgyNWM0OwogdC50cmlhZ3J0ID0gMHgyNWJhOwogdC50cmlhZ3VwID0gMHgyNWIyOwogdC50cyA9IDB4MDJhNjsKIHQudHNhZGkgPSAweDA1ZTY7CiB0LnRzYWRpZGFnZXNoID0gMHhmYjQ2OwogdC50c2FkaWRhZ2VzaGhlYnJldyA9IDB4ZmI0NjsKIHQudHNhZGloZWJyZXcgPSAweDA1ZTY7CiB0LnRzZWN5cmlsbGljID0gMHgwNDQ2OwogdC50c2VyZSA9IDB4MDViNTsKIHQudHNlcmUxMiA9IDB4MDViNTsKIHQudHNlcmUxZSA9IDB4MDViNTsKIHQudHNlcmUyYiA9IDB4MDViNTsKIHQudHNlcmVoZWJyZXcgPSAweDA1YjU7CiB0LnRzZXJlbmFycm93aGVicmV3ID0gMHgwNWI1OwogdC50c2VyZXF1YXJ0ZXJoZWJyZXcgPSAweDA1YjU7CiB0LnRzZXJld2lkZWhlYnJldyA9IDB4MDViNTsKIHQudHNoZWN5cmlsbGljID0gMHgwNDViOwogdC50c3VwZXJpb3IgPSAweGY2ZjM7CiB0LnR0YWJlbmdhbGkgPSAweDA5OWY7CiB0LnR0YWRldmEgPSAweDA5MWY7CiB0LnR0YWd1amFyYXRpID0gMHgwYTlmOwogdC50dGFndXJtdWtoaSA9IDB4MGExZjsKIHQudHRlaGFyYWJpYyA9IDB4MDY3OTsKIHQudHRlaGZpbmFsYXJhYmljID0gMHhmYjY3OwogdC50dGVoaW5pdGlhbGFyYWJpYyA9IDB4ZmI2ODsKIHQudHRlaG1lZGlhbGFyYWJpYyA9IDB4ZmI2OTsKIHQudHRoYWJlbmdhbGkgPSAweDA5YTA7CiB0LnR0aGFkZXZhID0gMHgwOTIwOwogdC50dGhhZ3VqYXJhdGkgPSAweDBhYTA7CiB0LnR0aGFndXJtdWtoaSA9IDB4MGEyMDsKIHQudHR1cm5lZCA9IDB4MDI4NzsKIHQudHVoaXJhZ2FuYSA9IDB4MzA2NDsKIHQudHVrYXRha2FuYSA9IDB4MzBjNDsKIHQudHVrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY4MjsKIHQudHVzbWFsbGhpcmFnYW5hID0gMHgzMDYzOwogdC50dXNtYWxsa2F0YWthbmEgPSAweDMwYzM7CiB0LnR1c21hbGxrYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY2ZjsKIHQudHdlbHZlY2lyY2xlID0gMHgyNDZiOwogdC50d2VsdmVwYXJlbiA9IDB4MjQ3ZjsKIHQudHdlbHZlcGVyaW9kID0gMHgyNDkzOwogdC50d2VsdmVyb21hbiA9IDB4MjE3YjsKIHQudHdlbnR5Y2lyY2xlID0gMHgyNDczOwogdC50d2VudHloYW5nemhvdSA9IDB4NTM0NDsKIHQudHdlbnR5cGFyZW4gPSAweDI0ODc7CiB0LnR3ZW50eXBlcmlvZCA9IDB4MjQ5YjsKIHQudHdvID0gMHgwMDMyOwogdC50d29hcmFiaWMgPSAweDA2NjI7CiB0LnR3b2JlbmdhbGkgPSAweDA5ZTg7CiB0LnR3b2NpcmNsZSA9IDB4MjQ2MTsKIHQudHdvY2lyY2xlaW52ZXJzZXNhbnNzZXJpZiA9IDB4Mjc4YjsKIHQudHdvZGV2YSA9IDB4MDk2ODsKIHQudHdvZG90ZW5sZWFkZXIgPSAweDIwMjU7CiB0LnR3b2RvdGxlYWRlciA9IDB4MjAyNTsKIHQudHdvZG90bGVhZGVydmVydGljYWwgPSAweGZlMzA7CiB0LnR3b2d1amFyYXRpID0gMHgwYWU4OwogdC50d29ndXJtdWtoaSA9IDB4MGE2ODsKIHQudHdvaGFja2FyYWJpYyA9IDB4MDY2MjsKIHQudHdvaGFuZ3pob3UgPSAweDMwMjI7CiB0LnR3b2lkZW9ncmFwaGljcGFyZW4gPSAweDMyMjE7CiB0LnR3b2luZmVyaW9yID0gMHgyMDgyOwogdC50d29tb25vc3BhY2UgPSAweGZmMTI7CiB0LnR3b251bWVyYXRvcmJlbmdhbGkgPSAweDA5ZjU7CiB0LnR3b29sZHN0eWxlID0gMHhmNzMyOwogdC50d29wYXJlbiA9IDB4MjQ3NTsKIHQudHdvcGVyaW9kID0gMHgyNDg5OwogdC50d29wZXJzaWFuID0gMHgwNmYyOwogdC50d29yb21hbiA9IDB4MjE3MTsKIHQudHdvc3Ryb2tlID0gMHgwMWJiOwogdC50d29zdXBlcmlvciA9IDB4MDBiMjsKIHQudHdvdGhhaSA9IDB4MGU1MjsKIHQudHdvdGhpcmRzID0gMHgyMTU0OwogdC51ID0gMHgwMDc1OwogdC51YWN1dGUgPSAweDAwZmE7CiB0LnViYXIgPSAweDAyODk7CiB0LnViZW5nYWxpID0gMHgwOTg5OwogdC51Ym9wb21vZm8gPSAweDMxMjg7CiB0LnVicmV2ZSA9IDB4MDE2ZDsKIHQudWNhcm9uID0gMHgwMWQ0OwogdC51Y2lyY2xlID0gMHgyNGU0OwogdC51Y2lyY3VtZmxleCA9IDB4MDBmYjsKIHQudWNpcmN1bWZsZXhiZWxvdyA9IDB4MWU3NzsKIHQudWN5cmlsbGljID0gMHgwNDQzOwogdC51ZGF0dGFkZXZhID0gMHgwOTUxOwogdC51ZGJsYWN1dGUgPSAweDAxNzE7CiB0LnVkYmxncmF2ZSA9IDB4MDIxNTsKIHQudWRldmEgPSAweDA5MDk7CiB0LnVkaWVyZXNpcyA9IDB4MDBmYzsKIHQudWRpZXJlc2lzYWN1dGUgPSAweDAxZDg7CiB0LnVkaWVyZXNpc2JlbG93ID0gMHgxZTczOwogdC51ZGllcmVzaXNjYXJvbiA9IDB4MDFkYTsKIHQudWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZjE7CiB0LnVkaWVyZXNpc2dyYXZlID0gMHgwMWRjOwogdC51ZGllcmVzaXNtYWNyb24gPSAweDAxZDY7CiB0LnVkb3RiZWxvdyA9IDB4MWVlNTsKIHQudWdyYXZlID0gMHgwMGY5OwogdC51Z3VqYXJhdGkgPSAweDBhODk7CiB0LnVndXJtdWtoaSA9IDB4MGEwOTsKIHQudWhpcmFnYW5hID0gMHgzMDQ2OwogdC51aG9va2Fib3ZlID0gMHgxZWU3OwogdC51aG9ybiA9IDB4MDFiMDsKIHQudWhvcm5hY3V0ZSA9IDB4MWVlOTsKIHQudWhvcm5kb3RiZWxvdyA9IDB4MWVmMTsKIHQudWhvcm5ncmF2ZSA9IDB4MWVlYjsKIHQudWhvcm5ob29rYWJvdmUgPSAweDFlZWQ7CiB0LnVob3JudGlsZGUgPSAweDFlZWY7CiB0LnVodW5nYXJ1bWxhdXQgPSAweDAxNzE7CiB0LnVodW5nYXJ1bWxhdXRjeXJpbGxpYyA9IDB4MDRmMzsKIHQudWludmVydGVkYnJldmUgPSAweDAyMTc7CiB0LnVrYXRha2FuYSA9IDB4MzBhNjsKIHQudWthdGFrYW5haGFsZndpZHRoID0gMHhmZjczOwogdC51a2N5cmlsbGljID0gMHgwNDc5OwogdC51a29yZWFuID0gMHgzMTVjOwogdC51bWFjcm9uID0gMHgwMTZiOwogdC51bWFjcm9uY3lyaWxsaWMgPSAweDA0ZWY7CiB0LnVtYWNyb25kaWVyZXNpcyA9IDB4MWU3YjsKIHQudW1hdHJhZ3VybXVraGkgPSAweDBhNDE7CiB0LnVtb25vc3BhY2UgPSAweGZmNTU7CiB0LnVuZGVyc2NvcmUgPSAweDAwNWY7CiB0LnVuZGVyc2NvcmVkYmwgPSAweDIwMTc7CiB0LnVuZGVyc2NvcmVtb25vc3BhY2UgPSAweGZmM2Y7CiB0LnVuZGVyc2NvcmV2ZXJ0aWNhbCA9IDB4ZmUzMzsKIHQudW5kZXJzY29yZXdhdnkgPSAweGZlNGY7CiB0LnVuaW9uID0gMHgyMjJhOwogdC51bml2ZXJzYWwgPSAweDIyMDA7CiB0LnVvZ29uZWsgPSAweDAxNzM7CiB0LnVwYXJlbiA9IDB4MjRiMDsKIHQudXBibG9jayA9IDB4MjU4MDsKIHQudXBwZXJkb3RoZWJyZXcgPSAweDA1YzQ7CiB0LnVwc2lsb24gPSAweDAzYzU7CiB0LnVwc2lsb25kaWVyZXNpcyA9IDB4MDNjYjsKIHQudXBzaWxvbmRpZXJlc2lzdG9ub3MgPSAweDAzYjA7CiB0LnVwc2lsb25sYXRpbiA9IDB4MDI4YTsKIHQudXBzaWxvbnRvbm9zID0gMHgwM2NkOwogdC51cHRhY2tiZWxvd2NtYiA9IDB4MDMxZDsKIHQudXB0YWNrbW9kID0gMHgwMmQ0OwogdC51cmFndXJtdWtoaSA9IDB4MGE3MzsKIHQudXJpbmcgPSAweDAxNmY7CiB0LnVzaG9ydGN5cmlsbGljID0gMHgwNDVlOwogdC51c21hbGxoaXJhZ2FuYSA9IDB4MzA0NTsKIHQudXNtYWxsa2F0YWthbmEgPSAweDMwYTU7CiB0LnVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjY5OwogdC51c3RyYWlnaHRjeXJpbGxpYyA9IDB4MDRhZjsKIHQudXN0cmFpZ2h0c3Ryb2tlY3lyaWxsaWMgPSAweDA0YjE7CiB0LnV0aWxkZSA9IDB4MDE2OTsKIHQudXRpbGRlYWN1dGUgPSAweDFlNzk7CiB0LnV0aWxkZWJlbG93ID0gMHgxZTc1OwogdC51dWJlbmdhbGkgPSAweDA5OGE7CiB0LnV1ZGV2YSA9IDB4MDkwYTsKIHQudXVndWphcmF0aSA9IDB4MGE4YTsKIHQudXVndXJtdWtoaSA9IDB4MGEwYTsKIHQudXVtYXRyYWd1cm11a2hpID0gMHgwYTQyOwogdC51dXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzI7CiB0LnV1dm93ZWxzaWduZGV2YSA9IDB4MDk0MjsKIHQudXV2b3dlbHNpZ25ndWphcmF0aSA9IDB4MGFjMjsKIHQudXZvd2Vsc2lnbmJlbmdhbGkgPSAweDA5YzE7CiB0LnV2b3dlbHNpZ25kZXZhID0gMHgwOTQxOwogdC51dm93ZWxzaWduZ3VqYXJhdGkgPSAweDBhYzE7CiB0LnYgPSAweDAwNzY7CiB0LnZhZGV2YSA9IDB4MDkzNTsKIHQudmFndWphcmF0aSA9IDB4MGFiNTsKIHQudmFndXJtdWtoaSA9IDB4MGEzNTsKIHQudmFrYXRha2FuYSA9IDB4MzBmNzsKIHQudmF2ID0gMHgwNWQ1OwogdC52YXZkYWdlc2ggPSAweGZiMzU7CiB0LnZhdmRhZ2VzaDY1ID0gMHhmYjM1OwogdC52YXZkYWdlc2hoZWJyZXcgPSAweGZiMzU7CiB0LnZhdmhlYnJldyA9IDB4MDVkNTsKIHQudmF2aG9sYW0gPSAweGZiNGI7CiB0LnZhdmhvbGFtaGVicmV3ID0gMHhmYjRiOwogdC52YXZ2YXZoZWJyZXcgPSAweDA1ZjA7CiB0LnZhdnlvZGhlYnJldyA9IDB4MDVmMTsKIHQudmNpcmNsZSA9IDB4MjRlNTsKIHQudmRvdGJlbG93ID0gMHgxZTdmOwogdC52ZWN5cmlsbGljID0gMHgwNDMyOwogdC52ZWhhcmFiaWMgPSAweDA2YTQ7CiB0LnZlaGZpbmFsYXJhYmljID0gMHhmYjZiOwogdC52ZWhpbml0aWFsYXJhYmljID0gMHhmYjZjOwogdC52ZWhtZWRpYWxhcmFiaWMgPSAweGZiNmQ7CiB0LnZla2F0YWthbmEgPSAweDMwZjk7CiB0LnZlbnVzID0gMHgyNjQwOwogdC52ZXJ0aWNhbGJhciA9IDB4MDA3YzsKIHQudmVydGljYWxsaW5lYWJvdmVjbWIgPSAweDAzMGQ7CiB0LnZlcnRpY2FsbGluZWJlbG93Y21iID0gMHgwMzI5OwogdC52ZXJ0aWNhbGxpbmVsb3dtb2QgPSAweDAyY2M7CiB0LnZlcnRpY2FsbGluZW1vZCA9IDB4MDJjODsKIHQudmV3YXJtZW5pYW4gPSAweDA1N2U7CiB0LnZob29rID0gMHgwMjhiOwogdC52aWthdGFrYW5hID0gMHgzMGY4OwogdC52aXJhbWFiZW5nYWxpID0gMHgwOWNkOwogdC52aXJhbWFkZXZhID0gMHgwOTRkOwogdC52aXJhbWFndWphcmF0aSA9IDB4MGFjZDsKIHQudmlzYXJnYWJlbmdhbGkgPSAweDA5ODM7CiB0LnZpc2FyZ2FkZXZhID0gMHgwOTAzOwogdC52aXNhcmdhZ3VqYXJhdGkgPSAweDBhODM7CiB0LnZtb25vc3BhY2UgPSAweGZmNTY7CiB0LnZvYXJtZW5pYW4gPSAweDA1Nzg7CiB0LnZvaWNlZGl0ZXJhdGlvbmhpcmFnYW5hID0gMHgzMDllOwogdC52b2ljZWRpdGVyYXRpb25rYXRha2FuYSA9IDB4MzBmZTsKIHQudm9pY2VkbWFya2thbmEgPSAweDMwOWI7CiB0LnZvaWNlZG1hcmtrYW5haGFsZndpZHRoID0gMHhmZjllOwogdC52b2thdGFrYW5hID0gMHgzMGZhOwogdC52cGFyZW4gPSAweDI0YjE7CiB0LnZ0aWxkZSA9IDB4MWU3ZDsKIHQudnR1cm5lZCA9IDB4MDI4YzsKIHQudnVoaXJhZ2FuYSA9IDB4MzA5NDsKIHQudnVrYXRha2FuYSA9IDB4MzBmNDsKIHQudyA9IDB4MDA3NzsKIHQud2FjdXRlID0gMHgxZTgzOwogdC53YWVrb3JlYW4gPSAweDMxNTk7CiB0LndhaGlyYWdhbmEgPSAweDMwOGY7CiB0Lndha2F0YWthbmEgPSAweDMwZWY7CiB0Lndha2F0YWthbmFoYWxmd2lkdGggPSAweGZmOWM7CiB0Lndha29yZWFuID0gMHgzMTU4OwogdC53YXNtYWxsaGlyYWdhbmEgPSAweDMwOGU7CiB0Lndhc21hbGxrYXRha2FuYSA9IDB4MzBlZTsKIHQud2F0dG9zcXVhcmUgPSAweDMzNTc7CiB0LndhdmVkYXNoID0gMHgzMDFjOwogdC53YXZ5dW5kZXJzY29yZXZlcnRpY2FsID0gMHhmZTM0OwogdC53YXdhcmFiaWMgPSAweDA2NDg7CiB0Lndhd2ZpbmFsYXJhYmljID0gMHhmZWVlOwogdC53YXdoYW16YWFib3ZlYXJhYmljID0gMHgwNjI0OwogdC53YXdoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlODY7CiB0Lndic3F1YXJlID0gMHgzM2RkOwogdC53Y2lyY2xlID0gMHgyNGU2OwogdC53Y2lyY3VtZmxleCA9IDB4MDE3NTsKIHQud2RpZXJlc2lzID0gMHgxZTg1OwogdC53ZG90YWNjZW50ID0gMHgxZTg3OwogdC53ZG90YmVsb3cgPSAweDFlODk7CiB0LndlaGlyYWdhbmEgPSAweDMwOTE7CiB0LndlaWVyc3RyYXNzID0gMHgyMTE4OwogdC53ZWthdGFrYW5hID0gMHgzMGYxOwogdC53ZWtvcmVhbiA9IDB4MzE1ZTsKIHQud2Vva29yZWFuID0gMHgzMTVkOwogdC53Z3JhdmUgPSAweDFlODE7CiB0LndoaXRlYnVsbGV0ID0gMHgyNWU2OwogdC53aGl0ZWNpcmNsZSA9IDB4MjVjYjsKIHQud2hpdGVjaXJjbGVpbnZlcnNlID0gMHgyNWQ5OwogdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0ID0gMHgzMDBlOwogdC53aGl0ZWNvcm5lcmJyYWNrZXRsZWZ0dmVydGljYWwgPSAweGZlNDM7CiB0LndoaXRlY29ybmVyYnJhY2tldHJpZ2h0ID0gMHgzMDBmOwogdC53aGl0ZWNvcm5lcmJyYWNrZXRyaWdodHZlcnRpY2FsID0gMHhmZTQ0OwogdC53aGl0ZWRpYW1vbmQgPSAweDI1Yzc7CiB0LndoaXRlZGlhbW9uZGNvbnRhaW5pbmdibGFja3NtYWxsZGlhbW9uZCA9IDB4MjVjODsKIHQud2hpdGVkb3ducG9pbnRpbmdzbWFsbHRyaWFuZ2xlID0gMHgyNWJmOwogdC53aGl0ZWRvd25wb2ludGluZ3RyaWFuZ2xlID0gMHgyNWJkOwogdC53aGl0ZWxlZnRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1YzM7CiB0LndoaXRlbGVmdHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YzE7CiB0LndoaXRlbGVudGljdWxhcmJyYWNrZXRsZWZ0ID0gMHgzMDE2OwogdC53aGl0ZWxlbnRpY3VsYXJicmFja2V0cmlnaHQgPSAweDMwMTc7CiB0LndoaXRlcmlnaHRwb2ludGluZ3NtYWxsdHJpYW5nbGUgPSAweDI1Yjk7CiB0LndoaXRlcmlnaHRwb2ludGluZ3RyaWFuZ2xlID0gMHgyNWI3OwogdC53aGl0ZXNtYWxsc3F1YXJlID0gMHgyNWFiOwogdC53aGl0ZXNtaWxpbmdmYWNlID0gMHgyNjNhOwogdC53aGl0ZXNxdWFyZSA9IDB4MjVhMTsKIHQud2hpdGVzdGFyID0gMHgyNjA2OwogdC53aGl0ZXRlbGVwaG9uZSA9IDB4MjYwZjsKIHQud2hpdGV0b3J0b2lzZXNoZWxsYnJhY2tldGxlZnQgPSAweDMwMTg7CiB0LndoaXRldG9ydG9pc2VzaGVsbGJyYWNrZXRyaWdodCA9IDB4MzAxOTsKIHQud2hpdGV1cHBvaW50aW5nc21hbGx0cmlhbmdsZSA9IDB4MjViNTsKIHQud2hpdGV1cHBvaW50aW5ndHJpYW5nbGUgPSAweDI1YjM7CiB0LndpaGlyYWdhbmEgPSAweDMwOTA7CiB0Lndpa2F0YWthbmEgPSAweDMwZjA7CiB0Lndpa29yZWFuID0gMHgzMTVmOwogdC53bW9ub3NwYWNlID0gMHhmZjU3OwogdC53b2hpcmFnYW5hID0gMHgzMDkyOwogdC53b2thdGFrYW5hID0gMHgzMGYyOwogdC53b2thdGFrYW5haGFsZndpZHRoID0gMHhmZjY2OwogdC53b24gPSAweDIwYTk7CiB0Lndvbm1vbm9zcGFjZSA9IDB4ZmZlNjsKIHQud293YWVudGhhaSA9IDB4MGUyNzsKIHQud3BhcmVuID0gMHgyNGIyOwogdC53cmluZyA9IDB4MWU5ODsKIHQud3N1cGVyaW9yID0gMHgwMmI3OwogdC53dHVybmVkID0gMHgwMjhkOwogdC53eW5uID0gMHgwMWJmOwogdC54ID0gMHgwMDc4OwogdC54YWJvdmVjbWIgPSAweDAzM2Q7CiB0Lnhib3BvbW9mbyA9IDB4MzExMjsKIHQueGNpcmNsZSA9IDB4MjRlNzsKIHQueGRpZXJlc2lzID0gMHgxZThkOwogdC54ZG90YWNjZW50ID0gMHgxZThiOwogdC54ZWhhcm1lbmlhbiA9IDB4MDU2ZDsKIHQueGkgPSAweDAzYmU7CiB0Lnhtb25vc3BhY2UgPSAweGZmNTg7CiB0LnhwYXJlbiA9IDB4MjRiMzsKIHQueHN1cGVyaW9yID0gMHgwMmUzOwogdC55ID0gMHgwMDc5OwogdC55YWFkb3NxdWFyZSA9IDB4MzM0ZTsKIHQueWFiZW5nYWxpID0gMHgwOWFmOwogdC55YWN1dGUgPSAweDAwZmQ7CiB0LnlhZGV2YSA9IDB4MDkyZjsKIHQueWFla29yZWFuID0gMHgzMTUyOwogdC55YWd1amFyYXRpID0gMHgwYWFmOwogdC55YWd1cm11a2hpID0gMHgwYTJmOwogdC55YWhpcmFnYW5hID0gMHgzMDg0OwogdC55YWthdGFrYW5hID0gMHgzMGU0OwogdC55YWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk0OwogdC55YWtvcmVhbiA9IDB4MzE1MTsKIHQueWFtYWtrYW50aGFpID0gMHgwZTRlOwogdC55YXNtYWxsaGlyYWdhbmEgPSAweDMwODM7CiB0Lnlhc21hbGxrYXRha2FuYSA9IDB4MzBlMzsKIHQueWFzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZjOwogdC55YXRjeXJpbGxpYyA9IDB4MDQ2MzsKIHQueWNpcmNsZSA9IDB4MjRlODsKIHQueWNpcmN1bWZsZXggPSAweDAxNzc7CiB0LnlkaWVyZXNpcyA9IDB4MDBmZjsKIHQueWRvdGFjY2VudCA9IDB4MWU4ZjsKIHQueWRvdGJlbG93ID0gMHgxZWY1OwogdC55ZWhhcmFiaWMgPSAweDA2NGE7CiB0LnllaGJhcnJlZWFyYWJpYyA9IDB4MDZkMjsKIHQueWVoYmFycmVlZmluYWxhcmFiaWMgPSAweGZiYWY7CiB0LnllaGZpbmFsYXJhYmljID0gMHhmZWYyOwogdC55ZWhoYW16YWFib3ZlYXJhYmljID0gMHgwNjI2OwogdC55ZWhoYW16YWFib3ZlZmluYWxhcmFiaWMgPSAweGZlOGE7CiB0LnllaGhhbXphYWJvdmVpbml0aWFsYXJhYmljID0gMHhmZThiOwogdC55ZWhoYW16YWFib3ZlbWVkaWFsYXJhYmljID0gMHhmZThjOwogdC55ZWhpbml0aWFsYXJhYmljID0gMHhmZWYzOwogdC55ZWhtZWRpYWxhcmFiaWMgPSAweGZlZjQ7CiB0LnllaG1lZW1pbml0aWFsYXJhYmljID0gMHhmY2RkOwogdC55ZWhtZWVtaXNvbGF0ZWRhcmFiaWMgPSAweGZjNTg7CiB0LnllaG5vb25maW5hbGFyYWJpYyA9IDB4ZmM5NDsKIHQueWVodGhyZWVkb3RzYmVsb3dhcmFiaWMgPSAweDA2ZDE7CiB0Lnlla29yZWFuID0gMHgzMTU2OwogdC55ZW4gPSAweDAwYTU7CiB0Lnllbm1vbm9zcGFjZSA9IDB4ZmZlNTsKIHQueWVva29yZWFuID0gMHgzMTU1OwogdC55ZW9yaW5oaWV1aGtvcmVhbiA9IDB4MzE4NjsKIHQueWVyYWhiZW55b21vaGVicmV3ID0gMHgwNWFhOwogdC55ZXJhaGJlbnlvbW9sZWZ0aGVicmV3ID0gMHgwNWFhOwogdC55ZXJpY3lyaWxsaWMgPSAweDA0NGI7CiB0LnllcnVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGY5OwogdC55ZXNpZXVuZ2tvcmVhbiA9IDB4MzE4MTsKIHQueWVzaWV1bmdwYW5zaW9za29yZWFuID0gMHgzMTgzOwogdC55ZXNpZXVuZ3Npb3Nrb3JlYW4gPSAweDMxODI7CiB0LnlldGl2aGVicmV3ID0gMHgwNTlhOwogdC55Z3JhdmUgPSAweDFlZjM7CiB0Lnlob29rID0gMHgwMWI0OwogdC55aG9va2Fib3ZlID0gMHgxZWY3OwogdC55aWFybWVuaWFuID0gMHgwNTc1OwogdC55aWN5cmlsbGljID0gMHgwNDU3OwogdC55aWtvcmVhbiA9IDB4MzE2MjsKIHQueWlueWFuZyA9IDB4MjYyZjsKIHQueWl3bmFybWVuaWFuID0gMHgwNTgyOwogdC55bW9ub3NwYWNlID0gMHhmZjU5OwogdC55b2QgPSAweDA1ZDk7CiB0LnlvZGRhZ2VzaCA9IDB4ZmIzOTsKIHQueW9kZGFnZXNoaGVicmV3ID0gMHhmYjM5OwogdC55b2RoZWJyZXcgPSAweDA1ZDk7CiB0LnlvZHlvZGhlYnJldyA9IDB4MDVmMjsKIHQueW9keW9kcGF0YWhoZWJyZXcgPSAweGZiMWY7CiB0LnlvaGlyYWdhbmEgPSAweDMwODg7CiB0LnlvaWtvcmVhbiA9IDB4MzE4OTsKIHQueW9rYXRha2FuYSA9IDB4MzBlODsKIHQueW9rYXRha2FuYWhhbGZ3aWR0aCA9IDB4ZmY5NjsKIHQueW9rb3JlYW4gPSAweDMxNWI7CiB0Lnlvc21hbGxoaXJhZ2FuYSA9IDB4MzA4NzsKIHQueW9zbWFsbGthdGFrYW5hID0gMHgzMGU3OwogdC55b3NtYWxsa2F0YWthbmFoYWxmd2lkdGggPSAweGZmNmU7CiB0LnlvdGdyZWVrID0gMHgwM2YzOwogdC55b3lhZWtvcmVhbiA9IDB4MzE4ODsKIHQueW95YWtvcmVhbiA9IDB4MzE4NzsKIHQueW95YWt0aGFpID0gMHgwZTIyOwogdC55b3lpbmd0aGFpID0gMHgwZTBkOwogdC55cGFyZW4gPSAweDI0YjQ7CiB0Lnlwb2dlZ3JhbW1lbmkgPSAweDAzN2E7CiB0Lnlwb2dlZ3JhbW1lbmlncmVla2NtYiA9IDB4MDM0NTsKIHQueXIgPSAweDAxYTY7CiB0LnlyaW5nID0gMHgxZTk5OwogdC55c3VwZXJpb3IgPSAweDAyYjg7CiB0Lnl0aWxkZSA9IDB4MWVmOTsKIHQueXR1cm5lZCA9IDB4MDI4ZTsKIHQueXVoaXJhZ2FuYSA9IDB4MzA4NjsKIHQueXVpa29yZWFuID0gMHgzMThjOwogdC55dWthdGFrYW5hID0gMHgzMGU2OwogdC55dWthdGFrYW5haGFsZndpZHRoID0gMHhmZjk1OwogdC55dWtvcmVhbiA9IDB4MzE2MDsKIHQueXVzYmlnY3lyaWxsaWMgPSAweDA0NmI7CiB0Lnl1c2JpZ2lvdGlmaWVkY3lyaWxsaWMgPSAweDA0NmQ7CiB0Lnl1c2xpdHRsZWN5cmlsbGljID0gMHgwNDY3OwogdC55dXNsaXR0bGVpb3RpZmllZGN5cmlsbGljID0gMHgwNDY5OwogdC55dXNtYWxsaGlyYWdhbmEgPSAweDMwODU7CiB0Lnl1c21hbGxrYXRha2FuYSA9IDB4MzBlNTsKIHQueXVzbWFsbGthdGFrYW5haGFsZndpZHRoID0gMHhmZjZkOwogdC55dXlla29yZWFuID0gMHgzMThiOwogdC55dXllb2tvcmVhbiA9IDB4MzE4YTsKIHQueXlhYmVuZ2FsaSA9IDB4MDlkZjsKIHQueXlhZGV2YSA9IDB4MDk1ZjsKIHQueiA9IDB4MDA3YTsKIHQuemFhcm1lbmlhbiA9IDB4MDU2NjsKIHQuemFjdXRlID0gMHgwMTdhOwogdC56YWRldmEgPSAweDA5NWI7CiB0LnphZ3VybXVraGkgPSAweDBhNWI7CiB0LnphaGFyYWJpYyA9IDB4MDYzODsKIHQuemFoZmluYWxhcmFiaWMgPSAweGZlYzY7CiB0LnphaGluaXRpYWxhcmFiaWMgPSAweGZlYzc7CiB0LnphaGlyYWdhbmEgPSAweDMwNTY7CiB0LnphaG1lZGlhbGFyYWJpYyA9IDB4ZmVjODsKIHQuemFpbmFyYWJpYyA9IDB4MDYzMjsKIHQuemFpbmZpbmFsYXJhYmljID0gMHhmZWIwOwogdC56YWthdGFrYW5hID0gMHgzMGI2OwogdC56YXFlZmdhZG9saGVicmV3ID0gMHgwNTk1OwogdC56YXFlZnFhdGFuaGVicmV3ID0gMHgwNTk0OwogdC56YXJxYWhlYnJldyA9IDB4MDU5ODsKIHQuemF5aW4gPSAweDA1ZDY7CiB0LnpheWluZGFnZXNoID0gMHhmYjM2OwogdC56YXlpbmRhZ2VzaGhlYnJldyA9IDB4ZmIzNjsKIHQuemF5aW5oZWJyZXcgPSAweDA1ZDY7CiB0Lnpib3BvbW9mbyA9IDB4MzExNzsKIHQuemNhcm9uID0gMHgwMTdlOwogdC56Y2lyY2xlID0gMHgyNGU5OwogdC56Y2lyY3VtZmxleCA9IDB4MWU5MTsKIHQuemN1cmwgPSAweDAyOTE7CiB0Lnpkb3QgPSAweDAxN2M7CiB0Lnpkb3RhY2NlbnQgPSAweDAxN2M7CiB0Lnpkb3RiZWxvdyA9IDB4MWU5MzsKIHQuemVjeXJpbGxpYyA9IDB4MDQzNzsKIHQuemVkZXNjZW5kZXJjeXJpbGxpYyA9IDB4MDQ5OTsKIHQuemVkaWVyZXNpc2N5cmlsbGljID0gMHgwNGRmOwogdC56ZWhpcmFnYW5hID0gMHgzMDVjOwogdC56ZWthdGFrYW5hID0gMHgzMGJjOwogdC56ZXJvID0gMHgwMDMwOwogdC56ZXJvYXJhYmljID0gMHgwNjYwOwogdC56ZXJvYmVuZ2FsaSA9IDB4MDllNjsKIHQuemVyb2RldmEgPSAweDA5NjY7CiB0Lnplcm9ndWphcmF0aSA9IDB4MGFlNjsKIHQuemVyb2d1cm11a2hpID0gMHgwYTY2OwogdC56ZXJvaGFja2FyYWJpYyA9IDB4MDY2MDsKIHQuemVyb2luZmVyaW9yID0gMHgyMDgwOwogdC56ZXJvbW9ub3NwYWNlID0gMHhmZjEwOwogdC56ZXJvb2xkc3R5bGUgPSAweGY3MzA7CiB0Lnplcm9wZXJzaWFuID0gMHgwNmYwOwogdC56ZXJvc3VwZXJpb3IgPSAweDIwNzA7CiB0Lnplcm90aGFpID0gMHgwZTUwOwogdC56ZXJvd2lkdGhqb2luZXIgPSAweGZlZmY7CiB0Lnplcm93aWR0aG5vbmpvaW5lciA9IDB4MjAwYzsKIHQuemVyb3dpZHRoc3BhY2UgPSAweDIwMGI7CiB0LnpldGEgPSAweDAzYjY7CiB0LnpoYm9wb21vZm8gPSAweDMxMTM7CiB0LnpoZWFybWVuaWFuID0gMHgwNTZhOwogdC56aGVicmV2ZWN5cmlsbGljID0gMHgwNGMyOwogdC56aGVjeXJpbGxpYyA9IDB4MDQzNjsKIHQuemhlZGVzY2VuZGVyY3lyaWxsaWMgPSAweDA0OTc7CiB0LnpoZWRpZXJlc2lzY3lyaWxsaWMgPSAweDA0ZGQ7CiB0LnppaGlyYWdhbmEgPSAweDMwNTg7CiB0Lnppa2F0YWthbmEgPSAweDMwYjg7CiB0Lnppbm9yaGVicmV3ID0gMHgwNWFlOwogdC56bGluZWJlbG93ID0gMHgxZTk1OwogdC56bW9ub3NwYWNlID0gMHhmZjVhOwogdC56b2hpcmFnYW5hID0gMHgzMDVlOwogdC56b2thdGFrYW5hID0gMHgzMGJlOwogdC56cGFyZW4gPSAweDI0YjU7CiB0LnpyZXRyb2ZsZXhob29rID0gMHgwMjkwOwogdC56c3Ryb2tlID0gMHgwMWI2OwogdC56dWhpcmFnYW5hID0gMHgzMDVhOwogdC56dWthdGFrYW5hID0gMHgzMGJhOwogdFsiLm5vdGRlZiJdID0gMHgwMDAwOwogdC5hbmdicmFja2V0bGVmdGJpZyA9IDB4MjMyOTsKIHQuYW5nYnJhY2tldGxlZnRCaWcgPSAweDIzMjk7CiB0LmFuZ2JyYWNrZXRsZWZ0YmlnZyA9IDB4MjMyOTsKIHQuYW5nYnJhY2tldGxlZnRCaWdnID0gMHgyMzI5OwogdC5hbmdicmFja2V0cmlnaHRCaWcgPSAweDIzMmE7CiB0LmFuZ2JyYWNrZXRyaWdodGJpZyA9IDB4MjMyYTsKIHQuYW5nYnJhY2tldHJpZ2h0QmlnZyA9IDB4MjMyYTsKIHQuYW5nYnJhY2tldHJpZ2h0YmlnZyA9IDB4MjMyYTsKIHQuYXJyb3dob29rbGVmdCA9IDB4MjFhYTsKIHQuYXJyb3dob29rcmlnaHQgPSAweDIxYTk7CiB0LmFycm93bGVmdHRvcGhhbGYgPSAweDIxYmM7CiB0LmFycm93bGVmdGJvdGhhbGYgPSAweDIxYmQ7CiB0LmFycm93bm9ydGhlYXN0ID0gMHgyMTk3OwogdC5hcnJvd25vcnRod2VzdCA9IDB4MjE5NjsKIHQuYXJyb3dyaWdodHRvcGhhbGYgPSAweDIxYzA7CiB0LmFycm93cmlnaHRib3RoYWxmID0gMHgyMWMxOwogdC5hcnJvd3NvdXRoZWFzdCA9IDB4MjE5ODsKIHQuYXJyb3dzb3V0aHdlc3QgPSAweDIxOTk7CiB0LmJhY2tzbGFzaGJpZyA9IDB4MjIxNjsKIHQuYmFja3NsYXNoQmlnID0gMHgyMjE2OwogdC5iYWNrc2xhc2hCaWdnID0gMHgyMjE2OwogdC5iYWNrc2xhc2hiaWdnID0gMHgyMjE2OwogdC5iYXJkYmwgPSAweDIwMTY7CiB0LmJyYWNlaHRpcGRvd25sZWZ0ID0gMHhmZTM3OwogdC5icmFjZWh0aXBkb3ducmlnaHQgPSAweGZlMzc7CiB0LmJyYWNlaHRpcHVwbGVmdCA9IDB4ZmUzODsKIHQuYnJhY2VodGlwdXByaWdodCA9IDB4ZmUzODsKIHQuYnJhY2VsZWZ0QmlnID0gMHgwMDdiOwogdC5icmFjZWxlZnRiaWcgPSAweDAwN2I7CiB0LmJyYWNlbGVmdGJpZ2cgPSAweDAwN2I7CiB0LmJyYWNlbGVmdEJpZ2cgPSAweDAwN2I7CiB0LmJyYWNlcmlnaHRCaWcgPSAweDAwN2Q7CiB0LmJyYWNlcmlnaHRiaWcgPSAweDAwN2Q7CiB0LmJyYWNlcmlnaHRiaWdnID0gMHgwMDdkOwogdC5icmFjZXJpZ2h0QmlnZyA9IDB4MDA3ZDsKIHQuYnJhY2tldGxlZnRiaWcgPSAweDAwNWI7CiB0LmJyYWNrZXRsZWZ0QmlnID0gMHgwMDViOwogdC5icmFja2V0bGVmdGJpZ2cgPSAweDAwNWI7CiB0LmJyYWNrZXRsZWZ0QmlnZyA9IDB4MDA1YjsKIHQuYnJhY2tldHJpZ2h0QmlnID0gMHgwMDVkOwogdC5icmFja2V0cmlnaHRiaWcgPSAweDAwNWQ7CiB0LmJyYWNrZXRyaWdodGJpZ2cgPSAweDAwNWQ7CiB0LmJyYWNrZXRyaWdodEJpZ2cgPSAweDAwNWQ7CiB0LmNlaWxpbmdsZWZ0YmlnID0gMHgyMzA4OwogdC5jZWlsaW5nbGVmdEJpZyA9IDB4MjMwODsKIHQuY2VpbGluZ2xlZnRCaWdnID0gMHgyMzA4OwogdC5jZWlsaW5nbGVmdGJpZ2cgPSAweDIzMDg7CiB0LmNlaWxpbmdyaWdodGJpZyA9IDB4MjMwOTsKIHQuY2VpbGluZ3JpZ2h0QmlnID0gMHgyMzA5OwogdC5jZWlsaW5ncmlnaHRiaWdnID0gMHgyMzA5OwogdC5jZWlsaW5ncmlnaHRCaWdnID0gMHgyMzA5OwogdC5jaXJjbGVkb3RkaXNwbGF5ID0gMHgyMjk5OwogdC5jaXJjbGVkb3R0ZXh0ID0gMHgyMjk5OwogdC5jaXJjbGVtdWx0aXBseWRpc3BsYXkgPSAweDIyOTc7CiB0LmNpcmNsZW11bHRpcGx5dGV4dCA9IDB4MjI5NzsKIHQuY2lyY2xlcGx1c2Rpc3BsYXkgPSAweDIyOTU7CiB0LmNpcmNsZXBsdXN0ZXh0ID0gMHgyMjk1OwogdC5jb250aW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJlOwogdC5jb250aW50ZWdyYWx0ZXh0ID0gMHgyMjJlOwogdC5jb3Byb2R1Y3RkaXNwbGF5ID0gMHgyMjEwOwogdC5jb3Byb2R1Y3R0ZXh0ID0gMHgyMjEwOwogdC5mbG9vcmxlZnRCaWcgPSAweDIzMGE7CiB0LmZsb29ybGVmdGJpZyA9IDB4MjMwYTsKIHQuZmxvb3JsZWZ0YmlnZyA9IDB4MjMwYTsKIHQuZmxvb3JsZWZ0QmlnZyA9IDB4MjMwYTsKIHQuZmxvb3JyaWdodGJpZyA9IDB4MjMwYjsKIHQuZmxvb3JyaWdodEJpZyA9IDB4MjMwYjsKIHQuZmxvb3JyaWdodEJpZ2cgPSAweDIzMGI7CiB0LmZsb29ycmlnaHRiaWdnID0gMHgyMzBiOwogdC5oYXR3aWRlID0gMHgwMzAyOwogdC5oYXR3aWRlciA9IDB4MDMwMjsKIHQuaGF0d2lkZXN0ID0gMHgwMzAyOwogdC5pbnRlcmNhbCA9IDB4MWQ0MDsKIHQuaW50ZWdyYWxkaXNwbGF5ID0gMHgyMjJiOwogdC5pbnRlZ3JhbHRleHQgPSAweDIyMmI7CiB0LmludGVyc2VjdGlvbmRpc3BsYXkgPSAweDIyYzI7CiB0LmludGVyc2VjdGlvbnRleHQgPSAweDIyYzI7CiB0LmxvZ2ljYWxhbmRkaXNwbGF5ID0gMHgyMjI3OwogdC5sb2dpY2FsYW5kdGV4dCA9IDB4MjIyNzsKIHQubG9naWNhbG9yZGlzcGxheSA9IDB4MjIyODsKIHQubG9naWNhbG9ydGV4dCA9IDB4MjIyODsKIHQucGFyZW5sZWZ0QmlnID0gMHgwMDI4OwogdC5wYXJlbmxlZnRiaWcgPSAweDAwMjg7CiB0LnBhcmVubGVmdEJpZ2cgPSAweDAwMjg7CiB0LnBhcmVubGVmdGJpZ2cgPSAweDAwMjg7CiB0LnBhcmVucmlnaHRCaWcgPSAweDAwMjk7CiB0LnBhcmVucmlnaHRiaWcgPSAweDAwMjk7CiB0LnBhcmVucmlnaHRCaWdnID0gMHgwMDI5OwogdC5wYXJlbnJpZ2h0YmlnZyA9IDB4MDAyOTsKIHQucHJpbWUgPSAweDIwMzI7CiB0LnByb2R1Y3RkaXNwbGF5ID0gMHgyMjBmOwogdC5wcm9kdWN0dGV4dCA9IDB4MjIwZjsKIHQucmFkaWNhbGJpZyA9IDB4MjIxYTsKIHQucmFkaWNhbEJpZyA9IDB4MjIxYTsKIHQucmFkaWNhbEJpZ2cgPSAweDIyMWE7CiB0LnJhZGljYWxiaWdnID0gMHgyMjFhOwogdC5yYWRpY2FsYnQgPSAweDIyMWE7CiB0LnJhZGljYWx0cCA9IDB4MjIxYTsKIHQucmFkaWNhbHZlcnRleCA9IDB4MjIxYTsKIHQuc2xhc2hiaWcgPSAweDAwMmY7CiB0LnNsYXNoQmlnID0gMHgwMDJmOwogdC5zbGFzaEJpZ2cgPSAweDAwMmY7CiB0LnNsYXNoYmlnZyA9IDB4MDAyZjsKIHQuc3VtbWF0aW9uZGlzcGxheSA9IDB4MjIxMTsKIHQuc3VtbWF0aW9udGV4dCA9IDB4MjIxMTsKIHQudGlsZGV3aWRlID0gMHgwMmRjOwogdC50aWxkZXdpZGVyID0gMHgwMmRjOwogdC50aWxkZXdpZGVzdCA9IDB4MDJkYzsKIHQudW5pb25kaXNwbGF5ID0gMHgyMmMzOwogdC51bmlvbm11bHRpZGlzcGxheSA9IDB4MjI4ZTsKIHQudW5pb25tdWx0aXRleHQgPSAweDIyOGU7CiB0LnVuaW9uc3FkaXNwbGF5ID0gMHgyMjk0OwogdC51bmlvbnNxdGV4dCA9IDB4MjI5NDsKIHQudW5pb250ZXh0ID0gMHgyMmMzOwogdC52ZXh0ZW5kZG91YmxlID0gMHgyMjI1OwogdC52ZXh0ZW5kc2luZ2xlID0gMHgyMjIzOwp9KTsKY29uc3QgZ2V0RGluZ2JhdHNHbHlwaHNVbmljb2RlID0gKDAsX2NvcmVfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiB0LnNwYWNlID0gMHgwMDIwOwogdC5hMSA9IDB4MjcwMTsKIHQuYTIgPSAweDI3MDI7CiB0LmEyMDIgPSAweDI3MDM7CiB0LmEzID0gMHgyNzA0OwogdC5hNCA9IDB4MjYwZTsKIHQuYTUgPSAweDI3MDY7CiB0LmExMTkgPSAweDI3MDc7CiB0LmExMTggPSAweDI3MDg7CiB0LmExMTcgPSAweDI3MDk7CiB0LmExMSA9IDB4MjYxYjsKIHQuYTEyID0gMHgyNjFlOwogdC5hMTMgPSAweDI3MGM7CiB0LmExNCA9IDB4MjcwZDsKIHQuYTE1ID0gMHgyNzBlOwogdC5hMTYgPSAweDI3MGY7CiB0LmExMDUgPSAweDI3MTA7CiB0LmExNyA9IDB4MjcxMTsKIHQuYTE4ID0gMHgyNzEyOwogdC5hMTkgPSAweDI3MTM7CiB0LmEyMCA9IDB4MjcxNDsKIHQuYTIxID0gMHgyNzE1OwogdC5hMjIgPSAweDI3MTY7CiB0LmEyMyA9IDB4MjcxNzsKIHQuYTI0ID0gMHgyNzE4OwogdC5hMjUgPSAweDI3MTk7CiB0LmEyNiA9IDB4MjcxYTsKIHQuYTI3ID0gMHgyNzFiOwogdC5hMjggPSAweDI3MWM7CiB0LmE2ID0gMHgyNzFkOwogdC5hNyA9IDB4MjcxZTsKIHQuYTggPSAweDI3MWY7CiB0LmE5ID0gMHgyNzIwOwogdC5hMTAgPSAweDI3MjE7CiB0LmEyOSA9IDB4MjcyMjsKIHQuYTMwID0gMHgyNzIzOwogdC5hMzEgPSAweDI3MjQ7CiB0LmEzMiA9IDB4MjcyNTsKIHQuYTMzID0gMHgyNzI2OwogdC5hMzQgPSAweDI3Mjc7CiB0LmEzNSA9IDB4MjYwNTsKIHQuYTM2ID0gMHgyNzI5OwogdC5hMzcgPSAweDI3MmE7CiB0LmEzOCA9IDB4MjcyYjsKIHQuYTM5ID0gMHgyNzJjOwogdC5hNDAgPSAweDI3MmQ7CiB0LmE0MSA9IDB4MjcyZTsKIHQuYTQyID0gMHgyNzJmOwogdC5hNDMgPSAweDI3MzA7CiB0LmE0NCA9IDB4MjczMTsKIHQuYTQ1ID0gMHgyNzMyOwogdC5hNDYgPSAweDI3MzM7CiB0LmE0NyA9IDB4MjczNDsKIHQuYTQ4ID0gMHgyNzM1OwogdC5hNDkgPSAweDI3MzY7CiB0LmE1MCA9IDB4MjczNzsKIHQuYTUxID0gMHgyNzM4OwogdC5hNTIgPSAweDI3Mzk7CiB0LmE1MyA9IDB4MjczYTsKIHQuYTU0ID0gMHgyNzNiOwogdC5hNTUgPSAweDI3M2M7CiB0LmE1NiA9IDB4MjczZDsKIHQuYTU3ID0gMHgyNzNlOwogdC5hNTggPSAweDI3M2Y7CiB0LmE1OSA9IDB4Mjc0MDsKIHQuYTYwID0gMHgyNzQxOwogdC5hNjEgPSAweDI3NDI7CiB0LmE2MiA9IDB4Mjc0MzsKIHQuYTYzID0gMHgyNzQ0OwogdC5hNjQgPSAweDI3NDU7CiB0LmE2NSA9IDB4Mjc0NjsKIHQuYTY2ID0gMHgyNzQ3OwogdC5hNjcgPSAweDI3NDg7CiB0LmE2OCA9IDB4Mjc0OTsKIHQuYTY5ID0gMHgyNzRhOwogdC5hNzAgPSAweDI3NGI7CiB0LmE3MSA9IDB4MjVjZjsKIHQuYTcyID0gMHgyNzRkOwogdC5hNzMgPSAweDI1YTA7CiB0LmE3NCA9IDB4Mjc0ZjsKIHQuYTIwMyA9IDB4Mjc1MDsKIHQuYTc1ID0gMHgyNzUxOwogdC5hMjA0ID0gMHgyNzUyOwogdC5hNzYgPSAweDI1YjI7CiB0LmE3NyA9IDB4MjViYzsKIHQuYTc4ID0gMHgyNWM2OwogdC5hNzkgPSAweDI3NTY7CiB0LmE4MSA9IDB4MjVkNzsKIHQuYTgyID0gMHgyNzU4OwogdC5hODMgPSAweDI3NTk7CiB0LmE4NCA9IDB4Mjc1YTsKIHQuYTk3ID0gMHgyNzViOwogdC5hOTggPSAweDI3NWM7CiB0LmE5OSA9IDB4Mjc1ZDsKIHQuYTEwMCA9IDB4Mjc1ZTsKIHQuYTEwMSA9IDB4Mjc2MTsKIHQuYTEwMiA9IDB4Mjc2MjsKIHQuYTEwMyA9IDB4Mjc2MzsKIHQuYTEwNCA9IDB4Mjc2NDsKIHQuYTEwNiA9IDB4Mjc2NTsKIHQuYTEwNyA9IDB4Mjc2NjsKIHQuYTEwOCA9IDB4Mjc2NzsKIHQuYTExMiA9IDB4MjY2MzsKIHQuYTExMSA9IDB4MjY2NjsKIHQuYTExMCA9IDB4MjY2NTsKIHQuYTEwOSA9IDB4MjY2MDsKIHQuYTEyMCA9IDB4MjQ2MDsKIHQuYTEyMSA9IDB4MjQ2MTsKIHQuYTEyMiA9IDB4MjQ2MjsKIHQuYTEyMyA9IDB4MjQ2MzsKIHQuYTEyNCA9IDB4MjQ2NDsKIHQuYTEyNSA9IDB4MjQ2NTsKIHQuYTEyNiA9IDB4MjQ2NjsKIHQuYTEyNyA9IDB4MjQ2NzsKIHQuYTEyOCA9IDB4MjQ2ODsKIHQuYTEyOSA9IDB4MjQ2OTsKIHQuYTEzMCA9IDB4Mjc3NjsKIHQuYTEzMSA9IDB4Mjc3NzsKIHQuYTEzMiA9IDB4Mjc3ODsKIHQuYTEzMyA9IDB4Mjc3OTsKIHQuYTEzNCA9IDB4Mjc3YTsKIHQuYTEzNSA9IDB4Mjc3YjsKIHQuYTEzNiA9IDB4Mjc3YzsKIHQuYTEzNyA9IDB4Mjc3ZDsKIHQuYTEzOCA9IDB4Mjc3ZTsKIHQuYTEzOSA9IDB4Mjc3ZjsKIHQuYTE0MCA9IDB4Mjc4MDsKIHQuYTE0MSA9IDB4Mjc4MTsKIHQuYTE0MiA9IDB4Mjc4MjsKIHQuYTE0MyA9IDB4Mjc4MzsKIHQuYTE0NCA9IDB4Mjc4NDsKIHQuYTE0NSA9IDB4Mjc4NTsKIHQuYTE0NiA9IDB4Mjc4NjsKIHQuYTE0NyA9IDB4Mjc4NzsKIHQuYTE0OCA9IDB4Mjc4ODsKIHQuYTE0OSA9IDB4Mjc4OTsKIHQuYTE1MCA9IDB4Mjc4YTsKIHQuYTE1MSA9IDB4Mjc4YjsKIHQuYTE1MiA9IDB4Mjc4YzsKIHQuYTE1MyA9IDB4Mjc4ZDsKIHQuYTE1NCA9IDB4Mjc4ZTsKIHQuYTE1NSA9IDB4Mjc4ZjsKIHQuYTE1NiA9IDB4Mjc5MDsKIHQuYTE1NyA9IDB4Mjc5MTsKIHQuYTE1OCA9IDB4Mjc5MjsKIHQuYTE1OSA9IDB4Mjc5MzsKIHQuYTE2MCA9IDB4Mjc5NDsKIHQuYTE2MSA9IDB4MjE5MjsKIHQuYTE2MyA9IDB4MjE5NDsKIHQuYTE2NCA9IDB4MjE5NTsKIHQuYTE5NiA9IDB4Mjc5ODsKIHQuYTE2NSA9IDB4Mjc5OTsKIHQuYTE5MiA9IDB4Mjc5YTsKIHQuYTE2NiA9IDB4Mjc5YjsKIHQuYTE2NyA9IDB4Mjc5YzsKIHQuYTE2OCA9IDB4Mjc5ZDsKIHQuYTE2OSA9IDB4Mjc5ZTsKIHQuYTE3MCA9IDB4Mjc5ZjsKIHQuYTE3MSA9IDB4MjdhMDsKIHQuYTE3MiA9IDB4MjdhMTsKIHQuYTE3MyA9IDB4MjdhMjsKIHQuYTE2MiA9IDB4MjdhMzsKIHQuYTE3NCA9IDB4MjdhNDsKIHQuYTE3NSA9IDB4MjdhNTsKIHQuYTE3NiA9IDB4MjdhNjsKIHQuYTE3NyA9IDB4MjdhNzsKIHQuYTE3OCA9IDB4MjdhODsKIHQuYTE3OSA9IDB4MjdhOTsKIHQuYTE5MyA9IDB4MjdhYTsKIHQuYTE4MCA9IDB4MjdhYjsKIHQuYTE5OSA9IDB4MjdhYzsKIHQuYTE4MSA9IDB4MjdhZDsKIHQuYTIwMCA9IDB4MjdhZTsKIHQuYTE4MiA9IDB4MjdhZjsKIHQuYTIwMSA9IDB4MjdiMTsKIHQuYTE4MyA9IDB4MjdiMjsKIHQuYTE4NCA9IDB4MjdiMzsKIHQuYTE5NyA9IDB4MjdiNDsKIHQuYTE4NSA9IDB4MjdiNTsKIHQuYTE5NCA9IDB4MjdiNjsKIHQuYTE5OCA9IDB4MjdiNzsKIHQuYTE4NiA9IDB4MjdiODsKIHQuYTE5NSA9IDB4MjdiOTsKIHQuYTE4NyA9IDB4MjdiYTsKIHQuYTE4OCA9IDB4MjdiYjsKIHQuYTE4OSA9IDB4MjdiYzsKIHQuYTE5MCA9IDB4MjdiZDsKIHQuYTE5MSA9IDB4MjdiZTsKIHQuYTg5ID0gMHgyNzY4OwogdC5hOTAgPSAweDI3Njk7CiB0LmE5MyA9IDB4Mjc2YTsKIHQuYTk0ID0gMHgyNzZiOwogdC5hOTEgPSAweDI3NmM7CiB0LmE5MiA9IDB4Mjc2ZDsKIHQuYTIwNSA9IDB4Mjc2ZTsKIHQuYTg1ID0gMHgyNzZmOwogdC5hMjA2ID0gMHgyNzcwOwogdC5hODYgPSAweDI3NzE7CiB0LmE4NyA9IDB4Mjc3MjsKIHQuYTg4ID0gMHgyNzczOwogdC5hOTUgPSAweDI3NzQ7CiB0LmE5NiA9IDB4Mjc3NTsKIHRbIi5ub3RkZWYiXSA9IDB4MDAwMDsKfSk7CgoKLyoqKi8gfSksCi8qIDQwICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCl9fd19wZGZqc19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTsKLyogaGFybW9ueSBleHBvcnQgKi8gX193X3BkZmpzX3JlcXVpcmVfXy5kKF9fd2VicGFja19leHBvcnRzX18sIHsKLyogaGFybW9ueSBleHBvcnQgKi8gICBjbGVhclVuaWNvZGVDYWNoZXM6ICgpID0+ICgvKiBiaW5kaW5nICovIGNsZWFyVW5pY29kZUNhY2hlcyksCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeTogKCkgPT4gKC8qIGJpbmRpbmcgKi8gZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeSksCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgZ2V0VW5pY29kZUZvckdseXBoOiAoKSA9PiAoLyogYmluZGluZyAqLyBnZXRVbmljb2RlRm9yR2x5cGgpLAovKiBoYXJtb255IGV4cG9ydCAqLyAgIGdldFVuaWNvZGVSYW5nZUZvcjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gZ2V0VW5pY29kZVJhbmdlRm9yKSwKLyogaGFybW9ueSBleHBvcnQgKi8gICBtYXBTcGVjaWFsVW5pY29kZVZhbHVlczogKCkgPT4gKC8qIGJpbmRpbmcgKi8gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXMpCi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX2NvcmVfdXRpbHNfanNfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7Cgpjb25zdCBnZXRTcGVjaWFsUFVBU3ltYm9scyA9ICgwLF9jb3JlX3V0aWxzX2pzX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18uZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogdFs2MzcyMV0gPSAweDAwYTk7CiB0WzYzMTkzXSA9IDB4MDBhOTsKIHRbNjM3MjBdID0gMHgwMGFlOwogdFs2MzE5NF0gPSAweDAwYWU7CiB0WzYzNzIyXSA9IDB4MjEyMjsKIHRbNjMxOTVdID0gMHgyMTIyOwogdFs2MzcyOV0gPSAweDIzYTc7CiB0WzYzNzMwXSA9IDB4MjNhODsKIHRbNjM3MzFdID0gMHgyM2E5OwogdFs2Mzc0MF0gPSAweDIzYWI7CiB0WzYzNzQxXSA9IDB4MjNhYzsKIHRbNjM3NDJdID0gMHgyM2FkOwogdFs2MzcyNl0gPSAweDIzYTE7CiB0WzYzNzI3XSA9IDB4MjNhMjsKIHRbNjM3MjhdID0gMHgyM2EzOwogdFs2MzczN10gPSAweDIzYTQ7CiB0WzYzNzM4XSA9IDB4MjNhNTsKIHRbNjM3MzldID0gMHgyM2E2OwogdFs2MzcyM10gPSAweDIzOWI7CiB0WzYzNzI0XSA9IDB4MjM5YzsKIHRbNjM3MjVdID0gMHgyMzlkOwogdFs2MzczNF0gPSAweDIzOWU7CiB0WzYzNzM1XSA9IDB4MjM5ZjsKIHRbNjM3MzZdID0gMHgyM2EwOwp9KTsKZnVuY3Rpb24gbWFwU3BlY2lhbFVuaWNvZGVWYWx1ZXMoY29kZSkgewogaWYgKGNvZGUgPj0gMHhmZmYwICYmIGNvZGUgPD0gMHhmZmZmKSB7CiAgcmV0dXJuIDA7CiB9IGVsc2UgaWYgKGNvZGUgPj0gMHhmNjAwICYmIGNvZGUgPD0gMHhmOGZmKSB7CiAgcmV0dXJuIGdldFNwZWNpYWxQVUFTeW1ib2xzKClbY29kZV0gfHwgY29kZTsKIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgwMGFkKSB7CiAgcmV0dXJuIDB4MDAyZDsKIH0KIHJldHVybiBjb2RlOwp9CmZ1bmN0aW9uIGdldFVuaWNvZGVGb3JHbHlwaChuYW1lLCBnbHlwaHNVbmljb2RlTWFwKSB7CiBsZXQgdW5pY29kZSA9IGdseXBoc1VuaWNvZGVNYXBbbmFtZV07CiBpZiAodW5pY29kZSAhPT0gdW5kZWZpbmVkKSB7CiAgcmV0dXJuIHVuaWNvZGU7CiB9CiBpZiAoIW5hbWUpIHsKICByZXR1cm4gLTE7CiB9CiBpZiAobmFtZVswXSA9PT0gInUiKSB7CiAgY29uc3QgbmFtZUxlbiA9IG5hbWUubGVuZ3RoOwogIGxldCBoZXhTdHI7CiAgaWYgKG5hbWVMZW4gPT09IDcgJiYgbmFtZVsxXSA9PT0gIm4iICYmIG5hbWVbMl0gPT09ICJpIikgewogICBoZXhTdHIgPSBuYW1lLnN1YnN0cmluZygzKTsKICB9IGVsc2UgaWYgKG5hbWVMZW4gPj0gNSAmJiBuYW1lTGVuIDw9IDcpIHsKICAgaGV4U3RyID0gbmFtZS5zdWJzdHJpbmcoMSk7CiAgfSBlbHNlIHsKICAgcmV0dXJuIC0xOwogIH0KICBpZiAoaGV4U3RyID09PSBoZXhTdHIudG9VcHBlckNhc2UoKSkgewogICB1bmljb2RlID0gcGFyc2VJbnQoaGV4U3RyLCAxNik7CiAgIGlmICh1bmljb2RlID49IDApIHsKICAgIHJldHVybiB1bmljb2RlOwogICB9CiAgfQogfQogcmV0dXJuIC0xOwp9CmNvbnN0IFVuaWNvZGVSYW5nZXMgPSBbCiBbCiAgMHgwMDAwLAogIDB4MDA3ZgogXSwKIFsKICAweDAwODAsCiAgMHgwMGZmCiBdLAogWwogIDB4MDEwMCwKICAweDAxN2YKIF0sCiBbCiAgMHgwMTgwLAogIDB4MDI0ZgogXSwKIFsKICAweDAyNTAsCiAgMHgwMmFmLAogIDB4MWQwMCwKICAweDFkN2YsCiAgMHgxZDgwLAogIDB4MWRiZgogXSwKIFsKICAweDAyYjAsCiAgMHgwMmZmLAogIDB4YTcwMCwKICAweGE3MWYKIF0sCiBbCiAgMHgwMzAwLAogIDB4MDM2ZiwKICAweDFkYzAsCiAgMHgxZGZmCiBdLAogWwogIDB4MDM3MCwKICAweDAzZmYKIF0sCiBbCiAgMHgyYzgwLAogIDB4MmNmZgogXSwKIFsKICAweDA0MDAsCiAgMHgwNGZmLAogIDB4MDUwMCwKICAweDA1MmYsCiAgMHgyZGUwLAogIDB4MmRmZiwKICAweGE2NDAsCiAgMHhhNjlmCiBdLAogWwogIDB4MDUzMCwKICAweDA1OGYKIF0sCiBbCiAgMHgwNTkwLAogIDB4MDVmZgogXSwKIFsKICAweGE1MDAsCiAgMHhhNjNmCiBdLAogWwogIDB4MDYwMCwKICAweDA2ZmYsCiAgMHgwNzUwLAogIDB4MDc3ZgogXSwKIFsKICAweDA3YzAsCiAgMHgwN2ZmCiBdLAogWwogIDB4MDkwMCwKICAweDA5N2YKIF0sCiBbCiAgMHgwOTgwLAogIDB4MDlmZgogXSwKIFsKICAweDBhMDAsCiAgMHgwYTdmCiBdLAogWwogIDB4MGE4MCwKICAweDBhZmYKIF0sCiBbCiAgMHgwYjAwLAogIDB4MGI3ZgogXSwKIFsKICAweDBiODAsCiAgMHgwYmZmCiBdLAogWwogIDB4MGMwMCwKICAweDBjN2YKIF0sCiBbCiAgMHgwYzgwLAogIDB4MGNmZgogXSwKIFsKICAweDBkMDAsCiAgMHgwZDdmCiBdLAogWwogIDB4MGUwMCwKICAweDBlN2YKIF0sCiBbCiAgMHgwZTgwLAogIDB4MGVmZgogXSwKIFsKICAweDEwYTAsCiAgMHgxMGZmLAogIDB4MmQwMCwKICAweDJkMmYKIF0sCiBbCiAgMHgxYjAwLAogIDB4MWI3ZgogXSwKIFsKICAweDExMDAsCiAgMHgxMWZmCiBdLAogWwogIDB4MWUwMCwKICAweDFlZmYsCiAgMHgyYzYwLAogIDB4MmM3ZiwKICAweGE3MjAsCiAgMHhhN2ZmCiBdLAogWwogIDB4MWYwMCwKICAweDFmZmYKIF0sCiBbCiAgMHgyMDAwLAogIDB4MjA2ZiwKICAweDJlMDAsCiAgMHgyZTdmCiBdLAogWwogIDB4MjA3MCwKICAweDIwOWYKIF0sCiBbCiAgMHgyMGEwLAogIDB4MjBjZgogXSwKIFsKICAweDIwZDAsCiAgMHgyMGZmCiBdLAogWwogIDB4MjEwMCwKICAweDIxNGYKIF0sCiBbCiAgMHgyMTUwLAogIDB4MjE4ZgogXSwKIFsKICAweDIxOTAsCiAgMHgyMWZmLAogIDB4MjdmMCwKICAweDI3ZmYsCiAgMHgyOTAwLAogIDB4Mjk3ZiwKICAweDJiMDAsCiAgMHgyYmZmCiBdLAogWwogIDB4MjIwMCwKICAweDIyZmYsCiAgMHgyYTAwLAogIDB4MmFmZiwKICAweDI3YzAsCiAgMHgyN2VmLAogIDB4Mjk4MCwKICAweDI5ZmYKIF0sCiBbCiAgMHgyMzAwLAogIDB4MjNmZgogXSwKIFsKICAweDI0MDAsCiAgMHgyNDNmCiBdLAogWwogIDB4MjQ0MCwKICAweDI0NWYKIF0sCiBbCiAgMHgyNDYwLAogIDB4MjRmZgogXSwKIFsKICAweDI1MDAsCiAgMHgyNTdmCiBdLAogWwogIDB4MjU4MCwKICAweDI1OWYKIF0sCiBbCiAgMHgyNWEwLAogIDB4MjVmZgogXSwKIFsKICAweDI2MDAsCiAgMHgyNmZmCiBdLAogWwogIDB4MjcwMCwKICAweDI3YmYKIF0sCiBbCiAgMHgzMDAwLAogIDB4MzAzZgogXSwKIFsKICAweDMwNDAsCiAgMHgzMDlmCiBdLAogWwogIDB4MzBhMCwKICAweDMwZmYsCiAgMHgzMWYwLAogIDB4MzFmZgogXSwKIFsKICAweDMxMDAsCiAgMHgzMTJmLAogIDB4MzFhMCwKICAweDMxYmYKIF0sCiBbCiAgMHgzMTMwLAogIDB4MzE4ZgogXSwKIFsKICAweGE4NDAsCiAgMHhhODdmCiBdLAogWwogIDB4MzIwMCwKICAweDMyZmYKIF0sCiBbCiAgMHgzMzAwLAogIDB4MzNmZgogXSwKIFsKICAweGFjMDAsCiAgMHhkN2FmCiBdLAogWwogIDB4ZDgwMCwKICAweGRmZmYKIF0sCiBbCiAgMHgxMDkwMCwKICAweDEwOTFmCiBdLAogWwogIDB4NGUwMCwKICAweDlmZmYsCiAgMHgyZTgwLAogIDB4MmVmZiwKICAweDJmMDAsCiAgMHgyZmRmLAogIDB4MmZmMCwKICAweDJmZmYsCiAgMHgzNDAwLAogIDB4NGRiZiwKICAweDIwMDAwLAogIDB4MmE2ZGYsCiAgMHgzMTkwLAogIDB4MzE5ZgogXSwKIFsKICAweGUwMDAsCiAgMHhmOGZmCiBdLAogWwogIDB4MzFjMCwKICAweDMxZWYsCiAgMHhmOTAwLAogIDB4ZmFmZiwKICAweDJmODAwLAogIDB4MmZhMWYKIF0sCiBbCiAgMHhmYjAwLAogIDB4ZmI0ZgogXSwKIFsKICAweGZiNTAsCiAgMHhmZGZmCiBdLAogWwogIDB4ZmUyMCwKICAweGZlMmYKIF0sCiBbCiAgMHhmZTEwLAogIDB4ZmUxZgogXSwKIFsKICAweGZlNTAsCiAgMHhmZTZmCiBdLAogWwogIDB4ZmU3MCwKICAweGZlZmYKIF0sCiBbCiAgMHhmZjAwLAogIDB4ZmZlZgogXSwKIFsKICAweGZmZjAsCiAgMHhmZmZmCiBdLAogWwogIDB4MGYwMCwKICAweDBmZmYKIF0sCiBbCiAgMHgwNzAwLAogIDB4MDc0ZgogXSwKIFsKICAweDA3ODAsCiAgMHgwN2JmCiBdLAogWwogIDB4MGQ4MCwKICAweDBkZmYKIF0sCiBbCiAgMHgxMDAwLAogIDB4MTA5ZgogXSwKIFsKICAweDEyMDAsCiAgMHgxMzdmLAogIDB4MTM4MCwKICAweDEzOWYsCiAgMHgyZDgwLAogIDB4MmRkZgogXSwKIFsKICAweDEzYTAsCiAgMHgxM2ZmCiBdLAogWwogIDB4MTQwMCwKICAweDE2N2YKIF0sCiBbCiAgMHgxNjgwLAogIDB4MTY5ZgogXSwKIFsKICAweDE2YTAsCiAgMHgxNmZmCiBdLAogWwogIDB4MTc4MCwKICAweDE3ZmYKIF0sCiBbCiAgMHgxODAwLAogIDB4MThhZgogXSwKIFsKICAweDI4MDAsCiAgMHgyOGZmCiBdLAogWwogIDB4YTAwMCwKICAweGE0OGYKIF0sCiBbCiAgMHgxNzAwLAogIDB4MTcxZiwKICAweDE3MjAsCiAgMHgxNzNmLAogIDB4MTc0MCwKICAweDE3NWYsCiAgMHgxNzYwLAogIDB4MTc3ZgogXSwKIFsKICAweDEwMzAwLAogIDB4MTAzMmYKIF0sCiBbCiAgMHgxMDMzMCwKICAweDEwMzRmCiBdLAogWwogIDB4MTA0MDAsCiAgMHgxMDQ0ZgogXSwKIFsKICAweDFkMDAwLAogIDB4MWQwZmYsCiAgMHgxZDEwMCwKICAweDFkMWZmLAogIDB4MWQyMDAsCiAgMHgxZDI0ZgogXSwKIFsKICAweDFkNDAwLAogIDB4MWQ3ZmYKIF0sCiBbCiAgMHhmZjAwMCwKICAweGZmZmZkCiBdLAogWwogIDB4ZmUwMCwKICAweGZlMGYsCiAgMHhlMDEwMCwKICAweGUwMWVmCiBdLAogWwogIDB4ZTAwMDAsCiAgMHhlMDA3ZgogXSwKIFsKICAweDE5MDAsCiAgMHgxOTRmCiBdLAogWwogIDB4MTk1MCwKICAweDE5N2YKIF0sCiBbCiAgMHgxOTgwLAogIDB4MTlkZgogXSwKIFsKICAweDFhMDAsCiAgMHgxYTFmCiBdLAogWwogIDB4MmMwMCwKICAweDJjNWYKIF0sCiBbCiAgMHgyZDMwLAogIDB4MmQ3ZgogXSwKIFsKICAweDRkYzAsCiAgMHg0ZGZmCiBdLAogWwogIDB4YTgwMCwKICAweGE4MmYKIF0sCiBbCiAgMHgxMDAwMCwKICAweDEwMDdmLAogIDB4MTAwODAsCiAgMHgxMDBmZiwKICAweDEwMTAwLAogIDB4MTAxM2YKIF0sCiBbCiAgMHgxMDE0MCwKICAweDEwMThmCiBdLAogWwogIDB4MTAzODAsCiAgMHgxMDM5ZgogXSwKIFsKICAweDEwM2EwLAogIDB4MTAzZGYKIF0sCiBbCiAgMHgxMDQ1MCwKICAweDEwNDdmCiBdLAogWwogIDB4MTA0ODAsCiAgMHgxMDRhZgogXSwKIFsKICAweDEwODAwLAogIDB4MTA4M2YKIF0sCiBbCiAgMHgxMGEwMCwKICAweDEwYTVmCiBdLAogWwogIDB4MWQzMDAsCiAgMHgxZDM1ZgogXSwKIFsKICAweDEyMDAwLAogIDB4MTIzZmYsCiAgMHgxMjQwMCwKICAweDEyNDdmCiBdLAogWwogIDB4MWQzNjAsCiAgMHgxZDM3ZgogXSwKIFsKICAweDFiODAsCiAgMHgxYmJmCiBdLAogWwogIDB4MWMwMCwKICAweDFjNGYKIF0sCiBbCiAgMHgxYzUwLAogIDB4MWM3ZgogXSwKIFsKICAweGE4ODAsCiAgMHhhOGRmCiBdLAogWwogIDB4YTkwMCwKICAweGE5MmYKIF0sCiBbCiAgMHhhOTMwLAogIDB4YTk1ZgogXSwKIFsKICAweGFhMDAsCiAgMHhhYTVmCiBdLAogWwogIDB4MTAxOTAsCiAgMHgxMDFjZgogXSwKIFsKICAweDEwMWQwLAogIDB4MTAxZmYKIF0sCiBbCiAgMHgxMDJhMCwKICAweDEwMmRmLAogIDB4MTAyODAsCiAgMHgxMDI5ZiwKICAweDEwOTIwLAogIDB4MTA5M2YKIF0sCiBbCiAgMHgxZjAzMCwKICAweDFmMDlmLAogIDB4MWYwMDAsCiAgMHgxZjAyZgogXQpdOwpmdW5jdGlvbiBnZXRVbmljb2RlUmFuZ2VGb3IodmFsdWUsIGxhc3RQb3NpdGlvbiA9IC0xKSB7CiBpZiAobGFzdFBvc2l0aW9uICE9PSAtMSkgewogIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tsYXN0UG9zaXRpb25dOwogIGZvciAobGV0IGkgPSAwLCBpaSA9IHJhbmdlLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgaWYgKHZhbHVlID49IHJhbmdlW2ldICYmIHZhbHVlIDw9IHJhbmdlW2kgKyAxXSkgewogICAgcmV0dXJuIGxhc3RQb3NpdGlvbjsKICAgfQogIH0KIH0KIGZvciAobGV0IGkgPSAwLCBpaSA9IFVuaWNvZGVSYW5nZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogIGNvbnN0IHJhbmdlID0gVW5pY29kZVJhbmdlc1tpXTsKICBmb3IgKGxldCBqID0gMCwgamogPSByYW5nZS5sZW5ndGg7IGogPCBqajsgaiArPSAyKSB7CiAgIGlmICh2YWx1ZSA+PSByYW5nZVtqXSAmJiB2YWx1ZSA8PSByYW5nZVtqICsgMV0pIHsKICAgIHJldHVybiBpOwogICB9CiAgfQogfQogcmV0dXJuIC0xOwp9CmNvbnN0IFNwZWNpYWxDaGFyUmVnRXhwID0gbmV3IFJlZ0V4cCgiXihcXHMpfChcXHB7TW59KXwoXFxwe0NmfSkkIiwgInUiKTsKY29uc3QgQ2F0ZWdvcnlDYWNoZSA9IG5ldyBNYXAoKTsKZnVuY3Rpb24gZ2V0Q2hhclVuaWNvZGVDYXRlZ29yeShjaGFyKSB7CiBjb25zdCBjYWNoZWRDYXRlZ29yeSA9IENhdGVnb3J5Q2FjaGUuZ2V0KGNoYXIpOwogaWYgKGNhY2hlZENhdGVnb3J5KSB7CiAgcmV0dXJuIGNhY2hlZENhdGVnb3J5OwogfQogY29uc3QgZ3JvdXBzID0gY2hhci5tYXRjaChTcGVjaWFsQ2hhclJlZ0V4cCk7CiBjb25zdCBjYXRlZ29yeSA9IHsKICBpc1doaXRlc3BhY2U6ICEhZ3JvdXBzPy5bMV0sCiAgaXNaZXJvV2lkdGhEaWFjcml0aWM6ICEhZ3JvdXBzPy5bMl0sCiAgaXNJbnZpc2libGVGb3JtYXRNYXJrOiAhIWdyb3Vwcz8uWzNdCiB9OwogQ2F0ZWdvcnlDYWNoZS5zZXQoY2hhciwgY2F0ZWdvcnkpOwogcmV0dXJuIGNhdGVnb3J5Owp9CmZ1bmN0aW9uIGNsZWFyVW5pY29kZUNhY2hlcygpIHsKIENhdGVnb3J5Q2FjaGUuY2xlYXIoKTsKfQoKCi8qKiovIH0pLAovKiA0MSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLmdldFNlcmlmRm9udHMgPSBleHBvcnRzLmdldE5vblN0ZEZvbnRNYXAgPSBleHBvcnRzLmdldEdseXBoTWFwRm9yU3RhbmRhcmRGb250cyA9IGV4cG9ydHMuZ2V0Rm9udE5hbWVUb0ZpbGVNYXAgPSB2b2lkIDA7CmV4cG9ydHMuZ2V0U3RhbmRhcmRGb250TmFtZSA9IGdldFN0YW5kYXJkRm9udE5hbWU7CmV4cG9ydHMuZ2V0U3ltYm9sc0ZvbnRzID0gZXhwb3J0cy5nZXRTdXBwbGVtZW50YWxHbHlwaE1hcEZvckNhbGlicmkgPSBleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGV4cG9ydHMuZ2V0U3RkRm9udE1hcCA9IHZvaWQgMDsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKdmFyIF9mb250c191dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzgpOwpjb25zdCBnZXRTdGRGb250TWFwID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICB0WyJUaW1lcy1Sb21hbiJdID0gIlRpbWVzLVJvbWFuIjsKICB0LkhlbHZldGljYSA9ICJIZWx2ZXRpY2EiOwogIHQuQ291cmllciA9ICJDb3VyaWVyIjsKICB0LlN5bWJvbCA9ICJTeW1ib2wiOwogIHRbIlRpbWVzLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJIZWx2ZXRpY2EtQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJDb3VyaWVyLUJvbGQiOwogIHQuWmFwZkRpbmdiYXRzID0gIlphcGZEaW5nYmF0cyI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKICB0WyJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0LkFyaWFsTmFycm93ID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxOYXJyb3ctQm9sZCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbE5hcnJvdy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJBcmlhbE5hcnJvdy1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdC5BcmlhbEJsYWNrID0gIkhlbHZldGljYSI7CiAgdFsiQXJpYWxCbGFjay1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWxCbGFjay1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2siXSA9ICJIZWx2ZXRpY2EiOwogIHRbIkFyaWFsLUJsYWNrLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtQmxhY2stQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQmxhY2stSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWwgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkFyaWFsTVQgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsLUJvbGRNVCJdID0gIkhlbHZldGljYS1Cb2xkIjsKICB0WyJBcmlhbC1JdGFsaWNNVCJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQtQm9sZEl0YWxpYyJdID0gIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSI7CiAgdFsiQXJpYWwtQm9sZE1ULUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQXJpYWwtSXRhbGljTVQtSXRhbGljIl0gPSAiSGVsdmV0aWNhLU9ibGlxdWUiOwogIHQuQXJpYWxVbmljb2RlTVMgPSAiSGVsdmV0aWNhIjsKICB0WyJBcmlhbFVuaWNvZGVNUy1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkFyaWFsVW5pY29kZU1TLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkFyaWFsVW5pY29kZU1TLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0WyJDb3VyaWVyLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CiAgdC5Db3VyaWVyTmV3ID0gIkNvdXJpZXIiOwogIHRbIkNvdXJpZXJOZXctQm9sZCJdID0gIkNvdXJpZXItQm9sZCI7CiAgdFsiQ291cmllck5ldy1Cb2xkSXRhbGljIl0gPSAiQ291cmllci1Cb2xkT2JsaXF1ZSI7CiAgdFsiQ291cmllck5ldy1JdGFsaWMiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHRbIkNvdXJpZXJOZXdQUy1Cb2xkSXRhbGljTVQiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJDb3VyaWVyTmV3UFMtQm9sZE1UIl0gPSAiQ291cmllci1Cb2xkIjsKICB0WyJDb3VyaWVyTmV3UFMtSXRhbGljTVQiXSA9ICJDb3VyaWVyLU9ibGlxdWUiOwogIHQuQ291cmllck5ld1BTTVQgPSAiQ291cmllciI7CiAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiOwogIHRbIkhlbHZldGljYS1JdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiU3ltYm9sLUJvbGQiXSA9ICJTeW1ib2wiOwogIHRbIlN5bWJvbC1Cb2xkSXRhbGljIl0gPSAiU3ltYm9sIjsKICB0WyJTeW1ib2wtSXRhbGljIl0gPSAiU3ltYm9sIjsKICB0LlRpbWVzTmV3Um9tYW4gPSAiVGltZXMtUm9tYW4iOwogIHRbIlRpbWVzTmV3Um9tYW4tQm9sZCJdID0gIlRpbWVzLUJvbGQiOwogIHRbIlRpbWVzTmV3Um9tYW4tQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW4tSXRhbGljIl0gPSAiVGltZXMtSXRhbGljIjsKICB0LlRpbWVzTmV3Um9tYW5QUyA9ICJUaW1lcy1Sb21hbiI7CiAgdFsiVGltZXNOZXdSb21hblBTLUJvbGQiXSA9ICJUaW1lcy1Cb2xkIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiXSA9ICJUaW1lcy1Cb2xkSXRhbGljIjsKICB0WyJUaW1lc05ld1JvbWFuUFMtQm9sZE1UIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7CiAgdFsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIl0gPSAiVGltZXMtSXRhbGljIjsKICB0LlRpbWVzTmV3Um9tYW5QU01UID0gIlRpbWVzLVJvbWFuIjsKICB0WyJUaW1lc05ld1JvbWFuUFNNVC1Cb2xkIl0gPSAiVGltZXMtQm9sZCI7CiAgdFsiVGltZXNOZXdSb21hblBTTVQtQm9sZEl0YWxpYyJdID0gIlRpbWVzLUJvbGRJdGFsaWMiOwogIHRbIlRpbWVzTmV3Um9tYW5QU01ULUl0YWxpYyJdID0gIlRpbWVzLUl0YWxpYyI7Cn0pOwpleHBvcnRzLmdldFN0ZEZvbnRNYXAgPSBnZXRTdGRGb250TWFwOwpjb25zdCBnZXRGb250TmFtZVRvRmlsZU1hcCA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gIkZveGl0Rml4ZWQucGZiIjsKICB0WyJDb3VyaWVyLUJvbGQiXSA9ICJGb3hpdEZpeGVkQm9sZC5wZmIiOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9ICJGb3hpdEZpeGVkQm9sZEl0YWxpYy5wZmIiOwogIHRbIkNvdXJpZXItT2JsaXF1ZSJdID0gIkZveGl0Rml4ZWRJdGFsaWMucGZiIjsKICB0LkhlbHZldGljYSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9ICJMaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZiI7CiAgdFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwogIHRbIkhlbHZldGljYS1PYmxpcXVlIl0gPSAiTGliZXJhdGlvblNhbnMtSXRhbGljLnR0ZiI7CiAgdFsiVGltZXMtUm9tYW4iXSA9ICJGb3hpdFNlcmlmLnBmYiI7CiAgdFsiVGltZXMtQm9sZCJdID0gIkZveGl0U2VyaWZCb2xkLnBmYiI7CiAgdFsiVGltZXMtQm9sZEl0YWxpYyJdID0gIkZveGl0U2VyaWZCb2xkSXRhbGljLnBmYiI7CiAgdFsiVGltZXMtSXRhbGljIl0gPSAiRm94aXRTZXJpZkl0YWxpYy5wZmIiOwogIHQuU3ltYm9sID0gIkZveGl0U3ltYm9sLnBmYiI7CiAgdC5aYXBmRGluZ2JhdHMgPSAiRm94aXREaW5nYmF0cy5wZmIiOwogIHRbIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiXSA9ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiI7CiAgdFsiTGliZXJhdGlvblNhbnMtQm9sZCJdID0gIkxpYmVyYXRpb25TYW5zLUJvbGQudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiXSA9ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIjsKICB0WyJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIl0gPSAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiOwp9KTsKZXhwb3J0cy5nZXRGb250TmFtZVRvRmlsZU1hcCA9IGdldEZvbnROYW1lVG9GaWxlTWFwOwpjb25zdCBnZXROb25TdGRGb250TWFwID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICB0LkNhbGlicmkgPSAiSGVsdmV0aWNhIjsKICB0WyJDYWxpYnJpLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJDYWxpYnJpLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkNlbnR1cnlHb3RoaWMgPSAiSGVsdmV0aWNhIjsKICB0WyJDZW50dXJ5R290aGljLUJvbGQiXSA9ICJIZWx2ZXRpY2EtQm9sZCI7CiAgdFsiQ2VudHVyeUdvdGhpYy1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJDZW50dXJ5R290aGljLUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0LkNvbWljU2Fuc01TID0gIkNvbWljIFNhbnMgTVMiOwogIHRbIkNvbWljU2Fuc01TLUJvbGQiXSA9ICJDb21pYyBTYW5zIE1TLUJvbGQiOwogIHRbIkNvbWljU2Fuc01TLUJvbGRJdGFsaWMiXSA9ICJDb21pYyBTYW5zIE1TLUJvbGRJdGFsaWMiOwogIHRbIkNvbWljU2Fuc01TLUl0YWxpYyJdID0gIkNvbWljIFNhbnMgTVMtSXRhbGljIjsKICB0LkltcGFjdCA9ICJIZWx2ZXRpY2EiOwogIHRbIkl0Y1N5bWJvbC1Cb2xkIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIkl0Y1N5bWJvbC1Cb2xkSXRhbGljIl0gPSAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIjsKICB0WyJJdGNTeW1ib2wtQm9vayJdID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLUJvb2tJdGFsaWMiXSA9ICJIZWx2ZXRpY2EtT2JsaXF1ZSI7CiAgdFsiSXRjU3ltYm9sLU1lZGl1bSJdID0gIkhlbHZldGljYSI7CiAgdFsiSXRjU3ltYm9sLU1lZGl1bUl0YWxpYyJdID0gIkhlbHZldGljYS1PYmxpcXVlIjsKICB0Lkx1Y2lkYUNvbnNvbGUgPSAiQ291cmllciI7CiAgdFsiTHVjaWRhQ29uc29sZS1Cb2xkIl0gPSAiQ291cmllci1Cb2xkIjsKICB0WyJMdWNpZGFDb25zb2xlLUJvbGRJdGFsaWMiXSA9ICJDb3VyaWVyLUJvbGRPYmxpcXVlIjsKICB0WyJMdWNpZGFDb25zb2xlLUl0YWxpYyJdID0gIkNvdXJpZXItT2JsaXF1ZSI7CiAgdFsiTHVjaWRhU2Fucy1EZW1pIl0gPSAiSGVsdmV0aWNhLUJvbGQiOwogIHRbIk1TLUdvdGhpYyJdID0gIk1TIEdvdGhpYyI7CiAgdFsiTVMtR290aGljLUJvbGQiXSA9ICJNUyBHb3RoaWMtQm9sZCI7CiAgdFsiTVMtR290aGljLUJvbGRJdGFsaWMiXSA9ICJNUyBHb3RoaWMtQm9sZEl0YWxpYyI7CiAgdFsiTVMtR290aGljLUl0YWxpYyJdID0gIk1TIEdvdGhpYy1JdGFsaWMiOwogIHRbIk1TLU1pbmNobyJdID0gIk1TIE1pbmNobyI7CiAgdFsiTVMtTWluY2hvLUJvbGQiXSA9ICJNUyBNaW5jaG8tQm9sZCI7CiAgdFsiTVMtTWluY2hvLUJvbGRJdGFsaWMiXSA9ICJNUyBNaW5jaG8tQm9sZEl0YWxpYyI7CiAgdFsiTVMtTWluY2hvLUl0YWxpYyJdID0gIk1TIE1pbmNoby1JdGFsaWMiOwogIHRbIk1TLVBHb3RoaWMiXSA9ICJNUyBQR290aGljIjsKICB0WyJNUy1QR290aGljLUJvbGQiXSA9ICJNUyBQR290aGljLUJvbGQiOwogIHRbIk1TLVBHb3RoaWMtQm9sZEl0YWxpYyJdID0gIk1TIFBHb3RoaWMtQm9sZEl0YWxpYyI7CiAgdFsiTVMtUEdvdGhpYy1JdGFsaWMiXSA9ICJNUyBQR290aGljLUl0YWxpYyI7CiAgdFsiTVMtUE1pbmNobyJdID0gIk1TIFBNaW5jaG8iOwogIHRbIk1TLVBNaW5jaG8tQm9sZCJdID0gIk1TIFBNaW5jaG8tQm9sZCI7CiAgdFsiTVMtUE1pbmNoby1Cb2xkSXRhbGljIl0gPSAiTVMgUE1pbmNoby1Cb2xkSXRhbGljIjsKICB0WyJNUy1QTWluY2hvLUl0YWxpYyJdID0gIk1TIFBNaW5jaG8tSXRhbGljIjsKICB0Lk51cHRpYWxTY3JpcHQgPSAiVGltZXMtSXRhbGljIjsKICB0LlNlZ29lVUlTeW1ib2wgPSAiSGVsdmV0aWNhIjsKfSk7CmV4cG9ydHMuZ2V0Tm9uU3RkRm9udE1hcCA9IGdldE5vblN0ZEZvbnRNYXA7CmNvbnN0IGdldFNlcmlmRm9udHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogIHRbIkFkb2JlIEplbnNvbiJdID0gdHJ1ZTsKICB0WyJBZG9iZSBUZXh0Il0gPSB0cnVlOwogIHQuQWxiZXJ0dXMgPSB0cnVlOwogIHQuQWxkdXMgPSB0cnVlOwogIHQuQWxleGFuZHJpYSA9IHRydWU7CiAgdC5BbGdlcmlhbiA9IHRydWU7CiAgdFsiQW1lcmljYW4gVHlwZXdyaXRlciJdID0gdHJ1ZTsKICB0LkFudGlxdWEgPSB0cnVlOwogIHQuQXBleCA9IHRydWU7CiAgdC5Bcm5vID0gdHJ1ZTsKICB0LkFzdGVyID0gdHJ1ZTsKICB0LkF1cm9yYSA9IHRydWU7CiAgdC5CYXNrZXJ2aWxsZSA9IHRydWU7CiAgdC5CZWxsID0gdHJ1ZTsKICB0LkJlbWJvID0gdHJ1ZTsKICB0WyJCZW1ibyBTY2hvb2xib29rIl0gPSB0cnVlOwogIHQuQmVuZ3VpYXQgPSB0cnVlOwogIHRbIkJlcmtlbGV5IE9sZCBTdHlsZSJdID0gdHJ1ZTsKICB0WyJCZXJuaGFyZCBNb2Rlcm4iXSA9IHRydWU7CiAgdFsiQmVydGhvbGQgQ2l0eSJdID0gdHJ1ZTsKICB0LkJvZG9uaSA9IHRydWU7CiAgdFsiQmF1ZXIgQm9kb25pIl0gPSB0cnVlOwogIHRbIkJvb2sgQW50aXF1YSJdID0gdHJ1ZTsKICB0LkJvb2ttYW4gPSB0cnVlOwogIHRbIkJvcmRlYXV4IFJvbWFuIl0gPSB0cnVlOwogIHRbIkNhbGlmb3JuaWFuIEZCIl0gPSB0cnVlOwogIHQuQ2FsaXN0byA9IHRydWU7CiAgdC5DYWx2ZXJ0ID0gdHJ1ZTsKICB0LkNhcGl0YWxzID0gdHJ1ZTsKICB0LkNhbWJyaWEgPSB0cnVlOwogIHQuQ2FydGllciA9IHRydWU7CiAgdC5DYXNsb24gPSB0cnVlOwogIHQuQ2F0dWxsID0gdHJ1ZTsKICB0LkNlbnRhdXIgPSB0cnVlOwogIHRbIkNlbnR1cnkgT2xkIFN0eWxlIl0gPSB0cnVlOwogIHRbIkNlbnR1cnkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LkNoYXBhcnJhbCA9IHRydWU7CiAgdFsiQ2hhcmlzIFNJTCJdID0gdHJ1ZTsKICB0LkNoZWx0ZW5oYW0gPSB0cnVlOwogIHRbIkNob2xsYSBTbGFiIl0gPSB0cnVlOwogIHQuQ2xhcmVuZG9uID0gdHJ1ZTsKICB0LkNsZWFyZmFjZSA9IHRydWU7CiAgdC5Db2NoaW4gPSB0cnVlOwogIHQuQ29sb25uYSA9IHRydWU7CiAgdFsiQ29tcHV0ZXIgTW9kZXJuIl0gPSB0cnVlOwogIHRbIkNvbmNyZXRlIFJvbWFuIl0gPSB0cnVlOwogIHQuQ29uc3RhbnRpYSA9IHRydWU7CiAgdFsiQ29vcGVyIEJsYWNrIl0gPSB0cnVlOwogIHQuQ29yb25hID0gdHJ1ZTsKICB0LkVjb3R5cGUgPSB0cnVlOwogIHQuRWd5cHRpZW5uZSA9IHRydWU7CiAgdC5FbGVwaGFudCA9IHRydWU7CiAgdC5FeGNlbHNpb3IgPSB0cnVlOwogIHQuRmFpcmZpZWxkID0gdHJ1ZTsKICB0WyJGRiBTY2FsYSJdID0gdHJ1ZTsKICB0LkZvbGthcmQgPSB0cnVlOwogIHQuRm9vdGxpZ2h0ID0gdHJ1ZTsKICB0LkZyZWVTZXJpZiA9IHRydWU7CiAgdFsiRnJpeiBRdWFkcmF0YSJdID0gdHJ1ZTsKICB0LkdhcmFtb25kID0gdHJ1ZTsKICB0LkdlbnRpdW0gPSB0cnVlOwogIHQuR2VvcmdpYSA9IHRydWU7CiAgdC5HbG91Y2VzdGVyID0gdHJ1ZTsKICB0WyJHb3VkeSBPbGQgU3R5bGUiXSA9IHRydWU7CiAgdFsiR291ZHkgU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0WyJHb3VkeSBQcm8gRm9udCJdID0gdHJ1ZTsKICB0LkdyYW5qb24gPSB0cnVlOwogIHRbIkd1YXJkaWFuIEVneXB0aWFuIl0gPSB0cnVlOwogIHQuSGVhdGhlciA9IHRydWU7CiAgdC5IZXJjdWxlcyA9IHRydWU7CiAgdFsiSGlnaCBUb3dlciBUZXh0Il0gPSB0cnVlOwogIHQuSGlyb3NoaWdlID0gdHJ1ZTsKICB0WyJIb2VmbGVyIFRleHQiXSA9IHRydWU7CiAgdFsiSHVtYW5hIFNlcmlmIl0gPSB0cnVlOwogIHQuSW1wcmludCA9IHRydWU7CiAgdFsiSW9uaWMgTm8uIDUiXSA9IHRydWU7CiAgdC5KYW5zb24gPSB0cnVlOwogIHQuSm9hbm5hID0gdHJ1ZTsKICB0LktvcmlubmEgPSB0cnVlOwogIHQuTGV4aWNvbiA9IHRydWU7CiAgdC5MaWJlcmF0aW9uU2VyaWYgPSB0cnVlOwogIHRbIkxpYmVyYXRpb24gU2VyaWYiXSA9IHRydWU7CiAgdFsiTGludXggTGliZXJ0aW5lIl0gPSB0cnVlOwogIHQuTGl0ZXJhdHVybmF5YSA9IHRydWU7CiAgdC5MdWNpZGEgPSB0cnVlOwogIHRbIkx1Y2lkYSBCcmlnaHQiXSA9IHRydWU7CiAgdC5NZWxpb3IgPSB0cnVlOwogIHQuTWVtcGhpcyA9IHRydWU7CiAgdC5NaWxsZXIgPSB0cnVlOwogIHQuTWluaW9uID0gdHJ1ZTsKICB0Lk1vZGVybiA9IHRydWU7CiAgdFsiTW9uYSBMaXNhIl0gPSB0cnVlOwogIHRbIk1ycyBFYXZlcyJdID0gdHJ1ZTsKICB0WyJNUyBTZXJpZiJdID0gdHJ1ZTsKICB0WyJNdXNlbyBTbGFiIl0gPSB0cnVlOwogIHRbIk5ldyBZb3JrIl0gPSB0cnVlOwogIHRbIk5pbWJ1cyBSb21hbiJdID0gdHJ1ZTsKICB0WyJOUFMgUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5OdXB0aWFsU2NyaXB0ID0gdHJ1ZTsKICB0LlBhbGF0aW5vID0gdHJ1ZTsKICB0LlBlcnBldHVhID0gdHJ1ZTsKICB0LlBsYW50aW4gPSB0cnVlOwogIHRbIlBsYW50aW4gU2Nob29sYm9vayJdID0gdHJ1ZTsKICB0LlBsYXliaWxsID0gdHJ1ZTsKICB0WyJQb29yIFJpY2hhcmQiXSA9IHRydWU7CiAgdFsiUmF3bGluc29uIFJvYWR3YXkiXSA9IHRydWU7CiAgdC5SZW5hdWx0ID0gdHJ1ZTsKICB0LlJlcXVpZW0gPSB0cnVlOwogIHQuUm9ja3dlbGwgPSB0cnVlOwogIHQuUm9tYW4gPSB0cnVlOwogIHRbIlJvdGlzIFNlcmlmIl0gPSB0cnVlOwogIHQuU2Fib24gPSB0cnVlOwogIHQuU2NhbGEgPSB0cnVlOwogIHQuU2VhZ3VsbCA9IHRydWU7CiAgdC5TaXN0aW5hID0gdHJ1ZTsKICB0LlNvdXZlbmlyID0gdHJ1ZTsKICB0LlNUSVggPSB0cnVlOwogIHRbIlN0b25lIEluZm9ybWFsIl0gPSB0cnVlOwogIHRbIlN0b25lIFNlcmlmIl0gPSB0cnVlOwogIHQuU3lsZmFlbiA9IHRydWU7CiAgdC5UaW1lcyA9IHRydWU7CiAgdC5UcmFqYW4gPSB0cnVlOwogIHRbIlRyaW5pdMOpIl0gPSB0cnVlOwogIHRbIlRydW1wIE1lZGlhZXZhbCJdID0gdHJ1ZTsKICB0LlV0b3BpYSA9IHRydWU7CiAgdFsiVmFsZSBUeXBlIl0gPSB0cnVlOwogIHRbIkJpdHN0cmVhbSBWZXJhIl0gPSB0cnVlOwogIHRbIlZlcmEgU2VyaWYiXSA9IHRydWU7CiAgdC5WZXJzYWlsbGVzID0gdHJ1ZTsKICB0LldhbnRlZCA9IHRydWU7CiAgdC5XZWlzcyA9IHRydWU7CiAgdFsiV2lkZSBMYXRpbiJdID0gdHJ1ZTsKICB0LldpbmRzb3IgPSB0cnVlOwogIHQuWElUUyA9IHRydWU7Cn0pOwpleHBvcnRzLmdldFNlcmlmRm9udHMgPSBnZXRTZXJpZkZvbnRzOwpjb25zdCBnZXRTeW1ib2xzRm9udHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogIHQuRGluZ2JhdHMgPSB0cnVlOwogIHQuU3ltYm9sID0gdHJ1ZTsKICB0LlphcGZEaW5nYmF0cyA9IHRydWU7Cn0pOwpleHBvcnRzLmdldFN5bWJvbHNGb250cyA9IGdldFN5bWJvbHNGb250czsKY29uc3QgZ2V0R2x5cGhNYXBGb3JTdGFuZGFyZEZvbnRzID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICB0WzJdID0gMTA7CiAgdFszXSA9IDMyOwogIHRbNF0gPSAzMzsKICB0WzVdID0gMzQ7CiAgdFs2XSA9IDM1OwogIHRbN10gPSAzNjsKICB0WzhdID0gMzc7CiAgdFs5XSA9IDM4OwogIHRbMTBdID0gMzk7CiAgdFsxMV0gPSA0MDsKICB0WzEyXSA9IDQxOwogIHRbMTNdID0gNDI7CiAgdFsxNF0gPSA0MzsKICB0WzE1XSA9IDQ0OwogIHRbMTZdID0gNDU7CiAgdFsxN10gPSA0NjsKICB0WzE4XSA9IDQ3OwogIHRbMTldID0gNDg7CiAgdFsyMF0gPSA0OTsKICB0WzIxXSA9IDUwOwogIHRbMjJdID0gNTE7CiAgdFsyM10gPSA1MjsKICB0WzI0XSA9IDUzOwogIHRbMjVdID0gNTQ7CiAgdFsyNl0gPSA1NTsKICB0WzI3XSA9IDU2OwogIHRbMjhdID0gNTc7CiAgdFsyOV0gPSA1ODsKICB0WzMwXSA9IDg5NDsKICB0WzMxXSA9IDYwOwogIHRbMzJdID0gNjE7CiAgdFszM10gPSA2MjsKICB0WzM0XSA9IDYzOwogIHRbMzVdID0gNjQ7CiAgdFszNl0gPSA2NTsKICB0WzM3XSA9IDY2OwogIHRbMzhdID0gNjc7CiAgdFszOV0gPSA2ODsKICB0WzQwXSA9IDY5OwogIHRbNDFdID0gNzA7CiAgdFs0Ml0gPSA3MTsKICB0WzQzXSA9IDcyOwogIHRbNDRdID0gNzM7CiAgdFs0NV0gPSA3NDsKICB0WzQ2XSA9IDc1OwogIHRbNDddID0gNzY7CiAgdFs0OF0gPSA3NzsKICB0WzQ5XSA9IDc4OwogIHRbNTBdID0gNzk7CiAgdFs1MV0gPSA4MDsKICB0WzUyXSA9IDgxOwogIHRbNTNdID0gODI7CiAgdFs1NF0gPSA4MzsKICB0WzU1XSA9IDg0OwogIHRbNTZdID0gODU7CiAgdFs1N10gPSA4NjsKICB0WzU4XSA9IDg3OwogIHRbNTldID0gODg7CiAgdFs2MF0gPSA4OTsKICB0WzYxXSA9IDkwOwogIHRbNjJdID0gOTE7CiAgdFs2M10gPSA5MjsKICB0WzY0XSA9IDkzOwogIHRbNjVdID0gOTQ7CiAgdFs2Nl0gPSA5NTsKICB0WzY3XSA9IDk2OwogIHRbNjhdID0gOTc7CiAgdFs2OV0gPSA5ODsKICB0WzcwXSA9IDk5OwogIHRbNzFdID0gMTAwOwogIHRbNzJdID0gMTAxOwogIHRbNzNdID0gMTAyOwogIHRbNzRdID0gMTAzOwogIHRbNzVdID0gMTA0OwogIHRbNzZdID0gMTA1OwogIHRbNzddID0gMTA2OwogIHRbNzhdID0gMTA3OwogIHRbNzldID0gMTA4OwogIHRbODBdID0gMTA5OwogIHRbODFdID0gMTEwOwogIHRbODJdID0gMTExOwogIHRbODNdID0gMTEyOwogIHRbODRdID0gMTEzOwogIHRbODVdID0gMTE0OwogIHRbODZdID0gMTE1OwogIHRbODddID0gMTE2OwogIHRbODhdID0gMTE3OwogIHRbODldID0gMTE4OwogIHRbOTBdID0gMTE5OwogIHRbOTFdID0gMTIwOwogIHRbOTJdID0gMTIxOwogIHRbOTNdID0gMTIyOwogIHRbOTRdID0gMTIzOwogIHRbOTVdID0gMTI0OwogIHRbOTZdID0gMTI1OwogIHRbOTddID0gMTI2OwogIHRbOThdID0gMTk2OwogIHRbOTldID0gMTk3OwogIHRbMTAwXSA9IDE5OTsKICB0WzEwMV0gPSAyMDE7CiAgdFsxMDJdID0gMjA5OwogIHRbMTAzXSA9IDIxNDsKICB0WzEwNF0gPSAyMjA7CiAgdFsxMDVdID0gMjI1OwogIHRbMTA2XSA9IDIyNDsKICB0WzEwN10gPSAyMjY7CiAgdFsxMDhdID0gMjI4OwogIHRbMTA5XSA9IDIyNzsKICB0WzExMF0gPSAyMjk7CiAgdFsxMTFdID0gMjMxOwogIHRbMTEyXSA9IDIzMzsKICB0WzExM10gPSAyMzI7CiAgdFsxMTRdID0gMjM0OwogIHRbMTE1XSA9IDIzNTsKICB0WzExNl0gPSAyMzc7CiAgdFsxMTddID0gMjM2OwogIHRbMTE4XSA9IDIzODsKICB0WzExOV0gPSAyMzk7CiAgdFsxMjBdID0gMjQxOwogIHRbMTIxXSA9IDI0MzsKICB0WzEyMl0gPSAyNDI7CiAgdFsxMjNdID0gMjQ0OwogIHRbMTI0XSA9IDI0NjsKICB0WzEyNV0gPSAyNDU7CiAgdFsxMjZdID0gMjUwOwogIHRbMTI3XSA9IDI0OTsKICB0WzEyOF0gPSAyNTE7CiAgdFsxMjldID0gMjUyOwogIHRbMTMwXSA9IDgyMjQ7CiAgdFsxMzFdID0gMTc2OwogIHRbMTMyXSA9IDE2MjsKICB0WzEzM10gPSAxNjM7CiAgdFsxMzRdID0gMTY3OwogIHRbMTM1XSA9IDgyMjY7CiAgdFsxMzZdID0gMTgyOwogIHRbMTM3XSA9IDIyMzsKICB0WzEzOF0gPSAxNzQ7CiAgdFsxMzldID0gMTY5OwogIHRbMTQwXSA9IDg0ODI7CiAgdFsxNDFdID0gMTgwOwogIHRbMTQyXSA9IDE2ODsKICB0WzE0M10gPSA4ODAwOwogIHRbMTQ0XSA9IDE5ODsKICB0WzE0NV0gPSAyMTY7CiAgdFsxNDZdID0gODczNDsKICB0WzE0N10gPSAxNzc7CiAgdFsxNDhdID0gODgwNDsKICB0WzE0OV0gPSA4ODA1OwogIHRbMTUwXSA9IDE2NTsKICB0WzE1MV0gPSAxODE7CiAgdFsxNTJdID0gODcwNjsKICB0WzE1M10gPSA4NzIxOwogIHRbMTU0XSA9IDg3MTk7CiAgdFsxNTZdID0gODc0NzsKICB0WzE1N10gPSAxNzA7CiAgdFsxNThdID0gMTg2OwogIHRbMTU5XSA9IDg0ODY7CiAgdFsxNjBdID0gMjMwOwogIHRbMTYxXSA9IDI0ODsKICB0WzE2Ml0gPSAxOTE7CiAgdFsxNjNdID0gMTYxOwogIHRbMTY0XSA9IDE3MjsKICB0WzE2NV0gPSA4NzMwOwogIHRbMTY2XSA9IDQwMjsKICB0WzE2N10gPSA4Nzc2OwogIHRbMTY4XSA9IDg3MTA7CiAgdFsxNjldID0gMTcxOwogIHRbMTcwXSA9IDE4NzsKICB0WzE3MV0gPSA4MjMwOwogIHRbMTc5XSA9IDgyMjA7CiAgdFsxODBdID0gODIyMTsKICB0WzE4MV0gPSA4MjE2OwogIHRbMTgyXSA9IDgyMTc7CiAgdFsyMDBdID0gMTkzOwogIHRbMjAzXSA9IDIwNTsKICB0WzIwN10gPSAyMTE7CiAgdFsyMTBdID0gMjE4OwogIHRbMjIzXSA9IDcxMTsKICB0WzIyNF0gPSAzMjE7CiAgdFsyMjVdID0gMzIyOwogIHRbMjI2XSA9IDM1MjsKICB0WzIyN10gPSAzNTM7CiAgdFsyMjhdID0gMzgxOwogIHRbMjI5XSA9IDM4MjsKICB0WzIzM10gPSAyMjE7CiAgdFsyMzRdID0gMjUzOwogIHRbMjUyXSA9IDI2MzsKICB0WzI1M10gPSAyNjg7CiAgdFsyNTRdID0gMjY5OwogIHRbMjU4XSA9IDI1ODsKICB0WzI2MF0gPSAyNjA7CiAgdFsyNjFdID0gMjYxOwogIHRbMjY1XSA9IDI4MDsKICB0WzI2Nl0gPSAyODE7CiAgdFsyNjddID0gMjgyOwogIHRbMjY4XSA9IDI4MzsKICB0WzI2OV0gPSAzMTM7CiAgdFsyNzVdID0gMzIzOwogIHRbMjc2XSA9IDMyNDsKICB0WzI3OF0gPSAzMjg7CiAgdFsyODNdID0gMzQ0OwogIHRbMjg0XSA9IDM0NTsKICB0WzI4NV0gPSAzNDY7CiAgdFsyODZdID0gMzQ3OwogIHRbMjkyXSA9IDM2NzsKICB0WzI5NV0gPSAzNzc7CiAgdFsyOTZdID0gMzc4OwogIHRbMjk4XSA9IDM4MDsKICB0WzMwNV0gPSA5NjM7CiAgdFszMDZdID0gOTY0OwogIHRbMzA3XSA9IDk2NjsKICB0WzMwOF0gPSA4MjE1OwogIHRbMzA5XSA9IDgyNTI7CiAgdFszMTBdID0gODMxOTsKICB0WzMxMV0gPSA4MzU5OwogIHRbMzEyXSA9IDg1OTI7CiAgdFszMTNdID0gODU5MzsKICB0WzMzN10gPSA5NTUyOwogIHRbNDkzXSA9IDEwMzk7CiAgdFs0OTRdID0gMTA0MDsKICB0WzY3Ml0gPSAxNDg4OwogIHRbNjczXSA9IDE0ODk7CiAgdFs2NzRdID0gMTQ5MDsKICB0WzY3NV0gPSAxNDkxOwogIHRbNjc2XSA9IDE0OTI7CiAgdFs2NzddID0gMTQ5MzsKICB0WzY3OF0gPSAxNDk0OwogIHRbNjc5XSA9IDE0OTU7CiAgdFs2ODBdID0gMTQ5NjsKICB0WzY4MV0gPSAxNDk3OwogIHRbNjgyXSA9IDE0OTg7CiAgdFs2ODNdID0gMTQ5OTsKICB0WzY4NF0gPSAxNTAwOwogIHRbNjg1XSA9IDE1MDE7CiAgdFs2ODZdID0gMTUwMjsKICB0WzY4N10gPSAxNTAzOwogIHRbNjg4XSA9IDE1MDQ7CiAgdFs2ODldID0gMTUwNTsKICB0WzY5MF0gPSAxNTA2OwogIHRbNjkxXSA9IDE1MDc7CiAgdFs2OTJdID0gMTUwODsKICB0WzY5M10gPSAxNTA5OwogIHRbNjk0XSA9IDE1MTA7CiAgdFs2OTVdID0gMTUxMTsKICB0WzY5Nl0gPSAxNTEyOwogIHRbNjk3XSA9IDE1MTM7CiAgdFs2OThdID0gMTUxNDsKICB0WzcwNV0gPSAxNTI0OwogIHRbNzA2XSA9IDgzNjI7CiAgdFs3MTBdID0gNjQyODg7CiAgdFs3MTFdID0gNjQyOTg7CiAgdFs3NTldID0gMTYxNzsKICB0Wzc2MV0gPSAxNzc2OwogIHRbNzYzXSA9IDE3Nzg7CiAgdFs3NzVdID0gMTY1MjsKICB0Wzc3N10gPSAxNzY0OwogIHRbNzc4XSA9IDE3ODA7CiAgdFs3NzldID0gMTc4MTsKICB0Wzc4MF0gPSAxNzgyOwogIHRbNzgyXSA9IDc3MTsKICB0Wzc4M10gPSA2NDcyNjsKICB0Wzc4Nl0gPSA4MzYzOwogIHRbNzg4XSA9IDg1MzI7CiAgdFs3OTBdID0gNzY4OwogIHRbNzkxXSA9IDc2OTsKICB0Wzc5Ml0gPSA3Njg7CiAgdFs3OTVdID0gODAzOwogIHRbNzk3XSA9IDY0MzM2OwogIHRbNzk4XSA9IDY0MzM3OwogIHRbNzk5XSA9IDY0MzQyOwogIHRbODAwXSA9IDY0MzQzOwogIHRbODAxXSA9IDY0MzQ0OwogIHRbODAyXSA9IDY0MzQ1OwogIHRbODAzXSA9IDY0MzYyOwogIHRbODA0XSA9IDY0MzYzOwogIHRbODA1XSA9IDY0MzY0OwogIHRbMjQyNF0gPSA3ODIxOwogIHRbMjQyNV0gPSA3ODIyOwogIHRbMjQyNl0gPSA3ODIzOwogIHRbMjQyN10gPSA3ODI0OwogIHRbMjQyOF0gPSA3ODI1OwogIHRbMjQyOV0gPSA3ODI2OwogIHRbMjQzMF0gPSA3ODI3OwogIHRbMjQzM10gPSA3NjgyOwogIHRbMjY3OF0gPSA4MDQ1OwogIHRbMjY3OV0gPSA4MDQ2OwogIHRbMjgzMF0gPSAxNTUyOwogIHRbMjgzOF0gPSA2ODY7CiAgdFsyODQwXSA9IDc1MTsKICB0WzI4NDJdID0gNzUzOwogIHRbMjg0M10gPSA3NTQ7CiAgdFsyODQ0XSA9IDc1NTsKICB0WzI4NDZdID0gNzU3OwogIHRbMjg1Nl0gPSA3Njc7CiAgdFsyODU3XSA9IDg0ODsKICB0WzI4NThdID0gODQ5OwogIHRbMjg2Ml0gPSA4NTM7CiAgdFsyODYzXSA9IDg1NDsKICB0WzI4NjRdID0gODU1OwogIHRbMjg2NV0gPSA4NjE7CiAgdFsyODY2XSA9IDg2MjsKICB0WzI5MDZdID0gNzQ2MDsKICB0WzI5MDhdID0gNzQ2MjsKICB0WzI5MDldID0gNzQ2MzsKICB0WzI5MTBdID0gNzQ2NDsKICB0WzI5MTJdID0gNzQ2NjsKICB0WzI5MTNdID0gNzQ2NzsKICB0WzI5MTRdID0gNzQ2ODsKICB0WzI5MTZdID0gNzQ3MDsKICB0WzI5MTddID0gNzQ3MTsKICB0WzI5MThdID0gNzQ3MjsKICB0WzI5MjBdID0gNzQ3NDsKICB0WzI5MjFdID0gNzQ3NTsKICB0WzI5MjJdID0gNzQ3NjsKICB0WzI5MjRdID0gNzQ3ODsKICB0WzI5MjVdID0gNzQ3OTsKICB0WzI5MjZdID0gNzQ4MDsKICB0WzI5MjhdID0gNzQ4MjsKICB0WzI5MjldID0gNzQ4MzsKICB0WzI5MzBdID0gNzQ4NDsKICB0WzI5MzJdID0gNzQ4NjsKICB0WzI5MzNdID0gNzQ4NzsKICB0WzI5MzRdID0gNzQ4ODsKICB0WzI5MzZdID0gNzQ5MDsKICB0WzI5MzddID0gNzQ5MTsKICB0WzI5MzhdID0gNzQ5MjsKICB0WzI5NDBdID0gNzQ5NDsKICB0WzI5NDFdID0gNzQ5NTsKICB0WzI5NDJdID0gNzQ5NjsKICB0WzI5NDRdID0gNzQ5ODsKICB0WzI5NDZdID0gNzUwMDsKICB0WzI5NDhdID0gNzUwMjsKICB0WzI5NTBdID0gNzUwNDsKICB0WzI5NTFdID0gNzUwNTsKICB0WzI5NTJdID0gNzUwNjsKICB0WzI5NTRdID0gNzUwODsKICB0WzI5NTVdID0gNzUwOTsKICB0WzI5NTZdID0gNzUxMDsKICB0WzI5NThdID0gNzUxMjsKICB0WzI5NTldID0gNzUxMzsKICB0WzI5NjBdID0gNzUxNDsKICB0WzI5NjJdID0gNzUxNjsKICB0WzI5NjNdID0gNzUxNzsKICB0WzI5NjRdID0gNzUxODsKICB0WzI5NjZdID0gNzUyMDsKICB0WzI5NjddID0gNzUyMTsKICB0WzI5NjhdID0gNzUyMjsKICB0WzI5NzBdID0gNzUyNDsKICB0WzI5NzFdID0gNzUyNTsKICB0WzI5NzJdID0gNzUyNjsKICB0WzI5NzRdID0gNzUyODsKICB0WzI5NzVdID0gNzUyOTsKICB0WzI5NzZdID0gNzUzMDsKICB0WzI5NzhdID0gMTUzNzsKICB0WzI5NzldID0gMTUzODsKICB0WzI5ODBdID0gMTUzOTsKICB0WzI5ODJdID0gMTU0OTsKICB0WzI5ODNdID0gMTU1MTsKICB0WzI5ODRdID0gMTU1MjsKICB0WzI5ODZdID0gMTU1NDsKICB0WzI5ODddID0gMTU1NTsKICB0WzI5ODhdID0gMTU1NjsKICB0WzI5OTBdID0gMTYyMzsKICB0WzI5OTFdID0gMTYyNDsKICB0WzI5OTVdID0gMTc3NTsKICB0WzI5OTldID0gMTc5MTsKICB0WzMwMDJdID0gNjQyOTA7CiAgdFszMDAzXSA9IDY0MjkxOwogIHRbMzAwNF0gPSA2NDI5MjsKICB0WzMwMDZdID0gNjQyOTQ7CiAgdFszMDA3XSA9IDY0Mjk1OwogIHRbMzAwOF0gPSA2NDI5NjsKICB0WzMwMTFdID0gMTkwMDsKICB0WzMwMTRdID0gODIyMzsKICB0WzMwMTVdID0gODI0NDsKICB0WzMwMTddID0gNzUzMjsKICB0WzMwMThdID0gNzUzMzsKICB0WzMwMTldID0gNzUzNDsKICB0WzMwNzVdID0gNzU5MDsKICB0WzMwNzZdID0gNzU5MTsKICB0WzMwNzldID0gNzU5NDsKICB0WzMwODBdID0gNzU5NTsKICB0WzMwODNdID0gNzU5ODsKICB0WzMwODRdID0gNzU5OTsKICB0WzMwODddID0gNzYwMjsKICB0WzMwODhdID0gNzYwMzsKICB0WzMwOTFdID0gNzYwNjsKICB0WzMwOTJdID0gNzYwNzsKICB0WzMwOTVdID0gNzYxMDsKICB0WzMwOTZdID0gNzYxMTsKICB0WzMwOTldID0gNzYxNDsKICB0WzMxMDBdID0gNzYxNTsKICB0WzMxMDNdID0gNzYxODsKICB0WzMxMDRdID0gNzYxOTsKICB0WzMxMDddID0gODMzNzsKICB0WzMxMDhdID0gODMzODsKICB0WzMxMTZdID0gMTg4NDsKICB0WzMxMTldID0gMTg4NTsKICB0WzMxMjBdID0gMTg4NTsKICB0WzMxMjNdID0gMTg4NjsKICB0WzMxMjRdID0gMTg4NjsKICB0WzMxMjddID0gMTg4NzsKICB0WzMxMjhdID0gMTg4NzsKICB0WzMxMzFdID0gMTg4ODsKICB0WzMxMzJdID0gMTg4ODsKICB0WzMxMzVdID0gMTg4OTsKICB0WzMxMzZdID0gMTg4OTsKICB0WzMxMzldID0gMTg5MDsKICB0WzMxNDBdID0gMTg5MDsKICB0WzMxNDNdID0gMTg5MTsKICB0WzMxNDRdID0gMTg5MTsKICB0WzMxNDddID0gMTg5MjsKICB0WzMxNDhdID0gMTg5MjsKICB0WzMxNTNdID0gNTgwOwogIHRbMzE1NF0gPSA1ODE7CiAgdFszMTU3XSA9IDU4NDsKICB0WzMxNThdID0gNTg1OwogIHRbMzE2MV0gPSA1ODg7CiAgdFszMTYyXSA9IDU4OTsKICB0WzMxNjVdID0gODkxOwogIHRbMzE2Nl0gPSA4OTI7CiAgdFszMTY5XSA9IDEyNzQ7CiAgdFszMTcwXSA9IDEyNzU7CiAgdFszMTczXSA9IDEyNzg7CiAgdFszMTc0XSA9IDEyNzk7CiAgdFszMTgxXSA9IDc2MjI7CiAgdFszMTgyXSA9IDc2MjM7CiAgdFszMjgyXSA9IDExNzk5OwogIHRbMzMxNl0gPSA1Nzg7CiAgdFszMzc5XSA9IDQyNzg1OwogIHRbMzM5M10gPSAxMTU5OwogIHRbMzQxNl0gPSA4Mzc3Owp9KTsKZXhwb3J0cy5nZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHMgPSBnZXRHbHlwaE1hcEZvclN0YW5kYXJkRm9udHM7CmNvbnN0IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgdFsyMjddID0gMzIyOwogIHRbMjY0XSA9IDI2MTsKICB0WzI5MV0gPSAzNDY7Cn0pOwpleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjayA9IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQXJpYWxCbGFjazsKY29uc3QgZ2V0U3VwcGxlbWVudGFsR2x5cGhNYXBGb3JDYWxpYnJpID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICB0WzFdID0gMzI7CiAgdFs0XSA9IDY1OwogIHRbNV0gPSAxOTI7CiAgdFs2XSA9IDE5MzsKICB0WzldID0gMTk2OwogIHRbMTddID0gNjY7CiAgdFsxOF0gPSA2NzsKICB0WzIxXSA9IDI2ODsKICB0WzI0XSA9IDY4OwogIHRbMjhdID0gNjk7CiAgdFsyOV0gPSAyMDA7CiAgdFszMF0gPSAyMDE7CiAgdFszMl0gPSAyODI7CiAgdFszOF0gPSA3MDsKICB0WzM5XSA9IDcxOwogIHRbNDRdID0gNzI7CiAgdFs0N10gPSA3MzsKICB0WzQ4XSA9IDIwNDsKICB0WzQ5XSA9IDIwNTsKICB0WzU4XSA9IDc0OwogIHRbNjBdID0gNzU7CiAgdFs2Ml0gPSA3NjsKICB0WzY4XSA9IDc3OwogIHRbNjldID0gNzg7CiAgdFs3NV0gPSA3OTsKICB0Wzc2XSA9IDIxMDsKICB0WzgwXSA9IDIxNDsKICB0Wzg3XSA9IDgwOwogIHRbODldID0gODE7CiAgdFs5MF0gPSA4MjsKICB0WzkyXSA9IDM0NDsKICB0Wzk0XSA9IDgzOwogIHRbOTddID0gMzUyOwogIHRbMTAwXSA9IDg0OwogIHRbMTA0XSA9IDg1OwogIHRbMTA5XSA9IDIyMDsKICB0WzExNV0gPSA4NjsKICB0WzExNl0gPSA4NzsKICB0WzEyMV0gPSA4ODsKICB0WzEyMl0gPSA4OTsKICB0WzEyNF0gPSAyMjE7CiAgdFsxMjddID0gOTA7CiAgdFsxMjldID0gMzgxOwogIHRbMjU4XSA9IDk3OwogIHRbMjU5XSA9IDIyNDsKICB0WzI2MF0gPSAyMjU7CiAgdFsyNjNdID0gMjI4OwogIHRbMjY4XSA9IDI2MTsKICB0WzI3MV0gPSA5ODsKICB0WzI3Ml0gPSA5OTsKICB0WzI3M10gPSAyNjM7CiAgdFsyNzVdID0gMjY5OwogIHRbMjgyXSA9IDEwMDsKICB0WzI4Nl0gPSAxMDE7CiAgdFsyODddID0gMjMyOwogIHRbMjg4XSA9IDIzMzsKICB0WzI5MF0gPSAyODM7CiAgdFsyOTVdID0gMjgxOwogIHRbMjk2XSA9IDEwMjsKICB0WzMzNl0gPSAxMDM7CiAgdFszNDZdID0gMTA0OwogIHRbMzQ5XSA9IDEwNTsKICB0WzM1MF0gPSAyMzY7CiAgdFszNTFdID0gMjM3OwogIHRbMzYxXSA9IDEwNjsKICB0WzM2NF0gPSAxMDc7CiAgdFszNjddID0gMTA4OwogIHRbMzcxXSA9IDMyMjsKICB0WzM3M10gPSAxMDk7CiAgdFszNzRdID0gMTEwOwogIHRbMzgxXSA9IDExMTsKICB0WzM4Ml0gPSAyNDI7CiAgdFszODNdID0gMjQzOwogIHRbMzg2XSA9IDI0NjsKICB0WzM5M10gPSAxMTI7CiAgdFszOTVdID0gMTEzOwogIHRbMzk2XSA9IDExNDsKICB0WzM5OF0gPSAzNDU7CiAgdFs0MDBdID0gMTE1OwogIHRbNDAxXSA9IDM0NzsKICB0WzQwM10gPSAzNTM7CiAgdFs0MTBdID0gMTE2OwogIHRbNDM3XSA9IDExNzsKICB0WzQ0Ml0gPSAyNTI7CiAgdFs0NDhdID0gMTE4OwogIHRbNDQ5XSA9IDExOTsKICB0WzQ1NF0gPSAxMjA7CiAgdFs0NTVdID0gMTIxOwogIHRbNDU3XSA9IDI1MzsKICB0WzQ2MF0gPSAxMjI7CiAgdFs0NjJdID0gMzgyOwogIHRbNDYzXSA9IDM4MDsKICB0Wzg1M10gPSA0NDsKICB0Wzg1NV0gPSA1ODsKICB0Wzg1Nl0gPSA0NjsKICB0Wzg3Nl0gPSA0NzsKICB0Wzg3OF0gPSA0NTsKICB0Wzg4Ml0gPSA0NTsKICB0Wzg5NF0gPSA0MDsKICB0Wzg5NV0gPSA0MTsKICB0Wzg5Nl0gPSA5MTsKICB0Wzg5N10gPSA5MzsKICB0WzkyM10gPSA2NDsKICB0WzEwMDRdID0gNDg7CiAgdFsxMDA1XSA9IDQ5OwogIHRbMTAwNl0gPSA1MDsKICB0WzEwMDddID0gNTE7CiAgdFsxMDA4XSA9IDUyOwogIHRbMTAwOV0gPSA1MzsKICB0WzEwMTBdID0gNTQ7CiAgdFsxMDExXSA9IDU1OwogIHRbMTAxMl0gPSA1NjsKICB0WzEwMTNdID0gNTc7CiAgdFsxMDgxXSA9IDM3OwogIHRbMTA4NV0gPSA0MzsKICB0WzEwODZdID0gNDU7Cn0pOwpleHBvcnRzLmdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaSA9IGdldFN1cHBsZW1lbnRhbEdseXBoTWFwRm9yQ2FsaWJyaTsKZnVuY3Rpb24gZ2V0U3RhbmRhcmRGb250TmFtZShuYW1lKSB7CiAgY29uc3QgZm9udE5hbWUgPSAoMCwgX2ZvbnRzX3V0aWxzLm5vcm1hbGl6ZUZvbnROYW1lKShuYW1lKTsKICBjb25zdCBzdGRGb250TWFwID0gZ2V0U3RkRm9udE1hcCgpOwogIHJldHVybiBzdGRGb250TWFwW2ZvbnROYW1lXTsKfQoKLyoqKi8gfSksCi8qIDQyICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuVG9Vbmljb2RlTWFwID0gZXhwb3J0cy5JZGVudGl0eVRvVW5pY29kZU1hcCA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgVG9Vbmljb2RlTWFwIHsKICBjb25zdHJ1Y3RvcihjbWFwID0gW10pIHsKICAgIHRoaXMuX21hcCA9IGNtYXA7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwLmxlbmd0aDsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiB0aGlzLl9tYXApIHsKICAgICAgY2FsbGJhY2soY2hhckNvZGUsIHRoaXMuX21hcFtjaGFyQ29kZV0uY2hhckNvZGVBdCgwKSk7CiAgICB9CiAgfQogIGhhcyhpKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2ldICE9PSB1bmRlZmluZWQ7CiAgfQogIGdldChpKSB7CiAgICByZXR1cm4gdGhpcy5fbWFwW2ldOwogIH0KICBjaGFyQ29kZU9mKHZhbHVlKSB7CiAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7CiAgICBpZiAobWFwLmxlbmd0aCA8PSAweDEwMDAwKSB7CiAgICAgIHJldHVybiBtYXAuaW5kZXhPZih2YWx1ZSk7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoYXJDb2RlIGluIG1hcCkgewogICAgICBpZiAobWFwW2NoYXJDb2RlXSA9PT0gdmFsdWUpIHsKICAgICAgICByZXR1cm4gY2hhckNvZGUgfCAwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfQogIGFtZW5kKG1hcCkgewogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBtYXApIHsKICAgICAgdGhpcy5fbWFwW2NoYXJDb2RlXSA9IG1hcFtjaGFyQ29kZV07CiAgICB9CiAgfQp9CmV4cG9ydHMuVG9Vbmljb2RlTWFwID0gVG9Vbmljb2RlTWFwOwpjbGFzcyBJZGVudGl0eVRvVW5pY29kZU1hcCB7CiAgY29uc3RydWN0b3IoZmlyc3RDaGFyLCBsYXN0Q2hhcikgewogICAgdGhpcy5maXJzdENoYXIgPSBmaXJzdENoYXI7CiAgICB0aGlzLmxhc3RDaGFyID0gbGFzdENoYXI7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5sYXN0Q2hhciArIDEgLSB0aGlzLmZpcnN0Q2hhcjsKICB9CiAgZm9yRWFjaChjYWxsYmFjaykgewogICAgZm9yIChsZXQgaSA9IHRoaXMuZmlyc3RDaGFyLCBpaSA9IHRoaXMubGFzdENoYXI7IGkgPD0gaWk7IGkrKykgewogICAgICBjYWxsYmFjayhpLCBpKTsKICAgIH0KICB9CiAgaGFzKGkpIHsKICAgIHJldHVybiB0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcjsKICB9CiAgZ2V0KGkpIHsKICAgIGlmICh0aGlzLmZpcnN0Q2hhciA8PSBpICYmIGkgPD0gdGhpcy5sYXN0Q2hhcikgewogICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShpKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIGNoYXJDb2RlT2YodikgewogICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodikgJiYgdiA+PSB0aGlzLmZpcnN0Q2hhciAmJiB2IDw9IHRoaXMubGFzdENoYXIgPyB2IDogLTE7CiAgfQogIGFtZW5kKG1hcCkgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiU2hvdWxkIG5vdCBjYWxsIGFtZW5kKCkiKTsKICB9Cn0KZXhwb3J0cy5JZGVudGl0eVRvVW5pY29kZU1hcCA9IElkZW50aXR5VG9Vbmljb2RlTWFwOwoKLyoqKi8gfSksCi8qIDQzICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuQ0ZGRm9udCA9IHZvaWQgMDsKdmFyIF9jZmZfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7CnZhciBfZm9udHNfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgQ0ZGRm9udCB7CiAgY29uc3RydWN0b3IoZmlsZSwgcHJvcGVydGllcykgewogICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfY2ZmX3BhcnNlci5DRkZQYXJzZXIoZmlsZSwgcHJvcGVydGllcywgX2ZvbnRzX3V0aWxzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CiAgICB0aGlzLmNmZiA9IHBhcnNlci5wYXJzZSgpOwogICAgdGhpcy5jZmYuZHVwbGljYXRlRmlyc3RHbHlwaCgpOwogICAgY29uc3QgY29tcGlsZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGQ29tcGlsZXIodGhpcy5jZmYpOwogICAgdGhpcy5zZWFjcyA9IHRoaXMuY2ZmLnNlYWNzOwogICAgdHJ5IHsKICAgICAgdGhpcy5kYXRhID0gY29tcGlsZXIuY29tcGlsZSgpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAoMCwgX3V0aWwud2FybikoIkZhaWxlZCB0byBjb21waWxlIGZvbnQgIiArIHByb3BlcnRpZXMubG9hZGVkTmFtZSk7CiAgICAgIHRoaXMuZGF0YSA9IGZpbGU7CiAgICB9CiAgICB0aGlzLl9jcmVhdGVCdWlsdEluRW5jb2RpbmcoKTsKICB9CiAgZ2V0IG51bUdseXBocygpIHsKICAgIHJldHVybiB0aGlzLmNmZi5jaGFyU3RyaW5ncy5jb3VudDsKICB9CiAgZ2V0Q2hhcnNldCgpIHsKICAgIHJldHVybiB0aGlzLmNmZi5jaGFyc2V0LmNoYXJzZXQ7CiAgfQogIGdldEdseXBoTWFwcGluZygpIHsKICAgIGNvbnN0IGNmZiA9IHRoaXMuY2ZmOwogICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllczsKICAgIGNvbnN0IHsKICAgICAgY2lkVG9HaWRNYXAsCiAgICAgIGNNYXAKICAgIH0gPSBwcm9wZXJ0aWVzOwogICAgY29uc3QgY2hhcnNldHMgPSBjZmYuY2hhcnNldC5jaGFyc2V0OwogICAgbGV0IGNoYXJDb2RlVG9HbHlwaElkOwogICAgbGV0IGdseXBoSWQ7CiAgICBpZiAocHJvcGVydGllcy5jb21wb3NpdGUpIHsKICAgICAgbGV0IGludkNpZFRvR2lkTWFwOwogICAgICBpZiAoY2lkVG9HaWRNYXA/Lmxlbmd0aCA+IDApIHsKICAgICAgICBpbnZDaWRUb0dpZE1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY2lkVG9HaWRNYXAubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgY29uc3QgZ2lkID0gY2lkVG9HaWRNYXBbaV07CiAgICAgICAgICBpZiAoZ2lkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaW52Q2lkVG9HaWRNYXBbZ2lkXSA9IGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgbGV0IGNoYXJDb2RlOwogICAgICBpZiAoY2ZmLmlzQ0lERm9udCkgewogICAgICAgIGZvciAoZ2x5cGhJZCA9IDA7IGdseXBoSWQgPCBjaGFyc2V0cy5sZW5ndGg7IGdseXBoSWQrKykgewogICAgICAgICAgY29uc3QgY2lkID0gY2hhcnNldHNbZ2x5cGhJZF07CiAgICAgICAgICBjaGFyQ29kZSA9IGNNYXAuY2hhckNvZGVPZihjaWQpOwogICAgICAgICAgaWYgKGludkNpZFRvR2lkTWFwPy5bY2hhckNvZGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY2hhckNvZGUgPSBpbnZDaWRUb0dpZE1hcFtjaGFyQ29kZV07CiAgICAgICAgICB9CiAgICAgICAgICBjaGFyQ29kZVRvR2x5cGhJZFtjaGFyQ29kZV0gPSBnbHlwaElkOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGdseXBoSWQgPSAwOyBnbHlwaElkIDwgY2ZmLmNoYXJTdHJpbmdzLmNvdW50OyBnbHlwaElkKyspIHsKICAgICAgICAgIGNoYXJDb2RlID0gY01hcC5jaGFyQ29kZU9mKGdseXBoSWQpOwogICAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwogICAgfQogICAgbGV0IGVuY29kaW5nID0gY2ZmLmVuY29kaW5nID8gY2ZmLmVuY29kaW5nLmVuY29kaW5nIDogbnVsbDsKICAgIGlmIChwcm9wZXJ0aWVzLmlzSW50ZXJuYWxGb250KSB7CiAgICAgIGVuY29kaW5nID0gcHJvcGVydGllcy5kZWZhdWx0RW5jb2Rpbmc7CiAgICB9CiAgICBjaGFyQ29kZVRvR2x5cGhJZCA9ICgwLCBfZm9udHNfdXRpbHMudHlwZTFGb250R2x5cGhNYXBwaW5nKShwcm9wZXJ0aWVzLCBlbmNvZGluZywgY2hhcnNldHMpOwogICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwogIH0KICBoYXNHbHlwaElkKGlkKSB7CiAgICByZXR1cm4gdGhpcy5jZmYuaGFzR2x5cGhJZChpZCk7CiAgfQogIF9jcmVhdGVCdWlsdEluRW5jb2RpbmcoKSB7CiAgICBjb25zdCB7CiAgICAgIGNoYXJzZXQsCiAgICAgIGVuY29kaW5nCiAgICB9ID0gdGhpcy5jZmY7CiAgICBpZiAoIWNoYXJzZXQgfHwgIWVuY29kaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGNoYXJzZXRzID0gY2hhcnNldC5jaGFyc2V0LAogICAgICBlbmNvZGluZ3MgPSBlbmNvZGluZy5lbmNvZGluZzsKICAgIGNvbnN0IG1hcCA9IFtdOwogICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBlbmNvZGluZ3MpIHsKICAgICAgY29uc3QgZ2x5cGhJZCA9IGVuY29kaW5nc1tjaGFyQ29kZV07CiAgICAgIGlmIChnbHlwaElkID49IDApIHsKICAgICAgICBjb25zdCBnbHlwaE5hbWUgPSBjaGFyc2V0c1tnbHlwaElkXTsKICAgICAgICBpZiAoZ2x5cGhOYW1lKSB7CiAgICAgICAgICBtYXBbY2hhckNvZGVdID0gZ2x5cGhOYW1lOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG1hcC5sZW5ndGggPiAwKSB7CiAgICAgIHRoaXMucHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcgPSBtYXA7CiAgICB9CiAgfQp9CmV4cG9ydHMuQ0ZGRm9udCA9IENGRkZvbnQ7CgovKioqLyB9KSwKLyogNDQgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5Gb250UmVuZGVyZXJGYWN0b3J5ID0gdm9pZCAwOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX2NmZl9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM1KTsKdmFyIF9nbHlwaGxpc3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM5KTsKdmFyIF9lbmNvZGluZ3MgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM3KTsKdmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOwpmdW5jdGlvbiBnZXRVaW50MzIoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2IHwgZGF0YVtvZmZzZXQgKyAyXSA8PCA4IHwgZGF0YVtvZmZzZXQgKyAzXSkgPj4+IDA7Cn0KZnVuY3Rpb24gZ2V0VWludDE2KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgOCB8IGRhdGFbb2Zmc2V0ICsgMV07Cn0KZnVuY3Rpb24gZ2V0SW50MTYoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIChkYXRhW29mZnNldF0gPDwgMjQgfCBkYXRhW29mZnNldCArIDFdIDw8IDE2KSA+PiAxNjsKfQpmdW5jdGlvbiBnZXRJbnQ4KGRhdGEsIG9mZnNldCkgewogIHJldHVybiBkYXRhW29mZnNldF0gPDwgMjQgPj4gMjQ7Cn0KZnVuY3Rpb24gZ2V0RmxvYXQyMTQoZGF0YSwgb2Zmc2V0KSB7CiAgcmV0dXJuIGdldEludDE2KGRhdGEsIG9mZnNldCkgLyAxNjM4NDsKfQpmdW5jdGlvbiBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycykgewogIGNvbnN0IG51bVN1YnJzID0gc3VicnMubGVuZ3RoOwogIGxldCBiaWFzID0gMzI3Njg7CiAgaWYgKG51bVN1YnJzIDwgMTI0MCkgewogICAgYmlhcyA9IDEwNzsKICB9IGVsc2UgaWYgKG51bVN1YnJzIDwgMzM5MDApIHsKICAgIGJpYXMgPSAxMTMxOwogIH0KICByZXR1cm4gYmlhczsKfQpmdW5jdGlvbiBwYXJzZUNtYXAoZGF0YSwgc3RhcnQsIGVuZCkgewogIGNvbnN0IG9mZnNldCA9IGdldFVpbnQxNihkYXRhLCBzdGFydCArIDIpID09PSAxID8gZ2V0VWludDMyKGRhdGEsIHN0YXJ0ICsgOCkgOiBnZXRVaW50MzIoZGF0YSwgc3RhcnQgKyAxNik7CiAgY29uc3QgZm9ybWF0ID0gZ2V0VWludDE2KGRhdGEsIHN0YXJ0ICsgb2Zmc2V0KTsKICBsZXQgcmFuZ2VzLCBwLCBpOwogIGlmIChmb3JtYXQgPT09IDQpIHsKICAgIGdldFVpbnQxNihkYXRhLCBzdGFydCArIG9mZnNldCArIDIpOwogICAgY29uc3Qgc2VnQ291bnQgPSBnZXRVaW50MTYoZGF0YSwgc3RhcnQgKyBvZmZzZXQgKyA2KSA+PiAxOwogICAgcCA9IHN0YXJ0ICsgb2Zmc2V0ICsgMTQ7CiAgICByYW5nZXMgPSBbXTsKICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldID0gewogICAgICAgIGVuZDogZ2V0VWludDE2KGRhdGEsIHApCiAgICAgIH07CiAgICB9CiAgICBwICs9IDI7CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIHJhbmdlc1tpXS5zdGFydCA9IGdldFVpbnQxNihkYXRhLCBwKTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBzZWdDb3VudDsgaSsrLCBwICs9IDIpIHsKICAgICAgcmFuZ2VzW2ldLmlkRGVsdGEgPSBnZXRVaW50MTYoZGF0YSwgcCk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgc2VnQ291bnQ7IGkrKywgcCArPSAyKSB7CiAgICAgIGxldCBpZE9mZnNldCA9IGdldFVpbnQxNihkYXRhLCBwKTsKICAgICAgaWYgKGlkT2Zmc2V0ID09PSAwKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgcmFuZ2VzW2ldLmlkcyA9IFtdOwogICAgICBmb3IgKGxldCBqID0gMCwgamogPSByYW5nZXNbaV0uZW5kIC0gcmFuZ2VzW2ldLnN0YXJ0ICsgMTsgaiA8IGpqOyBqKyspIHsKICAgICAgICByYW5nZXNbaV0uaWRzW2pdID0gZ2V0VWludDE2KGRhdGEsIHAgKyBpZE9mZnNldCk7CiAgICAgICAgaWRPZmZzZXQgKz0gMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gMTIpIHsKICAgIGNvbnN0IGdyb3VwcyA9IGdldFVpbnQzMihkYXRhLCBzdGFydCArIG9mZnNldCArIDEyKTsKICAgIHAgPSBzdGFydCArIG9mZnNldCArIDE2OwogICAgcmFuZ2VzID0gW107CiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzOyBpKyspIHsKICAgICAgc3RhcnQgPSBnZXRVaW50MzIoZGF0YSwgcCk7CiAgICAgIHJhbmdlcy5wdXNoKHsKICAgICAgICBzdGFydCwKICAgICAgICBlbmQ6IGdldFVpbnQzMihkYXRhLCBwICsgNCksCiAgICAgICAgaWREZWx0YTogZ2V0VWludDMyKGRhdGEsIHAgKyA4KSAtIHN0YXJ0CiAgICAgIH0pOwogICAgICBwICs9IDEyOwogICAgfQogICAgcmV0dXJuIHJhbmdlczsKICB9CiAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGB1bnN1cHBvcnRlZCBjbWFwOiAke2Zvcm1hdH1gKTsKfQpmdW5jdGlvbiBwYXJzZUNmZihkYXRhLCBzdGFydCwgZW5kLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogIGNvbnN0IHBhcnNlciA9IG5ldyBfY2ZmX3BhcnNlci5DRkZQYXJzZXIobmV3IF9zdHJlYW0uU3RyZWFtKGRhdGEsIHN0YXJ0LCBlbmQgLSBzdGFydCksIHByb3BlcnRpZXMsIHNlYWNBbmFseXNpc0VuYWJsZWQpOwogIGNvbnN0IGNmZiA9IHBhcnNlci5wYXJzZSgpOwogIHJldHVybiB7CiAgICBnbHlwaHM6IGNmZi5jaGFyU3RyaW5ncy5vYmplY3RzLAogICAgc3VicnM6IGNmZi50b3BEaWN0LnByaXZhdGVEaWN0Py5zdWJyc0luZGV4Py5vYmplY3RzLAogICAgZ3N1YnJzOiBjZmYuZ2xvYmFsU3VickluZGV4Py5vYmplY3RzLAogICAgaXNDRkZDSURGb250OiBjZmYuaXNDSURGb250LAogICAgZmRTZWxlY3Q6IGNmZi5mZFNlbGVjdCwKICAgIGZkQXJyYXk6IGNmZi5mZEFycmF5CiAgfTsKfQpmdW5jdGlvbiBwYXJzZUdseWZUYWJsZShnbHlmLCBsb2NhLCBpc0dseXBoTG9jYXRpb25zTG9uZykgewogIGxldCBpdGVtU2l6ZSwgaXRlbURlY29kZTsKICBpZiAoaXNHbHlwaExvY2F0aW9uc0xvbmcpIHsKICAgIGl0ZW1TaXplID0gNDsKICAgIGl0ZW1EZWNvZGUgPSBnZXRVaW50MzI7CiAgfSBlbHNlIHsKICAgIGl0ZW1TaXplID0gMjsKICAgIGl0ZW1EZWNvZGUgPSAoZGF0YSwgb2Zmc2V0KSA9PiAyICogZ2V0VWludDE2KGRhdGEsIG9mZnNldCk7CiAgfQogIGNvbnN0IGdseXBocyA9IFtdOwogIGxldCBzdGFydE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgMCk7CiAgZm9yIChsZXQgaiA9IGl0ZW1TaXplOyBqIDwgbG9jYS5sZW5ndGg7IGogKz0gaXRlbVNpemUpIHsKICAgIGNvbnN0IGVuZE9mZnNldCA9IGl0ZW1EZWNvZGUobG9jYSwgaik7CiAgICBnbHlwaHMucHVzaChnbHlmLnN1YmFycmF5KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpKTsKICAgIHN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwogIH0KICByZXR1cm4gZ2x5cGhzOwp9CmZ1bmN0aW9uIGxvb2t1cENtYXAocmFuZ2VzLCB1bmljb2RlKSB7CiAgY29uc3QgY29kZSA9IHVuaWNvZGUuY29kZVBvaW50QXQoMCk7CiAgbGV0IGdpZCA9IDAsCiAgICBsID0gMCwKICAgIHIgPSByYW5nZXMubGVuZ3RoIC0gMTsKICB3aGlsZSAobCA8IHIpIHsKICAgIGNvbnN0IGMgPSBsICsgciArIDEgPj4gMTsKICAgIGlmIChjb2RlIDwgcmFuZ2VzW2NdLnN0YXJ0KSB7CiAgICAgIHIgPSBjIC0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGwgPSBjOwogICAgfQogIH0KICBpZiAocmFuZ2VzW2xdLnN0YXJ0IDw9IGNvZGUgJiYgY29kZSA8PSByYW5nZXNbbF0uZW5kKSB7CiAgICBnaWQgPSByYW5nZXNbbF0uaWREZWx0YSArIChyYW5nZXNbbF0uaWRzID8gcmFuZ2VzW2xdLmlkc1tjb2RlIC0gcmFuZ2VzW2xdLnN0YXJ0XSA6IGNvZGUpICYgMHhmZmZmOwogIH0KICByZXR1cm4gewogICAgY2hhckNvZGU6IGNvZGUsCiAgICBnbHlwaElkOiBnaWQKICB9Owp9CmZ1bmN0aW9uIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIGZvbnQpIHsKICBmdW5jdGlvbiBtb3ZlVG8oeCwgeSkgewogICAgY21kcy5wdXNoKHsKICAgICAgY21kOiAibW92ZVRvIiwKICAgICAgYXJnczogW3gsIHldCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gbGluZVRvKHgsIHkpIHsKICAgIGNtZHMucHVzaCh7CiAgICAgIGNtZDogImxpbmVUbyIsCiAgICAgIGFyZ3M6IFt4LCB5XQogICAgfSk7CiAgfQogIGZ1bmN0aW9uIHF1YWRyYXRpY0N1cnZlVG8oeGEsIHlhLCB4LCB5KSB7CiAgICBjbWRzLnB1c2goewogICAgICBjbWQ6ICJxdWFkcmF0aWNDdXJ2ZVRvIiwKICAgICAgYXJnczogW3hhLCB5YSwgeCwgeV0KICAgIH0pOwogIH0KICBsZXQgaSA9IDA7CiAgY29uc3QgbnVtYmVyT2ZDb250b3VycyA9IGdldEludDE2KGNvZGUsIGkpOwogIGxldCBmbGFnczsKICBsZXQgeCA9IDAsCiAgICB5ID0gMDsKICBpICs9IDEwOwogIGlmIChudW1iZXJPZkNvbnRvdXJzIDwgMCkgewogICAgZG8gewogICAgICBmbGFncyA9IGdldFVpbnQxNihjb2RlLCBpKTsKICAgICAgY29uc3QgZ2x5cGhJbmRleCA9IGdldFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgIGkgKz0gNDsKICAgICAgbGV0IGFyZzEsIGFyZzI7CiAgICAgIGlmIChmbGFncyAmIDB4MDEpIHsKICAgICAgICBpZiAoZmxhZ3MgJiAweDAyKSB7CiAgICAgICAgICBhcmcxID0gZ2V0SW50MTYoY29kZSwgaSk7CiAgICAgICAgICBhcmcyID0gZ2V0SW50MTYoY29kZSwgaSArIDIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcmcxID0gZ2V0VWludDE2KGNvZGUsIGkpOwogICAgICAgICAgYXJnMiA9IGdldFVpbnQxNihjb2RlLCBpICsgMik7CiAgICAgICAgfQogICAgICAgIGkgKz0gNDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoZmxhZ3MgJiAweDAyKSB7CiAgICAgICAgICBhcmcxID0gZ2V0SW50OChjb2RlLCBpKyspOwogICAgICAgICAgYXJnMiA9IGdldEludDgoY29kZSwgaSsrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXJnMSA9IGNvZGVbaSsrXTsKICAgICAgICAgIGFyZzIgPSBjb2RlW2krK107CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChmbGFncyAmIDB4MDIpIHsKICAgICAgICB4ID0gYXJnMTsKICAgICAgICB5ID0gYXJnMjsKICAgICAgfSBlbHNlIHsKICAgICAgICB4ID0gMDsKICAgICAgICB5ID0gMDsKICAgICAgfQogICAgICBsZXQgc2NhbGVYID0gMSwKICAgICAgICBzY2FsZVkgPSAxLAogICAgICAgIHNjYWxlMDEgPSAwLAogICAgICAgIHNjYWxlMTAgPSAwOwogICAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CiAgICAgICAgc2NhbGVYID0gc2NhbGVZID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgaSArPSAyOwogICAgICB9IGVsc2UgaWYgKGZsYWdzICYgMHg0MCkgewogICAgICAgIHNjYWxlWCA9IGdldEZsb2F0MjE0KGNvZGUsIGkpOwogICAgICAgIHNjYWxlWSA9IGdldEZsb2F0MjE0KGNvZGUsIGkgKyAyKTsKICAgICAgICBpICs9IDQ7CiAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDgwKSB7CiAgICAgICAgc2NhbGVYID0gZ2V0RmxvYXQyMTQoY29kZSwgaSk7CiAgICAgICAgc2NhbGUwMSA9IGdldEZsb2F0MjE0KGNvZGUsIGkgKyAyKTsKICAgICAgICBzY2FsZTEwID0gZ2V0RmxvYXQyMTQoY29kZSwgaSArIDQpOwogICAgICAgIHNjYWxlWSA9IGdldEZsb2F0MjE0KGNvZGUsIGkgKyA2KTsKICAgICAgICBpICs9IDg7CiAgICAgIH0KICAgICAgY29uc3Qgc3ViZ2x5cGggPSBmb250LmdseXBoc1tnbHlwaEluZGV4XTsKICAgICAgaWYgKHN1YmdseXBoKSB7CiAgICAgICAgY21kcy5wdXNoKHsKICAgICAgICAgIGNtZDogInNhdmUiCiAgICAgICAgfSwgewogICAgICAgICAgY21kOiAidHJhbnNmb3JtIiwKICAgICAgICAgIGFyZ3M6IFtzY2FsZVgsIHNjYWxlMDEsIHNjYWxlMTAsIHNjYWxlWSwgeCwgeV0KICAgICAgICB9KTsKICAgICAgICBpZiAoIShmbGFncyAmIDB4MDIpKSB7fQogICAgICAgIGNvbXBpbGVHbHlmKHN1YmdseXBoLCBjbWRzLCBmb250KTsKICAgICAgICBjbWRzLnB1c2goewogICAgICAgICAgY21kOiAicmVzdG9yZSIKICAgICAgICB9KTsKICAgICAgfQogICAgfSB3aGlsZSAoZmxhZ3MgJiAweDIwKTsKICB9IGVsc2UgewogICAgY29uc3QgZW5kUHRzT2ZDb250b3VycyA9IFtdOwogICAgbGV0IGosIGpqOwogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mQ29udG91cnM7IGorKykgewogICAgICBlbmRQdHNPZkNvbnRvdXJzLnB1c2goZ2V0VWludDE2KGNvZGUsIGkpKTsKICAgICAgaSArPSAyOwogICAgfQogICAgY29uc3QgaW5zdHJ1Y3Rpb25MZW5ndGggPSBnZXRVaW50MTYoY29kZSwgaSk7CiAgICBpICs9IDIgKyBpbnN0cnVjdGlvbkxlbmd0aDsKICAgIGNvbnN0IG51bWJlck9mUG9pbnRzID0gZW5kUHRzT2ZDb250b3Vycy5hdCgtMSkgKyAxOwogICAgY29uc3QgcG9pbnRzID0gW107CiAgICB3aGlsZSAocG9pbnRzLmxlbmd0aCA8IG51bWJlck9mUG9pbnRzKSB7CiAgICAgIGZsYWdzID0gY29kZVtpKytdOwogICAgICBsZXQgcmVwZWF0ID0gMTsKICAgICAgaWYgKGZsYWdzICYgMHgwOCkgewogICAgICAgIHJlcGVhdCArPSBjb2RlW2krK107CiAgICAgIH0KICAgICAgd2hpbGUgKHJlcGVhdC0tID4gMCkgewogICAgICAgIHBvaW50cy5wdXNoKHsKICAgICAgICAgIGZsYWdzCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXJPZlBvaW50czsgaisrKSB7CiAgICAgIHN3aXRjaCAocG9pbnRzW2pdLmZsYWdzICYgMHgxMikgewogICAgICAgIGNhc2UgMHgwMDoKICAgICAgICAgIHggKz0gZ2V0SW50MTYoY29kZSwgaSk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDI6CiAgICAgICAgICB4IC09IGNvZGVbaSsrXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMjoKICAgICAgICAgIHggKz0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcG9pbnRzW2pdLnggPSB4OwogICAgfQogICAgZm9yIChqID0gMDsgaiA8IG51bWJlck9mUG9pbnRzOyBqKyspIHsKICAgICAgc3dpdGNoIChwb2ludHNbal0uZmxhZ3MgJiAweDI0KSB7CiAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgeSArPSBnZXRJbnQxNihjb2RlLCBpKTsKICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwNDoKICAgICAgICAgIHkgLT0gY29kZVtpKytdOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDI0OgogICAgICAgICAgeSArPSBjb2RlW2krK107CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwb2ludHNbal0ueSA9IHk7CiAgICB9CiAgICBsZXQgc3RhcnRQb2ludCA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyT2ZDb250b3VyczsgaSsrKSB7CiAgICAgIGNvbnN0IGVuZFBvaW50ID0gZW5kUHRzT2ZDb250b3Vyc1tpXTsKICAgICAgY29uc3QgY29udG91ciA9IHBvaW50cy5zbGljZShzdGFydFBvaW50LCBlbmRQb2ludCArIDEpOwogICAgICBpZiAoY29udG91clswXS5mbGFncyAmIDEpIHsKICAgICAgICBjb250b3VyLnB1c2goY29udG91clswXSk7CiAgICAgIH0gZWxzZSBpZiAoY29udG91ci5hdCgtMSkuZmxhZ3MgJiAxKSB7CiAgICAgICAgY29udG91ci51bnNoaWZ0KGNvbnRvdXIuYXQoLTEpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBwID0gewogICAgICAgICAgZmxhZ3M6IDEsCiAgICAgICAgICB4OiAoY29udG91clswXS54ICsgY29udG91ci5hdCgtMSkueCkgLyAyLAogICAgICAgICAgeTogKGNvbnRvdXJbMF0ueSArIGNvbnRvdXIuYXQoLTEpLnkpIC8gMgogICAgICAgIH07CiAgICAgICAgY29udG91ci51bnNoaWZ0KHApOwogICAgICAgIGNvbnRvdXIucHVzaChwKTsKICAgICAgfQogICAgICBtb3ZlVG8oY29udG91clswXS54LCBjb250b3VyWzBdLnkpOwogICAgICBmb3IgKGogPSAxLCBqaiA9IGNvbnRvdXIubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIGlmIChjb250b3VyW2pdLmZsYWdzICYgMSkgewogICAgICAgICAgbGluZVRvKGNvbnRvdXJbal0ueCwgY29udG91cltqXS55KTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnRvdXJbaiArIDFdLmZsYWdzICYgMSkgewogICAgICAgICAgcXVhZHJhdGljQ3VydmVUbyhjb250b3VyW2pdLngsIGNvbnRvdXJbal0ueSwgY29udG91cltqICsgMV0ueCwgY29udG91cltqICsgMV0ueSk7CiAgICAgICAgICBqKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHF1YWRyYXRpY0N1cnZlVG8oY29udG91cltqXS54LCBjb250b3VyW2pdLnksIChjb250b3VyW2pdLnggKyBjb250b3VyW2ogKyAxXS54KSAvIDIsIChjb250b3VyW2pdLnkgKyBjb250b3VyW2ogKyAxXS55KSAvIDIpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGFydFBvaW50ID0gZW5kUG9pbnQgKyAxOwogICAgfQogIH0KfQpmdW5jdGlvbiBjb21waWxlQ2hhclN0cmluZyhjaGFyU3RyaW5nQ29kZSwgY21kcywgZm9udCwgZ2x5cGhJZCkgewogIGZ1bmN0aW9uIG1vdmVUbyh4LCB5KSB7CiAgICBjbWRzLnB1c2goewogICAgICBjbWQ6ICJtb3ZlVG8iLAogICAgICBhcmdzOiBbeCwgeV0KICAgIH0pOwogIH0KICBmdW5jdGlvbiBsaW5lVG8oeCwgeSkgewogICAgY21kcy5wdXNoKHsKICAgICAgY21kOiAibGluZVRvIiwKICAgICAgYXJnczogW3gsIHldCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgeCwgeSkgewogICAgY21kcy5wdXNoKHsKICAgICAgY21kOiAiYmV6aWVyQ3VydmVUbyIsCiAgICAgIGFyZ3M6IFt4MSwgeTEsIHgyLCB5MiwgeCwgeV0KICAgIH0pOwogIH0KICBjb25zdCBzdGFjayA9IFtdOwogIGxldCB4ID0gMCwKICAgIHkgPSAwOwogIGxldCBzdGVtcyA9IDA7CiAgZnVuY3Rpb24gcGFyc2UoY29kZSkgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBjb2RlLmxlbmd0aCkgewogICAgICBsZXQgc3RhY2tDbGVhbiA9IGZhbHNlOwogICAgICBsZXQgdiA9IGNvZGVbaSsrXTsKICAgICAgbGV0IHhhLCB4YiwgeWEsIHliLCB5MSwgeTIsIHkzLCBuLCBzdWJyQ29kZTsKICAgICAgc3dpdGNoICh2KSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHN0ZW1zICs9IHN0YWNrLmxlbmd0aCA+PiAxOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbW92ZVRvKHgsIHkpOwogICAgICAgICAgc3RhY2tDbGVhbiA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgbGluZVRvKHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDoKICAgICAgICAgIG4gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN1YnJDb2RlID0gbnVsbDsKICAgICAgICAgIGlmIChmb250LmlzQ0ZGQ0lERm9udCkgewogICAgICAgICAgICBjb25zdCBmZEluZGV4ID0gZm9udC5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOwogICAgICAgICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCBmb250LmZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgY29uc3QgZm9udERpY3QgPSBmb250LmZkQXJyYXlbZmRJbmRleF07CiAgICAgICAgICAgICAgbGV0IHN1YnJzOwogICAgICAgICAgICAgIGlmIChmb250RGljdC5wcml2YXRlRGljdD8uc3VicnNJbmRleCkgewogICAgICAgICAgICAgICAgc3VicnMgPSBmb250RGljdC5wcml2YXRlRGljdC5zdWJyc0luZGV4Lm9iamVjdHM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzdWJycykgewogICAgICAgICAgICAgICAgbiArPSBnZXRTdWJyb3V0aW5lQmlhcyhzdWJycyk7CiAgICAgICAgICAgICAgICBzdWJyQ29kZSA9IHN1YnJzW25dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkludmFsaWQgZmQgaW5kZXggZm9yIGdseXBoIGluZGV4LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdWJyQ29kZSA9IGZvbnQuc3VicnNbbiArIGZvbnQuc3VicnNCaWFzXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdWJyQ29kZSkgewogICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDExOgogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgMTI6CiAgICAgICAgICB2ID0gY29kZVtpKytdOwogICAgICAgICAgc3dpdGNoICh2KSB7CiAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5MSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeSwgeGIsIHkxLCB4LCB5MSk7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkxLCB4YiwgeSwgeCwgeSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzU6CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeTEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5MiA9IHkxICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHkxLCB4YiwgeTIsIHgsIHkyKTsKICAgICAgICAgICAgICB4YSA9IHggKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkzID0geTIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeTIsIHhiLCB5MywgeCwgeSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgY29uc3QgeDAgPSB4LAogICAgICAgICAgICAgICAgeTAgPSB5OwogICAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICAgIHggPSB4YjsKICAgICAgICAgICAgICB5ID0geWI7CiAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHggLSB4MCkgPiBNYXRoLmFicyh5IC0geTApKSB7CiAgICAgICAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHkgKz0gc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGB1bmtub3duIG9wZXJhdG9yOiAxMiAke3Z9YCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE0OgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+PSA0KSB7CiAgICAgICAgICAgIGNvbnN0IGFjaGFyID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IGJjaGFyID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHkgPSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgeCA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICBjbWRzLnB1c2goewogICAgICAgICAgICAgIGNtZDogInNhdmUiCiAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICBjbWQ6ICJ0cmFuc2xhdGUiLAogICAgICAgICAgICAgIGFyZ3M6IFt4LCB5XQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGV0IGNtYXAgPSBsb29rdXBDbWFwKGZvbnQuY21hcCwgU3RyaW5nLmZyb21DaGFyQ29kZShmb250LmdseXBoTmFtZU1hcFtfZW5jb2RpbmdzLlN0YW5kYXJkRW5jb2RpbmdbYWNoYXJdXSkpOwogICAgICAgICAgICBjb21waWxlQ2hhclN0cmluZyhmb250LmdseXBoc1tjbWFwLmdseXBoSWRdLCBjbWRzLCBmb250LCBjbWFwLmdseXBoSWQpOwogICAgICAgICAgICBjbWRzLnB1c2goewogICAgICAgICAgICAgIGNtZDogInJlc3RvcmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjbWFwID0gbG9va3VwQ21hcChmb250LmNtYXAsIFN0cmluZy5mcm9tQ2hhckNvZGUoZm9udC5nbHlwaE5hbWVNYXBbX2VuY29kaW5ncy5TdGFuZGFyZEVuY29kaW5nW2JjaGFyXV0pKTsKICAgICAgICAgICAgY29tcGlsZUNoYXJTdHJpbmcoZm9udC5nbHlwaHNbY21hcC5nbHlwaElkXSwgY21kcywgZm9udCwgY21hcC5nbHlwaElkKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICBjYXNlIDE4OgogICAgICAgICAgc3RlbXMgKz0gc3RhY2subGVuZ3RoID4+IDE7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTk6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIGkgKz0gc3RlbXMgKyA3ID4+IDM7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjA6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIGkgKz0gc3RlbXMgKyA3ID4+IDM7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjE6CiAgICAgICAgICB5ICs9IHN0YWNrLnBvcCgpOwogICAgICAgICAgeCArPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG1vdmVUbyh4LCB5KTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyMjoKICAgICAgICAgIHggKz0gc3RhY2sucG9wKCk7CiAgICAgICAgICBtb3ZlVG8oeCwgeSk7CiAgICAgICAgICBzdGFja0NsZWFuID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjM6CiAgICAgICAgICBzdGVtcyArPSBzdGFjay5sZW5ndGggPj4gMTsKICAgICAgICAgIHN0YWNrQ2xlYW4gPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyNDoKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHlhID0geSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHhiID0geGEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeCA9IHhiICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICB4ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICBsaW5lVG8oeCwgeSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI1OgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDYpIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ICs9IHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIGxpbmVUbyh4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB5YiA9IHlhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI2OgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHsKICAgICAgICAgICAgeCArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4OwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YjsKICAgICAgICAgICAgeSA9IHliICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI3OgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCAlIDIpIHsKICAgICAgICAgICAgeSArPSBzdGFjay5zaGlmdCgpOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5OwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YjsKICAgICAgICAgICAgYmV6aWVyQ3VydmVUbyh4YSwgeWEsIHhiLCB5YiwgeCwgeSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI4OgogICAgICAgICAgc3RhY2sucHVzaCgoY29kZVtpXSA8PCAyNCB8IGNvZGVbaSArIDFdIDw8IDE2KSA+PiAxNik7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI5OgogICAgICAgICAgbiA9IHN0YWNrLnBvcCgpICsgZm9udC5nc3VicnNCaWFzOwogICAgICAgICAgc3VickNvZGUgPSBmb250LmdzdWJyc1tuXTsKICAgICAgICAgIGlmIChzdWJyQ29kZSkgewogICAgICAgICAgICBwYXJzZShzdWJyQ29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDMwOgogICAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgeGEgPSB4OwogICAgICAgICAgICB5YSA9IHkgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeGEgPSB4ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWEgPSB5OwogICAgICAgICAgICB4YiA9IHhhICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeWIgPSB5YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHkgPSB5YiArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHggPSB4YiArIChzdGFjay5sZW5ndGggPT09IDEgPyBzdGFjay5zaGlmdCgpIDogMCk7CiAgICAgICAgICAgIGJlemllckN1cnZlVG8oeGEsIHlhLCB4YiwgeWIsIHgsIHkpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzMToKICAgICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHhhID0geCArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHlhID0geTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHhhID0geDsKICAgICAgICAgICAgeWEgPSB5ICsgc3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgeGIgPSB4YSArIHN0YWNrLnNoaWZ0KCk7CiAgICAgICAgICAgIHliID0geWEgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB4ID0geGIgKyBzdGFjay5zaGlmdCgpOwogICAgICAgICAgICB5ID0geWIgKyAoc3RhY2subGVuZ3RoID09PSAxID8gc3RhY2suc2hpZnQoKSA6IDApOwogICAgICAgICAgICBiZXppZXJDdXJ2ZVRvKHhhLCB5YSwgeGIsIHliLCB4LCB5KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAodiA8IDMyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgdW5rbm93biBvcGVyYXRvcjogJHt2fWApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHYgPCAyNDcpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh2IC0gMTM5KTsKICAgICAgICAgIH0gZWxzZSBpZiAodiA8IDI1MSkgewogICAgICAgICAgICBzdGFjay5wdXNoKCh2IC0gMjQ3KSAqIDI1NiArIGNvZGVbaSsrXSArIDEwOCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHYgPCAyNTUpIHsKICAgICAgICAgICAgc3RhY2sucHVzaCgtKHYgLSAyNTEpICogMjU2IC0gY29kZVtpKytdIC0gMTA4KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goKGNvZGVbaV0gPDwgMjQgfCBjb2RlW2kgKyAxXSA8PCAxNiB8IGNvZGVbaSArIDJdIDw8IDggfCBjb2RlW2kgKyAzXSkgLyA2NTUzNik7CiAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChzdGFja0NsZWFuKSB7CiAgICAgICAgc3RhY2subGVuZ3RoID0gMDsKICAgICAgfQogICAgfQogIH0KICBwYXJzZShjaGFyU3RyaW5nQ29kZSk7Cn0KY29uc3QgTk9PUCA9IFtdOwpjbGFzcyBDb21waWxlZEZvbnQgewogIGNvbnN0cnVjdG9yKGZvbnRNYXRyaXgpIHsKICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBDb21waWxlZEZvbnQpIHsKICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQ29tcGlsZWRGb250LiIpOwogICAgfQogICAgdGhpcy5mb250TWF0cml4ID0gZm9udE1hdHJpeDsKICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICB9CiAgZ2V0UGF0aEpzKHVuaWNvZGUpIHsKICAgIGNvbnN0IHsKICAgICAgY2hhckNvZGUsCiAgICAgIGdseXBoSWQKICAgIH0gPSBsb29rdXBDbWFwKHRoaXMuY21hcCwgdW5pY29kZSk7CiAgICBsZXQgZm4gPSB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdOwogICAgaWYgKCFmbikgewogICAgICB0cnkgewogICAgICAgIGZuID0gdGhpcy5jb21waWxlR2x5cGgodGhpcy5nbHlwaHNbZ2x5cGhJZF0sIGdseXBoSWQpOwogICAgICAgIHRoaXMuY29tcGlsZWRHbHlwaHNbZ2x5cGhJZF0gPSBmbjsKICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdID0gTk9PUDsKICAgICAgICBpZiAodGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmNvbXBpbGVkQ2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID09PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSA9IGdseXBoSWQ7CiAgICB9CiAgICByZXR1cm4gZm47CiAgfQogIGNvbXBpbGVHbHlwaChjb2RlLCBnbHlwaElkKSB7CiAgICBpZiAoIWNvZGUgfHwgY29kZS5sZW5ndGggPT09IDAgfHwgY29kZVswXSA9PT0gMTQpIHsKICAgICAgcmV0dXJuIE5PT1A7CiAgICB9CiAgICBsZXQgZm9udE1hdHJpeCA9IHRoaXMuZm9udE1hdHJpeDsKICAgIGlmICh0aGlzLmlzQ0ZGQ0lERm9udCkgewogICAgICBjb25zdCBmZEluZGV4ID0gdGhpcy5mZFNlbGVjdC5nZXRGREluZGV4KGdseXBoSWQpOwogICAgICBpZiAoZmRJbmRleCA+PSAwICYmIGZkSW5kZXggPCB0aGlzLmZkQXJyYXkubGVuZ3RoKSB7CiAgICAgICAgY29uc3QgZm9udERpY3QgPSB0aGlzLmZkQXJyYXlbZmRJbmRleF07CiAgICAgICAgZm9udE1hdHJpeCA9IGZvbnREaWN0LmdldEJ5TmFtZSgiRm9udE1hdHJpeCIpIHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYOwogICAgICB9IGVsc2UgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiSW52YWxpZCBmZCBpbmRleCBmb3IgZ2x5cGggaW5kZXguIik7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNtZHMgPSBbewogICAgICBjbWQ6ICJzYXZlIgogICAgfSwgewogICAgICBjbWQ6ICJ0cmFuc2Zvcm0iLAogICAgICBhcmdzOiBmb250TWF0cml4LnNsaWNlKCkKICAgIH0sIHsKICAgICAgY21kOiAic2NhbGUiLAogICAgICBhcmdzOiBbInNpemUiLCAiLXNpemUiXQogICAgfV07CiAgICB0aGlzLmNvbXBpbGVHbHlwaEltcGwoY29kZSwgY21kcywgZ2x5cGhJZCk7CiAgICBjbWRzLnB1c2goewogICAgICBjbWQ6ICJyZXN0b3JlIgogICAgfSk7CiAgICByZXR1cm4gY21kczsKICB9CiAgY29tcGlsZUdseXBoSW1wbCgpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNoaWxkcmVuIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzLiIpOwogIH0KICBoYXNCdWlsdFBhdGgodW5pY29kZSkgewogICAgY29uc3QgewogICAgICBjaGFyQ29kZSwKICAgICAgZ2x5cGhJZAogICAgfSA9IGxvb2t1cENtYXAodGhpcy5jbWFwLCB1bmljb2RlKTsKICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2dseXBoSWRdICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb21waWxlZENoYXJDb2RlVG9HbHlwaElkW2NoYXJDb2RlXSAhPT0gdW5kZWZpbmVkOwogIH0KfQpjbGFzcyBUcnVlVHlwZUNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHsKICBjb25zdHJ1Y3RvcihnbHlwaHMsIGNtYXAsIGZvbnRNYXRyaXgpIHsKICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAwNDg4LCAwLCAwLCAwLjAwMDQ4OCwgMCwgMF0pOwogICAgdGhpcy5nbHlwaHMgPSBnbHlwaHM7CiAgICB0aGlzLmNtYXAgPSBjbWFwOwogIH0KICBjb21waWxlR2x5cGhJbXBsKGNvZGUsIGNtZHMpIHsKICAgIGNvbXBpbGVHbHlmKGNvZGUsIGNtZHMsIHRoaXMpOwogIH0KfQpjbGFzcyBUeXBlMkNvbXBpbGVkIGV4dGVuZHMgQ29tcGlsZWRGb250IHsKICBjb25zdHJ1Y3RvcihjZmZJbmZvLCBjbWFwLCBmb250TWF0cml4LCBnbHlwaE5hbWVNYXApIHsKICAgIHN1cGVyKGZvbnRNYXRyaXggfHwgWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF0pOwogICAgdGhpcy5nbHlwaHMgPSBjZmZJbmZvLmdseXBoczsKICAgIHRoaXMuZ3N1YnJzID0gY2ZmSW5mby5nc3VicnMgfHwgW107CiAgICB0aGlzLnN1YnJzID0gY2ZmSW5mby5zdWJycyB8fCBbXTsKICAgIHRoaXMuY21hcCA9IGNtYXA7CiAgICB0aGlzLmdseXBoTmFtZU1hcCA9IGdseXBoTmFtZU1hcCB8fCAoMCwgX2dseXBobGlzdC5nZXRHbHlwaHNVbmljb2RlKSgpOwogICAgdGhpcy5nc3VicnNCaWFzID0gZ2V0U3Vicm91dGluZUJpYXModGhpcy5nc3VicnMpOwogICAgdGhpcy5zdWJyc0JpYXMgPSBnZXRTdWJyb3V0aW5lQmlhcyh0aGlzLnN1YnJzKTsKICAgIHRoaXMuaXNDRkZDSURGb250ID0gY2ZmSW5mby5pc0NGRkNJREZvbnQ7CiAgICB0aGlzLmZkU2VsZWN0ID0gY2ZmSW5mby5mZFNlbGVjdDsKICAgIHRoaXMuZmRBcnJheSA9IGNmZkluZm8uZmRBcnJheTsKICB9CiAgY29tcGlsZUdseXBoSW1wbChjb2RlLCBjbWRzLCBnbHlwaElkKSB7CiAgICBjb21waWxlQ2hhclN0cmluZyhjb2RlLCBjbWRzLCB0aGlzLCBnbHlwaElkKTsKICB9Cn0KY2xhc3MgRm9udFJlbmRlcmVyRmFjdG9yeSB7CiAgc3RhdGljIGNyZWF0ZShmb250LCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZm9udC5kYXRhKTsKICAgIGxldCBjbWFwLCBnbHlmLCBsb2NhLCBjZmYsIGluZGV4VG9Mb2NGb3JtYXQsIHVuaXRzUGVyRW07CiAgICBjb25zdCBudW1UYWJsZXMgPSBnZXRVaW50MTYoZGF0YSwgNCk7CiAgICBmb3IgKGxldCBpID0gMCwgcCA9IDEyOyBpIDwgbnVtVGFibGVzOyBpKyssIHAgKz0gMTYpIHsKICAgICAgY29uc3QgdGFnID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGRhdGEuc3ViYXJyYXkocCwgcCArIDQpKTsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0VWludDMyKGRhdGEsIHAgKyA4KTsKICAgICAgY29uc3QgbGVuZ3RoID0gZ2V0VWludDMyKGRhdGEsIHAgKyAxMik7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSAiY21hcCI6CiAgICAgICAgICBjbWFwID0gcGFyc2VDbWFwKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImdseWYiOgogICAgICAgICAgZ2x5ZiA9IGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibG9jYSI6CiAgICAgICAgICBsb2NhID0gZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJoZWFkIjoKICAgICAgICAgIHVuaXRzUGVyRW0gPSBnZXRVaW50MTYoZGF0YSwgb2Zmc2V0ICsgMTgpOwogICAgICAgICAgaW5kZXhUb0xvY0Zvcm1hdCA9IGdldFVpbnQxNihkYXRhLCBvZmZzZXQgKyA1MCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJDRkYgIjoKICAgICAgICAgIGNmZiA9IHBhcnNlQ2ZmKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoLCBzZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoZ2x5ZikgewogICAgICBjb25zdCBmb250TWF0cml4ID0gIXVuaXRzUGVyRW0gPyBmb250LmZvbnRNYXRyaXggOiBbMSAvIHVuaXRzUGVyRW0sIDAsIDAsIDEgLyB1bml0c1BlckVtLCAwLCAwXTsKICAgICAgcmV0dXJuIG5ldyBUcnVlVHlwZUNvbXBpbGVkKHBhcnNlR2x5ZlRhYmxlKGdseWYsIGxvY2EsIGluZGV4VG9Mb2NGb3JtYXQpLCBjbWFwLCBmb250TWF0cml4KTsKICAgIH0KICAgIHJldHVybiBuZXcgVHlwZTJDb21waWxlZChjZmYsIGNtYXAsIGZvbnQuZm9udE1hdHJpeCwgZm9udC5nbHlwaE5hbWVNYXApOwogIH0KfQpleHBvcnRzLkZvbnRSZW5kZXJlckZhY3RvcnkgPSBGb250UmVuZGVyZXJGYWN0b3J5OwoKLyoqKi8gfSksCi8qIDQ1ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuZ2V0TWV0cmljcyA9IGV4cG9ydHMuZ2V0Rm9udEJhc2ljTWV0cmljcyA9IHZvaWQgMDsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKY29uc3QgZ2V0TWV0cmljcyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZCJdID0gNjAwOwogIHRbIkNvdXJpZXItQm9sZE9ibGlxdWUiXSA9IDYwMDsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IDYwMDsKICB0LkhlbHZldGljYSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjc4OwogICAgdC5leGNsYW0gPSAyNzg7CiAgICB0LnF1b3RlZGJsID0gMzU1OwogICAgdC5udW1iZXJzaWduID0gNTU2OwogICAgdC5kb2xsYXIgPSA1NTY7CiAgICB0LnBlcmNlbnQgPSA4ODk7CiAgICB0LmFtcGVyc2FuZCA9IDY2NzsKICAgIHQucXVvdGVyaWdodCA9IDIyMjsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDM4OTsKICAgIHQucGx1cyA9IDU4NDsKICAgIHQuY29tbWEgPSAyNzg7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjc4OwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDU1NjsKICAgIHQub25lID0gNTU2OwogICAgdC50d28gPSA1NTY7CiAgICB0LnRocmVlID0gNTU2OwogICAgdC5mb3VyID0gNTU2OwogICAgdC5maXZlID0gNTU2OwogICAgdC5zaXggPSA1NTY7CiAgICB0LnNldmVuID0gNTU2OwogICAgdC5laWdodCA9IDU1NjsKICAgIHQubmluZSA9IDU1NjsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU4NDsKICAgIHQuZXF1YWwgPSA1ODQ7CiAgICB0LmdyZWF0ZXIgPSA1ODQ7CiAgICB0LnF1ZXN0aW9uID0gNTU2OwogICAgdC5hdCA9IDEwMTU7CiAgICB0LkEgPSA2Njc7CiAgICB0LkIgPSA2Njc7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3MjI7CiAgICB0LkkgPSAyNzg7CiAgICB0LkogPSA1MDA7CiAgICB0LksgPSA2Njc7CiAgICB0LkwgPSA1NTY7CiAgICB0Lk0gPSA4MzM7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2Njc7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA2Njc7CiAgICB0LlQgPSA2MTE7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA2Njc7CiAgICB0LlcgPSA5NDQ7CiAgICB0LlggPSA2Njc7CiAgICB0LlkgPSA2Njc7CiAgICB0LlogPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMjc4OwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDI3ODsKICAgIHQuYXNjaWljaXJjdW0gPSA0Njk7CiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CiAgICB0LnF1b3RlbGVmdCA9IDIyMjsKICAgIHQuYSA9IDU1NjsKICAgIHQuYiA9IDU1NjsKICAgIHQuYyA9IDUwMDsKICAgIHQuZCA9IDU1NjsKICAgIHQuZSA9IDU1NjsKICAgIHQuZiA9IDI3ODsKICAgIHQuZyA9IDU1NjsKICAgIHQuaCA9IDU1NjsKICAgIHQuaSA9IDIyMjsKICAgIHQuaiA9IDIyMjsKICAgIHQuayA9IDUwMDsKICAgIHQubCA9IDIyMjsKICAgIHQubSA9IDgzMzsKICAgIHQubiA9IDU1NjsKICAgIHQubyA9IDU1NjsKICAgIHQucCA9IDU1NjsKICAgIHQucSA9IDU1NjsKICAgIHQuciA9IDMzMzsKICAgIHQucyA9IDUwMDsKICAgIHQudCA9IDI3ODsKICAgIHQudSA9IDU1NjsKICAgIHQudiA9IDUwMDsKICAgIHQudyA9IDcyMjsKICAgIHQueCA9IDUwMDsKICAgIHQueSA9IDUwMDsKICAgIHQueiA9IDUwMDsKICAgIHQuYnJhY2VsZWZ0ID0gMzM0OwogICAgdC5iYXIgPSAyNjA7CiAgICB0LmJyYWNlcmlnaHQgPSAzMzQ7CiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1NTY7CiAgICB0LnN0ZXJsaW5nID0gNTU2OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTU2OwogICAgdC5mbG9yaW4gPSA1NTY7CiAgICB0LnNlY3Rpb24gPSA1NTY7CiAgICB0LmN1cnJlbmN5ID0gNTU2OwogICAgdC5xdW90ZXNpbmdsZSA9IDE5MTsKICAgIHQucXVvdGVkYmxsZWZ0ID0gMzMzOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA1MDA7CiAgICB0LmZsID0gNTAwOwogICAgdC5lbmRhc2ggPSA1NTY7CiAgICB0LmRhZ2dlciA9IDU1NjsKICAgIHQuZGFnZ2VyZGJsID0gNTU2OwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKICAgIHQucGFyYWdyYXBoID0gNTM3OwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjIyOwogICAgdC5xdW90ZWRibGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJscmlnaHQgPSAzMzM7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNjExOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CiAgICB0LkxzbGFzaCA9IDU1NjsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKICAgIHQuYWUgPSA4ODk7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyMjI7CiAgICB0Lm9zbGFzaCA9IDYxMTsKICAgIHQub2UgPSA5NDQ7CiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CiAgICB0LklkaWVyZXNpcyA9IDI3ODsKICAgIHQuZWFjdXRlID0gNTU2OwogICAgdC5hYnJldmUgPSA1NTY7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDU1NjsKICAgIHQuWWRpZXJlc2lzID0gNjY3OwogICAgdC5kaXZpZGUgPSA1ODQ7CiAgICB0LllhY3V0ZSA9IDY2NzsKICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFhY3V0ZSA9IDU1NjsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDU1NjsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDczNzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNTAwOwogICAgdC5hcmluZyA9IDU1NjsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyMjI7CiAgICB0LmFncmF2ZSA9IDU1NjsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDU1NjsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gNTAwOwogICAgdC5zY2VkaWxsYSA9IDUwMDsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5BbWFjcm9uID0gNjY3OwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNTAwOwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDY2NzsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA2Njc7CiAgICB0LmRjYXJvbiA9IDY0MzsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNjY3OwogICAgdC5BYnJldmUgPSA2Njc7CiAgICB0Lm11bHRpcGx5ID0gNTg0OwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDU1NjsKICAgIHQuZWRpZXJlc2lzID0gNTU2OwogICAgdC5jYWN1dGUgPSA1MDA7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAyNzg7CiAgICB0LnBsdXNtaW51cyA9IDU4NDsKICAgIHQuYnJva2VuYmFyID0gMjYwOwogICAgdC5yZWdpc3RlcmVkID0gNzM3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1NTY7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDIyMjsKICAgIHQudGNhcm9uID0gMzE3OwogICAgdC5lb2dvbmVrID0gNTU2OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2Njc7CiAgICB0LkFkaWVyZXNpcyA9IDY2NzsKICAgIHQuZWdyYXZlID0gNTU2OwogICAgdC56YWN1dGUgPSA1MDA7CiAgICB0LmlvZ29uZWsgPSAyMjI7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNTU2OwogICAgdC5hbWFjcm9uID0gNTU2OwogICAgdC5zYWN1dGUgPSA1MDA7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTU2OwogICAgdC50d29zdXBlcmlvciA9IDMzMzsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDU1NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTU2OwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1NTY7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CiAgICB0LlNjZWRpbGxhID0gNjY3OwogICAgdC5sY2Fyb24gPSAyOTk7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNTU2OwogICAgdC5JZ3JhdmUgPSAyNzg7CiAgICB0LkltYWNyb24gPSAyNzg7CiAgICB0LkxjYXJvbiA9IDU1NjsKICAgIHQub25laGFsZiA9IDgzNDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDU1NjsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA1NTY7CiAgICB0LmdicmV2ZSA9IDU1NjsKICAgIHQub25lcXVhcnRlciA9IDgzNDsKICAgIHQuU2Nhcm9uID0gNjY3OwogICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTU2OwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDQ1MzsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzMzM7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTU2OwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuQXRpbGRlID0gNjY3OwogICAgdC5Bb2dvbmVrID0gNjY3OwogICAgdC5BcmluZyA9IDY2NzsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNTAwOwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAyNzg7CiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKICAgIHQubWludXMgPSA1ODQ7CiAgICB0LkljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKICAgIHQubG9naWNhbG5vdCA9IDU4NDsKICAgIHQub2RpZXJlc2lzID0gNTU2OwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0LmV0aCA9IDU1NjsKICAgIHQuemNhcm9uID0gNTAwOwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTU2OwogIH0pOwogIHRbIkhlbHZldGljYS1Cb2xkIl0gPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI3ODsKICAgIHQuZXhjbGFtID0gMzMzOwogICAgdC5xdW90ZWRibCA9IDQ3NDsKICAgIHQubnVtYmVyc2lnbiA9IDU1NjsKICAgIHQuZG9sbGFyID0gNTU2OwogICAgdC5wZXJjZW50ID0gODg5OwogICAgdC5hbXBlcnNhbmQgPSA3MjI7CiAgICB0LnF1b3RlcmlnaHQgPSAyNzg7CiAgICB0LnBhcmVubGVmdCA9IDMzMzsKICAgIHQucGFyZW5yaWdodCA9IDMzMzsKICAgIHQuYXN0ZXJpc2sgPSAzODk7CiAgICB0LnBsdXMgPSA1ODQ7CiAgICB0LmNvbW1hID0gMjc4OwogICAgdC5oeXBoZW4gPSAzMzM7CiAgICB0LnBlcmlvZCA9IDI3ODsKICAgIHQuc2xhc2ggPSAyNzg7CiAgICB0Lnplcm8gPSA1NTY7CiAgICB0Lm9uZSA9IDU1NjsKICAgIHQudHdvID0gNTU2OwogICAgdC50aHJlZSA9IDU1NjsKICAgIHQuZm91ciA9IDU1NjsKICAgIHQuZml2ZSA9IDU1NjsKICAgIHQuc2l4ID0gNTU2OwogICAgdC5zZXZlbiA9IDU1NjsKICAgIHQuZWlnaHQgPSA1NTY7CiAgICB0Lm5pbmUgPSA1NTY7CiAgICB0LmNvbG9uID0gMzMzOwogICAgdC5zZW1pY29sb24gPSAzMzM7CiAgICB0Lmxlc3MgPSA1ODQ7CiAgICB0LmVxdWFsID0gNTg0OwogICAgdC5ncmVhdGVyID0gNTg0OwogICAgdC5xdWVzdGlvbiA9IDYxMTsKICAgIHQuYXQgPSA5NzU7CiAgICB0LkEgPSA3MjI7CiAgICB0LkIgPSA3MjI7CiAgICB0LkMgPSA3MjI7CiAgICB0LkQgPSA3MjI7CiAgICB0LkUgPSA2Njc7CiAgICB0LkYgPSA2MTE7CiAgICB0LkcgPSA3Nzg7CiAgICB0LkggPSA3MjI7CiAgICB0LkkgPSAyNzg7CiAgICB0LkogPSA1NTY7CiAgICB0LksgPSA3MjI7CiAgICB0LkwgPSA2MTE7CiAgICB0Lk0gPSA4MzM7CiAgICB0Lk4gPSA3MjI7CiAgICB0Lk8gPSA3Nzg7CiAgICB0LlAgPSA2Njc7CiAgICB0LlEgPSA3Nzg7CiAgICB0LlIgPSA3MjI7CiAgICB0LlMgPSA2Njc7CiAgICB0LlQgPSA2MTE7CiAgICB0LlUgPSA3MjI7CiAgICB0LlYgPSA2Njc7CiAgICB0LlcgPSA5NDQ7CiAgICB0LlggPSA2Njc7CiAgICB0LlkgPSA2Njc7CiAgICB0LlogPSA2MTE7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKICAgIHQuYXNjaWljaXJjdW0gPSA1ODQ7CiAgICB0LnVuZGVyc2NvcmUgPSA1NTY7CiAgICB0LnF1b3RlbGVmdCA9IDI3ODsKICAgIHQuYSA9IDU1NjsKICAgIHQuYiA9IDYxMTsKICAgIHQuYyA9IDU1NjsKICAgIHQuZCA9IDYxMTsKICAgIHQuZSA9IDU1NjsKICAgIHQuZiA9IDMzMzsKICAgIHQuZyA9IDYxMTsKICAgIHQuaCA9IDYxMTsKICAgIHQuaSA9IDI3ODsKICAgIHQuaiA9IDI3ODsKICAgIHQuayA9IDU1NjsKICAgIHQubCA9IDI3ODsKICAgIHQubSA9IDg4OTsKICAgIHQubiA9IDYxMTsKICAgIHQubyA9IDYxMTsKICAgIHQucCA9IDYxMTsKICAgIHQucSA9IDYxMTsKICAgIHQuciA9IDM4OTsKICAgIHQucyA9IDU1NjsKICAgIHQudCA9IDMzMzsKICAgIHQudSA9IDYxMTsKICAgIHQudiA9IDU1NjsKICAgIHQudyA9IDc3ODsKICAgIHQueCA9IDU1NjsKICAgIHQueSA9IDU1NjsKICAgIHQueiA9IDUwMDsKICAgIHQuYnJhY2VsZWZ0ID0gMzg5OwogICAgdC5iYXIgPSAyODA7CiAgICB0LmJyYWNlcmlnaHQgPSAzODk7CiAgICB0LmFzY2lpdGlsZGUgPSA1ODQ7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1NTY7CiAgICB0LnN0ZXJsaW5nID0gNTU2OwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTU2OwogICAgdC5mbG9yaW4gPSA1NTY7CiAgICB0LnNlY3Rpb24gPSA1NTY7CiAgICB0LmN1cnJlbmN5ID0gNTU2OwogICAgdC5xdW90ZXNpbmdsZSA9IDIzODsKICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTU2OwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA2MTE7CiAgICB0LmZsID0gNjExOwogICAgdC5lbmRhc2ggPSA1NTY7CiAgICB0LmRhZ2dlciA9IDU1NjsKICAgIHQuZGFnZ2VyZGJsID0gNTU2OwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI3ODsKICAgIHQucGFyYWdyYXBoID0gNTU2OwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMjc4OwogICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CiAgICB0LnF1b3RlZGJscmlnaHQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTU2OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNjExOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzNzA7CiAgICB0LkxzbGFzaCA9IDYxMTsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDM2NTsKICAgIHQuYWUgPSA4ODk7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDYxMTsKICAgIHQub2UgPSA5NDQ7CiAgICB0Lmdlcm1hbmRibHMgPSA2MTE7CiAgICB0LklkaWVyZXNpcyA9IDI3ODsKICAgIHQuZWFjdXRlID0gNTU2OwogICAgdC5hYnJldmUgPSA1NTY7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA2MTE7CiAgICB0LmVjYXJvbiA9IDU1NjsKICAgIHQuWWRpZXJlc2lzID0gNjY3OwogICAgdC5kaXZpZGUgPSA1ODQ7CiAgICB0LllhY3V0ZSA9IDY2NzsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDU1NjsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDU1NjsKICAgIHQuc2NvbW1hYWNjZW50ID0gNTU2OwogICAgdC5lY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDU1NjsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNjExOwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDczNzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNTU2OwogICAgdC5hcmluZyA9IDU1NjsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDU1NjsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDU1NjsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gNTU2OwogICAgdC5zY2VkaWxsYSA9IDU1NjsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNTU2OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDY2NzsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA2Njc7CiAgICB0LmRjYXJvbiA9IDc0MzsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA2MTE7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTg0OwogICAgdC51YWN1dGUgPSA2MTE7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CiAgICB0LnlkaWVyZXNpcyA9IDU1NjsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDU1NjsKICAgIHQuZWRpZXJlc2lzID0gNTU2OwogICAgdC5jYWN1dGUgPSA1NTY7CiAgICB0Lm5hY3V0ZSA9IDYxMTsKICAgIHQudW1hY3JvbiA9IDYxMTsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAyNzg7CiAgICB0LnBsdXNtaW51cyA9IDU4NDsKICAgIHQuYnJva2VuYmFyID0gMjgwOwogICAgdC5yZWdpc3RlcmVkID0gNzM3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAyNzg7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA2MTE7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzg5OwogICAgdC5lb2dvbmVrID0gNTU2OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNTU2OwogICAgdC56YWN1dGUgPSA1MDA7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNjExOwogICAgdC5hbWFjcm9uID0gNTU2OwogICAgdC5zYWN1dGUgPSA1NTY7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNjExOwogICAgdC50d29zdXBlcmlvciA9IDMzMzsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDYxMTsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNjExOwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA2MTE7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA4MzQ7CiAgICB0LlNjZWRpbGxhID0gNjY3OwogICAgdC5sY2Fyb24gPSA0MDA7CiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNTU2OwogICAgdC5JZ3JhdmUgPSAyNzg7CiAgICB0LkltYWNyb24gPSAyNzg7CiAgICB0LkxjYXJvbiA9IDYxMTsKICAgIHQub25laGFsZiA9IDgzNDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDYxMTsKICAgIHQubnRpbGRlID0gNjExOwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA1NTY7CiAgICB0LmdicmV2ZSA9IDYxMTsKICAgIHQub25lcXVhcnRlciA9IDgzNDsKICAgIHQuU2Nhcm9uID0gNjY3OwogICAgdC5TY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNjExOwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDYxMTsKICAgIHQucmFkaWNhbCA9IDU0OTsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNjExOwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQXRpbGRlID0gNzIyOwogICAgdC5Bb2dvbmVrID0gNzIyOwogICAgdC5BcmluZyA9IDcyMjsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNTAwOwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAyNzg7CiAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjsKICAgIHQubWludXMgPSA1ODQ7CiAgICB0LkljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5uY2Fyb24gPSA2MTE7CiAgICB0LnRjb21tYWFjY2VudCA9IDMzMzsKICAgIHQubG9naWNhbG5vdCA9IDU4NDsKICAgIHQub2RpZXJlc2lzID0gNjExOwogICAgdC51ZGllcmVzaXMgPSA2MTE7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LmV0aCA9IDYxMTsKICAgIHQuemNhcm9uID0gNTAwOwogICAgdC5uY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzMzOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTU2OwogIH0pOwogIHRbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0NzQ7CiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CiAgICB0LmRvbGxhciA9IDU1NjsKICAgIHQucGVyY2VudCA9IDg4OTsKICAgIHQuYW1wZXJzYW5kID0gNzIyOwogICAgdC5xdW90ZXJpZ2h0ID0gMjc4OwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gMzg5OwogICAgdC5wbHVzID0gNTg0OwogICAgdC5jb21tYSA9IDI3ODsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNzg7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTU2OwogICAgdC5vbmUgPSA1NTY7CiAgICB0LnR3byA9IDU1NjsKICAgIHQudGhyZWUgPSA1NTY7CiAgICB0LmZvdXIgPSA1NTY7CiAgICB0LmZpdmUgPSA1NTY7CiAgICB0LnNpeCA9IDU1NjsKICAgIHQuc2V2ZW4gPSA1NTY7CiAgICB0LmVpZ2h0ID0gNTU2OwogICAgdC5uaW5lID0gNTU2OwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNTg0OwogICAgdC5lcXVhbCA9IDU4NDsKICAgIHQuZ3JlYXRlciA9IDU4NDsKICAgIHQucXVlc3Rpb24gPSA2MTE7CiAgICB0LmF0ID0gOTc1OwogICAgdC5BID0gNzIyOwogICAgdC5CID0gNzIyOwogICAgdC5DID0gNzIyOwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjY3OwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzc4OwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMjc4OwogICAgdC5KID0gNTU2OwogICAgdC5LID0gNzIyOwogICAgdC5MID0gNjExOwogICAgdC5NID0gODMzOwogICAgdC5OID0gNzIyOwogICAgdC5PID0gNzc4OwogICAgdC5QID0gNjY3OwogICAgdC5RID0gNzc4OwogICAgdC5SID0gNzIyOwogICAgdC5TID0gNjY3OwogICAgdC5UID0gNjExOwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjY3OwogICAgdC5XID0gOTQ0OwogICAgdC5YID0gNjY3OwogICAgdC5ZID0gNjY3OwogICAgdC5aID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LmFzY2lpY2lyY3VtID0gNTg0OwogICAgdC51bmRlcnNjb3JlID0gNTU2OwogICAgdC5xdW90ZWxlZnQgPSAyNzg7CiAgICB0LmEgPSA1NTY7CiAgICB0LmIgPSA2MTE7CiAgICB0LmMgPSA1NTY7CiAgICB0LmQgPSA2MTE7CiAgICB0LmUgPSA1NTY7CiAgICB0LmYgPSAzMzM7CiAgICB0LmcgPSA2MTE7CiAgICB0LmggPSA2MTE7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA1NTY7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA4ODk7CiAgICB0Lm4gPSA2MTE7CiAgICB0Lm8gPSA2MTE7CiAgICB0LnAgPSA2MTE7CiAgICB0LnEgPSA2MTE7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSA1NTY7CiAgICB0LnQgPSAzMzM7CiAgICB0LnUgPSA2MTE7CiAgICB0LnYgPSA1NTY7CiAgICB0LncgPSA3Nzg7CiAgICB0LnggPSA1NTY7CiAgICB0LnkgPSA1NTY7CiAgICB0LnogPSA1MDA7CiAgICB0LmJyYWNlbGVmdCA9IDM4OTsKICAgIHQuYmFyID0gMjgwOwogICAgdC5icmFjZXJpZ2h0ID0gMzg5OwogICAgdC5hc2NpaXRpbGRlID0gNTg0OwogICAgdC5leGNsYW1kb3duID0gMzMzOwogICAgdC5jZW50ID0gNTU2OwogICAgdC5zdGVybGluZyA9IDU1NjsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDU1NjsKICAgIHQuZmxvcmluID0gNTU2OwogICAgdC5zZWN0aW9uID0gNTU2OwogICAgdC5jdXJyZW5jeSA9IDU1NjsKICAgIHQucXVvdGVzaW5nbGUgPSAyMzg7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDU1NjsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNjExOwogICAgdC5mbCA9IDYxMTsKICAgIHQuZW5kYXNoID0gNTU2OwogICAgdC5kYWdnZXIgPSA1NTY7CiAgICB0LmRhZ2dlcmRibCA9IDU1NjsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNzg7CiAgICB0LnBhcmFncmFwaCA9IDU1NjsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDI3ODsKICAgIHQucXVvdGVkYmxiYXNlID0gNTAwOwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDU1NjsKICAgIHQuZWxsaXBzaXMgPSAxMDAwOwogICAgdC5wZXJ0aG91c2FuZCA9IDEwMDA7CiAgICB0LnF1ZXN0aW9uZG93biA9IDYxMTsKICAgIHQuZ3JhdmUgPSAzMzM7CiAgICB0LmFjdXRlID0gMzMzOwogICAgdC5jaXJjdW1mbGV4ID0gMzMzOwogICAgdC50aWxkZSA9IDMzMzsKICAgIHQubWFjcm9uID0gMzMzOwogICAgdC5icmV2ZSA9IDMzMzsKICAgIHQuZG90YWNjZW50ID0gMzMzOwogICAgdC5kaWVyZXNpcyA9IDMzMzsKICAgIHQucmluZyA9IDMzMzsKICAgIHQuY2VkaWxsYSA9IDMzMzsKICAgIHQuaHVuZ2FydW1sYXV0ID0gMzMzOwogICAgdC5vZ29uZWsgPSAzMzM7CiAgICB0LmNhcm9uID0gMzMzOwogICAgdC5lbWRhc2ggPSAxMDAwOwogICAgdC5BRSA9IDEwMDA7CiAgICB0Lm9yZGZlbWluaW5lID0gMzcwOwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDc3ODsKICAgIHQuT0UgPSAxMDAwOwogICAgdC5vcmRtYXNjdWxpbmUgPSAzNjU7CiAgICB0LmFlID0gODg5OwogICAgdC5kb3RsZXNzaSA9IDI3ODsKICAgIHQubHNsYXNoID0gMjc4OwogICAgdC5vc2xhc2ggPSA2MTE7CiAgICB0Lm9lID0gOTQ0OwogICAgdC5nZXJtYW5kYmxzID0gNjExOwogICAgdC5JZGllcmVzaXMgPSAyNzg7CiAgICB0LmVhY3V0ZSA9IDU1NjsKICAgIHQuYWJyZXZlID0gNTU2OwogICAgdC51aHVuZ2FydW1sYXV0ID0gNjExOwogICAgdC5lY2Fyb24gPSA1NTY7CiAgICB0LllkaWVyZXNpcyA9IDY2NzsKICAgIHQuZGl2aWRlID0gNTg0OwogICAgdC5ZYWN1dGUgPSA2Njc7CiAgICB0LkFjaXJjdW1mbGV4ID0gNzIyOwogICAgdC5hYWN1dGUgPSA1NTY7CiAgICB0LlVjaXJjdW1mbGV4ID0gNzIyOwogICAgdC55YWN1dGUgPSA1NTY7CiAgICB0LnNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuZWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LlVyaW5nID0gNzIyOwogICAgdC5VZGllcmVzaXMgPSA3MjI7CiAgICB0LmFvZ29uZWsgPSA1NTY7CiAgICB0LlVhY3V0ZSA9IDcyMjsKICAgIHQudW9nb25layA9IDYxMTsKICAgIHQuRWRpZXJlc2lzID0gNjY3OwogICAgdC5EY3JvYXQgPSA3MjI7CiAgICB0LmNvbW1hYWNjZW50ID0gMjUwOwogICAgdC5jb3B5cmlnaHQgPSA3Mzc7CiAgICB0LkVtYWNyb24gPSA2Njc7CiAgICB0LmNjYXJvbiA9IDU1NjsKICAgIHQuYXJpbmcgPSA1NTY7CiAgICB0Lk5jb21tYWFjY2VudCA9IDcyMjsKICAgIHQubGFjdXRlID0gMjc4OwogICAgdC5hZ3JhdmUgPSA1NTY7CiAgICB0LlRjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQ2FjdXRlID0gNzIyOwogICAgdC5hdGlsZGUgPSA1NTY7CiAgICB0LkVkb3RhY2NlbnQgPSA2Njc7CiAgICB0LnNjYXJvbiA9IDU1NjsKICAgIHQuc2NlZGlsbGEgPSA1NTY7CiAgICB0LmlhY3V0ZSA9IDI3ODsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuUmNhcm9uID0gNzIyOwogICAgdC5HY29tbWFhY2NlbnQgPSA3Nzg7CiAgICB0LnVjaXJjdW1mbGV4ID0gNjExOwogICAgdC5hY2lyY3VtZmxleCA9IDU1NjsKICAgIHQuQW1hY3JvbiA9IDcyMjsKICAgIHQucmNhcm9uID0gMzg5OwogICAgdC5jY2VkaWxsYSA9IDU1NjsKICAgIHQuWmRvdGFjY2VudCA9IDYxMTsKICAgIHQuVGhvcm4gPSA2Njc7CiAgICB0Lk9tYWNyb24gPSA3Nzg7CiAgICB0LlJhY3V0ZSA9IDcyMjsKICAgIHQuU2FjdXRlID0gNjY3OwogICAgdC5kY2Fyb24gPSA3NDM7CiAgICB0LlVtYWNyb24gPSA3MjI7CiAgICB0LnVyaW5nID0gNjExOwogICAgdC50aHJlZXN1cGVyaW9yID0gMzMzOwogICAgdC5PZ3JhdmUgPSA3Nzg7CiAgICB0LkFncmF2ZSA9IDcyMjsKICAgIHQuQWJyZXZlID0gNzIyOwogICAgdC5tdWx0aXBseSA9IDU4NDsKICAgIHQudWFjdXRlID0gNjExOwogICAgdC5UY2Fyb24gPSA2MTE7CiAgICB0LnBhcnRpYWxkaWZmID0gNDk0OwogICAgdC55ZGllcmVzaXMgPSA1NTY7CiAgICB0Lk5hY3V0ZSA9IDcyMjsKICAgIHQuaWNpcmN1bWZsZXggPSAyNzg7CiAgICB0LkVjaXJjdW1mbGV4ID0gNjY3OwogICAgdC5hZGllcmVzaXMgPSA1NTY7CiAgICB0LmVkaWVyZXNpcyA9IDU1NjsKICAgIHQuY2FjdXRlID0gNTU2OwogICAgdC5uYWN1dGUgPSA2MTE7CiAgICB0LnVtYWNyb24gPSA2MTE7CiAgICB0Lk5jYXJvbiA9IDcyMjsKICAgIHQuSWFjdXRlID0gMjc4OwogICAgdC5wbHVzbWludXMgPSA1ODQ7CiAgICB0LmJyb2tlbmJhciA9IDI4MDsKICAgIHQucmVnaXN0ZXJlZCA9IDczNzsKICAgIHQuR2JyZXZlID0gNzc4OwogICAgdC5JZG90YWNjZW50ID0gMjc4OwogICAgdC5zdW1tYXRpb24gPSA2MDA7CiAgICB0LkVncmF2ZSA9IDY2NzsKICAgIHQucmFjdXRlID0gMzg5OwogICAgdC5vbWFjcm9uID0gNjExOwogICAgdC5aYWN1dGUgPSA2MTE7CiAgICB0LlpjYXJvbiA9IDYxMTsKICAgIHQuZ3JlYXRlcmVxdWFsID0gNTQ5OwogICAgdC5FdGggPSA3MjI7CiAgICB0LkNjZWRpbGxhID0gNzIyOwogICAgdC5sY29tbWFhY2NlbnQgPSAyNzg7CiAgICB0LnRjYXJvbiA9IDM4OTsKICAgIHQuZW9nb25layA9IDU1NjsKICAgIHQuVW9nb25layA9IDcyMjsKICAgIHQuQWFjdXRlID0gNzIyOwogICAgdC5BZGllcmVzaXMgPSA3MjI7CiAgICB0LmVncmF2ZSA9IDU1NjsKICAgIHQuemFjdXRlID0gNTAwOwogICAgdC5pb2dvbmVrID0gMjc4OwogICAgdC5PYWN1dGUgPSA3Nzg7CiAgICB0Lm9hY3V0ZSA9IDYxMTsKICAgIHQuYW1hY3JvbiA9IDU1NjsKICAgIHQuc2FjdXRlID0gNTU2OwogICAgdC5pZGllcmVzaXMgPSAyNzg7CiAgICB0Lk9jaXJjdW1mbGV4ID0gNzc4OwogICAgdC5VZ3JhdmUgPSA3MjI7CiAgICB0LkRlbHRhID0gNjEyOwogICAgdC50aG9ybiA9IDYxMTsKICAgIHQudHdvc3VwZXJpb3IgPSAzMzM7CiAgICB0Lk9kaWVyZXNpcyA9IDc3ODsKICAgIHQubXUgPSA2MTE7CiAgICB0LmlncmF2ZSA9IDI3ODsKICAgIHQub2h1bmdhcnVtbGF1dCA9IDYxMTsKICAgIHQuRW9nb25layA9IDY2NzsKICAgIHQuZGNyb2F0ID0gNjExOwogICAgdC50aHJlZXF1YXJ0ZXJzID0gODM0OwogICAgdC5TY2VkaWxsYSA9IDY2NzsKICAgIHQubGNhcm9uID0gNDAwOwogICAgdC5LY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LkxhY3V0ZSA9IDYxMTsKICAgIHQudHJhZGVtYXJrID0gMTAwMDsKICAgIHQuZWRvdGFjY2VudCA9IDU1NjsKICAgIHQuSWdyYXZlID0gMjc4OwogICAgdC5JbWFjcm9uID0gMjc4OwogICAgdC5MY2Fyb24gPSA2MTE7CiAgICB0Lm9uZWhhbGYgPSA4MzQ7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQub2NpcmN1bWZsZXggPSA2MTE7CiAgICB0Lm50aWxkZSA9IDYxMTsKICAgIHQuVWh1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuRWFjdXRlID0gNjY3OwogICAgdC5lbWFjcm9uID0gNTU2OwogICAgdC5nYnJldmUgPSA2MTE7CiAgICB0Lm9uZXF1YXJ0ZXIgPSA4MzQ7CiAgICB0LlNjYXJvbiA9IDY2NzsKICAgIHQuU2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5PaHVuZ2FydW1sYXV0ID0gNzc4OwogICAgdC5kZWdyZWUgPSA0MDA7CiAgICB0Lm9ncmF2ZSA9IDYxMTsKICAgIHQuQ2Nhcm9uID0gNzIyOwogICAgdC51Z3JhdmUgPSA2MTE7CiAgICB0LnJhZGljYWwgPSA1NDk7CiAgICB0LkRjYXJvbiA9IDcyMjsKICAgIHQucmNvbW1hYWNjZW50ID0gMzg5OwogICAgdC5OdGlsZGUgPSA3MjI7CiAgICB0Lm90aWxkZSA9IDYxMTsKICAgIHQuUmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5MY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkF0aWxkZSA9IDcyMjsKICAgIHQuQW9nb25layA9IDcyMjsKICAgIHQuQXJpbmcgPSA3MjI7CiAgICB0Lk90aWxkZSA9IDc3ODsKICAgIHQuemRvdGFjY2VudCA9IDUwMDsKICAgIHQuRWNhcm9uID0gNjY3OwogICAgdC5Jb2dvbmVrID0gMjc4OwogICAgdC5rY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm1pbnVzID0gNTg0OwogICAgdC5JY2lyY3VtZmxleCA9IDI3ODsKICAgIHQubmNhcm9uID0gNjExOwogICAgdC50Y29tbWFhY2NlbnQgPSAzMzM7CiAgICB0LmxvZ2ljYWxub3QgPSA1ODQ7CiAgICB0Lm9kaWVyZXNpcyA9IDYxMTsKICAgIHQudWRpZXJlc2lzID0gNjExOwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZ2NvbW1hYWNjZW50ID0gNjExOwogICAgdC5ldGggPSA2MTE7CiAgICB0LnpjYXJvbiA9IDUwMDsKICAgIHQubmNvbW1hYWNjZW50ID0gNjExOwogICAgdC5vbmVzdXBlcmlvciA9IDMzMzsKICAgIHQuaW1hY3JvbiA9IDI3ODsKICAgIHQuRXVybyA9IDU1NjsKICB9KTsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNzg7CiAgICB0LmV4Y2xhbSA9IDI3ODsKICAgIHQucXVvdGVkYmwgPSAzNTU7CiAgICB0Lm51bWJlcnNpZ24gPSA1NTY7CiAgICB0LmRvbGxhciA9IDU1NjsKICAgIHQucGVyY2VudCA9IDg4OTsKICAgIHQuYW1wZXJzYW5kID0gNjY3OwogICAgdC5xdW90ZXJpZ2h0ID0gMjIyOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gMzg5OwogICAgdC5wbHVzID0gNTg0OwogICAgdC5jb21tYSA9IDI3ODsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNzg7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTU2OwogICAgdC5vbmUgPSA1NTY7CiAgICB0LnR3byA9IDU1NjsKICAgIHQudGhyZWUgPSA1NTY7CiAgICB0LmZvdXIgPSA1NTY7CiAgICB0LmZpdmUgPSA1NTY7CiAgICB0LnNpeCA9IDU1NjsKICAgIHQuc2V2ZW4gPSA1NTY7CiAgICB0LmVpZ2h0ID0gNTU2OwogICAgdC5uaW5lID0gNTU2OwogICAgdC5jb2xvbiA9IDI3ODsKICAgIHQuc2VtaWNvbG9uID0gMjc4OwogICAgdC5sZXNzID0gNTg0OwogICAgdC5lcXVhbCA9IDU4NDsKICAgIHQuZ3JlYXRlciA9IDU4NDsKICAgIHQucXVlc3Rpb24gPSA1NTY7CiAgICB0LmF0ID0gMTAxNTsKICAgIHQuQSA9IDY2NzsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDcyMjsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDYxMTsKICAgIHQuRyA9IDc3ODsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDI3ODsKICAgIHQuSiA9IDUwMDsKICAgIHQuSyA9IDY2NzsKICAgIHQuTCA9IDU1NjsKICAgIHQuTSA9IDgzMzsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDc3ODsKICAgIHQuUCA9IDY2NzsKICAgIHQuUSA9IDc3ODsKICAgIHQuUiA9IDcyMjsKICAgIHQuUyA9IDY2NzsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDY2NzsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDY2NzsKICAgIHQuWSA9IDY2NzsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAyNzg7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMjc4OwogICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKICAgIHQudW5kZXJzY29yZSA9IDU1NjsKICAgIHQucXVvdGVsZWZ0ID0gMjIyOwogICAgdC5hID0gNTU2OwogICAgdC5iID0gNTU2OwogICAgdC5jID0gNTAwOwogICAgdC5kID0gNTU2OwogICAgdC5lID0gNTU2OwogICAgdC5mID0gMjc4OwogICAgdC5nID0gNTU2OwogICAgdC5oID0gNTU2OwogICAgdC5pID0gMjIyOwogICAgdC5qID0gMjIyOwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjIyOwogICAgdC5tID0gODMzOwogICAgdC5uID0gNTU2OwogICAgdC5vID0gNTU2OwogICAgdC5wID0gNTU2OwogICAgdC5xID0gNTU2OwogICAgdC5yID0gMzMzOwogICAgdC5zID0gNTAwOwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTU2OwogICAgdC52ID0gNTAwOwogICAgdC53ID0gNzIyOwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNTAwOwogICAgdC56ID0gNTAwOwogICAgdC5icmFjZWxlZnQgPSAzMzQ7CiAgICB0LmJhciA9IDI2MDsKICAgIHQuYnJhY2VyaWdodCA9IDMzNDsKICAgIHQuYXNjaWl0aWxkZSA9IDU4NDsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDU1NjsKICAgIHQuc3RlcmxpbmcgPSA1NTY7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1NTY7CiAgICB0LmZsb3JpbiA9IDU1NjsKICAgIHQuc2VjdGlvbiA9IDU1NjsKICAgIHQuY3VycmVuY3kgPSA1NTY7CiAgICB0LnF1b3Rlc2luZ2xlID0gMTkxOwogICAgdC5xdW90ZWRibGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1NTY7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDUwMDsKICAgIHQuZmwgPSA1MDA7CiAgICB0LmVuZGFzaCA9IDU1NjsKICAgIHQuZGFnZ2VyID0gNTU2OwogICAgdC5kYWdnZXJkYmwgPSA1NTY7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjc4OwogICAgdC5wYXJhZ3JhcGggPSA1Mzc7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAyMjI7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxyaWdodCA9IDMzMzsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1NTY7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA2MTE7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSAxMDAwOwogICAgdC5vcmRmZW1pbmluZSA9IDM3MDsKICAgIHQuTHNsYXNoID0gNTU2OwogICAgdC5Pc2xhc2ggPSA3Nzg7CiAgICB0Lk9FID0gMTAwMDsKICAgIHQub3JkbWFzY3VsaW5lID0gMzY1OwogICAgdC5hZSA9IDg4OTsKICAgIHQuZG90bGVzc2kgPSAyNzg7CiAgICB0LmxzbGFzaCA9IDIyMjsKICAgIHQub3NsYXNoID0gNjExOwogICAgdC5vZSA9IDk0NDsKICAgIHQuZ2VybWFuZGJscyA9IDYxMTsKICAgIHQuSWRpZXJlc2lzID0gMjc4OwogICAgdC5lYWN1dGUgPSA1NTY7CiAgICB0LmFicmV2ZSA9IDU1NjsKICAgIHQudWh1bmdhcnVtbGF1dCA9IDU1NjsKICAgIHQuZWNhcm9uID0gNTU2OwogICAgdC5ZZGllcmVzaXMgPSA2Njc7CiAgICB0LmRpdmlkZSA9IDU4NDsKICAgIHQuWWFjdXRlID0gNjY3OwogICAgdC5BY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWFjdXRlID0gNTU2OwogICAgdC5VY2lyY3VtZmxleCA9IDcyMjsKICAgIHQueWFjdXRlID0gNTAwOwogICAgdC5zY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0LmVjaXJjdW1mbGV4ID0gNTU2OwogICAgdC5VcmluZyA9IDcyMjsKICAgIHQuVWRpZXJlc2lzID0gNzIyOwogICAgdC5hb2dvbmVrID0gNTU2OwogICAgdC5VYWN1dGUgPSA3MjI7CiAgICB0LnVvZ29uZWsgPSA1NTY7CiAgICB0LkVkaWVyZXNpcyA9IDY2NzsKICAgIHQuRGNyb2F0ID0gNzIyOwogICAgdC5jb21tYWFjY2VudCA9IDI1MDsKICAgIHQuY29weXJpZ2h0ID0gNzM3OwogICAgdC5FbWFjcm9uID0gNjY3OwogICAgdC5jY2Fyb24gPSA1MDA7CiAgICB0LmFyaW5nID0gNTU2OwogICAgdC5OY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0LmxhY3V0ZSA9IDIyMjsKICAgIHQuYWdyYXZlID0gNTU2OwogICAgdC5UY29tbWFhY2NlbnQgPSA2MTE7CiAgICB0LkNhY3V0ZSA9IDcyMjsKICAgIHQuYXRpbGRlID0gNTU2OwogICAgdC5FZG90YWNjZW50ID0gNjY3OwogICAgdC5zY2Fyb24gPSA1MDA7CiAgICB0LnNjZWRpbGxhID0gNTAwOwogICAgdC5pYWN1dGUgPSAyNzg7CiAgICB0LmxvemVuZ2UgPSA0NzE7CiAgICB0LlJjYXJvbiA9IDcyMjsKICAgIHQuR2NvbW1hYWNjZW50ID0gNzc4OwogICAgdC51Y2lyY3VtZmxleCA9IDU1NjsKICAgIHQuYWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LkFtYWNyb24gPSA2Njc7CiAgICB0LnJjYXJvbiA9IDMzMzsKICAgIHQuY2NlZGlsbGEgPSA1MDA7CiAgICB0Llpkb3RhY2NlbnQgPSA2MTE7CiAgICB0LlRob3JuID0gNjY3OwogICAgdC5PbWFjcm9uID0gNzc4OwogICAgdC5SYWN1dGUgPSA3MjI7CiAgICB0LlNhY3V0ZSA9IDY2NzsKICAgIHQuZGNhcm9uID0gNjQzOwogICAgdC5VbWFjcm9uID0gNzIyOwogICAgdC51cmluZyA9IDU1NjsKICAgIHQudGhyZWVzdXBlcmlvciA9IDMzMzsKICAgIHQuT2dyYXZlID0gNzc4OwogICAgdC5BZ3JhdmUgPSA2Njc7CiAgICB0LkFicmV2ZSA9IDY2NzsKICAgIHQubXVsdGlwbHkgPSA1ODQ7CiAgICB0LnVhY3V0ZSA9IDU1NjsKICAgIHQuVGNhcm9uID0gNjExOwogICAgdC5wYXJ0aWFsZGlmZiA9IDQ3NjsKICAgIHQueWRpZXJlc2lzID0gNTAwOwogICAgdC5OYWN1dGUgPSA3MjI7CiAgICB0LmljaXJjdW1mbGV4ID0gMjc4OwogICAgdC5FY2lyY3VtZmxleCA9IDY2NzsKICAgIHQuYWRpZXJlc2lzID0gNTU2OwogICAgdC5lZGllcmVzaXMgPSA1NTY7CiAgICB0LmNhY3V0ZSA9IDUwMDsKICAgIHQubmFjdXRlID0gNTU2OwogICAgdC51bWFjcm9uID0gNTU2OwogICAgdC5OY2Fyb24gPSA3MjI7CiAgICB0LklhY3V0ZSA9IDI3ODsKICAgIHQucGx1c21pbnVzID0gNTg0OwogICAgdC5icm9rZW5iYXIgPSAyNjA7CiAgICB0LnJlZ2lzdGVyZWQgPSA3Mzc7CiAgICB0LkdicmV2ZSA9IDc3ODsKICAgIHQuSWRvdGFjY2VudCA9IDI3ODsKICAgIHQuc3VtbWF0aW9uID0gNjAwOwogICAgdC5FZ3JhdmUgPSA2Njc7CiAgICB0LnJhY3V0ZSA9IDMzMzsKICAgIHQub21hY3JvbiA9IDU1NjsKICAgIHQuWmFjdXRlID0gNjExOwogICAgdC5aY2Fyb24gPSA2MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQuRXRoID0gNzIyOwogICAgdC5DY2VkaWxsYSA9IDcyMjsKICAgIHQubGNvbW1hYWNjZW50ID0gMjIyOwogICAgdC50Y2Fyb24gPSAzMTc7CiAgICB0LmVvZ29uZWsgPSA1NTY7CiAgICB0LlVvZ29uZWsgPSA3MjI7CiAgICB0LkFhY3V0ZSA9IDY2NzsKICAgIHQuQWRpZXJlc2lzID0gNjY3OwogICAgdC5lZ3JhdmUgPSA1NTY7CiAgICB0LnphY3V0ZSA9IDUwMDsKICAgIHQuaW9nb25layA9IDIyMjsKICAgIHQuT2FjdXRlID0gNzc4OwogICAgdC5vYWN1dGUgPSA1NTY7CiAgICB0LmFtYWNyb24gPSA1NTY7CiAgICB0LnNhY3V0ZSA9IDUwMDsKICAgIHQuaWRpZXJlc2lzID0gMjc4OwogICAgdC5PY2lyY3VtZmxleCA9IDc3ODsKICAgIHQuVWdyYXZlID0gNzIyOwogICAgdC5EZWx0YSA9IDYxMjsKICAgIHQudGhvcm4gPSA1NTY7CiAgICB0LnR3b3N1cGVyaW9yID0gMzMzOwogICAgdC5PZGllcmVzaXMgPSA3Nzg7CiAgICB0Lm11ID0gNTU2OwogICAgdC5pZ3JhdmUgPSAyNzg7CiAgICB0Lm9odW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LkVvZ29uZWsgPSA2Njc7CiAgICB0LmRjcm9hdCA9IDU1NjsKICAgIHQudGhyZWVxdWFydGVycyA9IDgzNDsKICAgIHQuU2NlZGlsbGEgPSA2Njc7CiAgICB0LmxjYXJvbiA9IDI5OTsKICAgIHQuS2NvbW1hYWNjZW50ID0gNjY3OwogICAgdC5MYWN1dGUgPSA1NTY7CiAgICB0LnRyYWRlbWFyayA9IDEwMDA7CiAgICB0LmVkb3RhY2NlbnQgPSA1NTY7CiAgICB0LklncmF2ZSA9IDI3ODsKICAgIHQuSW1hY3JvbiA9IDI3ODsKICAgIHQuTGNhcm9uID0gNTU2OwogICAgdC5vbmVoYWxmID0gODM0OwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTU2OwogICAgdC5udGlsZGUgPSA1NTY7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDY2NzsKICAgIHQuZW1hY3JvbiA9IDU1NjsKICAgIHQuZ2JyZXZlID0gNTU2OwogICAgdC5vbmVxdWFydGVyID0gODM0OwogICAgdC5TY2Fyb24gPSA2Njc7CiAgICB0LlNjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDc3ODsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1NTY7CiAgICB0LkNjYXJvbiA9IDcyMjsKICAgIHQudWdyYXZlID0gNTU2OwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1NTY7CiAgICB0LlJjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5BdGlsZGUgPSA2Njc7CiAgICB0LkFvZ29uZWsgPSA2Njc7CiAgICB0LkFyaW5nID0gNjY3OwogICAgdC5PdGlsZGUgPSA3Nzg7CiAgICB0Lnpkb3RhY2NlbnQgPSA1MDA7CiAgICB0LkVjYXJvbiA9IDY2NzsKICAgIHQuSW9nb25layA9IDI3ODsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDU4NDsKICAgIHQuSWNpcmN1bWZsZXggPSAyNzg7CiAgICB0Lm5jYXJvbiA9IDU1NjsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNTg0OwogICAgdC5vZGllcmVzaXMgPSA1NTY7CiAgICB0LnVkaWVyZXNpcyA9IDU1NjsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuZXRoID0gNTU2OwogICAgdC56Y2Fyb24gPSA1MDA7CiAgICB0Lm5jb21tYWFjY2VudCA9IDU1NjsKICAgIHQub25lc3VwZXJpb3IgPSAzMzM7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1NTY7CiAgfSk7CiAgdC5TeW1ib2wgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI1MDsKICAgIHQuZXhjbGFtID0gMzMzOwogICAgdC51bml2ZXJzYWwgPSA3MTM7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmV4aXN0ZW50aWFsID0gNTQ5OwogICAgdC5wZXJjZW50ID0gODMzOwogICAgdC5hbXBlcnNhbmQgPSA3Nzg7CiAgICB0LnN1Y2h0aGF0ID0gNDM5OwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrbWF0aCA9IDUwMDsKICAgIHQucGx1cyA9IDU0OTsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lm1pbnVzID0gNTQ5OwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDI3ODsKICAgIHQuc2VtaWNvbG9uID0gMjc4OwogICAgdC5sZXNzID0gNTQ5OwogICAgdC5lcXVhbCA9IDU0OTsKICAgIHQuZ3JlYXRlciA9IDU0OTsKICAgIHQucXVlc3Rpb24gPSA0NDQ7CiAgICB0LmNvbmdydWVudCA9IDU0OTsKICAgIHQuQWxwaGEgPSA3MjI7CiAgICB0LkJldGEgPSA2Njc7CiAgICB0LkNoaSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LkVwc2lsb24gPSA2MTE7CiAgICB0LlBoaSA9IDc2MzsKICAgIHQuR2FtbWEgPSA2MDM7CiAgICB0LkV0YSA9IDcyMjsKICAgIHQuSW90YSA9IDMzMzsKICAgIHQudGhldGExID0gNjMxOwogICAgdC5LYXBwYSA9IDcyMjsKICAgIHQuTGFtYmRhID0gNjg2OwogICAgdC5NdSA9IDg4OTsKICAgIHQuTnUgPSA3MjI7CiAgICB0Lk9taWNyb24gPSA3MjI7CiAgICB0LlBpID0gNzY4OwogICAgdC5UaGV0YSA9IDc0MTsKICAgIHQuUmhvID0gNTU2OwogICAgdC5TaWdtYSA9IDU5MjsKICAgIHQuVGF1ID0gNjExOwogICAgdC5VcHNpbG9uID0gNjkwOwogICAgdC5zaWdtYTEgPSA0Mzk7CiAgICB0Lk9tZWdhID0gNzY4OwogICAgdC5YaSA9IDY0NTsKICAgIHQuUHNpID0gNzk1OwogICAgdC5aZXRhID0gNjExOwogICAgdC5icmFja2V0bGVmdCA9IDMzMzsKICAgIHQudGhlcmVmb3JlID0gODYzOwogICAgdC5icmFja2V0cmlnaHQgPSAzMzM7CiAgICB0LnBlcnBlbmRpY3VsYXIgPSA2NTg7CiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CiAgICB0LnJhZGljYWxleCA9IDUwMDsKICAgIHQuYWxwaGEgPSA2MzE7CiAgICB0LmJldGEgPSA1NDk7CiAgICB0LmNoaSA9IDU0OTsKICAgIHQuZGVsdGEgPSA0OTQ7CiAgICB0LmVwc2lsb24gPSA0Mzk7CiAgICB0LnBoaSA9IDUyMTsKICAgIHQuZ2FtbWEgPSA0MTE7CiAgICB0LmV0YSA9IDYwMzsKICAgIHQuaW90YSA9IDMyOTsKICAgIHQucGhpMSA9IDYwMzsKICAgIHQua2FwcGEgPSA1NDk7CiAgICB0LmxhbWJkYSA9IDU0OTsKICAgIHQubXUgPSA1NzY7CiAgICB0Lm51ID0gNTIxOwogICAgdC5vbWljcm9uID0gNTQ5OwogICAgdC5waSA9IDU0OTsKICAgIHQudGhldGEgPSA1MjE7CiAgICB0LnJobyA9IDU0OTsKICAgIHQuc2lnbWEgPSA2MDM7CiAgICB0LnRhdSA9IDQzOTsKICAgIHQudXBzaWxvbiA9IDU3NjsKICAgIHQub21lZ2ExID0gNzEzOwogICAgdC5vbWVnYSA9IDY4NjsKICAgIHQueGkgPSA0OTM7CiAgICB0LnBzaSA9IDY4NjsKICAgIHQuemV0YSA9IDQ5NDsKICAgIHQuYnJhY2VsZWZ0ID0gNDgwOwogICAgdC5iYXIgPSAyMDA7CiAgICB0LmJyYWNlcmlnaHQgPSA0ODA7CiAgICB0LnNpbWlsYXIgPSA1NDk7CiAgICB0LkV1cm8gPSA3NTA7CiAgICB0LlVwc2lsb24xID0gNjIwOwogICAgdC5taW51dGUgPSAyNDc7CiAgICB0Lmxlc3NlcXVhbCA9IDU0OTsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LmluZmluaXR5ID0gNzEzOwogICAgdC5mbG9yaW4gPSA1MDA7CiAgICB0LmNsdWIgPSA3NTM7CiAgICB0LmRpYW1vbmQgPSA3NTM7CiAgICB0LmhlYXJ0ID0gNzUzOwogICAgdC5zcGFkZSA9IDc1MzsKICAgIHQuYXJyb3dib3RoID0gMTA0MjsKICAgIHQuYXJyb3dsZWZ0ID0gOTg3OwogICAgdC5hcnJvd3VwID0gNjAzOwogICAgdC5hcnJvd3JpZ2h0ID0gOTg3OwogICAgdC5hcnJvd2Rvd24gPSA2MDM7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQucGx1c21pbnVzID0gNTQ5OwogICAgdC5zZWNvbmQgPSA0MTE7CiAgICB0LmdyZWF0ZXJlcXVhbCA9IDU0OTsKICAgIHQubXVsdGlwbHkgPSA1NDk7CiAgICB0LnByb3BvcnRpb25hbCA9IDcxMzsKICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CiAgICB0LmJ1bGxldCA9IDQ2MDsKICAgIHQuZGl2aWRlID0gNTQ5OwogICAgdC5ub3RlcXVhbCA9IDU0OTsKICAgIHQuZXF1aXZhbGVuY2UgPSA1NDk7CiAgICB0LmFwcHJveGVxdWFsID0gNTQ5OwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LmFycm93dmVydGV4ID0gNjAzOwogICAgdC5hcnJvd2hvcml6ZXggPSAxMDAwOwogICAgdC5jYXJyaWFnZXJldHVybiA9IDY1ODsKICAgIHQuYWxlcGggPSA4MjM7CiAgICB0LklmcmFrdHVyID0gNjg2OwogICAgdC5SZnJha3R1ciA9IDc5NTsKICAgIHQud2VpZXJzdHJhc3MgPSA5ODc7CiAgICB0LmNpcmNsZW11bHRpcGx5ID0gNzY4OwogICAgdC5jaXJjbGVwbHVzID0gNzY4OwogICAgdC5lbXB0eXNldCA9IDgyMzsKICAgIHQuaW50ZXJzZWN0aW9uID0gNzY4OwogICAgdC51bmlvbiA9IDc2ODsKICAgIHQucHJvcGVyc3VwZXJzZXQgPSA3MTM7CiAgICB0LnJlZmxleHN1cGVyc2V0ID0gNzEzOwogICAgdC5ub3RzdWJzZXQgPSA3MTM7CiAgICB0LnByb3BlcnN1YnNldCA9IDcxMzsKICAgIHQucmVmbGV4c3Vic2V0ID0gNzEzOwogICAgdC5lbGVtZW50ID0gNzEzOwogICAgdC5ub3RlbGVtZW50ID0gNzEzOwogICAgdC5hbmdsZSA9IDc2ODsKICAgIHQuZ3JhZGllbnQgPSA3MTM7CiAgICB0LnJlZ2lzdGVyc2VyaWYgPSA3OTA7CiAgICB0LmNvcHlyaWdodHNlcmlmID0gNzkwOwogICAgdC50cmFkZW1hcmtzZXJpZiA9IDg5MDsKICAgIHQucHJvZHVjdCA9IDgyMzsKICAgIHQucmFkaWNhbCA9IDU0OTsKICAgIHQuZG90bWF0aCA9IDI1MDsKICAgIHQubG9naWNhbG5vdCA9IDcxMzsKICAgIHQubG9naWNhbGFuZCA9IDYwMzsKICAgIHQubG9naWNhbG9yID0gNjAzOwogICAgdC5hcnJvd2RibGJvdGggPSAxMDQyOwogICAgdC5hcnJvd2RibGxlZnQgPSA5ODc7CiAgICB0LmFycm93ZGJsdXAgPSA2MDM7CiAgICB0LmFycm93ZGJscmlnaHQgPSA5ODc7CiAgICB0LmFycm93ZGJsZG93biA9IDYwMzsKICAgIHQubG96ZW5nZSA9IDQ5NDsKICAgIHQuYW5nbGVsZWZ0ID0gMzI5OwogICAgdC5yZWdpc3RlcnNhbnMgPSA3OTA7CiAgICB0LmNvcHlyaWdodHNhbnMgPSA3OTA7CiAgICB0LnRyYWRlbWFya3NhbnMgPSA3ODY7CiAgICB0LnN1bW1hdGlvbiA9IDcxMzsKICAgIHQucGFyZW5sZWZ0dHAgPSAzODQ7CiAgICB0LnBhcmVubGVmdGV4ID0gMzg0OwogICAgdC5wYXJlbmxlZnRidCA9IDM4NDsKICAgIHQuYnJhY2tldGxlZnR0cCA9IDM4NDsKICAgIHQuYnJhY2tldGxlZnRleCA9IDM4NDsKICAgIHQuYnJhY2tldGxlZnRidCA9IDM4NDsKICAgIHQuYnJhY2VsZWZ0dHAgPSA0OTQ7CiAgICB0LmJyYWNlbGVmdG1pZCA9IDQ5NDsKICAgIHQuYnJhY2VsZWZ0YnQgPSA0OTQ7CiAgICB0LmJyYWNlZXggPSA0OTQ7CiAgICB0LmFuZ2xlcmlnaHQgPSAzMjk7CiAgICB0LmludGVncmFsID0gMjc0OwogICAgdC5pbnRlZ3JhbHRwID0gNjg2OwogICAgdC5pbnRlZ3JhbGV4ID0gNjg2OwogICAgdC5pbnRlZ3JhbGJ0ID0gNjg2OwogICAgdC5wYXJlbnJpZ2h0dHAgPSAzODQ7CiAgICB0LnBhcmVucmlnaHRleCA9IDM4NDsKICAgIHQucGFyZW5yaWdodGJ0ID0gMzg0OwogICAgdC5icmFja2V0cmlnaHR0cCA9IDM4NDsKICAgIHQuYnJhY2tldHJpZ2h0ZXggPSAzODQ7CiAgICB0LmJyYWNrZXRyaWdodGJ0ID0gMzg0OwogICAgdC5icmFjZXJpZ2h0dHAgPSA0OTQ7CiAgICB0LmJyYWNlcmlnaHRtaWQgPSA0OTQ7CiAgICB0LmJyYWNlcmlnaHRidCA9IDQ5NDsKICAgIHQuYXBwbGUgPSA3OTA7CiAgfSk7CiAgdFsiVGltZXMtUm9tYW4iXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzMzM7CiAgICB0LnF1b3RlZGJsID0gNDA4OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU2NDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAyNzg7CiAgICB0LnNlbWljb2xvbiA9IDI3ODsKICAgIHQubGVzcyA9IDU2NDsKICAgIHQuZXF1YWwgPSA1NjQ7CiAgICB0LmdyZWF0ZXIgPSA1NjQ7CiAgICB0LnF1ZXN0aW9uID0gNDQ0OwogICAgdC5hdCA9IDkyMTsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDY2NzsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDYxMTsKICAgIHQuRiA9IDU1NjsKICAgIHQuRyA9IDcyMjsKICAgIHQuSCA9IDcyMjsKICAgIHQuSSA9IDMzMzsKICAgIHQuSiA9IDM4OTsKICAgIHQuSyA9IDcyMjsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDg4OTsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDcyMjsKICAgIHQuUCA9IDU1NjsKICAgIHQuUSA9IDcyMjsKICAgIHQuUiA9IDY2NzsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDcyMjsKICAgIHQuVyA9IDk0NDsKICAgIHQuWCA9IDcyMjsKICAgIHQuWSA9IDcyMjsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDQ2OTsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucXVvdGVsZWZ0ID0gMzMzOwogICAgdC5hID0gNDQ0OwogICAgdC5iID0gNTAwOwogICAgdC5jID0gNDQ0OwogICAgdC5kID0gNTAwOwogICAgdC5lID0gNDQ0OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNTAwOwogICAgdC5oID0gNTAwOwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjc4OwogICAgdC5tID0gNzc4OwogICAgdC5uID0gNTAwOwogICAgdC5vID0gNTAwOwogICAgdC5wID0gNTAwOwogICAgdC5xID0gNTAwOwogICAgdC5yID0gMzMzOwogICAgdC5zID0gMzg5OwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTAwOwogICAgdC52ID0gNTAwOwogICAgdC53ID0gNzIyOwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNTAwOwogICAgdC56ID0gNDQ0OwogICAgdC5icmFjZWxlZnQgPSA0ODA7CiAgICB0LmJhciA9IDIwMDsKICAgIHQuYnJhY2VyaWdodCA9IDQ4MDsKICAgIHQuYXNjaWl0aWxkZSA9IDU0MTsKICAgIHQuZXhjbGFtZG93biA9IDMzMzsKICAgIHQuY2VudCA9IDUwMDsKICAgIHQuc3RlcmxpbmcgPSA1MDA7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1MDA7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuc2VjdGlvbiA9IDUwMDsKICAgIHQuY3VycmVuY3kgPSA1MDA7CiAgICB0LnF1b3Rlc2luZ2xlID0gMTgwOwogICAgdC5xdW90ZWRibGxlZnQgPSA0NDQ7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDU1NjsKICAgIHQuZmwgPSA1NTY7CiAgICB0LmVuZGFzaCA9IDUwMDsKICAgIHQuZGFnZ2VyID0gNTAwOwogICAgdC5kYWdnZXJkYmwgPSA1MDA7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOwogICAgdC5wYXJhZ3JhcGggPSA0NTM7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDQ0NDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDQ0NDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA0NDQ7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA4ODk7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA0NDQ7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNzIyOwogICAgdC5kaXZpZGUgPSA1NjQ7CiAgICB0LllhY3V0ZSA9IDcyMjsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDQ0NDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDQ0NDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDQ0NDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDQ0NDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDQ0NDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2Njc7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNDQ0OwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSAzMzM7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDU1NjsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjY3OwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDU4ODsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTY0OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDQ0NDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDU2NDsKICAgIHQuYnJva2VuYmFyID0gMjAwOwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzMzM7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzI2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSA0NDQ7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNDQ0OwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzNDQ7CiAgICB0Lktjb21tYWFjY2VudCA9IDcyMjsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1NTY7CiAgICB0LlNjb21tYWFjY2VudCA9IDU1NjsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDMzMzsKICAgIHQuTnRpbGRlID0gNzIyOwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5BdGlsZGUgPSA3MjI7CiAgICB0LkFvZ29uZWsgPSA3MjI7CiAgICB0LkFyaW5nID0gNzIyOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNTAwOwogICAgdC5taW51cyA9IDU2NDsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNTY0OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSA0NDQ7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdFsiVGltZXMtQm9sZCJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA1NTU7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDEwMDA7CiAgICB0LmFtcGVyc2FuZCA9IDgzMzsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU3MDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAzMzM7CiAgICB0LnNlbWljb2xvbiA9IDMzMzsKICAgIHQubGVzcyA9IDU3MDsKICAgIHQuZXF1YWwgPSA1NzA7CiAgICB0LmdyZWF0ZXIgPSA1NzA7CiAgICB0LnF1ZXN0aW9uID0gNTAwOwogICAgdC5hdCA9IDkzMDsKICAgIHQuQSA9IDcyMjsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDcyMjsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDYxMTsKICAgIHQuRyA9IDc3ODsKICAgIHQuSCA9IDc3ODsKICAgIHQuSSA9IDM4OTsKICAgIHQuSiA9IDUwMDsKICAgIHQuSyA9IDc3ODsKICAgIHQuTCA9IDY2NzsKICAgIHQuTSA9IDk0NDsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDc3ODsKICAgIHQuUCA9IDYxMTsKICAgIHQuUSA9IDc3ODsKICAgIHQuUiA9IDcyMjsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDY2NzsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDcyMjsKICAgIHQuVyA9IDEwMDA7CiAgICB0LlggPSA3MjI7CiAgICB0LlkgPSA3MjI7CiAgICB0LlogPSA2Njc7CiAgICB0LmJyYWNrZXRsZWZ0ID0gMzMzOwogICAgdC5iYWNrc2xhc2ggPSAyNzg7CiAgICB0LmJyYWNrZXRyaWdodCA9IDMzMzsKICAgIHQuYXNjaWljaXJjdW0gPSA1ODE7CiAgICB0LnVuZGVyc2NvcmUgPSA1MDA7CiAgICB0LnF1b3RlbGVmdCA9IDMzMzsKICAgIHQuYSA9IDUwMDsKICAgIHQuYiA9IDU1NjsKICAgIHQuYyA9IDQ0NDsKICAgIHQuZCA9IDU1NjsKICAgIHQuZSA9IDQ0NDsKICAgIHQuZiA9IDMzMzsKICAgIHQuZyA9IDUwMDsKICAgIHQuaCA9IDU1NjsKICAgIHQuaSA9IDI3ODsKICAgIHQuaiA9IDMzMzsKICAgIHQuayA9IDU1NjsKICAgIHQubCA9IDI3ODsKICAgIHQubSA9IDgzMzsKICAgIHQubiA9IDU1NjsKICAgIHQubyA9IDUwMDsKICAgIHQucCA9IDU1NjsKICAgIHQucSA9IDU1NjsKICAgIHQuciA9IDQ0NDsKICAgIHQucyA9IDM4OTsKICAgIHQudCA9IDMzMzsKICAgIHQudSA9IDU1NjsKICAgIHQudiA9IDUwMDsKICAgIHQudyA9IDcyMjsKICAgIHQueCA9IDUwMDsKICAgIHQueSA9IDUwMDsKICAgIHQueiA9IDQ0NDsKICAgIHQuYnJhY2VsZWZ0ID0gMzk0OwogICAgdC5iYXIgPSAyMjA7CiAgICB0LmJyYWNlcmlnaHQgPSAzOTQ7CiAgICB0LmFzY2lpdGlsZGUgPSA1MjA7CiAgICB0LmV4Y2xhbWRvd24gPSAzMzM7CiAgICB0LmNlbnQgPSA1MDA7CiAgICB0LnN0ZXJsaW5nID0gNTAwOwogICAgdC5mcmFjdGlvbiA9IDE2NzsKICAgIHQueWVuID0gNTAwOwogICAgdC5mbG9yaW4gPSA1MDA7CiAgICB0LnNlY3Rpb24gPSA1MDA7CiAgICB0LmN1cnJlbmN5ID0gNTAwOwogICAgdC5xdW90ZXNpbmdsZSA9IDI3ODsKICAgIHQucXVvdGVkYmxsZWZ0ID0gNTAwOwogICAgdC5ndWlsbGVtb3RsZWZ0ID0gNTAwOwogICAgdC5ndWlsc2luZ2xsZWZ0ID0gMzMzOwogICAgdC5ndWlsc2luZ2xyaWdodCA9IDMzMzsKICAgIHQuZmkgPSA1NTY7CiAgICB0LmZsID0gNTU2OwogICAgdC5lbmRhc2ggPSA1MDA7CiAgICB0LmRhZ2dlciA9IDUwMDsKICAgIHQuZGFnZ2VyZGJsID0gNTAwOwogICAgdC5wZXJpb2RjZW50ZXJlZCA9IDI1MDsKICAgIHQucGFyYWdyYXBoID0gNTQwOwogICAgdC5idWxsZXQgPSAzNTA7CiAgICB0LnF1b3Rlc2luZ2xiYXNlID0gMzMzOwogICAgdC5xdW90ZWRibGJhc2UgPSA1MDA7CiAgICB0LnF1b3RlZGJscmlnaHQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdHJpZ2h0ID0gNTAwOwogICAgdC5lbGxpcHNpcyA9IDEwMDA7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNTAwOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDEwMDA7CiAgICB0LkFFID0gMTAwMDsKICAgIHQub3JkZmVtaW5pbmUgPSAzMDA7CiAgICB0LkxzbGFzaCA9IDY2NzsKICAgIHQuT3NsYXNoID0gNzc4OwogICAgdC5PRSA9IDEwMDA7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMzMDsKICAgIHQuYWUgPSA3MjI7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1NTY7CiAgICB0LklkaWVyZXNpcyA9IDM4OTsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNzIyOwogICAgdC5kaXZpZGUgPSA1NzA7CiAgICB0LllhY3V0ZSA9IDcyMjsKICAgIHQuQWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDUwMDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc0NzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjY3OwogICAgdC5DYWN1dGUgPSA3MjI7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5SY2Fyb24gPSA3MjI7CiAgICB0Lkdjb21tYWFjY2VudCA9IDc3ODsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNzIyOwogICAgdC5yY2Fyb24gPSA0NDQ7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjY3OwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDc3ODsKICAgIHQuUmFjdXRlID0gNzIyOwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDY3MjsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDc3ODsKICAgIHQuQWdyYXZlID0gNzIyOwogICAgdC5BYnJldmUgPSA3MjI7CiAgICB0Lm11bHRpcGx5ID0gNTcwOwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDY2NzsKICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CiAgICB0LnlkaWVyZXNpcyA9IDUwMDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDUwMDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzODk7CiAgICB0LnBsdXNtaW51cyA9IDU3MDsKICAgIHQuYnJva2VuYmFyID0gMjIwOwogICAgdC5yZWdpc3RlcmVkID0gNzQ3OwogICAgdC5HYnJldmUgPSA3Nzg7CiAgICB0Lklkb3RhY2NlbnQgPSAzODk7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSA0NDQ7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDY2NzsKICAgIHQuWmNhcm9uID0gNjY3OwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA3MjI7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gNDE2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA3MjI7CiAgICB0LkFkaWVyZXNpcyA9IDcyMjsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSA0NDQ7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDc3ODsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3Nzg7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTU2OwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzc4OwogICAgdC5tdSA9IDU1NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1NTY7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzOTQ7CiAgICB0Lktjb21tYWFjY2VudCA9IDc3ODsKICAgIHQuTGFjdXRlID0gNjY3OwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNDQ0OwogICAgdC5JZ3JhdmUgPSAzODk7CiAgICB0LkltYWNyb24gPSAzODk7CiAgICB0LkxjYXJvbiA9IDY2NzsKICAgIHQub25laGFsZiA9IDc1MDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA0NDQ7CiAgICB0LmdicmV2ZSA9IDUwMDsKICAgIHQub25lcXVhcnRlciA9IDc1MDsKICAgIHQuU2Nhcm9uID0gNTU2OwogICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3Nzg7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTAwOwogICAgdC5DY2Fyb24gPSA3MjI7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDU0OTsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSA0NDQ7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTAwOwogICAgdC5SY29tbWFhY2NlbnQgPSA3MjI7CiAgICB0Lkxjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuQXRpbGRlID0gNzIyOwogICAgdC5Bb2dvbmVrID0gNzIyOwogICAgdC5BcmluZyA9IDcyMjsKICAgIHQuT3RpbGRlID0gNzc4OwogICAgdC56ZG90YWNjZW50ID0gNDQ0OwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAzODk7CiAgICB0Lmtjb21tYWFjY2VudCA9IDU1NjsKICAgIHQubWludXMgPSA1NzA7CiAgICB0LkljaXJjdW1mbGV4ID0gMzg5OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDMzMzsKICAgIHQubG9naWNhbG5vdCA9IDU3MDsKICAgIHQub2RpZXJlc2lzID0gNTAwOwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0LmV0aCA9IDUwMDsKICAgIHQuemNhcm9uID0gNDQ0OwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTAwOwogIH0pOwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgICB0LnNwYWNlID0gMjUwOwogICAgdC5leGNsYW0gPSAzODk7CiAgICB0LnF1b3RlZGJsID0gNTU1OwogICAgdC5udW1iZXJzaWduID0gNTAwOwogICAgdC5kb2xsYXIgPSA1MDA7CiAgICB0LnBlcmNlbnQgPSA4MzM7CiAgICB0LmFtcGVyc2FuZCA9IDc3ODsKICAgIHQucXVvdGVyaWdodCA9IDMzMzsKICAgIHQucGFyZW5sZWZ0ID0gMzMzOwogICAgdC5wYXJlbnJpZ2h0ID0gMzMzOwogICAgdC5hc3RlcmlzayA9IDUwMDsKICAgIHQucGx1cyA9IDU3MDsKICAgIHQuY29tbWEgPSAyNTA7CiAgICB0Lmh5cGhlbiA9IDMzMzsKICAgIHQucGVyaW9kID0gMjUwOwogICAgdC5zbGFzaCA9IDI3ODsKICAgIHQuemVybyA9IDUwMDsKICAgIHQub25lID0gNTAwOwogICAgdC50d28gPSA1MDA7CiAgICB0LnRocmVlID0gNTAwOwogICAgdC5mb3VyID0gNTAwOwogICAgdC5maXZlID0gNTAwOwogICAgdC5zaXggPSA1MDA7CiAgICB0LnNldmVuID0gNTAwOwogICAgdC5laWdodCA9IDUwMDsKICAgIHQubmluZSA9IDUwMDsKICAgIHQuY29sb24gPSAzMzM7CiAgICB0LnNlbWljb2xvbiA9IDMzMzsKICAgIHQubGVzcyA9IDU3MDsKICAgIHQuZXF1YWwgPSA1NzA7CiAgICB0LmdyZWF0ZXIgPSA1NzA7CiAgICB0LnF1ZXN0aW9uID0gNTAwOwogICAgdC5hdCA9IDgzMjsKICAgIHQuQSA9IDY2NzsKICAgIHQuQiA9IDY2NzsKICAgIHQuQyA9IDY2NzsKICAgIHQuRCA9IDcyMjsKICAgIHQuRSA9IDY2NzsKICAgIHQuRiA9IDY2NzsKICAgIHQuRyA9IDcyMjsKICAgIHQuSCA9IDc3ODsKICAgIHQuSSA9IDM4OTsKICAgIHQuSiA9IDUwMDsKICAgIHQuSyA9IDY2NzsKICAgIHQuTCA9IDYxMTsKICAgIHQuTSA9IDg4OTsKICAgIHQuTiA9IDcyMjsKICAgIHQuTyA9IDcyMjsKICAgIHQuUCA9IDYxMTsKICAgIHQuUSA9IDcyMjsKICAgIHQuUiA9IDY2NzsKICAgIHQuUyA9IDU1NjsKICAgIHQuVCA9IDYxMTsKICAgIHQuVSA9IDcyMjsKICAgIHQuViA9IDY2NzsKICAgIHQuVyA9IDg4OTsKICAgIHQuWCA9IDY2NzsKICAgIHQuWSA9IDYxMTsKICAgIHQuWiA9IDYxMTsKICAgIHQuYnJhY2tldGxlZnQgPSAzMzM7CiAgICB0LmJhY2tzbGFzaCA9IDI3ODsKICAgIHQuYnJhY2tldHJpZ2h0ID0gMzMzOwogICAgdC5hc2NpaWNpcmN1bSA9IDU3MDsKICAgIHQudW5kZXJzY29yZSA9IDUwMDsKICAgIHQucXVvdGVsZWZ0ID0gMzMzOwogICAgdC5hID0gNTAwOwogICAgdC5iID0gNTAwOwogICAgdC5jID0gNDQ0OwogICAgdC5kID0gNTAwOwogICAgdC5lID0gNDQ0OwogICAgdC5mID0gMzMzOwogICAgdC5nID0gNTAwOwogICAgdC5oID0gNTU2OwogICAgdC5pID0gMjc4OwogICAgdC5qID0gMjc4OwogICAgdC5rID0gNTAwOwogICAgdC5sID0gMjc4OwogICAgdC5tID0gNzc4OwogICAgdC5uID0gNTU2OwogICAgdC5vID0gNTAwOwogICAgdC5wID0gNTAwOwogICAgdC5xID0gNTAwOwogICAgdC5yID0gMzg5OwogICAgdC5zID0gMzg5OwogICAgdC50ID0gMjc4OwogICAgdC51ID0gNTU2OwogICAgdC52ID0gNDQ0OwogICAgdC53ID0gNjY3OwogICAgdC54ID0gNTAwOwogICAgdC55ID0gNDQ0OwogICAgdC56ID0gMzg5OwogICAgdC5icmFjZWxlZnQgPSAzNDg7CiAgICB0LmJhciA9IDIyMDsKICAgIHQuYnJhY2VyaWdodCA9IDM0ODsKICAgIHQuYXNjaWl0aWxkZSA9IDU3MDsKICAgIHQuZXhjbGFtZG93biA9IDM4OTsKICAgIHQuY2VudCA9IDUwMDsKICAgIHQuc3RlcmxpbmcgPSA1MDA7CiAgICB0LmZyYWN0aW9uID0gMTY3OwogICAgdC55ZW4gPSA1MDA7CiAgICB0LmZsb3JpbiA9IDUwMDsKICAgIHQuc2VjdGlvbiA9IDUwMDsKICAgIHQuY3VycmVuY3kgPSA1MDA7CiAgICB0LnF1b3Rlc2luZ2xlID0gMjc4OwogICAgdC5xdW90ZWRibGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxsZW1vdGxlZnQgPSA1MDA7CiAgICB0Lmd1aWxzaW5nbGxlZnQgPSAzMzM7CiAgICB0Lmd1aWxzaW5nbHJpZ2h0ID0gMzMzOwogICAgdC5maSA9IDU1NjsKICAgIHQuZmwgPSA1NTY7CiAgICB0LmVuZGFzaCA9IDUwMDsKICAgIHQuZGFnZ2VyID0gNTAwOwogICAgdC5kYWdnZXJkYmwgPSA1MDA7CiAgICB0LnBlcmlvZGNlbnRlcmVkID0gMjUwOwogICAgdC5wYXJhZ3JhcGggPSA1MDA7CiAgICB0LmJ1bGxldCA9IDM1MDsKICAgIHQucXVvdGVzaW5nbGJhc2UgPSAzMzM7CiAgICB0LnF1b3RlZGJsYmFzZSA9IDUwMDsKICAgIHQucXVvdGVkYmxyaWdodCA9IDUwMDsKICAgIHQuZ3VpbGxlbW90cmlnaHQgPSA1MDA7CiAgICB0LmVsbGlwc2lzID0gMTAwMDsKICAgIHQucGVydGhvdXNhbmQgPSAxMDAwOwogICAgdC5xdWVzdGlvbmRvd24gPSA1MDA7CiAgICB0LmdyYXZlID0gMzMzOwogICAgdC5hY3V0ZSA9IDMzMzsKICAgIHQuY2lyY3VtZmxleCA9IDMzMzsKICAgIHQudGlsZGUgPSAzMzM7CiAgICB0Lm1hY3JvbiA9IDMzMzsKICAgIHQuYnJldmUgPSAzMzM7CiAgICB0LmRvdGFjY2VudCA9IDMzMzsKICAgIHQuZGllcmVzaXMgPSAzMzM7CiAgICB0LnJpbmcgPSAzMzM7CiAgICB0LmNlZGlsbGEgPSAzMzM7CiAgICB0Lmh1bmdhcnVtbGF1dCA9IDMzMzsKICAgIHQub2dvbmVrID0gMzMzOwogICAgdC5jYXJvbiA9IDMzMzsKICAgIHQuZW1kYXNoID0gMTAwMDsKICAgIHQuQUUgPSA5NDQ7CiAgICB0Lm9yZGZlbWluaW5lID0gMjY2OwogICAgdC5Mc2xhc2ggPSA2MTE7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA5NDQ7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMwMDsKICAgIHQuYWUgPSA3MjI7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA3MjI7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDM4OTsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1NTY7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNjExOwogICAgdC5kaXZpZGUgPSA1NzA7CiAgICB0LllhY3V0ZSA9IDYxMTsKICAgIHQuQWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDQ0NDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTU2OwogICAgdC5FZGllcmVzaXMgPSA2Njc7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc0NzsKICAgIHQuRW1hY3JvbiA9IDY2NzsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNzIyOwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNjExOwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDY2NzsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDk0OwogICAgdC5SY2Fyb24gPSA2Njc7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1NTY7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNjY3OwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNjExOwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjY3OwogICAgdC5TYWN1dGUgPSA1NTY7CiAgICB0LmRjYXJvbiA9IDYwODsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1NTY7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNjY3OwogICAgdC5BYnJldmUgPSA2Njc7CiAgICB0Lm11bHRpcGx5ID0gNTcwOwogICAgdC51YWN1dGUgPSA1NTY7CiAgICB0LlRjYXJvbiA9IDYxMTsKICAgIHQucGFydGlhbGRpZmYgPSA0OTQ7CiAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKICAgIHQuTmFjdXRlID0gNzIyOwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2Njc7CiAgICB0LmFkaWVyZXNpcyA9IDUwMDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDU1NjsKICAgIHQudW1hY3JvbiA9IDU1NjsKICAgIHQuTmNhcm9uID0gNzIyOwogICAgdC5JYWN1dGUgPSAzODk7CiAgICB0LnBsdXNtaW51cyA9IDU3MDsKICAgIHQuYnJva2VuYmFyID0gMjIwOwogICAgdC5yZWdpc3RlcmVkID0gNzQ3OwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzODk7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjY3OwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDYxMTsKICAgIHQuWmNhcm9uID0gNjExOwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzY2OwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2Njc7CiAgICB0LkFkaWVyZXNpcyA9IDY2NzsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSAzODk7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDU3NjsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjY3OwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTU2OwogICAgdC5sY2Fyb24gPSAzODI7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNjExOwogICAgdC50cmFkZW1hcmsgPSAxMDAwOwogICAgdC5lZG90YWNjZW50ID0gNDQ0OwogICAgdC5JZ3JhdmUgPSAzODk7CiAgICB0LkltYWNyb24gPSAzODk7CiAgICB0LkxjYXJvbiA9IDYxMTsKICAgIHQub25laGFsZiA9IDc1MDsKICAgIHQubGVzc2VxdWFsID0gNTQ5OwogICAgdC5vY2lyY3VtZmxleCA9IDUwMDsKICAgIHQubnRpbGRlID0gNTU2OwogICAgdC5VaHVuZ2FydW1sYXV0ID0gNzIyOwogICAgdC5FYWN1dGUgPSA2Njc7CiAgICB0LmVtYWNyb24gPSA0NDQ7CiAgICB0LmdicmV2ZSA9IDUwMDsKICAgIHQub25lcXVhcnRlciA9IDc1MDsKICAgIHQuU2Nhcm9uID0gNTU2OwogICAgdC5TY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lk9odW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LmRlZ3JlZSA9IDQwMDsKICAgIHQub2dyYXZlID0gNTAwOwogICAgdC5DY2Fyb24gPSA2Njc7CiAgICB0LnVncmF2ZSA9IDU1NjsKICAgIHQucmFkaWNhbCA9IDU0OTsKICAgIHQuRGNhcm9uID0gNzIyOwogICAgdC5yY29tbWFhY2NlbnQgPSAzODk7CiAgICB0Lk50aWxkZSA9IDcyMjsKICAgIHQub3RpbGRlID0gNTAwOwogICAgdC5SY29tbWFhY2NlbnQgPSA2Njc7CiAgICB0Lkxjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuQXRpbGRlID0gNjY3OwogICAgdC5Bb2dvbmVrID0gNjY3OwogICAgdC5BcmluZyA9IDY2NzsKICAgIHQuT3RpbGRlID0gNzIyOwogICAgdC56ZG90YWNjZW50ID0gMzg5OwogICAgdC5FY2Fyb24gPSA2Njc7CiAgICB0LklvZ29uZWsgPSAzODk7CiAgICB0Lmtjb21tYWFjY2VudCA9IDUwMDsKICAgIHQubWludXMgPSA2MDY7CiAgICB0LkljaXJjdW1mbGV4ID0gMzg5OwogICAgdC5uY2Fyb24gPSA1NTY7CiAgICB0LnRjb21tYWFjY2VudCA9IDI3ODsKICAgIHQubG9naWNhbG5vdCA9IDYwNjsKICAgIHQub2RpZXJlc2lzID0gNTAwOwogICAgdC51ZGllcmVzaXMgPSA1NTY7CiAgICB0Lm5vdGVxdWFsID0gNTQ5OwogICAgdC5nY29tbWFhY2NlbnQgPSA1MDA7CiAgICB0LmV0aCA9IDUwMDsKICAgIHQuemNhcm9uID0gMzg5OwogICAgdC5uY29tbWFhY2NlbnQgPSA1NTY7CiAgICB0Lm9uZXN1cGVyaW9yID0gMzAwOwogICAgdC5pbWFjcm9uID0gMjc4OwogICAgdC5FdXJvID0gNTAwOwogIH0pOwogIHRbIlRpbWVzLUl0YWxpYyJdID0gKDAsIF9jb3JlX3V0aWxzLmdldExvb2t1cFRhYmxlRmFjdG9yeSkoZnVuY3Rpb24gKHQpIHsKICAgIHQuc3BhY2UgPSAyNTA7CiAgICB0LmV4Y2xhbSA9IDMzMzsKICAgIHQucXVvdGVkYmwgPSA0MjA7CiAgICB0Lm51bWJlcnNpZ24gPSA1MDA7CiAgICB0LmRvbGxhciA9IDUwMDsKICAgIHQucGVyY2VudCA9IDgzMzsKICAgIHQuYW1wZXJzYW5kID0gNzc4OwogICAgdC5xdW90ZXJpZ2h0ID0gMzMzOwogICAgdC5wYXJlbmxlZnQgPSAzMzM7CiAgICB0LnBhcmVucmlnaHQgPSAzMzM7CiAgICB0LmFzdGVyaXNrID0gNTAwOwogICAgdC5wbHVzID0gNjc1OwogICAgdC5jb21tYSA9IDI1MDsKICAgIHQuaHlwaGVuID0gMzMzOwogICAgdC5wZXJpb2QgPSAyNTA7CiAgICB0LnNsYXNoID0gMjc4OwogICAgdC56ZXJvID0gNTAwOwogICAgdC5vbmUgPSA1MDA7CiAgICB0LnR3byA9IDUwMDsKICAgIHQudGhyZWUgPSA1MDA7CiAgICB0LmZvdXIgPSA1MDA7CiAgICB0LmZpdmUgPSA1MDA7CiAgICB0LnNpeCA9IDUwMDsKICAgIHQuc2V2ZW4gPSA1MDA7CiAgICB0LmVpZ2h0ID0gNTAwOwogICAgdC5uaW5lID0gNTAwOwogICAgdC5jb2xvbiA9IDMzMzsKICAgIHQuc2VtaWNvbG9uID0gMzMzOwogICAgdC5sZXNzID0gNjc1OwogICAgdC5lcXVhbCA9IDY3NTsKICAgIHQuZ3JlYXRlciA9IDY3NTsKICAgIHQucXVlc3Rpb24gPSA1MDA7CiAgICB0LmF0ID0gOTIwOwogICAgdC5BID0gNjExOwogICAgdC5CID0gNjExOwogICAgdC5DID0gNjY3OwogICAgdC5EID0gNzIyOwogICAgdC5FID0gNjExOwogICAgdC5GID0gNjExOwogICAgdC5HID0gNzIyOwogICAgdC5IID0gNzIyOwogICAgdC5JID0gMzMzOwogICAgdC5KID0gNDQ0OwogICAgdC5LID0gNjY3OwogICAgdC5MID0gNTU2OwogICAgdC5NID0gODMzOwogICAgdC5OID0gNjY3OwogICAgdC5PID0gNzIyOwogICAgdC5QID0gNjExOwogICAgdC5RID0gNzIyOwogICAgdC5SID0gNjExOwogICAgdC5TID0gNTAwOwogICAgdC5UID0gNTU2OwogICAgdC5VID0gNzIyOwogICAgdC5WID0gNjExOwogICAgdC5XID0gODMzOwogICAgdC5YID0gNjExOwogICAgdC5ZID0gNTU2OwogICAgdC5aID0gNTU2OwogICAgdC5icmFja2V0bGVmdCA9IDM4OTsKICAgIHQuYmFja3NsYXNoID0gMjc4OwogICAgdC5icmFja2V0cmlnaHQgPSAzODk7CiAgICB0LmFzY2lpY2lyY3VtID0gNDIyOwogICAgdC51bmRlcnNjb3JlID0gNTAwOwogICAgdC5xdW90ZWxlZnQgPSAzMzM7CiAgICB0LmEgPSA1MDA7CiAgICB0LmIgPSA1MDA7CiAgICB0LmMgPSA0NDQ7CiAgICB0LmQgPSA1MDA7CiAgICB0LmUgPSA0NDQ7CiAgICB0LmYgPSAyNzg7CiAgICB0LmcgPSA1MDA7CiAgICB0LmggPSA1MDA7CiAgICB0LmkgPSAyNzg7CiAgICB0LmogPSAyNzg7CiAgICB0LmsgPSA0NDQ7CiAgICB0LmwgPSAyNzg7CiAgICB0Lm0gPSA3MjI7CiAgICB0Lm4gPSA1MDA7CiAgICB0Lm8gPSA1MDA7CiAgICB0LnAgPSA1MDA7CiAgICB0LnEgPSA1MDA7CiAgICB0LnIgPSAzODk7CiAgICB0LnMgPSAzODk7CiAgICB0LnQgPSAyNzg7CiAgICB0LnUgPSA1MDA7CiAgICB0LnYgPSA0NDQ7CiAgICB0LncgPSA2Njc7CiAgICB0LnggPSA0NDQ7CiAgICB0LnkgPSA0NDQ7CiAgICB0LnogPSAzODk7CiAgICB0LmJyYWNlbGVmdCA9IDQwMDsKICAgIHQuYmFyID0gMjc1OwogICAgdC5icmFjZXJpZ2h0ID0gNDAwOwogICAgdC5hc2NpaXRpbGRlID0gNTQxOwogICAgdC5leGNsYW1kb3duID0gMzg5OwogICAgdC5jZW50ID0gNTAwOwogICAgdC5zdGVybGluZyA9IDUwMDsKICAgIHQuZnJhY3Rpb24gPSAxNjc7CiAgICB0LnllbiA9IDUwMDsKICAgIHQuZmxvcmluID0gNTAwOwogICAgdC5zZWN0aW9uID0gNTAwOwogICAgdC5jdXJyZW5jeSA9IDUwMDsKICAgIHQucXVvdGVzaW5nbGUgPSAyMTQ7CiAgICB0LnF1b3RlZGJsbGVmdCA9IDU1NjsKICAgIHQuZ3VpbGxlbW90bGVmdCA9IDUwMDsKICAgIHQuZ3VpbHNpbmdsbGVmdCA9IDMzMzsKICAgIHQuZ3VpbHNpbmdscmlnaHQgPSAzMzM7CiAgICB0LmZpID0gNTAwOwogICAgdC5mbCA9IDUwMDsKICAgIHQuZW5kYXNoID0gNTAwOwogICAgdC5kYWdnZXIgPSA1MDA7CiAgICB0LmRhZ2dlcmRibCA9IDUwMDsKICAgIHQucGVyaW9kY2VudGVyZWQgPSAyNTA7CiAgICB0LnBhcmFncmFwaCA9IDUyMzsKICAgIHQuYnVsbGV0ID0gMzUwOwogICAgdC5xdW90ZXNpbmdsYmFzZSA9IDMzMzsKICAgIHQucXVvdGVkYmxiYXNlID0gNTU2OwogICAgdC5xdW90ZWRibHJpZ2h0ID0gNTU2OwogICAgdC5ndWlsbGVtb3RyaWdodCA9IDUwMDsKICAgIHQuZWxsaXBzaXMgPSA4ODk7CiAgICB0LnBlcnRob3VzYW5kID0gMTAwMDsKICAgIHQucXVlc3Rpb25kb3duID0gNTAwOwogICAgdC5ncmF2ZSA9IDMzMzsKICAgIHQuYWN1dGUgPSAzMzM7CiAgICB0LmNpcmN1bWZsZXggPSAzMzM7CiAgICB0LnRpbGRlID0gMzMzOwogICAgdC5tYWNyb24gPSAzMzM7CiAgICB0LmJyZXZlID0gMzMzOwogICAgdC5kb3RhY2NlbnQgPSAzMzM7CiAgICB0LmRpZXJlc2lzID0gMzMzOwogICAgdC5yaW5nID0gMzMzOwogICAgdC5jZWRpbGxhID0gMzMzOwogICAgdC5odW5nYXJ1bWxhdXQgPSAzMzM7CiAgICB0Lm9nb25layA9IDMzMzsKICAgIHQuY2Fyb24gPSAzMzM7CiAgICB0LmVtZGFzaCA9IDg4OTsKICAgIHQuQUUgPSA4ODk7CiAgICB0Lm9yZGZlbWluaW5lID0gMjc2OwogICAgdC5Mc2xhc2ggPSA1NTY7CiAgICB0Lk9zbGFzaCA9IDcyMjsKICAgIHQuT0UgPSA5NDQ7CiAgICB0Lm9yZG1hc2N1bGluZSA9IDMxMDsKICAgIHQuYWUgPSA2Njc7CiAgICB0LmRvdGxlc3NpID0gMjc4OwogICAgdC5sc2xhc2ggPSAyNzg7CiAgICB0Lm9zbGFzaCA9IDUwMDsKICAgIHQub2UgPSA2Njc7CiAgICB0Lmdlcm1hbmRibHMgPSA1MDA7CiAgICB0LklkaWVyZXNpcyA9IDMzMzsKICAgIHQuZWFjdXRlID0gNDQ0OwogICAgdC5hYnJldmUgPSA1MDA7CiAgICB0LnVodW5nYXJ1bWxhdXQgPSA1MDA7CiAgICB0LmVjYXJvbiA9IDQ0NDsKICAgIHQuWWRpZXJlc2lzID0gNTU2OwogICAgdC5kaXZpZGUgPSA2NzU7CiAgICB0LllhY3V0ZSA9IDU1NjsKICAgIHQuQWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFhY3V0ZSA9IDUwMDsKICAgIHQuVWNpcmN1bWZsZXggPSA3MjI7CiAgICB0LnlhY3V0ZSA9IDQ0NDsKICAgIHQuc2NvbW1hYWNjZW50ID0gMzg5OwogICAgdC5lY2lyY3VtZmxleCA9IDQ0NDsKICAgIHQuVXJpbmcgPSA3MjI7CiAgICB0LlVkaWVyZXNpcyA9IDcyMjsKICAgIHQuYW9nb25layA9IDUwMDsKICAgIHQuVWFjdXRlID0gNzIyOwogICAgdC51b2dvbmVrID0gNTAwOwogICAgdC5FZGllcmVzaXMgPSA2MTE7CiAgICB0LkRjcm9hdCA9IDcyMjsKICAgIHQuY29tbWFhY2NlbnQgPSAyNTA7CiAgICB0LmNvcHlyaWdodCA9IDc2MDsKICAgIHQuRW1hY3JvbiA9IDYxMTsKICAgIHQuY2Nhcm9uID0gNDQ0OwogICAgdC5hcmluZyA9IDUwMDsKICAgIHQuTmNvbW1hYWNjZW50ID0gNjY3OwogICAgdC5sYWN1dGUgPSAyNzg7CiAgICB0LmFncmF2ZSA9IDUwMDsKICAgIHQuVGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5DYWN1dGUgPSA2Njc7CiAgICB0LmF0aWxkZSA9IDUwMDsKICAgIHQuRWRvdGFjY2VudCA9IDYxMTsKICAgIHQuc2Nhcm9uID0gMzg5OwogICAgdC5zY2VkaWxsYSA9IDM4OTsKICAgIHQuaWFjdXRlID0gMjc4OwogICAgdC5sb3plbmdlID0gNDcxOwogICAgdC5SY2Fyb24gPSA2MTE7CiAgICB0Lkdjb21tYWFjY2VudCA9IDcyMjsKICAgIHQudWNpcmN1bWZsZXggPSA1MDA7CiAgICB0LmFjaXJjdW1mbGV4ID0gNTAwOwogICAgdC5BbWFjcm9uID0gNjExOwogICAgdC5yY2Fyb24gPSAzODk7CiAgICB0LmNjZWRpbGxhID0gNDQ0OwogICAgdC5aZG90YWNjZW50ID0gNTU2OwogICAgdC5UaG9ybiA9IDYxMTsKICAgIHQuT21hY3JvbiA9IDcyMjsKICAgIHQuUmFjdXRlID0gNjExOwogICAgdC5TYWN1dGUgPSA1MDA7CiAgICB0LmRjYXJvbiA9IDU0NDsKICAgIHQuVW1hY3JvbiA9IDcyMjsKICAgIHQudXJpbmcgPSA1MDA7CiAgICB0LnRocmVlc3VwZXJpb3IgPSAzMDA7CiAgICB0Lk9ncmF2ZSA9IDcyMjsKICAgIHQuQWdyYXZlID0gNjExOwogICAgdC5BYnJldmUgPSA2MTE7CiAgICB0Lm11bHRpcGx5ID0gNjc1OwogICAgdC51YWN1dGUgPSA1MDA7CiAgICB0LlRjYXJvbiA9IDU1NjsKICAgIHQucGFydGlhbGRpZmYgPSA0NzY7CiAgICB0LnlkaWVyZXNpcyA9IDQ0NDsKICAgIHQuTmFjdXRlID0gNjY3OwogICAgdC5pY2lyY3VtZmxleCA9IDI3ODsKICAgIHQuRWNpcmN1bWZsZXggPSA2MTE7CiAgICB0LmFkaWVyZXNpcyA9IDUwMDsKICAgIHQuZWRpZXJlc2lzID0gNDQ0OwogICAgdC5jYWN1dGUgPSA0NDQ7CiAgICB0Lm5hY3V0ZSA9IDUwMDsKICAgIHQudW1hY3JvbiA9IDUwMDsKICAgIHQuTmNhcm9uID0gNjY3OwogICAgdC5JYWN1dGUgPSAzMzM7CiAgICB0LnBsdXNtaW51cyA9IDY3NTsKICAgIHQuYnJva2VuYmFyID0gMjc1OwogICAgdC5yZWdpc3RlcmVkID0gNzYwOwogICAgdC5HYnJldmUgPSA3MjI7CiAgICB0Lklkb3RhY2NlbnQgPSAzMzM7CiAgICB0LnN1bW1hdGlvbiA9IDYwMDsKICAgIHQuRWdyYXZlID0gNjExOwogICAgdC5yYWN1dGUgPSAzODk7CiAgICB0Lm9tYWNyb24gPSA1MDA7CiAgICB0LlphY3V0ZSA9IDU1NjsKICAgIHQuWmNhcm9uID0gNTU2OwogICAgdC5ncmVhdGVyZXF1YWwgPSA1NDk7CiAgICB0LkV0aCA9IDcyMjsKICAgIHQuQ2NlZGlsbGEgPSA2Njc7CiAgICB0Lmxjb21tYWFjY2VudCA9IDI3ODsKICAgIHQudGNhcm9uID0gMzAwOwogICAgdC5lb2dvbmVrID0gNDQ0OwogICAgdC5Vb2dvbmVrID0gNzIyOwogICAgdC5BYWN1dGUgPSA2MTE7CiAgICB0LkFkaWVyZXNpcyA9IDYxMTsKICAgIHQuZWdyYXZlID0gNDQ0OwogICAgdC56YWN1dGUgPSAzODk7CiAgICB0LmlvZ29uZWsgPSAyNzg7CiAgICB0Lk9hY3V0ZSA9IDcyMjsKICAgIHQub2FjdXRlID0gNTAwOwogICAgdC5hbWFjcm9uID0gNTAwOwogICAgdC5zYWN1dGUgPSAzODk7CiAgICB0LmlkaWVyZXNpcyA9IDI3ODsKICAgIHQuT2NpcmN1bWZsZXggPSA3MjI7CiAgICB0LlVncmF2ZSA9IDcyMjsKICAgIHQuRGVsdGEgPSA2MTI7CiAgICB0LnRob3JuID0gNTAwOwogICAgdC50d29zdXBlcmlvciA9IDMwMDsKICAgIHQuT2RpZXJlc2lzID0gNzIyOwogICAgdC5tdSA9IDUwMDsKICAgIHQuaWdyYXZlID0gMjc4OwogICAgdC5vaHVuZ2FydW1sYXV0ID0gNTAwOwogICAgdC5Fb2dvbmVrID0gNjExOwogICAgdC5kY3JvYXQgPSA1MDA7CiAgICB0LnRocmVlcXVhcnRlcnMgPSA3NTA7CiAgICB0LlNjZWRpbGxhID0gNTAwOwogICAgdC5sY2Fyb24gPSAzMDA7CiAgICB0Lktjb21tYWFjY2VudCA9IDY2NzsKICAgIHQuTGFjdXRlID0gNTU2OwogICAgdC50cmFkZW1hcmsgPSA5ODA7CiAgICB0LmVkb3RhY2NlbnQgPSA0NDQ7CiAgICB0LklncmF2ZSA9IDMzMzsKICAgIHQuSW1hY3JvbiA9IDMzMzsKICAgIHQuTGNhcm9uID0gNjExOwogICAgdC5vbmVoYWxmID0gNzUwOwogICAgdC5sZXNzZXF1YWwgPSA1NDk7CiAgICB0Lm9jaXJjdW1mbGV4ID0gNTAwOwogICAgdC5udGlsZGUgPSA1MDA7CiAgICB0LlVodW5nYXJ1bWxhdXQgPSA3MjI7CiAgICB0LkVhY3V0ZSA9IDYxMTsKICAgIHQuZW1hY3JvbiA9IDQ0NDsKICAgIHQuZ2JyZXZlID0gNTAwOwogICAgdC5vbmVxdWFydGVyID0gNzUwOwogICAgdC5TY2Fyb24gPSA1MDA7CiAgICB0LlNjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuT2h1bmdhcnVtbGF1dCA9IDcyMjsKICAgIHQuZGVncmVlID0gNDAwOwogICAgdC5vZ3JhdmUgPSA1MDA7CiAgICB0LkNjYXJvbiA9IDY2NzsKICAgIHQudWdyYXZlID0gNTAwOwogICAgdC5yYWRpY2FsID0gNDUzOwogICAgdC5EY2Fyb24gPSA3MjI7CiAgICB0LnJjb21tYWFjY2VudCA9IDM4OTsKICAgIHQuTnRpbGRlID0gNjY3OwogICAgdC5vdGlsZGUgPSA1MDA7CiAgICB0LlJjb21tYWFjY2VudCA9IDYxMTsKICAgIHQuTGNvbW1hYWNjZW50ID0gNTU2OwogICAgdC5BdGlsZGUgPSA2MTE7CiAgICB0LkFvZ29uZWsgPSA2MTE7CiAgICB0LkFyaW5nID0gNjExOwogICAgdC5PdGlsZGUgPSA3MjI7CiAgICB0Lnpkb3RhY2NlbnQgPSAzODk7CiAgICB0LkVjYXJvbiA9IDYxMTsKICAgIHQuSW9nb25layA9IDMzMzsKICAgIHQua2NvbW1hYWNjZW50ID0gNDQ0OwogICAgdC5taW51cyA9IDY3NTsKICAgIHQuSWNpcmN1bWZsZXggPSAzMzM7CiAgICB0Lm5jYXJvbiA9IDUwMDsKICAgIHQudGNvbW1hYWNjZW50ID0gMjc4OwogICAgdC5sb2dpY2Fsbm90ID0gNjc1OwogICAgdC5vZGllcmVzaXMgPSA1MDA7CiAgICB0LnVkaWVyZXNpcyA9IDUwMDsKICAgIHQubm90ZXF1YWwgPSA1NDk7CiAgICB0Lmdjb21tYWFjY2VudCA9IDUwMDsKICAgIHQuZXRoID0gNTAwOwogICAgdC56Y2Fyb24gPSAzODk7CiAgICB0Lm5jb21tYWFjY2VudCA9IDUwMDsKICAgIHQub25lc3VwZXJpb3IgPSAzMDA7CiAgICB0LmltYWNyb24gPSAyNzg7CiAgICB0LkV1cm8gPSA1MDA7CiAgfSk7CiAgdC5aYXBmRGluZ2JhdHMgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogICAgdC5zcGFjZSA9IDI3ODsKICAgIHQuYTEgPSA5NzQ7CiAgICB0LmEyID0gOTYxOwogICAgdC5hMjAyID0gOTc0OwogICAgdC5hMyA9IDk4MDsKICAgIHQuYTQgPSA3MTk7CiAgICB0LmE1ID0gNzg5OwogICAgdC5hMTE5ID0gNzkwOwogICAgdC5hMTE4ID0gNzkxOwogICAgdC5hMTE3ID0gNjkwOwogICAgdC5hMTEgPSA5NjA7CiAgICB0LmExMiA9IDkzOTsKICAgIHQuYTEzID0gNTQ5OwogICAgdC5hMTQgPSA4NTU7CiAgICB0LmExNSA9IDkxMTsKICAgIHQuYTE2ID0gOTMzOwogICAgdC5hMTA1ID0gOTExOwogICAgdC5hMTcgPSA5NDU7CiAgICB0LmExOCA9IDk3NDsKICAgIHQuYTE5ID0gNzU1OwogICAgdC5hMjAgPSA4NDY7CiAgICB0LmEyMSA9IDc2MjsKICAgIHQuYTIyID0gNzYxOwogICAgdC5hMjMgPSA1NzE7CiAgICB0LmEyNCA9IDY3NzsKICAgIHQuYTI1ID0gNzYzOwogICAgdC5hMjYgPSA3NjA7CiAgICB0LmEyNyA9IDc1OTsKICAgIHQuYTI4ID0gNzU0OwogICAgdC5hNiA9IDQ5NDsKICAgIHQuYTcgPSA1NTI7CiAgICB0LmE4ID0gNTM3OwogICAgdC5hOSA9IDU3NzsKICAgIHQuYTEwID0gNjkyOwogICAgdC5hMjkgPSA3ODY7CiAgICB0LmEzMCA9IDc4ODsKICAgIHQuYTMxID0gNzg4OwogICAgdC5hMzIgPSA3OTA7CiAgICB0LmEzMyA9IDc5MzsKICAgIHQuYTM0ID0gNzk0OwogICAgdC5hMzUgPSA4MTY7CiAgICB0LmEzNiA9IDgyMzsKICAgIHQuYTM3ID0gNzg5OwogICAgdC5hMzggPSA4NDE7CiAgICB0LmEzOSA9IDgyMzsKICAgIHQuYTQwID0gODMzOwogICAgdC5hNDEgPSA4MTY7CiAgICB0LmE0MiA9IDgzMTsKICAgIHQuYTQzID0gOTIzOwogICAgdC5hNDQgPSA3NDQ7CiAgICB0LmE0NSA9IDcyMzsKICAgIHQuYTQ2ID0gNzQ5OwogICAgdC5hNDcgPSA3OTA7CiAgICB0LmE0OCA9IDc5MjsKICAgIHQuYTQ5ID0gNjk1OwogICAgdC5hNTAgPSA3NzY7CiAgICB0LmE1MSA9IDc2ODsKICAgIHQuYTUyID0gNzkyOwogICAgdC5hNTMgPSA3NTk7CiAgICB0LmE1NCA9IDcwNzsKICAgIHQuYTU1ID0gNzA4OwogICAgdC5hNTYgPSA2ODI7CiAgICB0LmE1NyA9IDcwMTsKICAgIHQuYTU4ID0gODI2OwogICAgdC5hNTkgPSA4MTU7CiAgICB0LmE2MCA9IDc4OTsKICAgIHQuYTYxID0gNzg5OwogICAgdC5hNjIgPSA3MDc7CiAgICB0LmE2MyA9IDY4NzsKICAgIHQuYTY0ID0gNjk2OwogICAgdC5hNjUgPSA2ODk7CiAgICB0LmE2NiA9IDc4NjsKICAgIHQuYTY3ID0gNzg3OwogICAgdC5hNjggPSA3MTM7CiAgICB0LmE2OSA9IDc5MTsKICAgIHQuYTcwID0gNzg1OwogICAgdC5hNzEgPSA3OTE7CiAgICB0LmE3MiA9IDg3MzsKICAgIHQuYTczID0gNzYxOwogICAgdC5hNzQgPSA3NjI7CiAgICB0LmEyMDMgPSA3NjI7CiAgICB0LmE3NSA9IDc1OTsKICAgIHQuYTIwNCA9IDc1OTsKICAgIHQuYTc2ID0gODkyOwogICAgdC5hNzcgPSA4OTI7CiAgICB0LmE3OCA9IDc4ODsKICAgIHQuYTc5ID0gNzg0OwogICAgdC5hODEgPSA0Mzg7CiAgICB0LmE4MiA9IDEzODsKICAgIHQuYTgzID0gMjc3OwogICAgdC5hODQgPSA0MTU7CiAgICB0LmE5NyA9IDM5MjsKICAgIHQuYTk4ID0gMzkyOwogICAgdC5hOTkgPSA2Njg7CiAgICB0LmExMDAgPSA2Njg7CiAgICB0LmE4OSA9IDM5MDsKICAgIHQuYTkwID0gMzkwOwogICAgdC5hOTMgPSAzMTc7CiAgICB0LmE5NCA9IDMxNzsKICAgIHQuYTkxID0gMjc2OwogICAgdC5hOTIgPSAyNzY7CiAgICB0LmEyMDUgPSA1MDk7CiAgICB0LmE4NSA9IDUwOTsKICAgIHQuYTIwNiA9IDQxMDsKICAgIHQuYTg2ID0gNDEwOwogICAgdC5hODcgPSAyMzQ7CiAgICB0LmE4OCA9IDIzNDsKICAgIHQuYTk1ID0gMzM0OwogICAgdC5hOTYgPSAzMzQ7CiAgICB0LmExMDEgPSA3MzI7CiAgICB0LmExMDIgPSA1NDQ7CiAgICB0LmExMDMgPSA1NDQ7CiAgICB0LmExMDQgPSA5MTA7CiAgICB0LmExMDYgPSA2Njc7CiAgICB0LmExMDcgPSA3NjA7CiAgICB0LmExMDggPSA3NjA7CiAgICB0LmExMTIgPSA3NzY7CiAgICB0LmExMTEgPSA1OTU7CiAgICB0LmExMTAgPSA2OTQ7CiAgICB0LmExMDkgPSA2MjY7CiAgICB0LmExMjAgPSA3ODg7CiAgICB0LmExMjEgPSA3ODg7CiAgICB0LmExMjIgPSA3ODg7CiAgICB0LmExMjMgPSA3ODg7CiAgICB0LmExMjQgPSA3ODg7CiAgICB0LmExMjUgPSA3ODg7CiAgICB0LmExMjYgPSA3ODg7CiAgICB0LmExMjcgPSA3ODg7CiAgICB0LmExMjggPSA3ODg7CiAgICB0LmExMjkgPSA3ODg7CiAgICB0LmExMzAgPSA3ODg7CiAgICB0LmExMzEgPSA3ODg7CiAgICB0LmExMzIgPSA3ODg7CiAgICB0LmExMzMgPSA3ODg7CiAgICB0LmExMzQgPSA3ODg7CiAgICB0LmExMzUgPSA3ODg7CiAgICB0LmExMzYgPSA3ODg7CiAgICB0LmExMzcgPSA3ODg7CiAgICB0LmExMzggPSA3ODg7CiAgICB0LmExMzkgPSA3ODg7CiAgICB0LmExNDAgPSA3ODg7CiAgICB0LmExNDEgPSA3ODg7CiAgICB0LmExNDIgPSA3ODg7CiAgICB0LmExNDMgPSA3ODg7CiAgICB0LmExNDQgPSA3ODg7CiAgICB0LmExNDUgPSA3ODg7CiAgICB0LmExNDYgPSA3ODg7CiAgICB0LmExNDcgPSA3ODg7CiAgICB0LmExNDggPSA3ODg7CiAgICB0LmExNDkgPSA3ODg7CiAgICB0LmExNTAgPSA3ODg7CiAgICB0LmExNTEgPSA3ODg7CiAgICB0LmExNTIgPSA3ODg7CiAgICB0LmExNTMgPSA3ODg7CiAgICB0LmExNTQgPSA3ODg7CiAgICB0LmExNTUgPSA3ODg7CiAgICB0LmExNTYgPSA3ODg7CiAgICB0LmExNTcgPSA3ODg7CiAgICB0LmExNTggPSA3ODg7CiAgICB0LmExNTkgPSA3ODg7CiAgICB0LmExNjAgPSA4OTQ7CiAgICB0LmExNjEgPSA4Mzg7CiAgICB0LmExNjMgPSAxMDE2OwogICAgdC5hMTY0ID0gNDU4OwogICAgdC5hMTk2ID0gNzQ4OwogICAgdC5hMTY1ID0gOTI0OwogICAgdC5hMTkyID0gNzQ4OwogICAgdC5hMTY2ID0gOTE4OwogICAgdC5hMTY3ID0gOTI3OwogICAgdC5hMTY4ID0gOTI4OwogICAgdC5hMTY5ID0gOTI4OwogICAgdC5hMTcwID0gODM0OwogICAgdC5hMTcxID0gODczOwogICAgdC5hMTcyID0gODI4OwogICAgdC5hMTczID0gOTI0OwogICAgdC5hMTYyID0gOTI0OwogICAgdC5hMTc0ID0gOTE3OwogICAgdC5hMTc1ID0gOTMwOwogICAgdC5hMTc2ID0gOTMxOwogICAgdC5hMTc3ID0gNDYzOwogICAgdC5hMTc4ID0gODgzOwogICAgdC5hMTc5ID0gODM2OwogICAgdC5hMTkzID0gODM2OwogICAgdC5hMTgwID0gODY3OwogICAgdC5hMTk5ID0gODY3OwogICAgdC5hMTgxID0gNjk2OwogICAgdC5hMjAwID0gNjk2OwogICAgdC5hMTgyID0gODc0OwogICAgdC5hMjAxID0gODc0OwogICAgdC5hMTgzID0gNzYwOwogICAgdC5hMTg0ID0gOTQ2OwogICAgdC5hMTk3ID0gNzcxOwogICAgdC5hMTg1ID0gODY1OwogICAgdC5hMTk0ID0gNzcxOwogICAgdC5hMTk4ID0gODg4OwogICAgdC5hMTg2ID0gOTY3OwogICAgdC5hMTk1ID0gODg4OwogICAgdC5hMTg3ID0gODMxOwogICAgdC5hMTg4ID0gODczOwogICAgdC5hMTg5ID0gOTI3OwogICAgdC5hMTkwID0gOTcwOwogICAgdC5hMTkxID0gOTE4OwogIH0pOwp9KTsKZXhwb3J0cy5nZXRNZXRyaWNzID0gZ2V0TWV0cmljczsKY29uc3QgZ2V0Rm9udEJhc2ljTWV0cmljcyA9ICgwLCBfY29yZV91dGlscy5nZXRMb29rdXBUYWJsZUZhY3RvcnkpKGZ1bmN0aW9uICh0KSB7CiAgdC5Db3VyaWVyID0gewogICAgYXNjZW50OiA2MjksCiAgICBkZXNjZW50OiAtMTU3LAogICAgY2FwSGVpZ2h0OiA1NjIsCiAgICB4SGVpZ2h0OiAtNDI2CiAgfTsKICB0WyJDb3VyaWVyLUJvbGQiXSA9IHsKICAgIGFzY2VudDogNjI5LAogICAgZGVzY2VudDogLTE1NywKICAgIGNhcEhlaWdodDogNTYyLAogICAgeEhlaWdodDogNDM5CiAgfTsKICB0WyJDb3VyaWVyLU9ibGlxdWUiXSA9IHsKICAgIGFzY2VudDogNjI5LAogICAgZGVzY2VudDogLTE1NywKICAgIGNhcEhlaWdodDogNTYyLAogICAgeEhlaWdodDogNDI2CiAgfTsKICB0WyJDb3VyaWVyLUJvbGRPYmxpcXVlIl0gPSB7CiAgICBhc2NlbnQ6IDYyOSwKICAgIGRlc2NlbnQ6IC0xNTcsCiAgICBjYXBIZWlnaHQ6IDU2MiwKICAgIHhIZWlnaHQ6IDQyNgogIH07CiAgdC5IZWx2ZXRpY2EgPSB7CiAgICBhc2NlbnQ6IDcxOCwKICAgIGRlc2NlbnQ6IC0yMDcsCiAgICBjYXBIZWlnaHQ6IDcxOCwKICAgIHhIZWlnaHQ6IDUyMwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9IHsKICAgIGFzY2VudDogNzE4LAogICAgZGVzY2VudDogLTIwNywKICAgIGNhcEhlaWdodDogNzE4LAogICAgeEhlaWdodDogNTMyCiAgfTsKICB0WyJIZWx2ZXRpY2EtT2JsaXF1ZSJdID0gewogICAgYXNjZW50OiA3MTgsCiAgICBkZXNjZW50OiAtMjA3LAogICAgY2FwSGVpZ2h0OiA3MTgsCiAgICB4SGVpZ2h0OiA1MjMKICB9OwogIHRbIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJdID0gewogICAgYXNjZW50OiA3MTgsCiAgICBkZXNjZW50OiAtMjA3LAogICAgY2FwSGVpZ2h0OiA3MTgsCiAgICB4SGVpZ2h0OiA1MzIKICB9OwogIHRbIlRpbWVzLVJvbWFuIl0gPSB7CiAgICBhc2NlbnQ6IDY4MywKICAgIGRlc2NlbnQ6IC0yMTcsCiAgICBjYXBIZWlnaHQ6IDY2MiwKICAgIHhIZWlnaHQ6IDQ1MAogIH07CiAgdFsiVGltZXMtQm9sZCJdID0gewogICAgYXNjZW50OiA2ODMsCiAgICBkZXNjZW50OiAtMjE3LAogICAgY2FwSGVpZ2h0OiA2NzYsCiAgICB4SGVpZ2h0OiA0NjEKICB9OwogIHRbIlRpbWVzLUl0YWxpYyJdID0gewogICAgYXNjZW50OiA2ODMsCiAgICBkZXNjZW50OiAtMjE3LAogICAgY2FwSGVpZ2h0OiA2NTMsCiAgICB4SGVpZ2h0OiA0NDEKICB9OwogIHRbIlRpbWVzLUJvbGRJdGFsaWMiXSA9IHsKICAgIGFzY2VudDogNjgzLAogICAgZGVzY2VudDogLTIxNywKICAgIGNhcEhlaWdodDogNjY5LAogICAgeEhlaWdodDogNDYyCiAgfTsKICB0LlN5bWJvbCA9IHsKICAgIGFzY2VudDogTWF0aC5OYU4sCiAgICBkZXNjZW50OiBNYXRoLk5hTiwKICAgIGNhcEhlaWdodDogTWF0aC5OYU4sCiAgICB4SGVpZ2h0OiBNYXRoLk5hTgogIH07CiAgdC5aYXBmRGluZ2JhdHMgPSB7CiAgICBhc2NlbnQ6IE1hdGguTmFOLAogICAgZGVzY2VudDogTWF0aC5OYU4sCiAgICBjYXBIZWlnaHQ6IE1hdGguTmFOLAogICAgeEhlaWdodDogTWF0aC5OYU4KICB9Owp9KTsKZXhwb3J0cy5nZXRGb250QmFzaWNNZXRyaWNzID0gZ2V0Rm9udEJhc2ljTWV0cmljczsKCi8qKiovIH0pLAovKiA0NiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkdseWZUYWJsZSA9IHZvaWQgMDsKY29uc3QgT05fQ1VSVkVfUE9JTlQgPSAxIDw8IDA7CmNvbnN0IFhfU0hPUlRfVkVDVE9SID0gMSA8PCAxOwpjb25zdCBZX1NIT1JUX1ZFQ1RPUiA9IDEgPDwgMjsKY29uc3QgUkVQRUFUX0ZMQUcgPSAxIDw8IDM7CmNvbnN0IFhfSVNfU0FNRV9PUl9QT1NJVElWRV9YX1NIT1JUX1ZFQ1RPUiA9IDEgPDwgNDsKY29uc3QgWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SID0gMSA8PCA1Owpjb25zdCBPVkVSTEFQX1NJTVBMRSA9IDEgPDwgNjsKY29uc3QgQVJHXzFfQU5EXzJfQVJFX1dPUkRTID0gMSA8PCAwOwpjb25zdCBBUkdTX0FSRV9YWV9WQUxVRVMgPSAxIDw8IDE7CmNvbnN0IFdFX0hBVkVfQV9TQ0FMRSA9IDEgPDwgMzsKY29uc3QgTU9SRV9DT01QT05FTlRTID0gMSA8PCA1Owpjb25zdCBXRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUgPSAxIDw8IDY7CmNvbnN0IFdFX0hBVkVfQV9UV09fQllfVFdPID0gMSA8PCA3Owpjb25zdCBXRV9IQVZFX0lOU1RSVUNUSU9OUyA9IDEgPDwgODsKY2xhc3MgR2x5ZlRhYmxlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICBnbHlmVGFibGUsCiAgICBpc0dseXBoTG9jYXRpb25zTG9uZywKICAgIGxvY2FUYWJsZSwKICAgIG51bUdseXBocwogIH0pIHsKICAgIHRoaXMuZ2x5cGhzID0gW107CiAgICBjb25zdCBsb2NhID0gbmV3IERhdGFWaWV3KGxvY2FUYWJsZS5idWZmZXIsIGxvY2FUYWJsZS5ieXRlT2Zmc2V0LCBsb2NhVGFibGUuYnl0ZUxlbmd0aCk7CiAgICBjb25zdCBnbHlmID0gbmV3IERhdGFWaWV3KGdseWZUYWJsZS5idWZmZXIsIGdseWZUYWJsZS5ieXRlT2Zmc2V0LCBnbHlmVGFibGUuYnl0ZUxlbmd0aCk7CiAgICBjb25zdCBvZmZzZXRTaXplID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyA0IDogMjsKICAgIGxldCBwcmV2ID0gaXNHbHlwaExvY2F0aW9uc0xvbmcgPyBsb2NhLmdldFVpbnQzMigwKSA6IDIgKiBsb2NhLmdldFVpbnQxNigwKTsKICAgIGxldCBwb3MgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1HbHlwaHM7IGkrKykgewogICAgICBwb3MgKz0gb2Zmc2V0U2l6ZTsKICAgICAgY29uc3QgbmV4dCA9IGlzR2x5cGhMb2NhdGlvbnNMb25nID8gbG9jYS5nZXRVaW50MzIocG9zKSA6IDIgKiBsb2NhLmdldFVpbnQxNihwb3MpOwogICAgICBpZiAobmV4dCA9PT0gcHJldikgewogICAgICAgIHRoaXMuZ2x5cGhzLnB1c2gobmV3IEdseXBoKHt9KSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgZ2x5cGggPSBHbHlwaC5wYXJzZShwcmV2LCBnbHlmKTsKICAgICAgdGhpcy5nbHlwaHMucHVzaChnbHlwaCk7CiAgICAgIHByZXYgPSBuZXh0OwogICAgfQogIH0KICBnZXRTaXplKCkgewogICAgcmV0dXJuIHRoaXMuZ2x5cGhzLnJlZHVjZSgoYSwgZykgPT4gewogICAgICBjb25zdCBzaXplID0gZy5nZXRTaXplKCk7CiAgICAgIHJldHVybiBhICsgKHNpemUgKyAzICYgfjMpOwogICAgfSwgMCk7CiAgfQogIHdyaXRlKCkgewogICAgY29uc3QgdG90YWxTaXplID0gdGhpcy5nZXRTaXplKCk7CiAgICBjb25zdCBnbHlmVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpOwogICAgY29uc3QgaXNMb2NhdGlvbkxvbmcgPSB0b3RhbFNpemUgPiAweDFmZmZlOwogICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IGlzTG9jYXRpb25Mb25nID8gNCA6IDI7CiAgICBjb25zdCBsb2NhVGFibGUgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCh0aGlzLmdseXBocy5sZW5ndGggKyAxKSAqIG9mZnNldFNpemUpKTsKICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICBsb2NhVGFibGUuc2V0VWludDMyKDAsIDApOwogICAgfSBlbHNlIHsKICAgICAgbG9jYVRhYmxlLnNldFVpbnQxNigwLCAwKTsKICAgIH0KICAgIGxldCBwb3MgPSAwOwogICAgbGV0IGxvY2FJbmRleCA9IDA7CiAgICBmb3IgKGNvbnN0IGdseXBoIG9mIHRoaXMuZ2x5cGhzKSB7CiAgICAgIHBvcyArPSBnbHlwaC53cml0ZShwb3MsIGdseWZUYWJsZSk7CiAgICAgIHBvcyA9IHBvcyArIDMgJiB+MzsKICAgICAgbG9jYUluZGV4ICs9IG9mZnNldFNpemU7CiAgICAgIGlmIChpc0xvY2F0aW9uTG9uZykgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MzIobG9jYUluZGV4LCBwb3MpOwogICAgICB9IGVsc2UgewogICAgICAgIGxvY2FUYWJsZS5zZXRVaW50MTYobG9jYUluZGV4LCBwb3MgPj4gMSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGlzTG9jYXRpb25Mb25nLAogICAgICBsb2NhOiBuZXcgVWludDhBcnJheShsb2NhVGFibGUuYnVmZmVyKSwKICAgICAgZ2x5ZjogbmV3IFVpbnQ4QXJyYXkoZ2x5ZlRhYmxlLmJ1ZmZlcikKICAgIH07CiAgfQogIHNjYWxlKGZhY3RvcnMpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5nbHlwaHNbaV0uc2NhbGUoZmFjdG9yc1tpXSk7CiAgICB9CiAgfQp9CmV4cG9ydHMuR2x5ZlRhYmxlID0gR2x5ZlRhYmxlOwpjbGFzcyBHbHlwaCB7CiAgY29uc3RydWN0b3IoewogICAgaGVhZGVyID0gbnVsbCwKICAgIHNpbXBsZSA9IG51bGwsCiAgICBjb21wb3NpdGVzID0gbnVsbAogIH0pIHsKICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOwogICAgdGhpcy5zaW1wbGUgPSBzaW1wbGU7CiAgICB0aGlzLmNvbXBvc2l0ZXMgPSBjb21wb3NpdGVzOwogIH0KICBzdGF0aWMgcGFyc2UocG9zLCBnbHlmKSB7CiAgICBjb25zdCBbcmVhZCwgaGVhZGVyXSA9IEdseXBoSGVhZGVyLnBhcnNlKHBvcywgZ2x5Zik7CiAgICBwb3MgKz0gcmVhZDsKICAgIGlmIChoZWFkZXIubnVtYmVyT2ZDb250b3VycyA8IDApIHsKICAgICAgY29uc3QgY29tcG9zaXRlcyA9IFtdOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGNvbnN0IFtuLCBjb21wb3NpdGVdID0gQ29tcG9zaXRlR2x5cGgucGFyc2UocG9zLCBnbHlmKTsKICAgICAgICBwb3MgKz0gbjsKICAgICAgICBjb21wb3NpdGVzLnB1c2goY29tcG9zaXRlKTsKICAgICAgICBpZiAoIShjb21wb3NpdGUuZmxhZ3MgJiBNT1JFX0NPTVBPTkVOVFMpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBHbHlwaCh7CiAgICAgICAgaGVhZGVyLAogICAgICAgIGNvbXBvc2l0ZXMKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBzaW1wbGUgPSBTaW1wbGVHbHlwaC5wYXJzZShwb3MsIGdseWYsIGhlYWRlci5udW1iZXJPZkNvbnRvdXJzKTsKICAgIHJldHVybiBuZXcgR2x5cGgoewogICAgICBoZWFkZXIsCiAgICAgIHNpbXBsZQogICAgfSk7CiAgfQogIGdldFNpemUoKSB7CiAgICBpZiAoIXRoaXMuaGVhZGVyKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2ltcGxlID8gdGhpcy5zaW1wbGUuZ2V0U2l6ZSgpIDogdGhpcy5jb21wb3NpdGVzLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZ2V0U2l6ZSgpLCAwKTsKICAgIHJldHVybiB0aGlzLmhlYWRlci5nZXRTaXplKCkgKyBzaXplOwogIH0KICB3cml0ZShwb3MsIGJ1ZikgewogICAgaWYgKCF0aGlzLmhlYWRlcikgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBwb3MgKz0gdGhpcy5oZWFkZXIud3JpdGUocG9zLCBidWYpOwogICAgaWYgKHRoaXMuc2ltcGxlKSB7CiAgICAgIHBvcyArPSB0aGlzLnNpbXBsZS53cml0ZShwb3MsIGJ1Zik7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGNvbnN0IGNvbXBvc2l0ZSBvZiB0aGlzLmNvbXBvc2l0ZXMpIHsKICAgICAgICBwb3MgKz0gY29tcG9zaXRlLndyaXRlKHBvcywgYnVmKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvcyAtIHNwb3M7CiAgfQogIHNjYWxlKGZhY3RvcikgewogICAgaWYgKCF0aGlzLmhlYWRlcikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCB4TWlkZGxlID0gKHRoaXMuaGVhZGVyLnhNaW4gKyB0aGlzLmhlYWRlci54TWF4KSAvIDI7CiAgICB0aGlzLmhlYWRlci5zY2FsZSh4TWlkZGxlLCBmYWN0b3IpOwogICAgaWYgKHRoaXMuc2ltcGxlKSB7CiAgICAgIHRoaXMuc2ltcGxlLnNjYWxlKHhNaWRkbGUsIGZhY3Rvcik7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGNvbnN0IGNvbXBvc2l0ZSBvZiB0aGlzLmNvbXBvc2l0ZXMpIHsKICAgICAgICBjb21wb3NpdGUuc2NhbGUoeE1pZGRsZSwgZmFjdG9yKTsKICAgICAgfQogICAgfQogIH0KfQpjbGFzcyBHbHlwaEhlYWRlciB7CiAgY29uc3RydWN0b3IoewogICAgbnVtYmVyT2ZDb250b3VycywKICAgIHhNaW4sCiAgICB5TWluLAogICAgeE1heCwKICAgIHlNYXgKICB9KSB7CiAgICB0aGlzLm51bWJlck9mQ29udG91cnMgPSBudW1iZXJPZkNvbnRvdXJzOwogICAgdGhpcy54TWluID0geE1pbjsKICAgIHRoaXMueU1pbiA9IHlNaW47CiAgICB0aGlzLnhNYXggPSB4TWF4OwogICAgdGhpcy55TWF4ID0geU1heDsKICB9CiAgc3RhdGljIHBhcnNlKHBvcywgZ2x5ZikgewogICAgcmV0dXJuIFsxMCwgbmV3IEdseXBoSGVhZGVyKHsKICAgICAgbnVtYmVyT2ZDb250b3VyczogZ2x5Zi5nZXRJbnQxNihwb3MpLAogICAgICB4TWluOiBnbHlmLmdldEludDE2KHBvcyArIDIpLAogICAgICB5TWluOiBnbHlmLmdldEludDE2KHBvcyArIDQpLAogICAgICB4TWF4OiBnbHlmLmdldEludDE2KHBvcyArIDYpLAogICAgICB5TWF4OiBnbHlmLmdldEludDE2KHBvcyArIDgpCiAgICB9KV07CiAgfQogIGdldFNpemUoKSB7CiAgICByZXR1cm4gMTA7CiAgfQogIHdyaXRlKHBvcywgYnVmKSB7CiAgICBidWYuc2V0SW50MTYocG9zLCB0aGlzLm51bWJlck9mQ29udG91cnMpOwogICAgYnVmLnNldEludDE2KHBvcyArIDIsIHRoaXMueE1pbik7CiAgICBidWYuc2V0SW50MTYocG9zICsgNCwgdGhpcy55TWluKTsKICAgIGJ1Zi5zZXRJbnQxNihwb3MgKyA2LCB0aGlzLnhNYXgpOwogICAgYnVmLnNldEludDE2KHBvcyArIDgsIHRoaXMueU1heCk7CiAgICByZXR1cm4gMTA7CiAgfQogIHNjYWxlKHgsIGZhY3RvcikgewogICAgdGhpcy54TWluID0gTWF0aC5yb3VuZCh4ICsgKHRoaXMueE1pbiAtIHgpICogZmFjdG9yKTsKICAgIHRoaXMueE1heCA9IE1hdGgucm91bmQoeCArICh0aGlzLnhNYXggLSB4KSAqIGZhY3Rvcik7CiAgfQp9CmNsYXNzIENvbnRvdXIgewogIGNvbnN0cnVjdG9yKHsKICAgIGZsYWdzLAogICAgeENvb3JkaW5hdGVzLAogICAgeUNvb3JkaW5hdGVzCiAgfSkgewogICAgdGhpcy54Q29vcmRpbmF0ZXMgPSB4Q29vcmRpbmF0ZXM7CiAgICB0aGlzLnlDb29yZGluYXRlcyA9IHlDb29yZGluYXRlczsKICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICB9Cn0KY2xhc3MgU2ltcGxlR2x5cGggewogIGNvbnN0cnVjdG9yKHsKICAgIGNvbnRvdXJzLAogICAgaW5zdHJ1Y3Rpb25zCiAgfSkgewogICAgdGhpcy5jb250b3VycyA9IGNvbnRvdXJzOwogICAgdGhpcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7CiAgfQogIHN0YXRpYyBwYXJzZShwb3MsIGdseWYsIG51bWJlck9mQ29udG91cnMpIHsKICAgIGNvbnN0IGVuZFB0c09mQ29udG91cnMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZDb250b3VyczsgaSsrKSB7CiAgICAgIGNvbnN0IGVuZFB0ID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgICAgcG9zICs9IDI7CiAgICAgIGVuZFB0c09mQ29udG91cnMucHVzaChlbmRQdCk7CiAgICB9CiAgICBjb25zdCBudW1iZXJPZlB0ID0gZW5kUHRzT2ZDb250b3Vyc1tudW1iZXJPZkNvbnRvdXJzIC0gMV0gKyAxOwogICAgY29uc3QgaW5zdHJ1Y3Rpb25MZW5ndGggPSBnbHlmLmdldFVpbnQxNihwb3MpOwogICAgcG9zICs9IDI7CiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBuZXcgVWludDhBcnJheShnbHlmKS5zbGljZShwb3MsIHBvcyArIGluc3RydWN0aW9uTGVuZ3RoKTsKICAgIHBvcyArPSBpbnN0cnVjdGlvbkxlbmd0aDsKICAgIGNvbnN0IGZsYWdzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mUHQ7IHBvcysrLCBpKyspIHsKICAgICAgbGV0IGZsYWcgPSBnbHlmLmdldFVpbnQ4KHBvcyk7CiAgICAgIGZsYWdzLnB1c2goZmxhZyk7CiAgICAgIGlmIChmbGFnICYgUkVQRUFUX0ZMQUcpIHsKICAgICAgICBjb25zdCBjb3VudCA9IGdseWYuZ2V0VWludDgoKytwb3MpOwogICAgICAgIGZsYWcgXj0gUkVQRUFUX0ZMQUc7CiAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBjb3VudDsgbSsrKSB7CiAgICAgICAgICBmbGFncy5wdXNoKGZsYWcpOwogICAgICAgIH0KICAgICAgICBpICs9IGNvdW50OwogICAgICB9CiAgICB9CiAgICBjb25zdCBhbGxYQ29vcmRpbmF0ZXMgPSBbXTsKICAgIGxldCB4Q29vcmRpbmF0ZXMgPSBbXTsKICAgIGxldCB5Q29vcmRpbmF0ZXMgPSBbXTsKICAgIGxldCBwb2ludEZsYWdzID0gW107CiAgICBjb25zdCBjb250b3VycyA9IFtdOwogICAgbGV0IGVuZFB0c09mQ29udG91cnNJbmRleCA9IDA7CiAgICBsZXQgbGFzdENvb3JkaW5hdGUgPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZlB0OyBpKyspIHsKICAgICAgY29uc3QgZmxhZyA9IGZsYWdzW2ldOwogICAgICBpZiAoZmxhZyAmIFhfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgY29uc3QgeCA9IGdseWYuZ2V0VWludDgocG9zKyspOwogICAgICAgIGxhc3RDb29yZGluYXRlICs9IGZsYWcgJiBYX0lTX1NBTUVfT1JfUE9TSVRJVkVfWF9TSE9SVF9WRUNUT1IgPyB4IDogLXg7CiAgICAgICAgeENvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9IGVsc2UgaWYgKGZsYWcgJiBYX0lTX1NBTUVfT1JfUE9TSVRJVkVfWF9TSE9SVF9WRUNUT1IpIHsKICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGFzdENvb3JkaW5hdGUgKz0gZ2x5Zi5nZXRJbnQxNihwb3MpOwogICAgICAgIHBvcyArPSAyOwogICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfQogICAgICBpZiAoZW5kUHRzT2ZDb250b3Vyc1tlbmRQdHNPZkNvbnRvdXJzSW5kZXhdID09PSBpKSB7CiAgICAgICAgZW5kUHRzT2ZDb250b3Vyc0luZGV4Kys7CiAgICAgICAgYWxsWENvb3JkaW5hdGVzLnB1c2goeENvb3JkaW5hdGVzKTsKICAgICAgICB4Q29vcmRpbmF0ZXMgPSBbXTsKICAgICAgfQogICAgfQogICAgbGFzdENvb3JkaW5hdGUgPSAwOwogICAgZW5kUHRzT2ZDb250b3Vyc0luZGV4ID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZQdDsgaSsrKSB7CiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnc1tpXTsKICAgICAgaWYgKGZsYWcgJiBZX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIGNvbnN0IHkgPSBnbHlmLmdldFVpbnQ4KHBvcysrKTsKICAgICAgICBsYXN0Q29vcmRpbmF0ZSArPSBmbGFnICYgWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SID8geSA6IC15OwogICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGxhc3RDb29yZGluYXRlKTsKICAgICAgfSBlbHNlIGlmIChmbGFnICYgWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SKSB7CiAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2gobGFzdENvb3JkaW5hdGUpOwogICAgICB9IGVsc2UgewogICAgICAgIGxhc3RDb29yZGluYXRlICs9IGdseWYuZ2V0SW50MTYocG9zKTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChsYXN0Q29vcmRpbmF0ZSk7CiAgICAgIH0KICAgICAgcG9pbnRGbGFncy5wdXNoKGZsYWcgJiBPTl9DVVJWRV9QT0lOVCB8IGZsYWcgJiBPVkVSTEFQX1NJTVBMRSk7CiAgICAgIGlmIChlbmRQdHNPZkNvbnRvdXJzW2VuZFB0c09mQ29udG91cnNJbmRleF0gPT09IGkpIHsKICAgICAgICB4Q29vcmRpbmF0ZXMgPSBhbGxYQ29vcmRpbmF0ZXNbZW5kUHRzT2ZDb250b3Vyc0luZGV4XTsKICAgICAgICBlbmRQdHNPZkNvbnRvdXJzSW5kZXgrKzsKICAgICAgICBjb250b3Vycy5wdXNoKG5ldyBDb250b3VyKHsKICAgICAgICAgIGZsYWdzOiBwb2ludEZsYWdzLAogICAgICAgICAgeENvb3JkaW5hdGVzLAogICAgICAgICAgeUNvb3JkaW5hdGVzCiAgICAgICAgfSkpOwogICAgICAgIHlDb29yZGluYXRlcyA9IFtdOwogICAgICAgIHBvaW50RmxhZ3MgPSBbXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTaW1wbGVHbHlwaCh7CiAgICAgIGNvbnRvdXJzLAogICAgICBpbnN0cnVjdGlvbnMKICAgIH0pOwogIH0KICBnZXRTaXplKCkgewogICAgbGV0IHNpemUgPSB0aGlzLmNvbnRvdXJzLmxlbmd0aCAqIDIgKyAyICsgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgbGV0IGxhc3RYID0gMDsKICAgIGxldCBsYXN0WSA9IDA7CiAgICBmb3IgKGNvbnN0IGNvbnRvdXIgb2YgdGhpcy5jb250b3VycykgewogICAgICBzaXplICs9IGNvbnRvdXIuZmxhZ3MubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb250b3VyLnhDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgeCA9IGNvbnRvdXIueENvb3JkaW5hdGVzW2ldOwogICAgICAgIGNvbnN0IHkgPSBjb250b3VyLnlDb29yZGluYXRlc1tpXTsKICAgICAgICBsZXQgYWJzID0gTWF0aC5hYnMoeCAtIGxhc3RYKTsKICAgICAgICBpZiAoYWJzID4gMjU1KSB7CiAgICAgICAgICBzaXplICs9IDI7CiAgICAgICAgfSBlbHNlIGlmIChhYnMgPiAwKSB7CiAgICAgICAgICBzaXplICs9IDE7CiAgICAgICAgfQogICAgICAgIGxhc3RYID0geDsKICAgICAgICBhYnMgPSBNYXRoLmFicyh5IC0gbGFzdFkpOwogICAgICAgIGlmIChhYnMgPiAyNTUpIHsKICAgICAgICAgIHNpemUgKz0gMjsKICAgICAgICB9IGVsc2UgaWYgKGFicyA+IDApIHsKICAgICAgICAgIHNpemUgKz0gMTsKICAgICAgICB9CiAgICAgICAgbGFzdFkgPSB5OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgd3JpdGUocG9zLCBidWYpIHsKICAgIGNvbnN0IHNwb3MgPSBwb3M7CiAgICBjb25zdCB4Q29vcmRpbmF0ZXMgPSBbXTsKICAgIGNvbnN0IHlDb29yZGluYXRlcyA9IFtdOwogICAgY29uc3QgZmxhZ3MgPSBbXTsKICAgIGxldCBsYXN0WCA9IDA7CiAgICBsZXQgbGFzdFkgPSAwOwogICAgZm9yIChjb25zdCBjb250b3VyIG9mIHRoaXMuY29udG91cnMpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gY29udG91ci54Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGxldCBmbGFnID0gY29udG91ci5mbGFnc1tpXTsKICAgICAgICBjb25zdCB4ID0gY29udG91ci54Q29vcmRpbmF0ZXNbaV07CiAgICAgICAgbGV0IGRlbHRhID0geCAtIGxhc3RYOwogICAgICAgIGlmIChkZWx0YSA9PT0gMCkgewogICAgICAgICAgZmxhZyB8PSBYX0lTX1NBTUVfT1JfUE9TSVRJVkVfWF9TSE9SVF9WRUNUT1I7CiAgICAgICAgICB4Q29vcmRpbmF0ZXMucHVzaCgwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnMoZGVsdGEpOwogICAgICAgICAgaWYgKGFicyA8PSAyNTUpIHsKICAgICAgICAgICAgZmxhZyB8PSBkZWx0YSA+PSAwID8gWF9TSE9SVF9WRUNUT1IgfCBYX0lTX1NBTUVfT1JfUE9TSVRJVkVfWF9TSE9SVF9WRUNUT1IgOiBYX1NIT1JUX1ZFQ1RPUjsKICAgICAgICAgICAgeENvb3JkaW5hdGVzLnB1c2goYWJzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHhDb29yZGluYXRlcy5wdXNoKGRlbHRhKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGFzdFggPSB4OwogICAgICAgIGNvbnN0IHkgPSBjb250b3VyLnlDb29yZGluYXRlc1tpXTsKICAgICAgICBkZWx0YSA9IHkgLSBsYXN0WTsKICAgICAgICBpZiAoZGVsdGEgPT09IDApIHsKICAgICAgICAgIGZsYWcgfD0gWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SOwogICAgICAgICAgeUNvb3JkaW5hdGVzLnB1c2goMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGFicyA9IE1hdGguYWJzKGRlbHRhKTsKICAgICAgICAgIGlmIChhYnMgPD0gMjU1KSB7CiAgICAgICAgICAgIGZsYWcgfD0gZGVsdGEgPj0gMCA/IFlfU0hPUlRfVkVDVE9SIHwgWV9JU19TQU1FX09SX1BPU0lUSVZFX1lfU0hPUlRfVkVDVE9SIDogWV9TSE9SVF9WRUNUT1I7CiAgICAgICAgICAgIHlDb29yZGluYXRlcy5wdXNoKGFicyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB5Q29vcmRpbmF0ZXMucHVzaChkZWx0YSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhc3RZID0geTsKICAgICAgICBmbGFncy5wdXNoKGZsYWcpOwogICAgICB9CiAgICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB4Q29vcmRpbmF0ZXMubGVuZ3RoIC0gMSk7CiAgICAgIHBvcyArPSAyOwogICAgfQogICAgYnVmLnNldFVpbnQxNihwb3MsIHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCk7CiAgICBwb3MgKz0gMjsKICAgIGlmICh0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpIHsKICAgICAgbmV3IFVpbnQ4QXJyYXkoYnVmLmJ1ZmZlciwgMCwgYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKS5zZXQodGhpcy5pbnN0cnVjdGlvbnMsIHBvcyk7CiAgICAgIHBvcyArPSB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGg7CiAgICB9CiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgZmxhZ3MpIHsKICAgICAgYnVmLnNldFVpbnQ4KHBvcysrLCBmbGFnKTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHhDb29yZGluYXRlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IHggPSB4Q29vcmRpbmF0ZXNbaV07CiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnc1tpXTsKICAgICAgaWYgKGZsYWcgJiBYX1NIT1JUX1ZFQ1RPUikgewogICAgICAgIGJ1Zi5zZXRVaW50OChwb3MrKywgeCk7CiAgICAgIH0gZWxzZSBpZiAoIShmbGFnICYgWF9JU19TQU1FX09SX1BPU0lUSVZFX1hfU0hPUlRfVkVDVE9SKSkgewogICAgICAgIGJ1Zi5zZXRJbnQxNihwb3MsIHgpOwogICAgICAgIHBvcyArPSAyOwogICAgICB9CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB5Q29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB5ID0geUNvb3JkaW5hdGVzW2ldOwogICAgICBjb25zdCBmbGFnID0gZmxhZ3NbaV07CiAgICAgIGlmIChmbGFnICYgWV9TSE9SVF9WRUNUT1IpIHsKICAgICAgICBidWYuc2V0VWludDgocG9zKyssIHkpOwogICAgICB9IGVsc2UgaWYgKCEoZmxhZyAmIFlfSVNfU0FNRV9PUl9QT1NJVElWRV9ZX1NIT1JUX1ZFQ1RPUikpIHsKICAgICAgICBidWYuc2V0SW50MTYocG9zLCB5KTsKICAgICAgICBwb3MgKz0gMjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBvcyAtIHNwb3M7CiAgfQogIHNjYWxlKHgsIGZhY3RvcikgewogICAgZm9yIChjb25zdCBjb250b3VyIG9mIHRoaXMuY29udG91cnMpIHsKICAgICAgaWYgKGNvbnRvdXIueENvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGNvbnRvdXIueENvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb250b3VyLnhDb29yZGluYXRlc1tpXSA9IE1hdGgucm91bmQoeCArIChjb250b3VyLnhDb29yZGluYXRlc1tpXSAtIHgpICogZmFjdG9yKTsKICAgICAgfQogICAgfQogIH0KfQpjbGFzcyBDb21wb3NpdGVHbHlwaCB7CiAgY29uc3RydWN0b3IoewogICAgZmxhZ3MsCiAgICBnbHlwaEluZGV4LAogICAgYXJndW1lbnQxLAogICAgYXJndW1lbnQyLAogICAgdHJhbnNmLAogICAgaW5zdHJ1Y3Rpb25zCiAgfSkgewogICAgdGhpcy5mbGFncyA9IGZsYWdzOwogICAgdGhpcy5nbHlwaEluZGV4ID0gZ2x5cGhJbmRleDsKICAgIHRoaXMuYXJndW1lbnQxID0gYXJndW1lbnQxOwogICAgdGhpcy5hcmd1bWVudDIgPSBhcmd1bWVudDI7CiAgICB0aGlzLnRyYW5zZiA9IHRyYW5zZjsKICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOwogIH0KICBzdGF0aWMgcGFyc2UocG9zLCBnbHlmKSB7CiAgICBjb25zdCBzcG9zID0gcG9zOwogICAgY29uc3QgdHJhbnNmID0gW107CiAgICBsZXQgZmxhZ3MgPSBnbHlmLmdldFVpbnQxNihwb3MpOwogICAgY29uc3QgZ2x5cGhJbmRleCA9IGdseWYuZ2V0VWludDE2KHBvcyArIDIpOwogICAgcG9zICs9IDQ7CiAgICBsZXQgYXJndW1lbnQxLCBhcmd1bWVudDI7CiAgICBpZiAoZmxhZ3MgJiBBUkdfMV9BTkRfMl9BUkVfV09SRFMpIHsKICAgICAgaWYgKGZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTKSB7CiAgICAgICAgYXJndW1lbnQxID0gZ2x5Zi5nZXRJbnQxNihwb3MpOwogICAgICAgIGFyZ3VtZW50MiA9IGdseWYuZ2V0SW50MTYocG9zICsgMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXJndW1lbnQxID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgICAgICBhcmd1bWVudDIgPSBnbHlmLmdldFVpbnQxNihwb3MgKyAyKTsKICAgICAgfQogICAgICBwb3MgKz0gNDsKICAgICAgZmxhZ3MgXj0gQVJHXzFfQU5EXzJfQVJFX1dPUkRTOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTKSB7CiAgICAgICAgYXJndW1lbnQxID0gZ2x5Zi5nZXRJbnQ4KHBvcyk7CiAgICAgICAgYXJndW1lbnQyID0gZ2x5Zi5nZXRJbnQ4KHBvcyArIDEpOwogICAgICB9IGVsc2UgewogICAgICAgIGFyZ3VtZW50MSA9IGdseWYuZ2V0VWludDgocG9zKTsKICAgICAgICBhcmd1bWVudDIgPSBnbHlmLmdldFVpbnQ4KHBvcyArIDEpOwogICAgICB9CiAgICAgIHBvcyArPSAyOwogICAgfQogICAgaWYgKGZsYWdzICYgV0VfSEFWRV9BX1NDQUxFKSB7CiAgICAgIHRyYW5zZi5wdXNoKGdseWYuZ2V0VWludDE2KHBvcykpOwogICAgICBwb3MgKz0gMjsKICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBXRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUpIHsKICAgICAgdHJhbnNmLnB1c2goZ2x5Zi5nZXRVaW50MTYocG9zKSwgZ2x5Zi5nZXRVaW50MTYocG9zICsgMikpOwogICAgICBwb3MgKz0gNDsKICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBXRV9IQVZFX0FfVFdPX0JZX1RXTykgewogICAgICB0cmFuc2YucHVzaChnbHlmLmdldFVpbnQxNihwb3MpLCBnbHlmLmdldFVpbnQxNihwb3MgKyAyKSwgZ2x5Zi5nZXRVaW50MTYocG9zICsgNCksIGdseWYuZ2V0VWludDE2KHBvcyArIDYpKTsKICAgICAgcG9zICs9IDg7CiAgICB9CiAgICBsZXQgaW5zdHJ1Y3Rpb25zID0gbnVsbDsKICAgIGlmIChmbGFncyAmIFdFX0hBVkVfSU5TVFJVQ1RJT05TKSB7CiAgICAgIGNvbnN0IGluc3RydWN0aW9uTGVuZ3RoID0gZ2x5Zi5nZXRVaW50MTYocG9zKTsKICAgICAgcG9zICs9IDI7CiAgICAgIGluc3RydWN0aW9ucyA9IG5ldyBVaW50OEFycmF5KGdseWYpLnNsaWNlKHBvcywgcG9zICsgaW5zdHJ1Y3Rpb25MZW5ndGgpOwogICAgICBwb3MgKz0gaW5zdHJ1Y3Rpb25MZW5ndGg7CiAgICB9CiAgICByZXR1cm4gW3BvcyAtIHNwb3MsIG5ldyBDb21wb3NpdGVHbHlwaCh7CiAgICAgIGZsYWdzLAogICAgICBnbHlwaEluZGV4LAogICAgICBhcmd1bWVudDEsCiAgICAgIGFyZ3VtZW50MiwKICAgICAgdHJhbnNmLAogICAgICBpbnN0cnVjdGlvbnMKICAgIH0pXTsKICB9CiAgZ2V0U2l6ZSgpIHsKICAgIGxldCBzaXplID0gMiArIDIgKyB0aGlzLnRyYW5zZi5sZW5ndGggKiAyOwogICAgaWYgKHRoaXMuZmxhZ3MgJiBXRV9IQVZFX0lOU1RSVUNUSU9OUykgewogICAgICBzaXplICs9IDIgKyB0aGlzLmluc3RydWN0aW9ucy5sZW5ndGg7CiAgICB9CiAgICBzaXplICs9IDI7CiAgICBpZiAodGhpcy5mbGFncyAmIDIpIHsKICAgICAgaWYgKCEodGhpcy5hcmd1bWVudDEgPj0gLTEyOCAmJiB0aGlzLmFyZ3VtZW50MSA8PSAxMjcgJiYgdGhpcy5hcmd1bWVudDIgPj0gLTEyOCAmJiB0aGlzLmFyZ3VtZW50MiA8PSAxMjcpKSB7CiAgICAgICAgc2l6ZSArPSAyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAwICYmIHRoaXMuYXJndW1lbnQxIDw9IDI1NSAmJiB0aGlzLmFyZ3VtZW50MiA+PSAwICYmIHRoaXMuYXJndW1lbnQyIDw9IDI1NSkpIHsKICAgICAgICBzaXplICs9IDI7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaXplOwogIH0KICB3cml0ZShwb3MsIGJ1ZikgewogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIGlmICh0aGlzLmZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTKSB7CiAgICAgIGlmICghKHRoaXMuYXJndW1lbnQxID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDEgPD0gMTI3ICYmIHRoaXMuYXJndW1lbnQyID49IC0xMjggJiYgdGhpcy5hcmd1bWVudDIgPD0gMTI3KSkgewogICAgICAgIHRoaXMuZmxhZ3MgfD0gQVJHXzFfQU5EXzJfQVJFX1dPUkRTOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoISh0aGlzLmFyZ3VtZW50MSA+PSAwICYmIHRoaXMuYXJndW1lbnQxIDw9IDI1NSAmJiB0aGlzLmFyZ3VtZW50MiA+PSAwICYmIHRoaXMuYXJndW1lbnQyIDw9IDI1NSkpIHsKICAgICAgICB0aGlzLmZsYWdzIHw9IEFSR18xX0FORF8yX0FSRV9XT1JEUzsKICAgICAgfQogICAgfQogICAgYnVmLnNldFVpbnQxNihwb3MsIHRoaXMuZmxhZ3MpOwogICAgYnVmLnNldFVpbnQxNihwb3MgKyAyLCB0aGlzLmdseXBoSW5kZXgpOwogICAgcG9zICs9IDQ7CiAgICBpZiAodGhpcy5mbGFncyAmIEFSR18xX0FORF8yX0FSRV9XT1JEUykgewogICAgICBpZiAodGhpcy5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUykgewogICAgICAgIGJ1Zi5zZXRJbnQxNihwb3MsIHRoaXMuYXJndW1lbnQxKTsKICAgICAgICBidWYuc2V0SW50MTYocG9zICsgMiwgdGhpcy5hcmd1bWVudDIpOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1Zi5zZXRVaW50MTYocG9zLCB0aGlzLmFyZ3VtZW50MSk7CiAgICAgICAgYnVmLnNldFVpbnQxNihwb3MgKyAyLCB0aGlzLmFyZ3VtZW50Mik7CiAgICAgIH0KICAgICAgcG9zICs9IDQ7CiAgICB9IGVsc2UgewogICAgICBidWYuc2V0VWludDgocG9zLCB0aGlzLmFyZ3VtZW50MSk7CiAgICAgIGJ1Zi5zZXRVaW50OChwb3MgKyAxLCB0aGlzLmFyZ3VtZW50Mik7CiAgICAgIHBvcyArPSAyOwogICAgfQogICAgaWYgKHRoaXMuZmxhZ3MgJiBXRV9IQVZFX0lOU1RSVUNUSU9OUykgewogICAgICBidWYuc2V0VWludDE2KHBvcywgdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoKTsKICAgICAgcG9zICs9IDI7CiAgICAgIGlmICh0aGlzLmluc3RydWN0aW9ucy5sZW5ndGgpIHsKICAgICAgICBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCAwLCBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpLnNldCh0aGlzLmluc3RydWN0aW9ucywgcG9zKTsKICAgICAgICBwb3MgKz0gdGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcG9zIC0gc3BvczsKICB9CiAgc2NhbGUoeCwgZmFjdG9yKSB7fQp9CgovKioqLyB9KSwKLyogNDcgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5PcGVuVHlwZUZpbGVCdWlsZGVyID0gdm9pZCAwOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpmdW5jdGlvbiB3cml0ZUludDE2KGRlc3QsIG9mZnNldCwgbnVtKSB7CiAgZGVzdFtvZmZzZXRdID0gbnVtID4+IDggJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gJiAweGZmOwp9CmZ1bmN0aW9uIHdyaXRlSW50MzIoZGVzdCwgb2Zmc2V0LCBudW0pIHsKICBkZXN0W29mZnNldF0gPSBudW0gPj4gMjQgJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgMV0gPSBudW0gPj4gMTYgJiAweGZmOwogIGRlc3Rbb2Zmc2V0ICsgMl0gPSBudW0gPj4gOCAmIDB4ZmY7CiAgZGVzdFtvZmZzZXQgKyAzXSA9IG51bSAmIDB4ZmY7Cn0KZnVuY3Rpb24gd3JpdGVEYXRhKGRlc3QsIG9mZnNldCwgZGF0YSkgewogIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgewogICAgZGVzdC5zZXQoZGF0YSwgb2Zmc2V0KTsKICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgewogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGRlc3Rbb2Zmc2V0KytdID0gZGF0YS5jaGFyQ29kZUF0KGkpICYgMHhmZjsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChjb25zdCBudW0gb2YgZGF0YSkgewogICAgICBkZXN0W29mZnNldCsrXSA9IG51bSAmIDB4ZmY7CiAgICB9CiAgfQp9CmNvbnN0IE9URl9IRUFERVJfU0laRSA9IDEyOwpjb25zdCBPVEZfVEFCTEVfRU5UUllfU0laRSA9IDE2OwpjbGFzcyBPcGVuVHlwZUZpbGVCdWlsZGVyIHsKICBjb25zdHJ1Y3RvcihzZm50KSB7CiAgICB0aGlzLnNmbnQgPSBzZm50OwogICAgdGhpcy50YWJsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIH0KICBzdGF0aWMgZ2V0U2VhcmNoUGFyYW1zKGVudHJpZXNDb3VudCwgZW50cnlTaXplKSB7CiAgICBsZXQgbWF4UG93ZXIyID0gMSwKICAgICAgbG9nMiA9IDA7CiAgICB3aGlsZSAoKG1heFBvd2VyMiBeIGVudHJpZXNDb3VudCkgPiBtYXhQb3dlcjIpIHsKICAgICAgbWF4UG93ZXIyIDw8PSAxOwogICAgICBsb2cyKys7CiAgICB9CiAgICBjb25zdCBzZWFyY2hSYW5nZSA9IG1heFBvd2VyMiAqIGVudHJ5U2l6ZTsKICAgIHJldHVybiB7CiAgICAgIHJhbmdlOiBzZWFyY2hSYW5nZSwKICAgICAgZW50cnk6IGxvZzIsCiAgICAgIHJhbmdlU2hpZnQ6IGVudHJ5U2l6ZSAqIGVudHJpZXNDb3VudCAtIHNlYXJjaFJhbmdlCiAgICB9OwogIH0KICB0b0FycmF5KCkgewogICAgbGV0IHNmbnQgPSB0aGlzLnNmbnQ7CiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLnRhYmxlczsKICAgIGNvbnN0IHRhYmxlc05hbWVzID0gT2JqZWN0LmtleXModGFibGVzKTsKICAgIHRhYmxlc05hbWVzLnNvcnQoKTsKICAgIGNvbnN0IG51bVRhYmxlcyA9IHRhYmxlc05hbWVzLmxlbmd0aDsKICAgIGxldCBpLCBqLCBqaiwgdGFibGUsIHRhYmxlTmFtZTsKICAgIGxldCBvZmZzZXQgPSBPVEZfSEVBREVSX1NJWkUgKyBudW1UYWJsZXMgKiBPVEZfVEFCTEVfRU5UUllfU0laRTsKICAgIGNvbnN0IHRhYmxlT2Zmc2V0cyA9IFtvZmZzZXRdOwogICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CiAgICAgIHRhYmxlID0gdGFibGVzW3RhYmxlc05hbWVzW2ldXTsKICAgICAgY29uc3QgcGFkZGVkTGVuZ3RoID0gKHRhYmxlLmxlbmd0aCArIDMgJiB+MykgPj4+IDA7CiAgICAgIG9mZnNldCArPSBwYWRkZWRMZW5ndGg7CiAgICAgIHRhYmxlT2Zmc2V0cy5wdXNoKG9mZnNldCk7CiAgICB9CiAgICBjb25zdCBmaWxlID0gbmV3IFVpbnQ4QXJyYXkob2Zmc2V0KTsKICAgIGZvciAoaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKykgewogICAgICB0YWJsZSA9IHRhYmxlc1t0YWJsZXNOYW1lc1tpXV07CiAgICAgIHdyaXRlRGF0YShmaWxlLCB0YWJsZU9mZnNldHNbaV0sIHRhYmxlKTsKICAgIH0KICAgIGlmIChzZm50ID09PSAidHJ1ZSIpIHsKICAgICAgc2ZudCA9ICgwLCBfdXRpbC5zdHJpbmczMikoMHgwMDAxMDAwMCk7CiAgICB9CiAgICBmaWxlWzBdID0gc2ZudC5jaGFyQ29kZUF0KDApICYgMHhmZjsKICAgIGZpbGVbMV0gPSBzZm50LmNoYXJDb2RlQXQoMSkgJiAweGZmOwogICAgZmlsZVsyXSA9IHNmbnQuY2hhckNvZGVBdCgyKSAmIDB4ZmY7CiAgICBmaWxlWzNdID0gc2ZudC5jaGFyQ29kZUF0KDMpICYgMHhmZjsKICAgIHdyaXRlSW50MTYoZmlsZSwgNCwgbnVtVGFibGVzKTsKICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IE9wZW5UeXBlRmlsZUJ1aWxkZXIuZ2V0U2VhcmNoUGFyYW1zKG51bVRhYmxlcywgMTYpOwogICAgd3JpdGVJbnQxNihmaWxlLCA2LCBzZWFyY2hQYXJhbXMucmFuZ2UpOwogICAgd3JpdGVJbnQxNihmaWxlLCA4LCBzZWFyY2hQYXJhbXMuZW50cnkpOwogICAgd3JpdGVJbnQxNihmaWxlLCAxMCwgc2VhcmNoUGFyYW1zLnJhbmdlU2hpZnQpOwogICAgb2Zmc2V0ID0gT1RGX0hFQURFUl9TSVpFOwogICAgZm9yIChpID0gMDsgaSA8IG51bVRhYmxlczsgaSsrKSB7CiAgICAgIHRhYmxlTmFtZSA9IHRhYmxlc05hbWVzW2ldOwogICAgICBmaWxlW29mZnNldF0gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgwKSAmIDB4ZmY7CiAgICAgIGZpbGVbb2Zmc2V0ICsgMV0gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgxKSAmIDB4ZmY7CiAgICAgIGZpbGVbb2Zmc2V0ICsgMl0gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgyKSAmIDB4ZmY7CiAgICAgIGZpbGVbb2Zmc2V0ICsgM10gPSB0YWJsZU5hbWUuY2hhckNvZGVBdCgzKSAmIDB4ZmY7CiAgICAgIGxldCBjaGVja3N1bSA9IDA7CiAgICAgIGZvciAoaiA9IHRhYmxlT2Zmc2V0c1tpXSwgamogPSB0YWJsZU9mZnNldHNbaSArIDFdOyBqIDwgamo7IGogKz0gNCkgewogICAgICAgIGNvbnN0IHF1YWQgPSAoMCwgX2NvcmVfdXRpbHMucmVhZFVpbnQzMikoZmlsZSwgaik7CiAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bSArIHF1YWQgPj4+IDA7CiAgICAgIH0KICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyA0LCBjaGVja3N1bSk7CiAgICAgIHdyaXRlSW50MzIoZmlsZSwgb2Zmc2V0ICsgOCwgdGFibGVPZmZzZXRzW2ldKTsKICAgICAgd3JpdGVJbnQzMihmaWxlLCBvZmZzZXQgKyAxMiwgdGFibGVzW3RhYmxlTmFtZV0ubGVuZ3RoKTsKICAgICAgb2Zmc2V0ICs9IE9URl9UQUJMRV9FTlRSWV9TSVpFOwogICAgfQogICAgcmV0dXJuIGZpbGU7CiAgfQogIGFkZFRhYmxlKHRhZywgZGF0YSkgewogICAgaWYgKHRhZyBpbiB0aGlzLnRhYmxlcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRhYmxlICIgKyB0YWcgKyAiIGFscmVhZHkgZXhpc3RzIik7CiAgICB9CiAgICB0aGlzLnRhYmxlc1t0YWddID0gZGF0YTsKICB9Cn0KZXhwb3J0cy5PcGVuVHlwZUZpbGVCdWlsZGVyID0gT3BlblR5cGVGaWxlQnVpbGRlcjsKCi8qKiovIH0pLAovKiA0OCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlR5cGUxRm9udCA9IHZvaWQgMDsKdmFyIF9jZmZfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfZm9udHNfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKdmFyIF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpOwp2YXIgX3R5cGUxX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNDkpOwpmdW5jdGlvbiBmaW5kQmxvY2soc3RyZWFtQnl0ZXMsIHNpZ25hdHVyZSwgc3RhcnRJbmRleCkgewogIGNvbnN0IHN0cmVhbUJ5dGVzTGVuZ3RoID0gc3RyZWFtQnl0ZXMubGVuZ3RoOwogIGNvbnN0IHNpZ25hdHVyZUxlbmd0aCA9IHNpZ25hdHVyZS5sZW5ndGg7CiAgY29uc3Qgc2Nhbkxlbmd0aCA9IHN0cmVhbUJ5dGVzTGVuZ3RoIC0gc2lnbmF0dXJlTGVuZ3RoOwogIGxldCBpID0gc3RhcnRJbmRleCwKICAgIGZvdW5kID0gZmFsc2U7CiAgd2hpbGUgKGkgPCBzY2FuTGVuZ3RoKSB7CiAgICBsZXQgaiA9IDA7CiAgICB3aGlsZSAoaiA8IHNpZ25hdHVyZUxlbmd0aCAmJiBzdHJlYW1CeXRlc1tpICsgal0gPT09IHNpZ25hdHVyZVtqXSkgewogICAgICBqKys7CiAgICB9CiAgICBpZiAoaiA+PSBzaWduYXR1cmVMZW5ndGgpIHsKICAgICAgaSArPSBqOwogICAgICB3aGlsZSAoaSA8IHN0cmVhbUJ5dGVzTGVuZ3RoICYmICgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKHN0cmVhbUJ5dGVzW2ldKSkgewogICAgICAgIGkrKzsKICAgICAgfQogICAgICBmb3VuZCA9IHRydWU7CiAgICAgIGJyZWFrOwogICAgfQogICAgaSsrOwogIH0KICByZXR1cm4gewogICAgZm91bmQsCiAgICBsZW5ndGg6IGkKICB9Owp9CmZ1bmN0aW9uIGdldEhlYWRlckJsb2NrKHN0cmVhbSwgc3VnZ2VzdGVkTGVuZ3RoKSB7CiAgY29uc3QgRUVYRUNfU0lHTkFUVVJFID0gWzB4NjUsIDB4NjUsIDB4NzgsIDB4NjUsIDB4NjNdOwogIGNvbnN0IHN0cmVhbVN0YXJ0UG9zID0gc3RyZWFtLnBvczsKICBsZXQgaGVhZGVyQnl0ZXMsIGhlYWRlckJ5dGVzTGVuZ3RoLCBibG9jazsKICB0cnkgewogICAgaGVhZGVyQnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoc3VnZ2VzdGVkTGVuZ3RoKTsKICAgIGhlYWRlckJ5dGVzTGVuZ3RoID0gaGVhZGVyQnl0ZXMubGVuZ3RoOwogIH0gY2F0Y2ggKGV4KSB7fQogIGlmIChoZWFkZXJCeXRlc0xlbmd0aCA9PT0gc3VnZ2VzdGVkTGVuZ3RoKSB7CiAgICBibG9jayA9IGZpbmRCbG9jayhoZWFkZXJCeXRlcywgRUVYRUNfU0lHTkFUVVJFLCBzdWdnZXN0ZWRMZW5ndGggLSAyICogRUVYRUNfU0lHTkFUVVJFLmxlbmd0aCk7CiAgICBpZiAoYmxvY2suZm91bmQgJiYgYmxvY2subGVuZ3RoID09PSBzdWdnZXN0ZWRMZW5ndGgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzdHJlYW06IG5ldyBfc3RyZWFtLlN0cmVhbShoZWFkZXJCeXRlcyksCiAgICAgICAgbGVuZ3RoOiBzdWdnZXN0ZWRMZW5ndGgKICAgICAgfTsKICAgIH0KICB9CiAgKDAsIF91dGlsLndhcm4pKCdJbnZhbGlkICJMZW5ndGgxIiBwcm9wZXJ0eSBpbiBUeXBlMSBmb250IC0tIHRyeWluZyB0byByZWNvdmVyLicpOwogIHN0cmVhbS5wb3MgPSBzdHJlYW1TdGFydFBvczsKICBjb25zdCBTQ0FOX0JMT0NLX0xFTkdUSCA9IDIwNDg7CiAgbGV0IGFjdHVhbExlbmd0aDsKICB3aGlsZSAodHJ1ZSkgewogICAgY29uc3Qgc2NhbkJ5dGVzID0gc3RyZWFtLnBlZWtCeXRlcyhTQ0FOX0JMT0NLX0xFTkdUSCk7CiAgICBibG9jayA9IGZpbmRCbG9jayhzY2FuQnl0ZXMsIEVFWEVDX1NJR05BVFVSRSwgMCk7CiAgICBpZiAoYmxvY2subGVuZ3RoID09PSAwKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgc3RyZWFtLnBvcyArPSBibG9jay5sZW5ndGg7CiAgICBpZiAoYmxvY2suZm91bmQpIHsKICAgICAgYWN0dWFsTGVuZ3RoID0gc3RyZWFtLnBvcyAtIHN0cmVhbVN0YXJ0UG9zOwogICAgICBicmVhazsKICAgIH0KICB9CiAgc3RyZWFtLnBvcyA9IHN0cmVhbVN0YXJ0UG9zOwogIGlmIChhY3R1YWxMZW5ndGgpIHsKICAgIHJldHVybiB7CiAgICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhhY3R1YWxMZW5ndGgpKSwKICAgICAgbGVuZ3RoOiBhY3R1YWxMZW5ndGgKICAgIH07CiAgfQogICgwLCBfdXRpbC53YXJuKSgnVW5hYmxlIHRvIHJlY292ZXIgIkxlbmd0aDEiIHByb3BlcnR5IGluIFR5cGUxIGZvbnQgLS0gdXNpbmcgYXMgaXMuJyk7CiAgcmV0dXJuIHsKICAgIHN0cmVhbTogbmV3IF9zdHJlYW0uU3RyZWFtKHN0cmVhbS5nZXRCeXRlcyhzdWdnZXN0ZWRMZW5ndGgpKSwKICAgIGxlbmd0aDogc3VnZ2VzdGVkTGVuZ3RoCiAgfTsKfQpmdW5jdGlvbiBnZXRFZXhlY0Jsb2NrKHN0cmVhbSwgc3VnZ2VzdGVkTGVuZ3RoKSB7CiAgY29uc3QgZWV4ZWNCeXRlcyA9IHN0cmVhbS5nZXRCeXRlcygpOwogIGlmIChlZXhlY0J5dGVzLmxlbmd0aCA9PT0gMCkgewogICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJnZXRFZXhlY0Jsb2NrIC0gbm8gZm9udCBwcm9ncmFtIGZvdW5kLiIpOwogIH0KICByZXR1cm4gewogICAgc3RyZWFtOiBuZXcgX3N0cmVhbS5TdHJlYW0oZWV4ZWNCeXRlcyksCiAgICBsZW5ndGg6IGVleGVjQnl0ZXMubGVuZ3RoCiAgfTsKfQpjbGFzcyBUeXBlMUZvbnQgewogIGNvbnN0cnVjdG9yKG5hbWUsIGZpbGUsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IFBGQl9IRUFERVJfU0laRSA9IDY7CiAgICBsZXQgaGVhZGVyQmxvY2tMZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDE7CiAgICBsZXQgZWV4ZWNCbG9ja0xlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoMjsKICAgIGxldCBwZmJIZWFkZXIgPSBmaWxlLnBlZWtCeXRlcyhQRkJfSEVBREVSX1NJWkUpOwogICAgY29uc3QgcGZiSGVhZGVyUHJlc2VudCA9IHBmYkhlYWRlclswXSA9PT0gMHg4MCAmJiBwZmJIZWFkZXJbMV0gPT09IDB4MDE7CiAgICBpZiAocGZiSGVhZGVyUHJlc2VudCkgewogICAgICBmaWxlLnNraXAoUEZCX0hFQURFUl9TSVpFKTsKICAgICAgaGVhZGVyQmxvY2tMZW5ndGggPSBwZmJIZWFkZXJbNV0gPDwgMjQgfCBwZmJIZWFkZXJbNF0gPDwgMTYgfCBwZmJIZWFkZXJbM10gPDwgOCB8IHBmYkhlYWRlclsyXTsKICAgIH0KICAgIGNvbnN0IGhlYWRlckJsb2NrID0gZ2V0SGVhZGVyQmxvY2soZmlsZSwgaGVhZGVyQmxvY2tMZW5ndGgpOwogICAgY29uc3QgaGVhZGVyQmxvY2tQYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihoZWFkZXJCbG9jay5zdHJlYW0sIGZhbHNlLCBfZm9udHNfdXRpbHMuU0VBQ19BTkFMWVNJU19FTkFCTEVEKTsKICAgIGhlYWRlckJsb2NrUGFyc2VyLmV4dHJhY3RGb250SGVhZGVyKHByb3BlcnRpZXMpOwogICAgaWYgKHBmYkhlYWRlclByZXNlbnQpIHsKICAgICAgcGZiSGVhZGVyID0gZmlsZS5nZXRCeXRlcyhQRkJfSEVBREVSX1NJWkUpOwogICAgICBlZXhlY0Jsb2NrTGVuZ3RoID0gcGZiSGVhZGVyWzVdIDw8IDI0IHwgcGZiSGVhZGVyWzRdIDw8IDE2IHwgcGZiSGVhZGVyWzNdIDw8IDggfCBwZmJIZWFkZXJbMl07CiAgICB9CiAgICBjb25zdCBlZXhlY0Jsb2NrID0gZ2V0RWV4ZWNCbG9jayhmaWxlLCBlZXhlY0Jsb2NrTGVuZ3RoKTsKICAgIGNvbnN0IGVleGVjQmxvY2tQYXJzZXIgPSBuZXcgX3R5cGUxX3BhcnNlci5UeXBlMVBhcnNlcihlZXhlY0Jsb2NrLnN0cmVhbSwgdHJ1ZSwgX2ZvbnRzX3V0aWxzLlNFQUNfQU5BTFlTSVNfRU5BQkxFRCk7CiAgICBjb25zdCBkYXRhID0gZWV4ZWNCbG9ja1BhcnNlci5leHRyYWN0Rm9udFByb2dyYW0ocHJvcGVydGllcyk7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhLnByb3BlcnRpZXMpIHsKICAgICAgcHJvcGVydGllc1trZXldID0gZGF0YS5wcm9wZXJ0aWVzW2tleV07CiAgICB9CiAgICBjb25zdCBjaGFyc3RyaW5ncyA9IGRhdGEuY2hhcnN0cmluZ3M7CiAgICBjb25zdCB0eXBlMkNoYXJzdHJpbmdzID0gdGhpcy5nZXRUeXBlMkNoYXJzdHJpbmdzKGNoYXJzdHJpbmdzKTsKICAgIGNvbnN0IHN1YnJzID0gdGhpcy5nZXRUeXBlMlN1YnJzKGRhdGEuc3VicnMpOwogICAgdGhpcy5jaGFyc3RyaW5ncyA9IGNoYXJzdHJpbmdzOwogICAgdGhpcy5kYXRhID0gdGhpcy53cmFwKG5hbWUsIHR5cGUyQ2hhcnN0cmluZ3MsIHRoaXMuY2hhcnN0cmluZ3MsIHN1YnJzLCBwcm9wZXJ0aWVzKTsKICAgIHRoaXMuc2VhY3MgPSB0aGlzLmdldFNlYWNzKGRhdGEuY2hhcnN0cmluZ3MpOwogIH0KICBnZXQgbnVtR2x5cGhzKCkgewogICAgcmV0dXJuIHRoaXMuY2hhcnN0cmluZ3MubGVuZ3RoICsgMTsKICB9CiAgZ2V0Q2hhcnNldCgpIHsKICAgIGNvbnN0IGNoYXJzZXQgPSBbIi5ub3RkZWYiXTsKICAgIGZvciAoY29uc3QgewogICAgICBnbHlwaE5hbWUKICAgIH0gb2YgdGhpcy5jaGFyc3RyaW5ncykgewogICAgICBjaGFyc2V0LnB1c2goZ2x5cGhOYW1lKTsKICAgIH0KICAgIHJldHVybiBjaGFyc2V0OwogIH0KICBnZXRHbHlwaE1hcHBpbmcocHJvcGVydGllcykgewogICAgY29uc3QgY2hhcnN0cmluZ3MgPSB0aGlzLmNoYXJzdHJpbmdzOwogICAgaWYgKHByb3BlcnRpZXMuY29tcG9zaXRlKSB7CiAgICAgIGNvbnN0IGNoYXJDb2RlVG9HbHlwaElkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChsZXQgZ2x5cGhJZCA9IDAsIGNoYXJzdHJpbmdzTGVuID0gY2hhcnN0cmluZ3MubGVuZ3RoOyBnbHlwaElkIDwgY2hhcnN0cmluZ3NMZW47IGdseXBoSWQrKykgewogICAgICAgIGNvbnN0IGNoYXJDb2RlID0gcHJvcGVydGllcy5jTWFwLmNoYXJDb2RlT2YoZ2x5cGhJZCk7CiAgICAgICAgY2hhckNvZGVUb0dseXBoSWRbY2hhckNvZGVdID0gZ2x5cGhJZCArIDE7CiAgICAgIH0KICAgICAgcmV0dXJuIGNoYXJDb2RlVG9HbHlwaElkOwogICAgfQogICAgY29uc3QgZ2x5cGhOYW1lcyA9IFsiLm5vdGRlZiJdOwogICAgbGV0IGJ1aWx0SW5FbmNvZGluZywgZ2x5cGhJZDsKICAgIGZvciAoZ2x5cGhJZCA9IDA7IGdseXBoSWQgPCBjaGFyc3RyaW5ncy5sZW5ndGg7IGdseXBoSWQrKykgewogICAgICBnbHlwaE5hbWVzLnB1c2goY2hhcnN0cmluZ3NbZ2x5cGhJZF0uZ2x5cGhOYW1lKTsKICAgIH0KICAgIGNvbnN0IGVuY29kaW5nID0gcHJvcGVydGllcy5idWlsdEluRW5jb2Rpbmc7CiAgICBpZiAoZW5jb2RpbmcpIHsKICAgICAgYnVpbHRJbkVuY29kaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgZm9yIChjb25zdCBjaGFyQ29kZSBpbiBlbmNvZGluZykgewogICAgICAgIGdseXBoSWQgPSBnbHlwaE5hbWVzLmluZGV4T2YoZW5jb2RpbmdbY2hhckNvZGVdKTsKICAgICAgICBpZiAoZ2x5cGhJZCA+PSAwKSB7CiAgICAgICAgICBidWlsdEluRW5jb2RpbmdbY2hhckNvZGVdID0gZ2x5cGhJZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCwgX2ZvbnRzX3V0aWxzLnR5cGUxRm9udEdseXBoTWFwcGluZykocHJvcGVydGllcywgYnVpbHRJbkVuY29kaW5nLCBnbHlwaE5hbWVzKTsKICB9CiAgaGFzR2x5cGhJZChpZCkgewogICAgaWYgKGlkIDwgMCB8fCBpZCA+PSB0aGlzLm51bUdseXBocykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoaWQgPT09IDApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBnbHlwaCA9IHRoaXMuY2hhcnN0cmluZ3NbaWQgLSAxXTsKICAgIHJldHVybiBnbHlwaC5jaGFyc3RyaW5nLmxlbmd0aCA+IDA7CiAgfQogIGdldFNlYWNzKGNoYXJzdHJpbmdzKSB7CiAgICBjb25zdCBzZWFjTWFwID0gW107CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjaGFyc3RyaW5ncy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGNoYXJzdHJpbmcgPSBjaGFyc3RyaW5nc1tpXTsKICAgICAgaWYgKGNoYXJzdHJpbmcuc2VhYykgewogICAgICAgIHNlYWNNYXBbaSArIDFdID0gY2hhcnN0cmluZy5zZWFjOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2VhY01hcDsKICB9CiAgZ2V0VHlwZTJDaGFyc3RyaW5ncyh0eXBlMUNoYXJzdHJpbmdzKSB7CiAgICBjb25zdCB0eXBlMkNoYXJzdHJpbmdzID0gW107CiAgICBmb3IgKGNvbnN0IHR5cGUxQ2hhcnN0cmluZyBvZiB0eXBlMUNoYXJzdHJpbmdzKSB7CiAgICAgIHR5cGUyQ2hhcnN0cmluZ3MucHVzaCh0eXBlMUNoYXJzdHJpbmcuY2hhcnN0cmluZyk7CiAgICB9CiAgICByZXR1cm4gdHlwZTJDaGFyc3RyaW5nczsKICB9CiAgZ2V0VHlwZTJTdWJycyh0eXBlMVN1YnJzKSB7CiAgICBsZXQgYmlhcyA9IDA7CiAgICBjb25zdCBjb3VudCA9IHR5cGUxU3VicnMubGVuZ3RoOwogICAgaWYgKGNvdW50IDwgMTEzMykgewogICAgICBiaWFzID0gMTA3OwogICAgfSBlbHNlIGlmIChjb3VudCA8IDMzNzY5KSB7CiAgICAgIGJpYXMgPSAxMTMxOwogICAgfSBlbHNlIHsKICAgICAgYmlhcyA9IDMyNzY4OwogICAgfQogICAgY29uc3QgdHlwZTJTdWJycyA9IFtdOwogICAgbGV0IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgYmlhczsgaSsrKSB7CiAgICAgIHR5cGUyU3VicnMucHVzaChbMHgwYl0pOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgdHlwZTJTdWJycy5wdXNoKHR5cGUxU3VicnNbaV0pOwogICAgfQogICAgcmV0dXJuIHR5cGUyU3VicnM7CiAgfQogIHdyYXAobmFtZSwgZ2x5cGhzLCBjaGFyc3RyaW5ncywgc3VicnMsIHByb3BlcnRpZXMpIHsKICAgIGNvbnN0IGNmZiA9IG5ldyBfY2ZmX3BhcnNlci5DRkYoKTsKICAgIGNmZi5oZWFkZXIgPSBuZXcgX2NmZl9wYXJzZXIuQ0ZGSGVhZGVyKDEsIDAsIDQsIDQpOwogICAgY2ZmLm5hbWVzID0gW25hbWVdOwogICAgY29uc3QgdG9wRGljdCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZUb3BEaWN0KCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgidmVyc2lvbiIsIDM5MSk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiTm90aWNlIiwgMzkyKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJGdWxsTmFtZSIsIDM5Myk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiRmFtaWx5TmFtZSIsIDM5NCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiV2VpZ2h0IiwgMzk1KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJFbmNvZGluZyIsIG51bGwpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZvbnRNYXRyaXgiLCBwcm9wZXJ0aWVzLmZvbnRNYXRyaXgpOwogICAgdG9wRGljdC5zZXRCeU5hbWUoIkZvbnRCQm94IiwgcHJvcGVydGllcy5iYm94KTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJjaGFyc2V0IiwgbnVsbCk7CiAgICB0b3BEaWN0LnNldEJ5TmFtZSgiQ2hhclN0cmluZ3MiLCBudWxsKTsKICAgIHRvcERpY3Quc2V0QnlOYW1lKCJQcml2YXRlIiwgbnVsbCk7CiAgICBjZmYudG9wRGljdCA9IHRvcERpY3Q7CiAgICBjb25zdCBzdHJpbmdzID0gbmV3IF9jZmZfcGFyc2VyLkNGRlN0cmluZ3MoKTsKICAgIHN0cmluZ3MuYWRkKCJWZXJzaW9uIDAuMTEiKTsKICAgIHN0cmluZ3MuYWRkKCJTZWUgb3JpZ2luYWwgbm90aWNlIik7CiAgICBzdHJpbmdzLmFkZChuYW1lKTsKICAgIHN0cmluZ3MuYWRkKG5hbWUpOwogICAgc3RyaW5ncy5hZGQoIk1lZGl1bSIpOwogICAgY2ZmLnN0cmluZ3MgPSBzdHJpbmdzOwogICAgY2ZmLmdsb2JhbFN1YnJJbmRleCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZJbmRleCgpOwogICAgY29uc3QgY291bnQgPSBnbHlwaHMubGVuZ3RoOwogICAgY29uc3QgY2hhcnNldEFycmF5ID0gWyIubm90ZGVmIl07CiAgICBsZXQgaSwgaWk7CiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBjb25zdCBnbHlwaE5hbWUgPSBjaGFyc3RyaW5nc1tpXS5nbHlwaE5hbWU7CiAgICAgIGNvbnN0IGluZGV4ID0gX2NmZl9wYXJzZXIuQ0ZGU3RhbmRhcmRTdHJpbmdzLmluZGV4T2YoZ2x5cGhOYW1lKTsKICAgICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgIHN0cmluZ3MuYWRkKGdseXBoTmFtZSk7CiAgICAgIH0KICAgICAgY2hhcnNldEFycmF5LnB1c2goZ2x5cGhOYW1lKTsKICAgIH0KICAgIGNmZi5jaGFyc2V0ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNoYXJzZXQoZmFsc2UsIDAsIGNoYXJzZXRBcnJheSk7CiAgICBjb25zdCBjaGFyU3RyaW5nc0luZGV4ID0gbmV3IF9jZmZfcGFyc2VyLkNGRkluZGV4KCk7CiAgICBjaGFyU3RyaW5nc0luZGV4LmFkZChbMHg4YiwgMHgwZV0pOwogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgY2hhclN0cmluZ3NJbmRleC5hZGQoZ2x5cGhzW2ldKTsKICAgIH0KICAgIGNmZi5jaGFyU3RyaW5ncyA9IGNoYXJTdHJpbmdzSW5kZXg7CiAgICBjb25zdCBwcml2YXRlRGljdCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZQcml2YXRlRGljdCgpOwogICAgcHJpdmF0ZURpY3Quc2V0QnlOYW1lKCJTdWJycyIsIG51bGwpOwogICAgY29uc3QgZmllbGRzID0gWyJCbHVlVmFsdWVzIiwgIk90aGVyQmx1ZXMiLCAiRmFtaWx5Qmx1ZXMiLCAiRmFtaWx5T3RoZXJCbHVlcyIsICJTdGVtU25hcEgiLCAiU3RlbVNuYXBWIiwgIkJsdWVTaGlmdCIsICJCbHVlRnV6eiIsICJCbHVlU2NhbGUiLCAiTGFuZ3VhZ2VHcm91cCIsICJFeHBhbnNpb25GYWN0b3IiLCAiRm9yY2VCb2xkIiwgIlN0ZEhXIiwgIlN0ZFZXIl07CiAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZWxkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2ldOwogICAgICBpZiAoIShmaWVsZCBpbiBwcm9wZXJ0aWVzLnByaXZhdGVEYXRhKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllcy5wcml2YXRlRGF0YVtmaWVsZF07CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIGZvciAobGV0IGogPSB2YWx1ZS5sZW5ndGggLSAxOyBqID4gMDsgai0tKSB7CiAgICAgICAgICB2YWx1ZVtqXSAtPSB2YWx1ZVtqIC0gMV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHByaXZhdGVEaWN0LnNldEJ5TmFtZShmaWVsZCwgdmFsdWUpOwogICAgfQogICAgY2ZmLnRvcERpY3QucHJpdmF0ZURpY3QgPSBwcml2YXRlRGljdDsKICAgIGNvbnN0IHN1YnJJbmRleCA9IG5ldyBfY2ZmX3BhcnNlci5DRkZJbmRleCgpOwogICAgZm9yIChpID0gMCwgaWkgPSBzdWJycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIHN1YnJJbmRleC5hZGQoc3VicnNbaV0pOwogICAgfQogICAgcHJpdmF0ZURpY3Quc3VicnNJbmRleCA9IHN1YnJJbmRleDsKICAgIGNvbnN0IGNvbXBpbGVyID0gbmV3IF9jZmZfcGFyc2VyLkNGRkNvbXBpbGVyKGNmZik7CiAgICByZXR1cm4gY29tcGlsZXIuY29tcGlsZSgpOwogIH0KfQpleHBvcnRzLlR5cGUxRm9udCA9IFR5cGUxRm9udDsKCi8qKiovIH0pLAovKiA0OSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlR5cGUxUGFyc2VyID0gdm9pZCAwOwp2YXIgX2VuY29kaW5ncyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzcpOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwp2YXIgX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNvbnN0IEhJTlRJTkdfRU5BQkxFRCA9IGZhbHNlOwpjb25zdCBDT01NQU5EX01BUCA9IHsKICBoc3RlbTogWzFdLAogIHZzdGVtOiBbM10sCiAgdm1vdmV0bzogWzRdLAogIHJsaW5ldG86IFs1XSwKICBobGluZXRvOiBbNl0sCiAgdmxpbmV0bzogWzddLAogIHJyY3VydmV0bzogWzhdLAogIGNhbGxzdWJyOiBbMTBdLAogIGZsZXg6IFsxMiwgMzVdLAogIGRyb3A6IFsxMiwgMThdLAogIGVuZGNoYXI6IFsxNF0sCiAgcm1vdmV0bzogWzIxXSwKICBobW92ZXRvOiBbMjJdLAogIHZoY3VydmV0bzogWzMwXSwKICBodmN1cnZldG86IFszMV0KfTsKY2xhc3MgVHlwZTFDaGFyU3RyaW5nIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIHRoaXMud2lkdGggPSAwOwogICAgdGhpcy5sc2IgPSAwOwogICAgdGhpcy5mbGV4aW5nID0gZmFsc2U7CiAgICB0aGlzLm91dHB1dCA9IFtdOwogICAgdGhpcy5zdGFjayA9IFtdOwogIH0KICBjb252ZXJ0KGVuY29kZWQsIHN1YnJzLCBzZWFjQW5hbHlzaXNFbmFibGVkKSB7CiAgICBjb25zdCBjb3VudCA9IGVuY29kZWQubGVuZ3RoOwogICAgbGV0IGVycm9yID0gZmFsc2U7CiAgICBsZXQgd3gsIHNieCwgc3Vick51bWJlcjsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICBsZXQgdmFsdWUgPSBlbmNvZGVkW2ldOwogICAgICBpZiAodmFsdWUgPCAzMikgewogICAgICAgIGlmICh2YWx1ZSA9PT0gMTIpIHsKICAgICAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpICsgZW5jb2RlZFsrK2ldOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5oc3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkgewogICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAudnN0ZW0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykgewogICAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBkeSA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKDAsIGR5KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAudm1vdmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAucmxpbmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAuaGxpbmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMSwgQ09NTUFORF9NQVAudmxpbmV0byk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNiwgQ09NTUFORF9NQVAucnJjdXJ2ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YnJOdW1iZXIgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICBpZiAoIXN1YnJzW3N1YnJOdW1iZXJdKSB7CiAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5jb252ZXJ0KHN1YnJzW3N1YnJOdW1iZXJdLCBzdWJycywgc2VhY0FuYWx5c2lzRW5hYmxlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICAgIGVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB3eCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHNieCA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHRoaXMubHNiID0gc2J4OwogICAgICAgICAgICB0aGlzLndpZHRoID0gd3g7CiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh3eCwgc2J4KTsKICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDIsIENPTU1BTkRfTUFQLmhtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgIHRoaXMub3V0cHV0LnB1c2goQ09NTUFORF9NQVAuZW5kY2hhclswXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgaWYgKHRoaXMuZmxleGluZykgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC5ybW92ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICBpZiAodGhpcy5mbGV4aW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKDApOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxLCBDT01NQU5EX01BUC5obW92ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDMwOgogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAudmhjdXJ2ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAuaHZjdXJ2ZXRvKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDA6CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDE6CiAgICAgICAgICAgIGlmICghSElOVElOR19FTkFCTEVEKSB7CiAgICAgICAgICAgICAgdGhpcy5zdGFjayA9IFtdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgyLCBDT01NQU5EX01BUC52c3RlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAyOgogICAgICAgICAgICBpZiAoIUhJTlRJTkdfRU5BQkxFRCkgewogICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoMiwgQ09NTUFORF9NQVAuaHN0ZW0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgNjoKICAgICAgICAgICAgaWYgKHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgICAgICAgICAgICBjb25zdCBhc2IgPSB0aGlzLnN0YWNrLmF0KC01KTsKICAgICAgICAgICAgICB0aGlzLnNlYWMgPSB0aGlzLnN0YWNrLnNwbGljZSgtNCwgNCk7CiAgICAgICAgICAgICAgdGhpcy5zZWFjWzBdICs9IHRoaXMubHNiIC0gYXNiOwogICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgwLCBDT01NQU5EX01BUC5lbmRjaGFyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBlcnJvciA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQoNCwgQ09NTUFORF9NQVAuZW5kY2hhcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDc6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDQpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTsKICAgICAgICAgICAgd3ggPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICBjb25zdCBzYnkgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICBzYnggPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICB0aGlzLmxzYiA9IHNieDsKICAgICAgICAgICAgdGhpcy53aWR0aCA9IHd4OwogICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2god3gsIHNieCwgc2J5KTsKICAgICAgICAgICAgZXJyb3IgPSB0aGlzLmV4ZWN1dGVDb21tYW5kKDMsIENPTU1BTkRfTUFQLnJtb3ZldG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMTI6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbnVtMiA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IG51bTEgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2gobnVtMSAvIG51bTIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgKDEyIDw8IDgpICsgMTY6CiAgICAgICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICBlcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vick51bWJlciA9IHRoaXMuc3RhY2sucG9wKCk7CiAgICAgICAgICAgIGNvbnN0IG51bUFyZ3MgPSB0aGlzLnN0YWNrLnBvcCgpOwogICAgICAgICAgICBpZiAoc3Vick51bWJlciA9PT0gMCAmJiBudW1BcmdzID09PSAzKSB7CiAgICAgICAgICAgICAgY29uc3QgZmxleEFyZ3MgPSB0aGlzLnN0YWNrLnNwbGljZSgtMTcsIDE3KTsKICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZmxleEFyZ3NbMl0gKyBmbGV4QXJnc1swXSwgZmxleEFyZ3NbM10gKyBmbGV4QXJnc1sxXSwgZmxleEFyZ3NbNF0sIGZsZXhBcmdzWzVdLCBmbGV4QXJnc1s2XSwgZmxleEFyZ3NbN10sIGZsZXhBcmdzWzhdLCBmbGV4QXJnc1s5XSwgZmxleEFyZ3NbMTBdLCBmbGV4QXJnc1sxMV0sIGZsZXhBcmdzWzEyXSwgZmxleEFyZ3NbMTNdLCBmbGV4QXJnc1sxNF0pOwogICAgICAgICAgICAgIGVycm9yID0gdGhpcy5leGVjdXRlQ29tbWFuZCgxMywgQ09NTUFORF9NQVAuZmxleCwgdHJ1ZSk7CiAgICAgICAgICAgICAgdGhpcy5mbGV4aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZsZXhBcmdzWzE1XSwgZmxleEFyZ3NbMTZdKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJyTnVtYmVyID09PSAxICYmIG51bUFyZ3MgPT09IDApIHsKICAgICAgICAgICAgICB0aGlzLmZsZXhpbmcgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAoMTIgPDwgOCkgKyAxNzoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICgxMiA8PCA4KSArIDMzOgogICAgICAgICAgICB0aGlzLnN0YWNrID0gW107CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKCdVbmtub3duIHR5cGUgMSBjaGFyc3RyaW5nIGNvbW1hbmQgb2YgIicgKyB2YWx1ZSArICciJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAyNDYpIHsKICAgICAgICB2YWx1ZSAtPSAxMzk7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMjUwKSB7CiAgICAgICAgdmFsdWUgPSAodmFsdWUgLSAyNDcpICogMjU2ICsgZW5jb2RlZFsrK2ldICsgMTA4OwogICAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDI1NCkgewogICAgICAgIHZhbHVlID0gLSgodmFsdWUgLSAyNTEpICogMjU2KSAtIGVuY29kZWRbKytpXSAtIDEwODsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAyNCB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCAxNiB8IChlbmNvZGVkWysraV0gJiAweGZmKSA8PCA4IHwgKGVuY29kZWRbKytpXSAmIDB4ZmYpIDw8IDA7CiAgICAgIH0KICAgICAgdGhpcy5zdGFjay5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBlcnJvcjsKICB9CiAgZXhlY3V0ZUNvbW1hbmQoaG93TWFueUFyZ3MsIGNvbW1hbmQsIGtlZXBTdGFjaykgewogICAgY29uc3Qgc3RhY2tMZW5ndGggPSB0aGlzLnN0YWNrLmxlbmd0aDsKICAgIGlmIChob3dNYW55QXJncyA+IHN0YWNrTGVuZ3RoKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY29uc3Qgc3RhcnQgPSBzdGFja0xlbmd0aCAtIGhvd01hbnlBcmdzOwogICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhY2tMZW5ndGg7IGkrKykgewogICAgICBsZXQgdmFsdWUgPSB0aGlzLnN0YWNrW2ldOwogICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHsKICAgICAgICB0aGlzLm91dHB1dC5wdXNoKDI4LCB2YWx1ZSA+PiA4ICYgMHhmZiwgdmFsdWUgJiAweGZmKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IDY1NTM2ICogdmFsdWUgfCAwOwogICAgICAgIHRoaXMub3V0cHV0LnB1c2goMjU1LCB2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7CiAgICAgIH0KICAgIH0KICAgIHRoaXMub3V0cHV0LnB1c2goLi4uY29tbWFuZCk7CiAgICBpZiAoa2VlcFN0YWNrKSB7CiAgICAgIHRoaXMuc3RhY2suc3BsaWNlKHN0YXJ0LCBob3dNYW55QXJncyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnN0YWNrLmxlbmd0aCA9IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNvbnN0IEVFWEVDX0VOQ1JZUFRfS0VZID0gNTU2NjU7CmNvbnN0IENIQVJfU1RSU19FTkNSWVBUX0tFWSA9IDQzMzA7CmZ1bmN0aW9uIGlzSGV4RGlnaXQoY29kZSkgewogIHJldHVybiBjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcgfHwgY29kZSA+PSA2NSAmJiBjb2RlIDw9IDcwIHx8IGNvZGUgPj0gOTcgJiYgY29kZSA8PSAxMDI7Cn0KZnVuY3Rpb24gZGVjcnlwdChkYXRhLCBrZXksIGRpc2NhcmROdW1iZXIpIHsKICBpZiAoZGlzY2FyZE51bWJlciA+PSBkYXRhLmxlbmd0aCkgewogICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogIH0KICBjb25zdCBjMSA9IDUyODQ1LAogICAgYzIgPSAyMjcxOTsKICBsZXQgciA9IGtleSB8IDAsCiAgICBpLAogICAgajsKICBmb3IgKGkgPSAwOyBpIDwgZGlzY2FyZE51bWJlcjsgaSsrKSB7CiAgICByID0gKGRhdGFbaV0gKyByKSAqIGMxICsgYzIgJiAoMSA8PCAxNikgLSAxOwogIH0KICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoIC0gZGlzY2FyZE51bWJlcjsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShjb3VudCk7CiAgZm9yIChpID0gZGlzY2FyZE51bWJlciwgaiA9IDA7IGogPCBjb3VudDsgaSsrLCBqKyspIHsKICAgIGNvbnN0IHZhbHVlID0gZGF0YVtpXTsKICAgIGRlY3J5cHRlZFtqXSA9IHZhbHVlIF4gciA+PiA4OwogICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgfQogIHJldHVybiBkZWNyeXB0ZWQ7Cn0KZnVuY3Rpb24gZGVjcnlwdEFzY2lpKGRhdGEsIGtleSwgZGlzY2FyZE51bWJlcikgewogIGNvbnN0IGMxID0gNTI4NDUsCiAgICBjMiA9IDIyNzE5OwogIGxldCByID0ga2V5IHwgMDsKICBjb25zdCBjb3VudCA9IGRhdGEubGVuZ3RoLAogICAgbWF5YmVMZW5ndGggPSBjb3VudCA+Pj4gMTsKICBjb25zdCBkZWNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShtYXliZUxlbmd0aCk7CiAgbGV0IGksIGo7CiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICBjb25zdCBkaWdpdDEgPSBkYXRhW2ldOwogICAgaWYgKCFpc0hleERpZ2l0KGRpZ2l0MSkpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpKys7CiAgICBsZXQgZGlnaXQyOwogICAgd2hpbGUgKGkgPCBjb3VudCAmJiAhaXNIZXhEaWdpdChkaWdpdDIgPSBkYXRhW2ldKSkgewogICAgICBpKys7CiAgICB9CiAgICBpZiAoaSA8IGNvdW50KSB7CiAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoU3RyaW5nLmZyb21DaGFyQ29kZShkaWdpdDEsIGRpZ2l0MiksIDE2KTsKICAgICAgZGVjcnlwdGVkW2orK10gPSB2YWx1ZSBeIHIgPj4gODsKICAgICAgciA9ICh2YWx1ZSArIHIpICogYzEgKyBjMiAmICgxIDw8IDE2KSAtIDE7CiAgICB9CiAgfQogIHJldHVybiBkZWNyeXB0ZWQuc2xpY2UoZGlzY2FyZE51bWJlciwgaik7Cn0KZnVuY3Rpb24gaXNTcGVjaWFsKGMpIHsKICByZXR1cm4gYyA9PT0gMHgyZiB8fCBjID09PSAweDViIHx8IGMgPT09IDB4NWQgfHwgYyA9PT0gMHg3YiB8fCBjID09PSAweDdkIHx8IGMgPT09IDB4MjggfHwgYyA9PT0gMHgyOTsKfQpjbGFzcyBUeXBlMVBhcnNlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBlbmNyeXB0ZWQsIHNlYWNBbmFseXNpc0VuYWJsZWQpIHsKICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgY29uc3QgZGF0YSA9IHN0cmVhbS5nZXRCeXRlcygpOwogICAgICBjb25zdCBpc0JpbmFyeSA9ICEoKGlzSGV4RGlnaXQoZGF0YVswXSkgfHwgKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoZGF0YVswXSkpICYmIGlzSGV4RGlnaXQoZGF0YVsxXSkgJiYgaXNIZXhEaWdpdChkYXRhWzJdKSAmJiBpc0hleERpZ2l0KGRhdGFbM10pICYmIGlzSGV4RGlnaXQoZGF0YVs0XSkgJiYgaXNIZXhEaWdpdChkYXRhWzVdKSAmJiBpc0hleERpZ2l0KGRhdGFbNl0pICYmIGlzSGV4RGlnaXQoZGF0YVs3XSkpOwogICAgICBzdHJlYW0gPSBuZXcgX3N0cmVhbS5TdHJlYW0oaXNCaW5hcnkgPyBkZWNyeXB0KGRhdGEsIEVFWEVDX0VOQ1JZUFRfS0VZLCA0KSA6IGRlY3J5cHRBc2NpaShkYXRhLCBFRVhFQ19FTkNSWVBUX0tFWSwgNCkpOwogICAgfQogICAgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkID0gISFzZWFjQW5hbHlzaXNFbmFibGVkOwogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLm5leHRDaGFyKCk7CiAgfQogIHJlYWROdW1iZXJBcnJheSgpIHsKICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgIGNvbnN0IGFycmF5ID0gW107CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgaWYgKHRva2VuID09PSBudWxsIHx8IHRva2VuID09PSAiXSIgfHwgdG9rZW4gPT09ICJ9IikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGFycmF5LnB1c2gocGFyc2VGbG9hdCh0b2tlbiB8fCAwKSk7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIHJlYWROdW1iZXIoKSB7CiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgIHJldHVybiBwYXJzZUZsb2F0KHRva2VuIHx8IDApOwogIH0KICByZWFkSW50KCkgewogICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICByZXR1cm4gcGFyc2VJbnQodG9rZW4gfHwgMCwgMTApIHwgMDsKICB9CiAgcmVhZEJvb2xlYW4oKSB7CiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgIHJldHVybiB0b2tlbiA9PT0gInRydWUiID8gMSA6IDA7CiAgfQogIG5leHRDaGFyKCkgewogICAgcmV0dXJuIHRoaXMuY3VycmVudENoYXIgPSB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgfQogIHByZXZDaGFyKCkgewogICAgdGhpcy5zdHJlYW0uc2tpcCgtMik7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50Q2hhciA9IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICB9CiAgZ2V0VG9rZW4oKSB7CiAgICBsZXQgY29tbWVudCA9IGZhbHNlOwogICAgbGV0IGNoID0gdGhpcy5jdXJyZW50Q2hhcjsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjaCA9PT0gLTEpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoY29tbWVudCkgewogICAgICAgIGlmIChjaCA9PT0gMHgwYSB8fCBjaCA9PT0gMHgwZCkgewogICAgICAgICAgY29tbWVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyNSkgewogICAgICAgIGNvbW1lbnQgPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKCEoMCwgX2NvcmVfdXRpbHMuaXNXaGl0ZVNwYWNlKShjaCkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0KICAgIGlmIChpc1NwZWNpYWwoY2gpKSB7CiAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgfQogICAgbGV0IHRva2VuID0gIiI7CiAgICBkbyB7CiAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICBjaCA9IHRoaXMubmV4dENoYXIoKTsKICAgIH0gd2hpbGUgKGNoID49IDAgJiYgISgwLCBfY29yZV91dGlscy5pc1doaXRlU3BhY2UpKGNoKSAmJiAhaXNTcGVjaWFsKGNoKSk7CiAgICByZXR1cm4gdG9rZW47CiAgfQogIHJlYWRDaGFyU3RyaW5ncyhieXRlcywgbGVuSVYpIHsKICAgIGlmIChsZW5JViA9PT0gLTEpIHsKICAgICAgcmV0dXJuIGJ5dGVzOwogICAgfQogICAgcmV0dXJuIGRlY3J5cHQoYnl0ZXMsIENIQVJfU1RSU19FTkNSWVBUX0tFWSwgbGVuSVYpOwogIH0KICBleHRyYWN0Rm9udFByb2dyYW0ocHJvcGVydGllcykgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBjb25zdCBzdWJycyA9IFtdLAogICAgICBjaGFyc3RyaW5ncyA9IFtdOwogICAgY29uc3QgcHJpdmF0ZURhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgcHJpdmF0ZURhdGEubGVuSVYgPSA0OwogICAgY29uc3QgcHJvZ3JhbSA9IHsKICAgICAgc3VicnM6IFtdLAogICAgICBjaGFyc3RyaW5nczogW10sCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICBwcml2YXRlRGF0YQogICAgICB9CiAgICB9OwogICAgbGV0IHRva2VuLCBsZW5ndGgsIGRhdGEsIGxlbklWOwogICAgd2hpbGUgKCh0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKSkgIT09IG51bGwpIHsKICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgc3dpdGNoICh0b2tlbikgewogICAgICAgIGNhc2UgIkNoYXJTdHJpbmdzIjoKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICBpZiAodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09ICJlbmQiKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRva2VuICE9PSAiLyIpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBnbHlwaCA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApOwogICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjsKICAgICAgICAgICAgY29uc3QgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTsKICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSAibm9hY2Nlc3MiKSB7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAiLyIpIHsKICAgICAgICAgICAgICB0aGlzLnByZXZDaGFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hhcnN0cmluZ3MucHVzaCh7CiAgICAgICAgICAgICAgZ2x5cGgsCiAgICAgICAgICAgICAgZW5jb2RlZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlN1YnJzIjoKICAgICAgICAgIHRoaXMucmVhZEludCgpOwogICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgd2hpbGUgKHRoaXMuZ2V0VG9rZW4oKSA9PT0gImR1cCIpIHsKICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnJlYWRJbnQoKTsKICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgZGF0YSA9IGxlbmd0aCA+IDAgPyBzdHJlYW0uZ2V0Qnl0ZXMobGVuZ3RoKSA6IG5ldyBVaW50OEFycmF5KDApOwogICAgICAgICAgICBsZW5JViA9IHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YS5sZW5JVjsKICAgICAgICAgICAgY29uc3QgZW5jb2RlZCA9IHRoaXMucmVhZENoYXJTdHJpbmdzKGRhdGEsIGxlbklWKTsKICAgICAgICAgICAgdGhpcy5uZXh0Q2hhcigpOwogICAgICAgICAgICB0b2tlbiA9IHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSAibm9hY2Nlc3MiKSB7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YnJzW2luZGV4XSA9IGVuY29kZWQ7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJCbHVlVmFsdWVzIjoKICAgICAgICBjYXNlICJPdGhlckJsdWVzIjoKICAgICAgICBjYXNlICJGYW1pbHlCbHVlcyI6CiAgICAgICAgY2FzZSAiRmFtaWx5T3RoZXJCbHVlcyI6CiAgICAgICAgICBjb25zdCBibHVlQXJyYXkgPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOwogICAgICAgICAgaWYgKGJsdWVBcnJheS5sZW5ndGggPiAwICYmIGJsdWVBcnJheS5sZW5ndGggJSAyID09PSAwICYmIEhJTlRJTkdfRU5BQkxFRCkgewogICAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gYmx1ZUFycmF5OwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiU3RlbVNuYXBIIjoKICAgICAgICBjYXNlICJTdGVtU25hcFYiOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlckFycmF5KCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTdGRIVyI6CiAgICAgICAgY2FzZSAiU3RkVlciOgogICAgICAgICAgcHJvZ3JhbS5wcm9wZXJ0aWVzLnByaXZhdGVEYXRhW3Rva2VuXSA9IHRoaXMucmVhZE51bWJlckFycmF5KClbMF07CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJCbHVlU2hpZnQiOgogICAgICAgIGNhc2UgImxlbklWIjoKICAgICAgICBjYXNlICJCbHVlRnV6eiI6CiAgICAgICAgY2FzZSAiQmx1ZVNjYWxlIjoKICAgICAgICBjYXNlICJMYW5ndWFnZUdyb3VwIjoKICAgICAgICAgIHByb2dyYW0ucHJvcGVydGllcy5wcml2YXRlRGF0YVt0b2tlbl0gPSB0aGlzLnJlYWROdW1iZXIoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkV4cGFuc2lvbkZhY3RvciI6CiAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkTnVtYmVyKCkgfHwgMC4wNjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkZvcmNlQm9sZCI6CiAgICAgICAgICBwcm9ncmFtLnByb3BlcnRpZXMucHJpdmF0ZURhdGFbdG9rZW5dID0gdGhpcy5yZWFkQm9vbGVhbigpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgewogICAgICBlbmNvZGVkLAogICAgICBnbHlwaAogICAgfSBvZiBjaGFyc3RyaW5ncykgewogICAgICBjb25zdCBjaGFyU3RyaW5nID0gbmV3IFR5cGUxQ2hhclN0cmluZygpOwogICAgICBjb25zdCBlcnJvciA9IGNoYXJTdHJpbmcuY29udmVydChlbmNvZGVkLCBzdWJycywgdGhpcy5zZWFjQW5hbHlzaXNFbmFibGVkKTsKICAgICAgbGV0IG91dHB1dCA9IGNoYXJTdHJpbmcub3V0cHV0OwogICAgICBpZiAoZXJyb3IpIHsKICAgICAgICBvdXRwdXQgPSBbMTRdOwogICAgICB9CiAgICAgIGNvbnN0IGNoYXJTdHJpbmdPYmplY3QgPSB7CiAgICAgICAgZ2x5cGhOYW1lOiBnbHlwaCwKICAgICAgICBjaGFyc3RyaW5nOiBvdXRwdXQsCiAgICAgICAgd2lkdGg6IGNoYXJTdHJpbmcud2lkdGgsCiAgICAgICAgbHNiOiBjaGFyU3RyaW5nLmxzYiwKICAgICAgICBzZWFjOiBjaGFyU3RyaW5nLnNlYWMKICAgICAgfTsKICAgICAgaWYgKGdseXBoID09PSAiLm5vdGRlZiIpIHsKICAgICAgICBwcm9ncmFtLmNoYXJzdHJpbmdzLnVuc2hpZnQoY2hhclN0cmluZ09iamVjdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvZ3JhbS5jaGFyc3RyaW5ncy5wdXNoKGNoYXJTdHJpbmdPYmplY3QpOwogICAgICB9CiAgICAgIGlmIChwcm9wZXJ0aWVzLmJ1aWx0SW5FbmNvZGluZykgewogICAgICAgIGNvbnN0IGluZGV4ID0gcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcuaW5kZXhPZihnbHlwaCk7CiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgcHJvcGVydGllcy53aWR0aHNbaW5kZXhdID09PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gcHJvcGVydGllcy5maXJzdENoYXIgJiYgaW5kZXggPD0gcHJvcGVydGllcy5sYXN0Q2hhcikgewogICAgICAgICAgcHJvcGVydGllcy53aWR0aHNbaW5kZXhdID0gY2hhclN0cmluZy53aWR0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9ncmFtOwogIH0KICBleHRyYWN0Rm9udEhlYWRlcihwcm9wZXJ0aWVzKSB7CiAgICBsZXQgdG9rZW47CiAgICB3aGlsZSAoKHRva2VuID0gdGhpcy5nZXRUb2tlbigpKSAhPT0gbnVsbCkgewogICAgICBpZiAodG9rZW4gIT09ICIvIikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICBzd2l0Y2ggKHRva2VuKSB7CiAgICAgICAgY2FzZSAiRm9udE1hdHJpeCI6CiAgICAgICAgICBjb25zdCBtYXRyaXggPSB0aGlzLnJlYWROdW1iZXJBcnJheSgpOwogICAgICAgICAgcHJvcGVydGllcy5mb250TWF0cml4ID0gbWF0cml4OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRW5jb2RpbmciOgogICAgICAgICAgY29uc3QgZW5jb2RpbmdBcmcgPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICBsZXQgZW5jb2Rpbmc7CiAgICAgICAgICBpZiAoIS9eXGQrJC8udGVzdChlbmNvZGluZ0FyZykpIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSAoMCwgX2VuY29kaW5ncy5nZXRFbmNvZGluZykoZW5jb2RpbmdBcmcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZW5jb2RpbmcgPSBbXTsKICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHBhcnNlSW50KGVuY29kaW5nQXJnLCAxMCkgfCAwOwogICAgICAgICAgICB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CiAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmdldFRva2VuKCk7CiAgICAgICAgICAgICAgd2hpbGUgKHRva2VuICE9PSAiZHVwIiAmJiB0b2tlbiAhPT0gImRlZiIpIHsKICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgICAgaWYgKHRva2VuID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHRva2VuID09PSAiZGVmIikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yZWFkSW50KCk7CiAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gdGhpcy5nZXRUb2tlbigpOwogICAgICAgICAgICAgIGVuY29kaW5nW2luZGV4XSA9IGdseXBoOwogICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHJvcGVydGllcy5idWlsdEluRW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkZvbnRCQm94IjoKICAgICAgICAgIGNvbnN0IGZvbnRCQm94ID0gdGhpcy5yZWFkTnVtYmVyQXJyYXkoKTsKICAgICAgICAgIHByb3BlcnRpZXMuYXNjZW50ID0gTWF0aC5tYXgoZm9udEJCb3hbM10sIGZvbnRCQm94WzFdKTsKICAgICAgICAgIHByb3BlcnRpZXMuZGVzY2VudCA9IE1hdGgubWluKGZvbnRCQm94WzFdLCBmb250QkJveFszXSk7CiAgICAgICAgICBwcm9wZXJ0aWVzLmFzY2VudFNjYWxlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQpleHBvcnRzLlR5cGUxUGFyc2VyID0gVHlwZTFQYXJzZXI7CgovKioqLyB9KSwKLyogNTAgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5QYXR0ZXJuID0gdm9pZCAwOwpleHBvcnRzLmdldFRpbGluZ1BhdHRlcm5JUiA9IGdldFRpbGluZ1BhdHRlcm5JUjsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfY29sb3JzcGFjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwpjb25zdCBTaGFkaW5nVHlwZSA9IHsKICBGVU5DVElPTl9CQVNFRDogMSwKICBBWElBTDogMiwKICBSQURJQUw6IDMsCiAgRlJFRV9GT1JNX01FU0g6IDQsCiAgTEFUVElDRV9GT1JNX01FU0g6IDUsCiAgQ09PTlNfUEFUQ0hfTUVTSDogNiwKICBURU5TT1JfUEFUQ0hfTUVTSDogNwp9OwpjbGFzcyBQYXR0ZXJuIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIFBhdHRlcm4uIik7CiAgfQogIHN0YXRpYyBwYXJzZVNoYWRpbmcoc2hhZGluZywgeHJlZiwgcmVzLCBwZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKSB7CiAgICBjb25zdCBkaWN0ID0gc2hhZGluZyBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtID8gc2hhZGluZy5kaWN0IDogc2hhZGluZzsKICAgIGNvbnN0IHR5cGUgPSBkaWN0LmdldCgiU2hhZGluZ1R5cGUiKTsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuQVhJQUw6CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5SQURJQUw6CiAgICAgICAgICByZXR1cm4gbmV3IFJhZGlhbEF4aWFsU2hhZGluZyhkaWN0LCB4cmVmLCByZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpOwogICAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5MQVRUSUNFX0ZPUk1fTUVTSDoKICAgICAgICBjYXNlIFNoYWRpbmdUeXBlLkNPT05TX1BBVENIX01FU0g6CiAgICAgICAgY2FzZSBTaGFkaW5nVHlwZS5URU5TT1JfUEFUQ0hfTUVTSDoKICAgICAgICAgIHJldHVybiBuZXcgTWVzaFNoYWRpbmcoc2hhZGluZywgeHJlZiwgcmVzLCBwZGZGdW5jdGlvbkZhY3RvcnksIGxvY2FsQ29sb3JTcGFjZUNhY2hlKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbnN1cHBvcnRlZCBTaGFkaW5nVHlwZTogIiArIHR5cGUpOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKShleCk7CiAgICAgIHJldHVybiBuZXcgRHVtbXlTaGFkaW5nKCk7CiAgICB9CiAgfQp9CmV4cG9ydHMuUGF0dGVybiA9IFBhdHRlcm47CmNsYXNzIEJhc2VTaGFkaW5nIHsKICBzdGF0aWMgU01BTExfTlVNQkVSID0gMWUtNjsKICBjb25zdHJ1Y3RvcigpIHsKICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU2hhZGluZykgewogICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU2hhZGluZy4iKTsKICAgIH0KICB9CiAgZ2V0SVIoKSB7CiAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJBYnN0cmFjdCBtZXRob2QgYGdldElSYCBjYWxsZWQuIik7CiAgfQp9CmNsYXNzIFJhZGlhbEF4aWFsU2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBjb25zdHJ1Y3RvcihkaWN0LCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLmNvb3Jkc0FyciA9IGRpY3QuZ2V0QXJyYXkoIkNvb3JkcyIpOwogICAgdGhpcy5zaGFkaW5nVHlwZSA9IGRpY3QuZ2V0KCJTaGFkaW5nVHlwZSIpOwogICAgY29uc3QgY3MgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnBhcnNlKHsKICAgICAgY3M6IGRpY3QuZ2V0UmF3KCJDUyIpIHx8IGRpY3QuZ2V0UmF3KCJDb2xvclNwYWNlIiksCiAgICAgIHhyZWYsCiAgICAgIHJlc291cmNlcywKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgICBjb25zdCBiYm94ID0gZGljdC5nZXRBcnJheSgiQkJveCIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHsKICAgICAgdGhpcy5iYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGJib3gpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5iYm94ID0gbnVsbDsKICAgIH0KICAgIGxldCB0MCA9IDAuMCwKICAgICAgdDEgPSAxLjA7CiAgICBpZiAoZGljdC5oYXMoIkRvbWFpbiIpKSB7CiAgICAgIGNvbnN0IGRvbWFpbkFyciA9IGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpOwogICAgICB0MCA9IGRvbWFpbkFyclswXTsKICAgICAgdDEgPSBkb21haW5BcnJbMV07CiAgICB9CiAgICBsZXQgZXh0ZW5kU3RhcnQgPSBmYWxzZSwKICAgICAgZXh0ZW5kRW5kID0gZmFsc2U7CiAgICBpZiAoZGljdC5oYXMoIkV4dGVuZCIpKSB7CiAgICAgIGNvbnN0IGV4dGVuZEFyciA9IGRpY3QuZ2V0QXJyYXkoIkV4dGVuZCIpOwogICAgICBleHRlbmRTdGFydCA9IGV4dGVuZEFyclswXTsKICAgICAgZXh0ZW5kRW5kID0gZXh0ZW5kQXJyWzFdOwogICAgfQogICAgaWYgKHRoaXMuc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCAmJiAoIWV4dGVuZFN0YXJ0IHx8ICFleHRlbmRFbmQpKSB7CiAgICAgIGNvbnN0IFt4MSwgeTEsIHIxLCB4MiwgeTIsIHIyXSA9IHRoaXMuY29vcmRzQXJyOwogICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguaHlwb3QoeDEgLSB4MiwgeTEgLSB5Mik7CiAgICAgIGlmIChyMSA8PSByMiArIGRpc3RhbmNlICYmIHIyIDw9IHIxICsgZGlzdGFuY2UpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIHJhZGlhbCBncmFkaWVudC4iKTsKICAgICAgfQogICAgfQogICAgdGhpcy5leHRlbmRTdGFydCA9IGV4dGVuZFN0YXJ0OwogICAgdGhpcy5leHRlbmRFbmQgPSBleHRlbmRFbmQ7CiAgICBjb25zdCBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOwogICAgY29uc3QgZm4gPSBwZGZGdW5jdGlvbkZhY3RvcnkuY3JlYXRlRnJvbUFycmF5KGZuT2JqKTsKICAgIGNvbnN0IE5VTUJFUl9PRl9TQU1QTEVTID0gODQwOwogICAgY29uc3Qgc3RlcCA9ICh0MSAtIHQwKSAvIE5VTUJFUl9PRl9TQU1QTEVTOwogICAgY29uc3QgY29sb3JTdG9wcyA9IHRoaXMuY29sb3JTdG9wcyA9IFtdOwogICAgaWYgKHQwID49IHQxIHx8IHN0ZXAgPD0gMCkgewogICAgICAoMCwgX3V0aWwuaW5mbykoIkJhZCBzaGFkaW5nIGRvbWFpbi4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY29sb3IgPSBuZXcgRmxvYXQzMkFycmF5KGNzLm51bUNvbXBzKSwKICAgICAgcmF0aW8gPSBuZXcgRmxvYXQzMkFycmF5KDEpOwogICAgbGV0IHJnYkNvbG9yOwogICAgbGV0IGlCYXNlID0gMDsKICAgIHJhdGlvWzBdID0gdDA7CiAgICBmbihyYXRpbywgMCwgY29sb3IsIDApOwogICAgbGV0IHJnYkJhc2UgPSBjcy5nZXRSZ2IoY29sb3IsIDApOwogICAgY29uc3QgY3NzQ29sb3JCYXNlID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IocmdiQmFzZVswXSwgcmdiQmFzZVsxXSwgcmdiQmFzZVsyXSk7CiAgICBjb2xvclN0b3BzLnB1c2goWzAsIGNzc0NvbG9yQmFzZV0pOwogICAgbGV0IGlQcmV2ID0gMTsKICAgIHJhdGlvWzBdID0gdDAgKyBzdGVwOwogICAgZm4ocmF0aW8sIDAsIGNvbG9yLCAwKTsKICAgIGxldCByZ2JQcmV2ID0gY3MuZ2V0UmdiKGNvbG9yLCAwKTsKICAgIGxldCBtYXhTbG9wZVIgPSByZ2JQcmV2WzBdIC0gcmdiQmFzZVswXSArIDE7CiAgICBsZXQgbWF4U2xvcGVHID0gcmdiUHJldlsxXSAtIHJnYkJhc2VbMV0gKyAxOwogICAgbGV0IG1heFNsb3BlQiA9IHJnYlByZXZbMl0gLSByZ2JCYXNlWzJdICsgMTsKICAgIGxldCBtaW5TbG9wZVIgPSByZ2JQcmV2WzBdIC0gcmdiQmFzZVswXSAtIDE7CiAgICBsZXQgbWluU2xvcGVHID0gcmdiUHJldlsxXSAtIHJnYkJhc2VbMV0gLSAxOwogICAgbGV0IG1pblNsb3BlQiA9IHJnYlByZXZbMl0gLSByZ2JCYXNlWzJdIC0gMTsKICAgIGZvciAobGV0IGkgPSAyOyBpIDwgTlVNQkVSX09GX1NBTVBMRVM7IGkrKykgewogICAgICByYXRpb1swXSA9IHQwICsgaSAqIHN0ZXA7CiAgICAgIGZuKHJhdGlvLCAwLCBjb2xvciwgMCk7CiAgICAgIHJnYkNvbG9yID0gY3MuZ2V0UmdiKGNvbG9yLCAwKTsKICAgICAgY29uc3QgcnVuID0gaSAtIGlCYXNlOwogICAgICBtYXhTbG9wZVIgPSBNYXRoLm1pbihtYXhTbG9wZVIsIChyZ2JDb2xvclswXSAtIHJnYkJhc2VbMF0gKyAxKSAvIHJ1bik7CiAgICAgIG1heFNsb3BlRyA9IE1hdGgubWluKG1heFNsb3BlRywgKHJnYkNvbG9yWzFdIC0gcmdiQmFzZVsxXSArIDEpIC8gcnVuKTsKICAgICAgbWF4U2xvcGVCID0gTWF0aC5taW4obWF4U2xvcGVCLCAocmdiQ29sb3JbMl0gLSByZ2JCYXNlWzJdICsgMSkgLyBydW4pOwogICAgICBtaW5TbG9wZVIgPSBNYXRoLm1heChtaW5TbG9wZVIsIChyZ2JDb2xvclswXSAtIHJnYkJhc2VbMF0gLSAxKSAvIHJ1bik7CiAgICAgIG1pblNsb3BlRyA9IE1hdGgubWF4KG1pblNsb3BlRywgKHJnYkNvbG9yWzFdIC0gcmdiQmFzZVsxXSAtIDEpIC8gcnVuKTsKICAgICAgbWluU2xvcGVCID0gTWF0aC5tYXgobWluU2xvcGVCLCAocmdiQ29sb3JbMl0gLSByZ2JCYXNlWzJdIC0gMSkgLyBydW4pOwogICAgICBjb25zdCBzbG9wZXNFeGlzdCA9IG1pblNsb3BlUiA8PSBtYXhTbG9wZVIgJiYgbWluU2xvcGVHIDw9IG1heFNsb3BlRyAmJiBtaW5TbG9wZUIgPD0gbWF4U2xvcGVCOwogICAgICBpZiAoIXNsb3Blc0V4aXN0KSB7CiAgICAgICAgY29uc3QgY3NzQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvcihyZ2JQcmV2WzBdLCByZ2JQcmV2WzFdLCByZ2JQcmV2WzJdKTsKICAgICAgICBjb2xvclN0b3BzLnB1c2goW2lQcmV2IC8gTlVNQkVSX09GX1NBTVBMRVMsIGNzc0NvbG9yXSk7CiAgICAgICAgbWF4U2xvcGVSID0gcmdiQ29sb3JbMF0gLSByZ2JQcmV2WzBdICsgMTsKICAgICAgICBtYXhTbG9wZUcgPSByZ2JDb2xvclsxXSAtIHJnYlByZXZbMV0gKyAxOwogICAgICAgIG1heFNsb3BlQiA9IHJnYkNvbG9yWzJdIC0gcmdiUHJldlsyXSArIDE7CiAgICAgICAgbWluU2xvcGVSID0gcmdiQ29sb3JbMF0gLSByZ2JQcmV2WzBdIC0gMTsKICAgICAgICBtaW5TbG9wZUcgPSByZ2JDb2xvclsxXSAtIHJnYlByZXZbMV0gLSAxOwogICAgICAgIG1pblNsb3BlQiA9IHJnYkNvbG9yWzJdIC0gcmdiUHJldlsyXSAtIDE7CiAgICAgICAgaUJhc2UgPSBpUHJldjsKICAgICAgICByZ2JCYXNlID0gcmdiUHJldjsKICAgICAgfQogICAgICBpUHJldiA9IGk7CiAgICAgIHJnYlByZXYgPSByZ2JDb2xvcjsKICAgIH0KICAgIGNvbnN0IGNzc0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IocmdiUHJldlswXSwgcmdiUHJldlsxXSwgcmdiUHJldlsyXSk7CiAgICBjb2xvclN0b3BzLnB1c2goWzEsIGNzc0NvbG9yXSk7CiAgICBsZXQgYmFja2dyb3VuZCA9ICJ0cmFuc3BhcmVudCI7CiAgICBpZiAoZGljdC5oYXMoIkJhY2tncm91bmQiKSkgewogICAgICByZ2JDb2xvciA9IGNzLmdldFJnYihkaWN0LmdldCgiQmFja2dyb3VuZCIpLCAwKTsKICAgICAgYmFja2dyb3VuZCA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKHJnYkNvbG9yWzBdLCByZ2JDb2xvclsxXSwgcmdiQ29sb3JbMl0pOwogICAgfQogICAgaWYgKCFleHRlbmRTdGFydCkgewogICAgICBjb2xvclN0b3BzLnVuc2hpZnQoWzAsIGJhY2tncm91bmRdKTsKICAgICAgY29sb3JTdG9wc1sxXVswXSArPSBCYXNlU2hhZGluZy5TTUFMTF9OVU1CRVI7CiAgICB9CiAgICBpZiAoIWV4dGVuZEVuZCkgewogICAgICBjb2xvclN0b3BzLmF0KC0xKVswXSAtPSBCYXNlU2hhZGluZy5TTUFMTF9OVU1CRVI7CiAgICAgIGNvbG9yU3RvcHMucHVzaChbMSwgYmFja2dyb3VuZF0pOwogICAgfQogICAgdGhpcy5jb2xvclN0b3BzID0gY29sb3JTdG9wczsKICB9CiAgZ2V0SVIoKSB7CiAgICBjb25zdCBjb29yZHNBcnIgPSB0aGlzLmNvb3Jkc0FycjsKICAgIGNvbnN0IHNoYWRpbmdUeXBlID0gdGhpcy5zaGFkaW5nVHlwZTsKICAgIGxldCB0eXBlLCBwMCwgcDEsIHIwLCByMTsKICAgIGlmIChzaGFkaW5nVHlwZSA9PT0gU2hhZGluZ1R5cGUuQVhJQUwpIHsKICAgICAgcDAgPSBbY29vcmRzQXJyWzBdLCBjb29yZHNBcnJbMV1dOwogICAgICBwMSA9IFtjb29yZHNBcnJbMl0sIGNvb3Jkc0FyclszXV07CiAgICAgIHIwID0gbnVsbDsKICAgICAgcjEgPSBudWxsOwogICAgICB0eXBlID0gImF4aWFsIjsKICAgIH0gZWxzZSBpZiAoc2hhZGluZ1R5cGUgPT09IFNoYWRpbmdUeXBlLlJBRElBTCkgewogICAgICBwMCA9IFtjb29yZHNBcnJbMF0sIGNvb3Jkc0FyclsxXV07CiAgICAgIHAxID0gW2Nvb3Jkc0FyclszXSwgY29vcmRzQXJyWzRdXTsKICAgICAgcjAgPSBjb29yZHNBcnJbMl07CiAgICAgIHIxID0gY29vcmRzQXJyWzVdOwogICAgICB0eXBlID0gInJhZGlhbCI7CiAgICB9IGVsc2UgewogICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKGBnZXRQYXR0ZXJuIHR5cGUgdW5rbm93bjogJHtzaGFkaW5nVHlwZX1gKTsKICAgIH0KICAgIHJldHVybiBbIlJhZGlhbEF4aWFsIiwgdHlwZSwgdGhpcy5iYm94LCB0aGlzLmNvbG9yU3RvcHMsIHAwLCBwMSwgcjAsIHIxXTsKICB9Cn0KY2xhc3MgTWVzaFN0cmVhbVJlYWRlciB7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCBjb250ZXh0KSB7CiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICB0aGlzLmJ1ZmZlciA9IDA7CiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IDA7CiAgICBjb25zdCBudW1Db21wcyA9IGNvbnRleHQubnVtQ29tcHM7CiAgICB0aGlzLnRtcENvbXBzQnVmID0gbmV3IEZsb2F0MzJBcnJheShudW1Db21wcyk7CiAgICBjb25zdCBjc051bUNvbXBzID0gY29udGV4dC5jb2xvclNwYWNlLm51bUNvbXBzOwogICAgdGhpcy50bXBDc0NvbXBzQnVmID0gY29udGV4dC5jb2xvckZuID8gbmV3IEZsb2F0MzJBcnJheShjc051bUNvbXBzKSA6IHRoaXMudG1wQ29tcHNCdWY7CiAgfQogIGdldCBoYXNEYXRhKCkgewogICAgaWYgKHRoaXMuc3RyZWFtLmVuZCkgewogICAgICByZXR1cm4gdGhpcy5zdHJlYW0ucG9zIDwgdGhpcy5zdHJlYW0uZW5kOwogICAgfQogICAgaWYgKHRoaXMuYnVmZmVyTGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IG5leHRCeXRlID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogICAgaWYgKG5leHRCeXRlIDwgMCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSA4OwogICAgcmV0dXJuIHRydWU7CiAgfQogIHJlYWRCaXRzKG4pIHsKICAgIGxldCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlckxlbmd0aDsKICAgIGlmIChuID09PSAzMikgewogICAgICBpZiAoYnVmZmVyTGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMjQgfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgMTYgfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCkgPDwgOCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKSkgPj4+IDA7CiAgICAgIH0KICAgICAgYnVmZmVyID0gYnVmZmVyIDw8IDI0IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDE2IHwgdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpIDw8IDggfCB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgICAgIGNvbnN0IG5leHRCeXRlID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICB0aGlzLmJ1ZmZlciA9IG5leHRCeXRlICYgKDEgPDwgYnVmZmVyTGVuZ3RoKSAtIDE7CiAgICAgIHJldHVybiAoYnVmZmVyIDw8IDggLSBidWZmZXJMZW5ndGggfCAobmV4dEJ5dGUgJiAweGZmKSA+PiBidWZmZXJMZW5ndGgpID4+PiAwOwogICAgfQogICAgaWYgKG4gPT09IDggJiYgYnVmZmVyTGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5nZXRCeXRlKCk7CiAgICB9CiAgICB3aGlsZSAoYnVmZmVyTGVuZ3RoIDwgbikgewogICAgICBidWZmZXIgPSBidWZmZXIgPDwgOCB8IHRoaXMuc3RyZWFtLmdldEJ5dGUoKTsKICAgICAgYnVmZmVyTGVuZ3RoICs9IDg7CiAgICB9CiAgICBidWZmZXJMZW5ndGggLT0gbjsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgdGhpcy5idWZmZXIgPSBidWZmZXIgJiAoMSA8PCBidWZmZXJMZW5ndGgpIC0gMTsKICAgIHJldHVybiBidWZmZXIgPj4gYnVmZmVyTGVuZ3RoOwogIH0KICBhbGlnbigpIHsKICAgIHRoaXMuYnVmZmVyID0gMDsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKICB9CiAgcmVhZEZsYWcoKSB7CiAgICByZXR1cm4gdGhpcy5yZWFkQml0cyh0aGlzLmNvbnRleHQuYml0c1BlckZsYWcpOwogIH0KICByZWFkQ29vcmRpbmF0ZSgpIHsKICAgIGNvbnN0IGJpdHNQZXJDb29yZGluYXRlID0gdGhpcy5jb250ZXh0LmJpdHNQZXJDb29yZGluYXRlOwogICAgY29uc3QgeGkgPSB0aGlzLnJlYWRCaXRzKGJpdHNQZXJDb29yZGluYXRlKTsKICAgIGNvbnN0IHlpID0gdGhpcy5yZWFkQml0cyhiaXRzUGVyQ29vcmRpbmF0ZSk7CiAgICBjb25zdCBkZWNvZGUgPSB0aGlzLmNvbnRleHQuZGVjb2RlOwogICAgY29uc3Qgc2NhbGUgPSBiaXRzUGVyQ29vcmRpbmF0ZSA8IDMyID8gMSAvICgoMSA8PCBiaXRzUGVyQ29vcmRpbmF0ZSkgLSAxKSA6IDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7CiAgICByZXR1cm4gW3hpICogc2NhbGUgKiAoZGVjb2RlWzFdIC0gZGVjb2RlWzBdKSArIGRlY29kZVswXSwgeWkgKiBzY2FsZSAqIChkZWNvZGVbM10gLSBkZWNvZGVbMl0pICsgZGVjb2RlWzJdXTsKICB9CiAgcmVhZENvbXBvbmVudHMoKSB7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMuY29udGV4dC5udW1Db21wczsKICAgIGNvbnN0IGJpdHNQZXJDb21wb25lbnQgPSB0aGlzLmNvbnRleHQuYml0c1BlckNvbXBvbmVudDsKICAgIGNvbnN0IHNjYWxlID0gYml0c1BlckNvbXBvbmVudCA8IDMyID8gMSAvICgoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDEpIDogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsKICAgIGNvbnN0IGRlY29kZSA9IHRoaXMuY29udGV4dC5kZWNvZGU7CiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy50bXBDb21wc0J1ZjsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gNDsgaSA8IG51bUNvbXBzOyBpKyssIGogKz0gMikgewogICAgICBjb25zdCBjaSA9IHRoaXMucmVhZEJpdHMoYml0c1BlckNvbXBvbmVudCk7CiAgICAgIGNvbXBvbmVudHNbaV0gPSBjaSAqIHNjYWxlICogKGRlY29kZVtqICsgMV0gLSBkZWNvZGVbal0pICsgZGVjb2RlW2pdOwogICAgfQogICAgY29uc3QgY29sb3IgPSB0aGlzLnRtcENzQ29tcHNCdWY7CiAgICBpZiAodGhpcy5jb250ZXh0LmNvbG9yRm4pIHsKICAgICAgdGhpcy5jb250ZXh0LmNvbG9yRm4oY29tcG9uZW50cywgMCwgY29sb3IsIDApOwogICAgfQogICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb2xvclNwYWNlLmdldFJnYihjb2xvciwgMCk7CiAgfQp9CmNvbnN0IGdldEIgPSBmdW5jdGlvbiBnZXRCQ2xvc3VyZSgpIHsKICBmdW5jdGlvbiBidWlsZEIoY291bnQpIHsKICAgIGNvbnN0IGx1dCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykgewogICAgICBjb25zdCB0ID0gaSAvIGNvdW50LAogICAgICAgIHRfID0gMSAtIHQ7CiAgICAgIGx1dC5wdXNoKG5ldyBGbG9hdDMyQXJyYXkoW3RfICogdF8gKiB0XywgMyAqIHQgKiB0XyAqIHRfLCAzICogdCAqIHQgKiB0XywgdCAqIHQgKiB0XSkpOwogICAgfQogICAgcmV0dXJuIGx1dDsKICB9CiAgY29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIHJldHVybiBmdW5jdGlvbiAoY291bnQpIHsKICAgIHJldHVybiBjYWNoZVtjb3VudF0gfHw9IGJ1aWxkQihjb3VudCk7CiAgfTsKfSgpOwpjbGFzcyBNZXNoU2hhZGluZyBleHRlbmRzIEJhc2VTaGFkaW5nIHsKICBzdGF0aWMgTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQgPSAzOwogIHN0YXRpYyBNQVhfU1BMSVRfUEFUQ0hfQ0hVTktTX0FNT1VOVCA9IDIwOwogIHN0YXRpYyBUUklBTkdMRV9ERU5TSVRZID0gMjA7CiAgY29uc3RydWN0b3Ioc3RyZWFtLCB4cmVmLCByZXNvdXJjZXMsIHBkZkZ1bmN0aW9uRmFjdG9yeSwgbG9jYWxDb2xvclNwYWNlQ2FjaGUpIHsKICAgIHN1cGVyKCk7CiAgICBpZiAoIShzdHJlYW0gaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJNZXNoIGRhdGEgaXMgbm90IGEgc3RyZWFtIik7CiAgICB9CiAgICBjb25zdCBkaWN0ID0gc3RyZWFtLmRpY3Q7CiAgICB0aGlzLnNoYWRpbmdUeXBlID0gZGljdC5nZXQoIlNoYWRpbmdUeXBlIik7CiAgICBjb25zdCBiYm94ID0gZGljdC5nZXRBcnJheSgiQkJveCIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoYmJveCkgJiYgYmJveC5sZW5ndGggPT09IDQpIHsKICAgICAgdGhpcy5iYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGJib3gpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5iYm94ID0gbnVsbDsKICAgIH0KICAgIGNvbnN0IGNzID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CiAgICAgIGNzOiBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpLAogICAgICB4cmVmLAogICAgICByZXNvdXJjZXMsCiAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgIH0pOwogICAgdGhpcy5iYWNrZ3JvdW5kID0gZGljdC5oYXMoIkJhY2tncm91bmQiKSA/IGNzLmdldFJnYihkaWN0LmdldCgiQmFja2dyb3VuZCIpLCAwKSA6IG51bGw7CiAgICBjb25zdCBmbk9iaiA9IGRpY3QuZ2V0UmF3KCJGdW5jdGlvbiIpOwogICAgY29uc3QgZm4gPSBmbk9iaiA/IHBkZkZ1bmN0aW9uRmFjdG9yeS5jcmVhdGVGcm9tQXJyYXkoZm5PYmopIDogbnVsbDsKICAgIHRoaXMuY29vcmRzID0gW107CiAgICB0aGlzLmNvbG9ycyA9IFtdOwogICAgdGhpcy5maWd1cmVzID0gW107CiAgICBjb25zdCBkZWNvZGVDb250ZXh0ID0gewogICAgICBiaXRzUGVyQ29vcmRpbmF0ZTogZGljdC5nZXQoIkJpdHNQZXJDb29yZGluYXRlIiksCiAgICAgIGJpdHNQZXJDb21wb25lbnQ6IGRpY3QuZ2V0KCJCaXRzUGVyQ29tcG9uZW50IiksCiAgICAgIGJpdHNQZXJGbGFnOiBkaWN0LmdldCgiQml0c1BlckZsYWciKSwKICAgICAgZGVjb2RlOiBkaWN0LmdldEFycmF5KCJEZWNvZGUiKSwKICAgICAgY29sb3JGbjogZm4sCiAgICAgIGNvbG9yU3BhY2U6IGNzLAogICAgICBudW1Db21wczogZm4gPyAxIDogY3MubnVtQ29tcHMKICAgIH07CiAgICBjb25zdCByZWFkZXIgPSBuZXcgTWVzaFN0cmVhbVJlYWRlcihzdHJlYW0sIGRlY29kZUNvbnRleHQpOwogICAgbGV0IHBhdGNoTWVzaCA9IGZhbHNlOwogICAgc3dpdGNoICh0aGlzLnNoYWRpbmdUeXBlKSB7CiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuRlJFRV9GT1JNX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTRTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuTEFUVElDRV9GT1JNX01FU0g6CiAgICAgICAgY29uc3QgdmVydGljZXNQZXJSb3cgPSBkaWN0LmdldCgiVmVydGljZXNQZXJSb3ciKSB8IDA7CiAgICAgICAgaWYgKHZlcnRpY2VzUGVyUm93IDwgMikgewogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFZlcnRpY2VzUGVyUm93Iik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2RlY29kZVR5cGU1U2hhZGluZyhyZWFkZXIsIHZlcnRpY2VzUGVyUm93KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTaGFkaW5nVHlwZS5DT09OU19QQVRDSF9NRVNIOgogICAgICAgIHRoaXMuX2RlY29kZVR5cGU2U2hhZGluZyhyZWFkZXIpOwogICAgICAgIHBhdGNoTWVzaCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU2hhZGluZ1R5cGUuVEVOU09SX1BBVENIX01FU0g6CiAgICAgICAgdGhpcy5fZGVjb2RlVHlwZTdTaGFkaW5nKHJlYWRlcik7CiAgICAgICAgcGF0Y2hNZXNoID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJVbnN1cHBvcnRlZCBtZXNoIHR5cGUuIik7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGF0Y2hNZXNoKSB7CiAgICAgIHRoaXMuX3VwZGF0ZUJvdW5kcygpOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLmZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIHRoaXMuX2J1aWxkRmlndXJlRnJvbVBhdGNoKGkpOwogICAgICB9CiAgICB9CiAgICB0aGlzLl91cGRhdGVCb3VuZHMoKTsKICAgIHRoaXMuX3BhY2tEYXRhKCk7CiAgfQogIF9kZWNvZGVUeXBlNFNoYWRpbmcocmVhZGVyKSB7CiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmNvb3JkczsKICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuY29sb3JzOwogICAgY29uc3Qgb3BlcmF0b3JzID0gW107CiAgICBjb25zdCBwcyA9IFtdOwogICAgbGV0IHZlcnRpY2VzTGVmdCA9IDA7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBjb25zdCBjb29yZCA9IHJlYWRlci5yZWFkQ29vcmRpbmF0ZSgpOwogICAgICBjb25zdCBjb2xvciA9IHJlYWRlci5yZWFkQ29tcG9uZW50cygpOwogICAgICBpZiAodmVydGljZXNMZWZ0ID09PSAwKSB7CiAgICAgICAgaWYgKCEoMCA8PSBmICYmIGYgPD0gMikpIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNCBmbGFnIik7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoZikgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICB2ZXJ0aWNlc0xlZnQgPSAzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcHMucHVzaChwcy5hdCgtMiksIHBzLmF0KC0xKSk7CiAgICAgICAgICAgIHZlcnRpY2VzTGVmdCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBwcy5wdXNoKHBzLmF0KC0zKSwgcHMuYXQoLTEpKTsKICAgICAgICAgICAgdmVydGljZXNMZWZ0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG9wZXJhdG9ycy5wdXNoKGYpOwogICAgICB9CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgICB2ZXJ0aWNlc0xlZnQtLTsKICAgICAgcmVhZGVyLmFsaWduKCk7CiAgICB9CiAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgIHR5cGU6ICJ0cmlhbmdsZXMiLAogICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgY29sb3JzOiBuZXcgSW50MzJBcnJheShwcykKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTVTaGFkaW5nKHJlYWRlciwgdmVydGljZXNQZXJSb3cpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IFtdOwogICAgd2hpbGUgKHJlYWRlci5oYXNEYXRhKSB7CiAgICAgIGNvbnN0IGNvb3JkID0gcmVhZGVyLnJlYWRDb29yZGluYXRlKCk7CiAgICAgIGNvbnN0IGNvbG9yID0gcmVhZGVyLnJlYWRDb21wb25lbnRzKCk7CiAgICAgIHBzLnB1c2goY29vcmRzLmxlbmd0aCk7CiAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTsKICAgICAgY29sb3JzLnB1c2goY29sb3IpOwogICAgfQogICAgdGhpcy5maWd1cmVzLnB1c2goewogICAgICB0eXBlOiAibGF0dGljZSIsCiAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgdmVydGljZXNQZXJSb3cKICAgIH0pOwogIH0KICBfZGVjb2RlVHlwZTZTaGFkaW5nKHJlYWRlcikgewogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHM7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHBzID0gbmV3IEludDMyQXJyYXkoMTYpOwogICAgY29uc3QgY3MgPSBuZXcgSW50MzJBcnJheSg0KTsKICAgIHdoaWxlIChyZWFkZXIuaGFzRGF0YSkgewogICAgICBjb25zdCBmID0gcmVhZGVyLnJlYWRGbGFnKCk7CiAgICAgIGlmICghKDAgPD0gZiAmJiBmIDw9IDMpKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIHR5cGU2IGZsYWciKTsKICAgICAgfQogICAgICBjb25zdCBwaSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGYgIT09IDAgPyA4IDogMTI7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29vcmRzLnB1c2gocmVhZGVyLnJlYWRDb29yZGluYXRlKCkpOwogICAgICB9CiAgICAgIGNvbnN0IGNpID0gY29sb3JzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZiAhPT0gMCA/IDIgOiA0OyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbG9ycy5wdXNoKHJlYWRlci5yZWFkQ29tcG9uZW50cygpKTsKICAgICAgfQogICAgICBsZXQgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsKICAgICAgc3dpdGNoIChmKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgcHNbMTJdID0gcGkgKyAzOwogICAgICAgICAgcHNbMTNdID0gcGkgKyA0OwogICAgICAgICAgcHNbMTRdID0gcGkgKyA1OwogICAgICAgICAgcHNbMTVdID0gcGkgKyA2OwogICAgICAgICAgcHNbOF0gPSBwaSArIDI7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbN10gPSBwaSArIDQ7CiAgICAgICAgICBwc1swXSA9IHRtcDE7CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICB0bXAxID0gY3NbMl07CiAgICAgICAgICB0bXAyID0gY3NbM107CiAgICAgICAgICBjc1syXSA9IHRtcDI7CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICB0bXAxID0gcHNbMTVdOwogICAgICAgICAgdG1wMiA9IHBzWzExXTsKICAgICAgICAgIHBzWzEyXSA9IHBzWzNdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1s3XTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gdG1wMjsKICAgICAgICAgIHBzWzddID0gcGkgKyA0OwogICAgICAgICAgcHNbMF0gPSB0bXAxOwogICAgICAgICAgcHNbMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1syXSA9IHBpICsgNjsKICAgICAgICAgIHBzWzNdID0gcGkgKyA1OwogICAgICAgICAgdG1wMSA9IGNzWzNdOwogICAgICAgICAgY3NbMl0gPSBjc1sxXTsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgIHBzWzEyXSA9IHBzWzBdOwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSBwc1sxXTsKICAgICAgICAgIHBzWzExXSA9IHBpICsgMzsKICAgICAgICAgIHBzWzRdID0gcHNbMl07CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHBzWzVdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1swXV1bMF0gLSBjb29yZHNbcHNbMTVdXVswXSArIDYgKiAoY29vcmRzW3BzWzRdXVswXSArIGNvb3Jkc1twc1sxXV1bMF0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVswXSArIGNvb3Jkc1twc1szXV1bMF0pICsgMyAqIChjb29yZHNbcHNbMTNdXVswXSArIGNvb3Jkc1twc1s3XV1bMF0pKSAvIDksICgtNCAqIGNvb3Jkc1twc1swXV1bMV0gLSBjb29yZHNbcHNbMTVdXVsxXSArIDYgKiAoY29vcmRzW3BzWzRdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTNdXVsxXSArIGNvb3Jkc1twc1s3XV1bMV0pKSAvIDldKTsKICAgICAgcHNbNl0gPSBjb29yZHMubGVuZ3RoOwogICAgICBjb29yZHMucHVzaChbKC00ICogY29vcmRzW3BzWzNdXVswXSAtIGNvb3Jkc1twc1sxMl1dWzBdICsgNiAqIChjb29yZHNbcHNbMl1dWzBdICsgY29vcmRzW3BzWzddXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzNdXVsxXSAtIGNvb3Jkc1twc1sxMl1dWzFdICsgNiAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzddXVsxXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMV0gKyBjb29yZHNbcHNbMTVdXVsxXSkgKyAzICogKGNvb3Jkc1twc1s0XV1bMV0gKyBjb29yZHNbcHNbMTRdXVsxXSkpIC8gOV0pOwogICAgICBwc1s5XSA9IGNvb3Jkcy5sZW5ndGg7CiAgICAgIGNvb3Jkcy5wdXNoKFsoLTQgKiBjb29yZHNbcHNbMTJdXVswXSAtIGNvb3Jkc1twc1szXV1bMF0gKyA2ICogKGNvb3Jkc1twc1s4XV1bMF0gKyBjb29yZHNbcHNbMTNdXVswXSkgLSAyICogKGNvb3Jkc1twc1swXV1bMF0gKyBjb29yZHNbcHNbMTVdXVswXSkgKyAzICogKGNvb3Jkc1twc1sxMV1dWzBdICsgY29vcmRzW3BzWzFdXVswXSkpIC8gOSwgKC00ICogY29vcmRzW3BzWzEyXV1bMV0gLSBjb29yZHNbcHNbM11dWzFdICsgNiAqIChjb29yZHNbcHNbOF1dWzFdICsgY29vcmRzW3BzWzEzXV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMF1dWzFdICsgY29vcmRzW3BzWzE1XV1bMV0pICsgMyAqIChjb29yZHNbcHNbMTFdXVsxXSArIGNvb3Jkc1twc1sxXV1bMV0pKSAvIDldKTsKICAgICAgcHNbMTBdID0gY29vcmRzLmxlbmd0aDsKICAgICAgY29vcmRzLnB1c2goWygtNCAqIGNvb3Jkc1twc1sxNV1dWzBdIC0gY29vcmRzW3BzWzBdXVswXSArIDYgKiAoY29vcmRzW3BzWzExXV1bMF0gKyBjb29yZHNbcHNbMTRdXVswXSkgLSAyICogKGNvb3Jkc1twc1sxMl1dWzBdICsgY29vcmRzW3BzWzNdXVswXSkgKyAzICogKGNvb3Jkc1twc1syXV1bMF0gKyBjb29yZHNbcHNbOF1dWzBdKSkgLyA5LCAoLTQgKiBjb29yZHNbcHNbMTVdXVsxXSAtIGNvb3Jkc1twc1swXV1bMV0gKyA2ICogKGNvb3Jkc1twc1sxMV1dWzFdICsgY29vcmRzW3BzWzE0XV1bMV0pIC0gMiAqIChjb29yZHNbcHNbMTJdXVsxXSArIGNvb3Jkc1twc1szXV1bMV0pICsgMyAqIChjb29yZHNbcHNbMl1dWzFdICsgY29vcmRzW3BzWzhdXVsxXSkpIC8gOV0pOwogICAgICB0aGlzLmZpZ3VyZXMucHVzaCh7CiAgICAgICAgdHlwZTogInBhdGNoIiwKICAgICAgICBjb29yZHM6IG5ldyBJbnQzMkFycmF5KHBzKSwKICAgICAgICBjb2xvcnM6IG5ldyBJbnQzMkFycmF5KGNzKQogICAgICB9KTsKICAgIH0KICB9CiAgX2RlY29kZVR5cGU3U2hhZGluZyhyZWFkZXIpIHsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzOwogICAgY29uc3QgY29sb3JzID0gdGhpcy5jb2xvcnM7CiAgICBjb25zdCBwcyA9IG5ldyBJbnQzMkFycmF5KDE2KTsKICAgIGNvbnN0IGNzID0gbmV3IEludDMyQXJyYXkoNCk7CiAgICB3aGlsZSAocmVhZGVyLmhhc0RhdGEpIHsKICAgICAgY29uc3QgZiA9IHJlYWRlci5yZWFkRmxhZygpOwogICAgICBpZiAoISgwIDw9IGYgJiYgZiA8PSAzKSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlNyBmbGFnIik7CiAgICAgIH0KICAgICAgY29uc3QgcGkgPSBjb29yZHMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMTIgOiAxNjsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb29yZHMucHVzaChyZWFkZXIucmVhZENvb3JkaW5hdGUoKSk7CiAgICAgIH0KICAgICAgY29uc3QgY2kgPSBjb2xvcnMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmICE9PSAwID8gMiA6IDQ7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29sb3JzLnB1c2gocmVhZGVyLnJlYWRDb21wb25lbnRzKCkpOwogICAgICB9CiAgICAgIGxldCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OwogICAgICBzd2l0Y2ggKGYpIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICBwc1sxMl0gPSBwaSArIDM7CiAgICAgICAgICBwc1sxM10gPSBwaSArIDQ7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDU7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDY7CiAgICAgICAgICBwc1s4XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzldID0gcGkgKyAxMzsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTQ7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDc7CiAgICAgICAgICBwc1s0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzVdID0gcGkgKyAxMjsKICAgICAgICAgIHBzWzZdID0gcGkgKyAxNTsKICAgICAgICAgIHBzWzddID0gcGkgKyA4OwogICAgICAgICAgcHNbMF0gPSBwaTsKICAgICAgICAgIHBzWzFdID0gcGkgKyAxMTsKICAgICAgICAgIHBzWzJdID0gcGkgKyAxMDsKICAgICAgICAgIHBzWzNdID0gcGkgKyA5OwogICAgICAgICAgY3NbMl0gPSBjaSArIDE7CiAgICAgICAgICBjc1szXSA9IGNpICsgMjsKICAgICAgICAgIGNzWzBdID0gY2k7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIHRtcDEgPSBwc1sxMl07CiAgICAgICAgICB0bXAyID0gcHNbMTNdOwogICAgICAgICAgdG1wMyA9IHBzWzE0XTsKICAgICAgICAgIHRtcDQgPSBwc1sxNV07CiAgICAgICAgICBwc1sxMl0gPSB0bXA0OwogICAgICAgICAgcHNbMTNdID0gcGkgKyAwOwogICAgICAgICAgcHNbMTRdID0gcGkgKyAxOwogICAgICAgICAgcHNbMTVdID0gcGkgKyAyOwogICAgICAgICAgcHNbOF0gPSB0bXAzOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1syXTsKICAgICAgICAgIHRtcDIgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gdG1wMjsKICAgICAgICAgIGNzWzNdID0gY2k7CiAgICAgICAgICBjc1swXSA9IHRtcDE7CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHRtcDEgPSBwc1sxNV07CiAgICAgICAgICB0bXAyID0gcHNbMTFdOwogICAgICAgICAgcHNbMTJdID0gcHNbM107CiAgICAgICAgICBwc1sxM10gPSBwaSArIDA7CiAgICAgICAgICBwc1sxNF0gPSBwaSArIDE7CiAgICAgICAgICBwc1sxNV0gPSBwaSArIDI7CiAgICAgICAgICBwc1s4XSA9IHBzWzddOwogICAgICAgICAgcHNbOV0gPSBwaSArIDk7CiAgICAgICAgICBwc1sxMF0gPSBwaSArIDEwOwogICAgICAgICAgcHNbMTFdID0gcGkgKyAzOwogICAgICAgICAgcHNbNF0gPSB0bXAyOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gdG1wMTsKICAgICAgICAgIHBzWzFdID0gcGkgKyA3OwogICAgICAgICAgcHNbMl0gPSBwaSArIDY7CiAgICAgICAgICBwc1szXSA9IHBpICsgNTsKICAgICAgICAgIHRtcDEgPSBjc1szXTsKICAgICAgICAgIGNzWzJdID0gY3NbMV07CiAgICAgICAgICBjc1szXSA9IGNpOwogICAgICAgICAgY3NbMF0gPSB0bXAxOwogICAgICAgICAgY3NbMV0gPSBjaSArIDE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICBwc1sxMl0gPSBwc1swXTsKICAgICAgICAgIHBzWzEzXSA9IHBpICsgMDsKICAgICAgICAgIHBzWzE0XSA9IHBpICsgMTsKICAgICAgICAgIHBzWzE1XSA9IHBpICsgMjsKICAgICAgICAgIHBzWzhdID0gcHNbMV07CiAgICAgICAgICBwc1s5XSA9IHBpICsgOTsKICAgICAgICAgIHBzWzEwXSA9IHBpICsgMTA7CiAgICAgICAgICBwc1sxMV0gPSBwaSArIDM7CiAgICAgICAgICBwc1s0XSA9IHBzWzJdOwogICAgICAgICAgcHNbNV0gPSBwaSArIDg7CiAgICAgICAgICBwc1s2XSA9IHBpICsgMTE7CiAgICAgICAgICBwc1s3XSA9IHBpICsgNDsKICAgICAgICAgIHBzWzBdID0gcHNbM107CiAgICAgICAgICBwc1sxXSA9IHBpICsgNzsKICAgICAgICAgIHBzWzJdID0gcGkgKyA2OwogICAgICAgICAgcHNbM10gPSBwaSArIDU7CiAgICAgICAgICBjc1syXSA9IGNzWzBdOwogICAgICAgICAgY3NbM10gPSBjaTsKICAgICAgICAgIGNzWzBdID0gY3NbMV07CiAgICAgICAgICBjc1sxXSA9IGNpICsgMTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXMuZmlndXJlcy5wdXNoKHsKICAgICAgICB0eXBlOiAicGF0Y2giLAogICAgICAgIGNvb3JkczogbmV3IEludDMyQXJyYXkocHMpLAogICAgICAgIGNvbG9yczogbmV3IEludDMyQXJyYXkoY3MpCiAgICAgIH0pOwogICAgfQogIH0KICBfYnVpbGRGaWd1cmVGcm9tUGF0Y2goaW5kZXgpIHsKICAgIGNvbnN0IGZpZ3VyZSA9IHRoaXMuZmlndXJlc1tpbmRleF07CiAgICAoMCwgX3V0aWwuYXNzZXJ0KShmaWd1cmUudHlwZSA9PT0gInBhdGNoIiwgIlVuZXhwZWN0ZWQgcGF0Y2ggbWVzaCBmaWd1cmUiKTsKICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRzLAogICAgICBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IHBpID0gZmlndXJlLmNvb3JkczsKICAgIGNvbnN0IGNpID0gZmlndXJlLmNvbG9yczsKICAgIGNvbnN0IGZpZ3VyZU1pblggPSBNYXRoLm1pbihjb29yZHNbcGlbMF1dWzBdLCBjb29yZHNbcGlbM11dWzBdLCBjb29yZHNbcGlbMTJdXVswXSwgY29vcmRzW3BpWzE1XV1bMF0pOwogICAgY29uc3QgZmlndXJlTWluWSA9IE1hdGgubWluKGNvb3Jkc1twaVswXV1bMV0sIGNvb3Jkc1twaVszXV1bMV0sIGNvb3Jkc1twaVsxMl1dWzFdLCBjb29yZHNbcGlbMTVdXVsxXSk7CiAgICBjb25zdCBmaWd1cmVNYXhYID0gTWF0aC5tYXgoY29vcmRzW3BpWzBdXVswXSwgY29vcmRzW3BpWzNdXVswXSwgY29vcmRzW3BpWzEyXV1bMF0sIGNvb3Jkc1twaVsxNV1dWzBdKTsKICAgIGNvbnN0IGZpZ3VyZU1heFkgPSBNYXRoLm1heChjb29yZHNbcGlbMF1dWzFdLCBjb29yZHNbcGlbM11dWzFdLCBjb29yZHNbcGlbMTJdXVsxXSwgY29vcmRzW3BpWzE1XV1bMV0pOwogICAgbGV0IHNwbGl0WEJ5ID0gTWF0aC5jZWlsKChmaWd1cmVNYXhYIC0gZmlndXJlTWluWCkgKiBNZXNoU2hhZGluZy5UUklBTkdMRV9ERU5TSVRZIC8gKHRoaXMuYm91bmRzWzJdIC0gdGhpcy5ib3VuZHNbMF0pKTsKICAgIHNwbGl0WEJ5ID0gTWF0aC5tYXgoTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1hdGgubWluKE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULCBzcGxpdFhCeSkpOwogICAgbGV0IHNwbGl0WUJ5ID0gTWF0aC5jZWlsKChmaWd1cmVNYXhZIC0gZmlndXJlTWluWSkgKiBNZXNoU2hhZGluZy5UUklBTkdMRV9ERU5TSVRZIC8gKHRoaXMuYm91bmRzWzNdIC0gdGhpcy5ib3VuZHNbMV0pKTsKICAgIHNwbGl0WUJ5ID0gTWF0aC5tYXgoTWVzaFNoYWRpbmcuTUlOX1NQTElUX1BBVENIX0NIVU5LU19BTU9VTlQsIE1hdGgubWluKE1lc2hTaGFkaW5nLk1BWF9TUExJVF9QQVRDSF9DSFVOS1NfQU1PVU5ULCBzcGxpdFlCeSkpOwogICAgY29uc3QgdmVydGljZXNQZXJSb3cgPSBzcGxpdFhCeSArIDE7CiAgICBjb25zdCBmaWd1cmVDb29yZHMgPSBuZXcgSW50MzJBcnJheSgoc3BsaXRZQnkgKyAxKSAqIHZlcnRpY2VzUGVyUm93KTsKICAgIGNvbnN0IGZpZ3VyZUNvbG9ycyA9IG5ldyBJbnQzMkFycmF5KChzcGxpdFlCeSArIDEpICogdmVydGljZXNQZXJSb3cpOwogICAgbGV0IGsgPSAwOwogICAgY29uc3QgY2wgPSBuZXcgVWludDhBcnJheSgzKSwKICAgICAgY3IgPSBuZXcgVWludDhBcnJheSgzKTsKICAgIGNvbnN0IGMwID0gY29sb3JzW2NpWzBdXSwKICAgICAgYzEgPSBjb2xvcnNbY2lbMV1dLAogICAgICBjMiA9IGNvbG9yc1tjaVsyXV0sCiAgICAgIGMzID0gY29sb3JzW2NpWzNdXTsKICAgIGNvbnN0IGJSb3cgPSBnZXRCKHNwbGl0WUJ5KSwKICAgICAgYkNvbCA9IGdldEIoc3BsaXRYQnkpOwogICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDw9IHNwbGl0WUJ5OyByb3crKykgewogICAgICBjbFswXSA9IChjMFswXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjMlswXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNsWzFdID0gKGMwWzFdICogKHNwbGl0WUJ5IC0gcm93KSArIGMyWzFdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY2xbMl0gPSAoYzBbMl0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzJbMl0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBjclswXSA9IChjMVswXSAqIChzcGxpdFlCeSAtIHJvdykgKyBjM1swXSAqIHJvdykgLyBzcGxpdFlCeSB8IDA7CiAgICAgIGNyWzFdID0gKGMxWzFdICogKHNwbGl0WUJ5IC0gcm93KSArIGMzWzFdICogcm93KSAvIHNwbGl0WUJ5IHwgMDsKICAgICAgY3JbMl0gPSAoYzFbMl0gKiAoc3BsaXRZQnkgLSByb3cpICsgYzNbMl0gKiByb3cpIC8gc3BsaXRZQnkgfCAwOwogICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPD0gc3BsaXRYQnk7IGNvbCsrLCBrKyspIHsKICAgICAgICBpZiAoKHJvdyA9PT0gMCB8fCByb3cgPT09IHNwbGl0WUJ5KSAmJiAoY29sID09PSAwIHx8IGNvbCA9PT0gc3BsaXRYQnkpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbGV0IHggPSAwLAogICAgICAgICAgeSA9IDA7CiAgICAgICAgbGV0IHEgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDM7IGkrKykgewogICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPD0gMzsgaisrLCBxKyspIHsKICAgICAgICAgICAgY29uc3QgbSA9IGJSb3dbcm93XVtpXSAqIGJDb2xbY29sXVtqXTsKICAgICAgICAgICAgeCArPSBjb29yZHNbcGlbcV1dWzBdICogbTsKICAgICAgICAgICAgeSArPSBjb29yZHNbcGlbcV1dWzFdICogbTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmlndXJlQ29vcmRzW2tdID0gY29vcmRzLmxlbmd0aDsKICAgICAgICBjb29yZHMucHVzaChbeCwgeV0pOwogICAgICAgIGZpZ3VyZUNvbG9yc1trXSA9IGNvbG9ycy5sZW5ndGg7CiAgICAgICAgY29uc3QgbmV3Q29sb3IgPSBuZXcgVWludDhBcnJheSgzKTsKICAgICAgICBuZXdDb2xvclswXSA9IChjbFswXSAqIChzcGxpdFhCeSAtIGNvbCkgKyBjclswXSAqIGNvbCkgLyBzcGxpdFhCeSB8IDA7CiAgICAgICAgbmV3Q29sb3JbMV0gPSAoY2xbMV0gKiAoc3BsaXRYQnkgLSBjb2wpICsgY3JbMV0gKiBjb2wpIC8gc3BsaXRYQnkgfCAwOwogICAgICAgIG5ld0NvbG9yWzJdID0gKGNsWzJdICogKHNwbGl0WEJ5IC0gY29sKSArIGNyWzJdICogY29sKSAvIHNwbGl0WEJ5IHwgMDsKICAgICAgICBjb2xvcnMucHVzaChuZXdDb2xvcik7CiAgICAgIH0KICAgIH0KICAgIGZpZ3VyZUNvb3Jkc1swXSA9IHBpWzBdOwogICAgZmlndXJlQ29sb3JzWzBdID0gY2lbMF07CiAgICBmaWd1cmVDb29yZHNbc3BsaXRYQnldID0gcGlbM107CiAgICBmaWd1cmVDb2xvcnNbc3BsaXRYQnldID0gY2lbMV07CiAgICBmaWd1cmVDb29yZHNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeV0gPSBwaVsxMl07CiAgICBmaWd1cmVDb2xvcnNbdmVydGljZXNQZXJSb3cgKiBzcGxpdFlCeV0gPSBjaVsyXTsKICAgIGZpZ3VyZUNvb3Jkc1t2ZXJ0aWNlc1BlclJvdyAqIHNwbGl0WUJ5ICsgc3BsaXRYQnldID0gcGlbMTVdOwogICAgZmlndXJlQ29sb3JzW3ZlcnRpY2VzUGVyUm93ICogc3BsaXRZQnkgKyBzcGxpdFhCeV0gPSBjaVszXTsKICAgIHRoaXMuZmlndXJlc1tpbmRleF0gPSB7CiAgICAgIHR5cGU6ICJsYXR0aWNlIiwKICAgICAgY29vcmRzOiBmaWd1cmVDb29yZHMsCiAgICAgIGNvbG9yczogZmlndXJlQ29sb3JzLAogICAgICB2ZXJ0aWNlc1BlclJvdwogICAgfTsKICB9CiAgX3VwZGF0ZUJvdW5kcygpIHsKICAgIGxldCBtaW5YID0gdGhpcy5jb29yZHNbMF1bMF0sCiAgICAgIG1pblkgPSB0aGlzLmNvb3Jkc1swXVsxXSwKICAgICAgbWF4WCA9IG1pblgsCiAgICAgIG1heFkgPSBtaW5ZOwogICAgZm9yIChsZXQgaSA9IDEsIGlpID0gdGhpcy5jb29yZHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCB4ID0gdGhpcy5jb29yZHNbaV1bMF0sCiAgICAgICAgeSA9IHRoaXMuY29vcmRzW2ldWzFdOwogICAgICBtaW5YID0gbWluWCA+IHggPyB4IDogbWluWDsKICAgICAgbWluWSA9IG1pblkgPiB5ID8geSA6IG1pblk7CiAgICAgIG1heFggPSBtYXhYIDwgeCA/IHggOiBtYXhYOwogICAgICBtYXhZID0gbWF4WSA8IHkgPyB5IDogbWF4WTsKICAgIH0KICAgIHRoaXMuYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldOwogIH0KICBfcGFja0RhdGEoKSB7CiAgICBsZXQgaSwgaWksIGosIGpqOwogICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHM7CiAgICBjb25zdCBjb29yZHNQYWNrZWQgPSBuZXcgRmxvYXQzMkFycmF5KGNvb3Jkcy5sZW5ndGggKiAyKTsKICAgIGZvciAoaSA9IDAsIGogPSAwLCBpaSA9IGNvb3Jkcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IHh5ID0gY29vcmRzW2ldOwogICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzBdOwogICAgICBjb29yZHNQYWNrZWRbaisrXSA9IHh5WzFdOwogICAgfQogICAgdGhpcy5jb29yZHMgPSBjb29yZHNQYWNrZWQ7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLmNvbG9yczsKICAgIGNvbnN0IGNvbG9yc1BhY2tlZCA9IG5ldyBVaW50OEFycmF5KGNvbG9ycy5sZW5ndGggKiAzKTsKICAgIGZvciAoaSA9IDAsIGogPSAwLCBpaSA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgIGNvbnN0IGMgPSBjb2xvcnNbaV07CiAgICAgIGNvbG9yc1BhY2tlZFtqKytdID0gY1swXTsKICAgICAgY29sb3JzUGFja2VkW2orK10gPSBjWzFdOwogICAgICBjb2xvcnNQYWNrZWRbaisrXSA9IGNbMl07CiAgICB9CiAgICB0aGlzLmNvbG9ycyA9IGNvbG9yc1BhY2tlZDsKICAgIGNvbnN0IGZpZ3VyZXMgPSB0aGlzLmZpZ3VyZXM7CiAgICBmb3IgKGkgPSAwLCBpaSA9IGZpZ3VyZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBmaWd1cmUgPSBmaWd1cmVzW2ldLAogICAgICAgIHBzID0gZmlndXJlLmNvb3JkcywKICAgICAgICBjcyA9IGZpZ3VyZS5jb2xvcnM7CiAgICAgIGZvciAoaiA9IDAsIGpqID0gcHMubGVuZ3RoOyBqIDwgamo7IGorKykgewogICAgICAgIHBzW2pdICo9IDI7CiAgICAgICAgY3Nbal0gKj0gMzsKICAgICAgfQogICAgfQogIH0KICBnZXRJUigpIHsKICAgIHJldHVybiBbIk1lc2giLCB0aGlzLnNoYWRpbmdUeXBlLCB0aGlzLmNvb3JkcywgdGhpcy5jb2xvcnMsIHRoaXMuZmlndXJlcywgdGhpcy5ib3VuZHMsIHRoaXMuYmJveCwgdGhpcy5iYWNrZ3JvdW5kXTsKICB9Cn0KY2xhc3MgRHVtbXlTaGFkaW5nIGV4dGVuZHMgQmFzZVNoYWRpbmcgewogIGdldElSKCkgewogICAgcmV0dXJuIFsiRHVtbXkiXTsKICB9Cn0KZnVuY3Rpb24gZ2V0VGlsaW5nUGF0dGVybklSKG9wZXJhdG9yTGlzdCwgZGljdCwgY29sb3IpIHsKICBjb25zdCBtYXRyaXggPSBkaWN0LmdldEFycmF5KCJNYXRyaXgiKTsKICBjb25zdCBiYm94ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KGRpY3QuZ2V0QXJyYXkoIkJCb3giKSk7CiAgY29uc3QgeHN0ZXAgPSBkaWN0LmdldCgiWFN0ZXAiKTsKICBjb25zdCB5c3RlcCA9IGRpY3QuZ2V0KCJZU3RlcCIpOwogIGNvbnN0IHBhaW50VHlwZSA9IGRpY3QuZ2V0KCJQYWludFR5cGUiKTsKICBjb25zdCB0aWxpbmdUeXBlID0gZGljdC5nZXQoIlRpbGluZ1R5cGUiKTsKICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPT09IDAgfHwgYmJveFszXSAtIGJib3hbMV0gPT09IDApIHsKICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBnZXRUaWxpbmdQYXR0ZXJuSVIgL0JCb3ggYXJyYXk6IFske2Jib3h9XS5gKTsKICB9CiAgcmV0dXJuIFsiVGlsaW5nUGF0dGVybiIsIGNvbG9yLCBvcGVyYXRvckxpc3QsIG1hdHJpeCwgYmJveCwgeHN0ZXAsIHlzdGVwLCBwYWludFR5cGUsIHRpbGluZ1R5cGVdOwp9CgovKioqLyB9KSwKLyogNTEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5nZXRYZmFGb250RGljdCA9IGdldFhmYUZvbnREaWN0OwpleHBvcnRzLmdldFhmYUZvbnROYW1lID0gZ2V0WGZhRm9udE5hbWU7CnZhciBfY2FsaWJyaV9mYWN0b3JzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1Mik7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfaGVsdmV0aWNhX2ZhY3RvcnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUzKTsKdmFyIF9saWJlcmF0aW9uc2Fuc193aWR0aHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU0KTsKdmFyIF9teXJpYWRwcm9fZmFjdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTUpOwp2YXIgX3NlZ29ldWlfZmFjdG9ycyA9IF9fd19wZGZqc19yZXF1aXJlX18oNTYpOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwp2YXIgX2ZvbnRzX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzOCk7CmNvbnN0IGdldFhGQUZvbnRNYXAgPSAoMCwgX2NvcmVfdXRpbHMuZ2V0TG9va3VwVGFibGVGYWN0b3J5KShmdW5jdGlvbiAodCkgewogIHRbIk15cmlhZFByby1SZWd1bGFyIl0gPSB0WyJQZGZKUy1GYWxsYmFjay1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBfbXlyaWFkcHJvX2ZhY3RvcnMuTXlyaWFkUHJvUmVndWxhckZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocywKICAgIGJhc2VNYXBwaW5nOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmcsCiAgICBtZXRyaWNzOiBfbXlyaWFkcHJvX2ZhY3RvcnMuTXlyaWFkUHJvUmVndWxhck1ldHJpY3MKICB9OwogIHRbIk15cmlhZFByby1Cb2xkIl0gPSB0WyJQZGZKUy1GYWxsYmFjay1Cb2xkIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZCIsCiAgICBmYWN0b3JzOiBfbXlyaWFkcHJvX2ZhY3RvcnMuTXlyaWFkUHJvQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocywKICAgIGJhc2VNYXBwaW5nOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcsCiAgICBtZXRyaWNzOiBfbXlyaWFkcHJvX2ZhY3RvcnMuTXlyaWFkUHJvQm9sZE1ldHJpY3MKICB9OwogIHRbIk15cmlhZFByby1JdCJdID0gdFsiTXlyaWFkUHJvLUl0YWxpYyJdID0gdFsiUGRmSlMtRmFsbGJhY2stSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGZhY3RvcnM6IF9teXJpYWRwcm9fZmFjdG9ycy5NeXJpYWRQcm9JdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocywKICAgIGJhc2VNYXBwaW5nOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IF9teXJpYWRwcm9fZmFjdG9ycy5NeXJpYWRQcm9JdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJNeXJpYWRQcm8tQm9sZEl0Il0gPSB0WyJNeXJpYWRQcm8tQm9sZEl0YWxpYyJdID0gdFsiUGRmSlMtRmFsbGJhY2stQm9sZEl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMiLAogICAgZmFjdG9yczogX215cmlhZHByb19mYWN0b3JzLk15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogX215cmlhZHByb19mYWN0b3JzLk15cmlhZFByb0JvbGRJdGFsaWNNZXRyaWNzCiAgfTsKICB0LkFyaWFsTVQgPSB0LkFyaWFsID0gdFsiQXJpYWwtUmVndWxhciJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLVJlZ3VsYXIiLAogICAgYmFzZVdpZHRoczogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1Cb2xkTVQiXSA9IHRbIkFyaWFsLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZwogIH07CiAgdFsiQXJpYWwtSXRhbGljTVQiXSA9IHRbIkFyaWFsLUl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsCiAgICBiYXNlV2lkdGhzOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nCiAgfTsKICB0WyJBcmlhbC1Cb2xkSXRhbGljTVQiXSA9IHRbIkFyaWFsLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZwogIH07CiAgdFsiQ2FsaWJyaS1SZWd1bGFyIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtUmVndWxhciIsCiAgICBmYWN0b3JzOiBfY2FsaWJyaV9mYWN0b3JzLkNhbGlicmlSZWd1bGFyRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IF9jYWxpYnJpX2ZhY3RvcnMuQ2FsaWJyaVJlZ3VsYXJNZXRyaWNzCiAgfTsKICB0WyJDYWxpYnJpLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGZhY3RvcnM6IF9jYWxpYnJpX2ZhY3RvcnMuQ2FsaWJyaUJvbGRGYWN0b3JzLAogICAgYmFzZVdpZHRoczogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nLAogICAgbWV0cmljczogX2NhbGlicmlfZmFjdG9ycy5DYWxpYnJpQm9sZE1ldHJpY3MKICB9OwogIHRbIkNhbGlicmktSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtSXRhbGljIiwKICAgIGZhY3RvcnM6IF9jYWxpYnJpX2ZhY3RvcnMuQ2FsaWJyaUl0YWxpY0ZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogX2NhbGlicmlfZmFjdG9ycy5DYWxpYnJpSXRhbGljTWV0cmljcwogIH07CiAgdFsiQ2FsaWJyaS1Cb2xkSXRhbGljIl0gPSB7CiAgICBuYW1lOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYyIsCiAgICBmYWN0b3JzOiBfY2FsaWJyaV9mYWN0b3JzLkNhbGlicmlCb2xkSXRhbGljRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IF9jYWxpYnJpX2ZhY3RvcnMuQ2FsaWJyaUJvbGRJdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJTZWdvZXVpLVJlZ3VsYXIiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIiwKICAgIGZhY3RvcnM6IF9zZWdvZXVpX2ZhY3RvcnMuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzLAogICAgYmFzZVdpZHRoczogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nLAogICAgbWV0cmljczogX3NlZ29ldWlfZmFjdG9ycy5TZWdvZXVpUmVndWxhck1ldHJpY3MKICB9OwogIHRbIlNlZ29ldWktQm9sZCJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUJvbGQiLAogICAgZmFjdG9yczogX3NlZ29ldWlfZmFjdG9ycy5TZWdvZXVpQm9sZEZhY3RvcnMsCiAgICBiYXNlV2lkdGhzOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zQm9sZFdpZHRocywKICAgIGJhc2VNYXBwaW5nOiBfbGliZXJhdGlvbnNhbnNfd2lkdGhzLkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcsCiAgICBtZXRyaWNzOiBfc2Vnb2V1aV9mYWN0b3JzLlNlZ29ldWlCb2xkTWV0cmljcwogIH07CiAgdFsiU2Vnb2V1aS1JdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMiLAogICAgZmFjdG9yczogX3NlZ29ldWlfZmFjdG9ycy5TZWdvZXVpSXRhbGljRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBfc2Vnb2V1aV9mYWN0b3JzLlNlZ29ldWlJdGFsaWNNZXRyaWNzCiAgfTsKICB0WyJTZWdvZXVpLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGZhY3RvcnM6IF9zZWdvZXVpX2ZhY3RvcnMuU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzLAogICAgYmFzZVdpZHRoczogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nLAogICAgbWV0cmljczogX3NlZ29ldWlfZmFjdG9ycy5TZWdvZXVpQm9sZEl0YWxpY01ldHJpY3MKICB9OwogIHRbIkhlbHZldGljYS1SZWd1bGFyIl0gPSB0LkhlbHZldGljYSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyIiwKICAgIGZhY3RvcnM6IF9oZWx2ZXRpY2FfZmFjdG9ycy5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZywKICAgIG1ldHJpY3M6IF9oZWx2ZXRpY2FfZmFjdG9ycy5IZWx2ZXRpY2FSZWd1bGFyTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGQiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkIiwKICAgIGZhY3RvcnM6IF9oZWx2ZXRpY2FfZmFjdG9ycy5IZWx2ZXRpY2FCb2xkRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZywKICAgIG1ldHJpY3M6IF9oZWx2ZXRpY2FfZmFjdG9ycy5IZWx2ZXRpY2FCb2xkTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLUl0YWxpYyJdID0gewogICAgbmFtZTogIkxpYmVyYXRpb25TYW5zLUl0YWxpYyIsCiAgICBmYWN0b3JzOiBfaGVsdmV0aWNhX2ZhY3RvcnMuSGVsdmV0aWNhSXRhbGljRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNJdGFsaWNXaWR0aHMsCiAgICBiYXNlTWFwcGluZzogX2xpYmVyYXRpb25zYW5zX3dpZHRocy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcsCiAgICBtZXRyaWNzOiBfaGVsdmV0aWNhX2ZhY3RvcnMuSGVsdmV0aWNhSXRhbGljTWV0cmljcwogIH07CiAgdFsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiXSA9IHsKICAgIG5hbWU6ICJMaWJlcmF0aW9uU2Fucy1Cb2xkSXRhbGljIiwKICAgIGZhY3RvcnM6IF9oZWx2ZXRpY2FfZmFjdG9ycy5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycywKICAgIGJhc2VXaWR0aHM6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzLAogICAgYmFzZU1hcHBpbmc6IF9saWJlcmF0aW9uc2Fuc193aWR0aHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZywKICAgIG1ldHJpY3M6IF9oZWx2ZXRpY2FfZmFjdG9ycy5IZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcwogIH07Cn0pOwpmdW5jdGlvbiBnZXRYZmFGb250TmFtZShuYW1lKSB7CiAgY29uc3QgZm9udE5hbWUgPSAoMCwgX2ZvbnRzX3V0aWxzLm5vcm1hbGl6ZUZvbnROYW1lKShuYW1lKTsKICBjb25zdCBmb250TWFwID0gZ2V0WEZBRm9udE1hcCgpOwogIHJldHVybiBmb250TWFwW2ZvbnROYW1lXTsKfQpmdW5jdGlvbiBnZXRYZmFGb250V2lkdGhzKG5hbWUpIHsKICBjb25zdCBpbmZvID0gZ2V0WGZhRm9udE5hbWUobmFtZSk7CiAgaWYgKCFpbmZvKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgewogICAgYmFzZVdpZHRocywKICAgIGJhc2VNYXBwaW5nLAogICAgZmFjdG9ycwogIH0gPSBpbmZvOwogIGxldCByZXNjYWxlZEJhc2VXaWR0aHM7CiAgaWYgKCFmYWN0b3JzKSB7CiAgICByZXNjYWxlZEJhc2VXaWR0aHMgPSBiYXNlV2lkdGhzOwogIH0gZWxzZSB7CiAgICByZXNjYWxlZEJhc2VXaWR0aHMgPSBiYXNlV2lkdGhzLm1hcCgodywgaSkgPT4gdyAqIGZhY3RvcnNbaV0pOwogIH0KICBsZXQgY3VycmVudENvZGUgPSAtMjsKICBsZXQgY3VycmVudEFycmF5OwogIGNvbnN0IG5ld1dpZHRocyA9IFtdOwogIGZvciAoY29uc3QgW3VuaWNvZGUsIGdseXBoSW5kZXhdIG9mIGJhc2VNYXBwaW5nLm1hcCgoY2hhclVuaWNvZGUsIGluZGV4KSA9PiBbY2hhclVuaWNvZGUsIGluZGV4XSkuc29ydCgoW3VuaWNvZGUxXSwgW3VuaWNvZGUyXSkgPT4gdW5pY29kZTEgLSB1bmljb2RlMikpIHsKICAgIGlmICh1bmljb2RlID09PSAtMSkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICh1bmljb2RlID09PSBjdXJyZW50Q29kZSArIDEpIHsKICAgICAgY3VycmVudEFycmF5LnB1c2gocmVzY2FsZWRCYXNlV2lkdGhzW2dseXBoSW5kZXhdKTsKICAgICAgY3VycmVudENvZGUgKz0gMTsKICAgIH0gZWxzZSB7CiAgICAgIGN1cnJlbnRDb2RlID0gdW5pY29kZTsKICAgICAgY3VycmVudEFycmF5ID0gW3Jlc2NhbGVkQmFzZVdpZHRoc1tnbHlwaEluZGV4XV07CiAgICAgIG5ld1dpZHRocy5wdXNoKHVuaWNvZGUsIGN1cnJlbnRBcnJheSk7CiAgICB9CiAgfQogIHJldHVybiBuZXdXaWR0aHM7Cn0KZnVuY3Rpb24gZ2V0WGZhRm9udERpY3QobmFtZSkgewogIGNvbnN0IHdpZHRocyA9IGdldFhmYUZvbnRXaWR0aHMobmFtZSk7CiAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KG51bGwpOwogIGRpY3Quc2V0KCJCYXNlRm9udCIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KG5hbWUpKTsKICBkaWN0LnNldCgiVHlwZSIsIF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJGb250IikpOwogIGRpY3Quc2V0KCJTdWJ0eXBlIiwgX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkNJREZvbnRUeXBlMiIpKTsKICBkaWN0LnNldCgiRW5jb2RpbmciLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSWRlbnRpdHktSCIpKTsKICBkaWN0LnNldCgiQ0lEVG9HSURNYXAiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiSWRlbnRpdHkiKSk7CiAgZGljdC5zZXQoIlciLCB3aWR0aHMpOwogIGRpY3Quc2V0KCJGaXJzdENoYXIiLCB3aWR0aHNbMF0pOwogIGRpY3Quc2V0KCJMYXN0Q2hhciIsIHdpZHRocy5hdCgtMikgKyB3aWR0aHMuYXQoLTEpLmxlbmd0aCAtIDEpOwogIGNvbnN0IGRlc2NyaXB0b3IgPSBuZXcgX3ByaW1pdGl2ZXMuRGljdChudWxsKTsKICBkaWN0LnNldCgiRm9udERlc2NyaXB0b3IiLCBkZXNjcmlwdG9yKTsKICBjb25zdCBzeXN0ZW1JbmZvID0gbmV3IF9wcmltaXRpdmVzLkRpY3QobnVsbCk7CiAgc3lzdGVtSW5mby5zZXQoIk9yZGVyaW5nIiwgIklkZW50aXR5Iik7CiAgc3lzdGVtSW5mby5zZXQoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CiAgc3lzdGVtSW5mby5zZXQoIlN1cHBsZW1lbnQiLCAwKTsKICBkaWN0LnNldCgiQ0lEU3lzdGVtSW5mbyIsIHN5c3RlbUluZm8pOwogIHJldHVybiBkaWN0Owp9CgovKioqLyB9KSwKLyogNTIgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5DYWxpYnJpUmVndWxhck1ldHJpY3MgPSBleHBvcnRzLkNhbGlicmlSZWd1bGFyRmFjdG9ycyA9IGV4cG9ydHMuQ2FsaWJyaUl0YWxpY01ldHJpY3MgPSBleHBvcnRzLkNhbGlicmlJdGFsaWNGYWN0b3JzID0gZXhwb3J0cy5DYWxpYnJpQm9sZE1ldHJpY3MgPSBleHBvcnRzLkNhbGlicmlCb2xkSXRhbGljTWV0cmljcyA9IGV4cG9ydHMuQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzID0gZXhwb3J0cy5DYWxpYnJpQm9sZEZhY3RvcnMgPSB2b2lkIDA7CmNvbnN0IENhbGlicmlCb2xkRmFjdG9ycyA9IFsxLjM4NzcsIDEsIDEsIDEsIDAuOTc4MDEsIDAuOTI0ODIsIDAuODk1NTIsIDAuOTExMzMsIDAuODE5ODgsIDAuOTc1NjYsIDAuOTgxNTIsIDAuOTM1NDgsIDAuOTM1NDgsIDEuMjc5OCwgMC44NTI4NCwgMC45Mjc5NCwgMSwgMC45NjEzNCwgMS41NDY1NywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC44Mjg0NSwgMC44Mjg0NSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC43NTg1OSwgMC45MjEzOCwgMC44MzkwOCwgMC43NzYyLCAwLjczMjkzLCAwLjg3Mjg5LCAwLjczMTMzLCAwLjc1MTQsIDAuODE5MjEsIDAuODczNTYsIDAuOTU5NTgsIDAuNTk1MjYsIDAuNzU3MjcsIDAuNjkyMjUsIDEuMDQ5MjQsIDAuOTEyMSwgMC44Njk0MywgMC43OTc5NSwgMC44ODE5OCwgMC43Nzk1OCwgMC43MDg2NCwgMC44MTA1NSwgMC45MDM5OSwgMC44ODY1MywgMC45NjAxNywgMC44MjU3NywgMC43Nzg5MiwgMC43ODI1NywgMC45NzUwNywgMS41NDY1NywgMC45NzUwNywgMC44NTI4NCwgMC44OTU1MiwgMC45MDE3NiwgMC44ODc2MiwgMC44Nzg1LCAwLjc1MjQxLCAwLjg3ODUsIDAuOTA1MTgsIDAuOTUwMTUsIDAuNzc2MTgsIDAuODc4NSwgMC44ODQwMSwgMC45MTkxNiwgMC44NjMwNCwgMC44ODQwMSwgMC45MTQ4OCwgMC44Nzg1LCAwLjg4MDEsIDAuODc4NSwgMC44Nzg1LCAwLjkxMzQzLCAwLjcxNzMsIDEuMDQxMDYsIDAuODc4NSwgMC44NTA3NSwgMC45NTc5NCwgMC44MjYxNiwgMC44NTE2MiwgMC43OTQ5MiwgMC44ODMzMSwgMS42OTgwOCwgMC44ODMzMSwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS43ODAxLCAwLjg5NTUyLCAxLjI0NDg3LCAxLjEzMjU0LCAxLjEyNDAxLCAwLjk2ODM5LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcwNjQ1LCAwLjg1NTkyLCAwLjkwNzQ3LCAxLjAxNDY2LCAxLjAwODgsIDAuOTAzMjMsIDEsIDEuMDc0NjMsIDEsIDAuOTEwNTYsIDAuNzU4MDYsIDEuMTkxMTgsIDAuOTY4MzksIDAuNzg4NjQsIDAuODI4NDUsIDAuODQxMzMsIDAuNzU4NTksIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuNzc1MzksIDAuNzMyOTMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuODg1MDYsIDAuOTEyMSwgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44Njk0MywgMC44NTI4NCwgMC44NzUwOCwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC45MDM5OSwgMC43Nzg5MiwgMC43OTc5NSwgMC45MDgwNywgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44ODc2MiwgMC44NzE1LCAwLjc1MjQxLCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjkwNTE4LCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg4NDAxLCAwLjg3ODUsIDAuODc4NSwgMC44ODAxLCAwLjg4MDEsIDAuODgwMSwgMC44ODAxLCAwLjg4MDEsIDAuOTA3NDcsIDAuODkwNDksIDAuODc4NSwgMC44Nzg1LCAwLjg3ODUsIDAuODc4NSwgMC44NTE2MiwgMC44Nzg1LCAwLjg1MTYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjgzOTA4LCAwLjg4NzYyLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjczMjkzLCAwLjc1MjQxLCAwLjg3Mjg5LCAwLjgzMDE2LCAwLjg4NTA2LCAwLjkzMTI1LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjczMTMzLCAwLjkwNTE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAwLjgxOTIxLCAwLjc3NjE4LCAxLCAxLCAwLjg3MzU2LCAwLjg3ODUsIDAuOTEwNzUsIDAuODk2MDgsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuOTU5NTgsIDAuODg0MDEsIDAuNzYyMjksIDAuOTAxNjcsIDAuNTk1MjYsIDAuOTE5MTYsIDEsIDEsIDAuODYzMDQsIDAuNjkyMjUsIDAuODg0MDEsIDEsIDEsIDAuNzA0MjQsIDAuNzk0NjgsIDAuOTE5MjYsIDAuODgxNzUsIDAuNzA4MjMsIDAuOTQ5MDMsIDAuOTEyMSwgMC44Nzg1LCAxLCAxLCAwLjkxMjEsIDAuODc4NSwgMC44NzgwMiwgMC44ODY1NiwgMC44Nzg1LCAwLjg2OTQzLCAwLjg4MDEsIDAuODY5NDMsIDAuODgwMSwgMC44Njk0MywgMC44ODAxLCAwLjg3NDAyLCAwLjg5MjkxLCAwLjc3OTU4LCAwLjkxMzQzLCAxLCAxLCAwLjc3OTU4LCAwLjkxMzQzLCAwLjcwODY0LCAwLjcxNzMsIDAuNzA4NjQsIDAuNzE3MywgMC43MDg2NCwgMC43MTczLCAwLjcwODY0LCAwLjcxNzMsIDEsIDEsIDAuODEwNTUsIDAuNzU4NDEsIDAuODEwNTUsIDEuMDY0NTIsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTAzOTksIDAuODc4NSwgMC45MDM5OSwgMC44Nzg1LCAwLjkwMzk5LCAwLjg3ODUsIDAuOTYwMTcsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODUxNjIsIDAuNzc4OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuNzgyNTcsIDAuNzk0OTIsIDAuOTI5NywgMC41Njg5MiwgMC44MzkwOCwgMC44ODc2MiwgMC43NzUzOSwgMC44NzE1LCAwLjg3NTA4LCAwLjg5MDQ5LCAxLCAxLCAwLjgxMDU1LCAxLjA0MTA2LCAxLjIwNTI4LCAxLjIwNTI4LCAxLCAxLjE1NTQzLCAwLjcwNjc0LCAwLjk4Mzg3LCAwLjk0NzIxLCAxLjMzNDMxLCAxLjQ1ODk0LCAwLjk1MTYxLCAxLjA2MzAzLCAwLjgzOTA4LCAwLjgwMzUyLCAwLjU3MTg0LCAwLjY5NjUsIDAuNTYyODksIDAuODIwMDEsIDAuNTYwMjksIDAuODEyMzUsIDEuMDI5ODgsIDAuODM5MDgsIDAuNzc2MiwgMC42ODE1NiwgMC44MDM2NywgMC43MzEzMywgMC43ODI1NywgMC44NzM1NiwgMC44Njk0MywgMC45NTk1OCwgMC43NTcyNywgMC44OTAxOSwgMS4wNDkyNCwgMC45MTIxLCAwLjc2NDgsIDAuODY5NDMsIDAuODczNTYsIDAuNzk3OTUsIDAuNzgyNzUsIDAuODEwNTUsIDAuNzc4OTIsIDAuOTc2MiwgMC44MjU3NywgMC45OTgxOSwgMC44NDg5NiwgMC45NTk1OCwgMC43Nzg5MiwgMC45NjEwOCwgMS4wMTQwNywgMC44OTA0OSwgMS4wMjk4OCwgMC45NDIxMSwgMC45NjEwOCwgMC44OTM2LCAwLjg0MDIxLCAwLjg3ODQyLCAwLjk2Mzk5LCAwLjc5MTA5LCAwLjg5MDQ5LCAxLjAwODEzLCAxLjAyOTg4LCAwLjg2MDc3LCAwLjg3NDQ1LCAwLjkyMDk5LCAwLjg0NzIzLCAwLjg2NTEzLCAwLjg4MDEsIDAuNzU2MzgsIDAuODU3MTQsIDAuNzgyMTYsIDAuNzk1ODYsIDAuODc5NjUsIDAuOTQyMTEsIDAuOTc3NDcsIDAuNzgyODcsIDAuOTc5MjYsIDAuODQ5NzEsIDEuMDI5ODgsIDAuOTQyMTEsIDAuODgwMSwgMC45NDIxMSwgMC44NDk3MSwgMC43MzEzMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDI2NCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDUxOCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDU0OCwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC45NjAxNywgMC45NTc5NCwgMC43Nzg5MiwgMC44NTE2MiwgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDM2MywgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC45Mjc5NCwgMC44NzAxMiwgMC44NzAxMiwgMC44NzAxMiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC43MTE0MywgMS4wNjE1MiwgMSwgMSwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NzE3MSwgMS40OTU2LCAyLjI4MDcsIDAuOTM4MzUsIDAuODM0MDYsIDAuOTExMzMsIDAuODQxMDcsIDAuOTExMzMsIDEsIDEsIDEsIDAuNzIwMjEsIDEsIDEuMjMxMDgsIDAuODM0ODksIDAuODg1MjUsIDAuODg1MjUsIDAuODE0OTksIDAuOTA1MjcsIDEuODEwNTUsIDAuOTA1MjcsIDEuODEwNTUsIDEuMzEwMDYsIDEuNTM3MTEsIDAuOTQ0MzQsIDEuMDg2OTYsIDEsIDAuOTUwMTgsIDAuNzcxOTIsIDAuODUyODQsIDAuOTA3NDcsIDEuMTc1MzQsIDAuNjk4MjUsIDAuOTcxNiwgMS4zNzA3NywgMC45MDc0NywgMC45MDc0NywgMC44NTM1NiwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wODAwNCwgMC45MTAyNywgMSwgMSwgMSwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDcyNywgMC45MDcyNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmV4cG9ydHMuQ2FsaWJyaUJvbGRGYWN0b3JzID0gQ2FsaWJyaUJvbGRGYWN0b3JzOwpjb25zdCBDYWxpYnJpQm9sZE1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9OwpleHBvcnRzLkNhbGlicmlCb2xkTWV0cmljcyA9IENhbGlicmlCb2xkTWV0cmljczsKY29uc3QgQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzID0gWzEuMzg3NywgMSwgMSwgMSwgMC45NzgwMSwgMC45MjQ4MiwgMC44OTU1MiwgMC45MTEzMywgMC44MTk4OCwgMC45NzU2NiwgMC45ODE1MiwgMC45MzU0OCwgMC45MzU0OCwgMS4yNzk4LCAwLjg1Mjg0LCAwLjkyNzk0LCAxLCAwLjk2MTM0LCAxLjU2MjM5LCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjkxMTMzLCAwLjgyODQ1LCAwLjgyODQ1LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjg1Mjg0LCAwLjc1ODU5LCAwLjkyMTM4LCAwLjgzOTA4LCAwLjc3NjIsIDAuNzE4MDUsIDAuODcyODksIDAuNzMxMzMsIDAuNzUxNCwgMC44MTkyMSwgMC44NzM1NiwgMC45NTk1OCwgMC41OTUyNiwgMC43NTcyNywgMC42OTIyNSwgMS4wNDkyNCwgMC45MDg3MiwgMC44NTkzOCwgMC43OTc5NSwgMC44NzA2OCwgMC43Nzk1OCwgMC42OTc2NiwgMC44MTA1NSwgMC45MDM5OSwgMC44ODY1MywgMC45NjA2OCwgMC44MjU3NywgMC43Nzg5MiwgMC43ODI1NywgMC45NzUwNywgMS41MjksIDAuOTc1MDcsIDAuODUyODQsIDAuODk1NTIsIDAuOTAxNzYsIDAuOTQ5MDgsIDAuODY0MTEsIDAuNzQwMTIsIDAuODY0MTEsIDAuODgzMjMsIDAuOTUwMTUsIDAuODY0MTEsIDAuODYzMzEsIDAuODg0MDEsIDAuOTE5MTYsIDAuODYzMDQsIDAuODg0MDEsIDAuOTAzOSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjQxMSwgMC44NjQxMSwgMC45MDQ2NCwgMC43MDg1MiwgMS4wNDEwNiwgMC44NjMzMSwgMC44NDM3MiwgMC45NTc5NCwgMC44MjYxNiwgMC44NDU0OCwgMC43OTQ5MiwgMC44ODMzMSwgMS42OTgwOCwgMC44ODMzMSwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS43ODAxLCAwLjg5NTUyLCAxLjI0NDg3LCAxLjEzMjU0LCAxLjE5MTI5LCAwLjk2ODM5LCAwLjg1Mjg0LCAwLjY4Nzg3LCAwLjcwNjQ1LCAwLjg1NTkyLCAwLjkwNzQ3LCAxLjAxNDY2LCAxLjAwODgsIDAuOTAzMjMsIDEsIDEuMDc0NjMsIDEsIDAuOTEwNTYsIDAuNzU4MDYsIDEuMTkxMTgsIDAuOTY4MzksIDAuNzg4NjQsIDAuODI4NDUsIDAuODQxMzMsIDAuNzU4NTksIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuODM5MDgsIDAuNzc1MzksIDAuNzE4MDUsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuNzMxMzMsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuOTU5NTgsIDAuODg1MDYsIDAuOTA4NzIsIDAuODU5MzgsIDAuODU5MzgsIDAuODU5MzgsIDAuODU5MzgsIDAuODU5MzgsIDAuODUyODQsIDAuODcwNjgsIDAuOTAzOTksIDAuOTAzOTksIDAuOTAzOTksIDAuOTAzOTksIDAuNzc4OTIsIDAuNzk3OTUsIDAuOTA4MDcsIDAuOTQ5MDgsIDAuOTQ5MDgsIDAuOTQ5MDgsIDAuOTQ5MDgsIDAuOTQ5MDgsIDAuOTQ5MDgsIDAuODU4ODcsIDAuNzQwMTIsIDAuODgzMjMsIDAuODgzMjMsIDAuODgzMjMsIDAuODgzMjMsIDAuODg0MDEsIDAuODg0MDEsIDAuODg0MDEsIDAuODg0MDEsIDAuODc4NSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjMzMSwgMC45MDc0NywgMC44OTA0OSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjMzMSwgMC44NjMzMSwgMC44NDU0OCwgMC44NjQxMSwgMC44NDU0OCwgMC44MzkwOCwgMC45NDkwOCwgMC44MzkwOCwgMC45NDkwOCwgMC44MzkwOCwgMC45NDkwOCwgMC43MTgwNSwgMC43NDAxMiwgMC43MTgwNSwgMC43NDAxMiwgMC43MTgwNSwgMC43NDAxMiwgMC43MTgwNSwgMC43NDAxMiwgMC44NzI4OSwgMC43OTUzOCwgMC44ODUwNiwgMC45MjcyNiwgMC43MzEzMywgMC44ODMyMywgMC43MzEzMywgMC44ODMyMywgMC43MzEzMywgMC44ODMyMywgMC43MzEzMywgMC44ODMyMywgMC43MzEzMywgMC44ODMyMywgMC44MTkyMSwgMC44NjQxMSwgMC44MTkyMSwgMC44NjQxMSwgMC44MTkyMSwgMC44NjQxMSwgMSwgMSwgMC44NzM1NiwgMC44NjMzMSwgMC45MTA3NSwgMC44Nzc3LCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjk1OTU4LCAwLjg4NDAxLCAwLjc2NDY3LCAwLjkwMTY3LCAwLjU5NTI2LCAwLjkxOTE2LCAxLCAxLCAwLjg2MzA0LCAwLjY5MjI1LCAwLjg4NDAxLCAxLCAxLCAwLjcwNDI0LCAwLjc3MzEyLCAwLjkxOTI2LCAwLjg4MTc1LCAwLjcwODIzLCAwLjk0OTAzLCAwLjkwODcyLCAwLjg2MzMxLCAxLCAxLCAwLjkwODcyLCAwLjg2MzMxLCAwLjg2OTA2LCAwLjg4MTE2LCAwLjg2MzMxLCAwLjg1OTM4LCAwLjg2MzMxLCAwLjg1OTM4LCAwLjg2MzMxLCAwLjg1OTM4LCAwLjg2MzMxLCAwLjg3NDAyLCAwLjg2NTQ5LCAwLjc3OTU4LCAwLjkwNDY0LCAxLCAxLCAwLjc3OTU4LCAwLjkwNDY0LCAwLjY5NzY2LCAwLjcwODUyLCAwLjY5NzY2LCAwLjcwODUyLCAwLjY5NzY2LCAwLjcwODUyLCAwLjY5NzY2LCAwLjcwODUyLCAxLCAxLCAwLjgxMDU1LCAwLjc1ODQxLCAwLjgxMDU1LCAxLjA2NDUyLCAwLjkwMzk5LCAwLjg2MzMxLCAwLjkwMzk5LCAwLjg2MzMxLCAwLjkwMzk5LCAwLjg2MzMxLCAwLjkwMzk5LCAwLjg2MzMxLCAwLjkwMzk5LCAwLjg2MzMxLCAwLjkwMzk5LCAwLjg2MzMxLCAwLjk2MDY4LCAwLjk1Nzk0LCAwLjc3ODkyLCAwLjg0NTQ4LCAwLjc3ODkyLCAwLjc4MjU3LCAwLjc5NDkyLCAwLjc4MjU3LCAwLjc5NDkyLCAwLjc4MjU3LCAwLjc5NDkyLCAwLjkyOTcsIDAuNTY4OTIsIDAuODM5MDgsIDAuOTQ5MDgsIDAuNzc1MzksIDAuODU4ODcsIDAuODcwNjgsIDAuODkwNDksIDEsIDEsIDAuODEwNTUsIDEuMDQxMDYsIDEuMjA1MjgsIDEuMjA1MjgsIDEsIDEuMTU1NDMsIDAuNzAwODgsIDAuOTgzODcsIDAuOTQ3MjEsIDEuMzM0MzEsIDEuNDU4OTQsIDAuOTUxNjEsIDEuNDgzODcsIDAuODM5MDgsIDAuODAzNTIsIDAuNTcxMTgsIDAuNjk2NSwgMC41NjM0NywgMC43OTE3OSwgMC41NTg1MywgMC44MDM0NiwgMS4wMjk4OCwgMC44MzkwOCwgMC43NzYyLCAwLjY3MTc0LCAwLjg2MDM2LCAwLjczMTMzLCAwLjc4MjU3LCAwLjg3MzU2LCAwLjg2NDQxLCAwLjk1OTU4LCAwLjc1NzI3LCAwLjg5MDE5LCAxLjA0OTI0LCAwLjkwODcyLCAwLjc0ODg5LCAwLjg1OTM4LCAwLjg3ODkxLCAwLjc5Nzk1LCAwLjc5NTcsIDAuODEwNTUsIDAuNzc4OTIsIDAuOTc0NDcsIDAuODI1NzcsIDAuOTc0NjYsIDAuODcxNzksIDAuOTU5NTgsIDAuNzc4OTIsIDAuOTQyNTIsIDAuOTU2MTIsIDAuODc1MywgMS4wMjk4OCwgMC45MjczMywgMC45NDI1MiwgMC44NzQxMSwgMC44NDAyMSwgMC44NzI4LCAwLjk1NjEyLCAwLjc0MDgxLCAwLjg3NTMsIDEuMDIxODksIDEuMDI5ODgsIDAuODQ4MTQsIDAuODc0NDUsIDAuOTE4MjIsIDAuODQ3MjMsIDAuODU2NjgsIDAuODYzMzEsIDAuODEzNDQsIDAuODc1ODEsIDAuNzY0MjIsIDAuODIwNDYsIDAuOTYwNTcsIDAuOTI3MzMsIDAuOTkzNzUsIDAuNzgwMjIsIDAuOTU0NTIsIDAuODYwMTUsIDEuMDI5ODgsIDAuOTI3MzMsIDAuODYzMzEsIDAuOTI3MzMsIDAuODYwMTUsIDAuNzMxMzMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA2MzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODgzMjMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODUxNzQsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTYwNjgsIDAuOTU3OTQsIDAuOTYwNjgsIDAuOTU3OTQsIDAuOTYwNjgsIDAuOTU3OTQsIDAuNzc4OTIsIDAuODQ1NDgsIDEsIDEsIDAuODk1NTIsIDAuOTA1MjcsIDEsIDAuOTAzNjMsIDAuOTI3OTQsIDAuOTI3OTQsIDAuOTI3OTQsIDAuODk4MDcsIDAuODcwMTIsIDAuODcwMTIsIDAuODcwMTIsIDAuODk1NTIsIDAuODk1NTIsIDEuNDIyNTksIDAuNzEwOTQsIDEuMDYxNTIsIDEsIDEsIDEuMDMzNzIsIDEuMDMzNzIsIDAuOTcxNzEsIDEuNDk1NiwgMi4yODA3LCAwLjkyOTcyLCAwLjgzNDA2LCAwLjkxMTMzLCAwLjgzMzI2LCAwLjkxMTMzLCAxLCAxLCAxLCAwLjcyMDIxLCAxLCAxLjIzMTA4LCAwLjgzNDg5LCAwLjg4NTI1LCAwLjg4NTI1LCAwLjgxNDk5LCAwLjkwNjE2LCAxLjgxMDU1LCAwLjkwNTI3LCAxLjgxMDU1LCAxLjMxMDcsIDEuNTM3MTEsIDAuOTQ0MzQsIDEuMDg2OTYsIDEsIDAuOTUwMTgsIDAuNzcxOTIsIDAuODUyODQsIDAuOTA3NDcsIDEuMTc1MzQsIDAuNjk4MjUsIDAuOTcxNiwgMS4zNzA3NywgMC45MDc0NywgMC45MDc0NywgMC44NTM1NiwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wODAwNCwgMC45MTAyNywgMSwgMSwgMSwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MDcyNywgMC45MDcyNywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmV4cG9ydHMuQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzID0gQ2FsaWJyaUJvbGRJdGFsaWNGYWN0b3JzOwpjb25zdCBDYWxpYnJpQm9sZEl0YWxpY01ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9OwpleHBvcnRzLkNhbGlicmlCb2xkSXRhbGljTWV0cmljcyA9IENhbGlicmlCb2xkSXRhbGljTWV0cmljczsKY29uc3QgQ2FsaWJyaUl0YWxpY0ZhY3RvcnMgPSBbMS4zODc3LCAxLCAxLCAxLCAxLjE3MjIzLCAxLjEyOTMsIDAuODk1NTIsIDAuOTExMzMsIDAuODAzOTUsIDEuMDIyNjksIDEuMTU2MDEsIDAuOTEwNTYsIDAuOTEwNTYsIDEuMjc5OCwgMC44NTI4NCwgMC44OTgwNywgMSwgMC45MDg2MSwgMS4zOTU0MywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45MTEzMywgMC45NjMwOSwgMC45NjMwOSwgMC44NTI4NCwgMC44NTI4NCwgMC44NTI4NCwgMC44MzMxOSwgMC44ODA3MSwgMC44Njc1LCAwLjgxNTUyLCAwLjcyMzQ2LCAwLjg1MTkzLCAwLjczMjA2LCAwLjc1MjIsIDAuODExMDUsIDAuODYyNzUsIDAuOTA2ODUsIDAuNjM3NywgMC43Nzg5MiwgMC43NTU5MywgMS4wMjYzOCwgMC44OTI0OSwgMC44NDExOCwgMC43NzQ1MiwgMC44NTM3NCwgMC43NTE4NiwgMC42Nzc4OSwgMC43OTc3NiwgMC44ODg0NCwgMC44NTA2NiwgMC45NDMwOSwgMC43NzgxOCwgMC43MzA2LCAwLjc2NjU5LCAxLjEwMzY5LCAxLjM4MzEzLCAxLjEwMzY5LCAxLjA2MTM5LCAwLjg5NTUyLCAwLjg3MzksIDAuOTI0NSwgMC45MjQ1LCAwLjgzMjAzLCAwLjkyNDUsIDAuODU4NjUsIDEuMDk4NDIsIDAuOTI0NSwgMC45MjQ1LCAxLjAzMjk3LCAxLjA3NjkyLCAwLjkwOTE4LCAxLjAzMjk3LCAwLjk0OTU5LCAwLjkyNDUsIDAuOTIyNzQsIDAuOTI0NSwgMC45MjQ1LCAxLjAyOTMzLCAwLjc3ODMyLCAxLjIwNTYyLCAwLjkyNDUsIDAuODkxNiwgMC45ODk4NiwgMC44NjYyMSwgMC44OTQ1MywgMC43OTAwNCwgMC45NDE1MiwgMS43NzI1NiwgMC45NDE1MiwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS45MTcyOSwgMC44OTU1MiwgMS4xNzg4OSwgMS4xMzI1NCwgMS4xNjM1OSwgMC45MjA5OCwgMC44NTI4NCwgMC42ODc4NywgMC43MTM1MywgMC44NDczNywgMC45MDc0NywgMS4wMDg4LCAxLjAwNDQsIDAuODc2ODMsIDEsIDEuMDkwOTEsIDEsIDAuOTIyMjksIDAuNzM5LCAxLjE1NjQyLCAwLjkyMDk4LCAwLjc2Mjg4LCAwLjgwNTA0LCAwLjgwOTcyLCAwLjc1ODU5LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjc2MzE4LCAwLjcyMzQ2LCAwLjczMjA2LCAwLjczMjA2LCAwLjczMjA2LCAwLjczMjA2LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjg2NDc3LCAwLjg5MjQ5LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg0MTE4LCAwLjg1Mjg0LCAwLjg0NTU3LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjczMDYsIDAuNzc0NTIsIDAuODYzMzEsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjkyNDUsIDAuODQ4NDMsIDAuODMyMDMsIDAuODU4NjUsIDAuODU4NjUsIDAuODU4NjUsIDAuODU4NjUsIDAuODI2MDEsIDAuODI2MDEsIDAuODI2MDEsIDAuODI2MDEsIDAuOTQ0NjksIDAuOTI0NSwgMC45MjI3NCwgMC45MjI3NCwgMC45MjI3NCwgMC45MjI3NCwgMC45MjI3NCwgMC45MDc0NywgMC44NjY1MSwgMC45MjQ1LCAwLjkyNDUsIDAuOTI0NSwgMC45MjQ1LCAwLjg5NDUzLCAwLjkyNDUsIDAuODk0NTMsIDAuODY3NSwgMC45MjQ1LCAwLjg2NzUsIDAuOTI0NSwgMC44Njc1LCAwLjkyNDUsIDAuNzIzNDYsIDAuODMyMDMsIDAuNzIzNDYsIDAuODMyMDMsIDAuNzIzNDYsIDAuODMyMDMsIDAuNzIzNDYsIDAuODMyMDMsIDAuODUxOTMsIDAuODg3NSwgMC44NjQ3NywgMC45OTAzNCwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC43MzIwNiwgMC44NTg2NSwgMC44MTEwNSwgMC45MjQ1LCAwLjgxMTA1LCAwLjkyNDUsIDAuODExMDUsIDAuOTI0NSwgMSwgMSwgMC44NjI3NSwgMC45MjQ1LCAwLjkwODcyLCAwLjkzNTkxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAwLjgyNjAxLCAwLjkwNjg1LCAxLjAzMjk3LCAwLjkwNjg1LCAwLjgyNjAxLCAwLjc3ODk2LCAxLjA1NjExLCAwLjYzNzcsIDEuMDc2OTIsIDEsIDEsIDAuOTA5MTgsIDAuNzU1OTMsIDEuMDMyOTcsIDEsIDEsIDAuNzYwMzIsIDAuOTM3NSwgMC45ODE1NiwgMC45MzQwNywgMC43NzI2MSwgMS4xMTQyOSwgMC44OTI0OSwgMC45MjQ1LCAxLCAxLCAwLjg5MjQ5LCAwLjkyNDUsIDAuOTI1MzQsIDAuODY2OTgsIDAuOTI0NSwgMC44NDExOCwgMC45MjI3NCwgMC44NDExOCwgMC45MjI3NCwgMC44NDExOCwgMC45MjI3NCwgMC44NjY3LCAwLjg2MjkxLCAwLjc1MTg2LCAxLjAyOTMzLCAxLCAxLCAwLjc1MTg2LCAxLjAyOTMzLCAwLjY3Nzg5LCAwLjc3ODMyLCAwLjY3Nzg5LCAwLjc3ODMyLCAwLjY3Nzg5LCAwLjc3ODMyLCAwLjY3Nzg5LCAwLjc3ODMyLCAxLCAxLCAwLjc5Nzc2LCAwLjk3NjU1LCAwLjc5Nzc2LCAxLjIzMDIzLCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjg4ODQ0LCAwLjkyNDUsIDAuODg4NDQsIDAuOTI0NSwgMC44ODg0NCwgMC45MjQ1LCAwLjk0MzA5LCAwLjk4OTg2LCAwLjczMDYsIDAuODk0NTMsIDAuNzMwNiwgMC43NjY1OSwgMC43OTAwNCwgMC43NjY1OSwgMC43OTAwNCwgMC43NjY1OSwgMC43OTAwNCwgMS4wOTIzMSwgMC41NDg3MywgMC44Njc1LCAwLjkyNDUsIDAuNzYzMTgsIDAuODQ4NDMsIDAuODQ1NTcsIDAuODY2NTEsIDEsIDEsIDAuNzk3NzYsIDEuMjA1NjIsIDEuMTg2MjIsIDEuMTg2MjIsIDEsIDEuMTQzNywgMC42NzAwOSwgMC45NjMzNCwgMC45MzY5NSwgMS4zNTE5MSwgMS40MDkwOSwgMC45NTE2MSwgMS40ODM4NywgMC44Njc1LCAwLjkwODYxLCAwLjYxOTIsIDAuNzM2MywgMC42NDgyNCwgMC44MjQxMSwgMC41NjMyMSwgMC44NTY5NiwgMS4yMzUxNiwgMC44Njc1LCAwLjgxNTUyLCAwLjcyODYsIDAuODQxMzQsIDAuNzMyMDYsIDAuNzY2NTksIDAuODYyNzUsIDAuODQzNjksIDAuOTA2ODUsIDAuNzc4OTIsIDAuODU4NzEsIDEuMDI2MzgsIDAuODkyNDksIDAuNzU4MjgsIDAuODQxMTgsIDAuODU5ODQsIDAuNzc0NTIsIDAuNzY0NjYsIDAuNzk3NzYsIDAuNzMwNiwgMC45MDc4MiwgMC43NzgxOCwgMC45MDMsIDAuODcyOTEsIDAuOTA2ODUsIDAuNzMwNiwgMC45OTA1OCwgMS4wMzY2NywgMC45NDYzNSwgMS4yMzUxNiwgMC45ODQ5LCAwLjk5MDU4LCAwLjkyMzkzLCAwLjg5MTYsIDAuOTQyLCAxLjAzNjY3LCAwLjc1MDI2LCAwLjk0NjM1LCAxLjAyOTcsIDEuMjM1MTYsIDAuOTA5MTgsIDAuOTQwNDgsIDAuOTgyMTcsIDAuODk3NDYsIDAuODQxNTMsIDAuOTIyNzQsIDAuODI1MDcsIDAuODg4MzIsIDAuODQ0MzgsIDAuODgxNzgsIDEuMDM1MjUsIDAuOTg0OSwgMS4wMDIyNSwgMC43ODA4NiwgMC45NzI0OCwgMC44OTQwNCwgMS4yMzUxNiwgMC45ODQ5LCAwLjkyMjc0LCAwLjk4NDksIDAuODk0MDQsIDAuNzMyMDYsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODk2OTMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuODU4NjUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTA5MzMsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQzMDksIDAuOTg5ODYsIDAuOTQzMDksIDAuOTg5ODYsIDAuOTQzMDksIDAuOTg5ODYsIDAuNzMwNiwgMC44OTQ1MywgMSwgMSwgMC44OTU1MiwgMC45MDUyNywgMSwgMC45MDE4NiwgMS4xMjMwOCwgMS4xMjMwOCwgMS4xMjMwOCwgMS4xMjMwOCwgMS4yNTY2LCAxLjI1NjYsIDEuMjU2NiwgMC44OTU1MiwgMC44OTU1MiwgMS40MjI1OSwgMC42ODk5NCwgMS4wMzgwOSwgMSwgMSwgMS4wMTc2LCAxLjAxNzYsIDEuMTE1MjMsIDEuNDk1NiwgMi4wMTQ2MiwgMC45Nzg1OCwgMC44MjYxNiwgMC45MTEzMywgMC44MzQzNywgMC45MTEzMywgMSwgMSwgMSwgMC43MDUwOCwgMSwgMS4yMzEwOCwgMC43OTgwMSwgMC44NDQyNiwgMC44NDQyNiwgMC43NzQsIDAuOTA1NzIsIDEuODEwNTUsIDAuOTA3NDksIDEuODEwNTUsIDEuMjg4MDksIDEuNTU0NjksIDAuOTQ0MzQsIDEuMDc4MDYsIDEsIDAuOTcwOTQsIDAuNzU4OSwgMC44NTI4NCwgMC45MDc0NywgMS4xOTY1OCwgMC42OTgyNSwgMC45NzYyMiwgMS4zMzUxMiwgMC45MDc0NywgMC45MDc0NywgMC44NTI4NCwgMC45MDc0NywgMC45MDc0NywgMS40NDk0NywgMC44NTI4NCwgMC44OTQxLCAwLjg5NDEsIDAuNzA1NzIsIDAuOCwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMC43MDU3MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTg2MiwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMS4wMzM2LCAwLjkxMDI3LCAxLCAxLCAxLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1ODU5LCAxLjA1ODU5LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKZXhwb3J0cy5DYWxpYnJpSXRhbGljRmFjdG9ycyA9IENhbGlicmlJdGFsaWNGYWN0b3JzOwpjb25zdCBDYWxpYnJpSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIyMDcsCiAgbGluZUdhcDogMC4yMjA3Cn07CmV4cG9ydHMuQ2FsaWJyaUl0YWxpY01ldHJpY3MgPSBDYWxpYnJpSXRhbGljTWV0cmljczsKY29uc3QgQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzID0gWzEuMzg3NywgMSwgMSwgMSwgMS4xNzIyMywgMS4xMjkzLCAwLjg5NTUyLCAwLjkxMTMzLCAwLjgwMzk1LCAxLjAyMjY5LCAxLjE1NjAxLCAwLjkxMDU2LCAwLjkxMDU2LCAxLjI3OTgsIDAuODUyODQsIDAuODk4MDcsIDEsIDAuOTA4NjEsIDEuMzkwMTYsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTExMzMsIDAuOTYzMDksIDAuOTYzMDksIDAuODUyODQsIDAuODUyODQsIDAuODUyODQsIDAuODMzMTksIDAuODgwNzEsIDAuODY3NSwgMC44MTU1MiwgMC43MzgzNCwgMC44NTE5MywgMC43MzIwNiwgMC43NTIyLCAwLjgxMTA1LCAwLjg2Mjc1LCAwLjkwNjg1LCAwLjYzNzcsIDAuNzc4OTIsIDAuNzU1OTMsIDEuMDI2MzgsIDAuODkzODUsIDAuODUxMjIsIDAuNzc0NTIsIDAuODY1MDMsIDAuNzUxODYsIDAuNjg4ODcsIDAuNzk3NzYsIDAuODg4NDQsIDAuODUwNjYsIDAuOTQyNTgsIDAuNzc4MTgsIDAuNzMwNiwgMC43NjY1OSwgMS4xMDM2OSwgMS4zOTAxNiwgMS4xMDM2OSwgMS4wNjEzOSwgMC44OTU1MiwgMC44NzM5LCAwLjg2MTI4LCAwLjk0NDY5LCAwLjg0NTcsIDAuOTQ0NjksIDAuODk0NjQsIDEuMDk4NDIsIDAuODQ2MzYsIDAuOTQ0NjksIDEuMDMyOTcsIDEuMDc2OTIsIDAuOTA5MTgsIDEuMDMyOTcsIDAuOTU4OTcsIDAuOTQ0NjksIDAuOTQ4MiwgMC45NDQ2OSwgMC45NDQ2OSwgMS4wNDY5MiwgMC43ODIyMywgMS4yMDU2MiwgMC45NDQ2OSwgMC45MDMzMiwgMC45ODk4NiwgMC44NjYyMSwgMC45MDUyNywgMC43OTAwNCwgMC45NDE1MiwgMS43NzI1NiwgMC45NDE1MiwgMC44NTI4NCwgMC45NzgwMSwgMC44OTU1MiwgMC45MTEzMywgMC44OTU1MiwgMC45MTEzMywgMS45MTcyOSwgMC44OTU1MiwgMS4xNzg4OSwgMS4xMzI1NCwgMS4wODcwNywgMC45MjA5OCwgMC44NTI4NCwgMC42ODc4NywgMC43MTM1MywgMC44NDczNywgMC45MDc0NywgMS4wMDg4LCAxLjAwNDQsIDAuODc2ODMsIDEsIDEuMDkwOTEsIDEsIDAuOTIyMjksIDAuNzM5LCAxLjE1NjQyLCAwLjkyMDk4LCAwLjc2Mjg4LCAwLjgwNTA0LCAwLjgwOTcyLCAwLjc1ODU5LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjg2NzUsIDAuODY3NSwgMC44Njc1LCAwLjc2MzE4LCAwLjczODM0LCAwLjczMjA2LCAwLjczMjA2LCAwLjczMjA2LCAwLjczMjA2LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjkwNjg1LCAwLjg2NDc3LCAwLjg5Mzg1LCAwLjg1MTIyLCAwLjg1MTIyLCAwLjg1MTIyLCAwLjg1MTIyLCAwLjg1MTIyLCAwLjg1Mjg0LCAwLjg1MzExLCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjg4ODQ0LCAwLjczMDYsIDAuNzc0NTIsIDAuODYzMzEsIDAuODYxMjgsIDAuODYxMjgsIDAuODYxMjgsIDAuODYxMjgsIDAuODYxMjgsIDAuODYxMjgsIDAuODY5MywgMC44NDU3LCAwLjg5NDY0LCAwLjg5NDY0LCAwLjg5NDY0LCAwLjg5NDY0LCAwLjgyNjAxLCAwLjgyNjAxLCAwLjgyNjAxLCAwLjgyNjAxLCAwLjk0NDY5LCAwLjk0NDY5LCAwLjk0ODIsIDAuOTQ4MiwgMC45NDgyLCAwLjk0ODIsIDAuOTQ4MiwgMC45MDc0NywgMC44NjY1MSwgMC45NDQ2OSwgMC45NDQ2OSwgMC45NDQ2OSwgMC45NDQ2OSwgMC45MDUyNywgMC45NDQ2OSwgMC45MDUyNywgMC44Njc1LCAwLjg2MTI4LCAwLjg2NzUsIDAuODYxMjgsIDAuODY3NSwgMC44NjEyOCwgMC43MzgzNCwgMC44NDU3LCAwLjczODM0LCAwLjg0NTcsIDAuNzM4MzQsIDAuODQ1NywgMC43MzgzNCwgMC44NDU3LCAwLjg1MTkzLCAwLjkyNDU0LCAwLjg2NDc3LCAwLjk5MjEsIDAuNzMyMDYsIDAuODk0NjQsIDAuNzMyMDYsIDAuODk0NjQsIDAuNzMyMDYsIDAuODk0NjQsIDAuNzMyMDYsIDAuODk0NjQsIDAuNzMyMDYsIDAuODk0NjQsIDAuODExMDUsIDAuODQ2MzYsIDAuODExMDUsIDAuODQ2MzYsIDAuODExMDUsIDAuODQ2MzYsIDEsIDEsIDAuODYyNzUsIDAuOTQ0NjksIDAuOTA4NzIsIDAuOTU3ODYsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDAuODI2MDEsIDAuOTA2ODUsIDEuMDMyOTcsIDAuOTA2ODUsIDAuODI2MDEsIDAuNzc3NDEsIDEuMDU2MTEsIDAuNjM3NywgMS4wNzY5MiwgMSwgMSwgMC45MDkxOCwgMC43NTU5MywgMS4wMzI5NywgMSwgMSwgMC43NjAzMiwgMC45MDQ1MiwgMC45ODE1NiwgMS4xMTg0MiwgMC43NzI2MSwgMS4xMTQyOSwgMC44OTM4NSwgMC45NDQ2OSwgMSwgMSwgMC44OTM4NSwgMC45NDQ2OSwgMC45NTg3NywgMC44NjkwMSwgMC45NDQ2OSwgMC44NTEyMiwgMC45NDgyLCAwLjg1MTIyLCAwLjk0ODIsIDAuODUxMjIsIDAuOTQ4MiwgMC44NjY3LCAwLjkwMDE2LCAwLjc1MTg2LCAxLjA0NjkyLCAxLCAxLCAwLjc1MTg2LCAxLjA0NjkyLCAwLjY4ODg3LCAwLjc4MjIzLCAwLjY4ODg3LCAwLjc4MjIzLCAwLjY4ODg3LCAwLjc4MjIzLCAwLjY4ODg3LCAwLjc4MjIzLCAxLCAxLCAwLjc5Nzc2LCAwLjkyMTg4LCAwLjc5Nzc2LCAxLjIzMDIzLCAwLjg4ODQ0LCAwLjk0NDY5LCAwLjg4ODQ0LCAwLjk0NDY5LCAwLjg4ODQ0LCAwLjk0NDY5LCAwLjg4ODQ0LCAwLjk0NDY5LCAwLjg4ODQ0LCAwLjk0NDY5LCAwLjg4ODQ0LCAwLjk0NDY5LCAwLjk0MjU4LCAwLjk4OTg2LCAwLjczMDYsIDAuOTA1MjcsIDAuNzMwNiwgMC43NjY1OSwgMC43OTAwNCwgMC43NjY1OSwgMC43OTAwNCwgMC43NjY1OSwgMC43OTAwNCwgMS4wOTIzMSwgMC41NDg3MywgMC44Njc1LCAwLjg2MTI4LCAwLjc2MzE4LCAwLjg2OTMsIDAuODUzMTEsIDAuODY2NTEsIDEsIDEsIDAuNzk3NzYsIDEuMjA1NjIsIDEuMTg2MjIsIDEuMTg2MjIsIDEsIDEuMTQzNywgMC42Nzc0MiwgMC45NjMzNCwgMC45MzY5NSwgMS4zNTE5MSwgMS40MDkwOSwgMC45NTE2MSwgMS40ODM4NywgMC44NjY4NiwgMC45MDg2MSwgMC42MjI2NywgMC43NDM1OSwgMC42NTY0OSwgMC44NTQ5OCwgMC41Njk2MywgMC44ODI1NCwgMS4yMzUxNiwgMC44Njc1LCAwLjgxNTUyLCAwLjc1NDQzLCAwLjg0NTAzLCAwLjczMjA2LCAwLjc2NjU5LCAwLjg2Mjc1LCAwLjg1MTIyLCAwLjkwNjg1LCAwLjc3ODkyLCAwLjg1NzQ2LCAxLjAyNjM4LCAwLjg5Mzg1LCAwLjc1NjU3LCAwLjg1MTIyLCAwLjg2Mjc1LCAwLjc3NDUyLCAwLjc0MTcxLCAwLjc5Nzc2LCAwLjczMDYsIDAuOTUxNjUsIDAuNzc4MTgsIDAuODk3NzIsIDAuODg4MzEsIDAuOTA2ODUsIDAuNzMwNiwgMC45ODE0MiwgMS4wMjE5MSwgMC45NjU3NiwgMS4yMzUxNiwgMC45OTAxOCwgMC45ODE0MiwgMC45MjM2LCAwLjg5MjU4LCAwLjk0MDM1LCAxLjAyMTkxLCAwLjc4ODQ4LCAwLjk2NTc2LCAwLjk1NjEsIDEuMjM1MTYsIDAuOTA5MTgsIDAuOTI1NzgsIDAuOTU0MjQsIDAuODk3NDYsIDAuODM5NjksIDAuOTQ4MiwgMC44MDExMywgMC44OTQ0MiwgMC44NTIwOCwgMC44NjE1NSwgMC45ODAyMiwgMC45OTAxOCwgMS4wMDQ1MiwgMC44MTIwOSwgMC45OTI0NywgMC44OTE4MSwgMS4yMzUxNiwgMC45OTAxOCwgMC45NDgyLCAwLjk5MDE4LCAwLjg5MTgxLCAwLjczMjA2LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg4ODQ0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg5NDY0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk2NzY2LCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk0MjU4LCAwLjk4OTg2LCAwLjk0MjU4LCAwLjk4OTg2LCAwLjk0MjU4LCAwLjk4OTg2LCAwLjczMDYsIDAuOTA1MjcsIDEsIDEsIDAuODk1NTIsIDAuOTA1MjcsIDEsIDAuOTAxODYsIDEuMTIzMDgsIDEuMTIzMDgsIDEuMTIzMDgsIDEuMTIzMDgsIDEuMjU2NiwgMS4yNTY2LCAxLjI1NjYsIDAuODk1NTIsIDAuODk1NTIsIDEuNDIyNTksIDAuNjkwNDMsIDEuMDM4MDksIDEsIDEsIDEuMDE3NiwgMS4wMTc2LCAxLjExNTIzLCAxLjQ5NTYsIDIuMDE0NjIsIDAuOTkzMzEsIDAuODI2MTYsIDAuOTExMzMsIDAuODQyODYsIDAuOTExMzMsIDEsIDEsIDEsIDAuNzA1MDgsIDEsIDEuMjMxMDgsIDAuNzk4MDEsIDAuODQ0MjYsIDAuODQ0MjYsIDAuNzc0LCAwLjkwNTI3LCAxLjgxMDU1LCAwLjkwNTI3LCAxLjgxMDU1LCAxLjI4ODA5LCAxLjU1NDY5LCAwLjk0NDM0LCAxLjA3ODA2LCAxLCAwLjk3MDk0LCAwLjc1ODksIDAuODUyODQsIDAuOTA3NDcsIDEuMTk2NTgsIDAuNjk4MjUsIDAuOTc2MjIsIDEuMzM1MTIsIDAuOTA3NDcsIDAuOTA3NDcsIDAuODUzNTYsIDAuOTA3NDcsIDAuOTA3NDcsIDEuNDQ5NDcsIDAuODUyODQsIDAuODk0MSwgMC44OTQxLCAwLjcwNTcyLCAwLjgsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDAuNzA1NzIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMDMzNiwgMC45MTAyNywgMSwgMSwgMSwgMC45OTg2MiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNTg1OSwgMS4wNTg1OSwgMSwgMSwgMSwgMS4wNzE4NSwgMC45OTQxMywgMC45NjMzNCwgMS4wODA2NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmV4cG9ydHMuQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzID0gQ2FsaWJyaVJlZ3VsYXJGYWN0b3JzOwpjb25zdCBDYWxpYnJpUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4yMjA3LAogIGxpbmVHYXA6IDAuMjIwNwp9OwpleHBvcnRzLkNhbGlicmlSZWd1bGFyTWV0cmljcyA9IENhbGlicmlSZWd1bGFyTWV0cmljczsKCi8qKiovIH0pLAovKiA1MyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkhlbHZldGljYVJlZ3VsYXJNZXRyaWNzID0gZXhwb3J0cy5IZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyA9IGV4cG9ydHMuSGVsdmV0aWNhSXRhbGljTWV0cmljcyA9IGV4cG9ydHMuSGVsdmV0aWNhSXRhbGljRmFjdG9ycyA9IGV4cG9ydHMuSGVsdmV0aWNhQm9sZE1ldHJpY3MgPSBleHBvcnRzLkhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzID0gZXhwb3J0cy5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycyA9IGV4cG9ydHMuSGVsdmV0aWNhQm9sZEZhY3RvcnMgPSB2b2lkIDA7CmNvbnN0IEhlbHZldGljYUJvbGRGYWN0b3JzID0gWzAuNzYxMTYsIDEsIDEsIDEuMDAwNiwgMC45OTk5OCwgMC45OTk3NCwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMC45OTk3NywgMS4wMDA4NywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAyNiwgMC45OTk5LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5OTgsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDAwMywgMC45OTk3MywgMC45OTk5OCwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk4MiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk1OSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyMiwgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk1OSwgMS4wMDA3NywgMC45OTk1OSwgMS4wMDAwMywgMC45OTk5OCwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA3NywgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk3MywgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wNjQwOSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMC45OTk3NywgMS4wMzM3NCwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDQyLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAzODI4LCAxLjAwMDI2LCAwLjk5OTk5LCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5MywgMC45OTk4LCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLCAxLjAwMDE2LCAwLjk5OTc3LCAwLjk5OTU5LCAwLjk5OTc3LCAwLjk5OTU5LCAwLjk5OTc3LCAwLjk5OTU5LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAxLjAwMDI2LCAwLjgxMjEsIDEuMDAwMjYsIDAuOTk5OTgsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDEuMDAwMjYsIDEsIDEuMDAwMjYsIDEsIDEuMDAwMjYsIDEsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMSwgMC45OTk4MiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMS4wMDAzNCwgMC45OTk3NywgMSwgMC45OTk5NywgMS4wMDAyNiwgMS4wMDA3OCwgMS4wMDAzNiwgMC45OTk3MywgMS4wMDAxMywgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTg4LCAwLjg1MTQ4LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwNjksIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDAuOTk5ODQsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMjQsIDEuMDAwMDEsIDAuOTk5OSwgMSwgMS4wMDA2LCAxLjAwMDAxLCAxLjAwMDQxLCAwLjk5OTYyLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTUsIDEuMDAwNDEsIDAuOTk5NDIsIDAuOTk5NzMsIDAuOTk5MjcsIDEuMDAwODIsIDAuOTk5MDIsIDEuMDAwMjYsIDEuMDAwODcsIDEuMDAwNiwgMS4wMDA2OSwgMC45OTk3MywgMC45OTg2NywgMC45OTk3MywgMC45OTkzLCAxLjAwMDI2LCAxLjAwMDQ5LCAxLjAwMDU2LCAxLCAwLjk5OTg4LCAwLjk5OTM1LCAwLjk5OTk1LCAwLjk5OTU0LCAxLjAwMDU1LCAwLjk5OTQ1LCAxLjAwMDMyLCAxLjAwMDYsIDAuOTk5OTUsIDEuMDAwMjYsIDAuOTk5OTUsIDEuMDAwMzIsIDEuMDAwMDEsIDEuMDAwMDgsIDAuOTk5NzEsIDEuMDAwMTksIDAuOTk5NCwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDQ0LCAwLjk5OTczLCAxLjAwMDIzLCAxLjAwMDQ3LCAxLCAwLjk5OTQyLCAwLjk5NTYxLCAwLjk5OTg5LCAxLjAwMDM1LCAwLjk5OTc3LCAxLjAwMDM1LCAwLjk5OTc3LCAxLjAwMDE5LCAwLjk5OTQ0LCAxLjAwMDAxLCAxLjAwMDIxLCAwLjk5OTI2LCAxLjAwMDM1LCAxLjAwMDM1LCAwLjk5OTQyLCAxLjAwMDQ4LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTg5LCAxLjAwMDU3LCAxLjAwMDAxLCAwLjk5OTM2LCAxLjAwMDUyLCAxLjAwMDEyLCAwLjk5OTk2LCAxLjAwMDQzLCAxLCAxLjAwMDM1LCAwLjk5OTQsIDAuOTk5NzYsIDEuMDAwMzUsIDAuOTk5NzMsIDEuMDAwNTIsIDEuMDAwNDEsIDEuMDAxMTksIDEuMDAwMzcsIDAuOTk5NzMsIDEuMDAwMDIsIDAuOTk5ODYsIDEuMDAwNDEsIDEuMDAwNDEsIDAuOTk5MDIsIDAuOTk5NiwgMS4wMDAzNCwgMC45OTk5OSwgMS4wMDAyNiwgMC45OTk5OSwgMS4wMDAyNiwgMC45OTk3MywgMS4wMDA1MiwgMC45OTk3MywgMSwgMC45OTk3MywgMS4wMDA0MSwgMS4wMDA3NSwgMC45OTk0LCAxLjAwMDMsIDAuOTk5OTksIDEsIDEuMDAwNDEsIDAuOTk5NTUsIDEsIDAuOTk5MTUsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjYsIDEuMDAxMTksIDAuOTk5NTUsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTkxMSwgMS4wMDA2LCAxLjAwMDI2LCAwLjk5OTcyLCAxLjAwMDI2LCAwLjk5OTAyLCAxLjAwMDQxLCAwLjk5OTczLCAwLjk5OTk5LCAxLCAxLCAxLjAwMDM4LCAxLjAwMDUsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMSwgMSwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MiwgMSwgMSwgMS4wMDEwNiwgMC45OTk5OSwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OSwgMC45OTk5OCwgMS42NjQ3NSwgMSwgMC45OTk3MywgMC45OTk3MywgMS4wMDAyMywgMC45OTk3MywgMC45OTk3MSwgMS4wMDA0NywgMS4wMDAyMywgMSwgMC45OTk5MSwgMC45OTk4NCwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45OTk3MiwgMSwgMS4yMDk4NSwgMS4zOTcxMywgMS4wMDAwMywgMS4wMDAzMSwgMS4wMDAxNSwgMSwgMC45OTU2MSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTcyLCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpleHBvcnRzLkhlbHZldGljYUJvbGRGYWN0b3JzID0gSGVsdmV0aWNhQm9sZEZhY3RvcnM7CmNvbnN0IEhlbHZldGljYUJvbGRNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKZXhwb3J0cy5IZWx2ZXRpY2FCb2xkTWV0cmljcyA9IEhlbHZldGljYUJvbGRNZXRyaWNzOwpjb25zdCBIZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycyA9IFswLjc2MTE2LCAxLCAxLCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5NzQsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDAuOTk5NzcsIDEuMDAwODcsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NTksIDEuMDAwMDMsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5OTgsIDEsIDEuMDAwMDMsIDEuMDAwMDMsIDEuMDAwMDMsIDEuMDAwMjYsIDAuOTk5OSwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDAxLCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDE2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTk4LCAxLjAwMDYsIDAuOTk5OTgsIDEuMDAwMDMsIDAuOTk5NzMsIDAuOTk5OTgsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5ODIsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NTksIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjYsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NTksIDEuMDAwNzcsIDAuOTk5NTksIDEuMDAwMDMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNzcsIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjUsIDAuOTk5NjgsIDAuOTk5NzMsIDEuMDAwMDMsIDEuMDAwMjUsIDAuNjAyOTksIDEuMDAwMjQsIDEuMDY0MDksIDEsIDEsIDAuOTk5OTgsIDEsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk5OCwgMSwgMC45OTkzNiwgMC45OTk3MywgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAwMiwgMS4wMDAyNiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMSwgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDIyLCAxLjAwMDAzLCAxLjAwMDIyLCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTgyLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDY0MDksIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDEuMDAwMjYsIDAuOTk5NzMsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzcsIDEuMDA0NCwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAyMiwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTcxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMS4wMDA2LCAxLjAwMDI2LCAxLjAxMDExLCAxLjAwMDI2LCAwLjk5OTk5LCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5MywgMC45OTk4LCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDIyLCAxLjAwMDI2LCAxLCAxLjAwMDE2LCAwLjk5OTc3LCAwLjk5OTU5LCAwLjk5OTc3LCAwLjk5OTU5LCAwLjk5OTc3LCAwLjk5OTU5LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTk4LCAxLjAwMDI2LCAwLjgxMjEsIDEuMDAwMjYsIDAuOTk5OTgsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjYsIDEuMDAwMTYsIDEuMDAwMjIsIDEuMDAwMDEsIDAuOTk5NzMsIDEuMDAwMDEsIDEuMDAwMjYsIDEsIDEuMDAwMjYsIDEsIDEuMDAwMjYsIDEsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3NywgMC45OTk3MywgMSwgMC45OTk4MiwgMS4wMDAyMiwgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAyNiwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk5OCwgMC45OTk3NywgMSwgMSwgMS4wMDAyNiwgMC45OTk2OSwgMC45OTk3MiwgMC45OTk4MSwgMC45OTk4LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDAuOTExNTUsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMC45OTk2NiwgMS4wMDAyMiwgMS4wMDAzMiwgMS4wMDAwMSwgMC45OTk0NCwgMS4wMDAyNiwgMS4wMDAwMSwgMC45OTk2OCwgMS4wMDAwMSwgMS4wMDA0NywgMSwgMS4wMDA2LCAxLjAwMDAxLCAwLjk5OTgxLCAxLjAwMTAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5NDgsIDAuOTk5ODEsIDEuMDAwNjQsIDAuOTk5NzMsIDAuOTk5NDIsIDEuMDAxMDEsIDEuMDAwNjEsIDEuMDAwMjYsIDEuMDAwNjksIDEuMDAwNiwgMS4wMDAxNCwgMC45OTk3MywgMS4wMTMyMiwgMC45OTk3MywgMS4wMDA2NSwgMS4wMDAyNiwgMS4wMDAxMiwgMC45OTkyMywgMSwgMS4wMDA2NCwgMS4wMDA3NiwgMC45OTk0OCwgMS4wMDA1NSwgMS4wMDA2MywgMS4wMDAwNywgMC45OTk0MywgMS4wMDA2LCAwLjk5OTQ4LCAxLjAwMDI2LCAwLjk5OTQ4LCAwLjk5OTQzLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI5LCAxLjAwMDM4LCAxLjAwMDM1LCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3OCwgMS4wMDAwMSwgMS4wMDA1NywgMC45OTk4OSwgMC45OTk2NywgMC45OTk2NCwgMC45OTk2NywgMC45OTk3NywgMC45OTk5OSwgMC45OTk3NywgMS4wMDAzOCwgMC45OTk3NywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDA2NiwgMC45OTk2NywgMC45OTk2NywgMS4wMDA0MSwgMC45OTk5OCwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMC45OTk2NywgMS4wMDAwMSwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk2NCwgMS4wMDAzMSwgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk5OSwgMSwgMS4wMDAyMywgMSwgMSwgMC45OTk5OSwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3MywgMC45OTk3NywgMC45OTk5OSwgMS4wMDA1OCwgMC45OTk3MywgMC45OTk3MywgMC45OTk1NSwgMC45OTk1LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDMyLCAwLjk5OTg5LCAxLjAwMDM0LCAwLjk5OTk5LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk5OTczLCAwLjQ1OTk4LCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTk5LCAwLjk5OTgyLCAwLjk5OTk0LCAwLjk5OTk2LCAxLCAxLjAwMDQyLCAxLjAwMDQ0LCAxLjAwMDI5LCAxLjAwMDIzLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDI2LCAwLjk5OTQ5LCAxLjAwMDAyLCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTc1LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDMyLCAwLjk4Njg1LCAwLjk5OTczLCAxLjAwMDI2LCAxLCAxLCAwLjk5OTY2LCAxLjAwMDQ0LCAxLjAwMDE2LCAxLjAwMDIyLCAxLjAwMDE2LCAxLjAwMDIyLCAxLjAwMDE2LCAxLjAwMDIyLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTU1LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEsIDEsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzIsIDEsIDEsIDEuMDAxMDYsIDAuOTk5OTksIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTksIDAuOTk5OTgsIDEuNjY0NzUsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NzMsIDAuOTk5NzEsIDAuOTk5NzgsIDEsIDEsIDAuOTk5OTEsIDAuOTk5ODQsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwOTgsIDEsIDEsIDEsIDEuMDAwNDksIDEsIDEsIDAuOTk5NzIsIDEsIDEuMjA5ODUsIDEuMzk3MTMsIDEuMDAwMDMsIDEuMDAwMzEsIDEuMDAwMTUsIDEsIDAuOTk1NjEsIDEuMDAwMjcsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5MTUsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5OTksIDEuMDAwMDMsIDAuOTk5OTksIDAuOTk5OTksIDEuNDExNDQsIDEuNiwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MDU3OSwgMS40MDU3OSwgMS4zNjYyNSwgMC45OTk5OSwgMSwgMC45OTg2MSwgMC45OTg2MSwgMSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45OTk3MiwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMS40MDQ4MywgMSwgMC45OTk3NywgMS4wMDA1NCwgMSwgMSwgMC45OTk1MywgMC45OTk2MiwgMS4wMDA0MiwgMC45OTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKZXhwb3J0cy5IZWx2ZXRpY2FCb2xkSXRhbGljRmFjdG9ycyA9IEhlbHZldGljYUJvbGRJdGFsaWNGYWN0b3JzOwpjb25zdCBIZWx2ZXRpY2FCb2xkSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjM1LAogIGxpbmVHYXA6IDAuMgp9OwpleHBvcnRzLkhlbHZldGljYUJvbGRJdGFsaWNNZXRyaWNzID0gSGVsdmV0aWNhQm9sZEl0YWxpY01ldHJpY3M7CmNvbnN0IEhlbHZldGljYUl0YWxpY0ZhY3RvcnMgPSBbMC43NjExNiwgMSwgMSwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEuMDAwMDEsIDEuMDAwNDMsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NTksIDEuMDAwMDMsIDEuMDAwNiwgMC45OTk5OCwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMSwgMS4wMDAwMywgMS4wMDAwMywgMS4wMDAwMywgMC45OTk3MywgMC45OTk4NywgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAyNiwgMS4wMDAyMiwgMC45OTk3NywgMS4wMDA2LCAxLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDAxLCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDE2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ5LCAwLjk5OTczLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDAuOTk5MjQsIDEsIDAuOTk5MjQsIDAuOTk5OTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5OTgsIDEsIDEuMDAwNiwgMC45OTk3MywgMSwgMC45OTk3NywgMSwgMSwgMSwgMS4wMDAwNSwgMS4wMDA5LCAxLjAwMDA1LCAxLjAwMDAzLCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDksIDAuOTk5NzMsIDAuOTk5OTgsIDEuMDAwMjUsIDAuOTk5NjgsIDAuOTk5NzMsIDEuMDAwMDMsIDEuMDAwMjUsIDAuNjAyOTksIDEuMDAwMjQsIDEuMDY0MDksIDEsIDEsIDAuOTk5OTgsIDEsIDAuOTk5OCwgMS4wMDA2LCAwLjk5OTk4LCAxLCAwLjk5OTM2LCAwLjk5OTczLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMjIsIDEuMDAwMDMsIDEuMDAwMjIsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5ODIsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wNjQwOSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMSwgMC45OTk3MywgMSwgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMS4wMDAwMSwgMC45OTk3MywgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMSwgMC45OTk3NywgMS4wMjg4LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTQ2LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjA2MzExLCAwLjk5OTczLCAxLjAwMDI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQxLCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44OTU0NywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwNTQsIDAuOTk5NzcsIDEuMDAwODQsIDEuMDAwMDcsIDAuOTk5NzMsIDEuMDAwMTMsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTEyMjEsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwNiwgMS4wMDAwMSwgMS4wMDAwMSwgMC45OTk5OSwgMC45OTk3NywgMC45OTkzMywgMS4wMDAyMiwgMS4wMDA1NCwgMS4wMDAwMSwgMS4wMDA2NSwgMS4wMDAyNiwgMS4wMDAwMSwgMS4wMDAxLCAxLjAwMDAxLCAxLjAwMDUyLCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NDUsIDAuOTk4OTcsIDAuOTk5NjgsIDAuOTk5MjQsIDEuMDAwMzYsIDAuOTk5NDUsIDAuOTk5NDksIDEsIDEuMDAwNiwgMC45OTg5NywgMC45OTkxOCwgMC45OTk2OCwgMC45OTkxMSwgMC45OTkyNCwgMSwgMC45OTk2MiwgMS4wMTQ4NywgMSwgMS4wMDA1LCAwLjk5OTczLCAxLjAwMDEyLCAxLjAwMDQzLCAxLCAwLjk5OTk1LCAwLjk5OTk0LCAxLjAwMDM2LCAwLjk5OTQ3LCAxLjAwMDE5LCAxLjAwMDYzLCAxLjAwMDI1LCAwLjk5OTI0LCAxLjAwMDM2LCAwLjk5OTczLCAxLjAwMDM2LCAxLjAwMDI1LCAxLjAwMDAxLCAxLjAwMDAxLCAxLjAwMDI3LCAxLjAwMDEsIDEuMDAwNjgsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLCAxLjAwMDA4LCAwLjk5OTU3LCAwLjk5OTcyLCAwLjk5OTQsIDAuOTk5NTQsIDAuOTk5NzUsIDEuMDAwNTEsIDEuMDAwMDEsIDEuMDAwMTksIDEuMDAwMDEsIDEuMDAwMSwgMC45OTk4NiwgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAzOCwgMC45OTk1NCwgMC45OTk1NCwgMC45OTk0LCAxLjAwMDY2LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDIyLCAxLjAwMDU0LCAxLjAwMDAxLCAwLjk5OTc3LCAxLjAwMDI2LCAwLjk5OTc1LCAxLjAwMDEsIDEuMDAwMDEsIDAuOTk5OTMsIDAuOTk5NSwgMC45OTk1NSwgMS4wMDAxNiwgMC45OTk3OCwgMC45OTk3NCwgMS4wMDAxOSwgMS4wMDAyMiwgMC45OTk1NSwgMS4wMDA1MywgMC45OTk3MywgMS4wMDA4OSwgMS4wMDAwNSwgMC45OTk2NywgMS4wMDA0OCwgMC45OTk3MywgMS4wMDAwMiwgMS4wMDAzNCwgMC45OTk3MywgMC45OTk3MywgMC45OTk2NCwgMS4wMDAwNiwgMS4wMDA2NiwgMC45OTk0NywgMC45OTk3MywgMC45ODg5NCwgMC45OTk3MywgMSwgMC40NDg5OCwgMSwgMC45OTk0NiwgMSwgMS4wMDAzOSwgMS4wMDA4MiwgMC45OTk5MSwgMC45OTk5MSwgMC45OTk4NSwgMS4wMDAyMiwgMS4wMDAyMywgMS4wMDA2MSwgMS4wMDAwNiwgMC45OTk2NiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDAxOSwgMS4wMDA4LCAxLCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTgzLCAxLjAwMDQ0LCAwLjk5OTczLCAwLjk5OTY0LCAwLjk4MzMyLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTYyLCAwLjk5ODk1LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLCAxLCAwLjk5OTczLCAxLCAxLCAwLjk5OTU1LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTI0LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTcyLCAxLCAxLCAxLjAwMjY3LCAwLjk5OTk5LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAwLjk5OTk4LCAxLjY2NDc1LCAxLCAwLjk5OTczLCAwLjk5OTczLCAxLjAwMDIzLCAwLjk5OTczLCAxLjAwNDIzLCAwLjk5OTI1LCAwLjk5OTk5LCAxLCAwLjk5OTkxLCAwLjk5OTg0LCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDAyLCAxLjAwMDQ5LCAxLCAxLjAwMjQ1LCAxLCAxLCAxLCAxLCAwLjk2MzI5LCAxLCAxLjIwOTg1LCAxLjM5NzEzLCAxLjAwMDAzLCAwLjgyNTQsIDEuMDAwMTUsIDEsIDEuMDAwMzUsIDEuMDAwMjcsIDEuMDAwMzEsIDEuMDAwMzEsIDEuMDAwMDMsIDEuMDAwMzEsIDEuMDAwMzEsIDAuOTk5OTksIDEuMDAwMDMsIDAuOTk5OTksIDAuOTk5OTksIDEuNDExNDQsIDEuNiwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MTE0NCwgMS40MDU3OSwgMS40MDU3OSwgMS4zNjYyNSwgMC45OTk5OSwgMSwgMC45OTg2MSwgMC45OTg2MSwgMSwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMS4wMDAyNiwgMC45NTMxNywgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMC45OTk5OSwgMS40MDQ4MywgMSwgMC45OTk3NywgMS4wMDA1NCwgMSwgMSwgMC45OTk1MywgMC45OTk2MiwgMS4wMDA0MiwgMC45OTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAwLjk5OTk4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKZXhwb3J0cy5IZWx2ZXRpY2FJdGFsaWNGYWN0b3JzID0gSGVsdmV0aWNhSXRhbGljRmFjdG9yczsKY29uc3QgSGVsdmV0aWNhSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjM1LAogIGxpbmVHYXA6IDAuMgp9OwpleHBvcnRzLkhlbHZldGljYUl0YWxpY01ldHJpY3MgPSBIZWx2ZXRpY2FJdGFsaWNNZXRyaWNzOwpjb25zdCBIZWx2ZXRpY2FSZWd1bGFyRmFjdG9ycyA9IFswLjc2MTE2LCAxLCAxLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMS4wMDAwMSwgMS4wMDA0MywgMC45OTk5OCwgMC45OTk5OCwgMC45OTk1OSwgMS4wMDAwMywgMS4wMDA2LCAwLjk5OTk4LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLCAxLjAwMDAzLCAxLjAwMDAzLCAxLjAwMDAzLCAwLjk5OTczLCAwLjk5OTg3LCAxLjAwMDAxLCAxLjAwMDAxLCAwLjk5OTc3LCAwLjk5OTc3LCAxLjAwMDAxLCAxLjAwMDI2LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDYsIDEsIDEuMDAwMDEsIDAuOTk5NzMsIDAuOTk5OTksIDAuOTk5NzcsIDEuMDAwMjIsIDEuMDAwMDEsIDEuMDAwMjIsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMjYsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMTYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5NDksIDAuOTk5NzMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNiwgMC45OTk3MywgMC45OTk3MywgMC45OTkyNCwgMC45OTkyNCwgMSwgMC45OTkyNCwgMC45OTk5OSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk5OCwgMSwgMS4wMDA2LCAwLjk5OTczLCAxLCAwLjk5OTc3LCAxLCAxLCAxLCAxLjAwMDA1LCAxLjAwMDksIDEuMDAwMDUsIDEuMDAwMDMsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwOSwgMC45OTk3MywgMC45OTk5OCwgMS4wMDAyNSwgMC45OTk2OCwgMC45OTk3MywgMS4wMDAwMywgMS4wMDAyNSwgMC42MDI5OSwgMS4wMDAyNCwgMS4wNjQwOSwgMSwgMSwgMC45OTk5OCwgMSwgMC45OTk4LCAxLjAwMDYsIDAuOTk5OTgsIDEsIDAuOTk5MzYsIDAuOTk5NzMsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMjYsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEsIDAuOTk5NzcsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMC45OTk3NywgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAyMiwgMS4wMDAwMywgMS4wMDAyMiwgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMC45OTk3NywgMS4wMDAwMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk4MiwgMSwgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMC45OTk3MywgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLjA2NDA5LCAxLjAwMDI2LCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAwLjk5OTczLCAxLCAwLjk5OTczLCAxLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLCAwLjk5OTc3LCAxLjA0NTk2LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAxLjAwMDIyLCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDYsIDAuOTk5MjQsIDEuMDAwNiwgMS4wMDA2LCAxLjAwMDE5LCAxLjAwMDM0LCAxLCAwLjk5OTI0LCAxLjAwMDAxLCAxLCAxLCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAyNTcyLCAwLjk5OTczLCAxLjAwMDA1LCAwLjk5OTczLCAwLjk5OTI0LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTk5LCAwLjk5OTgsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEuMDAwMjIsIDAuOTk5NzMsIDEsIDEuMDAwMTYsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDAuOTk5NzcsIDAuOTk5OTgsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMDEsIDEsIDEuMDAwMjYsIDEuMDAwNiwgMS4wMDAyNiwgMC44NDUzMywgMS4wMDAyNiwgMS4wMDA2LCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDE2LCAwLjk5OTc3LCAxLjAwMDAxLCAxLCAxLjAwMDAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAxLjAwMDI2LCAxLCAwLjk5OTI0LCAwLjk5OTczLCAxLjAwMDAxLCAwLjk5OTczLCAxLCAwLjk5OTgyLCAxLjAwMDIyLCAxLjAwMDI2LCAxLjAwMDAxLCAxLCAxLjAwMDI2LCAxLjAwMDYsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5MjgsIDEsIDAuOTk5NzcsIDEuMDAwMTMsIDEuMDAwNTUsIDAuOTk5NDcsIDAuOTk5NDUsIDAuOTk5NDEsIDAuOTk5MjQsIDEuMDAwMDEsIDEuMDAwMDEsIDEuMDAwNCwgMC45MTYyMSwgMS4wMDAwMSwgMS4wMDAyNiwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDA2LCAxLjAwMDAxLCAxLjAwMDA1LCAwLjk5OTk5LCAwLjk5OTc3LCAxLjAwMDE1LCAxLjAwMDIyLCAwLjk5OTc3LCAxLjAwMDAxLCAwLjk5OTczLCAxLjAwMDI2LCAxLjAwMDAxLCAxLjAwMDE5LCAxLjAwMDAxLCAwLjk5OTQ2LCAxLCAxLjAwMDYsIDEuMDAwMDEsIDAuOTk5NzgsIDEuMDAwNDUsIDAuOTk5NzMsIDAuOTk5MjQsIDEuMDAwMjMsIDAuOTk5NzgsIDAuOTk5NjYsIDEsIDEuMDAwNjUsIDEuMDAwNDUsIDEuMDAwMTksIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5MjQsIDEsIDEsIDAuOTY0OTksIDEsIDEuMDAwNTUsIDAuOTk5NzMsIDEuMDAwMDgsIDEuMDAwMjcsIDEsIDAuOTk5NywgMC45OTk5NSwgMS4wMDAyMywgMC45OTkzMywgMS4wMDAxOSwgMS4wMDAxNSwgMS4wMDAzMSwgMC45OTkyNCwgMS4wMDAyMywgMC45OTk3MywgMS4wMDAyMywgMS4wMDAzMSwgMS4wMDAwMSwgMC45OTkyOCwgMS4wMDAyOSwgMS4wMDA5MiwgMS4wMDAzNSwgMS4wMDAwMSwgMS4wMDA2LCAxLjAwMDYsIDEsIDAuOTk5ODgsIDAuOTk5NzUsIDEsIDEuMDAwODIsIDAuOTk1NjEsIDAuOTk5NiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk2MiwgMS4wMDAwMSwgMS4wMDA5MiwgMC45OTk2NCwgMS4wMDAwMSwgMC45OTk2MywgMC45OTk5OSwgMS4wMDAzNSwgMS4wMDAzNSwgMS4wMDA4MiwgMC45OTk2MiwgMC45OTk5OSwgMC45OTk3NywgMS4wMDAyMiwgMS4wMDAzNSwgMS4wMDAwMSwgMC45OTk3NywgMS4wMDAyNiwgMC45OTk2LCAwLjk5OTY3LCAxLjAwMDAxLCAxLjAwMDM0LCAxLjAwMDc0LCAxLjAwMDU0LCAxLjAwMDUzLCAxLjAwMDYzLCAwLjk5OTcxLCAwLjk5OTYyLCAxLjAwMDM1LCAwLjk5OTc1LCAwLjk5OTc3LCAwLjk5OTczLCAxLjAwMDQzLCAwLjk5OTUzLCAxLjAwMDcsIDAuOTk5MTUsIDAuOTk5NzMsIDEuMDAwMDgsIDAuOTk4OTIsIDEuMDAwNzMsIDEuMDAwNzMsIDEuMDAxMTQsIDAuOTk5MTUsIDEuMDAwNzMsIDAuOTk5NTUsIDAuOTk5NzMsIDEuMDAwOTIsIDAuOTk5NzMsIDEsIDAuOTk5OTgsIDEsIDEuMDAwMywgMSwgMS4wMDA0MywgMS4wMDAwMSwgMC45OTk2OSwgMS4wMDAzLCAxLCAxLjAwMDM1LCAxLjAwMDAxLCAwLjk5OTUsIDEsIDEuMDAwOTIsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwNywgMC45OTk1LCAxLCAwLjk5OTI0LCAxLjAwMDYsIDAuOTk5MjQsIDAuOTk5NzIsIDEuMDAwNjIsIDAuOTk5NzMsIDEuMDAxMTQsIDEuMDAwNzMsIDEsIDAuOTk5NTUsIDEsIDEsIDEuMDAwNDcsIDAuOTk5NjgsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMTYsIDAuOTk5NzcsIDEuMDAwMDEsIDEsIDEsIDEsIDAuOTk5NzMsIDEsIDEsIDAuOTk5NTUsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5MjQsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5OTgsIDAuOTk5NzMsIDAuOTk5NzMsIDAuOTk5NzIsIDEsIDEsIDEuMDAyNjcsIDAuOTk5OTksIDAuOTk5OTgsIDAuOTk5OTgsIDEsIDAuOTk5OTgsIDEuNjY0NzUsIDEsIDAuOTk5NzMsIDAuOTk5NzMsIDEuMDAwMjMsIDAuOTk5NzMsIDAuOTk5NzEsIDAuOTk5MjUsIDEuMDAwMjMsIDEsIDAuOTk5OTEsIDAuOTk5ODQsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEuMDAwMDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTYzMjksIDEsIDEuMjA5ODUsIDEuMzk3MTMsIDEuMDAwMDMsIDAuODI1NCwgMS4wMDAxNSwgMSwgMS4wMDAzNSwgMS4wMDAyNywgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTkxNSwgMS4wMDAzMSwgMS4wMDAzMSwgMC45OTk5OSwgMS4wMDAwMywgMC45OTk5OSwgMC45OTk5OSwgMS40MTE0NCwgMS42LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQxMTQ0LCAxLjQwNTc5LCAxLjQwNTc5LCAxLjM2NjI1LCAwLjk5OTk5LCAxLCAwLjk5ODYxLCAwLjk5ODYxLCAxLCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAxLjAwMDI2LCAwLjk1MzE3LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAwLjk5OTk5LCAxLjQwNDgzLCAxLCAwLjk5OTc3LCAxLjAwMDU0LCAxLCAxLCAwLjk5OTUzLCAwLjk5OTYyLCAxLjAwMDQyLCAwLjk5OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpleHBvcnRzLkhlbHZldGljYVJlZ3VsYXJGYWN0b3JzID0gSGVsdmV0aWNhUmVndWxhckZhY3RvcnM7CmNvbnN0IEhlbHZldGljYVJlZ3VsYXJNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKZXhwb3J0cy5IZWx2ZXRpY2FSZWd1bGFyTWV0cmljcyA9IEhlbHZldGljYVJlZ3VsYXJNZXRyaWNzOwoKLyoqKi8gfSksCi8qIDU0ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuTGliZXJhdGlvblNhbnNSZWd1bGFyV2lkdGhzID0gZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nID0gZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyA9IGV4cG9ydHMuTGliZXJhdGlvblNhbnNJdGFsaWNNYXBwaW5nID0gZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMgPSBleHBvcnRzLkxpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcgPSBleHBvcnRzLkxpYmVyYXRpb25TYW5zQm9sZEl0YWxpY1dpZHRocyA9IGV4cG9ydHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyA9IHZvaWQgMDsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDMzMywgNDc0LCA1NTYsIDU1NiwgODg5LCA3MjIsIDIzOCwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCAzMzMsIDU4NCwgNTg0LCA1ODQsIDYxMSwgOTc1LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1NTYsIDcyMiwgNjExLCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMzMzLCAyNzgsIDMzMywgNTg0LCA1NTYsIDMzMywgNTU2LCA2MTEsIDU1NiwgNjExLCA1NTYsIDMzMywgNjExLCA2MTEsIDI3OCwgMjc4LCA1NTYsIDI3OCwgODg5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDM4OSwgNTU2LCAzMzMsIDYxMSwgNTU2LCA3NzgsIDU1NiwgNTU2LCA1MDAsIDM4OSwgMjgwLCAzODksIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI4MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDU1NiwgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTQ5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTU2LCA2MTEsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNzE5LCA3MjIsIDYxMSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDc4NSwgNTU2LCA1NTYsIDI3OCwgNzIyLCA1NTYsIDU1NiwgNjExLCAyNzgsIDYxMSwgMjc4LCA2MTEsIDM4NSwgNjExLCA0NzksIDYxMSwgMjc4LCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MDgsIDcyMywgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCAxMDAwLCA5NDQsIDcyMiwgMzg5LCA3MjIsIDM4OSwgNzIyLCAzODksIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2MTEsIDMzMywgNjExLCA0NzksIDYxMSwgMzMzLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA5NDQsIDc3OCwgNjY3LCA1NTYsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjc4LCA1NTYsIDcyMiwgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDU1NiwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgNDY1LCA3MjIsIDMzMywgODUzLCA5MDYsIDQ3NCwgODI1LCA5MjcsIDgzOCwgMjc4LCA3MjIsIDcyMiwgNjAxLCA3MTksIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA3MjIsIDY2NywgODMzLCA3MjIsIDY0NCwgNzc4LCA3MjIsIDY2NywgNjAwLCA2MTEsIDY2NywgODIxLCA2NjcsIDgwOSwgODAyLCAyNzgsIDY2NywgNjE1LCA0NTEsIDYxMSwgMjc4LCA1ODIsIDYxNSwgNjEwLCA1NTYsIDYwNiwgNDc1LCA0NjAsIDYxMSwgNTQxLCAyNzgsIDU1OCwgNTU2LCA2MTIsIDU1NiwgNDQ1LCA2MTEsIDc2NiwgNjE5LCA1MjAsIDY4NCwgNDQ2LCA1ODIsIDcxNSwgNTc2LCA3NTMsIDg0NSwgMjc4LCA1ODIsIDYxMSwgNTgyLCA4NDUsIDY2NywgNjY5LCA4ODUsIDU2NywgNzExLCA2NjcsIDI3OCwgMjc2LCA1NTYsIDEwOTQsIDEwNjIsIDg3NSwgNjEwLCA3MjIsIDYyMiwgNzE5LCA3MjIsIDcxOSwgNzIyLCA1NjcsIDcxMiwgNjY3LCA5MDQsIDYyNiwgNzE5LCA3MTksIDYxMCwgNzAyLCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDYyMiwgODU0LCA2NjcsIDczMCwgNzAzLCAxMDA1LCAxMDE5LCA4NzAsIDk3OSwgNzE5LCA3MTEsIDEwMzEsIDcxOSwgNTU2LCA2MTgsIDYxNSwgNDE3LCA2MzUsIDU1NiwgNzA5LCA0OTcsIDYxNSwgNjE1LCA1MDAsIDYzNSwgNzQwLCA2MDQsIDYxMSwgNjA0LCA2MTEsIDU1NiwgNDkwLCA1NTYsIDg3NSwgNTU2LCA2MTUsIDU4MSwgODMzLCA4NDQsIDcyOSwgODU0LCA2MTUsIDU1MiwgODU0LCA1ODMsIDU1NiwgNTU2LCA2MTEsIDQxNywgNTUyLCA1NTYsIDI3OCwgMjgxLCAyNzgsIDk2OSwgOTA2LCA2MTEsIDUwMCwgNjE1LCA1NTYsIDYwNCwgNzc4LCA2MTEsIDQ4NywgNDQ3LCA5NDQsIDc3OCwgOTQ0LCA3NzgsIDk0NCwgNzc4LCA2NjcsIDU1NiwgMzMzLCAzMzMsIDU1NiwgMTAwMCwgMTAwMCwgNTUyLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDUwMCwgNTAwLCA1MDAsIDU1NiwgNTU2LCAzNTAsIDEwMDAsIDEwMDAsIDI0MCwgNDc5LCAzMzMsIDMzMywgNjA0LCAzMzMsIDE2NywgMzk2LCA1NTYsIDU1NiwgMTA5NCwgNTU2LCA4ODUsIDQ4OSwgMTExNSwgMTAwMCwgNzY4LCA2MDAsIDgzNCwgODM0LCA4MzQsIDgzNCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzIyLCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDYxMSwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzXTsKZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHMgPSBMaWJlcmF0aW9uU2Fuc0JvbGRXaWR0aHM7CmNvbnN0IExpYmVyYXRpb25TYW5zQm9sZE1hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc0JvbGRNYXBwaW5nID0gTGliZXJhdGlvblNhbnNCb2xkTWFwcGluZzsKY29uc3QgTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDMzMywgNDc0LCA1NTYsIDU1NiwgODg5LCA3MjIsIDIzOCwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCAzMzMsIDU4NCwgNTg0LCA1ODQsIDYxMSwgOTc1LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjExLCA3NzgsIDcyMiwgMjc4LCA1NTYsIDcyMiwgNjExLCA4MzMsIDcyMiwgNzc4LCA2NjcsIDc3OCwgNzIyLCA2NjcsIDYxMSwgNzIyLCA2NjcsIDk0NCwgNjY3LCA2NjcsIDYxMSwgMzMzLCAyNzgsIDMzMywgNTg0LCA1NTYsIDMzMywgNTU2LCA2MTEsIDU1NiwgNjExLCA1NTYsIDMzMywgNjExLCA2MTEsIDI3OCwgMjc4LCA1NTYsIDI3OCwgODg5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDM4OSwgNTU2LCAzMzMsIDYxMSwgNTU2LCA3NzgsIDU1NiwgNTU2LCA1MDAsIDM4OSwgMjgwLCAzODksIDU4NCwgMzMzLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI4MCwgNTU2LCAzMzMsIDczNywgMzcwLCA1NTYsIDU4NCwgNzM3LCA1NTIsIDQwMCwgNTQ5LCAzMzMsIDMzMywgMzMzLCA1NzYsIDU1NiwgMjc4LCAzMzMsIDMzMywgMzY1LCA1NTYsIDgzNCwgODM0LCA4MzQsIDYxMSwgNzIyLCA3MjIsIDcyMiwgNzIyLCA3MjIsIDcyMiwgMTAwMCwgNzIyLCA2NjcsIDY2NywgNjY3LCA2NjcsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNzIyLCA3MjIsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNzc4LCA1ODQsIDc3OCwgNzIyLCA3MjIsIDcyMiwgNzIyLCA2NjcsIDY2NywgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA4ODksIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDYxMSwgNjExLCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTQ5LCA2MTEsIDYxMSwgNjExLCA2MTEsIDYxMSwgNTU2LCA2MTEsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNzQwLCA3MjIsIDYxMSwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCA3NzgsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDc4MiwgNTU2LCA1NTYsIDI3OCwgNzIyLCA1NTYsIDU1NiwgNjExLCAyNzgsIDYxMSwgMjc4LCA2MTEsIDM5NiwgNjExLCA0NzksIDYxMSwgMjc4LCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MDgsIDcyMywgNjExLCA3NzgsIDYxMSwgNzc4LCA2MTEsIDc3OCwgNjExLCAxMDAwLCA5NDQsIDcyMiwgMzg5LCA3MjIsIDM4OSwgNzIyLCAzODksIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2MTEsIDMzMywgNjExLCA0NzksIDYxMSwgMzMzLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA3MjIsIDYxMSwgNzIyLCA2MTEsIDcyMiwgNjExLCA5NDQsIDc3OCwgNjY3LCA1NTYsIDY2NywgNjExLCA1MDAsIDYxMSwgNTAwLCA2MTEsIDUwMCwgMjc4LCA1NTYsIDcyMiwgNTU2LCAxMDAwLCA4ODksIDc3OCwgNjExLCA2NjcsIDU1NiwgNjExLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCA3MjIsIDMzMywgODU0LCA5MDYsIDQ3MywgODQ0LCA5MzAsIDg0NywgMjc4LCA3MjIsIDcyMiwgNjEwLCA2NzEsIDY2NywgNjExLCA3MjIsIDc3OCwgMjc4LCA3MjIsIDY2NywgODMzLCA3MjIsIDY1NywgNzc4LCA3MTgsIDY2NywgNTkwLCA2MTEsIDY2NywgODIyLCA2NjcsIDgyOSwgNzgxLCAyNzgsIDY2NywgNjIwLCA0NzksIDYxMSwgMjc4LCA1OTEsIDYyMCwgNjIxLCA1NTYsIDYxMCwgNDc5LCA0OTIsIDYxMSwgNTU4LCAyNzgsIDU2NiwgNTU2LCA2MDMsIDU1NiwgNDUwLCA2MTEsIDcxMiwgNjA1LCA1MzIsIDY2NCwgNDA5LCA1OTEsIDcwNCwgNTc4LCA3NzMsIDgzNCwgMjc4LCA1OTEsIDYxMSwgNTkxLCA4MzQsIDY2NywgNjY3LCA4ODYsIDYxNCwgNzE5LCA2NjcsIDI3OCwgMjc4LCA1NTYsIDEwOTQsIDEwNDIsIDg1NCwgNjIyLCA3MTksIDY3NywgNzE5LCA3MjIsIDcwOCwgNzIyLCA2MTQsIDcyMiwgNjY3LCA5MjcsIDY0MywgNzE5LCA3MTksIDYxNSwgNjg3LCA4MzMsIDcyMiwgNzc4LCA3MTksIDY2NywgNzIyLCA2MTEsIDY3NywgNzgxLCA2NjcsIDcyOSwgNzA4LCA5NzksIDk4OSwgODU0LCAxMDAwLCA3MDgsIDcxOSwgMTA0MiwgNzI5LCA1NTYsIDYxOSwgNjA0LCA1MzQsIDYxOCwgNTU2LCA3MzYsIDUxMCwgNjExLCA2MTEsIDUwNywgNjIyLCA3NDAsIDYwNCwgNjExLCA2MTEsIDYxMSwgNTU2LCA4ODksIDU1NiwgODg1LCA1NTYsIDY0NiwgNTgzLCA4ODksIDkzNSwgNzA3LCA4NTQsIDU5NCwgNTUyLCA4NjUsIDU4OSwgNTU2LCA1NTYsIDYxMSwgNDY5LCA1NjMsIDU1NiwgMjc4LCAyNzgsIDI3OCwgOTY5LCA5MDYsIDYxMSwgNTA3LCA2MTksIDU1NiwgNjExLCA3NzgsIDYxMSwgNTc1LCA0NjcsIDk0NCwgNzc4LCA5NDQsIDc3OCwgOTQ0LCA3NzgsIDY2NywgNTU2LCAzMzMsIDMzMywgNTU2LCAxMDAwLCAxMDAwLCA1NTIsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNTAwLCA1MDAsIDUwMCwgNTU2LCA1NTYsIDM1MCwgMTAwMCwgMTAwMCwgMjQwLCA0NzksIDMzMywgMzMzLCA2MDQsIDMzMywgMTY3LCAzOTYsIDU1NiwgNTU2LCAxMTA0LCA1NTYsIDg4NSwgNTE2LCAxMTQ2LCAxMDAwLCA3NjgsIDYwMCwgODM0LCA4MzQsIDgzNCwgODM0LCA5OTksIDUwMCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDUwMCwgNDk0LCA2MTIsIDgyMywgNzEzLCA1ODQsIDU0OSwgNzEzLCA5NzksIDcyMiwgMjc0LCA1NDksIDU0OSwgNTgzLCA1NDksIDU0OSwgNjA0LCA1ODQsIDYwNCwgNjA0LCA3MDgsIDYyNSwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzI5LCA2MDQsIDYwNCwgMzU0LCAzNTQsIDEwMDAsIDk5MCwgOTkwLCA5OTAsIDk5MCwgNDk0LCA2MDQsIDYwNCwgNjA0LCA2MDQsIDM1NCwgMTAyMSwgMTA1MiwgOTE3LCA3NTAsIDc1MCwgNTMxLCA2NTYsIDU5NCwgNTEwLCA1MDAsIDc1MCwgNzUwLCA2MTEsIDYxMSwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzM107CmV4cG9ydHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzID0gTGliZXJhdGlvblNhbnNCb2xkSXRhbGljV2lkdGhzOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0JvbGRJdGFsaWNNYXBwaW5nID0gWy0xLCAtMSwgLTEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywgMjU4LCAyNTksIDI2MCwgMjYxLCAyNjIsIDI2MywgMjY0LCAyNjUsIDI2NiwgMjY3LCAyNjgsIDI2OSwgMjcwLCAyNzEsIDI3MiwgMjczLCAyNzQsIDI3NSwgMjc2LCAyNzcsIDI3OCwgMjc5LCAyODAsIDI4MSwgMjgyLCAyODMsIDI4NCwgMjg1LCAyODYsIDI4NywgMjg4LCAyODksIDI5MCwgMjkxLCAyOTIsIDI5MywgMjk0LCAyOTUsIDI5NiwgMjk3LCAyOTgsIDI5OSwgMzAwLCAzMDEsIDMwMiwgMzAzLCAzMDQsIDMwNSwgMzA2LCAzMDcsIDMwOCwgMzA5LCAzMTAsIDMxMSwgMzEyLCAzMTMsIDMxNCwgMzE1LCAzMTYsIDMxNywgMzE4LCAzMTksIDMyMCwgMzIxLCAzMjIsIDMyMywgMzI0LCAzMjUsIDMyNiwgMzI3LCAzMjgsIDMyOSwgMzMwLCAzMzEsIDMzMiwgMzMzLCAzMzQsIDMzNSwgMzM2LCAzMzcsIDMzOCwgMzM5LCAzNDAsIDM0MSwgMzQyLCAzNDMsIDM0NCwgMzQ1LCAzNDYsIDM0NywgMzQ4LCAzNDksIDM1MCwgMzUxLCAzNTIsIDM1MywgMzU0LCAzNTUsIDM1NiwgMzU3LCAzNTgsIDM1OSwgMzYwLCAzNjEsIDM2MiwgMzYzLCAzNjQsIDM2NSwgMzY2LCAzNjcsIDM2OCwgMzY5LCAzNzAsIDM3MSwgMzcyLCAzNzMsIDM3NCwgMzc1LCAzNzYsIDM3NywgMzc4LCAzNzksIDM4MCwgMzgxLCAzODIsIDM4MywgNDAyLCA1MDYsIDUwNywgNTA4LCA1MDksIDUxMCwgNTExLCA1MzYsIDUzNywgNTM4LCA1MzksIDcxMCwgNzExLCA3MTMsIDcyOCwgNzI5LCA3MzAsIDczMSwgNzMyLCA3MzMsIDkwMCwgOTAxLCA5MDIsIDkwMywgOTA0LCA5MDUsIDkwNiwgOTA4LCA5MTAsIDkxMSwgOTEyLCA5MTMsIDkxNCwgOTE1LCA5MTYsIDkxNywgOTE4LCA5MTksIDkyMCwgOTIxLCA5MjIsIDkyMywgOTI0LCA5MjUsIDkyNiwgOTI3LCA5MjgsIDkyOSwgOTMxLCA5MzIsIDkzMywgOTM0LCA5MzUsIDkzNiwgOTM3LCA5MzgsIDkzOSwgOTQwLCA5NDEsIDk0MiwgOTQzLCA5NDQsIDk0NSwgOTQ2LCA5NDcsIDk0OCwgOTQ5LCA5NTAsIDk1MSwgOTUyLCA5NTMsIDk1NCwgOTU1LCA5NTYsIDk1NywgOTU4LCA5NTksIDk2MCwgOTYxLCA5NjIsIDk2MywgOTY0LCA5NjUsIDk2NiwgOTY3LCA5NjgsIDk2OSwgOTcwLCA5NzEsIDk3MiwgOTczLCA5NzQsIDEwMjQsIDEwMjUsIDEwMjYsIDEwMjcsIDEwMjgsIDEwMjksIDEwMzAsIDEwMzEsIDEwMzIsIDEwMzMsIDEwMzQsIDEwMzUsIDEwMzYsIDEwMzcsIDEwMzgsIDEwMzksIDEwNDAsIDEwNDEsIDEwNDIsIDEwNDMsIDEwNDQsIDEwNDUsIDEwNDYsIDEwNDcsIDEwNDgsIDEwNDksIDEwNTAsIDEwNTEsIDEwNTIsIDEwNTMsIDEwNTQsIDEwNTUsIDEwNTYsIDEwNTcsIDEwNTgsIDEwNTksIDEwNjAsIDEwNjEsIDEwNjIsIDEwNjMsIDEwNjQsIDEwNjUsIDEwNjYsIDEwNjcsIDEwNjgsIDEwNjksIDEwNzAsIDEwNzEsIDEwNzIsIDEwNzMsIDEwNzQsIDEwNzUsIDEwNzYsIDEwNzcsIDEwNzgsIDEwNzksIDEwODAsIDEwODEsIDEwODIsIDEwODMsIDEwODQsIDEwODUsIDEwODYsIDEwODcsIDEwODgsIDEwODksIDEwOTAsIDEwOTEsIDEwOTIsIDEwOTMsIDEwOTQsIDEwOTUsIDEwOTYsIDEwOTcsIDEwOTgsIDEwOTksIDExMDAsIDExMDEsIDExMDIsIDExMDMsIDExMDQsIDExMDUsIDExMDYsIDExMDcsIDExMDgsIDExMDksIDExMTAsIDExMTEsIDExMTIsIDExMTMsIDExMTQsIDExMTUsIDExMTYsIDExMTcsIDExMTgsIDExMTksIDExMzgsIDExMzksIDExNjgsIDExNjksIDc4MDgsIDc4MDksIDc4MTAsIDc4MTEsIDc4MTIsIDc4MTMsIDc5MjIsIDc5MjMsIDgyMDgsIDgyMDksIDgyMTEsIDgyMTIsIDgyMTMsIDgyMTUsIDgyMTYsIDgyMTcsIDgyMTgsIDgyMTksIDgyMjAsIDgyMjEsIDgyMjIsIDgyMjQsIDgyMjUsIDgyMjYsIDgyMzAsIDgyNDAsIDgyNDIsIDgyNDMsIDgyNDksIDgyNTAsIDgyNTIsIDgyNTQsIDgyNjAsIDgzMTksIDgzNTUsIDgzNTYsIDgzNTksIDgzNjQsIDg0NTMsIDg0NjcsIDg0NzAsIDg0ODIsIDg0ODYsIDg0OTQsIDg1MzksIDg1NDAsIDg1NDEsIDg1NDIsIDg1OTIsIDg1OTMsIDg1OTQsIDg1OTUsIDg1OTYsIDg1OTcsIDg2MTYsIDg3MDYsIDg3MTAsIDg3MTksIDg3MjEsIDg3MjIsIDg3MzAsIDg3MzQsIDg3MzUsIDg3NDUsIDg3NDcsIDg3NzYsIDg4MDAsIDg4MDEsIDg4MDQsIDg4MDUsIDg5NjIsIDg5NzYsIDg5OTIsIDg5OTMsIDk0NzIsIDk0NzQsIDk0ODQsIDk0ODgsIDk0OTIsIDk0OTYsIDk1MDAsIDk1MDgsIDk1MTYsIDk1MjQsIDk1MzIsIDk1NTIsIDk1NTMsIDk1NTQsIDk1NTUsIDk1NTYsIDk1NTcsIDk1NTgsIDk1NTksIDk1NjAsIDk1NjEsIDk1NjIsIDk1NjMsIDk1NjQsIDk1NjUsIDk1NjYsIDk1NjcsIDk1NjgsIDk1NjksIDk1NzAsIDk1NzEsIDk1NzIsIDk1NzMsIDk1NzQsIDk1NzUsIDk1NzYsIDk1NzcsIDk1NzgsIDk1NzksIDk1ODAsIDk2MDAsIDk2MDQsIDk2MDgsIDk2MTIsIDk2MTYsIDk2MTcsIDk2MTgsIDk2MTksIDk2MzIsIDk2MzMsIDk2NDIsIDk2NDMsIDk2NDQsIDk2NTAsIDk2NTgsIDk2NjAsIDk2NjgsIDk2NzQsIDk2NzUsIDk2NzksIDk2ODgsIDk2ODksIDk3MDIsIDk3ODYsIDk3ODcsIDk3ODgsIDk3OTIsIDk3OTQsIDk4MjQsIDk4MjcsIDk4MjksIDk4MzAsIDk4MzQsIDk4MzUsIDk4MzYsIDYxNDQxLCA2MTQ0MiwgNjE0NDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMV07CmV4cG9ydHMuTGliZXJhdGlvblNhbnNCb2xkSXRhbGljTWFwcGluZyA9IExpYmVyYXRpb25TYW5zQm9sZEl0YWxpY01hcHBpbmc7CmNvbnN0IExpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzID0gWzM2NSwgMCwgMzMzLCAyNzgsIDI3OCwgMzU1LCA1NTYsIDU1NiwgODg5LCA2NjcsIDE5MSwgMzMzLCAzMzMsIDM4OSwgNTg0LCAyNzgsIDMzMywgMjc4LCAyNzgsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjc4LCAyNzgsIDU4NCwgNTg0LCA1ODQsIDU1NiwgMTAxNSwgNjY3LCA2NjcsIDcyMiwgNzIyLCA2NjcsIDYxMSwgNzc4LCA3MjIsIDI3OCwgNTAwLCA2NjcsIDU1NiwgODMzLCA3MjIsIDc3OCwgNjY3LCA3NzgsIDcyMiwgNjY3LCA2MTEsIDcyMiwgNjY3LCA5NDQsIDY2NywgNjY3LCA2MTEsIDI3OCwgMjc4LCAyNzgsIDQ2OSwgNTU2LCAzMzMsIDU1NiwgNTU2LCA1MDAsIDU1NiwgNTU2LCAyNzgsIDU1NiwgNTU2LCAyMjIsIDIyMiwgNTAwLCAyMjIsIDgzMywgNTU2LCA1NTYsIDU1NiwgNTU2LCAzMzMsIDUwMCwgMjc4LCA1NTYsIDUwMCwgNzIyLCA1MDAsIDUwMCwgNTAwLCAzMzQsIDI2MCwgMzM0LCA1ODQsIDMzMywgNTU2LCA1NTYsIDU1NiwgNTU2LCAyNjAsIDU1NiwgMzMzLCA3MzcsIDM3MCwgNTU2LCA1ODQsIDczNywgNTUyLCA0MDAsIDU0OSwgMzMzLCAzMzMsIDMzMywgNTc2LCA1MzcsIDI3OCwgMzMzLCAzMzMsIDM2NSwgNTU2LCA4MzQsIDgzNCwgODM0LCA2MTEsIDY2NywgNjY3LCA2NjcsIDY2NywgNjY3LCA2NjcsIDEwMDAsIDcyMiwgNjY3LCA2NjcsIDY2NywgNjY3LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDcyMiwgNzIyLCA3NzgsIDc3OCwgNzc4LCA3NzgsIDc3OCwgNTg0LCA3NzgsIDcyMiwgNzIyLCA3MjIsIDcyMiwgNjY3LCA2NjcsIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgODg5LCA1MDAsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjc4LCAyNzgsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU0OSwgNjExLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDUwMCwgNTU2LCA1MDAsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDYyNSwgNzIyLCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyMjIsIDI3OCwgMjc4LCA3MzMsIDQ0NCwgNTAwLCAyMjIsIDY2NywgNTAwLCA1MDAsIDU1NiwgMjIyLCA1NTYsIDIyMiwgNTU2LCAyODEsIDU1NiwgNDAwLCA1NTYsIDIyMiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNjE1LCA3MjMsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgMTAwMCwgOTQ0LCA3MjIsIDMzMywgNzIyLCAzMzMsIDcyMiwgMzMzLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjExLCAyNzgsIDYxMSwgMzU0LCA2MTEsIDI3OCwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgOTQ0LCA3MjIsIDY2NywgNTAwLCA2NjcsIDYxMSwgNTAwLCA2MTEsIDUwMCwgNjExLCA1MDAsIDIyMiwgNTU2LCA2NjcsIDU1NiwgMTAwMCwgODg5LCA3NzgsIDYxMSwgNjY3LCA1MDAsIDYxMSwgMjc4LCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgNjY3LCAyNzgsIDc4OSwgODQ2LCAzODksIDc5NCwgODY1LCA3NzUsIDIyMiwgNjY3LCA2NjcsIDU3MCwgNjcxLCA2NjcsIDYxMSwgNzIyLCA3NzgsIDI3OCwgNjY3LCA2NjcsIDgzMywgNzIyLCA2NDgsIDc3OCwgNzI1LCA2NjcsIDYwMCwgNjExLCA2NjcsIDgzNywgNjY3LCA4MzEsIDc2MSwgMjc4LCA2NjcsIDU3MCwgNDM5LCA1NTUsIDIyMiwgNTUwLCA1NzAsIDU3MSwgNTAwLCA1NTYsIDQzOSwgNDYzLCA1NTUsIDU0MiwgMjIyLCA1MDAsIDQ5MiwgNTQ4LCA1MDAsIDQ0NywgNTU2LCA2NzAsIDU3MywgNDg2LCA2MDMsIDM3NCwgNTUwLCA2NTIsIDU0NiwgNzI4LCA3NzksIDIyMiwgNTUwLCA1NTYsIDU1MCwgNzc5LCA2NjcsIDY2NywgODQzLCA1NDQsIDcwOCwgNjY3LCAyNzgsIDI3OCwgNTAwLCAxMDY2LCA5ODIsIDg0NCwgNTg5LCA3MTUsIDYzOSwgNzI0LCA2NjcsIDY1MSwgNjY3LCA1NDQsIDcwNCwgNjY3LCA5MTcsIDYxNCwgNzE1LCA3MTUsIDU4OSwgNjg2LCA4MzMsIDcyMiwgNzc4LCA3MjUsIDY2NywgNzIyLCA2MTEsIDYzOSwgNzk1LCA2NjcsIDcyNywgNjczLCA5MjAsIDkyMywgODA1LCA4ODYsIDY1MSwgNjk0LCAxMDIyLCA2ODIsIDU1NiwgNTYyLCA1MjIsIDQ5MywgNTUzLCA1NTYsIDY4OCwgNDY1LCA1NTYsIDU1NiwgNDcyLCA1NjQsIDY4NiwgNTUwLCA1NTYsIDU1NiwgNTU2LCA1MDAsIDgzMywgNTAwLCA4MzUsIDUwMCwgNTcyLCA1MTgsIDgzMCwgODUxLCA2MjEsIDczNiwgNTI2LCA0OTIsIDc1MiwgNTM0LCA1NTYsIDU1NiwgNTU2LCAzNzgsIDQ5NiwgNTAwLCAyMjIsIDIyMiwgMjIyLCA5MTAsIDgyOCwgNTU2LCA0NzIsIDU2NSwgNTAwLCA1NTYsIDc3OCwgNTU2LCA0OTIsIDMzOSwgOTQ0LCA3MjIsIDk0NCwgNzIyLCA5NDQsIDcyMiwgNjY3LCA1MDAsIDMzMywgMzMzLCA1NTYsIDEwMDAsIDEwMDAsIDU1MiwgMjIyLCAyMjIsIDIyMiwgMjIyLCAzMzMsIDMzMywgMzMzLCA1NTYsIDU1NiwgMzUwLCAxMDAwLCAxMDAwLCAxODgsIDM1NCwgMzMzLCAzMzMsIDUwMCwgMzMzLCAxNjcsIDM2NSwgNTU2LCA1NTYsIDEwOTQsIDU1NiwgODg1LCAzMjMsIDEwODMsIDEwMDAsIDc2OCwgNjAwLCA4MzQsIDgzNCwgODM0LCA4MzQsIDEwMDAsIDUwMCwgOTk4LCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzE5LCAyNzQsIDU0OSwgNTQ5LCA1ODQsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDUwMCwgNTAwLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDI5NCwgMjk0LCAzMjQsIDMyNCwgMzE2LCAzMjgsIDM5OCwgMjg1XTsKZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY1dpZHRocyA9IExpYmVyYXRpb25TYW5zSXRhbGljV2lkdGhzOwpjb25zdCBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmcgPSBMaWJlcmF0aW9uU2Fuc0l0YWxpY01hcHBpbmc7CmNvbnN0IExpYmVyYXRpb25TYW5zUmVndWxhcldpZHRocyA9IFszNjUsIDAsIDMzMywgMjc4LCAyNzgsIDM1NSwgNTU2LCA1NTYsIDg4OSwgNjY3LCAxOTEsIDMzMywgMzMzLCAzODksIDU4NCwgMjc4LCAzMzMsIDI3OCwgMjc4LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCA1ODQsIDU4NCwgNTg0LCA1NTYsIDEwMTUsIDY2NywgNjY3LCA3MjIsIDcyMiwgNjY3LCA2MTEsIDc3OCwgNzIyLCAyNzgsIDUwMCwgNjY3LCA1NTYsIDgzMywgNzIyLCA3NzgsIDY2NywgNzc4LCA3MjIsIDY2NywgNjExLCA3MjIsIDY2NywgOTQ0LCA2NjcsIDY2NywgNjExLCAyNzgsIDI3OCwgMjc4LCA0NjksIDU1NiwgMzMzLCA1NTYsIDU1NiwgNTAwLCA1NTYsIDU1NiwgMjc4LCA1NTYsIDU1NiwgMjIyLCAyMjIsIDUwMCwgMjIyLCA4MzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMzMzLCA1MDAsIDI3OCwgNTU2LCA1MDAsIDcyMiwgNTAwLCA1MDAsIDUwMCwgMzM0LCAyNjAsIDMzNCwgNTg0LCAzMzMsIDU1NiwgNTU2LCA1NTYsIDU1NiwgMjYwLCA1NTYsIDMzMywgNzM3LCAzNzAsIDU1NiwgNTg0LCA3MzcsIDU1MiwgNDAwLCA1NDksIDMzMywgMzMzLCAzMzMsIDU3NiwgNTM3LCAyNzgsIDMzMywgMzMzLCAzNjUsIDU1NiwgODM0LCA4MzQsIDgzNCwgNjExLCA2NjcsIDY2NywgNjY3LCA2NjcsIDY2NywgNjY3LCAxMDAwLCA3MjIsIDY2NywgNjY3LCA2NjcsIDY2NywgMjc4LCAyNzgsIDI3OCwgMjc4LCA3MjIsIDcyMiwgNzc4LCA3NzgsIDc3OCwgNzc4LCA3NzgsIDU4NCwgNzc4LCA3MjIsIDcyMiwgNzIyLCA3MjIsIDY2NywgNjY3LCA2MTEsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDg4OSwgNTAwLCA1NTYsIDU1NiwgNTU2LCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1NDksIDYxMSwgNTU2LCA1NTYsIDU1NiwgNTU2LCA1MDAsIDU1NiwgNTAwLCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA3MjIsIDUwMCwgNzIyLCA1MDAsIDcyMiwgNTAwLCA3MjIsIDUwMCwgNzIyLCA2MTUsIDcyMiwgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDY2NywgNTU2LCA2NjcsIDU1NiwgNjY3LCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDc3OCwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjc4LCAyNzgsIDI3OCwgMjIyLCAyNzgsIDI3OCwgNzM1LCA0NDQsIDUwMCwgMjIyLCA2NjcsIDUwMCwgNTAwLCA1NTYsIDIyMiwgNTU2LCAyMjIsIDU1NiwgMjkyLCA1NTYsIDMzNCwgNTU2LCAyMjIsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDYwNCwgNzIzLCA1NTYsIDc3OCwgNTU2LCA3NzgsIDU1NiwgNzc4LCA1NTYsIDEwMDAsIDk0NCwgNzIyLCAzMzMsIDcyMiwgMzMzLCA3MjIsIDMzMywgNjY3LCA1MDAsIDY2NywgNTAwLCA2NjcsIDUwMCwgNjY3LCA1MDAsIDYxMSwgMjc4LCA2MTEsIDM3NSwgNjExLCAyNzgsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDcyMiwgNTU2LCA3MjIsIDU1NiwgNzIyLCA1NTYsIDk0NCwgNzIyLCA2NjcsIDUwMCwgNjY3LCA2MTEsIDUwMCwgNjExLCA1MDAsIDYxMSwgNTAwLCAyMjIsIDU1NiwgNjY3LCA1NTYsIDEwMDAsIDg4OSwgNzc4LCA2MTEsIDY2NywgNTAwLCA2MTEsIDI3OCwgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDY2NywgMjc4LCA3ODQsIDgzOCwgMzg0LCA3NzQsIDg1NSwgNzUyLCAyMjIsIDY2NywgNjY3LCA1NTEsIDY2OCwgNjY3LCA2MTEsIDcyMiwgNzc4LCAyNzgsIDY2NywgNjY4LCA4MzMsIDcyMiwgNjUwLCA3NzgsIDcyMiwgNjY3LCA2MTgsIDYxMSwgNjY3LCA3OTgsIDY2NywgODM1LCA3NDgsIDI3OCwgNjY3LCA1NzgsIDQ0NiwgNTU2LCAyMjIsIDU0NywgNTc4LCA1NzUsIDUwMCwgNTU3LCA0NDYsIDQ0MSwgNTU2LCA1NTYsIDIyMiwgNTAwLCA1MDAsIDU3NiwgNTAwLCA0NDgsIDU1NiwgNjkwLCA1NjksIDQ4MiwgNjE3LCAzOTUsIDU0NywgNjQ4LCA1MjUsIDcxMywgNzgxLCAyMjIsIDU0NywgNTU2LCA1NDcsIDc4MSwgNjY3LCA2NjcsIDg2NSwgNTQyLCA3MTksIDY2NywgMjc4LCAyNzgsIDUwMCwgMTA1NywgMTAxMCwgODU0LCA1ODMsIDcyMiwgNjM1LCA3MTksIDY2NywgNjU2LCA2NjcsIDU0MiwgNjc3LCA2NjcsIDkyMywgNjA0LCA3MTksIDcxOSwgNTgzLCA2NTYsIDgzMywgNzIyLCA3NzgsIDcxOSwgNjY3LCA3MjIsIDYxMSwgNjM1LCA3NjAsIDY2NywgNzQwLCA2NjcsIDkxNywgOTM4LCA3OTIsIDg4NSwgNjU2LCA3MTksIDEwMTAsIDcyMiwgNTU2LCA1NzMsIDUzMSwgMzY1LCA1ODMsIDU1NiwgNjY5LCA0NTgsIDU1OSwgNTU5LCA0MzgsIDU4MywgNjg4LCA1NTIsIDU1NiwgNTQyLCA1NTYsIDUwMCwgNDU4LCA1MDAsIDgyMywgNTAwLCA1NzMsIDUyMSwgODAyLCA4MjMsIDYyNSwgNzE5LCA1MjEsIDUxMCwgNzUwLCA1NDIsIDU1NiwgNTU2LCA1NTYsIDM2NSwgNTEwLCA1MDAsIDIyMiwgMjc4LCAyMjIsIDkwNiwgODEyLCA1NTYsIDQzOCwgNTU5LCA1MDAsIDU1MiwgNzc4LCA1NTYsIDQ4OSwgNDExLCA5NDQsIDcyMiwgOTQ0LCA3MjIsIDk0NCwgNzIyLCA2NjcsIDUwMCwgMzMzLCAzMzMsIDU1NiwgMTAwMCwgMTAwMCwgNTUyLCAyMjIsIDIyMiwgMjIyLCAyMjIsIDMzMywgMzMzLCAzMzMsIDU1NiwgNTU2LCAzNTAsIDEwMDAsIDEwMDAsIDE4OCwgMzU0LCAzMzMsIDMzMywgNTAwLCAzMzMsIDE2NywgMzY1LCA1NTYsIDU1NiwgMTA5NCwgNTU2LCA4ODUsIDMyMywgMTA3MywgMTAwMCwgNzY4LCA2MDAsIDgzNCwgODM0LCA4MzQsIDgzNCwgMTAwMCwgNTAwLCAxMDAwLCA1MDAsIDEwMDAsIDUwMCwgNTAwLCA0OTQsIDYxMiwgODIzLCA3MTMsIDU4NCwgNTQ5LCA3MTMsIDk3OSwgNzE5LCAyNzQsIDU0OSwgNTQ5LCA1ODMsIDU0OSwgNTQ5LCA2MDQsIDU4NCwgNjA0LCA2MDQsIDcwOCwgNjI1LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MDgsIDcwOCwgNzA4LCA3MjksIDYwNCwgNjA0LCAzNTQsIDM1NCwgMTAwMCwgOTkwLCA5OTAsIDk5MCwgOTkwLCA0OTQsIDYwNCwgNjA0LCA2MDQsIDYwNCwgMzU0LCAxMDIxLCAxMDUyLCA5MTcsIDc1MCwgNzUwLCA1MzEsIDY1NiwgNTk0LCA1MTAsIDUwMCwgNzUwLCA3NTAsIDUwMCwgNTAwLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMzMzLCAzMzMsIDMzMywgMjIyLCAyMjIsIDI5NCwgMjk0LCAzMjQsIDMyNCwgMzE2LCAzMjgsIDM5OCwgMjg1XTsKZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHMgPSBMaWJlcmF0aW9uU2Fuc1JlZ3VsYXJXaWR0aHM7CmNvbnN0IExpYmVyYXRpb25TYW5zUmVndWxhck1hcHBpbmcgPSBbLTEsIC0xLCAtMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgsIDIyOSwgMjMwLCAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwgMjgxLCAyODIsIDI4MywgMjg0LCAyODUsIDI4NiwgMjg3LCAyODgsIDI4OSwgMjkwLCAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsIDMwNCwgMzA1LCAzMDYsIDMwNywgMzA4LCAzMDksIDMxMCwgMzExLCAzMTIsIDMxMywgMzE0LCAzMTUsIDMxNiwgMzE3LCAzMTgsIDMxOSwgMzIwLCAzMjEsIDMyMiwgMzIzLCAzMjQsIDMyNSwgMzI2LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwgMzMyLCAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwgMzQ3LCAzNDgsIDM0OSwgMzUwLCAzNTEsIDM1MiwgMzUzLCAzNTQsIDM1NSwgMzU2LCAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwgMzcxLCAzNzIsIDM3MywgMzc0LCAzNzUsIDM3NiwgMzc3LCAzNzgsIDM3OSwgMzgwLCAzODEsIDM4MiwgMzgzLCA0MDIsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUzNiwgNTM3LCA1MzgsIDUzOSwgNzEwLCA3MTEsIDcxMywgNzI4LCA3MjksIDczMCwgNzMxLCA3MzIsIDczMywgOTAwLCA5MDEsIDkwMiwgOTAzLCA5MDQsIDkwNSwgOTA2LCA5MDgsIDkxMCwgOTExLCA5MTIsIDkxMywgOTE0LCA5MTUsIDkxNiwgOTE3LCA5MTgsIDkxOSwgOTIwLCA5MjEsIDkyMiwgOTIzLCA5MjQsIDkyNSwgOTI2LCA5MjcsIDkyOCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5MzQsIDkzNSwgOTM2LCA5MzcsIDkzOCwgOTM5LCA5NDAsIDk0MSwgOTQyLCA5NDMsIDk0NCwgOTQ1LCA5NDYsIDk0NywgOTQ4LCA5NDksIDk1MCwgOTUxLCA5NTIsIDk1MywgOTU0LCA5NTUsIDk1NiwgOTU3LCA5NTgsIDk1OSwgOTYwLCA5NjEsIDk2MiwgOTYzLCA5NjQsIDk2NSwgOTY2LCA5NjcsIDk2OCwgOTY5LCA5NzAsIDk3MSwgOTcyLCA5NzMsIDk3NCwgMTAyNCwgMTAyNSwgMTAyNiwgMTAyNywgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMiwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNiwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MCwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwgMTA0NSwgMTA0NiwgMTA0NywgMTA0OCwgMTA0OSwgMTA1MCwgMTA1MSwgMTA1MiwgMTA1MywgMTA1NCwgMTA1NSwgMTA1NiwgMTA1NywgMTA1OCwgMTA1OSwgMTA2MCwgMTA2MSwgMTA2MiwgMTA2MywgMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTA3NywgMTA3OCwgMTA3OSwgMTA4MCwgMTA4MSwgMTA4MiwgMTA4MywgMTA4NCwgMTA4NSwgMTA4NiwgMTA4NywgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5MywgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMCwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwgMTExMiwgMTExMywgMTExNCwgMTExNSwgMTExNiwgMTExNywgMTExOCwgMTExOSwgMTEzOCwgMTEzOSwgMTE2OCwgMTE2OSwgNzgwOCwgNzgwOSwgNzgxMCwgNzgxMSwgNzgxMiwgNzgxMywgNzkyMiwgNzkyMywgODIwOCwgODIwOSwgODIxMSwgODIxMiwgODIxMywgODIxNSwgODIxNiwgODIxNywgODIxOCwgODIxOSwgODIyMCwgODIyMSwgODIyMiwgODIyNCwgODIyNSwgODIyNiwgODIzMCwgODI0MCwgODI0MiwgODI0MywgODI0OSwgODI1MCwgODI1MiwgODI1NCwgODI2MCwgODMxOSwgODM1NSwgODM1NiwgODM1OSwgODM2NCwgODQ1MywgODQ2NywgODQ3MCwgODQ4MiwgODQ4NiwgODQ5NCwgODUzOSwgODU0MCwgODU0MSwgODU0MiwgODU5MiwgODU5MywgODU5NCwgODU5NSwgODU5NiwgODU5NywgODYxNiwgODcwNiwgODcxMCwgODcxOSwgODcyMSwgODcyMiwgODczMCwgODczNCwgODczNSwgODc0NSwgODc0NywgODc3NiwgODgwMCwgODgwMSwgODgwNCwgODgwNSwgODk2MiwgODk3NiwgODk5MiwgODk5MywgOTQ3MiwgOTQ3NCwgOTQ4NCwgOTQ4OCwgOTQ5MiwgOTQ5NiwgOTUwMCwgOTUwOCwgOTUxNiwgOTUyNCwgOTUzMiwgOTU1MiwgOTU1MywgOTU1NCwgOTU1NSwgOTU1NiwgOTU1NywgOTU1OCwgOTU1OSwgOTU2MCwgOTU2MSwgOTU2MiwgOTU2MywgOTU2NCwgOTU2NSwgOTU2NiwgOTU2NywgOTU2OCwgOTU2OSwgOTU3MCwgOTU3MSwgOTU3MiwgOTU3MywgOTU3NCwgOTU3NSwgOTU3NiwgOTU3NywgOTU3OCwgOTU3OSwgOTU4MCwgOTYwMCwgOTYwNCwgOTYwOCwgOTYxMiwgOTYxNiwgOTYxNywgOTYxOCwgOTYxOSwgOTYzMiwgOTYzMywgOTY0MiwgOTY0MywgOTY0NCwgOTY1MCwgOTY1OCwgOTY2MCwgOTY2OCwgOTY3NCwgOTY3NSwgOTY3OSwgOTY4OCwgOTY4OSwgOTcwMiwgOTc4NiwgOTc4NywgOTc4OCwgOTc5MiwgOTc5NCwgOTgyNCwgOTgyNywgOTgyOSwgOTgzMCwgOTgzNCwgOTgzNSwgOTgzNiwgNjE0NDEsIDYxNDQyLCA2MTQ0NSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xXTsKZXhwb3J0cy5MaWJlcmF0aW9uU2Fuc1JlZ3VsYXJNYXBwaW5nID0gTGliZXJhdGlvblNhbnNSZWd1bGFyTWFwcGluZzsKCi8qKiovIH0pLAovKiA1NSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLk15cmlhZFByb1JlZ3VsYXJNZXRyaWNzID0gZXhwb3J0cy5NeXJpYWRQcm9SZWd1bGFyRmFjdG9ycyA9IGV4cG9ydHMuTXlyaWFkUHJvSXRhbGljTWV0cmljcyA9IGV4cG9ydHMuTXlyaWFkUHJvSXRhbGljRmFjdG9ycyA9IGV4cG9ydHMuTXlyaWFkUHJvQm9sZE1ldHJpY3MgPSBleHBvcnRzLk15cmlhZFByb0JvbGRJdGFsaWNNZXRyaWNzID0gZXhwb3J0cy5NeXJpYWRQcm9Cb2xkSXRhbGljRmFjdG9ycyA9IGV4cG9ydHMuTXlyaWFkUHJvQm9sZEZhY3RvcnMgPSB2b2lkIDA7CmNvbnN0IE15cmlhZFByb0JvbGRGYWN0b3JzID0gWzEuMzY4OTgsIDEsIDEsIDAuNzI3MDYsIDAuODA0NzksIDAuODM3MzQsIDAuOTg4OTQsIDAuOTk3OTMsIDAuOTg5NywgMC45Mzg4NCwgMC44NjIwOSwgMC45NDI5MiwgMC45NDI5MiwgMS4xNjY2MSwgMS4wMjA1OCwgMC45MzU4MiwgMC45NjY5NCwgMC45MzU4MiwgMS4xOTEzNywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC45OTc5MywgMC43ODA3NiwgMC43ODA3NiwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43Mjg1MSwgMC43ODk2NiwgMC45MDgzOCwgMC44MzYzNywgMC44MjM5MSwgMC45NjM3NiwgMC44MDA2MSwgMC44NjI3NSwgMC44NzY4LCAwLjk1NDA3LCAxLjAyNTgsIDAuNzM5MDEsIDAuODUwMjIsIDAuODM2NTUsIDEuMDE1NiwgMC45NTU0NiwgMC45MjE3OSwgMC44NzEwNywgMC45MjE3OSwgMC44MjExNCwgMC44MDk2LCAwLjg5NzEzLCAwLjk0NDM4LCAwLjk1MzUzLCAwLjk0MDgzLCAwLjkxOTA1LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTQyOTIsIDEuMTg3NzcsIDAuOTQyOTIsIDEuMDIwNTgsIDAuODk5MDMsIDAuOTAwODgsIDAuOTQ5MzgsIDAuOTc4OTgsIDAuODEwOTMsIDAuOTc1NzEsIDAuOTQ5MzgsIDEuMDI0LCAwLjk1NzcsIDAuOTU5MzMsIDAuOTg2MjEsIDEuMDQ3NCwgMC45NzQ1NSwgMC45ODk4MSwgMC45NjcyLCAwLjk1OTMzLCAwLjk0NDYsIDAuOTc4OTgsIDAuOTc0MDcsIDAuOTc2NDYsIDAuNzgwMzYsIDEuMTAyMDgsIDAuOTU0NDIsIDAuOTUyOTgsIDAuOTc1NzksIDAuOTMzMiwgMC45NDAzOSwgMC45MzgsIDAuODA2ODcsIDEuMDExNDksIDAuODA2ODcsIDEuMDIwNTgsIDAuODA0NzksIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDAuOTk3OTMsIDEuMDExNDksIDEuMDA4NzIsIDAuOTAwODgsIDAuOTE4ODIsIDEuMDIxMywgMC44MzYxLCAxLjAyMDU4LCAwLjYyMjk1LCAwLjU0MzI0LCAwLjg5MDIyLCAxLjA4NTk1LCAxLCAxLCAwLjkwMDg4LCAxLCAwLjk3NDU1LCAwLjkzNTgyLCAwLjkwMDg4LCAxLCAxLjA1Njg2LCAwLjgzNjEsIDAuOTk2NDIsIDAuOTk2NDIsIDAuOTk2NDIsIDAuNzI4NTEsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuOTA4MzgsIDAuODY4LCAwLjgyMzkxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAwLjgwMDYxLCAxLjAyNTgsIDEuMDI1OCwgMS4wMjU4LCAxLjAyNTgsIDAuOTc0ODQsIDAuOTU1NDYsIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDAuOTIxNzksIDEuMDIwNTgsIDAuOTIxNzksIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTQ0MzgsIDAuOTA0MDYsIDAuODY5NTgsIDAuOTgyMjUsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTQ5MzgsIDAuOTAzMSwgMC44MTA5MywgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45NDkzOCwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45Mzk2OSwgMC45NTkzMywgMC45NDQ2LCAwLjk0NDYsIDAuOTQ0NiwgMC45NDQ2LCAwLjk0NDYsIDEuMDg1OTUsIDAuOTQ0NiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NTQ0MiwgMC45NDAzOSwgMC45Nzg5OCwgMC45NDAzOSwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC45MDgzOCwgMC45NDkzOCwgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC44MjM5MSwgMC44MTA5MywgMC45NjM3NiwgMC44NDMxMywgMC45NzQ4NCwgMC45NzU3MSwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44MDA2MSwgMC45NDkzOCwgMC44NzY4LCAwLjk1NzcsIDAuODc2OCwgMC45NTc3LCAwLjg3NjgsIDAuOTU3NywgMSwgMSwgMC45NTQwNywgMC45NTkzMywgMC45NzA2OSwgMC45NTkzMywgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDEuMDI1OCwgMC45ODYyMSwgMS4wMjU4LCAwLjk4NjIxLCAxLjAyNTgsIDAuOTg2MjEsIDAuODg3LCAxLjAxNTkxLCAwLjczOTAxLCAxLjA0NzQsIDEsIDEsIDAuOTc0NTUsIDAuODM2NTUsIDAuOTg5ODEsIDEsIDEsIDAuODM2NTUsIDAuNzM5NzcsIDAuODM2NTUsIDAuNzM5MDMsIDAuODQ2MzgsIDEuMDMzLCAwLjk1NTQ2LCAwLjk1OTMzLCAxLCAxLCAwLjk1NTQ2LCAwLjk1OTMzLCAwLjgyNzEsIDAuOTU0MTcsIDAuOTU5MzMsIDAuOTIxNzksIDAuOTQ0NiwgMC45MjE3OSwgMC45NDQ2LCAwLjkyMTc5LCAwLjk0NDYsIDAuOTM2LCAwLjkxOTY0LCAwLjgyMTE0LCAwLjk3NjQ2LCAxLCAxLCAwLjgyMTE0LCAwLjk3NjQ2LCAwLjgwOTYsIDAuNzgwMzYsIDAuODA5NiwgMC43ODAzNiwgMSwgMSwgMC44MDk2LCAwLjc4MDM2LCAxLCAxLCAwLjg5NzEzLCAwLjc3NDUyLCAwLjg5NzEzLCAxLjEwMjA4LCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0NDM4LCAwLjk1NDQyLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjkwNDA2LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAwLjk0NDYsIDAuOTM4LCAxLCAwLjk5NzkzLCAwLjkwODM4LCAwLjk0OTM4LCAwLjg2OCwgMC45MDMxLCAwLjkyMTc5LCAwLjk0NDYsIDEsIDEsIDAuODk3MTMsIDEuMTAyMDgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTA5ODksIDAuOTM1OCwgMC45MTk0NSwgMC44MzE4MSwgMC43NTI2MSwgMC44Nzk5MiwgMC44Mjk3NiwgMC45NjAzNCwgMC44MzY4OSwgMC45NzI2OCwgMS4wMDc4LCAwLjkwODM4LCAwLjgzNjM3LCAwLjgwMTksIDAuOTAxNTcsIDAuODAwNjEsIDAuOTQ0NiwgMC45NTQwNywgMC45MjQzNiwgMS4wMjU4LCAwLjg1MDIyLCAwLjk3MTUzLCAxLjAxNTYsIDAuOTU1NDYsIDAuODkxOTIsIDAuOTIxNzksIDAuOTIzNjEsIDAuODcxMDcsIDAuOTYzMTgsIDAuODk3MTMsIDAuOTM3MDQsIDAuOTU2MzgsIDAuOTE5MDUsIDAuOTE3MDksIDAuOTI3OTYsIDEuMDI1OCwgMC45MzcwNCwgMC45NDgzNiwgMS4wMzczLCAwLjk1OTMzLCAxLjAwNzgsIDAuOTU4NzEsIDAuOTQ4MzYsIDAuOTYxNzQsIDAuOTI2MDEsIDAuOTQ5OCwgMC45ODYwNywgMC45NTc3NiwgMC45NTkzMywgMS4wNTQ1MywgMS4wMDc4LCAwLjk4Mjc1LCAwLjkzMTQsIDAuOTU2MTcsIDAuOTE3MDEsIDEuMDU5OTMsIDAuOTQ0NiwgMC43ODM2NywgMC45NTUzLCAxLCAwLjg2ODMyLCAxLjAxMjgsIDAuOTU4NzEsIDAuOTkzOTQsIDAuODc1NDgsIDAuOTYzNjEsIDAuODY3NzQsIDEuMDA3OCwgMC45NTg3MSwgMC45NDQ2LCAwLjk1ODcxLCAwLjg2Nzc0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjk0MDgzLCAwLjk3NTc5LCAwLjkwNDA2LCAwLjk0MDM5LCAwLjk2Njk0LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkzNTgyLCAwLjkzNTgyLCAwLjkzNTgyLCAxLCAwLjkwOCwgMC45MDgsIDAuOTE4LCAwLjk0MjE5LCAwLjk0MjE5LCAwLjk2NTQ0LCAxLCAxLjI4NSwgMSwgMSwgMC44MTA3OSwgMC44MTA3OSwgMSwgMSwgMC43NDg1NCwgMSwgMSwgMSwgMSwgMC45OTc5MywgMSwgMSwgMSwgMC42NSwgMSwgMS4zNjE0NSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4xNzE3MywgMSwgMC44MDUzNSwgMC43NjE2OSwgMS4wMjA1OCwgMS4wNzMyLCAxLjA1NDg2LCAxLCAxLCAxLjMwNjkyLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjE2MTYxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKZXhwb3J0cy5NeXJpYWRQcm9Cb2xkRmFjdG9ycyA9IE15cmlhZFByb0JvbGRGYWN0b3JzOwpjb25zdCBNeXJpYWRQcm9Cb2xkTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmV4cG9ydHMuTXlyaWFkUHJvQm9sZE1ldHJpY3MgPSBNeXJpYWRQcm9Cb2xkTWV0cmljczsKY29uc3QgTXlyaWFkUHJvQm9sZEl0YWxpY0ZhY3RvcnMgPSBbMS4zNjg5OCwgMSwgMSwgMC42NjIyNywgMC44MDc3OSwgMC44MTYyNSwgMC45NzI3NiwgMC45NzI3NiwgMC45NzczMywgMC45MjIyMiwgMC44MzI2NiwgMC45NDI5MiwgMC45NDI5MiwgMS4xNjE0OCwgMS4wMjA1OCwgMC45MzU4MiwgMC45NjY5NCwgMC45MzU4MiwgMS4xNzMzNywgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC43ODA3NiwgMC43ODA3NiwgMS4wMjA1OCwgMS4wMjA1OCwgMS4wMjA1OCwgMC43MTU0MSwgMC43NjgxMywgMC44NTU3NiwgMC44MDU5MSwgMC44MDcyOSwgMC45NDI5OSwgMC43NzUxMiwgMC44MzY1NSwgMC44NjUyMywgMC45MjIyMiwgMC45ODYyMSwgMC43MTc0MywgMC44MTY5OCwgMC43OTcyNiwgMC45ODU1OCwgMC45MjIyMiwgMC45MDYzNywgMC44MzgwOSwgMC45MDYzNywgMC44MDcyOSwgMC43NjQ2MywgMC44NjI3NSwgMC45MDY5OSwgMC45MTYwNSwgMC45MTU0LCAwLjg1MzA4LCAwLjg1NDU4LCAwLjkwNTMxLCAwLjk0MjkyLCAxLjIxMjk2LCAwLjk0MjkyLCAxLjAyMDU4LCAwLjg5OTAzLCAxLjE4NjE2LCAwLjk5NjEzLCAwLjkxNjc3LCAwLjc4MjE2LCAwLjkxNjc3LCAwLjkwMDgzLCAwLjk4Nzk2LCAwLjkxMzUsIDAuOTIxNjgsIDAuOTUzODEsIDAuOTg5ODEsIDAuOTUyOTgsIDAuOTUzODEsIDAuOTM0NTksIDAuOTIxNjgsIDAuOTE1MTMsIDAuOTIwMDQsIDAuOTE2NzcsIDAuOTUwNzcsIDAuNzQ4LCAxLjA0NTAyLCAwLjkxNjc3LCAwLjkyMDYxLCAwLjk0MjM2LCAwLjg5NTQ0LCAwLjg5MzY0LCAwLjksIDAuODA2ODcsIDAuODU3OCwgMC44MDY4NywgMS4wMjA1OCwgMC44MDc3OSwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC45NzI3NiwgMC44NTc4LCAwLjk5OTczLCAxLjE4NjE2LCAwLjkxMzM5LCAxLjA4MDc0LCAwLjgyODkxLCAxLjAyMDU4LCAwLjU1NTA5LCAwLjcxNTI2LCAwLjg5MDIyLCAxLjA4NTk1LCAxLCAxLCAxLjE4NjE2LCAxLCAwLjk2NzM2LCAwLjkzNTgyLCAxLjE4NjE2LCAxLCAxLjA0ODY0LCAwLjgyNzExLCAwLjk5MDQzLCAwLjk5MDQzLCAwLjk5MDQzLCAwLjcxNTQxLCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg1NTc2LCAwLjg0NSwgMC44MDcyOSwgMC43NzUxMiwgMC43NzUxMiwgMC43NzUxMiwgMC43NzUxMiwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45ODYyMSwgMC45NTk2MSwgMC45MjIyMiwgMC45MDYzNywgMC45MDYzNywgMC45MDYzNywgMC45MDYzNywgMC45MDYzNywgMS4wMjA1OCwgMC45MDI1MSwgMC45MDY5OSwgMC45MDY5OSwgMC45MDY5OSwgMC45MDY5OSwgMC44NTQ1OCwgMC44MzY1OSwgMC45NDk1MSwgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC45OTYxMywgMC44NTgxMSwgMC43ODIxNiwgMC45MDA4MywgMC45MDA4MywgMC45MDA4MywgMC45MDA4MywgMC45NTM4MSwgMC45NTM4MSwgMC45NTM4MSwgMC45NTM4MSwgMC45MTM1LCAwLjkyMTY4LCAwLjkxNTEzLCAwLjkxNTEzLCAwLjkxNTEzLCAwLjkxNTEzLCAwLjkxNTEzLCAxLjA4NTk1LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjkxNjc3LCAwLjg5MzY0LCAwLjkyMzMyLCAwLjg5MzY0LCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg1NTc2LCAwLjk5NjEzLCAwLjg1NTc2LCAwLjk5NjEzLCAwLjgwNzI5LCAwLjc4MjE2LCAwLjgwNzI5LCAwLjc4MjE2LCAwLjgwNzI5LCAwLjc4MjE2LCAwLjgwNzI5LCAwLjc4MjE2LCAwLjk0Mjk5LCAwLjc2NzgzLCAwLjk1OTYxLCAwLjkxNjc3LCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjc3NTEyLCAwLjkwMDgzLCAwLjg2NTIzLCAwLjkxMzUsIDAuODY1MjMsIDAuOTEzNSwgMC44NjUyMywgMC45MTM1LCAxLCAxLCAwLjkyMjIyLCAwLjkyMTY4LCAwLjkyMjIyLCAwLjkyMTY4LCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjk4NjIxLCAwLjk1MzgxLCAwLjg2MDM2LCAwLjk3MDk2LCAwLjcxNzQzLCAwLjk4OTgxLCAxLCAxLCAwLjk1Mjk4LCAwLjc5NzI2LCAwLjk1MzgxLCAxLCAxLCAwLjc5NzI2LCAwLjY4OTQsIDAuNzk3MjYsIDAuNzQzMjEsIDAuODE2OTEsIDEuMDAwNiwgMC45MjIyMiwgMC45MjE2OCwgMSwgMSwgMC45MjIyMiwgMC45MjE2OCwgMC43OTQ2NCwgMC45MjA5OCwgMC45MjE2OCwgMC45MDYzNywgMC45MTUxMywgMC45MDYzNywgMC45MTUxMywgMC45MDYzNywgMC45MTUxMywgMC45MDksIDAuODc1MTQsIDAuODA3MjksIDAuOTUwNzcsIDEsIDEsIDAuODA3MjksIDAuOTUwNzcsIDAuNzY0NjMsIDAuNzQ4LCAwLjc2NDYzLCAwLjc0OCwgMSwgMSwgMC43NjQ2MywgMC43NDgsIDEsIDEsIDAuODYyNzUsIDAuNzI2NTEsIDAuODYyNzUsIDEuMDQ1MDIsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTA2OTksIDAuOTE2NzcsIDAuOTE1NCwgMC45NDIzNiwgMC44NTQ1OCwgMC44OTM2NCwgMC44NTQ1OCwgMC45MDUzMSwgMC45LCAwLjkwNTMxLCAwLjksIDAuOTA1MzEsIDAuOSwgMSwgMC45NzI3NiwgMC44NTU3NiwgMC45OTYxMywgMC44NDUsIDAuODU4MTEsIDAuOTAyNTEsIDAuOTE2NzcsIDEsIDEsIDAuODYyNzUsIDEuMDQ1MDIsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMTg2MTYsIDEuMDA4OTksIDEuMzA2MjgsIDAuODU1NzYsIDAuODAxNzgsIDAuNjY4NjIsIDAuNzkyNywgMC42OTMyMywgMC44ODEyNywgMC43MjQ1OSwgMC44OTcxMSwgMC45NTM4MSwgMC44NTU3NiwgMC44MDU5MSwgMC43ODA1LCAwLjk0NzI5LCAwLjc3NTEyLCAwLjkwNTMxLCAwLjkyMjIyLCAwLjkwNjM3LCAwLjk4NjIxLCAwLjgxNjk4LCAwLjkyNjU1LCAwLjk4NTU4LCAwLjkyMjIyLCAwLjg1MzU5LCAwLjkwNjM3LCAwLjkwOTc2LCAwLjgzODA5LCAwLjk0NTIzLCAwLjg2Mjc1LCAwLjgzNTA5LCAwLjkzMTU3LCAwLjg1MzA4LCAwLjgzMzkyLCAwLjkyMzQ2LCAwLjk4NjIxLCAwLjgzNTA5LCAwLjkyODg2LCAwLjkxMzI0LCAwLjkyMTY4LCAwLjk1MzgxLCAwLjkwNjQ2LCAwLjkyODg2LCAwLjkwNTU3LCAwLjg2ODQ3LCAwLjkwMjc2LCAwLjkxMzI0LCAwLjg2ODQyLCAwLjkyMTY4LCAwLjk5NTMxLCAwLjk1MzgxLCAwLjkyMjQsIDAuODU0MDgsIDAuOTI2OTksIDAuODY4NDcsIDEuMDA1MSwgMC45MTUxMywgMC44MDQ4NywgMC45MzQ4MSwgMSwgMC44ODE1OSwgMS4wNTIxNCwgMC45MDY0NiwgMC45NzM1NSwgMC44MTUzOSwgMC44OTM5OCwgMC44NTkyMywgMC45NTM4MSwgMC45MDY0NiwgMC45MTUxMywgMC45MDY0NiwgMC44NTkyMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MTU0LCAwLjk0MjM2LCAwLjkxNTQsIDAuOTQyMzYsIDAuOTE1NCwgMC45NDIzNiwgMC44NTQ1OCwgMC44OTM2NCwgMC45NjY5NCwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC45MTc4MiwgMC45MTc4MiwgMC45MTc4MiwgMSwgMC44OTYsIDAuODk2LCAwLjg5NiwgMC45MzMyLCAwLjkzMzIsIDAuOTU5NzMsIDEsIDEuMjYsIDEsIDEsIDAuODA0NzksIDAuODAxNzgsIDEsIDEsIDAuODU2MzMsIDEsIDEsIDEsIDEsIDAuOTcyNzYsIDEsIDEsIDEsIDAuNjk4LCAxLCAxLjM2MTQ1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjE0NTQyLCAxLCAwLjc5MTk5LCAwLjc4Njk0LCAxLjAyMDU4LCAxLjAzNDkzLCAxLjA1NDg2LCAxLCAxLCAxLjIzMDI2LCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjIwMDA2LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKZXhwb3J0cy5NeXJpYWRQcm9Cb2xkSXRhbGljRmFjdG9ycyA9IE15cmlhZFByb0JvbGRJdGFsaWNGYWN0b3JzOwpjb25zdCBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmV4cG9ydHMuTXlyaWFkUHJvQm9sZEl0YWxpY01ldHJpY3MgPSBNeXJpYWRQcm9Cb2xkSXRhbGljTWV0cmljczsKY29uc3QgTXlyaWFkUHJvSXRhbGljRmFjdG9ycyA9IFsxLjM2ODk4LCAxLCAxLCAwLjY1NTA3LCAwLjg0OTQzLCAwLjg1NjM5LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg2OTM2LCAwLjg4MzA3LCAwLjg2OTQ4LCAwLjg1MjgzLCAwLjg1MjgzLCAxLjA2MzgzLCAxLjAyMDU4LCAwLjc1OTQ1LCAwLjkyMTksIDAuNzU5NDUsIDEuMTczMzcsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuODg0NjUsIDAuNzU5NDUsIDAuNzU5NDUsIDEuMDIwNTgsIDEuMDIwNTgsIDEuMDIwNTgsIDAuNjkwNDYsIDAuNzA5MjYsIDAuODUxNTgsIDAuNzc4MTIsIDAuNzY4NTIsIDAuODk1OTEsIDAuNzA0NjYsIDAuNzYxMjUsIDAuODAwOTQsIDAuODY4MjIsIDAuODM4NjQsIDAuNzI4LCAwLjc3MjEyLCAwLjc5NDc1LCAwLjkzNjM3LCAwLjg3NTE0LCAwLjg1ODgsIDAuNzYwMTMsIDAuODU4OCwgMC43MjQyMSwgMC42OTg2NiwgMC43NzU5OCwgMC44NTk5MSwgMC44MDgxMSwgMC44NzgzMiwgMC43ODExMiwgMC43NzUxMiwgMC44NTYyLCAxLjAyMjIsIDEuMTg0MTcsIDEuMDIyMiwgMS4yNzAxNCwgMC44OTkwMywgMS4xNTAxMiwgMC45Mzg1OSwgMC45NDM5OSwgMC44NDYsIDAuOTQzOTksIDAuODE0NTMsIDEuMDE4NiwgMC45NDIxOSwgMC45NjAxNywgMS4wMzA3NSwgMS4wMjE3NSwgMC45MTIsIDEuMDMwNzUsIDAuOTY5OTgsIDAuOTYwMTcsIDAuOTM4NTksIDAuOTQzOTksIDAuOTQzOTksIDAuOTU0OTMsIDAuNzQ2LCAxLjEyNjU4LCAwLjk0NTc4LCAwLjkxLCAwLjk3OSwgMC44ODIsIDAuODgyLCAwLjgzLCAwLjg1MDM0LCAwLjgzNTM3LCAwLjg1MDM0LCAxLjAyMDU4LCAwLjcwODY5LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjg4NDY1LCAwLjgzNTM3LCAwLjkwMDgzLCAxLjE1MDEyLCAwLjkxNjEsIDAuOTQ1NjUsIDAuNzM1NDEsIDEuMDIwNTgsIDAuNTM2MDksIDAuNjkzNTMsIDAuNzk1MTksIDEuMDg1OTUsIDEsIDEsIDEuMTUwMTIsIDEsIDAuOTE5NzQsIDAuNzU5NDUsIDEuMTUwMTIsIDEsIDAuOTQ0NiwgMC43MzM2MSwgMC45MDA1LCAwLjkwMDUsIDAuOTAwNSwgMC42Mjg2NCwgMC44NTE1OCwgMC44NTE1OCwgMC44NTE1OCwgMC44NTE1OCwgMC44NTE1OCwgMC44NTE1OCwgMC43NzMsIDAuNzY4NTIsIDAuNzA0NjYsIDAuNzA0NjYsIDAuNzA0NjYsIDAuNzA0NjYsIDAuODM4NjQsIDAuODM4NjQsIDAuODM4NjQsIDAuODM4NjQsIDAuOTA1NjEsIDAuODc1MTQsIDAuODU4OCwgMC44NTg4LCAwLjg1ODgsIDAuODU4OCwgMC44NTg4LCAxLjAyMDU4LCAwLjg1NzUxLCAwLjg1OTkxLCAwLjg1OTkxLCAwLjg1OTkxLCAwLjg1OTkxLCAwLjc3NTEyLCAwLjc2MDEzLCAwLjg4MDc1LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjkzODU5LCAwLjgwNzUsIDAuODQ2LCAwLjgxNDUzLCAwLjgxNDUzLCAwLjgxNDUzLCAwLjgxNDUzLCAwLjgyNDI0LCAwLjgyNDI0LCAwLjgyNDI0LCAwLjgyNDI0LCAwLjkyNzgsIDAuOTYwMTcsIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDAuOTM4NTksIDEuMDg1OTUsIDAuODU2MiwgMC45NDU3OCwgMC45NDU3OCwgMC45NDU3OCwgMC45NDU3OCwgMC44ODIsIDAuOTQ1NzgsIDAuODgyLCAwLjg1MTU4LCAwLjkzODU5LCAwLjg1MTU4LCAwLjkzODU5LCAwLjg1MTU4LCAwLjkzODU5LCAwLjc2ODUyLCAwLjg0NiwgMC43Njg1MiwgMC44NDYsIDAuNzY4NTIsIDAuODQ2LCAwLjc2ODUyLCAwLjg0NiwgMC44OTU5MSwgMC44NTQ0LCAwLjkwNTYxLCAwLjk0Mzk5LCAwLjcwNDY2LCAwLjgxNDUzLCAwLjcwNDY2LCAwLjgxNDUzLCAwLjcwNDY2LCAwLjgxNDUzLCAwLjcwNDY2LCAwLjgxNDUzLCAwLjcwNDY2LCAwLjgxNDUzLCAwLjgwMDk0LCAwLjk0MjE5LCAwLjgwMDk0LCAwLjk0MjE5LCAwLjgwMDk0LCAwLjk0MjE5LCAxLCAxLCAwLjg2ODIyLCAwLjk2MDE3LCAwLjg2ODIyLCAwLjk2MDE3LCAwLjgzODY0LCAwLjgyNDI0LCAwLjgzODY0LCAwLjgyNDI0LCAwLjgzODY0LCAwLjgyNDI0LCAwLjgzODY0LCAxLjAzMDc1LCAwLjgzODY0LCAwLjgyNDI0LCAwLjgxNDAyLCAxLjAyNzM4LCAwLjcyOCwgMS4wMjE3NSwgMSwgMSwgMC45MTIsIDAuNzk0NzUsIDEuMDMwNzUsIDEsIDEsIDAuNzk0NzUsIDAuODM5MTEsIDAuNzk0NzUsIDAuNjYyNjYsIDAuODA1NTMsIDEuMDY2NzYsIDAuODc1MTQsIDAuOTYwMTcsIDEsIDEsIDAuODc1MTQsIDAuOTYwMTcsIDAuODY4NjUsIDAuODczOTYsIDAuOTYwMTcsIDAuODU4OCwgMC45Mzg1OSwgMC44NTg4LCAwLjkzODU5LCAwLjg1ODgsIDAuOTM4NTksIDAuODY3LCAwLjg0NzU5LCAwLjcyNDIxLCAwLjk1NDkzLCAxLCAxLCAwLjcyNDIxLCAwLjk1NDkzLCAwLjY5ODY2LCAwLjc0NiwgMC42OTg2NiwgMC43NDYsIDEsIDEsIDAuNjk4NjYsIDAuNzQ2LCAxLCAxLCAwLjc3NTk4LCAwLjg4NDE3LCAwLjc3NTk4LCAxLjEyNjU4LCAwLjg1OTkxLCAwLjk0NTc4LCAwLjg1OTkxLCAwLjk0NTc4LCAwLjg1OTkxLCAwLjk0NTc4LCAwLjg1OTkxLCAwLjk0NTc4LCAwLjg1OTkxLCAwLjk0NTc4LCAwLjg1OTkxLCAwLjk0NTc4LCAwLjg3ODMyLCAwLjk3OSwgMC43NzUxMiwgMC44ODIsIDAuNzc1MTIsIDAuODU2MiwgMC44MywgMC44NTYyLCAwLjgzLCAwLjg1NjIsIDAuODMsIDEsIDAuODg0NjUsIDAuODUxNTgsIDAuOTM4NTksIDAuNzczLCAwLjgwNzUsIDAuODU3NTEsIDAuODU2MiwgMSwgMSwgMC43NzU5OCwgMS4xMjY1OCwgMS4xNTAxMiwgMS4xNTAxMiwgMS4xNTAxMiwgMS4xNTAxMiwgMS4xNTAxMiwgMS4xNTMxMywgMS4xNTAxMiwgMS4xNTAxMiwgMS4xNTAxMiwgMS4wODEwNiwgMS4wMzkwMSwgMC44NTE1OCwgMC43NzAyNSwgMC42MjI2NCwgMC43NjQ2LCAwLjY1MzUxLCAwLjg2MDI2LCAwLjY5NDYxLCAwLjg5OTQ3LCAxLjAzMDc1LCAwLjg1MTU4LCAwLjc3ODEyLCAwLjc2NDQ5LCAwLjg4ODM2LCAwLjcwNDY2LCAwLjg1NjIsIDAuODY4MjIsIDAuODU4OCwgMC44Mzg2NCwgMC43NzIxMiwgMC44NTMwOCwgMC45MzYzNywgMC44NzUxNCwgMC44MjM1MiwgMC44NTg4LCAwLjg1NzAxLCAwLjc2MDEzLCAwLjg5MDU4LCAwLjc3NTk4LCAwLjgxNTYsIDAuODI1NjUsIDAuNzgxMTIsIDAuNzc4OTksIDAuODkzODYsIDAuODM4NjQsIDAuODE1NiwgMC45NDg2LCAwLjkyMzg4LCAwLjk2MTg2LCAxLjAzMDc1LCAwLjkxMTIzLCAwLjk0ODYsIDAuOTMyOTgsIDAuODc4LCAwLjkzOTQyLCAwLjkyMzg4LCAwLjg0NTk2LCAwLjk2MTg2LCAwLjk1MTE5LCAxLjAzMDc1LCAwLjkyMiwgMC44ODc4NywgMC45NTgyOSwgMC44OCwgMC45MzU1OSwgMC45Mzg1OSwgMC43ODgxNSwgMC45Mzc1OCwgMSwgMC44OTIxNywgMS4wMzczNywgMC45MTEyMywgMC45Mzk2OSwgMC43NzQ4NywgMC44NTc2OSwgMC44Njc5OSwgMS4wMzA3NSwgMC45MTEyMywgMC45Mzg1OSwgMC45MTEyMywgMC44Njc5OSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44NzgzMiwgMC45NzksIDAuODc4MzIsIDAuOTc5LCAwLjg3ODMyLCAwLjk3OSwgMC43NzUxMiwgMC44ODIsIDAuOTIxOSwgMSwgMC44OTkwMywgMSwgMSwgMSwgMC44NzMyMSwgMC44NzMyMSwgMC44NzMyMSwgMSwgMS4wMjcsIDEuMDI3LCAxLjAyNywgMC44Njg0NywgMC44Njg0NywgMC43OTEyMSwgMSwgMS4xMjQsIDEsIDEsIDAuNzM1NzIsIDAuNzM1NzIsIDEsIDEsIDAuODUwMzQsIDEsIDEsIDEsIDEsIDAuODg0NjUsIDEsIDEsIDEsIDAuNjY5LCAxLCAxLjM2MTQ1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA0ODI4LCAxLCAwLjc0OTQ4LCAwLjc1MTg3LCAxLjAyMDU4LCAwLjk4MzkxLCAxLjAyMTE5LCAxLCAxLCAxLjA2MjMzLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLjA4NTk1LCAxLjA4NTk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA1MjMzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXTsKZXhwb3J0cy5NeXJpYWRQcm9JdGFsaWNGYWN0b3JzID0gTXlyaWFkUHJvSXRhbGljRmFjdG9yczsKY29uc3QgTXlyaWFkUHJvSXRhbGljTWV0cmljcyA9IHsKICBsaW5lSGVpZ2h0OiAxLjIsCiAgbGluZUdhcDogMC4yCn07CmV4cG9ydHMuTXlyaWFkUHJvSXRhbGljTWV0cmljcyA9IE15cmlhZFByb0l0YWxpY01ldHJpY3M7CmNvbnN0IE15cmlhZFByb1JlZ3VsYXJGYWN0b3JzID0gWzEuMzY4OTgsIDEsIDEsIDAuNzYzMDUsIDAuODI3ODQsIDAuOTQ5MzUsIDAuODkzNjQsIDAuOTIyNDEsIDAuODkwNzMsIDAuOTA3MDYsIDAuOTg0NzIsIDAuODUyODMsIDAuODUyODMsIDEuMDY2NCwgMS4wMjA1OCwgMC43NDUwNSwgMC45MjE5LCAwLjc0NTA1LCAxLjIzNDU2LCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjkyMjQxLCAwLjc0NTA1LCAwLjc0NTA1LCAxLjAyMDU4LCAxLjAyMDU4LCAxLjAyMDU4LCAwLjczMDAyLCAwLjcyNjAxLCAwLjkxNzU1LCAwLjgxMjYsIDAuODAzMTQsIDAuOTIyMjIsIDAuNzM3NjQsIDAuNzk3MjYsIDAuODMwNTEsIDAuOTAyODQsIDAuODYwMjMsIDAuNzQsIDAuODEyNiwgMC44NDg2OSwgMC45NjUxOCwgMC45MTExNSwgMC44ODU4LCAwLjc5NzYxLCAwLjg4NTgsIDAuNzQ0OTgsIDAuNzM5MTQsIDAuODEzNjMsIDAuODk1OTEsIDAuODM2NTksIDAuODk2MzMsIDAuODU2MDgsIDAuODExMSwgMC45MDUzMSwgMS4wMjIyLCAxLjIyNzM2LCAxLjAyMjIsIDEuMjcwMTQsIDAuODk5MDMsIDAuOTAwODgsIDAuODY2NjcsIDEuMDIzMSwgMC44OTYsIDEuMDE0MTEsIDAuOTAwODMsIDEuMDUwOTksIDEuMDA1MTIsIDAuOTk3OTMsIDEuMDUzMjYsIDEuMDkzNzcsIDAuOTM4LCAxLjA2MjI2LCAxLjAwMTE5LCAwLjk5NzkzLCAwLjk4NzE0LCAxLjAyMzEsIDEuMDEyMzEsIDAuOTgxOTYsIDAuNzkyLCAxLjE5MTM3LCAwLjk5MDc0LCAwLjk2MiwgMS4wMTkxNSwgMC45MjYsIDAuOTQyLCAwLjg1NiwgMC44NTAzNCwgMC45MjAwNiwgMC44NTAzNCwgMS4wMjA1OCwgMC42OTA2NywgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjI0MSwgMC45MjAwNiwgMC45MzMyLCAwLjkwMDg4LCAwLjkxODgyLCAwLjkzNDg0LCAwLjc1MzM5LCAxLjAyMDU4LCAwLjU2ODY2LCAwLjU0MzI0LCAwLjc5NTE5LCAxLjA4NTk1LCAxLCAxLCAwLjkwMDg4LCAxLCAwLjk1MzI1LCAwLjc0NTA1LCAwLjkwMDg4LCAxLCAwLjk3MTk4LCAwLjc1MzM5LCAwLjkxMDA5LCAwLjkxMDA5LCAwLjkxMDA5LCAwLjY2NDY2LCAwLjkxNzU1LCAwLjkxNzU1LCAwLjkxNzU1LCAwLjkxNzU1LCAwLjkxNzU1LCAwLjkxNzU1LCAwLjc4OCwgMC44MDMxNCwgMC43Mzc2NCwgMC43Mzc2NCwgMC43Mzc2NCwgMC43Mzc2NCwgMC44NjAyMywgMC44NjAyMywgMC44NjAyMywgMC44NjAyMywgMC45MjkxNSwgMC45MTExNSwgMC44ODU4LCAwLjg4NTgsIDAuODg1OCwgMC44ODU4LCAwLjg4NTgsIDEuMDIwNTgsIDAuODg1OCwgMC44OTU5MSwgMC44OTU5MSwgMC44OTU5MSwgMC44OTU5MSwgMC44MTExLCAwLjc5NjExLCAwLjg5NzEzLCAwLjg2NjY3LCAwLjg2NjY3LCAwLjg2NjY3LCAwLjg2NjY3LCAwLjg2NjY3LCAwLjg2NjY3LCAwLjg2OTM2LCAwLjg5NiwgMC45MDA4MywgMC45MDA4MywgMC45MDA4MywgMC45MDA4MywgMC44NDIyNCwgMC44NDIyNCwgMC44NDIyNCwgMC44NDIyNCwgMC45NzI3NiwgMC45OTc5MywgMC45ODcxNCwgMC45ODcxNCwgMC45ODcxNCwgMC45ODcxNCwgMC45ODcxNCwgMS4wODU5NSwgMC44OTg3NiwgMC45OTA3NCwgMC45OTA3NCwgMC45OTA3NCwgMC45OTA3NCwgMC45NDIsIDEuMDIzMSwgMC45NDIsIDAuOTE3NTUsIDAuODY2NjcsIDAuOTE3NTUsIDAuODY2NjcsIDAuOTE3NTUsIDAuODY2NjcsIDAuODAzMTQsIDAuODk2LCAwLjgwMzE0LCAwLjg5NiwgMC44MDMxNCwgMC44OTYsIDAuODAzMTQsIDAuODk2LCAwLjkyMjIyLCAwLjkzMzcyLCAwLjkyOTE1LCAxLjAxNDExLCAwLjczNzY0LCAwLjkwMDgzLCAwLjczNzY0LCAwLjkwMDgzLCAwLjczNzY0LCAwLjkwMDgzLCAwLjczNzY0LCAwLjkwMDgzLCAwLjczNzY0LCAwLjkwMDgzLCAwLjgzMDUxLCAxLjAwNTEyLCAwLjgzMDUxLCAxLjAwNTEyLCAwLjgzMDUxLCAxLjAwNTEyLCAxLCAxLCAwLjkwMjg0LCAwLjk5NzkzLCAwLjkwOTc2LCAwLjk5NzkzLCAwLjg2MDIzLCAwLjg0MjI0LCAwLjg2MDIzLCAwLjg0MjI0LCAwLjg2MDIzLCAwLjg0MjI0LCAwLjg2MDIzLCAxLjA1MzI2LCAwLjg2MDIzLCAwLjg0MjI0LCAwLjgyODczLCAxLjA3NDY5LCAwLjc0LCAxLjA5Mzc3LCAxLCAxLCAwLjkzOCwgMC44NDg2OSwgMS4wNjIyNiwgMSwgMSwgMC44NDg2OSwgMC44MzcwNCwgMC44NDg2OSwgMC44MTQ0MSwgMC44NTU4OCwgMS4wODkyNywgMC45MTExNSwgMC45OTc5MywgMSwgMSwgMC45MTExNSwgMC45OTc5MywgMC45MTg4NywgMC45MDk5MSwgMC45OTc5MywgMC44ODU4LCAwLjk4NzE0LCAwLjg4NTgsIDAuOTg3MTQsIDAuODg1OCwgMC45ODcxNCwgMC44OTQsIDAuOTE0MzQsIDAuNzQ0OTgsIDAuOTgxOTYsIDEsIDEsIDAuNzQ0OTgsIDAuOTgxOTYsIDAuNzM5MTQsIDAuNzkyLCAwLjczOTE0LCAwLjc5MiwgMSwgMSwgMC43MzkxNCwgMC43OTIsIDEsIDEsIDAuODEzNjMsIDAuOTA0LCAwLjgxMzYzLCAxLjE5MTM3LCAwLjg5NTkxLCAwLjk5MDc0LCAwLjg5NTkxLCAwLjk5MDc0LCAwLjg5NTkxLCAwLjk5MDc0LCAwLjg5NTkxLCAwLjk5MDc0LCAwLjg5NTkxLCAwLjk5MDc0LCAwLjg5NTkxLCAwLjk5MDc0LCAwLjg5NjMzLCAxLjAxOTE1LCAwLjgxMTEsIDAuOTQyLCAwLjgxMTEsIDAuOTA1MzEsIDAuODU2LCAwLjkwNTMxLCAwLjg1NiwgMC45MDUzMSwgMC44NTYsIDEsIDAuOTIyNDEsIDAuOTE3NTUsIDAuODY2NjcsIDAuNzg4LCAwLjg2OTM2LCAwLjg4NTgsIDAuODk4NzYsIDEsIDEsIDAuODEzNjMsIDEuMTkxMzcsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAwODgsIDAuOTAzODgsIDEuMDM5MDEsIDAuOTIxMzgsIDAuNzgxMDUsIDAuNzE1NCwgMC44NjE2OSwgMC44MDUxMywgMC45NDAwNywgMC44MjUyOCwgMC45ODYxMiwgMS4wNjIyNiwgMC45MTc1NSwgMC44MTI2LCAwLjgxODg0LCAwLjkyODE5LCAwLjczNzY0LCAwLjkwNTMxLCAwLjkwMjg0LCAwLjg4NTgsIDAuODYwMjMsIDAuODEyNiwgMC45MTE3MiwgMC45NjUxOCwgMC45MTExNSwgMC44MzA4OSwgMC44ODU4LCAwLjg3NzkxLCAwLjc5NzYxLCAwLjg5Mjk3LCAwLjgxMzYzLCAwLjg4MTU3LCAwLjg5OTkyLCAwLjg1NjA4LCAwLjgxOTkyLCAwLjk0MzA3LCAwLjg2MDIzLCAwLjg4MTU3LCAwLjk1MzA4LCAwLjk4Njk5LCAwLjk5NzkzLCAxLjA2MjI2LCAwLjk1ODE3LCAwLjk1MzA4LCAwLjk3MzU4LCAwLjkyOCwgMC45ODA4OCwgMC45ODY5OSwgMC45Mjc2MSwgMC45OTc5MywgMC45NjAxNywgMS4wNjIyNiwgMC45ODYsIDAuOTQ0LCAwLjk1OTc4LCAwLjkzOCwgMC45NjcwNSwgMC45ODcxNCwgMC44MDQ0MiwgMC45ODk3MiwgMSwgMC44OTc2MiwgMS4wNDU1MiwgMC45NTgxNywgMC45OTAwNywgMC44NzA2NCwgMC45MTg3OSwgMC44ODg4OCwgMS4wNjIyNiwgMC45NTgxNywgMC45ODcxNCwgMC45NTgxNywgMC44ODg4OCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC44OTYzMywgMS4wMTkxNSwgMC44OTYzMywgMS4wMTkxNSwgMC44OTYzMywgMS4wMTkxNSwgMC44MTExLCAwLjk0MiwgMC45MjE5LCAxLCAwLjg5OTAzLCAxLCAxLCAxLCAwLjkzMTczLCAwLjkzMTczLCAwLjkzMTczLCAxLCAxLjA2MzA0LCAxLjA2MzA0LCAxLjA2OTA0LCAwLjg5OTAzLCAwLjg5OTAzLCAwLjgwNTQ5LCAxLCAxLjE1NiwgMSwgMSwgMC43NjU3NSwgMC43NjU3NSwgMSwgMSwgMC43MjQ1OCwgMSwgMSwgMSwgMSwgMC45MjI0MSwgMSwgMSwgMSwgMC42MTksIDEsIDEuMzYxNDUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDcyNTcsIDEsIDAuNzQ3MDUsIDAuNzExMTksIDEuMDIwNTgsIDEuMDI0LCAxLjAyMTE5LCAxLCAxLCAxLjE1MzYsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEuMDg1OTUsIDEuMDg1OTUsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDU2MzgsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpleHBvcnRzLk15cmlhZFByb1JlZ3VsYXJGYWN0b3JzID0gTXlyaWFkUHJvUmVndWxhckZhY3RvcnM7CmNvbnN0IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMiwKICBsaW5lR2FwOiAwLjIKfTsKZXhwb3J0cy5NeXJpYWRQcm9SZWd1bGFyTWV0cmljcyA9IE15cmlhZFByb1JlZ3VsYXJNZXRyaWNzOwoKLyoqKi8gfSksCi8qIDU2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuU2Vnb2V1aVJlZ3VsYXJNZXRyaWNzID0gZXhwb3J0cy5TZWdvZXVpUmVndWxhckZhY3RvcnMgPSBleHBvcnRzLlNlZ29ldWlJdGFsaWNNZXRyaWNzID0gZXhwb3J0cy5TZWdvZXVpSXRhbGljRmFjdG9ycyA9IGV4cG9ydHMuU2Vnb2V1aUJvbGRNZXRyaWNzID0gZXhwb3J0cy5TZWdvZXVpQm9sZEl0YWxpY01ldHJpY3MgPSBleHBvcnRzLlNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycyA9IGV4cG9ydHMuU2Vnb2V1aUJvbGRGYWN0b3JzID0gdm9pZCAwOwpjb25zdCBTZWdvZXVpQm9sZEZhY3RvcnMgPSBbMS43NjczOCwgMSwgMSwgMC45OTI5NywgMC45ODI0LCAxLjA0MDE2LCAxLjA2NDk3LCAxLjAzNDI0LCAwLjk3NTI5LCAxLjE3NjQ3LCAxLjIzMjAzLCAxLjEwODUsIDEuMTA4NSwgMS4xNjkzOSwgMS4yMTA3LCAwLjk3NTQsIDEuMjE0MDgsIDAuOTc1NCwgMS41OTU3OCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMC44MTM3OCwgMC44MTM3OCwgMS4yMTA3LCAxLjIxMDcsIDEuMjEwNywgMC43MTcwMywgMC45Nzg0NywgMC45NzM2MywgMC44ODc3NiwgMC44NjQxLCAxLjAyMDk2LCAwLjc5Nzk1LCAwLjg1MTMyLCAwLjkxNCwgMS4wNjA4NSwgMS4xNDA2LCAwLjgwMDcsIDAuODk4NTgsIDAuODM2OTMsIDEuMTQ4ODksIDEuMDkzOTgsIDAuOTc0ODksIDAuOTIwOTQsIDAuOTc0ODksIDAuOTAzOTksIDAuODQwNDEsIDAuOTU5MjMsIDEuMDAxMzUsIDEsIDEuMDY0NjcsIDAuOTgyNDMsIDAuOTA5OTYsIDAuOTkzNjEsIDEuMTA4NSwgMS41Njk0MiwgMS4xMDg1LCAxLjIxMDcsIDAuNzQ2MjcsIDAuOTQyODIsIDAuOTY3NTIsIDEuMDE1MTksIDAuODYzMDQsIDEuMDEzNTksIDAuOTcyNzgsIDEuMTUxMDMsIDEuMDEzNTksIDAuOTg1NjEsIDEuMDIyODUsIDEuMDIyODUsIDEuMDA1MjcsIDEuMDIyODUsIDEuMDMwMiwgMC45OTA0MSwgMS4wMDA4LCAxLjAxNTE5LCAxLjAxMzU5LCAxLjAyMjU4LCAwLjc5MTA0LCAxLjE2ODYyLCAwLjk5MDQxLCAwLjk3NDU0LCAxLjAyNTExLCAwLjk5Mjk4LCAwLjk2NzUyLCAwLjk1ODAxLCAwLjk0ODU2LCAxLjE2NTc5LCAwLjk0ODU2LCAxLjIxMDcsIDAuOTgyNCwgMS4wMzQyNCwgMS4wMzQyNCwgMSwgMS4wMzQyNCwgMS4xNjU3OSwgMC44NzI3LCAxLjM4NzEsIDEuMTg2MjIsIDEuMTA4MTgsIDEuMDQ0NzgsIDEuMjEwNywgMS4xODYyMiwgMC43NTE1NSwgMC45NDk5NCwgMS4yODgyNiwgMS4yMTQwOCwgMS4yMTQwOCwgMC45MTA1NiwgMSwgMC45MTU3MiwgMC45NzU0LCAwLjY0NjYzLCAxLjE4MzI4LCAxLjI0ODY2LCAxLjA0NDc4LCAxLjE0MTY5LCAxLjE1NzQ5LCAxLjE3Mzg5LCAwLjcxNzAzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjkzNTA2LCAwLjg2NDEsIDAuNzk3OTUsIDAuNzk3OTUsIDAuNzk3OTUsIDAuNzk3OTUsIDEuMTQwNiwgMS4xNDA2LCAxLjE0MDYsIDEuMTQwNiwgMS4wMjA5NiwgMS4wOTM5OCwgMC45NzQyNiwgMC45NzQyNiwgMC45NzQyNiwgMC45NzQyNiwgMC45NzQyNiwgMS4yMTA3LCAwLjk3NDg5LCAxLjAwMTM1LCAxLjAwMTM1LCAxLjAwMTM1LCAxLjAwMTM1LCAwLjkwOTk2LCAwLjkyMDk0LCAxLjAyNzk4LCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjk2NzUyLCAwLjkzMTM2LCAwLjg2MzA0LCAwLjk3Mjc4LCAwLjk3Mjc4LCAwLjk3Mjc4LCAwLjk3Mjc4LCAxLjAyMjg1LCAxLjAyMjg1LCAxLjAyMjg1LCAxLjAyMjg1LCAwLjk3MTIyLCAwLjk5MDQxLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODI2LCAxLjAwMDgsIDAuOTkwNDEsIDAuOTkwNDEsIDAuOTkwNDEsIDAuOTkwNDEsIDAuOTY3NTIsIDEuMDE1MTksIDAuOTY3NTIsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTczNjMsIDAuOTY3NTIsIDAuOTczNjMsIDAuOTY3NTIsIDAuODY0MSwgMC44NjMwNCwgMC44NjQxLCAwLjg2MzA0LCAwLjg2NDEsIDAuODYzMDQsIDAuODY0MSwgMC44NjMwNCwgMS4wMjA5NiwgMS4wMzA1NywgMS4wMjA5NiwgMS4wMzUxNywgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC43OTc5NSwgMC45NzI3OCwgMC45MTQsIDEuMDEzNTksIDAuOTE0LCAxLjAxMzU5LCAwLjkxNCwgMS4wMTM1OSwgMSwgMSwgMS4wNjA4NSwgMC45ODU2MSwgMS4wNjA4NSwgMS4wMDg3OSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDEuMTQwNiwgMS4wMjI4NSwgMS4xNDA2LCAxLjAyMjg1LCAxLjE0MDYsIDEuMDIyODUsIDAuOTcxMzgsIDEuMDg2OTIsIDAuODAwNywgMS4wMjI4NSwgMSwgMSwgMS4wMDUyNywgMC44MzY5MywgMS4wMjI4NSwgMSwgMSwgMC44MzY5MywgMC45NDU1LCAwLjgzNjkzLCAwLjkwNDE4LCAwLjgzNjkzLCAxLjEzMDA1LCAxLjA5Mzk4LCAwLjk5MDQxLCAxLCAxLCAxLjA5Mzk4LCAwLjk5MDQxLCAwLjk2NjkyLCAxLjA5MjUxLCAwLjk5MDQxLCAwLjk3NDg5LCAxLjAwMDgsIDAuOTc0ODksIDEuMDAwOCwgMC45NzQ4OSwgMS4wMDA4LCAwLjkzOTk0LCAwLjk3OTMxLCAwLjkwMzk5LCAxLjAyMjU4LCAxLCAxLCAwLjkwMzk5LCAxLjAyMjU4LCAwLjg0MDQxLCAwLjc5MTA0LCAwLjg0MDQxLCAwLjc5MTA0LCAwLjg0MDQxLCAwLjc5MTA0LCAwLjg0MDQxLCAwLjc5MTA0LCAxLCAxLCAwLjk1OTIzLCAxLjA3MDM0LCAwLjk1OTIzLCAxLjE2ODYyLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjAwMTM1LCAwLjk5MDQxLCAxLjA2NDY3LCAxLjAyNTExLCAwLjkwOTk2LCAwLjk2NzUyLCAwLjkwOTk2LCAwLjk5MzYxLCAwLjk1ODAxLCAwLjk5MzYxLCAwLjk1ODAxLCAwLjk5MzYxLCAwLjk1ODAxLCAxLjA3NzMzLCAxLjAzNDI0LCAwLjk3MzYzLCAwLjk2NzUyLCAwLjkzNTA2LCAwLjkzMTM2LCAwLjk3NDg5LCAxLjAwMDgsIDEsIDEsIDAuOTU5MjMsIDEuMTY4NjIsIDEuMTUxMDMsIDEuMTUxMDMsIDEuMDExNzMsIDEuMDM5NTksIDAuNzU5NTMsIDAuODEzNzgsIDAuNzk5MTIsIDEuMTUxMDMsIDEuMjE5OTQsIDAuOTUxNjEsIDAuODc4MTUsIDEuMDExNDksIDAuODE1MjUsIDAuNzY3NiwgMC45ODE2NywgMS4wMTEzNCwgMS4wMjU0NiwgMC44NDA5NywgMS4wMzA4OSwgMS4xODEwMiwgMC45NzM2MywgMC44ODc3NiwgMC44NTEzNCwgMC45NzgyNiwgMC43OTc5NSwgMC45OTM2MSwgMS4wNjA4NSwgMC45NzQ4OSwgMS4xNDA2LCAwLjg5ODU4LCAxLjAzODgsIDEuMTQ4ODksIDEuMDkzOTgsIDAuODYwMzksIDAuOTc0ODksIDEuMDU5NSwgMC45MjA5NCwgMC45NDc5MywgMC45NTkyMywgMC45MDk5NiwgMC45OTM0NiwgMC45ODI0MywgMS4wMjExMiwgMC45NTQ5MywgMS4xNDA2LCAwLjkwOTk2LCAxLjAzNTc0LCAxLjAyNTk3LCAxLjAwMDgsIDEuMTgxMDIsIDEuMDY2MjgsIDEuMDM1NzQsIDEuMDE5MiwgMS4wMTkzMiwgMS4wMDg4NiwgMC45NzUzMSwgMS4wMTA2LCAxLjAwMDgsIDEuMTMxODksIDEuMTgxMDIsIDEuMDIyNzcsIDAuOTg2ODMsIDEuMDAxNiwgMC45OTU2MSwgMS4wNzIzNywgMS4wMDA4LCAwLjkwNDM0LCAwLjk5OTIxLCAwLjkzODAzLCAwLjg5NjUsIDEuMjMwODUsIDEuMDY2MjgsIDEuMDQ5ODMsIDAuOTYyNjgsIDEuMDQ5OSwgMC45ODQzOSwgMS4xODEwMiwgMS4wNjYyOCwgMS4wMDA4LCAxLjA2NjI4LCAwLjk4NDM5LCAwLjc5Nzk1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA5NDY2LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk3Mjc4LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjAyMDY1LCAxLCAxLCAxLCAxLCAxLCAxLCAxLjA2NDY3LCAxLjAyNTExLCAxLjA2NDY3LCAxLjAyNTExLCAxLjA2NDY3LCAxLjAyNTExLCAwLjkwOTk2LCAwLjk2NzUyLCAxLCAxLjIxNDA4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAxLjA0Mzk0LCAxLjA0Mzk0LCAxLjA0Mzk0LCAxLjA0Mzk0LCAwLjk4NjMzLCAwLjk4NjMzLCAwLjk4NjMzLCAwLjczMDQ3LCAwLjczMDQ3LCAxLjIwNjQyLCAwLjkxMjExLCAxLjI1NjM1LCAxLjIyMiwgMS4wMjk1NiwgMS4wMzM3MiwgMS4wMzM3MiwgMC45NjAzOSwgMS4yNDYzMywgMSwgMS4xMjQ1NCwgMC45MzUwMywgMS4wMzQyNCwgMS4xOTY4NywgMS4wMzQyNCwgMSwgMSwgMSwgMC43NzEsIDEsIDEsIDEuMTU3NDksIDEuMTU3NDksIDEuMTU3NDksIDEuMTA5NDgsIDAuODYyNzksIDAuOTQ0MzQsIDAuODYyNzksIDAuOTQ0MzQsIDAuODYxODIsIDEsIDEsIDEuMTY4OTcsIDEsIDAuOTYwODUsIDAuOTAxMzcsIDEuMjEwNywgMS4xODQxNiwgMS4xMzk3MywgMC42OTgyNSwgMC45NzE2LCAyLjEwMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLjIxMTcyLCAxLjI5MDA0LCAxLjI5MDA0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4ODc0LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMDkxOTMsIDEuMDkxOTMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpleHBvcnRzLlNlZ29ldWlCb2xkRmFjdG9ycyA9IFNlZ29ldWlCb2xkRmFjdG9yczsKY29uc3QgU2Vnb2V1aUJvbGRNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzMwMDgsCiAgbGluZUdhcDogMAp9OwpleHBvcnRzLlNlZ29ldWlCb2xkTWV0cmljcyA9IFNlZ29ldWlCb2xkTWV0cmljczsKY29uc3QgU2Vnb2V1aUJvbGRJdGFsaWNGYWN0b3JzID0gWzEuNzY3MzgsIDEsIDEsIDAuOTg5NDYsIDEuMDM5NTksIDEuMDQwMTYsIDEuMDI4MDksIDEuMDM2LCAwLjk3NjM5LCAxLjEwOTUzLCAxLjIzMjAzLCAxLjExMTQ0LCAxLjExMTQ0LCAxLjE2OTM5LCAxLjIxMjM3LCAwLjk3NTQsIDEuMjEyNjEsIDAuOTc1NCwgMS41OTc1NCwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDEuMDM2LCAxLjAzNiwgMS4wMzYsIDAuODEzNzgsIDAuODEzNzgsIDEuMjEyMzcsIDEuMjEyMzcsIDEuMjEyMzcsIDAuNzM1NDEsIDAuOTc4NDcsIDAuOTczNjMsIDAuODk3MjMsIDAuODc4OTcsIDEuMDQyNiwgMC43OTQyOSwgMC44NTI5MiwgMC45MTE0OSwgMS4wNTgxNSwgMS4xNDA2LCAwLjc5NjMxLCAwLjkwMTI4LCAwLjgzODUzLCAxLjA0Mzk2LCAxLjEwNjE1LCAwLjk3NTUyLCAwLjk0NDM2LCAwLjk3NTUyLCAwLjg4NjQxLCAwLjgwNTI3LCAwLjk2MDgzLCAxLjAwMTM1LCAxLCAxLjA2Nzc3LCAwLjk4MTcsIDAuOTExNDIsIDAuOTkzNjEsIDEuMTExNDQsIDEuNTcyOTMsIDEuMTExNDQsIDEuMjEyMzcsIDAuNzQ2MjcsIDEuMzE4MTgsIDEuMDY1ODUsIDAuOTcwNDIsIDAuODMwNTUsIDAuOTcwNDIsIDAuOTM1MDMsIDEuMTI2MSwgMC45NzA0MiwgMC45NzkyMiwgMS4xNDIzNiwgMC45NDU1MiwgMS4wMTA1NCwgMS4xNDIzNiwgMS4wMjQ3MSwgMC45NzkyMiwgMC45NDE2NSwgMC45NzA0MiwgMC45NzA0MiwgMS4wMjc2LCAwLjc4OTI5LCAxLjEyNjEsIDAuOTc5MjIsIDAuOTU4NzQsIDEuMDIxOTcsIDAuOTg1MDcsIDAuOTY3NTIsIDAuOTcxNjgsIDAuOTUxMDcsIDEuMTY1NzksIDAuOTUxMDcsIDEuMjEyMzcsIDEuMDM5NTksIDEuMDM2LCAxLjAzNiwgMSwgMS4wMzYsIDEuMTY1NzksIDAuODczNTcsIDEuMzE4MTgsIDEuMTg3NTQsIDEuMjY3ODEsIDEuMDUzNTYsIDEuMjEyMzcsIDEuMTg2MjIsIDAuNzk0ODcsIDAuOTQ5OTQsIDEuMjkwMDQsIDEuMjQwNDcsIDEuMjQwNDcsIDEuMzE4MTgsIDEsIDAuOTE0ODQsIDAuOTc1NCwgMS4zMTgxOCwgMS4xMzQ5LCAxLjI0ODY2LCAxLjA1MzU2LCAxLjEzOTM0LCAxLjE1NTc0LCAxLjE3Mzg5LCAwLjczNTQxLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk3MzYzLCAwLjk0Mzg1LCAwLjg3ODk3LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAwLjc5NDI5LCAxLjE0MDYsIDEuMTQwNiwgMS4xNDA2LCAxLjE0MDYsIDEuMDQyNiwgMS4xMDYxNSwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMC45NzU1MiwgMS4yMTIzNywgMC45NzU1MiwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMS4wMDEzNSwgMC45MTE0MiwgMC45NDQzNiwgMC45ODcyMSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMS4wNjU4NSwgMC45NjcwNSwgMC44MzA1NSwgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMC45MzUwMywgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMS4xNDIzNiwgMC45MzEyNSwgMC45NzkyMiwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMC45NDE2NSwgMS4yOTAwNCwgMC45NDE2NSwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45NzkyMiwgMC45Njc1MiwgMC45NzA0MiwgMC45Njc1MiwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC45NzM2MywgMS4wNjU4NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMC44Nzg5NywgMC44MzA1NSwgMS4wNDI2LCAxLjAwMzMsIDEuMDQyNiwgMC45NzA0MiwgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC43OTQyOSwgMC45MzUwMywgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMC45MTE0OSwgMC45NzA0MiwgMSwgMSwgMS4wNTgxNSwgMC45NzkyMiwgMS4wNTgxNSwgMC45NzkyMiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDEuMTQwNiwgMS4xNDIzNiwgMS4xNDA2LCAxLjE0MjM2LCAxLjE0MDYsIDEuMTQyMzYsIDAuOTc0NDEsIDEuMDQzMDIsIDAuNzk2MzEsIDEuMDE1ODIsIDEsIDEsIDEuMDEwNTQsIDAuODM4NTMsIDEuMTQyMzYsIDEsIDEsIDAuODM4NTMsIDEuMDkxMjUsIDAuODM4NTMsIDAuOTA0MTgsIDAuODM4NTMsIDEuMTk1MDgsIDEuMTA2MTUsIDAuOTc5MjIsIDEsIDEsIDEuMTA2MTUsIDAuOTc5MjIsIDEuMDEwMzQsIDEuMTA0NjYsIDAuOTc5MjIsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTc1NTIsIDAuOTQxNjUsIDAuOTE2MDIsIDAuOTE5ODEsIDAuODg2NDEsIDEuMDI3NiwgMSwgMSwgMC44ODY0MSwgMS4wMjc2LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAwLjgwNTI3LCAwLjc4OTI5LCAxLCAxLCAwLjk2MDgzLCAxLjA1NDAzLCAwLjk1OTIzLCAxLjE2ODYyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjAwMTM1LCAwLjk3OTIyLCAxLjA2Nzc3LCAxLjAyMTk3LCAwLjkxMTQyLCAwLjk2NzUyLCAwLjkxMTQyLCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAwLjk5MzYxLCAwLjk3MTY4LCAxLjIzMTk5LCAxLjAzNiwgMC45NzM2MywgMS4wNjU4NSwgMC45NDM4NSwgMC45NjcwNSwgMC45NzU1MiwgMC45NDE2NSwgMSwgMSwgMC45NjA4MywgMS4xMjYxLCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAxLjMxODE4LCAwLjk1MTYxLCAxLjI3MTI2LCAxLjAwODExLCAwLjgzMjg0LCAwLjc3NzAyLCAwLjk5MTM3LCAwLjk1MjUzLCAxLjAzNDcsIDAuODYxNDIsIDEuMDcyMDUsIDEuMTQyMzYsIDAuOTczNjMsIDAuODk3MjMsIDAuODY4NjksIDEuMDk4MTgsIDAuNzk0MjksIDAuOTkzNjEsIDEuMDU4MTUsIDAuOTc1NTIsIDEuMTQwNiwgMC45MDEyOCwgMS4wNjY2MiwgMS4wNDM5NiwgMS4xMDYxNSwgMC44NDkxOCwgMC45NzU1MiwgMS4wNDY5NCwgMC45NDQzNiwgMC45ODAxNSwgMC45NjA4MywgMC45MTE0MiwgMS4wMDM1NiwgMC45ODE3LCAxLjAxOTQ1LCAwLjk4OTk5LCAxLjE0MDYsIDAuOTExNDIsIDEuMDQ5NjEsIDAuOTg5OCwgMS4wMDYzOSwgMS4xNDIzNiwgMS4wNzUxNCwgMS4wNDk2MSwgMC45OTYwNywgMS4wMjg5NywgMS4wMDgsIDAuOTg5OCwgMC45NTEzNCwgMS4wMDYzOSwgMS4xMTEyMSwgMS4xNDIzNiwgMS4wMDUxOCwgMC45Nzk4MSwgMS4wMjE4NiwgMSwgMS4wODU3OCwgMC45NDE2NSwgMC45OTMxNCwgMC45ODM4NywgMC45MzAyOCwgMC45MzM3NywgMS4zNTEyNSwgMS4wNzUxNCwgMS4xMDY4NywgMC45MzQ5MSwgMS4wNDIzMiwgMS4wMDM1MSwgMS4xNDIzNiwgMS4wNzUxNCwgMC45NDE2NSwgMS4wNzUxNCwgMS4wMDM1MSwgMC43OTQyOSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wOTA5NywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45MzUwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45NjYwOSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMS4wNjc3NywgMS4wMjE5NywgMC45MTE0MiwgMC45Njc1MiwgMSwgMS4yMTI2MSwgMC44OTkwMywgMSwgMSwgMC43NTE1NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDc0NSwgMS4wNDM5NCwgMC45ODYzMywgMC45ODYzMywgMC45ODYzMywgMC43Mjk1OSwgMC43Mjk1OSwgMS4yMDUwMiwgMC45MTQwNiwgMS4yNjUxNCwgMS4yMjIsIDEuMDI5NTYsIDEuMDMzNzIsIDEuMDMzNzIsIDAuOTYwMzksIDEuMjQ2MzMsIDEsIDEuMDkxMjUsIDAuOTMzMjcsIDEuMDMzMzYsIDEuMTY1NDEsIDEuMDM2LCAxLCAxLCAxLCAwLjc3MSwgMSwgMSwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMS4xNTU3NCwgMC44NjM2NCwgMC45NDQzNCwgMC44NjI3OSwgMC45NDQzNCwgMC44NjIyNCwgMSwgMSwgMS4xNjc5OCwgMSwgMC45NjA4NSwgMC45MDA2OCwgMS4yMTIzNywgMS4xODQxNiwgMS4xMzkwNCwgMC42OTgyNSwgMC45NzE2LCAyLjEwMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLjIxMzM5LCAxLjI5MDA0LCAxLjI5MDA0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE4Nzc1LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMTMyNjksIDEuMTMyNjksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpleHBvcnRzLlNlZ29ldWlCb2xkSXRhbGljRmFjdG9ycyA9IFNlZ29ldWlCb2xkSXRhbGljRmFjdG9yczsKY29uc3QgU2Vnb2V1aUJvbGRJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzMwMDgsCiAgbGluZUdhcDogMAp9OwpleHBvcnRzLlNlZ29ldWlCb2xkSXRhbGljTWV0cmljcyA9IFNlZ29ldWlCb2xkSXRhbGljTWV0cmljczsKY29uc3QgU2Vnb2V1aUl0YWxpY0ZhY3RvcnMgPSBbMS43NjczOCwgMSwgMSwgMC45ODk0NiwgMS4xNDc2MywgMS4wNTM2NSwgMS4wNjIzNCwgMC45NjkyNywgMC45MjU4NiwgMS4xNTM3MywgMS4xODQxNCwgMC45MTM0OSwgMC45MTM0OSwgMS4wNzQwMywgMS4xNzMwOCwgMC43ODM4MywgMS4yMDA4OCwgMC43ODM4MywgMS40MjUzMSwgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC43ODM4MywgMC43ODM4MywgMS4xNzMwOCwgMS4xNzMwOCwgMS4xNzMwOCwgMC43NzM0OSwgMC45NDU2NSwgMC45NDcyOSwgMC44NTk0NCwgMC44ODUwNiwgMC45ODU4LCAwLjc0ODE3LCAwLjgwMDE2LCAwLjg4NDQ5LCAwLjk4MDM5LCAwLjk1NzgyLCAwLjY5MjM4LCAwLjg5ODk4LCAwLjgzMjMxLCAwLjk4MTgzLCAxLjAzOTg5LCAwLjk2OTI0LCAwLjg2MjM3LCAwLjk2OTI0LCAwLjgwNTk1LCAwLjc0NTI0LCAwLjg2MDkxLCAwLjk1NDAyLCAwLjk0MTQzLCAwLjk4NDQ4LCAwLjg4NTgsIDAuODMwODksIDAuOTMyODUsIDEuMDk0OSwgMS4zOTAxNiwgMS4wOTQ5LCAxLjQ1OTk0LCAwLjc0NjI3LCAxLjA0ODM5LCAwLjk3NDU0LCAwLjk3NDU0LCAwLjg3MjA3LCAwLjk3NDU0LCAwLjg3NTMzLCAxLjA2MTUxLCAwLjk3NDU0LCAxLjAwMTc2LCAxLjE2NDg0LCAxLjA4MTMyLCAwLjk4MDQ3LCAxLjE2NDg0LCAxLjAyOTg5LCAxLjAxMDU0LCAwLjk2MjI1LCAwLjk3NDU0LCAwLjk3NDU0LCAxLjA2NTk4LCAwLjc5MDA0LCAxLjE2MzQ0LCAxLjAwMzUxLCAwLjk0NjI5LCAwLjk5NzMsIDAuOTEwMTYsIDAuOTY3NzcsIDAuOTA0MywgMC45MTA4MiwgMC45MjQ4MSwgMC45MTA4MiwgMS4xNzMwOCwgMC45NTc0OCwgMC45NjkyNywgMC45NjkyNywgMSwgMC45NjkyNywgMC45MjQ4MSwgMC44MDU5NywgMS4wNDgzOSwgMS4yMzM5MywgMS4xNzgxLCAwLjkyNDUsIDEuMTczMDgsIDEuMjA4MDgsIDAuNjMyMTgsIDAuOTQyNjEsIDEuMjQ4MjIsIDEuMDk5NzEsIDEuMDk5NzEsIDEuMDQ4MzksIDEsIDAuODUyNzMsIDAuNzgwMzIsIDEuMDQ4MzksIDEuMDk5NzEsIDEuMjIzMjYsIDAuOTI0NSwgMS4wOTgzNiwgMS4xMzUyNSwgMS4xNTIyMiwgMC43MDQyNCwgMC45NDcyOSwgMC45NDcyOSwgMC45NDcyOSwgMC45NDcyOSwgMC45NDcyOSwgMC45NDcyOSwgMC44NTQ5OCwgMC44ODUwNiwgMC43NDgxNywgMC43NDgxNywgMC43NDgxNywgMC43NDgxNywgMC45NTc4MiwgMC45NTc4MiwgMC45NTc4MiwgMC45NTc4MiwgMC45ODU4LCAxLjAzOTg5LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAxLjE3MzA4LCAwLjk2OTI0LCAwLjk1NDAyLCAwLjk1NDAyLCAwLjk1NDAyLCAwLjk1NDAyLCAwLjgzMDg5LCAwLjg2MjM3LCAwLjg4NDA5LCAwLjk3NDU0LCAwLjk3NDU0LCAwLjk3NDU0LCAwLjk3NDU0LCAwLjk3NDU0LCAwLjk3NDU0LCAwLjkyOTE2LCAwLjg3MjA3LCAwLjg3NTMzLCAwLjg3NTMzLCAwLjg3NTMzLCAwLjg3NTMzLCAwLjkzMTQ2LCAwLjkzMTQ2LCAwLjkzMTQ2LCAwLjkzMTQ2LCAwLjkzODU0LCAxLjAxMDU0LCAwLjk2MjI1LCAwLjk2MjI1LCAwLjk2MjI1LCAwLjk2MjI1LCAwLjk2MjI1LCAxLjI0ODIyLCAwLjg3NjEsIDEuMDAzNTEsIDEuMDAzNTEsIDEuMDAzNTEsIDEuMDAzNTEsIDAuOTY3NzcsIDAuOTc0NTQsIDAuOTY3NzcsIDAuOTQ3MjksIDAuOTc0NTQsIDAuOTQ3MjksIDAuOTc0NTQsIDAuOTQ3MjksIDAuOTc0NTQsIDAuODg1MDYsIDAuODcyMDcsIDAuODg1MDYsIDAuODcyMDcsIDAuODg1MDYsIDAuODcyMDcsIDAuODg1MDYsIDAuODcyMDcsIDAuOTg1OCwgMC45NTM5MSwgMC45ODU4LCAwLjk3NDU0LCAwLjc0ODE3LCAwLjg3NTMzLCAwLjc0ODE3LCAwLjg3NTMzLCAwLjc0ODE3LCAwLjg3NTMzLCAwLjc0ODE3LCAwLjg3NTMzLCAwLjc0ODE3LCAwLjg3NTMzLCAwLjg4NDQ5LCAwLjk3NDU0LCAwLjg4NDQ5LCAwLjk3NDU0LCAwLjg4NDQ5LCAwLjk3NDU0LCAxLCAxLCAwLjk4MDM5LCAxLjAwMTc2LCAwLjk4MDM5LCAxLjAwMTc2LCAwLjk1NzgyLCAwLjkzMTQ2LCAwLjk1NzgyLCAwLjkzMTQ2LCAwLjk1NzgyLCAwLjkzMTQ2LCAwLjk1NzgyLCAxLjE2NDg0LCAwLjk1NzgyLCAwLjkzMTQ2LCAwLjg0NDIxLCAxLjEyNzYxLCAwLjY5MjM4LCAxLjA4MTMyLCAxLCAxLCAwLjk4MDQ3LCAwLjgzMjMxLCAxLjE2NDg0LCAxLCAxLCAwLjg0NzIzLCAxLjA0ODYxLCAwLjg0NzIzLCAwLjc4NzU1LCAwLjgzMjMxLCAxLjIzNzM2LCAxLjAzOTg5LCAxLjAxMDU0LCAxLCAxLCAxLjAzOTg5LCAxLjAxMDU0LCAwLjk4NTcsIDEuMDM4NDksIDEuMDEwNTQsIDAuOTY5MjQsIDAuOTYyMjUsIDAuOTY5MjQsIDAuOTYyMjUsIDAuOTY5MjQsIDAuOTYyMjUsIDAuOTIzODMsIDAuOTAxNzEsIDAuODA1OTUsIDEuMDY1OTgsIDEsIDEsIDAuODA1OTUsIDEuMDY1OTgsIDAuNzQ1MjQsIDAuNzkwMDQsIDAuNzQ1MjQsIDAuNzkwMDQsIDAuNzQ1MjQsIDAuNzkwMDQsIDAuNzQ1MjQsIDAuNzkwMDQsIDEsIDEsIDAuODYwOTEsIDEuMDI3NTksIDAuODU3NzEsIDEuMTYzNDQsIDAuOTU0MDIsIDEuMDAzNTEsIDAuOTU0MDIsIDEuMDAzNTEsIDAuOTU0MDIsIDEuMDAzNTEsIDAuOTU0MDIsIDEuMDAzNTEsIDAuOTU0MDIsIDEuMDAzNTEsIDAuOTU0MDIsIDEuMDAzNTEsIDAuOTg0NDgsIDAuOTk3MywgMC44MzA4OSwgMC45Njc3NywgMC44MzA4OSwgMC45MzI4NSwgMC45MDQzLCAwLjkzMjg1LCAwLjkwNDMsIDAuOTMyODUsIDAuOTA0MywgMS4zMTg2OCwgMC45NjkyNywgMC45NDcyOSwgMC45NzQ1NCwgMC44NTQ5OCwgMC45MjkxNiwgMC45NjkyNCwgMC44NzYxLCAxLCAxLCAwLjg2MDkxLCAxLjE2MzQ0LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAxLjA0ODM5LCAwLjgxOTY1LCAwLjgxOTY1LCAwLjk0NzI5LCAwLjc4MDMyLCAwLjcxMDIyLCAwLjkwODgzLCAwLjg0MTcxLCAwLjk5ODc3LCAwLjc3NTk2LCAxLjA1NzM0LCAxLjIsIDAuOTQ3MjksIDAuODU5NDQsIDAuODI3OTEsIDAuOTYwNywgMC43NDgxNywgMC45MzI4NSwgMC45ODAzOSwgMC45NjkyNCwgMC45NTc4MiwgMC44OTg5OCwgMC45ODMxNiwgMC45ODE4MywgMS4wMzk4OSwgMC43ODYxNCwgMC45NjkyNCwgMC45NzY0MiwgMC44NjIzNywgMC44NjA3NSwgMC44NjA5MSwgMC44MzA4OSwgMC45MDA4MiwgMC44ODU4LCAwLjk3Mjk2LCAxLjAxMjg0LCAwLjk1NzgyLCAwLjgzMDg5LCAxLjA5NzYsIDEuMDQsIDEuMDMzNDIsIDEuMiwgMS4wNjc1LCAxLjA5NzYsIDAuOTgyMDUsIDEuMDM4MDksIDEuMDUwOTcsIDEuMDQsIDAuOTUzNjQsIDEuMDMzNDIsIDEuMDU0MDEsIDEuMiwgMS4wMjE0OCwgMS4wMTE5LCAxLjA0NzI0LCAxLjAxMjcsIDEuMDI3MzIsIDAuOTYyMjUsIDAuODk2NSwgMC45Nzc4MywgMC45MzU3NCwgMC45NDgxOCwgMS4zMDY3OSwgMS4wNjc1LCAxLjExODI2LCAwLjk5ODIxLCAxLjA1NTcsIDEuMDMyNiwgMS4yLCAxLjA2NzUsIDAuOTYyMjUsIDEuMDY3NSwgMS4wMzI2LCAwLjc0ODE3LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjAzNzU0LCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjg3NTMzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk4NzA1LCAxLCAxLCAxLCAxLCAxLCAxLCAwLjk4NDQ4LCAwLjk5NzMsIDAuOTg0NDgsIDAuOTk3MywgMC45ODQ0OCwgMC45OTczLCAwLjgzMDg5LCAwLjk2Nzc3LCAxLCAxLjIwMDg4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAwLjk0OTQ1LCAwLjk0OTQ1LCAwLjk0OTQ1LCAwLjk0OTQ1LCAxLjEyMzE3LCAxLjEyMzE3LCAxLjEyMzE3LCAwLjY3NjAzLCAwLjY3NjAzLCAxLjE1NjIxLCAwLjczNTg0LCAxLjIxMTkxLCAxLjIyMTM1LCAxLjA2NDgzLCAwLjk0ODY4LCAwLjk0ODY4LCAwLjk1OTk2LCAxLjI0NjMzLCAxLCAxLjA3NDk3LCAwLjg3NzA5LCAwLjk2OTI3LCAxLjAxNDczLCAwLjk2OTI3LCAxLCAxLCAxLCAwLjc3Mjk1LCAxLCAxLCAxLjA5ODM2LCAxLjA5ODM2LCAxLjA5ODM2LCAxLjAxNTIyLCAwLjg2MzIxLCAwLjk0NDM0LCAwLjg2NDksIDAuOTQ0MzQsIDAuODYxODIsIDEsIDEsIDEuMDgzLCAxLCAwLjkxNTc4LCAwLjg2NDM4LCAxLjE3MzA4LCAxLjE4NDE2LCAxLjE0NTg5LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjk2NzkxLCAxLjI0ODIyLCAxLjI0ODIyLCAxLjE3MzA4LCAxLjI0ODIyLCAxLjI0ODIyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLjQyNjAzLCAxLCAwLjk5ODYyLCAwLjk5ODYyLCAxLCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAwLjg3MDI1LCAxLjE3OTg0LCAxLjQyNjAzLCAxLCAxLjQyNjAzLCAxLjQyNjAzLCAwLjk5ODYyLCAxLCAxLCAxLCAxLCAxLCAxLjI4ODYsIDEuMDQzMTUsIDEuMTUyOTYsIDEuMzQxNjMsIDEsIDEsIDEsIDEuMTA3NDIsIDEuMTA3NDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdOwpleHBvcnRzLlNlZ29ldWlJdGFsaWNGYWN0b3JzID0gU2Vnb2V1aUl0YWxpY0ZhY3RvcnM7CmNvbnN0IFNlZ29ldWlJdGFsaWNNZXRyaWNzID0gewogIGxpbmVIZWlnaHQ6IDEuMzMwMDgsCiAgbGluZUdhcDogMAp9OwpleHBvcnRzLlNlZ29ldWlJdGFsaWNNZXRyaWNzID0gU2Vnb2V1aUl0YWxpY01ldHJpY3M7CmNvbnN0IFNlZ29ldWlSZWd1bGFyRmFjdG9ycyA9IFsxLjc2NzM4LCAxLCAxLCAwLjk4NTk0LCAxLjAyMjg1LCAxLjEwNDU0LCAxLjA2MjM0LCAwLjk2OTI3LCAwLjkyMDM3LCAxLjE5OTg1LCAxLjIwNDYsIDAuOTA2MTYsIDAuOTA2MTYsIDEuMDcxNTIsIDEuMTcxNCwgMC43ODAzMiwgMS4yMDA4OCwgMC43ODAzMiwgMS40MDI0NiwgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC45NjkyNywgMC43ODAzMiwgMC43ODAzMiwgMS4xNzE0LCAxLjE3MTQsIDEuMTcxNCwgMC44MDU5NywgMC45NDA4NCwgMC45NjcwNiwgMC44NTk0NCwgMC44NTczNCwgMC45NzA5MywgMC43NTg0MiwgMC43OTkzNiwgMC44ODE5OCwgMC45ODMxLCAwLjk1NzgyLCAwLjcxMzg3LCAwLjg2OTY5LCAwLjg0NjM2LCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjk2OTI0LCAwLjgzOTY4LCAwLjk2OTI0LCAwLjgyODI2LCAwLjc5NjQ5LCAwLjg1NzcxLCAwLjk1MTMyLCAwLjkzMTE5LCAwLjk4OTY1LCAwLjg4NDMzLCAwLjgyODcsIDAuOTMzNjUsIDEuMDg2MTIsIDEuMzYzOCwgMS4wODYxMiwgMS40NTc4NiwgMC43NDYyNywgMC44MDQ5OSwgMC45MTQ4NCwgMS4wNTcwNywgMC45MjM4MywgMS4wNTg4MiwgMC45NDAzLCAxLjEyNjU0LCAxLjA1ODgyLCAxLjAxNzU2LCAxLjA5MDExLCAxLjA5MDExLCAwLjk5NDE0LCAxLjA5MDExLCAxLjAzNCwgMS4wMTc1NiwgMS4wNTM1NiwgMS4wNTcwNywgMS4wNTg4MiwgMS4wNDM5OSwgMC44NDg2MywgMS4yMTk2OCwgMS4wMTc1NiwgMC45NTgwMSwgMS4wMDA2OCwgMC45MTc5NywgMC45Njc3NywgMC45MDQzLCAwLjkwMzUxLCAwLjkyMTA1LCAwLjkwMzUxLCAxLjE3MTQsIDAuODUzMzcsIDAuOTY5MjcsIDAuOTY5MjcsIDAuOTk5MTIsIDAuOTY5MjcsIDAuOTIxMDUsIDAuODA1OTcsIDEuMjQzNCwgMS4yMDgwOCwgMS4wNTkzNywgMC45MDk1NywgMS4xNzE0LCAxLjIwODA4LCAwLjc1MTU1LCAwLjk0MjYxLCAxLjI0NjQ0LCAxLjA5OTcxLCAxLjA5OTcxLCAwLjg0NzUxLCAxLCAwLjg1MjczLCAwLjc4MDMyLCAwLjYxNTg0LCAxLjA1NDI1LCAxLjE3OTE0LCAwLjkwOTU3LCAxLjA4NjY1LCAxLjExNTkzLCAxLjE0MTY5LCAwLjczMzgxLCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjk2NzA2LCAwLjg2MDM1LCAwLjg1NzM0LCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjc1ODQyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk1NzgyLCAwLjk3MDkzLCAxLjAzNTg0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAwLjk2OTI0LCAxLjE3MTQsIDAuOTY5MjQsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuOTUxMzIsIDAuODI4NywgMC44Mzk2OCwgMC44OTA0OSwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MTQ4NCwgMC45MzU3NSwgMC45MjM4MywgMC45NDAzLCAwLjk0MDMsIDAuOTQwMywgMC45NDAzLCAwLjg3MTcsIDAuODcxNywgMC44NzE3LCAwLjg3MTcsIDEuMDA1MjcsIDEuMDE3NTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMDUzNTYsIDEuMjQ2NDQsIDAuOTU5MjMsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDEuMDE3NTYsIDAuOTY3NzcsIDEuMDU3MDcsIDAuOTY3NzcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuODU3MzQsIDAuOTIzODMsIDAuOTcwOTMsIDEuMDk2OSwgMC45NzA5MywgMS4wNTg4MiwgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuNzU4NDIsIDAuOTQwMywgMC43NTg0MiwgMC45NDAzLCAwLjc1ODQyLCAwLjk0MDMsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDAuODgxOTgsIDEuMDU4ODIsIDEsIDEsIDAuOTgzMSwgMS4wMTc1NiwgMC45ODMxLCAxLjAxNzU2LCAwLjk1NzgyLCAwLjg3MTcsIDAuOTU3ODIsIDAuODcxNywgMC45NTc4MiwgMC44NzE3LCAwLjk1NzgyLCAxLjA5MDExLCAwLjk1NzgyLCAwLjg3MTcsIDAuODQ3ODQsIDEuMTE1NTEsIDAuNzEzODcsIDEuMDkwMTEsIDEsIDEsIDAuOTk0MTQsIDAuODQ2MzYsIDEuMDkwMTEsIDEsIDEsIDAuODQ2MzYsIDEuMDUzNiwgMC44NDYzNiwgMC45NDI5OCwgMC44NDYzNiwgMS4yMzI5NywgMS4wMzU4NCwgMS4wMTc1NiwgMSwgMSwgMS4wMzU4NCwgMS4wMTc1NiwgMS4wMDMyMywgMS4wMzQ0NCwgMS4wMTc1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45NjkyNCwgMS4wNTM1NiwgMC45MzA2NiwgMC45ODI5MywgMC44MjgyNiwgMS4wNDM5OSwgMSwgMSwgMC44MjgyNiwgMS4wNDM5OSwgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMC43OTY0OSwgMC44NDg2MywgMSwgMSwgMC44NTc3MSwgMS4xNzMxOCwgMC44NTc3MSwgMS4yMTk2OCwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45NTEzMiwgMS4wMTc1NiwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAwLjgyODcsIDAuOTMzNjUsIDAuOTA0MywgMC45MzM2NSwgMC45MDQzLCAwLjkzMzY1LCAwLjkwNDMsIDEuMDg1NzEsIDAuOTY5MjcsIDAuOTY3MDYsIDAuOTE0ODQsIDAuODYwMzUsIDAuOTM1NzUsIDAuOTY5MjQsIDAuOTU5MjMsIDEsIDEsIDAuODU3NzEsIDEuMjE5NjgsIDEuMTE0MzcsIDEuMTE0MzcsIDAuOTMxMDksIDAuOTEyMDIsIDAuNjA0MTEsIDAuODQxNjQsIDAuNTU1NzIsIDEuMDExNzMsIDAuOTczNjEsIDAuODE4MTgsIDAuODE4MTgsIDAuOTY2MzUsIDAuNzgwMzIsIDAuNzI3MjcsIDAuOTIzNjYsIDAuOTg2MDEsIDEuMDM0MDUsIDAuNzc5NjgsIDEuMDk3OTksIDEuMiwgMC45NjcwNiwgMC44NTk0NCwgMC44NTYzOCwgMC45NjQ5MSwgMC43NTg0MiwgMC45MzM2NSwgMC45ODMxLCAwLjk2OTI0LCAwLjk1NzgyLCAwLjg2OTY5LCAwLjk0MTUyLCAxLjA3Nzk2LCAxLjAzNTg0LCAwLjc4NDM3LCAwLjk2OTI0LCAwLjk4NzE1LCAwLjgzOTY4LCAwLjgzNDkxLCAwLjg1NzcxLCAwLjgyODcsIDAuOTQ0OTIsIDAuODg0MzMsIDAuOTI4NywgMS4wMDk4LCAwLjk1NzgyLCAwLjgyODcsIDEuMDYyNSwgMC45ODI0OCwgMS4wMzQyNCwgMS4yLCAxLjAxMDcxLCAxLjA2MjUsIDAuOTUyNDYsIDEuMDM4MDksIDEuMDQ5MTIsIDAuOTgyNDgsIDEuMDAyMjEsIDEuMDM0MjQsIDEuMDU0NDMsIDEuMiwgMS4wNDc4NSwgMC45OTYwOSwgMS4wMDE2OSwgMS4wNTE3NiwgMC45OTM0NiwgMS4wNTM1NiwgMC45MDg3LCAxLjAzMDA0LCAwLjk1NTQyLCAwLjkzMTE3LCAxLjIzMzYyLCAxLjAxMDcxLCAxLjA3ODMxLCAxLjAyNTEyLCAxLjA1MjA1LCAxLjAzNTAyLCAxLjIsIDEuMDEwNzEsIDEuMDUzNTYsIDEuMDEwNzEsIDEuMDM1MDIsIDAuNzU4NDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuMDM3MTksIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAuOTQwMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMS4wNDAyMSwgMSwgMSwgMSwgMSwgMSwgMSwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC45ODk2NSwgMS4wMDA2OCwgMC44Mjg3LCAwLjk2Nzc3LCAxLCAxLjIwMDg4LCAwLjg5OTAzLCAxLCAxLCAwLjc1MTU1LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjAzMDc3LCAxLjEzMTk2LCAxLjEzMTk2LCAxLjEzMTk2LCAwLjY3NDI4LCAwLjY3NDI4LCAxLjE2MDM5LCAwLjczMjkxLCAxLjIwOTk2LCAxLjIyMTM1LCAxLjA2NDgzLCAwLjk0ODY4LCAwLjk0ODY4LCAwLjk1OTk2LCAxLjI0NjMzLCAxLCAxLjA3NDk3LCAwLjg3Nzk2LCAwLjk2OTI3LCAxLjAxNTE4LCAwLjk2OTI3LCAxLCAxLCAxLCAwLjc3Mjk1LCAxLCAxLCAxLjEwNTM5LCAxLjEwNTM5LCAxLjExMzU4LCAxLjA2OTY3LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2Mjc5LCAwLjk0NDM0LCAwLjg2MTgyLCAxLCAxLCAxLjA4MywgMSwgMC45MTU3OCwgMC44NjUwNywgMS4xNzE0LCAxLjE4NDE2LCAxLjE0NTg5LCAwLjY5ODI1LCAwLjk3NjIyLCAxLjk2OTcsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEuMTcyMzgsIDEuMjQ4MjIsIDEuMjQ4MjIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEuNDI2MDMsIDEsIDAuOTk4NjIsIDAuOTk4NjIsIDEsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDAuODcwMjUsIDEuMTgwODMsIDEuNDI2MDMsIDEsIDEuNDI2MDMsIDEuNDI2MDMsIDAuOTk4NjIsIDEsIDEsIDEsIDEsIDEsIDEuMjg4NiwgMS4wNDMxNSwgMS4xNTI5NiwgMS4zNDE2MywgMSwgMSwgMSwgMS4xMDkzOCwgMS4xMDkzOCwgMSwgMSwgMSwgMS4wNTQyNSwgMS4wOTk3MSwgMS4wOTk3MSwgMS4wOTk3MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV07CmV4cG9ydHMuU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzID0gU2Vnb2V1aVJlZ3VsYXJGYWN0b3JzOwpjb25zdCBTZWdvZXVpUmVndWxhck1ldHJpY3MgPSB7CiAgbGluZUhlaWdodDogMS4zMzAwOCwKICBsaW5lR2FwOiAwCn07CmV4cG9ydHMuU2Vnb2V1aVJlZ3VsYXJNZXRyaWNzID0gU2Vnb2V1aVJlZ3VsYXJNZXRyaWNzOwoKLyoqKi8gfSksCi8qIDU3ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuUG9zdFNjcmlwdEV2YWx1YXRvciA9IGV4cG9ydHMuUG9zdFNjcmlwdENvbXBpbGVyID0gZXhwb3J0cy5QREZGdW5jdGlvbkZhY3RvcnkgPSB2b2lkIDA7CmV4cG9ydHMuaXNQREZGdW5jdGlvbiA9IGlzUERGRnVuY3Rpb247CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfcHNfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OCk7CnZhciBfYmFzZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOwp2YXIgX2ltYWdlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1OSk7CmNsYXNzIFBERkZ1bmN0aW9uRmFjdG9yeSB7CiAgY29uc3RydWN0b3IoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUKICB9KSB7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlOwogIH0KICBjcmVhdGUoZm4pIHsKICAgIGNvbnN0IGNhY2hlZEZ1bmN0aW9uID0gdGhpcy5nZXRDYWNoZWQoZm4pOwogICAgaWYgKGNhY2hlZEZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjsKICAgIH0KICAgIGNvbnN0IHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2UoewogICAgICB4cmVmOiB0aGlzLnhyZWYsCiAgICAgIGlzRXZhbFN1cHBvcnRlZDogdGhpcy5pc0V2YWxTdXBwb3J0ZWQsCiAgICAgIGZuOiBmbiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiA/IHRoaXMueHJlZi5mZXRjaChmbikgOiBmbgogICAgfSk7CiAgICB0aGlzLl9jYWNoZShmbiwgcGFyc2VkRnVuY3Rpb24pOwogICAgcmV0dXJuIHBhcnNlZEZ1bmN0aW9uOwogIH0KICBjcmVhdGVGcm9tQXJyYXkoZm5PYmopIHsKICAgIGNvbnN0IGNhY2hlZEZ1bmN0aW9uID0gdGhpcy5nZXRDYWNoZWQoZm5PYmopOwogICAgaWYgKGNhY2hlZEZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBjYWNoZWRGdW5jdGlvbjsKICAgIH0KICAgIGNvbnN0IHBhcnNlZEZ1bmN0aW9uID0gUERGRnVuY3Rpb24ucGFyc2VBcnJheSh7CiAgICAgIHhyZWY6IHRoaXMueHJlZiwKICAgICAgaXNFdmFsU3VwcG9ydGVkOiB0aGlzLmlzRXZhbFN1cHBvcnRlZCwKICAgICAgZm5PYmo6IGZuT2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8gdGhpcy54cmVmLmZldGNoKGZuT2JqKSA6IGZuT2JqCiAgICB9KTsKICAgIHRoaXMuX2NhY2hlKGZuT2JqLCBwYXJzZWRGdW5jdGlvbik7CiAgICByZXR1cm4gcGFyc2VkRnVuY3Rpb247CiAgfQogIGdldENhY2hlZChjYWNoZUtleSkgewogICAgbGV0IGZuUmVmOwogICAgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgIGZuUmVmID0gY2FjaGVLZXk7CiAgICB9IGVsc2UgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBmblJlZiA9IGNhY2hlS2V5Lm9iaklkOwogICAgfSBlbHNlIGlmIChjYWNoZUtleSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgIGZuUmVmID0gY2FjaGVLZXkuZGljdD8ub2JqSWQ7CiAgICB9CiAgICBpZiAoZm5SZWYpIHsKICAgICAgY29uc3QgbG9jYWxGdW5jdGlvbiA9IHRoaXMuX2xvY2FsRnVuY3Rpb25DYWNoZS5nZXRCeVJlZihmblJlZik7CiAgICAgIGlmIChsb2NhbEZ1bmN0aW9uKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsRnVuY3Rpb247CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfY2FjaGUoY2FjaGVLZXksIHBhcnNlZEZ1bmN0aW9uKSB7CiAgICBpZiAoIXBhcnNlZEZ1bmN0aW9uKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignUERGRnVuY3Rpb25GYWN0b3J5Ll9jYWNoZSAtIGV4cGVjdGVkICJwYXJzZWRGdW5jdGlvbiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBsZXQgZm5SZWY7CiAgICBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgZm5SZWYgPSBjYWNoZUtleTsKICAgIH0gZWxzZSBpZiAoY2FjaGVLZXkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIGZuUmVmID0gY2FjaGVLZXkub2JqSWQ7CiAgICB9IGVsc2UgaWYgKGNhY2hlS2V5IGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgZm5SZWYgPSBjYWNoZUtleS5kaWN0Py5vYmpJZDsKICAgIH0KICAgIGlmIChmblJlZikgewogICAgICB0aGlzLl9sb2NhbEZ1bmN0aW9uQ2FjaGUuc2V0KG51bGwsIGZuUmVmLCBwYXJzZWRGdW5jdGlvbik7CiAgICB9CiAgfQogIGdldCBfbG9jYWxGdW5jdGlvbkNhY2hlKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJfbG9jYWxGdW5jdGlvbkNhY2hlIiwgbmV3IF9pbWFnZV91dGlscy5Mb2NhbEZ1bmN0aW9uQ2FjaGUoKSk7CiAgfQp9CmV4cG9ydHMuUERGRnVuY3Rpb25GYWN0b3J5ID0gUERGRnVuY3Rpb25GYWN0b3J5OwpmdW5jdGlvbiB0b051bWJlckFycmF5KGFycikgewogIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDsKICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpZiAodHlwZW9mIGFycltpXSAhPT0gIm51bWJlciIpIHsKICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICByZXN1bHRbal0gPSArYXJyW2pdOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfQogIHJldHVybiBhcnI7Cn0KY2xhc3MgUERGRnVuY3Rpb24gewogIHN0YXRpYyBnZXRTYW1wbGVBcnJheShzaXplLCBvdXRwdXRTaXplLCBicHMsIHN0cmVhbSkgewogICAgbGV0IGksIGlpOwogICAgbGV0IGxlbmd0aCA9IDE7CiAgICBmb3IgKGkgPSAwLCBpaSA9IHNpemUubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBsZW5ndGggKj0gc2l6ZVtpXTsKICAgIH0KICAgIGxlbmd0aCAqPSBvdXRwdXRTaXplOwogICAgY29uc3QgYXJyYXkgPSBuZXcgQXJyYXkobGVuZ3RoKTsKICAgIGxldCBjb2RlU2l6ZSA9IDA7CiAgICBsZXQgY29kZUJ1ZiA9IDA7CiAgICBjb25zdCBzYW1wbGVNdWwgPSAxLjAgLyAoMi4wICoqIGJwcyAtIDEpOwogICAgY29uc3Qgc3RyQnl0ZXMgPSBzdHJlYW0uZ2V0Qnl0ZXMoKGxlbmd0aCAqIGJwcyArIDcpIC8gOCk7CiAgICBsZXQgc3RySWR4ID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICB3aGlsZSAoY29kZVNpemUgPCBicHMpIHsKICAgICAgICBjb2RlQnVmIDw8PSA4OwogICAgICAgIGNvZGVCdWYgfD0gc3RyQnl0ZXNbc3RySWR4KytdOwogICAgICAgIGNvZGVTaXplICs9IDg7CiAgICAgIH0KICAgICAgY29kZVNpemUgLT0gYnBzOwogICAgICBhcnJheVtpXSA9IChjb2RlQnVmID4+IGNvZGVTaXplKSAqIHNhbXBsZU11bDsKICAgICAgY29kZUJ1ZiAmPSAoMSA8PCBjb2RlU2l6ZSkgLSAxOwogICAgfQogICAgcmV0dXJuIGFycmF5OwogIH0KICBzdGF0aWMgcGFyc2UoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgIGZuCiAgfSkgewogICAgY29uc3QgZGljdCA9IGZuLmRpY3QgfHwgZm47CiAgICBjb25zdCB0eXBlTnVtID0gZGljdC5nZXQoIkZ1bmN0aW9uVHlwZSIpOwogICAgc3dpdGNoICh0eXBlTnVtKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RTYW1wbGVkKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGRpY3QKICAgICAgICB9KTsKICAgICAgY2FzZSAxOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0SW50ZXJwb2xhdGVkKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICAgICAgICBkaWN0CiAgICAgICAgfSk7CiAgICAgIGNhc2UgMzoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RTdGljaGVkKHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICAgICAgICBkaWN0CiAgICAgICAgfSk7CiAgICAgIGNhc2UgNDoKICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RQb3N0U2NyaXB0KHsKICAgICAgICAgIHhyZWYsCiAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICAgICAgICBmbiwKICAgICAgICAgIGRpY3QKICAgICAgICB9KTsKICAgIH0KICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biB0eXBlIG9mIGZ1bmN0aW9uIik7CiAgfQogIHN0YXRpYyBwYXJzZUFycmF5KHsKICAgIHhyZWYsCiAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICBmbk9iagogIH0pIHsKICAgIGlmICghQXJyYXkuaXNBcnJheShmbk9iaikpIHsKICAgICAgcmV0dXJuIHRoaXMucGFyc2UoewogICAgICAgIHhyZWYsCiAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAogICAgICAgIGZuOiBmbk9iagogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IGZuQXJyYXkgPSBbXTsKICAgIGZvciAoY29uc3QgZm4gb2YgZm5PYmopIHsKICAgICAgZm5BcnJheS5wdXNoKHRoaXMucGFyc2UoewogICAgICAgIHhyZWYsCiAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAogICAgICAgIGZuOiB4cmVmLmZldGNoSWZSZWYoZm4pCiAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiAoc3JjLCBzcmNPZmZzZXQsIGRlc3QsIGRlc3RPZmZzZXQpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZm5BcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgZm5BcnJheVtpXShzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCArIGkpOwogICAgICB9CiAgICB9OwogIH0KICBzdGF0aWMgY29uc3RydWN0U2FtcGxlZCh7CiAgICB4cmVmLAogICAgaXNFdmFsU3VwcG9ydGVkLAogICAgZm4sCiAgICBkaWN0CiAgfSkgewogICAgZnVuY3Rpb24gdG9NdWx0aUFycmF5KGFycikgewogICAgICBjb25zdCBpbnB1dExlbmd0aCA9IGFyci5sZW5ndGg7CiAgICAgIGNvbnN0IG91dCA9IFtdOwogICAgICBsZXQgaW5kZXggPSAwOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0TGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICBvdXRbaW5kZXgrK10gPSBbYXJyW2ldLCBhcnJbaSArIDFdXTsKICAgICAgfQogICAgICByZXR1cm4gb3V0OwogICAgfQogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoeCwgeG1pbiwgeG1heCwgeW1pbiwgeW1heCkgewogICAgICByZXR1cm4geW1pbiArICh4IC0geG1pbikgKiAoKHltYXggLSB5bWluKSAvICh4bWF4IC0geG1pbikpOwogICAgfQogICAgbGV0IGRvbWFpbiA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRG9tYWluIikpOwogICAgbGV0IHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJSYW5nZSIpKTsKICAgIGlmICghZG9tYWluIHx8ICFyYW5nZSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIGRvbWFpbiBvciByYW5nZSIpOwogICAgfQogICAgY29uc3QgaW5wdXRTaXplID0gZG9tYWluLmxlbmd0aCAvIDI7CiAgICBjb25zdCBvdXRwdXRTaXplID0gcmFuZ2UubGVuZ3RoIC8gMjsKICAgIGRvbWFpbiA9IHRvTXVsdGlBcnJheShkb21haW4pOwogICAgcmFuZ2UgPSB0b011bHRpQXJyYXkocmFuZ2UpOwogICAgY29uc3Qgc2l6ZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiU2l6ZSIpKTsKICAgIGNvbnN0IGJwcyA9IGRpY3QuZ2V0KCJCaXRzUGVyU2FtcGxlIik7CiAgICBjb25zdCBvcmRlciA9IGRpY3QuZ2V0KCJPcmRlciIpIHx8IDE7CiAgICBpZiAob3JkZXIgIT09IDEpIHsKICAgICAgKDAsIF91dGlsLmluZm8pKCJObyBzdXBwb3J0IGZvciBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhdGlvbjogIiArIG9yZGVyKTsKICAgIH0KICAgIGxldCBlbmNvZGUgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkVuY29kZSIpKTsKICAgIGlmICghZW5jb2RlKSB7CiAgICAgIGVuY29kZSA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7CiAgICAgICAgZW5jb2RlLnB1c2goWzAsIHNpemVbaV0gLSAxXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGVuY29kZSA9IHRvTXVsdGlBcnJheShlbmNvZGUpOwogICAgfQogICAgbGV0IGRlY29kZSA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiRGVjb2RlIikpOwogICAgaWYgKCFkZWNvZGUpIHsKICAgICAgZGVjb2RlID0gcmFuZ2U7CiAgICB9IGVsc2UgewogICAgICBkZWNvZGUgPSB0b011bHRpQXJyYXkoZGVjb2RlKTsKICAgIH0KICAgIGNvbnN0IHNhbXBsZXMgPSB0aGlzLmdldFNhbXBsZUFycmF5KHNpemUsIG91dHB1dFNpemUsIGJwcywgZm4pOwogICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFNhbXBsZWRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb25zdCBjdWJlVmVydGljZXMgPSAxIDw8IGlucHV0U2l6ZTsKICAgICAgY29uc3QgY3ViZU4gPSBuZXcgRmxvYXQ2NEFycmF5KGN1YmVWZXJ0aWNlcyk7CiAgICAgIGNvbnN0IGN1YmVWZXJ0ZXggPSBuZXcgVWludDMyQXJyYXkoY3ViZVZlcnRpY2VzKTsKICAgICAgbGV0IGksIGo7CiAgICAgIGZvciAoaiA9IDA7IGogPCBjdWJlVmVydGljZXM7IGorKykgewogICAgICAgIGN1YmVOW2pdID0gMTsKICAgICAgfQogICAgICBsZXQgayA9IG91dHB1dFNpemUsCiAgICAgICAgcG9zID0gMTsKICAgICAgZm9yIChpID0gMDsgaSA8IGlucHV0U2l6ZTsgKytpKSB7CiAgICAgICAgY29uc3QgZG9tYWluXzJpID0gZG9tYWluW2ldWzBdOwogICAgICAgIGNvbnN0IGRvbWFpbl8yaV8xID0gZG9tYWluW2ldWzFdOwogICAgICAgIGNvbnN0IHhpID0gTWF0aC5taW4oTWF0aC5tYXgoc3JjW3NyY09mZnNldCArIGldLCBkb21haW5fMmkpLCBkb21haW5fMmlfMSk7CiAgICAgICAgbGV0IGUgPSBpbnRlcnBvbGF0ZSh4aSwgZG9tYWluXzJpLCBkb21haW5fMmlfMSwgZW5jb2RlW2ldWzBdLCBlbmNvZGVbaV1bMV0pOwogICAgICAgIGNvbnN0IHNpemVfaSA9IHNpemVbaV07CiAgICAgICAgZSA9IE1hdGgubWluKE1hdGgubWF4KGUsIDApLCBzaXplX2kgLSAxKTsKICAgICAgICBjb25zdCBlMCA9IGUgPCBzaXplX2kgLSAxID8gTWF0aC5mbG9vcihlKSA6IGUgLSAxOwogICAgICAgIGNvbnN0IG4wID0gZTAgKyAxIC0gZTsKICAgICAgICBjb25zdCBuMSA9IGUgLSBlMDsKICAgICAgICBjb25zdCBvZmZzZXQwID0gZTAgKiBrOwogICAgICAgIGNvbnN0IG9mZnNldDEgPSBvZmZzZXQwICsgazsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3ViZVZlcnRpY2VzOyBqKyspIHsKICAgICAgICAgIGlmIChqICYgcG9zKSB7CiAgICAgICAgICAgIGN1YmVOW2pdICo9IG4xOwogICAgICAgICAgICBjdWJlVmVydGV4W2pdICs9IG9mZnNldDE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdWJlTltqXSAqPSBuMDsKICAgICAgICAgICAgY3ViZVZlcnRleFtqXSArPSBvZmZzZXQwOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrICo9IHNpemVfaTsKICAgICAgICBwb3MgPDw9IDE7CiAgICAgIH0KICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dFNpemU7ICsraikgewogICAgICAgIGxldCByaiA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1YmVWZXJ0aWNlczsgaSsrKSB7CiAgICAgICAgICByaiArPSBzYW1wbGVzW2N1YmVWZXJ0ZXhbaV0gKyBqXSAqIGN1YmVOW2ldOwogICAgICAgIH0KICAgICAgICByaiA9IGludGVycG9sYXRlKHJqLCAwLCAxLCBkZWNvZGVbal1bMF0sIGRlY29kZVtqXVsxXSk7CiAgICAgICAgZGVzdFtkZXN0T2Zmc2V0ICsgal0gPSBNYXRoLm1pbihNYXRoLm1heChyaiwgcmFuZ2Vbal1bMF0pLCByYW5nZVtqXVsxXSk7CiAgICAgIH0KICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWQoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgIGRpY3QKICB9KSB7CiAgICBjb25zdCBjMCA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQzAiKSkgfHwgWzBdOwogICAgY29uc3QgYzEgPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkMxIikpIHx8IFsxXTsKICAgIGNvbnN0IG4gPSBkaWN0LmdldCgiTiIpOwogICAgY29uc3QgZGlmZiA9IFtdOwogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYzAubGVuZ3RoOyBpIDwgaWk7ICsraSkgewogICAgICBkaWZmLnB1c2goYzFbaV0gLSBjMFtpXSk7CiAgICB9CiAgICBjb25zdCBsZW5ndGggPSBkaWZmLmxlbmd0aDsKICAgIHJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RJbnRlcnBvbGF0ZWRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb25zdCB4ID0gbiA9PT0gMSA/IHNyY1tzcmNPZmZzZXRdIDogc3JjW3NyY09mZnNldF0gKiogbjsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7ICsraikgewogICAgICAgIGRlc3RbZGVzdE9mZnNldCArIGpdID0gYzBbal0gKyB4ICogZGlmZltqXTsKICAgICAgfQogICAgfTsKICB9CiAgc3RhdGljIGNvbnN0cnVjdFN0aWNoZWQoewogICAgeHJlZiwKICAgIGlzRXZhbFN1cHBvcnRlZCwKICAgIGRpY3QKICB9KSB7CiAgICBjb25zdCBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKICAgIGlmICghZG9tYWluKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gZG9tYWluIik7CiAgICB9CiAgICBjb25zdCBpbnB1dFNpemUgPSBkb21haW4ubGVuZ3RoIC8gMjsKICAgIGlmIChpbnB1dFNpemUgIT09IDEpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJCYWQgZG9tYWluIGZvciBzdGljaGVkIGZ1bmN0aW9uIik7CiAgICB9CiAgICBjb25zdCBmbnMgPSBbXTsKICAgIGZvciAoY29uc3QgZm4gb2YgZGljdC5nZXQoIkZ1bmN0aW9ucyIpKSB7CiAgICAgIGZucy5wdXNoKHRoaXMucGFyc2UoewogICAgICAgIHhyZWYsCiAgICAgICAgaXNFdmFsU3VwcG9ydGVkLAogICAgICAgIGZuOiB4cmVmLmZldGNoSWZSZWYoZm4pCiAgICAgIH0pKTsKICAgIH0KICAgIGNvbnN0IGJvdW5kcyA9IHRvTnVtYmVyQXJyYXkoZGljdC5nZXRBcnJheSgiQm91bmRzIikpOwogICAgY29uc3QgZW5jb2RlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJFbmNvZGUiKSk7CiAgICBjb25zdCB0bXBCdWYgPSBuZXcgRmxvYXQzMkFycmF5KDEpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFN0aWNoZWRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBjb25zdCBjbGlwID0gZnVuY3Rpb24gY29uc3RydWN0U3RpY2hlZEZyb21JUkNsaXAodiwgbWluLCBtYXgpIHsKICAgICAgICBpZiAodiA+IG1heCkgewogICAgICAgICAgdiA9IG1heDsKICAgICAgICB9IGVsc2UgaWYgKHYgPCBtaW4pIHsKICAgICAgICAgIHYgPSBtaW47CiAgICAgICAgfQogICAgICAgIHJldHVybiB2OwogICAgICB9OwogICAgICBjb25zdCB2ID0gY2xpcChzcmNbc3JjT2Zmc2V0XSwgZG9tYWluWzBdLCBkb21haW5bMV0pOwogICAgICBjb25zdCBsZW5ndGggPSBib3VuZHMubGVuZ3RoOwogICAgICBsZXQgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHYgPCBib3VuZHNbaV0pIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZG1pbiA9IGRvbWFpblswXTsKICAgICAgaWYgKGkgPiAwKSB7CiAgICAgICAgZG1pbiA9IGJvdW5kc1tpIC0gMV07CiAgICAgIH0KICAgICAgbGV0IGRtYXggPSBkb21haW5bMV07CiAgICAgIGlmIChpIDwgYm91bmRzLmxlbmd0aCkgewogICAgICAgIGRtYXggPSBib3VuZHNbaV07CiAgICAgIH0KICAgICAgY29uc3Qgcm1pbiA9IGVuY29kZVsyICogaV07CiAgICAgIGNvbnN0IHJtYXggPSBlbmNvZGVbMiAqIGkgKyAxXTsKICAgICAgdG1wQnVmWzBdID0gZG1pbiA9PT0gZG1heCA/IHJtaW4gOiBybWluICsgKHYgLSBkbWluKSAqIChybWF4IC0gcm1pbikgLyAoZG1heCAtIGRtaW4pOwogICAgICBmbnNbaV0odG1wQnVmLCAwLCBkZXN0LCBkZXN0T2Zmc2V0KTsKICAgIH07CiAgfQogIHN0YXRpYyBjb25zdHJ1Y3RQb3N0U2NyaXB0KHsKICAgIHhyZWYsCiAgICBpc0V2YWxTdXBwb3J0ZWQsCiAgICBmbiwKICAgIGRpY3QKICB9KSB7CiAgICBjb25zdCBkb21haW4gPSB0b051bWJlckFycmF5KGRpY3QuZ2V0QXJyYXkoIkRvbWFpbiIpKTsKICAgIGNvbnN0IHJhbmdlID0gdG9OdW1iZXJBcnJheShkaWN0LmdldEFycmF5KCJSYW5nZSIpKTsKICAgIGlmICghZG9tYWluKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiTm8gZG9tYWluLiIpOwogICAgfQogICAgaWYgKCFyYW5nZSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vIHJhbmdlLiIpOwogICAgfQogICAgY29uc3QgbGV4ZXIgPSBuZXcgX3BzX3BhcnNlci5Qb3N0U2NyaXB0TGV4ZXIoZm4pOwogICAgY29uc3QgcGFyc2VyID0gbmV3IF9wc19wYXJzZXIuUG9zdFNjcmlwdFBhcnNlcihsZXhlcik7CiAgICBjb25zdCBjb2RlID0gcGFyc2VyLnBhcnNlKCk7CiAgICBpZiAoaXNFdmFsU3VwcG9ydGVkICYmIF91dGlsLkZlYXR1cmVUZXN0LmlzRXZhbFN1cHBvcnRlZCkgewogICAgICBjb25zdCBjb21waWxlZCA9IG5ldyBQb3N0U2NyaXB0Q29tcGlsZXIoKS5jb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpOwogICAgICBpZiAoY29tcGlsZWQpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJzcmMiLCAic3JjT2Zmc2V0IiwgImRlc3QiLCAiZGVzdE9mZnNldCIsIGNvbXBpbGVkKTsKICAgICAgfQogICAgfQogICAgKDAsIF91dGlsLmluZm8pKCJVbmFibGUgdG8gY29tcGlsZSBQUyBmdW5jdGlvbiIpOwogICAgY29uc3QgbnVtT3V0cHV0cyA9IHJhbmdlLmxlbmd0aCA+PiAxOwogICAgY29uc3QgbnVtSW5wdXRzID0gZG9tYWluLmxlbmd0aCA+PiAxOwogICAgY29uc3QgZXZhbHVhdG9yID0gbmV3IFBvc3RTY3JpcHRFdmFsdWF0b3IoY29kZSk7CiAgICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCBNQVhfQ0FDSEVfU0laRSA9IDIwNDggKiA0OwogICAgbGV0IGNhY2hlX2F2YWlsYWJsZSA9IE1BWF9DQUNIRV9TSVpFOwogICAgY29uc3QgdG1wQnVmID0gbmV3IEZsb2F0MzJBcnJheShudW1JbnB1dHMpOwogICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdFBvc3RTY3JpcHRGbihzcmMsIHNyY09mZnNldCwgZGVzdCwgZGVzdE9mZnNldCkgewogICAgICBsZXQgaSwgdmFsdWU7CiAgICAgIGxldCBrZXkgPSAiIjsKICAgICAgY29uc3QgaW5wdXQgPSB0bXBCdWY7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1JbnB1dHM7IGkrKykgewogICAgICAgIHZhbHVlID0gc3JjW3NyY09mZnNldCArIGldOwogICAgICAgIGlucHV0W2ldID0gdmFsdWU7CiAgICAgICAga2V5ICs9IHZhbHVlICsgIl8iOwogICAgICB9CiAgICAgIGNvbnN0IGNhY2hlZFZhbHVlID0gY2FjaGVba2V5XTsKICAgICAgaWYgKGNhY2hlZFZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBkZXN0LnNldChjYWNoZWRWYWx1ZSwgZGVzdE9mZnNldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkobnVtT3V0cHV0cyk7CiAgICAgIGNvbnN0IHN0YWNrID0gZXZhbHVhdG9yLmV4ZWN1dGUoaW5wdXQpOwogICAgICBjb25zdCBzdGFja0luZGV4ID0gc3RhY2subGVuZ3RoIC0gbnVtT3V0cHV0czsKICAgICAgZm9yIChpID0gMDsgaSA8IG51bU91dHB1dHM7IGkrKykgewogICAgICAgIHZhbHVlID0gc3RhY2tbc3RhY2tJbmRleCArIGldOwogICAgICAgIGxldCBib3VuZCA9IHJhbmdlW2kgKiAyXTsKICAgICAgICBpZiAodmFsdWUgPCBib3VuZCkgewogICAgICAgICAgdmFsdWUgPSBib3VuZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYm91bmQgPSByYW5nZVtpICogMiArIDFdOwogICAgICAgICAgaWYgKHZhbHVlID4gYm91bmQpIHsKICAgICAgICAgICAgdmFsdWUgPSBib3VuZDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3V0cHV0W2ldID0gdmFsdWU7CiAgICAgIH0KICAgICAgaWYgKGNhY2hlX2F2YWlsYWJsZSA+IDApIHsKICAgICAgICBjYWNoZV9hdmFpbGFibGUtLTsKICAgICAgICBjYWNoZVtrZXldID0gb3V0cHV0OwogICAgICB9CiAgICAgIGRlc3Quc2V0KG91dHB1dCwgZGVzdE9mZnNldCk7CiAgICB9OwogIH0KfQpmdW5jdGlvbiBpc1BERkZ1bmN0aW9uKHYpIHsKICBsZXQgZm5EaWN0OwogIGlmICh2IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgZm5EaWN0ID0gdjsKICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgZm5EaWN0ID0gdi5kaWN0OwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBmbkRpY3QuaGFzKCJGdW5jdGlvblR5cGUiKTsKfQpjbGFzcyBQb3N0U2NyaXB0U3RhY2sgewogIHN0YXRpYyBNQVhfU1RBQ0tfU0laRSA9IDEwMDsKICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhY2spIHsKICAgIHRoaXMuc3RhY2sgPSBpbml0aWFsU3RhY2sgPyBBcnJheS5mcm9tKGluaXRpYWxTdGFjaykgOiBbXTsKICB9CiAgcHVzaCh2YWx1ZSkgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IFBvc3RTY3JpcHRTdGFjay5NQVhfU1RBQ0tfU0laRSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgb3ZlcmZsb3cuIik7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2godmFsdWUpOwogIH0KICBwb3AoKSB7CiAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPD0gMCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlBvc3RTY3JpcHQgZnVuY3Rpb24gc3RhY2sgdW5kZXJmbG93LiIpOwogICAgfQogICAgcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7CiAgfQogIGNvcHkobikgewogICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoICsgbiA+PSBQb3N0U2NyaXB0U3RhY2suTUFYX1NUQUNLX1NJWkUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJQb3N0U2NyaXB0IGZ1bmN0aW9uIHN0YWNrIG92ZXJmbG93LiIpOwogICAgfQogICAgY29uc3Qgc3RhY2sgPSB0aGlzLnN0YWNrOwogICAgZm9yIChsZXQgaSA9IHN0YWNrLmxlbmd0aCAtIG4sIGogPSBuIC0gMTsgaiA+PSAwOyBqLS0sIGkrKykgewogICAgICBzdGFjay5wdXNoKHN0YWNrW2ldKTsKICAgIH0KICB9CiAgaW5kZXgobikgewogICAgdGhpcy5wdXNoKHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSBuIC0gMV0pOwogIH0KICByb2xsKG4sIHApIHsKICAgIGNvbnN0IHN0YWNrID0gdGhpcy5zdGFjazsKICAgIGNvbnN0IGwgPSBzdGFjay5sZW5ndGggLSBuOwogICAgY29uc3QgciA9IHN0YWNrLmxlbmd0aCAtIDE7CiAgICBjb25zdCBjID0gbCArIChwIC0gTWF0aC5mbG9vcihwIC8gbikgKiBuKTsKICAgIGZvciAobGV0IGkgPSBsLCBqID0gcjsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogICAgZm9yIChsZXQgaSA9IGwsIGogPSBjIC0gMTsgaSA8IGo7IGkrKywgai0tKSB7CiAgICAgIGNvbnN0IHQgPSBzdGFja1tpXTsKICAgICAgc3RhY2tbaV0gPSBzdGFja1tqXTsKICAgICAgc3RhY2tbal0gPSB0OwogICAgfQogICAgZm9yIChsZXQgaSA9IGMsIGogPSByOyBpIDwgajsgaSsrLCBqLS0pIHsKICAgICAgY29uc3QgdCA9IHN0YWNrW2ldOwogICAgICBzdGFja1tpXSA9IHN0YWNrW2pdOwogICAgICBzdGFja1tqXSA9IHQ7CiAgICB9CiAgfQp9CmNsYXNzIFBvc3RTY3JpcHRFdmFsdWF0b3IgewogIGNvbnN0cnVjdG9yKG9wZXJhdG9ycykgewogICAgdGhpcy5vcGVyYXRvcnMgPSBvcGVyYXRvcnM7CiAgfQogIGV4ZWN1dGUoaW5pdGlhbFN0YWNrKSB7CiAgICBjb25zdCBzdGFjayA9IG5ldyBQb3N0U2NyaXB0U3RhY2soaW5pdGlhbFN0YWNrKTsKICAgIGxldCBjb3VudGVyID0gMDsKICAgIGNvbnN0IG9wZXJhdG9ycyA9IHRoaXMub3BlcmF0b3JzOwogICAgY29uc3QgbGVuZ3RoID0gb3BlcmF0b3JzLmxlbmd0aDsKICAgIGxldCBvcGVyYXRvciwgYSwgYjsKICAgIHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7CiAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzW2NvdW50ZXIrK107CiAgICAgIGlmICh0eXBlb2Ygb3BlcmF0b3IgPT09ICJudW1iZXIiKSB7CiAgICAgICAgc3RhY2sucHVzaChvcGVyYXRvcik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgc3dpdGNoIChvcGVyYXRvcikgewogICAgICAgIGNhc2UgImp6IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICBjb3VudGVyID0gYjsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImoiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY291bnRlciA9IGE7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhYnMiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmFicyhhKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhZGQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICsgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJhbmQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgaWYgKHR5cGVvZiBhID09PSAiYm9vbGVhbiIgJiYgdHlwZW9mIGIgPT09ICJib29sZWFuIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgJiYgYik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgJiBiKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImF0YW4iOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IE1hdGguYXRhbjIoYSwgYikgLyBNYXRoLlBJICogMTgwOwogICAgICAgICAgaWYgKGEgPCAwKSB7CiAgICAgICAgICAgIGEgKz0gMzYwOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2sucHVzaChhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImJpdHNoaWZ0IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmIChhID4gMCkgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgPDwgYik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGFjay5wdXNoKGEgPj4gYik7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjZWlsaW5nIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5jZWlsKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImNvcHkiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2suY29weShhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImNvcyI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguY29zKGEgJSAzNjAgLyAxODAgKiBNYXRoLlBJKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdmkiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpIHwgMDsKICAgICAgICAgIHN0YWNrLnB1c2goYSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJjdnIiOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZGl2IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSAvIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZHVwIjoKICAgICAgICAgIHN0YWNrLmNvcHkoMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlcSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgPT09IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhjaCI6CiAgICAgICAgICBzdGFjay5yb2xsKDIsIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZXhwIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSAqKiBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZhbHNlIjoKICAgICAgICAgIHN0YWNrLnB1c2goZmFsc2UpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZmxvb3IiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLmZsb29yKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImdlIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSA+PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImd0IjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSA+IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaWRpdiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLyBiIHwgMCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJpbmRleCI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5pbmRleChhKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxlIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYSA8PSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxuIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2coYSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibG9nIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5sb2coYSkgLyBNYXRoLkxOMTApOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibHQiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhIDwgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtb2QiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICUgYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtdWwiOgogICAgICAgICAgYiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhICogYik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJuZSI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgIT09IGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibmVnIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goLWEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibm90IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goIWEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhY2sucHVzaCh+YSk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJvciI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAodHlwZW9mIGEgPT09ICJib29sZWFuIiAmJiB0eXBlb2YgYiA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8fCBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSB8IGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicG9wIjoKICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm9sbCI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5yb2xsKGEsIGIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicm91bmQiOgogICAgICAgICAgYSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChNYXRoLnJvdW5kKGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInNpbiI6CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKE1hdGguc2luKGEgJSAzNjAgLyAxODAgKiBNYXRoLlBJKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzcXJ0IjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goTWF0aC5zcXJ0KGEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInN1YiI6CiAgICAgICAgICBiID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBhID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGEgLSBiKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydWUiOgogICAgICAgICAgc3RhY2sucHVzaCh0cnVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRydW5jYXRlIjoKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBhIDwgMCA/IE1hdGguY2VpbChhKSA6IE1hdGguZmxvb3IoYSk7CiAgICAgICAgICBzdGFjay5wdXNoKGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAieG9yIjoKICAgICAgICAgIGIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGlmICh0eXBlb2YgYSA9PT0gImJvb2xlYW4iICYmIHR5cGVvZiBiID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgc3RhY2sucHVzaChhICE9PSBiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYSBeIGIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5rbm93biBvcGVyYXRvciAke29wZXJhdG9yfWApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc3RhY2suc3RhY2s7CiAgfQp9CmV4cG9ydHMuUG9zdFNjcmlwdEV2YWx1YXRvciA9IFBvc3RTY3JpcHRFdmFsdWF0b3I7CmNsYXNzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKHR5cGUpIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoImFic3RyYWN0IG1ldGhvZCIpOwogIH0KfQpjbGFzcyBBc3RBcmd1bWVudCBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKGluZGV4LCBtaW4sIG1heCkgewogICAgc3VwZXIoImFyZ3MiKTsKICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgIHRoaXMubWluID0gbWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRBcmd1bWVudCh0aGlzKTsKICB9Cn0KY2xhc3MgQXN0TGl0ZXJhbCBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKG51bWJlcikgewogICAgc3VwZXIoImxpdGVyYWwiKTsKICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOwogICAgdGhpcy5taW4gPSBudW1iZXI7CiAgICB0aGlzLm1heCA9IG51bWJlcjsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdExpdGVyYWwodGhpcyk7CiAgfQp9CmNsYXNzIEFzdEJpbmFyeU9wZXJhdGlvbiBleHRlbmRzIEFzdE5vZGUgewogIGNvbnN0cnVjdG9yKG9wLCBhcmcxLCBhcmcyLCBtaW4sIG1heCkgewogICAgc3VwZXIoImJpbmFyeSIpOwogICAgdGhpcy5vcCA9IG9wOwogICAgdGhpcy5hcmcxID0gYXJnMTsKICAgIHRoaXMuYXJnMiA9IGFyZzI7CiAgICB0aGlzLm1pbiA9IG1pbjsKICAgIHRoaXMubWF4ID0gbWF4OwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0QmluYXJ5T3BlcmF0aW9uKHRoaXMpOwogIH0KfQpjbGFzcyBBc3RNaW4gZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihhcmcsIG1heCkgewogICAgc3VwZXIoIm1heCIpOwogICAgdGhpcy5hcmcgPSBhcmc7CiAgICB0aGlzLm1pbiA9IGFyZy5taW47CiAgICB0aGlzLm1heCA9IG1heDsKICB9CiAgdmlzaXQodmlzaXRvcikgewogICAgdmlzaXRvci52aXNpdE1pbih0aGlzKTsKICB9Cn0KY2xhc3MgQXN0VmFyaWFibGUgZXh0ZW5kcyBBc3ROb2RlIHsKICBjb25zdHJ1Y3RvcihpbmRleCwgbWluLCBtYXgpIHsKICAgIHN1cGVyKCJ2YXIiKTsKICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgIHRoaXMubWluID0gbWluOwogICAgdGhpcy5tYXggPSBtYXg7CiAgfQogIHZpc2l0KHZpc2l0b3IpIHsKICAgIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzKTsKICB9Cn0KY2xhc3MgQXN0VmFyaWFibGVEZWZpbml0aW9uIGV4dGVuZHMgQXN0Tm9kZSB7CiAgY29uc3RydWN0b3IodmFyaWFibGUsIGFyZykgewogICAgc3VwZXIoImRlZmluaXRpb24iKTsKICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKICAgIHRoaXMuYXJnID0gYXJnOwogIH0KICB2aXNpdCh2aXNpdG9yKSB7CiAgICB2aXNpdG9yLnZpc2l0VmFyaWFibGVEZWZpbml0aW9uKHRoaXMpOwogIH0KfQpjbGFzcyBFeHByZXNzaW9uQnVpbGRlclZpc2l0b3IgewogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5wYXJ0cyA9IFtdOwogIH0KICB2aXNpdEFyZ3VtZW50KGFyZykgewogICAgdGhpcy5wYXJ0cy5wdXNoKCJNYXRoLm1heCgiLCBhcmcubWluLCAiLCBNYXRoLm1pbigiLCBhcmcubWF4LCAiLCBzcmNbc3JjT2Zmc2V0ICsgIiwgYXJnLmluZGV4LCAiXSkpIik7CiAgfQogIHZpc2l0VmFyaWFibGUodmFyaWFibGUpIHsKICAgIHRoaXMucGFydHMucHVzaCgidiIsIHZhcmlhYmxlLmluZGV4KTsKICB9CiAgdmlzaXRMaXRlcmFsKGxpdGVyYWwpIHsKICAgIHRoaXMucGFydHMucHVzaChsaXRlcmFsLm51bWJlcik7CiAgfQogIHZpc2l0QmluYXJ5T3BlcmF0aW9uKG9wZXJhdGlvbikgewogICAgdGhpcy5wYXJ0cy5wdXNoKCIoIik7CiAgICBvcGVyYXRpb24uYXJnMS52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiICIsIG9wZXJhdGlvbi5vcCwgIiAiKTsKICAgIG9wZXJhdGlvbi5hcmcyLnZpc2l0KHRoaXMpOwogICAgdGhpcy5wYXJ0cy5wdXNoKCIpIik7CiAgfQogIHZpc2l0VmFyaWFibGVEZWZpbml0aW9uKGRlZmluaXRpb24pIHsKICAgIHRoaXMucGFydHMucHVzaCgidmFyICIpOwogICAgZGVmaW5pdGlvbi52YXJpYWJsZS52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiID0gIik7CiAgICBkZWZpbml0aW9uLmFyZy52aXNpdCh0aGlzKTsKICAgIHRoaXMucGFydHMucHVzaCgiOyIpOwogIH0KICB2aXNpdE1pbihtYXgpIHsKICAgIHRoaXMucGFydHMucHVzaCgiTWF0aC5taW4oIik7CiAgICBtYXguYXJnLnZpc2l0KHRoaXMpOwogICAgdGhpcy5wYXJ0cy5wdXNoKCIsICIsIG1heC5tYXgsICIpIik7CiAgfQogIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRoaXMucGFydHMuam9pbigiIik7CiAgfQp9CmZ1bmN0aW9uIGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpIHsKICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMi5udW1iZXIgPT09IDApIHsKICAgIHJldHVybiBudW0xOwogIH0KICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS5udW1iZXIgPT09IDApIHsKICAgIHJldHVybiBudW0yOwogIH0KICBpZiAobnVtMi50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciArIG51bTIubnVtYmVyKTsKICB9CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIisiLCBudW0xLCBudW0yLCBudW0xLm1pbiArIG51bTIubWluLCBudW0xLm1heCArIG51bTIubWF4KTsKfQpmdW5jdGlvbiBidWlsZE11bE9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKDApOwogICAgfSBlbHNlIGlmIChudW0yLm51bWJlciA9PT0gMSkgewogICAgICByZXR1cm4gbnVtMTsKICAgIH0gZWxzZSBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKICAgICAgcmV0dXJuIG5ldyBBc3RMaXRlcmFsKG51bTEubnVtYmVyICogbnVtMi5udW1iZXIpOwogICAgfQogIH0KICBpZiAobnVtMS50eXBlID09PSAibGl0ZXJhbCIpIHsKICAgIGlmIChudW0xLm51bWJlciA9PT0gMCkgewogICAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwoMCk7CiAgICB9IGVsc2UgaWYgKG51bTEubnVtYmVyID09PSAxKSB7CiAgICAgIHJldHVybiBudW0yOwogICAgfQogIH0KICBjb25zdCBtaW4gPSBNYXRoLm1pbihudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKICBjb25zdCBtYXggPSBNYXRoLm1heChudW0xLm1pbiAqIG51bTIubWluLCBudW0xLm1pbiAqIG51bTIubWF4LCBudW0xLm1heCAqIG51bTIubWluLCBudW0xLm1heCAqIG51bTIubWF4KTsKICByZXR1cm4gbmV3IEFzdEJpbmFyeU9wZXJhdGlvbigiKiIsIG51bTEsIG51bTIsIG1pbiwgbWF4KTsKfQpmdW5jdGlvbiBidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSB7CiAgaWYgKG51bTIudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICBpZiAobnVtMi5udW1iZXIgPT09IDApIHsKICAgICAgcmV0dXJuIG51bTE7CiAgICB9IGVsc2UgaWYgKG51bTEudHlwZSA9PT0gImxpdGVyYWwiKSB7CiAgICAgIHJldHVybiBuZXcgQXN0TGl0ZXJhbChudW0xLm51bWJlciAtIG51bTIubnVtYmVyKTsKICAgIH0KICB9CiAgaWYgKG51bTIudHlwZSA9PT0gImJpbmFyeSIgJiYgbnVtMi5vcCA9PT0gIi0iICYmIG51bTEudHlwZSA9PT0gImxpdGVyYWwiICYmIG51bTEubnVtYmVyID09PSAxICYmIG51bTIuYXJnMS50eXBlID09PSAibGl0ZXJhbCIgJiYgbnVtMi5hcmcxLm51bWJlciA9PT0gMSkgewogICAgcmV0dXJuIG51bTIuYXJnMjsKICB9CiAgcmV0dXJuIG5ldyBBc3RCaW5hcnlPcGVyYXRpb24oIi0iLCBudW0xLCBudW0yLCBudW0xLm1pbiAtIG51bTIubWF4LCBudW0xLm1heCAtIG51bTIubWluKTsKfQpmdW5jdGlvbiBidWlsZE1pbk9wZXJhdGlvbihudW0xLCBtYXgpIHsKICBpZiAobnVtMS5taW4gPj0gbWF4KSB7CiAgICByZXR1cm4gbmV3IEFzdExpdGVyYWwobWF4KTsKICB9IGVsc2UgaWYgKG51bTEubWF4IDw9IG1heCkgewogICAgcmV0dXJuIG51bTE7CiAgfQogIHJldHVybiBuZXcgQXN0TWluKG51bTEsIG1heCk7Cn0KY2xhc3MgUG9zdFNjcmlwdENvbXBpbGVyIHsKICBjb21waWxlKGNvZGUsIGRvbWFpbiwgcmFuZ2UpIHsKICAgIGNvbnN0IHN0YWNrID0gW107CiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBbXTsKICAgIGNvbnN0IGlucHV0U2l6ZSA9IGRvbWFpbi5sZW5ndGggPj4gMSwKICAgICAgb3V0cHV0U2l6ZSA9IHJhbmdlLmxlbmd0aCA+PiAxOwogICAgbGV0IGxhc3RSZWdpc3RlciA9IDA7CiAgICBsZXQgbiwgajsKICAgIGxldCBudW0xLCBudW0yLCBhc3QxLCBhc3QyLCB0bXBWYXIsIGl0ZW07CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2l6ZTsgaSsrKSB7CiAgICAgIHN0YWNrLnB1c2gobmV3IEFzdEFyZ3VtZW50KGksIGRvbWFpbltpICogMl0sIGRvbWFpbltpICogMiArIDFdKSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBjb2RlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgaXRlbSA9IGNvZGVbaV07CiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gIm51bWJlciIpIHsKICAgICAgICBzdGFjay5wdXNoKG5ldyBBc3RMaXRlcmFsKGl0ZW0pKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBzd2l0Y2ggKGl0ZW0pIHsKICAgICAgICBjYXNlICJhZGQiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBzdGFjay5wdXNoKGJ1aWxkQWRkT3BlcmF0aW9uKG51bTEsIG51bTIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImN2ciI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm11bCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIG51bTIgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIG51bTEgPSBzdGFjay5wb3AoKTsKICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRNdWxPcGVyYXRpb24obnVtMSwgbnVtMikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAic3ViIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgbnVtMiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgbnVtMSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChidWlsZFN1Yk9wZXJhdGlvbihudW0xLCBudW0yKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJleGNoIjoKICAgICAgICAgIGlmIChzdGFjay5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgICAgYXN0MSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgYXN0MiA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgc3RhY2sucHVzaChhc3QxLCBhc3QyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInBvcCI6CiAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoIDwgMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiaW5kZXgiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAobnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBuID0gbnVtMS5udW1iZXI7CiAgICAgICAgICBpZiAobiA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIobikgfHwgc3RhY2subGVuZ3RoIDwgbikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFja1tzdGFjay5sZW5ndGggLSBuIC0gMV07CiAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSAibGl0ZXJhbCIgfHwgYXN0MS50eXBlID09PSAidmFyIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIG4gLSAxXSA9IHRtcFZhcjsKICAgICAgICAgIHN0YWNrLnB1c2godG1wVmFyKTsKICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG5ldyBBc3RWYXJpYWJsZURlZmluaXRpb24odG1wVmFyLCBhc3QxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJkdXAiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZW9mIGNvZGVbaSArIDFdID09PSAibnVtYmVyIiAmJiBjb2RlW2kgKyAyXSA9PT0gImd0IiAmJiBjb2RlW2kgKyAzXSA9PT0gaSArIDcgJiYgY29kZVtpICsgNF0gPT09ICJqeiIgJiYgY29kZVtpICsgNV0gPT09ICJwb3AiICYmIGNvZGVbaSArIDZdID09PSBjb2RlW2kgKyAxXSkgewogICAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHN0YWNrLnB1c2goYnVpbGRNaW5PcGVyYXRpb24obnVtMSwgY29kZVtpICsgMV0pKTsKICAgICAgICAgICAgaSArPSA2OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGFzdDEgPSBzdGFjay5hdCgtMSk7CiAgICAgICAgICBpZiAoYXN0MS50eXBlID09PSAibGl0ZXJhbCIgfHwgYXN0MS50eXBlID09PSAidmFyIikgewogICAgICAgICAgICBzdGFjay5wdXNoKGFzdDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHRtcFZhciA9IG5ldyBBc3RWYXJpYWJsZShsYXN0UmVnaXN0ZXIrKywgYXN0MS5taW4sIGFzdDEubWF4KTsKICAgICAgICAgIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID0gdG1wVmFyOwogICAgICAgICAgc3RhY2sucHVzaCh0bXBWYXIpOwogICAgICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2gobmV3IEFzdFZhcmlhYmxlRGVmaW5pdGlvbih0bXBWYXIsIGFzdDEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInJvbGwiOgogICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBudW0yID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBudW0xID0gc3RhY2sucG9wKCk7CiAgICAgICAgICBpZiAobnVtMi50eXBlICE9PSAibGl0ZXJhbCIgfHwgbnVtMS50eXBlICE9PSAibGl0ZXJhbCIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBqID0gbnVtMi5udW1iZXI7CiAgICAgICAgICBuID0gbnVtMS5udW1iZXI7CiAgICAgICAgICBpZiAobiA8PSAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGopIHx8IHN0YWNrLmxlbmd0aCA8IG4pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBqID0gKGogJSBuICsgbikgJSBuOwogICAgICAgICAgaWYgKGogPT09IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFjay5wdXNoKC4uLnN0YWNrLnNwbGljZShzdGFjay5sZW5ndGggLSBuLCBuIC0gaikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RhY2subGVuZ3RoICE9PSBvdXRwdXRTaXplKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykgewogICAgICBjb25zdCBzdGF0ZW1lbnRCdWlsZGVyID0gbmV3IEV4cHJlc3Npb25CdWlsZGVyVmlzaXRvcigpOwogICAgICBpbnN0cnVjdGlvbi52aXNpdChzdGF0ZW1lbnRCdWlsZGVyKTsKICAgICAgcmVzdWx0LnB1c2goc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpKTsKICAgIH0KICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0YWNrLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgZXhwciA9IHN0YWNrW2ldLAogICAgICAgIHN0YXRlbWVudEJ1aWxkZXIgPSBuZXcgRXhwcmVzc2lvbkJ1aWxkZXJWaXNpdG9yKCk7CiAgICAgIGV4cHIudmlzaXQoc3RhdGVtZW50QnVpbGRlcik7CiAgICAgIGNvbnN0IG1pbiA9IHJhbmdlW2kgKiAyXSwKICAgICAgICBtYXggPSByYW5nZVtpICogMiArIDFdOwogICAgICBjb25zdCBvdXQgPSBbc3RhdGVtZW50QnVpbGRlci50b1N0cmluZygpXTsKICAgICAgaWYgKG1pbiA+IGV4cHIubWluKSB7CiAgICAgICAgb3V0LnVuc2hpZnQoIk1hdGgubWF4KCIsIG1pbiwgIiwgIik7CiAgICAgICAgb3V0LnB1c2goIikiKTsKICAgICAgfQogICAgICBpZiAobWF4IDwgZXhwci5tYXgpIHsKICAgICAgICBvdXQudW5zaGlmdCgiTWF0aC5taW4oIiwgbWF4LCAiLCAiKTsKICAgICAgICBvdXQucHVzaCgiKSIpOwogICAgICB9CiAgICAgIG91dC51bnNoaWZ0KCJkZXN0W2Rlc3RPZmZzZXQgKyAiLCBpLCAiXSA9ICIpOwogICAgICBvdXQucHVzaCgiOyIpOwogICAgICByZXN1bHQucHVzaChvdXQuam9pbigiIikpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdC5qb2luKCJcbiIpOwogIH0KfQpleHBvcnRzLlBvc3RTY3JpcHRDb21waWxlciA9IFBvc3RTY3JpcHRDb21waWxlcjsKCi8qKiovIH0pLAovKiA1OCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlBvc3RTY3JpcHRQYXJzZXIgPSBleHBvcnRzLlBvc3RTY3JpcHRMZXhlciA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKY2xhc3MgUG9zdFNjcmlwdFBhcnNlciB7CiAgY29uc3RydWN0b3IobGV4ZXIpIHsKICAgIHRoaXMubGV4ZXIgPSBsZXhlcjsKICAgIHRoaXMub3BlcmF0b3JzID0gW107CiAgICB0aGlzLnRva2VuID0gbnVsbDsKICAgIHRoaXMucHJldiA9IG51bGw7CiAgfQogIG5leHRUb2tlbigpIHsKICAgIHRoaXMucHJldiA9IHRoaXMudG9rZW47CiAgICB0aGlzLnRva2VuID0gdGhpcy5sZXhlci5nZXRUb2tlbigpOwogIH0KICBhY2NlcHQodHlwZSkgewogICAgaWYgKHRoaXMudG9rZW4udHlwZSA9PT0gdHlwZSkgewogICAgICB0aGlzLm5leHRUb2tlbigpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgZXhwZWN0KHR5cGUpIHsKICAgIGlmICh0aGlzLmFjY2VwdCh0eXBlKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5leHBlY3RlZCBzeW1ib2w6IGZvdW5kICR7dGhpcy50b2tlbi50eXBlfSBleHBlY3RlZCAke3R5cGV9LmApOwogIH0KICBwYXJzZSgpIHsKICAgIHRoaXMubmV4dFRva2VuKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzOwogIH0KICBwYXJzZUJsb2NrKCkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLk5VTUJFUikpIHsKICAgICAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKHRoaXMucHJldi52YWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5hY2NlcHQoUG9zdFNjcmlwdFRva2VuVHlwZXMuT1BFUkFUT1IpKSB7CiAgICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaCh0aGlzLnByZXYudmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLkxCUkFDRSkpIHsKICAgICAgICB0aGlzLnBhcnNlQ29uZGl0aW9uKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlQ29uZGl0aW9uKCkgewogICAgY29uc3QgY29uZGl0aW9uTG9jYXRpb24gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICB0aGlzLm9wZXJhdG9ycy5wdXNoKG51bGwsIG51bGwpOwogICAgdGhpcy5wYXJzZUJsb2NrKCk7CiAgICB0aGlzLmV4cGVjdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UpOwogICAgaWYgKHRoaXMuYWNjZXB0KFBvc3RTY3JpcHRUb2tlblR5cGVzLklGKSkgewogICAgICB0aGlzLm9wZXJhdG9yc1tjb25kaXRpb25Mb2NhdGlvbl0gPSB0aGlzLm9wZXJhdG9ycy5sZW5ndGg7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uICsgMV0gPSAianoiOwogICAgfSBlbHNlIGlmICh0aGlzLmFjY2VwdChQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UpKSB7CiAgICAgIGNvbnN0IGp1bXBMb2NhdGlvbiA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnMucHVzaChudWxsLCBudWxsKTsKICAgICAgY29uc3QgZW5kT2ZUcnVlID0gdGhpcy5vcGVyYXRvcnMubGVuZ3RoOwogICAgICB0aGlzLnBhcnNlQmxvY2soKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuUkJSQUNFKTsKICAgICAgdGhpcy5leHBlY3QoUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFKTsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uXSA9IHRoaXMub3BlcmF0b3JzLmxlbmd0aDsKICAgICAgdGhpcy5vcGVyYXRvcnNbanVtcExvY2F0aW9uICsgMV0gPSAiaiI7CiAgICAgIHRoaXMub3BlcmF0b3JzW2NvbmRpdGlvbkxvY2F0aW9uXSA9IGVuZE9mVHJ1ZTsKICAgICAgdGhpcy5vcGVyYXRvcnNbY29uZGl0aW9uTG9jYXRpb24gKyAxXSA9ICJqeiI7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBTIEZ1bmN0aW9uOiBlcnJvciBwYXJzaW5nIGNvbmRpdGlvbmFsLiIpOwogICAgfQogIH0KfQpleHBvcnRzLlBvc3RTY3JpcHRQYXJzZXIgPSBQb3N0U2NyaXB0UGFyc2VyOwpjb25zdCBQb3N0U2NyaXB0VG9rZW5UeXBlcyA9IHsKICBMQlJBQ0U6IDAsCiAgUkJSQUNFOiAxLAogIE5VTUJFUjogMiwKICBPUEVSQVRPUjogMywKICBJRjogNCwKICBJRkVMU0U6IDUKfTsKY2xhc3MgUG9zdFNjcmlwdFRva2VuIHsKICBzdGF0aWMgZ2V0IG9wQ2FjaGUoKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm9wQ2FjaGUiLCBPYmplY3QuY3JlYXRlKG51bGwpKTsKICB9CiAgY29uc3RydWN0b3IodHlwZSwgdmFsdWUpIHsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgfQogIHN0YXRpYyBnZXRPcGVyYXRvcihvcCkgewogICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5vcENhY2hlW29wXSB8fD0gbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5PUEVSQVRPUiwgb3ApOwogIH0KICBzdGF0aWMgZ2V0IExCUkFDRSgpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiTEJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5MQlJBQ0UsICJ7IikpOwogIH0KICBzdGF0aWMgZ2V0IFJCUkFDRSgpIHsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiUkJSQUNFIiwgbmV3IFBvc3RTY3JpcHRUb2tlbihQb3N0U2NyaXB0VG9rZW5UeXBlcy5SQlJBQ0UsICJ9IikpOwogIH0KICBzdGF0aWMgZ2V0IElGKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJJRiIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUYsICJJRiIpKTsKICB9CiAgc3RhdGljIGdldCBJRkVMU0UoKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIklGRUxTRSIsIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuSUZFTFNFLCAiSUZFTFNFIikpOwogIH0KfQpjbGFzcyBQb3N0U2NyaXB0TGV4ZXIgewogIGNvbnN0cnVjdG9yKHN0cmVhbSkgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLm5leHRDaGFyKCk7CiAgICB0aGlzLnN0ckJ1ZiA9IFtdOwogIH0KICBuZXh0Q2hhcigpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRDaGFyID0gdGhpcy5zdHJlYW0uZ2V0Qnl0ZSgpOwogIH0KICBnZXRUb2tlbigpIHsKICAgIGxldCBjb21tZW50ID0gZmFsc2U7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKGNoIDwgMCkgewogICAgICAgIHJldHVybiBfcHJpbWl0aXZlcy5FT0Y7CiAgICAgIH0KICAgICAgaWYgKGNvbW1lbnQpIHsKICAgICAgICBpZiAoY2ggPT09IDB4MGEgfHwgY2ggPT09IDB4MGQpIHsKICAgICAgICAgIGNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjUpIHsKICAgICAgICBjb21tZW50ID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICghKDAsIF9jb3JlX3V0aWxzLmlzV2hpdGVTcGFjZSkoY2gpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2ggPSB0aGlzLm5leHRDaGFyKCk7CiAgICB9CiAgICBzd2l0Y2ggKGNoIHwgMCkgewogICAgICBjYXNlIDB4MzA6CiAgICAgIGNhc2UgMHgzMToKICAgICAgY2FzZSAweDMyOgogICAgICBjYXNlIDB4MzM6CiAgICAgIGNhc2UgMHgzNDoKICAgICAgY2FzZSAweDM1OgogICAgICBjYXNlIDB4MzY6CiAgICAgIGNhc2UgMHgzNzoKICAgICAgY2FzZSAweDM4OgogICAgICBjYXNlIDB4Mzk6CiAgICAgIGNhc2UgMHgyYjoKICAgICAgY2FzZSAweDJkOgogICAgICBjYXNlIDB4MmU6CiAgICAgICAgcmV0dXJuIG5ldyBQb3N0U2NyaXB0VG9rZW4oUG9zdFNjcmlwdFRva2VuVHlwZXMuTlVNQkVSLCB0aGlzLmdldE51bWJlcigpKTsKICAgICAgY2FzZSAweDdiOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLkxCUkFDRTsKICAgICAgY2FzZSAweDdkOgogICAgICAgIHRoaXMubmV4dENoYXIoKTsKICAgICAgICByZXR1cm4gUG9zdFNjcmlwdFRva2VuLlJCUkFDRTsKICAgIH0KICAgIGNvbnN0IHN0ckJ1ZiA9IHRoaXMuc3RyQnVmOwogICAgc3RyQnVmLmxlbmd0aCA9IDA7CiAgICBzdHJCdWZbMF0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTsKICAgIHdoaWxlICgoY2ggPSB0aGlzLm5leHRDaGFyKCkpID49IDAgJiYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1YSB8fCBjaCA+PSAweDYxICYmIGNoIDw9IDB4N2EpKSB7CiAgICAgIHN0ckJ1Zi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKTsKICAgIH0KICAgIGNvbnN0IHN0ciA9IHN0ckJ1Zi5qb2luKCIiKTsKICAgIHN3aXRjaCAoc3RyLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgY2FzZSAiaWYiOgogICAgICAgIHJldHVybiBQb3N0U2NyaXB0VG9rZW4uSUY7CiAgICAgIGNhc2UgImlmZWxzZSI6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5JRkVMU0U7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFBvc3RTY3JpcHRUb2tlbi5nZXRPcGVyYXRvcihzdHIpOwogICAgfQogIH0KICBnZXROdW1iZXIoKSB7CiAgICBsZXQgY2ggPSB0aGlzLmN1cnJlbnRDaGFyOwogICAgY29uc3Qgc3RyQnVmID0gdGhpcy5zdHJCdWY7CiAgICBzdHJCdWYubGVuZ3RoID0gMDsKICAgIHN0ckJ1ZlswXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgd2hpbGUgKChjaCA9IHRoaXMubmV4dENoYXIoKSkgPj0gMCkgewogICAgICBpZiAoY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8IGNoID09PSAweDJkIHx8IGNoID09PSAweDJlKSB7CiAgICAgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3RyQnVmLmpvaW4oIiIpKTsKICAgIGlmIChpc05hTih2YWx1ZSkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGZsb2F0aW5nIHBvaW50IG51bWJlcjogJHt2YWx1ZX1gKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKICB9Cn0KZXhwb3J0cy5Qb3N0U2NyaXB0TGV4ZXIgPSBQb3N0U2NyaXB0TGV4ZXI7CgovKioqLyB9KSwKLyogNTkgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5SZWdpb25hbEltYWdlQ2FjaGUgPSBleHBvcnRzLkxvY2FsVGlsaW5nUGF0dGVybkNhY2hlID0gZXhwb3J0cy5Mb2NhbEltYWdlQ2FjaGUgPSBleHBvcnRzLkxvY2FsR1N0YXRlQ2FjaGUgPSBleHBvcnRzLkxvY2FsRnVuY3Rpb25DYWNoZSA9IGV4cG9ydHMuTG9jYWxDb2xvclNwYWNlQ2FjaGUgPSBleHBvcnRzLkdsb2JhbEltYWdlQ2FjaGUgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CmNsYXNzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUxvY2FsQ2FjaGUpIHsKICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQ2Fubm90IGluaXRpYWxpemUgQmFzZUxvY2FsQ2FjaGUuIik7CiAgICB9CiAgICB0aGlzLl9vbmx5UmVmcyA9IG9wdGlvbnM/Lm9ubHlSZWZzID09PSB0cnVlOwogICAgaWYgKCF0aGlzLl9vbmx5UmVmcykgewogICAgICB0aGlzLl9uYW1lUmVmTWFwID0gbmV3IE1hcCgpOwogICAgICB0aGlzLl9pbWFnZU1hcCA9IG5ldyBNYXAoKTsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKICB9CiAgZ2V0QnlOYW1lKG5hbWUpIHsKICAgIGlmICh0aGlzLl9vbmx5UmVmcykgewogICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJTaG91bGQgbm90IGNhbGwgYGdldEJ5TmFtZWAgbWV0aG9kLiIpOwogICAgfQogICAgY29uc3QgcmVmID0gdGhpcy5fbmFtZVJlZk1hcC5nZXQobmFtZSk7CiAgICBpZiAocmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEJ5UmVmKHJlZik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5faW1hZ2VNYXAuZ2V0KG5hbWUpIHx8IG51bGw7CiAgfQogIGdldEJ5UmVmKHJlZikgewogICAgcmV0dXJuIHRoaXMuX2ltYWdlQ2FjaGUuZ2V0KHJlZikgfHwgbnVsbDsKICB9CiAgc2V0KG5hbWUsIHJlZiwgZGF0YSkgewogICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKSgiQWJzdHJhY3QgbWV0aG9kIGBzZXRgIGNhbGxlZC4iKTsKICB9Cn0KY2xhc3MgTG9jYWxJbWFnZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lLCByZWYgPSBudWxsLCBkYXRhKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxJbWFnZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmIChyZWYpIHsKICAgICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlTWFwLmhhcyhuYW1lKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZU1hcC5zZXQobmFtZSwgZGF0YSk7CiAgfQp9CmV4cG9ydHMuTG9jYWxJbWFnZUNhY2hlID0gTG9jYWxJbWFnZUNhY2hlOwpjbGFzcyBMb2NhbENvbG9yU3BhY2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBzZXQobmFtZSA9IG51bGwsIHJlZiA9IG51bGwsIGRhdGEpIHsKICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gInN0cmluZyIgJiYgIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsQ29sb3JTcGFjZUNhY2hlLnNldCAtIGV4cGVjdGVkICJuYW1lIiBhbmQvb3IgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7CiAgICAgICAgdGhpcy5fbmFtZVJlZk1hcC5zZXQobmFtZSwgcmVmKTsKICAgICAgfQogICAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VNYXAuaGFzKG5hbWUpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlTWFwLnNldChuYW1lLCBkYXRhKTsKICB9Cn0KZXhwb3J0cy5Mb2NhbENvbG9yU3BhY2VDYWNoZSA9IExvY2FsQ29sb3JTcGFjZUNhY2hlOwpjbGFzcyBMb2NhbEZ1bmN0aW9uQ2FjaGUgZXh0ZW5kcyBCYXNlTG9jYWxDYWNoZSB7CiAgY29uc3RydWN0b3Iob3B0aW9ucykgewogICAgc3VwZXIoewogICAgICBvbmx5UmVmczogdHJ1ZQogICAgfSk7CiAgfQogIHNldChuYW1lID0gbnVsbCwgcmVmLCBkYXRhKSB7CiAgICBpZiAoIXJlZikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsRnVuY3Rpb25DYWNoZS5zZXQgLSBleHBlY3RlZCAicmVmIiBhcmd1bWVudC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQp9CmV4cG9ydHMuTG9jYWxGdW5jdGlvbkNhY2hlID0gTG9jYWxGdW5jdGlvbkNhY2hlOwpjbGFzcyBMb2NhbEdTdGF0ZUNhY2hlIGV4dGVuZHMgQmFzZUxvY2FsQ2FjaGUgewogIHNldChuYW1lLCByZWYgPSBudWxsLCBkYXRhKSB7CiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICJzdHJpbmciKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxHU3RhdGVDYWNoZS5zZXQgLSBleHBlY3RlZCAibmFtZSIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAocmVmKSB7CiAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX25hbWVSZWZNYXAuc2V0KG5hbWUsIHJlZik7CiAgICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZU1hcC5oYXMobmFtZSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VNYXAuc2V0KG5hbWUsIGRhdGEpOwogIH0KfQpleHBvcnRzLkxvY2FsR1N0YXRlQ2FjaGUgPSBMb2NhbEdTdGF0ZUNhY2hlOwpjbGFzcyBMb2NhbFRpbGluZ1BhdHRlcm5DYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGUuc2V0IC0gZXhwZWN0ZWQgInJlZiIgYXJndW1lbnQuJyk7CiAgICB9CiAgICBpZiAodGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9pbWFnZUNhY2hlLnB1dChyZWYsIGRhdGEpOwogIH0KfQpleHBvcnRzLkxvY2FsVGlsaW5nUGF0dGVybkNhY2hlID0gTG9jYWxUaWxpbmdQYXR0ZXJuQ2FjaGU7CmNsYXNzIFJlZ2lvbmFsSW1hZ2VDYWNoZSBleHRlbmRzIEJhc2VMb2NhbENhY2hlIHsKICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICBzdXBlcih7CiAgICAgIG9ubHlSZWZzOiB0cnVlCiAgICB9KTsKICB9CiAgc2V0KG5hbWUgPSBudWxsLCByZWYsIGRhdGEpIHsKICAgIGlmICghcmVmKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignUmVnaW9uYWxJbWFnZUNhY2hlLnNldCAtIGV4cGVjdGVkICJyZWYiIGFyZ3VtZW50LicpOwogICAgfQogICAgaWYgKHRoaXMuX2ltYWdlQ2FjaGUuaGFzKHJlZikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5faW1hZ2VDYWNoZS5wdXQocmVmLCBkYXRhKTsKICB9Cn0KZXhwb3J0cy5SZWdpb25hbEltYWdlQ2FjaGUgPSBSZWdpb25hbEltYWdlQ2FjaGU7CmNsYXNzIEdsb2JhbEltYWdlQ2FjaGUgewogIHN0YXRpYyBOVU1fUEFHRVNfVEhSRVNIT0xEID0gMjsKICBzdGF0aWMgTUlOX0lNQUdFU19UT19DQUNIRSA9IDEwOwogIHN0YXRpYyBNQVhfQllURV9TSVpFID0gNSAqIF91dGlsLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFOwogIGNvbnN0cnVjdG9yKCkgewogICAgdGhpcy5fcmVmQ2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKICAgIHRoaXMuX2ltYWdlQ2FjaGUgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0Q2FjaGUoKTsKICB9CiAgZ2V0IF9ieXRlU2l6ZSgpIHsKICAgIGxldCBieXRlU2l6ZSA9IDA7CiAgICBmb3IgKGNvbnN0IGltYWdlRGF0YSBvZiB0aGlzLl9pbWFnZUNhY2hlKSB7CiAgICAgIGJ5dGVTaXplICs9IGltYWdlRGF0YS5ieXRlU2l6ZTsKICAgIH0KICAgIHJldHVybiBieXRlU2l6ZTsKICB9CiAgZ2V0IF9jYWNoZUxpbWl0UmVhY2hlZCgpIHsKICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLnNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk1JTl9JTUFHRVNfVE9fQ0FDSEUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXMuX2J5dGVTaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5NQVhfQllURV9TSVpFKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KICBzaG91bGRDYWNoZShyZWYsIHBhZ2VJbmRleCkgewogICAgbGV0IHBhZ2VJbmRleFNldCA9IHRoaXMuX3JlZkNhY2hlLmdldChyZWYpOwogICAgaWYgKCFwYWdlSW5kZXhTZXQpIHsKICAgICAgcGFnZUluZGV4U2V0ID0gbmV3IFNldCgpOwogICAgICB0aGlzLl9yZWZDYWNoZS5wdXQocmVmLCBwYWdlSW5kZXhTZXQpOwogICAgfQogICAgcGFnZUluZGV4U2V0LmFkZChwYWdlSW5kZXgpOwogICAgaWYgKHBhZ2VJbmRleFNldC5zaXplIDwgR2xvYmFsSW1hZ2VDYWNoZS5OVU1fUEFHRVNfVEhSRVNIT0xEKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghdGhpcy5faW1hZ2VDYWNoZS5oYXMocmVmKSAmJiB0aGlzLl9jYWNoZUxpbWl0UmVhY2hlZCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgYWRkQnl0ZVNpemUocmVmLCBieXRlU2l6ZSkgewogICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQocmVmKTsKICAgIGlmICghaW1hZ2VEYXRhKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbWFnZURhdGEuYnl0ZVNpemUpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaW1hZ2VEYXRhLmJ5dGVTaXplID0gYnl0ZVNpemU7CiAgfQogIGdldERhdGEocmVmLCBwYWdlSW5kZXgpIHsKICAgIGNvbnN0IHBhZ2VJbmRleFNldCA9IHRoaXMuX3JlZkNhY2hlLmdldChyZWYpOwogICAgaWYgKCFwYWdlSW5kZXhTZXQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocGFnZUluZGV4U2V0LnNpemUgPCBHbG9iYWxJbWFnZUNhY2hlLk5VTV9QQUdFU19USFJFU0hPTEQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBpbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChyZWYpOwogICAgaWYgKCFpbWFnZURhdGEpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBwYWdlSW5kZXhTZXQuYWRkKHBhZ2VJbmRleCk7CiAgICByZXR1cm4gaW1hZ2VEYXRhOwogIH0KICBzZXREYXRhKHJlZiwgZGF0YSkgewogICAgaWYgKCF0aGlzLl9yZWZDYWNoZS5oYXMocmVmKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGV4cGVjdGVkICJzaG91bGRDYWNoZSIgdG8gaGF2ZSBiZWVuIGNhbGxlZC4nKTsKICAgIH0KICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhyZWYpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzLl9jYWNoZUxpbWl0UmVhY2hlZCkgewogICAgICAoMCwgX3V0aWwud2FybikoIkdsb2JhbEltYWdlQ2FjaGUuc2V0RGF0YSAtIGNhY2hlIGxpbWl0IHJlYWNoZWQuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUucHV0KHJlZiwgZGF0YSk7CiAgfQogIGNsZWFyKG9ubHlEYXRhID0gZmFsc2UpIHsKICAgIGlmICghb25seURhdGEpIHsKICAgICAgdGhpcy5fcmVmQ2FjaGUuY2xlYXIoKTsKICAgIH0KICAgIHRoaXMuX2ltYWdlQ2FjaGUuY2xlYXIoKTsKICB9Cn0KZXhwb3J0cy5HbG9iYWxJbWFnZUNhY2hlID0gR2xvYmFsSW1hZ2VDYWNoZTsKCi8qKiovIH0pLAovKiA2MCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLmJpZGkgPSBiaWRpOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpjb25zdCBiYXNlVHlwZXMgPSBbIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIlMiLCAiQiIsICJTIiwgIldTIiwgIkIiLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQiIsICJCIiwgIkIiLCAiUyIsICJXUyIsICJPTiIsICJPTiIsICJFVCIsICJFVCIsICJFVCIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJFUyIsICJDUyIsICJFUyIsICJDUyIsICJDUyIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJFTiIsICJDUyIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJPTiIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkJOIiwgIkIiLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQk4iLCAiQ1MiLCAiT04iLCAiRVQiLCAiRVQiLCAiRVQiLCAiRVQiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJPTiIsICJPTiIsICJCTiIsICJPTiIsICJPTiIsICJFVCIsICJFVCIsICJFTiIsICJFTiIsICJPTiIsICJMIiwgIk9OIiwgIk9OIiwgIk9OIiwgIkVOIiwgIkwiLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIk9OIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiT04iLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIiwgIkwiLCAiTCIsICJMIl07CmNvbnN0IGFyYWJpY1R5cGVzID0gWyJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJPTiIsICJPTiIsICJBTCIsICJFVCIsICJFVCIsICJBTCIsICJDUyIsICJBTCIsICJPTiIsICJPTiIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFMIiwgIkFMIiwgIiIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJBTiIsICJFVCIsICJBTiIsICJBTiIsICJBTCIsICJBTCIsICJBTCIsICJOU00iLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiQUwiLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFOIiwgIk9OIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFMIiwgIkFMIiwgIk5TTSIsICJOU00iLCAiT04iLCAiTlNNIiwgIk5TTSIsICJOU00iLCAiTlNNIiwgIkFMIiwgIkFMIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkVOIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIiwgIkFMIl07CmZ1bmN0aW9uIGlzT2RkKGkpIHsKICByZXR1cm4gKGkgJiAxKSAhPT0gMDsKfQpmdW5jdGlvbiBpc0V2ZW4oaSkgewogIHJldHVybiAoaSAmIDEpID09PSAwOwp9CmZ1bmN0aW9uIGZpbmRVbmVxdWFsKGFyciwgc3RhcnQsIHZhbHVlKSB7CiAgbGV0IGosIGpqOwogIGZvciAoaiA9IHN0YXJ0LCBqaiA9IGFyci5sZW5ndGg7IGogPCBqajsgKytqKSB7CiAgICBpZiAoYXJyW2pdICE9PSB2YWx1ZSkgewogICAgICByZXR1cm4gajsKICAgIH0KICB9CiAgcmV0dXJuIGo7Cn0KZnVuY3Rpb24gc2V0VmFsdWVzKGFyciwgc3RhcnQsIGVuZCwgdmFsdWUpIHsKICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBlbmQ7ICsraikgewogICAgYXJyW2pdID0gdmFsdWU7CiAgfQp9CmZ1bmN0aW9uIHJldmVyc2VWYWx1ZXMoYXJyLCBzdGFydCwgZW5kKSB7CiAgZm9yIChsZXQgaSA9IHN0YXJ0LCBqID0gZW5kIC0gMTsgaSA8IGo7ICsraSwgLS1qKSB7CiAgICBjb25zdCB0ZW1wID0gYXJyW2ldOwogICAgYXJyW2ldID0gYXJyW2pdOwogICAgYXJyW2pdID0gdGVtcDsKICB9Cn0KZnVuY3Rpb24gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwgPSBmYWxzZSkgewogIGxldCBkaXIgPSAibHRyIjsKICBpZiAodmVydGljYWwpIHsKICAgIGRpciA9ICJ0dGIiOwogIH0gZWxzZSBpZiAoIWlzTFRSKSB7CiAgICBkaXIgPSAicnRsIjsKICB9CiAgcmV0dXJuIHsKICAgIHN0ciwKICAgIGRpcgogIH07Cn0KY29uc3QgY2hhcnMgPSBbXTsKY29uc3QgdHlwZXMgPSBbXTsKZnVuY3Rpb24gYmlkaShzdHIsIHN0YXJ0TGV2ZWwgPSAtMSwgdmVydGljYWwgPSBmYWxzZSkgewogIGxldCBpc0xUUiA9IHRydWU7CiAgY29uc3Qgc3RyTGVuZ3RoID0gc3RyLmxlbmd0aDsKICBpZiAoc3RyTGVuZ3RoID09PSAwIHx8IHZlcnRpY2FsKSB7CiAgICByZXR1cm4gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUiwgdmVydGljYWwpOwogIH0KICBjaGFycy5sZW5ndGggPSBzdHJMZW5ndGg7CiAgdHlwZXMubGVuZ3RoID0gc3RyTGVuZ3RoOwogIGxldCBudW1CaWRpID0gMDsKICBsZXQgaSwgaWk7CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICBjaGFyc1tpXSA9IHN0ci5jaGFyQXQoaSk7CiAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgbGV0IGNoYXJUeXBlID0gIkwiOwogICAgaWYgKGNoYXJDb2RlIDw9IDB4MDBmZikgewogICAgICBjaGFyVHlwZSA9IGJhc2VUeXBlc1tjaGFyQ29kZV07CiAgICB9IGVsc2UgaWYgKDB4MDU5MCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA1ZjQpIHsKICAgICAgY2hhclR5cGUgPSAiUiI7CiAgICB9IGVsc2UgaWYgKDB4MDYwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA2ZmYpIHsKICAgICAgY2hhclR5cGUgPSBhcmFiaWNUeXBlc1tjaGFyQ29kZSAmIDB4ZmZdOwogICAgICBpZiAoIWNoYXJUeXBlKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJCaWRpOiBpbnZhbGlkIFVuaWNvZGUgY2hhcmFjdGVyICIgKyBjaGFyQ29kZS50b1N0cmluZygxNikpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKDB4MDcwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweDA4YWMgfHwgMHhmYjUwIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IDB4ZmRmZiB8fCAweGZlNzAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhmZWZmKSB7CiAgICAgIGNoYXJUeXBlID0gIkFMIjsKICAgIH0KICAgIGlmIChjaGFyVHlwZSA9PT0gIlIiIHx8IGNoYXJUeXBlID09PSAiQUwiIHx8IGNoYXJUeXBlID09PSAiQU4iKSB7CiAgICAgIG51bUJpZGkrKzsKICAgIH0KICAgIHR5cGVzW2ldID0gY2hhclR5cGU7CiAgfQogIGlmIChudW1CaWRpID09PSAwKSB7CiAgICBpc0xUUiA9IHRydWU7CiAgICByZXR1cm4gY3JlYXRlQmlkaVRleHQoc3RyLCBpc0xUUik7CiAgfQogIGlmIChzdGFydExldmVsID09PSAtMSkgewogICAgaWYgKG51bUJpZGkgLyBzdHJMZW5ndGggPCAwLjMgJiYgc3RyTGVuZ3RoID4gNCkgewogICAgICBpc0xUUiA9IHRydWU7CiAgICAgIHN0YXJ0TGV2ZWwgPSAwOwogICAgfSBlbHNlIHsKICAgICAgaXNMVFIgPSBmYWxzZTsKICAgICAgc3RhcnRMZXZlbCA9IDE7CiAgICB9CiAgfQogIGNvbnN0IGxldmVscyA9IFtdOwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgbGV2ZWxzW2ldID0gc3RhcnRMZXZlbDsKICB9CiAgY29uc3QgZSA9IGlzT2RkKHN0YXJ0TGV2ZWwpID8gIlIiIDogIkwiOwogIGNvbnN0IHNvciA9IGU7CiAgY29uc3QgZW9yID0gc29yOwogIGxldCBsYXN0VHlwZSA9IHNvcjsKICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIk5TTSIpIHsKICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZTsKICAgIH0gZWxzZSB7CiAgICAgIGxhc3RUeXBlID0gdHlwZXNbaV07CiAgICB9CiAgfQogIGxhc3RUeXBlID0gc29yOwogIGxldCB0OwogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJFTiIpIHsKICAgICAgdHlwZXNbaV0gPSBsYXN0VHlwZSA9PT0gIkFMIiA/ICJBTiIgOiAiRU4iOwogICAgfSBlbHNlIGlmICh0ID09PSAiUiIgfHwgdCA9PT0gIkwiIHx8IHQgPT09ICJBTCIpIHsKICAgICAgbGFzdFR5cGUgPSB0OwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIHQgPSB0eXBlc1tpXTsKICAgIGlmICh0ID09PSAiQUwiKSB7CiAgICAgIHR5cGVzW2ldID0gIlIiOwogICAgfQogIH0KICBmb3IgKGkgPSAxOyBpIDwgc3RyTGVuZ3RoIC0gMTsgKytpKSB7CiAgICBpZiAodHlwZXNbaV0gPT09ICJFUyIgJiYgdHlwZXNbaSAtIDFdID09PSAiRU4iICYmIHR5cGVzW2kgKyAxXSA9PT0gIkVOIikgewogICAgICB0eXBlc1tpXSA9ICJFTiI7CiAgICB9CiAgICBpZiAodHlwZXNbaV0gPT09ICJDUyIgJiYgKHR5cGVzW2kgLSAxXSA9PT0gIkVOIiB8fCB0eXBlc1tpIC0gMV0gPT09ICJBTiIpICYmIHR5cGVzW2kgKyAxXSA9PT0gdHlwZXNbaSAtIDFdKSB7CiAgICAgIHR5cGVzW2ldID0gdHlwZXNbaSAtIDFdOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIkVOIikgewogICAgICBmb3IgKGxldCBqID0gaSAtIDE7IGogPj0gMDsgLS1qKSB7CiAgICAgICAgaWYgKHR5cGVzW2pdICE9PSAiRVQiKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdHlwZXNbal0gPSAiRU4iOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHN0ckxlbmd0aDsgKytqKSB7CiAgICAgICAgaWYgKHR5cGVzW2pdICE9PSAiRVQiKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgdHlwZXNbal0gPSAiRU4iOwogICAgICB9CiAgICB9CiAgfQogIGZvciAoaSA9IDA7IGkgPCBzdHJMZW5ndGg7ICsraSkgewogICAgdCA9IHR5cGVzW2ldOwogICAgaWYgKHQgPT09ICJXUyIgfHwgdCA9PT0gIkVTIiB8fCB0ID09PSAiRVQiIHx8IHQgPT09ICJDUyIpIHsKICAgICAgdHlwZXNbaV0gPSAiT04iOwogICAgfQogIH0KICBsYXN0VHlwZSA9IHNvcjsKICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIHQgPSB0eXBlc1tpXTsKICAgIGlmICh0ID09PSAiRU4iKSB7CiAgICAgIHR5cGVzW2ldID0gbGFzdFR5cGUgPT09ICJMIiA/ICJMIiA6ICJFTiI7CiAgICB9IGVsc2UgaWYgKHQgPT09ICJSIiB8fCB0ID09PSAiTCIpIHsKICAgICAgbGFzdFR5cGUgPSB0OwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIGlmICh0eXBlc1tpXSA9PT0gIk9OIikgewogICAgICBjb25zdCBlbmQgPSBmaW5kVW5lcXVhbCh0eXBlcywgaSArIDEsICJPTiIpOwogICAgICBsZXQgYmVmb3JlID0gc29yOwogICAgICBpZiAoaSA+IDApIHsKICAgICAgICBiZWZvcmUgPSB0eXBlc1tpIC0gMV07CiAgICAgIH0KICAgICAgbGV0IGFmdGVyID0gZW9yOwogICAgICBpZiAoZW5kICsgMSA8IHN0ckxlbmd0aCkgewogICAgICAgIGFmdGVyID0gdHlwZXNbZW5kICsgMV07CiAgICAgIH0KICAgICAgaWYgKGJlZm9yZSAhPT0gIkwiKSB7CiAgICAgICAgYmVmb3JlID0gIlIiOwogICAgICB9CiAgICAgIGlmIChhZnRlciAhPT0gIkwiKSB7CiAgICAgICAgYWZ0ZXIgPSAiUiI7CiAgICAgIH0KICAgICAgaWYgKGJlZm9yZSA9PT0gYWZ0ZXIpIHsKICAgICAgICBzZXRWYWx1ZXModHlwZXMsIGksIGVuZCwgYmVmb3JlKTsKICAgICAgfQogICAgICBpID0gZW5kIC0gMTsKICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IHN0ckxlbmd0aDsgKytpKSB7CiAgICBpZiAodHlwZXNbaV0gPT09ICJPTiIpIHsKICAgICAgdHlwZXNbaV0gPSBlOwogICAgfQogIH0KICBmb3IgKGkgPSAwOyBpIDwgc3RyTGVuZ3RoOyArK2kpIHsKICAgIHQgPSB0eXBlc1tpXTsKICAgIGlmIChpc0V2ZW4obGV2ZWxzW2ldKSkgewogICAgICBpZiAodCA9PT0gIlIiKSB7CiAgICAgICAgbGV2ZWxzW2ldICs9IDE7CiAgICAgIH0gZWxzZSBpZiAodCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CiAgICAgICAgbGV2ZWxzW2ldICs9IDI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICh0ID09PSAiTCIgfHwgdCA9PT0gIkFOIiB8fCB0ID09PSAiRU4iKSB7CiAgICAgICAgbGV2ZWxzW2ldICs9IDE7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IGhpZ2hlc3RMZXZlbCA9IC0xOwogIGxldCBsb3dlc3RPZGRMZXZlbCA9IDk5OwogIGxldCBsZXZlbDsKICBmb3IgKGkgPSAwLCBpaSA9IGxldmVscy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICBsZXZlbCA9IGxldmVsc1tpXTsKICAgIGlmIChoaWdoZXN0TGV2ZWwgPCBsZXZlbCkgewogICAgICBoaWdoZXN0TGV2ZWwgPSBsZXZlbDsKICAgIH0KICAgIGlmIChsb3dlc3RPZGRMZXZlbCA+IGxldmVsICYmIGlzT2RkKGxldmVsKSkgewogICAgICBsb3dlc3RPZGRMZXZlbCA9IGxldmVsOwogICAgfQogIH0KICBmb3IgKGxldmVsID0gaGlnaGVzdExldmVsOyBsZXZlbCA+PSBsb3dlc3RPZGRMZXZlbDsgLS1sZXZlbCkgewogICAgbGV0IHN0YXJ0ID0gLTE7CiAgICBmb3IgKGkgPSAwLCBpaSA9IGxldmVscy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICAgIGlmIChsZXZlbHNbaV0gPCBsZXZlbCkgewogICAgICAgIGlmIChzdGFydCA+PSAwKSB7CiAgICAgICAgICByZXZlcnNlVmFsdWVzKGNoYXJzLCBzdGFydCwgaSk7CiAgICAgICAgICBzdGFydCA9IC0xOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHsKICAgICAgICBzdGFydCA9IGk7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydCA+PSAwKSB7CiAgICAgIHJldmVyc2VWYWx1ZXMoY2hhcnMsIHN0YXJ0LCBsZXZlbHMubGVuZ3RoKTsKICAgIH0KICB9CiAgZm9yIChpID0gMCwgaWkgPSBjaGFycy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7CiAgICBjb25zdCBjaCA9IGNoYXJzW2ldOwogICAgaWYgKGNoID09PSAiPCIgfHwgY2ggPT09ICI+IikgewogICAgICBjaGFyc1tpXSA9ICIiOwogICAgfQogIH0KICByZXR1cm4gY3JlYXRlQmlkaVRleHQoY2hhcnMuam9pbigiIiksIGlzTFRSKTsKfQoKLyoqKi8gfSksCi8qIDYxICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuZ2V0Rm9udFN1YnN0aXR1dGlvbiA9IGdldEZvbnRTdWJzdGl0dXRpb247CnZhciBfZm9udHNfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM4KTsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKY29uc3QgTk9STUFMID0gewogIHN0eWxlOiAibm9ybWFsIiwKICB3ZWlnaHQ6ICJub3JtYWwiCn07CmNvbnN0IEJPTEQgPSB7CiAgc3R5bGU6ICJub3JtYWwiLAogIHdlaWdodDogImJvbGQiCn07CmNvbnN0IElUQUxJQyA9IHsKICBzdHlsZTogIml0YWxpYyIsCiAgd2VpZ2h0OiAibm9ybWFsIgp9Owpjb25zdCBCT0xESVRBTElDID0gewogIHN0eWxlOiAiaXRhbGljIiwKICB3ZWlnaHQ6ICJib2xkIgp9Owpjb25zdCBzdWJzdGl0dXRpb25NYXAgPSBuZXcgTWFwKFtbIlRpbWVzLVJvbWFuIiwgewogIGxvY2FsOiBbIlRpbWVzIE5ldyBSb21hbiIsICJUaW1lcy1Sb21hbiIsICJUaW1lcyIsICJMaWJlcmF0aW9uIFNlcmlmIiwgIk5pbWJ1cyBSb21hbiIsICJOaW1idXMgUm9tYW4gTCIsICJUaW5vcyIsICJUaG9ybmRhbGUiLCAiVGVYIEd5cmUgVGVybWVzIiwgIkZyZWVTZXJpZiIsICJEZWphVnUgU2VyaWYiLCAiQml0c3RyZWFtIFZlcmEgU2VyaWYiLCAiVWJ1bnR1Il0sCiAgc3R5bGU6IE5PUk1BTCwKICB1bHRpbWF0ZTogInNlcmlmIgp9XSwgWyJUaW1lcy1Cb2xkIiwgewogIGFsaWFzOiAiVGltZXMtUm9tYW4iLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUl0YWxpYyIsIHsKICBhbGlhczogIlRpbWVzLVJvbWFuIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAic2VyaWYiCn1dLCBbIlRpbWVzLUJvbGRJdGFsaWMiLCB7CiAgYWxpYXM6ICJUaW1lcy1Sb21hbiIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgdWx0aW1hdGU6ICJzZXJpZiIKfV0sIFsiSGVsdmV0aWNhIiwgewogIGxvY2FsOiBbIkhlbHZldGljYSIsICJIZWx2ZXRpY2EgTmV1ZSIsICJBcmlhbCIsICJBcmlhbCBOb3ZhIiwgIkxpYmVyYXRpb24gU2FucyIsICJBcmltbyIsICJOaW1idXMgU2FucyIsICJOaW1idXMgU2FucyBMIiwgIkEwMzAiLCAiVGVYIEd5cmUgSGVyb3MiLCAiRnJlZVNhbnMiLCAiRGVqYVZ1IFNhbnMiLCAiQWxiYW55IiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCAiQXJpYWwgVW5pY29kZSBNUyIsICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsICJBcHBsZSBTeW1ib2xzIiwgIkNhbnRhcmVsbCJdLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1SZWd1bGFyLnR0ZiIsCiAgc3R5bGU6IE5PUk1BTCwKICB1bHRpbWF0ZTogInNhbnMtc2VyaWYiCn1dLCBbIkhlbHZldGljYS1Cb2xkIiwgewogIGFsaWFzOiAiSGVsdmV0aWNhIiwKICBwYXRoOiAiTGliZXJhdGlvblNhbnMtQm9sZC50dGYiLAogIHN0eWxlOiBCT0xELAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLU9ibGlxdWUiLCB7CiAgYWxpYXM6ICJIZWx2ZXRpY2EiLAogIHBhdGg6ICJMaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmIiwKICBzdHlsZTogSVRBTElDLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwgewogIGFsaWFzOiAiSGVsdmV0aWNhIiwKICBwYXRoOiAiTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYiLAogIHN0eWxlOiBCT0xESVRBTElDLAogIHVsdGltYXRlOiAic2Fucy1zZXJpZiIKfV0sIFsiQ291cmllciIsIHsKICBsb2NhbDogWyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3IiwgIkxpYmVyYXRpb24gTW9ubyIsICJOaW1idXMgTW9ubyIsICJOaW1idXMgTW9ubyBMIiwgIkNvdXNpbmUiLCAiQ3VtYmVybGFuZCIsICJUZVggR3lyZSBDdXJzb3IiLCAiRnJlZU1vbm8iXSwKICBzdHlsZTogTk9STUFMLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJDb3VyaWVyLUJvbGQiLCB7CiAgYWxpYXM6ICJDb3VyaWVyIiwKICBzdHlsZTogQk9MRCwKICB1bHRpbWF0ZTogIm1vbm9zcGFjZSIKfV0sIFsiQ291cmllci1PYmxpcXVlIiwgewogIGFsaWFzOiAiQ291cmllciIsCiAgc3R5bGU6IElUQUxJQywKICB1bHRpbWF0ZTogIm1vbm9zcGFjZSIKfV0sIFsiQ291cmllci1Cb2xkT2JsaXF1ZSIsIHsKICBhbGlhczogIkNvdXJpZXIiLAogIHN0eWxlOiBCT0xESVRBTElDLAogIHVsdGltYXRlOiAibW9ub3NwYWNlIgp9XSwgWyJBcmlhbEJsYWNrIiwgewogIGxvY2FsOiBbIkFyaWFsIEJsYWNrIl0sCiAgc3R5bGU6IHsKICAgIHN0eWxlOiAibm9ybWFsIiwKICAgIHdlaWdodDogIjkwMCIKICB9LAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGQiCn1dLCBbIkFyaWFsQmxhY2stQm9sZCIsIHsKICBhbGlhczogIkFyaWFsQmxhY2siCn1dLCBbIkFyaWFsQmxhY2stSXRhbGljIiwgewogIGFsaWFzOiAiQXJpYWxCbGFjayIsCiAgc3R5bGU6IHsKICAgIHN0eWxlOiAiaXRhbGljIiwKICAgIHdlaWdodDogIjkwMCIKICB9LAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIgp9XSwgWyJBcmlhbEJsYWNrLUJvbGRJdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbEJsYWNrLUl0YWxpYyIKfV0sIFsiQXJpYWxOYXJyb3ciLCB7CiAgbG9jYWw6IFsiQXJpYWwgTmFycm93IiwgIkxpYmVyYXRpb24gU2FucyBOYXJyb3ciLCAiSGVsdmV0aWNhIENvbmRlbnNlZCIsICJOaW1idXMgU2FucyBOYXJyb3ciLCAiVGVYIEd5cmUgSGVyb3MgQ24iXSwKICBzdHlsZTogTk9STUFMLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhIgp9XSwgWyJBcmlhbE5hcnJvdy1Cb2xkIiwgewogIGFsaWFzOiAiQXJpYWxOYXJyb3ciLAogIHN0eWxlOiBCT0xELAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGQiCn1dLCBbIkFyaWFsTmFycm93LUl0YWxpYyIsIHsKICBhbGlhczogIkFyaWFsTmFycm93IiwKICBzdHlsZTogSVRBTElDLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLU9ibGlxdWUiCn1dLCBbIkFyaWFsTmFycm93LUJvbGRJdGFsaWMiLCB7CiAgYWxpYXM6ICJBcmlhbE5hcnJvdyIsCiAgc3R5bGU6IEJPTERJVEFMSUMsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiCn1dLCBbIkNhbGlicmkiLCB7CiAgbG9jYWw6IFsiQ2FsaWJyaSIsICJDYXJsaXRvIl0sCiAgc3R5bGU6IE5PUk1BTCwKICBmYWxsYmFjazogIkhlbHZldGljYSIKfV0sIFsiQ2FsaWJyaS1Cb2xkIiwgewogIGFsaWFzOiAiQ2FsaWJyaSIsCiAgc3R5bGU6IEJPTEQsCiAgZmFsbGJhY2s6ICJIZWx2ZXRpY2EtQm9sZCIKfV0sIFsiQ2FsaWJyaS1JdGFsaWMiLCB7CiAgYWxpYXM6ICJDYWxpYnJpIiwKICBzdHlsZTogSVRBTElDLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLU9ibGlxdWUiCn1dLCBbIkNhbGlicmktQm9sZEl0YWxpYyIsIHsKICBhbGlhczogIkNhbGlicmkiLAogIHN0eWxlOiBCT0xESVRBTElDLAogIGZhbGxiYWNrOiAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIgp9XSwgWyJXaW5nZGluZ3MiLCB7CiAgbG9jYWw6IFsiV2luZ2RpbmdzIiwgIlVSVyBEaW5nYmF0cyJdLAogIHN0eWxlOiBOT1JNQUwKfV0sIFsiV2luZ2RpbmdzLVJlZ3VsYXIiLCB7CiAgYWxpYXM6ICJXaW5nZGluZ3MiCn1dLCBbIldpbmdkaW5ncy1Cb2xkIiwgewogIGFsaWFzOiAiV2luZ2RpbmdzIgp9XV0pOwpjb25zdCBmb250QWxpYXNlcyA9IG5ldyBNYXAoW1siQXJpYWwtQmxhY2siLCAiQXJpYWxCbGFjayJdXSk7CmZ1bmN0aW9uIGdldFN0eWxlVG9BcHBlbmQoc3R5bGUpIHsKICBzd2l0Y2ggKHN0eWxlKSB7CiAgICBjYXNlIEJPTEQ6CiAgICAgIHJldHVybiAiQm9sZCI7CiAgICBjYXNlIElUQUxJQzoKICAgICAgcmV0dXJuICJJdGFsaWMiOwogICAgY2FzZSBCT0xESVRBTElDOgogICAgICByZXR1cm4gIkJvbGQgSXRhbGljIjsKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChzdHlsZT8ud2VpZ2h0ID09PSAiYm9sZCIpIHsKICAgICAgICByZXR1cm4gIkJvbGQiOwogICAgICB9CiAgICAgIGlmIChzdHlsZT8uc3R5bGUgPT09ICJpdGFsaWMiKSB7CiAgICAgICAgcmV0dXJuICJJdGFsaWMiOwogICAgICB9CiAgfQogIHJldHVybiAiIjsKfQpmdW5jdGlvbiBnZW5lcmF0ZUZvbnQoewogIGFsaWFzLAogIGxvY2FsLAogIHBhdGgsCiAgZmFsbGJhY2ssCiAgc3R5bGUsCiAgdWx0aW1hdGUKfSwgc3JjLCBsb2NhbEZvbnRQYXRoLCB1c2VGYWxsYmFjayA9IHRydWUsIHVzZVBhdGggPSB0cnVlLCBhcHBlbmQgPSAiIikgewogIGNvbnN0IHJlc3VsdCA9IHsKICAgIHN0eWxlOiBudWxsLAogICAgdWx0aW1hdGU6IG51bGwKICB9OwogIGlmIChsb2NhbCkgewogICAgY29uc3QgZXh0cmEgPSBhcHBlbmQgPyBgICR7YXBwZW5kfWAgOiAiIjsKICAgIGZvciAoY29uc3QgbmFtZSBvZiBsb2NhbCkgewogICAgICBzcmMucHVzaChgbG9jYWwoJHtuYW1lfSR7ZXh0cmF9KWApOwogICAgfQogIH0KICBpZiAoYWxpYXMpIHsKICAgIGNvbnN0IHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoYWxpYXMpOwogICAgY29uc3QgYWxpYXNBcHBlbmQgPSBhcHBlbmQgfHwgZ2V0U3R5bGVUb0FwcGVuZChzdHlsZSk7CiAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgZ2VuZXJhdGVGb250KHN1YnN0aXR1dGlvbiwgc3JjLCBsb2NhbEZvbnRQYXRoLCB1c2VGYWxsYmFjayAmJiAhZmFsbGJhY2ssIHVzZVBhdGggJiYgIXBhdGgsIGFsaWFzQXBwZW5kKSk7CiAgfQogIGlmIChzdHlsZSkgewogICAgcmVzdWx0LnN0eWxlID0gc3R5bGU7CiAgfQogIGlmICh1bHRpbWF0ZSkgewogICAgcmVzdWx0LnVsdGltYXRlID0gdWx0aW1hdGU7CiAgfQogIGlmICh1c2VGYWxsYmFjayAmJiBmYWxsYmFjaykgewogICAgY29uc3QgZmFsbGJhY2tJbmZvID0gc3Vic3RpdHV0aW9uTWFwLmdldChmYWxsYmFjayk7CiAgICBjb25zdCB7CiAgICAgIHVsdGltYXRlOiBmYWxsYmFja1VsdGltYXRlCiAgICB9ID0gZ2VuZXJhdGVGb250KGZhbGxiYWNrSW5mbywgc3JjLCBsb2NhbEZvbnRQYXRoLCB1c2VGYWxsYmFjaywgdXNlUGF0aCAmJiAhcGF0aCwgYXBwZW5kKTsKICAgIHJlc3VsdC51bHRpbWF0ZSB8fD0gZmFsbGJhY2tVbHRpbWF0ZTsKICB9CiAgaWYgKHVzZVBhdGggJiYgcGF0aCAmJiBsb2NhbEZvbnRQYXRoKSB7CiAgICBzcmMucHVzaChgdXJsKCR7bG9jYWxGb250UGF0aH0ke3BhdGh9KWApOwogIH0KICByZXR1cm4gcmVzdWx0Owp9CmZ1bmN0aW9uIGdldEZvbnRTdWJzdGl0dXRpb24oc3lzdGVtRm9udENhY2hlLCBpZEZhY3RvcnksIGxvY2FsRm9udFBhdGgsIGJhc2VGb250TmFtZSwgc3RhbmRhcmRGb250TmFtZSkgewogIGJhc2VGb250TmFtZSA9ICgwLCBfZm9udHNfdXRpbHMubm9ybWFsaXplRm9udE5hbWUpKGJhc2VGb250TmFtZSk7CiAgY29uc3Qga2V5ID0gYmFzZUZvbnROYW1lOwogIGxldCBzdWJzdGl0dXRpb25JbmZvID0gc3lzdGVtRm9udENhY2hlLmdldChrZXkpOwogIGlmIChzdWJzdGl0dXRpb25JbmZvKSB7CiAgICByZXR1cm4gc3Vic3RpdHV0aW9uSW5mbzsKICB9CiAgbGV0IHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbk1hcC5nZXQoYmFzZUZvbnROYW1lKTsKICBpZiAoIXN1YnN0aXR1dGlvbikgewogICAgZm9yIChjb25zdCBbYWxpYXMsIHN1YnN0XSBvZiBmb250QWxpYXNlcykgewogICAgICBpZiAoYmFzZUZvbnROYW1lLnN0YXJ0c1dpdGgoYWxpYXMpKSB7CiAgICAgICAgYmFzZUZvbnROYW1lID0gYCR7c3Vic3R9JHtiYXNlRm9udE5hbWUuc3Vic3RyaW5nKGFsaWFzLmxlbmd0aCl9YDsKICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KGJhc2VGb250TmFtZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgbGV0IG11c3RBZGRCYXNlRm9udCA9IGZhbHNlOwogIGlmICghc3Vic3RpdHV0aW9uKSB7CiAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb25NYXAuZ2V0KHN0YW5kYXJkRm9udE5hbWUpOwogICAgbXVzdEFkZEJhc2VGb250ID0gdHJ1ZTsKICB9CiAgY29uc3QgbG9hZGVkTmFtZSA9IGAke2lkRmFjdG9yeS5nZXREb2NJZCgpfV9zJHtpZEZhY3RvcnkuY3JlYXRlRm9udElkKCl9YDsKICBpZiAoIXN1YnN0aXR1dGlvbikgewogICAgaWYgKCEoMCwgX2NvcmVfdXRpbHMudmFsaWRhdGVGb250TmFtZSkoYmFzZUZvbnROYW1lKSkgewogICAgICBzeXN0ZW1Gb250Q2FjaGUuc2V0KGtleSwgbnVsbCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgYm9sZCA9IC9ib2xkL2dpLnRlc3QoYmFzZUZvbnROYW1lKTsKICAgIGNvbnN0IGl0YWxpYyA9IC9vYmxpcXVlfGl0YWxpYy9naS50ZXN0KGJhc2VGb250TmFtZSk7CiAgICBjb25zdCBzdHlsZSA9IGJvbGQgJiYgaXRhbGljICYmIEJPTERJVEFMSUMgfHwgYm9sZCAmJiBCT0xEIHx8IGl0YWxpYyAmJiBJVEFMSUMgfHwgTk9STUFMOwogICAgc3Vic3RpdHV0aW9uSW5mbyA9IHsKICAgICAgY3NzOiBsb2FkZWROYW1lLAogICAgICBndWVzc0ZhbGxiYWNrOiB0cnVlLAogICAgICBsb2FkZWROYW1lLAogICAgICBiYXNlRm9udE5hbWUsCiAgICAgIHNyYzogYGxvY2FsKCR7YmFzZUZvbnROYW1lfSlgLAogICAgICBzdHlsZQogICAgfTsKICAgIHN5c3RlbUZvbnRDYWNoZS5zZXQoa2V5LCBzdWJzdGl0dXRpb25JbmZvKTsKICAgIHJldHVybiBzdWJzdGl0dXRpb25JbmZvOwogIH0KICBjb25zdCBzcmMgPSBbXTsKICBpZiAobXVzdEFkZEJhc2VGb250ICYmICgwLCBfY29yZV91dGlscy52YWxpZGF0ZUZvbnROYW1lKShiYXNlRm9udE5hbWUpKSB7CiAgICBzcmMucHVzaChgbG9jYWwoJHtiYXNlRm9udE5hbWV9KWApOwogIH0KICBjb25zdCB7CiAgICBzdHlsZSwKICAgIHVsdGltYXRlCiAgfSA9IGdlbmVyYXRlRm9udChzdWJzdGl0dXRpb24sIHNyYywgbG9jYWxGb250UGF0aCk7CiAgY29uc3QgZ3Vlc3NGYWxsYmFjayA9IHVsdGltYXRlID09PSBudWxsOwogIGNvbnN0IGZhbGxiYWNrID0gZ3Vlc3NGYWxsYmFjayA/ICIiIDogYCwke3VsdGltYXRlfWA7CiAgc3Vic3RpdHV0aW9uSW5mbyA9IHsKICAgIGNzczogYCR7bG9hZGVkTmFtZX0ke2ZhbGxiYWNrfWAsCiAgICBndWVzc0ZhbGxiYWNrLAogICAgbG9hZGVkTmFtZSwKICAgIGJhc2VGb250TmFtZSwKICAgIHNyYzogc3JjLmpvaW4oIiwiKSwKICAgIHN0eWxlCiAgfTsKICBzeXN0ZW1Gb250Q2FjaGUuc2V0KGtleSwgc3Vic3RpdHV0aW9uSW5mbyk7CiAgcmV0dXJuIHN1YnN0aXR1dGlvbkluZm87Cn0KCi8qKiovIH0pLAovKiA2MiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkltYWdlUmVzaXplciA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY29uc3QgTUlOX0lNQUdFX0RJTSA9IDIwNDg7CmNvbnN0IE1BWF9JTUFHRV9ESU0gPSA2NTUzNzsKY29uc3QgTUFYX0VSUk9SID0gMTI4OwpjbGFzcyBJbWFnZVJlc2l6ZXIgewogIGNvbnN0cnVjdG9yKGltZ0RhdGEsIGlzTWFzaykgewogICAgdGhpcy5faW1nRGF0YSA9IGltZ0RhdGE7CiAgICB0aGlzLl9pc01hc2sgPSBpc01hc2s7CiAgfQogIHN0YXRpYyBuZWVkc1RvQmVSZXNpemVkKHdpZHRoLCBoZWlnaHQpIHsKICAgIGlmICh3aWR0aCA8PSB0aGlzLl9nb29kU3F1YXJlTGVuZ3RoICYmIGhlaWdodCA8PSB0aGlzLl9nb29kU3F1YXJlTGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgTUFYX0RJTQogICAgfSA9IHRoaXM7CiAgICBpZiAod2lkdGggPiBNQVhfRElNIHx8IGhlaWdodCA+IE1BWF9ESU0pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCBhcmVhID0gd2lkdGggKiBoZWlnaHQ7CiAgICBpZiAodGhpcy5faGFzTWF4QXJlYSkgewogICAgICByZXR1cm4gYXJlYSA+IHRoaXMuTUFYX0FSRUE7CiAgICB9CiAgICBpZiAoYXJlYSA8IHRoaXMuX2dvb2RTcXVhcmVMZW5ndGggKiogMikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5fYXJlR29vZERpbXMod2lkdGgsIGhlaWdodCkpIHsKICAgICAgdGhpcy5fZ29vZFNxdWFyZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMuX2dvb2RTcXVhcmVMZW5ndGgsIE1hdGguZmxvb3IoTWF0aC5zcXJ0KHdpZHRoICogaGVpZ2h0KSkpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzLl9nb29kU3F1YXJlTGVuZ3RoID0gdGhpcy5fZ3Vlc3NNYXgodGhpcy5fZ29vZFNxdWFyZUxlbmd0aCwgTUFYX0RJTSwgTUFYX0VSUk9SLCAwKTsKICAgIGNvbnN0IG1heEFyZWEgPSB0aGlzLk1BWF9BUkVBID0gdGhpcy5fZ29vZFNxdWFyZUxlbmd0aCAqKiAyOwogICAgcmV0dXJuIGFyZWEgPiBtYXhBcmVhOwogIH0KICBzdGF0aWMgZ2V0IE1BWF9ESU0oKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIk1BWF9ESU0iLCB0aGlzLl9ndWVzc01heChNSU5fSU1BR0VfRElNLCBNQVhfSU1BR0VfRElNLCAwLCAxKSk7CiAgfQogIHN0YXRpYyBnZXQgTUFYX0FSRUEoKSB7CiAgICB0aGlzLl9oYXNNYXhBcmVhID0gdHJ1ZTsKICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiTUFYX0FSRUEiLCB0aGlzLl9ndWVzc01heChJbWFnZVJlc2l6ZXIuX2dvb2RTcXVhcmVMZW5ndGgsIHRoaXMuTUFYX0RJTSwgTUFYX0VSUk9SLCAwKSAqKiAyKTsKICB9CiAgc3RhdGljIHNldCBNQVhfQVJFQShhcmVhKSB7CiAgICBpZiAoYXJlYSA+PSAwKSB7CiAgICAgIHRoaXMuX2hhc01heEFyZWEgPSB0cnVlOwogICAgICAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiTUFYX0FSRUEiLCBhcmVhKTsKICAgIH0KICB9CiAgc3RhdGljIHNldE1heEFyZWEoYXJlYSkgewogICAgaWYgKCF0aGlzLl9oYXNNYXhBcmVhKSB7CiAgICAgIHRoaXMuTUFYX0FSRUEgPSBhcmVhID4+IDI7CiAgICB9CiAgfQogIHN0YXRpYyBfYXJlR29vZERpbXMod2lkdGgsIGhlaWdodCkgewogICAgdHJ5IHsKICAgICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTsKICAgICAgY29uc3Qgb3BhY2l0eSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YVszXTsKICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IDE7CiAgICAgIHJldHVybiBvcGFjaXR5ICE9PSAwOwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHN0YXRpYyBfZ3Vlc3NNYXgoc3RhcnQsIGVuZCwgdG9sZXJhbmNlLCBkZWZhdWx0SGVpZ2h0KSB7CiAgICB3aGlsZSAoc3RhcnQgKyB0b2xlcmFuY2UgKyAxIDwgZW5kKSB7CiAgICAgIGNvbnN0IG1pZGRsZSA9IE1hdGguZmxvb3IoKHN0YXJ0ICsgZW5kKSAvIDIpOwogICAgICBjb25zdCBoZWlnaHQgPSBkZWZhdWx0SGVpZ2h0IHx8IG1pZGRsZTsKICAgICAgaWYgKHRoaXMuX2FyZUdvb2REaW1zKG1pZGRsZSwgaGVpZ2h0KSkgewogICAgICAgIHN0YXJ0ID0gbWlkZGxlOwogICAgICB9IGVsc2UgewogICAgICAgIGVuZCA9IG1pZGRsZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YXJ0OwogIH0KICBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2UoaW1nRGF0YSwgaXNNYXNrID0gZmFsc2UpIHsKICAgIHJldHVybiBuZXcgSW1hZ2VSZXNpemVyKGltZ0RhdGEsIGlzTWFzaykuX2NyZWF0ZUltYWdlKCk7CiAgfQogIGFzeW5jIF9jcmVhdGVJbWFnZSgpIHsKICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9lbmNvZGVCTVAoKTsKICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YS5idWZmZXJdLCB7CiAgICAgIHR5cGU6ICJpbWFnZS9ibXAiCiAgICB9KTsKICAgIGNvbnN0IGJpdG1hcFByb21pc2UgPSBjcmVhdGVJbWFnZUJpdG1hcChibG9iKTsKICAgIGNvbnN0IHsKICAgICAgTUFYX0FSRUEsCiAgICAgIE1BWF9ESU0KICAgIH0gPSBJbWFnZVJlc2l6ZXI7CiAgICBjb25zdCB7CiAgICAgIF9pbWdEYXRhOiBpbWdEYXRhCiAgICB9ID0gdGhpczsKICAgIGNvbnN0IHsKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodAogICAgfSA9IGltZ0RhdGE7CiAgICBjb25zdCBtaW5GYWN0b3IgPSBNYXRoLm1heCh3aWR0aCAvIE1BWF9ESU0sIGhlaWdodCAvIE1BWF9ESU0sIE1hdGguc3FydCh3aWR0aCAqIGhlaWdodCAvIE1BWF9BUkVBKSk7CiAgICBjb25zdCBmaXJzdEZhY3RvciA9IE1hdGgubWF4KG1pbkZhY3RvciwgMik7CiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnJvdW5kKDEwICogKG1pbkZhY3RvciArIDEuMjUpKSAvIDEwIC8gZmlyc3RGYWN0b3I7CiAgICBjb25zdCBOID0gTWF0aC5mbG9vcihNYXRoLmxvZzIoZmFjdG9yKSk7CiAgICBjb25zdCBzdGVwcyA9IG5ldyBBcnJheShOICsgMikuZmlsbCgyKTsKICAgIHN0ZXBzWzBdID0gZmlyc3RGYWN0b3I7CiAgICBzdGVwcy5zcGxpY2UoLTEsIDEsIGZhY3RvciAvICgxIDw8IE4pKTsKICAgIGxldCBuZXdXaWR0aCA9IHdpZHRoOwogICAgbGV0IG5ld0hlaWdodCA9IGhlaWdodDsKICAgIGxldCBiaXRtYXAgPSBhd2FpdCBiaXRtYXBQcm9taXNlOwogICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7CiAgICAgIGNvbnN0IHByZXZXaWR0aCA9IG5ld1dpZHRoOwogICAgICBjb25zdCBwcmV2SGVpZ2h0ID0gbmV3SGVpZ2h0OwogICAgICBuZXdXaWR0aCA9IE1hdGguZmxvb3IobmV3V2lkdGggLyBzdGVwKSAtIDE7CiAgICAgIG5ld0hlaWdodCA9IE1hdGguZmxvb3IobmV3SGVpZ2h0IC8gc3RlcCkgLSAxOwogICAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKG5ld1dpZHRoLCBuZXdIZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDAsIHByZXZXaWR0aCwgcHJldkhlaWdodCwgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7CiAgICAgIGJpdG1hcCA9IGNhbnZhcy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTsKICAgIH0KICAgIGltZ0RhdGEuZGF0YSA9IG51bGw7CiAgICBpbWdEYXRhLmJpdG1hcCA9IGJpdG1hcDsKICAgIGltZ0RhdGEud2lkdGggPSBuZXdXaWR0aDsKICAgIGltZ0RhdGEuaGVpZ2h0ID0gbmV3SGVpZ2h0OwogICAgcmV0dXJuIGltZ0RhdGE7CiAgfQogIF9lbmNvZGVCTVAoKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGtpbmQKICAgIH0gPSB0aGlzLl9pbWdEYXRhOwogICAgbGV0IGRhdGEgPSB0aGlzLl9pbWdEYXRhLmRhdGE7CiAgICBsZXQgYml0UGVyUGl4ZWw7CiAgICBsZXQgY29sb3JUYWJsZSA9IG5ldyBVaW50OEFycmF5KDApOwogICAgbGV0IG1hc2tUYWJsZSA9IGNvbG9yVGFibGU7CiAgICBsZXQgY29tcHJlc3Npb24gPSAwOwogICAgc3dpdGNoIChraW5kKSB7CiAgICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOgogICAgICAgIHsKICAgICAgICAgIGJpdFBlclBpeGVsID0gMTsKICAgICAgICAgIGNvbG9yVGFibGUgPSBuZXcgVWludDhBcnJheSh0aGlzLl9pc01hc2sgPyBbMjU1LCAyNTUsIDI1NSwgMjU1LCAwLCAwLCAwLCAwXSA6IFswLCAwLCAwLCAwLCAyNTUsIDI1NSwgMjU1LCAyNTVdKTsKICAgICAgICAgIGNvbnN0IHJvd0xlbiA9IHdpZHRoICsgNyA+PiAzOwogICAgICAgICAgY29uc3Qgcm93U2l6ZSA9IHJvd0xlbiArIDMgJiAtNDsKICAgICAgICAgIGlmIChyb3dMZW4gIT09IHJvd1NpemUpIHsKICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IG5ldyBVaW50OEFycmF5KHJvd1NpemUgKiBoZWlnaHQpOwogICAgICAgICAgICBsZXQgayA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGhlaWdodCAqIHJvd0xlbjsgaSA8IGlpOyBpICs9IHJvd0xlbiwgayArPSByb3dTaXplKSB7CiAgICAgICAgICAgICAgbmV3RGF0YS5zZXQoZGF0YS5zdWJhcnJheShpLCBpICsgcm93TGVuKSwgayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUDoKICAgICAgICB7CiAgICAgICAgICBiaXRQZXJQaXhlbCA9IDI0OwogICAgICAgICAgaWYgKHdpZHRoICYgMykgewogICAgICAgICAgICBjb25zdCByb3dMZW4gPSAzICogd2lkdGg7CiAgICAgICAgICAgIGNvbnN0IHJvd1NpemUgPSByb3dMZW4gKyAzICYgLTQ7CiAgICAgICAgICAgIGNvbnN0IGV4dHJhTGVuID0gcm93U2l6ZSAtIHJvd0xlbjsKICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IG5ldyBVaW50OEFycmF5KHJvd1NpemUgKiBoZWlnaHQpOwogICAgICAgICAgICBsZXQgayA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGhlaWdodCAqIHJvd0xlbjsgaSA8IGlpOyBpICs9IHJvd0xlbikgewogICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRhdGEuc3ViYXJyYXkoaSwgaSArIHJvd0xlbik7CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb3dMZW47IGogKz0gMykgewogICAgICAgICAgICAgICAgbmV3RGF0YVtrKytdID0gcm93W2ogKyAyXTsKICAgICAgICAgICAgICAgIG5ld0RhdGFbaysrXSA9IHJvd1tqICsgMV07CiAgICAgICAgICAgICAgICBuZXdEYXRhW2srK10gPSByb3dbal07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGsgKz0gZXh0cmFMZW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YSA9IG5ld0RhdGE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBkYXRhLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHsKICAgICAgICAgICAgICBjb25zdCB0bXAgPSBkYXRhW2ldOwogICAgICAgICAgICAgIGRhdGFbaV0gPSBkYXRhW2kgKyAyXTsKICAgICAgICAgICAgICBkYXRhW2kgKyAyXSA9IHRtcDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQOgogICAgICAgIGJpdFBlclBpeGVsID0gMzI7CiAgICAgICAgY29tcHJlc3Npb24gPSAzOwogICAgICAgIG1hc2tUYWJsZSA9IG5ldyBVaW50OEFycmF5KDQgKyA0ICsgNCArIDQgKyA1Mik7CiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhtYXNrVGFibGUuYnVmZmVyKTsKICAgICAgICBpZiAoX3V0aWwuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDAsIDB4MDAwMDAwZmYsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoNCwgMHgwMDAwZmYwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMig4LCAweDAwZmYwMDAwLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDEyLCAweGZmMDAwMDAwLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmlldy5zZXRVaW50MzIoMCwgMHhmZjAwMDAwMCwgdHJ1ZSk7CiAgICAgICAgICB2aWV3LnNldFVpbnQzMig0LCAweDAwZmYwMDAwLCB0cnVlKTsKICAgICAgICAgIHZpZXcuc2V0VWludDMyKDgsIDB4MDAwMGZmMDAsIHRydWUpOwogICAgICAgICAgdmlldy5zZXRVaW50MzIoMTIsIDB4MDAwMDAwZmYsIHRydWUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0Iik7CiAgICB9CiAgICBsZXQgaSA9IDA7CiAgICBjb25zdCBoZWFkZXJMZW5ndGggPSA0MCArIG1hc2tUYWJsZS5sZW5ndGg7CiAgICBjb25zdCBmaWxlTGVuZ3RoID0gMTQgKyBoZWFkZXJMZW5ndGggKyBjb2xvclRhYmxlLmxlbmd0aCArIGRhdGEubGVuZ3RoOwogICAgY29uc3QgYm1wRGF0YSA9IG5ldyBVaW50OEFycmF5KGZpbGVMZW5ndGgpOwogICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhibXBEYXRhLmJ1ZmZlcik7CiAgICB2aWV3LnNldFVpbnQxNihpLCAweDRkNDIsIHRydWUpOwogICAgaSArPSAyOwogICAgdmlldy5zZXRVaW50MzIoaSwgZmlsZUxlbmd0aCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIDE0ICsgaGVhZGVyTGVuZ3RoICsgY29sb3JUYWJsZS5sZW5ndGgsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgaGVhZGVyTGVuZ3RoLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0SW50MzIoaSwgd2lkdGgsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRJbnQzMihpLCAtaGVpZ2h0LCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDE2KGksIDEsIHRydWUpOwogICAgaSArPSAyOwogICAgdmlldy5zZXRVaW50MTYoaSwgYml0UGVyUGl4ZWwsIHRydWUpOwogICAgaSArPSAyOwogICAgdmlldy5zZXRVaW50MzIoaSwgY29tcHJlc3Npb24sIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRVaW50MzIoaSwgMCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldEludDMyKGksIDAsIHRydWUpOwogICAgaSArPSA0OwogICAgdmlldy5zZXRJbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIHZpZXcuc2V0VWludDMyKGksIGNvbG9yVGFibGUubGVuZ3RoIC8gNCwgdHJ1ZSk7CiAgICBpICs9IDQ7CiAgICB2aWV3LnNldFVpbnQzMihpLCAwLCB0cnVlKTsKICAgIGkgKz0gNDsKICAgIGJtcERhdGEuc2V0KG1hc2tUYWJsZSwgaSk7CiAgICBpICs9IG1hc2tUYWJsZS5sZW5ndGg7CiAgICBibXBEYXRhLnNldChjb2xvclRhYmxlLCBpKTsKICAgIGkgKz0gY29sb3JUYWJsZS5sZW5ndGg7CiAgICBibXBEYXRhLnNldChkYXRhLCBpKTsKICAgIHJldHVybiBibXBEYXRhOwogIH0KfQpleHBvcnRzLkltYWdlUmVzaXplciA9IEltYWdlUmVzaXplcjsKSW1hZ2VSZXNpemVyLl9nb29kU3F1YXJlTGVuZ3RoID0gTUlOX0lNQUdFX0RJTTsKCi8qKiovIH0pLAovKiA2MyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLk11cm11ckhhc2gzXzY0ID0gdm9pZCAwOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpjb25zdCBTRUVEID0gMHhjM2QyZTFmMDsKY29uc3QgTUFTS19ISUdIID0gMHhmZmZmMDAwMDsKY29uc3QgTUFTS19MT1cgPSAweGZmZmY7CmNsYXNzIE11cm11ckhhc2gzXzY0IHsKICBjb25zdHJ1Y3RvcihzZWVkKSB7CiAgICB0aGlzLmgxID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDsKICAgIHRoaXMuaDIgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEOwogIH0KICB1cGRhdGUoaW5wdXQpIHsKICAgIGxldCBkYXRhLCBsZW5ndGg7CiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAic3RyaW5nIikgewogICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoICogMik7CiAgICAgIGxlbmd0aCA9IDA7CiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlucHV0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7CiAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODsKICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSAmIDB4ZmY7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShpbnB1dCkpIHsKICAgICAgZGF0YSA9IGlucHV0LnNsaWNlKCk7CiAgICAgIGxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiAiICsgIklucHV0IG11c3QgYmUgYSBzdHJpbmcgb3IgYXJyYXkuIik7CiAgICB9CiAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyOwogICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDsKICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTsKICAgIGxldCBrMSA9IDAsCiAgICAgIGsyID0gMDsKICAgIGxldCBoMSA9IHRoaXMuaDEsCiAgICAgIGgyID0gdGhpcy5oMjsKICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSwKICAgICAgQzIgPSAweDFiODczNTkzOwogICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVywKICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykgewogICAgICBpZiAoaSAmIDEpIHsKICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaDEgXj0gazE7CiAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTsKICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgazIgPSBkYXRhVWludDMyW2ldOwogICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7CiAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNzsKICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XOwogICAgICAgIGgyIF49IGsyOwogICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7CiAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0OwogICAgICB9CiAgICB9CiAgICBrMSA9IDA7CiAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHsKICAgICAgY2FzZSAzOgogICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7CiAgICAgIGNhc2UgMjoKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7CiAgICAgIGNhc2UgMToKICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07CiAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVzsKICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3OwogICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7CiAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkgewogICAgICAgICAgaDEgXj0gazE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGgyIF49IGsxOwogICAgICAgIH0KICAgIH0KICAgIHRoaXMuaDEgPSBoMTsKICAgIHRoaXMuaDIgPSBoMjsKICB9CiAgaGV4ZGlnZXN0KCkgewogICAgbGV0IGgxID0gdGhpcy5oMSwKICAgICAgaDIgPSB0aGlzLmgyOwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7CiAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2OwogICAgaDEgXj0gaDIgPj4+IDE7CiAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgIjAiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICIwIik7CiAgfQp9CmV4cG9ydHMuTXVybXVySGFzaDNfNjQgPSBNdXJtdXJIYXNoM182NDsKCi8qKiovIH0pLAovKiA2NCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLk9wZXJhdG9yTGlzdCA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKZnVuY3Rpb24gYWRkU3RhdGUocGFyZW50U3RhdGUsIHBhdHRlcm4sIGNoZWNrRm4sIGl0ZXJhdGVGbiwgcHJvY2Vzc0ZuKSB7CiAgbGV0IHN0YXRlID0gcGFyZW50U3RhdGU7CiAgZm9yIChsZXQgaSA9IDAsIGlpID0gcGF0dGVybi5sZW5ndGggLSAxOyBpIDwgaWk7IGkrKykgewogICAgY29uc3QgaXRlbSA9IHBhdHRlcm5baV07CiAgICBzdGF0ZSA9IHN0YXRlW2l0ZW1dIHx8PSBbXTsKICB9CiAgc3RhdGVbcGF0dGVybi5hdCgtMSldID0gewogICAgY2hlY2tGbiwKICAgIGl0ZXJhdGVGbiwKICAgIHByb2Nlc3NGbgogIH07Cn0KY29uc3QgSW5pdGlhbFN0YXRlID0gW107CmFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW191dGlsLk9QUy5zYXZlLCBfdXRpbC5PUFMudHJhbnNmb3JtLCBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUlubGluZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSAzOwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA0OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2F2ZTsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy50cmFuc2Zvcm07CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q7CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucmVzdG9yZTsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW5saW5lSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gZm91bmRJbmxpbmVJbWFnZUdyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAxMDsKICBjb25zdCBNQVhfSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0sgPSAyMDA7CiAgY29uc3QgTUFYX1dJRFRIID0gMTAwMDsKICBjb25zdCBJTUFHRV9QQURESU5HID0gMTsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgY3VyciA9IGNvbnRleHQuaUN1cnI7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFBJSVhPID0gY3VyciAtIDE7CiAgY29uc3QgY291bnQgPSBNYXRoLm1pbihNYXRoLmZsb29yKChpIC0gaUZpcnN0U2F2ZSkgLyA0KSwgTUFYX0lNQUdFU19JTl9JTkxJTkVfSU1BR0VTX0JMT0NLKTsKICBpZiAoY291bnQgPCBNSU5fSU1BR0VTX0lOX0lOTElORV9JTUFHRVNfQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgfQogIGxldCBtYXhYID0gMDsKICBjb25zdCBtYXAgPSBbXTsKICBsZXQgbWF4TGluZUhlaWdodCA9IDA7CiAgbGV0IGN1cnJlbnRYID0gSU1BR0VfUEFERElORywKICAgIGN1cnJlbnRZID0gSU1BR0VfUEFERElORzsKICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgIGNvbnN0IHRyYW5zZm9ybSA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm0gKyAocSA8PCAyKV07CiAgICBjb25zdCBpbWcgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF07CiAgICBpZiAoY3VycmVudFggKyBpbWcud2lkdGggPiBNQVhfV0lEVEgpIHsKICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGN1cnJlbnRYKTsKICAgICAgY3VycmVudFkgKz0gbWF4TGluZUhlaWdodCArIDIgKiBJTUFHRV9QQURESU5HOwogICAgICBjdXJyZW50WCA9IDA7CiAgICAgIG1heExpbmVIZWlnaHQgPSAwOwogICAgfQogICAgbWFwLnB1c2goewogICAgICB0cmFuc2Zvcm0sCiAgICAgIHg6IGN1cnJlbnRYLAogICAgICB5OiBjdXJyZW50WSwKICAgICAgdzogaW1nLndpZHRoLAogICAgICBoOiBpbWcuaGVpZ2h0CiAgICB9KTsKICAgIGN1cnJlbnRYICs9IGltZy53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HOwogICAgbWF4TGluZUhlaWdodCA9IE1hdGgubWF4KG1heExpbmVIZWlnaHQsIGltZy5oZWlnaHQpOwogIH0KICBjb25zdCBpbWdXaWR0aCA9IE1hdGgubWF4KG1heFgsIGN1cnJlbnRYKSArIElNQUdFX1BBRERJTkc7CiAgY29uc3QgaW1nSGVpZ2h0ID0gY3VycmVudFkgKyBtYXhMaW5lSGVpZ2h0ICsgSU1BR0VfUEFERElORzsKICBjb25zdCBpbWdEYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW1nV2lkdGggKiBpbWdIZWlnaHQgKiA0KTsKICBjb25zdCBpbWdSb3dTaXplID0gaW1nV2lkdGggPDwgMjsKICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyspIHsKICAgIGNvbnN0IGRhdGEgPSBhcmdzQXJyYXlbaUZpcnN0UElJWE8gKyAocSA8PCAyKV1bMF0uZGF0YTsKICAgIGNvbnN0IHJvd1NpemUgPSBtYXBbcV0udyA8PCAyOwogICAgbGV0IGRhdGFPZmZzZXQgPSAwOwogICAgbGV0IG9mZnNldCA9IG1hcFtxXS54ICsgbWFwW3FdLnkgKiBpbWdXaWR0aCA8PCAyOwogICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheSgwLCByb3dTaXplKSwgb2Zmc2V0IC0gaW1nUm93U2l6ZSk7CiAgICBmb3IgKGxldCBrID0gMCwga2sgPSBtYXBbcV0uaDsgayA8IGtrOyBrKyspIHsKICAgICAgaW1nRGF0YS5zZXQoZGF0YS5zdWJhcnJheShkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgcm93U2l6ZSksIG9mZnNldCk7CiAgICAgIGRhdGFPZmZzZXQgKz0gcm93U2l6ZTsKICAgICAgb2Zmc2V0ICs9IGltZ1Jvd1NpemU7CiAgICB9CiAgICBpbWdEYXRhLnNldChkYXRhLnN1YmFycmF5KGRhdGFPZmZzZXQgLSByb3dTaXplLCBkYXRhT2Zmc2V0KSwgb2Zmc2V0KTsKICAgIHdoaWxlIChvZmZzZXQgPj0gMCkgewogICAgICBkYXRhW29mZnNldCAtIDRdID0gZGF0YVtvZmZzZXRdOwogICAgICBkYXRhW29mZnNldCAtIDNdID0gZGF0YVtvZmZzZXQgKyAxXTsKICAgICAgZGF0YVtvZmZzZXQgLSAyXSA9IGRhdGFbb2Zmc2V0ICsgMl07CiAgICAgIGRhdGFbb2Zmc2V0IC0gMV0gPSBkYXRhW29mZnNldCArIDNdOwogICAgICBkYXRhW29mZnNldCArIHJvd1NpemVdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gNF07CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDFdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gM107CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDJdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gMl07CiAgICAgIGRhdGFbb2Zmc2V0ICsgcm93U2l6ZSArIDNdID0gZGF0YVtvZmZzZXQgKyByb3dTaXplIC0gMV07CiAgICAgIG9mZnNldCAtPSBpbWdSb3dTaXplOwogICAgfQogIH0KICBjb25zdCBpbWcgPSB7CiAgICB3aWR0aDogaW1nV2lkdGgsCiAgICBoZWlnaHQ6IGltZ0hlaWdodAogIH07CiAgaWYgKGNvbnRleHQuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHsKICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoaW1nV2lkdGgsIGltZ0hlaWdodCk7CiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgIGN0eC5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoaW1nRGF0YS5idWZmZXIpLCBpbWdXaWR0aCwgaW1nSGVpZ2h0KSwgMCwgMCk7CiAgICBpbWcuYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgaW1nLmRhdGEgPSBudWxsOwogIH0gZWxzZSB7CiAgICBpbWcua2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQOwogICAgaW1nLmRhdGEgPSBpbWdEYXRhOwogIH0KICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKTsKICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ltZywgbWFwXSk7CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLnNhdmUsIF91dGlsLk9QUy50cmFuc2Zvcm0sIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3QsIF91dGlsLk9QUy5yZXN0b3JlXSwgbnVsbCwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlTWFza0dyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5OwogIGNvbnN0IGlGaXJzdFNhdmUgPSBjb250ZXh0LmlDdXJyIC0gMzsKICBjb25zdCBwb3MgPSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICBzd2l0Y2ggKHBvcykgewogICAgY2FzZSAwOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnNhdmU7CiAgICBjYXNlIDE6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMudHJhbnNmb3JtOwogICAgY2FzZSAyOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdDsKICAgIGNhc2UgMzoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5yZXN0b3JlOwogIH0KICB0aHJvdyBuZXcgRXJyb3IoYGl0ZXJhdGVJbWFnZU1hc2tHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gZm91bmRJbWFnZU1hc2tHcm91cChjb250ZXh0LCBpKSB7CiAgY29uc3QgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSyA9IDEwOwogIGNvbnN0IE1BWF9JTUFHRVNfSU5fTUFTS1NfQkxPQ0sgPSAxMDA7CiAgY29uc3QgTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLID0gMTAwMDsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgY3VyciA9IGNvbnRleHQuaUN1cnI7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFBJTVhPID0gY3VyciAtIDE7CiAgbGV0IGNvdW50ID0gTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCk7CiAgaWYgKGNvdW50IDwgTUlOX0lNQUdFU19JTl9NQVNLU19CTE9DSykgewogICAgcmV0dXJuIGkgLSAoaSAtIGlGaXJzdFNhdmUpICUgNDsKICB9CiAgbGV0IGlzU2FtZUltYWdlID0gZmFsc2U7CiAgbGV0IGlUcmFuc2Zvcm0sIHRyYW5zZm9ybUFyZ3M7CiAgY29uc3QgZmlyc3RQSU1YT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElNWE9dWzBdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdLAogICAgZmlyc3RUcmFuc2Zvcm1BcmcxID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMV0sCiAgICBmaXJzdFRyYW5zZm9ybUFyZzIgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSwKICAgIGZpcnN0VHJhbnNmb3JtQXJnMyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzNdOwogIGlmIChmaXJzdFRyYW5zZm9ybUFyZzEgPT09IGZpcnN0VHJhbnNmb3JtQXJnMikgewogICAgaXNTYW1lSW1hZ2UgPSB0cnVlOwogICAgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybSArIDQ7CiAgICBsZXQgaVBJTVhPID0gaUZpcnN0UElNWE8gKyA0OwogICAgZm9yIChsZXQgcSA9IDE7IHEgPCBjb3VudDsgcSsrLCBpVHJhbnNmb3JtICs9IDQsIGlQSU1YTyArPSA0KSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaVRyYW5zZm9ybV07CiAgICAgIGlmIChhcmdzQXJyYXlbaVBJTVhPXVswXSAhPT0gZmlyc3RQSU1YT0FyZzAgfHwgdHJhbnNmb3JtQXJnc1swXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmcwIHx8IHRyYW5zZm9ybUFyZ3NbMV0gIT09IGZpcnN0VHJhbnNmb3JtQXJnMSB8fCB0cmFuc2Zvcm1BcmdzWzJdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzIgfHwgdHJhbnNmb3JtQXJnc1szXSAhPT0gZmlyc3RUcmFuc2Zvcm1BcmczKSB7CiAgICAgICAgaWYgKHEgPCBNSU5fSU1BR0VTX0lOX01BU0tTX0JMT0NLKSB7CiAgICAgICAgICBpc1NhbWVJbWFnZSA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb3VudCA9IHE7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQogIGlmIChpc1NhbWVJbWFnZSkgewogICAgY291bnQgPSBNYXRoLm1pbihjb3VudCwgTUFYX1NBTUVfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTsKICAgIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTsKICAgIGlUcmFuc2Zvcm0gPSBpRmlyc3RUcmFuc2Zvcm07CiAgICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkgewogICAgICB0cmFuc2Zvcm1BcmdzID0gYXJnc0FycmF5W2lUcmFuc2Zvcm1dOwogICAgICBwb3NpdGlvbnNbcSA8PCAxXSA9IHRyYW5zZm9ybUFyZ3NbNF07CiAgICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTsKICAgIH0KICAgIGZuQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgX3V0aWwuT1BTLnBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdCk7CiAgICBhcmdzQXJyYXkuc3BsaWNlKGlGaXJzdFNhdmUsIGNvdW50ICogNCwgW2ZpcnN0UElNWE9BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMSwgZmlyc3RUcmFuc2Zvcm1BcmcyLCBmaXJzdFRyYW5zZm9ybUFyZzMsIHBvc2l0aW9uc10pOwogIH0gZWxzZSB7CiAgICBjb3VudCA9IE1hdGgubWluKGNvdW50LCBNQVhfSU1BR0VTX0lOX01BU0tTX0JMT0NLKTsKICAgIGNvbnN0IGltYWdlcyA9IFtdOwogICAgZm9yIChsZXQgcSA9IDA7IHEgPCBjb3VudDsgcSsrKSB7CiAgICAgIHRyYW5zZm9ybUFyZ3MgPSBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtICsgKHEgPDwgMildOwogICAgICBjb25zdCBtYXNrUGFyYW1zID0gYXJnc0FycmF5W2lGaXJzdFBJTVhPICsgKHEgPDwgMildWzBdOwogICAgICBpbWFnZXMucHVzaCh7CiAgICAgICAgZGF0YTogbWFza1BhcmFtcy5kYXRhLAogICAgICAgIHdpZHRoOiBtYXNrUGFyYW1zLndpZHRoLAogICAgICAgIGhlaWdodDogbWFza1BhcmFtcy5oZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGU6IG1hc2tQYXJhbXMuaW50ZXJwb2xhdGUsCiAgICAgICAgY291bnQ6IG1hc2tQYXJhbXMuY291bnQsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1BcmdzCiAgICAgIH0pOwogICAgfQogICAgZm5BcnJheS5zcGxpY2UoaUZpcnN0U2F2ZSwgY291bnQgKiA0LCBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0R3JvdXApOwogICAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIFtpbWFnZXNdKTsKICB9CiAgcmV0dXJuIGlGaXJzdFNhdmUgKyAxOwp9KTsKYWRkU3RhdGUoSW5pdGlhbFN0YXRlLCBbX3V0aWwuT1BTLnNhdmUsIF91dGlsLk9QUy50cmFuc2Zvcm0sIF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdCwgX3V0aWwuT1BTLnJlc3RvcmVdLCBmdW5jdGlvbiAoY29udGV4dCkgewogIGNvbnN0IGFyZ3NBcnJheSA9IGNvbnRleHQuYXJnc0FycmF5OwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGNvbnRleHQuaUN1cnIgLSAyOwogIHJldHVybiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsxXSA9PT0gMCAmJiBhcmdzQXJyYXlbaUZpcnN0VHJhbnNmb3JtXVsyXSA9PT0gMDsKfSwgZnVuY3Rpb24gaXRlcmF0ZUltYWdlR3JvdXAoY29udGV4dCwgaSkgewogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBpRmlyc3RTYXZlID0gY29udGV4dC5pQ3VyciAtIDM7CiAgY29uc3QgcG9zID0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgc3dpdGNoIChwb3MpIHsKICAgIGNhc2UgMDoKICAgICAgcmV0dXJuIGZuQXJyYXlbaV0gPT09IF91dGlsLk9QUy5zYXZlOwogICAgY2FzZSAxOgogICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLnRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBpRmlyc3RUcmFuc2Zvcm0gPSBjb250ZXh0LmlDdXJyIC0gMjsKICAgICAgY29uc3QgZmlyc3RUcmFuc2Zvcm1BcmcwID0gYXJnc0FycmF5W2lGaXJzdFRyYW5zZm9ybV1bMF07CiAgICAgIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzNdOwogICAgICBpZiAoYXJnc0FycmF5W2ldWzBdICE9PSBmaXJzdFRyYW5zZm9ybUFyZzAgfHwgYXJnc0FycmF5W2ldWzFdICE9PSAwIHx8IGFyZ3NBcnJheVtpXVsyXSAhPT0gMCB8fCBhcmdzQXJyYXlbaV1bM10gIT09IGZpcnN0VHJhbnNmb3JtQXJnMykgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2UgMjoKICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBpRmlyc3RQSVhPID0gY29udGV4dC5pQ3VyciAtIDE7CiAgICAgIGNvbnN0IGZpcnN0UElYT0FyZzAgPSBhcmdzQXJyYXlbaUZpcnN0UElYT11bMF07CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0UElYT0FyZzApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMucmVzdG9yZTsKICB9CiAgdGhyb3cgbmV3IEVycm9yKGBpdGVyYXRlSW1hZ2VHcm91cCAtIGludmFsaWQgcG9zOiAke3Bvc31gKTsKfSwgZnVuY3Rpb24gKGNvbnRleHQsIGkpIHsKICBjb25zdCBNSU5fSU1BR0VTX0lOX0JMT0NLID0gMzsKICBjb25zdCBNQVhfSU1BR0VTX0lOX0JMT0NLID0gMTAwMDsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgY3VyciA9IGNvbnRleHQuaUN1cnI7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGN1cnIgLSAzOwogIGNvbnN0IGlGaXJzdFRyYW5zZm9ybSA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFBJWE8gPSBjdXJyIC0gMTsKICBjb25zdCBmaXJzdFBJWE9BcmcwID0gYXJnc0FycmF5W2lGaXJzdFBJWE9dWzBdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzBdOwogIGNvbnN0IGZpcnN0VHJhbnNmb3JtQXJnMyA9IGFyZ3NBcnJheVtpRmlyc3RUcmFuc2Zvcm1dWzNdOwogIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSAtIGlGaXJzdFNhdmUpIC8gNCksIE1BWF9JTUFHRVNfSU5fQkxPQ0spOwogIGlmIChjb3VudCA8IE1JTl9JTUFHRVNfSU5fQkxPQ0spIHsKICAgIHJldHVybiBpIC0gKGkgLSBpRmlyc3RTYXZlKSAlIDQ7CiAgfQogIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoY291bnQgKiAyKTsKICBsZXQgaVRyYW5zZm9ybSA9IGlGaXJzdFRyYW5zZm9ybTsKICBmb3IgKGxldCBxID0gMDsgcSA8IGNvdW50OyBxKyssIGlUcmFuc2Zvcm0gKz0gNCkgewogICAgY29uc3QgdHJhbnNmb3JtQXJncyA9IGFyZ3NBcnJheVtpVHJhbnNmb3JtXTsKICAgIHBvc2l0aW9uc1txIDw8IDFdID0gdHJhbnNmb3JtQXJnc1s0XTsKICAgIHBvc2l0aW9uc1socSA8PCAxKSArIDFdID0gdHJhbnNmb3JtQXJnc1s1XTsKICB9CiAgY29uc3QgYXJncyA9IFtmaXJzdFBJWE9BcmcwLCBmaXJzdFRyYW5zZm9ybUFyZzAsIGZpcnN0VHJhbnNmb3JtQXJnMywgcG9zaXRpb25zXTsKICBmbkFycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdFJlcGVhdCk7CiAgYXJnc0FycmF5LnNwbGljZShpRmlyc3RTYXZlLCBjb3VudCAqIDQsIGFyZ3MpOwogIHJldHVybiBpRmlyc3RTYXZlICsgMTsKfSk7CmFkZFN0YXRlKEluaXRpYWxTdGF0ZSwgW191dGlsLk9QUy5iZWdpblRleHQsIF91dGlsLk9QUy5zZXRGb250LCBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeCwgX3V0aWwuT1BTLnNob3dUZXh0LCBfdXRpbC5PUFMuZW5kVGV4dF0sIG51bGwsIGZ1bmN0aW9uIGl0ZXJhdGVTaG93VGV4dEdyb3VwKGNvbnRleHQsIGkpIHsKICBjb25zdCBmbkFycmF5ID0gY29udGV4dC5mbkFycmF5LAogICAgYXJnc0FycmF5ID0gY29udGV4dC5hcmdzQXJyYXk7CiAgY29uc3QgaUZpcnN0U2F2ZSA9IGNvbnRleHQuaUN1cnIgLSA0OwogIGNvbnN0IHBvcyA9IChpIC0gaUZpcnN0U2F2ZSkgJSA1OwogIHN3aXRjaCAocG9zKSB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuYmVnaW5UZXh0OwogICAgY2FzZSAxOgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLnNldEZvbnQ7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiBmbkFycmF5W2ldID09PSBfdXRpbC5PUFMuc2V0VGV4dE1hdHJpeDsKICAgIGNhc2UgMzoKICAgICAgaWYgKGZuQXJyYXlbaV0gIT09IF91dGlsLk9QUy5zaG93VGV4dCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBjb25zdCBpRmlyc3RTZXRGb250ID0gY29udGV4dC5pQ3VyciAtIDM7CiAgICAgIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzAgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMF07CiAgICAgIGNvbnN0IGZpcnN0U2V0Rm9udEFyZzEgPSBhcmdzQXJyYXlbaUZpcnN0U2V0Rm9udF1bMV07CiAgICAgIGlmIChhcmdzQXJyYXlbaV1bMF0gIT09IGZpcnN0U2V0Rm9udEFyZzAgfHwgYXJnc0FycmF5W2ldWzFdICE9PSBmaXJzdFNldEZvbnRBcmcxKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSA0OgogICAgICByZXR1cm4gZm5BcnJheVtpXSA9PT0gX3V0aWwuT1BTLmVuZFRleHQ7CiAgfQogIHRocm93IG5ldyBFcnJvcihgaXRlcmF0ZVNob3dUZXh0R3JvdXAgLSBpbnZhbGlkIHBvczogJHtwb3N9YCk7Cn0sIGZ1bmN0aW9uIChjb250ZXh0LCBpKSB7CiAgY29uc3QgTUlOX0NIQVJTX0lOX0JMT0NLID0gMzsKICBjb25zdCBNQVhfQ0hBUlNfSU5fQkxPQ0sgPSAxMDAwOwogIGNvbnN0IGZuQXJyYXkgPSBjb250ZXh0LmZuQXJyYXksCiAgICBhcmdzQXJyYXkgPSBjb250ZXh0LmFyZ3NBcnJheTsKICBjb25zdCBjdXJyID0gY29udGV4dC5pQ3VycjsKICBjb25zdCBpRmlyc3RCZWdpblRleHQgPSBjdXJyIC0gNDsKICBjb25zdCBpRmlyc3RTZXRGb250ID0gY3VyciAtIDM7CiAgY29uc3QgaUZpcnN0U2V0VGV4dE1hdHJpeCA9IGN1cnIgLSAyOwogIGNvbnN0IGlGaXJzdFNob3dUZXh0ID0gY3VyciAtIDE7CiAgY29uc3QgaUZpcnN0RW5kVGV4dCA9IGN1cnI7CiAgY29uc3QgZmlyc3RTZXRGb250QXJnMCA9IGFyZ3NBcnJheVtpRmlyc3RTZXRGb250XVswXTsKICBjb25zdCBmaXJzdFNldEZvbnRBcmcxID0gYXJnc0FycmF5W2lGaXJzdFNldEZvbnRdWzFdOwogIGxldCBjb3VudCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgLSBpRmlyc3RCZWdpblRleHQpIC8gNSksIE1BWF9DSEFSU19JTl9CTE9DSyk7CiAgaWYgKGNvdW50IDwgTUlOX0NIQVJTX0lOX0JMT0NLKSB7CiAgICByZXR1cm4gaSAtIChpIC0gaUZpcnN0QmVnaW5UZXh0KSAlIDU7CiAgfQogIGxldCBpRmlyc3QgPSBpRmlyc3RCZWdpblRleHQ7CiAgaWYgKGlGaXJzdEJlZ2luVGV4dCA+PSA0ICYmIGZuQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gNF0gPT09IGZuQXJyYXlbaUZpcnN0U2V0Rm9udF0gJiYgZm5BcnJheVtpRmlyc3RCZWdpblRleHQgLSAzXSA9PT0gZm5BcnJheVtpRmlyc3RTZXRUZXh0TWF0cml4XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDJdID09PSBmbkFycmF5W2lGaXJzdFNob3dUZXh0XSAmJiBmbkFycmF5W2lGaXJzdEJlZ2luVGV4dCAtIDFdID09PSBmbkFycmF5W2lGaXJzdEVuZFRleHRdICYmIGFyZ3NBcnJheVtpRmlyc3RCZWdpblRleHQgLSA0XVswXSA9PT0gZmlyc3RTZXRGb250QXJnMCAmJiBhcmdzQXJyYXlbaUZpcnN0QmVnaW5UZXh0IC0gNF1bMV0gPT09IGZpcnN0U2V0Rm9udEFyZzEpIHsKICAgIGNvdW50Kys7CiAgICBpRmlyc3QgLT0gNTsKICB9CiAgbGV0IGlFbmRUZXh0ID0gaUZpcnN0ICsgNDsKICBmb3IgKGxldCBxID0gMTsgcSA8IGNvdW50OyBxKyspIHsKICAgIGZuQXJyYXkuc3BsaWNlKGlFbmRUZXh0LCAzKTsKICAgIGFyZ3NBcnJheS5zcGxpY2UoaUVuZFRleHQsIDMpOwogICAgaUVuZFRleHQgKz0gMjsKICB9CiAgcmV0dXJuIGlFbmRUZXh0ICsgMTsKfSk7CmNsYXNzIE51bGxPcHRpbWl6ZXIgewogIGNvbnN0cnVjdG9yKHF1ZXVlKSB7CiAgICB0aGlzLnF1ZXVlID0gcXVldWU7CiAgfQogIF9vcHRpbWl6ZSgpIHt9CiAgcHVzaChmbiwgYXJncykgewogICAgdGhpcy5xdWV1ZS5mbkFycmF5LnB1c2goZm4pOwogICAgdGhpcy5xdWV1ZS5hcmdzQXJyYXkucHVzaChhcmdzKTsKICAgIHRoaXMuX29wdGltaXplKCk7CiAgfQogIGZsdXNoKCkge30KICByZXNldCgpIHt9Cn0KY2xhc3MgUXVldWVPcHRpbWl6ZXIgZXh0ZW5kcyBOdWxsT3B0aW1pemVyIHsKICBjb25zdHJ1Y3RvcihxdWV1ZSkgewogICAgc3VwZXIocXVldWUpOwogICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICB0aGlzLmNvbnRleHQgPSB7CiAgICAgIGlDdXJyOiAwLAogICAgICBmbkFycmF5OiBxdWV1ZS5mbkFycmF5LAogICAgICBhcmdzQXJyYXk6IHF1ZXVlLmFyZ3NBcnJheSwKICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ6IGZhbHNlCiAgICB9OwogICAgdGhpcy5tYXRjaCA9IG51bGw7CiAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSAwOwogIH0KICBzZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQodmFsdWUpIHsKICAgIHRoaXMuY29udGV4dC5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IHZhbHVlOwogIH0KICBfb3B0aW1pemUoKSB7CiAgICBjb25zdCBmbkFycmF5ID0gdGhpcy5xdWV1ZS5mbkFycmF5OwogICAgbGV0IGkgPSB0aGlzLmxhc3RQcm9jZXNzZWQsCiAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7CiAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOwogICAgbGV0IG1hdGNoID0gdGhpcy5tYXRjaDsKICAgIGlmICghc3RhdGUgJiYgIW1hdGNoICYmIGkgKyAxID09PSBpaSAmJiAhSW5pdGlhbFN0YXRlW2ZuQXJyYXlbaV1dKSB7CiAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IGlpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0OwogICAgd2hpbGUgKGkgPCBpaSkgewogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICBjb25zdCBpdGVyYXRlID0gKDAsIG1hdGNoLml0ZXJhdGVGbikoY29udGV4dCwgaSk7CiAgICAgICAgaWYgKGl0ZXJhdGUpIHsKICAgICAgICAgIGkrKzsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpID0gKDAsIG1hdGNoLnByb2Nlc3NGbikoY29udGV4dCwgaSArIDEpOwogICAgICAgIGlpID0gZm5BcnJheS5sZW5ndGg7CiAgICAgICAgbWF0Y2ggPSBudWxsOwogICAgICAgIHN0YXRlID0gbnVsbDsKICAgICAgICBpZiAoaSA+PSBpaSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXRlID0gKHN0YXRlIHx8IEluaXRpYWxTdGF0ZSlbZm5BcnJheVtpXV07CiAgICAgIGlmICghc3RhdGUgfHwgQXJyYXkuaXNBcnJheShzdGF0ZSkpIHsKICAgICAgICBpKys7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29udGV4dC5pQ3VyciA9IGk7CiAgICAgIGkrKzsKICAgICAgaWYgKHN0YXRlLmNoZWNrRm4gJiYgISgwLCBzdGF0ZS5jaGVja0ZuKShjb250ZXh0KSkgewogICAgICAgIHN0YXRlID0gbnVsbDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBtYXRjaCA9IHN0YXRlOwogICAgICBzdGF0ZSA9IG51bGw7CiAgICB9CiAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICB0aGlzLm1hdGNoID0gbWF0Y2g7CiAgICB0aGlzLmxhc3RQcm9jZXNzZWQgPSBpOwogIH0KICBmbHVzaCgpIHsKICAgIHdoaWxlICh0aGlzLm1hdGNoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMucXVldWUuZm5BcnJheS5sZW5ndGg7CiAgICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9ICgwLCB0aGlzLm1hdGNoLnByb2Nlc3NGbikodGhpcy5jb250ZXh0LCBsZW5ndGgpOwogICAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICAgIHRoaXMuX29wdGltaXplKCk7CiAgICB9CiAgfQogIHJlc2V0KCkgewogICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICB0aGlzLm1hdGNoID0gbnVsbDsKICAgIHRoaXMubGFzdFByb2Nlc3NlZCA9IDA7CiAgfQp9CmNsYXNzIE9wZXJhdG9yTGlzdCB7CiAgc3RhdGljIENIVU5LX1NJWkUgPSAxMDAwOwogIHN0YXRpYyBDSFVOS19TSVpFX0FCT1VUID0gdGhpcy5DSFVOS19TSVpFIC0gNTsKICBjb25zdHJ1Y3RvcihpbnRlbnQgPSAwLCBzdHJlYW1TaW5rKSB7CiAgICB0aGlzLl9zdHJlYW1TaW5rID0gc3RyZWFtU2luazsKICAgIHRoaXMuZm5BcnJheSA9IFtdOwogICAgdGhpcy5hcmdzQXJyYXkgPSBbXTsKICAgIGlmIChzdHJlYW1TaW5rICYmICEoaW50ZW50ICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5PUExJU1QpKSB7CiAgICAgIHRoaXMub3B0aW1pemVyID0gbmV3IFF1ZXVlT3B0aW1pemVyKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5vcHRpbWl6ZXIgPSBuZXcgTnVsbE9wdGltaXplcih0aGlzKTsKICAgIH0KICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IFNldCgpOwogICAgdGhpcy5fdG90YWxMZW5ndGggPSAwOwogICAgdGhpcy53ZWlnaHQgPSAwOwogICAgdGhpcy5fcmVzb2x2ZWQgPSBzdHJlYW1TaW5rID8gbnVsbCA6IFByb21pc2UucmVzb2x2ZSgpOwogIH0KICBzZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQodmFsdWUpIHsKICAgIHRoaXMub3B0aW1pemVyLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdmFsdWU7CiAgfQogIGdldCBsZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5hcmdzQXJyYXkubGVuZ3RoOwogIH0KICBnZXQgcmVhZHkoKSB7CiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWQgfHwgdGhpcy5fc3RyZWFtU2luay5yZWFkeTsKICB9CiAgZ2V0IHRvdGFsTGVuZ3RoKCkgewogICAgcmV0dXJuIHRoaXMuX3RvdGFsTGVuZ3RoICsgdGhpcy5sZW5ndGg7CiAgfQogIGFkZE9wKGZuLCBhcmdzKSB7CiAgICB0aGlzLm9wdGltaXplci5wdXNoKGZuLCBhcmdzKTsKICAgIHRoaXMud2VpZ2h0Kys7CiAgICBpZiAodGhpcy5fc3RyZWFtU2luaykgewogICAgICBpZiAodGhpcy53ZWlnaHQgPj0gT3BlcmF0b3JMaXN0LkNIVU5LX1NJWkUpIHsKICAgICAgICB0aGlzLmZsdXNoKCk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy53ZWlnaHQgPj0gT3BlcmF0b3JMaXN0LkNIVU5LX1NJWkVfQUJPVVQgJiYgKGZuID09PSBfdXRpbC5PUFMucmVzdG9yZSB8fCBmbiA9PT0gX3V0aWwuT1BTLmVuZFRleHQpKSB7CiAgICAgICAgdGhpcy5mbHVzaCgpOwogICAgICB9CiAgICB9CiAgfQogIGFkZEltYWdlT3BzKGZuLCBhcmdzLCBvcHRpb25hbENvbnRlbnQpIHsKICAgIGlmIChvcHRpb25hbENvbnRlbnQgIT09IHVuZGVmaW5lZCkgewogICAgICB0aGlzLmFkZE9wKF91dGlsLk9QUy5iZWdpbk1hcmtlZENvbnRlbnRQcm9wcywgWyJPQyIsIG9wdGlvbmFsQ29udGVudF0pOwogICAgfQogICAgdGhpcy5hZGRPcChmbiwgYXJncyk7CiAgICBpZiAob3B0aW9uYWxDb250ZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgdGhpcy5hZGRPcChfdXRpbC5PUFMuZW5kTWFya2VkQ29udGVudCwgW10pOwogICAgfQogIH0KICBhZGREZXBlbmRlbmN5KGRlcGVuZGVuY3kpIHsKICAgIGlmICh0aGlzLmRlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgdGhpcy5hZGRPcChfdXRpbC5PUFMuZGVwZW5kZW5jeSwgW2RlcGVuZGVuY3ldKTsKICB9CiAgYWRkRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcykgewogICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGRlcGVuZGVuY2llcykgewogICAgICB0aGlzLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeSk7CiAgICB9CiAgfQogIGFkZE9wTGlzdChvcExpc3QpIHsKICAgIGlmICghKG9wTGlzdCBpbnN0YW5jZW9mIE9wZXJhdG9yTGlzdCkpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCdhZGRPcExpc3QgLSBpZ25vcmluZyBpbnZhbGlkICJvcExpc3QiIHBhcmFtZXRlci4nKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG9wTGlzdC5kZXBlbmRlbmNpZXMpIHsKICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDAsIGlpID0gb3BMaXN0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgdGhpcy5hZGRPcChvcExpc3QuZm5BcnJheVtpXSwgb3BMaXN0LmFyZ3NBcnJheVtpXSk7CiAgICB9CiAgfQogIGdldElSKCkgewogICAgcmV0dXJuIHsKICAgICAgZm5BcnJheTogdGhpcy5mbkFycmF5LAogICAgICBhcmdzQXJyYXk6IHRoaXMuYXJnc0FycmF5LAogICAgICBsZW5ndGg6IHRoaXMubGVuZ3RoCiAgICB9OwogIH0KICBnZXQgX3RyYW5zZmVycygpIHsKICAgIGNvbnN0IHRyYW5zZmVycyA9IFtdOwogICAgY29uc3QgewogICAgICBmbkFycmF5LAogICAgICBhcmdzQXJyYXksCiAgICAgIGxlbmd0aAogICAgfSA9IHRoaXM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgIHN3aXRjaCAoZm5BcnJheVtpXSkgewogICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OgogICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6CiAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OgogICAgICAgICAgY29uc3QgYXJnID0gYXJnc0FycmF5W2ldWzBdOwogICAgICAgICAgaWYgKCFhcmcuY2FjaGVkICYmIGFyZy5kYXRhPy5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgICAgICB0cmFuc2ZlcnMucHVzaChhcmcuZGF0YS5idWZmZXIpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cmFuc2ZlcnM7CiAgfQogIGZsdXNoKGxhc3RDaHVuayA9IGZhbHNlLCBzZXBhcmF0ZUFubm90cyA9IG51bGwpIHsKICAgIHRoaXMub3B0aW1pemVyLmZsdXNoKCk7CiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IGxlbmd0aDsKICAgIHRoaXMuX3N0cmVhbVNpbmsuZW5xdWV1ZSh7CiAgICAgIGZuQXJyYXk6IHRoaXMuZm5BcnJheSwKICAgICAgYXJnc0FycmF5OiB0aGlzLmFyZ3NBcnJheSwKICAgICAgbGFzdENodW5rLAogICAgICBzZXBhcmF0ZUFubm90cywKICAgICAgbGVuZ3RoCiAgICB9LCAxLCB0aGlzLl90cmFuc2ZlcnMpOwogICAgdGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTsKICAgIHRoaXMuZm5BcnJheS5sZW5ndGggPSAwOwogICAgdGhpcy5hcmdzQXJyYXkubGVuZ3RoID0gMDsKICAgIHRoaXMud2VpZ2h0ID0gMDsKICAgIHRoaXMub3B0aW1pemVyLnJlc2V0KCk7CiAgfQp9CmV4cG9ydHMuT3BlcmF0b3JMaXN0ID0gT3BlcmF0b3JMaXN0OwoKLyoqKi8gfSksCi8qIDY1ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuUERGSW1hZ2UgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfaW1hZ2VfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfY29sb3JzcGFjZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTIpOwp2YXIgX2RlY29kZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTsKdmFyIF9pbWFnZV9yZXNpemVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Mik7CnZhciBfanBlZ19zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTsKdmFyIF9qcHggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMwKTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKZnVuY3Rpb24gZGVjb2RlQW5kQ2xhbXAodmFsdWUsIGFkZGVuZCwgY29lZmZpY2llbnQsIG1heCkgewogIHZhbHVlID0gYWRkZW5kICsgdmFsdWUgKiBjb2VmZmljaWVudDsKICBpZiAodmFsdWUgPCAwKSB7CiAgICB2YWx1ZSA9IDA7CiAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgewogICAgdmFsdWUgPSBtYXg7CiAgfQogIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiByZXNpemVJbWFnZU1hc2soc3JjLCBicGMsIHcxLCBoMSwgdzIsIGgyKSB7CiAgY29uc3QgbGVuZ3RoID0gdzIgKiBoMjsKICBsZXQgZGVzdDsKICBpZiAoYnBjIDw9IDgpIHsKICAgIGRlc3QgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogIH0gZWxzZSBpZiAoYnBjIDw9IDE2KSB7CiAgICBkZXN0ID0gbmV3IFVpbnQxNkFycmF5KGxlbmd0aCk7CiAgfSBlbHNlIHsKICAgIGRlc3QgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKICB9CiAgY29uc3QgeFJhdGlvID0gdzEgLyB3MjsKICBjb25zdCB5UmF0aW8gPSBoMSAvIGgyOwogIGxldCBpLAogICAgaiwKICAgIHB5LAogICAgbmV3SW5kZXggPSAwLAogICAgb2xkSW5kZXg7CiAgY29uc3QgeFNjYWxlZCA9IG5ldyBVaW50MTZBcnJheSh3Mik7CiAgY29uc3QgdzFTY2FubGluZSA9IHcxOwogIGZvciAoaSA9IDA7IGkgPCB3MjsgaSsrKSB7CiAgICB4U2NhbGVkW2ldID0gTWF0aC5mbG9vcihpICogeFJhdGlvKTsKICB9CiAgZm9yIChpID0gMDsgaSA8IGgyOyBpKyspIHsKICAgIHB5ID0gTWF0aC5mbG9vcihpICogeVJhdGlvKSAqIHcxU2NhbmxpbmU7CiAgICBmb3IgKGogPSAwOyBqIDwgdzI7IGorKykgewogICAgICBvbGRJbmRleCA9IHB5ICsgeFNjYWxlZFtqXTsKICAgICAgZGVzdFtuZXdJbmRleCsrXSA9IHNyY1tvbGRJbmRleF07CiAgICB9CiAgfQogIHJldHVybiBkZXN0Owp9CmNsYXNzIFBERkltYWdlIHsKICBjb25zdHJ1Y3Rvcih7CiAgICB4cmVmLAogICAgcmVzLAogICAgaW1hZ2UsCiAgICBpc0lubGluZSA9IGZhbHNlLAogICAgc21hc2sgPSBudWxsLAogICAgbWFzayA9IG51bGwsCiAgICBpc01hc2sgPSBmYWxzZSwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgfSkgewogICAgdGhpcy5pbWFnZSA9IGltYWdlOwogICAgY29uc3QgZGljdCA9IGltYWdlLmRpY3Q7CiAgICBjb25zdCBmaWx0ZXIgPSBkaWN0LmdldCgiRiIsICJGaWx0ZXIiKTsKICAgIGxldCBmaWx0ZXJOYW1lOwogICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHsKICAgICAgY29uc3QgZmlsdGVyWmVybyA9IHhyZWYuZmV0Y2hJZlJlZihmaWx0ZXJbMF0pOwogICAgICBpZiAoZmlsdGVyWmVybyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgICBmaWx0ZXJOYW1lID0gZmlsdGVyWmVyby5uYW1lOwogICAgICB9CiAgICB9CiAgICBzd2l0Y2ggKGZpbHRlck5hbWUpIHsKICAgICAgY2FzZSAiSlBYRGVjb2RlIjoKICAgICAgICBjb25zdCBqcHhJbWFnZSA9IG5ldyBfanB4LkpweEltYWdlKCk7CiAgICAgICAganB4SW1hZ2UucGFyc2VJbWFnZVByb3BlcnRpZXMoaW1hZ2Uuc3RyZWFtKTsKICAgICAgICBpbWFnZS5zdHJlYW0ucmVzZXQoKTsKICAgICAgICBpbWFnZS53aWR0aCA9IGpweEltYWdlLndpZHRoOwogICAgICAgIGltYWdlLmhlaWdodCA9IGpweEltYWdlLmhlaWdodDsKICAgICAgICBpbWFnZS5iaXRzUGVyQ29tcG9uZW50ID0ganB4SW1hZ2UuYml0c1BlckNvbXBvbmVudDsKICAgICAgICBpbWFnZS5udW1Db21wcyA9IGpweEltYWdlLmNvbXBvbmVudHNDb3VudDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiSkJJRzJEZWNvZGUiOgogICAgICAgIGltYWdlLmJpdHNQZXJDb21wb25lbnQgPSAxOwogICAgICAgIGltYWdlLm51bUNvbXBzID0gMTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGxldCB3aWR0aCA9IGRpY3QuZ2V0KCJXIiwgIldpZHRoIik7CiAgICBsZXQgaGVpZ2h0ID0gZGljdC5nZXQoIkgiLCAiSGVpZ2h0Iik7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbWFnZS53aWR0aCkgJiYgaW1hZ2Uud2lkdGggPiAwICYmIE51bWJlci5pc0ludGVnZXIoaW1hZ2UuaGVpZ2h0KSAmJiBpbWFnZS5oZWlnaHQgPiAwICYmIChpbWFnZS53aWR0aCAhPT0gd2lkdGggfHwgaW1hZ2UuaGVpZ2h0ICE9PSBoZWlnaHQpKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKSgiUERGSW1hZ2UgLSB1c2luZyB0aGUgV2lkdGgvSGVpZ2h0IG9mIHRoZSBpbWFnZSBkYXRhLCAiICsgInJhdGhlciB0aGFuIHRoZSBpbWFnZSBkaWN0aW9uYXJ5LiIpOwogICAgICB3aWR0aCA9IGltYWdlLndpZHRoOwogICAgICBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CiAgICB9CiAgICBpZiAod2lkdGggPCAxIHx8IGhlaWdodCA8IDEpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBJbnZhbGlkIGltYWdlIHdpZHRoOiAke3dpZHRofSBvciBoZWlnaHQ6ICR7aGVpZ2h0fWApOwogICAgfQogICAgdGhpcy53aWR0aCA9IHdpZHRoOwogICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAgICB0aGlzLmludGVycG9sYXRlID0gZGljdC5nZXQoIkkiLCAiSW50ZXJwb2xhdGUiKTsKICAgIHRoaXMuaW1hZ2VNYXNrID0gZGljdC5nZXQoIklNIiwgIkltYWdlTWFzayIpIHx8IGZhbHNlOwogICAgdGhpcy5tYXR0ZSA9IGRpY3QuZ2V0KCJNYXR0ZSIpIHx8IGZhbHNlOwogICAgbGV0IGJpdHNQZXJDb21wb25lbnQgPSBpbWFnZS5iaXRzUGVyQ29tcG9uZW50OwogICAgaWYgKCFiaXRzUGVyQ29tcG9uZW50KSB7CiAgICAgIGJpdHNQZXJDb21wb25lbnQgPSBkaWN0LmdldCgiQlBDIiwgIkJpdHNQZXJDb21wb25lbnQiKTsKICAgICAgaWYgKCFiaXRzUGVyQ29tcG9uZW50KSB7CiAgICAgICAgaWYgKHRoaXMuaW1hZ2VNYXNrKSB7CiAgICAgICAgICBiaXRzUGVyQ29tcG9uZW50ID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBCaXRzIHBlciBjb21wb25lbnQgbWlzc2luZyBpbiBpbWFnZTogJHt0aGlzLmltYWdlTWFza31gKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHRoaXMuYnBjID0gYml0c1BlckNvbXBvbmVudDsKICAgIGlmICghdGhpcy5pbWFnZU1hc2spIHsKICAgICAgbGV0IGNvbG9yU3BhY2UgPSBkaWN0LmdldFJhdygiQ1MiKSB8fCBkaWN0LmdldFJhdygiQ29sb3JTcGFjZSIpOwogICAgICBpZiAoIWNvbG9yU3BhY2UpIHsKICAgICAgICAoMCwgX3V0aWwuaW5mbykoIkpQWCBpbWFnZXMgKHdoaWNoIGRvIG5vdCByZXF1aXJlIGNvbG9yIHNwYWNlcykiKTsKICAgICAgICBzd2l0Y2ggKGltYWdlLm51bUNvbXBzKSB7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlR3JheSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgY29sb3JTcGFjZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJEZXZpY2VSR0IiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIGNvbG9yU3BhY2UgPSBfcHJpbWl0aXZlcy5OYW1lLmdldCgiRGV2aWNlQ01ZSyIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSlBYIGltYWdlcyB3aXRoICR7aW1hZ2UubnVtQ29tcHN9IGNvbG9yIGNvbXBvbmVudHMgbm90IHN1cHBvcnRlZC5gKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5jb2xvclNwYWNlID0gX2NvbG9yc3BhY2UuQ29sb3JTcGFjZS5wYXJzZSh7CiAgICAgICAgY3M6IGNvbG9yU3BhY2UsCiAgICAgICAgeHJlZiwKICAgICAgICByZXNvdXJjZXM6IGlzSW5saW5lID8gcmVzIDogbnVsbCwKICAgICAgICBwZGZGdW5jdGlvbkZhY3RvcnksCiAgICAgICAgbG9jYWxDb2xvclNwYWNlQ2FjaGUKICAgICAgfSk7CiAgICAgIHRoaXMubnVtQ29tcHMgPSB0aGlzLmNvbG9yU3BhY2UubnVtQ29tcHM7CiAgICB9CiAgICB0aGlzLmRlY29kZSA9IGRpY3QuZ2V0QXJyYXkoIkQiLCAiRGVjb2RlIik7CiAgICB0aGlzLm5lZWRzRGVjb2RlID0gZmFsc2U7CiAgICBpZiAodGhpcy5kZWNvZGUgJiYgKHRoaXMuY29sb3JTcGFjZSAmJiAhdGhpcy5jb2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgYml0c1BlckNvbXBvbmVudCkgfHwgaXNNYXNrICYmICFfY29sb3JzcGFjZS5Db2xvclNwYWNlLmlzRGVmYXVsdERlY29kZSh0aGlzLmRlY29kZSwgMSkpKSB7CiAgICAgIHRoaXMubmVlZHNEZWNvZGUgPSB0cnVlOwogICAgICBjb25zdCBtYXggPSAoMSA8PCBiaXRzUGVyQ29tcG9uZW50KSAtIDE7CiAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzID0gW107CiAgICAgIHRoaXMuZGVjb2RlQWRkZW5kcyA9IFtdOwogICAgICBjb25zdCBpc0luZGV4ZWQgPSB0aGlzLmNvbG9yU3BhY2U/Lm5hbWUgPT09ICJJbmRleGVkIjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgdGhpcy5kZWNvZGUubGVuZ3RoOyBpICs9IDIsICsraikgewogICAgICAgIGNvbnN0IGRtaW4gPSB0aGlzLmRlY29kZVtpXTsKICAgICAgICBjb25zdCBkbWF4ID0gdGhpcy5kZWNvZGVbaSArIDFdOwogICAgICAgIHRoaXMuZGVjb2RlQ29lZmZpY2llbnRzW2pdID0gaXNJbmRleGVkID8gKGRtYXggLSBkbWluKSAvIG1heCA6IGRtYXggLSBkbWluOwogICAgICAgIHRoaXMuZGVjb2RlQWRkZW5kc1tqXSA9IGlzSW5kZXhlZCA/IGRtaW4gOiBtYXggKiBkbWluOwogICAgICB9CiAgICB9CiAgICBpZiAoc21hc2spIHsKICAgICAgdGhpcy5zbWFzayA9IG5ldyBQREZJbWFnZSh7CiAgICAgICAgeHJlZiwKICAgICAgICByZXMsCiAgICAgICAgaW1hZ2U6IHNtYXNrLAogICAgICAgIGlzSW5saW5lLAogICAgICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICB9KTsKICAgIH0gZWxzZSBpZiAobWFzaykgewogICAgICBpZiAobWFzayBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgbWFza0RpY3QgPSBtYXNrLmRpY3QsCiAgICAgICAgICBpbWFnZU1hc2sgPSBtYXNrRGljdC5nZXQoIklNIiwgIkltYWdlTWFzayIpOwogICAgICAgIGlmICghaW1hZ2VNYXNrKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIklnbm9yaW5nIC9NYXNrIGluIGltYWdlIHdpdGhvdXQgL0ltYWdlTWFzay4iKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5tYXNrID0gbmV3IFBERkltYWdlKHsKICAgICAgICAgICAgeHJlZiwKICAgICAgICAgICAgcmVzLAogICAgICAgICAgICBpbWFnZTogbWFzaywKICAgICAgICAgICAgaXNJbmxpbmUsCiAgICAgICAgICAgIGlzTWFzazogdHJ1ZSwKICAgICAgICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICAgICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubWFzayA9IG1hc2s7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIGFzeW5jIGJ1aWxkSW1hZ2UoewogICAgeHJlZiwKICAgIHJlcywKICAgIGltYWdlLAogICAgaXNJbmxpbmUgPSBmYWxzZSwKICAgIHBkZkZ1bmN0aW9uRmFjdG9yeSwKICAgIGxvY2FsQ29sb3JTcGFjZUNhY2hlCiAgfSkgewogICAgY29uc3QgaW1hZ2VEYXRhID0gaW1hZ2U7CiAgICBsZXQgc21hc2tEYXRhID0gbnVsbDsKICAgIGxldCBtYXNrRGF0YSA9IG51bGw7CiAgICBjb25zdCBzbWFzayA9IGltYWdlLmRpY3QuZ2V0KCJTTWFzayIpOwogICAgY29uc3QgbWFzayA9IGltYWdlLmRpY3QuZ2V0KCJNYXNrIik7CiAgICBpZiAoc21hc2spIHsKICAgICAgaWYgKHNtYXNrIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgICBzbWFza0RhdGEgPSBzbWFzazsKICAgICAgfSBlbHNlIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIlVuc3VwcG9ydGVkIC9TTWFzayBmb3JtYXQuIik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobWFzaykgewogICAgICBpZiAobWFzayBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtIHx8IEFycmF5LmlzQXJyYXkobWFzaykpIHsKICAgICAgICBtYXNrRGF0YSA9IG1hc2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJVbnN1cHBvcnRlZCAvTWFzayBmb3JtYXQuIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgUERGSW1hZ2UoewogICAgICB4cmVmLAogICAgICByZXMsCiAgICAgIGltYWdlOiBpbWFnZURhdGEsCiAgICAgIGlzSW5saW5lLAogICAgICBzbWFzazogc21hc2tEYXRhLAogICAgICBtYXNrOiBtYXNrRGF0YSwKICAgICAgcGRmRnVuY3Rpb25GYWN0b3J5LAogICAgICBsb2NhbENvbG9yU3BhY2VDYWNoZQogICAgfSk7CiAgfQogIHN0YXRpYyBjcmVhdGVSYXdNYXNrKHsKICAgIGltZ0FycmF5LAogICAgd2lkdGgsCiAgICBoZWlnaHQsCiAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSwKICAgIGludmVyc2VEZWNvZGUsCiAgICBpbnRlcnBvbGF0ZQogIH0pIHsKICAgIGNvbnN0IGNvbXB1dGVkTGVuZ3RoID0gKHdpZHRoICsgNyA+PiAzKSAqIGhlaWdodDsKICAgIGNvbnN0IGFjdHVhbExlbmd0aCA9IGltZ0FycmF5LmJ5dGVMZW5ndGg7CiAgICBjb25zdCBoYXZlRnVsbERhdGEgPSBjb21wdXRlZExlbmd0aCA9PT0gYWN0dWFsTGVuZ3RoOwogICAgbGV0IGRhdGEsIGk7CiAgICBpZiAoaW1hZ2VJc0Zyb21EZWNvZGVTdHJlYW0gJiYgKCFpbnZlcnNlRGVjb2RlIHx8IGhhdmVGdWxsRGF0YSkpIHsKICAgICAgZGF0YSA9IGltZ0FycmF5OwogICAgfSBlbHNlIGlmICghaW52ZXJzZURlY29kZSkgewogICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW1nQXJyYXkpOwogICAgfSBlbHNlIHsKICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KGNvbXB1dGVkTGVuZ3RoKTsKICAgICAgZGF0YS5zZXQoaW1nQXJyYXkpOwogICAgICBkYXRhLmZpbGwoMHhmZiwgYWN0dWFsTGVuZ3RoKTsKICAgIH0KICAgIGlmIChpbnZlcnNlRGVjb2RlKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxMZW5ndGg7IGkrKykgewogICAgICAgIGRhdGFbaV0gXj0gMHhmZjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgZGF0YSwKICAgICAgd2lkdGgsCiAgICAgIGhlaWdodCwKICAgICAgaW50ZXJwb2xhdGUKICAgIH07CiAgfQogIHN0YXRpYyBhc3luYyBjcmVhdGVNYXNrKHsKICAgIGltZ0FycmF5LAogICAgd2lkdGgsCiAgICBoZWlnaHQsCiAgICBpbWFnZUlzRnJvbURlY29kZVN0cmVhbSwKICAgIGludmVyc2VEZWNvZGUsCiAgICBpbnRlcnBvbGF0ZSwKICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gZmFsc2UKICB9KSB7CiAgICBjb25zdCBpc1NpbmdsZU9wYXF1ZVBpeGVsID0gd2lkdGggPT09IDEgJiYgaGVpZ2h0ID09PSAxICYmIGludmVyc2VEZWNvZGUgPT09IChpbWdBcnJheS5sZW5ndGggPT09IDAgfHwgISEoaW1nQXJyYXlbMF0gJiAxMjgpKTsKICAgIGlmIChpc1NpbmdsZU9wYXF1ZVBpeGVsKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaXNTaW5nbGVPcGFxdWVQaXhlbAogICAgICB9OwogICAgfQogICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgIGlmIChfaW1hZ2VfcmVzaXplci5JbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZCh3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTsKICAgICAgICAoMCwgX2ltYWdlX3V0aWxzLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7CiAgICAgICAgICBzcmM6IGltZ0FycmF5LAogICAgICAgICAgZGVzdDogZGF0YSwKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgbm9uQmxhY2tDb2xvcjogMCwKICAgICAgICAgIGludmVyc2VEZWNvZGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX2ltYWdlX3Jlc2l6ZXIuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHsKICAgICAgICAgIGtpbmQ6IF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQLAogICAgICAgICAgZGF0YSwKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0LAogICAgICAgICAgaW50ZXJwb2xhdGUKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgY29uc3QgaW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7CiAgICAgICgwLCBfaW1hZ2VfdXRpbHMuY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEpKHsKICAgICAgICBzcmM6IGltZ0FycmF5LAogICAgICAgIGRlc3Q6IGltZ0RhdGEuZGF0YSwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgbm9uQmxhY2tDb2xvcjogMCwKICAgICAgICBpbnZlcnNlRGVjb2RlCiAgICAgIH0pOwogICAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApOwogICAgICBjb25zdCBiaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogbnVsbCwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgaW50ZXJwb2xhdGUsCiAgICAgICAgYml0bWFwCiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXdNYXNrKHsKICAgICAgaW1nQXJyYXksCiAgICAgIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGludmVyc2VEZWNvZGUsCiAgICAgIGltYWdlSXNGcm9tRGVjb2RlU3RyZWFtLAogICAgICBpbnRlcnBvbGF0ZQogICAgfSk7CiAgfQogIGdldCBkcmF3V2lkdGgoKSB7CiAgICByZXR1cm4gTWF0aC5tYXgodGhpcy53aWR0aCwgdGhpcy5zbWFzaz8ud2lkdGggfHwgMCwgdGhpcy5tYXNrPy53aWR0aCB8fCAwKTsKICB9CiAgZ2V0IGRyYXdIZWlnaHQoKSB7CiAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5oZWlnaHQsIHRoaXMuc21hc2s/LmhlaWdodCB8fCAwLCB0aGlzLm1hc2s/LmhlaWdodCB8fCAwKTsKICB9CiAgZGVjb2RlQnVmZmVyKGJ1ZmZlcikgewogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CiAgICBjb25zdCBkZWNvZGVBZGRlbmRzID0gdGhpcy5kZWNvZGVBZGRlbmRzOwogICAgY29uc3QgZGVjb2RlQ29lZmZpY2llbnRzID0gdGhpcy5kZWNvZGVDb2VmZmljaWVudHM7CiAgICBjb25zdCBtYXggPSAoMSA8PCBicGMpIC0gMTsKICAgIGxldCBpLCBpaTsKICAgIGlmIChicGMgPT09IDEpIHsKICAgICAgZm9yIChpID0gMCwgaWkgPSBidWZmZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgIGJ1ZmZlcltpXSA9ICshYnVmZmVyW2ldOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBpbmRleCA9IDA7CiAgICBmb3IgKGkgPSAwLCBpaSA9IHRoaXMud2lkdGggKiB0aGlzLmhlaWdodDsgaSA8IGlpOyBpKyspIHsKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db21wczsgaisrKSB7CiAgICAgICAgYnVmZmVyW2luZGV4XSA9IGRlY29kZUFuZENsYW1wKGJ1ZmZlcltpbmRleF0sIGRlY29kZUFkZGVuZHNbal0sIGRlY29kZUNvZWZmaWNpZW50c1tqXSwgbWF4KTsKICAgICAgICBpbmRleCsrOwogICAgICB9CiAgICB9CiAgfQogIGdldENvbXBvbmVudHMoYnVmZmVyKSB7CiAgICBjb25zdCBicGMgPSB0aGlzLmJwYzsKICAgIGlmIChicGMgPT09IDgpIHsKICAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aDsKICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgY29uc3QgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQgKiBudW1Db21wczsKICAgIGxldCBidWZmZXJQb3MgPSAwOwogICAgbGV0IG91dHB1dDsKICAgIGlmIChicGMgPD0gOCkgewogICAgICBvdXRwdXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpOwogICAgfSBlbHNlIGlmIChicGMgPD0gMTYpIHsKICAgICAgb3V0cHV0ID0gbmV3IFVpbnQxNkFycmF5KGxlbmd0aCk7CiAgICB9IGVsc2UgewogICAgICBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkobGVuZ3RoKTsKICAgIH0KICAgIGNvbnN0IHJvd0NvbXBzID0gd2lkdGggKiBudW1Db21wczsKICAgIGNvbnN0IG1heCA9ICgxIDw8IGJwYykgLSAxOwogICAgbGV0IGkgPSAwLAogICAgICBpaSwKICAgICAgYnVmOwogICAgaWYgKGJwYyA9PT0gMSkgewogICAgICBsZXQgbWFzaywgbG9vcDFFbmQsIGxvb3AyRW5kOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CiAgICAgICAgbG9vcDFFbmQgPSBpICsgKHJvd0NvbXBzICYgfjcpOwogICAgICAgIGxvb3AyRW5kID0gaSArIHJvd0NvbXBzOwogICAgICAgIHdoaWxlIChpIDwgbG9vcDFFbmQpIHsKICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcltidWZmZXJQb3MrK107CiAgICAgICAgICBvdXRwdXRbaV0gPSBidWYgPj4gNyAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDFdID0gYnVmID4+IDYgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyAyXSA9IGJ1ZiA+PiA1ICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgM10gPSBidWYgPj4gNCAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDRdID0gYnVmID4+IDMgJiAxOwogICAgICAgICAgb3V0cHV0W2kgKyA1XSA9IGJ1ZiA+PiAyICYgMTsKICAgICAgICAgIG91dHB1dFtpICsgNl0gPSBidWYgPj4gMSAmIDE7CiAgICAgICAgICBvdXRwdXRbaSArIDddID0gYnVmICYgMTsKICAgICAgICAgIGkgKz0gODsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPCBsb29wMkVuZCkgewogICAgICAgICAgYnVmID0gYnVmZmVyW2J1ZmZlclBvcysrXTsKICAgICAgICAgIG1hc2sgPSAxMjg7CiAgICAgICAgICB3aGlsZSAoaSA8IGxvb3AyRW5kKSB7CiAgICAgICAgICAgIG91dHB1dFtpKytdID0gKyEhKGJ1ZiAmIG1hc2spOwogICAgICAgICAgICBtYXNrID4+PSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IGJpdHMgPSAwOwogICAgICBidWYgPSAwOwogICAgICBmb3IgKGkgPSAwLCBpaSA9IGxlbmd0aDsgaSA8IGlpOyArK2kpIHsKICAgICAgICBpZiAoaSAlIHJvd0NvbXBzID09PSAwKSB7CiAgICAgICAgICBidWYgPSAwOwogICAgICAgICAgYml0cyA9IDA7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChiaXRzIDwgYnBjKSB7CiAgICAgICAgICBidWYgPSBidWYgPDwgOCB8IGJ1ZmZlcltidWZmZXJQb3MrK107CiAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSBiaXRzIC0gYnBjOwogICAgICAgIGxldCB2YWx1ZSA9IGJ1ZiA+PiByZW1haW5pbmdCaXRzOwogICAgICAgIGlmICh2YWx1ZSA8IDApIHsKICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gbWF4KSB7CiAgICAgICAgICB2YWx1ZSA9IG1heDsKICAgICAgICB9CiAgICAgICAgb3V0cHV0W2ldID0gdmFsdWU7CiAgICAgICAgYnVmICY9ICgxIDw8IHJlbWFpbmluZ0JpdHMpIC0gMTsKICAgICAgICBiaXRzID0gcmVtYWluaW5nQml0czsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHB1dDsKICB9CiAgZmlsbE9wYWNpdHkocmdiYUJ1Ziwgd2lkdGgsIGhlaWdodCwgYWN0dWFsSGVpZ2h0LCBpbWFnZSkgewogICAgY29uc3Qgc21hc2sgPSB0aGlzLnNtYXNrOwogICAgY29uc3QgbWFzayA9IHRoaXMubWFzazsKICAgIGxldCBhbHBoYUJ1Ziwgc3csIHNoLCBpLCBpaSwgajsKICAgIGlmIChzbWFzaykgewogICAgICBzdyA9IHNtYXNrLndpZHRoOwogICAgICBzaCA9IHNtYXNrLmhlaWdodDsKICAgICAgYWxwaGFCdWYgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc3cgKiBzaCk7CiAgICAgIHNtYXNrLmZpbGxHcmF5QnVmZmVyKGFscGhhQnVmKTsKICAgICAgaWYgKHN3ICE9PSB3aWR0aCB8fCBzaCAhPT0gaGVpZ2h0KSB7CiAgICAgICAgYWxwaGFCdWYgPSByZXNpemVJbWFnZU1hc2soYWxwaGFCdWYsIHNtYXNrLmJwYywgc3csIHNoLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChtYXNrKSB7CiAgICAgIGlmIChtYXNrIGluc3RhbmNlb2YgUERGSW1hZ2UpIHsKICAgICAgICBzdyA9IG1hc2sud2lkdGg7CiAgICAgICAgc2ggPSBtYXNrLmhlaWdodDsKICAgICAgICBhbHBoYUJ1ZiA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzdyAqIHNoKTsKICAgICAgICBtYXNrLm51bUNvbXBzID0gMTsKICAgICAgICBtYXNrLmZpbGxHcmF5QnVmZmVyKGFscGhhQnVmKTsKICAgICAgICBmb3IgKGkgPSAwLCBpaSA9IHN3ICogc2g7IGkgPCBpaTsgKytpKSB7CiAgICAgICAgICBhbHBoYUJ1ZltpXSA9IDI1NSAtIGFscGhhQnVmW2ldOwogICAgICAgIH0KICAgICAgICBpZiAoc3cgIT09IHdpZHRoIHx8IHNoICE9PSBoZWlnaHQpIHsKICAgICAgICAgIGFscGhhQnVmID0gcmVzaXplSW1hZ2VNYXNrKGFscGhhQnVmLCBtYXNrLmJwYywgc3csIHNoLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtYXNrKSkgewogICAgICAgIGFscGhhQnVmID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0KTsKICAgICAgICBjb25zdCBudW1Db21wcyA9IHRoaXMubnVtQ29tcHM7CiAgICAgICAgZm9yIChpID0gMCwgaWkgPSB3aWR0aCAqIGhlaWdodDsgaSA8IGlpOyArK2kpIHsKICAgICAgICAgIGxldCBvcGFjaXR5ID0gMDsKICAgICAgICAgIGNvbnN0IGltYWdlT2Zmc2V0ID0gaSAqIG51bUNvbXBzOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bUNvbXBzOyArK2opIHsKICAgICAgICAgICAgY29uc3QgY29sb3IgPSBpbWFnZVtpbWFnZU9mZnNldCArIGpdOwogICAgICAgICAgICBjb25zdCBtYXNrT2Zmc2V0ID0gaiAqIDI7CiAgICAgICAgICAgIGlmIChjb2xvciA8IG1hc2tbbWFza09mZnNldF0gfHwgY29sb3IgPiBtYXNrW21hc2tPZmZzZXQgKyAxXSkgewogICAgICAgICAgICAgIG9wYWNpdHkgPSAyNTU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGFscGhhQnVmW2ldID0gb3BhY2l0eTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJVbmtub3duIG1hc2sgZm9ybWF0LiIpOwogICAgICB9CiAgICB9CiAgICBpZiAoYWxwaGFCdWYpIHsKICAgICAgZm9yIChpID0gMCwgaiA9IDMsIGlpID0gd2lkdGggKiBhY3R1YWxIZWlnaHQ7IGkgPCBpaTsgKytpLCBqICs9IDQpIHsKICAgICAgICByZ2JhQnVmW2pdID0gYWxwaGFCdWZbaV07CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoaSA9IDAsIGogPSAzLCBpaSA9IHdpZHRoICogYWN0dWFsSGVpZ2h0OyBpIDwgaWk7ICsraSwgaiArPSA0KSB7CiAgICAgICAgcmdiYUJ1ZltqXSA9IDI1NTsKICAgICAgfQogICAgfQogIH0KICB1bmRvUHJlYmxlbmQoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICBjb25zdCBtYXR0ZSA9IHRoaXMuc21hc2s/Lm1hdHRlOwogICAgaWYgKCFtYXR0ZSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBtYXR0ZVJnYiA9IHRoaXMuY29sb3JTcGFjZS5nZXRSZ2IobWF0dGUsIDApOwogICAgY29uc3QgbWF0dGVSID0gbWF0dGVSZ2JbMF07CiAgICBjb25zdCBtYXR0ZUcgPSBtYXR0ZVJnYlsxXTsKICAgIGNvbnN0IG1hdHRlQiA9IG1hdHRlUmdiWzJdOwogICAgY29uc3QgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQgKiA0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gNCkgewogICAgICBjb25zdCBhbHBoYSA9IGJ1ZmZlcltpICsgM107CiAgICAgIGlmIChhbHBoYSA9PT0gMCkgewogICAgICAgIGJ1ZmZlcltpXSA9IDI1NTsKICAgICAgICBidWZmZXJbaSArIDFdID0gMjU1OwogICAgICAgIGJ1ZmZlcltpICsgMl0gPSAyNTU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgayA9IDI1NSAvIGFscGhhOwogICAgICBidWZmZXJbaV0gPSAoYnVmZmVyW2ldIC0gbWF0dGVSKSAqIGsgKyBtYXR0ZVI7CiAgICAgIGJ1ZmZlcltpICsgMV0gPSAoYnVmZmVyW2kgKyAxXSAtIG1hdHRlRykgKiBrICsgbWF0dGVHOwogICAgICBidWZmZXJbaSArIDJdID0gKGJ1ZmZlcltpICsgMl0gLSBtYXR0ZUIpICogayArIG1hdHRlQjsKICAgIH0KICB9CiAgYXN5bmMgY3JlYXRlSW1hZ2VEYXRhKGZvcmNlUkdCQSA9IGZhbHNlLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9IGZhbHNlKSB7CiAgICBjb25zdCBkcmF3V2lkdGggPSB0aGlzLmRyYXdXaWR0aDsKICAgIGNvbnN0IGRyYXdIZWlnaHQgPSB0aGlzLmRyYXdIZWlnaHQ7CiAgICBjb25zdCBpbWdEYXRhID0gewogICAgICB3aWR0aDogZHJhd1dpZHRoLAogICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsCiAgICAgIGludGVycG9sYXRlOiB0aGlzLmludGVycG9sYXRlLAogICAgICBraW5kOiAwLAogICAgICBkYXRhOiBudWxsCiAgICB9OwogICAgY29uc3QgbnVtQ29tcHMgPSB0aGlzLm51bUNvbXBzOwogICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IHRoaXMud2lkdGg7CiAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9IHRoaXMuaGVpZ2h0OwogICAgY29uc3QgYnBjID0gdGhpcy5icGM7CiAgICBjb25zdCByb3dCeXRlcyA9IG9yaWdpbmFsV2lkdGggKiBudW1Db21wcyAqIGJwYyArIDcgPj4gMzsKICAgIGNvbnN0IG11c3RCZVJlc2l6ZWQgPSBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiBfaW1hZ2VfcmVzaXplci5JbWFnZVJlc2l6ZXIubmVlZHNUb0JlUmVzaXplZChkcmF3V2lkdGgsIGRyYXdIZWlnaHQpOwogICAgaWYgKCFmb3JjZVJHQkEpIHsKICAgICAgbGV0IGtpbmQ7CiAgICAgIGlmICh0aGlzLmNvbG9yU3BhY2UubmFtZSA9PT0gIkRldmljZUdyYXkiICYmIGJwYyA9PT0gMSkgewogICAgICAgIGtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFA7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2xvclNwYWNlLm5hbWUgPT09ICJEZXZpY2VSR0IiICYmIGJwYyA9PT0gOCAmJiAhdGhpcy5uZWVkc0RlY29kZSkgewogICAgICAgIGtpbmQgPSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQOwogICAgICB9CiAgICAgIGlmIChraW5kICYmICF0aGlzLnNtYXNrICYmICF0aGlzLm1hc2sgJiYgZHJhd1dpZHRoID09PSBvcmlnaW5hbFdpZHRoICYmIGRyYXdIZWlnaHQgPT09IG9yaWdpbmFsSGVpZ2h0KSB7CiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0SW1hZ2VCeXRlcyhvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzLCB7fSk7CiAgICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7CiAgICAgICAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICAgICAgICByZXR1cm4gX2ltYWdlX3Jlc2l6ZXIuSW1hZ2VSZXNpemVyLmNyZWF0ZUltYWdlKHsKICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgICAgICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsCiAgICAgICAgICAgICAgaW50ZXJwb2xhdGU6IHRoaXMuaW50ZXJwb2xhdGUKICAgICAgICAgICAgfSwgdGhpcy5uZWVkc0RlY29kZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVCaXRtYXAoa2luZCwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIGRhdGEpOwogICAgICAgIH0KICAgICAgICBpbWdEYXRhLmtpbmQgPSBraW5kOwogICAgICAgIGltZ0RhdGEuZGF0YSA9IGRhdGE7CiAgICAgICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKGtpbmQgPT09IF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCwgIlBERkltYWdlLmNyZWF0ZUltYWdlRGF0YTogVGhlIGltYWdlIG11c3QgYmUgZ3JheXNjYWxlLiIpOwogICAgICAgICAgY29uc3QgYnVmZmVyID0gaW1nRGF0YS5kYXRhOwogICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnVmZmVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgYnVmZmVyW2ldIF49IDB4ZmY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbWdEYXRhOwogICAgICB9CiAgICAgIGlmICh0aGlzLmltYWdlIGluc3RhbmNlb2YgX2pwZWdfc3RyZWFtLkpwZWdTdHJlYW0gJiYgIXRoaXMuc21hc2sgJiYgIXRoaXMubWFzayAmJiAhdGhpcy5uZWVkc0RlY29kZSkgewogICAgICAgIGxldCBpbWFnZUxlbmd0aCA9IG9yaWdpbmFsSGVpZ2h0ICogcm93Qnl0ZXM7CiAgICAgICAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmICFtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgICBsZXQgaXNIYW5kbGVkID0gZmFsc2U7CiAgICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoICo9IDQ7CiAgICAgICAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlUkdCIjoKICAgICAgICAgICAgICBpbWFnZUxlbmd0aCA9IGltYWdlTGVuZ3RoIC8gMyAqIDQ7CiAgICAgICAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiRGV2aWNlQ01ZSyI6CiAgICAgICAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0hhbmRsZWQpIHsKICAgICAgICAgICAgY29uc3QgcmdiYSA9IHRoaXMuZ2V0SW1hZ2VCeXRlcyhpbWFnZUxlbmd0aCwgewogICAgICAgICAgICAgIGRyYXdXaWR0aCwKICAgICAgICAgICAgICBkcmF3SGVpZ2h0LAogICAgICAgICAgICAgIGZvcmNlUkdCQTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQml0bWFwKF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIHJnYmEpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzd2l0Y2ggKHRoaXMuY29sb3JTcGFjZS5uYW1lKSB7CiAgICAgICAgICAgIGNhc2UgIkRldmljZUdyYXkiOgogICAgICAgICAgICAgIGltYWdlTGVuZ3RoICo9IDM7CiAgICAgICAgICAgIGNhc2UgIkRldmljZVJHQiI6CiAgICAgICAgICAgIGNhc2UgIkRldmljZUNNWUsiOgogICAgICAgICAgICAgIGltZ0RhdGEua2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA7CiAgICAgICAgICAgICAgaW1nRGF0YS5kYXRhID0gdGhpcy5nZXRJbWFnZUJ5dGVzKGltYWdlTGVuZ3RoLCB7CiAgICAgICAgICAgICAgICBkcmF3V2lkdGgsCiAgICAgICAgICAgICAgICBkcmF3SGVpZ2h0LAogICAgICAgICAgICAgICAgZm9yY2VSR0I6IHRydWUKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBpZiAobXVzdEJlUmVzaXplZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9pbWFnZV9yZXNpemVyLkltYWdlUmVzaXplci5jcmVhdGVJbWFnZShpbWdEYXRhKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGltZ0RhdGE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBjb25zdCBpbWdBcnJheSA9IHRoaXMuZ2V0SW1hZ2VCeXRlcyhvcmlnaW5hbEhlaWdodCAqIHJvd0J5dGVzLCB7CiAgICAgIGludGVybmFsOiB0cnVlCiAgICB9KTsKICAgIGNvbnN0IGFjdHVhbEhlaWdodCA9IDAgfCBpbWdBcnJheS5sZW5ndGggLyByb3dCeXRlcyAqIGRyYXdIZWlnaHQgLyBvcmlnaW5hbEhlaWdodDsKICAgIGNvbnN0IGNvbXBzID0gdGhpcy5nZXRDb21wb25lbnRzKGltZ0FycmF5KTsKICAgIGxldCBhbHBoYTAxLCBtYXliZVVuZG9QcmVibGVuZDsKICAgIGxldCBjYW52YXMsIGN0eCwgY2FudmFzSW1nRGF0YSwgZGF0YTsKICAgIGlmIChpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCAmJiAhbXVzdEJlUmVzaXplZCkgewogICAgICBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7CiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICBjYW52YXNJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YShkcmF3V2lkdGgsIGRyYXdIZWlnaHQpOwogICAgICBkYXRhID0gY2FudmFzSW1nRGF0YS5kYXRhOwogICAgfQogICAgaW1nRGF0YS5raW5kID0gX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFA7CiAgICBpZiAoIWZvcmNlUkdCQSAmJiAhdGhpcy5zbWFzayAmJiAhdGhpcy5tYXNrKSB7CiAgICAgIGlmICghaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgfHwgbXVzdEJlUmVzaXplZCkgewogICAgICAgIGltZ0RhdGEua2luZCA9IF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA7CiAgICAgICAgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogMyk7CiAgICAgICAgYWxwaGEwMSA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgYXJyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyKTsKICAgICAgICBhcnIuZmlsbChfdXRpbC5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmKTsKICAgICAgICBhbHBoYTAxID0gMTsKICAgICAgfQogICAgICBtYXliZVVuZG9QcmVibGVuZCA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCB8fCBtdXN0QmVSZXNpemVkKSB7CiAgICAgICAgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkcmF3V2lkdGggKiBkcmF3SGVpZ2h0ICogNCk7CiAgICAgIH0KICAgICAgYWxwaGEwMSA9IDE7CiAgICAgIG1heWJlVW5kb1ByZWJsZW5kID0gdHJ1ZTsKICAgICAgdGhpcy5maWxsT3BhY2l0eShkYXRhLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQsIGFjdHVhbEhlaWdodCwgY29tcHMpOwogICAgfQogICAgaWYgKHRoaXMubmVlZHNEZWNvZGUpIHsKICAgICAgdGhpcy5kZWNvZGVCdWZmZXIoY29tcHMpOwogICAgfQogICAgdGhpcy5jb2xvclNwYWNlLmZpbGxSZ2IoZGF0YSwgb3JpZ2luYWxXaWR0aCwgb3JpZ2luYWxIZWlnaHQsIGRyYXdXaWR0aCwgZHJhd0hlaWdodCwgYWN0dWFsSGVpZ2h0LCBicGMsIGNvbXBzLCBhbHBoYTAxKTsKICAgIGlmIChtYXliZVVuZG9QcmVibGVuZCkgewogICAgICB0aGlzLnVuZG9QcmVibGVuZChkYXRhLCBkcmF3V2lkdGgsIGFjdHVhbEhlaWdodCk7CiAgICB9CiAgICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgIW11c3RCZVJlc2l6ZWQpIHsKICAgICAgY3R4LnB1dEltYWdlRGF0YShjYW52YXNJbWdEYXRhLCAwLCAwKTsKICAgICAgY29uc3QgYml0bWFwID0gY2FudmFzLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpOwogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IG51bGwsCiAgICAgICAgd2lkdGg6IGRyYXdXaWR0aCwKICAgICAgICBoZWlnaHQ6IGRyYXdIZWlnaHQsCiAgICAgICAgYml0bWFwLAogICAgICAgIGludGVycG9sYXRlOiB0aGlzLmludGVycG9sYXRlCiAgICAgIH07CiAgICB9CiAgICBpbWdEYXRhLmRhdGEgPSBkYXRhOwogICAgaWYgKG11c3RCZVJlc2l6ZWQpIHsKICAgICAgcmV0dXJuIF9pbWFnZV9yZXNpemVyLkltYWdlUmVzaXplci5jcmVhdGVJbWFnZShpbWdEYXRhKTsKICAgIH0KICAgIHJldHVybiBpbWdEYXRhOwogIH0KICBmaWxsR3JheUJ1ZmZlcihidWZmZXIpIHsKICAgIGNvbnN0IG51bUNvbXBzID0gdGhpcy5udW1Db21wczsKICAgIGlmIChudW1Db21wcyAhPT0gMSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYFJlYWRpbmcgZ3JheSBzY2FsZSBmcm9tIGEgY29sb3IgaW1hZ2U6ICR7bnVtQ29tcHN9YCk7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGg7CiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodDsKICAgIGNvbnN0IGJwYyA9IHRoaXMuYnBjOwogICAgY29uc3Qgcm93Qnl0ZXMgPSB3aWR0aCAqIG51bUNvbXBzICogYnBjICsgNyA+PiAzOwogICAgY29uc3QgaW1nQXJyYXkgPSB0aGlzLmdldEltYWdlQnl0ZXMoaGVpZ2h0ICogcm93Qnl0ZXMsIHsKICAgICAgaW50ZXJuYWw6IHRydWUKICAgIH0pOwogICAgY29uc3QgY29tcHMgPSB0aGlzLmdldENvbXBvbmVudHMoaW1nQXJyYXkpOwogICAgbGV0IGksIGxlbmd0aDsKICAgIGlmIChicGMgPT09IDEpIHsKICAgICAgbGVuZ3RoID0gd2lkdGggKiBoZWlnaHQ7CiAgICAgIGlmICh0aGlzLm5lZWRzRGVjb2RlKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBjb21wc1tpXSAtIDEgJiAyNTU7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgICAgYnVmZmVyW2ldID0gLWNvbXBzW2ldICYgMjU1OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodGhpcy5uZWVkc0RlY29kZSkgewogICAgICB0aGlzLmRlY29kZUJ1ZmZlcihjb21wcyk7CiAgICB9CiAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodDsKICAgIGNvbnN0IHNjYWxlID0gMjU1IC8gKCgxIDw8IGJwYykgLSAxKTsKICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICBidWZmZXJbaV0gPSBzY2FsZSAqIGNvbXBzW2ldOwogICAgfQogIH0KICBjcmVhdGVCaXRtYXAoa2luZCwgd2lkdGgsIGhlaWdodCwgc3JjKSB7CiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHdpZHRoLCBoZWlnaHQpOwogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBsZXQgaW1nRGF0YTsKICAgIGlmIChraW5kID09PSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUCkgewogICAgICBpbWdEYXRhID0gbmV3IEltYWdlRGF0YShzcmMsIHdpZHRoLCBoZWlnaHQpOwogICAgfSBlbHNlIHsKICAgICAgaW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7CiAgICAgICgwLCBfaW1hZ2VfdXRpbHMuY29udmVydFRvUkdCQSkoewogICAgICAgIGtpbmQsCiAgICAgICAgc3JjLAogICAgICAgIGRlc3Q6IG5ldyBVaW50MzJBcnJheShpbWdEYXRhLmRhdGEuYnVmZmVyKSwKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgaW52ZXJzZURlY29kZTogdGhpcy5uZWVkc0RlY29kZQogICAgICB9KTsKICAgIH0KICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nRGF0YSwgMCwgMCk7CiAgICBjb25zdCBiaXRtYXAgPSBjYW52YXMudHJhbnNmZXJUb0ltYWdlQml0bWFwKCk7CiAgICByZXR1cm4gewogICAgICBkYXRhOiBudWxsLAogICAgICB3aWR0aCwKICAgICAgaGVpZ2h0LAogICAgICBiaXRtYXAsCiAgICAgIGludGVycG9sYXRlOiB0aGlzLmludGVycG9sYXRlCiAgICB9OwogIH0KICBnZXRJbWFnZUJ5dGVzKGxlbmd0aCwgewogICAgZHJhd1dpZHRoLAogICAgZHJhd0hlaWdodCwKICAgIGZvcmNlUkdCQSA9IGZhbHNlLAogICAgZm9yY2VSR0IgPSBmYWxzZSwKICAgIGludGVybmFsID0gZmFsc2UKICB9KSB7CiAgICB0aGlzLmltYWdlLnJlc2V0KCk7CiAgICB0aGlzLmltYWdlLmRyYXdXaWR0aCA9IGRyYXdXaWR0aCB8fCB0aGlzLndpZHRoOwogICAgdGhpcy5pbWFnZS5kcmF3SGVpZ2h0ID0gZHJhd0hlaWdodCB8fCB0aGlzLmhlaWdodDsKICAgIHRoaXMuaW1hZ2UuZm9yY2VSR0JBID0gISFmb3JjZVJHQkE7CiAgICB0aGlzLmltYWdlLmZvcmNlUkdCID0gISFmb3JjZVJHQjsKICAgIGNvbnN0IGltYWdlQnl0ZXMgPSB0aGlzLmltYWdlLmdldEJ5dGVzKGxlbmd0aCk7CiAgICBpZiAoaW50ZXJuYWwgfHwgdGhpcy5pbWFnZSBpbnN0YW5jZW9mIF9kZWNvZGVfc3RyZWFtLkRlY29kZVN0cmVhbSkgewogICAgICByZXR1cm4gaW1hZ2VCeXRlczsKICAgIH0KICAgICgwLCBfdXRpbC5hc3NlcnQpKGltYWdlQnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5LCAnUERGSW1hZ2UuZ2V0SW1hZ2VCeXRlczogVW5zdXBwb3J0ZWQgImltYWdlQnl0ZXMiIHR5cGUuJyk7CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoaW1hZ2VCeXRlcyk7CiAgfQp9CmV4cG9ydHMuUERGSW1hZ2UgPSBQREZJbWFnZTsKCi8qKiovIH0pLAovKiA2NiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLmluY3JlbWVudGFsVXBkYXRlID0gaW5jcmVtZW50YWxVcGRhdGU7CmV4cG9ydHMud3JpdGVEaWN0ID0gd3JpdGVEaWN0OwpleHBvcnRzLndyaXRlT2JqZWN0ID0gd3JpdGVPYmplY3Q7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfeG1sX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNjcpOwp2YXIgX2Jhc2Vfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKdmFyIF9jcnlwdG8gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY4KTsKYXN5bmMgZnVuY3Rpb24gd3JpdGVPYmplY3QocmVmLCBvYmosIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CiAgYnVmZmVyLnB1c2goYCR7cmVmLm51bX0gJHtyZWYuZ2VufSBvYmpcbmApOwogIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICBhd2FpdCB3cml0ZURpY3Qob2JqLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgYXdhaXQgd3JpdGVTdHJlYW0ob2JqLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCJcbmVuZG9ialxuIik7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVEaWN0KGRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CiAgYnVmZmVyLnB1c2goIjw8Iik7CiAgZm9yIChjb25zdCBrZXkgb2YgZGljdC5nZXRLZXlzKCkpIHsKICAgIGJ1ZmZlci5wdXNoKGAgLyR7KDAsIF9jb3JlX3V0aWxzLmVzY2FwZVBERk5hbWUpKGtleSl9IGApOwogICAgYXdhaXQgd3JpdGVWYWx1ZShkaWN0LmdldFJhdyhrZXkpLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfQogIGJ1ZmZlci5wdXNoKCI+PiIpOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlU3RyZWFtKHN0cmVhbSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBsZXQgc3RyaW5nID0gc3RyZWFtLmdldFN0cmluZygpOwogIGlmICh0cmFuc2Zvcm0gIT09IG51bGwpIHsKICAgIHN0cmluZyA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHN0cmluZyk7CiAgfQogIGlmICh0eXBlb2YgQ29tcHJlc3Npb25TdHJlYW0gPT09ICJ1bmRlZmluZWQiKSB7CiAgICBzdHJlYW0uZGljdC5zZXQoIkxlbmd0aCIsIHN0cmluZy5sZW5ndGgpOwogICAgYXdhaXQgd3JpdGVEaWN0KHN0cmVhbS5kaWN0LCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgICBidWZmZXIucHVzaCgiIHN0cmVhbVxuIiwgc3RyaW5nLCAiXG5lbmRzdHJlYW0iKTsKICAgIHJldHVybjsKICB9CiAgY29uc3QgZmlsdGVyID0gYXdhaXQgc3RyZWFtLmRpY3QuZ2V0QXN5bmMoIkZpbHRlciIpOwogIGNvbnN0IGZsYXRlRGVjb2RlID0gX3ByaW1pdGl2ZXMuTmFtZS5nZXQoIkZsYXRlRGVjb2RlIik7CiAgY29uc3QgTUlOX0xFTkdUSF9GT1JfQ09NUFJFU1NJTkcgPSAyNTY7CiAgaWYgKHN0cmluZy5sZW5ndGggPj0gTUlOX0xFTkdUSF9GT1JfQ09NUFJFU1NJTkcgfHwgQXJyYXkuaXNBcnJheShmaWx0ZXIpICYmIGZpbHRlci5pbmNsdWRlcyhmbGF0ZURlY29kZSkgfHwgZmlsdGVyIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSAmJiBmaWx0ZXIubmFtZSA9PT0gZmxhdGVEZWNvZGUubmFtZSkgewogICAgdHJ5IHsKICAgICAgY29uc3QgYnl0ZUFycmF5ID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHN0cmluZyk7CiAgICAgIGNvbnN0IGNzID0gbmV3IENvbXByZXNzaW9uU3RyZWFtKCJkZWZsYXRlIik7CiAgICAgIGNvbnN0IHdyaXRlciA9IGNzLndyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICB3cml0ZXIud3JpdGUoYnl0ZUFycmF5KTsKICAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IG5ldyBSZXNwb25zZShjcy5yZWFkYWJsZSkuYXJyYXlCdWZmZXIoKTsKICAgICAgc3RyaW5nID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKG5ldyBVaW50OEFycmF5KGJ1ZikpOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7CiAgICAgICAgaWYgKCFmaWx0ZXIuaW5jbHVkZXMoZmxhdGVEZWNvZGUpKSB7CiAgICAgICAgICBmaWx0ZXIucHVzaChmbGF0ZURlY29kZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFmaWx0ZXIpIHsKICAgICAgICBzdHJlYW0uZGljdC5zZXQoIkZpbHRlciIsIGZsYXRlRGVjb2RlKTsKICAgICAgfSBlbHNlIGlmICghKGZpbHRlciBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHx8IGZpbHRlci5uYW1lICE9PSBmbGF0ZURlY29kZS5uYW1lKSB7CiAgICAgICAgc3RyZWFtLmRpY3Quc2V0KCJGaWx0ZXIiLCBbZmlsdGVyLCBmbGF0ZURlY29kZV0pOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICAoMCwgX3V0aWwuaW5mbykoYHdyaXRlU3RyZWFtIC0gY2Fubm90IGNvbXByZXNzIGRhdGE6ICIke2V4fSIuYCk7CiAgICB9CiAgfQogIHN0cmVhbS5kaWN0LnNldCgiTGVuZ3RoIiwgc3RyaW5nLmxlbmd0aCk7CiAgYXdhaXQgd3JpdGVEaWN0KHN0cmVhbS5kaWN0LCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgYnVmZmVyLnB1c2goIiBzdHJlYW1cbiIsIHN0cmluZywgIlxuZW5kc3RyZWFtIik7Cn0KYXN5bmMgZnVuY3Rpb24gd3JpdGVBcnJheShhcnJheSwgYnVmZmVyLCB0cmFuc2Zvcm0pIHsKICBidWZmZXIucHVzaCgiWyIpOwogIGxldCBmaXJzdCA9IHRydWU7CiAgZm9yIChjb25zdCB2YWwgb2YgYXJyYXkpIHsKICAgIGlmICghZmlyc3QpIHsKICAgICAgYnVmZmVyLnB1c2goIiAiKTsKICAgIH0gZWxzZSB7CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICBhd2FpdCB3cml0ZVZhbHVlKHZhbCwgYnVmZmVyLCB0cmFuc2Zvcm0pOwogIH0KICBidWZmZXIucHVzaCgiXSIpOwp9CmFzeW5jIGZ1bmN0aW9uIHdyaXRlVmFsdWUodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKSB7CiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgYnVmZmVyLnB1c2goYC8keygwLCBfY29yZV91dGlscy5lc2NhcGVQREZOYW1lKSh2YWx1ZS5uYW1lKX1gKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICBidWZmZXIucHVzaChgJHt2YWx1ZS5udW19ICR7dmFsdWUuZ2VufSBSYCk7CiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgYXdhaXQgd3JpdGVBcnJheSh2YWx1ZSwgYnVmZmVyLCB0cmFuc2Zvcm0pOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkgewogICAgICB2YWx1ZSA9IHRyYW5zZm9ybS5lbmNyeXB0U3RyaW5nKHZhbHVlKTsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKGAoJHsoMCwgX2NvcmVfdXRpbHMuZXNjYXBlU3RyaW5nKSh2YWx1ZSl9KWApOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAibnVtYmVyIikgewogICAgYnVmZmVyLnB1c2goKDAsIF9jb3JlX3V0aWxzLm51bWJlclRvU3RyaW5nKSh2YWx1ZSkpOwogIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAiYm9vbGVhbiIpIHsKICAgIGJ1ZmZlci5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpOwogIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICBhd2FpdCB3cml0ZURpY3QodmFsdWUsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgIGF3YWl0IHdyaXRlU3RyZWFtKHZhbHVlLCBidWZmZXIsIHRyYW5zZm9ybSk7CiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgYnVmZmVyLnB1c2goIm51bGwiKTsKICB9IGVsc2UgewogICAgKDAsIF91dGlsLndhcm4pKGBVbmhhbmRsZWQgdmFsdWUgaW4gd3JpdGVyOiAke3R5cGVvZiB2YWx1ZX0sIHBsZWFzZSBmaWxlIGEgYnVnLmApOwogIH0KfQpmdW5jdGlvbiB3cml0ZUludChudW1iZXIsIHNpemUsIG9mZnNldCwgYnVmZmVyKSB7CiAgZm9yIChsZXQgaSA9IHNpemUgKyBvZmZzZXQgLSAxOyBpID4gb2Zmc2V0IC0gMTsgaS0tKSB7CiAgICBidWZmZXJbaV0gPSBudW1iZXIgJiAweGZmOwogICAgbnVtYmVyID4+PSA4OwogIH0KICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKfQpmdW5jdGlvbiB3cml0ZVN0cmluZyhzdHJpbmcsIG9mZnNldCwgYnVmZmVyKSB7CiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0cmluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgYnVmZmVyW29mZnNldCArIGldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweGZmOwogIH0KfQpmdW5jdGlvbiBjb21wdXRlTUQ1KGZpbGVzaXplLCB4cmVmSW5mbykgewogIGNvbnN0IHRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTsKICBjb25zdCBmaWxlbmFtZSA9IHhyZWZJbmZvLmZpbGVuYW1lIHx8ICIiOwogIGNvbnN0IG1kNUJ1ZmZlciA9IFt0aW1lLnRvU3RyaW5nKCksIGZpbGVuYW1lLCBmaWxlc2l6ZS50b1N0cmluZygpXTsKICBsZXQgbWQ1QnVmZmVyTGVuID0gbWQ1QnVmZmVyLnJlZHVjZSgoYSwgc3RyKSA9PiBhICsgc3RyLmxlbmd0aCwgMCk7CiAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHhyZWZJbmZvLmluZm8pKSB7CiAgICBtZDVCdWZmZXIucHVzaCh2YWx1ZSk7CiAgICBtZDVCdWZmZXJMZW4gKz0gdmFsdWUubGVuZ3RoOwogIH0KICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KG1kNUJ1ZmZlckxlbik7CiAgbGV0IG9mZnNldCA9IDA7CiAgZm9yIChjb25zdCBzdHIgb2YgbWQ1QnVmZmVyKSB7CiAgICB3cml0ZVN0cmluZyhzdHIsIG9mZnNldCwgYXJyYXkpOwogICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7CiAgfQogIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoKDAsIF9jcnlwdG8uY2FsY3VsYXRlTUQ1KShhcnJheSkpOwp9CmZ1bmN0aW9uIHdyaXRlWEZBRGF0YUZvckFjcm9mb3JtKHN0ciwgbmV3UmVmcykgewogIGNvbnN0IHhtbCA9IG5ldyBfeG1sX3BhcnNlci5TaW1wbGVYTUxQYXJzZXIoewogICAgaGFzQXR0cmlidXRlczogdHJ1ZQogIH0pLnBhcnNlRnJvbVN0cmluZyhzdHIpOwogIGZvciAoY29uc3QgewogICAgeGZhCiAgfSBvZiBuZXdSZWZzKSB7CiAgICBpZiAoIXhmYSkgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgcGF0aCwKICAgICAgdmFsdWUKICAgIH0gPSB4ZmE7CiAgICBpZiAoIXBhdGgpIHsKICAgICAgY29udGludWU7CiAgICB9CiAgICBjb25zdCBub2RlUGF0aCA9ICgwLCBfY29yZV91dGlscy5wYXJzZVhGQVBhdGgpKHBhdGgpOwogICAgbGV0IG5vZGUgPSB4bWwuZG9jdW1lbnRFbGVtZW50LnNlYXJjaE5vZGUobm9kZVBhdGgsIDApOwogICAgaWYgKCFub2RlICYmIG5vZGVQYXRoLmxlbmd0aCA+IDEpIHsKICAgICAgbm9kZSA9IHhtbC5kb2N1bWVudEVsZW1lbnQuc2VhcmNoTm9kZShbbm9kZVBhdGguYXQoLTEpXSwgMCk7CiAgICB9CiAgICBpZiAobm9kZSkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICBub2RlLmNoaWxkTm9kZXMgPSB2YWx1ZS5tYXAodmFsID0+IG5ldyBfeG1sX3BhcnNlci5TaW1wbGVET01Ob2RlKCJ2YWx1ZSIsIHZhbCkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuY2hpbGROb2RlcyA9IFtuZXcgX3htbF9wYXJzZXIuU2ltcGxlRE9NTm9kZSgiI3RleHQiLCB2YWx1ZSldOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoMCwgX3V0aWwud2FybikoYE5vZGUgbm90IGZvdW5kIGZvciBwYXRoOiAke3BhdGh9YCk7CiAgICB9CiAgfQogIGNvbnN0IGJ1ZmZlciA9IFtdOwogIHhtbC5kb2N1bWVudEVsZW1lbnQuZHVtcChidWZmZXIpOwogIHJldHVybiBidWZmZXIuam9pbigiIik7Cn0KYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWNyb2Zvcm0oewogIHhyZWYsCiAgYWNyb0Zvcm0sCiAgYWNyb0Zvcm1SZWYsCiAgaGFzWGZhLAogIGhhc1hmYURhdGFzZXRzRW50cnksCiAgeGZhRGF0YXNldHNSZWYsCiAgbmVlZEFwcGVhcmFuY2VzLAogIG5ld1JlZnMKfSkgewogIGlmIChoYXNYZmEgJiYgIWhhc1hmYURhdGFzZXRzRW50cnkgJiYgIXhmYURhdGFzZXRzUmVmKSB7CiAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIENhbm5vdCBzYXZlIGl0Iik7CiAgfQogIGlmICghbmVlZEFwcGVhcmFuY2VzICYmICghaGFzWGZhIHx8ICF4ZmFEYXRhc2V0c1JlZikpIHsKICAgIHJldHVybjsKICB9CiAgY29uc3QgZGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHhyZWYpOwogIGZvciAoY29uc3Qga2V5IG9mIGFjcm9Gb3JtLmdldEtleXMoKSkgewogICAgZGljdC5zZXQoa2V5LCBhY3JvRm9ybS5nZXRSYXcoa2V5KSk7CiAgfQogIGlmIChoYXNYZmEgJiYgIWhhc1hmYURhdGFzZXRzRW50cnkpIHsKICAgIGNvbnN0IG5ld1hmYSA9IGFjcm9Gb3JtLmdldCgiWEZBIikuc2xpY2UoKTsKICAgIG5ld1hmYS5zcGxpY2UoMiwgMCwgImRhdGFzZXRzIik7CiAgICBuZXdYZmEuc3BsaWNlKDMsIDAsIHhmYURhdGFzZXRzUmVmKTsKICAgIGRpY3Quc2V0KCJYRkEiLCBuZXdYZmEpOwogIH0KICBpZiAobmVlZEFwcGVhcmFuY2VzKSB7CiAgICBkaWN0LnNldCgiTmVlZEFwcGVhcmFuY2VzIiwgdHJ1ZSk7CiAgfQogIGNvbnN0IGVuY3J5cHQgPSB4cmVmLmVuY3J5cHQ7CiAgbGV0IHRyYW5zZm9ybSA9IG51bGw7CiAgaWYgKGVuY3J5cHQpIHsKICAgIHRyYW5zZm9ybSA9IGVuY3J5cHQuY3JlYXRlQ2lwaGVyVHJhbnNmb3JtKGFjcm9Gb3JtUmVmLm51bSwgYWNyb0Zvcm1SZWYuZ2VuKTsKICB9CiAgY29uc3QgYnVmZmVyID0gW107CiAgYXdhaXQgd3JpdGVPYmplY3QoYWNyb0Zvcm1SZWYsIGRpY3QsIGJ1ZmZlciwgdHJhbnNmb3JtKTsKICBuZXdSZWZzLnB1c2goewogICAgcmVmOiBhY3JvRm9ybVJlZiwKICAgIGRhdGE6IGJ1ZmZlci5qb2luKCIiKQogIH0pOwp9CmZ1bmN0aW9uIHVwZGF0ZVhGQSh7CiAgeGZhRGF0YSwKICB4ZmFEYXRhc2V0c1JlZiwKICBuZXdSZWZzLAogIHhyZWYKfSkgewogIGlmICh4ZmFEYXRhID09PSBudWxsKSB7CiAgICBjb25zdCBkYXRhc2V0cyA9IHhyZWYuZmV0Y2hJZlJlZih4ZmFEYXRhc2V0c1JlZik7CiAgICB4ZmFEYXRhID0gd3JpdGVYRkFEYXRhRm9yQWNyb2Zvcm0oZGF0YXNldHMuZ2V0U3RyaW5nKCksIG5ld1JlZnMpOwogIH0KICBjb25zdCBlbmNyeXB0ID0geHJlZi5lbmNyeXB0OwogIGlmIChlbmNyeXB0KSB7CiAgICBjb25zdCB0cmFuc2Zvcm0gPSBlbmNyeXB0LmNyZWF0ZUNpcGhlclRyYW5zZm9ybSh4ZmFEYXRhc2V0c1JlZi5udW0sIHhmYURhdGFzZXRzUmVmLmdlbik7CiAgICB4ZmFEYXRhID0gdHJhbnNmb3JtLmVuY3J5cHRTdHJpbmcoeGZhRGF0YSk7CiAgfQogIGNvbnN0IGRhdGEgPSBgJHt4ZmFEYXRhc2V0c1JlZi5udW19ICR7eGZhRGF0YXNldHNSZWYuZ2VufSBvYmpcbmAgKyBgPDwgL1R5cGUgL0VtYmVkZGVkRmlsZSAvTGVuZ3RoICR7eGZhRGF0YS5sZW5ndGh9Pj5cbnN0cmVhbVxuYCArIHhmYURhdGEgKyAiXG5lbmRzdHJlYW1cbmVuZG9ialxuIjsKICBuZXdSZWZzLnB1c2goewogICAgcmVmOiB4ZmFEYXRhc2V0c1JlZiwKICAgIGRhdGEKICB9KTsKfQphc3luYyBmdW5jdGlvbiBpbmNyZW1lbnRhbFVwZGF0ZSh7CiAgb3JpZ2luYWxEYXRhLAogIHhyZWZJbmZvLAogIG5ld1JlZnMsCiAgeHJlZiA9IG51bGwsCiAgaGFzWGZhID0gZmFsc2UsCiAgeGZhRGF0YXNldHNSZWYgPSBudWxsLAogIGhhc1hmYURhdGFzZXRzRW50cnkgPSBmYWxzZSwKICBuZWVkQXBwZWFyYW5jZXMsCiAgYWNyb0Zvcm1SZWYgPSBudWxsLAogIGFjcm9Gb3JtID0gbnVsbCwKICB4ZmFEYXRhID0gbnVsbAp9KSB7CiAgYXdhaXQgdXBkYXRlQWNyb2Zvcm0oewogICAgeHJlZiwKICAgIGFjcm9Gb3JtLAogICAgYWNyb0Zvcm1SZWYsCiAgICBoYXNYZmEsCiAgICBoYXNYZmFEYXRhc2V0c0VudHJ5LAogICAgeGZhRGF0YXNldHNSZWYsCiAgICBuZWVkQXBwZWFyYW5jZXMsCiAgICBuZXdSZWZzCiAgfSk7CiAgaWYgKGhhc1hmYSkgewogICAgdXBkYXRlWEZBKHsKICAgICAgeGZhRGF0YSwKICAgICAgeGZhRGF0YXNldHNSZWYsCiAgICAgIG5ld1JlZnMsCiAgICAgIHhyZWYKICAgIH0pOwogIH0KICBjb25zdCBuZXdYcmVmID0gbmV3IF9wcmltaXRpdmVzLkRpY3QobnVsbCk7CiAgY29uc3QgcmVmRm9yWHJlZlRhYmxlID0geHJlZkluZm8ubmV3UmVmOwogIGxldCBidWZmZXIsIGJhc2VPZmZzZXQ7CiAgY29uc3QgbGFzdEJ5dGUgPSBvcmlnaW5hbERhdGEuYXQoLTEpOwogIGlmIChsYXN0Qnl0ZSA9PT0gMHgwYSB8fCBsYXN0Qnl0ZSA9PT0gMHgwZCkgewogICAgYnVmZmVyID0gW107CiAgICBiYXNlT2Zmc2V0ID0gb3JpZ2luYWxEYXRhLmxlbmd0aDsKICB9IGVsc2UgewogICAgYnVmZmVyID0gWyJcbiJdOwogICAgYmFzZU9mZnNldCA9IG9yaWdpbmFsRGF0YS5sZW5ndGggKyAxOwogIH0KICBuZXdYcmVmLnNldCgiU2l6ZSIsIHJlZkZvclhyZWZUYWJsZS5udW0gKyAxKTsKICBuZXdYcmVmLnNldCgiUHJldiIsIHhyZWZJbmZvLnN0YXJ0WFJlZik7CiAgbmV3WHJlZi5zZXQoIlR5cGUiLCBfcHJpbWl0aXZlcy5OYW1lLmdldCgiWFJlZiIpKTsKICBpZiAoeHJlZkluZm8ucm9vdFJlZiAhPT0gbnVsbCkgewogICAgbmV3WHJlZi5zZXQoIlJvb3QiLCB4cmVmSW5mby5yb290UmVmKTsKICB9CiAgaWYgKHhyZWZJbmZvLmluZm9SZWYgIT09IG51bGwpIHsKICAgIG5ld1hyZWYuc2V0KCJJbmZvIiwgeHJlZkluZm8uaW5mb1JlZik7CiAgfQogIGlmICh4cmVmSW5mby5lbmNyeXB0UmVmICE9PSBudWxsKSB7CiAgICBuZXdYcmVmLnNldCgiRW5jcnlwdCIsIHhyZWZJbmZvLmVuY3J5cHRSZWYpOwogIH0KICBuZXdSZWZzLnB1c2goewogICAgcmVmOiByZWZGb3JYcmVmVGFibGUsCiAgICBkYXRhOiAiIgogIH0pOwogIG5ld1JlZnMgPSBuZXdSZWZzLnNvcnQoKGEsIGIpID0+IHsKICAgIHJldHVybiBhLnJlZi5udW0gLSBiLnJlZi5udW07CiAgfSk7CiAgY29uc3QgeHJlZlRhYmxlRGF0YSA9IFtbMCwgMSwgMHhmZmZmXV07CiAgY29uc3QgaW5kZXhlcyA9IFswLCAxXTsKICBsZXQgbWF4T2Zmc2V0ID0gMDsKICBmb3IgKGNvbnN0IHsKICAgIHJlZiwKICAgIGRhdGEKICB9IG9mIG5ld1JlZnMpIHsKICAgIG1heE9mZnNldCA9IE1hdGgubWF4KG1heE9mZnNldCwgYmFzZU9mZnNldCk7CiAgICB4cmVmVGFibGVEYXRhLnB1c2goWzEsIGJhc2VPZmZzZXQsIE1hdGgubWluKHJlZi5nZW4sIDB4ZmZmZildKTsKICAgIGJhc2VPZmZzZXQgKz0gZGF0YS5sZW5ndGg7CiAgICBpbmRleGVzLnB1c2gocmVmLm51bSwgMSk7CiAgICBidWZmZXIucHVzaChkYXRhKTsKICB9CiAgbmV3WHJlZi5zZXQoIkluZGV4IiwgaW5kZXhlcyk7CiAgaWYgKEFycmF5LmlzQXJyYXkoeHJlZkluZm8uZmlsZUlkcykgJiYgeHJlZkluZm8uZmlsZUlkcy5sZW5ndGggPiAwKSB7CiAgICBjb25zdCBtZDUgPSBjb21wdXRlTUQ1KGJhc2VPZmZzZXQsIHhyZWZJbmZvKTsKICAgIG5ld1hyZWYuc2V0KCJJRCIsIFt4cmVmSW5mby5maWxlSWRzWzBdLCBtZDVdKTsKICB9CiAgY29uc3Qgb2Zmc2V0U2l6ZSA9IE1hdGguY2VpbChNYXRoLmxvZzIobWF4T2Zmc2V0KSAvIDgpOwogIGNvbnN0IHNpemVzID0gWzEsIG9mZnNldFNpemUsIDJdOwogIGNvbnN0IHN0cnVjdFNpemUgPSBzaXplc1swXSArIHNpemVzWzFdICsgc2l6ZXNbMl07CiAgY29uc3QgdGFibGVMZW5ndGggPSBzdHJ1Y3RTaXplICogeHJlZlRhYmxlRGF0YS5sZW5ndGg7CiAgbmV3WHJlZi5zZXQoIlciLCBzaXplcyk7CiAgbmV3WHJlZi5zZXQoIkxlbmd0aCIsIHRhYmxlTGVuZ3RoKTsKICBidWZmZXIucHVzaChgJHtyZWZGb3JYcmVmVGFibGUubnVtfSAke3JlZkZvclhyZWZUYWJsZS5nZW59IG9ialxuYCk7CiAgYXdhaXQgd3JpdGVEaWN0KG5ld1hyZWYsIGJ1ZmZlciwgbnVsbCk7CiAgYnVmZmVyLnB1c2goIiBzdHJlYW1cbiIpOwogIGNvbnN0IGJ1ZmZlckxlbiA9IGJ1ZmZlci5yZWR1Y2UoKGEsIHN0cikgPT4gYSArIHN0ci5sZW5ndGgsIDApOwogIGNvbnN0IGZvb3RlciA9IGBcbmVuZHN0cmVhbVxuZW5kb2JqXG5zdGFydHhyZWZcbiR7YmFzZU9mZnNldH1cbiUlRU9GXG5gOwogIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkob3JpZ2luYWxEYXRhLmxlbmd0aCArIGJ1ZmZlckxlbiArIHRhYmxlTGVuZ3RoICsgZm9vdGVyLmxlbmd0aCk7CiAgYXJyYXkuc2V0KG9yaWdpbmFsRGF0YSk7CiAgbGV0IG9mZnNldCA9IG9yaWdpbmFsRGF0YS5sZW5ndGg7CiAgZm9yIChjb25zdCBzdHIgb2YgYnVmZmVyKSB7CiAgICB3cml0ZVN0cmluZyhzdHIsIG9mZnNldCwgYXJyYXkpOwogICAgb2Zmc2V0ICs9IHN0ci5sZW5ndGg7CiAgfQogIGZvciAoY29uc3QgW3R5cGUsIG9iak9mZnNldCwgZ2VuXSBvZiB4cmVmVGFibGVEYXRhKSB7CiAgICBvZmZzZXQgPSB3cml0ZUludCh0eXBlLCBzaXplc1swXSwgb2Zmc2V0LCBhcnJheSk7CiAgICBvZmZzZXQgPSB3cml0ZUludChvYmpPZmZzZXQsIHNpemVzWzFdLCBvZmZzZXQsIGFycmF5KTsKICAgIG9mZnNldCA9IHdyaXRlSW50KGdlbiwgc2l6ZXNbMl0sIG9mZnNldCwgYXJyYXkpOwogIH0KICB3cml0ZVN0cmluZyhmb290ZXIsIG9mZnNldCwgYXJyYXkpOwogIHJldHVybiBhcnJheTsKfQoKLyoqKi8gfSksCi8qIDY3ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuWE1MUGFyc2VyRXJyb3JDb2RlID0gZXhwb3J0cy5YTUxQYXJzZXJCYXNlID0gZXhwb3J0cy5TaW1wbGVYTUxQYXJzZXIgPSBleHBvcnRzLlNpbXBsZURPTU5vZGUgPSB2b2lkIDA7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CmNvbnN0IFhNTFBhcnNlckVycm9yQ29kZSA9IHsKICBOb0Vycm9yOiAwLAogIEVuZE9mRG9jdW1lbnQ6IC0xLAogIFVudGVybWluYXRlZENkYXQ6IC0yLAogIFVudGVybWluYXRlZFhtbERlY2xhcmF0aW9uOiAtMywKICBVbnRlcm1pbmF0ZWREb2N0eXBlRGVjbGFyYXRpb246IC00LAogIFVudGVybWluYXRlZENvbW1lbnQ6IC01LAogIE1hbGZvcm1lZEVsZW1lbnQ6IC02LAogIE91dE9mTWVtb3J5OiAtNywKICBVbnRlcm1pbmF0ZWRBdHRyaWJ1dGVWYWx1ZTogLTgsCiAgVW50ZXJtaW5hdGVkRWxlbWVudDogLTksCiAgRWxlbWVudE5ldmVyQmVndW46IC0xMAp9OwpleHBvcnRzLlhNTFBhcnNlckVycm9yQ29kZSA9IFhNTFBhcnNlckVycm9yQ29kZTsKZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKHMsIGluZGV4KSB7CiAgY29uc3QgY2ggPSBzW2luZGV4XTsKICByZXR1cm4gY2ggPT09ICIgIiB8fCBjaCA9PT0gIlxuIiB8fCBjaCA9PT0gIlxyIiB8fCBjaCA9PT0gIlx0IjsKfQpmdW5jdGlvbiBpc1doaXRlc3BhY2VTdHJpbmcocykgewogIGZvciAobGV0IGkgPSAwLCBpaSA9IHMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgaWYgKCFpc1doaXRlc3BhY2UocywgaSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KICByZXR1cm4gdHJ1ZTsKfQpjbGFzcyBYTUxQYXJzZXJCYXNlIHsKICBfcmVzb2x2ZUVudGl0aWVzKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2VBbGwoLyYoW147XSspOy9nLCAoYWxsLCBlbnRpdHkpID0+IHsKICAgICAgaWYgKGVudGl0eS5zdWJzdHJpbmcoMCwgMikgPT09ICIjeCIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygyKSwgMTYpKTsKICAgICAgfSBlbHNlIGlmIChlbnRpdHkuc3Vic3RyaW5nKDAsIDEpID09PSAiIyIpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoZW50aXR5LnN1YnN0cmluZygxKSwgMTApKTsKICAgICAgfQogICAgICBzd2l0Y2ggKGVudGl0eSkgewogICAgICAgIGNhc2UgImx0IjoKICAgICAgICAgIHJldHVybiAiPCI7CiAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgcmV0dXJuICI+IjsKICAgICAgICBjYXNlICJhbXAiOgogICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICBjYXNlICJxdW90IjoKICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgY2FzZSAiYXBvcyI6CiAgICAgICAgICByZXR1cm4gIiciOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLm9uUmVzb2x2ZUVudGl0eShlbnRpdHkpOwogICAgfSk7CiAgfQogIF9wYXJzZUNvbnRlbnQocywgc3RhcnQpIHsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTsKICAgIGxldCBwb3MgPSBzdGFydDsKICAgIGZ1bmN0aW9uIHNraXBXcygpIHsKICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShzLCBwb3MpKSB7CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgIH0KICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPiIgJiYgc1twb3NdICE9PSAiLyIpIHsKICAgICAgKytwb3M7CiAgICB9CiAgICBjb25zdCBuYW1lID0gcy5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICBza2lwV3MoKTsKICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICIvIiAmJiBzW3Bvc10gIT09ICI/IikgewogICAgICBza2lwV3MoKTsKICAgICAgbGV0IGF0dHJOYW1lID0gIiIsCiAgICAgICAgYXR0clZhbHVlID0gIiI7CiAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCAmJiAhaXNXaGl0ZXNwYWNlKHMsIHBvcykgJiYgc1twb3NdICE9PSAiPSIpIHsKICAgICAgICBhdHRyTmFtZSArPSBzW3Bvc107CiAgICAgICAgKytwb3M7CiAgICAgIH0KICAgICAgc2tpcFdzKCk7CiAgICAgIGlmIChzW3Bvc10gIT09ICI9IikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgICsrcG9zOwogICAgICBza2lwV3MoKTsKICAgICAgY29uc3QgYXR0ckVuZENoYXIgPSBzW3Bvc107CiAgICAgIGlmIChhdHRyRW5kQ2hhciAhPT0gJyInICYmIGF0dHJFbmRDaGFyICE9PSAiJyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBhdHRyRW5kSW5kZXggPSBzLmluZGV4T2YoYXR0ckVuZENoYXIsICsrcG9zKTsKICAgICAgaWYgKGF0dHJFbmRJbmRleCA8IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBhdHRyVmFsdWUgPSBzLnN1YnN0cmluZyhwb3MsIGF0dHJFbmRJbmRleCk7CiAgICAgIGF0dHJpYnV0ZXMucHVzaCh7CiAgICAgICAgbmFtZTogYXR0ck5hbWUsCiAgICAgICAgdmFsdWU6IHRoaXMuX3Jlc29sdmVFbnRpdGllcyhhdHRyVmFsdWUpCiAgICAgIH0pOwogICAgICBwb3MgPSBhdHRyRW5kSW5kZXggKyAxOwogICAgICBza2lwV3MoKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIG5hbWUsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIHBhcnNlZDogcG9zIC0gc3RhcnQKICAgIH07CiAgfQogIF9wYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzLCBzdGFydCkgewogICAgbGV0IHBvcyA9IHN0YXJ0OwogICAgZnVuY3Rpb24gc2tpcFdzKCkgewogICAgICB3aGlsZSAocG9zIDwgcy5sZW5ndGggJiYgaXNXaGl0ZXNwYWNlKHMsIHBvcykpIHsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmICFpc1doaXRlc3BhY2UocywgcG9zKSAmJiBzW3Bvc10gIT09ICI+IiAmJiBzW3Bvc10gIT09ICI/IiAmJiBzW3Bvc10gIT09ICIvIikgewogICAgICArK3BvczsKICAgIH0KICAgIGNvbnN0IG5hbWUgPSBzLnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgIHNraXBXcygpOwogICAgY29uc3QgYXR0clN0YXJ0ID0gcG9zOwogICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoICYmIChzW3Bvc10gIT09ICI/IiB8fCBzW3BvcyArIDFdICE9PSAiPiIpKSB7CiAgICAgICsrcG9zOwogICAgfQogICAgY29uc3QgdmFsdWUgPSBzLnN1YnN0cmluZyhhdHRyU3RhcnQsIHBvcyk7CiAgICByZXR1cm4gewogICAgICBuYW1lLAogICAgICB2YWx1ZSwKICAgICAgcGFyc2VkOiBwb3MgLSBzdGFydAogICAgfTsKICB9CiAgcGFyc2VYbWwocykgewogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBzLmxlbmd0aCkgewogICAgICBjb25zdCBjaCA9IHNbaV07CiAgICAgIGxldCBqID0gaTsKICAgICAgaWYgKGNoID09PSAiPCIpIHsKICAgICAgICArK2o7CiAgICAgICAgY29uc3QgY2gyID0gc1tqXTsKICAgICAgICBsZXQgcTsKICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICAgICsrajsKICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGopOwogICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uRW5kRWxlbWVudChzLnN1YnN0cmluZyhqLCBxKSk7CiAgICAgICAgICAgIGogPSBxICsgMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICI/IjoKICAgICAgICAgICAgKytqOwogICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuX3BhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHMsIGopOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIHBpLnBhcnNlZCwgaiArIHBpLnBhcnNlZCArIDIpICE9PSAiPz4iKSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5VbnRlcm1pbmF0ZWRYbWxEZWNsYXJhdGlvbik7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25QaShwaS5uYW1lLCBwaS52YWx1ZSk7CiAgICAgICAgICAgIGogKz0gcGkucGFyc2VkICsgMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICIhIjoKICAgICAgICAgICAgaWYgKHMuc3Vic3RyaW5nKGogKyAxLCBqICsgMykgPT09ICItLSIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCItLT4iLCBqICsgMyk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENvbW1lbnQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ29tbWVudChzLnN1YnN0cmluZyhqICsgMywgcSkpOwogICAgICAgICAgICAgIGogPSBxICsgMzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgMSwgaiArIDgpID09PSAiW0NEQVRBWyIpIHsKICAgICAgICAgICAgICBxID0gcy5pbmRleE9mKCJdXT4iLCBqICsgOCk7CiAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZENkYXQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0aGlzLm9uQ2RhdGEocy5zdWJzdHJpbmcoaiArIDgsIHEpKTsKICAgICAgICAgICAgICBqID0gcSArIDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zdWJzdHJpbmcoaiArIDEsIGogKyA4KSA9PT0gIkRPQ1RZUEUiKSB7CiAgICAgICAgICAgICAgY29uc3QgcTIgPSBzLmluZGV4T2YoIlsiLCBqICsgOCk7CiAgICAgICAgICAgICAgbGV0IGNvbXBsZXhEb2N0eXBlID0gZmFsc2U7CiAgICAgICAgICAgICAgcSA9IHMuaW5kZXhPZigiPiIsIGogKyA4KTsKICAgICAgICAgICAgICBpZiAocSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHEyID4gMCAmJiBxID4gcTIpIHsKICAgICAgICAgICAgICAgIHEgPSBzLmluZGV4T2YoIl0+IiwgaiArIDgpOwogICAgICAgICAgICAgICAgaWYgKHEgPCAwKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuVW50ZXJtaW5hdGVkRG9jdHlwZURlY2xhcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcGxleERvY3R5cGUgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBkb2N0eXBlQ29udGVudCA9IHMuc3Vic3RyaW5nKGogKyA4LCBxICsgKGNvbXBsZXhEb2N0eXBlID8gMSA6IDApKTsKICAgICAgICAgICAgICB0aGlzLm9uRG9jdHlwZShkb2N0eXBlQ29udGVudCk7CiAgICAgICAgICAgICAgaiA9IHEgKyAoY29tcGxleERvY3R5cGUgPyAyIDogMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKFhNTFBhcnNlckVycm9yQ29kZS5NYWxmb3JtZWRFbGVtZW50KTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fcGFyc2VDb250ZW50KHMsIGopOwogICAgICAgICAgICBpZiAoY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHRoaXMub25FcnJvcihYTUxQYXJzZXJFcnJvckNvZGUuTWFsZm9ybWVkRWxlbWVudCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBpc0Nsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAocy5zdWJzdHJpbmcoaiArIGNvbnRlbnQucGFyc2VkLCBqICsgY29udGVudC5wYXJzZWQgKyAyKSA9PT0gIi8+IikgewogICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN1YnN0cmluZyhqICsgY29udGVudC5wYXJzZWQsIGogKyBjb250ZW50LnBhcnNlZCArIDEpICE9PSAiPiIpIHsKICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoWE1MUGFyc2VyRXJyb3JDb2RlLlVudGVybWluYXRlZEVsZW1lbnQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uQmVnaW5FbGVtZW50KGNvbnRlbnQubmFtZSwgY29udGVudC5hdHRyaWJ1dGVzLCBpc0Nsb3NlZCk7CiAgICAgICAgICAgIGogKz0gY29udGVudC5wYXJzZWQgKyAoaXNDbG9zZWQgPyAyIDogMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoaiA8IHMubGVuZ3RoICYmIHNbal0gIT09ICI8IikgewogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBjb25zdCB0ZXh0ID0gcy5zdWJzdHJpbmcoaSwgaik7CiAgICAgICAgdGhpcy5vblRleHQodGhpcy5fcmVzb2x2ZUVudGl0aWVzKHRleHQpKTsKICAgICAgfQogICAgICBpID0gajsKICAgIH0KICB9CiAgb25SZXNvbHZlRW50aXR5KG5hbWUpIHsKICAgIHJldHVybiBgJiR7bmFtZX07YDsKICB9CiAgb25QaShuYW1lLCB2YWx1ZSkge30KICBvbkNvbW1lbnQodGV4dCkge30KICBvbkNkYXRhKHRleHQpIHt9CiAgb25Eb2N0eXBlKGRvY3R5cGVDb250ZW50KSB7fQogIG9uVGV4dCh0ZXh0KSB7fQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHt9CiAgb25FbmRFbGVtZW50KG5hbWUpIHt9CiAgb25FcnJvcihjb2RlKSB7fQp9CmV4cG9ydHMuWE1MUGFyc2VyQmFzZSA9IFhNTFBhcnNlckJhc2U7CmNsYXNzIFNpbXBsZURPTU5vZGUgewogIGNvbnN0cnVjdG9yKG5vZGVOYW1lLCBub2RlVmFsdWUpIHsKICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKICAgIHRoaXMubm9kZVZhbHVlID0gbm9kZVZhbHVlOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJwYXJlbnROb2RlIiwgewogICAgICB2YWx1ZTogbnVsbCwKICAgICAgd3JpdGFibGU6IHRydWUKICAgIH0pOwogIH0KICBnZXQgZmlyc3RDaGlsZCgpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/LlswXTsKICB9CiAgZ2V0IG5leHRTaWJsaW5nKCkgewogICAgY29uc3QgY2hpbGROb2RlcyA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzOwogICAgaWYgKCFjaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBjb25zdCBpbmRleCA9IGNoaWxkTm9kZXMuaW5kZXhPZih0aGlzKTsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiBjaGlsZE5vZGVzW2luZGV4ICsgMV07CiAgfQogIGdldCB0ZXh0Q29udGVudCgpIHsKICAgIGlmICghdGhpcy5jaGlsZE5vZGVzKSB7CiAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSB8fCAiIjsKICAgIH0KICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXMubWFwKGZ1bmN0aW9uIChjaGlsZCkgewogICAgICByZXR1cm4gY2hpbGQudGV4dENvbnRlbnQ7CiAgICB9KS5qb2luKCIiKTsKICB9CiAgZ2V0IGNoaWxkcmVuKCkgewogICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlcyB8fCBbXTsKICB9CiAgaGFzQ2hpbGROb2RlcygpIHsKICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDA7CiAgfQogIHNlYXJjaE5vZGUocGF0aHMsIHBvcykgewogICAgaWYgKHBvcyA+PSBwYXRocy5sZW5ndGgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBjb25zdCBjb21wb25lbnQgPSBwYXRoc1twb3NdOwogICAgY29uc3Qgc3RhY2sgPSBbXTsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChjb21wb25lbnQubmFtZSA9PT0gbm9kZS5ub2RlTmFtZSkgewogICAgICAgIGlmIChjb21wb25lbnQucG9zID09PSAwKSB7CiAgICAgICAgICBjb25zdCByZXMgPSBub2RlLnNlYXJjaE5vZGUocGF0aHMsIHBvcyArIDEpOwogICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhY2subGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgW3BhcmVudF0gPSBzdGFjay5wb3AoKTsKICAgICAgICAgIGxldCBzaWJsaW5nUG9zID0gMDsKICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFyZW50LmNoaWxkTm9kZXMpIHsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSBjaGlsZC5ub2RlTmFtZSkgewogICAgICAgICAgICAgIGlmIChzaWJsaW5nUG9zID09PSBjb21wb25lbnQucG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmdQb3MrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vZGUuc2VhcmNoTm9kZShwYXRocywgcG9zICsgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXM/Lmxlbmd0aCA+IDApIHsKICAgICAgICBzdGFjay5wdXNoKFtub2RlLCAwXSk7CiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1swXTsKICAgICAgfSBlbHNlIGlmIChzdGFjay5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBbcGFyZW50LCBjdXJyZW50UG9zXSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgY29uc3QgbmV3UG9zID0gY3VycmVudFBvcyArIDE7CiAgICAgICAgICBpZiAobmV3UG9zIDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0YWNrLnB1c2goW3BhcmVudCwgbmV3UG9zXSk7CiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQuY2hpbGROb2Rlc1tuZXdQb3NdOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGR1bXAoYnVmZmVyKSB7CiAgICBpZiAodGhpcy5ub2RlTmFtZSA9PT0gIiN0ZXh0IikgewogICAgICBidWZmZXIucHVzaCgoMCwgX2NvcmVfdXRpbHMuZW5jb2RlVG9YbWxTdHJpbmcpKHRoaXMubm9kZVZhbHVlKSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGJ1ZmZlci5wdXNoKGA8JHt0aGlzLm5vZGVOYW1lfWApOwogICAgaWYgKHRoaXMuYXR0cmlidXRlcykgewogICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiB0aGlzLmF0dHJpYnV0ZXMpIHsKICAgICAgICBidWZmZXIucHVzaChgICR7YXR0cmlidXRlLm5hbWV9PSIkeygwLCBfY29yZV91dGlscy5lbmNvZGVUb1htbFN0cmluZykoYXR0cmlidXRlLnZhbHVlKX0iYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmhhc0NoaWxkTm9kZXMoKSkgewogICAgICBidWZmZXIucHVzaCgiPiIpOwogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGROb2RlcykgewogICAgICAgIGNoaWxkLmR1bXAoYnVmZmVyKTsKICAgICAgfQogICAgICBidWZmZXIucHVzaChgPC8ke3RoaXMubm9kZU5hbWV9PmApOwogICAgfSBlbHNlIGlmICh0aGlzLm5vZGVWYWx1ZSkgewogICAgICBidWZmZXIucHVzaChgPiR7KDAsIF9jb3JlX3V0aWxzLmVuY29kZVRvWG1sU3RyaW5nKSh0aGlzLm5vZGVWYWx1ZSl9PC8ke3RoaXMubm9kZU5hbWV9PmApOwogICAgfSBlbHNlIHsKICAgICAgYnVmZmVyLnB1c2goIi8+Iik7CiAgICB9CiAgfQp9CmV4cG9ydHMuU2ltcGxlRE9NTm9kZSA9IFNpbXBsZURPTU5vZGU7CmNsYXNzIFNpbXBsZVhNTFBhcnNlciBleHRlbmRzIFhNTFBhcnNlckJhc2UgewogIGNvbnN0cnVjdG9yKHsKICAgIGhhc0F0dHJpYnV0ZXMgPSBmYWxzZSwKICAgIGxvd2VyQ2FzZU5hbWUgPSBmYWxzZQogIH0pIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQgPSBudWxsOwogICAgdGhpcy5fc3RhY2sgPSBudWxsOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLl9oYXNBdHRyaWJ1dGVzID0gaGFzQXR0cmlidXRlczsKICAgIHRoaXMuX2xvd2VyQ2FzZU5hbWUgPSBsb3dlckNhc2VOYW1lOwogIH0KICBwYXJzZUZyb21TdHJpbmcoZGF0YSkgewogICAgdGhpcy5fY3VycmVudEZyYWdtZW50ID0gW107CiAgICB0aGlzLl9zdGFjayA9IFtdOwogICAgdGhpcy5fZXJyb3JDb2RlID0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3I7CiAgICB0aGlzLnBhcnNlWG1sKGRhdGEpOwogICAgaWYgKHRoaXMuX2Vycm9yQ29kZSAhPT0gWE1MUGFyc2VyRXJyb3JDb2RlLk5vRXJyb3IpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IFtkb2N1bWVudEVsZW1lbnRdID0gdGhpcy5fY3VycmVudEZyYWdtZW50OwogICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGRvY3VtZW50RWxlbWVudAogICAgfTsKICB9CiAgb25UZXh0KHRleHQpIHsKICAgIGlmIChpc1doaXRlc3BhY2VTdHJpbmcodGV4dCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQ2RhdGEodGV4dCkgewogICAgY29uc3Qgbm9kZSA9IG5ldyBTaW1wbGVET01Ob2RlKCIjdGV4dCIsIHRleHQpOwogICAgdGhpcy5fY3VycmVudEZyYWdtZW50LnB1c2gobm9kZSk7CiAgfQogIG9uQmVnaW5FbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlzRW1wdHkpIHsKICAgIGlmICh0aGlzLl9sb3dlckNhc2VOYW1lKSB7CiAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICB9CiAgICBjb25zdCBub2RlID0gbmV3IFNpbXBsZURPTU5vZGUobmFtZSk7CiAgICBub2RlLmNoaWxkTm9kZXMgPSBbXTsKICAgIGlmICh0aGlzLl9oYXNBdHRyaWJ1dGVzKSB7CiAgICAgIG5vZGUuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICB9CiAgICB0aGlzLl9jdXJyZW50RnJhZ21lbnQucHVzaChub2RlKTsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudEZyYWdtZW50KTsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IG5vZGUuY2hpbGROb2RlczsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIHRoaXMuX2N1cnJlbnRGcmFnbWVudCA9IHRoaXMuX3N0YWNrLnBvcCgpIHx8IFtdOwogICAgY29uc3QgbGFzdEVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RnJhZ21lbnQuYXQoLTEpOwogICAgaWYgKCFsYXN0RWxlbWVudCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIGxhc3RFbGVtZW50LmNoaWxkTm9kZXMpIHsKICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUgPSBsYXN0RWxlbWVudDsKICAgIH0KICAgIHJldHVybiBsYXN0RWxlbWVudDsKICB9CiAgb25FcnJvcihjb2RlKSB7CiAgICB0aGlzLl9lcnJvckNvZGUgPSBjb2RlOwogIH0KfQpleHBvcnRzLlNpbXBsZVhNTFBhcnNlciA9IFNpbXBsZVhNTFBhcnNlcjsKCi8qKiovIH0pLAovKiA2OCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLmNhbGN1bGF0ZVNIQTI1NiA9IGV4cG9ydHMuY2FsY3VsYXRlTUQ1ID0gZXhwb3J0cy5QREYyMCA9IGV4cG9ydHMuUERGMTcgPSBleHBvcnRzLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSBleHBvcnRzLkFSQ0ZvdXJDaXBoZXIgPSBleHBvcnRzLkFFUzI1NkNpcGhlciA9IGV4cG9ydHMuQUVTMTI4Q2lwaGVyID0gdm9pZCAwOwpleHBvcnRzLmNhbGN1bGF0ZVNIQTM4NCA9IGNhbGN1bGF0ZVNIQTM4NDsKZXhwb3J0cy5jYWxjdWxhdGVTSEE1MTIgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfZGVjcnlwdF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY5KTsKY2xhc3MgQVJDRm91ckNpcGhlciB7CiAgY29uc3RydWN0b3Ioa2V5KSB7CiAgICB0aGlzLmEgPSAwOwogICAgdGhpcy5iID0gMDsKICAgIGNvbnN0IHMgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgY29uc3Qga2V5TGVuZ3RoID0ga2V5Lmxlbmd0aDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgc1tpXSA9IGk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCAyNTY7ICsraSkgewogICAgICBjb25zdCB0bXAgPSBzW2ldOwogICAgICBqID0gaiArIHRtcCArIGtleVtpICUga2V5TGVuZ3RoXSAmIDB4ZmY7CiAgICAgIHNbaV0gPSBzW2pdOwogICAgICBzW2pdID0gdG1wOwogICAgfQogICAgdGhpcy5zID0gczsKICB9CiAgZW5jcnlwdEJsb2NrKGRhdGEpIHsKICAgIGxldCBhID0gdGhpcy5hLAogICAgICBiID0gdGhpcy5iOwogICAgY29uc3QgcyA9IHRoaXMuczsKICAgIGNvbnN0IG4gPSBkYXRhLmxlbmd0aDsKICAgIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgYSA9IGEgKyAxICYgMHhmZjsKICAgICAgY29uc3QgdG1wID0gc1thXTsKICAgICAgYiA9IGIgKyB0bXAgJiAweGZmOwogICAgICBjb25zdCB0bXAyID0gc1tiXTsKICAgICAgc1thXSA9IHRtcDI7CiAgICAgIHNbYl0gPSB0bXA7CiAgICAgIG91dHB1dFtpXSA9IGRhdGFbaV0gXiBzW3RtcCArIHRtcDIgJiAweGZmXTsKICAgIH0KICAgIHRoaXMuYSA9IGE7CiAgICB0aGlzLmIgPSBiOwogICAgcmV0dXJuIG91dHB1dDsKICB9CiAgZGVjcnlwdEJsb2NrKGRhdGEpIHsKICAgIHJldHVybiB0aGlzLmVuY3J5cHRCbG9jayhkYXRhKTsKICB9CiAgZW5jcnlwdChkYXRhKSB7CiAgICByZXR1cm4gdGhpcy5lbmNyeXB0QmxvY2soZGF0YSk7CiAgfQp9CmV4cG9ydHMuQVJDRm91ckNpcGhlciA9IEFSQ0ZvdXJDaXBoZXI7CmNvbnN0IGNhbGN1bGF0ZU1ENSA9IGZ1bmN0aW9uIGNhbGN1bGF0ZU1ENUNsb3N1cmUoKSB7CiAgY29uc3QgciA9IG5ldyBVaW50OEFycmF5KFs3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA3LCAxMiwgMTcsIDIyLCA1LCA5LCAxNCwgMjAsIDUsIDksIDE0LCAyMCwgNSwgOSwgMTQsIDIwLCA1LCA5LCAxNCwgMjAsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDQsIDExLCAxNiwgMjMsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjEsIDYsIDEwLCAxNSwgMjFdKTsKICBjb25zdCBrID0gbmV3IEludDMyQXJyYXkoWy02ODA4NzY5MzYsIC0zODk1NjQ1ODYsIDYwNjEwNTgxOSwgLTEwNDQ1MjUzMzAsIC0xNzY0MTg4OTcsIDEyMDAwODA0MjYsIC0xNDczMjMxMzQxLCAtNDU3MDU5ODMsIDE3NzAwMzU0MTYsIC0xOTU4NDE0NDE3LCAtNDIwNjMsIC0xOTkwNDA0MTYyLCAxODA0NjAzNjgyLCAtNDAzNDExMDEsIC0xNTAyMDAyMjkwLCAxMjM2NTM1MzI5LCAtMTY1Nzk2NTEwLCAtMTA2OTUwMTYzMiwgNjQzNzE3NzEzLCAtMzczODk3MzAyLCAtNzAxNTU4NjkxLCAzODAxNjA4MywgLTY2MDQ3ODMzNSwgLTQwNTUzNzg0OCwgNTY4NDQ2NDM4LCAtMTAxOTgwMzY5MCwgLTE4NzM2Mzk2MSwgMTE2MzUzMTUwMSwgLTE0NDQ2ODE0NjcsIC01MTQwMzc4NCwgMTczNTMyODQ3MywgLTE5MjY2MDc3MzQsIC0zNzg1NTgsIC0yMDIyNTc0NDYzLCAxODM5MDMwNTYyLCAtMzUzMDk1NTYsIC0xNTMwOTkyMDYwLCAxMjcyODkzMzUzLCAtMTU1NDk3NjMyLCAtMTA5NDczMDY0MCwgNjgxMjc5MTc0LCAtMzU4NTM3MjIyLCAtNzIyNTIxOTc5LCA3NjAyOTE4OSwgLTY0MDM2NDQ4NywgLTQyMTgxNTgzNSwgNTMwNzQyNTIwLCAtOTk1MzM4NjUxLCAtMTk4NjMwODQ0LCAxMTI2ODkxNDE1LCAtMTQxNjM1NDkwNSwgLTU3NDM0MDU1LCAxNzAwNDg1NTcxLCAtMTg5NDk4NjYwNiwgLTEwNTE1MjMsIC0yMDU0OTIyNzk5LCAxODczMzEzMzU5LCAtMzA2MTE3NDQsIC0xNTYwMTk4MzgwLCAxMzA5MTUxNjQ5LCAtMTQ1NTIzMDcwLCAtMTEyMDIxMDM3OSwgNzE4Nzg3MjU5LCAtMzQzNDg1NTUxXSk7CiAgZnVuY3Rpb24gaGFzaChkYXRhLCBvZmZzZXQsIGxlbmd0aCkgewogICAgbGV0IGgwID0gMTczMjU4NDE5MywKICAgICAgaDEgPSAtMjcxNzMzODc5LAogICAgICBoMiA9IC0xNzMyNTg0MTk0LAogICAgICBoMyA9IDI3MTczMzg3ODsKICAgIGNvbnN0IHBhZGRlZExlbmd0aCA9IGxlbmd0aCArIDcyICYgfjYzOwogICAgY29uc3QgcGFkZGVkID0gbmV3IFVpbnQ4QXJyYXkocGFkZGVkTGVuZ3RoKTsKICAgIGxldCBpLCBqOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHBhZGRlZFtpXSA9IGRhdGFbb2Zmc2V0KytdOwogICAgfQogICAgcGFkZGVkW2krK10gPSAweDgwOwogICAgY29uc3QgbiA9IHBhZGRlZExlbmd0aCAtIDg7CiAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgcGFkZGVkW2krK10gPSAwOwogICAgfQogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPDwgMyAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDEzICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+IDIxICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBjb25zdCB3ID0gbmV3IEludDMyQXJyYXkoMTYpOwogICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2osIGkgKz0gNCkgewogICAgICAgIHdbal0gPSBwYWRkZWRbaV0gfCBwYWRkZWRbaSArIDFdIDw8IDggfCBwYWRkZWRbaSArIDJdIDw8IDE2IHwgcGFkZGVkW2kgKyAzXSA8PCAyNDsKICAgICAgfQogICAgICBsZXQgYSA9IGgwLAogICAgICAgIGIgPSBoMSwKICAgICAgICBjID0gaDIsCiAgICAgICAgZCA9IGgzLAogICAgICAgIGYsCiAgICAgICAgZzsKICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyArK2opIHsKICAgICAgICBpZiAoaiA8IDE2KSB7CiAgICAgICAgICBmID0gYiAmIGMgfCB+YiAmIGQ7CiAgICAgICAgICBnID0gajsKICAgICAgICB9IGVsc2UgaWYgKGogPCAzMikgewogICAgICAgICAgZiA9IGQgJiBiIHwgfmQgJiBjOwogICAgICAgICAgZyA9IDUgKiBqICsgMSAmIDE1OwogICAgICAgIH0gZWxzZSBpZiAoaiA8IDQ4KSB7CiAgICAgICAgICBmID0gYiBeIGMgXiBkOwogICAgICAgICAgZyA9IDMgKiBqICsgNSAmIDE1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmID0gYyBeIChiIHwgfmQpOwogICAgICAgICAgZyA9IDcgKiBqICYgMTU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHRtcCA9IGQsCiAgICAgICAgICByb3RhdGVBcmcgPSBhICsgZiArIGtbal0gKyB3W2ddIHwgMCwKICAgICAgICAgIHJvdGF0ZSA9IHJbal07CiAgICAgICAgZCA9IGM7CiAgICAgICAgYyA9IGI7CiAgICAgICAgYiA9IGIgKyAocm90YXRlQXJnIDw8IHJvdGF0ZSB8IHJvdGF0ZUFyZyA+Pj4gMzIgLSByb3RhdGUpIHwgMDsKICAgICAgICBhID0gdG1wOwogICAgICB9CiAgICAgIGgwID0gaDAgKyBhIHwgMDsKICAgICAgaDEgPSBoMSArIGIgfCAwOwogICAgICBoMiA9IGgyICsgYyB8IDA7CiAgICAgIGgzID0gaDMgKyBkIHwgMDsKICAgIH0KICAgIHJldHVybiBuZXcgVWludDhBcnJheShbaDAgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+Pj4gMjQgJiAweEZGLCBoMSAmIDB4RkYsIGgxID4+IDggJiAweEZGLCBoMSA+PiAxNiAmIDB4RkYsIGgxID4+PiAyNCAmIDB4RkYsIGgyICYgMHhGRiwgaDIgPj4gOCAmIDB4RkYsIGgyID4+IDE2ICYgMHhGRiwgaDIgPj4+IDI0ICYgMHhGRiwgaDMgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+Pj4gMjQgJiAweEZGXSk7CiAgfQogIHJldHVybiBoYXNoOwp9KCk7CmV4cG9ydHMuY2FsY3VsYXRlTUQ1ID0gY2FsY3VsYXRlTUQ1OwpjbGFzcyBXb3JkNjQgewogIGNvbnN0cnVjdG9yKGhpZ2hJbnRlZ2VyLCBsb3dJbnRlZ2VyKSB7CiAgICB0aGlzLmhpZ2ggPSBoaWdoSW50ZWdlciB8IDA7CiAgICB0aGlzLmxvdyA9IGxvd0ludGVnZXIgfCAwOwogIH0KICBhbmQod29yZCkgewogICAgdGhpcy5oaWdoICY9IHdvcmQuaGlnaDsKICAgIHRoaXMubG93ICY9IHdvcmQubG93OwogIH0KICB4b3Iod29yZCkgewogICAgdGhpcy5oaWdoIF49IHdvcmQuaGlnaDsKICAgIHRoaXMubG93IF49IHdvcmQubG93OwogIH0KICBvcih3b3JkKSB7CiAgICB0aGlzLmhpZ2ggfD0gd29yZC5oaWdoOwogICAgdGhpcy5sb3cgfD0gd29yZC5sb3c7CiAgfQogIHNoaWZ0UmlnaHQocGxhY2VzKSB7CiAgICBpZiAocGxhY2VzID49IDMyKSB7CiAgICAgIHRoaXMubG93ID0gdGhpcy5oaWdoID4+PiBwbGFjZXMgLSAzMiB8IDA7CiAgICAgIHRoaXMuaGlnaCA9IDA7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmxvdyA9IHRoaXMubG93ID4+PiBwbGFjZXMgfCB0aGlzLmhpZ2ggPDwgMzIgLSBwbGFjZXM7CiAgICAgIHRoaXMuaGlnaCA9IHRoaXMuaGlnaCA+Pj4gcGxhY2VzIHwgMDsKICAgIH0KICB9CiAgc2hpZnRMZWZ0KHBsYWNlcykgewogICAgaWYgKHBsYWNlcyA+PSAzMikgewogICAgICB0aGlzLmhpZ2ggPSB0aGlzLmxvdyA8PCBwbGFjZXMgLSAzMjsKICAgICAgdGhpcy5sb3cgPSAwOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5oaWdoID0gdGhpcy5oaWdoIDw8IHBsYWNlcyB8IHRoaXMubG93ID4+PiAzMiAtIHBsYWNlczsKICAgICAgdGhpcy5sb3cgPDw9IHBsYWNlczsKICAgIH0KICB9CiAgcm90YXRlUmlnaHQocGxhY2VzKSB7CiAgICBsZXQgbG93LCBoaWdoOwogICAgaWYgKHBsYWNlcyAmIDMyKSB7CiAgICAgIGhpZ2ggPSB0aGlzLmxvdzsKICAgICAgbG93ID0gdGhpcy5oaWdoOwogICAgfSBlbHNlIHsKICAgICAgbG93ID0gdGhpcy5sb3c7CiAgICAgIGhpZ2ggPSB0aGlzLmhpZ2g7CiAgICB9CiAgICBwbGFjZXMgJj0gMzE7CiAgICB0aGlzLmxvdyA9IGxvdyA+Pj4gcGxhY2VzIHwgaGlnaCA8PCAzMiAtIHBsYWNlczsKICAgIHRoaXMuaGlnaCA9IGhpZ2ggPj4+IHBsYWNlcyB8IGxvdyA8PCAzMiAtIHBsYWNlczsKICB9CiAgbm90KCkgewogICAgdGhpcy5oaWdoID0gfnRoaXMuaGlnaDsKICAgIHRoaXMubG93ID0gfnRoaXMubG93OwogIH0KICBhZGQod29yZCkgewogICAgY29uc3QgbG93QWRkID0gKHRoaXMubG93ID4+PiAwKSArICh3b3JkLmxvdyA+Pj4gMCk7CiAgICBsZXQgaGlnaEFkZCA9ICh0aGlzLmhpZ2ggPj4+IDApICsgKHdvcmQuaGlnaCA+Pj4gMCk7CiAgICBpZiAobG93QWRkID4gMHhmZmZmZmZmZikgewogICAgICBoaWdoQWRkICs9IDE7CiAgICB9CiAgICB0aGlzLmxvdyA9IGxvd0FkZCB8IDA7CiAgICB0aGlzLmhpZ2ggPSBoaWdoQWRkIHwgMDsKICB9CiAgY29weVRvKGJ5dGVzLCBvZmZzZXQpIHsKICAgIGJ5dGVzW29mZnNldF0gPSB0aGlzLmhpZ2ggPj4+IDI0ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDFdID0gdGhpcy5oaWdoID4+IDE2ICYgMHhmZjsKICAgIGJ5dGVzW29mZnNldCArIDJdID0gdGhpcy5oaWdoID4+IDggJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgM10gPSB0aGlzLmhpZ2ggJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNF0gPSB0aGlzLmxvdyA+Pj4gMjQgJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgNV0gPSB0aGlzLmxvdyA+PiAxNiAmIDB4ZmY7CiAgICBieXRlc1tvZmZzZXQgKyA2XSA9IHRoaXMubG93ID4+IDggJiAweGZmOwogICAgYnl0ZXNbb2Zmc2V0ICsgN10gPSB0aGlzLmxvdyAmIDB4ZmY7CiAgfQogIGFzc2lnbih3b3JkKSB7CiAgICB0aGlzLmhpZ2ggPSB3b3JkLmhpZ2g7CiAgICB0aGlzLmxvdyA9IHdvcmQubG93OwogIH0KfQpjb25zdCBjYWxjdWxhdGVTSEEyNTYgPSBmdW5jdGlvbiBjYWxjdWxhdGVTSEEyNTZDbG9zdXJlKCkgewogIGZ1bmN0aW9uIHJvdHIoeCwgbikgewogICAgcmV0dXJuIHggPj4+IG4gfCB4IDw8IDMyIC0gbjsKICB9CiAgZnVuY3Rpb24gY2goeCwgeSwgeikgewogICAgcmV0dXJuIHggJiB5IF4gfnggJiB6OwogIH0KICBmdW5jdGlvbiBtYWooeCwgeSwgeikgewogICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejsKICB9CiAgZnVuY3Rpb24gc2lnbWEoeCkgewogICAgcmV0dXJuIHJvdHIoeCwgMikgXiByb3RyKHgsIDEzKSBeIHJvdHIoeCwgMjIpOwogIH0KICBmdW5jdGlvbiBzaWdtYVByaW1lKHgpIHsKICAgIHJldHVybiByb3RyKHgsIDYpIF4gcm90cih4LCAxMSkgXiByb3RyKHgsIDI1KTsKICB9CiAgZnVuY3Rpb24gbGl0dGxlU2lnbWEoeCkgewogICAgcmV0dXJuIHJvdHIoeCwgNykgXiByb3RyKHgsIDE4KSBeIHggPj4+IDM7CiAgfQogIGZ1bmN0aW9uIGxpdHRsZVNpZ21hUHJpbWUoeCkgewogICAgcmV0dXJuIHJvdHIoeCwgMTcpIF4gcm90cih4LCAxOSkgXiB4ID4+PiAxMDsKICB9CiAgY29uc3QgayA9IFsweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LCAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLCAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0LCAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLCAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLCAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLCAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LCAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLCAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLCAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LCAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXTsKICBmdW5jdGlvbiBoYXNoKGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CiAgICBsZXQgaDAgPSAweDZhMDllNjY3LAogICAgICBoMSA9IDB4YmI2N2FlODUsCiAgICAgIGgyID0gMHgzYzZlZjM3MiwKICAgICAgaDMgPSAweGE1NGZmNTNhLAogICAgICBoNCA9IDB4NTEwZTUyN2YsCiAgICAgIGg1ID0gMHg5YjA1Njg4YywKICAgICAgaDYgPSAweDFmODNkOWFiLAogICAgICBoNyA9IDB4NWJlMGNkMTk7CiAgICBjb25zdCBwYWRkZWRMZW5ndGggPSBNYXRoLmNlaWwoKGxlbmd0aCArIDkpIC8gNjQpICogNjQ7CiAgICBjb25zdCBwYWRkZWQgPSBuZXcgVWludDhBcnJheShwYWRkZWRMZW5ndGgpOwogICAgbGV0IGksIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgcGFkZGVkW2ldID0gZGF0YVtvZmZzZXQrK107CiAgICB9CiAgICBwYWRkZWRbaSsrXSA9IDB4ODA7CiAgICBjb25zdCBuID0gcGFkZGVkTGVuZ3RoIC0gODsKICAgIHdoaWxlIChpIDwgbikgewogICAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICB9CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IDA7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+Pj4gMjkgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMjEgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gMTMgJiAweGZmOwogICAgcGFkZGVkW2krK10gPSBsZW5ndGggPj4gNSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA8PCAzICYgMHhmZjsKICAgIGNvbnN0IHcgPSBuZXcgVWludDMyQXJyYXkoNjQpOwogICAgZm9yIChpID0gMDsgaSA8IHBhZGRlZExlbmd0aDspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICB3W2pdID0gcGFkZGVkW2ldIDw8IDI0IHwgcGFkZGVkW2kgKyAxXSA8PCAxNiB8IHBhZGRlZFtpICsgMl0gPDwgOCB8IHBhZGRlZFtpICsgM107CiAgICAgICAgaSArPSA0OwogICAgICB9CiAgICAgIGZvciAoaiA9IDE2OyBqIDwgNjQ7ICsraikgewogICAgICAgIHdbal0gPSBsaXR0bGVTaWdtYVByaW1lKHdbaiAtIDJdKSArIHdbaiAtIDddICsgbGl0dGxlU2lnbWEod1tqIC0gMTVdKSArIHdbaiAtIDE2XSB8IDA7CiAgICAgIH0KICAgICAgbGV0IGEgPSBoMCwKICAgICAgICBiID0gaDEsCiAgICAgICAgYyA9IGgyLAogICAgICAgIGQgPSBoMywKICAgICAgICBlID0gaDQsCiAgICAgICAgZiA9IGg1LAogICAgICAgIGcgPSBoNiwKICAgICAgICBoID0gaDcsCiAgICAgICAgdDEsCiAgICAgICAgdDI7CiAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgKytqKSB7CiAgICAgICAgdDEgPSBoICsgc2lnbWFQcmltZShlKSArIGNoKGUsIGYsIGcpICsga1tqXSArIHdbal07CiAgICAgICAgdDIgPSBzaWdtYShhKSArIG1haihhLCBiLCBjKTsKICAgICAgICBoID0gZzsKICAgICAgICBnID0gZjsKICAgICAgICBmID0gZTsKICAgICAgICBlID0gZCArIHQxIHwgMDsKICAgICAgICBkID0gYzsKICAgICAgICBjID0gYjsKICAgICAgICBiID0gYTsKICAgICAgICBhID0gdDEgKyB0MiB8IDA7CiAgICAgIH0KICAgICAgaDAgPSBoMCArIGEgfCAwOwogICAgICBoMSA9IGgxICsgYiB8IDA7CiAgICAgIGgyID0gaDIgKyBjIHwgMDsKICAgICAgaDMgPSBoMyArIGQgfCAwOwogICAgICBoNCA9IGg0ICsgZSB8IDA7CiAgICAgIGg1ID0gaDUgKyBmIHwgMDsKICAgICAgaDYgPSBoNiArIGcgfCAwOwogICAgICBoNyA9IGg3ICsgaCB8IDA7CiAgICB9CiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoW2gwID4+IDI0ICYgMHhGRiwgaDAgPj4gMTYgJiAweEZGLCBoMCA+PiA4ICYgMHhGRiwgaDAgJiAweEZGLCBoMSA+PiAyNCAmIDB4RkYsIGgxID4+IDE2ICYgMHhGRiwgaDEgPj4gOCAmIDB4RkYsIGgxICYgMHhGRiwgaDIgPj4gMjQgJiAweEZGLCBoMiA+PiAxNiAmIDB4RkYsIGgyID4+IDggJiAweEZGLCBoMiAmIDB4RkYsIGgzID4+IDI0ICYgMHhGRiwgaDMgPj4gMTYgJiAweEZGLCBoMyA+PiA4ICYgMHhGRiwgaDMgJiAweEZGLCBoNCA+PiAyNCAmIDB4RkYsIGg0ID4+IDE2ICYgMHhGRiwgaDQgPj4gOCAmIDB4RkYsIGg0ICYgMHhGRiwgaDUgPj4gMjQgJiAweEZGLCBoNSA+PiAxNiAmIDB4RkYsIGg1ID4+IDggJiAweEZGLCBoNSAmIDB4RkYsIGg2ID4+IDI0ICYgMHhGRiwgaDYgPj4gMTYgJiAweEZGLCBoNiA+PiA4ICYgMHhGRiwgaDYgJiAweEZGLCBoNyA+PiAyNCAmIDB4RkYsIGg3ID4+IDE2ICYgMHhGRiwgaDcgPj4gOCAmIDB4RkYsIGg3ICYgMHhGRl0pOwogIH0KICByZXR1cm4gaGFzaDsKfSgpOwpleHBvcnRzLmNhbGN1bGF0ZVNIQTI1NiA9IGNhbGN1bGF0ZVNIQTI1NjsKY29uc3QgY2FsY3VsYXRlU0hBNTEyID0gZnVuY3Rpb24gY2FsY3VsYXRlU0hBNTEyQ2xvc3VyZSgpIHsKICBmdW5jdGlvbiBjaChyZXN1bHQsIHgsIHksIHosIHRtcCkgewogICAgcmVzdWx0LmFzc2lnbih4KTsKICAgIHJlc3VsdC5hbmQoeSk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLm5vdCgpOwogICAgdG1wLmFuZCh6KTsKICAgIHJlc3VsdC54b3IodG1wKTsKICB9CiAgZnVuY3Rpb24gbWFqKHJlc3VsdCwgeCwgeSwgeiwgdG1wKSB7CiAgICByZXN1bHQuYXNzaWduKHgpOwogICAgcmVzdWx0LmFuZCh5KTsKICAgIHRtcC5hc3NpZ24oeCk7CiAgICB0bXAuYW5kKHopOwogICAgcmVzdWx0Lnhvcih0bXApOwogICAgdG1wLmFzc2lnbih5KTsKICAgIHRtcC5hbmQoeik7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgfQogIGZ1bmN0aW9uIHNpZ21hKHJlc3VsdCwgeCwgdG1wKSB7CiAgICByZXN1bHQuYXNzaWduKHgpOwogICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDI4KTsKICAgIHRtcC5hc3NpZ24oeCk7CiAgICB0bXAucm90YXRlUmlnaHQoMzQpOwogICAgcmVzdWx0Lnhvcih0bXApOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5yb3RhdGVSaWdodCgzOSk7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgfQogIGZ1bmN0aW9uIHNpZ21hUHJpbWUocmVzdWx0LCB4LCB0bXApIHsKICAgIHJlc3VsdC5hc3NpZ24oeCk7CiAgICByZXN1bHQucm90YXRlUmlnaHQoMTQpOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5yb3RhdGVSaWdodCgxOCk7CiAgICByZXN1bHQueG9yKHRtcCk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLnJvdGF0ZVJpZ2h0KDQxKTsKICAgIHJlc3VsdC54b3IodG1wKTsKICB9CiAgZnVuY3Rpb24gbGl0dGxlU2lnbWEocmVzdWx0LCB4LCB0bXApIHsKICAgIHJlc3VsdC5hc3NpZ24oeCk7CiAgICByZXN1bHQucm90YXRlUmlnaHQoMSk7CiAgICB0bXAuYXNzaWduKHgpOwogICAgdG1wLnJvdGF0ZVJpZ2h0KDgpOwogICAgcmVzdWx0Lnhvcih0bXApOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5zaGlmdFJpZ2h0KDcpOwogICAgcmVzdWx0Lnhvcih0bXApOwogIH0KICBmdW5jdGlvbiBsaXR0bGVTaWdtYVByaW1lKHJlc3VsdCwgeCwgdG1wKSB7CiAgICByZXN1bHQuYXNzaWduKHgpOwogICAgcmVzdWx0LnJvdGF0ZVJpZ2h0KDE5KTsKICAgIHRtcC5hc3NpZ24oeCk7CiAgICB0bXAucm90YXRlUmlnaHQoNjEpOwogICAgcmVzdWx0Lnhvcih0bXApOwogICAgdG1wLmFzc2lnbih4KTsKICAgIHRtcC5zaGlmdFJpZ2h0KDYpOwogICAgcmVzdWx0Lnhvcih0bXApOwogIH0KICBjb25zdCBrID0gW25ldyBXb3JkNjQoMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiksIG5ldyBXb3JkNjQoMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCksIG5ldyBXb3JkNjQoMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiksIG5ldyBXb3JkNjQoMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyksIG5ldyBXb3JkNjQoMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCksIG5ldyBXb3JkNjQoMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSksIG5ldyBXb3JkNjQoMHg5MjNmODJhNCwgMHhhZjE5NGY5YiksIG5ldyBXb3JkNjQoMHhhYjFjNWVkNSwgMHhkYTZkODExOCksIG5ldyBXb3JkNjQoMHhkODA3YWE5OCwgMHhhMzAzMDI0MiksIG5ldyBXb3JkNjQoMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSksIG5ldyBXb3JkNjQoMHgyNDMxODViZSwgMHg0ZWU0YjI4YyksIG5ldyBXb3JkNjQoMHg1NTBjN2RjMywgMHhkNWZmYjRlMiksIG5ldyBXb3JkNjQoMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiksIG5ldyBXb3JkNjQoMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSksIG5ldyBXb3JkNjQoMHg5YmRjMDZhNywgMHgyNWM3MTIzNSksIG5ldyBXb3JkNjQoMHhjMTliZjE3NCwgMHhjZjY5MjY5NCksIG5ldyBXb3JkNjQoMHhlNDliNjljMSwgMHg5ZWYxNGFkMiksIG5ldyBXb3JkNjQoMHhlZmJlNDc4NiwgMHgzODRmMjVlMyksIG5ldyBXb3JkNjQoMHgwZmMxOWRjNiwgMHg4YjhjZDViNSksIG5ldyBXb3JkNjQoMHgyNDBjYTFjYywgMHg3N2FjOWM2NSksIG5ldyBXb3JkNjQoMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSksIG5ldyBXb3JkNjQoMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyksIG5ldyBXb3JkNjQoMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCksIG5ldyBXb3JkNjQoMHg3NmY5ODhkYSwgMHg4MzExNTNiNSksIG5ldyBXb3JkNjQoMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiksIG5ldyBXb3JkNjQoMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCksIG5ldyBXb3JkNjQoMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiksIG5ldyBXb3JkNjQoMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCksIG5ldyBXb3JkNjQoMHhjNmUwMGJmMywgMHgzZGE4OGZjMiksIG5ldyBXb3JkNjQoMHhkNWE3OTE0NywgMHg5MzBhYTcyNSksIG5ldyBXb3JkNjQoMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiksIG5ldyBXb3JkNjQoMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCksIG5ldyBXb3JkNjQoMHgyN2I3MGE4NSwgMHg0NmQyMmZmYyksIG5ldyBXb3JkNjQoMHgyZTFiMjEzOCwgMHg1YzI2YzkyNiksIG5ldyBXb3JkNjQoMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCksIG5ldyBXb3JkNjQoMHg1MzM4MGQxMywgMHg5ZDk1YjNkZiksIG5ldyBXb3JkNjQoMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSksIG5ldyBXb3JkNjQoMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCksIG5ldyBXb3JkNjQoMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiksIG5ldyBXb3JkNjQoMHg5MjcyMmM4NSwgMHgxNDgyMzUzYiksIG5ldyBXb3JkNjQoMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCksIG5ldyBXb3JkNjQoMHhhODFhNjY0YiwgMHhiYzQyMzAwMSksIG5ldyBXb3JkNjQoMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSksIG5ldyBXb3JkNjQoMHhjNzZjNTFhMywgMHgwNjU0YmUzMCksIG5ldyBXb3JkNjQoMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCksIG5ldyBXb3JkNjQoMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCksIG5ldyBXb3JkNjQoMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSksIG5ldyBXb3JkNjQoMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCksIG5ldyBXb3JkNjQoMHgxOWE0YzExNiwgMHhiOGQyZDBjOCksIG5ldyBXb3JkNjQoMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyksIG5ldyBXb3JkNjQoMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSksIG5ldyBXb3JkNjQoMHgzNGIwYmNiNSwgMHhlMTliNDhhOCksIG5ldyBXb3JkNjQoMHgzOTFjMGNiMywgMHhjNWM5NWE2MyksIG5ldyBXb3JkNjQoMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYiksIG5ldyBXb3JkNjQoMHg1YjljY2E0ZiwgMHg3NzYzZTM3MyksIG5ldyBXb3JkNjQoMHg2ODJlNmZmMywgMHhkNmIyYjhhMyksIG5ldyBXb3JkNjQoMHg3NDhmODJlZSwgMHg1ZGVmYjJmYyksIG5ldyBXb3JkNjQoMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCksIG5ldyBXb3JkNjQoMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiksIG5ldyBXb3JkNjQoMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyksIG5ldyBXb3JkNjQoMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCksIG5ldyBXb3JkNjQoMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSksIG5ldyBXb3JkNjQoMHhiZWY5YTNmNywgMHhiMmM2NzkxNSksIG5ldyBXb3JkNjQoMHhjNjcxNzhmMiwgMHhlMzcyNTMyYiksIG5ldyBXb3JkNjQoMHhjYTI3M2VjZSwgMHhlYTI2NjE5YyksIG5ldyBXb3JkNjQoMHhkMTg2YjhjNywgMHgyMWMwYzIwNyksIG5ldyBXb3JkNjQoMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSksIG5ldyBXb3JkNjQoMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCksIG5ldyBXb3JkNjQoMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSksIG5ldyBXb3JkNjQoMHgwYTYzN2RjNSwgMHhhMmM4OThhNiksIG5ldyBXb3JkNjQoMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSksIG5ldyBXb3JkNjQoMHgxYjcxMGIzNSwgMHgxMzFjNDcxYiksIG5ldyBXb3JkNjQoMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCksIG5ldyBXb3JkNjQoMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyksIG5ldyBXb3JkNjQoMHgzYzllYmUwYSwgMHgxNWM5YmViYyksIG5ldyBXb3JkNjQoMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyksIG5ldyBXb3JkNjQoMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiksIG5ldyBXb3JkNjQoMHg1OTdmMjk5YywgMHhmYzY1N2UyYSksIG5ldyBXb3JkNjQoMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYyksIG5ldyBXb3JkNjQoMHg2YzQ0MTk4YywgMHg0YTQ3NTgxNyldOwogIGZ1bmN0aW9uIGhhc2goZGF0YSwgb2Zmc2V0LCBsZW5ndGgsIG1vZGUzODQgPSBmYWxzZSkgewogICAgbGV0IGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBoNzsKICAgIGlmICghbW9kZTM4NCkgewogICAgICBoMCA9IG5ldyBXb3JkNjQoMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCk7CiAgICAgIGgxID0gbmV3IFdvcmQ2NCgweGJiNjdhZTg1LCAweDg0Y2FhNzNiKTsKICAgICAgaDIgPSBuZXcgV29yZDY0KDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIpOwogICAgICBoMyA9IG5ldyBXb3JkNjQoMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSk7CiAgICAgIGg0ID0gbmV3IFdvcmQ2NCgweDUxMGU1MjdmLCAweGFkZTY4MmQxKTsKICAgICAgaDUgPSBuZXcgV29yZDY0KDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYpOwogICAgICBoNiA9IG5ldyBXb3JkNjQoMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yik7CiAgICAgIGg3ID0gbmV3IFdvcmQ2NCgweDViZTBjZDE5LCAweDEzN2UyMTc5KTsKICAgIH0gZWxzZSB7CiAgICAgIGgwID0gbmV3IFdvcmQ2NCgweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4KTsKICAgICAgaDEgPSBuZXcgV29yZDY0KDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcpOwogICAgICBoMiA9IG5ldyBXb3JkNjQoMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyk7CiAgICAgIGgzID0gbmV3IFdvcmQ2NCgweDE1MmZlY2Q4LCAweGY3MGU1OTM5KTsKICAgICAgaDQgPSBuZXcgV29yZDY0KDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEpOwogICAgICBoNSA9IG5ldyBXb3JkNjQoMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSk7CiAgICAgIGg2ID0gbmV3IFdvcmQ2NCgweGRiMGMyZTBkLCAweDY0Zjk4ZmE3KTsKICAgICAgaDcgPSBuZXcgV29yZDY0KDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQpOwogICAgfQogICAgY29uc3QgcGFkZGVkTGVuZ3RoID0gTWF0aC5jZWlsKChsZW5ndGggKyAxNykgLyAxMjgpICogMTI4OwogICAgY29uc3QgcGFkZGVkID0gbmV3IFVpbnQ4QXJyYXkocGFkZGVkTGVuZ3RoKTsKICAgIGxldCBpLCBqOwogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgIHBhZGRlZFtpXSA9IGRhdGFbb2Zmc2V0KytdOwogICAgfQogICAgcGFkZGVkW2krK10gPSAweDgwOwogICAgY29uc3QgbiA9IHBhZGRlZExlbmd0aCAtIDE2OwogICAgd2hpbGUgKGkgPCBuKSB7CiAgICAgIHBhZGRlZFtpKytdID0gMDsKICAgIH0KICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gMDsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoID4+PiAyOSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAyMSAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiAxMyAmIDB4ZmY7CiAgICBwYWRkZWRbaSsrXSA9IGxlbmd0aCA+PiA1ICYgMHhmZjsKICAgIHBhZGRlZFtpKytdID0gbGVuZ3RoIDw8IDMgJiAweGZmOwogICAgY29uc3QgdyA9IG5ldyBBcnJheSg4MCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgODA7IGkrKykgewogICAgICB3W2ldID0gbmV3IFdvcmQ2NCgwLCAwKTsKICAgIH0KICAgIGxldCBhID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgICAgYiA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICAgIGMgPSBuZXcgV29yZDY0KDAsIDApOwogICAgbGV0IGQgPSBuZXcgV29yZDY0KDAsIDApLAogICAgICBlID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgICAgZiA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgICBsZXQgZyA9IG5ldyBXb3JkNjQoMCwgMCksCiAgICAgIGggPSBuZXcgV29yZDY0KDAsIDApOwogICAgY29uc3QgdDEgPSBuZXcgV29yZDY0KDAsIDApLAogICAgICB0MiA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgICBjb25zdCB0bXAxID0gbmV3IFdvcmQ2NCgwLCAwKSwKICAgICAgdG1wMiA9IG5ldyBXb3JkNjQoMCwgMCk7CiAgICBsZXQgdG1wMzsKICAgIGZvciAoaSA9IDA7IGkgPCBwYWRkZWRMZW5ndGg7KSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgICAgd1tqXS5oaWdoID0gcGFkZGVkW2ldIDw8IDI0IHwgcGFkZGVkW2kgKyAxXSA8PCAxNiB8IHBhZGRlZFtpICsgMl0gPDwgOCB8IHBhZGRlZFtpICsgM107CiAgICAgICAgd1tqXS5sb3cgPSBwYWRkZWRbaSArIDRdIDw8IDI0IHwgcGFkZGVkW2kgKyA1XSA8PCAxNiB8IHBhZGRlZFtpICsgNl0gPDwgOCB8IHBhZGRlZFtpICsgN107CiAgICAgICAgaSArPSA4OwogICAgICB9CiAgICAgIGZvciAoaiA9IDE2OyBqIDwgODA7ICsraikgewogICAgICAgIHRtcDMgPSB3W2pdOwogICAgICAgIGxpdHRsZVNpZ21hUHJpbWUodG1wMywgd1tqIC0gMl0sIHRtcDIpOwogICAgICAgIHRtcDMuYWRkKHdbaiAtIDddKTsKICAgICAgICBsaXR0bGVTaWdtYSh0bXAxLCB3W2ogLSAxNV0sIHRtcDIpOwogICAgICAgIHRtcDMuYWRkKHRtcDEpOwogICAgICAgIHRtcDMuYWRkKHdbaiAtIDE2XSk7CiAgICAgIH0KICAgICAgYS5hc3NpZ24oaDApOwogICAgICBiLmFzc2lnbihoMSk7CiAgICAgIGMuYXNzaWduKGgyKTsKICAgICAgZC5hc3NpZ24oaDMpOwogICAgICBlLmFzc2lnbihoNCk7CiAgICAgIGYuYXNzaWduKGg1KTsKICAgICAgZy5hc3NpZ24oaDYpOwogICAgICBoLmFzc2lnbihoNyk7CiAgICAgIGZvciAoaiA9IDA7IGogPCA4MDsgKytqKSB7CiAgICAgICAgdDEuYXNzaWduKGgpOwogICAgICAgIHNpZ21hUHJpbWUodG1wMSwgZSwgdG1wMik7CiAgICAgICAgdDEuYWRkKHRtcDEpOwogICAgICAgIGNoKHRtcDEsIGUsIGYsIGcsIHRtcDIpOwogICAgICAgIHQxLmFkZCh0bXAxKTsKICAgICAgICB0MS5hZGQoa1tqXSk7CiAgICAgICAgdDEuYWRkKHdbal0pOwogICAgICAgIHNpZ21hKHQyLCBhLCB0bXAyKTsKICAgICAgICBtYWoodG1wMSwgYSwgYiwgYywgdG1wMik7CiAgICAgICAgdDIuYWRkKHRtcDEpOwogICAgICAgIHRtcDMgPSBoOwogICAgICAgIGggPSBnOwogICAgICAgIGcgPSBmOwogICAgICAgIGYgPSBlOwogICAgICAgIGQuYWRkKHQxKTsKICAgICAgICBlID0gZDsKICAgICAgICBkID0gYzsKICAgICAgICBjID0gYjsKICAgICAgICBiID0gYTsKICAgICAgICB0bXAzLmFzc2lnbih0MSk7CiAgICAgICAgdG1wMy5hZGQodDIpOwogICAgICAgIGEgPSB0bXAzOwogICAgICB9CiAgICAgIGgwLmFkZChhKTsKICAgICAgaDEuYWRkKGIpOwogICAgICBoMi5hZGQoYyk7CiAgICAgIGgzLmFkZChkKTsKICAgICAgaDQuYWRkKGUpOwogICAgICBoNS5hZGQoZik7CiAgICAgIGg2LmFkZChnKTsKICAgICAgaDcuYWRkKGgpOwogICAgfQogICAgbGV0IHJlc3VsdDsKICAgIGlmICghbW9kZTM4NCkgewogICAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheSg2NCk7CiAgICAgIGgwLmNvcHlUbyhyZXN1bHQsIDApOwogICAgICBoMS5jb3B5VG8ocmVzdWx0LCA4KTsKICAgICAgaDIuY29weVRvKHJlc3VsdCwgMTYpOwogICAgICBoMy5jb3B5VG8ocmVzdWx0LCAyNCk7CiAgICAgIGg0LmNvcHlUbyhyZXN1bHQsIDMyKTsKICAgICAgaDUuY29weVRvKHJlc3VsdCwgNDApOwogICAgICBoNi5jb3B5VG8ocmVzdWx0LCA0OCk7CiAgICAgIGg3LmNvcHlUbyhyZXN1bHQsIDU2KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDQ4KTsKICAgICAgaDAuY29weVRvKHJlc3VsdCwgMCk7CiAgICAgIGgxLmNvcHlUbyhyZXN1bHQsIDgpOwogICAgICBoMi5jb3B5VG8ocmVzdWx0LCAxNik7CiAgICAgIGgzLmNvcHlUbyhyZXN1bHQsIDI0KTsKICAgICAgaDQuY29weVRvKHJlc3VsdCwgMzIpOwogICAgICBoNS5jb3B5VG8ocmVzdWx0LCA0MCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICByZXR1cm4gaGFzaDsKfSgpOwpleHBvcnRzLmNhbGN1bGF0ZVNIQTUxMiA9IGNhbGN1bGF0ZVNIQTUxMjsKZnVuY3Rpb24gY2FsY3VsYXRlU0hBMzg0KGRhdGEsIG9mZnNldCwgbGVuZ3RoKSB7CiAgcmV0dXJuIGNhbGN1bGF0ZVNIQTUxMihkYXRhLCBvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Cn0KY2xhc3MgTnVsbENpcGhlciB7CiAgZGVjcnlwdEJsb2NrKGRhdGEpIHsKICAgIHJldHVybiBkYXRhOwogIH0KICBlbmNyeXB0KGRhdGEpIHsKICAgIHJldHVybiBkYXRhOwogIH0KfQpjbGFzcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcigpIHsKICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBBRVNCYXNlQ2lwaGVyKSB7CiAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBpbml0aWFsaXplIEFFU0Jhc2VDaXBoZXIuIik7CiAgICB9CiAgICB0aGlzLl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsIDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksIDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTZdKTsKICAgIHRoaXMuX2ludl9zID0gbmV3IFVpbnQ4QXJyYXkoWzB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsIDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IsIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QsIDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUsIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYsIDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIsIDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsIDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIsIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMsIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksIDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIsIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAsIDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQsIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQsIDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYsIDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2RdKTsKICAgIHRoaXMuX21peCA9IG5ldyBVaW50MzJBcnJheShbMHgwMDAwMDAwMCwgMHgwZTA5MGQwYiwgMHgxYzEyMWExNiwgMHgxMjFiMTcxZCwgMHgzODI0MzQyYywgMHgzNjJkMzkyNywgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSwgMHg0ODZjNWM3NCwgMHg0NjY1NTE3ZiwgMHg1NDdlNDY2MiwgMHg1YTc3NGI2OSwgMHhlMDkwZDBiMCwgMHhlZTk5ZGRiYiwgMHhmYzgyY2FhNiwgMHhmMjhiYzdhZCwgMHhkOGI0ZTQ5YywgMHhkNmJkZTk5NywgMHhjNGE2ZmU4YSwgMHhjYWFmZjM4MSwgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZiwgMHhiNGVlOTZkMiwgMHhiYWU3OWJkOSwgMHhkYjNiYmI3YiwgMHhkNTMyYjY3MCwgMHhjNzI5YTE2ZCwgMHhjOTIwYWM2NiwgMHhlMzFmOGY1NywgMHhlZDE2ODI1YywgMHhmZjBkOTU0MSwgMHhmMTA0OTg0YSwgMHhhYjczZDMyMywgMHhhNTdhZGUyOCwgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMiwgMHgzYmFiNmJjYiwgMHgzNWEyNjZjMCwgMHgyN2I5NzFkZCwgMHgyOWIwN2NkNiwgMHgwMzhmNWZlNywgMHgwZDg2NTJlYywgMHgxZjlkNDVmMSwgMHgxMTk0NDhmYSwgMHg0YmUzMDM5MywgMHg0NWVhMGU5OCwgMHg1N2YxMTk4NSwgMHg1OWY4MTQ4ZSwgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCwgMHhiMTY0NzdlMCwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwgMHg5YjViNTRkMSwgMHg4OTQwNDNjYywgMHg4NzQ5NGVjNywgMHhkZDNlMDVhZSwgMHhkMzM3MDhhNSwgMHhjMTJjMWZiOCwgMHhjZjI1MTJiMywgMHhlNTFhMzE4MiwgMHhlYjEzM2M4OSwgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YiwgMHg3NWMyODk2YSwgMHg3YmNiODQ2MSwgMHg2OWQwOTM3YywgMHg2N2Q5OWU3NywgMHgzZGFlZDUxZSwgMHgzM2E3ZDgxNSwgMHgyMWJjY2YwOCwgMHgyZmI1YzIwMywgMHgwNThhZTEzMiwgMHgwYjgzZWMzOSwgMHgxOTk4ZmIyNCwgMHgxNzkxZjYyZiwgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSwgMHg1MjdiZjhiNywgMHg1YzcyZjViYywgMHgwNjA1YmVkNSwgMHgwODBjYjNkZSwgMHgxYTE3YTRjMywgMHgxNDFlYTljOCwgMHgzZTIxOGFmOSwgMHgzMDI4ODdmMiwgMHgyMjMzOTBlZiwgMHgyYzNhOWRlNCwgMHg5NmRkMDYzZCwgMHg5OGQ0MGIzNiwgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYywgMHhlNjk1NmU2NSwgMHhlODljNjM2ZSwgMHhmYTg3NzQ3MywgMHhmNDhlNzk3OCwgMHhkZWIxNWE0OSwgMHhkMGI4NTc0MiwgMHhjMmEzNDA1ZiwgMHhjY2FhNGQ1NCwgMHg0MWVjZGFmNywgMHg0ZmU1ZDdmYywgMHg1ZGZlYzBlMSwgMHg1M2Y3Y2RlYSwgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCwgMHgyZGI2YThiOSwgMHgyM2JmYTViMiwgMHgwOTgwODY4MywgMHgwNzg5OGI4OCwgMHgxNTkyOWM5NSwgMHgxYjliOTE5ZSwgMHhhMTdjMGE0NywgMHhhZjc1MDc0YywgMHhiZDZlMTA1MSwgMHhiMzY3MWQ1YSwgMHg5OTU4M2U2YiwgMHg5NzUxMzM2MCwgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMiwgMHhlOTEwNTYzMywgMHhlNzE5NWIzOCwgMHhmNTAyNGMyNSwgMHhmYjBiNDEyZSwgMHg5YWQ3NjE4YywgMHg5NGRlNmM4NywgMHg4NmM1N2I5YSwgMHg4OGNjNzY5MSwgMHhhMmYzNTVhMCwgMHhhY2ZhNThhYiwgMHhiZWUxNGZiNiwgMHhiMGU4NDJiZCwgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMywgMHhjZWE5MjdlZSwgMHhjMGEwMmFlNSwgMHg3YTQ3YjEzYywgMHg3NDRlYmMzNywgMHg2NjU1YWIyYSwgMHg2ODVjYTYyMSwgMHg0MjYzODUxMCwgMHg0YzZhODgxYiwgMHg1ZTcxOWYwNiwgMHg1MDc4OTIwZCwgMHgwYTBmZDk2NCwgMHgwNDA2ZDQ2ZiwgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSwgMHhlYzlhYjcwMSwgMHhlMjkzYmEwYSwgMHhmMDg4YWQxNywgMHhmZTgxYTAxYywgMHhkNGJlODMyZCwgMHhkYWI3OGUyNiwgMHhjOGFjOTkzYiwgMHhjNmE1OTQzMCwgMHg5Y2QyZGY1OSwgMHg5MmRiZDI1MiwgMHg4MGMwYzU0ZiwgMHg4ZWM5Yzg0NCwgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSwgMHgxMDE4N2RhNywgMHgxZTExNzBhYywgMHgzNDJlNTM5ZCwgMHgzYTI3NWU5NiwgMHgyODNjNDk4YiwgMHgyNjM1NDQ4MCwgMHg3YzQyMGZlOSwgMHg3MjRiMDJlMiwgMHg2MDUwMTVmZiwgMHg2ZTU5MThmNCwgMHg0NDY2M2JjNSwgMHg0YTZmMzZjZSwgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NywgMHgwZjg1Mzg1NiwgMHgwMThjMzU1ZCwgMHgxMzk3MjI0MCwgMHgxZDllMmY0YiwgMHg0N2U5NjQyMiwgMHg0OWUwNjkyOSwgMHg1YmZiN2UzNCwgMHg1NWYyNzMzZiwgMHg3ZmNkNTAwZSwgMHg3MWM0NWQwNSwgMHg2M2RmNGExOCwgMHg2ZGQ2NDcxMywgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCwgMHhmMzA3ZjJmMCwgMHhmZDBlZmZmYiwgMHhhNzc5YjQ5MiwgMHhhOTcwYjk5OSwgMHhiYjZiYWU4NCwgMHhiNTYyYTM4ZiwgMHg5ZjVkODBiZSwgMHg5MTU0OGRiNSwgMHg4MzRmOWFhOCwgMHg4ZDQ2OTdhM10pOwogICAgdGhpcy5fbWl4Q29sID0gbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKICAgICAgaWYgKGkgPCAxMjgpIHsKICAgICAgICB0aGlzLl9taXhDb2xbaV0gPSBpIDw8IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fbWl4Q29sW2ldID0gaSA8PCAxIF4gMHgxYjsKICAgICAgfQogICAgfQogICAgdGhpcy5idWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICB0aGlzLmJ1ZmZlclBvc2l0aW9uID0gMDsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoIkNhbm5vdCBjYWxsIGBfZXhwYW5kS2V5YCBvbiB0aGUgYmFzZSBjbGFzcyIpOwogIH0KICBfZGVjcnlwdChpbnB1dCwga2V5KSB7CiAgICBsZXQgdCwgdSwgdjsKICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgc3RhdGUuc2V0KGlucHV0KTsKICAgIGZvciAobGV0IGogPSAwLCBrID0gdGhpcy5fa2V5U2l6ZTsgaiA8IDE2OyArK2osICsraykgewogICAgICBzdGF0ZVtqXSBePSBrZXlba107CiAgICB9CiAgICBmb3IgKGxldCBpID0gdGhpcy5fY3ljbGVzT2ZSZXBldGl0aW9uIC0gMTsgaSA+PSAxOyAtLWkpIHsKICAgICAgdCA9IHN0YXRlWzEzXTsKICAgICAgc3RhdGVbMTNdID0gc3RhdGVbOV07CiAgICAgIHN0YXRlWzldID0gc3RhdGVbNV07CiAgICAgIHN0YXRlWzVdID0gc3RhdGVbMV07CiAgICAgIHN0YXRlWzFdID0gdDsKICAgICAgdCA9IHN0YXRlWzE0XTsKICAgICAgdSA9IHN0YXRlWzEwXTsKICAgICAgc3RhdGVbMTRdID0gc3RhdGVbNl07CiAgICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdOwogICAgICBzdGF0ZVs2XSA9IHQ7CiAgICAgIHN0YXRlWzJdID0gdTsKICAgICAgdCA9IHN0YXRlWzE1XTsKICAgICAgdSA9IHN0YXRlWzExXTsKICAgICAgdiA9IHN0YXRlWzddOwogICAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTsKICAgICAgc3RhdGVbMTFdID0gdDsKICAgICAgc3RhdGVbN10gPSB1OwogICAgICBzdGF0ZVszXSA9IHY7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHN0YXRlW2pdID0gdGhpcy5faW52X3Nbc3RhdGVbal1dOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwLCBrID0gaSAqIDE2OyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgICAgc3RhdGVbal0gXj0ga2V5W2tdOwogICAgICB9CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkgewogICAgICAgIGNvbnN0IHMwID0gdGhpcy5fbWl4W3N0YXRlW2pdXTsKICAgICAgICBjb25zdCBzMSA9IHRoaXMuX21peFtzdGF0ZVtqICsgMV1dOwogICAgICAgIGNvbnN0IHMyID0gdGhpcy5fbWl4W3N0YXRlW2ogKyAyXV07CiAgICAgICAgY29uc3QgczMgPSB0aGlzLl9taXhbc3RhdGVbaiArIDNdXTsKICAgICAgICB0ID0gczAgXiBzMSA+Pj4gOCBeIHMxIDw8IDI0IF4gczIgPj4+IDE2IF4gczIgPDwgMTYgXiBzMyA+Pj4gMjQgXiBzMyA8PCA4OwogICAgICAgIHN0YXRlW2pdID0gdCA+Pj4gMjQgJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAxXSA9IHQgPj4gMTYgJiAweGZmOwogICAgICAgIHN0YXRlW2ogKyAyXSA9IHQgPj4gOCAmIDB4ZmY7CiAgICAgICAgc3RhdGVbaiArIDNdID0gdCAmIDB4ZmY7CiAgICAgIH0KICAgIH0KICAgIHQgPSBzdGF0ZVsxM107CiAgICBzdGF0ZVsxM10gPSBzdGF0ZVs5XTsKICAgIHN0YXRlWzldID0gc3RhdGVbNV07CiAgICBzdGF0ZVs1XSA9IHN0YXRlWzFdOwogICAgc3RhdGVbMV0gPSB0OwogICAgdCA9IHN0YXRlWzE0XTsKICAgIHUgPSBzdGF0ZVsxMF07CiAgICBzdGF0ZVsxNF0gPSBzdGF0ZVs2XTsKICAgIHN0YXRlWzEwXSA9IHN0YXRlWzJdOwogICAgc3RhdGVbNl0gPSB0OwogICAgc3RhdGVbMl0gPSB1OwogICAgdCA9IHN0YXRlWzE1XTsKICAgIHUgPSBzdGF0ZVsxMV07CiAgICB2ID0gc3RhdGVbN107CiAgICBzdGF0ZVsxNV0gPSBzdGF0ZVszXTsKICAgIHN0YXRlWzExXSA9IHQ7CiAgICBzdGF0ZVs3XSA9IHU7CiAgICBzdGF0ZVszXSA9IHY7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgc3RhdGVbal0gPSB0aGlzLl9pbnZfc1tzdGF0ZVtqXV07CiAgICAgIHN0YXRlW2pdIF49IGtleVtqXTsKICAgIH0KICAgIHJldHVybiBzdGF0ZTsKICB9CiAgX2VuY3J5cHQoaW5wdXQsIGtleSkgewogICAgY29uc3QgcyA9IHRoaXMuX3M7CiAgICBsZXQgdCwgdSwgdjsKICAgIGNvbnN0IHN0YXRlID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgc3RhdGUuc2V0KGlucHV0KTsKICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICBzdGF0ZVtqXSBePSBrZXlbal07CiAgICB9CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuX2N5Y2xlc09mUmVwZXRpdGlvbjsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7ICsraikgewogICAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07CiAgICAgIH0KICAgICAgdiA9IHN0YXRlWzFdOwogICAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOwogICAgICBzdGF0ZVs1XSA9IHN0YXRlWzldOwogICAgICBzdGF0ZVs5XSA9IHN0YXRlWzEzXTsKICAgICAgc3RhdGVbMTNdID0gdjsKICAgICAgdiA9IHN0YXRlWzJdOwogICAgICB1ID0gc3RhdGVbNl07CiAgICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOwogICAgICBzdGF0ZVs2XSA9IHN0YXRlWzE0XTsKICAgICAgc3RhdGVbMTBdID0gdjsKICAgICAgc3RhdGVbMTRdID0gdTsKICAgICAgdiA9IHN0YXRlWzNdOwogICAgICB1ID0gc3RhdGVbN107CiAgICAgIHQgPSBzdGF0ZVsxMV07CiAgICAgIHN0YXRlWzNdID0gc3RhdGVbMTVdOwogICAgICBzdGF0ZVs3XSA9IHY7CiAgICAgIHN0YXRlWzExXSA9IHU7CiAgICAgIHN0YXRlWzE1XSA9IHQ7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMTY7IGogKz0gNCkgewogICAgICAgIGNvbnN0IHMwID0gc3RhdGVbaiArIDBdOwogICAgICAgIGNvbnN0IHMxID0gc3RhdGVbaiArIDFdOwogICAgICAgIGNvbnN0IHMyID0gc3RhdGVbaiArIDJdOwogICAgICAgIGNvbnN0IHMzID0gc3RhdGVbaiArIDNdOwogICAgICAgIHQgPSBzMCBeIHMxIF4gczIgXiBzMzsKICAgICAgICBzdGF0ZVtqICsgMF0gXj0gdCBeIHRoaXMuX21peENvbFtzMCBeIHMxXTsKICAgICAgICBzdGF0ZVtqICsgMV0gXj0gdCBeIHRoaXMuX21peENvbFtzMSBeIHMyXTsKICAgICAgICBzdGF0ZVtqICsgMl0gXj0gdCBeIHRoaXMuX21peENvbFtzMiBeIHMzXTsKICAgICAgICBzdGF0ZVtqICsgM10gXj0gdCBeIHRoaXMuX21peENvbFtzMyBeIHMwXTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMCwgayA9IGkgKiAxNjsgaiA8IDE2OyArK2osICsraykgewogICAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgICAgfQogICAgfQogICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7CiAgICAgIHN0YXRlW2pdID0gc1tzdGF0ZVtqXV07CiAgICB9CiAgICB2ID0gc3RhdGVbMV07CiAgICBzdGF0ZVsxXSA9IHN0YXRlWzVdOwogICAgc3RhdGVbNV0gPSBzdGF0ZVs5XTsKICAgIHN0YXRlWzldID0gc3RhdGVbMTNdOwogICAgc3RhdGVbMTNdID0gdjsKICAgIHYgPSBzdGF0ZVsyXTsKICAgIHUgPSBzdGF0ZVs2XTsKICAgIHN0YXRlWzJdID0gc3RhdGVbMTBdOwogICAgc3RhdGVbNl0gPSBzdGF0ZVsxNF07CiAgICBzdGF0ZVsxMF0gPSB2OwogICAgc3RhdGVbMTRdID0gdTsKICAgIHYgPSBzdGF0ZVszXTsKICAgIHUgPSBzdGF0ZVs3XTsKICAgIHQgPSBzdGF0ZVsxMV07CiAgICBzdGF0ZVszXSA9IHN0YXRlWzE1XTsKICAgIHN0YXRlWzddID0gdjsKICAgIHN0YXRlWzExXSA9IHU7CiAgICBzdGF0ZVsxNV0gPSB0OwogICAgZm9yIChsZXQgaiA9IDAsIGsgPSB0aGlzLl9rZXlTaXplOyBqIDwgMTY7ICsraiwgKytrKSB7CiAgICAgIHN0YXRlW2pdIF49IGtleVtrXTsKICAgIH0KICAgIHJldHVybiBzdGF0ZTsKICB9CiAgX2RlY3J5cHRCbG9jazIoZGF0YSwgZmluYWxpemUpIHsKICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAogICAgICBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBsZXQgaXYgPSB0aGlzLml2OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkgewogICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgICsrYnVmZmVyTGVuZ3RoOwogICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBwbGFpbiA9IHRoaXMuX2RlY3J5cHQoYnVmZmVyLCB0aGlzLl9rZXkpOwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBwbGFpbltqXSBePSBpdltqXTsKICAgICAgfQogICAgICBpdiA9IGJ1ZmZlcjsKICAgICAgcmVzdWx0LnB1c2gocGxhaW4pOwogICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgdGhpcy5pdiA9IGl2OwogICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgfQogICAgbGV0IG91dHB1dExlbmd0aCA9IDE2ICogcmVzdWx0Lmxlbmd0aDsKICAgIGlmIChmaW5hbGl6ZSkgewogICAgICBjb25zdCBsYXN0QmxvY2sgPSByZXN1bHQuYXQoLTEpOwogICAgICBsZXQgcHNMZW4gPSBsYXN0QmxvY2tbMTVdOwogICAgICBpZiAocHNMZW4gPD0gMTYpIHsKICAgICAgICBmb3IgKGxldCBpID0gMTUsIGlpID0gMTYgLSBwc0xlbjsgaSA+PSBpaTsgLS1pKSB7CiAgICAgICAgICBpZiAobGFzdEJsb2NrW2ldICE9PSBwc0xlbikgewogICAgICAgICAgICBwc0xlbiA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvdXRwdXRMZW5ndGggLT0gcHNMZW47CiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGxhc3RCbG9jay5zdWJhcnJheSgwLCAxNiAtIHBzTGVuKTsKICAgICAgfQogICAgfQogICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7ICsraSwgaiArPSAxNikgewogICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KICBkZWNyeXB0QmxvY2soZGF0YSwgZmluYWxpemUsIGl2ID0gbnVsbCkgewogICAgY29uc3Qgc291cmNlTGVuZ3RoID0gZGF0YS5sZW5ndGg7CiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgIGxldCBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogICAgaWYgKGl2KSB7CiAgICAgIHRoaXMuaXYgPSBpdjsKICAgIH0gZWxzZSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyBidWZmZXJMZW5ndGggPCAxNiAmJiBpIDwgc291cmNlTGVuZ3RoOyArK2ksICsrYnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgYnVmZmVyW2J1ZmZlckxlbmd0aF0gPSBkYXRhW2ldOwogICAgICB9CiAgICAgIGlmIChidWZmZXJMZW5ndGggPCAxNikgewogICAgICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTsKICAgICAgfQogICAgICB0aGlzLml2ID0gYnVmZmVyOwogICAgICBkYXRhID0gZGF0YS5zdWJhcnJheSgxNik7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDE2KTsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gMDsKICAgIHRoaXMuZGVjcnlwdEJsb2NrID0gdGhpcy5fZGVjcnlwdEJsb2NrMjsKICAgIHJldHVybiB0aGlzLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgfQogIGVuY3J5cHQoZGF0YSwgaXYpIHsKICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgbGV0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAogICAgICBidWZmZXJMZW5ndGggPSB0aGlzLmJ1ZmZlclBvc2l0aW9uOwogICAgY29uc3QgcmVzdWx0ID0gW107CiAgICBpZiAoIWl2KSB7CiAgICAgIGl2ID0gbmV3IFVpbnQ4QXJyYXkoMTYpOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2VMZW5ndGg7ICsraSkgewogICAgICBidWZmZXJbYnVmZmVyTGVuZ3RoXSA9IGRhdGFbaV07CiAgICAgICsrYnVmZmVyTGVuZ3RoOwogICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMTYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDE2OyArK2opIHsKICAgICAgICBidWZmZXJbal0gXj0gaXZbal07CiAgICAgIH0KICAgICAgY29uc3QgY2lwaGVyID0gdGhpcy5fZW5jcnlwdChidWZmZXIsIHRoaXMuX2tleSk7CiAgICAgIGl2ID0gY2lwaGVyOwogICAgICByZXN1bHQucHVzaChjaXBoZXIpOwogICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIGJ1ZmZlckxlbmd0aCA9IDA7CiAgICB9CiAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwogICAgdGhpcy5pdiA9IGl2OwogICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApOwogICAgfQogICAgY29uc3Qgb3V0cHV0TGVuZ3RoID0gMTYgKiByZXN1bHQubGVuZ3RoOwogICAgY29uc3Qgb3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkob3V0cHV0TGVuZ3RoKTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gMCwgaWkgPSByZXN1bHQubGVuZ3RoOyBpIDwgaWk7ICsraSwgaiArPSAxNikgewogICAgICBvdXRwdXQuc2V0KHJlc3VsdFtpXSwgaik7CiAgICB9CiAgICByZXR1cm4gb3V0cHV0OwogIH0KfQpjbGFzcyBBRVMxMjhDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxMDsKICAgIHRoaXMuX2tleVNpemUgPSAxNjA7CiAgICB0aGlzLl9yY29uID0gbmV3IFVpbnQ4QXJyYXkoWzB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGQsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYsIDB4NmMsIDB4ZDgsIDB4YWIsIDB4NGQsIDB4OWEsIDB4MmYsIDB4NWUsIDB4YmMsIDB4NjMsIDB4YzYsIDB4OTcsIDB4MzUsIDB4NmEsIDB4ZDQsIDB4YjMsIDB4N2QsIDB4ZmEsIDB4ZWYsIDB4YzUsIDB4OTEsIDB4MzksIDB4NzIsIDB4ZTQsIDB4ZDMsIDB4YmQsIDB4NjEsIDB4YzIsIDB4OWYsIDB4MjUsIDB4NGEsIDB4OTQsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4ODMsIDB4MWQsIDB4M2EsIDB4NzQsIDB4ZTgsIDB4Y2IsIDB4OGRdKTsKICAgIHRoaXMuX2tleSA9IHRoaXMuX2V4cGFuZEtleShrZXkpOwogIH0KICBfZXhwYW5kS2V5KGNpcGhlcktleSkgewogICAgY29uc3QgYiA9IDE3NjsKICAgIGNvbnN0IHMgPSB0aGlzLl9zOwogICAgY29uc3QgcmNvbiA9IHRoaXMuX3Jjb247CiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShiKTsKICAgIHJlc3VsdC5zZXQoY2lwaGVyS2V5KTsKICAgIGZvciAobGV0IGogPSAxNiwgaSA9IDE7IGogPCBiOyArK2kpIHsKICAgICAgbGV0IHQxID0gcmVzdWx0W2ogLSAzXTsKICAgICAgbGV0IHQyID0gcmVzdWx0W2ogLSAyXTsKICAgICAgbGV0IHQzID0gcmVzdWx0W2ogLSAxXTsKICAgICAgbGV0IHQ0ID0gcmVzdWx0W2ogLSA0XTsKICAgICAgdDEgPSBzW3QxXTsKICAgICAgdDIgPSBzW3QyXTsKICAgICAgdDMgPSBzW3QzXTsKICAgICAgdDQgPSBzW3Q0XTsKICAgICAgdDEgXj0gcmNvbltpXTsKICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCA0OyArK24pIHsKICAgICAgICByZXN1bHRbal0gPSB0MSBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDIgXj0gcmVzdWx0W2ogLSAxNl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQzIF49IHJlc3VsdFtqIC0gMTZdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0NCBePSByZXN1bHRbaiAtIDE2XTsKICAgICAgICBqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQp9CmV4cG9ydHMuQUVTMTI4Q2lwaGVyID0gQUVTMTI4Q2lwaGVyOwpjbGFzcyBBRVMyNTZDaXBoZXIgZXh0ZW5kcyBBRVNCYXNlQ2lwaGVyIHsKICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgIHN1cGVyKCk7CiAgICB0aGlzLl9jeWNsZXNPZlJlcGV0aXRpb24gPSAxNDsKICAgIHRoaXMuX2tleVNpemUgPSAyMjQ7CiAgICB0aGlzLl9rZXkgPSB0aGlzLl9leHBhbmRLZXkoa2V5KTsKICB9CiAgX2V4cGFuZEtleShjaXBoZXJLZXkpIHsKICAgIGNvbnN0IGIgPSAyNDA7CiAgICBjb25zdCBzID0gdGhpcy5fczsKICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGIpOwogICAgcmVzdWx0LnNldChjaXBoZXJLZXkpOwogICAgbGV0IHIgPSAxOwogICAgbGV0IHQxLCB0MiwgdDMsIHQ0OwogICAgZm9yIChsZXQgaiA9IDMyLCBpID0gMTsgaiA8IGI7ICsraSkgewogICAgICBpZiAoaiAlIDMyID09PSAxNikgewogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgIH0gZWxzZSBpZiAoaiAlIDMyID09PSAwKSB7CiAgICAgICAgdDEgPSByZXN1bHRbaiAtIDNdOwogICAgICAgIHQyID0gcmVzdWx0W2ogLSAyXTsKICAgICAgICB0MyA9IHJlc3VsdFtqIC0gMV07CiAgICAgICAgdDQgPSByZXN1bHRbaiAtIDRdOwogICAgICAgIHQxID0gc1t0MV07CiAgICAgICAgdDIgPSBzW3QyXTsKICAgICAgICB0MyA9IHNbdDNdOwogICAgICAgIHQ0ID0gc1t0NF07CiAgICAgICAgdDEgXj0gcjsKICAgICAgICBpZiAoKHIgPDw9IDEpID49IDI1NikgewogICAgICAgICAgciA9IChyIF4gMHgxYikgJiAweGZmOwogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKGxldCBuID0gMDsgbiA8IDQ7ICsrbikgewogICAgICAgIHJlc3VsdFtqXSA9IHQxIF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgICByZXN1bHRbal0gPSB0MiBePSByZXN1bHRbaiAtIDMyXTsKICAgICAgICBqKys7CiAgICAgICAgcmVzdWx0W2pdID0gdDMgXj0gcmVzdWx0W2ogLSAzMl07CiAgICAgICAgaisrOwogICAgICAgIHJlc3VsdFtqXSA9IHQ0IF49IHJlc3VsdFtqIC0gMzJdOwogICAgICAgIGorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KZXhwb3J0cy5BRVMyNTZDaXBoZXIgPSBBRVMyNTZDaXBoZXI7CmNsYXNzIFBERjE3IHsKICBjaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIHVzZXJCeXRlcywgb3duZXJQYXNzd29yZCkgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KG93bmVyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lclZhbGlkYXRpb25TYWx0Lmxlbmd0aCk7CiAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7CiAgICByZXR1cm4gKDAsIF91dGlsLmlzQXJyYXlFcXVhbCkocmVzdWx0LCBvd25lclBhc3N3b3JkKTsKICB9CiAgY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlclBhc3N3b3JkKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVTSEEyNTYoaGFzaERhdGEsIDAsIGhhc2hEYXRhLmxlbmd0aCk7CiAgICByZXR1cm4gKDAsIF91dGlsLmlzQXJyYXlFcXVhbCkocmVzdWx0LCB1c2VyUGFzc3dvcmQpOwogIH0KICBnZXRPd25lcktleShwYXNzd29yZCwgb3duZXJLZXlTYWx0LCB1c2VyQnl0ZXMsIG93bmVyRW5jcnlwdGlvbikgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheShwYXNzd29yZC5sZW5ndGggKyA1Nik7CiAgICBoYXNoRGF0YS5zZXQocGFzc3dvcmQsIDApOwogICAgaGFzaERhdGEuc2V0KG93bmVyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyQnl0ZXMsIHBhc3N3b3JkLmxlbmd0aCArIG93bmVyS2V5U2FsdC5sZW5ndGgpOwogICAgY29uc3Qga2V5ID0gY2FsY3VsYXRlU0hBMjU2KGhhc2hEYXRhLCAwLCBoYXNoRGF0YS5sZW5ndGgpOwogICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9CiAgZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGNvbnN0IGtleSA9IGNhbGN1bGF0ZVNIQTI1NihoYXNoRGF0YSwgMCwgaGFzaERhdGEubGVuZ3RoKTsKICAgIGNvbnN0IGNpcGhlciA9IG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKICAgIHJldHVybiBjaXBoZXIuZGVjcnlwdEJsb2NrKHVzZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9Cn0KZXhwb3J0cy5QREYxNyA9IFBERjE3OwpjbGFzcyBQREYyMCB7CiAgX2hhc2gocGFzc3dvcmQsIGlucHV0LCB1c2VyQnl0ZXMpIHsKICAgIGxldCBrID0gY2FsY3VsYXRlU0hBMjU2KGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpLnN1YmFycmF5KDAsIDMyKTsKICAgIGxldCBlID0gWzBdOwogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCA2NCB8fCBlLmF0KC0xKSA+IGkgLSAzMikgewogICAgICBjb25zdCBjb21iaW5lZExlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aCArIGsubGVuZ3RoICsgdXNlckJ5dGVzLmxlbmd0aCwKICAgICAgICBjb21iaW5lZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoY29tYmluZWRMZW5ndGgpOwogICAgICBsZXQgd3JpdGVPZmZzZXQgPSAwOwogICAgICBjb21iaW5lZEFycmF5LnNldChwYXNzd29yZCwgd3JpdGVPZmZzZXQpOwogICAgICB3cml0ZU9mZnNldCArPSBwYXNzd29yZC5sZW5ndGg7CiAgICAgIGNvbWJpbmVkQXJyYXkuc2V0KGssIHdyaXRlT2Zmc2V0KTsKICAgICAgd3JpdGVPZmZzZXQgKz0gay5sZW5ndGg7CiAgICAgIGNvbWJpbmVkQXJyYXkuc2V0KHVzZXJCeXRlcywgd3JpdGVPZmZzZXQpOwogICAgICBjb25zdCBrMSA9IG5ldyBVaW50OEFycmF5KGNvbWJpbmVkTGVuZ3RoICogNjQpOwogICAgICBmb3IgKGxldCBqID0gMCwgcG9zID0gMDsgaiA8IDY0OyBqKyssIHBvcyArPSBjb21iaW5lZExlbmd0aCkgewogICAgICAgIGsxLnNldChjb21iaW5lZEFycmF5LCBwb3MpOwogICAgICB9CiAgICAgIGNvbnN0IGNpcGhlciA9IG5ldyBBRVMxMjhDaXBoZXIoay5zdWJhcnJheSgwLCAxNikpOwogICAgICBlID0gY2lwaGVyLmVuY3J5cHQoazEsIGsuc3ViYXJyYXkoMTYsIDMyKSk7CiAgICAgIGNvbnN0IHJlbWFpbmRlciA9IGUuc2xpY2UoMCwgMTYpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApICUgMzsKICAgICAgaWYgKHJlbWFpbmRlciA9PT0gMCkgewogICAgICAgIGsgPSBjYWxjdWxhdGVTSEEyNTYoZSwgMCwgZS5sZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKHJlbWFpbmRlciA9PT0gMSkgewogICAgICAgIGsgPSBjYWxjdWxhdGVTSEEzODQoZSwgMCwgZS5sZW5ndGgpOwogICAgICB9IGVsc2UgaWYgKHJlbWFpbmRlciA9PT0gMikgewogICAgICAgIGsgPSBjYWxjdWxhdGVTSEE1MTIoZSwgMCwgZS5sZW5ndGgpOwogICAgICB9CiAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybiBrLnN1YmFycmF5KDAsIDMyKTsKICB9CiAgY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1c2VyQnl0ZXMsIG93bmVyUGFzc3dvcmQpIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lclZhbGlkYXRpb25TYWx0LCBwYXNzd29yZC5sZW5ndGgpOwogICAgaGFzaERhdGEuc2V0KHVzZXJCeXRlcywgcGFzc3dvcmQubGVuZ3RoICsgb3duZXJWYWxpZGF0aW9uU2FsdC5sZW5ndGgpOwogICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faGFzaChwYXNzd29yZCwgaGFzaERhdGEsIHVzZXJCeXRlcyk7CiAgICByZXR1cm4gKDAsIF91dGlsLmlzQXJyYXlFcXVhbCkocmVzdWx0LCBvd25lclBhc3N3b3JkKTsKICB9CiAgY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlclBhc3N3b3JkKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyVmFsaWRhdGlvblNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9oYXNoKHBhc3N3b3JkLCBoYXNoRGF0YSwgW10pOwogICAgcmV0dXJuICgwLCBfdXRpbC5pc0FycmF5RXF1YWwpKHJlc3VsdCwgdXNlclBhc3N3b3JkKTsKICB9CiAgZ2V0T3duZXJLZXkocGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgdXNlckJ5dGVzLCBvd25lckVuY3J5cHRpb24pIHsKICAgIGNvbnN0IGhhc2hEYXRhID0gbmV3IFVpbnQ4QXJyYXkocGFzc3dvcmQubGVuZ3RoICsgNTYpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldChvd25lcktleVNhbHQsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICBoYXNoRGF0YS5zZXQodXNlckJ5dGVzLCBwYXNzd29yZC5sZW5ndGggKyBvd25lcktleVNhbHQubGVuZ3RoKTsKICAgIGNvbnN0IGtleSA9IHRoaXMuX2hhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCB1c2VyQnl0ZXMpOwogICAgY29uc3QgY2lwaGVyID0gbmV3IEFFUzI1NkNpcGhlcihrZXkpOwogICAgcmV0dXJuIGNpcGhlci5kZWNyeXB0QmxvY2sob3duZXJFbmNyeXB0aW9uLCBmYWxzZSwgbmV3IFVpbnQ4QXJyYXkoMTYpKTsKICB9CiAgZ2V0VXNlcktleShwYXNzd29yZCwgdXNlcktleVNhbHQsIHVzZXJFbmNyeXB0aW9uKSB7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KHBhc3N3b3JkLmxlbmd0aCArIDgpOwogICAgaGFzaERhdGEuc2V0KHBhc3N3b3JkLCAwKTsKICAgIGhhc2hEYXRhLnNldCh1c2VyS2V5U2FsdCwgcGFzc3dvcmQubGVuZ3RoKTsKICAgIGNvbnN0IGtleSA9IHRoaXMuX2hhc2gocGFzc3dvcmQsIGhhc2hEYXRhLCBbXSk7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgQUVTMjU2Q2lwaGVyKGtleSk7CiAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayh1c2VyRW5jcnlwdGlvbiwgZmFsc2UsIG5ldyBVaW50OEFycmF5KDE2KSk7CiAgfQp9CmV4cG9ydHMuUERGMjAgPSBQREYyMDsKY2xhc3MgQ2lwaGVyVHJhbnNmb3JtIHsKICBjb25zdHJ1Y3RvcihzdHJpbmdDaXBoZXJDb25zdHJ1Y3Rvciwgc3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IpIHsKICAgIHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IgPSBzdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcjsKICAgIHRoaXMuU3RyZWFtQ2lwaGVyQ29uc3RydWN0b3IgPSBzdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcjsKICB9CiAgY3JlYXRlU3RyZWFtKHN0cmVhbSwgbGVuZ3RoKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJlYW1DaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgcmV0dXJuIG5ldyBfZGVjcnlwdF9zdHJlYW0uRGVjcnlwdFN0cmVhbShzdHJlYW0sIGxlbmd0aCwgZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRGVjcnlwdFN0cmVhbShkYXRhLCBmaW5hbGl6ZSkgewogICAgICByZXR1cm4gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCBmaW5hbGl6ZSk7CiAgICB9KTsKICB9CiAgZGVjcnlwdFN0cmluZyhzKSB7CiAgICBjb25zdCBjaXBoZXIgPSBuZXcgdGhpcy5TdHJpbmdDaXBoZXJDb25zdHJ1Y3RvcigpOwogICAgbGV0IGRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocyk7CiAgICBkYXRhID0gY2lwaGVyLmRlY3J5cHRCbG9jayhkYXRhLCB0cnVlKTsKICAgIHJldHVybiAoMCwgX3V0aWwuYnl0ZXNUb1N0cmluZykoZGF0YSk7CiAgfQogIGVuY3J5cHRTdHJpbmcocykgewogICAgY29uc3QgY2lwaGVyID0gbmV3IHRoaXMuU3RyaW5nQ2lwaGVyQ29uc3RydWN0b3IoKTsKICAgIGlmIChjaXBoZXIgaW5zdGFuY2VvZiBBRVNCYXNlQ2lwaGVyKSB7CiAgICAgIGNvbnN0IHN0ckxlbiA9IHMubGVuZ3RoOwogICAgICBjb25zdCBwYWQgPSAxNiAtIHN0ckxlbiAlIDE2OwogICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFkKS5yZXBlYXQocGFkKTsKICAgICAgY29uc3QgaXYgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoaXYpOwogICAgICB9IGVsc2UgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgaXZbaV0gPSBNYXRoLmZsb29yKDI1NiAqIE1hdGgucmFuZG9tKCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQgZGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShzKTsKICAgICAgZGF0YSA9IGNpcGhlci5lbmNyeXB0KGRhdGEsIGl2KTsKICAgICAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBkYXRhLmxlbmd0aCk7CiAgICAgIGJ1Zi5zZXQoaXYpOwogICAgICBidWYuc2V0KGRhdGEsIDE2KTsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShidWYpOwogICAgfQogICAgbGV0IGRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocyk7CiAgICBkYXRhID0gY2lwaGVyLmVuY3J5cHQoZGF0YSk7CiAgICByZXR1cm4gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKGRhdGEpOwogIH0KfQpjb25zdCBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5ID0gZnVuY3Rpb24gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeUNsb3N1cmUoKSB7CiAgY29uc3QgZGVmYXVsdFBhc3N3b3JkQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMHgyOCwgMHhiZiwgMHg0ZSwgMHg1ZSwgMHg0ZSwgMHg3NSwgMHg4YSwgMHg0MSwgMHg2NCwgMHgwMCwgMHg0ZSwgMHg1NiwgMHhmZiwgMHhmYSwgMHgwMSwgMHgwOCwgMHgyZSwgMHgyZSwgMHgwMCwgMHhiNiwgMHhkMCwgMHg2OCwgMHgzZSwgMHg4MCwgMHgyZiwgMHgwYywgMHhhOSwgMHhmZSwgMHg2NCwgMHg1MywgMHg2OSwgMHg3YV0pOwogIGZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRpb25LZXkyMChyZXZpc2lvbiwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIG93bmVyVmFsaWRhdGlvblNhbHQsIG93bmVyS2V5U2FsdCwgdUJ5dGVzLCB1c2VyUGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlcktleVNhbHQsIG93bmVyRW5jcnlwdGlvbiwgdXNlckVuY3J5cHRpb24sIHBlcm1zKSB7CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgY29uc3QgcGFzc3dvcmRMZW5ndGggPSBNYXRoLm1pbigxMjcsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmQuc3ViYXJyYXkoMCwgcGFzc3dvcmRMZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgcGFzc3dvcmQgPSBbXTsKICAgIH0KICAgIGxldCBwZGZBbGdvcml0aG07CiAgICBpZiAocmV2aXNpb24gPT09IDYpIHsKICAgICAgcGRmQWxnb3JpdGhtID0gbmV3IFBERjIwKCk7CiAgICB9IGVsc2UgewogICAgICBwZGZBbGdvcml0aG0gPSBuZXcgUERGMTcoKTsKICAgIH0KICAgIGlmIChwZGZBbGdvcml0aG0uY2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHVzZXJWYWxpZGF0aW9uU2FsdCwgdXNlclBhc3N3b3JkKSkgewogICAgICByZXR1cm4gcGRmQWxnb3JpdGhtLmdldFVzZXJLZXkocGFzc3dvcmQsIHVzZXJLZXlTYWx0LCB1c2VyRW5jcnlwdGlvbik7CiAgICB9IGVsc2UgaWYgKHBhc3N3b3JkLmxlbmd0aCAmJiBwZGZBbGdvcml0aG0uY2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCB1Qnl0ZXMsIG93bmVyUGFzc3dvcmQpKSB7CiAgICAgIHJldHVybiBwZGZBbGdvcml0aG0uZ2V0T3duZXJLZXkocGFzc3dvcmQsIG93bmVyS2V5U2FsdCwgdUJ5dGVzLCBvd25lckVuY3J5cHRpb24pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVLZXlEYXRhKGZpbGVJZCwgcGFzc3dvcmQsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSkgewogICAgY29uc3QgaGFzaERhdGFTaXplID0gNDAgKyBvd25lclBhc3N3b3JkLmxlbmd0aCArIGZpbGVJZC5sZW5ndGg7CiAgICBjb25zdCBoYXNoRGF0YSA9IG5ldyBVaW50OEFycmF5KGhhc2hEYXRhU2l6ZSk7CiAgICBsZXQgaSA9IDAsCiAgICAgIGosCiAgICAgIG47CiAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgbiA9IE1hdGgubWluKDMyLCBwYXNzd29yZC5sZW5ndGgpOwogICAgICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gcGFzc3dvcmRbaV07CiAgICAgIH0KICAgIH0KICAgIGogPSAwOwogICAgd2hpbGUgKGkgPCAzMikgewogICAgICBoYXNoRGF0YVtpKytdID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKICAgIH0KICAgIGZvciAoaiA9IDAsIG4gPSBvd25lclBhc3N3b3JkLmxlbmd0aDsgaiA8IG47ICsraikgewogICAgICBoYXNoRGF0YVtpKytdID0gb3duZXJQYXNzd29yZFtqXTsKICAgIH0KICAgIGhhc2hEYXRhW2krK10gPSBmbGFncyAmIDB4ZmY7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4gOCAmIDB4ZmY7CiAgICBoYXNoRGF0YVtpKytdID0gZmxhZ3MgPj4gMTYgJiAweGZmOwogICAgaGFzaERhdGFbaSsrXSA9IGZsYWdzID4+PiAyNCAmIDB4ZmY7CiAgICBmb3IgKGogPSAwLCBuID0gZmlsZUlkLmxlbmd0aDsgaiA8IG47ICsraikgewogICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdOwogICAgfQogICAgaWYgKHJldmlzaW9uID49IDQgJiYgIWVuY3J5cHRNZXRhZGF0YSkgewogICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKICAgICAgaGFzaERhdGFbaSsrXSA9IDB4ZmY7CiAgICAgIGhhc2hEYXRhW2krK10gPSAweGZmOwogICAgICBoYXNoRGF0YVtpKytdID0gMHhmZjsKICAgIH0KICAgIGxldCBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTsKICAgIGNvbnN0IGtleUxlbmd0aEluQnl0ZXMgPSBrZXlMZW5ndGggPj4gMzsKICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCA1MDsgKytqKSB7CiAgICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoLCAwLCBrZXlMZW5ndGhJbkJ5dGVzKTsKICAgICAgfQogICAgfQogICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGhhc2guc3ViYXJyYXkoMCwga2V5TGVuZ3RoSW5CeXRlcyk7CiAgICBsZXQgY2lwaGVyLCBjaGVja0RhdGE7CiAgICBpZiAocmV2aXNpb24gPj0gMykgewogICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgewogICAgICAgIGhhc2hEYXRhW2ldID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaV07CiAgICAgIH0KICAgICAgZm9yIChqID0gMCwgbiA9IGZpbGVJZC5sZW5ndGg7IGogPCBuOyArK2opIHsKICAgICAgICBoYXNoRGF0YVtpKytdID0gZmlsZUlkW2pdOwogICAgICB9CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGNhbGN1bGF0ZU1ENShoYXNoRGF0YSwgMCwgaSkpOwogICAgICBuID0gZW5jcnlwdGlvbktleS5sZW5ndGg7CiAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShuKTsKICAgICAgZm9yIChqID0gMTsgaiA8PSAxOTsgKytqKSB7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyArK2spIHsKICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBlbmNyeXB0aW9uS2V5W2tdIF4gajsKICAgICAgICB9CiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CiAgICAgICAgY2hlY2tEYXRhID0gY2lwaGVyLmVuY3J5cHRCbG9jayhjaGVja0RhdGEpOwogICAgICB9CiAgICAgIGZvciAoaiA9IDAsIG4gPSBjaGVja0RhdGEubGVuZ3RoOyBqIDwgbjsgKytqKSB7CiAgICAgICAgaWYgKHVzZXJQYXNzd29yZFtqXSAhPT0gY2hlY2tEYXRhW2pdKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGNpcGhlciA9IG5ldyBBUkNGb3VyQ2lwaGVyKGVuY3J5cHRpb25LZXkpOwogICAgICBjaGVja0RhdGEgPSBjaXBoZXIuZW5jcnlwdEJsb2NrKGRlZmF1bHRQYXNzd29yZEJ5dGVzKTsKICAgICAgZm9yIChqID0gMCwgbiA9IGNoZWNrRGF0YS5sZW5ndGg7IGogPCBuOyArK2opIHsKICAgICAgICBpZiAodXNlclBhc3N3b3JkW2pdICE9PSBjaGVja0RhdGFbal0pIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGVuY3J5cHRpb25LZXk7CiAgfQogIGZ1bmN0aW9uIGRlY29kZVVzZXJQYXNzd29yZChwYXNzd29yZCwgb3duZXJQYXNzd29yZCwgcmV2aXNpb24sIGtleUxlbmd0aCkgewogICAgY29uc3QgaGFzaERhdGEgPSBuZXcgVWludDhBcnJheSgzMik7CiAgICBsZXQgaSA9IDA7CiAgICBjb25zdCBuID0gTWF0aC5taW4oMzIsIHBhc3N3b3JkLmxlbmd0aCk7CiAgICBmb3IgKDsgaSA8IG47ICsraSkgewogICAgICBoYXNoRGF0YVtpXSA9IHBhc3N3b3JkW2ldOwogICAgfQogICAgbGV0IGogPSAwOwogICAgd2hpbGUgKGkgPCAzMikgewogICAgICBoYXNoRGF0YVtpKytdID0gZGVmYXVsdFBhc3N3b3JkQnl0ZXNbaisrXTsKICAgIH0KICAgIGxldCBoYXNoID0gY2FsY3VsYXRlTUQ1KGhhc2hEYXRhLCAwLCBpKTsKICAgIGNvbnN0IGtleUxlbmd0aEluQnl0ZXMgPSBrZXlMZW5ndGggPj4gMzsKICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCA1MDsgKytqKSB7CiAgICAgICAgaGFzaCA9IGNhbGN1bGF0ZU1ENShoYXNoLCAwLCBoYXNoLmxlbmd0aCk7CiAgICAgIH0KICAgIH0KICAgIGxldCBjaXBoZXIsIHVzZXJQYXNzd29yZDsKICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7CiAgICAgIHVzZXJQYXNzd29yZCA9IG93bmVyUGFzc3dvcmQ7CiAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBuZXcgVWludDhBcnJheShrZXlMZW5ndGhJbkJ5dGVzKTsKICAgICAgZm9yIChqID0gMTk7IGogPj0gMDsgai0tKSB7CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBrZXlMZW5ndGhJbkJ5dGVzOyArK2spIHsKICAgICAgICAgIGRlcml2ZWRLZXlba10gPSBoYXNoW2tdIF4gajsKICAgICAgICB9CiAgICAgICAgY2lwaGVyID0gbmV3IEFSQ0ZvdXJDaXBoZXIoZGVyaXZlZEtleSk7CiAgICAgICAgdXNlclBhc3N3b3JkID0gY2lwaGVyLmVuY3J5cHRCbG9jayh1c2VyUGFzc3dvcmQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjaXBoZXIgPSBuZXcgQVJDRm91ckNpcGhlcihoYXNoLnN1YmFycmF5KDAsIGtleUxlbmd0aEluQnl0ZXMpKTsKICAgICAgdXNlclBhc3N3b3JkID0gY2lwaGVyLmVuY3J5cHRCbG9jayhvd25lclBhc3N3b3JkKTsKICAgIH0KICAgIHJldHVybiB1c2VyUGFzc3dvcmQ7CiAgfQogIGNvbnN0IGlkZW50aXR5TmFtZSA9IF9wcmltaXRpdmVzLk5hbWUuZ2V0KCJJZGVudGl0eSIpOwogIGZ1bmN0aW9uIGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCBlbmNyeXB0aW9uS2V5LCBpc0FlcyA9IGZhbHNlKSB7CiAgICBjb25zdCBrZXkgPSBuZXcgVWludDhBcnJheShlbmNyeXB0aW9uS2V5Lmxlbmd0aCArIDkpOwogICAgY29uc3QgbiA9IGVuY3J5cHRpb25LZXkubGVuZ3RoOwogICAgbGV0IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGtleVtpXSA9IGVuY3J5cHRpb25LZXlbaV07CiAgICB9CiAgICBrZXlbaSsrXSA9IG51bSAmIDB4ZmY7CiAgICBrZXlbaSsrXSA9IG51bSA+PiA4ICYgMHhmZjsKICAgIGtleVtpKytdID0gbnVtID4+IDE2ICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuICYgMHhmZjsKICAgIGtleVtpKytdID0gZ2VuID4+IDggJiAweGZmOwogICAgaWYgKGlzQWVzKSB7CiAgICAgIGtleVtpKytdID0gMHg3MzsKICAgICAga2V5W2krK10gPSAweDQxOwogICAgICBrZXlbaSsrXSA9IDB4NmM7CiAgICAgIGtleVtpKytdID0gMHg1NDsKICAgIH0KICAgIGNvbnN0IGhhc2ggPSBjYWxjdWxhdGVNRDUoa2V5LCAwLCBpKTsKICAgIHJldHVybiBoYXNoLnN1YmFycmF5KDAsIE1hdGgubWluKGVuY3J5cHRpb25LZXkubGVuZ3RoICsgNSwgMTYpKTsKICB9CiAgZnVuY3Rpb24gYnVpbGRDaXBoZXJDb25zdHJ1Y3RvcihjZiwgbmFtZSwgbnVtLCBnZW4sIGtleSkgewogICAgaWYgKCEobmFtZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBjcnlwdCBmaWx0ZXIgbmFtZS4iKTsKICAgIH0KICAgIGNvbnN0IGNyeXB0RmlsdGVyID0gY2YuZ2V0KG5hbWUubmFtZSk7CiAgICBsZXQgY2ZtOwogICAgaWYgKGNyeXB0RmlsdGVyICE9PSBudWxsICYmIGNyeXB0RmlsdGVyICE9PSB1bmRlZmluZWQpIHsKICAgICAgY2ZtID0gY3J5cHRGaWx0ZXIuZ2V0KCJDRk0iKTsKICAgIH0KICAgIGlmICghY2ZtIHx8IGNmbS5uYW1lID09PSAiTm9uZSIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yTm9uZSgpIHsKICAgICAgICByZXR1cm4gbmV3IE51bGxDaXBoZXIoKTsKICAgICAgfTsKICAgIH0KICAgIGlmIChjZm0ubmFtZSA9PT0gIlYyIikgewogICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JWMigpIHsKICAgICAgICByZXR1cm4gbmV3IEFSQ0ZvdXJDaXBoZXIoYnVpbGRPYmplY3RLZXkobnVtLCBnZW4sIGtleSwgZmFsc2UpKTsKICAgICAgfTsKICAgIH0KICAgIGlmIChjZm0ubmFtZSA9PT0gIkFFU1YyIikgewogICAgICByZXR1cm4gZnVuY3Rpb24gY2lwaGVyVHJhbnNmb3JtRmFjdG9yeUJ1aWxkQ2lwaGVyQ29uc3RydWN0b3JBRVNWMigpIHsKICAgICAgICByZXR1cm4gbmV3IEFFUzEyOENpcGhlcihidWlsZE9iamVjdEtleShudW0sIGdlbiwga2V5LCB0cnVlKSk7CiAgICAgIH07CiAgICB9CiAgICBpZiAoY2ZtLm5hbWUgPT09ICJBRVNWMyIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNpcGhlclRyYW5zZm9ybUZhY3RvcnlCdWlsZENpcGhlckNvbnN0cnVjdG9yQUVTVjMoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBRVMyNTZDaXBoZXIoa2V5KTsKICAgICAgfTsKICAgIH0KICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiVW5rbm93biBjcnlwdG8gbWV0aG9kIik7CiAgfQogIGNsYXNzIENpcGhlclRyYW5zZm9ybUZhY3RvcnkgewogICAgY29uc3RydWN0b3IoZGljdCwgZmlsZUlkLCBwYXNzd29yZCkgewogICAgICBjb25zdCBmaWx0ZXIgPSBkaWN0LmdldCgiRmlsdGVyIik7CiAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkoZmlsdGVyLCAiU3RhbmRhcmQiKSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigidW5rbm93biBlbmNyeXB0aW9uIG1ldGhvZCIpOwogICAgICB9CiAgICAgIHRoaXMuZmlsdGVyTmFtZSA9IGZpbHRlci5uYW1lOwogICAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgICBjb25zdCBhbGdvcml0aG0gPSBkaWN0LmdldCgiViIpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYWxnb3JpdGhtKSB8fCBhbGdvcml0aG0gIT09IDEgJiYgYWxnb3JpdGhtICE9PSAyICYmIGFsZ29yaXRobSAhPT0gNCAmJiBhbGdvcml0aG0gIT09IDUpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoInVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnb3JpdGhtIik7CiAgICAgIH0KICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CiAgICAgIGxldCBrZXlMZW5ndGggPSBkaWN0LmdldCgiTGVuZ3RoIik7CiAgICAgIGlmICgha2V5TGVuZ3RoKSB7CiAgICAgICAgaWYgKGFsZ29yaXRobSA8PSAzKSB7CiAgICAgICAgICBrZXlMZW5ndGggPSA0MDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgY2ZEaWN0ID0gZGljdC5nZXQoIkNGIik7CiAgICAgICAgICBjb25zdCBzdHJlYW1DcnlwdG9OYW1lID0gZGljdC5nZXQoIlN0bUYiKTsKICAgICAgICAgIGlmIChjZkRpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ICYmIHN0cmVhbUNyeXB0b05hbWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgIGNmRGljdC5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgICBjb25zdCBoYW5kbGVyRGljdCA9IGNmRGljdC5nZXQoc3RyZWFtQ3J5cHRvTmFtZS5uYW1lKTsKICAgICAgICAgICAga2V5TGVuZ3RoID0gaGFuZGxlckRpY3Q/LmdldCgiTGVuZ3RoIikgfHwgMTI4OwogICAgICAgICAgICBpZiAoa2V5TGVuZ3RoIDwgNDApIHsKICAgICAgICAgICAgICBrZXlMZW5ndGggPDw9IDM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGtleUxlbmd0aCkgfHwga2V5TGVuZ3RoIDwgNDAgfHwga2V5TGVuZ3RoICUgOCAhPT0gMCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBrZXkgbGVuZ3RoIik7CiAgICAgIH0KICAgICAgY29uc3Qgb3duZXJCeXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiTyIpKSwKICAgICAgICB1c2VyQnl0ZXMgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlUiKSk7CiAgICAgIGNvbnN0IG93bmVyUGFzc3dvcmQgPSBvd25lckJ5dGVzLnN1YmFycmF5KDAsIDMyKTsKICAgICAgY29uc3QgdXNlclBhc3N3b3JkID0gdXNlckJ5dGVzLnN1YmFycmF5KDAsIDMyKTsKICAgICAgY29uc3QgZmxhZ3MgPSBkaWN0LmdldCgiUCIpOwogICAgICBjb25zdCByZXZpc2lvbiA9IGRpY3QuZ2V0KCJSIik7CiAgICAgIGNvbnN0IGVuY3J5cHRNZXRhZGF0YSA9IChhbGdvcml0aG0gPT09IDQgfHwgYWxnb3JpdGhtID09PSA1KSAmJiBkaWN0LmdldCgiRW5jcnlwdE1ldGFkYXRhIikgIT09IGZhbHNlOwogICAgICB0aGlzLmVuY3J5cHRNZXRhZGF0YSA9IGVuY3J5cHRNZXRhZGF0YTsKICAgICAgY29uc3QgZmlsZUlkQnl0ZXMgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZmlsZUlkKTsKICAgICAgbGV0IHBhc3N3b3JkQnl0ZXM7CiAgICAgIGlmIChwYXNzd29yZCkgewogICAgICAgIGlmIChyZXZpc2lvbiA9PT0gNikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFzc3dvcmQgPSAoMCwgX3V0aWwudXRmOFN0cmluZ1RvU3RyaW5nKShwYXNzd29yZCk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICAoMCwgX3V0aWwud2FybikoIkNpcGhlclRyYW5zZm9ybUZhY3Rvcnk6IFVuYWJsZSB0byBjb252ZXJ0IFVURjggZW5jb2RlZCBwYXNzd29yZC4iKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcGFzc3dvcmRCeXRlcyA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShwYXNzd29yZCk7CiAgICAgIH0KICAgICAgbGV0IGVuY3J5cHRpb25LZXk7CiAgICAgIGlmIChhbGdvcml0aG0gIT09IDUpIHsKICAgICAgICBlbmNyeXB0aW9uS2V5ID0gcHJlcGFyZUtleURhdGEoZmlsZUlkQnl0ZXMsIHBhc3N3b3JkQnl0ZXMsIG93bmVyUGFzc3dvcmQsIHVzZXJQYXNzd29yZCwgZmxhZ3MsIHJldmlzaW9uLCBrZXlMZW5ndGgsIGVuY3J5cHRNZXRhZGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3Qgb3duZXJWYWxpZGF0aW9uU2FsdCA9IG93bmVyQnl0ZXMuc3ViYXJyYXkoMzIsIDQwKTsKICAgICAgICBjb25zdCBvd25lcktleVNhbHQgPSBvd25lckJ5dGVzLnN1YmFycmF5KDQwLCA0OCk7CiAgICAgICAgY29uc3QgdUJ5dGVzID0gdXNlckJ5dGVzLnN1YmFycmF5KDAsIDQ4KTsKICAgICAgICBjb25zdCB1c2VyVmFsaWRhdGlvblNhbHQgPSB1c2VyQnl0ZXMuc3ViYXJyYXkoMzIsIDQwKTsKICAgICAgICBjb25zdCB1c2VyS2V5U2FsdCA9IHVzZXJCeXRlcy5zdWJhcnJheSg0MCwgNDgpOwogICAgICAgIGNvbnN0IG93bmVyRW5jcnlwdGlvbiA9ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkaWN0LmdldCgiT0UiKSk7CiAgICAgICAgY29uc3QgdXNlckVuY3J5cHRpb24gPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGljdC5nZXQoIlVFIikpOwogICAgICAgIGNvbnN0IHBlcm1zID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGRpY3QuZ2V0KCJQZXJtcyIpKTsKICAgICAgICBlbmNyeXB0aW9uS2V5ID0gY3JlYXRlRW5jcnlwdGlvbktleTIwKHJldmlzaW9uLCBwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCBvd25lclZhbGlkYXRpb25TYWx0LCBvd25lcktleVNhbHQsIHVCeXRlcywgdXNlclBhc3N3b3JkLCB1c2VyVmFsaWRhdGlvblNhbHQsIHVzZXJLZXlTYWx0LCBvd25lckVuY3J5cHRpb24sIHVzZXJFbmNyeXB0aW9uLCBwZXJtcyk7CiAgICAgIH0KICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5ICYmICFwYXNzd29yZCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbigiTm8gcGFzc3dvcmQgZ2l2ZW4iLCBfdXRpbC5QYXNzd29yZFJlc3BvbnNlcy5ORUVEX1BBU1NXT1JEKTsKICAgICAgfSBlbHNlIGlmICghZW5jcnlwdGlvbktleSAmJiBwYXNzd29yZCkgewogICAgICAgIGNvbnN0IGRlY29kZWRQYXNzd29yZCA9IGRlY29kZVVzZXJQYXNzd29yZChwYXNzd29yZEJ5dGVzLCBvd25lclBhc3N3b3JkLCByZXZpc2lvbiwga2V5TGVuZ3RoKTsKICAgICAgICBlbmNyeXB0aW9uS2V5ID0gcHJlcGFyZUtleURhdGEoZmlsZUlkQnl0ZXMsIGRlY29kZWRQYXNzd29yZCwgb3duZXJQYXNzd29yZCwgdXNlclBhc3N3b3JkLCBmbGFncywgcmV2aXNpb24sIGtleUxlbmd0aCwgZW5jcnlwdE1ldGFkYXRhKTsKICAgICAgfQogICAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oIkluY29ycmVjdCBQYXNzd29yZCIsIF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzLklOQ09SUkVDVF9QQVNTV09SRCk7CiAgICAgIH0KICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gZW5jcnlwdGlvbktleTsKICAgICAgaWYgKGFsZ29yaXRobSA+PSA0KSB7CiAgICAgICAgY29uc3QgY2YgPSBkaWN0LmdldCgiQ0YiKTsKICAgICAgICBpZiAoY2YgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICBjZi5zdXBwcmVzc0VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLmNmID0gY2Y7CiAgICAgICAgdGhpcy5zdG1mID0gZGljdC5nZXQoIlN0bUYiKSB8fCBpZGVudGl0eU5hbWU7CiAgICAgICAgdGhpcy5zdHJmID0gZGljdC5nZXQoIlN0ckYiKSB8fCBpZGVudGl0eU5hbWU7CiAgICAgICAgdGhpcy5lZmYgPSBkaWN0LmdldCgiRUZGIikgfHwgdGhpcy5zdG1mOwogICAgICB9CiAgICB9CiAgICBjcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pIHsKICAgICAgaWYgKHRoaXMuYWxnb3JpdGhtID09PSA0IHx8IHRoaXMuYWxnb3JpdGhtID09PSA1KSB7CiAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJUcmFuc2Zvcm0oYnVpbGRDaXBoZXJDb25zdHJ1Y3Rvcih0aGlzLmNmLCB0aGlzLnN0cmYsIG51bSwgZ2VuLCB0aGlzLmVuY3J5cHRpb25LZXkpLCBidWlsZENpcGhlckNvbnN0cnVjdG9yKHRoaXMuY2YsIHRoaXMuc3RtZiwgbnVtLCBnZW4sIHRoaXMuZW5jcnlwdGlvbktleSkpOwogICAgICB9CiAgICAgIGNvbnN0IGtleSA9IGJ1aWxkT2JqZWN0S2V5KG51bSwgZ2VuLCB0aGlzLmVuY3J5cHRpb25LZXksIGZhbHNlKTsKICAgICAgY29uc3QgY2lwaGVyQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBidWlsZENpcGhlckNpcGhlckNvbnN0cnVjdG9yKCkgewogICAgICAgIHJldHVybiBuZXcgQVJDRm91ckNpcGhlcihrZXkpOwogICAgICB9OwogICAgICByZXR1cm4gbmV3IENpcGhlclRyYW5zZm9ybShjaXBoZXJDb25zdHJ1Y3RvciwgY2lwaGVyQ29uc3RydWN0b3IpOwogICAgfQogIH0KICByZXR1cm4gQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeTsKfSgpOwpleHBvcnRzLkNpcGhlclRyYW5zZm9ybUZhY3RvcnkgPSBDaXBoZXJUcmFuc2Zvcm1GYWN0b3J5OwoKLyoqKi8gfSksCi8qIDY5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuRGVjcnlwdFN0cmVhbSA9IHZvaWQgMDsKdmFyIF9kZWNvZGVfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXygxOCk7CmNvbnN0IGNodW5rU2l6ZSA9IDUxMjsKY2xhc3MgRGVjcnlwdFN0cmVhbSBleHRlbmRzIF9kZWNvZGVfc3RyZWFtLkRlY29kZVN0cmVhbSB7CiAgY29uc3RydWN0b3Ioc3RyLCBtYXliZUxlbmd0aCwgZGVjcnlwdCkgewogICAgc3VwZXIobWF5YmVMZW5ndGgpOwogICAgdGhpcy5zdHIgPSBzdHI7CiAgICB0aGlzLmRpY3QgPSBzdHIuZGljdDsKICAgIHRoaXMuZGVjcnlwdCA9IGRlY3J5cHQ7CiAgICB0aGlzLm5leHRDaHVuayA9IG51bGw7CiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7CiAgfQogIHJlYWRCbG9jaygpIHsKICAgIGxldCBjaHVuazsKICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7CiAgICAgIGNodW5rID0gdGhpcy5uZXh0Q2h1bms7CiAgICB9IGVsc2UgewogICAgICBjaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQogICAgaWYgKCFjaHVuayB8fCBjaHVuay5sZW5ndGggPT09IDApIHsKICAgICAgdGhpcy5lb2YgPSB0cnVlOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLm5leHRDaHVuayA9IHRoaXMuc3RyLmdldEJ5dGVzKGNodW5rU2l6ZSk7CiAgICBjb25zdCBoYXNNb3JlRGF0YSA9IHRoaXMubmV4dENodW5rPy5sZW5ndGggPiAwOwogICAgY29uc3QgZGVjcnlwdCA9IHRoaXMuZGVjcnlwdDsKICAgIGNodW5rID0gZGVjcnlwdChjaHVuaywgIWhhc01vcmVEYXRhKTsKICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYnVmZmVyTGVuZ3RoLAogICAgICBuZXdMZW5ndGggPSBidWZmZXJMZW5ndGggKyBjaHVuay5sZW5ndGgsCiAgICAgIGJ1ZmZlciA9IHRoaXMuZW5zdXJlQnVmZmVyKG5ld0xlbmd0aCk7CiAgICBidWZmZXIuc2V0KGNodW5rLCBidWZmZXJMZW5ndGgpOwogICAgdGhpcy5idWZmZXJMZW5ndGggPSBuZXdMZW5ndGg7CiAgfQp9CmV4cG9ydHMuRGVjcnlwdFN0cmVhbSA9IERlY3J5cHRTdHJlYW07CgovKioqLyB9KSwKLyogNzAgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5DYXRhbG9nID0gdm9pZCAwOwp2YXIgX2NvcmVfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwp2YXIgX25hbWVfbnVtYmVyX3RyZWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcxKTsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfY2xlYW51cF9oZWxwZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcyKTsKdmFyIF9jb2xvcnNwYWNlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7CnZhciBfZmlsZV9zcGVjID0gX193X3BkZmpzX3JlcXVpcmVfXyg3Myk7CnZhciBfaW1hZ2VfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDU5KTsKdmFyIF9tZXRhZGF0YV9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc0KTsKdmFyIF9zdHJ1Y3RfdHJlZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzUpOwpmdW5jdGlvbiBmZXRjaERlc3RpbmF0aW9uKGRlc3QpIHsKICBpZiAoZGVzdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgIGRlc3QgPSBkZXN0LmdldCgiRCIpOwogIH0KICByZXR1cm4gQXJyYXkuaXNBcnJheShkZXN0KSA/IGRlc3QgOiBudWxsOwp9CmNsYXNzIENhdGFsb2cgewogIGNvbnN0cnVjdG9yKHBkZk1hbmFnZXIsIHhyZWYpIHsKICAgIHRoaXMucGRmTWFuYWdlciA9IHBkZk1hbmFnZXI7CiAgICB0aGlzLnhyZWYgPSB4cmVmOwogICAgdGhpcy5fY2F0RGljdCA9IHhyZWYuZ2V0Q2F0YWxvZ09iaigpOwogICAgaWYgKCEodGhpcy5fY2F0RGljdCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiQ2F0YWxvZyBvYmplY3QgaXMgbm90IGEgZGljdGlvbmFyeS4iKTsKICAgIH0KICAgIHRoaXMudG9wbGV2ZWxQYWdlc0RpY3Q7CiAgICB0aGlzLl9hY3R1YWxOdW1QYWdlcyA9IG51bGw7CiAgICB0aGlzLmZvbnRDYWNoZSA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXRDYWNoZSgpOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlID0gbmV3IE1hcCgpOwogICAgdGhpcy5zdGFuZGFyZEZvbnREYXRhQ2FjaGUgPSBuZXcgTWFwKCk7CiAgICB0aGlzLmdsb2JhbEltYWdlQ2FjaGUgPSBuZXcgX2ltYWdlX3V0aWxzLkdsb2JhbEltYWdlQ2FjaGUoKTsKICAgIHRoaXMucGFnZUtpZHNDb3VudENhY2hlID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldENhY2hlKCk7CiAgICB0aGlzLnBhZ2VJbmRleENhY2hlID0gbmV3IF9wcmltaXRpdmVzLlJlZlNldENhY2hlKCk7CiAgICB0aGlzLm5vbkJsZW5kTW9kZXNTZXQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CiAgICB0aGlzLnN5c3RlbUZvbnRDYWNoZSA9IG5ldyBNYXAoKTsKICB9CiAgZ2V0IHZlcnNpb24oKSB7CiAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fY2F0RGljdC5nZXQoIlZlcnNpb24iKTsKICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICBpZiAoX2NvcmVfdXRpbHMuUERGX1ZFUlNJT05fUkVHRVhQLnRlc3QodmVyc2lvbi5uYW1lKSkgewogICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmVyc2lvbiIsIHZlcnNpb24ubmFtZSk7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBJbnZhbGlkIFBERiBjYXRhbG9nIHZlcnNpb246ICR7dmVyc2lvbi5uYW1lfWApOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ2ZXJzaW9uIiwgbnVsbCk7CiAgfQogIGdldCBsYW5nKCkgewogICAgY29uc3QgbGFuZyA9IHRoaXMuX2NhdERpY3QuZ2V0KCJMYW5nIik7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImxhbmciLCB0eXBlb2YgbGFuZyA9PT0gInN0cmluZyIgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGxhbmcpIDogbnVsbCk7CiAgfQogIGdldCBuZWVkc1JlbmRlcmluZygpIHsKICAgIGNvbnN0IG5lZWRzUmVuZGVyaW5nID0gdGhpcy5fY2F0RGljdC5nZXQoIk5lZWRzUmVuZGVyaW5nIik7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIm5lZWRzUmVuZGVyaW5nIiwgdHlwZW9mIG5lZWRzUmVuZGVyaW5nID09PSAiYm9vbGVhbiIgPyBuZWVkc1JlbmRlcmluZyA6IGZhbHNlKTsKICB9CiAgZ2V0IGNvbGxlY3Rpb24oKSB7CiAgICBsZXQgY29sbGVjdGlvbiA9IG51bGw7CiAgICB0cnkgewogICAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiQ29sbGVjdGlvbiIpOwogICAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiBvYmouc2l6ZSA+IDApIHsKICAgICAgICBjb2xsZWN0aW9uID0gb2JqOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC5pbmZvKSgiQ2Fubm90IGZldGNoIENvbGxlY3Rpb24gZW50cnk7IGFzc3VtaW5nIG5vIGNvbGxlY3Rpb24gaXMgcHJlc2VudC4iKTsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiY29sbGVjdGlvbiIsIGNvbGxlY3Rpb24pOwogIH0KICBnZXQgYWNyb0Zvcm0oKSB7CiAgICBsZXQgYWNyb0Zvcm0gPSBudWxsOwogICAgdHJ5IHsKICAgICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIkFjcm9Gb3JtIik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ICYmIG9iai5zaXplID4gMCkgewogICAgICAgIGFjcm9Gb3JtID0gb2JqOwogICAgICB9CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC5pbmZvKSgiQ2Fubm90IGZldGNoIEFjcm9Gb3JtIGVudHJ5OyBhc3N1bWluZyBubyBmb3JtcyBhcmUgcHJlc2VudC4iKTsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYWNyb0Zvcm0iLCBhY3JvRm9ybSk7CiAgfQogIGdldCBhY3JvRm9ybVJlZigpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIkFjcm9Gb3JtIik7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImFjcm9Gb3JtUmVmIiwgdmFsdWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYgPyB2YWx1ZSA6IG51bGwpOwogIH0KICBnZXQgbWV0YWRhdGEoKSB7CiAgICBjb25zdCBzdHJlYW1SZWYgPSB0aGlzLl9jYXREaWN0LmdldFJhdygiTWV0YWRhdGEiKTsKICAgIGlmICghKHN0cmVhbVJlZiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikpIHsKICAgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtZXRhZGF0YSIsIG51bGwpOwogICAgfQogICAgbGV0IG1ldGFkYXRhID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMueHJlZi5mZXRjaChzdHJlYW1SZWYsICF0aGlzLnhyZWYuZW5jcnlwdD8uZW5jcnlwdE1ldGFkYXRhKTsKICAgICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtICYmIHN0cmVhbS5kaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0uZGljdC5nZXQoIlR5cGUiKTsKICAgICAgICBjb25zdCBzdWJ0eXBlID0gc3RyZWFtLmRpY3QuZ2V0KCJTdWJ0eXBlIik7CiAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUsICJNZXRhZGF0YSIpICYmICgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHN1YnR5cGUsICJYTUwiKSkgewogICAgICAgICAgY29uc3QgZGF0YSA9ICgwLCBfdXRpbC5zdHJpbmdUb1VURjhTdHJpbmcpKHN0cmVhbS5nZXRTdHJpbmcoKSk7CiAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICBtZXRhZGF0YSA9IG5ldyBfbWV0YWRhdGFfcGFyc2VyLk1ldGFkYXRhUGFyc2VyKGRhdGEpLnNlcmlhbGl6YWJsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLmluZm8pKGBTa2lwcGluZyBpbnZhbGlkIE1ldGFkYXRhOiAiJHtleH0iLmApOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtZXRhZGF0YSIsIG1ldGFkYXRhKTsKICB9CiAgZ2V0IG1hcmtJbmZvKCkgewogICAgbGV0IG1hcmtJbmZvID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG1hcmtJbmZvID0gdGhpcy5fcmVhZE1hcmtJbmZvKCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgbWFyayBpbmZvLiIpOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJtYXJrSW5mbyIsIG1hcmtJbmZvKTsKICB9CiAgX3JlYWRNYXJrSW5mbygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJNYXJrSW5mbyIpOwogICAgaWYgKCEob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBtYXJrSW5mbyA9IHsKICAgICAgTWFya2VkOiBmYWxzZSwKICAgICAgVXNlclByb3BlcnRpZXM6IGZhbHNlLAogICAgICBTdXNwZWN0czogZmFsc2UKICAgIH07CiAgICBmb3IgKGNvbnN0IGtleSBpbiBtYXJrSW5mbykgewogICAgICBjb25zdCB2YWx1ZSA9IG9iai5nZXQoa2V5KTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgbWFya0luZm9ba2V5XSA9IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWFya0luZm87CiAgfQogIGdldCBzdHJ1Y3RUcmVlUm9vdCgpIHsKICAgIGxldCBzdHJ1Y3RUcmVlID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIHN0cnVjdFRyZWUgPSB0aGlzLl9yZWFkU3RydWN0VHJlZVJvb3QoKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKCJVbmFibGUgcmVhZCB0byBzdHJ1Y3RUcmVlUm9vdCBpbmZvLiIpOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJzdHJ1Y3RUcmVlUm9vdCIsIHN0cnVjdFRyZWUpOwogIH0KICBfcmVhZFN0cnVjdFRyZWVSb290KCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIlN0cnVjdFRyZWVSb290Iik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSBuZXcgX3N0cnVjdF90cmVlLlN0cnVjdFRyZWVSb290KG9iaik7CiAgICByb290LmluaXQoKTsKICAgIHJldHVybiByb290OwogIH0KICBnZXQgdG9wbGV2ZWxQYWdlc0RpY3QoKSB7CiAgICBjb25zdCBwYWdlc09iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlcyIpOwogICAgaWYgKCEocGFnZXNPYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkuIik7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInRvcGxldmVsUGFnZXNEaWN0IiwgcGFnZXNPYmopOwogIH0KICBnZXQgZG9jdW1lbnRPdXRsaW5lKCkgewogICAgbGV0IG9iaiA9IG51bGw7CiAgICB0cnkgewogICAgICBvYmogPSB0aGlzLl9yZWFkRG9jdW1lbnRPdXRsaW5lKCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgZG9jdW1lbnQgb3V0bGluZS4iKTsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiZG9jdW1lbnRPdXRsaW5lIiwgb2JqKTsKICB9CiAgX3JlYWREb2N1bWVudE91dGxpbmUoKSB7CiAgICBsZXQgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk91dGxpbmVzIik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIG9iaiA9IG9iai5nZXRSYXcoIkZpcnN0Iik7CiAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3Qgcm9vdCA9IHsKICAgICAgaXRlbXM6IFtdCiAgICB9OwogICAgY29uc3QgcXVldWUgPSBbewogICAgICBvYmosCiAgICAgIHBhcmVudDogcm9vdAogICAgfV07CiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CiAgICBwcm9jZXNzZWQucHV0KG9iaik7CiAgICBjb25zdCB4cmVmID0gdGhpcy54cmVmLAogICAgICBibGFja0NvbG9yID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpOwogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgaSA9IHF1ZXVlLnNoaWZ0KCk7CiAgICAgIGNvbnN0IG91dGxpbmVEaWN0ID0geHJlZi5mZXRjaElmUmVmKGkub2JqKTsKICAgICAgaWYgKG91dGxpbmVEaWN0ID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFvdXRsaW5lRGljdC5oYXMoIlRpdGxlIikpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgb3V0bGluZSBpdGVtIGVuY291bnRlcmVkLiIpOwogICAgICB9CiAgICAgIGNvbnN0IGRhdGEgPSB7CiAgICAgICAgdXJsOiBudWxsLAogICAgICAgIGRlc3Q6IG51bGwsCiAgICAgICAgYWN0aW9uOiBudWxsCiAgICAgIH07CiAgICAgIENhdGFsb2cucGFyc2VEZXN0RGljdGlvbmFyeSh7CiAgICAgICAgZGVzdERpY3Q6IG91dGxpbmVEaWN0LAogICAgICAgIHJlc3VsdE9iajogZGF0YSwKICAgICAgICBkb2NCYXNlVXJsOiB0aGlzLnBkZk1hbmFnZXIuZG9jQmFzZVVybCwKICAgICAgICBkb2NBdHRhY2htZW50czogdGhpcy5hdHRhY2htZW50cwogICAgICB9KTsKICAgICAgY29uc3QgdGl0bGUgPSBvdXRsaW5lRGljdC5nZXQoIlRpdGxlIik7CiAgICAgIGNvbnN0IGZsYWdzID0gb3V0bGluZURpY3QuZ2V0KCJGIikgfHwgMDsKICAgICAgY29uc3QgY29sb3IgPSBvdXRsaW5lRGljdC5nZXRBcnJheSgiQyIpOwogICAgICBjb25zdCBjb3VudCA9IG91dGxpbmVEaWN0LmdldCgiQ291bnQiKTsKICAgICAgbGV0IHJnYkNvbG9yID0gYmxhY2tDb2xvcjsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sb3IpICYmIGNvbG9yLmxlbmd0aCA9PT0gMyAmJiAoY29sb3JbMF0gIT09IDAgfHwgY29sb3JbMV0gIT09IDAgfHwgY29sb3JbMl0gIT09IDApKSB7CiAgICAgICAgcmdiQ29sb3IgPSBfY29sb3JzcGFjZS5Db2xvclNwYWNlLnNpbmdsZXRvbnMucmdiLmdldFJnYihjb2xvciwgMCk7CiAgICAgIH0KICAgICAgY29uc3Qgb3V0bGluZUl0ZW0gPSB7CiAgICAgICAgYWN0aW9uOiBkYXRhLmFjdGlvbiwKICAgICAgICBhdHRhY2htZW50OiBkYXRhLmF0dGFjaG1lbnQsCiAgICAgICAgZGVzdDogZGF0YS5kZXN0LAogICAgICAgIHVybDogZGF0YS51cmwsCiAgICAgICAgdW5zYWZlVXJsOiBkYXRhLnVuc2FmZVVybCwKICAgICAgICBuZXdXaW5kb3c6IGRhdGEubmV3V2luZG93LAogICAgICAgIHNldE9DR1N0YXRlOiBkYXRhLnNldE9DR1N0YXRlLAogICAgICAgIHRpdGxlOiAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHRpdGxlKSwKICAgICAgICBjb2xvcjogcmdiQ29sb3IsCiAgICAgICAgY291bnQ6IE51bWJlci5pc0ludGVnZXIoY291bnQpID8gY291bnQgOiB1bmRlZmluZWQsCiAgICAgICAgYm9sZDogISEoZmxhZ3MgJiAyKSwKICAgICAgICBpdGFsaWM6ICEhKGZsYWdzICYgMSksCiAgICAgICAgaXRlbXM6IFtdCiAgICAgIH07CiAgICAgIGkucGFyZW50Lml0ZW1zLnB1c2gob3V0bGluZUl0ZW0pOwogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIkZpcnN0Iik7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYgJiYgIXByb2Nlc3NlZC5oYXMob2JqKSkgewogICAgICAgIHF1ZXVlLnB1c2goewogICAgICAgICAgb2JqLAogICAgICAgICAgcGFyZW50OiBvdXRsaW5lSXRlbQogICAgICAgIH0pOwogICAgICAgIHByb2Nlc3NlZC5wdXQob2JqKTsKICAgICAgfQogICAgICBvYmogPSBvdXRsaW5lRGljdC5nZXRSYXcoIk5leHQiKTsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiAmJiAhcHJvY2Vzc2VkLmhhcyhvYmopKSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBvYmosCiAgICAgICAgICBwYXJlbnQ6IGkucGFyZW50CiAgICAgICAgfSk7CiAgICAgICAgcHJvY2Vzc2VkLnB1dChvYmopOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcm9vdC5pdGVtcy5sZW5ndGggPiAwID8gcm9vdC5pdGVtcyA6IG51bGw7CiAgfQogIGdldCBwZXJtaXNzaW9ucygpIHsKICAgIGxldCBwZXJtaXNzaW9ucyA9IG51bGw7CiAgICB0cnkgewogICAgICBwZXJtaXNzaW9ucyA9IHRoaXMuX3JlYWRQZXJtaXNzaW9ucygpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgaWYgKGV4IGluc3RhbmNlb2YgX2NvcmVfdXRpbHMuTWlzc2luZ0RhdGFFeGNlcHRpb24pIHsKICAgICAgICB0aHJvdyBleDsKICAgICAgfQogICAgICAoMCwgX3V0aWwud2FybikoIlVuYWJsZSB0byByZWFkIHBlcm1pc3Npb25zLiIpOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwZXJtaXNzaW9ucyIsIHBlcm1pc3Npb25zKTsKICB9CiAgX3JlYWRQZXJtaXNzaW9ucygpIHsKICAgIGNvbnN0IGVuY3J5cHQgPSB0aGlzLnhyZWYudHJhaWxlci5nZXQoIkVuY3J5cHQiKTsKICAgIGlmICghKGVuY3J5cHQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGxldCBmbGFncyA9IGVuY3J5cHQuZ2V0KCJQIik7CiAgICBpZiAodHlwZW9mIGZsYWdzICE9PSAibnVtYmVyIikgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZsYWdzICs9IDIgKiogMzI7CiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFtdOwogICAgZm9yIChjb25zdCBrZXkgaW4gX3V0aWwuUGVybWlzc2lvbkZsYWcpIHsKICAgICAgY29uc3QgdmFsdWUgPSBfdXRpbC5QZXJtaXNzaW9uRmxhZ1trZXldOwogICAgICBpZiAoZmxhZ3MgJiB2YWx1ZSkgewogICAgICAgIHBlcm1pc3Npb25zLnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGVybWlzc2lvbnM7CiAgfQogIGdldCBvcHRpb25hbENvbnRlbnRDb25maWcoKSB7CiAgICBsZXQgY29uZmlnID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLl9jYXREaWN0LmdldCgiT0NQcm9wZXJ0aWVzIik7CiAgICAgIGlmICghcHJvcGVydGllcykgewogICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHByb3BlcnRpZXMuZ2V0KCJEIik7CiAgICAgIGlmICghZGVmYXVsdENvbmZpZykgewogICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZ3JvdXBzRGF0YSA9IHByb3BlcnRpZXMuZ2V0KCJPQ0dzIik7CiAgICAgIGlmICghQXJyYXkuaXNBcnJheShncm91cHNEYXRhKSkgewogICAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgbnVsbCk7CiAgICAgIH0KICAgICAgY29uc3QgZ3JvdXBzID0gW107CiAgICAgIGNvbnN0IGdyb3VwUmVmcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGdyb3VwUmVmIG9mIGdyb3Vwc0RhdGEpIHsKICAgICAgICBpZiAoIShncm91cFJlZiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBncm91cFJlZnMucHVzaChncm91cFJlZik7CiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLnhyZWYuZmV0Y2hJZlJlZihncm91cFJlZik7CiAgICAgICAgZ3JvdXBzLnB1c2goewogICAgICAgICAgaWQ6IGdyb3VwUmVmLnRvU3RyaW5nKCksCiAgICAgICAgICBuYW1lOiB0eXBlb2YgZ3JvdXAuZ2V0KCJOYW1lIikgPT09ICJzdHJpbmciID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShncm91cC5nZXQoIk5hbWUiKSkgOiBudWxsLAogICAgICAgICAgaW50ZW50OiB0eXBlb2YgZ3JvdXAuZ2V0KCJJbnRlbnQiKSA9PT0gInN0cmluZyIgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGdyb3VwLmdldCgiSW50ZW50IikpIDogbnVsbAogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbmZpZyA9IHRoaXMuX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoZGVmYXVsdENvbmZpZywgZ3JvdXBSZWZzKTsKICAgICAgY29uZmlnLmdyb3VwcyA9IGdyb3VwczsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmFibGUgdG8gcmVhZCBvcHRpb25hbCBjb250ZW50IGNvbmZpZzogJHtleH1gKTsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3B0aW9uYWxDb250ZW50Q29uZmlnIiwgY29uZmlnKTsKICB9CiAgX3JlYWRPcHRpb25hbENvbnRlbnRDb25maWcoY29uZmlnLCBjb250ZW50R3JvdXBSZWZzKSB7CiAgICBmdW5jdGlvbiBwYXJzZU9uT2ZmKHJlZnMpIHsKICAgICAgY29uc3Qgb25QYXJzZWQgPSBbXTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVmcykpIHsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHJlZnMpIHsKICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb250ZW50R3JvdXBSZWZzLmluY2x1ZGVzKHZhbHVlKSkgewogICAgICAgICAgICBvblBhcnNlZC5wdXNoKHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb25QYXJzZWQ7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU9yZGVyKHJlZnMsIG5lc3RlZExldmVscyA9IDApIHsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZnMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3Qgb3JkZXIgPSBbXTsKICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWZzKSB7CiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmICYmIGNvbnRlbnRHcm91cFJlZnMuaW5jbHVkZXModmFsdWUpKSB7CiAgICAgICAgICBwYXJzZWRPcmRlclJlZnMucHV0KHZhbHVlKTsKICAgICAgICAgIG9yZGVyLnB1c2godmFsdWUudG9TdHJpbmcoKSk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbmVzdGVkT3JkZXIgPSBwYXJzZU5lc3RlZE9yZGVyKHZhbHVlLCBuZXN0ZWRMZXZlbHMpOwogICAgICAgIGlmIChuZXN0ZWRPcmRlcikgewogICAgICAgICAgb3JkZXIucHVzaChuZXN0ZWRPcmRlcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChuZXN0ZWRMZXZlbHMgPiAwKSB7CiAgICAgICAgcmV0dXJuIG9yZGVyOwogICAgICB9CiAgICAgIGNvbnN0IGhpZGRlbkdyb3VwcyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGdyb3VwUmVmIG9mIGNvbnRlbnRHcm91cFJlZnMpIHsKICAgICAgICBpZiAocGFyc2VkT3JkZXJSZWZzLmhhcyhncm91cFJlZikpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBoaWRkZW5Hcm91cHMucHVzaChncm91cFJlZi50b1N0cmluZygpKTsKICAgICAgfQogICAgICBpZiAoaGlkZGVuR3JvdXBzLmxlbmd0aCkgewogICAgICAgIG9yZGVyLnB1c2goewogICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgIG9yZGVyOiBoaWRkZW5Hcm91cHMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gb3JkZXI7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU5lc3RlZE9yZGVyKHJlZiwgbmVzdGVkTGV2ZWxzKSB7CiAgICAgIGlmICgrK25lc3RlZExldmVscyA+IE1BWF9ORVNURURfTEVWRUxTKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZU5lc3RlZE9yZGVyIC0gcmVhY2hlZCBNQVhfTkVTVEVEX0xFVkVMUy4iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCB2YWx1ZSA9IHhyZWYuZmV0Y2hJZlJlZihyZWYpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgbmVzdGVkTmFtZSA9IHhyZWYuZmV0Y2hJZlJlZih2YWx1ZVswXSk7CiAgICAgIGlmICh0eXBlb2YgbmVzdGVkTmFtZSAhPT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBuZXN0ZWRPcmRlciA9IHBhcnNlT3JkZXIodmFsdWUuc2xpY2UoMSksIG5lc3RlZExldmVscyk7CiAgICAgIGlmICghbmVzdGVkT3JkZXIgfHwgIW5lc3RlZE9yZGVyLmxlbmd0aCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShuZXN0ZWROYW1lKSwKICAgICAgICBvcmRlcjogbmVzdGVkT3JkZXIKICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWYsCiAgICAgIHBhcnNlZE9yZGVyUmVmcyA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKSwKICAgICAgTUFYX05FU1RFRF9MRVZFTFMgPSAxMDsKICAgIHJldHVybiB7CiAgICAgIG5hbWU6IHR5cGVvZiBjb25maWcuZ2V0KCJOYW1lIikgPT09ICJzdHJpbmciID8gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShjb25maWcuZ2V0KCJOYW1lIikpIDogbnVsbCwKICAgICAgY3JlYXRvcjogdHlwZW9mIGNvbmZpZy5nZXQoIkNyZWF0b3IiKSA9PT0gInN0cmluZyIgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGNvbmZpZy5nZXQoIkNyZWF0b3IiKSkgOiBudWxsLAogICAgICBiYXNlU3RhdGU6IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSA/IGNvbmZpZy5nZXQoIkJhc2VTdGF0ZSIpLm5hbWUgOiBudWxsLAogICAgICBvbjogcGFyc2VPbk9mZihjb25maWcuZ2V0KCJPTiIpKSwKICAgICAgb2ZmOiBwYXJzZU9uT2ZmKGNvbmZpZy5nZXQoIk9GRiIpKSwKICAgICAgb3JkZXI6IHBhcnNlT3JkZXIoY29uZmlnLmdldCgiT3JkZXIiKSksCiAgICAgIGdyb3VwczogbnVsbAogICAgfTsKICB9CiAgc2V0QWN0dWFsTnVtUGFnZXMobnVtID0gbnVsbCkgewogICAgdGhpcy5fYWN0dWFsTnVtUGFnZXMgPSBudW07CiAgfQogIGdldCBoYXNBY3R1YWxOdW1QYWdlcygpIHsKICAgIHJldHVybiB0aGlzLl9hY3R1YWxOdW1QYWdlcyAhPT0gbnVsbDsKICB9CiAgZ2V0IF9wYWdlc0NvdW50KCkgewogICAgY29uc3Qgb2JqID0gdGhpcy50b3BsZXZlbFBhZ2VzRGljdC5nZXQoIkNvdW50Iik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2UgY291bnQgaW4gdG9wLWxldmVsIHBhZ2VzIGRpY3Rpb25hcnkgaXMgbm90IGFuIGludGVnZXIuIik7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIl9wYWdlc0NvdW50Iiwgb2JqKTsKICB9CiAgZ2V0IG51bVBhZ2VzKCkgewogICAgcmV0dXJuIHRoaXMuaGFzQWN0dWFsTnVtUGFnZXMgPyB0aGlzLl9hY3R1YWxOdW1QYWdlcyA6IHRoaXMuX3BhZ2VzQ291bnQ7CiAgfQogIGdldCBkZXN0aW5hdGlvbnMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9yZWFkRGVzdHMoKSwKICAgICAgZGVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9uYW1lX251bWJlcl90cmVlLk5hbWVUcmVlKSB7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG9iai5nZXRBbGwoKSkgewogICAgICAgIGNvbnN0IGRlc3QgPSBmZXRjaERlc3RpbmF0aW9uKHZhbHVlKTsKICAgICAgICBpZiAoZGVzdCkgewogICAgICAgICAgZGVzdHNbKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShrZXkpXSA9IGRlc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgb2JqLmZvckVhY2goZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBkZXN0ID0gZmV0Y2hEZXN0aW5hdGlvbih2YWx1ZSk7CiAgICAgICAgaWYgKGRlc3QpIHsKICAgICAgICAgIGRlc3RzW2tleV0gPSBkZXN0OwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImRlc3RpbmF0aW9ucyIsIGRlc3RzKTsKICB9CiAgZ2V0RGVzdGluYXRpb24oaWQpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX3JlYWREZXN0cygpOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9uYW1lX251bWJlcl90cmVlLk5hbWVUcmVlKSB7CiAgICAgIGNvbnN0IGRlc3QgPSBmZXRjaERlc3RpbmF0aW9uKG9iai5nZXQoaWQpKTsKICAgICAgaWYgKGRlc3QpIHsKICAgICAgICByZXR1cm4gZGVzdDsKICAgICAgfQogICAgICBjb25zdCBhbGxEZXN0ID0gdGhpcy5kZXN0aW5hdGlvbnNbaWRdOwogICAgICBpZiAoYWxsRGVzdCkgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgRm91bmQgIiR7aWR9IiBhdCBhbiBpbmNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIE5hbWVUcmVlLmApOwogICAgICAgIHJldHVybiBhbGxEZXN0OwogICAgICB9CiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgY29uc3QgZGVzdCA9IGZldGNoRGVzdGluYXRpb24ob2JqLmdldChpZCkpOwogICAgICBpZiAoZGVzdCkgewogICAgICAgIHJldHVybiBkZXN0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgX3JlYWREZXN0cygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOwogICAgaWYgKG9iaj8uaGFzKCJEZXN0cyIpKSB7CiAgICAgIHJldHVybiBuZXcgX25hbWVfbnVtYmVyX3RyZWUuTmFtZVRyZWUob2JqLmdldFJhdygiRGVzdHMiKSwgdGhpcy54cmVmKTsKICAgIH0gZWxzZSBpZiAodGhpcy5fY2F0RGljdC5oYXMoIkRlc3RzIikpIHsKICAgICAgcmV0dXJuIHRoaXMuX2NhdERpY3QuZ2V0KCJEZXN0cyIpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgZ2V0IHBhZ2VMYWJlbHMoKSB7CiAgICBsZXQgb2JqID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG9iaiA9IHRoaXMuX3JlYWRQYWdlTGFiZWxzKCk7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKSgiVW5hYmxlIHRvIHJlYWQgcGFnZSBsYWJlbHMuIik7CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInBhZ2VMYWJlbHMiLCBvYmopOwogIH0KICBfcmVhZFBhZ2VMYWJlbHMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldFJhdygiUGFnZUxhYmVscyIpOwogICAgaWYgKCFvYmopIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYWdlTGFiZWxzID0gbmV3IEFycmF5KHRoaXMubnVtUGFnZXMpOwogICAgbGV0IHN0eWxlID0gbnVsbCwKICAgICAgcHJlZml4ID0gIiI7CiAgICBjb25zdCBudW1iZXJUcmVlID0gbmV3IF9uYW1lX251bWJlcl90cmVlLk51bWJlclRyZWUob2JqLCB0aGlzLnhyZWYpOwogICAgY29uc3QgbnVtcyA9IG51bWJlclRyZWUuZ2V0QWxsKCk7CiAgICBsZXQgY3VycmVudExhYmVsID0gIiIsCiAgICAgIGN1cnJlbnRJbmRleCA9IDE7CiAgICBmb3IgKGxldCBpID0gMCwgaWkgPSB0aGlzLm51bVBhZ2VzOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBsYWJlbERpY3QgPSBudW1zLmdldChpKTsKICAgICAgaWYgKGxhYmVsRGljdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKCEobGFiZWxEaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZUxhYmVsIGlzIG5vdCBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJUeXBlIikgJiYgISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGxhYmVsRGljdC5nZXQoIlR5cGUiKSwgIlBhZ2VMYWJlbCIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgdHlwZSBpbiBQYWdlTGFiZWwgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsRGljdC5oYXMoIlMiKSkgewogICAgICAgICAgY29uc3QgcyA9IGxhYmVsRGljdC5nZXQoIlMiKTsKICAgICAgICAgIGlmICghKHMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgc3R5bGUgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZSA9IHMubmFtZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3R5bGUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAobGFiZWxEaWN0LmhhcygiUCIpKSB7CiAgICAgICAgICBjb25zdCBwID0gbGFiZWxEaWN0LmdldCgiUCIpOwogICAgICAgICAgaWYgKHR5cGVvZiBwICE9PSAic3RyaW5nIikgewogICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgcHJlZml4IGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgfQogICAgICAgICAgcHJlZml4ID0gKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcHJlZml4ID0gIiI7CiAgICAgICAgfQogICAgICAgIGlmIChsYWJlbERpY3QuaGFzKCJTdCIpKSB7CiAgICAgICAgICBjb25zdCBzdCA9IGxhYmVsRGljdC5nZXQoIlN0Iik7CiAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKHN0KSAmJiBzdCA+PSAxKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgc3RhcnQgaW4gUGFnZUxhYmVsIGRpY3Rpb25hcnkuIik7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50SW5kZXggPSBzdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudEluZGV4ID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3dpdGNoIChzdHlsZSkgewogICAgICAgIGNhc2UgIkQiOgogICAgICAgICAgY3VycmVudExhYmVsID0gY3VycmVudEluZGV4OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUiI6CiAgICAgICAgY2FzZSAiciI6CiAgICAgICAgICBjdXJyZW50TGFiZWwgPSAoMCwgX2NvcmVfdXRpbHMudG9Sb21hbk51bWVyYWxzKShjdXJyZW50SW5kZXgsIHN0eWxlID09PSAiciIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgY2FzZSAiYSI6CiAgICAgICAgICBjb25zdCBMSU1JVCA9IDI2OwogICAgICAgICAgY29uc3QgQV9VUFBFUl9DQVNFID0gMHg0MSwKICAgICAgICAgICAgQV9MT1dFUl9DQVNFID0gMHg2MTsKICAgICAgICAgIGNvbnN0IGJhc2VDaGFyQ29kZSA9IHN0eWxlID09PSAiYSIgPyBBX0xPV0VSX0NBU0UgOiBBX1VQUEVSX0NBU0U7CiAgICAgICAgICBjb25zdCBsZXR0ZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7CiAgICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJhc2VDaGFyQ29kZSArIGxldHRlckluZGV4ICUgTElNSVQpOwogICAgICAgICAgY3VycmVudExhYmVsID0gY2hhcmFjdGVyLnJlcGVhdChNYXRoLmZsb29yKGxldHRlckluZGV4IC8gTElNSVQpICsgMSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKHN0eWxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBzdHlsZSAiJHtzdHlsZX0iIGluIFBhZ2VMYWJlbCBkaWN0aW9uYXJ5LmApOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudExhYmVsID0gIiI7CiAgICAgIH0KICAgICAgcGFnZUxhYmVsc1tpXSA9IHByZWZpeCArIGN1cnJlbnRMYWJlbDsKICAgICAgY3VycmVudEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gcGFnZUxhYmVsczsKICB9CiAgZ2V0IHBhZ2VMYXlvdXQoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiUGFnZUxheW91dCIpOwogICAgbGV0IHBhZ2VMYXlvdXQgPSAiIjsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgIHN3aXRjaCAob2JqLm5hbWUpIHsKICAgICAgICBjYXNlICJTaW5nbGVQYWdlIjoKICAgICAgICBjYXNlICJPbmVDb2x1bW4iOgogICAgICAgIGNhc2UgIlR3b0NvbHVtbkxlZnQiOgogICAgICAgIGNhc2UgIlR3b0NvbHVtblJpZ2h0IjoKICAgICAgICBjYXNlICJUd29QYWdlTGVmdCI6CiAgICAgICAgY2FzZSAiVHdvUGFnZVJpZ2h0IjoKICAgICAgICAgIHBhZ2VMYXlvdXQgPSBvYmoubmFtZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJwYWdlTGF5b3V0IiwgcGFnZUxheW91dCk7CiAgfQogIGdldCBwYWdlTW9kZSgpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJQYWdlTW9kZSIpOwogICAgbGV0IHBhZ2VNb2RlID0gIlVzZU5vbmUiOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgc3dpdGNoIChvYmoubmFtZSkgewogICAgICAgIGNhc2UgIlVzZU5vbmUiOgogICAgICAgIGNhc2UgIlVzZU91dGxpbmVzIjoKICAgICAgICBjYXNlICJVc2VUaHVtYnMiOgogICAgICAgIGNhc2UgIkZ1bGxTY3JlZW4iOgogICAgICAgIGNhc2UgIlVzZU9DIjoKICAgICAgICBjYXNlICJVc2VBdHRhY2htZW50cyI6CiAgICAgICAgICBwYWdlTW9kZSA9IG9iai5uYW1lOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgInBhZ2VNb2RlIiwgcGFnZU1vZGUpOwogIH0KICBnZXQgdmlld2VyUHJlZmVyZW5jZXMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiVmlld2VyUHJlZmVyZW5jZXMiKTsKICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidmlld2VyUHJlZmVyZW5jZXMiLCBudWxsKTsKICAgIH0KICAgIGxldCBwcmVmcyA9IG51bGw7CiAgICBmb3IgKGNvbnN0IGtleSBvZiBvYmouZ2V0S2V5cygpKSB7CiAgICAgIGNvbnN0IHZhbHVlID0gb2JqLmdldChrZXkpOwogICAgICBsZXQgcHJlZlZhbHVlOwogICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgIGNhc2UgIkhpZGVUb29sYmFyIjoKICAgICAgICBjYXNlICJIaWRlTWVudWJhciI6CiAgICAgICAgY2FzZSAiSGlkZVdpbmRvd1VJIjoKICAgICAgICBjYXNlICJGaXRXaW5kb3ciOgogICAgICAgIGNhc2UgIkNlbnRlcldpbmRvdyI6CiAgICAgICAgY2FzZSAiRGlzcGxheURvY1RpdGxlIjoKICAgICAgICBjYXNlICJQaWNrVHJheUJ5UERGU2l6ZSI6CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJOb25GdWxsU2NyZWVuUGFnZU1vZGUiOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJVc2VOb25lIjoKICAgICAgICAgICAgICBjYXNlICJVc2VPdXRsaW5lcyI6CiAgICAgICAgICAgICAgY2FzZSAiVXNlVGh1bWJzIjoKICAgICAgICAgICAgICBjYXNlICJVc2VPQyI6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZS5uYW1lOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9ICJVc2VOb25lIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiRGlyZWN0aW9uIjoKICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgICAgICAgc3dpdGNoICh2YWx1ZS5uYW1lKSB7CiAgICAgICAgICAgICAgY2FzZSAiTDJSIjoKICAgICAgICAgICAgICBjYXNlICJSMkwiOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiTDJSIjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiVmlld0FyZWEiOgogICAgICAgIGNhc2UgIlZpZXdDbGlwIjoKICAgICAgICBjYXNlICJQcmludEFyZWEiOgogICAgICAgIGNhc2UgIlByaW50Q2xpcCI6CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgIHN3aXRjaCAodmFsdWUubmFtZSkgewogICAgICAgICAgICAgIGNhc2UgIk1lZGlhQm94IjoKICAgICAgICAgICAgICBjYXNlICJDcm9wQm94IjoKICAgICAgICAgICAgICBjYXNlICJCbGVlZEJveCI6CiAgICAgICAgICAgICAgY2FzZSAiVHJpbUJveCI6CiAgICAgICAgICAgICAgY2FzZSAiQXJ0Qm94IjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkNyb3BCb3giOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJQcmludFNjYWxpbmciOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJOb25lIjoKICAgICAgICAgICAgICBjYXNlICJBcHBEZWZhdWx0IjoKICAgICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlLm5hbWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gIkFwcERlZmF1bHQiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJEdXBsZXgiOgogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLm5hbWUpIHsKICAgICAgICAgICAgICBjYXNlICJTaW1wbGV4IjoKICAgICAgICAgICAgICBjYXNlICJEdXBsZXhGbGlwU2hvcnRFZGdlIjoKICAgICAgICAgICAgICBjYXNlICJEdXBsZXhGbGlwTG9uZ0VkZ2UiOgogICAgICAgICAgICAgICAgcHJlZlZhbHVlID0gdmFsdWUubmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBwcmVmVmFsdWUgPSAiTm9uZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlByaW50UGFnZVJhbmdlIjoKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggJSAyID09PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZS5ldmVyeSgocGFnZSwgaSwgYXJyKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+IDAgJiYgKGkgPT09IDAgfHwgcGFnZSA+PSBhcnJbaSAtIDFdKSAmJiBwYWdlIDw9IHRoaXMubnVtUGFnZXM7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoaXNWYWxpZCkgewogICAgICAgICAgICAgIHByZWZWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJOdW1Db3BpZXMiOgogICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID4gMCkgewogICAgICAgICAgICBwcmVmVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYElnbm9yaW5nIG5vbi1zdGFuZGFyZCBrZXkgaW4gVmlld2VyUHJlZmVyZW5jZXM6ICR7a2V5fS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChwcmVmVmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgQmFkIHZhbHVlLCBmb3Iga2V5ICIke2tleX0iLCBpbiBWaWV3ZXJQcmVmZXJlbmNlczogJHt2YWx1ZX0uYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFwcmVmcykgewogICAgICAgIHByZWZzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgfQogICAgICBwcmVmc1trZXldID0gcHJlZlZhbHVlOwogICAgfQogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJ2aWV3ZXJQcmVmZXJlbmNlcyIsIHByZWZzKTsKICB9CiAgZ2V0IG9wZW5BY3Rpb24oKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiT3BlbkFjdGlvbiIpOwogICAgY29uc3Qgb3BlbkFjdGlvbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBjb25zdCBkZXN0RGljdCA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CiAgICAgIGRlc3REaWN0LnNldCgiQSIsIG9iaik7CiAgICAgIGNvbnN0IHJlc3VsdE9iaiA9IHsKICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgZGVzdDogbnVsbCwKICAgICAgICBhY3Rpb246IG51bGwKICAgICAgfTsKICAgICAgQ2F0YWxvZy5wYXJzZURlc3REaWN0aW9uYXJ5KHsKICAgICAgICBkZXN0RGljdCwKICAgICAgICByZXN1bHRPYmoKICAgICAgfSk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdE9iai5kZXN0KSkgewogICAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IHJlc3VsdE9iai5kZXN0OwogICAgICB9IGVsc2UgaWYgKHJlc3VsdE9iai5hY3Rpb24pIHsKICAgICAgICBvcGVuQWN0aW9uLmFjdGlvbiA9IHJlc3VsdE9iai5hY3Rpb247CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CiAgICAgIG9wZW5BY3Rpb24uZGVzdCA9IG9iajsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAib3BlbkFjdGlvbiIsICgwLCBfdXRpbC5vYmplY3RTaXplKShvcGVuQWN0aW9uKSA+IDAgPyBvcGVuQWN0aW9uIDogbnVsbCk7CiAgfQogIGdldCBhdHRhY2htZW50cygpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMuX2NhdERpY3QuZ2V0KCJOYW1lcyIpOwogICAgbGV0IGF0dGFjaG1lbnRzID0gbnVsbDsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ICYmIG9iai5oYXMoIkVtYmVkZGVkRmlsZXMiKSkgewogICAgICBjb25zdCBuYW1lVHJlZSA9IG5ldyBfbmFtZV9udW1iZXJfdHJlZS5OYW1lVHJlZShvYmouZ2V0UmF3KCJFbWJlZGRlZEZpbGVzIiksIHRoaXMueHJlZik7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5hbWVUcmVlLmdldEFsbCgpKSB7CiAgICAgICAgY29uc3QgZnMgPSBuZXcgX2ZpbGVfc3BlYy5GaWxlU3BlYyh2YWx1ZSwgdGhpcy54cmVmKTsKICAgICAgICBpZiAoIWF0dGFjaG1lbnRzKSB7CiAgICAgICAgICBhdHRhY2htZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICAgIGF0dGFjaG1lbnRzWygwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoa2V5KV0gPSBmcy5zZXJpYWxpemFibGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYXR0YWNobWVudHMiLCBhdHRhY2htZW50cyk7CiAgfQogIGdldCB4ZmFJbWFnZXMoKSB7CiAgICBjb25zdCBvYmogPSB0aGlzLl9jYXREaWN0LmdldCgiTmFtZXMiKTsKICAgIGxldCB4ZmFJbWFnZXMgPSBudWxsOwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QgJiYgb2JqLmhhcygiWEZBSW1hZ2VzIikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgX25hbWVfbnVtYmVyX3RyZWUuTmFtZVRyZWUob2JqLmdldFJhdygiWEZBSW1hZ2VzIiksIHRoaXMueHJlZik7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5hbWVUcmVlLmdldEFsbCgpKSB7CiAgICAgICAgaWYgKCF4ZmFJbWFnZXMpIHsKICAgICAgICAgIHhmYUltYWdlcyA9IG5ldyBfcHJpbWl0aXZlcy5EaWN0KHRoaXMueHJlZik7CiAgICAgICAgfQogICAgICAgIHhmYUltYWdlcy5zZXQoKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShrZXkpLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAieGZhSW1hZ2VzIiwgeGZhSW1hZ2VzKTsKICB9CiAgX2NvbGxlY3RKYXZhU2NyaXB0KCkgewogICAgY29uc3Qgb2JqID0gdGhpcy5fY2F0RGljdC5nZXQoIk5hbWVzIik7CiAgICBsZXQgamF2YVNjcmlwdCA9IG51bGw7CiAgICBmdW5jdGlvbiBhcHBlbmRJZkphdmFTY3JpcHREaWN0KG5hbWUsIGpzRGljdCkgewogICAgICBpZiAoIShqc0RpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoISgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKGpzRGljdC5nZXQoIlMiKSwgIkphdmFTY3JpcHQiKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQganMgPSBqc0RpY3QuZ2V0KCJKUyIpOwogICAgICBpZiAoanMgaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkgewogICAgICAgIGpzID0ganMuZ2V0U3RyaW5nKCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzICE9PSAic3RyaW5nIikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBqcyA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoanMpLnJlcGxhY2VBbGwoIlx4MDAiLCAiIik7CiAgICAgIChqYXZhU2NyaXB0IHx8PSBuZXcgTWFwKCkpLnNldChuYW1lLCBqcyk7CiAgICB9CiAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCAmJiBvYmouaGFzKCJKYXZhU2NyaXB0IikpIHsKICAgICAgY29uc3QgbmFtZVRyZWUgPSBuZXcgX25hbWVfbnVtYmVyX3RyZWUuTmFtZVRyZWUob2JqLmdldFJhdygiSmF2YVNjcmlwdCIpLCB0aGlzLnhyZWYpOwogICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuYW1lVHJlZS5nZXRBbGwoKSkgewogICAgICAgIGFwcGVuZElmSmF2YVNjcmlwdERpY3QoKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShrZXkpLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG9wZW5BY3Rpb24gPSB0aGlzLl9jYXREaWN0LmdldCgiT3BlbkFjdGlvbiIpOwogICAgaWYgKG9wZW5BY3Rpb24pIHsKICAgICAgYXBwZW5kSWZKYXZhU2NyaXB0RGljdCgiT3BlbkFjdGlvbiIsIG9wZW5BY3Rpb24pOwogICAgfQogICAgcmV0dXJuIGphdmFTY3JpcHQ7CiAgfQogIGdldCBqYXZhU2NyaXB0KCkgewogICAgY29uc3QgamF2YVNjcmlwdCA9IHRoaXMuX2NvbGxlY3RKYXZhU2NyaXB0KCk7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImphdmFTY3JpcHQiLCBqYXZhU2NyaXB0ID8gWy4uLmphdmFTY3JpcHQudmFsdWVzKCldIDogbnVsbCk7CiAgfQogIGdldCBqc0FjdGlvbnMoKSB7CiAgICBjb25zdCBqYXZhU2NyaXB0ID0gdGhpcy5fY29sbGVjdEphdmFTY3JpcHQoKTsKICAgIGxldCBhY3Rpb25zID0gKDAsIF9jb3JlX3V0aWxzLmNvbGxlY3RBY3Rpb25zKSh0aGlzLnhyZWYsIHRoaXMuX2NhdERpY3QsIF91dGlsLkRvY3VtZW50QWN0aW9uRXZlbnRUeXBlKTsKICAgIGlmIChqYXZhU2NyaXB0KSB7CiAgICAgIGlmICghYWN0aW9ucykgewogICAgICAgIGFjdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBqYXZhU2NyaXB0KSB7CiAgICAgICAgaWYgKGtleSBpbiBhY3Rpb25zKSB7CiAgICAgICAgICBhY3Rpb25zW2tleV0ucHVzaCh2YWwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhY3Rpb25zW2tleV0gPSBbdmFsXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAianNBY3Rpb25zIiwgYWN0aW9ucyk7CiAgfQogIGFzeW5jIGZvbnRGYWxsYmFjayhpZCwgaGFuZGxlcikgewogICAgY29uc3QgdHJhbnNsYXRlZEZvbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mb250Q2FjaGUpOwogICAgZm9yIChjb25zdCB0cmFuc2xhdGVkRm9udCBvZiB0cmFuc2xhdGVkRm9udHMpIHsKICAgICAgaWYgKHRyYW5zbGF0ZWRGb250LmxvYWRlZE5hbWUgPT09IGlkKSB7CiAgICAgICAgdHJhbnNsYXRlZEZvbnQuZmFsbGJhY2soaGFuZGxlcik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIGFzeW5jIGNsZWFudXAobWFudWFsbHlUcmlnZ2VyZWQgPSBmYWxzZSkgewogICAgKDAsIF9jbGVhbnVwX2hlbHBlci5jbGVhckdsb2JhbENhY2hlcykoKTsKICAgIHRoaXMuZ2xvYmFsSW1hZ2VDYWNoZS5jbGVhcihtYW51YWxseVRyaWdnZXJlZCk7CiAgICB0aGlzLnBhZ2VLaWRzQ291bnRDYWNoZS5jbGVhcigpOwogICAgdGhpcy5wYWdlSW5kZXhDYWNoZS5jbGVhcigpOwogICAgdGhpcy5ub25CbGVuZE1vZGVzU2V0LmNsZWFyKCk7CiAgICBjb25zdCB0cmFuc2xhdGVkRm9udHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZvbnRDYWNoZSk7CiAgICBmb3IgKGNvbnN0IHsKICAgICAgZGljdAogICAgfSBvZiB0cmFuc2xhdGVkRm9udHMpIHsKICAgICAgZGVsZXRlIGRpY3QuY2FjaGVLZXk7CiAgICB9CiAgICB0aGlzLmZvbnRDYWNoZS5jbGVhcigpOwogICAgdGhpcy5idWlsdEluQ01hcENhY2hlLmNsZWFyKCk7CiAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFDYWNoZS5jbGVhcigpOwogICAgdGhpcy5zeXN0ZW1Gb250Q2FjaGUuY2xlYXIoKTsKICB9CiAgYXN5bmMgZ2V0UGFnZURpY3QocGFnZUluZGV4KSB7CiAgICBjb25zdCBub2Rlc1RvVmlzaXQgPSBbdGhpcy50b3BsZXZlbFBhZ2VzRGljdF07CiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CiAgICBjb25zdCBwYWdlc1JlZiA9IHRoaXMuX2NhdERpY3QuZ2V0UmF3KCJQYWdlcyIpOwogICAgaWYgKHBhZ2VzUmVmIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgIHZpc2l0ZWROb2Rlcy5wdXQocGFnZXNSZWYpOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZiwKICAgICAgcGFnZUtpZHNDb3VudENhY2hlID0gdGhpcy5wYWdlS2lkc0NvdW50Q2FjaGUsCiAgICAgIHBhZ2VJbmRleENhY2hlID0gdGhpcy5wYWdlSW5kZXhDYWNoZTsKICAgIGxldCBjdXJyZW50UGFnZUluZGV4ID0gMDsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Zpc2l0LnBvcCgpOwogICAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICBjb25zdCBjb3VudCA9IHBhZ2VLaWRzQ291bnRDYWNoZS5nZXQoY3VycmVudE5vZGUpOwogICAgICAgIGlmIChjb3VudCA+PSAwICYmIGN1cnJlbnRQYWdlSW5kZXggKyBjb3VudCA8PSBwYWdlSW5kZXgpIHsKICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXggKz0gY291bnQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICBjb25zdCBvYmogPSBhd2FpdCB4cmVmLmZldGNoQXN5bmMoY3VycmVudE5vZGUpOwogICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICBsZXQgdHlwZSA9IG9iai5nZXRSYXcoIlR5cGUiKTsKICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkodHlwZSwgIlBhZ2UiKSB8fCAhb2JqLmhhcygiS2lkcyIpKSB7CiAgICAgICAgICAgIGlmICghcGFnZUtpZHNDb3VudENhY2hlLmhhcyhjdXJyZW50Tm9kZSkpIHsKICAgICAgICAgICAgICBwYWdlS2lkc0NvdW50Q2FjaGUucHV0KGN1cnJlbnROb2RlLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXBhZ2VJbmRleENhY2hlLmhhcyhjdXJyZW50Tm9kZSkpIHsKICAgICAgICAgICAgICBwYWdlSW5kZXhDYWNoZS5wdXQoY3VycmVudE5vZGUsIGN1cnJlbnRQYWdlSW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlSW5kZXgpIHsKICAgICAgICAgICAgICByZXR1cm4gW29iaiwgY3VycmVudE5vZGVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnRQYWdlSW5kZXgrKzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKG9iaik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZCByZWZlcmVuY2UgcG9pbnRzIHRvIHdyb25nIHR5cGUgb2Ygb2JqZWN0LiIpOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBvYmpJZAogICAgICB9ID0gY3VycmVudE5vZGU7CiAgICAgIGxldCBjb3VudCA9IGN1cnJlbnROb2RlLmdldFJhdygiQ291bnQiKTsKICAgICAgaWYgKGNvdW50IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgY291bnQgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmMoY291bnQpOwogICAgICB9CiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSAmJiBjb3VudCA+PSAwKSB7CiAgICAgICAgaWYgKG9iaklkICYmICFwYWdlS2lkc0NvdW50Q2FjaGUuaGFzKG9iaklkKSkgewogICAgICAgICAgcGFnZUtpZHNDb3VudENhY2hlLnB1dChvYmpJZCwgY291bnQpOwogICAgICAgIH0KICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCArIGNvdW50IDw9IHBhZ2VJbmRleCkgewogICAgICAgICAgY3VycmVudFBhZ2VJbmRleCArPSBjb3VudDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBsZXQga2lkcyA9IGN1cnJlbnROb2RlLmdldFJhdygiS2lkcyIpOwogICAgICBpZiAoa2lkcyBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgIGtpZHMgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmMoa2lkcyk7CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgbGV0IHR5cGUgPSBjdXJyZW50Tm9kZS5nZXRSYXcoIlR5cGUiKTsKICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgICAgdHlwZSA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyh0eXBlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUsICJQYWdlIikgfHwgIWN1cnJlbnROb2RlLmhhcygiS2lkcyIpKSB7CiAgICAgICAgICBpZiAoY3VycmVudFBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiBbY3VycmVudE5vZGUsIG51bGxdOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudFBhZ2VJbmRleCsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKTsKICAgICAgfQogICAgICBmb3IgKGxldCBsYXN0ID0ga2lkcy5sZW5ndGggLSAxOyBsYXN0ID49IDA7IGxhc3QtLSkgewogICAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKGtpZHNbbGFzdF0pOwogICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhZ2UgaW5kZXggJHtwYWdlSW5kZXh9IG5vdCBmb3VuZC5gKTsKICB9CiAgYXN5bmMgZ2V0QWxsUGFnZURpY3RzKHJlY292ZXJ5TW9kZSA9IGZhbHNlKSB7CiAgICBjb25zdCB7CiAgICAgIGlnbm9yZUVycm9ycwogICAgfSA9IHRoaXMucGRmTWFuYWdlci5ldmFsdWF0b3JPcHRpb25zOwogICAgY29uc3QgcXVldWUgPSBbewogICAgICBjdXJyZW50Tm9kZTogdGhpcy50b3BsZXZlbFBhZ2VzRGljdCwKICAgICAgcG9zSW5LaWRzOiAwCiAgICB9XTsKICAgIGNvbnN0IHZpc2l0ZWROb2RlcyA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKICAgIGNvbnN0IHBhZ2VzUmVmID0gdGhpcy5fY2F0RGljdC5nZXRSYXcoIlBhZ2VzIik7CiAgICBpZiAocGFnZXNSZWYgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgdmlzaXRlZE5vZGVzLnB1dChwYWdlc1JlZik7CiAgICB9CiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCksCiAgICAgIHhyZWYgPSB0aGlzLnhyZWYsCiAgICAgIHBhZ2VJbmRleENhY2hlID0gdGhpcy5wYWdlSW5kZXhDYWNoZTsKICAgIGxldCBwYWdlSW5kZXggPSAwOwogICAgZnVuY3Rpb24gYWRkUGFnZURpY3QocGFnZURpY3QsIHBhZ2VSZWYpIHsKICAgICAgaWYgKHBhZ2VSZWYgJiYgIXBhZ2VJbmRleENhY2hlLmhhcyhwYWdlUmVmKSkgewogICAgICAgIHBhZ2VJbmRleENhY2hlLnB1dChwYWdlUmVmLCBwYWdlSW5kZXgpOwogICAgICB9CiAgICAgIG1hcC5zZXQocGFnZUluZGV4KyssIFtwYWdlRGljdCwgcGFnZVJlZl0pOwogICAgfQogICAgZnVuY3Rpb24gYWRkUGFnZUVycm9yKGVycm9yKSB7CiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLlhSZWZFbnRyeUV4Y2VwdGlvbiAmJiAhcmVjb3ZlcnlNb2RlKSB7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgICAgaWYgKHJlY292ZXJ5TW9kZSAmJiBpZ25vcmVFcnJvcnMgJiYgcGFnZUluZGV4ID09PSAwKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRBbGxQYWdlRGljdHMgLSBTa2lwcGluZyBpbnZhbGlkIGZpcnN0IHBhZ2U6ICIke2Vycm9yfSIuYCk7CiAgICAgICAgZXJyb3IgPSBfcHJpbWl0aXZlcy5EaWN0LmVtcHR5OwogICAgICB9CiAgICAgIG1hcC5zZXQocGFnZUluZGV4KyssIFtlcnJvciwgbnVsbF0pOwogICAgfQogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3QgcXVldWVJdGVtID0gcXVldWUuYXQoLTEpOwogICAgICBjb25zdCB7CiAgICAgICAgY3VycmVudE5vZGUsCiAgICAgICAgcG9zSW5LaWRzCiAgICAgIH0gPSBxdWV1ZUl0ZW07CiAgICAgIGxldCBraWRzID0gY3VycmVudE5vZGUuZ2V0UmF3KCJLaWRzIik7CiAgICAgIGlmIChraWRzIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGtpZHMgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmMoa2lkcyk7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgYWRkUGFnZUVycm9yKG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFnZSBkaWN0aW9uYXJ5IGtpZHMgb2JqZWN0IGlzIG5vdCBhbiBhcnJheS4iKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHBvc0luS2lkcyA+PSBraWRzLmxlbmd0aCkgewogICAgICAgIHF1ZXVlLnBvcCgpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGtpZE9iaiA9IGtpZHNbcG9zSW5LaWRzXTsKICAgICAgbGV0IG9iajsKICAgICAgaWYgKGtpZE9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgIGlmICh2aXNpdGVkTm9kZXMuaGFzKGtpZE9iaikpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2VzIHRyZWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlLiIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkTm9kZXMucHV0KGtpZE9iaik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIG9iaiA9IGF3YWl0IHhyZWYuZmV0Y2hBc3luYyhraWRPYmopOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICBhZGRQYWdlRXJyb3IoZXgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG9iaiA9IGtpZE9iajsKICAgICAgfQogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIGFkZFBhZ2VFcnJvcihuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIlBhZ2UgZGljdGlvbmFyeSBraWQgcmVmZXJlbmNlIHBvaW50cyB0byB3cm9uZyB0eXBlIG9mIG9iamVjdC4iKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbGV0IHR5cGUgPSBvYmouZ2V0UmF3KCJUeXBlIik7CiAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHR5cGUgPSBhd2FpdCB4cmVmLmZldGNoQXN5bmModHlwZSk7CiAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgIGFkZFBhZ2VFcnJvcihleCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHR5cGUsICJQYWdlIikgfHwgIW9iai5oYXMoIktpZHMiKSkgewogICAgICAgIGFkZFBhZ2VEaWN0KG9iaiwga2lkT2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmID8ga2lkT2JqIDogbnVsbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcXVldWUucHVzaCh7CiAgICAgICAgICBjdXJyZW50Tm9kZTogb2JqLAogICAgICAgICAgcG9zSW5LaWRzOiAwCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcXVldWVJdGVtLnBvc0luS2lkcysrOwogICAgfQogICAgcmV0dXJuIG1hcDsKICB9CiAgZ2V0UGFnZUluZGV4KHBhZ2VSZWYpIHsKICAgIGNvbnN0IGNhY2hlZFBhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4Q2FjaGUuZ2V0KHBhZ2VSZWYpOwogICAgaWYgKGNhY2hlZFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2FjaGVkUGFnZUluZGV4KTsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBmdW5jdGlvbiBwYWdlc0JlZm9yZVJlZihraWRSZWYpIHsKICAgICAgbGV0IHRvdGFsID0gMCwKICAgICAgICBwYXJlbnRSZWY7CiAgICAgIHJldHVybiB4cmVmLmZldGNoQXN5bmMoa2lkUmVmKS50aGVuKGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc1JlZnNFcXVhbCkoa2lkUmVmLCBwYWdlUmVmKSAmJiAhKDAsIF9wcmltaXRpdmVzLmlzRGljdCkobm9kZSwgIlBhZ2UiKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ICYmICFub2RlLmhhcygiVHlwZSIpICYmIG5vZGUuaGFzKCJDb250ZW50cyIpKSkgewogICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJUaGUgcmVmZXJlbmNlIGRvZXMgbm90IHBvaW50IHRvIGEgL1BhZ2UgZGljdGlvbmFyeS4iKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIk5vZGUgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgICAgfQogICAgICAgIHBhcmVudFJlZiA9IG5vZGUuZ2V0UmF3KCJQYXJlbnQiKTsKICAgICAgICByZXR1cm4gbm9kZS5nZXRBc3luYygiUGFyZW50Iik7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHBhcmVudCkgewogICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiUGFyZW50IG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50LmdldEFzeW5jKCJLaWRzIik7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGtpZHMpIHsKICAgICAgICBpZiAoIWtpZHMpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBraWRQcm9taXNlcyA9IFtdOwogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICAgIGlmICghKGtpZCBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJLaWQgbXVzdCBiZSBhIHJlZmVyZW5jZS4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgoMCwgX3ByaW1pdGl2ZXMuaXNSZWZzRXF1YWwpKGtpZCwga2lkUmVmKSkgewogICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAga2lkUHJvbWlzZXMucHVzaCh4cmVmLmZldGNoQXN5bmMoa2lkKS50aGVuKGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIktpZCBub2RlIG11c3QgYmUgYSBkaWN0aW9uYXJ5LiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmouaGFzKCJDb3VudCIpKSB7CiAgICAgICAgICAgICAgdG90YWwgKz0gb2JqLmdldCgiQ291bnQiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0b3RhbCsrOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiS2lkIHJlZmVyZW5jZSBub3QgZm91bmQgaW4gcGFyZW50J3Mga2lkcy4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGtpZFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBbdG90YWwsIHBhcmVudFJlZl07CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQogICAgbGV0IHRvdGFsID0gMDsKICAgIGNvbnN0IG5leHQgPSByZWYgPT4gcGFnZXNCZWZvcmVSZWYocmVmKS50aGVuKGFyZ3MgPT4gewogICAgICBpZiAoIWFyZ3MpIHsKICAgICAgICB0aGlzLnBhZ2VJbmRleENhY2hlLnB1dChwYWdlUmVmLCB0b3RhbCk7CiAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgICB9CiAgICAgIGNvbnN0IFtjb3VudCwgcGFyZW50UmVmXSA9IGFyZ3M7CiAgICAgIHRvdGFsICs9IGNvdW50OwogICAgICByZXR1cm4gbmV4dChwYXJlbnRSZWYpOwogICAgfSk7CiAgICByZXR1cm4gbmV4dChwYWdlUmVmKTsKICB9CiAgZ2V0IGJhc2VVcmwoKSB7CiAgICBjb25zdCB1cmkgPSB0aGlzLl9jYXREaWN0LmdldCgiVVJJIik7CiAgICBpZiAodXJpIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBjb25zdCBiYXNlID0gdXJpLmdldCgiQmFzZSIpOwogICAgICBpZiAodHlwZW9mIGJhc2UgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgYWJzb2x1dGVVcmwgPSAoMCwgX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkoYmFzZSwgbnVsbCwgewogICAgICAgICAgdHJ5Q29udmVydEVuY29kaW5nOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgaWYgKGFic29sdXRlVXJsKSB7CiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgImJhc2VVcmwiLCBhYnNvbHV0ZVVybC5ocmVmKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAiYmFzZVVybCIsIG51bGwpOwogIH0KICBzdGF0aWMgcGFyc2VEZXN0RGljdGlvbmFyeShwYXJhbXMpIHsKICAgIGNvbnN0IGRlc3REaWN0ID0gcGFyYW1zLmRlc3REaWN0OwogICAgaWYgKCEoZGVzdERpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAoMCwgX3V0aWwud2FybikoInBhcnNlRGVzdERpY3Rpb25hcnk6IGBkZXN0RGljdGAgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJlc3VsdE9iaiA9IHBhcmFtcy5yZXN1bHRPYmo7CiAgICBpZiAodHlwZW9mIHJlc3VsdE9iaiAhPT0gIm9iamVjdCIpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBgcmVzdWx0T2JqYCBtdXN0IGJlIGFuIG9iamVjdC4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZG9jQmFzZVVybCA9IHBhcmFtcy5kb2NCYXNlVXJsIHx8IG51bGw7CiAgICBjb25zdCBkb2NBdHRhY2htZW50cyA9IHBhcmFtcy5kb2NBdHRhY2htZW50cyB8fCBudWxsOwogICAgbGV0IGFjdGlvbiA9IGRlc3REaWN0LmdldCgiQSIpLAogICAgICB1cmwsCiAgICAgIGRlc3Q7CiAgICBpZiAoIShhY3Rpb24gaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICBpZiAoZGVzdERpY3QuaGFzKCJEZXN0IikpIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3Rpb24gPSBkZXN0RGljdC5nZXQoIkFBIik7CiAgICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgICAgIGlmIChhY3Rpb24uaGFzKCJEIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiRCIpOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaGFzKCJVIikpIHsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uLmdldCgiVSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgY29uc3QgYWN0aW9uVHlwZSA9IGFjdGlvbi5nZXQoIlMiKTsKICAgICAgaWYgKCEoYWN0aW9uVHlwZSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpKSB7CiAgICAgICAgKDAsIF91dGlsLndhcm4pKCJwYXJzZURlc3REaWN0aW9uYXJ5OiBJbnZhbGlkIHR5cGUgaW4gQWN0aW9uIGRpY3Rpb25hcnkuIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb25UeXBlLm5hbWU7CiAgICAgIHN3aXRjaCAoYWN0aW9uTmFtZSkgewogICAgICAgIGNhc2UgIlJlc2V0Rm9ybSI6CiAgICAgICAgICBjb25zdCBmbGFncyA9IGFjdGlvbi5nZXQoIkZsYWdzIik7CiAgICAgICAgICBjb25zdCBpbmNsdWRlID0gKCh0eXBlb2YgZmxhZ3MgPT09ICJudW1iZXIiID8gZmxhZ3MgOiAwKSAmIDEpID09PSAwOwogICAgICAgICAgY29uc3QgZmllbGRzID0gW107CiAgICAgICAgICBjb25zdCByZWZzID0gW107CiAgICAgICAgICBmb3IgKGNvbnN0IG9iaiBvZiBhY3Rpb24uZ2V0KCJGaWVsZHMiKSB8fCBbXSkgewogICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICAgICAgcmVmcy5wdXNoKG9iai50b1N0cmluZygpKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIGZpZWxkcy5wdXNoKCgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykob2JqKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdE9iai5yZXNldEZvcm0gPSB7CiAgICAgICAgICAgIGZpZWxkcywKICAgICAgICAgICAgcmVmcywKICAgICAgICAgICAgaW5jbHVkZQogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlVSSSI6CiAgICAgICAgICB1cmwgPSBhY3Rpb24uZ2V0KCJVUkkiKTsKICAgICAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgICAgIHVybCA9ICIvIiArIHVybC5uYW1lOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiR29UbyI6CiAgICAgICAgICBkZXN0ID0gYWN0aW9uLmdldCgiRCIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiTGF1bmNoIjoKICAgICAgICBjYXNlICJHb1RvUiI6CiAgICAgICAgICBjb25zdCB1cmxEaWN0ID0gYWN0aW9uLmdldCgiRiIpOwogICAgICAgICAgaWYgKHVybERpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICAgIHVybCA9IHVybERpY3QuZ2V0KCJGIikgfHwgbnVsbDsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVybERpY3QgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIHVybCA9IHVybERpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgcmVtb3RlRGVzdCA9IGFjdGlvbi5nZXQoIkQiKTsKICAgICAgICAgIGlmIChyZW1vdGVEZXN0KSB7CiAgICAgICAgICAgIGlmIChyZW1vdGVEZXN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICAgIHJlbW90ZURlc3QgPSByZW1vdGVEZXN0Lm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHVybC5zcGxpdCgiIyIpWzBdOwogICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVtb3RlRGVzdCA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIHVybCA9IGJhc2VVcmwgKyAiIyIgKyByZW1vdGVEZXN0OwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZW1vdGVEZXN0KSkgewogICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArICIjIiArIEpTT04uc3RyaW5naWZ5KHJlbW90ZURlc3QpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY29uc3QgbmV3V2luZG93ID0gYWN0aW9uLmdldCgiTmV3V2luZG93Iik7CiAgICAgICAgICBpZiAodHlwZW9mIG5ld1dpbmRvdyA9PT0gImJvb2xlYW4iKSB7CiAgICAgICAgICAgIHJlc3VsdE9iai5uZXdXaW5kb3cgPSBuZXdXaW5kb3c7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJHb1RvRSI6CiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhY3Rpb24uZ2V0KCJUIik7CiAgICAgICAgICBsZXQgYXR0YWNobWVudDsKICAgICAgICAgIGlmIChkb2NBdHRhY2htZW50cyAmJiB0YXJnZXQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHRhcmdldC5nZXQoIlIiKTsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRhcmdldC5nZXQoIk4iKTsKICAgICAgICAgICAgaWYgKCgwLCBfcHJpbWl0aXZlcy5pc05hbWUpKHJlbGF0aW9uc2hpcCwgIkMiKSAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICBhdHRhY2htZW50ID0gZG9jQXR0YWNobWVudHNbKDAsIF91dGlsLnN0cmluZ1RvUERGU3RyaW5nKShuYW1lKV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChhdHRhY2htZW50KSB7CiAgICAgICAgICAgIHJlc3VsdE9iai5hdHRhY2htZW50ID0gYXR0YWNobWVudDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgcGFyc2VEZXN0RGljdGlvbmFyeSAtIHVuaW1wbGVtZW50ZWQgIkdvVG9FIiBhY3Rpb24uYCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJOYW1lZCI6CiAgICAgICAgICBjb25zdCBuYW1lZEFjdGlvbiA9IGFjdGlvbi5nZXQoIk4iKTsKICAgICAgICAgIGlmIChuYW1lZEFjdGlvbiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUpIHsKICAgICAgICAgICAgcmVzdWx0T2JqLmFjdGlvbiA9IG5hbWVkQWN0aW9uLm5hbWU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJTZXRPQ0dTdGF0ZSI6CiAgICAgICAgICBjb25zdCBzdGF0ZSA9IGFjdGlvbi5nZXQoIlN0YXRlIik7CiAgICAgICAgICBjb25zdCBwcmVzZXJ2ZVJCID0gYWN0aW9uLmdldCgiUHJlc2VydmVSQiIpOwogICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0YXRlKSB8fCBzdGF0ZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzdGF0ZUFyciA9IFtdOwogICAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkgewogICAgICAgICAgICAgIHN3aXRjaCAoZWxlbS5uYW1lKSB7CiAgICAgICAgICAgICAgICBjYXNlICJPTiI6CiAgICAgICAgICAgICAgICBjYXNlICJPRkYiOgogICAgICAgICAgICAgICAgY2FzZSAiVG9nZ2xlIjoKICAgICAgICAgICAgICAgICAgc3RhdGVBcnIucHVzaChlbGVtLm5hbWUpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgICAgICAgIHN0YXRlQXJyLnB1c2goZWxlbS50b1N0cmluZygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlQXJyLmxlbmd0aCAhPT0gc3RhdGUubGVuZ3RoKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0T2JqLnNldE9DR1N0YXRlID0gewogICAgICAgICAgICBzdGF0ZTogc3RhdGVBcnIsCiAgICAgICAgICAgIHByZXNlcnZlUkI6IHR5cGVvZiBwcmVzZXJ2ZVJCID09PSAiYm9vbGVhbiIgPyBwcmVzZXJ2ZVJCIDogdHJ1ZQogICAgICAgICAgfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIkphdmFTY3JpcHQiOgogICAgICAgICAgY29uc3QganNBY3Rpb24gPSBhY3Rpb24uZ2V0KCJKUyIpOwogICAgICAgICAgbGV0IGpzOwogICAgICAgICAgaWYgKGpzQWN0aW9uIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgICAgICAganMgPSBqc0FjdGlvbi5nZXRTdHJpbmcoKTsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGpzQWN0aW9uID09PSAic3RyaW5nIikgewogICAgICAgICAgICBqcyA9IGpzQWN0aW9uOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QganNVUkwgPSBqcyAmJiAoMCwgX2NvcmVfdXRpbHMucmVjb3ZlckpzVVJMKSgoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGpzKSk7CiAgICAgICAgICBpZiAoanNVUkwpIHsKICAgICAgICAgICAgdXJsID0ganNVUkwudXJsOwogICAgICAgICAgICByZXN1bHRPYmoubmV3V2luZG93ID0ganNVUkwubmV3V2luZG93OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKGFjdGlvbk5hbWUgPT09ICJKYXZhU2NyaXB0IiB8fCBhY3Rpb25OYW1lID09PSAiU3VibWl0Rm9ybSIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYHBhcnNlRGVzdERpY3Rpb25hcnkgLSB1bnN1cHBvcnRlZCBhY3Rpb246ICIke2FjdGlvbk5hbWV9Ii5gKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGRlc3REaWN0LmhhcygiRGVzdCIpKSB7CiAgICAgIGRlc3QgPSBkZXN0RGljdC5nZXQoIkRlc3QiKTsKICAgIH0KICAgIGlmICh0eXBlb2YgdXJsID09PSAic3RyaW5nIikgewogICAgICBjb25zdCBhYnNvbHV0ZVVybCA9ICgwLCBfdXRpbC5jcmVhdGVWYWxpZEFic29sdXRlVXJsKSh1cmwsIGRvY0Jhc2VVcmwsIHsKICAgICAgICBhZGREZWZhdWx0UHJvdG9jb2w6IHRydWUsCiAgICAgICAgdHJ5Q29udmVydEVuY29kaW5nOiB0cnVlCiAgICAgIH0pOwogICAgICBpZiAoYWJzb2x1dGVVcmwpIHsKICAgICAgICByZXN1bHRPYmoudXJsID0gYWJzb2x1dGVVcmwuaHJlZjsKICAgICAgfQogICAgICByZXN1bHRPYmoudW5zYWZlVXJsID0gdXJsOwogICAgfQogICAgaWYgKGRlc3QpIHsKICAgICAgaWYgKGRlc3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5OYW1lKSB7CiAgICAgICAgZGVzdCA9IGRlc3QubmFtZTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGRlc3QgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmVzdWx0T2JqLmRlc3QgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGRlc3QpOwogICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGVzdCkpIHsKICAgICAgICByZXN1bHRPYmouZGVzdCA9IGRlc3Q7CiAgICAgIH0KICAgIH0KICB9Cn0KZXhwb3J0cy5DYXRhbG9nID0gQ2F0YWxvZzsKCi8qKiovIH0pLAovKiA3MSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLk51bWJlclRyZWUgPSBleHBvcnRzLk5hbWVUcmVlID0gdm9pZCAwOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpjbGFzcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmLCB0eXBlKSB7CiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gTmFtZU9yTnVtYmVyVHJlZSkgewogICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCJDYW5ub3QgaW5pdGlhbGl6ZSBOYW1lT3JOdW1iZXJUcmVlLiIpOwogICAgfQogICAgdGhpcy5yb290ID0gcm9vdDsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLl90eXBlID0gdHlwZTsKICB9CiAgZ2V0QWxsKCkgewogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgaWYgKCF0aGlzLnJvb3QpIHsKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KICAgIGNvbnN0IHhyZWYgPSB0aGlzLnhyZWY7CiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CiAgICBwcm9jZXNzZWQucHV0KHRoaXMucm9vdCk7CiAgICBjb25zdCBxdWV1ZSA9IFt0aGlzLnJvb3RdOwogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHsKICAgICAgY29uc3Qgb2JqID0geHJlZi5mZXRjaElmUmVmKHF1ZXVlLnNoaWZ0KCkpOwogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChvYmouaGFzKCJLaWRzIikpIHsKICAgICAgICBjb25zdCBraWRzID0gb2JqLmdldCgiS2lkcyIpOwogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShraWRzKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3Qga2lkIG9mIGtpZHMpIHsKICAgICAgICAgIGlmIChwcm9jZXNzZWQuaGFzKGtpZCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBEdXBsaWNhdGUgZW50cnkgaW4gIiR7dGhpcy5fdHlwZX0iIHRyZWUuYCk7CiAgICAgICAgICB9CiAgICAgICAgICBxdWV1ZS5wdXNoKGtpZCk7CiAgICAgICAgICBwcm9jZXNzZWQucHV0KGtpZCk7CiAgICAgICAgfQogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGVudHJpZXMgPSBvYmouZ2V0KHRoaXMuX3R5cGUpOwogICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cmllcykpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBlbnRyaWVzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHsKICAgICAgICBtYXAuc2V0KHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW2ldKSwgeHJlZi5mZXRjaElmUmVmKGVudHJpZXNbaSArIDFdKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXA7CiAgfQogIGdldChrZXkpIHsKICAgIGlmICghdGhpcy5yb290KSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgeHJlZiA9IHRoaXMueHJlZjsKICAgIGxldCBraWRzT3JFbnRyaWVzID0geHJlZi5mZXRjaElmUmVmKHRoaXMucm9vdCk7CiAgICBsZXQgbG9vcENvdW50ID0gMDsKICAgIGNvbnN0IE1BWF9MRVZFTFMgPSAxMDsKICAgIHdoaWxlIChraWRzT3JFbnRyaWVzLmhhcygiS2lkcyIpKSB7CiAgICAgIGlmICgrK2xvb3BDb3VudCA+IE1BWF9MRVZFTFMpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYFNlYXJjaCBkZXB0aCBsaW1pdCByZWFjaGVkIGZvciAiJHt0aGlzLl90eXBlfSIgdHJlZS5gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBraWRzID0ga2lkc09yRW50cmllcy5nZXQoIktpZHMiKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGtpZHMpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgbGV0IGwgPSAwLAogICAgICAgIHIgPSBraWRzLmxlbmd0aCAtIDE7CiAgICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICBjb25zdCBtID0gbCArIHIgPj4gMTsKICAgICAgICBjb25zdCBraWQgPSB4cmVmLmZldGNoSWZSZWYoa2lkc1ttXSk7CiAgICAgICAgY29uc3QgbGltaXRzID0ga2lkLmdldCgiTGltaXRzIik7CiAgICAgICAgaWYgKGtleSA8IHhyZWYuZmV0Y2hJZlJlZihsaW1pdHNbMF0pKSB7CiAgICAgICAgICByID0gbSAtIDE7CiAgICAgICAgfSBlbHNlIGlmIChrZXkgPiB4cmVmLmZldGNoSWZSZWYobGltaXRzWzFdKSkgewogICAgICAgICAgbCA9IG0gKyAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBraWRzT3JFbnRyaWVzID0ga2lkOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChsID4gcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBjb25zdCBlbnRyaWVzID0ga2lkc09yRW50cmllcy5nZXQodGhpcy5fdHlwZSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkgewogICAgICBsZXQgbCA9IDAsCiAgICAgICAgciA9IGVudHJpZXMubGVuZ3RoIC0gMjsKICAgICAgd2hpbGUgKGwgPD0gcikgewogICAgICAgIGNvbnN0IHRtcCA9IGwgKyByID4+IDEsCiAgICAgICAgICBtID0gdG1wICsgKHRtcCAmIDEpOwogICAgICAgIGNvbnN0IGN1cnJlbnRLZXkgPSB4cmVmLmZldGNoSWZSZWYoZW50cmllc1ttXSk7CiAgICAgICAgaWYgKGtleSA8IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIHIgPSBtIC0gMjsKICAgICAgICB9IGVsc2UgaWYgKGtleSA+IGN1cnJlbnRLZXkpIHsKICAgICAgICAgIGwgPSBtICsgMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHhyZWYuZmV0Y2hJZlJlZihlbnRyaWVzW20gKyAxXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Cn0KY2xhc3MgTmFtZVRyZWUgZXh0ZW5kcyBOYW1lT3JOdW1iZXJUcmVlIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CiAgICBzdXBlcihyb290LCB4cmVmLCAiTmFtZXMiKTsKICB9Cn0KZXhwb3J0cy5OYW1lVHJlZSA9IE5hbWVUcmVlOwpjbGFzcyBOdW1iZXJUcmVlIGV4dGVuZHMgTmFtZU9yTnVtYmVyVHJlZSB7CiAgY29uc3RydWN0b3Iocm9vdCwgeHJlZikgewogICAgc3VwZXIocm9vdCwgeHJlZiwgIk51bXMiKTsKICB9Cn0KZXhwb3J0cy5OdW1iZXJUcmVlID0gTnVtYmVyVHJlZTsKCi8qKiovIH0pLAovKiA3MiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLmNsZWFyR2xvYmFsQ2FjaGVzID0gY2xlYXJHbG9iYWxDYWNoZXM7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfdW5pY29kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNDApOwpmdW5jdGlvbiBjbGVhckdsb2JhbENhY2hlcygpIHsKICAoMCwgX3ByaW1pdGl2ZXMuY2xlYXJQcmltaXRpdmVDYWNoZXMpKCk7CiAgKDAsIF91bmljb2RlLmNsZWFyVW5pY29kZUNhY2hlcykoKTsKfQoKLyoqKi8gfSksCi8qIDczICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuRmlsZVNwZWMgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfYmFzZV9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwpmdW5jdGlvbiBwaWNrUGxhdGZvcm1JdGVtKGRpY3QpIHsKICBpZiAoZGljdC5oYXMoIlVGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiVUYiKTsKICB9IGVsc2UgaWYgKGRpY3QuaGFzKCJGIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRiIpOwogIH0gZWxzZSBpZiAoZGljdC5oYXMoIlVuaXgiKSkgewogICAgcmV0dXJuIGRpY3QuZ2V0KCJVbml4Iik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiTWFjIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiTWFjIik7CiAgfSBlbHNlIGlmIChkaWN0LmhhcygiRE9TIikpIHsKICAgIHJldHVybiBkaWN0LmdldCgiRE9TIik7CiAgfQogIHJldHVybiBudWxsOwp9CmNsYXNzIEZpbGVTcGVjIHsKICBjb25zdHJ1Y3Rvcihyb290LCB4cmVmKSB7CiAgICBpZiAoIShyb290IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy54cmVmID0geHJlZjsKICAgIHRoaXMucm9vdCA9IHJvb3Q7CiAgICBpZiAocm9vdC5oYXMoIkZTIikpIHsKICAgICAgdGhpcy5mcyA9IHJvb3QuZ2V0KCJGUyIpOwogICAgfQogICAgdGhpcy5kZXNjcmlwdGlvbiA9IHJvb3QuaGFzKCJEZXNjIikgPyAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKHJvb3QuZ2V0KCJEZXNjIikpIDogIiI7CiAgICBpZiAocm9vdC5oYXMoIlJGIikpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJSZWxhdGVkIGZpbGUgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgIH0KICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IHRydWU7CiAgICBpZiAoIXJvb3QuaGFzKCJFRiIpKSB7CiAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAoMCwgX3V0aWwud2FybikoIk5vbi1lbWJlZGRlZCBmaWxlIHNwZWNpZmljYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICB9CiAgfQogIGdldCBmaWxlbmFtZSgpIHsKICAgIGlmICghdGhpcy5fZmlsZW5hbWUgJiYgdGhpcy5yb290KSB7CiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QpIHx8ICJ1bm5hbWVkIjsKICAgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGZpbGVuYW1lKS5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcIikucmVwbGFjZUFsbCgiXFwvIiwgIi8iKS5yZXBsYWNlQWxsKCJcXCIsICIvIik7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7CiAgfQogIGdldCBjb250ZW50KCkgewogICAgaWYgKCF0aGlzLmNvbnRlbnRBdmFpbGFibGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIXRoaXMuY29udGVudFJlZiAmJiB0aGlzLnJvb3QpIHsKICAgICAgdGhpcy5jb250ZW50UmVmID0gcGlja1BsYXRmb3JtSXRlbSh0aGlzLnJvb3QuZ2V0KCJFRiIpKTsKICAgIH0KICAgIGxldCBjb250ZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLmNvbnRlbnRSZWYpIHsKICAgICAgY29uc3QgZmlsZU9iaiA9IHRoaXMueHJlZi5mZXRjaElmUmVmKHRoaXMuY29udGVudFJlZik7CiAgICAgIGlmIChmaWxlT2JqIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgICAgICBjb250ZW50ID0gZmlsZU9iai5nZXRCeXRlcygpOwogICAgICB9IGVsc2UgewogICAgICAgICgwLCBfdXRpbC53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIHBvaW50cyB0byBub24tZXhpc3RpbmcvaW52YWxpZCBjb250ZW50Iik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICgwLCBfdXRpbC53YXJuKSgiRW1iZWRkZWQgZmlsZSBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IGhhdmUgYSBjb250ZW50Iik7CiAgICB9CiAgICByZXR1cm4gY29udGVudDsKICB9CiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLAogICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQKICAgIH07CiAgfQp9CmV4cG9ydHMuRmlsZVNwZWMgPSBGaWxlU3BlYzsKCi8qKiovIH0pLAovKiA3NCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLk1ldGFkYXRhUGFyc2VyID0gdm9pZCAwOwp2YXIgX3htbF9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDY3KTsKY2xhc3MgTWV0YWRhdGFQYXJzZXIgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIGRhdGEgPSB0aGlzLl9yZXBhaXIoZGF0YSk7CiAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3htbF9wYXJzZXIuU2ltcGxlWE1MUGFyc2VyKHsKICAgICAgbG93ZXJDYXNlTmFtZTogdHJ1ZQogICAgfSk7CiAgICBjb25zdCB4bWxEb2N1bWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YSk7CiAgICB0aGlzLl9tZXRhZGF0YU1hcCA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX2RhdGEgPSBkYXRhOwogICAgaWYgKHhtbERvY3VtZW50KSB7CiAgICAgIHRoaXMuX3BhcnNlKHhtbERvY3VtZW50KTsKICAgIH0KICB9CiAgX3JlcGFpcihkYXRhKSB7CiAgICByZXR1cm4gZGF0YS5yZXBsYWNlKC9eW148XSsvLCAiIikucmVwbGFjZUFsbCgvPlxcMzc2XFwzNzcoW148XSspL2csIGZ1bmN0aW9uIChhbGwsIGNvZGVzKSB7CiAgICAgIGNvbnN0IGJ5dGVzID0gY29kZXMucmVwbGFjZUFsbCgvXFwoWzAtM10pKFswLTddKShbMC03XSkvZywgZnVuY3Rpb24gKGNvZGUsIGQxLCBkMiwgZDMpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShkMSAqIDY0ICsgZDIgKiA4ICsgZDMgKiAxKTsKICAgICAgfSkucmVwbGFjZUFsbCgvJihhbXB8YXBvc3xndHxsdHxxdW90KTsvZywgZnVuY3Rpb24gKHN0ciwgbmFtZSkgewogICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgY2FzZSAiYW1wIjoKICAgICAgICAgICAgcmV0dXJuICImIjsKICAgICAgICAgIGNhc2UgImFwb3MiOgogICAgICAgICAgICByZXR1cm4gIiciOwogICAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgICByZXR1cm4gIj4iOwogICAgICAgICAgY2FzZSAibHQiOgogICAgICAgICAgICByZXR1cm4gIjwiOwogICAgICAgICAgY2FzZSAicXVvdCI6CiAgICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgX3JlcGFpcjogJHtuYW1lfSBpc24ndCBkZWZpbmVkLmApOwogICAgICB9KTsKICAgICAgY29uc3QgY2hhckJ1ZiA9IFsiPiJdOwogICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7CiAgICAgICAgY29uc3QgY29kZSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSkgKiAyNTYgKyBieXRlcy5jaGFyQ29kZUF0KGkgKyAxKTsKICAgICAgICBpZiAoY29kZSA+PSAzMiAmJiBjb2RlIDwgMTI3ICYmIGNvZGUgIT09IDYwICYmIGNvZGUgIT09IDYyICYmIGNvZGUgIT09IDM4KSB7CiAgICAgICAgICBjaGFyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoYXJCdWYucHVzaCgiJiN4IiArICgweDEwMDAwICsgY29kZSkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKSArICI7Iik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjaGFyQnVmLmpvaW4oIiIpOwogICAgfSk7CiAgfQogIF9nZXRTZXF1ZW5jZShlbnRyeSkgewogICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5vZGVOYW1lOwogICAgaWYgKG5hbWUgIT09ICJyZGY6YmFnIiAmJiBuYW1lICE9PSAicmRmOnNlcSIgJiYgbmFtZSAhPT0gInJkZjphbHQiKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGVudHJ5LmNoaWxkTm9kZXMuZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlTmFtZSA9PT0gInJkZjpsaSIpOwogIH0KICBfcGFyc2VBcnJheShlbnRyeSkgewogICAgaWYgKCFlbnRyeS5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgW3NlcU5vZGVdID0gZW50cnkuY2hpbGROb2RlczsKICAgIGNvbnN0IHNlcXVlbmNlID0gdGhpcy5fZ2V0U2VxdWVuY2Uoc2VxTm9kZSkgfHwgW107CiAgICB0aGlzLl9tZXRhZGF0YU1hcC5zZXQoZW50cnkubm9kZU5hbWUsIHNlcXVlbmNlLm1hcChub2RlID0+IG5vZGUudGV4dENvbnRlbnQudHJpbSgpKSk7CiAgfQogIF9wYXJzZSh4bWxEb2N1bWVudCkgewogICAgbGV0IHJkZiA9IHhtbERvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgIGlmIChyZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIikgewogICAgICByZGYgPSByZGYuZmlyc3RDaGlsZDsKICAgICAgd2hpbGUgKHJkZiAmJiByZGYubm9kZU5hbWUgIT09ICJyZGY6cmRmIikgewogICAgICAgIHJkZiA9IHJkZi5uZXh0U2libGluZzsKICAgICAgfQogICAgfQogICAgaWYgKCFyZGYgfHwgcmRmLm5vZGVOYW1lICE9PSAicmRmOnJkZiIgfHwgIXJkZi5oYXNDaGlsZE5vZGVzKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBkZXNjIG9mIHJkZi5jaGlsZE5vZGVzKSB7CiAgICAgIGlmIChkZXNjLm5vZGVOYW1lICE9PSAicmRmOmRlc2NyaXB0aW9uIikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGVzYy5jaGlsZE5vZGVzKSB7CiAgICAgICAgY29uc3QgbmFtZSA9IGVudHJ5Lm5vZGVOYW1lOwogICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgY2FzZSAiI3RleHQiOgogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIGNhc2UgImRjOmNyZWF0b3IiOgogICAgICAgICAgY2FzZSAiZGM6c3ViamVjdCI6CiAgICAgICAgICAgIHRoaXMuX3BhcnNlQXJyYXkoZW50cnkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbWV0YWRhdGFNYXAuc2V0KG5hbWUsIGVudHJ5LnRleHRDb250ZW50LnRyaW0oKSk7CiAgICAgIH0KICAgIH0KICB9CiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHsKICAgIHJldHVybiB7CiAgICAgIHBhcnNlZERhdGE6IHRoaXMuX21ldGFkYXRhTWFwLAogICAgICByYXdEYXRhOiB0aGlzLl9kYXRhCiAgICB9OwogIH0KfQpleHBvcnRzLk1ldGFkYXRhUGFyc2VyID0gTWV0YWRhdGFQYXJzZXI7CgovKioqLyB9KSwKLyogNzUgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5TdHJ1Y3RUcmVlUm9vdCA9IGV4cG9ydHMuU3RydWN0VHJlZVBhZ2UgPSB2b2lkIDA7CnZhciBfcHJpbWl0aXZlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfbmFtZV9udW1iZXJfdHJlZSA9IF9fd19wZGZqc19yZXF1aXJlX18oNzEpOwpjb25zdCBNQVhfREVQVEggPSA0MDsKY29uc3QgU3RydWN0RWxlbWVudFR5cGUgPSB7CiAgUEFHRV9DT05URU5UOiAiUEFHRV9DT05URU5UIiwKICBTVFJFQU1fQ09OVEVOVDogIlNUUkVBTV9DT05URU5UIiwKICBPQkpFQ1Q6ICJPQkpFQ1QiLAogIEVMRU1FTlQ6ICJFTEVNRU5UIgp9OwpjbGFzcyBTdHJ1Y3RUcmVlUm9vdCB7CiAgY29uc3RydWN0b3Iocm9vdERpY3QpIHsKICAgIHRoaXMuZGljdCA9IHJvb3REaWN0OwogICAgdGhpcy5yb2xlTWFwID0gbmV3IE1hcCgpOwogIH0KICBpbml0KCkgewogICAgdGhpcy5yZWFkUm9sZU1hcCgpOwogIH0KICByZWFkUm9sZU1hcCgpIHsKICAgIGNvbnN0IHJvbGVNYXBEaWN0ID0gdGhpcy5kaWN0LmdldCgiUm9sZU1hcCIpOwogICAgaWYgKCEocm9sZU1hcERpY3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICByb2xlTWFwRGljdC5mb3JFYWNoKChrZXksIHZhbHVlKSA9PiB7CiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuTmFtZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5yb2xlTWFwLnNldChrZXksIHZhbHVlLm5hbWUpOwogICAgfSk7CiAgfQp9CmV4cG9ydHMuU3RydWN0VHJlZVJvb3QgPSBTdHJ1Y3RUcmVlUm9vdDsKY2xhc3MgU3RydWN0RWxlbWVudE5vZGUgewogIGNvbnN0cnVjdG9yKHRyZWUsIGRpY3QpIHsKICAgIHRoaXMudHJlZSA9IHRyZWU7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5raWRzID0gW107CiAgICB0aGlzLnBhcnNlS2lkcygpOwogIH0KICBnZXQgcm9sZSgpIHsKICAgIGNvbnN0IG5hbWVPYmogPSB0aGlzLmRpY3QuZ2V0KCJTIik7CiAgICBjb25zdCBuYW1lID0gbmFtZU9iaiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUgPyBuYW1lT2JqLm5hbWUgOiAiIjsKICAgIGNvbnN0IHsKICAgICAgcm9vdAogICAgfSA9IHRoaXMudHJlZTsKICAgIGlmIChyb290LnJvbGVNYXAuaGFzKG5hbWUpKSB7CiAgICAgIHJldHVybiByb290LnJvbGVNYXAuZ2V0KG5hbWUpOwogICAgfQogICAgcmV0dXJuIG5hbWU7CiAgfQogIHBhcnNlS2lkcygpIHsKICAgIGxldCBwYWdlT2JqSWQgPSBudWxsOwogICAgY29uc3Qgb2JqUmVmID0gdGhpcy5kaWN0LmdldFJhdygiUGciKTsKICAgIGlmIChvYmpSZWYgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgcGFnZU9iaklkID0gb2JqUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCBraWRzID0gdGhpcy5kaWN0LmdldCgiSyIpOwogICAgaWYgKEFycmF5LmlzQXJyYXkoa2lkcykpIHsKICAgICAgZm9yIChjb25zdCBraWQgb2Yga2lkcykgewogICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkKTsKICAgICAgICBpZiAoZWxlbWVudCkgewogICAgICAgICAgdGhpcy5raWRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wYXJzZUtpZChwYWdlT2JqSWQsIGtpZHMpOwogICAgICBpZiAoZWxlbWVudCkgewogICAgICAgIHRoaXMua2lkcy5wdXNoKGVsZW1lbnQpOwogICAgICB9CiAgICB9CiAgfQogIHBhcnNlS2lkKHBhZ2VPYmpJZCwga2lkKSB7CiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihraWQpKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09IHBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgICAgdHlwZTogU3RydWN0RWxlbWVudFR5cGUuUEFHRV9DT05URU5ULAogICAgICAgIG1jaWQ6IGtpZCwKICAgICAgICBwYWdlT2JqSWQKICAgICAgfSk7CiAgICB9CiAgICBsZXQga2lkRGljdCA9IG51bGw7CiAgICBpZiAoa2lkIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgIGtpZERpY3QgPSB0aGlzLmRpY3QueHJlZi5mZXRjaChraWQpOwogICAgfSBlbHNlIGlmIChraWQgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIGtpZERpY3QgPSBraWQ7CiAgICB9CiAgICBpZiAoIWtpZERpY3QpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjb25zdCBwYWdlUmVmID0ga2lkRGljdC5nZXRSYXcoIlBnIik7CiAgICBpZiAocGFnZVJlZiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICBwYWdlT2JqSWQgPSBwYWdlUmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICBjb25zdCB0eXBlID0ga2lkRGljdC5nZXQoIlR5cGUiKSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLk5hbWUgPyBraWREaWN0LmdldCgiVHlwZSIpLm5hbWUgOiBudWxsOwogICAgaWYgKHR5cGUgPT09ICJNQ1IiKSB7CiAgICAgIGlmICh0aGlzLnRyZWUucGFnZURpY3Qub2JqSWQgIT09IHBhZ2VPYmpJZCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgU3RydWN0RWxlbWVudCh7CiAgICAgICAgdHlwZTogU3RydWN0RWxlbWVudFR5cGUuU1RSRUFNX0NPTlRFTlQsCiAgICAgICAgcmVmT2JqSWQ6IGtpZERpY3QuZ2V0UmF3KCJTdG0iKSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiA/IGtpZERpY3QuZ2V0UmF3KCJTdG0iKS50b1N0cmluZygpIDogbnVsbCwKICAgICAgICBwYWdlT2JqSWQsCiAgICAgICAgbWNpZDoga2lkRGljdC5nZXQoIk1DSUQiKQogICAgICB9KTsKICAgIH0KICAgIGlmICh0eXBlID09PSAiT0JKUiIpIHsKICAgICAgaWYgKHRoaXMudHJlZS5wYWdlRGljdC5vYmpJZCAhPT0gcGFnZU9iaklkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3RFbGVtZW50KHsKICAgICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5PQkpFQ1QsCiAgICAgICAgcmVmT2JqSWQ6IGtpZERpY3QuZ2V0UmF3KCJPYmoiKSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZiA/IGtpZERpY3QuZ2V0UmF3KCJPYmoiKS50b1N0cmluZygpIDogbnVsbCwKICAgICAgICBwYWdlT2JqSWQKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFN0cnVjdEVsZW1lbnQoewogICAgICB0eXBlOiBTdHJ1Y3RFbGVtZW50VHlwZS5FTEVNRU5ULAogICAgICBkaWN0OiBraWREaWN0CiAgICB9KTsKICB9Cn0KY2xhc3MgU3RydWN0RWxlbWVudCB7CiAgY29uc3RydWN0b3IoewogICAgdHlwZSwKICAgIGRpY3QgPSBudWxsLAogICAgbWNpZCA9IG51bGwsCiAgICBwYWdlT2JqSWQgPSBudWxsLAogICAgcmVmT2JqSWQgPSBudWxsCiAgfSkgewogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuZGljdCA9IGRpY3Q7CiAgICB0aGlzLm1jaWQgPSBtY2lkOwogICAgdGhpcy5wYWdlT2JqSWQgPSBwYWdlT2JqSWQ7CiAgICB0aGlzLnJlZk9iaklkID0gcmVmT2JqSWQ7CiAgICB0aGlzLnBhcmVudE5vZGUgPSBudWxsOwogIH0KfQpjbGFzcyBTdHJ1Y3RUcmVlUGFnZSB7CiAgY29uc3RydWN0b3Ioc3RydWN0VHJlZVJvb3QsIHBhZ2VEaWN0KSB7CiAgICB0aGlzLnJvb3QgPSBzdHJ1Y3RUcmVlUm9vdDsKICAgIHRoaXMucm9vdERpY3QgPSBzdHJ1Y3RUcmVlUm9vdCA/IHN0cnVjdFRyZWVSb290LmRpY3QgOiBudWxsOwogICAgdGhpcy5wYWdlRGljdCA9IHBhZ2VEaWN0OwogICAgdGhpcy5ub2RlcyA9IFtdOwogIH0KICBwYXJzZSgpIHsKICAgIGlmICghdGhpcy5yb290IHx8ICF0aGlzLnJvb3REaWN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBhcmVudFRyZWUgPSB0aGlzLnJvb3REaWN0LmdldCgiUGFyZW50VHJlZSIpOwogICAgaWYgKCFwYXJlbnRUcmVlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGlkID0gdGhpcy5wYWdlRGljdC5nZXQoIlN0cnVjdFBhcmVudHMiKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbnVtYmVyVHJlZSA9IG5ldyBfbmFtZV9udW1iZXJfdHJlZS5OdW1iZXJUcmVlKHBhcmVudFRyZWUsIHRoaXMucm9vdERpY3QueHJlZik7CiAgICBjb25zdCBwYXJlbnRBcnJheSA9IG51bWJlclRyZWUuZ2V0KGlkKTsKICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJlbnRBcnJheSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCByZWYgb2YgcGFyZW50QXJyYXkpIHsKICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikgewogICAgICAgIHRoaXMuYWRkTm9kZSh0aGlzLnJvb3REaWN0LnhyZWYuZmV0Y2gocmVmKSwgbWFwKTsKICAgICAgfQogICAgfQogIH0KICBhZGROb2RlKGRpY3QsIG1hcCwgbGV2ZWwgPSAwKSB7CiAgICBpZiAobGV2ZWwgPiBNQVhfREVQVEgpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJTdHJ1Y3RUcmVlIE1BWF9ERVBUSCByZWFjaGVkLiIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChtYXAuaGFzKGRpY3QpKSB7CiAgICAgIHJldHVybiBtYXAuZ2V0KGRpY3QpOwogICAgfQogICAgY29uc3QgZWxlbWVudCA9IG5ldyBTdHJ1Y3RFbGVtZW50Tm9kZSh0aGlzLCBkaWN0KTsKICAgIG1hcC5zZXQoZGljdCwgZWxlbWVudCk7CiAgICBjb25zdCBwYXJlbnQgPSBkaWN0LmdldCgiUCIpOwogICAgaWYgKCFwYXJlbnQgfHwgKDAsIF9wcmltaXRpdmVzLmlzTmFtZSkocGFyZW50LmdldCgiVHlwZSIpLCAiU3RydWN0VHJlZVJvb3QiKSkgewogICAgICBpZiAoIXRoaXMuYWRkVG9wTGV2ZWxOb2RlKGRpY3QsIGVsZW1lbnQpKSB7CiAgICAgICAgbWFwLmRlbGV0ZShkaWN0KTsKICAgICAgfQogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0KICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmFkZE5vZGUocGFyZW50LCBtYXAsIGxldmVsICsgMSk7CiAgICBpZiAoIXBhcmVudE5vZGUpIHsKICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICB9CiAgICBsZXQgc2F2ZSA9IGZhbHNlOwogICAgZm9yIChjb25zdCBraWQgb2YgcGFyZW50Tm9kZS5raWRzKSB7CiAgICAgIGlmIChraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuRUxFTUVOVCAmJiBraWQuZGljdCA9PT0gZGljdCkgewogICAgICAgIGtpZC5wYXJlbnROb2RlID0gZWxlbWVudDsKICAgICAgICBzYXZlID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKCFzYXZlKSB7CiAgICAgIG1hcC5kZWxldGUoZGljdCk7CiAgICB9CiAgICByZXR1cm4gZWxlbWVudDsKICB9CiAgYWRkVG9wTGV2ZWxOb2RlKGRpY3QsIGVsZW1lbnQpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXMucm9vdERpY3QuZ2V0KCJLIik7CiAgICBpZiAoIW9iaikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBpZiAob2JqLm9iaklkICE9PSBkaWN0Lm9iaklkKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHRoaXMubm9kZXNbMF0gPSBlbGVtZW50OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICghQXJyYXkuaXNBcnJheShvYmopKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgbGV0IHNhdmUgPSBmYWxzZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IGtpZFJlZiA9IG9ialtpXTsKICAgICAgaWYgKGtpZFJlZj8udG9TdHJpbmcoKSA9PT0gZGljdC5vYmpJZCkgewogICAgICAgIHRoaXMubm9kZXNbaV0gPSBlbGVtZW50OwogICAgICAgIHNhdmUgPSB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc2F2ZTsKICB9CiAgZ2V0IHNlcmlhbGl6YWJsZSgpIHsKICAgIGZ1bmN0aW9uIG5vZGVUb1NlcmlhbGl6YWJsZShub2RlLCBwYXJlbnQsIGxldmVsID0gMCkgewogICAgICBpZiAobGV2ZWwgPiBNQVhfREVQVEgpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIlN0cnVjdFRyZWUgdG9vIGRlZXAgdG8gYmUgZnVsbHkgc2VyaWFsaXplZC4iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgb2JqLnJvbGUgPSBub2RlLnJvbGU7CiAgICAgIG9iai5jaGlsZHJlbiA9IFtdOwogICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChvYmopOwogICAgICBjb25zdCBhbHQgPSBub2RlLmRpY3QuZ2V0KCJBbHQiKTsKICAgICAgaWYgKHR5cGVvZiBhbHQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgb2JqLmFsdCA9ICgwLCBfdXRpbC5zdHJpbmdUb1BERlN0cmluZykoYWx0KTsKICAgICAgfQogICAgICBjb25zdCBsYW5nID0gbm9kZS5kaWN0LmdldCgiTGFuZyIpOwogICAgICBpZiAodHlwZW9mIGxhbmcgPT09ICJzdHJpbmciKSB7CiAgICAgICAgb2JqLmxhbmcgPSAoMCwgX3V0aWwuc3RyaW5nVG9QREZTdHJpbmcpKGxhbmcpOwogICAgICB9CiAgICAgIGZvciAoY29uc3Qga2lkIG9mIG5vZGUua2lkcykgewogICAgICAgIGNvbnN0IGtpZEVsZW1lbnQgPSBraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuRUxFTUVOVCA/IGtpZC5wYXJlbnROb2RlIDogbnVsbDsKICAgICAgICBpZiAoa2lkRWxlbWVudCkgewogICAgICAgICAgbm9kZVRvU2VyaWFsaXphYmxlKGtpZEVsZW1lbnQsIG9iaiwgbGV2ZWwgKyAxKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gZWxzZSBpZiAoa2lkLnR5cGUgPT09IFN0cnVjdEVsZW1lbnRUeXBlLlBBR0VfQ09OVEVOVCB8fCBraWQudHlwZSA9PT0gU3RydWN0RWxlbWVudFR5cGUuU1RSRUFNX0NPTlRFTlQpIHsKICAgICAgICAgIG9iai5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogImNvbnRlbnQiLAogICAgICAgICAgICBpZDogYHAke2tpZC5wYWdlT2JqSWR9X21jJHtraWQubWNpZH1gCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGtpZC50eXBlID09PSBTdHJ1Y3RFbGVtZW50VHlwZS5PQkpFQ1QpIHsKICAgICAgICAgIG9iai5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgdHlwZTogIm9iamVjdCIsCiAgICAgICAgICAgIGlkOiBraWQucmVmT2JqSWQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgY29uc3Qgcm9vdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICByb290LmNoaWxkcmVuID0gW107CiAgICByb290LnJvbGUgPSAiUm9vdCI7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMubm9kZXMpIHsKICAgICAgaWYgKCFjaGlsZCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIG5vZGVUb1NlcmlhbGl6YWJsZShjaGlsZCwgcm9vdCk7CiAgICB9CiAgICByZXR1cm4gcm9vdDsKICB9Cn0KZXhwb3J0cy5TdHJ1Y3RUcmVlUGFnZSA9IFN0cnVjdFRyZWVQYWdlOwoKLyoqKi8gfSksCi8qIDc2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuT2JqZWN0TG9hZGVyID0gdm9pZCAwOwp2YXIgX3ByaW1pdGl2ZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpOwp2YXIgX2Jhc2Vfc3RyZWFtID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKZnVuY3Rpb24gbWF5SGF2ZUNoaWxkcmVuKHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmIHx8IHZhbHVlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpOwp9CmZ1bmN0aW9uIGFkZENoaWxkcmVuKG5vZGUsIG5vZGVzVG9WaXNpdCkgewogIGlmIChub2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgbm9kZSA9IG5vZGUuZ2V0UmF3VmFsdWVzKCk7CiAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pIHsKICAgIG5vZGUgPSBub2RlLmRpY3QuZ2V0UmF3VmFsdWVzKCk7CiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShub2RlKSkgewogICAgcmV0dXJuOwogIH0KICBmb3IgKGNvbnN0IHJhd1ZhbHVlIG9mIG5vZGUpIHsKICAgIGlmIChtYXlIYXZlQ2hpbGRyZW4ocmF3VmFsdWUpKSB7CiAgICAgIG5vZGVzVG9WaXNpdC5wdXNoKHJhd1ZhbHVlKTsKICAgIH0KICB9Cn0KY2xhc3MgT2JqZWN0TG9hZGVyIHsKICBjb25zdHJ1Y3RvcihkaWN0LCBrZXlzLCB4cmVmKSB7CiAgICB0aGlzLmRpY3QgPSBkaWN0OwogICAgdGhpcy5rZXlzID0ga2V5czsKICAgIHRoaXMueHJlZiA9IHhyZWY7CiAgICB0aGlzLnJlZlNldCA9IG51bGw7CiAgfQogIGFzeW5jIGxvYWQoKSB7CiAgICBpZiAodGhpcy54cmVmLnN0cmVhbS5pc0RhdGFMb2FkZWQpIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIGNvbnN0IHsKICAgICAga2V5cywKICAgICAgZGljdAogICAgfSA9IHRoaXM7CiAgICB0aGlzLnJlZlNldCA9IG5ldyBfcHJpbWl0aXZlcy5SZWZTZXQoKTsKICAgIGNvbnN0IG5vZGVzVG9WaXNpdCA9IFtdOwogICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICBjb25zdCByYXdWYWx1ZSA9IGRpY3QuZ2V0UmF3KGtleSk7CiAgICAgIGlmIChyYXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbm9kZXNUb1Zpc2l0LnB1c2gocmF3VmFsdWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdGhpcy5fd2Fsayhub2Rlc1RvVmlzaXQpOwogIH0KICBhc3luYyBfd2Fsayhub2Rlc1RvVmlzaXQpIHsKICAgIGNvbnN0IG5vZGVzVG9SZXZpc2l0ID0gW107CiAgICBjb25zdCBwZW5kaW5nUmVxdWVzdHMgPSBbXTsKICAgIHdoaWxlIChub2Rlc1RvVmlzaXQubGVuZ3RoKSB7CiAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9WaXNpdC5wb3AoKTsKICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgaWYgKHRoaXMucmVmU2V0LmhhcyhjdXJyZW50Tm9kZSkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgdGhpcy5yZWZTZXQucHV0KGN1cnJlbnROb2RlKTsKICAgICAgICAgIGN1cnJlbnROb2RlID0gdGhpcy54cmVmLmZldGNoKGN1cnJlbnROb2RlKTsKICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikpIHsKICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPYmplY3RMb2FkZXIuX3dhbGsgLSByZXF1ZXN0aW5nIGFsbCBkYXRhOiAiJHtleH0iLmApOwogICAgICAgICAgICB0aGlzLnJlZlNldCA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICBtYW5hZ2VyCiAgICAgICAgICAgIH0gPSB0aGlzLnhyZWYuc3RyZWFtOwogICAgICAgICAgICByZXR1cm4gbWFuYWdlci5yZXF1ZXN0QWxsQ2h1bmtzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBub2Rlc1RvUmV2aXNpdC5wdXNoKGN1cnJlbnROb2RlKTsKICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKICAgICAgICAgICAgYmVnaW46IGV4LmJlZ2luLAogICAgICAgICAgICBlbmQ6IGV4LmVuZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgICAgY29uc3QgYmFzZVN0cmVhbXMgPSBjdXJyZW50Tm9kZS5nZXRCYXNlU3RyZWFtcygpOwogICAgICAgIGlmIChiYXNlU3RyZWFtcykgewogICAgICAgICAgbGV0IGZvdW5kTWlzc2luZ0RhdGEgPSBmYWxzZTsKICAgICAgICAgIGZvciAoY29uc3Qgc3RyZWFtIG9mIGJhc2VTdHJlYW1zKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW0uaXNEYXRhTG9hZGVkKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm91bmRNaXNzaW5nRGF0YSA9IHRydWU7CiAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wdXNoKHsKICAgICAgICAgICAgICBiZWdpbjogc3RyZWFtLnN0YXJ0LAogICAgICAgICAgICAgIGVuZDogc3RyZWFtLmVuZAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmb3VuZE1pc3NpbmdEYXRhKSB7CiAgICAgICAgICAgIG5vZGVzVG9SZXZpc2l0LnB1c2goY3VycmVudE5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBhZGRDaGlsZHJlbihjdXJyZW50Tm9kZSwgbm9kZXNUb1Zpc2l0KTsKICAgIH0KICAgIGlmIChwZW5kaW5nUmVxdWVzdHMubGVuZ3RoKSB7CiAgICAgIGF3YWl0IHRoaXMueHJlZi5zdHJlYW0ubWFuYWdlci5yZXF1ZXN0UmFuZ2VzKHBlbmRpbmdSZXF1ZXN0cyk7CiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlc1RvUmV2aXNpdCkgewogICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgICAgICB0aGlzLnJlZlNldC5yZW1vdmUobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl93YWxrKG5vZGVzVG9SZXZpc2l0KTsKICAgIH0KICAgIHRoaXMucmVmU2V0ID0gbnVsbDsKICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQp9CmV4cG9ydHMuT2JqZWN0TG9hZGVyID0gT2JqZWN0TG9hZGVyOwoKLyoqKi8gfSksCi8qIDc3ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuWEZBRmFjdG9yeSA9IHZvaWQgMDsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfYmluZCA9IF9fd19wZGZqc19yZXF1aXJlX18oODIpOwp2YXIgX2RhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg4KTsKdmFyIF9mb250cyA9IF9fd19wZGZqc19yZXF1aXJlX18oODYpOwp2YXIgX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OSk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXyg4OSk7CnZhciBfeGh0bWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk5KTsKY2xhc3MgWEZBRmFjdG9yeSB7CiAgY29uc3RydWN0b3IoZGF0YSkgewogICAgdHJ5IHsKICAgICAgdGhpcy5yb290ID0gbmV3IF9wYXJzZXIuWEZBUGFyc2VyKCkucGFyc2UoWEZBRmFjdG9yeS5fY3JlYXRlRG9jdW1lbnQoZGF0YSkpOwogICAgICBjb25zdCBiaW5kZXIgPSBuZXcgX2JpbmQuQmluZGVyKHRoaXMucm9vdCk7CiAgICAgIHRoaXMuZm9ybSA9IGJpbmRlci5iaW5kKCk7CiAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgX2RhdGEuRGF0YUhhbmRsZXIodGhpcy5yb290LCBiaW5kZXIuZ2V0RGF0YSgpKTsKICAgICAgdGhpcy5mb3JtW194ZmFfb2JqZWN0LiRnbG9iYWxEYXRhXS50ZW1wbGF0ZSA9IHRoaXMuZm9ybTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBhbmQgYmluZGluZzogJHtlfWApOwogICAgfQogIH0KICBpc1ZhbGlkKCkgewogICAgcmV0dXJuIHRoaXMucm9vdCAmJiB0aGlzLmZvcm07CiAgfQogIF9jcmVhdGVQYWdlc0hlbHBlcigpIHsKICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5mb3JtW194ZmFfb2JqZWN0LiR0b1BhZ2VzXSgpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgbmV4dEl0ZXJhdGlvbiA9ICgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICBpZiAodmFsdWUuZG9uZSkgewogICAgICAgICAgICByZXNvbHZlKHZhbHVlLnZhbHVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQobmV4dEl0ZXJhdGlvbiwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgc2V0VGltZW91dChuZXh0SXRlcmF0aW9uLCAwKTsKICAgIH0pOwogIH0KICBhc3luYyBfY3JlYXRlUGFnZXMoKSB7CiAgICB0cnkgewogICAgICB0aGlzLnBhZ2VzID0gYXdhaXQgdGhpcy5fY3JlYXRlUGFnZXNIZWxwZXIoKTsKICAgICAgdGhpcy5kaW1zID0gdGhpcy5wYWdlcy5jaGlsZHJlbi5tYXAoYyA9PiB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgd2lkdGgsCiAgICAgICAgICBoZWlnaHQKICAgICAgICB9ID0gYy5hdHRyaWJ1dGVzLnN0eWxlOwogICAgICAgIHJldHVybiBbMCwgMCwgcGFyc2VJbnQod2lkdGgpLCBwYXJzZUludChoZWlnaHQpXTsKICAgICAgfSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGxheW91dDogJHtlfWApOwogICAgfQogIH0KICBnZXRCb3VuZGluZ0JveChwYWdlSW5kZXgpIHsKICAgIHJldHVybiB0aGlzLmRpbXNbcGFnZUluZGV4XTsKICB9CiAgYXN5bmMgZ2V0TnVtUGFnZXMoKSB7CiAgICBpZiAoIXRoaXMucGFnZXMpIHsKICAgICAgYXdhaXQgdGhpcy5fY3JlYXRlUGFnZXMoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLmRpbXMubGVuZ3RoOwogIH0KICBzZXRJbWFnZXMoaW1hZ2VzKSB7CiAgICB0aGlzLmZvcm1bX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdLmltYWdlcyA9IGltYWdlczsKICB9CiAgc2V0Rm9udHMoZm9udHMpIHsKICAgIHRoaXMuZm9ybVtfeGZhX29iamVjdC4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlciA9IG5ldyBfZm9udHMuRm9udEZpbmRlcihmb250cyk7CiAgICBjb25zdCBtaXNzaW5nRm9udHMgPSBbXTsKICAgIGZvciAobGV0IHR5cGVmYWNlIG9mIHRoaXMuZm9ybVtfeGZhX29iamVjdC4kZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcykgewogICAgICB0eXBlZmFjZSA9ICgwLCBfdXRpbHMuc3RyaXBRdW90ZXMpKHR5cGVmYWNlKTsKICAgICAgY29uc3QgZm9udCA9IHRoaXMuZm9ybVtfeGZhX29iamVjdC4kZ2xvYmFsRGF0YV0uZm9udEZpbmRlci5maW5kKHR5cGVmYWNlKTsKICAgICAgaWYgKCFmb250KSB7CiAgICAgICAgbWlzc2luZ0ZvbnRzLnB1c2godHlwZWZhY2UpOwogICAgICB9CiAgICB9CiAgICBpZiAobWlzc2luZ0ZvbnRzLmxlbmd0aCA+IDApIHsKICAgICAgcmV0dXJuIG1pc3NpbmdGb250czsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBhcHBlbmRGb250cyhmb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzKSB7CiAgICB0aGlzLmZvcm1bX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuYWRkKGZvbnRzLCByZWFsbHlNaXNzaW5nRm9udHMpOwogIH0KICBhc3luYyBnZXRQYWdlcygpIHsKICAgIGlmICghdGhpcy5wYWdlcykgewogICAgICBhd2FpdCB0aGlzLl9jcmVhdGVQYWdlcygpOwogICAgfQogICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzOwogICAgdGhpcy5wYWdlcyA9IG51bGw7CiAgICByZXR1cm4gcGFnZXM7CiAgfQogIHNlcmlhbGl6ZURhdGEoc3RvcmFnZSkgewogICAgcmV0dXJuIHRoaXMuZGF0YUhhbmRsZXIuc2VyaWFsaXplKHN0b3JhZ2UpOwogIH0KICBzdGF0aWMgX2NyZWF0ZURvY3VtZW50KGRhdGEpIHsKICAgIGlmICghZGF0YVsiL3hkcDp4ZHAiXSkgewogICAgICByZXR1cm4gZGF0YVsieGRwOnhkcCJdOwogICAgfQogICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZGF0YSkuam9pbigiIik7CiAgfQogIHN0YXRpYyBnZXRSaWNoVGV4dEFzSHRtbChyYykgewogICAgaWYgKCFyYyB8fCB0eXBlb2YgcmMgIT09ICJzdHJpbmciKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdHJ5IHsKICAgICAgbGV0IHJvb3QgPSBuZXcgX3BhcnNlci5YRkFQYXJzZXIoX3hodG1sLlhodG1sTmFtZXNwYWNlLCB0cnVlKS5wYXJzZShyYyk7CiAgICAgIGlmICghWyJib2R5IiwgInhodG1sIl0uaW5jbHVkZXMocm9vdFtfeGZhX29iamVjdC4kbm9kZU5hbWVdKSkgewogICAgICAgIGNvbnN0IG5ld1Jvb3QgPSBfeGh0bWwuWGh0bWxOYW1lc3BhY2UuYm9keSh7fSk7CiAgICAgICAgbmV3Um9vdFtfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKHJvb3QpOwogICAgICAgIHJvb3QgPSBuZXdSb290OwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHJvb3RbX3hmYV9vYmplY3QuJHRvSFRNTF0oKTsKICAgICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGNvbnN0IHsKICAgICAgICBodG1sCiAgICAgIH0gPSByZXN1bHQ7CiAgICAgIGNvbnN0IHsKICAgICAgICBhdHRyaWJ1dGVzCiAgICAgIH0gPSBodG1sOwogICAgICBpZiAoYXR0cmlidXRlcykgewogICAgICAgIGlmIChhdHRyaWJ1dGVzLmNsYXNzKSB7CiAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzID0gYXR0cmlidXRlcy5jbGFzcy5maWx0ZXIoYXR0ciA9PiAhYXR0ci5zdGFydHNXaXRoKCJ4ZmEiKSk7CiAgICAgICAgfQogICAgICAgIGF0dHJpYnV0ZXMuZGlyID0gImF1dG8iOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaHRtbCwKICAgICAgICBzdHI6IHJvb3RbX3hmYV9vYmplY3QuJHRleHRdKCkKICAgICAgfTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBYRkEgLSBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBvZiByaWNoIHRleHQ6ICR7ZX1gKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KfQpleHBvcnRzLlhGQUZhY3RvcnkgPSBYRkFGYWN0b3J5OwoKLyoqKi8gfSksCi8qIDc4ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuWG1sT2JqZWN0ID0gZXhwb3J0cy5YRkFPYmplY3RBcnJheSA9IGV4cG9ydHMuWEZBT2JqZWN0ID0gZXhwb3J0cy5YRkFBdHRyaWJ1dGUgPSBleHBvcnRzLlN0cmluZ09iamVjdCA9IGV4cG9ydHMuT3B0aW9uT2JqZWN0ID0gZXhwb3J0cy5PcHRpb24xMCA9IGV4cG9ydHMuT3B0aW9uMDEgPSBleHBvcnRzLkludGVnZXJPYmplY3QgPSBleHBvcnRzLkNvbnRlbnRPYmplY3QgPSBleHBvcnRzLiR1aWQgPSBleHBvcnRzLiR0b1N0eWxlID0gZXhwb3J0cy4kdG9TdHJpbmcgPSBleHBvcnRzLiR0b1BhZ2VzID0gZXhwb3J0cy4kdG9IVE1MID0gZXhwb3J0cy4kdGV4dCA9IGV4cG9ydHMuJHRhYkluZGV4ID0gZXhwb3J0cy4kc2V0VmFsdWUgPSBleHBvcnRzLiRzZXRTZXRBdHRyaWJ1dGVzID0gZXhwb3J0cy4kc2V0SWQgPSBleHBvcnRzLiRzZWFyY2hOb2RlID0gZXhwb3J0cy4kcm9vdCA9IGV4cG9ydHMuJHJlc29sdmVQcm90b3R5cGVzID0gZXhwb3J0cy4kcmVtb3ZlQ2hpbGQgPSBleHBvcnRzLiRwdXNoUGFyYSA9IGV4cG9ydHMuJHB1c2hHbHlwaHMgPSBleHBvcnRzLiRwb3BQYXJhID0gZXhwb3J0cy4kb25UZXh0ID0gZXhwb3J0cy4kb25DaGlsZENoZWNrID0gZXhwb3J0cy4kb25DaGlsZCA9IGV4cG9ydHMuJG5zQXR0cmlidXRlcyA9IGV4cG9ydHMuJG5vZGVOYW1lID0gZXhwb3J0cy4kbmFtZXNwYWNlSWQgPSBleHBvcnRzLiRpc1VzYWJsZSA9IGV4cG9ydHMuJGlzVHJhbnNwYXJlbnQgPSBleHBvcnRzLiRpc1RoZXJlTW9yZVdpZHRoID0gZXhwb3J0cy4kaXNTcGxpdHRhYmxlID0gZXhwb3J0cy4kaXNOc0Fnbm9zdGljID0gZXhwb3J0cy4kaXNEZXNjZW5kZW50ID0gZXhwb3J0cy4kaXNEYXRhVmFsdWUgPSBleHBvcnRzLiRpc0NEQVRBWG1sID0gZXhwb3J0cy4kaXNCaW5kYWJsZSA9IGV4cG9ydHMuJGluc2VydEF0ID0gZXhwb3J0cy4kaW5kZXhPZiA9IGV4cG9ydHMuJGlkcyA9IGV4cG9ydHMuJGhhc1NldHRhYmxlVmFsdWUgPSBleHBvcnRzLiRnbG9iYWxEYXRhID0gZXhwb3J0cy4kZ2V0VGVtcGxhdGVSb290ID0gZXhwb3J0cy4kZ2V0U3ViZm9ybVBhcmVudCA9IGV4cG9ydHMuJGdldFJlYWxDaGlsZHJlbkJ5TmFtZUl0ID0gZXhwb3J0cy4kZ2V0UGFyZW50ID0gZXhwb3J0cy4kZ2V0TmV4dFBhZ2UgPSBleHBvcnRzLiRnZXRFeHRyYSA9IGV4cG9ydHMuJGdldERhdGFWYWx1ZSA9IGV4cG9ydHMuJGdldENvbnRhaW5lZENoaWxkcmVuID0gZXhwb3J0cy4kZ2V0Q2hpbGRyZW5CeU5hbWVJdCA9IGV4cG9ydHMuJGdldENoaWxkcmVuQnlOYW1lID0gZXhwb3J0cy4kZ2V0Q2hpbGRyZW5CeUNsYXNzID0gZXhwb3J0cy4kZ2V0Q2hpbGRyZW4gPSBleHBvcnRzLiRnZXRBdmFpbGFibGVTcGFjZSA9IGV4cG9ydHMuJGdldEF0dHJpYnV0ZXMgPSBleHBvcnRzLiRnZXRBdHRyaWJ1dGVJdCA9IGV4cG9ydHMuJGZsdXNoSFRNTCA9IGV4cG9ydHMuJGZpbmFsaXplID0gZXhwb3J0cy4kZXh0cmEgPSBleHBvcnRzLiRkdW1wID0gZXhwb3J0cy4kZGF0YSA9IGV4cG9ydHMuJGNvbnRlbnQgPSBleHBvcnRzLiRjb25zdW1lZCA9IGV4cG9ydHMuJGNsb25lID0gZXhwb3J0cy4kY2xlYW51cCA9IGV4cG9ydHMuJGNsZWFuUGFnZSA9IGV4cG9ydHMuJGNsZWFuID0gZXhwb3J0cy4kY2hpbGRyZW5Ub0hUTUwgPSBleHBvcnRzLiRhcHBlbmRDaGlsZCA9IGV4cG9ydHMuJGFkZEhUTUwgPSBleHBvcnRzLiRhY2NlcHRXaGl0ZXNwYWNlID0gdm9pZCAwOwp2YXIgX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OSk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfbmFtZXNwYWNlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwp2YXIgX3NvbSA9IF9fd19wZGZqc19yZXF1aXJlX18oODEpOwpjb25zdCAkYWNjZXB0V2hpdGVzcGFjZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRhY2NlcHRXaGl0ZXNwYWNlID0gJGFjY2VwdFdoaXRlc3BhY2U7CmNvbnN0ICRhZGRIVE1MID0gU3ltYm9sKCk7CmV4cG9ydHMuJGFkZEhUTUwgPSAkYWRkSFRNTDsKY29uc3QgJGFwcGVuZENoaWxkID0gU3ltYm9sKCk7CmV4cG9ydHMuJGFwcGVuZENoaWxkID0gJGFwcGVuZENoaWxkOwpjb25zdCAkY2hpbGRyZW5Ub0hUTUwgPSBTeW1ib2woKTsKZXhwb3J0cy4kY2hpbGRyZW5Ub0hUTUwgPSAkY2hpbGRyZW5Ub0hUTUw7CmNvbnN0ICRjbGVhbiA9IFN5bWJvbCgpOwpleHBvcnRzLiRjbGVhbiA9ICRjbGVhbjsKY29uc3QgJGNsZWFuUGFnZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRjbGVhblBhZ2UgPSAkY2xlYW5QYWdlOwpjb25zdCAkY2xlYW51cCA9IFN5bWJvbCgpOwpleHBvcnRzLiRjbGVhbnVwID0gJGNsZWFudXA7CmNvbnN0ICRjbG9uZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRjbG9uZSA9ICRjbG9uZTsKY29uc3QgJGNvbnN1bWVkID0gU3ltYm9sKCk7CmV4cG9ydHMuJGNvbnN1bWVkID0gJGNvbnN1bWVkOwpjb25zdCAkY29udGVudCA9IFN5bWJvbCgiY29udGVudCIpOwpleHBvcnRzLiRjb250ZW50ID0gJGNvbnRlbnQ7CmNvbnN0ICRkYXRhID0gU3ltYm9sKCJkYXRhIik7CmV4cG9ydHMuJGRhdGEgPSAkZGF0YTsKY29uc3QgJGR1bXAgPSBTeW1ib2woKTsKZXhwb3J0cy4kZHVtcCA9ICRkdW1wOwpjb25zdCAkZXh0cmEgPSBTeW1ib2woImV4dHJhIik7CmV4cG9ydHMuJGV4dHJhID0gJGV4dHJhOwpjb25zdCAkZmluYWxpemUgPSBTeW1ib2woKTsKZXhwb3J0cy4kZmluYWxpemUgPSAkZmluYWxpemU7CmNvbnN0ICRmbHVzaEhUTUwgPSBTeW1ib2woKTsKZXhwb3J0cy4kZmx1c2hIVE1MID0gJGZsdXNoSFRNTDsKY29uc3QgJGdldEF0dHJpYnV0ZUl0ID0gU3ltYm9sKCk7CmV4cG9ydHMuJGdldEF0dHJpYnV0ZUl0ID0gJGdldEF0dHJpYnV0ZUl0Owpjb25zdCAkZ2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpleHBvcnRzLiRnZXRBdHRyaWJ1dGVzID0gJGdldEF0dHJpYnV0ZXM7CmNvbnN0ICRnZXRBdmFpbGFibGVTcGFjZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRnZXRBdmFpbGFibGVTcGFjZSA9ICRnZXRBdmFpbGFibGVTcGFjZTsKY29uc3QgJGdldENoaWxkcmVuQnlDbGFzcyA9IFN5bWJvbCgpOwpleHBvcnRzLiRnZXRDaGlsZHJlbkJ5Q2xhc3MgPSAkZ2V0Q2hpbGRyZW5CeUNsYXNzOwpjb25zdCAkZ2V0Q2hpbGRyZW5CeU5hbWUgPSBTeW1ib2woKTsKZXhwb3J0cy4kZ2V0Q2hpbGRyZW5CeU5hbWUgPSAkZ2V0Q2hpbGRyZW5CeU5hbWU7CmNvbnN0ICRnZXRDaGlsZHJlbkJ5TmFtZUl0ID0gU3ltYm9sKCk7CmV4cG9ydHMuJGdldENoaWxkcmVuQnlOYW1lSXQgPSAkZ2V0Q2hpbGRyZW5CeU5hbWVJdDsKY29uc3QgJGdldERhdGFWYWx1ZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRnZXREYXRhVmFsdWUgPSAkZ2V0RGF0YVZhbHVlOwpjb25zdCAkZ2V0RXh0cmEgPSBTeW1ib2woKTsKZXhwb3J0cy4kZ2V0RXh0cmEgPSAkZ2V0RXh0cmE7CmNvbnN0ICRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdCA9IFN5bWJvbCgpOwpleHBvcnRzLiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdCA9ICRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdDsKY29uc3QgJGdldENoaWxkcmVuID0gU3ltYm9sKCk7CmV4cG9ydHMuJGdldENoaWxkcmVuID0gJGdldENoaWxkcmVuOwpjb25zdCAkZ2V0Q29udGFpbmVkQ2hpbGRyZW4gPSBTeW1ib2woKTsKZXhwb3J0cy4kZ2V0Q29udGFpbmVkQ2hpbGRyZW4gPSAkZ2V0Q29udGFpbmVkQ2hpbGRyZW47CmNvbnN0ICRnZXROZXh0UGFnZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRnZXROZXh0UGFnZSA9ICRnZXROZXh0UGFnZTsKY29uc3QgJGdldFN1YmZvcm1QYXJlbnQgPSBTeW1ib2woKTsKZXhwb3J0cy4kZ2V0U3ViZm9ybVBhcmVudCA9ICRnZXRTdWJmb3JtUGFyZW50Owpjb25zdCAkZ2V0UGFyZW50ID0gU3ltYm9sKCk7CmV4cG9ydHMuJGdldFBhcmVudCA9ICRnZXRQYXJlbnQ7CmNvbnN0ICRnZXRUZW1wbGF0ZVJvb3QgPSBTeW1ib2woKTsKZXhwb3J0cy4kZ2V0VGVtcGxhdGVSb290ID0gJGdldFRlbXBsYXRlUm9vdDsKY29uc3QgJGdsb2JhbERhdGEgPSBTeW1ib2woKTsKZXhwb3J0cy4kZ2xvYmFsRGF0YSA9ICRnbG9iYWxEYXRhOwpjb25zdCAkaGFzU2V0dGFibGVWYWx1ZSA9IFN5bWJvbCgpOwpleHBvcnRzLiRoYXNTZXR0YWJsZVZhbHVlID0gJGhhc1NldHRhYmxlVmFsdWU7CmNvbnN0ICRpZHMgPSBTeW1ib2woKTsKZXhwb3J0cy4kaWRzID0gJGlkczsKY29uc3QgJGluZGV4T2YgPSBTeW1ib2woKTsKZXhwb3J0cy4kaW5kZXhPZiA9ICRpbmRleE9mOwpjb25zdCAkaW5zZXJ0QXQgPSBTeW1ib2woKTsKZXhwb3J0cy4kaW5zZXJ0QXQgPSAkaW5zZXJ0QXQ7CmNvbnN0ICRpc0NEQVRBWG1sID0gU3ltYm9sKCk7CmV4cG9ydHMuJGlzQ0RBVEFYbWwgPSAkaXNDREFUQVhtbDsKY29uc3QgJGlzQmluZGFibGUgPSBTeW1ib2woKTsKZXhwb3J0cy4kaXNCaW5kYWJsZSA9ICRpc0JpbmRhYmxlOwpjb25zdCAkaXNEYXRhVmFsdWUgPSBTeW1ib2woKTsKZXhwb3J0cy4kaXNEYXRhVmFsdWUgPSAkaXNEYXRhVmFsdWU7CmNvbnN0ICRpc0Rlc2NlbmRlbnQgPSBTeW1ib2woKTsKZXhwb3J0cy4kaXNEZXNjZW5kZW50ID0gJGlzRGVzY2VuZGVudDsKY29uc3QgJGlzTnNBZ25vc3RpYyA9IFN5bWJvbCgpOwpleHBvcnRzLiRpc05zQWdub3N0aWMgPSAkaXNOc0Fnbm9zdGljOwpjb25zdCAkaXNTcGxpdHRhYmxlID0gU3ltYm9sKCk7CmV4cG9ydHMuJGlzU3BsaXR0YWJsZSA9ICRpc1NwbGl0dGFibGU7CmNvbnN0ICRpc1RoZXJlTW9yZVdpZHRoID0gU3ltYm9sKCk7CmV4cG9ydHMuJGlzVGhlcmVNb3JlV2lkdGggPSAkaXNUaGVyZU1vcmVXaWR0aDsKY29uc3QgJGlzVHJhbnNwYXJlbnQgPSBTeW1ib2woKTsKZXhwb3J0cy4kaXNUcmFuc3BhcmVudCA9ICRpc1RyYW5zcGFyZW50Owpjb25zdCAkaXNVc2FibGUgPSBTeW1ib2woKTsKZXhwb3J0cy4kaXNVc2FibGUgPSAkaXNVc2FibGU7CmNvbnN0ICRsYXN0QXR0cmlidXRlID0gU3ltYm9sKCk7CmNvbnN0ICRuYW1lc3BhY2VJZCA9IFN5bWJvbCgibmFtZXNwYWNlSWQiKTsKZXhwb3J0cy4kbmFtZXNwYWNlSWQgPSAkbmFtZXNwYWNlSWQ7CmNvbnN0ICRub2RlTmFtZSA9IFN5bWJvbCgibm9kZU5hbWUiKTsKZXhwb3J0cy4kbm9kZU5hbWUgPSAkbm9kZU5hbWU7CmNvbnN0ICRuc0F0dHJpYnV0ZXMgPSBTeW1ib2woKTsKZXhwb3J0cy4kbnNBdHRyaWJ1dGVzID0gJG5zQXR0cmlidXRlczsKY29uc3QgJG9uQ2hpbGQgPSBTeW1ib2woKTsKZXhwb3J0cy4kb25DaGlsZCA9ICRvbkNoaWxkOwpjb25zdCAkb25DaGlsZENoZWNrID0gU3ltYm9sKCk7CmV4cG9ydHMuJG9uQ2hpbGRDaGVjayA9ICRvbkNoaWxkQ2hlY2s7CmNvbnN0ICRvblRleHQgPSBTeW1ib2woKTsKZXhwb3J0cy4kb25UZXh0ID0gJG9uVGV4dDsKY29uc3QgJHB1c2hHbHlwaHMgPSBTeW1ib2woKTsKZXhwb3J0cy4kcHVzaEdseXBocyA9ICRwdXNoR2x5cGhzOwpjb25zdCAkcG9wUGFyYSA9IFN5bWJvbCgpOwpleHBvcnRzLiRwb3BQYXJhID0gJHBvcFBhcmE7CmNvbnN0ICRwdXNoUGFyYSA9IFN5bWJvbCgpOwpleHBvcnRzLiRwdXNoUGFyYSA9ICRwdXNoUGFyYTsKY29uc3QgJHJlbW92ZUNoaWxkID0gU3ltYm9sKCk7CmV4cG9ydHMuJHJlbW92ZUNoaWxkID0gJHJlbW92ZUNoaWxkOwpjb25zdCAkcm9vdCA9IFN5bWJvbCgicm9vdCIpOwpleHBvcnRzLiRyb290ID0gJHJvb3Q7CmNvbnN0ICRyZXNvbHZlUHJvdG90eXBlcyA9IFN5bWJvbCgpOwpleHBvcnRzLiRyZXNvbHZlUHJvdG90eXBlcyA9ICRyZXNvbHZlUHJvdG90eXBlczsKY29uc3QgJHNlYXJjaE5vZGUgPSBTeW1ib2woKTsKZXhwb3J0cy4kc2VhcmNoTm9kZSA9ICRzZWFyY2hOb2RlOwpjb25zdCAkc2V0SWQgPSBTeW1ib2woKTsKZXhwb3J0cy4kc2V0SWQgPSAkc2V0SWQ7CmNvbnN0ICRzZXRTZXRBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmV4cG9ydHMuJHNldFNldEF0dHJpYnV0ZXMgPSAkc2V0U2V0QXR0cmlidXRlczsKY29uc3QgJHNldFZhbHVlID0gU3ltYm9sKCk7CmV4cG9ydHMuJHNldFZhbHVlID0gJHNldFZhbHVlOwpjb25zdCAkdGFiSW5kZXggPSBTeW1ib2woKTsKZXhwb3J0cy4kdGFiSW5kZXggPSAkdGFiSW5kZXg7CmNvbnN0ICR0ZXh0ID0gU3ltYm9sKCk7CmV4cG9ydHMuJHRleHQgPSAkdGV4dDsKY29uc3QgJHRvUGFnZXMgPSBTeW1ib2woKTsKZXhwb3J0cy4kdG9QYWdlcyA9ICR0b1BhZ2VzOwpjb25zdCAkdG9IVE1MID0gU3ltYm9sKCk7CmV4cG9ydHMuJHRvSFRNTCA9ICR0b0hUTUw7CmNvbnN0ICR0b1N0cmluZyA9IFN5bWJvbCgpOwpleHBvcnRzLiR0b1N0cmluZyA9ICR0b1N0cmluZzsKY29uc3QgJHRvU3R5bGUgPSBTeW1ib2woKTsKZXhwb3J0cy4kdG9TdHlsZSA9ICR0b1N0eWxlOwpjb25zdCAkdWlkID0gU3ltYm9sKCJ1aWQiKTsKZXhwb3J0cy4kdWlkID0gJHVpZDsKY29uc3QgX2FwcGx5UHJvdG90eXBlID0gU3ltYm9sKCk7CmNvbnN0IF9hdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0IF9hdHRyaWJ1dGVOYW1lcyA9IFN5bWJvbCgpOwpjb25zdCBfY2hpbGRyZW4gPSBTeW1ib2woIl9jaGlsZHJlbiIpOwpjb25zdCBfY2xvbmVBdHRyaWJ1dGUgPSBTeW1ib2woKTsKY29uc3QgX2RhdGFWYWx1ZSA9IFN5bWJvbCgpOwpjb25zdCBfZGVmYXVsdFZhbHVlID0gU3ltYm9sKCk7CmNvbnN0IF9maWx0ZXJlZENoaWxkcmVuR2VuZXJhdG9yID0gU3ltYm9sKCk7CmNvbnN0IF9nZXRQcm90b3R5cGUgPSBTeW1ib2woKTsKY29uc3QgX2dldFVuc2V0QXR0cmlidXRlcyA9IFN5bWJvbCgpOwpjb25zdCBfaGFzQ2hpbGRyZW4gPSBTeW1ib2woKTsKY29uc3QgX21heCA9IFN5bWJvbCgpOwpjb25zdCBfb3B0aW9ucyA9IFN5bWJvbCgpOwpjb25zdCBfcGFyZW50ID0gU3ltYm9sKCJwYXJlbnQiKTsKY29uc3QgX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyID0gU3ltYm9sKCk7CmNvbnN0IF9zZXRBdHRyaWJ1dGVzID0gU3ltYm9sKCk7CmNvbnN0IF92YWxpZGF0b3IgPSBTeW1ib2woKTsKbGV0IHVpZCA9IDA7CmNvbnN0IE5TX0RBVEFTRVRTID0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkOwpjbGFzcyBYRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKG5zSWQsIG5hbWUsIGhhc0NoaWxkcmVuID0gZmFsc2UpIHsKICAgIHRoaXNbJG5hbWVzcGFjZUlkXSA9IG5zSWQ7CiAgICB0aGlzWyRub2RlTmFtZV0gPSBuYW1lOwogICAgdGhpc1tfaGFzQ2hpbGRyZW5dID0gaGFzQ2hpbGRyZW47CiAgICB0aGlzW19wYXJlbnRdID0gbnVsbDsKICAgIHRoaXNbX2NoaWxkcmVuXSA9IFtdOwogICAgdGhpc1skdWlkXSA9IGAke25hbWV9JHt1aWQrK31gOwogICAgdGhpc1skZ2xvYmFsRGF0YV0gPSBudWxsOwogIH0KICBbJG9uQ2hpbGRdKGNoaWxkKSB7CiAgICBpZiAoIXRoaXNbX2hhc0NoaWxkcmVuXSB8fCAhdGhpc1skb25DaGlsZENoZWNrXShjaGlsZCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgbmFtZSA9IGNoaWxkWyRub2RlTmFtZV07CiAgICBjb25zdCBub2RlID0gdGhpc1tuYW1lXTsKICAgIGlmIChub2RlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgaWYgKG5vZGUucHVzaChjaGlsZCkpIHsKICAgICAgICB0aGlzWyRhcHBlbmRDaGlsZF0oY2hpbGQpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAobm9kZSAhPT0gbnVsbCkgewogICAgICAgIHRoaXNbJHJlbW92ZUNoaWxkXShub2RlKTsKICAgICAgfQogICAgICB0aGlzW25hbWVdID0gY2hpbGQ7CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShjaGlsZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgbGV0IGlkID0gIiI7CiAgICBpZiAodGhpcy5pZCkgewogICAgICBpZCA9IGAgKGlkOiAke3RoaXMuaWR9KWA7CiAgICB9IGVsc2UgaWYgKHRoaXMubmFtZSkgewogICAgICBpZCA9IGAgKG5hbWU6ICR7dGhpcy5uYW1lfSAke3RoaXMuaC52YWx1ZX0pYDsKICAgIH0KICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gbm9kZSAiJHt0aGlzWyRub2RlTmFtZV19IiR7aWR9IGhhcyBhbHJlYWR5IGVub3VnaCAiJHtuYW1lfSIhYCk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskb25DaGlsZENoZWNrXShjaGlsZCkgewogICAgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoY2hpbGRbJG5vZGVOYW1lXSkgJiYgY2hpbGRbJG5hbWVzcGFjZUlkXSA9PT0gdGhpc1skbmFtZXNwYWNlSWRdOwogIH0KICBbJGlzTnNBZ25vc3RpY10oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskYWNjZXB0V2hpdGVzcGFjZV0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskaXNDREFUQVhtbF0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIFskcG9wUGFyYV0oKSB7CiAgICBpZiAodGhpcy5wYXJhKSB7CiAgICAgIHRoaXNbJGdldFRlbXBsYXRlUm9vdF0oKVskZXh0cmFdLnBhcmFTdGFjay5wb3AoKTsKICAgIH0KICB9CiAgWyRwdXNoUGFyYV0oKSB7CiAgICB0aGlzWyRnZXRUZW1wbGF0ZVJvb3RdKClbJGV4dHJhXS5wYXJhU3RhY2sucHVzaCh0aGlzLnBhcmEpOwogIH0KICBbJHNldElkXShpZHMpIHsKICAgIGlmICh0aGlzLmlkICYmIHRoaXNbJG5hbWVzcGFjZUlkXSA9PT0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLnRlbXBsYXRlLmlkKSB7CiAgICAgIGlkcy5zZXQodGhpcy5pZCwgdGhpcyk7CiAgICB9CiAgfQogIFskZ2V0VGVtcGxhdGVSb290XSgpIHsKICAgIHJldHVybiB0aGlzWyRnbG9iYWxEYXRhXS50ZW1wbGF0ZTsKICB9CiAgWyRpc1NwbGl0dGFibGVdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGlzVGhlcmVNb3JlV2lkdGhdKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGFwcGVuZENoaWxkXShjaGlsZCkgewogICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgdGhpc1tfY2hpbGRyZW5dLnB1c2goY2hpbGQpOwogICAgaWYgKCFjaGlsZFskZ2xvYmFsRGF0YV0gJiYgdGhpc1skZ2xvYmFsRGF0YV0pIHsKICAgICAgY2hpbGRbJGdsb2JhbERhdGFdID0gdGhpc1skZ2xvYmFsRGF0YV07CiAgICB9CiAgfQogIFskcmVtb3ZlQ2hpbGRdKGNoaWxkKSB7CiAgICBjb25zdCBpID0gdGhpc1tfY2hpbGRyZW5dLmluZGV4T2YoY2hpbGQpOwogICAgdGhpc1tfY2hpbGRyZW5dLnNwbGljZShpLCAxKTsKICB9CiAgWyRoYXNTZXR0YWJsZVZhbHVlXSgpIHsKICAgIHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpOwogIH0KICBbJHNldFZhbHVlXShfKSB7fQogIFskb25UZXh0XShfKSB7fQogIFskZmluYWxpemVdKCkge30KICBbJGNsZWFuXShidWlsZGVyKSB7CiAgICBkZWxldGUgdGhpc1tfaGFzQ2hpbGRyZW5dOwogICAgaWYgKHRoaXNbJGNsZWFudXBdKSB7CiAgICAgIGJ1aWxkZXIuY2xlYW4odGhpc1skY2xlYW51cF0pOwogICAgICBkZWxldGUgdGhpc1skY2xlYW51cF07CiAgICB9CiAgfQogIFskaW5kZXhPZl0oY2hpbGQpIHsKICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0uaW5kZXhPZihjaGlsZCk7CiAgfQogIFskaW5zZXJ0QXRdKGksIGNoaWxkKSB7CiAgICBjaGlsZFtfcGFyZW50XSA9IHRoaXM7CiAgICB0aGlzW19jaGlsZHJlbl0uc3BsaWNlKGksIDAsIGNoaWxkKTsKICAgIGlmICghY2hpbGRbJGdsb2JhbERhdGFdICYmIHRoaXNbJGdsb2JhbERhdGFdKSB7CiAgICAgIGNoaWxkWyRnbG9iYWxEYXRhXSA9IHRoaXNbJGdsb2JhbERhdGFdOwogICAgfQogIH0KICBbJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuICF0aGlzLm5hbWU7CiAgfQogIFskbGFzdEF0dHJpYnV0ZV0oKSB7CiAgICByZXR1cm4gIiI7CiAgfQogIFskdGV4dF0oKSB7CiAgICBpZiAodGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gdGhpc1skY29udGVudF07CiAgICB9CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLm1hcChjID0+IGNbJHRleHRdKCkpLmpvaW4oIiIpOwogIH0KICBnZXQgW19hdHRyaWJ1dGVOYW1lc10oKSB7CiAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgIGlmICghcHJvdG8uX2F0dHJpYnV0ZXMpIHsKICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHByb3RvLl9hdHRyaWJ1dGVzID0gbmV3IFNldCgpOwogICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgICBpZiAodGhpc1tuYW1lXSA9PT0gbnVsbCB8fCB0aGlzW25hbWVdIGluc3RhbmNlb2YgWEZBT2JqZWN0IHx8IHRoaXNbbmFtZV0gaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgX2F0dHJpYnV0ZU5hbWVzLCBwcm90by5fYXR0cmlidXRlcyk7CiAgfQogIFskaXNEZXNjZW5kZW50XShwYXJlbnQpIHsKICAgIGxldCBub2RlID0gdGhpczsKICAgIHdoaWxlIChub2RlKSB7CiAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBub2RlID0gbm9kZVskZ2V0UGFyZW50XSgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbJGdldFBhcmVudF0oKSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XTsKICB9CiAgWyRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIHJldHVybiB0aGlzWyRnZXRQYXJlbnRdKCk7CiAgfQogIFskZ2V0Q2hpbGRyZW5dKG5hbWUgPSBudWxsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXTsKICAgIH0KICAgIHJldHVybiB0aGlzW25hbWVdOwogIH0KICBbJGR1bXBdKCkgewogICAgY29uc3QgZHVtcGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBkdW1wZWQuJGNvbnRlbnQgPSB0aGlzWyRjb250ZW50XTsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV07CiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhGQU9iamVjdCkgewogICAgICAgIGR1bXBlZFtuYW1lXSA9IHZhbHVlWyRkdW1wXSgpOwogICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICBpZiAoIXZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgZHVtcGVkW25hbWVdID0gdmFsdWUuZHVtcCgpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBkdW1wZWRbbmFtZV0gPSB2YWx1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGR1bXBlZDsKICB9CiAgWyR0b1N0eWxlXSgpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBbJHRvSFRNTF0oKSB7CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuRU1QVFk7CiAgfQogICpbJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzWyRnZXRDaGlsZHJlbl0oKSkgewogICAgICB5aWVsZCBub2RlOwogICAgfQogIH0KICAqW19maWx0ZXJlZENoaWxkcmVuR2VuZXJhdG9yXShmaWx0ZXIsIGluY2x1ZGUpIHsKICAgIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzWyRnZXRDb250YWluZWRDaGlsZHJlbl0oKSkgewogICAgICBpZiAoIWZpbHRlciB8fCBpbmNsdWRlID09PSBmaWx0ZXIuaGFzKG5vZGVbJG5vZGVOYW1lXSkpIHsKICAgICAgICBjb25zdCBhdmFpbGFibGVTcGFjZSA9IHRoaXNbJGdldEF2YWlsYWJsZVNwYWNlXSgpOwogICAgICAgIGNvbnN0IHJlcyA9IG5vZGVbJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgICAgIGlmICghcmVzLnN1Y2Nlc3MpIHsKICAgICAgICAgIHRoaXNbJGV4dHJhXS5mYWlsaW5nTm9kZSA9IG5vZGU7CiAgICAgICAgfQogICAgICAgIHlpZWxkIHJlczsKICAgICAgfQogICAgfQogIH0KICBbJGZsdXNoSFRNTF0oKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgWyRhZGRIVE1MXShodG1sLCBiYm94KSB7CiAgICB0aGlzWyRleHRyYV0uY2hpbGRyZW4ucHVzaChodG1sKTsKICB9CiAgWyRnZXRBdmFpbGFibGVTcGFjZV0oKSB7fQogIFskY2hpbGRyZW5Ub0hUTUxdKHsKICAgIGZpbHRlciA9IG51bGwsCiAgICBpbmNsdWRlID0gdHJ1ZQogIH0pIHsKICAgIGlmICghdGhpc1skZXh0cmFdLmdlbmVyYXRvcikgewogICAgICB0aGlzWyRleHRyYV0uZ2VuZXJhdG9yID0gdGhpc1tfZmlsdGVyZWRDaGlsZHJlbkdlbmVyYXRvcl0oZmlsdGVyLCBpbmNsdWRlKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gdGhpc1skZ2V0QXZhaWxhYmxlU3BhY2VdKCk7CiAgICAgIGNvbnN0IHJlcyA9IHRoaXNbJGV4dHJhXS5mYWlsaW5nTm9kZVskdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgICAgIGlmICghcmVzLnN1Y2Nlc3MpIHsKICAgICAgICByZXR1cm4gcmVzOwogICAgICB9CiAgICAgIGlmIChyZXMuaHRtbCkgewogICAgICAgIHRoaXNbJGFkZEhUTUxdKHJlcy5odG1sLCByZXMuYmJveCk7CiAgICAgIH0KICAgICAgZGVsZXRlIHRoaXNbJGV4dHJhXS5mYWlsaW5nTm9kZTsKICAgIH0KICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGNvbnN0IGdlbiA9IHRoaXNbJGV4dHJhXS5nZW5lcmF0b3IubmV4dCgpOwogICAgICBpZiAoZ2VuLmRvbmUpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjb25zdCByZXMgPSBnZW4udmFsdWU7CiAgICAgIGlmICghcmVzLnN1Y2Nlc3MpIHsKICAgICAgICByZXR1cm4gcmVzOwogICAgICB9CiAgICAgIGlmIChyZXMuaHRtbCkgewogICAgICAgIHRoaXNbJGFkZEhUTUxdKHJlcy5odG1sLCByZXMuYmJveCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbJGV4dHJhXS5nZW5lcmF0b3IgPSBudWxsOwogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogIH0KICBbJHNldFNldEF0dHJpYnV0ZXNdKGF0dHJpYnV0ZXMpIHsKICAgIHRoaXNbX3NldEF0dHJpYnV0ZXNdID0gbmV3IFNldChPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSk7CiAgfQogIFtfZ2V0VW5zZXRBdHRyaWJ1dGVzXShwcm90b0F0dHJpYnV0ZXMpIHsKICAgIGNvbnN0IGFsbEF0dHIgPSB0aGlzW19hdHRyaWJ1dGVOYW1lc107CiAgICBjb25zdCBzZXRBdHRyID0gdGhpc1tfc2V0QXR0cmlidXRlc107CiAgICByZXR1cm4gWy4uLnByb3RvQXR0cmlidXRlc10uZmlsdGVyKHggPT4gYWxsQXR0ci5oYXMoeCkgJiYgIXNldEF0dHIuaGFzKHgpKTsKICB9CiAgWyRyZXNvbHZlUHJvdG90eXBlc10oaWRzLCBhbmNlc3RvcnMgPSBuZXcgU2V0KCkpIHsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgIGNoaWxkW19yZXNvbHZlUHJvdG90eXBlc0hlbHBlcl0oaWRzLCBhbmNlc3RvcnMpOwogICAgfQogIH0KICBbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgcHJvdG8gPSB0aGlzW19nZXRQcm90b3R5cGVdKGlkcywgYW5jZXN0b3JzKTsKICAgIGlmIChwcm90bykgewogICAgICB0aGlzW19hcHBseVByb3RvdHlwZV0ocHJvdG8sIGlkcywgYW5jZXN0b3JzKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICB9CiAgfQogIFtfZ2V0UHJvdG90eXBlXShpZHMsIGFuY2VzdG9ycykgewogICAgY29uc3QgewogICAgICB1c2UsCiAgICAgIHVzZWhyZWYKICAgIH0gPSB0aGlzOwogICAgaWYgKCF1c2UgJiYgIXVzZWhyZWYpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgcHJvdG8gPSBudWxsOwogICAgbGV0IHNvbUV4cHJlc3Npb24gPSBudWxsOwogICAgbGV0IGlkID0gbnVsbDsKICAgIGxldCByZWYgPSB1c2U7CiAgICBpZiAodXNlaHJlZikgewogICAgICByZWYgPSB1c2VocmVmOwogICAgICBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIjc29tKCIpICYmIHVzZWhyZWYuZW5kc1dpdGgoIikiKSkgewogICAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2VocmVmLnNsaWNlKCIjc29tKCIubGVuZ3RoLCAtMSk7CiAgICAgIH0gZWxzZSBpZiAodXNlaHJlZi5zdGFydHNXaXRoKCIuI3NvbSgiKSAmJiB1c2VocmVmLmVuZHNXaXRoKCIpIikpIHsKICAgICAgICBzb21FeHByZXNzaW9uID0gdXNlaHJlZi5zbGljZSgiLiNzb20oIi5sZW5ndGgsIC0xKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgIGlkID0gdXNlaHJlZi5zbGljZSgxKTsKICAgICAgfSBlbHNlIGlmICh1c2VocmVmLnN0YXJ0c1dpdGgoIi4jIikpIHsKICAgICAgICBpZCA9IHVzZWhyZWYuc2xpY2UoMik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodXNlLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICBpZCA9IHVzZS5zbGljZSgxKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvbUV4cHJlc3Npb24gPSB1c2U7CiAgICB9CiAgICB0aGlzLnVzZSA9IHRoaXMudXNlaHJlZiA9ICIiOwogICAgaWYgKGlkKSB7CiAgICAgIHByb3RvID0gaWRzLmdldChpZCk7CiAgICB9IGVsc2UgewogICAgICBwcm90byA9ICgwLCBfc29tLnNlYXJjaE5vZGUpKGlkcy5nZXQoJHJvb3QpLCB0aGlzLCBzb21FeHByZXNzaW9uLCB0cnVlLCBmYWxzZSk7CiAgICAgIGlmIChwcm90bykgewogICAgICAgIHByb3RvID0gcHJvdG9bMF07CiAgICAgIH0KICAgIH0KICAgIGlmICghcHJvdG8pIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBYRkEgLSBJbnZhbGlkIHByb3RvdHlwZSByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAocHJvdG9bJG5vZGVOYW1lXSAhPT0gdGhpc1skbm9kZU5hbWVdKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW5jb21wYXRpYmxlIHByb3RvdHlwZTogJHtwcm90b1skbm9kZU5hbWVdfSAhPT0gJHt0aGlzWyRub2RlTmFtZV19LmApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChhbmNlc3RvcnMuaGFzKHByb3RvKSkgewogICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEN5Y2xlIGRldGVjdGVkIGluIHByb3RvdHlwZXMgdXNlLmApOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGFuY2VzdG9ycy5hZGQocHJvdG8pOwogICAgY29uc3QgcHJvdG9Qcm90byA9IHByb3RvW19nZXRQcm90b3R5cGVdKGlkcywgYW5jZXN0b3JzKTsKICAgIGlmIChwcm90b1Byb3RvKSB7CiAgICAgIHByb3RvW19hcHBseVByb3RvdHlwZV0ocHJvdG9Qcm90bywgaWRzLCBhbmNlc3RvcnMpOwogICAgfQogICAgcHJvdG9bJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICBhbmNlc3RvcnMuZGVsZXRlKHByb3RvKTsKICAgIHJldHVybiBwcm90bzsKICB9CiAgW19hcHBseVByb3RvdHlwZV0ocHJvdG8sIGlkcywgYW5jZXN0b3JzKSB7CiAgICBpZiAoYW5jZXN0b3JzLmhhcyhwcm90bykpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBYRkEgLSBDeWNsZSBkZXRlY3RlZCBpbiBwcm90b3R5cGVzIHVzZS5gKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCF0aGlzWyRjb250ZW50XSAmJiBwcm90b1skY29udGVudF0pIHsKICAgICAgdGhpc1skY29udGVudF0gPSBwcm90b1skY29udGVudF07CiAgICB9CiAgICBjb25zdCBuZXdBbmNlc3RvcnMgPSBuZXcgU2V0KGFuY2VzdG9ycyk7CiAgICBuZXdBbmNlc3RvcnMuYWRkKHByb3RvKTsKICAgIGZvciAoY29uc3QgdW5zZXRBdHRyTmFtZSBvZiB0aGlzW19nZXRVbnNldEF0dHJpYnV0ZXNdKHByb3RvW19zZXRBdHRyaWJ1dGVzXSkpIHsKICAgICAgdGhpc1t1bnNldEF0dHJOYW1lXSA9IHByb3RvW3Vuc2V0QXR0ck5hbWVdOwogICAgICBpZiAodGhpc1tfc2V0QXR0cmlidXRlc10pIHsKICAgICAgICB0aGlzW19zZXRBdHRyaWJ1dGVzXS5hZGQodW5zZXRBdHRyTmFtZSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBpZiAodGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgY29uc3QgcHJvdG9WYWx1ZSA9IHByb3RvW25hbWVdOwogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBYRkFPYmplY3RBcnJheSkgewogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdmFsdWVbX2NoaWxkcmVuXSkgewogICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSB2YWx1ZVtfY2hpbGRyZW5dLmxlbmd0aCwgaWkgPSBwcm90b1ZhbHVlW19jaGlsZHJlbl0ubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICAgICAgY29uc3QgY2hpbGQgPSBwcm90b1tfY2hpbGRyZW5dW2ldWyRjbG9uZV0oKTsKICAgICAgICAgIGlmICh2YWx1ZS5wdXNoKGNoaWxkKSkgewogICAgICAgICAgICBjaGlsZFtfcGFyZW50XSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXNbX2NoaWxkcmVuXS5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgdmFsdWVbJHJlc29sdmVQcm90b3R5cGVzXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgICAgaWYgKHByb3RvVmFsdWUpIHsKICAgICAgICAgIHZhbHVlW19hcHBseVByb3RvdHlwZV0ocHJvdG9WYWx1ZSwgaWRzLCBhbmNlc3RvcnMpOwogICAgICAgIH0KICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAocHJvdG9WYWx1ZSAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGNoaWxkID0gcHJvdG9WYWx1ZVskY2xvbmVdKCk7CiAgICAgICAgY2hpbGRbX3BhcmVudF0gPSB0aGlzOwogICAgICAgIHRoaXNbbmFtZV0gPSBjaGlsZDsKICAgICAgICB0aGlzW19jaGlsZHJlbl0ucHVzaChjaGlsZCk7CiAgICAgICAgY2hpbGRbX3Jlc29sdmVQcm90b3R5cGVzSGVscGVyXShpZHMsIGFuY2VzdG9ycyk7CiAgICAgIH0KICAgIH0KICB9CiAgc3RhdGljIFtfY2xvbmVBdHRyaWJ1dGVdKG9iaikgewogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICByZXR1cm4gb2JqLm1hcCh4ID0+IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHgpKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JqID09PSAib2JqZWN0IiAmJiBvYmogIT09IG51bGwpIHsKICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIG9iaik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBbJGNsb25lXSgpIHsKICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykpOwogICAgZm9yIChjb25zdCAkc3ltYm9sIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGhpcykpIHsKICAgICAgdHJ5IHsKICAgICAgICBjbG9uZVskc3ltYm9sXSA9IHRoaXNbJHN5bWJvbF07CiAgICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICAoMCwgX3V0aWwuc2hhZG93KShjbG9uZSwgJHN5bWJvbCwgdGhpc1skc3ltYm9sXSk7CiAgICAgIH0KICAgIH0KICAgIGNsb25lWyR1aWRdID0gYCR7Y2xvbmVbJG5vZGVOYW1lXX0ke3VpZCsrfWA7CiAgICBjbG9uZVtfY2hpbGRyZW5dID0gW107CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKHRoaXNbX2F0dHJpYnV0ZU5hbWVzXS5oYXMobmFtZSkpIHsKICAgICAgICBjbG9uZVtuYW1lXSA9IFhGQU9iamVjdFtfY2xvbmVBdHRyaWJ1dGVdKHRoaXNbbmFtZV0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXTsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICBjbG9uZVtuYW1lXSA9IG5ldyBYRkFPYmplY3RBcnJheSh2YWx1ZVtfbWF4XSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xvbmVbbmFtZV0gPSBudWxsOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBjb25zdCBuYW1lID0gY2hpbGRbJG5vZGVOYW1lXTsKICAgICAgY29uc3QgY2xvbmVkQ2hpbGQgPSBjaGlsZFskY2xvbmVdKCk7CiAgICAgIGNsb25lW19jaGlsZHJlbl0ucHVzaChjbG9uZWRDaGlsZCk7CiAgICAgIGNsb25lZENoaWxkW19wYXJlbnRdID0gY2xvbmU7CiAgICAgIGlmIChjbG9uZVtuYW1lXSA9PT0gbnVsbCkgewogICAgICAgIGNsb25lW25hbWVdID0gY2xvbmVkQ2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2xvbmVbbmFtZV1bX2NoaWxkcmVuXS5wdXNoKGNsb25lZENoaWxkKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KICBbJGdldENoaWxkcmVuXShuYW1lID0gbnVsbCkgewogICAgaWYgKCFuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl07CiAgICB9CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmZpbHRlcihjID0+IGNbJG5vZGVOYW1lXSA9PT0gbmFtZSk7CiAgfQogIFskZ2V0Q2hpbGRyZW5CeUNsYXNzXShuYW1lKSB7CiAgICByZXR1cm4gdGhpc1tuYW1lXTsKICB9CiAgWyRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0ID0gdHJ1ZSkgewogICAgcmV0dXJuIEFycmF5LmZyb20odGhpc1skZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIGZpcnN0KSk7CiAgfQogICpbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50LCBmaXJzdCA9IHRydWUpIHsKICAgIGlmIChuYW1lID09PSAicGFyZW50IikgewogICAgICB5aWVsZCB0aGlzW19wYXJlbnRdOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBpZiAoY2hpbGRbJG5vZGVOYW1lXSA9PT0gbmFtZSkgewogICAgICAgIHlpZWxkIGNoaWxkOwogICAgICB9CiAgICAgIGlmIChjaGlsZC5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgeWllbGQgY2hpbGQ7CiAgICAgIH0KICAgICAgaWYgKGFsbFRyYW5zcGFyZW50IHx8IGNoaWxkWyRpc1RyYW5zcGFyZW50XSgpKSB7CiAgICAgICAgeWllbGQqIGNoaWxkWyRnZXRDaGlsZHJlbkJ5TmFtZUl0XShuYW1lLCBhbGxUcmFuc3BhcmVudCwgZmFsc2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoZmlyc3QgJiYgdGhpc1tfYXR0cmlidXRlTmFtZXNdLmhhcyhuYW1lKSkgewogICAgICB5aWVsZCBuZXcgWEZBQXR0cmlidXRlKHRoaXMsIG5hbWUsIHRoaXNbbmFtZV0pOwogICAgfQogIH0KfQpleHBvcnRzLlhGQU9iamVjdCA9IFhGQU9iamVjdDsKY2xhc3MgWEZBT2JqZWN0QXJyYXkgewogIGNvbnN0cnVjdG9yKG1heCA9IEluZmluaXR5KSB7CiAgICB0aGlzW19tYXhdID0gbWF4OwogICAgdGhpc1tfY2hpbGRyZW5dID0gW107CiAgfQogIHB1c2goY2hpbGQpIHsKICAgIGNvbnN0IGxlbiA9IHRoaXNbX2NoaWxkcmVuXS5sZW5ndGg7CiAgICBpZiAobGVuIDw9IHRoaXNbX21heF0pIHsKICAgICAgdGhpc1tfY2hpbGRyZW5dLnB1c2goY2hpbGQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gbm9kZSAiJHtjaGlsZFskbm9kZU5hbWVdfSIgYWNjZXB0cyBubyBtb3JlIHRoYW4gJHt0aGlzW19tYXhdfSBjaGlsZHJlbmApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpc0VtcHR5KCkgewogICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPT09IDA7CiAgfQogIGR1bXAoKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMSA/IHRoaXNbX2NoaWxkcmVuXVswXVskZHVtcF0oKSA6IHRoaXNbX2NoaWxkcmVuXS5tYXAoeCA9PiB4WyRkdW1wXSgpKTsKICB9CiAgWyRjbG9uZV0oKSB7CiAgICBjb25zdCBjbG9uZSA9IG5ldyBYRkFPYmplY3RBcnJheSh0aGlzW19tYXhdKTsKICAgIGNsb25lW19jaGlsZHJlbl0gPSB0aGlzW19jaGlsZHJlbl0ubWFwKGMgPT4gY1skY2xvbmVdKCkpOwogICAgcmV0dXJuIGNsb25lOwogIH0KICBnZXQgY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dOwogIH0KICBjbGVhcigpIHsKICAgIHRoaXNbX2NoaWxkcmVuXS5sZW5ndGggPSAwOwogIH0KfQpleHBvcnRzLlhGQU9iamVjdEFycmF5ID0gWEZBT2JqZWN0QXJyYXk7CmNsYXNzIFhGQUF0dHJpYnV0ZSB7CiAgY29uc3RydWN0b3Iobm9kZSwgbmFtZSwgdmFsdWUpIHsKICAgIHRoaXNbX3BhcmVudF0gPSBub2RlOwogICAgdGhpc1skbm9kZU5hbWVdID0gbmFtZTsKICAgIHRoaXNbJGNvbnRlbnRdID0gdmFsdWU7CiAgICB0aGlzWyRjb25zdW1lZF0gPSBmYWxzZTsKICAgIHRoaXNbJHVpZF0gPSBgYXR0cmlidXRlJHt1aWQrK31gOwogIH0KICBbJGdldFBhcmVudF0oKSB7CiAgICByZXR1cm4gdGhpc1tfcGFyZW50XTsKICB9CiAgWyRpc0RhdGFWYWx1ZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRnZXREYXRhVmFsdWVdKCkgewogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIHZhbHVlID0gdmFsdWUudmFsdWUgfHwgIiI7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgfQogIFskdGV4dF0oKSB7CiAgICByZXR1cm4gdGhpc1skY29udGVudF07CiAgfQogIFskaXNEZXNjZW5kZW50XShwYXJlbnQpIHsKICAgIHJldHVybiB0aGlzW19wYXJlbnRdID09PSBwYXJlbnQgfHwgdGhpc1tfcGFyZW50XVskaXNEZXNjZW5kZW50XShwYXJlbnQpOwogIH0KfQpleHBvcnRzLlhGQUF0dHJpYnV0ZSA9IFhGQUF0dHJpYnV0ZTsKY2xhc3MgWG1sT2JqZWN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lLCBhdHRyaWJ1dGVzID0ge30pIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1skY29udGVudF0gPSAiIjsKICAgIHRoaXNbX2RhdGFWYWx1ZV0gPSBudWxsOwogICAgaWYgKG5hbWUgIT09ICIjdGV4dCIpIHsKICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpOwogICAgICB0aGlzW19hdHRyaWJ1dGVzXSA9IG1hcDsKICAgICAgZm9yIChjb25zdCBbYXR0ck5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkgewogICAgICAgIG1hcC5zZXQoYXR0ck5hbWUsIG5ldyBYRkFBdHRyaWJ1dGUodGhpcywgYXR0ck5hbWUsIHZhbHVlKSk7CiAgICAgIH0KICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoJG5zQXR0cmlidXRlcykpIHsKICAgICAgICBjb25zdCBkYXRhTm9kZSA9IGF0dHJpYnV0ZXNbJG5zQXR0cmlidXRlc10ueGZhLmRhdGFOb2RlOwogICAgICAgIGlmIChkYXRhTm9kZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpZiAoZGF0YU5vZGUgPT09ICJkYXRhR3JvdXAiKSB7CiAgICAgICAgICAgIHRoaXNbX2RhdGFWYWx1ZV0gPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YU5vZGUgPT09ICJkYXRhVmFsdWUiKSB7CiAgICAgICAgICAgIHRoaXNbX2RhdGFWYWx1ZV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdGhpc1skY29uc3VtZWRdID0gZmFsc2U7CiAgfQogIFskdG9TdHJpbmddKGJ1ZikgewogICAgY29uc3QgdGFnTmFtZSA9IHRoaXNbJG5vZGVOYW1lXTsKICAgIGlmICh0YWdOYW1lID09PSAiI3RleHQiKSB7CiAgICAgIGJ1Zi5wdXNoKCgwLCBfY29yZV91dGlscy5lbmNvZGVUb1htbFN0cmluZykodGhpc1skY29udGVudF0pKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdXRmOFRhZ05hbWUgPSAoMCwgX3V0aWwudXRmOFN0cmluZ1RvU3RyaW5nKSh0YWdOYW1lKTsKICAgIGNvbnN0IHByZWZpeCA9IHRoaXNbJG5hbWVzcGFjZUlkXSA9PT0gTlNfREFUQVNFVFMgPyAieGZhOiIgOiAiIjsKICAgIGJ1Zi5wdXNoKGA8JHtwcmVmaXh9JHt1dGY4VGFnTmFtZX1gKTsKICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB0aGlzW19hdHRyaWJ1dGVzXS5lbnRyaWVzKCkpIHsKICAgICAgY29uc3QgdXRmOE5hbWUgPSAoMCwgX3V0aWwudXRmOFN0cmluZ1RvU3RyaW5nKShuYW1lKTsKICAgICAgYnVmLnB1c2goYCAke3V0ZjhOYW1lfT0iJHsoMCwgX2NvcmVfdXRpbHMuZW5jb2RlVG9YbWxTdHJpbmcpKHZhbHVlWyRjb250ZW50XSl9ImApOwogICAgfQogICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0gIT09IG51bGwpIHsKICAgICAgaWYgKHRoaXNbX2RhdGFWYWx1ZV0pIHsKICAgICAgICBidWYucHVzaChgIHhmYTpkYXRhTm9kZT0iZGF0YVZhbHVlImApOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1Zi5wdXNoKGAgeGZhOmRhdGFOb2RlPSJkYXRhR3JvdXAiYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhpc1skY29udGVudF0gJiYgdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCkgewogICAgICBidWYucHVzaCgiLz4iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYnVmLnB1c2goIj4iKTsKICAgIGlmICh0aGlzWyRjb250ZW50XSkgewogICAgICBpZiAodHlwZW9mIHRoaXNbJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICAgIGJ1Zi5wdXNoKCgwLCBfY29yZV91dGlscy5lbmNvZGVUb1htbFN0cmluZykodGhpc1skY29udGVudF0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzWyRjb250ZW50XVskdG9TdHJpbmddKGJ1Zik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfY2hpbGRyZW5dKSB7CiAgICAgICAgY2hpbGRbJHRvU3RyaW5nXShidWYpOwogICAgICB9CiAgICB9CiAgICBidWYucHVzaChgPC8ke3ByZWZpeH0ke3V0ZjhUYWdOYW1lfT5gKTsKICB9CiAgWyRvbkNoaWxkXShjaGlsZCkgewogICAgaWYgKHRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIGNvbnN0IG5vZGUgPSBuZXcgWG1sT2JqZWN0KHRoaXNbJG5hbWVzcGFjZUlkXSwgIiN0ZXh0Iik7CiAgICAgIHRoaXNbJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgbm9kZVskY29udGVudF0gPSB0aGlzWyRjb250ZW50XTsKICAgICAgdGhpc1skY29udGVudF0gPSAiIjsKICAgIH0KICAgIHRoaXNbJGFwcGVuZENoaWxkXShjaGlsZCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgWyRvblRleHRdKHN0cikgewogICAgdGhpc1skY29udGVudF0gKz0gc3RyOwogIH0KICBbJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzWyRjb250ZW50XSAmJiB0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID4gMCkgewogICAgICBjb25zdCBub2RlID0gbmV3IFhtbE9iamVjdCh0aGlzWyRuYW1lc3BhY2VJZF0sICIjdGV4dCIpOwogICAgICB0aGlzWyRhcHBlbmRDaGlsZF0obm9kZSk7CiAgICAgIG5vZGVbJGNvbnRlbnRdID0gdGhpc1skY29udGVudF07CiAgICAgIGRlbGV0ZSB0aGlzWyRjb250ZW50XTsKICAgIH0KICB9CiAgWyR0b0hUTUxdKCkgewogICAgaWYgKHRoaXNbJG5vZGVOYW1lXSA9PT0gIiN0ZXh0IikgewogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogIiN0ZXh0IiwKICAgICAgICB2YWx1ZTogdGhpc1skY29udGVudF0KICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuRU1QVFk7CiAgfQogIFskZ2V0Q2hpbGRyZW5dKG5hbWUgPSBudWxsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXNbX2NoaWxkcmVuXTsKICAgIH0KICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl0uZmlsdGVyKGMgPT4gY1skbm9kZU5hbWVdID09PSBuYW1lKTsKICB9CiAgWyRnZXRBdHRyaWJ1dGVzXSgpIHsKICAgIHJldHVybiB0aGlzW19hdHRyaWJ1dGVzXTsKICB9CiAgWyRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGdldENoaWxkcmVuXShuYW1lKTsKICB9CiAgKlskZ2V0Q2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQpIHsKICAgIGNvbnN0IHZhbHVlID0gdGhpc1tfYXR0cmlidXRlc10uZ2V0KG5hbWUpOwogICAgaWYgKHZhbHVlKSB7CiAgICAgIHlpZWxkIHZhbHVlOwogICAgfQogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgaWYgKGNoaWxkWyRub2RlTmFtZV0gPT09IG5hbWUpIHsKICAgICAgICB5aWVsZCBjaGlsZDsKICAgICAgfQogICAgICBpZiAoYWxsVHJhbnNwYXJlbnQpIHsKICAgICAgICB5aWVsZCogY2hpbGRbJGdldENoaWxkcmVuQnlOYW1lSXRdKG5hbWUsIGFsbFRyYW5zcGFyZW50KTsKICAgICAgfQogICAgfQogIH0KICAqWyRnZXRBdHRyaWJ1dGVJdF0obmFtZSwgc2tpcENvbnN1bWVkKSB7CiAgICBjb25zdCB2YWx1ZSA9IHRoaXNbX2F0dHJpYnV0ZXNdLmdldChuYW1lKTsKICAgIGlmICh2YWx1ZSAmJiAoIXNraXBDb25zdW1lZCB8fCAhdmFsdWVbJGNvbnN1bWVkXSkpIHsKICAgICAgeWllbGQgdmFsdWU7CiAgICB9CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICB5aWVsZCogY2hpbGRbJGdldEF0dHJpYnV0ZUl0XShuYW1lLCBza2lwQ29uc3VtZWQpOwogICAgfQogIH0KICAqWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIHNraXBDb25zdW1lZCkgewogICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW19jaGlsZHJlbl0pIHsKICAgICAgaWYgKGNoaWxkWyRub2RlTmFtZV0gPT09IG5hbWUgJiYgKCFza2lwQ29uc3VtZWQgfHwgIWNoaWxkWyRjb25zdW1lZF0pKSB7CiAgICAgICAgeWllbGQgY2hpbGQ7CiAgICAgIH0KICAgICAgaWYgKGFsbFRyYW5zcGFyZW50KSB7CiAgICAgICAgeWllbGQqIGNoaWxkWyRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgYWxsVHJhbnNwYXJlbnQsIHNraXBDb25zdW1lZCk7CiAgICAgIH0KICAgIH0KICB9CiAgWyRpc0RhdGFWYWx1ZV0oKSB7CiAgICBpZiAodGhpc1tfZGF0YVZhbHVlXSA9PT0gbnVsbCkgewogICAgICByZXR1cm4gdGhpc1tfY2hpbGRyZW5dLmxlbmd0aCA9PT0gMCB8fCB0aGlzW19jaGlsZHJlbl1bMF1bJG5hbWVzcGFjZUlkXSA9PT0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLnhodG1sLmlkOwogICAgfQogICAgcmV0dXJuIHRoaXNbX2RhdGFWYWx1ZV07CiAgfQogIFskZ2V0RGF0YVZhbHVlXSgpIHsKICAgIGlmICh0aGlzW19kYXRhVmFsdWVdID09PSBudWxsKSB7CiAgICAgIGlmICh0aGlzW19jaGlsZHJlbl0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1tfY2hpbGRyZW5dWzBdWyRuYW1lc3BhY2VJZF0gPT09IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy54aHRtbC5pZCkgewogICAgICAgIHJldHVybiB0aGlzW19jaGlsZHJlbl1bMF1bJHRleHRdKCkudHJpbSgpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHRoaXNbJGNvbnRlbnRdLnRyaW0oKTsKICB9CiAgWyRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIHZhbHVlID0gdmFsdWUudmFsdWUgfHwgIiI7CiAgICB0aGlzWyRjb250ZW50XSA9IHZhbHVlLnRvU3RyaW5nKCk7CiAgfQogIFskZHVtcF0oaGFzTlMgPSBmYWxzZSkgewogICAgY29uc3QgZHVtcGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmIChoYXNOUykgewogICAgICBkdW1wZWQuJG5zID0gdGhpc1skbmFtZXNwYWNlSWRdOwogICAgfQogICAgaWYgKHRoaXNbJGNvbnRlbnRdKSB7CiAgICAgIGR1bXBlZC4kY29udGVudCA9IHRoaXNbJGNvbnRlbnRdOwogICAgfQogICAgZHVtcGVkLiRuYW1lID0gdGhpc1skbm9kZU5hbWVdOwogICAgZHVtcGVkLmNoaWxkcmVuID0gW107CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXNbX2NoaWxkcmVuXSkgewogICAgICBkdW1wZWQuY2hpbGRyZW4ucHVzaChjaGlsZFskZHVtcF0oaGFzTlMpKTsKICAgIH0KICAgIGR1bXBlZC5hdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB0aGlzW19hdHRyaWJ1dGVzXSkgewogICAgICBkdW1wZWQuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlWyRjb250ZW50XTsKICAgIH0KICAgIHJldHVybiBkdW1wZWQ7CiAgfQp9CmV4cG9ydHMuWG1sT2JqZWN0ID0gWG1sT2JqZWN0OwpjbGFzcyBDb250ZW50T2JqZWN0IGV4dGVuZHMgWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lKSB7CiAgICBzdXBlcihuc0lkLCBuYW1lKTsKICAgIHRoaXNbJGNvbnRlbnRdID0gIiI7CiAgfQogIFskb25UZXh0XSh0ZXh0KSB7CiAgICB0aGlzWyRjb250ZW50XSArPSB0ZXh0OwogIH0KICBbJGZpbmFsaXplXSgpIHt9Cn0KZXhwb3J0cy5Db250ZW50T2JqZWN0ID0gQ29udGVudE9iamVjdDsKY2xhc3MgT3B0aW9uT2JqZWN0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSwgb3B0aW9ucykgewogICAgc3VwZXIobnNJZCwgbmFtZSk7CiAgICB0aGlzW19vcHRpb25zXSA9IG9wdGlvbnM7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSAoMCwgX3V0aWxzLmdldEtleXdvcmQpKHsKICAgICAgZGF0YTogdGhpc1skY29udGVudF0sCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpc1tfb3B0aW9uc11bMF0sCiAgICAgIHZhbGlkYXRlOiBrID0+IHRoaXNbX29wdGlvbnNdLmluY2x1ZGVzKGspCiAgICB9KTsKICB9CiAgWyRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbJGNsZWFuXShidWlsZGVyKTsKICAgIGRlbGV0ZSB0aGlzW19vcHRpb25zXTsKICB9Cn0KZXhwb3J0cy5PcHRpb25PYmplY3QgPSBPcHRpb25PYmplY3Q7CmNsYXNzIFN0cmluZ09iamVjdCBleHRlbmRzIENvbnRlbnRPYmplY3QgewogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSB0aGlzWyRjb250ZW50XS50cmltKCk7CiAgfQp9CmV4cG9ydHMuU3RyaW5nT2JqZWN0ID0gU3RyaW5nT2JqZWN0OwpjbGFzcyBJbnRlZ2VyT2JqZWN0IGV4dGVuZHMgQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSwgZGVmYXVsdFZhbHVlLCB2YWxpZGF0b3IpIHsKICAgIHN1cGVyKG5zSWQsIG5hbWUpOwogICAgdGhpc1tfZGVmYXVsdFZhbHVlXSA9IGRlZmF1bHRWYWx1ZTsKICAgIHRoaXNbX3ZhbGlkYXRvcl0gPSB2YWxpZGF0b3I7CiAgfQogIFskZmluYWxpemVdKCkgewogICAgdGhpc1skY29udGVudF0gPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogdGhpc1skY29udGVudF0sCiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpc1tfZGVmYXVsdFZhbHVlXSwKICAgICAgdmFsaWRhdGU6IHRoaXNbX3ZhbGlkYXRvcl0KICAgIH0pOwogIH0KICBbJGNsZWFuXShidWlsZGVyKSB7CiAgICBzdXBlclskY2xlYW5dKGJ1aWxkZXIpOwogICAgZGVsZXRlIHRoaXNbX2RlZmF1bHRWYWx1ZV07CiAgICBkZWxldGUgdGhpc1tfdmFsaWRhdG9yXTsKICB9Cn0KZXhwb3J0cy5JbnRlZ2VyT2JqZWN0ID0gSW50ZWdlck9iamVjdDsKY2xhc3MgT3B0aW9uMDEgZXh0ZW5kcyBJbnRlZ2VyT2JqZWN0IHsKICBjb25zdHJ1Y3Rvcihuc0lkLCBuYW1lKSB7CiAgICBzdXBlcihuc0lkLCBuYW1lLCAwLCBuID0+IG4gPT09IDEpOwogIH0KfQpleHBvcnRzLk9wdGlvbjAxID0gT3B0aW9uMDE7CmNsYXNzIE9wdGlvbjEwIGV4dGVuZHMgSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IobnNJZCwgbmFtZSkgewogICAgc3VwZXIobnNJZCwgbmFtZSwgMSwgbiA9PiBuID09PSAwKTsKICB9Cn0KZXhwb3J0cy5PcHRpb24xMCA9IE9wdGlvbjEwOwoKLyoqKi8gfSksCi8qIDc5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuSFRNTFJlc3VsdCA9IHZvaWQgMDsKZXhwb3J0cy5nZXRCQm94ID0gZ2V0QkJveDsKZXhwb3J0cy5nZXRDb2xvciA9IGdldENvbG9yOwpleHBvcnRzLmdldEZsb2F0ID0gZ2V0RmxvYXQ7CmV4cG9ydHMuZ2V0SW50ZWdlciA9IGdldEludGVnZXI7CmV4cG9ydHMuZ2V0S2V5d29yZCA9IGdldEtleXdvcmQ7CmV4cG9ydHMuZ2V0TWVhc3VyZW1lbnQgPSBnZXRNZWFzdXJlbWVudDsKZXhwb3J0cy5nZXRSYXRpbyA9IGdldFJhdGlvOwpleHBvcnRzLmdldFJlbGV2YW50ID0gZ2V0UmVsZXZhbnQ7CmV4cG9ydHMuZ2V0U3RyaW5nT3B0aW9uID0gZ2V0U3RyaW5nT3B0aW9uOwpleHBvcnRzLnN0cmlwUXVvdGVzID0gc3RyaXBRdW90ZXM7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNvbnN0IGRpbUNvbnZlcnRlcnMgPSB7CiAgcHQ6IHggPT4geCwKICBjbTogeCA9PiB4IC8gMi41NCAqIDcyLAogIG1tOiB4ID0+IHggLyAoMTAgKiAyLjU0KSAqIDcyLAogIGluOiB4ID0+IHggKiA3MiwKICBweDogeCA9PiB4Cn07CmNvbnN0IG1lYXN1cmVtZW50UGF0dGVybiA9IC8oWystXT9cZCtcLj9cZCopKC4qKS87CmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHN0cikgewogIGlmIChzdHIuc3RhcnRzV2l0aCgiJyIpIHx8IHN0ci5zdGFydHNXaXRoKCciJykpIHsKICAgIHJldHVybiBzdHIuc2xpY2UoMSwgLTEpOwogIH0KICByZXR1cm4gc3RyOwp9CmZ1bmN0aW9uIGdldEludGVnZXIoewogIGRhdGEsCiAgZGVmYXVsdFZhbHVlLAogIHZhbGlkYXRlCn0pIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgfQogIGRhdGEgPSBkYXRhLnRyaW0oKTsKICBjb25zdCBuID0gcGFyc2VJbnQoZGF0YSwgMTApOwogIGlmICghaXNOYU4obikgJiYgdmFsaWRhdGUobikpIHsKICAgIHJldHVybiBuOwogIH0KICByZXR1cm4gZGVmYXVsdFZhbHVlOwp9CmZ1bmN0aW9uIGdldEZsb2F0KHsKICBkYXRhLAogIGRlZmF1bHRWYWx1ZSwKICB2YWxpZGF0ZQp9KSB7CiAgaWYgKCFkYXRhKSB7CiAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogIH0KICBkYXRhID0gZGF0YS50cmltKCk7CiAgY29uc3QgbiA9IHBhcnNlRmxvYXQoZGF0YSk7CiAgaWYgKCFpc05hTihuKSAmJiB2YWxpZGF0ZShuKSkgewogICAgcmV0dXJuIG47CiAgfQogIHJldHVybiBkZWZhdWx0VmFsdWU7Cn0KZnVuY3Rpb24gZ2V0S2V5d29yZCh7CiAgZGF0YSwKICBkZWZhdWx0VmFsdWUsCiAgdmFsaWRhdGUKfSkgewogIGlmICghZGF0YSkgewogICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICB9CiAgZGF0YSA9IGRhdGEudHJpbSgpOwogIGlmICh2YWxpZGF0ZShkYXRhKSkgewogICAgcmV0dXJuIGRhdGE7CiAgfQogIHJldHVybiBkZWZhdWx0VmFsdWU7Cn0KZnVuY3Rpb24gZ2V0U3RyaW5nT3B0aW9uKGRhdGEsIG9wdGlvbnMpIHsKICByZXR1cm4gZ2V0S2V5d29yZCh7CiAgICBkYXRhLAogICAgZGVmYXVsdFZhbHVlOiBvcHRpb25zWzBdLAogICAgdmFsaWRhdGU6IGsgPT4gb3B0aW9ucy5pbmNsdWRlcyhrKQogIH0pOwp9CmZ1bmN0aW9uIGdldE1lYXN1cmVtZW50KHN0ciwgZGVmID0gIjAiKSB7CiAgZGVmIHx8PSAiMCI7CiAgaWYgKCFzdHIpIHsKICAgIHJldHVybiBnZXRNZWFzdXJlbWVudChkZWYpOwogIH0KICBjb25zdCBtYXRjaCA9IHN0ci50cmltKCkubWF0Y2gobWVhc3VyZW1lbnRQYXR0ZXJuKTsKICBpZiAoIW1hdGNoKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgY29uc3QgWywgdmFsdWVTdHIsIHVuaXRdID0gbWF0Y2g7CiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlU3RyKTsKICBpZiAoaXNOYU4odmFsdWUpKSB7CiAgICByZXR1cm4gZ2V0TWVhc3VyZW1lbnQoZGVmKTsKICB9CiAgaWYgKHZhbHVlID09PSAwKSB7CiAgICByZXR1cm4gMDsKICB9CiAgY29uc3QgY29udiA9IGRpbUNvbnZlcnRlcnNbdW5pdF07CiAgaWYgKGNvbnYpIHsKICAgIHJldHVybiBjb252KHZhbHVlKTsKICB9CiAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIGdldFJhdGlvKGRhdGEpIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIG51bTogMSwKICAgICAgZGVuOiAxCiAgICB9OwogIH0KICBjb25zdCByYXRpbyA9IGRhdGEudHJpbSgpLnNwbGl0KC9ccyo6XHMqLykubWFwKHggPT4gcGFyc2VGbG9hdCh4KSkuZmlsdGVyKHggPT4gIWlzTmFOKHgpKTsKICBpZiAocmF0aW8ubGVuZ3RoID09PSAxKSB7CiAgICByYXRpby5wdXNoKDEpOwogIH0KICBpZiAocmF0aW8ubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gewogICAgICBudW06IDEsCiAgICAgIGRlbjogMQogICAgfTsKICB9CiAgY29uc3QgW251bSwgZGVuXSA9IHJhdGlvOwogIHJldHVybiB7CiAgICBudW0sCiAgICBkZW4KICB9Owp9CmZ1bmN0aW9uIGdldFJlbGV2YW50KGRhdGEpIHsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiBbXTsKICB9CiAgcmV0dXJuIGRhdGEudHJpbSgpLnNwbGl0KC9ccysvKS5tYXAoZSA9PiB7CiAgICByZXR1cm4gewogICAgICBleGNsdWRlZDogZVswXSA9PT0gIi0iLAogICAgICB2aWV3bmFtZTogZS5zdWJzdHJpbmcoMSkKICAgIH07CiAgfSk7Cn0KZnVuY3Rpb24gZ2V0Q29sb3IoZGF0YSwgZGVmID0gWzAsIDAsIDBdKSB7CiAgbGV0IFtyLCBnLCBiXSA9IGRlZjsKICBpZiAoIWRhdGEpIHsKICAgIHJldHVybiB7CiAgICAgIHIsCiAgICAgIGcsCiAgICAgIGIKICAgIH07CiAgfQogIGNvbnN0IGNvbG9yID0gZGF0YS50cmltKCkuc3BsaXQoL1xzKixccyovKS5tYXAoYyA9PiBNYXRoLm1pbihNYXRoLm1heCgwLCBwYXJzZUludChjLnRyaW0oKSwgMTApKSwgMjU1KSkubWFwKGMgPT4gaXNOYU4oYykgPyAwIDogYyk7CiAgaWYgKGNvbG9yLmxlbmd0aCA8IDMpIHsKICAgIHJldHVybiB7CiAgICAgIHIsCiAgICAgIGcsCiAgICAgIGIKICAgIH07CiAgfQogIFtyLCBnLCBiXSA9IGNvbG9yOwogIHJldHVybiB7CiAgICByLAogICAgZywKICAgIGIKICB9Owp9CmZ1bmN0aW9uIGdldEJCb3goZGF0YSkgewogIGNvbnN0IGRlZiA9IC0xOwogIGlmICghZGF0YSkgewogICAgcmV0dXJuIHsKICAgICAgeDogZGVmLAogICAgICB5OiBkZWYsCiAgICAgIHdpZHRoOiBkZWYsCiAgICAgIGhlaWdodDogZGVmCiAgICB9OwogIH0KICBjb25zdCBiYm94ID0gZGF0YS50cmltKCkuc3BsaXQoL1xzKixccyovKS5tYXAobSA9PiBnZXRNZWFzdXJlbWVudChtLCAiLTEiKSk7CiAgaWYgKGJib3gubGVuZ3RoIDwgNCB8fCBiYm94WzJdIDwgMCB8fCBiYm94WzNdIDwgMCkgewogICAgcmV0dXJuIHsKICAgICAgeDogZGVmLAogICAgICB5OiBkZWYsCiAgICAgIHdpZHRoOiBkZWYsCiAgICAgIGhlaWdodDogZGVmCiAgICB9OwogIH0KICBjb25zdCBbeCwgeSwgd2lkdGgsIGhlaWdodF0gPSBiYm94OwogIHJldHVybiB7CiAgICB4LAogICAgeSwKICAgIHdpZHRoLAogICAgaGVpZ2h0CiAgfTsKfQpjbGFzcyBIVE1MUmVzdWx0IHsKICBzdGF0aWMgZ2V0IEZBSUxVUkUoKSB7CiAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgIkZBSUxVUkUiLCBuZXcgSFRNTFJlc3VsdChmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwogIH0KICBzdGF0aWMgZ2V0IEVNUFRZKCkgewogICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsICJFTVBUWSIsIG5ldyBIVE1MUmVzdWx0KHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKICB9CiAgY29uc3RydWN0b3Ioc3VjY2VzcywgaHRtbCwgYmJveCwgYnJlYWtOb2RlKSB7CiAgICB0aGlzLnN1Y2Nlc3MgPSBzdWNjZXNzOwogICAgdGhpcy5odG1sID0gaHRtbDsKICAgIHRoaXMuYmJveCA9IGJib3g7CiAgICB0aGlzLmJyZWFrTm9kZSA9IGJyZWFrTm9kZTsKICB9CiAgaXNCcmVhaygpIHsKICAgIHJldHVybiAhIXRoaXMuYnJlYWtOb2RlOwogIH0KICBzdGF0aWMgYnJlYWtOb2RlKG5vZGUpIHsKICAgIHJldHVybiBuZXcgSFRNTFJlc3VsdChmYWxzZSwgbnVsbCwgbnVsbCwgbm9kZSk7CiAgfQogIHN0YXRpYyBzdWNjZXNzKGh0bWwsIGJib3ggPSBudWxsKSB7CiAgICByZXR1cm4gbmV3IEhUTUxSZXN1bHQodHJ1ZSwgaHRtbCwgYmJveCwgbnVsbCk7CiAgfQp9CmV4cG9ydHMuSFRNTFJlc3VsdCA9IEhUTUxSZXN1bHQ7CgovKioqLyB9KSwKLyogODAgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5OYW1lc3BhY2VJZHMgPSBleHBvcnRzLiRidWlsZFhGQU9iamVjdCA9IHZvaWQgMDsKY29uc3QgJGJ1aWxkWEZBT2JqZWN0ID0gU3ltYm9sKCk7CmV4cG9ydHMuJGJ1aWxkWEZBT2JqZWN0ID0gJGJ1aWxkWEZBT2JqZWN0Owpjb25zdCBOYW1lc3BhY2VJZHMgPSB7CiAgY29uZmlnOiB7CiAgICBpZDogMCwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hjaS8iKQogIH0sCiAgY29ubmVjdGlvblNldDogewogICAgaWQ6IDEsCiAgICBjaGVjazogbnMgPT4gbnMuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtY29ubmVjdGlvbi1zZXQvIikKICB9LAogIGRhdGFzZXRzOiB7CiAgICBpZDogMiwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIpCiAgfSwKICBmb3JtOiB7CiAgICBpZDogMywKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLyIpCiAgfSwKICBsb2NhbGVTZXQ6IHsKICAgIGlkOiA0LAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWxvY2FsZS1zZXQvIikKICB9LAogIHBkZjogewogICAgaWQ6IDUsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvIgogIH0sCiAgc2lnbmF0dXJlOiB7CiAgICBpZDogNiwKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCiAgfSwKICBzb3VyY2VTZXQ6IHsKICAgIGlkOiA3LAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXNvdXJjZS1zZXQvIikKICB9LAogIHN0eWxlc2hlZXQ6IHsKICAgIGlkOiA4LAogICAgY2hlY2s6IG5zID0+IG5zID09PSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgogIH0sCiAgdGVtcGxhdGU6IHsKICAgIGlkOiA5LAogICAgY2hlY2s6IG5zID0+IG5zLnN0YXJ0c1dpdGgoImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXRlbXBsYXRlLyIpCiAgfSwKICB4ZGM6IHsKICAgIGlkOiAxMCwKICAgIGNoZWNrOiBucyA9PiBucy5zdGFydHNXaXRoKCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hkYy8iKQogIH0sCiAgeGRwOiB7CiAgICBpZDogMTEsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iCiAgfSwKICB4ZmRmOiB7CiAgICBpZDogMTIsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3hmZGYvIgogIH0sCiAgeGh0bWw6IHsKICAgIGlkOiAxMywKICAgIGNoZWNrOiBucyA9PiBucyA9PT0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCiAgfSwKICB4bXBtZXRhOiB7CiAgICBpZDogMTQsCiAgICBjaGVjazogbnMgPT4gbnMgPT09ICJodHRwOi8vbnMuYWRvYmUuY29tL3htcG1ldGEvIgogIH0KfTsKZXhwb3J0cy5OYW1lc3BhY2VJZHMgPSBOYW1lc3BhY2VJZHM7CgovKioqLyB9KSwKLyogODEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5jcmVhdGVEYXRhTm9kZSA9IGNyZWF0ZURhdGFOb2RlOwpleHBvcnRzLnNlYXJjaE5vZGUgPSBzZWFyY2hOb2RlOwp2YXIgX3hmYV9vYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc4KTsKdmFyIF9uYW1lc3BhY2VzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNvbnN0IG5hbWVQYXR0ZXJuID0gL15bXi5bXSsvOwpjb25zdCBpbmRleFBhdHRlcm4gPSAvXlteXF1dKy87CmNvbnN0IG9wZXJhdG9ycyA9IHsKICBkb3Q6IDAsCiAgZG90RG90OiAxLAogIGRvdEhhc2g6IDIsCiAgZG90QnJhY2tldDogMywKICBkb3RQYXJlbjogNAp9Owpjb25zdCBzaG9ydGN1dHMgPSBuZXcgTWFwKFtbIiRkYXRhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuZGF0YXNldHMgPyByb290LmRhdGFzZXRzLmRhdGEgOiByb290XSwgWyIkcmVjb3JkIiwgKHJvb3QsIGN1cnJlbnQpID0+IChyb290LmRhdGFzZXRzID8gcm9vdC5kYXRhc2V0cy5kYXRhIDogcm9vdClbX3hmYV9vYmplY3QuJGdldENoaWxkcmVuXSgpWzBdXSwgWyIkdGVtcGxhdGUiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC50ZW1wbGF0ZV0sIFsiJGNvbm5lY3Rpb25TZXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5jb25uZWN0aW9uU2V0XSwgWyIkZm9ybSIsIChyb290LCBjdXJyZW50KSA9PiByb290LmZvcm1dLCBbIiRsYXlvdXQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5sYXlvdXRdLCBbIiRob3N0IiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3QuaG9zdF0sIFsiJGRhdGFXaW5kb3ciLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5kYXRhV2luZG93XSwgWyIkZXZlbnQiLCAocm9vdCwgY3VycmVudCkgPT4gcm9vdC5ldmVudF0sIFsiISIsIChyb290LCBjdXJyZW50KSA9PiByb290LmRhdGFzZXRzXSwgWyIkeGZhIiwgKHJvb3QsIGN1cnJlbnQpID0+IHJvb3RdLCBbInhmYSIsIChyb290LCBjdXJyZW50KSA9PiByb290XSwgWyIkIiwgKHJvb3QsIGN1cnJlbnQpID0+IGN1cnJlbnRdXSk7CmNvbnN0IHNvbUNhY2hlID0gbmV3IFdlYWtNYXAoKTsKY29uc3QgTlNfREFUQVNFVFMgPSBfbmFtZXNwYWNlcy5OYW1lc3BhY2VJZHMuZGF0YXNldHMuaWQ7CmZ1bmN0aW9uIHBhcnNlSW5kZXgoaW5kZXgpIHsKICBpbmRleCA9IGluZGV4LnRyaW0oKTsKICBpZiAoaW5kZXggPT09ICIqIikgewogICAgcmV0dXJuIEluZmluaXR5OwogIH0KICByZXR1cm4gcGFyc2VJbnQoaW5kZXgsIDEwKSB8fCAwOwp9CmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByLCBkb3REb3RBbGxvd2VkLCBub0V4cHIgPSB0cnVlKSB7CiAgbGV0IG1hdGNoID0gZXhwci5tYXRjaChuYW1lUGF0dGVybik7CiAgaWYgKCFtYXRjaCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGxldCBbbmFtZV0gPSBtYXRjaDsKICBjb25zdCBwYXJzZWQgPSBbewogICAgbmFtZSwKICAgIGNhY2hlTmFtZTogIi4iICsgbmFtZSwKICAgIGluZGV4OiAwLAogICAganM6IG51bGwsCiAgICBmb3JtQ2FsYzogbnVsbCwKICAgIG9wZXJhdG9yOiBvcGVyYXRvcnMuZG90CiAgfV07CiAgbGV0IHBvcyA9IG5hbWUubGVuZ3RoOwogIHdoaWxlIChwb3MgPCBleHByLmxlbmd0aCkgewogICAgY29uc3Qgc3BvcyA9IHBvczsKICAgIGNvbnN0IGNoYXIgPSBleHByLmNoYXJBdChwb3MrKyk7CiAgICBpZiAoY2hhciA9PT0gIlsiKSB7CiAgICAgIG1hdGNoID0gZXhwci5zbGljZShwb3MpLm1hdGNoKGluZGV4UGF0dGVybik7CiAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIEludmFsaWQgaW5kZXggaW4gU09NIGV4cHJlc3Npb24iKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBwYXJzZWQuYXQoLTEpLmluZGV4ID0gcGFyc2VJbmRleChtYXRjaFswXSk7CiAgICAgIHBvcyArPSBtYXRjaFswXS5sZW5ndGggKyAxOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGxldCBvcGVyYXRvcjsKICAgIHN3aXRjaCAoZXhwci5jaGFyQXQocG9zKSkgewogICAgICBjYXNlICIuIjoKICAgICAgICBpZiAoIWRvdERvdEFsbG93ZWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwb3MrKzsKICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3REb3Q7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIiMiOgogICAgICAgIHBvcysrOwogICAgICAgIG9wZXJhdG9yID0gb3BlcmF0b3JzLmRvdEhhc2g7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIlsiOgogICAgICAgIGlmIChub0V4cHIpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKSgiWEZBIC0gU09NIGV4cHJlc3Npb24gY29udGFpbnMgYSBGb3JtQ2FsYyBzdWJleHByZXNzaW9uIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdy4iKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3RCcmFja2V0OwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICIoIjoKICAgICAgICBpZiAobm9FeHByKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIFNPTSBleHByZXNzaW9uIGNvbnRhaW5zIGEgSmF2YVNjcmlwdCBzdWJleHByZXNzaW9uIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdy4iKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3RQYXJlbjsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBvcGVyYXRvciA9IG9wZXJhdG9ycy5kb3Q7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBtYXRjaCA9IGV4cHIuc2xpY2UocG9zKS5tYXRjaChuYW1lUGF0dGVybik7CiAgICBpZiAoIW1hdGNoKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgW25hbWVdID0gbWF0Y2g7CiAgICBwb3MgKz0gbmFtZS5sZW5ndGg7CiAgICBwYXJzZWQucHVzaCh7CiAgICAgIG5hbWUsCiAgICAgIGNhY2hlTmFtZTogZXhwci5zbGljZShzcG9zLCBwb3MpLAogICAgICBvcGVyYXRvciwKICAgICAgaW5kZXg6IDAsCiAgICAgIGpzOiBudWxsLAogICAgICBmb3JtQ2FsYzogbnVsbAogICAgfSk7CiAgfQogIHJldHVybiBwYXJzZWQ7Cn0KZnVuY3Rpb24gc2VhcmNoTm9kZShyb290LCBjb250YWluZXIsIGV4cHIsIGRvdERvdEFsbG93ZWQgPSB0cnVlLCB1c2VDYWNoZSA9IHRydWUpIHsKICBjb25zdCBwYXJzZWQgPSBwYXJzZUV4cHJlc3Npb24oZXhwciwgZG90RG90QWxsb3dlZCk7CiAgaWYgKCFwYXJzZWQpIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBmbiA9IHNob3J0Y3V0cy5nZXQocGFyc2VkWzBdLm5hbWUpOwogIGxldCBpID0gMDsKICBsZXQgaXNRdWFsaWZpZWQ7CiAgaWYgKGZuKSB7CiAgICBpc1F1YWxpZmllZCA9IHRydWU7CiAgICByb290ID0gW2ZuKHJvb3QsIGNvbnRhaW5lcildOwogICAgaSA9IDE7CiAgfSBlbHNlIHsKICAgIGlzUXVhbGlmaWVkID0gY29udGFpbmVyID09PSBudWxsOwogICAgcm9vdCA9IFtjb250YWluZXIgfHwgcm9vdF07CiAgfQogIGZvciAobGV0IGlpID0gcGFyc2VkLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHsKICAgICAgbmFtZSwKICAgICAgY2FjaGVOYW1lLAogICAgICBvcGVyYXRvciwKICAgICAgaW5kZXgKICAgIH0gPSBwYXJzZWRbaV07CiAgICBjb25zdCBub2RlcyA9IFtdOwogICAgZm9yIChjb25zdCBub2RlIG9mIHJvb3QpIHsKICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIF94ZmFfb2JqZWN0LlhGQU9iamVjdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgY2hpbGRyZW4sIGNhY2hlZDsKICAgICAgaWYgKHVzZUNhY2hlKSB7CiAgICAgICAgY2FjaGVkID0gc29tQ2FjaGUuZ2V0KG5vZGUpOwogICAgICAgIGlmICghY2FjaGVkKSB7CiAgICAgICAgICBjYWNoZWQgPSBuZXcgTWFwKCk7CiAgICAgICAgICBzb21DYWNoZS5zZXQobm9kZSwgY2FjaGVkKTsKICAgICAgICB9CiAgICAgICAgY2hpbGRyZW4gPSBjYWNoZWQuZ2V0KGNhY2hlTmFtZSk7CiAgICAgIH0KICAgICAgaWYgKCFjaGlsZHJlbikgewogICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgZmFsc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdERvdDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbkJ5TmFtZV0obmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBvcGVyYXRvcnMuZG90SGFzaDoKICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbkJ5Q2xhc3NdKG5hbWUpOwogICAgICAgICAgICBpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSkgewogICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uY2hpbGRyZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh1c2VDYWNoZSkgewogICAgICAgICAgY2FjaGVkLnNldChjYWNoZU5hbWUsIGNoaWxkcmVuKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgfQogICAgfQogICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCAmJiAhaXNRdWFsaWZpZWQgJiYgaSA9PT0gMCkgewogICAgICBjb25zdCBwYXJlbnQgPSBjb250YWluZXJbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgICAgY29udGFpbmVyID0gcGFyZW50OwogICAgICBpZiAoIWNvbnRhaW5lcikgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGkgPSAtMTsKICAgICAgcm9vdCA9IFtjb250YWluZXJdOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmIChpc0Zpbml0ZShpbmRleCkpIHsKICAgICAgcm9vdCA9IG5vZGVzLmZpbHRlcihub2RlID0+IGluZGV4IDwgbm9kZS5sZW5ndGgpLm1hcChub2RlID0+IG5vZGVbaW5kZXhdKTsKICAgIH0gZWxzZSB7CiAgICAgIHJvb3QgPSBub2Rlcy5mbGF0KCk7CiAgICB9CiAgfQogIGlmIChyb290Lmxlbmd0aCA9PT0gMCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIHJldHVybiByb290Owp9CmZ1bmN0aW9uIGNyZWF0ZU5vZGVzKHJvb3QsIHBhdGgpIHsKICBsZXQgbm9kZSA9IG51bGw7CiAgZm9yIChjb25zdCB7CiAgICBuYW1lLAogICAgaW5kZXgKICB9IG9mIHBhdGgpIHsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9ICFpc0Zpbml0ZShpbmRleCkgPyAwIDogaW5kZXg7IGkgPD0gaWk7IGkrKykgewogICAgICBjb25zdCBuc0lkID0gcm9vdFtfeGZhX29iamVjdC4kbmFtZXNwYWNlSWRdID09PSBOU19EQVRBU0VUUyA/IC0xIDogcm9vdFtfeGZhX29iamVjdC4kbmFtZXNwYWNlSWRdOwogICAgICBub2RlID0gbmV3IF94ZmFfb2JqZWN0LlhtbE9iamVjdChuc0lkLCBuYW1lKTsKICAgICAgcm9vdFtfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgfQogICAgcm9vdCA9IG5vZGU7CiAgfQogIHJldHVybiBub2RlOwp9CmZ1bmN0aW9uIGNyZWF0ZURhdGFOb2RlKHJvb3QsIGNvbnRhaW5lciwgZXhwcikgewogIGNvbnN0IHBhcnNlZCA9IHBhcnNlRXhwcmVzc2lvbihleHByKTsKICBpZiAoIXBhcnNlZCkgewogICAgcmV0dXJuIG51bGw7CiAgfQogIGlmIChwYXJzZWQuc29tZSh4ID0+IHgub3BlcmF0b3IgPT09IG9wZXJhdG9ycy5kb3REb3QpKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgZm4gPSBzaG9ydGN1dHMuZ2V0KHBhcnNlZFswXS5uYW1lKTsKICBsZXQgaSA9IDA7CiAgaWYgKGZuKSB7CiAgICByb290ID0gZm4ocm9vdCwgY29udGFpbmVyKTsKICAgIGkgPSAxOwogIH0gZWxzZSB7CiAgICByb290ID0gY29udGFpbmVyIHx8IHJvb3Q7CiAgfQogIGZvciAobGV0IGlpID0gcGFyc2VkLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgIGNvbnN0IHsKICAgICAgbmFtZSwKICAgICAgb3BlcmF0b3IsCiAgICAgIGluZGV4CiAgICB9ID0gcGFyc2VkW2ldOwogICAgaWYgKCFpc0Zpbml0ZShpbmRleCkpIHsKICAgICAgcGFyc2VkW2ldLmluZGV4ID0gMDsKICAgICAgcmV0dXJuIGNyZWF0ZU5vZGVzKHJvb3QsIHBhcnNlZC5zbGljZShpKSk7CiAgICB9CiAgICBsZXQgY2hpbGRyZW47CiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdDoKICAgICAgICBjaGlsZHJlbiA9IHJvb3RbX3hmYV9vYmplY3QuJGdldENoaWxkcmVuQnlOYW1lXShuYW1lLCBmYWxzZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Ugb3BlcmF0b3JzLmRvdERvdDoKICAgICAgICBjaGlsZHJlbiA9IHJvb3RbX3hmYV9vYmplY3QuJGdldENoaWxkcmVuQnlOYW1lXShuYW1lLCB0cnVlKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBvcGVyYXRvcnMuZG90SGFzaDoKICAgICAgICBjaGlsZHJlbiA9IHJvb3RbX3hmYV9vYmplY3QuJGdldENoaWxkcmVuQnlDbGFzc10obmFtZSk7CiAgICAgICAgaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkpIHsKICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uY2hpbGRyZW47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBjcmVhdGVOb2Rlcyhyb290LCBwYXJzZWQuc2xpY2UoaSkpOwogICAgfQogICAgaWYgKGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baW5kZXhdOwogICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIF94ZmFfb2JqZWN0LlhGQU9iamVjdCkpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIENhbm5vdCBjcmVhdGUgYSBub2RlLmApOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJvb3QgPSBjaGlsZDsKICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlZFtpXS5pbmRleCA9IGluZGV4IC0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICByZXR1cm4gY3JlYXRlTm9kZXMocm9vdCwgcGFyc2VkLnNsaWNlKGkpKTsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn0KCi8qKiovIH0pLAovKiA4MiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkJpbmRlciA9IHZvaWQgMDsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfdGVtcGxhdGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgzKTsKdmFyIF9zb20gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgxKTsKdmFyIF9uYW1lc3BhY2VzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNvbnN0IE5TX0RBVEFTRVRTID0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkOwpmdW5jdGlvbiBjcmVhdGVUZXh0KGNvbnRlbnQpIHsKICBjb25zdCBub2RlID0gbmV3IF90ZW1wbGF0ZS5UZXh0KHt9KTsKICBub2RlW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IGNvbnRlbnQ7CiAgcmV0dXJuIG5vZGU7Cn0KY2xhc3MgQmluZGVyIHsKICBjb25zdHJ1Y3Rvcihyb290KSB7CiAgICB0aGlzLnJvb3QgPSByb290OwogICAgdGhpcy5kYXRhc2V0cyA9IHJvb3QuZGF0YXNldHM7CiAgICBpZiAocm9vdC5kYXRhc2V0cz8uZGF0YSkgewogICAgICB0aGlzLmRhdGEgPSByb290LmRhdGFzZXRzLmRhdGE7CiAgICB9IGVsc2UgewogICAgICB0aGlzLmRhdGEgPSBuZXcgX3hmYV9vYmplY3QuWG1sT2JqZWN0KF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZCwgImRhdGEiKTsKICAgIH0KICAgIHRoaXMuZW1wdHlNZXJnZSA9IHRoaXMuZGF0YVtfeGZhX29iamVjdC4kZ2V0Q2hpbGRyZW5dKCkubGVuZ3RoID09PSAwOwogICAgdGhpcy5yb290LmZvcm0gPSB0aGlzLmZvcm0gPSByb290LnRlbXBsYXRlW194ZmFfb2JqZWN0LiRjbG9uZV0oKTsKICB9CiAgX2lzQ29uc3VtZURhdGEoKSB7CiAgICByZXR1cm4gIXRoaXMuZW1wdHlNZXJnZSAmJiB0aGlzLl9tZXJnZU1vZGU7CiAgfQogIF9pc01hdGNoVGVtcGxhdGUoKSB7CiAgICByZXR1cm4gIXRoaXMuX2lzQ29uc3VtZURhdGEoKTsKICB9CiAgYmluZCgpIHsKICAgIHRoaXMuX2JpbmRFbGVtZW50KHRoaXMuZm9ybSwgdGhpcy5kYXRhKTsKICAgIHJldHVybiB0aGlzLmZvcm07CiAgfQogIGdldERhdGEoKSB7CiAgICByZXR1cm4gdGhpcy5kYXRhOwogIH0KICBfYmluZFZhbHVlKGZvcm1Ob2RlLCBkYXRhLCBwaWN0dXJlKSB7CiAgICBmb3JtTm9kZVtfeGZhX29iamVjdC4kZGF0YV0gPSBkYXRhOwogICAgaWYgKGZvcm1Ob2RlW194ZmFfb2JqZWN0LiRoYXNTZXR0YWJsZVZhbHVlXSgpKSB7CiAgICAgIGlmIChkYXRhW194ZmFfb2JqZWN0LiRpc0RhdGFWYWx1ZV0oKSkgewogICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtfeGZhX29iamVjdC4kZ2V0RGF0YVZhbHVlXSgpOwogICAgICAgIGZvcm1Ob2RlW194ZmFfb2JqZWN0LiRzZXRWYWx1ZV0oY3JlYXRlVGV4dCh2YWx1ZSkpOwogICAgICB9IGVsc2UgaWYgKGZvcm1Ob2RlIGluc3RhbmNlb2YgX3RlbXBsYXRlLkZpZWxkICYmIGZvcm1Ob2RlLnVpPy5jaG9pY2VMaXN0Py5vcGVuID09PSAibXVsdGlTZWxlY3QiKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbl0oKS5tYXAoY2hpbGQgPT4gY2hpbGRbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKSkuam9pbigiXG4iKTsKICAgICAgICBmb3JtTm9kZVtfeGZhX29iamVjdC4kc2V0VmFsdWVdKGNyZWF0ZVRleHQodmFsdWUpKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIE5vZGVzIGhhdmVuJ3QgdGhlIHNhbWUgdHlwZS5gKTsKICAgICAgfQogICAgfSBlbHNlIGlmICghZGF0YVtfeGZhX29iamVjdC4kaXNEYXRhVmFsdWVdKCkgfHwgdGhpcy5faXNNYXRjaFRlbXBsYXRlKCkpIHsKICAgICAgdGhpcy5fYmluZEVsZW1lbnQoZm9ybU5vZGUsIGRhdGEpOwogICAgfSBlbHNlIHsKICAgICAgKDAsIF91dGlsLndhcm4pKGBYRkEgLSBOb2RlcyBoYXZlbid0IHRoZSBzYW1lIHR5cGUuYCk7CiAgICB9CiAgfQogIF9maW5kRGF0YUJ5TmFtZVRvQ29uc3VtZShuYW1lLCBpc1ZhbHVlLCBkYXRhTm9kZSwgZ2xvYmFsKSB7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBsZXQgZ2VuZXJhdG9yLCBtYXRjaDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgIGdlbmVyYXRvciA9IGRhdGFOb2RlW194ZmFfb2JqZWN0LiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgZmFsc2UsIHRydWUpOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIG1hdGNoID0gZ2VuZXJhdG9yLm5leHQoKS52YWx1ZTsKICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVmFsdWUgPT09IG1hdGNoW194ZmFfb2JqZWN0LiRpc0RhdGFWYWx1ZV0oKSkgewogICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGF0YU5vZGVbX3hmYV9vYmplY3QuJG5hbWVzcGFjZUlkXSA9PT0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLmRhdGFzZXRzLmlkICYmIGRhdGFOb2RlW194ZmFfb2JqZWN0LiRub2RlTmFtZV0gPT09ICJkYXRhIikgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRhdGFOb2RlID0gZGF0YU5vZGVbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIH0KICAgIGlmICghZ2xvYmFsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2VuZXJhdG9yID0gdGhpcy5kYXRhW194ZmFfb2JqZWN0LiRnZXRSZWFsQ2hpbGRyZW5CeU5hbWVJdF0obmFtZSwgdHJ1ZSwgZmFsc2UpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIGdlbmVyYXRvciA9IHRoaXMuZGF0YVtfeGZhX29iamVjdC4kZ2V0QXR0cmlidXRlSXRdKG5hbWUsIHRydWUpOwogICAgbWF0Y2ggPSBnZW5lcmF0b3IubmV4dCgpLnZhbHVlOwogICAgaWYgKG1hdGNoPy5bX3hmYV9vYmplY3QuJGlzRGF0YVZhbHVlXSgpKSB7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBfc2V0UHJvcGVydGllcyhmb3JtTm9kZSwgZGF0YU5vZGUpIHsKICAgIGlmICghZm9ybU5vZGUuaGFzT3duUHJvcGVydHkoInNldFByb3BlcnR5IikpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZiwKICAgICAgdGFyZ2V0LAogICAgICBjb25uZWN0aW9uCiAgICB9IG9mIGZvcm1Ob2RlLnNldFByb3BlcnR5LmNoaWxkcmVuKSB7CiAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFyZWYpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBub2RlcyA9ICgwLCBfc29tLnNlYXJjaE5vZGUpKHRoaXMucm9vdCwgZGF0YU5vZGUsIHJlZiwgZmFsc2UsIGZhbHNlKTsKICAgICAgaWYgKCFub2RlcykgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBbbm9kZV0gPSBub2RlczsKICAgICAgaWYgKCFub2RlW194ZmFfb2JqZWN0LiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YSkpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEludmFsaWQgbm9kZTogbXVzdCBiZSBhIGRhdGEgbm9kZS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCB0YXJnZXROb2RlcyA9ICgwLCBfc29tLnNlYXJjaE5vZGUpKHRoaXMucm9vdCwgZm9ybU5vZGUsIHRhcmdldCwgZmFsc2UsIGZhbHNlKTsKICAgICAgaWYgKCF0YXJnZXROb2RlcykgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCB0YXJnZXQ6ICR7dGFyZ2V0fS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBbdGFyZ2V0Tm9kZV0gPSB0YXJnZXROb2RlczsKICAgICAgaWYgKCF0YXJnZXROb2RlW194ZmFfb2JqZWN0LiRpc0Rlc2NlbmRlbnRdKGZvcm1Ob2RlKSkgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IG11c3QgYmUgYSBwcm9wZXJ0eSBvciBzdWJwcm9wZXJ0eS5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCB0YXJnZXRQYXJlbnQgPSB0YXJnZXROb2RlW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICAgIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgX3RlbXBsYXRlLlNldFByb3BlcnR5IHx8IHRhcmdldFBhcmVudCBpbnN0YW5jZW9mIF90ZW1wbGF0ZS5TZXRQcm9wZXJ0eSkgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIHNldFByb3BlcnR5IG9yIG9uZSBvZiBpdHMgcHJvcGVydGllcy5gKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIF90ZW1wbGF0ZS5CaW5kSXRlbXMgfHwgdGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgX3RlbXBsYXRlLkJpbmRJdGVtcykgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCB0YXJnZXQ6IGNhbm5vdCBiZSBhIGJpbmRJdGVtcyBvciBvbmUgb2YgaXRzIHByb3BlcnRpZXMuYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29udGVudCA9IG5vZGVbX3hmYV9vYmplY3QuJHRleHRdKCk7CiAgICAgIGNvbnN0IG5hbWUgPSB0YXJnZXROb2RlW194ZmFfb2JqZWN0LiRub2RlTmFtZV07CiAgICAgIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgX3hmYV9vYmplY3QuWEZBQXR0cmlidXRlKSB7CiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGF0dHJzW25hbWVdID0gY29udGVudDsKICAgICAgICBjb25zdCBvYmogPSBSZWZsZWN0LmNvbnN0cnVjdChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0UGFyZW50KS5jb25zdHJ1Y3RvciwgW2F0dHJzXSk7CiAgICAgICAgdGFyZ2V0UGFyZW50W25hbWVdID0gb2JqW25hbWVdOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghdGFyZ2V0Tm9kZS5oYXNPd25Qcm9wZXJ0eShfeGZhX29iamVjdC4kY29udGVudCkpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEludmFsaWQgbm9kZSB0byB1c2UgaW4gc2V0UHJvcGVydHlgKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0YXJnZXROb2RlW194ZmFfb2JqZWN0LiRkYXRhXSA9IG5vZGU7CiAgICAgIHRhcmdldE5vZGVbX3hmYV9vYmplY3QuJGNvbnRlbnRdID0gY29udGVudDsKICAgICAgdGFyZ2V0Tm9kZVtfeGZhX29iamVjdC4kZmluYWxpemVdKCk7CiAgICB9CiAgfQogIF9iaW5kSXRlbXMoZm9ybU5vZGUsIGRhdGFOb2RlKSB7CiAgICBpZiAoIWZvcm1Ob2RlLmhhc093blByb3BlcnR5KCJpdGVtcyIpIHx8ICFmb3JtTm9kZS5oYXNPd25Qcm9wZXJ0eSgiYmluZEl0ZW1zIikgfHwgZm9ybU5vZGUuYmluZEl0ZW1zLmlzRW1wdHkoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZm9ybU5vZGUuaXRlbXMuY2hpbGRyZW4pIHsKICAgICAgZm9ybU5vZGVbX3hmYV9vYmplY3QuJHJlbW92ZUNoaWxkXShpdGVtKTsKICAgIH0KICAgIGZvcm1Ob2RlLml0ZW1zLmNsZWFyKCk7CiAgICBjb25zdCBsYWJlbHMgPSBuZXcgX3RlbXBsYXRlLkl0ZW1zKHt9KTsKICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBfdGVtcGxhdGUuSXRlbXMoe30pOwogICAgZm9ybU5vZGVbX3hmYV9vYmplY3QuJGFwcGVuZENoaWxkXShsYWJlbHMpOwogICAgZm9ybU5vZGUuaXRlbXMucHVzaChsYWJlbHMpOwogICAgZm9ybU5vZGVbX3hmYV9vYmplY3QuJGFwcGVuZENoaWxkXSh2YWx1ZXMpOwogICAgZm9ybU5vZGUuaXRlbXMucHVzaCh2YWx1ZXMpOwogICAgZm9yIChjb25zdCB7CiAgICAgIHJlZiwKICAgICAgbGFiZWxSZWYsCiAgICAgIHZhbHVlUmVmLAogICAgICBjb25uZWN0aW9uCiAgICB9IG9mIGZvcm1Ob2RlLmJpbmRJdGVtcy5jaGlsZHJlbikgewogICAgICBpZiAoY29ubmVjdGlvbikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICghcmVmKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3Qgbm9kZXMgPSAoMCwgX3NvbS5zZWFyY2hOb2RlKSh0aGlzLnJvb3QsIGRhdGFOb2RlLCByZWYsIGZhbHNlLCBmYWxzZSk7CiAgICAgIGlmICghbm9kZXMpIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEludmFsaWQgcmVmZXJlbmNlOiAke3JlZn0uYCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7CiAgICAgICAgaWYgKCFub2RlW194ZmFfb2JqZWN0LiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEludmFsaWQgcmVmICgke3JlZn0pOiBtdXN0IGJlIGEgZGF0YXNldHMgY2hpbGQuYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWxOb2RlcyA9ICgwLCBfc29tLnNlYXJjaE5vZGUpKHRoaXMucm9vdCwgbm9kZSwgbGFiZWxSZWYsIHRydWUsIGZhbHNlKTsKICAgICAgICBpZiAoIWxhYmVsTm9kZXMpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCBsYWJlbDogJHtsYWJlbFJlZn0uYCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgW2xhYmVsTm9kZV0gPSBsYWJlbE5vZGVzOwogICAgICAgIGlmICghbGFiZWxOb2RlW194ZmFfb2JqZWN0LiRpc0Rlc2NlbmRlbnRdKHRoaXMuZGF0YXNldHMpKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEludmFsaWQgbGFiZWw6IG11c3QgYmUgYSBkYXRhc2V0cyBjaGlsZC5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCB2YWx1ZU5vZGVzID0gKDAsIF9zb20uc2VhcmNoTm9kZSkodGhpcy5yb290LCBub2RlLCB2YWx1ZVJlZiwgdHJ1ZSwgZmFsc2UpOwogICAgICAgIGlmICghdmFsdWVOb2RlcykgewogICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBYRkEgLSBJbnZhbGlkIHZhbHVlOiAke3ZhbHVlUmVmfS5gKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBbdmFsdWVOb2RlXSA9IHZhbHVlTm9kZXM7CiAgICAgICAgaWYgKCF2YWx1ZU5vZGVbX3hmYV9vYmplY3QuJGlzRGVzY2VuZGVudF0odGhpcy5kYXRhc2V0cykpIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBhIGRhdGFzZXRzIGNoaWxkLmApOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxhYmVsID0gY3JlYXRlVGV4dChsYWJlbE5vZGVbX3hmYV9vYmplY3QuJHRleHRdKCkpOwogICAgICAgIGNvbnN0IHZhbHVlID0gY3JlYXRlVGV4dCh2YWx1ZU5vZGVbX3hmYV9vYmplY3QuJHRleHRdKCkpOwogICAgICAgIGxhYmVsc1tfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKGxhYmVsKTsKICAgICAgICBsYWJlbHMudGV4dC5wdXNoKGxhYmVsKTsKICAgICAgICB2YWx1ZXNbX3hmYV9vYmplY3QuJGFwcGVuZENoaWxkXSh2YWx1ZSk7CiAgICAgICAgdmFsdWVzLnRleHQucHVzaCh2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CiAgX2JpbmRPY2N1cnJlbmNlcyhmb3JtTm9kZSwgbWF0Y2hlcywgcGljdHVyZSkgewogICAgbGV0IGJhc2VDbG9uZTsKICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHsKICAgICAgYmFzZUNsb25lID0gZm9ybU5vZGVbX3hmYV9vYmplY3QuJGNsb25lXSgpOwogICAgICBiYXNlQ2xvbmVbX3hmYV9vYmplY3QuJHJlbW92ZUNoaWxkXShiYXNlQ2xvbmUub2NjdXIpOwogICAgICBiYXNlQ2xvbmUub2NjdXIgPSBudWxsOwogICAgfQogICAgdGhpcy5fYmluZFZhbHVlKGZvcm1Ob2RlLCBtYXRjaGVzWzBdLCBwaWN0dXJlKTsKICAgIHRoaXMuX3NldFByb3BlcnRpZXMoZm9ybU5vZGUsIG1hdGNoZXNbMF0pOwogICAgdGhpcy5fYmluZEl0ZW1zKGZvcm1Ob2RlLCBtYXRjaGVzWzBdKTsKICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSBmb3JtTm9kZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgY29uc3QgbmFtZSA9IGZvcm1Ob2RlW194ZmFfb2JqZWN0LiRub2RlTmFtZV07CiAgICBjb25zdCBwb3MgPSBwYXJlbnRbX3hmYV9vYmplY3QuJGluZGV4T2ZdKGZvcm1Ob2RlKTsKICAgIGZvciAobGV0IGkgPSAxLCBpaSA9IG1hdGNoZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykgewogICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXNbaV07CiAgICAgIGNvbnN0IGNsb25lID0gYmFzZUNsb25lW194ZmFfb2JqZWN0LiRjbG9uZV0oKTsKICAgICAgcGFyZW50W25hbWVdLnB1c2goY2xvbmUpOwogICAgICBwYXJlbnRbX3hmYV9vYmplY3QuJGluc2VydEF0XShwb3MgKyBpLCBjbG9uZSk7CiAgICAgIHRoaXMuX2JpbmRWYWx1ZShjbG9uZSwgbWF0Y2gsIHBpY3R1cmUpOwogICAgICB0aGlzLl9zZXRQcm9wZXJ0aWVzKGNsb25lLCBtYXRjaCk7CiAgICAgIHRoaXMuX2JpbmRJdGVtcyhjbG9uZSwgbWF0Y2gpOwogICAgfQogIH0KICBfY3JlYXRlT2NjdXJyZW5jZXMoZm9ybU5vZGUpIHsKICAgIGlmICghdGhpcy5lbXB0eU1lcmdlKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHsKICAgICAgb2NjdXIKICAgIH0gPSBmb3JtTm9kZTsKICAgIGlmICghb2NjdXIgfHwgb2NjdXIuaW5pdGlhbCA8PSAxKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBhcmVudCA9IGZvcm1Ob2RlW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBuYW1lID0gZm9ybU5vZGVbX3hmYV9vYmplY3QuJG5vZGVOYW1lXTsKICAgIGlmICghKHBhcmVudFtuYW1lXSBpbnN0YW5jZW9mIF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgY3VycmVudE51bWJlcjsKICAgIGlmIChmb3JtTm9kZS5uYW1lKSB7CiAgICAgIGN1cnJlbnROdW1iZXIgPSBwYXJlbnRbbmFtZV0uY2hpbGRyZW4uZmlsdGVyKGUgPT4gZS5uYW1lID09PSBmb3JtTm9kZS5uYW1lKS5sZW5ndGg7CiAgICB9IGVsc2UgewogICAgICBjdXJyZW50TnVtYmVyID0gcGFyZW50W25hbWVdLmNoaWxkcmVuLmxlbmd0aDsKICAgIH0KICAgIGNvbnN0IHBvcyA9IHBhcmVudFtfeGZhX29iamVjdC4kaW5kZXhPZl0oZm9ybU5vZGUpICsgMTsKICAgIGNvbnN0IGlpID0gb2NjdXIuaW5pdGlhbCAtIGN1cnJlbnROdW1iZXI7CiAgICBpZiAoaWkpIHsKICAgICAgY29uc3Qgbm9kZUNsb25lID0gZm9ybU5vZGVbX3hmYV9vYmplY3QuJGNsb25lXSgpOwogICAgICBub2RlQ2xvbmVbX3hmYV9vYmplY3QuJHJlbW92ZUNoaWxkXShub2RlQ2xvbmUub2NjdXIpOwogICAgICBub2RlQ2xvbmUub2NjdXIgPSBudWxsOwogICAgICBwYXJlbnRbbmFtZV0ucHVzaChub2RlQ2xvbmUpOwogICAgICBwYXJlbnRbX3hmYV9vYmplY3QuJGluc2VydEF0XShwb3MsIG5vZGVDbG9uZSk7CiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaWk7IGkrKykgewogICAgICAgIGNvbnN0IGNsb25lID0gbm9kZUNsb25lW194ZmFfb2JqZWN0LiRjbG9uZV0oKTsKICAgICAgICBwYXJlbnRbbmFtZV0ucHVzaChjbG9uZSk7CiAgICAgICAgcGFyZW50W194ZmFfb2JqZWN0LiRpbnNlcnRBdF0ocG9zICsgaSwgY2xvbmUpOwogICAgICB9CiAgICB9CiAgfQogIF9nZXRPY2N1ckluZm8oZm9ybU5vZGUpIHsKICAgIGNvbnN0IHsKICAgICAgbmFtZSwKICAgICAgb2NjdXIKICAgIH0gPSBmb3JtTm9kZTsKICAgIGlmICghb2NjdXIgfHwgIW5hbWUpIHsKICAgICAgcmV0dXJuIFsxLCAxXTsKICAgIH0KICAgIGNvbnN0IG1heCA9IG9jY3VyLm1heCA9PT0gLTEgPyBJbmZpbml0eSA6IG9jY3VyLm1heDsKICAgIHJldHVybiBbb2NjdXIubWluLCBtYXhdOwogIH0KICBfc2V0QW5kQmluZChmb3JtTm9kZSwgZGF0YU5vZGUpIHsKICAgIHRoaXMuX3NldFByb3BlcnRpZXMoZm9ybU5vZGUsIGRhdGFOb2RlKTsKICAgIHRoaXMuX2JpbmRJdGVtcyhmb3JtTm9kZSwgZGF0YU5vZGUpOwogICAgdGhpcy5fYmluZEVsZW1lbnQoZm9ybU5vZGUsIGRhdGFOb2RlKTsKICB9CiAgX2JpbmRFbGVtZW50KGZvcm1Ob2RlLCBkYXRhTm9kZSkgewogICAgY29uc3QgdXNlbGVzc05vZGVzID0gW107CiAgICB0aGlzLl9jcmVhdGVPY2N1cnJlbmNlcyhmb3JtTm9kZSk7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZvcm1Ob2RlW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbl0oKSkgewogICAgICBpZiAoY2hpbGRbX3hmYV9vYmplY3QuJGRhdGFdKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX21lcmdlTW9kZSA9PT0gdW5kZWZpbmVkICYmIGNoaWxkW194ZmFfb2JqZWN0LiRub2RlTmFtZV0gPT09ICJzdWJmb3JtIikgewogICAgICAgIHRoaXMuX21lcmdlTW9kZSA9IGNoaWxkLm1lcmdlTW9kZSA9PT0gImNvbnN1bWVEYXRhIjsKICAgICAgICBjb25zdCBkYXRhQ2hpbGRyZW4gPSBkYXRhTm9kZVtfeGZhX29iamVjdC4kZ2V0Q2hpbGRyZW5dKCk7CiAgICAgICAgaWYgKGRhdGFDaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLl9iaW5kT2NjdXJyZW5jZXMoY2hpbGQsIFtkYXRhQ2hpbGRyZW5bMF1dLCBudWxsKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW1wdHlNZXJnZSkgewogICAgICAgICAgY29uc3QgbnNJZCA9IGRhdGFOb2RlW194ZmFfb2JqZWN0LiRuYW1lc3BhY2VJZF0gPT09IE5TX0RBVEFTRVRTID8gLTEgOiBkYXRhTm9kZVtfeGZhX29iamVjdC4kbmFtZXNwYWNlSWRdOwogICAgICAgICAgY29uc3QgZGF0YUNoaWxkID0gY2hpbGRbX3hmYV9vYmplY3QuJGRhdGFdID0gbmV3IF94ZmFfb2JqZWN0LlhtbE9iamVjdChuc0lkLCBjaGlsZC5uYW1lIHx8ICJyb290Iik7CiAgICAgICAgICBkYXRhTm9kZVtfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKGRhdGFDaGlsZCk7CiAgICAgICAgICB0aGlzLl9iaW5kRWxlbWVudChjaGlsZCwgZGF0YUNoaWxkKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCFjaGlsZFtfeGZhX29iamVjdC4kaXNCaW5kYWJsZV0oKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxldCBnbG9iYWwgPSBmYWxzZTsKICAgICAgbGV0IHBpY3R1cmUgPSBudWxsOwogICAgICBsZXQgcmVmID0gbnVsbDsKICAgICAgbGV0IG1hdGNoID0gbnVsbDsKICAgICAgaWYgKGNoaWxkLmJpbmQpIHsKICAgICAgICBzd2l0Y2ggKGNoaWxkLmJpbmQubWF0Y2gpIHsKICAgICAgICAgIGNhc2UgIm5vbmUiOgogICAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBkYXRhTm9kZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgY2FzZSAiZ2xvYmFsIjoKICAgICAgICAgICAgZ2xvYmFsID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICJkYXRhUmVmIjoKICAgICAgICAgICAgaWYgKCFjaGlsZC5iaW5kLnJlZikgewogICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gcmVmIGlzIGVtcHR5IGluIG5vZGUgJHtjaGlsZFtfeGZhX29iamVjdC4kbm9kZU5hbWVdfS5gKTsKICAgICAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBkYXRhTm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmID0gY2hpbGQuYmluZC5yZWY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChjaGlsZC5iaW5kLnBpY3R1cmUpIHsKICAgICAgICAgIHBpY3R1cmUgPSBjaGlsZC5iaW5kLnBpY3R1cmVbX3hmYV9vYmplY3QuJGNvbnRlbnRdOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCBbbWluLCBtYXhdID0gdGhpcy5fZ2V0T2NjdXJJbmZvKGNoaWxkKTsKICAgICAgaWYgKHJlZikgewogICAgICAgIG1hdGNoID0gKDAsIF9zb20uc2VhcmNoTm9kZSkodGhpcy5yb290LCBkYXRhTm9kZSwgcmVmLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7CiAgICAgICAgICBtYXRjaCA9ICgwLCBfc29tLmNyZWF0ZURhdGFOb2RlKSh0aGlzLmRhdGEsIGRhdGFOb2RlLCByZWYpOwogICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgICAgbWF0Y2hbX3hmYV9vYmplY3QuJGNvbnN1bWVkXSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBtYXRjaCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX2lzQ29uc3VtZURhdGEoKSkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLmZpbHRlcihub2RlID0+ICFub2RlW194ZmFfb2JqZWN0LiRjb25zdW1lZF0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IG1heCkgewogICAgICAgICAgICBtYXRjaCA9IG1hdGNoLnNsaWNlKDAsIG1heCk7CiAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBtYXRjaCA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWF0Y2ggJiYgdGhpcy5faXNDb25zdW1lRGF0YSgpKSB7CiAgICAgICAgICAgIG1hdGNoLmZvckVhY2gobm9kZSA9PiB7CiAgICAgICAgICAgICAgbm9kZVtfeGZhX29iamVjdC4kY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghY2hpbGQubmFtZSkgewogICAgICAgICAgdGhpcy5fc2V0QW5kQmluZChjaGlsZCwgZGF0YU5vZGUpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9pc0NvbnN1bWVEYXRhKCkpIHsKICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXTsKICAgICAgICAgIHdoaWxlIChtYXRjaGVzLmxlbmd0aCA8IG1heCkgewogICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2ZpbmREYXRhQnlOYW1lVG9Db25zdW1lKGNoaWxkLm5hbWUsIGNoaWxkW194ZmFfb2JqZWN0LiRoYXNTZXR0YWJsZVZhbHVlXSgpLCBkYXRhTm9kZSwgZ2xvYmFsKTsKICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvdW5kW194ZmFfb2JqZWN0LiRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgICBtYXRjaGVzLnB1c2goZm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgbWF0Y2ggPSBtYXRjaGVzLmxlbmd0aCA+IDAgPyBtYXRjaGVzIDogbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWF0Y2ggPSBkYXRhTm9kZVtfeGZhX29iamVjdC4kZ2V0UmVhbENoaWxkcmVuQnlOYW1lSXRdKGNoaWxkLm5hbWUsIGZhbHNlLCB0aGlzLmVtcHR5TWVyZ2UpLm5leHQoKS52YWx1ZTsKICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgaWYgKG1pbiA9PT0gMCkgewogICAgICAgICAgICAgIHVzZWxlc3NOb2Rlcy5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuc0lkID0gZGF0YU5vZGVbX3hmYV9vYmplY3QuJG5hbWVzcGFjZUlkXSA9PT0gTlNfREFUQVNFVFMgPyAtMSA6IGRhdGFOb2RlW194ZmFfb2JqZWN0LiRuYW1lc3BhY2VJZF07CiAgICAgICAgICAgIG1hdGNoID0gY2hpbGRbX3hmYV9vYmplY3QuJGRhdGFdID0gbmV3IF94ZmFfb2JqZWN0LlhtbE9iamVjdChuc0lkLCBjaGlsZC5uYW1lKTsKICAgICAgICAgICAgaWYgKHRoaXMuZW1wdHlNZXJnZSkgewogICAgICAgICAgICAgIG1hdGNoW194ZmFfb2JqZWN0LiRjb25zdW1lZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGFOb2RlW194ZmFfb2JqZWN0LiRhcHBlbmRDaGlsZF0obWF0Y2gpOwogICAgICAgICAgICB0aGlzLl9zZXRBbmRCaW5kKGNoaWxkLCBtYXRjaCk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuZW1wdHlNZXJnZSkgewogICAgICAgICAgICBtYXRjaFtfeGZhX29iamVjdC4kY29uc3VtZWRdID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIG1hdGNoID0gW21hdGNoXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgdGhpcy5fYmluZE9jY3VycmVuY2VzKGNoaWxkLCBtYXRjaCwgcGljdHVyZSk7CiAgICAgIH0gZWxzZSBpZiAobWluID4gMCkgewogICAgICAgIHRoaXMuX3NldEFuZEJpbmQoY2hpbGQsIGRhdGFOb2RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1c2VsZXNzTm9kZXMucHVzaChjaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHVzZWxlc3NOb2Rlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpW194ZmFfb2JqZWN0LiRyZW1vdmVDaGlsZF0obm9kZSkpOwogIH0KfQpleHBvcnRzLkJpbmRlciA9IEJpbmRlcjsKCi8qKiovIH0pLAovKiA4MyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlZhbHVlID0gZXhwb3J0cy5UZXh0ID0gZXhwb3J0cy5UZW1wbGF0ZU5hbWVzcGFjZSA9IGV4cG9ydHMuVGVtcGxhdGUgPSBleHBvcnRzLlNldFByb3BlcnR5ID0gZXhwb3J0cy5JdGVtcyA9IGV4cG9ydHMuRmllbGQgPSBleHBvcnRzLkJpbmRJdGVtcyA9IHZvaWQgMDsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfbmFtZXNwYWNlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwp2YXIgX2xheW91dCA9IF9fd19wZGZqc19yZXF1aXJlX18oODQpOwp2YXIgX2h0bWxfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg1KTsKdmFyIF91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzkpOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX2ZvbnRzID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfc29tID0gX193X3BkZmpzX3JlcXVpcmVfXyg4MSk7CmNvbnN0IFRFTVBMQVRFX05TX0lEID0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLnRlbXBsYXRlLmlkOwpjb25zdCBTVkdfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciOwpjb25zdCBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUID0gMjsKY29uc3QgTUFYX0VNUFRZX1BBR0VTID0gMzsKY29uc3QgREVGQVVMVF9UQUJfSU5ERVggPSA1MDAwOwpjb25zdCBIRUFESU5HX1BBVFRFUk4gPSAvXkgoXGQrKSQvOwpjb25zdCBNSU1FUyA9IG5ldyBTZXQoWyJpbWFnZS9naWYiLCAiaW1hZ2UvanBlZyIsICJpbWFnZS9qcGciLCAiaW1hZ2UvcGpwZWciLCAiaW1hZ2UvcG5nIiwgImltYWdlL2FwbmciLCAiaW1hZ2UveC1wbmciLCAiaW1hZ2UvYm1wIiwgImltYWdlL3gtbXMtYm1wIiwgImltYWdlL3RpZmYiLCAiaW1hZ2UvdGlmIiwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJdKTsKY29uc3QgSU1BR0VTX0hFQURFUlMgPSBbW1sweDQyLCAweDRkXSwgImltYWdlL2JtcCJdLCBbWzB4ZmYsIDB4ZDgsIDB4ZmZdLCAiaW1hZ2UvanBlZyJdLCBbWzB4NDksIDB4NDksIDB4MmEsIDB4MDBdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NGQsIDB4NGQsIDB4MDAsIDB4MmFdLCAiaW1hZ2UvdGlmZiJdLCBbWzB4NDcsIDB4NDksIDB4NDYsIDB4MzgsIDB4MzksIDB4NjFdLCAiaW1hZ2UvZ2lmIl0sIFtbMHg4OSwgMHg1MCwgMHg0ZSwgMHg0NywgMHgwZCwgMHgwYSwgMHgxYSwgMHgwYV0sICJpbWFnZS9wbmciXV07CmZ1bmN0aW9uIGdldEJvcmRlckRpbXMobm9kZSkgewogIGlmICghbm9kZSB8fCAhbm9kZS5ib3JkZXIpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIGNvbnN0IGJvcmRlckV4dHJhID0gbm9kZS5ib3JkZXJbX3hmYV9vYmplY3QuJGdldEV4dHJhXSgpOwogIGlmICghYm9yZGVyRXh0cmEpIHsKICAgIHJldHVybiB7CiAgICAgIHc6IDAsCiAgICAgIGg6IDAKICAgIH07CiAgfQogIHJldHVybiB7CiAgICB3OiBib3JkZXJFeHRyYS53aWR0aHNbMF0gKyBib3JkZXJFeHRyYS53aWR0aHNbMl0gKyBib3JkZXJFeHRyYS5pbnNldHNbMF0gKyBib3JkZXJFeHRyYS5pbnNldHNbMl0sCiAgICBoOiBib3JkZXJFeHRyYS53aWR0aHNbMV0gKyBib3JkZXJFeHRyYS53aWR0aHNbM10gKyBib3JkZXJFeHRyYS5pbnNldHNbMV0gKyBib3JkZXJFeHRyYS5pbnNldHNbM10KICB9Owp9CmZ1bmN0aW9uIGhhc01hcmdpbihub2RlKSB7CiAgcmV0dXJuIG5vZGUubWFyZ2luICYmIChub2RlLm1hcmdpbi50b3BJbnNldCB8fCBub2RlLm1hcmdpbi5yaWdodEluc2V0IHx8IG5vZGUubWFyZ2luLmJvdHRvbUluc2V0IHx8IG5vZGUubWFyZ2luLmxlZnRJbnNldCk7Cn0KZnVuY3Rpb24gX3NldFZhbHVlKHRlbXBsYXRlTm9kZSwgdmFsdWUpIHsKICBpZiAoIXRlbXBsYXRlTm9kZS52YWx1ZSkgewogICAgY29uc3Qgbm9kZVZhbHVlID0gbmV3IFZhbHVlKHt9KTsKICAgIHRlbXBsYXRlTm9kZVtfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKG5vZGVWYWx1ZSk7CiAgICB0ZW1wbGF0ZU5vZGUudmFsdWUgPSBub2RlVmFsdWU7CiAgfQogIHRlbXBsYXRlTm9kZS52YWx1ZVtfeGZhX29iamVjdC4kc2V0VmFsdWVdKHZhbHVlKTsKfQpmdW5jdGlvbiogZ2V0Q29udGFpbmVkQ2hpbGRyZW4obm9kZSkgewogIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZVtfeGZhX29iamVjdC4kZ2V0Q2hpbGRyZW5dKCkpIHsKICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN1YmZvcm1TZXQpIHsKICAgICAgeWllbGQqIGNoaWxkW194ZmFfb2JqZWN0LiRnZXRDb250YWluZWRDaGlsZHJlbl0oKTsKICAgICAgY29udGludWU7CiAgICB9CiAgICB5aWVsZCBjaGlsZDsKICB9Cn0KZnVuY3Rpb24gaXNSZXF1aXJlZChub2RlKSB7CiAgcmV0dXJuIG5vZGUudmFsaWRhdGU/Lm51bGxUZXN0ID09PSAiZXJyb3IiOwp9CmZ1bmN0aW9uIHNldFRhYkluZGV4KG5vZGUpIHsKICB3aGlsZSAobm9kZSkgewogICAgaWYgKCFub2RlLnRyYXZlcnNhbCkgewogICAgICBub2RlW194ZmFfb2JqZWN0LiR0YWJJbmRleF0gPSBub2RlW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKClbX3hmYV9vYmplY3QuJHRhYkluZGV4XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5vZGVbX3hmYV9vYmplY3QuJHRhYkluZGV4XSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBsZXQgbmV4dCA9IG51bGw7CiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUudHJhdmVyc2FsW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbl0oKSkgewogICAgICBpZiAoY2hpbGQub3BlcmF0aW9uID09PSAibmV4dCIpIHsKICAgICAgICBuZXh0ID0gY2hpbGQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghbmV4dCB8fCAhbmV4dC5yZWYpIHsKICAgICAgbm9kZVtfeGZhX29iamVjdC4kdGFiSW5kZXhdID0gbm9kZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpW194ZmFfb2JqZWN0LiR0YWJJbmRleF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHJvb3QgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICBub2RlW194ZmFfb2JqZWN0LiR0YWJJbmRleF0gPSArK3Jvb3RbX3hmYV9vYmplY3QuJHRhYkluZGV4XTsKICAgIGNvbnN0IHJlZiA9IHJvb3RbX3hmYV9vYmplY3QuJHNlYXJjaE5vZGVdKG5leHQucmVmLCBub2RlKTsKICAgIGlmICghcmVmKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIG5vZGUgPSByZWZbMF07CiAgfQp9CmZ1bmN0aW9uIGFwcGx5QXNzaXN0KG9iaiwgYXR0cmlidXRlcykgewogIGNvbnN0IGFzc2lzdCA9IG9iai5hc3Npc3Q7CiAgaWYgKGFzc2lzdCkgewogICAgY29uc3QgYXNzaXN0VGl0bGUgPSBhc3Npc3RbX3hmYV9vYmplY3QuJHRvSFRNTF0oKTsKICAgIGlmIChhc3Npc3RUaXRsZSkgewogICAgICBhdHRyaWJ1dGVzLnRpdGxlID0gYXNzaXN0VGl0bGU7CiAgICB9CiAgICBjb25zdCByb2xlID0gYXNzaXN0LnJvbGU7CiAgICBjb25zdCBtYXRjaCA9IHJvbGUubWF0Y2goSEVBRElOR19QQVRURVJOKTsKICAgIGlmIChtYXRjaCkgewogICAgICBjb25zdCBhcmlhUm9sZSA9ICJoZWFkaW5nIjsKICAgICAgY29uc3QgYXJpYUxldmVsID0gbWF0Y2hbMV07CiAgICAgIGF0dHJpYnV0ZXMucm9sZSA9IGFyaWFSb2xlOwogICAgICBhdHRyaWJ1dGVzWyJhcmlhLWxldmVsIl0gPSBhcmlhTGV2ZWw7CiAgICB9CiAgfQogIGlmIChvYmoubGF5b3V0ID09PSAidGFibGUiKSB7CiAgICBhdHRyaWJ1dGVzLnJvbGUgPSAidGFibGUiOwogIH0gZWxzZSBpZiAob2JqLmxheW91dCA9PT0gInJvdyIpIHsKICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJyb3ciOwogIH0gZWxzZSB7CiAgICBjb25zdCBwYXJlbnQgPSBvYmpbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIGlmIChwYXJlbnQubGF5b3V0ID09PSAicm93IikgewogICAgICBpZiAocGFyZW50LmFzc2lzdD8ucm9sZSA9PT0gIlRIIikgewogICAgICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJjb2x1bW5oZWFkZXIiOwogICAgICB9IGVsc2UgewogICAgICAgIGF0dHJpYnV0ZXMucm9sZSA9ICJjZWxsIjsKICAgICAgfQogICAgfQogIH0KfQpmdW5jdGlvbiBhcmlhTGFiZWwob2JqKSB7CiAgaWYgKCFvYmouYXNzaXN0KSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgY29uc3QgYXNzaXN0ID0gb2JqLmFzc2lzdDsKICBpZiAoYXNzaXN0LnNwZWFrICYmIGFzc2lzdC5zcGVha1tfeGZhX29iamVjdC4kY29udGVudF0gIT09ICIiKSB7CiAgICByZXR1cm4gYXNzaXN0LnNwZWFrW194ZmFfb2JqZWN0LiRjb250ZW50XTsKICB9CiAgaWYgKGFzc2lzdC50b29sVGlwKSB7CiAgICByZXR1cm4gYXNzaXN0LnRvb2xUaXBbX3hmYV9vYmplY3QuJGNvbnRlbnRdOwogIH0KICByZXR1cm4gbnVsbDsKfQpmdW5jdGlvbiB2YWx1ZVRvSHRtbCh2YWx1ZSkgewogIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgIG5hbWU6ICJkaXYiLAogICAgYXR0cmlidXRlczogewogICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgIHN0eWxlOiBPYmplY3QuY3JlYXRlKG51bGwpCiAgICB9LAogICAgY2hpbGRyZW46IFt7CiAgICAgIG5hbWU6ICJzcGFuIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlOiBPYmplY3QuY3JlYXRlKG51bGwpCiAgICAgIH0sCiAgICAgIHZhbHVlCiAgICB9XQogIH0pOwp9CmZ1bmN0aW9uIHNldEZpcnN0VW5zcGxpdHRhYmxlKG5vZGUpIHsKICBjb25zdCByb290ID0gbm9kZVtfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpOwogIGlmIChyb290W194ZmFfb2JqZWN0LiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPT09IG51bGwpIHsKICAgIHJvb3RbX3hmYV9vYmplY3QuJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9IG5vZGU7CiAgICByb290W194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gdHJ1ZTsKICB9Cn0KZnVuY3Rpb24gdW5zZXRGaXJzdFVuc3BsaXR0YWJsZShub2RlKSB7CiAgY29uc3Qgcm9vdCA9IG5vZGVbX3hmYV9vYmplY3QuJGdldFRlbXBsYXRlUm9vdF0oKTsKICBpZiAocm9vdFtfeGZhX29iamVjdC4kZXh0cmFdLmZpcnN0VW5zcGxpdHRhYmxlID09PSBub2RlKSB7CiAgICByb290W194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gZmFsc2U7CiAgfQp9CmZ1bmN0aW9uIGhhbmRsZUJyZWFrKG5vZGUpIHsKICBpZiAobm9kZVtfeGZhX29iamVjdC4kZXh0cmFdKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgaWYgKG5vZGUudGFyZ2V0VHlwZSA9PT0gImF1dG8iKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGNvbnN0IHJvb3QgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgbGV0IHRhcmdldCA9IG51bGw7CiAgaWYgKG5vZGUudGFyZ2V0KSB7CiAgICB0YXJnZXQgPSByb290W194ZmFfb2JqZWN0LiRzZWFyY2hOb2RlXShub2RlLnRhcmdldCwgbm9kZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpKTsKICAgIGlmICghdGFyZ2V0KSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRhcmdldCA9IHRhcmdldFswXTsKICB9CiAgY29uc3QgewogICAgY3VycmVudFBhZ2VBcmVhLAogICAgY3VycmVudENvbnRlbnRBcmVhCiAgfSA9IHJvb3RbX3hmYV9vYmplY3QuJGV4dHJhXTsKICBpZiAobm9kZS50YXJnZXRUeXBlID09PSAicGFnZUFyZWEiKSB7CiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBQYWdlQXJlYSkpIHsKICAgICAgdGFyZ2V0ID0gbnVsbDsKICAgIH0KICAgIGlmIChub2RlLnN0YXJ0TmV3KSB7CiAgICAgIG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS50YXJnZXQgPSB0YXJnZXQgfHwgY3VycmVudFBhZ2VBcmVhOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gY3VycmVudFBhZ2VBcmVhKSB7CiAgICAgIG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS50YXJnZXQgPSB0YXJnZXQ7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDb250ZW50QXJlYSkpIHsKICAgIHRhcmdldCA9IG51bGw7CiAgfQogIGNvbnN0IHBhZ2VBcmVhID0gdGFyZ2V0ICYmIHRhcmdldFtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogIGxldCBpbmRleDsKICBsZXQgbmV4dFBhZ2VBcmVhID0gcGFnZUFyZWE7CiAgaWYgKG5vZGUuc3RhcnROZXcpIHsKICAgIGlmICh0YXJnZXQpIHsKICAgICAgY29uc3QgY29udGVudEFyZWFzID0gcGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW47CiAgICAgIGNvbnN0IGluZGV4Rm9yQ3VycmVudCA9IGNvbnRlbnRBcmVhcy5pbmRleE9mKGN1cnJlbnRDb250ZW50QXJlYSk7CiAgICAgIGNvbnN0IGluZGV4Rm9yVGFyZ2V0ID0gY29udGVudEFyZWFzLmluZGV4T2YodGFyZ2V0KTsKICAgICAgaWYgKGluZGV4Rm9yQ3VycmVudCAhPT0gLTEgJiYgaW5kZXhGb3JDdXJyZW50IDwgaW5kZXhGb3JUYXJnZXQpIHsKICAgICAgICBuZXh0UGFnZUFyZWEgPSBudWxsOwogICAgICB9CiAgICAgIGluZGV4ID0gaW5kZXhGb3JUYXJnZXQgLSAxOwogICAgfSBlbHNlIHsKICAgICAgaW5kZXggPSBjdXJyZW50UGFnZUFyZWEuY29udGVudEFyZWEuY2hpbGRyZW4uaW5kZXhPZihjdXJyZW50Q29udGVudEFyZWEpOwogICAgfQogIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gY3VycmVudENvbnRlbnRBcmVhKSB7CiAgICBjb25zdCBjb250ZW50QXJlYXMgPSBwYWdlQXJlYS5jb250ZW50QXJlYS5jaGlsZHJlbjsKICAgIGluZGV4ID0gY29udGVudEFyZWFzLmluZGV4T2YodGFyZ2V0KSAtIDE7CiAgICBuZXh0UGFnZUFyZWEgPSBwYWdlQXJlYSA9PT0gY3VycmVudFBhZ2VBcmVhID8gbnVsbCA6IHBhZ2VBcmVhOwogIH0gZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS50YXJnZXQgPSBuZXh0UGFnZUFyZWE7CiAgbm9kZVtfeGZhX29iamVjdC4kZXh0cmFdLmluZGV4ID0gaW5kZXg7CiAgcmV0dXJuIHRydWU7Cn0KZnVuY3Rpb24gaGFuZGxlT3ZlcmZsb3cobm9kZSwgZXh0cmFOb2RlLCBzcGFjZSkgewogIGNvbnN0IHJvb3QgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgY29uc3Qgc2F2ZWQgPSByb290W194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlOwogIGNvbnN0IHNhdmVkTWV0aG9kID0gZXh0cmFOb2RlW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XTsKICBleHRyYU5vZGVbX3hmYV9vYmplY3QuJGdldFN1YmZvcm1QYXJlbnRdID0gKCkgPT4gbm9kZTsKICByb290W194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gdHJ1ZTsKICBjb25zdCByZXMgPSBleHRyYU5vZGVbX3hmYV9vYmplY3QuJHRvSFRNTF0oc3BhY2UpOwogIG5vZGVbX3hmYV9vYmplY3QuJGFkZEhUTUxdKHJlcy5odG1sLCByZXMuYmJveCk7CiAgcm9vdFtfeGZhX29iamVjdC4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSA9IHNhdmVkOwogIGV4dHJhTm9kZVtfeGZhX29iamVjdC4kZ2V0U3ViZm9ybVBhcmVudF0gPSBzYXZlZE1ldGhvZDsKfQpjbGFzcyBBcHBlYXJhbmNlRmlsdGVyIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImFwcGVhcmFuY2VGaWx0ZXIiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEFyYyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJhcmMiLCB0cnVlKTsKICAgIHRoaXMuY2lyY3VsYXIgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jaXJjdWxhciwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaGFuZCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmhhbmQsIFsiZXZlbiIsICJsZWZ0IiwgInJpZ2h0Il0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnN0YXJ0QW5nbGUgPSAoMCwgX3V0aWxzLmdldEZsb2F0KSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnRBbmdsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMuc3dlZXBBbmdsZSA9ICgwLCBfdXRpbHMuZ2V0RmxvYXQpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zd2VlcEFuZ2xlLAogICAgICBkZWZhdWx0VmFsdWU6IDM2MCwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lZGdlID0gbnVsbDsKICAgIHRoaXMuZmlsbCA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXSgpIHsKICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmVkZ2UgfHwgbmV3IEVkZ2Uoe30pOwogICAgY29uc3QgZWRnZVN0eWxlID0gZWRnZVtfeGZhX29iamVjdC4kdG9TdHlsZV0oKTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLmZpbGw/LnByZXNlbmNlID09PSAidmlzaWJsZSIpIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdGhpcy5maWxsW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlLmZpbGwgPSAidHJhbnNwYXJlbnQiOwogICAgfQogICAgc3R5bGUuc3Ryb2tlV2lkdGggPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKShlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDApOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgbGV0IGFyYzsKICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7CiAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgIHN0eWxlOiB7CiAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICBoZWlnaHQ6ICIxMDAlIiwKICAgICAgICBvdmVyZmxvdzogInZpc2libGUiCiAgICAgIH0KICAgIH07CiAgICBpZiAodGhpcy5zd2VlcEFuZ2xlID09PSAzNjApIHsKICAgICAgYXJjID0gewogICAgICAgIG5hbWU6ICJlbGxpcHNlIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgICAgY3g6ICI1MCUiLAogICAgICAgICAgY3k6ICI1MCUiLAogICAgICAgICAgcng6ICI1MCUiLAogICAgICAgICAgcnk6ICI1MCUiLAogICAgICAgICAgc3R5bGUKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICBjb25zdCBzdGFydEFuZ2xlID0gdGhpcy5zdGFydEFuZ2xlICogTWF0aC5QSSAvIDE4MDsKICAgICAgY29uc3Qgc3dlZXBBbmdsZSA9IHRoaXMuc3dlZXBBbmdsZSAqIE1hdGguUEkgLyAxODA7CiAgICAgIGNvbnN0IGxhcmdlQXJjID0gdGhpcy5zd2VlcEFuZ2xlID4gMTgwID8gMSA6IDA7CiAgICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBbNTAgKiAoMSArIE1hdGguY29zKHN0YXJ0QW5nbGUpKSwgNTAgKiAoMSAtIE1hdGguc2luKHN0YXJ0QW5nbGUpKSwgNTAgKiAoMSArIE1hdGguY29zKHN0YXJ0QW5nbGUgKyBzd2VlcEFuZ2xlKSksIDUwICogKDEgLSBNYXRoLnNpbihzdGFydEFuZ2xlICsgc3dlZXBBbmdsZSkpXTsKICAgICAgYXJjID0gewogICAgICAgIG5hbWU6ICJwYXRoIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgICAgZDogYE0gJHt4MX0gJHt5MX0gQSA1MCA1MCAwICR7bGFyZ2VBcmN9IDAgJHt4Mn0gJHt5Mn1gLAogICAgICAgICAgdmVjdG9yRWZmZWN0OiAibm9uLXNjYWxpbmctc3Ryb2tlIiwKICAgICAgICAgIHN0eWxlCiAgICAgICAgfQogICAgICB9OwogICAgICBPYmplY3QuYXNzaWduKGF0dHJpYnV0ZXMsIHsKICAgICAgICB2aWV3Qm94OiAiMCAwIDEwMCAxMDAiLAogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW86ICJub25lIgogICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbYXJjXSwKICAgICAgYXR0cmlidXRlcwogICAgfTsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgaWYgKGhhc01hcmdpbihwYXJlbnQpKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICBkaXNwbGF5OiAiaW5saW5lIiwKICAgICAgICAgICAgd2lkdGg6ICIxMDAlIiwKICAgICAgICAgICAgaGVpZ2h0OiAiMTAwJSIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbc3ZnXQogICAgICB9KTsKICAgIH0KICAgIHN2Zy5hdHRyaWJ1dGVzLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHN2Zyk7CiAgfQp9CmNsYXNzIEFyZWEgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXJlYSIsIHRydWUpOwogICAgdGhpcy5jb2xTcGFuID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuY29sU3BhbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgfHwgbiA9PT0gLTEKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGV2YW50ID0gKDAsIF91dGlscy5nZXRSZWxldmFudCkoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy54ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy54LCAiMHB0Iik7CiAgICB0aGlzLnkgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLnksICIwcHQiKTsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmFyZWEgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQogICpbX3hmYV9vYmplY3QuJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgW194ZmFfb2JqZWN0LiRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbX3hmYV9vYmplY3QuJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFtfeGZhX29iamVjdC4kYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgY29uc3QgW3gsIHksIHcsIGhdID0gYmJveDsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS53aWR0aCA9IE1hdGgubWF4KHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS53aWR0aCwgeCArIHcpOwogICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmhlaWdodCA9IE1hdGgubWF4KHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5oZWlnaHQsIHkgKyBoKTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogIH0KICBbX3hmYV9vYmplY3QuJGdldEF2YWlsYWJsZVNwYWNlXSgpIHsKICAgIHJldHVybiB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uYXZhaWxhYmxlU3BhY2U7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgInBvc2l0aW9uIik7CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBzdHlsZSwKICAgICAgaWQ6IHRoaXNbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgIGNsYXNzOiBbInhmYUFyZWEiXQogICAgfTsKICAgIGlmICgoMCwgX2h0bWxfdXRpbHMuaXNQcmludE9ubHkpKHRoaXMpKSB7CiAgICAgIGF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgIGF0dHJpYnV0ZXMueGZhTmFtZSA9IHRoaXMubmFtZTsKICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0gPSB7CiAgICAgIGNoaWxkcmVuLAogICAgICB3aWR0aDogMCwKICAgICAgaGVpZ2h0OiAwLAogICAgICBhdmFpbGFibGVTcGFjZQogICAgfTsKICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbX3hmYV9vYmplY3QuJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgIGZpbHRlcjogbmV3IFNldChbImFyZWEiLCAiZHJhdyIsICJmaWVsZCIsICJleGNsR3JvdXAiLCAic3ViZm9ybSIsICJzdWJmb3JtU2V0Il0pLAogICAgICBpbmNsdWRlOiB0cnVlCiAgICB9KTsKICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHsKICAgICAgaWYgKHJlc3VsdC5pc0JyZWFrKCkpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGRlbGV0ZSB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV07CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgc3R5bGUud2lkdGggPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ud2lkdGgpOwogICAgc3R5bGUuaGVpZ2h0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmhlaWdodCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBjb25zdCBiYm94ID0gW3RoaXMueCwgdGhpcy55LCB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ud2lkdGgsIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5oZWlnaHRdOwogICAgZGVsZXRlIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXTsKICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWwsIGJib3gpOwogIH0KfQpjbGFzcyBBc3Npc3QgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYXNzaXN0IiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucm9sZSA9IGF0dHJpYnV0ZXMucm9sZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnNwZWFrID0gbnVsbDsKICAgIHRoaXMudG9vbFRpcCA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXSgpIHsKICAgIHJldHVybiB0aGlzLnRvb2xUaXA/LltfeGZhX29iamVjdC4kY29udGVudF0gfHwgbnVsbDsKICB9Cn0KY2xhc3MgQmFyY29kZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJiYXJjb2RlIiwgdHJ1ZSk7CiAgICB0aGlzLmNoYXJFbmNvZGluZyA9ICgwLCBfdXRpbHMuZ2V0S2V5d29yZCkoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmNoYXJFbmNvZGluZyA/IGF0dHJpYnV0ZXMuY2hhckVuY29kaW5nLnRvTG93ZXJDYXNlKCkgOiAiIiwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IGsgPT4gWyJ1dGYtOCIsICJiaWctZml2ZSIsICJmb250c3BlY2lmaWMiLCAiZ2JrIiwgImdiLTE4MDMwIiwgImdiLTIzMTIiLCAia3NjLTU2MDEiLCAibm9uZSIsICJzaGlmdC1qaXMiLCAidWNzLTIiLCAidXRmLTE2Il0uaW5jbHVkZXMoaykgfHwgay5tYXRjaCgvaXNvLTg4NTktXGR7Mn0vKQogICAgfSk7CiAgICB0aGlzLmNoZWNrc3VtID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuY2hlY2tzdW0sIFsibm9uZSIsICIxbW9kMTAiLCAiMW1vZDEwXzFtb2QxMSIsICIybW9kMTAiLCAiYXV0byJdKTsKICAgIHRoaXMuZGF0YUNvbHVtbkNvdW50ID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGF0YUNvbHVtbkNvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IC0xLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5kYXRhTGVuZ3RoID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZGF0YUxlbmd0aCwKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMuZGF0YVByZXAgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5kYXRhUHJlcCwgWyJub25lIiwgImZsYXRlQ29tcHJlc3MiXSk7CiAgICB0aGlzLmRhdGFSb3dDb3VudCA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmRhdGFSb3dDb3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMuZW5kQ2hhciA9IGF0dHJpYnV0ZXMuZW5kQ2hhciB8fCAiIjsKICAgIHRoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5lcnJvckNvcnJlY3Rpb25MZXZlbCwKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwICYmIHggPD0gOAogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubW9kdWxlSGVpZ2h0ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5tb2R1bGVIZWlnaHQsICI1bW0iKTsKICAgIHRoaXMubW9kdWxlV2lkdGggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1vZHVsZVdpZHRoLCAiMC4yNW1tIik7CiAgICB0aGlzLnByaW50Q2hlY2tEaWdpdCA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnByaW50Q2hlY2tEaWdpdCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMucm93Q29sdW1uUmF0aW8gPSAoMCwgX3V0aWxzLmdldFJhdGlvKShhdHRyaWJ1dGVzLnJvd0NvbHVtblJhdGlvKTsKICAgIHRoaXMuc3RhcnRDaGFyID0gYXR0cmlidXRlcy5zdGFydENoYXIgfHwgIiI7CiAgICB0aGlzLnRleHRMb2NhdGlvbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnRleHRMb2NhdGlvbiwgWyJiZWxvdyIsICJhYm92ZSIsICJhYm92ZUVtYmVkZGVkIiwgImJlbG93RW1iZWRkZWQiLCAibm9uZSJdKTsKICAgIHRoaXMudHJ1bmNhdGUgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy50cnVuY2F0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUgPyBhdHRyaWJ1dGVzLnR5cGUudG9Mb3dlckNhc2UoKSA6ICIiLCBbImF6dGVjIiwgImNvZGFiYXIiLCAiY29kZTJvZjVpbmR1c3RyaWFsIiwgImNvZGUyb2Y1aW50ZXJsZWF2ZWQiLCAiY29kZTJvZjVtYXRyaXgiLCAiY29kZTJvZjVzdGFuZGFyZCIsICJjb2RlM29mOSIsICJjb2RlM29mOWV4dGVuZGVkIiwgImNvZGUxMSIsICJjb2RlNDkiLCAiY29kZTkzIiwgImNvZGUxMjgiLCAiY29kZTEyOGEiLCAiY29kZTEyOGIiLCAiY29kZTEyOGMiLCAiY29kZTEyOHNzY2MiLCAiZGF0YW1hdHJpeCIsICJlYW44IiwgImVhbjhhZGQyIiwgImVhbjhhZGQ1IiwgImVhbjEzIiwgImVhbjEzYWRkMiIsICJlYW4xM2FkZDUiLCAiZWFuMTNwd2NkIiwgImZpbSIsICJsb2dtYXJzIiwgIm1heGljb2RlIiwgIm1zaSIsICJwZGY0MTciLCAicGRmNDE3bWFjcm8iLCAicGxlc3NleSIsICJwb3N0YXVzY3VzdDIiLCAicG9zdGF1c2N1c3QzIiwgInBvc3RhdXNyZXBseXBhaWQiLCAicG9zdGF1c3N0YW5kYXJkIiwgInBvc3R1a3JtNHNjYyIsICJwb3N0dXNkcGJjIiwgInBvc3R1c2ltYiIsICJwb3N0dXNzdGFuZGFyZCIsICJwb3N0dXM1emlwIiwgInFyY29kZSIsICJyZmlkIiwgInJzczE0IiwgInJzczE0ZXhwYW5kZWQiLCAicnNzMTRsaW1pdGVkIiwgInJzczE0c3RhY2tlZCIsICJyc3MxNHN0YWNrZWRvbW5pIiwgInJzczE0dHJ1bmNhdGVkIiwgInRlbGVwZW4iLCAidWNjMTI4IiwgInVjYzEyOHJhbmRvbSIsICJ1Y2MxMjhzc2NjIiwgInVwY2EiLCAidXBjYWFkZDIiLCAidXBjYWFkZDUiLCAidXBjYXB3Y2QiLCAidXBjZSIsICJ1cGNlYWRkMiIsICJ1cGNlYWRkNSIsICJ1cGNlYW4yIiwgInVwY2VhbjUiLCAidXBzbWF4aWNvZGUiXSk7CiAgICB0aGlzLnVwc01vZGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy51cHNNb2RlLCBbInVzQ2FycmllciIsICJpbnRlcm5hdGlvbmFsQ2FycmllciIsICJzZWN1cmVTeW1ib2wiLCAic3RhbmRhcmRTeW1ib2wiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53aWRlTmFycm93UmF0aW8gPSAoMCwgX3V0aWxzLmdldFJhdGlvKShhdHRyaWJ1dGVzLndpZGVOYXJyb3dSYXRpbyk7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KfQpjbGFzcyBCaW5kIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJpbmQiLCB0cnVlKTsKICAgIHRoaXMubWF0Y2ggPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5tYXRjaCwgWyJvbmNlIiwgImRhdGFSZWYiLCAiZ2xvYmFsIiwgIm5vbmUiXSk7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy5waWN0dXJlID0gbnVsbDsKICB9Cn0KY2xhc3MgQmluZEl0ZW1zIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJpbmRJdGVtcyIpOwogICAgdGhpcy5jb25uZWN0aW9uID0gYXR0cmlidXRlcy5jb25uZWN0aW9uIHx8ICIiOwogICAgdGhpcy5sYWJlbFJlZiA9IGF0dHJpYnV0ZXMubGFiZWxSZWYgfHwgIiI7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy52YWx1ZVJlZiA9IGF0dHJpYnV0ZXMudmFsdWVSZWYgfHwgIiI7CiAgfQp9CmV4cG9ydHMuQmluZEl0ZW1zID0gQmluZEl0ZW1zOwpjbGFzcyBCb29rZW5kIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJvb2tlbmQiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMudHJhaWxlciA9IGF0dHJpYnV0ZXMudHJhaWxlciB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEJvb2xlYW5FbGVtZW50IGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYm9vbGVhbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9PT0gMSA/ICIxIiA6ICIwIik7CiAgfQp9CmNsYXNzIEJvcmRlciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJib3JkZXIiLCB0cnVlKTsKICAgIHRoaXMuYnJlYWsgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5icmVhaywgWyJjbG9zZSIsICJvcGVuIl0pOwogICAgdGhpcy5oYW5kID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaGFuZCwgWyJldmVuIiwgImxlZnQiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gKDAsIF91dGlscy5nZXRSZWxldmFudCkoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb3JuZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoNCk7CiAgICB0aGlzLmVkZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoNCk7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZpbGwgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJGdldEV4dHJhXSgpIHsKICAgIGlmICghdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdKSB7CiAgICAgIGNvbnN0IGVkZ2VzID0gdGhpcy5lZGdlLmNoaWxkcmVuLnNsaWNlKCk7CiAgICAgIGlmIChlZGdlcy5sZW5ndGggPCA0KSB7CiAgICAgICAgY29uc3QgZGVmYXVsdEVkZ2UgPSBlZGdlcy5hdCgtMSkgfHwgbmV3IEVkZ2Uoe30pOwogICAgICAgIGZvciAobGV0IGkgPSBlZGdlcy5sZW5ndGg7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGVkZ2VzLnB1c2goZGVmYXVsdEVkZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB3aWR0aHMgPSBlZGdlcy5tYXAoZWRnZSA9PiBlZGdlLnRoaWNrbmVzcyk7CiAgICAgIGNvbnN0IGluc2V0cyA9IFswLCAwLCAwLCAwXTsKICAgICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgICAgaW5zZXRzWzBdID0gdGhpcy5tYXJnaW4udG9wSW5zZXQ7CiAgICAgICAgaW5zZXRzWzFdID0gdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgICBpbnNldHNbMl0gPSB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgICAgICBpbnNldHNbM10gPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQ7CiAgICAgIH0KICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gewogICAgICAgIHdpZHRocywKICAgICAgICBpbnNldHMsCiAgICAgICAgZWRnZXMKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV07CiAgfQogIFtfeGZhX29iamVjdC4kdG9TdHlsZV0oKSB7CiAgICBjb25zdCB7CiAgICAgIGVkZ2VzCiAgICB9ID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0RXh0cmFdKCk7CiAgICBjb25zdCBlZGdlU3R5bGVzID0gZWRnZXMubWFwKG5vZGUgPT4gewogICAgICBjb25zdCBzdHlsZSA9IG5vZGVbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCk7CiAgICAgIHN0eWxlLmNvbG9yIHx8PSAiIzAwMDAwMCI7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0pOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIHRoaXMubWFyZ2luW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpKTsKICAgIH0KICAgIGlmICh0aGlzLmZpbGw/LnByZXNlbmNlID09PSAidmlzaWJsZSIpIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdGhpcy5maWxsW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpKTsKICAgIH0KICAgIGlmICh0aGlzLmNvcm5lci5jaGlsZHJlbi5zb21lKG5vZGUgPT4gbm9kZS5yYWRpdXMgIT09IDApKSB7CiAgICAgIGNvbnN0IGNvcm5lclN0eWxlcyA9IHRoaXMuY29ybmVyLmNoaWxkcmVuLm1hcChub2RlID0+IG5vZGVbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkpOwogICAgICBpZiAoY29ybmVyU3R5bGVzLmxlbmd0aCA9PT0gMiB8fCBjb3JuZXJTdHlsZXMubGVuZ3RoID09PSAzKSB7CiAgICAgICAgY29uc3QgbGFzdCA9IGNvcm5lclN0eWxlcy5hdCgtMSk7CiAgICAgICAgZm9yIChsZXQgaSA9IGNvcm5lclN0eWxlcy5sZW5ndGg7IGkgPCA0OyBpKyspIHsKICAgICAgICAgIGNvcm5lclN0eWxlcy5wdXNoKGxhc3QpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHlsZS5ib3JkZXJSYWRpdXMgPSBjb3JuZXJTdHlsZXMubWFwKHMgPT4gcy5yYWRpdXMpLmpvaW4oIiAiKTsKICAgIH0KICAgIHN3aXRjaCAodGhpcy5wcmVzZW5jZSkgewogICAgICBjYXNlICJpbnZpc2libGUiOgogICAgICBjYXNlICJoaWRkZW4iOgogICAgICAgIHN0eWxlLmJvcmRlclN0eWxlID0gIiI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImluYWN0aXZlIjoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9ICJub25lIjsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBzdHlsZS5ib3JkZXJTdHlsZSA9IGVkZ2VTdHlsZXMubWFwKHMgPT4gcy5zdHlsZSkuam9pbigiICIpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgc3R5bGUuYm9yZGVyV2lkdGggPSBlZGdlU3R5bGVzLm1hcChzID0+IHMud2lkdGgpLmpvaW4oIiAiKTsKICAgIHN0eWxlLmJvcmRlckNvbG9yID0gZWRnZVN0eWxlcy5tYXAocyA9PiBzLmNvbG9yKS5qb2luKCIgIik7CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEJyZWFrIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImJyZWFrIiwgdHJ1ZSk7CiAgICB0aGlzLmFmdGVyID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYWZ0ZXIsIFsiYXV0byIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSIsICJwYWdlRXZlbiIsICJwYWdlT2RkIl0pOwogICAgdGhpcy5hZnRlclRhcmdldCA9IGF0dHJpYnV0ZXMuYWZ0ZXJUYXJnZXQgfHwgIiI7CiAgICB0aGlzLmJlZm9yZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmJlZm9yZSwgWyJhdXRvIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIiwgInBhZ2VFdmVuIiwgInBhZ2VPZGQiXSk7CiAgICB0aGlzLmJlZm9yZVRhcmdldCA9IGF0dHJpYnV0ZXMuYmVmb3JlVGFyZ2V0IHx8ICIiOwogICAgdGhpcy5ib29rZW5kTGVhZGVyID0gYXR0cmlidXRlcy5ib29rZW5kTGVhZGVyIHx8ICIiOwogICAgdGhpcy5ib29rZW5kVHJhaWxlciA9IGF0dHJpYnV0ZXMuYm9va2VuZFRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3ZlcmZsb3dMZWFkZXIgPSBhdHRyaWJ1dGVzLm92ZXJmbG93TGVhZGVyIHx8ICIiOwogICAgdGhpcy5vdmVyZmxvd1RhcmdldCA9IGF0dHJpYnV0ZXMub3ZlcmZsb3dUYXJnZXQgfHwgIiI7CiAgICB0aGlzLm92ZXJmbG93VHJhaWxlciA9IGF0dHJpYnV0ZXMub3ZlcmZsb3dUcmFpbGVyIHx8ICIiOwogICAgdGhpcy5zdGFydE5ldyA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnN0YXJ0TmV3LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgQnJlYWtBZnRlciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJicmVha0FmdGVyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnN0YXJ0TmV3ID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc3RhcnROZXcsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy50YXJnZXRUeXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudGFyZ2V0VHlwZSwgWyJhdXRvIiwgImNvbnRlbnRBcmVhIiwgInBhZ2VBcmVhIl0pOwogICAgdGhpcy50cmFpbGVyID0gYXR0cmlidXRlcy50cmFpbGVyIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICB9Cn0KY2xhc3MgQnJlYWtCZWZvcmUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiYnJlYWtCZWZvcmUiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkZXIgPSBhdHRyaWJ1dGVzLmxlYWRlciB8fCAiIjsKICAgIHRoaXMuc3RhcnROZXcgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5zdGFydE5ldywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudGFyZ2V0ID0gYXR0cmlidXRlcy50YXJnZXQgfHwgIiI7CiAgICB0aGlzLnRhcmdldFR5cGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy50YXJnZXRUeXBlLCBbImF1dG8iLCAiY29udGVudEFyZWEiLCAicGFnZUFyZWEiXSk7CiAgICB0aGlzLnRyYWlsZXIgPSBhdHRyaWJ1dGVzLnRyYWlsZXIgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSA9IHt9OwogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkZBSUxVUkU7CiAgfQp9CmNsYXNzIEJ1dHRvbiBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJidXR0b24iLCB0cnVlKTsKICAgIHRoaXMuaGlnaGxpZ2h0ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaGlnaGxpZ2h0LCBbImludmVydGVkIiwgIm5vbmUiLCAib3V0bGluZSIsICJwdXNoIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGh0bWxCdXR0b24gPSB7CiAgICAgIG5hbWU6ICJidXR0b24iLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgaWQ6IHRoaXNbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhQnV0dG9uIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbXQogICAgfTsKICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZ3JhbmRwYS5ldmVudC5jaGlsZHJlbikgewogICAgICBpZiAoZXZlbnQuYWN0aXZpdHkgIT09ICJjbGljayIgfHwgIWV2ZW50LnNjcmlwdCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGpzVVJMID0gKDAsIF9jb3JlX3V0aWxzLnJlY292ZXJKc1VSTCkoZXZlbnQuc2NyaXB0W194ZmFfb2JqZWN0LiRjb250ZW50XSk7CiAgICAgIGlmICghanNVUkwpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBocmVmID0gKDAsIF9odG1sX3V0aWxzLmZpeFVSTCkoanNVUkwudXJsKTsKICAgICAgaWYgKCFocmVmKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaHRtbEJ1dHRvbi5jaGlsZHJlbi5wdXNoKHsKICAgICAgICBuYW1lOiAiYSIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgaWQ6ICJsaW5rIiArIHRoaXNbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgICAgICBocmVmLAogICAgICAgICAgbmV3V2luZG93OiBqc1VSTC5uZXdXaW5kb3csCiAgICAgICAgICBjbGFzczogWyJ4ZmFMaW5rIl0sCiAgICAgICAgICBzdHlsZToge30KICAgICAgICB9LAogICAgICAgIGNoaWxkcmVuOiBbXQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWxCdXR0b24pOwogIH0KfQpjbGFzcyBDYWxjdWxhdGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiY2FsY3VsYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3ZlcnJpZGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5vdmVycmlkZSwgWyJkaXNhYmxlZCIsICJlcnJvciIsICJpZ25vcmUiLCAid2FybmluZyJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KfQpjbGFzcyBDYXB0aW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNhcHRpb24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wbGFjZW1lbnQgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wbGFjZW1lbnQsIFsibGVmdCIsICJib3R0b20iLCAiaW5saW5lIiwgInJpZ2h0IiwgInRvcCJdKTsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlc2VydmUgPSBNYXRoLmNlaWwoKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5yZXNlcnZlKSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5mb250ID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnZhbHVlID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRzZXRWYWx1ZV0odmFsdWUpIHsKICAgIF9zZXRWYWx1ZSh0aGlzLCB2YWx1ZSk7CiAgfQogIFtfeGZhX29iamVjdC4kZ2V0RXh0cmFdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAoIXRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSkgewogICAgICBsZXQgewogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodAogICAgICB9ID0gYXZhaWxhYmxlU3BhY2U7CiAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgIHdpZHRoID0gdGhpcy5yZXNlcnZlIDw9IDAgPyB3aWR0aCA6IHRoaXMucmVzZXJ2ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgIGhlaWdodCA9IHRoaXMucmVzZXJ2ZSA8PSAwID8gaGVpZ2h0IDogdGhpcy5yZXNlcnZlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gKDAsIF9odG1sX3V0aWxzLmxheW91dE5vZGUpKHRoaXMsIHsKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGlmICghdGhpcy52YWx1ZSkgewogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZVtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkuaHRtbDsKICAgIGlmICghdmFsdWUpIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kcG9wUGFyYV0oKTsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgY29uc3Qgc2F2ZWRSZXNlcnZlID0gdGhpcy5yZXNlcnZlOwogICAgaWYgKHRoaXMucmVzZXJ2ZSA8PSAwKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICB3LAogICAgICAgIGgKICAgICAgfSA9IHRoaXNbX3hmYV9vYmplY3QuJGdldEV4dHJhXShhdmFpbGFibGVTcGFjZSk7CiAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHsKICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgY2FzZSAiaW5saW5lIjoKICAgICAgICAgIHRoaXMucmVzZXJ2ZSA9IHc7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICB0aGlzLnJlc2VydmUgPSBoOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgewogICAgICBjaGlsZHJlbi5wdXNoKHsKICAgICAgICBuYW1lOiAiI3RleHQiLAogICAgICAgIHZhbHVlCiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgY2hpbGRyZW4ucHVzaCh2YWx1ZSk7CiAgICB9CiAgICBjb25zdCBzdHlsZSA9ICgwLCBfaHRtbF91dGlscy50b1N0eWxlKSh0aGlzLCAiZm9udCIsICJtYXJnaW4iLCAidmlzaWJpbGl0eSIpOwogICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkgewogICAgICBjYXNlICJsZWZ0IjoKICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgIGlmICh0aGlzLnJlc2VydmUgPiAwKSB7CiAgICAgICAgICBzdHlsZS53aWR0aCA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMucmVzZXJ2ZSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJ0b3AiOgogICAgICBjYXNlICJib3R0b20iOgogICAgICAgIGlmICh0aGlzLnJlc2VydmUgPiAwKSB7CiAgICAgICAgICBzdHlsZS5oZWlnaHQgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnJlc2VydmUpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgICgwLCBfaHRtbF91dGlscy5zZXRQYXJhKSh0aGlzLCBudWxsLCB2YWx1ZSk7CiAgICB0aGlzW194ZmFfb2JqZWN0LiRwb3BQYXJhXSgpOwogICAgdGhpcy5yZXNlcnZlID0gc2F2ZWRSZXNlcnZlOwogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHN0eWxlLAogICAgICAgIGNsYXNzOiBbInhmYUNhcHRpb24iXQogICAgICB9LAogICAgICBjaGlsZHJlbgogICAgfSk7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNlcnRpZmljYXRlIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIENlcnRpZmljYXRlcyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjZXJ0aWZpY2F0ZXMiLCB0cnVlKTsKICAgIHRoaXMuY3JlZGVudGlhbFNlcnZlclBvbGljeSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXJsID0gYXR0cmlidXRlcy51cmwgfHwgIiI7CiAgICB0aGlzLnVybFBvbGljeSA9IGF0dHJpYnV0ZXMudXJsUG9saWN5IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmlzc3VlcnMgPSBudWxsOwogICAgdGhpcy5rZXlVc2FnZSA9IG51bGw7CiAgICB0aGlzLm9pZHMgPSBudWxsOwogICAgdGhpcy5zaWduaW5nID0gbnVsbDsKICAgIHRoaXMuc3ViamVjdEROcyA9IG51bGw7CiAgfQp9CmNsYXNzIENoZWNrQnV0dG9uIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNoZWNrQnV0dG9uIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubWFyayA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm1hcmssIFsiZGVmYXVsdCIsICJjaGVjayIsICJjaXJjbGUiLCAiY3Jvc3MiLCAiZGlhbW9uZCIsICJzcXVhcmUiLCAic3RhciJdKTsKICAgIHRoaXMuc2hhcGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5zaGFwZSwgWyJzcXVhcmUiLCAicm91bmQiXSk7CiAgICB0aGlzLnNpemUgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLnNpemUsICIxMHB0Iik7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gKDAsIF9odG1sX3V0aWxzLnRvU3R5bGUpKCJtYXJnaW4iKTsKICAgIGNvbnN0IHNpemUgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnNpemUpOwogICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQgPSBzaXplOwogICAgbGV0IHR5cGU7CiAgICBsZXQgY2xhc3NOYW1lOwogICAgbGV0IGdyb3VwSWQ7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgY29uc3QgaXRlbXMgPSBmaWVsZC5pdGVtcy5jaGlsZHJlbi5sZW5ndGggJiYgZmllbGQuaXRlbXMuY2hpbGRyZW5bMF1bX3hmYV9vYmplY3QuJHRvSFRNTF0oKS5odG1sIHx8IFtdOwogICAgY29uc3QgZXhwb3J0ZWRWYWx1ZSA9IHsKICAgICAgb246IChpdGVtc1swXSAhPT0gdW5kZWZpbmVkID8gaXRlbXNbMF0gOiAib24iKS50b1N0cmluZygpLAogICAgICBvZmY6IChpdGVtc1sxXSAhPT0gdW5kZWZpbmVkID8gaXRlbXNbMV0gOiAib2ZmIikudG9TdHJpbmcoKQogICAgfTsKICAgIGNvbnN0IHZhbHVlID0gZmllbGQudmFsdWU/LltfeGZhX29iamVjdC4kdGV4dF0oKSB8fCAib2ZmIjsKICAgIGNvbnN0IGNoZWNrZWQgPSB2YWx1ZSA9PT0gZXhwb3J0ZWRWYWx1ZS5vbiB8fCB1bmRlZmluZWQ7CiAgICBjb25zdCBjb250YWluZXIgPSBmaWVsZFtfeGZhX29iamVjdC4kZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGNvbnN0IGZpZWxkSWQgPSBmaWVsZFtfeGZhX29iamVjdC4kdWlkXTsKICAgIGxldCBkYXRhSWQ7CiAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRXhjbEdyb3VwKSB7CiAgICAgIGdyb3VwSWQgPSBjb250YWluZXJbX3hmYV9vYmplY3QuJHVpZF07CiAgICAgIHR5cGUgPSAicmFkaW8iOwogICAgICBjbGFzc05hbWUgPSAieGZhUmFkaW8iOwogICAgICBkYXRhSWQgPSBjb250YWluZXJbX3hmYV9vYmplY3QuJGRhdGFdPy5bX3hmYV9vYmplY3QuJHVpZF0gfHwgY29udGFpbmVyW194ZmFfb2JqZWN0LiR1aWRdOwogICAgfSBlbHNlIHsKICAgICAgdHlwZSA9ICJjaGVja2JveCI7CiAgICAgIGNsYXNzTmFtZSA9ICJ4ZmFDaGVja2JveCI7CiAgICAgIGRhdGFJZCA9IGZpZWxkW194ZmFfb2JqZWN0LiRkYXRhXT8uW194ZmFfb2JqZWN0LiR1aWRdIHx8IGZpZWxkW194ZmFfb2JqZWN0LiR1aWRdOwogICAgfQogICAgY29uc3QgaW5wdXQgPSB7CiAgICAgIG5hbWU6ICJpbnB1dCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogW2NsYXNzTmFtZV0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgZmllbGRJZCwKICAgICAgICBkYXRhSWQsCiAgICAgICAgdHlwZSwKICAgICAgICBjaGVja2VkLAogICAgICAgIHhmYU9uOiBleHBvcnRlZFZhbHVlLm9uLAogICAgICAgIHhmYU9mZjogZXhwb3J0ZWRWYWx1ZS5vZmYsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChncm91cElkKSB7CiAgICAgIGlucHV0LmF0dHJpYnV0ZXMubmFtZSA9IGdyb3VwSWQ7CiAgICB9CiAgICBpZiAoaXNSZXF1aXJlZChmaWVsZCkpIHsKICAgICAgaW5wdXQuYXR0cmlidXRlc1siYXJpYS1yZXF1aXJlZCJdID0gdHJ1ZTsKICAgICAgaW5wdXQuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJsYWJlbCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFMYWJlbCJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbaW5wdXRdCiAgICB9KTsKICB9Cn0KY2xhc3MgQ2hvaWNlTGlzdCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjaG9pY2VMaXN0IiwgdHJ1ZSk7CiAgICB0aGlzLmNvbW1pdE9uID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuY29tbWl0T24sIFsic2VsZWN0IiwgImV4aXQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3BlbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm9wZW4sIFsidXNlckNvbnRyb2wiLCAiYWx3YXlzIiwgIm11bHRpU2VsZWN0IiwgIm9uRW50cnkiXSk7CiAgICB0aGlzLnRleHRFbnRyeSA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnRleHRFbnRyeSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgImJvcmRlciIsICJtYXJnaW4iKTsKICAgIGNvbnN0IHVpID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgY29uc3QgZmllbGQgPSB1aVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgY29uc3QgZm9udFNpemUgPSBmaWVsZC5mb250Py5zaXplIHx8IDEwOwogICAgY29uc3Qgb3B0aW9uU3R5bGUgPSB7CiAgICAgIGZvbnRTaXplOiBgY2FsYygke2ZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgCiAgICB9OwogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIGlmIChmaWVsZC5pdGVtcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IGl0ZW1zID0gZmllbGQuaXRlbXM7CiAgICAgIGxldCBkaXNwbGF5ZWRJbmRleCA9IDA7CiAgICAgIGxldCBzYXZlSW5kZXggPSAwOwogICAgICBpZiAoaXRlbXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7CiAgICAgICAgZGlzcGxheWVkSW5kZXggPSBpdGVtcy5jaGlsZHJlblswXS5zYXZlOwogICAgICAgIHNhdmVJbmRleCA9IDEgLSBkaXNwbGF5ZWRJbmRleDsKICAgICAgfQogICAgICBjb25zdCBkaXNwbGF5ZWQgPSBpdGVtcy5jaGlsZHJlbltkaXNwbGF5ZWRJbmRleF1bX3hmYV9vYmplY3QuJHRvSFRNTF0oKS5odG1sOwogICAgICBjb25zdCB2YWx1ZXMgPSBpdGVtcy5jaGlsZHJlbltzYXZlSW5kZXhdW194ZmFfb2JqZWN0LiR0b0hUTUxdKCkuaHRtbDsKICAgICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7CiAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQudmFsdWU/LltfeGZhX29iamVjdC4kdGV4dF0oKSB8fCAiIjsKICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGlzcGxheWVkLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICBjb25zdCBvcHRpb24gPSB7CiAgICAgICAgICBuYW1lOiAib3B0aW9uIiwKICAgICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSB8fCBkaXNwbGF5ZWRbaV0sCiAgICAgICAgICAgIHN0eWxlOiBvcHRpb25TdHlsZQogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlOiBkaXNwbGF5ZWRbaV0KICAgICAgICB9OwogICAgICAgIGlmICh2YWx1ZXNbaV0gPT09IHZhbHVlKSB7CiAgICAgICAgICBvcHRpb24uYXR0cmlidXRlcy5zZWxlY3RlZCA9IHNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY2hpbGRyZW4ucHVzaChvcHRpb24pOwogICAgICB9CiAgICAgIGlmICghc2VsZWN0ZWQpIHsKICAgICAgICBjaGlsZHJlbi5zcGxpY2UoMCwgMCwgewogICAgICAgICAgbmFtZTogIm9wdGlvbiIsCiAgICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgICAgICAgc2VsZWN0ZWQ6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB2YWx1ZTogIiAiCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHNlbGVjdEF0dHJpYnV0ZXMgPSB7CiAgICAgIGNsYXNzOiBbInhmYVNlbGVjdCJdLAogICAgICBmaWVsZElkOiBmaWVsZFtfeGZhX29iamVjdC4kdWlkXSwKICAgICAgZGF0YUlkOiBmaWVsZFtfeGZhX29iamVjdC4kZGF0YV0/LltfeGZhX29iamVjdC4kdWlkXSB8fCBmaWVsZFtfeGZhX29iamVjdC4kdWlkXSwKICAgICAgc3R5bGUsCiAgICAgICJhcmlhLWxhYmVsIjogYXJpYUxhYmVsKGZpZWxkKSwKICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBzZWxlY3RBdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl0gPSB0cnVlOwogICAgICBzZWxlY3RBdHRyaWJ1dGVzLnJlcXVpcmVkID0gdHJ1ZTsKICAgIH0KICAgIGlmICh0aGlzLm9wZW4gPT09ICJtdWx0aVNlbGVjdCIpIHsKICAgICAgc2VsZWN0QXR0cmlidXRlcy5tdWx0aXBsZSA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJsYWJlbCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFMYWJlbCJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbewogICAgICAgIG5hbWU6ICJzZWxlY3QiLAogICAgICAgIGNoaWxkcmVuLAogICAgICAgIGF0dHJpYnV0ZXM6IHNlbGVjdEF0dHJpYnV0ZXMKICAgICAgfV0KICAgIH0pOwogIH0KfQpjbGFzcyBDb2xvciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb2xvciIsIHRydWUpOwogICAgdGhpcy5jU3BhY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5jU3BhY2UsIFsiU1JHQiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudmFsdWUgPSBhdHRyaWJ1dGVzLnZhbHVlID8gKDAsIF91dGlscy5nZXRDb2xvcikoYXR0cmlidXRlcy52YWx1ZSkgOiAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRoYXNTZXR0YWJsZVZhbHVlXSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIHsKICAgIHJldHVybiB0aGlzLnZhbHVlID8gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IodGhpcy52YWx1ZS5yLCB0aGlzLnZhbHVlLmcsIHRoaXMudmFsdWUuYikgOiBudWxsOwogIH0KfQpjbGFzcyBDb21iIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNvbWIiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5udW1iZXJPZkNlbGxzID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubnVtYmVyT2ZDZWxscywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgQ29ubmVjdCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb25uZWN0IiwgdHJ1ZSk7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzYWdlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudXNhZ2UsIFsiZXhwb3J0QW5kSW1wb3J0IiwgImV4cG9ydE9ubHkiLCAiaW1wb3J0T25seSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogIH0KfQpjbGFzcyBDb250ZW50QXJlYSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJjb250ZW50QXJlYSIsIHRydWUpOwogICAgdGhpcy5oID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5oKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yZWxldmFudCA9ICgwLCBfdXRpbHMuZ2V0UmVsZXZhbnQpKGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMudyk7CiAgICB0aGlzLnggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBsZWZ0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy54KTsKICAgIGNvbnN0IHRvcCA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMueSk7CiAgICBjb25zdCBzdHlsZSA9IHsKICAgICAgbGVmdCwKICAgICAgdG9wLAogICAgICB3aWR0aDogKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy53KSwKICAgICAgaGVpZ2h0OiAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmgpCiAgICB9OwogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhQ29udGVudGFyZWEiXTsKICAgIGlmICgoMCwgX2h0bWxfdXRpbHMuaXNQcmludE9ubHkpKHRoaXMpKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhUHJpbnRPbmx5Iik7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBjaGlsZHJlbjogW10sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBzdHlsZSwKICAgICAgICBjbGFzczogY2xhc3NOYW1lcywKICAgICAgICBpZDogdGhpc1tfeGZhX29iamVjdC4kdWlkXQogICAgICB9CiAgICB9KTsKICB9Cn0KY2xhc3MgQ29ybmVyIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImNvcm5lciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmludmVydGVkID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuaW52ZXJ0ZWQsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmpvaW4gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5qb2luLCBbInNxdWFyZSIsICJyb3VuZCJdKTsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJhZGl1cyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMucmFkaXVzKTsKICAgIHRoaXMuc3Ryb2tlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuc3Ryb2tlLCBbInNvbGlkIiwgImRhc2hEb3QiLCAiZGFzaERvdERvdCIsICJkYXNoZWQiLCAiZG90dGVkIiwgImVtYm9zc2VkIiwgImV0Y2hlZCIsICJsb3dlcmVkIiwgInJhaXNlZCJdKTsKICAgIHRoaXMudGhpY2tuZXNzID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy50aGlja25lc3MsICIwLjVwdCIpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgInZpc2liaWxpdHkiKTsKICAgIHN0eWxlLnJhZGl1cyA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMuam9pbiA9PT0gInNxdWFyZSIgPyAwIDogdGhpcy5yYWRpdXMpOwogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBEYXRlRWxlbWVudCBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGF0ZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IGRhdGUgPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50cmltKCk7CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IGRhdGUgPyBuZXcgRGF0ZShkYXRlKSA6IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID8gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGF0ZVRpbWUgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRhdGVUaW1lIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFtfeGZhX29iamVjdC4kZmluYWxpemVdKCkgewogICAgY29uc3QgZGF0ZSA9IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID0gZGF0ZSA/IG5ldyBEYXRlKGRhdGUpIDogbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPyB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyBEYXRlVGltZUVkaXQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGF0ZVRpbWVFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmhTY3JvbGxQb2xpY3kgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5oU2Nyb2xsUG9saWN5LCBbImF1dG8iLCAib2ZmIiwgIm9uIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnBpY2tlciA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnBpY2tlciwgWyJob3N0IiwgIm5vbmUiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jb21iID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBzdHlsZSA9ICgwLCBfaHRtbF91dGlscy50b1N0eWxlKSh0aGlzLCAiYm9yZGVyIiwgImZvbnQiLCAibWFyZ2luIik7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImlucHV0IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHR5cGU6ICJ0ZXh0IiwKICAgICAgICBmaWVsZElkOiBmaWVsZFtfeGZhX29iamVjdC4kdWlkXSwKICAgICAgICBkYXRhSWQ6IGZpZWxkW194ZmFfb2JqZWN0LiRkYXRhXT8uW194ZmFfb2JqZWN0LiR1aWRdIHx8IGZpZWxkW194ZmFfb2JqZWN0LiR1aWRdLAogICAgICAgIGNsYXNzOiBbInhmYVRleHRmaWVsZCJdLAogICAgICAgIHN0eWxlLAogICAgICAgICJhcmlhLWxhYmVsIjogYXJpYUxhYmVsKGZpZWxkKSwKICAgICAgICAiYXJpYS1yZXF1aXJlZCI6IGZhbHNlCiAgICAgIH0KICAgIH07CiAgICBpZiAoaXNSZXF1aXJlZChmaWVsZCkpIHsKICAgICAgaHRtbC5hdHRyaWJ1dGVzWyJhcmlhLXJlcXVpcmVkIl0gPSB0cnVlOwogICAgICBodG1sLmF0dHJpYnV0ZXMucmVxdWlyZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAibGFiZWwiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhTGFiZWwiXQogICAgICB9LAogICAgICBjaGlsZHJlbjogW2h0bWxdCiAgICB9KTsKICB9Cn0KY2xhc3MgRGVjaW1hbCBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZGVjaW1hbCIpOwogICAgdGhpcy5mcmFjRGlnaXRzID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZnJhY0RpZ2l0cywKICAgICAgZGVmYXVsdFZhbHVlOiAyLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWFkRGlnaXRzID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubGVhZERpZ2l0cywKICAgICAgZGVmYXVsdFZhbHVlOiAtMSwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udHJpbSgpKTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID0gaXNOYU4obnVtYmVyKSA/IG51bGwgOiBudW1iZXI7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdICE9PSBudWxsID8gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRGVmYXVsdFVpIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlZmF1bHRVaSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KfQpjbGFzcyBEZXNjIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRlc2MiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGV4dCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50aW1lID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIERpZ2VzdE1ldGhvZCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJkaWdlc3RNZXRob2QiLCBbIiIsICJTSEExIiwgIlNIQTI1NiIsICJTSEE1MTIiLCAiUklQRU1EMTYwIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBEaWdlc3RNZXRob2RzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRpZ2VzdE1ldGhvZHMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmRpZ2VzdE1ldGhvZCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBEcmF3IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImRyYXciLCB0cnVlKTsKICAgIHRoaXMuYW5jaG9yVHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmFuY2hvclR5cGUsIFsidG9wTGVmdCIsICJib3R0b21DZW50ZXIiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJtaWRkbGVDZW50ZXIiLCAibWlkZGxlTGVmdCIsICJtaWRkbGVSaWdodCIsICJ0b3BDZW50ZXIiLCAidG9wUmlnaHQiXSk7CiAgICB0aGlzLmNvbFNwYW4gPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jb2xTcGFuLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSB8fCBuID09PSAtMQogICAgfSk7CiAgICB0aGlzLmggPSBhdHRyaWJ1dGVzLmggPyAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLmgpIDogIiI7CiAgICB0aGlzLmhBbGlnbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubG9jYWxlID0gYXR0cmlidXRlcy5sb2NhbGUgfHwgIiI7CiAgICB0aGlzLm1heEggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1heEgsICIwcHQiKTsKICAgIHRoaXMubWF4VyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWF4VywgIjBwdCIpOwogICAgdGhpcy5taW5IID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gKDAsIF91dGlscy5nZXRSZWxldmFudCkoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnJvdGF0ZSA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnJvdGF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ICUgOTAgPT09IDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNhcHRpb24gPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuZm9udCA9IG51bGw7CiAgICB0aGlzLmtlZXAgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudWkgPSBudWxsOwogICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQogIFtfeGZhX29iamVjdC4kc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBfc2V0VmFsdWUodGhpcywgdmFsdWUpOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIpIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgKDAsIF9odG1sX3V0aWxzLmZpeERpbWVuc2lvbnMpKHRoaXMpOwogICAgdGhpc1tfeGZhX29iamVjdC4kcHVzaFBhcmFdKCk7CiAgICBjb25zdCBzYXZlZFcgPSB0aGlzLnc7CiAgICBjb25zdCBzYXZlZEggPSB0aGlzLmg7CiAgICBjb25zdCB7CiAgICAgIHcsCiAgICAgIGgsCiAgICAgIGlzQnJva2VuCiAgICB9ID0gKDAsIF9odG1sX3V0aWxzLmxheW91dE5vZGUpKHRoaXMsIGF2YWlsYWJsZVNwYWNlKTsKICAgIGlmICh3ICYmIHRoaXMudyA9PT0gIiIpIHsKICAgICAgaWYgKGlzQnJva2VuICYmIHRoaXNbX3hmYV9vYmplY3QuJGdldFN1YmZvcm1QYXJlbnRdKClbX3hmYV9vYmplY3QuJGlzVGhlcmVNb3JlV2lkdGhdKCkpIHsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRwb3BQYXJhXSgpOwogICAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgICB9CiAgICAgIHRoaXMudyA9IHc7CiAgICB9CiAgICBpZiAoaCAmJiB0aGlzLmggPT09ICIiKSB7CiAgICAgIHRoaXMuaCA9IGg7CiAgICB9CiAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIGlmICghKDAsIF9sYXlvdXQuY2hlY2tEaW1lbnNpb25zKSh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgdGhpcy53ID0gc2F2ZWRXOwogICAgICB0aGlzLmggPSBzYXZlZEg7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJHBvcFBhcmFdKCk7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgdW5zZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIGNvbnN0IHN0eWxlID0gKDAsIF9odG1sX3V0aWxzLnRvU3R5bGUpKHRoaXMsICJmb250IiwgImhBbGlnbiIsICJkaW1lbnNpb25zIiwgInBvc2l0aW9uIiwgInByZXNlbmNlIiwgInJvdGF0ZSIsICJhbmNob3JUeXBlIiwgImJvcmRlciIsICJtYXJnaW4iKTsKICAgICgwLCBfaHRtbF91dGlscy5zZXRNaW5NYXhEaW1lbnNpb25zKSh0aGlzLCBzdHlsZSk7CiAgICBpZiAoc3R5bGUubWFyZ2luKSB7CiAgICAgIHN0eWxlLnBhZGRpbmcgPSBzdHlsZS5tYXJnaW47CiAgICAgIGRlbGV0ZSBzdHlsZS5tYXJnaW47CiAgICB9CiAgICBjb25zdCBjbGFzc05hbWVzID0gWyJ4ZmFEcmF3Il07CiAgICBpZiAodGhpcy5mb250KSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRm9udCIpOwogICAgfQogICAgaWYgKCgwLCBfaHRtbF91dGlscy5pc1ByaW50T25seSkodGhpcykpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFQcmludE9ubHkiKTsKICAgIH0KICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7CiAgICAgIHN0eWxlLAogICAgICBpZDogdGhpc1tfeGZhX29iamVjdC4kdWlkXSwKICAgICAgY2xhc3M6IGNsYXNzTmFtZXMKICAgIH07CiAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgIGF0dHJpYnV0ZXMueGZhTmFtZSA9IHRoaXMubmFtZTsKICAgIH0KICAgIGNvbnN0IGh0bWwgPSB7CiAgICAgIG5hbWU6ICJkaXYiLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBhcHBseUFzc2lzdCh0aGlzLCBhdHRyaWJ1dGVzKTsKICAgIGNvbnN0IGJib3ggPSAoMCwgX2h0bWxfdXRpbHMuY29tcHV0ZUJib3gpKHRoaXMsIGh0bWwsIGF2YWlsYWJsZVNwYWNlKTsKICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSA/IHRoaXMudmFsdWVbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWwgOiBudWxsOwogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIHRoaXMudyA9IHNhdmVkVzsKICAgICAgdGhpcy5oID0gc2F2ZWRIOwogICAgICB0aGlzW194ZmFfb2JqZWN0LiRwb3BQYXJhXSgpOwogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcygoMCwgX2h0bWxfdXRpbHMuY3JlYXRlV3JhcHBlcikodGhpcywgaHRtbCksIGJib3gpOwogICAgfQogICAgaHRtbC5jaGlsZHJlbi5wdXNoKHZhbHVlKTsKICAgICgwLCBfaHRtbF91dGlscy5zZXRQYXJhKSh0aGlzLCBzdHlsZSwgdmFsdWUpOwogICAgdGhpcy53ID0gc2F2ZWRXOwogICAgdGhpcy5oID0gc2F2ZWRIOwogICAgdGhpc1tfeGZhX29iamVjdC4kcG9wUGFyYV0oKTsKICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKCgwLCBfaHRtbF91dGlscy5jcmVhdGVXcmFwcGVyKSh0aGlzLCBodG1sKSwgYmJveCk7CiAgfQp9CmNsYXNzIEVkZ2UgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZWRnZSIsIHRydWUpOwogICAgdGhpcy5jYXAgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5jYXAsIFsic3F1YXJlIiwgImJ1dHQiLCAicm91bmQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnN0cm9rZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnN0cm9rZSwgWyJzb2xpZCIsICJkYXNoRG90IiwgImRhc2hEb3REb3QiLCAiZGFzaGVkIiwgImRvdHRlZCIsICJlbWJvc3NlZCIsICJldGNoZWQiLCAibG93ZXJlZCIsICJyYWlzZWQiXSk7CiAgICB0aGlzLnRoaWNrbmVzcyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMudGhpY2tuZXNzLCAiMC41cHQiKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHN0eWxlID0gKDAsIF9odG1sX3V0aWxzLnRvU3R5bGUpKHRoaXMsICJ2aXNpYmlsaXR5Iik7CiAgICBPYmplY3QuYXNzaWduKHN0eWxlLCB7CiAgICAgIGxpbmVjYXA6IHRoaXMuY2FwLAogICAgICB3aWR0aDogKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy50aGlja25lc3MpLAogICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCIsCiAgICAgIHN0eWxlOiAiIgogICAgfSk7CiAgICBpZiAodGhpcy5wcmVzZW5jZSAhPT0gInZpc2libGUiKSB7CiAgICAgIHN0eWxlLnN0eWxlID0gIm5vbmUiOwogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoICh0aGlzLnN0cm9rZSkgewogICAgICAgIGNhc2UgInNvbGlkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gInNvbGlkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hEb3REb3QiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZGFzaGVkIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImRhc2hlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJkYXNoZWQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZG90dGVkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gImRvdHRlZCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJlbWJvc3NlZCI6CiAgICAgICAgICBzdHlsZS5zdHlsZSA9ICJyaWRnZSI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJldGNoZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiZ3Jvb3ZlIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxvd2VyZWQiOgogICAgICAgICAgc3R5bGUuc3R5bGUgPSAiaW5zZXQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmFpc2VkIjoKICAgICAgICAgIHN0eWxlLnN0eWxlID0gIm91dHNldCI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KfQpjbGFzcyBFbmNvZGluZyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNvZGluZyIsIFsiYWRiZS54NTA5LnJzYV9zaGExIiwgImFkYmUucGtjczcuZGV0YWNoZWQiLCAiYWRiZS5wa2NzNy5zaGExIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFbmNvZGluZ3MgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jb2RpbmdzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNvZGluZyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBFbmNyeXB0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHQiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY2VydGlmaWNhdGUgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0RGF0YSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJlbmNyeXB0RGF0YSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJlbmNyeXB0IiwgImRlY3J5cHQiXSk7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogIH0KfQpjbGFzcyBFbmNyeXB0aW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb24iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2QgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZW5jcnlwdGlvbk1ldGhvZCIsIFsiIiwgIkFFUzI1Ni1DQkMiLCAiVFJJUExFREVTLUNCQyIsICJBRVMxMjgtQ0JDIiwgIkFFUzE5Mi1DQkMiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb25NZXRob2RzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImVuY3J5cHRpb25NZXRob2RzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEV2ZW50IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV2ZW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFjdGl2aXR5ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYWN0aXZpdHksIFsiY2xpY2siLCAiY2hhbmdlIiwgImRvY0Nsb3NlIiwgImRvY1JlYWR5IiwgImVudGVyIiwgImV4aXQiLCAiZnVsbCIsICJpbmRleENoYW5nZSIsICJpbml0aWFsaXplIiwgIm1vdXNlRG93biIsICJtb3VzZUVudGVyIiwgIm1vdXNlRXhpdCIsICJtb3VzZVVwIiwgInBvc3RFeGVjdXRlIiwgInBvc3RPcGVuIiwgInBvc3RQcmludCIsICJwb3N0U2F2ZSIsICJwb3N0U2lnbiIsICJwb3N0U3VibWl0IiwgInByZUV4ZWN1dGUiLCAicHJlT3BlbiIsICJwcmVQcmludCIsICJwcmVTYXZlIiwgInByZVNpZ24iLCAicHJlU3VibWl0IiwgInJlYWR5IiwgInZhbGlkYXRpb25TdGF0ZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5saXN0ZW4gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5saXN0ZW4sIFsicmVmT25seSIsICJyZWZBbmREZXNjZW5kZW50cyJdKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG51bGw7CiAgICB0aGlzLmV4ZWN1dGUgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogICAgdGhpcy5zaWduRGF0YSA9IG51bGw7CiAgICB0aGlzLnN1Ym1pdCA9IG51bGw7CiAgfQp9CmNsYXNzIEV4RGF0YSBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXhEYXRhIik7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaHJlZiA9IGF0dHJpYnV0ZXMuaHJlZiB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tYXhMZW5ndGggPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tYXhMZW5ndGgsCiAgICAgIGRlZmF1bHRWYWx1ZTogLTEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gLTEKICAgIH0pOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnRyYW5zZmVyRW5jb2RpbmcsIFsibm9uZSIsICJiYXNlNjQiLCAicGFja2FnZSJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQogIFtfeGZhX29iamVjdC4kaXNDREFUQVhtbF0oKSB7CiAgICByZXR1cm4gdGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQvaHRtbCI7CiAgfQogIFtfeGZhX29iamVjdC4kb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmICh0aGlzLmNvbnRlbnRUeXBlID09PSAidGV4dC9odG1sIiAmJiBjaGlsZFtfeGZhX29iamVjdC4kbmFtZXNwYWNlSWRdID09PSBfbmFtZXNwYWNlcy5OYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSA9PT0gInRleHQveG1sIikgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IGNoaWxkOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBpZiAodGhpcy5jb250ZW50VHlwZSAhPT0gInRleHQvaHRtbCIgfHwgIXRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIHJldHVybiB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XVtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgfQp9CmNsYXNzIEV4T2JqZWN0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV4T2JqZWN0IiwgdHJ1ZSk7CiAgICB0aGlzLmFyY2hpdmUgPSBhdHRyaWJ1dGVzLmFyY2hpdmUgfHwgIiI7CiAgICB0aGlzLmNsYXNzSWQgPSBhdHRyaWJ1dGVzLmNsYXNzSWQgfHwgIiI7CiAgICB0aGlzLmNvZGVCYXNlID0gYXR0cmlidXRlcy5jb2RlQmFzZSB8fCAiIjsKICAgIHRoaXMuY29kZVR5cGUgPSBhdHRyaWJ1dGVzLmNvZGVUeXBlIHx8ICIiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5ib29sZWFuID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZVRpbWUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVjaW1hbCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leERhdGEgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhPYmplY3QgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmxvYXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW1hZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW50ZWdlciA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRXhjbEdyb3VwIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImV4Y2xHcm91cCIsIHRydWUpOwogICAgdGhpcy5hY2Nlc3MgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5hY2Nlc3MsIFsib3BlbiIsICJub25JbnRlcmFjdGl2ZSIsICJwcm90ZWN0ZWQiLCAicmVhZE9ubHkiXSk7CiAgICB0aGlzLmFjY2Vzc0tleSA9IGF0dHJpYnV0ZXMuYWNjZXNzS2V5IHx8ICIiOwogICAgdGhpcy5hbmNob3JUeXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYW5jaG9yVHlwZSwgWyJ0b3BMZWZ0IiwgImJvdHRvbUNlbnRlciIsICJib3R0b21MZWZ0IiwgImJvdHRvbVJpZ2h0IiwgIm1pZGRsZUNlbnRlciIsICJtaWRkbGVMZWZ0IiwgIm1pZGRsZVJpZ2h0IiwgInRvcENlbnRlciIsICJ0b3BSaWdodCJdKTsKICAgIHRoaXMuY29sU3BhbiA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmNvbFNwYW4sCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAxIHx8IG4gPT09IC0xCiAgICB9KTsKICAgIHRoaXMuaCA9IGF0dHJpYnV0ZXMuaCA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMuaCkgOiAiIjsKICAgIHRoaXMuaEFsaWduID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sYXlvdXQgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5sYXlvdXQsIFsicG9zaXRpb24iLCAibHItdGIiLCAicmwtcm93IiwgInJsLXRiIiwgInJvdyIsICJ0YWJsZSIsICJ0YiJdKTsKICAgIHRoaXMubWF4SCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWF4SCwgIjBwdCIpOwogICAgdGhpcy5tYXhXID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5tYXhXLCAiMHB0Iik7CiAgICB0aGlzLm1pbkggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1pbkgsICIwcHQiKTsKICAgIHRoaXMubWluVyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWluVywgIjBwdCIpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5wcmVzZW5jZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnByZXNlbmNlLCBbInZpc2libGUiLCAiaGlkZGVuIiwgImluYWN0aXZlIiwgImludmlzaWJsZSJdKTsKICAgIHRoaXMucmVsZXZhbnQgPSAoMCwgX3V0aWxzLmdldFJlbGV2YW50KShhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLncgPSBhdHRyaWJ1dGVzLncgPyAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLncpIDogIiI7CiAgICB0aGlzLnggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLngsICIwcHQiKTsKICAgIHRoaXMueSA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMueSwgIjBwdCIpOwogICAgdGhpcy5hc3Npc3QgPSBudWxsOwogICAgdGhpcy5iaW5kID0gbnVsbDsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY2FsY3VsYXRlID0gbnVsbDsKICAgIHRoaXMuY2FwdGlvbiA9IG51bGw7CiAgICB0aGlzLmRlc2MgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogICAgdGhpcy5wYXJhID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2FsID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy5jb25uZWN0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZpZWxkID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQogIFtfeGZhX29iamVjdC4kaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgW194ZmFfb2JqZWN0LiRoYXNTZXR0YWJsZVZhbHVlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbX3hmYV9vYmplY3QuJHNldFZhbHVlXSh2YWx1ZSkgewogICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmZpZWxkLmNoaWxkcmVuKSB7CiAgICAgIGlmICghZmllbGQudmFsdWUpIHsKICAgICAgICBjb25zdCBub2RlVmFsdWUgPSBuZXcgVmFsdWUoe30pOwogICAgICAgIGZpZWxkW194ZmFfb2JqZWN0LiRhcHBlbmRDaGlsZF0obm9kZVZhbHVlKTsKICAgICAgICBmaWVsZC52YWx1ZSA9IG5vZGVWYWx1ZTsKICAgICAgfQogICAgICBmaWVsZC52YWx1ZVtfeGZhX29iamVjdC4kc2V0VmFsdWVdKHZhbHVlKTsKICAgIH0KICB9CiAgW194ZmFfb2JqZWN0LiRpc1RoZXJlTW9yZVdpZHRoXSgpIHsKICAgIHJldHVybiB0aGlzLmxheW91dC5lbmRzV2l0aCgiLXRiIikgJiYgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLm51bWJlckluTGluZSA+IDAgfHwgdGhpc1tfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpW194ZmFfb2JqZWN0LiRpc1RoZXJlTW9yZVdpZHRoXSgpOwogIH0KICBbX3hmYV9vYmplY3QuJGlzU3BsaXR0YWJsZV0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgaWYgKCFwYXJlbnRbX3hmYV9vYmplY3QuJGlzU3BsaXR0YWJsZV0oKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLl9pc1NwbGl0dGFibGUgIT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLl9pc1NwbGl0dGFibGU7CiAgICB9CiAgICBpZiAodGhpcy5sYXlvdXQgPT09ICJwb3NpdGlvbiIgfHwgdGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChwYXJlbnQubGF5b3V0Py5lbmRzV2l0aCgiLXRiIikgJiYgcGFyZW50W194ZmFfb2JqZWN0LiRleHRyYV0ubnVtYmVySW5MaW5lICE9PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5faXNTcGxpdHRhYmxlID0gdHJ1ZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBbX3hmYV9vYmplY3QuJGZsdXNoSFRNTF0oKSB7CiAgICByZXR1cm4gKDAsIF9sYXlvdXQuZmx1c2hIVE1MKSh0aGlzKTsKICB9CiAgW194ZmFfb2JqZWN0LiRhZGRIVE1MXShodG1sLCBiYm94KSB7CiAgICAoMCwgX2xheW91dC5hZGRIVE1MKSh0aGlzLCBodG1sLCBiYm94KTsKICB9CiAgW194ZmFfb2JqZWN0LiRnZXRBdmFpbGFibGVTcGFjZV0oKSB7CiAgICByZXR1cm4gKDAsIF9sYXlvdXQuZ2V0QXZhaWxhYmxlU3BhY2UpKHRoaXMpOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIgfHwgdGhpcy5oID09PSAwIHx8IHRoaXMudyA9PT0gMCkgewogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICAoMCwgX2h0bWxfdXRpbHMuZml4RGltZW5zaW9ucykodGhpcyk7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgaWQ6IHRoaXNbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgIGNsYXNzOiBbXQogICAgfTsKICAgICgwLCBfaHRtbF91dGlscy5zZXRBY2Nlc3MpKHRoaXMsIGF0dHJpYnV0ZXMuY2xhc3MpOwogICAgaWYgKCF0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0pIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIE9iamVjdC5hc3NpZ24odGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLCB7CiAgICAgIGNoaWxkcmVuLAogICAgICBhdHRyaWJ1dGVzLAogICAgICBhdHRlbXB0OiAwLAogICAgICBsaW5lOiBudWxsLAogICAgICBudW1iZXJJbkxpbmU6IDAsCiAgICAgIGF2YWlsYWJsZVNwYWNlOiB7CiAgICAgICAgd2lkdGg6IE1hdGgubWluKHRoaXMudyB8fCBJbmZpbml0eSwgYXZhaWxhYmxlU3BhY2Uud2lkdGgpLAogICAgICAgIGhlaWdodDogTWF0aC5taW4odGhpcy5oIHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpCiAgICAgIH0sCiAgICAgIHdpZHRoOiAwLAogICAgICBoZWlnaHQ6IDAsCiAgICAgIHByZXZIZWlnaHQ6IDAsCiAgICAgIGN1cnJlbnRXaWR0aDogMAogICAgfSk7CiAgICBjb25zdCBpc1NwbGl0dGFibGUgPSB0aGlzW194ZmFfb2JqZWN0LiRpc1NwbGl0dGFibGVdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICghKDAsIF9sYXlvdXQuY2hlY2tEaW1lbnNpb25zKSh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgU2V0KFsiZmllbGQiXSk7CiAgICBpZiAodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5XaWR0aHMpICYmIGNvbHVtbldpZHRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRoczsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0eWxlID0gKDAsIF9odG1sX3V0aWxzLnRvU3R5bGUpKHRoaXMsICJhbmNob3JUeXBlIiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicHJlc2VuY2UiLCAiYm9yZGVyIiwgIm1hcmdpbiIsICJoQWxpZ24iKTsKICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUV4Y2xncm91cCJdOwogICAgY29uc3QgY2wgPSAoMCwgX2h0bWxfdXRpbHMubGF5b3V0Q2xhc3MpKHRoaXMpOwogICAgaWYgKGNsKSB7CiAgICAgIGNsYXNzTmFtZXMucHVzaChjbCk7CiAgICB9CiAgICBpZiAoKDAsIF9odG1sX3V0aWxzLmlzUHJpbnRPbmx5KSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgYXR0cmlidXRlcy5zdHlsZSA9IHN0eWxlOwogICAgYXR0cmlidXRlcy5jbGFzcyA9IGNsYXNzTmFtZXM7CiAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgIGF0dHJpYnV0ZXMueGZhTmFtZSA9IHRoaXMubmFtZTsKICAgIH0KICAgIHRoaXNbX3hmYV9vYmplY3QuJHB1c2hQYXJhXSgpOwogICAgY29uc3QgaXNMclRiID0gdGhpcy5sYXlvdXQgPT09ICJsci10YiIgfHwgdGhpcy5sYXlvdXQgPT09ICJybC10YiI7CiAgICBjb25zdCBtYXhSdW4gPSBpc0xyVGIgPyBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIDogMTsKICAgIGZvciAoOyB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uYXR0ZW1wdCA8IG1heFJ1bjsgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmF0dGVtcHQrKykgewogICAgICBpZiAoaXNMclRiICYmIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5hdHRlbXB0ID09PSBNQVhfQVRURU1QVFNfRk9SX0xSVEJfTEFZT1VUIC0gMSkgewogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5udW1iZXJJbkxpbmUgPSAwOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXNbX3hmYV9vYmplY3QuJGNoaWxkcmVuVG9IVE1MXSh7CiAgICAgICAgZmlsdGVyLAogICAgICAgIGluY2x1ZGU6IHRydWUKICAgICAgfSk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChyZXN1bHQuaXNCcmVhaygpKSB7CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kcG9wUGFyYV0oKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmIChpc0xyVGIgJiYgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmF0dGVtcHQgPT09IDAgJiYgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLm51bWJlckluTGluZSA9PT0gMCAmJiAhdGhpc1tfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpW194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmF0dGVtcHQgPSBtYXhSdW47CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXNbX3hmYV9vYmplY3QuJHBvcFBhcmFdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgfQogICAgaWYgKHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5hdHRlbXB0ID09PSBtYXhSdW4pIHsKICAgICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgICBkZWxldGUgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdOwogICAgICB9CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQgKyB0aGlzLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gdGhpcy5tYXJnaW4udG9wSW5zZXQgKyB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLndpZHRoICsgbWFyZ2luSCwgdGhpcy53IHx8IDApOwogICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmhlaWdodCArIG1hcmdpblYsIHRoaXMuaCB8fCAwKTsKICAgIGNvbnN0IGJib3ggPSBbdGhpcy54LCB0aGlzLnksIHdpZHRoLCBoZWlnaHRdOwogICAgaWYgKHRoaXMudyA9PT0gIiIpIHsKICAgICAgc3R5bGUud2lkdGggPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh3aWR0aCk7CiAgICB9CiAgICBpZiAodGhpcy5oID09PSAiIikgewogICAgICBzdHlsZS5oZWlnaHQgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKShoZWlnaHQpOwogICAgfQogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuCiAgICB9OwogICAgYXBwbHlBc3Npc3QodGhpcywgYXR0cmlidXRlcyk7CiAgICBkZWxldGUgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdOwogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAsIF9odG1sX3V0aWxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsIGh0bWwpLCBiYm94KTsKICB9Cn0KY2xhc3MgRXhlY3V0ZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJleGVjdXRlIik7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLmV4ZWN1dGVUeXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuZXhlY3V0ZVR5cGUsIFsiaW1wb3J0IiwgInJlbWVyZ2UiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucnVuQXQgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5ydW5BdCwgWyJjbGllbnQiLCAiYm90aCIsICJzZXJ2ZXIiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBFeHRyYXMgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZXh0cmFzIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leHRyYXMgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmxvYXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW1hZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW50ZWdlciA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRmllbGQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZmllbGQiLCB0cnVlKTsKICAgIHRoaXMuYWNjZXNzID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYWNjZXNzLCBbIm9wZW4iLCAibm9uSW50ZXJhY3RpdmUiLCAicHJvdGVjdGVkIiwgInJlYWRPbmx5Il0pOwogICAgdGhpcy5hY2Nlc3NLZXkgPSBhdHRyaWJ1dGVzLmFjY2Vzc0tleSB8fCAiIjsKICAgIHRoaXMuYW5jaG9yVHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmFuY2hvclR5cGUsIFsidG9wTGVmdCIsICJib3R0b21DZW50ZXIiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJtaWRkbGVDZW50ZXIiLCAibWlkZGxlTGVmdCIsICJtaWRkbGVSaWdodCIsICJ0b3BDZW50ZXIiLCAidG9wUmlnaHQiXSk7CiAgICB0aGlzLmNvbFNwYW4gPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5jb2xTcGFuLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPj0gMSB8fCBuID09PSAtMQogICAgfSk7CiAgICB0aGlzLmggPSBhdHRyaWJ1dGVzLmggPyAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLmgpIDogIiI7CiAgICB0aGlzLmhBbGlnbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmhBbGlnbiwgWyJsZWZ0IiwgImNlbnRlciIsICJqdXN0aWZ5IiwgImp1c3RpZnlBbGwiLCAicmFkaXgiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubG9jYWxlID0gYXR0cmlidXRlcy5sb2NhbGUgfHwgIiI7CiAgICB0aGlzLm1heEggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1heEgsICIwcHQiKTsKICAgIHRoaXMubWF4VyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWF4VywgIjBwdCIpOwogICAgdGhpcy5taW5IID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5taW5ILCAiMHB0Iik7CiAgICB0aGlzLm1pblcgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1pblcsICIwcHQiKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gKDAsIF91dGlscy5nZXRSZWxldmFudCkoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnJvdGF0ZSA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnJvdGF0ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ICUgOTAgPT09IDAKICAgIH0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJpbmQgPSBudWxsOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5jYWxjdWxhdGUgPSBudWxsOwogICAgdGhpcy5jYXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZGVzYyA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZvbnQgPSBudWxsOwogICAgdGhpcy5mb3JtYXQgPSBudWxsOwogICAgdGhpcy5pdGVtcyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgyKTsKICAgIHRoaXMua2VlcCA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLnBhcmEgPSBudWxsOwogICAgdGhpcy50cmF2ZXJzYWwgPSBudWxsOwogICAgdGhpcy51aSA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgdGhpcy5iaW5kSXRlbXMgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29ubmVjdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ldmVudCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zZXRQcm9wZXJ0eSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KICBbX3hmYV9vYmplY3QuJGlzQmluZGFibGVdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFtfeGZhX29iamVjdC4kc2V0VmFsdWVdKHZhbHVlKSB7CiAgICBfc2V0VmFsdWUodGhpcywgdmFsdWUpOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHNldFRhYkluZGV4KHRoaXMpOwogICAgaWYgKCF0aGlzLnVpKSB7CiAgICAgIHRoaXMudWkgPSBuZXcgVWkoe30pOwogICAgICB0aGlzLnVpW194ZmFfb2JqZWN0LiRnbG9iYWxEYXRhXSA9IHRoaXNbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdOwogICAgICB0aGlzW194ZmFfb2JqZWN0LiRhcHBlbmRDaGlsZF0odGhpcy51aSk7CiAgICAgIGxldCBub2RlOwogICAgICBzd2l0Y2ggKHRoaXMuaXRlbXMuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgbm9kZSA9IG5ldyBUZXh0RWRpdCh7fSk7CiAgICAgICAgICB0aGlzLnVpLnRleHRFZGl0ID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgIG5vZGUgPSBuZXcgQ2hlY2tCdXR0b24oe30pOwogICAgICAgICAgdGhpcy51aS5jaGVja0J1dHRvbiA9IG5vZGU7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBub2RlID0gbmV3IENob2ljZUxpc3Qoe30pOwogICAgICAgICAgdGhpcy51aS5jaG9pY2VMaXN0ID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHRoaXMudWlbX3hmYV9vYmplY3QuJGFwcGVuZENoaWxkXShub2RlKTsKICAgIH0KICAgIGlmICghdGhpcy51aSB8fCB0aGlzLnByZXNlbmNlID09PSAiaGlkZGVuIiB8fCB0aGlzLnByZXNlbmNlID09PSAiaW5hY3RpdmUiIHx8IHRoaXMuaCA9PT0gMCB8fCB0aGlzLncgPT09IDApIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgaWYgKHRoaXMuY2FwdGlvbikgewogICAgICBkZWxldGUgdGhpcy5jYXB0aW9uW194ZmFfb2JqZWN0LiRleHRyYV07CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLmNhcHRpb24gPyB0aGlzLmNhcHRpb25bX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpLmh0bWwgOiBudWxsOwogICAgY29uc3Qgc2F2ZWRXID0gdGhpcy53OwogICAgY29uc3Qgc2F2ZWRIID0gdGhpcy5oOwogICAgbGV0IG1hcmdpbkggPSAwOwogICAgbGV0IG1hcmdpblYgPSAwOwogICAgaWYgKHRoaXMubWFyZ2luKSB7CiAgICAgIG1hcmdpbkggPSB0aGlzLm1hcmdpbi5sZWZ0SW5zZXQgKyB0aGlzLm1hcmdpbi5yaWdodEluc2V0OwogICAgICBtYXJnaW5WID0gdGhpcy5tYXJnaW4udG9wSW5zZXQgKyB0aGlzLm1hcmdpbi5ib3R0b21JbnNldDsKICAgIH0KICAgIGxldCBib3JkZXJEaW1zID0gbnVsbDsKICAgIGlmICh0aGlzLncgPT09ICIiIHx8IHRoaXMuaCA9PT0gIiIpIHsKICAgICAgbGV0IHdpZHRoID0gbnVsbDsKICAgICAgbGV0IGhlaWdodCA9IG51bGw7CiAgICAgIGxldCB1aVcgPSAwOwogICAgICBsZXQgdWlIID0gMDsKICAgICAgaWYgKHRoaXMudWkuY2hlY2tCdXR0b24pIHsKICAgICAgICB1aVcgPSB1aUggPSB0aGlzLnVpLmNoZWNrQnV0dG9uLnNpemU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3QgewogICAgICAgICAgdywKICAgICAgICAgIGgKICAgICAgICB9ID0gKDAsIF9odG1sX3V0aWxzLmxheW91dE5vZGUpKHRoaXMsIGF2YWlsYWJsZVNwYWNlKTsKICAgICAgICBpZiAodyAhPT0gbnVsbCkgewogICAgICAgICAgdWlXID0gdzsKICAgICAgICAgIHVpSCA9IGg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHVpSCA9ICgwLCBfZm9udHMuZ2V0TWV0cmljcykodGhpcy5mb250LCB0cnVlKS5saW5lTm9HYXA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJvcmRlckRpbXMgPSBnZXRCb3JkZXJEaW1zKHRoaXMudWlbX3hmYV9vYmplY3QuJGdldEV4dHJhXSgpKTsKICAgICAgdWlXICs9IGJvcmRlckRpbXMudzsKICAgICAgdWlIICs9IGJvcmRlckRpbXMuaDsKICAgICAgaWYgKHRoaXMuY2FwdGlvbikgewogICAgICAgIGNvbnN0IHsKICAgICAgICAgIHcsCiAgICAgICAgICBoLAogICAgICAgICAgaXNCcm9rZW4KICAgICAgICB9ID0gdGhpcy5jYXB0aW9uW194ZmFfb2JqZWN0LiRnZXRFeHRyYV0oYXZhaWxhYmxlU3BhY2UpOwogICAgICAgIGlmIChpc0Jyb2tlbiAmJiB0aGlzW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpW194ZmFfb2JqZWN0LiRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRwb3BQYXJhXSgpOwogICAgICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkZBSUxVUkU7CiAgICAgICAgfQogICAgICAgIHdpZHRoID0gdzsKICAgICAgICBoZWlnaHQgPSBoOwogICAgICAgIHN3aXRjaCAodGhpcy5jYXB0aW9uLnBsYWNlbWVudCkgewogICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICBjYXNlICJyaWdodCI6CiAgICAgICAgICBjYXNlICJpbmxpbmUiOgogICAgICAgICAgICB3aWR0aCArPSB1aVc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICAgIGhlaWdodCArPSB1aUg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB3aWR0aCA9IHVpVzsKICAgICAgICBoZWlnaHQgPSB1aUg7CiAgICAgIH0KICAgICAgaWYgKHdpZHRoICYmIHRoaXMudyA9PT0gIiIpIHsKICAgICAgICB3aWR0aCArPSBtYXJnaW5IOwogICAgICAgIHRoaXMudyA9IE1hdGgubWluKHRoaXMubWF4VyA8PSAwID8gSW5maW5pdHkgOiB0aGlzLm1heFcsIHRoaXMubWluVyArIDEgPCB3aWR0aCA/IHdpZHRoIDogdGhpcy5taW5XKTsKICAgICAgfQogICAgICBpZiAoaGVpZ2h0ICYmIHRoaXMuaCA9PT0gIiIpIHsKICAgICAgICBoZWlnaHQgKz0gbWFyZ2luVjsKICAgICAgICB0aGlzLmggPSBNYXRoLm1pbih0aGlzLm1heEggPD0gMCA/IEluZmluaXR5IDogdGhpcy5tYXhILCB0aGlzLm1pbkggKyAxIDwgaGVpZ2h0ID8gaGVpZ2h0IDogdGhpcy5taW5IKTsKICAgICAgfQogICAgfQogICAgdGhpc1tfeGZhX29iamVjdC4kcG9wUGFyYV0oKTsKICAgICgwLCBfaHRtbF91dGlscy5maXhEaW1lbnNpb25zKSh0aGlzKTsKICAgIHNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgaWYgKCEoMCwgX2xheW91dC5jaGVja0RpbWVuc2lvbnMpKHRoaXMsIGF2YWlsYWJsZVNwYWNlKSkgewogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kcG9wUGFyYV0oKTsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICB1bnNldEZpcnN0VW5zcGxpdHRhYmxlKHRoaXMpOwogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgImZvbnQiLCAiZGltZW5zaW9ucyIsICJwb3NpdGlvbiIsICJyb3RhdGUiLCAiYW5jaG9yVHlwZSIsICJwcmVzZW5jZSIsICJtYXJnaW4iLCAiaEFsaWduIik7CiAgICAoMCwgX2h0bWxfdXRpbHMuc2V0TWluTWF4RGltZW5zaW9ucykodGhpcywgc3R5bGUpOwogICAgY29uc3QgY2xhc3NOYW1lcyA9IFsieGZhRmllbGQiXTsKICAgIGlmICh0aGlzLmZvbnQpIHsKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFGb250Iik7CiAgICB9CiAgICBpZiAoKDAsIF9odG1sX3V0aWxzLmlzUHJpbnRPbmx5KSh0aGlzKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYXR0cmlidXRlcyA9IHsKICAgICAgc3R5bGUsCiAgICAgIGlkOiB0aGlzW194ZmFfb2JqZWN0LiR1aWRdLAogICAgICBjbGFzczogY2xhc3NOYW1lcwogICAgfTsKICAgIGlmIChzdHlsZS5tYXJnaW4pIHsKICAgICAgc3R5bGUucGFkZGluZyA9IHN0eWxlLm1hcmdpbjsKICAgICAgZGVsZXRlIHN0eWxlLm1hcmdpbjsKICAgIH0KICAgICgwLCBfaHRtbF91dGlscy5zZXRBY2Nlc3MpKHRoaXMsIGNsYXNzTmFtZXMpOwogICAgaWYgKHRoaXMubmFtZSkgewogICAgICBhdHRyaWJ1dGVzLnhmYU5hbWUgPSB0aGlzLm5hbWU7CiAgICB9CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgY29uc3QgaHRtbCA9IHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGNoaWxkcmVuCiAgICB9OwogICAgYXBwbHlBc3Npc3QodGhpcywgYXR0cmlidXRlcyk7CiAgICBjb25zdCBib3JkZXJTdHlsZSA9IHRoaXMuYm9yZGVyID8gdGhpcy5ib3JkZXJbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgOiBudWxsOwogICAgY29uc3QgYmJveCA9ICgwLCBfaHRtbF91dGlscy5jb21wdXRlQmJveCkodGhpcywgaHRtbCwgYXZhaWxhYmxlU3BhY2UpOwogICAgY29uc3QgdWkgPSB0aGlzLnVpW194ZmFfb2JqZWN0LiR0b0hUTUxdKCkuaHRtbDsKICAgIGlmICghdWkpIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgYm9yZGVyU3R5bGUpOwogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcygoMCwgX2h0bWxfdXRpbHMuY3JlYXRlV3JhcHBlcikodGhpcywgaHRtbCksIGJib3gpOwogICAgfQogICAgaWYgKHRoaXNbX3hmYV9vYmplY3QuJHRhYkluZGV4XSkgewogICAgICBpZiAodWkuY2hpbGRyZW4/LlswXSkgewogICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMudGFiaW5kZXggPSB0aGlzW194ZmFfb2JqZWN0LiR0YWJJbmRleF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdWkuYXR0cmlidXRlcy50YWJpbmRleCA9IHRoaXNbX3hmYV9vYmplY3QuJHRhYkluZGV4XTsKICAgICAgfQogICAgfQogICAgaWYgKCF1aS5hdHRyaWJ1dGVzLnN0eWxlKSB7CiAgICAgIHVpLmF0dHJpYnV0ZXMuc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgfQogICAgbGV0IGFFbGVtZW50ID0gbnVsbDsKICAgIGlmICh0aGlzLnVpLmJ1dHRvbikgewogICAgICBpZiAodWkuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgW2FFbGVtZW50XSA9IHVpLmNoaWxkcmVuLnNwbGljZSgwLCAxKTsKICAgICAgfQogICAgICBPYmplY3QuYXNzaWduKHVpLmF0dHJpYnV0ZXMuc3R5bGUsIGJvcmRlclN0eWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIGJvcmRlclN0eWxlKTsKICAgIH0KICAgIGNoaWxkcmVuLnB1c2godWkpOwogICAgaWYgKHRoaXMudmFsdWUpIHsKICAgICAgaWYgKHRoaXMudWkuaW1hZ2VFZGl0KSB7CiAgICAgICAgdWkuY2hpbGRyZW4ucHVzaCh0aGlzLnZhbHVlW194ZmFfb2JqZWN0LiR0b0hUTUxdKCkuaHRtbCk7CiAgICAgIH0gZWxzZSBpZiAoIXRoaXMudWkuYnV0dG9uKSB7CiAgICAgICAgbGV0IHZhbHVlID0gIiI7CiAgICAgICAgaWYgKHRoaXMudmFsdWUuZXhEYXRhKSB7CiAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWUuZXhEYXRhW194ZmFfb2JqZWN0LiR0ZXh0XSgpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS50ZXh0KSB7CiAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWUudGV4dFtfeGZhX29iamVjdC4kZ2V0RXh0cmFdKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGh0bWxWYWx1ZSA9IHRoaXMudmFsdWVbX3hmYV9vYmplY3QuJHRvSFRNTF0oKS5odG1sOwogICAgICAgICAgaWYgKGh0bWxWYWx1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICB2YWx1ZSA9IGh0bWxWYWx1ZS5jaGlsZHJlblswXS52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudWkudGV4dEVkaXQgJiYgdGhpcy52YWx1ZS50ZXh0Py5tYXhDaGFycykgewogICAgICAgICAgdWkuY2hpbGRyZW5bMF0uYXR0cmlidXRlcy5tYXhMZW5ndGggPSB0aGlzLnZhbHVlLnRleHQubWF4Q2hhcnM7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMudWkubnVtZXJpY0VkaXQpIHsKICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgdmFsdWUgPSBpc05hTih2YWx1ZSkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodWkuY2hpbGRyZW5bMF0ubmFtZSA9PT0gInRleHRhcmVhIikgewogICAgICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1aS5jaGlsZHJlblswXS5hdHRyaWJ1dGVzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoIXRoaXMudWkuaW1hZ2VFZGl0ICYmIHVpLmNoaWxkcmVuPy5bMF0gJiYgdGhpcy5oKSB7CiAgICAgIGJvcmRlckRpbXMgPSBib3JkZXJEaW1zIHx8IGdldEJvcmRlckRpbXModGhpcy51aVtfeGZhX29iamVjdC4kZ2V0RXh0cmFdKCkpOwogICAgICBsZXQgY2FwdGlvbkhlaWdodCA9IDA7CiAgICAgIGlmICh0aGlzLmNhcHRpb24gJiYgWyJ0b3AiLCAiYm90dG9tIl0uaW5jbHVkZXModGhpcy5jYXB0aW9uLnBsYWNlbWVudCkpIHsKICAgICAgICBjYXB0aW9uSGVpZ2h0ID0gdGhpcy5jYXB0aW9uLnJlc2VydmU7CiAgICAgICAgaWYgKGNhcHRpb25IZWlnaHQgPD0gMCkgewogICAgICAgICAgY2FwdGlvbkhlaWdodCA9IHRoaXMuY2FwdGlvbltfeGZhX29iamVjdC4kZ2V0RXh0cmFdKGF2YWlsYWJsZVNwYWNlKS5oOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbnB1dEhlaWdodCA9IHRoaXMuaCAtIGNhcHRpb25IZWlnaHQgLSBtYXJnaW5WIC0gYm9yZGVyRGltcy5oOwogICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoaW5wdXRIZWlnaHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHVpLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CiAgICB9CiAgICBpZiAoYUVsZW1lbnQpIHsKICAgICAgdWkuY2hpbGRyZW4ucHVzaChhRWxlbWVudCk7CiAgICB9CiAgICBpZiAoIWNhcHRpb24pIHsKICAgICAgaWYgKHVpLmF0dHJpYnV0ZXMuY2xhc3MpIHsKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgfQogICAgICB0aGlzLncgPSBzYXZlZFc7CiAgICAgIHRoaXMuaCA9IHNhdmVkSDsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAsIF9odG1sX3V0aWxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsIGh0bWwpLCBiYm94KTsKICAgIH0KICAgIGlmICh0aGlzLnVpLmJ1dHRvbikgewogICAgICBpZiAoc3R5bGUucGFkZGluZykgewogICAgICAgIGRlbGV0ZSBzdHlsZS5wYWRkaW5nOwogICAgICB9CiAgICAgIGlmIChjYXB0aW9uLm5hbWUgPT09ICJkaXYiKSB7CiAgICAgICAgY2FwdGlvbi5uYW1lID0gInNwYW4iOwogICAgICB9CiAgICAgIHVpLmNoaWxkcmVuLnB1c2goY2FwdGlvbik7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKGh0bWwsIGJib3gpOwogICAgfSBlbHNlIGlmICh0aGlzLnVpLmNoZWNrQnV0dG9uKSB7CiAgICAgIGNhcHRpb24uYXR0cmlidXRlcy5jbGFzc1swXSA9ICJ4ZmFDYXB0aW9uRm9yQ2hlY2tCdXR0b24iOwogICAgfQogICAgaWYgKCF1aS5hdHRyaWJ1dGVzLmNsYXNzKSB7CiAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MgPSBbXTsKICAgIH0KICAgIHVpLmNoaWxkcmVuLnNwbGljZSgwLCAwLCBjYXB0aW9uKTsKICAgIHN3aXRjaCAodGhpcy5jYXB0aW9uLnBsYWNlbWVudCkgewogICAgICBjYXNlICJsZWZ0IjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYUxlZnQiKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhUmlnaHQiKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wIjoKICAgICAgICB1aS5hdHRyaWJ1dGVzLmNsYXNzLnB1c2goInhmYVRvcCIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJib3R0b20iOgogICAgICAgIHVpLmF0dHJpYnV0ZXMuY2xhc3MucHVzaCgieGZhQm90dG9tIik7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImlubGluZSI6CiAgICAgICAgdWkuYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFMZWZ0Iik7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICB0aGlzLncgPSBzYXZlZFc7CiAgICB0aGlzLmggPSBzYXZlZEg7CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcygoMCwgX2h0bWxfdXRpbHMuY3JlYXRlV3JhcHBlcikodGhpcywgaHRtbCksIGJib3gpOwogIH0KfQpleHBvcnRzLkZpZWxkID0gRmllbGQ7CmNsYXNzIEZpbGwgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiZmlsbCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5saW5lYXIgPSBudWxsOwogICAgdGhpcy5wYXR0ZXJuID0gbnVsbDsKICAgIHRoaXMucmFkaWFsID0gbnVsbDsKICAgIHRoaXMuc29saWQgPSBudWxsOwogICAgdGhpcy5zdGlwcGxlID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIHsKICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdyYW5kcGEgPSBwYXJlbnRbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIGNvbnN0IGdncmFuZHBhID0gZ3JhbmRwYVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgbGV0IHByb3BOYW1lID0gImNvbG9yIjsKICAgIGxldCBhbHRQcm9wTmFtZSA9IHByb3BOYW1lOwogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJvcmRlcikgewogICAgICBwcm9wTmFtZSA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsKICAgICAgYWx0UHJvcE5hbWUgPSAiYmFja2dyb3VuZCI7CiAgICAgIGlmIChnZ3JhbmRwYSBpbnN0YW5jZW9mIFVpKSB7CiAgICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gIndoaXRlIjsKICAgICAgfQogICAgfQogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBBcmMpIHsKICAgICAgcHJvcE5hbWUgPSBhbHRQcm9wTmFtZSA9ICJmaWxsIjsKICAgICAgc3R5bGUuZmlsbCA9ICJ3aGl0ZSI7CiAgICB9CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgaWYgKG5hbWUgPT09ICJleHRyYXMiIHx8IG5hbWUgPT09ICJjb2xvciIpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBvYmogPSB0aGlzW25hbWVdOwogICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBfeGZhX29iamVjdC5YRkFPYmplY3QpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgY29sb3IgPSBvYmpbX3hmYV9vYmplY3QuJHRvU3R5bGVdKHRoaXMuY29sb3IpOwogICAgICBpZiAoY29sb3IpIHsKICAgICAgICBzdHlsZVtjb2xvci5zdGFydHNXaXRoKCIjIikgPyBwcm9wTmFtZSA6IGFsdFByb3BOYW1lXSA9IGNvbG9yOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICAgIGlmICh0aGlzLmNvbG9yPy52YWx1ZSkgewogICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3JbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCk7CiAgICAgIHN0eWxlW2NvbG9yLnN0YXJ0c1dpdGgoIiMiKSA/IHByb3BOYW1lIDogYWx0UHJvcE5hbWVdID0gY29sb3I7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEZpbHRlciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmaWx0ZXIiLCB0cnVlKTsKICAgIHRoaXMuYWRkUmV2b2NhdGlvbkluZm8gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5hZGRSZXZvY2F0aW9uSW5mbywgWyIiLCAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAibm9uZSJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudmVyc2lvbiA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiB0aGlzLnZlcnNpb24sCiAgICAgIGRlZmF1bHRWYWx1ZTogNSwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAxICYmIHggPD0gNQogICAgfSk7CiAgICB0aGlzLmFwcGVhcmFuY2VGaWx0ZXIgPSBudWxsOwogICAgdGhpcy5jZXJ0aWZpY2F0ZXMgPSBudWxsOwogICAgdGhpcy5kaWdlc3RNZXRob2RzID0gbnVsbDsKICAgIHRoaXMuZW5jb2RpbmdzID0gbnVsbDsKICAgIHRoaXMuZW5jcnlwdGlvbk1ldGhvZHMgPSBudWxsOwogICAgdGhpcy5oYW5kbGVyID0gbnVsbDsKICAgIHRoaXMubG9ja0RvY3VtZW50ID0gbnVsbDsKICAgIHRoaXMubWRwID0gbnVsbDsKICAgIHRoaXMucmVhc29ucyA9IG51bGw7CiAgICB0aGlzLnRpbWVTdGFtcCA9IG51bGw7CiAgfQp9CmNsYXNzIEZsb2F0IGV4dGVuZHMgX3hmYV9vYmplY3QuQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmbG9hdCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udHJpbSgpKTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID0gaXNOYU4obnVtYmVyKSA/IG51bGwgOiBudW1iZXI7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgcmV0dXJuIHZhbHVlVG9IdG1sKHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdICE9PSBudWxsID8gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udG9TdHJpbmcoKSA6ICIiKTsKICB9Cn0KY2xhc3MgRm9udCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmb250IiwgdHJ1ZSk7CiAgICB0aGlzLmJhc2VsaW5lU2hpZnQgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLmJhc2VsaW5lU2hpZnQpOwogICAgdGhpcy5mb250SG9yaXpvbnRhbFNjYWxlID0gKDAsIF91dGlscy5nZXRGbG9hdCkoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZvbnRIb3Jpem9udGFsU2NhbGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMTAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5mb250VmVydGljYWxTY2FsZSA9ICgwLCBfdXRpbHMuZ2V0RmxvYXQpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5mb250VmVydGljYWxTY2FsZSwKICAgICAgZGVmYXVsdFZhbHVlOiAxMDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMua2VybmluZ01vZGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5rZXJuaW5nTW9kZSwgWyJub25lIiwgInBhaXIiXSk7CiAgICB0aGlzLmxldHRlclNwYWNpbmcgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLmxldHRlclNwYWNpbmcsICIwIik7CiAgICB0aGlzLmxpbmVUaHJvdWdoID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubGluZVRocm91Z2gsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMubGluZVRocm91Z2hQZXJpb2QgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5saW5lVGhyb3VnaFBlcmlvZCwgWyJhbGwiLCAid29yZCJdKTsKICAgIHRoaXMub3ZlcmxpbmUgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5vdmVybGluZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxIHx8IHggPT09IDIKICAgIH0pOwogICAgdGhpcy5vdmVybGluZVBlcmlvZCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm92ZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy5wb3N0dXJlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMucG9zdHVyZSwgWyJub3JtYWwiLCAiaXRhbGljIl0pOwogICAgdGhpcy5zaXplID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5zaXplLCAiMTBwdCIpOwogICAgdGhpcy50eXBlZmFjZSA9IGF0dHJpYnV0ZXMudHlwZWZhY2UgfHwgIkNvdXJpZXIiOwogICAgdGhpcy51bmRlcmxpbmUgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy51bmRlcmxpbmUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMSB8fCB4ID09PSAyCiAgICB9KTsKICAgIHRoaXMudW5kZXJsaW5lUGVyaW9kID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudW5kZXJsaW5lUGVyaW9kLCBbImFsbCIsICJ3b3JkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMud2VpZ2h0ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMud2VpZ2h0LCBbIm5vcm1hbCIsICJib2xkIl0pOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5maWxsID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbX3hmYV9vYmplY3QuJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdLnVzZWRUeXBlZmFjZXMuYWRkKHRoaXMudHlwZWZhY2UpOwogIH0KICBbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgImZpbGwiKTsKICAgIGNvbnN0IGNvbG9yID0gc3R5bGUuY29sb3I7CiAgICBpZiAoY29sb3IpIHsKICAgICAgaWYgKGNvbG9yID09PSAiIzAwMDAwMCIpIHsKICAgICAgICBkZWxldGUgc3R5bGUuY29sb3I7CiAgICAgIH0gZWxzZSBpZiAoIWNvbG9yLnN0YXJ0c1dpdGgoIiMiKSkgewogICAgICAgIHN0eWxlLmJhY2tncm91bmQgPSBjb2xvcjsKICAgICAgICBzdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICJ0ZXh0IjsKICAgICAgICBzdHlsZS5jb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aGlzLmJhc2VsaW5lU2hpZnQpIHsKICAgICAgc3R5bGUudmVydGljYWxBbGlnbiA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMuYmFzZWxpbmVTaGlmdCk7CiAgICB9CiAgICBzdHlsZS5mb250S2VybmluZyA9IHRoaXMua2VybmluZ01vZGUgPT09ICJub25lIiA/ICJub25lIiA6ICJub3JtYWwiOwogICAgc3R5bGUubGV0dGVyU3BhY2luZyA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubGV0dGVyU3BhY2luZyk7CiAgICBpZiAodGhpcy5saW5lVGhyb3VnaCAhPT0gMCkgewogICAgICBzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICJsaW5lLXRocm91Z2giOwogICAgICBpZiAodGhpcy5saW5lVGhyb3VnaCA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMub3ZlcmxpbmUgIT09IDApIHsKICAgICAgc3R5bGUudGV4dERlY29yYXRpb24gPSAib3ZlcmxpbmUiOwogICAgICBpZiAodGhpcy5vdmVybGluZSA9PT0gMikgewogICAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uU3R5bGUgPSAiZG91YmxlIjsKICAgICAgfQogICAgfQogICAgc3R5bGUuZm9udFN0eWxlID0gdGhpcy5wb3N0dXJlOwogICAgc3R5bGUuZm9udFNpemUgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSgwLjk5ICogdGhpcy5zaXplKTsKICAgICgwLCBfaHRtbF91dGlscy5zZXRGb250RmFtaWx5KSh0aGlzLCB0aGlzLCB0aGlzW194ZmFfb2JqZWN0LiRnbG9iYWxEYXRhXS5mb250RmluZGVyLCBzdHlsZSk7CiAgICBpZiAodGhpcy51bmRlcmxpbmUgIT09IDApIHsKICAgICAgc3R5bGUudGV4dERlY29yYXRpb24gPSAidW5kZXJsaW5lIjsKICAgICAgaWYgKHRoaXMudW5kZXJsaW5lID09PSAyKSB7CiAgICAgICAgc3R5bGUudGV4dERlY29yYXRpb25TdHlsZSA9ICJkb3VibGUiOwogICAgICB9CiAgICB9CiAgICBzdHlsZS5mb250V2VpZ2h0ID0gdGhpcy53ZWlnaHQ7CiAgICByZXR1cm4gc3R5bGU7CiAgfQp9CmNsYXNzIEZvcm1hdCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJmb3JtYXQiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMucGljdHVyZSA9IG51bGw7CiAgfQp9CmNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaGFuZGxlciIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgSHlwaGVuYXRpb24gZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaHlwaGVuYXRpb24iKTsKICAgIHRoaXMuZXhjbHVkZUFsbENhcHMgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5leGNsdWRlQWxsQ2FwcywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuZXhjbHVkZUluaXRpYWxDYXAgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5leGNsdWRlSW5pdGlhbENhcCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMuaHlwaGVuYXRlID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuaHlwaGVuYXRlLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnB1c2hDaGFyYWN0ZXJDb3VudCA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnB1c2hDaGFyYWN0ZXJDb3VudCwKICAgICAgZGVmYXVsdFZhbHVlOiAzLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5yZW1haW5DaGFyYWN0ZXJDb3VudCA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnJlbWFpbkNoYXJhY3RlckNvdW50LAogICAgICBkZWZhdWx0VmFsdWU6IDMsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMAogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy53b3JkQ2hhcmFjdGVyQ291bnQgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy53b3JkQ2hhcmFjdGVyQ291bnQsCiAgICAgIGRlZmF1bHRWYWx1ZTogNywKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICB9Cn0KY2xhc3MgSW1hZ2UgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW1hZ2UiKTsKICAgIHRoaXMuYXNwZWN0ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYXNwZWN0LCBbImZpdCIsICJhY3R1YWwiLCAiaGVpZ2h0IiwgIm5vbmUiLCAid2lkdGgiXSk7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaHJlZiA9IGF0dHJpYnV0ZXMuaHJlZiB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy50cmFuc2ZlckVuY29kaW5nID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHJhbnNmZXJFbmNvZGluZywgWyJiYXNlNjQiLCAibm9uZSIsICJwYWNrYWdlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKCkgewogICAgaWYgKHRoaXMuY29udGVudFR5cGUgJiYgIU1JTUVTLmhhcyh0aGlzLmNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGxldCBidWZmZXIgPSB0aGlzW194ZmFfb2JqZWN0LiRnbG9iYWxEYXRhXS5pbWFnZXMgJiYgdGhpc1tfeGZhX29iamVjdC4kZ2xvYmFsRGF0YV0uaW1hZ2VzLmdldCh0aGlzLmhyZWYpOwogICAgaWYgKCFidWZmZXIgJiYgKHRoaXMuaHJlZiB8fCAhdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0pKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICghYnVmZmVyICYmIHRoaXMudHJhbnNmZXJFbmNvZGluZyA9PT0gImJhc2U2NCIpIHsKICAgICAgYnVmZmVyID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKGF0b2IodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0pKTsKICAgIH0KICAgIGlmICghYnVmZmVyKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGlmICghdGhpcy5jb250ZW50VHlwZSkgewogICAgICBmb3IgKGNvbnN0IFtoZWFkZXIsIHR5cGVdIG9mIElNQUdFU19IRUFERVJTKSB7CiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPiBoZWFkZXIubGVuZ3RoICYmIGhlYWRlci5ldmVyeSgoeCwgaSkgPT4geCA9PT0gYnVmZmVyW2ldKSkgewogICAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IHR5cGU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmNvbnRlbnRUeXBlKSB7CiAgICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogICAgICB9CiAgICB9CiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsKICAgICAgdHlwZTogdGhpcy5jb250ZW50VHlwZQogICAgfSk7CiAgICBsZXQgc3R5bGU7CiAgICBzd2l0Y2ggKHRoaXMuYXNwZWN0KSB7CiAgICAgIGNhc2UgImZpdCI6CiAgICAgIGNhc2UgImFjdHVhbCI6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhlaWdodCI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICBoZWlnaHQ6ICIxMDAlIiwKICAgICAgICAgIG9iamVjdEZpdDogImZpbGwiCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibm9uZSI6CiAgICAgICAgc3R5bGUgPSB7CiAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgaGVpZ2h0OiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIndpZHRoIjoKICAgICAgICBzdHlsZSA9IHsKICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICBvYmplY3RGaXQ6ICJmaWxsIgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJpbWciLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgY2xhc3M6IFsieGZhSW1hZ2UiXSwKICAgICAgICBzdHlsZSwKICAgICAgICBzcmM6IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYiksCiAgICAgICAgYWx0OiBwYXJlbnQgPyBhcmlhTGFiZWwocGFyZW50W194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCkpIDogbnVsbAogICAgICB9CiAgICB9KTsKICB9Cn0KY2xhc3MgSW1hZ2VFZGl0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImltYWdlRWRpdCIsIHRydWUpOwogICAgdGhpcy5kYXRhID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuZGF0YSwgWyJsaW5rIiwgImVtYmVkIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGlmICh0aGlzLmRhdGEgPT09ICJlbWJlZCIpIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICAgIG5hbWU6ICJkaXYiLAogICAgICAgIGNoaWxkcmVuOiBbXSwKICAgICAgICBhdHRyaWJ1dGVzOiB7fQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICB9Cn0KY2xhc3MgSW50ZWdlciBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAiaW50ZWdlciIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKSwgMTApOwogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBpc05hTihudW1iZXIpID8gbnVsbCA6IG51bWJlcjsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICByZXR1cm4gdmFsdWVUb0h0bWwodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gIT09IG51bGwgPyB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50b1N0cmluZygpIDogIiIpOwogIH0KfQpjbGFzcyBJc3N1ZXJzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImlzc3VlcnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIEl0ZW1zIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIml0ZW1zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucHJlc2VuY2UgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmVzZW5jZSwgWyJ2aXNpYmxlIiwgImhpZGRlbiIsICJpbmFjdGl2ZSIsICJpbnZpc2libGUiXSk7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy5zYXZlID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuc2F2ZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWNpbWFsID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mbG9hdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbnRlZ2VyID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oKSB7CiAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpc1tfeGZhX29iamVjdC4kZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgb3V0cHV0LnB1c2goY2hpbGRbX3hmYV9vYmplY3QuJHRleHRdKCkpOwogICAgfQogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3Mob3V0cHV0KTsKICB9Cn0KZXhwb3J0cy5JdGVtcyA9IEl0ZW1zOwpjbGFzcyBLZWVwIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImtlZXAiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgY29uc3Qgb3B0aW9ucyA9IFsibm9uZSIsICJjb250ZW50QXJlYSIsICJwYWdlQXJlYSJdOwogICAgdGhpcy5pbnRhY3QgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5pbnRhY3QsIG9wdGlvbnMpOwogICAgdGhpcy5uZXh0ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMubmV4dCwgb3B0aW9ucyk7CiAgICB0aGlzLnByZXZpb3VzID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMucHJldmlvdXMsIG9wdGlvbnMpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9Cn0KY2xhc3MgS2V5VXNhZ2UgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAia2V5VXNhZ2UiKTsKICAgIGNvbnN0IG9wdGlvbnMgPSBbIiIsICJ5ZXMiLCAibm8iXTsKICAgIHRoaXMuY3JsU2lnbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmNybFNpZ24sIG9wdGlvbnMpOwogICAgdGhpcy5kYXRhRW5jaXBoZXJtZW50ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuZGF0YUVuY2lwaGVybWVudCwgb3B0aW9ucyk7CiAgICB0aGlzLmRlY2lwaGVyT25seSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmRlY2lwaGVyT25seSwgb3B0aW9ucyk7CiAgICB0aGlzLmRpZ2l0YWxTaWduYXR1cmUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5kaWdpdGFsU2lnbmF0dXJlLCBvcHRpb25zKTsKICAgIHRoaXMuZW5jaXBoZXJPbmx5ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuZW5jaXBoZXJPbmx5LCBvcHRpb25zKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5rZXlBZ3JlZW1lbnQgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5rZXlBZ3JlZW1lbnQsIG9wdGlvbnMpOwogICAgdGhpcy5rZXlDZXJ0U2lnbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmtleUNlcnRTaWduLCBvcHRpb25zKTsKICAgIHRoaXMua2V5RW5jaXBoZXJtZW50ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMua2V5RW5jaXBoZXJtZW50LCBvcHRpb25zKTsKICAgIHRoaXMubm9uUmVwdWRpYXRpb24gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5ub25SZXB1ZGlhdGlvbiwgb3B0aW9ucyk7CiAgICB0aGlzLnR5cGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgTGluZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJsaW5lIiwgdHJ1ZSk7CiAgICB0aGlzLmhhbmQgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5oYW5kLCBbImV2ZW4iLCAibGVmdCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zbG9wZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnNsb3BlLCBbIlxcIiwgIi8iXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5lZGdlID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBlZGdlID0gdGhpcy5lZGdlIHx8IG5ldyBFZGdlKHt9KTsKICAgIGNvbnN0IGVkZ2VTdHlsZSA9IGVkZ2VbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCk7CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBjb25zdCB0aGlja25lc3MgPSBlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDA7CiAgICBzdHlsZS5zdHJva2VXaWR0aCA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaWNrbmVzcyk7CiAgICBzdHlsZS5zdHJva2UgPSBlZGdlU3R5bGUuY29sb3I7CiAgICBsZXQgeDEsIHkxLCB4MiwgeTI7CiAgICBsZXQgd2lkdGggPSAiMTAwJSI7CiAgICBsZXQgaGVpZ2h0ID0gIjEwMCUiOwogICAgaWYgKHBhcmVudC53IDw9IHRoaWNrbmVzcykgewogICAgICBbeDEsIHkxLCB4MiwgeTJdID0gWyI1MCUiLCAwLCAiNTAlIiwgIjEwMCUiXTsKICAgICAgd2lkdGggPSBzdHlsZS5zdHJva2VXaWR0aDsKICAgIH0gZWxzZSBpZiAocGFyZW50LmggPD0gdGhpY2tuZXNzKSB7CiAgICAgIFt4MSwgeTEsIHgyLCB5Ml0gPSBbMCwgIjUwJSIsICIxMDAlIiwgIjUwJSJdOwogICAgICBoZWlnaHQgPSBzdHlsZS5zdHJva2VXaWR0aDsKICAgIH0gZWxzZSB7CiAgICAgIGlmICh0aGlzLnNsb3BlID09PSAiXFwiKSB7CiAgICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFswLCAwLCAiMTAwJSIsICIxMDAlIl07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgW3gxLCB5MSwgeDIsIHkyXSA9IFswLCAiMTAwJSIsICIxMDAlIiwgMF07CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IGxpbmUgPSB7CiAgICAgIG5hbWU6ICJsaW5lIiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIHhtbG5zOiBTVkdfTlMsCiAgICAgICAgeDEsCiAgICAgICAgeTEsCiAgICAgICAgeDIsCiAgICAgICAgeTIsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbbGluZV0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHdpZHRoLAogICAgICAgIGhlaWdodCwKICAgICAgICBzdHlsZTogewogICAgICAgICAgb3ZlcmZsb3c6ICJ2aXNpYmxlIgogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgZGlzcGxheTogImlubGluZSIsCiAgICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3N2Z10KICAgICAgfSk7CiAgICB9CiAgICBzdmcuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcyhzdmcpOwogIH0KfQpjbGFzcyBMaW5lYXIgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibGluZWFyIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsidG9SaWdodCIsICJ0b0JvdHRvbSIsICJ0b0xlZnQiLCAidG9Ub3AiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9TdHlsZV0oc3RhcnRDb2xvcikgewogICAgc3RhcnRDb2xvciA9IHN0YXJ0Q29sb3IgPyBzdGFydENvbG9yW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIDogIiNGRkZGRkYiOwogICAgY29uc3QgdHJhbnNmID0gdGhpcy50eXBlLnJlcGxhY2UoLyhbUkJMVF0pLywgIiAkMSIpLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBlbmRDb2xvciA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIDogIiMwMDAwMDAiOwogICAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQoJHt0cmFuc2Z9LCAke3N0YXJ0Q29sb3J9LCAke2VuZENvbG9yfSlgOwogIH0KfQpjbGFzcyBMb2NrRG9jdW1lbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgImxvY2tEb2N1bWVudCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKSh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSwgWyJhdXRvIiwgIjAiLCAiMSJdKTsKICB9Cn0KY2xhc3MgTWFuaWZlc3QgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWFuaWZlc3QiLCB0cnVlKTsKICAgIHRoaXMuYWN0aW9uID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYWN0aW9uLCBbImluY2x1ZGUiLCAiYWxsIiwgImV4Y2x1ZGUiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLnJlZiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNYXJnaW4gZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWFyZ2luIiwgdHJ1ZSk7CiAgICB0aGlzLmJvdHRvbUluc2V0ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5ib3R0b21JbnNldCwgIjAiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sZWZ0SW5zZXQgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLmxlZnRJbnNldCwgIjAiKTsKICAgIHRoaXMucmlnaHRJbnNldCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMucmlnaHRJbnNldCwgIjAiKTsKICAgIHRoaXMudG9wSW5zZXQgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLnRvcEluc2V0LCAiMCIpOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIHsKICAgIHJldHVybiB7CiAgICAgIG1hcmdpbjogKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy50b3BJbnNldCkgKyAiICIgKyAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnJpZ2h0SW5zZXQpICsgIiAiICsgKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5ib3R0b21JbnNldCkgKyAiICIgKyAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLmxlZnRJbnNldCkKICAgIH07CiAgfQp9CmNsYXNzIE1kcCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJtZHAiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wZXJtaXNzaW9ucyA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnBlcm1pc3Npb25zLAogICAgICBkZWZhdWx0VmFsdWU6IDIsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEgfHwgeCA9PT0gMwogICAgfSk7CiAgICB0aGlzLnNpZ25hdHVyZVR5cGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5zaWduYXR1cmVUeXBlLCBbImZpbGxlciIsICJhdXRob3IiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBNZWRpdW0gZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibWVkaXVtIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW1hZ2luZ0JCb3ggPSAoMCwgX3V0aWxzLmdldEJCb3gpKGF0dHJpYnV0ZXMuaW1hZ2luZ0JCb3gpOwogICAgdGhpcy5sb25nID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5sb25nKTsKICAgIHRoaXMub3JpZW50YXRpb24gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5vcmllbnRhdGlvbiwgWyJwb3J0cmFpdCIsICJsYW5kc2NhcGUiXSk7CiAgICB0aGlzLnNob3J0ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5zaG9ydCk7CiAgICB0aGlzLnN0b2NrID0gYXR0cmlidXRlcy5zdG9jayB8fCAiIjsKICAgIHRoaXMudHJheUluID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHJheUluLCBbImF1dG8iLCAiZGVsZWdhdGUiLCAicGFnZUZyb250Il0pOwogICAgdGhpcy50cmF5T3V0ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHJheU91dCwgWyJhdXRvIiwgImRlbGVnYXRlIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgTWVzc2FnZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJtZXNzYWdlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnRleHQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTnVtZXJpY0VkaXQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAibnVtZXJpY0VkaXQiLCB0cnVlKTsKICAgIHRoaXMuaFNjcm9sbFBvbGljeSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmhTY3JvbGxQb2xpY3ksIFsiYXV0byIsICJvZmYiLCAib24iXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmNvbWIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IHN0eWxlID0gKDAsIF9odG1sX3V0aWxzLnRvU3R5bGUpKHRoaXMsICJib3JkZXIiLCAiZm9udCIsICJtYXJnaW4iKTsKICAgIGNvbnN0IGZpZWxkID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiaW5wdXQiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgdHlwZTogInRleHQiLAogICAgICAgIGZpZWxkSWQ6IGZpZWxkW194ZmFfb2JqZWN0LiR1aWRdLAogICAgICAgIGRhdGFJZDogZmllbGRbX3hmYV9vYmplY3QuJGRhdGFdPy5bX3hmYV9vYmplY3QuJHVpZF0gfHwgZmllbGRbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgICAgY2xhc3M6IFsieGZhVGV4dGZpZWxkIl0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICJhcmlhLXJlcXVpcmVkIjogZmFsc2UKICAgICAgfQogICAgfTsKICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJsYWJlbCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFMYWJlbCJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbaHRtbF0KICAgIH0pOwogIH0KfQpjbGFzcyBPY2N1ciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJvY2N1ciIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLmluaXRpYWwgPSBhdHRyaWJ1dGVzLmluaXRpYWwgIT09ICIiID8gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuaW5pdGlhbCwKICAgICAgZGVmYXVsdFZhbHVlOiAiIiwKICAgICAgdmFsaWRhdGU6IHggPT4gdHJ1ZQogICAgfSkgOiAiIjsKICAgIHRoaXMubWF4ID0gYXR0cmlidXRlcy5tYXggIT09ICIiID8gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWF4LAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHRydWUKICAgIH0pIDogIiI7CiAgICB0aGlzLm1pbiA9IGF0dHJpYnV0ZXMubWluICE9PSAiIiA/ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLm1pbiwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KSA6ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRjbGVhbl0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBjb25zdCBvcmlnaW5hbE1pbiA9IHRoaXMubWluOwogICAgaWYgKHRoaXMubWluID09PSAiIikgewogICAgICB0aGlzLm1pbiA9IHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VBcmVhIHx8IHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VTZXQgPyAwIDogMTsKICAgIH0KICAgIGlmICh0aGlzLm1heCA9PT0gIiIpIHsKICAgICAgaWYgKG9yaWdpbmFsTWluID09PSAiIikgewogICAgICAgIHRoaXMubWF4ID0gcGFyZW50IGluc3RhbmNlb2YgUGFnZUFyZWEgfHwgcGFyZW50IGluc3RhbmNlb2YgUGFnZVNldCA/IC0xIDogMTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm1heCA9IHRoaXMubWluOwogICAgICB9CiAgICB9CiAgICBpZiAodGhpcy5tYXggIT09IC0xICYmIHRoaXMubWF4IDwgdGhpcy5taW4pIHsKICAgICAgdGhpcy5tYXggPSB0aGlzLm1pbjsKICAgIH0KICAgIGlmICh0aGlzLmluaXRpYWwgPT09ICIiKSB7CiAgICAgIHRoaXMuaW5pdGlhbCA9IHBhcmVudCBpbnN0YW5jZW9mIFRlbXBsYXRlID8gMSA6IHRoaXMubWluOwogICAgfQogIH0KfQpjbGFzcyBPaWQgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAib2lkIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIE9pZHMgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAib2lkcyIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnR5cGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy50eXBlLCBbIm9wdGlvbmFsIiwgInJlcXVpcmVkIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMub2lkID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIE92ZXJmbG93IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgIm92ZXJmbG93Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubGVhZGVyID0gYXR0cmlidXRlcy5sZWFkZXIgfHwgIiI7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy50cmFpbGVyID0gYXR0cmlidXRlcy50cmFpbGVyIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgW194ZmFfb2JqZWN0LiRnZXRFeHRyYV0oKSB7CiAgICBpZiAoIXRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSkgewogICAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICAgIGNvbnN0IHJvb3QgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICAgIGNvbnN0IHRhcmdldCA9IHJvb3RbX3hmYV9vYmplY3QuJHNlYXJjaE5vZGVdKHRoaXMudGFyZ2V0LCBwYXJlbnQpOwogICAgICBjb25zdCBsZWFkZXIgPSByb290W194ZmFfb2JqZWN0LiRzZWFyY2hOb2RlXSh0aGlzLmxlYWRlciwgcGFyZW50KTsKICAgICAgY29uc3QgdHJhaWxlciA9IHJvb3RbX3hmYV9vYmplY3QuJHNlYXJjaE5vZGVdKHRoaXMudHJhaWxlciwgcGFyZW50KTsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gewogICAgICAgIHRhcmdldDogdGFyZ2V0Py5bMF0gfHwgbnVsbCwKICAgICAgICBsZWFkZXI6IGxlYWRlcj8uWzBdIHx8IG51bGwsCiAgICAgICAgdHJhaWxlcjogdHJhaWxlcj8uWzBdIHx8IG51bGwsCiAgICAgICAgYWRkTGVhZGVyOiBmYWxzZSwKICAgICAgICBhZGRUcmFpbGVyOiBmYWxzZQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXTsKICB9Cn0KY2xhc3MgUGFnZUFyZWEgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGFnZUFyZWEiLCB0cnVlKTsKICAgIHRoaXMuYmxhbmtPck5vdEJsYW5rID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYmxhbmtPck5vdEJsYW5rLCBbImFueSIsICJibGFuayIsICJub3RCbGFuayJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5pbml0aWFsTnVtYmVyID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuaW5pdGlhbE51bWJlciwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMubnVtYmVyZWQgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5udW1iZXJlZCwKICAgICAgZGVmYXVsdFZhbHVlOiAxLAogICAgICB2YWxpZGF0ZTogeCA9PiB0cnVlCiAgICB9KTsKICAgIHRoaXMub2RkT3JFdmVuID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMub2RkT3JFdmVuLCBbImFueSIsICJldmVuIiwgIm9kZCJdKTsKICAgIHRoaXMucGFnZVBvc2l0aW9uID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMucGFnZVBvc2l0aW9uLCBbImFueSIsICJmaXJzdCIsICJsYXN0IiwgIm9ubHkiLCAicmVzdCJdKTsKICAgIHRoaXMucmVsZXZhbnQgPSAoMCwgX3V0aWxzLmdldFJlbGV2YW50KShhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmRlc2MgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tZWRpdW0gPSBudWxsOwogICAgdGhpcy5vY2N1ciA9IG51bGw7CiAgICB0aGlzLmFyZWEgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29udGVudEFyZWEgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KICBbX3hmYV9vYmplY3QuJGlzVXNhYmxlXSgpIHsKICAgIGlmICghdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdKSB7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSA9IHsKICAgICAgICBudW1iZXJPZlVzZTogMAogICAgICB9OwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiAhdGhpcy5vY2N1ciB8fCB0aGlzLm9jY3VyLm1heCA9PT0gLTEgfHwgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLm51bWJlck9mVXNlIDwgdGhpcy5vY2N1ci5tYXg7CiAgfQogIFtfeGZhX29iamVjdC4kY2xlYW5QYWdlXSgpIHsKICAgIGRlbGV0ZSB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV07CiAgfQogIFtfeGZhX29iamVjdC4kZ2V0TmV4dFBhZ2VdKCkgewogICAgaWYgKCF0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0pIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAwCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBpZiAocGFyZW50LnJlbGF0aW9uID09PSAib3JkZXJlZE9jY3VycmVuY2UiKSB7CiAgICAgIGlmICh0aGlzW194ZmFfb2JqZWN0LiRpc1VzYWJsZV0oKSkgewogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5udW1iZXJPZlVzZSArPSAxOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFyZW50W194ZmFfb2JqZWN0LiRnZXROZXh0UGFnZV0oKTsKICB9CiAgW194ZmFfb2JqZWN0LiRnZXRBdmFpbGFibGVTcGFjZV0oKSB7CiAgICByZXR1cm4gdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLnNwYWNlIHx8IHsKICAgICAgd2lkdGg6IDAsCiAgICAgIGhlaWdodDogMAogICAgfTsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKCkgewogICAgaWYgKCF0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0pIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gewogICAgICAgIG51bWJlck9mVXNlOiAxCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgICBjb25zdCBzdHlsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBpZiAodGhpcy5tZWRpdW0gJiYgdGhpcy5tZWRpdW0uc2hvcnQgJiYgdGhpcy5tZWRpdW0ubG9uZykgewogICAgICBzdHlsZS53aWR0aCA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMubWVkaXVtLnNob3J0KTsKICAgICAgc3R5bGUuaGVpZ2h0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tZWRpdW0ubG9uZyk7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5zcGFjZSA9IHsKICAgICAgICB3aWR0aDogdGhpcy5tZWRpdW0uc2hvcnQsCiAgICAgICAgaGVpZ2h0OiB0aGlzLm1lZGl1bS5sb25nCiAgICAgIH07CiAgICAgIGlmICh0aGlzLm1lZGl1bS5vcmllbnRhdGlvbiA9PT0gImxhbmRzY2FwZSIpIHsKICAgICAgICBjb25zdCB4ID0gc3R5bGUud2lkdGg7CiAgICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQ7CiAgICAgICAgc3R5bGUuaGVpZ2h0ID0geDsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uc3BhY2UgPSB7CiAgICAgICAgICB3aWR0aDogdGhpcy5tZWRpdW0ubG9uZywKICAgICAgICAgIGhlaWdodDogdGhpcy5tZWRpdW0uc2hvcnQKICAgICAgICB9OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIE5vIG1lZGl1bSBzcGVjaWZpZWQgaW4gcGFnZUFyZWE6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgfQogICAgdGhpc1tfeGZhX29iamVjdC4kY2hpbGRyZW5Ub0hUTUxdKHsKICAgICAgZmlsdGVyOiBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImZpZWxkIiwgInN1YmZvcm0iXSksCiAgICAgIGluY2x1ZGU6IHRydWUKICAgIH0pOwogICAgdGhpc1tfeGZhX29iamVjdC4kY2hpbGRyZW5Ub0hUTUxdKHsKICAgICAgZmlsdGVyOiBuZXcgU2V0KFsiY29udGVudEFyZWEiXSksCiAgICAgIGluY2x1ZGU6IHRydWUKICAgIH0pOwogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgY2hpbGRyZW4sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFQYWdlIl0sCiAgICAgICAgaWQ6IHRoaXNbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgICAgc3R5bGUsCiAgICAgICAgeGZhTmFtZTogdGhpcy5uYW1lCiAgICAgIH0KICAgIH0pOwogIH0KfQpjbGFzcyBQYWdlU2V0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhZ2VTZXQiLCB0cnVlKTsKICAgIHRoaXMuZHVwbGV4SW1wb3NpdGlvbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmR1cGxleEltcG9zaXRpb24sIFsibG9uZ0VkZ2UiLCAic2hvcnRFZGdlIl0pOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJlbGF0aW9uID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMucmVsYXRpb24sIFsib3JkZXJlZE9jY3VycmVuY2UiLCAiZHVwbGV4UGFnaW5hdGVkIiwgInNpbXBsZXhQYWdpbmF0ZWQiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gKDAsIF91dGlscy5nZXRSZWxldmFudCkoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5vY2N1ciA9IG51bGw7CiAgICB0aGlzLnBhZ2VBcmVhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhZ2VTZXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9CiAgW194ZmFfb2JqZWN0LiRjbGVhblBhZ2VdKCkgewogICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZUFyZWEuY2hpbGRyZW4pIHsKICAgICAgcGFnZVtfeGZhX29iamVjdC4kY2xlYW5QYWdlXSgpOwogICAgfQogICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMucGFnZVNldC5jaGlsZHJlbikgewogICAgICBwYWdlW194ZmFfb2JqZWN0LiRjbGVhblBhZ2VdKCk7CiAgICB9CiAgfQogIFtfeGZhX29iamVjdC4kaXNVc2FibGVdKCkgewogICAgcmV0dXJuICF0aGlzLm9jY3VyIHx8IHRoaXMub2NjdXIubWF4ID09PSAtMSB8fCB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ubnVtYmVyT2ZVc2UgPCB0aGlzLm9jY3VyLm1heDsKICB9CiAgW194ZmFfb2JqZWN0LiRnZXROZXh0UGFnZV0oKSB7CiAgICBpZiAoIXRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSkgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0gPSB7CiAgICAgICAgbnVtYmVyT2ZVc2U6IDEsCiAgICAgICAgcGFnZUluZGV4OiAtMSwKICAgICAgICBwYWdlU2V0SW5kZXg6IC0xCiAgICAgIH07CiAgICB9CiAgICBpZiAodGhpcy5yZWxhdGlvbiA9PT0gIm9yZGVyZWRPY2N1cnJlbmNlIikgewogICAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLnBhZ2VJbmRleCArIDEgPCB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5wYWdlSW5kZXggKz0gMTsKICAgICAgICBjb25zdCBwYWdlQXJlYSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW5bdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLnBhZ2VJbmRleF07CiAgICAgICAgcmV0dXJuIHBhZ2VBcmVhW194ZmFfb2JqZWN0LiRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLnBhZ2VTZXRJbmRleCArIDEgPCB0aGlzLnBhZ2VTZXQuY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLnBhZ2VTZXRJbmRleCArPSAxOwogICAgICAgIHJldHVybiB0aGlzLnBhZ2VTZXQuY2hpbGRyZW5bdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLnBhZ2VTZXRJbmRleF1bX3hmYV9vYmplY3QuJGdldE5leHRQYWdlXSgpOwogICAgICB9CiAgICAgIGlmICh0aGlzW194ZmFfb2JqZWN0LiRpc1VzYWJsZV0oKSkgewogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5udW1iZXJPZlVzZSArPSAxOwogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5wYWdlSW5kZXggPSAtMTsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ucGFnZVNldEluZGV4ID0gLTE7CiAgICAgICAgcmV0dXJuIHRoaXNbX3hmYV9vYmplY3QuJGdldE5leHRQYWdlXSgpOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBhZ2VTZXQpIHsKICAgICAgICByZXR1cm4gcGFyZW50W194ZmFfb2JqZWN0LiRnZXROZXh0UGFnZV0oKTsKICAgICAgfQogICAgICB0aGlzW194ZmFfb2JqZWN0LiRjbGVhblBhZ2VdKCk7CiAgICAgIHJldHVybiB0aGlzW194ZmFfb2JqZWN0LiRnZXROZXh0UGFnZV0oKTsKICAgIH0KICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKClbX3hmYV9vYmplY3QuJGV4dHJhXS5wYWdlTnVtYmVyOwogICAgY29uc3QgcGFyaXR5ID0gcGFnZU51bWJlciAlIDIgPT09IDAgPyAiZXZlbiIgOiAib2RkIjsKICAgIGNvbnN0IHBvc2l0aW9uID0gcGFnZU51bWJlciA9PT0gMCA/ICJmaXJzdCIgOiAicmVzdCI7CiAgICBsZXQgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSBwYXJpdHkgJiYgcC5wYWdlUG9zaXRpb24gPT09IHBvc2l0aW9uKTsKICAgIGlmIChwYWdlKSB7CiAgICAgIHJldHVybiBwYWdlOwogICAgfQogICAgcGFnZSA9IHRoaXMucGFnZUFyZWEuY2hpbGRyZW4uZmluZChwID0+IHAub2RkT3JFdmVuID09PSAiYW55IiAmJiBwLnBhZ2VQb3NpdGlvbiA9PT0gcG9zaXRpb24pOwogICAgaWYgKHBhZ2UpIHsKICAgICAgcmV0dXJuIHBhZ2U7CiAgICB9CiAgICBwYWdlID0gdGhpcy5wYWdlQXJlYS5jaGlsZHJlbi5maW5kKHAgPT4gcC5vZGRPckV2ZW4gPT09ICJhbnkiICYmIHAucGFnZVBvc2l0aW9uID09PSAiYW55Iik7CiAgICBpZiAocGFnZSkgewogICAgICByZXR1cm4gcGFnZTsKICAgIH0KICAgIHJldHVybiB0aGlzLnBhZ2VBcmVhLmNoaWxkcmVuWzBdOwogIH0KfQpjbGFzcyBQYXJhIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhcmEiLCB0cnVlKTsKICAgIHRoaXMuaEFsaWduID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5saW5lSGVpZ2h0ID0gYXR0cmlidXRlcy5saW5lSGVpZ2h0ID8gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5saW5lSGVpZ2h0LCAiMHB0IikgOiAiIjsKICAgIHRoaXMubWFyZ2luTGVmdCA9IGF0dHJpYnV0ZXMubWFyZ2luTGVmdCA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWFyZ2luTGVmdCwgIjBwdCIpIDogIiI7CiAgICB0aGlzLm1hcmdpblJpZ2h0ID0gYXR0cmlidXRlcy5tYXJnaW5SaWdodCA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWFyZ2luUmlnaHQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5vcnBoYW5zID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMub3JwaGFucywKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID49IDAKICAgIH0pOwogICAgdGhpcy5wcmVzZXJ2ZSA9IGF0dHJpYnV0ZXMucHJlc2VydmUgfHwgIiI7CiAgICB0aGlzLnJhZGl4T2Zmc2V0ID0gYXR0cmlidXRlcy5yYWRpeE9mZnNldCA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMucmFkaXhPZmZzZXQsICIwcHQiKSA6ICIiOwogICAgdGhpcy5zcGFjZUFib3ZlID0gYXR0cmlidXRlcy5zcGFjZUFib3ZlID8gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5zcGFjZUFib3ZlLCAiMHB0IikgOiAiIjsKICAgIHRoaXMuc3BhY2VCZWxvdyA9IGF0dHJpYnV0ZXMuc3BhY2VCZWxvdyA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMuc3BhY2VCZWxvdywgIjBwdCIpIDogIiI7CiAgICB0aGlzLnRhYkRlZmF1bHQgPSBhdHRyaWJ1dGVzLnRhYkRlZmF1bHQgPyAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KSh0aGlzLnRhYkRlZmF1bHQpIDogIiI7CiAgICB0aGlzLnRhYlN0b3BzID0gKGF0dHJpYnV0ZXMudGFiU3RvcHMgfHwgIiIpLnRyaW0oKS5zcGxpdCgvXHMrLykubWFwKCh4LCBpKSA9PiBpICUgMiA9PT0gMSA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHgpIDogeCk7CiAgICB0aGlzLnRleHRJbmRlbnQgPSBhdHRyaWJ1dGVzLnRleHRJbmRlbnQgPyAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLnRleHRJbmRlbnQsICIwcHQiKSA6ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudkFsaWduID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudkFsaWduLCBbInRvcCIsICJib3R0b20iLCAibWlkZGxlIl0pOwogICAgdGhpcy53aWRvd3MgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy53aWRvd3MsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMuaHlwaGVuYXRpb24gPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgewogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgImhBbGlnbiIpOwogICAgaWYgKHRoaXMubWFyZ2luTGVmdCAhPT0gIiIpIHsKICAgICAgc3R5bGUucGFkZGluZ0xlZnQgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLm1hcmdpbkxlZnQpOwogICAgfQogICAgaWYgKHRoaXMubWFyZ2luUmlnaHQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdpZ2h0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5tYXJnaW5SaWdodCk7CiAgICB9CiAgICBpZiAodGhpcy5zcGFjZUFib3ZlICE9PSAiIikgewogICAgICBzdHlsZS5wYWRkaW5nVG9wID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5zcGFjZUFib3ZlKTsKICAgIH0KICAgIGlmICh0aGlzLnNwYWNlQmVsb3cgIT09ICIiKSB7CiAgICAgIHN0eWxlLnBhZGRpbmdCb3R0b20gPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnNwYWNlQmVsb3cpOwogICAgfQogICAgaWYgKHRoaXMudGV4dEluZGVudCAhPT0gIiIpIHsKICAgICAgc3R5bGUudGV4dEluZGVudCA9ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKHRoaXMudGV4dEluZGVudCk7CiAgICAgICgwLCBfaHRtbF91dGlscy5maXhUZXh0SW5kZW50KShzdHlsZSk7CiAgICB9CiAgICBpZiAodGhpcy5saW5lSGVpZ2h0ID4gMCkgewogICAgICBzdHlsZS5saW5lSGVpZ2h0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykodGhpcy5saW5lSGVpZ2h0KTsKICAgIH0KICAgIGlmICh0aGlzLnRhYkRlZmF1bHQgIT09ICIiKSB7CiAgICAgIHN0eWxlLnRhYlNpemUgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSh0aGlzLnRhYkRlZmF1bHQpOwogICAgfQogICAgaWYgKHRoaXMudGFiU3RvcHMubGVuZ3RoID4gMCkge30KICAgIGlmICh0aGlzLmh5cGhlbmF0YXRpb24pIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdGhpcy5oeXBoZW5hdGF0aW9uW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpKTsKICAgIH0KICAgIHJldHVybiBzdHlsZTsKICB9Cn0KY2xhc3MgUGFzc3dvcmRFZGl0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhc3N3b3JkRWRpdCIsIHRydWUpOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5wYXNzd29yZENoYXIgPSBhdHRyaWJ1dGVzLnBhc3N3b3JkQ2hhciB8fCAiKiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib3JkZXIgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tYXJnaW4gPSBudWxsOwogIH0KfQpjbGFzcyBQYXR0ZXJuIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInBhdHRlcm4iLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHlwZSwgWyJjcm9zc0hhdGNoIiwgImNyb3NzRGlhZ29uYWwiLCAiZGlhZ29uYWxMZWZ0IiwgImRpYWdvbmFsUmlnaHQiLCAiaG9yaXpvbnRhbCIsICJ2ZXJ0aWNhbCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b1N0eWxlXShzdGFydENvbG9yKSB7CiAgICBzdGFydENvbG9yID0gc3RhcnRDb2xvciA/IHN0YXJ0Q29sb3JbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgOiAiI0ZGRkZGRiI7CiAgICBjb25zdCBlbmRDb2xvciA9IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpIDogIiMwMDAwMDAiOwogICAgY29uc3Qgd2lkdGggPSA1OwogICAgY29uc3QgY21kID0gInJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQiOwogICAgY29uc3QgY29sb3JzID0gYCR7c3RhcnRDb2xvcn0sJHtzdGFydENvbG9yfSAke3dpZHRofXB4LCR7ZW5kQ29sb3J9ICR7d2lkdGh9cHgsJHtlbmRDb2xvcn0gJHsyICogd2lkdGh9cHhgOwogICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKICAgICAgY2FzZSAiY3Jvc3NIYXRjaCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0odG8gdG9wLCR7Y29sb3JzfSkgJHtjbWR9KHRvIHJpZ2h0LCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJjcm9zc0RpYWdvbmFsIjoKICAgICAgICByZXR1cm4gYCR7Y21kfSg0NWRlZywke2NvbG9yc30pICR7Y21kfSgtNDVkZWcsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgImRpYWdvbmFsTGVmdCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0oNDVkZWcsJHtjb2xvcnN9KWA7CiAgICAgIGNhc2UgImRpYWdvbmFsUmlnaHQiOgogICAgICAgIHJldHVybiBgJHtjbWR9KC00NWRlZywke2NvbG9yc30pYDsKICAgICAgY2FzZSAiaG9yaXpvbnRhbCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0odG8gdG9wLCR7Y29sb3JzfSlgOwogICAgICBjYXNlICJ2ZXJ0aWNhbCI6CiAgICAgICAgcmV0dXJuIGAke2NtZH0odG8gcmlnaHQsJHtjb2xvcnN9KWA7CiAgICB9CiAgICByZXR1cm4gIiI7CiAgfQp9CmNsYXNzIFBpY3R1cmUgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicGljdHVyZSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBQcm90byBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJwcm90byIsIHRydWUpOwogICAgdGhpcy5hcHBlYXJhbmNlRmlsdGVyID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmFyYyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5hcmVhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmFzc2lzdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5iYXJjb2RlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJpbmRJdGVtcyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ib29rZW5kID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJvb2xlYW4gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYm9yZGVyID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtCZWZvcmUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnV0dG9uID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNhbGN1bGF0ZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jYXB0aW9uID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNlcnRpZmljYXRlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNlcnRpZmljYXRlcyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jaGVja0J1dHRvbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jaG9pY2VMaXN0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbG9yID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbWIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuY29ubmVjdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb250ZW50QXJlYSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5jb3JuZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGF0ZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlVGltZUVkaXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVjaW1hbCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kZWZhdWx0VWkgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVzYyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kaWdlc3RNZXRob2QgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGlnZXN0TWV0aG9kcyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kcmF3ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVkZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jb2RpbmcgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jb2RpbmdzID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdERhdGEgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZW5jcnlwdGlvbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5lbmNyeXB0aW9uTWV0aG9kID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmVuY3J5cHRpb25NZXRob2RzID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV2ZW50ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmV4RGF0YSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhlY3V0ZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leHRyYXMgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmlsbCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5maWx0ZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmxvYXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZm9udCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5mb3JtYXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaGFuZGxlciA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5oeXBoZW5hdGlvbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pbWFnZUVkaXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuaW50ZWdlciA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5pc3N1ZXJzID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLml0ZW1zID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmtlZXAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMua2V5VXNhZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubGluZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5saW5lYXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubG9ja0RvY3VtZW50ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1hbmlmZXN0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1hcmdpbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5tZHAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWVkaXVtID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm1lc3NhZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubnVtZXJpY0VkaXQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMub2NjdXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMub2lkID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm9pZHMgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMub3ZlcmZsb3cgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGFnZUFyZWEgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucGFnZVNldCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYXJhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBhc3N3b3JkRWRpdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wYXR0ZXJuID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBpY3R1cmUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucmFkaWFsID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlYXNvbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yZWFzb25zID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnJlY3RhbmdsZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5yZWYgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2NyaXB0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNldFByb3BlcnR5ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNpZ25EYXRhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNpZ25hdHVyZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zaWduaW5nID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNvbGlkID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnNwZWFrID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN0aXBwbGUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1YmplY3RETiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJqZWN0RE5zID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnN1Ym1pdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy50ZXh0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHRFZGl0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRpbWUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZVN0YW1wID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRvb2xUaXAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudHJhdmVyc2FsID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRyYXZlcnNlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnVpID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnZhbGlkYXRlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnZhbHVlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnZhcmlhYmxlcyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBSYWRpYWwgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAicmFkaWFsIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsidG9FZGdlIiwgInRvQ2VudGVyIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuY29sb3IgPSBudWxsOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHN0YXJ0Q29sb3IgPSBzdGFydENvbG9yID8gc3RhcnRDb2xvcltfeGZhX29iamVjdC4kdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICAgIGNvbnN0IGVuZENvbG9yID0gdGhpcy5jb2xvciA/IHRoaXMuY29sb3JbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCkgOiAiIzAwMDAwMCI7CiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLnR5cGUgPT09ICJ0b0VkZ2UiID8gYCR7c3RhcnRDb2xvcn0sJHtlbmRDb2xvcn1gIDogYCR7ZW5kQ29sb3J9LCR7c3RhcnRDb2xvcn1gOwogICAgcmV0dXJuIGByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGNlbnRlciwgJHtjb2xvcnN9KWA7CiAgfQp9CmNsYXNzIFJlYXNvbiBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyZWFzb24iKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgUmVhc29ucyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJyZWFzb25zIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5yZWFzb24gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgUmVjdGFuZ2xlIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlY3RhbmdsZSIsIHRydWUpOwogICAgdGhpcy5oYW5kID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaGFuZCwgWyJldmVuIiwgImxlZnQiLCAicmlnaHQiXSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmNvcm5lciA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSg0KTsKICAgIHRoaXMuZWRnZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSg0KTsKICAgIHRoaXMuZmlsbCA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXSgpIHsKICAgIGNvbnN0IGVkZ2UgPSB0aGlzLmVkZ2UuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5lZGdlLmNoaWxkcmVuWzBdIDogbmV3IEVkZ2Uoe30pOwogICAgY29uc3QgZWRnZVN0eWxlID0gZWRnZVtfeGZhX29iamVjdC4kdG9TdHlsZV0oKTsKICAgIGNvbnN0IHN0eWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGlmICh0aGlzLmZpbGw/LnByZXNlbmNlID09PSAidmlzaWJsZSIpIHsKICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdGhpcy5maWxsW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlLmZpbGwgPSAidHJhbnNwYXJlbnQiOwogICAgfQogICAgc3R5bGUuc3Ryb2tlV2lkdGggPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKShlZGdlLnByZXNlbmNlID09PSAidmlzaWJsZSIgPyBlZGdlLnRoaWNrbmVzcyA6IDApOwogICAgc3R5bGUuc3Ryb2tlID0gZWRnZVN0eWxlLmNvbG9yOwogICAgY29uc3QgY29ybmVyID0gdGhpcy5jb3JuZXIuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5jb3JuZXIuY2hpbGRyZW5bMF0gOiBuZXcgQ29ybmVyKHt9KTsKICAgIGNvbnN0IGNvcm5lclN0eWxlID0gY29ybmVyW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpOwogICAgY29uc3QgcmVjdCA9IHsKICAgICAgbmFtZTogInJlY3QiLAogICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgeG1sbnM6IFNWR19OUywKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiLAogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICByeDogY29ybmVyU3R5bGUucmFkaXVzLAogICAgICAgIHJ5OiBjb3JuZXJTdHlsZS5yYWRpdXMsCiAgICAgICAgc3R5bGUKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN2ZyA9IHsKICAgICAgbmFtZTogInN2ZyIsCiAgICAgIGNoaWxkcmVuOiBbcmVjdF0sCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICB4bWxuczogU1ZHX05TLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICBvdmVyZmxvdzogInZpc2libGUiCiAgICAgICAgfSwKICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKClbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIGlmIChoYXNNYXJnaW4ocGFyZW50KSkgewogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgICAgbmFtZTogImRpdiIsCiAgICAgICAgYXR0cmlidXRlczogewogICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgZGlzcGxheTogImlubGluZSIsCiAgICAgICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgICAgIGhlaWdodDogIjEwMCUiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW3N2Z10KICAgICAgfSk7CiAgICB9CiAgICBzdmcuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcyhzdmcpOwogIH0KfQpjbGFzcyBSZWZFbGVtZW50IGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInJlZiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTY3JpcHQgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic2NyaXB0Iik7CiAgICB0aGlzLmJpbmRpbmcgPSBhdHRyaWJ1dGVzLmJpbmRpbmcgfHwgIiI7CiAgICB0aGlzLmNvbnRlbnRUeXBlID0gYXR0cmlidXRlcy5jb250ZW50VHlwZSB8fCAiIjsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5ydW5BdCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnJ1bkF0LCBbImNsaWVudCIsICJib3RoIiwgInNlcnZlciJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNldFByb3BlcnR5IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInNldFByb3BlcnR5Iik7CiAgICB0aGlzLmNvbm5lY3Rpb24gPSBhdHRyaWJ1dGVzLmNvbm5lY3Rpb24gfHwgIiI7CiAgICB0aGlzLnJlZiA9IGF0dHJpYnV0ZXMucmVmIHx8ICIiOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICB9Cn0KZXhwb3J0cy5TZXRQcm9wZXJ0eSA9IFNldFByb3BlcnR5OwpjbGFzcyBTaWduRGF0YSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzaWduRGF0YSIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm9wZXJhdGlvbiA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm9wZXJhdGlvbiwgWyJzaWduIiwgImNsZWFyIiwgInZlcmlmeSJdKTsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnRhcmdldCA9IGF0dHJpYnV0ZXMudGFyZ2V0IHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZmlsdGVyID0gbnVsbDsKICAgIHRoaXMubWFuaWZlc3QgPSBudWxsOwogIH0KfQpjbGFzcyBTaWduYXR1cmUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic2lnbmF0dXJlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsiUERGMS4zIiwgIlBERjEuNiJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmJvcmRlciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLmZpbHRlciA9IG51bGw7CiAgICB0aGlzLm1hbmlmZXN0ID0gbnVsbDsKICAgIHRoaXMubWFyZ2luID0gbnVsbDsKICB9Cn0KY2xhc3MgU2lnbmluZyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzaWduaW5nIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBTb2xpZCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzb2xpZCIsIHRydWUpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvU3R5bGVdKHN0YXJ0Q29sb3IpIHsKICAgIHJldHVybiBzdGFydENvbG9yID8gc3RhcnRDb2xvcltfeGZhX29iamVjdC4kdG9TdHlsZV0oKSA6ICIjRkZGRkZGIjsKICB9Cn0KY2xhc3MgU3BlYWsgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3BlYWsiKTsKICAgIHRoaXMuZGlzYWJsZSA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmRpc2FibGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucHJpb3JpdHkgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5wcmlvcml0eSwgWyJjdXN0b20iLCAiY2FwdGlvbiIsICJuYW1lIiwgInRvb2xUaXAiXSk7CiAgICB0aGlzLnJpZCA9IGF0dHJpYnV0ZXMucmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgU3RpcHBsZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdGlwcGxlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMucmF0ZSA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLnJhdGUsCiAgICAgIGRlZmF1bHRWYWx1ZTogNTAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPj0gMCAmJiB4IDw9IDEwMAogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9TdHlsZV0oYmdDb2xvcikgewogICAgY29uc3QgYWxwaGEgPSB0aGlzLnJhdGUgLyAxMDA7CiAgICByZXR1cm4gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IoTWF0aC5yb3VuZChiZ0NvbG9yLnZhbHVlLnIgKiAoMSAtIGFscGhhKSArIHRoaXMudmFsdWUuciAqIGFscGhhKSwgTWF0aC5yb3VuZChiZ0NvbG9yLnZhbHVlLmcgKiAoMSAtIGFscGhhKSArIHRoaXMudmFsdWUuZyAqIGFscGhhKSwgTWF0aC5yb3VuZChiZ0NvbG9yLnZhbHVlLmIgKiAoMSAtIGFscGhhKSArIHRoaXMudmFsdWUuYiAqIGFscGhhKSk7CiAgfQp9CmNsYXNzIFN1YmZvcm0gZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3ViZm9ybSIsIHRydWUpOwogICAgdGhpcy5hY2Nlc3MgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5hY2Nlc3MsIFsib3BlbiIsICJub25JbnRlcmFjdGl2ZSIsICJwcm90ZWN0ZWQiLCAicmVhZE9ubHkiXSk7CiAgICB0aGlzLmFsbG93TWFjcm8gPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hbGxvd01hY3JvLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5hbmNob3JUeXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuYW5jaG9yVHlwZSwgWyJ0b3BMZWZ0IiwgImJvdHRvbUNlbnRlciIsICJib3R0b21MZWZ0IiwgImJvdHRvbVJpZ2h0IiwgIm1pZGRsZUNlbnRlciIsICJtaWRkbGVMZWZ0IiwgIm1pZGRsZVJpZ2h0IiwgInRvcENlbnRlciIsICJ0b3BSaWdodCJdKTsKICAgIHRoaXMuY29sU3BhbiA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmNvbFNwYW4sCiAgICAgIGRlZmF1bHRWYWx1ZTogMSwKICAgICAgdmFsaWRhdGU6IG4gPT4gbiA+PSAxIHx8IG4gPT09IC0xCiAgICB9KTsKICAgIHRoaXMuY29sdW1uV2lkdGhzID0gKGF0dHJpYnV0ZXMuY29sdW1uV2lkdGhzIHx8ICIiKS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCh4ID0+IHggPT09ICItMSIgPyAtMSA6ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHgpKTsKICAgIHRoaXMuaCA9IGF0dHJpYnV0ZXMuaCA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMuaCkgOiAiIjsKICAgIHRoaXMuaEFsaWduID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaEFsaWduLCBbImxlZnQiLCAiY2VudGVyIiwgImp1c3RpZnkiLCAianVzdGlmeUFsbCIsICJyYWRpeCIsICJyaWdodCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5sYXlvdXQgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5sYXlvdXQsIFsicG9zaXRpb24iLCAibHItdGIiLCAicmwtcm93IiwgInJsLXRiIiwgInJvdyIsICJ0YWJsZSIsICJ0YiJdKTsKICAgIHRoaXMubG9jYWxlID0gYXR0cmlidXRlcy5sb2NhbGUgfHwgIiI7CiAgICB0aGlzLm1heEggPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShhdHRyaWJ1dGVzLm1heEgsICIwcHQiKTsKICAgIHRoaXMubWF4VyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWF4VywgIjBwdCIpOwogICAgdGhpcy5tZXJnZU1vZGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5tZXJnZU1vZGUsIFsiY29uc3VtZURhdGEiLCAibWF0Y2hUZW1wbGF0ZSJdKTsKICAgIHRoaXMubWluSCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMubWluSCwgIjBwdCIpOwogICAgdGhpcy5taW5XID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy5taW5XLCAiMHB0Iik7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnByZXNlbmNlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMucHJlc2VuY2UsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAiaW5hY3RpdmUiLCAiaW52aXNpYmxlIl0pOwogICAgdGhpcy5yZWxldmFudCA9ICgwLCBfdXRpbHMuZ2V0UmVsZXZhbnQpKGF0dHJpYnV0ZXMucmVsZXZhbnQpOwogICAgdGhpcy5yZXN0b3JlU3RhdGUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5yZXN0b3JlU3RhdGUsIFsibWFudWFsIiwgImF1dG8iXSk7CiAgICB0aGlzLnNjb3BlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuc2NvcGUsIFsibmFtZSIsICJub25lIl0pOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMudyA9IGF0dHJpYnV0ZXMudyA/ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMudykgOiAiIjsKICAgIHRoaXMueCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKGF0dHJpYnV0ZXMueCwgIjBwdCIpOwogICAgdGhpcy55ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoYXR0cmlidXRlcy55LCAiMHB0Iik7CiAgICB0aGlzLmFzc2lzdCA9IG51bGw7CiAgICB0aGlzLmJpbmQgPSBudWxsOwogICAgdGhpcy5ib29rZW5kID0gbnVsbDsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuYnJlYWsgPSBudWxsOwogICAgdGhpcy5jYWxjdWxhdGUgPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMua2VlcCA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgICB0aGlzLm9jY3VyID0gbnVsbDsKICAgIHRoaXMub3ZlcmZsb3cgPSBudWxsOwogICAgdGhpcy5wYWdlU2V0ID0gbnVsbDsKICAgIHRoaXMucGFyYSA9IG51bGw7CiAgICB0aGlzLnRyYXZlcnNhbCA9IG51bGw7CiAgICB0aGlzLnZhbGlkYXRlID0gbnVsbDsKICAgIHRoaXMudmFyaWFibGVzID0gbnVsbDsKICAgIHRoaXMuYXJlYSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5icmVha0FmdGVyID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmJyZWFrQmVmb3JlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmNvbm5lY3QgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZHJhdyA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5ldmVudCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leE9iamVjdCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5leGNsR3JvdXAgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZmllbGQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucHJvdG8gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2V0UHJvcGVydHkgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQogIFtfeGZhX29iamVjdC4kZ2V0U3ViZm9ybVBhcmVudF0oKSB7CiAgICBjb25zdCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU3ViZm9ybVNldCkgewogICAgICByZXR1cm4gcGFyZW50W194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgfQogICAgcmV0dXJuIHBhcmVudDsKICB9CiAgW194ZmFfb2JqZWN0LiRpc0JpbmRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbX3hmYV9vYmplY3QuJGlzVGhlcmVNb3JlV2lkdGhdKCkgewogICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuZHNXaXRoKCItdGIiKSAmJiB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uYXR0ZW1wdCA9PT0gMCAmJiB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ubnVtYmVySW5MaW5lID4gMCB8fCB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKClbX3hmYV9vYmplY3QuJGlzVGhlcmVNb3JlV2lkdGhdKCk7CiAgfQogICpbX3hmYV9vYmplY3QuJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgW194ZmFfb2JqZWN0LiRmbHVzaEhUTUxdKCkgewogICAgcmV0dXJuICgwLCBfbGF5b3V0LmZsdXNoSFRNTCkodGhpcyk7CiAgfQogIFtfeGZhX29iamVjdC4kYWRkSFRNTF0oaHRtbCwgYmJveCkgewogICAgKDAsIF9sYXlvdXQuYWRkSFRNTCkodGhpcywgaHRtbCwgYmJveCk7CiAgfQogIFtfeGZhX29iamVjdC4kZ2V0QXZhaWxhYmxlU3BhY2VdKCkgewogICAgcmV0dXJuICgwLCBfbGF5b3V0LmdldEF2YWlsYWJsZVNwYWNlKSh0aGlzKTsKICB9CiAgW194ZmFfb2JqZWN0LiRpc1NwbGl0dGFibGVdKCkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgIGlmICghcGFyZW50W194ZmFfb2JqZWN0LiRpc1NwbGl0dGFibGVdKCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5faXNTcGxpdHRhYmxlICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5faXNTcGxpdHRhYmxlOwogICAgfQogICAgaWYgKHRoaXMubGF5b3V0ID09PSAicG9zaXRpb24iIHx8IHRoaXMubGF5b3V0LmluY2x1ZGVzKCJyb3ciKSkgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uX2lzU3BsaXR0YWJsZSA9IGZhbHNlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAodGhpcy5rZWVwICYmIHRoaXMua2VlcC5pbnRhY3QgIT09ICJub25lIikgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uX2lzU3BsaXR0YWJsZSA9IGZhbHNlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAocGFyZW50LmxheW91dD8uZW5kc1dpdGgoIi10YiIpICYmIHBhcmVudFtfeGZhX29iamVjdC4kZXh0cmFdLm51bWJlckluTGluZSAhPT0gMCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uX2lzU3BsaXR0YWJsZSA9IHRydWU7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBzZXRUYWJJbmRleCh0aGlzKTsKICAgIGlmICh0aGlzLmJyZWFrKSB7CiAgICAgIGlmICh0aGlzLmJyZWFrLmFmdGVyICE9PSAiYXV0byIgfHwgdGhpcy5icmVhay5hZnRlclRhcmdldCAhPT0gIiIpIHsKICAgICAgICBjb25zdCBub2RlID0gbmV3IEJyZWFrQWZ0ZXIoewogICAgICAgICAgdGFyZ2V0VHlwZTogdGhpcy5icmVhay5hZnRlciwKICAgICAgICAgIHRhcmdldDogdGhpcy5icmVhay5hZnRlclRhcmdldCwKICAgICAgICAgIHN0YXJ0TmV3OiB0aGlzLmJyZWFrLnN0YXJ0TmV3LnRvU3RyaW5nKCkKICAgICAgICB9KTsKICAgICAgICBub2RlW194ZmFfb2JqZWN0LiRnbG9iYWxEYXRhXSA9IHRoaXNbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdOwogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgICB0aGlzLmJyZWFrQWZ0ZXIucHVzaChub2RlKTsKICAgICAgfQogICAgICBpZiAodGhpcy5icmVhay5iZWZvcmUgIT09ICJhdXRvIiB8fCB0aGlzLmJyZWFrLmJlZm9yZVRhcmdldCAhPT0gIiIpIHsKICAgICAgICBjb25zdCBub2RlID0gbmV3IEJyZWFrQmVmb3JlKHsKICAgICAgICAgIHRhcmdldFR5cGU6IHRoaXMuYnJlYWsuYmVmb3JlLAogICAgICAgICAgdGFyZ2V0OiB0aGlzLmJyZWFrLmJlZm9yZVRhcmdldCwKICAgICAgICAgIHN0YXJ0TmV3OiB0aGlzLmJyZWFrLnN0YXJ0TmV3LnRvU3RyaW5nKCkKICAgICAgICB9KTsKICAgICAgICBub2RlW194ZmFfb2JqZWN0LiRnbG9iYWxEYXRhXSA9IHRoaXNbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdOwogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGFwcGVuZENoaWxkXShub2RlKTsKICAgICAgICB0aGlzLmJyZWFrQmVmb3JlLnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuYnJlYWsub3ZlcmZsb3dUYXJnZXQgIT09ICIiKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBPdmVyZmxvdyh7CiAgICAgICAgICB0YXJnZXQ6IHRoaXMuYnJlYWsub3ZlcmZsb3dUYXJnZXQsCiAgICAgICAgICBsZWFkZXI6IHRoaXMuYnJlYWsub3ZlcmZsb3dMZWFkZXIsCiAgICAgICAgICB0cmFpbGVyOiB0aGlzLmJyZWFrLm92ZXJmbG93VHJhaWxlcgogICAgICAgIH0pOwogICAgICAgIG5vZGVbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdID0gdGhpc1tfeGZhX29iamVjdC4kZ2xvYmFsRGF0YV07CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKG5vZGUpOwogICAgICAgIHRoaXMub3ZlcmZsb3cucHVzaChub2RlKTsKICAgICAgfQogICAgICB0aGlzW194ZmFfb2JqZWN0LiRyZW1vdmVDaGlsZF0odGhpcy5icmVhayk7CiAgICAgIHRoaXMuYnJlYWsgPSBudWxsOwogICAgfQogICAgaWYgKHRoaXMucHJlc2VuY2UgPT09ICJoaWRkZW4iIHx8IHRoaXMucHJlc2VuY2UgPT09ICJpbmFjdGl2ZSIpIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgaWYgKHRoaXMuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID4gMSB8fCB0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoID4gMSkgewogICAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIFNldmVyYWwgYnJlYWtCZWZvcmUgb3IgYnJlYWtBZnRlciBpbiBzdWJmb3JtczogcGxlYXNlIGZpbGUgYSBidWcuIik7CiAgICB9CiAgICBpZiAodGhpcy5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICBjb25zdCBicmVha0JlZm9yZSA9IHRoaXMuYnJlYWtCZWZvcmUuY2hpbGRyZW5bMF07CiAgICAgIGlmIChoYW5kbGVCcmVhayhicmVha0JlZm9yZSkpIHsKICAgICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGJyZWFrQmVmb3JlKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXT8uYWZ0ZXJCcmVha0FmdGVyKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgICgwLCBfaHRtbF91dGlscy5maXhEaW1lbnNpb25zKSh0aGlzKTsKICAgIGNvbnN0IGNoaWxkcmVuID0gW107CiAgICBjb25zdCBhdHRyaWJ1dGVzID0gewogICAgICBpZDogdGhpc1tfeGZhX29iamVjdC4kdWlkXSwKICAgICAgY2xhc3M6IFtdCiAgICB9OwogICAgKDAsIF9odG1sX3V0aWxzLnNldEFjY2VzcykodGhpcywgYXR0cmlidXRlcy5jbGFzcyk7CiAgICBpZiAoIXRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSkgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgfQogICAgT2JqZWN0LmFzc2lnbih0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0sIHsKICAgICAgY2hpbGRyZW4sCiAgICAgIGxpbmU6IG51bGwsCiAgICAgIGF0dHJpYnV0ZXMsCiAgICAgIGF0dGVtcHQ6IDAsCiAgICAgIG51bWJlckluTGluZTogMCwKICAgICAgYXZhaWxhYmxlU3BhY2U6IHsKICAgICAgICB3aWR0aDogTWF0aC5taW4odGhpcy53IHx8IEluZmluaXR5LCBhdmFpbGFibGVTcGFjZS53aWR0aCksCiAgICAgICAgaGVpZ2h0OiBNYXRoLm1pbih0aGlzLmggfHwgSW5maW5pdHksIGF2YWlsYWJsZVNwYWNlLmhlaWdodCkKICAgICAgfSwKICAgICAgd2lkdGg6IDAsCiAgICAgIGhlaWdodDogMCwKICAgICAgcHJldkhlaWdodDogMCwKICAgICAgY3VycmVudFdpZHRoOiAwCiAgICB9KTsKICAgIGNvbnN0IHJvb3QgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICBjb25zdCBzYXZlZE5vTGF5b3V0RmFpbHVyZSA9IHJvb3RbX3hmYV9vYmplY3QuJGV4dHJhXS5ub0xheW91dEZhaWx1cmU7CiAgICBjb25zdCBpc1NwbGl0dGFibGUgPSB0aGlzW194ZmFfb2JqZWN0LiRpc1NwbGl0dGFibGVdKCk7CiAgICBpZiAoIWlzU3BsaXR0YWJsZSkgewogICAgICBzZXRGaXJzdFVuc3BsaXR0YWJsZSh0aGlzKTsKICAgIH0KICAgIGlmICghKDAsIF9sYXlvdXQuY2hlY2tEaW1lbnNpb25zKSh0aGlzLCBhdmFpbGFibGVTcGFjZSkpIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkZBSUxVUkU7CiAgICB9CiAgICBjb25zdCBmaWx0ZXIgPSBuZXcgU2V0KFsiYXJlYSIsICJkcmF3IiwgImV4Y2xHcm91cCIsICJmaWVsZCIsICJzdWJmb3JtIiwgInN1YmZvcm1TZXQiXSk7CiAgICBpZiAodGhpcy5sYXlvdXQuaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFN1YmZvcm1QYXJlbnRdKCkuY29sdW1uV2lkdGhzOwogICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2x1bW5XaWR0aHMpICYmIGNvbHVtbldpZHRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRoczsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uY3VycmVudENvbHVtbiA9IDA7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN0eWxlID0gKDAsIF9odG1sX3V0aWxzLnRvU3R5bGUpKHRoaXMsICJhbmNob3JUeXBlIiwgImRpbWVuc2lvbnMiLCAicG9zaXRpb24iLCAicHJlc2VuY2UiLCAiYm9yZGVyIiwgIm1hcmdpbiIsICJoQWxpZ24iKTsKICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYVN1YmZvcm0iXTsKICAgIGNvbnN0IGNsID0gKDAsIF9odG1sX3V0aWxzLmxheW91dENsYXNzKSh0aGlzKTsKICAgIGlmIChjbCkgewogICAgICBjbGFzc05hbWVzLnB1c2goY2wpOwogICAgfQogICAgYXR0cmlidXRlcy5zdHlsZSA9IHN0eWxlOwogICAgYXR0cmlidXRlcy5jbGFzcyA9IGNsYXNzTmFtZXM7CiAgICBpZiAodGhpcy5uYW1lKSB7CiAgICAgIGF0dHJpYnV0ZXMueGZhTmFtZSA9IHRoaXMubmFtZTsKICAgIH0KICAgIGlmICh0aGlzLm92ZXJmbG93KSB7CiAgICAgIGNvbnN0IG92ZXJmbG93RXh0cmEgPSB0aGlzLm92ZXJmbG93W194ZmFfb2JqZWN0LiRnZXRFeHRyYV0oKTsKICAgICAgaWYgKG92ZXJmbG93RXh0cmEuYWRkTGVhZGVyKSB7CiAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRMZWFkZXIgPSBmYWxzZTsKICAgICAgICBoYW5kbGVPdmVyZmxvdyh0aGlzLCBvdmVyZmxvd0V4dHJhLmxlYWRlciwgYXZhaWxhYmxlU3BhY2UpOwogICAgICB9CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRwdXNoUGFyYV0oKTsKICAgIGNvbnN0IGlzTHJUYiA9IHRoaXMubGF5b3V0ID09PSAibHItdGIiIHx8IHRoaXMubGF5b3V0ID09PSAicmwtdGIiOwogICAgY29uc3QgbWF4UnVuID0gaXNMclRiID8gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCA6IDE7CiAgICBmb3IgKDsgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmF0dGVtcHQgPCBtYXhSdW47IHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5hdHRlbXB0KyspIHsKICAgICAgaWYgKGlzTHJUYiAmJiB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uYXR0ZW1wdCA9PT0gTUFYX0FUVEVNUFRTX0ZPUl9MUlRCX0xBWU9VVCAtIDEpIHsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ubnVtYmVySW5MaW5lID0gMDsKICAgICAgfQogICAgICBjb25zdCByZXN1bHQgPSB0aGlzW194ZmFfb2JqZWN0LiRjaGlsZHJlblRvSFRNTF0oewogICAgICAgIGZpbHRlciwKICAgICAgICBpbmNsdWRlOiB0cnVlCiAgICAgIH0pOwogICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAocmVzdWx0LmlzQnJlYWsoKSkgewogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJHBvcFBhcmFdKCk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBpZiAoaXNMclRiICYmIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5hdHRlbXB0ID09PSAwICYmIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5udW1iZXJJbkxpbmUgPT09IDAgJiYgIXJvb3RbX3hmYV9vYmplY3QuJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uYXR0ZW1wdCA9IG1heFJ1bjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdGhpc1tfeGZhX29iamVjdC4kcG9wUGFyYV0oKTsKICAgIGlmICghaXNTcGxpdHRhYmxlKSB7CiAgICAgIHVuc2V0Rmlyc3RVbnNwbGl0dGFibGUodGhpcyk7CiAgICB9CiAgICByb290W194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gc2F2ZWROb0xheW91dEZhaWx1cmU7CiAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmF0dGVtcHQgPT09IG1heFJ1bikgewogICAgICBpZiAodGhpcy5vdmVyZmxvdykgewogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGdldFRlbXBsYXRlUm9vdF0oKVtfeGZhX29iamVjdC4kZXh0cmFdLm92ZXJmbG93Tm9kZSA9IHRoaXMub3ZlcmZsb3c7CiAgICAgIH0KICAgICAgaWYgKCFpc1NwbGl0dGFibGUpIHsKICAgICAgICBkZWxldGUgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdOwogICAgICB9CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5GQUlMVVJFOwogICAgfQogICAgaWYgKHRoaXMub3ZlcmZsb3cpIHsKICAgICAgY29uc3Qgb3ZlcmZsb3dFeHRyYSA9IHRoaXMub3ZlcmZsb3dbX3hmYV9vYmplY3QuJGdldEV4dHJhXSgpOwogICAgICBpZiAob3ZlcmZsb3dFeHRyYS5hZGRUcmFpbGVyKSB7CiAgICAgICAgb3ZlcmZsb3dFeHRyYS5hZGRUcmFpbGVyID0gZmFsc2U7CiAgICAgICAgaGFuZGxlT3ZlcmZsb3codGhpcywgb3ZlcmZsb3dFeHRyYS50cmFpbGVyLCBhdmFpbGFibGVTcGFjZSk7CiAgICAgIH0KICAgIH0KICAgIGxldCBtYXJnaW5IID0gMDsKICAgIGxldCBtYXJnaW5WID0gMDsKICAgIGlmICh0aGlzLm1hcmdpbikgewogICAgICBtYXJnaW5IID0gdGhpcy5tYXJnaW4ubGVmdEluc2V0ICsgdGhpcy5tYXJnaW4ucmlnaHRJbnNldDsKICAgICAgbWFyZ2luViA9IHRoaXMubWFyZ2luLnRvcEluc2V0ICsgdGhpcy5tYXJnaW4uYm90dG9tSW5zZXQ7CiAgICB9CiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS53aWR0aCArIG1hcmdpbkgsIHRoaXMudyB8fCAwKTsKICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5oZWlnaHQgKyBtYXJnaW5WLCB0aGlzLmggfHwgMCk7CiAgICBjb25zdCBiYm94ID0gW3RoaXMueCwgdGhpcy55LCB3aWR0aCwgaGVpZ2h0XTsKICAgIGlmICh0aGlzLncgPT09ICIiKSB7CiAgICAgIHN0eWxlLndpZHRoID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykod2lkdGgpOwogICAgfQogICAgaWYgKHRoaXMuaCA9PT0gIiIpIHsKICAgICAgc3R5bGUuaGVpZ2h0ID0gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoaGVpZ2h0KTsKICAgIH0KICAgIGlmICgoc3R5bGUud2lkdGggPT09ICIwcHgiIHx8IHN0eWxlLmhlaWdodCA9PT0gIjBweCIpICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgewogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuRU1QVFk7CiAgICB9CiAgICBjb25zdCBodG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlcywKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICBhcHBseUFzc2lzdCh0aGlzLCBhdHRyaWJ1dGVzKTsKICAgIGNvbnN0IHJlc3VsdCA9IF91dGlscy5IVE1MUmVzdWx0LnN1Y2Nlc3MoKDAsIF9odG1sX3V0aWxzLmNyZWF0ZVdyYXBwZXIpKHRoaXMsIGh0bWwpLCBiYm94KTsKICAgIGlmICh0aGlzLmJyZWFrQWZ0ZXIuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgY29uc3QgYnJlYWtBZnRlciA9IHRoaXMuYnJlYWtBZnRlci5jaGlsZHJlblswXTsKICAgICAgaWYgKGhhbmRsZUJyZWFrKGJyZWFrQWZ0ZXIpKSB7CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLmFmdGVyQnJlYWtBZnRlciA9IHJlc3VsdDsKICAgICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuYnJlYWtOb2RlKGJyZWFrQWZ0ZXIpOwogICAgICB9CiAgICB9CiAgICBkZWxldGUgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdOwogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0KY2xhc3MgU3ViZm9ybVNldCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJmb3JtU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmVsYXRpb24gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5yZWxhdGlvbiwgWyJvcmRlcmVkIiwgImNob2ljZSIsICJ1bm9yZGVyZWQiXSk7CiAgICB0aGlzLnJlbGV2YW50ID0gKDAsIF91dGlscy5nZXRSZWxldmFudCkoYXR0cmlidXRlcy5yZWxldmFudCk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5ib29rZW5kID0gbnVsbDsKICAgIHRoaXMuYnJlYWsgPSBudWxsOwogICAgdGhpcy5kZXNjID0gbnVsbDsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMub2NjdXIgPSBudWxsOwogICAgdGhpcy5vdmVyZmxvdyA9IG51bGw7CiAgICB0aGlzLmJyZWFrQWZ0ZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuYnJlYWtCZWZvcmUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zdWJmb3JtU2V0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQogICpbX3hmYV9vYmplY3QuJGdldENvbnRhaW5lZENoaWxkcmVuXSgpIHsKICAgIHlpZWxkKiBnZXRDb250YWluZWRDaGlsZHJlbih0aGlzKTsKICB9CiAgW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpIHsKICAgIGxldCBwYXJlbnQgPSB0aGlzW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICB3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBTdWJmb3JtKSkgewogICAgICBwYXJlbnQgPSBwYXJlbnRbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKTsKICAgIH0KICAgIHJldHVybiBwYXJlbnQ7CiAgfQogIFtfeGZhX29iamVjdC4kaXNCaW5kYWJsZV0oKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9Cn0KY2xhc3MgU3ViamVjdEROIGV4dGVuZHMgX3hmYV9vYmplY3QuQ29udGVudE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJzdWJqZWN0RE4iKTsKICAgIHRoaXMuZGVsaW1pdGVyID0gYXR0cmlidXRlcy5kZWxpbWl0ZXIgfHwgIiwiOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID0gbmV3IE1hcCh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS5zcGxpdCh0aGlzLmRlbGltaXRlcikubWFwKGt2ID0+IHsKICAgICAga3YgPSBrdi5zcGxpdCgiPSIsIDIpOwogICAgICBrdlswXSA9IGt2WzBdLnRyaW0oKTsKICAgICAgcmV0dXJuIGt2OwogICAgfSkpOwogIH0KfQpjbGFzcyBTdWJqZWN0RE5zIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInN1YmplY3RETnMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50eXBlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudHlwZSwgWyJvcHRpb25hbCIsICJyZXF1aXJlZCJdKTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnN1YmplY3RETiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBTdWJtaXQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAic3VibWl0IiwgdHJ1ZSk7CiAgICB0aGlzLmVtYmVkUERGID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMuZW1iZWRQREYsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmZvcm1hdCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmZvcm1hdCwgWyJ4ZHAiLCAiZm9ybWRhdGEiLCAicGRmIiwgInVybGVuY29kZWQiLCAieGZkIiwgInhtbCJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy50YXJnZXQgPSBhdHRyaWJ1dGVzLnRhcmdldCB8fCAiIjsKICAgIHRoaXMudGV4dEVuY29kaW5nID0gKDAsIF91dGlscy5nZXRLZXl3b3JkKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMudGV4dEVuY29kaW5nID8gYXR0cmlidXRlcy50ZXh0RW5jb2RpbmcudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICBkZWZhdWx0VmFsdWU6ICIiLAogICAgICB2YWxpZGF0ZTogayA9PiBbInV0Zi04IiwgImJpZy1maXZlIiwgImZvbnRzcGVjaWZpYyIsICJnYmsiLCAiZ2ItMTgwMzAiLCAiZ2ItMjMxMiIsICJrc2MtNTYwMSIsICJub25lIiwgInNoaWZ0LWppcyIsICJ1Y3MtMiIsICJ1dGYtMTYiXS5pbmNsdWRlcyhrKSB8fCBrLm1hdGNoKC9pc28tODg1OS1cZHsyfS8pCiAgICB9KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLnhkcENvbnRlbnQgPSBhdHRyaWJ1dGVzLnhkcENvbnRlbnQgfHwgIiI7CiAgICB0aGlzLmVuY3J5cHQgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0RGF0YSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5zaWduRGF0YSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUZW1wbGF0ZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0ZW1wbGF0ZSIsIHRydWUpOwogICAgdGhpcy5iYXNlUHJvZmlsZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmJhc2VQcm9maWxlLCBbImZ1bGwiLCAiaW50ZXJhY3RpdmVGb3JtcyJdKTsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMuc3ViZm9ybSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIGlmICh0aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgICgwLCBfdXRpbC53YXJuKSgiWEZBIC0gTm8gc3ViZm9ybXMgaW4gdGVtcGxhdGUgbm9kZS4iKTsKICAgIH0KICAgIGlmICh0aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoID49IDIpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJYRkEgLSBTZXZlcmFsIHN1YmZvcm1zIGluIHRlbXBsYXRlIG5vZGU6IHBsZWFzZSBmaWxlIGEgYnVnLiIpOwogICAgfQogICAgdGhpc1tfeGZhX29iamVjdC4kdGFiSW5kZXhdID0gREVGQVVMVF9UQUJfSU5ERVg7CiAgfQogIFtfeGZhX29iamVjdC4kaXNTcGxpdHRhYmxlXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBbX3hmYV9vYmplY3QuJHNlYXJjaE5vZGVdKGV4cHIsIGNvbnRhaW5lcikgewogICAgaWYgKGV4cHIuc3RhcnRzV2l0aCgiIyIpKSB7CiAgICAgIHJldHVybiBbdGhpc1tfeGZhX29iamVjdC4kaWRzXS5nZXQoZXhwci5zbGljZSgxKSldOwogICAgfQogICAgcmV0dXJuICgwLCBfc29tLnNlYXJjaE5vZGUpKHRoaXMsIGNvbnRhaW5lciwgZXhwciwgdHJ1ZSwgdHJ1ZSk7CiAgfQogICpbX3hmYV9vYmplY3QuJHRvUGFnZXNdKCkgewogICAgaWYgKCF0aGlzLnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBjaGlsZHJlbjogW10KICAgICAgfSk7CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0gPSB7CiAgICAgIG92ZXJmbG93Tm9kZTogbnVsbCwKICAgICAgZmlyc3RVbnNwbGl0dGFibGU6IG51bGwsCiAgICAgIGN1cnJlbnRDb250ZW50QXJlYTogbnVsbCwKICAgICAgY3VycmVudFBhZ2VBcmVhOiBudWxsLAogICAgICBub0xheW91dEZhaWx1cmU6IGZhbHNlLAogICAgICBwYWdlTnVtYmVyOiAxLAogICAgICBwYWdlUG9zaXRpb246ICJmaXJzdCIsCiAgICAgIG9kZE9yRXZlbjogIm9kZCIsCiAgICAgIGJsYW5rT3JOb3RCbGFuazogIm5vbkJsYW5rIiwKICAgICAgcGFyYVN0YWNrOiBbXQogICAgfTsKICAgIGNvbnN0IHJvb3QgPSB0aGlzLnN1YmZvcm0uY2hpbGRyZW5bMF07CiAgICByb290LnBhZ2VTZXRbX3hmYV9vYmplY3QuJGNsZWFuUGFnZV0oKTsKICAgIGNvbnN0IHBhZ2VBcmVhcyA9IHJvb3QucGFnZVNldC5wYWdlQXJlYS5jaGlsZHJlbjsKICAgIGNvbnN0IG1haW5IdG1sID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgY2hpbGRyZW46IFtdCiAgICB9OwogICAgbGV0IHBhZ2VBcmVhID0gbnVsbDsKICAgIGxldCBicmVha0JlZm9yZSA9IG51bGw7CiAgICBsZXQgYnJlYWtCZWZvcmVUYXJnZXQgPSBudWxsOwogICAgaWYgKHJvb3QuYnJlYWtCZWZvcmUuY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LmJyZWFrQmVmb3JlLmNoaWxkcmVuWzBdOwogICAgICBicmVha0JlZm9yZVRhcmdldCA9IGJyZWFrQmVmb3JlLnRhcmdldDsKICAgIH0gZWxzZSBpZiAocm9vdC5zdWJmb3JtLmNoaWxkcmVuLmxlbmd0aCA+PSAxICYmIHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlbi5sZW5ndGggPj0gMSkgewogICAgICBicmVha0JlZm9yZSA9IHJvb3Quc3ViZm9ybS5jaGlsZHJlblswXS5icmVha0JlZm9yZS5jaGlsZHJlblswXTsKICAgICAgYnJlYWtCZWZvcmVUYXJnZXQgPSBicmVha0JlZm9yZS50YXJnZXQ7CiAgICB9IGVsc2UgaWYgKHJvb3QuYnJlYWs/LmJlZm9yZVRhcmdldCkgewogICAgICBicmVha0JlZm9yZSA9IHJvb3QuYnJlYWs7CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUuYmVmb3JlVGFyZ2V0OwogICAgfSBlbHNlIGlmIChyb290LnN1YmZvcm0uY2hpbGRyZW4ubGVuZ3RoID49IDEgJiYgcm9vdC5zdWJmb3JtLmNoaWxkcmVuWzBdLmJyZWFrPy5iZWZvcmVUYXJnZXQpIHsKICAgICAgYnJlYWtCZWZvcmUgPSByb290LnN1YmZvcm0uY2hpbGRyZW5bMF0uYnJlYWs7CiAgICAgIGJyZWFrQmVmb3JlVGFyZ2V0ID0gYnJlYWtCZWZvcmUuYmVmb3JlVGFyZ2V0OwogICAgfQogICAgaWYgKGJyZWFrQmVmb3JlKSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXNbX3hmYV9vYmplY3QuJHNlYXJjaE5vZGVdKGJyZWFrQmVmb3JlVGFyZ2V0LCBicmVha0JlZm9yZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpKTsKICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFBhZ2VBcmVhKSB7CiAgICAgICAgcGFnZUFyZWEgPSB0YXJnZXQ7CiAgICAgICAgYnJlYWtCZWZvcmVbX3hmYV9vYmplY3QuJGV4dHJhXSA9IHt9OwogICAgICB9CiAgICB9CiAgICBpZiAoIXBhZ2VBcmVhKSB7CiAgICAgIHBhZ2VBcmVhID0gcGFnZUFyZWFzWzBdOwogICAgfQogICAgcGFnZUFyZWFbX3hmYV9vYmplY3QuJGV4dHJhXSA9IHsKICAgICAgbnVtYmVyT2ZVc2U6IDEKICAgIH07CiAgICBjb25zdCBwYWdlQXJlYVBhcmVudCA9IHBhZ2VBcmVhW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICBwYWdlQXJlYVBhcmVudFtfeGZhX29iamVjdC4kZXh0cmFdID0gewogICAgICBudW1iZXJPZlVzZTogMSwKICAgICAgcGFnZUluZGV4OiBwYWdlQXJlYVBhcmVudC5wYWdlQXJlYS5jaGlsZHJlbi5pbmRleE9mKHBhZ2VBcmVhKSwKICAgICAgcGFnZVNldEluZGV4OiAwCiAgICB9OwogICAgbGV0IHRhcmdldFBhZ2VBcmVhOwogICAgbGV0IGxlYWRlciA9IG51bGw7CiAgICBsZXQgdHJhaWxlciA9IG51bGw7CiAgICBsZXQgaGFzU29tZXRoaW5nID0gdHJ1ZTsKICAgIGxldCBoYXNTb21ldGhpbmdDb3VudGVyID0gMDsKICAgIGxldCBzdGFydEluZGV4ID0gMDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICghaGFzU29tZXRoaW5nKSB7CiAgICAgICAgbWFpbkh0bWwuY2hpbGRyZW4ucG9wKCk7CiAgICAgICAgaWYgKCsraGFzU29tZXRoaW5nQ291bnRlciA9PT0gTUFYX0VNUFRZX1BBR0VTKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoIlhGQSAtIFNvbWV0aGluZyBnb2VzIHdyb25nOiBwbGVhc2UgZmlsZSBhIGJ1Zy4iKTsKICAgICAgICAgIHJldHVybiBtYWluSHRtbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGFzU29tZXRoaW5nQ291bnRlciA9IDA7CiAgICAgIH0KICAgICAgdGFyZ2V0UGFnZUFyZWEgPSBudWxsOwogICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uY3VycmVudFBhZ2VBcmVhID0gcGFnZUFyZWE7CiAgICAgIGNvbnN0IHBhZ2UgPSBwYWdlQXJlYVtfeGZhX29iamVjdC4kdG9IVE1MXSgpLmh0bWw7CiAgICAgIG1haW5IdG1sLmNoaWxkcmVuLnB1c2gocGFnZSk7CiAgICAgIGlmIChsZWFkZXIpIHsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gdHJ1ZTsKICAgICAgICBwYWdlLmNoaWxkcmVuLnB1c2gobGVhZGVyW194ZmFfb2JqZWN0LiR0b0hUTUxdKHBhZ2VBcmVhW194ZmFfb2JqZWN0LiRleHRyYV0uc3BhY2UpLmh0bWwpOwogICAgICAgIGxlYWRlciA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKHRyYWlsZXIpIHsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlID0gdHJ1ZTsKICAgICAgICBwYWdlLmNoaWxkcmVuLnB1c2godHJhaWxlcltfeGZhX29iamVjdC4kdG9IVE1MXShwYWdlQXJlYVtfeGZhX29iamVjdC4kZXh0cmFdLnNwYWNlKS5odG1sKTsKICAgICAgICB0cmFpbGVyID0gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBjb250ZW50QXJlYXMgPSBwYWdlQXJlYS5jb250ZW50QXJlYS5jaGlsZHJlbjsKICAgICAgY29uc3QgaHRtbENvbnRlbnRBcmVhcyA9IHBhZ2UuY2hpbGRyZW4uZmlsdGVyKG5vZGUgPT4gbm9kZS5hdHRyaWJ1dGVzLmNsYXNzLmluY2x1ZGVzKCJ4ZmFDb250ZW50YXJlYSIpKTsKICAgICAgaGFzU29tZXRoaW5nID0gZmFsc2U7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5maXJzdFVuc3BsaXR0YWJsZSA9IG51bGw7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5ub0xheW91dEZhaWx1cmUgPSBmYWxzZTsKICAgICAgY29uc3QgZmx1c2ggPSBpbmRleCA9PiB7CiAgICAgICAgY29uc3QgaHRtbCA9IHJvb3RbX3hmYV9vYmplY3QuJGZsdXNoSFRNTF0oKTsKICAgICAgICBpZiAoaHRtbCkgewogICAgICAgICAgaGFzU29tZXRoaW5nIHx8PSBodG1sLmNoaWxkcmVuPy5sZW5ndGggPiAwOwogICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpbmRleF0uY2hpbGRyZW4ucHVzaChodG1sKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4LCBpaSA9IGNvbnRlbnRBcmVhcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgY29uc3QgY29udGVudEFyZWEgPSB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0uY3VycmVudENvbnRlbnRBcmVhID0gY29udGVudEFyZWFzW2ldOwogICAgICAgIGNvbnN0IHNwYWNlID0gewogICAgICAgICAgd2lkdGg6IGNvbnRlbnRBcmVhLncsCiAgICAgICAgICBoZWlnaHQ6IGNvbnRlbnRBcmVhLmgKICAgICAgICB9OwogICAgICAgIHN0YXJ0SW5kZXggPSAwOwogICAgICAgIGlmIChsZWFkZXIpIHsKICAgICAgICAgIGh0bWxDb250ZW50QXJlYXNbaV0uY2hpbGRyZW4ucHVzaChsZWFkZXJbX3hmYV9vYmplY3QuJHRvSFRNTF0oc3BhY2UpLmh0bWwpOwogICAgICAgICAgbGVhZGVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHRyYWlsZXIpIHsKICAgICAgICAgIGh0bWxDb250ZW50QXJlYXNbaV0uY2hpbGRyZW4ucHVzaCh0cmFpbGVyW194ZmFfb2JqZWN0LiR0b0hUTUxdKHNwYWNlKS5odG1sKTsKICAgICAgICAgIHRyYWlsZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBodG1sID0gcm9vdFtfeGZhX29iamVjdC4kdG9IVE1MXShzcGFjZSk7CiAgICAgICAgaWYgKGh0bWwuc3VjY2VzcykgewogICAgICAgICAgaWYgKGh0bWwuaHRtbCkgewogICAgICAgICAgICBoYXNTb21ldGhpbmcgfHw9IGh0bWwuaHRtbC5jaGlsZHJlbj8ubGVuZ3RoID4gMDsKICAgICAgICAgICAgaHRtbENvbnRlbnRBcmVhc1tpXS5jaGlsZHJlbi5wdXNoKGh0bWwuaHRtbCk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNTb21ldGhpbmcgJiYgbWFpbkh0bWwuY2hpbGRyZW4ubGVuZ3RoID4gMSkgewogICAgICAgICAgICBtYWluSHRtbC5jaGlsZHJlbi5wb3AoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtYWluSHRtbDsKICAgICAgICB9CiAgICAgICAgaWYgKGh0bWwuaXNCcmVhaygpKSB7CiAgICAgICAgICBjb25zdCBub2RlID0gaHRtbC5icmVha05vZGU7CiAgICAgICAgICBmbHVzaChpKTsKICAgICAgICAgIGlmIChub2RlLnRhcmdldFR5cGUgPT09ICJhdXRvIikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChub2RlLmxlYWRlcikgewogICAgICAgICAgICBsZWFkZXIgPSB0aGlzW194ZmFfb2JqZWN0LiRzZWFyY2hOb2RlXShub2RlLmxlYWRlciwgbm9kZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpKTsKICAgICAgICAgICAgbGVhZGVyID0gbGVhZGVyID8gbGVhZGVyWzBdIDogbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChub2RlLnRyYWlsZXIpIHsKICAgICAgICAgICAgdHJhaWxlciA9IHRoaXNbX3hmYV9vYmplY3QuJHNlYXJjaE5vZGVdKG5vZGUudHJhaWxlciwgbm9kZVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpKTsKICAgICAgICAgICAgdHJhaWxlciA9IHRyYWlsZXIgPyB0cmFpbGVyWzBdIDogbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChub2RlLnRhcmdldFR5cGUgPT09ICJwYWdlQXJlYSIpIHsKICAgICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0udGFyZ2V0OwogICAgICAgICAgICBpID0gSW5maW5pdHk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFub2RlW194ZmFfb2JqZWN0LiRleHRyYV0udGFyZ2V0KSB7CiAgICAgICAgICAgIGkgPSBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uaW5kZXg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS50YXJnZXQ7CiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uaW5kZXggKyAxOwogICAgICAgICAgICBpID0gSW5maW5pdHk7CiAgICAgICAgICB9CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXS5vdmVyZmxvd05vZGUpIHsKICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ub3ZlcmZsb3dOb2RlOwogICAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdLm92ZXJmbG93Tm9kZSA9IG51bGw7CiAgICAgICAgICBjb25zdCBvdmVyZmxvd0V4dHJhID0gbm9kZVtfeGZhX29iamVjdC4kZ2V0RXh0cmFdKCk7CiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBvdmVyZmxvd0V4dHJhLnRhcmdldDsKICAgICAgICAgIG92ZXJmbG93RXh0cmEuYWRkTGVhZGVyID0gb3ZlcmZsb3dFeHRyYS5sZWFkZXIgIT09IG51bGw7CiAgICAgICAgICBvdmVyZmxvd0V4dHJhLmFkZFRyYWlsZXIgPSBvdmVyZmxvd0V4dHJhLnRyYWlsZXIgIT09IG51bGw7CiAgICAgICAgICBmbHVzaChpKTsKICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGk7CiAgICAgICAgICBpID0gSW5maW5pdHk7CiAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUGFnZUFyZWEpIHsKICAgICAgICAgICAgdGFyZ2V0UGFnZUFyZWEgPSB0YXJnZXQ7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbnRlbnRBcmVhKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29udGVudEFyZWFzLmluZGV4T2YodGFyZ2V0KTsKICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgICAgIGlmIChpbmRleCA+IGN1cnJlbnRJbmRleCkgewogICAgICAgICAgICAgICAgaSA9IGluZGV4IC0gMTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0YXJnZXRQYWdlQXJlYSA9IHRhcmdldFtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0YXJnZXRQYWdlQXJlYS5jb250ZW50QXJlYS5jaGlsZHJlbi5pbmRleE9mKHRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBmbHVzaChpKTsKICAgICAgfQogICAgICB0aGlzW194ZmFfb2JqZWN0LiRleHRyYV0ucGFnZU51bWJlciArPSAxOwogICAgICBpZiAodGFyZ2V0UGFnZUFyZWEpIHsKICAgICAgICBpZiAodGFyZ2V0UGFnZUFyZWFbX3hmYV9vYmplY3QuJGlzVXNhYmxlXSgpKSB7CiAgICAgICAgICB0YXJnZXRQYWdlQXJlYVtfeGZhX29iamVjdC4kZXh0cmFdLm51bWJlck9mVXNlICs9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRhcmdldFBhZ2VBcmVhID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFnZUFyZWEgPSB0YXJnZXRQYWdlQXJlYSB8fCBwYWdlQXJlYVtfeGZhX29iamVjdC4kZ2V0TmV4dFBhZ2VdKCk7CiAgICAgIHlpZWxkIG51bGw7CiAgICB9CiAgfQp9CmV4cG9ydHMuVGVtcGxhdGUgPSBUZW1wbGF0ZTsKY2xhc3MgVGV4dCBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidGV4dCIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm1heENoYXJzID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWF4Q2hhcnMsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA+PSAwCiAgICB9KTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMucmlkID0gYXR0cmlidXRlcy5yaWQgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KICBbX3hmYV9vYmplY3QuJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIFtfeGZhX29iamVjdC4kb25DaGlsZF0oY2hpbGQpIHsKICAgIGlmIChjaGlsZFtfeGZhX29iamVjdC4kbmFtZXNwYWNlSWRdID09PSBfbmFtZXNwYWNlcy5OYW1lc3BhY2VJZHMueGh0bWwuaWQpIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBjaGlsZDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIEludmFsaWQgY29udGVudCBpbiBUZXh0OiAke2NoaWxkW194ZmFfb2JqZWN0LiRub2RlTmFtZV19LmApOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBbX3hmYV9vYmplY3QuJG9uVGV4dF0oc3RyKSB7CiAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gaW5zdGFuY2VvZiBfeGZhX29iamVjdC5YRkFPYmplY3QpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3VwZXJbX3hmYV9vYmplY3QuJG9uVGV4dF0oc3RyKTsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICBpZiAodHlwZW9mIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnJlcGxhY2VBbGwoIlxyXG4iLCAiXG4iKTsKICAgIH0KICB9CiAgW194ZmFfb2JqZWN0LiRnZXRFeHRyYV0oKSB7CiAgICBpZiAodHlwZW9mIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICByZXR1cm4gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0uc3BsaXQoL1tcdTIwMjlcdTIwMjhcbl0vKS5yZWR1Y2UoKGFjYywgbGluZSkgPT4gewogICAgICAgIGlmIChsaW5lKSB7CiAgICAgICAgICBhY2MucHVzaChsaW5lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgfSwgW10pLmpvaW4oIlxuIik7CiAgICB9CiAgICByZXR1cm4gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF1bX3hmYV9vYmplY3QuJHRleHRdKCk7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgaWYgKHR5cGVvZiB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgY29uc3QgaHRtbCA9IHZhbHVlVG9IdG1sKHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdKS5odG1sOwogICAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0uaW5jbHVkZXMoIlx1MjAyOSIpKSB7CiAgICAgICAgaHRtbC5uYW1lID0gImRpdiI7CiAgICAgICAgaHRtbC5jaGlsZHJlbiA9IFtdOwogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnNwbGl0KCJcdTIwMjkiKS5tYXAocGFyYSA9PiBwYXJhLnNwbGl0KC9bXHUyMDI4XG5dLykucmVkdWNlKChhY2MsIGxpbmUpID0+IHsKICAgICAgICAgIGFjYy5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgfSwgW10pKS5mb3JFYWNoKGxpbmVzID0+IHsKICAgICAgICAgIGh0bWwuY2hpbGRyZW4ucHVzaCh7CiAgICAgICAgICAgIG5hbWU6ICJwIiwKICAgICAgICAgICAgY2hpbGRyZW46IGxpbmVzCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICgvW1x1MjAyOFxuXS8udGVzdCh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSkpIHsKICAgICAgICBodG1sLm5hbWUgPSAiZGl2IjsKICAgICAgICBodG1sLmNoaWxkcmVuID0gW107CiAgICAgICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0uc3BsaXQoL1tcdTIwMjhcbl0vKS5mb3JFYWNoKGxpbmUgPT4gewogICAgICAgICAgaHRtbC5jaGlsZHJlbi5wdXNoKHsKICAgICAgICAgICAgbmFtZTogInNwYW4iLAogICAgICAgICAgICB2YWx1ZTogbGluZQogICAgICAgICAgfSwgewogICAgICAgICAgICBuYW1lOiAiYnIiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcyhodG1sKTsKICAgIH0KICAgIHJldHVybiB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XVtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSk7CiAgfQp9CmV4cG9ydHMuVGV4dCA9IFRleHQ7CmNsYXNzIFRleHRFZGl0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRleHRFZGl0IiwgdHJ1ZSk7CiAgICB0aGlzLmFsbG93UmljaFRleHQgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hbGxvd1JpY2hUZXh0LAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5oU2Nyb2xsUG9saWN5ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuaFNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5tdWx0aUxpbmUgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5tdWx0aUxpbmUsCiAgICAgIGRlZmF1bHRWYWx1ZTogIiIsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDAgfHwgeCA9PT0gMQogICAgfSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy52U2Nyb2xsUG9saWN5ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMudlNjcm9sbFBvbGljeSwgWyJhdXRvIiwgIm9mZiIsICJvbiJdKTsKICAgIHRoaXMuYm9yZGVyID0gbnVsbDsKICAgIHRoaXMuY29tYiA9IG51bGw7CiAgICB0aGlzLmV4dHJhcyA9IG51bGw7CiAgICB0aGlzLm1hcmdpbiA9IG51bGw7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3Qgc3R5bGUgPSAoMCwgX2h0bWxfdXRpbHMudG9TdHlsZSkodGhpcywgImJvcmRlciIsICJmb250IiwgIm1hcmdpbiIpOwogICAgbGV0IGh0bWw7CiAgICBjb25zdCBmaWVsZCA9IHRoaXNbX3hmYV9vYmplY3QuJGdldFBhcmVudF0oKVtfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAiIikgewogICAgICB0aGlzLm11bHRpTGluZSA9IGZpZWxkIGluc3RhbmNlb2YgRHJhdyA/IDEgOiAwOwogICAgfQogICAgaWYgKHRoaXMubXVsdGlMaW5lID09PSAxKSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogInRleHRhcmVhIiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBkYXRhSWQ6IGZpZWxkW194ZmFfb2JqZWN0LiRkYXRhXT8uW194ZmFfb2JqZWN0LiR1aWRdIHx8IGZpZWxkW194ZmFfb2JqZWN0LiR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGh0bWwgPSB7CiAgICAgICAgbmFtZTogImlucHV0IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICB0eXBlOiAidGV4dCIsCiAgICAgICAgICBkYXRhSWQ6IGZpZWxkW194ZmFfb2JqZWN0LiRkYXRhXT8uW194ZmFfb2JqZWN0LiR1aWRdIHx8IGZpZWxkW194ZmFfb2JqZWN0LiR1aWRdLAogICAgICAgICAgZmllbGRJZDogZmllbGRbX3hmYV9vYmplY3QuJHVpZF0sCiAgICAgICAgICBjbGFzczogWyJ4ZmFUZXh0ZmllbGQiXSwKICAgICAgICAgIHN0eWxlLAogICAgICAgICAgImFyaWEtbGFiZWwiOiBhcmlhTGFiZWwoZmllbGQpLAogICAgICAgICAgImFyaWEtcmVxdWlyZWQiOiBmYWxzZQogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGlmIChpc1JlcXVpcmVkKGZpZWxkKSkgewogICAgICBodG1sLmF0dHJpYnV0ZXNbImFyaWEtcmVxdWlyZWQiXSA9IHRydWU7CiAgICAgIGh0bWwuYXR0cmlidXRlcy5yZXF1aXJlZCA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6ICJsYWJlbCIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFMYWJlbCJdCiAgICAgIH0sCiAgICAgIGNoaWxkcmVuOiBbaHRtbF0KICAgIH0pOwogIH0KfQpjbGFzcyBUaW1lIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRpbWUiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBkYXRlID0gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udHJpbSgpOwogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiB2YWx1ZVRvSHRtbCh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA/IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRvU3RyaW5nKCkgOiAiIik7CiAgfQp9CmNsYXNzIFRpbWVTdGFtcCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0aW1lU3RhbXAiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5zZXJ2ZXIgPSBhdHRyaWJ1dGVzLnNlcnZlciB8fCAiIjsKICAgIHRoaXMudHlwZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnR5cGUsIFsib3B0aW9uYWwiLCAicmVxdWlyZWQiXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBUb29sVGlwIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInRvb2xUaXAiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5yaWQgPSBhdHRyaWJ1dGVzLnJpZCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFRyYXZlcnNhbCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ0cmF2ZXJzYWwiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMudHJhdmVyc2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgVHJhdmVyc2UgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidHJhdmVyc2UiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5vcGVyYXRpb24gPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5vcGVyYXRpb24sIFsibmV4dCIsICJiYWNrIiwgImRvd24iLCAiZmlyc3QiLCAibGVmdCIsICJyaWdodCIsICJ1cCJdKTsKICAgIHRoaXMucmVmID0gYXR0cmlidXRlcy5yZWYgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5zY3JpcHQgPSBudWxsOwogIH0KICBnZXQgbmFtZSgpIHsKICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbjsKICB9CiAgW194ZmFfb2JqZWN0LiRpc1RyYW5zcGFyZW50XSgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0KY2xhc3MgVWkgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidWkiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuZXh0cmFzID0gbnVsbDsKICAgIHRoaXMucGljdHVyZSA9IG51bGw7CiAgICB0aGlzLmJhcmNvZGUgPSBudWxsOwogICAgdGhpcy5idXR0b24gPSBudWxsOwogICAgdGhpcy5jaGVja0J1dHRvbiA9IG51bGw7CiAgICB0aGlzLmNob2ljZUxpc3QgPSBudWxsOwogICAgdGhpcy5kYXRlVGltZUVkaXQgPSBudWxsOwogICAgdGhpcy5kZWZhdWx0VWkgPSBudWxsOwogICAgdGhpcy5pbWFnZUVkaXQgPSBudWxsOwogICAgdGhpcy5udW1lcmljRWRpdCA9IG51bGw7CiAgICB0aGlzLnBhc3N3b3JkRWRpdCA9IG51bGw7CiAgICB0aGlzLnNpZ25hdHVyZSA9IG51bGw7CiAgICB0aGlzLnRleHRFZGl0ID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRnZXRFeHRyYV0oKSB7CiAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID09PSB1bmRlZmluZWQpIHsKICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgICAgaWYgKG5hbWUgPT09ICJleHRyYXMiIHx8IG5hbWUgPT09ICJwaWN0dXJlIikgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgX3hmYV9vYmplY3QuWEZBT2JqZWN0KSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSA9IG9iajsKICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIGNvbnN0IG9iaiA9IHRoaXNbX3hmYV9vYmplY3QuJGdldEV4dHJhXSgpOwogICAgaWYgKG9iaikgewogICAgICByZXR1cm4gb2JqW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKTsKICAgIH0KICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICB9Cn0KY2xhc3MgVmFsaWRhdGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKFRFTVBMQVRFX05TX0lELCAidmFsaWRhdGUiLCB0cnVlKTsKICAgIHRoaXMuZm9ybWF0VGVzdCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmZvcm1hdFRlc3QsIFsid2FybmluZyIsICJkaXNhYmxlZCIsICJlcnJvciJdKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5udWxsVGVzdCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm51bGxUZXN0LCBbImRpc2FibGVkIiwgImVycm9yIiwgIndhcm5pbmciXSk7CiAgICB0aGlzLnNjcmlwdFRlc3QgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5zY3JpcHRUZXN0LCBbImVycm9yIiwgImRpc2FibGVkIiwgIndhcm5pbmciXSk7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogICAgdGhpcy5leHRyYXMgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICAgIHRoaXMucGljdHVyZSA9IG51bGw7CiAgICB0aGlzLnNjcmlwdCA9IG51bGw7CiAgfQp9CmNsYXNzIFZhbHVlIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihURU1QTEFURV9OU19JRCwgInZhbHVlIiwgdHJ1ZSk7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMub3ZlcnJpZGUgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5vdmVycmlkZSwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogeCA9PiB4ID09PSAxCiAgICB9KTsKICAgIHRoaXMucmVsZXZhbnQgPSAoMCwgX3V0aWxzLmdldFJlbGV2YW50KShhdHRyaWJ1dGVzLnJlbGV2YW50KTsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgICB0aGlzLmFyYyA9IG51bGw7CiAgICB0aGlzLmJvb2xlYW4gPSBudWxsOwogICAgdGhpcy5kYXRlID0gbnVsbDsKICAgIHRoaXMuZGF0ZVRpbWUgPSBudWxsOwogICAgdGhpcy5kZWNpbWFsID0gbnVsbDsKICAgIHRoaXMuZXhEYXRhID0gbnVsbDsKICAgIHRoaXMuZmxvYXQgPSBudWxsOwogICAgdGhpcy5pbWFnZSA9IG51bGw7CiAgICB0aGlzLmludGVnZXIgPSBudWxsOwogICAgdGhpcy5saW5lID0gbnVsbDsKICAgIHRoaXMucmVjdGFuZ2xlID0gbnVsbDsKICAgIHRoaXMudGV4dCA9IG51bGw7CiAgICB0aGlzLnRpbWUgPSBudWxsOwogIH0KICBbX3hmYV9vYmplY3QuJHNldFZhbHVlXSh2YWx1ZSkgewogICAgY29uc3QgcGFyZW50ID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpOwogICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZpZWxkKSB7CiAgICAgIGlmIChwYXJlbnQudWk/LmltYWdlRWRpdCkgewogICAgICAgIGlmICghdGhpcy5pbWFnZSkgewogICAgICAgICAgdGhpcy5pbWFnZSA9IG5ldyBJbWFnZSh7fSk7CiAgICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRhcHBlbmRDaGlsZF0odGhpcy5pbWFnZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW1hZ2VbX3hmYV9vYmplY3QuJGNvbnRlbnRdID0gdmFsdWVbX3hmYV9vYmplY3QuJGNvbnRlbnRdOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgY29uc3QgdmFsdWVOYW1lID0gdmFsdWVbX3hmYV9vYmplY3QuJG5vZGVOYW1lXTsKICAgIGlmICh0aGlzW3ZhbHVlTmFtZV0gIT09IG51bGwpIHsKICAgICAgdGhpc1t2YWx1ZU5hbWVdW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHZhbHVlW194ZmFfb2JqZWN0LiRjb250ZW50XTsKICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfeGZhX29iamVjdC5YRkFPYmplY3QpIHsKICAgICAgICB0aGlzW25hbWVdID0gbnVsbDsKICAgICAgICB0aGlzW194ZmFfb2JqZWN0LiRyZW1vdmVDaGlsZF0ob2JqKTsKICAgICAgfQogICAgfQogICAgdGhpc1t2YWx1ZVtfeGZhX29iamVjdC4kbm9kZU5hbWVdXSA9IHZhbHVlOwogICAgdGhpc1tfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKHZhbHVlKTsKICB9CiAgW194ZmFfb2JqZWN0LiR0ZXh0XSgpIHsKICAgIGlmICh0aGlzLmV4RGF0YSkgewogICAgICBpZiAodHlwZW9mIHRoaXMuZXhEYXRhW194ZmFfb2JqZWN0LiRjb250ZW50XSA9PT0gInN0cmluZyIpIHsKICAgICAgICByZXR1cm4gdGhpcy5leERhdGFbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5leERhdGFbX3hmYV9vYmplY3QuJGNvbnRlbnRdW194ZmFfb2JqZWN0LiR0ZXh0XSgpLnRyaW0oKTsKICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkgewogICAgICBpZiAobmFtZSA9PT0gImltYWdlIikgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IG9iaiA9IHRoaXNbbmFtZV07CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBfeGZhX29iamVjdC5YRkFPYmplY3QpIHsKICAgICAgICByZXR1cm4gKG9ialtfeGZhX29iamVjdC4kY29udGVudF0gfHwgIiIpLnRvU3RyaW5nKCkudHJpbSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHsKICAgICAgY29uc3Qgb2JqID0gdGhpc1tuYW1lXTsKICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgX3hmYV9vYmplY3QuWEZBT2JqZWN0KSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHJldHVybiBvYmpbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgfQogICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogIH0KfQpleHBvcnRzLlZhbHVlID0gVmFsdWU7CmNsYXNzIFZhcmlhYmxlcyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoVEVNUExBVEVfTlNfSUQsICJ2YXJpYWJsZXMiLCB0cnVlKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICAgIHRoaXMuYm9vbGVhbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5kYXRlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRhdGVUaW1lID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmRlY2ltYWwgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXhEYXRhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmZsb2F0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmltYWdlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLmludGVnZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubWFuaWZlc3QgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc2NyaXB0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRleHQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudGltZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KICBbX3hmYV9vYmplY3QuJGlzVHJhbnNwYXJlbnRdKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQp9CmNsYXNzIFRlbXBsYXRlTmFtZXNwYWNlIHsKICBzdGF0aWMgW19uYW1lc3BhY2VzLiRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFRlbXBsYXRlTmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIGNvbnN0IG5vZGUgPSBUZW1wbGF0ZU5hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgICAgbm9kZVtfeGZhX29iamVjdC4kc2V0U2V0QXR0cmlidXRlc10oYXR0cmlidXRlcyk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGFwcGVhcmFuY2VGaWx0ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXBwZWFyYW5jZUZpbHRlcihhdHRycyk7CiAgfQogIHN0YXRpYyBhcmMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXJjKGF0dHJzKTsKICB9CiAgc3RhdGljIGFyZWEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXJlYShhdHRycyk7CiAgfQogIHN0YXRpYyBhc3Npc3QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXNzaXN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGJhcmNvZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQmFyY29kZShhdHRycyk7CiAgfQogIHN0YXRpYyBiaW5kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJpbmQoYXR0cnMpOwogIH0KICBzdGF0aWMgYmluZEl0ZW1zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJpbmRJdGVtcyhhdHRycyk7CiAgfQogIHN0YXRpYyBib29rZW5kKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJvb2tlbmQoYXR0cnMpOwogIH0KICBzdGF0aWMgYm9vbGVhbihhdHRycykgewogICAgcmV0dXJuIG5ldyBCb29sZWFuRWxlbWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBib3JkZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQm9yZGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGJyZWFrKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJyZWFrKGF0dHJzKTsKICB9CiAgc3RhdGljIGJyZWFrQWZ0ZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQnJlYWtBZnRlcihhdHRycyk7CiAgfQogIHN0YXRpYyBicmVha0JlZm9yZShhdHRycykgewogICAgcmV0dXJuIG5ldyBCcmVha0JlZm9yZShhdHRycyk7CiAgfQogIHN0YXRpYyBidXR0b24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQnV0dG9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhbGN1bGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDYWxjdWxhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgY2FwdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBDYXB0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNlcnRpZmljYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENlcnRpZmljYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNlcnRpZmljYXRlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDZXJ0aWZpY2F0ZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgY2hlY2tCdXR0b24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2hlY2tCdXR0b24oYXR0cnMpOwogIH0KICBzdGF0aWMgY2hvaWNlTGlzdChhdHRycykgewogICAgcmV0dXJuIG5ldyBDaG9pY2VMaXN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbG9yKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbG9yKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbWIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29tYihhdHRycyk7CiAgfQogIHN0YXRpYyBjb25uZWN0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbm5lY3QoYXR0cnMpOwogIH0KICBzdGF0aWMgY29udGVudEFyZWEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29udGVudEFyZWEoYXR0cnMpOwogIH0KICBzdGF0aWMgY29ybmVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvcm5lcihhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERhdGVFbGVtZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGRhdGVUaW1lKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERhdGVUaW1lKGF0dHJzKTsKICB9CiAgc3RhdGljIGRhdGVUaW1lRWRpdChhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRlVGltZUVkaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgZGVjaW1hbChhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWNpbWFsKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlZmF1bHRVaShhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWZhdWx0VWkoYXR0cnMpOwogIH0KICBzdGF0aWMgZGVzYyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEZXNjKGF0dHJzKTsKICB9CiAgc3RhdGljIGRpZ2VzdE1ldGhvZChhdHRycykgewogICAgcmV0dXJuIG5ldyBEaWdlc3RNZXRob2QoYXR0cnMpOwogIH0KICBzdGF0aWMgZGlnZXN0TWV0aG9kcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBEaWdlc3RNZXRob2RzKGF0dHJzKTsKICB9CiAgc3RhdGljIGRyYXcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRHJhdyhhdHRycyk7CiAgfQogIHN0YXRpYyBlZGdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVkZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jb2RpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jb2RpbmcoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jb2RpbmdzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY29kaW5ncyhhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVuY3J5cHQoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdERhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdERhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb25NZXRob2QoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbk1ldGhvZChhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTWV0aG9kcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0aW9uTWV0aG9kcyhhdHRycyk7CiAgfQogIHN0YXRpYyBldmVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBFdmVudChhdHRycyk7CiAgfQogIHN0YXRpYyBleERhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhEYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4T2JqZWN0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEV4T2JqZWN0KGF0dHJzKTsKICB9CiAgc3RhdGljIGV4Y2xHcm91cChhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGNsR3JvdXAoYXR0cnMpOwogIH0KICBzdGF0aWMgZXhlY3V0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBFeGVjdXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4dHJhcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFeHRyYXMoYXR0cnMpOwogIH0KICBzdGF0aWMgZmllbGQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmllbGQoYXR0cnMpOwogIH0KICBzdGF0aWMgZmlsbChhdHRycykgewogICAgcmV0dXJuIG5ldyBGaWxsKGF0dHJzKTsKICB9CiAgc3RhdGljIGZpbHRlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBGaWx0ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZmxvYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRmxvYXQoYXR0cnMpOwogIH0KICBzdGF0aWMgZm9udChhdHRycykgewogICAgcmV0dXJuIG5ldyBGb250KGF0dHJzKTsKICB9CiAgc3RhdGljIGZvcm1hdChhdHRycykgewogICAgcmV0dXJuIG5ldyBGb3JtYXQoYXR0cnMpOwogIH0KICBzdGF0aWMgaGFuZGxlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBIYW5kbGVyKGF0dHJzKTsKICB9CiAgc3RhdGljIGh5cGhlbmF0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEh5cGhlbmF0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGltYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEltYWdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGltYWdlRWRpdChhdHRycykgewogICAgcmV0dXJuIG5ldyBJbWFnZUVkaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgaW50ZWdlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBJbnRlZ2VyKGF0dHJzKTsKICB9CiAgc3RhdGljIGlzc3VlcnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSXNzdWVycyhhdHRycyk7CiAgfQogIHN0YXRpYyBpdGVtcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBJdGVtcyhhdHRycyk7CiAgfQogIHN0YXRpYyBrZWVwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEtlZXAoYXR0cnMpOwogIH0KICBzdGF0aWMga2V5VXNhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgS2V5VXNhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgbGluZShhdHRycykgewogICAgcmV0dXJuIG5ldyBMaW5lKGF0dHJzKTsKICB9CiAgc3RhdGljIGxpbmVhcihhdHRycykgewogICAgcmV0dXJuIG5ldyBMaW5lYXIoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9ja0RvY3VtZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExvY2tEb2N1bWVudChhdHRycyk7CiAgfQogIHN0YXRpYyBtYW5pZmVzdChhdHRycykgewogICAgcmV0dXJuIG5ldyBNYW5pZmVzdChhdHRycyk7CiAgfQogIHN0YXRpYyBtYXJnaW4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWFyZ2luKGF0dHJzKTsKICB9CiAgc3RhdGljIG1kcChhdHRycykgewogICAgcmV0dXJuIG5ldyBNZHAoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVkaXVtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1lZGl1bShhdHRycyk7CiAgfQogIHN0YXRpYyBtZXNzYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1lc3NhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtZXJpY0VkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtZXJpY0VkaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgb2NjdXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT2NjdXIoYXR0cnMpOwogIH0KICBzdGF0aWMgb2lkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9pZChhdHRycyk7CiAgfQogIHN0YXRpYyBvaWRzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9pZHMoYXR0cnMpOwogIH0KICBzdGF0aWMgb3ZlcmZsb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3ZlcmZsb3coYXR0cnMpOwogIH0KICBzdGF0aWMgcGFnZUFyZWEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFnZUFyZWEoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFnZVNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWdlU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhcmEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFyYShhdHRycyk7CiAgfQogIHN0YXRpYyBwYXNzd29yZEVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGFzc3dvcmRFZGl0KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGF0dGVybihhdHRycyk7CiAgfQogIHN0YXRpYyBwaWN0dXJlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBpY3R1cmUoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJvdG8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJvdG8oYXR0cnMpOwogIH0KICBzdGF0aWMgcmFkaWFsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJhZGlhbChhdHRycyk7CiAgfQogIHN0YXRpYyByZWFzb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVhc29uKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlYXNvbnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVhc29ucyhhdHRycyk7CiAgfQogIHN0YXRpYyByZWN0YW5nbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlZihhdHRycykgewogICAgcmV0dXJuIG5ldyBSZWZFbGVtZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHNjcmlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBTY3JpcHQoYXR0cnMpOwogIH0KICBzdGF0aWMgc2V0UHJvcGVydHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2V0UHJvcGVydHkoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lnbkRhdGEoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU2lnbkRhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgc2lnbmF0dXJlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZShhdHRycyk7CiAgfQogIHN0YXRpYyBzaWduaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25pbmcoYXR0cnMpOwogIH0KICBzdGF0aWMgc29saWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU29saWQoYXR0cnMpOwogIH0KICBzdGF0aWMgc3BlYWsoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3BlYWsoYXR0cnMpOwogIH0KICBzdGF0aWMgc3RpcHBsZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTdGlwcGxlKGF0dHJzKTsKICB9CiAgc3RhdGljIHN1YmZvcm0oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3ViZm9ybShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJmb3JtU2V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmZvcm1TZXQoYXR0cnMpOwogIH0KICBzdGF0aWMgc3ViamVjdEROKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmplY3RETihhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJqZWN0RE5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1YmplY3RETnMoYXR0cnMpOwogIH0KICBzdGF0aWMgc3VibWl0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN1Ym1pdChhdHRycyk7CiAgfQogIHN0YXRpYyB0ZW1wbGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShhdHRycyk7CiAgfQogIHN0YXRpYyB0ZXh0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRleHQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGV4dEVkaXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGV4dEVkaXQoYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUaW1lKGF0dHJzKTsKICB9CiAgc3RhdGljIHRpbWVTdGFtcChhdHRycykgewogICAgcmV0dXJuIG5ldyBUaW1lU3RhbXAoYXR0cnMpOwogIH0KICBzdGF0aWMgdG9vbFRpcChhdHRycykgewogICAgcmV0dXJuIG5ldyBUb29sVGlwKGF0dHJzKTsKICB9CiAgc3RhdGljIHRyYXZlcnNhbChhdHRycykgewogICAgcmV0dXJuIG5ldyBUcmF2ZXJzYWwoYXR0cnMpOwogIH0KICBzdGF0aWMgdHJhdmVyc2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhdmVyc2UoYXR0cnMpOwogIH0KICBzdGF0aWMgdWkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVWkoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsaWRhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsaWRhdGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFsdWUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsdWUoYXR0cnMpOwogIH0KICBzdGF0aWMgdmFyaWFibGVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhcmlhYmxlcyhhdHRycyk7CiAgfQp9CmV4cG9ydHMuVGVtcGxhdGVOYW1lc3BhY2UgPSBUZW1wbGF0ZU5hbWVzcGFjZTsKCi8qKiovIH0pLAovKiA4NCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLmFkZEhUTUwgPSBhZGRIVE1MOwpleHBvcnRzLmNoZWNrRGltZW5zaW9ucyA9IGNoZWNrRGltZW5zaW9uczsKZXhwb3J0cy5mbHVzaEhUTUwgPSBmbHVzaEhUTUw7CmV4cG9ydHMuZ2V0QXZhaWxhYmxlU3BhY2UgPSBnZXRBdmFpbGFibGVTcGFjZTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfaHRtbF91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oODUpOwpmdW5jdGlvbiBjcmVhdGVMaW5lKG5vZGUsIGNoaWxkcmVuKSB7CiAgcmV0dXJuIHsKICAgIG5hbWU6ICJkaXYiLAogICAgYXR0cmlidXRlczogewogICAgICBjbGFzczogW25vZGUubGF5b3V0ID09PSAibHItdGIiID8gInhmYUxyIiA6ICJ4ZmFSbCJdCiAgICB9LAogICAgY2hpbGRyZW4KICB9Owp9CmZ1bmN0aW9uIGZsdXNoSFRNTChub2RlKSB7CiAgaWYgKCFub2RlW194ZmFfb2JqZWN0LiRleHRyYV0pIHsKICAgIHJldHVybiBudWxsOwogIH0KICBjb25zdCBhdHRyaWJ1dGVzID0gbm9kZVtfeGZhX29iamVjdC4kZXh0cmFdLmF0dHJpYnV0ZXM7CiAgY29uc3QgaHRtbCA9IHsKICAgIG5hbWU6ICJkaXYiLAogICAgYXR0cmlidXRlcywKICAgIGNoaWxkcmVuOiBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uY2hpbGRyZW4KICB9OwogIGlmIChub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uZmFpbGluZ05vZGUpIHsKICAgIGNvbnN0IGh0bWxGcm9tRmFpbGluZyA9IG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS5mYWlsaW5nTm9kZVtfeGZhX29iamVjdC4kZmx1c2hIVE1MXSgpOwogICAgaWYgKGh0bWxGcm9tRmFpbGluZykgewogICAgICBpZiAobm9kZS5sYXlvdXQuZW5kc1dpdGgoIi10YiIpKSB7CiAgICAgICAgaHRtbC5jaGlsZHJlbi5wdXNoKGNyZWF0ZUxpbmUobm9kZSwgW2h0bWxGcm9tRmFpbGluZ10pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBodG1sLmNoaWxkcmVuLnB1c2goaHRtbEZyb21GYWlsaW5nKTsKICAgICAgfQogICAgfQogIH0KICBpZiAoaHRtbC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gaHRtbDsKfQpmdW5jdGlvbiBhZGRIVE1MKG5vZGUsIGh0bWwsIGJib3gpIHsKICBjb25zdCBleHRyYSA9IG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXTsKICBjb25zdCBhdmFpbGFibGVTcGFjZSA9IGV4dHJhLmF2YWlsYWJsZVNwYWNlOwogIGNvbnN0IFt4LCB5LCB3LCBoXSA9IGJib3g7CiAgc3dpdGNoIChub2RlLmxheW91dCkgewogICAgY2FzZSAicG9zaXRpb24iOgogICAgICB7CiAgICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1heChleHRyYS53aWR0aCwgeCArIHcpOwogICAgICAgIGV4dHJhLmhlaWdodCA9IE1hdGgubWF4KGV4dHJhLmhlaWdodCwgeSArIGgpOwogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgImxyLXRiIjoKICAgIGNhc2UgInJsLXRiIjoKICAgICAgaWYgKCFleHRyYS5saW5lIHx8IGV4dHJhLmF0dGVtcHQgPT09IDEpIHsKICAgICAgICBleHRyYS5saW5lID0gY3JlYXRlTGluZShub2RlLCBbXSk7CiAgICAgICAgZXh0cmEuY2hpbGRyZW4ucHVzaChleHRyYS5saW5lKTsKICAgICAgICBleHRyYS5udW1iZXJJbkxpbmUgPSAwOwogICAgICB9CiAgICAgIGV4dHJhLm51bWJlckluTGluZSArPSAxOwogICAgICBleHRyYS5saW5lLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgIGlmIChleHRyYS5hdHRlbXB0ID09PSAwKSB7CiAgICAgICAgZXh0cmEuY3VycmVudFdpZHRoICs9IHc7CiAgICAgICAgZXh0cmEuaGVpZ2h0ID0gTWF0aC5tYXgoZXh0cmEuaGVpZ2h0LCBleHRyYS5wcmV2SGVpZ2h0ICsgaCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXh0cmEuY3VycmVudFdpZHRoID0gdzsKICAgICAgICBleHRyYS5wcmV2SGVpZ2h0ID0gZXh0cmEuaGVpZ2h0OwogICAgICAgIGV4dHJhLmhlaWdodCArPSBoOwogICAgICAgIGV4dHJhLmF0dGVtcHQgPSAwOwogICAgICB9CiAgICAgIGV4dHJhLndpZHRoID0gTWF0aC5tYXgoZXh0cmEud2lkdGgsIGV4dHJhLmN1cnJlbnRXaWR0aCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAicmwtcm93IjoKICAgIGNhc2UgInJvdyI6CiAgICAgIHsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIGV4dHJhLndpZHRoICs9IHc7CiAgICAgICAgZXh0cmEuaGVpZ2h0ID0gTWF0aC5tYXgoZXh0cmEuaGVpZ2h0LCBoKTsKICAgICAgICBjb25zdCBoZWlnaHQgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKShleHRyYS5oZWlnaHQpOwogICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZXh0cmEuY2hpbGRyZW4pIHsKICAgICAgICAgIGNoaWxkLmF0dHJpYnV0ZXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAidGFibGUiOgogICAgICB7CiAgICAgICAgZXh0cmEud2lkdGggPSBNYXRoLm1pbihhdmFpbGFibGVTcGFjZS53aWR0aCwgTWF0aC5tYXgoZXh0cmEud2lkdGgsIHcpKTsKICAgICAgICBleHRyYS5oZWlnaHQgKz0gaDsKICAgICAgICBleHRyYS5jaGlsZHJlbi5wdXNoKGh0bWwpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJ0YiI6CiAgICAgIHsKICAgICAgICBleHRyYS53aWR0aCA9IE1hdGgubWluKGF2YWlsYWJsZVNwYWNlLndpZHRoLCBNYXRoLm1heChleHRyYS53aWR0aCwgdykpOwogICAgICAgIGV4dHJhLmhlaWdodCArPSBoOwogICAgICAgIGV4dHJhLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICB9Cn0KZnVuY3Rpb24gZ2V0QXZhaWxhYmxlU3BhY2Uobm9kZSkgewogIGNvbnN0IGF2YWlsYWJsZVNwYWNlID0gbm9kZVtfeGZhX29iamVjdC4kZXh0cmFdLmF2YWlsYWJsZVNwYWNlOwogIGNvbnN0IG1hcmdpblYgPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLnRvcEluc2V0ICsgbm9kZS5tYXJnaW4uYm90dG9tSW5zZXQgOiAwOwogIGNvbnN0IG1hcmdpbkggPSBub2RlLm1hcmdpbiA/IG5vZGUubWFyZ2luLmxlZnRJbnNldCArIG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQgOiAwOwogIHN3aXRjaCAobm9kZS5sYXlvdXQpIHsKICAgIGNhc2UgImxyLXRiIjoKICAgIGNhc2UgInJsLXRiIjoKICAgICAgaWYgKG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS5hdHRlbXB0ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHdpZHRoOiBhdmFpbGFibGVTcGFjZS53aWR0aCAtIG1hcmdpbkggLSBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uY3VycmVudFdpZHRoLAogICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVTcGFjZS5oZWlnaHQgLSBtYXJnaW5WIC0gbm9kZVtfeGZhX29iamVjdC4kZXh0cmFdLnByZXZIZWlnaHQKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVNwYWNlLndpZHRoIC0gbWFyZ2luSCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpblYgLSBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uaGVpZ2h0CiAgICAgIH07CiAgICBjYXNlICJybC1yb3ciOgogICAgY2FzZSAicm93IjoKICAgICAgY29uc3Qgd2lkdGggPSBub2RlW194ZmFfb2JqZWN0LiRleHRyYV0uY29sdW1uV2lkdGhzLnNsaWNlKG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS5jdXJyZW50Q29sdW1uKS5yZWR1Y2UoKGEsIHgpID0+IGEgKyB4KTsKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZVNwYWNlLmhlaWdodCAtIG1hcmdpbkgKICAgICAgfTsKICAgIGNhc2UgInRhYmxlIjoKICAgIGNhc2UgInRiIjoKICAgICAgcmV0dXJuIHsKICAgICAgICB3aWR0aDogYXZhaWxhYmxlU3BhY2Uud2lkdGggLSBtYXJnaW5ILAogICAgICAgIGhlaWdodDogYXZhaWxhYmxlU3BhY2UuaGVpZ2h0IC0gbWFyZ2luViAtIG5vZGVbX3hmYV9vYmplY3QuJGV4dHJhXS5oZWlnaHQKICAgICAgfTsKICAgIGNhc2UgInBvc2l0aW9uIjoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBhdmFpbGFibGVTcGFjZTsKICB9Cn0KZnVuY3Rpb24gZ2V0VHJhbnNmb3JtZWRCQm94KG5vZGUpIHsKICBsZXQgdyA9IG5vZGUudyA9PT0gIiIgPyBOYU4gOiBub2RlLnc7CiAgbGV0IGggPSBub2RlLmggPT09ICIiID8gTmFOIDogbm9kZS5oOwogIGxldCBbY2VudGVyWCwgY2VudGVyWV0gPSBbMCwgMF07CiAgc3dpdGNoIChub2RlLmFuY2hvclR5cGUgfHwgIiIpIHsKICAgIGNhc2UgImJvdHRvbUNlbnRlciI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3IC8gMiwgaF07CiAgICAgIGJyZWFrOwogICAgY2FzZSAiYm90dG9tTGVmdCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFswLCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJib3R0b21SaWdodCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3LCBoXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtaWRkbGVDZW50ZXIiOgogICAgICBbY2VudGVyWCwgY2VudGVyWV0gPSBbdyAvIDIsIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtaWRkbGVMZWZ0IjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gWzAsIGggLyAyXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJtaWRkbGVSaWdodCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3LCBoIC8gMl07CiAgICAgIGJyZWFrOwogICAgY2FzZSAidG9wQ2VudGVyIjoKICAgICAgW2NlbnRlclgsIGNlbnRlclldID0gW3cgLyAyLCAwXTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ0b3BSaWdodCI6CiAgICAgIFtjZW50ZXJYLCBjZW50ZXJZXSA9IFt3LCAwXTsKICAgICAgYnJlYWs7CiAgfQogIGxldCB4LCB5OwogIHN3aXRjaCAobm9kZS5yb3RhdGUgfHwgMCkgewogICAgY2FzZSAwOgogICAgICBbeCwgeV0gPSBbLWNlbnRlclgsIC1jZW50ZXJZXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDkwOgogICAgICBbeCwgeV0gPSBbLWNlbnRlclksIGNlbnRlclhdOwogICAgICBbdywgaF0gPSBbaCwgLXddOwogICAgICBicmVhazsKICAgIGNhc2UgMTgwOgogICAgICBbeCwgeV0gPSBbY2VudGVyWCwgY2VudGVyWV07CiAgICAgIFt3LCBoXSA9IFstdywgLWhdOwogICAgICBicmVhazsKICAgIGNhc2UgMjcwOgogICAgICBbeCwgeV0gPSBbY2VudGVyWSwgLWNlbnRlclhdOwogICAgICBbdywgaF0gPSBbLWgsIHddOwogICAgICBicmVhazsKICB9CiAgcmV0dXJuIFtub2RlLnggKyB4ICsgTWF0aC5taW4oMCwgdyksIG5vZGUueSArIHkgKyBNYXRoLm1pbigwLCBoKSwgTWF0aC5hYnModyksIE1hdGguYWJzKGgpXTsKfQpmdW5jdGlvbiBjaGVja0RpbWVuc2lvbnMobm9kZSwgc3BhY2UpIHsKICBpZiAobm9kZVtfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpW194ZmFfb2JqZWN0LiRleHRyYV0uZmlyc3RVbnNwbGl0dGFibGUgPT09IG51bGwpIHsKICAgIHJldHVybiB0cnVlOwogIH0KICBpZiAobm9kZS53ID09PSAwIHx8IG5vZGUuaCA9PT0gMCkgewogICAgcmV0dXJuIHRydWU7CiAgfQogIGNvbnN0IEVSUk9SID0gMjsKICBjb25zdCBwYXJlbnQgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpOwogIGNvbnN0IGF0dGVtcHQgPSBwYXJlbnRbX3hmYV9vYmplY3QuJGV4dHJhXT8uYXR0ZW1wdCB8fCAwOwogIGNvbnN0IFssIHksIHcsIGhdID0gZ2V0VHJhbnNmb3JtZWRCQm94KG5vZGUpOwogIHN3aXRjaCAocGFyZW50LmxheW91dCkgewogICAgY2FzZSAibHItdGIiOgogICAgY2FzZSAicmwtdGIiOgogICAgICBpZiAoYXR0ZW1wdCA9PT0gMCkgewogICAgICAgIGlmICghbm9kZVtfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpW194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgICBpZiAobm9kZS5oICE9PSAiIiAmJiBNYXRoLnJvdW5kKGggLSBzcGFjZS5oZWlnaHQpID4gRVJST1IpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudyAhPT0gIiIpIHsKICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJlbnRbX3hmYV9vYmplY3QuJGV4dHJhXS5udW1iZXJJbkxpbmUgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gc3BhY2UuaGVpZ2h0ID4gRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHNwYWNlLndpZHRoID4gRVJST1I7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLncgIT09ICIiKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh3IC0gc3BhY2Uud2lkdGgpIDw9IEVSUk9SOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3BhY2Uud2lkdGggPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAobm9kZVtfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpW194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIgJiYgTWF0aC5yb3VuZChoIC0gc3BhY2UuaGVpZ2h0KSA+IEVSUk9SKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChub2RlLncgPT09ICIiIHx8IE1hdGgucm91bmQodyAtIHNwYWNlLndpZHRoKSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgICAgfQogICAgICBpZiAocGFyZW50W194ZmFfb2JqZWN0LiRpc1RoZXJlTW9yZVdpZHRoXSgpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBzcGFjZS5oZWlnaHQgPiBFUlJPUjsKICAgIGNhc2UgInRhYmxlIjoKICAgIGNhc2UgInRiIjoKICAgICAgaWYgKG5vZGVbX3hmYV9vYmplY3QuJGdldFRlbXBsYXRlUm9vdF0oKVtfeGZhX29iamVjdC4kZXh0cmFdLm5vTGF5b3V0RmFpbHVyZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChub2RlLmggIT09ICIiICYmICFub2RlW194ZmFfb2JqZWN0LiRpc1NwbGl0dGFibGVdKCkpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoIC0gc3BhY2UuaGVpZ2h0KSA8PSBFUlJPUjsKICAgICAgfQogICAgICBpZiAobm9kZS53ID09PSAiIiB8fCBNYXRoLnJvdW5kKHcgLSBzcGFjZS53aWR0aCkgPD0gRVJST1IpIHsKICAgICAgICByZXR1cm4gc3BhY2UuaGVpZ2h0ID4gRVJST1I7CiAgICAgIH0KICAgICAgaWYgKHBhcmVudFtfeGZhX29iamVjdC4kaXNUaGVyZU1vcmVXaWR0aF0oKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gc3BhY2UuaGVpZ2h0ID4gRVJST1I7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIGlmIChub2RlW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKClbX3hmYV9vYmplY3QuJGV4dHJhXS5ub0xheW91dEZhaWx1cmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAobm9kZS5oID09PSAiIiB8fCBNYXRoLnJvdW5kKGggKyB5IC0gc3BhY2UuaGVpZ2h0KSA8PSBFUlJPUikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGNvbnN0IGFyZWEgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKClbX3hmYV9vYmplY3QuJGV4dHJhXS5jdXJyZW50Q29udGVudEFyZWE7CiAgICAgIHJldHVybiBoICsgeSA+IGFyZWEuaDsKICAgIGNhc2UgInJsLXJvdyI6CiAgICBjYXNlICJyb3ciOgogICAgICBpZiAobm9kZVtfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpW194ZmFfb2JqZWN0LiRleHRyYV0ubm9MYXlvdXRGYWlsdXJlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKG5vZGUuaCAhPT0gIiIpIHsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChoIC0gc3BhY2UuaGVpZ2h0KSA8PSBFUlJPUjsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiB0cnVlOwogIH0KfQoKLyoqKi8gfSksCi8qIDg1ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuY29tcHV0ZUJib3ggPSBjb21wdXRlQmJveDsKZXhwb3J0cy5jcmVhdGVXcmFwcGVyID0gY3JlYXRlV3JhcHBlcjsKZXhwb3J0cy5maXhEaW1lbnNpb25zID0gZml4RGltZW5zaW9uczsKZXhwb3J0cy5maXhUZXh0SW5kZW50ID0gZml4VGV4dEluZGVudDsKZXhwb3J0cy5maXhVUkwgPSBmaXhVUkw7CmV4cG9ydHMuaXNQcmludE9ubHkgPSBpc1ByaW50T25seTsKZXhwb3J0cy5sYXlvdXRDbGFzcyA9IGxheW91dENsYXNzOwpleHBvcnRzLmxheW91dE5vZGUgPSBsYXlvdXROb2RlOwpleHBvcnRzLm1lYXN1cmVUb1N0cmluZyA9IG1lYXN1cmVUb1N0cmluZzsKZXhwb3J0cy5zZXRBY2Nlc3MgPSBzZXRBY2Nlc3M7CmV4cG9ydHMuc2V0Rm9udEZhbWlseSA9IHNldEZvbnRGYW1pbHk7CmV4cG9ydHMuc2V0TWluTWF4RGltZW5zaW9ucyA9IHNldE1pbk1heERpbWVuc2lvbnM7CmV4cG9ydHMuc2V0UGFyYSA9IHNldFBhcmE7CmV4cG9ydHMudG9TdHlsZSA9IHRvU3R5bGU7CnZhciBfeGZhX29iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwp2YXIgX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OSk7CnZhciBfZm9udHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTsKdmFyIF90ZXh0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg4Nyk7CmZ1bmN0aW9uIG1lYXN1cmVUb1N0cmluZyhtKSB7CiAgaWYgKHR5cGVvZiBtID09PSAic3RyaW5nIikgewogICAgcmV0dXJuICIwcHgiOwogIH0KICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtKSA/IGAke219cHhgIDogYCR7bS50b0ZpeGVkKDIpfXB4YDsKfQpjb25zdCBjb252ZXJ0ZXJzID0gewogIGFuY2hvclR5cGUobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbX3hmYV9vYmplY3QuJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEoInRyYW5zZm9ybSIgaW4gc3R5bGUpKSB7CiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9ICIiOwogICAgfQogICAgc3dpdGNoIChub2RlLmFuY2hvclR5cGUpIHsKICAgICAgY2FzZSAiYm90dG9tQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLCAtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJib3R0b21MZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC0xMDAlKSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImJvdHRvbVJpZ2h0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtMTAwJSwtMTAwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVDZW50ZXIiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC01MCUsLTUwJSkiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaWRkbGVMZWZ0IjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgwLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibWlkZGxlUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLC01MCUpIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wQ2VudGVyIjoKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gInRyYW5zbGF0ZSgtNTAlLDApIjsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAidG9wUmlnaHQiOgogICAgICAgIHN0eWxlLnRyYW5zZm9ybSArPSAidHJhbnNsYXRlKC0xMDAlLDApIjsKICAgICAgICBicmVhazsKICAgIH0KICB9LAogIGRpbWVuc2lvbnMobm9kZSwgc3R5bGUpIHsKICAgIGNvbnN0IHBhcmVudCA9IG5vZGVbX3hmYV9vYmplY3QuJGdldFN1YmZvcm1QYXJlbnRdKCk7CiAgICBsZXQgd2lkdGggPSBub2RlLnc7CiAgICBjb25zdCBoZWlnaHQgPSBub2RlLmg7CiAgICBpZiAocGFyZW50LmxheW91dD8uaW5jbHVkZXMoInJvdyIpKSB7CiAgICAgIGNvbnN0IGV4dHJhID0gcGFyZW50W194ZmFfb2JqZWN0LiRleHRyYV07CiAgICAgIGNvbnN0IGNvbFNwYW4gPSBub2RlLmNvbFNwYW47CiAgICAgIGxldCB3OwogICAgICBpZiAoY29sU3BhbiA9PT0gLTEpIHsKICAgICAgICB3ID0gZXh0cmEuY29sdW1uV2lkdGhzLnNsaWNlKGV4dHJhLmN1cnJlbnRDb2x1bW4pLnJlZHVjZSgoYSwgeCkgPT4gYSArIHgsIDApOwogICAgICAgIGV4dHJhLmN1cnJlbnRDb2x1bW4gPSAwOwogICAgICB9IGVsc2UgewogICAgICAgIHcgPSBleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbiwgZXh0cmEuY3VycmVudENvbHVtbiArIGNvbFNwYW4pLnJlZHVjZSgoYSwgeCkgPT4gYSArIHgsIDApOwogICAgICAgIGV4dHJhLmN1cnJlbnRDb2x1bW4gPSAoZXh0cmEuY3VycmVudENvbHVtbiArIG5vZGUuY29sU3BhbikgJSBleHRyYS5jb2x1bW5XaWR0aHMubGVuZ3RoOwogICAgICB9CiAgICAgIGlmICghaXNOYU4odykpIHsKICAgICAgICB3aWR0aCA9IG5vZGUudyA9IHc7CiAgICAgIH0KICAgIH0KICAgIGlmICh3aWR0aCAhPT0gIiIpIHsKICAgICAgc3R5bGUud2lkdGggPSBtZWFzdXJlVG9TdHJpbmcod2lkdGgpOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGUud2lkdGggPSAiYXV0byI7CiAgICB9CiAgICBpZiAoaGVpZ2h0ICE9PSAiIikgewogICAgICBzdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgIH0KICB9LAogIHBvc2l0aW9uKG5vZGUsIHN0eWxlKSB7CiAgICBjb25zdCBwYXJlbnQgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpOwogICAgaWYgKHBhcmVudD8ubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgc3R5bGUubGVmdCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLngpOwogICAgc3R5bGUudG9wID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUueSk7CiAgfSwKICByb3RhdGUobm9kZSwgc3R5bGUpIHsKICAgIGlmIChub2RlLnJvdGF0ZSkgewogICAgICBpZiAoISgidHJhbnNmb3JtIiBpbiBzdHlsZSkpIHsKICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSAiIjsKICAgICAgfQogICAgICBzdHlsZS50cmFuc2Zvcm0gKz0gYHJvdGF0ZSgtJHtub2RlLnJvdGF0ZX1kZWcpYDsKICAgICAgc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gInRvcCBsZWZ0IjsKICAgIH0KICB9LAogIHByZXNlbmNlKG5vZGUsIHN0eWxlKSB7CiAgICBzd2l0Y2ggKG5vZGUucHJlc2VuY2UpIHsKICAgICAgY2FzZSAiaW52aXNpYmxlIjoKICAgICAgICBzdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhpZGRlbiI6CiAgICAgIGNhc2UgImluYWN0aXZlIjoKICAgICAgICBzdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgIGJyZWFrOwogICAgfQogIH0sCiAgaEFsaWduKG5vZGUsIHN0eWxlKSB7CiAgICBpZiAobm9kZVtfeGZhX29iamVjdC4kbm9kZU5hbWVdID09PSAicGFyYSIpIHsKICAgICAgc3dpdGNoIChub2RlLmhBbGlnbikgewogICAgICAgIGNhc2UgImp1c3RpZnlBbGwiOgogICAgICAgICAgc3R5bGUudGV4dEFsaWduID0gImp1c3RpZnktYWxsIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInJhZGl4IjoKICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBzdHlsZS50ZXh0QWxpZ24gPSBub2RlLmhBbGlnbjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc3dpdGNoIChub2RlLmhBbGlnbikgewogICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgc3R5bGUuYWxpZ25TZWxmID0gInN0YXJ0IjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImNlbnRlciI6CiAgICAgICAgICBzdHlsZS5hbGlnblNlbGYgPSAiY2VudGVyIjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICAgIHN0eWxlLmFsaWduU2VsZiA9ICJlbmQiOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9LAogIG1hcmdpbihub2RlLCBzdHlsZSkgewogICAgaWYgKG5vZGUubWFyZ2luKSB7CiAgICAgIHN0eWxlLm1hcmdpbiA9IG5vZGUubWFyZ2luW194ZmFfb2JqZWN0LiR0b1N0eWxlXSgpLm1hcmdpbjsKICAgIH0KICB9Cn07CmZ1bmN0aW9uIHNldE1pbk1heERpbWVuc2lvbnMobm9kZSwgc3R5bGUpIHsKICBjb25zdCBwYXJlbnQgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpOwogIGlmIChwYXJlbnQubGF5b3V0ID09PSAicG9zaXRpb24iKSB7CiAgICBpZiAobm9kZS5taW5XID4gMCkgewogICAgICBzdHlsZS5taW5XaWR0aCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLm1pblcpOwogICAgfQogICAgaWYgKG5vZGUubWF4VyA+IDApIHsKICAgICAgc3R5bGUubWF4V2lkdGggPSBtZWFzdXJlVG9TdHJpbmcobm9kZS5tYXhXKTsKICAgIH0KICAgIGlmIChub2RlLm1pbkggPiAwKSB7CiAgICAgIHN0eWxlLm1pbkhlaWdodCA9IG1lYXN1cmVUb1N0cmluZyhub2RlLm1pbkgpOwogICAgfQogICAgaWYgKG5vZGUubWF4SCA+IDApIHsKICAgICAgc3R5bGUubWF4SGVpZ2h0ID0gbWVhc3VyZVRvU3RyaW5nKG5vZGUubWF4SCk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGxheW91dFRleHQodGV4dCwgeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0LCBmb250RmluZGVyLCB3aWR0aCkgewogIGNvbnN0IG1lYXN1cmUgPSBuZXcgX3RleHQuVGV4dE1lYXN1cmUoeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0LCBmb250RmluZGVyKTsKICBpZiAodHlwZW9mIHRleHQgPT09ICJzdHJpbmciKSB7CiAgICBtZWFzdXJlLmFkZFN0cmluZyh0ZXh0KTsKICB9IGVsc2UgewogICAgdGV4dFtfeGZhX29iamVjdC4kcHVzaEdseXBoc10obWVhc3VyZSk7CiAgfQogIHJldHVybiBtZWFzdXJlLmNvbXB1dGUod2lkdGgpOwp9CmZ1bmN0aW9uIGxheW91dE5vZGUobm9kZSwgYXZhaWxhYmxlU3BhY2UpIHsKICBsZXQgaGVpZ2h0ID0gbnVsbDsKICBsZXQgd2lkdGggPSBudWxsOwogIGxldCBpc0Jyb2tlbiA9IGZhbHNlOwogIGlmICgoIW5vZGUudyB8fCAhbm9kZS5oKSAmJiBub2RlLnZhbHVlKSB7CiAgICBsZXQgbWFyZ2luSCA9IDA7CiAgICBsZXQgbWFyZ2luViA9IDA7CiAgICBpZiAobm9kZS5tYXJnaW4pIHsKICAgICAgbWFyZ2luSCA9IG5vZGUubWFyZ2luLmxlZnRJbnNldCArIG5vZGUubWFyZ2luLnJpZ2h0SW5zZXQ7CiAgICAgIG1hcmdpblYgPSBub2RlLm1hcmdpbi50b3BJbnNldCArIG5vZGUubWFyZ2luLmJvdHRvbUluc2V0OwogICAgfQogICAgbGV0IGxpbmVIZWlnaHQgPSBudWxsOwogICAgbGV0IG1hcmdpbiA9IG51bGw7CiAgICBpZiAobm9kZS5wYXJhKSB7CiAgICAgIG1hcmdpbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIGxpbmVIZWlnaHQgPSBub2RlLnBhcmEubGluZUhlaWdodCA9PT0gIiIgPyBudWxsIDogbm9kZS5wYXJhLmxpbmVIZWlnaHQ7CiAgICAgIG1hcmdpbi50b3AgPSBub2RlLnBhcmEuc3BhY2VBYm92ZSA9PT0gIiIgPyAwIDogbm9kZS5wYXJhLnNwYWNlQWJvdmU7CiAgICAgIG1hcmdpbi5ib3R0b20gPSBub2RlLnBhcmEuc3BhY2VCZWxvdyA9PT0gIiIgPyAwIDogbm9kZS5wYXJhLnNwYWNlQmVsb3c7CiAgICAgIG1hcmdpbi5sZWZ0ID0gbm9kZS5wYXJhLm1hcmdpbkxlZnQgPT09ICIiID8gMCA6IG5vZGUucGFyYS5tYXJnaW5MZWZ0OwogICAgICBtYXJnaW4ucmlnaHQgPSBub2RlLnBhcmEubWFyZ2luUmlnaHQgPT09ICIiID8gMCA6IG5vZGUucGFyYS5tYXJnaW5SaWdodDsKICAgIH0KICAgIGxldCBmb250ID0gbm9kZS5mb250OwogICAgaWYgKCFmb250KSB7CiAgICAgIGNvbnN0IHJvb3QgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRUZW1wbGF0ZVJvb3RdKCk7CiAgICAgIGxldCBwYXJlbnQgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSByb290KSB7CiAgICAgICAgaWYgKHBhcmVudC5mb250KSB7CiAgICAgICAgICBmb250ID0gcGFyZW50LmZvbnQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcGFyZW50ID0gcGFyZW50W194ZmFfb2JqZWN0LiRnZXRQYXJlbnRdKCk7CiAgICAgIH0KICAgIH0KICAgIGNvbnN0IG1heFdpZHRoID0gKG5vZGUudyB8fCBhdmFpbGFibGVTcGFjZS53aWR0aCkgLSBtYXJnaW5IOwogICAgY29uc3QgZm9udEZpbmRlciA9IG5vZGVbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdLmZvbnRGaW5kZXI7CiAgICBpZiAobm9kZS52YWx1ZS5leERhdGEgJiYgbm9kZS52YWx1ZS5leERhdGFbX3hmYV9vYmplY3QuJGNvbnRlbnRdICYmIG5vZGUudmFsdWUuZXhEYXRhLmNvbnRlbnRUeXBlID09PSAidGV4dC9odG1sIikgewogICAgICBjb25zdCByZXMgPSBsYXlvdXRUZXh0KG5vZGUudmFsdWUuZXhEYXRhW194ZmFfb2JqZWN0LiRjb250ZW50XSwgZm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0LCBmb250RmluZGVyLCBtYXhXaWR0aCk7CiAgICAgIHdpZHRoID0gcmVzLndpZHRoOwogICAgICBoZWlnaHQgPSByZXMuaGVpZ2h0OwogICAgICBpc0Jyb2tlbiA9IHJlcy5pc0Jyb2tlbjsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHRleHQgPSBub2RlLnZhbHVlW194ZmFfb2JqZWN0LiR0ZXh0XSgpOwogICAgICBpZiAodGV4dCkgewogICAgICAgIGNvbnN0IHJlcyA9IGxheW91dFRleHQodGV4dCwgZm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0LCBmb250RmluZGVyLCBtYXhXaWR0aCk7CiAgICAgICAgd2lkdGggPSByZXMud2lkdGg7CiAgICAgICAgaGVpZ2h0ID0gcmVzLmhlaWdodDsKICAgICAgICBpc0Jyb2tlbiA9IHJlcy5pc0Jyb2tlbjsKICAgICAgfQogICAgfQogICAgaWYgKHdpZHRoICE9PSBudWxsICYmICFub2RlLncpIHsKICAgICAgd2lkdGggKz0gbWFyZ2luSDsKICAgIH0KICAgIGlmIChoZWlnaHQgIT09IG51bGwgJiYgIW5vZGUuaCkgewogICAgICBoZWlnaHQgKz0gbWFyZ2luVjsKICAgIH0KICB9CiAgcmV0dXJuIHsKICAgIHc6IHdpZHRoLAogICAgaDogaGVpZ2h0LAogICAgaXNCcm9rZW4KICB9Owp9CmZ1bmN0aW9uIGNvbXB1dGVCYm94KG5vZGUsIGh0bWwsIGF2YWlsYWJsZVNwYWNlKSB7CiAgbGV0IGJib3g7CiAgaWYgKG5vZGUudyAhPT0gIiIgJiYgbm9kZS5oICE9PSAiIikgewogICAgYmJveCA9IFtub2RlLngsIG5vZGUueSwgbm9kZS53LCBub2RlLmhdOwogIH0gZWxzZSB7CiAgICBpZiAoIWF2YWlsYWJsZVNwYWNlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgbGV0IHdpZHRoID0gbm9kZS53OwogICAgaWYgKHdpZHRoID09PSAiIikgewogICAgICBpZiAobm9kZS5tYXhXID09PSAwKSB7CiAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZVtfeGZhX29iamVjdC4kZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgICAgICBpZiAocGFyZW50LmxheW91dCA9PT0gInBvc2l0aW9uIiAmJiBwYXJlbnQudyAhPT0gIiIpIHsKICAgICAgICAgIHdpZHRoID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2lkdGggPSBub2RlLm1pblc7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHdpZHRoID0gTWF0aC5taW4obm9kZS5tYXhXLCBhdmFpbGFibGVTcGFjZS53aWR0aCk7CiAgICAgIH0KICAgICAgaHRtbC5hdHRyaWJ1dGVzLnN0eWxlLndpZHRoID0gbWVhc3VyZVRvU3RyaW5nKHdpZHRoKTsKICAgIH0KICAgIGxldCBoZWlnaHQgPSBub2RlLmg7CiAgICBpZiAoaGVpZ2h0ID09PSAiIikgewogICAgICBpZiAobm9kZS5tYXhIID09PSAwKSB7CiAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZVtfeGZhX29iamVjdC4kZ2V0U3ViZm9ybVBhcmVudF0oKTsKICAgICAgICBpZiAocGFyZW50LmxheW91dCA9PT0gInBvc2l0aW9uIiAmJiBwYXJlbnQuaCAhPT0gIiIpIHsKICAgICAgICAgIGhlaWdodCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlaWdodCA9IG5vZGUubWluSDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaGVpZ2h0ID0gTWF0aC5taW4obm9kZS5tYXhILCBhdmFpbGFibGVTcGFjZS5oZWlnaHQpOwogICAgICB9CiAgICAgIGh0bWwuYXR0cmlidXRlcy5zdHlsZS5oZWlnaHQgPSBtZWFzdXJlVG9TdHJpbmcoaGVpZ2h0KTsKICAgIH0KICAgIGJib3ggPSBbbm9kZS54LCBub2RlLnksIHdpZHRoLCBoZWlnaHRdOwogIH0KICByZXR1cm4gYmJveDsKfQpmdW5jdGlvbiBmaXhEaW1lbnNpb25zKG5vZGUpIHsKICBjb25zdCBwYXJlbnQgPSBub2RlW194ZmFfb2JqZWN0LiRnZXRTdWJmb3JtUGFyZW50XSgpOwogIGlmIChwYXJlbnQubGF5b3V0Py5pbmNsdWRlcygicm93IikpIHsKICAgIGNvbnN0IGV4dHJhID0gcGFyZW50W194ZmFfb2JqZWN0LiRleHRyYV07CiAgICBjb25zdCBjb2xTcGFuID0gbm9kZS5jb2xTcGFuOwogICAgbGV0IHdpZHRoOwogICAgaWYgKGNvbFNwYW4gPT09IC0xKSB7CiAgICAgIHdpZHRoID0gZXh0cmEuY29sdW1uV2lkdGhzLnNsaWNlKGV4dHJhLmN1cnJlbnRDb2x1bW4pLnJlZHVjZSgoYSwgdykgPT4gYSArIHcsIDApOwogICAgfSBlbHNlIHsKICAgICAgd2lkdGggPSBleHRyYS5jb2x1bW5XaWR0aHMuc2xpY2UoZXh0cmEuY3VycmVudENvbHVtbiwgZXh0cmEuY3VycmVudENvbHVtbiArIGNvbFNwYW4pLnJlZHVjZSgoYSwgdykgPT4gYSArIHcsIDApOwogICAgfQogICAgaWYgKCFpc05hTih3aWR0aCkpIHsKICAgICAgbm9kZS53ID0gd2lkdGg7CiAgICB9CiAgfQogIGlmIChwYXJlbnQubGF5b3V0ICYmIHBhcmVudC5sYXlvdXQgIT09ICJwb3NpdGlvbiIpIHsKICAgIG5vZGUueCA9IG5vZGUueSA9IDA7CiAgfQogIGlmIChub2RlLmxheW91dCA9PT0gInRhYmxlIikgewogICAgaWYgKG5vZGUudyA9PT0gIiIgJiYgQXJyYXkuaXNBcnJheShub2RlLmNvbHVtbldpZHRocykpIHsKICAgICAgbm9kZS53ID0gbm9kZS5jb2x1bW5XaWR0aHMucmVkdWNlKChhLCB4KSA9PiBhICsgeCwgMCk7CiAgICB9CiAgfQp9CmZ1bmN0aW9uIGxheW91dENsYXNzKG5vZGUpIHsKICBzd2l0Y2ggKG5vZGUubGF5b3V0KSB7CiAgICBjYXNlICJwb3NpdGlvbiI6CiAgICAgIHJldHVybiAieGZhUG9zaXRpb24iOwogICAgY2FzZSAibHItdGIiOgogICAgICByZXR1cm4gInhmYUxyVGIiOwogICAgY2FzZSAicmwtcm93IjoKICAgICAgcmV0dXJuICJ4ZmFSbFJvdyI7CiAgICBjYXNlICJybC10YiI6CiAgICAgIHJldHVybiAieGZhUmxUYiI7CiAgICBjYXNlICJyb3ciOgogICAgICByZXR1cm4gInhmYVJvdyI7CiAgICBjYXNlICJ0YWJsZSI6CiAgICAgIHJldHVybiAieGZhVGFibGUiOwogICAgY2FzZSAidGIiOgogICAgICByZXR1cm4gInhmYVRiIjsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAieGZhUG9zaXRpb24iOwogIH0KfQpmdW5jdGlvbiB0b1N0eWxlKG5vZGUsIC4uLm5hbWVzKSB7CiAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykgewogICAgY29uc3QgdmFsdWUgPSBub2RlW25hbWVdOwogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGNvbnZlcnRlcnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgY29udmVydGVyc1tuYW1lXShub2RlLCBzdHlsZSk7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX3hmYV9vYmplY3QuWEZBT2JqZWN0KSB7CiAgICAgIGNvbnN0IG5ld1N0eWxlID0gdmFsdWVbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCk7CiAgICAgIGlmIChuZXdTdHlsZSkgewogICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGUsIG5ld1N0eWxlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAoMCwgX3V0aWwud2FybikoYChERUJVRykgLSBYRkEgLSBzdHlsZSBmb3IgJHtuYW1lfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHN0eWxlOwp9CmZ1bmN0aW9uIGNyZWF0ZVdyYXBwZXIobm9kZSwgaHRtbCkgewogIGNvbnN0IHsKICAgIGF0dHJpYnV0ZXMKICB9ID0gaHRtbDsKICBjb25zdCB7CiAgICBzdHlsZQogIH0gPSBhdHRyaWJ1dGVzOwogIGNvbnN0IHdyYXBwZXIgPSB7CiAgICBuYW1lOiAiZGl2IiwKICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgY2xhc3M6IFsieGZhV3JhcHBlciJdLAogICAgICBzdHlsZTogT2JqZWN0LmNyZWF0ZShudWxsKQogICAgfSwKICAgIGNoaWxkcmVuOiBbXQogIH07CiAgYXR0cmlidXRlcy5jbGFzcy5wdXNoKCJ4ZmFXcmFwcGVkIik7CiAgaWYgKG5vZGUuYm9yZGVyKSB7CiAgICBjb25zdCB7CiAgICAgIHdpZHRocywKICAgICAgaW5zZXRzCiAgICB9ID0gbm9kZS5ib3JkZXJbX3hmYV9vYmplY3QuJGV4dHJhXTsKICAgIGxldCB3aWR0aCwgaGVpZ2h0OwogICAgbGV0IHRvcCA9IGluc2V0c1swXTsKICAgIGxldCBsZWZ0ID0gaW5zZXRzWzNdOwogICAgY29uc3QgaW5zZXRzSCA9IGluc2V0c1swXSArIGluc2V0c1syXTsKICAgIGNvbnN0IGluc2V0c1cgPSBpbnNldHNbMV0gKyBpbnNldHNbM107CiAgICBzd2l0Y2ggKG5vZGUuYm9yZGVyLmhhbmQpIHsKICAgICAgY2FzZSAiZXZlbiI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXSAvIDI7CiAgICAgICAgbGVmdCAtPSB3aWR0aHNbM10gLyAyOwogICAgICAgIHdpZHRoID0gYGNhbGMoMTAwJSArICR7KHdpZHRoc1sxXSArIHdpZHRoc1szXSkgLyAyIC0gaW5zZXRzV31weClgOwogICAgICAgIGhlaWdodCA9IGBjYWxjKDEwMCUgKyAkeyh3aWR0aHNbMF0gKyB3aWR0aHNbMl0pIC8gMiAtIGluc2V0c0h9cHgpYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgdG9wIC09IHdpZHRoc1swXTsKICAgICAgICBsZWZ0IC09IHdpZHRoc1szXTsKICAgICAgICB3aWR0aCA9IGBjYWxjKDEwMCUgKyAke3dpZHRoc1sxXSArIHdpZHRoc1szXSAtIGluc2V0c1d9cHgpYDsKICAgICAgICBoZWlnaHQgPSBgY2FsYygxMDAlICsgJHt3aWR0aHNbMF0gKyB3aWR0aHNbMl0gLSBpbnNldHNIfXB4KWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICB3aWR0aCA9IGluc2V0c1cgPyBgY2FsYygxMDAlIC0gJHtpbnNldHNXfXB4KWAgOiAiMTAwJSI7CiAgICAgICAgaGVpZ2h0ID0gaW5zZXRzSCA/IGBjYWxjKDEwMCUgLSAke2luc2V0c0h9cHgpYCA6ICIxMDAlIjsKICAgICAgICBicmVhazsKICAgIH0KICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbInhmYUJvcmRlciJdOwogICAgaWYgKGlzUHJpbnRPbmx5KG5vZGUuYm9yZGVyKSkgewogICAgICBjbGFzc05hbWVzLnB1c2goInhmYVByaW50T25seSIpOwogICAgfQogICAgY29uc3QgYm9yZGVyID0gewogICAgICBuYW1lOiAiZGl2IiwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGNsYXNzOiBjbGFzc05hbWVzLAogICAgICAgIHN0eWxlOiB7CiAgICAgICAgICB0b3A6IGAke3RvcH1weGAsCiAgICAgICAgICBsZWZ0OiBgJHtsZWZ0fXB4YCwKICAgICAgICAgIHdpZHRoLAogICAgICAgICAgaGVpZ2h0CiAgICAgICAgfQogICAgICB9LAogICAgICBjaGlsZHJlbjogW10KICAgIH07CiAgICBmb3IgKGNvbnN0IGtleSBvZiBbImJvcmRlciIsICJib3JkZXJXaWR0aCIsICJib3JkZXJDb2xvciIsICJib3JkZXJSYWRpdXMiLCAiYm9yZGVyU3R5bGUiXSkgewogICAgICBpZiAoc3R5bGVba2V5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYm9yZGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgICAgZGVsZXRlIHN0eWxlW2tleV07CiAgICAgIH0KICAgIH0KICAgIHdyYXBwZXIuY2hpbGRyZW4ucHVzaChib3JkZXIsIGh0bWwpOwogIH0gZWxzZSB7CiAgICB3cmFwcGVyLmNoaWxkcmVuLnB1c2goaHRtbCk7CiAgfQogIGZvciAoY29uc3Qga2V5IG9mIFsiYmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kQ2xpcCIsICJ0b3AiLCAibGVmdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAibWluV2lkdGgiLCAibWluSGVpZ2h0IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ0cmFuc2Zvcm0iLCAidHJhbnNmb3JtT3JpZ2luIiwgInZpc2liaWxpdHkiXSkgewogICAgaWYgKHN0eWxlW2tleV0gIT09IHVuZGVmaW5lZCkgewogICAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGVba2V5XSA9IHN0eWxlW2tleV07CiAgICAgIGRlbGV0ZSBzdHlsZVtrZXldOwogICAgfQogIH0KICBpZiAoc3R5bGUucG9zaXRpb24gPT09ICJhYnNvbHV0ZSIpIHsKICAgIHdyYXBwZXIuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgfSBlbHNlIHsKICAgIHdyYXBwZXIuYXR0cmlidXRlcy5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CiAgfQogIGRlbGV0ZSBzdHlsZS5wb3NpdGlvbjsKICBpZiAoc3R5bGUuYWxpZ25TZWxmKSB7CiAgICB3cmFwcGVyLmF0dHJpYnV0ZXMuc3R5bGUuYWxpZ25TZWxmID0gc3R5bGUuYWxpZ25TZWxmOwogICAgZGVsZXRlIHN0eWxlLmFsaWduU2VsZjsKICB9CiAgcmV0dXJuIHdyYXBwZXI7Cn0KZnVuY3Rpb24gZml4VGV4dEluZGVudChzdHlsZXMpIHsKICBjb25zdCBpbmRlbnQgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShzdHlsZXMudGV4dEluZGVudCwgIjBweCIpOwogIGlmIChpbmRlbnQgPj0gMCkgewogICAgcmV0dXJuOwogIH0KICBjb25zdCBhbGlnbiA9IHN0eWxlcy50ZXh0QWxpZ24gPT09ICJyaWdodCIgPyAicmlnaHQiIDogImxlZnQiOwogIGNvbnN0IG5hbWUgPSAicGFkZGluZyIgKyAoYWxpZ24gPT09ICJsZWZ0IiA/ICJMZWZ0IiA6ICJSaWdodCIpOwogIGNvbnN0IHBhZGRpbmcgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KShzdHlsZXNbbmFtZV0sICIwcHgiKTsKICBzdHlsZXNbbmFtZV0gPSBgJHtwYWRkaW5nIC0gaW5kZW50fXB4YDsKfQpmdW5jdGlvbiBzZXRBY2Nlc3Mobm9kZSwgY2xhc3NOYW1lcykgewogIHN3aXRjaCAobm9kZS5hY2Nlc3MpIHsKICAgIGNhc2UgIm5vbkludGVyYWN0aXZlIjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFOb25JbnRlcmFjdGl2ZSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInJlYWRPbmx5IjoKICAgICAgY2xhc3NOYW1lcy5wdXNoKCJ4ZmFSZWFkT25seSIpOwogICAgICBicmVhazsKICAgIGNhc2UgInByb3RlY3RlZCI6CiAgICAgIGNsYXNzTmFtZXMucHVzaCgieGZhRGlzYWJsZWQiKTsKICAgICAgYnJlYWs7CiAgfQp9CmZ1bmN0aW9uIGlzUHJpbnRPbmx5KG5vZGUpIHsKICByZXR1cm4gbm9kZS5yZWxldmFudC5sZW5ndGggPiAwICYmICFub2RlLnJlbGV2YW50WzBdLmV4Y2x1ZGVkICYmIG5vZGUucmVsZXZhbnRbMF0udmlld25hbWUgPT09ICJwcmludCI7Cn0KZnVuY3Rpb24gZ2V0Q3VycmVudFBhcmEobm9kZSkgewogIGNvbnN0IHN0YWNrID0gbm9kZVtfeGZhX29iamVjdC4kZ2V0VGVtcGxhdGVSb290XSgpW194ZmFfb2JqZWN0LiRleHRyYV0ucGFyYVN0YWNrOwogIHJldHVybiBzdGFjay5sZW5ndGggPyBzdGFjay5hdCgtMSkgOiBudWxsOwp9CmZ1bmN0aW9uIHNldFBhcmEobm9kZSwgbm9kZVN0eWxlLCB2YWx1ZSkgewogIGlmICh2YWx1ZS5hdHRyaWJ1dGVzLmNsYXNzPy5pbmNsdWRlcygieGZhUmljaCIpKSB7CiAgICBpZiAobm9kZVN0eWxlKSB7CiAgICAgIGlmIChub2RlLmggPT09ICIiKSB7CiAgICAgICAgbm9kZVN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgICAgfQogICAgICBpZiAobm9kZS53ID09PSAiIikgewogICAgICAgIG5vZGVTdHlsZS53aWR0aCA9ICJhdXRvIjsKICAgICAgfQogICAgfQogICAgY29uc3QgcGFyYSA9IGdldEN1cnJlbnRQYXJhKG5vZGUpOwogICAgaWYgKHBhcmEpIHsKICAgICAgY29uc3QgdmFsdWVTdHlsZSA9IHZhbHVlLmF0dHJpYnV0ZXMuc3R5bGU7CiAgICAgIHZhbHVlU3R5bGUuZGlzcGxheSA9ICJmbGV4IjsKICAgICAgdmFsdWVTdHlsZS5mbGV4RGlyZWN0aW9uID0gImNvbHVtbiI7CiAgICAgIHN3aXRjaCAocGFyYS52QWxpZ24pIHsKICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJzdGFydCI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgdmFsdWVTdHlsZS5qdXN0aWZ5Q29udGVudCA9ICJlbmQiOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWlkZGxlIjoKICAgICAgICAgIHZhbHVlU3R5bGUuanVzdGlmeUNvbnRlbnQgPSAiY2VudGVyIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNvbnN0IHBhcmFTdHlsZSA9IHBhcmFbX3hmYV9vYmplY3QuJHRvU3R5bGVdKCk7CiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhwYXJhU3R5bGUpKSB7CiAgICAgICAgaWYgKCEoa2V5IGluIHZhbHVlU3R5bGUpKSB7CiAgICAgICAgICB2YWx1ZVN0eWxlW2tleV0gPSB2YWw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CmZ1bmN0aW9uIHNldEZvbnRGYW1pbHkoeGZhRm9udCwgbm9kZSwgZm9udEZpbmRlciwgc3R5bGUpIHsKICBpZiAoIWZvbnRGaW5kZXIpIHsKICAgIGRlbGV0ZSBzdHlsZS5mb250RmFtaWx5OwogICAgcmV0dXJuOwogIH0KICBjb25zdCBuYW1lID0gKDAsIF91dGlscy5zdHJpcFF1b3RlcykoeGZhRm9udC50eXBlZmFjZSk7CiAgc3R5bGUuZm9udEZhbWlseSA9IGAiJHtuYW1lfSJgOwogIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKG5hbWUpOwogIGlmICh0eXBlZmFjZSkgewogICAgY29uc3QgewogICAgICBmb250RmFtaWx5CiAgICB9ID0gdHlwZWZhY2UucmVndWxhci5jc3NGb250SW5mbzsKICAgIGlmIChmb250RmFtaWx5ICE9PSBuYW1lKSB7CiAgICAgIHN0eWxlLmZvbnRGYW1pbHkgPSBgIiR7Zm9udEZhbWlseX0iYDsKICAgIH0KICAgIGNvbnN0IHBhcmEgPSBnZXRDdXJyZW50UGFyYShub2RlKTsKICAgIGlmIChwYXJhICYmIHBhcmEubGluZUhlaWdodCAhPT0gIiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHN0eWxlLmxpbmVIZWlnaHQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgcGRmRm9udCA9ICgwLCBfZm9udHMuc2VsZWN0Rm9udCkoeGZhRm9udCwgdHlwZWZhY2UpOwogICAgaWYgKHBkZkZvbnQpIHsKICAgICAgc3R5bGUubGluZUhlaWdodCA9IE1hdGgubWF4KDEuMiwgcGRmRm9udC5saW5lSGVpZ2h0KTsKICAgIH0KICB9Cn0KZnVuY3Rpb24gZml4VVJMKHN0cikgewogIGNvbnN0IGFic29sdXRlVXJsID0gKDAsIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwpKHN0ciwgbnVsbCwgewogICAgYWRkRGVmYXVsdFByb3RvY29sOiB0cnVlLAogICAgdHJ5Q29udmVydEVuY29kaW5nOiB0cnVlCiAgfSk7CiAgcmV0dXJuIGFic29sdXRlVXJsID8gYWJzb2x1dGVVcmwuaHJlZiA6IG51bGw7Cn0KCi8qKiovIH0pLAovKiA4NiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkZvbnRGaW5kZXIgPSB2b2lkIDA7CmV4cG9ydHMuZ2V0TWV0cmljcyA9IGdldE1ldHJpY3M7CmV4cG9ydHMuc2VsZWN0Rm9udCA9IHNlbGVjdEZvbnQ7CnZhciBfeGZhX29iamVjdCA9IF9fd19wZGZqc19yZXF1aXJlX18oNzgpOwp2YXIgX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OSk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNsYXNzIEZvbnRGaW5kZXIgewogIGNvbnN0cnVjdG9yKHBkZkZvbnRzKSB7CiAgICB0aGlzLmZvbnRzID0gbmV3IE1hcCgpOwogICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMud2FybmVkID0gbmV3IFNldCgpOwogICAgdGhpcy5kZWZhdWx0Rm9udCA9IG51bGw7CiAgICB0aGlzLmFkZChwZGZGb250cyk7CiAgfQogIGFkZChwZGZGb250cywgcmVhbGx5TWlzc2luZ0ZvbnRzID0gbnVsbCkgewogICAgZm9yIChjb25zdCBwZGZGb250IG9mIHBkZkZvbnRzKSB7CiAgICAgIHRoaXMuYWRkUGRmRm9udChwZGZGb250KTsKICAgIH0KICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgIGlmICghcGRmRm9udC5yZWd1bGFyKSB7CiAgICAgICAgcGRmRm9udC5yZWd1bGFyID0gcGRmRm9udC5pdGFsaWMgfHwgcGRmRm9udC5ib2xkIHx8IHBkZkZvbnQuYm9sZGl0YWxpYzsKICAgICAgfQogICAgfQogICAgaWYgKCFyZWFsbHlNaXNzaW5nRm9udHMgfHwgcmVhbGx5TWlzc2luZ0ZvbnRzLnNpemUgPT09IDApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgbXlyaWFkID0gdGhpcy5mb250cy5nZXQoIlBkZkpTLUZhbGxiYWNrLVBkZkpTLVhGQSIpOwogICAgZm9yIChjb25zdCBtaXNzaW5nIG9mIHJlYWxseU1pc3NpbmdGb250cykgewogICAgICB0aGlzLmZvbnRzLnNldChtaXNzaW5nLCBteXJpYWQpOwogICAgfQogIH0KICBhZGRQZGZGb250KHBkZkZvbnQpIHsKICAgIGNvbnN0IGNzc0ZvbnRJbmZvID0gcGRmRm9udC5jc3NGb250SW5mbzsKICAgIGNvbnN0IG5hbWUgPSBjc3NGb250SW5mby5mb250RmFtaWx5OwogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmICghZm9udCkgewogICAgICBmb250ID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdGhpcy5mb250cy5zZXQobmFtZSwgZm9udCk7CiAgICAgIGlmICghdGhpcy5kZWZhdWx0Rm9udCkgewogICAgICAgIHRoaXMuZGVmYXVsdEZvbnQgPSBmb250OwogICAgICB9CiAgICB9CiAgICBsZXQgcHJvcGVydHkgPSAiIjsKICAgIGNvbnN0IGZvbnRXZWlnaHQgPSBwYXJzZUZsb2F0KGNzc0ZvbnRJbmZvLmZvbnRXZWlnaHQpOwogICAgaWYgKHBhcnNlRmxvYXQoY3NzRm9udEluZm8uaXRhbGljQW5nbGUpICE9PSAwKSB7CiAgICAgIHByb3BlcnR5ID0gZm9udFdlaWdodCA+PSA3MDAgPyAiYm9sZGl0YWxpYyIgOiAiaXRhbGljIjsKICAgIH0gZWxzZSBpZiAoZm9udFdlaWdodCA+PSA3MDApIHsKICAgICAgcHJvcGVydHkgPSAiYm9sZCI7CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkJvbGQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkJvbGQiKSkgewogICAgICAgIHByb3BlcnR5ID0gImJvbGQiOwogICAgICB9CiAgICAgIGlmIChwZGZGb250Lm5hbWUuaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQubmFtZS5lbmRzV2l0aCgiSXQiKSB8fCBwZGZGb250LnBzTmFtZT8uaW5jbHVkZXMoIkl0YWxpYyIpIHx8IHBkZkZvbnQucHNOYW1lPy5lbmRzV2l0aCgiSXQiKSkgewogICAgICAgIHByb3BlcnR5ICs9ICJpdGFsaWMiOwogICAgICB9CiAgICB9CiAgICBpZiAoIXByb3BlcnR5KSB7CiAgICAgIHByb3BlcnR5ID0gInJlZ3VsYXIiOwogICAgfQogICAgZm9udFtwcm9wZXJ0eV0gPSBwZGZGb250OwogIH0KICBnZXREZWZhdWx0KCkgewogICAgcmV0dXJuIHRoaXMuZGVmYXVsdEZvbnQ7CiAgfQogIGZpbmQoZm9udE5hbWUsIG11c3RXYXJuID0gdHJ1ZSkgewogICAgbGV0IGZvbnQgPSB0aGlzLmZvbnRzLmdldChmb250TmFtZSkgfHwgdGhpcy5jYWNoZS5nZXQoZm9udE5hbWUpOwogICAgaWYgKGZvbnQpIHsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBjb25zdCBwYXR0ZXJuID0gLyx8LXxffCB8Ym9sZGl0YWxpY3xib2xkfGl0YWxpY3xyZWd1bGFyfGl0L2dpOwogICAgbGV0IG5hbWUgPSBmb250TmFtZS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKTsKICAgIGZvbnQgPSB0aGlzLmZvbnRzLmdldChuYW1lKTsKICAgIGlmIChmb250KSB7CiAgICAgIHRoaXMuY2FjaGUuc2V0KGZvbnROYW1lLCBmb250KTsKICAgICAgcmV0dXJuIGZvbnQ7CiAgICB9CiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgY29uc3QgbWF5YmUgPSBbXTsKICAgIGZvciAoY29uc3QgW2ZhbWlseSwgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICBtYXliZS5wdXNoKHBkZkZvbnQpOwogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgWywgcGRmRm9udF0gb2YgdGhpcy5mb250cy5lbnRyaWVzKCkpIHsKICAgICAgICBpZiAocGRmRm9udC5yZWd1bGFyLm5hbWU/LnJlcGxhY2VBbGwocGF0dGVybiwgIiIpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChuYW1lKSkgewogICAgICAgICAgbWF5YmUucHVzaChwZGZGb250KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChtYXliZS5sZW5ndGggPT09IDApIHsKICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgvcHNtdHxtdC9naSwgIiIpOwogICAgICBmb3IgKGNvbnN0IFtmYW1pbHksIHBkZkZvbnRdIG9mIHRoaXMuZm9udHMuZW50cmllcygpKSB7CiAgICAgICAgaWYgKGZhbWlseS5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID09PSAwKSB7CiAgICAgIGZvciAoY29uc3QgcGRmRm9udCBvZiB0aGlzLmZvbnRzLnZhbHVlcygpKSB7CiAgICAgICAgaWYgKHBkZkZvbnQucmVndWxhci5uYW1lPy5yZXBsYWNlQWxsKHBhdHRlcm4sICIiKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobmFtZSkpIHsKICAgICAgICAgIG1heWJlLnB1c2gocGRmRm9udCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAobWF5YmUubGVuZ3RoID49IDEpIHsKICAgICAgaWYgKG1heWJlLmxlbmd0aCAhPT0gMSAmJiBtdXN0V2FybikgewogICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gVG9vIG1hbnkgY2hvaWNlcyB0byBndWVzcyB0aGUgY29ycmVjdCBmb250OiAke2ZvbnROYW1lfWApOwogICAgICB9CiAgICAgIHRoaXMuY2FjaGUuc2V0KGZvbnROYW1lLCBtYXliZVswXSk7CiAgICAgIHJldHVybiBtYXliZVswXTsKICAgIH0KICAgIGlmIChtdXN0V2FybiAmJiAhdGhpcy53YXJuZWQuaGFzKGZvbnROYW1lKSkgewogICAgICB0aGlzLndhcm5lZC5hZGQoZm9udE5hbWUpOwogICAgICAoMCwgX3V0aWwud2FybikoYFhGQSAtIENhbm5vdCBmaW5kIHRoZSBmb250OiAke2ZvbnROYW1lfWApOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQp9CmV4cG9ydHMuRm9udEZpbmRlciA9IEZvbnRGaW5kZXI7CmZ1bmN0aW9uIHNlbGVjdEZvbnQoeGZhRm9udCwgdHlwZWZhY2UpIHsKICBpZiAoeGZhRm9udC5wb3N0dXJlID09PSAiaXRhbGljIikgewogICAgaWYgKHhmYUZvbnQud2VpZ2h0ID09PSAiYm9sZCIpIHsKICAgICAgcmV0dXJuIHR5cGVmYWNlLmJvbGRpdGFsaWM7CiAgICB9CiAgICByZXR1cm4gdHlwZWZhY2UuaXRhbGljOwogIH0gZWxzZSBpZiAoeGZhRm9udC53ZWlnaHQgPT09ICJib2xkIikgewogICAgcmV0dXJuIHR5cGVmYWNlLmJvbGQ7CiAgfQogIHJldHVybiB0eXBlZmFjZS5yZWd1bGFyOwp9CmZ1bmN0aW9uIGdldE1ldHJpY3MoeGZhRm9udCwgcmVhbCA9IGZhbHNlKSB7CiAgbGV0IHBkZkZvbnQgPSBudWxsOwogIGlmICh4ZmFGb250KSB7CiAgICBjb25zdCBuYW1lID0gKDAsIF91dGlscy5zdHJpcFF1b3RlcykoeGZhRm9udC50eXBlZmFjZSk7CiAgICBjb25zdCB0eXBlZmFjZSA9IHhmYUZvbnRbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIuZmluZChuYW1lKTsKICAgIHBkZkZvbnQgPSBzZWxlY3RGb250KHhmYUZvbnQsIHR5cGVmYWNlKTsKICB9CiAgaWYgKCFwZGZGb250KSB7CiAgICByZXR1cm4gewogICAgICBsaW5lSGVpZ2h0OiAxMiwKICAgICAgbGluZUdhcDogMiwKICAgICAgbGluZU5vR2FwOiAxMAogICAgfTsKICB9CiAgY29uc3Qgc2l6ZSA9IHhmYUZvbnQuc2l6ZSB8fCAxMDsKICBjb25zdCBsaW5lSGVpZ2h0ID0gcGRmRm9udC5saW5lSGVpZ2h0ID8gTWF0aC5tYXgocmVhbCA/IDAgOiAxLjIsIHBkZkZvbnQubGluZUhlaWdodCkgOiAxLjI7CiAgY29uc3QgbGluZUdhcCA9IHBkZkZvbnQubGluZUdhcCA9PT0gdW5kZWZpbmVkID8gMC4yIDogcGRmRm9udC5saW5lR2FwOwogIHJldHVybiB7CiAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0ICogc2l6ZSwKICAgIGxpbmVHYXA6IGxpbmVHYXAgKiBzaXplLAogICAgbGluZU5vR2FwOiBNYXRoLm1heCgxLCBsaW5lSGVpZ2h0IC0gbGluZUdhcCkgKiBzaXplCiAgfTsKfQoKLyoqKi8gfSksCi8qIDg3ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuVGV4dE1lYXN1cmUgPSB2b2lkIDA7CnZhciBfZm9udHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg2KTsKY29uc3QgV0lEVEhfRkFDVE9SID0gMS4wMjsKY2xhc3MgRm9udEluZm8gewogIGNvbnN0cnVjdG9yKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5saW5lSGVpZ2h0ID0gbGluZUhlaWdodDsKICAgIHRoaXMucGFyYU1hcmdpbiA9IG1hcmdpbiB8fCB7CiAgICAgIHRvcDogMCwKICAgICAgYm90dG9tOiAwLAogICAgICBsZWZ0OiAwLAogICAgICByaWdodDogMAogICAgfTsKICAgIGlmICgheGZhRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy54ZmFGb250ID0gewogICAgICB0eXBlZmFjZTogeGZhRm9udC50eXBlZmFjZSwKICAgICAgcG9zdHVyZTogeGZhRm9udC5wb3N0dXJlLAogICAgICB3ZWlnaHQ6IHhmYUZvbnQud2VpZ2h0LAogICAgICBzaXplOiB4ZmFGb250LnNpemUsCiAgICAgIGxldHRlclNwYWNpbmc6IHhmYUZvbnQubGV0dGVyU3BhY2luZwogICAgfTsKICAgIGNvbnN0IHR5cGVmYWNlID0gZm9udEZpbmRlci5maW5kKHhmYUZvbnQudHlwZWZhY2UpOwogICAgaWYgKCF0eXBlZmFjZSkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5wZGZGb250ID0gKDAsIF9mb250cy5zZWxlY3RGb250KSh4ZmFGb250LCB0eXBlZmFjZSk7CiAgICBpZiAoIXRoaXMucGRmRm9udCkgewogICAgICBbdGhpcy5wZGZGb250LCB0aGlzLnhmYUZvbnRdID0gdGhpcy5kZWZhdWx0Rm9udChmb250RmluZGVyKTsKICAgIH0KICB9CiAgZGVmYXVsdEZvbnQoZm9udEZpbmRlcikgewogICAgY29uc3QgZm9udCA9IGZvbnRGaW5kZXIuZmluZCgiSGVsdmV0aWNhIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZmluZCgiTXlyaWFkIFBybyIsIGZhbHNlKSB8fCBmb250RmluZGVyLmZpbmQoIkFyaWFsIiwgZmFsc2UpIHx8IGZvbnRGaW5kZXIuZ2V0RGVmYXVsdCgpOwogICAgaWYgKGZvbnQ/LnJlZ3VsYXIpIHsKICAgICAgY29uc3QgcGRmRm9udCA9IGZvbnQucmVndWxhcjsKICAgICAgY29uc3QgaW5mbyA9IHBkZkZvbnQuY3NzRm9udEluZm87CiAgICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgICAgdHlwZWZhY2U6IGluZm8uZm9udEZhbWlseSwKICAgICAgICBwb3N0dXJlOiAibm9ybWFsIiwKICAgICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICAgIHNpemU6IDEwLAogICAgICAgIGxldHRlclNwYWNpbmc6IDAKICAgICAgfTsKICAgICAgcmV0dXJuIFtwZGZGb250LCB4ZmFGb250XTsKICAgIH0KICAgIGNvbnN0IHhmYUZvbnQgPSB7CiAgICAgIHR5cGVmYWNlOiAiQ291cmllciIsCiAgICAgIHBvc3R1cmU6ICJub3JtYWwiLAogICAgICB3ZWlnaHQ6ICJub3JtYWwiLAogICAgICBzaXplOiAxMCwKICAgICAgbGV0dGVyU3BhY2luZzogMAogICAgfTsKICAgIHJldHVybiBbbnVsbCwgeGZhRm9udF07CiAgfQp9CmNsYXNzIEZvbnRTZWxlY3RvciB7CiAgY29uc3RydWN0b3IoZGVmYXVsdFhmYUZvbnQsIGRlZmF1bHRQYXJhTWFyZ2luLCBkZWZhdWx0TGluZUhlaWdodCwgZm9udEZpbmRlcikgewogICAgdGhpcy5mb250RmluZGVyID0gZm9udEZpbmRlcjsKICAgIHRoaXMuc3RhY2sgPSBbbmV3IEZvbnRJbmZvKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRGaW5kZXIpXTsKICB9CiAgcHVzaERhdGEoeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0KSB7CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuc3RhY2suYXQoLTEpOwogICAgZm9yIChjb25zdCBuYW1lIG9mIFsidHlwZWZhY2UiLCAicG9zdHVyZSIsICJ3ZWlnaHQiLCAic2l6ZSIsICJsZXR0ZXJTcGFjaW5nIl0pIHsKICAgICAgaWYgKCF4ZmFGb250W25hbWVdKSB7CiAgICAgICAgeGZhRm9udFtuYW1lXSA9IGxhc3RGb250LnhmYUZvbnRbbmFtZV07CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgbmFtZSBvZiBbInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCJdKSB7CiAgICAgIGlmIChpc05hTihtYXJnaW5bbmFtZV0pKSB7CiAgICAgICAgbWFyZ2luW25hbWVdID0gbGFzdEZvbnQucGFyYU1hcmdpbltuYW1lXTsKICAgICAgfQogICAgfQogICAgY29uc3QgZm9udEluZm8gPSBuZXcgRm9udEluZm8oeGZhRm9udCwgbWFyZ2luLCBsaW5lSGVpZ2h0IHx8IGxhc3RGb250LmxpbmVIZWlnaHQsIHRoaXMuZm9udEZpbmRlcik7CiAgICBpZiAoIWZvbnRJbmZvLnBkZkZvbnQpIHsKICAgICAgZm9udEluZm8ucGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICB9CiAgICB0aGlzLnN0YWNrLnB1c2goZm9udEluZm8pOwogIH0KICBwb3BGb250KCkgewogICAgdGhpcy5zdGFjay5wb3AoKTsKICB9CiAgdG9wRm9udCgpIHsKICAgIHJldHVybiB0aGlzLnN0YWNrLmF0KC0xKTsKICB9Cn0KY2xhc3MgVGV4dE1lYXN1cmUgewogIGNvbnN0cnVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKSB7CiAgICB0aGlzLmdseXBocyA9IFtdOwogICAgdGhpcy5mb250U2VsZWN0b3IgPSBuZXcgRm9udFNlbGVjdG9yKGRlZmF1bHRYZmFGb250LCBkZWZhdWx0UGFyYU1hcmdpbiwgZGVmYXVsdExpbmVIZWlnaHQsIGZvbnRzKTsKICAgIHRoaXMuZXh0cmFIZWlnaHQgPSAwOwogIH0KICBwdXNoRGF0YSh4ZmFGb250LCBtYXJnaW4sIGxpbmVIZWlnaHQpIHsKICAgIHRoaXMuZm9udFNlbGVjdG9yLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgfQogIHBvcEZvbnQoeGZhRm9udCkgewogICAgcmV0dXJuIHRoaXMuZm9udFNlbGVjdG9yLnBvcEZvbnQoKTsKICB9CiAgYWRkUGFyYSgpIHsKICAgIGNvbnN0IGxhc3RGb250ID0gdGhpcy5mb250U2VsZWN0b3IudG9wRm9udCgpOwogICAgdGhpcy5leHRyYUhlaWdodCArPSBsYXN0Rm9udC5wYXJhTWFyZ2luLnRvcCArIGxhc3RGb250LnBhcmFNYXJnaW4uYm90dG9tOwogIH0KICBhZGRTdHJpbmcoc3RyKSB7CiAgICBpZiAoIXN0cikgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBsYXN0Rm9udCA9IHRoaXMuZm9udFNlbGVjdG9yLnRvcEZvbnQoKTsKICAgIGNvbnN0IGZvbnRTaXplID0gbGFzdEZvbnQueGZhRm9udC5zaXplOwogICAgaWYgKGxhc3RGb250LnBkZkZvbnQpIHsKICAgICAgY29uc3QgbGV0dGVyU3BhY2luZyA9IGxhc3RGb250LnhmYUZvbnQubGV0dGVyU3BhY2luZzsKICAgICAgY29uc3QgcGRmRm9udCA9IGxhc3RGb250LnBkZkZvbnQ7CiAgICAgIGNvbnN0IGZvbnRMaW5lSGVpZ2h0ID0gcGRmRm9udC5saW5lSGVpZ2h0IHx8IDEuMjsKICAgICAgY29uc3QgbGluZUhlaWdodCA9IGxhc3RGb250LmxpbmVIZWlnaHQgfHwgTWF0aC5tYXgoMS4yLCBmb250TGluZUhlaWdodCkgKiBmb250U2l6ZTsKICAgICAgY29uc3QgbGluZUdhcCA9IHBkZkZvbnQubGluZUdhcCA9PT0gdW5kZWZpbmVkID8gMC4yIDogcGRmRm9udC5saW5lR2FwOwogICAgICBjb25zdCBub0dhcCA9IGZvbnRMaW5lSGVpZ2h0IC0gbGluZUdhcDsKICAgICAgY29uc3QgZmlyc3RMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoMSwgbm9HYXApICogZm9udFNpemU7CiAgICAgIGNvbnN0IHNjYWxlID0gZm9udFNpemUgLyAxMDAwOwogICAgICBjb25zdCBmYWxsYmFja1dpZHRoID0gcGRmRm9udC5kZWZhdWx0V2lkdGggfHwgcGRmRm9udC5jaGFyc1RvR2x5cGhzKCIgIilbMF0ud2lkdGg7CiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBzdHIuc3BsaXQoL1tcdTIwMjlcbl0vKSkgewogICAgICAgIGNvbnN0IGVuY29kZWRMaW5lID0gcGRmRm9udC5lbmNvZGVTdHJpbmcobGluZSkuam9pbigiIik7CiAgICAgICAgY29uc3QgZ2x5cGhzID0gcGRmRm9udC5jaGFyc1RvR2x5cGhzKGVuY29kZWRMaW5lKTsKICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykgewogICAgICAgICAgY29uc3Qgd2lkdGggPSBnbHlwaC53aWR0aCB8fCBmYWxsYmFja1dpZHRoOwogICAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbd2lkdGggKiBzY2FsZSArIGxldHRlclNwYWNpbmcsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgZ2x5cGgudW5pY29kZSwgZmFsc2VdKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbMCwgMCwgMCwgIlxuIiwgdHJ1ZV0pOwogICAgICB9CiAgICAgIHRoaXMuZ2x5cGhzLnBvcCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyLnNwbGl0KC9bXHUyMDI5XG5dLykpIHsKICAgICAgZm9yIChjb25zdCBjaGFyIG9mIGxpbmUuc3BsaXQoIiIpKSB7CiAgICAgICAgdGhpcy5nbHlwaHMucHVzaChbZm9udFNpemUsIDEuMiAqIGZvbnRTaXplLCBmb250U2l6ZSwgY2hhciwgZmFsc2VdKTsKICAgICAgfQogICAgICB0aGlzLmdseXBocy5wdXNoKFswLCAwLCAwLCAiXG4iLCB0cnVlXSk7CiAgICB9CiAgICB0aGlzLmdseXBocy5wb3AoKTsKICB9CiAgY29tcHV0ZShtYXhXaWR0aCkgewogICAgbGV0IGxhc3RTcGFjZVBvcyA9IC0xLAogICAgICBsYXN0U3BhY2VXaWR0aCA9IDAsCiAgICAgIHdpZHRoID0gMCwKICAgICAgaGVpZ2h0ID0gMCwKICAgICAgY3VycmVudExpbmVXaWR0aCA9IDAsCiAgICAgIGN1cnJlbnRMaW5lSGVpZ2h0ID0gMDsKICAgIGxldCBpc0Jyb2tlbiA9IGZhbHNlOwogICAgbGV0IGlzRmlyc3RMaW5lID0gdHJ1ZTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMuZ2x5cGhzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgY29uc3QgW2dseXBoV2lkdGgsIGxpbmVIZWlnaHQsIGZpcnN0TGluZUhlaWdodCwgY2hhciwgaXNFT0xdID0gdGhpcy5nbHlwaHNbaV07CiAgICAgIGNvbnN0IGlzU3BhY2UgPSBjaGFyID09PSAiICI7CiAgICAgIGNvbnN0IGdseXBoSGVpZ2h0ID0gaXNGaXJzdExpbmUgPyBmaXJzdExpbmVIZWlnaHQgOiBsaW5lSGVpZ2h0OwogICAgICBpZiAoaXNFT0wpIHsKICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICBjdXJyZW50TGluZVdpZHRoID0gMDsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBsYXN0U3BhY2VQb3MgPSAtMTsKICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaXNTcGFjZSkgewogICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoICsgZ2x5cGhXaWR0aCA+IG1heFdpZHRoKSB7CiAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdXJyZW50TGluZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgaGVpZ2h0ICs9IGN1cnJlbnRMaW5lSGVpZ2h0OwogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICAgIGxhc3RTcGFjZVBvcyA9IC0xOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSAwOwogICAgICAgICAgaXNCcm9rZW4gPSB0cnVlOwogICAgICAgICAgaXNGaXJzdExpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgICAgICAgbGFzdFNwYWNlV2lkdGggPSBjdXJyZW50TGluZVdpZHRoOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCArPSBnbHlwaFdpZHRoOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gaTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGggKyBnbHlwaFdpZHRoID4gbWF4V2lkdGgpIHsKICAgICAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQ7CiAgICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBnbHlwaEhlaWdodDsKICAgICAgICBpZiAobGFzdFNwYWNlUG9zICE9PSAtMSkgewogICAgICAgICAgaSA9IGxhc3RTcGFjZVBvczsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGxhc3RTcGFjZVdpZHRoKTsKICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGggPSAwOwogICAgICAgICAgbGFzdFNwYWNlUG9zID0gLTE7CiAgICAgICAgICBsYXN0U3BhY2VXaWR0aCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN1cnJlbnRMaW5lV2lkdGgpOwogICAgICAgICAgY3VycmVudExpbmVXaWR0aCA9IGdseXBoV2lkdGg7CiAgICAgICAgfQogICAgICAgIGlzQnJva2VuID0gdHJ1ZTsKICAgICAgICBpc0ZpcnN0TGluZSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGN1cnJlbnRMaW5lV2lkdGggKz0gZ2x5cGhXaWR0aDsKICAgICAgY3VycmVudExpbmVIZWlnaHQgPSBNYXRoLm1heChnbHlwaEhlaWdodCwgY3VycmVudExpbmVIZWlnaHQpOwogICAgfQogICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY3VycmVudExpbmVXaWR0aCk7CiAgICBoZWlnaHQgKz0gY3VycmVudExpbmVIZWlnaHQgKyB0aGlzLmV4dHJhSGVpZ2h0OwogICAgcmV0dXJuIHsKICAgICAgd2lkdGg6IFdJRFRIX0ZBQ1RPUiAqIHdpZHRoLAogICAgICBoZWlnaHQsCiAgICAgIGlzQnJva2VuCiAgICB9OwogIH0KfQpleHBvcnRzLlRleHRNZWFzdXJlID0gVGV4dE1lYXN1cmU7CgovKioqLyB9KSwKLyogODggKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5EYXRhSGFuZGxlciA9IHZvaWQgMDsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CmNsYXNzIERhdGFIYW5kbGVyIHsKICBjb25zdHJ1Y3Rvcihyb290LCBkYXRhKSB7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgdGhpcy5kYXRhc2V0ID0gcm9vdC5kYXRhc2V0cyB8fCBudWxsOwogIH0KICBzZXJpYWxpemUoc3RvcmFnZSkgewogICAgY29uc3Qgc3RhY2sgPSBbWy0xLCB0aGlzLmRhdGFbX3hmYV9vYmplY3QuJGdldENoaWxkcmVuXSgpXV07CiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICBjb25zdCBsYXN0ID0gc3RhY2suYXQoLTEpOwogICAgICBjb25zdCBbaSwgY2hpbGRyZW5dID0gbGFzdDsKICAgICAgaWYgKGkgKyAxID09PSBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICBzdGFjay5wb3AoKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuWysrbGFzdFswXV07CiAgICAgIGNvbnN0IHN0b3JhZ2VFbnRyeSA9IHN0b3JhZ2UuZ2V0KGNoaWxkW194ZmFfb2JqZWN0LiR1aWRdKTsKICAgICAgaWYgKHN0b3JhZ2VFbnRyeSkgewogICAgICAgIGNoaWxkW194ZmFfb2JqZWN0LiRzZXRWYWx1ZV0oc3RvcmFnZUVudHJ5KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY2hpbGRbX3hmYV9vYmplY3QuJGdldEF0dHJpYnV0ZXNdKCk7CiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhdHRyaWJ1dGVzLnZhbHVlcygpKSB7CiAgICAgICAgICBjb25zdCBlbnRyeSA9IHN0b3JhZ2UuZ2V0KHZhbHVlW194ZmFfb2JqZWN0LiR1aWRdKTsKICAgICAgICAgIGlmIChlbnRyeSkgewogICAgICAgICAgICB2YWx1ZVtfeGZhX29iamVjdC4kc2V0VmFsdWVdKGVudHJ5KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvbnN0IG5vZGVzID0gY2hpbGRbX3hmYV9vYmplY3QuJGdldENoaWxkcmVuXSgpOwogICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgIHN0YWNrLnB1c2goWy0xLCBub2Rlc10pOwogICAgICB9CiAgICB9CiAgICBjb25zdCBidWYgPSBbYDx4ZmE6ZGF0YXNldHMgeG1sbnM6eGZhPSJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iPmBdOwogICAgaWYgKHRoaXMuZGF0YXNldCkgewogICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZGF0YXNldFtfeGZhX29iamVjdC4kZ2V0Q2hpbGRyZW5dKCkpIHsKICAgICAgICBpZiAoY2hpbGRbX3hmYV9vYmplY3QuJG5vZGVOYW1lXSAhPT0gImRhdGEiKSB7CiAgICAgICAgICBjaGlsZFtfeGZhX29iamVjdC4kdG9TdHJpbmddKGJ1Zik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB0aGlzLmRhdGFbX3hmYV9vYmplY3QuJHRvU3RyaW5nXShidWYpOwogICAgYnVmLnB1c2goIjwveGZhOmRhdGFzZXRzPiIpOwogICAgcmV0dXJuIGJ1Zi5qb2luKCIiKTsKICB9Cn0KZXhwb3J0cy5EYXRhSGFuZGxlciA9IERhdGFIYW5kbGVyOwoKLyoqKi8gfSksCi8qIDg5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuWEZBUGFyc2VyID0gdm9pZCAwOwp2YXIgX3hmYV9vYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc4KTsKdmFyIF94bWxfcGFyc2VyID0gX193X3BkZmpzX3JlcXVpcmVfXyg2Nyk7CnZhciBfYnVpbGRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oOTApOwp2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpOwpjbGFzcyBYRkFQYXJzZXIgZXh0ZW5kcyBfeG1sX3BhcnNlci5YTUxQYXJzZXJCYXNlIHsKICBjb25zdHJ1Y3Rvcihyb290TmFtZVNwYWNlID0gbnVsbCwgcmljaFRleHQgPSBmYWxzZSkgewogICAgc3VwZXIoKTsKICAgIHRoaXMuX2J1aWxkZXIgPSBuZXcgX2J1aWxkZXIuQnVpbGRlcihyb290TmFtZVNwYWNlKTsKICAgIHRoaXMuX3N0YWNrID0gW107CiAgICB0aGlzLl9nbG9iYWxEYXRhID0gewogICAgICB1c2VkVHlwZWZhY2VzOiBuZXcgU2V0KCkKICAgIH07CiAgICB0aGlzLl9pZHMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9jdXJyZW50ID0gdGhpcy5fYnVpbGRlci5idWlsZFJvb3QodGhpcy5faWRzKTsKICAgIHRoaXMuX2Vycm9yQ29kZSA9IF94bWxfcGFyc2VyLlhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yOwogICAgdGhpcy5fd2hpdGVSZWdleCA9IC9eXHMrJC87CiAgICB0aGlzLl9uYnNwcyA9IC9ceGEwKy9nOwogICAgdGhpcy5fcmljaFRleHQgPSByaWNoVGV4dDsKICB9CiAgcGFyc2UoZGF0YSkgewogICAgdGhpcy5wYXJzZVhtbChkYXRhKTsKICAgIGlmICh0aGlzLl9lcnJvckNvZGUgIT09IF94bWxfcGFyc2VyLlhNTFBhcnNlckVycm9yQ29kZS5Ob0Vycm9yKSB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICB0aGlzLl9jdXJyZW50W194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKTsKICAgIHJldHVybiB0aGlzLl9jdXJyZW50LmVsZW1lbnQ7CiAgfQogIG9uVGV4dCh0ZXh0KSB7CiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHRoaXMuX25ic3BzLCBtYXRjaCA9PiBtYXRjaC5zbGljZSgxKSArICIgIik7CiAgICBpZiAodGhpcy5fcmljaFRleHQgfHwgdGhpcy5fY3VycmVudFtfeGZhX29iamVjdC4kYWNjZXB0V2hpdGVzcGFjZV0oKSkgewogICAgICB0aGlzLl9jdXJyZW50W194ZmFfb2JqZWN0LiRvblRleHRdKHRleHQsIHRoaXMuX3JpY2hUZXh0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHRoaXMuX3doaXRlUmVnZXgudGVzdCh0ZXh0KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9jdXJyZW50W194ZmFfb2JqZWN0LiRvblRleHRdKHRleHQudHJpbSgpKTsKICB9CiAgb25DZGF0YSh0ZXh0KSB7CiAgICB0aGlzLl9jdXJyZW50W194ZmFfb2JqZWN0LiRvblRleHRdKHRleHQpOwogIH0KICBfbWtBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHRhZ05hbWUpIHsKICAgIGxldCBuYW1lc3BhY2UgPSBudWxsOwogICAgbGV0IHByZWZpeGVzID0gbnVsbDsKICAgIGNvbnN0IGF0dHJpYnV0ZU9iaiA9IE9iamVjdC5jcmVhdGUoe30pOwogICAgZm9yIChjb25zdCB7CiAgICAgIG5hbWUsCiAgICAgIHZhbHVlCiAgICB9IG9mIGF0dHJpYnV0ZXMpIHsKICAgICAgaWYgKG5hbWUgPT09ICJ4bWxucyIpIHsKICAgICAgICBpZiAoIW5hbWVzcGFjZSkgewogICAgICAgICAgbmFtZXNwYWNlID0gdmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgWEZBIC0gbXVsdGlwbGUgbmFtZXNwYWNlIGRlZmluaXRpb24gaW4gPCR7dGFnTmFtZX0+YCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpIHsKICAgICAgICBjb25zdCBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygieG1sbnM6Ii5sZW5ndGgpOwogICAgICAgIGlmICghcHJlZml4ZXMpIHsKICAgICAgICAgIHByZWZpeGVzID0gW107CiAgICAgICAgfQogICAgICAgIHByZWZpeGVzLnB1c2goewogICAgICAgICAgcHJlZml4LAogICAgICAgICAgdmFsdWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBpID0gbmFtZS5pbmRleE9mKCI6Iik7CiAgICAgICAgaWYgKGkgPT09IC0xKSB7CiAgICAgICAgICBhdHRyaWJ1dGVPYmpbbmFtZV0gPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IG5zQXR0cnMgPSBhdHRyaWJ1dGVPYmpbX3hmYV9vYmplY3QuJG5zQXR0cmlidXRlc107CiAgICAgICAgICBpZiAoIW5zQXR0cnMpIHsKICAgICAgICAgICAgbnNBdHRycyA9IGF0dHJpYnV0ZU9ialtfeGZhX29iamVjdC4kbnNBdHRyaWJ1dGVzXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBbbnMsIGF0dHJOYW1lXSA9IFtuYW1lLnNsaWNlKDAsIGkpLCBuYW1lLnNsaWNlKGkgKyAxKV07CiAgICAgICAgICBjb25zdCBhdHRycyA9IG5zQXR0cnNbbnNdIHx8PSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgYXR0cnNbYXR0ck5hbWVdID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gW25hbWVzcGFjZSwgcHJlZml4ZXMsIGF0dHJpYnV0ZU9ial07CiAgfQogIF9nZXROYW1lQW5kUHJlZml4KG5hbWUsIG5zQWdub3N0aWMpIHsKICAgIGNvbnN0IGkgPSBuYW1lLmluZGV4T2YoIjoiKTsKICAgIGlmIChpID09PSAtMSkgewogICAgICByZXR1cm4gW25hbWUsIG51bGxdOwogICAgfQogICAgcmV0dXJuIFtuYW1lLnN1YnN0cmluZyhpICsgMSksIG5zQWdub3N0aWMgPyAiIiA6IG5hbWUuc3Vic3RyaW5nKDAsIGkpXTsKICB9CiAgb25CZWdpbkVsZW1lbnQodGFnTmFtZSwgYXR0cmlidXRlcywgaXNFbXB0eSkgewogICAgY29uc3QgW25hbWVzcGFjZSwgcHJlZml4ZXMsIGF0dHJpYnV0ZXNPYmpdID0gdGhpcy5fbWtBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHRhZ05hbWUpOwogICAgY29uc3QgW25hbWUsIG5zUHJlZml4XSA9IHRoaXMuX2dldE5hbWVBbmRQcmVmaXgodGFnTmFtZSwgdGhpcy5fYnVpbGRlci5pc05zQWdub3N0aWMoKSk7CiAgICBjb25zdCBub2RlID0gdGhpcy5fYnVpbGRlci5idWlsZCh7CiAgICAgIG5zUHJlZml4LAogICAgICBuYW1lLAogICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzT2JqLAogICAgICBuYW1lc3BhY2UsCiAgICAgIHByZWZpeGVzCiAgICB9KTsKICAgIG5vZGVbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdID0gdGhpcy5fZ2xvYmFsRGF0YTsKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIG5vZGVbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpOwogICAgICBpZiAodGhpcy5fY3VycmVudFtfeGZhX29iamVjdC4kb25DaGlsZF0obm9kZSkpIHsKICAgICAgICBub2RlW194ZmFfb2JqZWN0LiRzZXRJZF0odGhpcy5faWRzKTsKICAgICAgfQogICAgICBub2RlW194ZmFfb2JqZWN0LiRjbGVhbl0odGhpcy5fYnVpbGRlcik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YWNrLnB1c2godGhpcy5fY3VycmVudCk7CiAgICB0aGlzLl9jdXJyZW50ID0gbm9kZTsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9jdXJyZW50OwogICAgaWYgKG5vZGVbX3hmYV9vYmplY3QuJGlzQ0RBVEFYbWxdKCkgJiYgdHlwZW9mIG5vZGVbX3hmYV9vYmplY3QuJGNvbnRlbnRdID09PSAic3RyaW5nIikgewogICAgICBjb25zdCBwYXJzZXIgPSBuZXcgWEZBUGFyc2VyKCk7CiAgICAgIHBhcnNlci5fZ2xvYmFsRGF0YSA9IHRoaXMuX2dsb2JhbERhdGE7CiAgICAgIGNvbnN0IHJvb3QgPSBwYXJzZXIucGFyc2Uobm9kZVtfeGZhX29iamVjdC4kY29udGVudF0pOwogICAgICBub2RlW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IG51bGw7CiAgICAgIG5vZGVbX3hmYV9vYmplY3QuJG9uQ2hpbGRdKHJvb3QpOwogICAgfQogICAgbm9kZVtfeGZhX29iamVjdC4kZmluYWxpemVdKCk7CiAgICB0aGlzLl9jdXJyZW50ID0gdGhpcy5fc3RhY2sucG9wKCk7CiAgICBpZiAodGhpcy5fY3VycmVudFtfeGZhX29iamVjdC4kb25DaGlsZF0obm9kZSkpIHsKICAgICAgbm9kZVtfeGZhX29iamVjdC4kc2V0SWRdKHRoaXMuX2lkcyk7CiAgICB9CiAgICBub2RlW194ZmFfb2JqZWN0LiRjbGVhbl0odGhpcy5fYnVpbGRlcik7CiAgfQogIG9uRXJyb3IoY29kZSkgewogICAgdGhpcy5fZXJyb3JDb2RlID0gY29kZTsKICB9Cn0KZXhwb3J0cy5YRkFQYXJzZXIgPSBYRkFQYXJzZXI7CgovKioqLyB9KSwKLyogOTAgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5CdWlsZGVyID0gdm9pZCAwOwp2YXIgX25hbWVzcGFjZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfc2V0dXAgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkxKTsKdmFyIF90ZW1wbGF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oODMpOwp2YXIgX3Vua25vd24gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwMCk7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CmNsYXNzIFJvb3QgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGlkcykgewogICAgc3VwZXIoLTEsICJyb290IiwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgICB0aGlzLmVsZW1lbnQgPSBudWxsOwogICAgdGhpc1tfeGZhX29iamVjdC4kaWRzXSA9IGlkczsKICB9CiAgW194ZmFfb2JqZWN0LiRvbkNoaWxkXShjaGlsZCkgewogICAgdGhpcy5lbGVtZW50ID0gY2hpbGQ7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICBzdXBlcltfeGZhX29iamVjdC4kZmluYWxpemVdKCk7CiAgICBpZiAodGhpcy5lbGVtZW50LnRlbXBsYXRlIGluc3RhbmNlb2YgX3RlbXBsYXRlLlRlbXBsYXRlKSB7CiAgICAgIHRoaXNbX3hmYV9vYmplY3QuJGlkc10uc2V0KF94ZmFfb2JqZWN0LiRyb290LCB0aGlzLmVsZW1lbnQpOwogICAgICB0aGlzLmVsZW1lbnQudGVtcGxhdGVbX3hmYV9vYmplY3QuJHJlc29sdmVQcm90b3R5cGVzXSh0aGlzW194ZmFfb2JqZWN0LiRpZHNdKTsKICAgICAgdGhpcy5lbGVtZW50LnRlbXBsYXRlW194ZmFfb2JqZWN0LiRpZHNdID0gdGhpc1tfeGZhX29iamVjdC4kaWRzXTsKICAgIH0KICB9Cn0KY2xhc3MgRW1wdHkgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKCkgewogICAgc3VwZXIoLTEsICIiLCBPYmplY3QuY3JlYXRlKG51bGwpKTsKICB9CiAgW194ZmFfb2JqZWN0LiRvbkNoaWxkXShfKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9CmNsYXNzIEJ1aWxkZXIgewogIGNvbnN0cnVjdG9yKHJvb3ROYW1lU3BhY2UgPSBudWxsKSB7CiAgICB0aGlzLl9uYW1lc3BhY2VTdGFjayA9IFtdOwogICAgdGhpcy5fbnNBZ25vc3RpY0xldmVsID0gMDsKICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzID0gbmV3IE1hcCgpOwogICAgdGhpcy5fbmFtZXNwYWNlcyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX25leHROc0lkID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhfbmFtZXNwYWNlcy5OYW1lc3BhY2VJZHMpLm1hcCgoewogICAgICBpZAogICAgfSkgPT4gaWQpKTsKICAgIHRoaXMuX2N1cnJlbnROYW1lc3BhY2UgPSByb290TmFtZVNwYWNlIHx8IG5ldyBfdW5rbm93bi5Vbmtub3duTmFtZXNwYWNlKCsrdGhpcy5fbmV4dE5zSWQpOwogIH0KICBidWlsZFJvb3QoaWRzKSB7CiAgICByZXR1cm4gbmV3IFJvb3QoaWRzKTsKICB9CiAgYnVpbGQoewogICAgbnNQcmVmaXgsCiAgICBuYW1lLAogICAgYXR0cmlidXRlcywKICAgIG5hbWVzcGFjZSwKICAgIHByZWZpeGVzCiAgfSkgewogICAgY29uc3QgaGFzTmFtZXNwYWNlRGVmID0gbmFtZXNwYWNlICE9PSBudWxsOwogICAgaWYgKGhhc05hbWVzcGFjZURlZikgewogICAgICB0aGlzLl9uYW1lc3BhY2VTdGFjay5wdXNoKHRoaXMuX2N1cnJlbnROYW1lc3BhY2UpOwogICAgICB0aGlzLl9jdXJyZW50TmFtZXNwYWNlID0gdGhpcy5fc2VhcmNoTmFtZXNwYWNlKG5hbWVzcGFjZSk7CiAgICB9CiAgICBpZiAocHJlZml4ZXMpIHsKICAgICAgdGhpcy5fYWRkTmFtZXNwYWNlUHJlZml4KHByZWZpeGVzKTsKICAgIH0KICAgIGlmIChhdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KF94ZmFfb2JqZWN0LiRuc0F0dHJpYnV0ZXMpKSB7CiAgICAgIGNvbnN0IGRhdGFUZW1wbGF0ZSA9IF9zZXR1cC5OYW1lc3BhY2VTZXRVcC5kYXRhc2V0czsKICAgICAgY29uc3QgbnNBdHRycyA9IGF0dHJpYnV0ZXNbX3hmYV9vYmplY3QuJG5zQXR0cmlidXRlc107CiAgICAgIGxldCB4ZmFBdHRycyA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgW25zLCBhdHRyc10gb2YgT2JqZWN0LmVudHJpZXMobnNBdHRycykpIHsKICAgICAgICBjb25zdCBuc1RvVXNlID0gdGhpcy5fZ2V0TmFtZXNwYWNlVG9Vc2UobnMpOwogICAgICAgIGlmIChuc1RvVXNlID09PSBkYXRhVGVtcGxhdGUpIHsKICAgICAgICAgIHhmYUF0dHJzID0gewogICAgICAgICAgICB4ZmE6IGF0dHJzCiAgICAgICAgICB9OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh4ZmFBdHRycykgewogICAgICAgIGF0dHJpYnV0ZXNbX3hmYV9vYmplY3QuJG5zQXR0cmlidXRlc10gPSB4ZmFBdHRyczsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWxldGUgYXR0cmlidXRlc1tfeGZhX29iamVjdC4kbnNBdHRyaWJ1dGVzXTsKICAgICAgfQogICAgfQogICAgY29uc3QgbmFtZXNwYWNlVG9Vc2UgPSB0aGlzLl9nZXROYW1lc3BhY2VUb1VzZShuc1ByZWZpeCk7CiAgICBjb25zdCBub2RlID0gbmFtZXNwYWNlVG9Vc2U/LltfbmFtZXNwYWNlcy4kYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHx8IG5ldyBFbXB0eSgpOwogICAgaWYgKG5vZGVbX3hmYV9vYmplY3QuJGlzTnNBZ25vc3RpY10oKSkgewogICAgICB0aGlzLl9uc0Fnbm9zdGljTGV2ZWwrKzsKICAgIH0KICAgIGlmIChoYXNOYW1lc3BhY2VEZWYgfHwgcHJlZml4ZXMgfHwgbm9kZVtfeGZhX29iamVjdC4kaXNOc0Fnbm9zdGljXSgpKSB7CiAgICAgIG5vZGVbX3hmYV9vYmplY3QuJGNsZWFudXBdID0gewogICAgICAgIGhhc05hbWVzcGFjZTogaGFzTmFtZXNwYWNlRGVmLAogICAgICAgIHByZWZpeGVzLAogICAgICAgIG5zQWdub3N0aWM6IG5vZGVbX3hmYV9vYmplY3QuJGlzTnNBZ25vc3RpY10oKQogICAgICB9OwogICAgfQogICAgcmV0dXJuIG5vZGU7CiAgfQogIGlzTnNBZ25vc3RpYygpIHsKICAgIHJldHVybiB0aGlzLl9uc0Fnbm9zdGljTGV2ZWwgPiAwOwogIH0KICBfc2VhcmNoTmFtZXNwYWNlKG5zTmFtZSkgewogICAgbGV0IG5zID0gdGhpcy5fbmFtZXNwYWNlcy5nZXQobnNOYW1lKTsKICAgIGlmIChucykgewogICAgICByZXR1cm4gbnM7CiAgICB9CiAgICBmb3IgKGNvbnN0IFtuYW1lLCB7CiAgICAgIGNoZWNrCiAgICB9XSBvZiBPYmplY3QuZW50cmllcyhfbmFtZXNwYWNlcy5OYW1lc3BhY2VJZHMpKSB7CiAgICAgIGlmIChjaGVjayhuc05hbWUpKSB7CiAgICAgICAgbnMgPSBfc2V0dXAuTmFtZXNwYWNlU2V0VXBbbmFtZV07CiAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgICAgICAgIHJldHVybiBuczsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIG5zID0gbmV3IF91bmtub3duLlVua25vd25OYW1lc3BhY2UoKyt0aGlzLl9uZXh0TnNJZCk7CiAgICB0aGlzLl9uYW1lc3BhY2VzLnNldChuc05hbWUsIG5zKTsKICAgIHJldHVybiBuczsKICB9CiAgX2FkZE5hbWVzcGFjZVByZWZpeChwcmVmaXhlcykgewogICAgZm9yIChjb25zdCB7CiAgICAgIHByZWZpeCwKICAgICAgdmFsdWUKICAgIH0gb2YgcHJlZml4ZXMpIHsKICAgICAgY29uc3QgbmFtZXNwYWNlID0gdGhpcy5fc2VhcmNoTmFtZXNwYWNlKHZhbHVlKTsKICAgICAgbGV0IHByZWZpeFN0YWNrID0gdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuZ2V0KHByZWZpeCk7CiAgICAgIGlmICghcHJlZml4U3RhY2spIHsKICAgICAgICBwcmVmaXhTdGFjayA9IFtdOwogICAgICAgIHRoaXMuX25hbWVzcGFjZVByZWZpeGVzLnNldChwcmVmaXgsIHByZWZpeFN0YWNrKTsKICAgICAgfQogICAgICBwcmVmaXhTdGFjay5wdXNoKG5hbWVzcGFjZSk7CiAgICB9CiAgfQogIF9nZXROYW1lc3BhY2VUb1VzZShwcmVmaXgpIHsKICAgIGlmICghcHJlZml4KSB7CiAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50TmFtZXNwYWNlOwogICAgfQogICAgY29uc3QgcHJlZml4U3RhY2sgPSB0aGlzLl9uYW1lc3BhY2VQcmVmaXhlcy5nZXQocHJlZml4KTsKICAgIGlmIChwcmVmaXhTdGFjaz8ubGVuZ3RoID4gMCkgewogICAgICByZXR1cm4gcHJlZml4U3RhY2suYXQoLTEpOwogICAgfQogICAgKDAsIF91dGlsLndhcm4pKGBVbmtub3duIG5hbWVzcGFjZSBwcmVmaXg6ICR7cHJlZml4fS5gKTsKICAgIHJldHVybiBudWxsOwogIH0KICBjbGVhbihkYXRhKSB7CiAgICBjb25zdCB7CiAgICAgIGhhc05hbWVzcGFjZSwKICAgICAgcHJlZml4ZXMsCiAgICAgIG5zQWdub3N0aWMKICAgIH0gPSBkYXRhOwogICAgaWYgKGhhc05hbWVzcGFjZSkgewogICAgICB0aGlzLl9jdXJyZW50TmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlU3RhY2sucG9wKCk7CiAgICB9CiAgICBpZiAocHJlZml4ZXMpIHsKICAgICAgcHJlZml4ZXMuZm9yRWFjaCgoewogICAgICAgIHByZWZpeAogICAgICB9KSA9PiB7CiAgICAgICAgdGhpcy5fbmFtZXNwYWNlUHJlZml4ZXMuZ2V0KHByZWZpeCkucG9wKCk7CiAgICAgIH0pOwogICAgfQogICAgaWYgKG5zQWdub3N0aWMpIHsKICAgICAgdGhpcy5fbnNBZ25vc3RpY0xldmVsLS07CiAgICB9CiAgfQp9CmV4cG9ydHMuQnVpbGRlciA9IEJ1aWxkZXI7CgovKioqLyB9KSwKLyogOTEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5OYW1lc3BhY2VTZXRVcCA9IHZvaWQgMDsKdmFyIF9jb25maWcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkyKTsKdmFyIF9jb25uZWN0aW9uX3NldCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTMpOwp2YXIgX2RhdGFzZXRzID0gX193X3BkZmpzX3JlcXVpcmVfXyg5NCk7CnZhciBfbG9jYWxlX3NldCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTUpOwp2YXIgX3NpZ25hdHVyZSA9IF9fd19wZGZqc19yZXF1aXJlX18oOTYpOwp2YXIgX3N0eWxlc2hlZXQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDk3KTsKdmFyIF90ZW1wbGF0ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oODMpOwp2YXIgX3hkcCA9IF9fd19wZGZqc19yZXF1aXJlX18oOTgpOwp2YXIgX3hodG1sID0gX193X3BkZmpzX3JlcXVpcmVfXyg5OSk7CmNvbnN0IE5hbWVzcGFjZVNldFVwID0gewogIGNvbmZpZzogX2NvbmZpZy5Db25maWdOYW1lc3BhY2UsCiAgY29ubmVjdGlvbjogX2Nvbm5lY3Rpb25fc2V0LkNvbm5lY3Rpb25TZXROYW1lc3BhY2UsCiAgZGF0YXNldHM6IF9kYXRhc2V0cy5EYXRhc2V0c05hbWVzcGFjZSwKICBsb2NhbGVTZXQ6IF9sb2NhbGVfc2V0LkxvY2FsZVNldE5hbWVzcGFjZSwKICBzaWduYXR1cmU6IF9zaWduYXR1cmUuU2lnbmF0dXJlTmFtZXNwYWNlLAogIHN0eWxlc2hlZXQ6IF9zdHlsZXNoZWV0LlN0eWxlc2hlZXROYW1lc3BhY2UsCiAgdGVtcGxhdGU6IF90ZW1wbGF0ZS5UZW1wbGF0ZU5hbWVzcGFjZSwKICB4ZHA6IF94ZHAuWGRwTmFtZXNwYWNlLAogIHhodG1sOiBfeGh0bWwuWGh0bWxOYW1lc3BhY2UKfTsKZXhwb3J0cy5OYW1lc3BhY2VTZXRVcCA9IE5hbWVzcGFjZVNldFVwOwoKLyoqKi8gfSksCi8qIDkyICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuQ29uZmlnTmFtZXNwYWNlID0gdm9pZCAwOwp2YXIgX25hbWVzcGFjZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY29uc3QgQ09ORklHX05TX0lEID0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLmNvbmZpZy5pZDsKY2xhc3MgQWNyb2JhdCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWNyb2JhdCIsIHRydWUpOwogICAgdGhpcy5hY3JvYmF0NyA9IG51bGw7CiAgICB0aGlzLmF1dG9TYXZlID0gbnVsbDsKICAgIHRoaXMuY29tbW9uID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy52YWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyA9IG51bGw7CiAgICB0aGlzLnN1Ym1pdFVybCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBBY3JvYmF0NyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWNyb2JhdDciLCB0cnVlKTsKICAgIHRoaXMuZHluYW1pY1JlbmRlciA9IG51bGw7CiAgfQp9CmNsYXNzIEFEQkVfSlNDb25zb2xlIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJBREJFX0pTQ29uc29sZSIsIFsiZGVsZWdhdGUiLCAiRW5hYmxlIiwgIkRpc2FibGUiXSk7CiAgfQp9CmNsYXNzIEFEQkVfSlNEZWJ1Z2dlciBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiQURCRV9KU0RlYnVnZ2VyIiwgWyJkZWxlZ2F0ZSIsICJFbmFibGUiLCAiRGlzYWJsZSJdKTsKICB9Cn0KY2xhc3MgQWRkU2lsZW50UHJpbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRkU2lsZW50UHJpbnQiKTsKICB9Cn0KY2xhc3MgQWRkVmlld2VyUHJlZmVyZW5jZXMgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYWRkVmlld2VyUHJlZmVyZW5jZXMiKTsKICB9Cn0KY2xhc3MgQWRqdXN0RGF0YSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjEwIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhZGp1c3REYXRhIik7CiAgfQp9CmNsYXNzIEFkb2JlRXh0ZW5zaW9uTGV2ZWwgZXh0ZW5kcyBfeGZhX29iamVjdC5JbnRlZ2VyT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJhZG9iZUV4dGVuc2lvbkxldmVsIiwgMCwgbiA9PiBuID49IDEgJiYgbiA8PSA4KTsKICB9Cn0KY2xhc3MgQWdlbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFnZW50IiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgPyBhdHRyaWJ1dGVzLm5hbWUudHJpbSgpIDogIiI7CiAgICB0aGlzLmNvbW1vbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBBbHdheXNFbWJlZCBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFsd2F5c0VtYmVkIik7CiAgfQp9CmNsYXNzIEFtZCBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYW1kIik7CiAgfQp9CmNsYXNzIEFyZWEgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImFyZWEiKTsKICAgIHRoaXMubGV2ZWwgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5sZXZlbCwKICAgICAgZGVmYXVsdFZhbHVlOiAwLAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDEgJiYgbiA8PSAzCiAgICB9KTsKICAgIHRoaXMubmFtZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm5hbWUsIFsiIiwgImJhcmNvZGUiLCAiY29yZWluaXQiLCAiZGV2aWNlRHJpdmVyIiwgImZvbnQiLCAiZ2VuZXJhbCIsICJsYXlvdXQiLCAibWVyZ2UiLCAic2NyaXB0IiwgInNpZ25hdHVyZSIsICJzb3VyY2VTZXQiLCAidGVtcGxhdGVDYWNoZSJdKTsKICB9Cn0KY2xhc3MgQXR0cmlidXRlcyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYXR0cmlidXRlcyIsIFsicHJlc2VydmUiLCAiZGVsZWdhdGUiLCAiaWdub3JlIl0pOwogIH0KfQpjbGFzcyBBdXRvU2F2ZSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiYXV0b1NhdmUiLCBbImRpc2FibGVkIiwgImVuYWJsZWQiXSk7CiAgfQp9CmNsYXNzIEJhc2UgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImJhc2UiKTsKICB9Cn0KY2xhc3MgQmF0Y2hPdXRwdXQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImJhdGNoT3V0cHV0Iik7CiAgICB0aGlzLmZvcm1hdCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLmZvcm1hdCwgWyJub25lIiwgImNvbmNhdCIsICJ6aXAiLCAiemlwQ29tcHJlc3MiXSk7CiAgfQp9CmNsYXNzIEJlaGF2aW9yT3ZlcnJpZGUgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJiZWhhdmlvck92ZXJyaWRlIik7CiAgfQogIFtfeGZhX29iamVjdC4kZmluYWxpemVdKCkgewogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBuZXcgTWFwKHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykuZmlsdGVyKHggPT4geC5pbmNsdWRlcygiOiIpKS5tYXAoeCA9PiB4LnNwbGl0KCI6IiwgMikpKTsKICB9Cn0KY2xhc3MgQ2FjaGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNhY2hlIiwgdHJ1ZSk7CiAgICB0aGlzLnRlbXBsYXRlQ2FjaGUgPSBudWxsOwogIH0KfQpjbGFzcyBDaGFuZ2UgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY2hhbmdlIik7CiAgfQp9CmNsYXNzIENvbW1vbiBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29tbW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGEgPSBudWxsOwogICAgdGhpcy5sb2NhbGUgPSBudWxsOwogICAgdGhpcy5sb2NhbGVTZXQgPSBudWxsOwogICAgdGhpcy5tZXNzYWdpbmcgPSBudWxsOwogICAgdGhpcy5zdXBwcmVzc0Jhbm5lciA9IG51bGw7CiAgICB0aGlzLnRlbXBsYXRlID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2luZyA9IG51bGw7CiAgICB0aGlzLnZlcnNpb25Db250cm9sID0gbnVsbDsKICAgIHRoaXMubG9nID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIENvbXByZXNzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21wcmVzcyIpOwogICAgdGhpcy5zY29wZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLnNjb3BlLCBbImltYWdlT25seSIsICJkb2N1bWVudCJdKTsKICB9Cn0KY2xhc3MgQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSIpOwogIH0KfQpjbGFzcyBDb21wcmVzc09iamVjdFN0cmVhbSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjEwIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJjb21wcmVzc09iamVjdFN0cmVhbSIpOwogIH0KfQpjbGFzcyBDb21wcmVzc2lvbiBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY29tcHJlc3Npb24iLCB0cnVlKTsKICAgIHRoaXMuY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlID0gbnVsbDsKICAgIHRoaXMuY29tcHJlc3NPYmplY3RTdHJlYW0gPSBudWxsOwogICAgdGhpcy5sZXZlbCA9IG51bGw7CiAgICB0aGlzLnR5cGUgPSBudWxsOwogIH0KfQpjbGFzcyBDb25maWcgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbmZpZyIsIHRydWUpOwogICAgdGhpcy5hY3JvYmF0ID0gbnVsbDsKICAgIHRoaXMucHJlc2VudCA9IG51bGw7CiAgICB0aGlzLnRyYWNlID0gbnVsbDsKICAgIHRoaXMuYWdlbnQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgQ29uZm9ybWFuY2UgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbmZvcm1hbmNlIiwgWyJBIiwgIkIiXSk7CiAgfQp9CmNsYXNzIENvbnRlbnRDb3B5IGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvbnRlbnRDb3B5Iik7CiAgfQp9CmNsYXNzIENvcGllcyBleHRlbmRzIF94ZmFfb2JqZWN0LkludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImNvcGllcyIsIDEsIG4gPT4gbiA+PSAxKTsKICB9Cn0KY2xhc3MgQ3JlYXRvciBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiY3JlYXRvciIpOwogIH0KfQpjbGFzcyBDdXJyZW50UGFnZSBleHRlbmRzIF94ZmFfb2JqZWN0LkludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImN1cnJlbnRQYWdlIiwgMCwgbiA9PiBuID49IDApOwogIH0KfQpjbGFzcyBEYXRhIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkYXRhIiwgdHJ1ZSk7CiAgICB0aGlzLmFkanVzdERhdGEgPSBudWxsOwogICAgdGhpcy5hdHRyaWJ1dGVzID0gbnVsbDsKICAgIHRoaXMuaW5jcmVtZW50YWxMb2FkID0gbnVsbDsKICAgIHRoaXMub3V0cHV0WFNMID0gbnVsbDsKICAgIHRoaXMucmFuZ2UgPSBudWxsOwogICAgdGhpcy5yZWNvcmQgPSBudWxsOwogICAgdGhpcy5zdGFydE5vZGUgPSBudWxsOwogICAgdGhpcy51cmkgPSBudWxsOwogICAgdGhpcy53aW5kb3cgPSBudWxsOwogICAgdGhpcy54c2wgPSBudWxsOwogICAgdGhpcy5leGNsdWRlTlMgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMudHJhbnNmb3JtID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIERlYnVnIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkZWJ1ZyIsIHRydWUpOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBEZWZhdWx0VHlwZWZhY2UgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkZWZhdWx0VHlwZWZhY2UiKTsKICAgIHRoaXMud3JpdGluZ1NjcmlwdCA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLndyaXRpbmdTY3JpcHQsIFsiKiIsICJBcmFiaWMiLCAiQ3lyaWxsaWMiLCAiRWFzdEV1cm9wZWFuUm9tYW4iLCAiR3JlZWsiLCAiSGVicmV3IiwgIkphcGFuZXNlIiwgIktvcmVhbiIsICJSb21hbiIsICJTaW1wbGlmaWVkQ2hpbmVzZSIsICJUaGFpIiwgIlRyYWRpdGlvbmFsQ2hpbmVzZSIsICJWaWV0bmFtZXNlIl0pOwogIH0KfQpjbGFzcyBEZXN0aW5hdGlvbiBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZGVzdGluYXRpb24iLCBbInBkZiIsICJwY2wiLCAicHMiLCAid2ViQ2xpZW50IiwgInpwbCJdKTsKICB9Cn0KY2xhc3MgRG9jdW1lbnRBc3NlbWJseSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkb2N1bWVudEFzc2VtYmx5Iik7CiAgfQp9CmNsYXNzIERyaXZlciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZHJpdmVyIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgPyBhdHRyaWJ1dGVzLm5hbWUudHJpbSgpIDogIiI7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMueGRjID0gbnVsbDsKICB9Cn0KY2xhc3MgRHVwbGV4T3B0aW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJkdXBsZXhPcHRpb24iLCBbInNpbXBsZXgiLCAiZHVwbGV4RmxpcExvbmdFZGdlIiwgImR1cGxleEZsaXBTaG9ydEVkZ2UiXSk7CiAgfQp9CmNsYXNzIER5bmFtaWNSZW5kZXIgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImR5bmFtaWNSZW5kZXIiLCBbImZvcmJpZGRlbiIsICJyZXF1aXJlZCJdKTsKICB9Cn0KY2xhc3MgRW1iZWQgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZW1iZWQiKTsKICB9Cn0KY2xhc3MgRW5jcnlwdCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0Iik7CiAgfQp9CmNsYXNzIEVuY3J5cHRpb24gZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImVuY3J5cHRpb24iLCB0cnVlKTsKICAgIHRoaXMuZW5jcnlwdCA9IG51bGw7CiAgICB0aGlzLmVuY3J5cHRpb25MZXZlbCA9IG51bGw7CiAgICB0aGlzLnBlcm1pc3Npb25zID0gbnVsbDsKICB9Cn0KY2xhc3MgRW5jcnlwdGlvbkxldmVsIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlbmNyeXB0aW9uTGV2ZWwiLCBbIjQwYml0IiwgIjEyOGJpdCJdKTsKICB9Cn0KY2xhc3MgRW5mb3JjZSBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZW5mb3JjZSIpOwogIH0KfQpjbGFzcyBFcXVhdGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImVxdWF0ZSIpOwogICAgdGhpcy5mb3JjZSA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmZvcmNlLAogICAgICBkZWZhdWx0VmFsdWU6IDEsCiAgICAgIHZhbGlkYXRlOiBuID0+IG4gPT09IDAKICAgIH0pOwogICAgdGhpcy5mcm9tID0gYXR0cmlidXRlcy5mcm9tIHx8ICIiOwogICAgdGhpcy50byA9IGF0dHJpYnV0ZXMudG8gfHwgIiI7CiAgfQp9CmNsYXNzIEVxdWF0ZVJhbmdlIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJlcXVhdGVSYW5nZSIpOwogICAgdGhpcy5mcm9tID0gYXR0cmlidXRlcy5mcm9tIHx8ICIiOwogICAgdGhpcy50byA9IGF0dHJpYnV0ZXMudG8gfHwgIiI7CiAgICB0aGlzLl91bmljb2RlUmFuZ2UgPSBhdHRyaWJ1dGVzLnVuaWNvZGVSYW5nZSB8fCAiIjsKICB9CiAgZ2V0IHVuaWNvZGVSYW5nZSgpIHsKICAgIGNvbnN0IHJhbmdlcyA9IFtdOwogICAgY29uc3QgdW5pY29kZVJlZ2V4ID0gL1VcKyhbMC05YS1mQS1GXSspLzsKICAgIGNvbnN0IHVuaWNvZGVSYW5nZSA9IHRoaXMuX3VuaWNvZGVSYW5nZTsKICAgIGZvciAobGV0IHJhbmdlIG9mIHVuaWNvZGVSYW5nZS5zcGxpdCgiLCIpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoeCA9PiAhIXgpKSB7CiAgICAgIHJhbmdlID0gcmFuZ2Uuc3BsaXQoIi0iLCAyKS5tYXAoeCA9PiB7CiAgICAgICAgY29uc3QgZm91bmQgPSB4Lm1hdGNoKHVuaWNvZGVSZWdleCk7CiAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJzZUludChmb3VuZFsxXSwgMTYpOwogICAgICB9KTsKICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJhbmdlLnB1c2gocmFuZ2VbMF0pOwogICAgICB9CiAgICAgIHJhbmdlcy5wdXNoKHJhbmdlKTsKICAgIH0KICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCAidW5pY29kZVJhbmdlIiwgcmFuZ2VzKTsKICB9Cn0KY2xhc3MgRXhjbHVkZSBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImV4Y2x1ZGUiKTsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKS5zcGxpdCgvXHMrLykuZmlsdGVyKHggPT4geCAmJiBbImNhbGN1bGF0ZSIsICJjbG9zZSIsICJlbnRlciIsICJleGl0IiwgImluaXRpYWxpemUiLCAicmVhZHkiLCAidmFsaWRhdGUiXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIEV4Y2x1ZGVOUyBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZXhjbHVkZU5TIik7CiAgfQp9CmNsYXNzIEZsaXBMYWJlbCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiZmxpcExhYmVsIiwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJvbiIsICJvZmYiXSk7CiAgfQp9CmNsYXNzIEZvbnRJbmZvIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb250SW5mbyIsIHRydWUpOwogICAgdGhpcy5lbWJlZCA9IG51bGw7CiAgICB0aGlzLm1hcCA9IG51bGw7CiAgICB0aGlzLnN1YnNldEJlbG93ID0gbnVsbDsKICAgIHRoaXMuYWx3YXlzRW1iZWQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZGVmYXVsdFR5cGVmYWNlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLm5ldmVyRW1iZWQgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRm9ybUZpZWxkRmlsbGluZyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJmb3JtRmllbGRGaWxsaW5nIik7CiAgfQp9CmNsYXNzIEdyb3VwUGFyZW50IGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJncm91cFBhcmVudCIpOwogIH0KfQpjbGFzcyBJZkVtcHR5IGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpZkVtcHR5IiwgWyJkYXRhVmFsdWUiLCAiZGF0YUdyb3VwIiwgImlnbm9yZSIsICJyZW1vdmUiXSk7CiAgfQp9CmNsYXNzIEluY2x1ZGVYRFBDb250ZW50IGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNsdWRlWERQQ29udGVudCIpOwogIH0KfQpjbGFzcyBJbmNyZW1lbnRhbExvYWQgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImluY3JlbWVudGFsTG9hZCIsIFsibm9uZSIsICJmb3J3YXJkT25seSJdKTsKICB9Cn0KY2xhc3MgSW5jcmVtZW50YWxNZXJnZSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJpbmNyZW1lbnRhbE1lcmdlIik7CiAgfQp9CmNsYXNzIEludGVyYWN0aXZlIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImludGVyYWN0aXZlIik7CiAgfQp9CmNsYXNzIEpvZyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAiam9nIiwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJub25lIiwgInBhZ2VTZXQiXSk7CiAgfQp9CmNsYXNzIExhYmVsUHJpbnRlciBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGFiZWxQcmludGVyIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5uYW1lLCBbInpwbCIsICJkcGwiLCAiaXBsIiwgInRjcGwiXSk7CiAgICB0aGlzLmJhdGNoT3V0cHV0ID0gbnVsbDsKICAgIHRoaXMuZmxpcExhYmVsID0gbnVsbDsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBMYXlvdXQgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgImxheW91dCIsIFsicGFnaW5hdGUiLCAicGFuZWwiXSk7CiAgfQp9CmNsYXNzIExldmVsIGV4dGVuZHMgX3hmYV9vYmplY3QuSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibGV2ZWwiLCAwLCBuID0+IG4gPiAwKTsKICB9Cn0KY2xhc3MgTGluZWFyaXplZCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJsaW5lYXJpemVkIik7CiAgfQp9CmNsYXNzIExvY2FsZSBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlIik7CiAgfQp9CmNsYXNzIExvY2FsZVNldCBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9jYWxlU2V0Iik7CiAgfQp9CmNsYXNzIExvZyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibG9nIiwgdHJ1ZSk7CiAgICB0aGlzLm1vZGUgPSBudWxsOwogICAgdGhpcy50aHJlc2hvbGQgPSBudWxsOwogICAgdGhpcy50byA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgfQp9CmNsYXNzIE1hcEVsZW1lbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1hcCIsIHRydWUpOwogICAgdGhpcy5lcXVhdGUgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuZXF1YXRlUmFuZ2UgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgTWVkaXVtSW5mbyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibWVkaXVtSW5mbyIsIHRydWUpOwogICAgdGhpcy5tYXAgPSBudWxsOwogIH0KfQpjbGFzcyBNZXNzYWdlIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtZXNzYWdlIiwgdHJ1ZSk7CiAgICB0aGlzLm1zZ0lkID0gbnVsbDsKICAgIHRoaXMuc2V2ZXJpdHkgPSBudWxsOwogIH0KfQpjbGFzcyBNZXNzYWdpbmcgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1lc3NhZ2luZyIsIHRydWUpOwogICAgdGhpcy5tZXNzYWdlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIE1vZGUgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm1vZGUiLCBbImFwcGVuZCIsICJvdmVyd3JpdGUiXSk7CiAgfQp9CmNsYXNzIE1vZGlmeUFubm90cyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtb2RpZnlBbm5vdHMiKTsKICB9Cn0KY2xhc3MgTXNnSWQgZXh0ZW5kcyBfeGZhX29iamVjdC5JbnRlZ2VyT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJtc2dJZCIsIDEsIG4gPT4gbiA+PSAxKTsKICB9Cn0KY2xhc3MgTmFtZUF0dHIgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIm5hbWVBdHRyIik7CiAgfQp9CmNsYXNzIE5ldmVyRW1iZWQgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJuZXZlckVtYmVkIik7CiAgfQp9CmNsYXNzIE51bWJlck9mQ29waWVzIGV4dGVuZHMgX3hmYV9vYmplY3QuSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAibnVtYmVyT2ZDb3BpZXMiLCBudWxsLCBuID0+IG4gPj0gMiAmJiBuIDw9IDUpOwogIH0KfQpjbGFzcyBPcGVuQWN0aW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJvcGVuQWN0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDsKICB9Cn0KY2xhc3MgT3V0cHV0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJvdXRwdXQiLCB0cnVlKTsKICAgIHRoaXMudG8gPSBudWxsOwogICAgdGhpcy50eXBlID0gbnVsbDsKICAgIHRoaXMudXJpID0gbnVsbDsKICB9Cn0KY2xhc3MgT3V0cHV0QmluIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJvdXRwdXRCaW4iKTsKICB9Cn0KY2xhc3MgT3V0cHV0WFNMIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJvdXRwdXRYU0wiLCB0cnVlKTsKICAgIHRoaXMudXJpID0gbnVsbDsKICB9Cn0KY2xhc3MgT3ZlcnByaW50IGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJvdmVycHJpbnQiLCBbIm5vbmUiLCAiYm90aCIsICJkcmF3IiwgImZpZWxkIl0pOwogIH0KfQpjbGFzcyBQYWNrZXRzIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwYWNrZXRzIik7CiAgfQogIFtfeGZhX29iamVjdC4kZmluYWxpemVdKCkgewogICAgaWYgKHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID09PSAiKiIpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcih4ID0+IFsiY29uZmlnIiwgImRhdGFzZXRzIiwgInRlbXBsYXRlIiwgInhmZGYiLCAieHNsdCJdLmluY2x1ZGVzKHgpKTsKICB9Cn0KY2xhc3MgUGFnZU9mZnNldCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFnZU9mZnNldCIpOwogICAgdGhpcy54ID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMueCwKICAgICAgZGVmYXVsdFZhbHVlOiAidXNlWERDU2V0dGluZyIsCiAgICAgIHZhbGlkYXRlOiBuID0+IHRydWUKICAgIH0pOwogICAgdGhpcy55ID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMueSwKICAgICAgZGVmYXVsdFZhbHVlOiAidXNlWERDU2V0dGluZyIsCiAgICAgIHZhbGlkYXRlOiBuID0+IHRydWUKICAgIH0pOwogIH0KfQpjbGFzcyBQYWdlUmFuZ2UgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBhZ2VSYW5nZSIpOwogIH0KICBbX3hmYV9vYmplY3QuJGZpbmFsaXplXSgpIHsKICAgIGNvbnN0IG51bWJlcnMgPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSk7CiAgICBjb25zdCByYW5nZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG51bWJlcnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikgewogICAgICByYW5nZXMucHVzaChudW1iZXJzLnNsaWNlKGksIGkgKyAyKSk7CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHJhbmdlczsKICB9Cn0KY2xhc3MgUGFnaW5hdGlvbiBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFnaW5hdGlvbiIsIFsic2ltcGxleCIsICJkdXBsZXhTaG9ydEVkZ2UiLCAiZHVwbGV4TG9uZ0VkZ2UiXSk7CiAgfQp9CmNsYXNzIFBhZ2luYXRpb25PdmVycmlkZSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFnaW5hdGlvbk92ZXJyaWRlIiwgWyJub25lIiwgImZvcmNlRHVwbGV4IiwgImZvcmNlRHVwbGV4TG9uZ0VkZ2UiLCAiZm9yY2VEdXBsZXhTaG9ydEVkZ2UiLCAiZm9yY2VTaW1wbGV4Il0pOwogIH0KfQpjbGFzcyBQYXJ0IGV4dGVuZHMgX3hmYV9vYmplY3QuSW50ZWdlck9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGFydCIsIDEsIG4gPT4gZmFsc2UpOwogIH0KfQpjbGFzcyBQY2wgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBjbCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5iYXRjaE91dHB1dCA9IG51bGw7CiAgICB0aGlzLmZvbnRJbmZvID0gbnVsbDsKICAgIHRoaXMuam9nID0gbnVsbDsKICAgIHRoaXMubWVkaXVtSW5mbyA9IG51bGw7CiAgICB0aGlzLm91dHB1dEJpbiA9IG51bGw7CiAgICB0aGlzLnBhZ2VPZmZzZXQgPSBudWxsOwogICAgdGhpcy5zdGFwbGUgPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBQZGYgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBkZiIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5hZG9iZUV4dGVuc2lvbkxldmVsID0gbnVsbDsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5jb21wcmVzc2lvbiA9IG51bGw7CiAgICB0aGlzLmNyZWF0b3IgPSBudWxsOwogICAgdGhpcy5lbmNyeXB0aW9uID0gbnVsbDsKICAgIHRoaXMuZm9udEluZm8gPSBudWxsOwogICAgdGhpcy5pbnRlcmFjdGl2ZSA9IG51bGw7CiAgICB0aGlzLmxpbmVhcml6ZWQgPSBudWxsOwogICAgdGhpcy5vcGVuQWN0aW9uID0gbnVsbDsKICAgIHRoaXMucGRmYSA9IG51bGw7CiAgICB0aGlzLnByb2R1Y2VyID0gbnVsbDsKICAgIHRoaXMucmVuZGVyUG9saWN5ID0gbnVsbDsKICAgIHRoaXMuc2NyaXB0TW9kZWwgPSBudWxsOwogICAgdGhpcy5zaWxlbnRQcmludCA9IG51bGw7CiAgICB0aGlzLnN1Ym1pdEZvcm1hdCA9IG51bGw7CiAgICB0aGlzLnRhZ2dlZCA9IG51bGw7CiAgICB0aGlzLnZlcnNpb24gPSBudWxsOwogICAgdGhpcy52aWV3ZXJQcmVmZXJlbmNlcyA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFBkZmEgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBkZmEiLCB0cnVlKTsKICAgIHRoaXMuYW1kID0gbnVsbDsKICAgIHRoaXMuY29uZm9ybWFuY2UgPSBudWxsOwogICAgdGhpcy5pbmNsdWRlWERQQ29udGVudCA9IG51bGw7CiAgICB0aGlzLnBhcnQgPSBudWxsOwogIH0KfQpjbGFzcyBQZXJtaXNzaW9ucyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicGVybWlzc2lvbnMiLCB0cnVlKTsKICAgIHRoaXMuYWNjZXNzaWJsZUNvbnRlbnQgPSBudWxsOwogICAgdGhpcy5jaGFuZ2UgPSBudWxsOwogICAgdGhpcy5jb250ZW50Q29weSA9IG51bGw7CiAgICB0aGlzLmRvY3VtZW50QXNzZW1ibHkgPSBudWxsOwogICAgdGhpcy5mb3JtRmllbGRGaWxsaW5nID0gbnVsbDsKICAgIHRoaXMubW9kaWZ5QW5ub3RzID0gbnVsbDsKICAgIHRoaXMucGxhaW50ZXh0TWV0YWRhdGEgPSBudWxsOwogICAgdGhpcy5wcmludCA9IG51bGw7CiAgICB0aGlzLnByaW50SGlnaFF1YWxpdHkgPSBudWxsOwogIH0KfQpjbGFzcyBQaWNrVHJheUJ5UERGU2l6ZSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwaWNrVHJheUJ5UERGU2l6ZSIpOwogIH0KfQpjbGFzcyBQaWN0dXJlIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwaWN0dXJlIik7CiAgfQp9CmNsYXNzIFBsYWludGV4dE1ldGFkYXRhIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInBsYWludGV4dE1ldGFkYXRhIik7CiAgfQp9CmNsYXNzIFByZXNlbmNlIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmVzZW5jZSIsIFsicHJlc2VydmUiLCAiZGlzc29sdmUiLCAiZGlzc29sdmVTdHJ1Y3R1cmUiLCAiaWdub3JlIiwgInJlbW92ZSJdKTsKICB9Cn0KY2xhc3MgUHJlc2VudCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJlc2VudCIsIHRydWUpOwogICAgdGhpcy5iZWhhdmlvck92ZXJyaWRlID0gbnVsbDsKICAgIHRoaXMuY2FjaGUgPSBudWxsOwogICAgdGhpcy5jb21tb24gPSBudWxsOwogICAgdGhpcy5jb3BpZXMgPSBudWxsOwogICAgdGhpcy5kZXN0aW5hdGlvbiA9IG51bGw7CiAgICB0aGlzLmluY3JlbWVudGFsTWVyZ2UgPSBudWxsOwogICAgdGhpcy5sYXlvdXQgPSBudWxsOwogICAgdGhpcy5vdXRwdXQgPSBudWxsOwogICAgdGhpcy5vdmVycHJpbnQgPSBudWxsOwogICAgdGhpcy5wYWdpbmF0aW9uID0gbnVsbDsKICAgIHRoaXMucGFnaW5hdGlvbk92ZXJyaWRlID0gbnVsbDsKICAgIHRoaXMuc2NyaXB0ID0gbnVsbDsKICAgIHRoaXMudmFsaWRhdGUgPSBudWxsOwogICAgdGhpcy54ZHAgPSBudWxsOwogICAgdGhpcy5kcml2ZXIgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMubGFiZWxQcmludGVyID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnBjbCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy5wZGYgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMucHMgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICAgIHRoaXMuc3VibWl0VXJsID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLndlYkNsaWVudCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy56cGwgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgUHJpbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb24wMSB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJpbnQiKTsKICB9Cn0KY2xhc3MgUHJpbnRIaWdoUXVhbGl0eSBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcmludEhpZ2hRdWFsaXR5Iik7CiAgfQp9CmNsYXNzIFByaW50U2NhbGluZyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHJpbnRTY2FsaW5nIiwgWyJhcHBkZWZhdWx0IiwgIm5vU2NhbGluZyJdKTsKICB9Cn0KY2xhc3MgUHJpbnRlck5hbWUgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInByaW50ZXJOYW1lIik7CiAgfQp9CmNsYXNzIFByb2R1Y2VyIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJwcm9kdWNlciIpOwogIH0KfQpjbGFzcyBQcyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAicHMiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLmpvZyA9IG51bGw7CiAgICB0aGlzLm1lZGl1bUluZm8gPSBudWxsOwogICAgdGhpcy5vdXRwdXRCaW4gPSBudWxsOwogICAgdGhpcy5zdGFwbGUgPSBudWxsOwogICAgdGhpcy54ZGMgPSBudWxsOwogIH0KfQpjbGFzcyBSYW5nZSBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJhbmdlIik7CiAgfQogIFtfeGZhX29iamVjdC4kZmluYWxpemVdKCkgewogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKixccyovLCAyKS5tYXAocmFuZ2UgPT4gcmFuZ2Uuc3BsaXQoIi0iKS5tYXAoeCA9PiBwYXJzZUludCh4LnRyaW0oKSwgMTApKSkuZmlsdGVyKHJhbmdlID0+IHJhbmdlLmV2ZXJ5KHggPT4gIWlzTmFOKHgpKSkubWFwKHJhbmdlID0+IHsKICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJhbmdlLnB1c2gocmFuZ2VbMF0pOwogICAgICB9CiAgICAgIHJldHVybiByYW5nZTsKICAgIH0pOwogIH0KfQpjbGFzcyBSZWNvcmQgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZWNvcmQiKTsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKTsKICAgIGNvbnN0IG4gPSBwYXJzZUludCh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSwgMTApOwogICAgaWYgKCFpc05hTihuKSAmJiBuID49IDApIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBuOwogICAgfQogIH0KfQpjbGFzcyBSZWxldmFudCBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJlbGV2YW50Iik7CiAgfQogIFtfeGZhX29iamVjdC4kZmluYWxpemVdKCkgewogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pOwogIH0KfQpjbGFzcyBSZW5hbWUgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZW5hbWUiKTsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdLnRyaW0oKTsKICAgIGlmICh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInhtbCIpIHx8IG5ldyBSZWdFeHAoIltcXHB7TH1fXVtcXHB7TH1cXGQuX1xccHtNfS1dKiIsICJ1IikudGVzdCh0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSkpIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJYRkEgLSBSZW5hbWU6IGludmFsaWQgWEZBIG5hbWUiKTsKICAgIH0KICB9Cn0KY2xhc3MgUmVuZGVyUG9saWN5IGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJyZW5kZXJQb2xpY3kiLCBbInNlcnZlciIsICJjbGllbnQiXSk7CiAgfQp9CmNsYXNzIFJ1blNjcmlwdHMgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInJ1blNjcmlwdHMiLCBbImJvdGgiLCAiY2xpZW50IiwgIm5vbmUiLCAic2VydmVyIl0pOwogIH0KfQpjbGFzcyBTY3JpcHQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdCIsIHRydWUpOwogICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7CiAgICB0aGlzLmV4Y2x1ZGUgPSBudWxsOwogICAgdGhpcy5ydW5TY3JpcHRzID0gbnVsbDsKICB9Cn0KY2xhc3MgU2NyaXB0TW9kZWwgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNjcmlwdE1vZGVsIiwgWyJYRkEiLCAibm9uZSJdKTsKICB9Cn0KY2xhc3MgU2V2ZXJpdHkgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNldmVyaXR5IiwgWyJpZ25vcmUiLCAiZXJyb3IiLCAiaW5mb3JtYXRpb24iLCAidHJhY2UiLCAid2FybmluZyJdKTsKICB9Cn0KY2xhc3MgU2lsZW50UHJpbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInNpbGVudFByaW50IiwgdHJ1ZSk7CiAgICB0aGlzLmFkZFNpbGVudFByaW50ID0gbnVsbDsKICAgIHRoaXMucHJpbnRlck5hbWUgPSBudWxsOwogIH0KfQpjbGFzcyBTdGFwbGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXBsZSIpOwogICAgdGhpcy5tb2RlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMubW9kZSwgWyJ1c2VQcmludGVyU2V0dGluZyIsICJvbiIsICJvZmYiXSk7CiAgfQp9CmNsYXNzIFN0YXJ0Tm9kZSBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3RhcnROb2RlIik7CiAgfQp9CmNsYXNzIFN0YXJ0UGFnZSBleHRlbmRzIF94ZmFfb2JqZWN0LkludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN0YXJ0UGFnZSIsIDAsIG4gPT4gdHJ1ZSk7CiAgfQp9CmNsYXNzIFN1Ym1pdEZvcm1hdCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAic3VibWl0Rm9ybWF0IiwgWyJodG1sIiwgImRlbGVnYXRlIiwgImZkZiIsICJ4bWwiLCAicGRmIl0pOwogIH0KfQpjbGFzcyBTdWJtaXRVcmwgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1Ym1pdFVybCIpOwogIH0KfQpjbGFzcyBTdWJzZXRCZWxvdyBleHRlbmRzIF94ZmFfb2JqZWN0LkludGVnZXJPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1YnNldEJlbG93IiwgMTAwLCBuID0+IG4gPj0gMCAmJiBuIDw9IDEwMCk7CiAgfQp9CmNsYXNzIFN1cHByZXNzQmFubmVyIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uMDEgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInN1cHByZXNzQmFubmVyIik7CiAgfQp9CmNsYXNzIFRhZ2dlZCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbjAxIHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0YWdnZWQiKTsKICB9Cn0KY2xhc3MgVGVtcGxhdGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRlbXBsYXRlIiwgdHJ1ZSk7CiAgICB0aGlzLmJhc2UgPSBudWxsOwogICAgdGhpcy5yZWxldmFudCA9IG51bGw7CiAgICB0aGlzLnN0YXJ0UGFnZSA9IG51bGw7CiAgICB0aGlzLnVyaSA9IG51bGw7CiAgICB0aGlzLnhzbCA9IG51bGw7CiAgfQp9CmNsYXNzIFRocmVzaG9sZCBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidGhyZXNob2xkIiwgWyJ0cmFjZSIsICJlcnJvciIsICJpbmZvcm1hdGlvbiIsICJ3YXJuaW5nIl0pOwogIH0KfQpjbGFzcyBUbyBleHRlbmRzIF94ZmFfb2JqZWN0Lk9wdGlvbk9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidG8iLCBbIm51bGwiLCAibWVtb3J5IiwgInN0ZGVyciIsICJzdGRvdXQiLCAic3lzdGVtIiwgInVyaSJdKTsKICB9Cn0KY2xhc3MgVGVtcGxhdGVDYWNoZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidGVtcGxhdGVDYWNoZSIpOwogICAgdGhpcy5tYXhFbnRyaWVzID0gKDAsIF91dGlscy5nZXRJbnRlZ2VyKSh7CiAgICAgIGRhdGE6IGF0dHJpYnV0ZXMubWF4RW50cmllcywKICAgICAgZGVmYXVsdFZhbHVlOiA1LAogICAgICB2YWxpZGF0ZTogbiA9PiBuID49IDAKICAgIH0pOwogIH0KfQpjbGFzcyBUcmFjZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAidHJhY2UiLCB0cnVlKTsKICAgIHRoaXMuYXJlYSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBUcmFuc2Zvcm0gZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInRyYW5zZm9ybSIsIHRydWUpOwogICAgdGhpcy5ncm91cFBhcmVudCA9IG51bGw7CiAgICB0aGlzLmlmRW1wdHkgPSBudWxsOwogICAgdGhpcy5uYW1lQXR0ciA9IG51bGw7CiAgICB0aGlzLnBpY3R1cmUgPSBudWxsOwogICAgdGhpcy5wcmVzZW5jZSA9IG51bGw7CiAgICB0aGlzLnJlbmFtZSA9IG51bGw7CiAgICB0aGlzLndoaXRlc3BhY2UgPSBudWxsOwogIH0KfQpjbGFzcyBUeXBlIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ0eXBlIiwgWyJub25lIiwgImFzY2lpODUiLCAiYXNjaWlIZXgiLCAiY2NpdHRmYXgiLCAiZmxhdGUiLCAibHp3IiwgInJ1bkxlbmd0aCIsICJuYXRpdmUiLCAieGRwIiwgIm1lcmdlZFhEUCJdKTsKICB9Cn0KY2xhc3MgVXJpIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ1cmkiKTsKICB9Cn0KY2xhc3MgVmFsaWRhdGUgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZhbGlkYXRlIiwgWyJwcmVTdWJtaXQiLCAicHJlUHJpbnQiLCAicHJlRXhlY3V0ZSIsICJwcmVTYXZlIl0pOwogIH0KfQpjbGFzcyBWYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIik7CiAgfQogIFtfeGZhX29iamVjdC4kZmluYWxpemVdKCkgewogICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XS50cmltKCkuc3BsaXQoL1xzKy8pLmZpbHRlcih4ID0+IFsiZG9jUmVhZHkiLCAicG9zdFNpZ24iXS5pbmNsdWRlcyh4KSk7CiAgfQp9CmNsYXNzIFZhbGlkYXRpb25NZXNzYWdpbmcgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgInZhbGlkYXRpb25NZXNzYWdpbmciLCBbImFsbE1lc3NhZ2VzSW5kaXZpZHVhbGx5IiwgImFsbE1lc3NhZ2VzVG9nZXRoZXIiLCAiZmlyc3RNZXNzYWdlT25seSIsICJub01lc3NhZ2VzIl0pOwogIH0KfQpjbGFzcyBWZXJzaW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuT3B0aW9uT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ2ZXJzaW9uIiwgWyIxLjciLCAiMS42IiwgIjEuNSIsICIxLjQiLCAiMS4zIiwgIjEuMiJdKTsKICB9Cn0KY2xhc3MgVmVyc2lvbkNvbnRyb2wgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIlZlcnNpb25Db250cm9sIik7CiAgICB0aGlzLm91dHB1dEJlbG93ID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMub3V0cHV0QmVsb3csIFsid2FybiIsICJlcnJvciIsICJ1cGRhdGUiXSk7CiAgICB0aGlzLnNvdXJjZUFib3ZlID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMuc291cmNlQWJvdmUsIFsid2FybiIsICJlcnJvciJdKTsKICAgIHRoaXMuc291cmNlQmVsb3cgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5zb3VyY2VCZWxvdywgWyJ1cGRhdGUiLCAibWFpbnRhaW4iXSk7CiAgfQp9CmNsYXNzIFZpZXdlclByZWZlcmVuY2VzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ2aWV3ZXJQcmVmZXJlbmNlcyIsIHRydWUpOwogICAgdGhpcy5BREJFX0pTQ29uc29sZSA9IG51bGw7CiAgICB0aGlzLkFEQkVfSlNEZWJ1Z2dlciA9IG51bGw7CiAgICB0aGlzLmFkZFZpZXdlclByZWZlcmVuY2VzID0gbnVsbDsKICAgIHRoaXMuZHVwbGV4T3B0aW9uID0gbnVsbDsKICAgIHRoaXMuZW5mb3JjZSA9IG51bGw7CiAgICB0aGlzLm51bWJlck9mQ29waWVzID0gbnVsbDsKICAgIHRoaXMucGFnZVJhbmdlID0gbnVsbDsKICAgIHRoaXMucGlja1RyYXlCeVBERlNpemUgPSBudWxsOwogICAgdGhpcy5wcmludFNjYWxpbmcgPSBudWxsOwogIH0KfQpjbGFzcyBXZWJDbGllbnQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndlYkNsaWVudCIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lID8gYXR0cmlidXRlcy5uYW1lLnRyaW0oKSA6ICIiOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIFdoaXRlc3BhY2UgZXh0ZW5kcyBfeGZhX29iamVjdC5PcHRpb25PYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTkZJR19OU19JRCwgIndoaXRlc3BhY2UiLCBbInByZXNlcnZlIiwgImx0cmltIiwgIm5vcm1hbGl6ZSIsICJydHJpbSIsICJ0cmltIl0pOwogIH0KfQpjbGFzcyBXaW5kb3cgZXh0ZW5kcyBfeGZhX29iamVjdC5Db250ZW50T2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ3aW5kb3ciKTsKICB9CiAgW194ZmFfb2JqZWN0LiRmaW5hbGl6ZV0oKSB7CiAgICBjb25zdCBwYWlyID0gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0udHJpbSgpLnNwbGl0KC9ccyosXHMqLywgMikubWFwKHggPT4gcGFyc2VJbnQoeCwgMTApKTsKICAgIGlmIChwYWlyLnNvbWUoeCA9PiBpc05hTih4KSkpIHsKICAgICAgdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0gPSBbMCwgMF07CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChwYWlyLmxlbmd0aCA9PT0gMSkgewogICAgICBwYWlyLnB1c2gocGFpclswXSk7CiAgICB9CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSA9IHBhaXI7CiAgfQp9CmNsYXNzIFhkYyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAieGRjIiwgdHJ1ZSk7CiAgICB0aGlzLnVyaSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy54c2wgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgWGRwIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ4ZHAiLCB0cnVlKTsKICAgIHRoaXMucGFja2V0cyA9IG51bGw7CiAgfQp9CmNsYXNzIFhzbCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09ORklHX05TX0lELCAieHNsIiwgdHJ1ZSk7CiAgICB0aGlzLmRlYnVnID0gbnVsbDsKICAgIHRoaXMudXJpID0gbnVsbDsKICB9Cn0KY2xhc3MgWnBsIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05GSUdfTlNfSUQsICJ6cGwiLCB0cnVlKTsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSA/IGF0dHJpYnV0ZXMubmFtZS50cmltKCkgOiAiIjsKICAgIHRoaXMuYmF0Y2hPdXRwdXQgPSBudWxsOwogICAgdGhpcy5mbGlwTGFiZWwgPSBudWxsOwogICAgdGhpcy5mb250SW5mbyA9IG51bGw7CiAgICB0aGlzLnhkYyA9IG51bGw7CiAgfQp9CmNsYXNzIENvbmZpZ05hbWVzcGFjZSB7CiAgc3RhdGljIFtfbmFtZXNwYWNlcy4kYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChDb25maWdOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIENvbmZpZ05hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBhY3JvYmF0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFjcm9iYXQoYXR0cnMpOwogIH0KICBzdGF0aWMgYWNyb2JhdDcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQWNyb2JhdDcoYXR0cnMpOwogIH0KICBzdGF0aWMgQURCRV9KU0NvbnNvbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQURCRV9KU0NvbnNvbGUoYXR0cnMpOwogIH0KICBzdGF0aWMgQURCRV9KU0RlYnVnZ2VyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFEQkVfSlNEZWJ1Z2dlcihhdHRycyk7CiAgfQogIHN0YXRpYyBhZGRTaWxlbnRQcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBBZGRTaWxlbnRQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBhZGRWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBBZGRWaWV3ZXJQcmVmZXJlbmNlcyhhdHRycyk7CiAgfQogIHN0YXRpYyBhZGp1c3REYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFkanVzdERhdGEoYXR0cnMpOwogIH0KICBzdGF0aWMgYWRvYmVFeHRlbnNpb25MZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBBZG9iZUV4dGVuc2lvbkxldmVsKGF0dHJzKTsKICB9CiAgc3RhdGljIGFnZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFnZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGFsd2F5c0VtYmVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEFsd2F5c0VtYmVkKGF0dHJzKTsKICB9CiAgc3RhdGljIGFtZChhdHRycykgewogICAgcmV0dXJuIG5ldyBBbWQoYXR0cnMpOwogIH0KICBzdGF0aWMgYXJlYShhdHRycykgewogICAgcmV0dXJuIG5ldyBBcmVhKGF0dHJzKTsKICB9CiAgc3RhdGljIGF0dHJpYnV0ZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQXR0cmlidXRlcyhhdHRycyk7CiAgfQogIHN0YXRpYyBhdXRvU2F2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBBdXRvU2F2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBiYXNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEJhc2UoYXR0cnMpOwogIH0KICBzdGF0aWMgYmF0Y2hPdXRwdXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQmF0Y2hPdXRwdXQoYXR0cnMpOwogIH0KICBzdGF0aWMgYmVoYXZpb3JPdmVycmlkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBCZWhhdmlvck92ZXJyaWRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNhY2hlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENhY2hlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNoYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBDaGFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29tbW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbW1vbihhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb21wcmVzcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzT2JqZWN0U3RyZWFtKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbXByZXNzaW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvbXByZXNzaW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIGNvbmZpZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDb25maWcoYXR0cnMpOwogIH0KICBzdGF0aWMgY29uZm9ybWFuY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29uZm9ybWFuY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgY29udGVudENvcHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29udGVudENvcHkoYXR0cnMpOwogIH0KICBzdGF0aWMgY29waWVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENvcGllcyhhdHRycyk7CiAgfQogIHN0YXRpYyBjcmVhdG9yKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IENyZWF0b3IoYXR0cnMpOwogIH0KICBzdGF0aWMgY3VycmVudFBhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ3VycmVudFBhZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0YShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlYnVnKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERlYnVnKGF0dHJzKTsKICB9CiAgc3RhdGljIGRlZmF1bHRUeXBlZmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZWZhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgZGVzdGluYXRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGVzdGluYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgZG9jdW1lbnRBc3NlbWJseShhdHRycykgewogICAgcmV0dXJuIG5ldyBEb2N1bWVudEFzc2VtYmx5KGF0dHJzKTsKICB9CiAgc3RhdGljIGRyaXZlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBEcml2ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZHVwbGV4T3B0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER1cGxleE9wdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBkeW5hbWljUmVuZGVyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IER5bmFtaWNSZW5kZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgZW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW1iZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgZW5jcnlwdChhdHRycykgewogICAgcmV0dXJuIG5ldyBFbmNyeXB0KGF0dHJzKTsKICB9CiAgc3RhdGljIGVuY3J5cHRpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbihhdHRycyk7CiAgfQogIHN0YXRpYyBlbmNyeXB0aW9uTGV2ZWwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5jcnlwdGlvbkxldmVsKGF0dHJzKTsKICB9CiAgc3RhdGljIGVuZm9yY2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRW5mb3JjZShhdHRycyk7CiAgfQogIHN0YXRpYyBlcXVhdGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXF1YXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIGVxdWF0ZVJhbmdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVxdWF0ZVJhbmdlKGF0dHJzKTsKICB9CiAgc3RhdGljIGV4Y2x1ZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbHVkZShhdHRycyk7CiAgfQogIHN0YXRpYyBleGNsdWRlTlMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRXhjbHVkZU5TKGF0dHJzKTsKICB9CiAgc3RhdGljIGZsaXBMYWJlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBGbGlwTGFiZWwoYXR0cnMpOwogIH0KICBzdGF0aWMgZm9udEluZm8oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRm9udEluZm8oYXR0cnMpOwogIH0KICBzdGF0aWMgZm9ybUZpZWxkRmlsbGluZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBGb3JtRmllbGRGaWxsaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIGdyb3VwUGFyZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEdyb3VwUGFyZW50KGF0dHJzKTsKICB9CiAgc3RhdGljIGlmRW1wdHkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSWZFbXB0eShhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNsdWRlWERQQ29udGVudChhdHRycykgewogICAgcmV0dXJuIG5ldyBJbmNsdWRlWERQQ29udGVudChhdHRycyk7CiAgfQogIHN0YXRpYyBpbmNyZW1lbnRhbExvYWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxMb2FkKGF0dHJzKTsKICB9CiAgc3RhdGljIGluY3JlbWVudGFsTWVyZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxNZXJnZShhdHRycyk7CiAgfQogIHN0YXRpYyBpbnRlcmFjdGl2ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBJbnRlcmFjdGl2ZShhdHRycyk7CiAgfQogIHN0YXRpYyBqb2coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgSm9nKGF0dHJzKTsKICB9CiAgc3RhdGljIGxhYmVsUHJpbnRlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBMYWJlbFByaW50ZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgbGF5b3V0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExheW91dChhdHRycyk7CiAgfQogIHN0YXRpYyBsZXZlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBMZXZlbChhdHRycyk7CiAgfQogIHN0YXRpYyBsaW5lYXJpemVkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExpbmVhcml6ZWQoYXR0cnMpOwogIH0KICBzdGF0aWMgbG9jYWxlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IExvY2FsZShhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGVTZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTG9jYWxlU2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIGxvZyhhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2coYXR0cnMpOwogIH0KICBzdGF0aWMgbWFwKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1hcEVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVkaXVtSW5mbyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZWRpdW1JbmZvKGF0dHJzKTsKICB9CiAgc3RhdGljIG1lc3NhZ2UoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVzc2FnZShhdHRycyk7CiAgfQogIHN0YXRpYyBtZXNzYWdpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVzc2FnaW5nKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vZGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTW9kZShhdHRycyk7CiAgfQogIHN0YXRpYyBtb2RpZnlBbm5vdHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTW9kaWZ5QW5ub3RzKGF0dHJzKTsKICB9CiAgc3RhdGljIG1zZ0lkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1zZ0lkKGF0dHJzKTsKICB9CiAgc3RhdGljIG5hbWVBdHRyKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE5hbWVBdHRyKGF0dHJzKTsKICB9CiAgc3RhdGljIG5ldmVyRW1iZWQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTmV2ZXJFbWJlZChhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJPZkNvcGllcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBOdW1iZXJPZkNvcGllcyhhdHRycyk7CiAgfQogIHN0YXRpYyBvcGVuQWN0aW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE9wZW5BY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgb3V0cHV0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE91dHB1dChhdHRycyk7CiAgfQogIHN0YXRpYyBvdXRwdXRCaW4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgT3V0cHV0QmluKGF0dHJzKTsKICB9CiAgc3RhdGljIG91dHB1dFhTTChhdHRycykgewogICAgcmV0dXJuIG5ldyBPdXRwdXRYU0woYXR0cnMpOwogIH0KICBzdGF0aWMgb3ZlcnByaW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE92ZXJwcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBwYWNrZXRzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBhY2tldHMoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFnZU9mZnNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWdlT2Zmc2V0KGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2VSYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWdlUmFuZ2UoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFnaW5hdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWdpbmF0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIHBhZ2luYXRpb25PdmVycmlkZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQYWdpbmF0aW9uT3ZlcnJpZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgcGFydChhdHRycykgewogICAgcmV0dXJuIG5ldyBQYXJ0KGF0dHJzKTsKICB9CiAgc3RhdGljIHBjbChhdHRycykgewogICAgcmV0dXJuIG5ldyBQY2woYXR0cnMpOwogIH0KICBzdGF0aWMgcGRmKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBkZihhdHRycyk7CiAgfQogIHN0YXRpYyBwZGZhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBkZmEoYXR0cnMpOwogIH0KICBzdGF0aWMgcGVybWlzc2lvbnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGVybWlzc2lvbnMoYXR0cnMpOwogIH0KICBzdGF0aWMgcGlja1RyYXlCeVBERlNpemUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUGlja1RyYXlCeVBERlNpemUoYXR0cnMpOwogIH0KICBzdGF0aWMgcGljdHVyZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQaWN0dXJlKGF0dHJzKTsKICB9CiAgc3RhdGljIHBsYWludGV4dE1ldGFkYXRhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFBsYWludGV4dE1ldGFkYXRhKGF0dHJzKTsKICB9CiAgc3RhdGljIHByZXNlbmNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByZXNlbmNlKGF0dHJzKTsKICB9CiAgc3RhdGljIHByZXNlbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUHJlc2VudChhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludEhpZ2hRdWFsaXR5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50SGlnaFF1YWxpdHkoYXR0cnMpOwogIH0KICBzdGF0aWMgcHJpbnRTY2FsaW5nKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFByaW50U2NhbGluZyhhdHRycyk7CiAgfQogIHN0YXRpYyBwcmludGVyTmFtZShhdHRycykgewogICAgcmV0dXJuIG5ldyBQcmludGVyTmFtZShhdHRycyk7CiAgfQogIHN0YXRpYyBwcm9kdWNlcihhdHRycykgewogICAgcmV0dXJuIG5ldyBQcm9kdWNlcihhdHRycyk7CiAgfQogIHN0YXRpYyBwcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBQcyhhdHRycyk7CiAgfQogIHN0YXRpYyByYW5nZShhdHRycykgewogICAgcmV0dXJuIG5ldyBSYW5nZShhdHRycyk7CiAgfQogIHN0YXRpYyByZWNvcmQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUmVjb3JkKGF0dHJzKTsKICB9CiAgc3RhdGljIHJlbGV2YW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbGV2YW50KGF0dHJzKTsKICB9CiAgc3RhdGljIHJlbmFtZShhdHRycykgewogICAgcmV0dXJuIG5ldyBSZW5hbWUoYXR0cnMpOwogIH0KICBzdGF0aWMgcmVuZGVyUG9saWN5KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJlbmRlclBvbGljeShhdHRycyk7CiAgfQogIHN0YXRpYyBydW5TY3JpcHRzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFJ1blNjcmlwdHMoYXR0cnMpOwogIH0KICBzdGF0aWMgc2NyaXB0KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNjcmlwdChhdHRycyk7CiAgfQogIHN0YXRpYyBzY3JpcHRNb2RlbChhdHRycykgewogICAgcmV0dXJuIG5ldyBTY3JpcHRNb2RlbChhdHRycyk7CiAgfQogIHN0YXRpYyBzZXZlcml0eShhdHRycykgewogICAgcmV0dXJuIG5ldyBTZXZlcml0eShhdHRycyk7CiAgfQogIHN0YXRpYyBzaWxlbnRQcmludChhdHRycykgewogICAgcmV0dXJuIG5ldyBTaWxlbnRQcmludChhdHRycyk7CiAgfQogIHN0YXRpYyBzdGFwbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3RhcGxlKGF0dHJzKTsKICB9CiAgc3RhdGljIHN0YXJ0Tm9kZShhdHRycykgewogICAgcmV0dXJuIG5ldyBTdGFydE5vZGUoYXR0cnMpOwogIH0KICBzdGF0aWMgc3RhcnRQYWdlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFN0YXJ0UGFnZShhdHRycyk7CiAgfQogIHN0YXRpYyBzdWJtaXRGb3JtYXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VibWl0Rm9ybWF0KGF0dHJzKTsKICB9CiAgc3RhdGljIHN1Ym1pdFVybChhdHRycykgewogICAgcmV0dXJuIG5ldyBTdWJtaXRVcmwoYXR0cnMpOwogIH0KICBzdGF0aWMgc3Vic2V0QmVsb3coYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3Vic2V0QmVsb3coYXR0cnMpOwogIH0KICBzdGF0aWMgc3VwcHJlc3NCYW5uZXIoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgU3VwcHJlc3NCYW5uZXIoYXR0cnMpOwogIH0KICBzdGF0aWMgdGFnZ2VkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRhZ2dlZChhdHRycyk7CiAgfQogIHN0YXRpYyB0ZW1wbGF0ZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZShhdHRycyk7CiAgfQogIHN0YXRpYyB0ZW1wbGF0ZUNhY2hlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRlbXBsYXRlQ2FjaGUoYXR0cnMpOwogIH0KICBzdGF0aWMgdGhyZXNob2xkKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRocmVzaG9sZChhdHRycyk7CiAgfQogIHN0YXRpYyB0byhhdHRycykgewogICAgcmV0dXJuIG5ldyBUbyhhdHRycyk7CiAgfQogIHN0YXRpYyB0cmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUcmFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB0cmFuc2Zvcm0oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHJhbnNmb3JtKGF0dHJzKTsKICB9CiAgc3RhdGljIHR5cGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHlwZShhdHRycyk7CiAgfQogIHN0YXRpYyB1cmkoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVXJpKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzKGF0dHJzKTsKICB9CiAgc3RhdGljIHZhbGlkYXRpb25NZXNzYWdpbmcoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2luZyhhdHRycyk7CiAgfQogIHN0YXRpYyB2ZXJzaW9uKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFZlcnNpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgdmVyc2lvbkNvbnRyb2woYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmVyc2lvbkNvbnRyb2woYXR0cnMpOwogIH0KICBzdGF0aWMgdmlld2VyUHJlZmVyZW5jZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVmlld2VyUHJlZmVyZW5jZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgd2ViQ2xpZW50KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFdlYkNsaWVudChhdHRycyk7CiAgfQogIHN0YXRpYyB3aGl0ZXNwYWNlKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFdoaXRlc3BhY2UoYXR0cnMpOwogIH0KICBzdGF0aWMgd2luZG93KGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFdpbmRvdyhhdHRycyk7CiAgfQogIHN0YXRpYyB4ZGMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWGRjKGF0dHJzKTsKICB9CiAgc3RhdGljIHhkcChhdHRycykgewogICAgcmV0dXJuIG5ldyBYZHAoYXR0cnMpOwogIH0KICBzdGF0aWMgeHNsKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFhzbChhdHRycyk7CiAgfQogIHN0YXRpYyB6cGwoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWnBsKGF0dHJzKTsKICB9Cn0KZXhwb3J0cy5Db25maWdOYW1lc3BhY2UgPSBDb25maWdOYW1lc3BhY2U7CgovKioqLyB9KSwKLyogOTMgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5Db25uZWN0aW9uU2V0TmFtZXNwYWNlID0gdm9pZCAwOwp2YXIgX25hbWVzcGFjZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CmNvbnN0IENPTk5FQ1RJT05fU0VUX05TX0lEID0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLmNvbm5lY3Rpb25TZXQuaWQ7CmNsYXNzIENvbm5lY3Rpb25TZXQgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiY29ubmVjdGlvblNldCIsIHRydWUpOwogICAgdGhpcy53c2RsQ29ubmVjdGlvbiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogICAgdGhpcy54bWxDb25uZWN0aW9uID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnhzZENvbm5lY3Rpb24gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoKTsKICB9Cn0KY2xhc3MgRWZmZWN0aXZlSW5wdXRQb2xpY3kgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAiZWZmZWN0aXZlSW5wdXRQb2xpY3kiKTsKICAgIHRoaXMuaWQgPSBhdHRyaWJ1dGVzLmlkIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51c2UgPSBhdHRyaWJ1dGVzLnVzZSB8fCAiIjsKICAgIHRoaXMudXNlaHJlZiA9IGF0dHJpYnV0ZXMudXNlaHJlZiB8fCAiIjsKICB9Cn0KY2xhc3MgRWZmZWN0aXZlT3V0cHV0UG9saWN5IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgImVmZmVjdGl2ZU91dHB1dFBvbGljeSIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBPcGVyYXRpb24gZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAib3BlcmF0aW9uIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMuaW5wdXQgPSBhdHRyaWJ1dGVzLmlucHV0IHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5vdXRwdXQgPSBhdHRyaWJ1dGVzLm91dHB1dCB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFJvb3RFbGVtZW50IGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInJvb3RFbGVtZW50Iik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFNvYXBBY3Rpb24gZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAic29hcEFjdGlvbiIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBTb2FwQWRkcmVzcyBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJzb2FwQWRkcmVzcyIpOwogICAgdGhpcy5pZCA9IGF0dHJpYnV0ZXMuaWQgfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnVzZSA9IGF0dHJpYnV0ZXMudXNlIHx8ICIiOwogICAgdGhpcy51c2VocmVmID0gYXR0cmlidXRlcy51c2VocmVmIHx8ICIiOwogIH0KfQpjbGFzcyBVcmkgZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKENPTk5FQ1RJT05fU0VUX05TX0lELCAidXJpIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFdzZGxBZGRyZXNzIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgIndzZGxBZGRyZXNzIik7CiAgICB0aGlzLmlkID0gYXR0cmlidXRlcy5pZCB8fCAiIjsKICAgIHRoaXMubmFtZSA9IGF0dHJpYnV0ZXMubmFtZSB8fCAiIjsKICAgIHRoaXMudXNlID0gYXR0cmlidXRlcy51c2UgfHwgIiI7CiAgICB0aGlzLnVzZWhyZWYgPSBhdHRyaWJ1dGVzLnVzZWhyZWYgfHwgIiI7CiAgfQp9CmNsYXNzIFdzZGxDb25uZWN0aW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgIndzZGxDb25uZWN0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGFEZXNjcmlwdGlvbiA9IGF0dHJpYnV0ZXMuZGF0YURlc2NyaXB0aW9uIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy5lZmZlY3RpdmVJbnB1dFBvbGljeSA9IG51bGw7CiAgICB0aGlzLmVmZmVjdGl2ZU91dHB1dFBvbGljeSA9IG51bGw7CiAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7CiAgICB0aGlzLnNvYXBBY3Rpb24gPSBudWxsOwogICAgdGhpcy5zb2FwQWRkcmVzcyA9IG51bGw7CiAgICB0aGlzLndzZGxBZGRyZXNzID0gbnVsbDsKICB9Cn0KY2xhc3MgWG1sQ29ubmVjdGlvbiBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoQ09OTkVDVElPTl9TRVRfTlNfSUQsICJ4bWxDb25uZWN0aW9uIiwgdHJ1ZSk7CiAgICB0aGlzLmRhdGFEZXNjcmlwdGlvbiA9IGF0dHJpYnV0ZXMuZGF0YURlc2NyaXB0aW9uIHx8ICIiOwogICAgdGhpcy5uYW1lID0gYXR0cmlidXRlcy5uYW1lIHx8ICIiOwogICAgdGhpcy51cmkgPSBudWxsOwogIH0KfQpjbGFzcyBYc2RDb25uZWN0aW9uIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihDT05ORUNUSU9OX1NFVF9OU19JRCwgInhzZENvbm5lY3Rpb24iLCB0cnVlKTsKICAgIHRoaXMuZGF0YURlc2NyaXB0aW9uID0gYXR0cmlidXRlcy5kYXRhRGVzY3JpcHRpb24gfHwgIiI7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfHwgIiI7CiAgICB0aGlzLnJvb3RFbGVtZW50ID0gbnVsbDsKICAgIHRoaXMudXJpID0gbnVsbDsKICB9Cn0KY2xhc3MgQ29ubmVjdGlvblNldE5hbWVzcGFjZSB7CiAgc3RhdGljIFtfbmFtZXNwYWNlcy4kYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChDb25uZWN0aW9uU2V0TmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBDb25uZWN0aW9uU2V0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGNvbm5lY3Rpb25TZXQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ29ubmVjdGlvblNldChhdHRycyk7CiAgfQogIHN0YXRpYyBlZmZlY3RpdmVJbnB1dFBvbGljeShhdHRycykgewogICAgcmV0dXJuIG5ldyBFZmZlY3RpdmVJbnB1dFBvbGljeShhdHRycyk7CiAgfQogIHN0YXRpYyBlZmZlY3RpdmVPdXRwdXRQb2xpY3koYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRWZmZWN0aXZlT3V0cHV0UG9saWN5KGF0dHJzKTsKICB9CiAgc3RhdGljIG9wZXJhdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBPcGVyYXRpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgcm9vdEVsZW1lbnQoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgUm9vdEVsZW1lbnQoYXR0cnMpOwogIH0KICBzdGF0aWMgc29hcEFjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBTb2FwQWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIHNvYXBBZGRyZXNzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFNvYXBBZGRyZXNzKGF0dHJzKTsKICB9CiAgc3RhdGljIHVyaShhdHRycykgewogICAgcmV0dXJuIG5ldyBVcmkoYXR0cnMpOwogIH0KICBzdGF0aWMgd3NkbEFkZHJlc3MoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV3NkbEFkZHJlc3MoYXR0cnMpOwogIH0KICBzdGF0aWMgd3NkbENvbm5lY3Rpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgV3NkbENvbm5lY3Rpb24oYXR0cnMpOwogIH0KICBzdGF0aWMgeG1sQ29ubmVjdGlvbihhdHRycykgewogICAgcmV0dXJuIG5ldyBYbWxDb25uZWN0aW9uKGF0dHJzKTsKICB9CiAgc3RhdGljIHhzZENvbm5lY3Rpb24oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgWHNkQ29ubmVjdGlvbihhdHRycyk7CiAgfQp9CmV4cG9ydHMuQ29ubmVjdGlvblNldE5hbWVzcGFjZSA9IENvbm5lY3Rpb25TZXROYW1lc3BhY2U7CgovKioqLyB9KSwKLyogOTQgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5EYXRhc2V0c05hbWVzcGFjZSA9IHZvaWQgMDsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfbmFtZXNwYWNlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwpjb25zdCBEQVRBU0VUU19OU19JRCA9IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy5kYXRhc2V0cy5pZDsKY2xhc3MgRGF0YSBleHRlbmRzIF94ZmFfb2JqZWN0LlhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhIiwgYXR0cmlidXRlcyk7CiAgfQogIFtfeGZhX29iamVjdC4kaXNOc0Fnbm9zdGljXSgpIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBEYXRhc2V0cyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoREFUQVNFVFNfTlNfSUQsICJkYXRhc2V0cyIsIHRydWUpOwogICAgdGhpcy5kYXRhID0gbnVsbDsKICAgIHRoaXMuU2lnbmF0dXJlID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRvbkNoaWxkXShjaGlsZCkgewogICAgY29uc3QgbmFtZSA9IGNoaWxkW194ZmFfb2JqZWN0LiRub2RlTmFtZV07CiAgICBpZiAobmFtZSA9PT0gImRhdGEiICYmIGNoaWxkW194ZmFfb2JqZWN0LiRuYW1lc3BhY2VJZF0gPT09IERBVEFTRVRTX05TX0lEIHx8IG5hbWUgPT09ICJTaWduYXR1cmUiICYmIGNoaWxkW194ZmFfb2JqZWN0LiRuYW1lc3BhY2VJZF0gPT09IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy5zaWduYXR1cmUuaWQpIHsKICAgICAgdGhpc1tuYW1lXSA9IGNoaWxkOwogICAgfQogICAgdGhpc1tfeGZhX29iamVjdC4kYXBwZW5kQ2hpbGRdKGNoaWxkKTsKICB9Cn0KY2xhc3MgRGF0YXNldHNOYW1lc3BhY2UgewogIHN0YXRpYyBbX25hbWVzcGFjZXMuJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoRGF0YXNldHNOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIERhdGFzZXRzTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGRhdGFzZXRzKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgRGF0YXNldHMoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBkYXRhKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgRGF0YShhdHRyaWJ1dGVzKTsKICB9Cn0KZXhwb3J0cy5EYXRhc2V0c05hbWVzcGFjZSA9IERhdGFzZXRzTmFtZXNwYWNlOwoKLyoqKi8gfSksCi8qIDk1ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuTG9jYWxlU2V0TmFtZXNwYWNlID0gdm9pZCAwOwp2YXIgX25hbWVzcGFjZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc5KTsKY29uc3QgTE9DQUxFX1NFVF9OU19JRCA9IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy5sb2NhbGVTZXQuaWQ7CmNsYXNzIENhbGVuZGFyU3ltYm9scyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImNhbGVuZGFyU3ltYm9scyIsIHRydWUpOwogICAgdGhpcy5uYW1lID0gImdyZWdvcmlhbiI7CiAgICB0aGlzLmRheU5hbWVzID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KDIpOwogICAgdGhpcy5lcmFOYW1lcyA9IG51bGw7CiAgICB0aGlzLm1lcmlkaWVtTmFtZXMgPSBudWxsOwogICAgdGhpcy5tb250aE5hbWVzID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KDIpOwogIH0KfQpjbGFzcyBDdXJyZW5jeVN5bWJvbCBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImN1cnJlbmN5U3ltYm9sIik7CiAgICB0aGlzLm5hbWUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5uYW1lLCBbInN5bWJvbCIsICJpc29uYW1lIiwgImRlY2ltYWwiXSk7CiAgfQp9CmNsYXNzIEN1cnJlbmN5U3ltYm9scyBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgImN1cnJlbmN5U3ltYm9scyIsIHRydWUpOwogICAgdGhpcy5jdXJyZW5jeVN5bWJvbCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgzKTsKICB9Cn0KY2xhc3MgRGF0ZVBhdHRlcm4gZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJkYXRlUGF0dGVybiIpOwogICAgdGhpcy5uYW1lID0gKDAsIF91dGlscy5nZXRTdHJpbmdPcHRpb24pKGF0dHJpYnV0ZXMubmFtZSwgWyJmdWxsIiwgImxvbmciLCAibWVkIiwgInNob3J0Il0pOwogIH0KfQpjbGFzcyBEYXRlUGF0dGVybnMgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJkYXRlUGF0dGVybnMiLCB0cnVlKTsKICAgIHRoaXMuZGF0ZVBhdHRlcm4gPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoNCk7CiAgfQp9CmNsYXNzIERhdGVUaW1lU3ltYm9scyBleHRlbmRzIF94ZmFfb2JqZWN0LkNvbnRlbnRPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJkYXRlVGltZVN5bWJvbHMiKTsKICB9Cn0KY2xhc3MgRGF5IGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF5Iik7CiAgfQp9CmNsYXNzIERheU5hbWVzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZGF5TmFtZXMiLCB0cnVlKTsKICAgIHRoaXMuYWJiciA9ICgwLCBfdXRpbHMuZ2V0SW50ZWdlcikoewogICAgICBkYXRhOiBhdHRyaWJ1dGVzLmFiYnIsCiAgICAgIGRlZmF1bHRWYWx1ZTogMCwKICAgICAgdmFsaWRhdGU6IHggPT4geCA9PT0gMQogICAgfSk7CiAgICB0aGlzLmRheSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSg3KTsKICB9Cn0KY2xhc3MgRXJhIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZXJhIik7CiAgfQp9CmNsYXNzIEVyYU5hbWVzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAiZXJhTmFtZXMiLCB0cnVlKTsKICAgIHRoaXMuZXJhID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KDIpOwogIH0KfQpjbGFzcyBMb2NhbGUgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJsb2NhbGUiLCB0cnVlKTsKICAgIHRoaXMuZGVzYyA9IGF0dHJpYnV0ZXMuZGVzYyB8fCAiIjsKICAgIHRoaXMubmFtZSA9ICJpc29uYW1lIjsKICAgIHRoaXMuY2FsZW5kYXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuY3VycmVuY3lTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMuZGF0ZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMuZGF0ZVRpbWVTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMubnVtYmVyUGF0dGVybnMgPSBudWxsOwogICAgdGhpcy5udW1iZXJTeW1ib2xzID0gbnVsbDsKICAgIHRoaXMudGltZVBhdHRlcm5zID0gbnVsbDsKICAgIHRoaXMudHlwZUZhY2VzID0gbnVsbDsKICB9Cn0KY2xhc3MgTG9jYWxlU2V0IGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibG9jYWxlU2V0IiwgdHJ1ZSk7CiAgICB0aGlzLmxvY2FsZSA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgpOwogIH0KfQpjbGFzcyBNZXJpZGllbSBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1lcmlkaWVtIik7CiAgfQp9CmNsYXNzIE1lcmlkaWVtTmFtZXMgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJtZXJpZGllbU5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLm1lcmlkaWVtID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KDIpOwogIH0KfQpjbGFzcyBNb250aCBleHRlbmRzIF94ZmFfb2JqZWN0LlN0cmluZ09iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgIm1vbnRoIik7CiAgfQp9CmNsYXNzIE1vbnRoTmFtZXMgZXh0ZW5kcyBfeGZhX29iamVjdC5YRkFPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJtb250aE5hbWVzIiwgdHJ1ZSk7CiAgICB0aGlzLmFiYnIgPSAoMCwgX3V0aWxzLmdldEludGVnZXIpKHsKICAgICAgZGF0YTogYXR0cmlidXRlcy5hYmJyLAogICAgICBkZWZhdWx0VmFsdWU6IDAsCiAgICAgIHZhbGlkYXRlOiB4ID0+IHggPT09IDEKICAgIH0pOwogICAgdGhpcy5tb250aCA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSgxMik7CiAgfQp9CmNsYXNzIE51bWJlclBhdHRlcm4gZXh0ZW5kcyBfeGZhX29iamVjdC5TdHJpbmdPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKExPQ0FMRV9TRVRfTlNfSUQsICJudW1iZXJQYXR0ZXJuIik7CiAgICB0aGlzLm5hbWUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5uYW1lLCBbImZ1bGwiLCAibG9uZyIsICJtZWQiLCAic2hvcnQiXSk7CiAgfQp9CmNsYXNzIE51bWJlclBhdHRlcm5zIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibnVtYmVyUGF0dGVybnMiLCB0cnVlKTsKICAgIHRoaXMubnVtYmVyUGF0dGVybiA9IG5ldyBfeGZhX29iamVjdC5YRkFPYmplY3RBcnJheSg0KTsKICB9Cn0KY2xhc3MgTnVtYmVyU3ltYm9sIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibnVtYmVyU3ltYm9sIik7CiAgICB0aGlzLm5hbWUgPSAoMCwgX3V0aWxzLmdldFN0cmluZ09wdGlvbikoYXR0cmlidXRlcy5uYW1lLCBbImRlY2ltYWwiLCAiZ3JvdXBpbmciLCAicGVyY2VudCIsICJtaW51cyIsICJ6ZXJvIl0pOwogIH0KfQpjbGFzcyBOdW1iZXJTeW1ib2xzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAibnVtYmVyU3ltYm9scyIsIHRydWUpOwogICAgdGhpcy5udW1iZXJTeW1ib2wgPSBuZXcgX3hmYV9vYmplY3QuWEZBT2JqZWN0QXJyYXkoNSk7CiAgfQp9CmNsYXNzIFRpbWVQYXR0ZXJuIGV4dGVuZHMgX3hmYV9vYmplY3QuU3RyaW5nT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidGltZVBhdHRlcm4iKTsKICAgIHRoaXMubmFtZSA9ICgwLCBfdXRpbHMuZ2V0U3RyaW5nT3B0aW9uKShhdHRyaWJ1dGVzLm5hbWUsIFsiZnVsbCIsICJsb25nIiwgIm1lZCIsICJzaG9ydCJdKTsKICB9Cn0KY2xhc3MgVGltZVBhdHRlcm5zIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidGltZVBhdHRlcm5zIiwgdHJ1ZSk7CiAgICB0aGlzLnRpbWVQYXR0ZXJuID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KDQpOwogIH0KfQpjbGFzcyBUeXBlRmFjZSBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoTE9DQUxFX1NFVF9OU19JRCwgInR5cGVGYWNlIiwgdHJ1ZSk7CiAgICB0aGlzLm5hbWUgPSBhdHRyaWJ1dGVzLm5hbWUgfCAiIjsKICB9Cn0KY2xhc3MgVHlwZUZhY2VzIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihMT0NBTEVfU0VUX05TX0lELCAidHlwZUZhY2VzIiwgdHJ1ZSk7CiAgICB0aGlzLnR5cGVGYWNlID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgfQp9CmNsYXNzIExvY2FsZVNldE5hbWVzcGFjZSB7CiAgc3RhdGljIFtfbmFtZXNwYWNlcy4kYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChMb2NhbGVTZXROYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIExvY2FsZVNldE5hbWVzcGFjZVtuYW1lXShhdHRyaWJ1dGVzKTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7CiAgfQogIHN0YXRpYyBjYWxlbmRhclN5bWJvbHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgQ2FsZW5kYXJTeW1ib2xzKGF0dHJzKTsKICB9CiAgc3RhdGljIGN1cnJlbmN5U3ltYm9sKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEN1cnJlbmN5U3ltYm9sKGF0dHJzKTsKICB9CiAgc3RhdGljIGN1cnJlbmN5U3ltYm9scyhhdHRycykgewogICAgcmV0dXJuIG5ldyBDdXJyZW5jeVN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZVBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgZGF0ZVBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IERhdGVQYXR0ZXJucyhhdHRycyk7CiAgfQogIHN0YXRpYyBkYXRlVGltZVN5bWJvbHMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF0ZVRpbWVTeW1ib2xzKGF0dHJzKTsKICB9CiAgc3RhdGljIGRheShhdHRycykgewogICAgcmV0dXJuIG5ldyBEYXkoYXR0cnMpOwogIH0KICBzdGF0aWMgZGF5TmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgRGF5TmFtZXMoYXR0cnMpOwogIH0KICBzdGF0aWMgZXJhKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IEVyYShhdHRycyk7CiAgfQogIHN0YXRpYyBlcmFOYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBFcmFOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBsb2NhbGUoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTG9jYWxlKGF0dHJzKTsKICB9CiAgc3RhdGljIGxvY2FsZVNldChhdHRycykgewogICAgcmV0dXJuIG5ldyBMb2NhbGVTZXQoYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW0oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTWVyaWRpZW0oYXR0cnMpOwogIH0KICBzdGF0aWMgbWVyaWRpZW1OYW1lcyhhdHRycykgewogICAgcmV0dXJuIG5ldyBNZXJpZGllbU5hbWVzKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE1vbnRoKGF0dHJzKTsKICB9CiAgc3RhdGljIG1vbnRoTmFtZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTW9udGhOYW1lcyhhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJQYXR0ZXJuKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyUGF0dGVybnMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgTnVtYmVyUGF0dGVybnMoYXR0cnMpOwogIH0KICBzdGF0aWMgbnVtYmVyU3ltYm9sKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbChhdHRycyk7CiAgfQogIHN0YXRpYyBudW1iZXJTeW1ib2xzKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IE51bWJlclN5bWJvbHMoYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm4oYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVGltZVBhdHRlcm4oYXR0cnMpOwogIH0KICBzdGF0aWMgdGltZVBhdHRlcm5zKGF0dHJzKSB7CiAgICByZXR1cm4gbmV3IFRpbWVQYXR0ZXJucyhhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZShhdHRycykgewogICAgcmV0dXJuIG5ldyBUeXBlRmFjZShhdHRycyk7CiAgfQogIHN0YXRpYyB0eXBlRmFjZXMoYXR0cnMpIHsKICAgIHJldHVybiBuZXcgVHlwZUZhY2VzKGF0dHJzKTsKICB9Cn0KZXhwb3J0cy5Mb2NhbGVTZXROYW1lc3BhY2UgPSBMb2NhbGVTZXROYW1lc3BhY2U7CgovKioqLyB9KSwKLyogOTYgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5TaWduYXR1cmVOYW1lc3BhY2UgPSB2b2lkIDA7CnZhciBfbmFtZXNwYWNlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwp2YXIgX3hmYV9vYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc4KTsKY29uc3QgU0lHTkFUVVJFX05TX0lEID0gX25hbWVzcGFjZXMuTmFtZXNwYWNlSWRzLnNpZ25hdHVyZS5pZDsKY2xhc3MgU2lnbmF0dXJlIGV4dGVuZHMgX3hmYV9vYmplY3QuWEZBT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihTSUdOQVRVUkVfTlNfSUQsICJzaWduYXR1cmUiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU2lnbmF0dXJlTmFtZXNwYWNlIHsKICBzdGF0aWMgW19uYW1lc3BhY2VzLiRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFNpZ25hdHVyZU5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gU2lnbmF0dXJlTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHNpZ25hdHVyZShhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IFNpZ25hdHVyZShhdHRyaWJ1dGVzKTsKICB9Cn0KZXhwb3J0cy5TaWduYXR1cmVOYW1lc3BhY2UgPSBTaWduYXR1cmVOYW1lc3BhY2U7CgovKioqLyB9KSwKLyogOTcgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5TdHlsZXNoZWV0TmFtZXNwYWNlID0gdm9pZCAwOwp2YXIgX25hbWVzcGFjZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CmNvbnN0IFNUWUxFU0hFRVRfTlNfSUQgPSBfbmFtZXNwYWNlcy5OYW1lc3BhY2VJZHMuc3R5bGVzaGVldC5pZDsKY2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoU1RZTEVTSEVFVF9OU19JRCwgInN0eWxlc2hlZXQiLCB0cnVlKTsKICB9Cn0KY2xhc3MgU3R5bGVzaGVldE5hbWVzcGFjZSB7CiAgc3RhdGljIFtfbmFtZXNwYWNlcy4kYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIGlmIChTdHlsZXNoZWV0TmFtZXNwYWNlLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgIHJldHVybiBTdHlsZXNoZWV0TmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHN0eWxlc2hlZXQoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KGF0dHJpYnV0ZXMpOwogIH0KfQpleHBvcnRzLlN0eWxlc2hlZXROYW1lc3BhY2UgPSBTdHlsZXNoZWV0TmFtZXNwYWNlOwoKLyoqKi8gfSksCi8qIDk4ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuWGRwTmFtZXNwYWNlID0gdm9pZCAwOwp2YXIgX25hbWVzcGFjZXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgwKTsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CmNvbnN0IFhEUF9OU19JRCA9IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy54ZHAuaWQ7CmNsYXNzIFhkcCBleHRlbmRzIF94ZmFfb2JqZWN0LlhGQU9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoWERQX05TX0lELCAieGRwIiwgdHJ1ZSk7CiAgICB0aGlzLnV1aWQgPSBhdHRyaWJ1dGVzLnV1aWQgfHwgIiI7CiAgICB0aGlzLnRpbWVTdGFtcCA9IGF0dHJpYnV0ZXMudGltZVN0YW1wIHx8ICIiOwogICAgdGhpcy5jb25maWcgPSBudWxsOwogICAgdGhpcy5jb25uZWN0aW9uU2V0ID0gbnVsbDsKICAgIHRoaXMuZGF0YXNldHMgPSBudWxsOwogICAgdGhpcy5sb2NhbGVTZXQgPSBudWxsOwogICAgdGhpcy5zdHlsZXNoZWV0ID0gbmV3IF94ZmFfb2JqZWN0LlhGQU9iamVjdEFycmF5KCk7CiAgICB0aGlzLnRlbXBsYXRlID0gbnVsbDsKICB9CiAgW194ZmFfb2JqZWN0LiRvbkNoaWxkQ2hlY2tdKGNoaWxkKSB7CiAgICBjb25zdCBucyA9IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkc1tjaGlsZFtfeGZhX29iamVjdC4kbm9kZU5hbWVdXTsKICAgIHJldHVybiBucyAmJiBjaGlsZFtfeGZhX29iamVjdC4kbmFtZXNwYWNlSWRdID09PSBucy5pZDsKICB9Cn0KY2xhc3MgWGRwTmFtZXNwYWNlIHsKICBzdGF0aWMgW19uYW1lc3BhY2VzLiRidWlsZFhGQU9iamVjdF0obmFtZSwgYXR0cmlidXRlcykgewogICAgaWYgKFhkcE5hbWVzcGFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICByZXR1cm4gWGRwTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIHhkcChhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IFhkcChhdHRyaWJ1dGVzKTsKICB9Cn0KZXhwb3J0cy5YZHBOYW1lc3BhY2UgPSBYZHBOYW1lc3BhY2U7CgovKioqLyB9KSwKLyogOTkgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5YaHRtbE5hbWVzcGFjZSA9IHZvaWQgMDsKdmFyIF94ZmFfb2JqZWN0ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3OCk7CnZhciBfbmFtZXNwYWNlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwp2YXIgX2h0bWxfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDg1KTsKdmFyIF91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNzkpOwpjb25zdCBYSFRNTF9OU19JRCA9IF9uYW1lc3BhY2VzLk5hbWVzcGFjZUlkcy54aHRtbC5pZDsKY29uc3QgJHJpY2hUZXh0ID0gU3ltYm9sKCk7CmNvbnN0IFZBTElEX1NUWUxFUyA9IG5ldyBTZXQoWyJjb2xvciIsICJmb250IiwgImZvbnQtZmFtaWx5IiwgImZvbnQtc2l6ZSIsICJmb250LXN0cmV0Y2giLCAiZm9udC1zdHlsZSIsICJmb250LXdlaWdodCIsICJtYXJnaW4iLCAibWFyZ2luLWJvdHRvbSIsICJtYXJnaW4tbGVmdCIsICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luLXRvcCIsICJsZXR0ZXItc3BhY2luZyIsICJsaW5lLWhlaWdodCIsICJvcnBoYW5zIiwgInBhZ2UtYnJlYWstYWZ0ZXIiLCAicGFnZS1icmVhay1iZWZvcmUiLCAicGFnZS1icmVhay1pbnNpZGUiLCAidGFiLWludGVydmFsIiwgInRhYi1zdG9wIiwgInRleHQtYWxpZ24iLCAidGV4dC1kZWNvcmF0aW9uIiwgInRleHQtaW5kZW50IiwgInZlcnRpY2FsLWFsaWduIiwgIndpZG93cyIsICJrZXJuaW5nLW1vZGUiLCAieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIsICJ4ZmEtZm9udC12ZXJ0aWNhbC1zY2FsZSIsICJ4ZmEtc3BhY2VydW4iLCAieGZhLXRhYi1zdG9wcyJdKTsKY29uc3QgU3R5bGVNYXBwaW5nID0gbmV3IE1hcChbWyJwYWdlLWJyZWFrLWFmdGVyIiwgImJyZWFrQWZ0ZXIiXSwgWyJwYWdlLWJyZWFrLWJlZm9yZSIsICJicmVha0JlZm9yZSJdLCBbInBhZ2UtYnJlYWstaW5zaWRlIiwgImJyZWFrSW5zaWRlIl0sIFsia2VybmluZy1tb2RlIiwgdmFsdWUgPT4gdmFsdWUgPT09ICJub25lIiA/ICJub25lIiA6ICJub3JtYWwiXSwgWyJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiwgdmFsdWUgPT4gYHNjYWxlWCgke01hdGgubWF4KDAsIE1hdGgubWluKHBhcnNlSW50KHZhbHVlKSAvIDEwMCkpLnRvRml4ZWQoMil9KWBdLCBbInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiwgdmFsdWUgPT4gYHNjYWxlWSgke01hdGgubWF4KDAsIE1hdGgubWluKHBhcnNlSW50KHZhbHVlKSAvIDEwMCkpLnRvRml4ZWQoMil9KWBdLCBbInhmYS1zcGFjZXJ1biIsICIiXSwgWyJ4ZmEtdGFiLXN0b3BzIiwgIiJdLCBbImZvbnQtc2l6ZSIsICh2YWx1ZSwgb3JpZ2luYWwpID0+IHsKICB2YWx1ZSA9IG9yaWdpbmFsLmZvbnRTaXplID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpOwogIHJldHVybiAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSgwLjk5ICogdmFsdWUpOwp9XSwgWyJsZXR0ZXItc3BhY2luZyIsIHZhbHVlID0+ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKCgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHZhbHVlKSldLCBbImxpbmUtaGVpZ2h0IiwgdmFsdWUgPT4gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpKV0sIFsibWFyZ2luIiwgdmFsdWUgPT4gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpKV0sIFsibWFyZ2luLWJvdHRvbSIsIHZhbHVlID0+ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKCgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHZhbHVlKSldLCBbIm1hcmdpbi1sZWZ0IiwgdmFsdWUgPT4gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpKV0sIFsibWFyZ2luLXJpZ2h0IiwgdmFsdWUgPT4gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpKV0sIFsibWFyZ2luLXRvcCIsIHZhbHVlID0+ICgwLCBfaHRtbF91dGlscy5tZWFzdXJlVG9TdHJpbmcpKCgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHZhbHVlKSldLCBbInRleHQtaW5kZW50IiwgdmFsdWUgPT4gKDAsIF9odG1sX3V0aWxzLm1lYXN1cmVUb1N0cmluZykoKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpKV0sIFsiZm9udC1mYW1pbHkiLCB2YWx1ZSA9PiB2YWx1ZV0sIFsidmVydGljYWwtYWxpZ24iLCB2YWx1ZSA9PiAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKSgoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KSh2YWx1ZSkpXV0pOwpjb25zdCBzcGFjZXNSZWdFeHAgPSAvXHMrL2c7CmNvbnN0IGNybGZSZWdFeHAgPSAvW1xyXG5dKy9nOwpjb25zdCBjcmxmRm9yUmljaFRleHRSZWdFeHAgPSAvXHJcbj8vZzsKZnVuY3Rpb24gbWFwU3R5bGUoc3R5bGVTdHIsIG5vZGUsIHJpY2hUZXh0KSB7CiAgY29uc3Qgc3R5bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGlmICghc3R5bGVTdHIpIHsKICAgIHJldHVybiBzdHlsZTsKICB9CiAgY29uc3Qgb3JpZ2luYWwgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0eWxlU3RyLnNwbGl0KCI7IikubWFwKHMgPT4gcy5zcGxpdCgiOiIsIDIpKSkgewogICAgY29uc3QgbWFwcGluZyA9IFN0eWxlTWFwcGluZy5nZXQoa2V5KTsKICAgIGlmIChtYXBwaW5nID09PSAiIikgewogICAgICBjb250aW51ZTsKICAgIH0KICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlOwogICAgaWYgKG1hcHBpbmcpIHsKICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nID09PSAic3RyaW5nIikgewogICAgICAgIG5ld1ZhbHVlID0gbWFwcGluZzsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdWYWx1ZSA9IG1hcHBpbmcodmFsdWUsIG9yaWdpbmFsKTsKICAgICAgfQogICAgfQogICAgaWYgKGtleS5lbmRzV2l0aCgic2NhbGUiKSkgewogICAgICBpZiAoc3R5bGUudHJhbnNmb3JtKSB7CiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gYCR7c3R5bGVba2V5XX0gJHtuZXdWYWx1ZX1gOwogICAgICB9IGVsc2UgewogICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IG5ld1ZhbHVlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzdHlsZVtrZXkucmVwbGFjZUFsbCgvLShbYS16QS1aXSkvZywgKF8sIHgpID0+IHgudG9VcHBlckNhc2UoKSldID0gbmV3VmFsdWU7CiAgICB9CiAgfQogIGlmIChzdHlsZS5mb250RmFtaWx5KSB7CiAgICAoMCwgX2h0bWxfdXRpbHMuc2V0Rm9udEZhbWlseSkoewogICAgICB0eXBlZmFjZTogc3R5bGUuZm9udEZhbWlseSwKICAgICAgd2VpZ2h0OiBzdHlsZS5mb250V2VpZ2h0IHx8ICJub3JtYWwiLAogICAgICBwb3N0dXJlOiBzdHlsZS5mb250U3R5bGUgfHwgIm5vcm1hbCIsCiAgICAgIHNpemU6IG9yaWdpbmFsLmZvbnRTaXplIHx8IDAKICAgIH0sIG5vZGUsIG5vZGVbX3hmYV9vYmplY3QuJGdsb2JhbERhdGFdLmZvbnRGaW5kZXIsIHN0eWxlKTsKICB9CiAgaWYgKHJpY2hUZXh0ICYmIHN0eWxlLnZlcnRpY2FsQWxpZ24gJiYgc3R5bGUudmVydGljYWxBbGlnbiAhPT0gIjBweCIgJiYgc3R5bGUuZm9udFNpemUpIHsKICAgIGNvbnN0IFNVQl9TVVBFUl9TQ1JJUFRfRkFDVE9SID0gMC41ODM7CiAgICBjb25zdCBWRVJUSUNBTF9GQUNUT1IgPSAwLjMzMzsKICAgIGNvbnN0IGZvbnRTaXplID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoc3R5bGUuZm9udFNpemUpOwogICAgc3R5bGUuZm9udFNpemUgPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKShmb250U2l6ZSAqIFNVQl9TVVBFUl9TQ1JJUFRfRkFDVE9SKTsKICAgIHN0eWxlLnZlcnRpY2FsQWxpZ24gPSAoMCwgX2h0bWxfdXRpbHMubWVhc3VyZVRvU3RyaW5nKShNYXRoLnNpZ24oKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoc3R5bGUudmVydGljYWxBbGlnbikpICogZm9udFNpemUgKiBWRVJUSUNBTF9GQUNUT1IpOwogIH0KICBpZiAocmljaFRleHQgJiYgc3R5bGUuZm9udFNpemUpIHsKICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHtzdHlsZS5mb250U2l6ZX0gKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7CiAgfQogICgwLCBfaHRtbF91dGlscy5maXhUZXh0SW5kZW50KShzdHlsZSk7CiAgcmV0dXJuIHN0eWxlOwp9CmZ1bmN0aW9uIGNoZWNrU3R5bGUobm9kZSkgewogIGlmICghbm9kZS5zdHlsZSkgewogICAgcmV0dXJuICIiOwogIH0KICByZXR1cm4gbm9kZS5zdHlsZS50cmltKCkuc3BsaXQoL1xzKjtccyovKS5maWx0ZXIocyA9PiAhIXMpLm1hcChzID0+IHMuc3BsaXQoL1xzKjpccyovLCAyKSkuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHsKICAgIGlmIChrZXkgPT09ICJmb250LWZhbWlseSIpIHsKICAgICAgbm9kZVtfeGZhX29iamVjdC4kZ2xvYmFsRGF0YV0udXNlZFR5cGVmYWNlcy5hZGQodmFsdWUpOwogICAgfQogICAgcmV0dXJuIFZBTElEX1NUWUxFUy5oYXMoa2V5KTsKICB9KS5tYXAoa3YgPT4ga3Yuam9pbigiOiIpKS5qb2luKCI7Iik7Cn0KY29uc3QgTm9XaGl0ZXMgPSBuZXcgU2V0KFsiYm9keSIsICJodG1sIl0pOwpjbGFzcyBYaHRtbE9iamVjdCBleHRlbmRzIF94ZmFfb2JqZWN0LlhtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcywgbmFtZSkgewogICAgc3VwZXIoWEhUTUxfTlNfSUQsIG5hbWUpOwogICAgdGhpc1skcmljaFRleHRdID0gZmFsc2U7CiAgICB0aGlzLnN0eWxlID0gYXR0cmlidXRlcy5zdHlsZSB8fCAiIjsKICB9CiAgW194ZmFfb2JqZWN0LiRjbGVhbl0oYnVpbGRlcikgewogICAgc3VwZXJbX3hmYV9vYmplY3QuJGNsZWFuXShidWlsZGVyKTsKICAgIHRoaXMuc3R5bGUgPSBjaGVja1N0eWxlKHRoaXMpOwogIH0KICBbX3hmYV9vYmplY3QuJGFjY2VwdFdoaXRlc3BhY2VdKCkgewogICAgcmV0dXJuICFOb1doaXRlcy5oYXModGhpc1tfeGZhX29iamVjdC4kbm9kZU5hbWVdKTsKICB9CiAgW194ZmFfb2JqZWN0LiRvblRleHRdKHN0ciwgcmljaFRleHQgPSBmYWxzZSkgewogICAgaWYgKCFyaWNoVGV4dCkgewogICAgICBzdHIgPSBzdHIucmVwbGFjZUFsbChjcmxmUmVnRXhwLCAiIik7CiAgICAgIGlmICghdGhpcy5zdHlsZS5pbmNsdWRlcygieGZhLXNwYWNlcnVuOnllcyIpKSB7CiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2VBbGwoc3BhY2VzUmVnRXhwLCAiICIpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0aGlzWyRyaWNoVGV4dF0gPSB0cnVlOwogICAgfQogICAgaWYgKHN0cikgewogICAgICB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSArPSBzdHI7CiAgICB9CiAgfQogIFtfeGZhX29iamVjdC4kcHVzaEdseXBoc10obWVhc3VyZSwgbXVzdFBvcCA9IHRydWUpIHsKICAgIGNvbnN0IHhmYUZvbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3QgbWFyZ2luID0gewogICAgICB0b3A6IE5hTiwKICAgICAgYm90dG9tOiBOYU4sCiAgICAgIGxlZnQ6IE5hTiwKICAgICAgcmlnaHQ6IE5hTgogICAgfTsKICAgIGxldCBsaW5lSGVpZ2h0ID0gbnVsbDsKICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3R5bGUuc3BsaXQoIjsiKS5tYXAocyA9PiBzLnNwbGl0KCI6IiwgMikpKSB7CiAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgY2FzZSAiZm9udC1mYW1pbHkiOgogICAgICAgICAgeGZhRm9udC50eXBlZmFjZSA9ICgwLCBfdXRpbHMuc3RyaXBRdW90ZXMpKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImZvbnQtc2l6ZSI6CiAgICAgICAgICB4ZmFGb250LnNpemUgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KSh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJmb250LXdlaWdodCI6CiAgICAgICAgICB4ZmFGb250LndlaWdodCA9IHZhbHVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiZm9udC1zdHlsZSI6CiAgICAgICAgICB4ZmFGb250LnBvc3R1cmUgPSB2YWx1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImxldHRlci1zcGFjaW5nIjoKICAgICAgICAgIHhmYUZvbnQubGV0dGVyU3BhY2luZyA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIm1hcmdpbiI6CiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgvIFx0LykubWFwKHggPT4gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkoeCkpOwogICAgICAgICAgc3dpdGNoICh2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gbWFyZ2luLmJvdHRvbSA9IG1hcmdpbi5sZWZ0ID0gbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgbWFyZ2luLnRvcCA9IG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMF07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLmxlZnQgPSBtYXJnaW4ucmlnaHQgPSB2YWx1ZXNbMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICBtYXJnaW4udG9wID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgIG1hcmdpbi5sZWZ0ID0gdmFsdWVzWzFdOwogICAgICAgICAgICAgIG1hcmdpbi5ib3R0b20gPSB2YWx1ZXNbMl07CiAgICAgICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gdmFsdWVzWzNdOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLXRvcCI6CiAgICAgICAgICBtYXJnaW4udG9wID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWJvdHRvbSI6CiAgICAgICAgICBtYXJnaW4uYm90dG9tID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibWFyZ2luLWxlZnQiOgogICAgICAgICAgbWFyZ2luLmxlZnQgPSAoMCwgX3V0aWxzLmdldE1lYXN1cmVtZW50KSh2YWx1ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJtYXJnaW4tcmlnaHQiOgogICAgICAgICAgbWFyZ2luLnJpZ2h0ID0gKDAsIF91dGlscy5nZXRNZWFzdXJlbWVudCkodmFsdWUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibGluZS1oZWlnaHQiOgogICAgICAgICAgbGluZUhlaWdodCA9ICgwLCBfdXRpbHMuZ2V0TWVhc3VyZW1lbnQpKHZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBtZWFzdXJlLnB1c2hEYXRhKHhmYUZvbnQsIG1hcmdpbiwgbGluZUhlaWdodCk7CiAgICBpZiAodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0pIHsKICAgICAgbWVhc3VyZS5hZGRTdHJpbmcodGhpc1tfeGZhX29iamVjdC4kY29udGVudF0pOwogICAgfSBlbHNlIHsKICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbl0oKSkgewogICAgICAgIGlmIChjaGlsZFtfeGZhX29iamVjdC4kbm9kZU5hbWVdID09PSAiI3RleHQiKSB7CiAgICAgICAgICBtZWFzdXJlLmFkZFN0cmluZyhjaGlsZFtfeGZhX29iamVjdC4kY29udGVudF0pOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGNoaWxkW194ZmFfb2JqZWN0LiRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICAgICAgfQogICAgfQogICAgaWYgKG11c3RQb3ApIHsKICAgICAgbWVhc3VyZS5wb3BGb250KCk7CiAgICB9CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgY2hpbGRyZW4gPSBbXTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGV4dHJhXSA9IHsKICAgICAgY2hpbGRyZW4KICAgIH07CiAgICB0aGlzW194ZmFfb2JqZWN0LiRjaGlsZHJlblRvSFRNTF0oe30pOwogICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0pIHsKICAgICAgcmV0dXJuIF91dGlscy5IVE1MUmVzdWx0LkVNUFRZOwogICAgfQogICAgbGV0IHZhbHVlOwogICAgaWYgKHRoaXNbJHJpY2hUZXh0XSkgewogICAgICB2YWx1ZSA9IHRoaXNbX3hmYV9vYmplY3QuJGNvbnRlbnRdID8gdGhpc1tfeGZhX29iamVjdC4kY29udGVudF0ucmVwbGFjZUFsbChjcmxmRm9yUmljaFRleHRSZWdFeHAsICJcbiIpIDogdW5kZWZpbmVkOwogICAgfSBlbHNlIHsKICAgICAgdmFsdWUgPSB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSB8fCB1bmRlZmluZWQ7CiAgICB9CiAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2Vzcyh7CiAgICAgIG5hbWU6IHRoaXNbX3hmYV9vYmplY3QuJG5vZGVOYW1lXSwKICAgICAgYXR0cmlidXRlczogewogICAgICAgIGhyZWY6IHRoaXMuaHJlZiwKICAgICAgICBzdHlsZTogbWFwU3R5bGUodGhpcy5zdHlsZSwgdGhpcywgdGhpc1skcmljaFRleHRdKQogICAgICB9LAogICAgICBjaGlsZHJlbiwKICAgICAgdmFsdWUKICAgIH0pOwogIH0KfQpjbGFzcyBBIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJhIik7CiAgICB0aGlzLmhyZWYgPSAoMCwgX2h0bWxfdXRpbHMuZml4VVJMKShhdHRyaWJ1dGVzLmhyZWYpIHx8ICIiOwogIH0KfQpjbGFzcyBCIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJiIik7CiAgfQogIFtfeGZhX29iamVjdC4kcHVzaEdseXBoc10obWVhc3VyZSkgewogICAgbWVhc3VyZS5wdXNoRm9udCh7CiAgICAgIHdlaWdodDogImJvbGQiCiAgICB9KTsKICAgIHN1cGVyW194ZmFfb2JqZWN0LiRwdXNoR2x5cGhzXShtZWFzdXJlKTsKICAgIG1lYXN1cmUucG9wRm9udCgpOwogIH0KfQpjbGFzcyBCb2R5IGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJib2R5Iik7CiAgfQogIFtfeGZhX29iamVjdC4kdG9IVE1MXShhdmFpbGFibGVTcGFjZSkgewogICAgY29uc3QgcmVzID0gc3VwZXJbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpOwogICAgY29uc3QgewogICAgICBodG1sCiAgICB9ID0gcmVzOwogICAgaWYgKCFodG1sKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5FTVBUWTsKICAgIH0KICAgIGh0bWwubmFtZSA9ICJkaXYiOwogICAgaHRtbC5hdHRyaWJ1dGVzLmNsYXNzID0gWyJ4ZmFSaWNoIl07CiAgICByZXR1cm4gcmVzOwogIH0KfQpjbGFzcyBCciBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiYnIiKTsKICB9CiAgW194ZmFfb2JqZWN0LiR0ZXh0XSgpIHsKICAgIHJldHVybiAiXG4iOwogIH0KICBbX3hmYV9vYmplY3QuJHB1c2hHbHlwaHNdKG1lYXN1cmUpIHsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKCJcbiIpOwogIH0KICBbX3hmYV9vYmplY3QuJHRvSFRNTF0oYXZhaWxhYmxlU3BhY2UpIHsKICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImJyIgogICAgfSk7CiAgfQp9CmNsYXNzIEh0bWwgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImh0bWwiKTsKICB9CiAgW194ZmFfb2JqZWN0LiR0b0hUTUxdKGF2YWlsYWJsZVNwYWNlKSB7CiAgICBjb25zdCBjaGlsZHJlbiA9IFtdOwogICAgdGhpc1tfeGZhX29iamVjdC4kZXh0cmFdID0gewogICAgICBjaGlsZHJlbgogICAgfTsKICAgIHRoaXNbX3hmYV9vYmplY3QuJGNoaWxkcmVuVG9IVE1MXSh7fSk7CiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgICBuYW1lOiAiZGl2IiwKICAgICAgICBhdHRyaWJ1dGVzOiB7CiAgICAgICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgICAgICBzdHlsZToge30KICAgICAgICB9LAogICAgICAgIHZhbHVlOiB0aGlzW194ZmFfb2JqZWN0LiRjb250ZW50XSB8fCAiIgogICAgICB9KTsKICAgIH0KICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEpIHsKICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblswXTsKICAgICAgaWYgKGNoaWxkLmF0dHJpYnV0ZXM/LmNsYXNzLmluY2x1ZGVzKCJ4ZmFSaWNoIikpIHsKICAgICAgICByZXR1cm4gX3V0aWxzLkhUTUxSZXN1bHQuc3VjY2VzcyhjaGlsZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBfdXRpbHMuSFRNTFJlc3VsdC5zdWNjZXNzKHsKICAgICAgbmFtZTogImRpdiIsCiAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICBjbGFzczogWyJ4ZmFSaWNoIl0sCiAgICAgICAgc3R5bGU6IHt9CiAgICAgIH0sCiAgICAgIGNoaWxkcmVuCiAgICB9KTsKICB9Cn0KY2xhc3MgSSBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAiaSIpOwogIH0KICBbX3hmYV9vYmplY3QuJHB1c2hHbHlwaHNdKG1lYXN1cmUpIHsKICAgIG1lYXN1cmUucHVzaEZvbnQoewogICAgICBwb3N0dXJlOiAiaXRhbGljIgogICAgfSk7CiAgICBzdXBlcltfeGZhX29iamVjdC4kcHVzaEdseXBoc10obWVhc3VyZSk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9Cn0KY2xhc3MgTGkgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgImxpIik7CiAgfQp9CmNsYXNzIE9sIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJvbCIpOwogIH0KfQpjbGFzcyBQIGV4dGVuZHMgWGh0bWxPYmplY3QgewogIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZXMpIHsKICAgIHN1cGVyKGF0dHJpYnV0ZXMsICJwIik7CiAgfQogIFtfeGZhX29iamVjdC4kcHVzaEdseXBoc10obWVhc3VyZSkgewogICAgc3VwZXJbX3hmYV9vYmplY3QuJHB1c2hHbHlwaHNdKG1lYXN1cmUsIGZhbHNlKTsKICAgIG1lYXN1cmUuYWRkU3RyaW5nKCJcbiIpOwogICAgbWVhc3VyZS5hZGRQYXJhKCk7CiAgICBtZWFzdXJlLnBvcEZvbnQoKTsKICB9CiAgW194ZmFfb2JqZWN0LiR0ZXh0XSgpIHsKICAgIGNvbnN0IHNpYmxpbmdzID0gdGhpc1tfeGZhX29iamVjdC4kZ2V0UGFyZW50XSgpW194ZmFfb2JqZWN0LiRnZXRDaGlsZHJlbl0oKTsKICAgIGlmIChzaWJsaW5ncy5hdCgtMSkgPT09IHRoaXMpIHsKICAgICAgcmV0dXJuIHN1cGVyW194ZmFfb2JqZWN0LiR0ZXh0XSgpOwogICAgfQogICAgcmV0dXJuIHN1cGVyW194ZmFfb2JqZWN0LiR0ZXh0XSgpICsgIlxuIjsKICB9Cn0KY2xhc3MgU3BhbiBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAic3BhbiIpOwogIH0KfQpjbGFzcyBTdWIgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1YiIpOwogIH0KfQpjbGFzcyBTdXAgZXh0ZW5kcyBYaHRtbE9iamVjdCB7CiAgY29uc3RydWN0b3IoYXR0cmlidXRlcykgewogICAgc3VwZXIoYXR0cmlidXRlcywgInN1cCIpOwogIH0KfQpjbGFzcyBVbCBleHRlbmRzIFhodG1sT2JqZWN0IHsKICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzKSB7CiAgICBzdXBlcihhdHRyaWJ1dGVzLCAidWwiKTsKICB9Cn0KY2xhc3MgWGh0bWxOYW1lc3BhY2UgewogIHN0YXRpYyBbX25hbWVzcGFjZXMuJGJ1aWxkWEZBT2JqZWN0XShuYW1lLCBhdHRyaWJ1dGVzKSB7CiAgICBpZiAoWGh0bWxOYW1lc3BhY2UuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgcmV0dXJuIFhodG1sTmFtZXNwYWNlW25hbWVdKGF0dHJpYnV0ZXMpOwogICAgfQogICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9CiAgc3RhdGljIGEoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBBKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgYihhdHRyaWJ1dGVzKSB7CiAgICByZXR1cm4gbmV3IEIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBib2R5KGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQm9keShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGJyKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgQnIoYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBodG1sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgSHRtbChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBJKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgbGkoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBMaShhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIG9sKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgT2woYXR0cmlidXRlcyk7CiAgfQogIHN0YXRpYyBwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgUChhdHRyaWJ1dGVzKTsKICB9CiAgc3RhdGljIHNwYW4oYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBTcGFuKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3ViKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3ViKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgc3VwKGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgU3VwKGF0dHJpYnV0ZXMpOwogIH0KICBzdGF0aWMgdWwoYXR0cmlidXRlcykgewogICAgcmV0dXJuIG5ldyBVbChhdHRyaWJ1dGVzKTsKICB9Cn0KZXhwb3J0cy5YaHRtbE5hbWVzcGFjZSA9IFhodG1sTmFtZXNwYWNlOwoKLyoqKi8gfSksCi8qIDEwMCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlVua25vd25OYW1lc3BhY2UgPSB2b2lkIDA7CnZhciBfbmFtZXNwYWNlcyA9IF9fd19wZGZqc19yZXF1aXJlX18oODApOwp2YXIgX3hmYV9vYmplY3QgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDc4KTsKY2xhc3MgVW5rbm93bk5hbWVzcGFjZSB7CiAgY29uc3RydWN0b3IobnNJZCkgewogICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5zSWQ7CiAgfQogIFtfbmFtZXNwYWNlcy4kYnVpbGRYRkFPYmplY3RdKG5hbWUsIGF0dHJpYnV0ZXMpIHsKICAgIHJldHVybiBuZXcgX3hmYV9vYmplY3QuWG1sT2JqZWN0KHRoaXMubmFtZXNwYWNlSWQsIG5hbWUsIGF0dHJpYnV0ZXMpOwogIH0KfQpleHBvcnRzLlVua25vd25OYW1lc3BhY2UgPSBVbmtub3duTmFtZXNwYWNlOwoKLyoqKi8gfSksCi8qIDEwMSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLkRhdGFzZXRSZWFkZXIgPSB2b2lkIDA7CnZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7CnZhciBfY29yZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7CnZhciBfeG1sX3BhcnNlciA9IF9fd19wZGZqc19yZXF1aXJlX18oNjcpOwpmdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKSB7CiAgdHJ5IHsKICAgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9VVEY4U3RyaW5nKShzdHIpOwogIH0gY2F0Y2ggKGV4KSB7CiAgICAoMCwgX3V0aWwud2FybikoYFVURi04IGRlY29kaW5nIGZhaWxlZDogIiR7ZXh9Ii5gKTsKICAgIHJldHVybiBzdHI7CiAgfQp9CmNsYXNzIERhdGFzZXRYTUxQYXJzZXIgZXh0ZW5kcyBfeG1sX3BhcnNlci5TaW1wbGVYTUxQYXJzZXIgewogIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgIHN1cGVyKG9wdGlvbnMpOwogICAgdGhpcy5ub2RlID0gbnVsbDsKICB9CiAgb25FbmRFbGVtZW50KG5hbWUpIHsKICAgIGNvbnN0IG5vZGUgPSBzdXBlci5vbkVuZEVsZW1lbnQobmFtZSk7CiAgICBpZiAobm9kZSAmJiBuYW1lID09PSAieGZhOmRhdGFzZXRzIikgewogICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICB0aHJvdyBuZXcgRXJyb3IoIkFib3J0aW5nIERhdGFzZXRYTUxQYXJzZXIuIik7CiAgICB9CiAgfQp9CmNsYXNzIERhdGFzZXRSZWFkZXIgewogIGNvbnN0cnVjdG9yKGRhdGEpIHsKICAgIGlmIChkYXRhLmRhdGFzZXRzKSB7CiAgICAgIHRoaXMubm9kZSA9IG5ldyBfeG1sX3BhcnNlci5TaW1wbGVYTUxQYXJzZXIoewogICAgICAgIGhhc0F0dHJpYnV0ZXM6IHRydWUKICAgICAgfSkucGFyc2VGcm9tU3RyaW5nKGRhdGEuZGF0YXNldHMpLmRvY3VtZW50RWxlbWVudDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBEYXRhc2V0WE1MUGFyc2VyKHsKICAgICAgICBoYXNBdHRyaWJ1dGVzOiB0cnVlCiAgICAgIH0pOwogICAgICB0cnkgewogICAgICAgIHBhcnNlci5wYXJzZUZyb21TdHJpbmcoZGF0YVsieGRwOnhkcCJdKTsKICAgICAgfSBjYXRjaCAoXykge30KICAgICAgdGhpcy5ub2RlID0gcGFyc2VyLm5vZGU7CiAgICB9CiAgfQogIGdldFZhbHVlKHBhdGgpIHsKICAgIGlmICghdGhpcy5ub2RlIHx8ICFwYXRoKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGUuc2VhcmNoTm9kZSgoMCwgX2NvcmVfdXRpbHMucGFyc2VYRkFQYXRoKShwYXRoKSwgMCk7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY29uc3QgZmlyc3QgPSBub2RlLmZpcnN0Q2hpbGQ7CiAgICBpZiAoZmlyc3Q/Lm5vZGVOYW1lID09PSAidmFsdWUiKSB7CiAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBkZWNvZGVTdHJpbmcoY2hpbGQudGV4dENvbnRlbnQpKTsKICAgIH0KICAgIHJldHVybiBkZWNvZGVTdHJpbmcobm9kZS50ZXh0Q29udGVudCk7CiAgfQp9CmV4cG9ydHMuRGF0YXNldFJlYWRlciA9IERhdGFzZXRSZWFkZXI7CgovKioqLyB9KSwKLyogMTAyICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHsKCgoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsKICB2YWx1ZTogdHJ1ZQp9KSk7CmV4cG9ydHMuWFJlZiA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKdmFyIF9wcmltaXRpdmVzID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTsKdmFyIF9wYXJzZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTsKdmFyIF9jb3JlX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTsKdmFyIF9iYXNlX3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7CnZhciBfY3J5cHRvID0gX193X3BkZmpzX3JlcXVpcmVfXyg2OCk7CmNsYXNzIFhSZWYgewogIGNvbnN0cnVjdG9yKHN0cmVhbSwgcGRmTWFuYWdlcikgewogICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICB0aGlzLnBkZk1hbmFnZXIgPSBwZGZNYW5hZ2VyOwogICAgdGhpcy5lbnRyaWVzID0gW107CiAgICB0aGlzLl94cmVmU3RtcyA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX2NhY2hlTWFwID0gbmV3IE1hcCgpOwogICAgdGhpcy5fcGVuZGluZ1JlZnMgPSBuZXcgX3ByaW1pdGl2ZXMuUmVmU2V0KCk7CiAgICB0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtID0gbnVsbDsKICAgIHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSA9IG51bGw7CiAgfQogIGdldE5ld1BlcnNpc3RlbnRSZWYob2JqKSB7CiAgICBpZiAodGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSA9PT0gbnVsbCkgewogICAgICB0aGlzLl9uZXdQZXJzaXN0ZW50UmVmTnVtID0gdGhpcy5lbnRyaWVzLmxlbmd0aCB8fCAxOwogICAgfQogICAgY29uc3QgbnVtID0gdGhpcy5fbmV3UGVyc2lzdGVudFJlZk51bSsrOwogICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgb2JqKTsKICAgIHJldHVybiBfcHJpbWl0aXZlcy5SZWYuZ2V0KG51bSwgMCk7CiAgfQogIGdldE5ld1RlbXBvcmFyeVJlZigpIHsKICAgIGlmICh0aGlzLl9uZXdUZW1wb3JhcnlSZWZOdW0gPT09IG51bGwpIHsKICAgICAgdGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtID0gdGhpcy5lbnRyaWVzLmxlbmd0aCB8fCAxOwogICAgfQogICAgcmV0dXJuIF9wcmltaXRpdmVzLlJlZi5nZXQodGhpcy5fbmV3VGVtcG9yYXJ5UmVmTnVtKyssIDApOwogIH0KICByZXNldE5ld1RlbXBvcmFyeVJlZigpIHsKICAgIHRoaXMuX25ld1RlbXBvcmFyeVJlZk51bSA9IG51bGw7CiAgfQogIHNldFN0YXJ0WFJlZihzdGFydFhSZWYpIHsKICAgIHRoaXMuc3RhcnRYUmVmUXVldWUgPSBbc3RhcnRYUmVmXTsKICB9CiAgcGFyc2UocmVjb3ZlcnlNb2RlID0gZmFsc2UpIHsKICAgIGxldCB0cmFpbGVyRGljdDsKICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CiAgICAgIHRyYWlsZXJEaWN0ID0gdGhpcy5yZWFkWFJlZigpOwogICAgfSBlbHNlIHsKICAgICAgKDAsIF91dGlsLndhcm4pKCJJbmRleGluZyBhbGwgUERGIG9iamVjdHMiKTsKICAgICAgdHJhaWxlckRpY3QgPSB0aGlzLmluZGV4T2JqZWN0cygpOwogICAgfQogICAgdHJhaWxlckRpY3QuYXNzaWduWHJlZih0aGlzKTsKICAgIHRoaXMudHJhaWxlciA9IHRyYWlsZXJEaWN0OwogICAgbGV0IGVuY3J5cHQ7CiAgICB0cnkgewogICAgICBlbmNyeXB0ID0gdHJhaWxlckRpY3QuZ2V0KCJFbmNyeXB0Iik7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgICgwLCBfdXRpbC53YXJuKShgWFJlZi5wYXJzZSAtIEludmFsaWQgIkVuY3J5cHQiIHJlZmVyZW5jZTogIiR7ZXh9Ii5gKTsKICAgIH0KICAgIGlmIChlbmNyeXB0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgewogICAgICBjb25zdCBpZHMgPSB0cmFpbGVyRGljdC5nZXQoIklEIik7CiAgICAgIGNvbnN0IGZpbGVJZCA9IGlkcz8ubGVuZ3RoID8gaWRzWzBdIDogIiI7CiAgICAgIGVuY3J5cHQuc3VwcHJlc3NFbmNyeXB0aW9uID0gdHJ1ZTsKICAgICAgdGhpcy5lbmNyeXB0ID0gbmV3IF9jcnlwdG8uQ2lwaGVyVHJhbnNmb3JtRmFjdG9yeShlbmNyeXB0LCBmaWxlSWQsIHRoaXMucGRmTWFuYWdlci5wYXNzd29yZCk7CiAgICB9CiAgICBsZXQgcm9vdDsKICAgIHRyeSB7CiAgICAgIHJvb3QgPSB0cmFpbGVyRGljdC5nZXQoIlJvb3QiKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgdGhyb3cgZXg7CiAgICAgIH0KICAgICAgKDAsIF91dGlsLndhcm4pKGBYUmVmLnBhcnNlIC0gSW52YWxpZCAiUm9vdCIgcmVmZXJlbmNlOiAiJHtleH0iLmApOwogICAgfQogICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFnZXMgPSByb290LmdldCgiUGFnZXMiKTsKICAgICAgICBpZiAocGFnZXMgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0KSB7CiAgICAgICAgICB0aGlzLnJvb3QgPSByb290OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBfY29yZV91dGlscy5NaXNzaW5nRGF0YUV4Y2VwdGlvbikgewogICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgfQogICAgICAgICgwLCBfdXRpbC53YXJuKShgWFJlZi5wYXJzZSAtIEludmFsaWQgIlBhZ2VzIiByZWZlcmVuY2U6ICIke2V4fSIuYCk7CiAgICAgIH0KICAgIH0KICAgIGlmICghcmVjb3ZlcnlNb2RlKSB7CiAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmUGFyc2VFeGNlcHRpb24oKTsKICAgIH0KICAgIHRocm93IG5ldyBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uKCJJbnZhbGlkIFJvb3QgcmVmZXJlbmNlLiIpOwogIH0KICBwcm9jZXNzWFJlZlRhYmxlKHBhcnNlcikgewogICAgaWYgKCEoInRhYmxlU3RhdGUiIGluIHRoaXMpKSB7CiAgICAgIHRoaXMudGFibGVTdGF0ZSA9IHsKICAgICAgICBlbnRyeU51bTogMCwKICAgICAgICBzdHJlYW1Qb3M6IHBhcnNlci5sZXhlci5zdHJlYW0ucG9zLAogICAgICAgIHBhcnNlckJ1ZjE6IHBhcnNlci5idWYxLAogICAgICAgIHBhcnNlckJ1ZjI6IHBhcnNlci5idWYyCiAgICAgIH07CiAgICB9CiAgICBjb25zdCBvYmogPSB0aGlzLnJlYWRYUmVmVGFibGUocGFyc2VyKTsKICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJ0cmFpbGVyIikpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBmaW5kIHRyYWlsZXIgZGljdGlvbmFyeSIpOwogICAgfQogICAgbGV0IGRpY3QgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkgJiYgZGljdC5kaWN0KSB7CiAgICAgIGRpY3QgPSBkaWN0LmRpY3Q7CiAgICB9CiAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IGNvdWxkIG5vdCBwYXJzZSB0cmFpbGVyIGRpY3Rpb25hcnkiKTsKICAgIH0KICAgIGRlbGV0ZSB0aGlzLnRhYmxlU3RhdGU7CiAgICByZXR1cm4gZGljdDsKICB9CiAgcmVhZFhSZWZUYWJsZShwYXJzZXIpIHsKICAgIGNvbnN0IHN0cmVhbSA9IHBhcnNlci5sZXhlci5zdHJlYW07CiAgICBjb25zdCB0YWJsZVN0YXRlID0gdGhpcy50YWJsZVN0YXRlOwogICAgc3RyZWFtLnBvcyA9IHRhYmxlU3RhdGUuc3RyZWFtUG9zOwogICAgcGFyc2VyLmJ1ZjEgPSB0YWJsZVN0YXRlLnBhcnNlckJ1ZjE7CiAgICBwYXJzZXIuYnVmMiA9IHRhYmxlU3RhdGUucGFyc2VyQnVmMjsKICAgIGxldCBvYmo7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoISgiZmlyc3RFbnRyeU51bSIgaW4gdGFibGVTdGF0ZSkgfHwgISgiZW50cnlDb3VudCIgaW4gdGFibGVTdGF0ZSkpIHsKICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmogPSBwYXJzZXIuZ2V0T2JqKCksICJ0cmFpbGVyIikpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW0gPSBvYmo7CiAgICAgICAgdGFibGVTdGF0ZS5lbnRyeUNvdW50ID0gcGFyc2VyLmdldE9iaigpOwogICAgICB9CiAgICAgIGxldCBmaXJzdCA9IHRhYmxlU3RhdGUuZmlyc3RFbnRyeU51bTsKICAgICAgY29uc3QgY291bnQgPSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihmaXJzdCkgfHwgIU51bWJlci5pc0ludGVnZXIoY291bnQpKSB7CiAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJJbnZhbGlkIFhSZWYgdGFibGU6IHdyb25nIHR5cGVzIGluIHN1YnNlY3Rpb24gaGVhZGVyIik7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IHRhYmxlU3RhdGUuZW50cnlOdW07IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICAgIHRhYmxlU3RhdGUuZW50cnlOdW0gPSBpOwogICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMSA9IHBhcnNlci5idWYxOwogICAgICAgIHRhYmxlU3RhdGUucGFyc2VyQnVmMiA9IHBhcnNlci5idWYyOwogICAgICAgIGNvbnN0IGVudHJ5ID0ge307CiAgICAgICAgZW50cnkub2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICAgIGVudHJ5LmdlbiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VyLmdldE9iaigpOwogICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGUuY21kKSB7CiAgICAgICAgICAgIGNhc2UgImYiOgogICAgICAgICAgICAgIGVudHJ5LmZyZWUgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJuIjoKICAgICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZW50cnkub2Zmc2V0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihlbnRyeS5nZW4pIHx8ICEoZW50cnkuZnJlZSB8fCBlbnRyeS51bmNvbXByZXNzZWQpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgZW50cnkgaW4gWFJlZiBzdWJzZWN0aW9uOiAke2ZpcnN0fSwgJHtjb3VudH1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPT09IDAgJiYgZW50cnkuZnJlZSAmJiBmaXJzdCA9PT0gMSkgewogICAgICAgICAgZmlyc3QgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZW50cmllc1tpICsgZmlyc3RdKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbaSArIGZpcnN0XSA9IGVudHJ5OwogICAgICAgIH0KICAgICAgfQogICAgICB0YWJsZVN0YXRlLmVudHJ5TnVtID0gMDsKICAgICAgdGFibGVTdGF0ZS5zdHJlYW1Qb3MgPSBzdHJlYW0ucG9zOwogICAgICB0YWJsZVN0YXRlLnBhcnNlckJ1ZjEgPSBwYXJzZXIuYnVmMTsKICAgICAgdGFibGVTdGF0ZS5wYXJzZXJCdWYyID0gcGFyc2VyLmJ1ZjI7CiAgICAgIGRlbGV0ZSB0YWJsZVN0YXRlLmZpcnN0RW50cnlOdW07CiAgICAgIGRlbGV0ZSB0YWJsZVN0YXRlLmVudHJ5Q291bnQ7CiAgICB9CiAgICBpZiAodGhpcy5lbnRyaWVzWzBdICYmICF0aGlzLmVudHJpZXNbMF0uZnJlZSkgewogICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiB0YWJsZTogdW5leHBlY3RlZCBmaXJzdCBvYmplY3QiKTsKICAgIH0KICAgIHJldHVybiBvYmo7CiAgfQogIHByb2Nlc3NYUmVmU3RyZWFtKHN0cmVhbSkgewogICAgaWYgKCEoInN0cmVhbVN0YXRlIiBpbiB0aGlzKSkgewogICAgICBjb25zdCBzdHJlYW1QYXJhbWV0ZXJzID0gc3RyZWFtLmRpY3Q7CiAgICAgIGNvbnN0IGJ5dGVXaWR0aHMgPSBzdHJlYW1QYXJhbWV0ZXJzLmdldCgiVyIpOwogICAgICBsZXQgcmFuZ2UgPSBzdHJlYW1QYXJhbWV0ZXJzLmdldCgiSW5kZXgiKTsKICAgICAgaWYgKCFyYW5nZSkgewogICAgICAgIHJhbmdlID0gWzAsIHN0cmVhbVBhcmFtZXRlcnMuZ2V0KCJTaXplIildOwogICAgICB9CiAgICAgIHRoaXMuc3RyZWFtU3RhdGUgPSB7CiAgICAgICAgZW50cnlSYW5nZXM6IHJhbmdlLAogICAgICAgIGJ5dGVXaWR0aHMsCiAgICAgICAgZW50cnlOdW06IDAsCiAgICAgICAgc3RyZWFtUG9zOiBzdHJlYW0ucG9zCiAgICAgIH07CiAgICB9CiAgICB0aGlzLnJlYWRYUmVmU3RyZWFtKHN0cmVhbSk7CiAgICBkZWxldGUgdGhpcy5zdHJlYW1TdGF0ZTsKICAgIHJldHVybiBzdHJlYW0uZGljdDsKICB9CiAgcmVhZFhSZWZTdHJlYW0oc3RyZWFtKSB7CiAgICBjb25zdCBzdHJlYW1TdGF0ZSA9IHRoaXMuc3RyZWFtU3RhdGU7CiAgICBzdHJlYW0ucG9zID0gc3RyZWFtU3RhdGUuc3RyZWFtUG9zOwogICAgY29uc3QgW3R5cGVGaWVsZFdpZHRoLCBvZmZzZXRGaWVsZFdpZHRoLCBnZW5lcmF0aW9uRmllbGRXaWR0aF0gPSBzdHJlYW1TdGF0ZS5ieXRlV2lkdGhzOwogICAgY29uc3QgZW50cnlSYW5nZXMgPSBzdHJlYW1TdGF0ZS5lbnRyeVJhbmdlczsKICAgIHdoaWxlIChlbnRyeVJhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgIGNvbnN0IFtmaXJzdCwgbl0gPSBlbnRyeVJhbmdlczsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGZpcnN0KSB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIHJhbmdlIGZpZWxkczogJHtmaXJzdH0sICR7bn1gKTsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodHlwZUZpZWxkV2lkdGgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG9mZnNldEZpZWxkV2lkdGgpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGdlbmVyYXRpb25GaWVsZFdpZHRoKSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgSW52YWxpZCBYUmVmIGVudHJ5IGZpZWxkcyBsZW5ndGg6ICR7Zmlyc3R9LCAke259YCk7CiAgICAgIH0KICAgICAgZm9yIChsZXQgaSA9IHN0cmVhbVN0YXRlLmVudHJ5TnVtOyBpIDwgbjsgKytpKSB7CiAgICAgICAgc3RyZWFtU3RhdGUuZW50cnlOdW0gPSBpOwogICAgICAgIHN0cmVhbVN0YXRlLnN0cmVhbVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgICAgbGV0IHR5cGUgPSAwLAogICAgICAgICAgb2Zmc2V0ID0gMCwKICAgICAgICAgIGdlbmVyYXRpb24gPSAwOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdHlwZUZpZWxkV2lkdGg7ICsraikgewogICAgICAgICAgY29uc3QgdHlwZUJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKHR5cGVCeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICd0eXBlJy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHR5cGUgPSB0eXBlIDw8IDggfCB0eXBlQnl0ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVGaWVsZFdpZHRoID09PSAwKSB7CiAgICAgICAgICB0eXBlID0gMTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvZmZzZXRGaWVsZFdpZHRoOyArK2opIHsKICAgICAgICAgIGNvbnN0IG9mZnNldEJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKG9mZnNldEJ5dGUgPT09IC0xKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIGJ5dGVXaWR0aHMgJ29mZnNldCcuIik7CiAgICAgICAgICB9CiAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPDwgOCB8IG9mZnNldEJ5dGU7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ2VuZXJhdGlvbkZpZWxkV2lkdGg7ICsraikgewogICAgICAgICAgY29uc3QgZ2VuZXJhdGlvbkJ5dGUgPSBzdHJlYW0uZ2V0Qnl0ZSgpOwogICAgICAgICAgaWYgKGdlbmVyYXRpb25CeXRlID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBieXRlV2lkdGhzICdnZW5lcmF0aW9uJy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIGdlbmVyYXRpb24gPSBnZW5lcmF0aW9uIDw8IDggfCBnZW5lcmF0aW9uQnl0ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZW50cnkgPSB7fTsKICAgICAgICBlbnRyeS5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgZW50cnkuZ2VuID0gZ2VuZXJhdGlvbjsKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgZW50cnkuZnJlZSA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBlbnRyeS51bmNvbXByZXNzZWQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYEludmFsaWQgWFJlZiBlbnRyeSB0eXBlOiAke3R5cGV9YCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5lbnRyaWVzW2ZpcnN0ICsgaV0pIHsKICAgICAgICAgIHRoaXMuZW50cmllc1tmaXJzdCArIGldID0gZW50cnk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbVN0YXRlLmVudHJ5TnVtID0gMDsKICAgICAgc3RyZWFtU3RhdGUuc3RyZWFtUG9zID0gc3RyZWFtLnBvczsKICAgICAgZW50cnlSYW5nZXMuc3BsaWNlKDAsIDIpOwogICAgfQogIH0KICBpbmRleE9iamVjdHMoKSB7CiAgICBjb25zdCBUQUIgPSAweDksCiAgICAgIExGID0gMHhhLAogICAgICBDUiA9IDB4ZCwKICAgICAgU1BBQ0UgPSAweDIwOwogICAgY29uc3QgUEVSQ0VOVCA9IDB4MjUsCiAgICAgIExUID0gMHgzYzsKICAgIGZ1bmN0aW9uIHJlYWRUb2tlbihkYXRhLCBvZmZzZXQpIHsKICAgICAgbGV0IHRva2VuID0gIiIsCiAgICAgICAgY2ggPSBkYXRhW29mZnNldF07CiAgICAgIHdoaWxlIChjaCAhPT0gTEYgJiYgY2ggIT09IENSICYmIGNoICE9PSBMVCkgewogICAgICAgIGlmICgrK29mZnNldCA+PSBkYXRhLmxlbmd0aCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRva2VuICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOwogICAgICAgIGNoID0gZGF0YVtvZmZzZXRdOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbjsKICAgIH0KICAgIGZ1bmN0aW9uIHNraXBVbnRpbChkYXRhLCBvZmZzZXQsIHdoYXQpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gd2hhdC5sZW5ndGgsCiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwogICAgICBsZXQgc2tpcHBlZCA9IDA7CiAgICAgIHdoaWxlIChvZmZzZXQgPCBkYXRhTGVuZ3RoKSB7CiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIGRhdGFbb2Zmc2V0ICsgaV0gPT09IHdoYXRbaV0pIHsKICAgICAgICAgICsraTsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0Kys7CiAgICAgICAgc2tpcHBlZCsrOwogICAgICB9CiAgICAgIHJldHVybiBza2lwcGVkOwogICAgfQogICAgY29uc3QgZ0VuZG9ialJlZ0V4cCA9IC9cYihlbmRvYmp8XGQrXHMrXGQrXHMrb2JqfHhyZWZ8dHJhaWxlcilcYi9nOwogICAgY29uc3QgZ1N0YXJ0eHJlZlJlZ0V4cCA9IC9cYihzdGFydHhyZWZ8XGQrXHMrXGQrXHMrb2JqKVxiL2c7CiAgICBjb25zdCBvYmpSZWdFeHAgPSAvXihcZCspXHMrKFxkKylccytvYmpcYi87CiAgICBjb25zdCB0cmFpbGVyQnl0ZXMgPSBuZXcgVWludDhBcnJheShbMTE2LCAxMTQsIDk3LCAxMDUsIDEwOCwgMTAxLCAxMTRdKTsKICAgIGNvbnN0IHN0YXJ0eHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzExNSwgMTE2LCA5NywgMTE0LCAxMTYsIDEyMCwgMTE0LCAxMDEsIDEwMl0pOwogICAgY29uc3QgeHJlZkJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWzQ3LCA4OCwgODIsIDEwMSwgMTAyXSk7CiAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDsKICAgIHRoaXMuX2NhY2hlTWFwLmNsZWFyKCk7CiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbTsKICAgIHN0cmVhbS5wb3MgPSAwOwogICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLmdldEJ5dGVzKCksCiAgICAgIGJ1ZmZlclN0ciA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKShidWZmZXIpLAogICAgICBsZW5ndGggPSBidWZmZXIubGVuZ3RoOwogICAgbGV0IHBvc2l0aW9uID0gc3RyZWFtLnN0YXJ0OwogICAgY29uc3QgdHJhaWxlcnMgPSBbXSwKICAgICAgeHJlZlN0bXMgPSBbXTsKICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgewogICAgICBsZXQgY2ggPSBidWZmZXJbcG9zaXRpb25dOwogICAgICBpZiAoY2ggPT09IFRBQiB8fCBjaCA9PT0gTEYgfHwgY2ggPT09IENSIHx8IGNoID09PSBTUEFDRSkgewogICAgICAgICsrcG9zaXRpb247CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSBQRVJDRU5UKSB7CiAgICAgICAgZG8gewogICAgICAgICAgKytwb3NpdGlvbjsKICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjaCA9IGJ1ZmZlcltwb3NpdGlvbl07CiAgICAgICAgfSB3aGlsZSAoY2ggIT09IExGICYmIGNoICE9PSBDUik7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdG9rZW4gPSByZWFkVG9rZW4oYnVmZmVyLCBwb3NpdGlvbik7CiAgICAgIGxldCBtOwogICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgieHJlZiIpICYmICh0b2tlbi5sZW5ndGggPT09IDQgfHwgL1xzLy50ZXN0KHRva2VuWzRdKSkpIHsKICAgICAgICBwb3NpdGlvbiArPSBza2lwVW50aWwoYnVmZmVyLCBwb3NpdGlvbiwgdHJhaWxlckJ5dGVzKTsKICAgICAgICB0cmFpbGVycy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICBwb3NpdGlvbiArPSBza2lwVW50aWwoYnVmZmVyLCBwb3NpdGlvbiwgc3RhcnR4cmVmQnl0ZXMpOwogICAgICB9IGVsc2UgaWYgKG0gPSBvYmpSZWdFeHAuZXhlYyh0b2tlbikpIHsKICAgICAgICBjb25zdCBudW0gPSBtWzFdIHwgMCwKICAgICAgICAgIGdlbiA9IG1bMl0gfCAwOwogICAgICAgIGNvbnN0IHN0YXJ0UG9zID0gcG9zaXRpb24gKyB0b2tlbi5sZW5ndGg7CiAgICAgICAgbGV0IGNvbnRlbnRMZW5ndGgsCiAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gZmFsc2U7CiAgICAgICAgaWYgKCF0aGlzLmVudHJpZXNbbnVtXSkgewogICAgICAgICAgdXBkYXRlRW50cmllcyA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVudHJpZXNbbnVtXS5nZW4gPT09IGdlbikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKICAgICAgICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnRQb3MpKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGFyc2VyLmdldE9iaigpOwogICAgICAgICAgICB1cGRhdGVFbnRyaWVzID0gdHJ1ZTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLlBhcnNlckVPRkV4Y2VwdGlvbikgewogICAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgaW5kZXhPYmplY3RzIC0tIGNoZWNraW5nIG9iamVjdCAoJHt0b2tlbn0pOiAiJHtleH0iLmApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHVwZGF0ZUVudHJpZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh1cGRhdGVFbnRyaWVzKSB7CiAgICAgICAgICB0aGlzLmVudHJpZXNbbnVtXSA9IHsKICAgICAgICAgICAgb2Zmc2V0OiBwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCwKICAgICAgICAgICAgZ2VuLAogICAgICAgICAgICB1bmNvbXByZXNzZWQ6IHRydWUKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGdFbmRvYmpSZWdFeHAubGFzdEluZGV4ID0gc3RhcnRQb3M7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBnRW5kb2JqUmVnRXhwLmV4ZWMoYnVmZmVyU3RyKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIGNvbnN0IGVuZFBvcyA9IGdFbmRvYmpSZWdFeHAubGFzdEluZGV4ICsgMTsKICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBlbmRQb3MgLSBwb3NpdGlvbjsKICAgICAgICAgIGlmIChtYXRjaFsxXSAhPT0gImVuZG9iaiIpIHsKICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBpbmRleE9iamVjdHM6IEZvdW5kICIke21hdGNoWzFdfSIgaW5zaWRlIG9mIGFub3RoZXIgIm9iaiIsIGAgKyAnY2F1c2VkIGJ5IG1pc3NpbmcgImVuZG9iaiIgLS0gdHJ5aW5nIHRvIHJlY292ZXIuJyk7CiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggLT0gbWF0Y2hbMV0ubGVuZ3RoICsgMTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29udGVudExlbmd0aCA9IGxlbmd0aCAtIHBvc2l0aW9uOwogICAgICAgIH0KICAgICAgICBjb25zdCBjb250ZW50ID0gYnVmZmVyLnN1YmFycmF5KHBvc2l0aW9uLCBwb3NpdGlvbiArIGNvbnRlbnRMZW5ndGgpOwogICAgICAgIGNvbnN0IHhyZWZUYWdPZmZzZXQgPSBza2lwVW50aWwoY29udGVudCwgMCwgeHJlZkJ5dGVzKTsKICAgICAgICBpZiAoeHJlZlRhZ09mZnNldCA8IGNvbnRlbnRMZW5ndGggJiYgY29udGVudFt4cmVmVGFnT2Zmc2V0ICsgNV0gPCA2NCkgewogICAgICAgICAgeHJlZlN0bXMucHVzaChwb3NpdGlvbiAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgICB0aGlzLl94cmVmU3Rtcy5hZGQocG9zaXRpb24gLSBzdHJlYW0uc3RhcnQpOwogICAgICAgIH0KICAgICAgICBwb3NpdGlvbiArPSBjb250ZW50TGVuZ3RoOwogICAgICB9IGVsc2UgaWYgKHRva2VuLnN0YXJ0c1dpdGgoInRyYWlsZXIiKSAmJiAodG9rZW4ubGVuZ3RoID09PSA3IHx8IC9ccy8udGVzdCh0b2tlbls3XSkpKSB7CiAgICAgICAgdHJhaWxlcnMucHVzaChwb3NpdGlvbik7CiAgICAgICAgY29uc3Qgc3RhcnRQb3MgPSBwb3NpdGlvbiArIHRva2VuLmxlbmd0aDsKICAgICAgICBsZXQgY29udGVudExlbmd0aDsKICAgICAgICBnU3RhcnR4cmVmUmVnRXhwLmxhc3RJbmRleCA9IHN0YXJ0UG9zOwogICAgICAgIGNvbnN0IG1hdGNoID0gZ1N0YXJ0eHJlZlJlZ0V4cC5leGVjKGJ1ZmZlclN0cik7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBjb25zdCBlbmRQb3MgPSBnU3RhcnR4cmVmUmVnRXhwLmxhc3RJbmRleCArIDE7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gZW5kUG9zIC0gcG9zaXRpb247CiAgICAgICAgICBpZiAobWF0Y2hbMV0gIT09ICJzdGFydHhyZWYiKSB7CiAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgaW5kZXhPYmplY3RzOiBGb3VuZCAiJHttYXRjaFsxXX0iIGFmdGVyICJ0cmFpbGVyIiwgYCArICdjYXVzZWQgYnkgbWlzc2luZyAic3RhcnR4cmVmIiAtLSB0cnlpbmcgdG8gcmVjb3Zlci4nKTsKICAgICAgICAgICAgY29udGVudExlbmd0aCAtPSBtYXRjaFsxXS5sZW5ndGggKyAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250ZW50TGVuZ3RoID0gbGVuZ3RoIC0gcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIHBvc2l0aW9uICs9IGNvbnRlbnRMZW5ndGg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9zaXRpb24gKz0gdG9rZW4ubGVuZ3RoICsgMTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCB4cmVmU3RtIG9mIHhyZWZTdG1zKSB7CiAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaCh4cmVmU3RtKTsKICAgICAgdGhpcy5yZWFkWFJlZih0cnVlKTsKICAgIH0KICAgIGNvbnN0IHRyYWlsZXJEaWN0cyA9IFtdOwogICAgbGV0IGlzRW5jcnlwdGVkID0gZmFsc2U7CiAgICBmb3IgKGNvbnN0IHRyYWlsZXIgb2YgdHJhaWxlcnMpIHsKICAgICAgc3RyZWFtLnBvcyA9IHRyYWlsZXI7CiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CiAgICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSksCiAgICAgICAgeHJlZjogdGhpcywKICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUsCiAgICAgICAgcmVjb3ZlcnlNb2RlOiB0cnVlCiAgICAgIH0pOwogICAgICBjb25zdCBvYmogPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICAgIGlmICghKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJ0cmFpbGVyIikpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCBkaWN0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIShkaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0cmFpbGVyRGljdHMucHVzaChkaWN0KTsKICAgICAgaWYgKGRpY3QuaGFzKCJFbmNyeXB0IikpIHsKICAgICAgICBpc0VuY3J5cHRlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIGxldCB0cmFpbGVyRGljdCwgdHJhaWxlckVycm9yOwogICAgZm9yIChjb25zdCBkaWN0IG9mIFsuLi50cmFpbGVyRGljdHMsICJnZW5GYWxsYmFjayIsIC4uLnRyYWlsZXJEaWN0c10pIHsKICAgICAgaWYgKGRpY3QgPT09ICJnZW5GYWxsYmFjayIpIHsKICAgICAgICBpZiAoIXRyYWlsZXJFcnJvcikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2dlbmVyYXRpb25GYWxsYmFjayA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgbGV0IHZhbGlkUGFnZXNEaWN0ID0gZmFsc2U7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3Qgcm9vdERpY3QgPSBkaWN0LmdldCgiUm9vdCIpOwogICAgICAgIGlmICghKHJvb3REaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0RpY3QgPSByb290RGljdC5nZXQoIlBhZ2VzIik7CiAgICAgICAgaWYgKCEocGFnZXNEaWN0IGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuRGljdCkpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYWdlc0NvdW50ID0gcGFnZXNEaWN0LmdldCgiQ291bnQiKTsKICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYWdlc0NvdW50KSkgewogICAgICAgICAgdmFsaWRQYWdlc0RpY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICB0cmFpbGVyRXJyb3IgPSBleDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodmFsaWRQYWdlc0RpY3QgJiYgKCFpc0VuY3J5cHRlZCB8fCBkaWN0LmhhcygiRW5jcnlwdCIpKSAmJiBkaWN0LmhhcygiSUQiKSkgewogICAgICAgIHJldHVybiBkaWN0OwogICAgICB9CiAgICAgIHRyYWlsZXJEaWN0ID0gZGljdDsKICAgIH0KICAgIGlmICh0cmFpbGVyRGljdCkgewogICAgICByZXR1cm4gdHJhaWxlckRpY3Q7CiAgICB9CiAgICBpZiAodGhpcy50b3BEaWN0KSB7CiAgICAgIHJldHVybiB0aGlzLnRvcERpY3Q7CiAgICB9CiAgICB0aHJvdyBuZXcgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbigiSW52YWxpZCBQREYgc3RydWN0dXJlLiIpOwogIH0KICByZWFkWFJlZihyZWNvdmVyeU1vZGUgPSBmYWxzZSkgewogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW07CiAgICBjb25zdCBzdGFydFhSZWZQYXJzZWRDYWNoZSA9IG5ldyBTZXQoKTsKICAgIHdoaWxlICh0aGlzLnN0YXJ0WFJlZlF1ZXVlLmxlbmd0aCkgewogICAgICB0cnkgewogICAgICAgIGNvbnN0IHN0YXJ0WFJlZiA9IHRoaXMuc3RhcnRYUmVmUXVldWVbMF07CiAgICAgICAgaWYgKHN0YXJ0WFJlZlBhcnNlZENhY2hlLmhhcyhzdGFydFhSZWYpKSB7CiAgICAgICAgICAoMCwgX3V0aWwud2FybikoInJlYWRYUmVmIC0gc2tpcHBpbmcgWFJlZiB0YWJsZSBzaW5jZSBpdCB3YXMgYWxyZWFkeSBwYXJzZWQuIik7CiAgICAgICAgICB0aGlzLnN0YXJ0WFJlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgc3RhcnRYUmVmUGFyc2VkQ2FjaGUuYWRkKHN0YXJ0WFJlZik7CiAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXJ0WFJlZiArIHN0cmVhbS5zdGFydDsKICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgX3BhcnNlci5QYXJzZXIoewogICAgICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSksCiAgICAgICAgICB4cmVmOiB0aGlzLAogICAgICAgICAgYWxsb3dTdHJlYW1zOiB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgbGV0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgICBsZXQgZGljdDsKICAgICAgICBpZiAoKDAsIF9wcmltaXRpdmVzLmlzQ21kKShvYmosICJ4cmVmIikpIHsKICAgICAgICAgIGRpY3QgPSB0aGlzLnByb2Nlc3NYUmVmVGFibGUocGFyc2VyKTsKICAgICAgICAgIGlmICghdGhpcy50b3BEaWN0KSB7CiAgICAgICAgICAgIHRoaXMudG9wRGljdCA9IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBvYmogPSBkaWN0LmdldCgiWFJlZlN0bSIpOwogICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSAmJiAhdGhpcy5feHJlZlN0bXMuaGFzKG9iaikpIHsKICAgICAgICAgICAgdGhpcy5feHJlZlN0bXMuYWRkKG9iaik7CiAgICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmopOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcihvYmopKSB7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VyLmdldE9iaigpKSB8fCAhKDAsIF9wcmltaXRpdmVzLmlzQ21kKShwYXJzZXIuZ2V0T2JqKCksICJvYmoiKSB8fCAhKChvYmogPSBwYXJzZXIuZ2V0T2JqKCkpIGluc3RhbmNlb2YgX2Jhc2Vfc3RyZWFtLkJhc2VTdHJlYW0pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBYUmVmIHN0cmVhbSIpOwogICAgICAgICAgfQogICAgICAgICAgZGljdCA9IHRoaXMucHJvY2Vzc1hSZWZTdHJlYW0ob2JqKTsKICAgICAgICAgIGlmICghdGhpcy50b3BEaWN0KSB7CiAgICAgICAgICAgIHRoaXMudG9wRGljdCA9IGRpY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWRpY3QpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJGYWlsZWQgdG8gcmVhZCBYUmVmIHN0cmVhbSIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoIkludmFsaWQgWFJlZiBzdHJlYW0gaGVhZGVyIik7CiAgICAgICAgfQogICAgICAgIG9iaiA9IGRpY3QuZ2V0KCJQcmV2Iik7CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIob2JqKSkgewogICAgICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5wdXNoKG9iaik7CiAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgICAgIHRoaXMuc3RhcnRYUmVmUXVldWUucHVzaChvYmoubnVtKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgICAoMCwgX3V0aWwuaW5mbykoIih3aGlsZSByZWFkaW5nIFhSZWYpOiAiICsgZSk7CiAgICAgIH0KICAgICAgdGhpcy5zdGFydFhSZWZRdWV1ZS5zaGlmdCgpOwogICAgfQogICAgaWYgKHRoaXMudG9wRGljdCkgewogICAgICByZXR1cm4gdGhpcy50b3BEaWN0OwogICAgfQogICAgaWYgKHJlY292ZXJ5TW9kZSkgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgdGhyb3cgbmV3IF9jb3JlX3V0aWxzLlhSZWZQYXJzZUV4Y2VwdGlvbigpOwogIH0KICBnZXQgbGFzdFhSZWZTdHJlYW1Qb3MoKSB7CiAgICByZXR1cm4gdGhpcy5feHJlZlN0bXMuc2l6ZSA+IDAgPyBNYXRoLm1heCguLi50aGlzLl94cmVmU3RtcykgOiBudWxsOwogIH0KICBnZXRFbnRyeShpKSB7CiAgICBjb25zdCB4cmVmRW50cnkgPSB0aGlzLmVudHJpZXNbaV07CiAgICBpZiAoeHJlZkVudHJ5ICYmICF4cmVmRW50cnkuZnJlZSAmJiB4cmVmRW50cnkub2Zmc2V0KSB7CiAgICAgIHJldHVybiB4cmVmRW50cnk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZmV0Y2hJZlJlZihvYmosIHN1cHByZXNzRW5jcnlwdGlvbiA9IGZhbHNlKSB7CiAgICBpZiAob2JqIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuUmVmKSB7CiAgICAgIHJldHVybiB0aGlzLmZldGNoKG9iaiwgc3VwcHJlc3NFbmNyeXB0aW9uKTsKICAgIH0KICAgIHJldHVybiBvYmo7CiAgfQogIGZldGNoKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGlmICghKHJlZiBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLlJlZikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJyZWYgb2JqZWN0IGlzIG5vdCBhIHJlZmVyZW5jZSIpOwogICAgfQogICAgY29uc3QgbnVtID0gcmVmLm51bTsKICAgIGNvbnN0IGNhY2hlRW50cnkgPSB0aGlzLl9jYWNoZU1hcC5nZXQobnVtKTsKICAgIGlmIChjYWNoZUVudHJ5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKGNhY2hlRW50cnkgaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5EaWN0ICYmICFjYWNoZUVudHJ5Lm9iaklkKSB7CiAgICAgICAgY2FjaGVFbnRyeS5vYmpJZCA9IHJlZi50b1N0cmluZygpOwogICAgICB9CiAgICAgIHJldHVybiBjYWNoZUVudHJ5OwogICAgfQogICAgbGV0IHhyZWZFbnRyeSA9IHRoaXMuZ2V0RW50cnkobnVtKTsKICAgIGlmICh4cmVmRW50cnkgPT09IG51bGwpIHsKICAgICAgdGhpcy5fY2FjaGVNYXAuc2V0KG51bSwgeHJlZkVudHJ5KTsKICAgICAgcmV0dXJuIHhyZWZFbnRyeTsKICAgIH0KICAgIGlmICh0aGlzLl9wZW5kaW5nUmVmcy5oYXMocmVmKSkgewogICAgICB0aGlzLl9wZW5kaW5nUmVmcy5yZW1vdmUocmVmKTsKICAgICAgKDAsIF91dGlsLndhcm4pKGBJZ25vcmluZyBjaXJjdWxhciByZWZlcmVuY2U6ICR7cmVmfS5gKTsKICAgICAgcmV0dXJuIF9wcmltaXRpdmVzLkNJUkNVTEFSX1JFRjsKICAgIH0KICAgIHRoaXMuX3BlbmRpbmdSZWZzLnB1dChyZWYpOwogICAgdHJ5IHsKICAgICAgaWYgKHhyZWZFbnRyeS51bmNvbXByZXNzZWQpIHsKICAgICAgICB4cmVmRW50cnkgPSB0aGlzLmZldGNoVW5jb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICB9IGVsc2UgewogICAgICAgIHhyZWZFbnRyeSA9IHRoaXMuZmV0Y2hDb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICB9CiAgICAgIHRoaXMuX3BlbmRpbmdSZWZzLnJlbW92ZShyZWYpOwogICAgfSBjYXRjaCAoZXgpIHsKICAgICAgdGhpcy5fcGVuZGluZ1JlZnMucmVtb3ZlKHJlZik7CiAgICAgIHRocm93IGV4OwogICAgfQogICAgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIF9wcmltaXRpdmVzLkRpY3QpIHsKICAgICAgeHJlZkVudHJ5Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CiAgICB9IGVsc2UgaWYgKHhyZWZFbnRyeSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgIHhyZWZFbnRyeS5kaWN0Lm9iaklkID0gcmVmLnRvU3RyaW5nKCk7CiAgICB9CiAgICByZXR1cm4geHJlZkVudHJ5OwogIH0KICBmZXRjaFVuY29tcHJlc3NlZChyZWYsIHhyZWZFbnRyeSwgc3VwcHJlc3NFbmNyeXB0aW9uID0gZmFsc2UpIHsKICAgIGNvbnN0IGdlbiA9IHJlZi5nZW47CiAgICBsZXQgbnVtID0gcmVmLm51bTsKICAgIGlmICh4cmVmRW50cnkuZ2VuICE9PSBnZW4pIHsKICAgICAgY29uc3QgbXNnID0gYEluY29uc2lzdGVudCBnZW5lcmF0aW9uIGluIFhSZWY6ICR7cmVmfWA7CiAgICAgIGlmICh0aGlzLl9nZW5lcmF0aW9uRmFsbGJhY2sgJiYgeHJlZkVudHJ5LmdlbiA8IGdlbikgewogICAgICAgICgwLCBfdXRpbC53YXJuKShtc2cpOwogICAgICAgIHJldHVybiB0aGlzLmZldGNoVW5jb21wcmVzc2VkKF9wcmltaXRpdmVzLlJlZi5nZXQobnVtLCB4cmVmRW50cnkuZ2VuKSwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgICB9CiAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24obXNnKTsKICAgIH0KICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtLm1ha2VTdWJTdHJlYW0oeHJlZkVudHJ5Lm9mZnNldCArIHRoaXMuc3RyZWFtLnN0YXJ0KTsKICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfcGFyc2VyLlBhcnNlcih7CiAgICAgIGxleGVyOiBuZXcgX3BhcnNlci5MZXhlcihzdHJlYW0pLAogICAgICB4cmVmOiB0aGlzLAogICAgICBhbGxvd1N0cmVhbXM6IHRydWUKICAgIH0pOwogICAgY29uc3Qgb2JqMSA9IHBhcnNlci5nZXRPYmooKTsKICAgIGNvbnN0IG9iajIgPSBwYXJzZXIuZ2V0T2JqKCk7CiAgICBjb25zdCBvYmozID0gcGFyc2VyLmdldE9iaigpOwogICAgaWYgKG9iajEgIT09IG51bSB8fCBvYmoyICE9PSBnZW4gfHwgIShvYmozIGluc3RhbmNlb2YgX3ByaW1pdGl2ZXMuQ21kKSkgewogICAgICB0aHJvdyBuZXcgX2NvcmVfdXRpbHMuWFJlZkVudHJ5RXhjZXB0aW9uKGBCYWQgKHVuY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtyZWZ9YCk7CiAgICB9CiAgICBpZiAob2JqMy5jbWQgIT09ICJvYmoiKSB7CiAgICAgIGlmIChvYmozLmNtZC5zdGFydHNXaXRoKCJvYmoiKSkgewogICAgICAgIG51bSA9IHBhcnNlSW50KG9iajMuY21kLnN1YnN0cmluZygzKSwgMTApOwogICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHsKICAgICAgICAgIHJldHVybiBudW07CiAgICAgICAgfQogICAgICB9CiAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAodW5jb21wcmVzc2VkKSBYUmVmIGVudHJ5OiAke3JlZn1gKTsKICAgIH0KICAgIGlmICh0aGlzLmVuY3J5cHQgJiYgIXN1cHByZXNzRW5jcnlwdGlvbikgewogICAgICB4cmVmRW50cnkgPSBwYXJzZXIuZ2V0T2JqKHRoaXMuZW5jcnlwdC5jcmVhdGVDaXBoZXJUcmFuc2Zvcm0obnVtLCBnZW4pKTsKICAgIH0gZWxzZSB7CiAgICAgIHhyZWZFbnRyeSA9IHBhcnNlci5nZXRPYmooKTsKICAgIH0KICAgIGlmICghKHhyZWZFbnRyeSBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSkgewogICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCB4cmVmRW50cnkpOwogICAgfQogICAgcmV0dXJuIHhyZWZFbnRyeTsKICB9CiAgZmV0Y2hDb21wcmVzc2VkKHJlZiwgeHJlZkVudHJ5LCBzdXBwcmVzc0VuY3J5cHRpb24gPSBmYWxzZSkgewogICAgY29uc3QgdGFibGVPZmZzZXQgPSB4cmVmRW50cnkub2Zmc2V0OwogICAgY29uc3Qgc3RyZWFtID0gdGhpcy5mZXRjaChfcHJpbWl0aXZlcy5SZWYuZ2V0KHRhYmxlT2Zmc2V0LCAwKSk7CiAgICBpZiAoIShzdHJlYW0gaW5zdGFuY2VvZiBfYmFzZV9zdHJlYW0uQmFzZVN0cmVhbSkpIHsKICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKCJiYWQgT2JqU3RtIHN0cmVhbSIpOwogICAgfQogICAgY29uc3QgZmlyc3QgPSBzdHJlYW0uZGljdC5nZXQoIkZpcnN0Iik7CiAgICBjb25zdCBuID0gc3RyZWFtLmRpY3QuZ2V0KCJOIik7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZmlyc3QpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7CiAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiaW52YWxpZCBmaXJzdCBhbmQgbiBwYXJhbWV0ZXJzIGZvciBPYmpTdG0gc3RyZWFtIik7CiAgICB9CiAgICBsZXQgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKICAgICAgbGV4ZXI6IG5ldyBfcGFyc2VyLkxleGVyKHN0cmVhbSksCiAgICAgIHhyZWY6IHRoaXMsCiAgICAgIGFsbG93U3RyZWFtczogdHJ1ZQogICAgfSk7CiAgICBjb25zdCBudW1zID0gbmV3IEFycmF5KG4pOwogICAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBBcnJheShuKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGNvbnN0IG51bSA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHsKICAgICAgICB0aHJvdyBuZXcgX3V0aWwuRm9ybWF0RXJyb3IoYGludmFsaWQgb2JqZWN0IG51bWJlciBpbiB0aGUgT2JqU3RtIHN0cmVhbTogJHtudW19YCk7CiAgICAgIH0KICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VyLmdldE9iaigpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgaW52YWxpZCBvYmplY3Qgb2Zmc2V0IGluIHRoZSBPYmpTdG0gc3RyZWFtOiAke29mZnNldH1gKTsKICAgICAgfQogICAgICBudW1zW2ldID0gbnVtOwogICAgICBvZmZzZXRzW2ldID0gb2Zmc2V0OwogICAgfQogICAgY29uc3Qgc3RhcnQgPSAoc3RyZWFtLnN0YXJ0IHx8IDApICsgZmlyc3Q7CiAgICBjb25zdCBlbnRyaWVzID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgY29uc3QgbGVuZ3RoID0gaSA8IG4gLSAxID8gb2Zmc2V0c1tpICsgMV0gLSBvZmZzZXRzW2ldIDogdW5kZWZpbmVkOwogICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcigiSW52YWxpZCBvZmZzZXQgaW4gdGhlIE9ialN0bSBzdHJlYW0uIik7CiAgICAgIH0KICAgICAgcGFyc2VyID0gbmV3IF9wYXJzZXIuUGFyc2VyKHsKICAgICAgICBsZXhlcjogbmV3IF9wYXJzZXIuTGV4ZXIoc3RyZWFtLm1ha2VTdWJTdHJlYW0oc3RhcnQgKyBvZmZzZXRzW2ldLCBsZW5ndGgsIHN0cmVhbS5kaWN0KSksCiAgICAgICAgeHJlZjogdGhpcywKICAgICAgICBhbGxvd1N0cmVhbXM6IHRydWUKICAgICAgfSk7CiAgICAgIGNvbnN0IG9iaiA9IHBhcnNlci5nZXRPYmooKTsKICAgICAgZW50cmllc1tpXSA9IG9iajsKICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIF9iYXNlX3N0cmVhbS5CYXNlU3RyZWFtKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgbnVtID0gbnVtc1tpXSwKICAgICAgICBlbnRyeSA9IHRoaXMuZW50cmllc1tudW1dOwogICAgICBpZiAoZW50cnkgJiYgZW50cnkub2Zmc2V0ID09PSB0YWJsZU9mZnNldCAmJiBlbnRyeS5nZW4gPT09IGkpIHsKICAgICAgICB0aGlzLl9jYWNoZU1hcC5zZXQobnVtLCBvYmopOwogICAgICB9CiAgICB9CiAgICB4cmVmRW50cnkgPSBlbnRyaWVzW3hyZWZFbnRyeS5nZW5dOwogICAgaWYgKHhyZWZFbnRyeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRocm93IG5ldyBfY29yZV91dGlscy5YUmVmRW50cnlFeGNlcHRpb24oYEJhZCAoY29tcHJlc3NlZCkgWFJlZiBlbnRyeTogJHtyZWZ9YCk7CiAgICB9CiAgICByZXR1cm4geHJlZkVudHJ5OwogIH0KICBhc3luYyBmZXRjaElmUmVmQXN5bmMob2JqLCBzdXBwcmVzc0VuY3J5cHRpb24pIHsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBfcHJpbWl0aXZlcy5SZWYpIHsKICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBc3luYyhvYmosIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0KICBhc3luYyBmZXRjaEFzeW5jKHJlZiwgc3VwcHJlc3NFbmNyeXB0aW9uKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gdGhpcy5mZXRjaChyZWYsIHN1cHByZXNzRW5jcnlwdGlvbik7CiAgICB9IGNhdGNoIChleCkgewogICAgICBpZiAoIShleCBpbnN0YW5jZW9mIF9jb3JlX3V0aWxzLk1pc3NpbmdEYXRhRXhjZXB0aW9uKSkgewogICAgICAgIHRocm93IGV4OwogICAgICB9CiAgICAgIGF3YWl0IHRoaXMucGRmTWFuYWdlci5yZXF1ZXN0UmFuZ2UoZXguYmVnaW4sIGV4LmVuZCk7CiAgICAgIHJldHVybiB0aGlzLmZldGNoQXN5bmMocmVmLCBzdXBwcmVzc0VuY3J5cHRpb24pOwogICAgfQogIH0KICBnZXRDYXRhbG9nT2JqKCkgewogICAgcmV0dXJuIHRoaXMucm9vdDsKICB9Cn0KZXhwb3J0cy5YUmVmID0gWFJlZjsKCi8qKiovIH0pLAovKiAxMDMgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5pc05vZGVKUyA9IHZvaWQgMDsKY29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgcHJvY2VzcyA9PT0gIm9iamVjdCIgJiYgcHJvY2VzcyArICIiID09PSAiW29iamVjdCBwcm9jZXNzXSIgJiYgIXByb2Nlc3MudmVyc2lvbnMubncgJiYgIShwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uICYmIHByb2Nlc3MudHlwZSAmJiBwcm9jZXNzLnR5cGUgIT09ICJicm93c2VyIik7CmV4cG9ydHMuaXNOb2RlSlMgPSBpc05vZGVKUzsKCi8qKiovIH0pLAovKiAxMDQgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4gewoKCgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoewogIHZhbHVlOiB0cnVlCn0pKTsKZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY29uc3QgQ2FsbGJhY2tLaW5kID0gewogIFVOS05PV046IDAsCiAgREFUQTogMSwKICBFUlJPUjogMgp9Owpjb25zdCBTdHJlYW1LaW5kID0gewogIFVOS05PV046IDAsCiAgQ0FOQ0VMOiAxLAogIENBTkNFTF9DT01QTEVURTogMiwKICBDTE9TRTogMywKICBFTlFVRVVFOiA0LAogIEVSUk9SOiA1LAogIFBVTEw6IDYsCiAgUFVMTF9DT01QTEVURTogNywKICBTVEFSVF9DT01QTEVURTogOAp9OwpmdW5jdGlvbiB3cmFwUmVhc29uKHJlYXNvbikgewogIGlmICghKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yIHx8IHR5cGVvZiByZWFzb24gPT09ICJvYmplY3QiICYmIHJlYXNvbiAhPT0gbnVsbCkpIHsKICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoJ3dyYXBSZWFzb246IEV4cGVjdGVkICJyZWFzb24iIHRvIGJlIGEgKHBvc3NpYmx5IGNsb25lZCkgRXJyb3IuJyk7CiAgfQogIHN3aXRjaCAocmVhc29uLm5hbWUpIHsKICAgIGNhc2UgIkFib3J0RXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7CiAgICBjYXNlICJNaXNzaW5nUERGRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTsKICAgIGNhc2UgIlBhc3N3b3JkRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmNvZGUpOwogICAgY2FzZSAiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5zdGF0dXMpOwogICAgY2FzZSAiVW5rbm93bkVycm9yRXhjZXB0aW9uIjoKICAgICAgcmV0dXJuIG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5kZXRhaWxzKTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7CiAgfQp9CmNsYXNzIE1lc3NhZ2VIYW5kbGVyIHsKICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBjb21PYmopIHsKICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7CiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lOwogICAgdGhpcy5jb21PYmogPSBjb21PYmo7CiAgICB0aGlzLmNhbGxiYWNrSWQgPSAxOwogICAgdGhpcy5zdHJlYW1JZCA9IDE7CiAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhOwogICAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGRhdGEuc3RyZWFtKSB7CiAgICAgICAgdGhpcy4jcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7CiAgICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDsKICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApOwogICAgICAgIH0KICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTsKICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHsKICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShkYXRhLmRhdGEpOwogICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7CiAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBjYWxsYmFjayBjYXNlIik7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dOwogICAgICBpZiAoIWFjdGlvbikgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhY3Rpb24gZnJvbSB3b3JrZXI6ICR7ZGF0YS5hY3Rpb259YCk7CiAgICAgIH0KICAgICAgaWYgKGRhdGEuY2FsbGJhY2tJZCkgewogICAgICAgIGNvbnN0IGNiU291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTsKICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7CiAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsCiAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuREFUQSwKICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLAogICAgICAgICAgICBkYXRhOiByZXN1bHQKICAgICAgICAgIH0pOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLAogICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLAogICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsCiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGRhdGEuc3RyZWFtSWQpIHsKICAgICAgICB0aGlzLiNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBhY3Rpb24oZGF0YS5kYXRhKTsKICAgIH07CiAgICBjb21PYmouYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTsKICB9CiAgb24oYWN0aW9uTmFtZSwgaGFuZGxlcikgewogICAgY29uc3QgYWggPSB0aGlzLmFjdGlvbkhhbmRsZXI7CiAgICBpZiAoYWhbYWN0aW9uTmFtZV0pIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFjdGlvbk5hbWUgY2FsbGVkICIke2FjdGlvbk5hbWV9ImApOwogICAgfQogICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyOwogIH0KICBzZW5kKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykgewogICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2UoewogICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSwKICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAogICAgICBkYXRhCiAgICB9LCB0cmFuc2ZlcnMpOwogIH0KICBzZW5kV2l0aFByb21pc2UoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7CiAgICBjb25zdCBjYWxsYmFja0lkID0gdGhpcy5jYWxsYmFja0lkKys7CiAgICBjb25zdCBjYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7CiAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdID0gY2FwYWJpbGl0eTsKICAgIHRyeSB7CiAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsCiAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLAogICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSwKICAgICAgICBjYWxsYmFja0lkLAogICAgICAgIGRhdGEKICAgICAgfSwgdHJhbnNmZXJzKTsKICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTsKICAgIH0KICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7CiAgfQogIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykgewogICAgY29uc3Qgc3RyZWFtSWQgPSB0aGlzLnN0cmVhbUlkKyssCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7CiAgICAgIHN0YXJ0OiBjb250cm9sbGVyID0+IHsKICAgICAgICBjb25zdCBzdGFydENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTsKICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHsKICAgICAgICAgIGNvbnRyb2xsZXIsCiAgICAgICAgICBzdGFydENhbGw6IHN0YXJ0Q2FwYWJpbGl0eSwKICAgICAgICAgIHB1bGxDYWxsOiBudWxsLAogICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCwKICAgICAgICAgIGlzQ2xvc2VkOiBmYWxzZQogICAgICAgIH07CiAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICBkYXRhLAogICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemUKICAgICAgICB9LCB0cmFuc2ZlcnMpOwogICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTsKICAgICAgfSwKICAgICAgcHVsbDogY29udHJvbGxlciA9PiB7CiAgICAgICAgY29uc3QgcHVsbENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTsKICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5OwogICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgICB9LAogICAgICBjYW5jZWw6IHJlYXNvbiA9PiB7CiAgICAgICAgKDAsIF91dGlsLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJjYW5jZWwgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uIik7CiAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpOwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5OwogICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLAogICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7CiAgICAgIH0KICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpOwogIH0KICAjY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc2VsZiA9IHRoaXMsCiAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07CiAgICBjb25zdCBzdHJlYW1TaW5rID0gewogICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7CiAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTsKICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7CiAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7CiAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7CiAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSwKICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgY2h1bmsKICAgICAgICB9LCB0cmFuc2ZlcnMpOwogICAgICB9LAogICAgICBjbG9zZSgpIHsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsCiAgICAgICAgICBzdHJlYW1JZAogICAgICAgIH0pOwogICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgfSwKICAgICAgZXJyb3IocmVhc29uKSB7CiAgICAgICAgKDAsIF91dGlsLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsICJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb24iKTsKICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRVJST1IsCiAgICAgICAgICBzdHJlYW1JZCwKICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIHNpbmtDYXBhYmlsaXR5OiBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKSwKICAgICAgb25QdWxsOiBudWxsLAogICAgICBvbkNhbmNlbDogbnVsbCwKICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLAogICAgICBkZXNpcmVkU2l6ZTogZGF0YS5kZXNpcmVkU2l6ZSwKICAgICAgcmVhZHk6IG51bGwKICAgIH07CiAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTsKICAgIHN0cmVhbVNpbmsucmVhZHkgPSBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7CiAgICB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXSA9IHN0cmVhbVNpbms7CiAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICByZXNvbHZlKGFjdGlvbihkYXRhLmRhdGEsIHN0cmVhbVNpbmspKTsKICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsCiAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICB9KTsKICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLAogICAgICAgIHN0cmVhbUlkLAogICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgIH0pOwogICAgfSk7CiAgfQogICNwcm9jZXNzU3RyZWFtTWVzc2FnZShkYXRhKSB7CiAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsCiAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsCiAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsCiAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqOwogICAgY29uc3Qgc3RyZWFtQ29udHJvbGxlciA9IHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLAogICAgICBzdHJlYW1TaW5rID0gdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07CiAgICBzd2l0Y2ggKGRhdGEuc3RyZWFtKSB7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZXNvbHZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURToKICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7CiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTEw6CiAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW1TaW5rLmRlc2lyZWRTaXplIDw9IDAgJiYgZGF0YS5kZXNpcmVkU2l6ZSA+IDApIHsKICAgICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgICBzdHJlYW1TaW5rLmRlc2lyZWRTaXplID0gZGF0YS5kZXNpcmVkU2l6ZTsKICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgcmVzb2x2ZShzdHJlYW1TaW5rLm9uUHVsbD8uKCkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7CiAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2UoewogICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICB0YXJnZXROYW1lLAogICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkVOUVVFVUU6CiAgICAgICAgKDAsIF91dGlsLmFzc2VydCkoc3RyZWFtQ29udHJvbGxlciwgImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXIiKTsKICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6CiAgICAgICAgKDAsIF91dGlsLmFzc2VydCkoc3RyZWFtQ29udHJvbGxlciwgImNsb3NlIHNob3VsZCBoYXZlIHN0cmVhbSBjb250cm9sbGVyIik7CiAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkID0gdHJ1ZTsKICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuY2xvc2UoKTsKICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOgogICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHN0cmVhbUNvbnRyb2xsZXIsICJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlciIpOwogICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcih3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgdGhpcy4jZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEU6CiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlc29sdmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jYW5jZWxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMOgogICAgICAgIGlmICghc3RyZWFtU2luaykgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7CiAgICAgICAgICByZXNvbHZlKHN0cmVhbVNpbmsub25DYW5jZWw/Lih3cmFwUmVhc29uKGRhdGEucmVhc29uKSkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgc291cmNlTmFtZSwKICAgICAgICAgICAgdGFyZ2V0TmFtZSwKICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSwKICAgICAgICAgICAgc3RyZWFtSWQsCiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgIHNvdXJjZU5hbWUsCiAgICAgICAgICAgIHRhcmdldE5hbWUsCiAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsCiAgICAgICAgICAgIHN0cmVhbUlkLAogICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpOwogICAgICAgIHN0cmVhbVNpbmsuaXNDYW5jZWxsZWQgPSB0cnVlOwogICAgICAgIGRlbGV0ZSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2UiKTsKICAgIH0KICB9CiAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHsKICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pOwogICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdOwogIH0KICBkZXN0cm95KCkgewogICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTsKICB9Cn0KZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IE1lc3NhZ2VIYW5kbGVyOwoKLyoqKi8gfSksCi8qIDEwNSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7CgoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpleHBvcnRzLlBERldvcmtlclN0cmVhbSA9IHZvaWQgMDsKdmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTsKY2xhc3MgUERGV29ya2VyU3RyZWFtIHsKICBjb25zdHJ1Y3Rvcihtc2dIYW5kbGVyKSB7CiAgICB0aGlzLl9tc2dIYW5kbGVyID0gbXNnSGFuZGxlcjsKICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOwogICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsOwogICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdOwogIH0KICBnZXRGdWxsUmVhZGVyKCkgewogICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCAiUERGV29ya2VyU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CiAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZXb3JrZXJTdHJlYW1SZWFkZXIodGhpcy5fbXNnSGFuZGxlcik7CiAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7CiAgfQogIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHsKICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZXb3JrZXJTdHJlYW1SYW5nZVJlYWRlcihiZWdpbiwgZW5kLCB0aGlzLl9tc2dIYW5kbGVyKTsKICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpOwogICAgcmV0dXJuIHJlYWRlcjsKICB9CiAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7CiAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHsKICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgICB9CiAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7CiAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTsKICAgIH0KICB9Cn0KZXhwb3J0cy5QREZXb3JrZXJTdHJlYW0gPSBQREZXb3JrZXJTdHJlYW07CmNsYXNzIFBERldvcmtlclN0cmVhbVJlYWRlciB7CiAgY29uc3RydWN0b3IobXNnSGFuZGxlcikgewogICAgdGhpcy5fbXNnSGFuZGxlciA9IG1zZ0hhbmRsZXI7CiAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsOwogICAgdGhpcy5fY29udGVudExlbmd0aCA9IG51bGw7CiAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7CiAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9IGZhbHNlOwogICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl9tc2dIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKCJHZXRSZWFkZXIiKTsKICAgIHRoaXMuX3JlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpOwogICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFByb21pc2UoIlJlYWRlckhlYWRlcnNSZWFkeSIpLnRoZW4oZGF0YSA9PiB7CiAgICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZGF0YS5pc1N0cmVhbWluZ1N1cHBvcnRlZDsKICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGRhdGEuaXNSYW5nZVN1cHBvcnRlZDsKICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGRhdGEuY29udGVudExlbmd0aDsKICAgIH0pOwogIH0KICBnZXQgaGVhZGVyc1JlYWR5KCkgewogICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTsKICB9CiAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7CiAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDsKICB9CiAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkgewogICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkOwogIH0KICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHsKICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkOwogIH0KICBhc3luYyByZWFkKCkgewogICAgY29uc3QgewogICAgICB2YWx1ZSwKICAgICAgZG9uZQogICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7CiAgICBpZiAoZG9uZSkgewogICAgICByZXR1cm4gewogICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgZG9uZTogdHJ1ZQogICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IHZhbHVlLmJ1ZmZlciwKICAgICAgZG9uZTogZmFsc2UKICAgIH07CiAgfQogIGNhbmNlbChyZWFzb24pIHsKICAgIHRoaXMuX3JlYWRlci5jYW5jZWwocmVhc29uKTsKICB9Cn0KY2xhc3MgUERGV29ya2VyU3RyZWFtUmFuZ2VSZWFkZXIgewogIGNvbnN0cnVjdG9yKGJlZ2luLCBlbmQsIG1zZ0hhbmRsZXIpIHsKICAgIHRoaXMuX21zZ0hhbmRsZXIgPSBtc2dIYW5kbGVyOwogICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDsKICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fbXNnSGFuZGxlci5zZW5kV2l0aFN0cmVhbSgiR2V0UmFuZ2VSZWFkZXIiLCB7CiAgICAgIGJlZ2luLAogICAgICBlbmQKICAgIH0pOwogICAgdGhpcy5fcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7CiAgfQogIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgYXN5bmMgcmVhZCgpIHsKICAgIGNvbnN0IHsKICAgICAgdmFsdWUsCiAgICAgIGRvbmUKICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpOwogICAgaWYgKGRvbmUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICAgIGRvbmU6IHRydWUKICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHZhbHVlOiB2YWx1ZS5idWZmZXIsCiAgICAgIGRvbmU6IGZhbHNlCiAgICB9OwogIH0KICBjYW5jZWwocmVhc29uKSB7CiAgICB0aGlzLl9yZWFkZXIuY2FuY2VsKHJlYXNvbik7CiAgfQp9CgovKioqLyB9KQovKioqKioqLyAJXSk7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307Ci8qKioqKiovIAkKLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uCi8qKioqKiovIAlmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7Ci8qKioqKiovIAkJLy8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlCi8qKioqKiovIAkJdmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07Ci8qKioqKiovIAkJaWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7Ci8qKioqKiovIAkJCXJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0czsKLyoqKioqKi8gCQl9Ci8qKioqKiovIAkJLy8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSkKLyoqKioqKi8gCQl2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJLy8gbm8gbW9kdWxlLmlkIG5lZWRlZAovKioqKioqLyAJCQkvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZAovKioqKioqLyAJCQlleHBvcnRzOiB7fQovKioqKioqLyAJCX07Ci8qKioqKiovIAkKLyoqKioqKi8gCQkvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb24KLyoqKioqKi8gCQlfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTsKLyoqKioqKi8gCQovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQovKioqKioqLyAJCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0cwovKioqKioqLyAJCV9fd19wZGZqc19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7Ci8qKioqKiovIAkJCWZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHsKLyoqKioqKi8gCQkJCWlmKF9fd19wZGZqc19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dfcGRmanNfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkgewovKioqKioqLyAJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCQl9Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9OwovKioqKioqLyAJfSkoKTsKLyoqKioqKi8gCQovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLwovKioqKioqLyAJKCgpID0+IHsKLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpCi8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0ICovCi8qKioqKiovIAkoKCkgPT4gewovKioqKioqLyAJCS8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHMKLyoqKioqKi8gCQlfX3dfcGRmanNfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4gewovKioqKioqLyAJCQlpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHsKLyoqKioqKi8gCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pOwovKioqKioqLyAJCQl9Ci8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdmFyIF9fd2VicGFja19leHBvcnRzX18gPSB7fTsKLy8gVGhpcyBlbnRyeSBuZWVkIHRvIGJlIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIGl0IG5lZWQgdG8gYmUgaXNvbGF0ZWQgYWdhaW5zdCBvdGhlciBtb2R1bGVzIGluIHRoZSBjaHVuay4KKCgpID0+IHsKdmFyIGV4cG9ydHMgPSBfX3dlYnBhY2tfZXhwb3J0c19fOwoKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7CiAgdmFsdWU6IHRydWUKfSkpOwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIldvcmtlck1lc3NhZ2VIYW5kbGVyIiwgKHsKICBlbnVtZXJhYmxlOiB0cnVlLAogIGdldDogZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIF93b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7CiAgfQp9KSk7CnZhciBfd29ya2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTsKY29uc3QgcGRmanNWZXJzaW9uID0gJzMuNy4xMDcnOwpjb25zdCBwZGZqc0J1aWxkID0gJzAzNmY4NTVkYyc7Cn0pKCk7CgovKioqKioqLyAJcmV0dXJuIF9fd2VicGFja19leHBvcnRzX187Ci8qKioqKiovIH0pKCkKOwp9KTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGRmLndvcmtlci5qcy5tYXA=";pdfExports.GlobalWorkerOptions.workerSrc=VI;function RI(F,C={onProgress:void 0,onPassword:void 0,onError:void 0,password:""}){const a=shallowRef(),l=shallowRef(0),s=shallowRef({}),S=pdfExports.getDocument(F);if(C.onProgress&&(S.onProgress=C.onProgress),C.onPassword)S.onPassword=C.onPassword;else if(C.password){const M=(L,X)=>{L(C.password??"")};S.onPassword=M}return S.promise.then(async M=>{a.value=M.loadingTask,l.value=M.numPages;const L=await M.getMetadata(),X=await M.getAttachments(),A=await M.getJavaScript();s.value={metadata:L,attachments:X,javascript:A}},M=>{typeof C.onError=="function"&&C.onError(M)}),{pdf:a,pages:l,info:s}}export{RI as R,e};